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