2 eval 'exec perl -S $0 ${1+"$@"}'
3 if $running_under_some_shell;
5 ## Configure -- OpenSSL source tree configuration script
6 ## If editing this file, run this command before committing
7 ## make -f Makefile.org TABLE
13 use File::Spec::Functions;
15 # see INSTALL for instructions.
17 my $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-krb5] [sctp] [386] [--prefix=DIR] [--openssldir=OPENSSLDIR] [--with-xxx[=vvv]] [--test-sanity] [--config=FILE] os/compiler[:flags]\n";
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.
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)
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".
33 # --with-krb5-dir Declare where Kerberos 5 lives. The libraries are expected
34 # to live in the subdirectory lib/ and the header files in
35 # include/. A value is required.
36 # --with-krb5-lib Declare where the Kerberos 5 libraries live. A value is
38 # (Default: KRB5_DIR/lib)
39 # --with-krb5-include Declare where the Kerberos 5 header files live. A
41 # (Default: KRB5_DIR/include)
42 # --with-krb5-flavor Declare what flavor of Kerberos 5 is used. Currently
43 # supported values are "MIT" and "Heimdal". A value is required.
45 # --test-sanity Make a number of sanity checks on the data in this file.
46 # This is a debugging tool for OpenSSL developers.
48 # --cross-compile-prefix Add specified prefix to binutils components.
50 # no-hw-xxx do not compile support for specific crypto hardware.
51 # Generic OpenSSL-style methods relating to this support
52 # are always compiled but return NULL if the hardware
53 # support isn't compiled.
54 # no-hw do not compile support for any crypto hardware.
55 # [no-]threads [don't] try to create a library that is suitable for
56 # multithreaded applications (default is "threads" if we
58 # [no-]shared [don't] try to create shared libraries when supported.
59 # no-asm do not use assembler
60 # no-dso do not compile in any native shared-library methods. This
61 # will ensure that all methods just return NULL.
62 # no-krb5 do not compile in any KRB5 library or code.
63 # [no-]zlib [don't] compile support for zlib compression.
64 # zlib-dynamic Like "zlib", but the zlib library is expected to be a shared
65 # library and will be loaded in run-time by the OpenSSL library.
66 # sctp include SCTP support
67 # 386 generate 80386 code
68 # no-sse2 disables IA-32 SSE2 code, above option implies no-sse2
69 # no-<cipher> build without specified algorithm (rsa, idea, rc5, ...)
70 # -<xxx> +<xxx> compiler options are passed through
72 # DEBUG_SAFESTACK use type-safe stacks to enforce type-safety on stack items
73 # provided to stack calls. Generates unique stack functions for
74 # each possible stack type.
75 # DES_PTR use pointer lookup vs arrays in the DES in crypto/des/des_locl.h
76 # DES_RISC1 use different DES_ENCRYPT macro that helps reduce register
77 # dependancies but needs to more registers, good for RISC CPU's
78 # DES_RISC2 A different RISC variant.
79 # DES_UNROLL unroll the inner DES loop, sometimes helps, somtimes hinders.
80 # DES_INT use 'int' instead of 'long' for DES_LONG in crypto/des/des.h
81 # This is used on the DEC Alpha where long is 8 bytes
83 # BN_LLONG use the type 'long long' in crypto/bn/bn.h
84 # MD2_CHAR use 'char' instead of 'int' for MD2_INT in crypto/md2/md2.h
85 # MD2_LONG use 'long' instead of 'int' for MD2_INT in crypto/md2/md2.h
86 # IDEA_SHORT use 'short' instead of 'int' for IDEA_INT in crypto/idea/idea.h
87 # IDEA_LONG use 'long' instead of 'int' for IDEA_INT in crypto/idea/idea.h
88 # RC2_SHORT use 'short' instead of 'int' for RC2_INT in crypto/rc2/rc2.h
89 # RC2_LONG use 'long' instead of 'int' for RC2_INT in crypto/rc2/rc2.h
90 # RC4_CHAR use 'char' instead of 'int' for RC4_INT in crypto/rc4/rc4.h
91 # RC4_LONG use 'long' instead of 'int' for RC4_INT in crypto/rc4/rc4.h
92 # RC4_INDEX define RC4_INDEX in crypto/rc4/rc4_locl.h. This turns on
93 # array lookups instead of pointer use.
94 # RC4_CHUNK enables code that handles data aligned at long (natural CPU
96 # RC4_CHUNK_LL enables code that handles data aligned at long long boundary
97 # (intended for 64-bit CPUs running 32-bit OS).
98 # BF_PTR use 'pointer arithmatic' for Blowfish (unsafe on Alpha).
99 # BF_PTR2 intel specific version (generic version is more efficient).
101 # Following are set automatically by this script
103 # MD5_ASM use some extra md5 assember,
104 # SHA1_ASM use some extra sha1 assember, must define L_ENDIAN for x86
105 # RMD160_ASM use some extra ripemd160 assember,
106 # SHA256_ASM sha256_block is implemented in assembler
107 # SHA512_ASM sha512_block is implemented in assembler
108 # AES_ASM ASE_[en|de]crypt is implemented in assembler
110 # Minimum warning options... any contributions to OpenSSL should at least get
113 my $gcc_devteam_warn = "-Wall -pedantic -DPEDANTIC -Wno-long-long -Wsign-compare -Wmissing-prototypes -Wshadow -Wformat -Werror -DCRYPTO_MDEBUG_ALL -DCRYPTO_MDEBUG_ABORT -DREF_CHECK";
115 my $clang_disabled_warnings = "-Wno-language-extension-token -Wno-extended-offsetof -Wno-padded -Wno-shorten-64-to-32 -Wno-format-nonliteral -Wno-missing-noreturn -Wno-unused-parameter -Wno-sign-conversion -Wno-unreachable-code -Wno-conversion -Wno-documentation -Wno-missing-variable-declarations -Wno-cast-align -Wno-incompatible-pointer-types-discards-qualifiers -Wno-missing-variable-declarations -Wno-missing-field-initializers -Wno-unused-macros -Wno-disabled-macro-expansion -Wno-conditional-uninitialized -Wno-switch-enum";
117 my $strict_warnings = 0;
119 my $x86_gcc_des="DES_PTR DES_RISC1 DES_UNROLL";
121 # MD2_CHAR slags pentium pros
122 my $x86_gcc_opts="RC4_INDEX MD2_INT";
124 # MODIFY THESE PARAMETERS IF YOU ARE GOING TO USE THE 'util/speed.sh SCRIPT
125 # Don't worry about these normally
128 my $tflags="-fast -Xa";
130 my $tlib="-lnsl -lsocket";
131 #$bits1="SIXTEEN_BIT ";
132 #$bits2="THIRTY_TWO_BIT ";
133 my $bits1="THIRTY_TWO_BIT ";
134 my $bits2="SIXTY_FOUR_BIT ";
136 my $x86_asm="x86cpuid.o:bn-586.o co-586.o x86-mont.o x86-gf2m.o:ecp_nistz256.o ecp_nistz256-x86.o:des-586.o crypt586.o:aes-586.o vpaes-x86.o aesni-x86.o:bf-586.o:md5-586.o:sha1-586.o sha256-586.o sha512-586.o:cast-586.o:rc4-586.o:rmd-586.o:rc5-586.o:wp_block.o wp-mmx.o:cmll-x86.o:ghash-x86.o:e_padlock-x86.o";
137 my $x86_asm_nocast=$x86_asm;$x86_asm_nocast=~s/cast\-586\.o//;
139 my $x86_elf_asm="$x86_asm:elf";
140 my $android_x86_elf_asm="$x86_asm:android";
142 my $x86_64_asm="x86_64cpuid.o: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:ecp_nistz256.o ecp_nistz256-x86_64.o::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::md5-x86_64.o:sha1-x86_64.o sha256-x86_64.o sha512-x86_64.o sha1-mb-x86_64.o sha256-mb-x86_64.o::rc4-x86_64.o rc4-md5-x86_64.o:::wp-x86_64.o:cmll-x86_64.o cmll_misc.o:ghash-x86_64.o aesni-gcm-x86_64.o:e_padlock-x86_64.o";
143 my $win_x86_64_asm=$x86_asm;$win_x86_64_asm=~s/x86_64-gcc\.o/bn_asm.o/;
144 my $ia64_asm="ia64cpuid.o:bn-ia64.o ia64-mont.o:::aes_core.o aes_cbc.o aes-ia64.o::md5-ia64.o:sha1-ia64.o sha256-ia64.o sha512-ia64.o::rc4-ia64.o rc4_skey.o:::::ghash-ia64.o::void";
145 my $sparcv9_asm="sparcv9cap.o sparccpuid.o:bn-sparcv9.o sparcv9-mont.o sparcv9a-mont.o vis3-mont.o sparct4-mont.o sparcv9-gf2m.o::des_enc-sparc.o fcrypt_b.o dest4-sparcv9.o:aes_core.o aes_cbc.o aes-sparcv9.o aest4-sparcv9.o::md5-sparcv9.o:sha1-sparcv9.o sha256-sparcv9.o sha512-sparcv9.o::::::camellia.o cmll_misc.o cmll_cbc.o cmllt4-sparcv9.o:ghash-sparcv9.o::void";
146 my $sparcv8_asm=":sparcv8.o::des_enc-sparc.o fcrypt_b.o:::::::::::::void";
147 my $alpha_asm="alphacpuid.o:bn_asm.o alpha-mont.o::::::sha1-alpha.o:::::::ghash-alpha.o::void";
148 my $mips64_asm=":bn-mips.o mips-mont.o:::aes_cbc.o aes-mips.o:::sha1-mips.o sha256-mips.o sha512-mips.o::::::::";
149 my $mips32_asm=$mips64_asm; $mips32_asm =~ s/\s*sha512\-mips\.o//;
150 my $s390x_asm="s390xcap.o s390xcpuid.o:bn-s390x.o s390x-mont.o s390x-gf2m.o:::aes-s390x.o aes-ctr.o aes-xts.o:::sha1-s390x.o sha256-s390x.o sha512-s390x.o::rc4-s390x.o:::::ghash-s390x.o:";
151 my $s390x_32_asm=$s390x_asm;$s390x_32_asm=~s/bn\-s390x\.o/bn_asm.o/;
152 my $armv4_asm="armcap.o armv4cpuid.o:bn_asm.o armv4-mont.o armv4-gf2m.o:ecp_nistz256.o ecp_nistz256-armv4.o::aes_cbc.o aes-armv4.o bsaes-armv7.o aesv8-armx.o:::sha1-armv4-large.o sha256-armv4.o sha512-armv4.o:::::::ghash-armv4.o ghashv8-armx.o::void";
153 my $aarch64_asm="armcap.o arm64cpuid.o mem_clr.o::::aes_core.o aes_cbc.o aesv8-armx.o:::sha1-armv8.o sha256-armv8.o sha512-armv8.o:::::::ghashv8-armx.o:";
154 my $parisc11_asm="pariscid.o:bn_asm.o parisc-mont.o:::aes_core.o aes_cbc.o aes-parisc.o:::sha1-parisc.o sha256-parisc.o sha512-parisc.o::rc4-parisc.o:::::ghash-parisc.o::32";
155 my $parisc20_64_asm="pariscid.o:pa-risc2W.o parisc-mont.o:::aes_core.o aes_cbc.o aes-parisc.o:::sha1-parisc.o sha256-parisc.o sha512-parisc.o::rc4-parisc.o:::::ghash-parisc.o::64";
156 my $parisc20_32_asm=$parisc20_64_asm;$parisc20_32_asm=~s/2W\./2\./;$parisc20_32_asm=~s/:64/:32/;
157 my $ppc64_asm="ppccpuid.o ppccap.o:bn-ppc.o ppc-mont.o ppc64-mont.o:::aes_core.o aes_cbc.o aes-ppc.o vpaes-ppc.o aesp8-ppc.o:::sha1-ppc.o sha256-ppc.o sha512-ppc.o sha256p8-ppc.o sha512p8-ppc.o:::::::ghashp8-ppc.o:";
158 my $ppc32_asm=$ppc64_asm;
160 # As for $BSDthreads. Idea is to maintain "collective" set of flags,
161 # which would cover all BSD flavors. -pthread applies to them all,
162 # but is treated differently. OpenBSD expands is as -D_POSIX_THREAD
163 # -lc_r, which is sufficient. FreeBSD 4.x expands it as -lc_r,
164 # which has to be accompanied by explicit -D_THREAD_SAFE and
165 # sometimes -D_REENTRANT. FreeBSD 5.x expands it as -lc_r, which
166 # seems to be sufficient?
167 my $BSDthreads="-pthread -D_THREAD_SAFE -D_REENTRANT";
170 # table of known configurations, read in from files
172 # The content of each entry can take one of two forms:
174 # - old style config-string, colon seperated fields with exactly the
175 # following structure.:
177 # $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
179 # We use the stringtohash function - defined below - to combine with the
180 # fields and form a proper hash table from the string.
182 # - direct transfer of old style config string to hash table, using the names
183 # of the fields as keys:
189 # thread_cflag => $thread_cflag,
193 # cpuid_obj => $cpuid_obj,
196 # des_obj => $des_obj,
197 # aes_obj => $aes_obj,
199 # md5_obj => $md5_obj,
200 # sha1_obj => $sha1_obj,
201 # cast_obj => $cast_obj,
202 # rc4_obj => $rc4_obj,
203 # rmd160_obj => $rmd160_obj,
204 # rc5_obj => $rc5_obj,
206 # cmll_obj => $cmll_obj,
207 # modes_obj => $modes_obj,
208 # engines_obj => $engines_obj,
209 # perlasm_scheme => $perlasm_scheme,
210 # dso_scheme => $dso_scheme,
211 # shared_target => $shared_target,
212 # shared_cflag => $shared_cflag,
213 # shared_ldflag => $shared_ldflag,
214 # shared_extension => $shared_extension,
216 # arflags => $arflags,
217 # multilib => $multilib
220 # - new style config hash table, which has additional attributes for debug
221 # and non-debug flags to be added to the common flags, for cflags and lflags:
226 # debug_cflags => $debug_cflags,
227 # release_cflags => $release_cflags,
229 # thread_cflag => $thread_cflag,
232 # debug_lflags => $debug_lflags,
233 # release_lflags => $release_lflags,
235 # cpuid_obj => $cpuid_obj,
238 # des_obj => $des_obj,
239 # aes_obj => $aes_obj,
241 # md5_obj => $md5_obj,
242 # sha1_obj => $sha1_obj,
243 # cast_obj => $cast_obj,
244 # rc4_obj => $rc4_obj,
245 # rmd160_obj => $rmd160_obj,
246 # rc5_obj => $rc5_obj,
248 # cmll_obj => $cmll_obj,
249 # modes_obj => $modes_obj,
250 # engines_obj => $engines_obj,
251 # dso_scheme => $dso_scheme,
252 # shared_target => $shared_target,
253 # shared_cflag => $shared_cflag,
254 # shared_ldflag => $shared_ldflag,
255 # shared_extension => $shared_extension,
257 # arflags => $arflags,
258 # multilib => $multilib
261 # The configuration reader will do what it can to translate everything into
262 # new style config hash tables, including merging $target and debug-$target
263 # if they are similar enough.
265 # The configuration hashes can refer to templates in two different manners:
267 # - as part of the hash, one can have a key called 'inherit_from' that
268 # indicate what other configuration hashes to inherit data from.
269 # These are resolved recursively.
271 # Inheritance works as a set of default values that can be overriden
272 # by corresponding attribute values in the inheriting configuration.
274 # If several configurations are given in the 'inherit_from' array, the
275 # values of same attribute are concatenated with space separation.
276 # With this, it's possible to have several smaller templates for
277 # different configuration aspects that can be combined into a complete
293 # inherit_from => [ "foo", "bar" ],
296 # The entry for "foo" will become as follows after processing:
304 # Note 1: any entry from the table can be used as a template.
305 # Note 2: pure templates have the attribute 'template => 1' and cannot
306 # be used as targets.
308 # - instead of a string, one can have a code block of the form
309 # 'sub { /* your code here */ }', where the arguments are the list of
310 # inherited values for that key. In fact, the concatenation of strings
311 # is really done by using 'sub { join(" ",@_) }' on the list of inherited
320 # ignored => "This should not appear in the end result",
329 # inherit_from => [ "foo", "bar" ],
330 # hehe => sub { join(" ",(@_,"!!!")) },
334 # The entry for "foo" will become as follows after processing:
337 # haha => "ha ha ah",
339 # hehe => "hehe !!!",
346 # All these templates are merely a translation of the corresponding
347 # variables further up.
349 # Note: as long as someone might use old style configuration strings,
350 # or we bother supporting that, those variables need to stay
352 # Filler used for when there are no asm files.
371 perlasm_scheme => "void"
376 cpuid_obj => "x86cpuid.o",
377 bn_obj => "bn-586.o co-586.o x86-mont.o x86-gf2m.o",
378 ec_obj => "ecp_nistz256.o ecp_nistz256-x86.o",
379 des_obj => "des-586.o crypt586.o",
380 aes_obj => "aes-586.o vpaes-x86.o aesni-x86.o",
381 bf_obj => "bf-586.o",
382 md5_obj => "md5-586.o",
383 sha1_obj => "sha1-586.o sha256-586.o sha512-586.o",
384 rc4_obj => "rc4-586.o",
385 rmd160_obj => "rmd-586.o",
386 rc5_obj => "rc5-586.o",
387 wp_obj => "wp_block.o wp-mmx.o",
388 cmll_obj => "cmll-x86.o",
389 modes_obj => "ghash-x86.o",
390 engines_obj => "e_padlock-x86.o"
394 inherit_from => [ "x86_asm_nocast" ],
395 cast_obj => "cast-586.o",
399 inherit_from => [ "x86_asm" ],
400 perlasm_scheme => "elf"
402 android_x86_elf_asm => {
404 inherit_from => [ "x86_asm" ],
405 perlasm_scheme => "android"
410 cpuid_obj => "x86_64cpuid.o",
411 bn_obj => "x86_64-mont.o x86_64-mont5.o x86_64-gf2m.o rsaz_exp.o rsaz-x86_64.o rsaz-avx2.o",
412 ec_obj => "ecp_nistz256.o ecp_nistz256-x86_64.o",
413 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",
414 md5_obj => "md5-x86_64.o",
415 sha1_obj => "sha1-x86_64.o sha256-x86_64.o sha512-x86_64.o sha1-mb-x86_64.o sha256-mb-x86_64.o",
416 rc4_obj => "rc4-x86_64.o rc4-md5-x86_64.o",
417 wp_obj => "wp-x86_64.o",
418 cmll_obj => "cmll-x86_64.o cmll_misc.o",
419 modes_obj => "ghash-x86_64.o aesni-gcm-x86_64.o",
420 engines_obj => "e_padlock-x86_64.o"
423 inherit_from => [ "_x86_64_asm" ],
425 bn_obj => sub { join(" ","x86_64-gcc.o",@_) }
428 inherit_from => [ "_x86_64_asm" ],
430 bn_obj => sub { join(" ","bn_asm.o",@_) }
434 cpuid_obj => "ia64cpuid.o",
435 bn_obj => "bn-ia64.o ia64-mont.o",
436 aes_obj => "aes_core.o aes_cbc.o aes-ia64.o",
437 md5_obj => "md5-ia64.o",
438 sha1_obj => "sha1-ia64.o sha256-ia64.o sha512-ia64.o",
439 rc4_obj => "rc4-ia64.o rc4_skey.o",
440 modes_obj => "ghash-ia64.o",
441 perlasm_scheme => "void"
445 cpuid_obj => "sparcv9cap.o sparccpuid.o",
446 bn_obj => "bn-sparcv9.o sparcv9-mont.o sparcv9a-mont.o vis3-mont.o sparct4-mont.o sparcv9-gf2m.o",
447 des_obj => "des_enc-sparc.o fcrypt_b.o dest4-sparcv9.o",
448 aes_obj => "aes_core.o aes_cbc.o aes-sparcv9.o aest4-sparcv9.o",
449 md5_obj => "md5-sparcv9.o",
450 sha1_obj => "sha1-sparcv9.o sha256-sparcv9.o sha512-sparcv9.o",
451 cmll_obj => "camellia.o cmll_misc.o cmll_cbc.o cmllt4-sparcv9.o",
452 modes_obj => "ghash-sparcv9.o",
453 perlasm_scheme => "void"
458 bn_obj => "sparcv8.o",
459 des_obj => "des_enc-sparc.o fcrypt_b.o",
460 perlasm_scheme => "void"
464 cpuid_obj => "alphacpuid.o",
465 bn_obj => "bn_asm.o alpha-mont.o",
466 sha1_obj => "sha1-alpha.o",
467 modes_obj => "ghash-alpha.o",
468 perlasm_scheme => "void"
472 bn_obj => "bn-mips.o mips-mont.o",
473 aes_obj => "aes_cbc.o aes-mips.o",
474 sha1_obj => "sha1-mips.o sha256-mips.o",
477 inherit_from => [ "mips32_asm" ],
479 sha1_obj => sub { join(" ", @_, "sha512-mips.o") }
483 cpuid_obj => "s390xcap.o s390xcpuid.o",
484 bn_obj => "s390x-mont.o s390x-gf2m.o",
485 aes_obj => "aes-s390x.o aes-ctr.o aes-xts.o",
486 sha1_obj => "sha1-s390x.o sha256-s390x.o sha512-s390x.o",
487 rc4_obj => "rc4-s390x.o",
488 modes_obj => "ghash-s390x.o",
492 inherit_from => [ "_s390x_asm" ],
493 bn_obj => sub { join(" ", "bn-s390x.o", @_) }
497 inherit_from => [ "_s390x_asm" ],
498 bn_obj => sub { join(" ", "bn_asm.o", @_) }
502 cpuid_obj => "armcap.o armv4cpuid.o",
503 bn_obj => "bn_asm.o armv4-mont.o armv4-gf2m.o",
504 ec_obj => "ecp_nistz256.o ecp_nistz256-armv4.o",
505 aes_obj => "aes_cbc.o aes-armv4.o bsaes-armv7.o aesv8-armx.o",
506 sha1_obj => "sha1-armv4-large.o sha256-armv4.o sha512-armv4.o",
507 modes_obj => "ghash-armv4.o ghashv8-armx.o",
508 perlasm_scheme => "void"
512 cpuid_obj => "armcap.o arm64cpuid.o mem_clr.o",
513 aes_obj => "aes_core.o aes_cbc.o aesv8-armx.o",
514 sha1_obj => "sha1-armv8.o sha256-armv8.o sha512-armv8.o",
515 modes_obj => "ghashv8-armx.o",
519 cpuid_obj => "pariscid.o",
520 bn_obj => "bn_asm.o parisc-mont.o",
521 aes_obj => "aes_core.o aes_cbc.o aes-parisc.o",
522 sha1_obj => "sha1-parisc.o sha256-parisc.o sha512-parisc.o",
523 rc4_obj => "rc4-parisc.o",
524 modes_obj => "ghash-parisc.o",
525 perlasm_scheme => "32"
529 cpuid_obj => "pariscid.o",
530 bn_obj => "parisc-mont.o",
531 aes_obj => "aes_core.o aes_cbc.o aes-parisc.o",
532 sha1_obj => "sha1-parisc.o sha256-parisc.o sha512-parisc.o",
533 rc4_obj => "rc4-parisc.o",
534 modes_obj => "ghash-parisc.o",
535 perlasm_scheme => "64"
539 inherit_from => [ "_parisc20_asm" ],
540 bn_obj => sub { join(" ", "pa-risc2.o", @_) },
541 perlasm_scheme => "32",
545 inherit_from => [ "_parisc20_asm" ],
546 bn_obj => sub { join(" ", "pa-risc2W.o", @_) },
547 perlasm_scheme => "64",
551 cpuid_obj => "ppccpuid.o ppccap.o",
552 bn_obj => "bn-ppc.o ppc-mont.o ppc64-mont.o",
553 aes_obj => "aes_core.o aes_cbc.o aes-ppc.o vpaes-ppc.o aesp8-ppc.o",
554 sha1_obj => "sha1-ppc.o sha256-ppc.o sha512-ppc.o sha256p8-ppc.o sha512p8-ppc.o",
555 modes_obj => "ghashp8-ppc.o",
558 inherit_from => [ "ppc64_asm" ],
565 if (ref($in) eq "HASH") {
568 my @stringsequence = (
603 # return a ref to a hash, that's what the outer braces are for.
604 return { map { shift @stringsequence => $_ } split /:/, $in };
607 # Read configuration target stanzas from a file, so that people can have
608 # local files with their own definitions
611 open(CONFFILE, "< $fname")
612 or die "Can't open configuration file '$fname'!\n";
615 my $content = <CONFFILE>;
621 # Make sure we have debug- targets first
624 my $a_nd = $a =~ m/^debug-/ ? $' :$a;
625 my $b_nd = $b =~ m/^debug-/ ? $' :$b;
628 if (($a_nd == $a) == ($b_nd == $b)) {
629 # they are both debug- or not, compare them as they are
631 } elsif ($a_nd != $a) {
632 # $a is debug-, make it lesser
635 # $b is debug-, make $a greater
642 if (ref($targets{$_}) ne "HASH") {
643 # Value is assumed to be a string. Split it up to
644 # become a hash table of parameters. Also, try to
645 # merge debug- variants with the non-debug target.
647 # Start with converting the value from a string to a
648 # standardised hash of fields. Using $tohash is safe,
649 # if the input is already a hash ref, it's just returned
651 $targets{$_} = stringtohash($targets{$_});
653 # If the current target is a debug target, there might
654 # be a corresponding non-debug target that we can merge
655 # with. If it isn't a debug- target, we've already done
656 # as much merging as we can and do not need to bother
657 # with that any more.
658 if ($_ =~ m/^debug-/) {
660 my $nondebugkey = $';
661 my $debug = $targets{$debugkey};
664 if ($targets{$nondebugkey}) {
665 $nondebug = stringtohash($targets{$nondebugkey});
669 # There's both a debug and non-debug variant of
670 # this target, so we should try to merge them
673 # First, check that the non-debug variant isn't
674 # already built up with all it should have.
675 if ($nondebug->{debug_cflags}
676 || $nondebug->{release_cflags}
677 || $nondebug->{debug_lflags}
678 || $nondebug->{release_lflags}) {
679 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...";
683 # Now, check similarity.
684 # For keys they have in common, support that
685 # cflags and lflags can differ, otherwise they
686 # must have exactly the same values for them
687 # to be merged into one.
688 my $similarenough = 1;
689 for (keys %{$debug}) {
690 if ($nondebug->{$_} ne $debug->{$_}
691 && $_ !~ m/^[cl]flags$/) {
697 if ($similarenough) {
698 # Here's where the magic happens, split the
699 # options in the debug and non-debug variants
700 # cflags and ldflags into three strings each,
701 # one with common flags, one with extra debug
702 # flags and one with extra non-debug flags.
704 # The result ends up in %h_nondebug, which
705 # becomes the merged variant when we're done.
706 # for each of cflags and lflags, they are
707 # replaced with cflags, debug_cflags,
708 # release_cflags and similar for lflags.
710 # The purpose is that 'cflags' should be
711 # used together with 'debug_cflags' or
712 # 'release_cflags' depending on what the
714 foreach (("cflags", "lflags")) {
715 my @list_d = split /\s+/, $debug->{$_};
716 my @list_nd = split /\s+/, $nondebug->{$_};
717 my %presence = (); # bitmap
718 # 1: present in @list_d
719 # 2: present in @list_nd
721 map { $presence{$_} += 1; } @list_d;
722 map { $presence{$_} += 2; } @list_nd;
724 delete $nondebug->{$_};
725 # Note: we build from the original lists to
726 # preserve order, it might be important
727 $nondebug->{"debug-".$_} =
729 grep { $presence{$_} == 1 } @list_d);
730 $nondebug->{"nodebug-".$_} =
732 grep { $presence{$_} == 2 } @list_nd);
735 grep { $presence{$_} == 3 } @list_d);
738 $targets{$nondebugkey} = $nondebug;
739 delete $targets{$debugkey};
746 %table = (%table, %targets);
748 # Local function to resolve inheritance
749 my $resolve_inheritance;
750 $resolve_inheritance =
753 my @breadcrumbs = @_;
755 if (grep { $_ eq $target } @breadcrumbs) {
756 die "inherit_from loop! target backtrace:\n "
757 ,$target,"\n ",join("\n ", @breadcrumbs),"\n";
760 # Recurse through all inheritances. They will be resolved on
761 # the fly, so when this operation is done, they will all just
762 # be a bunch of attributes with string values.
763 # What we get here, though, are keys with references to lists
764 # of the combined values of them all. We will deal with lists
765 # after this stage is done.
766 my %combined_inheritance = ();
767 if ($table{$target}->{inherit_from}) {
768 foreach (@{$table{$target}->{inherit_from}}) {
769 my %inherited_config =
770 $resolve_inheritance->($_, $target, @breadcrumbs);
772 # 'template' is a marker that's considered private to
773 # the config that had it.
774 delete $inherited_config{template};
777 if (!$combined_inheritance{$_}) {
778 $combined_inheritance{$_} = [];
780 push @{$combined_inheritance{$_}}, $inherited_config{$_};
781 } keys %inherited_config;
785 # We won't need inherit_from in this target any more, since
786 # we've resolved all the inheritances that lead to this
787 delete $table{$target}->{inherit_from};
789 # Now is the time to deal with those lists. Here's the place
790 # to decide what shall be done with those lists, all based on
791 # the values of the target we're currently dealing with.
792 # - If a value is a coderef, it will be executed with the list
793 # of inherited values as arguments.
794 # - If the corresponding key doesn't have a value at all or is
795 # the emoty string, the inherited value list will be run
796 # through the default combiner (below), and the result
797 # becomes this target's value.
798 # - Otherwise, this target's value is assumed to be a string
799 # that will simply override the inherited list of values.
800 my $default_combiner = sub { join(' ',@_) };
803 map { $_ => 1 } (keys %combined_inheritance,
804 keys %{$table{$target}});
805 foreach (sort keys %all_keys) {
807 # Current target doesn't have a value for the current key?
808 # Assign it the default combiner, the rest of this loop
809 # body will handle it just like any other coderef.
810 if (!exists $table{$target}->{$_}) {
811 $table{$target}->{$_} = $default_combiner;
814 my $valuetype = ref($table{$target}->{$_});
815 if ($valuetype eq "CODE") {
816 # CODE reference, execute it with the inherited values
818 $table{$target}->{$_} =
819 $table{$target}->{$_}->(@{$combined_inheritance{$_}});
820 } elsif ($valuetype eq "") {
821 # Scalar, just leave it as is.
823 # Some other type of reference that we don't handle.
824 # Better to abort at this point.
825 die "cannot handle reference type $valuetype,"
826 ," found in target $target -> $_\n";
830 # Finally done, return the result.
834 # Go through all new targets and resolve inheritance and template
836 foreach (keys %targets) {
837 # We're ignoring the returned values here, they are only valuable
838 # to the inner recursion of this function.
839 $resolve_inheritance->($_);
843 my ($vol, $dir, $dummy) = File::Spec->splitpath($0);
844 my $pattern = File::Spec->catpath($vol, $dir, "Configurations/*.conf");
845 foreach (sort glob($pattern) ) {
849 my @MK1MF_Builds=qw(VC-WIN64I VC-WIN64A
850 debug-VC-WIN64I debug-VC-WIN64A
851 VC-NT VC-CE VC-WIN32 debug-VC-WIN32
853 netware-clib netware-clib-bsdsock
854 netware-libc netware-libc-bsdsock);
860 my $install_prefix= "$ENV{'INSTALL_PREFIX'}";
861 my $cross_compile_prefix="";
862 my $fipslibdir="/usr/local/ssl/fips-2.0/lib/";
863 my $nofipscanistercheck=0;
864 my $baseaddr="0xFB00000";
867 my $no_shared=0; # but "no-shared" is default
868 my $zlib=1; # but "no-zlib" is default
869 my $no_krb5=0; # but "no-krb5" is implied unless "--with-krb5-..." is used
870 my $no_rfc3779=1; # but "no-rfc3779" is default
875 my $Makefile="Makefile";
876 my $des_locl="crypto/des/des_locl.h";
877 my $des ="crypto/des/des.h";
878 my $bn ="crypto/bn/bn.h";
879 my $md2 ="crypto/md2/md2.h";
880 my $rc4 ="crypto/rc4/rc4.h";
881 my $rc4_locl="crypto/rc4/rc4_locl.h";
882 my $idea ="crypto/idea/idea.h";
883 my $rc2 ="crypto/rc2/rc2.h";
884 my $bf ="crypto/bf/bf_locl.h";
885 my $bn_asm ="bn_asm.o";
886 my $des_enc="des_enc.o fcrypt_b.o";
887 my $aes_enc="aes_core.o aes_cbc.o";
888 my $bf_enc ="bf_enc.o";
889 my $cast_enc="c_enc.o";
890 my $rc4_enc="rc4_enc.o rc4_skey.o";
891 my $rc5_enc="rc5_enc.o";
892 my $cmll_enc="camellia.o cmll_misc.o cmll_cbc.o";
898 # All of the following is disabled by default (RC5 was enabled before 0.9.8):
900 my %disabled = ( # "what" => "comment" [or special keyword "experimental"]
901 "deprecated" => "default",
902 "ec_nistp_64_gcc_128" => "default",
904 "jpake" => "experimental",
907 "rfc3779" => "default",
909 "shared" => "default",
910 "ssl-trace" => "default",
911 "store" => "experimental",
912 "unit-test" => "default",
914 "zlib-dynamic" => "default"
916 my @experimental = ();
918 # This is what $depflags will look like with the above defaults
919 # (we need this to see if we should advise the user to run "make depend"):
920 my $default_depflags = " -DOPENSSL_NO_DEPRECATED -DOPENSSL_NO_EC_NISTP_64_GCC_128 -DOPENSSL_NO_GMP -DOPENSSL_NO_JPAKE -DOPENSSL_NO_MD2 -DOPENSSL_NO_RC5 -DOPENSSL_NO_RFC3779 -DOPENSSL_NO_SCTP -DOPENSSL_NO_SSL_TRACE -DOPENSSL_NO_STORE -DOPENSSL_NO_UNIT_TEST";
922 # Explicit "no-..." options will be collected in %disabled along with the defaults.
923 # To remove something from %disabled, use "enable-foo" (unless it's experimental).
924 # For symmetry, "disable-foo" is a synonym for "no-foo".
926 # For features called "experimental" here, a more explicit "experimental-foo" is needed to enable.
927 # We will collect such requests in @experimental.
928 # To avoid accidental use of experimental features, applications will have to use -DOPENSSL_EXPERIMENTAL_FOO.
933 &usage if ($#ARGV < 0);
937 my $openssl_experimental_defines;
938 my $openssl_algorithm_defines;
939 my $openssl_thread_defines;
940 my $openssl_sys_defines="";
941 my $openssl_other_defines;
949 my $build_prefix = "release_";
953 my $argv_unprocessed=1;
955 while($argv_unprocessed)
959 $openssl_experimental_defines="";
960 $openssl_algorithm_defines="";
961 $openssl_thread_defines="";
962 $openssl_sys_defines="";
963 $openssl_other_defines="";
970 $argvstring=join(' ',@argvcopy);
975 s /^-no-/no-/; # some people just can't read the instructions
977 # rewrite some options in "enable-..." form
978 s /^-?-?shared$/enable-shared/;
979 s /^sctp$/enable-sctp/;
980 s /^threads$/enable-threads/;
981 s /^zlib$/enable-zlib/;
982 s /^zlib-dynamic$/enable-zlib-dynamic/;
984 if (/^no-(.+)$/ || /^disable-(.+)$/)
986 if (!($disabled{$1} eq "experimental"))
990 $disabled{"ssl3"} = "option(ssl)";
994 $disabled{"tls1"} = "option(tls)"
996 elsif ($1 eq "ssl3-method")
998 $disabled{"ssl3-method"} = "option(ssl)";
999 $disabled{"ssl3"} = "option(ssl)";
1003 $disabled{$1} = "option";
1007 elsif (/^enable-(.+)$/ || /^experimental-(.+)$/)
1010 if ($disabled{$algo} eq "experimental")
1012 die "You are requesting an experimental feature; please say 'experimental-$algo' if you are sure\n"
1013 unless (/^experimental-/);
1014 push @experimental, $algo;
1016 delete $disabled{$algo};
1018 $threads = 1 if ($algo eq "threads");
1020 elsif (/^--test-sanity$/)
1022 exit(&test_sanity());
1024 elsif (/^--strict-warnings$/)
1026 $strict_warnings = 1;
1030 $build_prefix = "debug_";
1032 elsif (/^--release$/)
1034 $build_prefix = "release_";
1036 elsif (/^reconfigure/ || /^reconf/)
1038 if (open(IN,"<$Makefile"))
1043 if (/^CONFIGURE_ARGS=(.*)/)
1046 @argvcopy=split(' ',$argvstring);
1047 die "Incorrect data to reconfigure, please do a normal configuration\n"
1048 if (grep(/^reconf/,@argvcopy));
1049 print "Reconfiguring with: $argvstring\n";
1050 $argv_unprocessed=1;
1057 die "Insufficient data to reconfigure, please do a normal configuration\n";
1067 # No RSAref support any more since it's not needed.
1068 # The check for the option is there so scripts aren't
1071 elsif (/^nofipscanistercheck$/)
1074 $nofipscanistercheck = 1;
1078 if (/^--prefix=(.*)$/)
1082 elsif (/^--libdir=(.*)$/)
1086 elsif (/^--openssldir=(.*)$/)
1090 elsif (/^--install.prefix=(.*)$/)
1094 elsif (/^--with-krb5-(dir|lib|include|flavor)=(.*)$/)
1096 $withargs{"krb5-".$1}=$2;
1098 elsif (/^--with-zlib-lib=(.*)$/)
1100 $withargs{"zlib-lib"}=$1;
1102 elsif (/^--with-zlib-include=(.*)$/)
1104 $withargs{"zlib-include"}="-I$1";
1106 elsif (/^--with-fipslibdir=(.*)$/)
1110 elsif (/^--with-baseaddr=(.*)$/)
1114 elsif (/^--cross-compile-prefix=(.*)$/)
1116 $cross_compile_prefix=$1;
1118 elsif (/^--config=(.*)$/)
1122 elsif (/^-[lL](.*)$/ or /^-Wl,/)
1126 else # common if (/^[-+]/), just pass down...
1128 $_ =~ s/%([0-9a-f]{1,2})/chr(hex($1))/gei;
1132 elsif ($_ =~ /^([^:]+):(.+)$/)
1134 eval "\$table{\$1} = \"$2\""; # allow $xxx constructs in the string
1139 die "target already defined - $target (offending arg: $_)\n" if ($target ne "");
1143 unless ($_ eq $target || /^no-/ || /^disable-/)
1145 # "no-..." follows later after implied disactivations
1146 # have been derived. (Don't take this too seroiusly,
1147 # we really only write OPTIONS to the Makefile out of
1153 { $options .= " ".$_; }
1160 if ($processor eq "386")
1162 $disabled{"sse2"} = "forced";
1165 if (!defined($withargs{"krb5-flavor"}) || $withargs{"krb5-flavor"} eq "")
1167 $disabled{"krb5"} = "krb5-flavor not specified";
1170 if (!defined($disabled{"zlib-dynamic"}))
1172 # "zlib-dynamic" was specifically enabled, so enable "zlib"
1173 delete $disabled{"zlib"};
1176 if (defined($disabled{"rijndael"}))
1178 $disabled{"aes"} = "forced";
1180 if (defined($disabled{"des"}))
1182 $disabled{"mdc2"} = "forced";
1184 if (defined($disabled{"ec"}))
1186 $disabled{"ecdsa"} = "forced";
1187 $disabled{"ecdh"} = "forced";
1190 # SSL 3.0 and TLS requires MD5 and SHA and either RSA or DSA+DH
1191 if (defined($disabled{"md5"}) || defined($disabled{"sha"})
1192 || (defined($disabled{"rsa"})
1193 && (defined($disabled{"dsa"}) || defined($disabled{"dh"}))))
1195 $disabled{"ssl3"} = "forced";
1196 $disabled{"tls1"} = "forced";
1199 if (defined($disabled{"tls1"}))
1201 $disabled{"tlsext"} = "forced";
1204 if (defined($disabled{"ec"}) || defined($disabled{"dsa"})
1205 || defined($disabled{"dh"}))
1207 $disabled{"gost"} = "forced";
1210 # SRP and HEARTBEATS require TLSEXT
1211 if (defined($disabled{"tlsext"}))
1213 $disabled{"srp"} = "forced";
1214 $disabled{"heartbeats"} = "forced";
1217 if ($target eq "TABLE") {
1218 foreach $target (sort keys %table) {
1219 print_table_entry($target, "TABLE");
1224 if ($target eq "LIST") {
1225 foreach (sort keys %table) {
1232 if ($target eq "HASH") {
1233 print "%table = (\n";
1234 foreach (sort keys %table) {
1235 print_table_entry($_, "HASH");
1240 if ($target =~ m/^CygWin32(-.*)$/) {
1241 $target = "Cygwin".$1;
1244 print "Configuring for $target\n";
1246 # Support for legacy targets having a name starting with 'debug-'
1247 my ($d, $t) = $target =~ m/^(debug-)?(.*)$/;
1249 $build_prefix = "debug_";
1251 # If we do not find debug-foo in the table, the target is set to foo,
1252 # but only if the foo target has a noon-empty debug_cflags or debug_lflags
1254 if (!$table{$target} && ($table{$t}->{debug_cflags}
1255 || $table{$t}->{debug_lflags})) {
1260 &usage if (!defined($table{$target})
1261 || $table{$target}->{template}
1262 || ($build_prefix eq "debug_"
1263 && !($table{$target}->{debug_cflags}
1264 || $table{$target}->{debug_lflags})));
1268 delete $disabled{"shared"} if ($disabled{"shared"} eq "default");
1271 foreach (sort (keys %disabled))
1273 $options .= " no-$_";
1275 printf " no-%-12s %-10s", $_, "[$disabled{$_}]";
1280 { $no_threads = 1; }
1285 elsif (/^static-engine$/)
1287 elsif (/^zlib-dynamic$/)
1289 elsif (/^symlinks$/)
1296 ($ALGO = $algo = $_) =~ tr/[\-a-z]/[_A-Z]/;
1298 if (/^asm$/ || /^err$/ || /^hw$/ || /^hw-/)
1300 $openssl_other_defines .= "#define OPENSSL_NO_$ALGO\n";
1301 print " OPENSSL_NO_$ALGO";
1303 if (/^err$/) { $flags .= "-DOPENSSL_NO_ERR "; }
1304 elsif (/^asm$/) { $no_asm = 1; }
1308 ($ALGO,$algo) = ("RMD160","rmd160") if ($algo eq "ripemd");
1310 $openssl_algorithm_defines .= "#define OPENSSL_NO_$ALGO\n";
1311 print " OPENSSL_NO_$ALGO";
1318 # fix-up crypto/directory name(s)
1319 $skip[$#skip]="whrlpool" if $algo eq "whirlpool";
1320 $skip[$#skip]="ripemd" if $algo eq "rmd160";
1322 print " (skip dir)";
1324 $depflags .= " -DOPENSSL_NO_$ALGO";
1332 my $exp_cflags = "";
1334 foreach (sort @experimental)
1337 ($ALGO = $_) =~ tr/[a-z]/[A-Z]/;
1339 # opensslconf.h will set OPENSSL_NO_... unless OPENSSL_EXPERIMENTAL_... is defined
1340 $openssl_experimental_defines .= "#define OPENSSL_NO_$ALGO\n";
1341 $exp_cflags .= " -DOPENSSL_EXPERIMENTAL_$ALGO";
1344 my $IsMK1MF=scalar grep /^$target$/,@MK1MF_Builds;
1346 $exe_ext=".exe" if ($target eq "Cygwin" || $target eq "DJGPP" || $target =~ /^mingw/);
1347 $exe_ext=".nlm" if ($target =~ /netware/);
1348 $exe_ext=".pm" if ($target =~ /vos/);
1349 $openssldir="/usr/local/ssl" if ($openssldir eq "" and $prefix eq "");
1350 $prefix=$openssldir if $prefix eq "";
1352 $default_ranlib= &which("ranlib") or $default_ranlib="true";
1353 $perl=$ENV{'PERL'} or $perl=&which("perl5") or $perl=&which("perl")
1355 my $make = $ENV{'MAKE'} || "make";
1357 $cross_compile_prefix=$ENV{'CROSS_COMPILE'} if $cross_compile_prefix eq "";
1359 chop $openssldir if $openssldir =~ /\/$/;
1360 chop $prefix if $prefix =~ /.\/$/;
1362 $openssldir=$prefix . "/ssl" if $openssldir eq "";
1363 $openssldir=$prefix . "/" . $openssldir if $openssldir !~ /(^\/|^[a-zA-Z]:[\\\/])/;
1366 print "IsMK1MF=$IsMK1MF\n";
1368 # Allow environment CC to override compiler...
1369 my $cc = $ENV{CC} || $table{$t}->{cc};
1371 # For cflags and lflags, add the debug_ or release_ attributes
1372 # Do it in such a way that no spurious space is appended (hence the grep).
1373 my $cflags = join(" ",
1374 grep { $_ } ($table{$t}->{cflags},
1375 $table{$t}->{$build_prefix."cflags"}));
1376 my $lflags = join(" ",
1377 grep { $_ } ($table{$t}->{lflags},
1378 $table{$t}->{$build_prefix."lflags"}));
1380 my $unistd = $table{$t}->{unistd};
1381 my $thread_cflag = $table{$t}->{thread_cflag};
1382 my $sys_id = $table{$t}->{sys_id};
1383 my $bn_ops = $table{$t}->{bn_ops};
1384 my $cpuid_obj = $table{$t}->{cpuid_obj};
1385 my $bn_obj = $table{$t}->{bn_obj};
1386 my $ec_obj = $table{$t}->{ec_obj};
1387 my $des_obj = $table{$t}->{des_obj};
1388 my $aes_obj = $table{$t}->{aes_obj};
1389 my $bf_obj = $table{$t}->{bf_obj};
1390 my $md5_obj = $table{$t}->{md5_obj};
1391 my $sha1_obj = $table{$t}->{sha1_obj};
1392 my $cast_obj = $table{$t}->{cast_obj};
1393 my $rc4_obj = $table{$t}->{rc4_obj};
1394 my $rmd160_obj = $table{$t}->{rmd160_obj};
1395 my $rc5_obj = $table{$t}->{rc5_obj};
1396 my $wp_obj = $table{$t}->{wp_obj};
1397 my $cmll_obj = $table{$t}->{cmll_obj};
1398 my $modes_obj = $table{$t}->{modes_obj};
1399 my $engines_obj = $table{$t}->{engines_obj};
1400 my $perlasm_scheme = $table{$t}->{perlasm_scheme};
1401 my $dso_scheme = $table{$t}->{dso_scheme};
1402 my $shared_target = $table{$t}->{shared_target};
1403 my $shared_cflag = $table{$t}->{shared_cflag};
1404 my $shared_ldflag = $table{$t}->{shared_ldflag};
1405 my $shared_extension = $table{$t}->{shared_extension};
1406 my $ranlib = $ENV{'RANLIB'} || $table{$t}->{ranlib};
1407 my $ar = $ENV{'AR'} || "ar";
1408 my $arflags = $table{$t}->{arflags};
1409 my $multilib = $table{$t}->{multilib};
1411 # if $prefix/lib$multilib is not an existing directory, then
1412 # assume that it's not searched by linker automatically, in
1413 # which case adding $multilib suffix causes more grief than
1414 # we're ready to tolerate, so don't...
1415 $multilib="" if !-d "$prefix/lib$multilib";
1417 $libdir="lib$multilib" if $libdir eq "";
1419 $cflags = "$cflags$exp_cflags";
1421 # '%' in $lflags is used to split flags to "pre-" and post-flags
1422 my ($prelflags,$postlflags)=split('%',$lflags);
1423 if (defined($postlflags)) { $lflags=$postlflags; }
1424 else { $lflags=$prelflags; undef $prelflags; }
1426 if ($target =~ /^mingw/ && `$cc --target-help 2>&1` !~ m/\-mno\-cygwin/m)
1428 $cflags =~ s/\-mno\-cygwin\s*//;
1429 $shared_ldflag =~ s/\-mno\-cygwin\s*//;
1432 if ($target =~ /linux.*\-mips/ && !$no_asm && $flags !~ /\-m(ips|arch=)/) {
1433 # minimally required architecture flags for assembly modules
1434 $cflags="-mips2 $cflags" if ($target =~ /mips32/);
1435 $cflags="-mips3 $cflags" if ($target =~ /mips64/);
1438 my $no_shared_warn=0;
1439 my $no_user_cflags=0;
1441 if ($flags ne "") { $cflags="$flags$cflags"; }
1442 else { $no_user_cflags=1; }
1444 # Kerberos settings. The flavor must be provided from outside, either through
1445 # the script "config" or manually.
1448 my ($lresolv, $lpath, $lext);
1449 if ($withargs{"krb5-flavor"} =~ /^[Hh]eimdal$/)
1451 die "Sorry, Heimdal is currently not supported\n";
1453 ##### HACK to force use of Heimdal.
1454 ##### WARNING: Since we don't really have adequate support for Heimdal,
1455 ##### using this will break the build. You'll have to make
1456 ##### changes to the source, and if you do, please send
1457 ##### patches to openssl-dev@openssl.org
1458 if ($withargs{"krb5-flavor"} =~ /^force-[Hh]eimdal$/)
1460 warn "Heimdal isn't really supported. Your build WILL break\n";
1461 warn "If you fix the problems, please send a patch to openssl-dev\@openssl.org\n";
1462 $withargs{"krb5-dir"} = "/usr/heimdal"
1463 if $withargs{"krb5-dir"} eq "";
1464 $withargs{"krb5-lib"} = "-L".$withargs{"krb5-dir"}.
1465 "/lib -lgssapi -lkrb5 -lcom_err"
1466 if $withargs{"krb5-lib"} eq "" && !$IsMK1MF;
1467 $cflags="-DKRB5_HEIMDAL $cflags";
1469 if ($withargs{"krb5-flavor"} =~ /^[Mm][Ii][Tt]/)
1471 $withargs{"krb5-dir"} = "/usr/kerberos"
1472 if $withargs{"krb5-dir"} eq "";
1473 $withargs{"krb5-lib"} = "-L".$withargs{"krb5-dir"}.
1474 "/lib -lgssapi_krb5 -lkrb5 -lcom_err -lk5crypto"
1475 if $withargs{"krb5-lib"} eq "" && !$IsMK1MF;
1476 $cflags="-DKRB5_MIT $cflags";
1477 $withargs{"krb5-flavor"} =~ s/^[Mm][Ii][Tt][._-]*//;
1478 if ($withargs{"krb5-flavor"} =~ /^1[._-]*[01]/)
1480 $cflags="-DKRB5_MIT_OLD11 $cflags";
1484 foreach $lpath ("/lib", "/usr/lib")
1486 foreach $lext ("a", "so")
1488 $lresolv = "$lpath/libresolv.$lext";
1489 last LRESOLV if (-r "$lresolv");
1493 $withargs{"krb5-lib"} .= " -lresolv"
1494 if ("$lresolv" ne "");
1495 $withargs{"krb5-include"} = "-I".$withargs{"krb5-dir"}."/include"
1496 if $withargs{"krb5-include"} eq "" &&
1497 $withargs{"krb5-dir"} ne "";
1500 # The DSO code currently always implements all functions so that no
1501 # applications will have to worry about that from a compilation point
1502 # of view. However, the "method"s may return zero unless that platform
1503 # has support compiled in for them. Currently each method is enabled
1504 # by a define "DSO_<name>" ... we translate the "dso_scheme" config
1505 # string entry into using the following logic;
1507 if (!$no_dso && $dso_scheme ne "")
1509 $dso_scheme =~ tr/[a-z]/[A-Z]/;
1510 if ($dso_scheme eq "DLFCN")
1512 $dso_cflags = "-DDSO_DLFCN -DHAVE_DLFCN_H";
1514 elsif ($dso_scheme eq "DLFCN_NO_H")
1516 $dso_cflags = "-DDSO_DLFCN";
1520 $dso_cflags = "-DDSO_$dso_scheme";
1522 $cflags = "$dso_cflags $cflags";
1527 if ($thread_cflag ne "(unknown)" && !$no_threads)
1529 # If we know how to do it, support threads by default.
1532 if ($thread_cflag eq "(unknown)" && $threads)
1534 # If the user asked for "threads", [s]he is also expected to
1535 # provide any system-dependent compiler options that are
1537 if ($no_user_cflags)
1539 print "You asked for multi-threading support, but didn't\n";
1540 print "provide any system-specific compiler options\n";
1543 $thread_cflags="-DOPENSSL_THREADS $cflags" ;
1544 $thread_defines .= "#define OPENSSL_THREADS\n";
1548 $thread_cflags="-DOPENSSL_THREADS $thread_cflag $cflags";
1549 $thread_defines .= "#define OPENSSL_THREADS\n";
1551 # foreach $def (split ' ',$thread_cflag)
1553 # if ($def =~ s/^-D// && $def !~ /^_/)
1555 # $thread_defines .= "#define $def\n";
1560 $lflags="$libs$lflags" if ($libs ne "");
1564 $cpuid_obj=$bn_obj=$ec_obj=
1565 $des_obj=$aes_obj=$bf_obj=$cast_obj=$rc4_obj=$rc5_obj=$cmll_obj=
1566 $modes_obj=$sha1_obj=$md5_obj=$rmd160_obj=$wp_obj=$engines_obj="";
1567 $cflags=~s/\-D[BL]_ENDIAN// if ($fips);
1568 $thread_cflags=~s/\-D[BL]_ENDIAN// if ($fips);
1570 elsif (defined($disabled{ec2m}))
1572 $bn_obj =~ s/\w+-gf2m.o//;
1577 $cast_obj=""; # CAST assembler is not PIC
1582 $cflags=$thread_cflags;
1583 $openssl_thread_defines .= $thread_defines;
1588 $cflags = "-DZLIB $cflags";
1589 if (defined($disabled{"zlib-dynamic"}))
1591 if (defined($withargs{"zlib-lib"}))
1593 $lflags = "$lflags -L" . $withargs{"zlib-lib"} . " -lz";
1597 $lflags = "$lflags -lz";
1602 $cflags = "-DZLIB_SHARED $cflags";
1606 #Build the library with OPENSSL_USE_DEPRECATED if deprecation is not disabled
1607 if(!defined($disabled{"deprecated"}))
1609 $cflags = "-DOPENSSL_USE_DEPRECATED $cflags";
1612 # You will find shlib_mark1 and shlib_mark2 explained in Makefile.org
1613 my $shared_mark = "";
1614 if ($shared_target eq "")
1616 $no_shared_warn = 1 if !$no_shared && !$fips;
1621 if ($shared_cflag ne "")
1623 $cflags = "$shared_cflag -DOPENSSL_PIC $cflags";
1629 # add {no-}static-engine to options to allow mkdef.pl to work without extra arguments
1632 $openssl_other_defines.="#define OPENSSL_NO_DYNAMIC_ENGINE\n";
1633 $options.=" static-engine";
1637 $openssl_other_defines.="#define OPENSSL_NO_STATIC_ENGINE\n";
1638 $options.=" no-static-engine";
1642 $cpuid_obj.=" uplink.o uplink-x86.o" if ($cflags =~ /\-DOPENSSL_USE_APPLINK/);
1647 if ($target =~ /\-icc$/) # Intel C compiler
1650 if (open(FD,"$cc -V 2>&1 |"))
1652 while(<FD>) { $iccver=$1 if (/Version ([0-9]+)\./); }
1657 $cflags=~s/\-KPIC/-fPIC/;
1658 # Eliminate unnecessary dependency from libirc.a. This is
1659 # essential for shared library support, as otherwise
1660 # apps/openssl can end up in endless loop upon startup...
1661 $cflags.=" -Dmemcpy=__builtin_memcpy -Dmemset=__builtin_memset";
1665 $lflags.=" -i-static";
1666 $lflags=~s/\-no_cpprt/-no-cpprt/;
1670 $lflags=~s/\-i\-static/-static-intel/;
1674 $cflags.=" -no-intel-extensions"; # disable Cilk
1675 $lflags=~s/\-no\-cpprt/-no-cxxlib/;
1679 # Unlike other OSes (like Solaris, Linux, Tru64, IRIX) BSD run-time
1680 # linkers (tested OpenBSD, NetBSD and FreeBSD) "demand" RPATH set on
1681 # .so objects. Apparently application RPATH is not global and does
1682 # not apply to .so linked with other .so. Problem manifests itself
1683 # when libssl.so fails to load libcrypto.so. One can argue that we
1684 # should engrave this into Makefile.shared rules or into BSD-* config
1685 # lines above. Meanwhile let's try to be cautious and pass -rpath to
1686 # linker only when --prefix is not /usr.
1687 if ($target =~ /^BSD\-/)
1689 $shared_ldflag.=" -Wl,-rpath,\$(LIBRPATH)" if ($prefix !~ m|^/usr[/]*$|);
1694 #$cflags="-DOPENSSL_SYS_$sys_id $cflags";
1695 $openssl_sys_defines="#define OPENSSL_SYS_$sys_id\n";
1700 $ranlib = $default_ranlib;
1703 #my ($bn1)=split(/\s+/,$bn_obj);
1704 #$bn1 = "" unless defined $bn1;
1705 #$bn1=$bn_asm unless ($bn1 =~ /\.o$/);
1708 $cpuid_obj="" if ($processor eq "386");
1710 $bn_obj = $bn_asm unless $bn_obj ne "";
1711 # bn-586 is the only one implementing bn_*_part_words
1712 $cflags.=" -DOPENSSL_BN_ASM_PART_WORDS" if ($bn_obj =~ /bn-586/);
1713 $cflags.=" -DOPENSSL_IA32_SSE2" if (!$no_sse2 && $bn_obj =~ /86/);
1715 $cflags.=" -DOPENSSL_BN_ASM_MONT" if ($bn_obj =~ /-mont/);
1716 $cflags.=" -DOPENSSL_BN_ASM_MONT5" if ($bn_obj =~ /-mont5/);
1717 $cflags.=" -DOPENSSL_BN_ASM_GF2m" if ($bn_obj =~ /-gf2m/);
1721 $openssl_other_defines.="#define OPENSSL_FIPS\n";
1724 $cpuid_obj="mem_clr.o" unless ($cpuid_obj =~ /\.o$/);
1725 $des_obj=$des_enc unless ($des_obj =~ /\.o$/);
1726 $bf_obj=$bf_enc unless ($bf_obj =~ /\.o$/);
1727 $cast_obj=$cast_enc unless ($cast_obj =~ /\.o$/);
1728 $rc4_obj=$rc4_enc unless ($rc4_obj =~ /\.o$/);
1729 $rc5_obj=$rc5_enc unless ($rc5_obj =~ /\.o$/);
1730 if ($sha1_obj =~ /\.o$/)
1732 # $sha1_obj=$sha1_enc;
1733 $cflags.=" -DSHA1_ASM" if ($sha1_obj =~ /sx86/ || $sha1_obj =~ /sha1/);
1734 $cflags.=" -DSHA256_ASM" if ($sha1_obj =~ /sha256/);
1735 $cflags.=" -DSHA512_ASM" if ($sha1_obj =~ /sha512/);
1736 if ($sha1_obj =~ /sse2/)
1738 { $sha1_obj =~ s/\S*sse2\S+//; }
1739 elsif ($cflags !~ /OPENSSL_IA32_SSE2/)
1740 { $cflags.=" -DOPENSSL_IA32_SSE2"; }
1743 if ($md5_obj =~ /\.o$/)
1745 # $md5_obj=$md5_enc;
1746 $cflags.=" -DMD5_ASM";
1748 if ($rmd160_obj =~ /\.o$/)
1750 # $rmd160_obj=$rmd160_enc;
1751 $cflags.=" -DRMD160_ASM";
1753 if ($aes_obj =~ /\.o$/)
1755 $cflags.=" -DAES_ASM" if ($aes_obj =~ m/\baes\-/);;
1756 # aes-ctr.o is not a real file, only indication that assembler
1757 # module implements AES_ctr32_encrypt...
1758 $cflags.=" -DAES_CTR_ASM" if ($aes_obj =~ s/\s*aes\-ctr\.o//);
1759 # aes-xts.o indicates presence of AES_xts_[en|de]crypt...
1760 $cflags.=" -DAES_XTS_ASM" if ($aes_obj =~ s/\s*aes\-xts\.o//);
1761 $aes_obj =~ s/\s*(vpaes|aesni)\-x86\.o//g if ($no_sse2);
1762 $cflags.=" -DVPAES_ASM" if ($aes_obj =~ m/vpaes/);
1763 $cflags.=" -DBSAES_ASM" if ($aes_obj =~ m/bsaes/);
1768 $wp_obj="" if ($wp_obj =~ /mmx/ && $processor eq "386");
1769 if ($wp_obj =~ /\.o$/ && !$disabled{"whirlpool"})
1771 $cflags.=" -DWHIRLPOOL_ASM";
1774 $wp_obj="wp_block.o";
1776 $cmll_obj=$cmll_enc unless ($cmll_obj =~ /.o$/);
1777 if ($modes_obj =~ /ghash\-/)
1779 $cflags.=" -DGHASH_ASM";
1781 if ($ec_obj =~ /ecp_nistz256/)
1783 $cflags.=" -DECP_NISTZ256_ASM";
1786 # "Stringify" the C flags string. This permits it to be made part of a string
1787 # and works as well on command lines.
1788 $cflags =~ s/([\\\"])/\\\1/g;
1790 my $version = "unknown";
1791 my $version_num = "unknown";
1792 my $major = "unknown";
1793 my $minor = "unknown";
1794 my $shlib_version_number = "unknown";
1795 my $shlib_version_history = "unknown";
1796 my $shlib_major = "unknown";
1797 my $shlib_minor = "unknown";
1799 open(IN,'<crypto/opensslv.h') || die "unable to read opensslv.h:$!\n";
1802 $version=$1 if /OPENSSL.VERSION.TEXT.*OpenSSL (\S+) /;
1803 $version_num=$1 if /OPENSSL.VERSION.NUMBER.*0x(\S+)/;
1804 $shlib_version_number=$1 if /SHLIB_VERSION_NUMBER *"([^"]+)"/;
1805 $shlib_version_history=$1 if /SHLIB_VERSION_HISTORY *"([^"]*)"/;
1808 if ($shlib_version_history ne "") { $shlib_version_history .= ":"; }
1810 if ($version =~ /(^[0-9]*)\.([0-9\.]*)/)
1816 if ($shlib_version_number =~ /(^[0-9]*)\.([0-9\.]*)/)
1822 if ($strict_warnings)
1825 die "ERROR --strict-warnings requires gcc or clang" unless ($cc =~ /gcc$/ or $cc =~ /clang$/);
1826 foreach $wopt (split /\s+/, $gcc_devteam_warn)
1828 $cflags .= " $wopt" unless ($cflags =~ /$wopt/)
1832 open(IN,"<Makefile.org") || die "unable to read Makefile.org:$!\n";
1833 unlink("$Makefile.new") || die "unable to remove old $Makefile.new:$!\n" if -e "$Makefile.new";
1834 open(OUT,">$Makefile.new") || die "unable to create $Makefile.new:$!\n";
1835 print OUT "### Generated automatically from Makefile.org by Configure.\n\n";
1841 $sdirs = 1 if /^SDIRS=/;
1844 foreach $dir (@skip) {
1849 $sdirs = 0 unless /\\$/;
1850 s/fips // if (/^DIRS=/ && !$fips);
1851 s/engines // if (/^DIRS=/ && $disabled{"engine"});
1852 s/ccgost// if (/^ENGDIRS=/ && $disabled{"gost"});
1853 s/^VERSION=.*/VERSION=$version/;
1854 s/^MAJOR=.*/MAJOR=$major/;
1855 s/^MINOR=.*/MINOR=$minor/;
1856 s/^SHLIB_VERSION_NUMBER=.*/SHLIB_VERSION_NUMBER=$shlib_version_number/;
1857 s/^SHLIB_VERSION_HISTORY=.*/SHLIB_VERSION_HISTORY=$shlib_version_history/;
1858 s/^SHLIB_MAJOR=.*/SHLIB_MAJOR=$shlib_major/;
1859 s/^SHLIB_MINOR=.*/SHLIB_MINOR=$shlib_minor/;
1860 s/^SHLIB_EXT=.*/SHLIB_EXT=$shared_extension/;
1861 s/^INSTALLTOP=.*$/INSTALLTOP=$prefix/;
1862 s/^MULTILIB=.*$/MULTILIB=$multilib/;
1863 s/^OPENSSLDIR=.*$/OPENSSLDIR=$openssldir/;
1864 s/^LIBDIR=.*$/LIBDIR=$libdir/;
1865 s/^INSTALL_PREFIX=.*$/INSTALL_PREFIX=$install_prefix/;
1866 s/^PLATFORM=.*$/PLATFORM=$target/;
1867 s/^OPTIONS=.*$/OPTIONS=$options/;
1868 s/^CONFIGURE_ARGS=.*$/CONFIGURE_ARGS=$argvstring/;
1869 if ($cross_compile_prefix)
1871 s/^CC=.*$/CROSS_COMPILE= $cross_compile_prefix\nCC= \$\(CROSS_COMPILE\)$cc/;
1872 s/^AR=\s*/AR= \$\(CROSS_COMPILE\)/;
1873 s/^NM=\s*/NM= \$\(CROSS_COMPILE\)/;
1874 s/^RANLIB=\s*/RANLIB= \$\(CROSS_COMPILE\)/;
1875 s/^MAKEDEPPROG=.*$/MAKEDEPPROG= \$\(CROSS_COMPILE\)$cc/ if $cc eq "gcc";
1879 s/^AR=\s*ar/AR= $ar/;
1880 s/^RANLIB=.*/RANLIB= $ranlib/;
1881 s/^MAKEDEPPROG=.*$/MAKEDEPPROG= $cc/ if $cc eq "gcc" || ($cc eq 'cc' && $target =~ /darwin/);
1883 s/^CFLAG=.*$/CFLAG= $cflags/;
1884 s/^DEPFLAG=.*$/DEPFLAG=$depflags/;
1885 s/^PEX_LIBS=.*$/PEX_LIBS= $prelflags/;
1886 s/^EX_LIBS=.*$/EX_LIBS= $lflags/;
1887 s/^EXE_EXT=.*$/EXE_EXT= $exe_ext/;
1888 s/^CPUID_OBJ=.*$/CPUID_OBJ= $cpuid_obj/;
1889 s/^BN_ASM=.*$/BN_ASM= $bn_obj/;
1890 s/^EC_ASM=.*$/EC_ASM= $ec_obj/;
1891 s/^DES_ENC=.*$/DES_ENC= $des_obj/;
1892 s/^AES_ENC=.*$/AES_ENC= $aes_obj/;
1893 s/^BF_ENC=.*$/BF_ENC= $bf_obj/;
1894 s/^CAST_ENC=.*$/CAST_ENC= $cast_obj/;
1895 s/^RC4_ENC=.*$/RC4_ENC= $rc4_obj/;
1896 s/^RC5_ENC=.*$/RC5_ENC= $rc5_obj/;
1897 s/^MD5_ASM_OBJ=.*$/MD5_ASM_OBJ= $md5_obj/;
1898 s/^SHA1_ASM_OBJ=.*$/SHA1_ASM_OBJ= $sha1_obj/;
1899 s/^RMD160_ASM_OBJ=.*$/RMD160_ASM_OBJ= $rmd160_obj/;
1900 s/^WP_ASM_OBJ=.*$/WP_ASM_OBJ= $wp_obj/;
1901 s/^CMLL_ENC=.*$/CMLL_ENC= $cmll_obj/;
1902 s/^MODES_ASM_OBJ.=*$/MODES_ASM_OBJ= $modes_obj/;
1903 s/^ENGINES_ASM_OBJ.=*$/ENGINES_ASM_OBJ= $engines_obj/;
1904 s/^PERLASM_SCHEME=.*$/PERLASM_SCHEME= $perlasm_scheme/;
1905 s/^PROCESSOR=.*/PROCESSOR= $processor/;
1906 s/^ARFLAGS=.*/ARFLAGS= $arflags/;
1907 s/^PERL=.*/PERL= $perl/;
1908 s/^KRB5_INCLUDES=.*/KRB5_INCLUDES=$withargs{"krb5-include"}/;
1909 s/^LIBKRB5=.*/LIBKRB5=$withargs{"krb5-lib"}/;
1910 s/^LIBZLIB=.*/LIBZLIB=$withargs{"zlib-lib"}/;
1911 s/^ZLIB_INCLUDE=.*/ZLIB_INCLUDE=$withargs{"zlib-include"}/;
1912 s/^FIPSLIBDIR=.*/FIPSLIBDIR=$fipslibdir/;
1913 s/^FIPSCANLIB=.*/FIPSCANLIB=libcrypto/ if $fips;
1914 s/^SHARED_FIPS=.*/SHARED_FIPS=/;
1915 s/^SHLIBDIRS=.*/SHLIBDIRS= crypto ssl/;
1916 s/^BASEADDR=.*/BASEADDR=$baseaddr/;
1917 s/^SHLIB_TARGET=.*/SHLIB_TARGET=$shared_target/;
1918 s/^SHLIB_MARK=.*/SHLIB_MARK=$shared_mark/;
1919 s/^SHARED_LIBS=.*/SHARED_LIBS=\$(SHARED_CRYPTO) \$(SHARED_SSL)/ if (!$no_shared);
1920 if ($shared_extension ne "" && $shared_extension =~ /^\.s([ol])\.[^\.]*$/)
1923 s/^SHARED_LIBS_LINK_EXTS=.*/SHARED_LIBS_LINK_EXTS=.s$sotmp/;
1925 elsif ($shared_extension ne "" && $shared_extension =~ /^\.[^\.]*\.dylib$/)
1927 s/^SHARED_LIBS_LINK_EXTS=.*/SHARED_LIBS_LINK_EXTS=.dylib/;
1929 elsif ($shared_extension ne "" && $shared_extension =~ /^\.s([ol])\.[^\.]*\.[^\.]*$/)
1932 s/^SHARED_LIBS_LINK_EXTS=.*/SHARED_LIBS_LINK_EXTS=.s$sotmp.\$(SHLIB_MAJOR) .s$sotmp/;
1934 elsif ($shared_extension ne "" && $shared_extension =~ /^\.[^\.]*\.[^\.]*\.dylib$/)
1936 s/^SHARED_LIBS_LINK_EXTS=.*/SHARED_LIBS_LINK_EXTS=.\$(SHLIB_MAJOR).dylib .dylib/;
1938 s/^SHARED_LDFLAGS=.*/SHARED_LDFLAGS=$shared_ldflag/;
1943 rename($Makefile,"$Makefile.bak") || die "unable to rename $Makefile\n" if -e $Makefile;
1944 rename("$Makefile.new",$Makefile) || die "unable to rename $Makefile.new\n";
1947 print "CFLAG =$cflags\n";
1948 print "EX_LIBS =$lflags\n";
1949 print "CPUID_OBJ =$cpuid_obj\n";
1950 print "BN_ASM =$bn_obj\n";
1951 print "EC_ASM =$ec_obj\n";
1952 print "DES_ENC =$des_obj\n";
1953 print "AES_ENC =$aes_obj\n";
1954 print "BF_ENC =$bf_obj\n";
1955 print "CAST_ENC =$cast_obj\n";
1956 print "RC4_ENC =$rc4_obj\n";
1957 print "RC5_ENC =$rc5_obj\n";
1958 print "MD5_OBJ_ASM =$md5_obj\n";
1959 print "SHA1_OBJ_ASM =$sha1_obj\n";
1960 print "RMD160_OBJ_ASM=$rmd160_obj\n";
1961 print "CMLL_ENC =$cmll_obj\n";
1962 print "MODES_OBJ =$modes_obj\n";
1963 print "ENGINES_OBJ =$engines_obj\n";
1964 print "PROCESSOR =$processor\n";
1965 print "RANLIB =$ranlib\n";
1966 print "ARFLAGS =$arflags\n";
1967 print "PERL =$perl\n";
1968 print "KRB5_INCLUDES =",$withargs{"krb5-include"},"\n"
1969 if $withargs{"krb5-include"} ne "";
1977 my $rc4_int=$def_int;
1978 my $md2_int=$def_int;
1979 my $idea_int=$def_int;
1980 my $rc2_int=$def_int;
1984 my @type=("char","short","int","long");
1985 my ($b64l,$b64,$b32,$b16,$b8)=(0,0,1,0,0);
1986 my $export_var_as_fn=0;
1990 foreach (sort split(/\s+/,$bn_ops))
1992 $des_ptr=1 if /DES_PTR/;
1993 $des_risc1=1 if /DES_RISC1/;
1994 $des_risc2=1 if /DES_RISC2/;
1995 $des_unroll=1 if /DES_UNROLL/;
1996 $des_int=1 if /DES_INT/;
1997 $bn_ll=1 if /BN_LLONG/;
1998 $rc4_int=0 if /RC4_CHAR/;
1999 $rc4_int=3 if /RC4_LONG/;
2000 $rc4_idx=1 if /RC4_INDEX/;
2001 $rc4_chunk=1 if /RC4_CHUNK/;
2002 $rc4_chunk=2 if /RC4_CHUNK_LL/;
2003 $md2_int=0 if /MD2_CHAR/;
2004 $md2_int=3 if /MD2_LONG/;
2005 $idea_int=1 if /IDEA_SHORT/;
2006 $idea_int=3 if /IDEA_LONG/;
2007 $rc2_int=1 if /RC2_SHORT/;
2008 $rc2_int=3 if /RC2_LONG/;
2009 $bf_ptr=1 if $_ eq "BF_PTR";
2010 $bf_ptr=2 if $_ eq "BF_PTR2";
2011 ($b64l,$b64,$b32,$b16,$b8)=(0,1,0,0,0) if /SIXTY_FOUR_BIT/;
2012 ($b64l,$b64,$b32,$b16,$b8)=(1,0,0,0,0) if /SIXTY_FOUR_BIT_LONG/;
2013 ($b64l,$b64,$b32,$b16,$b8)=(0,0,1,0,0) if /THIRTY_TWO_BIT/;
2014 ($b64l,$b64,$b32,$b16,$b8)=(0,0,0,1,0) if /SIXTEEN_BIT/;
2015 ($b64l,$b64,$b32,$b16,$b8)=(0,0,0,0,1) if /EIGHT_BIT/;
2016 $export_var_as_fn=1 if /EXPORT_VAR_AS_FN/;
2019 open(IN,'<crypto/opensslconf.h.in') || die "unable to read crypto/opensslconf.h.in:$!\n";
2020 unlink("crypto/opensslconf.h.new") || die "unable to remove old crypto/opensslconf.h.new:$!\n" if -e "crypto/opensslconf.h.new";
2021 open(OUT,'>crypto/opensslconf.h.new') || die "unable to create crypto/opensslconf.h.new:$!\n";
2022 print OUT "/* opensslconf.h */\n";
2023 print OUT "/* WARNING: Generated automatically from opensslconf.h.in by Configure. */\n\n";
2025 print OUT "#ifdef __cplusplus\n";
2026 print OUT "extern \"C\" {\n";
2027 print OUT "#endif\n";
2028 print OUT "/* OpenSSL was configured with the following options: */\n";
2029 my $openssl_algorithm_defines_trans = $openssl_algorithm_defines;
2030 $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;
2031 $openssl_algorithm_defines_trans =~ s/^\s*#\s*define\s+OPENSSL_(.*)/# if defined(OPENSSL_$1) \&\& !defined($1)\n# define $1\n# endif/mg;
2032 $openssl_algorithm_defines =~ s/^\s*#\s*define\s+(.*)/#ifndef $1\n# define $1\n#endif/mg;
2033 $openssl_algorithm_defines = " /* no ciphers excluded */\n" if $openssl_algorithm_defines eq "";
2034 $openssl_thread_defines =~ s/^\s*#\s*define\s+(.*)/#ifndef $1\n# define $1\n#endif/mg;
2035 $openssl_sys_defines =~ s/^\s*#\s*define\s+(.*)/#ifndef $1\n# define $1\n#endif/mg;
2036 $openssl_other_defines =~ s/^\s*#\s*define\s+(.*)/#ifndef $1\n# define $1\n#endif/mg;
2037 print OUT $openssl_sys_defines;
2038 print OUT "#ifndef OPENSSL_DOING_MAKEDEPEND\n\n";
2039 print OUT $openssl_experimental_defines;
2041 print OUT $openssl_algorithm_defines;
2042 print OUT "\n#endif /* OPENSSL_DOING_MAKEDEPEND */\n\n";
2043 print OUT $openssl_thread_defines;
2044 print OUT $openssl_other_defines,"\n";
2046 print OUT "/* The OPENSSL_NO_* macros are also defined as NO_* if the application\n";
2047 print OUT " asks for it. This is a transient feature that is provided for those\n";
2048 print OUT " who haven't had the time to do the appropriate changes in their\n";
2049 print OUT " applications. */\n";
2050 print OUT "#ifdef OPENSSL_ALGORITHM_DEFINES\n";
2051 print OUT $openssl_algorithm_defines_trans;
2052 print OUT "#endif\n\n";
2054 print OUT "#define OPENSSL_CPUID_OBJ\n\n" if ($cpuid_obj ne "mem_clr.o");
2058 if (/^#define\s+OPENSSLDIR/)
2060 my $foo = $openssldir;
2061 $foo =~ s/\\/\\\\/g;
2062 print OUT "#define OPENSSLDIR \"$foo\"\n";
2064 elsif (/^#define\s+ENGINESDIR/)
2066 my $foo = "$prefix/$libdir/engines";
2067 $foo =~ s/\\/\\\\/g;
2068 print OUT "#define ENGINESDIR \"$foo\"\n";
2070 elsif (/^#((define)|(undef))\s+OPENSSL_EXPORT_VAR_AS_FUNCTION/)
2071 { printf OUT "#undef OPENSSL_EXPORT_VAR_AS_FUNCTION\n"
2072 if $export_var_as_fn;
2073 printf OUT "#%s OPENSSL_EXPORT_VAR_AS_FUNCTION\n",
2074 ($export_var_as_fn)?"define":"undef"; }
2075 elsif (/^#define\s+OPENSSL_UNISTD/)
2077 $unistd = "<unistd.h>" if $unistd eq "";
2078 print OUT "#define OPENSSL_UNISTD $unistd\n";
2080 elsif (/^#((define)|(undef))\s+SIXTY_FOUR_BIT_LONG/)
2081 { printf OUT "#%s SIXTY_FOUR_BIT_LONG\n",($b64l)?"define":"undef"; }
2082 elsif (/^#((define)|(undef))\s+SIXTY_FOUR_BIT/)
2083 { printf OUT "#%s SIXTY_FOUR_BIT\n",($b64)?"define":"undef"; }
2084 elsif (/^#((define)|(undef))\s+THIRTY_TWO_BIT/)
2085 { printf OUT "#%s THIRTY_TWO_BIT\n",($b32)?"define":"undef"; }
2086 elsif (/^#((define)|(undef))\s+SIXTEEN_BIT/)
2087 { printf OUT "#%s SIXTEEN_BIT\n",($b16)?"define":"undef"; }
2088 elsif (/^#((define)|(undef))\s+EIGHT_BIT/)
2089 { printf OUT "#%s EIGHT_BIT\n",($b8)?"define":"undef"; }
2090 elsif (/^#((define)|(undef))\s+BN_LLONG\s*$/)
2091 { printf OUT "#%s BN_LLONG\n",($bn_ll)?"define":"undef"; }
2092 elsif (/^\#define\s+DES_LONG\s+.*/)
2093 { printf OUT "#define DES_LONG unsigned %s\n",
2094 ($des_int)?'int':'long'; }
2095 elsif (/^\#(define|undef)\s+DES_PTR/)
2096 { printf OUT "#%s DES_PTR\n",($des_ptr)?'define':'undef'; }
2097 elsif (/^\#(define|undef)\s+DES_RISC1/)
2098 { printf OUT "#%s DES_RISC1\n",($des_risc1)?'define':'undef'; }
2099 elsif (/^\#(define|undef)\s+DES_RISC2/)
2100 { printf OUT "#%s DES_RISC2\n",($des_risc2)?'define':'undef'; }
2101 elsif (/^\#(define|undef)\s+DES_UNROLL/)
2102 { printf OUT "#%s DES_UNROLL\n",($des_unroll)?'define':'undef'; }
2103 elsif (/^#define\s+RC4_INT\s/)
2104 { printf OUT "#define RC4_INT unsigned %s\n",$type[$rc4_int]; }
2105 elsif (/^#undef\s+RC4_CHUNK/)
2107 printf OUT "#undef RC4_CHUNK\n" if $rc4_chunk==0;
2108 printf OUT "#define RC4_CHUNK unsigned long\n" if $rc4_chunk==1;
2109 printf OUT "#define RC4_CHUNK unsigned long long\n" if $rc4_chunk==2;
2111 elsif (/^#((define)|(undef))\s+RC4_INDEX/)
2112 { printf OUT "#%s RC4_INDEX\n",($rc4_idx)?"define":"undef"; }
2113 elsif (/^#(define|undef)\s+I386_ONLY/)
2114 { printf OUT "#%s I386_ONLY\n", ($processor eq "386")?
2116 elsif (/^#define\s+MD2_INT\s/)
2117 { printf OUT "#define MD2_INT unsigned %s\n",$type[$md2_int]; }
2118 elsif (/^#define\s+IDEA_INT\s/)
2119 {printf OUT "#define IDEA_INT unsigned %s\n",$type[$idea_int];}
2120 elsif (/^#define\s+RC2_INT\s/)
2121 {printf OUT "#define RC2_INT unsigned %s\n",$type[$rc2_int];}
2122 elsif (/^#(define|undef)\s+BF_PTR/)
2124 printf OUT "#undef BF_PTR\n" if $bf_ptr == 0;
2125 printf OUT "#define BF_PTR\n" if $bf_ptr == 1;
2126 printf OUT "#define BF_PTR2\n" if $bf_ptr == 2;
2132 print OUT "#ifdef __cplusplus\n";
2134 print OUT "#endif\n";
2136 rename("crypto/opensslconf.h","crypto/opensslconf.h.bak") || die "unable to rename crypto/opensslconf.h\n" if -e "crypto/opensslconf.h";
2137 rename("crypto/opensslconf.h.new","crypto/opensslconf.h") || die "unable to rename crypto/opensslconf.h.new\n";
2142 print "SIXTY_FOUR_BIT_LONG mode\n" if $b64l;
2143 print "SIXTY_FOUR_BIT mode\n" if $b64;
2144 print "THIRTY_TWO_BIT mode\n" if $b32;
2145 print "SIXTEEN_BIT mode\n" if $b16;
2146 print "EIGHT_BIT mode\n" if $b8;
2147 print "DES_PTR used\n" if $des_ptr;
2148 print "DES_RISC1 used\n" if $des_risc1;
2149 print "DES_RISC2 used\n" if $des_risc2;
2150 print "DES_UNROLL used\n" if $des_unroll;
2151 print "DES_INT used\n" if $des_int;
2152 print "BN_LLONG mode\n" if $bn_ll;
2153 print "RC4 uses u$type[$rc4_int]\n" if $rc4_int != $def_int;
2154 print "RC4_INDEX mode\n" if $rc4_idx;
2155 print "RC4_CHUNK is undefined\n" if $rc4_chunk==0;
2156 print "RC4_CHUNK is unsigned long\n" if $rc4_chunk==1;
2157 print "RC4_CHUNK is unsigned long long\n" if $rc4_chunk==2;
2158 print "MD2 uses u$type[$md2_int]\n" if $md2_int != $def_int;
2159 print "IDEA uses u$type[$idea_int]\n" if $idea_int != $def_int;
2160 print "RC2 uses u$type[$rc2_int]\n" if $rc2_int != $def_int;
2161 print "BF_PTR used\n" if $bf_ptr == 1;
2162 print "BF_PTR2 used\n" if $bf_ptr == 2;
2165 open (OUT,">crypto/buildinf.h") || die "Can't open buildinf.h";
2168 /* auto-generated by Configure for crypto/cversion.c:
2169 * for Unix builds, crypto/Makefile.ssl generates functional definitions;
2170 * Windows builds (and other mk1mf builds) compile cversion.c with
2171 * -DMK1MF_BUILD and use definitions added to this file by util/mk1mf.pl. */
2172 #error "Windows builds (PLATFORM=$target) use mk1mf.pl-created Makefiles"
2177 my $make_command = "$make PERL=\'$perl\'";
2178 my $make_targets = "";
2179 $make_targets .= " links" if $symlink;
2180 $make_targets .= " depend" if $depflags ne $default_depflags && $make_depend;
2181 $make_targets .= " gentests" if $symlink;
2182 (system $make_command.$make_targets) == 0 or die "make $make_targets failed"
2183 if $make_targets ne "";
2184 if ( $perl =~ m@^/@) {
2185 &dofile("tools/c_rehash",$perl,'^#!/', '#!%s','^my \$dir;$', 'my $dir = "' . $openssldir . '";', '^my \$prefix;$', 'my $prefix = "' . $prefix . '";');
2186 &dofile("apps/CA.pl",$perl,'^#!/', '#!%s');
2188 # No path for Perl known ...
2189 &dofile("tools/c_rehash",'/usr/local/bin/perl','^#!/', '#!%s','^my \$dir;$', 'my $dir = "' . $openssldir . '";', '^my \$prefix;$', 'my $prefix = "' . $prefix . '";');
2190 &dofile("apps/CA.pl",'/usr/local/bin/perl','^#!/', '#!%s');
2192 if ($depflags ne $default_depflags && !$make_depend) {
2195 Since you've disabled or enabled at least one algorithm, you need to do
2196 the following before building:
2203 # create the ms/version32.rc file if needed
2204 if ($IsMK1MF && ($target !~ /^netware/)) {
2205 my ($v1, $v2, $v3, $v4);
2206 if ($version_num =~ /(^[0-9a-f]{1})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})/i) {
2212 open (OUT,">ms/version32.rc") || die "Can't open ms/version32.rc";
2219 FILEVERSION $v1,$v2,$v3,$v4
2220 PRODUCTVERSION $v1,$v2,$v3,$v4
2227 FILEOS VOS__WINDOWS32
2231 BLOCK "StringFileInfo"
2236 VALUE "CompanyName", "The OpenSSL Project, http://www.openssl.org/\\0"
2237 VALUE "FileDescription", "OpenSSL Shared Library\\0"
2238 VALUE "FileVersion", "$version\\0"
2240 VALUE "InternalName", "libeay32\\0"
2241 VALUE "OriginalFilename", "libeay32.dll\\0"
2243 VALUE "InternalName", "ssleay32\\0"
2244 VALUE "OriginalFilename", "ssleay32.dll\\0"
2246 VALUE "ProductName", "The OpenSSL Toolkit\\0"
2247 VALUE "ProductVersion", "$version\\0"
2249 //VALUE "Comments", "\\0"
2250 VALUE "LegalCopyright", "Copyright © 1998-2005 The OpenSSL Project. Copyright © 1995-1998 Eric A. Young, Tim J. Hudson. All rights reserved.\\0"
2251 //VALUE "LegalTrademarks", "\\0"
2252 //VALUE "PrivateBuild", "\\0"
2253 //VALUE "SpecialBuild", "\\0"
2258 VALUE "Translation", 0x409, 0x4b0
2267 Configured for $target.
2270 print <<\EOF if (!$no_threads && !$threads);
2272 The library could not be configured for supporting multi-threaded
2273 applications as the compiler options required on this system are not known.
2274 See file INSTALL for details if you need multi-threading.
2277 print <<\EOF if ($no_shared_warn);
2279 You gave the option 'shared'. Normally, that would give you shared libraries.
2280 Unfortunately, the OpenSSL configuration doesn't include shared library support
2281 for this platform yet, so it will pretend you gave the option 'no-shared'. If
2282 you can inform the developpers (openssl-dev\@openssl.org) how to support shared
2283 libraries on this platform, they will at least look at it and try their best
2284 (but please first make sure you have tried with a current version of OpenSSL).
2291 print STDERR $usage;
2292 print STDERR "\npick os/compiler from:\n";
2296 foreach $i (sort keys %table)
2298 next if $i =~ /^debug/;
2299 $k += length($i) + 1;
2305 print STDERR $i . " ";
2307 foreach $i (sort keys %table)
2309 next if $i !~ /^debug/;
2310 $k += length($i) + 1;
2316 print STDERR $i . " ";
2318 print STDERR "\n\nNOTE: If in doubt, on Unix-ish systems use './config'.\n";
2326 foreach $path (split /:/, $ENV{PATH})
2328 if (-f "$path/$name$exe_ext" and -x _)
2330 return "$path/$name$exe_ext" unless ($name eq "perl" and
2331 system("$path/$name$exe_ext -e " . '\'exit($]<5.0);\''));
2338 my $f; my $p; my %m; my @a; my $k; my $ff;
2341 open(IN,"<$f.in") || open(IN,"<$f") || die "unable to open $f:$!\n";
2344 foreach $k (keys %m)
2346 grep(/$k/ && ($_=sprintf($m{$k}."\n",$p)),@a);
2348 open(OUT,">$f.new") || die "unable to open $f.new:$!\n";
2351 rename($f,"$f.bak") || die "unable to rename $f\n" if -e $f;
2352 rename("$f.new",$f) || die "unable to rename $f.new\n";
2355 sub print_table_entry
2360 # Don't print the templates
2361 return if $table{$target}->{template};
2363 if ($type eq "TABLE") {
2367 \$cc = $table{$target}->{cc}
2368 \$cflags = $table{$target}->{cflags}
2369 \$debug_cflags = $table{$target}->{debug_cflags}
2370 \$release_cflags = $table{$target}->{release_cflags}
2371 \$unistd = $table{$target}->{unistd}
2372 \$thread_cflag = $table{$target}->{thread_cflag}
2373 \$sys_id = $table{$target}->{sys_id}
2374 \$lflags = $table{$target}->{lflags}
2375 \$debug_lflags = $table{$target}->{debug_lflags}
2376 \$release_lflags = $table{$target}->{release_lflags}
2377 \$bn_ops = $table{$target}->{bn_ops}
2378 \$cpuid_obj = $table{$target}->{cpuid_obj}
2379 \$bn_obj = $table{$target}->{bn_obj}
2380 \$ec_obj = $table{$target}->{ec_obj}
2381 \$des_obj = $table{$target}->{des_obj}
2382 \$aes_obj = $table{$target}->{aes_obj}
2383 \$bf_obj = $table{$target}->{bf_obj}
2384 \$md5_obj = $table{$target}->{md5_obj}
2385 \$sha1_obj = $table{$target}->{sha1_obj}
2386 \$cast_obj = $table{$target}->{cast_obj}
2387 \$rc4_obj = $table{$target}->{rc4_obj}
2388 \$rmd160_obj = $table{$target}->{rmd160_obj}
2389 \$rc5_obj = $table{$target}->{rc5_obj}
2390 \$wp_obj = $table{$target}->{wp_obj}
2391 \$cmll_obj = $table{$target}->{cmll_obj}
2392 \$modes_obj = $table{$target}->{modes_obj}
2393 \$engines_obj = $table{$target}->{engines_obj}
2394 \$perlasm_scheme = $table{$target}->{perlasm_scheme}
2395 \$dso_scheme = $table{$target}->{dso_scheme}
2396 \$shared_target= $table{$target}->{shared_target}
2397 \$shared_cflag = $table{$target}->{shared_cflag}
2398 \$shared_ldflag = $table{$target}->{shared_ldflag}
2399 \$shared_extension = $table{$target}->{shared_extension}
2400 \$ranlib = $table{$target}->{ranlib}
2401 \$arflags = $table{$target}->{arflags}
2402 \$multilib = $table{$target}->{multilib}
2404 } elsif ($type eq "HASH") {
2444 length((sort { length($a) <=> length($b) } @sequence)[-1]);
2445 print " '$target' => {\n";
2446 foreach (@sequence) {
2447 if ($table{$target}->{$_}) {
2448 print " '",$_,"'"," " x ($largest - length($_))," => '",$table{$target}->{$_},"',\n";
2459 print STDERR "=" x 70, "\n";
2460 print STDERR "=== SANITY TESTING!\n";
2461 print STDERR "=== No configuration will be done, all other arguments will be ignored!\n";
2462 print STDERR "=" x 70, "\n";
2464 foreach $target (sort keys %table)
2466 my $pre_dso_scheme = "perlasm_scheme";
2467 my $dso_scheme = "dso_scheme";
2468 my $post_dso_scheme = "shared_target";
2471 if ($table{$target}->{$pre_dso_scheme} =~ /^(beos|dl|dlfcn|win32|vms)$/)
2474 print STDERR "SANITY ERROR: '$target' has the dso_scheme values\n";
2475 print STDERR " in the previous field\n";
2477 elsif ($table{$target}->{$post_dso_scheme} =~ /^(beos|dl|dlfcn|win32|vms)$/)
2480 print STDERR "SANITY ERROR: '$target' has the dso_scheme values\n";
2481 print STDERR " in the following field\n";
2483 elsif ($table{$target}->{$dso_scheme} !~ /^(beos|dl|dlfcn|win32|vms|)$/)
2486 print STDERR "SANITY ERROR: '$target' has the dso_scheme field = ",$table{$target}->{$dso_scheme},"\n";
2487 print STDERR " valid values are 'beos', 'dl', 'dlfcn', 'win32' and 'vms'\n";
2490 print STDERR "No sanity errors detected!\n" if $errorcnt == 0;