Latest update.
This commit is contained in:
@@ -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;
|
||||
};
|
||||
@@ -1857,6 +1896,34 @@ if ($builder eq "unified") {
|
||||
}
|
||||
};
|
||||
|
||||
# Support for pushing values on multiple indexes of a given hash
|
||||
# array.
|
||||
my $push_to = sub {
|
||||
my $valueref = shift;
|
||||
my $index_str = shift; # May be undef or empty
|
||||
my $attrref = shift; # May be undef
|
||||
my $attr_str = shift;
|
||||
my @values = @_;
|
||||
|
||||
if (defined $index_str) {
|
||||
my @indexes = ( '' );
|
||||
if ($index_str !~ m|^\s*$|) {
|
||||
@indexes = tokenize($index_str);
|
||||
}
|
||||
foreach (@indexes) {
|
||||
push @{$valueref->{$_}}, @values;
|
||||
if (defined $attrref) {
|
||||
$handle_attributes->($attr_str, \$$attrref->{$_},
|
||||
@values);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
push @$valueref, @values;
|
||||
$handle_attributes->($attr_str, $attrref, @values)
|
||||
if defined $attrref;
|
||||
}
|
||||
};
|
||||
|
||||
# We want to detect configdata.pm in the source tree, so we
|
||||
# don't use it if the build tree is different.
|
||||
my $src_configdata = cleanfile($srcdir, "configdata.pm", $blddir);
|
||||
@@ -1937,88 +2004,64 @@ if ($builder eq "unified") {
|
||||
}
|
||||
},
|
||||
qr/^\s* PROGRAMS ${attribs_re} \s* = ${value_re} $/x
|
||||
=> sub {
|
||||
if (!@skip || $skip[$#skip] > 0) {
|
||||
my @p = tokenize($expand_variables->($+{VALUE}));
|
||||
push @programs, @p;
|
||||
$handle_attributes->($+{ATTRIBS},
|
||||
\$attributes{programs},
|
||||
@p);
|
||||
}
|
||||
},
|
||||
=> sub { $push_to->(\@programs, undef,
|
||||
\$attributes{programs}, $+{ATTRIBS},
|
||||
tokenize($expand_variables->($+{VALUE})))
|
||||
if !@skip || $skip[$#skip] > 0; },
|
||||
qr/^\s* LIBS ${attribs_re} \s* = ${value_re} $/x
|
||||
=> sub {
|
||||
if (!@skip || $skip[$#skip] > 0) {
|
||||
my @l = tokenize($expand_variables->($+{VALUE}));
|
||||
push @libraries, @l;
|
||||
$handle_attributes->($+{ATTRIBS},
|
||||
\$attributes{libraries},
|
||||
@l);
|
||||
}
|
||||
},
|
||||
=> sub { $push_to->(\@libraries, undef,
|
||||
\$attributes{libraries}, $+{ATTRIBS},
|
||||
tokenize($expand_variables->($+{VALUE})))
|
||||
if !@skip || $skip[$#skip] > 0; },
|
||||
qr/^\s* MODULES ${attribs_re} \s* = ${value_re} $/x
|
||||
=> sub {
|
||||
if (!@skip || $skip[$#skip] > 0) {
|
||||
my @m = tokenize($expand_variables->($+{VALUE}));
|
||||
push @modules, @m;
|
||||
$handle_attributes->($+{ATTRIBS},
|
||||
\$attributes{modules},
|
||||
@m);
|
||||
}
|
||||
},
|
||||
=> sub { $push_to->(\@modules, undef,
|
||||
\$attributes{modules}, $+{ATTRIBS},
|
||||
tokenize($expand_variables->($+{VALUE})))
|
||||
if !@skip || $skip[$#skip] > 0; },
|
||||
qr/^\s* SCRIPTS ${attribs_re} \s* = ${value_re} $/x
|
||||
=> sub {
|
||||
if (!@skip || $skip[$#skip] > 0) {
|
||||
my @s = tokenize($expand_variables->($+{VALUE}));
|
||||
push @scripts, @s;
|
||||
$handle_attributes->($+{ATTRIBS},
|
||||
\$attributes{scripts},
|
||||
@s);
|
||||
}
|
||||
},
|
||||
=> sub { $push_to->(\@scripts, undef,
|
||||
\$attributes{scripts}, $+{ATTRIBS},
|
||||
tokenize($expand_variables->($+{VALUE})))
|
||||
if !@skip || $skip[$#skip] > 0; },
|
||||
qr/^\s* HTMLDOCS ${index_re} = ${value_re} $/x
|
||||
=> sub { push @{$htmldocs{$expand_variables->($+{INDEX})}},
|
||||
tokenize($expand_variables->($+{VALUE}))
|
||||
if !@skip || $skip[$#skip] > 0 },
|
||||
=> sub { $push_to->(\%htmldocs, $expand_variables->($+{INDEX}),
|
||||
undef, undef,
|
||||
tokenize($expand_variables->($+{VALUE})))
|
||||
if !@skip || $skip[$#skip] > 0; },
|
||||
qr/^\s* MANDOCS ${index_re} = ${value_re} $/x
|
||||
=> sub { push @{$mandocs{$expand_variables->($+{INDEX})}},
|
||||
tokenize($expand_variables->($+{VALUE}))
|
||||
if !@skip || $skip[$#skip] > 0 },
|
||||
qr/^\s* ORDINALS ${index_re} = ${value_re} $/x
|
||||
=> sub { push @{$ordinals{$expand_variables->($+{INDEX})}},
|
||||
tokenize($expand_variables->($+{VALUE}))
|
||||
if !@skip || $skip[$#skip] > 0 },
|
||||
=> sub { $push_to->(\%mandocs, $expand_variables->($+{INDEX}),
|
||||
undef, undef,
|
||||
tokenize($expand_variables->($+{VALUE})))
|
||||
if !@skip || $skip[$#skip] > 0; },
|
||||
qr/^\s* SOURCE ${index_re} = ${value_re} $/x
|
||||
=> sub { push @{$sources{$expand_variables->($+{INDEX})}},
|
||||
tokenize($expand_variables->($+{VALUE}))
|
||||
if !@skip || $skip[$#skip] > 0 },
|
||||
=> sub { $push_to->(\%sources, $expand_variables->($+{INDEX}),
|
||||
undef, undef,
|
||||
tokenize($expand_variables->($+{VALUE})))
|
||||
if !@skip || $skip[$#skip] > 0; },
|
||||
qr/^\s* SHARED_SOURCE ${index_re} = ${value_re} $/x
|
||||
=> sub { push @{$shared_sources{$expand_variables->($+{INDEX})}},
|
||||
tokenize($expand_variables->($+{VALUE}))
|
||||
if !@skip || $skip[$#skip] > 0 },
|
||||
=> sub { $push_to->(\%shared_sources, $expand_variables->($+{INDEX}),
|
||||
undef, undef,
|
||||
tokenize($expand_variables->($+{VALUE})))
|
||||
if !@skip || $skip[$#skip] > 0; },
|
||||
qr/^\s* INCLUDE ${index_re} = ${value_re} $/x
|
||||
=> sub { push @{$includes{$expand_variables->($+{INDEX})}},
|
||||
tokenize($expand_variables->($+{VALUE}))
|
||||
if !@skip || $skip[$#skip] > 0 },
|
||||
=> sub { $push_to->(\%includes, $expand_variables->($+{INDEX}),
|
||||
undef, undef,
|
||||
tokenize($expand_variables->($+{VALUE})))
|
||||
if !@skip || $skip[$#skip] > 0; },
|
||||
qr/^\s* DEFINE ${index_re} = ${value_re} $/x
|
||||
=> sub { push @{$defines{$expand_variables->($+{INDEX})}},
|
||||
tokenize($expand_variables->($+{VALUE}))
|
||||
if !@skip || $skip[$#skip] > 0 },
|
||||
=> sub { $push_to->(\%defines, $expand_variables->($+{INDEX}),
|
||||
undef, undef,
|
||||
tokenize($expand_variables->($+{VALUE})))
|
||||
if !@skip || $skip[$#skip] > 0; },
|
||||
qr/^\s* DEPEND ${index_re} ${attribs_re} = ${value_re} $/x
|
||||
=> sub {
|
||||
if (!@skip || $skip[$#skip] > 0) {
|
||||
my $i = $expand_variables->($+{INDEX});
|
||||
my @d = tokenize($expand_variables->($+{VALUE}));
|
||||
push @{$depends{$i}}, @d;
|
||||
$handle_attributes->($+{ATTRIBS},
|
||||
\$attributes{depends}->{$i},
|
||||
@d);
|
||||
}
|
||||
},
|
||||
=> sub { $push_to->(\%depends, $expand_variables->($+{INDEX}),
|
||||
\$attributes{depends}, $+{ATTRIBS},
|
||||
tokenize($expand_variables->($+{VALUE})))
|
||||
if !@skip || $skip[$#skip] > 0; },
|
||||
qr/^\s* GENERATE ${index_re} = ${value_re} $/x
|
||||
=> sub { push @{$generate{$expand_variables->($+{INDEX})}},
|
||||
$+{VALUE}
|
||||
if !@skip || $skip[$#skip] > 0 },
|
||||
=> sub { $push_to->(\%generate, $expand_variables->($+{INDEX}),
|
||||
undef, undef, $+{VALUE})
|
||||
if !@skip || $skip[$#skip] > 0; },
|
||||
qr/^\s* (?:\#.*)? $/x => sub { },
|
||||
"OTHERWISE" => sub { die "Something wrong with this line:\n$_\nat $sourced/$f" },
|
||||
"BEFORE" => sub {
|
||||
@@ -2078,9 +2121,9 @@ EOF
|
||||
foreach (@{$sources{$dest}}) {
|
||||
my $s = cleanfile($sourced, $_, $blddir);
|
||||
|
||||
# If it isn't in the source tree, we assume it's generated
|
||||
# in the build tree
|
||||
if ($s eq $src_configdata || ! -f $s || $generate{$_}) {
|
||||
# If it's generated or we simply don't find it in the source
|
||||
# tree, we assume it's in the build tree.
|
||||
if ($s eq $src_configdata || $generate{$_} || ! -f $s) {
|
||||
$s = cleanfile($buildd, $_, $blddir);
|
||||
}
|
||||
# We recognise C++, C and asm files
|
||||
@@ -2110,9 +2153,9 @@ EOF
|
||||
foreach (@{$shared_sources{$dest}}) {
|
||||
my $s = cleanfile($sourced, $_, $blddir);
|
||||
|
||||
# If it isn't in the source tree, we assume it's generated
|
||||
# in the build tree
|
||||
if ($s eq $src_configdata || ! -f $s || $generate{$_}) {
|
||||
# If it's generated or we simply don't find it in the source
|
||||
# tree, we assume it's in the build tree.
|
||||
if ($s eq $src_configdata || $generate{$_} || ! -f $s) {
|
||||
$s = cleanfile($buildd, $_, $blddir);
|
||||
}
|
||||
|
||||
@@ -2152,8 +2195,7 @@ EOF
|
||||
my $gen = $generator[0];
|
||||
$generator[0] = cleanfile($sourced, $gen, $blddir);
|
||||
|
||||
# If the generator isn't in the source tree, we assume it's
|
||||
# generated in the build tree
|
||||
# If the generator is itself generated, it's in the build tree
|
||||
if ($generate{$gen}) {
|
||||
$generator[0] = cleanfile($buildd, $gen, $blddir);
|
||||
}
|
||||
@@ -2175,23 +2217,14 @@ EOF
|
||||
|
||||
# If we know it's generated, or assume it is because we can't
|
||||
# find it in the source tree, we set file we depend on to be
|
||||
# in the build tree rather than the source tree, and assume
|
||||
# and that there are lines to build it in a BEGINRAW..ENDRAW
|
||||
# section or in the Makefile template.
|
||||
# in the build tree rather than the source tree.
|
||||
if ($d eq $src_configdata
|
||||
|| ! -f $d
|
||||
|| (grep { $d eq $_ }
|
||||
map { cleanfile($srcdir, $_, $blddir) }
|
||||
grep { /\.h$/ } keys %{$unified_info{generate}})) {
|
||||
grep { /\.h$/ } keys %{$unified_info{generate}})
|
||||
|| ! -f $d) {
|
||||
$d = cleanfile($buildd, $_, $blddir);
|
||||
}
|
||||
# Take note if the file to depend on is being renamed
|
||||
# Take extra care with files ending with .a, they should
|
||||
# be treated without that extension, and the extension
|
||||
# should be added back after treatment.
|
||||
$d =~ /(\.a)?$/;
|
||||
my $e = $1 // "";
|
||||
$d = $`.$e;
|
||||
$unified_info{depends}->{$ddest}->{$d} = 1;
|
||||
|
||||
# Fix up associated attributes
|
||||
@@ -2230,9 +2263,6 @@ EOF
|
||||
# be a generated file in the build tree.
|
||||
if (! -f $ddest) {
|
||||
$ddest = cleanfile($buildd, $dest, $blddir);
|
||||
if ($unified_info{rename}->{$ddest}) {
|
||||
$ddest = $unified_info{rename}->{$ddest};
|
||||
}
|
||||
}
|
||||
}
|
||||
foreach my $v (@{$defines{$dest}}) {
|
||||
|
||||
Reference in New Issue
Block a user