Refactor file writing - Adapt util/mkdef.pl to use configdata.pm
[openssl.git] / Configure
1 #! /usr/bin/env perl
2 # -*- mode: perl; -*-
3
4 ##
5 ##  Configure -- OpenSSL source tree configuration script
6 ##  If editing this file, run this command before committing
7 ##      make -f Makefile.in TABLE
8 ##
9
10 require 5.000;
11 use strict;
12 use File::Basename;
13 use File::Spec::Functions;
14
15 # see INSTALL for instructions.
16
17 my $usage="Usage: Configure [no-<cipher> ...] [enable-<cipher> ...] [experimental-<cipher> ...] [-Dxxx] [-lxxx] [-Lxxx] [-fxxx] [-Kxxx] [no-hw-xxx|no-hw] [[no-]threads] [[no-]shared] [[no-]zlib|zlib-dynamic] [no-asm] [no-dso] [no-egd] [sctp] [386] [--prefix=DIR] [--openssldir=OPENSSLDIR] [--with-xxx[=vvv]] [--config=FILE] os/compiler[:flags]\n";
18
19 # Options:
20 #
21 # --config      add the given configuration file, which will be read after
22 #               any "Configurations*" files that are found in the same
23 #               directory as this script.
24 # --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)
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 #
38 # --cross-compile-prefix Add specified prefix to binutils components.
39 #
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 #
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.
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)
51 # [no-]shared   [don't] try to create shared libraries when supported.
52 # no-asm        do not use assembler
53 # no-dso        do not compile in any native shared-library methods. This
54 #               will ensure that all methods just return NULL.
55 # no-egd        do not compile support for the entropy-gathering daemon APIs
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.
59 # sctp          include SCTP support
60 # 386           generate 80386 code
61 # no-sse2       disables IA-32 SSE2 code, above option implies no-sse2
62 # no-<cipher>   build without specified algorithm (rsa, idea, rc5, ...)
63 # -<xxx> +<xxx> compiler options are passed through
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.
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
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
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
85 # RC4_INDEX     define RC4_INDEX in crypto/rc4/rc4_locl.h.  This turns on
86 #               array lookups instead of pointer use.
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).
91 # BF_PTR        use 'pointer arithmatic' for Blowfish (unsafe on Alpha).
92 # BF_PTR2       intel specific version (generic version is more efficient).
93 #
94 # Following are set automatically by this script
95 #
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,
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
102
103 # Minimum warning options... any contributions to OpenSSL should at least get
104 # past these.
105
106 my $gcc_devteam_warn = "-Wall -pedantic -DPEDANTIC -Wno-long-long -Wsign-compare -Wmissing-prototypes -Wshadow -Wformat -Wtype-limits -Werror -DREF_CHECK -DDEBUG_UNUSED";
107
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
110 # following warnings can also be enabled:
111 # -Wswitch-enum, -Wunused-macros, -Wmissing-field-initializers,
112 # -Wcast-align,
113 # -Wunreachable-code -Wunused-parameter -Wlanguage-extension-token
114 # -Wextended-offsetof
115 my $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";
116
117 # Warn that "make depend" should be run?
118 my $warn_make_depend = 0;
119
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.
122 my $memleak_devteam_backtrace = "-rdynamic -DCRYPTO_MDEBUG_BACKTRACE";
123
124
125 my $strict_warnings = 0;
126
127 my $x86_gcc_des="DES_PTR DES_RISC1 DES_UNROLL";
128
129 # MD2_CHAR slags pentium pros
130 my $x86_gcc_opts="RC4_INDEX MD2_INT";
131
132 # As for $BSDthreads. Idea is to maintain "collective" set of flags,
133 # which would cover all BSD flavors. -pthread applies to them all,
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?
139 my $BSDthreads="-pthread -D_THREAD_SAFE -D_REENTRANT";
140
141 #
142 # API compability name to version number mapping.
143 #
144 my $maxapi = "1.1.0";           # API for "no-deprecated" builds
145 my $apitable = {
146     "1.1.0" => "0x10100000L",
147     "1.0.0" => "0x10000000L",
148     "0.9.8" => "0x00908000L",
149 };
150
151 my $base_target = "BASE";   # The template that all other inherit from
152 our %table = ();
153 our %config = ();
154
155 # Forward declarations ###############################################
156
157 # read_config(filename)
158 #
159 # Reads a configuration file and populates %table with the contents
160 # (which the configuration file places in %targets).
161 sub read_config;
162
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.
167 sub resolve_config;
168
169
170 my ($vol, $dir, $dummy) = File::Spec->splitpath($0);
171 my $pattern = File::Spec->catpath($vol, $dir, "Configurations/*.conf");
172 foreach (sort glob($pattern) ) {
173     &read_config($_);
174 }
175
176
177 $config{perl};
178 $config{prefix}="";
179 $config{openssldir}="";
180 my $libdir="";
181 my $exe_ext="";
182 my $install_prefix= "$ENV{'INSTALL_PREFIX'}";
183 my $cross_compile_prefix="";
184 my $fipslibdir="/usr/local/ssl/fips-2.0/lib/";
185 my $nofipscanistercheck=0;
186 my $baseaddr="0xFB00000";
187 my $no_threads=0;
188 my $threads=0;
189 my $no_shared=0; # but "no-shared" is default
190 my $zlib=1;      # but "no-zlib" is default
191 my $no_rfc3779=0;
192 my $no_asm=0;
193 my $no_dso=0;
194 my @skip=();
195 my $Makefile="Makefile";
196 my $processor="";
197 my $default_ranlib;
198 my $fips=0;
199
200 # Known TLS and DTLS protocols
201 my @tls = qw(ssl3 tls1 tls1_1 tls1_2);
202 my @dtls = qw(dtls1 dtls1_2);
203
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
208 my @disablables = (
209     "aes",
210     "asm",
211     "bf",
212     "camellia",
213     "capieng",
214     "cast",
215     "chacha",
216     "cmac",
217     "cms",
218     "comp",
219     "crypto-mdebug",
220     "ct",
221     "deprecated",
222     "des",
223     "dgram",
224     "dh",
225     "dsa",
226     "dso",
227     "dtls",
228     "dynamic[-_]engine",
229     "ec",
230     "ec2m",
231     "ecdh",
232     "ecdsa",
233     "ec_nistp_64_gcc_128",
234     "engine",
235     "err",                      # Really???
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",
251     "poly1305",
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",
273     "ssl-trace",
274     "static-engine",
275     "stdio",
276     "store",
277     "threads",
278     "tls",
279     "unit-test",
280     "whirlpool",
281     "zlib",
282     "zlib-dynamic",
283     );
284 foreach my $proto ((@tls, @dtls))
285         {
286         push(@disablables, $proto);
287         push(@disablables, "$proto-method");
288         }
289
290 # All of the following is disabled by default (RC5 was enabled before 0.9.8):
291
292 my %disabled = ( # "what"         => "comment" [or special keyword "experimental"]
293                  "ec_nistp_64_gcc_128" => "default",
294                  "egd"            => "default",
295                  "jpake"          => "experimental",
296                  "md2"            => "default",
297                  "rc5"            => "default",
298                  "sctp"           => "default",
299                  "shared"         => "default",
300                  "ssl-trace"      => "default",
301                  "store"          => "experimental",
302                  "unit-test"      => "default",
303                  "zlib"           => "default",
304                  "zlib-dynamic"   => "default",
305                  "crypto-mdebug"  => "default",
306                );
307 my @experimental = ();
308
309 # Note: => pair form used for aesthetics, not to truly make a hash table
310 my @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 #
353 my @list = (reverse @tls);
354 while ((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 }
360 my @list = (reverse @dtls);
361 while ((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"):
371 my $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);
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.
383
384
385 my $no_sse2=0;
386
387 &usage if ($#ARGV < 0);
388
389 my $flags="";
390 my $depflags="";
391 my $openssl_experimental_defines="";
392 my $openssl_algorithm_defines="";
393 my $openssl_thread_defines="";
394 my $openssl_sys_defines="";
395 my $openssl_other_defines="";
396 my $libs="";
397 my $target="";
398 $config{options}="";
399 my $api;
400 my $make_depend=0;
401 my %withargs=();
402 my $build_prefix = "release_";
403
404 my @argvcopy=@ARGV;
405
406 if (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
438 my %unsupported_options = ();
439 foreach (@argvcopy)
440         {
441         s /^-no-/no-/; # some people just can't read the instructions
442
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/;
449
450         if (/^(no|disable|enable|experimental)-(.+)$/)
451                 {
452                 my $word = $2;
453                 if (!grep { $word =~ /^${_}$/ } @disablables)
454                         {
455                         $unsupported_options{$_} = 1;
456                         next;
457                         }
458                 }
459         if (/^no-(.+)$/ || /^disable-(.+)$/)
460                 {
461                 if (!($disabled{$1} eq "experimental"))
462                         {
463                         foreach my $proto ((@tls, @dtls))
464                                 {
465                                 if ($1 eq "$proto-method")
466                                         {
467                                         $disabled{"$proto"} = "option($proto-method)";
468                                         last;
469                                         }
470                                 }
471                         if ($1 eq "dtls")
472                                 {
473                                 foreach my $proto (@dtls)
474                                         {
475                                         $disabled{$proto} = "option(dtls)";
476                                         }
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)
488                                         {
489                                         $disabled{$proto} = "option(tls)";
490                                         }
491                                 }
492                         else
493                                 {
494                                 $disabled{$1} = "option";
495                                 }
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};
508
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                         {
544                         $config{prefix}=$1;
545                         }
546                 elsif (/^--api=(.*)$/)
547                         {
548                         $api=$1;
549                         }
550                 elsif (/^--libdir=(.*)$/)
551                         {
552                         $libdir=$1;
553                         }
554                 elsif (/^--openssldir=(.*)$/)
555                         {
556                         $config{openssldir}=$1;
557                         }
558                 elsif (/^--install.prefix=(.*)$/)
559                         {
560                         $install_prefix=$1;
561                         }
562                 elsif (/^--with-zlib-lib=(.*)$/)
563                         {
564                         $withargs{"zlib-lib"}=$1;
565                         }
566                 elsif (/^--with-zlib-include=(.*)$/)
567                         {
568                         $withargs{"zlib-include"}="-I$1";
569                         }
570                 elsif (/^--with-fipslibdir=(.*)$/)
571                         {
572                         $fipslibdir="$1/";
573                         }
574                 elsif (/^--with-baseaddr=(.*)$/)
575                         {
576                         $baseaddr="$1";
577                         }
578                 elsif (/^--cross-compile-prefix=(.*)$/)
579                         {
580                         $cross_compile_prefix=$1;
581                         }
582                 elsif (/^--config=(.*)$/)
583                         {
584                         read_config $1;
585                         }
586                 elsif (/^-[lL](.*)$/ or /^-Wl,/)
587                         {
588                         $libs.=$_." ";
589                         }
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
613                 if ($config{options} eq "")
614                         { $config{options} = $_; }
615                 else
616                         { $config{options} .= " ".$_; }
617                 }
618
619         if (defined($api) && !exists $apitable->{$api}) {
620                 die "***** Unsupported api compatibility level: $api\n",
621         }
622
623         if (keys %unsupported_options)
624                 {
625                 die "***** Unsupported options: ",
626                         join(", ", keys %unsupported_options), "\n";
627                 }
628         }
629
630 if ($fips)
631         {
632         delete $disabled{"shared"} if ($disabled{"shared"} =~ /^default/);
633         }
634
635 my @tocheckfor = (keys %disabled);
636 while (@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;
645         }
646     }
647     @tocheckfor = (keys %new_tocheckfor);
648 }
649
650 if ($target eq "TABLE") {
651     foreach (sort keys %table) {
652         print_table_entry($_, "TABLE");
653     }
654     exit 0;
655 }
656
657 if ($target eq "LIST") {
658     foreach (sort keys %table) {
659         print $_,"\n" unless $table{$_}->{template};
660     }
661     exit 0;
662 }
663
664 if ($target eq "HASH") {
665     print "%table = (\n";
666     foreach (sort keys %table) {
667         print_table_entry($_, "HASH");
668     }
669     exit 0;
670 }
671
672 # Backward compatibility?
673 if ($target =~ m/^CygWin32(-.*)$/) {
674     $target = "Cygwin".$1;
675 }
676
677 foreach (sort (keys %disabled))
678         {
679         $config{options} .= " no-$_";
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; }
691         elsif (/^static-engine$/)
692                 { }
693         elsif (/^zlib-dynamic$/)
694                 { }
695         elsif (/^sse2$/)
696                 { $no_sse2 = 1; }
697         else
698                 {
699                 my ($ALGO, $algo);
700                 ($ALGO = $algo = $_) =~ tr/[\-a-z]/[_A-Z]/;
701
702                 if (/^asm$/ || /^err$/ || /^hw$/ || /^hw-/)
703                         {
704                         $openssl_other_defines .= "#define OPENSSL_NO_$ALGO\n";
705                         print " OPENSSL_NO_$ALGO";
706
707                         if (/^err$/)    { $flags .= "-DOPENSSL_NO_ERR "; }
708                         elsif (/^asm$/) { $no_asm = 1; }
709                         }
710                 else
711                         {
712                         ($ALGO,$algo) = ("RMD160","rmd160") if ($algo eq "ripemd");
713
714                         $openssl_algorithm_defines .= "#define OPENSSL_NO_$ALGO\n";
715                         print " OPENSSL_NO_$ALGO";
716
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";
721
722                         print " (skip dir)";
723
724                         $depflags .= " -DOPENSSL_NO_$ALGO";
725                         }
726                 }
727
728         print "\n";
729         }
730
731 my $exp_cflags = "";
732
733 foreach (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         }
742
743 print "Configuring for $target\n";
744
745 # Support for legacy targets having a name starting with 'debug-'
746 my ($d, $t) = $target =~ m/^(debug-)?(.*)$/;
747 if ($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 }
755 $config{target} = $target;
756 delete $table{$base_target}->{template}; # or the next test will fail.
757 my %target = ( %{$table{$base_target}}, resolve_config($target) );
758
759 &usage if (!%target || $target{template});
760
761 $exe_ext=".exe" if ($target eq "Cygwin" || $target eq "DJGPP" || $target =~ /^mingw/);
762 $exe_ext=".nlm" if ($target =~ /netware/);
763 $exe_ext=".pm"  if ($target =~ /vos/);
764
765 $default_ranlib = which("ranlib") || "true";
766 $config{perl}   = $ENV{'PERL'} || which("perl5") || which("perl") || "perl";
767 my $make        = $ENV{'MAKE'} || "make";
768
769 $cross_compile_prefix=$ENV{'CROSS_COMPILE'} if $cross_compile_prefix eq "";
770
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});
775
776
777 # Allow environment CC to override compiler...
778 $target{cc} = $ENV{CC} || $target{cc};
779
780 # For cflags and lflags, add the debug_ or release_ attributes
781 # Do it in such a way that no spurious space is appended (hence the grep).
782 my $cflags = join(" ",
783                   grep { $_ } ($target{cflags},
784                                $target{$build_prefix."cflags"}));
785 my $lflags = join(" ",
786                   grep { $_ } ($target{lflags},
787                                $target{$build_prefix."lflags"}));
788
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
796 # assume that it's not searched by linker automatically, in
797 # which case adding $target{multilib} suffix causes more grief than
798 # we're ready to tolerate, so don't...
799 $target{multilib}="" if !-d "$config{prefix}/lib$target{multilib}";
800
801 $libdir="lib$target{multilib}" if $libdir eq "";
802
803 $cflags = "$cflags$exp_cflags";
804
805 # '%' in $lflags is used to split flags to "pre-" and post-flags
806 my ($prelflags,$postlflags)=split('%',$lflags);
807 if (defined($postlflags))       { $lflags=$postlflags;  }
808 else                            { $lflags=$prelflags; undef $prelflags; }
809
810 if ($target =~ /^mingw/ && `$target{cc} --target-help 2>&1` !~ m/\-mno\-cygwin/m)
811         {
812         $cflags =~ s/\-mno\-cygwin\s*//;
813         $target{shared_ldflag} =~ s/\-mno\-cygwin\s*//;
814         }
815
816 if ($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
822 my $no_shared_warn=0;
823 my $no_user_cflags=0;
824
825 if ($flags ne "")       { $cflags="$flags$cflags"; }
826 else                    { $no_user_cflags=1;       }
827
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;
834 my $dso_cflags;
835 if (!$no_dso && $target{dso_scheme} ne "")
836         {
837         $target{dso_scheme} =~ tr/[a-z]/[A-Z]/;
838         if ($target{dso_scheme} eq "DLFCN")
839                 {
840                 $dso_cflags = "-DDSO_DLFCN -DHAVE_DLFCN_H";
841                 }
842         elsif ($target{dso_scheme} eq "DLFCN_NO_H")
843                 {
844                 $dso_cflags = "-DDSO_DLFCN";
845                 }
846         else
847                 {
848                 $dso_cflags = "-DDSO_$target{dso_scheme}";
849                 }
850         $cflags = "$dso_cflags $cflags";
851         }
852
853 my $thread_cflags;
854 my $thread_defines;
855 if ($target{thread_cflag} ne "(unknown)" && !$no_threads)
856         {
857         # If we know how to do it, support threads by default.
858         $threads = 1;
859         }
860 if ($target{thread_cflag} eq "(unknown)" && $threads)
861         {
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                 }
871         $thread_cflags="-DOPENSSL_THREADS $cflags" ;
872         $thread_defines .= "#define OPENSSL_THREADS\n";
873         }
874 else
875         {
876         $thread_cflags="-DOPENSSL_THREADS $target{thread_cflag} $cflags";
877         $thread_defines .= "#define OPENSSL_THREADS\n";
878 #       my $def;
879 #       foreach $def (split ' ',$target{thread_cflag})
880 #               {
881 #               if ($def =~ s/^-D// && $def !~ /^_/)
882 #                       {
883 #                       $thread_defines .= "#define $def\n";
884 #                       }
885 #               }
886         }
887
888 $lflags="$libs$lflags" if ($libs ne "");
889
890 if ($no_asm)
891         {
892         $cflags=~s/\-D[BL]_ENDIAN//             if ($fips);
893         $thread_cflags=~s/\-D[BL]_ENDIAN//      if ($fips);
894         }
895
896 if ($threads)
897         {
898         $cflags=$thread_cflags;
899         $openssl_thread_defines .= $thread_defines;
900         }
901
902 if ($zlib)
903         {
904         $cflags = "-DZLIB $cflags";
905         if (defined($disabled{"zlib-dynamic"}))
906                 {
907                 if (defined($withargs{"zlib-lib"}))
908                         {
909                         $lflags = "$lflags -L" . $withargs{"zlib-lib"} . " -lz";
910                         }
911                 else
912                         {
913                         $lflags = "$lflags -lz";
914                         }
915                 }
916         else
917                 {
918                 $cflags = "-DZLIB_SHARED $cflags";
919                 }
920         }
921
922 # With "deprecated" disable all deprecated features.
923 if (defined($disabled{"deprecated"})) {
924         $api = $maxapi;
925 }
926
927 # You will find shlib_mark1 and shlib_mark2 explained in Makefile.in
928 my $shared_mark = "";
929 if ($target{shared_target} eq "")
930         {
931         $no_shared_warn = 1 if !$no_shared && !$fips;
932         $no_shared = 1;
933         }
934 if (!$no_shared)
935         {
936         if ($target{shared_cflag} ne "")
937                 {
938                 $cflags = "$target{shared_cflag} -DOPENSSL_PIC $cflags";
939                 }
940         }
941
942 if ($target{build_scheme}->[0] ne "mk1mf")
943         {
944         # add {no-}static-engine to options to allow mkdef.pl to work without extra arguments
945         if ($no_shared)
946                 {
947                 $openssl_other_defines.="#define OPENSSL_NO_DYNAMIC_ENGINE\n";
948                 $config{options}.=" static-engine";
949                 }
950         else
951                 {
952                 $openssl_other_defines.="#define OPENSSL_NO_STATIC_ENGINE\n";
953                 $config{options}.=" no-static-engine";
954                 }
955         }
956
957 #
958 # Platform fix-ups
959 #
960 if ($target =~ /\-icc$/)        # Intel C compiler
961         {
962         my $iccver=0;
963         if (open(FD,"$target{cc} -V 2>&1 |"))
964                 {
965                 while(<FD>) { $iccver=$1 if (/Version ([0-9]+)\./); }
966                 close(FD);
967                 }
968         if ($iccver>=8)
969                 {
970                 $cflags=~s/\-KPIC/-fPIC/;
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                 }
976         if ($iccver>=9)
977                 {
978                 $lflags.=" -i-static";
979                 $lflags=~s/\-no_cpprt/-no-cpprt/;
980                 }
981         if ($iccver>=10)
982                 {
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/;
989                 }
990         }
991
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.
1000 if ($target =~ /^BSD\-/)
1001         {
1002         $target{shared_ldflag}.=" -Wl,-rpath,\$\$(LIBRPATH)" if ($config{prefix} !~ m|^/usr[/]*$|);
1003         }
1004
1005 if ($target{sys_id} ne "")
1006         {
1007         #$cflags="-DOPENSSL_SYS_$target{sys_id} $cflags";
1008         $openssl_sys_defines="#define OPENSSL_SYS_$target{sys_id}\n";
1009         }
1010
1011 if ($target{ranlib} eq "")
1012         {
1013         $target{ranlib} = $default_ranlib;
1014         }
1015
1016 if (!$no_asm) {
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/);
1019
1020     $target{bn_obj} =~ s/\w+-gf2m.o// if (defined($disabled{ec2m}));
1021
1022     # bn-586 is the only one implementing bn_*_part_words
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/);
1025
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/);
1029
1030     if ($fips) {
1031         $openssl_other_defines.="#define OPENSSL_FIPS\n";
1032     }
1033
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/) {
1039             if ($no_sse2) {
1040                 $target{sha1_obj} =~ s/\S*sse2\S+//;
1041             } elsif ($cflags !~ /OPENSSL_IA32_SSE2/) {
1042                 $cflags.=" -DOPENSSL_IA32_SSE2";
1043             }
1044         }
1045     }
1046     if ($target{md5_obj} =~ /\.o$/) {
1047         $cflags.=" -DMD5_ASM";
1048     }
1049     $target{cast_obj}=$table{BASE}->{cast_obj} if (!$no_shared); # CAST assembler is not PIC
1050     if ($target{rmd160_obj} =~ /\.o$/) {
1051         $cflags.=" -DRMD160_ASM";
1052     }
1053     if ($target{aes_obj} =~ /\.o$/) {
1054         $cflags.=" -DAES_ASM" if ($target{aes_obj} =~ m/\baes\-/);;
1055         # aes-ctr.o is not a real file, only indication that assembler
1056         # module implements AES_ctr32_encrypt...
1057         $cflags.=" -DAES_CTR_ASM" if ($target{aes_obj} =~ s/\s*aes\-ctr\.o//);
1058         # aes-xts.o indicates presence of AES_xts_[en|de]crypt...
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/);
1063     }
1064     if ($target{wp_obj} =~ /mmx/ && $processor eq "386") {
1065         $target{wp_obj}=$table{BASE}->{wp_obj};
1066     } elsif (!$disabled{"whirlpool"}) {
1067         $cflags.=" -DWHIRLPOOL_ASM";
1068     }
1069     if ($target{modes_obj} =~ /ghash\-/) {
1070         $cflags.=" -DGHASH_ASM";
1071     }
1072     if ($target{ec_obj} =~ /ecp_nistz256/) {
1073         $cflags.=" -DECP_NISTZ256_ASM";
1074     }
1075     if ($target{poly1305_obj} =~ /\.o$/) {
1076         $cflags.=" -DPOLY1305_ASM";
1077     }
1078 }
1079
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
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";
1092
1093 open(IN,'<include/openssl/opensslv.h') || die "unable to read opensslv.h:$!\n";
1094 while (<IN>)
1095         {
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 *"([^"]*)"/;
1100         }
1101 close(IN);
1102 if ($config{shlib_version_history} ne "") { $config{shlib_version_history} .= ":"; }
1103
1104 if ($config{version} =~ /(^[0-9]*)\.([0-9\.]*)/)
1105         {
1106         $config{major}=$1;
1107         $config{minor}=$2;
1108         }
1109
1110 if ($config{shlib_version_number} =~ /(^[0-9]*)\.([0-9\.]*)/)
1111         {
1112         $config{shlib_major}=$1;
1113         $config{shlib_minor}=$2;
1114         }
1115
1116 if (defined($api)) {
1117     my $apiflag = sprintf("-DOPENSSL_API_COMPAT=%s", $apitable->{$api});
1118     $default_depflags .= " $apiflag";
1119     $cflags .= " $apiflag";
1120 }
1121
1122 my $ecc = $target{cc};
1123 $ecc = "clang" if `$target{cc} --version 2>&1` =~ /clang/;
1124
1125 if ($strict_warnings)
1126         {
1127         my $wopt;
1128         die "ERROR --strict-warnings requires gcc or clang" unless ($ecc =~ /gcc(-\d(\.\d)*)?$/ or $ecc =~ /clang$/);
1129         foreach $wopt (split /\s+/, $gcc_devteam_warn)
1130                 {
1131                 $cflags .= " $wopt" unless ($cflags =~ /(^|\s)$wopt(\s|$)/)
1132                 }
1133         if ($ecc eq "clang")
1134                 {
1135                 foreach $wopt (split /\s+/, $clang_devteam_warn)
1136                         {
1137                         $cflags .= " $wopt" unless ($cflags =~ /(^|\s)$wopt(\s|$)/)
1138                         }
1139                 }
1140         if ($target !~ /^mingw/)
1141                 {
1142                 foreach $wopt (split /\s+/, $memleak_devteam_backtrace)
1143                         {
1144                         $cflags .= " $wopt" unless ($cflags =~ /(^|\s)$wopt(\s|$)/)
1145                         }
1146                 if ($target =~ /^BSD-/)
1147                         {
1148                         $lflags .= " -lexecinfo";
1149                         }
1150                 }
1151         }
1152
1153 # Write down our configuration where it fits #########################
1154
1155 open(OUT,">configdata.pm") || die "unable to create configdata.pm: $!\n";
1156 print OUT <<"EOF";
1157 package configdata;
1158
1159 use strict;
1160 use warnings;
1161
1162 use Exporter;
1163 #use vars qw(\@ISA \@EXPORT);
1164 our \@ISA = qw(Exporter);
1165 our \@EXPORT = qw(\%config \%target);
1166
1167 EOF
1168 print OUT "our %config = (\n";
1169 foreach (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 }
1178 print OUT <<"EOF";
1179 );
1180
1181 EOF
1182 print OUT "our %target = (\n";
1183 foreach (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 }
1192 print OUT <<"EOF";
1193 );
1194
1195 1;
1196 EOF
1197 close(OUT);
1198
1199 open(IN,"<Makefile.in") || die "unable to read Makefile.in: $!\n";
1200 open(OUT,">$Makefile.new") || die "unable to create $Makefile.new:$!\n";
1201 print OUT "### Generated automatically from Makefile.in by Configure.\n\n";
1202 my $sdirs=0;
1203
1204 while (<IN>)
1205         {
1206         chomp;
1207         $sdirs = 1 if /^SDIRS=/;
1208         if ($sdirs) {
1209                 my $dir;
1210                 foreach $dir (@skip) {
1211                         s/(\s)$dir /$1/;
1212                         s/\s$dir$//;
1213                         }
1214                 }
1215         $sdirs = 0 unless /\\$/;
1216         s/fips // if (/^DIRS=/ && !$fips);
1217         s/engines // if (/^DIRS=/ && $disabled{"engine"});
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}/;
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}/;
1229         s/^LIBDIR=.*$/LIBDIR=$libdir/;
1230         s/^INSTALL_PREFIX=.*$/INSTALL_PREFIX=$install_prefix/;
1231         s/^PLATFORM=.*$/PLATFORM=$target/;
1232         s/^OPTIONS=.*$/OPTIONS=$config{options}/;
1233         my $argvstring = "(".join(", ", map { quotify("perl", $_) } @argvcopy).")";
1234         s/^CONFIGURE_ARGS=.*$/CONFIGURE_ARGS=$argvstring/;
1235         if ($cross_compile_prefix)
1236                 {
1237                 s/^CC=.*$/CROSS_COMPILE= $cross_compile_prefix\nCC= \$\(CROSS_COMPILE\)$target{cc}/;
1238                 s/^AR=\s*/AR= \$\(CROSS_COMPILE\)/;
1239                 s/^NM=\s*/NM= \$\(CROSS_COMPILE\)/;
1240                 s/^RANLIB=\s*/RANLIB= \$\(CROSS_COMPILE\)/;
1241                 s/^MAKEDEPPROG=.*$/MAKEDEPPROG= \$\(CROSS_COMPILE\)$target{cc}/ if $target{cc} eq "gcc";
1242                 }
1243         else    {
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";
1248                 }
1249         s/^CFLAG=.*$/CFLAG= $cflags/;
1250         s/^DEPFLAG=.*$/DEPFLAG=$depflags/;
1251         s/^PEX_LIBS=.*$/PEX_LIBS= $prelflags/;
1252         s/^EX_LIBS=.*$/EX_LIBS= $lflags/;
1253         s/^EXE_EXT=.*$/EXE_EXT= $exe_ext/;
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}/;
1273         s/^PROCESSOR=.*/PROCESSOR= $processor/;
1274         s/^ARFLAGS=.*/ARFLAGS= $target{arflags}/;
1275         s/^PERL=.*/PERL= $config{perl}/;
1276         s/^LIBZLIB=.*/LIBZLIB=$withargs{"zlib-lib"}/;
1277         s/^ZLIB_INCLUDE=.*/ZLIB_INCLUDE=$withargs{"zlib-include"}/;
1278         s/^FIPSLIBDIR=.*/FIPSLIBDIR=$fipslibdir/;
1279         s/^FIPSCANLIB=.*/FIPSCANLIB=libcrypto/ if $fips;
1280         s/^SHARED_FIPS=.*/SHARED_FIPS=/;
1281         s/^SHLIBDIRS=.*/SHLIBDIRS= crypto ssl/;
1282         s/^BASEADDR=.*/BASEADDR=$baseaddr/;
1283         s/^SHLIB_TARGET=.*/SHLIB_TARGET=$target{shared_target}/;
1284         s/^SHLIB_MARK=.*/SHLIB_MARK=$shared_mark/;
1285         s/^SHARED_LIBS=.*/SHARED_LIBS=\$(SHARED_CRYPTO) \$(SHARED_SSL)/ if (!$no_shared);
1286         if ($target{shared_extension} ne "" && $target{shared_extension} =~ /^\.s([ol])\.[^\.]*$/)
1287                 {
1288                 my $sotmp = $1;
1289                 s/^SHARED_LIBS_LINK_EXTS=.*/SHARED_LIBS_LINK_EXTS=.s$sotmp/;
1290                 }
1291         elsif ($target{shared_extension} ne "" && $target{shared_extension} =~ /^\.[^\.]*\.dylib$/)
1292                 {
1293                 s/^SHARED_LIBS_LINK_EXTS=.*/SHARED_LIBS_LINK_EXTS=.dylib/;
1294                 }
1295         elsif ($target{shared_extension} ne "" && $target{shared_extension} =~ /^\.s([ol])\.[^\.]*\.[^\.]*$/)
1296                 {
1297                 my $sotmp = $1;
1298                 s/^SHARED_LIBS_LINK_EXTS=.*/SHARED_LIBS_LINK_EXTS=.s$sotmp.\$(SHLIB_MAJOR) .s$sotmp/;
1299                 }
1300         elsif ($target{shared_extension} ne "" && $target{shared_extension} =~ /^\.[^\.]*\.[^\.]*\.dylib$/)
1301                 {
1302                 s/^SHARED_LIBS_LINK_EXTS=.*/SHARED_LIBS_LINK_EXTS=.\$(SHLIB_MAJOR).dylib .dylib/;
1303                 }
1304         s/^SHARED_LDFLAGS=.*/SHARED_LDFLAGS=$target{shared_ldflag}/;
1305         print OUT $_."\n";
1306         }
1307 close(IN);
1308 close(OUT);
1309 rename("$Makefile.new",$Makefile) || die "unable to rename $Makefile.new\n";
1310
1311 print "IsMK1MF       =", ($target{build_scheme}->[0] eq "mk1mf" ? "yes" : "no"), "\n";
1312 print "CC            =$target{cc}\n";
1313 print "CFLAG         =$cflags\n";
1314 print "EX_LIBS       =$lflags\n";
1315 print "CPUID_OBJ     =$target{cpuid_obj}\n";
1316 print "BN_ASM        =$target{bn_obj}\n";
1317 print "EC_ASM        =$target{ec_obj}\n";
1318 print "DES_ENC       =$target{des_obj}\n";
1319 print "AES_ENC       =$target{aes_obj}\n";
1320 print "BF_ENC        =$target{bf_obj}\n";
1321 print "CAST_ENC      =$target{cast_obj}\n";
1322 print "RC4_ENC       =$target{rc4_obj}\n";
1323 print "RC5_ENC       =$target{rc5_obj}\n";
1324 print "MD5_OBJ_ASM   =$target{md5_obj}\n";
1325 print "SHA1_OBJ_ASM  =$target{sha1_obj}\n";
1326 print "RMD160_OBJ_ASM=$target{rmd160_obj}\n";
1327 print "CMLL_ENC      =$target{cmll_obj}\n";
1328 print "MODES_OBJ     =$target{modes_obj}\n";
1329 print "ENGINES_OBJ   =$target{engines_obj}\n";
1330 print "CHACHA_ENC    =$target{chacha_obj}\n";
1331 print "POLY1305_OBJ  =$target{poly1305_obj}\n";
1332 print "PROCESSOR     =$processor\n";
1333 print "RANLIB        =$target{ranlib}\n";
1334 print "ARFLAGS       =$target{arflags}\n";
1335 print "PERL          =$config{perl}\n";
1336
1337 my $des_ptr=0;
1338 my $des_risc1=0;
1339 my $des_risc2=0;
1340 my $des_unroll=0;
1341 my $bn_ll=0;
1342 my $def_int=2;
1343 my $rc4_int=$def_int;
1344 my $md2_int=$def_int;
1345 my $idea_int=$def_int;
1346 my $rc2_int=$def_int;
1347 my $rc4_idx=0;
1348 my $rc4_chunk=0;
1349 my $bf_ptr=0;
1350 my @type=("char","short","int","long");
1351 my ($b64l,$b64,$b32,$b16,$b8)=(0,0,1,0,0);
1352 my $export_var_as_fn=0;
1353
1354 my $des_int;
1355
1356 foreach (sort split(/\s+/,$target{bn_ops}))
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/;
1367         $rc4_chunk=1 if /RC4_CHUNK/;
1368         $rc4_chunk=2 if /RC4_CHUNK_LL/;
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";
1377         ($b64l,$b64,$b32,$b16,$b8)=(0,1,0,0,0) if /SIXTY_FOUR_BIT/;
1378         ($b64l,$b64,$b32,$b16,$b8)=(1,0,0,0,0) if /SIXTY_FOUR_BIT_LONG/;
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/;
1382         $export_var_as_fn=1 if /EXPORT_VAR_AS_FN/;
1383         }
1384
1385 open(IN,'<crypto/opensslconf.h.in') || die "unable to read crypto/opensslconf.h.in:$!\n";
1386 open(OUT,'>include/openssl/opensslconf.h.new') || die "unable to create include/openssl/opensslconf.h.new:$!\n";
1387 print OUT "/* opensslconf.h */\n";
1388 print OUT "/* WARNING: Generated automatically from opensslconf.h.in by Configure. */\n\n";
1389
1390 print OUT "#ifdef  __cplusplus\n";
1391 print OUT "extern \"C\" {\n";
1392 print OUT "#endif\n";
1393 print OUT "/* OpenSSL was configured with the following options: */\n";
1394
1395 my $openssl_api_defines = "";
1396 if (defined($api)) {
1397     $openssl_api_defines = sprintf "#define OPENSSL_MIN_API %s\n", $apitable->{$api};
1398 }
1399 my $openssl_algorithm_defines_trans = $openssl_algorithm_defines;
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;
1401 $openssl_algorithm_defines_trans =~ s/^\s*#\s*define\s+OPENSSL_(.*)/# if defined(OPENSSL_$1) \&\& !defined($1)\n#  define $1\n# endif/mg;
1402 $openssl_algorithm_defines =~ s/^\s*#\s*define\s+(.*)/#ifndef $1\n# define $1\n#endif/mg;
1403 $openssl_algorithm_defines = "   /* no ciphers excluded */\n" if $openssl_algorithm_defines eq "";
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;
1407
1408 print OUT $openssl_sys_defines;
1409 print OUT "#ifndef OPENSSL_DOING_MAKEDEPEND\n\n";
1410 print OUT $openssl_experimental_defines;
1411 print OUT $openssl_api_defines;
1412 print OUT "\n";
1413 print OUT $openssl_algorithm_defines;
1414 print OUT "\n#endif /* OPENSSL_DOING_MAKEDEPEND */\n\n";
1415 print OUT $openssl_thread_defines;
1416 print OUT $openssl_other_defines,"\n";
1417
1418 print OUT "/* The OPENSSL_NO_* macros are also defined as NO_* if the application\n";
1419 print OUT "   asks for it.  This is a transient feature that is provided for those\n";
1420 print OUT "   who haven't had the time to do the appropriate changes in their\n";
1421 print OUT "   applications.  */\n";
1422 print OUT "#ifdef OPENSSL_ALGORITHM_DEFINES\n";
1423 print OUT $openssl_algorithm_defines_trans;
1424 print OUT "#endif\n\n";
1425
1426 print OUT "#define OPENSSL_CPUID_OBJ\n\n" if ($target{cpuid_obj} ne "mem_clr.o");
1427
1428 while (<IN>)
1429         {
1430         if      (/^#define\s+OPENSSLDIR/)
1431                 {
1432                 my $foo = $config{openssldir};
1433                 $foo =~ s/\\/\\\\/g;
1434                 print OUT "#define OPENSSLDIR \"$foo\"\n";
1435                 }
1436         elsif   (/^#define\s+ENGINESDIR/)
1437                 {
1438                 my $foo = "$config{prefix}/$libdir/engines";
1439                 $foo =~ s/\\/\\\\/g;
1440                 print OUT "#define ENGINESDIR \"$foo\"\n";
1441                 }
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"; }
1447         elsif   (/^#define\s+OPENSSL_UNISTD/)
1448                 {
1449                 print OUT "#define OPENSSL_UNISTD $target{unistd}\n";
1450                 }
1451         elsif   (/^#((define)|(undef))\s+SIXTY_FOUR_BIT_LONG/)
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"; }
1463         elsif   (/^\#define\s+OSSL_DES_LONG\s+.*/)
1464                 { printf OUT "#define OSSL_DES_LONG unsigned %s\n",
1465                         ($des_int)?'int':'long'; }
1466         elsif   (/^\#(define|undef)\s+DES_PTR/)
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'; }
1474         elsif   (/^#define\s+RC4_INT\s/)
1475                 { printf OUT "#define RC4_INT unsigned %s\n",$type[$rc4_int]; }
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                 }
1482         elsif   (/^#((define)|(undef))\s+RC4_INDEX/)
1483                 { printf OUT "#%s RC4_INDEX\n",($rc4_idx)?"define":"undef"; }
1484         elsif (/^#(define|undef)\s+I386_ONLY/)
1485                 { printf OUT "#%s I386_ONLY\n", ($processor eq "386")?
1486                         "define":"undef"; }
1487         elsif   (/^#define\s+MD2_INT\s/)
1488                 { printf OUT "#define MD2_INT unsigned %s\n",$type[$md2_int]; }
1489         elsif   (/^#define\s+IDEA_INT\s/)
1490                 {printf OUT "#define IDEA_INT unsigned %s\n",$type[$idea_int];}
1491         elsif   (/^#define\s+RC2_INT\s/)
1492                 {printf OUT "#define RC2_INT unsigned %s\n",$type[$rc2_int];}
1493         elsif (/^#(define|undef)\s+BF_PTR/)
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;
1498                 }
1499         else
1500                 { print OUT $_; }
1501         }
1502 close(IN);
1503 print OUT "#ifdef  __cplusplus\n";
1504 print OUT "}\n";
1505 print OUT "#endif\n";
1506 close(OUT);
1507 rename("include/openssl/opensslconf.h.new","include/openssl/opensslconf.h") || die "unable to rename include/openssl/opensslconf.h.new\n";
1508
1509
1510 # Fix the date
1511
1512 print "SIXTY_FOUR_BIT_LONG mode\n" if $b64l;
1513 print "SIXTY_FOUR_BIT mode\n" if $b64;
1514 print "THIRTY_TWO_BIT mode\n" if $b32;
1515 print "SIXTEEN_BIT mode\n" if $b16;
1516 print "EIGHT_BIT mode\n" if $b8;
1517 print "DES_PTR used\n" if $des_ptr;
1518 print "DES_RISC1 used\n" if $des_risc1;
1519 print "DES_RISC2 used\n" if $des_risc2;
1520 print "DES_UNROLL used\n" if $des_unroll;
1521 print "DES_INT used\n" if $des_int;
1522 print "BN_LLONG mode\n" if $bn_ll;
1523 print "RC4 uses u$type[$rc4_int]\n" if $rc4_int != $def_int;
1524 print "RC4_INDEX mode\n" if $rc4_idx;
1525 print "RC4_CHUNK is undefined\n" if $rc4_chunk==0;
1526 print "RC4_CHUNK is unsigned long\n" if $rc4_chunk==1;
1527 print "RC4_CHUNK is unsigned long long\n" if $rc4_chunk==2;
1528 print "MD2 uses u$type[$md2_int]\n" if $md2_int != $def_int;
1529 print "IDEA uses u$type[$idea_int]\n" if $idea_int != $def_int;
1530 print "RC2 uses u$type[$rc2_int]\n" if $rc2_int != $def_int;
1531 print "BF_PTR used\n" if $bf_ptr == 1;
1532 print "BF_PTR2 used\n" if $bf_ptr == 2;
1533
1534 # Copy all Makefile.in to Makefile (except top-level)
1535 use File::Find;
1536 use IO::File;
1537 find(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
1551             die sprintf "Error writing Makefile in %s: !$\n",
1552                 $File::Find::dir;
1553     }, ".");
1554
1555 my %builders = (
1556     unixmake => sub {
1557         my $make_command = "$make PERL=\'$config{perl}\'";
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 "";
1562         if ($depflags ne $default_depflags && !$make_depend) {
1563             $warn_make_depend++;
1564         }
1565     },
1566     mk1mf => sub {
1567         open (OUT,">crypto/buildinf.h") || die "Can't open buildinf.h";
1568         printf OUT <<"EOF";
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
1576 EOF
1577         close(OUT);
1578
1579         # create the ms/version32.rc file if needed
1580         if (! grep /^netware/, @{$target{build_scheme}}) {
1581             my ($v1, $v2, $v3, $v4);
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) {
1583                 $v1=hex $1;
1584                 $v2=hex $2;
1585                 $v3=hex $3;
1586                 $v4=hex $4;
1587             }
1588             open (OUT,">ms/version32.rc") || die "Can't open ms/version32.rc";
1589             print OUT <<"EOF";
1590 #include <winver.h>
1591
1592 LANGUAGE 0x09,0x01
1593
1594 1 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
1606 BEGIN
1607     BLOCK "StringFileInfo"
1608     BEGIN
1609         BLOCK "040904b0"
1610         BEGIN
1611             // Required:
1612             VALUE "CompanyName", "The OpenSSL Project, http://www.openssl.org/\\0"
1613             VALUE "FileDescription", "OpenSSL Shared Library\\0"
1614             VALUE "FileVersion", "$config{version}\\0"
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"
1621 #endif
1622             VALUE "ProductName", "The OpenSSL Toolkit\\0"
1623             VALUE "ProductVersion", "$config{version}\\0"
1624             // Optional:
1625             //VALUE "Comments", "\\0"
1626             VALUE "LegalCopyright", "Copyright © 1998-2015 The OpenSSL Project. Copyright © 1995-1998 Eric A. Young, Tim J. Hudson. All rights reserved.\\0"
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
1636 END
1637 EOF
1638             close(OUT);
1639         }
1640     },
1641     );
1642
1643 my ($builder, @builder_opts) = @{$target{build_scheme}};
1644 $builders{$builder}->(@builder_opts);
1645
1646 print <<"EOF";
1647
1648 Configured for $target.
1649 EOF
1650
1651 print <<"EOF" if (!$no_threads && !$threads);
1652
1653 The library could not be configured for supporting multi-threaded
1654 applications as the compiler options required on this system are not known.
1655 See file INSTALL for details if you need multi-threading.
1656 EOF
1657
1658 print <<"EOF" if ($no_shared_warn);
1659
1660 You gave the option 'shared', which is not supported on this platform, so
1661 we will pretend you gave the option 'no-shared'.  If you know how to implement
1662 shared libraries, please let us know (but please first make sure you have
1663 tried with a current version of OpenSSL).
1664 EOF
1665
1666 print <<"EOF" if ($warn_make_depend);
1667
1668 *** Because of configuration changes, you MUST do the following before
1669 *** building:
1670
1671         make depend
1672 EOF
1673
1674 exit(0);
1675
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 #
1688 sub asm {
1689     my @x = @_;
1690     sub {
1691         $no_asm ? () : @x;
1692     }
1693 }
1694
1695 # Helper function to implement adding values to already existing configuration
1696 # values.  It handles elements that are ARRAYs, CODEs and scalars
1697 sub _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 }
1721 sub add_before {
1722     my $separator = shift;
1723     my @x = @_;
1724     sub { _add($separator, @x, @_) };
1725 }
1726 sub add {
1727     my $separator = shift;
1728     my @x = @_;
1729     sub { _add($separator, @_, @x) };
1730 }
1731
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.
1735 sub 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
1771 sub 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.
1825     my $default_combiner = add(" ");
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{$_}});
1845         } elsif ($valuetype eq "ARRAY" || $valuetype eq "") {
1846             # ARRAY or Scalar, just leave it as is.
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
1859 sub usage
1860         {
1861         print STDERR $usage;
1862         print STDERR "\npick os/compiler from:\n";
1863         my $j=0;
1864         my $i;
1865         my $k=0;
1866         foreach $i (sort keys %table)
1867                 {
1868                 next if $table{$i}->{template};
1869                 next if $i =~ /^debug/;
1870                 $k += length($i) + 1;
1871                 if ($k > 78)
1872                         {
1873                         print STDERR "\n";
1874                         $k=length($i);
1875                         }
1876                 print STDERR $i . " ";
1877                 }
1878         foreach $i (sort keys %table)
1879                 {
1880                 next if $table{$i}->{template};
1881                 next if $i !~ /^debug/;
1882                 $k += length($i) + 1;
1883                 if ($k > 78)
1884                         {
1885                         print STDERR "\n";
1886                         $k=length($i);
1887                         }
1888                 print STDERR $i . " ";
1889                 }
1890         print STDERR "\n\nNOTE: If in doubt, on Unix-ish systems use './config'.\n";
1891         exit(1);
1892         }
1893
1894 # Configuration printer ##############################################
1895
1896 sub 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
1963 sub which
1964         {
1965         my($name)=@_;
1966         my $path;
1967         foreach $path (split /:/, $ENV{PATH})
1968                 {
1969                 if (-f "$path/$name$exe_ext" and -x _)
1970                         {
1971                         return "$path/$name$exe_ext" unless ($name eq "perl" and
1972                          system("$path/$name$exe_ext -e " . '\'exit($]<5.0);\''));
1973                         }
1974                 }
1975         }
1976
1977 sub print_table_entry
1978         {
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}
2028 EOF
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";
2076                 }
2077             }
2078             print "    },\n";
2079         }
2080         }
2081
2082 sub 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 }