"objects",
"md2", "md4", "md5", "sha", "mdc2", "hmac", "ripemd", "whrlpool", "poly1305", "blake2", "siphash", "sm3",
"des", "aes", "rc2", "rc4", "rc5", "idea", "aria", "bf", "cast", "camellia", "seed", "sm4", "chacha", "modes",
- "bn", "ec", "rsa", "dsa", "dh", "dso", "engine",
+ "bn", "ec", "rsa", "dsa", "dh", "sm2", "dso", "engine",
"buffer", "bio", "stack", "lhash", "rand", "err",
"evp", "asn1", "pem", "x509", "x509v3", "conf", "txt_db", "pkcs7", "pkcs12", "comp", "ocsp", "ui",
"cms", "ts", "srp", "cmac", "ct", "async", "kdf", "store"
{ VMS => qr/(?<!\^),/,
MSWin32 => qr/(?<!\\);/ } -> {$^O} // qr/(?<!\\)[:\s]/;
# All the "make variables" we support
+# Some get pre-populated for the sake of backward compatibility
+# (we supported those before the change to "make variable" support.
my %user = (
- AR => undef,
+ AR => env('AR'),
ARFLAGS => [],
AS => undef,
ASFLAGS => [],
- CC => undef,
+ CC => env('CC'),
CFLAGS => [],
- CXX => undef,
+ CXX => env('CXX'),
CXXFLAGS => [],
CPP => undef,
CPPFLAGS => [], # -D, -I, -Wp,
CPPDEFINES => [], # Alternative for -D
CPPINCLUDES => [], # Alternative for -I
- CROSS_COMPILE => undef,
- HASHBANGPERL=> undef,
+ CROSS_COMPILE => env('CROSS_COMPILE'),
+ HASHBANGPERL=> env('HASHBANGPERL') || env('PERL'),
LD => undef,
LDFLAGS => [], # -L, -Wl,
LDLIBS => [], # -l
MT => undef,
MTFLAGS => [],
- RANLIB => undef,
- RC => undef,
+ RANLIB => env('RANLIB'),
+ RC => env('RC') || env('WINDRES'),
RCFLAGS => [],
RM => undef,
);
$config{build_type} = "release";
my $target="";
+my %cmdvars = (); # Stores FOO='blah' type arguments
my %unsupported_options = ();
my %deprecated_options = ();
# If you change this, update apps/version.c
# Support env variable assignments among the options
if (m|^(\w+)=(.+)?$|)
{
- $config{perlenv}->{$1} = $2;
+ $cmdvars{$1} = $2;
# Every time a variable is given as a configuration argument,
# it acts as a reset if the variable.
if (exists $user{$1})
{
s/^([^=]*)/lc($1)/e;
}
- s /^-no-/no-/; # some people just can't read the instructions
+
+ # some people just can't read the instructions, clang people have to...
+ s/^-no-(?!integrated-as)/no-/;
# rewrite some options in "enable-..." form
s /^-?-?shared$/enable-shared/;
}
}
-# If any %useradd entry has been set, we must check that the environment
-# variables haven't been set. We start by checking of any %useradd entry
+# If any %useradd entry has been set, we must check that the "make
+# variables" haven't been set. We start by checking of any %useradd entry
# is set.
if (grep { scalar @$_ > 0 } values %useradd) {
# Hash of env / make variables names. The possible values are:
- # 1 - environment set
+ # 1 - "make vars"
# 2 - %useradd entry set
# 3 - both set
- my %detected_env =
+ my %detected_vars =
map { my $v = 0;
- $v += 1 if env($_);
+ $v += 1 if $cmdvars{$_};
$v += 2 if @{$useradd{$_}};
$_ => $v }
keys %useradd;
- # If any of the corresponding environment variables is set, we error
- if (grep { $_ & 1 } values %detected_env) {
- my $names = join(', ', grep { $detected_env{$_} > 0 }
- sort keys %detected_env);
+ # If any of the corresponding "make variables" is set, we error
+ if (grep { $_ & 1 } values %detected_vars) {
+ my $names = join(', ', grep { $detected_vars{$_} > 0 }
+ sort keys %detected_vars);
die <<"_____";
-***** Mixing env / make variables and additional compiler/linker flags as
+***** Mixing make variables and additional compiler/linker flags as
***** configure command line option is not permitted.
-***** Affected env / make variables: $names
+***** Affected make variables: $names
_____
}
}
+# Check through all supported command line variables to see if any of them
+# were set, and canonicalise the values we got. If no compiler or linker
+# flag or anything else that affects %useradd was set, we also check the
+# environment for values.
+my $anyuseradd =
+ grep { defined $_ && (ref $_ ne 'ARRAY' || @$_) } values %useradd;
foreach (keys %user) {
- my $value = env($_);
- $value //= defined $user_synonyms{$_} ? env($user_synonyms{$_}) : undef;
+ my $value = $cmdvars{$_};
+ $value //= env($_) unless $anyuseradd;
+ $value //=
+ defined $user_synonyms{$_} ? $cmdvars{$user_synonyms{$_}} : undef;
+ $value //= defined $user_synonyms{$_} ? env($user_synonyms{$_}) : undef
+ unless $anyuseradd;
if (defined $value) {
if (ref $user{$_} eq 'ARRAY') {
unless ($disabled{afalgeng}) {
$config{afalgeng}="";
- if ($target =~ m/^linux/) {
+ if (grep { $_ eq 'afalgeng' } @{$target{enable}}) {
my $minver = 4*10000 + 1*100 + 0;
if ($config{CROSS_COMPILE} eq "") {
my $verstr = `uname -r`;
my %sharednames = ();
my %generate = ();
+ # 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);
+
push @{$config{build_infos}}, catfile(abs2rel($sourced, $blddir), $f);
my $template =
Text::Template->new(TYPE => 'FILE',
# If it isn't in the source tree, we assume it's generated
# in the build tree
- if (! -f $s || $generate{$_}) {
+ if ($s eq $src_configdata || ! -f $s || $generate{$_}) {
$s = cleanfile($buildd, $_, $blddir);
}
# We recognise C++, C and asm files
# If it isn't in the source tree, we assume it's generated
# in the build tree
- if (! -f $s || $generate{$_}) {
+ if ($s eq $src_configdata || ! -f $s || $generate{$_}) {
$s = cleanfile($buildd, $_, $blddir);
}
# If the destination doesn't exist in source, it can only be
# a generated file in the build tree.
- if ($ddest ne "" && ! -f $ddest) {
+ if ($ddest ne "" && ($ddest eq $src_configdata || ! -f $ddest)) {
$ddest = cleanfile($buildd, $_, $blddir);
if ($unified_info{rename}->{$ddest}) {
$ddest = $unified_info{rename}->{$ddest};
# 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.
- if (! -f $d
+ if ($d eq $src_configdata
+ || ! -f $d
|| (grep { $d eq $_ }
map { cleanfile($srcdir, $_, $blddir) }
grep { /\.h$/ } keys %{$unified_info{generate}})) {
# If the destination doesn't exist in source, it can only be
# a generated file in the build tree.
- if (! -f $ddest) {
+ if ($ddest eq $src_configdata || ! -f $ddest) {
$ddest = cleanfile($buildd, $_, $blddir);
if ($unified_info{rename}->{$ddest}) {
$ddest = $unified_info{rename}->{$ddest};
next if $dest eq "";
foreach my $d (keys %{$unified_info{depends}->{$dest}}) {
next unless $d =~ /\.(h|pm)$/;
- if ($d eq "configdata.pm"
- || defined($unified_info{generate}->{$d})) {
- my $i = cleandir($blddir, dirname($d));
- push @{$unified_info{includes}->{$dest}->{build}}, $i
- unless grep { $_ eq $i } @{$unified_info{includes}->{$dest}->{build}};
- } else {
- my $i = cleandir($srcdir, dirname($d));
- push @{$unified_info{includes}->{$dest}->{source}}, $i
- unless grep { $_ eq $i } @{$unified_info{includes}->{$dest}->{source}};
- }
+ my $i = dirname($d);
+ my $spot =
+ $d eq "configdata.pm" || defined($unified_info{generate}->{$d})
+ ? 'build' : 'source';
+ push @{$unified_info{includes}->{$dest}->{$spot}}, $i
+ unless grep { $_ eq $i } @{$unified_info{includes}->{$dest}->{$spot}};
}
}
you have tried with a current version of OpenSSL).
EOF
-print <<"EOF" if (-f catfile($srcdir, "configdata.pm") && $srcdir ne $blddir);
-
-WARNING: there are indications that another build was made in the source
-directory. This build may have picked up artifacts from that build, the
-safest course of action is to clean the source directory and redo this
-configuration.
-EOF
-
print <<"EOF";
**********************************************************************
sub env
{
my $name = shift;
+ my %opts = @_;
- # Note that if $ENV{$name} doesn't exist or is undefined,
- # $config{perlenv}->{$name} will be created with the value
- # undef. This is intentional.
+ unless ($opts{cacheonly}) {
+ # Note that if $ENV{$name} doesn't exist or is undefined,
+ # $config{perlenv}->{$name} will be created with the value
+ # undef. This is intentional.
- $config{perlenv}->{$name} = $ENV{$name}
- if ! exists $config{perlenv}->{$name};
+ $config{perlenv}->{$name} = $ENV{$name}
+ if ! exists $config{perlenv}->{$name};
+ }
return $config{perlenv}->{$name};
}