]> git.ipfire.org Git - thirdparty/openssl.git/blame - Configure
Multiple -trusted/-untrusted/-CRLfile options in verify
[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
c59cb511
RL
622my $flags;
623my $depflags;
7a762197 624my $openssl_experimental_defines;
c59cb511
RL
625my $openssl_algorithm_defines;
626my $openssl_thread_defines;
cf1b7d96 627my $openssl_sys_defines="";
c59cb511
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;
638my $argvstring="";
639my $argv_unprocessed=1;
640
641while($argv_unprocessed)
d02b48c6 642 {
c59cb511
RL
643 $flags="";
644 $depflags="";
7a762197 645 $openssl_experimental_defines="";
c59cb511
RL
646 $openssl_algorithm_defines="";
647 $openssl_thread_defines="";
cf1b7d96 648 $openssl_sys_defines="";
c59cb511
RL
649 $openssl_other_defines="";
650 $libs="";
651 $target="";
652 $options="";
c59cb511
RL
653
654 $argv_unprocessed=0;
655 $argvstring=join(' ',@argvcopy);
656
657PROCESS_ARGS:
16b6081e 658 {
489eb740 659 my %unsupported_options = ();
c59cb511 660 foreach (@argvcopy)
f5d7a031 661 {
c59cb511 662 s /^-no-/no-/; # some people just can't read the instructions
c9a112f5
BM
663
664 # rewrite some options in "enable-..." form
665 s /^-?-?shared$/enable-shared/;
7e159e01 666 s /^sctp$/enable-sctp/;
c9a112f5
BM
667 s /^threads$/enable-threads/;
668 s /^zlib$/enable-zlib/;
669 s /^zlib-dynamic$/enable-zlib-dynamic/;
670
8b527be2
RL
671 if (/^(no|disable|enable|experimental)-(.+)$/)
672 {
673 my $word = $2;
674 if (!grep { $word =~ /^${_}$/ } @disablables)
675 {
489eb740 676 $unsupported_options{$_} = 1;
8b527be2
RL
677 next;
678 }
679 }
c9a112f5 680 if (/^no-(.+)$/ || /^disable-(.+)$/)
d02b48c6 681 {
7a762197 682 if (!($disabled{$1} eq "experimental"))
e172d60d 683 {
6b01bed2 684 foreach my $proto ((@tls, @dtls))
7a762197 685 {
6b01bed2
VD
686 if ($1 eq "$proto-method")
687 {
688 $disabled{"$proto"} = "option($proto-method)";
689 last;
690 }
7a762197 691 }
6b01bed2 692 if ($1 eq "dtls")
7a762197 693 {
6b01bed2
VD
694 foreach my $proto (@dtls)
695 {
696 $disabled{$proto} = "option(dtls)";
697 }
7a762197 698 }
6b01bed2 699 elsif ($1 eq "ssl")
3881d810 700 {
6b01bed2 701 # Last one of its kind
3881d810
DSH
702 $disabled{"ssl3"} = "option(ssl)";
703 }
6b01bed2
VD
704 elsif ($1 eq "tls")
705 {
706 # XXX: Tests will fail if all SSL/TLS
707 # protocols are disabled.
708 foreach my $proto (@tls)
709 {
710 $disabled{$proto} = "option(tls)";
711 }
712 }
7a762197
BM
713 else
714 {
715 $disabled{$1} = "option";
716 }
fce0ba5f 717 }
7a762197
BM
718 }
719 elsif (/^enable-(.+)$/ || /^experimental-(.+)$/)
720 {
721 my $algo = $1;
722 if ($disabled{$algo} eq "experimental")
b6e4dac2 723 {
7a762197
BM
724 die "You are requesting an experimental feature; please say 'experimental-$algo' if you are sure\n"
725 unless (/^experimental-/);
726 push @experimental, $algo;
b6e4dac2 727 }
7a762197 728 delete $disabled{$algo};
c9a112f5 729
7a762197 730 $threads = 1 if ($algo eq "threads");
c9a112f5 731 }
9e43c6b5 732 elsif (/^--strict-warnings$/)
0c28f277
DSH
733 {
734 $strict_warnings = 1;
735 }
9e43c6b5
RL
736 elsif (/^--debug$/)
737 {
738 $build_prefix = "debug_";
739 }
740 elsif (/^--release$/)
741 {
742 $build_prefix = "release_";
743 }
c59cb511 744 elsif (/^reconfigure/ || /^reconf/)
d02b48c6 745 {
c59cb511
RL
746 if (open(IN,"<$Makefile"))
747 {
0c14d442 748 my $config_args_found=0;
c59cb511
RL
749 while (<IN>)
750 {
67475a7e 751 chomp;
c59cb511
RL
752 if (/^CONFIGURE_ARGS=(.*)/)
753 {
754 $argvstring=$1;
755 @argvcopy=split(' ',$argvstring);
756 die "Incorrect data to reconfigure, please do a normal configuration\n"
757 if (grep(/^reconf/,@argvcopy));
758 print "Reconfiguring with: $argvstring\n";
759 $argv_unprocessed=1;
0c14d442
AP
760 $config_args_found=1;
761 }
762 elsif (/^CROSS_COMPILE=\s*(.*)/)
763 {
764 $ENV{CROSS_COMPILE}=$1;
765 }
91cf7551 766 elsif (/^CC=\s*(?:\$\(CROSS_COMPILE\))?(.*?)$/)
0c14d442
AP
767 {
768 $ENV{CC}=$1;
c59cb511
RL
769 }
770 }
771 close(IN);
0c14d442 772 last PROCESS_ARGS if ($config_args_found);
c59cb511
RL
773 }
774 die "Insufficient data to reconfigure, please do a normal configuration\n";
d02b48c6 775 }
c59cb511 776 elsif (/^386$/)
c9a112f5 777 { $processor=386; }
9fdb2cc5
DSH
778 elsif (/^fips$/)
779 {
780 $fips=1;
7d8bb912 781 }
c59cb511 782 elsif (/^rsaref$/)
3eb0ed6d 783 {
ccb9643f
RL
784 # No RSAref support any more since it's not needed.
785 # The check for the option is there so scripts aren't
786 # broken
462ba4f6 787 }
1ab2f7f1
DSH
788 elsif (/^nofipscanistercheck$/)
789 {
790 $fips = 1;
791 $nofipscanistercheck = 1;
792 }
c59cb511 793 elsif (/^[-+]/)
462ba4f6 794 {
800a4a70 795 if (/^--prefix=(.*)$/)
c59cb511
RL
796 {
797 $prefix=$1;
798 }
98186eb4
VD
799 elsif (/^--api=(.*)$/)
800 {
801 $api=$1;
802 }
6727565a
DSH
803 elsif (/^--libdir=(.*)$/)
804 {
805 $libdir=$1;
806 }
c59cb511
RL
807 elsif (/^--openssldir=(.*)$/)
808 {
809 $openssldir=$1;
810 }
811 elsif (/^--install.prefix=(.*)$/)
812 {
813 $install_prefix=$1;
814 }
1291dfde 815 elsif (/^--with-zlib-lib=(.*)$/)
ad2695b1 816 {
1291dfde
DSH
817 $withargs{"zlib-lib"}=$1;
818 }
819 elsif (/^--with-zlib-include=(.*)$/)
820 {
821 $withargs{"zlib-include"}="-I$1";
ad2695b1 822 }
cc8bd545
DSH
823 elsif (/^--with-fipslibdir=(.*)$/)
824 {
825 $fipslibdir="$1/";
826 }
827 elsif (/^--with-baseaddr=(.*)$/)
828 {
829 $baseaddr="$1";
830 }
cbfb39d1
AP
831 elsif (/^--cross-compile-prefix=(.*)$/)
832 {
833 $cross_compile_prefix=$1;
834 }
f09e7ca9
RS
835 elsif (/^--config=(.*)$/)
836 {
837 read_config $1;
838 }
800a4a70 839 elsif (/^-[lL](.*)$/ or /^-Wl,/)
c59cb511 840 {
800a4a70
AP
841 $libs.=$_." ";
842 }
843 else # common if (/^[-+]/), just pass down...
844 {
845 $_ =~ s/%([0-9a-f]{1,2})/chr(hex($1))/gei;
846 $flags.=$_." ";
c59cb511 847 }
3eb0ed6d 848 }
c59cb511 849 elsif ($_ =~ /^([^:]+):(.+)$/)
e5f3045f 850 {
c59cb511
RL
851 eval "\$table{\$1} = \"$2\""; # allow $xxx constructs in the string
852 $target=$1;
e5f3045f 853 }
d02b48c6
RE
854 else
855 {
a761b89d 856 die "target already defined - $target (offending arg: $_)\n" if ($target ne "");
c59cb511
RL
857 $target=$_;
858 }
c9a112f5
BM
859
860 unless ($_ eq $target || /^no-/ || /^disable-/)
861 {
862 # "no-..." follows later after implied disactivations
863 # have been derived. (Don't take this too seroiusly,
864 # we really only write OPTIONS to the Makefile out of
865 # nostalgia.)
866
867 if ($options eq "")
868 { $options = $_; }
869 else
870 { $options .= " ".$_; }
d02b48c6 871 }
fbabb752 872 }
489eb740 873
98186eb4
VD
874 if (defined($api) && !exists $apitable->{$api}) {
875 die "***** Unsupported api compatibility level: $api\n",
876 }
877
489eb740
RL
878 if (keys %unsupported_options)
879 {
880 die "***** Unsupported options: ",
881 join(", ", keys %unsupported_options), "\n";
882 }
fbabb752 883 }
16b6081e 884 }
b6e4dac2 885
b6e4dac2 886
c9a112f5
BM
887if ($processor eq "386")
888 {
889 $disabled{"sse2"} = "forced";
890 }
891
c9a112f5
BM
892if (!defined($disabled{"zlib-dynamic"}))
893 {
894 # "zlib-dynamic" was specifically enabled, so enable "zlib"
895 delete $disabled{"zlib"};
896 }
b6e4dac2 897
c9a112f5
BM
898if (defined($disabled{"rijndael"}))
899 {
900 $disabled{"aes"} = "forced";
901 }
902if (defined($disabled{"des"}))
903 {
904 $disabled{"mdc2"} = "forced";
905 }
906if (defined($disabled{"ec"}))
b6e4dac2 907 {
c9a112f5
BM
908 $disabled{"ecdsa"} = "forced";
909 $disabled{"ecdh"} = "forced";
b6e4dac2
RL
910 }
911
6b01bed2 912# SSL 3.0 requires MD5 and SHA and either RSA or DSA+DH
c9a112f5
BM
913if (defined($disabled{"md5"}) || defined($disabled{"sha"})
914 || (defined($disabled{"rsa"})
6b01bed2 915 && (defined($disabled{"dsa"}) || defined($disabled{"dh"}))))
b6e4dac2 916 {
c9a112f5 917 $disabled{"ssl3"} = "forced";
6b01bed2
VD
918 $disabled{"ssl"} = "forced";
919 }
920
921# (D)TLS 1.0 and TLS 1.1 require MD5 and SHA and either RSA or DSA+DH
922# or ECDSA + ECDH. (XXX: We don't support PSK-only builds).
923#
924if (defined($disabled{"md5"}) || defined($disabled{"sha"})
925 || (defined($disabled{"rsa"})
926 && (defined($disabled{"dsa"}) || defined($disabled{"dh"}))
927 && (defined($disabled{"ecdsa"}) || defined($disabled{"ecdh"}))))
928 {
c9a112f5 929 $disabled{"tls1"} = "forced";
6b01bed2
VD
930 $disabled{"dtls1"} = "forced";
931 $disabled{"tls1_1"} = "forced";
932 }
933
934# (D)TLS 1.2 requires either RSA or DSA+DH or ECDSA + ECDH
935# So if all are missing, we can't do either TLS or DTLS.
936# (XXX: We don't support PSK-only builds).
937#
938if (defined($disabled{"rsa"})
939 && (defined($disabled{"dsa"}) || defined($disabled{"dh"}))
940 && (defined($disabled{"ecdsa"}) || defined($disabled{"ecdh"})))
941 {
942 $disabled{"tls"} = "forced";
943 $disabled{"dtls"} = "forced";
944 foreach my $proto ((@tls, @dtls))
945 {
946 $disabled{"$proto"} = "forced";
947 }
948 }
949
950
951# Avoid protocol support holes. Also disable all versions below N, if version
952# N is disabled while N+1 is enabled.
953#
954my $prev_disabled = 1;
955my $force_disable = 0;
956foreach my $proto (reverse(@tls))
957 {
958 if ($force_disable)
959 {
960 $disabled{$proto} = 1;
961 }
962 elsif (! defined($disabled{$proto}))
963 {
964 $prev_disabled = 0;
965 }
966 elsif (! $prev_disabled)
967 {
968 $force_disable = 1;
969 }
970 }
971my $prev_disabled = 1;
972my $force_disable = 0;
973foreach my $proto (reverse(@dtls))
974 {
975 if ($force_disable)
976 {
977 $disabled{$proto} = 1;
978 }
979 elsif (! defined($disabled{$proto}))
980 {
981 $prev_disabled = 0;
982 }
983 elsif (! $prev_disabled)
984 {
985 $force_disable = 1;
986 }
b6e4dac2
RL
987 }
988
a7a14a23
BL
989if (defined($disabled{"dgram"}))
990 {
6b01bed2
VD
991 $disabled{"dtls"} = "forced";
992 $disabled{"dtls1"} = "forced";
993 $disabled{"dtls1_2"} = "forced";
994 }
c9a112f5 995
d4f0339c 996if (defined($disabled{"ec"}) || defined($disabled{"dsa"})
984d6c60 997 || defined($disabled{"dh"}) || defined($disabled{"stdio"}))
ef236ec3
DSH
998 {
999 $disabled{"gost"} = "forced";
1000 }
1001
edc032b5 1002
436a376b
BM
1003if ($target eq "TABLE") {
1004 foreach $target (sort keys %table) {
aaf878cc 1005 print_table_entry($target, "TABLE");
436a376b 1006 }
436a376b
BM
1007 exit 0;
1008}
1009
10a926c1
UM
1010if ($target eq "LIST") {
1011 foreach (sort keys %table) {
1012 print;
1013 print "\n";
1014 }
1015 exit 0;
1016}
1017
aaf878cc
RL
1018if ($target eq "HASH") {
1019 print "%table = (\n";
1020 foreach (sort keys %table) {
1021 print_table_entry($_, "HASH");
1022 }
1023 exit 0;
1024}
1025
49e04548
RL
1026if ($target =~ m/^CygWin32(-.*)$/) {
1027 $target = "Cygwin".$1;
1028}
1029
c59cb511
RL
1030print "Configuring for $target\n";
1031
9e43c6b5 1032# Support for legacy targets having a name starting with 'debug-'
aaf878cc 1033my ($d, $t) = $target =~ m/^(debug-)?(.*)$/;
aaf878cc 1034if ($d) {
9e43c6b5 1035 $build_prefix = "debug_";
aaf878cc
RL
1036
1037 # If we do not find debug-foo in the table, the target is set to foo,
b1245529 1038 # but only if the foo target has a noon-empty debug_cflags or debug_lflags
aaf878cc 1039 # attribute.
8e8b883f 1040 if (!$table{$target}) {
aaf878cc
RL
1041 $target = $t;
1042 }
1043}
bd5192b1 1044my %target = resolve_config($target);
aaf878cc 1045
bd5192b1 1046&usage if (!%target || $target{template});
462ba4f6 1047
9fdb2cc5
DSH
1048if ($fips)
1049 {
1050 delete $disabled{"shared"} if ($disabled{"shared"} eq "default");
1051 }
c9a112f5
BM
1052
1053foreach (sort (keys %disabled))
1054 {
1055 $options .= " no-$_";
1056
1057 printf " no-%-12s %-10s", $_, "[$disabled{$_}]";
1058
1059 if (/^dso$/)
1060 { $no_dso = 1; }
1061 elsif (/^threads$/)
1062 { $no_threads = 1; }
1063 elsif (/^shared$/)
1064 { $no_shared = 1; }
1065 elsif (/^zlib$/)
1066 { $zlib = 0; }
fbf002bb
DSH
1067 elsif (/^static-engine$/)
1068 { }
c9a112f5
BM
1069 elsif (/^zlib-dynamic$/)
1070 { }
c9a112f5
BM
1071 elsif (/^sse2$/)
1072 { $no_sse2 = 1; }
1073 else
1074 {
1075 my ($ALGO, $algo);
30fafdeb 1076 ($ALGO = $algo = $_) =~ tr/[\-a-z]/[_A-Z]/;
c9a112f5
BM
1077
1078 if (/^asm$/ || /^err$/ || /^hw$/ || /^hw-/)
1079 {
1080 $openssl_other_defines .= "#define OPENSSL_NO_$ALGO\n";
1081 print " OPENSSL_NO_$ALGO";
fce0ba5f 1082
5df70a9e
AP
1083 if (/^err$/) { $flags .= "-DOPENSSL_NO_ERR "; }
1084 elsif (/^asm$/) { $no_asm = 1; }
c9a112f5
BM
1085 }
1086 else
1087 {
2a4af947
AP
1088 ($ALGO,$algo) = ("RMD160","rmd160") if ($algo eq "ripemd");
1089
c9a112f5
BM
1090 $openssl_algorithm_defines .= "#define OPENSSL_NO_$ALGO\n";
1091 print " OPENSSL_NO_$ALGO";
1092
e36827f6
MC
1093 push @skip, $algo;
1094 # fix-up crypto/directory name(s)
1095 $skip[$#skip]="whrlpool" if $algo eq "whirlpool";
1096 $skip[$#skip]="ripemd" if $algo eq "rmd160";
2a4af947 1097
e36827f6 1098 print " (skip dir)";
ab185b60 1099
e36827f6 1100 $depflags .= " -DOPENSSL_NO_$ALGO";
c9a112f5
BM
1101 }
1102 }
1103
1104 print "\n";
1105 }
1106
7a762197 1107my $exp_cflags = "";
ccc5784e 1108
7a762197
BM
1109foreach (sort @experimental)
1110 {
1111 my $ALGO;
1112 ($ALGO = $_) =~ tr/[a-z]/[A-Z]/;
1113
1114 # opensslconf.h will set OPENSSL_NO_... unless OPENSSL_EXPERIMENTAL_... is defined
1115 $openssl_experimental_defines .= "#define OPENSSL_NO_$ALGO\n";
1116 $exp_cflags .= " -DOPENSSL_EXPERIMENTAL_$ALGO";
1117 }
c9a112f5 1118
4d8743f4 1119my $IsMK1MF=scalar grep /^$target$/,@MK1MF_Builds;
a1e464f9 1120
9be54812 1121$exe_ext=".exe" if ($target eq "Cygwin" || $target eq "DJGPP" || $target =~ /^mingw/);
eef0c1f3 1122$exe_ext=".nlm" if ($target =~ /netware/);
d0590fe6 1123$exe_ext=".pm" if ($target =~ /vos/);
5496cd3e 1124$openssldir="/usr/local/ssl" if ($openssldir eq "" and $prefix eq "");
e5f3045f 1125$prefix=$openssldir if $prefix eq "";
462ba4f6 1126
28a80034
RL
1127$default_ranlib= &which("ranlib") or $default_ranlib="true";
1128$perl=$ENV{'PERL'} or $perl=&which("perl5") or $perl=&which("perl")
1129 or $perl="perl";
dafd8333 1130my $make = $ENV{'MAKE'} || "make";
28a80034 1131
34775923 1132$cross_compile_prefix=$ENV{'CROSS_COMPILE'} if $cross_compile_prefix eq "";
f99f41cf 1133
462ba4f6 1134chop $openssldir if $openssldir =~ /\/$/;
bc645199 1135chop $prefix if $prefix =~ /.\/$/;
462ba4f6 1136
e5f3045f 1137$openssldir=$prefix . "/ssl" if $openssldir eq "";
451dc18f 1138$openssldir=$prefix . "/" . $openssldir if $openssldir !~ /(^\/|^[a-zA-Z]:[\\\/])/;
d02b48c6 1139
efadf60f 1140
4d8743f4 1141print "IsMK1MF=$IsMK1MF\n";
efadf60f 1142
7f625320 1143# Allow environment CC to override compiler...
bd5192b1 1144my $cc = $ENV{CC} || $target{cc};
aaf878cc 1145
b1245529 1146# For cflags and lflags, add the debug_ or release_ attributes
aaf878cc
RL
1147# Do it in such a way that no spurious space is appended (hence the grep).
1148my $cflags = join(" ",
bd5192b1
RL
1149 grep { $_ } ($target{cflags},
1150 $target{$build_prefix."cflags"}));
aaf878cc 1151my $lflags = join(" ",
bd5192b1
RL
1152 grep { $_ } ($target{lflags},
1153 $target{$build_prefix."lflags"}));
1154
1155my $unistd = $target{unistd};
1156my $thread_cflag = $target{thread_cflag};
1157my $sys_id = $target{sys_id};
1158my $bn_ops = $target{bn_ops};
1159my $cpuid_obj = $target{cpuid_obj};
1160my $bn_obj = $target{bn_obj};
1161my $ec_obj = $target{ec_obj};
1162my $des_obj = $target{des_obj};
1163my $aes_obj = $target{aes_obj};
1164my $bf_obj = $target{bf_obj};
1165my $md5_obj = $target{md5_obj};
1166my $sha1_obj = $target{sha1_obj};
1167my $cast_obj = $target{cast_obj};
1168my $rc4_obj = $target{rc4_obj};
1169my $rmd160_obj = $target{rmd160_obj};
1170my $rc5_obj = $target{rc5_obj};
1171my $wp_obj = $target{wp_obj};
1172my $cmll_obj = $target{cmll_obj};
1173my $modes_obj = $target{modes_obj};
1174my $engines_obj = $target{engines_obj};
1175my $chacha_obj = $target{chacha_obj};
1176my $poly1305_obj = $target{poly1305_obj};
1177my $perlasm_scheme = $target{perlasm_scheme};
1178my $dso_scheme = $target{dso_scheme};
1179my $shared_target = $target{shared_target};
1180my $shared_cflag = $target{shared_cflag};
1181my $shared_ldflag = $target{shared_ldflag};
1182my $shared_extension = $target{shared_extension};
1183my $ranlib = $ENV{'RANLIB'} || $target{ranlib};
970097ae 1184my $ar = $ENV{'AR'} || "ar";
bd5192b1
RL
1185my $arflags = $target{arflags};
1186my $multilib = $target{multilib};
d0d046ec 1187
b730b03f
AP
1188# if $prefix/lib$multilib is not an existing directory, then
1189# assume that it's not searched by linker automatically, in
1190# which case adding $multilib suffix causes more grief than
1191# we're ready to tolerate, so don't...
1192$multilib="" if !-d "$prefix/lib$multilib";
1193
6a9d28f9
AP
1194$libdir="lib$multilib" if $libdir eq "";
1195
7a762197
BM
1196$cflags = "$cflags$exp_cflags";
1197
d6c76457
AP
1198# '%' in $lflags is used to split flags to "pre-" and post-flags
1199my ($prelflags,$postlflags)=split('%',$lflags);
1200if (defined($postlflags)) { $lflags=$postlflags; }
1201else { $lflags=$prelflags; undef $prelflags; }
1202
cbecd29a
AP
1203if ($target =~ /^mingw/ && `$cc --target-help 2>&1` !~ m/\-mno\-cygwin/m)
1204 {
1205 $cflags =~ s/\-mno\-cygwin\s*//;
1206 $shared_ldflag =~ s/\-mno\-cygwin\s*//;
1207 }
1208
63d8834c
AP
1209if ($target =~ /linux.*\-mips/ && !$no_asm && $flags !~ /\-m(ips|arch=)/) {
1210 # minimally required architecture flags for assembly modules
1211 $cflags="-mips2 $cflags" if ($target =~ /mips32/);
1212 $cflags="-mips3 $cflags" if ($target =~ /mips64/);
1213}
1214
2964ba8c 1215my $no_shared_warn=0;
14bcdb08 1216my $no_user_cflags=0;
2964ba8c 1217
14bcdb08
AP
1218if ($flags ne "") { $cflags="$flags$cflags"; }
1219else { $no_user_cflags=1; }
5f8d5c96 1220
bc2aadad
GT
1221# The DSO code currently always implements all functions so that no
1222# applications will have to worry about that from a compilation point
1223# of view. However, the "method"s may return zero unless that platform
1224# has support compiled in for them. Currently each method is enabled
1225# by a define "DSO_<name>" ... we translate the "dso_scheme" config
1226# string entry into using the following logic;
eca57e92 1227my $dso_cflags;
bc2aadad
GT
1228if (!$no_dso && $dso_scheme ne "")
1229 {
9ec0126e 1230 $dso_scheme =~ tr/[a-z]/[A-Z]/;
bc2aadad
GT
1231 if ($dso_scheme eq "DLFCN")
1232 {
eca57e92 1233 $dso_cflags = "-DDSO_DLFCN -DHAVE_DLFCN_H";
bc2aadad
GT
1234 }
1235 elsif ($dso_scheme eq "DLFCN_NO_H")
1236 {
eca57e92 1237 $dso_cflags = "-DDSO_DLFCN";
bc2aadad
GT
1238 }
1239 else
1240 {
eca57e92 1241 $dso_cflags = "-DDSO_$dso_scheme";
bc2aadad 1242 }
eca57e92 1243 $cflags = "$dso_cflags $cflags";
bc2aadad 1244 }
9ec0126e 1245
5f8d5c96 1246my $thread_cflags;
fb044c59 1247my $thread_defines;
5f8d5c96
BM
1248if ($thread_cflag ne "(unknown)" && !$no_threads)
1249 {
1250 # If we know how to do it, support threads by default.
1251 $threads = 1;
1252 }
14bcdb08 1253if ($thread_cflag eq "(unknown)" && $threads)
5f8d5c96 1254 {
14bcdb08
AP
1255 # If the user asked for "threads", [s]he is also expected to
1256 # provide any system-dependent compiler options that are
1257 # necessary.
1258 if ($no_user_cflags)
1259 {
1260 print "You asked for multi-threading support, but didn't\n";
1261 print "provide any system-specific compiler options\n";
1262 exit(1);
1263 }
cf1b7d96
RL
1264 $thread_cflags="-DOPENSSL_THREADS $cflags" ;
1265 $thread_defines .= "#define OPENSSL_THREADS\n";
5f8d5c96
BM
1266 }
1267else
1268 {
cf1b7d96
RL
1269 $thread_cflags="-DOPENSSL_THREADS $thread_cflag $cflags";
1270 $thread_defines .= "#define OPENSSL_THREADS\n";
a7b991bd
BM
1271# my $def;
1272# foreach $def (split ' ',$thread_cflag)
1273# {
1274# if ($def =~ s/^-D// && $def !~ /^_/)
1275# {
1276# $thread_defines .= "#define $def\n";
1277# }
1278# }
fce0ba5f 1279 }
5f8d5c96 1280
95649972 1281$lflags="$libs$lflags" if ($libs ne "");
d02b48c6 1282
dfeab068
RE
1283if ($no_asm)
1284 {
6019cdd3 1285 $cpuid_obj=$bn_obj=$ec_obj=
ac71d81e 1286 $des_obj=$aes_obj=$bf_obj=$cast_obj=$rc4_obj=$rc5_obj=$cmll_obj=
22c2e80f
AP
1287 $modes_obj=$sha1_obj=$md5_obj=$rmd160_obj=$wp_obj=$engines_obj=
1288 $chacha_obj=$poly1305_obj="";
9fdb2cc5
DSH
1289 $cflags=~s/\-D[BL]_ENDIAN// if ($fips);
1290 $thread_cflags=~s/\-D[BL]_ENDIAN// if ($fips);
dfeab068 1291 }
03bc500a
DSH
1292elsif (defined($disabled{ec2m}))
1293 {
1294 $bn_obj =~ s/\w+-gf2m.o//;
1295 }
dfeab068 1296
6f7ac8e1
AP
1297if (!$no_shared)
1298 {
1299 $cast_obj=""; # CAST assembler is not PIC
1300 }
1301
5f8d5c96
BM
1302if ($threads)
1303 {
14bcdb08 1304 $cflags=$thread_cflags;
e452de9d
RL
1305 $openssl_thread_defines .= $thread_defines;
1306 }
1307
1308if ($zlib)
1309 {
1310 $cflags = "-DZLIB $cflags";
c9a112f5
BM
1311 if (defined($disabled{"zlib-dynamic"}))
1312 {
cc7399e7
DSH
1313 if (defined($withargs{"zlib-lib"}))
1314 {
1315 $lflags = "$lflags -L" . $withargs{"zlib-lib"} . " -lz";
1316 }
1317 else
1318 {
1319 $lflags = "$lflags -lz";
1320 }
c9a112f5
BM
1321 }
1322 else
1323 {
1324 $cflags = "-DZLIB_SHARED $cflags";
1325 }
5f8d5c96
BM
1326 }
1327
98186eb4
VD
1328# With "deprecated" disable all deprecated features.
1329if (defined($disabled{"deprecated"})) {
1330 $api = $maxapi;
1331}
07c4c14c 1332
d10dac11 1333# You will find shlib_mark1 and shlib_mark2 explained in Makefile.in
a22fb399 1334my $shared_mark = "";
6f7ac8e1
AP
1335if ($shared_target eq "")
1336 {
9fdb2cc5 1337 $no_shared_warn = 1 if !$no_shared && !$fips;
6f7ac8e1
AP
1338 $no_shared = 1;
1339 }
1340if (!$no_shared)
b436a982 1341 {
a22fb399
RL
1342 if ($shared_cflag ne "")
1343 {
28e276f1 1344 $cflags = "$shared_cflag -DOPENSSL_PIC $cflags";
a22fb399 1345 }
d2dcf4f4 1346 }
b436a982 1347
fbf002bb 1348if (!$IsMK1MF)
ecd45314 1349 {
4c1a6e00 1350 # add {no-}static-engine to options to allow mkdef.pl to work without extra arguments
fbf002bb
DSH
1351 if ($no_shared)
1352 {
1353 $openssl_other_defines.="#define OPENSSL_NO_DYNAMIC_ENGINE\n";
4c1a6e00 1354 $options.=" static-engine";
fbf002bb
DSH
1355 }
1356 else
1357 {
1358 $openssl_other_defines.="#define OPENSSL_NO_STATIC_ENGINE\n";
4c1a6e00 1359 $options.=" no-static-engine";
fbf002bb 1360 }
6cb68620 1361 }
ecd45314 1362
beef7145 1363$cpuid_obj.=" uplink.o uplink-x86.o" if ($cflags =~ /\-DOPENSSL_USE_APPLINK/);
1187ee7d 1364
c313e32a
AP
1365#
1366# Platform fix-ups
1367#
1368if ($target =~ /\-icc$/) # Intel C compiler
1a979201 1369 {
1187ee7d
AP
1370 my $iccver=0;
1371 if (open(FD,"$cc -V 2>&1 |"))
1372 {
1373 while(<FD>) { $iccver=$1 if (/Version ([0-9]+)\./); }
1374 close(FD);
1375 }
1a979201
AP
1376 if ($iccver>=8)
1377 {
cf5ecc3e 1378 $cflags=~s/\-KPIC/-fPIC/;
1a979201
AP
1379 # Eliminate unnecessary dependency from libirc.a. This is
1380 # essential for shared library support, as otherwise
1381 # apps/openssl can end up in endless loop upon startup...
1382 $cflags.=" -Dmemcpy=__builtin_memcpy -Dmemset=__builtin_memset";
1383 }
1187ee7d
AP
1384 if ($iccver>=9)
1385 {
cf5ecc3e
AP
1386 $lflags.=" -i-static";
1387 $lflags=~s/\-no_cpprt/-no-cpprt/;
1187ee7d
AP
1388 }
1389 if ($iccver>=10)
1390 {
cf5ecc3e
AP
1391 $lflags=~s/\-i\-static/-static-intel/;
1392 }
1393 if ($iccver>=11)
1394 {
1395 $cflags.=" -no-intel-extensions"; # disable Cilk
1396 $lflags=~s/\-no\-cpprt/-no-cxxlib/;
1187ee7d 1397 }
1a979201
AP
1398 }
1399
c313e32a
AP
1400# Unlike other OSes (like Solaris, Linux, Tru64, IRIX) BSD run-time
1401# linkers (tested OpenBSD, NetBSD and FreeBSD) "demand" RPATH set on
1402# .so objects. Apparently application RPATH is not global and does
1403# not apply to .so linked with other .so. Problem manifests itself
1404# when libssl.so fails to load libcrypto.so. One can argue that we
1405# should engrave this into Makefile.shared rules or into BSD-* config
1406# lines above. Meanwhile let's try to be cautious and pass -rpath to
1407# linker only when --prefix is not /usr.
1408if ($target =~ /^BSD\-/)
1409 {
c64879d3 1410 $shared_ldflag.=" -Wl,-rpath,\$\$(LIBRPATH)" if ($prefix !~ m|^/usr[/]*$|);
c313e32a
AP
1411 }
1412
cf1b7d96
RL
1413if ($sys_id ne "")
1414 {
68b00c23
RS
1415 #$cflags="-DOPENSSL_SYS_$sys_id $cflags";
1416 $openssl_sys_defines="#define OPENSSL_SYS_$sys_id\n";
cf1b7d96
RL
1417 }
1418
0396479d
BM
1419if ($ranlib eq "")
1420 {
1421 $ranlib = $default_ranlib;
1422 }
1423
1750ebcb
DSH
1424#my ($bn1)=split(/\s+/,$bn_obj);
1425#$bn1 = "" unless defined $bn1;
1426#$bn1=$bn_asm unless ($bn1 =~ /\.o$/);
1427#$bn_obj="$bn1";
1428
c9a112f5 1429$cpuid_obj="" if ($processor eq "386");
f8c469de 1430
1750ebcb 1431$bn_obj = $bn_asm unless $bn_obj ne "";
d05a4745
BM
1432# bn-586 is the only one implementing bn_*_part_words
1433$cflags.=" -DOPENSSL_BN_ASM_PART_WORDS" if ($bn_obj =~ /bn-586/);
4287ade5 1434$cflags.=" -DOPENSSL_IA32_SSE2" if (!$no_sse2 && $bn_obj =~ /86/);
dfeab068 1435
d05a4745 1436$cflags.=" -DOPENSSL_BN_ASM_MONT" if ($bn_obj =~ /-mont/);
361512da 1437$cflags.=" -DOPENSSL_BN_ASM_MONT5" if ($bn_obj =~ /-mont5/);
925596f8 1438$cflags.=" -DOPENSSL_BN_ASM_GF2m" if ($bn_obj =~ /-gf2m/);
5ac7bde7 1439
1ab2f7f1
DSH
1440if ($fips)
1441 {
1442 $openssl_other_defines.="#define OPENSSL_FIPS\n";
1ab2f7f1
DSH
1443 }
1444
b2dba9bf 1445$cpuid_obj="mem_clr.o" unless ($cpuid_obj =~ /\.o$/);
58964a49
RE
1446$des_obj=$des_enc unless ($des_obj =~ /\.o$/);
1447$bf_obj=$bf_enc unless ($bf_obj =~ /\.o$/);
1448$cast_obj=$cast_enc unless ($cast_obj =~ /\.o$/);
1449$rc4_obj=$rc4_enc unless ($rc4_obj =~ /\.o$/);
1450$rc5_obj=$rc5_enc unless ($rc5_obj =~ /\.o$/);
1451if ($sha1_obj =~ /\.o$/)
1452 {
1453# $sha1_obj=$sha1_enc;
d0590fe6
AP
1454 $cflags.=" -DSHA1_ASM" if ($sha1_obj =~ /sx86/ || $sha1_obj =~ /sha1/);
1455 $cflags.=" -DSHA256_ASM" if ($sha1_obj =~ /sha256/);
1456 $cflags.=" -DSHA512_ASM" if ($sha1_obj =~ /sha512/);
69216cc5 1457 if ($sha1_obj =~ /sse2/)
d0590fe6
AP
1458 { if ($no_sse2)
1459 { $sha1_obj =~ s/\S*sse2\S+//; }
1460 elsif ($cflags !~ /OPENSSL_IA32_SSE2/)
1461 { $cflags.=" -DOPENSSL_IA32_SSE2"; }
1462 }
58964a49
RE
1463 }
1464if ($md5_obj =~ /\.o$/)
1465 {
1466# $md5_obj=$md5_enc;
1467 $cflags.=" -DMD5_ASM";
1468 }
1469if ($rmd160_obj =~ /\.o$/)
1470 {
1471# $rmd160_obj=$rmd160_enc;
1472 $cflags.=" -DRMD160_ASM";
1473 }
d0590fe6
AP
1474if ($aes_obj =~ /\.o$/)
1475 {
e8d93e34 1476 $cflags.=" -DAES_ASM" if ($aes_obj =~ m/\baes\-/);;
77aae965 1477 # aes-ctr.o is not a real file, only indication that assembler
874a3757 1478 # module implements AES_ctr32_encrypt...
77aae965 1479 $cflags.=" -DAES_CTR_ASM" if ($aes_obj =~ s/\s*aes\-ctr\.o//);
478b50cf 1480 # aes-xts.o indicates presence of AES_xts_[en|de]crypt...
77aae965 1481 $cflags.=" -DAES_XTS_ASM" if ($aes_obj =~ s/\s*aes\-xts\.o//);
1db4a63b 1482 $aes_obj =~ s/\s*(vpaes|aesni)\-x86\.o//g if ($no_sse2);
8ca28da0 1483 $cflags.=" -DVPAES_ASM" if ($aes_obj =~ m/vpaes/);
993adc05 1484 $cflags.=" -DBSAES_ASM" if ($aes_obj =~ m/bsaes/);
d0590fe6 1485 }
7de4b5b0
AP
1486else {
1487 $aes_obj=$aes_enc;
1488 }
4c5e19b6 1489$wp_obj="" if ($wp_obj =~ /mmx/ && $processor eq "386");
ce0ed3b7 1490if ($wp_obj =~ /\.o$/ && !$disabled{"whirlpool"})
ed26604a 1491 {
4c5e19b6
AP
1492 $cflags.=" -DWHIRLPOOL_ASM";
1493 }
1494else {
1495 $wp_obj="wp_block.o";
ed26604a 1496 }
6a8517f2 1497$cmll_obj=$cmll_enc unless ($cmll_obj =~ /.o$/);
82741e9c 1498if ($modes_obj =~ /ghash\-/)
8a1c92ce
AP
1499 {
1500 $cflags.=" -DGHASH_ASM";
1501 }
84714790
AP
1502if ($ec_obj =~ /ecp_nistz256/)
1503 {
1504 $cflags.=" -DECP_NISTZ256_ASM";
1505 }
22c2e80f
AP
1506$chacha_obj=$chacha_enc unless ($chacha_obj =~ /\.o$/);
1507if ($poly1305_obj =~ /\.o$/)
1508 {
1509 $cflags.=" -DPOLY1305_ASM";
1510 }
d02b48c6 1511
1ed0c662
RL
1512# "Stringify" the C flags string. This permits it to be made part of a string
1513# and works as well on command lines.
1514$cflags =~ s/([\\\"])/\\\1/g;
1515
0973910f 1516my $version = "unknown";
fc6a6a10 1517my $version_num = "unknown";
0973910f
UM
1518my $major = "unknown";
1519my $minor = "unknown";
b436a982
RL
1520my $shlib_version_number = "unknown";
1521my $shlib_version_history = "unknown";
1522my $shlib_major = "unknown";
1523my $shlib_minor = "unknown";
0973910f 1524
dee502be 1525open(IN,'<include/openssl/opensslv.h') || die "unable to read opensslv.h:$!\n";
0973910f
UM
1526while (<IN>)
1527 {
1528 $version=$1 if /OPENSSL.VERSION.TEXT.*OpenSSL (\S+) /;
98186eb4 1529 $version_num=$1 if /OPENSSL.VERSION.NUMBER.*(0x\S+)/;
b436a982
RL
1530 $shlib_version_number=$1 if /SHLIB_VERSION_NUMBER *"([^"]+)"/;
1531 $shlib_version_history=$1 if /SHLIB_VERSION_HISTORY *"([^"]*)"/;
0973910f
UM
1532 }
1533close(IN);
b436a982 1534if ($shlib_version_history ne "") { $shlib_version_history .= ":"; }
0973910f 1535
1fac96e4 1536if ($version =~ /(^[0-9]*)\.([0-9\.]*)/)
0973910f
UM
1537 {
1538 $major=$1;
1539 $minor=$2;
1540 }
1541
b436a982
RL
1542if ($shlib_version_number =~ /(^[0-9]*)\.([0-9\.]*)/)
1543 {
1544 $shlib_major=$1;
1545 $shlib_minor=$2;
1546 }
1547
98186eb4
VD
1548if (defined($api)) {
1549 my $apiflag = sprintf("-DOPENSSL_API_COMPAT=%s", $apitable->{$api});
1550 $default_depflags .= " $apiflag";
1551 $cflags .= " $apiflag";
1552}
1553
58dd1ce9
EK
1554my $ecc = $cc;
1555$ecc = "clang" if `$cc --version 2>&1` =~ /clang/;
1556
0c28f277
DSH
1557if ($strict_warnings)
1558 {
1559 my $wopt;
f386742c 1560 die "ERROR --strict-warnings requires gcc or clang" unless ($ecc =~ /gcc(-\d(\.\d)*)?$/ or $ecc =~ /clang$/);
0c28f277
DSH
1561 foreach $wopt (split /\s+/, $gcc_devteam_warn)
1562 {
6703c4ea 1563 $cflags .= " $wopt" unless ($cflags =~ /(^|\s)$wopt(\s|$)/)
0c28f277 1564 }
190c8c60
BL
1565 if ($ecc eq "clang")
1566 {
1567 foreach $wopt (split /\s+/, $clang_devteam_warn)
1568 {
6703c4ea 1569 $cflags .= " $wopt" unless ($cflags =~ /(^|\s)$wopt(\s|$)/)
190c8c60
BL
1570 }
1571 }
a1d3f3d1
RL
1572 if ($target !~ /^mingw/)
1573 {
1574 foreach $wopt (split /\s+/, $memleak_devteam_backtrace)
1575 {
1576 $cflags .= " $wopt" unless ($cflags =~ /(^|\s)$wopt(\s|$)/)
1577 }
28cbe2ab
BL
1578 if ($target =~ /^BSD-/)
1579 {
1580 $lflags .= " -lexecinfo";
1581 }
1582 }
0c28f277
DSH
1583 }
1584
d10dac11 1585open(IN,"<Makefile.in") || die "unable to read Makefile.in$!\n";
c2aa4f20
RL
1586unlink("$Makefile.new") || die "unable to remove old $Makefile.new:$!\n" if -e "$Makefile.new";
1587open(OUT,">$Makefile.new") || die "unable to create $Makefile.new:$!\n";
d10dac11 1588print OUT "### Generated automatically from Makefile.in by Configure.\n\n";
f5d7a031 1589my $sdirs=0;
edd4d402 1590
d02b48c6
RE
1591while (<IN>)
1592 {
67475a7e 1593 chomp;
f5d7a031 1594 $sdirs = 1 if /^SDIRS=/;
f5d7a031
UM
1595 if ($sdirs) {
1596 my $dir;
1597 foreach $dir (@skip) {
ed551cdd
DSH
1598 s/(\s)$dir /$1/;
1599 s/\s$dir$//;
f5d7a031
UM
1600 }
1601 }
f6f0420d 1602 $sdirs = 0 unless /\\$/;
7e23e857 1603 s/fips // if (/^DIRS=/ && !$fips);
a63bf2c5 1604 s/engines // if (/^DIRS=/ && $disabled{"engine"});
0973910f
UM
1605 s/^VERSION=.*/VERSION=$version/;
1606 s/^MAJOR=.*/MAJOR=$major/;
1607 s/^MINOR=.*/MINOR=$minor/;
b436a982
RL
1608 s/^SHLIB_VERSION_NUMBER=.*/SHLIB_VERSION_NUMBER=$shlib_version_number/;
1609 s/^SHLIB_VERSION_HISTORY=.*/SHLIB_VERSION_HISTORY=$shlib_version_history/;
1610 s/^SHLIB_MAJOR=.*/SHLIB_MAJOR=$shlib_major/;
1611 s/^SHLIB_MINOR=.*/SHLIB_MINOR=$shlib_minor/;
a22fb399 1612 s/^SHLIB_EXT=.*/SHLIB_EXT=$shared_extension/;
e5f3045f 1613 s/^INSTALLTOP=.*$/INSTALLTOP=$prefix/;
c23632d3 1614 s/^MULTILIB=.*$/MULTILIB=$multilib/;
462ba4f6 1615 s/^OPENSSLDIR=.*$/OPENSSLDIR=$openssldir/;
6727565a 1616 s/^LIBDIR=.*$/LIBDIR=$libdir/;
e5f3045f 1617 s/^INSTALL_PREFIX=.*$/INSTALL_PREFIX=$install_prefix/;
dfeab068 1618 s/^PLATFORM=.*$/PLATFORM=$target/;
31ff97b2 1619 s/^OPTIONS=.*$/OPTIONS=$options/;
c59cb511 1620 s/^CONFIGURE_ARGS=.*$/CONFIGURE_ARGS=$argvstring/;
cbfb39d1
AP
1621 if ($cross_compile_prefix)
1622 {
8aab301b
DSH
1623 s/^CC=.*$/CROSS_COMPILE= $cross_compile_prefix\nCC= \$\(CROSS_COMPILE\)$cc/;
1624 s/^AR=\s*/AR= \$\(CROSS_COMPILE\)/;
1625 s/^NM=\s*/NM= \$\(CROSS_COMPILE\)/;
1626 s/^RANLIB=\s*/RANLIB= \$\(CROSS_COMPILE\)/;
1627 s/^MAKEDEPPROG=.*$/MAKEDEPPROG= \$\(CROSS_COMPILE\)$cc/ if $cc eq "gcc";
cbfb39d1
AP
1628 }
1629 else {
1630 s/^CC=.*$/CC= $cc/;
8844a69c 1631 s/^AR=\s*ar/AR= $ar/;
cbfb39d1 1632 s/^RANLIB=.*/RANLIB= $ranlib/;
58dd1ce9 1633 s/^MAKEDEPPROG=.*$/MAKEDEPPROG= $cc/ if $ecc eq "gcc" || $ecc eq "clang";
cbfb39d1 1634 }
d02b48c6 1635 s/^CFLAG=.*$/CFLAG= $cflags/;
7a762197 1636 s/^DEPFLAG=.*$/DEPFLAG=$depflags/;
d6c76457 1637 s/^PEX_LIBS=.*$/PEX_LIBS= $prelflags/;
d02b48c6 1638 s/^EX_LIBS=.*$/EX_LIBS= $lflags/;
967d95f0 1639 s/^EXE_EXT=.*$/EXE_EXT= $exe_ext/;
14e21f86 1640 s/^CPUID_OBJ=.*$/CPUID_OBJ= $cpuid_obj/;
06287285 1641 s/^BN_ASM=.*$/BN_ASM= $bn_obj/;
6019cdd3 1642 s/^EC_ASM=.*$/EC_ASM= $ec_obj/;
d02b48c6 1643 s/^DES_ENC=.*$/DES_ENC= $des_obj/;
0ddd3ea2 1644 s/^AES_ENC=.*$/AES_ENC= $aes_obj/;
d02b48c6 1645 s/^BF_ENC=.*$/BF_ENC= $bf_obj/;
58964a49
RE
1646 s/^CAST_ENC=.*$/CAST_ENC= $cast_obj/;
1647 s/^RC4_ENC=.*$/RC4_ENC= $rc4_obj/;
1648 s/^RC5_ENC=.*$/RC5_ENC= $rc5_obj/;
1649 s/^MD5_ASM_OBJ=.*$/MD5_ASM_OBJ= $md5_obj/;
1650 s/^SHA1_ASM_OBJ=.*$/SHA1_ASM_OBJ= $sha1_obj/;
1651 s/^RMD160_ASM_OBJ=.*$/RMD160_ASM_OBJ= $rmd160_obj/;
ed26604a 1652 s/^WP_ASM_OBJ=.*$/WP_ASM_OBJ= $wp_obj/;
6a8517f2 1653 s/^CMLL_ENC=.*$/CMLL_ENC= $cmll_obj/;
8a1c92ce 1654 s/^MODES_ASM_OBJ.=*$/MODES_ASM_OBJ= $modes_obj/;
22c2e80f
AP
1655 s/^CHACHA_ENC=.*$/CHACHA_ENC= $chacha_obj/;
1656 s/^POLY1305_ASM_OBJ=.*$/POLY1305_ASM_OBJ= $poly1305_obj/;
ed28aef8 1657 s/^ENGINES_ASM_OBJ.=*$/ENGINES_ASM_OBJ= $engines_obj/;
fa8e921f 1658 s/^PERLASM_SCHEME=.*$/PERLASM_SCHEME= $perlasm_scheme/;
2613c1fa 1659 s/^PROCESSOR=.*/PROCESSOR= $processor/;
179add2b 1660 s/^ARFLAGS=.*/ARFLAGS= $arflags/;
99aab161 1661 s/^PERL=.*/PERL= $perl/;
ad2695b1
DSH
1662 s/^LIBZLIB=.*/LIBZLIB=$withargs{"zlib-lib"}/;
1663 s/^ZLIB_INCLUDE=.*/ZLIB_INCLUDE=$withargs{"zlib-include"}/;
1ab2f7f1 1664 s/^FIPSLIBDIR=.*/FIPSLIBDIR=$fipslibdir/;
d47d0d2b
DSH
1665 s/^FIPSCANLIB=.*/FIPSCANLIB=libcrypto/ if $fips;
1666 s/^SHARED_FIPS=.*/SHARED_FIPS=/;
1667 s/^SHLIBDIRS=.*/SHLIBDIRS= crypto ssl/;
1ab2f7f1 1668 s/^BASEADDR=.*/BASEADDR=$baseaddr/;
b436a982 1669 s/^SHLIB_TARGET=.*/SHLIB_TARGET=$shared_target/;
a22fb399
RL
1670 s/^SHLIB_MARK=.*/SHLIB_MARK=$shared_mark/;
1671 s/^SHARED_LIBS=.*/SHARED_LIBS=\$(SHARED_CRYPTO) \$(SHARED_SSL)/ if (!$no_shared);
0fd44e2d
RL
1672 if ($shared_extension ne "" && $shared_extension =~ /^\.s([ol])\.[^\.]*$/)
1673 {
1674 my $sotmp = $1;
07c08ed4
RL
1675 s/^SHARED_LIBS_LINK_EXTS=.*/SHARED_LIBS_LINK_EXTS=.s$sotmp/;
1676 }
1677 elsif ($shared_extension ne "" && $shared_extension =~ /^\.[^\.]*\.dylib$/)
1678 {
1679 s/^SHARED_LIBS_LINK_EXTS=.*/SHARED_LIBS_LINK_EXTS=.dylib/;
0fd44e2d
RL
1680 }
1681 elsif ($shared_extension ne "" && $shared_extension =~ /^\.s([ol])\.[^\.]*\.[^\.]*$/)
1682 {
1683 my $sotmp = $1;
1684 s/^SHARED_LIBS_LINK_EXTS=.*/SHARED_LIBS_LINK_EXTS=.s$sotmp.\$(SHLIB_MAJOR) .s$sotmp/;
1685 }
07c08ed4
RL
1686 elsif ($shared_extension ne "" && $shared_extension =~ /^\.[^\.]*\.[^\.]*\.dylib$/)
1687 {
1688 s/^SHARED_LIBS_LINK_EXTS=.*/SHARED_LIBS_LINK_EXTS=.\$(SHLIB_MAJOR).dylib .dylib/;
1689 }
a5595fde 1690 s/^SHARED_LDFLAGS=.*/SHARED_LDFLAGS=$shared_ldflag/;
d02b48c6
RE
1691 print OUT $_."\n";
1692 }
1693close(IN);
1694close(OUT);
d10dac11 1695rename($Makefile,"$Makefile.orig") || die "unable to rename $Makefile\n" if -e $Makefile;
c2aa4f20 1696rename("$Makefile.new",$Makefile) || die "unable to rename $Makefile.new\n";
f2d4be3b 1697
58964a49
RE
1698print "CC =$cc\n";
1699print "CFLAG =$cflags\n";
1700print "EX_LIBS =$lflags\n";
b7efa56a 1701print "CPUID_OBJ =$cpuid_obj\n";
06287285 1702print "BN_ASM =$bn_obj\n";
6019cdd3 1703print "EC_ASM =$ec_obj\n";
58964a49 1704print "DES_ENC =$des_obj\n";
0ddd3ea2 1705print "AES_ENC =$aes_obj\n";
58964a49
RE
1706print "BF_ENC =$bf_obj\n";
1707print "CAST_ENC =$cast_obj\n";
1708print "RC4_ENC =$rc4_obj\n";
1709print "RC5_ENC =$rc5_obj\n";
1710print "MD5_OBJ_ASM =$md5_obj\n";
1711print "SHA1_OBJ_ASM =$sha1_obj\n";
1712print "RMD160_OBJ_ASM=$rmd160_obj\n";
8a1c92ce
AP
1713print "CMLL_ENC =$cmll_obj\n";
1714print "MODES_OBJ =$modes_obj\n";
ed28aef8 1715print "ENGINES_OBJ =$engines_obj\n";
22c2e80f
AP
1716print "CHACHA_ENC =$chacha_obj\n";
1717print "POLY1305_OBJ =$poly1305_obj\n";
2613c1fa 1718print "PROCESSOR =$processor\n";
99aab161 1719print "RANLIB =$ranlib\n";
179add2b 1720print "ARFLAGS =$arflags\n";
99aab161 1721print "PERL =$perl\n";
d02b48c6 1722
1641cb60
BL
1723my $des_ptr=0;
1724my $des_risc1=0;
1725my $des_risc2=0;
1726my $des_unroll=0;
1727my $bn_ll=0;
1728my $def_int=2;
1729my $rc4_int=$def_int;
1730my $md2_int=$def_int;
1731my $idea_int=$def_int;
1732my $rc2_int=$def_int;
1733my $rc4_idx=0;
2dae04d0 1734my $rc4_chunk=0;
1641cb60
BL
1735my $bf_ptr=0;
1736my @type=("char","short","int","long");
1737my ($b64l,$b64,$b32,$b16,$b8)=(0,0,1,0,0);
62dc5aad 1738my $export_var_as_fn=0;
1641cb60
BL
1739
1740my $des_int;
d02b48c6
RE
1741
1742foreach (sort split(/\s+/,$bn_ops))
1743 {
1744 $des_ptr=1 if /DES_PTR/;
1745 $des_risc1=1 if /DES_RISC1/;
1746 $des_risc2=1 if /DES_RISC2/;
1747 $des_unroll=1 if /DES_UNROLL/;
1748 $des_int=1 if /DES_INT/;
1749 $bn_ll=1 if /BN_LLONG/;
1750 $rc4_int=0 if /RC4_CHAR/;
1751 $rc4_int=3 if /RC4_LONG/;
1752 $rc4_idx=1 if /RC4_INDEX/;
2dae04d0
AP
1753 $rc4_chunk=1 if /RC4_CHUNK/;
1754 $rc4_chunk=2 if /RC4_CHUNK_LL/;
d02b48c6
RE
1755 $md2_int=0 if /MD2_CHAR/;
1756 $md2_int=3 if /MD2_LONG/;
1757 $idea_int=1 if /IDEA_SHORT/;
1758 $idea_int=3 if /IDEA_LONG/;
1759 $rc2_int=1 if /RC2_SHORT/;
1760 $rc2_int=3 if /RC2_LONG/;
1761 $bf_ptr=1 if $_ eq "BF_PTR";
1762 $bf_ptr=2 if $_ eq "BF_PTR2";
d02b48c6 1763 ($b64l,$b64,$b32,$b16,$b8)=(0,1,0,0,0) if /SIXTY_FOUR_BIT/;
58964a49 1764 ($b64l,$b64,$b32,$b16,$b8)=(1,0,0,0,0) if /SIXTY_FOUR_BIT_LONG/;
d02b48c6
RE
1765 ($b64l,$b64,$b32,$b16,$b8)=(0,0,1,0,0) if /THIRTY_TWO_BIT/;
1766 ($b64l,$b64,$b32,$b16,$b8)=(0,0,0,1,0) if /SIXTEEN_BIT/;
1767 ($b64l,$b64,$b32,$b16,$b8)=(0,0,0,0,1) if /EIGHT_BIT/;
62dc5aad 1768 $export_var_as_fn=1 if /EXPORT_VAR_AS_FN/;
d02b48c6
RE
1769 }
1770
8e10f2b3 1771open(IN,'<crypto/opensslconf.h.in') || die "unable to read crypto/opensslconf.h.in:$!\n";
dee502be
RL
1772unlink("include/openssl/opensslconf.h.new") || die "unable to remove old include/openssl/opensslconf.h.new:$!\n" if -e "include/openssl/opensslconf.h.new";
1773open(OUT,'>include/openssl/opensslconf.h.new') || die "unable to create include/openssl/opensslconf.h.new:$!\n";
26dc267f 1774print OUT "/* opensslconf.h */\n";
fb044c59 1775print OUT "/* WARNING: Generated automatically from opensslconf.h.in by Configure. */\n\n";
26dc267f 1776
17e80c6b
RS
1777print OUT "#ifdef __cplusplus\n";
1778print OUT "extern \"C\" {\n";
1779print OUT "#endif\n";
26dc267f 1780print OUT "/* OpenSSL was configured with the following options: */\n";
98186eb4
VD
1781
1782my $openssl_api_defines = "";
1783if (defined($api)) {
1784 $openssl_api_defines = sprintf "#define OPENSSL_MIN_API %s\n", $apitable->{$api};
1785}
5031a89d 1786my $openssl_algorithm_defines_trans = $openssl_algorithm_defines;
7a762197 1787$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 1788$openssl_algorithm_defines_trans =~ s/^\s*#\s*define\s+OPENSSL_(.*)/# if defined(OPENSSL_$1) \&\& !defined($1)\n# define $1\n# endif/mg;
cf1b7d96 1789$openssl_algorithm_defines =~ s/^\s*#\s*define\s+(.*)/#ifndef $1\n# define $1\n#endif/mg;
fb77c6fb 1790$openssl_algorithm_defines = " /* no ciphers excluded */\n" if $openssl_algorithm_defines eq "";
cf1b7d96
RL
1791$openssl_thread_defines =~ s/^\s*#\s*define\s+(.*)/#ifndef $1\n# define $1\n#endif/mg;
1792$openssl_sys_defines =~ s/^\s*#\s*define\s+(.*)/#ifndef $1\n# define $1\n#endif/mg;
1793$openssl_other_defines =~ s/^\s*#\s*define\s+(.*)/#ifndef $1\n# define $1\n#endif/mg;
98186eb4 1794
cf1b7d96 1795print OUT $openssl_sys_defines;
75e98d05 1796print OUT "#ifndef OPENSSL_DOING_MAKEDEPEND\n\n";
7a762197 1797print OUT $openssl_experimental_defines;
98186eb4 1798print OUT $openssl_api_defines;
7a762197 1799print OUT "\n";
cf1b7d96 1800print OUT $openssl_algorithm_defines;
7a762197 1801print OUT "\n#endif /* OPENSSL_DOING_MAKEDEPEND */\n\n";
cf1b7d96
RL
1802print OUT $openssl_thread_defines;
1803print OUT $openssl_other_defines,"\n";
26dc267f 1804
5031a89d
RL
1805print OUT "/* The OPENSSL_NO_* macros are also defined as NO_* if the application\n";
1806print OUT " asks for it. This is a transient feature that is provided for those\n";
1807print OUT " who haven't had the time to do the appropriate changes in their\n";
1808print OUT " applications. */\n";
1809print OUT "#ifdef OPENSSL_ALGORITHM_DEFINES\n";
1810print OUT $openssl_algorithm_defines_trans;
1811print OUT "#endif\n\n";
1812
b2dba9bf 1813print OUT "#define OPENSSL_CPUID_OBJ\n\n" if ($cpuid_obj ne "mem_clr.o");
ebaec63e 1814
d02b48c6
RE
1815while (<IN>)
1816 {
cd46aa4a 1817 if (/^#define\s+OPENSSLDIR/)
f9afd9f8
GT
1818 {
1819 my $foo = $openssldir;
1820 $foo =~ s/\\/\\\\/g;
1821 print OUT "#define OPENSSLDIR \"$foo\"\n";
1822 }
90819805 1823 elsif (/^#define\s+ENGINESDIR/)
f9afd9f8 1824 {
6a9d28f9 1825 my $foo = "$prefix/$libdir/engines";
f9afd9f8
GT
1826 $foo =~ s/\\/\\\\/g;
1827 print OUT "#define ENGINESDIR \"$foo\"\n";
1828 }
62dc5aad
RL
1829 elsif (/^#((define)|(undef))\s+OPENSSL_EXPORT_VAR_AS_FUNCTION/)
1830 { printf OUT "#undef OPENSSL_EXPORT_VAR_AS_FUNCTION\n"
1831 if $export_var_as_fn;
1832 printf OUT "#%s OPENSSL_EXPORT_VAR_AS_FUNCTION\n",
1833 ($export_var_as_fn)?"define":"undef"; }
e766a681
BM
1834 elsif (/^#define\s+OPENSSL_UNISTD/)
1835 {
1836 $unistd = "<unistd.h>" if $unistd eq "";
1837 print OUT "#define OPENSSL_UNISTD $unistd\n";
1838 }
462ba4f6 1839 elsif (/^#((define)|(undef))\s+SIXTY_FOUR_BIT_LONG/)
d02b48c6
RE
1840 { printf OUT "#%s SIXTY_FOUR_BIT_LONG\n",($b64l)?"define":"undef"; }
1841 elsif (/^#((define)|(undef))\s+SIXTY_FOUR_BIT/)
1842 { printf OUT "#%s SIXTY_FOUR_BIT\n",($b64)?"define":"undef"; }
1843 elsif (/^#((define)|(undef))\s+THIRTY_TWO_BIT/)
1844 { printf OUT "#%s THIRTY_TWO_BIT\n",($b32)?"define":"undef"; }
1845 elsif (/^#((define)|(undef))\s+SIXTEEN_BIT/)
1846 { printf OUT "#%s SIXTEEN_BIT\n",($b16)?"define":"undef"; }
1847 elsif (/^#((define)|(undef))\s+EIGHT_BIT/)
1848 { printf OUT "#%s EIGHT_BIT\n",($b8)?"define":"undef"; }
1849 elsif (/^#((define)|(undef))\s+BN_LLONG\s*$/)
1850 { printf OUT "#%s BN_LLONG\n",($bn_ll)?"define":"undef"; }
bdb1d0c2
VD
1851 elsif (/^\#define\s+OSSL_DES_LONG\s+.*/)
1852 { printf OUT "#define OSSL_DES_LONG unsigned %s\n",
d02b48c6 1853 ($des_int)?'int':'long'; }
8e10f2b3 1854 elsif (/^\#(define|undef)\s+DES_PTR/)
d02b48c6
RE
1855 { printf OUT "#%s DES_PTR\n",($des_ptr)?'define':'undef'; }
1856 elsif (/^\#(define|undef)\s+DES_RISC1/)
1857 { printf OUT "#%s DES_RISC1\n",($des_risc1)?'define':'undef'; }
1858 elsif (/^\#(define|undef)\s+DES_RISC2/)
1859 { printf OUT "#%s DES_RISC2\n",($des_risc2)?'define':'undef'; }
1860 elsif (/^\#(define|undef)\s+DES_UNROLL/)
1861 { printf OUT "#%s DES_UNROLL\n",($des_unroll)?'define':'undef'; }
8e10f2b3 1862 elsif (/^#define\s+RC4_INT\s/)
d02b48c6 1863 { printf OUT "#define RC4_INT unsigned %s\n",$type[$rc4_int]; }
2dae04d0
AP
1864 elsif (/^#undef\s+RC4_CHUNK/)
1865 {
1866 printf OUT "#undef RC4_CHUNK\n" if $rc4_chunk==0;
1867 printf OUT "#define RC4_CHUNK unsigned long\n" if $rc4_chunk==1;
1868 printf OUT "#define RC4_CHUNK unsigned long long\n" if $rc4_chunk==2;
1869 }
8e10f2b3 1870 elsif (/^#((define)|(undef))\s+RC4_INDEX/)
d02b48c6 1871 { printf OUT "#%s RC4_INDEX\n",($rc4_idx)?"define":"undef"; }
8e7f966b 1872 elsif (/^#(define|undef)\s+I386_ONLY/)
c9a112f5 1873 { printf OUT "#%s I386_ONLY\n", ($processor eq "386")?
8e7f966b 1874 "define":"undef"; }
8e10f2b3 1875 elsif (/^#define\s+MD2_INT\s/)
d02b48c6 1876 { printf OUT "#define MD2_INT unsigned %s\n",$type[$md2_int]; }
8e10f2b3 1877 elsif (/^#define\s+IDEA_INT\s/)
d02b48c6 1878 {printf OUT "#define IDEA_INT unsigned %s\n",$type[$idea_int];}
8e10f2b3 1879 elsif (/^#define\s+RC2_INT\s/)
d02b48c6 1880 {printf OUT "#define RC2_INT unsigned %s\n",$type[$rc2_int];}
8e10f2b3 1881 elsif (/^#(define|undef)\s+BF_PTR/)
d02b48c6
RE
1882 {
1883 printf OUT "#undef BF_PTR\n" if $bf_ptr == 0;
1884 printf OUT "#define BF_PTR\n" if $bf_ptr == 1;
1885 printf OUT "#define BF_PTR2\n" if $bf_ptr == 2;
8e10f2b3 1886 }
d02b48c6
RE
1887 else
1888 { print OUT $_; }
1889 }
5dfc369f 1890close(IN);
17e80c6b
RS
1891print OUT "#ifdef __cplusplus\n";
1892print OUT "}\n";
1893print OUT "#endif\n";
5dfc369f 1894close(OUT);
dee502be
RL
1895rename("include/openssl/opensslconf.h","include/openssl/opensslconf.h.bak") || die "unable to rename include/openssl/opensslconf.h\n" if -e "include/openssl/opensslconf.h";
1896rename("include/openssl/opensslconf.h.new","include/openssl/opensslconf.h") || die "unable to rename include/openssl/opensslconf.h.new\n";
9becf666 1897
e766a681 1898
9becf666
DSH
1899# Fix the date
1900
d02b48c6
RE
1901print "SIXTY_FOUR_BIT_LONG mode\n" if $b64l;
1902print "SIXTY_FOUR_BIT mode\n" if $b64;
1903print "THIRTY_TWO_BIT mode\n" if $b32;
1904print "SIXTEEN_BIT mode\n" if $b16;
1905print "EIGHT_BIT mode\n" if $b8;
1906print "DES_PTR used\n" if $des_ptr;
1907print "DES_RISC1 used\n" if $des_risc1;
1908print "DES_RISC2 used\n" if $des_risc2;
1909print "DES_UNROLL used\n" if $des_unroll;
1910print "DES_INT used\n" if $des_int;
1911print "BN_LLONG mode\n" if $bn_ll;
1912print "RC4 uses u$type[$rc4_int]\n" if $rc4_int != $def_int;
1913print "RC4_INDEX mode\n" if $rc4_idx;
2dae04d0
AP
1914print "RC4_CHUNK is undefined\n" if $rc4_chunk==0;
1915print "RC4_CHUNK is unsigned long\n" if $rc4_chunk==1;
1916print "RC4_CHUNK is unsigned long long\n" if $rc4_chunk==2;
d02b48c6
RE
1917print "MD2 uses u$type[$md2_int]\n" if $md2_int != $def_int;
1918print "IDEA uses u$type[$idea_int]\n" if $idea_int != $def_int;
1919print "RC2 uses u$type[$rc2_int]\n" if $rc2_int != $def_int;
fce0ba5f
FLM
1920print "BF_PTR used\n" if $bf_ptr == 1;
1921print "BF_PTR2 used\n" if $bf_ptr == 2;
cba5068d 1922
d10dac11
RS
1923# Copy all Makefile.in to Makefile (except top-level)
1924use File::Find;
1925use IO::File;
1926find(sub {
1927 return if ($_ ne "Makefile.in" || $File::Find::dir eq ".");
1928 my $in = IO::File->new($_, "r") or
1929 die sprintf "Error reading Makefile.in in %s: !$\n",
1930 $File::Find::dir;
1931 my $out = IO::File->new("Makefile", "w") or
1932 die sprintf "Error writing Makefile in %s: !$\n",
1933 $File::Find::dir;
1934 print $out "# Generated from $_, do not edit\n";
1935 while (my $line = <$in>) { print $out $line }
1936 $in->close() or
1937 die sprintf "Error reading Makefile.in in %s: !$\n",
1938 $File::Find::dir;
1939 $out->close() or
ef30a684 1940 die sprintf "Error writing Makefile in %s: !$\n",
d10dac11
RS
1941 $File::Find::dir;
1942 }, ".");
1943
fd9ad230
RL
1944{
1945 my $perlguess = $perl =~ m@^/@ ? $perl : '/usr/local/bin/perl';
1946
1947 &dofile("tools/c_rehash",$perlguess,
1948 '^#!/' => '#!%s',
1949 '^my \$dir;$' => 'my $dir = "' . $openssldir . '";',
1950 '^my \$prefix;$' => 'my $prefix = "' . $prefix . '";');
1951 &dofile("apps/CA.pl",$perl,
1952 '^#!/' => '#!%s');
1953}
4d8743f4 1954if($IsMK1MF) {
664b9985 1955 open (OUT,">crypto/buildinf.h") || die "Can't open buildinf.h";
76ffb43d 1956 printf OUT <<"EOF";
57119943
BM
1957#ifndef MK1MF_BUILD
1958 /* auto-generated by Configure for crypto/cversion.c:
1959 * for Unix builds, crypto/Makefile.ssl generates functional definitions;
1960 * Windows builds (and other mk1mf builds) compile cversion.c with
1961 * -DMK1MF_BUILD and use definitions added to this file by util/mk1mf.pl. */
1962 #error "Windows builds (PLATFORM=$target) use mk1mf.pl-created Makefiles"
1963#endif
9e935d7e 1964EOF
8e10f2b3 1965 close(OUT);
a1e464f9 1966} else {
dafd8333 1967 my $make_command = "$make PERL=\'$perl\'";
451dc18f 1968 my $make_targets = "";
ab185b60 1969 $make_targets .= " depend" if $depflags ne $default_depflags && $make_depend;
cde8ad1a 1970 (system $make_command.$make_targets) == 0 or die "make $make_targets failed"
451dc18f 1971 if $make_targets ne "";
78c990c1 1972 if ($depflags ne $default_depflags && !$make_depend) {
2e31ef03
RS
1973 $warn_make_depend++;
1974 }
8e10f2b3
UM
1975}
1976
fc6a6a10 1977# create the ms/version32.rc file if needed
eef0c1f3 1978if ($IsMK1MF && ($target !~ /^netware/)) {
fc6a6a10 1979 my ($v1, $v2, $v3, $v4);
85d7bdf0 1980 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
1981 $v1=hex $1;
1982 $v2=hex $2;
1983 $v3=hex $3;
1984 $v4=hex $4;
1985 }
1986 open (OUT,">ms/version32.rc") || die "Can't open ms/version32.rc";
76ffb43d 1987 print OUT <<"EOF";
fc6a6a10
DSH
1988#include <winver.h>
1989
1990LANGUAGE 0x09,0x01
1991
19921 VERSIONINFO
1993 FILEVERSION $v1,$v2,$v3,$v4
1994 PRODUCTVERSION $v1,$v2,$v3,$v4
1995 FILEFLAGSMASK 0x3fL
1996#ifdef _DEBUG
1997 FILEFLAGS 0x01L
1998#else
1999 FILEFLAGS 0x00L
2000#endif
2001 FILEOS VOS__WINDOWS32
2002 FILETYPE VFT_DLL
2003 FILESUBTYPE 0x0L
2004BEGIN
2005 BLOCK "StringFileInfo"
2006 BEGIN
2007 BLOCK "040904b0"
2008 BEGIN
fce0ba5f 2009 // Required:
fc6a6a10
DSH
2010 VALUE "CompanyName", "The OpenSSL Project, http://www.openssl.org/\\0"
2011 VALUE "FileDescription", "OpenSSL Shared Library\\0"
2012 VALUE "FileVersion", "$version\\0"
2013#if defined(CRYPTO)
2014 VALUE "InternalName", "libeay32\\0"
2015 VALUE "OriginalFilename", "libeay32.dll\\0"
2016#elif defined(SSL)
2017 VALUE "InternalName", "ssleay32\\0"
2018 VALUE "OriginalFilename", "ssleay32.dll\\0"
a479d72d 2019#endif
fc6a6a10
DSH
2020 VALUE "ProductName", "The OpenSSL Toolkit\\0"
2021 VALUE "ProductVersion", "$version\\0"
2022 // Optional:
2023 //VALUE "Comments", "\\0"
51cbee35 2024 VALUE "LegalCopyright", "Copyright © 1998-2015 The OpenSSL Project. Copyright © 1995-1998 Eric A. Young, Tim J. Hudson. All rights reserved.\\0"
fc6a6a10
DSH
2025 //VALUE "LegalTrademarks", "\\0"
2026 //VALUE "PrivateBuild", "\\0"
2027 //VALUE "SpecialBuild", "\\0"
2028 END
2029 END
2030 BLOCK "VarFileInfo"
2031 BEGIN
2032 VALUE "Translation", 0x409, 0x4b0
2033 END
2034END
2035EOF
2036 close(OUT);
2037 }
fce0ba5f 2038
76ffb43d 2039print <<"EOF";
63d3f44a 2040
89ec98e0 2041Configured for $target.
63d3f44a 2042EOF
5f8d5c96 2043
76ffb43d 2044print <<"EOF" if (!$no_threads && !$threads);
5f8d5c96
BM
2045
2046The library could not be configured for supporting multi-threaded
2047applications as the compiler options required on this system are not known.
ff1b7e09 2048See file INSTALL for details if you need multi-threading.
ec577822
BM
2049EOF
2050
76ffb43d 2051print <<"EOF" if ($no_shared_warn);
2964ba8c 2052
2e31ef03
RS
2053You gave the option 'shared', which is not supported on this platform, so
2054we will pretend you gave the option 'no-shared'. If you know how to implement
2055shared libraries, please let us know (but please first make sure you have
2056tried with a current version of OpenSSL).
2057EOF
2058
76ffb43d 2059print <<"EOF" if ($warn_make_depend);
2e31ef03
RS
2060
2061*** Because of configuration changes, you MUST do the following before
2062*** building:
2063
2064 make depend
2964ba8c
RL
2065EOF
2066
d02b48c6
RE
2067exit(0);
2068
bd5192b1
RL
2069######################################################################
2070#
2071# Helpers and utility functions
2072#
2073
2074# Configuration file reading #########################################
2075
2076# Helper function to implement conditional inheritance depending on the
2077# value of $no_asm. Used in inherit_from values as follows:
2078#
2079# inherit_from => [ "template", asm("asm_tmpl") ]
2080#
2081sub asm {
2082 my @x = @_;
2083 sub {
2084 $no_asm ? () : @x;
2085 }
2086}
2087
2088# configuration reader, evaluates the input file as a perl script and expects
2089# it to fill %targets with target configurations. Those are then added to
2090# %table.
2091sub read_config {
2092 my $fname = shift;
2093 open(CONFFILE, "< $fname")
2094 or die "Can't open configuration file '$fname'!\n";
2095 my $x = $/;
2096 undef $/;
2097 my $content = <CONFFILE>;
2098 $/ = $x;
2099 close(CONFFILE);
2100 my %targets = ();
2101 {
2102 local %table = %::table; # Protect %table from tampering
2103
2104 eval $content;
2105 warn $@ if $@;
2106 }
2107
2108 # For each target, check that it's configured with a hash table.
2109 foreach (keys %targets) {
2110 if (ref($targets{$_}) ne "HASH") {
2111 if (ref($targets{$_}) eq "") {
2112 warn "Deprecated target configuration for $_, ignoring...\n";
2113 } else {
2114 warn "Misconfigured target configuration for $_ (should be a hash table), ignoring...\n";
2115 }
2116 delete $targets{$_};
2117 }
2118 }
2119
2120 %table = (%table, %targets);
2121
2122}
2123
2124# configuration resolver. Will only resolve all the lazy evalutation
2125# codeblocks for the chozen target and all those it inherits from,
2126# recursively
2127sub resolve_config {
2128 my $target = shift;
2129 my @breadcrumbs = @_;
2130
2131 if (grep { $_ eq $target } @breadcrumbs) {
2132 die "inherit_from loop! target backtrace:\n "
2133 ,$target,"\n ",join("\n ", @breadcrumbs),"\n";
2134 }
2135
2136 if (!defined($table{$target})) {
2137 warn "Warning! target $target doesn't exist!\n";
2138 return ();
2139 }
2140 # Recurse through all inheritances. They will be resolved on the
2141 # fly, so when this operation is done, they will all just be a
2142 # bunch of attributes with string values.
2143 # What we get here, though, are keys with references to lists of
2144 # the combined values of them all. We will deal with lists after
2145 # this stage is done.
2146 my %combined_inheritance = ();
2147 if ($table{$target}->{inherit_from}) {
2148 my @inherit_from =
2149 map { ref($_) eq "CODE" ? $_->() : $_ } @{$table{$target}->{inherit_from}};
2150 foreach (@inherit_from) {
2151 my %inherited_config = resolve_config($_, $target, @breadcrumbs);
2152
2153 # 'template' is a marker that's considered private to
2154 # the config that had it.
2155 delete $inherited_config{template};
2156
2157 map {
2158 if (!$combined_inheritance{$_}) {
2159 $combined_inheritance{$_} = [];
2160 }
2161 push @{$combined_inheritance{$_}}, $inherited_config{$_};
2162 } keys %inherited_config;
2163 }
2164 }
2165
2166 # We won't need inherit_from in this target any more, since we've
2167 # resolved all the inheritances that lead to this
2168 delete $table{$target}->{inherit_from};
2169
2170 # Now is the time to deal with those lists. Here's the place to
2171 # decide what shall be done with those lists, all based on the
2172 # values of the target we're currently dealing with.
2173 # - If a value is a coderef, it will be executed with the list of
2174 # inherited values as arguments.
2175 # - If the corresponding key doesn't have a value at all or is the
2176 # emoty string, the inherited value list will be run through the
2177 # default combiner (below), and the result becomes this target's
2178 # value.
2179 # - Otherwise, this target's value is assumed to be a string that
2180 # will simply override the inherited list of values.
2181 my $default_combiner = sub { join(' ',@_) };
2182
2183 my %all_keys =
2184 map { $_ => 1 } (keys %combined_inheritance,
2185 keys %{$table{$target}});
2186 foreach (sort keys %all_keys) {
2187
2188 # Current target doesn't have a value for the current key?
2189 # Assign it the default combiner, the rest of this loop body
2190 # will handle it just like any other coderef.
2191 if (!exists $table{$target}->{$_}) {
2192 $table{$target}->{$_} = $default_combiner;
2193 }
2194
2195 my $valuetype = ref($table{$target}->{$_});
2196 if ($valuetype eq "CODE") {
2197 # CODE reference, execute it with the inherited values as
2198 # arguments.
2199 $table{$target}->{$_} =
2200 $table{$target}->{$_}->(@{$combined_inheritance{$_}});
2201 } elsif ($valuetype eq "") {
2202 # Scalar, just leave it as is.
2203 } else {
2204 # Some other type of reference that we don't handle.
2205 # Better to abort at this point.
2206 die "cannot handle reference type $valuetype,"
2207 ," found in target $target -> $_\n";
2208 }
2209 }
2210
2211 # Finally done, return the result.
2212 return %{$table{$target}};
2213}
2214
462ba4f6 2215sub usage
d02b48c6 2216 {
462ba4f6 2217 print STDERR $usage;
10a926c1 2218 print STDERR "\npick os/compiler from:\n";
1641cb60 2219 my $j=0;
6457ad15 2220 my $i;
10a926c1 2221 my $k=0;
6457ad15 2222 foreach $i (sort keys %table)
d02b48c6 2223 {
bd5192b1 2224 next if $table{$i}->{template};
462ba4f6 2225 next if $i =~ /^debug/;
10a926c1
UM
2226 $k += length($i) + 1;
2227 if ($k > 78)
2228 {
2229 print STDERR "\n";
2230 $k=length($i);
2231 }
2232 print STDERR $i . " ";
462ba4f6
UM
2233 }
2234 foreach $i (sort keys %table)
2235 {
bd5192b1 2236 next if $table{$i}->{template};
462ba4f6 2237 next if $i !~ /^debug/;
10a926c1
UM
2238 $k += length($i) + 1;
2239 if ($k > 78)
2240 {
2241 print STDERR "\n";
2242 $k=length($i);
2243 }
2244 print STDERR $i . " ";
d02b48c6 2245 }
10a926c1 2246 print STDERR "\n\nNOTE: If in doubt, on Unix-ish systems use './config'.\n";
462ba4f6 2247 exit(1);
d02b48c6
RE
2248 }
2249
99aab161
UM
2250sub which
2251 {
2252 my($name)=@_;
2253 my $path;
2254 foreach $path (split /:/, $ENV{PATH})
2255 {
28a80034 2256 if (-f "$path/$name$exe_ext" and -x _)
99aab161 2257 {
28a80034
RL
2258 return "$path/$name$exe_ext" unless ($name eq "perl" and
2259 system("$path/$name$exe_ext -e " . '\'exit($]<5.0);\''));
99aab161
UM
2260 }
2261 }
2262 }
2263
462ba4f6
UM
2264sub dofile
2265 {
2266 my $f; my $p; my %m; my @a; my $k; my $ff;
2267 ($f,$p,%m)=@_;
2268
31ff97b2 2269 open(IN,"<$f.in") || open(IN,"<$f") || die "unable to open $f:$!\n";
462ba4f6
UM
2270 @a=<IN>;
2271 close(IN);
2272 foreach $k (keys %m)
2273 {
2274 grep(/$k/ && ($_=sprintf($m{$k}."\n",$p)),@a);
2275 }
863fe2ec 2276 open(OUT,">$f.new") || die "unable to open $f.new:$!\n";
462ba4f6
UM
2277 print OUT @a;
2278 close(OUT);
863fe2ec
BM
2279 rename($f,"$f.bak") || die "unable to rename $f\n" if -e $f;
2280 rename("$f.new",$f) || die "unable to rename $f.new\n";
462ba4f6 2281 }
436a376b
BM
2282
2283sub print_table_entry
2284 {
2285 my $target = shift;
bd5192b1 2286 my %target = resolve_config($target);
aaf878cc 2287 my $type = shift;
436a376b 2288
7d46b942 2289 # Don't print the templates
bd5192b1 2290 return if $target{template};
7d46b942 2291
aaf878cc 2292 if ($type eq "TABLE") {
76ffb43d 2293 print <<"EOF"
436a376b
BM
2294
2295*** $target
bd5192b1
RL
2296\$cc = $target{cc}
2297\$cflags = $target{cflags}
2298\$debug_cflags = $target{debug_cflags}
2299\$release_cflags = $target{release_cflags}
2300\$unistd = $target{unistd}
2301\$thread_cflag = $target{thread_cflag}
2302\$sys_id = $target{sys_id}
2303\$lflags = $target{lflags}
2304\$debug_lflags = $target{debug_lflags}
2305\$release_lflags = $target{release_lflags}
2306\$bn_ops = $target{bn_ops}
2307\$cpuid_obj = $target{cpuid_obj}
2308\$bn_obj = $target{bn_obj}
2309\$ec_obj = $target{ec_obj}
2310\$des_obj = $target{des_obj}
2311\$aes_obj = $target{aes_obj}
2312\$bf_obj = $target{bf_obj}
2313\$md5_obj = $target{md5_obj}
2314\$sha1_obj = $target{sha1_obj}
2315\$cast_obj = $target{cast_obj}
2316\$rc4_obj = $target{rc4_obj}
2317\$rmd160_obj = $target{rmd160_obj}
2318\$rc5_obj = $target{rc5_obj}
2319\$wp_obj = $target{wp_obj}
2320\$cmll_obj = $target{cmll_obj}
2321\$modes_obj = $target{modes_obj}
2322\$engines_obj = $target{engines_obj}
2323\$chacha_obj = $target{chacha_obj}
2324\$poly1305_obj = $target{poly1305_obj}
2325\$perlasm_scheme = $target{perlasm_scheme}
2326\$dso_scheme = $target{dso_scheme}
2327\$shared_target= $target{shared_target}
2328\$shared_cflag = $target{shared_cflag}
2329\$shared_ldflag = $target{shared_ldflag}
2330\$shared_extension = $target{shared_extension}
2331\$ranlib = $target{ranlib}
2332\$arflags = $target{arflags}
2333\$multilib = $target{multilib}
436a376b 2334EOF
aaf878cc
RL
2335 } elsif ($type eq "HASH") {
2336 my @sequence = (
2337 "cc",
2338 "cflags",
b1245529
RL
2339 "debug_cflags",
2340 "release_cflags",
aaf878cc
RL
2341 "unistd",
2342 "thread_cflag",
2343 "sys_id",
2344 "lflags",
b1245529
RL
2345 "debug_lflags",
2346 "release_lflags",
aaf878cc
RL
2347 "bn_ops",
2348 "cpuid_obj",
2349 "bn_obj",
2350 "ec_obj",
2351 "des_obj",
2352 "aes_obj",
2353 "bf_obj",
2354 "md5_obj",
2355 "sha1_obj",
2356 "cast_obj",
2357 "rc4_obj",
2358 "rmd160_obj",
2359 "rc5_obj",
2360 "wp_obj",
2361 "cmll_obj",
2362 "modes_obj",
2363 "engines_obj",
22c2e80f
AP
2364 "chacha_obj",
2365 "poly1305_obj",
aaf878cc
RL
2366 "perlasm_scheme",
2367 "dso_scheme",
2368 "shared_target",
2369 "shared_cflag",
2370 "shared_ldflag",
2371 "shared_extension",
2372 "ranlib",
2373 "arflags",
2374 "multilib",
2375 );
2376 my $largest =
2377 length((sort { length($a) <=> length($b) } @sequence)[-1]);
2378 print " '$target' => {\n";
2379 foreach (@sequence) {
bd5192b1
RL
2380 if ($target{$_}) {
2381 print " '",$_,"'"," " x ($largest - length($_))," => '",$target{$_},"',\n";
aaf878cc
RL
2382 }
2383 }
2384 print " },\n";
2385 }
436a376b 2386 }