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