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