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