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