]> git.ipfire.org Git - thirdparty/openssl.git/blame - Configure
Make sure ./config passes options to ./Configure correctly
[thirdparty/openssl.git] / Configure
CommitLineData
de17db91 1#! /usr/bin/env perl
f4d8f037 2# -*- mode: perl; -*-
d42d0a4d 3# Copyright 2016-2017 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 = ();
3e83e686 182
bd5192b1 183# Forward declarations ###############################################
7ead0c89 184
bd5192b1
RL
185# read_config(filename)
186#
187# Reads a configuration file and populates %table with the contents
188# (which the configuration file places in %targets).
189sub read_config;
7d46b942 190
bd5192b1
RL
191# resolve_config(target)
192#
8483a003 193# Resolves all the late evaluations, inheritances and so on for the
bd5192b1
RL
194# chosen target and any target it inherits from.
195sub resolve_config;
7d46b942 196
15c7adb0 197
107b5792
RL
198# Information collection #############################################
199
9fe2bb77 200# Unified build supports separate build dir
ec182ef0
RL
201my $srcdir = catdir(absolutedir(dirname($0))); # catdir ensures local syntax
202my $blddir = catdir(absolutedir(".")); # catdir ensures local syntax
9fe2bb77
RL
203my $dofile = abs2rel(catfile($srcdir, "util/dofile.pl"));
204
b5293d4c
RL
205my $local_config_envname = 'OPENSSL_LOCAL_CONFIG_DIR';
206
9fe2bb77
RL
207$config{sourcedir} = abs2rel($srcdir);
208$config{builddir} = abs2rel($blddir);
209
ee4cdb7f
RL
210# Collect reconfiguration information if needed
211my @argvcopy=@ARGV;
212
213if (grep /^reconf(igure)?$/, @argvcopy) {
214 if (-f "./configdata.pm") {
215 my $file = "./configdata.pm";
216 unless (my $return = do $file) {
217 die "couldn't parse $file: $@" if $@;
218 die "couldn't do $file: $!" unless defined $return;
219 die "couldn't run $file" unless $return;
220 }
221
222 @argvcopy = defined($configdata::config{perlargv}) ?
223 @{$configdata::config{perlargv}} : ();
224 die "Incorrect data to reconfigure, please do a normal configuration\n"
225 if (grep(/^reconf/,@argvcopy));
7ecdf18d 226 $config{perlenv} = $configdata::config{perlenv} // {};
ee4cdb7f
RL
227
228 print "Reconfiguring with: ", join(" ",@argvcopy), "\n";
7ecdf18d
RL
229 foreach (sort keys %{$config{perlenv}}) {
230 print " $_ = $config{perlenv}->{$_}\n";
231 }
ee4cdb7f
RL
232 } else {
233 die "Insufficient data to reconfigure, please do a normal configuration\n";
234 }
235}
236
237$config{perlargv} = [ @argvcopy ];
238
107b5792
RL
239# Collect version numbers
240$config{version} = "unknown";
241$config{version_num} = "unknown";
242$config{shlib_version_number} = "unknown";
243$config{shlib_version_history} = "unknown";
244
245collect_information(
9fe2bb77 246 collect_from_file(catfile($srcdir,'include/openssl/opensslv.h')),
107b5792
RL
247 qr/OPENSSL.VERSION.TEXT.*OpenSSL (\S+) / => sub { $config{version} = $1; },
248 qr/OPENSSL.VERSION.NUMBER.*(0x\S+)/ => sub { $config{version_num}=$1 },
249 qr/SHLIB_VERSION_NUMBER *"([^"]+)"/ => sub { $config{shlib_version_number}=$1 },
250 qr/SHLIB_VERSION_HISTORY *"([^"]*)"/ => sub { $config{shlib_version_history}=$1 }
251 );
252if ($config{shlib_version_history} ne "") { $config{shlib_version_history} .= ":"; }
253
254($config{major}, $config{minor})
255 = ($config{version} =~ /^([0-9]+)\.([0-9\.]+)/);
256($config{shlib_major}, $config{shlib_minor})
257 = ($config{shlib_version_number} =~ /^([0-9]+)\.([0-9\.]+)/);
258die "erroneous version information in opensslv.h: ",
259 "$config{major}, $config{minor}, $config{shlib_major}, $config{shlib_minor}\n"
260 if ($config{major} eq "" || $config{minor} eq ""
261 || $config{shlib_major} eq "" || $config{shlib_minor} eq "");
262
263# Collect target configurations
264
85152ca4 265my $pattern = catfile(dirname($0), "Configurations", "*.conf");
97855556 266foreach (sort glob($pattern)) {
f09e7ca9
RS
267 &read_config($_);
268}
d02b48c6 269
7ecdf18d 270if (defined env($local_config_envname)) {
b5293d4c
RL
271 if ($^O eq 'VMS') {
272 # VMS environment variables are logical names,
273 # which can be used as is
274 $pattern = $local_config_envname . ':' . '*.conf';
275 } else {
7ecdf18d 276 $pattern = catfile(env($local_config_envname), '*.conf');
b5293d4c
RL
277 }
278
97855556 279 foreach (sort glob($pattern)) {
b5293d4c
RL
280 &read_config($_);
281 }
282}
283
291e94df
RL
284$config{prefix}="";
285$config{openssldir}="";
7d130f68 286$config{processor}="";
107b5792 287$config{libdir}="";
642a6138 288$config{cross_compile_prefix}="";
9c62a279 289my $auto_threads=1; # enable threads automatically? true by default
0396479d 290my $default_ranlib;
107b5792
RL
291
292# Top level directories to build
342a1a23 293$config{dirs} = [ "crypto", "ssl", "engines", "apps", "test", "util", "tools", "fuzz" ];
107b5792
RL
294# crypto/ subdirectories to build
295$config{sdirs} = [
296 "objects",
a0c3e4fa 297 "md2", "md4", "md5", "sha", "mdc2", "hmac", "ripemd", "whrlpool", "poly1305", "blake2", "siphash", "sm3",
f19a5ff9 298 "des", "aes", "rc2", "rc4", "rc5", "idea", "aria", "bf", "cast", "camellia", "seed", "sm4", "chacha", "modes",
107b5792
RL
299 "bn", "ec", "rsa", "dsa", "dh", "dso", "engine",
300 "buffer", "bio", "stack", "lhash", "rand", "err",
301 "evp", "asn1", "pem", "x509", "x509v3", "conf", "txt_db", "pkcs7", "pkcs12", "comp", "ocsp", "ui",
71a5516d 302 "cms", "ts", "srp", "cmac", "ct", "async", "kdf", "store"
107b5792 303 ];
cfa76979
RL
304# test/ subdirectories to build
305$config{tdirs} = [ "ossl_shim" ];
99aab161 306
6b01bed2 307# Known TLS and DTLS protocols
84a68336 308my @tls = qw(ssl3 tls1 tls1_1 tls1_2 tls1_3);
6b01bed2
VD
309my @dtls = qw(dtls1 dtls1_2);
310
8483a003 311# Explicitly known options that are possible to disable. They can
8b527be2
RL
312# be regexps, and will be used like this: /^no-${option}$/
313# For developers: keep it sorted alphabetically
314
315my @disablables = (
c91a0a83 316 "afalgeng",
d42d0a4d 317 "aria",
c38bb727 318 "asan",
8b527be2 319 "asm",
52739e40 320 "async",
b184e3ef 321 "autoalginit",
498abff0 322 "autoerrinit",
8b527be2 323 "bf",
2d0b4412 324 "blake2",
8b527be2
RL
325 "camellia",
326 "capieng",
327 "cast",
48f14845 328 "chacha",
8b527be2
RL
329 "cmac",
330 "cms",
331 "comp",
3e45d393 332 "crypto-mdebug",
ef8ca6bd 333 "crypto-mdebug-backtrace",
8b527be2
RL
334 "ct",
335 "deprecated",
336 "des",
619eb33a 337 "devcryptoeng",
8b527be2
RL
338 "dgram",
339 "dh",
340 "dsa",
341 "dso",
a5ecdc6a 342 "dtls",
343ec2b0 343 "dynamic-engine",
8b527be2
RL
344 "ec",
345 "ec2m",
6b01bed2
VD
346 "ecdh",
347 "ecdsa",
8b527be2 348 "ec_nistp_64_gcc_128",
b31feae6 349 "egd",
8b527be2 350 "engine",
1288f26f 351 "err",
ce2596d4 352 "external-tests",
02f7114a 353 "filenames",
f59d0131
KR
354 "fuzz-libfuzzer",
355 "fuzz-afl",
168c3b73 356 "gost",
b612799a 357 "heartbeats",
8b527be2
RL
358 "hw(-.+)?",
359 "idea",
09aa263a 360 "makedepend",
8b527be2
RL
361 "md2",
362 "md4",
8b527be2 363 "mdc2",
29df3061 364 "msan",
fa22f98f 365 "multiblock",
8b527be2
RL
366 "nextprotoneg",
367 "ocb",
368 "ocsp",
ae48242c 369 "pic",
48f14845 370 "poly1305",
8b527be2
RL
371 "posix-io",
372 "psk",
373 "rc2",
374 "rc4",
375 "rc5",
376 "rdrand",
377 "rfc3779",
8b527be2 378 "rmd160",
8b527be2 379 "scrypt",
8b527be2
RL
380 "sctp",
381 "seed",
8b527be2 382 "shared",
3f5616d7 383 "siphash",
a0c3e4fa 384 "sm3",
f19a5ff9 385 "sm4",
8b527be2
RL
386 "sock",
387 "srp",
388 "srtp",
389 "sse2",
390 "ssl",
8b527be2
RL
391 "ssl-trace",
392 "static-engine",
393 "stdio",
93880ce1 394 "tests",
8b527be2
RL
395 "threads",
396 "tls",
3556b83e 397 "tls13downgrade",
1288f26f 398 "ts",
c38bb727 399 "ubsan",
48feaceb 400 "ui-console",
8b527be2
RL
401 "unit-test",
402 "whirlpool",
8b1a5af3 403 "weak-ssl-ciphers",
8b527be2
RL
404 "zlib",
405 "zlib-dynamic",
406 );
6b01bed2
VD
407foreach my $proto ((@tls, @dtls))
408 {
409 push(@disablables, $proto);
d8c66f5e 410 push(@disablables, "$proto-method") unless $proto eq "tls1_3";
6b01bed2 411 }
8b527be2 412
2b1343b9
MC
413my %deprecated_disablables = (
414 "ssl2" => undef,
415 "buf-freelists" => undef,
48feaceb
RL
416 "ripemd" => "rmd160",
417 "ui" => "ui-console",
e80381e1
RL
418 );
419
c9a112f5
BM
420# All of the following is disabled by default (RC5 was enabled before 0.9.8):
421
9e04edf2 422our %disabled = ( # "what" => "comment"
d42d0a4d 423 "aria" => "default",
c38bb727 424 "asan" => "default",
a9c27fe1
BK
425 "crypto-mdebug" => "default",
426 "crypto-mdebug-backtrace" => "default",
619eb33a 427 "devcryptoeng" => "default",
9e04edf2 428 "ec_nistp_64_gcc_128" => "default",
8b1a5af3 429 "egd" => "default",
ce2596d4 430 "external-tests" => "default",
f59d0131
KR
431 "fuzz-libfuzzer" => "default",
432 "fuzz-afl" => "default",
b612799a 433 "heartbeats" => "default",
8b1a5af3 434 "md2" => "default",
29df3061 435 "msan" => "default",
8b1a5af3
MC
436 "rc5" => "default",
437 "sctp" => "default",
8b1a5af3 438 "ssl-trace" => "default",
9829b5ab
KR
439 "ssl3" => "default",
440 "ssl3-method" => "default",
c38bb727 441 "ubsan" => "default",
84a68336
MC
442 #TODO(TLS1.3): Temporarily disabled while this is a WIP
443 "tls1_3" => "default",
3556b83e 444 "tls13downgrade" => "default",
8b1a5af3
MC
445 "unit-test" => "default",
446 "weak-ssl-ciphers" => "default",
447 "zlib" => "default",
448 "zlib-dynamic" => "default",
9e04edf2 449 );
c9a112f5 450
c569e206
RL
451# Note: => pair form used for aesthetics, not to truly make a hash table
452my @disable_cascades = (
453 # "what" => [ "cascade", ... ]
7d130f68 454 sub { $config{processor} eq "386" }
c569e206
RL
455 => [ "sse2" ],
456 "ssl" => [ "ssl3" ],
457 "ssl3-method" => [ "ssl3" ],
458 "zlib" => [ "zlib-dynamic" ],
c569e206 459 "des" => [ "mdc2" ],
9e4d6fbf 460 "ec" => [ "ecdsa", "ecdh" ],
c569e206 461
3fd4d211 462 "dgram" => [ "dtls", "sctp" ],
505f74ca 463 "sock" => [ "dgram" ],
c569e206 464 "dtls" => [ @dtls ],
343a7467
RL
465 sub { 0 == scalar grep { !$disabled{$_} } @dtls }
466 => [ "dtls" ],
c569e206 467
c569e206 468 "tls" => [ @tls ],
343a7467
RL
469 sub { 0 == scalar grep { !$disabled{$_} } @tls }
470 => [ "tls" ],
c569e206 471
ef8ca6bd 472 "crypto-mdebug" => [ "crypto-mdebug-backtrace" ],
343ec2b0
RL
473
474 # Without DSO, we can't load dynamic engines, so don't build them dynamic
475 "dso" => [ "dynamic-engine" ],
ae48242c
RL
476
477 # Without position independent code, there can be no shared libraries or DSOs
00698061
RL
478 "pic" => [ "shared" ],
479 "shared" => [ "dynamic-engine" ],
619eb33a 480 "engine" => [ "afalgeng", "devcryptoeng" ],
d90a6beb
MC
481
482 # no-autoalginit is only useful when building non-shared
483 "autoalginit" => [ "shared", "apps" ],
484
15a1bd0a 485 "stdio" => [ "apps", "capieng", "egd" ],
d90a6beb 486 "apps" => [ "tests" ],
302eba3f 487 "tests" => [ "external-tests" ],
3cf96e88
MC
488 "comp" => [ "zlib" ],
489 "ec" => [ "tls1_3" ],
b612799a 490 sub { !$disabled{"unit-test"} } => [ "heartbeats" ],
29df3061
EK
491
492 sub { !$disabled{"msan"} } => [ "asm" ],
c569e206
RL
493 );
494
495# Avoid protocol support holes. Also disable all versions below N, if version
496# N is disabled while N+1 is enabled.
497#
498my @list = (reverse @tls);
499while ((my $first, my $second) = (shift @list, shift @list)) {
500 last unless @list;
501 push @disable_cascades, ( sub { !$disabled{$first} && $disabled{$second} }
502 => [ @list ] );
503 unshift @list, $second;
504}
505my @list = (reverse @dtls);
506while ((my $first, my $second) = (shift @list, shift @list)) {
507 last unless @list;
508 push @disable_cascades, ( sub { !$disabled{$first} && $disabled{$second} }
509 => [ @list ] );
510 unshift @list, $second;
511}
512
7a762197 513# Explicit "no-..." options will be collected in %disabled along with the defaults.
e4ef2e25 514# To remove something from %disabled, use "enable-foo".
7a762197
BM
515# For symmetry, "disable-foo" is a synonym for "no-foo".
516
d0590fe6 517my $no_sse2=0;
b6e4dac2 518
462ba4f6 519&usage if ($#ARGV < 0);
d02b48c6 520
bcb1977b
RL
521my $user_cflags="";
522my @user_defines=();
7d130f68
RL
523$config{openssl_api_defines}=[];
524$config{openssl_algorithm_defines}=[];
525$config{openssl_thread_defines}=[];
526$config{openssl_sys_defines}=[];
527$config{openssl_other_defines}=[];
fe05264e
RL
528my $libs="";
529my $target="";
3fa04f0d 530$config{options}="";
8864f0de 531$config{build_type} = "release";
c59cb511 532
fe05264e 533my %unsupported_options = ();
e80381e1 534my %deprecated_options = ();
8389ec4b
RS
535# If you change this, update apps/version.c
536my @known_seed_sources = qw(getrandom devrandom os egd none rdcpu librandom);
537my @seed_sources = ();
fad599f7 538while (@argvcopy)
16b6081e 539 {
fad599f7 540 $_ = shift @argvcopy;
89bea083
RL
541
542 # Support env variable assignments among the options
543 if (m|^(\w+)=(.+)?$|)
544 {
545 $config{perlenv}->{$1} = $2;
546 next;
547 }
548
7c55e22c
RL
549 # VMS is a case insensitive environment, and depending on settings
550 # out of our control, we may receive options uppercased. Let's
551 # downcase at least the part before any equal sign.
552 if ($^O eq "VMS")
553 {
554 s/^([^=]*)/lc($1)/e;
555 }
fe05264e 556 s /^-no-/no-/; # some people just can't read the instructions
c9a112f5 557
fe05264e
RL
558 # rewrite some options in "enable-..." form
559 s /^-?-?shared$/enable-shared/;
560 s /^sctp$/enable-sctp/;
561 s /^threads$/enable-threads/;
562 s /^zlib$/enable-zlib/;
563 s /^zlib-dynamic$/enable-zlib-dynamic/;
c9a112f5 564
e4ef2e25 565 if (/^(no|disable|enable)-(.+)$/)
2b1343b9
MC
566 {
567 my $word = $2;
568 if (!exists $deprecated_disablables{$word}
569 && !grep { $word =~ /^${_}$/ } @disablables)
570 {
571 $unsupported_options{$_} = 1;
572 next;
573 }
574 }
575 if (/^no-(.+)$/ || /^disable-(.+)$/)
576 {
e4ef2e25
RS
577 foreach my $proto ((@tls, @dtls))
578 {
579 if ($1 eq "$proto-method")
580 {
581 $disabled{"$proto"} = "option($proto-method)";
582 last;
583 }
584 }
585 if ($1 eq "dtls")
586 {
587 foreach my $proto (@dtls)
588 {
589 $disabled{$proto} = "option(dtls)";
590 }
c5c7700c 591 $disabled{"dtls"} = "option(dtls)";
e4ef2e25
RS
592 }
593 elsif ($1 eq "ssl")
594 {
595 # Last one of its kind
596 $disabled{"ssl3"} = "option(ssl)";
597 }
598 elsif ($1 eq "tls")
599 {
600 # XXX: Tests will fail if all SSL/TLS
601 # protocols are disabled.
602 foreach my $proto (@tls)
603 {
604 $disabled{$proto} = "option(tls)";
605 }
606 }
343ec2b0
RL
607 elsif ($1 eq "static-engine")
608 {
19ab5790 609 delete $disabled{"dynamic-engine"};
343ec2b0
RL
610 }
611 elsif ($1 eq "dynamic-engine")
612 {
19ab5790 613 $disabled{"dynamic-engine"} = "option";
343ec2b0 614 }
2b1343b9
MC
615 elsif (exists $deprecated_disablables{$1})
616 {
617 $deprecated_options{$_} = 1;
618 if (defined $deprecated_disablables{$1})
619 {
620 $disabled{$deprecated_disablables{$1}} = "option";
621 }
622 }
e4ef2e25
RS
623 else
624 {
625 $disabled{$1} = "option";
626 }
9c62a279
RL
627 # No longer an automatic choice
628 $auto_threads = 0 if ($1 eq "threads");
fe05264e 629 }
e4ef2e25 630 elsif (/^enable-(.+)$/)
fe05264e 631 {
343ec2b0
RL
632 if ($1 eq "static-engine")
633 {
19ab5790 634 $disabled{"dynamic-engine"} = "option";
343ec2b0
RL
635 }
636 elsif ($1 eq "dynamic-engine")
637 {
19ab5790 638 delete $disabled{"dynamic-engine"};
343ec2b0 639 }
25004db7
RL
640 elsif ($1 eq "zlib-dynamic")
641 {
642 delete $disabled{"zlib"};
643 }
fe05264e 644 my $algo = $1;
fe05264e 645 delete $disabled{$algo};
c9a112f5 646
9c62a279
RL
647 # No longer an automatic choice
648 $auto_threads = 0 if ($1 eq "threads");
fe05264e
RL
649 }
650 elsif (/^--strict-warnings$/)
651 {
652 $strict_warnings = 1;
653 }
654 elsif (/^--debug$/)
655 {
8864f0de 656 $config{build_type} = "debug";
fe05264e
RL
657 }
658 elsif (/^--release$/)
659 {
8864f0de 660 $config{build_type} = "release";
fe05264e
RL
661 }
662 elsif (/^386$/)
7d130f68 663 { $config{processor}=386; }
fe05264e
RL
664 elsif (/^fips$/)
665 {
b53338cb 666 die "FIPS mode not supported\n";
fe05264e
RL
667 }
668 elsif (/^rsaref$/)
669 {
670 # No RSAref support any more since it's not needed.
671 # The check for the option is there so scripts aren't
672 # broken
673 }
674 elsif (/^nofipscanistercheck$/)
675 {
b53338cb 676 die "FIPS mode not supported\n";
fe05264e
RL
677 }
678 elsif (/^[-+]/)
679 {
45c6e23c 680 if (/^--prefix=(.*)$/)
fe05264e 681 {
291e94df 682 $config{prefix}=$1;
5482dac9
RL
683 die "Directory given with --prefix MUST be absolute\n"
684 unless file_name_is_absolute($config{prefix});
c9a112f5 685 }
fe05264e 686 elsif (/^--api=(.*)$/)
0c28f277 687 {
107b5792 688 $config{api}=$1;
0c28f277 689 }
fe05264e 690 elsif (/^--libdir=(.*)$/)
9e43c6b5 691 {
107b5792 692 $config{libdir}=$1;
9e43c6b5 693 }
fe05264e 694 elsif (/^--openssldir=(.*)$/)
9e43c6b5 695 {
291e94df 696 $config{openssldir}=$1;
9e43c6b5 697 }
fe05264e 698 elsif (/^--with-zlib-lib=(.*)$/)
9fdb2cc5 699 {
20a5819f 700 $withargs{zlib_lib}=$1;
7d8bb912 701 }
fe05264e 702 elsif (/^--with-zlib-include=(.*)$/)
3eb0ed6d 703 {
da430a55 704 $withargs{zlib_include}=$1;
462ba4f6 705 }
f59d0131
KR
706 elsif (/^--with-fuzzer-lib=(.*)$/)
707 {
708 $withargs{fuzzer_lib}=$1;
709 }
710 elsif (/^--with-fuzzer-include=(.*)$/)
711 {
712 $withargs{fuzzer_include}=$1;
713 }
8389ec4b
RS
714 elsif (/^--with-rand-seed=(.*)$/)
715 {
716 foreach my $x (split(m|,|, $1))
717 {
718 die "Unknown --with-rand-seed choice $x\n"
719 if ! grep { $x eq $_ } @known_seed_sources;
720 push @seed_sources, $x;
721 }
722 }
fe05264e 723 elsif (/^--cross-compile-prefix=(.*)$/)
e5f3045f 724 {
642a6138 725 $config{cross_compile_prefix}=$1;
e5f3045f 726 }
fe05264e 727 elsif (/^--config=(.*)$/)
d02b48c6 728 {
fe05264e 729 read_config $1;
c59cb511 730 }
fe05264e 731 elsif (/^-[lL](.*)$/ or /^-Wl,/)
c9a112f5 732 {
fe05264e 733 $libs.=$_." ";
d02b48c6 734 }
b7438b43
AP
735 elsif (/^-framework$/)
736 {
737 $libs.=$_." ".shift(@argvcopy)." ";
738 }
fad599f7
RL
739 elsif (/^-rpath$/ or /^-R$/)
740 # -rpath is the OSF1 rpath flag
741 # -R is the old Solaris rpath flag
742 {
743 my $rpath = shift(@argvcopy) || "";
744 $rpath .= " " if $rpath ne "";
745 $libs.=$_." ".$rpath;
746 }
9d46752d
AP
747 elsif (/^-static$/)
748 {
749 $libs.=$_." ";
047d97af 750 $disabled{"dso"} = "forced";
9d46752d
AP
751 $disabled{"pic"} = "forced";
752 $disabled{"shared"} = "forced";
753 $disabled{"threads"} = "forced";
754 }
bcb1977b
RL
755 elsif (/^-D(.*)$/)
756 {
757 push @user_defines, $1;
758 }
fe05264e
RL
759 else # common if (/^[-+]/), just pass down...
760 {
761 $_ =~ s/%([0-9a-f]{1,2})/chr(hex($1))/gei;
2b91ec75 762 $user_cflags.=" ".$_;
fe05264e
RL
763 }
764 }
fe05264e
RL
765 else
766 {
767 die "target already defined - $target (offending arg: $_)\n" if ($target ne "");
768 $target=$_;
769 }
770 unless ($_ eq $target || /^no-/ || /^disable-/)
771 {
46f4e1be 772 # "no-..." follows later after implied deactivations
8483a003 773 # have been derived. (Don't take this too seriously,
fe05264e
RL
774 # we really only write OPTIONS to the Makefile out of
775 # nostalgia.)
776
3fa04f0d
RL
777 if ($config{options} eq "")
778 { $config{options} = $_; }
fe05264e 779 else
3fa04f0d 780 { $config{options} .= " ".$_; }
fbabb752 781 }
489eb740 782
107b5792
RL
783 if (defined($config{api}) && !exists $apitable->{$config{api}}) {
784 die "***** Unsupported api compatibility level: $config{api}\n",
98186eb4
VD
785 }
786
e80381e1
RL
787 if (keys %deprecated_options)
788 {
789 warn "***** Deprecated options: ",
790 join(", ", keys %deprecated_options), "\n";
791 }
489eb740
RL
792 if (keys %unsupported_options)
793 {
794 die "***** Unsupported options: ",
795 join(", ", keys %unsupported_options), "\n";
796 }
fbabb752 797 }
b6e4dac2 798
342a1a23
RL
799if ($libs =~ /(^|\s)-Wl,-rpath,/
800 && !$disabled{shared}
801 && !($disabled{asan} && $disabled{msan} && $disabled{ubsan})) {
802 die "***** Cannot simultaneously use -rpath, shared libraries, and\n",
803 "***** any of asan, msan or ubsan\n";
804}
805
8389ec4b
RS
806if (scalar(@seed_sources) == 0) {
807 print "Using implicit seed configuration\n";
808 push @seed_sources, 'os';
809}
810die "Cannot seed with none and anything else"
811 if scalar(grep { $_ eq 'none' } @seed_sources) > 0
812 && scalar(@seed_sources) > 1;
813push @{$config{openssl_other_defines}},
814 map { (my $x = $_) =~ tr|[\-a-z]|[_A-Z]|; "OPENSSL_RAND_SEED_$x" }
815 @seed_sources;
816
c569e206
RL
817my @tocheckfor = (keys %disabled);
818while (@tocheckfor) {
819 my %new_tocheckfor = ();
820 my @cascade_copy = (@disable_cascades);
821 while (@cascade_copy) {
822 my ($test, $descendents) = (shift @cascade_copy, shift @cascade_copy);
823 if (ref($test) eq "CODE" ? $test->() : defined($disabled{$test})) {
2110febb 824 foreach(grep { !defined($disabled{$_}) } @$descendents) {
01d99976 825 $new_tocheckfor{$_} = 1; $disabled{$_} = "forced";
2110febb 826 }
ef236ec3 827 }
c569e206
RL
828 }
829 @tocheckfor = (keys %new_tocheckfor);
830}
edc032b5 831
d63c12c6 832our $die = sub { die @_; };
436a376b 833if ($target eq "TABLE") {
d63c12c6 834 local $die = sub { warn @_; };
00ae96ca
RL
835 foreach (sort keys %table) {
836 print_table_entry($_, "TABLE");
837 }
838 exit 0;
436a376b
BM
839}
840
10a926c1 841if ($target eq "LIST") {
00ae96ca
RL
842 foreach (sort keys %table) {
843 print $_,"\n" unless $table{$_}->{template};
844 }
845 exit 0;
10a926c1
UM
846}
847
aaf878cc 848if ($target eq "HASH") {
d63c12c6 849 local $die = sub { warn @_; };
00ae96ca
RL
850 print "%table = (\n";
851 foreach (sort keys %table) {
852 print_table_entry($_, "HASH");
853 }
854 exit 0;
aaf878cc
RL
855}
856
64119271
RL
857print "Configuring OpenSSL version $config{version} ($config{version_num})\n";
858print "for $target\n";
859
00ae96ca 860# Backward compatibility?
49e04548 861if ($target =~ m/^CygWin32(-.*)$/) {
00ae96ca 862 $target = "Cygwin".$1;
49e04548
RL
863}
864
906eb3d0
RL
865# Support for legacy targets having a name starting with 'debug-'
866my ($d, $t) = $target =~ m/^(debug-)?(.*)$/;
867if ($d) {
868 $config{build_type} = "debug";
869
870 # If we do not find debug-foo in the table, the target is set to foo.
871 if (!$table{$target}) {
872 $target = $t;
873 }
874}
875$config{target} = $target;
876my %target = resolve_config($target);
877
878&usage if (!%target || $target{template});
879
880my %conf_files = map { $_ => 1 } (@{$target{_conf_fname_int}});
881$config{conf_files} = [ sort keys %conf_files ];
882%target = ( %{$table{DEFAULTS}}, %target );
883
884foreach my $feature (@{$target{disable}}) {
885 if (exists $deprecated_disablables{$feature}) {
886 warn "***** config $target disables deprecated feature $feature\n";
887 } elsif (!grep { $feature eq $_ } @disablables) {
888 die "***** config $target disables unknown feature $feature\n";
889 }
890 $disabled{$feature} = 'config';
891}
892foreach my $feature (@{$target{enable}}) {
893 if ("default" eq ($disabled{$_} // "")) {
894 if (exists $deprecated_disablables{$feature}) {
895 warn "***** config $target enables deprecated feature $feature\n";
896 } elsif (!grep { $feature eq $_ } @disablables) {
897 die "***** config $target enables unknown feature $feature\n";
898 }
899 delete $disabled{$_};
900 }
901}
902
c9a112f5
BM
903foreach (sort (keys %disabled))
904 {
3fa04f0d 905 $config{options} .= " no-$_";
c9a112f5
BM
906
907 printf " no-%-12s %-10s", $_, "[$disabled{$_}]";
908
909 if (/^dso$/)
721f9058 910 { }
c9a112f5 911 elsif (/^threads$/)
22bfe05e 912 { }
c9a112f5 913 elsif (/^shared$/)
84af1bae 914 { }
ae48242c
RL
915 elsif (/^pic$/)
916 { }
c9a112f5 917 elsif (/^zlib$/)
36a30909 918 { }
19ab5790 919 elsif (/^dynamic-engine$/)
fbf002bb 920 { }
09aa263a
RL
921 elsif (/^makedepend$/)
922 { }
c9a112f5
BM
923 elsif (/^zlib-dynamic$/)
924 { }
c9a112f5
BM
925 elsif (/^sse2$/)
926 { $no_sse2 = 1; }
107b5792 927 elsif (/^engine$/)
1288f26f
RS
928 {
929 @{$config{dirs}} = grep !/^engines$/, @{$config{dirs}};
930 @{$config{sdirs}} = grep !/^engine$/, @{$config{sdirs}};
931 push @{$config{openssl_other_defines}}, "OPENSSL_NO_ENGINE";
3e2dd30d 932 print " OPENSSL_NO_ENGINE (skip engines)";
1288f26f 933 }
c9a112f5
BM
934 else
935 {
3e2dd30d 936 my ($WHAT, $what);
c9a112f5 937
3e2dd30d
RL
938 ($WHAT = $what = $_) =~ tr/[\-a-z]/[_A-Z]/;
939
940 # Fix up C macro end names
941 $WHAT = "RMD160" if $what eq "ripemd";
942
943 # fix-up crypto/directory name(s)
944 $what = "ripemd" if $what eq "rmd160";
945 $what = "whrlpool" if $what eq "whirlpool";
946
66fe388a
RL
947 if ($what ne "async" && $what ne "err"
948 && grep { $_ eq $what } @{$config{sdirs}})
c9a112f5 949 {
3e2dd30d
RL
950 push @{$config{openssl_algorithm_defines}}, "OPENSSL_NO_$WHAT";
951 @{$config{sdirs}} = grep { $_ ne $what} @{$config{sdirs}};
fce0ba5f 952
3e2dd30d 953 print " OPENSSL_NO_$WHAT (skip dir)";
c9a112f5
BM
954 }
955 else
956 {
3e2dd30d
RL
957 push @{$config{openssl_other_defines}}, "OPENSSL_NO_$WHAT";
958 print " OPENSSL_NO_$WHAT";
2a4af947 959
3e2dd30d 960 if (/^err$/) { push @user_defines, "OPENSSL_NO_ERR"; }
c9a112f5
BM
961 }
962 }
963
964 print "\n";
965 }
966
ea241958 967$target{cxxflags}=$target{cflags} unless defined $target{cxxflags};
107b5792 968$target{exe_extension}="";
f99f91f1
RL
969$target{exe_extension}=".exe" if ($config{target} eq "DJGPP"
970 || $config{target} =~ /^(?:Cygwin|mingw)/);
107b5792 971$target{exe_extension}=".pm" if ($config{target} =~ /vos/);
462ba4f6 972
e987f9f2 973($target{shared_extension_simple}=$target{shared_extension})
d4453024 974 =~ s|\.\$\(SHLIB_VERSION_NUMBER\)||;
e987f9f2
RL
975$target{dso_extension}=$target{shared_extension_simple};
976($target{shared_import_extension}=$target{shared_extension_simple}.".a")
977 if ($config{target} =~ /^(?:Cygwin|mingw)/);
978
979
7ecdf18d 980$config{cross_compile_prefix} = env('CROSS_COMPILE')
642a6138 981 if $config{cross_compile_prefix} eq "";
f99f41cf 982
b0a1e8bf 983# Allow overriding the names of some tools. USE WITH CARE
d513369b
RL
984# Note: only Unix cares about HASHBANGPERL... that explains
985# the default string.
758baa3d 986$config{perl} = ($^O ne "VMS" ? $^X : "perl");
d513369b 987$config{hashbangperl} =
7ecdf18d
RL
988 env('HASHBANGPERL') || env('PERL') || "/usr/bin/env perl";
989$target{cc} = env('CC') || $target{cc} || "cc";
990$target{cxx} = env('CXX') || $target{cxx} || "c++";
991$target{ranlib} = env('RANLIB') || $target{ranlib} ||
656bbdc6 992 (which("$config{cross_compile_prefix}ranlib") ?
f58a0acb 993 "\$(CROSS_COMPILE)ranlib" : "true");
7ecdf18d
RL
994$target{ar} = env('AR') || $target{ar} || "ar";
995$target{nm} = env('NM') || $target{nm} || "nm";
8f41ff2d 996$target{rc} =
7ecdf18d 997 env('RC') || env('WINDRES') || $target{rc} || "windres";
aaf878cc 998
8b5156d1 999# Allow overriding the build file name
7ecdf18d 1000$target{build_file} = env('BUILDFILE') || $target{build_file} || "Makefile";
8b5156d1
RL
1001
1002# Cache information necessary for reconfiguration
a66234bc 1003$config{cc} = $target{cc};
ea241958 1004$config{cxx} = $target{cxx};
8b5156d1 1005$config{build_file} = $target{build_file};
a66234bc 1006
bcb1977b
RL
1007# For cflags, lflags, plib_lflags, ex_libs and defines, add the debug_
1008# or release_ attributes.
aaf878cc 1009# Do it in such a way that no spurious space is appended (hence the grep).
2952b9b8
RL
1010$config{defines} = [];
1011$config{cflags} = "";
ea241958 1012$config{cxxflags} = "";
2952b9b8
RL
1013$config{ex_libs} = "";
1014$config{shared_ldflag} = "";
bd5192b1 1015
291e94df
RL
1016# Make sure build_scheme is consistent.
1017$target{build_scheme} = [ $target{build_scheme} ]
1018 if ref($target{build_scheme}) ne "ARRAY";
1019
ddf1847d
RL
1020my ($builder, $builder_platform, @builder_opts) =
1021 @{$target{build_scheme}};
1022
d192a3aa
RL
1023foreach my $checker (($builder_platform."-".$target{build_file}."-checker.pm",
1024 $builder_platform."-checker.pm")) {
1025 my $checker_path = catfile($srcdir, "Configurations", $checker);
1026 if (-f $checker_path) {
1027 my $fn = $ENV{CONFIGURE_CHECKER_WARN}
1028 ? sub { warn $@; } : sub { die $@; };
1029 if (! do $checker_path) {
1030 if ($@) {
1031 $fn->($@);
1032 } elsif ($!) {
1033 $fn->($!);
1034 } else {
1035 $fn->("The detected tools didn't match the platform\n");
1036 }
1037 }
1038 last;
1039 }
1040}
1041
488e2b0f
RL
1042push @{$config{defines}}, "NDEBUG" if $config{build_type} eq "release";
1043
68ab559a 1044if ($target =~ /^mingw/ && `$target{cc} --target-help 2>&1` =~ m/-mno-cygwin/m)
cbecd29a 1045 {
68ab559a 1046 $config{cflags} .= " -mno-cygwin";
2952b9b8 1047 $config{shared_ldflag} .= " -mno-cygwin";
cbecd29a
AP
1048 }
1049
00b0d663 1050if ($target =~ /linux.*-mips/ && !$disabled{asm} && $user_cflags !~ /-m(ips|arch=)/) {
63d8834c 1051 # minimally required architecture flags for assembly modules
107b5792
RL
1052 $config{cflags}="-mips2 $config{cflags}" if ($target =~ /mips32/);
1053 $config{cflags}="-mips3 $config{cflags}" if ($target =~ /mips64/);
63d8834c
AP
1054}
1055
2964ba8c 1056my $no_shared_warn=0;
14bcdb08 1057my $no_user_cflags=0;
bcb1977b 1058my $no_user_defines=0;
2964ba8c 1059
bc2aadad
GT
1060# The DSO code currently always implements all functions so that no
1061# applications will have to worry about that from a compilation point
1062# of view. However, the "method"s may return zero unless that platform
1063# has support compiled in for them. Currently each method is enabled
1064# by a define "DSO_<name>" ... we translate the "dso_scheme" config
1065# string entry into using the following logic;
721f9058 1066if (!$disabled{dso} && $target{dso_scheme} ne "")
bc2aadad 1067 {
291e94df
RL
1068 $target{dso_scheme} =~ tr/[a-z]/[A-Z]/;
1069 if ($target{dso_scheme} eq "DLFCN")
bc2aadad 1070 {
2952b9b8 1071 unshift @{$config{defines}}, "DSO_DLFCN", "HAVE_DLFCN_H";
bc2aadad 1072 }
291e94df 1073 elsif ($target{dso_scheme} eq "DLFCN_NO_H")
bc2aadad 1074 {
2952b9b8 1075 unshift @{$config{defines}}, "DSO_DLFCN";
bc2aadad
GT
1076 }
1077 else
1078 {
2952b9b8 1079 unshift @{$config{defines}}, "DSO_$target{dso_scheme}";
bc2aadad
GT
1080 }
1081 }
9ec0126e 1082
1740c162 1083$config{ex_libs}="$libs$config{ex_libs}" if ($libs ne "");
d02b48c6 1084
9c62a279
RL
1085# If threads aren't disabled, check how possible they are
1086unless ($disabled{threads}) {
1087 if ($auto_threads) {
1088 # Enabled by default, disable it forcibly if unavailable
1089 if ($target{thread_scheme} eq "(unknown)") {
1090 $disabled{threads} = "unavailable";
1091 }
1092 } else {
8483a003 1093 # The user chose to enable threads explicitly, let's see
9c62a279
RL
1094 # if there's a chance that's possible
1095 if ($target{thread_scheme} eq "(unknown)") {
1096 # If the user asked for "threads" and we don't have internal
1097 # knowledge how to do it, [s]he is expected to provide any
1098 # system-dependent compiler options that are necessary. We
1099 # can't truly check that the given options are correct, but
1100 # we expect the user to know what [s]He is doing.
1101 if ($no_user_cflags && $no_user_defines) {
1102 die "You asked for multi-threading support, but didn't\n"
1103 ,"provide any system-specific compiler options\n";
1104 }
1105 }
1106 }
1107}
1108
1109# If threads still aren't disabled, add a C macro to ensure the source
1110# code knows about it. Any other flag is taken care of by the configs.
1111unless($disabled{threads}) {
1112 foreach (("defines", "openssl_thread_defines")) {
1113 push @{$config{$_}}, "OPENSSL_THREADS";
1114 }
1115}
e452de9d 1116
98186eb4
VD
1117# With "deprecated" disable all deprecated features.
1118if (defined($disabled{"deprecated"})) {
107b5792 1119 $config{api} = $maxapi;
98186eb4 1120}
07c4c14c 1121
291e94df 1122if ($target{shared_target} eq "")
6f7ac8e1 1123 {
ae48242c 1124 $no_shared_warn = 1
b53338cb 1125 if (!$disabled{shared} || !$disabled{"dynamic-engine"});
84af1bae 1126 $disabled{shared} = "no-shared-target";
ae48242c
RL
1127 $disabled{pic} = $disabled{shared} = $disabled{"dynamic-engine"} =
1128 "no-shared-target";
6f7ac8e1 1129 }
b436a982 1130
19ab5790 1131if ($disabled{"dynamic-engine"}) {
343ec2b0
RL
1132 push @{$config{defines}}, "OPENSSL_NO_DYNAMIC_ENGINE";
1133 $config{dynamic_engines} = 0;
19ab5790
RL
1134} else {
1135 push @{$config{defines}}, "OPENSSL_NO_STATIC_ENGINE";
1136 $config{dynamic_engines} = 1;
343ec2b0 1137}
ecd45314 1138
c38bb727
BL
1139unless ($disabled{asan}) {
1140 $config{cflags} .= "-fsanitize=address ";
1141}
1142
1143unless ($disabled{ubsan}) {
f430ba31 1144 # -DPEDANTIC or -fnosanitize=alignment may also be required on some
c38bb727
BL
1145 # platforms.
1146 $config{cflags} .= "-fsanitize=undefined -fno-sanitize-recover=all ";
1147}
1148
29df3061
EK
1149unless ($disabled{msan}) {
1150 $config{cflags} .= "-fsanitize=memory ";
1151}
1152
65cc6d5c 1153unless ($disabled{"fuzz-libfuzzer"} && $disabled{"fuzz-afl"}
29df3061 1154 && $disabled{asan} && $disabled{ubsan} && $disabled{msan}) {
c38bb727
BL
1155 $config{cflags} .= "-fno-omit-frame-pointer -g ";
1156}
c313e32a
AP
1157#
1158# Platform fix-ups
1159#
ae48242c
RL
1160
1161# This saves the build files from having to check
1162if ($disabled{pic})
1163 {
1164 $target{shared_cflag} = $target{shared_ldflag} =
1165 $target{shared_rcflag} = "";
1166 }
4f16039e
RL
1167else
1168 {
1169 push @{$config{defines}}, "OPENSSL_PIC";
1170 }
ae48242c 1171
291e94df 1172if ($target{sys_id} ne "")
cf1b7d96 1173 {
642a6138 1174 push @{$config{openssl_sys_defines}}, "OPENSSL_SYS_$target{sys_id}";
cf1b7d96
RL
1175 }
1176
00b0d663 1177unless ($disabled{asm}) {
d2b2221a 1178 $target{cpuid_asm_src}=$table{DEFAULTS}->{cpuid_asm_src} if ($config{processor} eq "386");
9fe2bb77 1179 $target{bn_asm_src} =~ s/\w+-gf2m.c// if (defined($disabled{ec2m}));
f8c469de 1180
9e0724a1 1181 # bn-586 is the only one implementing bn_*_part_words
bcb1977b
RL
1182 push @{$config{defines}}, "OPENSSL_BN_ASM_PART_WORDS" if ($target{bn_asm_src} =~ /bn-586/);
1183 push @{$config{defines}}, "OPENSSL_IA32_SSE2" if (!$no_sse2 && $target{bn_asm_src} =~ /86/);
dfeab068 1184
bcb1977b
RL
1185 push @{$config{defines}}, "OPENSSL_BN_ASM_MONT" if ($target{bn_asm_src} =~ /-mont/);
1186 push @{$config{defines}}, "OPENSSL_BN_ASM_MONT5" if ($target{bn_asm_src} =~ /-mont5/);
1187 push @{$config{defines}}, "OPENSSL_BN_ASM_GF2m" if ($target{bn_asm_src} =~ /-gf2m/);
5ac7bde7 1188
9fe2bb77 1189 if ($target{sha1_asm_src}) {
bcb1977b
RL
1190 push @{$config{defines}}, "SHA1_ASM" if ($target{sha1_asm_src} =~ /sx86/ || $target{sha1_asm_src} =~ /sha1/);
1191 push @{$config{defines}}, "SHA256_ASM" if ($target{sha1_asm_src} =~ /sha256/);
1192 push @{$config{defines}}, "SHA512_ASM" if ($target{sha1_asm_src} =~ /sha512/);
9e0724a1 1193 }
216e8d91
RL
1194 if ($target{rc4_asm_src} ne $table{DEFAULTS}->{rc4_asm_src}) {
1195 push @{$config{defines}}, "RC4_ASM";
1196 }
9fe2bb77 1197 if ($target{md5_asm_src}) {
bcb1977b 1198 push @{$config{defines}}, "MD5_ASM";
9e0724a1 1199 }
d2b2221a 1200 $target{cast_asm_src}=$table{DEFAULTS}->{cast_asm_src} unless $disabled{pic}; # CAST assembler is not PIC
9fe2bb77 1201 if ($target{rmd160_asm_src}) {
bcb1977b 1202 push @{$config{defines}}, "RMD160_ASM";
9e0724a1 1203 }
9fe2bb77 1204 if ($target{aes_asm_src}) {
bcb1977b 1205 push @{$config{defines}}, "AES_ASM" if ($target{aes_asm_src} =~ m/\baes-/);;
9fe2bb77 1206 # aes-ctr.fake is not a real file, only indication that assembler
874a3757 1207 # module implements AES_ctr32_encrypt...
bcb1977b 1208 push @{$config{defines}}, "AES_CTR_ASM" if ($target{aes_asm_src} =~ s/\s*aes-ctr\.fake//);
9fe2bb77 1209 # aes-xts.fake indicates presence of AES_xts_[en|de]crypt...
bcb1977b 1210 push @{$config{defines}}, "AES_XTS_ASM" if ($target{aes_asm_src} =~ s/\s*aes-xts\.fake//);
9fe2bb77 1211 $target{aes_asm_src} =~ s/\s*(vpaes|aesni)-x86\.s//g if ($no_sse2);
bcb1977b
RL
1212 push @{$config{defines}}, "VPAES_ASM" if ($target{aes_asm_src} =~ m/vpaes/);
1213 push @{$config{defines}}, "BSAES_ASM" if ($target{aes_asm_src} =~ m/bsaes/);
9e0724a1 1214 }
9fe2bb77 1215 if ($target{wp_asm_src} =~ /mmx/) {
46d4d865 1216 if ($config{processor} eq "386") {
d2b2221a 1217 $target{wp_asm_src}=$table{DEFAULTS}->{wp_asm_src};
46d4d865 1218 } elsif (!$disabled{"whirlpool"}) {
2952b9b8 1219 push @{$config{defines}}, "WHIRLPOOL_ASM";
46d4d865 1220 }
9e0724a1 1221 }
9fe2bb77 1222 if ($target{modes_asm_src} =~ /ghash-/) {
bcb1977b 1223 push @{$config{defines}}, "GHASH_ASM";
9e0724a1 1224 }
9fe2bb77 1225 if ($target{ec_asm_src} =~ /ecp_nistz256/) {
bcb1977b 1226 push @{$config{defines}}, "ECP_NISTZ256_ASM";
9e0724a1 1227 }
7b176a54
RL
1228 if ($target{padlock_asm_src} ne $table{DEFAULTS}->{padlock_asm_src}) {
1229 push @{$config{defines}}, "PADLOCK_ASM";
1230 }
9fe2bb77 1231 if ($target{poly1305_asm_src} ne "") {
bcb1977b 1232 push @{$config{defines}}, "POLY1305_ASM";
9e0724a1
RL
1233 }
1234}
d02b48c6 1235
54cf3b98
AP
1236my %predefined;
1237
1238if ($^O ne "VMS") {
1239 my $cc = "$config{cross_compile_prefix}$target{cc}";
1240
1241 # collect compiler pre-defines from gcc or gcc-alike...
1242 open(PIPE, "$cc -dM -E -x c /dev/null 2>&1 |");
1243 while (<PIPE>) {
1244 m/^#define\s+(\w+(?:\(\w+\))?)(?:\s+(.+))?/ or last;
1245 $predefined{$1} = $2 // "";
a583fc45
RL
1246 }
1247 close(PIPE);
09aa263a 1248
54cf3b98
AP
1249 if (!$disabled{makedepend}) {
1250 # We know that GNU C version 3 and up as well as all clang
1251 # versions support dependency generation
1252 if ($predefined{__GNUC__} >= 3) {
1253 $config{makedepprog} = $cc;
1254 } else {
1255 $config{makedepprog} = which('makedepend');
1256 $disabled{makedepend} = "unavailable" unless $config{makedepprog};
1257 }
1258 }
f1f07a23 1259}
8ed40b83 1260
7d130f68 1261
09aa263a 1262
7d130f68
RL
1263# Deal with bn_ops ###################################################
1264
7d130f68 1265$config{bn_ll} =0;
7d130f68
RL
1266$config{export_var_as_fn} =0;
1267my $def_int="unsigned int";
1268$config{rc4_int} =$def_int;
b4f35e5e 1269($config{b64l},$config{b64},$config{b32})=(0,0,1);
7d130f68 1270
94af0cd7 1271my $count = 0;
7d130f68 1272foreach (sort split(/\s+/,$target{bn_ops})) {
94af0cd7
RS
1273 $count++ if /SIXTY_FOUR_BIT|SIXTY_FOUR_BIT_LONG|THIRTY_TWO_BIT/;
1274 $config{export_var_as_fn}=1 if $_ eq 'EXPORT_VAR_AS_FN';
1275 $config{bn_ll}=1 if $_ eq 'BN_LLONG';
1276 $config{rc4_int}="unsigned char" if $_ eq 'RC4_CHAR';
1277 ($config{b64l},$config{b64},$config{b32})
1278 =(0,1,0) if $_ eq 'SIXTY_FOUR_BIT';
1279 ($config{b64l},$config{b64},$config{b32})
1280 =(1,0,0) if $_ eq 'SIXTY_FOUR_BIT_LONG';
1281 ($config{b64l},$config{b64},$config{b32})
1282 =(0,0,1) if $_ eq 'THIRTY_TWO_BIT';
7d130f68 1283}
94af0cd7
RS
1284die "Exactly one of SIXTY_FOUR_BIT|SIXTY_FOUR_BIT_LONG|THIRTY_TWO_BIT can be set in bn_ops\n"
1285 if $count > 1;
7d130f68
RL
1286
1287
1288# Hack cflags for better warnings (dev option) #######################
1289
1ed0c662
RL
1290# "Stringify" the C flags string. This permits it to be made part of a string
1291# and works as well on command lines.
01d99976 1292$config{cflags} =~ s/([\\\"])/\\$1/g;
b436a982 1293
107b5792
RL
1294if (defined($config{api})) {
1295 $config{openssl_api_defines} = [ "OPENSSL_MIN_API=".$apitable->{$config{api}} ];
bcb1977b 1296 my $apiflag = sprintf("OPENSSL_API_COMPAT=%s", $apitable->{$config{api}});
bcb1977b 1297 push @{$config{defines}}, $apiflag;
98186eb4
VD
1298}
1299
3a154864
AP
1300if (defined($predefined{__clang__}) && !$disabled{asm}) {
1301 $config{cflags} .= " -Qunused-arguments";
1302}
1303
0c28f277
DSH
1304if ($strict_warnings)
1305 {
1306 my $wopt;
6d50589c
AP
1307 my $gccver = $predefined{__GNUC__} // -1;
1308
1309 die "ERROR --strict-warnings requires gcc[>=4] or gcc-alike"
1310 unless $gccver >= 4;
1311 $gcc_devteam_warn .= " -Wmisleading-indentation" if $gccver >= 6;
0c28f277
DSH
1312 foreach $wopt (split /\s+/, $gcc_devteam_warn)
1313 {
d918f9cb 1314 $config{cflags} .= " $wopt" unless ($config{cflags} =~ /(?:^|\s)$wopt(?:\s|$)/)
0c28f277 1315 }
54cf3b98 1316 if (defined($predefined{__clang__}))
190c8c60
BL
1317 {
1318 foreach $wopt (split /\s+/, $clang_devteam_warn)
1319 {
d918f9cb 1320 $config{cflags} .= " $wopt" unless ($config{cflags} =~ /(?:^|\s)$wopt(?:\s|$)/)
190c8c60
BL
1321 }
1322 }
ef8ca6bd
RL
1323 }
1324
1325unless ($disabled{"crypto-mdebug-backtrace"})
1326 {
1327 foreach my $wopt (split /\s+/, $memleak_devteam_backtrace)
a1d3f3d1 1328 {
d918f9cb 1329 $config{cflags} .= " $wopt" unless ($config{cflags} =~ /(?:^|\s)$wopt(?:\s|$)/)
ef8ca6bd
RL
1330 }
1331 if ($target =~ /^BSD-/)
1332 {
1333 $config{ex_libs} .= " -lexecinfo";
291e94df 1334 }
0c28f277
DSH
1335 }
1336
7cb58c0f 1337if ($user_cflags ne "") { $config{cflags}="$config{cflags}$user_cflags"; $config{cxxflags}="$config{cxxflags}$user_cflags";}
63994098
RL
1338else { $no_user_cflags=1; }
1339if (@user_defines) { $config{defines}=[ @{$config{defines}}, @user_defines ]; }
1340else { $no_user_defines=1; }
1341
1342# ALL MODIFICATIONS TO %config and %target MUST BE DONE FROM HERE ON
1343
c91a0a83
EK
1344unless ($disabled{afalgeng}) {
1345 $config{afalgeng}="";
79fff39d
RL
1346 if ($target =~ m/^linux/) {
1347 my $minver = 4*10000 + 1*100 + 0;
1348 if ($config{cross_compile_prefix} eq "") {
1349 my $verstr = `uname -r`;
1350 my ($ma, $mi1, $mi2) = split("\\.", $verstr);
1351 ($mi2) = $mi2 =~ /(\d+)/;
1352 my $ver = $ma*10000 + $mi1*100 + $mi2;
1353 if ($ver < $minver) {
c91a0a83 1354 $disabled{afalgeng} = "too-old-kernel";
79fff39d
RL
1355 } else {
1356 push @{$config{engdirs}}, "afalg";
1357 }
68dc37c1
MC
1358 } else {
1359 $disabled{afalgeng} = "cross-compiling";
6cba4a66 1360 }
79fff39d 1361 } else {
c91a0a83 1362 $disabled{afalgeng} = "not-linux";
7f458a48 1363 }
1364}
8da00a38 1365
c91a0a83 1366push @{$config{openssl_other_defines}}, "OPENSSL_NO_AFALGENG" if ($disabled{afalgeng});
7f458a48 1367
9fe2bb77
RL
1368# If we use the unified build, collect information from build.info files
1369my %unified_info = ();
1370
2b6b606c 1371my $buildinfo_debug = defined($ENV{CONFIGURE_DEBUG_BUILDINFO});
ddf1847d 1372if ($builder eq "unified") {
9fe2bb77
RL
1373 use with_fallback qw(Text::Template);
1374
9fe2bb77 1375 sub cleandir {
2e963849 1376 my $base = shift;
9fe2bb77 1377 my $dir = shift;
2e963849
RL
1378 my $relativeto = shift || ".";
1379
1380 $dir = catdir($base,$dir) unless isabsolute($dir);
9fe2bb77 1381
ec182ef0
RL
1382 # Make sure the directories we're building in exists
1383 mkpath($dir);
1384
2e963849 1385 my $res = abs2rel(absolutedir($dir), rel2abs($relativeto));
9fe2bb77
RL
1386 #print STDERR "DEBUG[cleandir]: $dir , $base => $res\n";
1387 return $res;
1388 }
1389
1390 sub cleanfile {
2e963849 1391 my $base = shift;
9fe2bb77 1392 my $file = shift;
2e963849
RL
1393 my $relativeto = shift || ".";
1394
1395 $file = catfile($base,$file) unless isabsolute($file);
1396
9fe2bb77
RL
1397 my $d = dirname($file);
1398 my $f = basename($file);
1399
ec182ef0
RL
1400 # Make sure the directories we're building in exists
1401 mkpath($d);
1402
2e963849 1403 my $res = abs2rel(catfile(absolutedir($d), $f), rel2abs($relativeto));
9fe2bb77
RL
1404 #print STDERR "DEBUG[cleanfile]: $d , $f => $res\n";
1405 return $res;
1406 }
1407
1967a42e
RL
1408 # Store the name of the template file we will build the build file from
1409 # in %config. This may be useful for the build file itself.
1410 my @build_file_template_names =
1411 ( $builder_platform."-".$target{build_file}.".tmpl",
1412 $target{build_file}.".tmpl" );
1413 my @build_file_templates = ();
1414
1415 # First, look in the user provided directory, if given
7ecdf18d 1416 if (defined env($local_config_envname)) {
1967a42e
RL
1417 @build_file_templates =
1418 map {
1419 if ($^O eq 'VMS') {
1420 # VMS environment variables are logical names,
1421 # which can be used as is
1422 $local_config_envname . ':' . $_;
1423 } else {
7ecdf18d 1424 catfile(env($local_config_envname), $_);
1967a42e
RL
1425 }
1426 }
1427 @build_file_template_names;
1428 }
1429 # Then, look in our standard directory
1430 push @build_file_templates,
1431 ( map { cleanfile($srcdir, catfile("Configurations", $_), $blddir) }
1432 @build_file_template_names );
1433
1434 my $build_file_template;
1435 for $_ (@build_file_templates) {
1436 $build_file_template = $_;
1437 last if -f $build_file_template;
1438
1439 $build_file_template = undef;
1440 }
1441 if (!defined $build_file_template) {
1442 die "*** Couldn't find any of:\n", join("\n", @build_file_templates), "\n";
1443 }
1444 $config{build_file_templates}
1445 = [ $build_file_template,
1446 cleanfile($srcdir, catfile("Configurations", "common.tmpl"),
1447 $blddir) ];
1448
9fe2bb77
RL
1449 my @build_infos = ( [ ".", "build.info" ] );
1450 foreach (@{$config{dirs}}) {
1451 push @build_infos, [ $_, "build.info" ]
1452 if (-f catfile($srcdir, $_, "build.info"));
1453 }
1454 foreach (@{$config{sdirs}}) {
1455 push @build_infos, [ catdir("crypto", $_), "build.info" ]
1456 if (-f catfile($srcdir, "crypto", $_, "build.info"));
1457 }
1458 foreach (@{$config{engdirs}}) {
1459 push @build_infos, [ catdir("engines", $_), "build.info" ]
1460 if (-f catfile($srcdir, "engines", $_, "build.info"));
1461 }
cfa76979
RL
1462 foreach (@{$config{tdirs}}) {
1463 push @build_infos, [ catdir("test", $_), "build.info" ]
1464 if (-f catfile($srcdir, "test", $_, "build.info"));
1465 }
9fe2bb77 1466
2e0956ba
RL
1467 $config{build_infos} = [ ];
1468
9fe2bb77
RL
1469 foreach (@build_infos) {
1470 my $sourced = catdir($srcdir, $_->[0]);
1471 my $buildd = catdir($blddir, $_->[0]);
1472
dca99383 1473 mkpath($buildd);
9fe2bb77
RL
1474
1475 my $f = $_->[1];
1476 # The basic things we're trying to build
1477 my @programs = ();
7f5af797 1478 my @programs_install = ();
9fe2bb77 1479 my @libraries = ();
7f5af797 1480 my @libraries_install = ();
9fe2bb77 1481 my @engines = ();
7f5af797 1482 my @engines_install = ();
9fe2bb77 1483 my @scripts = ();
7f5af797 1484 my @scripts_install = ();
9fe2bb77 1485 my @extra = ();
8a67946e 1486 my @overrides = ();
9fe2bb77
RL
1487 my @intermediates = ();
1488 my @rawlines = ();
1489
1490 my %ordinals = ();
1491 my %sources = ();
2a08d1a0 1492 my %shared_sources = ();
9fe2bb77
RL
1493 my %includes = ();
1494 my %depends = ();
1495 my %renames = ();
1496 my %sharednames = ();
ae4c7450 1497 my %generate = ();
9fe2bb77 1498
2e0956ba 1499 push @{$config{build_infos}}, catfile(abs2rel($sourced, $blddir), $f);
cb6afcd6
RL
1500 my $template =
1501 Text::Template->new(TYPE => 'FILE',
1502 SOURCE => catfile($sourced, $f),
1503 PREPEND => qq{use lib "$FindBin::Bin/util/perl";});
9fe2bb77
RL
1504 die "Something went wrong with $sourced/$f: $!\n" unless $template;
1505 my @text =
1506 split /^/m,
1507 $template->fill_in(HASH => { config => \%config,
1508 target => \%target,
9e04edf2 1509 disabled => \%disabled,
f59d0131 1510 withargs => \%withargs,
9fe2bb77
RL
1511 builddir => abs2rel($buildd, $blddir),
1512 sourcedir => abs2rel($sourced, $blddir),
1513 buildtop => abs2rel($blddir, $blddir),
1514 sourcetop => abs2rel($srcdir, $blddir) },
1515 DELIMITERS => [ "{-", "-}" ]);
1516
1517 # The top item of this stack has the following values
1518 # -2 positive already run and we found ELSE (following ELSIF should fail)
1519 # -1 positive already run (skip until ENDIF)
1520 # 0 negatives so far (if we're at a condition, check it)
1521 # 1 last was positive (don't skip lines until next ELSE, ELSIF or ENDIF)
1522 # 2 positive ELSE (following ELSIF should fail)
1523 my @skip = ();
1524 collect_information(
1525 collect_from_array([ @text ],
1526 qr/\\$/ => sub { my $l1 = shift; my $l2 = shift;
1527 $l1 =~ s/\\$//; $l1.$l2 }),
1528 # Info we're looking for
1529 qr/^\s*IF\[((?:\\.|[^\\\]])*)\]\s*$/
635bd409 1530 => sub {
c5798e0e 1531 if (! @skip || $skip[$#skip] > 0) {
635bd409
RL
1532 push @skip, !! $1;
1533 } else {
1534 push @skip, -1;
1535 }
1536 },
9fe2bb77
RL
1537 qr/^\s*ELSIF\[((?:\\.|[^\\\]])*)\]\s*$/
1538 => sub { die "ELSIF out of scope" if ! @skip;
1539 die "ELSIF following ELSE" if abs($skip[$#skip]) == 2;
1540 $skip[$#skip] = -1 if $skip[$#skip] != 0;
1541 $skip[$#skip] = !! $1
1542 if $skip[$#skip] == 0; },
1543 qr/^\s*ELSE\s*$/
1544 => sub { die "ELSE out of scope" if ! @skip;
1545 $skip[$#skip] = -2 if $skip[$#skip] != 0;
1546 $skip[$#skip] = 2 if $skip[$#skip] == 0; },
1547 qr/^\s*ENDIF\s*$/
1548 => sub { die "ENDIF out of scope" if ! @skip;
1549 pop @skip; },
7f5af797
RL
1550 qr/^\s*PROGRAMS(_NO_INST)?\s*=\s*(.*)\s*$/
1551 => sub {
1552 if (!@skip || $skip[$#skip] > 0) {
1553 my $install = $1;
1554 my @x = tokenize($2);
1555 push @programs, @x;
1556 push @programs_install, @x unless $install;
1557 }
1558 },
1559 qr/^\s*LIBS(_NO_INST)?\s*=\s*(.*)\s*$/
1560 => sub {
1561 if (!@skip || $skip[$#skip] > 0) {
1562 my $install = $1;
1563 my @x = tokenize($2);
1564 push @libraries, @x;
1565 push @libraries_install, @x unless $install;
1566 }
1567 },
1568 qr/^\s*ENGINES(_NO_INST)?\s*=\s*(.*)\s*$/
1569 => sub {
1570 if (!@skip || $skip[$#skip] > 0) {
1571 my $install = $1;
1572 my @x = tokenize($2);
1573 push @engines, @x;
1574 push @engines_install, @x unless $install;
1575 }
1576 },
1577 qr/^\s*SCRIPTS(_NO_INST)?\s*=\s*(.*)\s*$/
1578 => sub {
1579 if (!@skip || $skip[$#skip] > 0) {
1580 my $install = $1;
1581 my @x = tokenize($2);
1582 push @scripts, @x;
1583 push @scripts_install, @x unless $install;
1584 }
1585 },
9fe2bb77 1586 qr/^\s*EXTRA\s*=\s*(.*)\s*$/
ce959812 1587 => sub { push @extra, tokenize($1)
9fe2bb77 1588 if !@skip || $skip[$#skip] > 0 },
8a67946e 1589 qr/^\s*OVERRIDES\s*=\s*(.*)\s*$/
ce959812 1590 => sub { push @overrides, tokenize($1)
8a67946e 1591 if !@skip || $skip[$#skip] > 0 },
9fe2bb77
RL
1592
1593 qr/^\s*ORDINALS\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/,
ce959812 1594 => sub { push @{$ordinals{$1}}, tokenize($2)
9fe2bb77
RL
1595 if !@skip || $skip[$#skip] > 0 },
1596 qr/^\s*SOURCE\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/
ce959812 1597 => sub { push @{$sources{$1}}, tokenize($2)
9fe2bb77 1598 if !@skip || $skip[$#skip] > 0 },
2a08d1a0 1599 qr/^\s*SHARED_SOURCE\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/
ce959812 1600 => sub { push @{$shared_sources{$1}}, tokenize($2)
2a08d1a0 1601 if !@skip || $skip[$#skip] > 0 },
9fe2bb77 1602 qr/^\s*INCLUDE\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/
ce959812 1603 => sub { push @{$includes{$1}}, tokenize($2)
9fe2bb77 1604 if !@skip || $skip[$#skip] > 0 },
4f858293 1605 qr/^\s*DEPEND\[((?:\\.|[^\\\]])*)\]\s*=\s*(.*)\s*$/
ce959812 1606 => sub { push @{$depends{$1}}, tokenize($2)
9fe2bb77 1607 if !@skip || $skip[$#skip] > 0 },
ae4c7450
RL
1608 qr/^\s*GENERATE\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/
1609 => sub { push @{$generate{$1}}, $2
1610 if !@skip || $skip[$#skip] > 0 },
9fe2bb77 1611 qr/^\s*RENAME\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/
ce959812 1612 => sub { push @{$renames{$1}}, tokenize($2)
9fe2bb77
RL
1613 if !@skip || $skip[$#skip] > 0 },
1614 qr/^\s*SHARED_NAME\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/
ce959812 1615 => sub { push @{$sharednames{$1}}, tokenize($2)
9fe2bb77
RL
1616 if !@skip || $skip[$#skip] > 0 },
1617 qr/^\s*BEGINRAW\[((?:\\.|[^\\\]])+)\]\s*$/
1618 => sub {
1619 my $lineiterator = shift;
1620 my $target_kind = $1;
1621 while (defined $lineiterator->()) {
04f171c0 1622 s|\R$||;
9fe2bb77
RL
1623 if (/^\s*ENDRAW\[((?:\\.|[^\\\]])+)\]\s*$/) {
1624 die "ENDRAW doesn't match BEGINRAW"
1625 if $1 ne $target_kind;
1626 last;
1627 }
1628 next if @skip && $skip[$#skip] <= 0;
1629 push @rawlines, $_
1630 if ($target_kind eq $target{build_file}
ddf1847d 1631 || $target_kind eq $target{build_file}."(".$builder_platform.")");
9fe2bb77
RL
1632 }
1633 },
ab6e147c 1634 qr/^\s*(?:#.*)?$/ => sub { },
2b6b606c
RL
1635 "OTHERWISE" => sub { die "Something wrong with this line:\n$_\nat $sourced/$f" },
1636 "BEFORE" => sub {
1637 if ($buildinfo_debug) {
1638 print STDERR "DEBUG: Parsing ",join(" ", @_),"\n";
1639 print STDERR "DEBUG: ... before parsing, skip stack is ",join(" ", map { int($_) } @skip),"\n";
1640 }
1641 },
1642 "AFTER" => sub {
1643 if ($buildinfo_debug) {
1644 print STDERR "DEBUG: .... after parsing, skip stack is ",join(" ", map { int($_) } @skip),"\n";
1645 }
1646 },
9fe2bb77
RL
1647 );
1648 die "runaway IF?" if (@skip);
1649
1650 foreach (keys %renames) {
1651 die "$_ renamed to more than one thing: "
1652 ,join(" ", @{$renames{$_}}),"\n"
1653 if scalar @{$renames{$_}} > 1;
2e963849
RL
1654 my $dest = cleanfile($buildd, $_, $blddir);
1655 my $to = cleanfile($buildd, $renames{$_}->[0], $blddir);
9fe2bb77
RL
1656 die "$dest renamed to more than one thing: "
1657 ,$unified_info{rename}->{$dest}, $to
1658 unless !defined($unified_info{rename}->{$dest})
1659 or $unified_info{rename}->{$dest} eq $to;
1660 $unified_info{rename}->{$dest} = $to;
1661 }
1662
1663 foreach (@programs) {
2e963849 1664 my $program = cleanfile($buildd, $_, $blddir);
9fe2bb77
RL
1665 if ($unified_info{rename}->{$program}) {
1666 $program = $unified_info{rename}->{$program};
1667 }
1668 $unified_info{programs}->{$program} = 1;
1669 }
1670
7f5af797
RL
1671 foreach (@programs_install) {
1672 my $program = cleanfile($buildd, $_, $blddir);
1673 if ($unified_info{rename}->{$program}) {
1674 $program = $unified_info{rename}->{$program};
1675 }
1676 $unified_info{install}->{programs}->{$program} = 1;
1677 }
1678
9fe2bb77 1679 foreach (@libraries) {
2e963849 1680 my $library = cleanfile($buildd, $_, $blddir);
9fe2bb77
RL
1681 if ($unified_info{rename}->{$library}) {
1682 $library = $unified_info{rename}->{$library};
1683 }
1684 $unified_info{libraries}->{$library} = 1;
1685 }
1686
7f5af797
RL
1687 foreach (@libraries_install) {
1688 my $library = cleanfile($buildd, $_, $blddir);
1689 if ($unified_info{rename}->{$library}) {
1690 $library = $unified_info{rename}->{$library};
1691 }
1692 $unified_info{install}->{libraries}->{$library} = 1;
1693 }
1694
343ec2b0 1695 die <<"EOF" if scalar @engines and !$config{dynamic_engines};
19ab5790 1696ENGINES can only be used if configured with 'dynamic-engine'.
9fe2bb77
RL
1697This is usually a fault in a build.info file.
1698EOF
1699 foreach (@engines) {
2e963849 1700 my $library = cleanfile($buildd, $_, $blddir);
9fe2bb77
RL
1701 if ($unified_info{rename}->{$library}) {
1702 $library = $unified_info{rename}->{$library};
1703 }
1704 $unified_info{engines}->{$library} = 1;
1705 }
1706
7f5af797
RL
1707 foreach (@engines_install) {
1708 my $library = cleanfile($buildd, $_, $blddir);
1709 if ($unified_info{rename}->{$library}) {
1710 $library = $unified_info{rename}->{$library};
1711 }
1712 $unified_info{install}->{engines}->{$library} = 1;
1713 }
1714
9fe2bb77 1715 foreach (@scripts) {
2e963849 1716 my $script = cleanfile($buildd, $_, $blddir);
9fe2bb77
RL
1717 if ($unified_info{rename}->{$script}) {
1718 $script = $unified_info{rename}->{$script};
1719 }
1720 $unified_info{scripts}->{$script} = 1;
1721 }
1722
7f5af797
RL
1723 foreach (@scripts_install) {
1724 my $script = cleanfile($buildd, $_, $blddir);
1725 if ($unified_info{rename}->{$script}) {
1726 $script = $unified_info{rename}->{$script};
1727 }
1728 $unified_info{install}->{scripts}->{$script} = 1;
1729 }
1730
9fe2bb77 1731 foreach (@extra) {
2e963849 1732 my $extra = cleanfile($buildd, $_, $blddir);
9fe2bb77
RL
1733 $unified_info{extra}->{$extra} = 1;
1734 }
1735
8a67946e
RL
1736 foreach (@overrides) {
1737 my $override = cleanfile($buildd, $_, $blddir);
1738 $unified_info{overrides}->{$override} = 1;
1739 }
1740
9fe2bb77
RL
1741 push @{$unified_info{rawlines}}, @rawlines;
1742
84af1bae 1743 unless ($disabled{shared}) {
9fe2bb77
RL
1744 # Check sharednames.
1745 foreach (keys %sharednames) {
2e963849 1746 my $dest = cleanfile($buildd, $_, $blddir);
9fe2bb77
RL
1747 if ($unified_info{rename}->{$dest}) {
1748 $dest = $unified_info{rename}->{$dest};
1749 }
1750 die "shared_name for $dest with multiple values: "
1751 ,join(" ", @{$sharednames{$_}}),"\n"
1752 if scalar @{$sharednames{$_}} > 1;
2e963849 1753 my $to = cleanfile($buildd, $sharednames{$_}->[0], $blddir);
9fe2bb77
RL
1754 die "shared_name found for a library $dest that isn't defined\n"
1755 unless $unified_info{libraries}->{$dest};
1756 die "shared_name for $dest with multiple values: "
1757 ,$unified_info{sharednames}->{$dest}, ", ", $to
1758 unless !defined($unified_info{sharednames}->{$dest})
1759 or $unified_info{sharednames}->{$dest} eq $to;
1760 $unified_info{sharednames}->{$dest} = $to;
1761 }
1762
1763 # Additionally, we set up sharednames for libraries that don't
33105818 1764 # have any, as themselves. Only for libraries that aren't
46f4e1be 1765 # explicitly static.
33105818 1766 foreach (grep !/\.a$/, keys %{$unified_info{libraries}}) {
9fe2bb77
RL
1767 if (!defined $unified_info{sharednames}->{$_}) {
1768 $unified_info{sharednames}->{$_} = $_
1769 }
1770 }
33105818
RL
1771
1772 # Check that we haven't defined any library as both shared and
46f4e1be 1773 # explicitly static. That is forbidden.
33105818
RL
1774 my @doubles = ();
1775 foreach (grep /\.a$/, keys %{$unified_info{libraries}}) {
1776 (my $l = $_) =~ s/\.a$//;
1777 push @doubles, $l if defined $unified_info{sharednames}->{$l};
1778 }
46f4e1be 1779 die "these libraries are both explicitly static and shared:\n ",
33105818
RL
1780 join(" ", @doubles), "\n"
1781 if @doubles;
9fe2bb77
RL
1782 }
1783
1784 foreach (keys %ordinals) {
1785 my $dest = $_;
2e963849 1786 my $ddest = cleanfile($buildd, $_, $blddir);
9fe2bb77
RL
1787 if ($unified_info{rename}->{$ddest}) {
1788 $ddest = $unified_info{rename}->{$ddest};
1789 }
1790 foreach (@{$ordinals{$dest}}) {
1791 my %known_ordinals =
1792 (
1793 crypto =>
6928b617 1794 cleanfile($sourced, catfile("util", "libcrypto.num"), $blddir),
9fe2bb77 1795 ssl =>
6928b617 1796 cleanfile($sourced, catfile("util", "libssl.num"), $blddir)
9fe2bb77
RL
1797 );
1798 my $o = $known_ordinals{$_};
1799 die "Ordinals for $ddest defined more than once\n"
1800 if $unified_info{ordinals}->{$ddest};
1801 $unified_info{ordinals}->{$ddest} = [ $_, $o ];
1802 }
1803 }
1804
1805 foreach (keys %sources) {
1806 my $dest = $_;
2e963849 1807 my $ddest = cleanfile($buildd, $_, $blddir);
9fe2bb77
RL
1808 if ($unified_info{rename}->{$ddest}) {
1809 $ddest = $unified_info{rename}->{$ddest};
1810 }
1811 foreach (@{$sources{$dest}}) {
2e963849 1812 my $s = cleanfile($sourced, $_, $blddir);
9fe2bb77
RL
1813
1814 # If it isn't in the source tree, we assume it's generated
1815 # in the build tree
1816 if (! -f $s) {
2e963849 1817 $s = cleanfile($buildd, $_, $blddir);
9fe2bb77 1818 }
ea241958
RL
1819 # We recognise C++, C and asm files
1820 if ($s =~ /\.(cc|cpp|c|s|S)$/) {
1821 my $o = $_;
1822 $o =~ s/\.[csS]$/.o/; # C and assembler
1823 $o =~ s/\.(cc|cpp)$/_cc.o/; # C++
2e963849 1824 $o = cleanfile($buildd, $o, $blddir);
9fe2bb77
RL
1825 $unified_info{sources}->{$ddest}->{$o} = 1;
1826 $unified_info{sources}->{$o}->{$s} = 1;
1827 } else {
1828 $unified_info{sources}->{$ddest}->{$s} = 1;
1829 }
1830 }
1831 }
1832
2a08d1a0
RL
1833 foreach (keys %shared_sources) {
1834 my $dest = $_;
1835 my $ddest = cleanfile($buildd, $_, $blddir);
1836 if ($unified_info{rename}->{$ddest}) {
1837 $ddest = $unified_info{rename}->{$ddest};
1838 }
1839 foreach (@{$shared_sources{$dest}}) {
1840 my $s = cleanfile($sourced, $_, $blddir);
1841
1842 # If it isn't in the source tree, we assume it's generated
1843 # in the build tree
1844 if (! -f $s) {
1845 $s = cleanfile($buildd, $_, $blddir);
1846 }
ea241958
RL
1847 # We recognise C++, C and asm files
1848 if ($s =~ /\.(cc|cpp|c|s|S)$/) {
1849 my $o = $_;
1850 $o =~ s/\.[csS]$/.o/; # C and assembler
1851 $o =~ s/\.(cc|cpp)$/_cc.o/; # C++
2a08d1a0
RL
1852 $o = cleanfile($buildd, $o, $blddir);
1853 $unified_info{shared_sources}->{$ddest}->{$o} = 1;
1854 $unified_info{sources}->{$o}->{$s} = 1;
1855 } else {
1856 die "unrecognised source file type for shared library: $s\n";
1857 }
1858 }
1859 }
1860
ae4c7450
RL
1861 foreach (keys %generate) {
1862 my $dest = $_;
1863 my $ddest = cleanfile($buildd, $_, $blddir);
1864 if ($unified_info{rename}->{$ddest}) {
1865 $ddest = $unified_info{rename}->{$ddest};
1866 }
1867 die "more than one generator for $dest: "
1868 ,join(" ", @{$generate{$_}}),"\n"
1869 if scalar @{$generate{$_}} > 1;
1870 my @generator = split /\s+/, $generate{$dest}->[0];
1871 $generator[0] = cleanfile($sourced, $generator[0], $blddir),
1872 $unified_info{generate}->{$ddest} = [ @generator ];
1873 }
1874
9fe2bb77
RL
1875 foreach (keys %depends) {
1876 my $dest = $_;
4f858293 1877 my $ddest = $dest eq "" ? "" : cleanfile($sourced, $_, $blddir);
8d34daf0
RL
1878
1879 # If the destination doesn't exist in source, it can only be
1880 # a generated file in the build tree.
4f858293 1881 if ($ddest ne "" && ! -f $ddest) {
8d34daf0
RL
1882 $ddest = cleanfile($buildd, $_, $blddir);
1883 if ($unified_info{rename}->{$ddest}) {
1884 $ddest = $unified_info{rename}->{$ddest};
1885 }
9fe2bb77
RL
1886 }
1887 foreach (@{$depends{$dest}}) {
2e963849 1888 my $d = cleanfile($sourced, $_, $blddir);
9fe2bb77 1889
e737d7b1
RL
1890 # If we know it's generated, or assume it is because we can't
1891 # find it in the source tree, we set file we depend on to be
1892 # in the build tree rather than the source tree, and assume
1893 # and that there are lines to build it in a BEGINRAW..ENDRAW
1894 # section or in the Makefile template.
1895 if (! -f $d
da1f2104
RL
1896 || (grep { $d eq $_ }
1897 map { cleanfile($srcdir, $_, $blddir) }
4f858293 1898 grep { /\.h$/ } keys %{$unified_info{generate}})) {
2e963849 1899 $d = cleanfile($buildd, $_, $blddir);
9fe2bb77
RL
1900 }
1901 # Take note if the file to depend on is being renamed
186a31e5
RL
1902 # Take extra care with files ending with .a, they should
1903 # be treated without that extension, and the extension
1904 # should be added back after treatment.
1905 $d =~ /(\.a)?$/;
1906 my $e = $1 // "";
1907 $d = $`;
9fe2bb77
RL
1908 if ($unified_info{rename}->{$d}) {
1909 $d = $unified_info{rename}->{$d};
1910 }
186a31e5 1911 $d .= $e;
9fe2bb77 1912 $unified_info{depends}->{$ddest}->{$d} = 1;
8d34daf0
RL
1913 # If we depend on a header file or a perl module, let's make
1914 # sure it can get included
4f858293 1915 if ($dest ne "" && $d =~ /\.(h|pm)$/) {
9fe2bb77 1916 my $i = dirname($d);
4748f890
RL
1917 push @{$unified_info{includes}->{$ddest}->{source}}, $i
1918 unless grep { $_ eq $i } @{$unified_info{includes}->{$ddest}->{source}};
9fe2bb77
RL
1919 }
1920 }
1921 }
1922
1923 foreach (keys %includes) {
1924 my $dest = $_;
8d34daf0
RL
1925 my $ddest = cleanfile($sourced, $_, $blddir);
1926
1927 # If the destination doesn't exist in source, it can only be
1928 # a generated file in the build tree.
1929 if (! -f $ddest) {
1930 $ddest = cleanfile($buildd, $_, $blddir);
1931 if ($unified_info{rename}->{$ddest}) {
1932 $ddest = $unified_info{rename}->{$ddest};
1933 }
9fe2bb77
RL
1934 }
1935 foreach (@{$includes{$dest}}) {
4748f890
RL
1936 my $is = cleandir($sourced, $_, $blddir);
1937 my $ib = cleandir($buildd, $_, $blddir);
1938 push @{$unified_info{includes}->{$ddest}->{source}}, $is
1939 unless grep { $_ eq $is } @{$unified_info{includes}->{$ddest}->{source}};
1940 push @{$unified_info{includes}->{$ddest}->{build}}, $ib
1941 unless grep { $_ eq $ib } @{$unified_info{includes}->{$ddest}->{build}};
9fe2bb77
RL
1942 }
1943 }
1944 }
1945
1946 ### Make unified_info a bit more efficient
1947 # One level structures
8a67946e 1948 foreach (("programs", "libraries", "engines", "scripts", "extra", "overrides")) {
9fe2bb77
RL
1949 $unified_info{$_} = [ sort keys %{$unified_info{$_}} ];
1950 }
1951 # Two level structures
7f5af797 1952 foreach my $l1 (("install", "sources", "shared_sources", "ldadd", "depends")) {
9fe2bb77
RL
1953 foreach my $l2 (sort keys %{$unified_info{$l1}}) {
1954 $unified_info{$l1}->{$l2} =
1955 [ sort keys %{$unified_info{$l1}->{$l2}} ];
1956 }
1957 }
4748f890
RL
1958 # Includes
1959 foreach my $dest (sort keys %{$unified_info{includes}}) {
1960 if (defined($unified_info{includes}->{$dest}->{build})) {
1961 my @source_includes =
1962 ( @{$unified_info{includes}->{$dest}->{source}} );
1963 $unified_info{includes}->{$dest} =
1964 [ @{$unified_info{includes}->{$dest}->{build}} ];
1965 foreach my $inc (@source_includes) {
1966 push @{$unified_info{includes}->{$dest}}, $inc
1967 unless grep { $_ eq $inc } @{$unified_info{includes}->{$dest}};
1968 }
1969 } else {
1970 $unified_info{includes}->{$dest} =
1971 [ @{$unified_info{includes}->{$dest}->{source}} ];
1972 }
1973 }
9fe2bb77
RL
1974}
1975
1976# For the schemes that need it, we provide the old *_obj configs
1977# from the *_asm_obj ones
3a55c92b 1978foreach (grep /_(asm|aux)_src$/, keys %target) {
9fe2bb77 1979 my $src = $_;
3a55c92b 1980 (my $obj = $_) =~ s/_(asm|aux)_src$/_obj/;
ea241958
RL
1981 $target{$obj} = $target{$src};
1982 $target{$obj} =~ s/\.[csS]\b/.o/g; # C and assembler
1983 $target{$obj} =~ s/\.(cc|cpp)\b/_cc.o/g; # C++
9fe2bb77
RL
1984}
1985
291e94df
RL
1986# Write down our configuration where it fits #########################
1987
1988open(OUT,">configdata.pm") || die "unable to create configdata.pm: $!\n";
1989print OUT <<"EOF";
1990package configdata;
1991
1992use strict;
1993use warnings;
1994
1995use Exporter;
1996#use vars qw(\@ISA \@EXPORT);
1997our \@ISA = qw(Exporter);
3850f8cb 1998our \@EXPORT = qw(\%config \%target \%disabled \%withargs \%unified_info \@disablables);
291e94df
RL
1999
2000EOF
2001print OUT "our %config = (\n";
2002foreach (sort keys %config) {
2003 if (ref($config{$_}) eq "ARRAY") {
2004 print OUT " ", $_, " => [ ", join(", ",
2005 map { quotify("perl", $_) }
2006 @{$config{$_}}), " ],\n";
7ecdf18d
RL
2007 } elsif (ref($config{$_}) eq "HASH") {
2008 print OUT " ", $_, " => {";
2009 if (scalar keys %{$config{$_}} > 0) {
2010 print OUT "\n";
2011 foreach my $key (sort keys %{$config{$_}}) {
2012 print OUT " ",
2013 join(" => ",
2014 quotify("perl", $key),
2015 defined $config{$_}->{$key}
2016 ? quotify("perl", $config{$_}->{$key})
2017 : "undef");
2018 print OUT ",\n";
2019 }
2020 print OUT " ";
2021 }
2022 print OUT "},\n";
291e94df
RL
2023 } else {
2024 print OUT " ", $_, " => ", quotify("perl", $config{$_}), ",\n"
2025 }
2026}
2027print OUT <<"EOF";
2028);
2029
2030EOF
2031print OUT "our %target = (\n";
2032foreach (sort keys %target) {
2033 if (ref($target{$_}) eq "ARRAY") {
2034 print OUT " ", $_, " => [ ", join(", ",
2035 map { quotify("perl", $_) }
2036 @{$target{$_}}), " ],\n";
2037 } else {
2038 print OUT " ", $_, " => ", quotify("perl", $target{$_}), ",\n"
2039 }
2040}
2041print OUT <<"EOF";
2042);
2043
96d2d7bc
RL
2044EOF
2045print OUT "our \%available_protocols = (\n";
2046print OUT " tls => [ ", join(", ", map { quotify("perl", $_) } @tls), " ],\n";
2047print OUT " dtls => [ ", join(", ", map { quotify("perl", $_) } @dtls), " ],\n";
2048print OUT <<"EOF";
2049);
2050
3850f8cb
RL
2051EOF
2052print OUT "our \@disablables = (\n";
2053foreach (@disablables) {
2054 print OUT " ", quotify("perl", $_), ",\n";
2055}
2056print OUT <<"EOF";
2057);
2058
96d2d7bc
RL
2059EOF
2060print OUT "our \%disabled = (\n";
2061foreach (sort keys %disabled) {
2062 print OUT " ", quotify("perl", $_), " => ", quotify("perl", $disabled{$_}), ",\n";
2063}
2064print OUT <<"EOF";
2065);
2066
291e94df 2067EOF
107b5792
RL
2068print OUT "our %withargs = (\n";
2069foreach (sort keys %withargs) {
2070 if (ref($withargs{$_}) eq "ARRAY") {
2071 print OUT " ", $_, " => [ ", join(", ",
2072 map { quotify("perl", $_) }
2073 @{$withargs{$_}}), " ],\n";
2074 } else {
2075 print OUT " ", $_, " => ", quotify("perl", $withargs{$_}), ",\n"
2076 }
2077}
2078print OUT <<"EOF";
2079);
edd4d402 2080
107b5792 2081EOF
ddf1847d 2082if ($builder eq "unified") {
9fe2bb77
RL
2083 my $recurse;
2084 $recurse = sub {
2085 my $indent = shift;
2086 foreach (@_) {
2087 if (ref $_ eq "ARRAY") {
2088 print OUT " "x$indent, "[\n";
2089 foreach (@$_) {
2090 $recurse->($indent + 4, $_);
2091 }
2092 print OUT " "x$indent, "],\n";
2093 } elsif (ref $_ eq "HASH") {
2094 my %h = %$_;
2095 print OUT " "x$indent, "{\n";
2096 foreach (sort keys %h) {
2097 if (ref $h{$_} eq "") {
2098 print OUT " "x($indent + 4), quotify("perl", $_), " => ", quotify("perl", $h{$_}), ",\n";
2099 } else {
2100 print OUT " "x($indent + 4), quotify("perl", $_), " =>\n";
2101 $recurse->($indent + 8, $h{$_});
2102 }
2103 }
2104 print OUT " "x$indent, "},\n";
2105 } else {
2106 print OUT " "x$indent, quotify("perl", $_), ",\n";
2107 }
2108 }
2109 };
2110 print OUT "our %unified_info = (\n";
2111 foreach (sort keys %unified_info) {
2112 if (ref $unified_info{$_} eq "") {
2113 print OUT " "x4, quotify("perl", $_), " => ", quotify("perl", $unified_info{$_}), ",\n";
2114 } else {
2115 print OUT " "x4, quotify("perl", $_), " =>\n";
2116 $recurse->(8, $unified_info{$_});
2117 }
2118 }
2119 print OUT <<"EOF";
2120);
2121
2122EOF
2123}
2124print OUT "1;\n";
d02b48c6 2125close(OUT);
f2d4be3b 2126
141d7325
RS
2127print "\n";
2128print "PROCESSOR =$config{processor}\n" if $config{processor};
2129print "PERL =$config{perl}\n";
758baa3d 2130print "PERLVERSION =$Config{version} for $Config{archname}\n";
141d7325 2131print "HASHBANGPERL =$config{hashbangperl}\n";
f58a0acb 2132print "CC =$config{cross_compile_prefix}$target{cc}\n";
2952b9b8 2133print "CFLAG =$target{cflags} $config{cflags}\n";
ea241958
RL
2134print "CXX =$config{cross_compile_prefix}$target{cxx}\n"
2135 if defined $target{cxx};
2136print "CXXFLAG =$target{cxxflags} $config{cxxflags}\n"
2137 if defined $target{cxx};
2952b9b8 2138print "DEFINES =",join(" ", @{$target{defines}}, @{$config{defines}}),"\n";
141d7325
RS
2139#print "RANLIB =", $target{ranlib} eq '$(CROSS_COMPILE)ranlib' ?
2140# "$config{cross_compile_prefix}ranlib" :
2141# "$target{ranlib}", "\n";
2952b9b8 2142print "EX_LIBS =$target{ex_libs} $config{ex_libs}\n";
cba5068d 2143
88087414 2144my %builders = (
9fe2bb77 2145 unified => sub {
ddf1847d 2146 run_dofile(catfile($blddir, $target{build_file}),
1967a42e 2147 @{$config{build_file_templates}});
9fe2bb77 2148 },
88087414
RL
2149 );
2150
ddf1847d 2151$builders{$builder}->($builder_platform, @builder_opts);
fce0ba5f 2152
9c62a279 2153print <<"EOF" if ($disabled{threads} eq "unavailable");
5f8d5c96
BM
2154
2155The library could not be configured for supporting multi-threaded
2156applications as the compiler options required on this system are not known.
ff1b7e09 2157See file INSTALL for details if you need multi-threading.
ec577822
BM
2158EOF
2159
76ffb43d 2160print <<"EOF" if ($no_shared_warn);
2964ba8c 2161
ae48242c
RL
2162The options 'shared', 'pic' and 'dynamic-engine' aren't supported on this
2163platform, so we will pretend you gave the option 'no-pic', which also disables
2164'shared' and 'dynamic-engine'. If you know how to implement shared libraries
2165or position independent code, please let us know (but please first make sure
2166you have tried with a current version of OpenSSL).
2e31ef03
RS
2167EOF
2168
ddc606c9
RL
2169print <<"EOF" if (-f catfile($srcdir, "configdata.pm") && $srcdir ne $blddir);
2170
2171WARNING: there are indications that another build was made in the source
2172directory. This build may have picked up artifacts from that build, the
2173safest course of action is to clean the source directory and redo this
2174configuration.
2175EOF
2176
d02b48c6
RE
2177exit(0);
2178
bd5192b1
RL
2179######################################################################
2180#
2181# Helpers and utility functions
2182#
2183
2184# Configuration file reading #########################################
2185
1f2e1cd5
RL
2186# Note: All of the helper functions are for lazy evaluation. They all
2187# return a CODE ref, which will return the intended value when evaluated.
2188# Thus, whenever there's mention of a returned value, it's about that
2189# intended value.
2190
bd5192b1 2191# Helper function to implement conditional inheritance depending on the
00b0d663 2192# value of $disabled{asm}. Used in inherit_from values as follows:
bd5192b1
RL
2193#
2194# inherit_from => [ "template", asm("asm_tmpl") ]
2195#
2196sub asm {
2197 my @x = @_;
2198 sub {
00b0d663 2199 $disabled{asm} ? () : @x;
bd5192b1
RL
2200 }
2201}
2202
1f2e1cd5
RL
2203# Helper function to implement conditional value variants, with a default
2204# plus additional values based on the value of $config{build_type}.
2205# Arguments are given in hash table form:
2206#
2207# picker(default => "Basic string: ",
2208# debug => "debug",
2209# release => "release")
2210#
2211# When configuring with --debug, the resulting string will be
2212# "Basic string: debug", and when not, it will be "Basic string: release"
2213#
2214# This can be used to create variants of sets of flags according to the
2215# build type:
2216#
2217# cflags => picker(default => "-Wall",
2218# debug => "-g -O0",
2219# release => "-O3")
2220#
2221sub picker {
2222 my %opts = @_;
2223 return sub { add($opts{default} || (),
2224 $opts{$config{build_type}} || ())->(); }
2225}
2226
2227# Helper function to combine several values of different types into one.
2228# This is useful if you want to combine a string with the result of a
2229# lazy function, such as:
2230#
2231# cflags => combine("-Wall", sub { $disabled{zlib} ? () : "-DZLIB" })
2232#
2233sub combine {
2234 my @stuff = @_;
2235 return sub { add(@stuff)->(); }
2236}
2237
2238# Helper function to implement conditional values depending on the value
2239# of $disabled{threads}. Can be used as follows:
2240#
2241# cflags => combine("-Wall", threads("-pthread"))
2242#
2243sub threads {
2244 my @flags = @_;
2245 return sub { add($disabled{threads} ? () : @flags)->(); }
2246}
2247
2248
2249
9c62a279 2250our $add_called = 0;
88087414
RL
2251# Helper function to implement adding values to already existing configuration
2252# values. It handles elements that are ARRAYs, CODEs and scalars
2253sub _add {
2254 my $separator = shift;
2255
bcb1977b
RL
2256 # If there's any ARRAY in the collection of values OR the separator
2257 # is undef, we will return an ARRAY of combined values, otherwise a
2258 # string of joined values with $separator as the separator.
2259 my $found_array = !defined($separator);
88087414
RL
2260
2261 my @values =
2262 map {
b0b92a5b
RL
2263 my $res = $_;
2264 while (ref($res) eq "CODE") {
2265 $res = $res->();
2266 }
2267 if (defined($res)) {
2268 if (ref($res) eq "ARRAY") {
2269 $found_array = 1;
2270 @$res;
2271 } else {
2272 $res;
2273 }
88087414 2274 } else {
b0b92a5b 2275 ();
88087414
RL
2276 }
2277 } (@_);
2278
9c62a279
RL
2279 $add_called = 1;
2280
88087414
RL
2281 if ($found_array) {
2282 [ @values ];
2283 } else {
b0b92a5b 2284 join($separator, grep { defined($_) && $_ ne "" } @values);
88087414
RL
2285 }
2286}
2287sub add_before {
bdcd83e1
RL
2288 my $separator = " ";
2289 if (ref($_[$#_]) eq "HASH") {
2290 my $opts = pop;
2291 $separator = $opts->{separator};
2292 }
88087414
RL
2293 my @x = @_;
2294 sub { _add($separator, @x, @_) };
2295}
2296sub add {
bdcd83e1
RL
2297 my $separator = " ";
2298 if (ref($_[$#_]) eq "HASH") {
2299 my $opts = pop;
2300 $separator = $opts->{separator};
2301 }
88087414
RL
2302 my @x = @_;
2303 sub { _add($separator, @_, @x) };
2304}
2305
bd5192b1
RL
2306# configuration reader, evaluates the input file as a perl script and expects
2307# it to fill %targets with target configurations. Those are then added to
2308# %table.
2309sub read_config {
2310 my $fname = shift;
2311 open(CONFFILE, "< $fname")
2312 or die "Can't open configuration file '$fname'!\n";
2313 my $x = $/;
2314 undef $/;
2315 my $content = <CONFFILE>;
2316 $/ = $x;
2317 close(CONFFILE);
2318 my %targets = ();
2319 {
ee9b0bbb
RL
2320 # Protect certain tables from tampering
2321 local %table = %::table;
bd5192b1
RL
2322
2323 eval $content;
2324 warn $@ if $@;
2325 }
2326
2327 # For each target, check that it's configured with a hash table.
2328 foreach (keys %targets) {
2329 if (ref($targets{$_}) ne "HASH") {
2330 if (ref($targets{$_}) eq "") {
2331 warn "Deprecated target configuration for $_, ignoring...\n";
2332 } else {
2333 warn "Misconfigured target configuration for $_ (should be a hash table), ignoring...\n";
2334 }
2335 delete $targets{$_};
ee9b0bbb
RL
2336 } else {
2337 $targets{$_}->{_conf_fname_int} = add([ $fname ]);
2338 }
bd5192b1
RL
2339 }
2340
2341 %table = (%table, %targets);
2342
2343}
2344
8483a003
F
2345# configuration resolver. Will only resolve all the lazy evaluation
2346# codeblocks for the chosen target and all those it inherits from,
bd5192b1
RL
2347# recursively
2348sub resolve_config {
2349 my $target = shift;
2350 my @breadcrumbs = @_;
2351
c4718849 2352# my $extra_checks = defined($ENV{CONFIGURE_EXTRA_CHECKS});
9c62a279 2353
bd5192b1
RL
2354 if (grep { $_ eq $target } @breadcrumbs) {
2355 die "inherit_from loop! target backtrace:\n "
2356 ,$target,"\n ",join("\n ", @breadcrumbs),"\n";
2357 }
2358
2359 if (!defined($table{$target})) {
2360 warn "Warning! target $target doesn't exist!\n";
2361 return ();
2362 }
2363 # Recurse through all inheritances. They will be resolved on the
2364 # fly, so when this operation is done, they will all just be a
2365 # bunch of attributes with string values.
2366 # What we get here, though, are keys with references to lists of
2367 # the combined values of them all. We will deal with lists after
2368 # this stage is done.
2369 my %combined_inheritance = ();
2370 if ($table{$target}->{inherit_from}) {
2371 my @inherit_from =
2372 map { ref($_) eq "CODE" ? $_->() : $_ } @{$table{$target}->{inherit_from}};
2373 foreach (@inherit_from) {
2374 my %inherited_config = resolve_config($_, $target, @breadcrumbs);
2375
2376 # 'template' is a marker that's considered private to
2377 # the config that had it.
2378 delete $inherited_config{template};
2379
2110febb 2380 foreach (keys %inherited_config) {
bd5192b1
RL
2381 if (!$combined_inheritance{$_}) {
2382 $combined_inheritance{$_} = [];
2383 }
2384 push @{$combined_inheritance{$_}}, $inherited_config{$_};
2110febb 2385 }
bd5192b1
RL
2386 }
2387 }
2388
2389 # We won't need inherit_from in this target any more, since we've
2390 # resolved all the inheritances that lead to this
2391 delete $table{$target}->{inherit_from};
2392
2393 # Now is the time to deal with those lists. Here's the place to
2394 # decide what shall be done with those lists, all based on the
2395 # values of the target we're currently dealing with.
2396 # - If a value is a coderef, it will be executed with the list of
2397 # inherited values as arguments.
2398 # - If the corresponding key doesn't have a value at all or is the
8483a003 2399 # empty string, the inherited value list will be run through the
bd5192b1
RL
2400 # default combiner (below), and the result becomes this target's
2401 # value.
2402 # - Otherwise, this target's value is assumed to be a string that
2403 # will simply override the inherited list of values.
a26d8be9 2404 my $default_combiner = add();
bd5192b1
RL
2405
2406 my %all_keys =
2407 map { $_ => 1 } (keys %combined_inheritance,
2408 keys %{$table{$target}});
b0b92a5b
RL
2409
2410 sub process_values {
2411 my $object = shift;
2412 my $inherited = shift; # Always a [ list ]
2413 my $target = shift;
2414 my $entry = shift;
2415
9c62a279
RL
2416 $add_called = 0;
2417
b0b92a5b
RL
2418 while(ref($object) eq "CODE") {
2419 $object = $object->(@$inherited);
2420 }
2421 if (!defined($object)) {
2422 return ();
2423 }
2424 elsif (ref($object) eq "ARRAY") {
9c62a279 2425 local $add_called; # To make sure recursive calls don't affect it
b0b92a5b
RL
2426 return [ map { process_values($_, $inherited, $target, $entry) }
2427 @$object ];
2428 } elsif (ref($object) eq "") {
2429 return $object;
2430 } else {
2431 die "cannot handle reference type ",ref($object)
2432 ," found in target ",$target," -> ",$entry,"\n";
2433 }
2434 }
2435
bd5192b1 2436 foreach (sort keys %all_keys) {
9c62a279 2437 my $previous = $combined_inheritance{$_};
bd5192b1
RL
2438
2439 # Current target doesn't have a value for the current key?
2440 # Assign it the default combiner, the rest of this loop body
2441 # will handle it just like any other coderef.
2442 if (!exists $table{$target}->{$_}) {
2443 $table{$target}->{$_} = $default_combiner;
2444 }
2445
b0b92a5b
RL
2446 $table{$target}->{$_} = process_values($table{$target}->{$_},
2447 $combined_inheritance{$_},
2448 $target, $_);
2449 unless(defined($table{$target}->{$_})) {
2450 delete $table{$target}->{$_};
2451 }
c4718849
RL
2452# if ($extra_checks &&
2453# $previous && !($add_called || $previous ~~ $table{$target}->{$_})) {
2454# warn "$_ got replaced in $target\n";
2455# }
bd5192b1
RL
2456 }
2457
2458 # Finally done, return the result.
2459 return %{$table{$target}};
2460}
2461
462ba4f6 2462sub usage
d02b48c6 2463 {
462ba4f6 2464 print STDERR $usage;
10a926c1 2465 print STDERR "\npick os/compiler from:\n";
1641cb60 2466 my $j=0;
6457ad15 2467 my $i;
10a926c1 2468 my $k=0;
6457ad15 2469 foreach $i (sort keys %table)
d02b48c6 2470 {
bd5192b1 2471 next if $table{$i}->{template};
462ba4f6 2472 next if $i =~ /^debug/;
10a926c1
UM
2473 $k += length($i) + 1;
2474 if ($k > 78)
2475 {
2476 print STDERR "\n";
2477 $k=length($i);
2478 }
2479 print STDERR $i . " ";
462ba4f6
UM
2480 }
2481 foreach $i (sort keys %table)
2482 {
bd5192b1 2483 next if $table{$i}->{template};
462ba4f6 2484 next if $i !~ /^debug/;
10a926c1
UM
2485 $k += length($i) + 1;
2486 if ($k > 78)
2487 {
2488 print STDERR "\n";
2489 $k=length($i);
2490 }
2491 print STDERR $i . " ";
d02b48c6 2492 }
10a926c1 2493 print STDERR "\n\nNOTE: If in doubt, on Unix-ish systems use './config'.\n";
462ba4f6 2494 exit(1);
d02b48c6
RE
2495 }
2496
01d99976 2497sub run_dofile
107b5792 2498{
107b5792 2499 my $out = shift;
9fe2bb77 2500 my @templates = @_;
107b5792 2501
ced2c2c5
RS
2502 unlink $out || warn "Can't remove $out, $!"
2503 if -f $out;
9fe2bb77
RL
2504 foreach (@templates) {
2505 die "Can't open $_, $!" unless -f $_;
2506 }
f879d5ff
RL
2507 my $perlcmd = (quotify("maybeshell", $config{perl}))[0];
2508 my $cmd = "$perlcmd \"-I.\" \"-Mconfigdata\" \"$dofile\" -o\"Configure\" \"".join("\" \"",@templates)."\" > \"$out.new\"";
9fe2bb77
RL
2509 #print STDERR "DEBUG[run_dofile]: \$cmd = $cmd\n";
2510 system($cmd);
107b5792
RL
2511 exit 1 if $? != 0;
2512 rename("$out.new", $out) || die "Can't rename $out.new, $!";
2513}
2514
656bbdc6
AP
2515sub which
2516{
2517 my ($name)=@_;
2518
2519 if (eval { require IPC::Cmd; 1; }) {
2520 IPC::Cmd->import();
2521 return scalar IPC::Cmd::can_run($name);
2522 } else {
2523 # if there is $directories component in splitpath,
2524 # then it's not something to test with $PATH...
2525 return $name if (File::Spec->splitpath($name))[1];
2526
2527 foreach (File::Spec->path()) {
2528 my $fullpath = catfile($_, "$name$target{exe_extension}");
2529 if (-f $fullpath and -x $fullpath) {
2530 return $fullpath;
2531 }
2532 }
2533 }
2534}
2535
7ecdf18d
RL
2536sub env
2537{
2538 my $name = shift;
2539
89bea083
RL
2540 # Note that if $ENV{$name} doesn't exist or is undefined,
2541 # $config{perlenv}->{$name} will be created with the value
2542 # undef. This is intentional.
2543
2544 $config{perlenv}->{$name} = $ENV{$name}
2545 if ! exists $config{perlenv}->{$name};
7ecdf18d
RL
2546 return $config{perlenv}->{$name};
2547}
2548
00ae96ca
RL
2549# Configuration printer ##############################################
2550
2551sub print_table_entry
2552{
2553 my $target = shift;
2554 my %target = resolve_config($target);
2555 my $type = shift;
2556
2557 # Don't print the templates
2558 return if $target{template};
2559
2560 my @sequence = (
f0bd4686 2561 "sys_id",
00ae96ca
RL
2562 "cc",
2563 "cflags",
bcb1977b 2564 "defines",
f0bd4686
RL
2565 "unistd",
2566 "ld",
00ae96ca 2567 "lflags",
0c0d78b8 2568 "loutflag",
c86ddbe6 2569 "plib_lflags",
1740c162 2570 "ex_libs",
00ae96ca 2571 "bn_ops",
0c0d78b8
RL
2572 "apps_aux_src",
2573 "cpuid_asm_src",
2574 "uplink_aux_src",
2575 "bn_asm_src",
2576 "ec_asm_src",
2577 "des_asm_src",
2578 "aes_asm_src",
2579 "bf_asm_src",
2580 "md5_asm_src",
2581 "cast_asm_src",
2582 "sha1_asm_src",
2583 "rc4_asm_src",
2584 "rmd160_asm_src",
2585 "rc5_asm_src",
2586 "wp_asm_src",
2587 "cmll_asm_src",
2588 "modes_asm_src",
2589 "padlock_asm_src",
2590 "chacha_asm_src",
2591 "poly1035_asm_src",
9c62a279 2592 "thread_scheme",
00ae96ca
RL
2593 "perlasm_scheme",
2594 "dso_scheme",
2595 "shared_target",
2596 "shared_cflag",
0c0d78b8 2597 "shared_defines",
00ae96ca 2598 "shared_ldflag",
64c443e3 2599 "shared_rcflag",
00ae96ca 2600 "shared_extension",
e987f9f2 2601 "dso_extension",
f0bd4686
RL
2602 "obj_extension",
2603 "exe_extension",
00ae96ca 2604 "ranlib",
f0bd4686 2605 "ar",
00ae96ca 2606 "arflags",
0c0d78b8
RL
2607 "aroutflag",
2608 "rc",
2609 "rcflags",
2610 "rcoutflag",
2611 "mt",
2612 "mtflags",
2613 "mtinflag",
2614 "mtoutflag",
00ae96ca 2615 "multilib",
f0bd4686 2616 "build_scheme",
00ae96ca
RL
2617 );
2618
2619 if ($type eq "TABLE") {
2620 print "\n";
2621 print "*** $target\n";
cb212f23
RL
2622 foreach (@sequence) {
2623 if (ref($target{$_}) eq "ARRAY") {
2624 printf "\$%-12s = %s\n", $_, join(" ", @{$target{$_}});
2625 } else {
2626 printf "\$%-12s = %s\n", $_, $target{$_};
2627 }
2628 }
00ae96ca
RL
2629 } elsif ($type eq "HASH") {
2630 my $largest =
2631 length((sort { length($a) <=> length($b) } @sequence)[-1]);
2632 print " '$target' => {\n";
2633 foreach (@sequence) {
2634 if ($target{$_}) {
cb212f23
RL
2635 if (ref($target{$_}) eq "ARRAY") {
2636 print " '",$_,"'"," " x ($largest - length($_))," => [ ",join(", ", map { "'$_'" } @{$target{$_}})," ],\n";
2637 } else {
2638 print " '",$_,"'"," " x ($largest - length($_))," => '",$target{$_},"',\n";
2639 }
00ae96ca
RL
2640 }
2641 }
2642 print " },\n";
2643 }
2644}
2645
2646# Utility routines ###################################################
2647
2e963849
RL
2648# On VMS, if the given file is a logical name, File::Spec::Functions
2649# will consider it an absolute path. There are cases when we want a
2650# purely syntactic check without checking the environment.
2651sub isabsolute {
2652 my $file = shift;
2653
2654 # On non-platforms, we just use file_name_is_absolute().
2655 return file_name_is_absolute($file) unless $^O eq "VMS";
2656
69687aa8 2657 # If the file spec includes a device or a directory spec,
2e963849
RL
2658 # file_name_is_absolute() is perfectly safe.
2659 return file_name_is_absolute($file) if $file =~ m|[:\[]|;
2660
2661 # Here, we know the given file spec isn't absolute
2662 return 0;
2663}
2664
ec182ef0
RL
2665# Makes a directory absolute and cleans out /../ in paths like foo/../bar
2666# On some platforms, this uses rel2abs(), while on others, realpath() is used.
2667# realpath() requires that at least all path components except the last is an
2668# existing directory. On VMS, the last component of the directory spec must
2669# exist.
2670sub absolutedir {
2671 my $dir = shift;
2672
2673 # realpath() is quite buggy on VMS. It uses LIB$FID_TO_NAME, which
2674 # will return the volume name for the device, no matter what. Also,
2675 # it will return an incorrect directory spec if the argument is a
2676 # directory that doesn't exist.
2677 if ($^O eq "VMS") {
2678 return rel2abs($dir);
2679 }
2680
2681 # We use realpath() on Unix, since no other will properly clean out
2682 # a directory spec.
2683 use Cwd qw/realpath/;
2684
2685 return realpath($dir);
2686}
2687
fe05264e
RL
2688sub quotify {
2689 my %processors = (
2690 perl => sub { my $x = shift;
2691 $x =~ s/([\\\$\@"])/\\$1/g;
2692 return '"'.$x.'"'; },
f879d5ff
RL
2693 maybeshell => sub { my $x = shift;
2694 (my $y = $x) =~ s/([\\\"])/\\$1/g;
2695 if ($x ne $y || $x =~ m|\s|) {
2696 return '"'.$y.'"';
2697 } else {
2698 return $x;
2699 }
2700 },
fe05264e
RL
2701 );
2702 my $for = shift;
2703 my $processor =
2704 defined($processors{$for}) ? $processors{$for} : sub { shift; };
2705
2110febb 2706 return map { $processor->($_); } @_;
fe05264e 2707}
107b5792 2708
9fe2bb77
RL
2709# collect_from_file($filename, $line_concat_cond_re, $line_concat)
2710# $filename is a file name to read from
2711# $line_concat_cond_re is a regexp detecting a line continuation ending
2712# $line_concat is a CODEref that takes care of concatenating two lines
2713sub collect_from_file {
2714 my $filename = shift;
2715 my $line_concat_cond_re = shift;
2716 my $line_concat = shift;
2717
2718 open my $fh, $filename || die "unable to read $filename: $!\n";
2719 return sub {
2720 my $saved_line = "";
2721 $_ = "";
2722 while (<$fh>) {
04f171c0 2723 s|\R$||;
9fe2bb77
RL
2724 if (defined $line_concat) {
2725 $_ = $line_concat->($saved_line, $_);
2726 $saved_line = "";
2727 }
2728 if (defined $line_concat_cond_re && /$line_concat_cond_re/) {
2729 $saved_line = $_;
2730 next;
2731 }
2732 return $_;
2733 }
2734 die "$filename ending with continuation line\n" if $_;
2735 close $fh;
2736 return undef;
2737 }
2738}
2739
2740# collect_from_array($array, $line_concat_cond_re, $line_concat)
2741# $array is an ARRAYref of lines
2742# $line_concat_cond_re is a regexp detecting a line continuation ending
2743# $line_concat is a CODEref that takes care of concatenating two lines
2744sub collect_from_array {
2745 my $array = shift;
2746 my $line_concat_cond_re = shift;
2747 my $line_concat = shift;
2748 my @array = (@$array);
2749
2750 return sub {
2751 my $saved_line = "";
2752 $_ = "";
2753 while (defined($_ = shift @array)) {
04f171c0 2754 s|\R$||;
9fe2bb77
RL
2755 if (defined $line_concat) {
2756 $_ = $line_concat->($saved_line, $_);
2757 $saved_line = "";
2758 }
2759 if (defined $line_concat_cond_re && /$line_concat_cond_re/) {
2760 $saved_line = $_;
2761 next;
2762 }
2763 return $_;
2764 }
2765 die "input text ending with continuation line\n" if $_;
2766 return undef;
2767 }
2768}
2769
2770# collect_information($lineiterator, $line_continue, $regexp => $CODEref, ...)
2771# $lineiterator is a CODEref that delivers one line at a time.
107b5792
RL
2772# All following arguments are regex/CODEref pairs, where the regexp detects a
2773# line and the CODEref does something with the result of the regexp.
2774sub collect_information {
9fe2bb77 2775 my $lineiterator = shift;
107b5792
RL
2776 my %collectors = @_;
2777
9fe2bb77 2778 while(defined($_ = $lineiterator->())) {
04f171c0 2779 s|\R$||;
9fe2bb77 2780 my $found = 0;
2b6b606c
RL
2781 if ($collectors{"BEFORE"}) {
2782 $collectors{"BEFORE"}->($_);
2783 }
9fe2bb77 2784 foreach my $re (keys %collectors) {
2b6b606c 2785 if ($re !~ /^OTHERWISE|BEFORE|AFTER$/ && /$re/) {
9fe2bb77
RL
2786 $collectors{$re}->($lineiterator);
2787 $found = 1;
2788 };
2789 }
2790 if ($collectors{"OTHERWISE"}) {
2791 $collectors{"OTHERWISE"}->($lineiterator, $_)
2792 unless $found || !defined $collectors{"OTHERWISE"};
2793 }
2b6b606c
RL
2794 if ($collectors{"AFTER"}) {
2795 $collectors{"AFTER"}->($_);
2796 }
107b5792 2797 }
107b5792 2798}
ce959812
RL
2799
2800# tokenize($line)
2801# $line is a line of text to split up into tokens
2802# returns a list of tokens
2803#
2804# Tokens are divided by spaces. If the tokens include spaces, they
2805# have to be quoted with single or double quotes. Double quotes
2806# inside a double quoted token must be escaped. Escaping is done
2807# with backslash.
2808# Basically, the same quoting rules apply for " and ' as in any
2809# Unix shell.
2810sub tokenize {
2811 my $line = my $debug_line = shift;
2812 my @result = ();
2813
2814 while ($line =~ s|^\s+||, $line ne "") {
2815 my $token = "";
2816 while ($line ne "" && $line !~ m|^\s|) {
2817 if ($line =~ m/^"((?:[^"\\]+|\\.)*)"/) {
2818 $token .= $1;
2819 $line = $';
2820 } elsif ($line =~ m/^'([^']*)'/) {
2821 $token .= $1;
2822 $line = $';
2823 } elsif ($line =~ m/^(\S+)/) {
2824 $token .= $1;
2825 $line = $';
2826 }
2827 }
2828 push @result, $token;
2829 }
2830
2831 if ($ENV{CONFIGURE_DEBUG_TOKENIZE}) {
2832 print STDERR "DEBUG[tokenize]: Parsed '$debug_line' into:\n";
2833 print STDERR "DEBUG[tokenize]: ('", join("', '", @result), "')\n";
2834 }
2835 return @result;
2836}