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