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