]> git.ipfire.org Git - thirdparty/openssl.git/blame - Configure
Make X509_ATTRIBUTE opaque.
[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";
fa8e921f 137
fa8e921f 138my $x86_elf_asm="$x86_asm:elf";
fa8e921f 139
84714790 140my $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";
6019cdd3
AP
141my $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";
142my $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";
143my $sparcv8_asm=":sparcv8.o::des_enc-sparc.o fcrypt_b.o:::::::::::::void";
144my $alpha_asm="alphacpuid.o:bn_asm.o alpha-mont.o::::::sha1-alpha.o:::::::ghash-alpha.o::void";
145my $mips64_asm=":bn-mips.o mips-mont.o:::aes_cbc.o aes-mips.o:::sha1-mips.o sha256-mips.o sha512-mips.o::::::::";
9a10ea3f 146my $mips32_asm=$mips64_asm; $mips32_asm =~ s/\s*sha512\-mips\.o//;
6019cdd3 147my $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:";
7b4a4b71 148my $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
149my $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:";
150my $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";
151my $parisc20_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";
152my $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 153my $ppc32_asm=$ppc64_asm;
a77e023a 154
b7efa56a 155# As for $BSDthreads. Idea is to maintain "collective" set of flags,
fce0ba5f 156# which would cover all BSD flavors. -pthread applies to them all,
b7efa56a
AP
157# but is treated differently. OpenBSD expands is as -D_POSIX_THREAD
158# -lc_r, which is sufficient. FreeBSD 4.x expands it as -lc_r,
159# which has to be accompanied by explicit -D_THREAD_SAFE and
160# sometimes -D_REENTRANT. FreeBSD 5.x expands it as -lc_r, which
161# seems to be sufficient?
162my $BSDthreads="-pthread -D_THREAD_SAFE -D_REENTRANT";
d02b48c6 163
6019cdd3 164#config-string $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 : $dso_scheme : $shared_target : $shared_cflag : $shared_ldflag : $shared_extension : $ranlib : $arflags : $multilib
99e812cb 165
f09e7ca9 166# table of known configurations, read in from files
1641cb60 167my %table=(
f09e7ca9 168);
3e83e686 169
f09e7ca9
RS
170# Read configuration target stanzas from a file, so that people can have
171# local files with their own definitions
172sub read_config {
173 my $fname = shift;
174 open(CONFFILE, "< $fname")
175 or die "Can't open configuration file '$fname'!\n";
176 my $x = $/;
177 undef $/;
178 my $content = <CONFFILE>;
179 $/ = $x;
180 close(CONFFILE);
181 my %targets = ();
182 eval $content;
183 %table = (%table, %targets);
184}
15c7adb0 185
f09e7ca9 186my ($vol, $dir, $dummy) = File::Spec->splitpath($0);
97a0cc52
RL
187my $pattern = File::Spec->catpath($vol, $dir, "Configurations/*.conf");
188foreach (sort glob($pattern) ) {
f09e7ca9
RS
189 &read_config($_);
190}
d02b48c6 191
33c3ecf7 192my @MK1MF_Builds=qw(VC-WIN64I VC-WIN64A
eba2b51d 193 debug-VC-WIN64I debug-VC-WIN64A
71b7858b 194 VC-NT VC-CE VC-WIN32 debug-VC-WIN32
fce0ba5f 195 BC-32
eef0c1f3
DSH
196 netware-clib netware-clib-bsdsock
197 netware-libc netware-libc-bsdsock);
efadf60f 198
d0d046ec
RL
199my $idx = 0;
200my $idx_cc = $idx++;
201my $idx_cflags = $idx++;
202my $idx_unistd = $idx++;
203my $idx_thread_cflag = $idx++;
204my $idx_sys_id = $idx++;
205my $idx_lflags = $idx++;
206my $idx_bn_ops = $idx++;
14e21f86 207my $idx_cpuid_obj = $idx++;
d0d046ec 208my $idx_bn_obj = $idx++;
6019cdd3 209my $idx_ec_obj = $idx++;
d0d046ec 210my $idx_des_obj = $idx++;
d0590fe6 211my $idx_aes_obj = $idx++;
d0d046ec
RL
212my $idx_bf_obj = $idx++;
213my $idx_md5_obj = $idx++;
214my $idx_sha1_obj = $idx++;
215my $idx_cast_obj = $idx++;
216my $idx_rc4_obj = $idx++;
217my $idx_rmd160_obj = $idx++;
218my $idx_rc5_obj = $idx++;
0fbd4bf0 219my $idx_wp_obj = $idx++;
6a8517f2 220my $idx_cmll_obj = $idx++;
8a1c92ce 221my $idx_modes_obj = $idx++;
ed28aef8 222my $idx_engines_obj = $idx++;
fa8e921f 223my $idx_perlasm_scheme = $idx++;
d0d046ec
RL
224my $idx_dso_scheme = $idx++;
225my $idx_shared_target = $idx++;
226my $idx_shared_cflag = $idx++;
227my $idx_shared_ldflag = $idx++;
228my $idx_shared_extension = $idx++;
229my $idx_ranlib = $idx++;
179add2b 230my $idx_arflags = $idx++;
c23632d3 231my $idx_multilib = $idx++;
d0d046ec 232
e5f3045f 233my $prefix="";
6727565a 234my $libdir="";
462ba4f6 235my $openssldir="";
967d95f0 236my $exe_ext="";
122276a7 237my $install_prefix= "$ENV{'INSTALL_PREFIX'}";
cbfb39d1 238my $cross_compile_prefix="";
166c9cb0 239my $fipslibdir="/usr/local/ssl/fips-2.0/lib/";
1ab2f7f1 240my $nofipscanistercheck=0;
1ab2f7f1 241my $baseaddr="0xFB00000";
5f8d5c96
BM
242my $no_threads=0;
243my $threads=0;
c9a112f5
BM
244my $no_shared=0; # but "no-shared" is default
245my $zlib=1; # but "no-zlib" is default
246my $no_krb5=0; # but "no-krb5" is implied unless "--with-krb5-..." is used
d137b56a 247my $no_rfc3779=1; # but "no-rfc3779" is default
1641cb60 248my $no_asm=0;
bc2aadad 249my $no_dso=0;
987bebaf 250my $no_gmp=0;
f5d7a031 251my @skip=();
42ba5d23 252my $Makefile="Makefile";
1641cb60
BL
253my $des_locl="crypto/des/des_locl.h";
254my $des ="crypto/des/des.h";
255my $bn ="crypto/bn/bn.h";
256my $md2 ="crypto/md2/md2.h";
257my $rc4 ="crypto/rc4/rc4.h";
258my $rc4_locl="crypto/rc4/rc4_locl.h";
259my $idea ="crypto/idea/idea.h";
260my $rc2 ="crypto/rc2/rc2.h";
261my $bf ="crypto/bf/bf_locl.h";
262my $bn_asm ="bn_asm.o";
263my $des_enc="des_enc.o fcrypt_b.o";
874a3757 264my $aes_enc="aes_core.o aes_cbc.o";
1641cb60
BL
265my $bf_enc ="bf_enc.o";
266my $cast_enc="c_enc.o";
28754624 267my $rc4_enc="rc4_enc.o rc4_skey.o";
1641cb60 268my $rc5_enc="rc5_enc.o";
6a8517f2 269my $cmll_enc="camellia.o cmll_misc.o cmll_cbc.o";
2613c1fa 270my $processor="";
0396479d 271my $default_ranlib;
99aab161 272my $perl;
1ab2f7f1 273my $fips=0;
99aab161 274
c9a112f5
BM
275# All of the following is disabled by default (RC5 was enabled before 0.9.8):
276
7a762197 277my %disabled = ( # "what" => "comment" [or special keyword "experimental"]
07c4c14c 278 "deprecated" => "default",
7d8bb912 279 "ec_nistp_64_gcc_128" => "default",
987bebaf 280 "gmp" => "default",
7d8bb912
BM
281 "jpake" => "experimental",
282 "md2" => "default",
283 "rc5" => "default",
96ea4ae9 284 "rfc3779" => "default",
7e159e01 285 "sctp" => "default",
7d8bb912 286 "shared" => "default",
93ab9e42 287 "ssl-trace" => "default",
ae3b4f23 288 "store" => "experimental",
e0fc7961 289 "unit-test" => "default",
7d8bb912
BM
290 "zlib" => "default",
291 "zlib-dynamic" => "default"
292 );
7a762197 293my @experimental = ();
c9a112f5 294
7a762197
BM
295# This is what $depflags will look like with the above defaults
296# (we need this to see if we should advise the user to run "make depend"):
07c4c14c 297my $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
298
299# Explicit "no-..." options will be collected in %disabled along with the defaults.
300# To remove something from %disabled, use "enable-foo" (unless it's experimental).
301# For symmetry, "disable-foo" is a synonym for "no-foo".
302
303# For features called "experimental" here, a more explicit "experimental-foo" is needed to enable.
304# We will collect such requests in @experimental.
305# To avoid accidental use of experimental features, applications will have to use -DOPENSSL_EXPERIMENTAL_FOO.
ab185b60
BM
306
307
d0590fe6 308my $no_sse2=0;
b6e4dac2 309
462ba4f6 310&usage if ($#ARGV < 0);
d02b48c6 311
c59cb511
RL
312my $flags;
313my $depflags;
7a762197 314my $openssl_experimental_defines;
c59cb511
RL
315my $openssl_algorithm_defines;
316my $openssl_thread_defines;
cf1b7d96 317my $openssl_sys_defines="";
c59cb511
RL
318my $openssl_other_defines;
319my $libs;
c1269c81 320my $libkrb5="";
c59cb511
RL
321my $target;
322my $options;
323my $symlink;
451dc18f 324my $make_depend=0;
f9b3bff6 325my %withargs=();
c59cb511
RL
326
327my @argvcopy=@ARGV;
328my $argvstring="";
329my $argv_unprocessed=1;
330
331while($argv_unprocessed)
d02b48c6 332 {
c59cb511
RL
333 $flags="";
334 $depflags="";
7a762197 335 $openssl_experimental_defines="";
c59cb511
RL
336 $openssl_algorithm_defines="";
337 $openssl_thread_defines="";
cf1b7d96 338 $openssl_sys_defines="";
c59cb511
RL
339 $openssl_other_defines="";
340 $libs="";
341 $target="";
342 $options="";
343 $symlink=1;
344
345 $argv_unprocessed=0;
346 $argvstring=join(' ',@argvcopy);
347
348PROCESS_ARGS:
349 foreach (@argvcopy)
f5d7a031 350 {
c59cb511 351 s /^-no-/no-/; # some people just can't read the instructions
c9a112f5
BM
352
353 # rewrite some options in "enable-..." form
354 s /^-?-?shared$/enable-shared/;
7e159e01 355 s /^sctp$/enable-sctp/;
c9a112f5
BM
356 s /^threads$/enable-threads/;
357 s /^zlib$/enable-zlib/;
358 s /^zlib-dynamic$/enable-zlib-dynamic/;
359
360 if (/^no-(.+)$/ || /^disable-(.+)$/)
d02b48c6 361 {
7a762197 362 if (!($disabled{$1} eq "experimental"))
e172d60d 363 {
7a762197
BM
364 if ($1 eq "ssl")
365 {
7a762197
BM
366 $disabled{"ssl3"} = "option(ssl)";
367 }
368 elsif ($1 eq "tls")
369 {
370 $disabled{"tls1"} = "option(tls)"
371 }
3881d810
DSH
372 elsif ($1 eq "ssl3-method")
373 {
374 $disabled{"ssl3-method"} = "option(ssl)";
375 $disabled{"ssl3"} = "option(ssl)";
376 }
7a762197
BM
377 else
378 {
379 $disabled{$1} = "option";
380 }
fce0ba5f 381 }
7a762197
BM
382 }
383 elsif (/^enable-(.+)$/ || /^experimental-(.+)$/)
384 {
385 my $algo = $1;
386 if ($disabled{$algo} eq "experimental")
b6e4dac2 387 {
7a762197
BM
388 die "You are requesting an experimental feature; please say 'experimental-$algo' if you are sure\n"
389 unless (/^experimental-/);
390 push @experimental, $algo;
b6e4dac2 391 }
7a762197 392 delete $disabled{$algo};
c9a112f5 393
7a762197 394 $threads = 1 if ($algo eq "threads");
c9a112f5
BM
395 }
396 elsif (/^--test-sanity$/)
397 {
398 exit(&test_sanity());
d02b48c6 399 }
0c28f277
DSH
400 elsif (/^--strict-warnings/)
401 {
402 $strict_warnings = 1;
403 }
c59cb511 404 elsif (/^reconfigure/ || /^reconf/)
d02b48c6 405 {
c59cb511
RL
406 if (open(IN,"<$Makefile"))
407 {
408 while (<IN>)
409 {
67475a7e 410 chomp;
c59cb511
RL
411 if (/^CONFIGURE_ARGS=(.*)/)
412 {
413 $argvstring=$1;
414 @argvcopy=split(' ',$argvstring);
415 die "Incorrect data to reconfigure, please do a normal configuration\n"
416 if (grep(/^reconf/,@argvcopy));
417 print "Reconfiguring with: $argvstring\n";
418 $argv_unprocessed=1;
419 close(IN);
420 last PROCESS_ARGS;
421 }
422 }
423 close(IN);
424 }
425 die "Insufficient data to reconfigure, please do a normal configuration\n";
d02b48c6 426 }
c59cb511 427 elsif (/^386$/)
c9a112f5 428 { $processor=386; }
9fdb2cc5
DSH
429 elsif (/^fips$/)
430 {
431 $fips=1;
7d8bb912 432 }
c59cb511 433 elsif (/^rsaref$/)
3eb0ed6d 434 {
ccb9643f
RL
435 # No RSAref support any more since it's not needed.
436 # The check for the option is there so scripts aren't
437 # broken
462ba4f6 438 }
1ab2f7f1
DSH
439 elsif (/^nofipscanistercheck$/)
440 {
441 $fips = 1;
442 $nofipscanistercheck = 1;
443 }
c59cb511 444 elsif (/^[-+]/)
462ba4f6 445 {
800a4a70 446 if (/^--prefix=(.*)$/)
c59cb511
RL
447 {
448 $prefix=$1;
449 }
6727565a
DSH
450 elsif (/^--libdir=(.*)$/)
451 {
452 $libdir=$1;
453 }
c59cb511
RL
454 elsif (/^--openssldir=(.*)$/)
455 {
456 $openssldir=$1;
457 }
458 elsif (/^--install.prefix=(.*)$/)
459 {
460 $install_prefix=$1;
461 }
f9b3bff6
RL
462 elsif (/^--with-krb5-(dir|lib|include|flavor)=(.*)$/)
463 {
464 $withargs{"krb5-".$1}=$2;
465 }
1291dfde 466 elsif (/^--with-zlib-lib=(.*)$/)
ad2695b1 467 {
1291dfde
DSH
468 $withargs{"zlib-lib"}=$1;
469 }
470 elsif (/^--with-zlib-include=(.*)$/)
471 {
472 $withargs{"zlib-include"}="-I$1";
ad2695b1 473 }
cc8bd545
DSH
474 elsif (/^--with-fipslibdir=(.*)$/)
475 {
476 $fipslibdir="$1/";
477 }
478 elsif (/^--with-baseaddr=(.*)$/)
479 {
480 $baseaddr="$1";
481 }
cbfb39d1
AP
482 elsif (/^--cross-compile-prefix=(.*)$/)
483 {
484 $cross_compile_prefix=$1;
485 }
f09e7ca9
RS
486 elsif (/^--config=(.*)$/)
487 {
488 read_config $1;
489 }
800a4a70 490 elsif (/^-[lL](.*)$/ or /^-Wl,/)
c59cb511 491 {
800a4a70
AP
492 $libs.=$_." ";
493 }
494 else # common if (/^[-+]/), just pass down...
495 {
496 $_ =~ s/%([0-9a-f]{1,2})/chr(hex($1))/gei;
497 $flags.=$_." ";
c59cb511 498 }
3eb0ed6d 499 }
c59cb511 500 elsif ($_ =~ /^([^:]+):(.+)$/)
e5f3045f 501 {
c59cb511
RL
502 eval "\$table{\$1} = \"$2\""; # allow $xxx constructs in the string
503 $target=$1;
e5f3045f 504 }
d02b48c6
RE
505 else
506 {
a761b89d 507 die "target already defined - $target (offending arg: $_)\n" if ($target ne "");
c59cb511
RL
508 $target=$_;
509 }
c9a112f5
BM
510
511 unless ($_ eq $target || /^no-/ || /^disable-/)
512 {
513 # "no-..." follows later after implied disactivations
514 # have been derived. (Don't take this too seroiusly,
515 # we really only write OPTIONS to the Makefile out of
516 # nostalgia.)
517
518 if ($options eq "")
519 { $options = $_; }
520 else
521 { $options .= " ".$_; }
d02b48c6 522 }
fbabb752
BM
523 }
524 }
d02b48c6 525
b6e4dac2 526
b6e4dac2 527
c9a112f5
BM
528if ($processor eq "386")
529 {
530 $disabled{"sse2"} = "forced";
531 }
532
533if (!defined($withargs{"krb5-flavor"}) || $withargs{"krb5-flavor"} eq "")
534 {
535 $disabled{"krb5"} = "krb5-flavor not specified";
536 }
537
538if (!defined($disabled{"zlib-dynamic"}))
539 {
540 # "zlib-dynamic" was specifically enabled, so enable "zlib"
541 delete $disabled{"zlib"};
542 }
b6e4dac2 543
c9a112f5
BM
544if (defined($disabled{"rijndael"}))
545 {
546 $disabled{"aes"} = "forced";
547 }
548if (defined($disabled{"des"}))
549 {
550 $disabled{"mdc2"} = "forced";
551 }
552if (defined($disabled{"ec"}))
b6e4dac2 553 {
c9a112f5
BM
554 $disabled{"ecdsa"} = "forced";
555 $disabled{"ecdh"} = "forced";
b6e4dac2
RL
556 }
557
c9a112f5
BM
558# SSL 3.0 and TLS requires MD5 and SHA and either RSA or DSA+DH
559if (defined($disabled{"md5"}) || defined($disabled{"sha"})
560 || (defined($disabled{"rsa"})
561 && (defined($disabled{"dsa"}) || defined($disabled{"dh"}))))
b6e4dac2 562 {
c9a112f5
BM
563 $disabled{"ssl3"} = "forced";
564 $disabled{"tls1"} = "forced";
b6e4dac2
RL
565 }
566
f1fd4544
BM
567if (defined($disabled{"tls1"}))
568 {
569 $disabled{"tlsext"} = "forced";
570 }
c9a112f5 571
d4f0339c
DSH
572if (defined($disabled{"ec"}) || defined($disabled{"dsa"})
573 || defined($disabled{"dh"}))
ef236ec3
DSH
574 {
575 $disabled{"gost"} = "forced";
576 }
577
e2ca32fc 578# SRP and HEARTBEATS require TLSEXT
edc032b5
BL
579if (defined($disabled{"tlsext"}))
580 {
581 $disabled{"srp"} = "forced";
e2ca32fc 582 $disabled{"heartbeats"} = "forced";
edc032b5
BL
583 }
584
436a376b
BM
585if ($target eq "TABLE") {
586 foreach $target (sort keys %table) {
587 print_table_entry($target);
588 }
436a376b
BM
589 exit 0;
590}
591
10a926c1
UM
592if ($target eq "LIST") {
593 foreach (sort keys %table) {
594 print;
595 print "\n";
596 }
597 exit 0;
598}
599
49e04548
RL
600if ($target =~ m/^CygWin32(-.*)$/) {
601 $target = "Cygwin".$1;
602}
603
c59cb511
RL
604print "Configuring for $target\n";
605
462ba4f6
UM
606&usage if (!defined($table{$target}));
607
9fdb2cc5
DSH
608if ($fips)
609 {
610 delete $disabled{"shared"} if ($disabled{"shared"} eq "default");
611 }
c9a112f5
BM
612
613foreach (sort (keys %disabled))
614 {
615 $options .= " no-$_";
616
617 printf " no-%-12s %-10s", $_, "[$disabled{$_}]";
618
619 if (/^dso$/)
620 { $no_dso = 1; }
621 elsif (/^threads$/)
622 { $no_threads = 1; }
623 elsif (/^shared$/)
624 { $no_shared = 1; }
625 elsif (/^zlib$/)
626 { $zlib = 0; }
fbf002bb
DSH
627 elsif (/^static-engine$/)
628 { }
c9a112f5
BM
629 elsif (/^zlib-dynamic$/)
630 { }
631 elsif (/^symlinks$/)
632 { $symlink = 0; }
633 elsif (/^sse2$/)
634 { $no_sse2 = 1; }
635 else
636 {
637 my ($ALGO, $algo);
30fafdeb 638 ($ALGO = $algo = $_) =~ tr/[\-a-z]/[_A-Z]/;
c9a112f5
BM
639
640 if (/^asm$/ || /^err$/ || /^hw$/ || /^hw-/)
641 {
642 $openssl_other_defines .= "#define OPENSSL_NO_$ALGO\n";
643 print " OPENSSL_NO_$ALGO";
fce0ba5f 644
5df70a9e
AP
645 if (/^err$/) { $flags .= "-DOPENSSL_NO_ERR "; }
646 elsif (/^asm$/) { $no_asm = 1; }
c9a112f5
BM
647 }
648 else
649 {
2a4af947
AP
650 ($ALGO,$algo) = ("RMD160","rmd160") if ($algo eq "ripemd");
651
c9a112f5
BM
652 $openssl_algorithm_defines .= "#define OPENSSL_NO_$ALGO\n";
653 print " OPENSSL_NO_$ALGO";
654
655 if (/^krb5$/)
656 { $no_krb5 = 1; }
657 else
658 {
659 push @skip, $algo;
ce0ed3b7 660 # fix-up crypto/directory name(s)
f09e7ca9
RS
661 $skip[$#skip]="whrlpool" if $algo eq "whirlpool";
662 $skip[$#skip]="ripemd" if $algo eq "rmd160";
2a4af947 663
c9a112f5 664 print " (skip dir)";
ab185b60 665
7a762197 666 $depflags .= " -DOPENSSL_NO_$ALGO";
c9a112f5
BM
667 }
668 }
669 }
670
671 print "\n";
672 }
673
7a762197 674my $exp_cflags = "";
ccc5784e 675
7a762197
BM
676foreach (sort @experimental)
677 {
678 my $ALGO;
679 ($ALGO = $_) =~ tr/[a-z]/[A-Z]/;
680
681 # opensslconf.h will set OPENSSL_NO_... unless OPENSSL_EXPERIMENTAL_... is defined
682 $openssl_experimental_defines .= "#define OPENSSL_NO_$ALGO\n";
683 $exp_cflags .= " -DOPENSSL_EXPERIMENTAL_$ALGO";
684 }
c9a112f5 685
4d8743f4 686my $IsMK1MF=scalar grep /^$target$/,@MK1MF_Builds;
a1e464f9 687
9be54812 688$exe_ext=".exe" if ($target eq "Cygwin" || $target eq "DJGPP" || $target =~ /^mingw/);
eef0c1f3 689$exe_ext=".nlm" if ($target =~ /netware/);
d0590fe6 690$exe_ext=".pm" if ($target =~ /vos/);
5496cd3e 691$openssldir="/usr/local/ssl" if ($openssldir eq "" and $prefix eq "");
e5f3045f 692$prefix=$openssldir if $prefix eq "";
462ba4f6 693
28a80034
RL
694$default_ranlib= &which("ranlib") or $default_ranlib="true";
695$perl=$ENV{'PERL'} or $perl=&which("perl5") or $perl=&which("perl")
696 or $perl="perl";
dafd8333 697my $make = $ENV{'MAKE'} || "make";
28a80034 698
34775923 699$cross_compile_prefix=$ENV{'CROSS_COMPILE'} if $cross_compile_prefix eq "";
f99f41cf 700
462ba4f6 701chop $openssldir if $openssldir =~ /\/$/;
bc645199 702chop $prefix if $prefix =~ /.\/$/;
462ba4f6 703
e5f3045f 704$openssldir=$prefix . "/ssl" if $openssldir eq "";
451dc18f 705$openssldir=$prefix . "/" . $openssldir if $openssldir !~ /(^\/|^[a-zA-Z]:[\\\/])/;
d02b48c6 706
efadf60f 707
4d8743f4 708print "IsMK1MF=$IsMK1MF\n";
efadf60f 709
d0d046ec
RL
710my @fields = split(/\s*:\s*/,$table{$target} . ":" x 30 , -1);
711my $cc = $fields[$idx_cc];
7f625320
BL
712# Allow environment CC to override compiler...
713if($ENV{CC}) {
714 $cc = $ENV{CC};
715}
d0d046ec
RL
716my $cflags = $fields[$idx_cflags];
717my $unistd = $fields[$idx_unistd];
718my $thread_cflag = $fields[$idx_thread_cflag];
719my $sys_id = $fields[$idx_sys_id];
720my $lflags = $fields[$idx_lflags];
721my $bn_ops = $fields[$idx_bn_ops];
14e21f86 722my $cpuid_obj = $fields[$idx_cpuid_obj];
d0d046ec 723my $bn_obj = $fields[$idx_bn_obj];
6019cdd3 724my $ec_obj = $fields[$idx_ec_obj];
d0d046ec 725my $des_obj = $fields[$idx_des_obj];
d0590fe6 726my $aes_obj = $fields[$idx_aes_obj];
d0d046ec 727my $bf_obj = $fields[$idx_bf_obj];
d0590fe6
AP
728my $md5_obj = $fields[$idx_md5_obj];
729my $sha1_obj = $fields[$idx_sha1_obj];
d0d046ec
RL
730my $cast_obj = $fields[$idx_cast_obj];
731my $rc4_obj = $fields[$idx_rc4_obj];
d0590fe6 732my $rmd160_obj = $fields[$idx_rmd160_obj];
d0d046ec 733my $rc5_obj = $fields[$idx_rc5_obj];
0fbd4bf0 734my $wp_obj = $fields[$idx_wp_obj];
6a8517f2 735my $cmll_obj = $fields[$idx_cmll_obj];
8a1c92ce 736my $modes_obj = $fields[$idx_modes_obj];
ed28aef8 737my $engines_obj = $fields[$idx_engines_obj];
fa8e921f 738my $perlasm_scheme = $fields[$idx_perlasm_scheme];
d0d046ec
RL
739my $dso_scheme = $fields[$idx_dso_scheme];
740my $shared_target = $fields[$idx_shared_target];
741my $shared_cflag = $fields[$idx_shared_cflag];
742my $shared_ldflag = $fields[$idx_shared_ldflag];
743my $shared_extension = $fields[$idx_shared_extension];
970097ae
DSH
744my $ranlib = $ENV{'RANLIB'} || $fields[$idx_ranlib];
745my $ar = $ENV{'AR'} || "ar";
179add2b 746my $arflags = $fields[$idx_arflags];
c23632d3 747my $multilib = $fields[$idx_multilib];
d0d046ec 748
b730b03f
AP
749# if $prefix/lib$multilib is not an existing directory, then
750# assume that it's not searched by linker automatically, in
751# which case adding $multilib suffix causes more grief than
752# we're ready to tolerate, so don't...
753$multilib="" if !-d "$prefix/lib$multilib";
754
6a9d28f9
AP
755$libdir="lib$multilib" if $libdir eq "";
756
7a762197
BM
757$cflags = "$cflags$exp_cflags";
758
d6c76457
AP
759# '%' in $lflags is used to split flags to "pre-" and post-flags
760my ($prelflags,$postlflags)=split('%',$lflags);
761if (defined($postlflags)) { $lflags=$postlflags; }
762else { $lflags=$prelflags; undef $prelflags; }
763
cbecd29a
AP
764if ($target =~ /^mingw/ && `$cc --target-help 2>&1` !~ m/\-mno\-cygwin/m)
765 {
766 $cflags =~ s/\-mno\-cygwin\s*//;
767 $shared_ldflag =~ s/\-mno\-cygwin\s*//;
768 }
769
63d8834c
AP
770if ($target =~ /linux.*\-mips/ && !$no_asm && $flags !~ /\-m(ips|arch=)/) {
771 # minimally required architecture flags for assembly modules
772 $cflags="-mips2 $cflags" if ($target =~ /mips32/);
773 $cflags="-mips3 $cflags" if ($target =~ /mips64/);
774}
775
2964ba8c 776my $no_shared_warn=0;
14bcdb08 777my $no_user_cflags=0;
2964ba8c 778
14bcdb08
AP
779if ($flags ne "") { $cflags="$flags$cflags"; }
780else { $no_user_cflags=1; }
5f8d5c96 781
f9b3bff6
RL
782# Kerberos settings. The flavor must be provided from outside, either through
783# the script "config" or manually.
c9a112f5 784if (!$no_krb5)
f9b3bff6 785 {
2a1ef754 786 my ($lresolv, $lpath, $lext);
f9b3bff6
RL
787 if ($withargs{"krb5-flavor"} =~ /^[Hh]eimdal$/)
788 {
de868e0b
RL
789 die "Sorry, Heimdal is currently not supported\n";
790 }
791 ##### HACK to force use of Heimdal.
792 ##### WARNING: Since we don't really have adequate support for Heimdal,
793 ##### using this will break the build. You'll have to make
794 ##### changes to the source, and if you do, please send
795 ##### patches to openssl-dev@openssl.org
796 if ($withargs{"krb5-flavor"} =~ /^force-[Hh]eimdal$/)
797 {
798 warn "Heimdal isn't really supported. Your build WILL break\n";
ec716413 799 warn "If you fix the problems, please send a patch to openssl-dev\@openssl.org\n";
f9b3bff6
RL
800 $withargs{"krb5-dir"} = "/usr/heimdal"
801 if $withargs{"krb5-dir"} eq "";
802 $withargs{"krb5-lib"} = "-L".$withargs{"krb5-dir"}.
803 "/lib -lgssapi -lkrb5 -lcom_err"
bf2336f4 804 if $withargs{"krb5-lib"} eq "" && !$IsMK1MF;
f9b3bff6
RL
805 $cflags="-DKRB5_HEIMDAL $cflags";
806 }
2a1ef754 807 if ($withargs{"krb5-flavor"} =~ /^[Mm][Ii][Tt]/)
f9b3bff6
RL
808 {
809 $withargs{"krb5-dir"} = "/usr/kerberos"
810 if $withargs{"krb5-dir"} eq "";
811 $withargs{"krb5-lib"} = "-L".$withargs{"krb5-dir"}.
812 "/lib -lgssapi_krb5 -lkrb5 -lcom_err -lk5crypto"
bf2336f4 813 if $withargs{"krb5-lib"} eq "" && !$IsMK1MF;
f9b3bff6 814 $cflags="-DKRB5_MIT $cflags";
2a1ef754
RL
815 $withargs{"krb5-flavor"} =~ s/^[Mm][Ii][Tt][._-]*//;
816 if ($withargs{"krb5-flavor"} =~ /^1[._-]*[01]/)
817 {
818 $cflags="-DKRB5_MIT_OLD11 $cflags";
819 }
820 }
821 LRESOLV:
822 foreach $lpath ("/lib", "/usr/lib")
823 {
824 foreach $lext ("a", "so")
825 {
826 $lresolv = "$lpath/libresolv.$lext";
827 last LRESOLV if (-r "$lresolv");
828 $lresolv = "";
829 }
f9b3bff6 830 }
2a1ef754 831 $withargs{"krb5-lib"} .= " -lresolv"
95649972 832 if ("$lresolv" ne "");
f9b3bff6 833 $withargs{"krb5-include"} = "-I".$withargs{"krb5-dir"}."/include"
2a1ef754
RL
834 if $withargs{"krb5-include"} eq "" &&
835 $withargs{"krb5-dir"} ne "";
f9b3bff6
RL
836 }
837
bc2aadad
GT
838# The DSO code currently always implements all functions so that no
839# applications will have to worry about that from a compilation point
840# of view. However, the "method"s may return zero unless that platform
841# has support compiled in for them. Currently each method is enabled
842# by a define "DSO_<name>" ... we translate the "dso_scheme" config
843# string entry into using the following logic;
eca57e92 844my $dso_cflags;
bc2aadad
GT
845if (!$no_dso && $dso_scheme ne "")
846 {
9ec0126e 847 $dso_scheme =~ tr/[a-z]/[A-Z]/;
bc2aadad
GT
848 if ($dso_scheme eq "DLFCN")
849 {
eca57e92 850 $dso_cflags = "-DDSO_DLFCN -DHAVE_DLFCN_H";
bc2aadad
GT
851 }
852 elsif ($dso_scheme eq "DLFCN_NO_H")
853 {
eca57e92 854 $dso_cflags = "-DDSO_DLFCN";
bc2aadad
GT
855 }
856 else
857 {
eca57e92 858 $dso_cflags = "-DDSO_$dso_scheme";
bc2aadad 859 }
eca57e92 860 $cflags = "$dso_cflags $cflags";
bc2aadad 861 }
9ec0126e 862
5f8d5c96 863my $thread_cflags;
fb044c59 864my $thread_defines;
5f8d5c96
BM
865if ($thread_cflag ne "(unknown)" && !$no_threads)
866 {
867 # If we know how to do it, support threads by default.
868 $threads = 1;
869 }
14bcdb08 870if ($thread_cflag eq "(unknown)" && $threads)
5f8d5c96 871 {
14bcdb08
AP
872 # If the user asked for "threads", [s]he is also expected to
873 # provide any system-dependent compiler options that are
874 # necessary.
875 if ($no_user_cflags)
876 {
877 print "You asked for multi-threading support, but didn't\n";
878 print "provide any system-specific compiler options\n";
879 exit(1);
880 }
cf1b7d96
RL
881 $thread_cflags="-DOPENSSL_THREADS $cflags" ;
882 $thread_defines .= "#define OPENSSL_THREADS\n";
5f8d5c96
BM
883 }
884else
885 {
cf1b7d96
RL
886 $thread_cflags="-DOPENSSL_THREADS $thread_cflag $cflags";
887 $thread_defines .= "#define OPENSSL_THREADS\n";
a7b991bd
BM
888# my $def;
889# foreach $def (split ' ',$thread_cflag)
890# {
891# if ($def =~ s/^-D// && $def !~ /^_/)
892# {
893# $thread_defines .= "#define $def\n";
894# }
895# }
fce0ba5f 896 }
5f8d5c96 897
95649972 898$lflags="$libs$lflags" if ($libs ne "");
d02b48c6 899
dfeab068
RE
900if ($no_asm)
901 {
6019cdd3 902 $cpuid_obj=$bn_obj=$ec_obj=
ac71d81e 903 $des_obj=$aes_obj=$bf_obj=$cast_obj=$rc4_obj=$rc5_obj=$cmll_obj=
ed28aef8 904 $modes_obj=$sha1_obj=$md5_obj=$rmd160_obj=$wp_obj=$engines_obj="";
9fdb2cc5
DSH
905 $cflags=~s/\-D[BL]_ENDIAN// if ($fips);
906 $thread_cflags=~s/\-D[BL]_ENDIAN// if ($fips);
dfeab068 907 }
03bc500a
DSH
908elsif (defined($disabled{ec2m}))
909 {
910 $bn_obj =~ s/\w+-gf2m.o//;
911 }
dfeab068 912
6f7ac8e1
AP
913if (!$no_shared)
914 {
915 $cast_obj=""; # CAST assembler is not PIC
916 }
917
5f8d5c96
BM
918if ($threads)
919 {
14bcdb08 920 $cflags=$thread_cflags;
e452de9d
RL
921 $openssl_thread_defines .= $thread_defines;
922 }
923
924if ($zlib)
925 {
926 $cflags = "-DZLIB $cflags";
c9a112f5
BM
927 if (defined($disabled{"zlib-dynamic"}))
928 {
cc7399e7
DSH
929 if (defined($withargs{"zlib-lib"}))
930 {
931 $lflags = "$lflags -L" . $withargs{"zlib-lib"} . " -lz";
932 }
933 else
934 {
935 $lflags = "$lflags -lz";
936 }
c9a112f5
BM
937 }
938 else
939 {
940 $cflags = "-DZLIB_SHARED $cflags";
941 }
5f8d5c96
BM
942 }
943
c0fc27f8
MC
944#Build the library with OPENSSL_USE_DEPRECATED if deprecation is not disabled
945if(!defined($disabled{"deprecated"}))
946 {
947 $cflags = "-DOPENSSL_USE_DEPRECATED $cflags";
948 }
07c4c14c 949
f4316c36 950# You will find shlib_mark1 and shlib_mark2 explained in Makefile.org
a22fb399 951my $shared_mark = "";
6f7ac8e1
AP
952if ($shared_target eq "")
953 {
9fdb2cc5 954 $no_shared_warn = 1 if !$no_shared && !$fips;
6f7ac8e1
AP
955 $no_shared = 1;
956 }
957if (!$no_shared)
b436a982 958 {
a22fb399
RL
959 if ($shared_cflag ne "")
960 {
28e276f1 961 $cflags = "$shared_cflag -DOPENSSL_PIC $cflags";
a22fb399 962 }
d2dcf4f4 963 }
b436a982 964
fbf002bb 965if (!$IsMK1MF)
ecd45314 966 {
4c1a6e00 967 # add {no-}static-engine to options to allow mkdef.pl to work without extra arguments
fbf002bb
DSH
968 if ($no_shared)
969 {
970 $openssl_other_defines.="#define OPENSSL_NO_DYNAMIC_ENGINE\n";
4c1a6e00 971 $options.=" static-engine";
fbf002bb
DSH
972 }
973 else
974 {
975 $openssl_other_defines.="#define OPENSSL_NO_STATIC_ENGINE\n";
4c1a6e00 976 $options.=" no-static-engine";
fbf002bb 977 }
6cb68620 978 }
ecd45314 979
beef7145 980$cpuid_obj.=" uplink.o uplink-x86.o" if ($cflags =~ /\-DOPENSSL_USE_APPLINK/);
1187ee7d 981
c313e32a
AP
982#
983# Platform fix-ups
984#
985if ($target =~ /\-icc$/) # Intel C compiler
1a979201 986 {
1187ee7d
AP
987 my $iccver=0;
988 if (open(FD,"$cc -V 2>&1 |"))
989 {
990 while(<FD>) { $iccver=$1 if (/Version ([0-9]+)\./); }
991 close(FD);
992 }
1a979201
AP
993 if ($iccver>=8)
994 {
cf5ecc3e 995 $cflags=~s/\-KPIC/-fPIC/;
1a979201
AP
996 # Eliminate unnecessary dependency from libirc.a. This is
997 # essential for shared library support, as otherwise
998 # apps/openssl can end up in endless loop upon startup...
999 $cflags.=" -Dmemcpy=__builtin_memcpy -Dmemset=__builtin_memset";
1000 }
1187ee7d
AP
1001 if ($iccver>=9)
1002 {
cf5ecc3e
AP
1003 $lflags.=" -i-static";
1004 $lflags=~s/\-no_cpprt/-no-cpprt/;
1187ee7d
AP
1005 }
1006 if ($iccver>=10)
1007 {
cf5ecc3e
AP
1008 $lflags=~s/\-i\-static/-static-intel/;
1009 }
1010 if ($iccver>=11)
1011 {
1012 $cflags.=" -no-intel-extensions"; # disable Cilk
1013 $lflags=~s/\-no\-cpprt/-no-cxxlib/;
1187ee7d 1014 }
1a979201
AP
1015 }
1016
c313e32a
AP
1017# Unlike other OSes (like Solaris, Linux, Tru64, IRIX) BSD run-time
1018# linkers (tested OpenBSD, NetBSD and FreeBSD) "demand" RPATH set on
1019# .so objects. Apparently application RPATH is not global and does
1020# not apply to .so linked with other .so. Problem manifests itself
1021# when libssl.so fails to load libcrypto.so. One can argue that we
1022# should engrave this into Makefile.shared rules or into BSD-* config
1023# lines above. Meanwhile let's try to be cautious and pass -rpath to
1024# linker only when --prefix is not /usr.
1025if ($target =~ /^BSD\-/)
1026 {
1027 $shared_ldflag.=" -Wl,-rpath,\$(LIBRPATH)" if ($prefix !~ m|^/usr[/]*$|);
1028 }
1029
cf1b7d96
RL
1030if ($sys_id ne "")
1031 {
68b00c23
RS
1032 #$cflags="-DOPENSSL_SYS_$sys_id $cflags";
1033 $openssl_sys_defines="#define OPENSSL_SYS_$sys_id\n";
cf1b7d96
RL
1034 }
1035
0396479d
BM
1036if ($ranlib eq "")
1037 {
1038 $ranlib = $default_ranlib;
1039 }
1040
1750ebcb
DSH
1041#my ($bn1)=split(/\s+/,$bn_obj);
1042#$bn1 = "" unless defined $bn1;
1043#$bn1=$bn_asm unless ($bn1 =~ /\.o$/);
1044#$bn_obj="$bn1";
1045
c9a112f5 1046$cpuid_obj="" if ($processor eq "386");
f8c469de 1047
1750ebcb 1048$bn_obj = $bn_asm unless $bn_obj ne "";
d05a4745
BM
1049# bn-586 is the only one implementing bn_*_part_words
1050$cflags.=" -DOPENSSL_BN_ASM_PART_WORDS" if ($bn_obj =~ /bn-586/);
4287ade5 1051$cflags.=" -DOPENSSL_IA32_SSE2" if (!$no_sse2 && $bn_obj =~ /86/);
dfeab068 1052
d05a4745 1053$cflags.=" -DOPENSSL_BN_ASM_MONT" if ($bn_obj =~ /-mont/);
361512da 1054$cflags.=" -DOPENSSL_BN_ASM_MONT5" if ($bn_obj =~ /-mont5/);
925596f8 1055$cflags.=" -DOPENSSL_BN_ASM_GF2m" if ($bn_obj =~ /-gf2m/);
5ac7bde7 1056
1ab2f7f1
DSH
1057if ($fips)
1058 {
1059 $openssl_other_defines.="#define OPENSSL_FIPS\n";
1ab2f7f1
DSH
1060 }
1061
b2dba9bf 1062$cpuid_obj="mem_clr.o" unless ($cpuid_obj =~ /\.o$/);
58964a49
RE
1063$des_obj=$des_enc unless ($des_obj =~ /\.o$/);
1064$bf_obj=$bf_enc unless ($bf_obj =~ /\.o$/);
1065$cast_obj=$cast_enc unless ($cast_obj =~ /\.o$/);
1066$rc4_obj=$rc4_enc unless ($rc4_obj =~ /\.o$/);
1067$rc5_obj=$rc5_enc unless ($rc5_obj =~ /\.o$/);
1068if ($sha1_obj =~ /\.o$/)
1069 {
1070# $sha1_obj=$sha1_enc;
d0590fe6
AP
1071 $cflags.=" -DSHA1_ASM" if ($sha1_obj =~ /sx86/ || $sha1_obj =~ /sha1/);
1072 $cflags.=" -DSHA256_ASM" if ($sha1_obj =~ /sha256/);
1073 $cflags.=" -DSHA512_ASM" if ($sha1_obj =~ /sha512/);
69216cc5 1074 if ($sha1_obj =~ /sse2/)
d0590fe6
AP
1075 { if ($no_sse2)
1076 { $sha1_obj =~ s/\S*sse2\S+//; }
1077 elsif ($cflags !~ /OPENSSL_IA32_SSE2/)
1078 { $cflags.=" -DOPENSSL_IA32_SSE2"; }
1079 }
58964a49
RE
1080 }
1081if ($md5_obj =~ /\.o$/)
1082 {
1083# $md5_obj=$md5_enc;
1084 $cflags.=" -DMD5_ASM";
1085 }
1086if ($rmd160_obj =~ /\.o$/)
1087 {
1088# $rmd160_obj=$rmd160_enc;
1089 $cflags.=" -DRMD160_ASM";
1090 }
d0590fe6
AP
1091if ($aes_obj =~ /\.o$/)
1092 {
e8d93e34 1093 $cflags.=" -DAES_ASM" if ($aes_obj =~ m/\baes\-/);;
77aae965 1094 # aes-ctr.o is not a real file, only indication that assembler
874a3757 1095 # module implements AES_ctr32_encrypt...
77aae965 1096 $cflags.=" -DAES_CTR_ASM" if ($aes_obj =~ s/\s*aes\-ctr\.o//);
478b50cf 1097 # aes-xts.o indicates presence of AES_xts_[en|de]crypt...
77aae965 1098 $cflags.=" -DAES_XTS_ASM" if ($aes_obj =~ s/\s*aes\-xts\.o//);
1db4a63b 1099 $aes_obj =~ s/\s*(vpaes|aesni)\-x86\.o//g if ($no_sse2);
8ca28da0 1100 $cflags.=" -DVPAES_ASM" if ($aes_obj =~ m/vpaes/);
993adc05 1101 $cflags.=" -DBSAES_ASM" if ($aes_obj =~ m/bsaes/);
d0590fe6 1102 }
7de4b5b0
AP
1103else {
1104 $aes_obj=$aes_enc;
1105 }
4c5e19b6 1106$wp_obj="" if ($wp_obj =~ /mmx/ && $processor eq "386");
ce0ed3b7 1107if ($wp_obj =~ /\.o$/ && !$disabled{"whirlpool"})
ed26604a 1108 {
4c5e19b6
AP
1109 $cflags.=" -DWHIRLPOOL_ASM";
1110 }
1111else {
1112 $wp_obj="wp_block.o";
ed26604a 1113 }
6a8517f2 1114$cmll_obj=$cmll_enc unless ($cmll_obj =~ /.o$/);
82741e9c 1115if ($modes_obj =~ /ghash\-/)
8a1c92ce
AP
1116 {
1117 $cflags.=" -DGHASH_ASM";
1118 }
84714790
AP
1119if ($ec_obj =~ /ecp_nistz256/)
1120 {
1121 $cflags.=" -DECP_NISTZ256_ASM";
1122 }
d02b48c6 1123
1ed0c662
RL
1124# "Stringify" the C flags string. This permits it to be made part of a string
1125# and works as well on command lines.
1126$cflags =~ s/([\\\"])/\\\1/g;
1127
0973910f 1128my $version = "unknown";
fc6a6a10 1129my $version_num = "unknown";
0973910f
UM
1130my $major = "unknown";
1131my $minor = "unknown";
b436a982
RL
1132my $shlib_version_number = "unknown";
1133my $shlib_version_history = "unknown";
1134my $shlib_major = "unknown";
1135my $shlib_minor = "unknown";
0973910f
UM
1136
1137open(IN,'<crypto/opensslv.h') || die "unable to read opensslv.h:$!\n";
1138while (<IN>)
1139 {
1140 $version=$1 if /OPENSSL.VERSION.TEXT.*OpenSSL (\S+) /;
fc6a6a10 1141 $version_num=$1 if /OPENSSL.VERSION.NUMBER.*0x(\S+)/;
b436a982
RL
1142 $shlib_version_number=$1 if /SHLIB_VERSION_NUMBER *"([^"]+)"/;
1143 $shlib_version_history=$1 if /SHLIB_VERSION_HISTORY *"([^"]*)"/;
0973910f
UM
1144 }
1145close(IN);
b436a982 1146if ($shlib_version_history ne "") { $shlib_version_history .= ":"; }
0973910f 1147
1fac96e4 1148if ($version =~ /(^[0-9]*)\.([0-9\.]*)/)
0973910f
UM
1149 {
1150 $major=$1;
1151 $minor=$2;
1152 }
1153
b436a982
RL
1154if ($shlib_version_number =~ /(^[0-9]*)\.([0-9\.]*)/)
1155 {
1156 $shlib_major=$1;
1157 $shlib_minor=$2;
1158 }
1159
0c28f277
DSH
1160if ($strict_warnings)
1161 {
1162 my $wopt;
cb2bc054 1163 die "ERROR --strict-warnings requires gcc or clang" unless ($cc =~ /gcc$/ or $cc =~ /clang$/);
0c28f277
DSH
1164 foreach $wopt (split /\s+/, $gcc_devteam_warn)
1165 {
1166 $cflags .= " $wopt" unless ($cflags =~ /$wopt/)
1167 }
1168 }
1169
78c990c1 1170open(IN,"<Makefile.org") || die "unable to read Makefile.org:$!\n";
c2aa4f20
RL
1171unlink("$Makefile.new") || die "unable to remove old $Makefile.new:$!\n" if -e "$Makefile.new";
1172open(OUT,">$Makefile.new") || die "unable to create $Makefile.new:$!\n";
78c990c1 1173print OUT "### Generated automatically from Makefile.org by Configure.\n\n";
f5d7a031 1174my $sdirs=0;
edd4d402 1175
d02b48c6
RE
1176while (<IN>)
1177 {
67475a7e 1178 chomp;
f5d7a031 1179 $sdirs = 1 if /^SDIRS=/;
f5d7a031
UM
1180 if ($sdirs) {
1181 my $dir;
1182 foreach $dir (@skip) {
ed551cdd
DSH
1183 s/(\s)$dir /$1/;
1184 s/\s$dir$//;
f5d7a031
UM
1185 }
1186 }
f6f0420d 1187 $sdirs = 0 unless /\\$/;
7e23e857 1188 s/fips // if (/^DIRS=/ && !$fips);
a63bf2c5 1189 s/engines // if (/^DIRS=/ && $disabled{"engine"});
ef236ec3 1190 s/ccgost// if (/^ENGDIRS=/ && $disabled{"gost"});
0973910f
UM
1191 s/^VERSION=.*/VERSION=$version/;
1192 s/^MAJOR=.*/MAJOR=$major/;
1193 s/^MINOR=.*/MINOR=$minor/;
b436a982
RL
1194 s/^SHLIB_VERSION_NUMBER=.*/SHLIB_VERSION_NUMBER=$shlib_version_number/;
1195 s/^SHLIB_VERSION_HISTORY=.*/SHLIB_VERSION_HISTORY=$shlib_version_history/;
1196 s/^SHLIB_MAJOR=.*/SHLIB_MAJOR=$shlib_major/;
1197 s/^SHLIB_MINOR=.*/SHLIB_MINOR=$shlib_minor/;
a22fb399 1198 s/^SHLIB_EXT=.*/SHLIB_EXT=$shared_extension/;
e5f3045f 1199 s/^INSTALLTOP=.*$/INSTALLTOP=$prefix/;
c23632d3 1200 s/^MULTILIB=.*$/MULTILIB=$multilib/;
462ba4f6 1201 s/^OPENSSLDIR=.*$/OPENSSLDIR=$openssldir/;
6727565a 1202 s/^LIBDIR=.*$/LIBDIR=$libdir/;
e5f3045f 1203 s/^INSTALL_PREFIX=.*$/INSTALL_PREFIX=$install_prefix/;
dfeab068 1204 s/^PLATFORM=.*$/PLATFORM=$target/;
31ff97b2 1205 s/^OPTIONS=.*$/OPTIONS=$options/;
c59cb511 1206 s/^CONFIGURE_ARGS=.*$/CONFIGURE_ARGS=$argvstring/;
cbfb39d1
AP
1207 if ($cross_compile_prefix)
1208 {
8aab301b
DSH
1209 s/^CC=.*$/CROSS_COMPILE= $cross_compile_prefix\nCC= \$\(CROSS_COMPILE\)$cc/;
1210 s/^AR=\s*/AR= \$\(CROSS_COMPILE\)/;
1211 s/^NM=\s*/NM= \$\(CROSS_COMPILE\)/;
1212 s/^RANLIB=\s*/RANLIB= \$\(CROSS_COMPILE\)/;
1213 s/^MAKEDEPPROG=.*$/MAKEDEPPROG= \$\(CROSS_COMPILE\)$cc/ if $cc eq "gcc";
cbfb39d1
AP
1214 }
1215 else {
1216 s/^CC=.*$/CC= $cc/;
8844a69c 1217 s/^AR=\s*ar/AR= $ar/;
cbfb39d1 1218 s/^RANLIB=.*/RANLIB= $ranlib/;
a6bbbf2f 1219 s/^MAKEDEPPROG=.*$/MAKEDEPPROG= $cc/ if $cc eq "gcc" || ($cc eq 'cc' && $target =~ /darwin/);
cbfb39d1 1220 }
d02b48c6 1221 s/^CFLAG=.*$/CFLAG= $cflags/;
7a762197 1222 s/^DEPFLAG=.*$/DEPFLAG=$depflags/;
d6c76457 1223 s/^PEX_LIBS=.*$/PEX_LIBS= $prelflags/;
d02b48c6 1224 s/^EX_LIBS=.*$/EX_LIBS= $lflags/;
967d95f0 1225 s/^EXE_EXT=.*$/EXE_EXT= $exe_ext/;
14e21f86 1226 s/^CPUID_OBJ=.*$/CPUID_OBJ= $cpuid_obj/;
06287285 1227 s/^BN_ASM=.*$/BN_ASM= $bn_obj/;
6019cdd3 1228 s/^EC_ASM=.*$/EC_ASM= $ec_obj/;
d02b48c6 1229 s/^DES_ENC=.*$/DES_ENC= $des_obj/;
0ddd3ea2 1230 s/^AES_ENC=.*$/AES_ENC= $aes_obj/;
d02b48c6 1231 s/^BF_ENC=.*$/BF_ENC= $bf_obj/;
58964a49
RE
1232 s/^CAST_ENC=.*$/CAST_ENC= $cast_obj/;
1233 s/^RC4_ENC=.*$/RC4_ENC= $rc4_obj/;
1234 s/^RC5_ENC=.*$/RC5_ENC= $rc5_obj/;
1235 s/^MD5_ASM_OBJ=.*$/MD5_ASM_OBJ= $md5_obj/;
1236 s/^SHA1_ASM_OBJ=.*$/SHA1_ASM_OBJ= $sha1_obj/;
1237 s/^RMD160_ASM_OBJ=.*$/RMD160_ASM_OBJ= $rmd160_obj/;
ed26604a 1238 s/^WP_ASM_OBJ=.*$/WP_ASM_OBJ= $wp_obj/;
6a8517f2 1239 s/^CMLL_ENC=.*$/CMLL_ENC= $cmll_obj/;
8a1c92ce 1240 s/^MODES_ASM_OBJ.=*$/MODES_ASM_OBJ= $modes_obj/;
ed28aef8 1241 s/^ENGINES_ASM_OBJ.=*$/ENGINES_ASM_OBJ= $engines_obj/;
fa8e921f 1242 s/^PERLASM_SCHEME=.*$/PERLASM_SCHEME= $perlasm_scheme/;
2613c1fa 1243 s/^PROCESSOR=.*/PROCESSOR= $processor/;
179add2b 1244 s/^ARFLAGS=.*/ARFLAGS= $arflags/;
99aab161 1245 s/^PERL=.*/PERL= $perl/;
f9b3bff6 1246 s/^KRB5_INCLUDES=.*/KRB5_INCLUDES=$withargs{"krb5-include"}/;
c1269c81 1247 s/^LIBKRB5=.*/LIBKRB5=$withargs{"krb5-lib"}/;
ad2695b1
DSH
1248 s/^LIBZLIB=.*/LIBZLIB=$withargs{"zlib-lib"}/;
1249 s/^ZLIB_INCLUDE=.*/ZLIB_INCLUDE=$withargs{"zlib-include"}/;
1ab2f7f1 1250 s/^FIPSLIBDIR=.*/FIPSLIBDIR=$fipslibdir/;
d47d0d2b
DSH
1251 s/^FIPSCANLIB=.*/FIPSCANLIB=libcrypto/ if $fips;
1252 s/^SHARED_FIPS=.*/SHARED_FIPS=/;
1253 s/^SHLIBDIRS=.*/SHLIBDIRS= crypto ssl/;
1ab2f7f1 1254 s/^BASEADDR=.*/BASEADDR=$baseaddr/;
b436a982 1255 s/^SHLIB_TARGET=.*/SHLIB_TARGET=$shared_target/;
a22fb399
RL
1256 s/^SHLIB_MARK=.*/SHLIB_MARK=$shared_mark/;
1257 s/^SHARED_LIBS=.*/SHARED_LIBS=\$(SHARED_CRYPTO) \$(SHARED_SSL)/ if (!$no_shared);
0fd44e2d
RL
1258 if ($shared_extension ne "" && $shared_extension =~ /^\.s([ol])\.[^\.]*$/)
1259 {
1260 my $sotmp = $1;
07c08ed4
RL
1261 s/^SHARED_LIBS_LINK_EXTS=.*/SHARED_LIBS_LINK_EXTS=.s$sotmp/;
1262 }
1263 elsif ($shared_extension ne "" && $shared_extension =~ /^\.[^\.]*\.dylib$/)
1264 {
1265 s/^SHARED_LIBS_LINK_EXTS=.*/SHARED_LIBS_LINK_EXTS=.dylib/;
0fd44e2d
RL
1266 }
1267 elsif ($shared_extension ne "" && $shared_extension =~ /^\.s([ol])\.[^\.]*\.[^\.]*$/)
1268 {
1269 my $sotmp = $1;
1270 s/^SHARED_LIBS_LINK_EXTS=.*/SHARED_LIBS_LINK_EXTS=.s$sotmp.\$(SHLIB_MAJOR) .s$sotmp/;
1271 }
07c08ed4
RL
1272 elsif ($shared_extension ne "" && $shared_extension =~ /^\.[^\.]*\.[^\.]*\.dylib$/)
1273 {
1274 s/^SHARED_LIBS_LINK_EXTS=.*/SHARED_LIBS_LINK_EXTS=.\$(SHLIB_MAJOR).dylib .dylib/;
1275 }
a5595fde 1276 s/^SHARED_LDFLAGS=.*/SHARED_LDFLAGS=$shared_ldflag/;
d02b48c6
RE
1277 print OUT $_."\n";
1278 }
1279close(IN);
1280close(OUT);
c2aa4f20
RL
1281rename($Makefile,"$Makefile.bak") || die "unable to rename $Makefile\n" if -e $Makefile;
1282rename("$Makefile.new",$Makefile) || die "unable to rename $Makefile.new\n";
f2d4be3b 1283
58964a49
RE
1284print "CC =$cc\n";
1285print "CFLAG =$cflags\n";
1286print "EX_LIBS =$lflags\n";
b7efa56a 1287print "CPUID_OBJ =$cpuid_obj\n";
06287285 1288print "BN_ASM =$bn_obj\n";
6019cdd3 1289print "EC_ASM =$ec_obj\n";
58964a49 1290print "DES_ENC =$des_obj\n";
0ddd3ea2 1291print "AES_ENC =$aes_obj\n";
58964a49
RE
1292print "BF_ENC =$bf_obj\n";
1293print "CAST_ENC =$cast_obj\n";
1294print "RC4_ENC =$rc4_obj\n";
1295print "RC5_ENC =$rc5_obj\n";
1296print "MD5_OBJ_ASM =$md5_obj\n";
1297print "SHA1_OBJ_ASM =$sha1_obj\n";
1298print "RMD160_OBJ_ASM=$rmd160_obj\n";
8a1c92ce
AP
1299print "CMLL_ENC =$cmll_obj\n";
1300print "MODES_OBJ =$modes_obj\n";
ed28aef8 1301print "ENGINES_OBJ =$engines_obj\n";
2613c1fa 1302print "PROCESSOR =$processor\n";
99aab161 1303print "RANLIB =$ranlib\n";
179add2b 1304print "ARFLAGS =$arflags\n";
99aab161 1305print "PERL =$perl\n";
f9b3bff6
RL
1306print "KRB5_INCLUDES =",$withargs{"krb5-include"},"\n"
1307 if $withargs{"krb5-include"} ne "";
d02b48c6 1308
1641cb60
BL
1309my $des_ptr=0;
1310my $des_risc1=0;
1311my $des_risc2=0;
1312my $des_unroll=0;
1313my $bn_ll=0;
1314my $def_int=2;
1315my $rc4_int=$def_int;
1316my $md2_int=$def_int;
1317my $idea_int=$def_int;
1318my $rc2_int=$def_int;
1319my $rc4_idx=0;
2dae04d0 1320my $rc4_chunk=0;
1641cb60
BL
1321my $bf_ptr=0;
1322my @type=("char","short","int","long");
1323my ($b64l,$b64,$b32,$b16,$b8)=(0,0,1,0,0);
62dc5aad 1324my $export_var_as_fn=0;
1641cb60
BL
1325
1326my $des_int;
d02b48c6
RE
1327
1328foreach (sort split(/\s+/,$bn_ops))
1329 {
1330 $des_ptr=1 if /DES_PTR/;
1331 $des_risc1=1 if /DES_RISC1/;
1332 $des_risc2=1 if /DES_RISC2/;
1333 $des_unroll=1 if /DES_UNROLL/;
1334 $des_int=1 if /DES_INT/;
1335 $bn_ll=1 if /BN_LLONG/;
1336 $rc4_int=0 if /RC4_CHAR/;
1337 $rc4_int=3 if /RC4_LONG/;
1338 $rc4_idx=1 if /RC4_INDEX/;
2dae04d0
AP
1339 $rc4_chunk=1 if /RC4_CHUNK/;
1340 $rc4_chunk=2 if /RC4_CHUNK_LL/;
d02b48c6
RE
1341 $md2_int=0 if /MD2_CHAR/;
1342 $md2_int=3 if /MD2_LONG/;
1343 $idea_int=1 if /IDEA_SHORT/;
1344 $idea_int=3 if /IDEA_LONG/;
1345 $rc2_int=1 if /RC2_SHORT/;
1346 $rc2_int=3 if /RC2_LONG/;
1347 $bf_ptr=1 if $_ eq "BF_PTR";
1348 $bf_ptr=2 if $_ eq "BF_PTR2";
d02b48c6 1349 ($b64l,$b64,$b32,$b16,$b8)=(0,1,0,0,0) if /SIXTY_FOUR_BIT/;
58964a49 1350 ($b64l,$b64,$b32,$b16,$b8)=(1,0,0,0,0) if /SIXTY_FOUR_BIT_LONG/;
d02b48c6
RE
1351 ($b64l,$b64,$b32,$b16,$b8)=(0,0,1,0,0) if /THIRTY_TWO_BIT/;
1352 ($b64l,$b64,$b32,$b16,$b8)=(0,0,0,1,0) if /SIXTEEN_BIT/;
1353 ($b64l,$b64,$b32,$b16,$b8)=(0,0,0,0,1) if /EIGHT_BIT/;
62dc5aad 1354 $export_var_as_fn=1 if /EXPORT_VAR_AS_FN/;
d02b48c6
RE
1355 }
1356
8e10f2b3 1357open(IN,'<crypto/opensslconf.h.in') || die "unable to read crypto/opensslconf.h.in:$!\n";
c2aa4f20
RL
1358unlink("crypto/opensslconf.h.new") || die "unable to remove old crypto/opensslconf.h.new:$!\n" if -e "crypto/opensslconf.h.new";
1359open(OUT,'>crypto/opensslconf.h.new') || die "unable to create crypto/opensslconf.h.new:$!\n";
26dc267f 1360print OUT "/* opensslconf.h */\n";
fb044c59 1361print OUT "/* WARNING: Generated automatically from opensslconf.h.in by Configure. */\n\n";
26dc267f 1362
17e80c6b
RS
1363print OUT "#ifdef __cplusplus\n";
1364print OUT "extern \"C\" {\n";
1365print OUT "#endif\n";
26dc267f 1366print OUT "/* OpenSSL was configured with the following options: */\n";
5031a89d 1367my $openssl_algorithm_defines_trans = $openssl_algorithm_defines;
7a762197 1368$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 1369$openssl_algorithm_defines_trans =~ s/^\s*#\s*define\s+OPENSSL_(.*)/# if defined(OPENSSL_$1) \&\& !defined($1)\n# define $1\n# endif/mg;
cf1b7d96 1370$openssl_algorithm_defines =~ s/^\s*#\s*define\s+(.*)/#ifndef $1\n# define $1\n#endif/mg;
fb77c6fb 1371$openssl_algorithm_defines = " /* no ciphers excluded */\n" if $openssl_algorithm_defines eq "";
cf1b7d96
RL
1372$openssl_thread_defines =~ s/^\s*#\s*define\s+(.*)/#ifndef $1\n# define $1\n#endif/mg;
1373$openssl_sys_defines =~ s/^\s*#\s*define\s+(.*)/#ifndef $1\n# define $1\n#endif/mg;
1374$openssl_other_defines =~ s/^\s*#\s*define\s+(.*)/#ifndef $1\n# define $1\n#endif/mg;
1375print OUT $openssl_sys_defines;
75e98d05 1376print OUT "#ifndef OPENSSL_DOING_MAKEDEPEND\n\n";
7a762197
BM
1377print OUT $openssl_experimental_defines;
1378print OUT "\n";
cf1b7d96 1379print OUT $openssl_algorithm_defines;
7a762197 1380print OUT "\n#endif /* OPENSSL_DOING_MAKEDEPEND */\n\n";
cf1b7d96
RL
1381print OUT $openssl_thread_defines;
1382print OUT $openssl_other_defines,"\n";
26dc267f 1383
5031a89d
RL
1384print OUT "/* The OPENSSL_NO_* macros are also defined as NO_* if the application\n";
1385print OUT " asks for it. This is a transient feature that is provided for those\n";
1386print OUT " who haven't had the time to do the appropriate changes in their\n";
1387print OUT " applications. */\n";
1388print OUT "#ifdef OPENSSL_ALGORITHM_DEFINES\n";
1389print OUT $openssl_algorithm_defines_trans;
1390print OUT "#endif\n\n";
1391
b2dba9bf 1392print OUT "#define OPENSSL_CPUID_OBJ\n\n" if ($cpuid_obj ne "mem_clr.o");
ebaec63e 1393
d02b48c6
RE
1394while (<IN>)
1395 {
cd46aa4a 1396 if (/^#define\s+OPENSSLDIR/)
f9afd9f8
GT
1397 {
1398 my $foo = $openssldir;
1399 $foo =~ s/\\/\\\\/g;
1400 print OUT "#define OPENSSLDIR \"$foo\"\n";
1401 }
90819805 1402 elsif (/^#define\s+ENGINESDIR/)
f9afd9f8 1403 {
6a9d28f9 1404 my $foo = "$prefix/$libdir/engines";
f9afd9f8
GT
1405 $foo =~ s/\\/\\\\/g;
1406 print OUT "#define ENGINESDIR \"$foo\"\n";
1407 }
62dc5aad
RL
1408 elsif (/^#((define)|(undef))\s+OPENSSL_EXPORT_VAR_AS_FUNCTION/)
1409 { printf OUT "#undef OPENSSL_EXPORT_VAR_AS_FUNCTION\n"
1410 if $export_var_as_fn;
1411 printf OUT "#%s OPENSSL_EXPORT_VAR_AS_FUNCTION\n",
1412 ($export_var_as_fn)?"define":"undef"; }
e766a681
BM
1413 elsif (/^#define\s+OPENSSL_UNISTD/)
1414 {
1415 $unistd = "<unistd.h>" if $unistd eq "";
1416 print OUT "#define OPENSSL_UNISTD $unistd\n";
1417 }
462ba4f6 1418 elsif (/^#((define)|(undef))\s+SIXTY_FOUR_BIT_LONG/)
d02b48c6
RE
1419 { printf OUT "#%s SIXTY_FOUR_BIT_LONG\n",($b64l)?"define":"undef"; }
1420 elsif (/^#((define)|(undef))\s+SIXTY_FOUR_BIT/)
1421 { printf OUT "#%s SIXTY_FOUR_BIT\n",($b64)?"define":"undef"; }
1422 elsif (/^#((define)|(undef))\s+THIRTY_TWO_BIT/)
1423 { printf OUT "#%s THIRTY_TWO_BIT\n",($b32)?"define":"undef"; }
1424 elsif (/^#((define)|(undef))\s+SIXTEEN_BIT/)
1425 { printf OUT "#%s SIXTEEN_BIT\n",($b16)?"define":"undef"; }
1426 elsif (/^#((define)|(undef))\s+EIGHT_BIT/)
1427 { printf OUT "#%s EIGHT_BIT\n",($b8)?"define":"undef"; }
1428 elsif (/^#((define)|(undef))\s+BN_LLONG\s*$/)
1429 { printf OUT "#%s BN_LLONG\n",($bn_ll)?"define":"undef"; }
8e10f2b3 1430 elsif (/^\#define\s+DES_LONG\s+.*/)
d02b48c6
RE
1431 { printf OUT "#define DES_LONG unsigned %s\n",
1432 ($des_int)?'int':'long'; }
8e10f2b3 1433 elsif (/^\#(define|undef)\s+DES_PTR/)
d02b48c6
RE
1434 { printf OUT "#%s DES_PTR\n",($des_ptr)?'define':'undef'; }
1435 elsif (/^\#(define|undef)\s+DES_RISC1/)
1436 { printf OUT "#%s DES_RISC1\n",($des_risc1)?'define':'undef'; }
1437 elsif (/^\#(define|undef)\s+DES_RISC2/)
1438 { printf OUT "#%s DES_RISC2\n",($des_risc2)?'define':'undef'; }
1439 elsif (/^\#(define|undef)\s+DES_UNROLL/)
1440 { printf OUT "#%s DES_UNROLL\n",($des_unroll)?'define':'undef'; }
8e10f2b3 1441 elsif (/^#define\s+RC4_INT\s/)
d02b48c6 1442 { printf OUT "#define RC4_INT unsigned %s\n",$type[$rc4_int]; }
2dae04d0
AP
1443 elsif (/^#undef\s+RC4_CHUNK/)
1444 {
1445 printf OUT "#undef RC4_CHUNK\n" if $rc4_chunk==0;
1446 printf OUT "#define RC4_CHUNK unsigned long\n" if $rc4_chunk==1;
1447 printf OUT "#define RC4_CHUNK unsigned long long\n" if $rc4_chunk==2;
1448 }
8e10f2b3 1449 elsif (/^#((define)|(undef))\s+RC4_INDEX/)
d02b48c6 1450 { printf OUT "#%s RC4_INDEX\n",($rc4_idx)?"define":"undef"; }
8e7f966b 1451 elsif (/^#(define|undef)\s+I386_ONLY/)
c9a112f5 1452 { printf OUT "#%s I386_ONLY\n", ($processor eq "386")?
8e7f966b 1453 "define":"undef"; }
8e10f2b3 1454 elsif (/^#define\s+MD2_INT\s/)
d02b48c6 1455 { printf OUT "#define MD2_INT unsigned %s\n",$type[$md2_int]; }
8e10f2b3 1456 elsif (/^#define\s+IDEA_INT\s/)
d02b48c6 1457 {printf OUT "#define IDEA_INT unsigned %s\n",$type[$idea_int];}
8e10f2b3 1458 elsif (/^#define\s+RC2_INT\s/)
d02b48c6 1459 {printf OUT "#define RC2_INT unsigned %s\n",$type[$rc2_int];}
8e10f2b3 1460 elsif (/^#(define|undef)\s+BF_PTR/)
d02b48c6
RE
1461 {
1462 printf OUT "#undef BF_PTR\n" if $bf_ptr == 0;
1463 printf OUT "#define BF_PTR\n" if $bf_ptr == 1;
1464 printf OUT "#define BF_PTR2\n" if $bf_ptr == 2;
8e10f2b3 1465 }
d02b48c6
RE
1466 else
1467 { print OUT $_; }
1468 }
5dfc369f 1469close(IN);
17e80c6b
RS
1470print OUT "#ifdef __cplusplus\n";
1471print OUT "}\n";
1472print OUT "#endif\n";
5dfc369f 1473close(OUT);
c2aa4f20
RL
1474rename("crypto/opensslconf.h","crypto/opensslconf.h.bak") || die "unable to rename crypto/opensslconf.h\n" if -e "crypto/opensslconf.h";
1475rename("crypto/opensslconf.h.new","crypto/opensslconf.h") || die "unable to rename crypto/opensslconf.h.new\n";
9becf666 1476
e766a681 1477
9becf666
DSH
1478# Fix the date
1479
d02b48c6
RE
1480print "SIXTY_FOUR_BIT_LONG mode\n" if $b64l;
1481print "SIXTY_FOUR_BIT mode\n" if $b64;
1482print "THIRTY_TWO_BIT mode\n" if $b32;
1483print "SIXTEEN_BIT mode\n" if $b16;
1484print "EIGHT_BIT mode\n" if $b8;
1485print "DES_PTR used\n" if $des_ptr;
1486print "DES_RISC1 used\n" if $des_risc1;
1487print "DES_RISC2 used\n" if $des_risc2;
1488print "DES_UNROLL used\n" if $des_unroll;
1489print "DES_INT used\n" if $des_int;
1490print "BN_LLONG mode\n" if $bn_ll;
1491print "RC4 uses u$type[$rc4_int]\n" if $rc4_int != $def_int;
1492print "RC4_INDEX mode\n" if $rc4_idx;
2dae04d0
AP
1493print "RC4_CHUNK is undefined\n" if $rc4_chunk==0;
1494print "RC4_CHUNK is unsigned long\n" if $rc4_chunk==1;
1495print "RC4_CHUNK is unsigned long long\n" if $rc4_chunk==2;
d02b48c6
RE
1496print "MD2 uses u$type[$md2_int]\n" if $md2_int != $def_int;
1497print "IDEA uses u$type[$idea_int]\n" if $idea_int != $def_int;
1498print "RC2 uses u$type[$rc2_int]\n" if $rc2_int != $def_int;
fce0ba5f
FLM
1499print "BF_PTR used\n" if $bf_ptr == 1;
1500print "BF_PTR2 used\n" if $bf_ptr == 2;
cba5068d 1501
4d8743f4 1502if($IsMK1MF) {
664b9985
BM
1503 open (OUT,">crypto/buildinf.h") || die "Can't open buildinf.h";
1504 printf OUT <<EOF;
57119943
BM
1505#ifndef MK1MF_BUILD
1506 /* auto-generated by Configure for crypto/cversion.c:
1507 * for Unix builds, crypto/Makefile.ssl generates functional definitions;
1508 * Windows builds (and other mk1mf builds) compile cversion.c with
1509 * -DMK1MF_BUILD and use definitions added to this file by util/mk1mf.pl. */
1510 #error "Windows builds (PLATFORM=$target) use mk1mf.pl-created Makefiles"
1511#endif
9e935d7e 1512EOF
8e10f2b3 1513 close(OUT);
a1e464f9 1514} else {
dafd8333 1515 my $make_command = "$make PERL=\'$perl\'";
451dc18f
RL
1516 my $make_targets = "";
1517 $make_targets .= " links" if $symlink;
ab185b60 1518 $make_targets .= " depend" if $depflags ne $default_depflags && $make_depend;
1cc67fa8 1519 $make_targets .= " gentests" if $symlink;
cde8ad1a 1520 (system $make_command.$make_targets) == 0 or die "make $make_targets failed"
451dc18f 1521 if $make_targets ne "";
78c990c1 1522 if ( $perl =~ m@^/@) {
7f7f1551 1523 &dofile("tools/c_rehash",$perl,'^#!/', '#!%s','^my \$dir;$', 'my $dir = "' . $openssldir . '";', '^my \$prefix;$', 'my $prefix = "' . $prefix . '";');
3a4f14f3 1524 &dofile("apps/CA.pl",$perl,'^#!/', '#!%s');
288d2fb9
BM
1525 } else {
1526 # No path for Perl known ...
7f7f1551 1527 &dofile("tools/c_rehash",'/usr/local/bin/perl','^#!/', '#!%s','^my \$dir;$', 'my $dir = "' . $openssldir . '";', '^my \$prefix;$', 'my $prefix = "' . $prefix . '";');
3a4f14f3 1528 &dofile("apps/CA.pl",'/usr/local/bin/perl','^#!/', '#!%s');
451dc18f 1529 }
78c990c1 1530 if ($depflags ne $default_depflags && !$make_depend) {
451dc18f
RL
1531 print <<EOF;
1532
ab185b60
BM
1533Since you've disabled or enabled at least one algorithm, you need to do
1534the following before building:
451dc18f
RL
1535
1536 make depend
1537EOF
1538 }
8e10f2b3
UM
1539}
1540
fc6a6a10 1541# create the ms/version32.rc file if needed
eef0c1f3 1542if ($IsMK1MF && ($target !~ /^netware/)) {
fc6a6a10
DSH
1543 my ($v1, $v2, $v3, $v4);
1544 if ($version_num =~ /(^[0-9a-f]{1})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})/i) {
1545 $v1=hex $1;
1546 $v2=hex $2;
1547 $v3=hex $3;
1548 $v4=hex $4;
1549 }
1550 open (OUT,">ms/version32.rc") || die "Can't open ms/version32.rc";
1551 print OUT <<EOF;
1552#include <winver.h>
1553
1554LANGUAGE 0x09,0x01
1555
15561 VERSIONINFO
1557 FILEVERSION $v1,$v2,$v3,$v4
1558 PRODUCTVERSION $v1,$v2,$v3,$v4
1559 FILEFLAGSMASK 0x3fL
1560#ifdef _DEBUG
1561 FILEFLAGS 0x01L
1562#else
1563 FILEFLAGS 0x00L
1564#endif
1565 FILEOS VOS__WINDOWS32
1566 FILETYPE VFT_DLL
1567 FILESUBTYPE 0x0L
1568BEGIN
1569 BLOCK "StringFileInfo"
1570 BEGIN
1571 BLOCK "040904b0"
1572 BEGIN
fce0ba5f 1573 // Required:
fc6a6a10
DSH
1574 VALUE "CompanyName", "The OpenSSL Project, http://www.openssl.org/\\0"
1575 VALUE "FileDescription", "OpenSSL Shared Library\\0"
1576 VALUE "FileVersion", "$version\\0"
1577#if defined(CRYPTO)
1578 VALUE "InternalName", "libeay32\\0"
1579 VALUE "OriginalFilename", "libeay32.dll\\0"
1580#elif defined(SSL)
1581 VALUE "InternalName", "ssleay32\\0"
1582 VALUE "OriginalFilename", "ssleay32.dll\\0"
a479d72d 1583#endif
fc6a6a10
DSH
1584 VALUE "ProductName", "The OpenSSL Toolkit\\0"
1585 VALUE "ProductVersion", "$version\\0"
1586 // Optional:
1587 //VALUE "Comments", "\\0"
e77d8f2e 1588