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