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