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