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