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