Add template reference processing.

Template references are words with double brackets, and refer to the
same field in the target pointed at the the double bracketed word.

For example, if a target's configuration has the following entry:

    'cflags' => '-DFOO {{x86_debug}}'

... then {{x86_debug}} will be replaced with the 'cflags' value from
target 'x86_debug'.

Note: template references are resolved recursively, and circular
references are not allowed

Reviewed-by: Andy Polyakov <appro@openssl.org>
This commit is contained in:
Richard Levitte 2015-03-06 03:00:53 +01:00
parent aaf878cc97
commit 09816a2e33

View file

@ -304,6 +304,31 @@ sub stringtohash {
return { map { shift @stringsequence => $_ } split /:/, $in };
};
# Support function to look for and resolve template references.
# It uses breadcrumbs to check for circular template references.
#
# Note: Any configuration value is also a template.
sub lookup_templates {
my $tableref = shift;
my $target = shift;
my @breadcrumbs = @_;
if (grep { $_ eq $target } @breadcrumbs) {
die "Template loop! target backtrace:\n ",join("\n ",
$target,
@breadcrumbs),"\n";
}
foreach my $key (keys %{$tableref->{$target}}) {
my $value = $tableref->{$target}->{$key};
while ($value =~ /{{([-\w]+)}}/) {
lookup_templates($tableref, $1, $target, @breadcrumbs);
$value = $`.$tableref->{$1}->{$key}.$';
}
$tableref->{$target}->{$key} = $value;
}
};
# Read configuration target stanzas from a file, so that people can have
# local files with their own definitions
@ -445,6 +470,11 @@ sub read_config {
}
%table = (%table, %targets);
# Go through all new targets and resolve template references.
foreach (keys %targets) {
lookup_templates(\%table, $_);
}
}
my ($vol, $dir, $dummy) = File::Spec->splitpath($0);