X-Git-Url: https://git.openssl.org/gitweb/?p=openssl.git;a=blobdiff_plain;f=Configure;h=ca90a752f55b732393edee7f6914522f3b96bd5e;hp=cde97f9b2aee908a43e2c0a3c1fe1109ad98a9e7;hb=9e381e8a018592a2a42e83df402e1ef921469e9f;hpb=63468812bdbee64bb3ca757c4692cb3cf2ace01e diff --git a/Configure b/Configure index cde97f9b2a..ca90a752f5 100755 --- a/Configure +++ b/Configure @@ -278,11 +278,15 @@ if (defined env($local_config_envname)) { } } +# Save away perl command information +$config{perl_cmd} = $^X; +$config{perl_version} = $Config{version}; +$config{perl_archname} = $Config{archname}; + $config{prefix}=""; $config{openssldir}=""; $config{processor}=""; $config{libdir}=""; -$config{cross_compile_prefix}=""; my $auto_threads=1; # enable threads automatically? true by default my $default_ranlib; @@ -435,8 +439,6 @@ our %disabled = ( # "what" => "comment" "ssl3" => "default", "ssl3-method" => "default", "ubsan" => "default", - #TODO(TLS1.3): Temporarily disabled while this is a WIP - "tls1_3" => "default", "tls13downgrade" => "default", "unit-test" => "default", "weak-ssl-ciphers" => "default", @@ -534,6 +536,7 @@ my %user = ( CPPFLAGS => [], # -D, -I, -Wp, CPPDEFINES => [], # Alternative for -D CPPINCLUDES => [], # Alternative for -I + CROSS_COMPILE => undef, HASHBANGPERL=> undef, LD => undef, LDFLAGS => [], # -L, -Wl, @@ -545,6 +548,9 @@ my %user = ( RCFLAGS => [], RM => undef, ); +# Info about what "make variables" may be prefixed with the cross compiler +# prefix. This should NEVER mention any such variable with a list for value. +my @user_crossable = qw ( AR AS CC CXX CPP LD MT RANLIB RC ); # The same but for flags given as Configure options. These are *additional* # input, as opposed to the VAR=string option that override the corresponding # config target attributes @@ -562,14 +568,31 @@ my %user_synonyms = ( HASHBANGPERL=> 'PERL', RC => 'WINDRES', ); -my %user_to_target = ( - # If not given here, the value is the lc of the key - CPPDEFINES => 'defines', - CPPINCLUDES => 'includes', - LDFLAGS => 'lflags', - LDLIBS => 'ex_libs', + +# Some target attributes have been renamed, this is the translation table +my %target_attr_translate =( + ar => 'AR', + as => 'AS', + cc => 'CC', + cxx => 'CXX', + cpp => 'CPP', + hashbangperl => 'HASHBANGPERL', + ld => 'LD', + mt => 'MT', + ranlib => 'RANLIB', + rc => 'RC', + rm => 'RM', ); +# Initialisers coming from 'config' scripts +$config{defines} = [ split(/$list_separator_re/, env('__CNF_CPPDEFINES')) ], +$config{includes} = [ split(/$list_separator_re/, env('__CNF_CPPINCLUDES')) ], +$config{cppflags} = [ env('__CNF_CPPFLAGS') || () ], +$config{cflags} = [ env('__CNF_CFLAGS') || () ], +$config{cxxflags} = [ env('__CNF_CXXFLAGS') || () ], +$config{lflags} = [ env('__CNF_LDFLAGS') || () ], +$config{ex_libs} = [ env('__CNF_LDLIBS') || () ], + $config{openssl_api_defines}=[]; $config{openssl_algorithm_defines}=[]; $config{openssl_thread_defines}=[]; @@ -598,10 +621,10 @@ while (@argvcopy) { $user{$1} = ref $user{$1} eq "ARRAY" ? [] : undef; } - if (exists $useradd{$1}) - { - $useradd{$1} = []; - } + #if (exists $useradd{$1}) + # { + # $useradd{$1} = []; + # } next; } @@ -781,7 +804,7 @@ while (@argvcopy) } elsif (/^--cross-compile-prefix=(.*)$/) { - $config{cross_compile_prefix}=$1; + $user{CROSS_COMPILE}=$1; } elsif (/^--config=(.*)$/) { @@ -868,6 +891,33 @@ while (@argvcopy) } } +# 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 +# is set. +if (grep { scalar @$_ > 0 } values %useradd) { + # Hash of env / make variables names. The possible values are: + # 1 - environment set + # 2 - %useradd entry set + # 3 - both set + my %detected_env = + map { my $v = 0; + $v += 1 if env($_); + $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); + die <<"_____"; +***** Mixing env / make variables and additional compiler/linker flags as +***** configure command line option is not permitted. +***** Affected env / make variables: $names +_____ + } +} + foreach (keys %user) { my $value = env($_); $value //= defined $user_synonyms{$_} ? env($user_synonyms{$_}) : undef; @@ -888,17 +938,6 @@ if (grep { $_ =~ /(^|\s)-Wl,-rpath,/ } ($user{LDLIBS} ? @{$user{LDLIBS}} : ()) "***** any of asan, msan or ubsan\n"; } -if (scalar(@seed_sources) == 0) { - print "Using implicit seed configuration\n"; - push @seed_sources, 'os'; -} -die "Cannot seed with none and anything else" - if scalar(grep { $_ eq 'none' } @seed_sources) > 0 - && scalar(@seed_sources) > 1; -push @{$config{openssl_other_defines}}, - map { (my $x = $_) =~ tr|[\-a-z]|[_A-Z]|; "OPENSSL_RAND_SEED_$x" } - @seed_sources; - my @tocheckfor = (keys %disabled); while (@tocheckfor) { my %new_tocheckfor = (); @@ -939,9 +978,20 @@ if ($target eq "HASH") { exit 0; } -print "Configuring OpenSSL version $config{version} ($config{version_num})\n"; +print "Configuring OpenSSL version $config{version} ($config{version_num}) "; print "for $target\n"; +if (scalar(@seed_sources) == 0) { + print "Using os-specific seed configuration\n"; + push @seed_sources, 'os'; +} +die "Cannot seed with none and anything else" + if scalar(grep { $_ eq 'none' } @seed_sources) > 0 + && scalar(@seed_sources) > 1; +push @{$config{openssl_other_defines}}, + map { (my $x = $_) =~ tr|[\-a-z]|[_A-Z]|; "OPENSSL_RAND_SEED_$x" } + @seed_sources; + # Backward compatibility? if ($target =~ m/^CygWin32(-.*)$/) { $target = "Cygwin".$1; @@ -962,13 +1012,19 @@ my %target = resolve_config($target); &usage if (!%target || $target{template}); +foreach (keys %target_attr_translate) { + $target{$target_attr_translate{$_}} = $target{$_} + if $target{$_}; + delete $target{$_}; +} + %target = ( %{$table{DEFAULTS}}, %target ); # Make the flags to build DSOs the same as for shared libraries unless they # are already defined -$target{dso_cflags} = $target{shared_cflag} unless defined $target{dso_cflags}; -$target{dso_cxxflags} = $target{shared_cxxflag} unless defined $target{dso_cxxflags}; -$target{dso_lflags} = $target{shared_ldflag} unless defined $target{dso_lflags}; +$target{module_cflags} = $target{shared_cflag} unless defined $target{module_cflags}; +$target{module_cxxflags} = $target{shared_cxxflag} unless defined $target{module_cxxflags}; +$target{module_ldflags} = $target{shared_ldflag} unless defined $target{module_ldflags}; { my $shared_info_pl = catfile(dirname($0), "Configurations", "shared-info.pl"); @@ -990,10 +1046,10 @@ $target{dso_lflags} = $target{shared_ldflag} unless defined $target{dso_lflags}; # Windows and VMS. if (defined $si) { # Just as above, copy certain shared_* attributes to the corresponding - # dso_ attribute unless the latter is already defined - $si->{dso_cflags} = $si->{shared_cflag} unless defined $si->{dso_cflags}; - $si->{dso_cxxflags} = $si->{shared_cxxflag} unless defined $si->{dso_cxxflags}; - $si->{dso_lflags} = $si->{shared_ldflag} unless defined $si->{dso_lflags}; + # module_ attribute unless the latter is already defined + $si->{module_cflags} = $si->{shared_cflag} unless defined $si->{module_cflags}; + $si->{module_cxxflags} = $si->{shared_cxxflag} unless defined $si->{module_cxxflags}; + $si->{module_ldflags} = $si->{shared_ldflag} unless defined $si->{module_ldflags}; foreach (sort keys %$si) { $target{$_} = defined $target{$_} ? add($si->{$_})->($target{$_}) @@ -1024,7 +1080,8 @@ foreach my $feature (@{$target{enable}}) { } } -$target{cxxflags}//=$target{cflags} if $target{cxx}; +$target{CXXFLAGS}//=$target{CFLAGS} if $target{CXX}; +$target{cxxflags}//=$target{cflags} if $target{CXX}; $target{exe_extension}=""; $target{exe_extension}=".exe" if ($config{target} eq "DJGPP" || $config{target} =~ /^(?:Cygwin|mingw)/); @@ -1036,16 +1093,11 @@ $target{dso_extension}=$target{shared_extension_simple}; ($target{shared_import_extension}=$target{shared_extension_simple}.".a") if ($config{target} =~ /^(?:Cygwin|mingw)/); - -$config{cross_compile_prefix} = env('CROSS_COMPILE') - if $config{cross_compile_prefix} eq ""; - # Allow overriding the names of some tools. USE WITH CARE # Note: only Unix cares about HASHBANGPERL... that explains # the default string. $config{perl} = ($^O ne "VMS" ? $^X : "perl"); foreach (keys %user) { - my $target_key = $user_to_target{$_} // lc $_; my $ref_type = ref $user{$_}; # Temporary function. Takes an intended ref type (empty string or "ARRAY") @@ -1071,12 +1123,11 @@ foreach (keys %user) { return $value; }; - $config{$target_key} = + $config{$_} = $mkvalue->($ref_type, $user{$_}) - || $mkvalue->($ref_type, $target{$target_key}); - delete $config{$target_key} unless defined $config{$target_key}; + || $mkvalue->($ref_type, $target{$_}); + delete $config{$_} unless defined $config{$_}; } -$config{plib_lflags} = [ $target{plib_lflags} ]; # Allow overriding the build file name $config{build_file} = env('BUILDFILE') || $target{build_file} || "Makefile"; @@ -1146,21 +1197,22 @@ foreach my $checker (($builder_platform."-".$target{build_file}."-checker.pm", push @{$config{defines}}, "NDEBUG" if $config{build_type} eq "release"; -if ($target =~ /^mingw/ && `$config{cc} --target-help 2>&1` =~ m/-mno-cygwin/m) +if ($target =~ /^mingw/ && `$config{CC} --target-help 2>&1` =~ m/-mno-cygwin/m) { push @{$config{cflags}}, "-mno-cygwin"; - push @{$config{cxxflags}}, "-mno-cygwin" if $config{cxx}; + push @{$config{cxxflags}}, "-mno-cygwin" if $config{CXX}; push @{$config{shared_ldflag}}, "-mno-cygwin"; } if ($target =~ /linux.*-mips/ && !$disabled{asm} - && !grep { $_ !~ /-m(ips|arch=)/ } @{$user{CFLAGS}}) { + && !grep { $_ !~ /-m(ips|arch=)/ } (@{$user{CFLAGS}}, + @{$useradd{CFLAGS}})) { # minimally required architecture flags for assembly modules my $value; $value = '-mips2' if ($target =~ /mips32/); $value = '-mips3' if ($target =~ /mips64/); unshift @{$config{cflags}}, $value; - unshift @{$config{cxxflags}}, $value if $config{cxx}; + unshift @{$config{cxxflags}}, $value if $config{CXX}; } # The DSO code currently always implements all functions so that no @@ -1174,15 +1226,15 @@ if (!$disabled{dso} && $target{dso_scheme} ne "") $target{dso_scheme} =~ tr/[a-z]/[A-Z]/; if ($target{dso_scheme} eq "DLFCN") { - unshift @{$config{defines}}, "DSO_DLFCN", "HAVE_DLFCN_H"; + unshift @{$config{lib_defines}}, "DSO_DLFCN", "HAVE_DLFCN_H"; } elsif ($target{dso_scheme} eq "DLFCN_NO_H") { - unshift @{$config{defines}}, "DSO_DLFCN"; + unshift @{$config{lib_defines}}, "DSO_DLFCN"; } else { - unshift @{$config{defines}}, "DSO_$target{dso_scheme}"; + unshift @{$config{lib_defines}}, "DSO_$target{dso_scheme}"; } } @@ -1202,7 +1254,8 @@ unless ($disabled{threads}) { # system-dependent compiler options that are necessary. We # can't truly check that the given options are correct, but # we expect the user to know what [s]He is doing. - if (!@{$user{CFLAGS}} && !@{$user{CPPDEFINES}}) { + if (!@{$user{CFLAGS}} && !@{$useradd{CFLAGS}} + && !@{$user{CPPDEFINES}} && !@{$useradd{CPPDEFINES}}) { die "You asked for multi-threading support, but didn't\n" ,"provide any system-specific compiler options\n"; } @@ -1232,16 +1285,16 @@ if ($target{shared_target} eq "") } if ($disabled{"dynamic-engine"}) { - push @{$config{defines}}, "OPENSSL_NO_DYNAMIC_ENGINE"; + push @{$config{openssl_other_defines}}, "OPENSSL_NO_DYNAMIC_ENGINE"; $config{dynamic_engines} = 0; } else { - push @{$config{defines}}, "OPENSSL_NO_STATIC_ENGINE"; + push @{$config{openssl_other_defines}}, "OPENSSL_NO_STATIC_ENGINE"; $config{dynamic_engines} = 1; } unless ($disabled{asan}) { push @{$config{cflags}}, "-fsanitize=address"; - push @{$config{cxxflags}}, "-fsanitize=address" if $config{cxx}; + push @{$config{cxxflags}}, "-fsanitize=address" if $config{CXX}; } unless ($disabled{ubsan}) { @@ -1249,18 +1302,18 @@ unless ($disabled{ubsan}) { # platforms. push @{$config{cflags}}, "-fsanitize=undefined", "-fno-sanitize-recover=all"; push @{$config{cxxflags}}, "-fsanitize=undefined", "-fno-sanitize-recover=all" - if $config{cxx}; + if $config{CXX}; } unless ($disabled{msan}) { push @{$config{cflags}}, "-fsanitize=memory"; - push @{$config{cxxflags}}, "-fsanitize=memory" if $config{cxx}; + push @{$config{cxxflags}}, "-fsanitize=memory" if $config{CXX}; } unless ($disabled{"fuzz-libfuzzer"} && $disabled{"fuzz-afl"} && $disabled{asan} && $disabled{ubsan} && $disabled{msan}) { push @{$config{cflags}}, "-fno-omit-frame-pointer", "-g"; - push @{$config{cxxflags}}, "-fno-omit-frame-pointer", "-g" if $config{cxx}; + push @{$config{cxxflags}}, "-fno-omit-frame-pointer", "-g" if $config{CXX}; } # # Platform fix-ups @@ -1270,9 +1323,9 @@ unless ($disabled{"fuzz-libfuzzer"} && $disabled{"fuzz-afl"} if ($disabled{pic}) { foreach (qw(shared_cflag shared_cxxflag shared_cppflag - shared_defines shared_includes shared_ldflag - dso_cflags dso_cxxflags dso_cppflags - dso_defines dso_includes dso_lflags)) + shared_defines shared_includes shared_ldflag + module_cflags module_cxxflags module_cppflags + module_defines module_includes module_lflags)) { delete $config{$_}; $target{$_} = ""; @@ -1280,7 +1333,7 @@ if ($disabled{pic}) } else { - push @{$config{defines}}, "OPENSSL_PIC"; + push @{$config{lib_defines}}, "OPENSSL_PIC"; } if ($target{sys_id} ne "") @@ -1290,64 +1343,69 @@ if ($target{sys_id} ne "") unless ($disabled{asm}) { $target{cpuid_asm_src}=$table{DEFAULTS}->{cpuid_asm_src} if ($config{processor} eq "386"); + push @{$config{lib_defines}}, "OPENSSL_CPUID_OBJ" if ($target{cpuid_asm_src} ne "mem_clr.c"); + $target{bn_asm_src} =~ s/\w+-gf2m.c// if (defined($disabled{ec2m})); # bn-586 is the only one implementing bn_*_part_words - push @{$config{defines}}, "OPENSSL_BN_ASM_PART_WORDS" if ($target{bn_asm_src} =~ /bn-586/); - push @{$config{defines}}, "OPENSSL_IA32_SSE2" if (!$disabled{sse2} && $target{bn_asm_src} =~ /86/); + push @{$config{lib_defines}}, "OPENSSL_BN_ASM_PART_WORDS" if ($target{bn_asm_src} =~ /bn-586/); + push @{$config{lib_defines}}, "OPENSSL_IA32_SSE2" if (!$disabled{sse2} && $target{bn_asm_src} =~ /86/); - push @{$config{defines}}, "OPENSSL_BN_ASM_MONT" if ($target{bn_asm_src} =~ /-mont/); - push @{$config{defines}}, "OPENSSL_BN_ASM_MONT5" if ($target{bn_asm_src} =~ /-mont5/); - push @{$config{defines}}, "OPENSSL_BN_ASM_GF2m" if ($target{bn_asm_src} =~ /-gf2m/); + push @{$config{lib_defines}}, "OPENSSL_BN_ASM_MONT" if ($target{bn_asm_src} =~ /-mont/); + push @{$config{lib_defines}}, "OPENSSL_BN_ASM_MONT5" if ($target{bn_asm_src} =~ /-mont5/); + push @{$config{lib_defines}}, "OPENSSL_BN_ASM_GF2m" if ($target{bn_asm_src} =~ /-gf2m/); if ($target{sha1_asm_src}) { - push @{$config{defines}}, "SHA1_ASM" if ($target{sha1_asm_src} =~ /sx86/ || $target{sha1_asm_src} =~ /sha1/); - push @{$config{defines}}, "SHA256_ASM" if ($target{sha1_asm_src} =~ /sha256/); - push @{$config{defines}}, "SHA512_ASM" if ($target{sha1_asm_src} =~ /sha512/); + push @{$config{lib_defines}}, "SHA1_ASM" if ($target{sha1_asm_src} =~ /sx86/ || $target{sha1_asm_src} =~ /sha1/); + push @{$config{lib_defines}}, "SHA256_ASM" if ($target{sha1_asm_src} =~ /sha256/); + push @{$config{lib_defines}}, "SHA512_ASM" if ($target{sha1_asm_src} =~ /sha512/); } if ($target{rc4_asm_src} ne $table{DEFAULTS}->{rc4_asm_src}) { - push @{$config{defines}}, "RC4_ASM"; + push @{$config{lib_defines}}, "RC4_ASM"; } if ($target{md5_asm_src}) { - push @{$config{defines}}, "MD5_ASM"; + push @{$config{lib_defines}}, "MD5_ASM"; } $target{cast_asm_src}=$table{DEFAULTS}->{cast_asm_src} unless $disabled{pic}; # CAST assembler is not PIC if ($target{rmd160_asm_src}) { - push @{$config{defines}}, "RMD160_ASM"; + push @{$config{lib_defines}}, "RMD160_ASM"; } if ($target{aes_asm_src}) { - push @{$config{defines}}, "AES_ASM" if ($target{aes_asm_src} =~ m/\baes-/);; + push @{$config{lib_defines}}, "AES_ASM" if ($target{aes_asm_src} =~ m/\baes-/);; # aes-ctr.fake is not a real file, only indication that assembler # module implements AES_ctr32_encrypt... - push @{$config{defines}}, "AES_CTR_ASM" if ($target{aes_asm_src} =~ s/\s*aes-ctr\.fake//); + push @{$config{lib_defines}}, "AES_CTR_ASM" if ($target{aes_asm_src} =~ s/\s*aes-ctr\.fake//); # aes-xts.fake indicates presence of AES_xts_[en|de]crypt... - push @{$config{defines}}, "AES_XTS_ASM" if ($target{aes_asm_src} =~ s/\s*aes-xts\.fake//); + push @{$config{lib_defines}}, "AES_XTS_ASM" if ($target{aes_asm_src} =~ s/\s*aes-xts\.fake//); $target{aes_asm_src} =~ s/\s*(vpaes|aesni)-x86\.s//g if ($disabled{sse2}); - push @{$config{defines}}, "VPAES_ASM" if ($target{aes_asm_src} =~ m/vpaes/); - push @{$config{defines}}, "BSAES_ASM" if ($target{aes_asm_src} =~ m/bsaes/); + push @{$config{lib_defines}}, "VPAES_ASM" if ($target{aes_asm_src} =~ m/vpaes/); + push @{$config{lib_defines}}, "BSAES_ASM" if ($target{aes_asm_src} =~ m/bsaes/); } if ($target{wp_asm_src} =~ /mmx/) { if ($config{processor} eq "386") { $target{wp_asm_src}=$table{DEFAULTS}->{wp_asm_src}; } elsif (!$disabled{"whirlpool"}) { - push @{$config{defines}}, "WHIRLPOOL_ASM"; + push @{$config{lib_defines}}, "WHIRLPOOL_ASM"; } } if ($target{modes_asm_src} =~ /ghash-/) { - push @{$config{defines}}, "GHASH_ASM"; + push @{$config{lib_defines}}, "GHASH_ASM"; } if ($target{ec_asm_src} =~ /ecp_nistz256/) { - push @{$config{defines}}, "ECP_NISTZ256_ASM"; + push @{$config{lib_defines}}, "ECP_NISTZ256_ASM"; + } + if ($target{ec_asm_src} =~ /x25519/) { + push @{$config{lib_defines}}, "X25519_ASM"; } if ($target{padlock_asm_src} ne $table{DEFAULTS}->{padlock_asm_src}) { - push @{$config{defines}}, "PADLOCK_ASM"; + push @{$config{lib_defines}}, "PADLOCK_ASM"; } if ($target{poly1305_asm_src} ne "") { - push @{$config{defines}}, "POLY1305_ASM"; + push @{$config{lib_defines}}, "POLY1305_ASM"; } } -my %predefined = compiler_predefined($config{cc}); +my %predefined = compiler_predefined($config{CC}); # Check for makedepend capabilities. if (!$disabled{makedepend}) { @@ -1358,7 +1416,7 @@ if (!$disabled{makedepend}) { } elsif ($predefined{__GNUC__} >= 3) { # We know that GNU C version 3 and up as well as all clang # versions support dependency generation - $config{makedepprog} = "\$(CROSS_COMPILE)$config{cc}"; + $config{makedepprog} = "\$(CROSS_COMPILE)$config{CC}"; } else { # In all other cases, we look for 'makedepend', and disable the # capability if not found. @@ -1400,7 +1458,7 @@ die "Exactly one of SIXTY_FOUR_BIT|SIXTY_FOUR_BIT_LONG|THIRTY_TWO_BIT can be set $config{cflags} = [ map { (my $x = $_) =~ s/([\\\"])/\\$1/g; $x } @{$config{cflags}} ]; $config{cxxflags} = [ map { (my $x = $_) =~ s/([\\\"])/\\$1/g; $x } - @{$config{cxxflags}} ] if $config{cxx}; + @{$config{cxxflags}} ] if $config{CXX}; if (defined($config{api})) { $config{openssl_api_defines} = [ "OPENSSL_MIN_API=".$apitable->{$config{api}} ]; @@ -1410,7 +1468,7 @@ if (defined($config{api})) { if (defined($predefined{__clang__}) && !$disabled{asm}) { push @{$config{cflags}}, "-Qunused-arguments"; - push @{$config{cxxflags}}, "-Qunused-arguments" if $config{cxx}; + push @{$config{cxxflags}}, "-Qunused-arguments" if $config{CXX}; } if ($strict_warnings) @@ -1426,7 +1484,7 @@ if ($strict_warnings) push @{$config{cflags}}, $wopt unless grep { $_ eq $wopt } @{$config{cflags}}; push @{$config{cxxflags}}, $wopt - if ($config{cxx} + if ($config{CXX} && !grep { $_ eq $wopt } @{$config{cxxflags}}); } if (defined($predefined{__clang__})) @@ -1436,7 +1494,7 @@ if ($strict_warnings) push @{$config{cflags}}, $wopt unless grep { $_ eq $wopt } @{$config{cflags}}; push @{$config{cxxflags}}, $wopt - if ($config{cxx} + if ($config{CXX} && !grep { $_ eq $wopt } @{$config{cxxflags}}); } } @@ -1449,7 +1507,7 @@ unless ($disabled{"crypto-mdebug-backtrace"}) push @{$config{cflags}}, $wopt unless grep { $_ eq $wopt } @{$config{cflags}}; push @{$config{cxxflags}}, $wopt - if ($config{cxx} + if ($config{CXX} && !grep { $_ eq $wopt } @{$config{cxxflags}}); } if ($target =~ /^BSD-/) @@ -1460,9 +1518,9 @@ unless ($disabled{"crypto-mdebug-backtrace"}) 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_prefix} eq "") { + if ($config{CROSS_COMPILE} eq "") { my $verstr = `uname -r`; my ($ma, $mi1, $mi2) = split("\\.", $verstr); ($mi2) = $mi2 =~ /(\d+)/; @@ -1489,12 +1547,10 @@ foreach (keys %useradd) { die "internal error: \$useradd{$_} isn't an ARRAY\n" unless ref $useradd{$_} eq 'ARRAY'; - my $target_key = $user_to_target{$_} // lc $_; - - if (defined $config{$target_key}) { - push @{$config{$target_key}}, @{$useradd{$_}}; + if (defined $config{$_}) { + push @{$config{$_}}, @{$useradd{$_}}; } else { - $config{$target_key} = [ @{$useradd{$_}} ]; + $config{$_} = [ @{$useradd{$_}} ]; } } @@ -1631,6 +1687,10 @@ if ($builder eq "unified") { 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', @@ -1927,7 +1987,7 @@ EOF # If it isn't in the source tree, we assume it's generated # in the build tree - if (! -f $s) { + if ($s eq $src_configdata || ! -f $s || $generate{$_}) { $s = cleanfile($buildd, $_, $blddir); } # We recognise C++, C and asm files @@ -1955,7 +2015,7 @@ EOF # If it isn't in the source tree, we assume it's generated # in the build tree - if (! -f $s) { + if ($s eq $src_configdata || ! -f $s || $generate{$_}) { $s = cleanfile($buildd, $_, $blddir); } @@ -2005,7 +2065,7 @@ EOF # 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}; @@ -2019,7 +2079,8 @@ EOF # 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}})) { @@ -2046,7 +2107,7 @@ EOF # 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}; @@ -2079,16 +2140,12 @@ EOF 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}}; } } @@ -2158,7 +2215,7 @@ foreach (grep /_(asm|aux)_src$/, keys %target) { print "Creating configdata.pm\n"; open(OUT,">configdata.pm") || die "unable to create configdata.pm: $!\n"; print OUT <<"EOF"; -#! $config{hashbangperl} +#! $config{HASHBANGPERL} package configdata; @@ -2294,10 +2351,11 @@ if ($builder eq "unified") { EOF } -print OUT "my \%makevars = (\n"; +print OUT + "# The following data is only used when this files is use as a script\n"; +print OUT "my \@makevars = (\n"; foreach (sort keys %user) { - print OUT ' ',$_,' ' x (20 - length $_),'=> ', - "'",$user_to_target{$_} || lc $_,"',\n"; + print OUT " '",$_,"',\n"; } print OUT ");\n"; print OUT "my \%disabled_info = (\n"; @@ -2316,6 +2374,7 @@ foreach my $what (sort keys %disabled_info) { print OUT " },\n"; } print OUT ");\n"; +print OUT 'my @user_crossable = qw( ', join (' ', @user_crossable), " );\n"; print OUT << 'EOF'; # If run directly, we can give some answers, and even reconfigure unless (caller) { @@ -2329,6 +2388,7 @@ unless (caller) { my $dump = undef; my $cmdline = undef; my $options = undef; + my $target = undef; my $envvars = undef; my $makevars = undef; my $buildparams = undef; @@ -2339,6 +2399,7 @@ unless (caller) { GetOptions('dump|d' => \$dump, 'command-line|c' => \$cmdline, 'options|o' => \$options, + 'target|t' => \$target, 'environment|e' => \$envvars, 'make-variables|m' => \$makevars, 'build-parameters|b' => \$buildparams, @@ -2348,7 +2409,7 @@ unless (caller) { 'man' => \$man) or die "Errors in command line arguments\n"; - unless ($dump || $cmdline || $options || $envvars || $makevars + unless ($dump || $cmdline || $options || $target || $envvars || $makevars || $buildparams || $reconf || $verbose || $help || $man) { print STDERR <<"_____"; You must give at least one option. @@ -2366,17 +2427,22 @@ _____ -verbose => 2); } if ($dump || $cmdline) { - print "\n(with current working directory = $here)"; - print "\nCommand line:\n\n"; + print "\nCommand line (with current working directory = $here):\n\n"; print ' ',join(' ', $config{perl}, catfile($config{sourcedir}, 'Configure'), @{$config{perlargv}}), "\n"; + print "\nPerl information:\n\n"; + print ' ',$config{perl_cmd},"\n"; + print ' ',$config{perl_version},' for ',$config{perl_archname},"\n"; } if ($dump || $options) { my $longest = 0; + my $longest2 = 0; foreach my $what (@disablables) { $longest = length($what) if $longest < length($what); + $longest2 = length($disabled{$what}) + if $disabled{$what} && $longest2 < length($disabled{$what}); } print "\nEnabled features:\n\n"; foreach my $what (@disablables) { @@ -2386,7 +2452,7 @@ _____ foreach my $what (@disablables) { if ($disabled{$what}) { print " $what", ' ' x ($longest - length($what) + 1), - "[$disabled{$what}]", ' ' x (10 - length($disabled{$what})); + "[$disabled{$what}]", ' ' x ($longest2 - length($disabled{$what}) + 1); print $disabled_info{$what}->{macro} if $disabled_info{$what}->{macro}; print ' (skip ', @@ -2397,6 +2463,21 @@ _____ } } } + if ($dump || $target) { + print "\nConfig target attributes:\n\n"; + foreach (sort keys %target) { + next if $_ =~ m|^_| || $_ eq 'template'; + my $quotify = sub { + map { (my $x = $_) =~ s|([\\\$\@"])|\\$1|g; "\"$x\""} @_; + }; + print ' ', $_, ' => '; + if (ref($target{$_}) eq "ARRAY") { + print '[ ', join(', ', $quotify->(@{$target{$_}})), " ],\n"; + } else { + print $quotify->($target{$_}), ",\n" + } + } + } if ($dump || $envvars) { print "\nRecorded environment:\n\n"; foreach (sort keys %{$config{perlenv}}) { @@ -2405,13 +2486,17 @@ _____ } if ($dump || $makevars) { print "\nMakevars:\n\n"; - foreach (sort keys %makevars) { - print ' ',$_,' ' x (16 - length $_),'= ', - (ref $config{$makevars{$_}} eq 'ARRAY' - ? join(' ', @{$config{$makevars{$_}}}) - : $config{$makevars{$_}}), + foreach my $var (@makevars) { + my $prefix = ''; + $prefix = $config{CROSS_COMPILE} + if grep { $var eq $_ } @user_crossable; + $prefix //= ''; + print ' ',$var,' ' x (16 - length $var),'= ', + (ref $config{$var} eq 'ARRAY' + ? join(' ', @{$config{$var}}) + : $prefix.$config{$var}), "\n" - if defined $config{$makevars{$_}}; + if defined $config{$var}; } my @buildfile = ($config{builddir}, $config{build_file}); @@ -2504,10 +2589,11 @@ Print a brief help message and exit. Print the manual page and exit. -=item B<--dump> | B<-c> +=item B<--dump> | B<-d> Print all relevant configuration data. This is equivalent to B<--command-line> -B<--options> B<--environment> B<--make-variables> B<--build-parameters>. +B<--options> B<--target> B<--environment> B<--make-variables> +B<--build-parameters>. =item B<--command-line> | B<-c> @@ -2518,6 +2604,10 @@ Print the current configuration command line. Print the features, both enabled and disabled, and display defined macro and skipped directories where applicable. +=item B<--target> | B<-t> + +Print the config attributes for this config target. + =item B<--environment> | B<-e> Print the environment variables and their values at the time of configuration. @@ -2560,17 +2650,6 @@ my %builders = ( $builders{$builder}->($builder_platform, @builder_opts); -# Show a note on the use of configdata.pm, but ONLY for release 1.1.1 -# (i.e. this message disappears with the following update, 1.1.1a) -print <<"EOF" if ($config{version_num} =~ m|^0x1010100.L$|); - -NOTE: Starting with OpenSSL 1.1.1, 'Configure' doesn't display all the disabled -options or the "make variables" with their values. Instead, you must use -'configdata.pm' as a script to get a display of the configuration data. For -help, please do this: - - perl configdata.pm --help -EOF print <<"EOF" if ($disabled{threads} eq "unavailable"); The library could not be configured for supporting multi-threaded @@ -2587,12 +2666,16 @@ or position independent code, please let us know (but please first make sure you have tried with a current version of OpenSSL). EOF -print <<"EOF" if (-f catfile($srcdir, "configdata.pm") && $srcdir ne $blddir); +print <<"EOF"; -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. +********************************************************************** +*** *** +*** If you want to report a building issue, please include the *** +*** output from this command: *** +*** *** +*** perl configdata.pm --dump *** +*** *** +********************************************************************** EOF exit(0); @@ -2963,11 +3046,11 @@ sub compiler_predefined { return () if $^O eq 'VMS'; - die 'compiler_predefines called without a default compiler' + die 'compiler_predefined called without a default compiler' unless $default_compiler; if (! $predefined{$default_compiler}) { - my $cc = "$config{cross_compile_prefix}$default_compiler"; + my $cc = "$config{CROSS_COMPILE}$default_compiler"; $predefined{$default_compiler} = {}; @@ -3040,7 +3123,6 @@ sub print_table_entry "ld", "lflags", "loutflag", - "plib_lflags", "ex_libs", "bn_ops", "apps_aux_src",