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