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