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