]> git.ipfire.org Git - thirdparty/openssl.git/blame - Configure
Fix omitted selector handling.
[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
65cc6d5c
RL
1074unless ($disabled{"fuzz-libfuzzer"} && $disabled{"fuzz-afl"}
1075 && $disabled{asan} && $disabled{ubsan}) {
c38bb727
BL
1076 $config{cflags} .= "-fno-omit-frame-pointer -g ";
1077}
c313e32a
AP
1078#
1079# Platform fix-ups
1080#
ae48242c
RL
1081
1082# This saves the build files from having to check
1083if ($disabled{pic})
1084 {
1085 $target{shared_cflag} = $target{shared_ldflag} =
1086 $target{shared_rcflag} = "";
1087 }
4f16039e
RL
1088else
1089 {
1090 push @{$config{defines}}, "OPENSSL_PIC";
1091 }
ae48242c 1092
291e94df 1093if ($target{sys_id} ne "")
cf1b7d96 1094 {
642a6138 1095 push @{$config{openssl_sys_defines}}, "OPENSSL_SYS_$target{sys_id}";
cf1b7d96
RL
1096 }
1097
00b0d663 1098unless ($disabled{asm}) {
d2b2221a 1099 $target{cpuid_asm_src}=$table{DEFAULTS}->{cpuid_asm_src} if ($config{processor} eq "386");
9fe2bb77 1100 $target{bn_asm_src} =~ s/\w+-gf2m.c// if (defined($disabled{ec2m}));
f8c469de 1101
9e0724a1 1102 # bn-586 is the only one implementing bn_*_part_words
bcb1977b
RL
1103 push @{$config{defines}}, "OPENSSL_BN_ASM_PART_WORDS" if ($target{bn_asm_src} =~ /bn-586/);
1104 push @{$config{defines}}, "OPENSSL_IA32_SSE2" if (!$no_sse2 && $target{bn_asm_src} =~ /86/);
dfeab068 1105
bcb1977b
RL
1106 push @{$config{defines}}, "OPENSSL_BN_ASM_MONT" if ($target{bn_asm_src} =~ /-mont/);
1107 push @{$config{defines}}, "OPENSSL_BN_ASM_MONT5" if ($target{bn_asm_src} =~ /-mont5/);
1108 push @{$config{defines}}, "OPENSSL_BN_ASM_GF2m" if ($target{bn_asm_src} =~ /-gf2m/);
5ac7bde7 1109
107b5792 1110 if ($config{fips}) {
7d130f68 1111 push @{$config{openssl_other_defines}}, "OPENSSL_FIPS";
9e0724a1 1112 }
1ab2f7f1 1113
9fe2bb77 1114 if ($target{sha1_asm_src}) {
bcb1977b
RL
1115 push @{$config{defines}}, "SHA1_ASM" if ($target{sha1_asm_src} =~ /sx86/ || $target{sha1_asm_src} =~ /sha1/);
1116 push @{$config{defines}}, "SHA256_ASM" if ($target{sha1_asm_src} =~ /sha256/);
1117 push @{$config{defines}}, "SHA512_ASM" if ($target{sha1_asm_src} =~ /sha512/);
9e0724a1 1118 }
9fe2bb77 1119 if ($target{md5_asm_src}) {
bcb1977b 1120 push @{$config{defines}}, "MD5_ASM";
9e0724a1 1121 }
d2b2221a 1122 $target{cast_asm_src}=$table{DEFAULTS}->{cast_asm_src} unless $disabled{pic}; # CAST assembler is not PIC
9fe2bb77 1123 if ($target{rmd160_asm_src}) {
bcb1977b 1124 push @{$config{defines}}, "RMD160_ASM";
9e0724a1 1125 }
9fe2bb77 1126 if ($target{aes_asm_src}) {
bcb1977b 1127 push @{$config{defines}}, "AES_ASM" if ($target{aes_asm_src} =~ m/\baes-/);;
9fe2bb77 1128 # aes-ctr.fake is not a real file, only indication that assembler
874a3757 1129 # module implements AES_ctr32_encrypt...
bcb1977b 1130 push @{$config{defines}}, "AES_CTR_ASM" if ($target{aes_asm_src} =~ s/\s*aes-ctr\.fake//);
9fe2bb77 1131 # aes-xts.fake indicates presence of AES_xts_[en|de]crypt...
bcb1977b 1132 push @{$config{defines}}, "AES_XTS_ASM" if ($target{aes_asm_src} =~ s/\s*aes-xts\.fake//);
9fe2bb77 1133 $target{aes_asm_src} =~ s/\s*(vpaes|aesni)-x86\.s//g if ($no_sse2);
bcb1977b
RL
1134 push @{$config{defines}}, "VPAES_ASM" if ($target{aes_asm_src} =~ m/vpaes/);
1135 push @{$config{defines}}, "BSAES_ASM" if ($target{aes_asm_src} =~ m/bsaes/);
9e0724a1 1136 }
9fe2bb77 1137 if ($target{wp_asm_src} =~ /mmx/) {
46d4d865 1138 if ($config{processor} eq "386") {
d2b2221a 1139 $target{wp_asm_src}=$table{DEFAULTS}->{wp_asm_src};
46d4d865 1140 } elsif (!$disabled{"whirlpool"}) {
2952b9b8 1141 push @{$config{defines}}, "WHIRLPOOL_ASM";
46d4d865 1142 }
9e0724a1 1143 }
9fe2bb77 1144 if ($target{modes_asm_src} =~ /ghash-/) {
bcb1977b 1145 push @{$config{defines}}, "GHASH_ASM";
9e0724a1 1146 }
9fe2bb77 1147 if ($target{ec_asm_src} =~ /ecp_nistz256/) {
bcb1977b 1148 push @{$config{defines}}, "ECP_NISTZ256_ASM";
9e0724a1 1149 }
9fe2bb77 1150 if ($target{poly1305_asm_src} ne "") {
bcb1977b 1151 push @{$config{defines}}, "POLY1305_ASM";
9e0724a1
RL
1152 }
1153}
d02b48c6 1154
8ed40b83 1155my $ecc = $target{cc};
09aa263a 1156if ($^O ne "VMS" && !$disabled{makedepend}) {
a583fc45
RL
1157 # Is the compiler gcc or clang? $ecc is used below to see if
1158 # error-checking can be turned on.
1159 my $ccpcc = "$config{cross_compile_prefix}$target{cc}";
d0db7ee0
AP
1160 open(PIPE, "$ccpcc --version 2>&1 |");
1161 my $lines = 2;
a583fc45 1162 while ( <PIPE> ) {
30752dd7
RL
1163 # Find the version number and save the major.
1164 m|(?:.*)\b(\d+)\.\d+\.\d+\b(?:.*)|;
39affe19 1165 my $compiler_major = $1;
30752dd7
RL
1166 # We know that GNU C version 3 and up as well as all clang
1167 # versions support dependency generation
39affe19 1168 $config{makedepprog} = $ccpcc
d0db7ee0 1169 if (/clang/ || (/gcc/ && $compiler_major > 3));
a583fc45
RL
1170 $ecc = "clang" if /clang/;
1171 $ecc = "gcc" if /gcc/;
d0db7ee0 1172 last if ($config{makedepprog} || !$lines--);
a583fc45
RL
1173 }
1174 close(PIPE);
09aa263a 1175
656bbdc6 1176 $config{makedepprog} = which('makedepend') unless $config{makedepprog};
09aa263a 1177 $disabled{makedepend} = "unavailable" unless $config{makedepprog};
f1f07a23 1178}
8ed40b83 1179
7d130f68 1180
09aa263a 1181
7d130f68
RL
1182# Deal with bn_ops ###################################################
1183
7d130f68 1184$config{bn_ll} =0;
7d130f68
RL
1185$config{export_var_as_fn} =0;
1186my $def_int="unsigned int";
1187$config{rc4_int} =$def_int;
b4f35e5e 1188($config{b64l},$config{b64},$config{b32})=(0,0,1);
7d130f68 1189
94af0cd7 1190my $count = 0;
7d130f68 1191foreach (sort split(/\s+/,$target{bn_ops})) {
94af0cd7
RS
1192 $count++ if /SIXTY_FOUR_BIT|SIXTY_FOUR_BIT_LONG|THIRTY_TWO_BIT/;
1193 $config{export_var_as_fn}=1 if $_ eq 'EXPORT_VAR_AS_FN';
1194 $config{bn_ll}=1 if $_ eq 'BN_LLONG';
1195 $config{rc4_int}="unsigned char" if $_ eq 'RC4_CHAR';
1196 ($config{b64l},$config{b64},$config{b32})
1197 =(0,1,0) if $_ eq 'SIXTY_FOUR_BIT';
1198 ($config{b64l},$config{b64},$config{b32})
1199 =(1,0,0) if $_ eq 'SIXTY_FOUR_BIT_LONG';
1200 ($config{b64l},$config{b64},$config{b32})
1201 =(0,0,1) if $_ eq 'THIRTY_TWO_BIT';
7d130f68 1202}
94af0cd7
RS
1203die "Exactly one of SIXTY_FOUR_BIT|SIXTY_FOUR_BIT_LONG|THIRTY_TWO_BIT can be set in bn_ops\n"
1204 if $count > 1;
7d130f68
RL
1205
1206
1207# Hack cflags for better warnings (dev option) #######################
1208
1ed0c662
RL
1209# "Stringify" the C flags string. This permits it to be made part of a string
1210# and works as well on command lines.
01d99976 1211$config{cflags} =~ s/([\\\"])/\\$1/g;
b436a982 1212
107b5792
RL
1213if (defined($config{api})) {
1214 $config{openssl_api_defines} = [ "OPENSSL_MIN_API=".$apitable->{$config{api}} ];
bcb1977b 1215 my $apiflag = sprintf("OPENSSL_API_COMPAT=%s", $apitable->{$config{api}});
bcb1977b 1216 push @{$config{defines}}, $apiflag;
98186eb4
VD
1217}
1218
0c28f277
DSH
1219if ($strict_warnings)
1220 {
1221 my $wopt;
f1f07a23
RS
1222 die "ERROR --strict-warnings requires gcc or clang"
1223 unless $ecc eq 'gcc' || $ecc eq 'clang';
0c28f277
DSH
1224 foreach $wopt (split /\s+/, $gcc_devteam_warn)
1225 {
d918f9cb 1226 $config{cflags} .= " $wopt" unless ($config{cflags} =~ /(?:^|\s)$wopt(?:\s|$)/)
0c28f277 1227 }
190c8c60
BL
1228 if ($ecc eq "clang")
1229 {
1230 foreach $wopt (split /\s+/, $clang_devteam_warn)
1231 {
d918f9cb 1232 $config{cflags} .= " $wopt" unless ($config{cflags} =~ /(?:^|\s)$wopt(?:\s|$)/)
190c8c60
BL
1233 }
1234 }
ef8ca6bd
RL
1235 }
1236
1237unless ($disabled{"crypto-mdebug-backtrace"})
1238 {
1239 foreach my $wopt (split /\s+/, $memleak_devteam_backtrace)
a1d3f3d1 1240 {
d918f9cb 1241 $config{cflags} .= " $wopt" unless ($config{cflags} =~ /(?:^|\s)$wopt(?:\s|$)/)
ef8ca6bd
RL
1242 }
1243 if ($target =~ /^BSD-/)
1244 {
1245 $config{ex_libs} .= " -lexecinfo";
291e94df 1246 }
0c28f277
DSH
1247 }
1248
63994098
RL
1249if ($user_cflags ne "") { $config{cflags}="$config{cflags}$user_cflags"; }
1250else { $no_user_cflags=1; }
1251if (@user_defines) { $config{defines}=[ @{$config{defines}}, @user_defines ]; }
1252else { $no_user_defines=1; }
1253
1254# ALL MODIFICATIONS TO %config and %target MUST BE DONE FROM HERE ON
1255
c91a0a83
EK
1256unless ($disabled{afalgeng}) {
1257 $config{afalgeng}="";
79fff39d
RL
1258 if ($target =~ m/^linux/) {
1259 my $minver = 4*10000 + 1*100 + 0;
1260 if ($config{cross_compile_prefix} eq "") {
1261 my $verstr = `uname -r`;
1262 my ($ma, $mi1, $mi2) = split("\\.", $verstr);
1263 ($mi2) = $mi2 =~ /(\d+)/;
1264 my $ver = $ma*10000 + $mi1*100 + $mi2;
1265 if ($ver < $minver) {
c91a0a83 1266 $disabled{afalgeng} = "too-old-kernel";
79fff39d
RL
1267 } else {
1268 push @{$config{engdirs}}, "afalg";
1269 }
68dc37c1
MC
1270 } else {
1271 $disabled{afalgeng} = "cross-compiling";
6cba4a66 1272 }
79fff39d 1273 } else {
c91a0a83 1274 $disabled{afalgeng} = "not-linux";
7f458a48 1275 }
1276}
8da00a38 1277
c91a0a83 1278push @{$config{openssl_other_defines}}, "OPENSSL_NO_AFALGENG" if ($disabled{afalgeng});
7f458a48 1279
9fe2bb77
RL
1280# If we use the unified build, collect information from build.info files
1281my %unified_info = ();
1282
2b6b606c 1283my $buildinfo_debug = defined($ENV{CONFIGURE_DEBUG_BUILDINFO});
ddf1847d
RL
1284if ($builder eq "unified") {
1285 # Store the name of the template file we will build the build file from
1286 # in %config. This may be useful for the build file itself.
38add230
RL
1287 my $build_file_template;
1288
1289 for my $filename (( $builder_platform."-".$target{build_file}.".tmpl",
1290 $target{build_file}.".tmpl" )) {
1291 if (defined $ENV{$local_config_envname}) {
1292 if ($^O eq 'VMS') {
1293 # VMS environment variables are logical names,
1294 # which can be used as is
1295 $build_file_template = $local_config_envname . ':' . $filename;
1296 } else {
1297 $build_file_template = catfile($ENV{$local_config_envname},
1298 $filename);
1299 }
1300 }
1301
1302 last if -f $build_file_template;
1303
1304 $build_file_template = catfile($srcdir, "Configurations", $filename);
1305
1306 last if -f $build_file_template;
1307 }
ddf1847d
RL
1308 $config{build_file_template} = $build_file_template;
1309
9fe2bb77
RL
1310 use lib catdir(dirname(__FILE__),"util");
1311 use with_fallback qw(Text::Template);
1312
9fe2bb77 1313 sub cleandir {
2e963849 1314 my $base = shift;
9fe2bb77 1315 my $dir = shift;
2e963849
RL
1316 my $relativeto = shift || ".";
1317
1318 $dir = catdir($base,$dir) unless isabsolute($dir);
9fe2bb77 1319
ec182ef0
RL
1320 # Make sure the directories we're building in exists
1321 mkpath($dir);
1322
2e963849 1323 my $res = abs2rel(absolutedir($dir), rel2abs($relativeto));
9fe2bb77
RL
1324 #print STDERR "DEBUG[cleandir]: $dir , $base => $res\n";
1325 return $res;
1326 }
1327
1328 sub cleanfile {
2e963849 1329 my $base = shift;
9fe2bb77 1330 my $file = shift;
2e963849
RL
1331 my $relativeto = shift || ".";
1332
1333 $file = catfile($base,$file) unless isabsolute($file);
1334
9fe2bb77
RL
1335 my $d = dirname($file);
1336 my $f = basename($file);
1337
ec182ef0
RL
1338 # Make sure the directories we're building in exists
1339 mkpath($d);
1340
2e963849 1341 my $res = abs2rel(catfile(absolutedir($d), $f), rel2abs($relativeto));
9fe2bb77
RL
1342 #print STDERR "DEBUG[cleanfile]: $d , $f => $res\n";
1343 return $res;
1344 }
1345
1346 my @build_infos = ( [ ".", "build.info" ] );
1347 foreach (@{$config{dirs}}) {
1348 push @build_infos, [ $_, "build.info" ]
1349 if (-f catfile($srcdir, $_, "build.info"));
1350 }
1351 foreach (@{$config{sdirs}}) {
1352 push @build_infos, [ catdir("crypto", $_), "build.info" ]
1353 if (-f catfile($srcdir, "crypto", $_, "build.info"));
1354 }
1355 foreach (@{$config{engdirs}}) {
1356 push @build_infos, [ catdir("engines", $_), "build.info" ]
1357 if (-f catfile($srcdir, "engines", $_, "build.info"));
1358 }
1359
2e0956ba
RL
1360 $config{build_infos} = [ ];
1361
9fe2bb77
RL
1362 foreach (@build_infos) {
1363 my $sourced = catdir($srcdir, $_->[0]);
1364 my $buildd = catdir($blddir, $_->[0]);
1365
dca99383 1366 mkpath($buildd);
9fe2bb77
RL
1367
1368 my $f = $_->[1];
1369 # The basic things we're trying to build
1370 my @programs = ();
1371 my @libraries = ();
1372 my @engines = ();
1373 my @scripts = ();
1374 my @extra = ();
8a67946e 1375 my @overrides = ();
9fe2bb77
RL
1376 my @intermediates = ();
1377 my @rawlines = ();
1378
1379 my %ordinals = ();
1380 my %sources = ();
2a08d1a0 1381 my %shared_sources = ();
9fe2bb77
RL
1382 my %includes = ();
1383 my %depends = ();
1384 my %renames = ();
1385 my %sharednames = ();
ae4c7450 1386 my %generate = ();
9fe2bb77 1387
2e0956ba 1388 push @{$config{build_infos}}, catfile(abs2rel($sourced, $blddir), $f);
9fe2bb77
RL
1389 my $template = Text::Template->new(TYPE => 'FILE',
1390 SOURCE => catfile($sourced, $f));
1391 die "Something went wrong with $sourced/$f: $!\n" unless $template;
1392 my @text =
1393 split /^/m,
1394 $template->fill_in(HASH => { config => \%config,
1395 target => \%target,
9e04edf2 1396 disabled => \%disabled,
f59d0131 1397 withargs => \%withargs,
9fe2bb77
RL
1398 builddir => abs2rel($buildd, $blddir),
1399 sourcedir => abs2rel($sourced, $blddir),
1400 buildtop => abs2rel($blddir, $blddir),
1401 sourcetop => abs2rel($srcdir, $blddir) },
1402 DELIMITERS => [ "{-", "-}" ]);
1403
1404 # The top item of this stack has the following values
1405 # -2 positive already run and we found ELSE (following ELSIF should fail)
1406 # -1 positive already run (skip until ENDIF)
1407 # 0 negatives so far (if we're at a condition, check it)
1408 # 1 last was positive (don't skip lines until next ELSE, ELSIF or ENDIF)
1409 # 2 positive ELSE (following ELSIF should fail)
1410 my @skip = ();
1411 collect_information(
1412 collect_from_array([ @text ],
1413 qr/\\$/ => sub { my $l1 = shift; my $l2 = shift;
1414 $l1 =~ s/\\$//; $l1.$l2 }),
1415 # Info we're looking for
1416 qr/^\s*IF\[((?:\\.|[^\\\]])*)\]\s*$/
635bd409 1417 => sub {
c5798e0e 1418 if (! @skip || $skip[$#skip] > 0) {
635bd409
RL
1419 push @skip, !! $1;
1420 } else {
1421 push @skip, -1;
1422 }
1423 },
9fe2bb77
RL
1424 qr/^\s*ELSIF\[((?:\\.|[^\\\]])*)\]\s*$/
1425 => sub { die "ELSIF out of scope" if ! @skip;
1426 die "ELSIF following ELSE" if abs($skip[$#skip]) == 2;
1427 $skip[$#skip] = -1 if $skip[$#skip] != 0;
1428 $skip[$#skip] = !! $1
1429 if $skip[$#skip] == 0; },
1430 qr/^\s*ELSE\s*$/
1431 => sub { die "ELSE out of scope" if ! @skip;
1432 $skip[$#skip] = -2 if $skip[$#skip] != 0;
1433 $skip[$#skip] = 2 if $skip[$#skip] == 0; },
1434 qr/^\s*ENDIF\s*$/
1435 => sub { die "ENDIF out of scope" if ! @skip;
1436 pop @skip; },
1437 qr/^\s*PROGRAMS\s*=\s*(.*)\s*$/
ce959812 1438 => sub { push @programs, tokenize($1)
9fe2bb77
RL
1439 if !@skip || $skip[$#skip] > 0 },
1440 qr/^\s*LIBS\s*=\s*(.*)\s*$/
ce959812 1441 => sub { push @libraries, tokenize($1)
9fe2bb77
RL
1442 if !@skip || $skip[$#skip] > 0 },
1443 qr/^\s*ENGINES\s*=\s*(.*)\s*$/
ce959812 1444 => sub { push @engines, tokenize($1)
9fe2bb77
RL
1445 if !@skip || $skip[$#skip] > 0 },
1446 qr/^\s*SCRIPTS\s*=\s*(.*)\s*$/
ce959812 1447 => sub { push @scripts, tokenize($1)
9fe2bb77
RL
1448 if !@skip || $skip[$#skip] > 0 },
1449 qr/^\s*EXTRA\s*=\s*(.*)\s*$/
ce959812 1450 => sub { push @extra, tokenize($1)
9fe2bb77 1451 if !@skip || $skip[$#skip] > 0 },
8a67946e 1452 qr/^\s*OVERRIDES\s*=\s*(.*)\s*$/
ce959812 1453 => sub { push @overrides, tokenize($1)
8a67946e 1454 if !@skip || $skip[$#skip] > 0 },
9fe2bb77
RL
1455
1456 qr/^\s*ORDINALS\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/,
ce959812 1457 => sub { push @{$ordinals{$1}}, tokenize($2)
9fe2bb77
RL
1458 if !@skip || $skip[$#skip] > 0 },
1459 qr/^\s*SOURCE\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/
ce959812 1460 => sub { push @{$sources{$1}}, tokenize($2)
9fe2bb77 1461 if !@skip || $skip[$#skip] > 0 },
2a08d1a0 1462 qr/^\s*SHARED_SOURCE\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/
ce959812 1463 => sub { push @{$shared_sources{$1}}, tokenize($2)
2a08d1a0 1464 if !@skip || $skip[$#skip] > 0 },
9fe2bb77 1465 qr/^\s*INCLUDE\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/
ce959812 1466 => sub { push @{$includes{$1}}, tokenize($2)
9fe2bb77
RL
1467 if !@skip || $skip[$#skip] > 0 },
1468 qr/^\s*DEPEND\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/
ce959812 1469 => sub { push @{$depends{$1}}, tokenize($2)
9fe2bb77 1470 if !@skip || $skip[$#skip] > 0 },
ae4c7450
RL
1471 qr/^\s*GENERATE\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/
1472 => sub { push @{$generate{$1}}, $2
1473 if !@skip || $skip[$#skip] > 0 },
9fe2bb77 1474 qr/^\s*RENAME\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/
ce959812 1475 => sub { push @{$renames{$1}}, tokenize($2)
9fe2bb77
RL
1476 if !@skip || $skip[$#skip] > 0 },
1477 qr/^\s*SHARED_NAME\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/
ce959812 1478 => sub { push @{$sharednames{$1}}, tokenize($2)
9fe2bb77
RL
1479 if !@skip || $skip[$#skip] > 0 },
1480 qr/^\s*BEGINRAW\[((?:\\.|[^\\\]])+)\]\s*$/
1481 => sub {
1482 my $lineiterator = shift;
1483 my $target_kind = $1;
1484 while (defined $lineiterator->()) {
04f171c0 1485 s|\R$||;
9fe2bb77
RL
1486 if (/^\s*ENDRAW\[((?:\\.|[^\\\]])+)\]\s*$/) {
1487 die "ENDRAW doesn't match BEGINRAW"
1488 if $1 ne $target_kind;
1489 last;
1490 }
1491 next if @skip && $skip[$#skip] <= 0;
1492 push @rawlines, $_
1493 if ($target_kind eq $target{build_file}
ddf1847d 1494 || $target_kind eq $target{build_file}."(".$builder_platform.")");
9fe2bb77
RL
1495 }
1496 },
1497 qr/^(?:#.*|\s*)$/ => sub { },
2b6b606c
RL
1498 "OTHERWISE" => sub { die "Something wrong with this line:\n$_\nat $sourced/$f" },
1499 "BEFORE" => sub {
1500 if ($buildinfo_debug) {
1501 print STDERR "DEBUG: Parsing ",join(" ", @_),"\n";
1502 print STDERR "DEBUG: ... before parsing, skip stack is ",join(" ", map { int($_) } @skip),"\n";
1503 }
1504 },
1505 "AFTER" => sub {
1506 if ($buildinfo_debug) {
1507 print STDERR "DEBUG: .... after parsing, skip stack is ",join(" ", map { int($_) } @skip),"\n";
1508 }
1509 },
9fe2bb77
RL
1510 );
1511 die "runaway IF?" if (@skip);
1512
1513 foreach (keys %renames) {
1514 die "$_ renamed to more than one thing: "
1515 ,join(" ", @{$renames{$_}}),"\n"
1516 if scalar @{$renames{$_}} > 1;
2e963849
RL
1517 my $dest = cleanfile($buildd, $_, $blddir);
1518 my $to = cleanfile($buildd, $renames{$_}->[0], $blddir);
9fe2bb77
RL
1519 die "$dest renamed to more than one thing: "
1520 ,$unified_info{rename}->{$dest}, $to
1521 unless !defined($unified_info{rename}->{$dest})
1522 or $unified_info{rename}->{$dest} eq $to;
1523 $unified_info{rename}->{$dest} = $to;
1524 }
1525
1526 foreach (@programs) {
2e963849 1527 my $program = cleanfile($buildd, $_, $blddir);
9fe2bb77
RL
1528 if ($unified_info{rename}->{$program}) {
1529 $program = $unified_info{rename}->{$program};
1530 }
1531 $unified_info{programs}->{$program} = 1;
1532 }
1533
1534 foreach (@libraries) {
2e963849 1535 my $library = cleanfile($buildd, $_, $blddir);
9fe2bb77
RL
1536 if ($unified_info{rename}->{$library}) {
1537 $library = $unified_info{rename}->{$library};
1538 }
1539 $unified_info{libraries}->{$library} = 1;
1540 }
1541
343ec2b0 1542 die <<"EOF" if scalar @engines and !$config{dynamic_engines};
19ab5790 1543ENGINES can only be used if configured with 'dynamic-engine'.
9fe2bb77
RL
1544This is usually a fault in a build.info file.
1545EOF
1546 foreach (@engines) {
2e963849 1547 my $library = cleanfile($buildd, $_, $blddir);
9fe2bb77
RL
1548 if ($unified_info{rename}->{$library}) {
1549 $library = $unified_info{rename}->{$library};
1550 }
1551 $unified_info{engines}->{$library} = 1;
1552 }
1553
1554 foreach (@scripts) {
2e963849 1555 my $script = cleanfile($buildd, $_, $blddir);
9fe2bb77
RL
1556 if ($unified_info{rename}->{$script}) {
1557 $script = $unified_info{rename}->{$script};
1558 }
1559 $unified_info{scripts}->{$script} = 1;
1560 }
1561
1562 foreach (@extra) {
2e963849 1563 my $extra = cleanfile($buildd, $_, $blddir);
9fe2bb77
RL
1564 $unified_info{extra}->{$extra} = 1;
1565 }
1566
8a67946e
RL
1567 foreach (@overrides) {
1568 my $override = cleanfile($buildd, $_, $blddir);
1569 $unified_info{overrides}->{$override} = 1;
1570 }
1571
9fe2bb77
RL
1572 push @{$unified_info{rawlines}}, @rawlines;
1573
84af1bae 1574 unless ($disabled{shared}) {
9fe2bb77
RL
1575 # Check sharednames.
1576 foreach (keys %sharednames) {
2e963849 1577 my $dest = cleanfile($buildd, $_, $blddir);
9fe2bb77
RL
1578 if ($unified_info{rename}->{$dest}) {
1579 $dest = $unified_info{rename}->{$dest};
1580 }
1581 die "shared_name for $dest with multiple values: "
1582 ,join(" ", @{$sharednames{$_}}),"\n"
1583 if scalar @{$sharednames{$_}} > 1;
2e963849 1584 my $to = cleanfile($buildd, $sharednames{$_}->[0], $blddir);
9fe2bb77
RL
1585 die "shared_name found for a library $dest that isn't defined\n"
1586 unless $unified_info{libraries}->{$dest};
1587 die "shared_name for $dest with multiple values: "
1588 ,$unified_info{sharednames}->{$dest}, ", ", $to
1589 unless !defined($unified_info{sharednames}->{$dest})
1590 or $unified_info{sharednames}->{$dest} eq $to;
1591 $unified_info{sharednames}->{$dest} = $to;
1592 }
1593
1594 # Additionally, we set up sharednames for libraries that don't
1595 # have any, as themselves.
1596 foreach (keys %{$unified_info{libraries}}) {
1597 if (!defined $unified_info{sharednames}->{$_}) {
1598 $unified_info{sharednames}->{$_} = $_
1599 }
1600 }
1601 }
1602
1603 foreach (keys %ordinals) {
1604 my $dest = $_;
2e963849 1605 my $ddest = cleanfile($buildd, $_, $blddir);
9fe2bb77
RL
1606 if ($unified_info{rename}->{$ddest}) {
1607 $ddest = $unified_info{rename}->{$ddest};
1608 }
1609 foreach (@{$ordinals{$dest}}) {
1610 my %known_ordinals =
1611 (
1612 crypto =>
6928b617 1613 cleanfile($sourced, catfile("util", "libcrypto.num"), $blddir),
9fe2bb77 1614 ssl =>
6928b617 1615 cleanfile($sourced, catfile("util", "libssl.num"), $blddir)
9fe2bb77
RL
1616 );
1617 my $o = $known_ordinals{$_};
1618 die "Ordinals for $ddest defined more than once\n"
1619 if $unified_info{ordinals}->{$ddest};
1620 $unified_info{ordinals}->{$ddest} = [ $_, $o ];
1621 }
1622 }
1623
1624 foreach (keys %sources) {
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 (@{$sources{$dest}}) {
2e963849 1631 my $s = cleanfile($sourced, $_, $blddir);
9fe2bb77
RL
1632
1633 # If it isn't in the source tree, we assume it's generated
1634 # in the build tree
1635 if (! -f $s) {
2e963849 1636 $s = cleanfile($buildd, $_, $blddir);
9fe2bb77
RL
1637 }
1638 # We recognise C and asm files
1639 if ($s =~ /\.[csS]\b$/) {
1640 (my $o = $_) =~ s/\.[csS]\b$/.o/;
2e963849 1641 $o = cleanfile($buildd, $o, $blddir);
9fe2bb77
RL
1642 $unified_info{sources}->{$ddest}->{$o} = 1;
1643 $unified_info{sources}->{$o}->{$s} = 1;
1644 } else {
1645 $unified_info{sources}->{$ddest}->{$s} = 1;
1646 }
1647 }
1648 }
1649
2a08d1a0
RL
1650 foreach (keys %shared_sources) {
1651 my $dest = $_;
1652 my $ddest = cleanfile($buildd, $_, $blddir);
1653 if ($unified_info{rename}->{$ddest}) {
1654 $ddest = $unified_info{rename}->{$ddest};
1655 }
1656 foreach (@{$shared_sources{$dest}}) {
1657 my $s = cleanfile($sourced, $_, $blddir);
1658
1659 # If it isn't in the source tree, we assume it's generated
1660 # in the build tree
1661 if (! -f $s) {
1662 $s = cleanfile($buildd, $_, $blddir);
1663 }
1664 # We recognise C and asm files
1665 if ($s =~ /\.[csS]\b$/) {
1666 (my $o = $_) =~ s/\.[csS]\b$/.o/;
1667 $o = cleanfile($buildd, $o, $blddir);
1668 $unified_info{shared_sources}->{$ddest}->{$o} = 1;
1669 $unified_info{sources}->{$o}->{$s} = 1;
1670 } else {
1671 die "unrecognised source file type for shared library: $s\n";
1672 }
1673 }
1674 }
1675
ae4c7450
RL
1676 foreach (keys %generate) {
1677 my $dest = $_;
1678 my $ddest = cleanfile($buildd, $_, $blddir);
1679 if ($unified_info{rename}->{$ddest}) {
1680 $ddest = $unified_info{rename}->{$ddest};
1681 }
1682 die "more than one generator for $dest: "
1683 ,join(" ", @{$generate{$_}}),"\n"
1684 if scalar @{$generate{$_}} > 1;
1685 my @generator = split /\s+/, $generate{$dest}->[0];
1686 $generator[0] = cleanfile($sourced, $generator[0], $blddir),
1687 $unified_info{generate}->{$ddest} = [ @generator ];
1688 }
1689
9fe2bb77
RL
1690 foreach (keys %depends) {
1691 my $dest = $_;
8d34daf0
RL
1692 my $ddest = cleanfile($sourced, $_, $blddir);
1693
1694 # If the destination doesn't exist in source, it can only be
1695 # a generated file in the build tree.
1696 if (! -f $ddest) {
1697 $ddest = cleanfile($buildd, $_, $blddir);
1698 if ($unified_info{rename}->{$ddest}) {
1699 $ddest = $unified_info{rename}->{$ddest};
1700 }
9fe2bb77
RL
1701 }
1702 foreach (@{$depends{$dest}}) {
2e963849 1703 my $d = cleanfile($sourced, $_, $blddir);
9fe2bb77 1704
e737d7b1
RL
1705 # If we know it's generated, or assume it is because we can't
1706 # find it in the source tree, we set file we depend on to be
1707 # in the build tree rather than the source tree, and assume
1708 # and that there are lines to build it in a BEGINRAW..ENDRAW
1709 # section or in the Makefile template.
1710 if (! -f $d
da1f2104
RL
1711 || (grep { $d eq $_ }
1712 map { cleanfile($srcdir, $_, $blddir) }
1713 (@generated_headers, @generated_by_make_headers))) {
2e963849 1714 $d = cleanfile($buildd, $_, $blddir);
9fe2bb77
RL
1715 }
1716 # Take note if the file to depend on is being renamed
1717 if ($unified_info{rename}->{$d}) {
1718 $d = $unified_info{rename}->{$d};
1719 }
1720 $unified_info{depends}->{$ddest}->{$d} = 1;
8d34daf0
RL
1721 # If we depend on a header file or a perl module, let's make
1722 # sure it can get included
1723 if ($d =~ /\.(h|pm)$/) {
9fe2bb77
RL
1724 my $i = dirname($d);
1725 push @{$unified_info{includes}->{$ddest}}, $i
1726 unless grep { $_ eq $i } @{$unified_info{includes}->{$ddest}};
1727 }
1728 }
1729 }
1730
1731 foreach (keys %includes) {
1732 my $dest = $_;
8d34daf0
RL
1733 my $ddest = cleanfile($sourced, $_, $blddir);
1734
1735 # If the destination doesn't exist in source, it can only be
1736 # a generated file in the build tree.
1737 if (! -f $ddest) {
1738 $ddest = cleanfile($buildd, $_, $blddir);
1739 if ($unified_info{rename}->{$ddest}) {
1740 $ddest = $unified_info{rename}->{$ddest};
1741 }
9fe2bb77
RL
1742 }
1743 foreach (@{$includes{$dest}}) {
2e963849 1744 my $i = cleandir($sourced, $_, $blddir);
9fe2bb77
RL
1745 push @{$unified_info{includes}->{$ddest}}, $i
1746 unless grep { $_ eq $i } @{$unified_info{includes}->{$ddest}};
1747 }
1748 }
1749 }
1750
1751 ### Make unified_info a bit more efficient
1752 # One level structures
8a67946e 1753 foreach (("programs", "libraries", "engines", "scripts", "extra", "overrides")) {
9fe2bb77
RL
1754 $unified_info{$_} = [ sort keys %{$unified_info{$_}} ];
1755 }
1756 # Two level structures
2a08d1a0 1757 foreach my $l1 (("sources", "shared_sources", "ldadd", "depends")) {
9fe2bb77
RL
1758 foreach my $l2 (sort keys %{$unified_info{$l1}}) {
1759 $unified_info{$l1}->{$l2} =
1760 [ sort keys %{$unified_info{$l1}->{$l2}} ];
1761 }
1762 }
1763}
1764
1765# For the schemes that need it, we provide the old *_obj configs
1766# from the *_asm_obj ones
3a55c92b 1767foreach (grep /_(asm|aux)_src$/, keys %target) {
9fe2bb77 1768 my $src = $_;
3a55c92b 1769 (my $obj = $_) =~ s/_(asm|aux)_src$/_obj/;
9fe2bb77
RL
1770 ($target{$obj} = $target{$src}) =~ s/\.[csS]\b/.o/g;
1771}
1772
291e94df
RL
1773# Write down our configuration where it fits #########################
1774
1775open(OUT,">configdata.pm") || die "unable to create configdata.pm: $!\n";
1776print OUT <<"EOF";
1777package configdata;
1778
1779use strict;
1780use warnings;
1781
1782use Exporter;
1783#use vars qw(\@ISA \@EXPORT);
1784our \@ISA = qw(Exporter);
3850f8cb 1785our \@EXPORT = qw(\%config \%target \%disabled \%withargs \%unified_info \@disablables);
291e94df
RL
1786
1787EOF
1788print OUT "our %config = (\n";
1789foreach (sort keys %config) {
1790 if (ref($config{$_}) eq "ARRAY") {
1791 print OUT " ", $_, " => [ ", join(", ",
1792 map { quotify("perl", $_) }
1793 @{$config{$_}}), " ],\n";
1794 } else {
1795 print OUT " ", $_, " => ", quotify("perl", $config{$_}), ",\n"
1796 }
1797}
1798print OUT <<"EOF";
1799);
1800
1801EOF
1802print OUT "our %target = (\n";
1803foreach (sort keys %target) {
1804 if (ref($target{$_}) eq "ARRAY") {
1805 print OUT " ", $_, " => [ ", join(", ",
1806 map { quotify("perl", $_) }
1807 @{$target{$_}}), " ],\n";
1808 } else {
1809 print OUT " ", $_, " => ", quotify("perl", $target{$_}), ",\n"
1810 }
1811}
1812print OUT <<"EOF";
1813);
1814
96d2d7bc
RL
1815EOF
1816print OUT "our \%available_protocols = (\n";
1817print OUT " tls => [ ", join(", ", map { quotify("perl", $_) } @tls), " ],\n";
1818print OUT " dtls => [ ", join(", ", map { quotify("perl", $_) } @dtls), " ],\n";
1819print OUT <<"EOF";
1820);
1821
3850f8cb
RL
1822EOF
1823print OUT "our \@disablables = (\n";
1824foreach (@disablables) {
1825 print OUT " ", quotify("perl", $_), ",\n";
1826}
1827print OUT <<"EOF";
1828);
1829
96d2d7bc
RL
1830EOF
1831print OUT "our \%disabled = (\n";
1832foreach (sort keys %disabled) {
1833 print OUT " ", quotify("perl", $_), " => ", quotify("perl", $disabled{$_}), ",\n";
1834}
1835print OUT <<"EOF";
1836);
1837
291e94df 1838EOF
107b5792
RL
1839print OUT "our %withargs = (\n";
1840foreach (sort keys %withargs) {
1841 if (ref($withargs{$_}) eq "ARRAY") {
1842 print OUT " ", $_, " => [ ", join(", ",
1843 map { quotify("perl", $_) }
1844 @{$withargs{$_}}), " ],\n";
1845 } else {
1846 print OUT " ", $_, " => ", quotify("perl", $withargs{$_}), ",\n"
1847 }
1848}
1849print OUT <<"EOF";
1850);
edd4d402 1851
107b5792 1852EOF
ddf1847d 1853if ($builder eq "unified") {
9fe2bb77
RL
1854 my $recurse;
1855 $recurse = sub {
1856 my $indent = shift;
1857 foreach (@_) {
1858 if (ref $_ eq "ARRAY") {
1859 print OUT " "x$indent, "[\n";
1860 foreach (@$_) {
1861 $recurse->($indent + 4, $_);
1862 }
1863 print OUT " "x$indent, "],\n";
1864 } elsif (ref $_ eq "HASH") {
1865 my %h = %$_;
1866 print OUT " "x$indent, "{\n";
1867 foreach (sort keys %h) {
1868 if (ref $h{$_} eq "") {
1869 print OUT " "x($indent + 4), quotify("perl", $_), " => ", quotify("perl", $h{$_}), ",\n";
1870 } else {
1871 print OUT " "x($indent + 4), quotify("perl", $_), " =>\n";
1872 $recurse->($indent + 8, $h{$_});
1873 }
1874 }
1875 print OUT " "x$indent, "},\n";
1876 } else {
1877 print OUT " "x$indent, quotify("perl", $_), ",\n";
1878 }
1879 }
1880 };
1881 print OUT "our %unified_info = (\n";
1882 foreach (sort keys %unified_info) {
1883 if (ref $unified_info{$_} eq "") {
1884 print OUT " "x4, quotify("perl", $_), " => ", quotify("perl", $unified_info{$_}), ",\n";
1885 } else {
1886 print OUT " "x4, quotify("perl", $_), " =>\n";
1887 $recurse->(8, $unified_info{$_});
1888 }
1889 }
1890 print OUT <<"EOF";
1891);
1892
1893EOF
1894}
1895print OUT "1;\n";
d02b48c6 1896close(OUT);
f2d4be3b 1897
9fe2bb77 1898
f58a0acb 1899print "CC =$config{cross_compile_prefix}$target{cc}\n";
2952b9b8 1900print "CFLAG =$target{cflags} $config{cflags}\n";
63ee7129 1901print "SHARED_CFLAG =$target{shared_cflag}\n";
2952b9b8 1902print "DEFINES =",join(" ", @{$target{defines}}, @{$config{defines}}),"\n";
940a09ba
RL
1903print "LFLAG =$target{lflags}\n";
1904print "PLIB_LFLAG =$target{plib_lflags}\n";
2952b9b8 1905print "EX_LIBS =$target{ex_libs} $config{ex_libs}\n";
b756967d 1906print "APPS_OBJ =$target{apps_obj}\n";
291e94df 1907print "CPUID_OBJ =$target{cpuid_obj}\n";
b756967d 1908print "UPLINK_OBJ =$target{uplink_obj}\n";
291e94df
RL
1909print "BN_ASM =$target{bn_obj}\n";
1910print "EC_ASM =$target{ec_obj}\n";
1911print "DES_ENC =$target{des_obj}\n";
1912print "AES_ENC =$target{aes_obj}\n";
1913print "BF_ENC =$target{bf_obj}\n";
1914print "CAST_ENC =$target{cast_obj}\n";
1915print "RC4_ENC =$target{rc4_obj}\n";
1916print "RC5_ENC =$target{rc5_obj}\n";
1917print "MD5_OBJ_ASM =$target{md5_obj}\n";
1918print "SHA1_OBJ_ASM =$target{sha1_obj}\n";
1919print "RMD160_OBJ_ASM=$target{rmd160_obj}\n";
1920print "CMLL_ENC =$target{cmll_obj}\n";
1921print "MODES_OBJ =$target{modes_obj}\n";
f0bd4686 1922print "PADLOCK_OBJ =$target{padlock_obj}\n";
291e94df
RL
1923print "CHACHA_ENC =$target{chacha_obj}\n";
1924print "POLY1305_OBJ =$target{poly1305_obj}\n";
2d0b4412 1925print "BLAKE2_OBJ =$target{blake2_obj}\n";
7d130f68 1926print "PROCESSOR =$config{processor}\n";
f58a0acb
AP
1927print "RANLIB =", $target{ranlib} eq '$(CROSS_COMPILE)ranlib' ?
1928 "$config{cross_compile_prefix}ranlib" :
1929 "$target{ranlib}", "\n";
291e94df
RL
1930print "ARFLAGS =$target{arflags}\n";
1931print "PERL =$config{perl}\n";
f0bd4686 1932print "\n";
7d130f68
RL
1933print "SIXTY_FOUR_BIT_LONG mode\n" if $config{b64l};
1934print "SIXTY_FOUR_BIT mode\n" if $config{b64};
1935print "THIRTY_TWO_BIT mode\n" if $config{b32};
7d130f68 1936print "BN_LLONG mode\n" if $config{bn_ll};
01d99976 1937print "RC4 uses $config{rc4_int}\n" if $config{rc4_int} ne $def_int;
cba5068d 1938
e737d7b1
RL
1939for (@generated_headers) {
1940 mkpath(catdir($blddir, dirname($_)));
1941 run_dofile(catfile($blddir, $_),
1942 catfile($srcdir, $_.".in"));
f0bd4686
RL
1943}
1944
88087414 1945my %builders = (
9fe2bb77 1946 unified => sub {
ddf1847d
RL
1947 run_dofile(catfile($blddir, $target{build_file}),
1948 $config{build_file_template},
1949 catfile($srcdir, "Configurations", "common.tmpl"));
9fe2bb77 1950 },
88087414
RL
1951 );
1952
ddf1847d 1953$builders{$builder}->($builder_platform, @builder_opts);
fce0ba5f 1954
76ffb43d 1955print <<"EOF";
63d3f44a 1956
89ec98e0 1957Configured for $target.
63d3f44a 1958EOF
5f8d5c96 1959
9c62a279 1960print <<"EOF" if ($disabled{threads} eq "unavailable");
5f8d5c96
BM
1961
1962The library could not be configured for supporting multi-threaded
1963applications as the compiler options required on this system are not known.
ff1b7e09 1964See file INSTALL for details if you need multi-threading.
ec577822
BM
1965EOF
1966
76ffb43d 1967print <<"EOF" if ($no_shared_warn);
2964ba8c 1968
ae48242c
RL
1969The options 'shared', 'pic' and 'dynamic-engine' aren't supported on this
1970platform, so we will pretend you gave the option 'no-pic', which also disables
1971'shared' and 'dynamic-engine'. If you know how to implement shared libraries
1972or position independent code, please let us know (but please first make sure
1973you have tried with a current version of OpenSSL).
2e31ef03
RS
1974EOF
1975
ddc606c9
RL
1976print <<"EOF" if (-f catfile($srcdir, "configdata.pm") && $srcdir ne $blddir);
1977
1978WARNING: there are indications that another build was made in the source
1979directory. This build may have picked up artifacts from that build, the
1980safest course of action is to clean the source directory and redo this
1981configuration.
1982EOF
1983
d02b48c6
RE
1984exit(0);
1985
bd5192b1
RL
1986######################################################################
1987#
1988# Helpers and utility functions
1989#
1990
1991# Configuration file reading #########################################
1992
1f2e1cd5
RL
1993# Note: All of the helper functions are for lazy evaluation. They all
1994# return a CODE ref, which will return the intended value when evaluated.
1995# Thus, whenever there's mention of a returned value, it's about that
1996# intended value.
1997
bd5192b1 1998# Helper function to implement conditional inheritance depending on the
00b0d663 1999# value of $disabled{asm}. Used in inherit_from values as follows:
bd5192b1
RL
2000#
2001# inherit_from => [ "template", asm("asm_tmpl") ]
2002#
2003sub asm {
2004 my @x = @_;
2005 sub {
00b0d663 2006 $disabled{asm} ? () : @x;
bd5192b1
RL
2007 }
2008}
2009
1f2e1cd5
RL
2010# Helper function to implement conditional value variants, with a default
2011# plus additional values based on the value of $config{build_type}.
2012# Arguments are given in hash table form:
2013#
2014# picker(default => "Basic string: ",
2015# debug => "debug",
2016# release => "release")
2017#
2018# When configuring with --debug, the resulting string will be
2019# "Basic string: debug", and when not, it will be "Basic string: release"
2020#
2021# This can be used to create variants of sets of flags according to the
2022# build type:
2023#
2024# cflags => picker(default => "-Wall",
2025# debug => "-g -O0",
2026# release => "-O3")
2027#
2028sub picker {
2029 my %opts = @_;
2030 return sub { add($opts{default} || (),
2031 $opts{$config{build_type}} || ())->(); }
2032}
2033
2034# Helper function to combine several values of different types into one.
2035# This is useful if you want to combine a string with the result of a
2036# lazy function, such as:
2037#
2038# cflags => combine("-Wall", sub { $disabled{zlib} ? () : "-DZLIB" })
2039#
2040sub combine {
2041 my @stuff = @_;
2042 return sub { add(@stuff)->(); }
2043}
2044
2045# Helper function to implement conditional values depending on the value
2046# of $disabled{threads}. Can be used as follows:
2047#
2048# cflags => combine("-Wall", threads("-pthread"))
2049#
2050sub threads {
2051 my @flags = @_;
2052 return sub { add($disabled{threads} ? () : @flags)->(); }
2053}
2054
2055
2056
9c62a279 2057our $add_called = 0;
88087414
RL
2058# Helper function to implement adding values to already existing configuration
2059# values. It handles elements that are ARRAYs, CODEs and scalars
2060sub _add {
2061 my $separator = shift;
2062
bcb1977b
RL
2063 # If there's any ARRAY in the collection of values OR the separator
2064 # is undef, we will return an ARRAY of combined values, otherwise a
2065 # string of joined values with $separator as the separator.
2066 my $found_array = !defined($separator);
88087414
RL
2067
2068 my @values =
2069 map {
b0b92a5b
RL
2070 my $res = $_;
2071 while (ref($res) eq "CODE") {
2072 $res = $res->();
2073 }
2074 if (defined($res)) {
2075 if (ref($res) eq "ARRAY") {
2076 $found_array = 1;
2077 @$res;
2078 } else {
2079 $res;
2080 }
88087414 2081 } else {
b0b92a5b 2082 ();
88087414
RL
2083 }
2084 } (@_);
2085
9c62a279
RL
2086 $add_called = 1;
2087
88087414
RL
2088 if ($found_array) {
2089 [ @values ];
2090 } else {
b0b92a5b 2091 join($separator, grep { defined($_) && $_ ne "" } @values);
88087414
RL
2092 }
2093}
2094sub add_before {
bdcd83e1
RL
2095 my $separator = " ";
2096 if (ref($_[$#_]) eq "HASH") {
2097 my $opts = pop;
2098 $separator = $opts->{separator};
2099 }
88087414
RL
2100 my @x = @_;
2101 sub { _add($separator, @x, @_) };
2102}
2103sub add {
bdcd83e1
RL
2104 my $separator = " ";
2105 if (ref($_[$#_]) eq "HASH") {
2106 my $opts = pop;
2107 $separator = $opts->{separator};
2108 }
88087414
RL
2109 my @x = @_;
2110 sub { _add($separator, @_, @x) };
2111}
2112
bd5192b1
RL
2113# configuration reader, evaluates the input file as a perl script and expects
2114# it to fill %targets with target configurations. Those are then added to
2115# %table.
2116sub read_config {
2117 my $fname = shift;
2118 open(CONFFILE, "< $fname")
2119 or die "Can't open configuration file '$fname'!\n";
2120 my $x = $/;
2121 undef $/;
2122 my $content = <CONFFILE>;
2123 $/ = $x;
2124 close(CONFFILE);
2125 my %targets = ();
2126 {
2127 local %table = %::table; # Protect %table from tampering
2128
2129 eval $content;
2130 warn $@ if $@;
2131 }
2132
2133 # For each target, check that it's configured with a hash table.
2134 foreach (keys %targets) {
2135 if (ref($targets{$_}) ne "HASH") {
2136 if (ref($targets{$_}) eq "") {
2137 warn "Deprecated target configuration for $_, ignoring...\n";
2138 } else {
2139 warn "Misconfigured target configuration for $_ (should be a hash table), ignoring...\n";
2140 }
2141 delete $targets{$_};
2142 }
2143 }
2144
2145 %table = (%table, %targets);
2146
2147}
2148
8483a003
F
2149# configuration resolver. Will only resolve all the lazy evaluation
2150# codeblocks for the chosen target and all those it inherits from,
bd5192b1
RL
2151# recursively
2152sub resolve_config {
2153 my $target = shift;
2154 my @breadcrumbs = @_;
2155
c4718849 2156# my $extra_checks = defined($ENV{CONFIGURE_EXTRA_CHECKS});
9c62a279 2157
bd5192b1
RL
2158 if (grep { $_ eq $target } @breadcrumbs) {
2159 die "inherit_from loop! target backtrace:\n "
2160 ,$target,"\n ",join("\n ", @breadcrumbs),"\n";
2161 }
2162
2163 if (!defined($table{$target})) {
2164 warn "Warning! target $target doesn't exist!\n";
2165 return ();
2166 }
2167 # Recurse through all inheritances. They will be resolved on the
2168 # fly, so when this operation is done, they will all just be a
2169 # bunch of attributes with string values.
2170 # What we get here, though, are keys with references to lists of
2171 # the combined values of them all. We will deal with lists after
2172 # this stage is done.
2173 my %combined_inheritance = ();
2174 if ($table{$target}->{inherit_from}) {
2175 my @inherit_from =
2176 map { ref($_) eq "CODE" ? $_->() : $_ } @{$table{$target}->{inherit_from}};
2177 foreach (@inherit_from) {
2178 my %inherited_config = resolve_config($_, $target, @breadcrumbs);
2179
2180 # 'template' is a marker that's considered private to
2181 # the config that had it.
2182 delete $inherited_config{template};
2183
2110febb 2184 foreach (keys %inherited_config) {
bd5192b1
RL
2185 if (!$combined_inheritance{$_}) {
2186 $combined_inheritance{$_} = [];
2187 }
2188 push @{$combined_inheritance{$_}}, $inherited_config{$_};
2110febb 2189 }
bd5192b1
RL
2190 }
2191 }
2192
2193 # We won't need inherit_from in this target any more, since we've
2194 # resolved all the inheritances that lead to this
2195 delete $table{$target}->{inherit_from};
2196
2197 # Now is the time to deal with those lists. Here's the place to
2198 # decide what shall be done with those lists, all based on the
2199 # values of the target we're currently dealing with.
2200 # - If a value is a coderef, it will be executed with the list of
2201 # inherited values as arguments.
2202 # - If the corresponding key doesn't have a value at all or is the
8483a003 2203 # empty string, the inherited value list will be run through the
bd5192b1
RL
2204 # default combiner (below), and the result becomes this target's
2205 # value.
2206 # - Otherwise, this target's value is assumed to be a string that
2207 # will simply override the inherited list of values.
a26d8be9 2208 my $default_combiner = add();
bd5192b1
RL
2209
2210 my %all_keys =
2211 map { $_ => 1 } (keys %combined_inheritance,
2212 keys %{$table{$target}});
b0b92a5b
RL
2213
2214 sub process_values {
2215 my $object = shift;
2216 my $inherited = shift; # Always a [ list ]
2217 my $target = shift;
2218 my $entry = shift;
2219
9c62a279
RL
2220 $add_called = 0;
2221
b0b92a5b
RL
2222 while(ref($object) eq "CODE") {
2223 $object = $object->(@$inherited);
2224 }
2225 if (!defined($object)) {
2226 return ();
2227 }
2228 elsif (ref($object) eq "ARRAY") {
9c62a279 2229 local $add_called; # To make sure recursive calls don't affect it
b0b92a5b
RL
2230 return [ map { process_values($_, $inherited, $target, $entry) }
2231 @$object ];
2232 } elsif (ref($object) eq "") {
2233 return $object;
2234 } else {
2235 die "cannot handle reference type ",ref($object)
2236 ," found in target ",$target," -> ",$entry,"\n";
2237 }
2238 }
2239
bd5192b1 2240 foreach (sort keys %all_keys) {
9c62a279 2241 my $previous = $combined_inheritance{$_};
bd5192b1
RL
2242
2243 # Current target doesn't have a value for the current key?
2244 # Assign it the default combiner, the rest of this loop body
2245 # will handle it just like any other coderef.
2246 if (!exists $table{$target}->{$_}) {
2247 $table{$target}->{$_} = $default_combiner;
2248 }
2249
b0b92a5b
RL
2250 $table{$target}->{$_} = process_values($table{$target}->{$_},
2251 $combined_inheritance{$_},
2252 $target, $_);
2253 unless(defined($table{$target}->{$_})) {
2254 delete $table{$target}->{$_};
2255 }
c4718849
RL
2256# if ($extra_checks &&
2257# $previous && !($add_called || $previous ~~ $table{$target}->{$_})) {
2258# warn "$_ got replaced in $target\n";
2259# }
bd5192b1
RL
2260 }
2261
2262 # Finally done, return the result.
2263 return %{$table{$target}};
2264}
2265
462ba4f6 2266sub usage
d02b48c6 2267 {
462ba4f6 2268 print STDERR $usage;
10a926c1 2269 print STDERR "\npick os/compiler from:\n";
1641cb60 2270 my $j=0;
6457ad15 2271 my $i;
10a926c1 2272 my $k=0;
6457ad15 2273 foreach $i (sort keys %table)
d02b48c6 2274 {
bd5192b1 2275 next if $table{$i}->{template};
462ba4f6 2276 next if $i =~ /^debug/;
10a926c1
UM
2277 $k += length($i) + 1;
2278 if ($k > 78)
2279 {
2280 print STDERR "\n";
2281 $k=length($i);
2282 }
2283 print STDERR $i . " ";
462ba4f6
UM
2284 }
2285 foreach $i (sort keys %table)
2286 {
bd5192b1 2287 next if $table{$i}->{template};
462ba4f6 2288 next if $i !~ /^debug/;
10a926c1
UM
2289 $k += length($i) + 1;
2290 if ($k > 78)
2291 {
2292 print STDERR "\n";
2293 $k=length($i);
2294 }
2295 print STDERR $i . " ";
d02b48c6 2296 }
10a926c1 2297 print STDERR "\n\nNOTE: If in doubt, on Unix-ish systems use './config'.\n";
462ba4f6 2298 exit(1);
d02b48c6
RE
2299 }
2300
01d99976 2301sub run_dofile
107b5792 2302{
107b5792 2303 my $out = shift;
9fe2bb77 2304 my @templates = @_;
107b5792 2305
ced2c2c5
RS
2306 unlink $out || warn "Can't remove $out, $!"
2307 if -f $out;
9fe2bb77
RL
2308 foreach (@templates) {
2309 die "Can't open $_, $!" unless -f $_;
2310 }
a3a08f81 2311 my $cmd = "$config{perl} \"-I.\" \"-Mconfigdata\" \"$dofile\" -o\"Configure\" \"".join("\" \"",@templates)."\" > \"$out.new\"";
9fe2bb77
RL
2312 #print STDERR "DEBUG[run_dofile]: \$cmd = $cmd\n";
2313 system($cmd);
107b5792
RL
2314 exit 1 if $? != 0;
2315 rename("$out.new", $out) || die "Can't rename $out.new, $!";
2316}
2317
656bbdc6
AP
2318sub which
2319{
2320 my ($name)=@_;
2321
2322 if (eval { require IPC::Cmd; 1; }) {
2323 IPC::Cmd->import();
2324 return scalar IPC::Cmd::can_run($name);
2325 } else {
2326 # if there is $directories component in splitpath,
2327 # then it's not something to test with $PATH...
2328 return $name if (File::Spec->splitpath($name))[1];
2329
2330 foreach (File::Spec->path()) {
2331 my $fullpath = catfile($_, "$name$target{exe_extension}");
2332 if (-f $fullpath and -x $fullpath) {
2333 return $fullpath;
2334 }
2335 }
2336 }
2337}
2338
00ae96ca
RL
2339# Configuration printer ##############################################
2340
2341sub print_table_entry
2342{
2343 my $target = shift;
2344 my %target = resolve_config($target);
2345 my $type = shift;
2346
2347 # Don't print the templates
2348 return if $target{template};
2349
2350 my @sequence = (
f0bd4686 2351 "sys_id",
00ae96ca
RL
2352 "cc",
2353 "cflags",
bcb1977b 2354 "defines",
f0bd4686
RL
2355 "unistd",
2356 "ld",
00ae96ca 2357 "lflags",
c86ddbe6 2358 "plib_lflags",
1740c162 2359 "ex_libs",
00ae96ca
RL
2360 "bn_ops",
2361 "cpuid_obj",
2362 "bn_obj",
2363 "ec_obj",
2364 "des_obj",
2365 "aes_obj",
2366 "bf_obj",
2367 "md5_obj",
2368 "sha1_obj",
2369 "cast_obj",
2370 "rc4_obj",
2371 "rmd160_obj",
2372 "rc5_obj",
2373 "wp_obj",
2374 "cmll_obj",
2375 "modes_obj",
f0bd4686 2376 "padlock_obj",
9c62a279 2377 "thread_scheme",
00ae96ca
RL
2378 "perlasm_scheme",
2379 "dso_scheme",
2380 "shared_target",
2381 "shared_cflag",
2382 "shared_ldflag",
64c443e3 2383 "shared_rcflag",
00ae96ca 2384 "shared_extension",
e987f9f2
RL
2385 "shared_extension_simple",
2386 "shared_import_extension",
2387 "dso_extension",
f0bd4686
RL
2388 "obj_extension",
2389 "exe_extension",
00ae96ca 2390 "ranlib",
f0bd4686 2391 "ar",
00ae96ca
RL
2392 "arflags",
2393 "multilib",
f0bd4686 2394 "build_scheme",
00ae96ca
RL
2395 );
2396
2397 if ($type eq "TABLE") {
2398 print "\n";
2399 print "*** $target\n";
cb212f23
RL
2400 foreach (@sequence) {
2401 if (ref($target{$_}) eq "ARRAY") {
2402 printf "\$%-12s = %s\n", $_, join(" ", @{$target{$_}});
2403 } else {
2404 printf "\$%-12s = %s\n", $_, $target{$_};
2405 }
2406 }
00ae96ca
RL
2407 } elsif ($type eq "HASH") {
2408 my $largest =
2409 length((sort { length($a) <=> length($b) } @sequence)[-1]);
2410 print " '$target' => {\n";
2411 foreach (@sequence) {
2412 if ($target{$_}) {
cb212f23
RL
2413 if (ref($target{$_}) eq "ARRAY") {
2414 print " '",$_,"'"," " x ($largest - length($_))," => [ ",join(", ", map { "'$_'" } @{$target{$_}})," ],\n";
2415 } else {
2416 print " '",$_,"'"," " x ($largest - length($_))," => '",$target{$_},"',\n";
2417 }
00ae96ca
RL
2418 }
2419 }
2420 print " },\n";
2421 }
2422}
2423
2424# Utility routines ###################################################
2425
2e963849
RL
2426# On VMS, if the given file is a logical name, File::Spec::Functions
2427# will consider it an absolute path. There are cases when we want a
2428# purely syntactic check without checking the environment.
2429sub isabsolute {
2430 my $file = shift;
2431
2432 # On non-platforms, we just use file_name_is_absolute().
2433 return file_name_is_absolute($file) unless $^O eq "VMS";
2434
2435 # If the file spec includes a device or a directpry spec,
2436 # file_name_is_absolute() is perfectly safe.
2437 return file_name_is_absolute($file) if $file =~ m|[:\[]|;
2438
2439 # Here, we know the given file spec isn't absolute
2440 return 0;
2441}
2442
ec182ef0
RL
2443# Makes a directory absolute and cleans out /../ in paths like foo/../bar
2444# On some platforms, this uses rel2abs(), while on others, realpath() is used.
2445# realpath() requires that at least all path components except the last is an
2446# existing directory. On VMS, the last component of the directory spec must
2447# exist.
2448sub absolutedir {
2449 my $dir = shift;
2450
2451 # realpath() is quite buggy on VMS. It uses LIB$FID_TO_NAME, which
2452 # will return the volume name for the device, no matter what. Also,
2453 # it will return an incorrect directory spec if the argument is a
2454 # directory that doesn't exist.
2455 if ($^O eq "VMS") {
2456 return rel2abs($dir);
2457 }
2458
2459 # We use realpath() on Unix, since no other will properly clean out
2460 # a directory spec.
2461 use Cwd qw/realpath/;
2462
2463 return realpath($dir);
2464}
2465
fe05264e
RL
2466sub quotify {
2467 my %processors = (
2468 perl => sub { my $x = shift;
2469 $x =~ s/([\\\$\@"])/\\$1/g;
2470 return '"'.$x.'"'; },
2471 );
2472 my $for = shift;
2473 my $processor =
2474 defined($processors{$for}) ? $processors{$for} : sub { shift; };
2475
2110febb 2476 return map { $processor->($_); } @_;
fe05264e 2477}
107b5792 2478
9fe2bb77
RL
2479# collect_from_file($filename, $line_concat_cond_re, $line_concat)
2480# $filename is a file name to read from
2481# $line_concat_cond_re is a regexp detecting a line continuation ending
2482# $line_concat is a CODEref that takes care of concatenating two lines
2483sub collect_from_file {
2484 my $filename = shift;
2485 my $line_concat_cond_re = shift;
2486 my $line_concat = shift;
2487
2488 open my $fh, $filename || die "unable to read $filename: $!\n";
2489 return sub {
2490 my $saved_line = "";
2491 $_ = "";
2492 while (<$fh>) {
04f171c0 2493 s|\R$||;
9fe2bb77
RL
2494 if (defined $line_concat) {
2495 $_ = $line_concat->($saved_line, $_);
2496 $saved_line = "";
2497 }
2498 if (defined $line_concat_cond_re && /$line_concat_cond_re/) {
2499 $saved_line = $_;
2500 next;
2501 }
2502 return $_;
2503 }
2504 die "$filename ending with continuation line\n" if $_;
2505 close $fh;
2506 return undef;
2507 }
2508}
2509
2510# collect_from_array($array, $line_concat_cond_re, $line_concat)
2511# $array is an ARRAYref of lines
2512# $line_concat_cond_re is a regexp detecting a line continuation ending
2513# $line_concat is a CODEref that takes care of concatenating two lines
2514sub collect_from_array {
2515 my $array = shift;
2516 my $line_concat_cond_re = shift;
2517 my $line_concat = shift;
2518 my @array = (@$array);
2519
2520 return sub {
2521 my $saved_line = "";
2522 $_ = "";
2523 while (defined($_ = shift @array)) {
04f171c0 2524 s|\R$||;
9fe2bb77
RL
2525 if (defined $line_concat) {
2526 $_ = $line_concat->($saved_line, $_);
2527 $saved_line = "";
2528 }
2529 if (defined $line_concat_cond_re && /$line_concat_cond_re/) {
2530 $saved_line = $_;
2531 next;
2532 }
2533 return $_;
2534 }
2535 die "input text ending with continuation line\n" if $_;
2536 return undef;
2537 }
2538}
2539
2540# collect_information($lineiterator, $line_continue, $regexp => $CODEref, ...)
2541# $lineiterator is a CODEref that delivers one line at a time.
107b5792
RL
2542# All following arguments are regex/CODEref pairs, where the regexp detects a
2543# line and the CODEref does something with the result of the regexp.
2544sub collect_information {
9fe2bb77 2545 my $lineiterator = shift;
107b5792
RL
2546 my %collectors = @_;
2547
9fe2bb77 2548 while(defined($_ = $lineiterator->())) {
04f171c0 2549 s|\R$||;
9fe2bb77 2550 my $found = 0;
2b6b606c
RL
2551 if ($collectors{"BEFORE"}) {
2552 $collectors{"BEFORE"}->($_);
2553 }
9fe2bb77 2554 foreach my $re (keys %collectors) {
2b6b606c 2555 if ($re !~ /^OTHERWISE|BEFORE|AFTER$/ && /$re/) {
9fe2bb77
RL
2556 $collectors{$re}->($lineiterator);
2557 $found = 1;
2558 };
2559 }
2560 if ($collectors{"OTHERWISE"}) {
2561 $collectors{"OTHERWISE"}->($lineiterator, $_)
2562 unless $found || !defined $collectors{"OTHERWISE"};
2563 }
2b6b606c
RL
2564 if ($collectors{"AFTER"}) {
2565 $collectors{"AFTER"}->($_);
2566 }
107b5792 2567 }
107b5792 2568}
ce959812
RL
2569
2570# tokenize($line)
2571# $line is a line of text to split up into tokens
2572# returns a list of tokens
2573#
2574# Tokens are divided by spaces. If the tokens include spaces, they
2575# have to be quoted with single or double quotes. Double quotes
2576# inside a double quoted token must be escaped. Escaping is done
2577# with backslash.
2578# Basically, the same quoting rules apply for " and ' as in any
2579# Unix shell.
2580sub tokenize {
2581 my $line = my $debug_line = shift;
2582 my @result = ();
2583
2584 while ($line =~ s|^\s+||, $line ne "") {
2585 my $token = "";
2586 while ($line ne "" && $line !~ m|^\s|) {
2587 if ($line =~ m/^"((?:[^"\\]+|\\.)*)"/) {
2588 $token .= $1;
2589 $line = $';
2590 } elsif ($line =~ m/^'([^']*)'/) {
2591 $token .= $1;
2592 $line = $';
2593 } elsif ($line =~ m/^(\S+)/) {
2594 $token .= $1;
2595 $line = $';
2596 }
2597 }
2598 push @result, $token;
2599 }
2600
2601 if ($ENV{CONFIGURE_DEBUG_TOKENIZE}) {
2602 print STDERR "DEBUG[tokenize]: Parsed '$debug_line' into:\n";
2603 print STDERR "DEBUG[tokenize]: ('", join("', '", @result), "')\n";
2604 }
2605 return @result;
2606}