$config{perlargv} = [ @argvcopy ];
+# Historical: if known directories in crypto/ have been removed, it means
+# that those sub-systems are disabled.
+# (the other option would be to removed them from the SUBDIRS statement in
+# crypto/build.info)
+# We reverse the input list for cosmetic purely reasons, to compensate that
+# 'unshift' adds at the front of the list (i.e. in reverse input order).
+foreach ( reverse sort( 'aes', 'aria', 'bf', 'camellia', 'cast', 'des', 'dh',
+ 'dsa', 'ec', 'hmac', 'idea', 'md2', 'md5', 'mdc2',
+ 'rc2', 'rc4', 'rc5', 'ripemd', 'rsa', 'seed', 'sha',
+ 'sm2', 'sm3', 'sm4') ) {
+ unshift @argvcopy, "no-$_" if ! -d catdir($srcdir, 'crypto', $_);
+}
+
# Collect version numbers
my %version = ();
# 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;
};
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
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);
}
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);
}
# 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
# 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}}) {