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