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