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