]> git.ipfire.org Git - thirdparty/openssl.git/blame - Configure
Correct the request of debug builds
[thirdparty/openssl.git] / Configure
CommitLineData
a4ed5532 1:
4f9b306c 2eval 'exec perl -S $0 ${1+"$@"}'
a4ed5532
RE
3 if $running_under_some_shell;
4##
5## Configure -- OpenSSL source tree configuration script
008bef52
RS
6## If editing this file, run this command before committing
7## make -f Makefile.org 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
f09e7ca9 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-krb5] [sctp] [386] [--prefix=DIR] [--openssldir=OPENSSLDIR] [--with-xxx[=vvv]] [--test-sanity] [--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.
462ba4f6
UM
24# --openssldir install OpenSSL in OPENSSLDIR (Default: DIR/ssl if the
25# --prefix option is given; /usr/local/ssl otherwise)
26# --prefix prefix for the OpenSSL include, lib and bin directories
27# (Default: the OPENSSLDIR directory)
e5f3045f
BM
28#
29# --install_prefix Additional prefix for package builders (empty by
30# default). This needn't be set in advance, you can
31# just as well use "make INSTALL_PREFIX=/whatever install".
32#
f9b3bff6
RL
33# --with-krb5-dir Declare where Kerberos 5 lives. The libraries are expected
34# to live in the subdirectory lib/ and the header files in
e452de9d
RL
35# include/. A value is required.
36# --with-krb5-lib Declare where the Kerberos 5 libraries live. A value is
37# required.
f9b3bff6 38# (Default: KRB5_DIR/lib)
e452de9d
RL
39# --with-krb5-include Declare where the Kerberos 5 header files live. A
40# value is required.
f9b3bff6
RL
41# (Default: KRB5_DIR/include)
42# --with-krb5-flavor Declare what flavor of Kerberos 5 is used. Currently
e452de9d 43# supported values are "MIT" and "Heimdal". A value is required.
f9b3bff6 44#
d0d046ec
RL
45# --test-sanity Make a number of sanity checks on the data in this file.
46# This is a debugging tool for OpenSSL developers.
47#
cbfb39d1
AP
48# --cross-compile-prefix Add specified prefix to binutils components.
49#
5270e702
RL
50# no-hw-xxx do not compile support for specific crypto hardware.
51# Generic OpenSSL-style methods relating to this support
52# are always compiled but return NULL if the hardware
53# support isn't compiled.
54# no-hw do not compile support for any crypto hardware.
5f8d5c96
BM
55# [no-]threads [don't] try to create a library that is suitable for
56# multithreaded applications (default is "threads" if we
57# know how to do it)
fcc6a1c4 58# [no-]shared [don't] try to create shared libraries when supported.
a723979d 59# no-asm do not use assembler
bc2aadad
GT
60# no-dso do not compile in any native shared-library methods. This
61# will ensure that all methods just return NULL.
f9b3bff6 62# no-krb5 do not compile in any KRB5 library or code.
e452de9d
RL
63# [no-]zlib [don't] compile support for zlib compression.
64# zlib-dynamic Like "zlib", but the zlib library is expected to be a shared
65# library and will be loaded in run-time by the OpenSSL library.
7e159e01 66# sctp include SCTP support
22a4f969 67# 386 generate 80386 code
d0590fe6 68# no-sse2 disables IA-32 SSE2 code, above option implies no-sse2
79df9d62 69# no-<cipher> build without specified algorithm (rsa, idea, rc5, ...)
fce0ba5f 70# -<xxx> +<xxx> compiler options are passed through
e41c8d6a
GT
71#
72# DEBUG_SAFESTACK use type-safe stacks to enforce type-safety on stack items
73# provided to stack calls. Generates unique stack functions for
74# each possible stack type.
d02b48c6
RE
75# DES_PTR use pointer lookup vs arrays in the DES in crypto/des/des_locl.h
76# DES_RISC1 use different DES_ENCRYPT macro that helps reduce register
77# dependancies but needs to more registers, good for RISC CPU's
78# DES_RISC2 A different RISC variant.
79# DES_UNROLL unroll the inner DES loop, sometimes helps, somtimes hinders.
80# DES_INT use 'int' instead of 'long' for DES_LONG in crypto/des/des.h
81# This is used on the DEC Alpha where long is 8 bytes
82# and int is 4
83# BN_LLONG use the type 'long long' in crypto/bn/bn.h
58964a49
RE
84# MD2_CHAR use 'char' instead of 'int' for MD2_INT in crypto/md2/md2.h
85# MD2_LONG use 'long' instead of 'int' for MD2_INT in crypto/md2/md2.h
d02b48c6
RE
86# IDEA_SHORT use 'short' instead of 'int' for IDEA_INT in crypto/idea/idea.h
87# IDEA_LONG use 'long' instead of 'int' for IDEA_INT in crypto/idea/idea.h
88# RC2_SHORT use 'short' instead of 'int' for RC2_INT in crypto/rc2/rc2.h
89# RC2_LONG use 'long' instead of 'int' for RC2_INT in crypto/rc2/rc2.h
90# RC4_CHAR use 'char' instead of 'int' for RC4_INT in crypto/rc4/rc4.h
91# RC4_LONG use 'long' instead of 'int' for RC4_INT in crypto/rc4/rc4.h
58964a49 92# RC4_INDEX define RC4_INDEX in crypto/rc4/rc4_locl.h. This turns on
d02b48c6 93# array lookups instead of pointer use.
2dae04d0
AP
94# RC4_CHUNK enables code that handles data aligned at long (natural CPU
95# word) boundary.
96# RC4_CHUNK_LL enables code that handles data aligned at long long boundary
97# (intended for 64-bit CPUs running 32-bit OS).
d02b48c6 98# BF_PTR use 'pointer arithmatic' for Blowfish (unsafe on Alpha).
995e79e3 99# BF_PTR2 intel specific version (generic version is more efficient).
d0590fe6
AP
100#
101# Following are set automatically by this script
102#
58964a49
RE
103# MD5_ASM use some extra md5 assember,
104# SHA1_ASM use some extra sha1 assember, must define L_ENDIAN for x86
105# RMD160_ASM use some extra ripemd160 assember,
d0590fe6
AP
106# SHA256_ASM sha256_block is implemented in assembler
107# SHA512_ASM sha512_block is implemented in assembler
108# AES_ASM ASE_[en|de]crypt is implemented in assembler
d02b48c6 109
363bd0b4 110# Minimum warning options... any contributions to OpenSSL should at least get
fce0ba5f 111# past these.
363bd0b4 112
a8b4e057 113my $gcc_devteam_warn = "-Wall -pedantic -DPEDANTIC -Wno-long-long -Wsign-compare -Wmissing-prototypes -Wshadow -Wformat -Werror -DCRYPTO_MDEBUG_ALL -DCRYPTO_MDEBUG_ABORT -DREF_CHECK";
363bd0b4 114
cb2bc054
EK
115my $clang_disabled_warnings = "-Wno-language-extension-token -Wno-extended-offsetof -Wno-padded -Wno-shorten-64-to-32 -Wno-format-nonliteral -Wno-missing-noreturn -Wno-unused-parameter -Wno-sign-conversion -Wno-unreachable-code -Wno-conversion -Wno-documentation -Wno-missing-variable-declarations -Wno-cast-align -Wno-incompatible-pointer-types-discards-qualifiers -Wno-missing-variable-declarations -Wno-missing-field-initializers -Wno-unused-macros -Wno-disabled-macro-expansion -Wno-conditional-uninitialized -Wno-switch-enum";
116
0c28f277
DSH
117my $strict_warnings = 0;
118
1641cb60 119my $x86_gcc_des="DES_PTR DES_RISC1 DES_UNROLL";
d02b48c6
RE
120
121# MD2_CHAR slags pentium pros
995e79e3 122my $x86_gcc_opts="RC4_INDEX MD2_INT";
d02b48c6
RE
123
124# MODIFY THESE PARAMETERS IF YOU ARE GOING TO USE THE 'util/speed.sh SCRIPT
125# Don't worry about these normally
126
1641cb60
BL
127my $tcc="cc";
128my $tflags="-fast -Xa";
129my $tbn_mul="";
130my $tlib="-lnsl -lsocket";
d02b48c6
RE
131#$bits1="SIXTEEN_BIT ";
132#$bits2="THIRTY_TWO_BIT ";
1641cb60
BL
133my $bits1="THIRTY_TWO_BIT ";
134my $bits2="SIXTY_FOUR_BIT ";
d02b48c6 135
79ee5afa 136my $x86_asm="x86cpuid.o:bn-586.o co-586.o x86-mont.o x86-gf2m.o:ecp_nistz256.o ecp_nistz256-x86.o:des-586.o crypt586.o:aes-586.o vpaes-x86.o aesni-x86.o:bf-586.o:md5-586.o:sha1-586.o sha256-586.o sha512-586.o:cast-586.o:rc4-586.o:rmd-586.o:rc5-586.o:wp_block.o wp-mmx.o:cmll-x86.o:ghash-x86.o:e_padlock-x86.o";
5e1b2353 137my $x86_asm_nocast=$x86_asm;$x86_asm_nocast=~s/cast\-586\.o//;
fa8e921f 138
fa8e921f 139my $x86_elf_asm="$x86_asm:elf";
5e1b2353 140my $android_x86_elf_asm="$x86_asm:android";
fa8e921f 141
84714790 142my $x86_64_asm="x86_64cpuid.o:x86_64-gcc.o x86_64-mont.o x86_64-mont5.o x86_64-gf2m.o rsaz_exp.o rsaz-x86_64.o rsaz-avx2.o:ecp_nistz256.o ecp_nistz256-x86_64.o::aes-x86_64.o vpaes-x86_64.o bsaes-x86_64.o aesni-x86_64.o aesni-sha1-x86_64.o aesni-sha256-x86_64.o aesni-mb-x86_64.o::md5-x86_64.o:sha1-x86_64.o sha256-x86_64.o sha512-x86_64.o sha1-mb-x86_64.o sha256-mb-x86_64.o::rc4-x86_64.o rc4-md5-x86_64.o:::wp-x86_64.o:cmll-x86_64.o cmll_misc.o:ghash-x86_64.o aesni-gcm-x86_64.o:e_padlock-x86_64.o";
5e1b2353 143my $win_x86_64_asm=$x86_asm;$win_x86_64_asm=~s/x86_64-gcc\.o/bn_asm.o/;
6019cdd3
AP
144my $ia64_asm="ia64cpuid.o:bn-ia64.o ia64-mont.o:::aes_core.o aes_cbc.o aes-ia64.o::md5-ia64.o:sha1-ia64.o sha256-ia64.o sha512-ia64.o::rc4-ia64.o rc4_skey.o:::::ghash-ia64.o::void";
145my $sparcv9_asm="sparcv9cap.o sparccpuid.o:bn-sparcv9.o sparcv9-mont.o sparcv9a-mont.o vis3-mont.o sparct4-mont.o sparcv9-gf2m.o::des_enc-sparc.o fcrypt_b.o dest4-sparcv9.o:aes_core.o aes_cbc.o aes-sparcv9.o aest4-sparcv9.o::md5-sparcv9.o:sha1-sparcv9.o sha256-sparcv9.o sha512-sparcv9.o::::::camellia.o cmll_misc.o cmll_cbc.o cmllt4-sparcv9.o:ghash-sparcv9.o::void";
146my $sparcv8_asm=":sparcv8.o::des_enc-sparc.o fcrypt_b.o:::::::::::::void";
147my $alpha_asm="alphacpuid.o:bn_asm.o alpha-mont.o::::::sha1-alpha.o:::::::ghash-alpha.o::void";
148my $mips64_asm=":bn-mips.o mips-mont.o:::aes_cbc.o aes-mips.o:::sha1-mips.o sha256-mips.o sha512-mips.o::::::::";
9a10ea3f 149my $mips32_asm=$mips64_asm; $mips32_asm =~ s/\s*sha512\-mips\.o//;
6019cdd3 150my $s390x_asm="s390xcap.o s390xcpuid.o:bn-s390x.o s390x-mont.o s390x-gf2m.o:::aes-s390x.o aes-ctr.o aes-xts.o:::sha1-s390x.o sha256-s390x.o sha512-s390x.o::rc4-s390x.o:::::ghash-s390x.o:";
5e1b2353 151my $s390x_32_asm=$s390x_asm;$s390x_32_asm=~s/bn\-s390x\.o/bn_asm.o/;
7b4a4b71 152my $armv4_asm="armcap.o armv4cpuid.o:bn_asm.o armv4-mont.o armv4-gf2m.o:ecp_nistz256.o ecp_nistz256-armv4.o::aes_cbc.o aes-armv4.o bsaes-armv7.o aesv8-armx.o:::sha1-armv4-large.o sha256-armv4.o sha512-armv4.o:::::::ghash-armv4.o ghashv8-armx.o::void";
6019cdd3
AP
153my $aarch64_asm="armcap.o arm64cpuid.o mem_clr.o::::aes_core.o aes_cbc.o aesv8-armx.o:::sha1-armv8.o sha256-armv8.o sha512-armv8.o:::::::ghashv8-armx.o:";
154my $parisc11_asm="pariscid.o:bn_asm.o parisc-mont.o:::aes_core.o aes_cbc.o aes-parisc.o:::sha1-parisc.o sha256-parisc.o sha512-parisc.o::rc4-parisc.o:::::ghash-parisc.o::32";
5e1b2353
RL
155my $parisc20_64_asm="pariscid.o:pa-risc2W.o parisc-mont.o:::aes_core.o aes_cbc.o aes-parisc.o:::sha1-parisc.o sha256-parisc.o sha512-parisc.o::rc4-parisc.o:::::ghash-parisc.o::64";
156my $parisc20_32_asm=$parisc20_64_asm;$parisc20_32_asm=~s/2W\./2\./;$parisc20_32_asm=~s/:64/:32/;
6019cdd3 157my $ppc64_asm="ppccpuid.o ppccap.o:bn-ppc.o ppc-mont.o ppc64-mont.o:::aes_core.o aes_cbc.o aes-ppc.o vpaes-ppc.o aesp8-ppc.o:::sha1-ppc.o sha256-ppc.o sha512-ppc.o sha256p8-ppc.o sha512p8-ppc.o:::::::ghashp8-ppc.o:";
d4571f43 158my $ppc32_asm=$ppc64_asm;
a77e023a 159
b7efa56a 160# As for $BSDthreads. Idea is to maintain "collective" set of flags,
fce0ba5f 161# which would cover all BSD flavors. -pthread applies to them all,
b7efa56a
AP
162# but is treated differently. OpenBSD expands is as -D_POSIX_THREAD
163# -lc_r, which is sufficient. FreeBSD 4.x expands it as -lc_r,
164# which has to be accompanied by explicit -D_THREAD_SAFE and
165# sometimes -D_REENTRANT. FreeBSD 5.x expands it as -lc_r, which
166# seems to be sufficient?
167my $BSDthreads="-pthread -D_THREAD_SAFE -D_REENTRANT";
d02b48c6 168
99e812cb 169
f09e7ca9 170# table of known configurations, read in from files
aaf878cc
RL
171#
172# The content of each entry can take one of two forms:
173#
174# - old style config-string, colon seperated fields with exactly the
175# following structure.:
176#
177# $cc : $cflags : $unistd : $thread_cflag : $sys_id : $lflags : $bn_ops : $cpuid_obj : $bn_obj : $ec_obj : $des_obj : $aes_obj : $bf_obj : $md5_obj : $sha1_obj : $cast_obj : $rc4_obj : $rmd160_obj : $rc5_obj : $wp_obj : $cmll_obj : $modes_obj : $engines_obj : $perlasm_scheme : $dso_scheme : $shared_target : $shared_cflag : $shared_ldflag : $shared_extension : $ranlib : $arflags : $multilib
178#
179# We use the stringtohash function - defined below - to combine with the
180# fields and form a proper hash table from the string.
181#
182# - direct transfer of old style config string to hash table, using the names
183# of the fields as keys:
184#
185# {
186# cc => $cc,
187# cflags => $cflags,
188# unistd => $unistd,
189# thread_cflag => $thread_cflag,
190# sys_id => $sys_id,
191# lflags => $lflags,
192# bn_ops => $bn_ops,
193# cpuid_obj => $cpuid_obj,
194# bn_obj => $bn_obj,
195# ec_obj => $ec_obj,
196# des_obj => $des_obj,
197# aes_obj => $aes_obj,
198# bf_obj => $bf_obj,
199# md5_obj => $md5_obj,
200# sha1_obj => $sha1_obj,
201# cast_obj => $cast_obj,
202# rc4_obj => $rc4_obj,
203# rmd160_obj => $rmd160_obj,
204# rc5_obj => $rc5_obj,
205# wp_obj => $wp_obj,
206# cmll_obj => $cmll_obj,
207# modes_obj => $modes_obj,
208# engines_obj => $engines_obj,
209# perlasm_scheme => $perlasm_scheme,
210# dso_scheme => $dso_scheme,
211# shared_target => $shared_target,
212# shared_cflag => $shared_cflag,
213# shared_ldflag => $shared_ldflag,
214# shared_extension => $shared_extension,
215# ranlib => $ranlib,
216# arflags => $arflags,
217# multilib => $multilib
218# }
219#
220# - new style config hash table, which has additional attributes for debug
221# and non-debug flags to be added to the common flags, for cflags and lflags:
222#
223# {
224# cc => $cc,
225# cflags => $cflags,
b1245529
RL
226# debug_cflags => $debug_cflags,
227# release_cflags => $release_cflags,
aaf878cc
RL
228# unistd => $unistd,
229# thread_cflag => $thread_cflag,
230# sys_id => $sys_id,
231# lflags => $lflags,
b1245529
RL
232# debug_lflags => $debug_lflags,
233# release_lflags => $release_lflags,
aaf878cc
RL
234# bn_ops => $bn_ops,
235# cpuid_obj => $cpuid_obj,
236# bn_obj => $bn_obj,
237# ec_obj => $ec_obj,
238# des_obj => $des_obj,
239# aes_obj => $aes_obj,
240# bf_obj => $bf_obj,
241# md5_obj => $md5_obj,
242# sha1_obj => $sha1_obj,
243# cast_obj => $cast_obj,
244# rc4_obj => $rc4_obj,
245# rmd160_obj => $rmd160_obj,
246# rc5_obj => $rc5_obj,
247# wp_obj => $wp_obj,
248# cmll_obj => $cmll_obj,
249# modes_obj => $modes_obj,
250# engines_obj => $engines_obj,
251# dso_scheme => $dso_scheme,
252# shared_target => $shared_target,
253# shared_cflag => $shared_cflag,
254# shared_ldflag => $shared_ldflag,
255# shared_extension => $shared_extension,
256# ranlib => $ranlib,
257# arflags => $arflags,
258# multilib => $multilib
259# }
260#
261# The configuration reader will do what it can to translate everything into
262# new style config hash tables, including merging $target and debug-$target
263# if they are similar enough.
7d46b942
RL
264#
265# The configuration hashes can refer to templates in two different manners:
266#
b1245529 267# - as part of the hash, one can have a key called 'inherit_from' that
7d46b942
RL
268# indicate what other configuration hashes to inherit data from.
269# These are resolved recursively.
270#
b1245529
RL
271# Inheritance works as a set of default values that can be overriden
272# by corresponding attribute values in the inheriting configuration.
273#
274# If several configurations are given in the 'inherit_from' array, the
275# values of same attribute are concatenated with space separation.
276# With this, it's possible to have several smaller templates for
277# different configuration aspects that can be combined into a complete
278# configuration.
279#
7d46b942
RL
280# Example:
281#
b1245529
RL
282# "foo" => {
283# template => 1,
284# haha => "haha",
285# hoho => "ho"
286# },
7d46b942 287# "bar" => {
b1245529
RL
288# template => 1,
289# hoho => "ho",
290# hehe => "hehe"
7d46b942 291# },
b1245529
RL
292# "laughter" => {
293# inherit_from => [ "foo", "bar" ],
7d46b942
RL
294# }
295#
296# The entry for "foo" will become as follows after processing:
297#
b1245529 298# "laughter" => {
7d46b942 299# haha => "haha",
b1245529
RL
300# hoho => "ho ho",
301# hehe => "hehe"
7d46b942
RL
302# }
303#
304# Note 1: any entry from the table can be used as a template.
305# Note 2: pure templates have the attribute 'template => 1' and cannot
b1245529 306# be used as targets.
7d46b942 307#
b1245529
RL
308# - instead of a string, one can have a code block of the form
309# 'sub { /* your code here */ }', where the arguments are the list of
310# inherited values for that key. In fact, the concatenation of strings
311# is really done by using 'sub { join(" ",@_) }' on the list of inherited
312# values.
7d46b942
RL
313#
314# Example:
315#
b1245529
RL
316# "foo" => {
317# template => 1,
318# haha => "ha ha",
319# hoho => "ho",
320# ignored => "This should not appear in the end result",
321# },
7d46b942 322# "bar" => {
b1245529
RL
323# template => 1,
324# haha => "ah",
325# hoho => "haho",
326# hehe => "hehe"
7d46b942 327# },
b1245529
RL
328# "laughter" => {
329# inherit_from => [ "foo", "bar" ],
330# hehe => sub { join(" ",(@_,"!!!")) },
331# ignored => "",
7d46b942
RL
332# }
333#
334# The entry for "foo" will become as follows after processing:
335#
b1245529
RL
336# "laughter" => {
337# haha => "ha ha ah",
338# hoho => "ho haho",
339# hehe => "hehe !!!",
340# ignored => ""
7d46b942
RL
341# }
342#
aaf878cc 343
1641cb60 344my %table=(
7d46b942
RL
345
346 # All these templates are merely a translation of the corresponding
347 # variables further up.
348 #
349 # Note: as long as someone might use old style configuration strings,
350 # or we bother supporting that, those variables need to stay
351
352 # Filler used for when there are no asm files.
353 no_asm_filler => {
354 template => 1,
355 cpuid_obj => "",
356 bn_obj => "",
357 ec_obj => "",
358 des_obj => "",
359 aes_obj => "",
360 bf_obj => "",
361 md5_obj => "",
362 sha1_obj => "",
363 cast_obj => "",
364 rc4_obj => "",
365 rmd160_obj => "",
366 rc5_obj => "",
367 wp_obj => "",
368 cmll_obj => "",
369 modes_obj => "",
370 engines_obj => "",
371 perlasm_scheme => "void"
372 },
373
5e1b2353 374 x86_asm_nocast => {
7d46b942
RL
375 template => 1,
376 cpuid_obj => "x86cpuid.o",
377 bn_obj => "bn-586.o co-586.o x86-mont.o x86-gf2m.o",
378 ec_obj => "ecp_nistz256.o ecp_nistz256-x86.o",
379 des_obj => "des-586.o crypt586.o",
380 aes_obj => "aes-586.o vpaes-x86.o aesni-x86.o",
381 bf_obj => "bf-586.o",
382 md5_obj => "md5-586.o",
383 sha1_obj => "sha1-586.o sha256-586.o sha512-586.o",
7d46b942
RL
384 rc4_obj => "rc4-586.o",
385 rmd160_obj => "rmd-586.o",
386 rc5_obj => "rc5-586.o",
387 wp_obj => "wp_block.o wp-mmx.o",
388 cmll_obj => "cmll-x86.o",
389 modes_obj => "ghash-x86.o",
390 engines_obj => "e_padlock-x86.o"
391 },
5e1b2353
RL
392 x86_asm => {
393 template => 1,
394 inherit_from => [ "x86_asm_nocast" ],
395 cast_obj => "cast-586.o",
396 },
7d46b942
RL
397 x86_elf_asm => {
398 template => 1,
b1245529 399 inherit_from => [ "x86_asm" ],
7d46b942
RL
400 perlasm_scheme => "elf"
401 },
5e1b2353
RL
402 android_x86_elf_asm => {
403 template => 1,
404 inherit_from => [ "x86_asm" ],
405 perlasm_scheme => "android"
406 },
7d46b942 407
5e1b2353 408 _x86_64_asm => {
7d46b942
RL
409 template => 1,
410 cpuid_obj => "x86_64cpuid.o",
5e1b2353 411 bn_obj => "x86_64-mont.o x86_64-mont5.o x86_64-gf2m.o rsaz_exp.o rsaz-x86_64.o rsaz-avx2.o",
7d46b942
RL
412 ec_obj => "ecp_nistz256.o ecp_nistz256-x86_64.o",
413 aes_obj => "aes-x86_64.o vpaes-x86_64.o bsaes-x86_64.o aesni-x86_64.o aesni-sha1-x86_64.o aesni-sha256-x86_64.o aesni-mb-x86_64.o",
414 md5_obj => "md5-x86_64.o",
415 sha1_obj => "sha1-x86_64.o sha256-x86_64.o sha512-x86_64.o sha1-mb-x86_64.o sha256-mb-x86_64.o",
416 rc4_obj => "rc4-x86_64.o rc4-md5-x86_64.o",
417 wp_obj => "wp-x86_64.o",
418 cmll_obj => "cmll-x86_64.o cmll_misc.o",
419 modes_obj => "ghash-x86_64.o aesni-gcm-x86_64.o",
420 engines_obj => "e_padlock-x86_64.o"
421 },
5e1b2353
RL
422 x86_64_asm => {
423 inherit_from => [ "_x86_64_asm" ],
424 template => 1,
425 bn_obj => sub { join(" ","x86_64-gcc.o",@_) }
426 },
427 win_x86_64_asm => {
428 inherit_from => [ "_x86_64_asm" ],
429 template => 1,
430 bn_obj => sub { join(" ","bn_asm.o",@_) }
431 },
7d46b942
RL
432 ia64_asm => {
433 template => 1,
434 cpuid_obj => "ia64cpuid.o",
435 bn_obj => "bn-ia64.o ia64-mont.o",
436 aes_obj => "aes_core.o aes_cbc.o aes-ia64.o",
437 md5_obj => "md5-ia64.o",
438 sha1_obj => "sha1-ia64.o sha256-ia64.o sha512-ia64.o",
439 rc4_obj => "rc4-ia64.o rc4_skey.o",
440 modes_obj => "ghash-ia64.o",
441 perlasm_scheme => "void"
442 },
443 sparcv9_asm => {
444 template => 1,
445 cpuid_obj => "sparcv9cap.o sparccpuid.o",
446 bn_obj => "bn-sparcv9.o sparcv9-mont.o sparcv9a-mont.o vis3-mont.o sparct4-mont.o sparcv9-gf2m.o",
447 des_obj => "des_enc-sparc.o fcrypt_b.o dest4-sparcv9.o",
448 aes_obj => "aes_core.o aes_cbc.o aes-sparcv9.o aest4-sparcv9.o",
449 md5_obj => "md5-sparcv9.o",
450 sha1_obj => "sha1-sparcv9.o sha256-sparcv9.o sha512-sparcv9.o",
451 cmll_obj => "camellia.o cmll_misc.o cmll_cbc.o cmllt4-sparcv9.o",
452 modes_obj => "ghash-sparcv9.o",
453 perlasm_scheme => "void"
454 },
455 sparcv8_asm => {
456 template => 1,
457 cpuid_obj => "",
458 bn_obj => "sparcv8.o",
459 des_obj => "des_enc-sparc.o fcrypt_b.o",
460 perlasm_scheme => "void"
461 },
462 alpha_asm => {
463 template => 1,
464 cpuid_obj => "alphacpuid.o",
465 bn_obj => "bn_asm.o alpha-mont.o",
466 sha1_obj => "sha1-alpha.o",
467 modes_obj => "ghash-alpha.o",
468 perlasm_scheme => "void"
469 },
470 mips32_asm => {
471 template => 1,
472 bn_obj => "bn-mips.o mips-mont.o",
473 aes_obj => "aes_cbc.o aes-mips.o",
474 sha1_obj => "sha1-mips.o sha256-mips.o",
475 },
476 mips64_asm => {
b1245529 477 inherit_from => [ "mips32_asm" ],
7d46b942 478 template => 1,
b1245529 479 sha1_obj => sub { join(" ", @_, "sha512-mips.o") }
7d46b942 480 },
5e1b2353 481 _s390x_asm => {
7d46b942
RL
482 template => 1,
483 cpuid_obj => "s390xcap.o s390xcpuid.o",
5e1b2353 484 bn_obj => "s390x-mont.o s390x-gf2m.o",
7d46b942
RL
485 aes_obj => "aes-s390x.o aes-ctr.o aes-xts.o",
486 sha1_obj => "sha1-s390x.o sha256-s390x.o sha512-s390x.o",
487 rc4_obj => "rc4-s390x.o",
488 modes_obj => "ghash-s390x.o",
489 },
5e1b2353
RL
490 s390x_asm => {
491 template => 1,
492 inherit_from => [ "_s390x_asm" ],
493 bn_obj => sub { join(" ", "bn-s390x.o", @_) }
494 },
495 s390x_32_asm => {
496 template => 1,
497 inherit_from => [ "_s390x_asm" ],
498 bn_obj => sub { join(" ", "bn_asm.o", @_) }
499 },
7d46b942
RL
500 armv4_asm => {
501 template => 1,
502 cpuid_obj => "armcap.o armv4cpuid.o",
503 bn_obj => "bn_asm.o armv4-mont.o armv4-gf2m.o",
504 ec_obj => "ecp_nistz256.o ecp_nistz256-armv4.o",
505 aes_obj => "aes_cbc.o aes-armv4.o bsaes-armv7.o aesv8-armx.o",
506 sha1_obj => "sha1-armv4-large.o sha256-armv4.o sha512-armv4.o",
507 modes_obj => "ghash-armv4.o ghashv8-armx.o",
508 perlasm_scheme => "void"
509 },
510 aarch64_asm => {
511 template => 1,
512 cpuid_obj => "armcap.o arm64cpuid.o mem_clr.o",
513 aes_obj => "aes_core.o aes_cbc.o aesv8-armx.o",
514 sha1_obj => "sha1-armv8.o sha256-armv8.o sha512-armv8.o",
515 modes_obj => "ghashv8-armx.o",
516 },
517 parisc11_asm => {
518 template => 1,
519 cpuid_obj => "pariscid.o",
520 bn_obj => "bn_asm.o parisc-mont.o",
521 aes_obj => "aes_core.o aes_cbc.o aes-parisc.o",
522 sha1_obj => "sha1-parisc.o sha256-parisc.o sha512-parisc.o",
523 rc4_obj => "rc4-parisc.o",
524 modes_obj => "ghash-parisc.o",
525 perlasm_scheme => "32"
526 },
5e1b2353 527 _parisc20_asm => {
7d46b942
RL
528 template => 1,
529 cpuid_obj => "pariscid.o",
5e1b2353 530 bn_obj => "parisc-mont.o",
7d46b942
RL
531 aes_obj => "aes_core.o aes_cbc.o aes-parisc.o",
532 sha1_obj => "sha1-parisc.o sha256-parisc.o sha512-parisc.o",
533 rc4_obj => "rc4-parisc.o",
534 modes_obj => "ghash-parisc.o",
535 perlasm_scheme => "64"
536 },
5e1b2353
RL
537 parisc20_32_asm => {
538 template => 1,
539 inherit_from => [ "_parisc20_asm" ],
540 bn_obj => sub { join(" ", "pa-risc2.o", @_) },
541 perlasm_scheme => "32",
542 },
543 parisc20_64_asm => {
544 template => 1,
545 inherit_from => [ "_parisc20_asm" ],
546 bn_obj => sub { join(" ", "pa-risc2W.o", @_) },
547 perlasm_scheme => "64",
548 },
7d46b942
RL
549 ppc64_asm => {
550 template => 1,
551 cpuid_obj => "ppccpuid.o ppccap.o",
552 bn_obj => "bn-ppc.o ppc-mont.o ppc64-mont.o",
553 aes_obj => "aes_core.o aes_cbc.o aes-ppc.o vpaes-ppc.o aesp8-ppc.o",
554 sha1_obj => "sha1-ppc.o sha256-ppc.o sha512-ppc.o sha256p8-ppc.o sha512p8-ppc.o",
555 modes_obj => "ghashp8-ppc.o",
556 },
557 ppc32_asm => {
b1245529 558 inherit_from => [ "ppc64_asm" ],
7d46b942
RL
559 template => 1
560 },
f09e7ca9 561);
3e83e686 562
aaf878cc
RL
563sub stringtohash {
564 my $in = shift @_;
565 if (ref($in) eq "HASH") {
566 return $in;
567 }
568 my @stringsequence = (
569 "cc",
570 "cflags",
571 "unistd",
572 "thread_cflag",
573 "sys_id",
574 "lflags",
575 "bn_ops",
576 "cpuid_obj",
577 "bn_obj",
578 "ec_obj",
579 "des_obj",
580 "aes_obj",
581 "bf_obj",
582 "md5_obj",
583 "sha1_obj",
584 "cast_obj",
585 "rc4_obj",
586 "rmd160_obj",
587 "rc5_obj",
588 "wp_obj",
589 "cmll_obj",
590 "modes_obj",
591 "engines_obj",
592 "perlasm_scheme",
593 "dso_scheme",
594 "shared_target",
595 "shared_cflag",
596 "shared_ldflag",
597 "shared_extension",
598 "ranlib",
599 "arflags",
600 "multilib",
601 );
602
603 # return a ref to a hash, that's what the outer braces are for.
604 return { map { shift @stringsequence => $_ } split /:/, $in };
605};
606
f09e7ca9
RS
607# Read configuration target stanzas from a file, so that people can have
608# local files with their own definitions
609sub read_config {
610 my $fname = shift;
611 open(CONFFILE, "< $fname")
612 or die "Can't open configuration file '$fname'!\n";
613 my $x = $/;
614 undef $/;
615 my $content = <CONFFILE>;
616 $/ = $x;
617 close(CONFFILE);
618 my %targets = ();
619 eval $content;
aaf878cc
RL
620
621 # Make sure we have debug- targets first
622 my @keys =
623 sort {
624 my $a_nd = $a =~ m/^debug-/ ? $' :$a;
625 my $b_nd = $b =~ m/^debug-/ ? $' :$b;
626 my $res = 0;
627
628 if (($a_nd == $a) == ($b_nd == $b)) {
629 # they are both debug- or not, compare them as they are
630 $res = $a cmp $b;
631 } elsif ($a_nd != $a) {
632 # $a is debug-, make it lesser
633 $res = -1;
634 } else {
635 # $b is debug-, make $a greater
636 $res = 1;
637 }
638 $res;
639 } keys %targets;
640
641 foreach (@keys) {
642 if (ref($targets{$_}) ne "HASH") {
643 # Value is assumed to be a string. Split it up to
644 # become a hash table of parameters. Also, try to
645 # merge debug- variants with the non-debug target.
646
647 # Start with converting the value from a string to a
648 # standardised hash of fields. Using $tohash is safe,
649 # if the input is already a hash ref, it's just returned
650 # back.
651 $targets{$_} = stringtohash($targets{$_});
652
653 # If the current target is a debug target, there might
654 # be a corresponding non-debug target that we can merge
655 # with. If it isn't a debug- target, we've already done
656 # as much merging as we can and do not need to bother
657 # with that any more.
658 if ($_ =~ m/^debug-/) {
659 my $debugkey = $_;
660 my $nondebugkey = $';
661 my $debug = $targets{$debugkey};
662 my $nondebug;
663
664 if ($targets{$nondebugkey}) {
665 $nondebug = stringtohash($targets{$nondebugkey});
666 }
667
668 if ($nondebug) {
669 # There's both a debug and non-debug variant of
670 # this target, so we should try to merge them
671 # together.
672
673 # First, check that the non-debug variant isn't
674 # already built up with all it should have.
675 if ($nondebug->{debug_cflags}
b1245529 676 || $nondebug->{release_cflags}
aaf878cc 677 || $nondebug->{debug_lflags}
b1245529 678 || $nondebug->{release_lflags}) {
aaf878cc
RL
679 warn "there's a debug target $debugkey to be merged with a target $nondebugkey, but the latter seems to already have both nodebug and debug information. This requires human intervention. Skipping $debugkey...";
680 next;
681 }
682
683 # Now, check similarity.
684 # For keys they have in common, support that
685 # cflags and lflags can differ, otherwise they
686 # must have exactly the same values for them
687 # to be merged into one.
688 my $similarenough = 1;
689 for (keys %{$debug}) {
690 if ($nondebug->{$_} ne $debug->{$_}
691 && $_ !~ m/^[cl]flags$/) {
692 $similarenough = 0;
693 last;
694 }
695 }
696
697 if ($similarenough) {
698 # Here's where the magic happens, split the
699 # options in the debug and non-debug variants
700 # cflags and ldflags into three strings each,
701 # one with common flags, one with extra debug
702 # flags and one with extra non-debug flags.
703
704 # The result ends up in %h_nondebug, which
705 # becomes the merged variant when we're done.
706 # for each of cflags and lflags, they are
707 # replaced with cflags, debug_cflags,
b1245529 708 # release_cflags and similar for lflags.
aaf878cc
RL
709 #
710 # The purpose is that 'cflags' should be
711 # used together with 'debug_cflags' or
b1245529 712 # 'release_cflags' depending on what the
aaf878cc
RL
713 # user asks for.
714 foreach (("cflags", "lflags")) {
715 my @list_d = split /\s+/, $debug->{$_};
716 my @list_nd = split /\s+/, $nondebug->{$_};
717 my %presence = (); # bitmap
718 # 1: present in @list_d
719 # 2: present in @list_nd
720 # 3: present in both
721 map { $presence{$_} += 1; } @list_d;
722 map { $presence{$_} += 2; } @list_nd;
723
724 delete $nondebug->{$_};
725 # Note: we build from the original lists to
726 # preserve order, it might be important
727 $nondebug->{"debug-".$_} =
728 join(" ",
729 grep { $presence{$_} == 1 } @list_d);
730 $nondebug->{"nodebug-".$_} =
731 join(" ",
732 grep { $presence{$_} == 2 } @list_nd);
733 $nondebug->{$_} =
734 join(" ",
735 grep { $presence{$_} == 3 } @list_d);
736 }
737
738 $targets{$nondebugkey} = $nondebug;
739 delete $targets{$debugkey};
740 }
741 }
742 }
743 }
744 }
745
f09e7ca9 746 %table = (%table, %targets);
09816a2e 747
b1245529
RL
748 # Local function to resolve inheritance
749 my $resolve_inheritance;
750 $resolve_inheritance =
751 sub {
752 my $target = shift;
753 my @breadcrumbs = @_;
754
755 if (grep { $_ eq $target } @breadcrumbs) {
756 die "inherit_from loop! target backtrace:\n "
757 ,$target,"\n ",join("\n ", @breadcrumbs),"\n";
758 }
759
760 # Recurse through all inheritances. They will be resolved on
761 # the fly, so when this operation is done, they will all just
762 # be a bunch of attributes with string values.
763 # What we get here, though, are keys with references to lists
764 # of the combined values of them all. We will deal with lists
765 # after this stage is done.
766 my %combined_inheritance = ();
767 if ($table{$target}->{inherit_from}) {
768 foreach (@{$table{$target}->{inherit_from}}) {
769 my %inherited_config =
770 $resolve_inheritance->($_, $target, @breadcrumbs);
771
772 # 'template' is a marker that's considered private to
773 # the config that had it.
774 delete $inherited_config{template};
775
776 map {
777 if (!$combined_inheritance{$_}) {
778 $combined_inheritance{$_} = [];
779 }
780 push @{$combined_inheritance{$_}}, $inherited_config{$_};
781 } keys %inherited_config;
782 }
783 }
784
785 # We won't need inherit_from in this target any more, since
786 # we've resolved all the inheritances that lead to this
787 delete $table{$target}->{inherit_from};
788
789 # Now is the time to deal with those lists. Here's the place
790 # to decide what shall be done with those lists, all based on
791 # the values of the target we're currently dealing with.
792 # - If a value is a coderef, it will be executed with the list
793 # of inherited values as arguments.
794 # - If the corresponding key doesn't have a value at all or is
795 # the emoty string, the inherited value list will be run
796 # through the default combiner (below), and the result
797 # becomes this target's value.
798 # - Otherwise, this target's value is assumed to be a string
799 # that will simply override the inherited list of values.
800 my $default_combiner = sub { join(' ',@_) };
801
802 my %all_keys =
803 map { $_ => 1 } (keys %combined_inheritance,
804 keys %{$table{$target}});
805 foreach (sort keys %all_keys) {
806
807 # Current target doesn't have a value for the current key?
808 # Assign it the default combiner, the rest of this loop
809 # body will handle it just like any other coderef.
810 if (!exists $table{$target}->{$_}) {
811 $table{$target}->{$_} = $default_combiner;
7d46b942
RL
812 }
813
b1245529
RL
814 my $valuetype = ref($table{$target}->{$_});
815 if ($valuetype eq "CODE") {
816 # CODE reference, execute it with the inherited values
817 # as arguments.
818 $table{$target}->{$_} =
819 $table{$target}->{$_}->(@{$combined_inheritance{$_}});
820 } elsif ($valuetype eq "") {
821 # Scalar, just leave it as is.
7d46b942 822 } else {
b1245529
RL
823 # Some other type of reference that we don't handle.
824 # Better to abort at this point.
825 die "cannot handle reference type $valuetype,"
826 ," found in target $target -> $_\n";
7d46b942
RL
827 }
828 }
829
b1245529
RL
830 # Finally done, return the result.
831 %{$table{$target}};
832 };
7d46b942 833
b1245529
RL
834 # Go through all new targets and resolve inheritance and template
835 # references.
836 foreach (keys %targets) {
837 # We're ignoring the returned values here, they are only valuable
838 # to the inner recursion of this function.
839 $resolve_inheritance->($_);
09816a2e 840 }
f09e7ca9 841}
15c7adb0 842
f09e7ca9 843my ($vol, $dir, $dummy) = File::Spec->splitpath($0);
97a0cc52
RL
844my $pattern = File::Spec->catpath($vol, $dir, "Configurations/*.conf");
845foreach (sort glob($pattern) ) {
f09e7ca9
RS
846 &read_config($_);
847}
d02b48c6 848
33c3ecf7 849my @MK1MF_Builds=qw(VC-WIN64I VC-WIN64A
eba2b51d 850 debug-VC-WIN64I debug-VC-WIN64A
71b7858b 851 VC-NT VC-CE VC-WIN32 debug-VC-WIN32
fce0ba5f 852 BC-32
eef0c1f3
DSH
853 netware-clib netware-clib-bsdsock
854 netware-libc netware-libc-bsdsock);
efadf60f 855
e5f3045f 856my $prefix="";
6727565a 857my $libdir="";
462ba4f6 858my $openssldir="";
967d95f0 859my $exe_ext="";
122276a7 860my $install_prefix= "$ENV{'INSTALL_PREFIX'}";
cbfb39d1 861my $cross_compile_prefix="";
166c9cb0 862my $fipslibdir="/usr/local/ssl/fips-2.0/lib/";
1ab2f7f1 863my $nofipscanistercheck=0;
1ab2f7f1 864my $baseaddr="0xFB00000";
5f8d5c96
BM
865my $no_threads=0;
866my $threads=0;
c9a112f5
BM
867my $no_shared=0; # but "no-shared" is default
868my $zlib=1; # but "no-zlib" is default
869my $no_krb5=0; # but "no-krb5" is implied unless "--with-krb5-..." is used
d137b56a 870my $no_rfc3779=1; # but "no-rfc3779" is default
1641cb60 871my $no_asm=0;
bc2aadad 872my $no_dso=0;
987bebaf 873my $no_gmp=0;
f5d7a031 874my @skip=();
42ba5d23 875my $Makefile="Makefile";
1641cb60
BL
876my $des_locl="crypto/des/des_locl.h";
877my $des ="crypto/des/des.h";
878my $bn ="crypto/bn/bn.h";
879my $md2 ="crypto/md2/md2.h";
880my $rc4 ="crypto/rc4/rc4.h";
881my $rc4_locl="crypto/rc4/rc4_locl.h";
882my $idea ="crypto/idea/idea.h";
883my $rc2 ="crypto/rc2/rc2.h";
884my $bf ="crypto/bf/bf_locl.h";
885my $bn_asm ="bn_asm.o";
886my $des_enc="des_enc.o fcrypt_b.o";
874a3757 887my $aes_enc="aes_core.o aes_cbc.o";
1641cb60
BL
888my $bf_enc ="bf_enc.o";
889my $cast_enc="c_enc.o";
28754624 890my $rc4_enc="rc4_enc.o rc4_skey.o";
1641cb60 891my $rc5_enc="rc5_enc.o";
6a8517f2 892my $cmll_enc="camellia.o cmll_misc.o cmll_cbc.o";
2613c1fa 893my $processor="";
0396479d 894my $default_ranlib;
99aab161 895my $perl;
1ab2f7f1 896my $fips=0;
99aab161 897
c9a112f5
BM
898# All of the following is disabled by default (RC5 was enabled before 0.9.8):
899
7a762197 900my %disabled = ( # "what" => "comment" [or special keyword "experimental"]
07c4c14c 901 "deprecated" => "default",
7d8bb912 902 "ec_nistp_64_gcc_128" => "default",
987bebaf 903 "gmp" => "default",
7d8bb912
BM
904 "jpake" => "experimental",
905 "md2" => "default",
906 "rc5" => "default",
96ea4ae9 907 "rfc3779" => "default",
7e159e01 908 "sctp" => "default",
7d8bb912 909 "shared" => "default",
93ab9e42 910 "ssl-trace" => "default",
ae3b4f23 911 "store" => "experimental",
e0fc7961 912 "unit-test" => "default",
7d8bb912
BM
913 "zlib" => "default",
914 "zlib-dynamic" => "default"
915 );
7a762197 916my @experimental = ();
c9a112f5 917
7a762197
BM
918# This is what $depflags will look like with the above defaults
919# (we need this to see if we should advise the user to run "make depend"):
07c4c14c 920my $default_depflags = " -DOPENSSL_NO_DEPRECATED -DOPENSSL_NO_EC_NISTP_64_GCC_128 -DOPENSSL_NO_GMP -DOPENSSL_NO_JPAKE -DOPENSSL_NO_MD2 -DOPENSSL_NO_RC5 -DOPENSSL_NO_RFC3779 -DOPENSSL_NO_SCTP -DOPENSSL_NO_SSL_TRACE -DOPENSSL_NO_STORE -DOPENSSL_NO_UNIT_TEST";
7a762197
BM
921
922# Explicit "no-..." options will be collected in %disabled along with the defaults.
923# To remove something from %disabled, use "enable-foo" (unless it's experimental).
924# For symmetry, "disable-foo" is a synonym for "no-foo".
925
926# For features called "experimental" here, a more explicit "experimental-foo" is needed to enable.
927# We will collect such requests in @experimental.
928# To avoid accidental use of experimental features, applications will have to use -DOPENSSL_EXPERIMENTAL_FOO.
ab185b60
BM
929
930
d0590fe6 931my $no_sse2=0;
b6e4dac2 932
462ba4f6 933&usage if ($#ARGV < 0);
d02b48c6 934
c59cb511
RL
935my $flags;
936my $depflags;
7a762197 937my $openssl_experimental_defines;
c59cb511
RL
938my $openssl_algorithm_defines;
939my $openssl_thread_defines;
cf1b7d96 940my $openssl_sys_defines="";
c59cb511
RL
941my $openssl_other_defines;
942my $libs;
c1269c81 943my $libkrb5="";
c59cb511
RL
944my $target;
945my $options;
946my $symlink;
451dc18f 947my $make_depend=0;
f9b3bff6 948my %withargs=();
9e43c6b5 949my $build_prefix = "release_";
c59cb511
RL
950
951my @argvcopy=@ARGV;
952my $argvstring="";
953my $argv_unprocessed=1;
954
955while($argv_unprocessed)
d02b48c6 956 {
c59cb511
RL
957 $flags="";
958 $depflags="";
7a762197 959 $openssl_experimental_defines="";
c59cb511
RL
960 $openssl_algorithm_defines="";
961 $openssl_thread_defines="";
cf1b7d96 962 $openssl_sys_defines="";
c59cb511
RL
963 $openssl_other_defines="";
964 $libs="";
965 $target="";
966 $options="";
967 $symlink=1;
968
969 $argv_unprocessed=0;
970 $argvstring=join(' ',@argvcopy);
971
972PROCESS_ARGS:
973 foreach (@argvcopy)
f5d7a031 974 {
c59cb511 975 s /^-no-/no-/; # some people just can't read the instructions
c9a112f5
BM
976
977 # rewrite some options in "enable-..." form
978 s /^-?-?shared$/enable-shared/;
7e159e01 979 s /^sctp$/enable-sctp/;
c9a112f5
BM
980 s /^threads$/enable-threads/;
981 s /^zlib$/enable-zlib/;
982 s /^zlib-dynamic$/enable-zlib-dynamic/;
983
984 if (/^no-(.+)$/ || /^disable-(.+)$/)
d02b48c6 985 {
7a762197 986 if (!($disabled{$1} eq "experimental"))
e172d60d 987 {
7a762197
BM
988 if ($1 eq "ssl")
989 {
7a762197
BM
990 $disabled{"ssl3"} = "option(ssl)";
991 }
992 elsif ($1 eq "tls")
993 {
994 $disabled{"tls1"} = "option(tls)"
995 }
3881d810
DSH
996 elsif ($1 eq "ssl3-method")
997 {
998 $disabled{"ssl3-method"} = "option(ssl)";
999 $disabled{"ssl3"} = "option(ssl)";
1000 }
7a762197
BM
1001 else
1002 {
1003 $disabled{$1} = "option";
1004 }
fce0ba5f 1005 }
7a762197
BM
1006 }
1007 elsif (/^enable-(.+)$/ || /^experimental-(.+)$/)
1008 {
1009 my $algo = $1;
1010 if ($disabled{$algo} eq "experimental")
b6e4dac2 1011 {
7a762197
BM
1012 die "You are requesting an experimental feature; please say 'experimental-$algo' if you are sure\n"
1013 unless (/^experimental-/);
1014 push @experimental, $algo;
b6e4dac2 1015 }
7a762197 1016 delete $disabled{$algo};
c9a112f5 1017
7a762197 1018 $threads = 1 if ($algo eq "threads");
c9a112f5
BM
1019 }
1020 elsif (/^--test-sanity$/)
1021 {
1022 exit(&test_sanity());
d02b48c6 1023 }
9e43c6b5 1024 elsif (/^--strict-warnings$/)
0c28f277
DSH
1025 {
1026 $strict_warnings = 1;
1027 }
9e43c6b5
RL
1028 elsif (/^--debug$/)
1029 {
1030 $build_prefix = "debug_";
1031 }
1032 elsif (/^--release$/)
1033 {
1034 $build_prefix = "release_";
1035 }
c59cb511 1036 elsif (/^reconfigure/ || /^reconf/)
d02b48c6 1037 {
c59cb511
RL
1038 if (open(IN,"<$Makefile"))
1039 {
1040 while (<IN>)
1041 {
67475a7e 1042 chomp;
c59cb511
RL
1043 if (/^CONFIGURE_ARGS=(.*)/)
1044 {
1045 $argvstring=$1;
1046 @argvcopy=split(' ',$argvstring);
1047 die "Incorrect data to reconfigure, please do a normal configuration\n"
1048 if (grep(/^reconf/,@argvcopy));
1049 print "Reconfiguring with: $argvstring\n";
1050 $argv_unprocessed=1;
1051 close(IN);
1052 last PROCESS_ARGS;
1053 }
1054 }
1055 close(IN);
1056 }
1057 die "Insufficient data to reconfigure, please do a normal configuration\n";
d02b48c6 1058 }
c59cb511 1059 elsif (/^386$/)
c9a112f5 1060 { $processor=386; }
9fdb2cc5
DSH
1061 elsif (/^fips$/)
1062 {
1063 $fips=1;
7d8bb912 1064 }
c59cb511 1065 elsif (/^rsaref$/)
3eb0ed6d 1066 {
ccb9643f
RL
1067 # No RSAref support any more since it's not needed.
1068 # The check for the option is there so scripts aren't
1069 # broken
462ba4f6 1070 }
1ab2f7f1
DSH
1071 elsif (/^nofipscanistercheck$/)
1072 {
1073 $fips = 1;
1074 $nofipscanistercheck = 1;
1075 }
c59cb511 1076 elsif (/^[-+]/)
462ba4f6 1077 {
800a4a70 1078 if (/^--prefix=(.*)$/)
c59cb511
RL
1079 {
1080 $prefix=$1;
1081 }
6727565a
DSH
1082 elsif (/^--libdir=(.*)$/)
1083 {
1084 $libdir=$1;
1085 }
c59cb511
RL
1086 elsif (/^--openssldir=(.*)$/)
1087 {
1088 $openssldir=$1;
1089 }
1090 elsif (/^--install.prefix=(.*)$/)
1091 {
1092 $install_prefix=$1;
1093 }
f9b3bff6
RL
1094 elsif (/^--with-krb5-(dir|lib|include|flavor)=(.*)$/)
1095 {
1096 $withargs{"krb5-".$1}=$2;
1097 }
1291dfde 1098 elsif (/^--with-zlib-lib=(.*)$/)
ad2695b1 1099 {
1291dfde
DSH
1100 $withargs{"zlib-lib"}=$1;
1101 }
1102 elsif (/^--with-zlib-include=(.*)$/)
1103 {
1104 $withargs{"zlib-include"}="-I$1";
ad2695b1 1105 }
cc8bd545
DSH
1106 elsif (/^--with-fipslibdir=(.*)$/)
1107 {
1108 $fipslibdir="$1/";
1109 }
1110 elsif (/^--with-baseaddr=(.*)$/)
1111 {
1112 $baseaddr="$1";
1113 }
cbfb39d1
AP
1114 elsif (/^--cross-compile-prefix=(.*)$/)
1115 {
1116 $cross_compile_prefix=$1;
1117 }
f09e7ca9
RS
1118 elsif (/^--config=(.*)$/)
1119 {
1120 read_config $1;
1121 }
800a4a70 1122 elsif (/^-[lL](.*)$/ or /^-Wl,/)
c59cb511 1123 {
800a4a70
AP
1124 $libs.=$_." ";
1125 }
1126 else # common if (/^[-+]/), just pass down...
1127 {
1128 $_ =~ s/%([0-9a-f]{1,2})/chr(hex($1))/gei;
1129 $flags.=$_." ";
c59cb511 1130 }
3eb0ed6d 1131 }
c59cb511 1132 elsif ($_ =~ /^([^:]+):(.+)$/)
e5f3045f 1133 {
c59cb511
RL
1134 eval "\$table{\$1} = \"$2\""; # allow $xxx constructs in the string
1135 $target=$1;
e5f3045f 1136 }
d02b48c6
RE
1137 else
1138 {
a761b89d 1139 die "target already defined - $target (offending arg: $_)\n" if ($target ne "");
c59cb511
RL
1140 $target=$_;
1141 }
c9a112f5
BM
1142
1143 unless ($_ eq $target || /^no-/ || /^disable-/)
1144 {
1145 # "no-..." follows later after implied disactivations
1146 # have been derived. (Don't take this too seroiusly,
1147 # we really only write OPTIONS to the Makefile out of
1148 # nostalgia.)
1149
1150 if ($options eq "")
1151 { $options = $_; }
1152 else
1153 { $options .= " ".$_; }
d02b48c6 1154 }
fbabb752
BM
1155 }
1156 }
d02b48c6 1157
b6e4dac2 1158
b6e4dac2 1159
c9a112f5
BM
1160if ($processor eq "386")
1161 {
1162 $disabled{"sse2"} = "forced";
1163 }
1164
1165if (!defined($withargs{"krb5-flavor"}) || $withargs{"krb5-flavor"} eq "")
1166 {
1167 $disabled{"krb5"} = "krb5-flavor not specified";
1168 }
1169
1170if (!defined($disabled{"zlib-dynamic"}))
1171 {
1172 # "zlib-dynamic" was specifically enabled, so enable "zlib"
1173 delete $disabled{"zlib"};
1174 }
b6e4dac2 1175
c9a112f5
BM
1176if (defined($disabled{"rijndael"}))
1177 {
1178 $disabled{"aes"} = "forced";
1179 }
1180if (defined($disabled{"des"}))
1181 {
1182 $disabled{"mdc2"} = "forced";
1183 }
1184if (defined($disabled{"ec"}))
b6e4dac2 1185 {
c9a112f5
BM
1186 $disabled{"ecdsa"} = "forced";
1187 $disabled{"ecdh"} = "forced";
b6e4dac2
RL
1188 }
1189
c9a112f5
BM
1190# SSL 3.0 and TLS requires MD5 and SHA and either RSA or DSA+DH
1191if (defined($disabled{"md5"}) || defined($disabled{"sha"})
1192 || (defined($disabled{"rsa"})
1193 && (defined($disabled{"dsa"}) || defined($disabled{"dh"}))))
b6e4dac2 1194 {
c9a112f5
BM
1195 $disabled{"ssl3"} = "forced";
1196 $disabled{"tls1"} = "forced";
b6e4dac2
RL
1197 }
1198
f1fd4544
BM
1199if (defined($disabled{"tls1"}))
1200 {
1201 $disabled{"tlsext"} = "forced";
1202 }
c9a112f5 1203
d4f0339c
DSH
1204if (defined($disabled{"ec"}) || defined($disabled{"dsa"})
1205 || defined($disabled{"dh"}))
ef236ec3
DSH
1206 {
1207 $disabled{"gost"} = "forced";
1208 }
1209
e2ca32fc 1210# SRP and HEARTBEATS require TLSEXT
edc032b5
BL
1211if (defined($disabled{"tlsext"}))
1212 {
1213 $disabled{"srp"} = "forced";
e2ca32fc 1214 $disabled{"heartbeats"} = "forced";
edc032b5
BL
1215 }
1216
436a376b
BM
1217if ($target eq "TABLE") {
1218 foreach $target (sort keys %table) {
aaf878cc 1219 print_table_entry($target, "TABLE");
436a376b 1220 }
436a376b
BM
1221 exit 0;
1222}
1223
10a926c1
UM
1224if ($target eq "LIST") {
1225 foreach (sort keys %table) {
1226 print;
1227 print "\n";
1228 }
1229 exit 0;
1230}
1231
aaf878cc
RL
1232if ($target eq "HASH") {
1233 print "%table = (\n";
1234 foreach (sort keys %table) {
1235 print_table_entry($_, "HASH");
1236 }
1237 exit 0;
1238}
1239
49e04548
RL
1240if ($target =~ m/^CygWin32(-.*)$/) {
1241 $target = "Cygwin".$1;
1242}
1243
c59cb511
RL
1244print "Configuring for $target\n";
1245
9e43c6b5 1246# Support for legacy targets having a name starting with 'debug-'
aaf878cc 1247my ($d, $t) = $target =~ m/^(debug-)?(.*)$/;
aaf878cc 1248if ($d) {
9e43c6b5 1249 $build_prefix = "debug_";
aaf878cc
RL
1250
1251 # If we do not find debug-foo in the table, the target is set to foo,
b1245529 1252 # but only if the foo target has a noon-empty debug_cflags or debug_lflags
aaf878cc 1253 # attribute.
b1245529
RL
1254 if (!$table{$target} && ($table{$t}->{debug_cflags}
1255 || $table{$t}->{debug_lflags})) {
aaf878cc
RL
1256 $target = $t;
1257 }
1258}
1259
9e43c6b5
RL
1260&usage if (!defined($table{$target})
1261 || $table{$target}->{template}
1262 || ($build_prefix eq "debug_"
1263 && !($table{$target}->{debug_cflags}
1264 || $table{$target}->{debug_lflags})));
462ba4f6 1265
9fdb2cc5
DSH
1266if ($fips)
1267 {
1268 delete $disabled{"shared"} if ($disabled{"shared"} eq "default");
1269 }
c9a112f5
BM
1270
1271foreach (sort (keys %disabled))
1272 {
1273 $options .= " no-$_";
1274
1275 printf " no-%-12s %-10s", $_, "[$disabled{$_}]";
1276
1277 if (/^dso$/)
1278 { $no_dso = 1; }
1279 elsif (/^threads$/)
1280 { $no_threads = 1; }
1281 elsif (/^shared$/)
1282 { $no_shared = 1; }
1283 elsif (/^zlib$/)
1284 { $zlib = 0; }
fbf002bb
DSH
1285 elsif (/^static-engine$/)
1286 { }
c9a112f5
BM
1287 elsif (/^zlib-dynamic$/)
1288 { }
1289 elsif (/^symlinks$/)
1290 { $symlink = 0; }
1291 elsif (/^sse2$/)
1292 { $no_sse2 = 1; }
1293 else
1294 {
1295 my ($ALGO, $algo);
30fafdeb 1296 ($ALGO = $algo = $_) =~ tr/[\-a-z]/[_A-Z]/;
c9a112f5
BM
1297
1298 if (/^asm$/ || /^err$/ || /^hw$/ || /^hw-/)
1299 {
1300 $openssl_other_defines .= "#define OPENSSL_NO_$ALGO\n";
1301 print " OPENSSL_NO_$ALGO";
fce0ba5f 1302
5df70a9e
AP
1303 if (/^err$/) { $flags .= "-DOPENSSL_NO_ERR "; }
1304 elsif (/^asm$/) { $no_asm = 1; }
c9a112f5
BM
1305 }
1306 else
1307 {
2a4af947
AP
1308 ($ALGO,$algo) = ("RMD160","rmd160") if ($algo eq "ripemd");
1309
c9a112f5
BM
1310 $openssl_algorithm_defines .= "#define OPENSSL_NO_$ALGO\n";
1311 print " OPENSSL_NO_$ALGO";
1312
1313 if (/^krb5$/)
1314 { $no_krb5 = 1; }
1315 else
1316 {
1317 push @skip, $algo;
ce0ed3b7 1318 # fix-up crypto/directory name(s)
f09e7ca9
RS
1319 $skip[$#skip]="whrlpool" if $algo eq "whirlpool";
1320 $skip[$#skip]="ripemd" if $algo eq "rmd160";
2a4af947 1321
c9a112f5 1322 print " (skip dir)";
ab185b60 1323
7a762197 1324 $depflags .= " -DOPENSSL_NO_$ALGO";
c9a112f5
BM
1325 }
1326 }
1327 }
1328
1329 print "\n";
1330 }
1331
7a762197 1332my $exp_cflags = "";
ccc5784e 1333
7a762197
BM
1334foreach (sort @experimental)
1335 {
1336 my $ALGO;
1337 ($ALGO = $_) =~ tr/[a-z]/[A-Z]/;
1338
1339 # opensslconf.h will set OPENSSL_NO_... unless OPENSSL_EXPERIMENTAL_... is defined
1340 $openssl_experimental_defines .= "#define OPENSSL_NO_$ALGO\n";
1341 $exp_cflags .= " -DOPENSSL_EXPERIMENTAL_$ALGO";
1342 }
c9a112f5 1343
4d8743f4 1344my $IsMK1MF=scalar grep /^$target$/,@MK1MF_Builds;
a1e464f9 1345
9be54812 1346$exe_ext=".exe" if ($target eq "Cygwin" || $target eq "DJGPP" || $target =~ /^mingw/);
eef0c1f3 1347$exe_ext=".nlm" if ($target =~ /netware/);
d0590fe6 1348$exe_ext=".pm" if ($target =~ /vos/);
5496cd3e 1349$openssldir="/usr/local/ssl" if ($openssldir eq "" and $prefix eq "");
e5f3045f 1350$prefix=$openssldir if $prefix eq "";
462ba4f6 1351
28a80034
RL
1352$default_ranlib= &which("ranlib") or $default_ranlib="true";
1353$perl=$ENV{'PERL'} or $perl=&which("perl5") or $perl=&which("perl")
1354 or $perl="perl";
dafd8333 1355my $make = $ENV{'MAKE'} || "make";
28a80034 1356
34775923 1357$cross_compile_prefix=$ENV{'CROSS_COMPILE'} if $cross_compile_prefix eq "";
f99f41cf 1358
462ba4f6 1359chop $openssldir if $openssldir =~ /\/$/;
bc645199 1360chop $prefix if $prefix =~ /.\/$/;
462ba4f6 1361
e5f3045f 1362$openssldir=$prefix . "/ssl" if $openssldir eq "";
451dc18f 1363$openssldir=$prefix . "/" . $openssldir if $openssldir !~ /(^\/|^[a-zA-Z]:[\\\/])/;
d02b48c6 1364
efadf60f 1365
4d8743f4 1366print "IsMK1MF=$IsMK1MF\n";
efadf60f 1367
7f625320 1368# Allow environment CC to override compiler...
aaf878cc
RL
1369my $cc = $ENV{CC} || $table{$t}->{cc};
1370
b1245529 1371# For cflags and lflags, add the debug_ or release_ attributes
aaf878cc
RL
1372# Do it in such a way that no spurious space is appended (hence the grep).
1373my $cflags = join(" ",
1374 grep { $_ } ($table{$t}->{cflags},
9e43c6b5 1375 $table{$t}->{$build_prefix."cflags"}));
aaf878cc
RL
1376my $lflags = join(" ",
1377 grep { $_ } ($table{$t}->{lflags},
9e43c6b5 1378 $table{$t}->{$build_prefix."lflags"}));
aaf878cc
RL
1379
1380my $unistd = $table{$t}->{unistd};
1381my $thread_cflag = $table{$t}->{thread_cflag};
1382my $sys_id = $table{$t}->{sys_id};
1383my $bn_ops = $table{$t}->{bn_ops};
1384my $cpuid_obj = $table{$t}->{cpuid_obj};
1385my $bn_obj = $table{$t}->{bn_obj};
1386my $ec_obj = $table{$t}->{ec_obj};
1387my $des_obj = $table{$t}->{des_obj};
1388my $aes_obj = $table{$t}->{aes_obj};
1389my $bf_obj = $table{$t}->{bf_obj};
1390my $md5_obj = $table{$t}->{md5_obj};
1391my $sha1_obj = $table{$t}->{sha1_obj};
1392my $cast_obj = $table{$t}->{cast_obj};
1393my $rc4_obj = $table{$t}->{rc4_obj};
1394my $rmd160_obj = $table{$t}->{rmd160_obj};
1395my $rc5_obj = $table{$t}->{rc5_obj};
1396my $wp_obj = $table{$t}->{wp_obj};
1397my $cmll_obj = $table{$t}->{cmll_obj};
1398my $modes_obj = $table{$t}->{modes_obj};
1399my $engines_obj = $table{$t}->{engines_obj};
1400my $perlasm_scheme = $table{$t}->{perlasm_scheme};
1401my $dso_scheme = $table{$t}->{dso_scheme};
1402my $shared_target = $table{$t}->{shared_target};
1403my $shared_cflag = $table{$t}->{shared_cflag};
1404my $shared_ldflag = $table{$t}->{shared_ldflag};
1405my $shared_extension = $table{$t}->{shared_extension};
1406my $ranlib = $ENV{'RANLIB'} || $table{$t}->{ranlib};
970097ae 1407my $ar = $ENV{'AR'} || "ar";
aaf878cc
RL
1408my $arflags = $table{$t}->{arflags};
1409my $multilib = $table{$t}->{multilib};
d0d046ec 1410
b730b03f
AP
1411# if $prefix/lib$multilib is not an existing directory, then
1412# assume that it's not searched by linker automatically, in
1413# which case adding $multilib suffix causes more grief than
1414# we're ready to tolerate, so don't...
1415$multilib="" if !-d "$prefix/lib$multilib";
1416
6a9d28f9
AP
1417$libdir="lib$multilib" if $libdir eq "";
1418
7a762197
BM
1419$cflags = "$cflags$exp_cflags";
1420
d6c76457
AP
1421# '%' in $lflags is used to split flags to "pre-" and post-flags
1422my ($prelflags,$postlflags)=split('%',$lflags);
1423if (defined($postlflags)) { $lflags=$postlflags; }
1424else { $lflags=$prelflags; undef $prelflags; }
1425
cbecd29a
AP
1426if ($target =~ /^mingw/ && `$cc --target-help 2>&1` !~ m/\-mno\-cygwin/m)
1427 {
1428 $cflags =~ s/\-mno\-cygwin\s*//;
1429 $shared_ldflag =~ s/\-mno\-cygwin\s*//;
1430 }
1431
63d8834c
AP
1432if ($target =~ /linux.*\-mips/ && !$no_asm && $flags !~ /\-m(ips|arch=)/) {
1433 # minimally required architecture flags for assembly modules
1434 $cflags="-mips2 $cflags" if ($target =~ /mips32/);
1435 $cflags="-mips3 $cflags" if ($target =~ /mips64/);
1436}
1437
2964ba8c 1438my $no_shared_warn=0;
14bcdb08 1439my $no_user_cflags=0;
2964ba8c 1440
14bcdb08
AP
1441if ($flags ne "") { $cflags="$flags$cflags"; }
1442else { $no_user_cflags=1; }
5f8d5c96 1443
f9b3bff6
RL
1444# Kerberos settings. The flavor must be provided from outside, either through
1445# the script "config" or manually.
c9a112f5 1446if (!$no_krb5)
f9b3bff6 1447 {
2a1ef754 1448 my ($lresolv, $lpath, $lext);
f9b3bff6
RL
1449 if ($withargs{"krb5-flavor"} =~ /^[Hh]eimdal$/)
1450 {
de868e0b
RL
1451 die "Sorry, Heimdal is currently not supported\n";
1452 }
1453 ##### HACK to force use of Heimdal.
1454 ##### WARNING: Since we don't really have adequate support for Heimdal,
1455 ##### using this will break the build. You'll have to make
1456 ##### changes to the source, and if you do, please send
1457 ##### patches to openssl-dev@openssl.org
1458 if ($withargs{"krb5-flavor"} =~ /^force-[Hh]eimdal$/)
1459 {
1460 warn "Heimdal isn't really supported. Your build WILL break\n";
ec716413 1461 warn "If you fix the problems, please send a patch to openssl-dev\@openssl.org\n";
f9b3bff6
RL
1462 $withargs{"krb5-dir"} = "/usr/heimdal"
1463 if $withargs{"krb5-dir"} eq "";
1464 $withargs{"krb5-lib"} = "-L".$withargs{"krb5-dir"}.
1465 "/lib -lgssapi -lkrb5 -lcom_err"
bf2336f4 1466 if $withargs{"krb5-lib"} eq "" && !$IsMK1MF;
f9b3bff6
RL
1467 $cflags="-DKRB5_HEIMDAL $cflags";
1468 }
2a1ef754 1469 if ($withargs{"krb5-flavor"} =~ /^[Mm][Ii][Tt]/)
f9b3bff6
RL
1470 {
1471 $withargs{"krb5-dir"} = "/usr/kerberos"
1472 if $withargs{"krb5-dir"} eq "";
1473 $withargs{"krb5-lib"} = "-L".$withargs{"krb5-dir"}.
1474 "/lib -lgssapi_krb5 -lkrb5 -lcom_err -lk5crypto"
bf2336f4 1475 if $withargs{"krb5-lib"} eq "" && !$IsMK1MF;
f9b3bff6 1476 $cflags="-DKRB5_MIT $cflags";
2a1ef754
RL
1477 $withargs{"krb5-flavor"} =~ s/^[Mm][Ii][Tt][._-]*//;
1478 if ($withargs{"krb5-flavor"} =~ /^1[._-]*[01]/)
1479 {
1480 $cflags="-DKRB5_MIT_OLD11 $cflags";
1481 }
1482 }
1483 LRESOLV:
1484 foreach $lpath ("/lib", "/usr/lib")
1485 {
1486 foreach $lext ("a", "so")
1487 {
1488 $lresolv = "$lpath/libresolv.$lext";
1489 last LRESOLV if (-r "$lresolv");
1490 $lresolv = "";
1491 }
f9b3bff6 1492 }
2a1ef754 1493 $withargs{"krb5-lib"} .= " -lresolv"
95649972 1494 if ("$lresolv" ne "");
f9b3bff6 1495 $withargs{"krb5-include"} = "-I".$withargs{"krb5-dir"}."/include"
2a1ef754
RL
1496 if $withargs{"krb5-include"} eq "" &&
1497 $withargs{"krb5-dir"} ne "";
f9b3bff6
RL
1498 }
1499
bc2aadad
GT
1500# The DSO code currently always implements all functions so that no
1501# applications will have to worry about that from a compilation point
1502# of view. However, the "method"s may return zero unless that platform
1503# has support compiled in for them. Currently each method is enabled
1504# by a define "DSO_<name>" ... we translate the "dso_scheme" config
1505# string entry into using the following logic;
eca57e92 1506my $dso_cflags;
bc2aadad
GT
1507if (!$no_dso && $dso_scheme ne "")
1508 {
9ec0126e 1509 $dso_scheme =~ tr/[a-z]/[A-Z]/;
bc2aadad
GT
1510 if ($dso_scheme eq "DLFCN")
1511 {
eca57e92 1512 $dso_cflags = "-DDSO_DLFCN -DHAVE_DLFCN_H";
bc2aadad
GT
1513 }
1514 elsif ($dso_scheme eq "DLFCN_NO_H")
1515 {
eca57e92 1516 $dso_cflags = "-DDSO_DLFCN";
bc2aadad
GT
1517 }
1518 else
1519 {
eca57e92 1520 $dso_cflags = "-DDSO_$dso_scheme";
bc2aadad 1521 }
eca57e92 1522 $cflags = "$dso_cflags $cflags";
bc2aadad 1523 }
9ec0126e 1524
5f8d5c96 1525my $thread_cflags;
fb044c59 1526my $thread_defines;
5f8d5c96
BM
1527if ($thread_cflag ne "(unknown)" && !$no_threads)
1528 {
1529 # If we know how to do it, support threads by default.
1530 $threads = 1;
1531 }
14bcdb08 1532if ($thread_cflag eq "(unknown)" && $threads)
5f8d5c96 1533 {
14bcdb08
AP
1534 # If the user asked for "threads", [s]he is also expected to
1535 # provide any system-dependent compiler options that are
1536 # necessary.
1537 if ($no_user_cflags)
1538 {
1539 print "You asked for multi-threading support, but didn't\n";
1540 print "provide any system-specific compiler options\n";
1541 exit(1);
1542 }
cf1b7d96
RL
1543 $thread_cflags="-DOPENSSL_THREADS $cflags" ;
1544 $thread_defines .= "#define OPENSSL_THREADS\n";
5f8d5c96
BM
1545 }
1546else
1547 {
cf1b7d96
RL
1548 $thread_cflags="-DOPENSSL_THREADS $thread_cflag $cflags";
1549 $thread_defines .= "#define OPENSSL_THREADS\n";
a7b991bd
BM
1550# my $def;
1551# foreach $def (split ' ',$thread_cflag)
1552# {
1553# if ($def =~ s/^-D// && $def !~ /^_/)
1554# {
1555# $thread_defines .= "#define $def\n";
1556# }
1557# }
fce0ba5f 1558 }
5f8d5c96 1559
95649972 1560$lflags="$libs$lflags" if ($libs ne "");
d02b48c6 1561
dfeab068
RE
1562if ($no_asm)
1563 {
6019cdd3 1564 $cpuid_obj=$bn_obj=$ec_obj=
ac71d81e 1565 $des_obj=$aes_obj=$bf_obj=$cast_obj=$rc4_obj=$rc5_obj=$cmll_obj=
ed28aef8 1566 $modes_obj=$sha1_obj=$md5_obj=$rmd160_obj=$wp_obj=$engines_obj="";
9fdb2cc5
DSH
1567 $cflags=~s/\-D[BL]_ENDIAN// if ($fips);
1568 $thread_cflags=~s/\-D[BL]_ENDIAN// if ($fips);
dfeab068 1569 }
03bc500a
DSH
1570elsif (defined($disabled{ec2m}))
1571 {
1572 $bn_obj =~ s/\w+-gf2m.o//;
1573 }
dfeab068 1574
6f7ac8e1
AP
1575if (!$no_shared)
1576 {
1577 $cast_obj=""; # CAST assembler is not PIC
1578 }
1579
5f8d5c96
BM
1580if ($threads)
1581 {
14bcdb08 1582 $cflags=$thread_cflags;
e452de9d
RL
1583 $openssl_thread_defines .= $thread_defines;
1584 }
1585
1586if ($zlib)
1587 {
1588 $cflags = "-DZLIB $cflags";
c9a112f5
BM
1589 if (defined($disabled{"zlib-dynamic"}))
1590 {
cc7399e7
DSH
1591 if (defined($withargs{"zlib-lib"}))
1592 {
1593 $lflags = "$lflags -L" . $withargs{"zlib-lib"} . " -lz";
1594 }
1595 else
1596 {
1597 $lflags = "$lflags -lz";
1598 }
c9a112f5
BM
1599 }
1600 else
1601 {
1602 $cflags = "-DZLIB_SHARED $cflags";
1603 }
5f8d5c96
BM
1604 }
1605
c0fc27f8
MC
1606#Build the library with OPENSSL_USE_DEPRECATED if deprecation is not disabled
1607if(!defined($disabled{"deprecated"}))
1608 {
1609 $cflags = "-DOPENSSL_USE_DEPRECATED $cflags";
1610 }
07c4c14c 1611
f4316c36 1612# You will find shlib_mark1 and shlib_mark2 explained in Makefile.org
a22fb399 1613my $shared_mark = "";
6f7ac8e1
AP
1614if ($shared_target eq "")
1615 {
9fdb2cc5 1616 $no_shared_warn = 1 if !$no_shared && !$fips;
6f7ac8e1
AP
1617 $no_shared = 1;
1618 }
1619if (!$no_shared)
b436a982 1620 {
a22fb399
RL
1621 if ($shared_cflag ne "")
1622 {
28e276f1 1623 $cflags = "$shared_cflag -DOPENSSL_PIC $cflags";
a22fb399 1624 }
d2dcf4f4 1625 }
b436a982 1626
fbf002bb 1627if (!$IsMK1MF)
ecd45314 1628 {
4c1a6e00 1629 # add {no-}static-engine to options to allow mkdef.pl to work without extra arguments
fbf002bb
DSH
1630 if ($no_shared)
1631 {
1632 $openssl_other_defines.="#define OPENSSL_NO_DYNAMIC_ENGINE\n";
4c1a6e00 1633 $options.=" static-engine";
fbf002bb
DSH
1634 }
1635 else
1636 {
1637 $openssl_other_defines.="#define OPENSSL_NO_STATIC_ENGINE\n";
4c1a6e00 1638 $options.=" no-static-engine";
fbf002bb 1639 }
6cb68620 1640 }
ecd45314 1641
beef7145 1642$cpuid_obj.=" uplink.o uplink-x86.o" if ($cflags =~ /\-DOPENSSL_USE_APPLINK/);
1187ee7d 1643
c313e32a
AP
1644#
1645# Platform fix-ups
1646#
1647if ($target =~ /\-icc$/) # Intel C compiler
1a979201 1648 {
1187ee7d
AP
1649 my $iccver=0;
1650 if (open(FD,"$cc -V 2>&1 |"))
1651 {
1652 while(<FD>) { $iccver=$1 if (/Version ([0-9]+)\./); }
1653 close(FD);
1654 }
1a979201
AP
1655 if ($iccver>=8)
1656 {
cf5ecc3e 1657 $cflags=~s/\-KPIC/-fPIC/;
1a979201
AP
1658 # Eliminate unnecessary dependency from libirc.a. This is
1659 # essential for shared library support, as otherwise
1660 # apps/openssl can end up in endless loop upon startup...
1661 $cflags.=" -Dmemcpy=__builtin_memcpy -Dmemset=__builtin_memset";
1662 }
1187ee7d
AP
1663 if ($iccver>=9)
1664 {
cf5ecc3e
AP
1665 $lflags.=" -i-static";
1666 $lflags=~s/\-no_cpprt/-no-cpprt/;
1187ee7d
AP
1667 }
1668 if ($iccver>=10)
1669 {
cf5ecc3e
AP
1670 $lflags=~s/\-i\-static/-static-intel/;
1671 }
1672 if ($iccver>=11)
1673 {
1674 $cflags.=" -no-intel-extensions"; # disable Cilk
1675 $lflags=~s/\-no\-cpprt/-no-cxxlib/;
1187ee7d 1676 }
1a979201
AP
1677 }
1678
c313e32a
AP
1679# Unlike other OSes (like Solaris, Linux, Tru64, IRIX) BSD run-time
1680# linkers (tested OpenBSD, NetBSD and FreeBSD) "demand" RPATH set on
1681# .so objects. Apparently application RPATH is not global and does
1682# not apply to .so linked with other .so. Problem manifests itself
1683# when libssl.so fails to load libcrypto.so. One can argue that we
1684# should engrave this into Makefile.shared rules or into BSD-* config
1685# lines above. Meanwhile let's try to be cautious and pass -rpath to
1686# linker only when --prefix is not /usr.
1687if ($target =~ /^BSD\-/)
1688 {
1689 $shared_ldflag.=" -Wl,-rpath,\$(LIBRPATH)" if ($prefix !~ m|^/usr[/]*$|);
1690 }
1691
cf1b7d96
RL
1692if ($sys_id ne "")
1693 {
68b00c23
RS
1694 #$cflags="-DOPENSSL_SYS_$sys_id $cflags";
1695 $openssl_sys_defines="#define OPENSSL_SYS_$sys_id\n";
cf1b7d96
RL
1696 }
1697
0396479d
BM
1698if ($ranlib eq "")
1699 {
1700 $ranlib = $default_ranlib;
1701 }
1702
1750ebcb
DSH
1703#my ($bn1)=split(/\s+/,$bn_obj);
1704#$bn1 = "" unless defined $bn1;
1705#$bn1=$bn_asm unless ($bn1 =~ /\.o$/);
1706#$bn_obj="$bn1";
1707
c9a112f5 1708$cpuid_obj="" if ($processor eq "386");
f8c469de 1709
1750ebcb 1710$bn_obj = $bn_asm unless $bn_obj ne "";
d05a4745
BM
1711# bn-586 is the only one implementing bn_*_part_words
1712$cflags.=" -DOPENSSL_BN_ASM_PART_WORDS" if ($bn_obj =~ /bn-586/);
4287ade5 1713$cflags.=" -DOPENSSL_IA32_SSE2" if (!$no_sse2 && $bn_obj =~ /86/);
dfeab068 1714
d05a4745 1715$cflags.=" -DOPENSSL_BN_ASM_MONT" if ($bn_obj =~ /-mont/);
361512da 1716$cflags.=" -DOPENSSL_BN_ASM_MONT5" if ($bn_obj =~ /-mont5/);
925596f8 1717$cflags.=" -DOPENSSL_BN_ASM_GF2m" if ($bn_obj =~ /-gf2m/);
5ac7bde7 1718
1ab2f7f1
DSH
1719if ($fips)
1720 {
1721 $openssl_other_defines.="#define OPENSSL_FIPS\n";
1ab2f7f1
DSH
1722 }
1723
b2dba9bf 1724$cpuid_obj="mem_clr.o" unless ($cpuid_obj =~ /\.o$/);
58964a49
RE
1725$des_obj=$des_enc unless ($des_obj =~ /\.o$/);
1726$bf_obj=$bf_enc unless ($bf_obj =~ /\.o$/);
1727$cast_obj=$cast_enc unless ($cast_obj =~ /\.o$/);
1728$rc4_obj=$rc4_enc unless ($rc4_obj =~ /\.o$/);
1729$rc5_obj=$rc5_enc unless ($rc5_obj =~ /\.o$/);
1730if ($sha1_obj =~ /\.o$/)
1731 {
1732# $sha1_obj=$sha1_enc;
d0590fe6
AP
1733 $cflags.=" -DSHA1_ASM" if ($sha1_obj =~ /sx86/ || $sha1_obj =~ /sha1/);
1734 $cflags.=" -DSHA256_ASM" if ($sha1_obj =~ /sha256/);
1735 $cflags.=" -DSHA512_ASM" if ($sha1_obj =~ /sha512/);
69216cc5 1736 if ($sha1_obj =~ /sse2/)
d0590fe6
AP
1737 { if ($no_sse2)
1738 { $sha1_obj =~ s/\S*sse2\S+//; }
1739 elsif ($cflags !~ /OPENSSL_IA32_SSE2/)
1740 { $cflags.=" -DOPENSSL_IA32_SSE2"; }
1741 }
58964a49
RE
1742 }
1743if ($md5_obj =~ /\.o$/)
1744 {
1745# $md5_obj=$md5_enc;
1746 $cflags.=" -DMD5_ASM";
1747 }
1748if ($rmd160_obj =~ /\.o$/)
1749 {
1750# $rmd160_obj=$rmd160_enc;
1751 $cflags.=" -DRMD160_ASM";
1752 }
d0590fe6
AP
1753if ($aes_obj =~ /\.o$/)
1754 {
e8d93e34 1755 $cflags.=" -DAES_ASM" if ($aes_obj =~ m/\baes\-/);;
77aae965 1756 # aes-ctr.o is not a real file, only indication that assembler
874a3757 1757 # module implements AES_ctr32_encrypt...
77aae965 1758 $cflags.=" -DAES_CTR_ASM" if ($aes_obj =~ s/\s*aes\-ctr\.o//);
478b50cf 1759 # aes-xts.o indicates presence of AES_xts_[en|de]crypt...
77aae965 1760 $cflags.=" -DAES_XTS_ASM" if ($aes_obj =~ s/\s*aes\-xts\.o//);
1db4a63b 1761 $aes_obj =~ s/\s*(vpaes|aesni)\-x86\.o//g if ($no_sse2);
8ca28da0 1762 $cflags.=" -DVPAES_ASM" if ($aes_obj =~ m/vpaes/);
993adc05 1763 $cflags.=" -DBSAES_ASM" if ($aes_obj =~ m/bsaes/);
d0590fe6 1764 }
7de4b5b0
AP
1765else {
1766 $aes_obj=$aes_enc;
1767 }
4c5e19b6 1768$wp_obj="" if ($wp_obj =~ /mmx/ && $processor eq "386");
ce0ed3b7 1769if ($wp_obj =~ /\.o$/ && !$disabled{"whirlpool"})
ed26604a 1770 {
4c5e19b6
AP
1771 $cflags.=" -DWHIRLPOOL_ASM";
1772 }
1773else {
1774 $wp_obj="wp_block.o";
ed26604a 1775 }
6a8517f2 1776$cmll_obj=$cmll_enc unless ($cmll_obj =~ /.o$/);
82741e9c 1777if ($modes_obj =~ /ghash\-/)
8a1c92ce
AP
1778 {
1779 $cflags.=" -DGHASH_ASM";
1780 }
84714790
AP
1781if ($ec_obj =~ /ecp_nistz256/)
1782 {
1783 $cflags.=" -DECP_NISTZ256_ASM";
1784 }
d02b48c6 1785
1ed0c662
RL
1786# "Stringify" the C flags string. This permits it to be made part of a string
1787# and works as well on command lines.
1788$cflags =~ s/([\\\"])/\\\1/g;
1789
0973910f 1790my $version = "unknown";
fc6a6a10 1791my $version_num = "unknown";
0973910f
UM
1792my $major = "unknown";
1793my $minor = "unknown";
b436a982
RL
1794my $shlib_version_number = "unknown";
1795my $shlib_version_history = "unknown";
1796my $shlib_major = "unknown";
1797my $shlib_minor = "unknown";
0973910f
UM
1798
1799open(IN,'<crypto/opensslv.h') || die "unable to read opensslv.h:$!\n";
1800while (<IN>)
1801 {
1802 $version=$1 if /OPENSSL.VERSION.TEXT.*OpenSSL (\S+) /;
fc6a6a10 1803 $version_num=$1 if /OPENSSL.VERSION.NUMBER.*0x(\S+)/;
b436a982
RL
1804 $shlib_version_number=$1 if /SHLIB_VERSION_NUMBER *"([^"]+)"/;
1805 $shlib_version_history=$1 if /SHLIB_VERSION_HISTORY *"([^"]*)"/;
0973910f
UM
1806 }
1807close(IN);
b436a982 1808if ($shlib_version_history ne "") { $shlib_version_history .= ":"; }
0973910f 1809
1fac96e4 1810if ($version =~ /(^[0-9]*)\.([0-9\.]*)/)
0973910f
UM
1811 {
1812 $major=$1;
1813 $minor=$2;
1814 }
1815
b436a982
RL
1816if ($shlib_version_number =~ /(^[0-9]*)\.([0-9\.]*)/)
1817 {
1818 $shlib_major=$1;
1819 $shlib_minor=$2;
1820 }
1821
0c28f277
DSH
1822if ($strict_warnings)
1823 {
1824 my $wopt;
cb2bc054 1825 die "ERROR --strict-warnings requires gcc or clang" unless ($cc =~ /gcc$/ or $cc =~ /clang$/);
0c28f277
DSH
1826 foreach $wopt (split /\s+/, $gcc_devteam_warn)
1827 {
1828 $cflags .= " $wopt" unless ($cflags =~ /$wopt/)
1829 }
1830 }
1831
78c990c1 1832open(IN,"<Makefile.org") || die "unable to read Makefile.org:$!\n";
c2aa4f20
RL
1833unlink("$Makefile.new") || die "unable to remove old $Makefile.new:$!\n" if -e "$Makefile.new";
1834open(OUT,">$Makefile.new") || die "unable to create $Makefile.new:$!\n";
78c990c1 1835print OUT "### Generated automatically from Makefile.org by Configure.\n\n";
f5d7a031 1836my $sdirs=0;
edd4d402 1837
d02b48c6
RE
1838while (<IN>)
1839 {
67475a7e 1840 chomp;
f5d7a031 1841 $sdirs = 1 if /^SDIRS=/;
f5d7a031
UM
1842 if ($sdirs) {
1843 my $dir;
1844 foreach $dir (@skip) {
ed551cdd
DSH
1845 s/(\s)$dir /$1/;
1846 s/\s$dir$//;
f5d7a031
UM
1847 }
1848 }
f6f0420d 1849 $sdirs = 0 unless /\\$/;
7e23e857 1850 s/fips // if (/^DIRS=/ && !$fips);
a63bf2c5 1851 s/engines // if (/^DIRS=/ && $disabled{"engine"});
ef236ec3 1852 s/ccgost// if (/^ENGDIRS=/ && $disabled{"gost"});
0973910f
UM
1853 s/^VERSION=.*/VERSION=$version/;
1854 s/^MAJOR=.*/MAJOR=$major/;
1855 s/^MINOR=.*/MINOR=$minor/;
b436a982
RL
1856 s/^SHLIB_VERSION_NUMBER=.*/SHLIB_VERSION_NUMBER=$shlib_version_number/;
1857 s/^SHLIB_VERSION_HISTORY=.*/SHLIB_VERSION_HISTORY=$shlib_version_history/;
1858 s/^SHLIB_MAJOR=.*/SHLIB_MAJOR=$shlib_major/;
1859 s/^SHLIB_MINOR=.*/SHLIB_MINOR=$shlib_minor/;
a22fb399 1860 s/^SHLIB_EXT=.*/SHLIB_EXT=$shared_extension/;
e5f3045f 1861 s/^INSTALLTOP=.*$/INSTALLTOP=$prefix/;
c23632d3 1862 s/^MULTILIB=.*$/MULTILIB=$multilib/;
462ba4f6 1863 s/^OPENSSLDIR=.*$/OPENSSLDIR=$openssldir/;
6727565a 1864 s/^LIBDIR=.*$/LIBDIR=$libdir/;
e5f3045f 1865 s/^INSTALL_PREFIX=.*$/INSTALL_PREFIX=$install_prefix/;
dfeab068 1866 s/^PLATFORM=.*$/PLATFORM=$target/;
31ff97b2 1867 s/^OPTIONS=.*$/OPTIONS=$options/;
c59cb511 1868 s/^CONFIGURE_ARGS=.*$/CONFIGURE_ARGS=$argvstring/;
cbfb39d1
AP
1869 if ($cross_compile_prefix)
1870 {
8aab301b
DSH
1871 s/^CC=.*$/CROSS_COMPILE= $cross_compile_prefix\nCC= \$\(CROSS_COMPILE\)$cc/;
1872 s/^AR=\s*/AR= \$\(CROSS_COMPILE\)/;
1873 s/^NM=\s*/NM= \$\(CROSS_COMPILE\)/;
1874 s/^RANLIB=\s*/RANLIB= \$\(CROSS_COMPILE\)/;
1875 s/^MAKEDEPPROG=.*$/MAKEDEPPROG= \$\(CROSS_COMPILE\)$cc/ if $cc eq "gcc";
cbfb39d1
AP
1876 }
1877 else {
1878 s/^CC=.*$/CC= $cc/;
8844a69c 1879 s/^AR=\s*ar/AR= $ar/;
cbfb39d1 1880 s/^RANLIB=.*/RANLIB= $ranlib/;
a6bbbf2f 1881 s/^MAKEDEPPROG=.*$/MAKEDEPPROG= $cc/ if $cc eq "gcc" || ($cc eq 'cc' && $target =~ /darwin/);
cbfb39d1 1882 }
d02b48c6 1883 s/^CFLAG=.*$/CFLAG= $cflags/;
7a762197 1884 s/^DEPFLAG=.*$/DEPFLAG=$depflags/;
d6c76457 1885 s/^PEX_LIBS=.*$/PEX_LIBS= $prelflags/;
d02b48c6 1886 s/^EX_LIBS=.*$/EX_LIBS= $lflags/;
967d95f0 1887 s/^EXE_EXT=.*$/EXE_EXT= $exe_ext/;
14e21f86 1888 s/^CPUID_OBJ=.*$/CPUID_OBJ= $cpuid_obj/;
06287285 1889 s/^BN_ASM=.*$/BN_ASM= $bn_obj/;
6019cdd3 1890 s/^EC_ASM=.*$/EC_ASM= $ec_obj/;
d02b48c6 1891 s/^DES_ENC=.*$/DES_ENC= $des_obj/;
0ddd3ea2 1892 s/^AES_ENC=.*$/AES_ENC= $aes_obj/;
d02b48c6 1893 s/^BF_ENC=.*$/BF_ENC= $bf_obj/;
58964a49
RE
1894 s/^CAST_ENC=.*$/CAST_ENC= $cast_obj/;
1895 s/^RC4_ENC=.*$/RC4_ENC= $rc4_obj/;
1896 s/^RC5_ENC=.*$/RC5_ENC= $rc5_obj/;
1897 s/^MD5_ASM_OBJ=.*$/MD5_ASM_OBJ= $md5_obj/;
1898 s/^SHA1_ASM_OBJ=.*$/SHA1_ASM_OBJ= $sha1_obj/;
1899 s/^RMD160_ASM_OBJ=.*$/RMD160_ASM_OBJ= $rmd160_obj/;
ed26604a 1900 s/^WP_ASM_OBJ=.*$/WP_ASM_OBJ= $wp_obj/;
6a8517f2 1901 s/^CMLL_ENC=.*$/CMLL_ENC= $cmll_obj/;
8a1c92ce 1902 s/^MODES_ASM_OBJ.=*$/MODES_ASM_OBJ= $modes_obj/;
ed28aef8 1903 s/^ENGINES_ASM_OBJ.=*$/ENGINES_ASM_OBJ= $engines_obj/;
fa8e921f 1904 s/^PERLASM_SCHEME=.*$/PERLASM_SCHEME= $perlasm_scheme/;
2613c1fa 1905 s/^PROCESSOR=.*/PROCESSOR= $processor/;
179add2b 1906 s/^ARFLAGS=.*/ARFLAGS= $arflags/;
99aab161 1907 s/^PERL=.*/PERL= $perl/;
f9b3bff6 1908 s/^KRB5_INCLUDES=.*/KRB5_INCLUDES=$withargs{"krb5-include"}/;
c1269c81 1909 s/^LIBKRB5=.*/LIBKRB5=$withargs{"krb5-lib"}/;
ad2695b1
DSH
1910 s/^LIBZLIB=.*/LIBZLIB=$withargs{"zlib-lib"}/;
1911 s/^ZLIB_INCLUDE=.*/ZLIB_INCLUDE=$withargs{"zlib-include"}/;
1ab2f7f1 1912 s/^FIPSLIBDIR=.*/FIPSLIBDIR=$fipslibdir/;
d47d0d2b
DSH
1913 s/^FIPSCANLIB=.*/FIPSCANLIB=libcrypto/ if $fips;
1914 s/^SHARED_FIPS=.*/SHARED_FIPS=/;
1915 s/^SHLIBDIRS=.*/SHLIBDIRS= crypto ssl/;
1ab2f7f1 1916 s/^BASEADDR=.*/BASEADDR=$baseaddr/;
b436a982 1917 s/^SHLIB_TARGET=.*/SHLIB_TARGET=$shared_target/;
a22fb399
RL
1918 s/^SHLIB_MARK=.*/SHLIB_MARK=$shared_mark/;
1919 s/^SHARED_LIBS=.*/SHARED_LIBS=\$(SHARED_CRYPTO) \$(SHARED_SSL)/ if (!$no_shared);
0fd44e2d
RL
1920 if ($shared_extension ne "" && $shared_extension =~ /^\.s([ol])\.[^\.]*$/)
1921 {
1922 my $sotmp = $1;
07c08ed4
RL
1923 s/^SHARED_LIBS_LINK_EXTS=.*/SHARED_LIBS_LINK_EXTS=.s$sotmp/;
1924 }
1925 elsif ($shared_extension ne "" && $shared_extension =~ /^\.[^\.]*\.dylib$/)
1926 {
1927 s/^SHARED_LIBS_LINK_EXTS=.*/SHARED_LIBS_LINK_EXTS=.dylib/;
0fd44e2d
RL
1928 }
1929 elsif ($shared_extension ne "" && $shared_extension =~ /^\.s([ol])\.[^\.]*\.[^\.]*$/)
1930 {
1931 my $sotmp = $1;
1932 s/^SHARED_LIBS_LINK_EXTS=.*/SHARED_LIBS_LINK_EXTS=.s$sotmp.\$(SHLIB_MAJOR) .s$sotmp/;
1933 }
07c08ed4
RL
1934 elsif ($shared_extension ne "" && $shared_extension =~ /^\.[^\.]*\.[^\.]*\.dylib$/)
1935 {
1936 s/^SHARED_LIBS_LINK_EXTS=.*/SHARED_LIBS_LINK_EXTS=.\$(SHLIB_MAJOR).dylib .dylib/;
1937 }
a5595fde 1938 s/^SHARED_LDFLAGS=.*/SHARED_LDFLAGS=$shared_ldflag/;
d02b48c6
RE
1939 print OUT $_."\n";
1940 }
1941close(IN);
1942close(OUT);
c2aa4f20
RL
1943rename($Makefile,"$Makefile.bak") || die "unable to rename $Makefile\n" if -e $Makefile;
1944rename("$Makefile.new",$Makefile) || die "unable to rename $Makefile.new\n";
f2d4be3b 1945
58964a49
RE
1946print "CC =$cc\n";
1947print "CFLAG =$cflags\n";
1948print "EX_LIBS =$lflags\n";
b7efa56a 1949print "CPUID_OBJ =$cpuid_obj\n";
06287285 1950print "BN_ASM =$bn_obj\n";
6019cdd3 1951print "EC_ASM =$ec_obj\n";
58964a49 1952print "DES_ENC =$des_obj\n";
0ddd3ea2 1953print "AES_ENC =$aes_obj\n";
58964a49
RE
1954print "BF_ENC =$bf_obj\n";
1955print "CAST_ENC =$cast_obj\n";
1956print "RC4_ENC =$rc4_obj\n";
1957print "RC5_ENC =$rc5_obj\n";
1958print "MD5_OBJ_ASM =$md5_obj\n";
1959print "SHA1_OBJ_ASM =$sha1_obj\n";
1960print "RMD160_OBJ_ASM=$rmd160_obj\n";
8a1c92ce
AP
1961print "CMLL_ENC =$cmll_obj\n";
1962print "MODES_OBJ =$modes_obj\n";
ed28aef8 1963print "ENGINES_OBJ =$engines_obj\n";
2613c1fa 1964print "PROCESSOR =$processor\n";
99aab161 1965print "RANLIB =$ranlib\n";
179add2b 1966print "ARFLAGS =$arflags\n";
99aab161 1967print "PERL =$perl\n";
f9b3bff6
RL
1968print "KRB5_INCLUDES =",$withargs{"krb5-include"},"\n"
1969 if $withargs{"krb5-include"} ne "";
d02b48c6 1970
1641cb60
BL
1971my $des_ptr=0;
1972my $des_risc1=0;
1973my $des_risc2=0;
1974my $des_unroll=0;
1975my $bn_ll=0;
1976my $def_int=2;
1977my $rc4_int=$def_int;
1978my $md2_int=$def_int;
1979my $idea_int=$def_int;
1980my $rc2_int=$def_int;
1981my $rc4_idx=0;
2dae04d0 1982my $rc4_chunk=0;
1641cb60
BL
1983my $bf_ptr=0;
1984my @type=("char","short","int","long");
1985my ($b64l,$b64,$b32,$b16,$b8)=(0,0,1,0,0);
62dc5aad 1986my $export_var_as_fn=0;
1641cb60
BL
1987
1988my $des_int;
d02b48c6
RE
1989
1990foreach (sort split(/\s+/,$bn_ops))
1991 {
1992 $des_ptr=1 if /DES_PTR/;
1993 $des_risc1=1 if /DES_RISC1/;
1994 $des_risc2=1 if /DES_RISC2/;
1995 $des_unroll=1 if /DES_UNROLL/;
1996 $des_int=1 if /DES_INT/;
1997 $bn_ll=1 if /BN_LLONG/;
1998 $rc4_int=0 if /RC4_CHAR/;
1999 $rc4_int=3 if /RC4_LONG/;
2000 $rc4_idx=1 if /RC4_INDEX/;
2dae04d0
AP
2001 $rc4_chunk=1 if /RC4_CHUNK/;
2002 $rc4_chunk=2 if /RC4_CHUNK_LL/;
d02b48c6
RE
2003 $md2_int=0 if /MD2_CHAR/;
2004 $md2_int=3 if /MD2_LONG/;
2005 $idea_int=1 if /IDEA_SHORT/;
2006 $idea_int=3 if /IDEA_LONG/;
2007 $rc2_int=1 if /RC2_SHORT/;
2008 $rc2_int=3 if /RC2_LONG/;
2009 $bf_ptr=1 if $_ eq "BF_PTR";
2010 $bf_ptr=2 if $_ eq "BF_PTR2";
d02b48c6 2011 ($b64l,$b64,$b32,$b16,$b8)=(0,1,0,0,0) if /SIXTY_FOUR_BIT/;
58964a49 2012 ($b64l,$b64,$b32,$b16,$b8)=(1,0,0,0,0) if /SIXTY_FOUR_BIT_LONG/;
d02b48c6
RE
2013 ($b64l,$b64,$b32,$b16,$b8)=(0,0,1,0,0) if /THIRTY_TWO_BIT/;
2014 ($b64l,$b64,$b32,$b16,$b8)=(0,0,0,1,0) if /SIXTEEN_BIT/;
2015 ($b64l,$b64,$b32,$b16,$b8)=(0,0,0,0,1) if /EIGHT_BIT/;
62dc5aad 2016 $export_var_as_fn=1 if /EXPORT_VAR_AS_FN/;
d02b48c6
RE
2017 }
2018
8e10f2b3 2019open(IN,'<crypto/opensslconf.h.in') || die "unable to read crypto/opensslconf.h.in:$!\n";
c2aa4f20
RL
2020unlink("crypto/opensslconf.h.new") || die "unable to remove old crypto/opensslconf.h.new:$!\n" if -e "crypto/opensslconf.h.new";
2021open(OUT,'>crypto/opensslconf.h.new') || die "unable to create crypto/opensslconf.h.new:$!\n";
26dc267f 2022print OUT "/* opensslconf.h */\n";
fb044c59 2023print OUT "/* WARNING: Generated automatically from opensslconf.h.in by Configure. */\n\n";
26dc267f 2024
17e80c6b
RS
2025print OUT "#ifdef __cplusplus\n";
2026print OUT "extern \"C\" {\n";
2027print OUT "#endif\n";
26dc267f 2028print OUT "/* OpenSSL was configured with the following options: */\n";
5031a89d 2029my $openssl_algorithm_defines_trans = $openssl_algorithm_defines;
7a762197 2030$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 2031$openssl_algorithm_defines_trans =~ s/^\s*#\s*define\s+OPENSSL_(.*)/# if defined(OPENSSL_$1) \&\& !defined($1)\n# define $1\n# endif/mg;
cf1b7d96 2032$openssl_algorithm_defines =~ s/^\s*#\s*define\s+(.*)/#ifndef $1\n# define $1\n#endif/mg;
fb77c6fb 2033$openssl_algorithm_defines = " /* no ciphers excluded */\n" if $openssl_algorithm_defines eq "";
cf1b7d96
RL
2034$openssl_thread_defines =~ s/^\s*#\s*define\s+(.*)/#ifndef $1\n# define $1\n#endif/mg;
2035$openssl_sys_defines =~ s/^\s*#\s*define\s+(.*)/#ifndef $1\n# define $1\n#endif/mg;
2036$openssl_other_defines =~ s/^\s*#\s*define\s+(.*)/#ifndef $1\n# define $1\n#endif/mg;
2037print OUT $openssl_sys_defines;
75e98d05 2038print OUT "#ifndef OPENSSL_DOING_MAKEDEPEND\n\n";
7a762197
BM
2039print OUT $openssl_experimental_defines;
2040print OUT "\n";
cf1b7d96 2041print OUT $openssl_algorithm_defines;
7a762197 2042print OUT "\n#endif /* OPENSSL_DOING_MAKEDEPEND */\n\n";
cf1b7d96
RL
2043print OUT $openssl_thread_defines;
2044print OUT $openssl_other_defines,"\n";
26dc267f 2045
5031a89d
RL
2046print OUT "/* The OPENSSL_NO_* macros are also defined as NO_* if the application\n";
2047print OUT " asks for it. This is a transient feature that is provided for those\n";
2048print OUT " who haven't had the time to do the appropriate changes in their\n";
2049print OUT " applications. */\n";
2050print OUT "#ifdef OPENSSL_ALGORITHM_DEFINES\n";
2051print OUT $openssl_algorithm_defines_trans;
2052print OUT "#endif\n\n";
2053
b2dba9bf 2054print OUT "#define OPENSSL_CPUID_OBJ\n\n" if ($cpuid_obj ne "mem_clr.o");
ebaec63e 2055
d02b48c6
RE
2056while (<IN>)
2057 {
cd46aa4a 2058 if (/^#define\s+OPENSSLDIR/)
f9afd9f8
GT
2059 {
2060 my $foo = $openssldir;
2061 $foo =~ s/\\/\\\\/g;
2062 print OUT "#define OPENSSLDIR \"$foo\"\n";
2063 }
90819805 2064 elsif (/^#define\s+ENGINESDIR/)
f9afd9f8 2065 {
6a9d28f9 2066 my $foo = "$prefix/$libdir/engines";
f9afd9f8
GT
2067 $foo =~ s/\\/\\\\/g;
2068 print OUT "#define ENGINESDIR \"$foo\"\n";
2069 }
62dc5aad
RL
2070 elsif (/^#((define)|(undef))\s+OPENSSL_EXPORT_VAR_AS_FUNCTION/)
2071 { printf OUT "#undef OPENSSL_EXPORT_VAR_AS_FUNCTION\n"
2072 if $export_var_as_fn;
2073 printf OUT "#%s OPENSSL_EXPORT_VAR_AS_FUNCTION\n",
2074 ($export_var_as_fn)?"define":"undef"; }
e766a681
BM
2075 elsif (/^#define\s+OPENSSL_UNISTD/)
2076 {
2077 $unistd = "<unistd.h>" if $unistd eq "";
2078 print OUT "#define OPENSSL_UNISTD $unistd\n";
2079 }
462ba4f6 2080 elsif (/^#((define)|(undef))\s+SIXTY_FOUR_BIT_LONG/)
d02b48c6
RE
2081 { printf OUT "#%s SIXTY_FOUR_BIT_LONG\n",($b64l)?"define":"undef"; }
2082 elsif (/^#((define)|(undef))\s+SIXTY_FOUR_BIT/)
2083 { printf OUT "#%s SIXTY_FOUR_BIT\n",($b64)?"define":"undef"; }
2084 elsif (/^#((define)|(undef))\s+THIRTY_TWO_BIT/)
2085 { printf OUT "#%s THIRTY_TWO_BIT\n",($b32)?"define":"undef"; }
2086 elsif (/^#((define)|(undef))\s+SIXTEEN_BIT/)
2087 { printf OUT "#%s SIXTEEN_BIT\n",($b16)?"define":"undef"; }
2088 elsif (/^#((define)|(undef))\s+EIGHT_BIT/)
2089 { printf OUT "#%s EIGHT_BIT\n",($b8)?"define":"undef"; }
2090 elsif (/^#((define)|(undef))\s+BN_LLONG\s*$/)
2091 { printf OUT "#%s BN_LLONG\n",($bn_ll)?"define":"undef"; }
8e10f2b3 2092 elsif (/^\#define\s+DES_LONG\s+.*/)
d02b48c6
RE
2093 { printf OUT "#define DES_LONG unsigned %s\n",
2094 ($des_int)?'int':'long'; }
8e10f2b3 2095 elsif (/^\#(define|undef)\s+DES_PTR/)
d02b48c6
RE
2096 { printf OUT "#%s DES_PTR\n",($des_ptr)?'define':'undef'; }
2097 elsif (/^\#(define|undef)\s+DES_RISC1/)
2098 { printf OUT "#%s DES_RISC1\n",($des_risc1)?'define':'undef'; }
2099 elsif (/^\#(define|undef)\s+DES_RISC2/)
2100 { printf OUT "#%s DES_RISC2\n",($des_risc2)?'define':'undef'; }
2101 elsif (/^\#(define|undef)\s+DES_UNROLL/)
2102 { printf OUT "#%s DES_UNROLL\n",($des_unroll)?'define':'undef'; }
8e10f2b3 2103 elsif (/^#define\s+RC4_INT\s/)
d02b48c6 2104 { printf OUT "#define RC4_INT unsigned %s\n",$type[$rc4_int]; }
2dae04d0
AP
2105 elsif (/^#undef\s+RC4_CHUNK/)
2106 {
2107 printf OUT "#undef RC4_CHUNK\n" if $rc4_chunk==0;
2108 printf OUT "#define RC4_CHUNK unsigned long\n" if $rc4_chunk==1;
2109 printf OUT "#define RC4_CHUNK unsigned long long\n" if $rc4_chunk==2;
2110 }
8e10f2b3 2111 elsif (/^#((define)|(undef))\s+RC4_INDEX/)
d02b48c6 2112 { printf OUT "#%s RC4_INDEX\n",($rc4_idx)?"define":"undef"; }
8e7f966b 2113 elsif (/^#(define|undef)\s+I386_ONLY/)
c9a112f5 2114 { printf OUT "#%s I386_ONLY\n", ($processor eq "386")?
8e7f966b 2115 "define":"undef"; }
8e10f2b3 2116 elsif (/^#define\s+MD2_INT\s/)
d02b48c6 2117 { printf OUT "#define MD2_INT unsigned %s\n",$type[$md2_int]; }
8e10f2b3 2118 elsif (/^#define\s+IDEA_INT\s/)
d02b48c6 2119 {printf OUT "#define IDEA_INT unsigned %s\n",$type[$idea_int];}
8e10f2b3 2120 elsif (/^#define\s+RC2_INT\s/)
d02b48c6 2121 {printf OUT "#define RC2_INT unsigned %s\n",$type[$rc2_int];}
8e10f2b3 2122 elsif (/^#(define|undef)\s+BF_PTR/)
d02b48c6
RE
2123 {
2124 printf OUT "#undef BF_PTR\n" if $bf_ptr == 0;
2125 printf OUT "#define BF_PTR\n" if $bf_ptr == 1;
2126 printf OUT "#define BF_PTR2\n" if $bf_ptr == 2;
8e10f2b3 2127 }
d02b48c6
RE
2128 else
2129 { print OUT $_; }
2130 }
5dfc369f 2131close(IN);
17e80c6b
RS
2132print OUT "#ifdef __cplusplus\n";
2133print OUT "}\n";
2134print OUT "#endif\n";
5dfc369f 2135close(OUT);
c2aa4f20
RL
2136rename("crypto/opensslconf.h","crypto/opensslconf.h.bak") || die "unable to rename crypto/opensslconf.h\n" if -e "crypto/opensslconf.h";
2137rename("crypto/opensslconf.h.new","crypto/opensslconf.h") || die "unable to rename crypto/opensslconf.h.new\n";
9becf666 2138
e766a681 2139
9becf666
DSH
2140# Fix the date
2141
d02b48c6
RE
2142print "SIXTY_FOUR_BIT_LONG mode\n" if $b64l;
2143print "SIXTY_FOUR_BIT mode\n" if $b64;
2144print "THIRTY_TWO_BIT mode\n" if $b32;
2145print "SIXTEEN_BIT mode\n" if $b16;
2146print "EIGHT_BIT mode\n" if $b8;
2147print "DES_PTR used\n" if $des_ptr;
2148print "DES_RISC1 used\n" if $des_risc1;
2149print "DES_RISC2 used\n" if $des_risc2;
2150print "DES_UNROLL used\n" if $des_unroll;
2151print "DES_INT used\n" if $des_int;
2152print "BN_LLONG mode\n" if $bn_ll;
2153print "RC4 uses u$type[$rc4_int]\n" if $rc4_int != $def_int;
2154print "RC4_INDEX mode\n" if $rc4_idx;
2dae04d0
AP
2155print "RC4_CHUNK is undefined\n" if $rc4_chunk==0;
2156print "RC4_CHUNK is unsigned long\n" if $rc4_chunk==1;
2157print "RC4_CHUNK is unsigned long long\n" if $rc4_chunk==2;
d02b48c6
RE
2158print "MD2 uses u$type[$md2_int]\n" if $md2_int != $def_int;
2159print "IDEA uses u$type[$idea_int]\n" if $idea_int != $def_int;
2160print "RC2 uses u$type[$rc2_int]\n" if $rc2_int != $def_int;
fce0ba5f
FLM
2161print "BF_PTR used\n" if $bf_ptr == 1;
2162print "BF_PTR2 used\n" if $bf_ptr == 2;
cba5068d 2163
4d8743f4 2164if($IsMK1MF) {
664b9985
BM
2165 open (OUT,">crypto/buildinf.h") || die "Can't open buildinf.h";
2166 printf OUT <<EOF;
57119943
BM
2167#ifndef MK1MF_BUILD
2168 /* auto-generated by Configure for crypto/cversion.c:
2169 * for Unix builds, crypto/Makefile.ssl generates functional definitions;
2170 * Windows builds (and other mk1mf builds) compile cversion.c with
2171 * -DMK1MF_BUILD and use definitions added to this file by util/mk1mf.pl. */
2172 #error "Windows builds (PLATFORM=$target) use mk1mf.pl-created Makefiles"
2173#endif
9e935d7e 2174EOF
8e10f2b3 2175 close(OUT);
a1e464f9 2176} else {
dafd8333 2177 my $make_command = "$make PERL=\'$perl\'";
451dc18f
RL
2178 my $make_targets = "";
2179 $make_targets .= " links" if $symlink;
ab185b60 2180 $make_targets .= " depend" if $depflags ne $default_depflags && $make_depend;
1cc67fa8 2181 $make_targets .= " gentests" if $symlink;
cde8ad1a 2182 (system $make_command.$make_targets) == 0 or die "make $make_targets failed"
451dc18f 2183 if $make_targets ne "";
78c990c1 2184 if ( $perl =~ m@^/@) {
7f7f1551 2185 &dofile("tools/c_rehash",$perl,'^#!/', '#!%s','^my \$dir;$', 'my $dir = "' . $openssldir . '";', '^my \$prefix;$', 'my $prefix = "' . $prefix . '";');
3a4f14f3 2186 &dofile("apps/CA.pl",$perl,'^#!/', '#!%s');
288d2fb9
BM
2187 } else {
2188 # No path for Perl known ...
7f7f1551 2189 &dofile("tools/c_rehash",'/usr/local/bin/perl','^#!/', '#!%s','^my \$dir;$', 'my $dir = "' . $openssldir . '";', '^my \$prefix;$', 'my $prefix = "' . $prefix . '";');
3a4f14f3 2190 &dofile("apps/CA.pl",'/usr/local/bin/perl','^#!/', '#!%s');
451dc18f 2191 }
78c990c1 2192 if ($depflags ne $default_depflags && !$make_depend) {
451dc18f
RL
2193 print <<EOF;
2194
ab185b60
BM
2195Since you've disabled or enabled at least one algorithm, you need to do
2196the following before building:
451dc18f
RL
2197
2198 make depend
2199EOF
2200 }
8e10f2b3
UM
2201}
2202
fc6a6a10 2203# create the ms/version32.rc file if needed
eef0c1f3 2204if ($IsMK1MF && ($target !~ /^netware/)) {
fc6a6a10
DSH
2205 my ($v1, $v2, $v3, $v4);
2206 if ($version_num =~ /(^[0-9a-f]{1})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})/i) {
2207 $v1=hex $1;
2208 $v2=hex $2;
2209 $v3=hex $3;
2210 $v4=hex $4;
2211 }
2212 open (OUT,">ms/version32.rc") || die "Can't open ms/version32.rc";
2213 print OUT <<EOF;
2214#include <winver.h>
2215
2216LANGUAGE 0x09,0x01
2217
22181 VERSIONINFO
2219 FILEVERSION $v1,$v2,$v3,$v4
2220 PRODUCTVERSION $v1,$v2,$v3,$v4
2221 FILEFLAGSMASK 0x3fL
2222#ifdef _DEBUG
2223 FILEFLAGS 0x01L
2224#else
2225 FILEFLAGS 0x00L
2226#endif
2227 FILEOS VOS__WINDOWS32
2228 FILETYPE VFT_DLL
2229 FILESUBTYPE 0x0L
2230BEGIN
2231 BLOCK "StringFileInfo"
2232 BEGIN
2233 BLOCK "040904b0"
2234 BEGIN
fce0ba5f 2235 // Required:
fc6a6a10
DSH
2236 VALUE "CompanyName", "The OpenSSL Project, http://www.openssl.org/\\0"
2237 VALUE "FileDescription", "OpenSSL Shared Library\\0"
2238 VALUE "FileVersion", "$version\\0"
2239#if defined(CRYPTO)
2240 VALUE "InternalName", "libeay32\\0"
2241 VALUE "OriginalFilename", "libeay32.dll\\0"
2242#elif defined(SSL)
2243 VALUE "InternalName", "ssleay32\\0"
2244 VALUE "OriginalFilename", "ssleay32.dll\\0"
a479d72d 2245#endif
fc6a6a10
DSH
2246 VALUE "ProductName", "The OpenSSL Toolkit\\0"
2247 VALUE "ProductVersion", "$version\\0"
2248 // Optional:
2249 //VALUE "Comments", "\\0"
aaf878cc 2250 VALUE "LegalCopyright", "Copyright © 1998-2005 The OpenSSL Project. Copyright © 1995-1998 Eric A. Young, Tim J. Hudson. All rights reserved.\\0"
fc6a6a10
DSH
2251 //VALUE "LegalTrademarks", "\\0"
2252 //VALUE "PrivateBuild", "\\0"
2253 //VALUE "SpecialBuild", "\\0"
2254 END
2255 END
2256 BLOCK "VarFileInfo"
2257 BEGIN
2258 VALUE "Translation", 0x409, 0x4b0
2259 END
2260END
2261EOF
2262 close(OUT);
2263 }
fce0ba5f 2264
63d3f44a
BM
2265print <<EOF;
2266
89ec98e0 2267Configured for $target.
63d3f44a 2268EOF
5f8d5c96
BM
2269
2270print <<\EOF if (!$no_threads && !$threads);
2271
2272The library could not be configured for supporting multi-threaded
2273applications as the compiler options required on this system are not known.
ff1b7e09 2274See file INSTALL for details if you need multi-threading.
ec577822
BM
2275EOF
2276
2964ba8c
RL
2277print <<\EOF if ($no_shared_warn);
2278
2279You gave the option 'shared'. Normally, that would give you shared libraries.
2280Unfortunately, the OpenSSL configuration doesn't include shared library support
2281for this platform yet, so it will pretend you gave the option 'no-shared'. If
2282you can inform the developpers (openssl-dev\@openssl.org) how to support shared
aaae0aa4
BM
2283libraries on this platform, they will at least look at it and try their best
2284(but please first make sure you have tried with a current version of OpenSSL).
2964ba8c
RL
2285EOF
2286
d02b48c6
RE
2287exit(0);
2288
462ba4f6 2289sub usage
d02b48c6 2290 {
462ba4f6 2291 print STDERR $usage;
10a926c1 2292 print STDERR "\npick os/compiler from:\n";
1641cb60 2293 my $j=0;
6457ad15 2294 my $i;
10a926c1 2295 my $k=0;
6457ad15 2296 foreach $i (sort keys %table)
d02b48c6 2297 {
462ba4f6 2298 next if $i =~ /^debug/;
10a926c1
UM
2299 $k += length($i) + 1;
2300 if ($k > 78)
2301 {
2302 print STDERR "\n";
2303 $k=length($i);
2304 }
2305 print STDERR $i . " ";
462ba4f6
UM
2306 }
2307 foreach $i (sort keys %table)
2308 {
2309 next if $i !~ /^debug/;
10a926c1
UM
2310 $k += length($i) + 1;
2311 if ($k > 78)
2312 {
2313 print STDERR "\n";
2314 $k=length($i);
2315 }
2316 print STDERR $i . " ";
d02b48c6 2317 }
10a926c1 2318 print STDERR "\n\nNOTE: If in doubt, on Unix-ish systems use './config'.\n";
462ba4f6 2319 exit(1);
d02b48c6
RE
2320 }
2321
99aab161
UM
2322sub which
2323 {
2324 my($name)=@_;
2325 my $path;
2326 foreach $path (split /:/, $ENV{PATH})
2327 {
28a80034 2328 if (-f "$path/$name$exe_ext" and -x _)
99aab161 2329 {
28a80034
RL
2330 return "$path/$name$exe_ext" unless ($name eq "perl" and
2331 system("$path/$name$exe_ext -e " . '\'exit($]<5.0);\''));
99aab161
UM
2332 }
2333 }
2334 }
2335
462ba4f6
UM
2336sub dofile
2337 {
2338 my $f; my $p; my %m; my @a; my $k; my $ff;
2339 ($f,$p,%m)=@_;
2340
31ff97b2 2341 open(IN,"<$f.in") || open(IN,"<$f") || die "unable to open $f:$!\n";
462ba4f6
UM
2342 @a=<IN>;
2343 close(IN);
2344 foreach $k (keys %m)
2345 {
2346 grep(/$k/ && ($_=sprintf($m{$k}."\n",$p)),@a);
2347 }
863fe2ec 2348 open(OUT,">$f.new") || die "unable to open $f.new:$!\n";
462ba4f6
UM
2349 print OUT @a;
2350 close(OUT);
863fe2ec
BM
2351 rename($f,"$f.bak") || die "unable to rename $f\n" if -e $f;
2352 rename("$f.new",$f) || die "unable to rename $f.new\n";
462ba4f6 2353 }
436a376b
BM
2354
2355sub print_table_entry
2356 {
2357 my $target = shift;
aaf878cc 2358 my $type = shift;
436a376b 2359
7d46b942
RL
2360 # Don't print the templates
2361 return if $table{$target}->{template};
2362
aaf878cc
RL
2363 if ($type eq "TABLE") {
2364 print <<EOF
436a376b
BM
2365
2366*** $target
aaf878cc
RL
2367\$cc = $table{$target}->{cc}
2368\$cflags = $table{$target}->{cflags}
b1245529
RL
2369\$debug_cflags = $table{$target}->{debug_cflags}
2370\$release_cflags = $table{$target}->{release_cflags}
aaf878cc
RL
2371\$unistd = $table{$target}->{unistd}
2372\$thread_cflag = $table{$target}->{thread_cflag}
2373\$sys_id = $table{$target}->{sys_id}
2374\$lflags = $table{$target}->{lflags}
b1245529
RL
2375\$debug_lflags = $table{$target}->{debug_lflags}
2376\$release_lflags = $table{$target}->{release_lflags}
aaf878cc
RL
2377\$bn_ops = $table{$target}->{bn_ops}
2378\$cpuid_obj = $table{$target}->{cpuid_obj}
2379\$bn_obj = $table{$target}->{bn_obj}
2380\$ec_obj = $table{$target}->{ec_obj}
2381\$des_obj = $table{$target}->{des_obj}
2382\$aes_obj = $table{$target}->{aes_obj}
2383\$bf_obj = $table{$target}->{bf_obj}
2384\$md5_obj = $table{$target}->{md5_obj}
2385\$sha1_obj = $table{$target}->{sha1_obj}
2386\$cast_obj = $table{$target}->{cast_obj}
2387\$rc4_obj = $table{$target}->{rc4_obj}
2388\$rmd160_obj = $table{$target}->{rmd160_obj}
2389\$rc5_obj = $table{$target}->{rc5_obj}
2390\$wp_obj = $table{$target}->{wp_obj}
2391\$cmll_obj = $table{$target}->{cmll_obj}
2392\$modes_obj = $table{$target}->{modes_obj}
2393\$engines_obj = $table{$target}->{engines_obj}
2394\$perlasm_scheme = $table{$target}->{perlasm_scheme}
2395\$dso_scheme = $table{$target}->{dso_scheme}
2396\$shared_target= $table{$target}->{shared_target}
2397\$shared_cflag = $table{$target}->{shared_cflag}
2398\$shared_ldflag = $table{$target}->{shared_ldflag}
2399\$shared_extension = $table{$target}->{shared_extension}
2400\$ranlib = $table{$target}->{ranlib}
2401\$arflags = $table{$target}->{arflags}
2402\$multilib = $table{$target}->{multilib}
436a376b 2403EOF
aaf878cc
RL
2404 } elsif ($type eq "HASH") {
2405 my @sequence = (
2406 "cc",
2407 "cflags",
b1245529
RL
2408 "debug_cflags",
2409 "release_cflags",
aaf878cc
RL
2410 "unistd",
2411 "thread_cflag",
2412 "sys_id",
2413 "lflags",
b1245529
RL
2414 "debug_lflags",
2415 "release_lflags",
aaf878cc
RL
2416 "bn_ops",
2417 "cpuid_obj",
2418 "bn_obj",
2419 "ec_obj",
2420 "des_obj",
2421 "aes_obj",
2422 "bf_obj",
2423 "md5_obj",
2424 "sha1_obj",
2425 "cast_obj",
2426 "rc4_obj",
2427 "rmd160_obj",
2428 "rc5_obj",
2429 "wp_obj",
2430 "cmll_obj",
2431 "modes_obj",
2432 "engines_obj",
2433 "perlasm_scheme",
2434 "dso_scheme",
2435 "shared_target",
2436 "shared_cflag",
2437 "shared_ldflag",
2438 "shared_extension",
2439 "ranlib",
2440 "arflags",
2441 "multilib",
2442 );
2443 my $largest =
2444 length((sort { length($a) <=> length($b) } @sequence)[-1]);
2445 print " '$target' => {\n";
2446 foreach (@sequence) {
2447 if ($table{$target}->{$_}) {
2448 print " '",$_,"'"," " x ($largest - length($_))," => '",$table{$target}->{$_},"',\n";
2449 }
2450 }
2451 print " },\n";
2452 }
436a376b 2453 }
d0d046ec
RL
2454
2455sub test_sanity
2456 {
2457 my $errorcnt = 0;
2458
2459 print STDERR "=" x 70, "\n";
2460 print STDERR "=== SANITY TESTING!\n";
2461 print STDERR "=== No configuration will be done, all other arguments will be ignored!\n";
2462 print STDERR "=" x 70, "\n";
2463
2464 foreach $target (sort keys %table)
2465 {
aaf878cc
RL
2466 my $pre_dso_scheme = "perlasm_scheme";
2467 my $dso_scheme = "dso_scheme";
2468 my $post_dso_scheme = "shared_target";
2469
d0d046ec 2470
aaf878cc 2471 if ($table{$target}->{$pre_dso_scheme} =~ /^(beos|dl|dlfcn|win32|vms)$/)
c9c21d3b
RL
2472 {
2473 $errorcnt++;
aaf878cc 2474 print STDERR "SANITY ERROR: '$target' has the dso_scheme values\n";
c9c21d3b
RL
2475 print STDERR " in the previous field\n";
2476 }
aaf878cc 2477 elsif ($table{$target}->{$post_dso_scheme} =~ /^(beos|dl|dlfcn|win32|vms)$/)
c9c21d3b
RL
2478 {
2479 $errorcnt++;
aaf878cc 2480 print STDERR "SANITY ERROR: '$target' has the dso_scheme values\n";
c9c21d3b
RL
2481 print STDERR " in the following field\n";
2482 }
aaf878cc 2483 elsif ($table{$target}->{$dso_scheme} !~ /^(beos|dl|dlfcn|win32|vms|)$/)
d0d046ec
RL
2484 {
2485 $errorcnt++;
aaf878cc 2486 print STDERR "SANITY ERROR: '$target' has the dso_scheme field = ",$table{$target}->{$dso_scheme},"\n";
fd621f7d 2487 print STDERR " valid values are 'beos', 'dl', 'dlfcn', 'win32' and 'vms'\n";
d0d046ec
RL
2488 }
2489 }
613599ff 2490 print STDERR "No sanity errors detected!\n" if $errorcnt == 0;
d0d046ec
RL
2491 return $errorcnt;
2492 }