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