]> git.ipfire.org Git - thirdparty/openssl.git/blame - Configure
Test all built-in curves and let the library choose the EC_METHOD
[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
RS
12use File::Basename;
13use File::Spec::Functions;
1641cb60 14
22a4f969 15# see INSTALL for instructions.
462ba4f6 16
7fccf05d 17my $usage="Usage: Configure [no-<cipher> ...] [enable-<cipher> ...] [experimental-<cipher> ...] [-Dxxx] [-lxxx] [-Lxxx] [-fxxx] [-Kxxx] [no-hw-xxx|no-hw] [[no-]threads] [[no-]shared] [[no-]zlib|zlib-dynamic] [no-asm] [no-dso] [no-egd] [sctp] [386] [--prefix=DIR] [--openssldir=OPENSSLDIR] [--with-xxx[=vvv]] [--config=FILE] os/compiler[:flags]\n";
462ba4f6 18
434c5dd3 19# Options:
e5f3045f 20#
f09e7ca9
RS
21# --config add the given configuration file, which will be read after
22# any "Configurations*" files that are found in the same
23# directory as this script.
d74dfafd
RL
24# --prefix prefix for the OpenSSL installation, which includes the
25# directories bin, lib, include, share/man, share/doc/openssl
26# This becomes the value of INSTALLTOP in Makefile
27# (Default: /usr/local)
28# --openssldir OpenSSL data area, such as openssl.cnf, certificates and keys.
29# If it's a relative directory, it will be added on the directory
30# given with --prefix.
31# This becomes the value of OPENSSLDIR in Makefile and in C.
32# (Default: PREFIX/ssl)
e5f3045f
BM
33#
34# --install_prefix Additional prefix for package builders (empty by
35# default). This needn't be set in advance, you can
36# just as well use "make INSTALL_PREFIX=/whatever install".
37#
cbfb39d1
AP
38# --cross-compile-prefix Add specified prefix to binutils components.
39#
98186eb4
VD
40# --api One of 0.9.8, 1.0.0 or 1.1.0. Do not compile support for
41# interfaces deprecated as of the specified OpenSSL version.
42#
5270e702
RL
43# no-hw-xxx do not compile support for specific crypto hardware.
44# Generic OpenSSL-style methods relating to this support
45# are always compiled but return NULL if the hardware
46# support isn't compiled.
47# no-hw do not compile support for any crypto hardware.
5f8d5c96
BM
48# [no-]threads [don't] try to create a library that is suitable for
49# multithreaded applications (default is "threads" if we
50# know how to do it)
fcc6a1c4 51# [no-]shared [don't] try to create shared libraries when supported.
a723979d 52# no-asm do not use assembler
bc2aadad
GT
53# no-dso do not compile in any native shared-library methods. This
54# will ensure that all methods just return NULL.
0423f812 55# no-egd do not compile support for the entropy-gathering daemon APIs
e452de9d
RL
56# [no-]zlib [don't] compile support for zlib compression.
57# zlib-dynamic Like "zlib", but the zlib library is expected to be a shared
58# library and will be loaded in run-time by the OpenSSL library.
7e159e01 59# sctp include SCTP support
22a4f969 60# 386 generate 80386 code
d0590fe6 61# no-sse2 disables IA-32 SSE2 code, above option implies no-sse2
79df9d62 62# no-<cipher> build without specified algorithm (rsa, idea, rc5, ...)
fce0ba5f 63# -<xxx> +<xxx> compiler options are passed through
e41c8d6a
GT
64#
65# DEBUG_SAFESTACK use type-safe stacks to enforce type-safety on stack items
66# provided to stack calls. Generates unique stack functions for
67# each possible stack type.
d02b48c6
RE
68# DES_PTR use pointer lookup vs arrays in the DES in crypto/des/des_locl.h
69# DES_RISC1 use different DES_ENCRYPT macro that helps reduce register
70# dependancies but needs to more registers, good for RISC CPU's
71# DES_RISC2 A different RISC variant.
72# DES_UNROLL unroll the inner DES loop, sometimes helps, somtimes hinders.
73# DES_INT use 'int' instead of 'long' for DES_LONG in crypto/des/des.h
74# This is used on the DEC Alpha where long is 8 bytes
75# and int is 4
76# BN_LLONG use the type 'long long' in crypto/bn/bn.h
58964a49
RE
77# MD2_CHAR use 'char' instead of 'int' for MD2_INT in crypto/md2/md2.h
78# MD2_LONG use 'long' instead of 'int' for MD2_INT in crypto/md2/md2.h
d02b48c6
RE
79# IDEA_SHORT use 'short' instead of 'int' for IDEA_INT in crypto/idea/idea.h
80# IDEA_LONG use 'long' instead of 'int' for IDEA_INT in crypto/idea/idea.h
81# RC2_SHORT use 'short' instead of 'int' for RC2_INT in crypto/rc2/rc2.h
82# RC2_LONG use 'long' instead of 'int' for RC2_INT in crypto/rc2/rc2.h
83# RC4_CHAR use 'char' instead of 'int' for RC4_INT in crypto/rc4/rc4.h
84# RC4_LONG use 'long' instead of 'int' for RC4_INT in crypto/rc4/rc4.h
58964a49 85# RC4_INDEX define RC4_INDEX in crypto/rc4/rc4_locl.h. This turns on
d02b48c6 86# array lookups instead of pointer use.
2dae04d0
AP
87# RC4_CHUNK enables code that handles data aligned at long (natural CPU
88# word) boundary.
89# RC4_CHUNK_LL enables code that handles data aligned at long long boundary
90# (intended for 64-bit CPUs running 32-bit OS).
d02b48c6 91# BF_PTR use 'pointer arithmatic' for Blowfish (unsafe on Alpha).
995e79e3 92# BF_PTR2 intel specific version (generic version is more efficient).
d0590fe6
AP
93#
94# Following are set automatically by this script
95#
58964a49
RE
96# MD5_ASM use some extra md5 assember,
97# SHA1_ASM use some extra sha1 assember, must define L_ENDIAN for x86
98# RMD160_ASM use some extra ripemd160 assember,
d0590fe6
AP
99# SHA256_ASM sha256_block is implemented in assembler
100# SHA512_ASM sha512_block is implemented in assembler
101# AES_ASM ASE_[en|de]crypt is implemented in assembler
d02b48c6 102
363bd0b4 103# Minimum warning options... any contributions to OpenSSL should at least get
fce0ba5f 104# past these.
363bd0b4 105
c2e27310 106my $gcc_devteam_warn = "-Wall -pedantic -DPEDANTIC -Wno-long-long -Wsign-compare -Wmissing-prototypes -Wshadow -Wformat -Wtype-limits -Werror -DREF_CHECK -DDEBUG_UNUSED";
363bd0b4 107
190c8c60
BL
108# These are used in addition to $gcc_devteam_warn when the compiler is clang.
109# TODO(openssl-team): fix problems and investigate if (at least) the
480405e4 110# following warnings can also be enabled:
190c8c60 111# -Wswitch-enum, -Wunused-macros, -Wmissing-field-initializers,
df2ee0e2 112# -Wcast-align,
190c8c60
BL
113# -Wunreachable-code -Wunused-parameter -Wlanguage-extension-token
114# -Wextended-offsetof
df2ee0e2 115my $clang_devteam_warn = "-Wno-unused-parameter -Wno-missing-field-initializers -Wno-language-extension-token -Wno-extended-offsetof -Wconditional-uninitialized -Qunused-arguments -Wincompatible-pointer-types-discards-qualifiers -Wmissing-variable-declarations";
cb2bc054 116
2e31ef03
RS
117# Warn that "make depend" should be run?
118my $warn_make_depend = 0;
119
a1d3f3d1
RL
120# These are used in addition to $gcc_devteam_warn unless this is a mingw build.
121# This adds backtrace information to the memory leak info.
122my $memleak_devteam_backtrace = "-rdynamic -DCRYPTO_MDEBUG_BACKTRACE";
123
124
0c28f277
DSH
125my $strict_warnings = 0;
126
1641cb60 127my $x86_gcc_des="DES_PTR DES_RISC1 DES_UNROLL";
d02b48c6
RE
128
129# MD2_CHAR slags pentium pros
995e79e3 130my $x86_gcc_opts="RC4_INDEX MD2_INT";
d02b48c6 131
b7efa56a 132# As for $BSDthreads. Idea is to maintain "collective" set of flags,
fce0ba5f 133# which would cover all BSD flavors. -pthread applies to them all,
b7efa56a
AP
134# but is treated differently. OpenBSD expands is as -D_POSIX_THREAD
135# -lc_r, which is sufficient. FreeBSD 4.x expands it as -lc_r,
136# which has to be accompanied by explicit -D_THREAD_SAFE and
137# sometimes -D_REENTRANT. FreeBSD 5.x expands it as -lc_r, which
138# seems to be sufficient?
139my $BSDthreads="-pthread -D_THREAD_SAFE -D_REENTRANT";
d02b48c6 140
98186eb4
VD
141#
142# API compability name to version number mapping.
143#
144my $maxapi = "1.1.0"; # API for "no-deprecated" builds
145my $apitable = {
146 "1.1.0" => "0x10100000L",
147 "1.0.0" => "0x10000000L",
148 "0.9.8" => "0x00908000L",
149};
150
9e0724a1
RL
151my $base_target = "BASE"; # The template that all other inherit from
152our %table = ();
291e94df 153our %config = ();
3e83e686 154
bd5192b1 155# Forward declarations ###############################################
7ead0c89 156
bd5192b1
RL
157# read_config(filename)
158#
159# Reads a configuration file and populates %table with the contents
160# (which the configuration file places in %targets).
161sub read_config;
7d46b942 162
bd5192b1
RL
163# resolve_config(target)
164#
165# Resolves all the late evalutations, inheritances and so on for the
166# chosen target and any target it inherits from.
167sub resolve_config;
7d46b942 168
15c7adb0 169
107b5792
RL
170# Information collection #############################################
171
172# Collect version numbers
173$config{version} = "unknown";
174$config{version_num} = "unknown";
175$config{shlib_version_number} = "unknown";
176$config{shlib_version_history} = "unknown";
177
178collect_information(
179 '<include/openssl/opensslv.h',
180 undef,
181 qr/OPENSSL.VERSION.TEXT.*OpenSSL (\S+) / => sub { $config{version} = $1; },
182 qr/OPENSSL.VERSION.NUMBER.*(0x\S+)/ => sub { $config{version_num}=$1 },
183 qr/SHLIB_VERSION_NUMBER *"([^"]+)"/ => sub { $config{shlib_version_number}=$1 },
184 qr/SHLIB_VERSION_HISTORY *"([^"]*)"/ => sub { $config{shlib_version_history}=$1 }
185 );
186if ($config{shlib_version_history} ne "") { $config{shlib_version_history} .= ":"; }
187
188($config{major}, $config{minor})
189 = ($config{version} =~ /^([0-9]+)\.([0-9\.]+)/);
190($config{shlib_major}, $config{shlib_minor})
191 = ($config{shlib_version_number} =~ /^([0-9]+)\.([0-9\.]+)/);
192die "erroneous version information in opensslv.h: ",
193 "$config{major}, $config{minor}, $config{shlib_major}, $config{shlib_minor}\n"
194 if ($config{major} eq "" || $config{minor} eq ""
195 || $config{shlib_major} eq "" || $config{shlib_minor} eq "");
196
197# Collect target configurations
198
f09e7ca9 199my ($vol, $dir, $dummy) = File::Spec->splitpath($0);
97a0cc52
RL
200my $pattern = File::Spec->catpath($vol, $dir, "Configurations/*.conf");
201foreach (sort glob($pattern) ) {
f09e7ca9
RS
202 &read_config($_);
203}
d02b48c6 204
291e94df 205
107b5792
RL
206print "Configuring OpenSSL version $config{version} (0x$config{version_num})\n";
207
291e94df
RL
208$config{perl};
209$config{prefix}="";
210$config{openssldir}="";
7d130f68 211$config{processor}="";
107b5792
RL
212$config{libdir}="";
213$config{install_prefix}= "$ENV{'INSTALL_PREFIX'}";
642a6138 214$config{cross_compile_prefix}="";
107b5792 215$config{fipslibdir}="/usr/local/ssl/fips-2.0/lib/";
1ab2f7f1 216my $nofipscanistercheck=0;
107b5792 217$config{baseaddr}="0xFB00000";
5f8d5c96
BM
218my $no_threads=0;
219my $threads=0;
83365051 220$config{no_shared}=0; # but "no-shared" is default
c9a112f5 221my $zlib=1; # but "no-zlib" is default
47bbaa5b 222my $no_rfc3779=0;
1641cb60 223my $no_asm=0;
bc2aadad 224my $no_dso=0;
42ba5d23 225my $Makefile="Makefile";
0396479d 226my $default_ranlib;
107b5792
RL
227$config{fips}=0;
228
229# Top level directories to build
230$config{dirs} = [ "crypto", "ssl", "engines", "apps", "test", "tools" ];
231# crypto/ subdirectories to build
232$config{sdirs} = [
233 "objects",
234 "md2", "md4", "md5", "sha", "mdc2", "hmac", "ripemd", "whrlpool", "poly1305",
235 "des", "aes", "rc2", "rc4", "rc5", "idea", "bf", "cast", "camellia", "seed", "chacha", "modes",
236 "bn", "ec", "rsa", "dsa", "dh", "dso", "engine",
237 "buffer", "bio", "stack", "lhash", "rand", "err",
238 "evp", "asn1", "pem", "x509", "x509v3", "conf", "txt_db", "pkcs7", "pkcs12", "comp", "ocsp", "ui",
239 "cms", "ts", "jpake", "srp", "store", "cmac", "ct", "async", "kdf"
240 ];
99aab161 241
6b01bed2
VD
242# Known TLS and DTLS protocols
243my @tls = qw(ssl3 tls1 tls1_1 tls1_2);
244my @dtls = qw(dtls1 dtls1_2);
245
8b527be2
RL
246# Explicitelly known options that are possible to disable. They can
247# be regexps, and will be used like this: /^no-${option}$/
248# For developers: keep it sorted alphabetically
249
250my @disablables = (
251 "aes",
252 "asm",
253 "bf",
254 "camellia",
255 "capieng",
256 "cast",
48f14845 257 "chacha",
8b527be2
RL
258 "cmac",
259 "cms",
260 "comp",
3e45d393 261 "crypto-mdebug",
8b527be2
RL
262 "ct",
263 "deprecated",
264 "des",
265 "dgram",
266 "dh",
267 "dsa",
268 "dso",
a5ecdc6a 269 "dtls",
8b527be2
RL
270 "dynamic[-_]engine",
271 "ec",
272 "ec2m",
6b01bed2
VD
273 "ecdh",
274 "ecdsa",
8b527be2
RL
275 "ec_nistp_64_gcc_128",
276 "engine",
277 "err", # Really???
8b527be2
RL
278 "heartbeats",
279 "hmac",
280 "hw(-.+)?",
281 "idea",
282 "jpake",
283 "locking", # Really???
284 "md2",
285 "md4",
286 "md5",
287 "mdc2",
288 "md[-_]ghost94",
289 "nextprotoneg",
290 "ocb",
291 "ocsp",
48f14845 292 "poly1305",
8b527be2
RL
293 "posix-io",
294 "psk",
295 "rc2",
296 "rc4",
297 "rc5",
298 "rdrand",
299 "rfc3779",
300 "rijndael", # Old AES name
301 "rmd160",
302 "rsa",
303 "scrypt",
304 "sct",
305 "sctp",
306 "seed",
307 "sha",
308 "shared",
309 "sock",
310 "srp",
311 "srtp",
312 "sse2",
313 "ssl",
8b527be2
RL
314 "ssl-trace",
315 "static-engine",
316 "stdio",
317 "store",
318 "threads",
319 "tls",
8b527be2
RL
320 "unit-test",
321 "whirlpool",
322 "zlib",
323 "zlib-dynamic",
324 );
6b01bed2
VD
325foreach my $proto ((@tls, @dtls))
326 {
327 push(@disablables, $proto);
328 push(@disablables, "$proto-method");
329 }
8b527be2 330
c9a112f5
BM
331# All of the following is disabled by default (RC5 was enabled before 0.9.8):
332
7a762197 333my %disabled = ( # "what" => "comment" [or special keyword "experimental"]
7d8bb912 334 "ec_nistp_64_gcc_128" => "default",
0423f812 335 "egd" => "default",
7d8bb912
BM
336 "jpake" => "experimental",
337 "md2" => "default",
338 "rc5" => "default",
c2e27310 339 "sctp" => "default",
7d8bb912 340 "shared" => "default",
93ab9e42 341 "ssl-trace" => "default",
ae3b4f23 342 "store" => "experimental",
e0fc7961 343 "unit-test" => "default",
7d8bb912 344 "zlib" => "default",
c2e27310
VD
345 "zlib-dynamic" => "default",
346 "crypto-mdebug" => "default",
7d8bb912 347 );
7a762197 348my @experimental = ();
c9a112f5 349
c569e206
RL
350# Note: => pair form used for aesthetics, not to truly make a hash table
351my @disable_cascades = (
352 # "what" => [ "cascade", ... ]
7d130f68 353 sub { $config{processor} eq "386" }
c569e206
RL
354 => [ "sse2" ],
355 "ssl" => [ "ssl3" ],
356 "ssl3-method" => [ "ssl3" ],
357 "zlib" => [ "zlib-dynamic" ],
358 "rijndael" => [ "aes" ],
359 "des" => [ "mdc2" ],
9e4d6fbf 360 "ec" => [ "ecdsa", "ecdh" ],
b427401c 361 "psk" => [ "jpake" ],
c569e206
RL
362
363 "dgram" => [ "dtls" ],
364 "dtls" => [ @dtls ],
365
366 # SSL 3.0, (D)TLS 1.0 and TLS 1.1 require MD5 and SHA
367 "md5" => [ "ssl", "tls1", "tls1_1", "dtls1" ],
368 "sha" => [ "ssl", "tls1", "tls1_1", "dtls1" ],
369
370 # Additionally, SSL 3.0 requires either RSA or DSA+DH
371 sub { $disabled{rsa}
372 && ($disabled{dsa} || $disabled{dh}); }
373 => [ "ssl" ],
374
375 # (D)TLS 1.0 and TLS 1.1 also require either RSA or DSA+DH
376 # or ECDSA + ECDH. (D)TLS 1.2 has this requirement as well.
377 # (XXX: We don't support PSK-only builds).
378 sub { $disabled{rsa}
379 && ($disabled{dsa} || $disabled{dh})
380 && ($disabled{ecdsa} || $disabled{ecdh}); }
381 => [ "tls1", "tls1_1", "tls1_2",
382 "dtls1", "dtls1_2" ],
383
384 "tls" => [ @tls ],
385
386 # SRP and HEARTBEATS require TLSEXT
387 "tlsext" => [ "srp", "heartbeats" ],
388 );
389
390# Avoid protocol support holes. Also disable all versions below N, if version
391# N is disabled while N+1 is enabled.
392#
393my @list = (reverse @tls);
394while ((my $first, my $second) = (shift @list, shift @list)) {
395 last unless @list;
396 push @disable_cascades, ( sub { !$disabled{$first} && $disabled{$second} }
397 => [ @list ] );
398 unshift @list, $second;
399}
400my @list = (reverse @dtls);
401while ((my $first, my $second) = (shift @list, shift @list)) {
402 last unless @list;
403 push @disable_cascades, ( sub { !$disabled{$first} && $disabled{$second} }
404 => [ @list ] );
405 unshift @list, $second;
406}
407
107b5792 408# Construct the string of what $config{depflags} should look like with the defaults
c569e206
RL
409# from %disabled above. (we need this to see if we should advise the user
410# to run "make depend"):
107b5792 411my $default_depflags = join(" ",
c569e206
RL
412 map { my $x = $_; $x =~ tr{[a-z]-}{[A-Z]_}; "-DOPENSSL_NO_$x"; }
413 grep { $disabled{$_} !~ /\(no-depflags\)$/ }
414 sort keys %disabled);
7a762197
BM
415
416# Explicit "no-..." options will be collected in %disabled along with the defaults.
417# To remove something from %disabled, use "enable-foo" (unless it's experimental).
418# For symmetry, "disable-foo" is a synonym for "no-foo".
419
420# For features called "experimental" here, a more explicit "experimental-foo" is needed to enable.
421# We will collect such requests in @experimental.
422# To avoid accidental use of experimental features, applications will have to use -DOPENSSL_EXPERIMENTAL_FOO.
ab185b60
BM
423
424
d0590fe6 425my $no_sse2=0;
b6e4dac2 426
462ba4f6 427&usage if ($#ARGV < 0);
d02b48c6 428
fe05264e 429my $flags="";
107b5792 430$config{depflags}="";
7d130f68
RL
431$config{openssl_experimental_defines}=[];
432$config{openssl_api_defines}=[];
433$config{openssl_algorithm_defines}=[];
434$config{openssl_thread_defines}=[];
435$config{openssl_sys_defines}=[];
436$config{openssl_other_defines}=[];
fe05264e
RL
437my $libs="";
438my $target="";
3fa04f0d 439$config{options}="";
451dc18f 440my $make_depend=0;
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>) {
474 chomp;
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 = ();
497foreach (@argvcopy)
16b6081e 498 {
fe05264e 499 s /^-no-/no-/; # some people just can't read the instructions
c9a112f5 500
fe05264e
RL
501 # rewrite some options in "enable-..." form
502 s /^-?-?shared$/enable-shared/;
503 s /^sctp$/enable-sctp/;
504 s /^threads$/enable-threads/;
505 s /^zlib$/enable-zlib/;
506 s /^zlib-dynamic$/enable-zlib-dynamic/;
c9a112f5 507
fe05264e
RL
508 if (/^(no|disable|enable|experimental)-(.+)$/)
509 {
510 my $word = $2;
511 if (!grep { $word =~ /^${_}$/ } @disablables)
8b527be2 512 {
fe05264e
RL
513 $unsupported_options{$_} = 1;
514 next;
8b527be2 515 }
fe05264e
RL
516 }
517 if (/^no-(.+)$/ || /^disable-(.+)$/)
518 {
519 if (!($disabled{$1} eq "experimental"))
d02b48c6 520 {
fe05264e 521 foreach my $proto ((@tls, @dtls))
e172d60d 522 {
fe05264e 523 if ($1 eq "$proto-method")
3881d810 524 {
fe05264e
RL
525 $disabled{"$proto"} = "option($proto-method)";
526 last;
3881d810 527 }
fe05264e
RL
528 }
529 if ($1 eq "dtls")
530 {
531 foreach my $proto (@dtls)
6b01bed2 532 {
fe05264e 533 $disabled{$proto} = "option(dtls)";
6b01bed2 534 }
fe05264e
RL
535 }
536 elsif ($1 eq "ssl")
537 {
538 # Last one of its kind
539 $disabled{"ssl3"} = "option(ssl)";
540 }
541 elsif ($1 eq "tls")
542 {
543 # XXX: Tests will fail if all SSL/TLS
544 # protocols are disabled.
545 foreach my $proto (@tls)
7a762197 546 {
fe05264e 547 $disabled{$proto} = "option(tls)";
7a762197 548 }
fce0ba5f 549 }
fe05264e 550 else
b6e4dac2 551 {
fe05264e 552 $disabled{$1} = "option";
b6e4dac2 553 }
fe05264e
RL
554 }
555 }
556 elsif (/^enable-(.+)$/ || /^experimental-(.+)$/)
557 {
558 my $algo = $1;
559 if ($disabled{$algo} eq "experimental")
560 {
561 die "You are requesting an experimental feature; please say 'experimental-$algo' if you are sure\n"
562 unless (/^experimental-/);
563 push @experimental, $algo;
564 }
565 delete $disabled{$algo};
c9a112f5 566
fe05264e
RL
567 $threads = 1 if ($algo eq "threads");
568 }
569 elsif (/^--strict-warnings$/)
570 {
571 $strict_warnings = 1;
572 }
573 elsif (/^--debug$/)
574 {
575 $build_prefix = "debug_";
576 }
577 elsif (/^--release$/)
578 {
579 $build_prefix = "release_";
580 }
581 elsif (/^386$/)
7d130f68 582 { $config{processor}=386; }
fe05264e
RL
583 elsif (/^fips$/)
584 {
107b5792 585 $config{fips}=1;
fe05264e
RL
586 }
587 elsif (/^rsaref$/)
588 {
589 # No RSAref support any more since it's not needed.
590 # The check for the option is there so scripts aren't
591 # broken
592 }
593 elsif (/^nofipscanistercheck$/)
594 {
107b5792 595 $config{fips} = 1;
fe05264e
RL
596 $nofipscanistercheck = 1;
597 }
598 elsif (/^[-+]/)
599 {
600 if (/^--prefix=(.*)$/)
601 {
291e94df 602 $config{prefix}=$1;
c9a112f5 603 }
fe05264e 604 elsif (/^--api=(.*)$/)
0c28f277 605 {
107b5792 606 $config{api}=$1;
0c28f277 607 }
fe05264e 608 elsif (/^--libdir=(.*)$/)
9e43c6b5 609 {
107b5792 610 $config{libdir}=$1;
9e43c6b5 611 }
fe05264e 612 elsif (/^--openssldir=(.*)$/)
9e43c6b5 613 {
291e94df 614 $config{openssldir}=$1;
9e43c6b5 615 }
fe05264e 616 elsif (/^--install.prefix=(.*)$/)
d02b48c6 617 {
107b5792 618 $config{install_prefix}=$1;
d02b48c6 619 }
fe05264e 620 elsif (/^--with-zlib-lib=(.*)$/)
9fdb2cc5 621 {
fe05264e 622 $withargs{"zlib-lib"}=$1;
7d8bb912 623 }
fe05264e 624 elsif (/^--with-zlib-include=(.*)$/)
3eb0ed6d 625 {
fe05264e 626 $withargs{"zlib-include"}="-I$1";
462ba4f6 627 }
fe05264e 628 elsif (/^--with-fipslibdir=(.*)$/)
1ab2f7f1 629 {
107b5792 630 $config{fipslibdir}="$1/";
1ab2f7f1 631 }
fe05264e 632 elsif (/^--with-baseaddr=(.*)$/)
462ba4f6 633 {
107b5792 634 $config{baseaddr}="$1";
3eb0ed6d 635 }
fe05264e 636 elsif (/^--cross-compile-prefix=(.*)$/)
e5f3045f 637 {
642a6138 638 $config{cross_compile_prefix}=$1;
e5f3045f 639 }
fe05264e 640 elsif (/^--config=(.*)$/)
d02b48c6 641 {
fe05264e 642 read_config $1;
c59cb511 643 }
fe05264e 644 elsif (/^-[lL](.*)$/ or /^-Wl,/)
c9a112f5 645 {
fe05264e 646 $libs.=$_." ";
d02b48c6 647 }
fe05264e
RL
648 else # common if (/^[-+]/), just pass down...
649 {
650 $_ =~ s/%([0-9a-f]{1,2})/chr(hex($1))/gei;
651 $flags.=$_." ";
652 }
653 }
654 elsif ($_ =~ /^([^:]+):(.+)$/)
655 {
656 eval "\$table{\$1} = \"$2\""; # allow $xxx constructs in the string
657 $target=$1;
658 }
659 else
660 {
661 die "target already defined - $target (offending arg: $_)\n" if ($target ne "");
662 $target=$_;
663 }
664 unless ($_ eq $target || /^no-/ || /^disable-/)
665 {
666 # "no-..." follows later after implied disactivations
667 # have been derived. (Don't take this too seroiusly,
668 # we really only write OPTIONS to the Makefile out of
669 # nostalgia.)
670
3fa04f0d
RL
671 if ($config{options} eq "")
672 { $config{options} = $_; }
fe05264e 673 else
3fa04f0d 674 { $config{options} .= " ".$_; }
fbabb752 675 }
489eb740 676
107b5792
RL
677 if (defined($config{api}) && !exists $apitable->{$config{api}}) {
678 die "***** Unsupported api compatibility level: $config{api}\n",
98186eb4
VD
679 }
680
489eb740
RL
681 if (keys %unsupported_options)
682 {
683 die "***** Unsupported options: ",
684 join(", ", keys %unsupported_options), "\n";
685 }
fbabb752 686 }
b6e4dac2 687
107b5792 688if ($config{fips})
a7a14a23 689 {
c569e206 690 delete $disabled{"shared"} if ($disabled{"shared"} =~ /^default/);
6b01bed2 691 }
107b5792
RL
692else
693 {
694 @{$config{dirs}} = grep !/^fips$/, @{$config{dirs}};
695 }
c9a112f5 696
c569e206
RL
697my @tocheckfor = (keys %disabled);
698while (@tocheckfor) {
699 my %new_tocheckfor = ();
700 my @cascade_copy = (@disable_cascades);
701 while (@cascade_copy) {
702 my ($test, $descendents) = (shift @cascade_copy, shift @cascade_copy);
703 if (ref($test) eq "CODE" ? $test->() : defined($disabled{$test})) {
704 map {
705 $new_tocheckfor{$_} => 1; $disabled{$_} = "forced";
706 } grep { !defined($disabled{$_}) } @$descendents;
ef236ec3 707 }
c569e206
RL
708 }
709 @tocheckfor = (keys %new_tocheckfor);
710}
edc032b5 711
436a376b 712if ($target eq "TABLE") {
00ae96ca
RL
713 foreach (sort keys %table) {
714 print_table_entry($_, "TABLE");
715 }
716 exit 0;
436a376b
BM
717}
718
10a926c1 719if ($target eq "LIST") {
00ae96ca
RL
720 foreach (sort keys %table) {
721 print $_,"\n" unless $table{$_}->{template};
722 }
723 exit 0;
10a926c1
UM
724}
725
aaf878cc 726if ($target eq "HASH") {
00ae96ca
RL
727 print "%table = (\n";
728 foreach (sort keys %table) {
729 print_table_entry($_, "HASH");
730 }
731 exit 0;
aaf878cc
RL
732}
733
00ae96ca 734# Backward compatibility?
49e04548 735if ($target =~ m/^CygWin32(-.*)$/) {
00ae96ca 736 $target = "Cygwin".$1;
49e04548
RL
737}
738
c9a112f5
BM
739foreach (sort (keys %disabled))
740 {
3fa04f0d 741 $config{options} .= " no-$_";
c9a112f5
BM
742
743 printf " no-%-12s %-10s", $_, "[$disabled{$_}]";
744
745 if (/^dso$/)
746 { $no_dso = 1; }
747 elsif (/^threads$/)
748 { $no_threads = 1; }
749 elsif (/^shared$/)
83365051 750 { $config{no_shared} = 1; }
c9a112f5
BM
751 elsif (/^zlib$/)
752 { $zlib = 0; }
fbf002bb
DSH
753 elsif (/^static-engine$/)
754 { }
c9a112f5
BM
755 elsif (/^zlib-dynamic$/)
756 { }
c9a112f5
BM
757 elsif (/^sse2$/)
758 { $no_sse2 = 1; }
107b5792
RL
759 elsif (/^engine$/)
760 { @{$config{dirs}} = grep !/^engine$/, @{$config{dirs}}; }
c9a112f5
BM
761 else
762 {
763 my ($ALGO, $algo);
30fafdeb 764 ($ALGO = $algo = $_) =~ tr/[\-a-z]/[_A-Z]/;
c9a112f5
BM
765
766 if (/^asm$/ || /^err$/ || /^hw$/ || /^hw-/)
767 {
7d130f68 768 push @{$config{openssl_other_defines}}, "OPENSSL_NO_$ALGO";
c9a112f5 769 print " OPENSSL_NO_$ALGO";
fce0ba5f 770
5df70a9e
AP
771 if (/^err$/) { $flags .= "-DOPENSSL_NO_ERR "; }
772 elsif (/^asm$/) { $no_asm = 1; }
c9a112f5
BM
773 }
774 else
775 {
2a4af947
AP
776 ($ALGO,$algo) = ("RMD160","rmd160") if ($algo eq "ripemd");
777
7d130f68 778 push @{$config{openssl_algorithm_defines}}, "OPENSSL_NO_$ALGO";
107b5792 779 $config{depflags} .= " -DOPENSSL_NO_$ALGO";
c9a112f5
BM
780 print " OPENSSL_NO_$ALGO";
781
e36827f6 782 # fix-up crypto/directory name(s)
107b5792
RL
783 $algo="whrlpool" if $algo eq "whirlpool";
784 $algo="ripemd" if $algo eq "rmd160";
785 @{$config{sdirs}} = grep { $_ ne $algo} @{$config{sdirs}};
2a4af947 786
e36827f6 787 print " (skip dir)";
c9a112f5
BM
788 }
789 }
790
791 print "\n";
792 }
793
7a762197 794my $exp_cflags = "";
ccc5784e 795
7a762197
BM
796foreach (sort @experimental)
797 {
798 my $ALGO;
799 ($ALGO = $_) =~ tr/[a-z]/[A-Z]/;
800
801 # opensslconf.h will set OPENSSL_NO_... unless OPENSSL_EXPERIMENTAL_... is defined
7d130f68 802 push @{$config{openssl_experimental_defines}}, "OPENSSL_NO_$ALGO";
7a762197
BM
803 $exp_cflags .= " -DOPENSSL_EXPERIMENTAL_$ALGO";
804 }
c9a112f5 805
9e0724a1
RL
806print "Configuring for $target\n";
807
808# Support for legacy targets having a name starting with 'debug-'
809my ($d, $t) = $target =~ m/^(debug-)?(.*)$/;
810if ($d) {
811 $build_prefix = "debug_";
812
813 # If we do not find debug-foo in the table, the target is set to foo.
814 if (!$table{$target}) {
815 $target = $t;
816 }
817}
291e94df 818$config{target} = $target;
9e0724a1
RL
819delete $table{$base_target}->{template}; # or the next test will fail.
820my %target = ( %{$table{$base_target}}, resolve_config($target) );
821
822&usage if (!%target || $target{template});
823
107b5792
RL
824$target{exe_extension}="";
825$target{exe_extension}=".exe" if ($config{target} eq "Cygwin" || $config{target} eq "DJGPP" || $config{target} =~ /^mingw/);
826$target{exe_extension}=".nlm" if ($config{target} =~ /netware/);
827$target{exe_extension}=".pm" if ($config{target} =~ /vos/);
462ba4f6 828
291e94df
RL
829$default_ranlib = which("ranlib") || "true";
830$config{perl} = $ENV{'PERL'} || which("perl5") || which("perl") || "perl";
831my $make = $ENV{'MAKE'} || "make";
28a80034 832
642a6138
RL
833$config{cross_compile_prefix} = $ENV{'CROSS_COMPILE'}
834 if $config{cross_compile_prefix} eq "";
f99f41cf 835
291e94df
RL
836$config{prefix} = "/usr/local" if !$config{prefix};
837$config{openssldir} = "ssl" if !$config{openssldir};
838$config{openssldir} = catdir($config{prefix}, $config{openssldir})
839 unless file_name_is_absolute($config{openssldir});
d02b48c6 840
7f625320 841# Allow environment CC to override compiler...
291e94df 842$target{cc} = $ENV{CC} || $target{cc};
aaf878cc 843
b1245529 844# For cflags and lflags, add the debug_ or release_ attributes
aaf878cc 845# Do it in such a way that no spurious space is appended (hence the grep).
107b5792
RL
846$config{cflags} = join(" ",
847 grep { $_ ne "" } ($target{cflags},
848 $target{$build_prefix."cflags"}));
849$config{lflags} = join(" ",
850 grep { $_ ne "" } ($target{lflags},
851 $target{$build_prefix."lflags"}));
bd5192b1 852
291e94df
RL
853$target{ranlib} = $ENV{'RANLIB'} || $target{ranlib} || $default_ranlib;
854$target{ar} = $ENV{'AR'} || "ar";
107b5792
RL
855$target{arflags} = "" if !defined($target{arflags});
856$target{nm} = "nm";
291e94df
RL
857# Make sure build_scheme is consistent.
858$target{build_scheme} = [ $target{build_scheme} ]
859 if ref($target{build_scheme}) ne "ARRAY";
860
861# if $config{prefix}/lib$target{multilib} is not an existing directory, then
b730b03f 862# assume that it's not searched by linker automatically, in
291e94df 863# which case adding $target{multilib} suffix causes more grief than
b730b03f 864# we're ready to tolerate, so don't...
291e94df 865$target{multilib}="" if !-d "$config{prefix}/lib$target{multilib}";
b730b03f 866
107b5792
RL
867$config{libdir}="lib$target{multilib}" if $config{libdir} eq "";
868$config{enginesdir}=$config{prefix} . "/" . $config{libdir} . "/engines";
6a9d28f9 869
107b5792 870$config{cflags} .= "$exp_cflags";
7a762197 871
107b5792
RL
872# '%' in $config{lflags} is used to split flags to "pre-" and post-flags
873my ($pre,$post)=split('%',$config{lflags});
874if (defined($post)) { $config{prelflags}=$pre; $config{lflags}=$post; }
875else { $config{prelflags}=""; $config{lflags}=$pre; }
d6c76457 876
107b5792 877if ($target =~ /^mingw/ && `$target{cc} --target-help 2>&1` !~ m/-mno-cygwin/m)
cbecd29a 878 {
107b5792
RL
879 $config{cflags} =~ s/-mno-cygwin\s*//;
880 $target{shared_ldflag} =~ s/-mno-cygwin\s*//;
cbecd29a
AP
881 }
882
107b5792 883if ($target =~ /linux.*-mips/ && !$no_asm && $flags !~ /-m(ips|arch=)/) {
63d8834c 884 # minimally required architecture flags for assembly modules
107b5792
RL
885 $config{cflags}="-mips2 $config{cflags}" if ($target =~ /mips32/);
886 $config{cflags}="-mips3 $config{cflags}" if ($target =~ /mips64/);
63d8834c
AP
887}
888
2964ba8c 889my $no_shared_warn=0;
14bcdb08 890my $no_user_cflags=0;
2964ba8c 891
107b5792 892if ($flags ne "") { $config{cflags}="$flags$config{cflags}"; }
14bcdb08 893else { $no_user_cflags=1; }
5f8d5c96 894
bc2aadad
GT
895# The DSO code currently always implements all functions so that no
896# applications will have to worry about that from a compilation point
897# of view. However, the "method"s may return zero unless that platform
898# has support compiled in for them. Currently each method is enabled
899# by a define "DSO_<name>" ... we translate the "dso_scheme" config
900# string entry into using the following logic;
eca57e92 901my $dso_cflags;
291e94df 902if (!$no_dso && $target{dso_scheme} ne "")
bc2aadad 903 {
291e94df
RL
904 $target{dso_scheme} =~ tr/[a-z]/[A-Z]/;
905 if ($target{dso_scheme} eq "DLFCN")
bc2aadad 906 {
eca57e92 907 $dso_cflags = "-DDSO_DLFCN -DHAVE_DLFCN_H";
bc2aadad 908 }
291e94df 909 elsif ($target{dso_scheme} eq "DLFCN_NO_H")
bc2aadad 910 {
eca57e92 911 $dso_cflags = "-DDSO_DLFCN";
bc2aadad
GT
912 }
913 else
914 {
291e94df 915 $dso_cflags = "-DDSO_$target{dso_scheme}";
bc2aadad 916 }
107b5792 917 $config{cflags} = "$dso_cflags $config{cflags}";
bc2aadad 918 }
9ec0126e 919
5f8d5c96 920my $thread_cflags;
7d130f68 921my @thread_defines;
291e94df 922if ($target{thread_cflag} ne "(unknown)" && !$no_threads)
5f8d5c96
BM
923 {
924 # If we know how to do it, support threads by default.
925 $threads = 1;
926 }
291e94df 927if ($target{thread_cflag} eq "(unknown)" && $threads)
5f8d5c96 928 {
14bcdb08
AP
929 # If the user asked for "threads", [s]he is also expected to
930 # provide any system-dependent compiler options that are
931 # necessary.
932 if ($no_user_cflags)
933 {
934 print "You asked for multi-threading support, but didn't\n";
935 print "provide any system-specific compiler options\n";
936 exit(1);
937 }
107b5792 938 $thread_cflags="-DOPENSSL_THREADS $config{cflags}" ;
7d130f68 939 push @thread_defines, "OPENSSL_THREADS";
5f8d5c96
BM
940 }
941else
942 {
107b5792 943 $thread_cflags="-DOPENSSL_THREADS $target{thread_cflag} $config{cflags}";
7d130f68 944 push @thread_defines, "OPENSSL_THREADS";
a7b991bd 945# my $def;
291e94df 946# foreach $def (split ' ',$target{thread_cflag})
a7b991bd
BM
947# {
948# if ($def =~ s/^-D// && $def !~ /^_/)
949# {
7d130f68 950# push @thread_defines, "$def";
a7b991bd
BM
951# }
952# }
fce0ba5f 953 }
5f8d5c96 954
107b5792 955$config{lflags}="$libs$config{lflags}" if ($libs ne "");
d02b48c6 956
dfeab068
RE
957if ($no_asm)
958 {
107b5792
RL
959 $config{cflags}=~s/-D[BL]_ENDIAN// if ($config{fips});
960 $thread_cflags=~s/-D[BL]_ENDIAN// if ($config{fips});
dfeab068 961 }
6f7ac8e1 962
5f8d5c96
BM
963if ($threads)
964 {
107b5792 965 $config{cflags}=$thread_cflags;
7d130f68 966 push @{$config{openssl_thread_defines}}, @thread_defines;
e452de9d
RL
967 }
968
969if ($zlib)
970 {
107b5792 971 $config{cflags} = "-DZLIB $config{cflags}";
c9a112f5
BM
972 if (defined($disabled{"zlib-dynamic"}))
973 {
cc7399e7
DSH
974 if (defined($withargs{"zlib-lib"}))
975 {
107b5792 976 $config{lflags} .= " -L" . $withargs{"zlib-lib"} . " -lz";
cc7399e7
DSH
977 }
978 else
979 {
107b5792 980 $config{lflags} .= " -lz";
cc7399e7 981 }
c9a112f5
BM
982 }
983 else
984 {
107b5792 985 $config{cflags} = "-DZLIB_SHARED $config{cflags}";
c9a112f5 986 }
5f8d5c96
BM
987 }
988
98186eb4
VD
989# With "deprecated" disable all deprecated features.
990if (defined($disabled{"deprecated"})) {
107b5792 991 $config{api} = $maxapi;
98186eb4 992}
07c4c14c 993
291e94df 994if ($target{shared_target} eq "")
6f7ac8e1 995 {
107b5792 996 $no_shared_warn = 1 if !$config{no_shared} && !$config{fips};
83365051 997 $config{no_shared} = 1;
6f7ac8e1 998 }
83365051 999if (!$config{no_shared})
b436a982 1000 {
291e94df 1001 if ($target{shared_cflag} ne "")
a22fb399 1002 {
107b5792 1003 $config{cflags} = "$target{shared_cflag} -DOPENSSL_PIC $config{cflags}";
a22fb399 1004 }
d2dcf4f4 1005 }
b436a982 1006
291e94df 1007if ($target{build_scheme}->[0] ne "mk1mf")
ecd45314 1008 {
4c1a6e00 1009 # add {no-}static-engine to options to allow mkdef.pl to work without extra arguments
83365051 1010 if ($config{no_shared})
fbf002bb 1011 {
7d130f68 1012 push @{$config{openssl_other_defines}}, "OPENSSL_NO_DYNAMIC_ENGINE";
3fa04f0d 1013 $config{options}.=" static-engine";
fbf002bb
DSH
1014 }
1015 else
1016 {
7d130f68 1017 push @{$config{openssl_other_defines}}, "OPENSSL_NO_STATIC_ENGINE";
3fa04f0d 1018 $config{options}.=" no-static-engine";
fbf002bb 1019 }
6cb68620 1020 }
ecd45314 1021
c313e32a
AP
1022#
1023# Platform fix-ups
1024#
107b5792 1025if ($target =~ /-icc$/) # Intel C compiler
1a979201 1026 {
1187ee7d 1027 my $iccver=0;
291e94df 1028 if (open(FD,"$target{cc} -V 2>&1 |"))
1187ee7d
AP
1029 {
1030 while(<FD>) { $iccver=$1 if (/Version ([0-9]+)\./); }
1031 close(FD);
1032 }
1a979201
AP
1033 if ($iccver>=8)
1034 {
107b5792 1035 $config{cflags}=~s/-KPIC/-fPIC/;
1a979201
AP
1036 # Eliminate unnecessary dependency from libirc.a. This is
1037 # essential for shared library support, as otherwise
1038 # apps/openssl can end up in endless loop upon startup...
107b5792 1039 $config{cflags}.=" -Dmemcpy=__builtin_memcpy -Dmemset=__builtin_memset";
1a979201 1040 }
1187ee7d
AP
1041 if ($iccver>=9)
1042 {
107b5792
RL
1043 $config{lflags}.=" -i-static";
1044 $config{lflags}=~s/-no_cpprt/-no-cpprt/;
1187ee7d
AP
1045 }
1046 if ($iccver>=10)
1047 {
107b5792 1048 $config{lflags}=~s/-i-static/-static-intel/;
cf5ecc3e
AP
1049 }
1050 if ($iccver>=11)
1051 {
107b5792
RL
1052 $config{cflags}.=" -no-intel-extensions"; # disable Cilk
1053 $config{lflags}=~s/-no-cpprt/-no-cxxlib/;
1187ee7d 1054 }
1a979201
AP
1055 }
1056
c313e32a
AP
1057# Unlike other OSes (like Solaris, Linux, Tru64, IRIX) BSD run-time
1058# linkers (tested OpenBSD, NetBSD and FreeBSD) "demand" RPATH set on
1059# .so objects. Apparently application RPATH is not global and does
1060# not apply to .so linked with other .so. Problem manifests itself
1061# when libssl.so fails to load libcrypto.so. One can argue that we
1062# should engrave this into Makefile.shared rules or into BSD-* config
1063# lines above. Meanwhile let's try to be cautious and pass -rpath to
1064# linker only when --prefix is not /usr.
107b5792 1065if ($target =~ /^BSD-/)
c313e32a 1066 {
291e94df 1067 $target{shared_ldflag}.=" -Wl,-rpath,\$\$(LIBRPATH)" if ($config{prefix} !~ m|^/usr[/]*$|);
c313e32a
AP
1068 }
1069
291e94df 1070if ($target{sys_id} ne "")
cf1b7d96 1071 {
107b5792 1072 #$config{cflags}="-DOPENSSL_SYS_$target{sys_id} $config{cflags}";
642a6138 1073 push @{$config{openssl_sys_defines}}, "OPENSSL_SYS_$target{sys_id}";
cf1b7d96
RL
1074 }
1075
291e94df 1076if ($target{ranlib} eq "")
0396479d 1077 {
291e94df 1078 $target{ranlib} = $default_ranlib;
0396479d
BM
1079 }
1080
9e0724a1 1081if (!$no_asm) {
7d130f68 1082 $target{cpuid_obj}=$table{BASE}->{cpuid_obj} if ($config{processor} eq "386");
107b5792 1083 $target{cpuid_obj}.=" uplink.o uplink-x86.o" if ($config{cflags} =~ /-DOPENSSL_USE_APPLINK/);
1750ebcb 1084
291e94df 1085 $target{bn_obj} =~ s/\w+-gf2m.o// if (defined($disabled{ec2m}));
f8c469de 1086
9e0724a1 1087 # bn-586 is the only one implementing bn_*_part_words
107b5792
RL
1088 $config{cflags}.=" -DOPENSSL_BN_ASM_PART_WORDS" if ($target{bn_obj} =~ /bn-586/);
1089 $config{cflags}.=" -DOPENSSL_IA32_SSE2" if (!$no_sse2 && $target{bn_obj} =~ /86/);
dfeab068 1090
107b5792
RL
1091 $config{cflags}.=" -DOPENSSL_BN_ASM_MONT" if ($target{bn_obj} =~ /-mont/);
1092 $config{cflags}.=" -DOPENSSL_BN_ASM_MONT5" if ($target{bn_obj} =~ /-mont5/);
1093 $config{cflags}.=" -DOPENSSL_BN_ASM_GF2m" if ($target{bn_obj} =~ /-gf2m/);
5ac7bde7 1094
107b5792 1095 if ($config{fips}) {
7d130f68 1096 push @{$config{openssl_other_defines}}, "OPENSSL_FIPS";
9e0724a1 1097 }
1ab2f7f1 1098
291e94df 1099 if ($target{sha1_obj} =~ /\.o$/) {
107b5792
RL
1100 $config{cflags}.=" -DSHA1_ASM" if ($target{sha1_obj} =~ /sx86/ || $target{sha1_obj} =~ /sha1/);
1101 $config{cflags}.=" -DSHA256_ASM" if ($target{sha1_obj} =~ /sha256/);
1102 $config{cflags}.=" -DSHA512_ASM" if ($target{sha1_obj} =~ /sha512/);
291e94df 1103 if ($target{sha1_obj} =~ /sse2/) {
9e0724a1 1104 if ($no_sse2) {
291e94df 1105 $target{sha1_obj} =~ s/\S*sse2\S+//;
107b5792
RL
1106 } elsif ($config{cflags} !~ /OPENSSL_IA32_SSE2/) {
1107 $config{cflags}.=" -DOPENSSL_IA32_SSE2";
d0590fe6 1108 }
58964a49 1109 }
9e0724a1 1110 }
291e94df 1111 if ($target{md5_obj} =~ /\.o$/) {
107b5792 1112 $config{cflags}.=" -DMD5_ASM";
9e0724a1 1113 }
83365051 1114 $target{cast_obj}=$table{BASE}->{cast_obj} if (!$config{no_shared}); # CAST assembler is not PIC
291e94df 1115 if ($target{rmd160_obj} =~ /\.o$/) {
107b5792 1116 $config{cflags}.=" -DRMD160_ASM";
9e0724a1 1117 }
291e94df 1118 if ($target{aes_obj} =~ /\.o$/) {
107b5792 1119 $config{cflags}.=" -DAES_ASM" if ($target{aes_obj} =~ m/\baes-/);;
77aae965 1120 # aes-ctr.o is not a real file, only indication that assembler
874a3757 1121 # module implements AES_ctr32_encrypt...
107b5792 1122 $config{cflags}.=" -DAES_CTR_ASM" if ($target{aes_obj} =~ s/\s*aes-ctr\.o//);
478b50cf 1123 # aes-xts.o indicates presence of AES_xts_[en|de]crypt...
107b5792
RL
1124 $config{cflags}.=" -DAES_XTS_ASM" if ($target{aes_obj} =~ s/\s*aes-xts\.o//);
1125 $target{aes_obj} =~ s/\s*(vpaes|aesni)-x86\.o//g if ($no_sse2);
1126 $config{cflags}.=" -DVPAES_ASM" if ($target{aes_obj} =~ m/vpaes/);
1127 $config{cflags}.=" -DBSAES_ASM" if ($target{aes_obj} =~ m/bsaes/);
9e0724a1 1128 }
7d130f68 1129 if ($target{wp_obj} =~ /mmx/ && $config{processor} eq "386") {
291e94df 1130 $target{wp_obj}=$table{BASE}->{wp_obj};
9e0724a1 1131 } elsif (!$disabled{"whirlpool"}) {
107b5792 1132 $config{cflags}.=" -DWHIRLPOOL_ASM";
9e0724a1 1133 }
107b5792
RL
1134 if ($target{modes_obj} =~ /ghash-/) {
1135 $config{cflags}.=" -DGHASH_ASM";
9e0724a1 1136 }
291e94df 1137 if ($target{ec_obj} =~ /ecp_nistz256/) {
107b5792 1138 $config{cflags}.=" -DECP_NISTZ256_ASM";
9e0724a1 1139 }
291e94df 1140 if ($target{poly1305_obj} =~ /\.o$/) {
107b5792 1141 $config{cflags}.=" -DPOLY1305_ASM";
9e0724a1
RL
1142 }
1143}
d02b48c6 1144
107b5792
RL
1145$config{makedepprog} = "makedepend";
1146if ($target{cc} eq "gcc" || ($target{cc} eq 'cc' && $config{target} =~ /darwin/)) {
1147 $config{makedepprog} = $target{cc};
1148}
107b5792
RL
1149$config{depflags} =~ s/^\s*//;
1150
7d130f68
RL
1151
1152# Deal with bn_ops ###################################################
1153
1154$config{des_ptr} =0;
1155$config{des_risc1} =0;
1156$config{des_risc2} =0;
1157$config{des_unroll} =0;
1158$config{bn_ll} =0;
1159$config{rc4_idx} =0;
1160$config{bf_ptr} =0;
1161$config{export_var_as_fn} =0;
1162my $def_int="unsigned int";
1163$config{rc4_int} =$def_int;
1164$config{rc4_chunk} ="";
1165$config{md2_int} =$def_int;
1166$config{idea_int} =$def_int;
1167$config{rc2_int} =$def_int;
1168($config{b64l},$config{b64},$config{b32},$config{b16},$config{b8})=(0,0,1,0,0);
1169
1170$config{des_int} = "unsigned long";
1171
1172foreach (sort split(/\s+/,$target{bn_ops})) {
1173 $config{des_ptr}=1 if /DES_PTR/;
1174 $config{des_risc1}=1 if /DES_RISC1/;
1175 $config{des_risc2}=1 if /DES_RISC2/;
1176 $config{des_unroll}=1 if /DES_UNROLL/;
1177 $config{des_int}="unsigned int" if /DES_INT/;
1178 $config{bn_ll}=1 if /BN_LLONG/;
1179 $config{rc4_int}="unsigned char" if /RC4_CHAR/;
1180 $config{rc4_int}="unsigned long" if /RC4_LONG/;
1181 $config{rc4_idx}=1 if /RC4_INDEX/;
1182 $config{rc4_chunk}="unsigned long" if /RC4_CHUNK/;
1183 $config{rc4_chunk}="unsigned long long" if /RC4_CHUNK_LL/;
1184 $config{md2_int}="unsigned char" if /MD2_CHAR/;
1185 $config{md2_int}="unsigned long" if /MD2_LONG/;
1186 $config{idea_int}="unsigned char" if /IDEA_CHAR/;
1187 $config{idea_int}="unsigned long" if /IDEA_LONG/;
1188 $config{rc2_int}="unsigned char" if /RC2_CHAR/;
1189 $config{rc2_int}="unsigned long" if /RC2_LONG/;
1190 $config{bf_ptr}=1 if $_ eq "BF_PTR";
1191 $config{bf_ptr}=2 if $_ eq "BF_PTR2";
1192 ($config{b64l},$config{b64},$config{b32},$config{b16},$config{b8})
1193 =(0,1,0,0,0) if /SIXTY_FOUR_BIT/;
1194 ($config{b64l},$config{b64},$config{b32},$config{b16},$config{b8})
1195 =(1,0,0,0,0) if /SIXTY_FOUR_BIT_LONG/;
1196 ($config{b64l},$config{b64},$config{b32},$config{b16},$config{b8})
1197 =(0,0,1,0,0) if /THIRTY_TWO_BIT/;
1198 ($config{b64l},$config{b64},$config{b32},$config{b16},$config{b8})
1199 =(0,0,0,1,0) if /SIXTEEN_BIT/;
1200 ($config{b64l},$config{b64},$config{b32},$config{b16},$config{b8})
1201 =(0,0,0,0,1) if /EIGHT_BIT/;
1202 $config{export_var_as_fn}=1 if /EXPORT_VAR_AS_FN/;
1203}
1204
1205
1206# Hack cflags for better warnings (dev option) #######################
1207
1ed0c662
RL
1208# "Stringify" the C flags string. This permits it to be made part of a string
1209# and works as well on command lines.
107b5792 1210$config{cflags} =~ s/([\\\"])/\\\1/g;
b436a982 1211
107b5792
RL
1212if (defined($config{api})) {
1213 $config{openssl_api_defines} = [ "OPENSSL_MIN_API=".$apitable->{$config{api}} ];
1214 my $apiflag = sprintf("-DOPENSSL_API_COMPAT=%s", $apitable->{$config{api}});
98186eb4 1215 $default_depflags .= " $apiflag";
107b5792 1216 $config{cflags} .= " $apiflag";
98186eb4
VD
1217}
1218
291e94df
RL
1219my $ecc = $target{cc};
1220$ecc = "clang" if `$target{cc} --version 2>&1` =~ /clang/;
58dd1ce9 1221
0c28f277
DSH
1222if ($strict_warnings)
1223 {
1224 my $wopt;
f386742c 1225 die "ERROR --strict-warnings requires gcc or clang" unless ($ecc =~ /gcc(-\d(\.\d)*)?$/ or $ecc =~ /clang$/);
0c28f277
DSH
1226 foreach $wopt (split /\s+/, $gcc_devteam_warn)
1227 {
107b5792 1228 $config{cflags} .= " $wopt" unless ($config{cflags} =~ /(^|\s)$wopt(\s|$)/)
0c28f277 1229 }
190c8c60
BL
1230 if ($ecc eq "clang")
1231 {
1232 foreach $wopt (split /\s+/, $clang_devteam_warn)
1233 {
107b5792 1234 $config{cflags} .= " $wopt" unless ($config{cflags} =~ /(^|\s)$wopt(\s|$)/)
190c8c60
BL
1235 }
1236 }
a1d3f3d1
RL
1237 if ($target !~ /^mingw/)
1238 {
1239 foreach $wopt (split /\s+/, $memleak_devteam_backtrace)
1240 {
107b5792 1241 $config{cflags} .= " $wopt" unless ($config{cflags} =~ /(^|\s)$wopt(\s|$)/)
a1d3f3d1 1242 }
291e94df
RL
1243 if ($target =~ /^BSD-/)
1244 {
107b5792 1245 $config{lflags} .= " -lexecinfo";
291e94df
RL
1246 }
1247 }
0c28f277
DSH
1248 }
1249
291e94df
RL
1250# Write down our configuration where it fits #########################
1251
1252open(OUT,">configdata.pm") || die "unable to create configdata.pm: $!\n";
1253print OUT <<"EOF";
1254package configdata;
1255
1256use strict;
1257use warnings;
1258
1259use Exporter;
1260#use vars qw(\@ISA \@EXPORT);
1261our \@ISA = qw(Exporter);
107b5792 1262our \@EXPORT = qw(\%config \%target %withargs);
291e94df
RL
1263
1264EOF
1265print OUT "our %config = (\n";
1266foreach (sort keys %config) {
1267 if (ref($config{$_}) eq "ARRAY") {
1268 print OUT " ", $_, " => [ ", join(", ",
1269 map { quotify("perl", $_) }
1270 @{$config{$_}}), " ],\n";
1271 } else {
1272 print OUT " ", $_, " => ", quotify("perl", $config{$_}), ",\n"
1273 }
1274}
1275print OUT <<"EOF";
1276);
1277
1278EOF
1279print OUT "our %target = (\n";
1280foreach (sort keys %target) {
1281 if (ref($target{$_}) eq "ARRAY") {
1282 print OUT " ", $_, " => [ ", join(", ",
1283 map { quotify("perl", $_) }
1284 @{$target{$_}}), " ],\n";
1285 } else {
1286 print OUT " ", $_, " => ", quotify("perl", $target{$_}), ",\n"
1287 }
1288}
1289print OUT <<"EOF";
1290);
1291
96d2d7bc
RL
1292EOF
1293print OUT "our \%available_protocols = (\n";
1294print OUT " tls => [ ", join(", ", map { quotify("perl", $_) } @tls), " ],\n";
1295print OUT " dtls => [ ", join(", ", map { quotify("perl", $_) } @dtls), " ],\n";
1296print OUT <<"EOF";
1297);
1298
1299EOF
1300print OUT "our \%disabled = (\n";
1301foreach (sort keys %disabled) {
1302 print OUT " ", quotify("perl", $_), " => ", quotify("perl", $disabled{$_}), ",\n";
1303}
1304print OUT <<"EOF";
1305);
1306
291e94df 1307EOF
107b5792
RL
1308print OUT "our %withargs = (\n";
1309foreach (sort keys %withargs) {
1310 if (ref($withargs{$_}) eq "ARRAY") {
1311 print OUT " ", $_, " => [ ", join(", ",
1312 map { quotify("perl", $_) }
1313 @{$withargs{$_}}), " ],\n";
1314 } else {
1315 print OUT " ", $_, " => ", quotify("perl", $withargs{$_}), ",\n"
1316 }
1317}
1318print OUT <<"EOF";
1319);
edd4d402 1320
107b5792
RL
13211;
1322EOF
d02b48c6 1323close(OUT);
f2d4be3b 1324
291e94df
RL
1325print "IsMK1MF =", ($target{build_scheme}->[0] eq "mk1mf" ? "yes" : "no"), "\n";
1326print "CC =$target{cc}\n";
107b5792
RL
1327print "CFLAG =$config{cflags}\n";
1328print "EX_LIBS =$config{lflags}\n";
291e94df
RL
1329print "CPUID_OBJ =$target{cpuid_obj}\n";
1330print "BN_ASM =$target{bn_obj}\n";
1331print "EC_ASM =$target{ec_obj}\n";
1332print "DES_ENC =$target{des_obj}\n";
1333print "AES_ENC =$target{aes_obj}\n";
1334print "BF_ENC =$target{bf_obj}\n";
1335print "CAST_ENC =$target{cast_obj}\n";
1336print "RC4_ENC =$target{rc4_obj}\n";
1337print "RC5_ENC =$target{rc5_obj}\n";
1338print "MD5_OBJ_ASM =$target{md5_obj}\n";
1339print "SHA1_OBJ_ASM =$target{sha1_obj}\n";
1340print "RMD160_OBJ_ASM=$target{rmd160_obj}\n";
1341print "CMLL_ENC =$target{cmll_obj}\n";
1342print "MODES_OBJ =$target{modes_obj}\n";
f0bd4686 1343print "PADLOCK_OBJ =$target{padlock_obj}\n";
291e94df
RL
1344print "CHACHA_ENC =$target{chacha_obj}\n";
1345print "POLY1305_OBJ =$target{poly1305_obj}\n";
7d130f68 1346print "PROCESSOR =$config{processor}\n";
291e94df
RL
1347print "RANLIB =$target{ranlib}\n";
1348print "ARFLAGS =$target{arflags}\n";
1349print "PERL =$config{perl}\n";
f0bd4686 1350print "\n";
7d130f68
RL
1351print "SIXTY_FOUR_BIT_LONG mode\n" if $config{b64l};
1352print "SIXTY_FOUR_BIT mode\n" if $config{b64};
1353print "THIRTY_TWO_BIT mode\n" if $config{b32};
1354print "SIXTEEN_BIT mode\n" if $config{b16};
1355print "EIGHT_BIT mode\n" if $config{b8};
1356print "DES_PTR used\n" if $config{des_ptr};
1357print "DES_RISC1 used\n" if $config{des_risc1};
1358print "DES_RISC2 used\n" if $config{des_risc2};
1359print "DES_UNROLL used\n" if $config{des_unroll};
1360print "DES_INT used\n" if $config{des_int} =~ / int$/;
1361print "BN_LLONG mode\n" if $config{bn_ll};
1362print "RC4 uses $config{rc4_int}\n" if $config{rc4_int} != $def_int;
1363print "RC4_INDEX mode\n" if $config{rc4_idx};
1364print "RC4_CHUNK is undefined\n" unless $config{rc4_chunk};
1365print "RC4_CHUNK is $config{rc4_chunk}\n" if $config{rc4_chunk};
1366print "MD2 uses $config{md2_int}\n" if $config{md2_int} != $def_int;
1367print "IDEA uses $config{idea_int}\n" if $config{idea_int} != $def_int;
1368print "RC2 uses $config{rc2_int}\n" if $config{rc2_int} != $def_int;
1369print "BF_PTR used\n" if $config{bf_ptr} == 1;
1370print "BF_PTR2 used\n" if $config{bf_ptr} == 2;
cba5068d 1371
f0bd4686
RL
1372run_dofile("$Makefile.in","$Makefile");
1373
1374run_dofile("include/openssl/opensslconf.h.in", "include/openssl/opensslconf.h");
1375
1376foreach my $alg ( 'bf', 'bn', 'des', 'rc4' ) {
1377 run_dofile("crypto/include/internal/${alg}_conf.h.in",
1378 "crypto/include/internal/${alg}_conf.h");
1379}
1380
d10dac11
RS
1381# Copy all Makefile.in to Makefile (except top-level)
1382use File::Find;
1383use IO::File;
1384find(sub {
1385 return if ($_ ne "Makefile.in" || $File::Find::dir eq ".");
1386 my $in = IO::File->new($_, "r") or
1387 die sprintf "Error reading Makefile.in in %s: !$\n",
1388 $File::Find::dir;
1389 my $out = IO::File->new("Makefile", "w") or
1390 die sprintf "Error writing Makefile in %s: !$\n",
1391 $File::Find::dir;
1392 print $out "# Generated from $_, do not edit\n";
1393 while (my $line = <$in>) { print $out $line }
1394 $in->close() or
1395 die sprintf "Error reading Makefile.in in %s: !$\n",
1396 $File::Find::dir;
1397 $out->close() or
ef30a684 1398 die sprintf "Error writing Makefile in %s: !$\n",
d10dac11
RS
1399 $File::Find::dir;
1400 }, ".");
1401
88087414
RL
1402my %builders = (
1403 unixmake => sub {
291e94df 1404 my $make_command = "$make PERL=\'$config{perl}\'";
88087414 1405 my $make_targets = "";
107b5792 1406 $make_targets .= " depend" if $config{depflags} ne $default_depflags && $make_depend;
88087414
RL
1407 (system $make_command.$make_targets) == 0 or die "make $make_targets failed"
1408 if $make_targets ne "";
107b5792 1409 if ($config{depflags} ne $default_depflags && !$make_depend) {
88087414
RL
1410 $warn_make_depend++;
1411 }
1412 },
1413 mk1mf => sub {
664b9985 1414 open (OUT,">crypto/buildinf.h") || die "Can't open buildinf.h";
76ffb43d 1415 printf OUT <<"EOF";
57119943
BM
1416#ifndef MK1MF_BUILD
1417 /* auto-generated by Configure for crypto/cversion.c:
1418 * for Unix builds, crypto/Makefile.ssl generates functional definitions;
1419 * Windows builds (and other mk1mf builds) compile cversion.c with
1420 * -DMK1MF_BUILD and use definitions added to this file by util/mk1mf.pl. */
1421 #error "Windows builds (PLATFORM=$target) use mk1mf.pl-created Makefiles"
1422#endif
9e935d7e 1423EOF
8e10f2b3 1424 close(OUT);
8e10f2b3 1425
88087414 1426 # create the ms/version32.rc file if needed
291e94df 1427 if (! grep /^netware/, @{$target{build_scheme}}) {
88087414 1428 my ($v1, $v2, $v3, $v4);
3fa04f0d 1429 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
1430 $v1=hex $1;
1431 $v2=hex $2;
1432 $v3=hex $3;
1433 $v4=hex $4;
88087414
RL
1434 }
1435 open (OUT,">ms/version32.rc") || die "Can't open ms/version32.rc";
1436 print OUT <<"EOF";
fc6a6a10
DSH
1437#include <winver.h>
1438
1439LANGUAGE 0x09,0x01
1440
14411 VERSIONINFO
1442 FILEVERSION $v1,$v2,$v3,$v4
1443 PRODUCTVERSION $v1,$v2,$v3,$v4
1444 FILEFLAGSMASK 0x3fL
1445#ifdef _DEBUG
1446 FILEFLAGS 0x01L
1447#else
1448 FILEFLAGS 0x00L
1449#endif
1450 FILEOS VOS__WINDOWS32
1451 FILETYPE VFT_DLL
1452 FILESUBTYPE 0x0L
1453BEGIN
1454 BLOCK "StringFileInfo"
1455 BEGIN
1456 BLOCK "040904b0"
1457 BEGIN
fce0ba5f 1458 // Required:
fc6a6a10
DSH
1459 VALUE "CompanyName", "The OpenSSL Project, http://www.openssl.org/\\0"
1460 VALUE "FileDescription", "OpenSSL Shared Library\\0"
3fa04f0d 1461 VALUE "FileVersion", "$config{version}\\0"
fc6a6a10
DSH
1462#if defined(CRYPTO)
1463 VALUE "InternalName", "libeay32\\0"
1464 VALUE "OriginalFilename", "libeay32.dll\\0"
1465#elif defined(SSL)
1466 VALUE "InternalName", "ssleay32\\0"
1467 VALUE "OriginalFilename", "ssleay32.dll\\0"
a479d72d 1468#endif
fc6a6a10 1469 VALUE "ProductName", "The OpenSSL Toolkit\\0"
3fa04f0d 1470 VALUE "ProductVersion", "$config{version}\\0"
fc6a6a10
DSH
1471 // Optional:
1472 //VALUE "Comments", "\\0"
51cbee35 1473 VALUE "LegalCopyright", "Copyright © 1998-2015 The OpenSSL Project. Copyright © 1995-1998 Eric A. Young, Tim J. Hudson. All rights reserved.\\0"
fc6a6a10
DSH
1474 //VALUE "LegalTrademarks", "\\0"
1475 //VALUE "PrivateBuild", "\\0"
1476 //VALUE "SpecialBuild", "\\0"
1477 END
1478 END
1479 BLOCK "VarFileInfo"
1480 BEGIN
1481 VALUE "Translation", 0x409, 0x4b0
1482 END
1483END
1484EOF
88087414
RL
1485 close(OUT);
1486 }
1487 },
1488 );
1489
291e94df 1490my ($builder, @builder_opts) = @{$target{build_scheme}};
88087414 1491$builders{$builder}->(@builder_opts);
fce0ba5f 1492
76ffb43d 1493print <<"EOF";
63d3f44a 1494
89ec98e0 1495Configured for $target.
63d3f44a 1496EOF
5f8d5c96 1497
76ffb43d 1498print <<"EOF" if (!$no_threads && !$threads);
5f8d5c96
BM
1499
1500The library could not be configured for supporting multi-threaded
1501applications as the compiler options required on this system are not known.
ff1b7e09 1502See file INSTALL for details if you need multi-threading.
ec577822
BM
1503EOF
1504
76ffb43d 1505print <<"EOF" if ($no_shared_warn);
2964ba8c 1506
2e31ef03
RS
1507You gave the option 'shared', which is not supported on this platform, so
1508we will pretend you gave the option 'no-shared'. If you know how to implement
1509shared libraries, please let us know (but please first make sure you have
1510tried with a current version of OpenSSL).
1511EOF
1512
76ffb43d 1513print <<"EOF" if ($warn_make_depend);
2e31ef03
RS
1514
1515*** Because of configuration changes, you MUST do the following before
1516*** building:
1517
1518 make depend
2964ba8c
RL
1519EOF
1520
d02b48c6
RE
1521exit(0);
1522
bd5192b1
RL
1523######################################################################
1524#
1525# Helpers and utility functions
1526#
1527
1528# Configuration file reading #########################################
1529
1530# Helper function to implement conditional inheritance depending on the
1531# value of $no_asm. Used in inherit_from values as follows:
1532#
1533# inherit_from => [ "template", asm("asm_tmpl") ]
1534#
1535sub asm {
1536 my @x = @_;
1537 sub {
1538 $no_asm ? () : @x;
1539 }
1540}
1541
88087414
RL
1542# Helper function to implement adding values to already existing configuration
1543# values. It handles elements that are ARRAYs, CODEs and scalars
1544sub _add {
1545 my $separator = shift;
1546
1547 # If there's any ARRAY in the collection of values, we will return
1548 # an ARRAY of combined values, otherwise a string of joined values
1549 # with $separator as the separator.
1550 my $found_array = 0;
1551
1552 my @values =
1553 map {
1554 if (ref($_) eq "ARRAY") {
1555 $found_array = 1;
1556 @$_;
1557 } else {
1558 $_;
1559 }
1560 } (@_);
1561
1562 if ($found_array) {
1563 [ @values ];
1564 } else {
1565 join($separator, @values);
1566 }
1567}
1568sub add_before {
1569 my $separator = shift;
1570 my @x = @_;
1571 sub { _add($separator, @x, @_) };
1572}
1573sub add {
1574 my $separator = shift;
1575 my @x = @_;
1576 sub { _add($separator, @_, @x) };
1577}
1578
bd5192b1
RL
1579# configuration reader, evaluates the input file as a perl script and expects
1580# it to fill %targets with target configurations. Those are then added to
1581# %table.
1582sub read_config {
1583 my $fname = shift;
1584 open(CONFFILE, "< $fname")
1585 or die "Can't open configuration file '$fname'!\n";
1586 my $x = $/;
1587 undef $/;
1588 my $content = <CONFFILE>;
1589 $/ = $x;
1590 close(CONFFILE);
1591 my %targets = ();
1592 {
1593 local %table = %::table; # Protect %table from tampering
1594
1595 eval $content;
1596 warn $@ if $@;
1597 }
1598
1599 # For each target, check that it's configured with a hash table.
1600 foreach (keys %targets) {
1601 if (ref($targets{$_}) ne "HASH") {
1602 if (ref($targets{$_}) eq "") {
1603 warn "Deprecated target configuration for $_, ignoring...\n";
1604 } else {
1605 warn "Misconfigured target configuration for $_ (should be a hash table), ignoring...\n";
1606 }
1607 delete $targets{$_};
1608 }
1609 }
1610
1611 %table = (%table, %targets);
1612
1613}
1614
1615# configuration resolver. Will only resolve all the lazy evalutation
1616# codeblocks for the chozen target and all those it inherits from,
1617# recursively
1618sub resolve_config {
1619 my $target = shift;
1620 my @breadcrumbs = @_;
1621
1622 if (grep { $_ eq $target } @breadcrumbs) {
1623 die "inherit_from loop! target backtrace:\n "
1624 ,$target,"\n ",join("\n ", @breadcrumbs),"\n";
1625 }
1626
1627 if (!defined($table{$target})) {
1628 warn "Warning! target $target doesn't exist!\n";
1629 return ();
1630 }
1631 # Recurse through all inheritances. They will be resolved on the
1632 # fly, so when this operation is done, they will all just be a
1633 # bunch of attributes with string values.
1634 # What we get here, though, are keys with references to lists of
1635 # the combined values of them all. We will deal with lists after
1636 # this stage is done.
1637 my %combined_inheritance = ();
1638 if ($table{$target}->{inherit_from}) {
1639 my @inherit_from =
1640 map { ref($_) eq "CODE" ? $_->() : $_ } @{$table{$target}->{inherit_from}};
1641 foreach (@inherit_from) {
1642 my %inherited_config = resolve_config($_, $target, @breadcrumbs);
1643
1644 # 'template' is a marker that's considered private to
1645 # the config that had it.
1646 delete $inherited_config{template};
1647
1648 map {
1649 if (!$combined_inheritance{$_}) {
1650 $combined_inheritance{$_} = [];
1651 }
1652 push @{$combined_inheritance{$_}}, $inherited_config{$_};
1653 } keys %inherited_config;
1654 }
1655 }
1656
1657 # We won't need inherit_from in this target any more, since we've
1658 # resolved all the inheritances that lead to this
1659 delete $table{$target}->{inherit_from};
1660
1661 # Now is the time to deal with those lists. Here's the place to
1662 # decide what shall be done with those lists, all based on the
1663 # values of the target we're currently dealing with.
1664 # - If a value is a coderef, it will be executed with the list of
1665 # inherited values as arguments.
1666 # - If the corresponding key doesn't have a value at all or is the
1667 # emoty string, the inherited value list will be run through the
1668 # default combiner (below), and the result becomes this target's
1669 # value.
1670 # - Otherwise, this target's value is assumed to be a string that
1671 # will simply override the inherited list of values.
88087414 1672 my $default_combiner = add(" ");
bd5192b1
RL
1673
1674 my %all_keys =
1675 map { $_ => 1 } (keys %combined_inheritance,
1676 keys %{$table{$target}});
1677 foreach (sort keys %all_keys) {
1678
1679 # Current target doesn't have a value for the current key?
1680 # Assign it the default combiner, the rest of this loop body
1681 # will handle it just like any other coderef.
1682 if (!exists $table{$target}->{$_}) {
1683 $table{$target}->{$_} = $default_combiner;
1684 }
1685
1686 my $valuetype = ref($table{$target}->{$_});
1687 if ($valuetype eq "CODE") {
1688 # CODE reference, execute it with the inherited values as
1689 # arguments.
1690 $table{$target}->{$_} =
1691 $table{$target}->{$_}->(@{$combined_inheritance{$_}});
88087414
RL
1692 } elsif ($valuetype eq "ARRAY" || $valuetype eq "") {
1693 # ARRAY or Scalar, just leave it as is.
bd5192b1
RL
1694 } else {
1695 # Some other type of reference that we don't handle.
1696 # Better to abort at this point.
1697 die "cannot handle reference type $valuetype,"
1698 ," found in target $target -> $_\n";
1699 }
1700 }
1701
1702 # Finally done, return the result.
1703 return %{$table{$target}};
1704}
1705
462ba4f6 1706sub usage
d02b48c6 1707 {
462ba4f6 1708 print STDERR $usage;
10a926c1 1709 print STDERR "\npick os/compiler from:\n";
1641cb60 1710 my $j=0;
6457ad15 1711 my $i;
10a926c1 1712 my $k=0;
6457ad15 1713 foreach $i (sort keys %table)
d02b48c6 1714 {
bd5192b1 1715 next if $table{$i}->{template};
462ba4f6 1716 next if $i =~ /^debug/;
10a926c1
UM
1717 $k += length($i) + 1;
1718 if ($k > 78)
1719 {
1720 print STDERR "\n";
1721 $k=length($i);
1722 }
1723 print STDERR $i . " ";
462ba4f6
UM
1724 }
1725 foreach $i (sort keys %table)
1726 {
bd5192b1 1727 next if $table{$i}->{template};
462ba4f6 1728 next if $i !~ /^debug/;
10a926c1
UM
1729 $k += length($i) + 1;
1730 if ($k > 78)
1731 {
1732 print STDERR "\n";
1733 $k=length($i);
1734 }
1735 print STDERR $i . " ";
d02b48c6 1736 }
10a926c1 1737 print STDERR "\n\nNOTE: If in doubt, on Unix-ish systems use './config'.\n";
462ba4f6 1738 exit(1);
d02b48c6
RE
1739 }
1740
107b5792
RL
1741sub run_dofile()
1742{
1743 my $in = shift;
1744 my $out = shift;
1745
1746 # should we remove $out ?
9ab6fc59 1747 system("$config{perl} -I. -Mconfigdata util/dofile.pl -o\"Configure\" $in > $out.new");
107b5792
RL
1748 exit 1 if $? != 0;
1749 rename("$out.new", $out) || die "Can't rename $out.new, $!";
1750}
1751
00ae96ca
RL
1752# Configuration printer ##############################################
1753
1754sub print_table_entry
1755{
1756 my $target = shift;
1757 my %target = resolve_config($target);
1758 my $type = shift;
1759
1760 # Don't print the templates
1761 return if $target{template};
1762
1763 my @sequence = (
f0bd4686 1764 "sys_id",
00ae96ca
RL
1765 "cc",
1766 "cflags",
1767 "debug_cflags",
1768 "release_cflags",
00ae96ca 1769 "thread_cflag",
f0bd4686
RL
1770 "unistd",
1771 "ld",
00ae96ca
RL
1772 "lflags",
1773 "debug_lflags",
1774 "release_lflags",
1775 "bn_ops",
1776 "cpuid_obj",
1777 "bn_obj",
1778 "ec_obj",
1779 "des_obj",
1780 "aes_obj",
1781 "bf_obj",
1782 "md5_obj",
1783 "sha1_obj",
1784 "cast_obj",
1785 "rc4_obj",
1786 "rmd160_obj",
1787 "rc5_obj",
1788 "wp_obj",
1789 "cmll_obj",
1790 "modes_obj",
f0bd4686 1791 "padlock_obj",
00ae96ca
RL
1792 "perlasm_scheme",
1793 "dso_scheme",
1794 "shared_target",
1795 "shared_cflag",
1796 "shared_ldflag",
1797 "shared_extension",
f0bd4686
RL
1798 "obj_extension",
1799 "exe_extension",
00ae96ca 1800 "ranlib",
f0bd4686 1801 "ar",
00ae96ca
RL
1802 "arflags",
1803 "multilib",
f0bd4686 1804 "build_scheme",
00ae96ca
RL
1805 );
1806
1807 if ($type eq "TABLE") {
1808 print "\n";
1809 print "*** $target\n";
1810 printf "\$%-12s = %s\n", $_, $target{$_} foreach (@sequence);
1811 } elsif ($type eq "HASH") {
1812 my $largest =
1813 length((sort { length($a) <=> length($b) } @sequence)[-1]);
1814 print " '$target' => {\n";
1815 foreach (@sequence) {
1816 if ($target{$_}) {
1817 print " '",$_,"'"," " x ($largest - length($_))," => '",$target{$_},"',\n";
1818 }
1819 }
1820 print " },\n";
1821 }
1822}
1823
1824# Utility routines ###################################################
1825
99aab161
UM
1826sub which
1827 {
1828 my($name)=@_;
1829 my $path;
1830 foreach $path (split /:/, $ENV{PATH})
1831 {
107b5792 1832 if (-f "$path/$name$target{exe_extension}" and -x _)
99aab161 1833 {
107b5792
RL
1834 return "$path/$name$target{exe_extension}" unless ($name eq "perl" and
1835 system("$path/$name$target{exe_extension} -e " . '\'exit($]<5.0);\''));
99aab161
UM
1836 }
1837 }
1838 }
1839
fe05264e
RL
1840sub quotify {
1841 my %processors = (
1842 perl => sub { my $x = shift;
1843 $x =~ s/([\\\$\@"])/\\$1/g;
1844 return '"'.$x.'"'; },
1845 );
1846 my $for = shift;
1847 my $processor =
1848 defined($processors{$for}) ? $processors{$for} : sub { shift; };
1849
1850 map { $processor->($_); } @_;
1851}
107b5792
RL
1852
1853# collect_information($filename, $line_continue, $regexp => $CODEref, ...)
1854# $filename is the file to read.
1855# $line_continue is either undef (which is a noop), or two arguments, where
1856# the first is a regexp detecting a line continuation ending, and the
1857# following argument is a CODEref that takes care of concatenating two
1858# lines.
1859# All following arguments are regex/CODEref pairs, where the regexp detects a
1860# line and the CODEref does something with the result of the regexp.
1861sub collect_information {
1862 my $filename = shift;
1863 my $line_continue_re = shift;
1864 my $line_concat = defined($line_continue_re) ? shift : undef;
1865 my %collectors = @_;
1866
1867 my $saved_line = "";
1868 open IN, $filename || die "unable to read $filename: $!\n";
1869 while(<IN>) {
1870 chomp;
1871 if (defined $line_concat) {
1872 $_ = $line_concat->($saved_line, $_);
1873 }
1874 if (defined $line_continue_re && /$line_continue_re/) {
1875 $saved_line = $_;
1876 next;
1877 }
1878 foreach my $re (keys %collectors) {
1879 if (/$re/) { $collectors{$re}->() };
1880 }
1881 }
1882 close IN;
1883}