blob: eeb88f6618a7478e03dbc31eca46c18732f332aa [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; -*-
Matt Caswell33388b42020-04-23 13:55:52 +01003# Copyright 2016-2020 The OpenSSL Project Authors. All Rights Reserved.
Rich Salzac3d0e12016-04-20 10:20:59 -04004#
Richard Levitte402dd552018-12-06 14:08:43 +01005# Licensed under the Apache License 2.0 (the "License"). You may not use
Rich Salzac3d0e12016-04-20 10:20:59 -04006# 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
Andy Polyakovd83112b2017-03-31 14:37:10 +020012use 5.10.0;
Ben Laurie1641cb61998-12-28 17:08:48 +000013use strict;
Rich Salz141d7322016-09-06 12:26:38 -040014use Config;
Richard Levittecb6afcd2017-08-01 22:10:39 +020015use FindBin;
16use lib "$FindBin::Bin/util/perl";
Rich Salzf09e7ca2015-02-24 17:40:22 -050017use File::Basename;
Richard Levitte7f73eaf2018-11-03 15:03:59 +010018use File::Spec::Functions qw/:DEFAULT abs2rel rel2abs splitdir/;
Richard Levittedca99382016-02-08 16:27:15 +010019use File::Path qw/mkpath/;
Richard Levitte1935a582019-09-09 11:51:01 +020020use OpenSSL::fallback "$FindBin::Bin/external/perl/MODULES.txt";
Richard Levitte8d2214c2017-08-01 22:43:56 +020021use OpenSSL::Glob;
Richard Levitte1f86b822019-08-25 10:46:22 +020022use OpenSSL::Template;
Richard Levittee39795a2020-03-03 00:01:35 +010023use OpenSSL::config;
Ben Laurie1641cb61998-12-28 17:08:48 +000024
Richard Levittef828ba02020-04-27 09:08:36 +020025# see INSTALL.md for instructions.
Ulf Möller462ba4f1999-04-24 22:59:36 +000026
Richard Levitte8937a4e2018-07-24 10:45:05 +020027my $orig_death_handler = $SIG{__DIE__};
28$SIG{__DIE__} = \&death_handler;
29
Richard Levitte31b6ed72019-03-31 16:15:02 +020030my $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-egd] [sctp] [386] [--prefix=DIR] [--openssldir=OPENSSLDIR] [--with-xxx[=vvv]] [--config=FILE] os/compiler[:flags]\n";
Ulf Möller462ba4f1999-04-24 22:59:36 +000031
Ulf Möller434c5dd1999-04-19 15:19:58 +000032# Options:
Bodo Möllere5f30451999-04-29 21:52:08 +000033#
Rich Salzf09e7ca2015-02-24 17:40:22 -050034# --config add the given configuration file, which will be read after
35# any "Configurations*" files that are found in the same
36# directory as this script.
Richard Levitted74dfaf2016-01-20 18:11:51 +010037# --prefix prefix for the OpenSSL installation, which includes the
38# directories bin, lib, include, share/man, share/doc/openssl
39# This becomes the value of INSTALLTOP in Makefile
40# (Default: /usr/local)
41# --openssldir OpenSSL data area, such as openssl.cnf, certificates and keys.
42# If it's a relative directory, it will be added on the directory
43# given with --prefix.
44# This becomes the value of OPENSSLDIR in Makefile and in C.
45# (Default: PREFIX/ssl)
Bodo Möllere5f30451999-04-29 21:52:08 +000046#
Andy Polyakovcbfb39d2006-10-21 13:38:16 +000047# --cross-compile-prefix Add specified prefix to binutils components.
48#
Richard Levittea6a4d0a2019-11-05 17:00:33 +010049# --api One of 0.9.8, 1.0.0, 1.0.1, 1.0.2, 1.1.0, 1.1.1, or 3.0
50# Define the public APIs as they were for that version
51# including patch releases. If 'no-deprecated' is also
52# given, do not compile support for interfaces deprecated
53# up to and including the specified OpenSSL version.
Viktor Dukhovni98186eb2016-01-04 23:00:33 -050054#
Richard Levitte5270e702000-10-26 21:07:28 +000055# no-hw-xxx do not compile support for specific crypto hardware.
56# Generic OpenSSL-style methods relating to this support
57# are always compiled but return NULL if the hardware
58# support isn't compiled.
59# no-hw do not compile support for any crypto hardware.
Bodo Möller5f8d5c91999-04-29 16:10:09 +000060# [no-]threads [don't] try to create a library that is suitable for
61# multithreaded applications (default is "threads" if we
62# know how to do it)
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +010063# [no-]shared [don't] try to create shared libraries when supported.
Richard Levitteae482422016-02-22 02:09:11 +010064# [no-]pic [don't] try to build position independent code when supported.
Richard Levitte45b71ab2016-02-22 15:57:25 +010065# If disabled, it also disables shared and dynamic-engine.
Ulf Möllera7239791999-04-19 14:55:56 +000066# no-asm do not use assembler
Benjamin Kaduk0423f812016-01-12 18:02:16 -060067# no-egd do not compile support for the entropy-gathering daemon APIs
Richard Levittee452de92001-07-12 09:11:14 +000068# [no-]zlib [don't] compile support for zlib compression.
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +010069# zlib-dynamic Like "zlib", but the zlib library is expected to be a shared
70# library and will be loaded in run-time by the OpenSSL library.
Dr. Stephen Henson7e159e02011-12-25 14:45:15 +000071# sctp include SCTP support
MouriNaruto5ded1ca2019-05-12 05:10:58 +080072# no-uplink Don't build support for UPLINK interface.
Matt Caswell8b1a5af2016-03-03 15:40:51 +000073# enable-weak-ssl-ciphers
Paul Yangedcdf382017-06-17 22:17:44 +080074# Enable weak ciphers that are disabled by default.
Andy Polyakov5ae5dc92016-11-20 21:52:41 +010075# 386 generate 80386 code in assembly modules
76# no-sse2 disables IA-32 SSE2 code in assembly modules, the above
77# mentioned '386' option implies this one
Ulf Möller79df9d61999-04-27 03:19:12 +000078# no-<cipher> build without specified algorithm (rsa, idea, rc5, ...)
Dr. Matthias St. Pierref246f542019-09-21 00:14:16 +020079# -<xxx> +<xxx> All options which are unknown to the 'Configure' script are
80# /<xxx> passed through to the compiler. Unix-style options beginning
81# with a '-' or '+' are recognized, as well as Windows-style
82# options beginning with a '/'. If the option contains arguments
83# separated by spaces, then the URL-style notation %20 can be
84# used for the space character in order to avoid having to quote
85# the option. For example, -opt%20arg gets expanded to -opt arg.
86# In fact, any ASCII character can be encoded as %xx using its
87# hexadecimal encoding.
Andy Polyakov047d97a2016-09-01 21:36:13 +020088# -static while -static is also a pass-through compiler option (and
89# as such is limited to environments where it's actually
90# meaningful), it triggers a number configuration options,
Richard Levitte31b6ed72019-03-31 16:15:02 +020091# namely no-pic, no-shared and no-threads. It is
Andy Polyakov047d97a2016-09-01 21:36:13 +020092# argued that the only reason to produce statically linked
93# binaries (and in context it means executables linked with
94# -static flag, and not just executables linked with static
95# libcrypto.a) is to eliminate dependency on specific run-time,
96# a.k.a. libc version. The mentioned config options are meant
97# to achieve just that. Unfortunately on Linux it's impossible
98# to eliminate the dependency completely for openssl executable
99# because of getaddrinfo and gethostbyname calls, which can
100# invoke dynamically loadable library facility anyway to meet
101# the lookup requests. For this reason on Linux statically
102# linked openssl executable has rather debugging value than
103# production quality.
Geoff Thorpee41c8d62000-06-01 05:13:52 +0000104#
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100105# BN_LLONG use the type 'long long' in crypto/bn/bn.h
106# RC4_CHAR use 'char' instead of 'int' for RC4_INT in crypto/rc4/rc4.h
Andy Polyakovd0590fe2004-07-18 16:19:34 +0000107# Following are set automatically by this script
108#
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100109# MD5_ASM use some extra md5 assembler,
110# SHA1_ASM use some extra sha1 assembler, must define L_ENDIAN for x86
111# RMD160_ASM use some extra ripemd160 assembler,
112# SHA256_ASM sha256_block is implemented in assembler
113# SHA512_ASM sha512_block is implemented in assembler
114# AES_ASM AES_[en|de]crypt is implemented in assembler
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000115
Richard Levitte3b437402019-05-27 14:40:25 +0200116# Minimum warning options... any contributions to OpenSSL should at least
117# get past these. Note that we only use these with C compilers, not with
118# C++ compilers.
Dr. Stephen Henson363bd0b2009-01-11 15:56:32 +0000119
Andy Polyakov463a7b82016-04-06 12:47:35 +0200120# DEBUG_UNUSED enables __owur (warn unused result) checks.
Rich Salz77305332017-01-30 16:13:41 -0500121# -DPEDANTIC complements -pedantic and is meant to mask code that
122# is not strictly standard-compliant and/or implementation-specific,
123# e.g. inline assembly, disregards to alignment requirements, such
124# that -pedantic would complain about. Incidentally -DPEDANTIC has
125# to be used even in sanitized builds, because sanitizer too is
126# supposed to and does take notice of non-standard behaviour. Then
127# -pedantic with pre-C9x compiler would also complain about 'long
128# long' not being supported. As 64-bit algorithms are common now,
129# it grew impossible to resolve this without sizeable additional
130# code, so we just tell compiler to be pedantic about everything
131# but 'long long' type.
132
Richard Levitte3b437402019-05-27 14:40:25 +0200133my @gcc_devteam_warn = qw(
134 -DDEBUG_UNUSED
135 -DPEDANTIC -pedantic -Wno-long-long
136 -Wall
137 -Wextra
138 -Wno-unused-parameter
139 -Wno-missing-field-initializers
140 -Wswitch
141 -Wsign-compare
142 -Wshadow
143 -Wformat
144 -Wtype-limits
145 -Wundef
146 -Werror
147 -Wmissing-prototypes
148 -Wstrict-prototypes
149);
Dr. Stephen Henson363bd0b2009-01-11 15:56:32 +0000150
Ben Laurie190c8c62015-04-19 14:10:54 +0100151# These are used in addition to $gcc_devteam_warn when the compiler is clang.
152# TODO(openssl-team): fix problems and investigate if (at least) the
Ben Laurie480405e2015-08-02 02:45:44 +0100153# following warnings can also be enabled:
Rich Salz8bccbce2016-02-13 12:27:11 -0500154# -Wcast-align
Rich Salz77305332017-01-30 16:13:41 -0500155# -Wunreachable-code -- no, too ugly/compiler-specific
Rich Salza773b522016-02-13 22:33:56 -0500156# -Wlanguage-extension-token -- no, we use asm()
157# -Wunused-macros -- no, too tricky for BN and _XOPEN_SOURCE etc
158# -Wextended-offsetof -- no, needed in CMS ASN1 code
Richard Levitte3b437402019-05-27 14:40:25 +0200159my @clang_devteam_warn = qw(
Dr. Matthias St. Pierre03e56682019-07-23 20:54:03 +0200160 -Wno-unknown-warning-option
Richard Levitte3b437402019-05-27 14:40:25 +0200161 -Wswitch-default
162 -Wno-parentheses-equality
163 -Wno-language-extension-token
164 -Wno-extended-offsetof
165 -Wconditional-uninitialized
166 -Wincompatible-pointer-types-discards-qualifiers
Richard Levitte3b437402019-05-27 14:40:25 +0200167 -Wmissing-variable-declarations
168);
Emilia Kaspercb2bc052015-01-05 13:46:26 +0100169
Richard Levitteb4a7b4e2019-10-29 13:37:54 +0100170my @cl_devteam_warn = qw(
171 /WX
172);
173
Dr. Stephen Henson0c28f272009-09-09 16:31:32 +0000174my $strict_warnings = 0;
175
Andy Polyakovb7efa562005-01-24 14:38:14 +0000176# As for $BSDthreads. Idea is to maintain "collective" set of flags,
Felix Laurie von Massenbachfce0ba52014-05-26 17:19:28 +0100177# which would cover all BSD flavors. -pthread applies to them all,
Andy Polyakovb7efa562005-01-24 14:38:14 +0000178# but is treated differently. OpenBSD expands is as -D_POSIX_THREAD
179# -lc_r, which is sufficient. FreeBSD 4.x expands it as -lc_r,
180# which has to be accompanied by explicit -D_THREAD_SAFE and
181# sometimes -D_REENTRANT. FreeBSD 5.x expands it as -lc_r, which
182# seems to be sufficient?
Richard Levitte9c62a272016-02-27 16:51:34 +0100183our $BSDthreads="-pthread -D_THREAD_SAFE -D_REENTRANT";
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000184
Viktor Dukhovni98186eb2016-01-04 23:00:33 -0500185#
FdaSilvaYYf430ba32016-06-19 19:39:01 +0200186# API compatibility name to version number mapping.
Viktor Dukhovni98186eb2016-01-04 23:00:33 -0500187#
Viktor Dukhovni98186eb2016-01-04 23:00:33 -0500188my $apitable = {
Richard Levittea6a4d0a2019-11-05 17:00:33 +0100189 # This table expresses when API additions or changes can occur.
190 # The numbering used changes from 3.0 and on because we updated
191 # (solidified) our version numbering scheme at that point.
192
Daniel Bevenius55affca2020-07-09 07:28:19 +0200193 # From 3.0 and on, we internalise the given version number in decimal
Richard Levittea6a4d0a2019-11-05 17:00:33 +0100194 # as MAJOR * 10000 + MINOR * 100 + 0
195 "3.0.0" => 30000,
196 "3.0" => 30000,
197
198 # Note that before 3.0, we didn't have the same version number scheme.
199 # Still, the numbering we use here covers what we need.
200 "1.1.1" => 10101,
201 "1.1.0" => 10100,
202 "1.0.2" => 10002,
203 "1.0.1" => 10001,
204 "1.0.0" => 10000,
205 "0.9.8" => 908,
Viktor Dukhovni98186eb2016-01-04 23:00:33 -0500206};
207
Richard Levitte18062612020-03-03 15:04:42 +0100208# For OpenSSL::config::get_platform
209my %guess_opts = ();
210
211my $dryrun = 0;
212
Richard Levitte9e0724a2015-05-18 02:54:28 +0200213our %table = ();
Richard Levitte291e94d2015-05-18 22:35:23 +0200214our %config = ();
Richard Levitte98fdbce2016-02-27 11:37:33 +0100215our %withargs = ();
Andy Polyakovf770d752018-03-26 12:35:57 +0200216our $now_printing; # set to current entry's name in print_table_entry
217 # (todo: right thing would be to encapsulate name
218 # into %target [class] and make print_table_entry
219 # a method)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000220
Richard Levittebd5192b2015-05-18 02:57:24 +0200221# Forward declarations ###############################################
Andy Polyakov7ead0c82015-03-16 22:33:36 +0100222
Richard Levittebd5192b2015-05-18 02:57:24 +0200223# read_config(filename)
224#
225# Reads a configuration file and populates %table with the contents
226# (which the configuration file places in %targets).
227sub read_config;
Andy Polyakov7ead0c82015-03-16 22:33:36 +0100228
Richard Levittebd5192b2015-05-18 02:57:24 +0200229# resolve_config(target)
230#
FdaSilvaYY8483a002016-03-10 21:34:48 +0100231# Resolves all the late evaluations, inheritances and so on for the
Richard Levittebd5192b2015-05-18 02:57:24 +0200232# chosen target and any target it inherits from.
233sub resolve_config;
Richard Levitteaaf878c2015-03-06 02:00:21 +0100234
Rich Salzf09e7ca2015-02-24 17:40:22 -0500235
Richard Levitte107b5792015-05-20 20:03:20 +0200236# Information collection #############################################
237
Richard Levitte9fe2bb72016-01-29 19:45:51 +0100238# Unified build supports separate build dir
Richard Levitteec182ef2016-02-09 10:15:13 +0100239my $srcdir = catdir(absolutedir(dirname($0))); # catdir ensures local syntax
240my $blddir = catdir(absolutedir(".")); # catdir ensures local syntax
Richard Levitte610e2b32020-07-01 10:06:59 +0200241
242# File::Spec::Unix doesn't detect case insensitivity, so we make sure to
243# check if the source and build directory are really the same, and make
244# them so. This avoids all kinds of confusion later on.
245# We must check @File::Spec::ISA rather than using File::Spec->isa() to
246# know if File::Spec ended up loading File::Spec::Unix.
247$srcdir = $blddir
248 if (grep(/::Unix$/, @File::Spec::ISA)
249 && samedir($srcdir, $blddir));
250
Richard Levitte9fe2bb72016-01-29 19:45:51 +0100251my $dofile = abs2rel(catfile($srcdir, "util/dofile.pl"));
252
Richard Levitteb5293d42016-05-02 16:50:51 +0200253my $local_config_envname = 'OPENSSL_LOCAL_CONFIG_DIR';
254
Richard Levitte610e2b32020-07-01 10:06:59 +0200255$config{sourcedir} = abs2rel($srcdir, $blddir);
256$config{builddir} = abs2rel($blddir, $blddir);
Rich Salz31214252020-06-29 12:20:41 +1000257# echo -n 'holy hand grenade of antioch' | openssl sha256
258$config{FIPSKEY} =
259 'f4556650ac31d35461610bac4ed81b1a181b2d8a43ea2854cbae22ca74560813';
Richard Levitte9fe2bb72016-01-29 19:45:51 +0100260
Richard Levitteee4cdb72016-08-29 22:11:36 +0200261# Collect reconfiguration information if needed
262my @argvcopy=@ARGV;
263
264if (grep /^reconf(igure)?$/, @argvcopy) {
Richard Levitte99aeeec2017-11-30 21:46:53 +0100265 die "reconfiguring with other arguments present isn't supported"
266 if scalar @argvcopy > 1;
Richard Levitteee4cdb72016-08-29 22:11:36 +0200267 if (-f "./configdata.pm") {
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100268 my $file = "./configdata.pm";
269 unless (my $return = do $file) {
270 die "couldn't parse $file: $@" if $@;
Richard Levitteee4cdb72016-08-29 22:11:36 +0200271 die "couldn't do $file: $!" unless defined $return;
272 die "couldn't run $file" unless $return;
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100273 }
Richard Levitteee4cdb72016-08-29 22:11:36 +0200274
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100275 @argvcopy = defined($configdata::config{perlargv}) ?
276 @{$configdata::config{perlargv}} : ();
277 die "Incorrect data to reconfigure, please do a normal configuration\n"
278 if (grep(/^reconf/,@argvcopy));
279 $config{perlenv} = $configdata::config{perlenv} // {};
Richard Levitteee4cdb72016-08-29 22:11:36 +0200280 } else {
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100281 die "Insufficient data to reconfigure, please do a normal configuration\n";
Richard Levitteee4cdb72016-08-29 22:11:36 +0200282 }
283}
284
285$config{perlargv} = [ @argvcopy ];
286
Richard Levitteb16654a2020-03-02 10:50:24 +0100287# Historical: if known directories in crypto/ have been removed, it means
288# that those sub-systems are disabled.
289# (the other option would be to removed them from the SUBDIRS statement in
290# crypto/build.info)
291# We reverse the input list for cosmetic purely reasons, to compensate that
292# 'unshift' adds at the front of the list (i.e. in reverse input order).
293foreach ( reverse sort( 'aes', 'aria', 'bf', 'camellia', 'cast', 'des', 'dh',
294 'dsa', 'ec', 'hmac', 'idea', 'md2', 'md5', 'mdc2',
295 'rc2', 'rc4', 'rc5', 'ripemd', 'rsa', 'seed', 'sha',
296 'sm2', 'sm3', 'sm4') ) {
297 unshift @argvcopy, "no-$_" if ! -d catdir($srcdir, 'crypto', $_);
298}
299
Richard Levitte107b5792015-05-20 20:03:20 +0200300# Collect version numbers
Richard Levitte20551b22019-10-17 16:03:06 +0200301my %version = ();
Richard Levitte107b5792015-05-20 20:03:20 +0200302
303collect_information(
Dr. David von Oheimb036cbb62020-06-10 14:15:28 +0200304 collect_from_file(catfile($srcdir,'VERSION.dat')),
Richard Levitte20551b22019-10-17 16:03:06 +0200305 qr/\s*(\w+)\s*=\s*(.*?)\s*$/ =>
306 sub {
307 # Only define it if there is a value at all
Richard Levitte6a960a92020-04-23 18:59:10 +0200308 if ($2 ne '') {
309 my $k = $1;
310 my $v = $2;
311 # Some values are quoted. Trim the quotes
312 $v = $1 if $v =~ /^"(.*)"$/;
313 $version{uc $k} = $v;
314 }
Richard Levitte20551b22019-10-17 16:03:06 +0200315 },
316 "OTHERWISE" =>
Dr. David von Oheimb036cbb62020-06-10 14:15:28 +0200317 sub { die "Something wrong with this line:\n$_\nin $srcdir/VERSION.dat" },
Richard Levitte107b5792015-05-20 20:03:20 +0200318 );
Richard Levitte20551b22019-10-17 16:03:06 +0200319
320$config{major} = $version{MAJOR} // 'unknown';
321$config{minor} = $version{MINOR} // 'unknown';
322$config{patch} = $version{PATCH} // 'unknown';
323$config{prerelease} =
324 defined $version{PRE_RELEASE_TAG} ? "-$version{PRE_RELEASE_TAG}" : '';
325$config{build_metadata} =
326 defined $version{BUILD_METADATA} ? "+$version{BUILD_METADATA}" : '';
327$config{shlib_version} = $version{SHLIB_VERSION} // 'unknown';
328$config{release_date} = $version{RELEASE_DATE} // 'xx XXX xxxx';
Richard Levitte107b5792015-05-20 20:03:20 +0200329
Dr. Matthias St. Pierre16942e02018-12-07 00:32:43 +0100330$config{version} = "$config{major}.$config{minor}.$config{patch}";
331$config{full_version} = "$config{version}$config{prerelease}$config{build_metadata}";
332
Dr. David von Oheimb036cbb62020-06-10 14:15:28 +0200333die "erroneous version information in VERSION.dat: ",
Richard Levitte20551b22019-10-17 16:03:06 +0200334 "$config{version}, $config{shlib_version}\n"
335 unless (defined $version{MAJOR}
336 && defined $version{MINOR}
337 && defined $version{PATCH}
338 && defined $version{SHLIB_VERSION});
339
Richard Levitte107b5792015-05-20 20:03:20 +0200340# Collect target configurations
341
Richard Levitte85152ca2016-02-02 19:47:05 +0100342my $pattern = catfile(dirname($0), "Configurations", "*.conf");
Andy Polyakov97855552016-05-28 16:11:01 +0200343foreach (sort glob($pattern)) {
Rich Salzf09e7ca2015-02-24 17:40:22 -0500344 &read_config($_);
345}
346
Richard Levitte7ecdf182017-11-29 13:09:01 +0100347if (defined env($local_config_envname)) {
Richard Levitteb5293d42016-05-02 16:50:51 +0200348 if ($^O eq 'VMS') {
349 # VMS environment variables are logical names,
350 # which can be used as is
351 $pattern = $local_config_envname . ':' . '*.conf';
352 } else {
Richard Levitte7ecdf182017-11-29 13:09:01 +0100353 $pattern = catfile(env($local_config_envname), '*.conf');
Richard Levitteb5293d42016-05-02 16:50:51 +0200354 }
355
Andy Polyakov97855552016-05-28 16:11:01 +0200356 foreach (sort glob($pattern)) {
Richard Levitteb5293d42016-05-02 16:50:51 +0200357 &read_config($_);
358 }
359}
360
Richard Levitted5fa7032018-02-02 12:21:27 +0100361# Save away perl command information
362$config{perl_cmd} = $^X;
363$config{perl_version} = $Config{version};
364$config{perl_archname} = $Config{archname};
365
Richard Levitte291e94d2015-05-18 22:35:23 +0200366$config{prefix}="";
367$config{openssldir}="";
Richard Levitte7d130f62015-05-19 01:40:54 +0200368$config{processor}="";
Richard Levitte107b5792015-05-20 20:03:20 +0200369$config{libdir}="";
Richard Levitte9c62a272016-02-27 16:51:34 +0100370my $auto_threads=1; # enable threads automatically? true by default
Bodo Möller03964792001-03-09 13:04:06 +0000371my $default_ranlib;
Richard Levitte107b5792015-05-20 20:03:20 +0200372
Viktor Dukhovni6b01bed2016-01-18 13:10:21 -0500373# Known TLS and DTLS protocols
Matt Caswell84a68332016-10-30 08:38:52 +0000374my @tls = qw(ssl3 tls1 tls1_1 tls1_2 tls1_3);
Viktor Dukhovni6b01bed2016-01-18 13:10:21 -0500375my @dtls = qw(dtls1 dtls1_2);
376
FdaSilvaYY8483a002016-03-10 21:34:48 +0100377# Explicitly known options that are possible to disable. They can
Richard Levitte8b527be2015-10-22 17:09:14 +0200378# be regexps, and will be used like this: /^no-${option}$/
379# For developers: keep it sorted alphabetically
380
381my @disablables = (
Shane Lontis4f2271d2020-06-17 11:33:16 +1000382 "acvp_tests",
Emilia Kasperc91a0a82016-03-14 12:21:44 +0100383 "afalgeng",
Paulid42d0a42017-02-01 10:10:13 +1000384 "aria",
Ben Lauriec38bb722016-03-26 17:19:14 +0000385 "asan",
Richard Levitte8b527be2015-10-22 17:09:14 +0200386 "asm",
Todd Short52739e42016-02-04 11:41:25 -0500387 "async",
Matt Caswellb184e3e2016-02-09 11:26:14 +0000388 "autoalginit",
Matt Caswell498abff2016-02-09 09:39:07 +0000389 "autoerrinit",
Bernd Edlingerdbabc862018-04-15 12:02:25 +0200390 "autoload-config",
Richard Levitte8b527be2015-10-22 17:09:14 +0200391 "bf",
Bill Cox2d0b4412016-03-09 23:08:31 +0100392 "blake2",
Richard Levitteac4033d2019-02-28 13:28:43 +0100393 "buildtest-c++",
Richard Levitte8b527be2015-10-22 17:09:14 +0200394 "camellia",
395 "capieng",
396 "cast",
Andy Polyakov48f14842015-12-09 23:02:11 +0100397 "chacha",
Richard Levitte8b527be2015-10-22 17:09:14 +0200398 "cmac",
Richard Levitte538f38d2019-05-08 05:28:47 +0200399 "cmp",
Richard Levitte8b527be2015-10-22 17:09:14 +0200400 "cms",
401 "comp",
Mat3e45d392016-01-09 23:55:57 +0100402 "crypto-mdebug",
Richard Levitte8b527be2015-10-22 17:09:14 +0200403 "ct",
404 "deprecated",
405 "des",
Richard Levitte619eb332017-03-24 16:19:00 +0100406 "devcryptoeng",
Richard Levitte8b527be2015-10-22 17:09:14 +0200407 "dgram",
408 "dh",
409 "dsa",
Bernd Edlinger3b2f8c72019-09-13 10:45:29 +0200410 "dso",
Kurt Roeckxa5ecdc62015-12-12 11:12:22 +0100411 "dtls",
Richard Levitte343ec2b2016-02-19 22:08:37 +0100412 "dynamic-engine",
Richard Levitte8b527be2015-10-22 17:09:14 +0200413 "ec",
414 "ec2m",
Viktor Dukhovni6b01bed2016-01-18 13:10:21 -0500415 "ecdh",
416 "ecdsa",
Richard Levitte8b527be2015-10-22 17:09:14 +0200417 "ec_nistp_64_gcc_128",
Richard Levitteb31feae2016-02-03 21:08:17 +0100418 "egd",
Richard Levitte8b527be2015-10-22 17:09:14 +0200419 "engine",
Rich Salz1288f262016-02-17 13:33:51 -0500420 "err",
Matt Caswellce2596d2016-10-12 16:21:13 +0100421 "external-tests",
David Woodhouse02f71142015-07-30 11:45:25 +0100422 "filenames",
Matt Caswelle7545512019-03-20 14:29:05 +0000423 "fips",
Kurt Roeckxf59d0132016-05-07 22:09:13 +0200424 "fuzz-libfuzzer",
425 "fuzz-afl",
Matt Caswell168c3b72016-03-21 15:04:08 +0000426 "gost",
Richard Levitte8b527be2015-10-22 17:09:14 +0200427 "idea",
Rich Salz742ccab2019-12-04 13:15:08 -0500428 "ktls",
Matt Caswelld0308922019-04-05 10:47:05 +0100429 "legacy",
Richard Levitte09aa2632016-03-09 01:14:29 +0100430 "makedepend",
Richard Levitte8b527be2015-10-22 17:09:14 +0200431 "md2",
432 "md4",
Richard Levitte8b527be2015-10-22 17:09:14 +0200433 "mdc2",
Richard Levitte34786bd2019-03-31 15:17:58 +0200434 "module",
Emilia Kasper29df3062016-07-28 20:24:28 +0200435 "msan",
Matt Caswellfa22f982016-03-07 23:26:32 +0000436 "multiblock",
Richard Levitte8b527be2015-10-22 17:09:14 +0200437 "nextprotoneg",
Matt Caswell41999e72018-11-16 14:05:14 +0000438 "pinshared",
Richard Levitte8b527be2015-10-22 17:09:14 +0200439 "ocb",
440 "ocsp",
Richard Levitte469ce8f2019-03-01 13:18:11 +0100441 "padlockeng",
Richard Levitteae482422016-02-22 02:09:11 +0100442 "pic",
Andy Polyakov48f14842015-12-09 23:02:11 +0100443 "poly1305",
Richard Levitte8b527be2015-10-22 17:09:14 +0200444 "posix-io",
445 "psk",
446 "rc2",
447 "rc4",
448 "rc5",
449 "rdrand",
450 "rfc3779",
Richard Levitte8b527be2015-10-22 17:09:14 +0200451 "rmd160",
Richard Levitte8b527be2015-10-22 17:09:14 +0200452 "scrypt",
Richard Levitte8b527be2015-10-22 17:09:14 +0200453 "sctp",
Rich Salz69433352020-02-05 14:28:37 -0500454 "secure-memory",
Richard Levitte8b527be2015-10-22 17:09:14 +0200455 "seed",
Richard Levitte8b527be2015-10-22 17:09:14 +0200456 "shared",
Todd Short3f5616d2017-01-11 16:38:44 -0500457 "siphash",
Todd Shortb1ceb432017-05-19 10:27:28 -0400458 "siv",
Matt Caswell1bf2cc22018-03-19 16:17:58 +0000459 "sm2",
Jack Lloyda0c3e4f2017-10-25 13:19:02 -0400460 "sm3",
Ronald Tsef19a5ff2017-10-31 15:19:14 +1000461 "sm4",
Richard Levitte8b527be2015-10-22 17:09:14 +0200462 "sock",
463 "srp",
464 "srtp",
465 "sse2",
466 "ssl",
Richard Levitte8b527be2015-10-22 17:09:14 +0200467 "ssl-trace",
468 "static-engine",
469 "stdio",
Richard Levitte93880ce2016-08-30 06:02:50 +0200470 "tests",
Richard Levitte8b527be2015-10-22 17:09:14 +0200471 "threads",
472 "tls",
Richard Levitte16a9d372018-12-12 21:31:36 +0100473 "trace",
Rich Salz1288f262016-02-17 13:33:51 -0500474 "ts",
Ben Lauriec38bb722016-03-26 17:19:14 +0000475 "ubsan",
Richard Levitte48feace2017-07-01 12:14:37 +0200476 "ui-console",
Richard Levitte8b527be2015-10-22 17:09:14 +0200477 "unit-test",
MouriNaruto5ded1ca2019-05-12 05:10:58 +0800478 "uplink",
Richard Levitte8b527be2015-10-22 17:09:14 +0200479 "whirlpool",
Matt Caswell8b1a5af2016-03-03 15:40:51 +0000480 "weak-ssl-ciphers",
Richard Levitte8b527be2015-10-22 17:09:14 +0200481 "zlib",
482 "zlib-dynamic",
483 );
Viktor Dukhovni6b01bed2016-01-18 13:10:21 -0500484foreach my $proto ((@tls, @dtls))
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100485 {
486 push(@disablables, $proto);
487 push(@disablables, "$proto-method") unless $proto eq "tls1_3";
488 }
Richard Levitte8b527be2015-10-22 17:09:14 +0200489
Richard Levitte538f38d2019-05-08 05:28:47 +0200490# Internal disablables, for aliasing purposes. They serve no special
491# purpose here, but allow scripts to get to know them through configdata.pm,
492# where these are merged with @disablables.
493# The actual aliasing mechanism is done via %disable_cascades
494my @disablables_int = qw(
495 crmf
496 );
497
Matt Caswell2b1343b2016-06-16 11:45:24 +0100498my %deprecated_disablables = (
499 "ssl2" => undef,
500 "buf-freelists" => undef,
Rich Salz14611382019-12-11 10:56:12 -0500501 "crypto-mdebug-backtrace" => undef,
Richard Levitte469ce8f2019-03-01 13:18:11 +0100502 "hw" => "hw", # causes cascade, but no macro
503 "hw-padlock" => "padlockeng",
Richard Levitte48feace2017-07-01 12:14:37 +0200504 "ripemd" => "rmd160",
505 "ui" => "ui-console",
Richard Levitte0b45d8e2019-04-01 17:37:16 +0200506 "heartbeats" => undef,
Richard Levittee80381e2016-02-22 10:42:53 +0100507 );
508
Daniel Bevenius094925d2018-03-31 18:29:12 -0400509# All of the following are disabled by default:
Bodo Möllerc9a112f2005-02-22 10:29:51 +0000510
Richard Levitte9e04edf2016-02-22 13:45:46 +0100511our %disabled = ( # "what" => "comment"
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100512 "asan" => "default",
513 "buildtest-c++" => "default",
514 "crypto-mdebug" => "default",
515 "crypto-mdebug-backtrace" => "default",
516 "devcryptoeng" => "default",
517 "ec_nistp_64_gcc_128" => "default",
518 "egd" => "default",
519 "external-tests" => "default",
520 "fuzz-libfuzzer" => "default",
521 "fuzz-afl" => "default",
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100522 "md2" => "default",
Emilia Kasper29df3062016-07-28 20:24:28 +0200523 "msan" => "default",
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100524 "rc5" => "default",
525 "sctp" => "default",
526 "ssl-trace" => "default",
527 "ssl3" => "default",
528 "ssl3-method" => "default",
529 "trace" => "default",
530 "ubsan" => "default",
531 "unit-test" => "default",
532 "weak-ssl-ciphers" => "default",
533 "zlib" => "default",
534 "zlib-dynamic" => "default",
535 "ktls" => "default",
536 );
Bodo Möllerc9a112f2005-02-22 10:29:51 +0000537
Richard Levittec569e202015-05-18 11:03:47 +0200538# Note: => pair form used for aesthetics, not to truly make a hash table
539my @disable_cascades = (
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100540 # "what" => [ "cascade", ... ]
Richard Levitte7d130f62015-05-19 01:40:54 +0200541 sub { $config{processor} eq "386" }
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100542 => [ "sse2" ],
543 "ssl" => [ "ssl3" ],
544 "ssl3-method" => [ "ssl3" ],
545 "zlib" => [ "zlib-dynamic" ],
546 "des" => [ "mdc2" ],
Nikolay Morozovfa555aa2020-04-18 23:59:45 +0300547 "ec" => [ "ecdsa", "ecdh", "sm2", "gost" ],
Matt Caswell65dc5c32019-06-13 19:34:37 +0100548 sub { $disabled{"ec"} && $disabled{"dh"} }
549 => [ "tls1_3" ],
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100550 "dgram" => [ "dtls", "sctp" ],
551 "sock" => [ "dgram" ],
552 "dtls" => [ @dtls ],
Richard Levitte343a7462017-02-17 20:48:28 +0100553 sub { 0 == scalar grep { !$disabled{$_} } @dtls }
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100554 => [ "dtls" ],
Richard Levittec569e202015-05-18 11:03:47 +0200555
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100556 "tls" => [ @tls ],
Richard Levitte343a7462017-02-17 20:48:28 +0100557 sub { 0 == scalar grep { !$disabled{$_} } @tls }
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100558 => [ "tls" ],
Richard Levittec569e202015-05-18 11:03:47 +0200559
Richard Levitteef8ca6b2016-02-14 12:16:52 +0100560 "crypto-mdebug" => [ "crypto-mdebug-backtrace" ],
Richard Levitte343ec2b2016-02-19 22:08:37 +0100561
Richard Levitte34786bd2019-03-31 15:17:58 +0200562 # If no modules, then no dynamic engines either
563 "module" => [ "dynamic-engine" ],
564
565 # Without shared libraries, dynamic engines aren't possible.
566 # This is due to them having to link with libcrypto and register features
567 # using the ENGINE functionality, and since that relies on global tables,
568 # those *have* to be exacty the same as the ones accessed from the app,
569 # which cannot be guaranteed if shared libraries aren't present.
570 # (note that even with shared libraries, both the app and dynamic engines
571 # must be linked with the same library)
MouriNaruto5ded1ca2019-05-12 05:10:58 +0800572 "shared" => [ "dynamic-engine", "uplink" ],
Bernd Edlinger3b2f8c72019-09-13 10:45:29 +0200573 "dso" => [ "dynamic-engine", "module" ],
Richard Levitte34786bd2019-03-31 15:17:58 +0200574 # Other modules don't necessarily have to link with libcrypto, so shared
575 # libraries do not have to be a condition to produce those.
576
577 # Without position independent code, there can be no shared libraries
578 # or modules.
579 "pic" => [ "shared", "module" ],
Richard Levitte469ce8f2019-03-01 13:18:11 +0100580
Richard Levitte318e0742019-08-19 08:55:53 +0200581 "module" => [ "fips" ],
Matt Caswelle7545512019-03-20 14:29:05 +0000582
Richard Levitte469ce8f2019-03-01 13:18:11 +0100583 "engine" => [ grep /eng$/, @disablables ],
584 "hw" => [ "padlockeng" ],
Matt Caswelld90a6be2016-04-14 13:44:15 +0100585
586 # no-autoalginit is only useful when building non-shared
587 "autoalginit" => [ "shared", "apps" ],
588
Richard Levitte15a1bd02017-09-12 07:47:05 +0200589 "stdio" => [ "apps", "capieng", "egd" ],
Matt Caswelld90a6be2016-04-14 13:44:15 +0100590 "apps" => [ "tests" ],
Richard Levitte302eba32017-08-28 15:41:49 +0200591 "tests" => [ "external-tests" ],
Matt Caswell3cf96e82016-12-28 15:32:39 +0000592 "comp" => [ "zlib" ],
Todd Short98020022018-03-19 13:21:13 -0400593 "sm3" => [ "sm2" ],
Richard Levitteb6127992016-11-15 14:53:33 +0100594 sub { !$disabled{"unit-test"} } => [ "heartbeats" ],
Emilia Kasper29df3062016-07-28 20:24:28 +0200595
596 sub { !$disabled{"msan"} } => [ "asm" ],
Todd Shortb1ceb432017-05-19 10:27:28 -0400597
598 sub { $disabled{cmac}; } => [ "siv" ],
Matt Caswelld0308922019-04-05 10:47:05 +0100599 "legacy" => [ "md2" ],
Richard Levitte538f38d2019-05-08 05:28:47 +0200600
601 "cmp" => [ "crmf" ],
Matt Caswellc72fa252019-12-05 17:09:49 +0000602
Richard Levitteb05d6322020-02-06 11:26:22 +0100603 sub { $disabled{"deprecated-3.0"} }
Pauli910b71c2020-06-25 10:36:29 +1000604 => [ "engine" ]
Richard Levittec569e202015-05-18 11:03:47 +0200605 );
606
607# Avoid protocol support holes. Also disable all versions below N, if version
608# N is disabled while N+1 is enabled.
609#
610my @list = (reverse @tls);
611while ((my $first, my $second) = (shift @list, shift @list)) {
612 last unless @list;
613 push @disable_cascades, ( sub { !$disabled{$first} && $disabled{$second} }
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100614 => [ @list ] );
Richard Levittec569e202015-05-18 11:03:47 +0200615 unshift @list, $second;
616}
617my @list = (reverse @dtls);
618while ((my $first, my $second) = (shift @list, shift @list)) {
619 last unless @list;
620 push @disable_cascades, ( sub { !$disabled{$first} && $disabled{$second} }
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100621 => [ @list ] );
Richard Levittec569e202015-05-18 11:03:47 +0200622 unshift @list, $second;
623}
624
Bodo Möller7a762192008-12-02 01:21:39 +0000625# Explicit "no-..." options will be collected in %disabled along with the defaults.
Rich Salze4ef2e22016-02-10 11:10:39 -0500626# To remove something from %disabled, use "enable-foo".
Bodo Möller7a762192008-12-02 01:21:39 +0000627# For symmetry, "disable-foo" is a synonym for "no-foo".
628
Richard Levittebbe486c2020-01-09 14:49:53 +0100629# For the "make variables" CPPINCLUDES and CPPDEFINES, we support lists with
Richard Levitte5b182352018-01-26 19:56:44 +0100630# platform specific list separators. Users from those platforms should
631# recognise those separators from how you set up the PATH to find executables.
632# The default is the Unix like separator, :, but as an exception, we also
633# support the space as separator.
634my $list_separator_re =
635 { VMS => qr/(?<!\^),/,
636 MSWin32 => qr/(?<!\\);/ } -> {$^O} // qr/(?<!\\)[:\s]/;
637# All the "make variables" we support
Richard Levittef5846172018-03-16 08:59:03 +0100638# Some get pre-populated for the sake of backward compatibility
639# (we supported those before the change to "make variable" support.
Richard Levitte5b182352018-01-26 19:56:44 +0100640my %user = (
Richard Levittef5846172018-03-16 08:59:03 +0100641 AR => env('AR'),
Richard Levitte5b182352018-01-26 19:56:44 +0100642 ARFLAGS => [],
643 AS => undef,
644 ASFLAGS => [],
Richard Levittef5846172018-03-16 08:59:03 +0100645 CC => env('CC'),
Richard Levitte8e7984e2019-02-26 23:18:02 +0100646 CFLAGS => [ env('CFLAGS') || () ],
Richard Levittef5846172018-03-16 08:59:03 +0100647 CXX => env('CXX'),
Richard Levitte8e7984e2019-02-26 23:18:02 +0100648 CXXFLAGS => [ env('CXXFLAGS') || () ],
Richard Levitte5b182352018-01-26 19:56:44 +0100649 CPP => undef,
Richard Levitte8e7984e2019-02-26 23:18:02 +0100650 CPPFLAGS => [ env('CPPFLAGS') || () ], # -D, -I, -Wp,
Richard Levitte5b182352018-01-26 19:56:44 +0100651 CPPDEFINES => [], # Alternative for -D
652 CPPINCLUDES => [], # Alternative for -I
Richard Levittef5846172018-03-16 08:59:03 +0100653 CROSS_COMPILE => env('CROSS_COMPILE'),
654 HASHBANGPERL=> env('HASHBANGPERL') || env('PERL'),
Richard Levitte5b182352018-01-26 19:56:44 +0100655 LD => undef,
Richard Levitte8e7984e2019-02-26 23:18:02 +0100656 LDFLAGS => [ env('LDFLAGS') || () ], # -L, -Wl,
657 LDLIBS => [ env('LDLIBS') || () ], # -l
Richard Levitte5b182352018-01-26 19:56:44 +0100658 MT => undef,
659 MTFLAGS => [],
Richard Levitte9e265322018-07-08 12:00:06 +0200660 PERL => env('PERL') || ($^O ne "VMS" ? $^X : "perl"),
Richard Levittef5846172018-03-16 08:59:03 +0100661 RANLIB => env('RANLIB'),
662 RC => env('RC') || env('WINDRES'),
Wojciech Kaluza0c4e9842019-04-21 12:39:20 +0100663 RCFLAGS => [ env('RCFLAGS') || () ],
Richard Levitte5b182352018-01-26 19:56:44 +0100664 RM => undef,
665 );
Richard Levittef729ba52018-02-02 12:27:29 +0100666# Info about what "make variables" may be prefixed with the cross compiler
667# prefix. This should NEVER mention any such variable with a list for value.
668my @user_crossable = qw ( AR AS CC CXX CPP LD MT RANLIB RC );
Richard Levitte5b182352018-01-26 19:56:44 +0100669# The same but for flags given as Configure options. These are *additional*
670# input, as opposed to the VAR=string option that override the corresponding
671# config target attributes
672my %useradd = (
673 CPPDEFINES => [],
674 CPPINCLUDES => [],
675 CPPFLAGS => [],
676 CFLAGS => [],
677 CXXFLAGS => [],
678 LDFLAGS => [],
679 LDLIBS => [],
Wojciech Kaluza0c4e9842019-04-21 12:39:20 +0100680 RCFLAGS => [],
Richard Levitte5b182352018-01-26 19:56:44 +0100681 );
682
683my %user_synonyms = (
684 HASHBANGPERL=> 'PERL',
685 RC => 'WINDRES',
686 );
Richard Levitteabe256e2018-03-06 20:35:30 +0100687
688# Some target attributes have been renamed, this is the translation table
689my %target_attr_translate =(
690 ar => 'AR',
691 as => 'AS',
692 cc => 'CC',
693 cxx => 'CXX',
694 cpp => 'CPP',
695 hashbangperl => 'HASHBANGPERL',
696 ld => 'LD',
697 mt => 'MT',
698 ranlib => 'RANLIB',
699 rc => 'RC',
700 rm => 'RM',
Richard Levitte5b182352018-01-26 19:56:44 +0100701 );
Richard Levitte5b182352018-01-26 19:56:44 +0100702
Richard Levitte2ab92ae2018-03-07 22:44:59 +0100703# Initialisers coming from 'config' scripts
Andy Polyakovff455d92018-03-28 10:06:32 +0200704$config{defines} = [ split(/$list_separator_re/, env('__CNF_CPPDEFINES')) ];
705$config{includes} = [ split(/$list_separator_re/, env('__CNF_CPPINCLUDES')) ];
706$config{cppflags} = [ env('__CNF_CPPFLAGS') || () ];
707$config{cflags} = [ env('__CNF_CFLAGS') || () ];
708$config{cxxflags} = [ env('__CNF_CXXFLAGS') || () ];
709$config{lflags} = [ env('__CNF_LDFLAGS') || () ];
710$config{ex_libs} = [ env('__CNF_LDLIBS') || () ];
Richard Levitte2ab92ae2018-03-07 22:44:59 +0100711
Richard Levitte7d130f62015-05-19 01:40:54 +0200712$config{openssl_api_defines}=[];
Richard Levitte7d130f62015-05-19 01:40:54 +0200713$config{openssl_sys_defines}=[];
Richard Levittee0bf7c02018-11-03 18:34:09 +0100714$config{openssl_feature_defines}=[];
Richard Levitte3fa04f02016-01-12 00:17:12 +0100715$config{options}="";
Richard Levitte8864f0d2016-03-02 19:13:26 +0100716$config{build_type} = "release";
Richard Levitte5b182352018-01-26 19:56:44 +0100717my $target="";
Richard Levittec59cb512000-08-17 10:23:45 +0000718
Richard Levitteac6ae8a2018-03-16 08:24:50 +0100719my %cmdvars = (); # Stores FOO='blah' type arguments
Richard Levittefe052642015-05-18 03:33:55 +0200720my %unsupported_options = ();
Richard Levittee80381e2016-02-22 10:42:53 +0100721my %deprecated_options = ();
Rich Salz8389ec42017-07-18 09:39:21 -0400722# If you change this, update apps/version.c
723my @known_seed_sources = qw(getrandom devrandom os egd none rdcpu librandom);
724my @seed_sources = ();
Richard Levittefad599f2016-10-12 17:05:35 +0200725while (@argvcopy)
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100726 {
727 $_ = shift @argvcopy;
Richard Levitte89bea082017-11-29 13:16:53 +0100728
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100729 # Support env variable assignments among the options
730 if (m|^(\w+)=(.+)?$|)
731 {
732 $cmdvars{$1} = $2;
733 # Every time a variable is given as a configuration argument,
734 # it acts as a reset if the variable.
735 if (exists $user{$1})
736 {
737 $user{$1} = ref $user{$1} eq "ARRAY" ? [] : undef;
738 }
739 #if (exists $useradd{$1})
740 # {
741 # $useradd{$1} = [];
742 # }
743 next;
744 }
Richard Levitte89bea082017-11-29 13:16:53 +0100745
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100746 # VMS is a case insensitive environment, and depending on settings
747 # out of our control, we may receive options uppercased. Let's
748 # downcase at least the part before any equal sign.
749 if ($^O eq "VMS")
750 {
751 s/^([^=]*)/lc($1)/e;
752 }
Andy Polyakov6d5e74f2018-03-14 09:42:42 +0100753
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100754 # some people just can't read the instructions, clang people have to...
755 s/^-no-(?!integrated-as)/no-/;
Richard Levittec59cb512000-08-17 10:23:45 +0000756
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100757 # rewrite some options in "enable-..." form
758 s /^-?-?shared$/enable-shared/;
759 s /^sctp$/enable-sctp/;
760 s /^threads$/enable-threads/;
761 s /^zlib$/enable-zlib/;
762 s /^zlib-dynamic$/enable-zlib-dynamic/;
Richard Levittec59cb512000-08-17 10:23:45 +0000763
Rich Salze4ef2e22016-02-10 11:10:39 -0500764 if (/^(no|disable|enable)-(.+)$/)
Matt Caswell2b1343b2016-06-16 11:45:24 +0100765 {
766 my $word = $2;
Richard Levitte469ce8f2019-03-01 13:18:11 +0100767 if ($word !~ m|hw(?:-.+)| # special treatment for hw regexp opt
768 && !exists $deprecated_disablables{$word}
769 && !grep { $word eq $_ } @disablables)
Matt Caswell2b1343b2016-06-16 11:45:24 +0100770 {
771 $unsupported_options{$_} = 1;
772 next;
773 }
774 }
775 if (/^no-(.+)$/ || /^disable-(.+)$/)
776 {
Rich Salze4ef2e22016-02-10 11:10:39 -0500777 foreach my $proto ((@tls, @dtls))
778 {
779 if ($1 eq "$proto-method")
780 {
781 $disabled{"$proto"} = "option($proto-method)";
782 last;
783 }
784 }
785 if ($1 eq "dtls")
786 {
787 foreach my $proto (@dtls)
788 {
789 $disabled{$proto} = "option(dtls)";
790 }
Kurt Roeckxc5c77002016-03-28 00:31:23 +0200791 $disabled{"dtls"} = "option(dtls)";
Rich Salze4ef2e22016-02-10 11:10:39 -0500792 }
793 elsif ($1 eq "ssl")
794 {
795 # Last one of its kind
796 $disabled{"ssl3"} = "option(ssl)";
797 }
798 elsif ($1 eq "tls")
799 {
800 # XXX: Tests will fail if all SSL/TLS
801 # protocols are disabled.
802 foreach my $proto (@tls)
803 {
804 $disabled{$proto} = "option(tls)";
805 }
806 }
Richard Levitte343ec2b2016-02-19 22:08:37 +0100807 elsif ($1 eq "static-engine")
808 {
Richard Levitte19ab5792016-02-22 02:06:05 +0100809 delete $disabled{"dynamic-engine"};
Richard Levitte343ec2b2016-02-19 22:08:37 +0100810 }
811 elsif ($1 eq "dynamic-engine")
812 {
Richard Levitte19ab5792016-02-22 02:06:05 +0100813 $disabled{"dynamic-engine"} = "option";
Richard Levitte343ec2b2016-02-19 22:08:37 +0100814 }
Matt Caswell2b1343b2016-06-16 11:45:24 +0100815 elsif (exists $deprecated_disablables{$1})
816 {
817 $deprecated_options{$_} = 1;
818 if (defined $deprecated_disablables{$1})
819 {
820 $disabled{$deprecated_disablables{$1}} = "option";
821 }
822 }
Richard Levitte469ce8f2019-03-01 13:18:11 +0100823 elsif ($1 =~ m|hw(?:-.+)|) # deprecate hw options in regexp form
824 {
825 $deprecated_options{$_} = 1;
826 }
Rich Salze4ef2e22016-02-10 11:10:39 -0500827 else
828 {
829 $disabled{$1} = "option";
830 }
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100831 # No longer an automatic choice
832 $auto_threads = 0 if ($1 eq "threads");
833 }
834 elsif (/^enable-(.+)$/)
835 {
Richard Levitte343ec2b2016-02-19 22:08:37 +0100836 if ($1 eq "static-engine")
837 {
Richard Levitte19ab5792016-02-22 02:06:05 +0100838 $disabled{"dynamic-engine"} = "option";
Richard Levitte343ec2b2016-02-19 22:08:37 +0100839 }
840 elsif ($1 eq "dynamic-engine")
841 {
Richard Levitte19ab5792016-02-22 02:06:05 +0100842 delete $disabled{"dynamic-engine"};
Richard Levitte343ec2b2016-02-19 22:08:37 +0100843 }
Richard Levitte25004db2016-03-03 10:07:29 +0100844 elsif ($1 eq "zlib-dynamic")
845 {
846 delete $disabled{"zlib"};
847 }
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100848 my $algo = $1;
849 delete $disabled{$algo};
Richard Levittefe052642015-05-18 03:33:55 +0200850
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100851 # No longer an automatic choice
852 $auto_threads = 0 if ($1 eq "threads");
853 }
Richard Levitte18062612020-03-03 15:04:42 +0100854 elsif (/^-d$/) # From older 'config'
855 {
856 $config{build_type} = "debug";
857 }
858 elsif (/^-v$/) # From older 'config'
859 {
860 $guess_opts{verbose} = 1;
861 }
862 elsif (/^-w$/) # From older 'config'
863 {
864 $guess_opts{nowait} = 1;
865 }
866 elsif (/^-t$/) # From older 'config'
867 {
868 $dryrun = 1;
869 }
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100870 elsif (/^--strict-warnings$/)
871 {
872 # Pretend that our strict flags is a C flag, and replace it
873 # with the proper flags later on
874 push @{$useradd{CFLAGS}}, '--ossl-strict-warnings';
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100875 $strict_warnings=1;
876 }
877 elsif (/^--debug$/)
878 {
879 $config{build_type} = "debug";
880 }
881 elsif (/^--release$/)
882 {
883 $config{build_type} = "release";
884 }
885 elsif (/^386$/)
886 { $config{processor}=386; }
887 elsif (/^fips$/)
888 {
889 die "FIPS mode not supported\n";
890 }
891 elsif (/^rsaref$/)
892 {
893 # No RSAref support any more since it's not needed.
894 # The check for the option is there so scripts aren't
895 # broken
896 }
897 elsif (/^nofipscanistercheck$/)
898 {
899 die "FIPS mode not supported\n";
900 }
Dr. Matthias St. Pierref246f542019-09-21 00:14:16 +0200901 elsif (m|^[-+/]|)
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100902 {
903 if (/^--prefix=(.*)$/)
904 {
905 $config{prefix}=$1;
906 die "Directory given with --prefix MUST be absolute\n"
907 unless file_name_is_absolute($config{prefix});
Rich Salz8389ec42017-07-18 09:39:21 -0400908 }
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100909 elsif (/^--api=(.*)$/)
910 {
Richard Levittea6a4d0a2019-11-05 17:00:33 +0100911 my $api = $1;
912 die "Unknown API compatibility level $api"
913 unless defined $apitable->{$api};
914 $config{api}=$apitable->{$api};
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100915 }
916 elsif (/^--libdir=(.*)$/)
917 {
918 $config{libdir}=$1;
919 }
920 elsif (/^--openssldir=(.*)$/)
921 {
922 $config{openssldir}=$1;
923 }
924 elsif (/^--with-zlib-lib=(.*)$/)
925 {
926 $withargs{zlib_lib}=$1;
927 }
928 elsif (/^--with-zlib-include=(.*)$/)
929 {
930 $withargs{zlib_include}=$1;
931 }
932 elsif (/^--with-fuzzer-lib=(.*)$/)
933 {
934 $withargs{fuzzer_lib}=$1;
935 }
936 elsif (/^--with-fuzzer-include=(.*)$/)
937 {
938 $withargs{fuzzer_include}=$1;
939 }
940 elsif (/^--with-rand-seed=(.*)$/)
941 {
942 foreach my $x (split(m|,|, $1))
943 {
944 die "Unknown --with-rand-seed choice $x\n"
945 if ! grep { $x eq $_ } @known_seed_sources;
946 push @seed_sources, $x;
947 }
948 }
Rich Salz31214252020-06-29 12:20:41 +1000949 elsif (/^--fips-key=(.*)$/)
950 {
951 $user{FIPSKEY}=lc($1);
952 die "Non-hex character in FIPS key\n"
953 if $user{FIPSKEY} =~ /[^a-f0-9]/;
954 die "FIPS key must have even number of characters\n"
955 if length $1 & 1;
956 die "FIPS key too long (64 bytes max)\n"
957 if length $1 > 64;
958 }
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100959 elsif (/^--cross-compile-prefix=(.*)$/)
960 {
961 $user{CROSS_COMPILE}=$1;
962 }
963 elsif (/^--config=(.*)$/)
964 {
965 read_config $1;
966 }
967 elsif (/^-l(.*)$/)
968 {
969 push @{$useradd{LDLIBS}}, $_;
970 }
971 elsif (/^-framework$/)
972 {
973 push @{$useradd{LDLIBS}}, $_, shift(@argvcopy);
974 }
975 elsif (/^-L(.*)$/ or /^-Wl,/)
976 {
977 push @{$useradd{LDFLAGS}}, $_;
978 }
979 elsif (/^-rpath$/ or /^-R$/)
980 # -rpath is the OSF1 rpath flag
981 # -R is the old Solaris rpath flag
982 {
983 my $rpath = shift(@argvcopy) || "";
984 $rpath .= " " if $rpath ne "";
985 push @{$useradd{LDFLAGS}}, $_, $rpath;
986 }
987 elsif (/^-static$/)
988 {
989 push @{$useradd{LDFLAGS}}, $_;
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100990 }
Dr. Matthias St. Pierref246f542019-09-21 00:14:16 +0200991 elsif (m|^[-/]D(.*)$|)
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100992 {
993 push @{$useradd{CPPDEFINES}}, $1;
994 }
Dr. Matthias St. Pierref246f542019-09-21 00:14:16 +0200995 elsif (m|^[-/]I(.*)$|)
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100996 {
997 push @{$useradd{CPPINCLUDES}}, $1;
998 }
999 elsif (/^-Wp,$/)
1000 {
1001 push @{$useradd{CPPFLAGS}}, $1;
1002 }
1003 else # common if (/^[-+]/), just pass down...
1004 {
Dr. Matthias St. Pierref246f542019-09-21 00:14:16 +02001005 # Treat %xx as an ASCII code (e.g. replace %20 by a space character).
1006 # This provides a simple way to pass options with arguments separated
1007 # by spaces without quoting (e.g. -opt%20arg translates to -opt arg).
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001008 $_ =~ s/%([0-9a-f]{1,2})/chr(hex($1))/gei;
1009 push @{$useradd{CFLAGS}}, $_;
1010 push @{$useradd{CXXFLAGS}}, $_;
1011 }
1012 }
Dr. Matthias St. Pierref246f542019-09-21 00:14:16 +02001013 elsif (m|^/|)
1014 {
1015 # Treat %xx as an ASCII code (e.g. replace %20 by a space character).
1016 # This provides a simple way to pass options with arguments separated
1017 # by spaces without quoting (e.g. /opt%20arg translates to /opt arg).
1018 $_ =~ s/%([0-9a-f]{1,2})/chr(hex($1))/gei;
1019 push @{$useradd{CFLAGS}}, $_;
1020 push @{$useradd{CXXFLAGS}}, $_;
1021 }
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001022 else
1023 {
1024 die "target already defined - $target (offending arg: $_)\n" if ($target ne "");
1025 $target=$_;
1026 }
1027 unless ($_ eq $target || /^no-/ || /^disable-/)
1028 {
1029 # "no-..." follows later after implied deactivations
1030 # have been derived. (Don't take this too seriously,
1031 # we really only write OPTIONS to the Makefile out of
1032 # nostalgia.)
Richard Levittefe052642015-05-18 03:33:55 +02001033
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001034 if ($config{options} eq "")
1035 { $config{options} = $_; }
1036 else
1037 { $config{options} .= " ".$_; }
1038 }
1039 }
Richard Levitte489eb742015-10-22 17:33:47 +02001040
Richard Levitteddbe7002018-07-22 10:56:25 +02001041if (keys %deprecated_options)
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001042 {
1043 warn "***** Deprecated options: ",
1044 join(", ", keys %deprecated_options), "\n";
1045 }
Richard Levitteddbe7002018-07-22 10:56:25 +02001046if (keys %unsupported_options)
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001047 {
1048 die "***** Unsupported options: ",
1049 join(", ", keys %unsupported_options), "\n";
1050 }
Richard Levitteb6e4dac2001-11-27 11:48:30 +00001051
Richard Levitteac6ae8a2018-03-16 08:24:50 +01001052# If any %useradd entry has been set, we must check that the "make
1053# variables" haven't been set. We start by checking of any %useradd entry
Richard Levittefb174fa2018-03-08 18:49:37 +01001054# is set.
Richard Levitteb9201362018-03-08 14:16:18 +01001055if (grep { scalar @$_ > 0 } values %useradd) {
Richard Levittefb174fa2018-03-08 18:49:37 +01001056 # Hash of env / make variables names. The possible values are:
Richard Levitteac6ae8a2018-03-16 08:24:50 +01001057 # 1 - "make vars"
Richard Levittefb174fa2018-03-08 18:49:37 +01001058 # 2 - %useradd entry set
1059 # 3 - both set
Richard Levitteac6ae8a2018-03-16 08:24:50 +01001060 my %detected_vars =
Richard Levittefb174fa2018-03-08 18:49:37 +01001061 map { my $v = 0;
Richard Levitteac6ae8a2018-03-16 08:24:50 +01001062 $v += 1 if $cmdvars{$_};
Richard Levittefb174fa2018-03-08 18:49:37 +01001063 $v += 2 if @{$useradd{$_}};
1064 $_ => $v }
1065 keys %useradd;
1066
Richard Levitteac6ae8a2018-03-16 08:24:50 +01001067 # If any of the corresponding "make variables" is set, we error
1068 if (grep { $_ & 1 } values %detected_vars) {
1069 my $names = join(', ', grep { $detected_vars{$_} > 0 }
1070 sort keys %detected_vars);
Richard Levitteb9201362018-03-08 14:16:18 +01001071 die <<"_____";
Richard Levitteac6ae8a2018-03-16 08:24:50 +01001072***** Mixing make variables and additional compiler/linker flags as
Richard Levitteb9201362018-03-08 14:16:18 +01001073***** configure command line option is not permitted.
Richard Levitteac6ae8a2018-03-16 08:24:50 +01001074***** Affected make variables: $names
Richard Levitteb9201362018-03-08 14:16:18 +01001075_____
1076 }
1077}
1078
Richard Levitteac6ae8a2018-03-16 08:24:50 +01001079# Check through all supported command line variables to see if any of them
1080# were set, and canonicalise the values we got. If no compiler or linker
1081# flag or anything else that affects %useradd was set, we also check the
1082# environment for values.
1083my $anyuseradd =
1084 grep { defined $_ && (ref $_ ne 'ARRAY' || @$_) } values %useradd;
Richard Levitte5b182352018-01-26 19:56:44 +01001085foreach (keys %user) {
Richard Levitteac6ae8a2018-03-16 08:24:50 +01001086 my $value = $cmdvars{$_};
1087 $value //= env($_) unless $anyuseradd;
1088 $value //=
1089 defined $user_synonyms{$_} ? $cmdvars{$user_synonyms{$_}} : undef;
1090 $value //= defined $user_synonyms{$_} ? env($user_synonyms{$_}) : undef
1091 unless $anyuseradd;
Richard Levitte5b182352018-01-26 19:56:44 +01001092
1093 if (defined $value) {
1094 if (ref $user{$_} eq 'ARRAY') {
Richard Levittebbe486c2020-01-09 14:49:53 +01001095 if ($_ eq 'CPPDEFINES' || $_ eq 'CPPINCLUDES') {
1096 $user{$_} = [ split /$list_separator_re/, $value ];
1097 } else {
1098 $user{$_} = [ $value ];
1099 }
Richard Levitte5b182352018-01-26 19:56:44 +01001100 } elsif (!defined $user{$_}) {
1101 $user{$_} = $value;
1102 }
1103 }
1104}
1105
Andy Polyakov07e4dc32018-06-18 19:08:50 +02001106if (grep { /-rpath\b/ } ($user{LDFLAGS} ? @{$user{LDFLAGS}} : ())
Richard Levitte342a1a22016-09-07 20:56:20 +02001107 && !$disabled{shared}
1108 && !($disabled{asan} && $disabled{msan} && $disabled{ubsan})) {
1109 die "***** Cannot simultaneously use -rpath, shared libraries, and\n",
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001110 "***** any of asan, msan or ubsan\n";
Richard Levitte342a1a22016-09-07 20:56:20 +02001111}
1112
Richard Levittee39795a2020-03-03 00:01:35 +01001113# If no target was given, try guessing.
1114unless ($target) {
Richard Levitte18062612020-03-03 15:04:42 +01001115 my %system_config = OpenSSL::config::get_platform(%guess_opts, %user);
Richard Levittee39795a2020-03-03 00:01:35 +01001116
1117 # The $system_config{disable} is used to populate %disabled with
1118 # entries that aren't already there.
1119 foreach ( @{$system_config{disable} // []} ) {
1120 $disabled{$_} = 'system' unless defined $disabled{$_};
1121 }
1122 delete $system_config{disable};
1123
1124 # Override config entries with stuff from the guesser.
1125 # It's assumed that this really is nothing new.
1126 %config = ( %config, %system_config );
1127 $target = $system_config{target};
1128}
1129
Richard Levitte71ef78d2019-04-23 09:41:19 +02001130sub disable {
1131 my $disable_type = shift;
1132
1133 for (@_) {
1134 $disabled{$_} = $disable_type;
1135 }
1136
1137 my @tocheckfor = (@_ ? @_ : keys %disabled);
1138 while (@tocheckfor) {
1139 my %new_tocheckfor = ();
1140 my @cascade_copy = (@disable_cascades);
1141 while (@cascade_copy) {
1142 my ($test, $descendents) =
1143 (shift @cascade_copy, shift @cascade_copy);
1144 if (ref($test) eq "CODE" ? $test->() : defined($disabled{$test})) {
1145 foreach (grep { !defined($disabled{$_}) } @$descendents) {
1146 $new_tocheckfor{$_} = 1; $disabled{$_} = "cascade";
1147 }
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001148 }
1149 }
Richard Levitte71ef78d2019-04-23 09:41:19 +02001150 @tocheckfor = (keys %new_tocheckfor);
Richard Levittec569e202015-05-18 11:03:47 +02001151 }
Richard Levittec569e202015-05-18 11:03:47 +02001152}
Richard Levitte71ef78d2019-04-23 09:41:19 +02001153disable(); # First cascade run
Ben Laurieedc032b2011-03-12 17:01:19 +00001154
Richard Levitted63c12c2016-08-31 19:47:35 +02001155our $die = sub { die @_; };
Bodo Möller436a3761999-05-28 23:18:51 +00001156if ($target eq "TABLE") {
Richard Levitted63c12c2016-08-31 19:47:35 +02001157 local $die = sub { warn @_; };
Richard Levitte00ae96c2015-05-18 12:53:38 +02001158 foreach (sort keys %table) {
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001159 print_table_entry($_, "TABLE");
Richard Levitte00ae96c2015-05-18 12:53:38 +02001160 }
1161 exit 0;
Bodo Möller436a3761999-05-28 23:18:51 +00001162}
1163
Ulf Möller10a926c2000-02-21 00:55:45 +00001164if ($target eq "LIST") {
Richard Levitte00ae96c2015-05-18 12:53:38 +02001165 foreach (sort keys %table) {
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001166 print $_,"\n" unless $table{$_}->{template};
Richard Levitte00ae96c2015-05-18 12:53:38 +02001167 }
1168 exit 0;
Ulf Möller10a926c2000-02-21 00:55:45 +00001169}
1170
Richard Levitteaaf878c2015-03-06 02:00:21 +01001171if ($target eq "HASH") {
Richard Levitted63c12c2016-08-31 19:47:35 +02001172 local $die = sub { warn @_; };
Richard Levitte00ae96c2015-05-18 12:53:38 +02001173 print "%table = (\n";
1174 foreach (sort keys %table) {
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001175 print_table_entry($_, "HASH");
Richard Levitte00ae96c2015-05-18 12:53:38 +02001176 }
1177 exit 0;
Richard Levitteaaf878c2015-03-06 02:00:21 +01001178}
1179
Dr. Matthias St. Pierre16942e02018-12-07 00:32:43 +01001180print "Configuring OpenSSL version $config{full_version} ";
1181print "for target $target\n";
Richard Levitte64119272016-10-03 17:39:11 +02001182
Richard Levitte51cf8e02018-02-15 18:08:54 +01001183if (scalar(@seed_sources) == 0) {
1184 print "Using os-specific seed configuration\n";
1185 push @seed_sources, 'os';
1186}
Bernd Edlingerddec3322020-05-17 02:08:56 +02001187if (scalar(grep { $_ eq 'egd' } @seed_sources) > 0) {
1188 delete $disabled{'egd'};
1189}
Richard Levitte2805ee12018-08-16 16:01:58 +02001190if (scalar(grep { $_ eq 'none' } @seed_sources) > 0) {
1191 die "Cannot seed with none and anything else" if scalar(@seed_sources) > 1;
1192 warn <<_____ if scalar(@seed_sources) == 1;
Richard Levitte2805ee12018-08-16 16:01:58 +02001193
Dr. Matthias St. Pierrecaa85952018-10-28 12:38:49 +01001194============================== WARNING ===============================
1195You have selected the --with-rand-seed=none option, which effectively
1196disables automatic reseeding of the OpenSSL random generator.
1197All operations depending on the random generator such as creating keys
1198will not work unless the random generator is seeded manually by the
1199application.
1200
1201Please read the 'Note on random number generation' section in the
Richard Levittef828ba02020-04-27 09:08:36 +02001202INSTALL.md instructions and the RAND_DRBG(7) manual page for more
1203details.
Dr. Matthias St. Pierrecaa85952018-10-28 12:38:49 +01001204============================== WARNING ===============================
1205
Richard Levitte2805ee12018-08-16 16:01:58 +02001206_____
1207}
Richard Levittee0bf7c02018-11-03 18:34:09 +01001208push @{$config{openssl_feature_defines}},
Richard Levitte51cf8e02018-02-15 18:08:54 +01001209 map { (my $x = $_) =~ tr|[\-a-z]|[_A-Z]|; "OPENSSL_RAND_SEED_$x" }
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001210 @seed_sources;
Richard Levitte51cf8e02018-02-15 18:08:54 +01001211
Richard Levitte00ae96c2015-05-18 12:53:38 +02001212# Backward compatibility?
Richard Levitte49e04542002-02-14 12:28:24 +00001213if ($target =~ m/^CygWin32(-.*)$/) {
Richard Levitte00ae96c2015-05-18 12:53:38 +02001214 $target = "Cygwin".$1;
Richard Levitte49e04542002-02-14 12:28:24 +00001215}
1216
Richard Levitte906eb3d2017-06-22 00:47:49 +02001217# Support for legacy targets having a name starting with 'debug-'
1218my ($d, $t) = $target =~ m/^(debug-)?(.*)$/;
1219if ($d) {
1220 $config{build_type} = "debug";
1221
1222 # If we do not find debug-foo in the table, the target is set to foo.
1223 if (!$table{$target}) {
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001224 $target = $t;
Richard Levitte906eb3d2017-06-22 00:47:49 +02001225 }
1226}
Richard Levitte4e360442018-08-07 12:38:16 +02001227
Richard Levitte081436b2020-03-03 00:06:52 +01001228if ($target) {
1229 # It's possible that we have different config targets for specific
1230 # toolchains, so we try to detect them, and go for the plain config
1231 # target if not.
1232 my $found;
1233 foreach ( ( "$target-$user{CC}", "$target", undef ) ) {
1234 $found=$_ if $table{$_} && !$table{$_}->{template};
1235 last if $found;
1236 }
1237 $target = $found;
1238} else {
1239 # If we don't have a config target now, we try the C compiler as we
1240 # fallback
1241 my $cc = $user{CC} // 'cc';
1242 $target = $cc if $table{$cc} && !$table{$cc}->{template};
1243}
1244
1245&usage unless $target;
Richard Levitte4e360442018-08-07 12:38:16 +02001246
Richard Levitte18062612020-03-03 15:04:42 +01001247exit 0 if $dryrun; # From older 'config'
1248
Richard Levitte906eb3d2017-06-22 00:47:49 +02001249$config{target} = $target;
1250my %target = resolve_config($target);
1251
Richard Levitteabe256e2018-03-06 20:35:30 +01001252foreach (keys %target_attr_translate) {
1253 $target{$target_attr_translate{$_}} = $target{$_}
1254 if $target{$_};
1255 delete $target{$_};
1256}
1257
Richard Levitte793077d2017-12-01 15:40:43 +01001258%target = ( %{$table{DEFAULTS}}, %target );
1259
Richard Levitte906eb3d2017-06-22 00:47:49 +02001260my %conf_files = map { $_ => 1 } (@{$target{_conf_fname_int}});
1261$config{conf_files} = [ sort keys %conf_files ];
Richard Levitte906eb3d2017-06-22 00:47:49 +02001262
Richard Levitte71ef78d2019-04-23 09:41:19 +02001263# Using sub disable within these loops may prove fragile, so we run
1264# a cascade afterwards
Richard Levitte906eb3d2017-06-22 00:47:49 +02001265foreach my $feature (@{$target{disable}}) {
1266 if (exists $deprecated_disablables{$feature}) {
1267 warn "***** config $target disables deprecated feature $feature\n";
1268 } elsif (!grep { $feature eq $_ } @disablables) {
1269 die "***** config $target disables unknown feature $feature\n";
1270 }
1271 $disabled{$feature} = 'config';
1272}
1273foreach my $feature (@{$target{enable}}) {
Richard Levitte7a8a35f2018-12-12 09:27:48 +01001274 if ("default" eq ($disabled{$feature} // "")) {
Richard Levitte906eb3d2017-06-22 00:47:49 +02001275 if (exists $deprecated_disablables{$feature}) {
1276 warn "***** config $target enables deprecated feature $feature\n";
1277 } elsif (!grep { $feature eq $_ } @disablables) {
1278 die "***** config $target enables unknown feature $feature\n";
1279 }
Richard Levitte7a8a35f2018-12-12 09:27:48 +01001280 delete $disabled{$feature};
Richard Levitte906eb3d2017-06-22 00:47:49 +02001281 }
1282}
Richard Levitteb19fe712019-06-16 12:37:21 +02001283
1284# If uplink_arch isn't defined, disable uplink
1285$disabled{uplink} = 'no uplink_arch' unless (defined $target{uplink_arch});
Richard Levittee6f98ae2019-06-16 13:32:58 +02001286# If asm_arch isn't defined, disable asm
1287$disabled{asm} = 'no asm_arch' unless (defined $target{asm_arch});
Richard Levitteb19fe712019-06-16 12:37:21 +02001288
Richard Levitte71ef78d2019-04-23 09:41:19 +02001289disable(); # Run a cascade now
Richard Levitte906eb3d2017-06-22 00:47:49 +02001290
Richard Levitteabe256e2018-03-06 20:35:30 +01001291$target{CXXFLAGS}//=$target{CFLAGS} if $target{CXX};
1292$target{cxxflags}//=$target{cflags} if $target{CXX};
Richard Levitte9dd4ed22018-10-23 15:09:57 +02001293$target{exe_extension}=".exe" if ($config{target} eq "DJGPP");
Richard Levitte107b5792015-05-20 20:03:20 +02001294$target{exe_extension}=".pm" if ($config{target} =~ /vos/);
Richard Levittee987f9f2016-02-15 17:20:15 +01001295
Richard Levitte9e265322018-07-08 12:00:06 +02001296# Fill %config with values from %user, and in case those are undefined or
1297# empty, use values from %target (acting as a default).
Richard Levitte5b182352018-01-26 19:56:44 +01001298foreach (keys %user) {
Richard Levitte5b182352018-01-26 19:56:44 +01001299 my $ref_type = ref $user{$_};
1300
1301 # Temporary function. Takes an intended ref type (empty string or "ARRAY")
1302 # and a value that's to be coerced into that type.
1303 my $mkvalue = sub {
1304 my $type = shift;
1305 my $value = shift;
1306 my $undef_p = shift;
1307
1308 die "Too many arguments for \$mkvalue" if @_;
1309
1310 while (ref $value eq 'CODE') {
1311 $value = $value->();
1312 }
1313
1314 if ($type eq 'ARRAY') {
1315 return undef unless defined $value;
1316 return undef if ref $value ne 'ARRAY' && !$value;
1317 return undef if ref $value eq 'ARRAY' && !@$value;
1318 return [ $value ] unless ref $value eq 'ARRAY';
1319 }
1320 return undef unless $value;
1321 return $value;
1322 };
1323
Richard Levitteabe256e2018-03-06 20:35:30 +01001324 $config{$_} =
Richard Levitte5b182352018-01-26 19:56:44 +01001325 $mkvalue->($ref_type, $user{$_})
Richard Levitteabe256e2018-03-06 20:35:30 +01001326 || $mkvalue->($ref_type, $target{$_});
1327 delete $config{$_} unless defined $config{$_};
Richard Levitte5b182352018-01-26 19:56:44 +01001328}
Richard Levitteaaf878c2015-03-06 02:00:21 +01001329
Richard Levittec1a09252019-04-23 09:24:38 +02001330# Finish up %config by appending things the user gave us on the command line
1331# apart from "make variables"
1332foreach (keys %useradd) {
1333 # The must all be lists, so we assert that here
1334 die "internal error: \$useradd{$_} isn't an ARRAY\n"
1335 unless ref $useradd{$_} eq 'ARRAY';
1336
1337 if (defined $config{$_}) {
1338 push @{$config{$_}}, @{$useradd{$_}};
1339 } else {
1340 $config{$_} = [ @{$useradd{$_}} ];
1341 }
1342}
1343# At this point, we can forget everything about %user and %useradd,
1344# because it's now all been merged into the corresponding $config entry
1345
Richard Levitte8b5156d2016-08-29 21:45:19 +02001346# Allow overriding the build file name
Richard Levitte5b182352018-01-26 19:56:44 +01001347$config{build_file} = env('BUILDFILE') || $target{build_file} || "Makefile";
Richard Levitteaaf878c2015-03-06 02:00:21 +01001348
Richard Levitte291e94d2015-05-18 22:35:23 +02001349# Make sure build_scheme is consistent.
1350$target{build_scheme} = [ $target{build_scheme} ]
1351 if ref($target{build_scheme}) ne "ARRAY";
Richard Levitted0d046e2002-01-27 15:52:37 +00001352
Richard Levitteddf18472016-01-30 00:57:33 +01001353my ($builder, $builder_platform, @builder_opts) =
1354 @{$target{build_scheme}};
1355
Richard Levitted192a3a2017-03-05 21:51:18 +01001356foreach my $checker (($builder_platform."-".$target{build_file}."-checker.pm",
1357 $builder_platform."-checker.pm")) {
1358 my $checker_path = catfile($srcdir, "Configurations", $checker);
1359 if (-f $checker_path) {
1360 my $fn = $ENV{CONFIGURE_CHECKER_WARN}
1361 ? sub { warn $@; } : sub { die $@; };
1362 if (! do $checker_path) {
1363 if ($@) {
1364 $fn->($@);
1365 } elsif ($!) {
1366 $fn->($!);
1367 } else {
1368 $fn->("The detected tools didn't match the platform\n");
1369 }
1370 }
1371 last;
1372 }
1373}
1374
Richard Levitte488e2b02016-04-01 16:03:46 +02001375push @{$config{defines}}, "NDEBUG" if $config{build_type} eq "release";
1376
Richard Levitteabe256e2018-03-06 20:35:30 +01001377if ($target =~ /^mingw/ && `$config{CC} --target-help 2>&1` =~ m/-mno-cygwin/m)
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001378 {
1379 push @{$config{cflags}}, "-mno-cygwin";
1380 push @{$config{cxxflags}}, "-mno-cygwin" if $config{CXX};
1381 push @{$config{shared_ldflag}}, "-mno-cygwin";
1382 }
Andy Polyakovcbecd292010-11-30 22:18:02 +00001383
Richard Levitte5b182352018-01-26 19:56:44 +01001384if ($target =~ /linux.*-mips/ && !$disabled{asm}
Richard Levittec1a09252019-04-23 09:24:38 +02001385 && !grep { $_ !~ /-m(ips|arch=)/ } (@{$config{CFLAGS}})) {
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001386 # minimally required architecture flags for assembly modules
1387 my $value;
1388 $value = '-mips2' if ($target =~ /mips32/);
1389 $value = '-mips3' if ($target =~ /mips64/);
1390 unshift @{$config{cflags}}, $value;
1391 unshift @{$config{cxxflags}}, $value if $config{CXX};
Andy Polyakov63d88342012-09-15 11:21:50 +00001392}
1393
Richard Levitte9c62a272016-02-27 16:51:34 +01001394# If threads aren't disabled, check how possible they are
1395unless ($disabled{threads}) {
1396 if ($auto_threads) {
1397 # Enabled by default, disable it forcibly if unavailable
1398 if ($target{thread_scheme} eq "(unknown)") {
Richard Levitte71ef78d2019-04-23 09:41:19 +02001399 disable("unavailable", 'threads');
Richard Levitte9c62a272016-02-27 16:51:34 +01001400 }
1401 } else {
FdaSilvaYY8483a002016-03-10 21:34:48 +01001402 # The user chose to enable threads explicitly, let's see
Richard Levitte9c62a272016-02-27 16:51:34 +01001403 # if there's a chance that's possible
1404 if ($target{thread_scheme} eq "(unknown)") {
1405 # If the user asked for "threads" and we don't have internal
1406 # knowledge how to do it, [s]he is expected to provide any
1407 # system-dependent compiler options that are necessary. We
1408 # can't truly check that the given options are correct, but
1409 # we expect the user to know what [s]He is doing.
Richard Levittec1a09252019-04-23 09:24:38 +02001410 if (!@{$config{CFLAGS}} && !@{$config{CPPDEFINES}}) {
Richard Levitte9c62a272016-02-27 16:51:34 +01001411 die "You asked for multi-threading support, but didn't\n"
1412 ,"provide any system-specific compiler options\n";
1413 }
1414 }
1415 }
1416}
1417
Richard Levittebacc3082019-04-17 22:30:03 +02001418# Find out if clang's sanitizers have been enabled with -fsanitize
1419# flags and ensure that the corresponding %disabled elements area
1420# removed to reflect that the sanitizers are indeed enabled.
1421my %detected_sanitizers = ();
1422foreach (grep /^-fsanitize=/, @{$config{CFLAGS} || []}) {
1423 (my $checks = $_) =~ s/^-fsanitize=//;
1424 foreach (split /,/, $checks) {
1425 my $d = { address => 'asan',
1426 undefined => 'ubsan',
1427 memory => 'msan' } -> {$_};
1428 next unless defined $d;
1429
1430 $detected_sanitizers{$d} = 1;
1431 if (defined $disabled{$d}) {
1432 die "***** Conflict between disabling $d and enabling $_ sanitizer"
1433 if $disabled{$d} ne "default";
1434 delete $disabled{$d};
1435 }
1436 }
1437}
1438
Richard Levitte9c62a272016-02-27 16:51:34 +01001439# If threads still aren't disabled, add a C macro to ensure the source
1440# code knows about it. Any other flag is taken care of by the configs.
1441unless($disabled{threads}) {
Richard Levittee0bf7c02018-11-03 18:34:09 +01001442 push @{$config{openssl_feature_defines}}, "OPENSSL_THREADS";
Richard Levitte9c62a272016-02-27 16:51:34 +01001443}
Richard Levittee452de92001-07-12 09:11:14 +00001444
Richard Levitte8c3bc592018-01-23 13:54:55 +01001445my $no_shared_warn=0;
Richard Levitte291e94d2015-05-18 22:35:23 +02001446if ($target{shared_target} eq "")
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001447 {
1448 $no_shared_warn = 1
1449 if (!$disabled{shared} || !$disabled{"dynamic-engine"});
Richard Levitte71ef78d2019-04-23 09:41:19 +02001450 disable('no-shared-target', 'pic');
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001451 }
Richard Levitteb436a982000-07-21 15:08:53 +00001452
Richard Levitte19ab5792016-02-22 02:06:05 +01001453if ($disabled{"dynamic-engine"}) {
Richard Levitte343ec2b2016-02-19 22:08:37 +01001454 $config{dynamic_engines} = 0;
Richard Levitte19ab5792016-02-22 02:06:05 +01001455} else {
Richard Levitte19ab5792016-02-22 02:06:05 +01001456 $config{dynamic_engines} = 1;
Richard Levitte343ec2b2016-02-19 22:08:37 +01001457}
Richard Levitteecd45312002-10-11 18:06:08 +00001458
Richard Levittebacc3082019-04-17 22:30:03 +02001459unless ($disabled{asan} || defined $detected_sanitizers{asan}) {
Richard Levitte5b182352018-01-26 19:56:44 +01001460 push @{$config{cflags}}, "-fsanitize=address";
Ben Lauriec38bb722016-03-26 17:19:14 +00001461}
1462
Richard Levittebacc3082019-04-17 22:30:03 +02001463unless ($disabled{ubsan} || defined $detected_sanitizers{ubsan}) {
FdaSilvaYYf430ba32016-06-19 19:39:01 +02001464 # -DPEDANTIC or -fnosanitize=alignment may also be required on some
Ben Lauriec38bb722016-03-26 17:19:14 +00001465 # platforms.
Richard Levitte5b182352018-01-26 19:56:44 +01001466 push @{$config{cflags}}, "-fsanitize=undefined", "-fno-sanitize-recover=all";
Ben Lauriec38bb722016-03-26 17:19:14 +00001467}
1468
Richard Levittebacc3082019-04-17 22:30:03 +02001469unless ($disabled{msan} || defined $detected_sanitizers{msan}) {
Richard Levitte5b182352018-01-26 19:56:44 +01001470 push @{$config{cflags}}, "-fsanitize=memory";
Emilia Kasper29df3062016-07-28 20:24:28 +02001471}
1472
Richard Levitte65cc6d52016-06-05 10:59:31 +02001473unless ($disabled{"fuzz-libfuzzer"} && $disabled{"fuzz-afl"}
Emilia Kasper29df3062016-07-28 20:24:28 +02001474 && $disabled{asan} && $disabled{ubsan} && $disabled{msan}) {
Richard Levitte5b182352018-01-26 19:56:44 +01001475 push @{$config{cflags}}, "-fno-omit-frame-pointer", "-g";
Richard Levitteabe256e2018-03-06 20:35:30 +01001476 push @{$config{cxxflags}}, "-fno-omit-frame-pointer", "-g" if $config{CXX};
Ben Lauriec38bb722016-03-26 17:19:14 +00001477}
Andy Polyakovc313e322007-09-16 12:23:47 +00001478#
1479# Platform fix-ups
1480#
Richard Levitteae482422016-02-22 02:09:11 +01001481
1482# This saves the build files from having to check
1483if ($disabled{pic})
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001484 {
1485 foreach (qw(shared_cflag shared_cxxflag shared_cppflag
1486 shared_defines shared_includes shared_ldflag
1487 module_cflags module_cxxflags module_cppflags
1488 module_defines module_includes module_lflags))
1489 {
1490 delete $config{$_};
1491 $target{$_} = "";
1492 }
1493 }
Richard Levitte4f160392016-02-21 20:52:39 +01001494else
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001495 {
1496 push @{$config{lib_defines}}, "OPENSSL_PIC";
1497 }
Richard Levitteae482422016-02-22 02:09:11 +01001498
Richard Levitte291e94d2015-05-18 22:35:23 +02001499if ($target{sys_id} ne "")
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001500 {
1501 push @{$config{openssl_sys_defines}}, "OPENSSL_SYS_$target{sys_id}";
1502 }
Richard Levittecf1b7d92001-02-19 16:06:34 +00001503
Richard Levittee373c702019-02-26 09:32:52 +01001504my %predefined_C = compiler_predefined($config{CROSS_COMPILE}.$config{CC});
1505my %predefined_CXX = $config{CXX}
1506 ? compiler_predefined($config{CROSS_COMPILE}.$config{CXX})
1507 : ();
Andy Polyakov54cf3b92017-08-29 15:47:08 +02001508
Andy Polyakov09840412019-05-05 18:30:55 +02001509unless ($disabled{asm}) {
1510 # big endian systems can use ELFv2 ABI
1511 if ($target eq "linux-ppc64") {
1512 $target{perlasm_scheme} = "linux64v2" if ($predefined_C{_CALL_ELF} == 2);
1513 }
1514}
1515
Richard Levittefe191b42017-12-11 20:54:07 +01001516# Check for makedepend capabilities.
Richard Levitte6d75a832017-11-06 17:11:03 +01001517if (!$disabled{makedepend}) {
Richard Levittefe191b42017-12-11 20:54:07 +01001518 if ($config{target} =~ /^(VC|vms)-/) {
1519 # For VC- and vms- targets, there's nothing more to do here. The
1520 # functionality is hard coded in the corresponding build files for
1521 # cl (Windows) and CC/DECC (VMS).
Richard Levittee373c702019-02-26 09:32:52 +01001522 } elsif (($predefined_C{__GNUC__} // -1) >= 3
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001523 && !($predefined_C{__APPLE_CC__} && !$predefined_C{__clang__})) {
Richard Levittefe191b42017-12-11 20:54:07 +01001524 # We know that GNU C version 3 and up as well as all clang
Todd Short717f3082018-05-03 11:17:49 -04001525 # versions support dependency generation, but Xcode did not
1526 # handle $cc -M before clang support (but claims __GNUC__ = 3)
Richard Levitteabe256e2018-03-06 20:35:30 +01001527 $config{makedepprog} = "\$(CROSS_COMPILE)$config{CC}";
Richard Levitte6d75a832017-11-06 17:11:03 +01001528 } else {
Richard Levittefe191b42017-12-11 20:54:07 +01001529 # In all other cases, we look for 'makedepend', and disable the
1530 # capability if not found.
Richard Levitte6d75a832017-11-06 17:11:03 +01001531 $config{makedepprog} = which('makedepend');
Richard Levitte71ef78d2019-04-23 09:41:19 +02001532 disable('unavailable', 'makedepend') unless $config{makedepprog};
Andy Polyakov54cf3b92017-08-29 15:47:08 +02001533 }
Rich Salzf1f07a22016-01-29 19:50:28 -05001534}
Richard Levitte8ed40b82016-01-27 19:03:13 +01001535
Richard Levittee373c702019-02-26 09:32:52 +01001536if (!$disabled{asm} && !$predefined_C{__MACH__} && $^O ne 'VMS') {
Andy Polyakov0ad40782018-05-04 14:06:44 +02001537 # probe for -Wa,--noexecstack option...
Richard Levittee373c702019-02-26 09:32:52 +01001538 if ($predefined_C{__clang__}) {
Andy Polyakov0ad40782018-05-04 14:06:44 +02001539 # clang has builtin assembler, which doesn't recognize --help,
1540 # but it apparently recognizes the option in question on all
1541 # supported platforms even when it's meaningless. In other words
1542 # probe would fail, but probed option always accepted...
1543 push @{$config{cflags}}, "-Wa,--noexecstack", "-Qunused-arguments";
Andy Polyakov8e5da572018-08-17 14:29:59 +02001544 } else {
Andy Polyakov0ad40782018-05-04 14:06:44 +02001545 my $cc = $config{CROSS_COMPILE}.$config{CC};
1546 open(PIPE, "$cc -Wa,--help -c -o null.$$.o -x assembler /dev/null 2>&1 |");
1547 while(<PIPE>) {
1548 if (m/--noexecstack/) {
1549 push @{$config{cflags}}, "-Wa,--noexecstack";
1550 last;
1551 }
1552 }
1553 close(PIPE);
1554 unlink("null.$$.o");
1555 }
1556}
Richard Levitte7d130f62015-05-19 01:40:54 +02001557
1558# Deal with bn_ops ###################################################
1559
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001560$config{bn_ll} =0;
Richard Levitte7d130f62015-05-19 01:40:54 +02001561my $def_int="unsigned int";
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001562$config{rc4_int} =$def_int;
Rich Salzb4f35e52016-01-23 13:23:25 -05001563($config{b64l},$config{b64},$config{b32})=(0,0,1);
Richard Levitte7d130f62015-05-19 01:40:54 +02001564
Rich Salz94af0cd2016-01-28 10:13:21 -05001565my $count = 0;
Richard Levitte7d130f62015-05-19 01:40:54 +02001566foreach (sort split(/\s+/,$target{bn_ops})) {
Rich Salz94af0cd2016-01-28 10:13:21 -05001567 $count++ if /SIXTY_FOUR_BIT|SIXTY_FOUR_BIT_LONG|THIRTY_TWO_BIT/;
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001568 $config{bn_ll}=1 if $_ eq 'BN_LLONG';
1569 $config{rc4_int}="unsigned char" if $_ eq 'RC4_CHAR';
Rich Salz94af0cd2016-01-28 10:13:21 -05001570 ($config{b64l},$config{b64},$config{b32})
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001571 =(0,1,0) if $_ eq 'SIXTY_FOUR_BIT';
Rich Salz94af0cd2016-01-28 10:13:21 -05001572 ($config{b64l},$config{b64},$config{b32})
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001573 =(1,0,0) if $_ eq 'SIXTY_FOUR_BIT_LONG';
Rich Salz94af0cd2016-01-28 10:13:21 -05001574 ($config{b64l},$config{b64},$config{b32})
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001575 =(0,0,1) if $_ eq 'THIRTY_TWO_BIT';
Richard Levitte7d130f62015-05-19 01:40:54 +02001576}
Rich Salz94af0cd2016-01-28 10:13:21 -05001577die "Exactly one of SIXTY_FOUR_BIT|SIXTY_FOUR_BIT_LONG|THIRTY_TWO_BIT can be set in bn_ops\n"
1578 if $count > 1;
Richard Levitte7d130f62015-05-19 01:40:54 +02001579
Richard Levittea6a4d0a2019-11-05 17:00:33 +01001580$config{api} = $config{major} * 10000 + $config{minor} * 100
1581 unless $config{api};
Richard Levitteb05d6322020-02-06 11:26:22 +01001582foreach (keys %$apitable) {
1583 $disabled{"deprecated-$_"} = "deprecation"
1584 if $disabled{deprecated} && $config{api} >= $apitable->{$_};
1585}
1586
1587disable(); # Run a cascade now
Richard Levitte7d130f62015-05-19 01:40:54 +02001588
1589# Hack cflags for better warnings (dev option) #######################
1590
Richard Levittefa153b52018-01-27 14:56:06 +01001591# "Stringify" the C and C++ flags string. This permits it to be made part of
1592# a string and works as well on command lines.
Richard Levitte5b182352018-01-26 19:56:44 +01001593$config{cflags} = [ map { (my $x = $_) =~ s/([\\\"])/\\$1/g; $x }
1594 @{$config{cflags}} ];
Richard Levittefa153b52018-01-27 14:56:06 +01001595$config{cxxflags} = [ map { (my $x = $_) =~ s/([\\\"])/\\$1/g; $x }
Richard Levitteabe256e2018-03-06 20:35:30 +01001596 @{$config{cxxflags}} ] if $config{CXX};
Richard Levitte1ed0c662002-05-30 18:06:35 +00001597
Richard Levittefcd2d5a2018-11-29 23:05:03 +00001598$config{openssl_api_defines} = [
Richard Levitteb05d6322020-02-06 11:26:22 +01001599 "OPENSSL_CONFIGURED_API=".$config{api},
Richard Levittefcd2d5a2018-11-29 23:05:03 +00001600];
Viktor Dukhovni98186eb2016-01-04 23:00:33 -05001601
Richard Levitte3b437402019-05-27 14:40:25 +02001602my @strict_warnings_collection=();
Dr. Stephen Henson0c28f272009-09-09 16:31:32 +00001603if ($strict_warnings)
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001604 {
1605 my $wopt;
1606 my $gccver = $predefined_C{__GNUC__} // -1;
Andy Polyakov6d505892017-09-21 22:47:12 +02001607
Richard Levitteb4a7b4e2019-10-29 13:37:54 +01001608 if ($gccver >= 4)
1609 {
1610 push @strict_warnings_collection, @gcc_devteam_warn;
1611 push @strict_warnings_collection, @clang_devteam_warn
1612 if (defined($predefined_C{__clang__}));
1613 }
1614 elsif ($config{target} =~ /^VC-/)
1615 {
1616 push @strict_warnings_collection, @cl_devteam_warn;
1617 }
1618 else
1619 {
1620 warn "WARNING --strict-warnings requires gcc[>=4] or gcc-alike, or MSVC"
1621 }
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001622 }
Richard Levitte4650d102019-04-23 09:29:45 +02001623
Richard Levittecf0843c2020-01-17 12:47:44 +01001624if (grep { $_ =~ /(?:^|\s)-static(?:\s|$)/ } @{$config{LDFLAGS}}) {
Richard Levitte71ef78d2019-04-23 09:41:19 +02001625 disable('static', 'pic', 'threads');
Richard Levitte4650d102019-04-23 09:29:45 +02001626}
1627
Richard Levitte3b437402019-05-27 14:40:25 +02001628$config{CFLAGS} = [ map { $_ eq '--ossl-strict-warnings'
1629 ? @strict_warnings_collection
1630 : ( $_ ) }
1631 @{$config{CFLAGS}} ];
Richard Levitteef8ca6b2016-02-14 12:16:52 +01001632
Emilia Kasperc91a0a82016-03-14 12:21:44 +01001633unless ($disabled{afalgeng}) {
1634 $config{afalgeng}="";
Sebastian Andrzej Siewior9e381e82018-01-25 22:50:55 +01001635 if (grep { $_ eq 'afalgeng' } @{$target{enable}}) {
Richard Levitte79fff392016-03-09 09:04:01 +01001636 my $minver = 4*10000 + 1*100 + 0;
Richard Levitteabe256e2018-03-06 20:35:30 +01001637 if ($config{CROSS_COMPILE} eq "") {
Richard Levitte79fff392016-03-09 09:04:01 +01001638 my $verstr = `uname -r`;
1639 my ($ma, $mi1, $mi2) = split("\\.", $verstr);
1640 ($mi2) = $mi2 =~ /(\d+)/;
1641 my $ver = $ma*10000 + $mi1*100 + $mi2;
1642 if ($ver < $minver) {
Richard Levitte71ef78d2019-04-23 09:41:19 +02001643 disable('too-old-kernel', 'afalgeng');
Richard Levitte79fff392016-03-09 09:04:01 +01001644 } else {
1645 push @{$config{engdirs}}, "afalg";
1646 }
Matt Caswell68dc37c2016-03-16 10:08:53 +00001647 } else {
Richard Levitte71ef78d2019-04-23 09:41:19 +02001648 disable('cross-compiling', 'afalgeng');
clucey6cba4a62016-02-23 08:01:01 +00001649 }
Richard Levitte79fff392016-03-09 09:04:01 +01001650 } else {
Richard Levitte71ef78d2019-04-23 09:41:19 +02001651 disable('not-linux', 'afalgeng');
clucey7f458a42016-02-17 13:38:36 +00001652 }
1653}
Matt Caswell8da00a32016-02-29 13:36:47 +00001654
Richard Levitte76d0a742019-12-04 00:14:02 +01001655unless ($disabled{devcryptoeng}) {
1656 if ($target =~ m/^BSD/) {
1657 my $maxver = 5*100 + 7;
1658 my $sysstr = `uname -s`;
1659 my $verstr = `uname -r`;
1660 $sysstr =~ s|\R$||;
1661 $verstr =~ s|\R$||;
1662 my ($ma, $mi, @rest) = split m|\.|, $verstr;
1663 my $ver = $ma*100 + $mi;
1664 if ($sysstr eq 'OpenBSD' && $ver >= $maxver) {
1665 disable('too-new-kernel', 'devcryptoeng');
1666 }
1667 }
1668}
1669
Boris Pismenny69495e32018-02-01 14:10:22 +02001670unless ($disabled{ktls}) {
1671 $config{ktls}="";
1672 if ($target =~ m/^linux/) {
1673 my $usr = "/usr/$config{cross_compile_prefix}";
1674 chop($usr);
1675 if ($config{cross_compile_prefix} eq "") {
1676 $usr = "/usr";
1677 }
1678 my $minver = (4 << 16) + (13 << 8) + 0;
1679 my @verstr = split(" ",`cat $usr/include/linux/version.h | grep LINUX_VERSION_CODE`);
1680
1681 if ($verstr[2] < $minver) {
Richard Levitte71ef78d2019-04-23 09:41:19 +02001682 disable('too-old-kernel', 'ktls');
Boris Pismenny69495e32018-02-01 14:10:22 +02001683 }
Andrew Gallatin2111f5c2018-10-22 11:02:19 -04001684 } elsif ($target =~ m/^BSD/) {
1685 my $cc = $config{CROSS_COMPILE}.$config{CC};
1686 system("printf '#include <sys/types.h>\n#include <sys/ktls.h>' | $cc -E - >/dev/null 2>&1");
1687 if ($? != 0) {
1688 disable('too-old-freebsd', 'ktls');
1689 }
Boris Pismenny69495e32018-02-01 14:10:22 +02001690 } else {
Andrew Gallatin2111f5c2018-10-22 11:02:19 -04001691 disable('not-linux-or-freebsd', 'ktls');
Boris Pismenny69495e32018-02-01 14:10:22 +02001692 }
1693}
1694
1695push @{$config{openssl_other_defines}}, "OPENSSL_NO_KTLS" if ($disabled{ktls});
1696
Richard Levitte8f0dd6d2019-04-30 10:33:55 +02001697# Get the extra flags used when building shared libraries and modules. We
1698# do this late because some of them depend on %disabled.
1699
1700# Make the flags to build DSOs the same as for shared libraries unless they
1701# are already defined
1702$target{module_cflags} = $target{shared_cflag} unless defined $target{module_cflags};
1703$target{module_cxxflags} = $target{shared_cxxflag} unless defined $target{module_cxxflags};
1704$target{module_ldflags} = $target{shared_ldflag} unless defined $target{module_ldflags};
1705{
1706 my $shared_info_pl =
1707 catfile(dirname($0), "Configurations", "shared-info.pl");
1708 my %shared_info = read_eval_file($shared_info_pl);
1709 push @{$target{_conf_fname_int}}, $shared_info_pl;
1710 my $si = $target{shared_target};
1711 while (ref $si ne "HASH") {
1712 last if ! defined $si;
1713 if (ref $si eq "CODE") {
1714 $si = $si->();
1715 } else {
1716 $si = $shared_info{$si};
1717 }
1718 }
1719
1720 # Some of the 'shared_target' values don't have any entries in
1721 # %shared_info. That's perfectly fine, AS LONG AS the build file
1722 # template knows how to handle this. That is currently the case for
1723 # Windows and VMS.
1724 if (defined $si) {
1725 # Just as above, copy certain shared_* attributes to the corresponding
1726 # module_ attribute unless the latter is already defined
1727 $si->{module_cflags} = $si->{shared_cflag} unless defined $si->{module_cflags};
1728 $si->{module_cxxflags} = $si->{shared_cxxflag} unless defined $si->{module_cxxflags};
1729 $si->{module_ldflags} = $si->{shared_ldflag} unless defined $si->{module_ldflags};
1730 foreach (sort keys %$si) {
1731 $target{$_} = defined $target{$_}
1732 ? add($si->{$_})->($target{$_})
1733 : $si->{$_};
1734 }
1735 }
1736}
1737
1738# ALL MODIFICATIONS TO %disabled, %config and %target MUST BE DONE FROM HERE ON
Richard Levitte5b182352018-01-26 19:56:44 +01001739
Richard Levitte8c06d712019-12-04 10:55:05 +01001740######################################################################
1741# Build up information for skipping certain directories depending on disabled
1742# features, as well as setting up macros for disabled features.
1743
1744# This is a tentative database of directories to skip. Some entries may not
1745# correspond to anything real, but that's ok, they will simply be ignored.
1746# The actual processing of these entries is done in the build.info lookup
1747# loop further down.
1748#
1749# The key is a Unix formatted path in the source tree, the value is an index
1750# into %disabled_info, so any existing path gets added to a corresponding
1751# 'skipped' entry in there with the list of skipped directories.
1752my %skipdir = ();
1753my %disabled_info = (); # For configdata.pm
1754foreach my $what (sort keys %disabled) {
1755 # There are deprecated disablables that translate to themselves.
1756 # They cause disabling cascades, but should otherwise not regiter.
1757 next if $deprecated_disablables{$what};
Richard Levitteb05d6322020-02-06 11:26:22 +01001758 # The generated $disabled{"deprecated-x.y"} entries are special
1759 # and treated properly elsewhere
1760 next if $what =~ m|^deprecated-|;
Richard Levitte8c06d712019-12-04 10:55:05 +01001761
1762 $config{options} .= " no-$what";
1763
1764 if (!grep { $what eq $_ } ( 'buildtest-c++', 'fips', 'threads', 'shared',
1765 'module', 'pic', 'dynamic-engine', 'makedepend',
1766 'zlib-dynamic', 'zlib', 'sse2', 'legacy' )) {
1767 (my $WHAT = uc $what) =~ s|-|_|g;
1768 my $skipdir = $what;
1769
1770 # fix-up crypto/directory name(s)
1771 $skipdir = "ripemd" if $what eq "rmd160";
1772 $skipdir = "whrlpool" if $what eq "whirlpool";
1773
1774 my $macro = $disabled_info{$what}->{macro} = "OPENSSL_NO_$WHAT";
1775 push @{$config{openssl_feature_defines}}, $macro;
1776
1777 $skipdir{engines} = $what if $what eq 'engine';
1778 $skipdir{"crypto/$skipdir"} = $what
1779 unless $what eq 'async' || $what eq 'err' || $what eq 'dso';
1780 }
1781}
1782
1783if ($disabled{"dynamic-engine"}) {
1784 push @{$config{openssl_feature_defines}}, "OPENSSL_NO_DYNAMIC_ENGINE";
1785} else {
1786 push @{$config{openssl_feature_defines}}, "OPENSSL_NO_STATIC_ENGINE";
1787}
1788
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001789# If we use the unified build, collect information from build.info files
1790my %unified_info = ();
1791
Richard Levitte2b6b6062016-03-10 00:04:04 +01001792my $buildinfo_debug = defined($ENV{CONFIGURE_DEBUG_BUILDINFO});
Richard Levitteddf18472016-01-30 00:57:33 +01001793if ($builder eq "unified") {
Richard Levitte1935a582019-09-09 11:51:01 +02001794 use Text::Template 1.46;
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001795
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001796 sub cleandir {
Richard Levitte2e963842016-02-10 02:00:37 +01001797 my $base = shift;
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001798 my $dir = shift;
Richard Levitte2e963842016-02-10 02:00:37 +01001799 my $relativeto = shift || ".";
1800
1801 $dir = catdir($base,$dir) unless isabsolute($dir);
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001802
Richard Levitteec182ef2016-02-09 10:15:13 +01001803 # Make sure the directories we're building in exists
1804 mkpath($dir);
1805
Richard Levitte2e963842016-02-10 02:00:37 +01001806 my $res = abs2rel(absolutedir($dir), rel2abs($relativeto));
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001807 #print STDERR "DEBUG[cleandir]: $dir , $base => $res\n";
1808 return $res;
1809 }
1810
1811 sub cleanfile {
Richard Levitte2e963842016-02-10 02:00:37 +01001812 my $base = shift;
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001813 my $file = shift;
Richard Levitte2e963842016-02-10 02:00:37 +01001814 my $relativeto = shift || ".";
1815
1816 $file = catfile($base,$file) unless isabsolute($file);
1817
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001818 my $d = dirname($file);
1819 my $f = basename($file);
1820
Richard Levitteec182ef2016-02-09 10:15:13 +01001821 # Make sure the directories we're building in exists
1822 mkpath($d);
1823
Richard Levitte2e963842016-02-10 02:00:37 +01001824 my $res = abs2rel(catfile(absolutedir($d), $f), rel2abs($relativeto));
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001825 #print STDERR "DEBUG[cleanfile]: $d , $f => $res\n";
1826 return $res;
1827 }
1828
Richard Levitte1967a422016-09-15 23:55:24 +02001829 # Store the name of the template file we will build the build file from
1830 # in %config. This may be useful for the build file itself.
1831 my @build_file_template_names =
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001832 ( $builder_platform."-".$target{build_file}.".tmpl",
1833 $target{build_file}.".tmpl" );
Richard Levitte1967a422016-09-15 23:55:24 +02001834 my @build_file_templates = ();
1835
1836 # First, look in the user provided directory, if given
Richard Levitte7ecdf182017-11-29 13:09:01 +01001837 if (defined env($local_config_envname)) {
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001838 @build_file_templates =
1839 map {
1840 if ($^O eq 'VMS') {
1841 # VMS environment variables are logical names,
1842 # which can be used as is
1843 $local_config_envname . ':' . $_;
1844 } else {
1845 catfile(env($local_config_envname), $_);
1846 }
1847 }
1848 @build_file_template_names;
Richard Levitte1967a422016-09-15 23:55:24 +02001849 }
1850 # Then, look in our standard directory
1851 push @build_file_templates,
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001852 ( map { cleanfile($srcdir, catfile("Configurations", $_), $blddir) }
1853 @build_file_template_names );
Richard Levitte1967a422016-09-15 23:55:24 +02001854
1855 my $build_file_template;
1856 for $_ (@build_file_templates) {
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001857 $build_file_template = $_;
Richard Levitte1967a422016-09-15 23:55:24 +02001858 last if -f $build_file_template;
1859
1860 $build_file_template = undef;
1861 }
1862 if (!defined $build_file_template) {
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001863 die "*** Couldn't find any of:\n", join("\n", @build_file_templates), "\n";
Richard Levitte1967a422016-09-15 23:55:24 +02001864 }
1865 $config{build_file_templates}
Richard Levitte82589752018-04-11 13:13:22 +02001866 = [ cleanfile($srcdir, catfile("Configurations", "common0.tmpl"),
1867 $blddir),
1868 $build_file_template,
Richard Levitte1967a422016-09-15 23:55:24 +02001869 cleanfile($srcdir, catfile("Configurations", "common.tmpl"),
1870 $blddir) ];
1871
Richard Levitte7f73eaf2018-11-03 15:03:59 +01001872 my @build_dirs = ( [ ] ); # current directory
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001873
Richard Levitte2e0956b2016-02-28 01:13:17 +01001874 $config{build_infos} = [ ];
1875
Richard Levitted201dbc2017-12-28 16:03:17 +01001876 my %ordinals = ();
Richard Levitte7f73eaf2018-11-03 15:03:59 +01001877 while (@build_dirs) {
1878 my @curd = @{shift @build_dirs};
1879 my $sourced = catdir($srcdir, @curd);
1880 my $buildd = catdir($blddir, @curd);
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001881
Richard Levitte75d47db2018-11-03 18:38:04 +01001882 my $unixdir = join('/', @curd);
1883 if (exists $skipdir{$unixdir}) {
1884 my $what = $skipdir{$unixdir};
1885 push @{$disabled_info{$what}->{skipped}}, catdir(@curd);
1886 next;
1887 }
1888
Richard Levittedca99382016-02-08 16:27:15 +01001889 mkpath($buildd);
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001890
Richard Levitte7f73eaf2018-11-03 15:03:59 +01001891 my $f = 'build.info';
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001892 # The basic things we're trying to build
1893 my @programs = ();
1894 my @libraries = ();
Richard Levitte1842f362019-01-31 00:06:50 +01001895 my @modules = ();
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001896 my @scripts = ();
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001897
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001898 my %sources = ();
Richard Levitte2a08d1a2016-03-29 16:45:03 +02001899 my %shared_sources = ();
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001900 my %includes = ();
Richard Levitteb96ab5e2016-10-14 16:56:34 +02001901 my %defines = ();
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001902 my %depends = ();
Richard Levitteae4c7452016-03-07 14:37:00 +01001903 my %generate = ();
Richard Levitte829f86b2016-08-31 22:54:39 +02001904 my %htmldocs = ();
1905 my %mandocs = ();
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001906
Richard Levitte26fe9b02019-06-12 12:03:31 +02001907 # Support for $variablename in build.info files.
1908 # Embedded perl code is the ultimate master, still. If its output
1909 # contains a dollar sign, it had better be escaped, or it will be
1910 # taken for a variable name prefix.
1911 my %variables = ();
Richard Levittee4292172020-02-26 14:35:17 +01001912 # Variable name syntax
1913 my $variable_name_re = qr/(?P<VARIABLE>[[:alpha:]][[:alnum:]_]*)/;
1914 # Value modifier syntaxes
1915 my $variable_subst_re = qr/\/(?P<RE>(?:\\\/|.)*?)\/(?P<SUBST>.*?)/;
Richard Levitte4975e8b2020-05-05 16:53:43 +02001916 # Variable reference
1917 my $variable_simple_re = qr/(?<!\\)\$${variable_name_re}/;
1918 my $variable_w_mod_re =
1919 qr/(?<!\\)\$\{${variable_name_re}(?P<MOD>(?:\\\/|.)*?)\}/;
1920 # Tie it all together
1921 my $variable_re = qr/${variable_simple_re}|${variable_w_mod_re}/;
1922
Richard Levitte26fe9b02019-06-12 12:03:31 +02001923 my $expand_variables = sub {
1924 my $value = '';
1925 my $value_rest = shift;
1926
Richard Levitte03f30c52019-08-19 08:54:00 +02001927 if ($ENV{CONFIGURE_DEBUG_VARIABLE_EXPAND}) {
1928 print STDERR
Richard Levittee4292172020-02-26 14:35:17 +01001929 "DEBUG[\$expand_variables] Parsed '$value_rest' ...\n"
Richard Levitte03f30c52019-08-19 08:54:00 +02001930 }
Richard Levitte4975e8b2020-05-05 16:53:43 +02001931
1932 while ($value_rest =~ /${variable_re}/) {
1933 # We must save important regexp values, because the next
1934 # regexp clears them
1935 my $mod = $+{MOD};
1936 my $variable_value = $variables{$+{VARIABLE}};
1937
Richard Levitte26fe9b02019-06-12 12:03:31 +02001938 $value_rest = $';
Richard Levittee4292172020-02-26 14:35:17 +01001939 $value .= $`;
1940
Richard Levittee4292172020-02-26 14:35:17 +01001941 # Process modifier expressions, if present
Richard Levitte4975e8b2020-05-05 16:53:43 +02001942 if (defined $mod) {
1943 if ($mod =~ /^${variable_subst_re}$/) {
1944 my $re = $+{RE};
1945 my $subst = $+{SUBST};
Richard Levittee4292172020-02-26 14:35:17 +01001946
Richard Levitte4975e8b2020-05-05 16:53:43 +02001947 $variable_value =~ s/\Q$re\E/$subst/g;
Richard Levittee4292172020-02-26 14:35:17 +01001948
Richard Levitte4975e8b2020-05-05 16:53:43 +02001949 if ($ENV{CONFIGURE_DEBUG_VARIABLE_EXPAND}) {
1950 print STDERR
1951 "DEBUG[\$expand_variables] ... and substituted ",
1952 "'$re' with '$subst'\n";
1953 }
Richard Levittee4292172020-02-26 14:35:17 +01001954 }
1955 }
1956
1957 $value .= $variable_value;
Richard Levitte26fe9b02019-06-12 12:03:31 +02001958 }
Richard Levitte03f30c52019-08-19 08:54:00 +02001959 if ($ENV{CONFIGURE_DEBUG_VARIABLE_EXPAND}) {
1960 print STDERR
Richard Levittee4292172020-02-26 14:35:17 +01001961 "DEBUG[\$expand_variables] ... into: '$value$value_rest'\n";
Richard Levitte03f30c52019-08-19 08:54:00 +02001962 }
Richard Levitte26fe9b02019-06-12 12:03:31 +02001963 return $value . $value_rest;
1964 };
1965
Richard Levitte285dacc2019-10-03 23:30:58 +02001966 # Support for attributes in build.info files
1967 my %attributes = ();
1968 my $handle_attributes = sub {
1969 my $attr_str = shift;
1970 my $ref = shift;
1971 my @goals = @_;
1972
1973 return unless defined $attr_str;
1974
1975 my @a = tokenize($attr_str, qr|\s*,\s*|);
1976 foreach my $a (@a) {
1977 my $ac = 1;
1978 my $ak = $a;
1979 my $av = 1;
Richard Levitteea4ee1522020-07-02 00:08:45 +02001980 if ($a =~ m|^(!)?(.*?)\s* = \s*(.*?)$|x) {
Richard Levitte285dacc2019-10-03 23:30:58 +02001981 $ac = ! $1;
Richard Levitteea4ee1522020-07-02 00:08:45 +02001982 $ak = $2;
1983 $av = $3;
Richard Levitte285dacc2019-10-03 23:30:58 +02001984 }
1985 foreach my $g (@goals) {
1986 if ($ac) {
1987 $$ref->{$g}->{$ak} = $av;
1988 } else {
1989 delete $$ref->{$g}->{$ak};
1990 }
1991 }
1992 }
1993 };
1994
Richard Levittead5be192020-02-26 14:30:38 +01001995 # Support for pushing values on multiple indexes of a given hash
1996 # array.
1997 my $push_to = sub {
1998 my $valueref = shift;
1999 my $index_str = shift; # May be undef or empty
2000 my $attrref = shift; # May be undef
2001 my $attr_str = shift;
2002 my @values = @_;
2003
2004 if (defined $index_str) {
2005 my @indexes = ( '' );
2006 if ($index_str !~ m|^\s*$|) {
2007 @indexes = tokenize($index_str);
2008 }
2009 foreach (@indexes) {
2010 push @{$valueref->{$_}}, @values;
2011 if (defined $attrref) {
2012 $handle_attributes->($attr_str, \$$attrref->{$_},
2013 @values);
2014 }
2015 }
2016 } else {
2017 push @$valueref, @values;
2018 $handle_attributes->($attr_str, $attrref, @values)
2019 if defined $attrref;
2020 }
2021 };
2022
Richard Levitte846e4c42018-03-08 12:01:28 +01002023 # We want to detect configdata.pm in the source tree, so we
2024 # don't use it if the build tree is different.
2025 my $src_configdata = cleanfile($srcdir, "configdata.pm", $blddir);
2026
Richard Levitte829f86b2016-08-31 22:54:39 +02002027
2028 if ($buildinfo_debug) {
2029 print STDERR "DEBUG: Reading ",catfile($sourced, $f),"\n";
2030 }
Richard Levitte2e0956b2016-02-28 01:13:17 +01002031 push @{$config{build_infos}}, catfile(abs2rel($sourced, $blddir), $f);
Richard Levittecb6afcd2017-08-01 22:10:39 +02002032 my $template =
2033 Text::Template->new(TYPE => 'FILE',
2034 SOURCE => catfile($sourced, $f),
2035 PREPEND => qq{use lib "$FindBin::Bin/util/perl";});
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002036 die "Something went wrong with $sourced/$f: $!\n" unless $template;
2037 my @text =
2038 split /^/m,
2039 $template->fill_in(HASH => { config => \%config,
2040 target => \%target,
Richard Levitte9e04edf2016-02-22 13:45:46 +01002041 disabled => \%disabled,
Kurt Roeckxf59d0132016-05-07 22:09:13 +02002042 withargs => \%withargs,
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002043 builddir => abs2rel($buildd, $blddir),
2044 sourcedir => abs2rel($sourced, $blddir),
2045 buildtop => abs2rel($blddir, $blddir),
2046 sourcetop => abs2rel($srcdir, $blddir) },
2047 DELIMITERS => [ "{-", "-}" ]);
2048
2049 # The top item of this stack has the following values
2050 # -2 positive already run and we found ELSE (following ELSIF should fail)
2051 # -1 positive already run (skip until ENDIF)
2052 # 0 negatives so far (if we're at a condition, check it)
2053 # 1 last was positive (don't skip lines until next ELSE, ELSIF or ENDIF)
2054 # 2 positive ELSE (following ELSIF should fail)
2055 my @skip = ();
Richard Levitte285dacc2019-10-03 23:30:58 +02002056
2057 # A few useful generic regexps
2058 my $index_re = qr/\[\s*(?P<INDEX>(?:\\.|.)*?)\s*\]/;
2059 my $cond_re = qr/\[\s*(?P<COND>(?:\\.|.)*?)\s*\]/;
2060 my $attribs_re = qr/(?:\{\s*(?P<ATTRIBS>(?:\\.|.)*?)\s*\})?/;
2061 my $value_re = qr/\s*(?P<VALUE>.*?)\s*/;
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002062 collect_information(
2063 collect_from_array([ @text ],
2064 qr/\\$/ => sub { my $l1 = shift; my $l2 = shift;
2065 $l1 =~ s/\\$//; $l1.$l2 }),
2066 # Info we're looking for
Richard Levitte285dacc2019-10-03 23:30:58 +02002067 qr/^\s* IF ${cond_re} \s*$/x
Richard Levitte635bd402016-03-09 14:33:37 +01002068 => sub {
Richard Levittec5798e02016-03-09 23:58:44 +01002069 if (! @skip || $skip[$#skip] > 0) {
Richard Levitte285dacc2019-10-03 23:30:58 +02002070 push @skip, !! $expand_variables->($+{COND});
Richard Levitte635bd402016-03-09 14:33:37 +01002071 } else {
2072 push @skip, -1;
2073 }
2074 },
Richard Levitte285dacc2019-10-03 23:30:58 +02002075 qr/^\s* ELSIF ${cond_re} \s*$/x
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002076 => sub { die "ELSIF out of scope" if ! @skip;
2077 die "ELSIF following ELSE" if abs($skip[$#skip]) == 2;
2078 $skip[$#skip] = -1 if $skip[$#skip] != 0;
Richard Levitte285dacc2019-10-03 23:30:58 +02002079 $skip[$#skip] = !! $expand_variables->($+{COND})
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002080 if $skip[$#skip] == 0; },
Richard Levitte285dacc2019-10-03 23:30:58 +02002081 qr/^\s* ELSE \s*$/x
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002082 => sub { die "ELSE out of scope" if ! @skip;
2083 $skip[$#skip] = -2 if $skip[$#skip] != 0;
2084 $skip[$#skip] = 2 if $skip[$#skip] == 0; },
Richard Levitte285dacc2019-10-03 23:30:58 +02002085 qr/^\s* ENDIF \s*$/x
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002086 => sub { die "ENDIF out of scope" if ! @skip;
2087 pop @skip; },
Richard Levitte285dacc2019-10-03 23:30:58 +02002088 qr/^\s* ${variable_re} \s* = ${value_re} $/x
Richard Levitte26fe9b02019-06-12 12:03:31 +02002089 => sub {
2090 if (!@skip || $skip[$#skip] > 0) {
Richard Levitte285dacc2019-10-03 23:30:58 +02002091 $variables{$+{VARIABLE}} = $expand_variables->($+{VALUE});
Richard Levitte26fe9b02019-06-12 12:03:31 +02002092 }
2093 },
Richard Levitte285dacc2019-10-03 23:30:58 +02002094 qr/^\s* SUBDIRS \s* = ${value_re} $/x
Richard Levitte7f73eaf2018-11-03 15:03:59 +01002095 => sub {
2096 if (!@skip || $skip[$#skip] > 0) {
Richard Levitte285dacc2019-10-03 23:30:58 +02002097 foreach (tokenize($expand_variables->($+{VALUE}))) {
Richard Levitte7f73eaf2018-11-03 15:03:59 +01002098 push @build_dirs, [ @curd, splitdir($_, 1) ];
2099 }
2100 }
2101 },
Richard Levitte285dacc2019-10-03 23:30:58 +02002102 qr/^\s* PROGRAMS ${attribs_re} \s* = ${value_re} $/x
Richard Levittead5be192020-02-26 14:30:38 +01002103 => sub { $push_to->(\@programs, undef,
2104 \$attributes{programs}, $+{ATTRIBS},
2105 tokenize($expand_variables->($+{VALUE})))
2106 if !@skip || $skip[$#skip] > 0; },
Richard Levitte285dacc2019-10-03 23:30:58 +02002107 qr/^\s* LIBS ${attribs_re} \s* = ${value_re} $/x
Richard Levittead5be192020-02-26 14:30:38 +01002108 => sub { $push_to->(\@libraries, undef,
2109 \$attributes{libraries}, $+{ATTRIBS},
2110 tokenize($expand_variables->($+{VALUE})))
2111 if !@skip || $skip[$#skip] > 0; },
Richard Levitte285dacc2019-10-03 23:30:58 +02002112 qr/^\s* MODULES ${attribs_re} \s* = ${value_re} $/x
Richard Levittead5be192020-02-26 14:30:38 +01002113 => sub { $push_to->(\@modules, undef,
2114 \$attributes{modules}, $+{ATTRIBS},
2115 tokenize($expand_variables->($+{VALUE})))
2116 if !@skip || $skip[$#skip] > 0; },
Richard Levitte285dacc2019-10-03 23:30:58 +02002117 qr/^\s* SCRIPTS ${attribs_re} \s* = ${value_re} $/x
Richard Levittead5be192020-02-26 14:30:38 +01002118 => sub { $push_to->(\@scripts, undef,
2119 \$attributes{scripts}, $+{ATTRIBS},
2120 tokenize($expand_variables->($+{VALUE})))
2121 if !@skip || $skip[$#skip] > 0; },
Richard Levitte829f86b2016-08-31 22:54:39 +02002122 qr/^\s* HTMLDOCS ${index_re} = ${value_re} $/x
Richard Levittead5be192020-02-26 14:30:38 +01002123 => sub { $push_to->(\%htmldocs, $expand_variables->($+{INDEX}),
2124 undef, undef,
2125 tokenize($expand_variables->($+{VALUE})))
2126 if !@skip || $skip[$#skip] > 0; },
Richard Levitte829f86b2016-08-31 22:54:39 +02002127 qr/^\s* MANDOCS ${index_re} = ${value_re} $/x
Richard Levittead5be192020-02-26 14:30:38 +01002128 => sub { $push_to->(\%mandocs, $expand_variables->($+{INDEX}),
2129 undef, undef,
2130 tokenize($expand_variables->($+{VALUE})))
2131 if !@skip || $skip[$#skip] > 0; },
Richard Levitte285dacc2019-10-03 23:30:58 +02002132 qr/^\s* SOURCE ${index_re} = ${value_re} $/x
Richard Levittead5be192020-02-26 14:30:38 +01002133 => sub { $push_to->(\%sources, $expand_variables->($+{INDEX}),
2134 undef, undef,
2135 tokenize($expand_variables->($+{VALUE})))
2136 if !@skip || $skip[$#skip] > 0; },
Richard Levitte285dacc2019-10-03 23:30:58 +02002137 qr/^\s* SHARED_SOURCE ${index_re} = ${value_re} $/x
Richard Levittead5be192020-02-26 14:30:38 +01002138 => sub { $push_to->(\%shared_sources, $expand_variables->($+{INDEX}),
2139 undef, undef,
2140 tokenize($expand_variables->($+{VALUE})))
2141 if !@skip || $skip[$#skip] > 0; },
Richard Levitte285dacc2019-10-03 23:30:58 +02002142 qr/^\s* INCLUDE ${index_re} = ${value_re} $/x
Richard Levittead5be192020-02-26 14:30:38 +01002143 => sub { $push_to->(\%includes, $expand_variables->($+{INDEX}),
2144 undef, undef,
2145 tokenize($expand_variables->($+{VALUE})))
2146 if !@skip || $skip[$#skip] > 0; },
Richard Levitte285dacc2019-10-03 23:30:58 +02002147 qr/^\s* DEFINE ${index_re} = ${value_re} $/x
Richard Levittead5be192020-02-26 14:30:38 +01002148 => sub { $push_to->(\%defines, $expand_variables->($+{INDEX}),
2149 undef, undef,
2150 tokenize($expand_variables->($+{VALUE})))
2151 if !@skip || $skip[$#skip] > 0; },
Richard Levitte9eba5932019-10-04 00:00:24 +02002152 qr/^\s* DEPEND ${index_re} ${attribs_re} = ${value_re} $/x
Richard Levittead5be192020-02-26 14:30:38 +01002153 => sub { $push_to->(\%depends, $expand_variables->($+{INDEX}),
2154 \$attributes{depends}, $+{ATTRIBS},
2155 tokenize($expand_variables->($+{VALUE})))
2156 if !@skip || $skip[$#skip] > 0; },
Richard Levitte285dacc2019-10-03 23:30:58 +02002157 qr/^\s* GENERATE ${index_re} = ${value_re} $/x
Richard Levittead5be192020-02-26 14:30:38 +01002158 => sub { $push_to->(\%generate, $expand_variables->($+{INDEX}),
2159 undef, undef, $+{VALUE})
2160 if !@skip || $skip[$#skip] > 0; },
Richard Levitte285dacc2019-10-03 23:30:58 +02002161 qr/^\s* (?:\#.*)? $/x => sub { },
Richard Levitte2b6b6062016-03-10 00:04:04 +01002162 "OTHERWISE" => sub { die "Something wrong with this line:\n$_\nat $sourced/$f" },
2163 "BEFORE" => sub {
2164 if ($buildinfo_debug) {
2165 print STDERR "DEBUG: Parsing ",join(" ", @_),"\n";
2166 print STDERR "DEBUG: ... before parsing, skip stack is ",join(" ", map { int($_) } @skip),"\n";
2167 }
2168 },
2169 "AFTER" => sub {
2170 if ($buildinfo_debug) {
2171 print STDERR "DEBUG: .... after parsing, skip stack is ",join(" ", map { int($_) } @skip),"\n";
2172 }
2173 },
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002174 );
2175 die "runaway IF?" if (@skip);
2176
Richard Levitte285dacc2019-10-03 23:30:58 +02002177 if (grep { defined $attributes{modules}->{$_}->{engine} } keys %attributes
Richard Levitte1842f362019-01-31 00:06:50 +01002178 and !$config{dynamic_engines}) {
2179 die <<"EOF"
Richard Levitte19ab5792016-02-22 02:06:05 +01002180ENGINES can only be used if configured with 'dynamic-engine'.
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002181This is usually a fault in a build.info file.
2182EOF
Richard Levitte1842f362019-01-31 00:06:50 +01002183 }
Richard Levittec91f24d2018-11-07 10:44:05 +01002184
Richard Levittec91f24d2018-11-07 10:44:05 +01002185 {
2186 my %infos = ( programs => [ @programs ],
2187 libraries => [ @libraries ],
Richard Levitte1842f362019-01-31 00:06:50 +01002188 modules => [ @modules ],
Richard Levitteda7e31e2019-01-30 19:10:26 +01002189 scripts => [ @scripts ] );
Richard Levittec91f24d2018-11-07 10:44:05 +01002190 foreach my $k (keys %infos) {
2191 foreach (@{$infos{$k}}) {
2192 my $item = cleanfile($buildd, $_, $blddir);
2193 $unified_info{$k}->{$item} = 1;
Richard Levitte285dacc2019-10-03 23:30:58 +02002194
2195 # Fix up associated attributes
2196 $unified_info{attributes}->{$k}->{$item} =
2197 $attributes{$k}->{$_}
2198 if defined $attributes{$k}->{$_};
Richard Levittec91f24d2018-11-07 10:44:05 +01002199 }
2200 }
Richard Levitte8a679462016-03-07 14:50:37 +01002201 }
2202
Richard Levittef5fb6f02018-10-23 15:45:24 +02002203 # Check that we haven't defined any library as both shared and
2204 # explicitly static. That is forbidden.
2205 my @doubles = ();
2206 foreach (grep /\.a$/, keys %{$unified_info{libraries}}) {
2207 (my $l = $_) =~ s/\.a$//;
2208 push @doubles, $l if defined $unified_info{libraries}->{$l};
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002209 }
Richard Levittef5fb6f02018-10-23 15:45:24 +02002210 die "these libraries are both explicitly static and shared:\n ",
2211 join(" ", @doubles), "\n"
2212 if @doubles;
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002213
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002214 foreach (keys %sources) {
2215 my $dest = $_;
Richard Levitte2e963842016-02-10 02:00:37 +01002216 my $ddest = cleanfile($buildd, $_, $blddir);
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002217 foreach (@{$sources{$dest}}) {
Richard Levitte2e963842016-02-10 02:00:37 +01002218 my $s = cleanfile($sourced, $_, $blddir);
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002219
Richard Levitte19cf4402020-02-26 14:42:10 +01002220 # If it's generated or we simply don't find it in the source
2221 # tree, we assume it's in the build tree.
2222 if ($s eq $src_configdata || $generate{$_} || ! -f $s) {
Richard Levitte2e963842016-02-10 02:00:37 +01002223 $s = cleanfile($buildd, $_, $blddir);
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002224 }
Richard Levitteea241952016-10-12 15:30:08 +02002225 # We recognise C++, C and asm files
2226 if ($s =~ /\.(cc|cpp|c|s|S)$/) {
2227 my $o = $_;
2228 $o =~ s/\.[csS]$/.o/; # C and assembler
2229 $o =~ s/\.(cc|cpp)$/_cc.o/; # C++
Richard Levitte2e963842016-02-10 02:00:37 +01002230 $o = cleanfile($buildd, $o, $blddir);
Richard Levittebec2db12018-09-10 02:21:40 +02002231 $unified_info{sources}->{$ddest}->{$o} = -1;
2232 $unified_info{sources}->{$o}->{$s} = -1;
Rich Salz83900622018-03-22 10:21:33 -04002233 } elsif ($s =~ /\.rc$/) {
2234 # We also recognise resource files
2235 my $o = $_;
2236 $o =~ s/\.rc$/.res/; # Resource configuration
2237 my $o = cleanfile($buildd, $o, $blddir);
Richard Levittebec2db12018-09-10 02:21:40 +02002238 $unified_info{sources}->{$ddest}->{$o} = -1;
2239 $unified_info{sources}->{$o}->{$s} = -1;
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002240 } else {
2241 $unified_info{sources}->{$ddest}->{$s} = 1;
2242 }
2243 }
2244 }
2245
Richard Levitte2a08d1a2016-03-29 16:45:03 +02002246 foreach (keys %shared_sources) {
2247 my $dest = $_;
2248 my $ddest = cleanfile($buildd, $_, $blddir);
Richard Levitte2a08d1a2016-03-29 16:45:03 +02002249 foreach (@{$shared_sources{$dest}}) {
2250 my $s = cleanfile($sourced, $_, $blddir);
2251
Richard Levitte19cf4402020-02-26 14:42:10 +01002252 # If it's generated or we simply don't find it in the source
2253 # tree, we assume it's in the build tree.
2254 if ($s eq $src_configdata || $generate{$_} || ! -f $s) {
Richard Levitte2a08d1a2016-03-29 16:45:03 +02002255 $s = cleanfile($buildd, $_, $blddir);
2256 }
Richard Levitteccce3e12017-12-01 15:43:43 +01002257
Richard Levitteea241952016-10-12 15:30:08 +02002258 if ($s =~ /\.(cc|cpp|c|s|S)$/) {
Richard Levitteccce3e12017-12-01 15:43:43 +01002259 # We recognise C++, C and asm files
Richard Levitteea241952016-10-12 15:30:08 +02002260 my $o = $_;
2261 $o =~ s/\.[csS]$/.o/; # C and assembler
2262 $o =~ s/\.(cc|cpp)$/_cc.o/; # C++
Richard Levitte2a08d1a2016-03-29 16:45:03 +02002263 $o = cleanfile($buildd, $o, $blddir);
Richard Levittebec2db12018-09-10 02:21:40 +02002264 $unified_info{shared_sources}->{$ddest}->{$o} = -1;
2265 $unified_info{sources}->{$o}->{$s} = -1;
Richard Levitteccce3e12017-12-01 15:43:43 +01002266 } elsif ($s =~ /\.rc$/) {
2267 # We also recognise resource files
2268 my $o = $_;
2269 $o =~ s/\.rc$/.res/; # Resource configuration
2270 my $o = cleanfile($buildd, $o, $blddir);
Richard Levittebec2db12018-09-10 02:21:40 +02002271 $unified_info{shared_sources}->{$ddest}->{$o} = -1;
2272 $unified_info{sources}->{$o}->{$s} = -1;
Richard Levitteef2dfc92018-09-30 14:44:59 +02002273 } elsif ($s =~ /\.ld$/) {
2274 # We also recognise linker scripts (or corresponding)
Richard Levitteccce3e12017-12-01 15:43:43 +01002275 # We know they are generated files
Richard Levitte05a72c22018-10-04 17:41:51 +02002276 my $ld = cleanfile($buildd, $_, $blddir);
Richard Levitteef2dfc92018-09-30 14:44:59 +02002277 $unified_info{shared_sources}->{$ddest}->{$ld} = 1;
Richard Levitte2a08d1a2016-03-29 16:45:03 +02002278 } else {
2279 die "unrecognised source file type for shared library: $s\n";
2280 }
2281 }
2282 }
2283
Richard Levitteae4c7452016-03-07 14:37:00 +01002284 foreach (keys %generate) {
2285 my $dest = $_;
2286 my $ddest = cleanfile($buildd, $_, $blddir);
Richard Levitteae4c7452016-03-07 14:37:00 +01002287 die "more than one generator for $dest: "
Richard Levittecff64af2019-11-20 14:58:20 +01002288 ,join(" ", @{$generate{$_}}),"\n"
2289 if scalar @{$generate{$_}} > 1;
Richard Levitteae4c7452016-03-07 14:37:00 +01002290 my @generator = split /\s+/, $generate{$dest}->[0];
Richard Levittecff64af2019-11-20 14:58:20 +01002291 my $gen = $generator[0];
2292 $generator[0] = cleanfile($sourced, $gen, $blddir);
2293
Richard Levitte19cf4402020-02-26 14:42:10 +01002294 # If the generator is itself generated, it's in the build tree
Richard Levittecff64af2019-11-20 14:58:20 +01002295 if ($generate{$gen}) {
2296 $generator[0] = cleanfile($buildd, $gen, $blddir);
2297 }
2298
Richard Levitteae4c7452016-03-07 14:37:00 +01002299 $unified_info{generate}->{$ddest} = [ @generator ];
2300 }
2301
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002302 foreach (keys %depends) {
2303 my $dest = $_;
Richard Levitte4f858292016-06-13 21:57:51 +02002304 my $ddest = $dest eq "" ? "" : cleanfile($sourced, $_, $blddir);
Richard Levitte8d34daf2016-04-21 14:30:08 +02002305
2306 # If the destination doesn't exist in source, it can only be
2307 # a generated file in the build tree.
Richard Levitte846e4c42018-03-08 12:01:28 +01002308 if ($ddest ne "" && ($ddest eq $src_configdata || ! -f $ddest)) {
Richard Levitte8d34daf2016-04-21 14:30:08 +02002309 $ddest = cleanfile($buildd, $_, $blddir);
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002310 }
2311 foreach (@{$depends{$dest}}) {
Richard Levitte2e963842016-02-10 02:00:37 +01002312 my $d = cleanfile($sourced, $_, $blddir);
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002313
Richard Levittee737d7b2016-02-11 15:22:27 +01002314 # If we know it's generated, or assume it is because we can't
2315 # find it in the source tree, we set file we depend on to be
Richard Levitte19cf4402020-02-26 14:42:10 +01002316 # in the build tree rather than the source tree.
Richard Levitte846e4c42018-03-08 12:01:28 +01002317 if ($d eq $src_configdata
Richard Levitteda1f2102016-03-19 01:29:01 +01002318 || (grep { $d eq $_ }
2319 map { cleanfile($srcdir, $_, $blddir) }
Richard Levitte19cf4402020-02-26 14:42:10 +01002320 grep { /\.h$/ } keys %{$unified_info{generate}})
2321 || ! -f $d) {
Richard Levitte2e963842016-02-10 02:00:37 +01002322 $d = cleanfile($buildd, $_, $blddir);
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002323 }
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002324 $unified_info{depends}->{$ddest}->{$d} = 1;
Richard Levitte9eba5932019-10-04 00:00:24 +02002325
2326 # Fix up associated attributes
2327 $unified_info{attributes}->{depends}->{$ddest}->{$d} =
2328 $attributes{depends}->{$dest}->{$_}
2329 if defined $attributes{depends}->{$dest}->{$_};
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002330 }
2331 }
2332
2333 foreach (keys %includes) {
2334 my $dest = $_;
Richard Levitte8d34daf2016-04-21 14:30:08 +02002335 my $ddest = cleanfile($sourced, $_, $blddir);
2336
2337 # If the destination doesn't exist in source, it can only be
2338 # a generated file in the build tree.
Richard Levitte846e4c42018-03-08 12:01:28 +01002339 if ($ddest eq $src_configdata || ! -f $ddest) {
Richard Levitte8d34daf2016-04-21 14:30:08 +02002340 $ddest = cleanfile($buildd, $_, $blddir);
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002341 }
2342 foreach (@{$includes{$dest}}) {
Richard Levitte4748f892016-06-29 22:51:42 +02002343 my $is = cleandir($sourced, $_, $blddir);
2344 my $ib = cleandir($buildd, $_, $blddir);
2345 push @{$unified_info{includes}->{$ddest}->{source}}, $is
2346 unless grep { $_ eq $is } @{$unified_info{includes}->{$ddest}->{source}};
2347 push @{$unified_info{includes}->{$ddest}->{build}}, $ib
2348 unless grep { $_ eq $ib } @{$unified_info{includes}->{$ddest}->{build}};
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002349 }
2350 }
Richard Levitteb96ab5e2016-10-14 16:56:34 +02002351
Richard Levitteef57f792019-08-23 17:16:48 +02002352 foreach my $dest (keys %defines) {
2353 my $ddest;
Richard Levitteb96ab5e2016-10-14 16:56:34 +02002354
Richard Levitteef57f792019-08-23 17:16:48 +02002355 if ($dest ne "") {
2356 $ddest = cleanfile($sourced, $dest, $blddir);
2357
2358 # If the destination doesn't exist in source, it can only
2359 # be a generated file in the build tree.
2360 if (! -f $ddest) {
2361 $ddest = cleanfile($buildd, $dest, $blddir);
Richard Levitteb96ab5e2016-10-14 16:56:34 +02002362 }
2363 }
Richard Levitteef57f792019-08-23 17:16:48 +02002364 foreach my $v (@{$defines{$dest}}) {
2365 $v =~ m|^([^=]*)(=.*)?$|;
Richard Levitteb96ab5e2016-10-14 16:56:34 +02002366 die "0 length macro name not permitted\n" if $1 eq "";
Richard Levitteef57f792019-08-23 17:16:48 +02002367 if ($dest ne "") {
2368 die "$1 defined more than once\n"
2369 if defined $unified_info{defines}->{$ddest}->{$1};
2370 $unified_info{defines}->{$ddest}->{$1} = $2;
2371 } else {
2372 die "$1 defined more than once\n"
2373 if grep { $v eq $_ } @{$config{defines}};
2374 push @{$config{defines}}, $v;
2375 }
Richard Levitteb96ab5e2016-10-14 16:56:34 +02002376 }
2377 }
Richard Levitte829f86b2016-08-31 22:54:39 +02002378
2379 foreach my $section (keys %htmldocs) {
2380 foreach (@{$htmldocs{$section}}) {
2381 my $htmldocs = cleanfile($buildd, $_, $blddir);
2382 $unified_info{htmldocs}->{$section}->{$htmldocs} = 1;
2383 }
2384 }
2385
2386 foreach my $section (keys %mandocs) {
2387 foreach (@{$mandocs{$section}}) {
2388 my $mandocs = cleanfile($buildd, $_, $blddir);
2389 $unified_info{mandocs}->{$section}->{$mandocs} = 1;
2390 }
2391 }
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002392 }
2393
Richard Levitted201dbc2017-12-28 16:03:17 +01002394 my $ordinals_text = join(', ', sort keys %ordinals);
2395 warn <<"EOF" if $ordinals_text;
2396
2397WARNING: ORDINALS were specified for $ordinals_text
2398They are ignored and should be replaced with a combination of GENERATE,
2399DEPEND and SHARED_SOURCE.
2400EOF
2401
Richard Levitte51583cb2019-06-11 18:11:25 +02002402
2403 # Go through the sources of all libraries and check that the same basename
2404 # doesn't appear more than once. Some static library archivers depend on
2405 # them being unique.
2406 {
2407 my $err = 0;
2408 foreach my $prod (keys %{$unified_info{libraries}}) {
2409 my @prod_sources =
2410 map { keys %{$unified_info{sources}->{$_}} }
2411 keys %{$unified_info{sources}->{$prod}};
2412 my %srccnt = ();
2413
2414 # Count how many times a given each source basename
2415 # appears for each product.
2416 foreach my $src (@prod_sources) {
2417 $srccnt{basename $src}++;
2418 }
2419
2420 foreach my $src (keys %srccnt) {
2421 if ((my $cnt = $srccnt{$src}) > 1) {
2422 print STDERR "$src appears $cnt times for the product $prod\n";
2423 $err++
2424 }
2425 }
2426 }
2427 die if $err > 0;
2428 }
2429
Richard Levitte1b5ad512018-01-23 19:07:14 +01002430 # Massage the result
2431
Richard Levittee431bcf2018-01-23 19:13:48 +01002432 # If we depend on a header file or a perl module, add an inclusion of
2433 # its directory to allow smoothe inclusion
2434 foreach my $dest (keys %{$unified_info{depends}}) {
2435 next if $dest eq "";
2436 foreach my $d (keys %{$unified_info{depends}->{$dest}}) {
2437 next unless $d =~ /\.(h|pm)$/;
Richard Levitte906032d2018-03-07 15:58:04 +01002438 my $i = dirname($d);
2439 my $spot =
2440 $d eq "configdata.pm" || defined($unified_info{generate}->{$d})
2441 ? 'build' : 'source';
2442 push @{$unified_info{includes}->{$dest}->{$spot}}, $i
2443 unless grep { $_ eq $i } @{$unified_info{includes}->{$dest}->{$spot}};
Richard Levittee431bcf2018-01-23 19:13:48 +01002444 }
2445 }
2446
Richard Levitteef2dfc92018-09-30 14:44:59 +02002447 # Go through all intermediary files and change their names to something that
Richard Levittebec2db12018-09-10 02:21:40 +02002448 # reflects what they will be built for. Note that for some source files,
2449 # this leads to duplicate object files because they are used multiple times.
2450 # the goal is to rename all object files according to this scheme:
2451 # {productname}-{midfix}-{origobjname}.[o|res]
2452 # the {midfix} is a keyword indicating the type of product, which is mostly
2453 # valuable for libraries since they come in two forms.
2454 #
2455 # This also reorganises the {sources} and {shared_sources} so that the
2456 # former only contains ALL object files that are supposed to end up in
2457 # static libraries and programs, while the latter contains ALL object files
2458 # that are supposed to end up in shared libraries and DSOs.
2459 # The main reason for having two different source structures is to allow
2460 # the same name to be used for the static and the shared variants of a
2461 # library.
2462 {
2463 # Take copies so we don't get interference from added stuff
2464 my %unified_copy = ();
2465 foreach (('sources', 'shared_sources')) {
2466 $unified_copy{$_} = { %{$unified_info{$_}} }
2467 if defined($unified_info{$_});
2468 delete $unified_info{$_};
2469 }
Richard Levitte1842f362019-01-31 00:06:50 +01002470 foreach my $prodtype (('programs', 'libraries', 'modules', 'scripts')) {
Richard Levittebec2db12018-09-10 02:21:40 +02002471 # $intent serves multi purposes:
2472 # - give a prefix for the new object files names
2473 # - in the case of libraries, rearrange the object files so static
2474 # libraries use the 'sources' structure exclusively, while shared
2475 # libraries use the 'shared_sources' structure exclusively.
2476 my $intent = {
2477 programs => { bin => { src => [ 'sources' ],
2478 dst => 'sources' } },
2479 libraries => { lib => { src => [ 'sources' ],
2480 dst => 'sources' },
2481 shlib => { prodselect =>
2482 sub { grep !/\.a$/, @_ },
2483 src => [ 'sources',
2484 'shared_sources' ],
2485 dst => 'shared_sources' } },
Richard Levitte22b41462019-03-31 15:14:00 +02002486 modules => { dso => { src => [ 'sources' ],
2487 dst => 'sources' } },
Richard Levittebec2db12018-09-10 02:21:40 +02002488 scripts => { script => { src => [ 'sources' ],
2489 dst => 'sources' } }
2490 } -> {$prodtype};
2491 foreach my $kind (keys %$intent) {
Richard Levitte856b1b62018-11-15 21:37:55 +01002492 next if ($intent->{$kind}->{dst} eq 'shared_sources'
2493 && $disabled{shared});
2494
Richard Levittebec2db12018-09-10 02:21:40 +02002495 my @src = @{$intent->{$kind}->{src}};
2496 my $dst = $intent->{$kind}->{dst};
2497 my $prodselect = $intent->{$kind}->{prodselect} // sub { @_ };
2498 foreach my $prod ($prodselect->(keys %{$unified_info{$prodtype}})) {
2499 # %prod_sources has all applicable objects as keys, and
2500 # their corresponding sources as values
2501 my %prod_sources =
2502 map { $_ => [ keys %{$unified_copy{sources}->{$_}} ] }
2503 map { keys %{$unified_copy{$_}->{$prod}} }
2504 @src;
2505 foreach (keys %prod_sources) {
Richard Levitteef2dfc92018-09-30 14:44:59 +02002506 # Only affect object files and resource files,
2507 # the others simply get a new value
2508 # (+1 instead of -1)
Richard Levittebec2db12018-09-10 02:21:40 +02002509 if ($_ =~ /\.(o|res)$/) {
2510 (my $prodname = $prod) =~ s|\.a$||;
2511 my $newobj =
2512 catfile(dirname($_),
2513 basename($prodname)
2514 . '-' . $kind
2515 . '-' . basename($_));
2516 $unified_info{$dst}->{$prod}->{$newobj} = 1;
2517 foreach my $src (@{$prod_sources{$_}}) {
2518 $unified_info{sources}->{$newobj}->{$src} = 1;
2519 }
2520 # Adjust dependencies
2521 foreach my $deps (keys %{$unified_info{depends}->{$_}}) {
2522 $unified_info{depends}->{$_}->{$deps} = -1;
2523 $unified_info{depends}->{$newobj}->{$deps} = 1;
2524 }
2525 # Adjust includes
2526 foreach my $k (('source', 'build')) {
2527 next unless
2528 defined($unified_info{includes}->{$_}->{$k});
2529 my @incs = @{$unified_info{includes}->{$_}->{$k}};
2530 $unified_info{includes}->{$newobj}->{$k} = [ @incs ];
2531 }
2532 } else {
2533 $unified_info{$dst}->{$prod}->{$_} = 1;
2534 }
2535 }
2536 }
2537 }
2538 }
2539 }
Richard Levitte51583cb2019-06-11 18:11:25 +02002540
Richard Levittebec2db12018-09-10 02:21:40 +02002541 # At this point, we have a number of sources with the value -1. They
2542 # aren't part of the local build and are probably meant for a different
2543 # platform, and can therefore be cleaned away. That happens when making
2544 # %unified_info more efficient below.
2545
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002546 ### Make unified_info a bit more efficient
2547 # One level structures
Richard Levitte1842f362019-01-31 00:06:50 +01002548 foreach (("programs", "libraries", "modules", "scripts")) {
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002549 $unified_info{$_} = [ sort keys %{$unified_info{$_}} ];
2550 }
2551 # Two level structures
Richard Levitte829f86b2016-08-31 22:54:39 +02002552 foreach my $l1 (("sources", "shared_sources", "ldadd", "depends",
2553 "htmldocs", "mandocs")) {
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002554 foreach my $l2 (sort keys %{$unified_info{$l1}}) {
Richard Levittebec2db12018-09-10 02:21:40 +02002555 my @items =
2556 sort
2557 grep { $unified_info{$l1}->{$l2}->{$_} > 0 }
2558 keys %{$unified_info{$l1}->{$l2}};
2559 if (@items) {
2560 $unified_info{$l1}->{$l2} = [ @items ];
2561 } else {
2562 delete $unified_info{$l1}->{$l2};
2563 }
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002564 }
2565 }
Richard Levitteb96ab5e2016-10-14 16:56:34 +02002566 # Defines
2567 foreach my $dest (sort keys %{$unified_info{defines}}) {
2568 $unified_info{defines}->{$dest}
2569 = [ map { $_.$unified_info{defines}->{$dest}->{$_} }
2570 sort keys %{$unified_info{defines}->{$dest}} ];
2571 }
Richard Levitte4748f892016-06-29 22:51:42 +02002572 # Includes
2573 foreach my $dest (sort keys %{$unified_info{includes}}) {
2574 if (defined($unified_info{includes}->{$dest}->{build})) {
Richard Levittee431bcf2018-01-23 19:13:48 +01002575 my @source_includes = ();
2576 @source_includes = ( @{$unified_info{includes}->{$dest}->{source}} )
2577 if defined($unified_info{includes}->{$dest}->{source});
Richard Levitte4748f892016-06-29 22:51:42 +02002578 $unified_info{includes}->{$dest} =
2579 [ @{$unified_info{includes}->{$dest}->{build}} ];
2580 foreach my $inc (@source_includes) {
2581 push @{$unified_info{includes}->{$dest}}, $inc
2582 unless grep { $_ eq $inc } @{$unified_info{includes}->{$dest}};
2583 }
Richard Levitte609e4be2018-09-10 02:18:22 +02002584 } elsif (defined($unified_info{includes}->{$dest}->{source})) {
Richard Levitte4748f892016-06-29 22:51:42 +02002585 $unified_info{includes}->{$dest} =
2586 [ @{$unified_info{includes}->{$dest}->{source}} ];
Richard Levitte609e4be2018-09-10 02:18:22 +02002587 } else {
2588 delete $unified_info{includes}->{$dest};
Richard Levitte4748f892016-06-29 22:51:42 +02002589 }
2590 }
Richard Levitteb6e66072018-10-21 11:11:04 +02002591
2592 # For convenience collect information regarding directories where
2593 # files are generated, those generated files and the end product
2594 # they end up in where applicable. Then, add build rules for those
2595 # directories
2596 my %loopinfo = ( "lib" => [ @{$unified_info{libraries}} ],
Richard Levitte1842f362019-01-31 00:06:50 +01002597 "dso" => [ @{$unified_info{modules}} ],
Richard Levitteb6e66072018-10-21 11:11:04 +02002598 "bin" => [ @{$unified_info{programs}} ],
Richard Levitte829f86b2016-08-31 22:54:39 +02002599 "script" => [ @{$unified_info{scripts}} ],
2600 "docs" => [ (map { @{$unified_info{htmldocs}->{$_} // []} }
2601 keys %{$unified_info{htmldocs} // {}}),
2602 (map { @{$unified_info{mandocs}->{$_} // []} }
2603 keys %{$unified_info{mandocs} // {}}) ] );
Richard Levitteb6e66072018-10-21 11:11:04 +02002604 foreach my $type (keys %loopinfo) {
2605 foreach my $product (@{$loopinfo{$type}}) {
2606 my %dirs = ();
2607 my $pd = dirname($product);
2608
Richard Levitte3bed01a2018-11-01 13:55:32 +01002609 foreach (@{$unified_info{sources}->{$product} // []},
Richard Levitteb6e66072018-10-21 11:11:04 +02002610 @{$unified_info{shared_sources}->{$product} // []}) {
2611 my $d = dirname($_);
2612
2613 # We don't want to create targets for source directories
2614 # when building out of source
2615 next if ($config{sourcedir} ne $config{builddir}
2616 && $d =~ m|^\Q$config{sourcedir}\E|);
2617 # We already have a "test" target, and the current directory
2618 # is just silly to make a target for
2619 next if $d eq "test" || $d eq ".";
2620
2621 $dirs{$d} = 1;
2622 push @{$unified_info{dirinfo}->{$d}->{deps}}, $_
2623 if $d ne $pd;
2624 }
2625 foreach (keys %dirs) {
2626 push @{$unified_info{dirinfo}->{$_}->{products}->{$type}},
2627 $product;
2628 }
2629 }
2630 }
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002631}
2632
2633# For the schemes that need it, we provide the old *_obj configs
2634# from the *_asm_obj ones
Richard Levitte3a55c922016-02-18 18:43:56 +01002635foreach (grep /_(asm|aux)_src$/, keys %target) {
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002636 my $src = $_;
Richard Levitte3a55c922016-02-18 18:43:56 +01002637 (my $obj = $_) =~ s/_(asm|aux)_src$/_obj/;
Richard Levitteea241952016-10-12 15:30:08 +02002638 $target{$obj} = $target{$src};
2639 $target{$obj} =~ s/\.[csS]\b/.o/g; # C and assembler
2640 $target{$obj} =~ s/\.(cc|cpp)\b/_cc.o/g; # C++
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002641}
2642
Richard Levitte291e94d2015-05-18 22:35:23 +02002643# Write down our configuration where it fits #########################
2644
Richard Levitte1f86b822019-08-25 10:46:22 +02002645my %template_vars = (
2646 config => \%config,
2647 target => \%target,
2648 disablables => \@disablables,
2649 disablables_int => \@disablables_int,
2650 disabled => \%disabled,
2651 withargs => \%withargs,
2652 unified_info => \%unified_info,
2653 tls => \@tls,
2654 dtls => \@dtls,
2655 makevars => [ sort keys %user ],
2656 disabled_info => \%disabled_info,
2657 user_crossable => \@user_crossable,
Richard Levitte291e94d2015-05-18 22:35:23 +02002658);
Richard Levitte1f86b822019-08-25 10:46:22 +02002659my $configdata_outname = 'configdata.pm';
2660print "Creating $configdata_outname\n";
2661open CONFIGDATA, ">$configdata_outname.new"
2662 or die "Trying to create $configdata_outname.new: $!";
2663my $configdata_tmplname = cleanfile($srcdir, "configdata.pm.in", $blddir);
2664my $configdata_tmpl =
2665 OpenSSL::Template->new(TYPE => 'FILE', SOURCE => $configdata_tmplname);
2666$configdata_tmpl->fill_in(
2667 FILENAME => $configdata_tmplname,
2668 OUTPUT => \*CONFIGDATA,
2669 HASH => { %template_vars,
2670 autowarntext => [
2671 'WARNING: do not edit!',
2672 "Generated by Configure from $configdata_tmplname",
2673 ] }
2674) or die $Text::Template::ERROR;
2675close CONFIGDATA;
2676rename "$configdata_outname.new", $configdata_outname;
Richard Levitteb1fafff2018-01-29 06:19:17 +01002677if ($builder_platform eq 'unix') {
2678 my $mode = (0755 & ~umask);
2679 chmod $mode, 'configdata.pm'
2680 or warn sprintf("WARNING: Couldn't change mode for 'configdata.pm' to 0%03o: %s\n",$mode,$!);
2681}
Ben Lauriecba50681999-03-07 14:05:36 +00002682
Richard Levitte1f86b822019-08-25 10:46:22 +02002683print "Running $configdata_outname\n";
2684my $perlcmd = (quotify("maybeshell", $config{PERL}))[0];
2685my $cmd = "$perlcmd $configdata_outname";
2686#print STDERR "DEBUG[run_dofile]: \$cmd = $cmd\n";
2687system($cmd);
2688exit 1 if $? != 0;
Felix Laurie von Massenbachfce0ba52014-05-26 17:19:28 +01002689
Richard Levitte8937a4e2018-07-24 10:45:05 +02002690$SIG{__DIE__} = $orig_death_handler;
2691
Richard Levitte9c62a272016-02-27 16:51:34 +01002692print <<"EOF" if ($disabled{threads} eq "unavailable");
Bodo Möller5f8d5c91999-04-29 16:10:09 +00002693
2694The library could not be configured for supporting multi-threaded
2695applications as the compiler options required on this system are not known.
Richard Levittef828ba02020-04-27 09:08:36 +02002696See file INSTALL.md for details if you need multi-threading.
Bodo Möllerec577821999-04-23 22:13:45 +00002697EOF
2698
Richard Levitte76ffb432015-05-18 02:46:21 +02002699print <<"EOF" if ($no_shared_warn);
Richard Levitte2964ba82003-01-11 11:40:39 +00002700
Richard Levitteae482422016-02-22 02:09:11 +01002701The options 'shared', 'pic' and 'dynamic-engine' aren't supported on this
2702platform, so we will pretend you gave the option 'no-pic', which also disables
2703'shared' and 'dynamic-engine'. If you know how to implement shared libraries
2704or position independent code, please let us know (but please first make sure
2705you have tried with a current version of OpenSSL).
Rich Salz2e31ef02015-12-10 12:31:01 -05002706EOF
2707
Richard Levitte820e4142018-02-02 12:30:50 +01002708print <<"EOF";
2709
2710**********************************************************************
2711*** ***
Dr. Matthias St. Pierre41349b52018-10-25 23:31:24 +02002712*** OpenSSL has been successfully configured ***
Richard Levitte820e4142018-02-02 12:30:50 +01002713*** ***
Dr. Matthias St. Pierre41349b52018-10-25 23:31:24 +02002714*** If you encounter a problem while building, please open an ***
2715*** issue on GitHub <https://github.com/openssl/openssl/issues> ***
2716*** and include the output from the following command: ***
2717*** ***
2718*** perl configdata.pm --dump ***
2719*** ***
2720*** (If you are new to OpenSSL, you might want to consult the ***
Richard Levittef828ba02020-04-27 09:08:36 +02002721*** 'Troubleshooting' section in the INSTALL.md file first) ***
Richard Levitte820e4142018-02-02 12:30:50 +01002722*** ***
2723**********************************************************************
2724EOF
2725
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002726exit(0);
2727
Richard Levittebd5192b2015-05-18 02:57:24 +02002728######################################################################
2729#
2730# Helpers and utility functions
2731#
2732
Richard Levitte8937a4e2018-07-24 10:45:05 +02002733# Death handler, to print a helpful message in case of failure #######
2734#
2735sub death_handler {
Richard Levitteeb807d52018-07-24 21:46:55 +02002736 die @_ if $^S; # To prevent the added message in eval blocks
Richard Levitte8937a4e2018-07-24 10:45:05 +02002737 my $build_file = $target{build_file} // "build file";
Richard Levitteeb807d52018-07-24 21:46:55 +02002738 my @message = ( <<"_____", @_ );
Richard Levitte8937a4e2018-07-24 10:45:05 +02002739
2740Failure! $build_file wasn't produced.
Dr. David von Oheimb1dc1ea12020-06-10 17:49:25 +02002741Please read INSTALL.md and associated NOTES-* files. You may also have to
Richard Levittef828ba02020-04-27 09:08:36 +02002742look over your available compiler tool chain or change your configuration.
Richard Levitte8937a4e2018-07-24 10:45:05 +02002743
2744_____
Richard Levitteeb807d52018-07-24 21:46:55 +02002745
2746 # Dying is terminal, so it's ok to reset the signal handler here.
2747 $SIG{__DIE__} = $orig_death_handler;
2748 die @message;
Richard Levitte8937a4e2018-07-24 10:45:05 +02002749}
2750
Richard Levittebd5192b2015-05-18 02:57:24 +02002751# Configuration file reading #########################################
2752
Richard Levitte1f2e1cd2016-03-17 09:09:31 +01002753# Note: All of the helper functions are for lazy evaluation. They all
2754# return a CODE ref, which will return the intended value when evaluated.
2755# Thus, whenever there's mention of a returned value, it's about that
2756# intended value.
2757
Richard Levitte1f2e1cd2016-03-17 09:09:31 +01002758# Helper function to implement conditional value variants, with a default
2759# plus additional values based on the value of $config{build_type}.
2760# Arguments are given in hash table form:
2761#
2762# picker(default => "Basic string: ",
2763# debug => "debug",
2764# release => "release")
2765#
2766# When configuring with --debug, the resulting string will be
2767# "Basic string: debug", and when not, it will be "Basic string: release"
2768#
2769# This can be used to create variants of sets of flags according to the
2770# build type:
2771#
2772# cflags => picker(default => "-Wall",
2773# debug => "-g -O0",
2774# release => "-O3")
2775#
2776sub picker {
2777 my %opts = @_;
2778 return sub { add($opts{default} || (),
2779 $opts{$config{build_type}} || ())->(); }
2780}
2781
2782# Helper function to combine several values of different types into one.
2783# This is useful if you want to combine a string with the result of a
2784# lazy function, such as:
2785#
2786# cflags => combine("-Wall", sub { $disabled{zlib} ? () : "-DZLIB" })
2787#
2788sub combine {
2789 my @stuff = @_;
2790 return sub { add(@stuff)->(); }
2791}
2792
2793# Helper function to implement conditional values depending on the value
2794# of $disabled{threads}. Can be used as follows:
2795#
2796# cflags => combine("-Wall", threads("-pthread"))
2797#
2798sub threads {
2799 my @flags = @_;
2800 return sub { add($disabled{threads} ? () : @flags)->(); }
2801}
2802
Andy Polyakov60aa6c12018-06-11 12:22:29 +02002803sub shared {
2804 my @flags = @_;
2805 return sub { add($disabled{shared} ? () : @flags)->(); }
2806}
Richard Levitte1f2e1cd2016-03-17 09:09:31 +01002807
Richard Levitte9c62a272016-02-27 16:51:34 +01002808our $add_called = 0;
Richard Levitte88087412015-05-18 14:31:49 +02002809# Helper function to implement adding values to already existing configuration
2810# values. It handles elements that are ARRAYs, CODEs and scalars
2811sub _add {
2812 my $separator = shift;
2813
Richard Levittebcb19772016-01-30 02:17:05 +01002814 # If there's any ARRAY in the collection of values OR the separator
2815 # is undef, we will return an ARRAY of combined values, otherwise a
2816 # string of joined values with $separator as the separator.
2817 my $found_array = !defined($separator);
Richard Levitte88087412015-05-18 14:31:49 +02002818
2819 my @values =
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01002820 map {
2821 my $res = $_;
2822 while (ref($res) eq "CODE") {
2823 $res = $res->();
2824 }
2825 if (defined($res)) {
2826 if (ref($res) eq "ARRAY") {
2827 $found_array = 1;
2828 @$res;
2829 } else {
2830 $res;
2831 }
2832 } else {
2833 ();
2834 }
Richard Levitte88087412015-05-18 14:31:49 +02002835 } (@_);
2836
Richard Levitte9c62a272016-02-27 16:51:34 +01002837 $add_called = 1;
2838
Richard Levitte88087412015-05-18 14:31:49 +02002839 if ($found_array) {
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01002840 [ @values ];
Richard Levitte88087412015-05-18 14:31:49 +02002841 } else {
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01002842 join($separator, grep { defined($_) && $_ ne "" } @values);
Richard Levitte88087412015-05-18 14:31:49 +02002843 }
2844}
2845sub add_before {
Richard Levittebdcd83e2016-02-25 00:17:59 +01002846 my $separator = " ";
2847 if (ref($_[$#_]) eq "HASH") {
2848 my $opts = pop;
2849 $separator = $opts->{separator};
2850 }
Richard Levitte88087412015-05-18 14:31:49 +02002851 my @x = @_;
2852 sub { _add($separator, @x, @_) };
2853}
2854sub add {
Richard Levittebdcd83e2016-02-25 00:17:59 +01002855 my $separator = " ";
2856 if (ref($_[$#_]) eq "HASH") {
2857 my $opts = pop;
2858 $separator = $opts->{separator};
2859 }
Richard Levitte88087412015-05-18 14:31:49 +02002860 my @x = @_;
2861 sub { _add($separator, @_, @x) };
2862}
2863
Richard Levitte3b6c4b02017-12-01 15:29:05 +01002864sub read_eval_file {
2865 my $fname = shift;
2866 my $content;
2867 my @result;
2868
2869 open F, "< $fname" or die "Can't open '$fname': $!\n";
2870 {
2871 undef local $/;
2872 $content = <F>;
2873 }
2874 close F;
2875 {
2876 local $@;
2877
2878 @result = ( eval $content );
2879 warn $@ if $@;
2880 }
2881 return wantarray ? @result : $result[0];
2882}
2883
Richard Levittebd5192b2015-05-18 02:57:24 +02002884# configuration reader, evaluates the input file as a perl script and expects
2885# it to fill %targets with target configurations. Those are then added to
2886# %table.
2887sub read_config {
2888 my $fname = shift;
Richard Levitte3b6c4b02017-12-01 15:29:05 +01002889 my %targets;
2890
Richard Levittebd5192b2015-05-18 02:57:24 +02002891 {
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01002892 # Protect certain tables from tampering
2893 local %table = ();
Richard Levittebd5192b2015-05-18 02:57:24 +02002894
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01002895 %targets = read_eval_file($fname);
Richard Levittebd5192b2015-05-18 02:57:24 +02002896 }
Richard Levitte225f9802018-01-09 19:51:19 +01002897 my %preexisting = ();
2898 foreach (sort keys %targets) {
2899 $preexisting{$_} = 1 if $table{$_};
2900 }
2901 die <<"EOF",
2902The following config targets from $fname
2903shadow pre-existing config targets with the same name:
2904EOF
2905 map { " $_\n" } sort keys %preexisting
2906 if %preexisting;
2907
Richard Levittebd5192b2015-05-18 02:57:24 +02002908
2909 # For each target, check that it's configured with a hash table.
2910 foreach (keys %targets) {
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01002911 if (ref($targets{$_}) ne "HASH") {
2912 if (ref($targets{$_}) eq "") {
2913 warn "Deprecated target configuration for $_, ignoring...\n";
2914 } else {
2915 warn "Misconfigured target configuration for $_ (should be a hash table), ignoring...\n";
2916 }
2917 delete $targets{$_};
2918 } else {
Richard Levitteee9b0bb2016-09-14 22:21:41 +02002919 $targets{$_}->{_conf_fname_int} = add([ $fname ]);
2920 }
Richard Levittebd5192b2015-05-18 02:57:24 +02002921 }
2922
2923 %table = (%table, %targets);
2924
2925}
2926
FdaSilvaYY8483a002016-03-10 21:34:48 +01002927# configuration resolver. Will only resolve all the lazy evaluation
2928# codeblocks for the chosen target and all those it inherits from,
Richard Levittebd5192b2015-05-18 02:57:24 +02002929# recursively
2930sub resolve_config {
2931 my $target = shift;
2932 my @breadcrumbs = @_;
2933
Richard Levittec4718842016-03-09 17:18:07 +01002934# my $extra_checks = defined($ENV{CONFIGURE_EXTRA_CHECKS});
Richard Levitte9c62a272016-02-27 16:51:34 +01002935
Richard Levittebd5192b2015-05-18 02:57:24 +02002936 if (grep { $_ eq $target } @breadcrumbs) {
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01002937 die "inherit_from loop! target backtrace:\n "
2938 ,$target,"\n ",join("\n ", @breadcrumbs),"\n";
Richard Levittebd5192b2015-05-18 02:57:24 +02002939 }
2940
2941 if (!defined($table{$target})) {
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01002942 warn "Warning! target $target doesn't exist!\n";
2943 return ();
Richard Levittebd5192b2015-05-18 02:57:24 +02002944 }
2945 # Recurse through all inheritances. They will be resolved on the
2946 # fly, so when this operation is done, they will all just be a
2947 # bunch of attributes with string values.
2948 # What we get here, though, are keys with references to lists of
2949 # the combined values of them all. We will deal with lists after
2950 # this stage is done.
2951 my %combined_inheritance = ();
2952 if ($table{$target}->{inherit_from}) {
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01002953 my @inherit_from =
2954 map { ref($_) eq "CODE" ? $_->() : $_ } @{$table{$target}->{inherit_from}};
2955 foreach (@inherit_from) {
2956 my %inherited_config = resolve_config($_, $target, @breadcrumbs);
Richard Levittebd5192b2015-05-18 02:57:24 +02002957
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01002958 # 'template' is a marker that's considered private to
2959 # the config that had it.
2960 delete $inherited_config{template};
Richard Levittebd5192b2015-05-18 02:57:24 +02002961
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01002962 foreach (keys %inherited_config) {
2963 if (!$combined_inheritance{$_}) {
2964 $combined_inheritance{$_} = [];
2965 }
2966 push @{$combined_inheritance{$_}}, $inherited_config{$_};
2967 }
2968 }
Richard Levittebd5192b2015-05-18 02:57:24 +02002969 }
2970
2971 # We won't need inherit_from in this target any more, since we've
2972 # resolved all the inheritances that lead to this
2973 delete $table{$target}->{inherit_from};
2974
2975 # Now is the time to deal with those lists. Here's the place to
2976 # decide what shall be done with those lists, all based on the
2977 # values of the target we're currently dealing with.
2978 # - If a value is a coderef, it will be executed with the list of
2979 # inherited values as arguments.
2980 # - If the corresponding key doesn't have a value at all or is the
FdaSilvaYY8483a002016-03-10 21:34:48 +01002981 # empty string, the inherited value list will be run through the
Richard Levittebd5192b2015-05-18 02:57:24 +02002982 # default combiner (below), and the result becomes this target's
2983 # value.
2984 # - Otherwise, this target's value is assumed to be a string that
2985 # will simply override the inherited list of values.
Richard Levittea26d8be2016-02-26 12:25:13 +01002986 my $default_combiner = add();
Richard Levittebd5192b2015-05-18 02:57:24 +02002987
2988 my %all_keys =
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01002989 map { $_ => 1 } (keys %combined_inheritance,
2990 keys %{$table{$target}});
Richard Levitteb0b92a52016-02-27 11:08:21 +01002991
2992 sub process_values {
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01002993 my $object = shift;
2994 my $inherited = shift; # Always a [ list ]
2995 my $target = shift;
2996 my $entry = shift;
Richard Levitteb0b92a52016-02-27 11:08:21 +01002997
Richard Levitte9c62a272016-02-27 16:51:34 +01002998 $add_called = 0;
2999
Richard Levitteb0b92a52016-02-27 11:08:21 +01003000 while(ref($object) eq "CODE") {
3001 $object = $object->(@$inherited);
3002 }
3003 if (!defined($object)) {
3004 return ();
3005 }
3006 elsif (ref($object) eq "ARRAY") {
Richard Levitte9c62a272016-02-27 16:51:34 +01003007 local $add_called; # To make sure recursive calls don't affect it
Richard Levitteb0b92a52016-02-27 11:08:21 +01003008 return [ map { process_values($_, $inherited, $target, $entry) }
3009 @$object ];
3010 } elsif (ref($object) eq "") {
3011 return $object;
3012 } else {
3013 die "cannot handle reference type ",ref($object)
3014 ," found in target ",$target," -> ",$entry,"\n";
3015 }
3016 }
3017
Richard Levittebd5192b2015-05-18 02:57:24 +02003018 foreach (sort keys %all_keys) {
Richard Levitte9c62a272016-02-27 16:51:34 +01003019 my $previous = $combined_inheritance{$_};
Richard Levittebd5192b2015-05-18 02:57:24 +02003020
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01003021 # Current target doesn't have a value for the current key?
3022 # Assign it the default combiner, the rest of this loop body
3023 # will handle it just like any other coderef.
3024 if (!exists $table{$target}->{$_}) {
3025 $table{$target}->{$_} = $default_combiner;
3026 }
Richard Levittebd5192b2015-05-18 02:57:24 +02003027
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01003028 $table{$target}->{$_} = process_values($table{$target}->{$_},
3029 $combined_inheritance{$_},
3030 $target, $_);
Richard Levitteb0b92a52016-02-27 11:08:21 +01003031 unless(defined($table{$target}->{$_})) {
3032 delete $table{$target}->{$_};
3033 }
Richard Levittec4718842016-03-09 17:18:07 +01003034# if ($extra_checks &&
3035# $previous && !($add_called || $previous ~~ $table{$target}->{$_})) {
3036# warn "$_ got replaced in $target\n";
3037# }
Richard Levittebd5192b2015-05-18 02:57:24 +02003038 }
3039
3040 # Finally done, return the result.
3041 return %{$table{$target}};
3042}
3043
Ulf Möller462ba4f1999-04-24 22:59:36 +00003044sub usage
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01003045 {
3046 print STDERR $usage;
3047 print STDERR "\npick os/compiler from:\n";
3048 my $j=0;
3049 my $i;
Ulf Möller10a926c2000-02-21 00:55:45 +00003050 my $k=0;
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01003051 foreach $i (sort keys %table)
3052 {
3053 next if $table{$i}->{template};
3054 next if $i =~ /^debug/;
3055 $k += length($i) + 1;
3056 if ($k > 78)
3057 {
3058 print STDERR "\n";
3059 $k=length($i);
3060 }
3061 print STDERR $i . " ";
3062 }
3063 foreach $i (sort keys %table)
3064 {
3065 next if $table{$i}->{template};
3066 next if $i !~ /^debug/;
3067 $k += length($i) + 1;
3068 if ($k > 78)
3069 {
3070 print STDERR "\n";
3071 $k=length($i);
3072 }
3073 print STDERR $i . " ";
3074 }
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01003075 exit(1);
3076 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00003077
Richard Levitte6d75a832017-11-06 17:11:03 +01003078sub compiler_predefined {
3079 state %predefined;
Andy Polyakov41d6e0f2018-05-04 14:25:45 +02003080 my $cc = shift;
Richard Levitte6d75a832017-11-06 17:11:03 +01003081
3082 return () if $^O eq 'VMS';
3083
Andy Polyakov41d6e0f2018-05-04 14:25:45 +02003084 die 'compiler_predefined called without a compiler command'
3085 unless $cc;
Richard Levitte6d75a832017-11-06 17:11:03 +01003086
Andy Polyakov41d6e0f2018-05-04 14:25:45 +02003087 if (! $predefined{$cc}) {
Richard Levitte6d75a832017-11-06 17:11:03 +01003088
Andy Polyakov41d6e0f2018-05-04 14:25:45 +02003089 $predefined{$cc} = {};
Richard Levitte6d75a832017-11-06 17:11:03 +01003090
3091 # collect compiler pre-defines from gcc or gcc-alike...
3092 open(PIPE, "$cc -dM -E -x c /dev/null 2>&1 |");
3093 while (my $l = <PIPE>) {
3094 $l =~ m/^#define\s+(\w+(?:\(\w+\))?)(?:\s+(.+))?/ or last;
Andy Polyakov41d6e0f2018-05-04 14:25:45 +02003095 $predefined{$cc}->{$1} = $2 // '';
Richard Levitte6d75a832017-11-06 17:11:03 +01003096 }
3097 close(PIPE);
3098 }
3099
Andy Polyakov41d6e0f2018-05-04 14:25:45 +02003100 return %{$predefined{$cc}};
Richard Levitte6d75a832017-11-06 17:11:03 +01003101}
3102
Andy Polyakov656bbdc2016-05-20 21:31:11 +02003103sub which
3104{
3105 my ($name)=@_;
3106
3107 if (eval { require IPC::Cmd; 1; }) {
3108 IPC::Cmd->import();
3109 return scalar IPC::Cmd::can_run($name);
3110 } else {
3111 # if there is $directories component in splitpath,
3112 # then it's not something to test with $PATH...
3113 return $name if (File::Spec->splitpath($name))[1];
3114
3115 foreach (File::Spec->path()) {
3116 my $fullpath = catfile($_, "$name$target{exe_extension}");
3117 if (-f $fullpath and -x $fullpath) {
3118 return $fullpath;
3119 }
3120 }
3121 }
3122}
3123
Richard Levitte7ecdf182017-11-29 13:09:01 +01003124sub env
3125{
3126 my $name = shift;
Richard Levitteac6ae8a2018-03-16 08:24:50 +01003127 my %opts = @_;
Richard Levitte7ecdf182017-11-29 13:09:01 +01003128
Richard Levitteac6ae8a2018-03-16 08:24:50 +01003129 unless ($opts{cacheonly}) {
3130 # Note that if $ENV{$name} doesn't exist or is undefined,
3131 # $config{perlenv}->{$name} will be created with the value
3132 # undef. This is intentional.
Richard Levitte89bea082017-11-29 13:16:53 +01003133
Richard Levitteac6ae8a2018-03-16 08:24:50 +01003134 $config{perlenv}->{$name} = $ENV{$name}
3135 if ! exists $config{perlenv}->{$name};
3136 }
Richard Levitte7ecdf182017-11-29 13:09:01 +01003137 return $config{perlenv}->{$name};
3138}
3139
Richard Levitte00ae96c2015-05-18 12:53:38 +02003140# Configuration printer ##############################################
3141
3142sub print_table_entry
3143{
Andy Polyakovf770d752018-03-26 12:35:57 +02003144 local $now_printing = shift;
3145 my %target = resolve_config($now_printing);
Richard Levitte00ae96c2015-05-18 12:53:38 +02003146 my $type = shift;
3147
3148 # Don't print the templates
3149 return if $target{template};
3150
3151 my @sequence = (
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01003152 "sys_id",
3153 "cpp",
3154 "cppflags",
3155 "defines",
3156 "includes",
3157 "cc",
3158 "cflags",
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01003159 "ld",
3160 "lflags",
3161 "loutflag",
3162 "ex_libs",
3163 "bn_ops",
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01003164 "poly1035_asm_src",
3165 "thread_scheme",
3166 "perlasm_scheme",
3167 "dso_scheme",
3168 "shared_target",
3169 "shared_cflag",
3170 "shared_defines",
3171 "shared_ldflag",
3172 "shared_rcflag",
3173 "shared_extension",
3174 "dso_extension",
3175 "obj_extension",
3176 "exe_extension",
3177 "ranlib",
3178 "ar",
3179 "arflags",
3180 "aroutflag",
3181 "rc",
3182 "rcflags",
3183 "rcoutflag",
3184 "mt",
3185 "mtflags",
3186 "mtinflag",
3187 "mtoutflag",
3188 "multilib",
3189 "build_scheme",
3190 );
Richard Levitte00ae96c2015-05-18 12:53:38 +02003191
3192 if ($type eq "TABLE") {
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01003193 print "\n";
3194 print "*** $now_printing\n";
Richard Levittecb212f22016-02-24 01:32:51 +01003195 foreach (@sequence) {
3196 if (ref($target{$_}) eq "ARRAY") {
3197 printf "\$%-12s = %s\n", $_, join(" ", @{$target{$_}});
3198 } else {
3199 printf "\$%-12s = %s\n", $_, $target{$_};
3200 }
3201 }
Richard Levitte00ae96c2015-05-18 12:53:38 +02003202 } elsif ($type eq "HASH") {
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01003203 my $largest =
3204 length((sort { length($a) <=> length($b) } @sequence)[-1]);
3205 print " '$now_printing' => {\n";
3206 foreach (@sequence) {
3207 if ($target{$_}) {
Richard Levittecb212f22016-02-24 01:32:51 +01003208 if (ref($target{$_}) eq "ARRAY") {
3209 print " '",$_,"'"," " x ($largest - length($_))," => [ ",join(", ", map { "'$_'" } @{$target{$_}})," ],\n";
3210 } else {
3211 print " '",$_,"'"," " x ($largest - length($_))," => '",$target{$_},"',\n";
3212 }
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01003213 }
3214 }
3215 print " },\n";
Richard Levitte00ae96c2015-05-18 12:53:38 +02003216 }
3217}
3218
3219# Utility routines ###################################################
3220
Richard Levitte2e963842016-02-10 02:00:37 +01003221# On VMS, if the given file is a logical name, File::Spec::Functions
3222# will consider it an absolute path. There are cases when we want a
3223# purely syntactic check without checking the environment.
3224sub isabsolute {
3225 my $file = shift;
3226
3227 # On non-platforms, we just use file_name_is_absolute().
3228 return file_name_is_absolute($file) unless $^O eq "VMS";
3229
FdaSilvaYY69687aa2017-03-28 23:57:28 +02003230 # If the file spec includes a device or a directory spec,
Richard Levitte2e963842016-02-10 02:00:37 +01003231 # file_name_is_absolute() is perfectly safe.
3232 return file_name_is_absolute($file) if $file =~ m|[:\[]|;
3233
3234 # Here, we know the given file spec isn't absolute
3235 return 0;
3236}
3237
Richard Levitteec182ef2016-02-09 10:15:13 +01003238# Makes a directory absolute and cleans out /../ in paths like foo/../bar
3239# On some platforms, this uses rel2abs(), while on others, realpath() is used.
3240# realpath() requires that at least all path components except the last is an
3241# existing directory. On VMS, the last component of the directory spec must
3242# exist.
3243sub absolutedir {
3244 my $dir = shift;
3245
3246 # realpath() is quite buggy on VMS. It uses LIB$FID_TO_NAME, which
3247 # will return the volume name for the device, no matter what. Also,
3248 # it will return an incorrect directory spec if the argument is a
3249 # directory that doesn't exist.
3250 if ($^O eq "VMS") {
3251 return rel2abs($dir);
3252 }
3253
3254 # We use realpath() on Unix, since no other will properly clean out
3255 # a directory spec.
3256 use Cwd qw/realpath/;
3257
3258 return realpath($dir);
3259}
3260
Richard Levitte610e2b32020-07-01 10:06:59 +02003261# Check if all paths are one and the same, using stat. They must both exist
3262# We need this for the cases when File::Spec doesn't detect case insensitivity
3263# (File::Spec::Unix assumes case sensitivity)
3264sub samedir {
3265 die "samedir expects two arguments\n" unless scalar @_ == 2;
3266
3267 my @stat0 = stat($_[0]); # First argument
3268 my @stat1 = stat($_[1]); # Second argument
3269
3270 die "Couldn't stat $_[0]" unless @stat0;
3271 die "Couldn't stat $_[1]" unless @stat1;
3272
3273 # Compare device number
3274 return 0 unless ($stat0[0] == $stat1[0]);
3275 # Compare "inode". The perl manual recommends comparing as
3276 # string rather than as number.
3277 return 0 unless ($stat0[1] eq $stat1[1]);
3278
3279 return 1; # All the same
3280}
3281
Richard Levittefe052642015-05-18 03:33:55 +02003282sub quotify {
3283 my %processors = (
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01003284 perl => sub { my $x = shift;
3285 $x =~ s/([\\\$\@"])/\\$1/g;
3286 return '"'.$x.'"'; },
3287 maybeshell => sub { my $x = shift;
3288 (my $y = $x) =~ s/([\\\"])/\\$1/g;
3289 if ($x ne $y || $x =~ m|\s|) {
3290 return '"'.$y.'"';
3291 } else {
3292 return $x;
3293 }
3294 },
3295 );
Richard Levittefe052642015-05-18 03:33:55 +02003296 my $for = shift;
3297 my $processor =
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01003298 defined($processors{$for}) ? $processors{$for} : sub { shift; };
Richard Levittefe052642015-05-18 03:33:55 +02003299
Richard Levitte2110feb2016-04-06 15:02:57 +02003300 return map { $processor->($_); } @_;
Richard Levittefe052642015-05-18 03:33:55 +02003301}
Richard Levitte107b5792015-05-20 20:03:20 +02003302
Richard Levitte9fe2bb72016-01-29 19:45:51 +01003303# collect_from_file($filename, $line_concat_cond_re, $line_concat)
3304# $filename is a file name to read from
3305# $line_concat_cond_re is a regexp detecting a line continuation ending
3306# $line_concat is a CODEref that takes care of concatenating two lines
3307sub collect_from_file {
3308 my $filename = shift;
3309 my $line_concat_cond_re = shift;
3310 my $line_concat = shift;
3311
3312 open my $fh, $filename || die "unable to read $filename: $!\n";
3313 return sub {
3314 my $saved_line = "";
3315 $_ = "";
3316 while (<$fh>) {
Richard Levitte04f171c2016-02-12 12:10:27 +01003317 s|\R$||;
Richard Levitte9fe2bb72016-01-29 19:45:51 +01003318 if (defined $line_concat) {
3319 $_ = $line_concat->($saved_line, $_);
3320 $saved_line = "";
3321 }
3322 if (defined $line_concat_cond_re && /$line_concat_cond_re/) {
3323 $saved_line = $_;
3324 next;
3325 }
3326 return $_;
3327 }
3328 die "$filename ending with continuation line\n" if $_;
3329 close $fh;
3330 return undef;
3331 }
3332}
3333
3334# collect_from_array($array, $line_concat_cond_re, $line_concat)
3335# $array is an ARRAYref of lines
3336# $line_concat_cond_re is a regexp detecting a line continuation ending
3337# $line_concat is a CODEref that takes care of concatenating two lines
3338sub collect_from_array {
3339 my $array = shift;
3340 my $line_concat_cond_re = shift;
3341 my $line_concat = shift;
3342 my @array = (@$array);
3343
3344 return sub {
3345 my $saved_line = "";
3346 $_ = "";
3347 while (defined($_ = shift @array)) {
Richard Levitte04f171c2016-02-12 12:10:27 +01003348 s|\R$||;
Richard Levitte9fe2bb72016-01-29 19:45:51 +01003349 if (defined $line_concat) {
3350 $_ = $line_concat->($saved_line, $_);
3351 $saved_line = "";
3352 }
3353 if (defined $line_concat_cond_re && /$line_concat_cond_re/) {
3354 $saved_line = $_;
3355 next;
3356 }
3357 return $_;
3358 }
3359 die "input text ending with continuation line\n" if $_;
3360 return undef;
3361 }
3362}
3363
3364# collect_information($lineiterator, $line_continue, $regexp => $CODEref, ...)
3365# $lineiterator is a CODEref that delivers one line at a time.
Richard Levitte107b5792015-05-20 20:03:20 +02003366# All following arguments are regex/CODEref pairs, where the regexp detects a
3367# line and the CODEref does something with the result of the regexp.
3368sub collect_information {
Richard Levitte9fe2bb72016-01-29 19:45:51 +01003369 my $lineiterator = shift;
Richard Levitte107b5792015-05-20 20:03:20 +02003370 my %collectors = @_;
3371
Richard Levitte9fe2bb72016-01-29 19:45:51 +01003372 while(defined($_ = $lineiterator->())) {
Richard Levitte04f171c2016-02-12 12:10:27 +01003373 s|\R$||;
Richard Levitte9fe2bb72016-01-29 19:45:51 +01003374 my $found = 0;
Richard Levitte2b6b6062016-03-10 00:04:04 +01003375 if ($collectors{"BEFORE"}) {
3376 $collectors{"BEFORE"}->($_);
3377 }
Richard Levitte9fe2bb72016-01-29 19:45:51 +01003378 foreach my $re (keys %collectors) {
Richard Levitte2b6b6062016-03-10 00:04:04 +01003379 if ($re !~ /^OTHERWISE|BEFORE|AFTER$/ && /$re/) {
Richard Levitte9fe2bb72016-01-29 19:45:51 +01003380 $collectors{$re}->($lineiterator);
3381 $found = 1;
3382 };
3383 }
3384 if ($collectors{"OTHERWISE"}) {
3385 $collectors{"OTHERWISE"}->($lineiterator, $_)
3386 unless $found || !defined $collectors{"OTHERWISE"};
3387 }
Richard Levitte2b6b6062016-03-10 00:04:04 +01003388 if ($collectors{"AFTER"}) {
3389 $collectors{"AFTER"}->($_);
3390 }
Richard Levitte107b5792015-05-20 20:03:20 +02003391 }
Richard Levitte107b5792015-05-20 20:03:20 +02003392}
Richard Levittece959812016-05-24 17:39:52 +02003393
3394# tokenize($line)
Richard Levitte5d3af252018-11-07 10:34:05 +01003395# tokenize($line,$separator)
Richard Levittece959812016-05-24 17:39:52 +02003396# $line is a line of text to split up into tokens
Richard Levitte5d3af252018-11-07 10:34:05 +01003397# $separator [optional] is a regular expression that separates the tokens,
3398# the default being spaces. Do not use quotes of any kind as separators,
3399# that will give undefined results.
3400# Returns a list of tokens.
Richard Levittece959812016-05-24 17:39:52 +02003401#
Richard Levitte5d3af252018-11-07 10:34:05 +01003402# Tokens are divided by separator (spaces by default). If the tokens include
3403# the separators, they have to be quoted with single or double quotes.
3404# Double quotes inside a double quoted token must be escaped. Escaping is done
Richard Levittece959812016-05-24 17:39:52 +02003405# with backslash.
3406# Basically, the same quoting rules apply for " and ' as in any
3407# Unix shell.
3408sub tokenize {
3409 my $line = my $debug_line = shift;
Richard Levitte5d3af252018-11-07 10:34:05 +01003410 my $separator = shift // qr|\s+|;
Richard Levittece959812016-05-24 17:39:52 +02003411 my @result = ();
3412
Richard Levitte5d3af252018-11-07 10:34:05 +01003413 if ($ENV{CONFIGURE_DEBUG_TOKENIZE}) {
3414 print STDERR "DEBUG[tokenize]: \$separator = $separator\n";
3415 }
3416
3417 while ($line =~ s|^${separator}||, $line ne "") {
Richard Levittece959812016-05-24 17:39:52 +02003418 my $token = "";
Richard Levitte5d3af252018-11-07 10:34:05 +01003419 again:
3420 $line =~ m/^(.*?)(${separator}|"|'|$)/;
3421 $token .= $1;
3422 $line = $2.$';
3423
3424 if ($line =~ m/^"((?:[^"\\]+|\\.)*)"/) {
3425 $token .= $1;
3426 $line = $';
3427 goto again;
3428 } elsif ($line =~ m/^'([^']*)'/) {
3429 $token .= $1;
3430 $line = $';
3431 goto again;
Richard Levittece959812016-05-24 17:39:52 +02003432 }
3433 push @result, $token;
3434 }
3435
3436 if ($ENV{CONFIGURE_DEBUG_TOKENIZE}) {
Richard Levitte5d3af252018-11-07 10:34:05 +01003437 print STDERR "DEBUG[tokenize]: Parsed '$debug_line' into:\n";
3438 print STDERR "DEBUG[tokenize]: ('", join("', '", @result), "')\n";
Richard Levittece959812016-05-24 17:39:52 +02003439 }
3440 return @result;
3441}