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