]> git.ipfire.org Git - thirdparty/openssl.git/blame - Configure
RT4310: Fix varous no-XXX builds
[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",
dba31777 229 "cms", "ts", "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 271 "engine",
1288f26f 272 "err",
8b527be2
RL
273 "heartbeats",
274 "hmac",
275 "hw(-.+)?",
276 "idea",
1288f26f 277 "locking",
8b527be2
RL
278 "md2",
279 "md4",
280 "md5",
281 "mdc2",
282 "md[-_]ghost94",
283 "nextprotoneg",
284 "ocb",
285 "ocsp",
48f14845 286 "poly1305",
8b527be2
RL
287 "posix-io",
288 "psk",
289 "rc2",
290 "rc4",
291 "rc5",
292 "rdrand",
293 "rfc3779",
294 "rijndael", # Old AES name
1288f26f 295 "ripemd",
8b527be2
RL
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",
1288f26f
RS
314 "ts",
315 "ui",
8b527be2
RL
316 "unit-test",
317 "whirlpool",
318 "zlib",
319 "zlib-dynamic",
320 );
6b01bed2
VD
321foreach my $proto ((@tls, @dtls))
322 {
323 push(@disablables, $proto);
324 push(@disablables, "$proto-method");
325 }
8b527be2 326
c9a112f5
BM
327# All of the following is disabled by default (RC5 was enabled before 0.9.8):
328
7a762197 329my %disabled = ( # "what" => "comment" [or special keyword "experimental"]
7d8bb912 330 "ec_nistp_64_gcc_128" => "default",
0423f812 331 "egd" => "default",
7d8bb912
BM
332 "md2" => "default",
333 "rc5" => "default",
c2e27310 334 "sctp" => "default",
7d8bb912 335 "shared" => "default",
93ab9e42 336 "ssl-trace" => "default",
e0fc7961 337 "unit-test" => "default",
7d8bb912 338 "zlib" => "default",
c2e27310 339 "crypto-mdebug" => "default",
22e3dcb7 340 "heartbeats" => "default",
7d8bb912 341 );
7a762197 342my @experimental = ();
c9a112f5 343
c569e206
RL
344# Note: => pair form used for aesthetics, not to truly make a hash table
345my @disable_cascades = (
346 # "what" => [ "cascade", ... ]
7d130f68 347 sub { $config{processor} eq "386" }
c569e206
RL
348 => [ "sse2" ],
349 "ssl" => [ "ssl3" ],
350 "ssl3-method" => [ "ssl3" ],
351 "zlib" => [ "zlib-dynamic" ],
352 "rijndael" => [ "aes" ],
353 "des" => [ "mdc2" ],
9e4d6fbf 354 "ec" => [ "ecdsa", "ecdh" ],
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 777 elsif (/^engine$/)
1288f26f
RS
778 {
779 @{$config{dirs}} = grep !/^engines$/, @{$config{dirs}};
780 @{$config{sdirs}} = grep !/^engine$/, @{$config{sdirs}};
781 push @{$config{openssl_other_defines}}, "OPENSSL_NO_ENGINE";
782 }
c9a112f5
BM
783 else
784 {
785 my ($ALGO, $algo);
30fafdeb 786 ($ALGO = $algo = $_) =~ tr/[\-a-z]/[_A-Z]/;
c9a112f5 787
1288f26f 788 if (/^asm$/ || /^err$/ || /^hw$/ || /^hw-/
498abff0 789 || /^autoalginit/ || /^autoerrinit/)
c9a112f5 790 {
7d130f68 791 push @{$config{openssl_other_defines}}, "OPENSSL_NO_$ALGO";
c9a112f5 792 print " OPENSSL_NO_$ALGO";
fce0ba5f 793
bcb1977b 794 if (/^err$/) { push @user_defines, "OPENSSL_NO_ERR"; }
5df70a9e 795 elsif (/^asm$/) { $no_asm = 1; }
c9a112f5
BM
796 }
797 else
798 {
2a4af947
AP
799 ($ALGO,$algo) = ("RMD160","rmd160") if ($algo eq "ripemd");
800
7d130f68 801 push @{$config{openssl_algorithm_defines}}, "OPENSSL_NO_$ALGO";
bcb1977b 802 push @{$config{depdefines}}, "OPENSSL_NO_$ALGO";
c9a112f5
BM
803 print " OPENSSL_NO_$ALGO";
804
e36827f6 805 # fix-up crypto/directory name(s)
107b5792
RL
806 $algo="whrlpool" if $algo eq "whirlpool";
807 $algo="ripemd" if $algo eq "rmd160";
808 @{$config{sdirs}} = grep { $_ ne $algo} @{$config{sdirs}};
2a4af947 809
e36827f6 810 print " (skip dir)";
c9a112f5
BM
811 }
812 }
813
814 print "\n";
815 }
816
7a762197
BM
817foreach (sort @experimental)
818 {
819 my $ALGO;
820 ($ALGO = $_) =~ tr/[a-z]/[A-Z]/;
821
822 # opensslconf.h will set OPENSSL_NO_... unless OPENSSL_EXPERIMENTAL_... is defined
7d130f68 823 push @{$config{openssl_experimental_defines}}, "OPENSSL_NO_$ALGO";
7a762197 824 }
c9a112f5 825
9e0724a1
RL
826print "Configuring for $target\n";
827
828# Support for legacy targets having a name starting with 'debug-'
829my ($d, $t) = $target =~ m/^(debug-)?(.*)$/;
830if ($d) {
831 $build_prefix = "debug_";
832
833 # If we do not find debug-foo in the table, the target is set to foo.
834 if (!$table{$target}) {
835 $target = $t;
836 }
837}
291e94df 838$config{target} = $target;
9e0724a1
RL
839delete $table{$base_target}->{template}; # or the next test will fail.
840my %target = ( %{$table{$base_target}}, resolve_config($target) );
841
842&usage if (!%target || $target{template});
843
107b5792
RL
844$target{exe_extension}="";
845$target{exe_extension}=".exe" if ($config{target} eq "Cygwin" || $config{target} eq "DJGPP" || $config{target} =~ /^mingw/);
846$target{exe_extension}=".nlm" if ($config{target} =~ /netware/);
847$target{exe_extension}=".pm" if ($config{target} =~ /vos/);
462ba4f6 848
291e94df
RL
849$default_ranlib = which("ranlib") || "true";
850$config{perl} = $ENV{'PERL'} || which("perl5") || which("perl") || "perl";
851my $make = $ENV{'MAKE'} || "make";
28a80034 852
642a6138
RL
853$config{cross_compile_prefix} = $ENV{'CROSS_COMPILE'}
854 if $config{cross_compile_prefix} eq "";
f99f41cf 855
7f625320 856# Allow environment CC to override compiler...
291e94df 857$target{cc} = $ENV{CC} || $target{cc};
aaf878cc 858
bcb1977b
RL
859# For cflags, lflags, plib_lflags, ex_libs and defines, add the debug_
860# or release_ attributes.
aaf878cc 861# Do it in such a way that no spurious space is appended (hence the grep).
bcb1977b
RL
862$config{defines} = [ @{$target{defines}},
863 @{$target{$build_prefix."defines"}} ];
107b5792
RL
864$config{cflags} = join(" ",
865 grep { $_ ne "" } ($target{cflags},
866 $target{$build_prefix."cflags"}));
867$config{lflags} = join(" ",
868 grep { $_ ne "" } ($target{lflags},
869 $target{$build_prefix."lflags"}));
c86ddbe6
RL
870$config{plib_lflags} = join(" ",
871 grep { $_ ne "" } ($target{plib_lflags},
872 $target{$build_prefix."plib_lflags"}));
1740c162
RL
873$config{ex_libs} = join(" ",
874 grep { $_ ne "" } ($target{ex_libs},
875 $target{$build_prefix."ex_libs"}));
bd5192b1 876
291e94df
RL
877$target{ranlib} = $ENV{'RANLIB'} || $target{ranlib} || $default_ranlib;
878$target{ar} = $ENV{'AR'} || "ar";
107b5792
RL
879$target{arflags} = "" if !defined($target{arflags});
880$target{nm} = "nm";
291e94df
RL
881# Make sure build_scheme is consistent.
882$target{build_scheme} = [ $target{build_scheme} ]
883 if ref($target{build_scheme}) ne "ARRAY";
884
242ffb05
RL
885###### TO BE REMOVED BEFORE FINAL RELEASE
886######
887###### If the user has chosen --unified, we give it to them.
888if ($target{build_file} eq "Makefile"
889 && $target{build_scheme}->[0] eq "unixmake"
890 && $unified) {
891 $target{build_scheme} = [ "unified", "unix" ];
892}
893
ddf1847d
RL
894my ($builder, $builder_platform, @builder_opts) =
895 @{$target{build_scheme}};
896
bcb1977b
RL
897push @{$config{defines}},
898 map { (my $x = $_) =~ s/^OPENSSL_NO_/OPENSSL_EXPERIMENTAL_/; $x }
899 @{$config{openssl_experimental_defines}};
7a762197 900
68ab559a 901if ($target =~ /^mingw/ && `$target{cc} --target-help 2>&1` =~ m/-mno-cygwin/m)
cbecd29a 902 {
68ab559a
RL
903 $config{cflags} .= " -mno-cygwin";
904 $target{shared_ldflag} .= " -mno-cygwin";
cbecd29a
AP
905 }
906
bcb1977b 907if ($target =~ /linux.*-mips/ && !$no_asm && $user_cflags !~ /-m(ips|arch=)/) {
63d8834c 908 # minimally required architecture flags for assembly modules
107b5792
RL
909 $config{cflags}="-mips2 $config{cflags}" if ($target =~ /mips32/);
910 $config{cflags}="-mips3 $config{cflags}" if ($target =~ /mips64/);
63d8834c
AP
911}
912
2964ba8c 913my $no_shared_warn=0;
14bcdb08 914my $no_user_cflags=0;
bcb1977b 915my $no_user_defines=0;
2964ba8c 916
bc2aadad
GT
917# The DSO code currently always implements all functions so that no
918# applications will have to worry about that from a compilation point
919# of view. However, the "method"s may return zero unless that platform
920# has support compiled in for them. Currently each method is enabled
921# by a define "DSO_<name>" ... we translate the "dso_scheme" config
922# string entry into using the following logic;
291e94df 923if (!$no_dso && $target{dso_scheme} ne "")
bc2aadad 924 {
291e94df
RL
925 $target{dso_scheme} =~ tr/[a-z]/[A-Z]/;
926 if ($target{dso_scheme} eq "DLFCN")
bc2aadad 927 {
bcb1977b
RL
928 $config{defines} = [ "DSO_DLFCN", "HAVE_DLFCN_H",
929 @{$config{defines}} ]
bc2aadad 930 }
291e94df 931 elsif ($target{dso_scheme} eq "DLFCN_NO_H")
bc2aadad 932 {
bcb1977b 933 $config{defines} = [ "DSO_DLFCN", @{$config{defines}} ]
bc2aadad
GT
934 }
935 else
936 {
bcb1977b
RL
937 $config{defines} = [ "DSO_$target{dso_scheme}",
938 @{$config{defines}} ]
bc2aadad
GT
939 }
940 }
9ec0126e 941
421e30ec 942my $thread_cflags = "";
7d130f68 943my @thread_defines;
291e94df 944if ($target{thread_cflag} ne "(unknown)" && !$no_threads)
5f8d5c96
BM
945 {
946 # If we know how to do it, support threads by default.
947 $threads = 1;
948 }
291e94df 949if ($target{thread_cflag} eq "(unknown)" && $threads)
5f8d5c96 950 {
14bcdb08
AP
951 # If the user asked for "threads", [s]he is also expected to
952 # provide any system-dependent compiler options that are
953 # necessary.
bcb1977b 954 if ($no_user_cflags && $no_user_defines)
14bcdb08
AP
955 {
956 print "You asked for multi-threading support, but didn't\n";
957 print "provide any system-specific compiler options\n";
958 exit(1);
959 }
7d130f68 960 push @thread_defines, "OPENSSL_THREADS";
5f8d5c96
BM
961 }
962else
963 {
bcb1977b
RL
964 $thread_cflags=" $target{thread_cflag}";
965 push @thread_defines, @{$target{thread_defines}}, "OPENSSL_THREADS";
fce0ba5f 966 }
5f8d5c96 967
1740c162 968$config{ex_libs}="$libs$config{ex_libs}" if ($libs ne "");
d02b48c6 969
dfeab068
RE
970if ($no_asm)
971 {
bcb1977b
RL
972 @{$config{defines}} = grep !/^[BL]_ENDIAN$/, @{$config{defines}}
973 if ($config{fips});
dfeab068 974 }
6f7ac8e1 975
5f8d5c96
BM
976if ($threads)
977 {
421e30ec 978 $config{cflags} = "$thread_cflags $config{cflags}" if $thread_cflags;
bcb1977b 979 push @{$config{defines}}, @thread_defines;
7d130f68 980 push @{$config{openssl_thread_defines}}, @thread_defines;
e452de9d
RL
981 }
982
983if ($zlib)
984 {
bcb1977b 985 push @{$config{defines}}, "ZLIB";
c9a112f5
BM
986 if (defined($disabled{"zlib-dynamic"}))
987 {
20a5819f 988 if (defined($withargs{zlib_lib}))
cc7399e7 989 {
20a5819f 990 $config{ex_libs} .= " -L" . $withargs{zlib_lib} . " -lz";
cc7399e7
DSH
991 }
992 else
993 {
1740c162 994 $config{ex_libs} .= " -lz";
cc7399e7 995 }
c9a112f5
BM
996 }
997 else
998 {
bcb1977b 999 push @{$config{defines}}, "ZLIB_SHARED";
c9a112f5 1000 }
5f8d5c96
BM
1001 }
1002
98186eb4
VD
1003# With "deprecated" disable all deprecated features.
1004if (defined($disabled{"deprecated"})) {
107b5792 1005 $config{api} = $maxapi;
98186eb4 1006}
07c4c14c 1007
291e94df 1008if ($target{shared_target} eq "")
6f7ac8e1 1009 {
107b5792 1010 $no_shared_warn = 1 if !$config{no_shared} && !$config{fips};
83365051 1011 $config{no_shared} = 1;
6f7ac8e1 1012 }
83365051 1013if (!$config{no_shared})
b436a982 1014 {
291e94df 1015 if ($target{shared_cflag} ne "")
a22fb399 1016 {
bcb1977b
RL
1017 push @{$config{defines}}, "OPENSSL_PIC";
1018 $config{cflags} = "$target{shared_cflag} $config{cflags}";
a22fb399 1019 }
d2dcf4f4 1020 }
b436a982 1021
ddf1847d 1022if ($builder ne "mk1mf")
ecd45314 1023 {
4c1a6e00 1024 # add {no-}static-engine to options to allow mkdef.pl to work without extra arguments
83365051 1025 if ($config{no_shared})
fbf002bb 1026 {
7d130f68 1027 push @{$config{openssl_other_defines}}, "OPENSSL_NO_DYNAMIC_ENGINE";
3fa04f0d 1028 $config{options}.=" static-engine";
fbf002bb
DSH
1029 }
1030 else
1031 {
7d130f68 1032 push @{$config{openssl_other_defines}}, "OPENSSL_NO_STATIC_ENGINE";
3fa04f0d 1033 $config{options}.=" no-static-engine";
fbf002bb 1034 }
6cb68620 1035 }
ecd45314 1036
c313e32a
AP
1037#
1038# Platform fix-ups
1039#
291e94df 1040if ($target{sys_id} ne "")
cf1b7d96 1041 {
642a6138 1042 push @{$config{openssl_sys_defines}}, "OPENSSL_SYS_$target{sys_id}";
cf1b7d96
RL
1043 }
1044
291e94df 1045if ($target{ranlib} eq "")
0396479d 1046 {
291e94df 1047 $target{ranlib} = $default_ranlib;
0396479d
BM
1048 }
1049
9e0724a1 1050if (!$no_asm) {
9fe2bb77 1051 $target{cpuid_asm_src}=$table{BASE}->{cpuid_asm_src} if ($config{processor} eq "386");
432c7a50
RL
1052 $target{cpuid_asm_src}.=" uplink.c uplink-x86.s"
1053 if (grep { $_ eq "OPENSSL_USE_APPLINK"} @{$config{defines}}
1054 || grep /(^|\s)-DOPENSSL_USE_APPLINK(\s|$)/, ${$config{cflags}});
1750ebcb 1055
9fe2bb77 1056 $target{bn_asm_src} =~ s/\w+-gf2m.c// if (defined($disabled{ec2m}));
f8c469de 1057
9e0724a1 1058 # bn-586 is the only one implementing bn_*_part_words
bcb1977b
RL
1059 push @{$config{defines}}, "OPENSSL_BN_ASM_PART_WORDS" if ($target{bn_asm_src} =~ /bn-586/);
1060 push @{$config{defines}}, "OPENSSL_IA32_SSE2" if (!$no_sse2 && $target{bn_asm_src} =~ /86/);
dfeab068 1061
bcb1977b
RL
1062 push @{$config{defines}}, "OPENSSL_BN_ASM_MONT" if ($target{bn_asm_src} =~ /-mont/);
1063 push @{$config{defines}}, "OPENSSL_BN_ASM_MONT5" if ($target{bn_asm_src} =~ /-mont5/);
1064 push @{$config{defines}}, "OPENSSL_BN_ASM_GF2m" if ($target{bn_asm_src} =~ /-gf2m/);
5ac7bde7 1065
107b5792 1066 if ($config{fips}) {
7d130f68 1067 push @{$config{openssl_other_defines}}, "OPENSSL_FIPS";
9e0724a1 1068 }
1ab2f7f1 1069
9fe2bb77 1070 if ($target{sha1_asm_src}) {
bcb1977b
RL
1071 push @{$config{defines}}, "SHA1_ASM" if ($target{sha1_asm_src} =~ /sx86/ || $target{sha1_asm_src} =~ /sha1/);
1072 push @{$config{defines}}, "SHA256_ASM" if ($target{sha1_asm_src} =~ /sha256/);
1073 push @{$config{defines}}, "SHA512_ASM" if ($target{sha1_asm_src} =~ /sha512/);
9e0724a1 1074 }
9fe2bb77 1075 if ($target{md5_asm_src}) {
bcb1977b 1076 push @{$config{defines}}, "MD5_ASM";
9e0724a1 1077 }
9fe2bb77
RL
1078 $target{cast_asm_src}=$table{BASE}->{cast_asm_src} if (!$config{no_shared}); # CAST assembler is not PIC
1079 if ($target{rmd160_asm_src}) {
bcb1977b 1080 push @{$config{defines}}, "RMD160_ASM";
9e0724a1 1081 }
9fe2bb77 1082 if ($target{aes_asm_src}) {
bcb1977b 1083 push @{$config{defines}}, "AES_ASM" if ($target{aes_asm_src} =~ m/\baes-/);;
9fe2bb77 1084 # aes-ctr.fake is not a real file, only indication that assembler
874a3757 1085 # module implements AES_ctr32_encrypt...
bcb1977b 1086 push @{$config{defines}}, "AES_CTR_ASM" if ($target{aes_asm_src} =~ s/\s*aes-ctr\.fake//);
9fe2bb77 1087 # aes-xts.fake indicates presence of AES_xts_[en|de]crypt...
bcb1977b 1088 push @{$config{defines}}, "AES_XTS_ASM" if ($target{aes_asm_src} =~ s/\s*aes-xts\.fake//);
9fe2bb77 1089 $target{aes_asm_src} =~ s/\s*(vpaes|aesni)-x86\.s//g if ($no_sse2);
bcb1977b
RL
1090 push @{$config{defines}}, "VPAES_ASM" if ($target{aes_asm_src} =~ m/vpaes/);
1091 push @{$config{defines}}, "BSAES_ASM" if ($target{aes_asm_src} =~ m/bsaes/);
9e0724a1 1092 }
9fe2bb77 1093 if ($target{wp_asm_src} =~ /mmx/) {
46d4d865 1094 if ($config{processor} eq "386") {
9fe2bb77 1095 $target{wp_asm_src}=$table{BASE}->{wp_asm_src};
46d4d865
AP
1096 } elsif (!$disabled{"whirlpool"}) {
1097 $config{cflags}.=" -DWHIRLPOOL_ASM";
1098 }
9e0724a1 1099 }
9fe2bb77 1100 if ($target{modes_asm_src} =~ /ghash-/) {
bcb1977b 1101 push @{$config{defines}}, "GHASH_ASM";
9e0724a1 1102 }
9fe2bb77 1103 if ($target{ec_asm_src} =~ /ecp_nistz256/) {
bcb1977b 1104 push @{$config{defines}}, "ECP_NISTZ256_ASM";
9e0724a1 1105 }
9fe2bb77 1106 if ($target{poly1305_asm_src} ne "") {
bcb1977b 1107 push @{$config{defines}}, "POLY1305_ASM";
9e0724a1
RL
1108 }
1109}
d02b48c6 1110
8ed40b83 1111my $ecc = $target{cc};
a583fc45
RL
1112if ($^O ne "VMS") {
1113 # Is the compiler gcc or clang? $ecc is used below to see if
1114 # error-checking can be turned on.
1115 my $ccpcc = "$config{cross_compile_prefix}$target{cc}";
1116 $config{makedepprog} = 'makedepend';
1117 open(PIPE, "$ccpcc --version 2>&1 | head -2 |");
1118 while ( <PIPE> ) {
1119 $config{makedepprog} = $ccpcc if /clang|gcc/;
1120 $ecc = "clang" if /clang/;
1121 $ecc = "gcc" if /gcc/;
1122 }
1123 close(PIPE);
f1f07a23 1124}
8ed40b83 1125
107b5792
RL
1126$config{depflags} =~ s/^\s*//;
1127
7d130f68
RL
1128
1129# Deal with bn_ops ###################################################
1130
7d130f68 1131$config{bn_ll} =0;
7d130f68
RL
1132$config{export_var_as_fn} =0;
1133my $def_int="unsigned int";
1134$config{rc4_int} =$def_int;
b4f35e5e 1135($config{b64l},$config{b64},$config{b32})=(0,0,1);
7d130f68 1136
94af0cd7 1137my $count = 0;
7d130f68 1138foreach (sort split(/\s+/,$target{bn_ops})) {
94af0cd7
RS
1139 $count++ if /SIXTY_FOUR_BIT|SIXTY_FOUR_BIT_LONG|THIRTY_TWO_BIT/;
1140 $config{export_var_as_fn}=1 if $_ eq 'EXPORT_VAR_AS_FN';
1141 $config{bn_ll}=1 if $_ eq 'BN_LLONG';
1142 $config{rc4_int}="unsigned char" if $_ eq 'RC4_CHAR';
1143 ($config{b64l},$config{b64},$config{b32})
1144 =(0,1,0) if $_ eq 'SIXTY_FOUR_BIT';
1145 ($config{b64l},$config{b64},$config{b32})
1146 =(1,0,0) if $_ eq 'SIXTY_FOUR_BIT_LONG';
1147 ($config{b64l},$config{b64},$config{b32})
1148 =(0,0,1) if $_ eq 'THIRTY_TWO_BIT';
7d130f68 1149}
94af0cd7
RS
1150die "Exactly one of SIXTY_FOUR_BIT|SIXTY_FOUR_BIT_LONG|THIRTY_TWO_BIT can be set in bn_ops\n"
1151 if $count > 1;
7d130f68
RL
1152
1153
1154# Hack cflags for better warnings (dev option) #######################
1155
1ed0c662
RL
1156# "Stringify" the C flags string. This permits it to be made part of a string
1157# and works as well on command lines.
107b5792 1158$config{cflags} =~ s/([\\\"])/\\\1/g;
b436a982 1159
107b5792
RL
1160if (defined($config{api})) {
1161 $config{openssl_api_defines} = [ "OPENSSL_MIN_API=".$apitable->{$config{api}} ];
bcb1977b
RL
1162 my $apiflag = sprintf("OPENSSL_API_COMPAT=%s", $apitable->{$config{api}});
1163 push @default_depdefines, $apiflag;
1164 push @{$config{defines}}, $apiflag;
98186eb4
VD
1165}
1166
0c28f277
DSH
1167if ($strict_warnings)
1168 {
1169 my $wopt;
f1f07a23
RS
1170 die "ERROR --strict-warnings requires gcc or clang"
1171 unless $ecc eq 'gcc' || $ecc eq 'clang';
0c28f277
DSH
1172 foreach $wopt (split /\s+/, $gcc_devteam_warn)
1173 {
63994098 1174 $config{cflags} .= " $wopt" unless ($config{cflags} =~ /(^|\s)$wopt(\s|$)/)
0c28f277 1175 }
190c8c60
BL
1176 if ($ecc eq "clang")
1177 {
1178 foreach $wopt (split /\s+/, $clang_devteam_warn)
1179 {
63994098 1180 $config{cflags} .= " $wopt" unless ($config{cflags} =~ /(^|\s)$wopt(\s|$)/)
190c8c60
BL
1181 }
1182 }
ef8ca6bd
RL
1183 }
1184
1185unless ($disabled{"crypto-mdebug-backtrace"})
1186 {
1187 foreach my $wopt (split /\s+/, $memleak_devteam_backtrace)
a1d3f3d1 1188 {
ef8ca6bd
RL
1189 $config{cflags} .= " $wopt" unless ($config{cflags} =~ /(^|\s)$wopt(\s|$)/)
1190 }
1191 if ($target =~ /^BSD-/)
1192 {
1193 $config{ex_libs} .= " -lexecinfo";
291e94df 1194 }
0c28f277
DSH
1195 }
1196
63994098
RL
1197if ($user_cflags ne "") { $config{cflags}="$config{cflags}$user_cflags"; }
1198else { $no_user_cflags=1; }
1199if (@user_defines) { $config{defines}=[ @{$config{defines}}, @user_defines ]; }
1200else { $no_user_defines=1; }
1201
1202# ALL MODIFICATIONS TO %config and %target MUST BE DONE FROM HERE ON
1203
9fe2bb77
RL
1204# If we use the unified build, collect information from build.info files
1205my %unified_info = ();
1206
ddf1847d
RL
1207if ($builder eq "unified") {
1208 # Store the name of the template file we will build the build file from
1209 # in %config. This may be useful for the build file itself.
1210 my $build_file_template =
1211 catfile($srcdir, "Configurations",
1212 $builder_platform."-".$target{build_file}.".tmpl");
1213 $build_file_template =
1214 catfile($srcdir, "Configurations", $target{build_file}.".tmpl")
1215 if (! -f $build_file_template);
1216 $config{build_file_template} = $build_file_template;
1217
9fe2bb77
RL
1218 use lib catdir(dirname(__FILE__),"util");
1219 use with_fallback qw(Text::Template);
1220
9fe2bb77 1221 sub cleandir {
2e963849 1222 my $base = shift;
9fe2bb77 1223 my $dir = shift;
2e963849
RL
1224 my $relativeto = shift || ".";
1225
1226 $dir = catdir($base,$dir) unless isabsolute($dir);
9fe2bb77 1227
ec182ef0
RL
1228 # Make sure the directories we're building in exists
1229 mkpath($dir);
1230
2e963849 1231 my $res = abs2rel(absolutedir($dir), rel2abs($relativeto));
9fe2bb77
RL
1232 #print STDERR "DEBUG[cleandir]: $dir , $base => $res\n";
1233 return $res;
1234 }
1235
1236 sub cleanfile {
2e963849 1237 my $base = shift;
9fe2bb77 1238 my $file = shift;
2e963849
RL
1239 my $relativeto = shift || ".";
1240
1241 $file = catfile($base,$file) unless isabsolute($file);
1242
9fe2bb77
RL
1243 my $d = dirname($file);
1244 my $f = basename($file);
1245
ec182ef0
RL
1246 # Make sure the directories we're building in exists
1247 mkpath($d);
1248
2e963849 1249 my $res = abs2rel(catfile(absolutedir($d), $f), rel2abs($relativeto));
9fe2bb77
RL
1250 #print STDERR "DEBUG[cleanfile]: $d , $f => $res\n";
1251 return $res;
1252 }
1253
1254 my @build_infos = ( [ ".", "build.info" ] );
1255 foreach (@{$config{dirs}}) {
1256 push @build_infos, [ $_, "build.info" ]
1257 if (-f catfile($srcdir, $_, "build.info"));
1258 }
1259 foreach (@{$config{sdirs}}) {
1260 push @build_infos, [ catdir("crypto", $_), "build.info" ]
1261 if (-f catfile($srcdir, "crypto", $_, "build.info"));
1262 }
1263 foreach (@{$config{engdirs}}) {
1264 push @build_infos, [ catdir("engines", $_), "build.info" ]
1265 if (-f catfile($srcdir, "engines", $_, "build.info"));
1266 }
1267
1268 foreach (@build_infos) {
1269 my $sourced = catdir($srcdir, $_->[0]);
1270 my $buildd = catdir($blddir, $_->[0]);
1271
dca99383 1272 mkpath($buildd);
9fe2bb77
RL
1273
1274 my $f = $_->[1];
1275 # The basic things we're trying to build
1276 my @programs = ();
1277 my @libraries = ();
1278 my @engines = ();
1279 my @scripts = ();
1280 my @extra = ();
1281 my @intermediates = ();
1282 my @rawlines = ();
1283
1284 my %ordinals = ();
1285 my %sources = ();
1286 my %includes = ();
1287 my %depends = ();
1288 my %renames = ();
1289 my %sharednames = ();
1290
1291 my $template = Text::Template->new(TYPE => 'FILE',
1292 SOURCE => catfile($sourced, $f));
1293 die "Something went wrong with $sourced/$f: $!\n" unless $template;
1294 my @text =
1295 split /^/m,
1296 $template->fill_in(HASH => { config => \%config,
1297 target => \%target,
1298 builddir => abs2rel($buildd, $blddir),
1299 sourcedir => abs2rel($sourced, $blddir),
1300 buildtop => abs2rel($blddir, $blddir),
1301 sourcetop => abs2rel($srcdir, $blddir) },
1302 DELIMITERS => [ "{-", "-}" ]);
1303
1304 # The top item of this stack has the following values
1305 # -2 positive already run and we found ELSE (following ELSIF should fail)
1306 # -1 positive already run (skip until ENDIF)
1307 # 0 negatives so far (if we're at a condition, check it)
1308 # 1 last was positive (don't skip lines until next ELSE, ELSIF or ENDIF)
1309 # 2 positive ELSE (following ELSIF should fail)
1310 my @skip = ();
1311 collect_information(
1312 collect_from_array([ @text ],
1313 qr/\\$/ => sub { my $l1 = shift; my $l2 = shift;
1314 $l1 =~ s/\\$//; $l1.$l2 }),
1315 # Info we're looking for
1316 qr/^\s*IF\[((?:\\.|[^\\\]])*)\]\s*$/
1317 => sub { push @skip, !! $1; },
1318 qr/^\s*ELSIF\[((?:\\.|[^\\\]])*)\]\s*$/
1319 => sub { die "ELSIF out of scope" if ! @skip;
1320 die "ELSIF following ELSE" if abs($skip[$#skip]) == 2;
1321 $skip[$#skip] = -1 if $skip[$#skip] != 0;
1322 $skip[$#skip] = !! $1
1323 if $skip[$#skip] == 0; },
1324 qr/^\s*ELSE\s*$/
1325 => sub { die "ELSE out of scope" if ! @skip;
1326 $skip[$#skip] = -2 if $skip[$#skip] != 0;
1327 $skip[$#skip] = 2 if $skip[$#skip] == 0; },
1328 qr/^\s*ENDIF\s*$/
1329 => sub { die "ENDIF out of scope" if ! @skip;
1330 pop @skip; },
1331 qr/^\s*PROGRAMS\s*=\s*(.*)\s*$/
1332 => sub { push @programs, split(/\s+/, $1)
1333 if !@skip || $skip[$#skip] > 0 },
1334 qr/^\s*LIBS\s*=\s*(.*)\s*$/
1335 => sub { push @libraries, split(/\s+/, $1)
1336 if !@skip || $skip[$#skip] > 0 },
1337 qr/^\s*ENGINES\s*=\s*(.*)\s*$/
1338 => sub { push @engines, split(/\s+/, $1)
1339 if !@skip || $skip[$#skip] > 0 },
1340 qr/^\s*SCRIPTS\s*=\s*(.*)\s*$/
1341 => sub { push @scripts, split(/\s+/, $1)
1342 if !@skip || $skip[$#skip] > 0 },
1343 qr/^\s*EXTRA\s*=\s*(.*)\s*$/
1344 => sub { push @extra, split(/\s+/, $1)
1345 if !@skip || $skip[$#skip] > 0 },
1346
1347 qr/^\s*ORDINALS\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/,
1348 => sub { push @{$ordinals{$1}}, split(/\s+/, $2)
1349 if !@skip || $skip[$#skip] > 0 },
1350 qr/^\s*SOURCE\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/
1351 => sub { push @{$sources{$1}}, split(/\s+/, $2)
1352 if !@skip || $skip[$#skip] > 0 },
1353 qr/^\s*INCLUDE\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/
1354 => sub { push @{$includes{$1}}, split(/\s+/, $2)
1355 if !@skip || $skip[$#skip] > 0 },
1356 qr/^\s*DEPEND\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/
1357 => sub { push @{$depends{$1}}, split(/\s+/, $2)
1358 if !@skip || $skip[$#skip] > 0 },
1359 qr/^\s*RENAME\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/
1360 => sub { push @{$renames{$1}}, split(/\s+/, $2)
1361 if !@skip || $skip[$#skip] > 0 },
1362 qr/^\s*SHARED_NAME\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/
1363 => sub { push @{$sharednames{$1}}, split(/\s+/, $2)
1364 if !@skip || $skip[$#skip] > 0 },
1365 qr/^\s*BEGINRAW\[((?:\\.|[^\\\]])+)\]\s*$/
1366 => sub {
1367 my $lineiterator = shift;
1368 my $target_kind = $1;
1369 while (defined $lineiterator->()) {
04f171c0 1370 s|\R$||;
9fe2bb77
RL
1371 if (/^\s*ENDRAW\[((?:\\.|[^\\\]])+)\]\s*$/) {
1372 die "ENDRAW doesn't match BEGINRAW"
1373 if $1 ne $target_kind;
1374 last;
1375 }
1376 next if @skip && $skip[$#skip] <= 0;
1377 push @rawlines, $_
1378 if ($target_kind eq $target{build_file}
ddf1847d 1379 || $target_kind eq $target{build_file}."(".$builder_platform.")");
9fe2bb77
RL
1380 }
1381 },
1382 qr/^(?:#.*|\s*)$/ => sub { },
1383 "OTHERWISE" => sub { die "Something wrong with this line:\n$_\nat $sourced/$f" }
1384 );
1385 die "runaway IF?" if (@skip);
1386
1387 foreach (keys %renames) {
1388 die "$_ renamed to more than one thing: "
1389 ,join(" ", @{$renames{$_}}),"\n"
1390 if scalar @{$renames{$_}} > 1;
2e963849
RL
1391 my $dest = cleanfile($buildd, $_, $blddir);
1392 my $to = cleanfile($buildd, $renames{$_}->[0], $blddir);
9fe2bb77
RL
1393 die "$dest renamed to more than one thing: "
1394 ,$unified_info{rename}->{$dest}, $to
1395 unless !defined($unified_info{rename}->{$dest})
1396 or $unified_info{rename}->{$dest} eq $to;
1397 $unified_info{rename}->{$dest} = $to;
1398 }
1399
1400 foreach (@programs) {
2e963849 1401 my $program = cleanfile($buildd, $_, $blddir);
9fe2bb77
RL
1402 if ($unified_info{rename}->{$program}) {
1403 $program = $unified_info{rename}->{$program};
1404 }
1405 $unified_info{programs}->{$program} = 1;
1406 }
1407
1408 foreach (@libraries) {
2e963849 1409 my $library = cleanfile($buildd, $_, $blddir);
9fe2bb77
RL
1410 if ($unified_info{rename}->{$library}) {
1411 $library = $unified_info{rename}->{$library};
1412 }
1413 $unified_info{libraries}->{$library} = 1;
1414 }
1415
1416 die <<"EOF" if $config{no_shared} && scalar @engines;
1417ENGINES can only be used if configured with 'shared'.
1418This is usually a fault in a build.info file.
1419EOF
1420 foreach (@engines) {
2e963849 1421 my $library = cleanfile($buildd, $_, $blddir);
9fe2bb77
RL
1422 if ($unified_info{rename}->{$library}) {
1423 $library = $unified_info{rename}->{$library};
1424 }
1425 $unified_info{engines}->{$library} = 1;
1426 }
1427
1428 foreach (@scripts) {
2e963849 1429 my $script = cleanfile($buildd, $_, $blddir);
9fe2bb77
RL
1430 if ($unified_info{rename}->{$script}) {
1431 $script = $unified_info{rename}->{$script};
1432 }
1433 $unified_info{scripts}->{$script} = 1;
1434 }
1435
1436 foreach (@extra) {
2e963849 1437 my $extra = cleanfile($buildd, $_, $blddir);
9fe2bb77
RL
1438 $unified_info{extra}->{$extra} = 1;
1439 }
1440
1441 push @{$unified_info{rawlines}}, @rawlines;
1442
1443 if (!$config{no_shared}) {
1444 # Check sharednames.
1445 foreach (keys %sharednames) {
2e963849 1446 my $dest = cleanfile($buildd, $_, $blddir);
9fe2bb77
RL
1447 if ($unified_info{rename}->{$dest}) {
1448 $dest = $unified_info{rename}->{$dest};
1449 }
1450 die "shared_name for $dest with multiple values: "
1451 ,join(" ", @{$sharednames{$_}}),"\n"
1452 if scalar @{$sharednames{$_}} > 1;
2e963849 1453 my $to = cleanfile($buildd, $sharednames{$_}->[0], $blddir);
9fe2bb77
RL
1454 die "shared_name found for a library $dest that isn't defined\n"
1455 unless $unified_info{libraries}->{$dest};
1456 die "shared_name for $dest with multiple values: "
1457 ,$unified_info{sharednames}->{$dest}, ", ", $to
1458 unless !defined($unified_info{sharednames}->{$dest})
1459 or $unified_info{sharednames}->{$dest} eq $to;
1460 $unified_info{sharednames}->{$dest} = $to;
1461 }
1462
1463 # Additionally, we set up sharednames for libraries that don't
1464 # have any, as themselves.
1465 foreach (keys %{$unified_info{libraries}}) {
1466 if (!defined $unified_info{sharednames}->{$_}) {
1467 $unified_info{sharednames}->{$_} = $_
1468 }
1469 }
1470 }
1471
1472 foreach (keys %ordinals) {
1473 my $dest = $_;
2e963849 1474 my $ddest = cleanfile($buildd, $_, $blddir);
9fe2bb77
RL
1475 if ($unified_info{rename}->{$ddest}) {
1476 $ddest = $unified_info{rename}->{$ddest};
1477 }
1478 foreach (@{$ordinals{$dest}}) {
1479 my %known_ordinals =
1480 (
1481 crypto =>
2e963849 1482 cleanfile($sourced, catfile("util", "libeay.num"), $blddir),
9fe2bb77 1483 ssl =>
2e963849 1484 cleanfile($sourced, catfile("util", "ssleay.num"), $blddir)
9fe2bb77
RL
1485 );
1486 my $o = $known_ordinals{$_};
1487 die "Ordinals for $ddest defined more than once\n"
1488 if $unified_info{ordinals}->{$ddest};
1489 $unified_info{ordinals}->{$ddest} = [ $_, $o ];
1490 }
1491 }
1492
1493 foreach (keys %sources) {
1494 my $dest = $_;
2e963849 1495 my $ddest = cleanfile($buildd, $_, $blddir);
9fe2bb77
RL
1496 if ($unified_info{rename}->{$ddest}) {
1497 $ddest = $unified_info{rename}->{$ddest};
1498 }
1499 foreach (@{$sources{$dest}}) {
2e963849 1500 my $s = cleanfile($sourced, $_, $blddir);
9fe2bb77
RL
1501
1502 # If it isn't in the source tree, we assume it's generated
1503 # in the build tree
1504 if (! -f $s) {
2e963849 1505 $s = cleanfile($buildd, $_, $blddir);
9fe2bb77
RL
1506 }
1507 # We recognise C and asm files
1508 if ($s =~ /\.[csS]\b$/) {
1509 (my $o = $_) =~ s/\.[csS]\b$/.o/;
2e963849 1510 $o = cleanfile($buildd, $o, $blddir);
9fe2bb77
RL
1511 $unified_info{sources}->{$ddest}->{$o} = 1;
1512 $unified_info{sources}->{$o}->{$s} = 1;
1513 } else {
1514 $unified_info{sources}->{$ddest}->{$s} = 1;
1515 }
1516 }
1517 }
1518
1519 foreach (keys %depends) {
1520 my $dest = $_;
2e963849 1521 my $ddest = cleanfile($buildd, $_, $blddir);
9fe2bb77
RL
1522 if ($unified_info{rename}->{$ddest}) {
1523 $ddest = $unified_info{rename}->{$ddest};
1524 }
1525 foreach (@{$depends{$dest}}) {
2e963849 1526 my $d = cleanfile($sourced, $_, $blddir);
9fe2bb77 1527
e737d7b1
RL
1528 # If we know it's generated, or assume it is because we can't
1529 # find it in the source tree, we set file we depend on to be
1530 # in the build tree rather than the source tree, and assume
1531 # and that there are lines to build it in a BEGINRAW..ENDRAW
1532 # section or in the Makefile template.
1533 if (! -f $d
1534 || !(grep { $d eq $_ }
1535 map { cleanfile($srcdir, $_, $blddir) }
1536 (@generated_headers, @generated_by_make_headers))) {
2e963849 1537 $d = cleanfile($buildd, $_, $blddir);
9fe2bb77
RL
1538 }
1539 # Take note if the file to depend on is being renamed
1540 if ($unified_info{rename}->{$d}) {
1541 $d = $unified_info{rename}->{$d};
1542 }
1543 $unified_info{depends}->{$ddest}->{$d} = 1;
1544 # If we depend on a header file, let's make sure it
1545 # can get included
1546 if ($d =~ /\.h$/) {
1547 my $i = dirname($d);
1548 push @{$unified_info{includes}->{$ddest}}, $i
1549 unless grep { $_ eq $i } @{$unified_info{includes}->{$ddest}};
1550 }
1551 }
1552 }
1553
1554 foreach (keys %includes) {
1555 my $dest = $_;
2e963849 1556 my $ddest = cleanfile($buildd, $_, $blddir);
9fe2bb77
RL
1557 if ($unified_info{rename}->{$ddest}) {
1558 $ddest = $unified_info{rename}->{$ddest};
1559 }
1560 foreach (@{$includes{$dest}}) {
2e963849 1561 my $i = cleandir($sourced, $_, $blddir);
9fe2bb77
RL
1562 push @{$unified_info{includes}->{$ddest}}, $i
1563 unless grep { $_ eq $i } @{$unified_info{includes}->{$ddest}};
1564 }
1565 }
1566 }
1567
1568 ### Make unified_info a bit more efficient
1569 # One level structures
1570 foreach (("programs", "libraries", "engines", "scripts", "extra")) {
1571 $unified_info{$_} = [ sort keys %{$unified_info{$_}} ];
1572 }
1573 # Two level structures
1574 foreach my $l1 (("sources", "ldadd", "depends")) {
1575 foreach my $l2 (sort keys %{$unified_info{$l1}}) {
1576 $unified_info{$l1}->{$l2} =
1577 [ sort keys %{$unified_info{$l1}->{$l2}} ];
1578 }
1579 }
1580}
1581
1582# For the schemes that need it, we provide the old *_obj configs
1583# from the *_asm_obj ones
1584foreach (grep /_asm_src$/, keys %target) {
1585 my $src = $_;
1586 (my $obj = $_) =~ s/_asm_src$/_obj/;
1587 ($target{$obj} = $target{$src}) =~ s/\.[csS]\b/.o/g;
1588}
1589
291e94df
RL
1590# Write down our configuration where it fits #########################
1591
1592open(OUT,">configdata.pm") || die "unable to create configdata.pm: $!\n";
1593print OUT <<"EOF";
1594package configdata;
1595
1596use strict;
1597use warnings;
1598
1599use Exporter;
1600#use vars qw(\@ISA \@EXPORT);
1601our \@ISA = qw(Exporter);
9fe2bb77 1602our \@EXPORT = qw(\%config \%target %withargs %unified_info);
291e94df
RL
1603
1604EOF
1605print OUT "our %config = (\n";
1606foreach (sort keys %config) {
1607 if (ref($config{$_}) eq "ARRAY") {
1608 print OUT " ", $_, " => [ ", join(", ",
1609 map { quotify("perl", $_) }
1610 @{$config{$_}}), " ],\n";
1611 } else {
1612 print OUT " ", $_, " => ", quotify("perl", $config{$_}), ",\n"
1613 }
1614}
1615print OUT <<"EOF";
1616);
1617
1618EOF
1619print OUT "our %target = (\n";
1620foreach (sort keys %target) {
1621 if (ref($target{$_}) eq "ARRAY") {
1622 print OUT " ", $_, " => [ ", join(", ",
1623 map { quotify("perl", $_) }
1624 @{$target{$_}}), " ],\n";
1625 } else {
1626 print OUT " ", $_, " => ", quotify("perl", $target{$_}), ",\n"
1627 }
1628}
1629print OUT <<"EOF";
1630);
1631
96d2d7bc
RL
1632EOF
1633print OUT "our \%available_protocols = (\n";
1634print OUT " tls => [ ", join(", ", map { quotify("perl", $_) } @tls), " ],\n";
1635print OUT " dtls => [ ", join(", ", map { quotify("perl", $_) } @dtls), " ],\n";
1636print OUT <<"EOF";
1637);
1638
1639EOF
1640print OUT "our \%disabled = (\n";
1641foreach (sort keys %disabled) {
1642 print OUT " ", quotify("perl", $_), " => ", quotify("perl", $disabled{$_}), ",\n";
1643}
1644print OUT <<"EOF";
1645);
1646
291e94df 1647EOF
107b5792
RL
1648print OUT "our %withargs = (\n";
1649foreach (sort keys %withargs) {
1650 if (ref($withargs{$_}) eq "ARRAY") {
1651 print OUT " ", $_, " => [ ", join(", ",
1652 map { quotify("perl", $_) }
1653 @{$withargs{$_}}), " ],\n";
1654 } else {
1655 print OUT " ", $_, " => ", quotify("perl", $withargs{$_}), ",\n"
1656 }
1657}
1658print OUT <<"EOF";
1659);
edd4d402 1660
107b5792 1661EOF
ddf1847d 1662if ($builder eq "unified") {
9fe2bb77
RL
1663 my $recurse;
1664 $recurse = sub {
1665 my $indent = shift;
1666 foreach (@_) {
1667 if (ref $_ eq "ARRAY") {
1668 print OUT " "x$indent, "[\n";
1669 foreach (@$_) {
1670 $recurse->($indent + 4, $_);
1671 }
1672 print OUT " "x$indent, "],\n";
1673 } elsif (ref $_ eq "HASH") {
1674 my %h = %$_;
1675 print OUT " "x$indent, "{\n";
1676 foreach (sort keys %h) {
1677 if (ref $h{$_} eq "") {
1678 print OUT " "x($indent + 4), quotify("perl", $_), " => ", quotify("perl", $h{$_}), ",\n";
1679 } else {
1680 print OUT " "x($indent + 4), quotify("perl", $_), " =>\n";
1681 $recurse->($indent + 8, $h{$_});
1682 }
1683 }
1684 print OUT " "x$indent, "},\n";
1685 } else {
1686 print OUT " "x$indent, quotify("perl", $_), ",\n";
1687 }
1688 }
1689 };
1690 print OUT "our %unified_info = (\n";
1691 foreach (sort keys %unified_info) {
1692 if (ref $unified_info{$_} eq "") {
1693 print OUT " "x4, quotify("perl", $_), " => ", quotify("perl", $unified_info{$_}), ",\n";
1694 } else {
1695 print OUT " "x4, quotify("perl", $_), " =>\n";
1696 $recurse->(8, $unified_info{$_});
1697 }
1698 }
1699 print OUT <<"EOF";
1700);
1701
1702EOF
1703}
1704print OUT "1;\n";
d02b48c6 1705close(OUT);
f2d4be3b 1706
ddf1847d 1707die <<"EOF" if $builder ne "unified" && $srcdir ne $blddir;
9fe2bb77
RL
1708
1709***** Trying building anywhere else than in the source tree will not
1710***** work for target $config{target}. To make it possible, it needs
1711***** to use the "unified" build scheme.
1712
1713EOF
1714
ddf1847d 1715print "IsMK1MF =", ($builder eq "mk1mf" ? "yes" : "no"), "\n";
291e94df 1716print "CC =$target{cc}\n";
107b5792 1717print "CFLAG =$config{cflags}\n";
bcb1977b 1718print "DEFINES =",join(" ", @{$config{defines}}),"\n";
c86ddbe6
RL
1719print "LFLAG =$config{lflags}\n";
1720print "PLIB_LFLAG =$config{plib_lflags}\n";
1740c162 1721print "EX_LIBS =$config{ex_libs}\n";
291e94df
RL
1722print "CPUID_OBJ =$target{cpuid_obj}\n";
1723print "BN_ASM =$target{bn_obj}\n";
1724print "EC_ASM =$target{ec_obj}\n";
1725print "DES_ENC =$target{des_obj}\n";
1726print "AES_ENC =$target{aes_obj}\n";
1727print "BF_ENC =$target{bf_obj}\n";
1728print "CAST_ENC =$target{cast_obj}\n";
1729print "RC4_ENC =$target{rc4_obj}\n";
1730print "RC5_ENC =$target{rc5_obj}\n";
1731print "MD5_OBJ_ASM =$target{md5_obj}\n";
1732print "SHA1_OBJ_ASM =$target{sha1_obj}\n";
1733print "RMD160_OBJ_ASM=$target{rmd160_obj}\n";
1734print "CMLL_ENC =$target{cmll_obj}\n";
1735print "MODES_OBJ =$target{modes_obj}\n";
f0bd4686 1736print "PADLOCK_OBJ =$target{padlock_obj}\n";
291e94df
RL
1737print "CHACHA_ENC =$target{chacha_obj}\n";
1738print "POLY1305_OBJ =$target{poly1305_obj}\n";
7d130f68 1739print "PROCESSOR =$config{processor}\n";
291e94df
RL
1740print "RANLIB =$target{ranlib}\n";
1741print "ARFLAGS =$target{arflags}\n";
1742print "PERL =$config{perl}\n";
f0bd4686 1743print "\n";
7d130f68
RL
1744print "SIXTY_FOUR_BIT_LONG mode\n" if $config{b64l};
1745print "SIXTY_FOUR_BIT mode\n" if $config{b64};
1746print "THIRTY_TWO_BIT mode\n" if $config{b32};
7d130f68
RL
1747print "BN_LLONG mode\n" if $config{bn_ll};
1748print "RC4 uses $config{rc4_int}\n" if $config{rc4_int} != $def_int;
cba5068d 1749
e737d7b1
RL
1750for (@generated_headers) {
1751 mkpath(catdir($blddir, dirname($_)));
1752 run_dofile(catfile($blddir, $_),
1753 catfile($srcdir, $_.".in"));
f0bd4686
RL
1754}
1755
9fe2bb77
RL
1756###
1757### When the old "unixmake" scheme goes away, so does this function
1758###
1759sub build_Makefile {
1760 run_dofile("Makefile","Makefile.in");
1761
1762 # Copy all Makefile.in to Makefile (except top-level)
1763 use File::Find;
1764 use IO::File;
1765 find(
1766 {
1767 preprocess => sub {
1768 grep(!/^\./, @_);
1769 },
1770 wanted => sub {
1771 return if ($_ ne "Makefile.in" || $File::Find::dir eq ".");
1772 my $in = IO::File->new($_, "r") or
1773 die sprintf "Error reading Makefile.in in %s: !$\n",
1774 $File::Find::dir;
1775 my $out = IO::File->new("Makefile", "w") or
1776 die sprintf "Error writing Makefile in %s: !$\n",
1777 $File::Find::dir;
1778 print $out "# Generated from $_, do not edit\n";
1779 while (my $line = <$in>) { print $out $line }
1780 $in->close() or
1781 die sprintf "Error reading Makefile.in in %s: !$\n",
1782 $File::Find::dir;
1783 $out->close() or
1784 die sprintf "Error writing Makefile in %s: !$\n",
1785 $File::Find::dir;
1786 },
fb36ca12 1787 },
9fe2bb77
RL
1788 ".");
1789}
d10dac11 1790
88087414 1791my %builders = (
9fe2bb77 1792 unified => sub {
ddf1847d
RL
1793 run_dofile(catfile($blddir, $target{build_file}),
1794 $config{build_file_template},
1795 catfile($srcdir, "Configurations", "common.tmpl"));
9fe2bb77 1796 },
88087414 1797 unixmake => sub {
9fe2bb77
RL
1798 build_Makefile();
1799
1800 run_dofile("util/domd", "util/domd.in");
1801 chmod 0755, "util/domd";
88087414
RL
1802 },
1803 mk1mf => sub {
ddf1847d 1804 my $platform = shift;
9fe2bb77
RL
1805 # The only reason we do this is to have something to build MINFO from
1806 build_Makefile();
1807
88087414 1808 # create the ms/version32.rc file if needed
7839b735 1809 if ($platform ne "netware") {
88087414 1810 my ($v1, $v2, $v3, $v4);
3fa04f0d 1811 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
1812 $v1=hex $1;
1813 $v2=hex $2;
1814 $v3=hex $3;
1815 $v4=hex $4;
88087414
RL
1816 }
1817 open (OUT,">ms/version32.rc") || die "Can't open ms/version32.rc";
1818 print OUT <<"EOF";
fc6a6a10
DSH
1819#include <winver.h>
1820
1821LANGUAGE 0x09,0x01
1822
18231 VERSIONINFO
1824 FILEVERSION $v1,$v2,$v3,$v4
1825 PRODUCTVERSION $v1,$v2,$v3,$v4
1826 FILEFLAGSMASK 0x3fL
1827#ifdef _DEBUG
1828 FILEFLAGS 0x01L
1829#else
1830 FILEFLAGS 0x00L
1831#endif
1832 FILEOS VOS__WINDOWS32
1833 FILETYPE VFT_DLL
1834 FILESUBTYPE 0x0L
1835BEGIN
1836 BLOCK "StringFileInfo"
1837 BEGIN
1838 BLOCK "040904b0"
1839 BEGIN
fce0ba5f 1840 // Required:
fc6a6a10
DSH
1841 VALUE "CompanyName", "The OpenSSL Project, http://www.openssl.org/\\0"
1842 VALUE "FileDescription", "OpenSSL Shared Library\\0"
3fa04f0d 1843 VALUE "FileVersion", "$config{version}\\0"
fc6a6a10
DSH
1844#if defined(CRYPTO)
1845 VALUE "InternalName", "libeay32\\0"
1846 VALUE "OriginalFilename", "libeay32.dll\\0"
1847#elif defined(SSL)
1848 VALUE "InternalName", "ssleay32\\0"
1849 VALUE "OriginalFilename", "ssleay32.dll\\0"
a479d72d 1850#endif
fc6a6a10 1851 VALUE "ProductName", "The OpenSSL Toolkit\\0"
3fa04f0d 1852 VALUE "ProductVersion", "$config{version}\\0"
fc6a6a10
DSH
1853 // Optional:
1854 //VALUE "Comments", "\\0"
51cbee35 1855 VALUE "LegalCopyright", "Copyright © 1998-2015 The OpenSSL Project. Copyright © 1995-1998 Eric A. Young, Tim J. Hudson. All rights reserved.\\0"
fc6a6a10
DSH
1856 //VALUE "LegalTrademarks", "\\0"
1857 //VALUE "PrivateBuild", "\\0"
1858 //VALUE "SpecialBuild", "\\0"
1859 END
1860 END
1861 BLOCK "VarFileInfo"
1862 BEGIN
1863 VALUE "Translation", 0x409, 0x4b0
1864 END
1865END
1866EOF
88087414
RL
1867 close(OUT);
1868 }
1869 },
1870 );
1871
ddf1847d 1872$builders{$builder}->($builder_platform, @builder_opts);
fce0ba5f 1873
76ffb43d 1874print <<"EOF";
63d3f44a 1875
89ec98e0 1876Configured for $target.
63d3f44a 1877EOF
5f8d5c96 1878
76ffb43d 1879print <<"EOF" if (!$no_threads && !$threads);
5f8d5c96
BM
1880
1881The library could not be configured for supporting multi-threaded
1882applications as the compiler options required on this system are not known.
ff1b7e09 1883See file INSTALL for details if you need multi-threading.
ec577822
BM
1884EOF
1885
76ffb43d 1886print <<"EOF" if ($no_shared_warn);
2964ba8c 1887
2e31ef03
RS
1888You gave the option 'shared', which is not supported on this platform, so
1889we will pretend you gave the option 'no-shared'. If you know how to implement
1890shared libraries, please let us know (but please first make sure you have
1891tried with a current version of OpenSSL).
1892EOF
1893
242ffb05
RL
1894###### TO BE REMOVED BEFORE FINAL RELEASE
1895######
1896###### If the user hasn't chosen --unified, try to nudge them.
1897if ($target{build_file} eq "Makefile"
1898 && $target{build_scheme}->[0] eq "unixmake"
1899 && !$unified) {
1900
1901 my $plausible_builddir =
1902 abs2rel(rel2abs("../_openssl-build_$target"),rel2abs("."));
1903 my $plausible_to_sourcedir =
1904 abs2rel(rel2abs("."),rel2abs("../_openssl-build_$target"));
1905 print <<"EOF";
1906
1907----------------------------------------------------------------------
1908Please consider configuring with the flag --unified .
1909It's to test out a new "unified" building system.
1910
1911One cool feature is that you can have your build directory elsewhere,
1912for example:
1913
1914 make clean # Clean the current configuration away
1915 mkdir $plausible_builddir
1916 cd $plausible_builddir
1917 $plausible_to_sourcedir/config --unified
1918 make
1919 make test
1920
1921Please report any problem you have.
1922----------------------------------------------------------------------
1923
1924EOF
1925}
1926
d02b48c6
RE
1927exit(0);
1928
bd5192b1
RL
1929######################################################################
1930#
1931# Helpers and utility functions
1932#
1933
1934# Configuration file reading #########################################
1935
1936# Helper function to implement conditional inheritance depending on the
1937# value of $no_asm. Used in inherit_from values as follows:
1938#
1939# inherit_from => [ "template", asm("asm_tmpl") ]
1940#
1941sub asm {
1942 my @x = @_;
1943 sub {
1944 $no_asm ? () : @x;
1945 }
1946}
1947
88087414
RL
1948# Helper function to implement adding values to already existing configuration
1949# values. It handles elements that are ARRAYs, CODEs and scalars
1950sub _add {
1951 my $separator = shift;
1952
bcb1977b
RL
1953 # If there's any ARRAY in the collection of values OR the separator
1954 # is undef, we will return an ARRAY of combined values, otherwise a
1955 # string of joined values with $separator as the separator.
1956 my $found_array = !defined($separator);
88087414
RL
1957
1958 my @values =
1959 map {
1960 if (ref($_) eq "ARRAY") {
1961 $found_array = 1;
1962 @$_;
1963 } else {
1964 $_;
1965 }
1966 } (@_);
1967
1968 if ($found_array) {
1969 [ @values ];
1970 } else {
1971 join($separator, @values);
1972 }
1973}
1974sub add_before {
1975 my $separator = shift;
1976 my @x = @_;
1977 sub { _add($separator, @x, @_) };
1978}
1979sub add {
1980 my $separator = shift;
1981 my @x = @_;
1982 sub { _add($separator, @_, @x) };
1983}
1984
bd5192b1
RL
1985# configuration reader, evaluates the input file as a perl script and expects
1986# it to fill %targets with target configurations. Those are then added to
1987# %table.
1988sub read_config {
1989 my $fname = shift;
1990 open(CONFFILE, "< $fname")
1991 or die "Can't open configuration file '$fname'!\n";
1992 my $x = $/;
1993 undef $/;
1994 my $content = <CONFFILE>;
1995 $/ = $x;
1996 close(CONFFILE);
1997 my %targets = ();
1998 {
1999 local %table = %::table; # Protect %table from tampering
2000
2001 eval $content;
2002 warn $@ if $@;
2003 }
2004
2005 # For each target, check that it's configured with a hash table.
2006 foreach (keys %targets) {
2007 if (ref($targets{$_}) ne "HASH") {
2008 if (ref($targets{$_}) eq "") {
2009 warn "Deprecated target configuration for $_, ignoring...\n";
2010 } else {
2011 warn "Misconfigured target configuration for $_ (should be a hash table), ignoring...\n";
2012 }
2013 delete $targets{$_};
2014 }
2015 }
2016
2017 %table = (%table, %targets);
2018
2019}
2020
2021# configuration resolver. Will only resolve all the lazy evalutation
2022# codeblocks for the chozen target and all those it inherits from,
2023# recursively
2024sub resolve_config {
2025 my $target = shift;
2026 my @breadcrumbs = @_;
2027
2028 if (grep { $_ eq $target } @breadcrumbs) {
2029 die "inherit_from loop! target backtrace:\n "
2030 ,$target,"\n ",join("\n ", @breadcrumbs),"\n";
2031 }
2032
2033 if (!defined($table{$target})) {
2034 warn "Warning! target $target doesn't exist!\n";
2035 return ();
2036 }
2037 # Recurse through all inheritances. They will be resolved on the
2038 # fly, so when this operation is done, they will all just be a
2039 # bunch of attributes with string values.
2040 # What we get here, though, are keys with references to lists of
2041 # the combined values of them all. We will deal with lists after
2042 # this stage is done.
2043 my %combined_inheritance = ();
2044 if ($table{$target}->{inherit_from}) {
2045 my @inherit_from =
2046 map { ref($_) eq "CODE" ? $_->() : $_ } @{$table{$target}->{inherit_from}};
2047 foreach (@inherit_from) {
2048 my %inherited_config = resolve_config($_, $target, @breadcrumbs);
2049
2050 # 'template' is a marker that's considered private to
2051 # the config that had it.
2052 delete $inherited_config{template};
2053
2054 map {
2055 if (!$combined_inheritance{$_}) {
2056 $combined_inheritance{$_} = [];
2057 }
2058 push @{$combined_inheritance{$_}}, $inherited_config{$_};
2059 } keys %inherited_config;
2060 }
2061 }
2062
2063 # We won't need inherit_from in this target any more, since we've
2064 # resolved all the inheritances that lead to this
2065 delete $table{$target}->{inherit_from};
2066
2067 # Now is the time to deal with those lists. Here's the place to
2068 # decide what shall be done with those lists, all based on the
2069 # values of the target we're currently dealing with.
2070 # - If a value is a coderef, it will be executed with the list of
2071 # inherited values as arguments.
2072 # - If the corresponding key doesn't have a value at all or is the
2073 # emoty string, the inherited value list will be run through the
2074 # default combiner (below), and the result becomes this target's
2075 # value.
2076 # - Otherwise, this target's value is assumed to be a string that
2077 # will simply override the inherited list of values.
88087414 2078 my $default_combiner = add(" ");
bd5192b1
RL
2079
2080 my %all_keys =
2081 map { $_ => 1 } (keys %combined_inheritance,
2082 keys %{$table{$target}});
2083 foreach (sort keys %all_keys) {
2084
2085 # Current target doesn't have a value for the current key?
2086 # Assign it the default combiner, the rest of this loop body
2087 # will handle it just like any other coderef.
2088 if (!exists $table{$target}->{$_}) {
2089 $table{$target}->{$_} = $default_combiner;
2090 }
2091
2092 my $valuetype = ref($table{$target}->{$_});
2093 if ($valuetype eq "CODE") {
2094 # CODE reference, execute it with the inherited values as
2095 # arguments.
2096 $table{$target}->{$_} =
2097 $table{$target}->{$_}->(@{$combined_inheritance{$_}});
88087414
RL
2098 } elsif ($valuetype eq "ARRAY" || $valuetype eq "") {
2099 # ARRAY or Scalar, just leave it as is.
bd5192b1
RL
2100 } else {
2101 # Some other type of reference that we don't handle.
2102 # Better to abort at this point.
2103 die "cannot handle reference type $valuetype,"
2104 ," found in target $target -> $_\n";
2105 }
2106 }
2107
2108 # Finally done, return the result.
2109 return %{$table{$target}};
2110}
2111
462ba4f6 2112sub usage
d02b48c6 2113 {
462ba4f6 2114 print STDERR $usage;
10a926c1 2115 print STDERR "\npick os/compiler from:\n";
1641cb60 2116 my $j=0;
6457ad15 2117 my $i;
10a926c1 2118 my $k=0;
6457ad15 2119 foreach $i (sort keys %table)
d02b48c6 2120 {
bd5192b1 2121 next if $table{$i}->{template};
462ba4f6 2122 next if $i =~ /^debug/;
10a926c1
UM
2123 $k += length($i) + 1;
2124 if ($k > 78)
2125 {
2126 print STDERR "\n";
2127 $k=length($i);
2128 }
2129 print STDERR $i . " ";
462ba4f6
UM
2130 }
2131 foreach $i (sort keys %table)
2132 {
bd5192b1 2133 next if $table{$i}->{template};
462ba4f6 2134 next if $i !~ /^debug/;
10a926c1
UM
2135 $k += length($i) + 1;
2136 if ($k > 78)
2137 {
2138 print STDERR "\n";
2139 $k=length($i);
2140 }
2141 print STDERR $i . " ";
d02b48c6 2142 }
10a926c1 2143 print STDERR "\n\nNOTE: If in doubt, on Unix-ish systems use './config'.\n";
462ba4f6 2144 exit(1);
d02b48c6
RE
2145 }
2146
107b5792
RL
2147sub run_dofile()
2148{
107b5792 2149 my $out = shift;
9fe2bb77 2150 my @templates = @_;
107b5792 2151
ced2c2c5
RS
2152 unlink $out || warn "Can't remove $out, $!"
2153 if -f $out;
9fe2bb77
RL
2154 foreach (@templates) {
2155 die "Can't open $_, $!" unless -f $_;
2156 }
2157 my $cmd = "$config{perl} \"-I.\" \"-Mconfigdata\" $dofile -o\"Configure\" \"".join("\" \"",@templates)."\" > \"$out.new\"";
2158 #print STDERR "DEBUG[run_dofile]: \$cmd = $cmd\n";
2159 system($cmd);
107b5792
RL
2160 exit 1 if $? != 0;
2161 rename("$out.new", $out) || die "Can't rename $out.new, $!";
2162}
2163
00ae96ca
RL
2164# Configuration printer ##############################################
2165
2166sub print_table_entry
2167{
2168 my $target = shift;
2169 my %target = resolve_config($target);
2170 my $type = shift;
2171
2172 # Don't print the templates
2173 return if $target{template};
2174
2175 my @sequence = (
f0bd4686 2176 "sys_id",
00ae96ca
RL
2177 "cc",
2178 "cflags",
bcb1977b 2179 "defines",
00ae96ca 2180 "debug_cflags",
bcb1977b 2181 "debug_defines",
00ae96ca 2182 "release_cflags",
bcb1977b 2183 "release_defines",
00ae96ca 2184 "thread_cflag",
f0bd4686
RL
2185 "unistd",
2186 "ld",
00ae96ca 2187 "lflags",
c86ddbe6 2188 "plib_lflags",
1740c162 2189 "ex_libs",
00ae96ca 2190 "debug_lflags",
c86ddbe6 2191 "debug_plib_lflags",
1740c162 2192 "debug_ex_libs",
00ae96ca 2193 "release_lflags",
c86ddbe6 2194 "release_plib_lflags",
1740c162 2195 "release_ex_libs",
00ae96ca
RL
2196 "bn_ops",
2197 "cpuid_obj",
2198 "bn_obj",
2199 "ec_obj",
2200 "des_obj",
2201 "aes_obj",
2202 "bf_obj",
2203 "md5_obj",
2204 "sha1_obj",
2205 "cast_obj",
2206 "rc4_obj",
2207 "rmd160_obj",
2208 "rc5_obj",
2209 "wp_obj",
2210 "cmll_obj",
2211 "modes_obj",
f0bd4686 2212 "padlock_obj",
00ae96ca
RL
2213 "perlasm_scheme",
2214 "dso_scheme",
2215 "shared_target",
2216 "shared_cflag",
2217 "shared_ldflag",
64c443e3 2218 "shared_rcflag",
00ae96ca 2219 "shared_extension",
f0bd4686
RL
2220 "obj_extension",
2221 "exe_extension",
00ae96ca 2222 "ranlib",
f0bd4686 2223 "ar",
00ae96ca
RL
2224 "arflags",
2225 "multilib",
f0bd4686 2226 "build_scheme",
00ae96ca
RL
2227 );
2228
2229 if ($type eq "TABLE") {
2230 print "\n";
2231 print "*** $target\n";
2232 printf "\$%-12s = %s\n", $_, $target{$_} foreach (@sequence);
2233 } elsif ($type eq "HASH") {
2234 my $largest =
2235 length((sort { length($a) <=> length($b) } @sequence)[-1]);
2236 print " '$target' => {\n";
2237 foreach (@sequence) {
2238 if ($target{$_}) {
2239 print " '",$_,"'"," " x ($largest - length($_))," => '",$target{$_},"',\n";
2240 }
2241 }
2242 print " },\n";
2243 }
2244}
2245
2246# Utility routines ###################################################
2247
2e963849
RL
2248# On VMS, if the given file is a logical name, File::Spec::Functions
2249# will consider it an absolute path. There are cases when we want a
2250# purely syntactic check without checking the environment.
2251sub isabsolute {
2252 my $file = shift;
2253
2254 # On non-platforms, we just use file_name_is_absolute().
2255 return file_name_is_absolute($file) unless $^O eq "VMS";
2256
2257 # If the file spec includes a device or a directpry spec,
2258 # file_name_is_absolute() is perfectly safe.
2259 return file_name_is_absolute($file) if $file =~ m|[:\[]|;
2260
2261 # Here, we know the given file spec isn't absolute
2262 return 0;
2263}
2264
ec182ef0
RL
2265# Makes a directory absolute and cleans out /../ in paths like foo/../bar
2266# On some platforms, this uses rel2abs(), while on others, realpath() is used.
2267# realpath() requires that at least all path components except the last is an
2268# existing directory. On VMS, the last component of the directory spec must
2269# exist.
2270sub absolutedir {
2271 my $dir = shift;
2272
2273 # realpath() is quite buggy on VMS. It uses LIB$FID_TO_NAME, which
2274 # will return the volume name for the device, no matter what. Also,
2275 # it will return an incorrect directory spec if the argument is a
2276 # directory that doesn't exist.
2277 if ($^O eq "VMS") {
2278 return rel2abs($dir);
2279 }
2280
2281 # We use realpath() on Unix, since no other will properly clean out
2282 # a directory spec.
2283 use Cwd qw/realpath/;
2284
2285 return realpath($dir);
2286}
2287
99aab161
UM
2288sub which
2289 {
2290 my($name)=@_;
2291 my $path;
2292 foreach $path (split /:/, $ENV{PATH})
2293 {
107b5792 2294 if (-f "$path/$name$target{exe_extension}" and -x _)
99aab161 2295 {
107b5792
RL
2296 return "$path/$name$target{exe_extension}" unless ($name eq "perl" and
2297 system("$path/$name$target{exe_extension} -e " . '\'exit($]<5.0);\''));
99aab161
UM
2298 }
2299 }
2300 }
2301
fe05264e
RL
2302sub quotify {
2303 my %processors = (
2304 perl => sub { my $x = shift;
2305 $x =~ s/([\\\$\@"])/\\$1/g;
2306 return '"'.$x.'"'; },
2307 );
2308 my $for = shift;
2309 my $processor =
2310 defined($processors{$for}) ? $processors{$for} : sub { shift; };
2311
2312 map { $processor->($_); } @_;
2313}
107b5792 2314
9fe2bb77
RL
2315# collect_from_file($filename, $line_concat_cond_re, $line_concat)
2316# $filename is a file name to read from
2317# $line_concat_cond_re is a regexp detecting a line continuation ending
2318# $line_concat is a CODEref that takes care of concatenating two lines
2319sub collect_from_file {
2320 my $filename = shift;
2321 my $line_concat_cond_re = shift;
2322 my $line_concat = shift;
2323
2324 open my $fh, $filename || die "unable to read $filename: $!\n";
2325 return sub {
2326 my $saved_line = "";
2327 $_ = "";
2328 while (<$fh>) {
04f171c0 2329 s|\R$||;
9fe2bb77
RL
2330 if (defined $line_concat) {
2331 $_ = $line_concat->($saved_line, $_);
2332 $saved_line = "";
2333 }
2334 if (defined $line_concat_cond_re && /$line_concat_cond_re/) {
2335 $saved_line = $_;
2336 next;
2337 }
2338 return $_;
2339 }
2340 die "$filename ending with continuation line\n" if $_;
2341 close $fh;
2342 return undef;
2343 }
2344}
2345
2346# collect_from_array($array, $line_concat_cond_re, $line_concat)
2347# $array is an ARRAYref of lines
2348# $line_concat_cond_re is a regexp detecting a line continuation ending
2349# $line_concat is a CODEref that takes care of concatenating two lines
2350sub collect_from_array {
2351 my $array = shift;
2352 my $line_concat_cond_re = shift;
2353 my $line_concat = shift;
2354 my @array = (@$array);
2355
2356 return sub {
2357 my $saved_line = "";
2358 $_ = "";
2359 while (defined($_ = shift @array)) {
04f171c0 2360 s|\R$||;
9fe2bb77
RL
2361 if (defined $line_concat) {
2362 $_ = $line_concat->($saved_line, $_);
2363 $saved_line = "";
2364 }
2365 if (defined $line_concat_cond_re && /$line_concat_cond_re/) {
2366 $saved_line = $_;
2367 next;
2368 }
2369 return $_;
2370 }
2371 die "input text ending with continuation line\n" if $_;
2372 return undef;
2373 }
2374}
2375
2376# collect_information($lineiterator, $line_continue, $regexp => $CODEref, ...)
2377# $lineiterator is a CODEref that delivers one line at a time.
107b5792
RL
2378# All following arguments are regex/CODEref pairs, where the regexp detects a
2379# line and the CODEref does something with the result of the regexp.
2380sub collect_information {
9fe2bb77 2381 my $lineiterator = shift;
107b5792
RL
2382 my %collectors = @_;
2383
9fe2bb77 2384 while(defined($_ = $lineiterator->())) {
04f171c0 2385 s|\R$||;
9fe2bb77
RL
2386 my $found = 0;
2387 foreach my $re (keys %collectors) {
2388 if ($re ne "OTHERWISE" && /$re/) {
2389 $collectors{$re}->($lineiterator);
2390 $found = 1;
2391 };
2392 }
2393 if ($collectors{"OTHERWISE"}) {
2394 $collectors{"OTHERWISE"}->($lineiterator, $_)
2395 unless $found || !defined $collectors{"OTHERWISE"};
2396 }
107b5792 2397 }
107b5792 2398}