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