X-Git-Url: https://git.openssl.org/gitweb/?p=openssl.git;a=blobdiff_plain;f=Configure;h=dfad3fe7a5aac3361c1629c4a7d5a2deba409778;hp=2996cd1b4a9b92417cfc16b11a13aa30752e695b;hb=HEAD;hpb=d0364dcc42b151cfc08d860efb15cd48d87302c6 diff --git a/Configure b/Configure index 2996cd1b4a..75f3f720f9 100755 --- a/Configure +++ b/Configure @@ -1,6 +1,6 @@ #! /usr/bin/env perl # -*- mode: perl; -*- -# Copyright 2016-2021 The OpenSSL Project Authors. All Rights Reserved. +# Copyright 2016-2024 The OpenSSL Project Authors. All Rights Reserved. # # Licensed under the Apache License 2.0 (the "License"). You may not use # this file except in compliance with the License. You can obtain a copy @@ -27,7 +27,7 @@ use OpenSSL::config; my $orig_death_handler = $SIG{__DIE__}; $SIG{__DIE__} = \&death_handler; -my $usage="Usage: Configure [no- ...] [enable- ...] [-Dxxx] [-lxxx] [-Lxxx] [-fxxx] [-Kxxx] [no-hw-xxx|no-hw] [[no-]threads] [[no-]shared] [[no-]zlib|zlib-dynamic] [no-asm] [no-egd] [sctp] [386] [--prefix=DIR] [--openssldir=OPENSSLDIR] [--with-xxx[=vvv]] [--config=FILE] os/compiler[:flags]\n"; +my $usage="Usage: Configure [no- ...] [enable- ...] [-Dxxx] [-lxxx] [-Lxxx] [-fxxx] [-Kxxx] [no-hw-xxx|no-hw] [[no-]threads] [[no-]thread-pool] [[no-]default-thread-pool] [[no-]shared] [[no-]zlib|zlib-dynamic] [no-asm] [no-egd] [sctp] [386] [--prefix=DIR] [--openssldir=OPENSSLDIR] [--with-xxx[=vvv]] [--config=FILE] os/compiler[:flags]\n"; my $banner = <<"EOF"; @@ -63,6 +63,8 @@ EOF # (Default: PREFIX/ssl) # --banner=".." Output specified text instead of default completion banner # +# -w Don't wait after showing a Configure warning +# # --cross-compile-prefix Add specified prefix to binutils components. # # --api One of 0.9.8, 1.0.0, 1.0.1, 1.0.2, 1.1.0, 1.1.1, or 3.0 @@ -75,10 +77,18 @@ EOF # Generic OpenSSL-style methods relating to this support # are always compiled but return NULL if the hardware # support isn't compiled. +# +# enable-demos Enable the building of the example code in the demos directory +# enable-h3demo Enable the http3 demo, which currently only links to the +# external nghttp3 library on unix platforms # no-hw do not compile support for any crypto hardware. # [no-]threads [don't] try to create a library that is suitable for # multithreaded applications (default is "threads" if we # know how to do it) +# [no-]thread-pool +# [don't] allow thread pool functionality +# [no-]default-thread-pool +# [don't] allow default thread pool functionality # [no-]shared [don't] try to create shared libraries when supported. # [no-]pic [don't] try to build position independent code when supported. # If disabled, it also disables shared and dynamic-engine. @@ -86,8 +96,9 @@ EOF # no-egd do not compile support for the entropy-gathering daemon APIs # [no-]zlib [don't] compile support for zlib compression. # zlib-dynamic Like "zlib", but the zlib library is expected to be a shared -# library and will be loaded in run-time by the OpenSSL library. +# library and will be loaded at run-time by the OpenSSL library. # sctp include SCTP support +# no-quic disable QUIC support # no-uplink Don't build support for UPLINK interface. # enable-weak-ssl-ciphers # Enable weak ciphers that are disabled by default. @@ -136,7 +147,6 @@ EOF # get past these. Note that we only use these with C compilers, not with # C++ compilers. -# DEBUG_UNUSED enables __owur (warn unused result) checks. # -DPEDANTIC complements -pedantic and is meant to mask code that # is not strictly standard-compliant and/or implementation-specific, # e.g. inline assembly, disregards to alignment requirements, such @@ -150,9 +160,9 @@ EOF # but 'long long' type. my @gcc_devteam_warn = qw( - -DDEBUG_UNUSED - -DPEDANTIC -pedantic -Wno-long-long + -DPEDANTIC -pedantic -Wno-long-long -DUNUSEDRESULT_DEBUG -Wall + -Wmissing-declarations -Wextra -Wno-unused-parameter -Wno-missing-field-initializers @@ -160,7 +170,8 @@ my @gcc_devteam_warn = qw( -Wsign-compare -Wshadow -Wformat - -Wtype-limits + -Wno-type-limits + -Wno-tautological-constant-out-of-range-compare -Wundef -Werror -Wmissing-prototypes @@ -181,6 +192,7 @@ my @clang_devteam_warn = qw( -Wno-parentheses-equality -Wno-language-extension-token -Wno-extended-offsetof + -Wno-missing-braces -Wconditional-uninitialized -Wincompatible-pointer-types-discards-qualifiers -Wmissing-variable-declarations @@ -377,6 +389,12 @@ if (defined env($local_config_envname)) { } } +# Fail if no configuration is apparent +if (!%table) { + print "Failed to find any os/compiler configurations. Please make sure the Configurations directory is included.\n"; + &usage; +} + # Save away perl command information $config{perl_cmd} = $^X; $config{perl_version} = $Config{version}; @@ -400,20 +418,26 @@ my @dtls = qw(dtls1 dtls1_2); my @disablables = ( "acvp-tests", "afalgeng", + "apps", + "argon2", "aria", "asan", "asm", "async", + "atexit", "autoalginit", "autoerrinit", "autoload-config", "bf", "blake2", + "brotli", + "brotli-dynamic", "buildtest-c++", "bulk", "cached-fetch", "camellia", "capieng", + "winstore", "cast", "chacha", "cmac", @@ -422,11 +446,15 @@ my @disablables = ( "comp", "crypto-mdebug", "ct", + "default-thread-pool", + "demos", + "h3demo", "deprecated", "des", "devcryptoeng", "dgram", "dh", + "docs", "dsa", "dso", "dtls", @@ -436,6 +464,7 @@ my @disablables = ( "ec_nistp_64_gcc_128", "ecdh", "ecdsa", + "ecx", "egd", "engine", "err", @@ -446,9 +475,11 @@ my @disablables = ( "fuzz-afl", "fuzz-libfuzzer", "gost", + "http", "idea", "ktls", "legacy", + "loadereng", "makedepend", "md2", "md4", @@ -461,10 +492,13 @@ my @disablables = ( "ocsp", "padlockeng", "pic", + "pie", "pinshared", "poly1305", "posix-io", "psk", + "quic", + "unstable-qlog", "rc2", "rc4", "rc5", @@ -479,6 +513,7 @@ my @disablables = ( "siphash", "siv", "sm2", + "sm2-precomp", "sm3", "sm4", "sock", @@ -490,8 +525,11 @@ my @disablables = ( "static-engine", "stdio", "tests", + "tfo", + "thread-pool", "threads", "tls", + "integrity-only-ciphers", "trace", "ts", "ubsan", @@ -502,6 +540,8 @@ my @disablables = ( "whirlpool", "zlib", "zlib-dynamic", + "zstd", + "zstd-dynamic", ); foreach my $proto ((@tls, @dtls)) { @@ -532,38 +572,44 @@ my %deprecated_disablables = ( our %disabled = ( # "what" => "comment" "fips" => "default", - "acvp-tests" => "default", "asan" => "default", + "brotli" => "default", + "brotli-dynamic" => "default", "buildtest-c++" => "default", "crypto-mdebug" => "default", "crypto-mdebug-backtrace" => "default", + "demos" => "default", + "h3demo" => "default", "devcryptoeng" => "default", "ec_nistp_64_gcc_128" => "default", "egd" => "default", "external-tests" => "default", "fuzz-afl" => "default", "fuzz-libfuzzer" => "default", + "pie" => "default", "ktls" => "default", "md2" => "default", "msan" => "default", "rc5" => "default", "sctp" => "default", - "ssl-trace" => "default", "ssl3" => "default", "ssl3-method" => "default", + "tfo" => "default", "trace" => "default", "ubsan" => "default", "unit-test" => "default", "weak-ssl-ciphers" => "default", "zlib" => "default", "zlib-dynamic" => "default", + "zstd" => "default", + "zstd-dynamic" => "default", ); # Note: => pair form used for aesthetics, not to truly make a hash table my @disable_cascades = ( # "what" => [ "cascade", ... ] "bulk" => [ "shared", "dso", - "aria", "async", "autoload-config", + "aria", "async", "atexit", "autoload-config", "blake2", "bf", "camellia", "cast", "chacha", "cmac", "cms", "cmp", "comp", "ct", "des", "dgram", "dh", "dsa", @@ -575,7 +621,8 @@ my @disable_cascades = ( "rc2", "rc4", "rmd160", "seed", "siphash", "siv", "sm3", "sm4", "srp", - "srtp", "ssl3-method", + "srtp", "ssl3-method", "ssl-trace", + "tfo", "ts", "ui-console", "whirlpool", "fips-securitychecks" ], sub { $config{processor} eq "386" } @@ -583,10 +630,12 @@ my @disable_cascades = ( "ssl" => [ "ssl3" ], "ssl3-method" => [ "ssl3" ], "zlib" => [ "zlib-dynamic" ], + "brotli" => [ "brotli-dynamic" ], + "zstd" => [ "zstd-dynamic" ], "des" => [ "mdc2" ], - "ec" => [ "ec2m", "ecdsa", "ecdh", "sm2", "gost" ], - "dgram" => [ "dtls", "sctp" ], - "sock" => [ "dgram" ], + "ec" => [ "ec2m", "ecdsa", "ecdh", "sm2", "gost", "ecx" ], + "dgram" => [ "dtls", "quic", "sctp" ], + "sock" => [ "dgram", "tfo" ], "dtls" => [ @dtls ], sub { 0 == scalar grep { !$disabled{$_} } @dtls } => [ "dtls" ], @@ -594,16 +643,17 @@ my @disable_cascades = ( "tls" => [ @tls ], sub { 0 == scalar grep { !$disabled{$_} } @tls } => [ "tls" ], + "tls1_3" => [ "quic" ], + "quic" => [ "unstable-qlog" ], "crypto-mdebug" => [ "crypto-mdebug-backtrace" ], - # If no modules, then no dynamic engines either - "module" => [ "dynamic-engine" ], + "module" => [ "dynamic-engine", "fips" ], # Without shared libraries, dynamic engines aren't possible. # This is due to them having to link with libcrypto and register features # using the ENGINE functionality, and since that relies on global tables, - # those *have* to be exacty the same as the ones accessed from the app, + # those *have* to be exactly the same as the ones accessed from the app, # which cannot be guaranteed if shared libraries aren't present. # (note that even with shared libraries, both the app and dynamic engines # must be linked with the same library) @@ -616,9 +666,8 @@ my @disable_cascades = ( # or modules. "pic" => [ "shared", "module" ], - "module" => [ "fips", "dso" ], - "engine" => [ "dynamic-engine", grep(/eng$/, @disablables) ], + "dynamic-engine" => [ "loadereng" ], "hw" => [ "padlockeng" ], # no-autoalginit is only useful when building non-shared @@ -627,7 +676,7 @@ my @disable_cascades = ( "stdio" => [ "apps", "capieng", "egd" ], "apps" => [ "tests" ], "tests" => [ "external-tests" ], - "comp" => [ "zlib" ], + "comp" => [ "zlib", "brotli", "zstd" ], "sm3" => [ "sm2" ], sub { !$disabled{"unit-test"} } => [ "heartbeats" ], @@ -638,9 +687,16 @@ my @disable_cascades = ( "cmp" => [ "crmf" ], - "fips" => [ "fips-securitychecks" ], + "fips" => [ "fips-securitychecks", "acvp-tests" ], - "deprecated-3.0" => [ "engine", "srp" ] + "threads" => [ "thread-pool" ], + "thread-pool" => [ "default-thread-pool" ], + + "blake2" => [ "argon2" ], + + "deprecated-3.0" => [ "engine", "srp" ], + + "http" => [ "ocsp" ] ); # Avoid protocol support holes. Also disable all versions below N, if version @@ -709,6 +765,7 @@ my @user_crossable = qw ( AR AS CC CXX CPP LD MT RANLIB RC ); # input, as opposed to the VAR=string option that override the corresponding # config target attributes my %useradd = ( + ASFLAGS => [], CPPDEFINES => [], CPPINCLUDES => [], CPPFLAGS => [], @@ -799,6 +856,7 @@ while (@argvcopy) s /^threads$/enable-threads/; s /^zlib$/enable-zlib/; s /^zlib-dynamic$/enable-zlib-dynamic/; + s /^fips$/enable-fips/; if (/^(no|disable|enable)-(.+)$/) { @@ -884,6 +942,18 @@ while (@argvcopy) { delete $disabled{"zlib"}; } + elsif ($1 eq "brotli-dynamic") + { + delete $disabled{"brotli"}; + } + elsif ($1 eq "pie") + { + delete $disabled{"pie"}; + } + elsif ($1 eq "zstd-dynamic") + { + delete $disabled{"zstd"}; + } my $algo = $1; delete $disabled{$algo}; @@ -898,7 +968,7 @@ while (@argvcopy) { $guess_opts{verbose} = 1; } - elsif (/^-w$/) # From older 'config' + elsif (/^-w$/) { $guess_opts{nowait} = 1; } @@ -923,27 +993,17 @@ while (@argvcopy) } elsif (/^386$/) { $config{processor}=386; } - elsif (/^fips$/) - { - die "FIPS mode not supported\n"; - } elsif (/^rsaref$/) { # No RSAref support any more since it's not needed. # The check for the option is there so scripts aren't # broken } - elsif (/^nofipscanistercheck$/) - { - die "FIPS mode not supported\n"; - } elsif (m|^[-+/]|) { if (/^--prefix=(.*)$/) { $config{prefix}=$1; - die "Directory given with --prefix MUST be absolute\n" - unless file_name_is_absolute($config{prefix}); } elsif (/^--api=(.*)$/) { @@ -968,6 +1028,22 @@ while (@argvcopy) { $withargs{zlib_include}=$1; } + elsif (/^--with-brotli-lib=(.*)$/) + { + $withargs{brotli_lib}=$1; + } + elsif (/^--with-brotli-include=(.*)$/) + { + $withargs{brotli_include}=$1; + } + elsif (/^--with-zstd-lib=(.*)$/) + { + $withargs{zstd_lib}=$1; + } + elsif (/^--with-zstd-include=(.*)$/) + { + $withargs{zstd_include}=$1; + } elsif (/^--with-fuzzer-lib=(.*)$/) { $withargs{fuzzer_lib}=$1; @@ -1386,6 +1462,15 @@ foreach (keys %useradd) { # At this point, we can forget everything about %user and %useradd, # because it's now all been merged into the corresponding $config entry +if ($config{prefix} && !$config{CROSS_COMPILE}) { + die "Directory given with --prefix MUST be absolute\n" + unless file_name_is_absolute($config{prefix}); +} + +if (grep { $_ =~ /(?:^|\s)-static(?:\s|$)/ } @{$config{LDFLAGS}}) { + disable('static', 'pic', 'threads'); +} + # Allow overriding the build file name $config{build_file} = env('BUILDFILE') || $target{build_file} || "Makefile"; @@ -1396,7 +1481,7 @@ $target{build_scheme} = [ $target{build_scheme} ] my ($builder, $builder_platform, @builder_opts) = @{$target{build_scheme}}; -foreach my $checker (($builder_platform."-".$target{build_file}."-checker.pm", +foreach my $checker (($builder_platform."-".$config{build_file}."-checker.pm", $builder_platform."-checker.pm")) { my $checker_path = catfile($srcdir, "Configurations", $checker); if (-f $checker_path) { @@ -1425,7 +1510,7 @@ if ($target =~ /^mingw/ && `$config{CC} --target-help 2>&1` =~ m/-mno-cygwin/m) } if ($target =~ /linux.*-mips/ && !$disabled{asm} - && !grep { $_ !~ /-m(ips|arch=)/ } (@{$config{CFLAGS}})) { + && !grep { $_ =~ /-m(ips|arch=)/ } (@{$config{CFLAGS}})) { # minimally required architecture flags for assembly modules my $value; $value = '-mips2' if ($target =~ /mips32/); @@ -1485,6 +1570,10 @@ unless($disabled{threads}) { push @{$config{openssl_feature_defines}}, "OPENSSL_THREADS"; } +if ($disabled{"unstable-qlog"}) { + $disabled{"qlog"} = 1; +} + my $no_shared_warn=0; if (($target{shared_target} // '') eq "") { @@ -1504,9 +1593,7 @@ unless ($disabled{asan} || defined $detected_sanitizers{asan}) { } unless ($disabled{ubsan} || defined $detected_sanitizers{ubsan}) { - # -DPEDANTIC or -fnosanitize=alignment may also be required on some - # platforms. - push @{$config{cflags}}, "-fsanitize=undefined", "-fno-sanitize-recover=all"; + push @{$config{cflags}}, "-fsanitize=undefined", "-fno-sanitize-recover=all", "-DPEDANTIC"; } unless ($disabled{msan} || defined $detected_sanitizers{msan}) { @@ -1551,7 +1638,7 @@ my %predefined_CXX = $config{CXX} unless ($disabled{asm}) { # big endian systems can use ELFv2 ABI - if ($target eq "linux-ppc64") { + if ($target eq "linux-ppc64" || $target eq "BSD-ppc64") { $target{perlasm_scheme} = "linux64v2" if ($predefined_C{_CALL_ELF} == 2); } } @@ -1674,10 +1761,6 @@ if ($strict_warnings) } } -if (grep { $_ =~ /(?:^|\s)-static(?:\s|$)/ } @{$config{LDFLAGS}}) { - disable('static', 'pic', 'threads'); -} - $config{CFLAGS} = [ map { $_ eq '--ossl-strict-warnings' ? @strict_warnings_collection : ( $_ ) } @@ -1686,20 +1769,7 @@ $config{CFLAGS} = [ map { $_ eq '--ossl-strict-warnings' unless ($disabled{afalgeng}) { $config{afalgeng}=""; if (grep { $_ eq 'afalgeng' } @{$target{enable}}) { - my $minver = 4*10000 + 1*100 + 0; - if ($config{CROSS_COMPILE} eq "") { - my $verstr = `uname -r`; - my ($ma, $mi1, $mi2) = split("\\.", $verstr); - ($mi2) = $mi2 =~ /(\d+)/; - my $ver = $ma*10000 + $mi1*100 + $mi2; - if ($ver < $minver) { - disable('too-old-kernel', 'afalgeng'); - } else { - push @{$config{engdirs}}, "afalg"; - } - } else { - disable('cross-compiling', 'afalgeng'); - } + push @{$config{engdirs}}, "afalg"; } else { disable('not-linux', 'afalgeng'); } @@ -1722,20 +1792,13 @@ unless ($disabled{devcryptoeng}) { unless ($disabled{ktls}) { $config{ktls}=""; + my $cc = $config{CROSS_COMPILE}.$config{CC}; if ($target =~ m/^linux/) { - my $usr = "/usr/$config{cross_compile_prefix}"; - chop($usr); - if ($config{cross_compile_prefix} eq "") { - $usr = "/usr"; - } - my $minver = (4 << 16) + (13 << 8) + 0; - my @verstr = split(" ",`cat $usr/include/linux/version.h | grep LINUX_VERSION_CODE`); - - if ($verstr[2] < $minver) { + system("printf '#include \n#include ' | $cc -E - >/dev/null 2>&1"); + if ($? != 0) { disable('too-old-kernel', 'ktls'); } } elsif ($target =~ m/^BSD/) { - my $cc = $config{CROSS_COMPILE}.$config{CC}; system("printf '#include \n#include ' | $cc -E - >/dev/null 2>&1"); if ($? != 0) { disable('too-old-freebsd', 'ktls'); @@ -1745,6 +1808,12 @@ unless ($disabled{ktls}) { } } +unless ($disabled{winstore}) { + unless ($target =~ /^(?:Cygwin|mingw|VC-|BC-)/) { + disable('not-windows', 'winstore'); + } +} + push @{$config{openssl_other_defines}}, "OPENSSL_NO_KTLS" if ($disabled{ktls}); # Get the extra flags used when building shared libraries and modules. We @@ -1806,7 +1875,7 @@ my %skipdir = (); my %disabled_info = (); # For configdata.pm foreach my $what (sort keys %disabled) { # There are deprecated disablables that translate to themselves. - # They cause disabling cascades, but should otherwise not regiter. + # They cause disabling cascades, but should otherwise not register. next if $deprecated_disablables{$what}; # The generated $disabled{"deprecated-x.y"} entries are special # and treated properly elsewhere @@ -1816,7 +1885,7 @@ foreach my $what (sort keys %disabled) { if (!grep { $what eq $_ } ( 'buildtest-c++', 'fips', 'threads', 'shared', 'module', 'pic', 'dynamic-engine', 'makedepend', - 'zlib-dynamic', 'zlib', 'sse2', 'legacy' )) { + 'sse2', 'legacy' )) { (my $WHAT = uc $what) =~ s|-|_|g; my $skipdir = $what; @@ -1850,11 +1919,12 @@ if ($builder eq "unified") { my $base = shift; my $dir = shift; my $relativeto = shift || "."; + my $no_mkpath = shift // 0; $dir = catdir($base,$dir) unless isabsolute($dir); # Make sure the directories we're building in exists - mkpath($dir); + mkpath($dir) unless $no_mkpath; my $res = abs2rel(absolutedir($dir), rel2abs($relativeto)); #print STDERR "DEBUG[cleandir]: $dir , $base => $res\n"; @@ -1865,6 +1935,7 @@ if ($builder eq "unified") { my $base = shift; my $file = shift; my $relativeto = shift || "."; + my $no_mkpath = shift // 0; $file = catfile($base,$file) unless isabsolute($file); @@ -1872,7 +1943,7 @@ if ($builder eq "unified") { my $f = basename($file); # Make sure the directories we're building in exists - mkpath($d); + mkpath($d) unless $no_mkpath; my $res = abs2rel(catfile(absolutedir($d), $f), rel2abs($relativeto)); #print STDERR "DEBUG[cleanfile]: $d , $f => $res\n"; @@ -1882,8 +1953,8 @@ if ($builder eq "unified") { # Store the name of the template file we will build the build file from # in %config. This may be useful for the build file itself. my @build_file_template_names = - ( $builder_platform."-".$target{build_file}.".tmpl", - $target{build_file}.".tmpl" ); + ( $builder_platform."-".$config{build_file}.".tmpl", + $config{build_file}.".tmpl" ); my @build_file_templates = (); # First, look in the user provided directory, if given @@ -1902,7 +1973,7 @@ if ($builder eq "unified") { } # Then, look in our standard directory push @build_file_templates, - ( map { cleanfile($srcdir, catfile("Configurations", $_), $blddir) } + ( map { cleanfile($srcdir, catfile("Configurations", $_), $blddir, 1) } @build_file_template_names ); my $build_file_template; @@ -1917,10 +1988,8 @@ if ($builder eq "unified") { } $config{build_file_templates} = [ cleanfile($srcdir, catfile("Configurations", "common0.tmpl"), - $blddir), - $build_file_template, - cleanfile($srcdir, catfile("Configurations", "common.tmpl"), - $blddir) ]; + $blddir, 1), + $build_file_template ]; my @build_dirs = ( [ ] ); # current directory @@ -1928,7 +1997,7 @@ if ($builder eq "unified") { # 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); + my $src_configdata = cleanfile($srcdir, "configdata.pm", $blddir, 1); # Any source file that we recognise is placed in this hash table, with # the list of its intended destinations as value. When everything has @@ -1965,6 +2034,7 @@ if ($builder eq "unified") { my %defines = (); my %depends = (); my %generate = (); + my %imagedocs = (); my %htmldocs = (); my %mandocs = (); @@ -2117,7 +2187,7 @@ if ($builder eq "unified") { my $index_re = qr/\[\s*(?P(?:\\.|.)*?)\s*\]/; my $cond_re = qr/\[\s*(?P(?:\\.|.)*?)\s*\]/; my $attribs_re = qr/(?:\{\s*(?P(?:\\.|.)*?)\s*\})?/; - my $value_re = qr/\s*(?P.*?)\s*/; + my $value_re = qr/(?P.*?)/; collect_information( collect_from_array([ @text ], qr/\\$/ => sub { my $l1 = shift; my $l2 = shift; @@ -2144,13 +2214,13 @@ if ($builder eq "unified") { qr/^\s* ENDIF \s*$/x => sub { die "ENDIF out of scope" if ! @skip; pop @skip; }, - qr/^\s* ${variable_re} \s* = ${value_re} $/x + qr/^\s* ${variable_re} \s* = \s* ${value_re} \s* $/x => sub { if (!@skip || $skip[$#skip] > 0) { $variables{$+{VARIABLE}} = $expand_variables->($+{VALUE}); } }, - qr/^\s* SUBDIRS \s* = ${value_re} $/x + qr/^\s* SUBDIRS \s* = \s* ${value_re} \s* $/x => sub { if (!@skip || $skip[$#skip] > 0) { foreach (tokenize($expand_variables->($+{VALUE}))) { @@ -2158,64 +2228,70 @@ if ($builder eq "unified") { } } }, - qr/^\s* PROGRAMS ${attribs_re} \s* = ${value_re} $/x + qr/^\s* PROGRAMS ${attribs_re} \s* = \s* ${value_re} \s* $/x => sub { $push_to->(\@programs, undef, \$attributes{programs}, $+{ATTRIBS}, tokenize($expand_variables->($+{VALUE}))) if !@skip || $skip[$#skip] > 0; }, - qr/^\s* LIBS ${attribs_re} \s* = ${value_re} $/x + qr/^\s* LIBS ${attribs_re} \s* = \s* ${value_re} \s* $/x => sub { $push_to->(\@libraries, undef, \$attributes{libraries}, $+{ATTRIBS}, tokenize($expand_variables->($+{VALUE}))) if !@skip || $skip[$#skip] > 0; }, - qr/^\s* MODULES ${attribs_re} \s* = ${value_re} $/x + qr/^\s* MODULES ${attribs_re} \s* = \s* ${value_re} \s* $/x => sub { $push_to->(\@modules, undef, \$attributes{modules}, $+{ATTRIBS}, tokenize($expand_variables->($+{VALUE}))) if !@skip || $skip[$#skip] > 0; }, - qr/^\s* SCRIPTS ${attribs_re} \s* = ${value_re} $/x + qr/^\s* SCRIPTS ${attribs_re} \s* = \s* ${value_re} \s* $/x => sub { $push_to->(\@scripts, undef, \$attributes{scripts}, $+{ATTRIBS}, tokenize($expand_variables->($+{VALUE}))) if !@skip || $skip[$#skip] > 0; }, - qr/^\s* HTMLDOCS ${index_re} = ${value_re} $/x + qr/^\s* IMAGEDOCS ${index_re} \s* = \s* ${value_re} \s* $/x + => sub { $push_to->(\%imagedocs, $expand_variables->($+{INDEX}), + undef, undef, + tokenize($expand_variables->($+{VALUE}))) + if !@skip || $skip[$#skip] > 0; }, + qr/^\s* HTMLDOCS ${index_re} \s* = \s* ${value_re} \s* $/x => sub { $push_to->(\%htmldocs, $expand_variables->($+{INDEX}), undef, undef, tokenize($expand_variables->($+{VALUE}))) if !@skip || $skip[$#skip] > 0; }, - qr/^\s* MANDOCS ${index_re} = ${value_re} $/x + qr/^\s* MANDOCS ${index_re} \s* = \s* ${value_re} \s* $/x => sub { $push_to->(\%mandocs, $expand_variables->($+{INDEX}), undef, undef, tokenize($expand_variables->($+{VALUE}))) if !@skip || $skip[$#skip] > 0; }, - qr/^\s* SOURCE ${index_re} = ${value_re} $/x + qr/^\s* SOURCE ${index_re} ${attribs_re} \s* = \s* ${value_re} \s* $/x => sub { $push_to->(\%sources, $expand_variables->($+{INDEX}), - undef, undef, + \$attributes{sources}, $+{ATTRIBS}, tokenize($expand_variables->($+{VALUE}))) if !@skip || $skip[$#skip] > 0; }, - qr/^\s* SHARED_SOURCE ${index_re} = ${value_re} $/x + qr/^\s* SHARED_SOURCE ${index_re} ${attribs_re} \s* = \s* ${value_re} \s* $/x => sub { $push_to->(\%shared_sources, $expand_variables->($+{INDEX}), - undef, undef, + \$attributes{sources}, $+{ATTRIBS}, tokenize($expand_variables->($+{VALUE}))) if !@skip || $skip[$#skip] > 0; }, - qr/^\s* INCLUDE ${index_re} = ${value_re} $/x + qr/^\s* INCLUDE ${index_re} \s* = \s* ${value_re} \s* $/x => sub { $push_to->(\%includes, $expand_variables->($+{INDEX}), undef, undef, tokenize($expand_variables->($+{VALUE}))) if !@skip || $skip[$#skip] > 0; }, - qr/^\s* DEFINE ${index_re} = ${value_re} $/x + qr/^\s* DEFINE ${index_re} \s* = \s* ${value_re} \s* $/x => sub { $push_to->(\%defines, $expand_variables->($+{INDEX}), undef, undef, tokenize($expand_variables->($+{VALUE}))) if !@skip || $skip[$#skip] > 0; }, - qr/^\s* DEPEND ${index_re} ${attribs_re} = ${value_re} $/x + qr/^\s* DEPEND ${index_re} ${attribs_re} \s* = \s* ${value_re} \s* $/x => sub { $push_to->(\%depends, $expand_variables->($+{INDEX}), \$attributes{depends}, $+{ATTRIBS}, tokenize($expand_variables->($+{VALUE}))) if !@skip || $skip[$#skip] > 0; }, - qr/^\s* GENERATE ${index_re} = ${value_re} $/x + qr/^\s* GENERATE ${index_re} ${attribs_re} \s* = \s* ${value_re} \s* $/x => sub { $push_to->(\%generate, $expand_variables->($+{INDEX}), - undef, undef, $+{VALUE}) + \$attributes{generate}, $+{ATTRIBS}, + $expand_variables->($+{VALUE})) if !@skip || $skip[$#skip] > 0; }, qr/^\s* (?:\#.*)? $/x => sub { }, "OTHERWISE" => sub { die "Something wrong with this line:\n$_\nat $sourced/$f" }, @@ -2274,17 +2350,17 @@ EOF my $dest = $_; my $ddest = cleanfile($buildd, $_, $blddir); foreach (@{$sources{$dest}}) { - my $s = cleanfile($sourced, $_, $blddir); + my $s = cleanfile($sourced, $_, $blddir, 1); # 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 $o = $_; # We recognise C++, C and asm files if ($s =~ /\.(cc|cpp|c|s|S)$/) { push @{$check_exist{$s}}, $ddest; - my $o = $_; $o =~ s/\.[csS]$/.o/; # C and assembler $o =~ s/\.(cc|cpp)$/_cc.o/; # C++ $o = cleanfile($buildd, $o, $blddir); @@ -2293,7 +2369,6 @@ EOF } elsif ($s =~ /\.rc$/) { # We also recognise resource files push @{$check_exist{$s}}, $ddest; - my $o = $_; $o =~ s/\.rc$/.res/; # Resource configuration $o = cleanfile($buildd, $o, $blddir); $unified_info{sources}->{$ddest}->{$o} = -1; @@ -2302,6 +2377,17 @@ EOF push @{$check_exist{$s}}, $ddest; $unified_info{sources}->{$ddest}->{$s} = 1; } + # Fix up associated attributes + if ($o ne $_) { + $unified_info{attributes}->{sources}->{$ddest}->{$o} = + $unified_info{attributes}->{sources}->{$o}->{$s} = + $attributes{sources}->{$dest}->{$_} + if defined $attributes{sources}->{$dest}->{$_}; + } else { + $unified_info{attributes}->{sources}->{$ddest}->{$s} = + $attributes{sources}->{$dest}->{$_} + if defined $attributes{sources}->{$dest}->{$_}; + } } } @@ -2309,7 +2395,7 @@ EOF my $dest = $_; my $ddest = cleanfile($buildd, $_, $blddir); foreach (@{$shared_sources{$dest}}) { - my $s = cleanfile($sourced, $_, $blddir); + my $s = cleanfile($sourced, $_, $blddir, 1); # If it's generated or we simply don't find it in the source # tree, we assume it's in the build tree. @@ -2317,10 +2403,10 @@ EOF $s = cleanfile($buildd, $_, $blddir); } + my $o = $_; if ($s =~ /\.(cc|cpp|c|s|S)$/) { # We recognise C++, C and asm files push @{$check_exist{$s}}, $ddest; - my $o = $_; $o =~ s/\.[csS]$/.o/; # C and assembler $o =~ s/\.(cc|cpp)$/_cc.o/; # C++ $o = cleanfile($buildd, $o, $blddir); @@ -2329,7 +2415,6 @@ EOF } elsif ($s =~ /\.rc$/) { # We also recognise resource files push @{$check_exist{$s}}, $ddest; - my $o = $_; $o =~ s/\.rc$/.res/; # Resource configuration $o = cleanfile($buildd, $o, $blddir); $unified_info{shared_sources}->{$ddest}->{$o} = -1; @@ -2338,11 +2423,22 @@ EOF # We also recognise linker scripts (or corresponding) # We know they are generated files push @{$check_exist{$s}}, $ddest; - my $ld = cleanfile($buildd, $_, $blddir); - $unified_info{shared_sources}->{$ddest}->{$ld} = 1; + $o = cleanfile($buildd, $_, $blddir); + $unified_info{shared_sources}->{$ddest}->{$o} = 1; } else { die "unrecognised source file type for shared library: $s\n"; } + # Fix up associated attributes + if ($o ne $_) { + $unified_info{attributes}->{shared_sources}->{$ddest}->{$o} = + $unified_info{attributes}->{sources}->{$o}->{$s} = + $attributes{sources}->{$dest}->{$_} + if defined $attributes{sources}->{$dest}->{$_}; + } else { + $unified_info{attributes}->{shared_sources}->{$ddest}->{$o} = + $attributes{sources}->{$dest}->{$_} + if defined $attributes{sources}->{$dest}->{$_}; + } } } @@ -2354,7 +2450,7 @@ EOF if scalar @{$generate{$_}} > 1; my @generator = split /\s+/, $generate{$dest}->[0]; my $gen = $generator[0]; - $generator[0] = cleanfile($sourced, $gen, $blddir); + $generator[0] = cleanfile($sourced, $gen, $blddir, 1); # If the generator is itself generated, it's in the build tree if ($generate{$gen} || ! -f $generator[0]) { @@ -2363,6 +2459,10 @@ EOF $check_generate{$ddest}->{$generator[0]}++; $unified_info{generate}->{$ddest} = [ @generator ]; + # Fix up associated attributes + $unified_info{attributes}->{generate}->{$ddest} = + $attributes{generate}->{$dest}->{$gen} + if defined $attributes{generate}->{$dest}->{$gen}; } foreach (keys %depends) { @@ -2376,17 +2476,40 @@ EOF } elsif ($dest eq '') { $ddest = ''; } else { - $ddest = cleanfile($sourced, $_, $blddir); + $ddest = cleanfile($sourced, $dest, $blddir, 1); # If the destination doesn't exist in source, it can only be # a generated file in the build tree. if ($ddest eq $src_configdata || ! -f $ddest) { - $ddest = cleanfile($buildd, $_, $blddir); + $ddest = cleanfile($buildd, $dest, $blddir); } } - foreach (@{$depends{$dest}}) { - my $d = cleanfile($sourced, $_, $blddir); - my $d2 = cleanfile($buildd, $_, $blddir); + foreach my $f (@{$depends{$dest}}) { + # If the dependency destination is generated, dependencies + # may have an extra syntax to separate the intended inclusion + # directory from the module to be loaded: a | instead of a + # / as directory separator. + # Do note that this has to be handled in the build file + # template as well. + # $i = inclusion path in source directory + # $i2 = inclusion path in build directory + # $m = module path (within the inclusion path) + # $i = full module path in source directory + # $i2 = full module path in build directory + my $i; my $i2; my $m; my $d; my $d2; + if ($unified_info{generate}->{$ddest} + && $f =~ m/^(.*?)\|(.*)$/) { + $i = $1; + $m = $2; + # We must be very careful to modify $i last + $d = cleanfile($sourced, "$i/$m", $blddir, 1); + $d2 = cleanfile($buildd, "$i/$m", $blddir); + $i2 = cleandir($buildd, $i, $blddir); + $i = cleandir($sourced, $i, $blddir, 1); + } else { + $d = cleanfile($sourced, $f, $blddir, 1); + $d2 = cleanfile($buildd, $f, $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 @@ -2396,19 +2519,26 @@ EOF keys %{$unified_info{generate}}) || ! -f $d) { $d = $d2; + $i = $i2; + } + if ($i) { + # Put together the computed inclusion dir with the + # original module name. Do note that we conserve the + # Unixly path syntax for the module path. + $d = "$i|$m"; } $unified_info{depends}->{$ddest}->{$d} = 1; # Fix up associated attributes $unified_info{attributes}->{depends}->{$ddest}->{$d} = - $attributes{depends}->{$dest}->{$_} - if defined $attributes{depends}->{$dest}->{$_}; + $attributes{depends}->{$dest}->{$f} + if defined $attributes{depends}->{$dest}->{$f}; } } foreach (keys %includes) { my $dest = $_; - my $ddest = cleanfile($sourced, $_, $blddir); + my $ddest = cleanfile($sourced, $_, $blddir, 1); # If the destination doesn't exist in source, it can only be # a generated file in the build tree. @@ -2416,7 +2546,7 @@ EOF $ddest = cleanfile($buildd, $_, $blddir); } foreach (@{$includes{$dest}}) { - my $is = cleandir($sourced, $_, $blddir); + my $is = cleandir($sourced, $_, $blddir, 1); my $ib = cleandir($buildd, $_, $blddir); push @{$unified_info{includes}->{$ddest}->{source}}, $is unless grep { $_ eq $is } @{$unified_info{includes}->{$ddest}->{source}}; @@ -2429,7 +2559,7 @@ EOF my $ddest; if ($dest ne "") { - $ddest = cleanfile($sourced, $dest, $blddir); + $ddest = cleanfile($sourced, $dest, $blddir, 1); # If the destination doesn't exist in source, it can only # be a generated file in the build tree. @@ -2452,6 +2582,13 @@ EOF } } + foreach my $section (keys %imagedocs) { + foreach (@{$imagedocs{$section}}) { + my $imagedocs = cleanfile($buildd, $_, $blddir); + $unified_info{imagedocs}->{$section}->{$imagedocs} = 1; + } + } + foreach my $section (keys %htmldocs) { foreach (@{$htmldocs{$section}}) { my $htmldocs = cleanfile($buildd, $_, $blddir); @@ -2565,7 +2702,9 @@ EOF next if $dest eq ""; foreach my $d (keys %{$unified_info{depends}->{$dest}}) { next unless $d =~ /\.(h|pm)$/; - my $i = dirname($d); + # Take into account when a dependency uses the inclusion|module + # syntax + my $i = $d =~ m/\|/ ? $` : dirname($d); my $spot = $d eq "configdata.pm" || defined($unified_info{generate}->{$d}) ? 'build' : 'source'; @@ -2646,6 +2785,19 @@ EOF $unified_info{$dst}->{$prod}->{$newobj} = 1; foreach my $src (@{$prod_sources{$_}}) { $unified_info{sources}->{$newobj}->{$src} = 1; + # Adjust source attributes + my $attrs = $unified_info{attributes}->{sources}; + if (defined $attrs->{$prod} + && defined $attrs->{$prod}->{$_}) { + $attrs->{$prod}->{$newobj} = + $attrs->{$prod}->{$_}; + delete $attrs->{$prod}->{$_}; + } + foreach my $objsrc (keys %{$attrs->{$_} // {}}) { + $attrs->{$newobj}->{$objsrc} = + $attrs->{$_}->{$objsrc}; + delete $attrs->{$_}->{$objsrc}; + } } # Adjust dependencies foreach my $deps (keys %{$unified_info{depends}->{$_}}) { @@ -2680,7 +2832,7 @@ EOF } # Two level structures foreach my $l1 (("sources", "shared_sources", "ldadd", "depends", - "htmldocs", "mandocs")) { + "imagedocs", "htmldocs", "mandocs")) { foreach my $l2 (sort keys %{$unified_info{$l1}}) { my @items = sort @@ -2727,11 +2879,13 @@ EOF "dso" => [ @{$unified_info{modules}} ], "bin" => [ @{$unified_info{programs}} ], "script" => [ @{$unified_info{scripts}} ], - "docs" => [ (map { @{$unified_info{htmldocs}->{$_} // []} } + "docs" => [ (map { @{$unified_info{imagedocs}->{$_} // []} } + keys %{$unified_info{imagedocs} // {}}), + (map { @{$unified_info{htmldocs}->{$_} // []} } keys %{$unified_info{htmldocs} // {}}), (map { @{$unified_info{mandocs}->{$_} // []} } keys %{$unified_info{mandocs} // {}}) ] ); - foreach my $type (keys %loopinfo) { + foreach my $type (sort keys %loopinfo) { foreach my $product (@{$loopinfo{$type}}) { my %dirs = (); my $pd = dirname($product); @@ -2752,7 +2906,7 @@ EOF push @{$unified_info{dirinfo}->{$d}->{deps}}, $_ if $d ne $pd; } - foreach (keys %dirs) { + foreach (sort keys %dirs) { push @{$unified_info{dirinfo}->{$_}->{products}->{$type}}, $product; } @@ -2787,10 +2941,9 @@ my %template_vars = ( user_crossable => \@user_crossable, ); my $configdata_outname = 'configdata.pm'; -print "Creating $configdata_outname\n"; open CONFIGDATA, ">$configdata_outname.new" - or die "Trying to create $configdata_outname.new: $!"; -my $configdata_tmplname = cleanfile($srcdir, "configdata.pm.in", $blddir); + or die "Trying to create $configdata_outname.new: $!"; +my $configdata_tmplname = cleanfile($srcdir, "configdata.pm.in", $blddir, 1); my $configdata_tmpl = OpenSSL::Template->new(TYPE => 'FILE', SOURCE => $configdata_tmplname); $configdata_tmpl->fill_in( @@ -2803,12 +2956,14 @@ $configdata_tmpl->fill_in( ] } ) or die $Text::Template::ERROR; close CONFIGDATA; + rename "$configdata_outname.new", $configdata_outname; if ($builder_platform eq 'unix') { my $mode = (0755 & ~umask); chmod $mode, 'configdata.pm' or warn sprintf("WARNING: Couldn't change mode for 'configdata.pm' to 0%03o: %s\n",$mode,$!); } +print "Created $configdata_outname\n"; print "Running $configdata_outname\n"; my $perlcmd = (quotify("maybeshell", $config{PERL}))[0]; @@ -2848,7 +3003,7 @@ exit(0); # sub death_handler { die @_ if $^S; # To prevent the added message in eval blocks - my $build_file = $target{build_file} // "build file"; + my $build_file = $config{build_file} // "build file"; my @message = ( <<"_____", @_ ); Failure! $build_file wasn't produced. @@ -3129,25 +3284,25 @@ sub resolve_config { } } - foreach (sort keys %all_keys) { - my $previous = $combined_inheritance{$_}; + foreach my $key (sort keys %all_keys) { + my $previous = $combined_inheritance{$key}; # Current target doesn't have a value for the current key? # Assign it the default combiner, the rest of this loop body # will handle it just like any other coderef. - if (!exists $table{$target}->{$_}) { - $table{$target}->{$_} = $default_combiner; + if (!exists $table{$target}->{$key}) { + $table{$target}->{$key} = $default_combiner; } - $table{$target}->{$_} = process_values($table{$target}->{$_}, - $combined_inheritance{$_}, - $target, $_); - unless(defined($table{$target}->{$_})) { - delete $table{$target}->{$_}; + $table{$target}->{$key} = process_values($table{$target}->{$key}, + $combined_inheritance{$key}, + $target, $key); + unless(defined($table{$target}->{$key})) { + delete $table{$target}->{$key}; } # if ($extra_checks && -# $previous && !($add_called || $previous ~~ $table{$target}->{$_})) { -# warn "$_ got replaced in $target\n"; +# $previous && !($add_called || $previous ~~ $table{$target}->{$key})) { +# warn "$key got replaced in $target\n"; # } }