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