X-Git-Url: https://git.openssl.org/gitweb/?p=openssl.git;a=blobdiff_plain;f=Configure;h=efbe0f8587132c3c0eebfb4bb5c5db1a958881cd;hp=82086ed5a6d6eba75938c5606af0aea7c7d2b400;hb=01d9997659d910882790765f213f01e58b9f5cb1;hpb=721f9058b398f05611c1d5ac4ff7cc464695dd1e diff --git a/Configure b/Configure index 82086ed5a6..efbe0f8587 100755 --- a/Configure +++ b/Configure @@ -1,11 +1,7 @@ #! /usr/bin/env perl # -*- mode: perl; -*- -## ## Configure -- OpenSSL source tree configuration script -## If editing this file, run this command before committing -## make -f Makefile.in TABLE -## require 5.000; use strict; @@ -57,6 +53,9 @@ my $usage="Usage: Configure [no- ...] [enable- ...] [-Dxxx] [-lx # library and will be loaded in run-time by the OpenSSL library. # sctp include SCTP support # 386 generate 80386 code +# enable-weak-ssl-ciphers +# Enable weak ciphers that are disabled by default. This currently +# only includes RC4 based ciphers. # no-sse2 disables IA-32 SSE2 code, above option implies no-sse2 # no- build without specified algorithm (rsa, idea, rc5, ...) # - + compiler options are passed through @@ -94,11 +93,11 @@ my $gcc_devteam_warn = "-DPEDANTIC -DREF_DEBUG -DDEBUG_UNUSED -DBIO_DEBUG" # TODO(openssl-team): fix problems and investigate if (at least) the # following warnings can also be enabled: # -Wswitch-enum -# -Wunused-macros # -Wcast-align # -Wunreachable-code -# -Wlanguage-extension-token -# -Wextended-offsetof +# -Wlanguage-extension-token -- no, we use asm() +# -Wunused-macros -- no, too tricky for BN and _XOPEN_SOURCE etc +# -Wextended-offsetof -- no, needed in CMS ASN1 code my $clang_devteam_warn = "" . " -Qunused-arguments" . " -Wextra" @@ -124,7 +123,7 @@ my $strict_warnings = 0; # which has to be accompanied by explicit -D_THREAD_SAFE and # sometimes -D_REENTRANT. FreeBSD 5.x expands it as -lc_r, which # seems to be sufficient? -my $BSDthreads="-pthread -D_THREAD_SAFE -D_REENTRANT"; +our $BSDthreads="-pthread -D_THREAD_SAFE -D_REENTRANT"; # # API compability name to version number mapping. @@ -136,9 +135,9 @@ my $apitable = { "0.9.8" => "0x00908000L", }; -my $base_target = "BASE"; # The template that all other inherit from our %table = (); our %config = (); +our %withargs = (); # Forward declarations ############################################### @@ -199,7 +198,6 @@ foreach (sort glob($pattern) ) { print "Configuring OpenSSL version $config{version} (0x$config{version_num})\n"; -$config{perl}; $config{prefix}=""; $config{openssldir}=""; $config{processor}=""; @@ -208,7 +206,7 @@ $config{cross_compile_prefix}=""; $config{fipslibdir}="/usr/local/ssl/fips-2.0/lib/"; my $nofipscanistercheck=0; $config{baseaddr}="0xFB00000"; -my $threads=0; +my $auto_threads=1; # enable threads automatically? true by default my $default_ranlib; $config{fips}=0; @@ -217,7 +215,7 @@ $config{dirs} = [ "crypto", "ssl", "engines", "apps", "test", "tools" ]; # crypto/ subdirectories to build $config{sdirs} = [ "objects", - "md2", "md4", "md5", "sha", "mdc2", "hmac", "ripemd", "whrlpool", "poly1305", + "md2", "md4", "md5", "sha", "mdc2", "hmac", "ripemd", "whrlpool", "poly1305", "blake2", "des", "aes", "rc2", "rc4", "rc5", "idea", "bf", "cast", "camellia", "seed", "chacha", "modes", "bn", "ec", "rsa", "dsa", "dh", "dso", "engine", "buffer", "bio", "stack", "lhash", "rand", "err", @@ -240,6 +238,7 @@ my @disablables = ( "autoalginit", "autoerrinit", "bf", + "blake2", "camellia", "capieng", "cast", @@ -271,12 +270,13 @@ my @disablables = ( "hmac", "hw(-.+)?", "idea", - "locking", + "makedepend", "md2", "md4", "md5", "mdc2", "md[-_]ghost94", + "multiblock", "nextprotoneg", "ocb", "ocsp", @@ -313,6 +313,7 @@ my @disablables = ( "ui", "unit-test", "whirlpool", + "weak-ssl-ciphers", "zlib", "zlib-dynamic", ); @@ -330,17 +331,21 @@ my @deprecated_disablables = ( our %disabled = ( # "what" => "comment" "ec_nistp_64_gcc_128" => "default", - "egd" => "default", - "md2" => "default", - "rc5" => "default", - "sctp" => "default", - "shared" => "default", - "ssl-trace" => "default", - "static-engine" => "default", - "unit-test" => "default", - "zlib" => "default", - "crypto-mdebug" => "default", - "heartbeats" => "default", + "egd" => "default", + "md2" => "default", + "rc5" => "default", + "sctp" => "default", + "shared" => "default", + "ssl-trace" => "default", + "ssl3" => "default", + "ssl3-method" => "default", + "static-engine" => "default", + "unit-test" => "default", + "weak-ssl-ciphers" => "default", + "zlib" => "default", + "zlib-dynamic" => "default", + "crypto-mdebug" => "default", + "heartbeats" => "default", ); # Note: => pair form used for aesthetics, not to truly make a hash table @@ -387,7 +392,8 @@ my @disable_cascades = ( "dso" => [ "dynamic-engine" ], # Without position independent code, there can be no shared libraries or DSOs - "pic" => [ "shared", "dynamic-engine" ], + "pic" => [ "shared" ], + "shared" => [ "dynamic-engine" ], ); # Avoid protocol support holes. Also disable all versions below N, if version @@ -429,7 +435,6 @@ my $no_sse2=0; my $user_cflags=""; my @user_defines=(); -my $unified = 0; $config{openssl_api_defines}=[]; $config{openssl_algorithm_defines}=[]; $config{openssl_thread_defines}=[]; @@ -438,8 +443,9 @@ $config{openssl_other_defines}=[]; my $libs=""; my $target=""; $config{options}=""; -my %withargs=(); -my $build_prefix = "release_"; +$config{build_type} = "release"; + +my $classic = 0; my @argvcopy=@ARGV; @@ -570,6 +576,8 @@ foreach (@argvcopy) { $disabled{$1} = "option"; } + # No longer an automatic choice + $auto_threads = 0 if ($1 eq "threads"); } elsif (/^enable-(.+)$/) { @@ -581,10 +589,15 @@ foreach (@argvcopy) { delete $disabled{"dynamic-engine"}; } + elsif ($1 eq "zlib-dynamic") + { + delete $disabled{"zlib"}; + } my $algo = $1; delete $disabled{$algo}; - $threads = 1 if ($algo eq "threads"); + # No longer an automatic choice + $auto_threads = 0 if ($1 eq "threads"); } elsif (/^--strict-warnings$/) { @@ -592,11 +605,11 @@ foreach (@argvcopy) } elsif (/^--debug$/) { - $build_prefix = "debug_"; + $config{build_type} = "debug"; } elsif (/^--release$/) { - $build_prefix = "release_"; + $config{build_type} = "release"; } elsif (/^386$/) { $config{processor}=386; } @@ -617,9 +630,9 @@ foreach (@argvcopy) } elsif (/^[-+]/) { - if (/^--unified$/) + if (/^--classic$/) { - $unified=1; + $classic=1; } elsif (/^--prefix=(.*)$/) { @@ -677,11 +690,6 @@ foreach (@argvcopy) $user_cflags.=" ".$_; } } - elsif ($_ =~ /^([^:]+):(.+)$/) - { - eval "\$table{\$1} = \"$2\""; # allow $xxx constructs in the string - $target=$1; - } else { die "target already defined - $target (offending arg: $_)\n" if ($target ne ""); @@ -733,7 +741,7 @@ while (@tocheckfor) { my ($test, $descendents) = (shift @cascade_copy, shift @cascade_copy); if (ref($test) eq "CODE" ? $test->() : defined($disabled{$test})) { map { - $new_tocheckfor{$_} => 1; $disabled{$_} = "forced"; + $new_tocheckfor{$_} = 1; $disabled{$_} = "forced"; } grep { !defined($disabled{$_}) } @$descendents; } } @@ -785,6 +793,8 @@ foreach (sort (keys %disabled)) { } elsif (/^dynamic-engine$/) { } + elsif (/^makedepend$/) + { } elsif (/^zlib-dynamic$/) { } elsif (/^sse2$/) @@ -800,7 +810,7 @@ foreach (sort (keys %disabled)) my ($ALGO, $algo); ($ALGO = $algo = $_) =~ tr/[\-a-z]/[_A-Z]/; - if (/^asm$/ || /^err$/ || /^hw$/ || /^hw-/ + if (/^asm$/ || /^err$/ || /^hw$/ || /^hw-/ || /^async$/ || /^autoalginit/ || /^autoerrinit/) { push @{$config{openssl_other_defines}}, "OPENSSL_NO_$ALGO"; @@ -832,7 +842,7 @@ print "Configuring for $target\n"; # Support for legacy targets having a name starting with 'debug-' my ($d, $t) = $target =~ m/^(debug-)?(.*)$/; if ($d) { - $build_prefix = "debug_"; + $config{build_type} = "debug"; # If we do not find debug-foo in the table, the target is set to foo. if (!$table{$target}) { @@ -840,11 +850,12 @@ if ($d) { } } $config{target} = $target; -delete $table{$base_target}->{template}; # or the next test will fail. -my %target = ( %{$table{$base_target}}, resolve_config($target) ); +my %target = resolve_config($target); &usage if (!%target || $target{template}); +%target = ( %{$table{DEFAULTS}}, %target ); + $target{exe_extension}=""; $target{exe_extension}=".exe" if ($config{target} eq "DJGPP" || $config{target} =~ /^(?:Cygwin|mingw)/); @@ -858,50 +869,42 @@ $target{dso_extension}=$target{shared_extension_simple}; if ($config{target} =~ /^(?:Cygwin|mingw)/); -$default_ranlib = which("ranlib") || "true"; -$config{perl} = $ENV{'PERL'} || which("perl5") || which("perl") || "perl"; -my $make = $ENV{'MAKE'} || "make"; - $config{cross_compile_prefix} = $ENV{'CROSS_COMPILE'} if $config{cross_compile_prefix} eq ""; -# Allow environment CC to override compiler... -$target{cc} = $ENV{CC} || $target{cc}; +# Allow overriding the names of some tools. USE WITH CARE +$config{perl} = $ENV{'PERL'} || which("perl5") || which("perl") || "perl"; +$target{cc} = $ENV{'CC'} || $target{cc} || "cc"; +$target{ranlib} = $ENV{'RANLIB'} || $target{ranlib} || which("ranlib") || "true"; +$target{ar} = $ENV{'AR'} || $target{ar} || "ar"; +$target{nm} = $ENV{'NM'} || $target{nm} || "nm"; # For cflags, lflags, plib_lflags, ex_libs and defines, add the debug_ # or release_ attributes. # Do it in such a way that no spurious space is appended (hence the grep). -$config{defines} = [ @{$target{defines}}, - @{$target{$build_prefix."defines"}} ]; -$config{cflags} = join(" ", - grep { $_ ne "" } ($target{cflags}, - $target{$build_prefix."cflags"})); -$config{lflags} = join(" ", - grep { $_ ne "" } ($target{lflags}, - $target{$build_prefix."lflags"})); -$config{plib_lflags} = join(" ", - grep { $_ ne "" } ($target{plib_lflags}, - $target{$build_prefix."plib_lflags"})); -$config{ex_libs} = join(" ", - grep { $_ ne "" } ($target{ex_libs}, - $target{$build_prefix."ex_libs"})); - -$target{ranlib} = $ENV{'RANLIB'} || $target{ranlib} || $default_ranlib; -$target{ar} = $ENV{'AR'} || "ar"; -$target{arflags} = "" if !defined($target{arflags}); -$target{nm} = "nm"; +$config{defines} = []; +$config{cflags} = ""; +$config{ex_libs} = ""; +$config{shared_ldflag} = ""; + # Make sure build_scheme is consistent. $target{build_scheme} = [ $target{build_scheme} ] if ref($target{build_scheme}) ne "ARRAY"; -###### TO BE REMOVED BEFORE FINAL RELEASE +###### TO BE REMOVED WHEN CLASSIC BUILD IS REMOVED ###### -###### If the user has chosen --unified, we give it to them. -###### The same happens if we detect that they try to build out-of-source. -if ($target{build_file} eq "Makefile" - && $target{build_scheme}->[0] eq "unixmake" - && ($unified || $srcdir ne $blddir)) { - $target{build_scheme} = [ "unified", "unix" ]; +###### If the user has chosen --classic, we give it to them. +###### If they try that with an out-of-source config, we complain. +if ($target{build_scheme}->[0] eq "unified" && $classic) { + die "Can't perform a classic build out of source tree\n" + if $srcdir ne $blddir; + + $target{build_scheme} = { unix => [ "unixmake" ], + windows => [ "mk1mf", $target{build_scheme}->[2] ], + VMS => undef } -> {$target{build_scheme}->[1]}; + + die "Classic mode unavailable on this platform\n" + unless defined($target{build_scheme}); } my ($builder, $builder_platform, @builder_opts) = @@ -910,7 +913,7 @@ my ($builder, $builder_platform, @builder_opts) = if ($target =~ /^mingw/ && `$target{cc} --target-help 2>&1` =~ m/-mno-cygwin/m) { $config{cflags} .= " -mno-cygwin"; - $target{shared_ldflag} .= " -mno-cygwin"; + $config{shared_ldflag} .= " -mno-cygwin"; } if ($target =~ /linux.*-mips/ && !$disabled{asm} && $user_cflags !~ /-m(ips|arch=)/) { @@ -934,81 +937,61 @@ if (!$disabled{dso} && $target{dso_scheme} ne "") $target{dso_scheme} =~ tr/[a-z]/[A-Z]/; if ($target{dso_scheme} eq "DLFCN") { - $config{defines} = [ "DSO_DLFCN", "HAVE_DLFCN_H", - @{$config{defines}} ] + unshift @{$config{defines}}, "DSO_DLFCN", "HAVE_DLFCN_H"; } elsif ($target{dso_scheme} eq "DLFCN_NO_H") { - $config{defines} = [ "DSO_DLFCN", @{$config{defines}} ] + unshift @{$config{defines}}, "DSO_DLFCN"; } else { - $config{defines} = [ "DSO_$target{dso_scheme}", - @{$config{defines}} ] - } - } - -my $thread_cflags = ""; -my @thread_defines; -if ($target{thread_cflag} ne "(unknown)" && !$disabled{threads}) - { - # If we know how to do it, support threads by default. - $threads = 1; - } -if ($target{thread_cflag} eq "(unknown)" && $threads) - { - # If the user asked for "threads", [s]he is also expected to - # provide any system-dependent compiler options that are - # necessary. - if ($no_user_cflags && $no_user_defines) - { - print "You asked for multi-threading support, but didn't\n"; - print "provide any system-specific compiler options\n"; - exit(1); + unshift @{$config{defines}}, "DSO_$target{dso_scheme}"; } - push @thread_defines, "OPENSSL_THREADS"; - } -else - { - $thread_cflags=" $target{thread_cflag}"; - push @thread_defines, @{$target{thread_defines}}, "OPENSSL_THREADS"; } $config{ex_libs}="$libs$config{ex_libs}" if ($libs ne ""); if ($disabled{asm}) { - @{$config{defines}} = grep !/^[BL]_ENDIAN$/, @{$config{defines}} - if ($config{fips}); - } - -if ($threads) - { - $config{cflags} = "$thread_cflags $config{cflags}" if $thread_cflags; - push @{$config{defines}}, @thread_defines; - push @{$config{openssl_thread_defines}}, @thread_defines; - } - -unless ($disabled{zlib}) - { - push @{$config{defines}}, "ZLIB"; - if (defined($disabled{"zlib-dynamic"})) - { - if (defined($withargs{zlib_lib})) - { - $config{ex_libs} .= " -L" . $withargs{zlib_lib} . " -lz"; - } - else - { - $config{ex_libs} .= " -lz"; - } - } - else + if ($config{fips}) { - push @{$config{defines}}, "ZLIB_SHARED"; + @{$config{defines}} = grep !/^[BL]_ENDIAN$/, @{$config{defines}}; + @{$target{defines}} = grep !/^[BL]_ENDIAN$/, @{$target{defines}}; } } +# If threads aren't disabled, check how possible they are +unless ($disabled{threads}) { + if ($auto_threads) { + # Enabled by default, disable it forcibly if unavailable + if ($target{thread_scheme} eq "(unknown)") { + $disabled{threads} = "unavailable"; + } + } else { + # The user chose to enable threads explicitely, let's see + # if there's a chance that's possible + if ($target{thread_scheme} eq "(unknown)") { + # If the user asked for "threads" and we don't have internal + # knowledge how to do it, [s]he is expected to provide any + # 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 ($no_user_cflags && $no_user_defines) { + die "You asked for multi-threading support, but didn't\n" + ,"provide any system-specific compiler options\n"; + } + } + } +} + +# If threads still aren't disabled, add a C macro to ensure the source +# code knows about it. Any other flag is taken care of by the configs. +unless($disabled{threads}) { + foreach (("defines", "openssl_thread_defines")) { + push @{$config{$_}}, "OPENSSL_THREADS"; + } +} + # With "deprecated" disable all deprecated features. if (defined($disabled{"deprecated"})) { $config{api} = $maxapi; @@ -1042,19 +1025,18 @@ if ($disabled{pic}) $target{shared_cflag} = $target{shared_ldflag} = $target{shared_rcflag} = ""; } - -if ($target{sys_id} ne "") +else { - push @{$config{openssl_sys_defines}}, "OPENSSL_SYS_$target{sys_id}"; + push @{$config{defines}}, "OPENSSL_PIC"; } -if ($target{ranlib} eq "") +if ($target{sys_id} ne "") { - $target{ranlib} = $default_ranlib; + push @{$config{openssl_sys_defines}}, "OPENSSL_SYS_$target{sys_id}"; } unless ($disabled{asm}) { - $target{cpuid_asm_src}=$table{BASE}->{cpuid_asm_src} if ($config{processor} eq "386"); + $target{cpuid_asm_src}=$table{DEFAULTS}->{cpuid_asm_src} if ($config{processor} eq "386"); $target{bn_asm_src} =~ s/\w+-gf2m.c// if (defined($disabled{ec2m})); # bn-586 is the only one implementing bn_*_part_words @@ -1077,7 +1059,7 @@ unless ($disabled{asm}) { if ($target{md5_asm_src}) { push @{$config{defines}}, "MD5_ASM"; } - $target{cast_asm_src}=$table{BASE}->{cast_asm_src} unless $disabled{pic}; # CAST assembler is not PIC + $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"; } @@ -1094,9 +1076,9 @@ unless ($disabled{asm}) { } if ($target{wp_asm_src} =~ /mmx/) { if ($config{processor} eq "386") { - $target{wp_asm_src}=$table{BASE}->{wp_asm_src}; + $target{wp_asm_src}=$table{DEFAULTS}->{wp_asm_src}; } elsif (!$disabled{"whirlpool"}) { - $config{cflags}.=" -DWHIRLPOOL_ASM"; + push @{$config{defines}}, "WHIRLPOOL_ASM"; } } if ($target{modes_asm_src} =~ /ghash-/) { @@ -1111,21 +1093,32 @@ unless ($disabled{asm}) { } my $ecc = $target{cc}; -if ($^O ne "VMS") { +if ($^O ne "VMS" && !$disabled{makedepend}) { # Is the compiler gcc or clang? $ecc is used below to see if # error-checking can be turned on. my $ccpcc = "$config{cross_compile_prefix}$target{cc}"; - $config{makedepprog} = 'makedepend'; - open(PIPE, "$ccpcc --version 2>&1 | head -2 |"); + open(PIPE, "$ccpcc --version 2>&1 |"); + my $lines = 2; while ( ) { - $config{makedepprog} = $ccpcc if /clang|gcc/; + # Find the version number and save the major. + m|(?:.*)\b(\d+)\.\d+\.\d+\b(?:.*)|; + my $compiler_major = $1; + # We know that GNU C version 3 and up as well as all clang + # versions support dependency generation + $config{makedepprog} = $ccpcc + if (/clang/ || (/gcc/ && $compiler_major > 3)); $ecc = "clang" if /clang/; $ecc = "gcc" if /gcc/; + last if ($config{makedepprog} || !$lines--); } close(PIPE); + + $config{makedepprog} = which('makedepend') unless $config{makedepprog}; + $disabled{makedepend} = "unavailable" unless $config{makedepprog}; } + # Deal with bn_ops ################################################### $config{bn_ll} =0; @@ -1155,7 +1148,7 @@ die "Exactly one of SIXTY_FOUR_BIT|SIXTY_FOUR_BIT_LONG|THIRTY_TWO_BIT can be set # "Stringify" the C flags string. This permits it to be made part of a string # and works as well on command lines. -$config{cflags} =~ s/([\\\"])/\\\1/g; +$config{cflags} =~ s/([\\\"])/\\$1/g; if (defined($config{api})) { $config{openssl_api_defines} = [ "OPENSSL_MIN_API=".$apitable->{$config{api}} ]; @@ -1200,6 +1193,28 @@ else { $no_user_defines=1; } # ALL MODIFICATIONS TO %config and %target MUST BE DONE FROM HERE ON +unless ($disabled{engine}) { + $config{afalg}=""; + if ($target =~ m/^linux/) { + my $minver = 4*10000 + 1*100 + 0; + if ($config{cross_compile_prefix} eq "") { + my $verstr = `uname -r`; + my ($ma, $mi1, $mi2) = split("\\.", $verstr); + ($mi2) = $mi2 =~ /(\d+)/; + my $ver = $ma*10000 + $mi1*100 + $mi2; + if ($ver < $minver) { + $disabled{afalg} = "too-old-kernel"; + } else { + push @{$config{engdirs}}, "afalg"; + } + } + } else { + $disabled{afalg} = "not-linux"; + } +} + +push @{$config{openssl_other_defines}}, "OPENSSL_NO_AFALGENG" if ($disabled{afalg}); + # If we use the unified build, collect information from build.info files my %unified_info = (); @@ -1264,6 +1279,8 @@ if ($builder eq "unified") { if (-f catfile($srcdir, "engines", $_, "build.info")); } + $config{build_infos} = [ ]; + foreach (@build_infos) { my $sourced = catdir($srcdir, $_->[0]); my $buildd = catdir($blddir, $_->[0]); @@ -1277,6 +1294,7 @@ if ($builder eq "unified") { my @engines = (); my @scripts = (); my @extra = (); + my @overrides = (); my @intermediates = (); my @rawlines = (); @@ -1286,7 +1304,9 @@ if ($builder eq "unified") { my %depends = (); my %renames = (); my %sharednames = (); + my %generate = (); + push @{$config{build_infos}}, catfile(abs2rel($sourced, $blddir), $f); my $template = Text::Template->new(TYPE => 'FILE', SOURCE => catfile($sourced, $f)); die "Something went wrong with $sourced/$f: $!\n" unless $template; @@ -1314,7 +1334,13 @@ if ($builder eq "unified") { $l1 =~ s/\\$//; $l1.$l2 }), # Info we're looking for qr/^\s*IF\[((?:\\.|[^\\\]])*)\]\s*$/ - => sub { push @skip, !! $1; }, + => sub { + if (! @skip || $skip[$#skip] > 0) { + push @skip, !! $1; + } else { + push @skip, -1; + } + }, qr/^\s*ELSIF\[((?:\\.|[^\\\]])*)\]\s*$/ => sub { die "ELSIF out of scope" if ! @skip; die "ELSIF following ELSE" if abs($skip[$#skip]) == 2; @@ -1343,6 +1369,9 @@ if ($builder eq "unified") { qr/^\s*EXTRA\s*=\s*(.*)\s*$/ => sub { push @extra, split(/\s+/, $1) if !@skip || $skip[$#skip] > 0 }, + qr/^\s*OVERRIDES\s*=\s*(.*)\s*$/ + => sub { push @overrides, split(/\s+/, $1) + if !@skip || $skip[$#skip] > 0 }, qr/^\s*ORDINALS\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/, => sub { push @{$ordinals{$1}}, split(/\s+/, $2) @@ -1356,6 +1385,9 @@ if ($builder eq "unified") { qr/^\s*DEPEND\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/ => sub { push @{$depends{$1}}, split(/\s+/, $2) if !@skip || $skip[$#skip] > 0 }, + qr/^\s*GENERATE\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/ + => sub { push @{$generate{$1}}, $2 + if !@skip || $skip[$#skip] > 0 }, qr/^\s*RENAME\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/ => sub { push @{$renames{$1}}, split(/\s+/, $2) if !@skip || $skip[$#skip] > 0 }, @@ -1438,6 +1470,11 @@ EOF $unified_info{extra}->{$extra} = 1; } + foreach (@overrides) { + my $override = cleanfile($buildd, $_, $blddir); + $unified_info{overrides}->{$override} = 1; + } + push @{$unified_info{rawlines}}, @rawlines; unless ($disabled{shared}) { @@ -1479,9 +1516,9 @@ EOF my %known_ordinals = ( crypto => - cleanfile($sourced, catfile("util", "libeay.num"), $blddir), + cleanfile($sourced, catfile("util", "libcrypto.num"), $blddir), ssl => - cleanfile($sourced, catfile("util", "ssleay.num"), $blddir) + cleanfile($sourced, catfile("util", "libssl.num"), $blddir) ); my $o = $known_ordinals{$_}; die "Ordinals for $ddest defined more than once\n" @@ -1516,6 +1553,20 @@ EOF } } + foreach (keys %generate) { + my $dest = $_; + my $ddest = cleanfile($buildd, $_, $blddir); + if ($unified_info{rename}->{$ddest}) { + $ddest = $unified_info{rename}->{$ddest}; + } + die "more than one generator for $dest: " + ,join(" ", @{$generate{$_}}),"\n" + if scalar @{$generate{$_}} > 1; + my @generator = split /\s+/, $generate{$dest}->[0]; + $generator[0] = cleanfile($sourced, $generator[0], $blddir), + $unified_info{generate}->{$ddest} = [ @generator ]; + } + foreach (keys %depends) { my $dest = $_; my $ddest = cleanfile($buildd, $_, $blddir); @@ -1567,7 +1618,7 @@ EOF ### Make unified_info a bit more efficient # One level structures - foreach (("programs", "libraries", "engines", "scripts", "extra")) { + foreach (("programs", "libraries", "engines", "scripts", "extra", "overrides")) { $unified_info{$_} = [ sort keys %{$unified_info{$_}} ]; } # Two level structures @@ -1599,7 +1650,7 @@ use warnings; use Exporter; #use vars qw(\@ISA \@EXPORT); our \@ISA = qw(Exporter); -our \@EXPORT = qw(\%config \%target %withargs %unified_info); +our \@EXPORT = qw(\%config \%target %disabled %withargs %unified_info); EOF print OUT "our %config = (\n"; @@ -1707,12 +1758,15 @@ close(OUT); print "IsMK1MF =", ($builder eq "mk1mf" ? "yes" : "no"), "\n"; print "CC =$target{cc}\n"; -print "CFLAG =$config{cflags}\n"; -print "DEFINES =",join(" ", @{$config{defines}}),"\n"; -print "LFLAG =$config{lflags}\n"; -print "PLIB_LFLAG =$config{plib_lflags}\n"; -print "EX_LIBS =$config{ex_libs}\n"; +print "CFLAG =$target{cflags} $config{cflags}\n"; +print "SHARED_CFLAG =$target{shared_cflag}\n"; +print "DEFINES =",join(" ", @{$target{defines}}, @{$config{defines}}),"\n"; +print "LFLAG =$target{lflags}\n"; +print "PLIB_LFLAG =$target{plib_lflags}\n"; +print "EX_LIBS =$target{ex_libs} $config{ex_libs}\n"; +print "APPS_OBJ =$target{apps_obj}\n"; print "CPUID_OBJ =$target{cpuid_obj}\n"; +print "UPLINK_OBJ =$target{uplink_obj}\n"; print "BN_ASM =$target{bn_obj}\n"; print "EC_ASM =$target{ec_obj}\n"; print "DES_ENC =$target{des_obj}\n"; @@ -1729,6 +1783,7 @@ print "MODES_OBJ =$target{modes_obj}\n"; print "PADLOCK_OBJ =$target{padlock_obj}\n"; print "CHACHA_ENC =$target{chacha_obj}\n"; print "POLY1305_OBJ =$target{poly1305_obj}\n"; +print "BLAKE2_OBJ =$target{blake2_obj}\n"; print "PROCESSOR =$config{processor}\n"; print "RANLIB =$target{ranlib}\n"; print "ARFLAGS =$target{arflags}\n"; @@ -1738,7 +1793,7 @@ print "SIXTY_FOUR_BIT_LONG mode\n" if $config{b64l}; print "SIXTY_FOUR_BIT mode\n" if $config{b64}; print "THIRTY_TWO_BIT mode\n" if $config{b32}; print "BN_LLONG mode\n" if $config{bn_ll}; -print "RC4 uses $config{rc4_int}\n" if $config{rc4_int} != $def_int; +print "RC4 uses $config{rc4_int}\n" if $config{rc4_int} ne $def_int; for (@generated_headers) { mkpath(catdir($blddir, dirname($_))); @@ -1835,11 +1890,11 @@ BEGIN VALUE "FileDescription", "OpenSSL Shared Library\\0" VALUE "FileVersion", "$config{version}\\0" #if defined(CRYPTO) - VALUE "InternalName", "libeay32\\0" - VALUE "OriginalFilename", "libeay32.dll\\0" + VALUE "InternalName", "libcrypto32\\0" + VALUE "OriginalFilename", "libcrypto32.dll\\0" #elif defined(SSL) - VALUE "InternalName", "ssleay32\\0" - VALUE "OriginalFilename", "ssleay32.dll\\0" + VALUE "InternalName", "libssl32\\0" + VALUE "OriginalFilename", "libssl32.dll\\0" #endif VALUE "ProductName", "The OpenSSL Toolkit\\0" VALUE "ProductVersion", "$config{version}\\0" @@ -1869,7 +1924,7 @@ print <<"EOF"; Configured for $target. EOF -print <<"EOF" if (!$disabled{threads} && !$threads); +print <<"EOF" if ($disabled{threads} eq "unavailable"); The library could not be configured for supporting multi-threaded applications as the compiler options required on this system are not known. @@ -1885,39 +1940,6 @@ or position independent code, please let us know (but please first make sure you have tried with a current version of OpenSSL). EOF -###### TO BE REMOVED BEFORE FINAL RELEASE -###### -###### If the user hasn't chosen --unified, try to nudge them. -if ($target{build_file} eq "Makefile" - && $target{build_scheme}->[0] eq "unixmake" - && !$unified) { - - my $plausible_builddir = - abs2rel(rel2abs("../_openssl-build_$target"),rel2abs(".")); - my $plausible_to_sourcedir = - abs2rel(rel2abs("."),rel2abs("../_openssl-build_$target")); - print <<"EOF"; - ----------------------------------------------------------------------- -Please consider configuring with the flag --unified . -It's to test out a new "unified" building system. - -One cool feature is that you can have your build directory elsewhere, -for example: - - make clean # Clean the current configuration away - mkdir $plausible_builddir - cd $plausible_builddir - $plausible_to_sourcedir/config --unified - make - make test - -Please report any problem you have. ----------------------------------------------------------------------- - -EOF -} - exit(0); ###################################################################### @@ -1939,6 +1961,7 @@ sub asm { } } +our $add_called = 0; # Helper function to implement adding values to already existing configuration # values. It handles elements that are ARRAYs, CODEs and scalars sub _add { @@ -1951,27 +1974,45 @@ sub _add { my @values = map { - if (ref($_) eq "ARRAY") { - $found_array = 1; - @$_; + my $res = $_; + while (ref($res) eq "CODE") { + $res = $res->(); + } + if (defined($res)) { + if (ref($res) eq "ARRAY") { + $found_array = 1; + @$res; + } else { + $res; + } } else { - $_; + (); } } (@_); + $add_called = 1; + if ($found_array) { [ @values ]; } else { - join($separator, @values); + join($separator, grep { defined($_) && $_ ne "" } @values); } } sub add_before { - my $separator = shift; + my $separator = " "; + if (ref($_[$#_]) eq "HASH") { + my $opts = pop; + $separator = $opts->{separator}; + } my @x = @_; sub { _add($separator, @x, @_) }; } sub add { - my $separator = shift; + my $separator = " "; + if (ref($_[$#_]) eq "HASH") { + my $opts = pop; + $separator = $opts->{separator}; + } my @x = @_; sub { _add($separator, @_, @x) }; } @@ -2019,6 +2060,8 @@ sub resolve_config { my $target = shift; my @breadcrumbs = @_; +# my $extra_checks = defined($ENV{CONFIGURE_EXTRA_CHECKS}); + if (grep { $_ eq $target } @breadcrumbs) { die "inherit_from loop! target backtrace:\n " ,$target,"\n ",join("\n ", @breadcrumbs),"\n"; @@ -2069,12 +2112,40 @@ sub resolve_config { # value. # - Otherwise, this target's value is assumed to be a string that # will simply override the inherited list of values. - my $default_combiner = add(" "); + my $default_combiner = add(); my %all_keys = map { $_ => 1 } (keys %combined_inheritance, keys %{$table{$target}}); + + sub process_values { + my $object = shift; + my $inherited = shift; # Always a [ list ] + my $target = shift; + my $entry = shift; + + $add_called = 0; + + while(ref($object) eq "CODE") { + $object = $object->(@$inherited); + } + if (!defined($object)) { + return (); + } + elsif (ref($object) eq "ARRAY") { + local $add_called; # To make sure recursive calls don't affect it + return [ map { process_values($_, $inherited, $target, $entry) } + @$object ]; + } elsif (ref($object) eq "") { + return $object; + } else { + die "cannot handle reference type ",ref($object) + ," found in target ",$target," -> ",$entry,"\n"; + } + } + foreach (sort keys %all_keys) { + my $previous = $combined_inheritance{$_}; # Current target doesn't have a value for the current key? # Assign it the default combiner, the rest of this loop body @@ -2083,20 +2154,16 @@ sub resolve_config { $table{$target}->{$_} = $default_combiner; } - my $valuetype = ref($table{$target}->{$_}); - if ($valuetype eq "CODE") { - # CODE reference, execute it with the inherited values as - # arguments. - $table{$target}->{$_} = - $table{$target}->{$_}->(@{$combined_inheritance{$_}}); - } elsif ($valuetype eq "ARRAY" || $valuetype eq "") { - # ARRAY or Scalar, just leave it as is. - } else { - # Some other type of reference that we don't handle. - # Better to abort at this point. - die "cannot handle reference type $valuetype," - ," found in target $target -> $_\n"; - } + $table{$target}->{$_} = process_values($table{$target}->{$_}, + $combined_inheritance{$_}, + $target, $_); + unless(defined($table{$target}->{$_})) { + delete $table{$target}->{$_}; + } +# if ($extra_checks && +# $previous && !($add_called || $previous ~~ $table{$target}->{$_})) { +# warn "$_ got replaced in $target\n"; +# } } # Finally done, return the result. @@ -2138,7 +2205,7 @@ sub usage exit(1); } -sub run_dofile() +sub run_dofile { my $out = shift; my @templates = @_; @@ -2171,22 +2238,11 @@ sub print_table_entry "cc", "cflags", "defines", - "debug_cflags", - "debug_defines", - "release_cflags", - "release_defines", - "thread_cflag", "unistd", "ld", "lflags", "plib_lflags", "ex_libs", - "debug_lflags", - "debug_plib_lflags", - "debug_ex_libs", - "release_lflags", - "release_plib_lflags", - "release_ex_libs", "bn_ops", "cpuid_obj", "bn_obj", @@ -2204,6 +2260,7 @@ sub print_table_entry "cmll_obj", "modes_obj", "padlock_obj", + "thread_scheme", "perlasm_scheme", "dso_scheme", "shared_target", @@ -2226,14 +2283,24 @@ sub print_table_entry if ($type eq "TABLE") { print "\n"; print "*** $target\n"; - printf "\$%-12s = %s\n", $_, $target{$_} foreach (@sequence); + foreach (@sequence) { + if (ref($target{$_}) eq "ARRAY") { + printf "\$%-12s = %s\n", $_, join(" ", @{$target{$_}}); + } else { + printf "\$%-12s = %s\n", $_, $target{$_}; + } + } } elsif ($type eq "HASH") { my $largest = length((sort { length($a) <=> length($b) } @sequence)[-1]); print " '$target' => {\n"; foreach (@sequence) { if ($target{$_}) { - print " '",$_,"'"," " x ($largest - length($_))," => '",$target{$_},"',\n"; + if (ref($target{$_}) eq "ARRAY") { + print " '",$_,"'"," " x ($largest - length($_))," => [ ",join(", ", map { "'$_'" } @{$target{$_}})," ],\n"; + } else { + print " '",$_,"'"," " x ($largest - length($_))," => '",$target{$_},"',\n"; + } } } print " },\n"; @@ -2288,10 +2355,12 @@ sub which my $path; foreach $path (split /:/, $ENV{PATH}) { - if (-f "$path/$name$target{exe_extension}" and -x _) + my $fullpath = "$path/$name$target{exe_extension}"; + if (-f $fullpath and -x $fullpath) { - return "$path/$name$target{exe_extension}" unless ($name eq "perl" and - system("$path/$name$target{exe_extension} -e " . '\'exit($]<5.0);\'')); + return $fullpath + unless ($name eq "perl" and + system("$fullpath -e " . '\'exit($]<5.0);\'')); } } }