blob: efbe0f8587132c3c0eebfb4bb5c5db1a958881cd [file] [log] [blame]
Richard Levittede17db92015-11-24 14:06:45 +01001#! /usr/bin/env perl
Jacob Bandes-Storchf4d8f032015-11-23 21:44:58 -08002# -*- mode: perl; -*-
Richard Levittede17db92015-11-24 14:06:45 +01003
Ralf S. Engelschalla4ed5531999-02-25 08:48:52 +00004## Configure -- OpenSSL source tree configuration script
Ben Laurie1641cb61998-12-28 17:08:48 +00005
Ben Laurie448cb8b1998-12-28 17:37:17 +00006require 5.000;
Ben Laurie1641cb61998-12-28 17:08:48 +00007use strict;
Rich Salzf09e7ca2015-02-24 17:40:22 -05008use File::Basename;
Richard Levitte85152ca2016-02-02 19:47:05 +01009use File::Spec::Functions qw/:DEFAULT abs2rel rel2abs/;
Richard Levittedca99382016-02-08 16:27:15 +010010use File::Path qw/mkpath/;
Ben Laurie1641cb61998-12-28 17:08:48 +000011
Ulf Möller22a4f961999-04-19 13:54:11 +000012# see INSTALL for instructions.
Ulf Möller462ba4f1999-04-24 22:59:36 +000013
Rich Salze4ef2e22016-02-10 11:10:39 -050014my $usage="Usage: Configure [no-<cipher> ...] [enable-<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";
Ulf Möller462ba4f1999-04-24 22:59:36 +000015
Ulf Möller434c5dd1999-04-19 15:19:58 +000016# Options:
Bodo Möllere5f30451999-04-29 21:52:08 +000017#
Rich Salzf09e7ca2015-02-24 17:40:22 -050018# --config add the given configuration file, which will be read after
19# any "Configurations*" files that are found in the same
20# directory as this script.
Richard Levitted74dfaf2016-01-20 18:11:51 +010021# --prefix prefix for the OpenSSL installation, which includes the
22# directories bin, lib, include, share/man, share/doc/openssl
23# This becomes the value of INSTALLTOP in Makefile
24# (Default: /usr/local)
25# --openssldir OpenSSL data area, such as openssl.cnf, certificates and keys.
26# If it's a relative directory, it will be added on the directory
27# given with --prefix.
28# This becomes the value of OPENSSLDIR in Makefile and in C.
29# (Default: PREFIX/ssl)
Bodo Möllere5f30451999-04-29 21:52:08 +000030#
Andy Polyakovcbfb39d2006-10-21 13:38:16 +000031# --cross-compile-prefix Add specified prefix to binutils components.
32#
Viktor Dukhovni98186eb2016-01-04 23:00:33 -050033# --api One of 0.9.8, 1.0.0 or 1.1.0. Do not compile support for
34# interfaces deprecated as of the specified OpenSSL version.
35#
Richard Levitte5270e702000-10-26 21:07:28 +000036# no-hw-xxx do not compile support for specific crypto hardware.
37# Generic OpenSSL-style methods relating to this support
38# are always compiled but return NULL if the hardware
39# support isn't compiled.
40# no-hw do not compile support for any crypto hardware.
Bodo Möller5f8d5c91999-04-29 16:10:09 +000041# [no-]threads [don't] try to create a library that is suitable for
42# multithreaded applications (default is "threads" if we
43# know how to do it)
Richard Levittefcc6a1c2000-08-02 04:19:50 +000044# [no-]shared [don't] try to create shared libraries when supported.
Richard Levitteae482422016-02-22 02:09:11 +010045# [no-]pic [don't] try to build position independent code when supported.
Richard Levitte45b71ab2016-02-22 15:57:25 +010046# If disabled, it also disables shared and dynamic-engine.
Ulf Möllera7239791999-04-19 14:55:56 +000047# no-asm do not use assembler
Geoff Thorpebc2aada2000-04-06 07:09:45 +000048# no-dso do not compile in any native shared-library methods. This
49# will ensure that all methods just return NULL.
Benjamin Kaduk0423f812016-01-12 18:02:16 -060050# no-egd do not compile support for the entropy-gathering daemon APIs
Richard Levittee452de92001-07-12 09:11:14 +000051# [no-]zlib [don't] compile support for zlib compression.
52# zlib-dynamic Like "zlib", but the zlib library is expected to be a shared
53# library and will be loaded in run-time by the OpenSSL library.
Dr. Stephen Henson7e159e02011-12-25 14:45:15 +000054# sctp include SCTP support
Ulf Möller22a4f961999-04-19 13:54:11 +000055# 386 generate 80386 code
Matt Caswell8b1a5af2016-03-03 15:40:51 +000056# enable-weak-ssl-ciphers
57# Enable weak ciphers that are disabled by default. This currently
58# only includes RC4 based ciphers.
Andy Polyakovd0590fe2004-07-18 16:19:34 +000059# no-sse2 disables IA-32 SSE2 code, above option implies no-sse2
Ulf Möller79df9d61999-04-27 03:19:12 +000060# no-<cipher> build without specified algorithm (rsa, idea, rc5, ...)
Felix Laurie von Massenbachfce0ba52014-05-26 17:19:28 +010061# -<xxx> +<xxx> compiler options are passed through
Geoff Thorpee41c8d62000-06-01 05:13:52 +000062#
63# DEBUG_SAFESTACK use type-safe stacks to enforce type-safety on stack items
64# provided to stack calls. Generates unique stack functions for
65# each possible stack type.
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +000066# BN_LLONG use the type 'long long' in crypto/bn/bn.h
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +000067# RC4_CHAR use 'char' instead of 'int' for RC4_INT in crypto/rc4/rc4.h
Andy Polyakovd0590fe2004-07-18 16:19:34 +000068# Following are set automatically by this script
69#
Ralf S. Engelschall58964a41998-12-21 10:56:39 +000070# MD5_ASM use some extra md5 assember,
71# SHA1_ASM use some extra sha1 assember, must define L_ENDIAN for x86
72# RMD160_ASM use some extra ripemd160 assember,
Andy Polyakovd0590fe2004-07-18 16:19:34 +000073# SHA256_ASM sha256_block is implemented in assembler
74# SHA512_ASM sha512_block is implemented in assembler
75# AES_ASM ASE_[en|de]crypt is implemented in assembler
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +000076
Dr. Stephen Henson363bd0b2009-01-11 15:56:32 +000077# Minimum warning options... any contributions to OpenSSL should at least get
Felix Laurie von Massenbachfce0ba52014-05-26 17:19:28 +010078# past these.
Dr. Stephen Henson363bd0b2009-01-11 15:56:32 +000079
Rich Salzd63a5e52016-02-18 11:33:21 -050080my $gcc_devteam_warn = "-DPEDANTIC -DREF_DEBUG -DDEBUG_UNUSED -DBIO_DEBUG"
Rich Salz8bccbce2016-02-13 12:27:11 -050081 . " -pedantic"
82 . " -Wall"
83 . " -Wno-long-long"
84 . " -Wsign-compare"
85 . " -Wmissing-prototypes"
86 . " -Wshadow"
87 . " -Wformat"
88 . " -Wtype-limits"
89 . " -Werror"
90 ;
Dr. Stephen Henson363bd0b2009-01-11 15:56:32 +000091
Ben Laurie190c8c62015-04-19 14:10:54 +010092# These are used in addition to $gcc_devteam_warn when the compiler is clang.
93# TODO(openssl-team): fix problems and investigate if (at least) the
Ben Laurie480405e2015-08-02 02:45:44 +010094# following warnings can also be enabled:
Rich Salz8bccbce2016-02-13 12:27:11 -050095# -Wswitch-enum
Rich Salz8bccbce2016-02-13 12:27:11 -050096# -Wcast-align
97# -Wunreachable-code
Rich Salza773b522016-02-13 22:33:56 -050098# -Wlanguage-extension-token -- no, we use asm()
99# -Wunused-macros -- no, too tricky for BN and _XOPEN_SOURCE etc
100# -Wextended-offsetof -- no, needed in CMS ASN1 code
Rich Salz8bccbce2016-02-13 12:27:11 -0500101my $clang_devteam_warn = ""
102 . " -Qunused-arguments"
103 . " -Wextra"
104 . " -Wno-unused-parameter"
105 . " -Wno-missing-field-initializers"
106 . " -Wno-language-extension-token"
107 . " -Wno-extended-offsetof"
108 . " -Wconditional-uninitialized"
109 . " -Wincompatible-pointer-types-discards-qualifiers"
110 . " -Wmissing-variable-declarations"
111 ;
Emilia Kaspercb2bc052015-01-05 13:46:26 +0100112
Richard Levitteef8ca6b2016-02-14 12:16:52 +0100113# This adds backtrace information to the memory leak info. Is only used
114# when crypto-mdebug-backtrace is enabled.
115my $memleak_devteam_backtrace = "-rdynamic";
Richard Levittea1d3f3d2015-12-02 18:44:26 +0100116
Dr. Stephen Henson0c28f272009-09-09 16:31:32 +0000117my $strict_warnings = 0;
118
Andy Polyakovb7efa562005-01-24 14:38:14 +0000119# As for $BSDthreads. Idea is to maintain "collective" set of flags,
Felix Laurie von Massenbachfce0ba52014-05-26 17:19:28 +0100120# which would cover all BSD flavors. -pthread applies to them all,
Andy Polyakovb7efa562005-01-24 14:38:14 +0000121# but is treated differently. OpenBSD expands is as -D_POSIX_THREAD
122# -lc_r, which is sufficient. FreeBSD 4.x expands it as -lc_r,
123# which has to be accompanied by explicit -D_THREAD_SAFE and
124# sometimes -D_REENTRANT. FreeBSD 5.x expands it as -lc_r, which
125# seems to be sufficient?
Richard Levitte9c62a272016-02-27 16:51:34 +0100126our $BSDthreads="-pthread -D_THREAD_SAFE -D_REENTRANT";
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000127
Viktor Dukhovni98186eb2016-01-04 23:00:33 -0500128#
129# API compability name to version number mapping.
130#
131my $maxapi = "1.1.0"; # API for "no-deprecated" builds
132my $apitable = {
133 "1.1.0" => "0x10100000L",
134 "1.0.0" => "0x10000000L",
135 "0.9.8" => "0x00908000L",
136};
137
Richard Levitte9e0724a2015-05-18 02:54:28 +0200138our %table = ();
Richard Levitte291e94d2015-05-18 22:35:23 +0200139our %config = ();
Richard Levitte98fdbce2016-02-27 11:37:33 +0100140our %withargs = ();
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000141
Richard Levittebd5192b2015-05-18 02:57:24 +0200142# Forward declarations ###############################################
Andy Polyakov7ead0c82015-03-16 22:33:36 +0100143
Richard Levittebd5192b2015-05-18 02:57:24 +0200144# read_config(filename)
145#
146# Reads a configuration file and populates %table with the contents
147# (which the configuration file places in %targets).
148sub read_config;
Andy Polyakov7ead0c82015-03-16 22:33:36 +0100149
Richard Levittebd5192b2015-05-18 02:57:24 +0200150# resolve_config(target)
151#
152# Resolves all the late evalutations, inheritances and so on for the
153# chosen target and any target it inherits from.
154sub resolve_config;
Richard Levitteaaf878c2015-03-06 02:00:21 +0100155
Rich Salzf09e7ca2015-02-24 17:40:22 -0500156
Richard Levitte107b5792015-05-20 20:03:20 +0200157# Information collection #############################################
158
Richard Levitte9fe2bb72016-01-29 19:45:51 +0100159# Unified build supports separate build dir
Richard Levitteec182ef2016-02-09 10:15:13 +0100160my $srcdir = catdir(absolutedir(dirname($0))); # catdir ensures local syntax
161my $blddir = catdir(absolutedir(".")); # catdir ensures local syntax
Richard Levitte9fe2bb72016-01-29 19:45:51 +0100162my $dofile = abs2rel(catfile($srcdir, "util/dofile.pl"));
163
164$config{sourcedir} = abs2rel($srcdir);
165$config{builddir} = abs2rel($blddir);
166
Richard Levitte107b5792015-05-20 20:03:20 +0200167# Collect version numbers
168$config{version} = "unknown";
169$config{version_num} = "unknown";
170$config{shlib_version_number} = "unknown";
171$config{shlib_version_history} = "unknown";
172
173collect_information(
Richard Levitte9fe2bb72016-01-29 19:45:51 +0100174 collect_from_file(catfile($srcdir,'include/openssl/opensslv.h')),
Richard Levitte107b5792015-05-20 20:03:20 +0200175 qr/OPENSSL.VERSION.TEXT.*OpenSSL (\S+) / => sub { $config{version} = $1; },
176 qr/OPENSSL.VERSION.NUMBER.*(0x\S+)/ => sub { $config{version_num}=$1 },
177 qr/SHLIB_VERSION_NUMBER *"([^"]+)"/ => sub { $config{shlib_version_number}=$1 },
178 qr/SHLIB_VERSION_HISTORY *"([^"]*)"/ => sub { $config{shlib_version_history}=$1 }
179 );
180if ($config{shlib_version_history} ne "") { $config{shlib_version_history} .= ":"; }
181
182($config{major}, $config{minor})
183 = ($config{version} =~ /^([0-9]+)\.([0-9\.]+)/);
184($config{shlib_major}, $config{shlib_minor})
185 = ($config{shlib_version_number} =~ /^([0-9]+)\.([0-9\.]+)/);
186die "erroneous version information in opensslv.h: ",
187 "$config{major}, $config{minor}, $config{shlib_major}, $config{shlib_minor}\n"
188 if ($config{major} eq "" || $config{minor} eq ""
189 || $config{shlib_major} eq "" || $config{shlib_minor} eq "");
190
191# Collect target configurations
192
Richard Levitte85152ca2016-02-02 19:47:05 +0100193my $pattern = catfile(dirname($0), "Configurations", "*.conf");
Richard Levitte97a0cc52015-03-11 10:22:50 +0100194foreach (sort glob($pattern) ) {
Rich Salzf09e7ca2015-02-24 17:40:22 -0500195 &read_config($_);
196}
197
Richard Levitte291e94d2015-05-18 22:35:23 +0200198
Richard Levitte107b5792015-05-20 20:03:20 +0200199print "Configuring OpenSSL version $config{version} (0x$config{version_num})\n";
200
Richard Levitte291e94d2015-05-18 22:35:23 +0200201$config{prefix}="";
202$config{openssldir}="";
Richard Levitte7d130f62015-05-19 01:40:54 +0200203$config{processor}="";
Richard Levitte107b5792015-05-20 20:03:20 +0200204$config{libdir}="";
Richard Levitte642a6132015-12-27 02:27:30 +0100205$config{cross_compile_prefix}="";
Richard Levitte107b5792015-05-20 20:03:20 +0200206$config{fipslibdir}="/usr/local/ssl/fips-2.0/lib/";
Dr. Stephen Henson1ab2f7f2011-01-26 12:31:30 +0000207my $nofipscanistercheck=0;
Richard Levitte107b5792015-05-20 20:03:20 +0200208$config{baseaddr}="0xFB00000";
Richard Levitte9c62a272016-02-27 16:51:34 +0100209my $auto_threads=1; # enable threads automatically? true by default
Bodo Möller03964792001-03-09 13:04:06 +0000210my $default_ranlib;
Richard Levitte107b5792015-05-20 20:03:20 +0200211$config{fips}=0;
212
213# Top level directories to build
214$config{dirs} = [ "crypto", "ssl", "engines", "apps", "test", "tools" ];
215# crypto/ subdirectories to build
216$config{sdirs} = [
217 "objects",
Bill Cox2d0b4412016-03-09 23:08:31 +0100218 "md2", "md4", "md5", "sha", "mdc2", "hmac", "ripemd", "whrlpool", "poly1305", "blake2",
Richard Levitte107b5792015-05-20 20:03:20 +0200219 "des", "aes", "rc2", "rc4", "rc5", "idea", "bf", "cast", "camellia", "seed", "chacha", "modes",
220 "bn", "ec", "rsa", "dsa", "dh", "dso", "engine",
221 "buffer", "bio", "stack", "lhash", "rand", "err",
222 "evp", "asn1", "pem", "x509", "x509v3", "conf", "txt_db", "pkcs7", "pkcs12", "comp", "ocsp", "ui",
Rich Salzdba31772016-02-14 00:17:59 -0500223 "cms", "ts", "srp", "cmac", "ct", "async", "kdf"
Richard Levitte107b5792015-05-20 20:03:20 +0200224 ];
Ulf Möller99aab161999-04-01 12:34:33 +0000225
Viktor Dukhovni6b01bed2016-01-18 13:10:21 -0500226# Known TLS and DTLS protocols
227my @tls = qw(ssl3 tls1 tls1_1 tls1_2);
228my @dtls = qw(dtls1 dtls1_2);
229
Richard Levitte8b527be2015-10-22 17:09:14 +0200230# Explicitelly known options that are possible to disable. They can
231# be regexps, and will be used like this: /^no-${option}$/
232# For developers: keep it sorted alphabetically
233
234my @disablables = (
235 "aes",
236 "asm",
Todd Short52739e42016-02-04 11:41:25 -0500237 "async",
Matt Caswellb184e3e2016-02-09 11:26:14 +0000238 "autoalginit",
Matt Caswell498abff2016-02-09 09:39:07 +0000239 "autoerrinit",
Richard Levitte8b527be2015-10-22 17:09:14 +0200240 "bf",
Bill Cox2d0b4412016-03-09 23:08:31 +0100241 "blake2",
Richard Levitte8b527be2015-10-22 17:09:14 +0200242 "camellia",
243 "capieng",
244 "cast",
Andy Polyakov48f14842015-12-09 23:02:11 +0100245 "chacha",
Richard Levitte8b527be2015-10-22 17:09:14 +0200246 "cmac",
247 "cms",
248 "comp",
Mat3e45d392016-01-09 23:55:57 +0100249 "crypto-mdebug",
Richard Levitteef8ca6b2016-02-14 12:16:52 +0100250 "crypto-mdebug-backtrace",
Richard Levitte8b527be2015-10-22 17:09:14 +0200251 "ct",
252 "deprecated",
253 "des",
254 "dgram",
255 "dh",
256 "dsa",
257 "dso",
Kurt Roeckxa5ecdc62015-12-12 11:12:22 +0100258 "dtls",
Richard Levitte343ec2b2016-02-19 22:08:37 +0100259 "dynamic-engine",
Richard Levitte8b527be2015-10-22 17:09:14 +0200260 "ec",
261 "ec2m",
Viktor Dukhovni6b01bed2016-01-18 13:10:21 -0500262 "ecdh",
263 "ecdsa",
Richard Levitte8b527be2015-10-22 17:09:14 +0200264 "ec_nistp_64_gcc_128",
Richard Levitteb31feae2016-02-03 21:08:17 +0100265 "egd",
Richard Levitte8b527be2015-10-22 17:09:14 +0200266 "engine",
Rich Salz1288f262016-02-17 13:33:51 -0500267 "err",
David Woodhouse02f71142015-07-30 11:45:25 +0100268 "filenames",
Richard Levitte8b527be2015-10-22 17:09:14 +0200269 "heartbeats",
270 "hmac",
271 "hw(-.+)?",
272 "idea",
Richard Levitte09aa2632016-03-09 01:14:29 +0100273 "makedepend",
Richard Levitte8b527be2015-10-22 17:09:14 +0200274 "md2",
275 "md4",
276 "md5",
277 "mdc2",
278 "md[-_]ghost94",
Matt Caswellfa22f982016-03-07 23:26:32 +0000279 "multiblock",
Richard Levitte8b527be2015-10-22 17:09:14 +0200280 "nextprotoneg",
281 "ocb",
282 "ocsp",
Richard Levitteae482422016-02-22 02:09:11 +0100283 "pic",
Andy Polyakov48f14842015-12-09 23:02:11 +0100284 "poly1305",
Richard Levitte8b527be2015-10-22 17:09:14 +0200285 "posix-io",
286 "psk",
287 "rc2",
288 "rc4",
289 "rc5",
290 "rdrand",
291 "rfc3779",
292 "rijndael", # Old AES name
Rich Salz1288f262016-02-17 13:33:51 -0500293 "ripemd",
Richard Levitte8b527be2015-10-22 17:09:14 +0200294 "rmd160",
295 "rsa",
296 "scrypt",
297 "sct",
298 "sctp",
299 "seed",
300 "sha",
301 "shared",
302 "sock",
303 "srp",
304 "srtp",
305 "sse2",
306 "ssl",
Richard Levitte8b527be2015-10-22 17:09:14 +0200307 "ssl-trace",
308 "static-engine",
309 "stdio",
Richard Levitte8b527be2015-10-22 17:09:14 +0200310 "threads",
311 "tls",
Rich Salz1288f262016-02-17 13:33:51 -0500312 "ts",
313 "ui",
Richard Levitte8b527be2015-10-22 17:09:14 +0200314 "unit-test",
315 "whirlpool",
Matt Caswell8b1a5af2016-03-03 15:40:51 +0000316 "weak-ssl-ciphers",
Richard Levitte8b527be2015-10-22 17:09:14 +0200317 "zlib",
318 "zlib-dynamic",
319 );
Viktor Dukhovni6b01bed2016-01-18 13:10:21 -0500320foreach my $proto ((@tls, @dtls))
321 {
322 push(@disablables, $proto);
323 push(@disablables, "$proto-method");
324 }
Richard Levitte8b527be2015-10-22 17:09:14 +0200325
Richard Levittee80381e2016-02-22 10:42:53 +0100326my @deprecated_disablables = (
327 "ssl2",
328 );
329
Bodo Möllerc9a112f2005-02-22 10:29:51 +0000330# All of the following is disabled by default (RC5 was enabled before 0.9.8):
331
Richard Levitte9e04edf2016-02-22 13:45:46 +0100332our %disabled = ( # "what" => "comment"
333 "ec_nistp_64_gcc_128" => "default",
Matt Caswell8b1a5af2016-03-03 15:40:51 +0000334 "egd" => "default",
335 "md2" => "default",
336 "rc5" => "default",
337 "sctp" => "default",
338 "shared" => "default",
339 "ssl-trace" => "default",
Kurt Roeckx9829b5a2016-03-03 22:45:57 +0100340 "ssl3" => "default",
341 "ssl3-method" => "default",
Matt Caswell8b1a5af2016-03-03 15:40:51 +0000342 "static-engine" => "default",
343 "unit-test" => "default",
344 "weak-ssl-ciphers" => "default",
345 "zlib" => "default",
346 "zlib-dynamic" => "default",
347 "crypto-mdebug" => "default",
348 "heartbeats" => "default",
Richard Levitte9e04edf2016-02-22 13:45:46 +0100349 );
Bodo Möllerc9a112f2005-02-22 10:29:51 +0000350
Richard Levittec569e202015-05-18 11:03:47 +0200351# Note: => pair form used for aesthetics, not to truly make a hash table
352my @disable_cascades = (
353 # "what" => [ "cascade", ... ]
Richard Levitte7d130f62015-05-19 01:40:54 +0200354 sub { $config{processor} eq "386" }
Richard Levittec569e202015-05-18 11:03:47 +0200355 => [ "sse2" ],
356 "ssl" => [ "ssl3" ],
357 "ssl3-method" => [ "ssl3" ],
358 "zlib" => [ "zlib-dynamic" ],
359 "rijndael" => [ "aes" ],
360 "des" => [ "mdc2" ],
Richard Levitte9e4d6fb2016-01-23 22:58:51 +0100361 "ec" => [ "ecdsa", "ecdh" ],
Richard Levittec569e202015-05-18 11:03:47 +0200362
363 "dgram" => [ "dtls" ],
364 "dtls" => [ @dtls ],
365
366 # SSL 3.0, (D)TLS 1.0 and TLS 1.1 require MD5 and SHA
367 "md5" => [ "ssl", "tls1", "tls1_1", "dtls1" ],
368 "sha" => [ "ssl", "tls1", "tls1_1", "dtls1" ],
369
370 # Additionally, SSL 3.0 requires either RSA or DSA+DH
371 sub { $disabled{rsa}
372 && ($disabled{dsa} || $disabled{dh}); }
373 => [ "ssl" ],
374
375 # (D)TLS 1.0 and TLS 1.1 also require either RSA or DSA+DH
376 # or ECDSA + ECDH. (D)TLS 1.2 has this requirement as well.
377 # (XXX: We don't support PSK-only builds).
378 sub { $disabled{rsa}
379 && ($disabled{dsa} || $disabled{dh})
380 && ($disabled{ecdsa} || $disabled{ecdh}); }
381 => [ "tls1", "tls1_1", "tls1_2",
382 "dtls1", "dtls1_2" ],
383
384 "tls" => [ @tls ],
385
386 # SRP and HEARTBEATS require TLSEXT
387 "tlsext" => [ "srp", "heartbeats" ],
Richard Levitteef8ca6b2016-02-14 12:16:52 +0100388
389 "crypto-mdebug" => [ "crypto-mdebug-backtrace" ],
Richard Levitte343ec2b2016-02-19 22:08:37 +0100390
391 # Without DSO, we can't load dynamic engines, so don't build them dynamic
392 "dso" => [ "dynamic-engine" ],
Richard Levitteae482422016-02-22 02:09:11 +0100393
394 # Without position independent code, there can be no shared libraries or DSOs
Richard Levitte00698062016-03-11 12:58:15 +0100395 "pic" => [ "shared" ],
396 "shared" => [ "dynamic-engine" ],
Richard Levittec569e202015-05-18 11:03:47 +0200397 );
398
399# Avoid protocol support holes. Also disable all versions below N, if version
400# N is disabled while N+1 is enabled.
401#
402my @list = (reverse @tls);
403while ((my $first, my $second) = (shift @list, shift @list)) {
404 last unless @list;
405 push @disable_cascades, ( sub { !$disabled{$first} && $disabled{$second} }
406 => [ @list ] );
407 unshift @list, $second;
408}
409my @list = (reverse @dtls);
410while ((my $first, my $second) = (shift @list, shift @list)) {
411 last unless @list;
412 push @disable_cascades, ( sub { !$disabled{$first} && $disabled{$second} }
413 => [ @list ] );
414 unshift @list, $second;
415}
416
Bodo Möller7a762192008-12-02 01:21:39 +0000417# Explicit "no-..." options will be collected in %disabled along with the defaults.
Rich Salze4ef2e22016-02-10 11:10:39 -0500418# To remove something from %disabled, use "enable-foo".
Bodo Möller7a762192008-12-02 01:21:39 +0000419# For symmetry, "disable-foo" is a synonym for "no-foo".
420
Richard Levittee737d7b2016-02-11 15:22:27 +0100421my @generated_headers = (
422 "include/openssl/opensslconf.h",
Richard Levittee987f9f2016-02-15 17:20:15 +0100423 "crypto/include/internal/bn_conf.h",
424 "crypto/include/internal/dso_conf.h"
Richard Levittee737d7b2016-02-11 15:22:27 +0100425 );
426
427my @generated_by_make_headers = (
428 "crypto/buildinf.h"
429 );
430
Bodo Möllerab185b62005-03-13 19:46:58 +0000431
Andy Polyakovd0590fe2004-07-18 16:19:34 +0000432my $no_sse2=0;
Richard Levitteb6e4dac2001-11-27 11:48:30 +0000433
Ulf Möller462ba4f1999-04-24 22:59:36 +0000434&usage if ($#ARGV < 0);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000435
Richard Levittebcb19772016-01-30 02:17:05 +0100436my $user_cflags="";
437my @user_defines=();
Richard Levitte7d130f62015-05-19 01:40:54 +0200438$config{openssl_api_defines}=[];
439$config{openssl_algorithm_defines}=[];
440$config{openssl_thread_defines}=[];
441$config{openssl_sys_defines}=[];
442$config{openssl_other_defines}=[];
Richard Levittefe052642015-05-18 03:33:55 +0200443my $libs="";
444my $target="";
Richard Levitte3fa04f02016-01-12 00:17:12 +0100445$config{options}="";
Richard Levitte8864f0d2016-03-02 19:13:26 +0100446$config{build_type} = "release";
Richard Levittec59cb512000-08-17 10:23:45 +0000447
Richard Levittedc3365f2016-03-07 20:41:39 +0100448my $classic = 0;
449
Richard Levittec59cb512000-08-17 10:23:45 +0000450my @argvcopy=@ARGV;
Richard Levittec59cb512000-08-17 10:23:45 +0000451
Richard Levittefe052642015-05-18 03:33:55 +0200452if (grep /^reconf(igure)?$/, @argvcopy) {
Richard Levitte642a6132015-12-27 02:27:30 +0100453 if (-f "./configdata.pm") {
454 my $file = "./configdata.pm";
455 unless (my $return = do $file) {
456 die "couldn't parse $file: $@" if $@;
457 die "couldn't do $file: $!" unless defined $return;
458 die "couldn't run $file" unless $return;
Richard Levittefe052642015-05-18 03:33:55 +0200459 }
Richard Levitte642a6132015-12-27 02:27:30 +0100460
461 @argvcopy = defined($configdata::config{perlargv}) ?
462 @{$configdata::config{perlargv}} : ();
463 die "Incorrect data to reconfigure, please do a normal configuration\n"
464 if (grep(/^reconf/,@argvcopy));
465 $ENV{CROSS_COMPILE} = $configdata::config{cross_compile_prefix}
466 if defined($configdata::config{cross_compile_prefix});
467 $ENV{CROSS_COMPILE} = $configdata::config{cc}
468 if defined($configdata::config{cc});
469
Richard Levittefe052642015-05-18 03:33:55 +0200470 print "Reconfiguring with: ", join(" ",@argvcopy), "\n";
471 print " CROSS_COMPILE = ",$ENV{CROSS_COMPILE},"\n"
472 if $ENV{CROSS_COMPILE};
473 print " CC = ",$ENV{CC},"\n" if $ENV{CC};
Richard Levitte642a6132015-12-27 02:27:30 +0100474 } elsif (open IN, "<Makefile") {
475 #
476 # THIS SECTION IS TEMPORARY, it helps transitioning from Makefile
477 # centered information gathering the reading configdata.pm
478 #
479 while (<IN>) {
Richard Levitte04f171c2016-02-12 12:10:27 +0100480 s|\R$||;
Richard Levitte642a6132015-12-27 02:27:30 +0100481 if (/^CONFIGURE_ARGS=\s*(.*)\s*/) {
482 # Older form, we split the string and hope for the best
483 @argvcopy = split /\s+/, $_;
484 die "Incorrect data to reconfigure, please do a normal configuration\n"
485 if (grep(/^reconf/,@argvcopy));
486 } elsif (/^CROSS_COMPILE=\s*(.*)/) {
487 $ENV{CROSS_COMPILE}=$1;
488 } elsif (/^CC=\s*(?:\$\(CROSS_COMPILE\))?(.*?)$/) {
489 $ENV{CC}=$1;
490 }
491 }
492 #
493 # END OF TEMPORARY SECTION
494 #
Richard Levittefe052642015-05-18 03:33:55 +0200495 } else {
496 die "Insufficient data to reconfigure, please do a normal configuration\n";
497 }
498}
499
Richard Levitte642a6132015-12-27 02:27:30 +0100500$config{perlargv} = [ @argvcopy ];
Richard Levittefe052642015-05-18 03:33:55 +0200501
502my %unsupported_options = ();
Richard Levittee80381e2016-02-22 10:42:53 +0100503my %deprecated_options = ();
Richard Levittefe052642015-05-18 03:33:55 +0200504foreach (@argvcopy)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000505 {
Richard Levitte7c55e222016-02-16 16:07:05 +0100506 # VMS is a case insensitive environment, and depending on settings
507 # out of our control, we may receive options uppercased. Let's
508 # downcase at least the part before any equal sign.
509 if ($^O eq "VMS")
510 {
511 s/^([^=]*)/lc($1)/e;
512 }
Richard Levittefe052642015-05-18 03:33:55 +0200513 s /^-no-/no-/; # some people just can't read the instructions
Richard Levittec59cb512000-08-17 10:23:45 +0000514
Richard Levittefe052642015-05-18 03:33:55 +0200515 # rewrite some options in "enable-..." form
516 s /^-?-?shared$/enable-shared/;
517 s /^sctp$/enable-sctp/;
518 s /^threads$/enable-threads/;
519 s /^zlib$/enable-zlib/;
520 s /^zlib-dynamic$/enable-zlib-dynamic/;
Richard Levittec59cb512000-08-17 10:23:45 +0000521
Rich Salze4ef2e22016-02-10 11:10:39 -0500522 if (/^(no|disable|enable)-(.+)$/)
Ulf Möllerf5d7a031999-04-27 01:14:46 +0000523 {
Richard Levittefe052642015-05-18 03:33:55 +0200524 my $word = $2;
Richard Levittee80381e2016-02-22 10:42:53 +0100525 if (grep { $word =~ /^${_}$/ } @deprecated_disablables)
526 {
527 $deprecated_options{$_} = 1;
528 next;
529 }
530 elsif (!grep { $word =~ /^${_}$/ } @disablables)
Richard Levitte8b527be2015-10-22 17:09:14 +0200531 {
Richard Levittefe052642015-05-18 03:33:55 +0200532 $unsupported_options{$_} = 1;
533 next;
Richard Levitte8b527be2015-10-22 17:09:14 +0200534 }
Richard Levittefe052642015-05-18 03:33:55 +0200535 }
536 if (/^no-(.+)$/ || /^disable-(.+)$/)
537 {
Rich Salze4ef2e22016-02-10 11:10:39 -0500538 foreach my $proto ((@tls, @dtls))
539 {
540 if ($1 eq "$proto-method")
541 {
542 $disabled{"$proto"} = "option($proto-method)";
543 last;
544 }
545 }
546 if ($1 eq "dtls")
547 {
548 foreach my $proto (@dtls)
549 {
550 $disabled{$proto} = "option(dtls)";
551 }
552 }
553 elsif ($1 eq "ssl")
554 {
555 # Last one of its kind
556 $disabled{"ssl3"} = "option(ssl)";
557 }
558 elsif ($1 eq "tls")
559 {
560 # XXX: Tests will fail if all SSL/TLS
561 # protocols are disabled.
562 foreach my $proto (@tls)
563 {
564 $disabled{$proto} = "option(tls)";
565 }
566 }
Richard Levitte343ec2b2016-02-19 22:08:37 +0100567 elsif ($1 eq "static-engine")
568 {
Richard Levitte19ab5792016-02-22 02:06:05 +0100569 delete $disabled{"dynamic-engine"};
Richard Levitte343ec2b2016-02-19 22:08:37 +0100570 }
571 elsif ($1 eq "dynamic-engine")
572 {
Richard Levitte19ab5792016-02-22 02:06:05 +0100573 $disabled{"dynamic-engine"} = "option";
Richard Levitte343ec2b2016-02-19 22:08:37 +0100574 }
Rich Salze4ef2e22016-02-10 11:10:39 -0500575 else
576 {
577 $disabled{$1} = "option";
578 }
Richard Levitte9c62a272016-02-27 16:51:34 +0100579 # No longer an automatic choice
580 $auto_threads = 0 if ($1 eq "threads");
Bodo Möllerfbabb751999-07-09 12:00:34 +0000581 }
Rich Salze4ef2e22016-02-10 11:10:39 -0500582 elsif (/^enable-(.+)$/)
Richard Levittefe052642015-05-18 03:33:55 +0200583 {
Richard Levitte343ec2b2016-02-19 22:08:37 +0100584 if ($1 eq "static-engine")
585 {
Richard Levitte19ab5792016-02-22 02:06:05 +0100586 $disabled{"dynamic-engine"} = "option";
Richard Levitte343ec2b2016-02-19 22:08:37 +0100587 }
588 elsif ($1 eq "dynamic-engine")
589 {
Richard Levitte19ab5792016-02-22 02:06:05 +0100590 delete $disabled{"dynamic-engine"};
Richard Levitte343ec2b2016-02-19 22:08:37 +0100591 }
Richard Levitte25004db2016-03-03 10:07:29 +0100592 elsif ($1 eq "zlib-dynamic")
593 {
594 delete $disabled{"zlib"};
595 }
Richard Levittefe052642015-05-18 03:33:55 +0200596 my $algo = $1;
Richard Levittefe052642015-05-18 03:33:55 +0200597 delete $disabled{$algo};
598
Richard Levitte9c62a272016-02-27 16:51:34 +0100599 # No longer an automatic choice
600 $auto_threads = 0 if ($1 eq "threads");
Richard Levittefe052642015-05-18 03:33:55 +0200601 }
602 elsif (/^--strict-warnings$/)
603 {
604 $strict_warnings = 1;
605 }
606 elsif (/^--debug$/)
607 {
Richard Levitte8864f0d2016-03-02 19:13:26 +0100608 $config{build_type} = "debug";
Richard Levittefe052642015-05-18 03:33:55 +0200609 }
610 elsif (/^--release$/)
611 {
Richard Levitte8864f0d2016-03-02 19:13:26 +0100612 $config{build_type} = "release";
Richard Levittefe052642015-05-18 03:33:55 +0200613 }
614 elsif (/^386$/)
Richard Levitte7d130f62015-05-19 01:40:54 +0200615 { $config{processor}=386; }
Richard Levittefe052642015-05-18 03:33:55 +0200616 elsif (/^fips$/)
617 {
Richard Levitte107b5792015-05-20 20:03:20 +0200618 $config{fips}=1;
Richard Levittefe052642015-05-18 03:33:55 +0200619 }
620 elsif (/^rsaref$/)
621 {
622 # No RSAref support any more since it's not needed.
623 # The check for the option is there so scripts aren't
624 # broken
625 }
626 elsif (/^nofipscanistercheck$/)
627 {
Richard Levitte107b5792015-05-20 20:03:20 +0200628 $config{fips} = 1;
Richard Levittefe052642015-05-18 03:33:55 +0200629 $nofipscanistercheck = 1;
630 }
631 elsif (/^[-+]/)
632 {
Richard Levittedc3365f2016-03-07 20:41:39 +0100633 if (/^--classic$/)
634 {
635 $classic=1;
636 }
637 elsif (/^--prefix=(.*)$/)
Richard Levittefe052642015-05-18 03:33:55 +0200638 {
Richard Levitte291e94d2015-05-18 22:35:23 +0200639 $config{prefix}=$1;
Richard Levitte5482dac2016-01-30 02:57:19 +0100640 die "Directory given with --prefix MUST be absolute\n"
641 unless file_name_is_absolute($config{prefix});
Richard Levittefe052642015-05-18 03:33:55 +0200642 }
643 elsif (/^--api=(.*)$/)
644 {
Richard Levitte107b5792015-05-20 20:03:20 +0200645 $config{api}=$1;
Richard Levittefe052642015-05-18 03:33:55 +0200646 }
647 elsif (/^--libdir=(.*)$/)
648 {
Richard Levitte107b5792015-05-20 20:03:20 +0200649 $config{libdir}=$1;
Richard Levittefe052642015-05-18 03:33:55 +0200650 }
651 elsif (/^--openssldir=(.*)$/)
652 {
Richard Levitte291e94d2015-05-18 22:35:23 +0200653 $config{openssldir}=$1;
Richard Levittefe052642015-05-18 03:33:55 +0200654 }
Richard Levittefe052642015-05-18 03:33:55 +0200655 elsif (/^--with-zlib-lib=(.*)$/)
656 {
Michael Lee20a58192016-02-03 11:31:40 -0500657 $withargs{zlib_lib}=$1;
Richard Levittefe052642015-05-18 03:33:55 +0200658 }
659 elsif (/^--with-zlib-include=(.*)$/)
660 {
Michael Lee20a58192016-02-03 11:31:40 -0500661 $withargs{zlib_include}="-I$1";
Richard Levittefe052642015-05-18 03:33:55 +0200662 }
663 elsif (/^--with-fipslibdir=(.*)$/)
664 {
Richard Levitte107b5792015-05-20 20:03:20 +0200665 $config{fipslibdir}="$1/";
Richard Levittefe052642015-05-18 03:33:55 +0200666 }
667 elsif (/^--with-baseaddr=(.*)$/)
668 {
Richard Levitte107b5792015-05-20 20:03:20 +0200669 $config{baseaddr}="$1";
Richard Levittefe052642015-05-18 03:33:55 +0200670 }
671 elsif (/^--cross-compile-prefix=(.*)$/)
672 {
Richard Levitte642a6132015-12-27 02:27:30 +0100673 $config{cross_compile_prefix}=$1;
Richard Levittefe052642015-05-18 03:33:55 +0200674 }
675 elsif (/^--config=(.*)$/)
676 {
677 read_config $1;
678 }
679 elsif (/^-[lL](.*)$/ or /^-Wl,/)
680 {
681 $libs.=$_." ";
682 }
Richard Levittebcb19772016-01-30 02:17:05 +0100683 elsif (/^-D(.*)$/)
684 {
685 push @user_defines, $1;
686 }
Richard Levittefe052642015-05-18 03:33:55 +0200687 else # common if (/^[-+]/), just pass down...
688 {
689 $_ =~ s/%([0-9a-f]{1,2})/chr(hex($1))/gei;
Rich Salz2b91ec72016-02-12 14:40:33 -0500690 $user_cflags.=" ".$_;
Richard Levittefe052642015-05-18 03:33:55 +0200691 }
692 }
Richard Levittefe052642015-05-18 03:33:55 +0200693 else
694 {
695 die "target already defined - $target (offending arg: $_)\n" if ($target ne "");
696 $target=$_;
697 }
698 unless ($_ eq $target || /^no-/ || /^disable-/)
699 {
700 # "no-..." follows later after implied disactivations
701 # have been derived. (Don't take this too seroiusly,
702 # we really only write OPTIONS to the Makefile out of
703 # nostalgia.)
704
Richard Levitte3fa04f02016-01-12 00:17:12 +0100705 if ($config{options} eq "")
706 { $config{options} = $_; }
Richard Levittefe052642015-05-18 03:33:55 +0200707 else
Richard Levitte3fa04f02016-01-12 00:17:12 +0100708 { $config{options} .= " ".$_; }
Richard Levittefe052642015-05-18 03:33:55 +0200709 }
Richard Levitte489eb742015-10-22 17:33:47 +0200710
Richard Levitte107b5792015-05-20 20:03:20 +0200711 if (defined($config{api}) && !exists $apitable->{$config{api}}) {
712 die "***** Unsupported api compatibility level: $config{api}\n",
Viktor Dukhovni98186eb2016-01-04 23:00:33 -0500713 }
714
Richard Levittee80381e2016-02-22 10:42:53 +0100715 if (keys %deprecated_options)
716 {
717 warn "***** Deprecated options: ",
718 join(", ", keys %deprecated_options), "\n";
719 }
Richard Levitte489eb742015-10-22 17:33:47 +0200720 if (keys %unsupported_options)
721 {
722 die "***** Unsupported options: ",
723 join(", ", keys %unsupported_options), "\n";
724 }
Bodo Möllerfbabb751999-07-09 12:00:34 +0000725 }
Richard Levitteb6e4dac2001-11-27 11:48:30 +0000726
Richard Levitte107b5792015-05-20 20:03:20 +0200727if ($config{fips})
Richard Levitteb6e4dac2001-11-27 11:48:30 +0000728 {
Richard Levittec569e202015-05-18 11:03:47 +0200729 delete $disabled{"shared"} if ($disabled{"shared"} =~ /^default/);
Richard Levitteb6e4dac2001-11-27 11:48:30 +0000730 }
Richard Levitte107b5792015-05-20 20:03:20 +0200731else
732 {
733 @{$config{dirs}} = grep !/^fips$/, @{$config{dirs}};
734 }
Richard Levitteb6e4dac2001-11-27 11:48:30 +0000735
Richard Levittec569e202015-05-18 11:03:47 +0200736my @tocheckfor = (keys %disabled);
737while (@tocheckfor) {
738 my %new_tocheckfor = ();
739 my @cascade_copy = (@disable_cascades);
740 while (@cascade_copy) {
741 my ($test, $descendents) = (shift @cascade_copy, shift @cascade_copy);
742 if (ref($test) eq "CODE" ? $test->() : defined($disabled{$test})) {
743 map {
Richard Levitte01d99972016-03-14 10:02:13 +0100744 $new_tocheckfor{$_} = 1; $disabled{$_} = "forced";
Richard Levittec569e202015-05-18 11:03:47 +0200745 } grep { !defined($disabled{$_}) } @$descendents;
Richard Levitteb6e4dac2001-11-27 11:48:30 +0000746 }
Richard Levittec569e202015-05-18 11:03:47 +0200747 }
748 @tocheckfor = (keys %new_tocheckfor);
749}
Ben Laurieedc032b2011-03-12 17:01:19 +0000750
Bodo Möller436a3761999-05-28 23:18:51 +0000751if ($target eq "TABLE") {
Richard Levitte00ae96c2015-05-18 12:53:38 +0200752 foreach (sort keys %table) {
753 print_table_entry($_, "TABLE");
754 }
755 exit 0;
Bodo Möller436a3761999-05-28 23:18:51 +0000756}
757
Ulf Möller10a926c2000-02-21 00:55:45 +0000758if ($target eq "LIST") {
Richard Levitte00ae96c2015-05-18 12:53:38 +0200759 foreach (sort keys %table) {
760 print $_,"\n" unless $table{$_}->{template};
761 }
762 exit 0;
Ulf Möller10a926c2000-02-21 00:55:45 +0000763}
764
Richard Levitteaaf878c2015-03-06 02:00:21 +0100765if ($target eq "HASH") {
Richard Levitte00ae96c2015-05-18 12:53:38 +0200766 print "%table = (\n";
767 foreach (sort keys %table) {
768 print_table_entry($_, "HASH");
769 }
770 exit 0;
Richard Levitteaaf878c2015-03-06 02:00:21 +0100771}
772
Richard Levitte00ae96c2015-05-18 12:53:38 +0200773# Backward compatibility?
Richard Levitte49e04542002-02-14 12:28:24 +0000774if ($target =~ m/^CygWin32(-.*)$/) {
Richard Levitte00ae96c2015-05-18 12:53:38 +0200775 $target = "Cygwin".$1;
Richard Levitte49e04542002-02-14 12:28:24 +0000776}
777
Bodo Möllerc9a112f2005-02-22 10:29:51 +0000778foreach (sort (keys %disabled))
779 {
Richard Levitte3fa04f02016-01-12 00:17:12 +0100780 $config{options} .= " no-$_";
Bodo Möllerc9a112f2005-02-22 10:29:51 +0000781
782 printf " no-%-12s %-10s", $_, "[$disabled{$_}]";
783
784 if (/^dso$/)
Richard Levitte721f9052016-02-22 14:12:35 +0100785 { }
Bodo Möllerc9a112f2005-02-22 10:29:51 +0000786 elsif (/^threads$/)
Richard Levitte22bfe052016-02-22 14:03:23 +0100787 { }
Bodo Möllerc9a112f2005-02-22 10:29:51 +0000788 elsif (/^shared$/)
Richard Levitte84af1ba2016-02-22 13:52:46 +0100789 { }
Richard Levitteae482422016-02-22 02:09:11 +0100790 elsif (/^pic$/)
791 { }
Bodo Möllerc9a112f2005-02-22 10:29:51 +0000792 elsif (/^zlib$/)
Richard Levitte36a30902016-02-22 14:04:45 +0100793 { }
Richard Levitte19ab5792016-02-22 02:06:05 +0100794 elsif (/^dynamic-engine$/)
Dr. Stephen Hensonfbf002b2005-11-06 17:58:26 +0000795 { }
Richard Levitte09aa2632016-03-09 01:14:29 +0100796 elsif (/^makedepend$/)
797 { }
Bodo Möllerc9a112f2005-02-22 10:29:51 +0000798 elsif (/^zlib-dynamic$/)
799 { }
Bodo Möllerc9a112f2005-02-22 10:29:51 +0000800 elsif (/^sse2$/)
801 { $no_sse2 = 1; }
Richard Levitte107b5792015-05-20 20:03:20 +0200802 elsif (/^engine$/)
Rich Salz1288f262016-02-17 13:33:51 -0500803 {
804 @{$config{dirs}} = grep !/^engines$/, @{$config{dirs}};
805 @{$config{sdirs}} = grep !/^engine$/, @{$config{sdirs}};
806 push @{$config{openssl_other_defines}}, "OPENSSL_NO_ENGINE";
807 }
Bodo Möllerc9a112f2005-02-22 10:29:51 +0000808 else
809 {
810 my ($ALGO, $algo);
Richard Levitte30fafde2011-03-25 09:29:46 +0000811 ($ALGO = $algo = $_) =~ tr/[\-a-z]/[_A-Z]/;
Bodo Möllerc9a112f2005-02-22 10:29:51 +0000812
Matt Caswell316fae22016-02-18 16:54:16 +0000813 if (/^asm$/ || /^err$/ || /^hw$/ || /^hw-/ || /^async$/
Matt Caswell498abff2016-02-09 09:39:07 +0000814 || /^autoalginit/ || /^autoerrinit/)
Bodo Möllerc9a112f2005-02-22 10:29:51 +0000815 {
Richard Levitte7d130f62015-05-19 01:40:54 +0200816 push @{$config{openssl_other_defines}}, "OPENSSL_NO_$ALGO";
Bodo Möllerc9a112f2005-02-22 10:29:51 +0000817 print " OPENSSL_NO_$ALGO";
Felix Laurie von Massenbachfce0ba52014-05-26 17:19:28 +0100818
Richard Levittebcb19772016-01-30 02:17:05 +0100819 if (/^err$/) { push @user_defines, "OPENSSL_NO_ERR"; }
Bodo Möllerc9a112f2005-02-22 10:29:51 +0000820 }
821 else
822 {
Andy Polyakov2a4af942015-01-24 16:46:54 +0100823 ($ALGO,$algo) = ("RMD160","rmd160") if ($algo eq "ripemd");
824
Richard Levitte7d130f62015-05-19 01:40:54 +0200825 push @{$config{openssl_algorithm_defines}}, "OPENSSL_NO_$ALGO";
Bodo Möllerc9a112f2005-02-22 10:29:51 +0000826 print " OPENSSL_NO_$ALGO";
827
Matt Caswelle36827f2015-05-12 12:14:13 +0100828 # fix-up crypto/directory name(s)
Richard Levitte107b5792015-05-20 20:03:20 +0200829 $algo="whrlpool" if $algo eq "whirlpool";
830 $algo="ripemd" if $algo eq "rmd160";
831 @{$config{sdirs}} = grep { $_ ne $algo} @{$config{sdirs}};
Andy Polyakov2a4af942015-01-24 16:46:54 +0100832
Matt Caswelle36827f2015-05-12 12:14:13 +0100833 print " (skip dir)";
Bodo Möllerc9a112f2005-02-22 10:29:51 +0000834 }
835 }
836
837 print "\n";
838 }
839
Richard Levitte9e0724a2015-05-18 02:54:28 +0200840print "Configuring for $target\n";
841
842# Support for legacy targets having a name starting with 'debug-'
843my ($d, $t) = $target =~ m/^(debug-)?(.*)$/;
844if ($d) {
Richard Levitte8864f0d2016-03-02 19:13:26 +0100845 $config{build_type} = "debug";
Richard Levitte9e0724a2015-05-18 02:54:28 +0200846
847 # If we do not find debug-foo in the table, the target is set to foo.
848 if (!$table{$target}) {
849 $target = $t;
850 }
851}
Richard Levitte291e94d2015-05-18 22:35:23 +0200852$config{target} = $target;
Richard Levitte79302212016-02-27 10:23:15 +0100853my %target = resolve_config($target);
Richard Levitte9e0724a2015-05-18 02:54:28 +0200854
855&usage if (!%target || $target{template});
856
Richard Levitted2b22212016-02-27 11:25:33 +0100857%target = ( %{$table{DEFAULTS}}, %target );
Richard Levitte79302212016-02-27 10:23:15 +0100858
Richard Levitte107b5792015-05-20 20:03:20 +0200859$target{exe_extension}="";
Richard Levittef99f91f2016-02-15 22:13:41 +0100860$target{exe_extension}=".exe" if ($config{target} eq "DJGPP"
861 || $config{target} =~ /^(?:Cygwin|mingw)/);
Richard Levitte107b5792015-05-20 20:03:20 +0200862$target{exe_extension}=".nlm" if ($config{target} =~ /netware/);
863$target{exe_extension}=".pm" if ($config{target} =~ /vos/);
Ulf Möller462ba4f1999-04-24 22:59:36 +0000864
Richard Levittee987f9f2016-02-15 17:20:15 +0100865($target{shared_extension_simple}=$target{shared_extension})
866 =~ s|\.\$\(SHLIB_MAJOR\)\.\$\(SHLIB_MINOR\)||;
867$target{dso_extension}=$target{shared_extension_simple};
868($target{shared_import_extension}=$target{shared_extension_simple}.".a")
869 if ($config{target} =~ /^(?:Cygwin|mingw)/);
870
871
Richard Levitte642a6132015-12-27 02:27:30 +0100872$config{cross_compile_prefix} = $ENV{'CROSS_COMPILE'}
873 if $config{cross_compile_prefix} eq "";
Dr. Stephen Hensonf99f41c2009-10-07 16:41:14 +0000874
Richard Levitteb0a1e8b2016-03-02 12:22:15 +0100875# Allow overriding the names of some tools. USE WITH CARE
876$config{perl} = $ENV{'PERL'} || which("perl5") || which("perl") || "perl";
877$target{cc} = $ENV{'CC'} || $target{cc} || "cc";
878$target{ranlib} = $ENV{'RANLIB'} || $target{ranlib} || which("ranlib") || "true";
879$target{ar} = $ENV{'AR'} || $target{ar} || "ar";
880$target{nm} = $ENV{'NM'} || $target{nm} || "nm";
Richard Levitteaaf878c2015-03-06 02:00:21 +0100881
Richard Levittebcb19772016-01-30 02:17:05 +0100882# For cflags, lflags, plib_lflags, ex_libs and defines, add the debug_
883# or release_ attributes.
Richard Levitteaaf878c2015-03-06 02:00:21 +0100884# Do it in such a way that no spurious space is appended (hence the grep).
Richard Levitte2952b9b2016-03-02 10:57:05 +0100885$config{defines} = [];
886$config{cflags} = "";
887$config{ex_libs} = "";
888$config{shared_ldflag} = "";
Richard Levitteaaf878c2015-03-06 02:00:21 +0100889
Richard Levitte291e94d2015-05-18 22:35:23 +0200890# Make sure build_scheme is consistent.
891$target{build_scheme} = [ $target{build_scheme} ]
892 if ref($target{build_scheme}) ne "ARRAY";
Richard Levitted0d046e2002-01-27 15:52:37 +0000893
Richard Levittedc3365f2016-03-07 20:41:39 +0100894###### TO BE REMOVED WHEN CLASSIC BUILD IS REMOVED
895######
896###### If the user has chosen --classic, we give it to them.
897###### If they try that with an out-of-source config, we complain.
898if ($target{build_scheme}->[0] eq "unified" && $classic) {
899 die "Can't perform a classic build out of source tree\n"
900 if $srcdir ne $blddir;
901
902 $target{build_scheme} = { unix => [ "unixmake" ],
903 windows => [ "mk1mf", $target{build_scheme}->[2] ],
904 VMS => undef } -> {$target{build_scheme}->[1]};
905
906 die "Classic mode unavailable on this platform\n"
907 unless defined($target{build_scheme});
908}
909
Richard Levitteddf18472016-01-30 00:57:33 +0100910my ($builder, $builder_platform, @builder_opts) =
911 @{$target{build_scheme}};
912
Richard Levitte68ab5592016-02-05 15:14:45 +0100913if ($target =~ /^mingw/ && `$target{cc} --target-help 2>&1` =~ m/-mno-cygwin/m)
Andy Polyakovcbecd292010-11-30 22:18:02 +0000914 {
Richard Levitte68ab5592016-02-05 15:14:45 +0100915 $config{cflags} .= " -mno-cygwin";
Richard Levitte2952b9b2016-03-02 10:57:05 +0100916 $config{shared_ldflag} .= " -mno-cygwin";
Andy Polyakovcbecd292010-11-30 22:18:02 +0000917 }
918
Richard Levitte00b0d662016-02-22 14:10:45 +0100919if ($target =~ /linux.*-mips/ && !$disabled{asm} && $user_cflags !~ /-m(ips|arch=)/) {
Andy Polyakov63d88342012-09-15 11:21:50 +0000920 # minimally required architecture flags for assembly modules
Richard Levitte107b5792015-05-20 20:03:20 +0200921 $config{cflags}="-mips2 $config{cflags}" if ($target =~ /mips32/);
922 $config{cflags}="-mips3 $config{cflags}" if ($target =~ /mips64/);
Andy Polyakov63d88342012-09-15 11:21:50 +0000923}
924
Richard Levitte2964ba82003-01-11 11:40:39 +0000925my $no_shared_warn=0;
Andy Polyakov14bcdb02005-01-24 15:58:25 +0000926my $no_user_cflags=0;
Richard Levittebcb19772016-01-30 02:17:05 +0100927my $no_user_defines=0;
Richard Levitte2964ba82003-01-11 11:40:39 +0000928
Geoff Thorpebc2aada2000-04-06 07:09:45 +0000929# The DSO code currently always implements all functions so that no
930# applications will have to worry about that from a compilation point
931# of view. However, the "method"s may return zero unless that platform
932# has support compiled in for them. Currently each method is enabled
933# by a define "DSO_<name>" ... we translate the "dso_scheme" config
934# string entry into using the following logic;
Richard Levitte721f9052016-02-22 14:12:35 +0100935if (!$disabled{dso} && $target{dso_scheme} ne "")
Geoff Thorpebc2aada2000-04-06 07:09:45 +0000936 {
Richard Levitte291e94d2015-05-18 22:35:23 +0200937 $target{dso_scheme} =~ tr/[a-z]/[A-Z]/;
938 if ($target{dso_scheme} eq "DLFCN")
Geoff Thorpebc2aada2000-04-06 07:09:45 +0000939 {
Richard Levitte2952b9b2016-03-02 10:57:05 +0100940 unshift @{$config{defines}}, "DSO_DLFCN", "HAVE_DLFCN_H";
Geoff Thorpebc2aada2000-04-06 07:09:45 +0000941 }
Richard Levitte291e94d2015-05-18 22:35:23 +0200942 elsif ($target{dso_scheme} eq "DLFCN_NO_H")
Geoff Thorpebc2aada2000-04-06 07:09:45 +0000943 {
Richard Levitte2952b9b2016-03-02 10:57:05 +0100944 unshift @{$config{defines}}, "DSO_DLFCN";
Geoff Thorpebc2aada2000-04-06 07:09:45 +0000945 }
946 else
947 {
Richard Levitte2952b9b2016-03-02 10:57:05 +0100948 unshift @{$config{defines}}, "DSO_$target{dso_scheme}";
Geoff Thorpebc2aada2000-04-06 07:09:45 +0000949 }
950 }
Geoff Thorpe9ec01262000-04-04 22:32:19 +0000951
Richard Levitte1740c162016-01-29 18:07:37 +0100952$config{ex_libs}="$libs$config{ex_libs}" if ($libs ne "");
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000953
Richard Levitte00b0d662016-02-22 14:10:45 +0100954if ($disabled{asm})
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +0000955 {
Richard Levitte2952b9b2016-03-02 10:57:05 +0100956 if ($config{fips})
957 {
958 @{$config{defines}} = grep !/^[BL]_ENDIAN$/, @{$config{defines}};
959 @{$target{defines}} = grep !/^[BL]_ENDIAN$/, @{$target{defines}};
960 }
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +0000961 }
Andy Polyakov6f7ac8e2002-12-13 17:56:14 +0000962
Richard Levitte9c62a272016-02-27 16:51:34 +0100963# If threads aren't disabled, check how possible they are
964unless ($disabled{threads}) {
965 if ($auto_threads) {
966 # Enabled by default, disable it forcibly if unavailable
967 if ($target{thread_scheme} eq "(unknown)") {
968 $disabled{threads} = "unavailable";
969 }
970 } else {
971 # The user chose to enable threads explicitely, let's see
972 # if there's a chance that's possible
973 if ($target{thread_scheme} eq "(unknown)") {
974 # If the user asked for "threads" and we don't have internal
975 # knowledge how to do it, [s]he is expected to provide any
976 # system-dependent compiler options that are necessary. We
977 # can't truly check that the given options are correct, but
978 # we expect the user to know what [s]He is doing.
979 if ($no_user_cflags && $no_user_defines) {
980 die "You asked for multi-threading support, but didn't\n"
981 ,"provide any system-specific compiler options\n";
982 }
983 }
984 }
985}
986
987# If threads still aren't disabled, add a C macro to ensure the source
988# code knows about it. Any other flag is taken care of by the configs.
989unless($disabled{threads}) {
990 foreach (("defines", "openssl_thread_defines")) {
991 push @{$config{$_}}, "OPENSSL_THREADS";
992 }
993}
Richard Levittee452de92001-07-12 09:11:14 +0000994
Viktor Dukhovni98186eb2016-01-04 23:00:33 -0500995# With "deprecated" disable all deprecated features.
996if (defined($disabled{"deprecated"})) {
Richard Levitte107b5792015-05-20 20:03:20 +0200997 $config{api} = $maxapi;
Viktor Dukhovni98186eb2016-01-04 23:00:33 -0500998}
Matt Caswell07c4c142014-12-17 13:17:26 +0000999
Richard Levitte291e94d2015-05-18 22:35:23 +02001000if ($target{shared_target} eq "")
Andy Polyakov6f7ac8e2002-12-13 17:56:14 +00001001 {
Richard Levitteae482422016-02-22 02:09:11 +01001002 $no_shared_warn = 1
Richard Levitte84af1ba2016-02-22 13:52:46 +01001003 if ((!$disabled{shared} || !$disabled{"dynamic-engine"})
Richard Levitteae482422016-02-22 02:09:11 +01001004 && !$config{fips});
Richard Levitte84af1ba2016-02-22 13:52:46 +01001005 $disabled{shared} = "no-shared-target";
Richard Levitteae482422016-02-22 02:09:11 +01001006 $disabled{pic} = $disabled{shared} = $disabled{"dynamic-engine"} =
1007 "no-shared-target";
Andy Polyakov6f7ac8e2002-12-13 17:56:14 +00001008 }
Richard Levitteb436a982000-07-21 15:08:53 +00001009
Richard Levitte19ab5792016-02-22 02:06:05 +01001010if ($disabled{"dynamic-engine"}) {
Richard Levitte343ec2b2016-02-19 22:08:37 +01001011 push @{$config{defines}}, "OPENSSL_NO_DYNAMIC_ENGINE";
1012 $config{dynamic_engines} = 0;
Richard Levitte19ab5792016-02-22 02:06:05 +01001013} else {
1014 push @{$config{defines}}, "OPENSSL_NO_STATIC_ENGINE";
1015 $config{dynamic_engines} = 1;
Richard Levitte343ec2b2016-02-19 22:08:37 +01001016}
Richard Levitteecd45312002-10-11 18:06:08 +00001017
Andy Polyakovc313e322007-09-16 12:23:47 +00001018#
1019# Platform fix-ups
1020#
Richard Levitteae482422016-02-22 02:09:11 +01001021
1022# This saves the build files from having to check
1023if ($disabled{pic})
1024 {
1025 $target{shared_cflag} = $target{shared_ldflag} =
1026 $target{shared_rcflag} = "";
1027 }
Richard Levitte4f160392016-02-21 20:52:39 +01001028else
1029 {
1030 push @{$config{defines}}, "OPENSSL_PIC";
1031 }
Richard Levitteae482422016-02-22 02:09:11 +01001032
Richard Levitte291e94d2015-05-18 22:35:23 +02001033if ($target{sys_id} ne "")
Richard Levittecf1b7d92001-02-19 16:06:34 +00001034 {
Richard Levitte642a6132015-12-27 02:27:30 +01001035 push @{$config{openssl_sys_defines}}, "OPENSSL_SYS_$target{sys_id}";
Richard Levittecf1b7d92001-02-19 16:06:34 +00001036 }
1037
Richard Levitte00b0d662016-02-22 14:10:45 +01001038unless ($disabled{asm}) {
Richard Levitted2b22212016-02-27 11:25:33 +01001039 $target{cpuid_asm_src}=$table{DEFAULTS}->{cpuid_asm_src} if ($config{processor} eq "386");
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001040 $target{bn_asm_src} =~ s/\w+-gf2m.c// if (defined($disabled{ec2m}));
Andy Polyakovf8c469d2004-08-02 22:41:19 +00001041
Richard Levitte9e0724a2015-05-18 02:54:28 +02001042 # bn-586 is the only one implementing bn_*_part_words
Richard Levittebcb19772016-01-30 02:17:05 +01001043 push @{$config{defines}}, "OPENSSL_BN_ASM_PART_WORDS" if ($target{bn_asm_src} =~ /bn-586/);
1044 push @{$config{defines}}, "OPENSSL_IA32_SSE2" if (!$no_sse2 && $target{bn_asm_src} =~ /86/);
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +00001045
Richard Levittebcb19772016-01-30 02:17:05 +01001046 push @{$config{defines}}, "OPENSSL_BN_ASM_MONT" if ($target{bn_asm_src} =~ /-mont/);
1047 push @{$config{defines}}, "OPENSSL_BN_ASM_MONT5" if ($target{bn_asm_src} =~ /-mont5/);
1048 push @{$config{defines}}, "OPENSSL_BN_ASM_GF2m" if ($target{bn_asm_src} =~ /-gf2m/);
Andy Polyakov5ac7bde2005-10-07 14:18:06 +00001049
Richard Levitte107b5792015-05-20 20:03:20 +02001050 if ($config{fips}) {
Richard Levitte7d130f62015-05-19 01:40:54 +02001051 push @{$config{openssl_other_defines}}, "OPENSSL_FIPS";
Richard Levitte9e0724a2015-05-18 02:54:28 +02001052 }
Dr. Stephen Henson1ab2f7f2011-01-26 12:31:30 +00001053
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001054 if ($target{sha1_asm_src}) {
Richard Levittebcb19772016-01-30 02:17:05 +01001055 push @{$config{defines}}, "SHA1_ASM" if ($target{sha1_asm_src} =~ /sx86/ || $target{sha1_asm_src} =~ /sha1/);
1056 push @{$config{defines}}, "SHA256_ASM" if ($target{sha1_asm_src} =~ /sha256/);
1057 push @{$config{defines}}, "SHA512_ASM" if ($target{sha1_asm_src} =~ /sha512/);
Richard Levitte9e0724a2015-05-18 02:54:28 +02001058 }
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001059 if ($target{md5_asm_src}) {
Richard Levittebcb19772016-01-30 02:17:05 +01001060 push @{$config{defines}}, "MD5_ASM";
Richard Levitte9e0724a2015-05-18 02:54:28 +02001061 }
Richard Levitted2b22212016-02-27 11:25:33 +01001062 $target{cast_asm_src}=$table{DEFAULTS}->{cast_asm_src} unless $disabled{pic}; # CAST assembler is not PIC
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001063 if ($target{rmd160_asm_src}) {
Richard Levittebcb19772016-01-30 02:17:05 +01001064 push @{$config{defines}}, "RMD160_ASM";
Richard Levitte9e0724a2015-05-18 02:54:28 +02001065 }
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001066 if ($target{aes_asm_src}) {
Richard Levittebcb19772016-01-30 02:17:05 +01001067 push @{$config{defines}}, "AES_ASM" if ($target{aes_asm_src} =~ m/\baes-/);;
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001068 # aes-ctr.fake is not a real file, only indication that assembler
Andy Polyakov874a3752010-07-09 12:21:52 +00001069 # module implements AES_ctr32_encrypt...
Richard Levittebcb19772016-01-30 02:17:05 +01001070 push @{$config{defines}}, "AES_CTR_ASM" if ($target{aes_asm_src} =~ s/\s*aes-ctr\.fake//);
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001071 # aes-xts.fake indicates presence of AES_xts_[en|de]crypt...
Richard Levittebcb19772016-01-30 02:17:05 +01001072 push @{$config{defines}}, "AES_XTS_ASM" if ($target{aes_asm_src} =~ s/\s*aes-xts\.fake//);
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001073 $target{aes_asm_src} =~ s/\s*(vpaes|aesni)-x86\.s//g if ($no_sse2);
Richard Levittebcb19772016-01-30 02:17:05 +01001074 push @{$config{defines}}, "VPAES_ASM" if ($target{aes_asm_src} =~ m/vpaes/);
1075 push @{$config{defines}}, "BSAES_ASM" if ($target{aes_asm_src} =~ m/bsaes/);
Richard Levitte9e0724a2015-05-18 02:54:28 +02001076 }
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001077 if ($target{wp_asm_src} =~ /mmx/) {
Andy Polyakov46d4d862016-01-29 14:23:24 +01001078 if ($config{processor} eq "386") {
Richard Levitted2b22212016-02-27 11:25:33 +01001079 $target{wp_asm_src}=$table{DEFAULTS}->{wp_asm_src};
Andy Polyakov46d4d862016-01-29 14:23:24 +01001080 } elsif (!$disabled{"whirlpool"}) {
Richard Levitte2952b9b2016-03-02 10:57:05 +01001081 push @{$config{defines}}, "WHIRLPOOL_ASM";
Andy Polyakov46d4d862016-01-29 14:23:24 +01001082 }
Richard Levitte9e0724a2015-05-18 02:54:28 +02001083 }
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001084 if ($target{modes_asm_src} =~ /ghash-/) {
Richard Levittebcb19772016-01-30 02:17:05 +01001085 push @{$config{defines}}, "GHASH_ASM";
Richard Levitte9e0724a2015-05-18 02:54:28 +02001086 }
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001087 if ($target{ec_asm_src} =~ /ecp_nistz256/) {
Richard Levittebcb19772016-01-30 02:17:05 +01001088 push @{$config{defines}}, "ECP_NISTZ256_ASM";
Richard Levitte9e0724a2015-05-18 02:54:28 +02001089 }
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001090 if ($target{poly1305_asm_src} ne "") {
Richard Levittebcb19772016-01-30 02:17:05 +01001091 push @{$config{defines}}, "POLY1305_ASM";
Richard Levitte9e0724a2015-05-18 02:54:28 +02001092 }
1093}
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001094
Richard Levitte8ed40b82016-01-27 19:03:13 +01001095my $ecc = $target{cc};
Richard Levitte09aa2632016-03-09 01:14:29 +01001096if ($^O ne "VMS" && !$disabled{makedepend}) {
Richard Levittea583fc42016-02-16 16:08:06 +01001097 # Is the compiler gcc or clang? $ecc is used below to see if
1098 # error-checking can be turned on.
1099 my $ccpcc = "$config{cross_compile_prefix}$target{cc}";
Andy Polyakovd0db7ee2016-03-11 12:33:59 +01001100 open(PIPE, "$ccpcc --version 2>&1 |");
1101 my $lines = 2;
Richard Levittea583fc42016-02-16 16:08:06 +01001102 while ( <PIPE> ) {
Richard Levitte30752dd2016-03-08 17:16:16 +01001103 # Find the version number and save the major.
1104 m|(?:.*)\b(\d+)\.\d+\.\d+\b(?:.*)|;
Richard Levitte39affe12016-03-10 19:33:11 +01001105 my $compiler_major = $1;
Richard Levitte30752dd2016-03-08 17:16:16 +01001106 # We know that GNU C version 3 and up as well as all clang
1107 # versions support dependency generation
Richard Levitte39affe12016-03-10 19:33:11 +01001108 $config{makedepprog} = $ccpcc
Andy Polyakovd0db7ee2016-03-11 12:33:59 +01001109 if (/clang/ || (/gcc/ && $compiler_major > 3));
Richard Levittea583fc42016-02-16 16:08:06 +01001110 $ecc = "clang" if /clang/;
1111 $ecc = "gcc" if /gcc/;
Andy Polyakovd0db7ee2016-03-11 12:33:59 +01001112 last if ($config{makedepprog} || !$lines--);
Richard Levittea583fc42016-02-16 16:08:06 +01001113 }
1114 close(PIPE);
Richard Levitte09aa2632016-03-09 01:14:29 +01001115
Andy Polyakovd0db7ee2016-03-11 12:33:59 +01001116 $config{makedepprog} = which('makedepend') unless $config{makedepprog};
Richard Levitte09aa2632016-03-09 01:14:29 +01001117 $disabled{makedepend} = "unavailable" unless $config{makedepprog};
Rich Salzf1f07a22016-01-29 19:50:28 -05001118}
Richard Levitte8ed40b82016-01-27 19:03:13 +01001119
Richard Levitte7d130f62015-05-19 01:40:54 +02001120
Richard Levitte09aa2632016-03-09 01:14:29 +01001121
Richard Levitte7d130f62015-05-19 01:40:54 +02001122# Deal with bn_ops ###################################################
1123
Richard Levitte7d130f62015-05-19 01:40:54 +02001124$config{bn_ll} =0;
Richard Levitte7d130f62015-05-19 01:40:54 +02001125$config{export_var_as_fn} =0;
1126my $def_int="unsigned int";
1127$config{rc4_int} =$def_int;
Rich Salzb4f35e52016-01-23 13:23:25 -05001128($config{b64l},$config{b64},$config{b32})=(0,0,1);
Richard Levitte7d130f62015-05-19 01:40:54 +02001129
Rich Salz94af0cd2016-01-28 10:13:21 -05001130my $count = 0;
Richard Levitte7d130f62015-05-19 01:40:54 +02001131foreach (sort split(/\s+/,$target{bn_ops})) {
Rich Salz94af0cd2016-01-28 10:13:21 -05001132 $count++ if /SIXTY_FOUR_BIT|SIXTY_FOUR_BIT_LONG|THIRTY_TWO_BIT/;
1133 $config{export_var_as_fn}=1 if $_ eq 'EXPORT_VAR_AS_FN';
1134 $config{bn_ll}=1 if $_ eq 'BN_LLONG';
1135 $config{rc4_int}="unsigned char" if $_ eq 'RC4_CHAR';
1136 ($config{b64l},$config{b64},$config{b32})
1137 =(0,1,0) if $_ eq 'SIXTY_FOUR_BIT';
1138 ($config{b64l},$config{b64},$config{b32})
1139 =(1,0,0) if $_ eq 'SIXTY_FOUR_BIT_LONG';
1140 ($config{b64l},$config{b64},$config{b32})
1141 =(0,0,1) if $_ eq 'THIRTY_TWO_BIT';
Richard Levitte7d130f62015-05-19 01:40:54 +02001142}
Rich Salz94af0cd2016-01-28 10:13:21 -05001143die "Exactly one of SIXTY_FOUR_BIT|SIXTY_FOUR_BIT_LONG|THIRTY_TWO_BIT can be set in bn_ops\n"
1144 if $count > 1;
Richard Levitte7d130f62015-05-19 01:40:54 +02001145
1146
1147# Hack cflags for better warnings (dev option) #######################
1148
Richard Levitte1ed0c662002-05-30 18:06:35 +00001149# "Stringify" the C flags string. This permits it to be made part of a string
1150# and works as well on command lines.
Richard Levitte01d99972016-03-14 10:02:13 +01001151$config{cflags} =~ s/([\\\"])/\\$1/g;
Richard Levitte1ed0c662002-05-30 18:06:35 +00001152
Richard Levitte107b5792015-05-20 20:03:20 +02001153if (defined($config{api})) {
1154 $config{openssl_api_defines} = [ "OPENSSL_MIN_API=".$apitable->{$config{api}} ];
Richard Levittebcb19772016-01-30 02:17:05 +01001155 my $apiflag = sprintf("OPENSSL_API_COMPAT=%s", $apitable->{$config{api}});
Richard Levittebcb19772016-01-30 02:17:05 +01001156 push @{$config{defines}}, $apiflag;
Viktor Dukhovni98186eb2016-01-04 23:00:33 -05001157}
1158
Dr. Stephen Henson0c28f272009-09-09 16:31:32 +00001159if ($strict_warnings)
1160 {
1161 my $wopt;
Rich Salzf1f07a22016-01-29 19:50:28 -05001162 die "ERROR --strict-warnings requires gcc or clang"
1163 unless $ecc eq 'gcc' || $ecc eq 'clang';
Dr. Stephen Henson0c28f272009-09-09 16:31:32 +00001164 foreach $wopt (split /\s+/, $gcc_devteam_warn)
1165 {
Richard Levitted918f9c2016-02-16 23:27:13 +01001166 $config{cflags} .= " $wopt" unless ($config{cflags} =~ /(?:^|\s)$wopt(?:\s|$)/)
Dr. Stephen Henson0c28f272009-09-09 16:31:32 +00001167 }
Ben Laurie190c8c62015-04-19 14:10:54 +01001168 if ($ecc eq "clang")
1169 {
1170 foreach $wopt (split /\s+/, $clang_devteam_warn)
1171 {
Richard Levitted918f9c2016-02-16 23:27:13 +01001172 $config{cflags} .= " $wopt" unless ($config{cflags} =~ /(?:^|\s)$wopt(?:\s|$)/)
Ben Laurie190c8c62015-04-19 14:10:54 +01001173 }
1174 }
Richard Levitteef8ca6b2016-02-14 12:16:52 +01001175 }
1176
1177unless ($disabled{"crypto-mdebug-backtrace"})
1178 {
1179 foreach my $wopt (split /\s+/, $memleak_devteam_backtrace)
Richard Levittea1d3f3d2015-12-02 18:44:26 +01001180 {
Richard Levitted918f9c2016-02-16 23:27:13 +01001181 $config{cflags} .= " $wopt" unless ($config{cflags} =~ /(?:^|\s)$wopt(?:\s|$)/)
Richard Levitteef8ca6b2016-02-14 12:16:52 +01001182 }
1183 if ($target =~ /^BSD-/)
1184 {
1185 $config{ex_libs} .= " -lexecinfo";
Richard Levitte291e94d2015-05-18 22:35:23 +02001186 }
Dr. Stephen Henson0c28f272009-09-09 16:31:32 +00001187 }
1188
Richard Levitte63994092016-02-13 13:02:35 +01001189if ($user_cflags ne "") { $config{cflags}="$config{cflags}$user_cflags"; }
1190else { $no_user_cflags=1; }
1191if (@user_defines) { $config{defines}=[ @{$config{defines}}, @user_defines ]; }
1192else { $no_user_defines=1; }
1193
1194# ALL MODIFICATIONS TO %config and %target MUST BE DONE FROM HERE ON
1195
Richard Levitte79fff392016-03-09 09:04:01 +01001196unless ($disabled{engine}) {
1197 $config{afalg}="";
1198 if ($target =~ m/^linux/) {
1199 my $minver = 4*10000 + 1*100 + 0;
1200 if ($config{cross_compile_prefix} eq "") {
1201 my $verstr = `uname -r`;
1202 my ($ma, $mi1, $mi2) = split("\\.", $verstr);
1203 ($mi2) = $mi2 =~ /(\d+)/;
1204 my $ver = $ma*10000 + $mi1*100 + $mi2;
1205 if ($ver < $minver) {
1206 $disabled{afalg} = "too-old-kernel";
1207 } else {
1208 push @{$config{engdirs}}, "afalg";
1209 }
clucey6cba4a62016-02-23 08:01:01 +00001210 }
Richard Levitte79fff392016-03-09 09:04:01 +01001211 } else {
1212 $disabled{afalg} = "not-linux";
clucey7f458a42016-02-17 13:38:36 +00001213 }
1214}
Matt Caswell8da00a32016-02-29 13:36:47 +00001215
1216push @{$config{openssl_other_defines}}, "OPENSSL_NO_AFALGENG" if ($disabled{afalg});
clucey7f458a42016-02-17 13:38:36 +00001217
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001218# If we use the unified build, collect information from build.info files
1219my %unified_info = ();
1220
Richard Levitteddf18472016-01-30 00:57:33 +01001221if ($builder eq "unified") {
1222 # Store the name of the template file we will build the build file from
1223 # in %config. This may be useful for the build file itself.
1224 my $build_file_template =
1225 catfile($srcdir, "Configurations",
1226 $builder_platform."-".$target{build_file}.".tmpl");
1227 $build_file_template =
1228 catfile($srcdir, "Configurations", $target{build_file}.".tmpl")
1229 if (! -f $build_file_template);
1230 $config{build_file_template} = $build_file_template;
1231
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001232 use lib catdir(dirname(__FILE__),"util");
1233 use with_fallback qw(Text::Template);
1234
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001235 sub cleandir {
Richard Levitte2e963842016-02-10 02:00:37 +01001236 my $base = shift;
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001237 my $dir = shift;
Richard Levitte2e963842016-02-10 02:00:37 +01001238 my $relativeto = shift || ".";
1239
1240 $dir = catdir($base,$dir) unless isabsolute($dir);
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001241
Richard Levitteec182ef2016-02-09 10:15:13 +01001242 # Make sure the directories we're building in exists
1243 mkpath($dir);
1244
Richard Levitte2e963842016-02-10 02:00:37 +01001245 my $res = abs2rel(absolutedir($dir), rel2abs($relativeto));
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001246 #print STDERR "DEBUG[cleandir]: $dir , $base => $res\n";
1247 return $res;
1248 }
1249
1250 sub cleanfile {
Richard Levitte2e963842016-02-10 02:00:37 +01001251 my $base = shift;
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001252 my $file = shift;
Richard Levitte2e963842016-02-10 02:00:37 +01001253 my $relativeto = shift || ".";
1254
1255 $file = catfile($base,$file) unless isabsolute($file);
1256
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001257 my $d = dirname($file);
1258 my $f = basename($file);
1259
Richard Levitteec182ef2016-02-09 10:15:13 +01001260 # Make sure the directories we're building in exists
1261 mkpath($d);
1262
Richard Levitte2e963842016-02-10 02:00:37 +01001263 my $res = abs2rel(catfile(absolutedir($d), $f), rel2abs($relativeto));
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001264 #print STDERR "DEBUG[cleanfile]: $d , $f => $res\n";
1265 return $res;
1266 }
1267
1268 my @build_infos = ( [ ".", "build.info" ] );
1269 foreach (@{$config{dirs}}) {
1270 push @build_infos, [ $_, "build.info" ]
1271 if (-f catfile($srcdir, $_, "build.info"));
1272 }
1273 foreach (@{$config{sdirs}}) {
1274 push @build_infos, [ catdir("crypto", $_), "build.info" ]
1275 if (-f catfile($srcdir, "crypto", $_, "build.info"));
1276 }
1277 foreach (@{$config{engdirs}}) {
1278 push @build_infos, [ catdir("engines", $_), "build.info" ]
1279 if (-f catfile($srcdir, "engines", $_, "build.info"));
1280 }
1281
Richard Levitte2e0956b2016-02-28 01:13:17 +01001282 $config{build_infos} = [ ];
1283
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001284 foreach (@build_infos) {
1285 my $sourced = catdir($srcdir, $_->[0]);
1286 my $buildd = catdir($blddir, $_->[0]);
1287
Richard Levittedca99382016-02-08 16:27:15 +01001288 mkpath($buildd);
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001289
1290 my $f = $_->[1];
1291 # The basic things we're trying to build
1292 my @programs = ();
1293 my @libraries = ();
1294 my @engines = ();
1295 my @scripts = ();
1296 my @extra = ();
Richard Levitte8a679462016-03-07 14:50:37 +01001297 my @overrides = ();
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001298 my @intermediates = ();
1299 my @rawlines = ();
1300
1301 my %ordinals = ();
1302 my %sources = ();
1303 my %includes = ();
1304 my %depends = ();
1305 my %renames = ();
1306 my %sharednames = ();
Richard Levitteae4c7452016-03-07 14:37:00 +01001307 my %generate = ();
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001308
Richard Levitte2e0956b2016-02-28 01:13:17 +01001309 push @{$config{build_infos}}, catfile(abs2rel($sourced, $blddir), $f);
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001310 my $template = Text::Template->new(TYPE => 'FILE',
1311 SOURCE => catfile($sourced, $f));
1312 die "Something went wrong with $sourced/$f: $!\n" unless $template;
1313 my @text =
1314 split /^/m,
1315 $template->fill_in(HASH => { config => \%config,
1316 target => \%target,
Richard Levitte9e04edf2016-02-22 13:45:46 +01001317 disabled => \%disabled,
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001318 builddir => abs2rel($buildd, $blddir),
1319 sourcedir => abs2rel($sourced, $blddir),
1320 buildtop => abs2rel($blddir, $blddir),
1321 sourcetop => abs2rel($srcdir, $blddir) },
1322 DELIMITERS => [ "{-", "-}" ]);
1323
1324 # The top item of this stack has the following values
1325 # -2 positive already run and we found ELSE (following ELSIF should fail)
1326 # -1 positive already run (skip until ENDIF)
1327 # 0 negatives so far (if we're at a condition, check it)
1328 # 1 last was positive (don't skip lines until next ELSE, ELSIF or ENDIF)
1329 # 2 positive ELSE (following ELSIF should fail)
1330 my @skip = ();
1331 collect_information(
1332 collect_from_array([ @text ],
1333 qr/\\$/ => sub { my $l1 = shift; my $l2 = shift;
1334 $l1 =~ s/\\$//; $l1.$l2 }),
1335 # Info we're looking for
1336 qr/^\s*IF\[((?:\\.|[^\\\]])*)\]\s*$/
Richard Levitte635bd402016-03-09 14:33:37 +01001337 => sub {
Richard Levittec5798e02016-03-09 23:58:44 +01001338 if (! @skip || $skip[$#skip] > 0) {
Richard Levitte635bd402016-03-09 14:33:37 +01001339 push @skip, !! $1;
1340 } else {
1341 push @skip, -1;
1342 }
1343 },
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001344 qr/^\s*ELSIF\[((?:\\.|[^\\\]])*)\]\s*$/
1345 => sub { die "ELSIF out of scope" if ! @skip;
1346 die "ELSIF following ELSE" if abs($skip[$#skip]) == 2;
1347 $skip[$#skip] = -1 if $skip[$#skip] != 0;
1348 $skip[$#skip] = !! $1
1349 if $skip[$#skip] == 0; },
1350 qr/^\s*ELSE\s*$/
1351 => sub { die "ELSE out of scope" if ! @skip;
1352 $skip[$#skip] = -2 if $skip[$#skip] != 0;
1353 $skip[$#skip] = 2 if $skip[$#skip] == 0; },
1354 qr/^\s*ENDIF\s*$/
1355 => sub { die "ENDIF out of scope" if ! @skip;
1356 pop @skip; },
1357 qr/^\s*PROGRAMS\s*=\s*(.*)\s*$/
1358 => sub { push @programs, split(/\s+/, $1)
1359 if !@skip || $skip[$#skip] > 0 },
1360 qr/^\s*LIBS\s*=\s*(.*)\s*$/
1361 => sub { push @libraries, split(/\s+/, $1)
1362 if !@skip || $skip[$#skip] > 0 },
1363 qr/^\s*ENGINES\s*=\s*(.*)\s*$/
1364 => sub { push @engines, split(/\s+/, $1)
1365 if !@skip || $skip[$#skip] > 0 },
1366 qr/^\s*SCRIPTS\s*=\s*(.*)\s*$/
1367 => sub { push @scripts, split(/\s+/, $1)
1368 if !@skip || $skip[$#skip] > 0 },
1369 qr/^\s*EXTRA\s*=\s*(.*)\s*$/
1370 => sub { push @extra, split(/\s+/, $1)
1371 if !@skip || $skip[$#skip] > 0 },
Richard Levitte8a679462016-03-07 14:50:37 +01001372 qr/^\s*OVERRIDES\s*=\s*(.*)\s*$/
1373 => sub { push @overrides, split(/\s+/, $1)
1374 if !@skip || $skip[$#skip] > 0 },
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001375
1376 qr/^\s*ORDINALS\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/,
1377 => sub { push @{$ordinals{$1}}, split(/\s+/, $2)
1378 if !@skip || $skip[$#skip] > 0 },
1379 qr/^\s*SOURCE\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/
1380 => sub { push @{$sources{$1}}, split(/\s+/, $2)
1381 if !@skip || $skip[$#skip] > 0 },
1382 qr/^\s*INCLUDE\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/
1383 => sub { push @{$includes{$1}}, split(/\s+/, $2)
1384 if !@skip || $skip[$#skip] > 0 },
1385 qr/^\s*DEPEND\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/
1386 => sub { push @{$depends{$1}}, split(/\s+/, $2)
1387 if !@skip || $skip[$#skip] > 0 },
Richard Levitteae4c7452016-03-07 14:37:00 +01001388 qr/^\s*GENERATE\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/
1389 => sub { push @{$generate{$1}}, $2
1390 if !@skip || $skip[$#skip] > 0 },
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001391 qr/^\s*RENAME\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/
1392 => sub { push @{$renames{$1}}, split(/\s+/, $2)
1393 if !@skip || $skip[$#skip] > 0 },
1394 qr/^\s*SHARED_NAME\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/
1395 => sub { push @{$sharednames{$1}}, split(/\s+/, $2)
1396 if !@skip || $skip[$#skip] > 0 },
1397 qr/^\s*BEGINRAW\[((?:\\.|[^\\\]])+)\]\s*$/
1398 => sub {
1399 my $lineiterator = shift;
1400 my $target_kind = $1;
1401 while (defined $lineiterator->()) {
Richard Levitte04f171c2016-02-12 12:10:27 +01001402 s|\R$||;
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001403 if (/^\s*ENDRAW\[((?:\\.|[^\\\]])+)\]\s*$/) {
1404 die "ENDRAW doesn't match BEGINRAW"
1405 if $1 ne $target_kind;
1406 last;
1407 }
1408 next if @skip && $skip[$#skip] <= 0;
1409 push @rawlines, $_
1410 if ($target_kind eq $target{build_file}
Richard Levitteddf18472016-01-30 00:57:33 +01001411 || $target_kind eq $target{build_file}."(".$builder_platform.")");
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001412 }
1413 },
1414 qr/^(?:#.*|\s*)$/ => sub { },
1415 "OTHERWISE" => sub { die "Something wrong with this line:\n$_\nat $sourced/$f" }
1416 );
1417 die "runaway IF?" if (@skip);
1418
1419 foreach (keys %renames) {
1420 die "$_ renamed to more than one thing: "
1421 ,join(" ", @{$renames{$_}}),"\n"
1422 if scalar @{$renames{$_}} > 1;
Richard Levitte2e963842016-02-10 02:00:37 +01001423 my $dest = cleanfile($buildd, $_, $blddir);
1424 my $to = cleanfile($buildd, $renames{$_}->[0], $blddir);
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001425 die "$dest renamed to more than one thing: "
1426 ,$unified_info{rename}->{$dest}, $to
1427 unless !defined($unified_info{rename}->{$dest})
1428 or $unified_info{rename}->{$dest} eq $to;
1429 $unified_info{rename}->{$dest} = $to;
1430 }
1431
1432 foreach (@programs) {
Richard Levitte2e963842016-02-10 02:00:37 +01001433 my $program = cleanfile($buildd, $_, $blddir);
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001434 if ($unified_info{rename}->{$program}) {
1435 $program = $unified_info{rename}->{$program};
1436 }
1437 $unified_info{programs}->{$program} = 1;
1438 }
1439
1440 foreach (@libraries) {
Richard Levitte2e963842016-02-10 02:00:37 +01001441 my $library = cleanfile($buildd, $_, $blddir);
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001442 if ($unified_info{rename}->{$library}) {
1443 $library = $unified_info{rename}->{$library};
1444 }
1445 $unified_info{libraries}->{$library} = 1;
1446 }
1447
Richard Levitte343ec2b2016-02-19 22:08:37 +01001448 die <<"EOF" if scalar @engines and !$config{dynamic_engines};
Richard Levitte19ab5792016-02-22 02:06:05 +01001449ENGINES can only be used if configured with 'dynamic-engine'.
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001450This is usually a fault in a build.info file.
1451EOF
1452 foreach (@engines) {
Richard Levitte2e963842016-02-10 02:00:37 +01001453 my $library = cleanfile($buildd, $_, $blddir);
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001454 if ($unified_info{rename}->{$library}) {
1455 $library = $unified_info{rename}->{$library};
1456 }
1457 $unified_info{engines}->{$library} = 1;
1458 }
1459
1460 foreach (@scripts) {
Richard Levitte2e963842016-02-10 02:00:37 +01001461 my $script = cleanfile($buildd, $_, $blddir);
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001462 if ($unified_info{rename}->{$script}) {
1463 $script = $unified_info{rename}->{$script};
1464 }
1465 $unified_info{scripts}->{$script} = 1;
1466 }
1467
1468 foreach (@extra) {
Richard Levitte2e963842016-02-10 02:00:37 +01001469 my $extra = cleanfile($buildd, $_, $blddir);
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001470 $unified_info{extra}->{$extra} = 1;
1471 }
1472
Richard Levitte8a679462016-03-07 14:50:37 +01001473 foreach (@overrides) {
1474 my $override = cleanfile($buildd, $_, $blddir);
1475 $unified_info{overrides}->{$override} = 1;
1476 }
1477
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001478 push @{$unified_info{rawlines}}, @rawlines;
1479
Richard Levitte84af1ba2016-02-22 13:52:46 +01001480 unless ($disabled{shared}) {
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001481 # Check sharednames.
1482 foreach (keys %sharednames) {
Richard Levitte2e963842016-02-10 02:00:37 +01001483 my $dest = cleanfile($buildd, $_, $blddir);
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001484 if ($unified_info{rename}->{$dest}) {
1485 $dest = $unified_info{rename}->{$dest};
1486 }
1487 die "shared_name for $dest with multiple values: "
1488 ,join(" ", @{$sharednames{$_}}),"\n"
1489 if scalar @{$sharednames{$_}} > 1;
Richard Levitte2e963842016-02-10 02:00:37 +01001490 my $to = cleanfile($buildd, $sharednames{$_}->[0], $blddir);
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001491 die "shared_name found for a library $dest that isn't defined\n"
1492 unless $unified_info{libraries}->{$dest};
1493 die "shared_name for $dest with multiple values: "
1494 ,$unified_info{sharednames}->{$dest}, ", ", $to
1495 unless !defined($unified_info{sharednames}->{$dest})
1496 or $unified_info{sharednames}->{$dest} eq $to;
1497 $unified_info{sharednames}->{$dest} = $to;
1498 }
1499
1500 # Additionally, we set up sharednames for libraries that don't
1501 # have any, as themselves.
1502 foreach (keys %{$unified_info{libraries}}) {
1503 if (!defined $unified_info{sharednames}->{$_}) {
1504 $unified_info{sharednames}->{$_} = $_
1505 }
1506 }
1507 }
1508
1509 foreach (keys %ordinals) {
1510 my $dest = $_;
Richard Levitte2e963842016-02-10 02:00:37 +01001511 my $ddest = cleanfile($buildd, $_, $blddir);
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001512 if ($unified_info{rename}->{$ddest}) {
1513 $ddest = $unified_info{rename}->{$ddest};
1514 }
1515 foreach (@{$ordinals{$dest}}) {
1516 my %known_ordinals =
1517 (
1518 crypto =>
Richard Levitte6928b612016-03-03 12:42:01 +01001519 cleanfile($sourced, catfile("util", "libcrypto.num"), $blddir),
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001520 ssl =>
Richard Levitte6928b612016-03-03 12:42:01 +01001521 cleanfile($sourced, catfile("util", "libssl.num"), $blddir)
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001522 );
1523 my $o = $known_ordinals{$_};
1524 die "Ordinals for $ddest defined more than once\n"
1525 if $unified_info{ordinals}->{$ddest};
1526 $unified_info{ordinals}->{$ddest} = [ $_, $o ];
1527 }
1528 }
1529
1530 foreach (keys %sources) {
1531 my $dest = $_;
Richard Levitte2e963842016-02-10 02:00:37 +01001532 my $ddest = cleanfile($buildd, $_, $blddir);
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001533 if ($unified_info{rename}->{$ddest}) {
1534 $ddest = $unified_info{rename}->{$ddest};
1535 }
1536 foreach (@{$sources{$dest}}) {
Richard Levitte2e963842016-02-10 02:00:37 +01001537 my $s = cleanfile($sourced, $_, $blddir);
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001538
1539 # If it isn't in the source tree, we assume it's generated
1540 # in the build tree
1541 if (! -f $s) {
Richard Levitte2e963842016-02-10 02:00:37 +01001542 $s = cleanfile($buildd, $_, $blddir);
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001543 }
1544 # We recognise C and asm files
1545 if ($s =~ /\.[csS]\b$/) {
1546 (my $o = $_) =~ s/\.[csS]\b$/.o/;
Richard Levitte2e963842016-02-10 02:00:37 +01001547 $o = cleanfile($buildd, $o, $blddir);
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001548 $unified_info{sources}->{$ddest}->{$o} = 1;
1549 $unified_info{sources}->{$o}->{$s} = 1;
1550 } else {
1551 $unified_info{sources}->{$ddest}->{$s} = 1;
1552 }
1553 }
1554 }
1555
Richard Levitteae4c7452016-03-07 14:37:00 +01001556 foreach (keys %generate) {
1557 my $dest = $_;
1558 my $ddest = cleanfile($buildd, $_, $blddir);
1559 if ($unified_info{rename}->{$ddest}) {
1560 $ddest = $unified_info{rename}->{$ddest};
1561 }
1562 die "more than one generator for $dest: "
1563 ,join(" ", @{$generate{$_}}),"\n"
1564 if scalar @{$generate{$_}} > 1;
1565 my @generator = split /\s+/, $generate{$dest}->[0];
1566 $generator[0] = cleanfile($sourced, $generator[0], $blddir),
1567 $unified_info{generate}->{$ddest} = [ @generator ];
1568 }
1569
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001570 foreach (keys %depends) {
1571 my $dest = $_;
Richard Levitte2e963842016-02-10 02:00:37 +01001572 my $ddest = cleanfile($buildd, $_, $blddir);
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001573 if ($unified_info{rename}->{$ddest}) {
1574 $ddest = $unified_info{rename}->{$ddest};
1575 }
1576 foreach (@{$depends{$dest}}) {
Richard Levitte2e963842016-02-10 02:00:37 +01001577 my $d = cleanfile($sourced, $_, $blddir);
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001578
Richard Levittee737d7b2016-02-11 15:22:27 +01001579 # If we know it's generated, or assume it is because we can't
1580 # find it in the source tree, we set file we depend on to be
1581 # in the build tree rather than the source tree, and assume
1582 # and that there are lines to build it in a BEGINRAW..ENDRAW
1583 # section or in the Makefile template.
1584 if (! -f $d
1585 || !(grep { $d eq $_ }
1586 map { cleanfile($srcdir, $_, $blddir) }
1587 (@generated_headers, @generated_by_make_headers))) {
Richard Levitte2e963842016-02-10 02:00:37 +01001588 $d = cleanfile($buildd, $_, $blddir);
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001589 }
1590 # Take note if the file to depend on is being renamed
1591 if ($unified_info{rename}->{$d}) {
1592 $d = $unified_info{rename}->{$d};
1593 }
1594 $unified_info{depends}->{$ddest}->{$d} = 1;
1595 # If we depend on a header file, let's make sure it
1596 # can get included
1597 if ($d =~ /\.h$/) {
1598 my $i = dirname($d);
1599 push @{$unified_info{includes}->{$ddest}}, $i
1600 unless grep { $_ eq $i } @{$unified_info{includes}->{$ddest}};
1601 }
1602 }
1603 }
1604
1605 foreach (keys %includes) {
1606 my $dest = $_;
Richard Levitte2e963842016-02-10 02:00:37 +01001607 my $ddest = cleanfile($buildd, $_, $blddir);
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001608 if ($unified_info{rename}->{$ddest}) {
1609 $ddest = $unified_info{rename}->{$ddest};
1610 }
1611 foreach (@{$includes{$dest}}) {
Richard Levitte2e963842016-02-10 02:00:37 +01001612 my $i = cleandir($sourced, $_, $blddir);
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001613 push @{$unified_info{includes}->{$ddest}}, $i
1614 unless grep { $_ eq $i } @{$unified_info{includes}->{$ddest}};
1615 }
1616 }
1617 }
1618
1619 ### Make unified_info a bit more efficient
1620 # One level structures
Richard Levitte8a679462016-03-07 14:50:37 +01001621 foreach (("programs", "libraries", "engines", "scripts", "extra", "overrides")) {
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001622 $unified_info{$_} = [ sort keys %{$unified_info{$_}} ];
1623 }
1624 # Two level structures
1625 foreach my $l1 (("sources", "ldadd", "depends")) {
1626 foreach my $l2 (sort keys %{$unified_info{$l1}}) {
1627 $unified_info{$l1}->{$l2} =
1628 [ sort keys %{$unified_info{$l1}->{$l2}} ];
1629 }
1630 }
1631}
1632
1633# For the schemes that need it, we provide the old *_obj configs
1634# from the *_asm_obj ones
Richard Levitte3a55c922016-02-18 18:43:56 +01001635foreach (grep /_(asm|aux)_src$/, keys %target) {
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001636 my $src = $_;
Richard Levitte3a55c922016-02-18 18:43:56 +01001637 (my $obj = $_) =~ s/_(asm|aux)_src$/_obj/;
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001638 ($target{$obj} = $target{$src}) =~ s/\.[csS]\b/.o/g;
1639}
1640
Richard Levitte291e94d2015-05-18 22:35:23 +02001641# Write down our configuration where it fits #########################
1642
1643open(OUT,">configdata.pm") || die "unable to create configdata.pm: $!\n";
1644print OUT <<"EOF";
1645package configdata;
1646
1647use strict;
1648use warnings;
1649
1650use Exporter;
1651#use vars qw(\@ISA \@EXPORT);
1652our \@ISA = qw(Exporter);
Richard Levitte58163022016-02-22 19:17:06 +01001653our \@EXPORT = qw(\%config \%target %disabled %withargs %unified_info);
Richard Levitte291e94d2015-05-18 22:35:23 +02001654
1655EOF
1656print OUT "our %config = (\n";
1657foreach (sort keys %config) {
1658 if (ref($config{$_}) eq "ARRAY") {
1659 print OUT " ", $_, " => [ ", join(", ",
1660 map { quotify("perl", $_) }
1661 @{$config{$_}}), " ],\n";
1662 } else {
1663 print OUT " ", $_, " => ", quotify("perl", $config{$_}), ",\n"
1664 }
1665}
1666print OUT <<"EOF";
1667);
1668
1669EOF
1670print OUT "our %target = (\n";
1671foreach (sort keys %target) {
1672 if (ref($target{$_}) eq "ARRAY") {
1673 print OUT " ", $_, " => [ ", join(", ",
1674 map { quotify("perl", $_) }
1675 @{$target{$_}}), " ],\n";
1676 } else {
1677 print OUT " ", $_, " => ", quotify("perl", $target{$_}), ",\n"
1678 }
1679}
1680print OUT <<"EOF";
1681);
1682
Richard Levitte107b5792015-05-20 20:03:20 +02001683EOF
Richard Levitte96d2d7b2016-01-26 02:09:33 +01001684print OUT "our \%available_protocols = (\n";
1685print OUT " tls => [ ", join(", ", map { quotify("perl", $_) } @tls), " ],\n";
1686print OUT " dtls => [ ", join(", ", map { quotify("perl", $_) } @dtls), " ],\n";
1687print OUT <<"EOF";
1688);
1689
1690EOF
1691print OUT "our \%disabled = (\n";
1692foreach (sort keys %disabled) {
1693 print OUT " ", quotify("perl", $_), " => ", quotify("perl", $disabled{$_}), ",\n";
1694}
1695print OUT <<"EOF";
1696);
1697
1698EOF
Richard Levitte107b5792015-05-20 20:03:20 +02001699print OUT "our %withargs = (\n";
1700foreach (sort keys %withargs) {
1701 if (ref($withargs{$_}) eq "ARRAY") {
1702 print OUT " ", $_, " => [ ", join(", ",
1703 map { quotify("perl", $_) }
1704 @{$withargs{$_}}), " ],\n";
1705 } else {
1706 print OUT " ", $_, " => ", quotify("perl", $withargs{$_}), ",\n"
1707 }
1708}
1709print OUT <<"EOF";
1710);
1711
Richard Levitte291e94d2015-05-18 22:35:23 +02001712EOF
Richard Levitteddf18472016-01-30 00:57:33 +01001713if ($builder eq "unified") {
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001714 my $recurse;
1715 $recurse = sub {
1716 my $indent = shift;
1717 foreach (@_) {
1718 if (ref $_ eq "ARRAY") {
1719 print OUT " "x$indent, "[\n";
1720 foreach (@$_) {
1721 $recurse->($indent + 4, $_);
1722 }
1723 print OUT " "x$indent, "],\n";
1724 } elsif (ref $_ eq "HASH") {
1725 my %h = %$_;
1726 print OUT " "x$indent, "{\n";
1727 foreach (sort keys %h) {
1728 if (ref $h{$_} eq "") {
1729 print OUT " "x($indent + 4), quotify("perl", $_), " => ", quotify("perl", $h{$_}), ",\n";
1730 } else {
1731 print OUT " "x($indent + 4), quotify("perl", $_), " =>\n";
1732 $recurse->($indent + 8, $h{$_});
1733 }
1734 }
1735 print OUT " "x$indent, "},\n";
1736 } else {
1737 print OUT " "x$indent, quotify("perl", $_), ",\n";
1738 }
1739 }
1740 };
1741 print OUT "our %unified_info = (\n";
1742 foreach (sort keys %unified_info) {
1743 if (ref $unified_info{$_} eq "") {
1744 print OUT " "x4, quotify("perl", $_), " => ", quotify("perl", $unified_info{$_}), ",\n";
1745 } else {
1746 print OUT " "x4, quotify("perl", $_), " =>\n";
1747 $recurse->(8, $unified_info{$_});
1748 }
1749 }
1750 print OUT <<"EOF";
1751);
1752
1753EOF
1754}
1755print OUT "1;\n";
Richard Levitte291e94d2015-05-18 22:35:23 +02001756close(OUT);
1757
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001758
Richard Levitteddf18472016-01-30 00:57:33 +01001759print "IsMK1MF =", ($builder eq "mk1mf" ? "yes" : "no"), "\n";
Richard Levitte291e94d2015-05-18 22:35:23 +02001760print "CC =$target{cc}\n";
Richard Levitte2952b9b2016-03-02 10:57:05 +01001761print "CFLAG =$target{cflags} $config{cflags}\n";
Richard Levitte63ee71292016-03-04 15:41:42 +01001762print "SHARED_CFLAG =$target{shared_cflag}\n";
Richard Levitte2952b9b2016-03-02 10:57:05 +01001763print "DEFINES =",join(" ", @{$target{defines}}, @{$config{defines}}),"\n";
Richard Levitte940a09b2016-02-27 11:42:13 +01001764print "LFLAG =$target{lflags}\n";
1765print "PLIB_LFLAG =$target{plib_lflags}\n";
Richard Levitte2952b9b2016-03-02 10:57:05 +01001766print "EX_LIBS =$target{ex_libs} $config{ex_libs}\n";
Richard Levitteb7569672016-03-02 09:34:26 +01001767print "APPS_OBJ =$target{apps_obj}\n";
Richard Levitte291e94d2015-05-18 22:35:23 +02001768print "CPUID_OBJ =$target{cpuid_obj}\n";
Richard Levitteb7569672016-03-02 09:34:26 +01001769print "UPLINK_OBJ =$target{uplink_obj}\n";
Richard Levitte291e94d2015-05-18 22:35:23 +02001770print "BN_ASM =$target{bn_obj}\n";
1771print "EC_ASM =$target{ec_obj}\n";
1772print "DES_ENC =$target{des_obj}\n";
1773print "AES_ENC =$target{aes_obj}\n";
1774print "BF_ENC =$target{bf_obj}\n";
1775print "CAST_ENC =$target{cast_obj}\n";
1776print "RC4_ENC =$target{rc4_obj}\n";
1777print "RC5_ENC =$target{rc5_obj}\n";
1778print "MD5_OBJ_ASM =$target{md5_obj}\n";
1779print "SHA1_OBJ_ASM =$target{sha1_obj}\n";
1780print "RMD160_OBJ_ASM=$target{rmd160_obj}\n";
1781print "CMLL_ENC =$target{cmll_obj}\n";
1782print "MODES_OBJ =$target{modes_obj}\n";
Richard Levittef0bd4682016-01-25 21:51:22 +01001783print "PADLOCK_OBJ =$target{padlock_obj}\n";
Richard Levitte291e94d2015-05-18 22:35:23 +02001784print "CHACHA_ENC =$target{chacha_obj}\n";
1785print "POLY1305_OBJ =$target{poly1305_obj}\n";
Bill Cox2d0b4412016-03-09 23:08:31 +01001786print "BLAKE2_OBJ =$target{blake2_obj}\n";
Richard Levitte7d130f62015-05-19 01:40:54 +02001787print "PROCESSOR =$config{processor}\n";
Richard Levitte291e94d2015-05-18 22:35:23 +02001788print "RANLIB =$target{ranlib}\n";
1789print "ARFLAGS =$target{arflags}\n";
1790print "PERL =$config{perl}\n";
Richard Levittef0bd4682016-01-25 21:51:22 +01001791print "\n";
Richard Levitte7d130f62015-05-19 01:40:54 +02001792print "SIXTY_FOUR_BIT_LONG mode\n" if $config{b64l};
1793print "SIXTY_FOUR_BIT mode\n" if $config{b64};
1794print "THIRTY_TWO_BIT mode\n" if $config{b32};
Richard Levitte7d130f62015-05-19 01:40:54 +02001795print "BN_LLONG mode\n" if $config{bn_ll};
Richard Levitte01d99972016-03-14 10:02:13 +01001796print "RC4 uses $config{rc4_int}\n" if $config{rc4_int} ne $def_int;
Ben Lauriecba50681999-03-07 14:05:36 +00001797
Richard Levittee737d7b2016-02-11 15:22:27 +01001798for (@generated_headers) {
1799 mkpath(catdir($blddir, dirname($_)));
1800 run_dofile(catfile($blddir, $_),
1801 catfile($srcdir, $_.".in"));
Richard Levittef0bd4682016-01-25 21:51:22 +01001802}
1803
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001804###
1805### When the old "unixmake" scheme goes away, so does this function
1806###
1807sub build_Makefile {
1808 run_dofile("Makefile","Makefile.in");
1809
1810 # Copy all Makefile.in to Makefile (except top-level)
1811 use File::Find;
1812 use IO::File;
1813 find(
1814 {
1815 preprocess => sub {
1816 grep(!/^\./, @_);
1817 },
1818 wanted => sub {
1819 return if ($_ ne "Makefile.in" || $File::Find::dir eq ".");
1820 my $in = IO::File->new($_, "r") or
1821 die sprintf "Error reading Makefile.in in %s: !$\n",
1822 $File::Find::dir;
1823 my $out = IO::File->new("Makefile", "w") or
1824 die sprintf "Error writing Makefile in %s: !$\n",
1825 $File::Find::dir;
1826 print $out "# Generated from $_, do not edit\n";
1827 while (my $line = <$in>) { print $out $line }
1828 $in->close() or
1829 die sprintf "Error reading Makefile.in in %s: !$\n",
1830 $File::Find::dir;
1831 $out->close() or
1832 die sprintf "Error writing Makefile in %s: !$\n",
1833 $File::Find::dir;
1834 },
Richard Levittefb36ca12016-01-31 11:51:07 +01001835 },
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001836 ".");
1837}
Rich Salzd10dac12016-01-12 16:25:30 -05001838
Richard Levitte88087412015-05-18 14:31:49 +02001839my %builders = (
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001840 unified => sub {
Richard Levitteddf18472016-01-30 00:57:33 +01001841 run_dofile(catfile($blddir, $target{build_file}),
1842 $config{build_file_template},
1843 catfile($srcdir, "Configurations", "common.tmpl"));
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001844 },
Richard Levitte88087412015-05-18 14:31:49 +02001845 unixmake => sub {
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001846 build_Makefile();
1847
1848 run_dofile("util/domd", "util/domd.in");
1849 chmod 0755, "util/domd";
Richard Levitte88087412015-05-18 14:31:49 +02001850 },
1851 mk1mf => sub {
Richard Levitteddf18472016-01-30 00:57:33 +01001852 my $platform = shift;
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001853 # The only reason we do this is to have something to build MINFO from
1854 build_Makefile();
1855
Richard Levitte88087412015-05-18 14:31:49 +02001856 # create the ms/version32.rc file if needed
Mat7839b732016-02-09 22:53:14 +01001857 if ($platform ne "netware") {
Richard Levitte88087412015-05-18 14:31:49 +02001858 my ($v1, $v2, $v3, $v4);
Richard Levitte3fa04f02016-01-12 00:17:12 +01001859 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) {
Dr. Stephen Hensonfc6a6a12002-10-04 21:22:47 +00001860 $v1=hex $1;
1861 $v2=hex $2;
1862 $v3=hex $3;
1863 $v4=hex $4;
Richard Levitte88087412015-05-18 14:31:49 +02001864 }
1865 open (OUT,">ms/version32.rc") || die "Can't open ms/version32.rc";
1866 print OUT <<"EOF";
Dr. Stephen Hensonfc6a6a12002-10-04 21:22:47 +00001867#include <winver.h>
1868
1869LANGUAGE 0x09,0x01
1870
18711 VERSIONINFO
1872 FILEVERSION $v1,$v2,$v3,$v4
1873 PRODUCTVERSION $v1,$v2,$v3,$v4
1874 FILEFLAGSMASK 0x3fL
1875#ifdef _DEBUG
1876 FILEFLAGS 0x01L
1877#else
1878 FILEFLAGS 0x00L
1879#endif
1880 FILEOS VOS__WINDOWS32
1881 FILETYPE VFT_DLL
1882 FILESUBTYPE 0x0L
1883BEGIN
1884 BLOCK "StringFileInfo"
1885 BEGIN
1886 BLOCK "040904b0"
1887 BEGIN
Felix Laurie von Massenbachfce0ba52014-05-26 17:19:28 +01001888 // Required:
Dr. Stephen Hensonfc6a6a12002-10-04 21:22:47 +00001889 VALUE "CompanyName", "The OpenSSL Project, http://www.openssl.org/\\0"
1890 VALUE "FileDescription", "OpenSSL Shared Library\\0"
Richard Levitte3fa04f02016-01-12 00:17:12 +01001891 VALUE "FileVersion", "$config{version}\\0"
Dr. Stephen Hensonfc6a6a12002-10-04 21:22:47 +00001892#if defined(CRYPTO)
Richard Levitte6928b612016-03-03 12:42:01 +01001893 VALUE "InternalName", "libcrypto32\\0"
1894 VALUE "OriginalFilename", "libcrypto32.dll\\0"
Dr. Stephen Hensonfc6a6a12002-10-04 21:22:47 +00001895#elif defined(SSL)
Richard Levitte6928b612016-03-03 12:42:01 +01001896 VALUE "InternalName", "libssl32\\0"
1897 VALUE "OriginalFilename", "libssl32.dll\\0"
Dr. Stephen Hensona479d722015-02-04 22:51:01 +00001898#endif
Dr. Stephen Hensonfc6a6a12002-10-04 21:22:47 +00001899 VALUE "ProductName", "The OpenSSL Toolkit\\0"
Richard Levitte3fa04f02016-01-12 00:17:12 +01001900 VALUE "ProductVersion", "$config{version}\\0"
Dr. Stephen Hensonfc6a6a12002-10-04 21:22:47 +00001901 // Optional:
1902 //VALUE "Comments", "\\0"
Andy Polyakov51cbee32015-09-27 09:23:08 +02001903 VALUE "LegalCopyright", "Copyright © 1998-2015 The OpenSSL Project. Copyright © 1995-1998 Eric A. Young, Tim J. Hudson. All rights reserved.\\0"
Dr. Stephen Hensonfc6a6a12002-10-04 21:22:47 +00001904 //VALUE "LegalTrademarks", "\\0"
1905 //VALUE "PrivateBuild", "\\0"
1906 //VALUE "SpecialBuild", "\\0"
1907 END
1908 END
1909 BLOCK "VarFileInfo"
1910 BEGIN
1911 VALUE "Translation", 0x409, 0x4b0
1912 END
1913END
1914EOF
Richard Levitte88087412015-05-18 14:31:49 +02001915 close(OUT);
1916 }
1917 },
1918 );
1919
Richard Levitteddf18472016-01-30 00:57:33 +01001920$builders{$builder}->($builder_platform, @builder_opts);
Felix Laurie von Massenbachfce0ba52014-05-26 17:19:28 +01001921
Richard Levitte76ffb432015-05-18 02:46:21 +02001922print <<"EOF";
Bodo Möller63d3f441999-09-09 20:21:10 +00001923
Ulf Möller89ec98e2000-02-01 01:35:29 +00001924Configured for $target.
Bodo Möller63d3f441999-09-09 20:21:10 +00001925EOF
Bodo Möller5f8d5c91999-04-29 16:10:09 +00001926
Richard Levitte9c62a272016-02-27 16:51:34 +01001927print <<"EOF" if ($disabled{threads} eq "unavailable");
Bodo Möller5f8d5c91999-04-29 16:10:09 +00001928
1929The library could not be configured for supporting multi-threaded
1930applications as the compiler options required on this system are not known.
Bodo Möllerff1b7e01999-06-26 21:25:01 +00001931See file INSTALL for details if you need multi-threading.
Bodo Möllerec577821999-04-23 22:13:45 +00001932EOF
1933
Richard Levitte76ffb432015-05-18 02:46:21 +02001934print <<"EOF" if ($no_shared_warn);
Richard Levitte2964ba82003-01-11 11:40:39 +00001935
Richard Levitteae482422016-02-22 02:09:11 +01001936The options 'shared', 'pic' and 'dynamic-engine' aren't supported on this
1937platform, so we will pretend you gave the option 'no-pic', which also disables
1938'shared' and 'dynamic-engine'. If you know how to implement shared libraries
1939or position independent code, please let us know (but please first make sure
1940you have tried with a current version of OpenSSL).
Rich Salz2e31ef02015-12-10 12:31:01 -05001941EOF
1942
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001943exit(0);
1944
Richard Levittebd5192b2015-05-18 02:57:24 +02001945######################################################################
1946#
1947# Helpers and utility functions
1948#
1949
1950# Configuration file reading #########################################
1951
1952# Helper function to implement conditional inheritance depending on the
Richard Levitte00b0d662016-02-22 14:10:45 +01001953# value of $disabled{asm}. Used in inherit_from values as follows:
Richard Levittebd5192b2015-05-18 02:57:24 +02001954#
1955# inherit_from => [ "template", asm("asm_tmpl") ]
1956#
1957sub asm {
1958 my @x = @_;
1959 sub {
Richard Levitte00b0d662016-02-22 14:10:45 +01001960 $disabled{asm} ? () : @x;
Richard Levittebd5192b2015-05-18 02:57:24 +02001961 }
1962}
1963
Richard Levitte9c62a272016-02-27 16:51:34 +01001964our $add_called = 0;
Richard Levitte88087412015-05-18 14:31:49 +02001965# Helper function to implement adding values to already existing configuration
1966# values. It handles elements that are ARRAYs, CODEs and scalars
1967sub _add {
1968 my $separator = shift;
1969
Richard Levittebcb19772016-01-30 02:17:05 +01001970 # If there's any ARRAY in the collection of values OR the separator
1971 # is undef, we will return an ARRAY of combined values, otherwise a
1972 # string of joined values with $separator as the separator.
1973 my $found_array = !defined($separator);
Richard Levitte88087412015-05-18 14:31:49 +02001974
1975 my @values =
1976 map {
Richard Levitteb0b92a52016-02-27 11:08:21 +01001977 my $res = $_;
1978 while (ref($res) eq "CODE") {
1979 $res = $res->();
1980 }
1981 if (defined($res)) {
1982 if (ref($res) eq "ARRAY") {
1983 $found_array = 1;
1984 @$res;
1985 } else {
1986 $res;
1987 }
Richard Levitte88087412015-05-18 14:31:49 +02001988 } else {
Richard Levitteb0b92a52016-02-27 11:08:21 +01001989 ();
Richard Levitte88087412015-05-18 14:31:49 +02001990 }
1991 } (@_);
1992
Richard Levitte9c62a272016-02-27 16:51:34 +01001993 $add_called = 1;
1994
Richard Levitte88087412015-05-18 14:31:49 +02001995 if ($found_array) {
1996 [ @values ];
1997 } else {
Richard Levitteb0b92a52016-02-27 11:08:21 +01001998 join($separator, grep { defined($_) && $_ ne "" } @values);
Richard Levitte88087412015-05-18 14:31:49 +02001999 }
2000}
2001sub add_before {
Richard Levittebdcd83e2016-02-25 00:17:59 +01002002 my $separator = " ";
2003 if (ref($_[$#_]) eq "HASH") {
2004 my $opts = pop;
2005 $separator = $opts->{separator};
2006 }
Richard Levitte88087412015-05-18 14:31:49 +02002007 my @x = @_;
2008 sub { _add($separator, @x, @_) };
2009}
2010sub add {
Richard Levittebdcd83e2016-02-25 00:17:59 +01002011 my $separator = " ";
2012 if (ref($_[$#_]) eq "HASH") {
2013 my $opts = pop;
2014 $separator = $opts->{separator};
2015 }
Richard Levitte88087412015-05-18 14:31:49 +02002016 my @x = @_;
2017 sub { _add($separator, @_, @x) };
2018}
2019
Richard Levittebd5192b2015-05-18 02:57:24 +02002020# configuration reader, evaluates the input file as a perl script and expects
2021# it to fill %targets with target configurations. Those are then added to
2022# %table.
2023sub read_config {
2024 my $fname = shift;
2025 open(CONFFILE, "< $fname")
2026 or die "Can't open configuration file '$fname'!\n";
2027 my $x = $/;
2028 undef $/;
2029 my $content = <CONFFILE>;
2030 $/ = $x;
2031 close(CONFFILE);
2032 my %targets = ();
2033 {
2034 local %table = %::table; # Protect %table from tampering
2035
2036 eval $content;
2037 warn $@ if $@;
2038 }
2039
2040 # For each target, check that it's configured with a hash table.
2041 foreach (keys %targets) {
2042 if (ref($targets{$_}) ne "HASH") {
2043 if (ref($targets{$_}) eq "") {
2044 warn "Deprecated target configuration for $_, ignoring...\n";
2045 } else {
2046 warn "Misconfigured target configuration for $_ (should be a hash table), ignoring...\n";
2047 }
2048 delete $targets{$_};
2049 }
2050 }
2051
2052 %table = (%table, %targets);
2053
2054}
2055
2056# configuration resolver. Will only resolve all the lazy evalutation
2057# codeblocks for the chozen target and all those it inherits from,
2058# recursively
2059sub resolve_config {
2060 my $target = shift;
2061 my @breadcrumbs = @_;
2062
Richard Levittec4718842016-03-09 17:18:07 +01002063# my $extra_checks = defined($ENV{CONFIGURE_EXTRA_CHECKS});
Richard Levitte9c62a272016-02-27 16:51:34 +01002064
Richard Levittebd5192b2015-05-18 02:57:24 +02002065 if (grep { $_ eq $target } @breadcrumbs) {
2066 die "inherit_from loop! target backtrace:\n "
2067 ,$target,"\n ",join("\n ", @breadcrumbs),"\n";
2068 }
2069
2070 if (!defined($table{$target})) {
2071 warn "Warning! target $target doesn't exist!\n";
2072 return ();
2073 }
2074 # Recurse through all inheritances. They will be resolved on the
2075 # fly, so when this operation is done, they will all just be a
2076 # bunch of attributes with string values.
2077 # What we get here, though, are keys with references to lists of
2078 # the combined values of them all. We will deal with lists after
2079 # this stage is done.
2080 my %combined_inheritance = ();
2081 if ($table{$target}->{inherit_from}) {
2082 my @inherit_from =
2083 map { ref($_) eq "CODE" ? $_->() : $_ } @{$table{$target}->{inherit_from}};
2084 foreach (@inherit_from) {
2085 my %inherited_config = resolve_config($_, $target, @breadcrumbs);
2086
2087 # 'template' is a marker that's considered private to
2088 # the config that had it.
2089 delete $inherited_config{template};
2090
2091 map {
2092 if (!$combined_inheritance{$_}) {
2093 $combined_inheritance{$_} = [];
2094 }
2095 push @{$combined_inheritance{$_}}, $inherited_config{$_};
2096 } keys %inherited_config;
2097 }
2098 }
2099
2100 # We won't need inherit_from in this target any more, since we've
2101 # resolved all the inheritances that lead to this
2102 delete $table{$target}->{inherit_from};
2103
2104 # Now is the time to deal with those lists. Here's the place to
2105 # decide what shall be done with those lists, all based on the
2106 # values of the target we're currently dealing with.
2107 # - If a value is a coderef, it will be executed with the list of
2108 # inherited values as arguments.
2109 # - If the corresponding key doesn't have a value at all or is the
2110 # emoty string, the inherited value list will be run through the
2111 # default combiner (below), and the result becomes this target's
2112 # value.
2113 # - Otherwise, this target's value is assumed to be a string that
2114 # will simply override the inherited list of values.
Richard Levittea26d8be2016-02-26 12:25:13 +01002115 my $default_combiner = add();
Richard Levittebd5192b2015-05-18 02:57:24 +02002116
2117 my %all_keys =
2118 map { $_ => 1 } (keys %combined_inheritance,
2119 keys %{$table{$target}});
Richard Levitteb0b92a52016-02-27 11:08:21 +01002120
2121 sub process_values {
2122 my $object = shift;
2123 my $inherited = shift; # Always a [ list ]
2124 my $target = shift;
2125 my $entry = shift;
2126
Richard Levitte9c62a272016-02-27 16:51:34 +01002127 $add_called = 0;
2128
Richard Levitteb0b92a52016-02-27 11:08:21 +01002129 while(ref($object) eq "CODE") {
2130 $object = $object->(@$inherited);
2131 }
2132 if (!defined($object)) {
2133 return ();
2134 }
2135 elsif (ref($object) eq "ARRAY") {
Richard Levitte9c62a272016-02-27 16:51:34 +01002136 local $add_called; # To make sure recursive calls don't affect it
Richard Levitteb0b92a52016-02-27 11:08:21 +01002137 return [ map { process_values($_, $inherited, $target, $entry) }
2138 @$object ];
2139 } elsif (ref($object) eq "") {
2140 return $object;
2141 } else {
2142 die "cannot handle reference type ",ref($object)
2143 ," found in target ",$target," -> ",$entry,"\n";
2144 }
2145 }
2146
Richard Levittebd5192b2015-05-18 02:57:24 +02002147 foreach (sort keys %all_keys) {
Richard Levitte9c62a272016-02-27 16:51:34 +01002148 my $previous = $combined_inheritance{$_};
Richard Levittebd5192b2015-05-18 02:57:24 +02002149
2150 # Current target doesn't have a value for the current key?
2151 # Assign it the default combiner, the rest of this loop body
2152 # will handle it just like any other coderef.
2153 if (!exists $table{$target}->{$_}) {
2154 $table{$target}->{$_} = $default_combiner;
2155 }
2156
Richard Levitteb0b92a52016-02-27 11:08:21 +01002157 $table{$target}->{$_} = process_values($table{$target}->{$_},
2158 $combined_inheritance{$_},
2159 $target, $_);
2160 unless(defined($table{$target}->{$_})) {
2161 delete $table{$target}->{$_};
2162 }
Richard Levittec4718842016-03-09 17:18:07 +01002163# if ($extra_checks &&
2164# $previous && !($add_called || $previous ~~ $table{$target}->{$_})) {
2165# warn "$_ got replaced in $target\n";
2166# }
Richard Levittebd5192b2015-05-18 02:57:24 +02002167 }
2168
2169 # Finally done, return the result.
2170 return %{$table{$target}};
2171}
2172
Ulf Möller462ba4f1999-04-24 22:59:36 +00002173sub usage
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002174 {
Ulf Möller462ba4f1999-04-24 22:59:36 +00002175 print STDERR $usage;
Ulf Möller10a926c2000-02-21 00:55:45 +00002176 print STDERR "\npick os/compiler from:\n";
Ben Laurie1641cb61998-12-28 17:08:48 +00002177 my $j=0;
Ben Laurie6457ad11999-02-07 18:22:15 +00002178 my $i;
Ulf Möller10a926c2000-02-21 00:55:45 +00002179 my $k=0;
Ben Laurie6457ad11999-02-07 18:22:15 +00002180 foreach $i (sort keys %table)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002181 {
Richard Levittebd5192b2015-05-18 02:57:24 +02002182 next if $table{$i}->{template};
Ulf Möller462ba4f1999-04-24 22:59:36 +00002183 next if $i =~ /^debug/;
Ulf Möller10a926c2000-02-21 00:55:45 +00002184 $k += length($i) + 1;
2185 if ($k > 78)
2186 {
2187 print STDERR "\n";
2188 $k=length($i);
2189 }
2190 print STDERR $i . " ";
Ulf Möller462ba4f1999-04-24 22:59:36 +00002191 }
2192 foreach $i (sort keys %table)
2193 {
Richard Levittebd5192b2015-05-18 02:57:24 +02002194 next if $table{$i}->{template};
Ulf Möller462ba4f1999-04-24 22:59:36 +00002195 next if $i !~ /^debug/;
Ulf Möller10a926c2000-02-21 00:55:45 +00002196 $k += length($i) + 1;
2197 if ($k > 78)
2198 {
2199 print STDERR "\n";
2200 $k=length($i);
2201 }
2202 print STDERR $i . " ";
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002203 }
Ulf Möller10a926c2000-02-21 00:55:45 +00002204 print STDERR "\n\nNOTE: If in doubt, on Unix-ish systems use './config'.\n";
Ulf Möller462ba4f1999-04-24 22:59:36 +00002205 exit(1);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002206 }
2207
Richard Levitte01d99972016-03-14 10:02:13 +01002208sub run_dofile
Richard Levitte107b5792015-05-20 20:03:20 +02002209{
Richard Levitte107b5792015-05-20 20:03:20 +02002210 my $out = shift;
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002211 my @templates = @_;
Richard Levitte107b5792015-05-20 20:03:20 +02002212
Rich Salzced2c2c2016-01-29 13:29:45 -05002213 unlink $out || warn "Can't remove $out, $!"
2214 if -f $out;
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002215 foreach (@templates) {
2216 die "Can't open $_, $!" unless -f $_;
2217 }
2218 my $cmd = "$config{perl} \"-I.\" \"-Mconfigdata\" $dofile -o\"Configure\" \"".join("\" \"",@templates)."\" > \"$out.new\"";
2219 #print STDERR "DEBUG[run_dofile]: \$cmd = $cmd\n";
2220 system($cmd);
Richard Levitte107b5792015-05-20 20:03:20 +02002221 exit 1 if $? != 0;
2222 rename("$out.new", $out) || die "Can't rename $out.new, $!";
2223}
2224
Richard Levitte00ae96c2015-05-18 12:53:38 +02002225# Configuration printer ##############################################
2226
2227sub print_table_entry
2228{
2229 my $target = shift;
2230 my %target = resolve_config($target);
2231 my $type = shift;
2232
2233 # Don't print the templates
2234 return if $target{template};
2235
2236 my @sequence = (
Richard Levittef0bd4682016-01-25 21:51:22 +01002237 "sys_id",
Richard Levitte00ae96c2015-05-18 12:53:38 +02002238 "cc",
2239 "cflags",
Richard Levittebcb19772016-01-30 02:17:05 +01002240 "defines",
Richard Levittef0bd4682016-01-25 21:51:22 +01002241 "unistd",
2242 "ld",
Richard Levitte00ae96c2015-05-18 12:53:38 +02002243 "lflags",
Richard Levittec86ddbe2016-02-05 11:47:14 +01002244 "plib_lflags",
Richard Levitte1740c162016-01-29 18:07:37 +01002245 "ex_libs",
Richard Levitte00ae96c2015-05-18 12:53:38 +02002246 "bn_ops",
2247 "cpuid_obj",
2248 "bn_obj",
2249 "ec_obj",
2250 "des_obj",
2251 "aes_obj",
2252 "bf_obj",
2253 "md5_obj",
2254 "sha1_obj",
2255 "cast_obj",
2256 "rc4_obj",
2257 "rmd160_obj",
2258 "rc5_obj",
2259 "wp_obj",
2260 "cmll_obj",
2261 "modes_obj",
Richard Levittef0bd4682016-01-25 21:51:22 +01002262 "padlock_obj",
Richard Levitte9c62a272016-02-27 16:51:34 +01002263 "thread_scheme",
Richard Levitte00ae96c2015-05-18 12:53:38 +02002264 "perlasm_scheme",
2265 "dso_scheme",
2266 "shared_target",
2267 "shared_cflag",
2268 "shared_ldflag",
Richard Levitte64c443e2016-02-05 15:17:33 +01002269 "shared_rcflag",
Richard Levitte00ae96c2015-05-18 12:53:38 +02002270 "shared_extension",
Richard Levittee987f9f2016-02-15 17:20:15 +01002271 "shared_extension_simple",
2272 "shared_import_extension",
2273 "dso_extension",
Richard Levittef0bd4682016-01-25 21:51:22 +01002274 "obj_extension",
2275 "exe_extension",
Richard Levitte00ae96c2015-05-18 12:53:38 +02002276 "ranlib",
Richard Levittef0bd4682016-01-25 21:51:22 +01002277 "ar",
Richard Levitte00ae96c2015-05-18 12:53:38 +02002278 "arflags",
2279 "multilib",
Richard Levittef0bd4682016-01-25 21:51:22 +01002280 "build_scheme",
Richard Levitte00ae96c2015-05-18 12:53:38 +02002281 );
2282
2283 if ($type eq "TABLE") {
2284 print "\n";
2285 print "*** $target\n";
Richard Levittecb212f22016-02-24 01:32:51 +01002286 foreach (@sequence) {
2287 if (ref($target{$_}) eq "ARRAY") {
2288 printf "\$%-12s = %s\n", $_, join(" ", @{$target{$_}});
2289 } else {
2290 printf "\$%-12s = %s\n", $_, $target{$_};
2291 }
2292 }
Richard Levitte00ae96c2015-05-18 12:53:38 +02002293 } elsif ($type eq "HASH") {
2294 my $largest =
2295 length((sort { length($a) <=> length($b) } @sequence)[-1]);
2296 print " '$target' => {\n";
2297 foreach (@sequence) {
2298 if ($target{$_}) {
Richard Levittecb212f22016-02-24 01:32:51 +01002299 if (ref($target{$_}) eq "ARRAY") {
2300 print " '",$_,"'"," " x ($largest - length($_))," => [ ",join(", ", map { "'$_'" } @{$target{$_}})," ],\n";
2301 } else {
2302 print " '",$_,"'"," " x ($largest - length($_))," => '",$target{$_},"',\n";
2303 }
Richard Levitte00ae96c2015-05-18 12:53:38 +02002304 }
2305 }
2306 print " },\n";
2307 }
2308}
2309
2310# Utility routines ###################################################
2311
Richard Levitte2e963842016-02-10 02:00:37 +01002312# On VMS, if the given file is a logical name, File::Spec::Functions
2313# will consider it an absolute path. There are cases when we want a
2314# purely syntactic check without checking the environment.
2315sub isabsolute {
2316 my $file = shift;
2317
2318 # On non-platforms, we just use file_name_is_absolute().
2319 return file_name_is_absolute($file) unless $^O eq "VMS";
2320
2321 # If the file spec includes a device or a directpry spec,
2322 # file_name_is_absolute() is perfectly safe.
2323 return file_name_is_absolute($file) if $file =~ m|[:\[]|;
2324
2325 # Here, we know the given file spec isn't absolute
2326 return 0;
2327}
2328
Richard Levitteec182ef2016-02-09 10:15:13 +01002329# Makes a directory absolute and cleans out /../ in paths like foo/../bar
2330# On some platforms, this uses rel2abs(), while on others, realpath() is used.
2331# realpath() requires that at least all path components except the last is an
2332# existing directory. On VMS, the last component of the directory spec must
2333# exist.
2334sub absolutedir {
2335 my $dir = shift;
2336
2337 # realpath() is quite buggy on VMS. It uses LIB$FID_TO_NAME, which
2338 # will return the volume name for the device, no matter what. Also,
2339 # it will return an incorrect directory spec if the argument is a
2340 # directory that doesn't exist.
2341 if ($^O eq "VMS") {
2342 return rel2abs($dir);
2343 }
2344
2345 # We use realpath() on Unix, since no other will properly clean out
2346 # a directory spec.
2347 use Cwd qw/realpath/;
2348
2349 return realpath($dir);
2350}
2351
Ulf Möller99aab161999-04-01 12:34:33 +00002352sub which
2353 {
2354 my($name)=@_;
2355 my $path;
2356 foreach $path (split /:/, $ENV{PATH})
2357 {
Richard Levitte09aa2632016-03-09 01:14:29 +01002358 my $fullpath = "$path/$name$target{exe_extension}";
2359 if (-f $fullpath and -x $fullpath)
Ulf Möller99aab161999-04-01 12:34:33 +00002360 {
Richard Levitte09aa2632016-03-09 01:14:29 +01002361 return $fullpath
2362 unless ($name eq "perl" and
2363 system("$fullpath -e " . '\'exit($]<5.0);\''));
Ulf Möller99aab161999-04-01 12:34:33 +00002364 }
2365 }
2366 }
2367
Richard Levittefe052642015-05-18 03:33:55 +02002368sub quotify {
2369 my %processors = (
2370 perl => sub { my $x = shift;
2371 $x =~ s/([\\\$\@"])/\\$1/g;
2372 return '"'.$x.'"'; },
2373 );
2374 my $for = shift;
2375 my $processor =
2376 defined($processors{$for}) ? $processors{$for} : sub { shift; };
2377
2378 map { $processor->($_); } @_;
2379}
Richard Levitte107b5792015-05-20 20:03:20 +02002380
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002381# collect_from_file($filename, $line_concat_cond_re, $line_concat)
2382# $filename is a file name to read from
2383# $line_concat_cond_re is a regexp detecting a line continuation ending
2384# $line_concat is a CODEref that takes care of concatenating two lines
2385sub collect_from_file {
2386 my $filename = shift;
2387 my $line_concat_cond_re = shift;
2388 my $line_concat = shift;
2389
2390 open my $fh, $filename || die "unable to read $filename: $!\n";
2391 return sub {
2392 my $saved_line = "";
2393 $_ = "";
2394 while (<$fh>) {
Richard Levitte04f171c2016-02-12 12:10:27 +01002395 s|\R$||;
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002396 if (defined $line_concat) {
2397 $_ = $line_concat->($saved_line, $_);
2398 $saved_line = "";
2399 }
2400 if (defined $line_concat_cond_re && /$line_concat_cond_re/) {
2401 $saved_line = $_;
2402 next;
2403 }
2404 return $_;
2405 }
2406 die "$filename ending with continuation line\n" if $_;
2407 close $fh;
2408 return undef;
2409 }
2410}
2411
2412# collect_from_array($array, $line_concat_cond_re, $line_concat)
2413# $array is an ARRAYref of lines
2414# $line_concat_cond_re is a regexp detecting a line continuation ending
2415# $line_concat is a CODEref that takes care of concatenating two lines
2416sub collect_from_array {
2417 my $array = shift;
2418 my $line_concat_cond_re = shift;
2419 my $line_concat = shift;
2420 my @array = (@$array);
2421
2422 return sub {
2423 my $saved_line = "";
2424 $_ = "";
2425 while (defined($_ = shift @array)) {
Richard Levitte04f171c2016-02-12 12:10:27 +01002426 s|\R$||;
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002427 if (defined $line_concat) {
2428 $_ = $line_concat->($saved_line, $_);
2429 $saved_line = "";
2430 }
2431 if (defined $line_concat_cond_re && /$line_concat_cond_re/) {
2432 $saved_line = $_;
2433 next;
2434 }
2435 return $_;
2436 }
2437 die "input text ending with continuation line\n" if $_;
2438 return undef;
2439 }
2440}
2441
2442# collect_information($lineiterator, $line_continue, $regexp => $CODEref, ...)
2443# $lineiterator is a CODEref that delivers one line at a time.
Richard Levitte107b5792015-05-20 20:03:20 +02002444# All following arguments are regex/CODEref pairs, where the regexp detects a
2445# line and the CODEref does something with the result of the regexp.
2446sub collect_information {
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002447 my $lineiterator = shift;
Richard Levitte107b5792015-05-20 20:03:20 +02002448 my %collectors = @_;
2449
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002450 while(defined($_ = $lineiterator->())) {
Richard Levitte04f171c2016-02-12 12:10:27 +01002451 s|\R$||;
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002452 my $found = 0;
2453 foreach my $re (keys %collectors) {
2454 if ($re ne "OTHERWISE" && /$re/) {
2455 $collectors{$re}->($lineiterator);
2456 $found = 1;
2457 };
2458 }
2459 if ($collectors{"OTHERWISE"}) {
2460 $collectors{"OTHERWISE"}->($lineiterator, $_)
2461 unless $found || !defined $collectors{"OTHERWISE"};
2462 }
Richard Levitte107b5792015-05-20 20:03:20 +02002463 }
Richard Levitte107b5792015-05-20 20:03:20 +02002464}