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