blob: 020f2a148a3b14b3fa376270977a124a256f5e7c [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; -*-
Rich Salzac3d0e12016-04-20 10:20:59 -04003# Copyright 2016 The OpenSSL Project Authors. All Rights Reserved.
4#
5# Licensed under the OpenSSL license (the "License"). You may not use
6# this file except in compliance with the License. You can obtain a copy
7# in the file LICENSE in the source distribution or at
8# https://www.openssl.org/source/license.html
Richard Levittede17db92015-11-24 14:06:45 +01009
Ralf S. Engelschalla4ed5531999-02-25 08:48:52 +000010## Configure -- OpenSSL source tree configuration script
Ben Laurie1641cb61998-12-28 17:08:48 +000011
Richard Levitte9f519ad2016-03-14 10:03:14 +010012require 5.10.0;
Ben Laurie1641cb61998-12-28 17:08:48 +000013use strict;
Rich Salzf09e7ca2015-02-24 17:40:22 -050014use File::Basename;
Richard Levitte85152ca2016-02-02 19:47:05 +010015use File::Spec::Functions qw/:DEFAULT abs2rel rel2abs/;
Richard Levittedca99382016-02-08 16:27:15 +010016use File::Path qw/mkpath/;
Richard Levitte23049aa2016-05-30 11:20:37 +020017use if $^O ne "VMS", 'File::Glob' => qw/glob/;
Ben Laurie1641cb61998-12-28 17:08:48 +000018
Ulf Möller22a4f961999-04-19 13:54:11 +000019# see INSTALL for instructions.
Ulf Möller462ba4f1999-04-24 22:59:36 +000020
Rich Salze4ef2e22016-02-10 11:10:39 -050021my $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 +000022
Ulf Möller434c5dd1999-04-19 15:19:58 +000023# Options:
Bodo Möllere5f30451999-04-29 21:52:08 +000024#
Rich Salzf09e7ca2015-02-24 17:40:22 -050025# --config add the given configuration file, which will be read after
26# any "Configurations*" files that are found in the same
27# directory as this script.
Richard Levitted74dfaf2016-01-20 18:11:51 +010028# --prefix prefix for the OpenSSL installation, which includes the
29# directories bin, lib, include, share/man, share/doc/openssl
30# This becomes the value of INSTALLTOP in Makefile
31# (Default: /usr/local)
32# --openssldir OpenSSL data area, such as openssl.cnf, certificates and keys.
33# If it's a relative directory, it will be added on the directory
34# given with --prefix.
35# This becomes the value of OPENSSLDIR in Makefile and in C.
36# (Default: PREFIX/ssl)
Bodo Möllere5f30451999-04-29 21:52:08 +000037#
Andy Polyakovcbfb39d2006-10-21 13:38:16 +000038# --cross-compile-prefix Add specified prefix to binutils components.
39#
Viktor Dukhovni98186eb2016-01-04 23:00:33 -050040# --api One of 0.9.8, 1.0.0 or 1.1.0. Do not compile support for
41# interfaces deprecated as of the specified OpenSSL version.
42#
Richard Levitte5270e702000-10-26 21:07:28 +000043# no-hw-xxx do not compile support for specific crypto hardware.
44# Generic OpenSSL-style methods relating to this support
45# are always compiled but return NULL if the hardware
46# support isn't compiled.
47# no-hw do not compile support for any crypto hardware.
Bodo Möller5f8d5c91999-04-29 16:10:09 +000048# [no-]threads [don't] try to create a library that is suitable for
49# multithreaded applications (default is "threads" if we
50# know how to do it)
Richard Levittefcc6a1c2000-08-02 04:19:50 +000051# [no-]shared [don't] try to create shared libraries when supported.
Richard Levitteae482422016-02-22 02:09:11 +010052# [no-]pic [don't] try to build position independent code when supported.
Richard Levitte45b71ab2016-02-22 15:57:25 +010053# If disabled, it also disables shared and dynamic-engine.
Ulf Möllera7239791999-04-19 14:55:56 +000054# no-asm do not use assembler
Geoff Thorpebc2aada2000-04-06 07:09:45 +000055# no-dso do not compile in any native shared-library methods. This
56# will ensure that all methods just return NULL.
Benjamin Kaduk0423f812016-01-12 18:02:16 -060057# no-egd do not compile support for the entropy-gathering daemon APIs
Richard Levittee452de92001-07-12 09:11:14 +000058# [no-]zlib [don't] compile support for zlib compression.
59# zlib-dynamic Like "zlib", but the zlib library is expected to be a shared
60# library and will be loaded in run-time by the OpenSSL library.
Dr. Stephen Henson7e159e02011-12-25 14:45:15 +000061# sctp include SCTP support
Ulf Möller22a4f961999-04-19 13:54:11 +000062# 386 generate 80386 code
Matt Caswell8b1a5af2016-03-03 15:40:51 +000063# enable-weak-ssl-ciphers
64# Enable weak ciphers that are disabled by default. This currently
65# only includes RC4 based ciphers.
Andy Polyakovd0590fe2004-07-18 16:19:34 +000066# no-sse2 disables IA-32 SSE2 code, above option implies no-sse2
Ulf Möller79df9d61999-04-27 03:19:12 +000067# no-<cipher> build without specified algorithm (rsa, idea, rc5, ...)
Felix Laurie von Massenbachfce0ba52014-05-26 17:19:28 +010068# -<xxx> +<xxx> compiler options are passed through
Geoff Thorpee41c8d62000-06-01 05:13:52 +000069#
70# DEBUG_SAFESTACK use type-safe stacks to enforce type-safety on stack items
71# provided to stack calls. Generates unique stack functions for
72# each possible stack type.
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +000073# BN_LLONG use the type 'long long' in crypto/bn/bn.h
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +000074# RC4_CHAR use 'char' instead of 'int' for RC4_INT in crypto/rc4/rc4.h
Andy Polyakovd0590fe2004-07-18 16:19:34 +000075# Following are set automatically by this script
76#
FdaSilvaYY8483a002016-03-10 21:34:48 +010077# MD5_ASM use some extra md5 assembler,
78# SHA1_ASM use some extra sha1 assembler, must define L_ENDIAN for x86
79# RMD160_ASM use some extra ripemd160 assembler,
Andy Polyakovd0590fe2004-07-18 16:19:34 +000080# SHA256_ASM sha256_block is implemented in assembler
81# SHA512_ASM sha512_block is implemented in assembler
82# AES_ASM ASE_[en|de]crypt is implemented in assembler
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +000083
Dr. Stephen Henson363bd0b2009-01-11 15:56:32 +000084# Minimum warning options... any contributions to OpenSSL should at least get
Felix Laurie von Massenbachfce0ba52014-05-26 17:19:28 +010085# past these.
Dr. Stephen Henson363bd0b2009-01-11 15:56:32 +000086
Andy Polyakov463a7b82016-04-06 12:47:35 +020087# DEBUG_UNUSED enables __owur (warn unused result) checks.
88my $gcc_devteam_warn = "-DDEBUG_UNUSED"
89 # -DPEDANTIC complements -pedantic and is meant to mask code that
90 # is not strictly standard-compliant and/or implementation-specifc,
91 # e.g. inline assembly, disregards to alignment requirements, such
92 # that -pedantic would complain about. Incidentally -DPEDANTIC has
93 # to be used even in sanitized builds, because sanitizer too is
94 # supposed to and does take notice of non-standard behaviour. Then
95 # -pedantic with pre-C9x compiler would also complain about 'long
96 # long' not being supported. As 64-bit algorithms are common now,
97 # it grew impossible to resolve this without sizeable additional
98 # code, so we just tell compiler to be pedantic about everything
99 # but 'long long' type.
100 . " -DPEDANTIC -pedantic -Wno-long-long"
Rich Salz8bccbce2016-02-13 12:27:11 -0500101 . " -Wall"
Rich Salz8bccbce2016-02-13 12:27:11 -0500102 . " -Wsign-compare"
103 . " -Wmissing-prototypes"
104 . " -Wshadow"
105 . " -Wformat"
106 . " -Wtype-limits"
107 . " -Werror"
108 ;
Dr. Stephen Henson363bd0b2009-01-11 15:56:32 +0000109
Ben Laurie190c8c62015-04-19 14:10:54 +0100110# These are used in addition to $gcc_devteam_warn when the compiler is clang.
111# TODO(openssl-team): fix problems and investigate if (at least) the
Ben Laurie480405e2015-08-02 02:45:44 +0100112# following warnings can also be enabled:
Rich Salz8bccbce2016-02-13 12:27:11 -0500113# -Wswitch-enum
Rich Salz8bccbce2016-02-13 12:27:11 -0500114# -Wcast-align
115# -Wunreachable-code
Rich Salza773b522016-02-13 22:33:56 -0500116# -Wlanguage-extension-token -- no, we use asm()
117# -Wunused-macros -- no, too tricky for BN and _XOPEN_SOURCE etc
118# -Wextended-offsetof -- no, needed in CMS ASN1 code
Rich Salz8bccbce2016-02-13 12:27:11 -0500119my $clang_devteam_warn = ""
120 . " -Qunused-arguments"
121 . " -Wextra"
122 . " -Wno-unused-parameter"
123 . " -Wno-missing-field-initializers"
124 . " -Wno-language-extension-token"
125 . " -Wno-extended-offsetof"
126 . " -Wconditional-uninitialized"
127 . " -Wincompatible-pointer-types-discards-qualifiers"
128 . " -Wmissing-variable-declarations"
129 ;
Emilia Kaspercb2bc052015-01-05 13:46:26 +0100130
Richard Levitteef8ca6b2016-02-14 12:16:52 +0100131# This adds backtrace information to the memory leak info. Is only used
132# when crypto-mdebug-backtrace is enabled.
133my $memleak_devteam_backtrace = "-rdynamic";
Richard Levittea1d3f3d2015-12-02 18:44:26 +0100134
Dr. Stephen Henson0c28f272009-09-09 16:31:32 +0000135my $strict_warnings = 0;
136
Andy Polyakovb7efa562005-01-24 14:38:14 +0000137# As for $BSDthreads. Idea is to maintain "collective" set of flags,
Felix Laurie von Massenbachfce0ba52014-05-26 17:19:28 +0100138# which would cover all BSD flavors. -pthread applies to them all,
Andy Polyakovb7efa562005-01-24 14:38:14 +0000139# but is treated differently. OpenBSD expands is as -D_POSIX_THREAD
140# -lc_r, which is sufficient. FreeBSD 4.x expands it as -lc_r,
141# which has to be accompanied by explicit -D_THREAD_SAFE and
142# sometimes -D_REENTRANT. FreeBSD 5.x expands it as -lc_r, which
143# seems to be sufficient?
Richard Levitte9c62a272016-02-27 16:51:34 +0100144our $BSDthreads="-pthread -D_THREAD_SAFE -D_REENTRANT";
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000145
Viktor Dukhovni98186eb2016-01-04 23:00:33 -0500146#
147# API compability name to version number mapping.
148#
149my $maxapi = "1.1.0"; # API for "no-deprecated" builds
150my $apitable = {
151 "1.1.0" => "0x10100000L",
152 "1.0.0" => "0x10000000L",
153 "0.9.8" => "0x00908000L",
154};
155
Richard Levitte9e0724a2015-05-18 02:54:28 +0200156our %table = ();
Richard Levitte291e94d2015-05-18 22:35:23 +0200157our %config = ();
Richard Levitte98fdbce2016-02-27 11:37:33 +0100158our %withargs = ();
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000159
Richard Levittebd5192b2015-05-18 02:57:24 +0200160# Forward declarations ###############################################
Andy Polyakov7ead0c82015-03-16 22:33:36 +0100161
Richard Levittebd5192b2015-05-18 02:57:24 +0200162# read_config(filename)
163#
164# Reads a configuration file and populates %table with the contents
165# (which the configuration file places in %targets).
166sub read_config;
Andy Polyakov7ead0c82015-03-16 22:33:36 +0100167
Richard Levittebd5192b2015-05-18 02:57:24 +0200168# resolve_config(target)
169#
FdaSilvaYY8483a002016-03-10 21:34:48 +0100170# Resolves all the late evaluations, inheritances and so on for the
Richard Levittebd5192b2015-05-18 02:57:24 +0200171# chosen target and any target it inherits from.
172sub resolve_config;
Richard Levitteaaf878c2015-03-06 02:00:21 +0100173
Rich Salzf09e7ca2015-02-24 17:40:22 -0500174
Richard Levitte107b5792015-05-20 20:03:20 +0200175# Information collection #############################################
176
Richard Levitte9fe2bb72016-01-29 19:45:51 +0100177# Unified build supports separate build dir
Richard Levitteec182ef2016-02-09 10:15:13 +0100178my $srcdir = catdir(absolutedir(dirname($0))); # catdir ensures local syntax
179my $blddir = catdir(absolutedir(".")); # catdir ensures local syntax
Richard Levitte9fe2bb72016-01-29 19:45:51 +0100180my $dofile = abs2rel(catfile($srcdir, "util/dofile.pl"));
181
Richard Levitteb5293d42016-05-02 16:50:51 +0200182my $local_config_envname = 'OPENSSL_LOCAL_CONFIG_DIR';
183
Richard Levitte9fe2bb72016-01-29 19:45:51 +0100184$config{sourcedir} = abs2rel($srcdir);
185$config{builddir} = abs2rel($blddir);
186
Richard Levitte107b5792015-05-20 20:03:20 +0200187# Collect version numbers
188$config{version} = "unknown";
189$config{version_num} = "unknown";
190$config{shlib_version_number} = "unknown";
191$config{shlib_version_history} = "unknown";
192
193collect_information(
Richard Levitte9fe2bb72016-01-29 19:45:51 +0100194 collect_from_file(catfile($srcdir,'include/openssl/opensslv.h')),
Richard Levitte107b5792015-05-20 20:03:20 +0200195 qr/OPENSSL.VERSION.TEXT.*OpenSSL (\S+) / => sub { $config{version} = $1; },
196 qr/OPENSSL.VERSION.NUMBER.*(0x\S+)/ => sub { $config{version_num}=$1 },
197 qr/SHLIB_VERSION_NUMBER *"([^"]+)"/ => sub { $config{shlib_version_number}=$1 },
198 qr/SHLIB_VERSION_HISTORY *"([^"]*)"/ => sub { $config{shlib_version_history}=$1 }
199 );
200if ($config{shlib_version_history} ne "") { $config{shlib_version_history} .= ":"; }
201
202($config{major}, $config{minor})
203 = ($config{version} =~ /^([0-9]+)\.([0-9\.]+)/);
204($config{shlib_major}, $config{shlib_minor})
205 = ($config{shlib_version_number} =~ /^([0-9]+)\.([0-9\.]+)/);
206die "erroneous version information in opensslv.h: ",
207 "$config{major}, $config{minor}, $config{shlib_major}, $config{shlib_minor}\n"
208 if ($config{major} eq "" || $config{minor} eq ""
209 || $config{shlib_major} eq "" || $config{shlib_minor} eq "");
210
211# Collect target configurations
212
Richard Levitte85152ca2016-02-02 19:47:05 +0100213my $pattern = catfile(dirname($0), "Configurations", "*.conf");
Andy Polyakov97855552016-05-28 16:11:01 +0200214foreach (sort glob($pattern)) {
Rich Salzf09e7ca2015-02-24 17:40:22 -0500215 &read_config($_);
216}
217
Richard Levitteb5293d42016-05-02 16:50:51 +0200218if (defined $ENV{$local_config_envname}) {
219 if ($^O eq 'VMS') {
220 # VMS environment variables are logical names,
221 # which can be used as is
222 $pattern = $local_config_envname . ':' . '*.conf';
223 } else {
224 $pattern = catfile($ENV{$local_config_envname}, '*.conf');
225 }
226
Andy Polyakov97855552016-05-28 16:11:01 +0200227 foreach (sort glob($pattern)) {
Richard Levitteb5293d42016-05-02 16:50:51 +0200228 &read_config($_);
229 }
230}
231
Richard Levitte291e94d2015-05-18 22:35:23 +0200232
Richard Levitte107b5792015-05-20 20:03:20 +0200233print "Configuring OpenSSL version $config{version} (0x$config{version_num})\n";
234
Richard Levitte291e94d2015-05-18 22:35:23 +0200235$config{prefix}="";
236$config{openssldir}="";
Richard Levitte7d130f62015-05-19 01:40:54 +0200237$config{processor}="";
Richard Levitte107b5792015-05-20 20:03:20 +0200238$config{libdir}="";
Richard Levitte642a6132015-12-27 02:27:30 +0100239$config{cross_compile_prefix}="";
Richard Levitte107b5792015-05-20 20:03:20 +0200240$config{fipslibdir}="/usr/local/ssl/fips-2.0/lib/";
Dr. Stephen Henson1ab2f7f2011-01-26 12:31:30 +0000241my $nofipscanistercheck=0;
Richard Levitte107b5792015-05-20 20:03:20 +0200242$config{baseaddr}="0xFB00000";
Richard Levitte9c62a272016-02-27 16:51:34 +0100243my $auto_threads=1; # enable threads automatically? true by default
Bodo Möller03964792001-03-09 13:04:06 +0000244my $default_ranlib;
Richard Levitte107b5792015-05-20 20:03:20 +0200245$config{fips}=0;
246
247# Top level directories to build
248$config{dirs} = [ "crypto", "ssl", "engines", "apps", "test", "tools" ];
249# crypto/ subdirectories to build
250$config{sdirs} = [
251 "objects",
Bill Cox2d0b4412016-03-09 23:08:31 +0100252 "md2", "md4", "md5", "sha", "mdc2", "hmac", "ripemd", "whrlpool", "poly1305", "blake2",
Richard Levitte107b5792015-05-20 20:03:20 +0200253 "des", "aes", "rc2", "rc4", "rc5", "idea", "bf", "cast", "camellia", "seed", "chacha", "modes",
254 "bn", "ec", "rsa", "dsa", "dh", "dso", "engine",
255 "buffer", "bio", "stack", "lhash", "rand", "err",
256 "evp", "asn1", "pem", "x509", "x509v3", "conf", "txt_db", "pkcs7", "pkcs12", "comp", "ocsp", "ui",
Rich Salzdba31772016-02-14 00:17:59 -0500257 "cms", "ts", "srp", "cmac", "ct", "async", "kdf"
Richard Levitte107b5792015-05-20 20:03:20 +0200258 ];
Ulf Möller99aab161999-04-01 12:34:33 +0000259
Viktor Dukhovni6b01bed2016-01-18 13:10:21 -0500260# Known TLS and DTLS protocols
261my @tls = qw(ssl3 tls1 tls1_1 tls1_2);
262my @dtls = qw(dtls1 dtls1_2);
263
FdaSilvaYY8483a002016-03-10 21:34:48 +0100264# Explicitly known options that are possible to disable. They can
Richard Levitte8b527be2015-10-22 17:09:14 +0200265# be regexps, and will be used like this: /^no-${option}$/
266# For developers: keep it sorted alphabetically
267
268my @disablables = (
Emilia Kasperc91a0a82016-03-14 12:21:44 +0100269 "afalgeng",
Ben Lauriec38bb722016-03-26 17:19:14 +0000270 "asan",
Richard Levitte8b527be2015-10-22 17:09:14 +0200271 "asm",
Todd Short52739e42016-02-04 11:41:25 -0500272 "async",
Matt Caswellb184e3e2016-02-09 11:26:14 +0000273 "autoalginit",
Matt Caswell498abff2016-02-09 09:39:07 +0000274 "autoerrinit",
Richard Levitte8b527be2015-10-22 17:09:14 +0200275 "bf",
Bill Cox2d0b4412016-03-09 23:08:31 +0100276 "blake2",
Richard Levitte8b527be2015-10-22 17:09:14 +0200277 "camellia",
278 "capieng",
279 "cast",
Andy Polyakov48f14842015-12-09 23:02:11 +0100280 "chacha",
Richard Levitte8b527be2015-10-22 17:09:14 +0200281 "cmac",
282 "cms",
283 "comp",
Mat3e45d392016-01-09 23:55:57 +0100284 "crypto-mdebug",
Richard Levitteef8ca6b2016-02-14 12:16:52 +0100285 "crypto-mdebug-backtrace",
Richard Levitte8b527be2015-10-22 17:09:14 +0200286 "ct",
287 "deprecated",
288 "des",
289 "dgram",
290 "dh",
291 "dsa",
292 "dso",
Kurt Roeckxa5ecdc62015-12-12 11:12:22 +0100293 "dtls",
Richard Levitte343ec2b2016-02-19 22:08:37 +0100294 "dynamic-engine",
Richard Levitte8b527be2015-10-22 17:09:14 +0200295 "ec",
296 "ec2m",
Viktor Dukhovni6b01bed2016-01-18 13:10:21 -0500297 "ecdh",
298 "ecdsa",
Richard Levitte8b527be2015-10-22 17:09:14 +0200299 "ec_nistp_64_gcc_128",
Richard Levitteb31feae2016-02-03 21:08:17 +0100300 "egd",
Richard Levitte8b527be2015-10-22 17:09:14 +0200301 "engine",
Rich Salz1288f262016-02-17 13:33:51 -0500302 "err",
David Woodhouse02f71142015-07-30 11:45:25 +0100303 "filenames",
Ben Lauriec38bb722016-03-26 17:19:14 +0000304 "fuzz",
Matt Caswell168c3b72016-03-21 15:04:08 +0000305 "gost",
Richard Levitte8b527be2015-10-22 17:09:14 +0200306 "heartbeats",
Richard Levitte8b527be2015-10-22 17:09:14 +0200307 "hw(-.+)?",
308 "idea",
Richard Levitte09aa2632016-03-09 01:14:29 +0100309 "makedepend",
Richard Levitte8b527be2015-10-22 17:09:14 +0200310 "md2",
311 "md4",
Richard Levitte8b527be2015-10-22 17:09:14 +0200312 "mdc2",
Matt Caswellfa22f982016-03-07 23:26:32 +0000313 "multiblock",
Richard Levitte8b527be2015-10-22 17:09:14 +0200314 "nextprotoneg",
315 "ocb",
316 "ocsp",
Richard Levitteae482422016-02-22 02:09:11 +0100317 "pic",
Andy Polyakov48f14842015-12-09 23:02:11 +0100318 "poly1305",
Richard Levitte8b527be2015-10-22 17:09:14 +0200319 "posix-io",
320 "psk",
321 "rc2",
322 "rc4",
323 "rc5",
324 "rdrand",
325 "rfc3779",
Rich Salz1288f262016-02-17 13:33:51 -0500326 "ripemd",
Richard Levitte8b527be2015-10-22 17:09:14 +0200327 "rmd160",
Richard Levitte8b527be2015-10-22 17:09:14 +0200328 "scrypt",
Richard Levitte8b527be2015-10-22 17:09:14 +0200329 "sctp",
330 "seed",
Richard Levitte8b527be2015-10-22 17:09:14 +0200331 "shared",
332 "sock",
333 "srp",
334 "srtp",
335 "sse2",
336 "ssl",
Richard Levitte8b527be2015-10-22 17:09:14 +0200337 "ssl-trace",
338 "static-engine",
339 "stdio",
Richard Levitte8b527be2015-10-22 17:09:14 +0200340 "threads",
341 "tls",
Rich Salz1288f262016-02-17 13:33:51 -0500342 "ts",
Ben Lauriec38bb722016-03-26 17:19:14 +0000343 "ubsan",
Rich Salz1288f262016-02-17 13:33:51 -0500344 "ui",
Richard Levitte8b527be2015-10-22 17:09:14 +0200345 "unit-test",
346 "whirlpool",
Matt Caswell8b1a5af2016-03-03 15:40:51 +0000347 "weak-ssl-ciphers",
Richard Levitte8b527be2015-10-22 17:09:14 +0200348 "zlib",
349 "zlib-dynamic",
350 );
Viktor Dukhovni6b01bed2016-01-18 13:10:21 -0500351foreach my $proto ((@tls, @dtls))
352 {
353 push(@disablables, $proto);
354 push(@disablables, "$proto-method");
355 }
Richard Levitte8b527be2015-10-22 17:09:14 +0200356
Richard Levittee80381e2016-02-22 10:42:53 +0100357my @deprecated_disablables = (
358 "ssl2",
Todd Short050a36a2016-05-23 08:50:32 -0400359 "buf-freelists",
Richard Levittee80381e2016-02-22 10:42:53 +0100360 );
361
Bodo Möllerc9a112f2005-02-22 10:29:51 +0000362# All of the following is disabled by default (RC5 was enabled before 0.9.8):
363
Richard Levitte9e04edf2016-02-22 13:45:46 +0100364our %disabled = ( # "what" => "comment"
Ben Lauriec38bb722016-03-26 17:19:14 +0000365 "asan" => "default",
Richard Levitte9e04edf2016-02-22 13:45:46 +0100366 "ec_nistp_64_gcc_128" => "default",
Matt Caswell8b1a5af2016-03-03 15:40:51 +0000367 "egd" => "default",
Ben Lauriec38bb722016-03-26 17:19:14 +0000368 "fuzz" => "default",
Matt Caswell8b1a5af2016-03-03 15:40:51 +0000369 "md2" => "default",
370 "rc5" => "default",
371 "sctp" => "default",
Matt Caswell8b1a5af2016-03-03 15:40:51 +0000372 "ssl-trace" => "default",
Kurt Roeckx9829b5a2016-03-03 22:45:57 +0100373 "ssl3" => "default",
374 "ssl3-method" => "default",
Ben Lauriec38bb722016-03-26 17:19:14 +0000375 "ubsan" => "default",
Matt Caswell8b1a5af2016-03-03 15:40:51 +0000376 "unit-test" => "default",
377 "weak-ssl-ciphers" => "default",
378 "zlib" => "default",
379 "zlib-dynamic" => "default",
380 "crypto-mdebug" => "default",
Richard Levitte4639c682016-05-25 15:42:15 +0200381 "crypto-mdebug-backtrace" => "default",
Matt Caswell8b1a5af2016-03-03 15:40:51 +0000382 "heartbeats" => "default",
Richard Levitte9e04edf2016-02-22 13:45:46 +0100383 );
Bodo Möllerc9a112f2005-02-22 10:29:51 +0000384
Richard Levittec569e202015-05-18 11:03:47 +0200385# Note: => pair form used for aesthetics, not to truly make a hash table
386my @disable_cascades = (
387 # "what" => [ "cascade", ... ]
Richard Levitte7d130f62015-05-19 01:40:54 +0200388 sub { $config{processor} eq "386" }
Richard Levittec569e202015-05-18 11:03:47 +0200389 => [ "sse2" ],
390 "ssl" => [ "ssl3" ],
391 "ssl3-method" => [ "ssl3" ],
392 "zlib" => [ "zlib-dynamic" ],
Richard Levittec569e202015-05-18 11:03:47 +0200393 "des" => [ "mdc2" ],
Richard Levitte9e4d6fb2016-01-23 22:58:51 +0100394 "ec" => [ "ecdsa", "ecdh" ],
Richard Levittec569e202015-05-18 11:03:47 +0200395
Ben Laurie3fd4d212016-03-17 18:17:03 +0000396 "dgram" => [ "dtls", "sctp" ],
Matt Caswell505f74c2016-04-20 11:24:49 +0100397 "sock" => [ "dgram" ],
Richard Levittec569e202015-05-18 11:03:47 +0200398 "dtls" => [ @dtls ],
399
400 # SSL 3.0, (D)TLS 1.0 and TLS 1.1 require MD5 and SHA
401 "md5" => [ "ssl", "tls1", "tls1_1", "dtls1" ],
402 "sha" => [ "ssl", "tls1", "tls1_1", "dtls1" ],
403
404 # Additionally, SSL 3.0 requires either RSA or DSA+DH
405 sub { $disabled{rsa}
406 && ($disabled{dsa} || $disabled{dh}); }
407 => [ "ssl" ],
408
409 # (D)TLS 1.0 and TLS 1.1 also require either RSA or DSA+DH
410 # or ECDSA + ECDH. (D)TLS 1.2 has this requirement as well.
411 # (XXX: We don't support PSK-only builds).
412 sub { $disabled{rsa}
413 && ($disabled{dsa} || $disabled{dh})
414 && ($disabled{ecdsa} || $disabled{ecdh}); }
415 => [ "tls1", "tls1_1", "tls1_2",
416 "dtls1", "dtls1_2" ],
417
418 "tls" => [ @tls ],
419
420 # SRP and HEARTBEATS require TLSEXT
421 "tlsext" => [ "srp", "heartbeats" ],
Richard Levitteef8ca6b2016-02-14 12:16:52 +0100422
423 "crypto-mdebug" => [ "crypto-mdebug-backtrace" ],
Richard Levitte343ec2b2016-02-19 22:08:37 +0100424
425 # Without DSO, we can't load dynamic engines, so don't build them dynamic
426 "dso" => [ "dynamic-engine" ],
Richard Levitteae482422016-02-22 02:09:11 +0100427
428 # Without position independent code, there can be no shared libraries or DSOs
Richard Levitte00698062016-03-11 12:58:15 +0100429 "pic" => [ "shared" ],
430 "shared" => [ "dynamic-engine" ],
Emilia Kasperc91a0a82016-03-14 12:21:44 +0100431 "engine" => [ "afalgeng" ],
Matt Caswelld90a6be2016-04-14 13:44:15 +0100432
433 # no-autoalginit is only useful when building non-shared
434 "autoalginit" => [ "shared", "apps" ],
435
436 "stdio" => [ "apps" ],
437 "apps" => [ "tests" ],
Ben Laurieb8ce6dd2016-03-22 10:40:13 +0000438 "comp" => [ "zlib" ],
Ben Laurie686c86a2016-03-27 12:28:23 +0100439 sub { !$disabled{"unit-test"} } => [ "heartbeats" ],
Richard Levittec569e202015-05-18 11:03:47 +0200440 );
441
442# Avoid protocol support holes. Also disable all versions below N, if version
443# N is disabled while N+1 is enabled.
444#
445my @list = (reverse @tls);
446while ((my $first, my $second) = (shift @list, shift @list)) {
447 last unless @list;
448 push @disable_cascades, ( sub { !$disabled{$first} && $disabled{$second} }
449 => [ @list ] );
450 unshift @list, $second;
451}
452my @list = (reverse @dtls);
453while ((my $first, my $second) = (shift @list, shift @list)) {
454 last unless @list;
455 push @disable_cascades, ( sub { !$disabled{$first} && $disabled{$second} }
456 => [ @list ] );
457 unshift @list, $second;
458}
459
Bodo Möller7a762192008-12-02 01:21:39 +0000460# Explicit "no-..." options will be collected in %disabled along with the defaults.
Rich Salze4ef2e22016-02-10 11:10:39 -0500461# To remove something from %disabled, use "enable-foo".
Bodo Möller7a762192008-12-02 01:21:39 +0000462# For symmetry, "disable-foo" is a synonym for "no-foo".
463
Richard Levittee737d7b2016-02-11 15:22:27 +0100464my @generated_headers = (
465 "include/openssl/opensslconf.h",
Richard Levittee987f9f2016-02-15 17:20:15 +0100466 "crypto/include/internal/bn_conf.h",
467 "crypto/include/internal/dso_conf.h"
Richard Levittee737d7b2016-02-11 15:22:27 +0100468 );
469
470my @generated_by_make_headers = (
471 "crypto/buildinf.h"
472 );
473
Bodo Möllerab185b62005-03-13 19:46:58 +0000474
Andy Polyakovd0590fe2004-07-18 16:19:34 +0000475my $no_sse2=0;
Richard Levitteb6e4dac2001-11-27 11:48:30 +0000476
Ulf Möller462ba4f1999-04-24 22:59:36 +0000477&usage if ($#ARGV < 0);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000478
Richard Levittebcb19772016-01-30 02:17:05 +0100479my $user_cflags="";
480my @user_defines=();
Richard Levitte7d130f62015-05-19 01:40:54 +0200481$config{openssl_api_defines}=[];
482$config{openssl_algorithm_defines}=[];
483$config{openssl_thread_defines}=[];
484$config{openssl_sys_defines}=[];
485$config{openssl_other_defines}=[];
Richard Levittefe052642015-05-18 03:33:55 +0200486my $libs="";
487my $target="";
Richard Levitte3fa04f02016-01-12 00:17:12 +0100488$config{options}="";
Richard Levitte8864f0d2016-03-02 19:13:26 +0100489$config{build_type} = "release";
Richard Levittec59cb512000-08-17 10:23:45 +0000490
491my @argvcopy=@ARGV;
Richard Levittec59cb512000-08-17 10:23:45 +0000492
Richard Levittefe052642015-05-18 03:33:55 +0200493if (grep /^reconf(igure)?$/, @argvcopy) {
Richard Levitte642a6132015-12-27 02:27:30 +0100494 if (-f "./configdata.pm") {
495 my $file = "./configdata.pm";
496 unless (my $return = do $file) {
497 die "couldn't parse $file: $@" if $@;
498 die "couldn't do $file: $!" unless defined $return;
499 die "couldn't run $file" unless $return;
Richard Levittefe052642015-05-18 03:33:55 +0200500 }
Richard Levitte642a6132015-12-27 02:27:30 +0100501
502 @argvcopy = defined($configdata::config{perlargv}) ?
503 @{$configdata::config{perlargv}} : ();
504 die "Incorrect data to reconfigure, please do a normal configuration\n"
505 if (grep(/^reconf/,@argvcopy));
506 $ENV{CROSS_COMPILE} = $configdata::config{cross_compile_prefix}
507 if defined($configdata::config{cross_compile_prefix});
508 $ENV{CROSS_COMPILE} = $configdata::config{cc}
509 if defined($configdata::config{cc});
510
Richard Levittefe052642015-05-18 03:33:55 +0200511 print "Reconfiguring with: ", join(" ",@argvcopy), "\n";
512 print " CROSS_COMPILE = ",$ENV{CROSS_COMPILE},"\n"
513 if $ENV{CROSS_COMPILE};
514 print " CC = ",$ENV{CC},"\n" if $ENV{CC};
Richard Levitte642a6132015-12-27 02:27:30 +0100515 } elsif (open IN, "<Makefile") {
516 #
517 # THIS SECTION IS TEMPORARY, it helps transitioning from Makefile
518 # centered information gathering the reading configdata.pm
519 #
520 while (<IN>) {
Richard Levitte04f171c2016-02-12 12:10:27 +0100521 s|\R$||;
Richard Levitte642a6132015-12-27 02:27:30 +0100522 if (/^CONFIGURE_ARGS=\s*(.*)\s*/) {
523 # Older form, we split the string and hope for the best
524 @argvcopy = split /\s+/, $_;
525 die "Incorrect data to reconfigure, please do a normal configuration\n"
526 if (grep(/^reconf/,@argvcopy));
527 } elsif (/^CROSS_COMPILE=\s*(.*)/) {
528 $ENV{CROSS_COMPILE}=$1;
529 } elsif (/^CC=\s*(?:\$\(CROSS_COMPILE\))?(.*?)$/) {
530 $ENV{CC}=$1;
531 }
532 }
533 #
534 # END OF TEMPORARY SECTION
535 #
Richard Levittefe052642015-05-18 03:33:55 +0200536 } else {
537 die "Insufficient data to reconfigure, please do a normal configuration\n";
538 }
539}
540
Richard Levitte642a6132015-12-27 02:27:30 +0100541$config{perlargv} = [ @argvcopy ];
Richard Levittefe052642015-05-18 03:33:55 +0200542
543my %unsupported_options = ();
Richard Levittee80381e2016-02-22 10:42:53 +0100544my %deprecated_options = ();
Richard Levittefe052642015-05-18 03:33:55 +0200545foreach (@argvcopy)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000546 {
Richard Levitte7c55e222016-02-16 16:07:05 +0100547 # VMS is a case insensitive environment, and depending on settings
548 # out of our control, we may receive options uppercased. Let's
549 # downcase at least the part before any equal sign.
550 if ($^O eq "VMS")
551 {
552 s/^([^=]*)/lc($1)/e;
553 }
Richard Levittefe052642015-05-18 03:33:55 +0200554 s /^-no-/no-/; # some people just can't read the instructions
Richard Levittec59cb512000-08-17 10:23:45 +0000555
Richard Levittefe052642015-05-18 03:33:55 +0200556 # rewrite some options in "enable-..." form
557 s /^-?-?shared$/enable-shared/;
558 s /^sctp$/enable-sctp/;
559 s /^threads$/enable-threads/;
560 s /^zlib$/enable-zlib/;
561 s /^zlib-dynamic$/enable-zlib-dynamic/;
Richard Levittec59cb512000-08-17 10:23:45 +0000562
Rich Salze4ef2e22016-02-10 11:10:39 -0500563 if (/^(no|disable|enable)-(.+)$/)
Ulf Möllerf5d7a031999-04-27 01:14:46 +0000564 {
Richard Levittefe052642015-05-18 03:33:55 +0200565 my $word = $2;
Richard Levittee80381e2016-02-22 10:42:53 +0100566 if (grep { $word =~ /^${_}$/ } @deprecated_disablables)
567 {
568 $deprecated_options{$_} = 1;
569 next;
570 }
571 elsif (!grep { $word =~ /^${_}$/ } @disablables)
Richard Levitte8b527be2015-10-22 17:09:14 +0200572 {
Richard Levittefe052642015-05-18 03:33:55 +0200573 $unsupported_options{$_} = 1;
574 next;
Richard Levitte8b527be2015-10-22 17:09:14 +0200575 }
Richard Levittefe052642015-05-18 03:33:55 +0200576 }
577 if (/^no-(.+)$/ || /^disable-(.+)$/)
578 {
Rich Salze4ef2e22016-02-10 11:10:39 -0500579 foreach my $proto ((@tls, @dtls))
580 {
581 if ($1 eq "$proto-method")
582 {
583 $disabled{"$proto"} = "option($proto-method)";
584 last;
585 }
586 }
587 if ($1 eq "dtls")
588 {
589 foreach my $proto (@dtls)
590 {
591 $disabled{$proto} = "option(dtls)";
592 }
Kurt Roeckxc5c77002016-03-28 00:31:23 +0200593 $disabled{"dtls"} = "option(dtls)";
Rich Salze4ef2e22016-02-10 11:10:39 -0500594 }
595 elsif ($1 eq "ssl")
596 {
597 # Last one of its kind
598 $disabled{"ssl3"} = "option(ssl)";
599 }
600 elsif ($1 eq "tls")
601 {
602 # XXX: Tests will fail if all SSL/TLS
603 # protocols are disabled.
604 foreach my $proto (@tls)
605 {
606 $disabled{$proto} = "option(tls)";
607 }
608 }
Richard Levitte343ec2b2016-02-19 22:08:37 +0100609 elsif ($1 eq "static-engine")
610 {
Richard Levitte19ab5792016-02-22 02:06:05 +0100611 delete $disabled{"dynamic-engine"};
Richard Levitte343ec2b2016-02-19 22:08:37 +0100612 }
613 elsif ($1 eq "dynamic-engine")
614 {
Richard Levitte19ab5792016-02-22 02:06:05 +0100615 $disabled{"dynamic-engine"} = "option";
Richard Levitte343ec2b2016-02-19 22:08:37 +0100616 }
Rich Salze4ef2e22016-02-10 11:10:39 -0500617 else
618 {
619 $disabled{$1} = "option";
620 }
Richard Levitte9c62a272016-02-27 16:51:34 +0100621 # No longer an automatic choice
622 $auto_threads = 0 if ($1 eq "threads");
Bodo Möllerfbabb751999-07-09 12:00:34 +0000623 }
Rich Salze4ef2e22016-02-10 11:10:39 -0500624 elsif (/^enable-(.+)$/)
Richard Levittefe052642015-05-18 03:33:55 +0200625 {
Richard Levitte343ec2b2016-02-19 22:08:37 +0100626 if ($1 eq "static-engine")
627 {
Richard Levitte19ab5792016-02-22 02:06:05 +0100628 $disabled{"dynamic-engine"} = "option";
Richard Levitte343ec2b2016-02-19 22:08:37 +0100629 }
630 elsif ($1 eq "dynamic-engine")
631 {
Richard Levitte19ab5792016-02-22 02:06:05 +0100632 delete $disabled{"dynamic-engine"};
Richard Levitte343ec2b2016-02-19 22:08:37 +0100633 }
Richard Levitte25004db2016-03-03 10:07:29 +0100634 elsif ($1 eq "zlib-dynamic")
635 {
636 delete $disabled{"zlib"};
637 }
Richard Levittefe052642015-05-18 03:33:55 +0200638 my $algo = $1;
Richard Levittefe052642015-05-18 03:33:55 +0200639 delete $disabled{$algo};
640
Richard Levitte9c62a272016-02-27 16:51:34 +0100641 # No longer an automatic choice
642 $auto_threads = 0 if ($1 eq "threads");
Richard Levittefe052642015-05-18 03:33:55 +0200643 }
644 elsif (/^--strict-warnings$/)
645 {
646 $strict_warnings = 1;
647 }
648 elsif (/^--debug$/)
649 {
Richard Levitte8864f0d2016-03-02 19:13:26 +0100650 $config{build_type} = "debug";
Richard Levittefe052642015-05-18 03:33:55 +0200651 }
652 elsif (/^--release$/)
653 {
Richard Levitte8864f0d2016-03-02 19:13:26 +0100654 $config{build_type} = "release";
Richard Levittefe052642015-05-18 03:33:55 +0200655 }
656 elsif (/^386$/)
Richard Levitte7d130f62015-05-19 01:40:54 +0200657 { $config{processor}=386; }
Richard Levittefe052642015-05-18 03:33:55 +0200658 elsif (/^fips$/)
659 {
Richard Levitte107b5792015-05-20 20:03:20 +0200660 $config{fips}=1;
Richard Levittefe052642015-05-18 03:33:55 +0200661 }
662 elsif (/^rsaref$/)
663 {
664 # No RSAref support any more since it's not needed.
665 # The check for the option is there so scripts aren't
666 # broken
667 }
668 elsif (/^nofipscanistercheck$/)
669 {
Richard Levitte107b5792015-05-20 20:03:20 +0200670 $config{fips} = 1;
Richard Levittefe052642015-05-18 03:33:55 +0200671 $nofipscanistercheck = 1;
672 }
673 elsif (/^[-+]/)
674 {
Richard Levitte45c6e232016-04-02 18:36:52 +0200675 if (/^--prefix=(.*)$/)
Richard Levittefe052642015-05-18 03:33:55 +0200676 {
Richard Levitte291e94d2015-05-18 22:35:23 +0200677 $config{prefix}=$1;
Richard Levitte5482dac2016-01-30 02:57:19 +0100678 die "Directory given with --prefix MUST be absolute\n"
679 unless file_name_is_absolute($config{prefix});
Richard Levittefe052642015-05-18 03:33:55 +0200680 }
681 elsif (/^--api=(.*)$/)
682 {
Richard Levitte107b5792015-05-20 20:03:20 +0200683 $config{api}=$1;
Richard Levittefe052642015-05-18 03:33:55 +0200684 }
685 elsif (/^--libdir=(.*)$/)
686 {
Richard Levitte107b5792015-05-20 20:03:20 +0200687 $config{libdir}=$1;
Richard Levittefe052642015-05-18 03:33:55 +0200688 }
689 elsif (/^--openssldir=(.*)$/)
690 {
Richard Levitte291e94d2015-05-18 22:35:23 +0200691 $config{openssldir}=$1;
Richard Levittefe052642015-05-18 03:33:55 +0200692 }
Richard Levittefe052642015-05-18 03:33:55 +0200693 elsif (/^--with-zlib-lib=(.*)$/)
694 {
Michael Lee20a58192016-02-03 11:31:40 -0500695 $withargs{zlib_lib}=$1;
Richard Levittefe052642015-05-18 03:33:55 +0200696 }
697 elsif (/^--with-zlib-include=(.*)$/)
698 {
Richard Levitteda430a52016-04-12 16:35:32 +0200699 $withargs{zlib_include}=$1;
Richard Levittefe052642015-05-18 03:33:55 +0200700 }
701 elsif (/^--with-fipslibdir=(.*)$/)
702 {
Richard Levitte107b5792015-05-20 20:03:20 +0200703 $config{fipslibdir}="$1/";
Richard Levittefe052642015-05-18 03:33:55 +0200704 }
705 elsif (/^--with-baseaddr=(.*)$/)
706 {
Richard Levitte107b5792015-05-20 20:03:20 +0200707 $config{baseaddr}="$1";
Richard Levittefe052642015-05-18 03:33:55 +0200708 }
709 elsif (/^--cross-compile-prefix=(.*)$/)
710 {
Richard Levitte642a6132015-12-27 02:27:30 +0100711 $config{cross_compile_prefix}=$1;
Richard Levittefe052642015-05-18 03:33:55 +0200712 }
713 elsif (/^--config=(.*)$/)
714 {
715 read_config $1;
716 }
717 elsif (/^-[lL](.*)$/ or /^-Wl,/)
718 {
719 $libs.=$_." ";
720 }
Richard Levittebcb19772016-01-30 02:17:05 +0100721 elsif (/^-D(.*)$/)
722 {
723 push @user_defines, $1;
724 }
Richard Levittefe052642015-05-18 03:33:55 +0200725 else # common if (/^[-+]/), just pass down...
726 {
727 $_ =~ s/%([0-9a-f]{1,2})/chr(hex($1))/gei;
Rich Salz2b91ec72016-02-12 14:40:33 -0500728 $user_cflags.=" ".$_;
Richard Levittefe052642015-05-18 03:33:55 +0200729 }
730 }
Richard Levittefe052642015-05-18 03:33:55 +0200731 else
732 {
733 die "target already defined - $target (offending arg: $_)\n" if ($target ne "");
734 $target=$_;
735 }
736 unless ($_ eq $target || /^no-/ || /^disable-/)
737 {
738 # "no-..." follows later after implied disactivations
FdaSilvaYY8483a002016-03-10 21:34:48 +0100739 # have been derived. (Don't take this too seriously,
Richard Levittefe052642015-05-18 03:33:55 +0200740 # we really only write OPTIONS to the Makefile out of
741 # nostalgia.)
742
Richard Levitte3fa04f02016-01-12 00:17:12 +0100743 if ($config{options} eq "")
744 { $config{options} = $_; }
Richard Levittefe052642015-05-18 03:33:55 +0200745 else
Richard Levitte3fa04f02016-01-12 00:17:12 +0100746 { $config{options} .= " ".$_; }
Richard Levittefe052642015-05-18 03:33:55 +0200747 }
Richard Levitte489eb742015-10-22 17:33:47 +0200748
Richard Levitte107b5792015-05-20 20:03:20 +0200749 if (defined($config{api}) && !exists $apitable->{$config{api}}) {
750 die "***** Unsupported api compatibility level: $config{api}\n",
Viktor Dukhovni98186eb2016-01-04 23:00:33 -0500751 }
752
Richard Levittee80381e2016-02-22 10:42:53 +0100753 if (keys %deprecated_options)
754 {
755 warn "***** Deprecated options: ",
756 join(", ", keys %deprecated_options), "\n";
757 }
Richard Levitte489eb742015-10-22 17:33:47 +0200758 if (keys %unsupported_options)
759 {
760 die "***** Unsupported options: ",
761 join(", ", keys %unsupported_options), "\n";
762 }
Bodo Möllerfbabb751999-07-09 12:00:34 +0000763 }
Richard Levitteb6e4dac2001-11-27 11:48:30 +0000764
Richard Levitte107b5792015-05-20 20:03:20 +0200765if ($config{fips})
Richard Levitteb6e4dac2001-11-27 11:48:30 +0000766 {
Richard Levittec569e202015-05-18 11:03:47 +0200767 delete $disabled{"shared"} if ($disabled{"shared"} =~ /^default/);
Richard Levitteb6e4dac2001-11-27 11:48:30 +0000768 }
Richard Levitte107b5792015-05-20 20:03:20 +0200769else
770 {
771 @{$config{dirs}} = grep !/^fips$/, @{$config{dirs}};
772 }
Richard Levitteb6e4dac2001-11-27 11:48:30 +0000773
Richard Levittec569e202015-05-18 11:03:47 +0200774my @tocheckfor = (keys %disabled);
775while (@tocheckfor) {
776 my %new_tocheckfor = ();
777 my @cascade_copy = (@disable_cascades);
778 while (@cascade_copy) {
779 my ($test, $descendents) = (shift @cascade_copy, shift @cascade_copy);
780 if (ref($test) eq "CODE" ? $test->() : defined($disabled{$test})) {
Richard Levitte2110feb2016-04-06 15:02:57 +0200781 foreach(grep { !defined($disabled{$_}) } @$descendents) {
Richard Levitte01d99972016-03-14 10:02:13 +0100782 $new_tocheckfor{$_} = 1; $disabled{$_} = "forced";
Richard Levitte2110feb2016-04-06 15:02:57 +0200783 }
Richard Levitteb6e4dac2001-11-27 11:48:30 +0000784 }
Richard Levittec569e202015-05-18 11:03:47 +0200785 }
786 @tocheckfor = (keys %new_tocheckfor);
787}
Ben Laurieedc032b2011-03-12 17:01:19 +0000788
Bodo Möller436a3761999-05-28 23:18:51 +0000789if ($target eq "TABLE") {
Richard Levitte00ae96c2015-05-18 12:53:38 +0200790 foreach (sort keys %table) {
791 print_table_entry($_, "TABLE");
792 }
793 exit 0;
Bodo Möller436a3761999-05-28 23:18:51 +0000794}
795
Ulf Möller10a926c2000-02-21 00:55:45 +0000796if ($target eq "LIST") {
Richard Levitte00ae96c2015-05-18 12:53:38 +0200797 foreach (sort keys %table) {
798 print $_,"\n" unless $table{$_}->{template};
799 }
800 exit 0;
Ulf Möller10a926c2000-02-21 00:55:45 +0000801}
802
Richard Levitteaaf878c2015-03-06 02:00:21 +0100803if ($target eq "HASH") {
Richard Levitte00ae96c2015-05-18 12:53:38 +0200804 print "%table = (\n";
805 foreach (sort keys %table) {
806 print_table_entry($_, "HASH");
807 }
808 exit 0;
Richard Levitteaaf878c2015-03-06 02:00:21 +0100809}
810
Richard Levitte00ae96c2015-05-18 12:53:38 +0200811# Backward compatibility?
Richard Levitte49e04542002-02-14 12:28:24 +0000812if ($target =~ m/^CygWin32(-.*)$/) {
Richard Levitte00ae96c2015-05-18 12:53:38 +0200813 $target = "Cygwin".$1;
Richard Levitte49e04542002-02-14 12:28:24 +0000814}
815
Bodo Möllerc9a112f2005-02-22 10:29:51 +0000816foreach (sort (keys %disabled))
817 {
Richard Levitte3fa04f02016-01-12 00:17:12 +0100818 $config{options} .= " no-$_";
Bodo Möllerc9a112f2005-02-22 10:29:51 +0000819
820 printf " no-%-12s %-10s", $_, "[$disabled{$_}]";
821
822 if (/^dso$/)
Richard Levitte721f9052016-02-22 14:12:35 +0100823 { }
Bodo Möllerc9a112f2005-02-22 10:29:51 +0000824 elsif (/^threads$/)
Richard Levitte22bfe052016-02-22 14:03:23 +0100825 { }
Bodo Möllerc9a112f2005-02-22 10:29:51 +0000826 elsif (/^shared$/)
Richard Levitte84af1ba2016-02-22 13:52:46 +0100827 { }
Richard Levitteae482422016-02-22 02:09:11 +0100828 elsif (/^pic$/)
829 { }
Bodo Möllerc9a112f2005-02-22 10:29:51 +0000830 elsif (/^zlib$/)
Richard Levitte36a30902016-02-22 14:04:45 +0100831 { }
Richard Levitte19ab5792016-02-22 02:06:05 +0100832 elsif (/^dynamic-engine$/)
Dr. Stephen Hensonfbf002b2005-11-06 17:58:26 +0000833 { }
Richard Levitte09aa2632016-03-09 01:14:29 +0100834 elsif (/^makedepend$/)
835 { }
Bodo Möllerc9a112f2005-02-22 10:29:51 +0000836 elsif (/^zlib-dynamic$/)
837 { }
Bodo Möllerc9a112f2005-02-22 10:29:51 +0000838 elsif (/^sse2$/)
839 { $no_sse2 = 1; }
Richard Levitte107b5792015-05-20 20:03:20 +0200840 elsif (/^engine$/)
Rich Salz1288f262016-02-17 13:33:51 -0500841 {
842 @{$config{dirs}} = grep !/^engines$/, @{$config{dirs}};
843 @{$config{sdirs}} = grep !/^engine$/, @{$config{sdirs}};
844 push @{$config{openssl_other_defines}}, "OPENSSL_NO_ENGINE";
845 }
Bodo Möllerc9a112f2005-02-22 10:29:51 +0000846 else
847 {
848 my ($ALGO, $algo);
Richard Levitte30fafde2011-03-25 09:29:46 +0000849 ($ALGO = $algo = $_) =~ tr/[\-a-z]/[_A-Z]/;
Bodo Möllerc9a112f2005-02-22 10:29:51 +0000850
Matt Caswell316fae22016-02-18 16:54:16 +0000851 if (/^asm$/ || /^err$/ || /^hw$/ || /^hw-/ || /^async$/
Matt Caswell498abff2016-02-09 09:39:07 +0000852 || /^autoalginit/ || /^autoerrinit/)
Bodo Möllerc9a112f2005-02-22 10:29:51 +0000853 {
Richard Levitte7d130f62015-05-19 01:40:54 +0200854 push @{$config{openssl_other_defines}}, "OPENSSL_NO_$ALGO";
Bodo Möllerc9a112f2005-02-22 10:29:51 +0000855 print " OPENSSL_NO_$ALGO";
Felix Laurie von Massenbachfce0ba52014-05-26 17:19:28 +0100856
Richard Levittebcb19772016-01-30 02:17:05 +0100857 if (/^err$/) { push @user_defines, "OPENSSL_NO_ERR"; }
Bodo Möllerc9a112f2005-02-22 10:29:51 +0000858 }
859 else
860 {
Andy Polyakov2a4af942015-01-24 16:46:54 +0100861 ($ALGO,$algo) = ("RMD160","rmd160") if ($algo eq "ripemd");
862
Richard Levitte7d130f62015-05-19 01:40:54 +0200863 push @{$config{openssl_algorithm_defines}}, "OPENSSL_NO_$ALGO";
Bodo Möllerc9a112f2005-02-22 10:29:51 +0000864 print " OPENSSL_NO_$ALGO";
865
Matt Caswelle36827f2015-05-12 12:14:13 +0100866 # fix-up crypto/directory name(s)
Richard Levitte107b5792015-05-20 20:03:20 +0200867 $algo="whrlpool" if $algo eq "whirlpool";
868 $algo="ripemd" if $algo eq "rmd160";
869 @{$config{sdirs}} = grep { $_ ne $algo} @{$config{sdirs}};
Andy Polyakov2a4af942015-01-24 16:46:54 +0100870
Matt Caswelle36827f2015-05-12 12:14:13 +0100871 print " (skip dir)";
Bodo Möllerc9a112f2005-02-22 10:29:51 +0000872 }
873 }
874
875 print "\n";
876 }
877
Richard Levitte9e0724a2015-05-18 02:54:28 +0200878print "Configuring for $target\n";
879
880# Support for legacy targets having a name starting with 'debug-'
881my ($d, $t) = $target =~ m/^(debug-)?(.*)$/;
882if ($d) {
Richard Levitte8864f0d2016-03-02 19:13:26 +0100883 $config{build_type} = "debug";
Richard Levitte9e0724a2015-05-18 02:54:28 +0200884
885 # If we do not find debug-foo in the table, the target is set to foo.
886 if (!$table{$target}) {
887 $target = $t;
888 }
889}
Richard Levitte291e94d2015-05-18 22:35:23 +0200890$config{target} = $target;
Richard Levitte79302212016-02-27 10:23:15 +0100891my %target = resolve_config($target);
Richard Levitte9e0724a2015-05-18 02:54:28 +0200892
893&usage if (!%target || $target{template});
894
Richard Levitted2b22212016-02-27 11:25:33 +0100895%target = ( %{$table{DEFAULTS}}, %target );
Richard Levitte79302212016-02-27 10:23:15 +0100896
Richard Levitte107b5792015-05-20 20:03:20 +0200897$target{exe_extension}="";
Richard Levittef99f91f2016-02-15 22:13:41 +0100898$target{exe_extension}=".exe" if ($config{target} eq "DJGPP"
899 || $config{target} =~ /^(?:Cygwin|mingw)/);
Richard Levitte107b5792015-05-20 20:03:20 +0200900$target{exe_extension}=".pm" if ($config{target} =~ /vos/);
Ulf Möller462ba4f1999-04-24 22:59:36 +0000901
Richard Levittee987f9f2016-02-15 17:20:15 +0100902($target{shared_extension_simple}=$target{shared_extension})
903 =~ s|\.\$\(SHLIB_MAJOR\)\.\$\(SHLIB_MINOR\)||;
904$target{dso_extension}=$target{shared_extension_simple};
905($target{shared_import_extension}=$target{shared_extension_simple}.".a")
906 if ($config{target} =~ /^(?:Cygwin|mingw)/);
907
908
Richard Levitte642a6132015-12-27 02:27:30 +0100909$config{cross_compile_prefix} = $ENV{'CROSS_COMPILE'}
910 if $config{cross_compile_prefix} eq "";
Dr. Stephen Hensonf99f41c2009-10-07 16:41:14 +0000911
Richard Levitteb0a1e8b2016-03-02 12:22:15 +0100912# Allow overriding the names of some tools. USE WITH CARE
Richard Levitte59028212016-03-31 09:27:15 +0200913$config{perl} = $ENV{'PERL'} || ($^O ne "VMS" ? $^X : "perl");
Richard Levitteb0a1e8b2016-03-02 12:22:15 +0100914$target{cc} = $ENV{'CC'} || $target{cc} || "cc";
Andy Polyakovf58a0ac2016-05-09 15:35:55 +0200915$target{ranlib} = $ENV{'RANLIB'} || $target{ranlib} ||
Andy Polyakov656bbdc2016-05-20 21:31:11 +0200916 (which("$config{cross_compile_prefix}ranlib") ?
Andy Polyakovf58a0ac2016-05-09 15:35:55 +0200917 "\$(CROSS_COMPILE)ranlib" : "true");
Richard Levitteb0a1e8b2016-03-02 12:22:15 +0100918$target{ar} = $ENV{'AR'} || $target{ar} || "ar";
919$target{nm} = $ENV{'NM'} || $target{nm} || "nm";
Richard Levitte8f41ff22016-05-16 17:08:13 +0200920$target{rc} =
921 $ENV{'RC'} || $ENV{'WINDRES'} || $target{rc} || "windres";
Richard Levitteaaf878c2015-03-06 02:00:21 +0100922
Richard Levittebcb19772016-01-30 02:17:05 +0100923# For cflags, lflags, plib_lflags, ex_libs and defines, add the debug_
924# or release_ attributes.
Richard Levitteaaf878c2015-03-06 02:00:21 +0100925# Do it in such a way that no spurious space is appended (hence the grep).
Richard Levitte2952b9b2016-03-02 10:57:05 +0100926$config{defines} = [];
927$config{cflags} = "";
928$config{ex_libs} = "";
929$config{shared_ldflag} = "";
Richard Levitteaaf878c2015-03-06 02:00:21 +0100930
Richard Levitte291e94d2015-05-18 22:35:23 +0200931# Make sure build_scheme is consistent.
932$target{build_scheme} = [ $target{build_scheme} ]
933 if ref($target{build_scheme}) ne "ARRAY";
Richard Levitted0d046e2002-01-27 15:52:37 +0000934
Richard Levitteddf18472016-01-30 00:57:33 +0100935my ($builder, $builder_platform, @builder_opts) =
936 @{$target{build_scheme}};
937
Richard Levitte488e2b02016-04-01 16:03:46 +0200938push @{$config{defines}}, "NDEBUG" if $config{build_type} eq "release";
939
Richard Levitte68ab5592016-02-05 15:14:45 +0100940if ($target =~ /^mingw/ && `$target{cc} --target-help 2>&1` =~ m/-mno-cygwin/m)
Andy Polyakovcbecd292010-11-30 22:18:02 +0000941 {
Richard Levitte68ab5592016-02-05 15:14:45 +0100942 $config{cflags} .= " -mno-cygwin";
Richard Levitte2952b9b2016-03-02 10:57:05 +0100943 $config{shared_ldflag} .= " -mno-cygwin";
Andy Polyakovcbecd292010-11-30 22:18:02 +0000944 }
945
Richard Levitte00b0d662016-02-22 14:10:45 +0100946if ($target =~ /linux.*-mips/ && !$disabled{asm} && $user_cflags !~ /-m(ips|arch=)/) {
Andy Polyakov63d88342012-09-15 11:21:50 +0000947 # minimally required architecture flags for assembly modules
Richard Levitte107b5792015-05-20 20:03:20 +0200948 $config{cflags}="-mips2 $config{cflags}" if ($target =~ /mips32/);
949 $config{cflags}="-mips3 $config{cflags}" if ($target =~ /mips64/);
Andy Polyakov63d88342012-09-15 11:21:50 +0000950}
951
Richard Levitte2964ba82003-01-11 11:40:39 +0000952my $no_shared_warn=0;
Andy Polyakov14bcdb02005-01-24 15:58:25 +0000953my $no_user_cflags=0;
Richard Levittebcb19772016-01-30 02:17:05 +0100954my $no_user_defines=0;
Richard Levitte2964ba82003-01-11 11:40:39 +0000955
Geoff Thorpebc2aada2000-04-06 07:09:45 +0000956# The DSO code currently always implements all functions so that no
957# applications will have to worry about that from a compilation point
958# of view. However, the "method"s may return zero unless that platform
959# has support compiled in for them. Currently each method is enabled
960# by a define "DSO_<name>" ... we translate the "dso_scheme" config
961# string entry into using the following logic;
Richard Levitte721f9052016-02-22 14:12:35 +0100962if (!$disabled{dso} && $target{dso_scheme} ne "")
Geoff Thorpebc2aada2000-04-06 07:09:45 +0000963 {
Richard Levitte291e94d2015-05-18 22:35:23 +0200964 $target{dso_scheme} =~ tr/[a-z]/[A-Z]/;
965 if ($target{dso_scheme} eq "DLFCN")
Geoff Thorpebc2aada2000-04-06 07:09:45 +0000966 {
Richard Levitte2952b9b2016-03-02 10:57:05 +0100967 unshift @{$config{defines}}, "DSO_DLFCN", "HAVE_DLFCN_H";
Geoff Thorpebc2aada2000-04-06 07:09:45 +0000968 }
Richard Levitte291e94d2015-05-18 22:35:23 +0200969 elsif ($target{dso_scheme} eq "DLFCN_NO_H")
Geoff Thorpebc2aada2000-04-06 07:09:45 +0000970 {
Richard Levitte2952b9b2016-03-02 10:57:05 +0100971 unshift @{$config{defines}}, "DSO_DLFCN";
Geoff Thorpebc2aada2000-04-06 07:09:45 +0000972 }
973 else
974 {
Richard Levitte2952b9b2016-03-02 10:57:05 +0100975 unshift @{$config{defines}}, "DSO_$target{dso_scheme}";
Geoff Thorpebc2aada2000-04-06 07:09:45 +0000976 }
977 }
Geoff Thorpe9ec01262000-04-04 22:32:19 +0000978
Richard Levitte1740c162016-01-29 18:07:37 +0100979$config{ex_libs}="$libs$config{ex_libs}" if ($libs ne "");
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000980
Richard Levitte00b0d662016-02-22 14:10:45 +0100981if ($disabled{asm})
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +0000982 {
Richard Levitte2952b9b2016-03-02 10:57:05 +0100983 if ($config{fips})
984 {
985 @{$config{defines}} = grep !/^[BL]_ENDIAN$/, @{$config{defines}};
986 @{$target{defines}} = grep !/^[BL]_ENDIAN$/, @{$target{defines}};
987 }
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +0000988 }
Andy Polyakov6f7ac8e2002-12-13 17:56:14 +0000989
Richard Levitte9c62a272016-02-27 16:51:34 +0100990# If threads aren't disabled, check how possible they are
991unless ($disabled{threads}) {
992 if ($auto_threads) {
993 # Enabled by default, disable it forcibly if unavailable
994 if ($target{thread_scheme} eq "(unknown)") {
995 $disabled{threads} = "unavailable";
996 }
997 } else {
FdaSilvaYY8483a002016-03-10 21:34:48 +0100998 # The user chose to enable threads explicitly, let's see
Richard Levitte9c62a272016-02-27 16:51:34 +0100999 # if there's a chance that's possible
1000 if ($target{thread_scheme} eq "(unknown)") {
1001 # If the user asked for "threads" and we don't have internal
1002 # knowledge how to do it, [s]he is expected to provide any
1003 # system-dependent compiler options that are necessary. We
1004 # can't truly check that the given options are correct, but
1005 # we expect the user to know what [s]He is doing.
1006 if ($no_user_cflags && $no_user_defines) {
1007 die "You asked for multi-threading support, but didn't\n"
1008 ,"provide any system-specific compiler options\n";
1009 }
1010 }
1011 }
1012}
1013
1014# If threads still aren't disabled, add a C macro to ensure the source
1015# code knows about it. Any other flag is taken care of by the configs.
1016unless($disabled{threads}) {
1017 foreach (("defines", "openssl_thread_defines")) {
1018 push @{$config{$_}}, "OPENSSL_THREADS";
1019 }
1020}
Richard Levittee452de92001-07-12 09:11:14 +00001021
Viktor Dukhovni98186eb2016-01-04 23:00:33 -05001022# With "deprecated" disable all deprecated features.
1023if (defined($disabled{"deprecated"})) {
Richard Levitte107b5792015-05-20 20:03:20 +02001024 $config{api} = $maxapi;
Viktor Dukhovni98186eb2016-01-04 23:00:33 -05001025}
Matt Caswell07c4c142014-12-17 13:17:26 +00001026
Richard Levitte291e94d2015-05-18 22:35:23 +02001027if ($target{shared_target} eq "")
Andy Polyakov6f7ac8e2002-12-13 17:56:14 +00001028 {
Richard Levitteae482422016-02-22 02:09:11 +01001029 $no_shared_warn = 1
Richard Levitte84af1ba2016-02-22 13:52:46 +01001030 if ((!$disabled{shared} || !$disabled{"dynamic-engine"})
Richard Levitteae482422016-02-22 02:09:11 +01001031 && !$config{fips});
Richard Levitte84af1ba2016-02-22 13:52:46 +01001032 $disabled{shared} = "no-shared-target";
Richard Levitteae482422016-02-22 02:09:11 +01001033 $disabled{pic} = $disabled{shared} = $disabled{"dynamic-engine"} =
1034 "no-shared-target";
Andy Polyakov6f7ac8e2002-12-13 17:56:14 +00001035 }
Richard Levitteb436a982000-07-21 15:08:53 +00001036
Richard Levitte19ab5792016-02-22 02:06:05 +01001037if ($disabled{"dynamic-engine"}) {
Richard Levitte343ec2b2016-02-19 22:08:37 +01001038 push @{$config{defines}}, "OPENSSL_NO_DYNAMIC_ENGINE";
1039 $config{dynamic_engines} = 0;
Richard Levitte19ab5792016-02-22 02:06:05 +01001040} else {
1041 push @{$config{defines}}, "OPENSSL_NO_STATIC_ENGINE";
1042 $config{dynamic_engines} = 1;
Richard Levitte343ec2b2016-02-19 22:08:37 +01001043}
Richard Levitteecd45312002-10-11 18:06:08 +00001044
Ben Lauriec38bb722016-03-26 17:19:14 +00001045unless ($disabled{fuzz}) {
Andy Polyakovc145d192016-05-09 11:44:10 +02001046 push @{$config{dirs}}, "fuzz";
Ben Lauriec38bb722016-03-26 17:19:14 +00001047 $config{cflags} .= "-fsanitize-coverage=edge,indirect-calls ";
1048}
1049
1050unless ($disabled{asan}) {
1051 $config{cflags} .= "-fsanitize=address ";
1052}
1053
1054unless ($disabled{ubsan}) {
1055 # -DPEDANTIC or -fnosanitize=aligmnent may also be required on some
1056 # platforms.
1057 $config{cflags} .= "-fsanitize=undefined -fno-sanitize-recover=all ";
1058}
1059
1060unless ($disabled{fuzz} && $disabled{asan} && $disabled{ubsan}) {
1061 $config{cflags} .= "-fno-omit-frame-pointer -g ";
1062}
Andy Polyakovc313e322007-09-16 12:23:47 +00001063#
1064# Platform fix-ups
1065#
Richard Levitteae482422016-02-22 02:09:11 +01001066
1067# This saves the build files from having to check
1068if ($disabled{pic})
1069 {
1070 $target{shared_cflag} = $target{shared_ldflag} =
1071 $target{shared_rcflag} = "";
1072 }
Richard Levitte4f160392016-02-21 20:52:39 +01001073else
1074 {
1075 push @{$config{defines}}, "OPENSSL_PIC";
1076 }
Richard Levitteae482422016-02-22 02:09:11 +01001077
Richard Levitte291e94d2015-05-18 22:35:23 +02001078if ($target{sys_id} ne "")
Richard Levittecf1b7d92001-02-19 16:06:34 +00001079 {
Richard Levitte642a6132015-12-27 02:27:30 +01001080 push @{$config{openssl_sys_defines}}, "OPENSSL_SYS_$target{sys_id}";
Richard Levittecf1b7d92001-02-19 16:06:34 +00001081 }
1082
Richard Levitte00b0d662016-02-22 14:10:45 +01001083unless ($disabled{asm}) {
Richard Levitted2b22212016-02-27 11:25:33 +01001084 $target{cpuid_asm_src}=$table{DEFAULTS}->{cpuid_asm_src} if ($config{processor} eq "386");
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001085 $target{bn_asm_src} =~ s/\w+-gf2m.c// if (defined($disabled{ec2m}));
Andy Polyakovf8c469d2004-08-02 22:41:19 +00001086
Richard Levitte9e0724a2015-05-18 02:54:28 +02001087 # bn-586 is the only one implementing bn_*_part_words
Richard Levittebcb19772016-01-30 02:17:05 +01001088 push @{$config{defines}}, "OPENSSL_BN_ASM_PART_WORDS" if ($target{bn_asm_src} =~ /bn-586/);
1089 push @{$config{defines}}, "OPENSSL_IA32_SSE2" if (!$no_sse2 && $target{bn_asm_src} =~ /86/);
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +00001090
Richard Levittebcb19772016-01-30 02:17:05 +01001091 push @{$config{defines}}, "OPENSSL_BN_ASM_MONT" if ($target{bn_asm_src} =~ /-mont/);
1092 push @{$config{defines}}, "OPENSSL_BN_ASM_MONT5" if ($target{bn_asm_src} =~ /-mont5/);
1093 push @{$config{defines}}, "OPENSSL_BN_ASM_GF2m" if ($target{bn_asm_src} =~ /-gf2m/);
Andy Polyakov5ac7bde2005-10-07 14:18:06 +00001094
Richard Levitte107b5792015-05-20 20:03:20 +02001095 if ($config{fips}) {
Richard Levitte7d130f62015-05-19 01:40:54 +02001096 push @{$config{openssl_other_defines}}, "OPENSSL_FIPS";
Richard Levitte9e0724a2015-05-18 02:54:28 +02001097 }
Dr. Stephen Henson1ab2f7f2011-01-26 12:31:30 +00001098
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001099 if ($target{sha1_asm_src}) {
Richard Levittebcb19772016-01-30 02:17:05 +01001100 push @{$config{defines}}, "SHA1_ASM" if ($target{sha1_asm_src} =~ /sx86/ || $target{sha1_asm_src} =~ /sha1/);
1101 push @{$config{defines}}, "SHA256_ASM" if ($target{sha1_asm_src} =~ /sha256/);
1102 push @{$config{defines}}, "SHA512_ASM" if ($target{sha1_asm_src} =~ /sha512/);
Richard Levitte9e0724a2015-05-18 02:54:28 +02001103 }
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001104 if ($target{md5_asm_src}) {
Richard Levittebcb19772016-01-30 02:17:05 +01001105 push @{$config{defines}}, "MD5_ASM";
Richard Levitte9e0724a2015-05-18 02:54:28 +02001106 }
Richard Levitted2b22212016-02-27 11:25:33 +01001107 $target{cast_asm_src}=$table{DEFAULTS}->{cast_asm_src} unless $disabled{pic}; # CAST assembler is not PIC
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001108 if ($target{rmd160_asm_src}) {
Richard Levittebcb19772016-01-30 02:17:05 +01001109 push @{$config{defines}}, "RMD160_ASM";
Richard Levitte9e0724a2015-05-18 02:54:28 +02001110 }
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001111 if ($target{aes_asm_src}) {
Richard Levittebcb19772016-01-30 02:17:05 +01001112 push @{$config{defines}}, "AES_ASM" if ($target{aes_asm_src} =~ m/\baes-/);;
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001113 # aes-ctr.fake is not a real file, only indication that assembler
Andy Polyakov874a3752010-07-09 12:21:52 +00001114 # module implements AES_ctr32_encrypt...
Richard Levittebcb19772016-01-30 02:17:05 +01001115 push @{$config{defines}}, "AES_CTR_ASM" if ($target{aes_asm_src} =~ s/\s*aes-ctr\.fake//);
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001116 # aes-xts.fake indicates presence of AES_xts_[en|de]crypt...
Richard Levittebcb19772016-01-30 02:17:05 +01001117 push @{$config{defines}}, "AES_XTS_ASM" if ($target{aes_asm_src} =~ s/\s*aes-xts\.fake//);
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001118 $target{aes_asm_src} =~ s/\s*(vpaes|aesni)-x86\.s//g if ($no_sse2);
Richard Levittebcb19772016-01-30 02:17:05 +01001119 push @{$config{defines}}, "VPAES_ASM" if ($target{aes_asm_src} =~ m/vpaes/);
1120 push @{$config{defines}}, "BSAES_ASM" if ($target{aes_asm_src} =~ m/bsaes/);
Richard Levitte9e0724a2015-05-18 02:54:28 +02001121 }
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001122 if ($target{wp_asm_src} =~ /mmx/) {
Andy Polyakov46d4d862016-01-29 14:23:24 +01001123 if ($config{processor} eq "386") {
Richard Levitted2b22212016-02-27 11:25:33 +01001124 $target{wp_asm_src}=$table{DEFAULTS}->{wp_asm_src};
Andy Polyakov46d4d862016-01-29 14:23:24 +01001125 } elsif (!$disabled{"whirlpool"}) {
Richard Levitte2952b9b2016-03-02 10:57:05 +01001126 push @{$config{defines}}, "WHIRLPOOL_ASM";
Andy Polyakov46d4d862016-01-29 14:23:24 +01001127 }
Richard Levitte9e0724a2015-05-18 02:54:28 +02001128 }
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001129 if ($target{modes_asm_src} =~ /ghash-/) {
Richard Levittebcb19772016-01-30 02:17:05 +01001130 push @{$config{defines}}, "GHASH_ASM";
Richard Levitte9e0724a2015-05-18 02:54:28 +02001131 }
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001132 if ($target{ec_asm_src} =~ /ecp_nistz256/) {
Richard Levittebcb19772016-01-30 02:17:05 +01001133 push @{$config{defines}}, "ECP_NISTZ256_ASM";
Richard Levitte9e0724a2015-05-18 02:54:28 +02001134 }
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001135 if ($target{poly1305_asm_src} ne "") {
Richard Levittebcb19772016-01-30 02:17:05 +01001136 push @{$config{defines}}, "POLY1305_ASM";
Richard Levitte9e0724a2015-05-18 02:54:28 +02001137 }
1138}
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001139
Richard Levitte8ed40b82016-01-27 19:03:13 +01001140my $ecc = $target{cc};
Richard Levitte09aa2632016-03-09 01:14:29 +01001141if ($^O ne "VMS" && !$disabled{makedepend}) {
Richard Levittea583fc42016-02-16 16:08:06 +01001142 # Is the compiler gcc or clang? $ecc is used below to see if
1143 # error-checking can be turned on.
1144 my $ccpcc = "$config{cross_compile_prefix}$target{cc}";
Andy Polyakovd0db7ee2016-03-11 12:33:59 +01001145 open(PIPE, "$ccpcc --version 2>&1 |");
1146 my $lines = 2;
Richard Levittea583fc42016-02-16 16:08:06 +01001147 while ( <PIPE> ) {
Richard Levitte30752dd2016-03-08 17:16:16 +01001148 # Find the version number and save the major.
1149 m|(?:.*)\b(\d+)\.\d+\.\d+\b(?:.*)|;
Richard Levitte39affe12016-03-10 19:33:11 +01001150 my $compiler_major = $1;
Richard Levitte30752dd2016-03-08 17:16:16 +01001151 # We know that GNU C version 3 and up as well as all clang
1152 # versions support dependency generation
Richard Levitte39affe12016-03-10 19:33:11 +01001153 $config{makedepprog} = $ccpcc
Andy Polyakovd0db7ee2016-03-11 12:33:59 +01001154 if (/clang/ || (/gcc/ && $compiler_major > 3));
Richard Levittea583fc42016-02-16 16:08:06 +01001155 $ecc = "clang" if /clang/;
1156 $ecc = "gcc" if /gcc/;
Andy Polyakovd0db7ee2016-03-11 12:33:59 +01001157 last if ($config{makedepprog} || !$lines--);
Richard Levittea583fc42016-02-16 16:08:06 +01001158 }
1159 close(PIPE);
Richard Levitte09aa2632016-03-09 01:14:29 +01001160
Andy Polyakov656bbdc2016-05-20 21:31:11 +02001161 $config{makedepprog} = which('makedepend') unless $config{makedepprog};
Richard Levitte09aa2632016-03-09 01:14:29 +01001162 $disabled{makedepend} = "unavailable" unless $config{makedepprog};
Rich Salzf1f07a22016-01-29 19:50:28 -05001163}
Richard Levitte8ed40b82016-01-27 19:03:13 +01001164
Richard Levitte7d130f62015-05-19 01:40:54 +02001165
Richard Levitte09aa2632016-03-09 01:14:29 +01001166
Richard Levitte7d130f62015-05-19 01:40:54 +02001167# Deal with bn_ops ###################################################
1168
Richard Levitte7d130f62015-05-19 01:40:54 +02001169$config{bn_ll} =0;
Richard Levitte7d130f62015-05-19 01:40:54 +02001170$config{export_var_as_fn} =0;
1171my $def_int="unsigned int";
1172$config{rc4_int} =$def_int;
Rich Salzb4f35e52016-01-23 13:23:25 -05001173($config{b64l},$config{b64},$config{b32})=(0,0,1);
Richard Levitte7d130f62015-05-19 01:40:54 +02001174
Rich Salz94af0cd2016-01-28 10:13:21 -05001175my $count = 0;
Richard Levitte7d130f62015-05-19 01:40:54 +02001176foreach (sort split(/\s+/,$target{bn_ops})) {
Rich Salz94af0cd2016-01-28 10:13:21 -05001177 $count++ if /SIXTY_FOUR_BIT|SIXTY_FOUR_BIT_LONG|THIRTY_TWO_BIT/;
1178 $config{export_var_as_fn}=1 if $_ eq 'EXPORT_VAR_AS_FN';
1179 $config{bn_ll}=1 if $_ eq 'BN_LLONG';
1180 $config{rc4_int}="unsigned char" if $_ eq 'RC4_CHAR';
1181 ($config{b64l},$config{b64},$config{b32})
1182 =(0,1,0) if $_ eq 'SIXTY_FOUR_BIT';
1183 ($config{b64l},$config{b64},$config{b32})
1184 =(1,0,0) if $_ eq 'SIXTY_FOUR_BIT_LONG';
1185 ($config{b64l},$config{b64},$config{b32})
1186 =(0,0,1) if $_ eq 'THIRTY_TWO_BIT';
Richard Levitte7d130f62015-05-19 01:40:54 +02001187}
Rich Salz94af0cd2016-01-28 10:13:21 -05001188die "Exactly one of SIXTY_FOUR_BIT|SIXTY_FOUR_BIT_LONG|THIRTY_TWO_BIT can be set in bn_ops\n"
1189 if $count > 1;
Richard Levitte7d130f62015-05-19 01:40:54 +02001190
1191
1192# Hack cflags for better warnings (dev option) #######################
1193
Richard Levitte1ed0c662002-05-30 18:06:35 +00001194# "Stringify" the C flags string. This permits it to be made part of a string
1195# and works as well on command lines.
Richard Levitte01d99972016-03-14 10:02:13 +01001196$config{cflags} =~ s/([\\\"])/\\$1/g;
Richard Levitte1ed0c662002-05-30 18:06:35 +00001197
Richard Levitte107b5792015-05-20 20:03:20 +02001198if (defined($config{api})) {
1199 $config{openssl_api_defines} = [ "OPENSSL_MIN_API=".$apitable->{$config{api}} ];
Richard Levittebcb19772016-01-30 02:17:05 +01001200 my $apiflag = sprintf("OPENSSL_API_COMPAT=%s", $apitable->{$config{api}});
Richard Levittebcb19772016-01-30 02:17:05 +01001201 push @{$config{defines}}, $apiflag;
Viktor Dukhovni98186eb2016-01-04 23:00:33 -05001202}
1203
Dr. Stephen Henson0c28f272009-09-09 16:31:32 +00001204if ($strict_warnings)
1205 {
1206 my $wopt;
Rich Salzf1f07a22016-01-29 19:50:28 -05001207 die "ERROR --strict-warnings requires gcc or clang"
1208 unless $ecc eq 'gcc' || $ecc eq 'clang';
Dr. Stephen Henson0c28f272009-09-09 16:31:32 +00001209 foreach $wopt (split /\s+/, $gcc_devteam_warn)
1210 {
Richard Levitted918f9c2016-02-16 23:27:13 +01001211 $config{cflags} .= " $wopt" unless ($config{cflags} =~ /(?:^|\s)$wopt(?:\s|$)/)
Dr. Stephen Henson0c28f272009-09-09 16:31:32 +00001212 }
Ben Laurie190c8c62015-04-19 14:10:54 +01001213 if ($ecc eq "clang")
1214 {
1215 foreach $wopt (split /\s+/, $clang_devteam_warn)
1216 {
Richard Levitted918f9c2016-02-16 23:27:13 +01001217 $config{cflags} .= " $wopt" unless ($config{cflags} =~ /(?:^|\s)$wopt(?:\s|$)/)
Ben Laurie190c8c62015-04-19 14:10:54 +01001218 }
1219 }
Richard Levitteef8ca6b2016-02-14 12:16:52 +01001220 }
1221
1222unless ($disabled{"crypto-mdebug-backtrace"})
1223 {
1224 foreach my $wopt (split /\s+/, $memleak_devteam_backtrace)
Richard Levittea1d3f3d2015-12-02 18:44:26 +01001225 {
Richard Levitted918f9c2016-02-16 23:27:13 +01001226 $config{cflags} .= " $wopt" unless ($config{cflags} =~ /(?:^|\s)$wopt(?:\s|$)/)
Richard Levitteef8ca6b2016-02-14 12:16:52 +01001227 }
1228 if ($target =~ /^BSD-/)
1229 {
1230 $config{ex_libs} .= " -lexecinfo";
Richard Levitte291e94d2015-05-18 22:35:23 +02001231 }
Dr. Stephen Henson0c28f272009-09-09 16:31:32 +00001232 }
1233
Richard Levitte63994092016-02-13 13:02:35 +01001234if ($user_cflags ne "") { $config{cflags}="$config{cflags}$user_cflags"; }
1235else { $no_user_cflags=1; }
1236if (@user_defines) { $config{defines}=[ @{$config{defines}}, @user_defines ]; }
1237else { $no_user_defines=1; }
1238
1239# ALL MODIFICATIONS TO %config and %target MUST BE DONE FROM HERE ON
1240
Emilia Kasperc91a0a82016-03-14 12:21:44 +01001241unless ($disabled{afalgeng}) {
1242 $config{afalgeng}="";
Richard Levitte79fff392016-03-09 09:04:01 +01001243 if ($target =~ m/^linux/) {
1244 my $minver = 4*10000 + 1*100 + 0;
1245 if ($config{cross_compile_prefix} eq "") {
1246 my $verstr = `uname -r`;
1247 my ($ma, $mi1, $mi2) = split("\\.", $verstr);
1248 ($mi2) = $mi2 =~ /(\d+)/;
1249 my $ver = $ma*10000 + $mi1*100 + $mi2;
1250 if ($ver < $minver) {
Emilia Kasperc91a0a82016-03-14 12:21:44 +01001251 $disabled{afalgeng} = "too-old-kernel";
Richard Levitte79fff392016-03-09 09:04:01 +01001252 } else {
1253 push @{$config{engdirs}}, "afalg";
1254 }
Matt Caswell68dc37c2016-03-16 10:08:53 +00001255 } else {
1256 $disabled{afalgeng} = "cross-compiling";
clucey6cba4a62016-02-23 08:01:01 +00001257 }
Richard Levitte79fff392016-03-09 09:04:01 +01001258 } else {
Emilia Kasperc91a0a82016-03-14 12:21:44 +01001259 $disabled{afalgeng} = "not-linux";
clucey7f458a42016-02-17 13:38:36 +00001260 }
1261}
Matt Caswell8da00a32016-02-29 13:36:47 +00001262
Emilia Kasperc91a0a82016-03-14 12:21:44 +01001263push @{$config{openssl_other_defines}}, "OPENSSL_NO_AFALGENG" if ($disabled{afalgeng});
clucey7f458a42016-02-17 13:38:36 +00001264
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001265# If we use the unified build, collect information from build.info files
1266my %unified_info = ();
1267
Richard Levitte2b6b6062016-03-10 00:04:04 +01001268my $buildinfo_debug = defined($ENV{CONFIGURE_DEBUG_BUILDINFO});
Richard Levitteddf18472016-01-30 00:57:33 +01001269if ($builder eq "unified") {
1270 # Store the name of the template file we will build the build file from
1271 # in %config. This may be useful for the build file itself.
Richard Levitte38add232016-05-02 17:05:48 +02001272 my $build_file_template;
1273
1274 for my $filename (( $builder_platform."-".$target{build_file}.".tmpl",
1275 $target{build_file}.".tmpl" )) {
1276 if (defined $ENV{$local_config_envname}) {
1277 if ($^O eq 'VMS') {
1278 # VMS environment variables are logical names,
1279 # which can be used as is
1280 $build_file_template = $local_config_envname . ':' . $filename;
1281 } else {
1282 $build_file_template = catfile($ENV{$local_config_envname},
1283 $filename);
1284 }
1285 }
1286
1287 last if -f $build_file_template;
1288
1289 $build_file_template = catfile($srcdir, "Configurations", $filename);
1290
1291 last if -f $build_file_template;
1292 }
Richard Levitteddf18472016-01-30 00:57:33 +01001293 $config{build_file_template} = $build_file_template;
1294
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001295 use lib catdir(dirname(__FILE__),"util");
1296 use with_fallback qw(Text::Template);
1297
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001298 sub cleandir {
Richard Levitte2e963842016-02-10 02:00:37 +01001299 my $base = shift;
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001300 my $dir = shift;
Richard Levitte2e963842016-02-10 02:00:37 +01001301 my $relativeto = shift || ".";
1302
1303 $dir = catdir($base,$dir) unless isabsolute($dir);
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001304
Richard Levitteec182ef2016-02-09 10:15:13 +01001305 # Make sure the directories we're building in exists
1306 mkpath($dir);
1307
Richard Levitte2e963842016-02-10 02:00:37 +01001308 my $res = abs2rel(absolutedir($dir), rel2abs($relativeto));
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001309 #print STDERR "DEBUG[cleandir]: $dir , $base => $res\n";
1310 return $res;
1311 }
1312
1313 sub cleanfile {
Richard Levitte2e963842016-02-10 02:00:37 +01001314 my $base = shift;
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001315 my $file = shift;
Richard Levitte2e963842016-02-10 02:00:37 +01001316 my $relativeto = shift || ".";
1317
1318 $file = catfile($base,$file) unless isabsolute($file);
1319
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001320 my $d = dirname($file);
1321 my $f = basename($file);
1322
Richard Levitteec182ef2016-02-09 10:15:13 +01001323 # Make sure the directories we're building in exists
1324 mkpath($d);
1325
Richard Levitte2e963842016-02-10 02:00:37 +01001326 my $res = abs2rel(catfile(absolutedir($d), $f), rel2abs($relativeto));
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001327 #print STDERR "DEBUG[cleanfile]: $d , $f => $res\n";
1328 return $res;
1329 }
1330
1331 my @build_infos = ( [ ".", "build.info" ] );
1332 foreach (@{$config{dirs}}) {
1333 push @build_infos, [ $_, "build.info" ]
1334 if (-f catfile($srcdir, $_, "build.info"));
1335 }
1336 foreach (@{$config{sdirs}}) {
1337 push @build_infos, [ catdir("crypto", $_), "build.info" ]
1338 if (-f catfile($srcdir, "crypto", $_, "build.info"));
1339 }
1340 foreach (@{$config{engdirs}}) {
1341 push @build_infos, [ catdir("engines", $_), "build.info" ]
1342 if (-f catfile($srcdir, "engines", $_, "build.info"));
1343 }
1344
Richard Levitte2e0956b2016-02-28 01:13:17 +01001345 $config{build_infos} = [ ];
1346
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001347 foreach (@build_infos) {
1348 my $sourced = catdir($srcdir, $_->[0]);
1349 my $buildd = catdir($blddir, $_->[0]);
1350
Richard Levittedca99382016-02-08 16:27:15 +01001351 mkpath($buildd);
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001352
1353 my $f = $_->[1];
1354 # The basic things we're trying to build
1355 my @programs = ();
1356 my @libraries = ();
1357 my @engines = ();
1358 my @scripts = ();
1359 my @extra = ();
Richard Levitte8a679462016-03-07 14:50:37 +01001360 my @overrides = ();
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001361 my @intermediates = ();
1362 my @rawlines = ();
1363
1364 my %ordinals = ();
1365 my %sources = ();
Richard Levitte2a08d1a2016-03-29 16:45:03 +02001366 my %shared_sources = ();
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001367 my %includes = ();
1368 my %depends = ();
1369 my %renames = ();
1370 my %sharednames = ();
Richard Levitteae4c7452016-03-07 14:37:00 +01001371 my %generate = ();
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001372
Richard Levitte2e0956b2016-02-28 01:13:17 +01001373 push @{$config{build_infos}}, catfile(abs2rel($sourced, $blddir), $f);
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001374 my $template = Text::Template->new(TYPE => 'FILE',
1375 SOURCE => catfile($sourced, $f));
1376 die "Something went wrong with $sourced/$f: $!\n" unless $template;
1377 my @text =
1378 split /^/m,
1379 $template->fill_in(HASH => { config => \%config,
1380 target => \%target,
Richard Levitte9e04edf2016-02-22 13:45:46 +01001381 disabled => \%disabled,
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001382 builddir => abs2rel($buildd, $blddir),
1383 sourcedir => abs2rel($sourced, $blddir),
1384 buildtop => abs2rel($blddir, $blddir),
1385 sourcetop => abs2rel($srcdir, $blddir) },
1386 DELIMITERS => [ "{-", "-}" ]);
1387
1388 # The top item of this stack has the following values
1389 # -2 positive already run and we found ELSE (following ELSIF should fail)
1390 # -1 positive already run (skip until ENDIF)
1391 # 0 negatives so far (if we're at a condition, check it)
1392 # 1 last was positive (don't skip lines until next ELSE, ELSIF or ENDIF)
1393 # 2 positive ELSE (following ELSIF should fail)
1394 my @skip = ();
1395 collect_information(
1396 collect_from_array([ @text ],
1397 qr/\\$/ => sub { my $l1 = shift; my $l2 = shift;
1398 $l1 =~ s/\\$//; $l1.$l2 }),
1399 # Info we're looking for
1400 qr/^\s*IF\[((?:\\.|[^\\\]])*)\]\s*$/
Richard Levitte635bd402016-03-09 14:33:37 +01001401 => sub {
Richard Levittec5798e02016-03-09 23:58:44 +01001402 if (! @skip || $skip[$#skip] > 0) {
Richard Levitte635bd402016-03-09 14:33:37 +01001403 push @skip, !! $1;
1404 } else {
1405 push @skip, -1;
1406 }
1407 },
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001408 qr/^\s*ELSIF\[((?:\\.|[^\\\]])*)\]\s*$/
1409 => sub { die "ELSIF out of scope" if ! @skip;
1410 die "ELSIF following ELSE" if abs($skip[$#skip]) == 2;
1411 $skip[$#skip] = -1 if $skip[$#skip] != 0;
1412 $skip[$#skip] = !! $1
1413 if $skip[$#skip] == 0; },
1414 qr/^\s*ELSE\s*$/
1415 => sub { die "ELSE out of scope" if ! @skip;
1416 $skip[$#skip] = -2 if $skip[$#skip] != 0;
1417 $skip[$#skip] = 2 if $skip[$#skip] == 0; },
1418 qr/^\s*ENDIF\s*$/
1419 => sub { die "ENDIF out of scope" if ! @skip;
1420 pop @skip; },
1421 qr/^\s*PROGRAMS\s*=\s*(.*)\s*$/
Richard Levittece959812016-05-24 17:39:52 +02001422 => sub { push @programs, tokenize($1)
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001423 if !@skip || $skip[$#skip] > 0 },
1424 qr/^\s*LIBS\s*=\s*(.*)\s*$/
Richard Levittece959812016-05-24 17:39:52 +02001425 => sub { push @libraries, tokenize($1)
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001426 if !@skip || $skip[$#skip] > 0 },
1427 qr/^\s*ENGINES\s*=\s*(.*)\s*$/
Richard Levittece959812016-05-24 17:39:52 +02001428 => sub { push @engines, tokenize($1)
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001429 if !@skip || $skip[$#skip] > 0 },
1430 qr/^\s*SCRIPTS\s*=\s*(.*)\s*$/
Richard Levittece959812016-05-24 17:39:52 +02001431 => sub { push @scripts, tokenize($1)
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001432 if !@skip || $skip[$#skip] > 0 },
1433 qr/^\s*EXTRA\s*=\s*(.*)\s*$/
Richard Levittece959812016-05-24 17:39:52 +02001434 => sub { push @extra, tokenize($1)
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001435 if !@skip || $skip[$#skip] > 0 },
Richard Levitte8a679462016-03-07 14:50:37 +01001436 qr/^\s*OVERRIDES\s*=\s*(.*)\s*$/
Richard Levittece959812016-05-24 17:39:52 +02001437 => sub { push @overrides, tokenize($1)
Richard Levitte8a679462016-03-07 14:50:37 +01001438 if !@skip || $skip[$#skip] > 0 },
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001439
1440 qr/^\s*ORDINALS\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/,
Richard Levittece959812016-05-24 17:39:52 +02001441 => sub { push @{$ordinals{$1}}, tokenize($2)
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001442 if !@skip || $skip[$#skip] > 0 },
1443 qr/^\s*SOURCE\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/
Richard Levittece959812016-05-24 17:39:52 +02001444 => sub { push @{$sources{$1}}, tokenize($2)
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001445 if !@skip || $skip[$#skip] > 0 },
Richard Levitte2a08d1a2016-03-29 16:45:03 +02001446 qr/^\s*SHARED_SOURCE\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/
Richard Levittece959812016-05-24 17:39:52 +02001447 => sub { push @{$shared_sources{$1}}, tokenize($2)
Richard Levitte2a08d1a2016-03-29 16:45:03 +02001448 if !@skip || $skip[$#skip] > 0 },
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001449 qr/^\s*INCLUDE\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/
Richard Levittece959812016-05-24 17:39:52 +02001450 => sub { push @{$includes{$1}}, tokenize($2)
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001451 if !@skip || $skip[$#skip] > 0 },
1452 qr/^\s*DEPEND\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/
Richard Levittece959812016-05-24 17:39:52 +02001453 => sub { push @{$depends{$1}}, tokenize($2)
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001454 if !@skip || $skip[$#skip] > 0 },
Richard Levitteae4c7452016-03-07 14:37:00 +01001455 qr/^\s*GENERATE\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/
1456 => sub { push @{$generate{$1}}, $2
1457 if !@skip || $skip[$#skip] > 0 },
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001458 qr/^\s*RENAME\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/
Richard Levittece959812016-05-24 17:39:52 +02001459 => sub { push @{$renames{$1}}, tokenize($2)
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001460 if !@skip || $skip[$#skip] > 0 },
1461 qr/^\s*SHARED_NAME\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/
Richard Levittece959812016-05-24 17:39:52 +02001462 => sub { push @{$sharednames{$1}}, tokenize($2)
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001463 if !@skip || $skip[$#skip] > 0 },
1464 qr/^\s*BEGINRAW\[((?:\\.|[^\\\]])+)\]\s*$/
1465 => sub {
1466 my $lineiterator = shift;
1467 my $target_kind = $1;
1468 while (defined $lineiterator->()) {
Richard Levitte04f171c2016-02-12 12:10:27 +01001469 s|\R$||;
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001470 if (/^\s*ENDRAW\[((?:\\.|[^\\\]])+)\]\s*$/) {
1471 die "ENDRAW doesn't match BEGINRAW"
1472 if $1 ne $target_kind;
1473 last;
1474 }
1475 next if @skip && $skip[$#skip] <= 0;
1476 push @rawlines, $_
1477 if ($target_kind eq $target{build_file}
Richard Levitteddf18472016-01-30 00:57:33 +01001478 || $target_kind eq $target{build_file}."(".$builder_platform.")");
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001479 }
1480 },
1481 qr/^(?:#.*|\s*)$/ => sub { },
Richard Levitte2b6b6062016-03-10 00:04:04 +01001482 "OTHERWISE" => sub { die "Something wrong with this line:\n$_\nat $sourced/$f" },
1483 "BEFORE" => sub {
1484 if ($buildinfo_debug) {
1485 print STDERR "DEBUG: Parsing ",join(" ", @_),"\n";
1486 print STDERR "DEBUG: ... before parsing, skip stack is ",join(" ", map { int($_) } @skip),"\n";
1487 }
1488 },
1489 "AFTER" => sub {
1490 if ($buildinfo_debug) {
1491 print STDERR "DEBUG: .... after parsing, skip stack is ",join(" ", map { int($_) } @skip),"\n";
1492 }
1493 },
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001494 );
1495 die "runaway IF?" if (@skip);
1496
1497 foreach (keys %renames) {
1498 die "$_ renamed to more than one thing: "
1499 ,join(" ", @{$renames{$_}}),"\n"
1500 if scalar @{$renames{$_}} > 1;
Richard Levitte2e963842016-02-10 02:00:37 +01001501 my $dest = cleanfile($buildd, $_, $blddir);
1502 my $to = cleanfile($buildd, $renames{$_}->[0], $blddir);
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001503 die "$dest renamed to more than one thing: "
1504 ,$unified_info{rename}->{$dest}, $to
1505 unless !defined($unified_info{rename}->{$dest})
1506 or $unified_info{rename}->{$dest} eq $to;
1507 $unified_info{rename}->{$dest} = $to;
1508 }
1509
1510 foreach (@programs) {
Richard Levitte2e963842016-02-10 02:00:37 +01001511 my $program = cleanfile($buildd, $_, $blddir);
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001512 if ($unified_info{rename}->{$program}) {
1513 $program = $unified_info{rename}->{$program};
1514 }
1515 $unified_info{programs}->{$program} = 1;
1516 }
1517
1518 foreach (@libraries) {
Richard Levitte2e963842016-02-10 02:00:37 +01001519 my $library = cleanfile($buildd, $_, $blddir);
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001520 if ($unified_info{rename}->{$library}) {
1521 $library = $unified_info{rename}->{$library};
1522 }
1523 $unified_info{libraries}->{$library} = 1;
1524 }
1525
Richard Levitte343ec2b2016-02-19 22:08:37 +01001526 die <<"EOF" if scalar @engines and !$config{dynamic_engines};
Richard Levitte19ab5792016-02-22 02:06:05 +01001527ENGINES can only be used if configured with 'dynamic-engine'.
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001528This is usually a fault in a build.info file.
1529EOF
1530 foreach (@engines) {
Richard Levitte2e963842016-02-10 02:00:37 +01001531 my $library = cleanfile($buildd, $_, $blddir);
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001532 if ($unified_info{rename}->{$library}) {
1533 $library = $unified_info{rename}->{$library};
1534 }
1535 $unified_info{engines}->{$library} = 1;
1536 }
1537
1538 foreach (@scripts) {
Richard Levitte2e963842016-02-10 02:00:37 +01001539 my $script = cleanfile($buildd, $_, $blddir);
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001540 if ($unified_info{rename}->{$script}) {
1541 $script = $unified_info{rename}->{$script};
1542 }
1543 $unified_info{scripts}->{$script} = 1;
1544 }
1545
1546 foreach (@extra) {
Richard Levitte2e963842016-02-10 02:00:37 +01001547 my $extra = cleanfile($buildd, $_, $blddir);
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001548 $unified_info{extra}->{$extra} = 1;
1549 }
1550
Richard Levitte8a679462016-03-07 14:50:37 +01001551 foreach (@overrides) {
1552 my $override = cleanfile($buildd, $_, $blddir);
1553 $unified_info{overrides}->{$override} = 1;
1554 }
1555
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001556 push @{$unified_info{rawlines}}, @rawlines;
1557
Richard Levitte84af1ba2016-02-22 13:52:46 +01001558 unless ($disabled{shared}) {
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001559 # Check sharednames.
1560 foreach (keys %sharednames) {
Richard Levitte2e963842016-02-10 02:00:37 +01001561 my $dest = cleanfile($buildd, $_, $blddir);
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001562 if ($unified_info{rename}->{$dest}) {
1563 $dest = $unified_info{rename}->{$dest};
1564 }
1565 die "shared_name for $dest with multiple values: "
1566 ,join(" ", @{$sharednames{$_}}),"\n"
1567 if scalar @{$sharednames{$_}} > 1;
Richard Levitte2e963842016-02-10 02:00:37 +01001568 my $to = cleanfile($buildd, $sharednames{$_}->[0], $blddir);
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001569 die "shared_name found for a library $dest that isn't defined\n"
1570 unless $unified_info{libraries}->{$dest};
1571 die "shared_name for $dest with multiple values: "
1572 ,$unified_info{sharednames}->{$dest}, ", ", $to
1573 unless !defined($unified_info{sharednames}->{$dest})
1574 or $unified_info{sharednames}->{$dest} eq $to;
1575 $unified_info{sharednames}->{$dest} = $to;
1576 }
1577
1578 # Additionally, we set up sharednames for libraries that don't
1579 # have any, as themselves.
1580 foreach (keys %{$unified_info{libraries}}) {
1581 if (!defined $unified_info{sharednames}->{$_}) {
1582 $unified_info{sharednames}->{$_} = $_
1583 }
1584 }
1585 }
1586
1587 foreach (keys %ordinals) {
1588 my $dest = $_;
Richard Levitte2e963842016-02-10 02:00:37 +01001589 my $ddest = cleanfile($buildd, $_, $blddir);
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001590 if ($unified_info{rename}->{$ddest}) {
1591 $ddest = $unified_info{rename}->{$ddest};
1592 }
1593 foreach (@{$ordinals{$dest}}) {
1594 my %known_ordinals =
1595 (
1596 crypto =>
Richard Levitte6928b612016-03-03 12:42:01 +01001597 cleanfile($sourced, catfile("util", "libcrypto.num"), $blddir),
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001598 ssl =>
Richard Levitte6928b612016-03-03 12:42:01 +01001599 cleanfile($sourced, catfile("util", "libssl.num"), $blddir)
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001600 );
1601 my $o = $known_ordinals{$_};
1602 die "Ordinals for $ddest defined more than once\n"
1603 if $unified_info{ordinals}->{$ddest};
1604 $unified_info{ordinals}->{$ddest} = [ $_, $o ];
1605 }
1606 }
1607
1608 foreach (keys %sources) {
1609 my $dest = $_;
Richard Levitte2e963842016-02-10 02:00:37 +01001610 my $ddest = cleanfile($buildd, $_, $blddir);
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001611 if ($unified_info{rename}->{$ddest}) {
1612 $ddest = $unified_info{rename}->{$ddest};
1613 }
1614 foreach (@{$sources{$dest}}) {
Richard Levitte2e963842016-02-10 02:00:37 +01001615 my $s = cleanfile($sourced, $_, $blddir);
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001616
1617 # If it isn't in the source tree, we assume it's generated
1618 # in the build tree
1619 if (! -f $s) {
Richard Levitte2e963842016-02-10 02:00:37 +01001620 $s = cleanfile($buildd, $_, $blddir);
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001621 }
1622 # We recognise C and asm files
1623 if ($s =~ /\.[csS]\b$/) {
1624 (my $o = $_) =~ s/\.[csS]\b$/.o/;
Richard Levitte2e963842016-02-10 02:00:37 +01001625 $o = cleanfile($buildd, $o, $blddir);
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001626 $unified_info{sources}->{$ddest}->{$o} = 1;
1627 $unified_info{sources}->{$o}->{$s} = 1;
1628 } else {
1629 $unified_info{sources}->{$ddest}->{$s} = 1;
1630 }
1631 }
1632 }
1633
Richard Levitte2a08d1a2016-03-29 16:45:03 +02001634 foreach (keys %shared_sources) {
1635 my $dest = $_;
1636 my $ddest = cleanfile($buildd, $_, $blddir);
1637 if ($unified_info{rename}->{$ddest}) {
1638 $ddest = $unified_info{rename}->{$ddest};
1639 }
1640 foreach (@{$shared_sources{$dest}}) {
1641 my $s = cleanfile($sourced, $_, $blddir);
1642
1643 # If it isn't in the source tree, we assume it's generated
1644 # in the build tree
1645 if (! -f $s) {
1646 $s = cleanfile($buildd, $_, $blddir);
1647 }
1648 # We recognise C and asm files
1649 if ($s =~ /\.[csS]\b$/) {
1650 (my $o = $_) =~ s/\.[csS]\b$/.o/;
1651 $o = cleanfile($buildd, $o, $blddir);
1652 $unified_info{shared_sources}->{$ddest}->{$o} = 1;
1653 $unified_info{sources}->{$o}->{$s} = 1;
1654 } else {
1655 die "unrecognised source file type for shared library: $s\n";
1656 }
1657 }
1658 }
1659
Richard Levitteae4c7452016-03-07 14:37:00 +01001660 foreach (keys %generate) {
1661 my $dest = $_;
1662 my $ddest = cleanfile($buildd, $_, $blddir);
1663 if ($unified_info{rename}->{$ddest}) {
1664 $ddest = $unified_info{rename}->{$ddest};
1665 }
1666 die "more than one generator for $dest: "
1667 ,join(" ", @{$generate{$_}}),"\n"
1668 if scalar @{$generate{$_}} > 1;
1669 my @generator = split /\s+/, $generate{$dest}->[0];
1670 $generator[0] = cleanfile($sourced, $generator[0], $blddir),
1671 $unified_info{generate}->{$ddest} = [ @generator ];
1672 }
1673
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001674 foreach (keys %depends) {
1675 my $dest = $_;
Richard Levitte8d34daf2016-04-21 14:30:08 +02001676 my $ddest = cleanfile($sourced, $_, $blddir);
1677
1678 # If the destination doesn't exist in source, it can only be
1679 # a generated file in the build tree.
1680 if (! -f $ddest) {
1681 $ddest = cleanfile($buildd, $_, $blddir);
1682 if ($unified_info{rename}->{$ddest}) {
1683 $ddest = $unified_info{rename}->{$ddest};
1684 }
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001685 }
1686 foreach (@{$depends{$dest}}) {
Richard Levitte2e963842016-02-10 02:00:37 +01001687 my $d = cleanfile($sourced, $_, $blddir);
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001688
Richard Levittee737d7b2016-02-11 15:22:27 +01001689 # If we know it's generated, or assume it is because we can't
1690 # find it in the source tree, we set file we depend on to be
1691 # in the build tree rather than the source tree, and assume
1692 # and that there are lines to build it in a BEGINRAW..ENDRAW
1693 # section or in the Makefile template.
1694 if (! -f $d
Richard Levitteda1f2102016-03-19 01:29:01 +01001695 || (grep { $d eq $_ }
1696 map { cleanfile($srcdir, $_, $blddir) }
1697 (@generated_headers, @generated_by_make_headers))) {
Richard Levitte2e963842016-02-10 02:00:37 +01001698 $d = cleanfile($buildd, $_, $blddir);
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001699 }
1700 # Take note if the file to depend on is being renamed
1701 if ($unified_info{rename}->{$d}) {
1702 $d = $unified_info{rename}->{$d};
1703 }
1704 $unified_info{depends}->{$ddest}->{$d} = 1;
Richard Levitte8d34daf2016-04-21 14:30:08 +02001705 # If we depend on a header file or a perl module, let's make
1706 # sure it can get included
1707 if ($d =~ /\.(h|pm)$/) {
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001708 my $i = dirname($d);
1709 push @{$unified_info{includes}->{$ddest}}, $i
1710 unless grep { $_ eq $i } @{$unified_info{includes}->{$ddest}};
1711 }
1712 }
1713 }
1714
1715 foreach (keys %includes) {
1716 my $dest = $_;
Richard Levitte8d34daf2016-04-21 14:30:08 +02001717 my $ddest = cleanfile($sourced, $_, $blddir);
1718
1719 # If the destination doesn't exist in source, it can only be
1720 # a generated file in the build tree.
1721 if (! -f $ddest) {
1722 $ddest = cleanfile($buildd, $_, $blddir);
1723 if ($unified_info{rename}->{$ddest}) {
1724 $ddest = $unified_info{rename}->{$ddest};
1725 }
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001726 }
1727 foreach (@{$includes{$dest}}) {
Richard Levitte2e963842016-02-10 02:00:37 +01001728 my $i = cleandir($sourced, $_, $blddir);
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001729 push @{$unified_info{includes}->{$ddest}}, $i
1730 unless grep { $_ eq $i } @{$unified_info{includes}->{$ddest}};
1731 }
1732 }
1733 }
1734
1735 ### Make unified_info a bit more efficient
1736 # One level structures
Richard Levitte8a679462016-03-07 14:50:37 +01001737 foreach (("programs", "libraries", "engines", "scripts", "extra", "overrides")) {
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001738 $unified_info{$_} = [ sort keys %{$unified_info{$_}} ];
1739 }
1740 # Two level structures
Richard Levitte2a08d1a2016-03-29 16:45:03 +02001741 foreach my $l1 (("sources", "shared_sources", "ldadd", "depends")) {
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001742 foreach my $l2 (sort keys %{$unified_info{$l1}}) {
1743 $unified_info{$l1}->{$l2} =
1744 [ sort keys %{$unified_info{$l1}->{$l2}} ];
1745 }
1746 }
1747}
1748
1749# For the schemes that need it, we provide the old *_obj configs
1750# from the *_asm_obj ones
Richard Levitte3a55c922016-02-18 18:43:56 +01001751foreach (grep /_(asm|aux)_src$/, keys %target) {
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001752 my $src = $_;
Richard Levitte3a55c922016-02-18 18:43:56 +01001753 (my $obj = $_) =~ s/_(asm|aux)_src$/_obj/;
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001754 ($target{$obj} = $target{$src}) =~ s/\.[csS]\b/.o/g;
1755}
1756
Richard Levitte291e94d2015-05-18 22:35:23 +02001757# Write down our configuration where it fits #########################
1758
1759open(OUT,">configdata.pm") || die "unable to create configdata.pm: $!\n";
1760print OUT <<"EOF";
1761package configdata;
1762
1763use strict;
1764use warnings;
1765
1766use Exporter;
1767#use vars qw(\@ISA \@EXPORT);
1768our \@ISA = qw(Exporter);
Richard Levitte3850f8c2016-03-19 00:41:14 +01001769our \@EXPORT = qw(\%config \%target \%disabled \%withargs \%unified_info \@disablables);
Richard Levitte291e94d2015-05-18 22:35:23 +02001770
1771EOF
1772print OUT "our %config = (\n";
1773foreach (sort keys %config) {
1774 if (ref($config{$_}) eq "ARRAY") {
1775 print OUT " ", $_, " => [ ", join(", ",
1776 map { quotify("perl", $_) }
1777 @{$config{$_}}), " ],\n";
1778 } else {
1779 print OUT " ", $_, " => ", quotify("perl", $config{$_}), ",\n"
1780 }
1781}
1782print OUT <<"EOF";
1783);
1784
1785EOF
1786print OUT "our %target = (\n";
1787foreach (sort keys %target) {
1788 if (ref($target{$_}) eq "ARRAY") {
1789 print OUT " ", $_, " => [ ", join(", ",
1790 map { quotify("perl", $_) }
1791 @{$target{$_}}), " ],\n";
1792 } else {
1793 print OUT " ", $_, " => ", quotify("perl", $target{$_}), ",\n"
1794 }
1795}
1796print OUT <<"EOF";
1797);
1798
Richard Levitte107b5792015-05-20 20:03:20 +02001799EOF
Richard Levitte96d2d7b2016-01-26 02:09:33 +01001800print OUT "our \%available_protocols = (\n";
1801print OUT " tls => [ ", join(", ", map { quotify("perl", $_) } @tls), " ],\n";
1802print OUT " dtls => [ ", join(", ", map { quotify("perl", $_) } @dtls), " ],\n";
1803print OUT <<"EOF";
1804);
1805
1806EOF
Richard Levitte3850f8c2016-03-19 00:41:14 +01001807print OUT "our \@disablables = (\n";
1808foreach (@disablables) {
1809 print OUT " ", quotify("perl", $_), ",\n";
1810}
1811print OUT <<"EOF";
1812);
1813
1814EOF
Richard Levitte96d2d7b2016-01-26 02:09:33 +01001815print OUT "our \%disabled = (\n";
1816foreach (sort keys %disabled) {
1817 print OUT " ", quotify("perl", $_), " => ", quotify("perl", $disabled{$_}), ",\n";
1818}
1819print OUT <<"EOF";
1820);
1821
1822EOF
Richard Levitte107b5792015-05-20 20:03:20 +02001823print OUT "our %withargs = (\n";
1824foreach (sort keys %withargs) {
1825 if (ref($withargs{$_}) eq "ARRAY") {
1826 print OUT " ", $_, " => [ ", join(", ",
1827 map { quotify("perl", $_) }
1828 @{$withargs{$_}}), " ],\n";
1829 } else {
1830 print OUT " ", $_, " => ", quotify("perl", $withargs{$_}), ",\n"
1831 }
1832}
1833print OUT <<"EOF";
1834);
1835
Richard Levitte291e94d2015-05-18 22:35:23 +02001836EOF
Richard Levitteddf18472016-01-30 00:57:33 +01001837if ($builder eq "unified") {
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001838 my $recurse;
1839 $recurse = sub {
1840 my $indent = shift;
1841 foreach (@_) {
1842 if (ref $_ eq "ARRAY") {
1843 print OUT " "x$indent, "[\n";
1844 foreach (@$_) {
1845 $recurse->($indent + 4, $_);
1846 }
1847 print OUT " "x$indent, "],\n";
1848 } elsif (ref $_ eq "HASH") {
1849 my %h = %$_;
1850 print OUT " "x$indent, "{\n";
1851 foreach (sort keys %h) {
1852 if (ref $h{$_} eq "") {
1853 print OUT " "x($indent + 4), quotify("perl", $_), " => ", quotify("perl", $h{$_}), ",\n";
1854 } else {
1855 print OUT " "x($indent + 4), quotify("perl", $_), " =>\n";
1856 $recurse->($indent + 8, $h{$_});
1857 }
1858 }
1859 print OUT " "x$indent, "},\n";
1860 } else {
1861 print OUT " "x$indent, quotify("perl", $_), ",\n";
1862 }
1863 }
1864 };
1865 print OUT "our %unified_info = (\n";
1866 foreach (sort keys %unified_info) {
1867 if (ref $unified_info{$_} eq "") {
1868 print OUT " "x4, quotify("perl", $_), " => ", quotify("perl", $unified_info{$_}), ",\n";
1869 } else {
1870 print OUT " "x4, quotify("perl", $_), " =>\n";
1871 $recurse->(8, $unified_info{$_});
1872 }
1873 }
1874 print OUT <<"EOF";
1875);
1876
1877EOF
1878}
1879print OUT "1;\n";
Richard Levitte291e94d2015-05-18 22:35:23 +02001880close(OUT);
1881
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001882
Andy Polyakovf58a0ac2016-05-09 15:35:55 +02001883print "CC =$config{cross_compile_prefix}$target{cc}\n";
Richard Levitte2952b9b2016-03-02 10:57:05 +01001884print "CFLAG =$target{cflags} $config{cflags}\n";
Richard Levitte63ee71292016-03-04 15:41:42 +01001885print "SHARED_CFLAG =$target{shared_cflag}\n";
Richard Levitte2952b9b2016-03-02 10:57:05 +01001886print "DEFINES =",join(" ", @{$target{defines}}, @{$config{defines}}),"\n";
Richard Levitte940a09b2016-02-27 11:42:13 +01001887print "LFLAG =$target{lflags}\n";
1888print "PLIB_LFLAG =$target{plib_lflags}\n";
Richard Levitte2952b9b2016-03-02 10:57:05 +01001889print "EX_LIBS =$target{ex_libs} $config{ex_libs}\n";
Richard Levitteb7569672016-03-02 09:34:26 +01001890print "APPS_OBJ =$target{apps_obj}\n";
Richard Levitte291e94d2015-05-18 22:35:23 +02001891print "CPUID_OBJ =$target{cpuid_obj}\n";
Richard Levitteb7569672016-03-02 09:34:26 +01001892print "UPLINK_OBJ =$target{uplink_obj}\n";
Richard Levitte291e94d2015-05-18 22:35:23 +02001893print "BN_ASM =$target{bn_obj}\n";
1894print "EC_ASM =$target{ec_obj}\n";
1895print "DES_ENC =$target{des_obj}\n";
1896print "AES_ENC =$target{aes_obj}\n";
1897print "BF_ENC =$target{bf_obj}\n";
1898print "CAST_ENC =$target{cast_obj}\n";
1899print "RC4_ENC =$target{rc4_obj}\n";
1900print "RC5_ENC =$target{rc5_obj}\n";
1901print "MD5_OBJ_ASM =$target{md5_obj}\n";
1902print "SHA1_OBJ_ASM =$target{sha1_obj}\n";
1903print "RMD160_OBJ_ASM=$target{rmd160_obj}\n";
1904print "CMLL_ENC =$target{cmll_obj}\n";
1905print "MODES_OBJ =$target{modes_obj}\n";
Richard Levittef0bd4682016-01-25 21:51:22 +01001906print "PADLOCK_OBJ =$target{padlock_obj}\n";
Richard Levitte291e94d2015-05-18 22:35:23 +02001907print "CHACHA_ENC =$target{chacha_obj}\n";
1908print "POLY1305_OBJ =$target{poly1305_obj}\n";
Bill Cox2d0b4412016-03-09 23:08:31 +01001909print "BLAKE2_OBJ =$target{blake2_obj}\n";
Richard Levitte7d130f62015-05-19 01:40:54 +02001910print "PROCESSOR =$config{processor}\n";
Andy Polyakovf58a0ac2016-05-09 15:35:55 +02001911print "RANLIB =", $target{ranlib} eq '$(CROSS_COMPILE)ranlib' ?
1912 "$config{cross_compile_prefix}ranlib" :
1913 "$target{ranlib}", "\n";
Richard Levitte291e94d2015-05-18 22:35:23 +02001914print "ARFLAGS =$target{arflags}\n";
1915print "PERL =$config{perl}\n";
Richard Levittef0bd4682016-01-25 21:51:22 +01001916print "\n";
Richard Levitte7d130f62015-05-19 01:40:54 +02001917print "SIXTY_FOUR_BIT_LONG mode\n" if $config{b64l};
1918print "SIXTY_FOUR_BIT mode\n" if $config{b64};
1919print "THIRTY_TWO_BIT mode\n" if $config{b32};
Richard Levitte7d130f62015-05-19 01:40:54 +02001920print "BN_LLONG mode\n" if $config{bn_ll};
Richard Levitte01d99972016-03-14 10:02:13 +01001921print "RC4 uses $config{rc4_int}\n" if $config{rc4_int} ne $def_int;
Ben Lauriecba50681999-03-07 14:05:36 +00001922
Richard Levittee737d7b2016-02-11 15:22:27 +01001923for (@generated_headers) {
1924 mkpath(catdir($blddir, dirname($_)));
1925 run_dofile(catfile($blddir, $_),
1926 catfile($srcdir, $_.".in"));
Richard Levittef0bd4682016-01-25 21:51:22 +01001927}
1928
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001929###
1930### When the old "unixmake" scheme goes away, so does this function
1931###
1932sub build_Makefile {
1933 run_dofile("Makefile","Makefile.in");
1934
1935 # Copy all Makefile.in to Makefile (except top-level)
1936 use File::Find;
1937 use IO::File;
1938 find(
1939 {
1940 preprocess => sub {
1941 grep(!/^\./, @_);
1942 },
1943 wanted => sub {
1944 return if ($_ ne "Makefile.in" || $File::Find::dir eq ".");
1945 my $in = IO::File->new($_, "r") or
1946 die sprintf "Error reading Makefile.in in %s: !$\n",
1947 $File::Find::dir;
1948 my $out = IO::File->new("Makefile", "w") or
1949 die sprintf "Error writing Makefile in %s: !$\n",
1950 $File::Find::dir;
1951 print $out "# Generated from $_, do not edit\n";
1952 while (my $line = <$in>) { print $out $line }
1953 $in->close() or
1954 die sprintf "Error reading Makefile.in in %s: !$\n",
1955 $File::Find::dir;
1956 $out->close() or
1957 die sprintf "Error writing Makefile in %s: !$\n",
1958 $File::Find::dir;
1959 },
Richard Levittefb36ca12016-01-31 11:51:07 +01001960 },
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001961 ".");
1962}
Rich Salzd10dac12016-01-12 16:25:30 -05001963
Richard Levitte88087412015-05-18 14:31:49 +02001964my %builders = (
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001965 unified => sub {
Richard Levitteddf18472016-01-30 00:57:33 +01001966 run_dofile(catfile($blddir, $target{build_file}),
1967 $config{build_file_template},
1968 catfile($srcdir, "Configurations", "common.tmpl"));
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001969 },
Richard Levitte88087412015-05-18 14:31:49 +02001970 unixmake => sub {
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001971 build_Makefile();
1972
1973 run_dofile("util/domd", "util/domd.in");
1974 chmod 0755, "util/domd";
Richard Levitte88087412015-05-18 14:31:49 +02001975 },
Richard Levitte88087412015-05-18 14:31:49 +02001976 );
1977
Richard Levitteddf18472016-01-30 00:57:33 +01001978$builders{$builder}->($builder_platform, @builder_opts);
Felix Laurie von Massenbachfce0ba52014-05-26 17:19:28 +01001979
Richard Levitte76ffb432015-05-18 02:46:21 +02001980print <<"EOF";
Bodo Möller63d3f441999-09-09 20:21:10 +00001981
Ulf Möller89ec98e2000-02-01 01:35:29 +00001982Configured for $target.
Bodo Möller63d3f441999-09-09 20:21:10 +00001983EOF
Bodo Möller5f8d5c91999-04-29 16:10:09 +00001984
Richard Levitte9c62a272016-02-27 16:51:34 +01001985print <<"EOF" if ($disabled{threads} eq "unavailable");
Bodo Möller5f8d5c91999-04-29 16:10:09 +00001986
1987The library could not be configured for supporting multi-threaded
1988applications as the compiler options required on this system are not known.
Bodo Möllerff1b7e01999-06-26 21:25:01 +00001989See file INSTALL for details if you need multi-threading.
Bodo Möllerec577821999-04-23 22:13:45 +00001990EOF
1991
Richard Levitte76ffb432015-05-18 02:46:21 +02001992print <<"EOF" if ($no_shared_warn);
Richard Levitte2964ba82003-01-11 11:40:39 +00001993
Richard Levitteae482422016-02-22 02:09:11 +01001994The options 'shared', 'pic' and 'dynamic-engine' aren't supported on this
1995platform, so we will pretend you gave the option 'no-pic', which also disables
1996'shared' and 'dynamic-engine'. If you know how to implement shared libraries
1997or position independent code, please let us know (but please first make sure
1998you have tried with a current version of OpenSSL).
Rich Salz2e31ef02015-12-10 12:31:01 -05001999EOF
2000
Richard Levitteddc606c2016-04-21 18:03:16 +02002001print <<"EOF" if (-f catfile($srcdir, "configdata.pm") && $srcdir ne $blddir);
2002
2003WARNING: there are indications that another build was made in the source
2004directory. This build may have picked up artifacts from that build, the
2005safest course of action is to clean the source directory and redo this
2006configuration.
2007EOF
2008
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002009exit(0);
2010
Richard Levittebd5192b2015-05-18 02:57:24 +02002011######################################################################
2012#
2013# Helpers and utility functions
2014#
2015
2016# Configuration file reading #########################################
2017
Richard Levitte1f2e1cd2016-03-17 09:09:31 +01002018# Note: All of the helper functions are for lazy evaluation. They all
2019# return a CODE ref, which will return the intended value when evaluated.
2020# Thus, whenever there's mention of a returned value, it's about that
2021# intended value.
2022
Richard Levittebd5192b2015-05-18 02:57:24 +02002023# Helper function to implement conditional inheritance depending on the
Richard Levitte00b0d662016-02-22 14:10:45 +01002024# value of $disabled{asm}. Used in inherit_from values as follows:
Richard Levittebd5192b2015-05-18 02:57:24 +02002025#
2026# inherit_from => [ "template", asm("asm_tmpl") ]
2027#
2028sub asm {
2029 my @x = @_;
2030 sub {
Richard Levitte00b0d662016-02-22 14:10:45 +01002031 $disabled{asm} ? () : @x;
Richard Levittebd5192b2015-05-18 02:57:24 +02002032 }
2033}
2034
Richard Levitte1f2e1cd2016-03-17 09:09:31 +01002035# Helper function to implement conditional value variants, with a default
2036# plus additional values based on the value of $config{build_type}.
2037# Arguments are given in hash table form:
2038#
2039# picker(default => "Basic string: ",
2040# debug => "debug",
2041# release => "release")
2042#
2043# When configuring with --debug, the resulting string will be
2044# "Basic string: debug", and when not, it will be "Basic string: release"
2045#
2046# This can be used to create variants of sets of flags according to the
2047# build type:
2048#
2049# cflags => picker(default => "-Wall",
2050# debug => "-g -O0",
2051# release => "-O3")
2052#
2053sub picker {
2054 my %opts = @_;
2055 return sub { add($opts{default} || (),
2056 $opts{$config{build_type}} || ())->(); }
2057}
2058
2059# Helper function to combine several values of different types into one.
2060# This is useful if you want to combine a string with the result of a
2061# lazy function, such as:
2062#
2063# cflags => combine("-Wall", sub { $disabled{zlib} ? () : "-DZLIB" })
2064#
2065sub combine {
2066 my @stuff = @_;
2067 return sub { add(@stuff)->(); }
2068}
2069
2070# Helper function to implement conditional values depending on the value
2071# of $disabled{threads}. Can be used as follows:
2072#
2073# cflags => combine("-Wall", threads("-pthread"))
2074#
2075sub threads {
2076 my @flags = @_;
2077 return sub { add($disabled{threads} ? () : @flags)->(); }
2078}
2079
2080
2081
Richard Levitte9c62a272016-02-27 16:51:34 +01002082our $add_called = 0;
Richard Levitte88087412015-05-18 14:31:49 +02002083# Helper function to implement adding values to already existing configuration
2084# values. It handles elements that are ARRAYs, CODEs and scalars
2085sub _add {
2086 my $separator = shift;
2087
Richard Levittebcb19772016-01-30 02:17:05 +01002088 # If there's any ARRAY in the collection of values OR the separator
2089 # is undef, we will return an ARRAY of combined values, otherwise a
2090 # string of joined values with $separator as the separator.
2091 my $found_array = !defined($separator);
Richard Levitte88087412015-05-18 14:31:49 +02002092
2093 my @values =
2094 map {
Richard Levitteb0b92a52016-02-27 11:08:21 +01002095 my $res = $_;
2096 while (ref($res) eq "CODE") {
2097 $res = $res->();
2098 }
2099 if (defined($res)) {
2100 if (ref($res) eq "ARRAY") {
2101 $found_array = 1;
2102 @$res;
2103 } else {
2104 $res;
2105 }
Richard Levitte88087412015-05-18 14:31:49 +02002106 } else {
Richard Levitteb0b92a52016-02-27 11:08:21 +01002107 ();
Richard Levitte88087412015-05-18 14:31:49 +02002108 }
2109 } (@_);
2110
Richard Levitte9c62a272016-02-27 16:51:34 +01002111 $add_called = 1;
2112
Richard Levitte88087412015-05-18 14:31:49 +02002113 if ($found_array) {
2114 [ @values ];
2115 } else {
Richard Levitteb0b92a52016-02-27 11:08:21 +01002116 join($separator, grep { defined($_) && $_ ne "" } @values);
Richard Levitte88087412015-05-18 14:31:49 +02002117 }
2118}
2119sub add_before {
Richard Levittebdcd83e2016-02-25 00:17:59 +01002120 my $separator = " ";
2121 if (ref($_[$#_]) eq "HASH") {
2122 my $opts = pop;
2123 $separator = $opts->{separator};
2124 }
Richard Levitte88087412015-05-18 14:31:49 +02002125 my @x = @_;
2126 sub { _add($separator, @x, @_) };
2127}
2128sub add {
Richard Levittebdcd83e2016-02-25 00:17:59 +01002129 my $separator = " ";
2130 if (ref($_[$#_]) eq "HASH") {
2131 my $opts = pop;
2132 $separator = $opts->{separator};
2133 }
Richard Levitte88087412015-05-18 14:31:49 +02002134 my @x = @_;
2135 sub { _add($separator, @_, @x) };
2136}
2137
Richard Levittebd5192b2015-05-18 02:57:24 +02002138# configuration reader, evaluates the input file as a perl script and expects
2139# it to fill %targets with target configurations. Those are then added to
2140# %table.
2141sub read_config {
2142 my $fname = shift;
2143 open(CONFFILE, "< $fname")
2144 or die "Can't open configuration file '$fname'!\n";
2145 my $x = $/;
2146 undef $/;
2147 my $content = <CONFFILE>;
2148 $/ = $x;
2149 close(CONFFILE);
2150 my %targets = ();
2151 {
2152 local %table = %::table; # Protect %table from tampering
2153
2154 eval $content;
2155 warn $@ if $@;
2156 }
2157
2158 # For each target, check that it's configured with a hash table.
2159 foreach (keys %targets) {
2160 if (ref($targets{$_}) ne "HASH") {
2161 if (ref($targets{$_}) eq "") {
2162 warn "Deprecated target configuration for $_, ignoring...\n";
2163 } else {
2164 warn "Misconfigured target configuration for $_ (should be a hash table), ignoring...\n";
2165 }
2166 delete $targets{$_};
2167 }
2168 }
2169
2170 %table = (%table, %targets);
2171
2172}
2173
FdaSilvaYY8483a002016-03-10 21:34:48 +01002174# configuration resolver. Will only resolve all the lazy evaluation
2175# codeblocks for the chosen target and all those it inherits from,
Richard Levittebd5192b2015-05-18 02:57:24 +02002176# recursively
2177sub resolve_config {
2178 my $target = shift;
2179 my @breadcrumbs = @_;
2180
Richard Levittec4718842016-03-09 17:18:07 +01002181# my $extra_checks = defined($ENV{CONFIGURE_EXTRA_CHECKS});
Richard Levitte9c62a272016-02-27 16:51:34 +01002182
Richard Levittebd5192b2015-05-18 02:57:24 +02002183 if (grep { $_ eq $target } @breadcrumbs) {
2184 die "inherit_from loop! target backtrace:\n "
2185 ,$target,"\n ",join("\n ", @breadcrumbs),"\n";
2186 }
2187
2188 if (!defined($table{$target})) {
2189 warn "Warning! target $target doesn't exist!\n";
2190 return ();
2191 }
2192 # Recurse through all inheritances. They will be resolved on the
2193 # fly, so when this operation is done, they will all just be a
2194 # bunch of attributes with string values.
2195 # What we get here, though, are keys with references to lists of
2196 # the combined values of them all. We will deal with lists after
2197 # this stage is done.
2198 my %combined_inheritance = ();
2199 if ($table{$target}->{inherit_from}) {
2200 my @inherit_from =
2201 map { ref($_) eq "CODE" ? $_->() : $_ } @{$table{$target}->{inherit_from}};
2202 foreach (@inherit_from) {
2203 my %inherited_config = resolve_config($_, $target, @breadcrumbs);
2204
2205 # 'template' is a marker that's considered private to
2206 # the config that had it.
2207 delete $inherited_config{template};
2208
Richard Levitte2110feb2016-04-06 15:02:57 +02002209 foreach (keys %inherited_config) {
Richard Levittebd5192b2015-05-18 02:57:24 +02002210 if (!$combined_inheritance{$_}) {
2211 $combined_inheritance{$_} = [];
2212 }
2213 push @{$combined_inheritance{$_}}, $inherited_config{$_};
Richard Levitte2110feb2016-04-06 15:02:57 +02002214 }
Richard Levittebd5192b2015-05-18 02:57:24 +02002215 }
2216 }
2217
2218 # We won't need inherit_from in this target any more, since we've
2219 # resolved all the inheritances that lead to this
2220 delete $table{$target}->{inherit_from};
2221
2222 # Now is the time to deal with those lists. Here's the place to
2223 # decide what shall be done with those lists, all based on the
2224 # values of the target we're currently dealing with.
2225 # - If a value is a coderef, it will be executed with the list of
2226 # inherited values as arguments.
2227 # - If the corresponding key doesn't have a value at all or is the
FdaSilvaYY8483a002016-03-10 21:34:48 +01002228 # empty string, the inherited value list will be run through the
Richard Levittebd5192b2015-05-18 02:57:24 +02002229 # default combiner (below), and the result becomes this target's
2230 # value.
2231 # - Otherwise, this target's value is assumed to be a string that
2232 # will simply override the inherited list of values.
Richard Levittea26d8be2016-02-26 12:25:13 +01002233 my $default_combiner = add();
Richard Levittebd5192b2015-05-18 02:57:24 +02002234
2235 my %all_keys =
2236 map { $_ => 1 } (keys %combined_inheritance,
2237 keys %{$table{$target}});
Richard Levitteb0b92a52016-02-27 11:08:21 +01002238
2239 sub process_values {
2240 my $object = shift;
2241 my $inherited = shift; # Always a [ list ]
2242 my $target = shift;
2243 my $entry = shift;
2244
Richard Levitte9c62a272016-02-27 16:51:34 +01002245 $add_called = 0;
2246
Richard Levitteb0b92a52016-02-27 11:08:21 +01002247 while(ref($object) eq "CODE") {
2248 $object = $object->(@$inherited);
2249 }
2250 if (!defined($object)) {
2251 return ();
2252 }
2253 elsif (ref($object) eq "ARRAY") {
Richard Levitte9c62a272016-02-27 16:51:34 +01002254 local $add_called; # To make sure recursive calls don't affect it
Richard Levitteb0b92a52016-02-27 11:08:21 +01002255 return [ map { process_values($_, $inherited, $target, $entry) }
2256 @$object ];
2257 } elsif (ref($object) eq "") {
2258 return $object;
2259 } else {
2260 die "cannot handle reference type ",ref($object)
2261 ," found in target ",$target," -> ",$entry,"\n";
2262 }
2263 }
2264
Richard Levittebd5192b2015-05-18 02:57:24 +02002265 foreach (sort keys %all_keys) {
Richard Levitte9c62a272016-02-27 16:51:34 +01002266 my $previous = $combined_inheritance{$_};
Richard Levittebd5192b2015-05-18 02:57:24 +02002267
2268 # Current target doesn't have a value for the current key?
2269 # Assign it the default combiner, the rest of this loop body
2270 # will handle it just like any other coderef.
2271 if (!exists $table{$target}->{$_}) {
2272 $table{$target}->{$_} = $default_combiner;
2273 }
2274
Richard Levitteb0b92a52016-02-27 11:08:21 +01002275 $table{$target}->{$_} = process_values($table{$target}->{$_},
2276 $combined_inheritance{$_},
2277 $target, $_);
2278 unless(defined($table{$target}->{$_})) {
2279 delete $table{$target}->{$_};
2280 }
Richard Levittec4718842016-03-09 17:18:07 +01002281# if ($extra_checks &&
2282# $previous && !($add_called || $previous ~~ $table{$target}->{$_})) {
2283# warn "$_ got replaced in $target\n";
2284# }
Richard Levittebd5192b2015-05-18 02:57:24 +02002285 }
2286
2287 # Finally done, return the result.
2288 return %{$table{$target}};
2289}
2290
Ulf Möller462ba4f1999-04-24 22:59:36 +00002291sub usage
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002292 {
Ulf Möller462ba4f1999-04-24 22:59:36 +00002293 print STDERR $usage;
Ulf Möller10a926c2000-02-21 00:55:45 +00002294 print STDERR "\npick os/compiler from:\n";
Ben Laurie1641cb61998-12-28 17:08:48 +00002295 my $j=0;
Ben Laurie6457ad11999-02-07 18:22:15 +00002296 my $i;
Ulf Möller10a926c2000-02-21 00:55:45 +00002297 my $k=0;
Ben Laurie6457ad11999-02-07 18:22:15 +00002298 foreach $i (sort keys %table)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002299 {
Richard Levittebd5192b2015-05-18 02:57:24 +02002300 next if $table{$i}->{template};
Ulf Möller462ba4f1999-04-24 22:59:36 +00002301 next if $i =~ /^debug/;
Ulf Möller10a926c2000-02-21 00:55:45 +00002302 $k += length($i) + 1;
2303 if ($k > 78)
2304 {
2305 print STDERR "\n";
2306 $k=length($i);
2307 }
2308 print STDERR $i . " ";
Ulf Möller462ba4f1999-04-24 22:59:36 +00002309 }
2310 foreach $i (sort keys %table)
2311 {
Richard Levittebd5192b2015-05-18 02:57:24 +02002312 next if $table{$i}->{template};
Ulf Möller462ba4f1999-04-24 22:59:36 +00002313 next if $i !~ /^debug/;
Ulf Möller10a926c2000-02-21 00:55:45 +00002314 $k += length($i) + 1;
2315 if ($k > 78)
2316 {
2317 print STDERR "\n";
2318 $k=length($i);
2319 }
2320 print STDERR $i . " ";
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002321 }
Ulf Möller10a926c2000-02-21 00:55:45 +00002322 print STDERR "\n\nNOTE: If in doubt, on Unix-ish systems use './config'.\n";
Ulf Möller462ba4f1999-04-24 22:59:36 +00002323 exit(1);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002324 }
2325
Richard Levitte01d99972016-03-14 10:02:13 +01002326sub run_dofile
Richard Levitte107b5792015-05-20 20:03:20 +02002327{
Richard Levitte107b5792015-05-20 20:03:20 +02002328 my $out = shift;
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002329 my @templates = @_;
Richard Levitte107b5792015-05-20 20:03:20 +02002330
Rich Salzced2c2c2016-01-29 13:29:45 -05002331 unlink $out || warn "Can't remove $out, $!"
2332 if -f $out;
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002333 foreach (@templates) {
2334 die "Can't open $_, $!" unless -f $_;
2335 }
Richard Levittea3a08f82016-05-25 11:57:23 +02002336 my $cmd = "$config{perl} \"-I.\" \"-Mconfigdata\" \"$dofile\" -o\"Configure\" \"".join("\" \"",@templates)."\" > \"$out.new\"";
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002337 #print STDERR "DEBUG[run_dofile]: \$cmd = $cmd\n";
2338 system($cmd);
Richard Levitte107b5792015-05-20 20:03:20 +02002339 exit 1 if $? != 0;
2340 rename("$out.new", $out) || die "Can't rename $out.new, $!";
2341}
2342
Andy Polyakov656bbdc2016-05-20 21:31:11 +02002343sub which
2344{
2345 my ($name)=@_;
2346
2347 if (eval { require IPC::Cmd; 1; }) {
2348 IPC::Cmd->import();
2349 return scalar IPC::Cmd::can_run($name);
2350 } else {
2351 # if there is $directories component in splitpath,
2352 # then it's not something to test with $PATH...
2353 return $name if (File::Spec->splitpath($name))[1];
2354
2355 foreach (File::Spec->path()) {
2356 my $fullpath = catfile($_, "$name$target{exe_extension}");
2357 if (-f $fullpath and -x $fullpath) {
2358 return $fullpath;
2359 }
2360 }
2361 }
2362}
2363
Richard Levitte00ae96c2015-05-18 12:53:38 +02002364# Configuration printer ##############################################
2365
2366sub print_table_entry
2367{
2368 my $target = shift;
2369 my %target = resolve_config($target);
2370 my $type = shift;
2371
2372 # Don't print the templates
2373 return if $target{template};
2374
2375 my @sequence = (
Richard Levittef0bd4682016-01-25 21:51:22 +01002376 "sys_id",
Richard Levitte00ae96c2015-05-18 12:53:38 +02002377 "cc",
2378 "cflags",
Richard Levittebcb19772016-01-30 02:17:05 +01002379 "defines",
Richard Levittef0bd4682016-01-25 21:51:22 +01002380 "unistd",
2381 "ld",
Richard Levitte00ae96c2015-05-18 12:53:38 +02002382 "lflags",
Richard Levittec86ddbe2016-02-05 11:47:14 +01002383 "plib_lflags",
Richard Levitte1740c162016-01-29 18:07:37 +01002384 "ex_libs",
Richard Levitte00ae96c2015-05-18 12:53:38 +02002385 "bn_ops",
2386 "cpuid_obj",
2387 "bn_obj",
2388 "ec_obj",
2389 "des_obj",
2390 "aes_obj",
2391 "bf_obj",
2392 "md5_obj",
2393 "sha1_obj",
2394 "cast_obj",
2395 "rc4_obj",
2396 "rmd160_obj",
2397 "rc5_obj",
2398 "wp_obj",
2399 "cmll_obj",
2400 "modes_obj",
Richard Levittef0bd4682016-01-25 21:51:22 +01002401 "padlock_obj",
Richard Levitte9c62a272016-02-27 16:51:34 +01002402 "thread_scheme",
Richard Levitte00ae96c2015-05-18 12:53:38 +02002403 "perlasm_scheme",
2404 "dso_scheme",
2405 "shared_target",
2406 "shared_cflag",
2407 "shared_ldflag",
Richard Levitte64c443e2016-02-05 15:17:33 +01002408 "shared_rcflag",
Richard Levitte00ae96c2015-05-18 12:53:38 +02002409 "shared_extension",
Richard Levittee987f9f2016-02-15 17:20:15 +01002410 "shared_extension_simple",
2411 "shared_import_extension",
2412 "dso_extension",
Richard Levittef0bd4682016-01-25 21:51:22 +01002413 "obj_extension",
2414 "exe_extension",
Richard Levitte00ae96c2015-05-18 12:53:38 +02002415 "ranlib",
Richard Levittef0bd4682016-01-25 21:51:22 +01002416 "ar",
Richard Levitte00ae96c2015-05-18 12:53:38 +02002417 "arflags",
2418 "multilib",
Richard Levittef0bd4682016-01-25 21:51:22 +01002419 "build_scheme",
Richard Levitte00ae96c2015-05-18 12:53:38 +02002420 );
2421
2422 if ($type eq "TABLE") {
2423 print "\n";
2424 print "*** $target\n";
Richard Levittecb212f22016-02-24 01:32:51 +01002425 foreach (@sequence) {
2426 if (ref($target{$_}) eq "ARRAY") {
2427 printf "\$%-12s = %s\n", $_, join(" ", @{$target{$_}});
2428 } else {
2429 printf "\$%-12s = %s\n", $_, $target{$_};
2430 }
2431 }
Richard Levitte00ae96c2015-05-18 12:53:38 +02002432 } elsif ($type eq "HASH") {
2433 my $largest =
2434 length((sort { length($a) <=> length($b) } @sequence)[-1]);
2435 print " '$target' => {\n";
2436 foreach (@sequence) {
2437 if ($target{$_}) {
Richard Levittecb212f22016-02-24 01:32:51 +01002438 if (ref($target{$_}) eq "ARRAY") {
2439 print " '",$_,"'"," " x ($largest - length($_))," => [ ",join(", ", map { "'$_'" } @{$target{$_}})," ],\n";
2440 } else {
2441 print " '",$_,"'"," " x ($largest - length($_))," => '",$target{$_},"',\n";
2442 }
Richard Levitte00ae96c2015-05-18 12:53:38 +02002443 }
2444 }
2445 print " },\n";
2446 }
2447}
2448
2449# Utility routines ###################################################
2450
Richard Levitte2e963842016-02-10 02:00:37 +01002451# On VMS, if the given file is a logical name, File::Spec::Functions
2452# will consider it an absolute path. There are cases when we want a
2453# purely syntactic check without checking the environment.
2454sub isabsolute {
2455 my $file = shift;
2456
2457 # On non-platforms, we just use file_name_is_absolute().
2458 return file_name_is_absolute($file) unless $^O eq "VMS";
2459
2460 # If the file spec includes a device or a directpry spec,
2461 # file_name_is_absolute() is perfectly safe.
2462 return file_name_is_absolute($file) if $file =~ m|[:\[]|;
2463
2464 # Here, we know the given file spec isn't absolute
2465 return 0;
2466}
2467
Richard Levitteec182ef2016-02-09 10:15:13 +01002468# Makes a directory absolute and cleans out /../ in paths like foo/../bar
2469# On some platforms, this uses rel2abs(), while on others, realpath() is used.
2470# realpath() requires that at least all path components except the last is an
2471# existing directory. On VMS, the last component of the directory spec must
2472# exist.
2473sub absolutedir {
2474 my $dir = shift;
2475
2476 # realpath() is quite buggy on VMS. It uses LIB$FID_TO_NAME, which
2477 # will return the volume name for the device, no matter what. Also,
2478 # it will return an incorrect directory spec if the argument is a
2479 # directory that doesn't exist.
2480 if ($^O eq "VMS") {
2481 return rel2abs($dir);
2482 }
2483
2484 # We use realpath() on Unix, since no other will properly clean out
2485 # a directory spec.
2486 use Cwd qw/realpath/;
2487
2488 return realpath($dir);
2489}
2490
Richard Levittefe052642015-05-18 03:33:55 +02002491sub quotify {
2492 my %processors = (
2493 perl => sub { my $x = shift;
2494 $x =~ s/([\\\$\@"])/\\$1/g;
2495 return '"'.$x.'"'; },
2496 );
2497 my $for = shift;
2498 my $processor =
2499 defined($processors{$for}) ? $processors{$for} : sub { shift; };
2500
Richard Levitte2110feb2016-04-06 15:02:57 +02002501 return map { $processor->($_); } @_;
Richard Levittefe052642015-05-18 03:33:55 +02002502}
Richard Levitte107b5792015-05-20 20:03:20 +02002503
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002504# collect_from_file($filename, $line_concat_cond_re, $line_concat)
2505# $filename is a file name to read from
2506# $line_concat_cond_re is a regexp detecting a line continuation ending
2507# $line_concat is a CODEref that takes care of concatenating two lines
2508sub collect_from_file {
2509 my $filename = shift;
2510 my $line_concat_cond_re = shift;
2511 my $line_concat = shift;
2512
2513 open my $fh, $filename || die "unable to read $filename: $!\n";
2514 return sub {
2515 my $saved_line = "";
2516 $_ = "";
2517 while (<$fh>) {
Richard Levitte04f171c2016-02-12 12:10:27 +01002518 s|\R$||;
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002519 if (defined $line_concat) {
2520 $_ = $line_concat->($saved_line, $_);
2521 $saved_line = "";
2522 }
2523 if (defined $line_concat_cond_re && /$line_concat_cond_re/) {
2524 $saved_line = $_;
2525 next;
2526 }
2527 return $_;
2528 }
2529 die "$filename ending with continuation line\n" if $_;
2530 close $fh;
2531 return undef;
2532 }
2533}
2534
2535# collect_from_array($array, $line_concat_cond_re, $line_concat)
2536# $array is an ARRAYref of lines
2537# $line_concat_cond_re is a regexp detecting a line continuation ending
2538# $line_concat is a CODEref that takes care of concatenating two lines
2539sub collect_from_array {
2540 my $array = shift;
2541 my $line_concat_cond_re = shift;
2542 my $line_concat = shift;
2543 my @array = (@$array);
2544
2545 return sub {
2546 my $saved_line = "";
2547 $_ = "";
2548 while (defined($_ = shift @array)) {
Richard Levitte04f171c2016-02-12 12:10:27 +01002549 s|\R$||;
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002550 if (defined $line_concat) {
2551 $_ = $line_concat->($saved_line, $_);
2552 $saved_line = "";
2553 }
2554 if (defined $line_concat_cond_re && /$line_concat_cond_re/) {
2555 $saved_line = $_;
2556 next;
2557 }
2558 return $_;
2559 }
2560 die "input text ending with continuation line\n" if $_;
2561 return undef;
2562 }
2563}
2564
2565# collect_information($lineiterator, $line_continue, $regexp => $CODEref, ...)
2566# $lineiterator is a CODEref that delivers one line at a time.
Richard Levitte107b5792015-05-20 20:03:20 +02002567# All following arguments are regex/CODEref pairs, where the regexp detects a
2568# line and the CODEref does something with the result of the regexp.
2569sub collect_information {
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002570 my $lineiterator = shift;
Richard Levitte107b5792015-05-20 20:03:20 +02002571 my %collectors = @_;
2572
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002573 while(defined($_ = $lineiterator->())) {
Richard Levitte04f171c2016-02-12 12:10:27 +01002574 s|\R$||;
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002575 my $found = 0;
Richard Levitte2b6b6062016-03-10 00:04:04 +01002576 if ($collectors{"BEFORE"}) {
2577 $collectors{"BEFORE"}->($_);
2578 }
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002579 foreach my $re (keys %collectors) {
Richard Levitte2b6b6062016-03-10 00:04:04 +01002580 if ($re !~ /^OTHERWISE|BEFORE|AFTER$/ && /$re/) {
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002581 $collectors{$re}->($lineiterator);
2582 $found = 1;
2583 };
2584 }
2585 if ($collectors{"OTHERWISE"}) {
2586 $collectors{"OTHERWISE"}->($lineiterator, $_)
2587 unless $found || !defined $collectors{"OTHERWISE"};
2588 }
Richard Levitte2b6b6062016-03-10 00:04:04 +01002589 if ($collectors{"AFTER"}) {
2590 $collectors{"AFTER"}->($_);
2591 }
Richard Levitte107b5792015-05-20 20:03:20 +02002592 }
Richard Levitte107b5792015-05-20 20:03:20 +02002593}
Richard Levittece959812016-05-24 17:39:52 +02002594
2595# tokenize($line)
2596# $line is a line of text to split up into tokens
2597# returns a list of tokens
2598#
2599# Tokens are divided by spaces. If the tokens include spaces, they
2600# have to be quoted with single or double quotes. Double quotes
2601# inside a double quoted token must be escaped. Escaping is done
2602# with backslash.
2603# Basically, the same quoting rules apply for " and ' as in any
2604# Unix shell.
2605sub tokenize {
2606 my $line = my $debug_line = shift;
2607 my @result = ();
2608
2609 while ($line =~ s|^\s+||, $line ne "") {
2610 my $token = "";
2611 while ($line ne "" && $line !~ m|^\s|) {
2612 if ($line =~ m/^"((?:[^"\\]+|\\.)*)"/) {
2613 $token .= $1;
2614 $line = $';
2615 } elsif ($line =~ m/^'([^']*)'/) {
2616 $token .= $1;
2617 $line = $';
2618 } elsif ($line =~ m/^(\S+)/) {
2619 $token .= $1;
2620 $line = $';
2621 }
2622 }
2623 push @result, $token;
2624 }
2625
2626 if ($ENV{CONFIGURE_DEBUG_TOKENIZE}) {
2627 print STDERR "DEBUG[tokenize]: Parsed '$debug_line' into:\n";
2628 print STDERR "DEBUG[tokenize]: ('", join("', '", @result), "')\n";
2629 }
2630 return @result;
2631}