Latest update.
This commit is contained in:
@@ -73,7 +73,15 @@ my $usage="Usage: Configure [no-<cipher> ...] [enable-<cipher> ...] [-Dxxx] [-lx
|
||||
# no-sse2 disables IA-32 SSE2 code in assembly modules, the above
|
||||
# mentioned '386' option implies this one
|
||||
# no-<cipher> build without specified algorithm (rsa, idea, rc5, ...)
|
||||
# -<xxx> +<xxx> compiler options are passed through
|
||||
# -<xxx> +<xxx> All options which are unknown to the 'Configure' script are
|
||||
# /<xxx> passed through to the compiler. Unix-style options beginning
|
||||
# with a '-' or '+' are recognized, as well as Windows-style
|
||||
# options beginning with a '/'. If the option contains arguments
|
||||
# separated by spaces, then the URL-style notation %20 can be
|
||||
# used for the space character in order to avoid having to quote
|
||||
# the option. For example, -opt%20arg gets expanded to -opt arg.
|
||||
# In fact, any ASCII character can be encoded as %xx using its
|
||||
# hexadecimal encoding.
|
||||
# -static while -static is also a pass-through compiler option (and
|
||||
# as such is limited to environments where it's actually
|
||||
# meaningful), it triggers a number configuration options,
|
||||
@@ -518,7 +526,7 @@ my @disable_cascades = (
|
||||
# or modules.
|
||||
"pic" => [ "shared", "module" ],
|
||||
|
||||
"module" => [ "fips", "legacy" ],
|
||||
"module" => [ "fips" ],
|
||||
|
||||
"engine" => [ grep /eng$/, @disablables ],
|
||||
"hw" => [ "padlockeng" ],
|
||||
@@ -821,7 +829,7 @@ while (@argvcopy)
|
||||
{
|
||||
die "FIPS mode not supported\n";
|
||||
}
|
||||
elsif (/^[-+]/)
|
||||
elsif (m|^[-+/]|)
|
||||
{
|
||||
if (/^--prefix=(.*)$/)
|
||||
{
|
||||
@@ -898,11 +906,11 @@ while (@argvcopy)
|
||||
{
|
||||
push @{$useradd{LDFLAGS}}, $_;
|
||||
}
|
||||
elsif (/^-D(.*)$/)
|
||||
elsif (m|^[-/]D(.*)$|)
|
||||
{
|
||||
push @{$useradd{CPPDEFINES}}, $1;
|
||||
}
|
||||
elsif (/^-I(.*)$/)
|
||||
elsif (m|^[-/]I(.*)$|)
|
||||
{
|
||||
push @{$useradd{CPPINCLUDES}}, $1;
|
||||
}
|
||||
@@ -912,11 +920,23 @@ while (@argvcopy)
|
||||
}
|
||||
else # common if (/^[-+]/), just pass down...
|
||||
{
|
||||
# Treat %xx as an ASCII code (e.g. replace %20 by a space character).
|
||||
# This provides a simple way to pass options with arguments separated
|
||||
# by spaces without quoting (e.g. -opt%20arg translates to -opt arg).
|
||||
$_ =~ s/%([0-9a-f]{1,2})/chr(hex($1))/gei;
|
||||
push @{$useradd{CFLAGS}}, $_;
|
||||
push @{$useradd{CXXFLAGS}}, $_;
|
||||
}
|
||||
}
|
||||
elsif (m|^/|)
|
||||
{
|
||||
# Treat %xx as an ASCII code (e.g. replace %20 by a space character).
|
||||
# This provides a simple way to pass options with arguments separated
|
||||
# by spaces without quoting (e.g. /opt%20arg translates to /opt arg).
|
||||
$_ =~ s/%([0-9a-f]{1,2})/chr(hex($1))/gei;
|
||||
push @{$useradd{CFLAGS}}, $_;
|
||||
push @{$useradd{CXXFLAGS}}, $_;
|
||||
}
|
||||
else
|
||||
{
|
||||
die "target already defined - $target (offending arg: $_)\n" if ($target ne "");
|
||||
@@ -1724,7 +1744,6 @@ if ($builder eq "unified") {
|
||||
my @modules = ();
|
||||
my @scripts = ();
|
||||
|
||||
my %attributes = ();
|
||||
my %sources = ();
|
||||
my %shared_sources = ();
|
||||
my %includes = ();
|
||||
@@ -1737,19 +1756,56 @@ 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/\$([[:alpha:]][[:alnum:]_]*)/;
|
||||
my $variable_re = qr/\$(?P<VARIABLE>[[:alpha:]][[:alnum:]_]*)/;
|
||||
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"
|
||||
}
|
||||
while ($value_rest =~ /(?<!\\)${variable_re}/) {
|
||||
$value .= $`;
|
||||
$value .= $variables{$1};
|
||||
$value .= $variables{$+{VARIABLE}};
|
||||
$value_rest = $';
|
||||
}
|
||||
if ($ENV{CONFIGURE_DEBUG_VARIABLE_EXPAND}) {
|
||||
print STDERR
|
||||
"DEBUG[\$expand_variables] ... '$value$value_rest'\n";
|
||||
}
|
||||
return $value . $value_rest;
|
||||
};
|
||||
|
||||
# Support for attributes in build.info files
|
||||
my %attributes = ();
|
||||
my $handle_attributes = sub {
|
||||
my $attr_str = shift;
|
||||
my $ref = shift;
|
||||
my @goals = @_;
|
||||
|
||||
return unless defined $attr_str;
|
||||
|
||||
my @a = tokenize($attr_str, qr|\s*,\s*|);
|
||||
foreach my $a (@a) {
|
||||
my $ac = 1;
|
||||
my $ak = $a;
|
||||
my $av = 1;
|
||||
if ($a =~ m|^(!)?(.*?)\s* = \s*(.*?)$|) {
|
||||
$ac = ! $1;
|
||||
$ak = $1;
|
||||
$av = $2;
|
||||
}
|
||||
foreach my $g (@goals) {
|
||||
if ($ac) {
|
||||
$$ref->{$g}->{$ak} = $av;
|
||||
} else {
|
||||
delete $$ref->{$g}->{$ak};
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
# 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);
|
||||
@@ -1779,148 +1835,129 @@ if ($builder eq "unified") {
|
||||
# 1 last was positive (don't skip lines until next ELSE, ELSIF or ENDIF)
|
||||
# 2 positive ELSE (following ELSIF should fail)
|
||||
my @skip = ();
|
||||
|
||||
# A few useful generic regexps
|
||||
my $index_re = qr/\[\s*(?P<INDEX>(?:\\.|.)*?)\s*\]/;
|
||||
my $cond_re = qr/\[\s*(?P<COND>(?:\\.|.)*?)\s*\]/;
|
||||
my $attribs_re = qr/(?:\{\s*(?P<ATTRIBS>(?:\\.|.)*?)\s*\})?/;
|
||||
my $value_re = qr/\s*(?P<VALUE>.*?)\s*/;
|
||||
collect_information(
|
||||
collect_from_array([ @text ],
|
||||
qr/\\$/ => sub { my $l1 = shift; my $l2 = shift;
|
||||
$l1 =~ s/\\$//; $l1.$l2 }),
|
||||
# Info we're looking for
|
||||
qr/^\s*IF\[((?:\\.|[^\\\]])*)\]\s*$/
|
||||
qr/^\s* IF ${cond_re} \s*$/x
|
||||
=> sub {
|
||||
if (! @skip || $skip[$#skip] > 0) {
|
||||
push @skip, !! $expand_variables->($1);
|
||||
push @skip, !! $expand_variables->($+{COND});
|
||||
} else {
|
||||
push @skip, -1;
|
||||
}
|
||||
},
|
||||
qr/^\s*ELSIF\[((?:\\.|[^\\\]])*)\]\s*$/
|
||||
qr/^\s* ELSIF ${cond_re} \s*$/x
|
||||
=> sub { die "ELSIF out of scope" if ! @skip;
|
||||
die "ELSIF following ELSE" if abs($skip[$#skip]) == 2;
|
||||
$skip[$#skip] = -1 if $skip[$#skip] != 0;
|
||||
$skip[$#skip] = !! $expand_variables->($1)
|
||||
$skip[$#skip] = !! $expand_variables->($+{COND})
|
||||
if $skip[$#skip] == 0; },
|
||||
qr/^\s*ELSE\s*$/
|
||||
qr/^\s* ELSE \s*$/x
|
||||
=> sub { die "ELSE out of scope" if ! @skip;
|
||||
$skip[$#skip] = -2 if $skip[$#skip] != 0;
|
||||
$skip[$#skip] = 2 if $skip[$#skip] == 0; },
|
||||
qr/^\s*ENDIF\s*$/
|
||||
qr/^\s* ENDIF \s*$/x
|
||||
=> sub { die "ENDIF out of scope" if ! @skip;
|
||||
pop @skip; },
|
||||
qr/^\s*${variable_re}\s*=\s*(.*?)\s*$/
|
||||
qr/^\s* ${variable_re} \s* = ${value_re} $/x
|
||||
=> sub {
|
||||
if (!@skip || $skip[$#skip] > 0) {
|
||||
my $n = $1;
|
||||
my $v = $2;
|
||||
$variables{$n} = $expand_variables->($v);
|
||||
$variables{$+{VARIABLE}} = $expand_variables->($+{VALUE});
|
||||
}
|
||||
},
|
||||
qr/^\s*SUBDIRS\s*=\s*(.*)\s*$/
|
||||
qr/^\s* SUBDIRS \s* = ${value_re} $/x
|
||||
=> sub {
|
||||
if (!@skip || $skip[$#skip] > 0) {
|
||||
foreach (tokenize($expand_variables->($1))) {
|
||||
foreach (tokenize($expand_variables->($+{VALUE}))) {
|
||||
push @build_dirs, [ @curd, splitdir($_, 1) ];
|
||||
}
|
||||
}
|
||||
},
|
||||
qr/^\s*PROGRAMS(?:{([\w=]+(?:\s*,\s*[\w=]+)*)})?\s*=\s*(.*)\s*$/
|
||||
qr/^\s* PROGRAMS ${attribs_re} \s* = ${value_re} $/x
|
||||
=> sub {
|
||||
if (!@skip || $skip[$#skip] > 0) {
|
||||
my @a = tokenize($1, qr|\s*,\s*|);
|
||||
my @p = tokenize($expand_variables->($2));
|
||||
my @p = tokenize($expand_variables->($+{VALUE}));
|
||||
push @programs, @p;
|
||||
foreach my $a (@a) {
|
||||
my $ak = $a;
|
||||
my $av = 1;
|
||||
if ($a =~ m|^(.*?)\s*=\s*(.*?)$|) {
|
||||
$ak = $1;
|
||||
$av = $2;
|
||||
}
|
||||
foreach my $p (@p) {
|
||||
$attributes{$p}->{$ak} = $av;
|
||||
}
|
||||
}
|
||||
$handle_attributes->($+{ATTRIBS},
|
||||
\$attributes{programs},
|
||||
@p);
|
||||
}
|
||||
},
|
||||
qr/^\s*LIBS(?:{([\w=]+(?:\s*,\s*[\w=]+)*)})?\s*=\s*(.*)\s*$/
|
||||
qr/^\s* LIBS ${attribs_re} \s* = ${value_re} $/x
|
||||
=> sub {
|
||||
if (!@skip || $skip[$#skip] > 0) {
|
||||
my @a = tokenize($1, qr|\s*,\s*|);
|
||||
my @l = tokenize($expand_variables->($2));
|
||||
my @l = tokenize($expand_variables->($+{VALUE}));
|
||||
push @libraries, @l;
|
||||
foreach my $a (@a) {
|
||||
my $ak = $a;
|
||||
my $av = 1;
|
||||
if ($a =~ m|^(.*?)\s*=\s*(.*?)$|) {
|
||||
$ak = $1;
|
||||
$av = $2;
|
||||
}
|
||||
foreach my $l (@l) {
|
||||
$attributes{$l}->{$ak} = $av;
|
||||
}
|
||||
}
|
||||
$handle_attributes->($+{ATTRIBS},
|
||||
\$attributes{libraries},
|
||||
@l);
|
||||
}
|
||||
},
|
||||
qr/^\s*MODULES(?:{([\w=]+(?:\s*,\s*[\w=]+)*)})?\s*=\s*(.*)\s*$/
|
||||
qr/^\s* MODULES ${attribs_re} \s* = ${value_re} $/x
|
||||
=> sub {
|
||||
if (!@skip || $skip[$#skip] > 0) {
|
||||
my @a = tokenize($1, qr|\s*,\s*|);
|
||||
my @m = tokenize($expand_variables->($2));
|
||||
my @m = tokenize($expand_variables->($+{VALUE}));
|
||||
push @modules, @m;
|
||||
foreach my $a (@a) {
|
||||
my $ak = $a;
|
||||
my $av = 1;
|
||||
if ($a =~ m|^(.*?)\s*=\s*(.*?)$|) {
|
||||
$ak = $1;
|
||||
$av = $2;
|
||||
}
|
||||
foreach my $m (@m) {
|
||||
$attributes{$m}->{$ak} = $av;
|
||||
}
|
||||
}
|
||||
$handle_attributes->($+{ATTRIBS},
|
||||
\$attributes{modules},
|
||||
@m);
|
||||
}
|
||||
},
|
||||
qr/^\s*SCRIPTS(?:{([\w=]+(?:\s*,\s*[\w=]+)*)})?\s*=\s*(.*)\s*$/
|
||||
qr/^\s* SCRIPTS ${attribs_re} \s* = ${value_re} $/x
|
||||
=> sub {
|
||||
if (!@skip || $skip[$#skip] > 0) {
|
||||
my @a = tokenize($1, qr|\s*,\s*|);
|
||||
my @s = tokenize($expand_variables->($2));
|
||||
my @s = tokenize($expand_variables->($+{VALUE}));
|
||||
push @scripts, @s;
|
||||
foreach my $a (@a) {
|
||||
my $ak = $a;
|
||||
my $av = 1;
|
||||
if ($a =~ m|^(.*?)\s*=\s*(.*?)$|) {
|
||||
$ak = $1;
|
||||
$av = $2;
|
||||
}
|
||||
foreach my $s (@s) {
|
||||
$attributes{$s}->{$ak} = $av;
|
||||
}
|
||||
}
|
||||
$handle_attributes->($+{ATTRIBS},
|
||||
\$attributes{scripts},
|
||||
@s);
|
||||
}
|
||||
},
|
||||
|
||||
qr/^\s*ORDINALS\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/,
|
||||
=> sub { push @{$ordinals{$1}}, tokenize($expand_variables->($2))
|
||||
qr/^\s* ORDINALS ${index_re} = ${value_re} $/x
|
||||
=> sub { push @{$ordinals{$expand_variables->($+{INDEX})}},
|
||||
tokenize($expand_variables->($+{VALUE}))
|
||||
if !@skip || $skip[$#skip] > 0 },
|
||||
qr/^\s*SOURCE\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/
|
||||
=> sub { push @{$sources{$1}}, tokenize($expand_variables->($2))
|
||||
qr/^\s* SOURCE ${index_re} = ${value_re} $/x
|
||||
=> sub { push @{$sources{$expand_variables->($+{INDEX})}},
|
||||
tokenize($expand_variables->($+{VALUE}))
|
||||
if !@skip || $skip[$#skip] > 0 },
|
||||
qr/^\s*SHARED_SOURCE\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/
|
||||
=> sub { push @{$shared_sources{$1}},
|
||||
tokenize($expand_variables->($2))
|
||||
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 },
|
||||
qr/^\s*INCLUDE\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/
|
||||
=> sub { push @{$includes{$1}}, tokenize($expand_variables->($2))
|
||||
qr/^\s* INCLUDE ${index_re} = ${value_re} $/x
|
||||
=> sub { push @{$includes{$expand_variables->($+{INDEX})}},
|
||||
tokenize($expand_variables->($+{VALUE}))
|
||||
if !@skip || $skip[$#skip] > 0 },
|
||||
qr/^\s*DEFINE\[((?:\\.|[^\\\]])*)\]\s*=\s*(.*)\s*$/
|
||||
=> sub { push @{$defines{$1}}, tokenize($expand_variables->($2))
|
||||
qr/^\s* DEFINE ${index_re} = ${value_re} $/x
|
||||
=> sub { push @{$defines{$expand_variables->($+{INDEX})}},
|
||||
tokenize($expand_variables->($+{VALUE}))
|
||||
if !@skip || $skip[$#skip] > 0 },
|
||||
qr/^\s*DEPEND\[((?:\\.|[^\\\]])*)\]\s*=\s*(.*)\s*$/
|
||||
=> sub { push @{$depends{$1}}, tokenize($expand_variables->($2))
|
||||
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);
|
||||
}
|
||||
},
|
||||
qr/^\s* GENERATE ${index_re} = ${value_re} $/x
|
||||
=> sub { push @{$generate{$expand_variables->($+{INDEX})}},
|
||||
$+{VALUE}
|
||||
if !@skip || $skip[$#skip] > 0 },
|
||||
qr/^\s*GENERATE\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/
|
||||
=> sub { push @{$generate{$1}}, $2
|
||||
if !@skip || $skip[$#skip] > 0 },
|
||||
qr/^\s*(?:#.*)?$/ => sub { },
|
||||
qr/^\s* (?:\#.*)? $/x => sub { },
|
||||
"OTHERWISE" => sub { die "Something wrong with this line:\n$_\nat $sourced/$f" },
|
||||
"BEFORE" => sub {
|
||||
if ($buildinfo_debug) {
|
||||
@@ -1936,7 +1973,7 @@ if ($builder eq "unified") {
|
||||
);
|
||||
die "runaway IF?" if (@skip);
|
||||
|
||||
if (grep { defined $attributes{$_}->{engine} } keys %attributes
|
||||
if (grep { defined $attributes{modules}->{$_}->{engine} } keys %attributes
|
||||
and !$config{dynamic_engines}) {
|
||||
die <<"EOF"
|
||||
ENGINES can only be used if configured with 'dynamic-engine'.
|
||||
@@ -1944,15 +1981,6 @@ This is usually a fault in a build.info file.
|
||||
EOF
|
||||
}
|
||||
|
||||
foreach (keys %attributes) {
|
||||
my $dest = $_;
|
||||
my $ddest = cleanfile($buildd, $_, $blddir);
|
||||
foreach (keys %{$attributes{$dest} // {}}) {
|
||||
$unified_info{attributes}->{$ddest}->{$_} =
|
||||
$attributes{$dest}->{$_};
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
my %infos = ( programs => [ @programs ],
|
||||
libraries => [ @libraries ],
|
||||
@@ -1962,6 +1990,11 @@ EOF
|
||||
foreach (@{$infos{$k}}) {
|
||||
my $item = cleanfile($buildd, $_, $blddir);
|
||||
$unified_info{$k}->{$item} = 1;
|
||||
|
||||
# Fix up associated attributes
|
||||
$unified_info{attributes}->{$k}->{$item} =
|
||||
$attributes{$k}->{$_}
|
||||
if defined $attributes{$k}->{$_};
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2090,6 +2123,11 @@ EOF
|
||||
my $e = $1 // "";
|
||||
$d = $`.$e;
|
||||
$unified_info{depends}->{$ddest}->{$d} = 1;
|
||||
|
||||
# Fix up associated attributes
|
||||
$unified_info{attributes}->{depends}->{$ddest}->{$d} =
|
||||
$attributes{depends}->{$dest}->{$_}
|
||||
if defined $attributes{depends}->{$dest}->{$_};
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user