build.info: Implement simply substitutions in variable values

Use case: having a variable with multiple source files in its value,
and wanting to refer to the corresponding object file.

    $SRCS=foo.c bar.c
    SOURCE[program]=$SRCS
    DEPEND[${SRCS/.c/.o}]=prog.h

    GENERATE[prog.h]=...

Reviewed-by: Tomas Mraz <tmraz@fedoraproject.org>
(Merged from https://github.com/openssl/openssl/pull/11185)
This commit is contained in:
Richard Levitte 2020-02-26 14:35:17 +01:00
parent ad5be194c6
commit e429217902
2 changed files with 60 additions and 5 deletions

View File

@ -1807,23 +1807,62 @@ if ($builder eq "unified") {
# contains a dollar sign, it had better be escaped, or it will be
# taken for a variable name prefix.
my %variables = ();
my $variable_re = qr/\$(?P<VARIABLE>[[:alpha:]][[:alnum:]_]*)/;
# Variable name syntax
my $variable_name_re = qr/(?P<VARIABLE>[[:alpha:]][[:alnum:]_]*)/;
# Value modifier syntaxes
my $variable_subst_re = qr/\/(?P<RE>(?:\\\/|.)*?)\/(?P<SUBST>.*?)/;
# Put it all together
my $variable_re = qr/\$
(?|
# Simple case, just the name
${variable_name_re}
|
# Expressive case, with braces and possible
# modifier expressions
\{
${variable_name_re}
(?:
# Pile on modifier expressions,
# separated by |
${variable_subst_re}
)
\}
)/x;
my $expand_variables = sub {
my $value = '';
my $value_rest = shift;
if ($ENV{CONFIGURE_DEBUG_VARIABLE_EXPAND}) {
print STDERR
"DEBUG[\$expand_variables] Parsed '$value_rest' into:\n"
"DEBUG[\$expand_variables] Parsed '$value_rest' ...\n"
}
while ($value_rest =~ /(?<!\\)${variable_re}/) {
$value .= $`;
$value .= $variables{$+{VARIABLE}};
$value_rest = $';
$value .= $`;
my $variable_value = $variables{$+{VARIABLE}};
# Process modifier expressions, if present
if (defined $+{RE}) {
# We must save important %+ values, because the s///
# below clears them
my $re = $+{RE};
my $subst = $+{SUBST};
$variable_value =~ s/\Q$re\E/$subst/g;
if ($ENV{CONFIGURE_DEBUG_VARIABLE_EXPAND}) {
print STDERR
"DEBUG[\$expand_variables] ... and substituted ",
"'$re' with '$subst'\n";
}
}
$value .= $variable_value;
}
if ($ENV{CONFIGURE_DEBUG_VARIABLE_EXPAND}) {
print STDERR
"DEBUG[\$expand_variables] ... '$value$value_rest'\n";
"DEBUG[\$expand_variables] ... into: '$value$value_rest'\n";
}
return $value . $value_rest;
};

View File

@ -270,6 +270,22 @@ part of is tokenized>.
I<Variable assignment values are not tokenized.>
Variable references can be one of:
=over 4
=item B<$>I<NAME> or B<${>I<NAME>B<}>
Simple reference; the variable reference is replaced with its value,
verbatim.
=item B<${>I<NAME>B</>I<str>B</>I<subst>B<}>
Substitution reference; the variable reference is replaced with its
value, modified by replacing all occurences of I<str> with I<subst>.
=back
=head2 Scope
Most of the statement values are accumulated globally from all the