Commit 09816a2e authored by Richard Levitte's avatar Richard Levitte
Browse files

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: default avatarAndy Polyakov <appro@openssl.org>
parent aaf878cc
Loading
Loading
Loading
Loading
+30 −0
Original line number Diff line number Diff line
@@ -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);