]> git.ipfire.org Git - thirdparty/openssl.git/blame - Configure
Refactor config - consolidate and refresh print_table_entry
[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 = ();
3e83e686 153
bd5192b1 154# Forward declarations ###############################################
7ead0c89 155
bd5192b1
RL
156# read_config(filename)
157#
158# Reads a configuration file and populates %table with the contents
159# (which the configuration file places in %targets).
160sub read_config;
7d46b942 161
bd5192b1
RL
162# resolve_config(target)
163#
164# Resolves all the late evalutations, inheritances and so on for the
165# chosen target and any target it inherits from.
166sub resolve_config;
7d46b942 167
15c7adb0 168
f09e7ca9 169my ($vol, $dir, $dummy) = File::Spec->splitpath($0);
97a0cc52
RL
170my $pattern = File::Spec->catpath($vol, $dir, "Configurations/*.conf");
171foreach (sort glob($pattern) ) {
f09e7ca9
RS
172 &read_config($_);
173}
d02b48c6 174
e5f3045f 175my $prefix="";
6727565a 176my $libdir="";
462ba4f6 177my $openssldir="";
967d95f0 178my $exe_ext="";
122276a7 179my $install_prefix= "$ENV{'INSTALL_PREFIX'}";
cbfb39d1 180my $cross_compile_prefix="";
166c9cb0 181my $fipslibdir="/usr/local/ssl/fips-2.0/lib/";
1ab2f7f1 182my $nofipscanistercheck=0;
1ab2f7f1 183my $baseaddr="0xFB00000";
5f8d5c96
BM
184my $no_threads=0;
185my $threads=0;
c9a112f5
BM
186my $no_shared=0; # but "no-shared" is default
187my $zlib=1; # but "no-zlib" is default
47bbaa5b 188my $no_rfc3779=0;
1641cb60 189my $no_asm=0;
bc2aadad 190my $no_dso=0;
f5d7a031 191my @skip=();
42ba5d23 192my $Makefile="Makefile";
2613c1fa 193my $processor="";
0396479d 194my $default_ranlib;
99aab161 195my $perl;
1ab2f7f1 196my $fips=0;
99aab161 197
6b01bed2
VD
198# Known TLS and DTLS protocols
199my @tls = qw(ssl3 tls1 tls1_1 tls1_2);
200my @dtls = qw(dtls1 dtls1_2);
201
8b527be2
RL
202# Explicitelly known options that are possible to disable. They can
203# be regexps, and will be used like this: /^no-${option}$/
204# For developers: keep it sorted alphabetically
205
206my @disablables = (
207 "aes",
208 "asm",
209 "bf",
210 "camellia",
211 "capieng",
212 "cast",
48f14845 213 "chacha",
8b527be2
RL
214 "cmac",
215 "cms",
216 "comp",
3e45d393 217 "crypto-mdebug",
8b527be2
RL
218 "ct",
219 "deprecated",
220 "des",
221 "dgram",
222 "dh",
223 "dsa",
224 "dso",
a5ecdc6a 225 "dtls",
8b527be2
RL
226 "dynamic[-_]engine",
227 "ec",
228 "ec2m",
6b01bed2
VD
229 "ecdh",
230 "ecdsa",
8b527be2
RL
231 "ec_nistp_64_gcc_128",
232 "engine",
233 "err", # Really???
8b527be2
RL
234 "gost",
235 "heartbeats",
236 "hmac",
237 "hw(-.+)?",
238 "idea",
239 "jpake",
240 "locking", # Really???
241 "md2",
242 "md4",
243 "md5",
244 "mdc2",
245 "md[-_]ghost94",
246 "nextprotoneg",
247 "ocb",
248 "ocsp",
48f14845 249 "poly1305",
8b527be2
RL
250 "posix-io",
251 "psk",
252 "rc2",
253 "rc4",
254 "rc5",
255 "rdrand",
256 "rfc3779",
257 "rijndael", # Old AES name
258 "rmd160",
259 "rsa",
260 "scrypt",
261 "sct",
262 "sctp",
263 "seed",
264 "sha",
265 "shared",
266 "sock",
267 "srp",
268 "srtp",
269 "sse2",
270 "ssl",
8b527be2
RL
271 "ssl-trace",
272 "static-engine",
273 "stdio",
274 "store",
275 "threads",
276 "tls",
8b527be2
RL
277 "unit-test",
278 "whirlpool",
279 "zlib",
280 "zlib-dynamic",
281 );
6b01bed2
VD
282foreach my $proto ((@tls, @dtls))
283 {
284 push(@disablables, $proto);
285 push(@disablables, "$proto-method");
286 }
8b527be2 287
c9a112f5
BM
288# All of the following is disabled by default (RC5 was enabled before 0.9.8):
289
7a762197 290my %disabled = ( # "what" => "comment" [or special keyword "experimental"]
7d8bb912 291 "ec_nistp_64_gcc_128" => "default",
0423f812 292 "egd" => "default",
7d8bb912
BM
293 "jpake" => "experimental",
294 "md2" => "default",
295 "rc5" => "default",
c2e27310 296 "sctp" => "default",
7d8bb912 297 "shared" => "default",
93ab9e42 298 "ssl-trace" => "default",
ae3b4f23 299 "store" => "experimental",
e0fc7961 300 "unit-test" => "default",
7d8bb912 301 "zlib" => "default",
c2e27310
VD
302 "zlib-dynamic" => "default",
303 "crypto-mdebug" => "default",
7d8bb912 304 );
7a762197 305my @experimental = ();
c9a112f5 306
c569e206
RL
307# Note: => pair form used for aesthetics, not to truly make a hash table
308my @disable_cascades = (
309 # "what" => [ "cascade", ... ]
310 sub { $processor eq "386" }
311 => [ "sse2" ],
312 "ssl" => [ "ssl3" ],
313 "ssl3-method" => [ "ssl3" ],
314 "zlib" => [ "zlib-dynamic" ],
315 "rijndael" => [ "aes" ],
316 "des" => [ "mdc2" ],
317 "ec" => [ "ecdsa", "ecdh", "gost" ],
318 "dsa" => [ "gost" ],
319 "dh" => [ "gost" ],
320
321 "dgram" => [ "dtls" ],
322 "dtls" => [ @dtls ],
323
324 # SSL 3.0, (D)TLS 1.0 and TLS 1.1 require MD5 and SHA
325 "md5" => [ "ssl", "tls1", "tls1_1", "dtls1" ],
326 "sha" => [ "ssl", "tls1", "tls1_1", "dtls1" ],
327
328 # Additionally, SSL 3.0 requires either RSA or DSA+DH
329 sub { $disabled{rsa}
330 && ($disabled{dsa} || $disabled{dh}); }
331 => [ "ssl" ],
332
333 # (D)TLS 1.0 and TLS 1.1 also require either RSA or DSA+DH
334 # or ECDSA + ECDH. (D)TLS 1.2 has this requirement as well.
335 # (XXX: We don't support PSK-only builds).
336 sub { $disabled{rsa}
337 && ($disabled{dsa} || $disabled{dh})
338 && ($disabled{ecdsa} || $disabled{ecdh}); }
339 => [ "tls1", "tls1_1", "tls1_2",
340 "dtls1", "dtls1_2" ],
341
342 "tls" => [ @tls ],
343
344 # SRP and HEARTBEATS require TLSEXT
345 "tlsext" => [ "srp", "heartbeats" ],
346 );
347
348# Avoid protocol support holes. Also disable all versions below N, if version
349# N is disabled while N+1 is enabled.
350#
351my @list = (reverse @tls);
352while ((my $first, my $second) = (shift @list, shift @list)) {
353 last unless @list;
354 push @disable_cascades, ( sub { !$disabled{$first} && $disabled{$second} }
355 => [ @list ] );
356 unshift @list, $second;
357}
358my @list = (reverse @dtls);
359while ((my $first, my $second) = (shift @list, shift @list)) {
360 last unless @list;
361 push @disable_cascades, ( sub { !$disabled{$first} && $disabled{$second} }
362 => [ @list ] );
363 unshift @list, $second;
364}
365
366# Construct the string of what $depflags should look like with the defaults
367# from %disabled above. (we need this to see if we should advise the user
368# to run "make depend"):
369my $default_depflags = " ".join(" ",
370 map { my $x = $_; $x =~ tr{[a-z]-}{[A-Z]_}; "-DOPENSSL_NO_$x"; }
371 grep { $disabled{$_} !~ /\(no-depflags\)$/ }
372 sort keys %disabled);
7a762197
BM
373
374# Explicit "no-..." options will be collected in %disabled along with the defaults.
375# To remove something from %disabled, use "enable-foo" (unless it's experimental).
376# For symmetry, "disable-foo" is a synonym for "no-foo".
377
378# For features called "experimental" here, a more explicit "experimental-foo" is needed to enable.
379# We will collect such requests in @experimental.
380# To avoid accidental use of experimental features, applications will have to use -DOPENSSL_EXPERIMENTAL_FOO.
ab185b60
BM
381
382
d0590fe6 383my $no_sse2=0;
b6e4dac2 384
462ba4f6 385&usage if ($#ARGV < 0);
d02b48c6 386
fe05264e
RL
387my $flags="";
388my $depflags="";
389my $openssl_experimental_defines="";
390my $openssl_algorithm_defines="";
391my $openssl_thread_defines="";
cf1b7d96 392my $openssl_sys_defines="";
fe05264e
RL
393my $openssl_other_defines="";
394my $libs="";
395my $target="";
396my $options="";
98186eb4 397my $api;
451dc18f 398my $make_depend=0;
f9b3bff6 399my %withargs=();
9e43c6b5 400my $build_prefix = "release_";
c59cb511
RL
401
402my @argvcopy=@ARGV;
c59cb511 403
fe05264e
RL
404if (grep /^reconf(igure)?$/, @argvcopy) {
405 if (open IN, "<$Makefile") {
406 while (<IN>) {
407 chomp;
408 if (/^CONFIGURE_ARGS=\s*(.*)\s*/) {
409 my $line = $1;
410 if ($line =~ /^\s*\(/) {
411 # New form perl expression saved in Makefile, eval it
412 @argvcopy = eval $line;
413 } else {
414 # Older form, we split the string and hope for the best
415 @argvcopy = split /\s+/, $line;
416 }
417 die "Incorrect data to reconfigure, please do a normal configuration\n"
418 if (grep(/^reconf/,@argvcopy));
419 } elsif (/^CROSS_COMPILE=\s*(.*)/) {
420 $ENV{CROSS_COMPILE}=$1;
421 } elsif (/^CC=\s*(?:\$\(CROSS_COMPILE\))?(.*?)$/) {
422 $ENV{CC}=$1;
423 }
424 }
425 print "Reconfiguring with: ", join(" ",@argvcopy), "\n";
426 print " CROSS_COMPILE = ",$ENV{CROSS_COMPILE},"\n"
427 if $ENV{CROSS_COMPILE};
428 print " CC = ",$ENV{CC},"\n" if $ENV{CC};
429 close IN;
430 } else {
431 die "Insufficient data to reconfigure, please do a normal configuration\n";
432 }
433}
434
435
436my %unsupported_options = ();
437foreach (@argvcopy)
16b6081e 438 {
fe05264e 439 s /^-no-/no-/; # some people just can't read the instructions
c9a112f5 440
fe05264e
RL
441 # rewrite some options in "enable-..." form
442 s /^-?-?shared$/enable-shared/;
443 s /^sctp$/enable-sctp/;
444 s /^threads$/enable-threads/;
445 s /^zlib$/enable-zlib/;
446 s /^zlib-dynamic$/enable-zlib-dynamic/;
c9a112f5 447
fe05264e
RL
448 if (/^(no|disable|enable|experimental)-(.+)$/)
449 {
450 my $word = $2;
451 if (!grep { $word =~ /^${_}$/ } @disablables)
8b527be2 452 {
fe05264e
RL
453 $unsupported_options{$_} = 1;
454 next;
8b527be2 455 }
fe05264e
RL
456 }
457 if (/^no-(.+)$/ || /^disable-(.+)$/)
458 {
459 if (!($disabled{$1} eq "experimental"))
d02b48c6 460 {
fe05264e 461 foreach my $proto ((@tls, @dtls))
e172d60d 462 {
fe05264e 463 if ($1 eq "$proto-method")
3881d810 464 {
fe05264e
RL
465 $disabled{"$proto"} = "option($proto-method)";
466 last;
3881d810 467 }
fe05264e
RL
468 }
469 if ($1 eq "dtls")
470 {
471 foreach my $proto (@dtls)
6b01bed2 472 {
fe05264e 473 $disabled{$proto} = "option(dtls)";
6b01bed2 474 }
fe05264e
RL
475 }
476 elsif ($1 eq "ssl")
477 {
478 # Last one of its kind
479 $disabled{"ssl3"} = "option(ssl)";
480 }
481 elsif ($1 eq "tls")
482 {
483 # XXX: Tests will fail if all SSL/TLS
484 # protocols are disabled.
485 foreach my $proto (@tls)
7a762197 486 {
fe05264e 487 $disabled{$proto} = "option(tls)";
7a762197 488 }
fce0ba5f 489 }
fe05264e 490 else
b6e4dac2 491 {
fe05264e 492 $disabled{$1} = "option";
b6e4dac2 493 }
fe05264e
RL
494 }
495 }
496 elsif (/^enable-(.+)$/ || /^experimental-(.+)$/)
497 {
498 my $algo = $1;
499 if ($disabled{$algo} eq "experimental")
500 {
501 die "You are requesting an experimental feature; please say 'experimental-$algo' if you are sure\n"
502 unless (/^experimental-/);
503 push @experimental, $algo;
504 }
505 delete $disabled{$algo};
c9a112f5 506
fe05264e
RL
507 $threads = 1 if ($algo eq "threads");
508 }
509 elsif (/^--strict-warnings$/)
510 {
511 $strict_warnings = 1;
512 }
513 elsif (/^--debug$/)
514 {
515 $build_prefix = "debug_";
516 }
517 elsif (/^--release$/)
518 {
519 $build_prefix = "release_";
520 }
521 elsif (/^386$/)
522 { $processor=386; }
523 elsif (/^fips$/)
524 {
525 $fips=1;
526 }
527 elsif (/^rsaref$/)
528 {
529 # No RSAref support any more since it's not needed.
530 # The check for the option is there so scripts aren't
531 # broken
532 }
533 elsif (/^nofipscanistercheck$/)
534 {
535 $fips = 1;
536 $nofipscanistercheck = 1;
537 }
538 elsif (/^[-+]/)
539 {
540 if (/^--prefix=(.*)$/)
541 {
542 $prefix=$1;
c9a112f5 543 }
fe05264e 544 elsif (/^--api=(.*)$/)
0c28f277 545 {
fe05264e 546 $api=$1;
0c28f277 547 }
fe05264e 548 elsif (/^--libdir=(.*)$/)
9e43c6b5 549 {
fe05264e 550 $libdir=$1;
9e43c6b5 551 }
fe05264e 552 elsif (/^--openssldir=(.*)$/)
9e43c6b5 553 {
fe05264e 554 $openssldir=$1;
9e43c6b5 555 }
fe05264e 556 elsif (/^--install.prefix=(.*)$/)
d02b48c6 557 {
fe05264e 558 $install_prefix=$1;
d02b48c6 559 }
fe05264e 560 elsif (/^--with-zlib-lib=(.*)$/)
9fdb2cc5 561 {
fe05264e 562 $withargs{"zlib-lib"}=$1;
7d8bb912 563 }
fe05264e 564 elsif (/^--with-zlib-include=(.*)$/)
3eb0ed6d 565 {
fe05264e 566 $withargs{"zlib-include"}="-I$1";
462ba4f6 567 }
fe05264e 568 elsif (/^--with-fipslibdir=(.*)$/)
1ab2f7f1 569 {
fe05264e 570 $fipslibdir="$1/";
1ab2f7f1 571 }
fe05264e 572 elsif (/^--with-baseaddr=(.*)$/)
462ba4f6 573 {
fe05264e 574 $baseaddr="$1";
3eb0ed6d 575 }
fe05264e 576 elsif (/^--cross-compile-prefix=(.*)$/)
e5f3045f 577 {
fe05264e 578 $cross_compile_prefix=$1;
e5f3045f 579 }
fe05264e 580 elsif (/^--config=(.*)$/)
d02b48c6 581 {
fe05264e 582 read_config $1;
c59cb511 583 }
fe05264e 584 elsif (/^-[lL](.*)$/ or /^-Wl,/)
c9a112f5 585 {
fe05264e 586 $libs.=$_." ";
d02b48c6 587 }
fe05264e
RL
588 else # common if (/^[-+]/), just pass down...
589 {
590 $_ =~ s/%([0-9a-f]{1,2})/chr(hex($1))/gei;
591 $flags.=$_." ";
592 }
593 }
594 elsif ($_ =~ /^([^:]+):(.+)$/)
595 {
596 eval "\$table{\$1} = \"$2\""; # allow $xxx constructs in the string
597 $target=$1;
598 }
599 else
600 {
601 die "target already defined - $target (offending arg: $_)\n" if ($target ne "");
602 $target=$_;
603 }
604 unless ($_ eq $target || /^no-/ || /^disable-/)
605 {
606 # "no-..." follows later after implied disactivations
607 # have been derived. (Don't take this too seroiusly,
608 # we really only write OPTIONS to the Makefile out of
609 # nostalgia.)
610
611 if ($options eq "")
612 { $options = $_; }
613 else
614 { $options .= " ".$_; }
fbabb752 615 }
489eb740 616
98186eb4
VD
617 if (defined($api) && !exists $apitable->{$api}) {
618 die "***** Unsupported api compatibility level: $api\n",
619 }
620
489eb740
RL
621 if (keys %unsupported_options)
622 {
623 die "***** Unsupported options: ",
624 join(", ", keys %unsupported_options), "\n";
625 }
fbabb752 626 }
b6e4dac2 627
c569e206 628if ($fips)
a7a14a23 629 {
c569e206 630 delete $disabled{"shared"} if ($disabled{"shared"} =~ /^default/);
6b01bed2 631 }
c9a112f5 632
c569e206
RL
633my @tocheckfor = (keys %disabled);
634while (@tocheckfor) {
635 my %new_tocheckfor = ();
636 my @cascade_copy = (@disable_cascades);
637 while (@cascade_copy) {
638 my ($test, $descendents) = (shift @cascade_copy, shift @cascade_copy);
639 if (ref($test) eq "CODE" ? $test->() : defined($disabled{$test})) {
640 map {
641 $new_tocheckfor{$_} => 1; $disabled{$_} = "forced";
642 } grep { !defined($disabled{$_}) } @$descendents;
ef236ec3 643 }
c569e206
RL
644 }
645 @tocheckfor = (keys %new_tocheckfor);
646}
edc032b5 647
436a376b 648if ($target eq "TABLE") {
00ae96ca
RL
649 foreach (sort keys %table) {
650 print_table_entry($_, "TABLE");
651 }
652 exit 0;
436a376b
BM
653}
654
10a926c1 655if ($target eq "LIST") {
00ae96ca
RL
656 foreach (sort keys %table) {
657 print $_,"\n" unless $table{$_}->{template};
658 }
659 exit 0;
10a926c1
UM
660}
661
aaf878cc 662if ($target eq "HASH") {
00ae96ca
RL
663 print "%table = (\n";
664 foreach (sort keys %table) {
665 print_table_entry($_, "HASH");
666 }
667 exit 0;
aaf878cc
RL
668}
669
00ae96ca 670# Backward compatibility?
49e04548 671if ($target =~ m/^CygWin32(-.*)$/) {
00ae96ca 672 $target = "Cygwin".$1;
49e04548
RL
673}
674
c9a112f5
BM
675foreach (sort (keys %disabled))
676 {
677 $options .= " no-$_";
678
679 printf " no-%-12s %-10s", $_, "[$disabled{$_}]";
680
681 if (/^dso$/)
682 { $no_dso = 1; }
683 elsif (/^threads$/)
684 { $no_threads = 1; }
685 elsif (/^shared$/)
686 { $no_shared = 1; }
687 elsif (/^zlib$/)
688 { $zlib = 0; }
fbf002bb
DSH
689 elsif (/^static-engine$/)
690 { }
c9a112f5
BM
691 elsif (/^zlib-dynamic$/)
692 { }
c9a112f5
BM
693 elsif (/^sse2$/)
694 { $no_sse2 = 1; }
695 else
696 {
697 my ($ALGO, $algo);
30fafdeb 698 ($ALGO = $algo = $_) =~ tr/[\-a-z]/[_A-Z]/;
c9a112f5
BM
699
700 if (/^asm$/ || /^err$/ || /^hw$/ || /^hw-/)
701 {
702 $openssl_other_defines .= "#define OPENSSL_NO_$ALGO\n";
703 print " OPENSSL_NO_$ALGO";
fce0ba5f 704
5df70a9e
AP
705 if (/^err$/) { $flags .= "-DOPENSSL_NO_ERR "; }
706 elsif (/^asm$/) { $no_asm = 1; }
c9a112f5
BM
707 }
708 else
709 {
2a4af947
AP
710 ($ALGO,$algo) = ("RMD160","rmd160") if ($algo eq "ripemd");
711
c9a112f5
BM
712 $openssl_algorithm_defines .= "#define OPENSSL_NO_$ALGO\n";
713 print " OPENSSL_NO_$ALGO";
714
e36827f6
MC
715 push @skip, $algo;
716 # fix-up crypto/directory name(s)
717 $skip[$#skip]="whrlpool" if $algo eq "whirlpool";
718 $skip[$#skip]="ripemd" if $algo eq "rmd160";
2a4af947 719
e36827f6 720 print " (skip dir)";
ab185b60 721
e36827f6 722 $depflags .= " -DOPENSSL_NO_$ALGO";
c9a112f5
BM
723 }
724 }
725
726 print "\n";
727 }
728
7a762197 729my $exp_cflags = "";
ccc5784e 730
7a762197
BM
731foreach (sort @experimental)
732 {
733 my $ALGO;
734 ($ALGO = $_) =~ tr/[a-z]/[A-Z]/;
735
736 # opensslconf.h will set OPENSSL_NO_... unless OPENSSL_EXPERIMENTAL_... is defined
737 $openssl_experimental_defines .= "#define OPENSSL_NO_$ALGO\n";
738 $exp_cflags .= " -DOPENSSL_EXPERIMENTAL_$ALGO";
739 }
c9a112f5 740
9e0724a1
RL
741print "Configuring for $target\n";
742
743# Support for legacy targets having a name starting with 'debug-'
744my ($d, $t) = $target =~ m/^(debug-)?(.*)$/;
745if ($d) {
746 $build_prefix = "debug_";
747
748 # If we do not find debug-foo in the table, the target is set to foo.
749 if (!$table{$target}) {
750 $target = $t;
751 }
752}
753
754delete $table{$base_target}->{template}; # or the next test will fail.
755my %target = ( %{$table{$base_target}}, resolve_config($target) );
756
757&usage if (!%target || $target{template});
758
9be54812 759$exe_ext=".exe" if ($target eq "Cygwin" || $target eq "DJGPP" || $target =~ /^mingw/);
eef0c1f3 760$exe_ext=".nlm" if ($target =~ /netware/);
d0590fe6 761$exe_ext=".pm" if ($target =~ /vos/);
462ba4f6 762
28a80034
RL
763$default_ranlib= &which("ranlib") or $default_ranlib="true";
764$perl=$ENV{'PERL'} or $perl=&which("perl5") or $perl=&which("perl")
765 or $perl="perl";
dafd8333 766my $make = $ENV{'MAKE'} || "make";
28a80034 767
34775923 768$cross_compile_prefix=$ENV{'CROSS_COMPILE'} if $cross_compile_prefix eq "";
f99f41cf 769
d74dfafd
RL
770$prefix = "/usr/local" if !$prefix;
771$openssldir = "ssl" if !$openssldir;
772$openssldir = catdir($prefix, $openssldir)
773 unless file_name_is_absolute($openssldir);
d02b48c6 774
efadf60f 775
7f625320 776# Allow environment CC to override compiler...
bd5192b1 777my $cc = $ENV{CC} || $target{cc};
aaf878cc 778
b1245529 779# For cflags and lflags, add the debug_ or release_ attributes
aaf878cc
RL
780# Do it in such a way that no spurious space is appended (hence the grep).
781my $cflags = join(" ",
bd5192b1
RL
782 grep { $_ } ($target{cflags},
783 $target{$build_prefix."cflags"}));
aaf878cc 784my $lflags = join(" ",
bd5192b1
RL
785 grep { $_ } ($target{lflags},
786 $target{$build_prefix."lflags"}));
787
788my $unistd = $target{unistd};
789my $thread_cflag = $target{thread_cflag};
790my $sys_id = $target{sys_id};
791my $bn_ops = $target{bn_ops};
792my $cpuid_obj = $target{cpuid_obj};
793my $bn_obj = $target{bn_obj};
794my $ec_obj = $target{ec_obj};
795my $des_obj = $target{des_obj};
796my $aes_obj = $target{aes_obj};
797my $bf_obj = $target{bf_obj};
798my $md5_obj = $target{md5_obj};
799my $sha1_obj = $target{sha1_obj};
800my $cast_obj = $target{cast_obj};
801my $rc4_obj = $target{rc4_obj};
802my $rmd160_obj = $target{rmd160_obj};
803my $rc5_obj = $target{rc5_obj};
804my $wp_obj = $target{wp_obj};
805my $cmll_obj = $target{cmll_obj};
806my $modes_obj = $target{modes_obj};
807my $engines_obj = $target{engines_obj};
808my $chacha_obj = $target{chacha_obj};
809my $poly1305_obj = $target{poly1305_obj};
810my $perlasm_scheme = $target{perlasm_scheme};
811my $dso_scheme = $target{dso_scheme};
812my $shared_target = $target{shared_target};
813my $shared_cflag = $target{shared_cflag};
814my $shared_ldflag = $target{shared_ldflag};
815my $shared_extension = $target{shared_extension};
816my $ranlib = $ENV{'RANLIB'} || $target{ranlib};
970097ae 817my $ar = $ENV{'AR'} || "ar";
bd5192b1
RL
818my $arflags = $target{arflags};
819my $multilib = $target{multilib};
88087414
RL
820my @build_scheme =
821 ref($target{build_scheme}) eq "ARRAY"
822 ? @{$target{build_scheme}} : ( $target{build_scheme} );
d0d046ec 823
b730b03f
AP
824# if $prefix/lib$multilib is not an existing directory, then
825# assume that it's not searched by linker automatically, in
826# which case adding $multilib suffix causes more grief than
827# we're ready to tolerate, so don't...
828$multilib="" if !-d "$prefix/lib$multilib";
829
6a9d28f9
AP
830$libdir="lib$multilib" if $libdir eq "";
831
7a762197
BM
832$cflags = "$cflags$exp_cflags";
833
d6c76457
AP
834# '%' in $lflags is used to split flags to "pre-" and post-flags
835my ($prelflags,$postlflags)=split('%',$lflags);
836if (defined($postlflags)) { $lflags=$postlflags; }
837else { $lflags=$prelflags; undef $prelflags; }
838
cbecd29a
AP
839if ($target =~ /^mingw/ && `$cc --target-help 2>&1` !~ m/\-mno\-cygwin/m)
840 {
841 $cflags =~ s/\-mno\-cygwin\s*//;
842 $shared_ldflag =~ s/\-mno\-cygwin\s*//;
843 }
844
63d8834c
AP
845if ($target =~ /linux.*\-mips/ && !$no_asm && $flags !~ /\-m(ips|arch=)/) {
846 # minimally required architecture flags for assembly modules
847 $cflags="-mips2 $cflags" if ($target =~ /mips32/);
848 $cflags="-mips3 $cflags" if ($target =~ /mips64/);
849}
850
2964ba8c 851my $no_shared_warn=0;
14bcdb08 852my $no_user_cflags=0;
2964ba8c 853
14bcdb08
AP
854if ($flags ne "") { $cflags="$flags$cflags"; }
855else { $no_user_cflags=1; }
5f8d5c96 856
bc2aadad
GT
857# The DSO code currently always implements all functions so that no
858# applications will have to worry about that from a compilation point
859# of view. However, the "method"s may return zero unless that platform
860# has support compiled in for them. Currently each method is enabled
861# by a define "DSO_<name>" ... we translate the "dso_scheme" config
862# string entry into using the following logic;
eca57e92 863my $dso_cflags;
bc2aadad
GT
864if (!$no_dso && $dso_scheme ne "")
865 {
9ec0126e 866 $dso_scheme =~ tr/[a-z]/[A-Z]/;
bc2aadad
GT
867 if ($dso_scheme eq "DLFCN")
868 {
eca57e92 869 $dso_cflags = "-DDSO_DLFCN -DHAVE_DLFCN_H";
bc2aadad
GT
870 }
871 elsif ($dso_scheme eq "DLFCN_NO_H")
872 {
eca57e92 873 $dso_cflags = "-DDSO_DLFCN";
bc2aadad
GT
874 }
875 else
876 {
eca57e92 877 $dso_cflags = "-DDSO_$dso_scheme";
bc2aadad 878 }
eca57e92 879 $cflags = "$dso_cflags $cflags";
bc2aadad 880 }
9ec0126e 881
5f8d5c96 882my $thread_cflags;
fb044c59 883my $thread_defines;
5f8d5c96
BM
884if ($thread_cflag ne "(unknown)" && !$no_threads)
885 {
886 # If we know how to do it, support threads by default.
887 $threads = 1;
888 }
14bcdb08 889if ($thread_cflag eq "(unknown)" && $threads)
5f8d5c96 890 {
14bcdb08
AP
891 # If the user asked for "threads", [s]he is also expected to
892 # provide any system-dependent compiler options that are
893 # necessary.
894 if ($no_user_cflags)
895 {
896 print "You asked for multi-threading support, but didn't\n";
897 print "provide any system-specific compiler options\n";
898 exit(1);
899 }
cf1b7d96
RL
900 $thread_cflags="-DOPENSSL_THREADS $cflags" ;
901 $thread_defines .= "#define OPENSSL_THREADS\n";
5f8d5c96
BM
902 }
903else
904 {
cf1b7d96
RL
905 $thread_cflags="-DOPENSSL_THREADS $thread_cflag $cflags";
906 $thread_defines .= "#define OPENSSL_THREADS\n";
a7b991bd
BM
907# my $def;
908# foreach $def (split ' ',$thread_cflag)
909# {
910# if ($def =~ s/^-D// && $def !~ /^_/)
911# {
912# $thread_defines .= "#define $def\n";
913# }
914# }
fce0ba5f 915 }
5f8d5c96 916
95649972 917$lflags="$libs$lflags" if ($libs ne "");
d02b48c6 918
dfeab068
RE
919if ($no_asm)
920 {
9fdb2cc5
DSH
921 $cflags=~s/\-D[BL]_ENDIAN// if ($fips);
922 $thread_cflags=~s/\-D[BL]_ENDIAN// if ($fips);
dfeab068 923 }
6f7ac8e1 924
5f8d5c96
BM
925if ($threads)
926 {
14bcdb08 927 $cflags=$thread_cflags;
e452de9d
RL
928 $openssl_thread_defines .= $thread_defines;
929 }
930
931if ($zlib)
932 {
933 $cflags = "-DZLIB $cflags";
c9a112f5
BM
934 if (defined($disabled{"zlib-dynamic"}))
935 {
cc7399e7
DSH
936 if (defined($withargs{"zlib-lib"}))
937 {
938 $lflags = "$lflags -L" . $withargs{"zlib-lib"} . " -lz";
939 }
940 else
941 {
942 $lflags = "$lflags -lz";
943 }
c9a112f5
BM
944 }
945 else
946 {
947 $cflags = "-DZLIB_SHARED $cflags";
948 }
5f8d5c96
BM
949 }
950
98186eb4
VD
951# With "deprecated" disable all deprecated features.
952if (defined($disabled{"deprecated"})) {
953 $api = $maxapi;
954}
07c4c14c 955
d10dac11 956# You will find shlib_mark1 and shlib_mark2 explained in Makefile.in
a22fb399 957my $shared_mark = "";
6f7ac8e1
AP
958if ($shared_target eq "")
959 {
9fdb2cc5 960 $no_shared_warn = 1 if !$no_shared && !$fips;
6f7ac8e1
AP
961 $no_shared = 1;
962 }
963if (!$no_shared)
b436a982 964 {
a22fb399
RL
965 if ($shared_cflag ne "")
966 {
28e276f1 967 $cflags = "$shared_cflag -DOPENSSL_PIC $cflags";
a22fb399 968 }
d2dcf4f4 969 }
b436a982 970
88087414 971if ($build_scheme[0] ne "mk1mf")
ecd45314 972 {
4c1a6e00 973 # add {no-}static-engine to options to allow mkdef.pl to work without extra arguments
fbf002bb
DSH
974 if ($no_shared)
975 {
976 $openssl_other_defines.="#define OPENSSL_NO_DYNAMIC_ENGINE\n";
4c1a6e00 977 $options.=" static-engine";
fbf002bb
DSH
978 }
979 else
980 {
981 $openssl_other_defines.="#define OPENSSL_NO_STATIC_ENGINE\n";
4c1a6e00 982 $options.=" no-static-engine";
fbf002bb 983 }
6cb68620 984 }
ecd45314 985
c313e32a
AP
986#
987# Platform fix-ups
988#
989if ($target =~ /\-icc$/) # Intel C compiler
1a979201 990 {
1187ee7d
AP
991 my $iccver=0;
992 if (open(FD,"$cc -V 2>&1 |"))
993 {
994 while(<FD>) { $iccver=$1 if (/Version ([0-9]+)\./); }
995 close(FD);
996 }
1a979201
AP
997 if ($iccver>=8)
998 {
cf5ecc3e 999 $cflags=~s/\-KPIC/-fPIC/;
1a979201
AP
1000 # Eliminate unnecessary dependency from libirc.a. This is
1001 # essential for shared library support, as otherwise
1002 # apps/openssl can end up in endless loop upon startup...
1003 $cflags.=" -Dmemcpy=__builtin_memcpy -Dmemset=__builtin_memset";
1004 }
1187ee7d
AP
1005 if ($iccver>=9)
1006 {
cf5ecc3e
AP
1007 $lflags.=" -i-static";
1008 $lflags=~s/\-no_cpprt/-no-cpprt/;
1187ee7d
AP
1009 }
1010 if ($iccver>=10)
1011 {
cf5ecc3e
AP
1012 $lflags=~s/\-i\-static/-static-intel/;
1013 }
1014 if ($iccver>=11)
1015 {
1016 $cflags.=" -no-intel-extensions"; # disable Cilk
1017 $lflags=~s/\-no\-cpprt/-no-cxxlib/;
1187ee7d 1018 }
1a979201
AP
1019 }
1020
c313e32a
AP
1021# Unlike other OSes (like Solaris, Linux, Tru64, IRIX) BSD run-time
1022# linkers (tested OpenBSD, NetBSD and FreeBSD) "demand" RPATH set on
1023# .so objects. Apparently application RPATH is not global and does
1024# not apply to .so linked with other .so. Problem manifests itself
1025# when libssl.so fails to load libcrypto.so. One can argue that we
1026# should engrave this into Makefile.shared rules or into BSD-* config
1027# lines above. Meanwhile let's try to be cautious and pass -rpath to
1028# linker only when --prefix is not /usr.
1029if ($target =~ /^BSD\-/)
1030 {
c64879d3 1031 $shared_ldflag.=" -Wl,-rpath,\$\$(LIBRPATH)" if ($prefix !~ m|^/usr[/]*$|);
c313e32a
AP
1032 }
1033
cf1b7d96
RL
1034if ($sys_id ne "")
1035 {
68b00c23
RS
1036 #$cflags="-DOPENSSL_SYS_$sys_id $cflags";
1037 $openssl_sys_defines="#define OPENSSL_SYS_$sys_id\n";
cf1b7d96
RL
1038 }
1039
0396479d
BM
1040if ($ranlib eq "")
1041 {
1042 $ranlib = $default_ranlib;
1043 }
1044
9e0724a1
RL
1045if (!$no_asm) {
1046 $cpuid_obj=$table{BASE}->{cpuid_obj} if ($processor eq "386");
1047 $cpuid_obj.=" uplink.o uplink-x86.o" if ($cflags =~ /\-DOPENSSL_USE_APPLINK/);
1750ebcb 1048
9e0724a1 1049 $bn_obj =~ s/\w+-gf2m.o// if (defined($disabled{ec2m}));
f8c469de 1050
9e0724a1
RL
1051 # bn-586 is the only one implementing bn_*_part_words
1052 $cflags.=" -DOPENSSL_BN_ASM_PART_WORDS" if ($bn_obj =~ /bn-586/);
1053 $cflags.=" -DOPENSSL_IA32_SSE2" if (!$no_sse2 && $bn_obj =~ /86/);
dfeab068 1054
9e0724a1
RL
1055 $cflags.=" -DOPENSSL_BN_ASM_MONT" if ($bn_obj =~ /-mont/);
1056 $cflags.=" -DOPENSSL_BN_ASM_MONT5" if ($bn_obj =~ /-mont5/);
1057 $cflags.=" -DOPENSSL_BN_ASM_GF2m" if ($bn_obj =~ /-gf2m/);
5ac7bde7 1058
9e0724a1 1059 if ($fips) {
1ab2f7f1 1060 $openssl_other_defines.="#define OPENSSL_FIPS\n";
9e0724a1 1061 }
1ab2f7f1 1062
9e0724a1 1063 if ($sha1_obj =~ /\.o$/) {
d0590fe6
AP
1064 $cflags.=" -DSHA1_ASM" if ($sha1_obj =~ /sx86/ || $sha1_obj =~ /sha1/);
1065 $cflags.=" -DSHA256_ASM" if ($sha1_obj =~ /sha256/);
1066 $cflags.=" -DSHA512_ASM" if ($sha1_obj =~ /sha512/);
9e0724a1
RL
1067 if ($sha1_obj =~ /sse2/) {
1068 if ($no_sse2) {
1069 $sha1_obj =~ s/\S*sse2\S+//;
1070 } elsif ($cflags !~ /OPENSSL_IA32_SSE2/) {
1071 $cflags.=" -DOPENSSL_IA32_SSE2";
d0590fe6 1072 }
58964a49 1073 }
9e0724a1
RL
1074 }
1075 if ($md5_obj =~ /\.o$/) {
58964a49 1076 $cflags.=" -DMD5_ASM";
9e0724a1
RL
1077 }
1078 $cast_obj=$table{BASE}->{cast_obj} if (!$no_shared); # CAST assembler is not PIC
1079 if ($rmd160_obj =~ /\.o$/) {
58964a49 1080 $cflags.=" -DRMD160_ASM";
9e0724a1
RL
1081 }
1082 if ($aes_obj =~ /\.o$/) {
e8d93e34 1083 $cflags.=" -DAES_ASM" if ($aes_obj =~ m/\baes\-/);;
77aae965 1084 # aes-ctr.o is not a real file, only indication that assembler
874a3757 1085 # module implements AES_ctr32_encrypt...
77aae965 1086 $cflags.=" -DAES_CTR_ASM" if ($aes_obj =~ s/\s*aes\-ctr\.o//);
478b50cf 1087 # aes-xts.o indicates presence of AES_xts_[en|de]crypt...
77aae965 1088 $cflags.=" -DAES_XTS_ASM" if ($aes_obj =~ s/\s*aes\-xts\.o//);
1db4a63b 1089 $aes_obj =~ s/\s*(vpaes|aesni)\-x86\.o//g if ($no_sse2);
8ca28da0 1090 $cflags.=" -DVPAES_ASM" if ($aes_obj =~ m/vpaes/);
993adc05 1091 $cflags.=" -DBSAES_ASM" if ($aes_obj =~ m/bsaes/);
9e0724a1
RL
1092 }
1093 if ($wp_obj =~ /mmx/ && $processor eq "386") {
1094 $wp_obj=$table{BASE}->{wp_obj};
1095 } elsif (!$disabled{"whirlpool"}) {
4c5e19b6 1096 $cflags.=" -DWHIRLPOOL_ASM";
9e0724a1
RL
1097 }
1098 if ($modes_obj =~ /ghash\-/) {
8a1c92ce 1099 $cflags.=" -DGHASH_ASM";
9e0724a1
RL
1100 }
1101 if ($ec_obj =~ /ecp_nistz256/) {
84714790 1102 $cflags.=" -DECP_NISTZ256_ASM";
9e0724a1
RL
1103 }
1104 if ($poly1305_obj =~ /\.o$/) {
22c2e80f 1105 $cflags.=" -DPOLY1305_ASM";
9e0724a1
RL
1106 }
1107}
d02b48c6 1108
1ed0c662
RL
1109# "Stringify" the C flags string. This permits it to be made part of a string
1110# and works as well on command lines.
1111$cflags =~ s/([\\\"])/\\\1/g;
1112
0973910f 1113my $version = "unknown";
fc6a6a10 1114my $version_num = "unknown";
0973910f
UM
1115my $major = "unknown";
1116my $minor = "unknown";
b436a982
RL
1117my $shlib_version_number = "unknown";
1118my $shlib_version_history = "unknown";
1119my $shlib_major = "unknown";
1120my $shlib_minor = "unknown";
0973910f 1121
dee502be 1122open(IN,'<include/openssl/opensslv.h') || die "unable to read opensslv.h:$!\n";
0973910f
UM
1123while (<IN>)
1124 {
1125 $version=$1 if /OPENSSL.VERSION.TEXT.*OpenSSL (\S+) /;
98186eb4 1126 $version_num=$1 if /OPENSSL.VERSION.NUMBER.*(0x\S+)/;
b436a982
RL
1127 $shlib_version_number=$1 if /SHLIB_VERSION_NUMBER *"([^"]+)"/;
1128 $shlib_version_history=$1 if /SHLIB_VERSION_HISTORY *"([^"]*)"/;
0973910f
UM
1129 }
1130close(IN);
b436a982 1131if ($shlib_version_history ne "") { $shlib_version_history .= ":"; }
0973910f 1132
1fac96e4 1133if ($version =~ /(^[0-9]*)\.([0-9\.]*)/)
0973910f
UM
1134 {
1135 $major=$1;
1136 $minor=$2;
1137 }
1138
b436a982
RL
1139if ($shlib_version_number =~ /(^[0-9]*)\.([0-9\.]*)/)
1140 {
1141 $shlib_major=$1;
1142 $shlib_minor=$2;
1143 }
1144
98186eb4
VD
1145if (defined($api)) {
1146 my $apiflag = sprintf("-DOPENSSL_API_COMPAT=%s", $apitable->{$api});
1147 $default_depflags .= " $apiflag";
1148 $cflags .= " $apiflag";
1149}
1150
58dd1ce9
EK
1151my $ecc = $cc;
1152$ecc = "clang" if `$cc --version 2>&1` =~ /clang/;
1153
0c28f277
DSH
1154if ($strict_warnings)
1155 {
1156 my $wopt;
f386742c 1157 die "ERROR --strict-warnings requires gcc or clang" unless ($ecc =~ /gcc(-\d(\.\d)*)?$/ or $ecc =~ /clang$/);
0c28f277
DSH
1158 foreach $wopt (split /\s+/, $gcc_devteam_warn)
1159 {
6703c4ea 1160 $cflags .= " $wopt" unless ($cflags =~ /(^|\s)$wopt(\s|$)/)
0c28f277 1161 }
190c8c60
BL
1162 if ($ecc eq "clang")
1163 {
1164 foreach $wopt (split /\s+/, $clang_devteam_warn)
1165 {
6703c4ea 1166 $cflags .= " $wopt" unless ($cflags =~ /(^|\s)$wopt(\s|$)/)
190c8c60
BL
1167 }
1168 }
a1d3f3d1
RL
1169 if ($target !~ /^mingw/)
1170 {
1171 foreach $wopt (split /\s+/, $memleak_devteam_backtrace)
1172 {
1173 $cflags .= " $wopt" unless ($cflags =~ /(^|\s)$wopt(\s|$)/)
1174 }
28cbe2ab
BL
1175 if ($target =~ /^BSD-/)
1176 {
1177 $lflags .= " -lexecinfo";
1178 }
1179 }
0c28f277
DSH
1180 }
1181
d10dac11 1182open(IN,"<Makefile.in") || die "unable to read Makefile.in$!\n";
c2aa4f20
RL
1183unlink("$Makefile.new") || die "unable to remove old $Makefile.new:$!\n" if -e "$Makefile.new";
1184open(OUT,">$Makefile.new") || die "unable to create $Makefile.new:$!\n";
d10dac11 1185print OUT "### Generated automatically from Makefile.in by Configure.\n\n";
f5d7a031 1186my $sdirs=0;
edd4d402 1187
d02b48c6
RE
1188while (<IN>)
1189 {
67475a7e 1190 chomp;
f5d7a031 1191 $sdirs = 1 if /^SDIRS=/;
f5d7a031
UM
1192 if ($sdirs) {
1193 my $dir;
1194 foreach $dir (@skip) {
ed551cdd
DSH
1195 s/(\s)$dir /$1/;
1196 s/\s$dir$//;
f5d7a031
UM
1197 }
1198 }
f6f0420d 1199 $sdirs = 0 unless /\\$/;
7e23e857 1200 s/fips // if (/^DIRS=/ && !$fips);
a63bf2c5 1201 s/engines // if (/^DIRS=/ && $disabled{"engine"});
0973910f
UM
1202 s/^VERSION=.*/VERSION=$version/;
1203 s/^MAJOR=.*/MAJOR=$major/;
1204 s/^MINOR=.*/MINOR=$minor/;
b436a982
RL
1205 s/^SHLIB_VERSION_NUMBER=.*/SHLIB_VERSION_NUMBER=$shlib_version_number/;
1206 s/^SHLIB_VERSION_HISTORY=.*/SHLIB_VERSION_HISTORY=$shlib_version_history/;
1207 s/^SHLIB_MAJOR=.*/SHLIB_MAJOR=$shlib_major/;
1208 s/^SHLIB_MINOR=.*/SHLIB_MINOR=$shlib_minor/;
a22fb399 1209 s/^SHLIB_EXT=.*/SHLIB_EXT=$shared_extension/;
e5f3045f 1210 s/^INSTALLTOP=.*$/INSTALLTOP=$prefix/;
c23632d3 1211 s/^MULTILIB=.*$/MULTILIB=$multilib/;
462ba4f6 1212 s/^OPENSSLDIR=.*$/OPENSSLDIR=$openssldir/;
6727565a 1213 s/^LIBDIR=.*$/LIBDIR=$libdir/;
e5f3045f 1214 s/^INSTALL_PREFIX=.*$/INSTALL_PREFIX=$install_prefix/;
dfeab068 1215 s/^PLATFORM=.*$/PLATFORM=$target/;
31ff97b2 1216 s/^OPTIONS=.*$/OPTIONS=$options/;
fe05264e 1217 my $argvstring = "(".join(", ", map { quotify("perl", $_) } @argvcopy).")";
c59cb511 1218 s/^CONFIGURE_ARGS=.*$/CONFIGURE_ARGS=$argvstring/;
cbfb39d1
AP
1219 if ($cross_compile_prefix)
1220 {
8aab301b
DSH
1221 s/^CC=.*$/CROSS_COMPILE= $cross_compile_prefix\nCC= \$\(CROSS_COMPILE\)$cc/;
1222 s/^AR=\s*/AR= \$\(CROSS_COMPILE\)/;
1223 s/^NM=\s*/NM= \$\(CROSS_COMPILE\)/;
1224 s/^RANLIB=\s*/RANLIB= \$\(CROSS_COMPILE\)/;
1225 s/^MAKEDEPPROG=.*$/MAKEDEPPROG= \$\(CROSS_COMPILE\)$cc/ if $cc eq "gcc";
cbfb39d1
AP
1226 }
1227 else {
1228 s/^CC=.*$/CC= $cc/;
8844a69c 1229 s/^AR=\s*ar/AR= $ar/;
cbfb39d1 1230 s/^RANLIB=.*/RANLIB= $ranlib/;
58dd1ce9 1231 s/^MAKEDEPPROG=.*$/MAKEDEPPROG= $cc/ if $ecc eq "gcc" || $ecc eq "clang";
cbfb39d1 1232 }
d02b48c6 1233 s/^CFLAG=.*$/CFLAG= $cflags/;
7a762197 1234 s/^DEPFLAG=.*$/DEPFLAG=$depflags/;
d6c76457 1235 s/^PEX_LIBS=.*$/PEX_LIBS= $prelflags/;
d02b48c6 1236 s/^EX_LIBS=.*$/EX_LIBS= $lflags/;
967d95f0 1237 s/^EXE_EXT=.*$/EXE_EXT= $exe_ext/;
14e21f86 1238 s/^CPUID_OBJ=.*$/CPUID_OBJ= $cpuid_obj/;
06287285 1239 s/^BN_ASM=.*$/BN_ASM= $bn_obj/;
6019cdd3 1240 s/^EC_ASM=.*$/EC_ASM= $ec_obj/;
d02b48c6 1241 s/^DES_ENC=.*$/DES_ENC= $des_obj/;
0ddd3ea2 1242 s/^AES_ENC=.*$/AES_ENC= $aes_obj/;
d02b48c6 1243 s/^BF_ENC=.*$/BF_ENC= $bf_obj/;
58964a49
RE
1244 s/^CAST_ENC=.*$/CAST_ENC= $cast_obj/;
1245 s/^RC4_ENC=.*$/RC4_ENC= $rc4_obj/;
1246 s/^RC5_ENC=.*$/RC5_ENC= $rc5_obj/;
1247 s/^MD5_ASM_OBJ=.*$/MD5_ASM_OBJ= $md5_obj/;
1248 s/^SHA1_ASM_OBJ=.*$/SHA1_ASM_OBJ= $sha1_obj/;
1249 s/^RMD160_ASM_OBJ=.*$/RMD160_ASM_OBJ= $rmd160_obj/;
ed26604a 1250 s/^WP_ASM_OBJ=.*$/WP_ASM_OBJ= $wp_obj/;
6a8517f2 1251 s/^CMLL_ENC=.*$/CMLL_ENC= $cmll_obj/;
8a1c92ce 1252 s/^MODES_ASM_OBJ.=*$/MODES_ASM_OBJ= $modes_obj/;
22c2e80f
AP
1253 s/^CHACHA_ENC=.*$/CHACHA_ENC= $chacha_obj/;
1254 s/^POLY1305_ASM_OBJ=.*$/POLY1305_ASM_OBJ= $poly1305_obj/;
ed28aef8 1255 s/^ENGINES_ASM_OBJ.=*$/ENGINES_ASM_OBJ= $engines_obj/;
fa8e921f 1256 s/^PERLASM_SCHEME=.*$/PERLASM_SCHEME= $perlasm_scheme/;
2613c1fa 1257 s/^PROCESSOR=.*/PROCESSOR= $processor/;
179add2b 1258 s/^ARFLAGS=.*/ARFLAGS= $arflags/;
99aab161 1259 s/^PERL=.*/PERL= $perl/;
ad2695b1
DSH
1260 s/^LIBZLIB=.*/LIBZLIB=$withargs{"zlib-lib"}/;
1261 s/^ZLIB_INCLUDE=.*/ZLIB_INCLUDE=$withargs{"zlib-include"}/;
1ab2f7f1 1262 s/^FIPSLIBDIR=.*/FIPSLIBDIR=$fipslibdir/;
d47d0d2b
DSH
1263 s/^FIPSCANLIB=.*/FIPSCANLIB=libcrypto/ if $fips;
1264 s/^SHARED_FIPS=.*/SHARED_FIPS=/;
1265 s/^SHLIBDIRS=.*/SHLIBDIRS= crypto ssl/;
1ab2f7f1 1266 s/^BASEADDR=.*/BASEADDR=$baseaddr/;
b436a982 1267 s/^SHLIB_TARGET=.*/SHLIB_TARGET=$shared_target/;
a22fb399
RL
1268 s/^SHLIB_MARK=.*/SHLIB_MARK=$shared_mark/;
1269 s/^SHARED_LIBS=.*/SHARED_LIBS=\$(SHARED_CRYPTO) \$(SHARED_SSL)/ if (!$no_shared);
0fd44e2d
RL
1270 if ($shared_extension ne "" && $shared_extension =~ /^\.s([ol])\.[^\.]*$/)
1271 {
1272 my $sotmp = $1;
07c08ed4
RL
1273 s/^SHARED_LIBS_LINK_EXTS=.*/SHARED_LIBS_LINK_EXTS=.s$sotmp/;
1274 }
1275 elsif ($shared_extension ne "" && $shared_extension =~ /^\.[^\.]*\.dylib$/)
1276 {
1277 s/^SHARED_LIBS_LINK_EXTS=.*/SHARED_LIBS_LINK_EXTS=.dylib/;
0fd44e2d
RL
1278 }
1279 elsif ($shared_extension ne "" && $shared_extension =~ /^\.s([ol])\.[^\.]*\.[^\.]*$/)
1280 {
1281 my $sotmp = $1;
1282 s/^SHARED_LIBS_LINK_EXTS=.*/SHARED_LIBS_LINK_EXTS=.s$sotmp.\$(SHLIB_MAJOR) .s$sotmp/;
1283 }
07c08ed4
RL
1284 elsif ($shared_extension ne "" && $shared_extension =~ /^\.[^\.]*\.[^\.]*\.dylib$/)
1285 {
1286 s/^SHARED_LIBS_LINK_EXTS=.*/SHARED_LIBS_LINK_EXTS=.\$(SHLIB_MAJOR).dylib .dylib/;
1287 }
a5595fde 1288 s/^SHARED_LDFLAGS=.*/SHARED_LDFLAGS=$shared_ldflag/;
d02b48c6
RE
1289 print OUT $_."\n";
1290 }
1291close(IN);
1292close(OUT);
d10dac11 1293rename($Makefile,"$Makefile.orig") || die "unable to rename $Makefile\n" if -e $Makefile;
c2aa4f20 1294rename("$Makefile.new",$Makefile) || die "unable to rename $Makefile.new\n";
f2d4be3b 1295
88087414 1296print "IsMK1MF =", ($build_scheme[0] eq "mk1mf" ? "yes" : "no"), "\n";
58964a49
RE
1297print "CC =$cc\n";
1298print "CFLAG =$cflags\n";
1299print "EX_LIBS =$lflags\n";
b7efa56a 1300print "CPUID_OBJ =$cpuid_obj\n";
06287285 1301print "BN_ASM =$bn_obj\n";
6019cdd3 1302print "EC_ASM =$ec_obj\n";
58964a49 1303print "DES_ENC =$des_obj\n";
0ddd3ea2 1304print "AES_ENC =$aes_obj\n";
58964a49
RE
1305print "BF_ENC =$bf_obj\n";
1306print "CAST_ENC =$cast_obj\n";
1307print "RC4_ENC =$rc4_obj\n";
1308print "RC5_ENC =$rc5_obj\n";
1309print "MD5_OBJ_ASM =$md5_obj\n";
1310print "SHA1_OBJ_ASM =$sha1_obj\n";
1311print "RMD160_OBJ_ASM=$rmd160_obj\n";
8a1c92ce
AP
1312print "CMLL_ENC =$cmll_obj\n";
1313print "MODES_OBJ =$modes_obj\n";
ed28aef8 1314print "ENGINES_OBJ =$engines_obj\n";
22c2e80f
AP
1315print "CHACHA_ENC =$chacha_obj\n";
1316print "POLY1305_OBJ =$poly1305_obj\n";
2613c1fa 1317print "PROCESSOR =$processor\n";
99aab161 1318print "RANLIB =$ranlib\n";
179add2b 1319print "ARFLAGS =$arflags\n";
99aab161 1320print "PERL =$perl\n";
d02b48c6 1321
1641cb60
BL
1322my $des_ptr=0;
1323my $des_risc1=0;
1324my $des_risc2=0;
1325my $des_unroll=0;
1326my $bn_ll=0;
1327my $def_int=2;
1328my $rc4_int=$def_int;
1329my $md2_int=$def_int;
1330my $idea_int=$def_int;
1331my $rc2_int=$def_int;
1332my $rc4_idx=0;
2dae04d0 1333my $rc4_chunk=0;
1641cb60
BL
1334my $bf_ptr=0;
1335my @type=("char","short","int","long");
1336my ($b64l,$b64,$b32,$b16,$b8)=(0,0,1,0,0);
62dc5aad 1337my $export_var_as_fn=0;
1641cb60
BL
1338
1339my $des_int;
d02b48c6
RE
1340
1341foreach (sort split(/\s+/,$bn_ops))
1342 {
1343 $des_ptr=1 if /DES_PTR/;
1344 $des_risc1=1 if /DES_RISC1/;
1345 $des_risc2=1 if /DES_RISC2/;
1346 $des_unroll=1 if /DES_UNROLL/;
1347 $des_int=1 if /DES_INT/;
1348 $bn_ll=1 if /BN_LLONG/;
1349 $rc4_int=0 if /RC4_CHAR/;
1350 $rc4_int=3 if /RC4_LONG/;
1351 $rc4_idx=1 if /RC4_INDEX/;
2dae04d0
AP
1352 $rc4_chunk=1 if /RC4_CHUNK/;
1353 $rc4_chunk=2 if /RC4_CHUNK_LL/;
d02b48c6
RE
1354 $md2_int=0 if /MD2_CHAR/;
1355 $md2_int=3 if /MD2_LONG/;
1356 $idea_int=1 if /IDEA_SHORT/;
1357 $idea_int=3 if /IDEA_LONG/;
1358 $rc2_int=1 if /RC2_SHORT/;
1359 $rc2_int=3 if /RC2_LONG/;
1360 $bf_ptr=1 if $_ eq "BF_PTR";
1361 $bf_ptr=2 if $_ eq "BF_PTR2";
d02b48c6 1362 ($b64l,$b64,$b32,$b16,$b8)=(0,1,0,0,0) if /SIXTY_FOUR_BIT/;
58964a49 1363 ($b64l,$b64,$b32,$b16,$b8)=(1,0,0,0,0) if /SIXTY_FOUR_BIT_LONG/;
d02b48c6
RE
1364 ($b64l,$b64,$b32,$b16,$b8)=(0,0,1,0,0) if /THIRTY_TWO_BIT/;
1365 ($b64l,$b64,$b32,$b16,$b8)=(0,0,0,1,0) if /SIXTEEN_BIT/;
1366 ($b64l,$b64,$b32,$b16,$b8)=(0,0,0,0,1) if /EIGHT_BIT/;
62dc5aad 1367 $export_var_as_fn=1 if /EXPORT_VAR_AS_FN/;
d02b48c6
RE
1368 }
1369
8e10f2b3 1370open(IN,'<crypto/opensslconf.h.in') || die "unable to read crypto/opensslconf.h.in:$!\n";
dee502be
RL
1371unlink("include/openssl/opensslconf.h.new") || die "unable to remove old include/openssl/opensslconf.h.new:$!\n" if -e "include/openssl/opensslconf.h.new";
1372open(OUT,'>include/openssl/opensslconf.h.new') || die "unable to create include/openssl/opensslconf.h.new:$!\n";
26dc267f 1373print OUT "/* opensslconf.h */\n";
fb044c59 1374print OUT "/* WARNING: Generated automatically from opensslconf.h.in by Configure. */\n\n";
26dc267f 1375
17e80c6b
RS
1376print OUT "#ifdef __cplusplus\n";
1377print OUT "extern \"C\" {\n";
1378print OUT "#endif\n";
26dc267f 1379print OUT "/* OpenSSL was configured with the following options: */\n";
98186eb4
VD
1380
1381my $openssl_api_defines = "";
1382if (defined($api)) {
1383 $openssl_api_defines = sprintf "#define OPENSSL_MIN_API %s\n", $apitable->{$api};
1384}
5031a89d 1385my $openssl_algorithm_defines_trans = $openssl_algorithm_defines;
7a762197 1386$openssl_experimental_defines =~ s/^\s*#\s*define\s+OPENSSL_NO_(.*)/#ifndef OPENSSL_EXPERIMENTAL_$1\n# ifndef OPENSSL_NO_$1\n# define OPENSSL_NO_$1\n# endif\n#endif/mg;
5031a89d 1387$openssl_algorithm_defines_trans =~ s/^\s*#\s*define\s+OPENSSL_(.*)/# if defined(OPENSSL_$1) \&\& !defined($1)\n# define $1\n# endif/mg;
cf1b7d96 1388$openssl_algorithm_defines =~ s/^\s*#\s*define\s+(.*)/#ifndef $1\n# define $1\n#endif/mg;
fb77c6fb 1389$openssl_algorithm_defines = " /* no ciphers excluded */\n" if $openssl_algorithm_defines eq "";
cf1b7d96
RL
1390$openssl_thread_defines =~ s/^\s*#\s*define\s+(.*)/#ifndef $1\n# define $1\n#endif/mg;
1391$openssl_sys_defines =~ s/^\s*#\s*define\s+(.*)/#ifndef $1\n# define $1\n#endif/mg;
1392$openssl_other_defines =~ s/^\s*#\s*define\s+(.*)/#ifndef $1\n# define $1\n#endif/mg;
98186eb4 1393
cf1b7d96 1394print OUT $openssl_sys_defines;
75e98d05 1395print OUT "#ifndef OPENSSL_DOING_MAKEDEPEND\n\n";
7a762197 1396print OUT $openssl_experimental_defines;
98186eb4 1397print OUT $openssl_api_defines;
7a762197 1398print OUT "\n";
cf1b7d96 1399print OUT $openssl_algorithm_defines;
7a762197 1400print OUT "\n#endif /* OPENSSL_DOING_MAKEDEPEND */\n\n";
cf1b7d96
RL
1401print OUT $openssl_thread_defines;
1402print OUT $openssl_other_defines,"\n";
26dc267f 1403
5031a89d
RL
1404print OUT "/* The OPENSSL_NO_* macros are also defined as NO_* if the application\n";
1405print OUT " asks for it. This is a transient feature that is provided for those\n";
1406print OUT " who haven't had the time to do the appropriate changes in their\n";
1407print OUT " applications. */\n";
1408print OUT "#ifdef OPENSSL_ALGORITHM_DEFINES\n";
1409print OUT $openssl_algorithm_defines_trans;
1410print OUT "#endif\n\n";
1411
b2dba9bf 1412print OUT "#define OPENSSL_CPUID_OBJ\n\n" if ($cpuid_obj ne "mem_clr.o");
ebaec63e 1413
d02b48c6
RE
1414while (<IN>)
1415 {
cd46aa4a 1416 if (/^#define\s+OPENSSLDIR/)
f9afd9f8
GT
1417 {
1418 my $foo = $openssldir;
1419 $foo =~ s/\\/\\\\/g;
1420 print OUT "#define OPENSSLDIR \"$foo\"\n";
1421 }
90819805 1422 elsif (/^#define\s+ENGINESDIR/)
f9afd9f8 1423 {
6a9d28f9 1424 my $foo = "$prefix/$libdir/engines";
f9afd9f8
GT
1425 $foo =~ s/\\/\\\\/g;
1426 print OUT "#define ENGINESDIR \"$foo\"\n";
1427 }
62dc5aad
RL
1428 elsif (/^#((define)|(undef))\s+OPENSSL_EXPORT_VAR_AS_FUNCTION/)
1429 { printf OUT "#undef OPENSSL_EXPORT_VAR_AS_FUNCTION\n"
1430 if $export_var_as_fn;
1431 printf OUT "#%s OPENSSL_EXPORT_VAR_AS_FUNCTION\n",
1432 ($export_var_as_fn)?"define":"undef"; }
e766a681
BM
1433 elsif (/^#define\s+OPENSSL_UNISTD/)
1434 {
e766a681
BM
1435 print OUT "#define OPENSSL_UNISTD $unistd\n";
1436 }
462ba4f6 1437 elsif (/^#((define)|(undef))\s+SIXTY_FOUR_BIT_LONG/)
d02b48c6
RE
1438 { printf OUT "#%s SIXTY_FOUR_BIT_LONG\n",($b64l)?"define":"undef"; }
1439 elsif (/^#((define)|(undef))\s+SIXTY_FOUR_BIT/)
1440 { printf OUT "#%s SIXTY_FOUR_BIT\n",($b64)?"define":"undef"; }
1441 elsif (/^#((define)|(undef))\s+THIRTY_TWO_BIT/)
1442 { printf OUT "#%s THIRTY_TWO_BIT\n",($b32)?"define":"undef"; }
1443 elsif (/^#((define)|(undef))\s+SIXTEEN_BIT/)
1444 { printf OUT "#%s SIXTEEN_BIT\n",($b16)?"define":"undef"; }
1445 elsif (/^#((define)|(undef))\s+EIGHT_BIT/)
1446 { printf OUT "#%s EIGHT_BIT\n",($b8)?"define":"undef"; }
1447 elsif (/^#((define)|(undef))\s+BN_LLONG\s*$/)
1448 { printf OUT "#%s BN_LLONG\n",($bn_ll)?"define":"undef"; }
bdb1d0c2
VD
1449 elsif (/^\#define\s+OSSL_DES_LONG\s+.*/)
1450 { printf OUT "#define OSSL_DES_LONG unsigned %s\n",
d02b48c6 1451 ($des_int)?'int':'long'; }
8e10f2b3 1452 elsif (/^\#(define|undef)\s+DES_PTR/)
d02b48c6
RE
1453 { printf OUT "#%s DES_PTR\n",($des_ptr)?'define':'undef'; }
1454 elsif (/^\#(define|undef)\s+DES_RISC1/)
1455 { printf OUT "#%s DES_RISC1\n",($des_risc1)?'define':'undef'; }
1456 elsif (/^\#(define|undef)\s+DES_RISC2/)
1457 { printf OUT "#%s DES_RISC2\n",($des_risc2)?'define':'undef'; }
1458 elsif (/^\#(define|undef)\s+DES_UNROLL/)
1459 { printf OUT "#%s DES_UNROLL\n",($des_unroll)?'define':'undef'; }
8e10f2b3 1460 elsif (/^#define\s+RC4_INT\s/)
d02b48c6 1461 { printf OUT "#define RC4_INT unsigned %s\n",$type[$rc4_int]; }
2dae04d0
AP
1462 elsif (/^#undef\s+RC4_CHUNK/)
1463 {
1464 printf OUT "#undef RC4_CHUNK\n" if $rc4_chunk==0;
1465 printf OUT "#define RC4_CHUNK unsigned long\n" if $rc4_chunk==1;
1466 printf OUT "#define RC4_CHUNK unsigned long long\n" if $rc4_chunk==2;
1467 }
8e10f2b3 1468 elsif (/^#((define)|(undef))\s+RC4_INDEX/)
d02b48c6 1469 { printf OUT "#%s RC4_INDEX\n",($rc4_idx)?"define":"undef"; }
8e7f966b 1470 elsif (/^#(define|undef)\s+I386_ONLY/)
c9a112f5 1471 { printf OUT "#%s I386_ONLY\n", ($processor eq "386")?
8e7f966b 1472 "define":"undef"; }
8e10f2b3 1473 elsif (/^#define\s+MD2_INT\s/)
d02b48c6 1474 { printf OUT "#define MD2_INT unsigned %s\n",$type[$md2_int]; }
8e10f2b3 1475 elsif (/^#define\s+IDEA_INT\s/)
d02b48c6 1476 {printf OUT "#define IDEA_INT unsigned %s\n",$type[$idea_int];}
8e10f2b3 1477 elsif (/^#define\s+RC2_INT\s/)
d02b48c6 1478 {printf OUT "#define RC2_INT unsigned %s\n",$type[$rc2_int];}
8e10f2b3 1479 elsif (/^#(define|undef)\s+BF_PTR/)
d02b48c6
RE
1480 {
1481 printf OUT "#undef BF_PTR\n" if $bf_ptr == 0;
1482 printf OUT "#define BF_PTR\n" if $bf_ptr == 1;
1483 printf OUT "#define BF_PTR2\n" if $bf_ptr == 2;
8e10f2b3 1484 }
d02b48c6
RE
1485 else
1486 { print OUT $_; }
1487 }
5dfc369f 1488close(IN);
17e80c6b
RS
1489print OUT "#ifdef __cplusplus\n";
1490print OUT "}\n";
1491print OUT "#endif\n";
5dfc369f 1492close(OUT);
dee502be
RL
1493rename("include/openssl/opensslconf.h","include/openssl/opensslconf.h.bak") || die "unable to rename include/openssl/opensslconf.h\n" if -e "include/openssl/opensslconf.h";
1494rename("include/openssl/opensslconf.h.new","include/openssl/opensslconf.h") || die "unable to rename include/openssl/opensslconf.h.new\n";
9becf666 1495
e766a681 1496
9becf666
DSH
1497# Fix the date
1498
d02b48c6
RE
1499print "SIXTY_FOUR_BIT_LONG mode\n" if $b64l;
1500print "SIXTY_FOUR_BIT mode\n" if $b64;
1501print "THIRTY_TWO_BIT mode\n" if $b32;
1502print "SIXTEEN_BIT mode\n" if $b16;
1503print "EIGHT_BIT mode\n" if $b8;
1504print "DES_PTR used\n" if $des_ptr;
1505print "DES_RISC1 used\n" if $des_risc1;
1506print "DES_RISC2 used\n" if $des_risc2;
1507print "DES_UNROLL used\n" if $des_unroll;
1508print "DES_INT used\n" if $des_int;
1509print "BN_LLONG mode\n" if $bn_ll;
1510print "RC4 uses u$type[$rc4_int]\n" if $rc4_int != $def_int;
1511print "RC4_INDEX mode\n" if $rc4_idx;
2dae04d0
AP
1512print "RC4_CHUNK is undefined\n" if $rc4_chunk==0;
1513print "RC4_CHUNK is unsigned long\n" if $rc4_chunk==1;
1514print "RC4_CHUNK is unsigned long long\n" if $rc4_chunk==2;
d02b48c6
RE
1515print "MD2 uses u$type[$md2_int]\n" if $md2_int != $def_int;
1516print "IDEA uses u$type[$idea_int]\n" if $idea_int != $def_int;
1517print "RC2 uses u$type[$rc2_int]\n" if $rc2_int != $def_int;
fce0ba5f
FLM
1518print "BF_PTR used\n" if $bf_ptr == 1;
1519print "BF_PTR2 used\n" if $bf_ptr == 2;
cba5068d 1520
d10dac11
RS
1521# Copy all Makefile.in to Makefile (except top-level)
1522use File::Find;
1523use IO::File;
1524find(sub {
1525 return if ($_ ne "Makefile.in" || $File::Find::dir eq ".");
1526 my $in = IO::File->new($_, "r") or
1527 die sprintf "Error reading Makefile.in in %s: !$\n",
1528 $File::Find::dir;
1529 my $out = IO::File->new("Makefile", "w") or
1530 die sprintf "Error writing Makefile in %s: !$\n",
1531 $File::Find::dir;
1532 print $out "# Generated from $_, do not edit\n";
1533 while (my $line = <$in>) { print $out $line }
1534 $in->close() or
1535 die sprintf "Error reading Makefile.in in %s: !$\n",
1536 $File::Find::dir;
1537 $out->close() or
ef30a684 1538 die sprintf "Error writing Makefile in %s: !$\n",
d10dac11
RS
1539 $File::Find::dir;
1540 }, ".");
1541
88087414
RL
1542my %builders = (
1543 unixmake => sub {
1544 my $perlguess = $perl =~ m@^/@ ? $perl : '/usr/local/bin/perl';
1545 my $make_command = "$make PERL=\'$perlguess\'";
1546 my $make_targets = "";
1547 $make_targets .= " depend" if $depflags ne $default_depflags && $make_depend;
1548 (system $make_command.$make_targets) == 0 or die "make $make_targets failed"
1549 if $make_targets ne "";
1550 &dofile("tools/c_rehash",$perlguess,
1551 '^#!/' => '#!%s',
1552 '^my \$dir;$' => 'my $dir = "' . $openssldir . '";',
1553 '^my \$prefix;$' => 'my $prefix = "' . $prefix . '";');
1554 &dofile("apps/CA.pl",$perlguess,
1555 '^#!/' => '#!%s');
1556 if ($depflags ne $default_depflags && !$make_depend) {
1557 $warn_make_depend++;
1558 }
1559 },
1560 mk1mf => sub {
664b9985 1561 open (OUT,">crypto/buildinf.h") || die "Can't open buildinf.h";
76ffb43d 1562 printf OUT <<"EOF";
57119943
BM
1563#ifndef MK1MF_BUILD
1564 /* auto-generated by Configure for crypto/cversion.c:
1565 * for Unix builds, crypto/Makefile.ssl generates functional definitions;
1566 * Windows builds (and other mk1mf builds) compile cversion.c with
1567 * -DMK1MF_BUILD and use definitions added to this file by util/mk1mf.pl. */
1568 #error "Windows builds (PLATFORM=$target) use mk1mf.pl-created Makefiles"
1569#endif
9e935d7e 1570EOF
8e10f2b3 1571 close(OUT);
8e10f2b3 1572
88087414
RL
1573 # create the ms/version32.rc file if needed
1574 if (! grep /^netware/, @build_scheme) {
1575 my ($v1, $v2, $v3, $v4);
1576 if ($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
1577 $v1=hex $1;
1578 $v2=hex $2;
1579 $v3=hex $3;
1580 $v4=hex $4;
88087414
RL
1581 }
1582 open (OUT,">ms/version32.rc") || die "Can't open ms/version32.rc";
1583 print OUT <<"EOF";
fc6a6a10
DSH
1584#include <winver.h>
1585
1586LANGUAGE 0x09,0x01
1587
15881 VERSIONINFO
1589 FILEVERSION $v1,$v2,$v3,$v4
1590 PRODUCTVERSION $v1,$v2,$v3,$v4
1591 FILEFLAGSMASK 0x3fL
1592#ifdef _DEBUG
1593 FILEFLAGS 0x01L
1594#else
1595 FILEFLAGS 0x00L
1596#endif
1597 FILEOS VOS__WINDOWS32
1598 FILETYPE VFT_DLL
1599 FILESUBTYPE 0x0L
1600BEGIN
1601 BLOCK "StringFileInfo"
1602 BEGIN
1603 BLOCK "040904b0"
1604 BEGIN
fce0ba5f 1605 // Required:
fc6a6a10
DSH
1606 VALUE "CompanyName", "The OpenSSL Project, http://www.openssl.org/\\0"
1607 VALUE "FileDescription", "OpenSSL Shared Library\\0"
1608 VALUE "FileVersion", "$version\\0"
1609#if defined(CRYPTO)
1610 VALUE "InternalName", "libeay32\\0"
1611 VALUE "OriginalFilename", "libeay32.dll\\0"
1612#elif defined(SSL)
1613 VALUE "InternalName", "ssleay32\\0"
1614 VALUE "OriginalFilename", "ssleay32.dll\\0"
a479d72d 1615#endif
fc6a6a10
DSH
1616 VALUE "ProductName", "The OpenSSL Toolkit\\0"
1617 VALUE "ProductVersion", "$version\\0"
1618 // Optional:
1619 //VALUE "Comments", "\\0"
51cbee35 1620 VALUE "LegalCopyright", "Copyright © 1998-2015 The OpenSSL Project. Copyright © 1995-1998 Eric A. Young, Tim J. Hudson. All rights reserved.\\0"
fc6a6a10
DSH
1621 //VALUE "LegalTrademarks", "\\0"
1622 //VALUE "PrivateBuild", "\\0"
1623 //VALUE "SpecialBuild", "\\0"
1624 END
1625 END
1626 BLOCK "VarFileInfo"
1627 BEGIN
1628 VALUE "Translation", 0x409, 0x4b0
1629 END
1630END
1631EOF
88087414
RL
1632 close(OUT);
1633 }
1634 },
1635 );
1636
1637my ($builder, @builder_opts) = @build_scheme;
1638$builders{$builder}->(@builder_opts);
fce0ba5f 1639
76ffb43d 1640print <<"EOF";
63d3f44a 1641
89ec98e0 1642Configured for $target.
63d3f44a 1643EOF
5f8d5c96 1644
76ffb43d 1645print <<"EOF" if (!$no_threads && !$threads);
5f8d5c96
BM
1646
1647The library could not be configured for supporting multi-threaded
1648applications as the compiler options required on this system are not known.
ff1b7e09 1649See file INSTALL for details if you need multi-threading.
ec577822
BM
1650EOF
1651
76ffb43d 1652print <<"EOF" if ($no_shared_warn);
2964ba8c 1653
2e31ef03
RS
1654You gave the option 'shared', which is not supported on this platform, so
1655we will pretend you gave the option 'no-shared'. If you know how to implement
1656shared libraries, please let us know (but please first make sure you have
1657tried with a current version of OpenSSL).
1658EOF
1659
76ffb43d 1660print <<"EOF" if ($warn_make_depend);
2e31ef03
RS
1661
1662*** Because of configuration changes, you MUST do the following before
1663*** building:
1664
1665 make depend
2964ba8c
RL
1666EOF
1667
d02b48c6
RE
1668exit(0);
1669
bd5192b1
RL
1670######################################################################
1671#
1672# Helpers and utility functions
1673#
1674
1675# Configuration file reading #########################################
1676
1677# Helper function to implement conditional inheritance depending on the
1678# value of $no_asm. Used in inherit_from values as follows:
1679#
1680# inherit_from => [ "template", asm("asm_tmpl") ]
1681#
1682sub asm {
1683 my @x = @_;
1684 sub {
1685 $no_asm ? () : @x;
1686 }
1687}
1688
88087414
RL
1689# Helper function to implement adding values to already existing configuration
1690# values. It handles elements that are ARRAYs, CODEs and scalars
1691sub _add {
1692 my $separator = shift;
1693
1694 # If there's any ARRAY in the collection of values, we will return
1695 # an ARRAY of combined values, otherwise a string of joined values
1696 # with $separator as the separator.
1697 my $found_array = 0;
1698
1699 my @values =
1700 map {
1701 if (ref($_) eq "ARRAY") {
1702 $found_array = 1;
1703 @$_;
1704 } else {
1705 $_;
1706 }
1707 } (@_);
1708
1709 if ($found_array) {
1710 [ @values ];
1711 } else {
1712 join($separator, @values);
1713 }
1714}
1715sub add_before {
1716 my $separator = shift;
1717 my @x = @_;
1718 sub { _add($separator, @x, @_) };
1719}
1720sub add {
1721 my $separator = shift;
1722 my @x = @_;
1723 sub { _add($separator, @_, @x) };
1724}
1725
bd5192b1
RL
1726# configuration reader, evaluates the input file as a perl script and expects
1727# it to fill %targets with target configurations. Those are then added to
1728# %table.
1729sub read_config {
1730 my $fname = shift;
1731 open(CONFFILE, "< $fname")
1732 or die "Can't open configuration file '$fname'!\n";
1733 my $x = $/;
1734 undef $/;
1735 my $content = <CONFFILE>;
1736 $/ = $x;
1737 close(CONFFILE);
1738 my %targets = ();
1739 {
1740 local %table = %::table; # Protect %table from tampering
1741
1742 eval $content;
1743 warn $@ if $@;
1744 }
1745
1746 # For each target, check that it's configured with a hash table.
1747 foreach (keys %targets) {
1748 if (ref($targets{$_}) ne "HASH") {
1749 if (ref($targets{$_}) eq "") {
1750 warn "Deprecated target configuration for $_, ignoring...\n";
1751 } else {
1752 warn "Misconfigured target configuration for $_ (should be a hash table), ignoring...\n";
1753 }
1754 delete $targets{$_};
1755 }
1756 }
1757
1758 %table = (%table, %targets);
1759
1760}
1761
1762# configuration resolver. Will only resolve all the lazy evalutation
1763# codeblocks for the chozen target and all those it inherits from,
1764# recursively
1765sub resolve_config {
1766 my $target = shift;
1767 my @breadcrumbs = @_;
1768
1769 if (grep { $_ eq $target } @breadcrumbs) {
1770 die "inherit_from loop! target backtrace:\n "
1771 ,$target,"\n ",join("\n ", @breadcrumbs),"\n";
1772 }
1773
1774 if (!defined($table{$target})) {
1775 warn "Warning! target $target doesn't exist!\n";
1776 return ();
1777 }
1778 # Recurse through all inheritances. They will be resolved on the
1779 # fly, so when this operation is done, they will all just be a
1780 # bunch of attributes with string values.
1781 # What we get here, though, are keys with references to lists of
1782 # the combined values of them all. We will deal with lists after
1783 # this stage is done.
1784 my %combined_inheritance = ();
1785 if ($table{$target}->{inherit_from}) {
1786 my @inherit_from =
1787 map { ref($_) eq "CODE" ? $_->() : $_ } @{$table{$target}->{inherit_from}};
1788 foreach (@inherit_from) {
1789 my %inherited_config = resolve_config($_, $target, @breadcrumbs);
1790
1791 # 'template' is a marker that's considered private to
1792 # the config that had it.
1793 delete $inherited_config{template};
1794
1795 map {
1796 if (!$combined_inheritance{$_}) {
1797 $combined_inheritance{$_} = [];
1798 }
1799 push @{$combined_inheritance{$_}}, $inherited_config{$_};
1800 } keys %inherited_config;
1801 }
1802 }
1803
1804 # We won't need inherit_from in this target any more, since we've
1805 # resolved all the inheritances that lead to this
1806 delete $table{$target}->{inherit_from};
1807
1808 # Now is the time to deal with those lists. Here's the place to
1809 # decide what shall be done with those lists, all based on the
1810 # values of the target we're currently dealing with.
1811 # - If a value is a coderef, it will be executed with the list of
1812 # inherited values as arguments.
1813 # - If the corresponding key doesn't have a value at all or is the
1814 # emoty string, the inherited value list will be run through the
1815 # default combiner (below), and the result becomes this target's
1816 # value.
1817 # - Otherwise, this target's value is assumed to be a string that
1818 # will simply override the inherited list of values.
88087414 1819 my $default_combiner = add(" ");
bd5192b1
RL
1820
1821 my %all_keys =
1822 map { $_ => 1 } (keys %combined_inheritance,
1823 keys %{$table{$target}});
1824 foreach (sort keys %all_keys) {
1825
1826 # Current target doesn't have a value for the current key?
1827 # Assign it the default combiner, the rest of this loop body
1828 # will handle it just like any other coderef.
1829 if (!exists $table{$target}->{$_}) {
1830 $table{$target}->{$_} = $default_combiner;
1831 }
1832
1833 my $valuetype = ref($table{$target}->{$_});
1834 if ($valuetype eq "CODE") {
1835 # CODE reference, execute it with the inherited values as
1836 # arguments.
1837 $table{$target}->{$_} =
1838 $table{$target}->{$_}->(@{$combined_inheritance{$_}});
88087414
RL
1839 } elsif ($valuetype eq "ARRAY" || $valuetype eq "") {
1840 # ARRAY or Scalar, just leave it as is.
bd5192b1
RL
1841 } else {
1842 # Some other type of reference that we don't handle.
1843 # Better to abort at this point.
1844 die "cannot handle reference type $valuetype,"
1845 ," found in target $target -> $_\n";
1846 }
1847 }
1848
1849 # Finally done, return the result.
1850 return %{$table{$target}};
1851}
1852
462ba4f6 1853sub usage
d02b48c6 1854 {
462ba4f6 1855 print STDERR $usage;
10a926c1 1856 print STDERR "\npick os/compiler from:\n";
1641cb60 1857 my $j=0;
6457ad15 1858 my $i;
10a926c1 1859 my $k=0;
6457ad15 1860 foreach $i (sort keys %table)
d02b48c6 1861 {
bd5192b1 1862 next if $table{$i}->{template};
462ba4f6 1863 next if $i =~ /^debug/;
10a926c1
UM
1864 $k += length($i) + 1;
1865 if ($k > 78)
1866 {
1867 print STDERR "\n";
1868 $k=length($i);
1869 }
1870 print STDERR $i . " ";
462ba4f6
UM
1871 }
1872 foreach $i (sort keys %table)
1873 {
bd5192b1 1874 next if $table{$i}->{template};
462ba4f6 1875 next if $i !~ /^debug/;
10a926c1
UM
1876 $k += length($i) + 1;
1877 if ($k > 78)
1878 {
1879 print STDERR "\n";
1880 $k=length($i);
1881 }
1882 print STDERR $i . " ";
d02b48c6 1883 }
10a926c1 1884 print STDERR "\n\nNOTE: If in doubt, on Unix-ish systems use './config'.\n";
462ba4f6 1885 exit(1);
d02b48c6
RE
1886 }
1887
00ae96ca
RL
1888# Configuration printer ##############################################
1889
1890sub print_table_entry
1891{
1892 my $target = shift;
1893 my %target = resolve_config($target);
1894 my $type = shift;
1895
1896 # Don't print the templates
1897 return if $target{template};
1898
1899 my @sequence = (
1900 "cc",
1901 "cflags",
1902 "debug_cflags",
1903 "release_cflags",
1904 "unistd",
1905 "thread_cflag",
1906 "sys_id",
1907 "lflags",
1908 "debug_lflags",
1909 "release_lflags",
1910 "bn_ops",
1911 "cpuid_obj",
1912 "bn_obj",
1913 "ec_obj",
1914 "des_obj",
1915 "aes_obj",
1916 "bf_obj",
1917 "md5_obj",
1918 "sha1_obj",
1919 "cast_obj",
1920 "rc4_obj",
1921 "rmd160_obj",
1922 "rc5_obj",
1923 "wp_obj",
1924 "cmll_obj",
1925 "modes_obj",
1926 "engines_obj",
1927 "perlasm_scheme",
1928 "dso_scheme",
1929 "shared_target",
1930 "shared_cflag",
1931 "shared_ldflag",
1932 "shared_extension",
1933 "ranlib",
1934 "arflags",
1935 "multilib",
1936 );
1937
1938 if ($type eq "TABLE") {
1939 print "\n";
1940 print "*** $target\n";
1941 printf "\$%-12s = %s\n", $_, $target{$_} foreach (@sequence);
1942 } elsif ($type eq "HASH") {
1943 my $largest =
1944 length((sort { length($a) <=> length($b) } @sequence)[-1]);
1945 print " '$target' => {\n";
1946 foreach (@sequence) {
1947 if ($target{$_}) {
1948 print " '",$_,"'"," " x ($largest - length($_))," => '",$target{$_},"',\n";
1949 }
1950 }
1951 print " },\n";
1952 }
1953}
1954
1955# Utility routines ###################################################
1956
99aab161
UM
1957sub which
1958 {
1959 my($name)=@_;
1960 my $path;
1961 foreach $path (split /:/, $ENV{PATH})
1962 {
28a80034 1963 if (-f "$path/$name$exe_ext" and -x _)
99aab161 1964 {
28a80034
RL
1965 return "$path/$name$exe_ext" unless ($name eq "perl" and
1966 system("$path/$name$exe_ext -e " . '\'exit($]<5.0);\''));
99aab161
UM
1967 }
1968 }
1969 }
1970
462ba4f6
UM
1971sub dofile
1972 {
1973 my $f; my $p; my %m; my @a; my $k; my $ff;
1974 ($f,$p,%m)=@_;
1975
31ff97b2 1976 open(IN,"<$f.in") || open(IN,"<$f") || die "unable to open $f:$!\n";
462ba4f6
UM
1977 @a=<IN>;
1978 close(IN);
1979 foreach $k (keys %m)
1980 {
1981 grep(/$k/ && ($_=sprintf($m{$k}."\n",$p)),@a);
1982 }
863fe2ec 1983 open(OUT,">$f.new") || die "unable to open $f.new:$!\n";
462ba4f6
UM
1984 print OUT @a;
1985 close(OUT);
863fe2ec
BM
1986 rename($f,"$f.bak") || die "unable to rename $f\n" if -e $f;
1987 rename("$f.new",$f) || die "unable to rename $f.new\n";
462ba4f6 1988 }
436a376b 1989
fe05264e
RL
1990sub quotify {
1991 my %processors = (
1992 perl => sub { my $x = shift;
1993 $x =~ s/([\\\$\@"])/\\$1/g;
1994 return '"'.$x.'"'; },
1995 );
1996 my $for = shift;
1997 my $processor =
1998 defined($processors{$for}) ? $processors{$for} : sub { shift; };
1999
2000 map { $processor->($_); } @_;
2001}