]> git.ipfire.org Git - thirdparty/openssl.git/blame - Configure
Configure first in travis create release
[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}
1149# On different platforms, shared library suffixes takes interesting forms.
1150# On Most Unixen, it's .so.{version} or .sl.{version}, while on MacOS X,
1151# it's .{version}.dylib. We're want to separate the two so we can calculate
1152# symlinks.
1153# FIXME: is this actually needed any more? Makefile.shared seems to just
1154# symlink a file name without SOVER to the file with full SOVER, nothing in
1155# between.
1156if ($target{shared_extension} =~ /^(|(?<e>\.s[ol])(?<v>\..*)|(?<v>\..*)(?<e>\.dylib))$/) {
1157 my @vernums = split /\./, $+{v};
1158 shift @vernums; # Because the initial period in shlib_extension.
1159 my @s = ();
1160 while (@vernums) {
1161 pop @vernums;
1162 push @s, join(".", $+{e} eq ".dylib" ? "" : $+{e},
1163 @vernums,
1164 $+{e} eq ".dylib" ? $+{e} : () );
1165 }
1166 $config{shared_link_extensions} = join(" ", @s);
1167} else {
1168 $config{shared_link_extensions} = "";
1169}
1170$config{depflags} =~ s/^\s*//;
1171
7d130f68
RL
1172
1173# Deal with bn_ops ###################################################
1174
1175$config{des_ptr} =0;
1176$config{des_risc1} =0;
1177$config{des_risc2} =0;
1178$config{des_unroll} =0;
1179$config{bn_ll} =0;
1180$config{rc4_idx} =0;
1181$config{bf_ptr} =0;
1182$config{export_var_as_fn} =0;
1183my $def_int="unsigned int";
1184$config{rc4_int} =$def_int;
1185$config{rc4_chunk} ="";
1186$config{md2_int} =$def_int;
1187$config{idea_int} =$def_int;
1188$config{rc2_int} =$def_int;
1189($config{b64l},$config{b64},$config{b32},$config{b16},$config{b8})=(0,0,1,0,0);
1190
1191$config{des_int} = "unsigned long";
1192
1193foreach (sort split(/\s+/,$target{bn_ops})) {
1194 $config{des_ptr}=1 if /DES_PTR/;
1195 $config{des_risc1}=1 if /DES_RISC1/;
1196 $config{des_risc2}=1 if /DES_RISC2/;
1197 $config{des_unroll}=1 if /DES_UNROLL/;
1198 $config{des_int}="unsigned int" if /DES_INT/;
1199 $config{bn_ll}=1 if /BN_LLONG/;
1200 $config{rc4_int}="unsigned char" if /RC4_CHAR/;
1201 $config{rc4_int}="unsigned long" if /RC4_LONG/;
1202 $config{rc4_idx}=1 if /RC4_INDEX/;
1203 $config{rc4_chunk}="unsigned long" if /RC4_CHUNK/;
1204 $config{rc4_chunk}="unsigned long long" if /RC4_CHUNK_LL/;
1205 $config{md2_int}="unsigned char" if /MD2_CHAR/;
1206 $config{md2_int}="unsigned long" if /MD2_LONG/;
1207 $config{idea_int}="unsigned char" if /IDEA_CHAR/;
1208 $config{idea_int}="unsigned long" if /IDEA_LONG/;
1209 $config{rc2_int}="unsigned char" if /RC2_CHAR/;
1210 $config{rc2_int}="unsigned long" if /RC2_LONG/;
1211 $config{bf_ptr}=1 if $_ eq "BF_PTR";
1212 $config{bf_ptr}=2 if $_ eq "BF_PTR2";
1213 ($config{b64l},$config{b64},$config{b32},$config{b16},$config{b8})
1214 =(0,1,0,0,0) if /SIXTY_FOUR_BIT/;
1215 ($config{b64l},$config{b64},$config{b32},$config{b16},$config{b8})
1216 =(1,0,0,0,0) if /SIXTY_FOUR_BIT_LONG/;
1217 ($config{b64l},$config{b64},$config{b32},$config{b16},$config{b8})
1218 =(0,0,1,0,0) if /THIRTY_TWO_BIT/;
1219 ($config{b64l},$config{b64},$config{b32},$config{b16},$config{b8})
1220 =(0,0,0,1,0) if /SIXTEEN_BIT/;
1221 ($config{b64l},$config{b64},$config{b32},$config{b16},$config{b8})
1222 =(0,0,0,0,1) if /EIGHT_BIT/;
1223 $config{export_var_as_fn}=1 if /EXPORT_VAR_AS_FN/;
1224}
1225
1226
1227# Hack cflags for better warnings (dev option) #######################
1228
1ed0c662
RL
1229# "Stringify" the C flags string. This permits it to be made part of a string
1230# and works as well on command lines.
107b5792 1231$config{cflags} =~ s/([\\\"])/\\\1/g;
b436a982 1232
107b5792
RL
1233if (defined($config{api})) {
1234 $config{openssl_api_defines} = [ "OPENSSL_MIN_API=".$apitable->{$config{api}} ];
1235 my $apiflag = sprintf("-DOPENSSL_API_COMPAT=%s", $apitable->{$config{api}});
98186eb4 1236 $default_depflags .= " $apiflag";
107b5792 1237 $config{cflags} .= " $apiflag";
98186eb4
VD
1238}
1239
291e94df
RL
1240my $ecc = $target{cc};
1241$ecc = "clang" if `$target{cc} --version 2>&1` =~ /clang/;
58dd1ce9 1242
0c28f277
DSH
1243if ($strict_warnings)
1244 {
1245 my $wopt;
f386742c 1246 die "ERROR --strict-warnings requires gcc or clang" unless ($ecc =~ /gcc(-\d(\.\d)*)?$/ or $ecc =~ /clang$/);
0c28f277
DSH
1247 foreach $wopt (split /\s+/, $gcc_devteam_warn)
1248 {
107b5792 1249 $config{cflags} .= " $wopt" unless ($config{cflags} =~ /(^|\s)$wopt(\s|$)/)
0c28f277 1250 }
190c8c60
BL
1251 if ($ecc eq "clang")
1252 {
1253 foreach $wopt (split /\s+/, $clang_devteam_warn)
1254 {
107b5792 1255 $config{cflags} .= " $wopt" unless ($config{cflags} =~ /(^|\s)$wopt(\s|$)/)
190c8c60
BL
1256 }
1257 }
a1d3f3d1
RL
1258 if ($target !~ /^mingw/)
1259 {
1260 foreach $wopt (split /\s+/, $memleak_devteam_backtrace)
1261 {
107b5792 1262 $config{cflags} .= " $wopt" unless ($config{cflags} =~ /(^|\s)$wopt(\s|$)/)
a1d3f3d1 1263 }
291e94df
RL
1264 if ($target =~ /^BSD-/)
1265 {
107b5792 1266 $config{lflags} .= " -lexecinfo";
291e94df
RL
1267 }
1268 }
0c28f277
DSH
1269 }
1270
291e94df
RL
1271# Write down our configuration where it fits #########################
1272
1273open(OUT,">configdata.pm") || die "unable to create configdata.pm: $!\n";
1274print OUT <<"EOF";
1275package configdata;
1276
1277use strict;
1278use warnings;
1279
1280use Exporter;
1281#use vars qw(\@ISA \@EXPORT);
1282our \@ISA = qw(Exporter);
107b5792 1283our \@EXPORT = qw(\%config \%target %withargs);
291e94df
RL
1284
1285EOF
1286print OUT "our %config = (\n";
1287foreach (sort keys %config) {
1288 if (ref($config{$_}) eq "ARRAY") {
1289 print OUT " ", $_, " => [ ", join(", ",
1290 map { quotify("perl", $_) }
1291 @{$config{$_}}), " ],\n";
1292 } else {
1293 print OUT " ", $_, " => ", quotify("perl", $config{$_}), ",\n"
1294 }
1295}
1296print OUT <<"EOF";
1297);
1298
1299EOF
1300print OUT "our %target = (\n";
1301foreach (sort keys %target) {
1302 if (ref($target{$_}) eq "ARRAY") {
1303 print OUT " ", $_, " => [ ", join(", ",
1304 map { quotify("perl", $_) }
1305 @{$target{$_}}), " ],\n";
1306 } else {
1307 print OUT " ", $_, " => ", quotify("perl", $target{$_}), ",\n"
1308 }
1309}
1310print OUT <<"EOF";
1311);
1312
291e94df 1313EOF
107b5792
RL
1314print OUT "our %withargs = (\n";
1315foreach (sort keys %withargs) {
1316 if (ref($withargs{$_}) eq "ARRAY") {
1317 print OUT " ", $_, " => [ ", join(", ",
1318 map { quotify("perl", $_) }
1319 @{$withargs{$_}}), " ],\n";
1320 } else {
1321 print OUT " ", $_, " => ", quotify("perl", $withargs{$_}), ",\n"
1322 }
1323}
1324print OUT <<"EOF";
1325);
edd4d402 1326
107b5792
RL
13271;
1328EOF
d02b48c6 1329close(OUT);
f2d4be3b 1330
291e94df
RL
1331print "IsMK1MF =", ($target{build_scheme}->[0] eq "mk1mf" ? "yes" : "no"), "\n";
1332print "CC =$target{cc}\n";
107b5792
RL
1333print "CFLAG =$config{cflags}\n";
1334print "EX_LIBS =$config{lflags}\n";
291e94df
RL
1335print "CPUID_OBJ =$target{cpuid_obj}\n";
1336print "BN_ASM =$target{bn_obj}\n";
1337print "EC_ASM =$target{ec_obj}\n";
1338print "DES_ENC =$target{des_obj}\n";
1339print "AES_ENC =$target{aes_obj}\n";
1340print "BF_ENC =$target{bf_obj}\n";
1341print "CAST_ENC =$target{cast_obj}\n";
1342print "RC4_ENC =$target{rc4_obj}\n";
1343print "RC5_ENC =$target{rc5_obj}\n";
1344print "MD5_OBJ_ASM =$target{md5_obj}\n";
1345print "SHA1_OBJ_ASM =$target{sha1_obj}\n";
1346print "RMD160_OBJ_ASM=$target{rmd160_obj}\n";
1347print "CMLL_ENC =$target{cmll_obj}\n";
1348print "MODES_OBJ =$target{modes_obj}\n";
f0bd4686 1349print "PADLOCK_OBJ =$target{padlock_obj}\n";
291e94df
RL
1350print "CHACHA_ENC =$target{chacha_obj}\n";
1351print "POLY1305_OBJ =$target{poly1305_obj}\n";
7d130f68 1352print "PROCESSOR =$config{processor}\n";
291e94df
RL
1353print "RANLIB =$target{ranlib}\n";
1354print "ARFLAGS =$target{arflags}\n";
1355print "PERL =$config{perl}\n";
f0bd4686 1356print "\n";
7d130f68
RL
1357print "SIXTY_FOUR_BIT_LONG mode\n" if $config{b64l};
1358print "SIXTY_FOUR_BIT mode\n" if $config{b64};
1359print "THIRTY_TWO_BIT mode\n" if $config{b32};
1360print "SIXTEEN_BIT mode\n" if $config{b16};
1361print "EIGHT_BIT mode\n" if $config{b8};
1362print "DES_PTR used\n" if $config{des_ptr};
1363print "DES_RISC1 used\n" if $config{des_risc1};
1364print "DES_RISC2 used\n" if $config{des_risc2};
1365print "DES_UNROLL used\n" if $config{des_unroll};
1366print "DES_INT used\n" if $config{des_int} =~ / int$/;
1367print "BN_LLONG mode\n" if $config{bn_ll};
1368print "RC4 uses $config{rc4_int}\n" if $config{rc4_int} != $def_int;
1369print "RC4_INDEX mode\n" if $config{rc4_idx};
1370print "RC4_CHUNK is undefined\n" unless $config{rc4_chunk};
1371print "RC4_CHUNK is $config{rc4_chunk}\n" if $config{rc4_chunk};
1372print "MD2 uses $config{md2_int}\n" if $config{md2_int} != $def_int;
1373print "IDEA uses $config{idea_int}\n" if $config{idea_int} != $def_int;
1374print "RC2 uses $config{rc2_int}\n" if $config{rc2_int} != $def_int;
1375print "BF_PTR used\n" if $config{bf_ptr} == 1;
1376print "BF_PTR2 used\n" if $config{bf_ptr} == 2;
cba5068d 1377
f0bd4686
RL
1378run_dofile("$Makefile.in","$Makefile");
1379
1380run_dofile("include/openssl/opensslconf.h.in", "include/openssl/opensslconf.h");
1381
1382foreach my $alg ( 'bf', 'bn', 'des', 'rc4' ) {
1383 run_dofile("crypto/include/internal/${alg}_conf.h.in",
1384 "crypto/include/internal/${alg}_conf.h");
1385}
1386
d10dac11
RS
1387# Copy all Makefile.in to Makefile (except top-level)
1388use File::Find;
1389use IO::File;
1390find(sub {
1391 return if ($_ ne "Makefile.in" || $File::Find::dir eq ".");
1392 my $in = IO::File->new($_, "r") or
1393 die sprintf "Error reading Makefile.in in %s: !$\n",
1394 $File::Find::dir;
1395 my $out = IO::File->new("Makefile", "w") or
1396 die sprintf "Error writing Makefile in %s: !$\n",
1397 $File::Find::dir;
1398 print $out "# Generated from $_, do not edit\n";
1399 while (my $line = <$in>) { print $out $line }
1400 $in->close() or
1401 die sprintf "Error reading Makefile.in in %s: !$\n",
1402 $File::Find::dir;
1403 $out->close() or
ef30a684 1404 die sprintf "Error writing Makefile in %s: !$\n",
d10dac11
RS
1405 $File::Find::dir;
1406 }, ".");
1407
88087414
RL
1408my %builders = (
1409 unixmake => sub {
291e94df 1410 my $make_command = "$make PERL=\'$config{perl}\'";
88087414 1411 my $make_targets = "";
107b5792 1412 $make_targets .= " depend" if $config{depflags} ne $default_depflags && $make_depend;
88087414
RL
1413 (system $make_command.$make_targets) == 0 or die "make $make_targets failed"
1414 if $make_targets ne "";
107b5792 1415 if ($config{depflags} ne $default_depflags && !$make_depend) {
88087414
RL
1416 $warn_make_depend++;
1417 }
1418 },
1419 mk1mf => sub {
664b9985 1420 open (OUT,">crypto/buildinf.h") || die "Can't open buildinf.h";
76ffb43d 1421 printf OUT <<"EOF";
57119943
BM
1422#ifndef MK1MF_BUILD
1423 /* auto-generated by Configure for crypto/cversion.c:
1424 * for Unix builds, crypto/Makefile.ssl generates functional definitions;
1425 * Windows builds (and other mk1mf builds) compile cversion.c with
1426 * -DMK1MF_BUILD and use definitions added to this file by util/mk1mf.pl. */
1427 #error "Windows builds (PLATFORM=$target) use mk1mf.pl-created Makefiles"
1428#endif
9e935d7e 1429EOF
8e10f2b3 1430 close(OUT);
8e10f2b3 1431
88087414 1432 # create the ms/version32.rc file if needed
291e94df 1433 if (! grep /^netware/, @{$target{build_scheme}}) {
88087414 1434 my ($v1, $v2, $v3, $v4);
3fa04f0d 1435 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
1436 $v1=hex $1;
1437 $v2=hex $2;
1438 $v3=hex $3;
1439 $v4=hex $4;
88087414
RL
1440 }
1441 open (OUT,">ms/version32.rc") || die "Can't open ms/version32.rc";
1442 print OUT <<"EOF";
fc6a6a10
DSH
1443#include <winver.h>
1444
1445LANGUAGE 0x09,0x01
1446
14471 VERSIONINFO
1448 FILEVERSION $v1,$v2,$v3,$v4
1449 PRODUCTVERSION $v1,$v2,$v3,$v4
1450 FILEFLAGSMASK 0x3fL
1451#ifdef _DEBUG
1452 FILEFLAGS 0x01L
1453#else
1454 FILEFLAGS 0x00L
1455#endif
1456 FILEOS VOS__WINDOWS32
1457 FILETYPE VFT_DLL
1458 FILESUBTYPE 0x0L
1459BEGIN
1460 BLOCK "StringFileInfo"
1461 BEGIN
1462 BLOCK "040904b0"
1463 BEGIN
fce0ba5f 1464 // Required:
fc6a6a10
DSH
1465 VALUE "CompanyName", "The OpenSSL Project, http://www.openssl.org/\\0"
1466 VALUE "FileDescription", "OpenSSL Shared Library\\0"
3fa04f0d 1467 VALUE "FileVersion", "$config{version}\\0"
fc6a6a10
DSH
1468#if defined(CRYPTO)
1469 VALUE "InternalName", "libeay32\\0"
1470 VALUE "OriginalFilename", "libeay32.dll\\0"
1471#elif defined(SSL)
1472 VALUE "InternalName", "ssleay32\\0"
1473 VALUE "OriginalFilename", "ssleay32.dll\\0"
a479d72d 1474#endif
fc6a6a10 1475 VALUE "ProductName", "The OpenSSL Toolkit\\0"
3fa04f0d 1476 VALUE "ProductVersion", "$config{version}\\0"
fc6a6a10
DSH
1477 // Optional:
1478 //VALUE "Comments", "\\0"
51cbee35 1479 VALUE "LegalCopyright", "Copyright © 1998-2015 The OpenSSL Project. Copyright © 1995-1998 Eric A. Young, Tim J. Hudson. All rights reserved.\\0"
fc6a6a10
DSH
1480 //VALUE "LegalTrademarks", "\\0"
1481 //VALUE "PrivateBuild", "\\0"
1482 //VALUE "SpecialBuild", "\\0"
1483 END
1484 END
1485 BLOCK "VarFileInfo"
1486 BEGIN
1487 VALUE "Translation", 0x409, 0x4b0
1488 END
1489END
1490EOF
88087414
RL
1491 close(OUT);
1492 }
1493 },
1494 );
1495
291e94df 1496my ($builder, @builder_opts) = @{$target{build_scheme}};
88087414 1497$builders{$builder}->(@builder_opts);
fce0ba5f 1498
76ffb43d 1499print <<"EOF";
63d3f44a 1500
89ec98e0 1501Configured for $target.
63d3f44a 1502EOF
5f8d5c96 1503
76ffb43d 1504print <<"EOF" if (!$no_threads && !$threads);
5f8d5c96
BM
1505
1506The library could not be configured for supporting multi-threaded
1507applications as the compiler options required on this system are not known.
ff1b7e09 1508See file INSTALL for details if you need multi-threading.
ec577822
BM
1509EOF
1510
76ffb43d 1511print <<"EOF" if ($no_shared_warn);
2964ba8c 1512
2e31ef03
RS
1513You gave the option 'shared', which is not supported on this platform, so
1514we will pretend you gave the option 'no-shared'. If you know how to implement
1515shared libraries, please let us know (but please first make sure you have
1516tried with a current version of OpenSSL).
1517EOF
1518
76ffb43d 1519print <<"EOF" if ($warn_make_depend);
2e31ef03
RS
1520
1521*** Because of configuration changes, you MUST do the following before
1522*** building:
1523
1524 make depend
2964ba8c
RL
1525EOF
1526
d02b48c6
RE
1527exit(0);
1528
bd5192b1
RL
1529######################################################################
1530#
1531# Helpers and utility functions
1532#
1533
1534# Configuration file reading #########################################
1535
1536# Helper function to implement conditional inheritance depending on the
1537# value of $no_asm. Used in inherit_from values as follows:
1538#
1539# inherit_from => [ "template", asm("asm_tmpl") ]
1540#
1541sub asm {
1542 my @x = @_;
1543 sub {
1544 $no_asm ? () : @x;
1545 }
1546}
1547
88087414
RL
1548# Helper function to implement adding values to already existing configuration
1549# values. It handles elements that are ARRAYs, CODEs and scalars
1550sub _add {
1551 my $separator = shift;
1552
1553 # If there's any ARRAY in the collection of values, we will return
1554 # an ARRAY of combined values, otherwise a string of joined values
1555 # with $separator as the separator.
1556 my $found_array = 0;
1557
1558 my @values =
1559 map {
1560 if (ref($_) eq "ARRAY") {
1561 $found_array = 1;
1562 @$_;
1563 } else {
1564 $_;
1565 }
1566 } (@_);
1567
1568 if ($found_array) {
1569 [ @values ];
1570 } else {
1571 join($separator, @values);
1572 }
1573}
1574sub add_before {
1575 my $separator = shift;
1576 my @x = @_;
1577 sub { _add($separator, @x, @_) };
1578}
1579sub add {
1580 my $separator = shift;
1581 my @x = @_;
1582 sub { _add($separator, @_, @x) };
1583}
1584
bd5192b1
RL
1585# configuration reader, evaluates the input file as a perl script and expects
1586# it to fill %targets with target configurations. Those are then added to
1587# %table.
1588sub read_config {
1589 my $fname = shift;
1590 open(CONFFILE, "< $fname")
1591 or die "Can't open configuration file '$fname'!\n";
1592 my $x = $/;
1593 undef $/;
1594 my $content = <CONFFILE>;
1595 $/ = $x;
1596 close(CONFFILE);
1597 my %targets = ();
1598 {
1599 local %table = %::table; # Protect %table from tampering
1600
1601 eval $content;
1602 warn $@ if $@;
1603 }
1604
1605 # For each target, check that it's configured with a hash table.
1606 foreach (keys %targets) {
1607 if (ref($targets{$_}) ne "HASH") {
1608 if (ref($targets{$_}) eq "") {
1609 warn "Deprecated target configuration for $_, ignoring...\n";
1610 } else {
1611 warn "Misconfigured target configuration for $_ (should be a hash table), ignoring...\n";
1612 }
1613 delete $targets{$_};
1614 }
1615 }
1616
1617 %table = (%table, %targets);
1618
1619}
1620
1621# configuration resolver. Will only resolve all the lazy evalutation
1622# codeblocks for the chozen target and all those it inherits from,
1623# recursively
1624sub resolve_config {
1625 my $target = shift;
1626 my @breadcrumbs = @_;
1627
1628 if (grep { $_ eq $target } @breadcrumbs) {
1629 die "inherit_from loop! target backtrace:\n "
1630 ,$target,"\n ",join("\n ", @breadcrumbs),"\n";
1631 }
1632
1633 if (!defined($table{$target})) {
1634 warn "Warning! target $target doesn't exist!\n";
1635 return ();
1636 }
1637 # Recurse through all inheritances. They will be resolved on the
1638 # fly, so when this operation is done, they will all just be a
1639 # bunch of attributes with string values.
1640 # What we get here, though, are keys with references to lists of
1641 # the combined values of them all. We will deal with lists after
1642 # this stage is done.
1643 my %combined_inheritance = ();
1644 if ($table{$target}->{inherit_from}) {
1645 my @inherit_from =
1646 map { ref($_) eq "CODE" ? $_->() : $_ } @{$table{$target}->{inherit_from}};
1647 foreach (@inherit_from) {
1648 my %inherited_config = resolve_config($_, $target, @breadcrumbs);
1649
1650 # 'template' is a marker that's considered private to
1651 # the config that had it.
1652 delete $inherited_config{template};
1653
1654 map {
1655 if (!$combined_inheritance{$_}) {
1656 $combined_inheritance{$_} = [];
1657 }
1658 push @{$combined_inheritance{$_}}, $inherited_config{$_};
1659 } keys %inherited_config;
1660 }
1661 }
1662
1663 # We won't need inherit_from in this target any more, since we've
1664 # resolved all the inheritances that lead to this
1665 delete $table{$target}->{inherit_from};
1666
1667 # Now is the time to deal with those lists. Here's the place to
1668 # decide what shall be done with those lists, all based on the
1669 # values of the target we're currently dealing with.
1670 # - If a value is a coderef, it will be executed with the list of
1671 # inherited values as arguments.
1672 # - If the corresponding key doesn't have a value at all or is the
1673 # emoty string, the inherited value list will be run through the
1674 # default combiner (below), and the result becomes this target's
1675 # value.
1676 # - Otherwise, this target's value is assumed to be a string that
1677 # will simply override the inherited list of values.
88087414 1678 my $default_combiner = add(" ");
bd5192b1
RL
1679
1680 my %all_keys =
1681 map { $_ => 1 } (keys %combined_inheritance,
1682 keys %{$table{$target}});
1683 foreach (sort keys %all_keys) {
1684
1685 # Current target doesn't have a value for the current key?
1686 # Assign it the default combiner, the rest of this loop body
1687 # will handle it just like any other coderef.
1688 if (!exists $table{$target}->{$_}) {
1689 $table{$target}->{$_} = $default_combiner;
1690 }
1691
1692 my $valuetype = ref($table{$target}->{$_});
1693 if ($valuetype eq "CODE") {
1694 # CODE reference, execute it with the inherited values as
1695 # arguments.
1696 $table{$target}->{$_} =
1697 $table{$target}->{$_}->(@{$combined_inheritance{$_}});
88087414
RL
1698 } elsif ($valuetype eq "ARRAY" || $valuetype eq "") {
1699 # ARRAY or Scalar, just leave it as is.
bd5192b1
RL
1700 } else {
1701 # Some other type of reference that we don't handle.
1702 # Better to abort at this point.
1703 die "cannot handle reference type $valuetype,"
1704 ," found in target $target -> $_\n";
1705 }
1706 }
1707
1708 # Finally done, return the result.
1709 return %{$table{$target}};
1710}
1711
462ba4f6 1712sub usage
d02b48c6 1713 {
462ba4f6 1714 print STDERR $usage;
10a926c1 1715 print STDERR "\npick os/compiler from:\n";
1641cb60 1716 my $j=0;
6457ad15 1717 my $i;
10a926c1 1718 my $k=0;
6457ad15 1719 foreach $i (sort keys %table)
d02b48c6 1720 {
bd5192b1 1721 next if $table{$i}->{template};
462ba4f6 1722 next if $i =~ /^debug/;
10a926c1
UM
1723 $k += length($i) + 1;
1724 if ($k > 78)
1725 {
1726 print STDERR "\n";
1727 $k=length($i);
1728 }
1729 print STDERR $i . " ";
462ba4f6
UM
1730 }
1731 foreach $i (sort keys %table)
1732 {
bd5192b1 1733 next if $table{$i}->{template};
462ba4f6 1734 next if $i !~ /^debug/;
10a926c1
UM
1735 $k += length($i) + 1;
1736 if ($k > 78)
1737 {
1738 print STDERR "\n";
1739 $k=length($i);
1740 }
1741 print STDERR $i . " ";
d02b48c6 1742 }
10a926c1 1743 print STDERR "\n\nNOTE: If in doubt, on Unix-ish systems use './config'.\n";
462ba4f6 1744 exit(1);
d02b48c6
RE
1745 }
1746
107b5792
RL
1747sub run_dofile()
1748{
1749 my $in = shift;
1750 my $out = shift;
1751
1752 # should we remove $out ?
9ab6fc59 1753 system("$config{perl} -I. -Mconfigdata util/dofile.pl -o\"Configure\" $in > $out.new");
107b5792
RL
1754 exit 1 if $? != 0;
1755 rename("$out.new", $out) || die "Can't rename $out.new, $!";
1756}
1757
00ae96ca
RL
1758# Configuration printer ##############################################
1759
1760sub print_table_entry
1761{
1762 my $target = shift;
1763 my %target = resolve_config($target);
1764 my $type = shift;
1765
1766 # Don't print the templates
1767 return if $target{template};
1768
1769 my @sequence = (
f0bd4686 1770 "sys_id",
00ae96ca
RL
1771 "cc",
1772 "cflags",
1773 "debug_cflags",
1774 "release_cflags",
00ae96ca 1775 "thread_cflag",
f0bd4686
RL
1776 "unistd",
1777 "ld",
00ae96ca
RL
1778 "lflags",
1779 "debug_lflags",
1780 "release_lflags",
1781 "bn_ops",
1782 "cpuid_obj",
1783 "bn_obj",
1784 "ec_obj",
1785 "des_obj",
1786 "aes_obj",
1787 "bf_obj",
1788 "md5_obj",
1789 "sha1_obj",
1790 "cast_obj",
1791 "rc4_obj",
1792 "rmd160_obj",
1793 "rc5_obj",
1794 "wp_obj",
1795 "cmll_obj",
1796 "modes_obj",
f0bd4686 1797 "padlock_obj",
00ae96ca
RL
1798 "perlasm_scheme",
1799 "dso_scheme",
1800 "shared_target",
1801 "shared_cflag",
1802 "shared_ldflag",
1803 "shared_extension",
f0bd4686
RL
1804 "obj_extension",
1805 "exe_extension",
00ae96ca 1806 "ranlib",
f0bd4686 1807 "ar",
00ae96ca
RL
1808 "arflags",
1809 "multilib",
f0bd4686 1810 "build_scheme",
00ae96ca
RL
1811 );
1812
1813 if ($type eq "TABLE") {
1814 print "\n";
1815 print "*** $target\n";
1816 printf "\$%-12s = %s\n", $_, $target{$_} foreach (@sequence);
1817 } elsif ($type eq "HASH") {
1818 my $largest =
1819 length((sort { length($a) <=> length($b) } @sequence)[-1]);
1820 print " '$target' => {\n";
1821 foreach (@sequence) {
1822 if ($target{$_}) {
1823 print " '",$_,"'"," " x ($largest - length($_))," => '",$target{$_},"',\n";
1824 }
1825 }
1826 print " },\n";
1827 }
1828}
1829
1830# Utility routines ###################################################
1831
99aab161
UM
1832sub which
1833 {
1834 my($name)=@_;
1835 my $path;
1836 foreach $path (split /:/, $ENV{PATH})
1837 {
107b5792 1838 if (-f "$path/$name$target{exe_extension}" and -x _)
99aab161 1839 {
107b5792
RL
1840 return "$path/$name$target{exe_extension}" unless ($name eq "perl" and
1841 system("$path/$name$target{exe_extension} -e " . '\'exit($]<5.0);\''));
99aab161
UM
1842 }
1843 }
1844 }
1845
fe05264e
RL
1846sub quotify {
1847 my %processors = (
1848 perl => sub { my $x = shift;
1849 $x =~ s/([\\\$\@"])/\\$1/g;
1850 return '"'.$x.'"'; },
1851 );
1852 my $for = shift;
1853 my $processor =
1854 defined($processors{$for}) ? $processors{$for} : sub { shift; };
1855
1856 map { $processor->($_); } @_;
1857}
107b5792
RL
1858
1859# collect_information($filename, $line_continue, $regexp => $CODEref, ...)
1860# $filename is the file to read.
1861# $line_continue is either undef (which is a noop), or two arguments, where
1862# the first is a regexp detecting a line continuation ending, and the
1863# following argument is a CODEref that takes care of concatenating two
1864# lines.
1865# All following arguments are regex/CODEref pairs, where the regexp detects a
1866# line and the CODEref does something with the result of the regexp.
1867sub collect_information {
1868 my $filename = shift;
1869 my $line_continue_re = shift;
1870 my $line_concat = defined($line_continue_re) ? shift : undef;
1871 my %collectors = @_;
1872
1873 my $saved_line = "";
1874 open IN, $filename || die "unable to read $filename: $!\n";
1875 while(<IN>) {
1876 chomp;
1877 if (defined $line_concat) {
1878 $_ = $line_concat->($saved_line, $_);
1879 }
1880 if (defined $line_continue_re && /$line_continue_re/) {
1881 $saved_line = $_;
1882 next;
1883 }
1884 foreach my $re (keys %collectors) {
1885 if (/$re/) { $collectors{$re}->() };
1886 }
1887 }
1888 close IN;
1889}