]> git.ipfire.org Git - thirdparty/openssl.git/blame - Configure
Configure: recognise -static even if given through variables
[thirdparty/openssl.git] / Configure
CommitLineData
de17db91 1#! /usr/bin/env perl
f4d8f037 2# -*- mode: perl; -*-
48e5119a 3# Copyright 2016-2018 The OpenSSL Project Authors. All Rights Reserved.
ac3d0e13 4#
402dd558 5# Licensed under the Apache License 2.0 (the "License"). You may not use
ac3d0e13
RS
6# this file except in compliance with the License. You can obtain a copy
7# in the file LICENSE in the source distribution or at
8# https://www.openssl.org/source/license.html
de17db91 9
a4ed5532 10## Configure -- OpenSSL source tree configuration script
1641cb60 11
d83112b7 12use 5.10.0;
1641cb60 13use strict;
141d7325 14use Config;
cb6afcd6
RL
15use FindBin;
16use lib "$FindBin::Bin/util/perl";
f09e7ca9 17use File::Basename;
7f73eafe 18use File::Spec::Functions qw/:DEFAULT abs2rel rel2abs splitdir/;
dca99383 19use File::Path qw/mkpath/;
8d2214c0 20use OpenSSL::Glob;
1641cb60 21
22a4f969 22# see INSTALL for instructions.
462ba4f6 23
8937a4ed
RL
24my $orig_death_handler = $SIG{__DIE__};
25$SIG{__DIE__} = \&death_handler;
26
31b6ed76 27my $usage="Usage: Configure [no-<cipher> ...] [enable-<cipher> ...] [-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";
462ba4f6 28
434c5dd3 29# Options:
e5f3045f 30#
f09e7ca9
RS
31# --config add the given configuration file, which will be read after
32# any "Configurations*" files that are found in the same
33# directory as this script.
d74dfafd
RL
34# --prefix prefix for the OpenSSL installation, which includes the
35# directories bin, lib, include, share/man, share/doc/openssl
36# This becomes the value of INSTALLTOP in Makefile
37# (Default: /usr/local)
38# --openssldir OpenSSL data area, such as openssl.cnf, certificates and keys.
39# If it's a relative directory, it will be added on the directory
40# given with --prefix.
41# This becomes the value of OPENSSLDIR in Makefile and in C.
42# (Default: PREFIX/ssl)
e5f3045f 43#
cbfb39d1
AP
44# --cross-compile-prefix Add specified prefix to binutils components.
45#
fcd2d5a6
RL
46# --api One of 0.9.8, 1.0.0, 1.0.1, 1.0.2, 1.1.0, 1.1.1, or 3.0.0 / 3.
47# Do not compile support for interfaces deprecated as of the
48# specified OpenSSL version.
98186eb4 49#
5270e702
RL
50# no-hw-xxx do not compile support for specific crypto hardware.
51# Generic OpenSSL-style methods relating to this support
52# are always compiled but return NULL if the hardware
53# support isn't compiled.
54# no-hw do not compile support for any crypto hardware.
5f8d5c96
BM
55# [no-]threads [don't] try to create a library that is suitable for
56# multithreaded applications (default is "threads" if we
57# know how to do it)
84f32c84 58# [no-]shared [don't] try to create shared libraries when supported.
ae48242c 59# [no-]pic [don't] try to build position independent code when supported.
45b71abe 60# If disabled, it also disables shared and dynamic-engine.
a723979d 61# no-asm do not use assembler
0423f812 62# no-egd do not compile support for the entropy-gathering daemon APIs
e452de9d 63# [no-]zlib [don't] compile support for zlib compression.
84f32c84
DMSP
64# zlib-dynamic Like "zlib", but the zlib library is expected to be a shared
65# library and will be loaded in run-time by the OpenSSL library.
7e159e01 66# sctp include SCTP support
8b1a5af3 67# enable-weak-ssl-ciphers
edcdf38b 68# Enable weak ciphers that are disabled by default.
5ae5dc96
AP
69# 386 generate 80386 code in assembly modules
70# no-sse2 disables IA-32 SSE2 code in assembly modules, the above
71# mentioned '386' option implies this one
79df9d62 72# no-<cipher> build without specified algorithm (rsa, idea, rc5, ...)
fce0ba5f 73# -<xxx> +<xxx> compiler options are passed through
047d97af
AP
74# -static while -static is also a pass-through compiler option (and
75# as such is limited to environments where it's actually
76# meaningful), it triggers a number configuration options,
31b6ed76 77# namely no-pic, no-shared and no-threads. It is
047d97af
AP
78# argued that the only reason to produce statically linked
79# binaries (and in context it means executables linked with
80# -static flag, and not just executables linked with static
81# libcrypto.a) is to eliminate dependency on specific run-time,
82# a.k.a. libc version. The mentioned config options are meant
83# to achieve just that. Unfortunately on Linux it's impossible
84# to eliminate the dependency completely for openssl executable
85# because of getaddrinfo and gethostbyname calls, which can
86# invoke dynamically loadable library facility anyway to meet
87# the lookup requests. For this reason on Linux statically
88# linked openssl executable has rather debugging value than
89# production quality.
e41c8d6a
GT
90#
91# DEBUG_SAFESTACK use type-safe stacks to enforce type-safety on stack items
84f32c84
DMSP
92# provided to stack calls. Generates unique stack functions for
93# each possible stack type.
94# BN_LLONG use the type 'long long' in crypto/bn/bn.h
95# RC4_CHAR use 'char' instead of 'int' for RC4_INT in crypto/rc4/rc4.h
d0590fe6
AP
96# Following are set automatically by this script
97#
84f32c84
DMSP
98# MD5_ASM use some extra md5 assembler,
99# SHA1_ASM use some extra sha1 assembler, must define L_ENDIAN for x86
100# RMD160_ASM use some extra ripemd160 assembler,
101# SHA256_ASM sha256_block is implemented in assembler
102# SHA512_ASM sha512_block is implemented in assembler
103# AES_ASM AES_[en|de]crypt is implemented in assembler
d02b48c6 104
363bd0b4 105# Minimum warning options... any contributions to OpenSSL should at least get
fce0ba5f 106# past these.
363bd0b4 107
463a7b8c 108# DEBUG_UNUSED enables __owur (warn unused result) checks.
77305338
RS
109# -DPEDANTIC complements -pedantic and is meant to mask code that
110# is not strictly standard-compliant and/or implementation-specific,
111# e.g. inline assembly, disregards to alignment requirements, such
112# that -pedantic would complain about. Incidentally -DPEDANTIC has
113# to be used even in sanitized builds, because sanitizer too is
114# supposed to and does take notice of non-standard behaviour. Then
115# -pedantic with pre-C9x compiler would also complain about 'long
116# long' not being supported. As 64-bit algorithms are common now,
117# it grew impossible to resolve this without sizeable additional
118# code, so we just tell compiler to be pedantic about everything
119# but 'long long' type.
120
e373c70a
RL
121my %gcc_devteam_warn = ();
122{
123 my @common = qw( -DDEBUG_UNUSED
124 -DPEDANTIC -pedantic -Wno-long-long
125 -Wall
126 -Wextra
127 -Wno-unused-parameter
128 -Wno-missing-field-initializers
129 -Wswitch
130 -Wsign-compare
131 -Wshadow
132 -Wformat
133 -Wtype-limits
134 -Wundef
135 -Werror );
136 %gcc_devteam_warn = (
137 CFLAGS => [ @common, qw( -Wmissing-prototypes
138 -Wstrict-prototypes ) ],
139 CXXFLAGS => [ @common ]
140 );
141}
363bd0b4 142
190c8c60
BL
143# These are used in addition to $gcc_devteam_warn when the compiler is clang.
144# TODO(openssl-team): fix problems and investigate if (at least) the
480405e4 145# following warnings can also be enabled:
8bccbce5 146# -Wcast-align
77305338 147# -Wunreachable-code -- no, too ugly/compiler-specific
a773b52a
RS
148# -Wlanguage-extension-token -- no, we use asm()
149# -Wunused-macros -- no, too tricky for BN and _XOPEN_SOURCE etc
150# -Wextended-offsetof -- no, needed in CMS ASN1 code
e373c70a
RL
151my %clang_devteam_warn = ();
152{
153 my @common = qw( -Wswitch-default
154 -Wno-parentheses-equality
155 -Wno-language-extension-token
156 -Wno-extended-offsetof
157 -Wconditional-uninitialized
158 -Wincompatible-pointer-types-discards-qualifiers
159 -Wno-unknown-warning-option );
160 %clang_devteam_warn = (
161 CFLAGS => [ @common, qw( -Wmissing-variable-declarations ) ],
162 CXXFLAGS => [ @common ]
163 );
164}
cb2bc054 165
ef8ca6bd
RL
166# This adds backtrace information to the memory leak info. Is only used
167# when crypto-mdebug-backtrace is enabled.
168my $memleak_devteam_backtrace = "-rdynamic";
a1d3f3d1 169
0c28f277
DSH
170my $strict_warnings = 0;
171
b7efa56a 172# As for $BSDthreads. Idea is to maintain "collective" set of flags,
fce0ba5f 173# which would cover all BSD flavors. -pthread applies to them all,
b7efa56a
AP
174# but is treated differently. OpenBSD expands is as -D_POSIX_THREAD
175# -lc_r, which is sufficient. FreeBSD 4.x expands it as -lc_r,
176# which has to be accompanied by explicit -D_THREAD_SAFE and
177# sometimes -D_REENTRANT. FreeBSD 5.x expands it as -lc_r, which
178# seems to be sufficient?
9c62a279 179our $BSDthreads="-pthread -D_THREAD_SAFE -D_REENTRANT";
d02b48c6 180
98186eb4 181#
f430ba31 182# API compatibility name to version number mapping.
98186eb4 183#
db2f2d49 184my $maxapi = "3.0.0"; # API for "no-deprecated" builds
98186eb4 185my $apitable = {
fcd2d5a6
RL
186 "3.0.0" => 3,
187 "1.1.1" => 2,
188 "1.1.0" => 2,
189 "1.0.2" => 1,
190 "1.0.1" => 1,
191 "1.0.0" => 1,
192 "0.9.8" => 0,
98186eb4
VD
193};
194
9e0724a1 195our %table = ();
291e94df 196our %config = ();
98fdbce0 197our %withargs = ();
f770d75b
AP
198our $now_printing; # set to current entry's name in print_table_entry
199 # (todo: right thing would be to encapsulate name
200 # into %target [class] and make print_table_entry
201 # a method)
3e83e686 202
bd5192b1 203# Forward declarations ###############################################
7ead0c89 204
bd5192b1
RL
205# read_config(filename)
206#
207# Reads a configuration file and populates %table with the contents
208# (which the configuration file places in %targets).
209sub read_config;
7d46b942 210
bd5192b1
RL
211# resolve_config(target)
212#
8483a003 213# Resolves all the late evaluations, inheritances and so on for the
bd5192b1
RL
214# chosen target and any target it inherits from.
215sub resolve_config;
7d46b942 216
15c7adb0 217
107b5792
RL
218# Information collection #############################################
219
9fe2bb77 220# Unified build supports separate build dir
ec182ef0
RL
221my $srcdir = catdir(absolutedir(dirname($0))); # catdir ensures local syntax
222my $blddir = catdir(absolutedir(".")); # catdir ensures local syntax
9fe2bb77
RL
223my $dofile = abs2rel(catfile($srcdir, "util/dofile.pl"));
224
b5293d4c
RL
225my $local_config_envname = 'OPENSSL_LOCAL_CONFIG_DIR';
226
9fe2bb77
RL
227$config{sourcedir} = abs2rel($srcdir);
228$config{builddir} = abs2rel($blddir);
229
ee4cdb7f
RL
230# Collect reconfiguration information if needed
231my @argvcopy=@ARGV;
232
233if (grep /^reconf(igure)?$/, @argvcopy) {
99aeeecb
RL
234 die "reconfiguring with other arguments present isn't supported"
235 if scalar @argvcopy > 1;
ee4cdb7f 236 if (-f "./configdata.pm") {
84f32c84
DMSP
237 my $file = "./configdata.pm";
238 unless (my $return = do $file) {
239 die "couldn't parse $file: $@" if $@;
ee4cdb7f
RL
240 die "couldn't do $file: $!" unless defined $return;
241 die "couldn't run $file" unless $return;
84f32c84 242 }
ee4cdb7f 243
84f32c84
DMSP
244 @argvcopy = defined($configdata::config{perlargv}) ?
245 @{$configdata::config{perlargv}} : ();
246 die "Incorrect data to reconfigure, please do a normal configuration\n"
247 if (grep(/^reconf/,@argvcopy));
248 $config{perlenv} = $configdata::config{perlenv} // {};
ee4cdb7f 249 } else {
84f32c84 250 die "Insufficient data to reconfigure, please do a normal configuration\n";
ee4cdb7f
RL
251 }
252}
253
254$config{perlargv} = [ @argvcopy ];
255
107b5792 256# Collect version numbers
3a63dbef
RL
257$config{major} = "unknown";
258$config{minor} = "unknown";
259$config{patch} = "unknown";
260$config{prerelease} = "";
261$config{build_metadata} = "";
262$config{shlib_version} = "unknown";
107b5792
RL
263
264collect_information(
9fe2bb77 265 collect_from_file(catfile($srcdir,'include/openssl/opensslv.h')),
3a63dbef
RL
266 qr/#\s+define\s+OPENSSL_VERSION_MAJOR\s+(\d+)/ =>
267 sub { $config{major} = $1; },
268 qr/#\s+define\s+OPENSSL_VERSION_MINOR\s+(\d+)/ =>
269 sub { $config{minor} = $1; },
270 qr/#\s+define\s+OPENSSL_VERSION_PATCH\s+(\d+)/ =>
271 sub { $config{patch} = $1; },
272 qr/#\s+define\s+OPENSSL_VERSION_PRE_RELEASE\s+"((?:\\.|[^"])*)"/ =>
273 sub { $config{prerelease} = $1; },
274 qr/#\s+define\s+OPENSSL_VERSION_BUILD_METADATA\s+"((?:\\.|[^"])*)"/ =>
275 sub { $config{build_metadata} = $1; },
276 qr/#\s+define\s+OPENSSL_SHLIB_VERSION\s+([\d\.]+)/ =>
277 sub { $config{shlib_version} = $1; },
107b5792 278 );
107b5792 279die "erroneous version information in opensslv.h: ",
3a63dbef
RL
280 "$config{major}.$config{minor}.$config{patch}, $config{shlib_version}\n"
281 if ($config{major} eq "unknown"
282 || $config{minor} eq "unknown"
283 || $config{patch} eq "unknown"
284 || $config{shlib_version} eq "unknown");
107b5792 285
16942e08
DMSP
286$config{version} = "$config{major}.$config{minor}.$config{patch}";
287$config{full_version} = "$config{version}$config{prerelease}$config{build_metadata}";
288
107b5792
RL
289# Collect target configurations
290
85152ca4 291my $pattern = catfile(dirname($0), "Configurations", "*.conf");
97855556 292foreach (sort glob($pattern)) {
f09e7ca9
RS
293 &read_config($_);
294}
d02b48c6 295
7ecdf18d 296if (defined env($local_config_envname)) {
b5293d4c
RL
297 if ($^O eq 'VMS') {
298 # VMS environment variables are logical names,
299 # which can be used as is
300 $pattern = $local_config_envname . ':' . '*.conf';
301 } else {
7ecdf18d 302 $pattern = catfile(env($local_config_envname), '*.conf');
b5293d4c
RL
303 }
304
97855556 305 foreach (sort glob($pattern)) {
b5293d4c
RL
306 &read_config($_);
307 }
308}
309
d5fa7035
RL
310# Save away perl command information
311$config{perl_cmd} = $^X;
312$config{perl_version} = $Config{version};
313$config{perl_archname} = $Config{archname};
314
291e94df
RL
315$config{prefix}="";
316$config{openssldir}="";
7d130f68 317$config{processor}="";
107b5792 318$config{libdir}="";
9c62a279 319my $auto_threads=1; # enable threads automatically? true by default
0396479d 320my $default_ranlib;
107b5792 321
6b01bed2 322# Known TLS and DTLS protocols
84a68336 323my @tls = qw(ssl3 tls1 tls1_1 tls1_2 tls1_3);
6b01bed2
VD
324my @dtls = qw(dtls1 dtls1_2);
325
8483a003 326# Explicitly known options that are possible to disable. They can
8b527be2
RL
327# be regexps, and will be used like this: /^no-${option}$/
328# For developers: keep it sorted alphabetically
329
330my @disablables = (
69495e3d 331 "ktls",
c91a0a83 332 "afalgeng",
d42d0a4d 333 "aria",
c38bb727 334 "asan",
8b527be2 335 "asm",
52739e40 336 "async",
b184e3ef 337 "autoalginit",
498abff0 338 "autoerrinit",
dbabc862 339 "autoload-config",
8b527be2 340 "bf",
2d0b4412 341 "blake2",
ac4033d6 342 "buildtest-c++",
8b527be2
RL
343 "camellia",
344 "capieng",
345 "cast",
48f14845 346 "chacha",
8b527be2
RL
347 "cmac",
348 "cms",
349 "comp",
a61b7f2f 350 "crmf",
3e45d393 351 "crypto-mdebug",
ef8ca6bd 352 "crypto-mdebug-backtrace",
8b527be2
RL
353 "ct",
354 "deprecated",
355 "des",
619eb33a 356 "devcryptoeng",
8b527be2
RL
357 "dgram",
358 "dh",
359 "dsa",
a5ecdc6a 360 "dtls",
343ec2b0 361 "dynamic-engine",
8b527be2
RL
362 "ec",
363 "ec2m",
6b01bed2
VD
364 "ecdh",
365 "ecdsa",
8b527be2 366 "ec_nistp_64_gcc_128",
b31feae6 367 "egd",
8b527be2 368 "engine",
1288f26f 369 "err",
ce2596d4 370 "external-tests",
02f7114a 371 "filenames",
e7545517 372 "fips",
f59d0131
KR
373 "fuzz-libfuzzer",
374 "fuzz-afl",
168c3b73 375 "gost",
8b527be2 376 "idea",
d0308923 377 "legacy",
09aa263a 378 "makedepend",
8b527be2
RL
379 "md2",
380 "md4",
8b527be2 381 "mdc2",
34786bde 382 "module",
29df3061 383 "msan",
fa22f98f 384 "multiblock",
8b527be2 385 "nextprotoneg",
41999e7d 386 "pinshared",
8b527be2
RL
387 "ocb",
388 "ocsp",
469ce8ff 389 "padlockeng",
ae48242c 390 "pic",
48f14845 391 "poly1305",
8b527be2
RL
392 "posix-io",
393 "psk",
394 "rc2",
395 "rc4",
396 "rc5",
397 "rdrand",
398 "rfc3779",
8b527be2 399 "rmd160",
8b527be2 400 "scrypt",
8b527be2
RL
401 "sctp",
402 "seed",
8b527be2 403 "shared",
3f5616d7 404 "siphash",
b1ceb439 405 "siv",
1bf2cc23 406 "sm2",
a0c3e4fa 407 "sm3",
f19a5ff9 408 "sm4",
8b527be2
RL
409 "sock",
410 "srp",
411 "srtp",
412 "sse2",
413 "ssl",
8b527be2
RL
414 "ssl-trace",
415 "static-engine",
416 "stdio",
93880ce1 417 "tests",
8b527be2
RL
418 "threads",
419 "tls",
16a9d374 420 "trace",
1288f26f 421 "ts",
c38bb727 422 "ubsan",
48feaceb 423 "ui-console",
8b527be2
RL
424 "unit-test",
425 "whirlpool",
8b1a5af3 426 "weak-ssl-ciphers",
8b527be2
RL
427 "zlib",
428 "zlib-dynamic",
429 );
6b01bed2 430foreach my $proto ((@tls, @dtls))
84f32c84
DMSP
431 {
432 push(@disablables, $proto);
433 push(@disablables, "$proto-method") unless $proto eq "tls1_3";
434 }
8b527be2 435
2b1343b9
MC
436my %deprecated_disablables = (
437 "ssl2" => undef,
438 "buf-freelists" => undef,
469ce8ff
RL
439 "hw" => "hw", # causes cascade, but no macro
440 "hw-padlock" => "padlockeng",
48feaceb
RL
441 "ripemd" => "rmd160",
442 "ui" => "ui-console",
31b6ed76 443 "dso" => undef,
0b45d8ee 444 "heartbeats" => undef,
e80381e1
RL
445 );
446
094925de 447# All of the following are disabled by default:
c9a112f5 448
9e04edf2 449our %disabled = ( # "what" => "comment"
84f32c84
DMSP
450 "asan" => "default",
451 "buildtest-c++" => "default",
452 "crypto-mdebug" => "default",
453 "crypto-mdebug-backtrace" => "default",
454 "devcryptoeng" => "default",
455 "ec_nistp_64_gcc_128" => "default",
456 "egd" => "default",
457 "external-tests" => "default",
458 "fuzz-libfuzzer" => "default",
459 "fuzz-afl" => "default",
84f32c84 460 "md2" => "default",
29df3061 461 "msan" => "default",
84f32c84
DMSP
462 "rc5" => "default",
463 "sctp" => "default",
464 "ssl-trace" => "default",
465 "ssl3" => "default",
466 "ssl3-method" => "default",
467 "trace" => "default",
468 "ubsan" => "default",
469 "unit-test" => "default",
470 "weak-ssl-ciphers" => "default",
471 "zlib" => "default",
472 "zlib-dynamic" => "default",
473 "ktls" => "default",
474 );
c9a112f5 475
c569e206
RL
476# Note: => pair form used for aesthetics, not to truly make a hash table
477my @disable_cascades = (
84f32c84 478 # "what" => [ "cascade", ... ]
7d130f68 479 sub { $config{processor} eq "386" }
84f32c84
DMSP
480 => [ "sse2" ],
481 "ssl" => [ "ssl3" ],
482 "ssl3-method" => [ "ssl3" ],
483 "zlib" => [ "zlib-dynamic" ],
484 "des" => [ "mdc2" ],
485 "ec" => [ "ecdsa", "ecdh" ],
486
487 "dgram" => [ "dtls", "sctp" ],
488 "sock" => [ "dgram" ],
489 "dtls" => [ @dtls ],
343a7467 490 sub { 0 == scalar grep { !$disabled{$_} } @dtls }
84f32c84 491 => [ "dtls" ],
c569e206 492
84f32c84 493 "tls" => [ @tls ],
343a7467 494 sub { 0 == scalar grep { !$disabled{$_} } @tls }
84f32c84 495 => [ "tls" ],
c569e206 496
ef8ca6bd 497 "crypto-mdebug" => [ "crypto-mdebug-backtrace" ],
343ec2b0 498
34786bde
RL
499 # If no modules, then no dynamic engines either
500 "module" => [ "dynamic-engine" ],
501
502 # Without shared libraries, dynamic engines aren't possible.
503 # This is due to them having to link with libcrypto and register features
504 # using the ENGINE functionality, and since that relies on global tables,
505 # those *have* to be exacty the same as the ones accessed from the app,
506 # which cannot be guaranteed if shared libraries aren't present.
507 # (note that even with shared libraries, both the app and dynamic engines
508 # must be linked with the same library)
00698061 509 "shared" => [ "dynamic-engine" ],
34786bde
RL
510 # Other modules don't necessarily have to link with libcrypto, so shared
511 # libraries do not have to be a condition to produce those.
512
513 # Without position independent code, there can be no shared libraries
514 # or modules.
515 "pic" => [ "shared", "module" ],
469ce8ff 516
d0308923 517 "module" => [ "fips", "legacy" ],
e7545517 518
469ce8ff
RL
519 "engine" => [ grep /eng$/, @disablables ],
520 "hw" => [ "padlockeng" ],
d90a6beb
MC
521
522 # no-autoalginit is only useful when building non-shared
523 "autoalginit" => [ "shared", "apps" ],
524
15a1bd0a 525 "stdio" => [ "apps", "capieng", "egd" ],
d90a6beb 526 "apps" => [ "tests" ],
302eba3f 527 "tests" => [ "external-tests" ],
3cf96e88 528 "comp" => [ "zlib" ],
dad8c264 529 "ec" => [ "tls1_3", "sm2" ],
98020023 530 "sm3" => [ "sm2" ],
b612799a 531 sub { !$disabled{"unit-test"} } => [ "heartbeats" ],
29df3061
EK
532
533 sub { !$disabled{"msan"} } => [ "asm" ],
b1ceb439
TS
534
535 sub { $disabled{cmac}; } => [ "siv" ],
d0308923 536 "legacy" => [ "md2" ],
c569e206
RL
537 );
538
539# Avoid protocol support holes. Also disable all versions below N, if version
540# N is disabled while N+1 is enabled.
541#
542my @list = (reverse @tls);
543while ((my $first, my $second) = (shift @list, shift @list)) {
544 last unless @list;
545 push @disable_cascades, ( sub { !$disabled{$first} && $disabled{$second} }
84f32c84 546 => [ @list ] );
c569e206
RL
547 unshift @list, $second;
548}
549my @list = (reverse @dtls);
550while ((my $first, my $second) = (shift @list, shift @list)) {
551 last unless @list;
552 push @disable_cascades, ( sub { !$disabled{$first} && $disabled{$second} }
84f32c84 553 => [ @list ] );
c569e206
RL
554 unshift @list, $second;
555}
556
7a762197 557# Explicit "no-..." options will be collected in %disabled along with the defaults.
e4ef2e25 558# To remove something from %disabled, use "enable-foo".
7a762197
BM
559# For symmetry, "disable-foo" is a synonym for "no-foo".
560
462ba4f6 561&usage if ($#ARGV < 0);
d02b48c6 562
5b18235a
RL
563# For the "make variables" CINCLUDES and CDEFINES, we support lists with
564# platform specific list separators. Users from those platforms should
565# recognise those separators from how you set up the PATH to find executables.
566# The default is the Unix like separator, :, but as an exception, we also
567# support the space as separator.
568my $list_separator_re =
569 { VMS => qr/(?<!\^),/,
570 MSWin32 => qr/(?<!\\);/ } -> {$^O} // qr/(?<!\\)[:\s]/;
571# All the "make variables" we support
f5846179
RL
572# Some get pre-populated for the sake of backward compatibility
573# (we supported those before the change to "make variable" support.
5b18235a 574my %user = (
f5846179 575 AR => env('AR'),
5b18235a
RL
576 ARFLAGS => [],
577 AS => undef,
578 ASFLAGS => [],
f5846179 579 CC => env('CC'),
8e7984e5 580 CFLAGS => [ env('CFLAGS') || () ],
f5846179 581 CXX => env('CXX'),
8e7984e5 582 CXXFLAGS => [ env('CXXFLAGS') || () ],
5b18235a 583 CPP => undef,
8e7984e5 584 CPPFLAGS => [ env('CPPFLAGS') || () ], # -D, -I, -Wp,
5b18235a
RL
585 CPPDEFINES => [], # Alternative for -D
586 CPPINCLUDES => [], # Alternative for -I
f5846179
RL
587 CROSS_COMPILE => env('CROSS_COMPILE'),
588 HASHBANGPERL=> env('HASHBANGPERL') || env('PERL'),
5b18235a 589 LD => undef,
8e7984e5
RL
590 LDFLAGS => [ env('LDFLAGS') || () ], # -L, -Wl,
591 LDLIBS => [ env('LDLIBS') || () ], # -l
5b18235a
RL
592 MT => undef,
593 MTFLAGS => [],
9e265322 594 PERL => env('PERL') || ($^O ne "VMS" ? $^X : "perl"),
f5846179
RL
595 RANLIB => env('RANLIB'),
596 RC => env('RC') || env('WINDRES'),
5b18235a
RL
597 RCFLAGS => [],
598 RM => undef,
599 );
f729ba55
RL
600# Info about what "make variables" may be prefixed with the cross compiler
601# prefix. This should NEVER mention any such variable with a list for value.
602my @user_crossable = qw ( AR AS CC CXX CPP LD MT RANLIB RC );
5b18235a
RL
603# The same but for flags given as Configure options. These are *additional*
604# input, as opposed to the VAR=string option that override the corresponding
605# config target attributes
606my %useradd = (
607 CPPDEFINES => [],
608 CPPINCLUDES => [],
609 CPPFLAGS => [],
610 CFLAGS => [],
611 CXXFLAGS => [],
612 LDFLAGS => [],
613 LDLIBS => [],
614 );
615
616my %user_synonyms = (
617 HASHBANGPERL=> 'PERL',
618 RC => 'WINDRES',
619 );
abe256e7
RL
620
621# Some target attributes have been renamed, this is the translation table
622my %target_attr_translate =(
623 ar => 'AR',
624 as => 'AS',
625 cc => 'CC',
626 cxx => 'CXX',
627 cpp => 'CPP',
628 hashbangperl => 'HASHBANGPERL',
629 ld => 'LD',
630 mt => 'MT',
631 ranlib => 'RANLIB',
632 rc => 'RC',
633 rm => 'RM',
5b18235a 634 );
5b18235a 635
2ab92ae9 636# Initialisers coming from 'config' scripts
ff455d99
AP
637$config{defines} = [ split(/$list_separator_re/, env('__CNF_CPPDEFINES')) ];
638$config{includes} = [ split(/$list_separator_re/, env('__CNF_CPPINCLUDES')) ];
639$config{cppflags} = [ env('__CNF_CPPFLAGS') || () ];
640$config{cflags} = [ env('__CNF_CFLAGS') || () ];
641$config{cxxflags} = [ env('__CNF_CXXFLAGS') || () ];
642$config{lflags} = [ env('__CNF_LDFLAGS') || () ];
643$config{ex_libs} = [ env('__CNF_LDLIBS') || () ];
2ab92ae9 644
7d130f68 645$config{openssl_api_defines}=[];
7d130f68 646$config{openssl_sys_defines}=[];
e0bf7c01 647$config{openssl_feature_defines}=[];
3fa04f0d 648$config{options}="";
8864f0de 649$config{build_type} = "release";
5b18235a 650my $target="";
c59cb511 651
ac6ae8a9 652my %cmdvars = (); # Stores FOO='blah' type arguments
fe05264e 653my %unsupported_options = ();
e80381e1 654my %deprecated_options = ();
8389ec4b
RS
655# If you change this, update apps/version.c
656my @known_seed_sources = qw(getrandom devrandom os egd none rdcpu librandom);
657my @seed_sources = ();
fad599f7 658while (@argvcopy)
84f32c84
DMSP
659 {
660 $_ = shift @argvcopy;
661
662 # Support env variable assignments among the options
663 if (m|^(\w+)=(.+)?$|)
664 {
665 $cmdvars{$1} = $2;
666 # Every time a variable is given as a configuration argument,
667 # it acts as a reset if the variable.
668 if (exists $user{$1})
669 {
670 $user{$1} = ref $user{$1} eq "ARRAY" ? [] : undef;
671 }
672 #if (exists $useradd{$1})
673 # {
674 # $useradd{$1} = [];
675 # }
676 next;
677 }
678
679 # VMS is a case insensitive environment, and depending on settings
680 # out of our control, we may receive options uppercased. Let's
681 # downcase at least the part before any equal sign.
682 if ($^O eq "VMS")
683 {
684 s/^([^=]*)/lc($1)/e;
685 }
686
687 # some people just can't read the instructions, clang people have to...
688 s/^-no-(?!integrated-as)/no-/;
689
690 # rewrite some options in "enable-..." form
691 s /^-?-?shared$/enable-shared/;
692 s /^sctp$/enable-sctp/;
693 s /^threads$/enable-threads/;
694 s /^zlib$/enable-zlib/;
695 s /^zlib-dynamic$/enable-zlib-dynamic/;
c9a112f5 696
e4ef2e25 697 if (/^(no|disable|enable)-(.+)$/)
2b1343b9
MC
698 {
699 my $word = $2;
469ce8ff
RL
700 if ($word !~ m|hw(?:-.+)| # special treatment for hw regexp opt
701 && !exists $deprecated_disablables{$word}
702 && !grep { $word eq $_ } @disablables)
2b1343b9
MC
703 {
704 $unsupported_options{$_} = 1;
705 next;
706 }
707 }
708 if (/^no-(.+)$/ || /^disable-(.+)$/)
709 {
e4ef2e25
RS
710 foreach my $proto ((@tls, @dtls))
711 {
712 if ($1 eq "$proto-method")
713 {
714 $disabled{"$proto"} = "option($proto-method)";
715 last;
716 }
717 }
718 if ($1 eq "dtls")
719 {
720 foreach my $proto (@dtls)
721 {
722 $disabled{$proto} = "option(dtls)";
723 }
c5c7700c 724 $disabled{"dtls"} = "option(dtls)";
e4ef2e25
RS
725 }
726 elsif ($1 eq "ssl")
727 {
728 # Last one of its kind
729 $disabled{"ssl3"} = "option(ssl)";
730 }
731 elsif ($1 eq "tls")
732 {
733 # XXX: Tests will fail if all SSL/TLS
734 # protocols are disabled.
735 foreach my $proto (@tls)
736 {
737 $disabled{$proto} = "option(tls)";
738 }
739 }
343ec2b0
RL
740 elsif ($1 eq "static-engine")
741 {
19ab5790 742 delete $disabled{"dynamic-engine"};
343ec2b0
RL
743 }
744 elsif ($1 eq "dynamic-engine")
745 {
19ab5790 746 $disabled{"dynamic-engine"} = "option";
343ec2b0 747 }
2b1343b9
MC
748 elsif (exists $deprecated_disablables{$1})
749 {
750 $deprecated_options{$_} = 1;
751 if (defined $deprecated_disablables{$1})
752 {
753 $disabled{$deprecated_disablables{$1}} = "option";
754 }
755 }
469ce8ff
RL
756 elsif ($1 =~ m|hw(?:-.+)|) # deprecate hw options in regexp form
757 {
758 $deprecated_options{$_} = 1;
759 }
e4ef2e25
RS
760 else
761 {
762 $disabled{$1} = "option";
763 }
84f32c84
DMSP
764 # No longer an automatic choice
765 $auto_threads = 0 if ($1 eq "threads");
766 }
767 elsif (/^enable-(.+)$/)
768 {
343ec2b0
RL
769 if ($1 eq "static-engine")
770 {
19ab5790 771 $disabled{"dynamic-engine"} = "option";
343ec2b0
RL
772 }
773 elsif ($1 eq "dynamic-engine")
774 {
19ab5790 775 delete $disabled{"dynamic-engine"};
343ec2b0 776 }
25004db7
RL
777 elsif ($1 eq "zlib-dynamic")
778 {
779 delete $disabled{"zlib"};
780 }
84f32c84
DMSP
781 my $algo = $1;
782 delete $disabled{$algo};
783
784 # No longer an automatic choice
785 $auto_threads = 0 if ($1 eq "threads");
786 }
787 elsif (/^--strict-warnings$/)
788 {
789 # Pretend that our strict flags is a C flag, and replace it
790 # with the proper flags later on
791 push @{$useradd{CFLAGS}}, '--ossl-strict-warnings';
792 push @{$useradd{CXXFLAGS}}, '--ossl-strict-warnings';
793 $strict_warnings=1;
794 }
795 elsif (/^--debug$/)
796 {
797 $config{build_type} = "debug";
798 }
799 elsif (/^--release$/)
800 {
801 $config{build_type} = "release";
802 }
803 elsif (/^386$/)
804 { $config{processor}=386; }
805 elsif (/^fips$/)
806 {
807 die "FIPS mode not supported\n";
808 }
809 elsif (/^rsaref$/)
810 {
811 # No RSAref support any more since it's not needed.
812 # The check for the option is there so scripts aren't
813 # broken
814 }
815 elsif (/^nofipscanistercheck$/)
816 {
817 die "FIPS mode not supported\n";
818 }
819 elsif (/^[-+]/)
820 {
821 if (/^--prefix=(.*)$/)
822 {
823 $config{prefix}=$1;
824 die "Directory given with --prefix MUST be absolute\n"
825 unless file_name_is_absolute($config{prefix});
826 }
827 elsif (/^--api=(.*)$/)
828 {
829 $config{api}=$1;
830 }
831 elsif (/^--libdir=(.*)$/)
832 {
833 $config{libdir}=$1;
834 }
835 elsif (/^--openssldir=(.*)$/)
836 {
837 $config{openssldir}=$1;
838 }
839 elsif (/^--with-zlib-lib=(.*)$/)
840 {
841 $withargs{zlib_lib}=$1;
842 }
843 elsif (/^--with-zlib-include=(.*)$/)
844 {
845 $withargs{zlib_include}=$1;
846 }
847 elsif (/^--with-fuzzer-lib=(.*)$/)
848 {
849 $withargs{fuzzer_lib}=$1;
850 }
851 elsif (/^--with-fuzzer-include=(.*)$/)
852 {
853 $withargs{fuzzer_include}=$1;
854 }
855 elsif (/^--with-rand-seed=(.*)$/)
856 {
857 foreach my $x (split(m|,|, $1))
858 {
859 die "Unknown --with-rand-seed choice $x\n"
860 if ! grep { $x eq $_ } @known_seed_sources;
861 push @seed_sources, $x;
862 }
863 }
864 elsif (/^--cross-compile-prefix=(.*)$/)
865 {
866 $user{CROSS_COMPILE}=$1;
867 }
868 elsif (/^--config=(.*)$/)
869 {
870 read_config $1;
871 }
872 elsif (/^-l(.*)$/)
873 {
874 push @{$useradd{LDLIBS}}, $_;
875 }
876 elsif (/^-framework$/)
877 {
878 push @{$useradd{LDLIBS}}, $_, shift(@argvcopy);
879 }
880 elsif (/^-L(.*)$/ or /^-Wl,/)
881 {
882 push @{$useradd{LDFLAGS}}, $_;
883 }
884 elsif (/^-rpath$/ or /^-R$/)
885 # -rpath is the OSF1 rpath flag
886 # -R is the old Solaris rpath flag
887 {
888 my $rpath = shift(@argvcopy) || "";
889 $rpath .= " " if $rpath ne "";
890 push @{$useradd{LDFLAGS}}, $_, $rpath;
891 }
892 elsif (/^-static$/)
893 {
894 push @{$useradd{LDFLAGS}}, $_;
84f32c84
DMSP
895 }
896 elsif (/^-D(.*)$/)
897 {
898 push @{$useradd{CPPDEFINES}}, $1;
899 }
900 elsif (/^-I(.*)$/)
901 {
902 push @{$useradd{CPPINCLUDES}}, $1;
903 }
904 elsif (/^-Wp,$/)
905 {
906 push @{$useradd{CPPFLAGS}}, $1;
907 }
908 else # common if (/^[-+]/), just pass down...
909 {
910 $_ =~ s/%([0-9a-f]{1,2})/chr(hex($1))/gei;
911 push @{$useradd{CFLAGS}}, $_;
912 push @{$useradd{CXXFLAGS}}, $_;
8389ec4b 913 }
84f32c84
DMSP
914 }
915 else
916 {
917 die "target already defined - $target (offending arg: $_)\n" if ($target ne "");
918 $target=$_;
919 }
920 unless ($_ eq $target || /^no-/ || /^disable-/)
921 {
922 # "no-..." follows later after implied deactivations
923 # have been derived. (Don't take this too seriously,
924 # we really only write OPTIONS to the Makefile out of
925 # nostalgia.)
926
927 if ($config{options} eq "")
928 { $config{options} = $_; }
929 else
930 { $config{options} .= " ".$_; }
931 }
932 }
489eb740 933
ddbe700e 934if (defined($config{api}) && !exists $apitable->{$config{api}}) {
84f32c84 935 die "***** Unsupported api compatibility level: $config{api}\n",
ddbe700e 936}
98186eb4 937
ddbe700e 938if (keys %deprecated_options)
84f32c84
DMSP
939 {
940 warn "***** Deprecated options: ",
941 join(", ", keys %deprecated_options), "\n";
942 }
ddbe700e 943if (keys %unsupported_options)
84f32c84
DMSP
944 {
945 die "***** Unsupported options: ",
946 join(", ", keys %unsupported_options), "\n";
947 }
b6e4dac2 948
ac6ae8a9
RL
949# If any %useradd entry has been set, we must check that the "make
950# variables" haven't been set. We start by checking of any %useradd entry
fb174faa 951# is set.
b9201360 952if (grep { scalar @$_ > 0 } values %useradd) {
fb174faa 953 # Hash of env / make variables names. The possible values are:
ac6ae8a9 954 # 1 - "make vars"
fb174faa
RL
955 # 2 - %useradd entry set
956 # 3 - both set
ac6ae8a9 957 my %detected_vars =
fb174faa 958 map { my $v = 0;
ac6ae8a9 959 $v += 1 if $cmdvars{$_};
fb174faa
RL
960 $v += 2 if @{$useradd{$_}};
961 $_ => $v }
962 keys %useradd;
963
ac6ae8a9
RL
964 # If any of the corresponding "make variables" is set, we error
965 if (grep { $_ & 1 } values %detected_vars) {
966 my $names = join(', ', grep { $detected_vars{$_} > 0 }
967 sort keys %detected_vars);
b9201360 968 die <<"_____";
ac6ae8a9 969***** Mixing make variables and additional compiler/linker flags as
b9201360 970***** configure command line option is not permitted.
ac6ae8a9 971***** Affected make variables: $names
b9201360
RL
972_____
973 }
974}
975
ac6ae8a9
RL
976# Check through all supported command line variables to see if any of them
977# were set, and canonicalise the values we got. If no compiler or linker
978# flag or anything else that affects %useradd was set, we also check the
979# environment for values.
980my $anyuseradd =
981 grep { defined $_ && (ref $_ ne 'ARRAY' || @$_) } values %useradd;
5b18235a 982foreach (keys %user) {
ac6ae8a9
RL
983 my $value = $cmdvars{$_};
984 $value //= env($_) unless $anyuseradd;
985 $value //=
986 defined $user_synonyms{$_} ? $cmdvars{$user_synonyms{$_}} : undef;
987 $value //= defined $user_synonyms{$_} ? env($user_synonyms{$_}) : undef
988 unless $anyuseradd;
5b18235a
RL
989
990 if (defined $value) {
991 if (ref $user{$_} eq 'ARRAY') {
992 $user{$_} = [ split /$list_separator_re/, $value ];
993 } elsif (!defined $user{$_}) {
994 $user{$_} = $value;
995 }
996 }
997}
998
07e4dc34 999if (grep { /-rpath\b/ } ($user{LDFLAGS} ? @{$user{LDFLAGS}} : ())
342a1a23
RL
1000 && !$disabled{shared}
1001 && !($disabled{asan} && $disabled{msan} && $disabled{ubsan})) {
1002 die "***** Cannot simultaneously use -rpath, shared libraries, and\n",
84f32c84 1003 "***** any of asan, msan or ubsan\n";
342a1a23
RL
1004}
1005
c569e206
RL
1006my @tocheckfor = (keys %disabled);
1007while (@tocheckfor) {
1008 my %new_tocheckfor = ();
1009 my @cascade_copy = (@disable_cascades);
1010 while (@cascade_copy) {
84f32c84
DMSP
1011 my ($test, $descendents) = (shift @cascade_copy, shift @cascade_copy);
1012 if (ref($test) eq "CODE" ? $test->() : defined($disabled{$test})) {
1013 foreach(grep { !defined($disabled{$_}) } @$descendents) {
1014 $new_tocheckfor{$_} = 1; $disabled{$_} = "forced";
1015 }
1016 }
c569e206
RL
1017 }
1018 @tocheckfor = (keys %new_tocheckfor);
1019}
edc032b5 1020
d63c12c6 1021our $die = sub { die @_; };
436a376b 1022if ($target eq "TABLE") {
d63c12c6 1023 local $die = sub { warn @_; };
00ae96ca 1024 foreach (sort keys %table) {
84f32c84 1025 print_table_entry($_, "TABLE");
00ae96ca
RL
1026 }
1027 exit 0;
436a376b
BM
1028}
1029
10a926c1 1030if ($target eq "LIST") {
00ae96ca 1031 foreach (sort keys %table) {
84f32c84 1032 print $_,"\n" unless $table{$_}->{template};
00ae96ca
RL
1033 }
1034 exit 0;
10a926c1
UM
1035}
1036
aaf878cc 1037if ($target eq "HASH") {
d63c12c6 1038 local $die = sub { warn @_; };
00ae96ca
RL
1039 print "%table = (\n";
1040 foreach (sort keys %table) {
84f32c84 1041 print_table_entry($_, "HASH");
00ae96ca
RL
1042 }
1043 exit 0;
aaf878cc
RL
1044}
1045
16942e08
DMSP
1046print "Configuring OpenSSL version $config{full_version} ";
1047print "for target $target\n";
64119271 1048
51cf8e0b
RL
1049if (scalar(@seed_sources) == 0) {
1050 print "Using os-specific seed configuration\n";
1051 push @seed_sources, 'os';
1052}
2805ee1e
RL
1053if (scalar(grep { $_ eq 'none' } @seed_sources) > 0) {
1054 die "Cannot seed with none and anything else" if scalar(@seed_sources) > 1;
1055 warn <<_____ if scalar(@seed_sources) == 1;
2805ee1e 1056
caa85952
DMSP
1057============================== WARNING ===============================
1058You have selected the --with-rand-seed=none option, which effectively
1059disables automatic reseeding of the OpenSSL random generator.
1060All operations depending on the random generator such as creating keys
1061will not work unless the random generator is seeded manually by the
1062application.
1063
1064Please read the 'Note on random number generation' section in the
1065INSTALL instructions and the RAND_DRBG(7) manual page for more details.
1066============================== WARNING ===============================
1067
2805ee1e
RL
1068_____
1069}
e0bf7c01 1070push @{$config{openssl_feature_defines}},
51cf8e0b 1071 map { (my $x = $_) =~ tr|[\-a-z]|[_A-Z]|; "OPENSSL_RAND_SEED_$x" }
84f32c84 1072 @seed_sources;
51cf8e0b 1073
00ae96ca 1074# Backward compatibility?
49e04548 1075if ($target =~ m/^CygWin32(-.*)$/) {
00ae96ca 1076 $target = "Cygwin".$1;
49e04548
RL
1077}
1078
906eb3d0
RL
1079# Support for legacy targets having a name starting with 'debug-'
1080my ($d, $t) = $target =~ m/^(debug-)?(.*)$/;
1081if ($d) {
1082 $config{build_type} = "debug";
1083
1084 # If we do not find debug-foo in the table, the target is set to foo.
1085 if (!$table{$target}) {
84f32c84 1086 $target = $t;
906eb3d0
RL
1087 }
1088}
4e360445
RL
1089
1090&usage if !$table{$target} || $table{$target}->{template};
1091
906eb3d0
RL
1092$config{target} = $target;
1093my %target = resolve_config($target);
1094
abe256e7
RL
1095foreach (keys %target_attr_translate) {
1096 $target{$target_attr_translate{$_}} = $target{$_}
1097 if $target{$_};
1098 delete $target{$_};
1099}
1100
793077d0
RL
1101%target = ( %{$table{DEFAULTS}}, %target );
1102
1103# Make the flags to build DSOs the same as for shared libraries unless they
1104# are already defined
48dcca26
RL
1105$target{module_cflags} = $target{shared_cflag} unless defined $target{module_cflags};
1106$target{module_cxxflags} = $target{shared_cxxflag} unless defined $target{module_cxxflags};
1107$target{module_ldflags} = $target{shared_ldflag} unless defined $target{module_ldflags};
793077d0
RL
1108{
1109 my $shared_info_pl =
1110 catfile(dirname($0), "Configurations", "shared-info.pl");
1111 my %shared_info = read_eval_file($shared_info_pl);
1112 push @{$target{_conf_fname_int}}, $shared_info_pl;
1113 my $si = $target{shared_target};
1114 while (ref $si ne "HASH") {
1115 last if ! defined $si;
1116 if (ref $si eq "CODE") {
1117 $si = $si->();
1118 } else {
1119 $si = $shared_info{$si};
1120 }
1121 }
1122
1123 # Some of the 'shared_target' values don't have any entried in
1124 # %shared_info. That's perfectly fine, AS LONG AS the build file
1125 # template knows how to handle this. That is currently the case for
1126 # Windows and VMS.
1127 if (defined $si) {
1128 # Just as above, copy certain shared_* attributes to the corresponding
48dcca26
RL
1129 # module_ attribute unless the latter is already defined
1130 $si->{module_cflags} = $si->{shared_cflag} unless defined $si->{module_cflags};
1131 $si->{module_cxxflags} = $si->{shared_cxxflag} unless defined $si->{module_cxxflags};
1132 $si->{module_ldflags} = $si->{shared_ldflag} unless defined $si->{module_ldflags};
793077d0
RL
1133 foreach (sort keys %$si) {
1134 $target{$_} = defined $target{$_}
1135 ? add($si->{$_})->($target{$_})
1136 : $si->{$_};
1137 }
1138 }
1139}
1140
906eb3d0
RL
1141my %conf_files = map { $_ => 1 } (@{$target{_conf_fname_int}});
1142$config{conf_files} = [ sort keys %conf_files ];
906eb3d0
RL
1143
1144foreach my $feature (@{$target{disable}}) {
1145 if (exists $deprecated_disablables{$feature}) {
1146 warn "***** config $target disables deprecated feature $feature\n";
1147 } elsif (!grep { $feature eq $_ } @disablables) {
1148 die "***** config $target disables unknown feature $feature\n";
1149 }
1150 $disabled{$feature} = 'config';
1151}
1152foreach my $feature (@{$target{enable}}) {
7a8a35ff 1153 if ("default" eq ($disabled{$feature} // "")) {
906eb3d0
RL
1154 if (exists $deprecated_disablables{$feature}) {
1155 warn "***** config $target enables deprecated feature $feature\n";
1156 } elsif (!grep { $feature eq $_ } @disablables) {
1157 die "***** config $target enables unknown feature $feature\n";
1158 }
7a8a35ff 1159 delete $disabled{$feature};
906eb3d0
RL
1160 }
1161}
1162
abe256e7
RL
1163$target{CXXFLAGS}//=$target{CFLAGS} if $target{CXX};
1164$target{cxxflags}//=$target{cflags} if $target{CXX};
9dd4ed28 1165$target{exe_extension}=".exe" if ($config{target} eq "DJGPP");
107b5792 1166$target{exe_extension}=".pm" if ($config{target} =~ /vos/);
e987f9f2 1167
9e265322
RL
1168# Fill %config with values from %user, and in case those are undefined or
1169# empty, use values from %target (acting as a default).
5b18235a 1170foreach (keys %user) {
5b18235a
RL
1171 my $ref_type = ref $user{$_};
1172
1173 # Temporary function. Takes an intended ref type (empty string or "ARRAY")
1174 # and a value that's to be coerced into that type.
1175 my $mkvalue = sub {
1176 my $type = shift;
1177 my $value = shift;
1178 my $undef_p = shift;
1179
1180 die "Too many arguments for \$mkvalue" if @_;
1181
1182 while (ref $value eq 'CODE') {
1183 $value = $value->();
1184 }
1185
1186 if ($type eq 'ARRAY') {
1187 return undef unless defined $value;
1188 return undef if ref $value ne 'ARRAY' && !$value;
1189 return undef if ref $value eq 'ARRAY' && !@$value;
1190 return [ $value ] unless ref $value eq 'ARRAY';
1191 }
1192 return undef unless $value;
1193 return $value;
1194 };
1195
abe256e7 1196 $config{$_} =
5b18235a 1197 $mkvalue->($ref_type, $user{$_})
abe256e7
RL
1198 || $mkvalue->($ref_type, $target{$_});
1199 delete $config{$_} unless defined $config{$_};
5b18235a 1200}
aaf878cc 1201
c1a09254
RL
1202# Finish up %config by appending things the user gave us on the command line
1203# apart from "make variables"
1204foreach (keys %useradd) {
1205 # The must all be lists, so we assert that here
1206 die "internal error: \$useradd{$_} isn't an ARRAY\n"
1207 unless ref $useradd{$_} eq 'ARRAY';
1208
1209 if (defined $config{$_}) {
1210 push @{$config{$_}}, @{$useradd{$_}};
1211 } else {
1212 $config{$_} = [ @{$useradd{$_}} ];
1213 }
1214}
1215# At this point, we can forget everything about %user and %useradd,
1216# because it's now all been merged into the corresponding $config entry
1217
8b5156d1 1218# Allow overriding the build file name
5b18235a 1219$config{build_file} = env('BUILDFILE') || $target{build_file} || "Makefile";
bd5192b1 1220
75d47db4
RL
1221######################################################################
1222# Build up information for skipping certain directories depending on disabled
1223# features, as well as setting up macros for disabled features.
1224
1225# This is a tentative database of directories to skip. Some entries may not
1226# correspond to anything real, but that's ok, they will simply be ignored.
1227# The actual processing of these entries is done in the build.info lookup
1228# loop further down.
1229#
1230# The key is a Unix formated path in the source tree, the value is an index
1231# into %disabled_info, so any existing path gets added to a corresponding
1232# 'skipped' entry in there with the list of skipped directories.
1233my %skipdir = ();
ca372414
RL
1234my %disabled_info = (); # For configdata.pm
1235foreach my $what (sort keys %disabled) {
469ce8ff
RL
1236 # There are deprecated disablables that translate to themselves.
1237 # They cause disabling cascades, but should otherwise not regiter.
1238 next if $deprecated_disablables{$what};
1239
ca372414
RL
1240 $config{options} .= " no-$what";
1241
e7545517
MC
1242 if (!grep { $what eq $_ } ( 'buildtest-c++', 'fips', 'threads', 'shared',
1243 'module', 'pic', 'dynamic-engine', 'makedepend',
d0308923 1244 'zlib-dynamic', 'zlib', 'sse2', 'legacy' )) {
ca372414 1245 (my $WHAT = uc $what) =~ s|-|_|g;
75d47db4 1246 my $skipdir = $what;
ca372414
RL
1247
1248 # fix-up crypto/directory name(s)
75d47db4
RL
1249 $skipdir = "ripemd" if $what eq "rmd160";
1250 $skipdir = "whrlpool" if $what eq "whirlpool";
ca372414
RL
1251
1252 my $macro = $disabled_info{$what}->{macro} = "OPENSSL_NO_$WHAT";
75d47db4 1253 push @{$config{openssl_feature_defines}}, $macro;
ca372414 1254
75d47db4
RL
1255 $skipdir{engines} = $what if $what eq 'engine';
1256 $skipdir{"crypto/$skipdir"} = $what
1257 unless $what eq 'async' || $what eq 'err';
ca372414
RL
1258 }
1259}
1260
291e94df
RL
1261# Make sure build_scheme is consistent.
1262$target{build_scheme} = [ $target{build_scheme} ]
1263 if ref($target{build_scheme}) ne "ARRAY";
1264
ddf1847d
RL
1265my ($builder, $builder_platform, @builder_opts) =
1266 @{$target{build_scheme}};
1267
d192a3aa
RL
1268foreach my $checker (($builder_platform."-".$target{build_file}."-checker.pm",
1269 $builder_platform."-checker.pm")) {
1270 my $checker_path = catfile($srcdir, "Configurations", $checker);
1271 if (-f $checker_path) {
1272 my $fn = $ENV{CONFIGURE_CHECKER_WARN}
1273 ? sub { warn $@; } : sub { die $@; };
1274 if (! do $checker_path) {
1275 if ($@) {
1276 $fn->($@);
1277 } elsif ($!) {
1278 $fn->($!);
1279 } else {
1280 $fn->("The detected tools didn't match the platform\n");
1281 }
1282 }
1283 last;
1284 }
1285}
1286
488e2b0f
RL
1287push @{$config{defines}}, "NDEBUG" if $config{build_type} eq "release";
1288
abe256e7 1289if ($target =~ /^mingw/ && `$config{CC} --target-help 2>&1` =~ m/-mno-cygwin/m)
84f32c84
DMSP
1290 {
1291 push @{$config{cflags}}, "-mno-cygwin";
1292 push @{$config{cxxflags}}, "-mno-cygwin" if $config{CXX};
1293 push @{$config{shared_ldflag}}, "-mno-cygwin";
1294 }
cbecd29a 1295
5b18235a 1296if ($target =~ /linux.*-mips/ && !$disabled{asm}
c1a09254 1297 && !grep { $_ !~ /-m(ips|arch=)/ } (@{$config{CFLAGS}})) {
84f32c84
DMSP
1298 # minimally required architecture flags for assembly modules
1299 my $value;
1300 $value = '-mips2' if ($target =~ /mips32/);
1301 $value = '-mips3' if ($target =~ /mips64/);
1302 unshift @{$config{cflags}}, $value;
1303 unshift @{$config{cxxflags}}, $value if $config{CXX};
63d8834c
AP
1304}
1305
9c62a279
RL
1306# If threads aren't disabled, check how possible they are
1307unless ($disabled{threads}) {
1308 if ($auto_threads) {
1309 # Enabled by default, disable it forcibly if unavailable
1310 if ($target{thread_scheme} eq "(unknown)") {
1311 $disabled{threads} = "unavailable";
1312 }
1313 } else {
8483a003 1314 # The user chose to enable threads explicitly, let's see
9c62a279
RL
1315 # if there's a chance that's possible
1316 if ($target{thread_scheme} eq "(unknown)") {
1317 # If the user asked for "threads" and we don't have internal
1318 # knowledge how to do it, [s]he is expected to provide any
1319 # system-dependent compiler options that are necessary. We
1320 # can't truly check that the given options are correct, but
1321 # we expect the user to know what [s]He is doing.
c1a09254 1322 if (!@{$config{CFLAGS}} && !@{$config{CPPDEFINES}}) {
9c62a279
RL
1323 die "You asked for multi-threading support, but didn't\n"
1324 ,"provide any system-specific compiler options\n";
1325 }
1326 }
1327 }
1328}
1329
1330# If threads still aren't disabled, add a C macro to ensure the source
1331# code knows about it. Any other flag is taken care of by the configs.
1332unless($disabled{threads}) {
e0bf7c01 1333 push @{$config{openssl_feature_defines}}, "OPENSSL_THREADS";
9c62a279 1334}
e452de9d 1335
98186eb4
VD
1336# With "deprecated" disable all deprecated features.
1337if (defined($disabled{"deprecated"})) {
107b5792 1338 $config{api} = $maxapi;
98186eb4 1339}
07c4c14c 1340
8c3bc594 1341my $no_shared_warn=0;
291e94df 1342if ($target{shared_target} eq "")
84f32c84
DMSP
1343 {
1344 $no_shared_warn = 1
1345 if (!$disabled{shared} || !$disabled{"dynamic-engine"});
84f32c84 1346 $disabled{pic} = $disabled{shared} = $disabled{"dynamic-engine"} =
34786bde 1347 $disabled{module} = "no-shared-target";
84f32c84 1348 }
b436a982 1349
19ab5790 1350if ($disabled{"dynamic-engine"}) {
e0bf7c01 1351 push @{$config{openssl_feature_defines}}, "OPENSSL_NO_DYNAMIC_ENGINE";
343ec2b0 1352 $config{dynamic_engines} = 0;
19ab5790 1353} else {
e0bf7c01 1354 push @{$config{openssl_feature_defines}}, "OPENSSL_NO_STATIC_ENGINE";
19ab5790 1355 $config{dynamic_engines} = 1;
343ec2b0 1356}
ecd45314 1357
c38bb727 1358unless ($disabled{asan}) {
5b18235a 1359 push @{$config{cflags}}, "-fsanitize=address";
abe256e7 1360 push @{$config{cxxflags}}, "-fsanitize=address" if $config{CXX};
c38bb727
BL
1361}
1362
1363unless ($disabled{ubsan}) {
f430ba31 1364 # -DPEDANTIC or -fnosanitize=alignment may also be required on some
c38bb727 1365 # platforms.
5b18235a 1366 push @{$config{cflags}}, "-fsanitize=undefined", "-fno-sanitize-recover=all";
fa153b57 1367 push @{$config{cxxflags}}, "-fsanitize=undefined", "-fno-sanitize-recover=all"
abe256e7 1368 if $config{CXX};
c38bb727
BL
1369}
1370
29df3061 1371unless ($disabled{msan}) {
5b18235a 1372 push @{$config{cflags}}, "-fsanitize=memory";
abe256e7 1373 push @{$config{cxxflags}}, "-fsanitize=memory" if $config{CXX};
29df3061
EK
1374}
1375
65cc6d5c 1376unless ($disabled{"fuzz-libfuzzer"} && $disabled{"fuzz-afl"}
29df3061 1377 && $disabled{asan} && $disabled{ubsan} && $disabled{msan}) {
5b18235a 1378 push @{$config{cflags}}, "-fno-omit-frame-pointer", "-g";
abe256e7 1379 push @{$config{cxxflags}}, "-fno-omit-frame-pointer", "-g" if $config{CXX};
c38bb727 1380}
c313e32a
AP
1381#
1382# Platform fix-ups
1383#
ae48242c
RL
1384
1385# This saves the build files from having to check
1386if ($disabled{pic})
84f32c84
DMSP
1387 {
1388 foreach (qw(shared_cflag shared_cxxflag shared_cppflag
1389 shared_defines shared_includes shared_ldflag
1390 module_cflags module_cxxflags module_cppflags
1391 module_defines module_includes module_lflags))
1392 {
1393 delete $config{$_};
1394 $target{$_} = "";
1395 }
1396 }
4f16039e 1397else
84f32c84
DMSP
1398 {
1399 push @{$config{lib_defines}}, "OPENSSL_PIC";
1400 }
ae48242c 1401
291e94df 1402if ($target{sys_id} ne "")
84f32c84
DMSP
1403 {
1404 push @{$config{openssl_sys_defines}}, "OPENSSL_SYS_$target{sys_id}";
1405 }
cf1b7d96 1406
00b0d663 1407unless ($disabled{asm}) {
d2b2221a 1408 $target{cpuid_asm_src}=$table{DEFAULTS}->{cpuid_asm_src} if ($config{processor} eq "386");
68b8bcf4 1409 push @{$config{lib_defines}}, "OPENSSL_CPUID_OBJ" if ($target{cpuid_asm_src} ne "mem_clr.c");
2ad2281a 1410
9fe2bb77 1411 $target{bn_asm_src} =~ s/\w+-gf2m.c// if (defined($disabled{ec2m}));
f8c469de 1412
9e0724a1 1413 # bn-586 is the only one implementing bn_*_part_words
68b8bcf4
RL
1414 push @{$config{lib_defines}}, "OPENSSL_BN_ASM_PART_WORDS" if ($target{bn_asm_src} =~ /bn-586/);
1415 push @{$config{lib_defines}}, "OPENSSL_IA32_SSE2" if (!$disabled{sse2} && $target{bn_asm_src} =~ /86/);
dfeab068 1416
68b8bcf4
RL
1417 push @{$config{lib_defines}}, "OPENSSL_BN_ASM_MONT" if ($target{bn_asm_src} =~ /-mont/);
1418 push @{$config{lib_defines}}, "OPENSSL_BN_ASM_MONT5" if ($target{bn_asm_src} =~ /-mont5/);
1419 push @{$config{lib_defines}}, "OPENSSL_BN_ASM_GF2m" if ($target{bn_asm_src} =~ /-gf2m/);
31703da3 1420 push @{$config{lib_defines}}, "BN_DIV3W" if ($target{bn_asm_src} =~ /-div3w/);
5ac7bde7 1421
9fe2bb77 1422 if ($target{sha1_asm_src}) {
84f32c84
DMSP
1423 push @{$config{lib_defines}}, "SHA1_ASM" if ($target{sha1_asm_src} =~ /sx86/ || $target{sha1_asm_src} =~ /sha1/);
1424 push @{$config{lib_defines}}, "SHA256_ASM" if ($target{sha1_asm_src} =~ /sha256/);
1425 push @{$config{lib_defines}}, "SHA512_ASM" if ($target{sha1_asm_src} =~ /sha512/);
9e0724a1 1426 }
e4739e31 1427 if ($target{keccak1600_asm_src} ne $table{DEFAULTS}->{keccak1600_asm_src}) {
84f32c84 1428 push @{$config{lib_defines}}, "KECCAK1600_ASM";
e4739e31 1429 }
216e8d91 1430 if ($target{rc4_asm_src} ne $table{DEFAULTS}->{rc4_asm_src}) {
84f32c84 1431 push @{$config{lib_defines}}, "RC4_ASM";
216e8d91 1432 }
9fe2bb77 1433 if ($target{md5_asm_src}) {
84f32c84 1434 push @{$config{lib_defines}}, "MD5_ASM";
9e0724a1 1435 }
d2b2221a 1436 $target{cast_asm_src}=$table{DEFAULTS}->{cast_asm_src} unless $disabled{pic}; # CAST assembler is not PIC
9fe2bb77 1437 if ($target{rmd160_asm_src}) {
84f32c84 1438 push @{$config{lib_defines}}, "RMD160_ASM";
9e0724a1 1439 }
9fe2bb77 1440 if ($target{aes_asm_src}) {
84f32c84
DMSP
1441 push @{$config{lib_defines}}, "AES_ASM" if ($target{aes_asm_src} =~ m/\baes-/);;
1442 # aes-ctr.fake is not a real file, only indication that assembler
1443 # module implements AES_ctr32_encrypt...
1444 push @{$config{lib_defines}}, "AES_CTR_ASM" if ($target{aes_asm_src} =~ s/\s*aes-ctr\.fake//);
1445 # aes-xts.fake indicates presence of AES_xts_[en|de]crypt...
1446 push @{$config{lib_defines}}, "AES_XTS_ASM" if ($target{aes_asm_src} =~ s/\s*aes-xts\.fake//);
1447 $target{aes_asm_src} =~ s/\s*(vpaes|aesni)-x86\.s//g if ($disabled{sse2});
1448 push @{$config{lib_defines}}, "VPAES_ASM" if ($target{aes_asm_src} =~ m/vpaes/);
1449 push @{$config{lib_defines}}, "BSAES_ASM" if ($target{aes_asm_src} =~ m/bsaes/);
9e0724a1 1450 }
9fe2bb77 1451 if ($target{wp_asm_src} =~ /mmx/) {
46d4d865 1452 if ($config{processor} eq "386") {
84f32c84
DMSP
1453 $target{wp_asm_src}=$table{DEFAULTS}->{wp_asm_src};
1454 } elsif (!$disabled{"whirlpool"}) {
1455 push @{$config{lib_defines}}, "WHIRLPOOL_ASM";
1456 }
9e0724a1 1457 }
9fe2bb77 1458 if ($target{modes_asm_src} =~ /ghash-/) {
84f32c84 1459 push @{$config{lib_defines}}, "GHASH_ASM";
9e0724a1 1460 }
9fe2bb77 1461 if ($target{ec_asm_src} =~ /ecp_nistz256/) {
84f32c84 1462 push @{$config{lib_defines}}, "ECP_NISTZ256_ASM";
9e0724a1 1463 }
0e5c8d56 1464 if ($target{ec_asm_src} =~ /x25519/) {
84f32c84 1465 push @{$config{lib_defines}}, "X25519_ASM";
0e5c8d56 1466 }
7b176a54 1467 if ($target{padlock_asm_src} ne $table{DEFAULTS}->{padlock_asm_src}) {
84f32c84 1468 push @{$config{dso_defines}}, "PADLOCK_ASM";
7b176a54 1469 }
9fe2bb77 1470 if ($target{poly1305_asm_src} ne "") {
84f32c84 1471 push @{$config{lib_defines}}, "POLY1305_ASM";
9e0724a1
RL
1472 }
1473}
d02b48c6 1474
e373c70a
RL
1475my %predefined_C = compiler_predefined($config{CROSS_COMPILE}.$config{CC});
1476my %predefined_CXX = $config{CXX}
1477 ? compiler_predefined($config{CROSS_COMPILE}.$config{CXX})
1478 : ();
54cf3b98 1479
fe191b49 1480# Check for makedepend capabilities.
6d75a83c 1481if (!$disabled{makedepend}) {
fe191b49
RL
1482 if ($config{target} =~ /^(VC|vms)-/) {
1483 # For VC- and vms- targets, there's nothing more to do here. The
1484 # functionality is hard coded in the corresponding build files for
1485 # cl (Windows) and CC/DECC (VMS).
e373c70a 1486 } elsif (($predefined_C{__GNUC__} // -1) >= 3
84f32c84 1487 && !($predefined_C{__APPLE_CC__} && !$predefined_C{__clang__})) {
fe191b49 1488 # We know that GNU C version 3 and up as well as all clang
717f308e
TS
1489 # versions support dependency generation, but Xcode did not
1490 # handle $cc -M before clang support (but claims __GNUC__ = 3)
abe256e7 1491 $config{makedepprog} = "\$(CROSS_COMPILE)$config{CC}";
6d75a83c 1492 } else {
fe191b49
RL
1493 # In all other cases, we look for 'makedepend', and disable the
1494 # capability if not found.
6d75a83c
RL
1495 $config{makedepprog} = which('makedepend');
1496 $disabled{makedepend} = "unavailable" unless $config{makedepprog};
54cf3b98 1497 }
f1f07a23 1498}
8ed40b83 1499
e373c70a 1500if (!$disabled{asm} && !$predefined_C{__MACH__} && $^O ne 'VMS') {
0ad4078c 1501 # probe for -Wa,--noexecstack option...
e373c70a 1502 if ($predefined_C{__clang__}) {
0ad4078c
AP
1503 # clang has builtin assembler, which doesn't recognize --help,
1504 # but it apparently recognizes the option in question on all
1505 # supported platforms even when it's meaningless. In other words
1506 # probe would fail, but probed option always accepted...
1507 push @{$config{cflags}}, "-Wa,--noexecstack", "-Qunused-arguments";
8e5da579 1508 } else {
0ad4078c
AP
1509 my $cc = $config{CROSS_COMPILE}.$config{CC};
1510 open(PIPE, "$cc -Wa,--help -c -o null.$$.o -x assembler /dev/null 2>&1 |");
1511 while(<PIPE>) {
1512 if (m/--noexecstack/) {
1513 push @{$config{cflags}}, "-Wa,--noexecstack";
1514 last;
1515 }
1516 }
1517 close(PIPE);
1518 unlink("null.$$.o");
1519 }
1520}
7d130f68
RL
1521
1522# Deal with bn_ops ###################################################
1523
84f32c84
DMSP
1524$config{bn_ll} =0;
1525$config{export_var_as_fn} =0;
7d130f68 1526my $def_int="unsigned int";
84f32c84 1527$config{rc4_int} =$def_int;
b4f35e5e 1528($config{b64l},$config{b64},$config{b32})=(0,0,1);
7d130f68 1529
94af0cd7 1530my $count = 0;
7d130f68 1531foreach (sort split(/\s+/,$target{bn_ops})) {
94af0cd7
RS
1532 $count++ if /SIXTY_FOUR_BIT|SIXTY_FOUR_BIT_LONG|THIRTY_TWO_BIT/;
1533 $config{export_var_as_fn}=1 if $_ eq 'EXPORT_VAR_AS_FN';
84f32c84
DMSP
1534 $config{bn_ll}=1 if $_ eq 'BN_LLONG';
1535 $config{rc4_int}="unsigned char" if $_ eq 'RC4_CHAR';
94af0cd7 1536 ($config{b64l},$config{b64},$config{b32})
84f32c84 1537 =(0,1,0) if $_ eq 'SIXTY_FOUR_BIT';
94af0cd7 1538 ($config{b64l},$config{b64},$config{b32})
84f32c84 1539 =(1,0,0) if $_ eq 'SIXTY_FOUR_BIT_LONG';
94af0cd7 1540 ($config{b64l},$config{b64},$config{b32})
84f32c84 1541 =(0,0,1) if $_ eq 'THIRTY_TWO_BIT';
7d130f68 1542}
94af0cd7
RS
1543die "Exactly one of SIXTY_FOUR_BIT|SIXTY_FOUR_BIT_LONG|THIRTY_TWO_BIT can be set in bn_ops\n"
1544 if $count > 1;
7d130f68
RL
1545
1546
1547# Hack cflags for better warnings (dev option) #######################
1548
fa153b57
RL
1549# "Stringify" the C and C++ flags string. This permits it to be made part of
1550# a string and works as well on command lines.
5b18235a
RL
1551$config{cflags} = [ map { (my $x = $_) =~ s/([\\\"])/\\$1/g; $x }
1552 @{$config{cflags}} ];
fa153b57 1553$config{cxxflags} = [ map { (my $x = $_) =~ s/([\\\"])/\\$1/g; $x }
abe256e7 1554 @{$config{cxxflags}} ] if $config{CXX};
b436a982 1555
fcd2d5a6
RL
1556$config{openssl_api_defines} = [
1557 "OPENSSL_MIN_API=".($apitable->{$config{api} // ""} // -1)
1558];
98186eb4 1559
e373c70a 1560my %strict_warnings_collection=( CFLAGS => [], CXXFLAGS => []);
0c28f277 1561if ($strict_warnings)
84f32c84
DMSP
1562 {
1563 my $wopt;
1564 my $gccver = $predefined_C{__GNUC__} // -1;
1565 my $gxxver = $predefined_CXX{__GNUC__} // -1;
6d50589c 1566
84f32c84 1567 warn "WARNING --strict-warnings requires gcc[>=4] or gcc-alike"
6d50589c 1568 unless $gccver >= 4;
84f32c84 1569 warn "WARNING --strict-warnings requires g++[>=4] or g++-alike"
e373c70a 1570 unless $gxxver >= 4;
84f32c84
DMSP
1571 foreach (qw(CFLAGS CXXFLAGS))
1572 {
1573 push @{$strict_warnings_collection{$_}},
1574 @{$gcc_devteam_warn{$_}};
1575 }
1576 push @{$strict_warnings_collection{CFLAGS}},
1577 @{$clang_devteam_warn{CFLAGS}}
1578 if (defined($predefined_C{__clang__}));
1579 push @{$strict_warnings_collection{CXXFLAGS}},
1580 @{$clang_devteam_warn{CXXFLAGS}}
1581 if (defined($predefined_CXX{__clang__}));
1582 }
4650d10f
RL
1583
1584if (grep { $_ eq '-static' } @{$config{LDFLAGS}}) {
1585 $disabled{"pic"} = "forced";
1586 $disabled{"shared"} = "forced";
1587 $disabled{"threads"} = "forced";
1588}
1589
e373c70a 1590foreach my $idx (qw(CFLAGS CXXFLAGS))
fcee5394 1591 {
c1a09254
RL
1592 $config{$idx} = [ map { $_ eq '--ossl-strict-warnings'
1593 ? @{$strict_warnings_collection{$idx}}
1594 : ( $_ ) }
1595 @{$config{$idx}} ];
fcee5394 1596 }
ef8ca6bd
RL
1597
1598unless ($disabled{"crypto-mdebug-backtrace"})
84f32c84
DMSP
1599 {
1600 foreach my $wopt (split /\s+/, $memleak_devteam_backtrace)
1601 {
1602 push @{$config{cflags}}, $wopt
1603 unless grep { $_ eq $wopt } @{$config{cflags}};
1604 push @{$config{cxxflags}}, $wopt
1605 if ($config{CXX}
1606 && !grep { $_ eq $wopt } @{$config{cxxflags}});
1607 }
1608 if ($target =~ /^BSD-/)
1609 {
1610 push @{$config{ex_libs}}, "-lexecinfo";
1611 }
1612 }
0c28f277 1613
c91a0a83
EK
1614unless ($disabled{afalgeng}) {
1615 $config{afalgeng}="";
9e381e8a 1616 if (grep { $_ eq 'afalgeng' } @{$target{enable}}) {
79fff39d 1617 my $minver = 4*10000 + 1*100 + 0;
abe256e7 1618 if ($config{CROSS_COMPILE} eq "") {
79fff39d
RL
1619 my $verstr = `uname -r`;
1620 my ($ma, $mi1, $mi2) = split("\\.", $verstr);
1621 ($mi2) = $mi2 =~ /(\d+)/;
1622 my $ver = $ma*10000 + $mi1*100 + $mi2;
1623 if ($ver < $minver) {
c91a0a83 1624 $disabled{afalgeng} = "too-old-kernel";
79fff39d
RL
1625 } else {
1626 push @{$config{engdirs}}, "afalg";
1627 }
68dc37c1
MC
1628 } else {
1629 $disabled{afalgeng} = "cross-compiling";
6cba4a66 1630 }
79fff39d 1631 } else {
c91a0a83 1632 $disabled{afalgeng} = "not-linux";
7f458a48 1633 }
1634}
8da00a38 1635
e0bf7c01 1636push @{$config{openssl_feature_defines}}, "OPENSSL_NO_AFALGENG" if ($disabled{afalgeng});
7f458a48 1637
69495e3d
BP
1638unless ($disabled{ktls}) {
1639 $config{ktls}="";
1640 if ($target =~ m/^linux/) {
1641 my $usr = "/usr/$config{cross_compile_prefix}";
1642 chop($usr);
1643 if ($config{cross_compile_prefix} eq "") {
1644 $usr = "/usr";
1645 }
1646 my $minver = (4 << 16) + (13 << 8) + 0;
1647 my @verstr = split(" ",`cat $usr/include/linux/version.h | grep LINUX_VERSION_CODE`);
1648
1649 if ($verstr[2] < $minver) {
1650 $disabled{ktls} = "too-old-kernel";
1651 }
1652 } else {
1653 $disabled{ktls} = "not-linux";
1654 }
1655}
1656
1657push @{$config{openssl_other_defines}}, "OPENSSL_NO_KTLS" if ($disabled{ktls});
1658
5b18235a
RL
1659# ALL MODIFICATIONS TO %config and %target MUST BE DONE FROM HERE ON
1660
9fe2bb77
RL
1661# If we use the unified build, collect information from build.info files
1662my %unified_info = ();
1663
2b6b606c 1664my $buildinfo_debug = defined($ENV{CONFIGURE_DEBUG_BUILDINFO});
ddf1847d 1665if ($builder eq "unified") {
9fe2bb77
RL
1666 use with_fallback qw(Text::Template);
1667
9fe2bb77 1668 sub cleandir {
2e963849 1669 my $base = shift;
9fe2bb77 1670 my $dir = shift;
2e963849
RL
1671 my $relativeto = shift || ".";
1672
1673 $dir = catdir($base,$dir) unless isabsolute($dir);
9fe2bb77 1674
ec182ef0
RL
1675 # Make sure the directories we're building in exists
1676 mkpath($dir);
1677
2e963849 1678 my $res = abs2rel(absolutedir($dir), rel2abs($relativeto));
9fe2bb77
RL
1679 #print STDERR "DEBUG[cleandir]: $dir , $base => $res\n";
1680 return $res;
1681 }
1682
1683 sub cleanfile {
2e963849 1684 my $base = shift;
9fe2bb77 1685 my $file = shift;
2e963849
RL
1686 my $relativeto = shift || ".";
1687
1688 $file = catfile($base,$file) unless isabsolute($file);
1689
9fe2bb77
RL
1690 my $d = dirname($file);
1691 my $f = basename($file);
1692
ec182ef0
RL
1693 # Make sure the directories we're building in exists
1694 mkpath($d);
1695
2e963849 1696 my $res = abs2rel(catfile(absolutedir($d), $f), rel2abs($relativeto));
9fe2bb77
RL
1697 #print STDERR "DEBUG[cleanfile]: $d , $f => $res\n";
1698 return $res;
1699 }
1700
1967a42e
RL
1701 # Store the name of the template file we will build the build file from
1702 # in %config. This may be useful for the build file itself.
1703 my @build_file_template_names =
84f32c84
DMSP
1704 ( $builder_platform."-".$target{build_file}.".tmpl",
1705 $target{build_file}.".tmpl" );
1967a42e
RL
1706 my @build_file_templates = ();
1707
1708 # First, look in the user provided directory, if given
7ecdf18d 1709 if (defined env($local_config_envname)) {
84f32c84
DMSP
1710 @build_file_templates =
1711 map {
1712 if ($^O eq 'VMS') {
1713 # VMS environment variables are logical names,
1714 # which can be used as is
1715 $local_config_envname . ':' . $_;
1716 } else {
1717 catfile(env($local_config_envname), $_);
1718 }
1719 }
1720 @build_file_template_names;
1967a42e
RL
1721 }
1722 # Then, look in our standard directory
1723 push @build_file_templates,
84f32c84
DMSP
1724 ( map { cleanfile($srcdir, catfile("Configurations", $_), $blddir) }
1725 @build_file_template_names );
1967a42e
RL
1726
1727 my $build_file_template;
1728 for $_ (@build_file_templates) {
84f32c84 1729 $build_file_template = $_;
1967a42e
RL
1730 last if -f $build_file_template;
1731
1732 $build_file_template = undef;
1733 }
1734 if (!defined $build_file_template) {
84f32c84 1735 die "*** Couldn't find any of:\n", join("\n", @build_file_templates), "\n";
1967a42e
RL
1736 }
1737 $config{build_file_templates}
8258975c
RL
1738 = [ cleanfile($srcdir, catfile("Configurations", "common0.tmpl"),
1739 $blddir),
1740 $build_file_template,
1967a42e
RL
1741 cleanfile($srcdir, catfile("Configurations", "common.tmpl"),
1742 $blddir) ];
1743
7f73eafe 1744 my @build_dirs = ( [ ] ); # current directory
9fe2bb77 1745
2e0956ba
RL
1746 $config{build_infos} = [ ];
1747
d201dbc9 1748 my %ordinals = ();
7f73eafe
RL
1749 while (@build_dirs) {
1750 my @curd = @{shift @build_dirs};
1751 my $sourced = catdir($srcdir, @curd);
1752 my $buildd = catdir($blddir, @curd);
9fe2bb77 1753
75d47db4
RL
1754 my $unixdir = join('/', @curd);
1755 if (exists $skipdir{$unixdir}) {
1756 my $what = $skipdir{$unixdir};
1757 push @{$disabled_info{$what}->{skipped}}, catdir(@curd);
1758 next;
1759 }
1760
dca99383 1761 mkpath($buildd);
9fe2bb77 1762
7f73eafe 1763 my $f = 'build.info';
9fe2bb77
RL
1764 # The basic things we're trying to build
1765 my @programs = ();
1766 my @libraries = ();
1842f369 1767 my @modules = ();
9fe2bb77 1768 my @scripts = ();
9fe2bb77 1769
c91f24d4 1770 my %attributes = ();
9fe2bb77 1771 my %sources = ();
2a08d1a0 1772 my %shared_sources = ();
9fe2bb77 1773 my %includes = ();
b96ab5e6 1774 my %defines = ();
9fe2bb77 1775 my %depends = ();
ae4c7450 1776 my %generate = ();
9fe2bb77 1777
846e4c4d
RL
1778 # We want to detect configdata.pm in the source tree, so we
1779 # don't use it if the build tree is different.
1780 my $src_configdata = cleanfile($srcdir, "configdata.pm", $blddir);
1781
2e0956ba 1782 push @{$config{build_infos}}, catfile(abs2rel($sourced, $blddir), $f);
cb6afcd6
RL
1783 my $template =
1784 Text::Template->new(TYPE => 'FILE',
1785 SOURCE => catfile($sourced, $f),
1786 PREPEND => qq{use lib "$FindBin::Bin/util/perl";});
9fe2bb77
RL
1787 die "Something went wrong with $sourced/$f: $!\n" unless $template;
1788 my @text =
1789 split /^/m,
1790 $template->fill_in(HASH => { config => \%config,
1791 target => \%target,
9e04edf2 1792 disabled => \%disabled,
f59d0131 1793 withargs => \%withargs,
9fe2bb77
RL
1794 builddir => abs2rel($buildd, $blddir),
1795 sourcedir => abs2rel($sourced, $blddir),
1796 buildtop => abs2rel($blddir, $blddir),
1797 sourcetop => abs2rel($srcdir, $blddir) },
1798 DELIMITERS => [ "{-", "-}" ]);
1799
1800 # The top item of this stack has the following values
1801 # -2 positive already run and we found ELSE (following ELSIF should fail)
1802 # -1 positive already run (skip until ENDIF)
1803 # 0 negatives so far (if we're at a condition, check it)
1804 # 1 last was positive (don't skip lines until next ELSE, ELSIF or ENDIF)
1805 # 2 positive ELSE (following ELSIF should fail)
1806 my @skip = ();
1807 collect_information(
1808 collect_from_array([ @text ],
1809 qr/\\$/ => sub { my $l1 = shift; my $l2 = shift;
1810 $l1 =~ s/\\$//; $l1.$l2 }),
1811 # Info we're looking for
1812 qr/^\s*IF\[((?:\\.|[^\\\]])*)\]\s*$/
635bd409 1813 => sub {
c5798e0e 1814 if (! @skip || $skip[$#skip] > 0) {
635bd409
RL
1815 push @skip, !! $1;
1816 } else {
1817 push @skip, -1;
1818 }
1819 },
9fe2bb77
RL
1820 qr/^\s*ELSIF\[((?:\\.|[^\\\]])*)\]\s*$/
1821 => sub { die "ELSIF out of scope" if ! @skip;
1822 die "ELSIF following ELSE" if abs($skip[$#skip]) == 2;
1823 $skip[$#skip] = -1 if $skip[$#skip] != 0;
1824 $skip[$#skip] = !! $1
1825 if $skip[$#skip] == 0; },
1826 qr/^\s*ELSE\s*$/
1827 => sub { die "ELSE out of scope" if ! @skip;
1828 $skip[$#skip] = -2 if $skip[$#skip] != 0;
1829 $skip[$#skip] = 2 if $skip[$#skip] == 0; },
1830 qr/^\s*ENDIF\s*$/
1831 => sub { die "ENDIF out of scope" if ! @skip;
1832 pop @skip; },
7f73eafe
RL
1833 qr/^\s*SUBDIRS\s*=\s*(.*)\s*$/
1834 => sub {
1835 if (!@skip || $skip[$#skip] > 0) {
1836 foreach (tokenize($1)) {
1837 push @build_dirs, [ @curd, splitdir($_, 1) ];
1838 }
1839 }
1840 },
c91f24d4 1841 qr/^\s*PROGRAMS(?:{([\w=]+(?:\s*,\s*[\w=]+)*)})?\s*=\s*(.*)\s*$/
7f5af797
RL
1842 => sub {
1843 if (!@skip || $skip[$#skip] > 0) {
c91f24d4
RL
1844 my @a = tokenize($1, qr|\s*,\s*|);
1845 my @p = tokenize($2);
1846 push @programs, @p;
1847 foreach my $a (@a) {
1848 my $ak = $a;
1849 my $av = 1;
1850 if ($a =~ m|^(.*?)\s*=\s*(.*?)$|) {
1851 $ak = $1;
1852 $av = $2;
1853 }
1854 foreach my $p (@p) {
1855 $attributes{$p}->{$ak} = $av;
1856 }
1857 }
7f5af797
RL
1858 }
1859 },
c91f24d4 1860 qr/^\s*LIBS(?:{([\w=]+(?:\s*,\s*[\w=]+)*)})?\s*=\s*(.*)\s*$/
7f5af797
RL
1861 => sub {
1862 if (!@skip || $skip[$#skip] > 0) {
c91f24d4
RL
1863 my @a = tokenize($1, qr|\s*,\s*|);
1864 my @l = tokenize($2);
1865 push @libraries, @l;
1866 foreach my $a (@a) {
1867 my $ak = $a;
1868 my $av = 1;
1869 if ($a =~ m|^(.*?)\s*=\s*(.*?)$|) {
1870 $ak = $1;
1871 $av = $2;
1872 }
1873 foreach my $l (@l) {
1874 $attributes{$l}->{$ak} = $av;
1875 }
1876 }
7f5af797
RL
1877 }
1878 },
1842f369 1879 qr/^\s*MODULES(?:{([\w=]+(?:\s*,\s*[\w=]+)*)})?\s*=\s*(.*)\s*$/
7f5af797
RL
1880 => sub {
1881 if (!@skip || $skip[$#skip] > 0) {
c91f24d4 1882 my @a = tokenize($1, qr|\s*,\s*|);
1842f369
RL
1883 my @m = tokenize($2);
1884 push @modules, @m;
c91f24d4
RL
1885 foreach my $a (@a) {
1886 my $ak = $a;
1887 my $av = 1;
1888 if ($a =~ m|^(.*?)\s*=\s*(.*?)$|) {
1889 $ak = $1;
1890 $av = $2;
1891 }
1842f369
RL
1892 foreach my $m (@m) {
1893 $attributes{$m}->{$ak} = $av;
c91f24d4
RL
1894 }
1895 }
7f5af797
RL
1896 }
1897 },
c91f24d4 1898 qr/^\s*SCRIPTS(?:{([\w=]+(?:\s*,\s*[\w=]+)*)})?\s*=\s*(.*)\s*$/
7f5af797
RL
1899 => sub {
1900 if (!@skip || $skip[$#skip] > 0) {
c91f24d4
RL
1901 my @a = tokenize($1, qr|\s*,\s*|);
1902 my @s = tokenize($2);
1903 push @scripts, @s;
1904 foreach my $a (@a) {
1905 my $ak = $a;
1906 my $av = 1;
1907 if ($a =~ m|^(.*?)\s*=\s*(.*?)$|) {
1908 $ak = $1;
1909 $av = $2;
1910 }
1911 foreach my $s (@s) {
1912 $attributes{$s}->{$ak} = $av;
1913 }
1914 }
7f5af797
RL
1915 }
1916 },
9fe2bb77
RL
1917
1918 qr/^\s*ORDINALS\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/,
ce959812 1919 => sub { push @{$ordinals{$1}}, tokenize($2)
9fe2bb77
RL
1920 if !@skip || $skip[$#skip] > 0 },
1921 qr/^\s*SOURCE\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/
ce959812 1922 => sub { push @{$sources{$1}}, tokenize($2)
9fe2bb77 1923 if !@skip || $skip[$#skip] > 0 },
2a08d1a0 1924 qr/^\s*SHARED_SOURCE\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/
ce959812 1925 => sub { push @{$shared_sources{$1}}, tokenize($2)
2a08d1a0 1926 if !@skip || $skip[$#skip] > 0 },
9fe2bb77 1927 qr/^\s*INCLUDE\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/
ce959812 1928 => sub { push @{$includes{$1}}, tokenize($2)
9fe2bb77 1929 if !@skip || $skip[$#skip] > 0 },
b96ab5e6
RL
1930 qr/^\s*DEFINE\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/
1931 => sub { push @{$defines{$1}}, tokenize($2)
1932 if !@skip || $skip[$#skip] > 0 },
4f858293 1933 qr/^\s*DEPEND\[((?:\\.|[^\\\]])*)\]\s*=\s*(.*)\s*$/
ce959812 1934 => sub { push @{$depends{$1}}, tokenize($2)
9fe2bb77 1935 if !@skip || $skip[$#skip] > 0 },
ae4c7450
RL
1936 qr/^\s*GENERATE\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/
1937 => sub { push @{$generate{$1}}, $2
1938 if !@skip || $skip[$#skip] > 0 },
ab6e147c 1939 qr/^\s*(?:#.*)?$/ => sub { },
2b6b606c
RL
1940 "OTHERWISE" => sub { die "Something wrong with this line:\n$_\nat $sourced/$f" },
1941 "BEFORE" => sub {
1942 if ($buildinfo_debug) {
1943 print STDERR "DEBUG: Parsing ",join(" ", @_),"\n";
1944 print STDERR "DEBUG: ... before parsing, skip stack is ",join(" ", map { int($_) } @skip),"\n";
1945 }
1946 },
1947 "AFTER" => sub {
1948 if ($buildinfo_debug) {
1949 print STDERR "DEBUG: .... after parsing, skip stack is ",join(" ", map { int($_) } @skip),"\n";
1950 }
1951 },
9fe2bb77
RL
1952 );
1953 die "runaway IF?" if (@skip);
1954
1842f369
RL
1955 if (grep { defined $attributes{$_}->{engine} } keys %attributes
1956 and !$config{dynamic_engines}) {
1957 die <<"EOF"
19ab5790 1958ENGINES can only be used if configured with 'dynamic-engine'.
9fe2bb77
RL
1959This is usually a fault in a build.info file.
1960EOF
1842f369 1961 }
7f5af797 1962
c91f24d4
RL
1963 foreach (keys %attributes) {
1964 my $dest = $_;
1965 my $ddest = cleanfile($buildd, $_, $blddir);
1966 foreach (keys %{$attributes{$dest} // {}}) {
1967 $unified_info{attributes}->{$ddest}->{$_} =
1968 $attributes{$dest}->{$_};
1969 }
9fe2bb77
RL
1970 }
1971
c91f24d4
RL
1972 {
1973 my %infos = ( programs => [ @programs ],
1974 libraries => [ @libraries ],
1842f369 1975 modules => [ @modules ],
da7e31e0 1976 scripts => [ @scripts ] );
c91f24d4
RL
1977 foreach my $k (keys %infos) {
1978 foreach (@{$infos{$k}}) {
1979 my $item = cleanfile($buildd, $_, $blddir);
1980 $unified_info{$k}->{$item} = 1;
1981 }
1982 }
8a67946e
RL
1983 }
1984
f5fb6f05
RL
1985 # Check that we haven't defined any library as both shared and
1986 # explicitly static. That is forbidden.
1987 my @doubles = ();
1988 foreach (grep /\.a$/, keys %{$unified_info{libraries}}) {
1989 (my $l = $_) =~ s/\.a$//;
1990 push @doubles, $l if defined $unified_info{libraries}->{$l};
9fe2bb77 1991 }
f5fb6f05
RL
1992 die "these libraries are both explicitly static and shared:\n ",
1993 join(" ", @doubles), "\n"
1994 if @doubles;
9fe2bb77 1995
9fe2bb77
RL
1996 foreach (keys %sources) {
1997 my $dest = $_;
2e963849 1998 my $ddest = cleanfile($buildd, $_, $blddir);
9fe2bb77 1999 foreach (@{$sources{$dest}}) {
2e963849 2000 my $s = cleanfile($sourced, $_, $blddir);
9fe2bb77
RL
2001
2002 # If it isn't in the source tree, we assume it's generated
2003 # in the build tree
846e4c4d 2004 if ($s eq $src_configdata || ! -f $s || $generate{$_}) {
2e963849 2005 $s = cleanfile($buildd, $_, $blddir);
9fe2bb77 2006 }
ea241958
RL
2007 # We recognise C++, C and asm files
2008 if ($s =~ /\.(cc|cpp|c|s|S)$/) {
2009 my $o = $_;
2010 $o =~ s/\.[csS]$/.o/; # C and assembler
2011 $o =~ s/\.(cc|cpp)$/_cc.o/; # C++
2e963849 2012 $o = cleanfile($buildd, $o, $blddir);
bec2db18
RL
2013 $unified_info{sources}->{$ddest}->{$o} = -1;
2014 $unified_info{sources}->{$o}->{$s} = -1;
83900628
RS
2015 } elsif ($s =~ /\.rc$/) {
2016 # We also recognise resource files
2017 my $o = $_;
2018 $o =~ s/\.rc$/.res/; # Resource configuration
2019 my $o = cleanfile($buildd, $o, $blddir);
bec2db18
RL
2020 $unified_info{sources}->{$ddest}->{$o} = -1;
2021 $unified_info{sources}->{$o}->{$s} = -1;
9fe2bb77
RL
2022 } else {
2023 $unified_info{sources}->{$ddest}->{$s} = 1;
2024 }
2025 }
2026 }
2027
2a08d1a0
RL
2028 foreach (keys %shared_sources) {
2029 my $dest = $_;
2030 my $ddest = cleanfile($buildd, $_, $blddir);
2a08d1a0
RL
2031 foreach (@{$shared_sources{$dest}}) {
2032 my $s = cleanfile($sourced, $_, $blddir);
2033
2034 # If it isn't in the source tree, we assume it's generated
2035 # in the build tree
846e4c4d 2036 if ($s eq $src_configdata || ! -f $s || $generate{$_}) {
2a08d1a0
RL
2037 $s = cleanfile($buildd, $_, $blddir);
2038 }
ccce3e1d 2039
ea241958 2040 if ($s =~ /\.(cc|cpp|c|s|S)$/) {
ccce3e1d 2041 # We recognise C++, C and asm files
ea241958
RL
2042 my $o = $_;
2043 $o =~ s/\.[csS]$/.o/; # C and assembler
2044 $o =~ s/\.(cc|cpp)$/_cc.o/; # C++
2a08d1a0 2045 $o = cleanfile($buildd, $o, $blddir);
bec2db18
RL
2046 $unified_info{shared_sources}->{$ddest}->{$o} = -1;
2047 $unified_info{sources}->{$o}->{$s} = -1;
ccce3e1d
RL
2048 } elsif ($s =~ /\.rc$/) {
2049 # We also recognise resource files
2050 my $o = $_;
2051 $o =~ s/\.rc$/.res/; # Resource configuration
2052 my $o = cleanfile($buildd, $o, $blddir);
bec2db18
RL
2053 $unified_info{shared_sources}->{$ddest}->{$o} = -1;
2054 $unified_info{sources}->{$o}->{$s} = -1;
ef2dfc99
RL
2055 } elsif ($s =~ /\.ld$/) {
2056 # We also recognise linker scripts (or corresponding)
ccce3e1d 2057 # We know they are generated files
05a72c28 2058 my $ld = cleanfile($buildd, $_, $blddir);
ef2dfc99 2059 $unified_info{shared_sources}->{$ddest}->{$ld} = 1;
2a08d1a0
RL
2060 } else {
2061 die "unrecognised source file type for shared library: $s\n";
2062 }
2063 }
2064 }
2065
ae4c7450
RL
2066 foreach (keys %generate) {
2067 my $dest = $_;
2068 my $ddest = cleanfile($buildd, $_, $blddir);
ae4c7450
RL
2069 die "more than one generator for $dest: "
2070 ,join(" ", @{$generate{$_}}),"\n"
2071 if scalar @{$generate{$_}} > 1;
2072 my @generator = split /\s+/, $generate{$dest}->[0];
2073 $generator[0] = cleanfile($sourced, $generator[0], $blddir),
2074 $unified_info{generate}->{$ddest} = [ @generator ];
2075 }
2076
9fe2bb77
RL
2077 foreach (keys %depends) {
2078 my $dest = $_;
4f858293 2079 my $ddest = $dest eq "" ? "" : cleanfile($sourced, $_, $blddir);
8d34daf0
RL
2080
2081 # If the destination doesn't exist in source, it can only be
2082 # a generated file in the build tree.
846e4c4d 2083 if ($ddest ne "" && ($ddest eq $src_configdata || ! -f $ddest)) {
8d34daf0 2084 $ddest = cleanfile($buildd, $_, $blddir);
9fe2bb77
RL
2085 }
2086 foreach (@{$depends{$dest}}) {
2e963849 2087 my $d = cleanfile($sourced, $_, $blddir);
9fe2bb77 2088
e737d7b1
RL
2089 # If we know it's generated, or assume it is because we can't
2090 # find it in the source tree, we set file we depend on to be
2091 # in the build tree rather than the source tree, and assume
2092 # and that there are lines to build it in a BEGINRAW..ENDRAW
2093 # section or in the Makefile template.
846e4c4d
RL
2094 if ($d eq $src_configdata
2095 || ! -f $d
da1f2104
RL
2096 || (grep { $d eq $_ }
2097 map { cleanfile($srcdir, $_, $blddir) }
4f858293 2098 grep { /\.h$/ } keys %{$unified_info{generate}})) {
2e963849 2099 $d = cleanfile($buildd, $_, $blddir);
9fe2bb77
RL
2100 }
2101 # Take note if the file to depend on is being renamed
186a31e5
RL
2102 # Take extra care with files ending with .a, they should
2103 # be treated without that extension, and the extension
2104 # should be added back after treatment.
2105 $d =~ /(\.a)?$/;
2106 my $e = $1 // "";
f5fb6f05 2107 $d = $`.$e;
9fe2bb77 2108 $unified_info{depends}->{$ddest}->{$d} = 1;
9fe2bb77
RL
2109 }
2110 }
2111
2112 foreach (keys %includes) {
2113 my $dest = $_;
8d34daf0
RL
2114 my $ddest = cleanfile($sourced, $_, $blddir);
2115
2116 # If the destination doesn't exist in source, it can only be
2117 # a generated file in the build tree.
846e4c4d 2118 if ($ddest eq $src_configdata || ! -f $ddest) {
8d34daf0 2119 $ddest = cleanfile($buildd, $_, $blddir);
9fe2bb77
RL
2120 }
2121 foreach (@{$includes{$dest}}) {
4748f890
RL
2122 my $is = cleandir($sourced, $_, $blddir);
2123 my $ib = cleandir($buildd, $_, $blddir);
2124 push @{$unified_info{includes}->{$ddest}->{source}}, $is
2125 unless grep { $_ eq $is } @{$unified_info{includes}->{$ddest}->{source}};
2126 push @{$unified_info{includes}->{$ddest}->{build}}, $ib
2127 unless grep { $_ eq $ib } @{$unified_info{includes}->{$ddest}->{build}};
9fe2bb77
RL
2128 }
2129 }
b96ab5e6
RL
2130
2131 foreach (keys %defines) {
2132 my $dest = $_;
2133 my $ddest = cleanfile($sourced, $_, $blddir);
2134
2135 # If the destination doesn't exist in source, it can only be
2136 # a generated file in the build tree.
2137 if (! -f $ddest) {
2138 $ddest = cleanfile($buildd, $_, $blddir);
2139 if ($unified_info{rename}->{$ddest}) {
2140 $ddest = $unified_info{rename}->{$ddest};
2141 }
2142 }
2143 foreach (@{$defines{$dest}}) {
2144 m|^([^=]*)(=.*)?$|;
2145 die "0 length macro name not permitted\n" if $1 eq "";
2146 die "$1 defined more than once\n"
2147 if defined $unified_info{defines}->{$ddest}->{$1};
2148 $unified_info{defines}->{$ddest}->{$1} = $2;
2149 }
2150 }
9fe2bb77
RL
2151 }
2152
d201dbc9
RL
2153 my $ordinals_text = join(', ', sort keys %ordinals);
2154 warn <<"EOF" if $ordinals_text;
2155
2156WARNING: ORDINALS were specified for $ordinals_text
2157They are ignored and should be replaced with a combination of GENERATE,
2158DEPEND and SHARED_SOURCE.
2159EOF
2160
1b5ad51f
RL
2161 # Massage the result
2162
e431bcfa
RL
2163 # If we depend on a header file or a perl module, add an inclusion of
2164 # its directory to allow smoothe inclusion
2165 foreach my $dest (keys %{$unified_info{depends}}) {
2166 next if $dest eq "";
2167 foreach my $d (keys %{$unified_info{depends}->{$dest}}) {
2168 next unless $d =~ /\.(h|pm)$/;
906032d5
RL
2169 my $i = dirname($d);
2170 my $spot =
2171 $d eq "configdata.pm" || defined($unified_info{generate}->{$d})
2172 ? 'build' : 'source';
2173 push @{$unified_info{includes}->{$dest}->{$spot}}, $i
2174 unless grep { $_ eq $i } @{$unified_info{includes}->{$dest}->{$spot}};
e431bcfa
RL
2175 }
2176 }
2177
ef2dfc99 2178 # Go through all intermediary files and change their names to something that
bec2db18
RL
2179 # reflects what they will be built for. Note that for some source files,
2180 # this leads to duplicate object files because they are used multiple times.
2181 # the goal is to rename all object files according to this scheme:
2182 # {productname}-{midfix}-{origobjname}.[o|res]
2183 # the {midfix} is a keyword indicating the type of product, which is mostly
2184 # valuable for libraries since they come in two forms.
2185 #
2186 # This also reorganises the {sources} and {shared_sources} so that the
2187 # former only contains ALL object files that are supposed to end up in
2188 # static libraries and programs, while the latter contains ALL object files
2189 # that are supposed to end up in shared libraries and DSOs.
2190 # The main reason for having two different source structures is to allow
2191 # the same name to be used for the static and the shared variants of a
2192 # library.
2193 {
2194 # Take copies so we don't get interference from added stuff
2195 my %unified_copy = ();
2196 foreach (('sources', 'shared_sources')) {
2197 $unified_copy{$_} = { %{$unified_info{$_}} }
2198 if defined($unified_info{$_});
2199 delete $unified_info{$_};
2200 }
1842f369 2201 foreach my $prodtype (('programs', 'libraries', 'modules', 'scripts')) {
bec2db18
RL
2202 # $intent serves multi purposes:
2203 # - give a prefix for the new object files names
2204 # - in the case of libraries, rearrange the object files so static
2205 # libraries use the 'sources' structure exclusively, while shared
2206 # libraries use the 'shared_sources' structure exclusively.
2207 my $intent = {
2208 programs => { bin => { src => [ 'sources' ],
2209 dst => 'sources' } },
2210 libraries => { lib => { src => [ 'sources' ],
2211 dst => 'sources' },
2212 shlib => { prodselect =>
2213 sub { grep !/\.a$/, @_ },
2214 src => [ 'sources',
2215 'shared_sources' ],
2216 dst => 'shared_sources' } },
22b41467
RL
2217 modules => { dso => { src => [ 'sources' ],
2218 dst => 'sources' } },
bec2db18
RL
2219 scripts => { script => { src => [ 'sources' ],
2220 dst => 'sources' } }
2221 } -> {$prodtype};
2222 foreach my $kind (keys %$intent) {
856b1b65
RL
2223 next if ($intent->{$kind}->{dst} eq 'shared_sources'
2224 && $disabled{shared});
2225
bec2db18
RL
2226 my @src = @{$intent->{$kind}->{src}};
2227 my $dst = $intent->{$kind}->{dst};
2228 my $prodselect = $intent->{$kind}->{prodselect} // sub { @_ };
2229 foreach my $prod ($prodselect->(keys %{$unified_info{$prodtype}})) {
2230 # %prod_sources has all applicable objects as keys, and
2231 # their corresponding sources as values
2232 my %prod_sources =
2233 map { $_ => [ keys %{$unified_copy{sources}->{$_}} ] }
2234 map { keys %{$unified_copy{$_}->{$prod}} }
2235 @src;
2236 foreach (keys %prod_sources) {
ef2dfc99
RL
2237 # Only affect object files and resource files,
2238 # the others simply get a new value
2239 # (+1 instead of -1)
bec2db18
RL
2240 if ($_ =~ /\.(o|res)$/) {
2241 (my $prodname = $prod) =~ s|\.a$||;
2242 my $newobj =
2243 catfile(dirname($_),
2244 basename($prodname)
2245 . '-' . $kind
2246 . '-' . basename($_));
2247 $unified_info{$dst}->{$prod}->{$newobj} = 1;
2248 foreach my $src (@{$prod_sources{$_}}) {
2249 $unified_info{sources}->{$newobj}->{$src} = 1;
2250 }
2251 # Adjust dependencies
2252 foreach my $deps (keys %{$unified_info{depends}->{$_}}) {
2253 $unified_info{depends}->{$_}->{$deps} = -1;
2254 $unified_info{depends}->{$newobj}->{$deps} = 1;
2255 }
2256 # Adjust includes
2257 foreach my $k (('source', 'build')) {
2258 next unless
2259 defined($unified_info{includes}->{$_}->{$k});
2260 my @incs = @{$unified_info{includes}->{$_}->{$k}};
2261 $unified_info{includes}->{$newobj}->{$k} = [ @incs ];
2262 }
2263 } else {
2264 $unified_info{$dst}->{$prod}->{$_} = 1;
2265 }
2266 }
2267 }
2268 }
2269 }
2270 }
2271 # At this point, we have a number of sources with the value -1. They
2272 # aren't part of the local build and are probably meant for a different
2273 # platform, and can therefore be cleaned away. That happens when making
2274 # %unified_info more efficient below.
2275
9fe2bb77
RL
2276 ### Make unified_info a bit more efficient
2277 # One level structures
1842f369 2278 foreach (("programs", "libraries", "modules", "scripts")) {
9fe2bb77
RL
2279 $unified_info{$_} = [ sort keys %{$unified_info{$_}} ];
2280 }
2281 # Two level structures
c91f24d4 2282 foreach my $l1 (("sources", "shared_sources", "ldadd", "depends")) {
9fe2bb77 2283 foreach my $l2 (sort keys %{$unified_info{$l1}}) {
bec2db18
RL
2284 my @items =
2285 sort
2286 grep { $unified_info{$l1}->{$l2}->{$_} > 0 }
2287 keys %{$unified_info{$l1}->{$l2}};
2288 if (@items) {
2289 $unified_info{$l1}->{$l2} = [ @items ];
2290 } else {
2291 delete $unified_info{$l1}->{$l2};
2292 }
9fe2bb77
RL
2293 }
2294 }
b96ab5e6
RL
2295 # Defines
2296 foreach my $dest (sort keys %{$unified_info{defines}}) {
2297 $unified_info{defines}->{$dest}
2298 = [ map { $_.$unified_info{defines}->{$dest}->{$_} }
2299 sort keys %{$unified_info{defines}->{$dest}} ];
2300 }
4748f890
RL
2301 # Includes
2302 foreach my $dest (sort keys %{$unified_info{includes}}) {
2303 if (defined($unified_info{includes}->{$dest}->{build})) {
e431bcfa
RL
2304 my @source_includes = ();
2305 @source_includes = ( @{$unified_info{includes}->{$dest}->{source}} )
2306 if defined($unified_info{includes}->{$dest}->{source});
4748f890
RL
2307 $unified_info{includes}->{$dest} =
2308 [ @{$unified_info{includes}->{$dest}->{build}} ];
2309 foreach my $inc (@source_includes) {
2310 push @{$unified_info{includes}->{$dest}}, $inc
2311 unless grep { $_ eq $inc } @{$unified_info{includes}->{$dest}};
2312 }
609e4be8 2313 } elsif (defined($unified_info{includes}->{$dest}->{source})) {
4748f890
RL
2314 $unified_info{includes}->{$dest} =
2315 [ @{$unified_info{includes}->{$dest}->{source}} ];
609e4be8
RL
2316 } else {
2317 delete $unified_info{includes}->{$dest};
4748f890
RL
2318 }
2319 }
b6e66075
RL
2320
2321 # For convenience collect information regarding directories where
2322 # files are generated, those generated files and the end product
2323 # they end up in where applicable. Then, add build rules for those
2324 # directories
2325 my %loopinfo = ( "lib" => [ @{$unified_info{libraries}} ],
1842f369 2326 "dso" => [ @{$unified_info{modules}} ],
b6e66075
RL
2327 "bin" => [ @{$unified_info{programs}} ],
2328 "script" => [ @{$unified_info{scripts}} ] );
2329 foreach my $type (keys %loopinfo) {
2330 foreach my $product (@{$loopinfo{$type}}) {
2331 my %dirs = ();
2332 my $pd = dirname($product);
2333
3bed01a0 2334 foreach (@{$unified_info{sources}->{$product} // []},
b6e66075
RL
2335 @{$unified_info{shared_sources}->{$product} // []}) {
2336 my $d = dirname($_);
2337
2338 # We don't want to create targets for source directories
2339 # when building out of source
2340 next if ($config{sourcedir} ne $config{builddir}
2341 && $d =~ m|^\Q$config{sourcedir}\E|);
2342 # We already have a "test" target, and the current directory
2343 # is just silly to make a target for
2344 next if $d eq "test" || $d eq ".";
2345
2346 $dirs{$d} = 1;
2347 push @{$unified_info{dirinfo}->{$d}->{deps}}, $_
2348 if $d ne $pd;
2349 }
2350 foreach (keys %dirs) {
2351 push @{$unified_info{dirinfo}->{$_}->{products}->{$type}},
2352 $product;
2353 }
2354 }
2355 }
9fe2bb77
RL
2356}
2357
2358# For the schemes that need it, we provide the old *_obj configs
2359# from the *_asm_obj ones
3a55c92b 2360foreach (grep /_(asm|aux)_src$/, keys %target) {
9fe2bb77 2361 my $src = $_;
3a55c92b 2362 (my $obj = $_) =~ s/_(asm|aux)_src$/_obj/;
ea241958
RL
2363 $target{$obj} = $target{$src};
2364 $target{$obj} =~ s/\.[csS]\b/.o/g; # C and assembler
2365 $target{$obj} =~ s/\.(cc|cpp)\b/_cc.o/g; # C++
9fe2bb77
RL
2366}
2367
291e94df
RL
2368# Write down our configuration where it fits #########################
2369
b1fafff6 2370print "Creating configdata.pm\n";
291e94df
RL
2371open(OUT,">configdata.pm") || die "unable to create configdata.pm: $!\n";
2372print OUT <<"EOF";
abe256e7 2373#! $config{HASHBANGPERL}
b1fafff6 2374
291e94df
RL
2375package configdata;
2376
2377use strict;
2378use warnings;
2379
2380use Exporter;
2381#use vars qw(\@ISA \@EXPORT);
2382our \@ISA = qw(Exporter);
3850f8cb 2383our \@EXPORT = qw(\%config \%target \%disabled \%withargs \%unified_info \@disablables);
291e94df
RL
2384
2385EOF
2386print OUT "our %config = (\n";
2387foreach (sort keys %config) {
2388 if (ref($config{$_}) eq "ARRAY") {
84f32c84
DMSP
2389 print OUT " ", $_, " => [ ", join(", ",
2390 map { quotify("perl", $_) }
2391 @{$config{$_}}), " ],\n";
7ecdf18d 2392 } elsif (ref($config{$_}) eq "HASH") {
84f32c84 2393 print OUT " ", $_, " => {";
7ecdf18d
RL
2394 if (scalar keys %{$config{$_}} > 0) {
2395 print OUT "\n";
2396 foreach my $key (sort keys %{$config{$_}}) {
2397 print OUT " ",
2398 join(" => ",
2399 quotify("perl", $key),
2400 defined $config{$_}->{$key}
2401 ? quotify("perl", $config{$_}->{$key})
2402 : "undef");
2403 print OUT ",\n";
2404 }
2405 print OUT " ";
2406 }
2407 print OUT "},\n";
291e94df 2408 } else {
84f32c84 2409 print OUT " ", $_, " => ", quotify("perl", $config{$_}), ",\n"
291e94df
RL
2410 }
2411}
2412print OUT <<"EOF";
2413);
2414
2415EOF
2416print OUT "our %target = (\n";
2417foreach (sort keys %target) {
2418 if (ref($target{$_}) eq "ARRAY") {
84f32c84
DMSP
2419 print OUT " ", $_, " => [ ", join(", ",
2420 map { quotify("perl", $_) }
2421 @{$target{$_}}), " ],\n";
291e94df 2422 } else {
84f32c84 2423 print OUT " ", $_, " => ", quotify("perl", $target{$_}), ",\n"
291e94df
RL
2424 }
2425}
2426print OUT <<"EOF";
2427);
2428
96d2d7bc
RL
2429EOF
2430print OUT "our \%available_protocols = (\n";
2431print OUT " tls => [ ", join(", ", map { quotify("perl", $_) } @tls), " ],\n";
2432print OUT " dtls => [ ", join(", ", map { quotify("perl", $_) } @dtls), " ],\n";
2433print OUT <<"EOF";
2434);
2435
3850f8cb
RL
2436EOF
2437print OUT "our \@disablables = (\n";
2438foreach (@disablables) {
2439 print OUT " ", quotify("perl", $_), ",\n";
2440}
2441print OUT <<"EOF";
2442);
2443
96d2d7bc
RL
2444EOF
2445print OUT "our \%disabled = (\n";
2446foreach (sort keys %disabled) {
2447 print OUT " ", quotify("perl", $_), " => ", quotify("perl", $disabled{$_}), ",\n";
2448}
2449print OUT <<"EOF";
2450);
2451
291e94df 2452EOF
107b5792
RL
2453print OUT "our %withargs = (\n";
2454foreach (sort keys %withargs) {
2455 if (ref($withargs{$_}) eq "ARRAY") {
84f32c84
DMSP
2456 print OUT " ", $_, " => [ ", join(", ",
2457 map { quotify("perl", $_) }
2458 @{$withargs{$_}}), " ],\n";
107b5792 2459 } else {
84f32c84 2460 print OUT " ", $_, " => ", quotify("perl", $withargs{$_}), ",\n"
107b5792
RL
2461 }
2462}
2463print OUT <<"EOF";
2464);
edd4d402 2465
107b5792 2466EOF
ddf1847d 2467if ($builder eq "unified") {
9fe2bb77
RL
2468 my $recurse;
2469 $recurse = sub {
2470 my $indent = shift;
2471 foreach (@_) {
2472 if (ref $_ eq "ARRAY") {
2473 print OUT " "x$indent, "[\n";
2474 foreach (@$_) {
2475 $recurse->($indent + 4, $_);
2476 }
2477 print OUT " "x$indent, "],\n";
2478 } elsif (ref $_ eq "HASH") {
2479 my %h = %$_;
2480 print OUT " "x$indent, "{\n";
2481 foreach (sort keys %h) {
2482 if (ref $h{$_} eq "") {
2483 print OUT " "x($indent + 4), quotify("perl", $_), " => ", quotify("perl", $h{$_}), ",\n";
2484 } else {
2485 print OUT " "x($indent + 4), quotify("perl", $_), " =>\n";
2486 $recurse->($indent + 8, $h{$_});
2487 }
2488 }
2489 print OUT " "x$indent, "},\n";
2490 } else {
2491 print OUT " "x$indent, quotify("perl", $_), ",\n";
2492 }
2493 }
2494 };
2495 print OUT "our %unified_info = (\n";
2496 foreach (sort keys %unified_info) {
2497 if (ref $unified_info{$_} eq "") {
2498 print OUT " "x4, quotify("perl", $_), " => ", quotify("perl", $unified_info{$_}), ",\n";
2499 } else {
2500 print OUT " "x4, quotify("perl", $_), " =>\n";
2501 $recurse->(8, $unified_info{$_});
2502 }
2503 }
2504 print OUT <<"EOF";
2505);
2506
2507EOF
2508}
047f0292
RL
2509print OUT
2510 "# The following data is only used when this files is use as a script\n";
abe256e7 2511print OUT "my \@makevars = (\n";
b1fafff6 2512foreach (sort keys %user) {
abe256e7 2513 print OUT " '",$_,"',\n";
b1fafff6
RL
2514}
2515print OUT ");\n";
ca372414
RL
2516print OUT "my \%disabled_info = (\n";
2517foreach my $what (sort keys %disabled_info) {
2518 print OUT " '$what' => {\n";
2519 foreach my $info (sort keys %{$disabled_info{$what}}) {
2520 if (ref $disabled_info{$what}->{$info} eq 'ARRAY') {
2521 print OUT " $info => [ ",
2522 join(', ', map { "'$_'" } @{$disabled_info{$what}->{$info}}),
2523 " ],\n";
2524 } else {
2525 print OUT " $info => '", $disabled_info{$what}->{$info},
2526 "',\n";
2527 }
2528 }
2529 print OUT " },\n";
2530}
2531print OUT ");\n";
f729ba55 2532print OUT 'my @user_crossable = qw( ', join (' ', @user_crossable), " );\n";
b1fafff6 2533print OUT << 'EOF';
b1fafff6
RL
2534# If run directly, we can give some answers, and even reconfigure
2535unless (caller) {
2536 use Getopt::Long;
2537 use File::Spec::Functions;
2538 use File::Basename;
2539 use Pod::Usage;
2540
2541 my $here = dirname($0);
2542
2543 my $dump = undef;
2544 my $cmdline = undef;
ca372414 2545 my $options = undef;
50ea9d2b 2546 my $target = undef;
b1fafff6
RL
2547 my $envvars = undef;
2548 my $makevars = undef;
2549 my $buildparams = undef;
2550 my $reconf = undef;
2551 my $verbose = undef;
2552 my $help = undef;
2553 my $man = undef;
2554 GetOptions('dump|d' => \$dump,
2555 'command-line|c' => \$cmdline,
ca372414 2556 'options|o' => \$options,
50ea9d2b 2557 'target|t' => \$target,
b1fafff6
RL
2558 'environment|e' => \$envvars,
2559 'make-variables|m' => \$makevars,
2560 'build-parameters|b' => \$buildparams,
2561 'reconfigure|reconf|r' => \$reconf,
2562 'verbose|v' => \$verbose,
2563 'help' => \$help,
2564 'man' => \$man)
2565 or die "Errors in command line arguments\n";
2566
50ea9d2b 2567 unless ($dump || $cmdline || $options || $target || $envvars || $makevars
ca372414 2568 || $buildparams || $reconf || $verbose || $help || $man) {
b1fafff6
RL
2569 print STDERR <<"_____";
2570You must give at least one option.
2571For more information, do '$0 --help'
2572_____
2573 exit(2);
2574 }
2575
2576 if ($help) {
2577 pod2usage(-exitval => 0,
2578 -verbose => 1);
2579 }
2580 if ($man) {
2581 pod2usage(-exitval => 0,
2582 -verbose => 2);
2583 }
2584 if ($dump || $cmdline) {
d5fa7035 2585 print "\nCommand line (with current working directory = $here):\n\n";
b1fafff6 2586 print ' ',join(' ',
9e265322 2587 $config{PERL},
b1fafff6
RL
2588 catfile($config{sourcedir}, 'Configure'),
2589 @{$config{perlargv}}), "\n";
d5fa7035
RL
2590 print "\nPerl information:\n\n";
2591 print ' ',$config{perl_cmd},"\n";
2592 print ' ',$config{perl_version},' for ',$config{perl_archname},"\n";
b1fafff6 2593 }
ca372414
RL
2594 if ($dump || $options) {
2595 my $longest = 0;
0b80103b 2596 my $longest2 = 0;
ca372414
RL
2597 foreach my $what (@disablables) {
2598 $longest = length($what) if $longest < length($what);
1d2c6b7d
RL
2599 $longest2 = length($disabled{$what})
2600 if $disabled{$what} && $longest2 < length($disabled{$what});
ca372414
RL
2601 }
2602 print "\nEnabled features:\n\n";
2603 foreach my $what (@disablables) {
2604 print " $what\n" unless $disabled{$what};
2605 }
2606 print "\nDisabled features:\n\n";
2607 foreach my $what (@disablables) {
2608 if ($disabled{$what}) {
2609 print " $what", ' ' x ($longest - length($what) + 1),
0b80103b 2610 "[$disabled{$what}]", ' ' x ($longest2 - length($disabled{$what}) + 1);
ca372414
RL
2611 print $disabled_info{$what}->{macro}
2612 if $disabled_info{$what}->{macro};
2613 print ' (skip ',
2614 join(', ', @{$disabled_info{$what}->{skipped}}),
2615 ')'
2616 if $disabled_info{$what}->{skipped};
2617 print "\n";
2618 }
2619 }
2620 }
50ea9d2b
RL
2621 if ($dump || $target) {
2622 print "\nConfig target attributes:\n\n";
2623 foreach (sort keys %target) {
2624 next if $_ =~ m|^_| || $_ eq 'template';
2625 my $quotify = sub {
2626 map { (my $x = $_) =~ s|([\\\$\@"])|\\$1|g; "\"$x\""} @_;
2627 };
2628 print ' ', $_, ' => ';
2629 if (ref($target{$_}) eq "ARRAY") {
2630 print '[ ', join(', ', $quotify->(@{$target{$_}})), " ],\n";
2631 } else {
2632 print $quotify->($target{$_}), ",\n"
2633 }
2634 }
2635 }
b1fafff6
RL
2636 if ($dump || $envvars) {
2637 print "\nRecorded environment:\n\n";
2638 foreach (sort keys %{$config{perlenv}}) {
2639 print ' ',$_,' = ',($config{perlenv}->{$_} || ''),"\n";
2640 }
2641 }
2642 if ($dump || $makevars) {
2643 print "\nMakevars:\n\n";
abe256e7 2644 foreach my $var (@makevars) {
f729ba55 2645 my $prefix = '';
abe256e7 2646 $prefix = $config{CROSS_COMPILE}
f729ba55 2647 if grep { $var eq $_ } @user_crossable;
b700bc59 2648 $prefix //= '';
f729ba55 2649 print ' ',$var,' ' x (16 - length $var),'= ',
abe256e7
RL
2650 (ref $config{$var} eq 'ARRAY'
2651 ? join(' ', @{$config{$var}})
2652 : $prefix.$config{$var}),
b1fafff6 2653 "\n"
abe256e7 2654 if defined $config{$var};
b1fafff6
RL
2655 }
2656
2657 my @buildfile = ($config{builddir}, $config{build_file});
2658 unshift @buildfile, $here
2659 unless file_name_is_absolute($config{builddir});
2660 my $buildfile = canonpath(catdir(@buildfile));
2661 print <<"_____";
2662
2663NOTE: These variables only represent the configuration view. The build file
2664template may have processed these variables further, please have a look at the
2665build file for more exact data:
2666 $buildfile
2667_____
2668 }
2669 if ($dump || $buildparams) {
2670 my @buildfile = ($config{builddir}, $config{build_file});
2671 unshift @buildfile, $here
2672 unless file_name_is_absolute($config{builddir});
2673 print "\nbuild file:\n\n";
2674 print " ", canonpath(catfile(@buildfile)),"\n";
2675
2676 print "\nbuild file templates:\n\n";
2677 foreach (@{$config{build_file_templates}}) {
2678 my @tmpl = ($_);
2679 unshift @tmpl, $here
2680 unless file_name_is_absolute($config{sourcedir});
2681 print ' ',canonpath(catfile(@tmpl)),"\n";
2682 }
2683 }
2684 if ($reconf) {
2685 if ($verbose) {
2686 print 'Reconfiguring with: ', join(' ',@{$config{perlargv}}), "\n";
84f32c84
DMSP
2687 foreach (sort keys %{$config{perlenv}}) {
2688 print ' ',$_,' = ',($config{perlenv}->{$_} || ""),"\n";
2689 }
b1fafff6
RL
2690 }
2691
2692 chdir $here;
2693 exec $^X,catfile($config{sourcedir}, 'Configure'),'reconf';
2694 }
2695}
2696
26971;
2698
2699__END__
2700
2701=head1 NAME
2702
2703configdata.pm - configuration data for OpenSSL builds
2704
2705=head1 SYNOPSIS
2706
2707Interactive:
2708
2709 perl configdata.pm [options]
2710
2711As data bank module:
2712
2713 use configdata;
f2d4be3b 2714
b1fafff6
RL
2715=head1 DESCRIPTION
2716
2717This module can be used in two modes, interactively and as a module containing
2718all the data recorded by OpenSSL's Configure script.
2719
2720When used interactively, simply run it as any perl script, with at least one
2721option, and you will get the information you ask for. See L</OPTIONS> below.
2722
2723When loaded as a module, you get a few databanks with useful information to
2724perform build related tasks. The databanks are:
2725
2726 %config Configured things.
2727 %target The OpenSSL config target with all inheritances
2728 resolved.
2729 %disabled The features that are disabled.
2730 @disablables The list of features that can be disabled.
2731 %withargs All data given through --with-THING options.
2732 %unified_info All information that was computed from the build.info
2733 files.
2734
2735=head1 OPTIONS
2736
2737=over 4
2738
2739=item B<--help>
2740
2741Print a brief help message and exit.
2742
2743=item B<--man>
2744
2745Print the manual page and exit.
2746
85d6ad34 2747=item B<--dump> | B<-d>
b1fafff6
RL
2748
2749Print all relevant configuration data. This is equivalent to B<--command-line>
50ea9d2b
RL
2750B<--options> B<--target> B<--environment> B<--make-variables>
2751B<--build-parameters>.
b1fafff6
RL
2752
2753=item B<--command-line> | B<-c>
2754
2755Print the current configuration command line.
2756
ca372414
RL
2757=item B<--options> | B<-o>
2758
2759Print the features, both enabled and disabled, and display defined macro and
2760skipped directories where applicable.
2761
50ea9d2b
RL
2762=item B<--target> | B<-t>
2763
2764Print the config attributes for this config target.
2765
b1fafff6
RL
2766=item B<--environment> | B<-e>
2767
2768Print the environment variables and their values at the time of configuration.
2769
2770=item B<--make-variables> | B<-m>
2771
2772Print the main make variables generated in the current configuration
2773
2774=item B<--build-parameters> | B<-b>
2775
2776Print the build parameters, i.e. build file and build file templates.
2777
2778=item B<--reconfigure> | B<--reconf> | B<-r>
2779
2780Redo the configuration.
2781
2782=item B<--verbose> | B<-v>
2783
2784Verbose output.
2785
2786=back
2787
2788=cut
2789
2790EOF
2791close(OUT);
2792if ($builder_platform eq 'unix') {
2793 my $mode = (0755 & ~umask);
2794 chmod $mode, 'configdata.pm'
2795 or warn sprintf("WARNING: Couldn't change mode for 'configdata.pm' to 0%03o: %s\n",$mode,$!);
2796}
cba5068d 2797
88087414 2798my %builders = (
9fe2bb77 2799 unified => sub {
b1fafff6 2800 print 'Creating ',$target{build_file},"\n";
ddf1847d 2801 run_dofile(catfile($blddir, $target{build_file}),
1967a42e 2802 @{$config{build_file_templates}});
9fe2bb77 2803 },
88087414
RL
2804 );
2805
ddf1847d 2806$builders{$builder}->($builder_platform, @builder_opts);
fce0ba5f 2807
8937a4ed
RL
2808$SIG{__DIE__} = $orig_death_handler;
2809
9c62a279 2810print <<"EOF" if ($disabled{threads} eq "unavailable");
5f8d5c96
BM
2811
2812The library could not be configured for supporting multi-threaded
2813applications as the compiler options required on this system are not known.
ff1b7e09 2814See file INSTALL for details if you need multi-threading.
ec577822
BM
2815EOF
2816
76ffb43d 2817print <<"EOF" if ($no_shared_warn);
2964ba8c 2818
ae48242c
RL
2819The options 'shared', 'pic' and 'dynamic-engine' aren't supported on this
2820platform, so we will pretend you gave the option 'no-pic', which also disables
2821'shared' and 'dynamic-engine'. If you know how to implement shared libraries
2822or position independent code, please let us know (but please first make sure
2823you have tried with a current version of OpenSSL).
2e31ef03
RS
2824EOF
2825
820e414d
RL
2826print <<"EOF";
2827
2828**********************************************************************
2829*** ***
41349b5e 2830*** OpenSSL has been successfully configured ***
820e414d 2831*** ***
41349b5e
DMSP
2832*** If you encounter a problem while building, please open an ***
2833*** issue on GitHub <https://github.com/openssl/openssl/issues> ***
2834*** and include the output from the following command: ***
2835*** ***
2836*** perl configdata.pm --dump ***
2837*** ***
2838*** (If you are new to OpenSSL, you might want to consult the ***
2839*** 'Troubleshooting' section in the INSTALL file first) ***
820e414d
RL
2840*** ***
2841**********************************************************************
2842EOF
2843
d02b48c6
RE
2844exit(0);
2845
bd5192b1
RL
2846######################################################################
2847#
2848# Helpers and utility functions
2849#
2850
8937a4ed
RL
2851# Death handler, to print a helpful message in case of failure #######
2852#
2853sub death_handler {
eb807d53 2854 die @_ if $^S; # To prevent the added message in eval blocks
8937a4ed 2855 my $build_file = $target{build_file} // "build file";
eb807d53 2856 my @message = ( <<"_____", @_ );
8937a4ed
RL
2857
2858Failure! $build_file wasn't produced.
2859Please read INSTALL and associated NOTES files. You may also have to look over
2860your available compiler tool chain or change your configuration.
2861
2862_____
eb807d53
RL
2863
2864 # Dying is terminal, so it's ok to reset the signal handler here.
2865 $SIG{__DIE__} = $orig_death_handler;
2866 die @message;
8937a4ed
RL
2867}
2868
bd5192b1
RL
2869# Configuration file reading #########################################
2870
1f2e1cd5
RL
2871# Note: All of the helper functions are for lazy evaluation. They all
2872# return a CODE ref, which will return the intended value when evaluated.
2873# Thus, whenever there's mention of a returned value, it's about that
2874# intended value.
2875
bd5192b1 2876# Helper function to implement conditional inheritance depending on the
00b0d663 2877# value of $disabled{asm}. Used in inherit_from values as follows:
bd5192b1
RL
2878#
2879# inherit_from => [ "template", asm("asm_tmpl") ]
2880#
2881sub asm {
2882 my @x = @_;
2883 sub {
84f32c84 2884 $disabled{asm} ? () : @x;
bd5192b1
RL
2885 }
2886}
2887
1f2e1cd5
RL
2888# Helper function to implement conditional value variants, with a default
2889# plus additional values based on the value of $config{build_type}.
2890# Arguments are given in hash table form:
2891#
2892# picker(default => "Basic string: ",
2893# debug => "debug",
2894# release => "release")
2895#
2896# When configuring with --debug, the resulting string will be
2897# "Basic string: debug", and when not, it will be "Basic string: release"
2898#
2899# This can be used to create variants of sets of flags according to the
2900# build type:
2901#
2902# cflags => picker(default => "-Wall",
2903# debug => "-g -O0",
2904# release => "-O3")
2905#
2906sub picker {
2907 my %opts = @_;
2908 return sub { add($opts{default} || (),
2909 $opts{$config{build_type}} || ())->(); }
2910}
2911
2912# Helper function to combine several values of different types into one.
2913# This is useful if you want to combine a string with the result of a
2914# lazy function, such as:
2915#
2916# cflags => combine("-Wall", sub { $disabled{zlib} ? () : "-DZLIB" })
2917#
2918sub combine {
2919 my @stuff = @_;
2920 return sub { add(@stuff)->(); }
2921}
2922
2923# Helper function to implement conditional values depending on the value
2924# of $disabled{threads}. Can be used as follows:
2925#
2926# cflags => combine("-Wall", threads("-pthread"))
2927#
2928sub threads {
2929 my @flags = @_;
2930 return sub { add($disabled{threads} ? () : @flags)->(); }
2931}
2932
60aa6c1a
AP
2933sub shared {
2934 my @flags = @_;
2935 return sub { add($disabled{shared} ? () : @flags)->(); }
2936}
1f2e1cd5 2937
9c62a279 2938our $add_called = 0;
88087414
RL
2939# Helper function to implement adding values to already existing configuration
2940# values. It handles elements that are ARRAYs, CODEs and scalars
2941sub _add {
2942 my $separator = shift;
2943
bcb1977b
RL
2944 # If there's any ARRAY in the collection of values OR the separator
2945 # is undef, we will return an ARRAY of combined values, otherwise a
2946 # string of joined values with $separator as the separator.
2947 my $found_array = !defined($separator);
88087414
RL
2948
2949 my @values =
84f32c84
DMSP
2950 map {
2951 my $res = $_;
2952 while (ref($res) eq "CODE") {
2953 $res = $res->();
2954 }
2955 if (defined($res)) {
2956 if (ref($res) eq "ARRAY") {
2957 $found_array = 1;
2958 @$res;
2959 } else {
2960 $res;
2961 }
2962 } else {
2963 ();
2964 }
88087414
RL
2965 } (@_);
2966
9c62a279
RL
2967 $add_called = 1;
2968
88087414 2969 if ($found_array) {
84f32c84 2970 [ @values ];
88087414 2971 } else {
84f32c84 2972 join($separator, grep { defined($_) && $_ ne "" } @values);
88087414
RL
2973 }
2974}
2975sub add_before {
bdcd83e1
RL
2976 my $separator = " ";
2977 if (ref($_[$#_]) eq "HASH") {
2978 my $opts = pop;
2979 $separator = $opts->{separator};
2980 }
88087414
RL
2981 my @x = @_;
2982 sub { _add($separator, @x, @_) };
2983}
2984sub add {
bdcd83e1
RL
2985 my $separator = " ";
2986 if (ref($_[$#_]) eq "HASH") {
2987 my $opts = pop;
2988 $separator = $opts->{separator};
2989 }
88087414
RL
2990 my @x = @_;
2991 sub { _add($separator, @_, @x) };
2992}
2993
3b6c4b07
RL
2994sub read_eval_file {
2995 my $fname = shift;
2996 my $content;
2997 my @result;
2998
2999 open F, "< $fname" or die "Can't open '$fname': $!\n";
3000 {
3001 undef local $/;
3002 $content = <F>;
3003 }
3004 close F;
3005 {
3006 local $@;
3007
3008 @result = ( eval $content );
3009 warn $@ if $@;
3010 }
3011 return wantarray ? @result : $result[0];
3012}
3013
bd5192b1
RL
3014# configuration reader, evaluates the input file as a perl script and expects
3015# it to fill %targets with target configurations. Those are then added to
3016# %table.
3017sub read_config {
3018 my $fname = shift;
3b6c4b07
RL
3019 my %targets;
3020
bd5192b1 3021 {
84f32c84
DMSP
3022 # Protect certain tables from tampering
3023 local %table = ();
bd5192b1 3024
84f32c84 3025 %targets = read_eval_file($fname);
bd5192b1 3026 }
225f980d
RL
3027 my %preexisting = ();
3028 foreach (sort keys %targets) {
3029 $preexisting{$_} = 1 if $table{$_};
3030 }
3031 die <<"EOF",
3032The following config targets from $fname
3033shadow pre-existing config targets with the same name:
3034EOF
3035 map { " $_\n" } sort keys %preexisting
3036 if %preexisting;
3037
bd5192b1
RL
3038
3039 # For each target, check that it's configured with a hash table.
3040 foreach (keys %targets) {
84f32c84
DMSP
3041 if (ref($targets{$_}) ne "HASH") {
3042 if (ref($targets{$_}) eq "") {
3043 warn "Deprecated target configuration for $_, ignoring...\n";
3044 } else {
3045 warn "Misconfigured target configuration for $_ (should be a hash table), ignoring...\n";
3046 }
3047 delete $targets{$_};
3048 } else {
ee9b0bbb
RL
3049 $targets{$_}->{_conf_fname_int} = add([ $fname ]);
3050 }
bd5192b1
RL
3051 }
3052
3053 %table = (%table, %targets);
3054
3055}
3056
8483a003
F
3057# configuration resolver. Will only resolve all the lazy evaluation
3058# codeblocks for the chosen target and all those it inherits from,
bd5192b1
RL
3059# recursively
3060sub resolve_config {
3061 my $target = shift;
3062 my @breadcrumbs = @_;
3063
c4718849 3064# my $extra_checks = defined($ENV{CONFIGURE_EXTRA_CHECKS});
9c62a279 3065
bd5192b1 3066 if (grep { $_ eq $target } @breadcrumbs) {
84f32c84
DMSP
3067 die "inherit_from loop! target backtrace:\n "
3068 ,$target,"\n ",join("\n ", @breadcrumbs),"\n";
bd5192b1
RL
3069 }
3070
3071 if (!defined($table{$target})) {
84f32c84
DMSP
3072 warn "Warning! target $target doesn't exist!\n";
3073 return ();
bd5192b1
RL
3074 }
3075 # Recurse through all inheritances. They will be resolved on the
3076 # fly, so when this operation is done, they will all just be a
3077 # bunch of attributes with string values.
3078 # What we get here, though, are keys with references to lists of
3079 # the combined values of them all. We will deal with lists after
3080 # this stage is done.
3081 my %combined_inheritance = ();
3082 if ($table{$target}->{inherit_from}) {
84f32c84
DMSP
3083 my @inherit_from =
3084 map { ref($_) eq "CODE" ? $_->() : $_ } @{$table{$target}->{inherit_from}};
3085 foreach (@inherit_from) {
3086 my %inherited_config = resolve_config($_, $target, @breadcrumbs);
3087
3088 # 'template' is a marker that's considered private to
3089 # the config that had it.
3090 delete $inherited_config{template};
3091
3092 foreach (keys %inherited_config) {
3093 if (!$combined_inheritance{$_}) {
3094 $combined_inheritance{$_} = [];
3095 }
3096 push @{$combined_inheritance{$_}}, $inherited_config{$_};
3097 }
3098 }
bd5192b1
RL
3099 }
3100
3101 # We won't need inherit_from in this target any more, since we've
3102 # resolved all the inheritances that lead to this
3103 delete $table{$target}->{inherit_from};
3104
3105 # Now is the time to deal with those lists. Here's the place to
3106 # decide what shall be done with those lists, all based on the
3107 # values of the target we're currently dealing with.
3108 # - If a value is a coderef, it will be executed with the list of
3109 # inherited values as arguments.
3110 # - If the corresponding key doesn't have a value at all or is the
8483a003 3111 # empty string, the inherited value list will be run through the
bd5192b1
RL
3112 # default combiner (below), and the result becomes this target's
3113 # value.
3114 # - Otherwise, this target's value is assumed to be a string that
3115 # will simply override the inherited list of values.
a26d8be9 3116 my $default_combiner = add();
bd5192b1
RL
3117
3118 my %all_keys =
84f32c84
DMSP
3119 map { $_ => 1 } (keys %combined_inheritance,
3120 keys %{$table{$target}});
b0b92a5b
RL
3121
3122 sub process_values {
84f32c84
DMSP
3123 my $object = shift;
3124 my $inherited = shift; # Always a [ list ]
3125 my $target = shift;
3126 my $entry = shift;
b0b92a5b 3127
9c62a279
RL
3128 $add_called = 0;
3129
b0b92a5b
RL
3130 while(ref($object) eq "CODE") {
3131 $object = $object->(@$inherited);
3132 }
3133 if (!defined($object)) {
3134 return ();
3135 }
3136 elsif (ref($object) eq "ARRAY") {
9c62a279 3137 local $add_called; # To make sure recursive calls don't affect it
b0b92a5b
RL
3138 return [ map { process_values($_, $inherited, $target, $entry) }
3139 @$object ];
3140 } elsif (ref($object) eq "") {
3141 return $object;
3142 } else {
3143 die "cannot handle reference type ",ref($object)
3144 ," found in target ",$target," -> ",$entry,"\n";
3145 }
3146 }
3147
bd5192b1 3148 foreach (sort keys %all_keys) {
9c62a279 3149 my $previous = $combined_inheritance{$_};
bd5192b1 3150
84f32c84
DMSP
3151 # Current target doesn't have a value for the current key?
3152 # Assign it the default combiner, the rest of this loop body
3153 # will handle it just like any other coderef.
3154 if (!exists $table{$target}->{$_}) {
3155 $table{$target}->{$_} = $default_combiner;
3156 }
bd5192b1 3157
84f32c84
DMSP
3158 $table{$target}->{$_} = process_values($table{$target}->{$_},
3159 $combined_inheritance{$_},
3160 $target, $_);
b0b92a5b
RL
3161 unless(defined($table{$target}->{$_})) {
3162 delete $table{$target}->{$_};
3163 }
c4718849
RL
3164# if ($extra_checks &&
3165# $previous && !($add_called || $previous ~~ $table{$target}->{$_})) {
3166# warn "$_ got replaced in $target\n";
3167# }
bd5192b1
RL
3168 }
3169
3170 # Finally done, return the result.
3171 return %{$table{$target}};
3172}
3173
462ba4f6 3174sub usage
84f32c84
DMSP
3175 {
3176 print STDERR $usage;
3177 print STDERR "\npick os/compiler from:\n";
3178 my $j=0;
3179 my $i;
10a926c1 3180 my $k=0;
84f32c84
DMSP
3181 foreach $i (sort keys %table)
3182 {
3183 next if $table{$i}->{template};
3184 next if $i =~ /^debug/;
3185 $k += length($i) + 1;
3186 if ($k > 78)
3187 {
3188 print STDERR "\n";
3189 $k=length($i);
3190 }
3191 print STDERR $i . " ";
3192 }
3193 foreach $i (sort keys %table)
3194 {
3195 next if $table{$i}->{template};
3196 next if $i !~ /^debug/;
3197 $k += length($i) + 1;
3198 if ($k > 78)
3199 {
3200 print STDERR "\n";
3201 $k=length($i);
3202 }
3203 print STDERR $i . " ";
3204 }
3205 print STDERR "\n\nNOTE: If in doubt, on Unix-ish systems use './config'.\n";
3206 exit(1);
3207 }
d02b48c6 3208
01d99976 3209sub run_dofile
107b5792 3210{
107b5792 3211 my $out = shift;
9fe2bb77 3212 my @templates = @_;
107b5792 3213
ced2c2c5
RS
3214 unlink $out || warn "Can't remove $out, $!"
3215 if -f $out;
9fe2bb77
RL
3216 foreach (@templates) {
3217 die "Can't open $_, $!" unless -f $_;
3218 }
9e265322 3219 my $perlcmd = (quotify("maybeshell", $config{PERL}))[0];
f879d5ff 3220 my $cmd = "$perlcmd \"-I.\" \"-Mconfigdata\" \"$dofile\" -o\"Configure\" \"".join("\" \"",@templates)."\" > \"$out.new\"";
9fe2bb77
RL
3221 #print STDERR "DEBUG[run_dofile]: \$cmd = $cmd\n";
3222 system($cmd);
107b5792
RL
3223 exit 1 if $? != 0;
3224 rename("$out.new", $out) || die "Can't rename $out.new, $!";
3225}
3226
6d75a83c
RL
3227sub compiler_predefined {
3228 state %predefined;
41d6e0f3 3229 my $cc = shift;
6d75a83c
RL
3230
3231 return () if $^O eq 'VMS';
3232
41d6e0f3
AP
3233 die 'compiler_predefined called without a compiler command'
3234 unless $cc;
6d75a83c 3235
41d6e0f3 3236 if (! $predefined{$cc}) {
6d75a83c 3237
41d6e0f3 3238 $predefined{$cc} = {};
6d75a83c
RL
3239
3240 # collect compiler pre-defines from gcc or gcc-alike...
3241 open(PIPE, "$cc -dM -E -x c /dev/null 2>&1 |");
3242 while (my $l = <PIPE>) {
3243 $l =~ m/^#define\s+(\w+(?:\(\w+\))?)(?:\s+(.+))?/ or last;
41d6e0f3 3244 $predefined{$cc}->{$1} = $2 // '';
6d75a83c
RL
3245 }
3246 close(PIPE);
3247 }
3248
41d6e0f3 3249 return %{$predefined{$cc}};
6d75a83c
RL
3250}
3251
656bbdc6
AP
3252sub which
3253{
3254 my ($name)=@_;
3255
3256 if (eval { require IPC::Cmd; 1; }) {
3257 IPC::Cmd->import();
3258 return scalar IPC::Cmd::can_run($name);
3259 } else {
3260 # if there is $directories component in splitpath,
3261 # then it's not something to test with $PATH...
3262 return $name if (File::Spec->splitpath($name))[1];
3263
3264 foreach (File::Spec->path()) {
3265 my $fullpath = catfile($_, "$name$target{exe_extension}");
3266 if (-f $fullpath and -x $fullpath) {
3267 return $fullpath;
3268 }
3269 }
3270 }
3271}
3272
7ecdf18d
RL
3273sub env
3274{
3275 my $name = shift;
ac6ae8a9 3276 my %opts = @_;
7ecdf18d 3277
ac6ae8a9
RL
3278 unless ($opts{cacheonly}) {
3279 # Note that if $ENV{$name} doesn't exist or is undefined,
3280 # $config{perlenv}->{$name} will be created with the value
3281 # undef. This is intentional.
89bea083 3282
ac6ae8a9
RL
3283 $config{perlenv}->{$name} = $ENV{$name}
3284 if ! exists $config{perlenv}->{$name};
3285 }
7ecdf18d
RL
3286 return $config{perlenv}->{$name};
3287}
3288
00ae96ca
RL
3289# Configuration printer ##############################################
3290
3291sub print_table_entry
3292{
f770d75b
AP
3293 local $now_printing = shift;
3294 my %target = resolve_config($now_printing);
00ae96ca
RL
3295 my $type = shift;
3296
3297 # Don't print the templates
3298 return if $target{template};
3299
3300 my @sequence = (
84f32c84
DMSP
3301 "sys_id",
3302 "cpp",
3303 "cppflags",
3304 "defines",
3305 "includes",
3306 "cc",
3307 "cflags",
3308 "unistd",
3309 "ld",
3310 "lflags",
3311 "loutflag",
3312 "ex_libs",
3313 "bn_ops",
3314 "apps_aux_src",
3315 "cpuid_asm_src",
3316 "uplink_aux_src",
3317 "bn_asm_src",
3318 "ec_asm_src",
3319 "des_asm_src",
3320 "aes_asm_src",
3321 "bf_asm_src",
3322 "md5_asm_src",
3323 "cast_asm_src",
3324 "sha1_asm_src",
3325 "rc4_asm_src",
3326 "rmd160_asm_src",
3327 "rc5_asm_src",
3328 "wp_asm_src",
3329 "cmll_asm_src",
3330 "modes_asm_src",
3331 "padlock_asm_src",
3332 "chacha_asm_src",
3333 "poly1035_asm_src",
3334 "thread_scheme",
3335 "perlasm_scheme",
3336 "dso_scheme",
3337 "shared_target",
3338 "shared_cflag",
3339 "shared_defines",
3340 "shared_ldflag",
3341 "shared_rcflag",
3342 "shared_extension",
3343 "dso_extension",
3344 "obj_extension",
3345 "exe_extension",
3346 "ranlib",
3347 "ar",
3348 "arflags",
3349 "aroutflag",
3350 "rc",
3351 "rcflags",
3352 "rcoutflag",
3353 "mt",
3354 "mtflags",
3355 "mtinflag",
3356 "mtoutflag",
3357 "multilib",
3358 "build_scheme",
3359 );
00ae96ca
RL
3360
3361 if ($type eq "TABLE") {
84f32c84
DMSP
3362 print "\n";
3363 print "*** $now_printing\n";
cb212f23
RL
3364 foreach (@sequence) {
3365 if (ref($target{$_}) eq "ARRAY") {
3366 printf "\$%-12s = %s\n", $_, join(" ", @{$target{$_}});
3367 } else {
3368 printf "\$%-12s = %s\n", $_, $target{$_};
3369 }
3370 }
00ae96ca 3371 } elsif ($type eq "HASH") {
84f32c84
DMSP
3372 my $largest =
3373 length((sort { length($a) <=> length($b) } @sequence)[-1]);
3374 print " '$now_printing' => {\n";
3375 foreach (@sequence) {
3376 if ($target{$_}) {
cb212f23
RL
3377 if (ref($target{$_}) eq "ARRAY") {
3378 print " '",$_,"'"," " x ($largest - length($_))," => [ ",join(", ", map { "'$_'" } @{$target{$_}})," ],\n";
3379 } else {
3380 print " '",$_,"'"," " x ($largest - length($_))," => '",$target{$_},"',\n";
3381 }
84f32c84
DMSP
3382 }
3383 }
3384 print " },\n";
00ae96ca
RL
3385 }
3386}
3387
3388# Utility routines ###################################################
3389
2e963849
RL
3390# On VMS, if the given file is a logical name, File::Spec::Functions
3391# will consider it an absolute path. There are cases when we want a
3392# purely syntactic check without checking the environment.
3393sub isabsolute {
3394 my $file = shift;
3395
3396 # On non-platforms, we just use file_name_is_absolute().
3397 return file_name_is_absolute($file) unless $^O eq "VMS";
3398
69687aa8 3399 # If the file spec includes a device or a directory spec,
2e963849
RL
3400 # file_name_is_absolute() is perfectly safe.
3401 return file_name_is_absolute($file) if $file =~ m|[:\[]|;
3402
3403 # Here, we know the given file spec isn't absolute
3404 return 0;
3405}
3406
ec182ef0
RL
3407# Makes a directory absolute and cleans out /../ in paths like foo/../bar
3408# On some platforms, this uses rel2abs(), while on others, realpath() is used.
3409# realpath() requires that at least all path components except the last is an
3410# existing directory. On VMS, the last component of the directory spec must
3411# exist.
3412sub absolutedir {
3413 my $dir = shift;
3414
3415 # realpath() is quite buggy on VMS. It uses LIB$FID_TO_NAME, which
3416 # will return the volume name for the device, no matter what. Also,
3417 # it will return an incorrect directory spec if the argument is a
3418 # directory that doesn't exist.
3419 if ($^O eq "VMS") {
3420 return rel2abs($dir);
3421 }
3422
3423 # We use realpath() on Unix, since no other will properly clean out
3424 # a directory spec.
3425 use Cwd qw/realpath/;
3426
3427 return realpath($dir);
3428}
3429
fe05264e
RL
3430sub quotify {
3431 my %processors = (
84f32c84
DMSP
3432 perl => sub { my $x = shift;
3433 $x =~ s/([\\\$\@"])/\\$1/g;
3434 return '"'.$x.'"'; },
3435 maybeshell => sub { my $x = shift;
3436 (my $y = $x) =~ s/([\\\"])/\\$1/g;
3437 if ($x ne $y || $x =~ m|\s|) {
3438 return '"'.$y.'"';
3439 } else {
3440 return $x;
3441 }
3442 },
3443 );
fe05264e
RL
3444 my $for = shift;
3445 my $processor =
84f32c84 3446 defined($processors{$for}) ? $processors{$for} : sub { shift; };
fe05264e 3447
2110febb 3448 return map { $processor->($_); } @_;
fe05264e 3449}
107b5792 3450
9fe2bb77
RL
3451# collect_from_file($filename, $line_concat_cond_re, $line_concat)
3452# $filename is a file name to read from
3453# $line_concat_cond_re is a regexp detecting a line continuation ending
3454# $line_concat is a CODEref that takes care of concatenating two lines
3455sub collect_from_file {
3456 my $filename = shift;
3457 my $line_concat_cond_re = shift;
3458 my $line_concat = shift;
3459
3460 open my $fh, $filename || die "unable to read $filename: $!\n";
3461 return sub {
3462 my $saved_line = "";
3463 $_ = "";
3464 while (<$fh>) {
04f171c0 3465 s|\R$||;
9fe2bb77
RL
3466 if (defined $line_concat) {
3467 $_ = $line_concat->($saved_line, $_);
3468 $saved_line = "";
3469 }
3470 if (defined $line_concat_cond_re && /$line_concat_cond_re/) {
3471 $saved_line = $_;
3472 next;
3473 }
3474 return $_;
3475 }
3476 die "$filename ending with continuation line\n" if $_;
3477 close $fh;
3478 return undef;
3479 }
3480}
3481
3482# collect_from_array($array, $line_concat_cond_re, $line_concat)
3483# $array is an ARRAYref of lines
3484# $line_concat_cond_re is a regexp detecting a line continuation ending
3485# $line_concat is a CODEref that takes care of concatenating two lines
3486sub collect_from_array {
3487 my $array = shift;
3488 my $line_concat_cond_re = shift;
3489 my $line_concat = shift;
3490 my @array = (@$array);
3491
3492 return sub {
3493 my $saved_line = "";
3494 $_ = "";
3495 while (defined($_ = shift @array)) {
04f171c0 3496 s|\R$||;
9fe2bb77
RL
3497 if (defined $line_concat) {
3498 $_ = $line_concat->($saved_line, $_);
3499 $saved_line = "";
3500 }
3501 if (defined $line_concat_cond_re && /$line_concat_cond_re/) {
3502 $saved_line = $_;
3503 next;
3504 }
3505 return $_;
3506 }
3507 die "input text ending with continuation line\n" if $_;
3508 return undef;
3509 }
3510}
3511
3512# collect_information($lineiterator, $line_continue, $regexp => $CODEref, ...)
3513# $lineiterator is a CODEref that delivers one line at a time.
107b5792
RL
3514# All following arguments are regex/CODEref pairs, where the regexp detects a
3515# line and the CODEref does something with the result of the regexp.
3516sub collect_information {
9fe2bb77 3517 my $lineiterator = shift;
107b5792
RL
3518 my %collectors = @_;
3519
9fe2bb77 3520 while(defined($_ = $lineiterator->())) {
04f171c0 3521 s|\R$||;
9fe2bb77 3522 my $found = 0;
2b6b606c
RL
3523 if ($collectors{"BEFORE"}) {
3524 $collectors{"BEFORE"}->($_);
3525 }
9fe2bb77 3526 foreach my $re (keys %collectors) {
2b6b606c 3527 if ($re !~ /^OTHERWISE|BEFORE|AFTER$/ && /$re/) {
9fe2bb77
RL
3528 $collectors{$re}->($lineiterator);
3529 $found = 1;
3530 };
3531 }
3532 if ($collectors{"OTHERWISE"}) {
3533 $collectors{"OTHERWISE"}->($lineiterator, $_)
3534 unless $found || !defined $collectors{"OTHERWISE"};
3535 }
2b6b606c
RL
3536 if ($collectors{"AFTER"}) {
3537 $collectors{"AFTER"}->($_);
3538 }
107b5792 3539 }
107b5792 3540}
ce959812
RL
3541
3542# tokenize($line)
5d3af259 3543# tokenize($line,$separator)
ce959812 3544# $line is a line of text to split up into tokens
5d3af259
RL
3545# $separator [optional] is a regular expression that separates the tokens,
3546# the default being spaces. Do not use quotes of any kind as separators,
3547# that will give undefined results.
3548# Returns a list of tokens.
ce959812 3549#
5d3af259
RL
3550# Tokens are divided by separator (spaces by default). If the tokens include
3551# the separators, they have to be quoted with single or double quotes.
3552# Double quotes inside a double quoted token must be escaped. Escaping is done
ce959812
RL
3553# with backslash.
3554# Basically, the same quoting rules apply for " and ' as in any
3555# Unix shell.
3556sub tokenize {
3557 my $line = my $debug_line = shift;
5d3af259 3558 my $separator = shift // qr|\s+|;
ce959812
RL
3559 my @result = ();
3560
5d3af259
RL
3561 if ($ENV{CONFIGURE_DEBUG_TOKENIZE}) {
3562 print STDERR "DEBUG[tokenize]: \$separator = $separator\n";
3563 }
3564
3565 while ($line =~ s|^${separator}||, $line ne "") {
ce959812 3566 my $token = "";
5d3af259
RL
3567 again:
3568 $line =~ m/^(.*?)(${separator}|"|'|$)/;
3569 $token .= $1;
3570 $line = $2.$';
3571
3572 if ($line =~ m/^"((?:[^"\\]+|\\.)*)"/) {
3573 $token .= $1;
3574 $line = $';
3575 goto again;
3576 } elsif ($line =~ m/^'([^']*)'/) {
3577 $token .= $1;
3578 $line = $';
3579 goto again;
ce959812
RL
3580 }
3581 push @result, $token;
3582 }
3583
3584 if ($ENV{CONFIGURE_DEBUG_TOKENIZE}) {
5d3af259
RL
3585 print STDERR "DEBUG[tokenize]: Parsed '$debug_line' into:\n";
3586 print STDERR "DEBUG[tokenize]: ('", join("', '", @result), "')\n";
ce959812
RL
3587 }
3588 return @result;
3589}