blob: 8b0b25d5f65985ddb2fafa3d0a09e92863508035 [file] [log] [blame]
Richard Levittede17db92015-11-24 14:06:45 +01001#! /usr/bin/env perl
Jacob Bandes-Storchf4d8f032015-11-23 21:44:58 -08002# -*- mode: perl; -*-
Richard Levitte4333b892021-01-28 13:54:57 +01003# Copyright 2016-2021 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
Rich Salzd0364dc2021-05-12 10:42:46 -040032my $banner = <<"EOF";
33
34**********************************************************************
35*** ***
36*** OpenSSL has been successfully configured ***
37*** ***
38*** If you encounter a problem while building, please open an ***
39*** issue on GitHub <https://github.com/openssl/openssl/issues> ***
40*** and include the output from the following command: ***
41*** ***
42*** perl configdata.pm --dump ***
43*** ***
44*** (If you are new to OpenSSL, you might want to consult the ***
45*** 'Troubleshooting' section in the INSTALL.md file first) ***
46*** ***
47**********************************************************************
48EOF
49
Ulf Möller434c5dd1999-04-19 15:19:58 +000050# Options:
Bodo Möllere5f30451999-04-29 21:52:08 +000051#
Rich Salzf09e7ca2015-02-24 17:40:22 -050052# --config add the given configuration file, which will be read after
53# any "Configurations*" files that are found in the same
54# directory as this script.
Richard Levitted74dfaf2016-01-20 18:11:51 +010055# --prefix prefix for the OpenSSL installation, which includes the
56# directories bin, lib, include, share/man, share/doc/openssl
57# This becomes the value of INSTALLTOP in Makefile
58# (Default: /usr/local)
59# --openssldir OpenSSL data area, such as openssl.cnf, certificates and keys.
60# If it's a relative directory, it will be added on the directory
61# given with --prefix.
62# This becomes the value of OPENSSLDIR in Makefile and in C.
63# (Default: PREFIX/ssl)
Rich Salzd0364dc2021-05-12 10:42:46 -040064# --banner=".." Output specified text instead of default completion banner
Bodo Möllere5f30451999-04-29 21:52:08 +000065#
Rich Salzecb09ba2021-08-17 11:42:21 -040066# -w Don't wait after showing a Configure warning
67#
Andy Polyakovcbfb39d2006-10-21 13:38:16 +000068# --cross-compile-prefix Add specified prefix to binutils components.
69#
Richard Levittea6a4d0a2019-11-05 17:00:33 +010070# --api One of 0.9.8, 1.0.0, 1.0.1, 1.0.2, 1.1.0, 1.1.1, or 3.0
71# Define the public APIs as they were for that version
72# including patch releases. If 'no-deprecated' is also
73# given, do not compile support for interfaces deprecated
74# up to and including the specified OpenSSL version.
Viktor Dukhovni98186eb2016-01-04 23:00:33 -050075#
Richard Levitte5270e702000-10-26 21:07:28 +000076# no-hw-xxx do not compile support for specific crypto hardware.
77# Generic OpenSSL-style methods relating to this support
78# are always compiled but return NULL if the hardware
79# support isn't compiled.
80# no-hw do not compile support for any crypto hardware.
Bodo Möller5f8d5c91999-04-29 16:10:09 +000081# [no-]threads [don't] try to create a library that is suitable for
82# multithreaded applications (default is "threads" if we
83# know how to do it)
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +010084# [no-]shared [don't] try to create shared libraries when supported.
Richard Levitteae482422016-02-22 02:09:11 +010085# [no-]pic [don't] try to build position independent code when supported.
Richard Levitte45b71ab2016-02-22 15:57:25 +010086# If disabled, it also disables shared and dynamic-engine.
Ulf Möllera7239791999-04-19 14:55:56 +000087# no-asm do not use assembler
Benjamin Kaduk0423f812016-01-12 18:02:16 -060088# no-egd do not compile support for the entropy-gathering daemon APIs
Richard Levittee452de92001-07-12 09:11:14 +000089# [no-]zlib [don't] compile support for zlib compression.
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +010090# zlib-dynamic Like "zlib", but the zlib library is expected to be a shared
91# library and will be loaded in run-time by the OpenSSL library.
Dr. Stephen Henson7e159e02011-12-25 14:45:15 +000092# sctp include SCTP support
MouriNaruto5ded1ca2019-05-12 05:10:58 +080093# no-uplink Don't build support for UPLINK interface.
Matt Caswell8b1a5af2016-03-03 15:40:51 +000094# enable-weak-ssl-ciphers
Paul Yangedcdf382017-06-17 22:17:44 +080095# Enable weak ciphers that are disabled by default.
Andy Polyakov5ae5dc92016-11-20 21:52:41 +010096# 386 generate 80386 code in assembly modules
97# no-sse2 disables IA-32 SSE2 code in assembly modules, the above
98# mentioned '386' option implies this one
Richard Levitte3a1ee3c2020-12-17 21:37:15 +010099# no-<cipher> build without specified algorithm (dsa, idea, rc5, ...)
Dr. Matthias St. Pierref246f542019-09-21 00:14:16 +0200100# -<xxx> +<xxx> All options which are unknown to the 'Configure' script are
101# /<xxx> passed through to the compiler. Unix-style options beginning
102# with a '-' or '+' are recognized, as well as Windows-style
103# options beginning with a '/'. If the option contains arguments
104# separated by spaces, then the URL-style notation %20 can be
105# used for the space character in order to avoid having to quote
106# the option. For example, -opt%20arg gets expanded to -opt arg.
107# In fact, any ASCII character can be encoded as %xx using its
108# hexadecimal encoding.
Andy Polyakov047d97a2016-09-01 21:36:13 +0200109# -static while -static is also a pass-through compiler option (and
110# as such is limited to environments where it's actually
111# meaningful), it triggers a number configuration options,
Richard Levitte31b6ed72019-03-31 16:15:02 +0200112# namely no-pic, no-shared and no-threads. It is
Andy Polyakov047d97a2016-09-01 21:36:13 +0200113# argued that the only reason to produce statically linked
114# binaries (and in context it means executables linked with
115# -static flag, and not just executables linked with static
116# libcrypto.a) is to eliminate dependency on specific run-time,
117# a.k.a. libc version. The mentioned config options are meant
118# to achieve just that. Unfortunately on Linux it's impossible
119# to eliminate the dependency completely for openssl executable
120# because of getaddrinfo and gethostbyname calls, which can
121# invoke dynamically loadable library facility anyway to meet
122# the lookup requests. For this reason on Linux statically
123# linked openssl executable has rather debugging value than
124# production quality.
Geoff Thorpee41c8d62000-06-01 05:13:52 +0000125#
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100126# BN_LLONG use the type 'long long' in crypto/bn/bn.h
127# RC4_CHAR use 'char' instead of 'int' for RC4_INT in crypto/rc4/rc4.h
Andy Polyakovd0590fe2004-07-18 16:19:34 +0000128# Following are set automatically by this script
129#
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100130# MD5_ASM use some extra md5 assembler,
131# SHA1_ASM use some extra sha1 assembler, must define L_ENDIAN for x86
132# RMD160_ASM use some extra ripemd160 assembler,
133# SHA256_ASM sha256_block is implemented in assembler
134# SHA512_ASM sha512_block is implemented in assembler
135# AES_ASM AES_[en|de]crypt is implemented in assembler
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000136
Richard Levitte3b437402019-05-27 14:40:25 +0200137# Minimum warning options... any contributions to OpenSSL should at least
138# get past these. Note that we only use these with C compilers, not with
139# C++ compilers.
Dr. Stephen Henson363bd0b2009-01-11 15:56:32 +0000140
Rich Salz77305332017-01-30 16:13:41 -0500141# -DPEDANTIC complements -pedantic and is meant to mask code that
142# is not strictly standard-compliant and/or implementation-specific,
143# e.g. inline assembly, disregards to alignment requirements, such
144# that -pedantic would complain about. Incidentally -DPEDANTIC has
145# to be used even in sanitized builds, because sanitizer too is
146# supposed to and does take notice of non-standard behaviour. Then
147# -pedantic with pre-C9x compiler would also complain about 'long
148# long' not being supported. As 64-bit algorithms are common now,
149# it grew impossible to resolve this without sizeable additional
150# code, so we just tell compiler to be pedantic about everything
151# but 'long long' type.
152
Richard Levitte3b437402019-05-27 14:40:25 +0200153my @gcc_devteam_warn = qw(
Rich Salza9357912021-05-19 11:09:49 -0400154 -DPEDANTIC -pedantic -Wno-long-long -DUNUSEDRESULT_DEBUG
Richard Levitte3b437402019-05-27 14:40:25 +0200155 -Wall
Rich Salza9357912021-05-19 11:09:49 -0400156 -Wmissing-declarations
Richard Levitte3b437402019-05-27 14:40:25 +0200157 -Wextra
158 -Wno-unused-parameter
159 -Wno-missing-field-initializers
160 -Wswitch
161 -Wsign-compare
162 -Wshadow
163 -Wformat
164 -Wtype-limits
165 -Wundef
166 -Werror
167 -Wmissing-prototypes
168 -Wstrict-prototypes
169);
Dr. Stephen Henson363bd0b2009-01-11 15:56:32 +0000170
Ben Laurie190c8c62015-04-19 14:10:54 +0100171# These are used in addition to $gcc_devteam_warn when the compiler is clang.
172# TODO(openssl-team): fix problems and investigate if (at least) the
Ben Laurie480405e2015-08-02 02:45:44 +0100173# following warnings can also be enabled:
Rich Salz8bccbce2016-02-13 12:27:11 -0500174# -Wcast-align
Rich Salz77305332017-01-30 16:13:41 -0500175# -Wunreachable-code -- no, too ugly/compiler-specific
Rich Salza773b522016-02-13 22:33:56 -0500176# -Wlanguage-extension-token -- no, we use asm()
177# -Wunused-macros -- no, too tricky for BN and _XOPEN_SOURCE etc
178# -Wextended-offsetof -- no, needed in CMS ASN1 code
Richard Levitte3b437402019-05-27 14:40:25 +0200179my @clang_devteam_warn = qw(
Dr. Matthias St. Pierre03e56682019-07-23 20:54:03 +0200180 -Wno-unknown-warning-option
Richard Levitte3b437402019-05-27 14:40:25 +0200181 -Wswitch-default
182 -Wno-parentheses-equality
183 -Wno-language-extension-token
184 -Wno-extended-offsetof
185 -Wconditional-uninitialized
186 -Wincompatible-pointer-types-discards-qualifiers
Richard Levitte3b437402019-05-27 14:40:25 +0200187 -Wmissing-variable-declarations
188);
Emilia Kaspercb2bc052015-01-05 13:46:26 +0100189
Richard Levitteb4a7b4e2019-10-29 13:37:54 +0100190my @cl_devteam_warn = qw(
191 /WX
192);
193
Dr. Stephen Henson0c28f272009-09-09 16:31:32 +0000194my $strict_warnings = 0;
195
Andy Polyakovb7efa562005-01-24 14:38:14 +0000196# As for $BSDthreads. Idea is to maintain "collective" set of flags,
Felix Laurie von Massenbachfce0ba52014-05-26 17:19:28 +0100197# which would cover all BSD flavors. -pthread applies to them all,
Andy Polyakovb7efa562005-01-24 14:38:14 +0000198# but is treated differently. OpenBSD expands is as -D_POSIX_THREAD
199# -lc_r, which is sufficient. FreeBSD 4.x expands it as -lc_r,
200# which has to be accompanied by explicit -D_THREAD_SAFE and
201# sometimes -D_REENTRANT. FreeBSD 5.x expands it as -lc_r, which
202# seems to be sufficient?
Richard Levitte9c62a272016-02-27 16:51:34 +0100203our $BSDthreads="-pthread -D_THREAD_SAFE -D_REENTRANT";
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000204
Viktor Dukhovni98186eb2016-01-04 23:00:33 -0500205#
FdaSilvaYYf430ba32016-06-19 19:39:01 +0200206# API compatibility name to version number mapping.
Viktor Dukhovni98186eb2016-01-04 23:00:33 -0500207#
Viktor Dukhovni98186eb2016-01-04 23:00:33 -0500208my $apitable = {
Richard Levittea6a4d0a2019-11-05 17:00:33 +0100209 # This table expresses when API additions or changes can occur.
210 # The numbering used changes from 3.0 and on because we updated
211 # (solidified) our version numbering scheme at that point.
212
Daniel Bevenius55affca2020-07-09 07:28:19 +0200213 # From 3.0 and on, we internalise the given version number in decimal
Richard Levittea6a4d0a2019-11-05 17:00:33 +0100214 # as MAJOR * 10000 + MINOR * 100 + 0
215 "3.0.0" => 30000,
216 "3.0" => 30000,
217
218 # Note that before 3.0, we didn't have the same version number scheme.
219 # Still, the numbering we use here covers what we need.
220 "1.1.1" => 10101,
221 "1.1.0" => 10100,
222 "1.0.2" => 10002,
223 "1.0.1" => 10001,
224 "1.0.0" => 10000,
225 "0.9.8" => 908,
Viktor Dukhovni98186eb2016-01-04 23:00:33 -0500226};
227
Richard Levitte18062612020-03-03 15:04:42 +0100228# For OpenSSL::config::get_platform
229my %guess_opts = ();
230
231my $dryrun = 0;
232
Richard Levitte9e0724a2015-05-18 02:54:28 +0200233our %table = ();
Richard Levitte291e94d2015-05-18 22:35:23 +0200234our %config = ();
Richard Levitte98fdbce2016-02-27 11:37:33 +0100235our %withargs = ();
Andy Polyakovf770d752018-03-26 12:35:57 +0200236our $now_printing; # set to current entry's name in print_table_entry
237 # (todo: right thing would be to encapsulate name
238 # into %target [class] and make print_table_entry
239 # a method)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000240
Richard Levittebd5192b2015-05-18 02:57:24 +0200241# Forward declarations ###############################################
Andy Polyakov7ead0c82015-03-16 22:33:36 +0100242
Richard Levittebd5192b2015-05-18 02:57:24 +0200243# read_config(filename)
244#
245# Reads a configuration file and populates %table with the contents
246# (which the configuration file places in %targets).
247sub read_config;
Andy Polyakov7ead0c82015-03-16 22:33:36 +0100248
Richard Levittebd5192b2015-05-18 02:57:24 +0200249# resolve_config(target)
250#
FdaSilvaYY8483a002016-03-10 21:34:48 +0100251# Resolves all the late evaluations, inheritances and so on for the
Richard Levittebd5192b2015-05-18 02:57:24 +0200252# chosen target and any target it inherits from.
253sub resolve_config;
Richard Levitteaaf878c2015-03-06 02:00:21 +0100254
Rich Salzf09e7ca2015-02-24 17:40:22 -0500255
Richard Levitte107b5792015-05-20 20:03:20 +0200256# Information collection #############################################
257
Richard Levitte9fe2bb72016-01-29 19:45:51 +0100258# Unified build supports separate build dir
Richard Levitteec182ef2016-02-09 10:15:13 +0100259my $srcdir = catdir(absolutedir(dirname($0))); # catdir ensures local syntax
260my $blddir = catdir(absolutedir(".")); # catdir ensures local syntax
Richard Levitte610e2b32020-07-01 10:06:59 +0200261
262# File::Spec::Unix doesn't detect case insensitivity, so we make sure to
263# check if the source and build directory are really the same, and make
264# them so. This avoids all kinds of confusion later on.
265# We must check @File::Spec::ISA rather than using File::Spec->isa() to
266# know if File::Spec ended up loading File::Spec::Unix.
267$srcdir = $blddir
268 if (grep(/::Unix$/, @File::Spec::ISA)
269 && samedir($srcdir, $blddir));
270
Richard Levitte9fe2bb72016-01-29 19:45:51 +0100271my $dofile = abs2rel(catfile($srcdir, "util/dofile.pl"));
272
Richard Levitteb5293d42016-05-02 16:50:51 +0200273my $local_config_envname = 'OPENSSL_LOCAL_CONFIG_DIR';
274
Richard Levitte610e2b32020-07-01 10:06:59 +0200275$config{sourcedir} = abs2rel($srcdir, $blddir);
276$config{builddir} = abs2rel($blddir, $blddir);
Rich Salz31214252020-06-29 12:20:41 +1000277# echo -n 'holy hand grenade of antioch' | openssl sha256
278$config{FIPSKEY} =
279 'f4556650ac31d35461610bac4ed81b1a181b2d8a43ea2854cbae22ca74560813';
Richard Levitte9fe2bb72016-01-29 19:45:51 +0100280
Richard Levitteee4cdb72016-08-29 22:11:36 +0200281# Collect reconfiguration information if needed
282my @argvcopy=@ARGV;
283
284if (grep /^reconf(igure)?$/, @argvcopy) {
Richard Levitte99aeeec2017-11-30 21:46:53 +0100285 die "reconfiguring with other arguments present isn't supported"
286 if scalar @argvcopy > 1;
Richard Levitteee4cdb72016-08-29 22:11:36 +0200287 if (-f "./configdata.pm") {
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100288 my $file = "./configdata.pm";
289 unless (my $return = do $file) {
290 die "couldn't parse $file: $@" if $@;
Richard Levitteee4cdb72016-08-29 22:11:36 +0200291 die "couldn't do $file: $!" unless defined $return;
292 die "couldn't run $file" unless $return;
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100293 }
Richard Levitteee4cdb72016-08-29 22:11:36 +0200294
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100295 @argvcopy = defined($configdata::config{perlargv}) ?
296 @{$configdata::config{perlargv}} : ();
297 die "Incorrect data to reconfigure, please do a normal configuration\n"
298 if (grep(/^reconf/,@argvcopy));
299 $config{perlenv} = $configdata::config{perlenv} // {};
Richard Levitteee4cdb72016-08-29 22:11:36 +0200300 } else {
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100301 die "Insufficient data to reconfigure, please do a normal configuration\n";
Richard Levitteee4cdb72016-08-29 22:11:36 +0200302 }
303}
304
305$config{perlargv} = [ @argvcopy ];
306
Richard Levitteb16654a2020-03-02 10:50:24 +0100307# Historical: if known directories in crypto/ have been removed, it means
308# that those sub-systems are disabled.
309# (the other option would be to removed them from the SUBDIRS statement in
310# crypto/build.info)
311# We reverse the input list for cosmetic purely reasons, to compensate that
312# 'unshift' adds at the front of the list (i.e. in reverse input order).
313foreach ( reverse sort( 'aes', 'aria', 'bf', 'camellia', 'cast', 'des', 'dh',
314 'dsa', 'ec', 'hmac', 'idea', 'md2', 'md5', 'mdc2',
Richard Levitte3a1ee3c2020-12-17 21:37:15 +0100315 'rc2', 'rc4', 'rc5', 'ripemd', 'seed', 'sha',
Richard Levitteb16654a2020-03-02 10:50:24 +0100316 'sm2', 'sm3', 'sm4') ) {
317 unshift @argvcopy, "no-$_" if ! -d catdir($srcdir, 'crypto', $_);
318}
319
Richard Levitte107b5792015-05-20 20:03:20 +0200320# Collect version numbers
Richard Levitte20551b22019-10-17 16:03:06 +0200321my %version = ();
Richard Levitte107b5792015-05-20 20:03:20 +0200322
323collect_information(
Dr. David von Oheimb036cbb62020-06-10 14:15:28 +0200324 collect_from_file(catfile($srcdir,'VERSION.dat')),
Richard Levitte20551b22019-10-17 16:03:06 +0200325 qr/\s*(\w+)\s*=\s*(.*?)\s*$/ =>
326 sub {
327 # Only define it if there is a value at all
Richard Levitte6a960a92020-04-23 18:59:10 +0200328 if ($2 ne '') {
329 my $k = $1;
330 my $v = $2;
331 # Some values are quoted. Trim the quotes
332 $v = $1 if $v =~ /^"(.*)"$/;
333 $version{uc $k} = $v;
334 }
Richard Levitte20551b22019-10-17 16:03:06 +0200335 },
336 "OTHERWISE" =>
Dr. David von Oheimb036cbb62020-06-10 14:15:28 +0200337 sub { die "Something wrong with this line:\n$_\nin $srcdir/VERSION.dat" },
Richard Levitte107b5792015-05-20 20:03:20 +0200338 );
Richard Levitte20551b22019-10-17 16:03:06 +0200339
340$config{major} = $version{MAJOR} // 'unknown';
341$config{minor} = $version{MINOR} // 'unknown';
342$config{patch} = $version{PATCH} // 'unknown';
343$config{prerelease} =
344 defined $version{PRE_RELEASE_TAG} ? "-$version{PRE_RELEASE_TAG}" : '';
345$config{build_metadata} =
346 defined $version{BUILD_METADATA} ? "+$version{BUILD_METADATA}" : '';
347$config{shlib_version} = $version{SHLIB_VERSION} // 'unknown';
348$config{release_date} = $version{RELEASE_DATE} // 'xx XXX xxxx';
Richard Levitte107b5792015-05-20 20:03:20 +0200349
Dr. Matthias St. Pierre16942e02018-12-07 00:32:43 +0100350$config{version} = "$config{major}.$config{minor}.$config{patch}";
351$config{full_version} = "$config{version}$config{prerelease}$config{build_metadata}";
352
Dr. David von Oheimb036cbb62020-06-10 14:15:28 +0200353die "erroneous version information in VERSION.dat: ",
Richard Levitte20551b22019-10-17 16:03:06 +0200354 "$config{version}, $config{shlib_version}\n"
355 unless (defined $version{MAJOR}
356 && defined $version{MINOR}
357 && defined $version{PATCH}
358 && defined $version{SHLIB_VERSION});
359
Richard Levitte107b5792015-05-20 20:03:20 +0200360# Collect target configurations
361
Richard Levitte85152ca2016-02-02 19:47:05 +0100362my $pattern = catfile(dirname($0), "Configurations", "*.conf");
Andy Polyakov97855552016-05-28 16:11:01 +0200363foreach (sort glob($pattern)) {
Rich Salzf09e7ca2015-02-24 17:40:22 -0500364 &read_config($_);
365}
366
Richard Levitte7ecdf182017-11-29 13:09:01 +0100367if (defined env($local_config_envname)) {
Richard Levitteb5293d42016-05-02 16:50:51 +0200368 if ($^O eq 'VMS') {
369 # VMS environment variables are logical names,
370 # which can be used as is
371 $pattern = $local_config_envname . ':' . '*.conf';
372 } else {
Richard Levitte7ecdf182017-11-29 13:09:01 +0100373 $pattern = catfile(env($local_config_envname), '*.conf');
Richard Levitteb5293d42016-05-02 16:50:51 +0200374 }
375
Andy Polyakov97855552016-05-28 16:11:01 +0200376 foreach (sort glob($pattern)) {
Richard Levitteb5293d42016-05-02 16:50:51 +0200377 &read_config($_);
378 }
379}
380
Richard Levitted5fa7032018-02-02 12:21:27 +0100381# Save away perl command information
382$config{perl_cmd} = $^X;
383$config{perl_version} = $Config{version};
384$config{perl_archname} = $Config{archname};
385
Richard Levitte291e94d2015-05-18 22:35:23 +0200386$config{prefix}="";
387$config{openssldir}="";
Richard Levitte7d130f62015-05-19 01:40:54 +0200388$config{processor}="";
Richard Levitte107b5792015-05-20 20:03:20 +0200389$config{libdir}="";
Richard Levitte9c62a272016-02-27 16:51:34 +0100390my $auto_threads=1; # enable threads automatically? true by default
Bodo Möller03964792001-03-09 13:04:06 +0000391my $default_ranlib;
Richard Levitte107b5792015-05-20 20:03:20 +0200392
Viktor Dukhovni6b01bed2016-01-18 13:10:21 -0500393# Known TLS and DTLS protocols
Matt Caswell84a68332016-10-30 08:38:52 +0000394my @tls = qw(ssl3 tls1 tls1_1 tls1_2 tls1_3);
Viktor Dukhovni6b01bed2016-01-18 13:10:21 -0500395my @dtls = qw(dtls1 dtls1_2);
396
FdaSilvaYY8483a002016-03-10 21:34:48 +0100397# Explicitly known options that are possible to disable. They can
Richard Levitte8b527be2015-10-22 17:09:14 +0200398# be regexps, and will be used like this: /^no-${option}$/
399# For developers: keep it sorted alphabetically
400
401my @disablables = (
Pauli38230e32021-04-29 12:38:23 +1000402 "acvp-tests",
Emilia Kasperc91a0a82016-03-14 12:21:44 +0100403 "afalgeng",
Paulid42d0a42017-02-01 10:10:13 +1000404 "aria",
Ben Lauriec38bb722016-03-26 17:19:14 +0000405 "asan",
Richard Levitte8b527be2015-10-22 17:09:14 +0200406 "asm",
Todd Short52739e42016-02-04 11:41:25 -0500407 "async",
Matt Caswellb184e3e2016-02-09 11:26:14 +0000408 "autoalginit",
Matt Caswell498abff2016-02-09 09:39:07 +0000409 "autoerrinit",
Bernd Edlingerdbabc862018-04-15 12:02:25 +0200410 "autoload-config",
Richard Levitte8b527be2015-10-22 17:09:14 +0200411 "bf",
Bill Cox2d0b4412016-03-09 23:08:31 +0100412 "blake2",
Richard Levitteac4033d2019-02-28 13:28:43 +0100413 "buildtest-c++",
Dr. David von Oheimb06f81af2020-12-01 17:15:45 +0100414 "bulk",
Pauli1eaf1fc2021-02-10 21:53:57 +1000415 "cached-fetch",
Richard Levitte8b527be2015-10-22 17:09:14 +0200416 "camellia",
417 "capieng",
418 "cast",
Andy Polyakov48f14842015-12-09 23:02:11 +0100419 "chacha",
Richard Levitte8b527be2015-10-22 17:09:14 +0200420 "cmac",
Richard Levitte538f38d2019-05-08 05:28:47 +0200421 "cmp",
Richard Levitte8b527be2015-10-22 17:09:14 +0200422 "cms",
423 "comp",
Mat3e45d392016-01-09 23:55:57 +0100424 "crypto-mdebug",
Richard Levitte8b527be2015-10-22 17:09:14 +0200425 "ct",
426 "deprecated",
427 "des",
Richard Levitte619eb332017-03-24 16:19:00 +0100428 "devcryptoeng",
Richard Levitte8b527be2015-10-22 17:09:14 +0200429 "dgram",
430 "dh",
431 "dsa",
Bernd Edlinger3b2f8c72019-09-13 10:45:29 +0200432 "dso",
Kurt Roeckxa5ecdc62015-12-12 11:12:22 +0100433 "dtls",
Richard Levitte343ec2b2016-02-19 22:08:37 +0100434 "dynamic-engine",
Richard Levitte8b527be2015-10-22 17:09:14 +0200435 "ec",
436 "ec2m",
Dr. Matthias St. Pierreafa0a132021-04-26 01:01:50 +0200437 "ec_nistp_64_gcc_128",
Viktor Dukhovni6b01bed2016-01-18 13:10:21 -0500438 "ecdh",
439 "ecdsa",
Richard Levitteb31feae2016-02-03 21:08:17 +0100440 "egd",
Richard Levitte8b527be2015-10-22 17:09:14 +0200441 "engine",
Rich Salz1288f262016-02-17 13:33:51 -0500442 "err",
Matt Caswellce2596d2016-10-12 16:21:13 +0100443 "external-tests",
David Woodhouse02f71142015-07-30 11:45:25 +0100444 "filenames",
Matt Caswelle7545512019-03-20 14:29:05 +0000445 "fips",
Shane Lontis7a810fa2020-09-04 17:55:28 +1000446 "fips-securitychecks",
Kurt Roeckxf59d0132016-05-07 22:09:13 +0200447 "fuzz-afl",
Dr. Matthias St. Pierreafa0a132021-04-26 01:01:50 +0200448 "fuzz-libfuzzer",
Matt Caswell168c3b72016-03-21 15:04:08 +0000449 "gost",
Richard Levitte8b527be2015-10-22 17:09:14 +0200450 "idea",
Rich Salz742ccab2019-12-04 13:15:08 -0500451 "ktls",
Matt Caswelld0308922019-04-05 10:47:05 +0100452 "legacy",
Richard Levitte4b2981f2021-05-17 23:10:02 +0200453 "loadereng",
Richard Levitte09aa2632016-03-09 01:14:29 +0100454 "makedepend",
Richard Levitte8b527be2015-10-22 17:09:14 +0200455 "md2",
456 "md4",
Richard Levitte8b527be2015-10-22 17:09:14 +0200457 "mdc2",
Richard Levitte34786bd2019-03-31 15:17:58 +0200458 "module",
Emilia Kasper29df3062016-07-28 20:24:28 +0200459 "msan",
Matt Caswellfa22f982016-03-07 23:26:32 +0000460 "multiblock",
Richard Levitte8b527be2015-10-22 17:09:14 +0200461 "nextprotoneg",
462 "ocb",
463 "ocsp",
Richard Levitte469ce8f2019-03-01 13:18:11 +0100464 "padlockeng",
Richard Levitteae482422016-02-22 02:09:11 +0100465 "pic",
Dr. Matthias St. Pierreafa0a132021-04-26 01:01:50 +0200466 "pinshared",
Andy Polyakov48f14842015-12-09 23:02:11 +0100467 "poly1305",
Richard Levitte8b527be2015-10-22 17:09:14 +0200468 "posix-io",
469 "psk",
470 "rc2",
471 "rc4",
472 "rc5",
473 "rdrand",
474 "rfc3779",
Richard Levitte8b527be2015-10-22 17:09:14 +0200475 "rmd160",
Richard Levitte8b527be2015-10-22 17:09:14 +0200476 "scrypt",
Richard Levitte8b527be2015-10-22 17:09:14 +0200477 "sctp",
Rich Salz69433352020-02-05 14:28:37 -0500478 "secure-memory",
Richard Levitte8b527be2015-10-22 17:09:14 +0200479 "seed",
Richard Levitte8b527be2015-10-22 17:09:14 +0200480 "shared",
Todd Short3f5616d2017-01-11 16:38:44 -0500481 "siphash",
Todd Shortb1ceb432017-05-19 10:27:28 -0400482 "siv",
Matt Caswell1bf2cc22018-03-19 16:17:58 +0000483 "sm2",
Jack Lloyda0c3e4f2017-10-25 13:19:02 -0400484 "sm3",
Ronald Tsef19a5ff2017-10-31 15:19:14 +1000485 "sm4",
Richard Levitte8b527be2015-10-22 17:09:14 +0200486 "sock",
487 "srp",
488 "srtp",
489 "sse2",
490 "ssl",
Richard Levitte8b527be2015-10-22 17:09:14 +0200491 "ssl-trace",
492 "static-engine",
493 "stdio",
Richard Levitte93880ce2016-08-30 06:02:50 +0200494 "tests",
Todd Shorta3e53d52021-09-08 16:23:04 -0400495 "tfo",
Richard Levitte8b527be2015-10-22 17:09:14 +0200496 "threads",
497 "tls",
Richard Levitte16a9d372018-12-12 21:31:36 +0100498 "trace",
Rich Salz1288f262016-02-17 13:33:51 -0500499 "ts",
Ben Lauriec38bb722016-03-26 17:19:14 +0000500 "ubsan",
Richard Levitte48feace2017-07-01 12:14:37 +0200501 "ui-console",
Richard Levitte8b527be2015-10-22 17:09:14 +0200502 "unit-test",
MouriNaruto5ded1ca2019-05-12 05:10:58 +0800503 "uplink",
Matt Caswell8b1a5af2016-03-03 15:40:51 +0000504 "weak-ssl-ciphers",
Dr. Matthias St. Pierreafa0a132021-04-26 01:01:50 +0200505 "whirlpool",
Richard Levitte8b527be2015-10-22 17:09:14 +0200506 "zlib",
507 "zlib-dynamic",
508 );
Viktor Dukhovni6b01bed2016-01-18 13:10:21 -0500509foreach my $proto ((@tls, @dtls))
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100510 {
511 push(@disablables, $proto);
512 push(@disablables, "$proto-method") unless $proto eq "tls1_3";
513 }
Richard Levitte8b527be2015-10-22 17:09:14 +0200514
Richard Levitte538f38d2019-05-08 05:28:47 +0200515# Internal disablables, for aliasing purposes. They serve no special
516# purpose here, but allow scripts to get to know them through configdata.pm,
517# where these are merged with @disablables.
518# The actual aliasing mechanism is done via %disable_cascades
519my @disablables_int = qw(
520 crmf
521 );
522
Matt Caswell2b1343b2016-06-16 11:45:24 +0100523my %deprecated_disablables = (
524 "ssl2" => undef,
525 "buf-freelists" => undef,
Rich Salz14611382019-12-11 10:56:12 -0500526 "crypto-mdebug-backtrace" => undef,
Richard Levitte469ce8f2019-03-01 13:18:11 +0100527 "hw" => "hw", # causes cascade, but no macro
528 "hw-padlock" => "padlockeng",
Richard Levitte48feace2017-07-01 12:14:37 +0200529 "ripemd" => "rmd160",
530 "ui" => "ui-console",
Richard Levitte0b45d8e2019-04-01 17:37:16 +0200531 "heartbeats" => undef,
Richard Levittee80381e2016-02-22 10:42:53 +0100532 );
533
Daniel Bevenius094925d2018-03-31 18:29:12 -0400534# All of the following are disabled by default:
Bodo Möllerc9a112f2005-02-22 10:29:51 +0000535
Richard Levitte9e04edf2016-02-22 13:45:46 +0100536our %disabled = ( # "what" => "comment"
Dr. Matthias St. Pierreb2d8c7b2021-04-26 01:04:26 +0200537 "fips" => "default",
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100538 "asan" => "default",
539 "buildtest-c++" => "default",
540 "crypto-mdebug" => "default",
541 "crypto-mdebug-backtrace" => "default",
542 "devcryptoeng" => "default",
543 "ec_nistp_64_gcc_128" => "default",
544 "egd" => "default",
545 "external-tests" => "default",
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100546 "fuzz-afl" => "default",
Dr. Matthias St. Pierreafa0a132021-04-26 01:01:50 +0200547 "fuzz-libfuzzer" => "default",
548 "ktls" => "default",
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100549 "md2" => "default",
Emilia Kasper29df3062016-07-28 20:24:28 +0200550 "msan" => "default",
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100551 "rc5" => "default",
552 "sctp" => "default",
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100553 "ssl3" => "default",
554 "ssl3-method" => "default",
Todd Shorta3e53d52021-09-08 16:23:04 -0400555 "tfo" => "default",
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100556 "trace" => "default",
557 "ubsan" => "default",
558 "unit-test" => "default",
559 "weak-ssl-ciphers" => "default",
560 "zlib" => "default",
561 "zlib-dynamic" => "default",
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100562 );
Bodo Möllerc9a112f2005-02-22 10:29:51 +0000563
Richard Levittec569e202015-05-18 11:03:47 +0200564# Note: => pair form used for aesthetics, not to truly make a hash table
565my @disable_cascades = (
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100566 # "what" => [ "cascade", ... ]
Richard Levittee3577ad2020-12-18 15:39:50 +0100567 "bulk" => [ "shared", "dso",
Dr. David von Oheimb06f81af2020-12-01 17:15:45 +0100568 "aria", "async", "autoload-config",
569 "blake2", "bf", "camellia", "cast", "chacha",
570 "cmac", "cms", "cmp", "comp", "ct",
571 "des", "dgram", "dh", "dsa",
572 "ec", "engine",
573 "filenames",
574 "idea", "ktls",
575 "md4", "multiblock", "nextprotoneg",
576 "ocsp", "ocb", "poly1305", "psk",
577 "rc2", "rc4", "rmd160",
578 "seed", "siphash", "siv",
579 "sm3", "sm4", "srp",
Arran Cudbard-Bell726f92e2021-06-08 16:45:38 -0500580 "srtp", "ssl3-method", "ssl-trace",
Todd Shorta3e53d52021-09-08 16:23:04 -0400581 "tfo",
Dr. David von Oheimb06f81af2020-12-01 17:15:45 +0100582 "ts", "ui-console", "whirlpool",
583 "fips-securitychecks" ],
Richard Levitte7d130f62015-05-19 01:40:54 +0200584 sub { $config{processor} eq "386" }
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100585 => [ "sse2" ],
586 "ssl" => [ "ssl3" ],
587 "ssl3-method" => [ "ssl3" ],
588 "zlib" => [ "zlib-dynamic" ],
589 "des" => [ "mdc2" ],
Dr. David von Oheimb06f81af2020-12-01 17:15:45 +0100590 "ec" => [ "ec2m", "ecdsa", "ecdh", "sm2", "gost" ],
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100591 "dgram" => [ "dtls", "sctp" ],
Todd Shorta3e53d52021-09-08 16:23:04 -0400592 "sock" => [ "dgram", "tfo" ],
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100593 "dtls" => [ @dtls ],
Richard Levitte343a7462017-02-17 20:48:28 +0100594 sub { 0 == scalar grep { !$disabled{$_} } @dtls }
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100595 => [ "dtls" ],
Richard Levittec569e202015-05-18 11:03:47 +0200596
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100597 "tls" => [ @tls ],
Richard Levitte343a7462017-02-17 20:48:28 +0100598 sub { 0 == scalar grep { !$disabled{$_} } @tls }
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100599 => [ "tls" ],
Richard Levittec569e202015-05-18 11:03:47 +0200600
Richard Levitteef8ca6b2016-02-14 12:16:52 +0100601 "crypto-mdebug" => [ "crypto-mdebug-backtrace" ],
Richard Levitte343ec2b2016-02-19 22:08:37 +0100602
Richard Levitte34786bd2019-03-31 15:17:58 +0200603 # If no modules, then no dynamic engines either
604 "module" => [ "dynamic-engine" ],
605
606 # Without shared libraries, dynamic engines aren't possible.
607 # This is due to them having to link with libcrypto and register features
608 # using the ENGINE functionality, and since that relies on global tables,
Dimitris Apostoloue304aa82022-01-03 01:00:27 +0200609 # those *have* to be exactly the same as the ones accessed from the app,
Richard Levitte34786bd2019-03-31 15:17:58 +0200610 # which cannot be guaranteed if shared libraries aren't present.
611 # (note that even with shared libraries, both the app and dynamic engines
612 # must be linked with the same library)
MouriNaruto5ded1ca2019-05-12 05:10:58 +0800613 "shared" => [ "dynamic-engine", "uplink" ],
Bernd Edlinger3b2f8c72019-09-13 10:45:29 +0200614 "dso" => [ "dynamic-engine", "module" ],
Richard Levitte34786bd2019-03-31 15:17:58 +0200615 # Other modules don't necessarily have to link with libcrypto, so shared
616 # libraries do not have to be a condition to produce those.
617
618 # Without position independent code, there can be no shared libraries
619 # or modules.
620 "pic" => [ "shared", "module" ],
Richard Levitte469ce8f2019-03-01 13:18:11 +0100621
Richard Levittee1f5a922020-09-29 10:31:56 +0200622 "module" => [ "fips", "dso" ],
Matt Caswelle7545512019-03-20 14:29:05 +0000623
Matt Caswellb8fa02e2020-11-24 16:45:48 +0000624 "engine" => [ "dynamic-engine", grep(/eng$/, @disablables) ],
Richard Levitte86ff7cf2021-06-22 12:10:21 +0200625 "dynamic-engine" => [ "loadereng" ],
Richard Levitte469ce8f2019-03-01 13:18:11 +0100626 "hw" => [ "padlockeng" ],
Matt Caswelld90a6be2016-04-14 13:44:15 +0100627
628 # no-autoalginit is only useful when building non-shared
Pauli9c11e8e2021-04-22 16:43:13 +1000629 "autoalginit" => [ "shared", "apps", "fips" ],
Matt Caswelld90a6be2016-04-14 13:44:15 +0100630
Richard Levitte15a1bd02017-09-12 07:47:05 +0200631 "stdio" => [ "apps", "capieng", "egd" ],
Matt Caswelld90a6be2016-04-14 13:44:15 +0100632 "apps" => [ "tests" ],
Richard Levitte302eba32017-08-28 15:41:49 +0200633 "tests" => [ "external-tests" ],
Matt Caswell3cf96e82016-12-28 15:32:39 +0000634 "comp" => [ "zlib" ],
Todd Short98020022018-03-19 13:21:13 -0400635 "sm3" => [ "sm2" ],
Richard Levitteb6127992016-11-15 14:53:33 +0100636 sub { !$disabled{"unit-test"} } => [ "heartbeats" ],
Emilia Kasper29df3062016-07-28 20:24:28 +0200637
638 sub { !$disabled{"msan"} } => [ "asm" ],
Todd Shortb1ceb432017-05-19 10:27:28 -0400639
Matt Caswell6d2a1ef2021-02-05 11:28:15 +0000640 "cmac" => [ "siv" ],
641 "legacy" => [ "md2" ],
Richard Levitte538f38d2019-05-08 05:28:47 +0200642
643 "cmp" => [ "crmf" ],
Matt Caswellc72fa252019-12-05 17:09:49 +0000644
Paulic3c00c72021-07-16 10:31:41 +1000645 "fips" => [ "fips-securitychecks", "acvp-tests" ],
Randall S. Beckerccdfcf02021-03-22 08:31:01 -0500646
Matt Caswell6d2a1ef2021-02-05 11:28:15 +0000647 "deprecated-3.0" => [ "engine", "srp" ]
Richard Levittec569e202015-05-18 11:03:47 +0200648 );
649
650# Avoid protocol support holes. Also disable all versions below N, if version
651# N is disabled while N+1 is enabled.
652#
653my @list = (reverse @tls);
654while ((my $first, my $second) = (shift @list, shift @list)) {
655 last unless @list;
656 push @disable_cascades, ( sub { !$disabled{$first} && $disabled{$second} }
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100657 => [ @list ] );
Richard Levittec569e202015-05-18 11:03:47 +0200658 unshift @list, $second;
659}
660my @list = (reverse @dtls);
661while ((my $first, my $second) = (shift @list, shift @list)) {
662 last unless @list;
663 push @disable_cascades, ( sub { !$disabled{$first} && $disabled{$second} }
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100664 => [ @list ] );
Richard Levittec569e202015-05-18 11:03:47 +0200665 unshift @list, $second;
666}
667
Bodo Möller7a762192008-12-02 01:21:39 +0000668# Explicit "no-..." options will be collected in %disabled along with the defaults.
Rich Salze4ef2e22016-02-10 11:10:39 -0500669# To remove something from %disabled, use "enable-foo".
Bodo Möller7a762192008-12-02 01:21:39 +0000670# For symmetry, "disable-foo" is a synonym for "no-foo".
671
Richard Levittebbe486c2020-01-09 14:49:53 +0100672# For the "make variables" CPPINCLUDES and CPPDEFINES, we support lists with
Richard Levitte5b182352018-01-26 19:56:44 +0100673# platform specific list separators. Users from those platforms should
674# recognise those separators from how you set up the PATH to find executables.
675# The default is the Unix like separator, :, but as an exception, we also
676# support the space as separator.
677my $list_separator_re =
678 { VMS => qr/(?<!\^),/,
679 MSWin32 => qr/(?<!\\);/ } -> {$^O} // qr/(?<!\\)[:\s]/;
680# All the "make variables" we support
Richard Levittef5846172018-03-16 08:59:03 +0100681# Some get pre-populated for the sake of backward compatibility
682# (we supported those before the change to "make variable" support.
Richard Levitte5b182352018-01-26 19:56:44 +0100683my %user = (
Richard Levittef5846172018-03-16 08:59:03 +0100684 AR => env('AR'),
Richard Levitte5b182352018-01-26 19:56:44 +0100685 ARFLAGS => [],
686 AS => undef,
687 ASFLAGS => [],
Richard Levittef5846172018-03-16 08:59:03 +0100688 CC => env('CC'),
Richard Levitte8e7984e2019-02-26 23:18:02 +0100689 CFLAGS => [ env('CFLAGS') || () ],
Richard Levittef5846172018-03-16 08:59:03 +0100690 CXX => env('CXX'),
Richard Levitte8e7984e2019-02-26 23:18:02 +0100691 CXXFLAGS => [ env('CXXFLAGS') || () ],
Richard Levitte5b182352018-01-26 19:56:44 +0100692 CPP => undef,
Richard Levitte8e7984e2019-02-26 23:18:02 +0100693 CPPFLAGS => [ env('CPPFLAGS') || () ], # -D, -I, -Wp,
Richard Levitte5b182352018-01-26 19:56:44 +0100694 CPPDEFINES => [], # Alternative for -D
695 CPPINCLUDES => [], # Alternative for -I
Richard Levittef5846172018-03-16 08:59:03 +0100696 CROSS_COMPILE => env('CROSS_COMPILE'),
697 HASHBANGPERL=> env('HASHBANGPERL') || env('PERL'),
Richard Levitte5b182352018-01-26 19:56:44 +0100698 LD => undef,
Richard Levitte8e7984e2019-02-26 23:18:02 +0100699 LDFLAGS => [ env('LDFLAGS') || () ], # -L, -Wl,
700 LDLIBS => [ env('LDLIBS') || () ], # -l
Richard Levitte5b182352018-01-26 19:56:44 +0100701 MT => undef,
702 MTFLAGS => [],
Richard Levitte9e265322018-07-08 12:00:06 +0200703 PERL => env('PERL') || ($^O ne "VMS" ? $^X : "perl"),
Richard Levittef5846172018-03-16 08:59:03 +0100704 RANLIB => env('RANLIB'),
705 RC => env('RC') || env('WINDRES'),
Wojciech Kaluza0c4e9842019-04-21 12:39:20 +0100706 RCFLAGS => [ env('RCFLAGS') || () ],
Richard Levitte5b182352018-01-26 19:56:44 +0100707 RM => undef,
708 );
Richard Levittef729ba52018-02-02 12:27:29 +0100709# Info about what "make variables" may be prefixed with the cross compiler
710# prefix. This should NEVER mention any such variable with a list for value.
711my @user_crossable = qw ( AR AS CC CXX CPP LD MT RANLIB RC );
Richard Levitte5b182352018-01-26 19:56:44 +0100712# The same but for flags given as Configure options. These are *additional*
713# input, as opposed to the VAR=string option that override the corresponding
714# config target attributes
715my %useradd = (
716 CPPDEFINES => [],
717 CPPINCLUDES => [],
718 CPPFLAGS => [],
719 CFLAGS => [],
720 CXXFLAGS => [],
721 LDFLAGS => [],
722 LDLIBS => [],
Wojciech Kaluza0c4e9842019-04-21 12:39:20 +0100723 RCFLAGS => [],
Richard Levitte5b182352018-01-26 19:56:44 +0100724 );
725
726my %user_synonyms = (
727 HASHBANGPERL=> 'PERL',
728 RC => 'WINDRES',
729 );
Richard Levitteabe256e2018-03-06 20:35:30 +0100730
731# Some target attributes have been renamed, this is the translation table
732my %target_attr_translate =(
733 ar => 'AR',
734 as => 'AS',
735 cc => 'CC',
736 cxx => 'CXX',
737 cpp => 'CPP',
738 hashbangperl => 'HASHBANGPERL',
739 ld => 'LD',
740 mt => 'MT',
741 ranlib => 'RANLIB',
742 rc => 'RC',
743 rm => 'RM',
Richard Levitte5b182352018-01-26 19:56:44 +0100744 );
Richard Levitte5b182352018-01-26 19:56:44 +0100745
Richard Levitte2ab92ae2018-03-07 22:44:59 +0100746# Initialisers coming from 'config' scripts
Andy Polyakovff455d92018-03-28 10:06:32 +0200747$config{defines} = [ split(/$list_separator_re/, env('__CNF_CPPDEFINES')) ];
748$config{includes} = [ split(/$list_separator_re/, env('__CNF_CPPINCLUDES')) ];
749$config{cppflags} = [ env('__CNF_CPPFLAGS') || () ];
750$config{cflags} = [ env('__CNF_CFLAGS') || () ];
751$config{cxxflags} = [ env('__CNF_CXXFLAGS') || () ];
752$config{lflags} = [ env('__CNF_LDFLAGS') || () ];
753$config{ex_libs} = [ env('__CNF_LDLIBS') || () ];
Richard Levitte2ab92ae2018-03-07 22:44:59 +0100754
Richard Levitte7d130f62015-05-19 01:40:54 +0200755$config{openssl_api_defines}=[];
Richard Levitte7d130f62015-05-19 01:40:54 +0200756$config{openssl_sys_defines}=[];
Richard Levittee0bf7c02018-11-03 18:34:09 +0100757$config{openssl_feature_defines}=[];
Richard Levitte3fa04f02016-01-12 00:17:12 +0100758$config{options}="";
Richard Levitte8864f0d2016-03-02 19:13:26 +0100759$config{build_type} = "release";
Richard Levitte5b182352018-01-26 19:56:44 +0100760my $target="";
Richard Levittec59cb512000-08-17 10:23:45 +0000761
Richard Levitteac6ae8a2018-03-16 08:24:50 +0100762my %cmdvars = (); # Stores FOO='blah' type arguments
Richard Levittefe052642015-05-18 03:33:55 +0200763my %unsupported_options = ();
Richard Levittee80381e2016-02-22 10:42:53 +0100764my %deprecated_options = ();
Rich Salz8389ec42017-07-18 09:39:21 -0400765# If you change this, update apps/version.c
766my @known_seed_sources = qw(getrandom devrandom os egd none rdcpu librandom);
767my @seed_sources = ();
Richard Levittefad599f2016-10-12 17:05:35 +0200768while (@argvcopy)
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100769 {
770 $_ = shift @argvcopy;
Richard Levitte89bea082017-11-29 13:16:53 +0100771
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100772 # Support env variable assignments among the options
773 if (m|^(\w+)=(.+)?$|)
774 {
775 $cmdvars{$1} = $2;
776 # Every time a variable is given as a configuration argument,
777 # it acts as a reset if the variable.
778 if (exists $user{$1})
779 {
780 $user{$1} = ref $user{$1} eq "ARRAY" ? [] : undef;
781 }
782 #if (exists $useradd{$1})
783 # {
784 # $useradd{$1} = [];
785 # }
786 next;
787 }
Richard Levitte89bea082017-11-29 13:16:53 +0100788
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100789 # VMS is a case insensitive environment, and depending on settings
790 # out of our control, we may receive options uppercased. Let's
791 # downcase at least the part before any equal sign.
792 if ($^O eq "VMS")
793 {
794 s/^([^=]*)/lc($1)/e;
795 }
Andy Polyakov6d5e74f2018-03-14 09:42:42 +0100796
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100797 # some people just can't read the instructions, clang people have to...
798 s/^-no-(?!integrated-as)/no-/;
Richard Levittec59cb512000-08-17 10:23:45 +0000799
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100800 # rewrite some options in "enable-..." form
801 s /^-?-?shared$/enable-shared/;
802 s /^sctp$/enable-sctp/;
803 s /^threads$/enable-threads/;
804 s /^zlib$/enable-zlib/;
805 s /^zlib-dynamic$/enable-zlib-dynamic/;
Matt Caswellcc9f9b92021-05-19 11:46:00 +0100806 s /^fips$/enable-fips/;
Richard Levittec59cb512000-08-17 10:23:45 +0000807
Rich Salze4ef2e22016-02-10 11:10:39 -0500808 if (/^(no|disable|enable)-(.+)$/)
Matt Caswell2b1343b2016-06-16 11:45:24 +0100809 {
810 my $word = $2;
Richard Levitte469ce8f2019-03-01 13:18:11 +0100811 if ($word !~ m|hw(?:-.+)| # special treatment for hw regexp opt
812 && !exists $deprecated_disablables{$word}
813 && !grep { $word eq $_ } @disablables)
Matt Caswell2b1343b2016-06-16 11:45:24 +0100814 {
815 $unsupported_options{$_} = 1;
816 next;
817 }
818 }
819 if (/^no-(.+)$/ || /^disable-(.+)$/)
820 {
Rich Salze4ef2e22016-02-10 11:10:39 -0500821 foreach my $proto ((@tls, @dtls))
822 {
823 if ($1 eq "$proto-method")
824 {
825 $disabled{"$proto"} = "option($proto-method)";
826 last;
827 }
828 }
829 if ($1 eq "dtls")
830 {
831 foreach my $proto (@dtls)
832 {
833 $disabled{$proto} = "option(dtls)";
834 }
Kurt Roeckxc5c77002016-03-28 00:31:23 +0200835 $disabled{"dtls"} = "option(dtls)";
Rich Salze4ef2e22016-02-10 11:10:39 -0500836 }
837 elsif ($1 eq "ssl")
838 {
839 # Last one of its kind
840 $disabled{"ssl3"} = "option(ssl)";
841 }
842 elsif ($1 eq "tls")
843 {
844 # XXX: Tests will fail if all SSL/TLS
845 # protocols are disabled.
846 foreach my $proto (@tls)
847 {
848 $disabled{$proto} = "option(tls)";
849 }
850 }
Richard Levitte343ec2b2016-02-19 22:08:37 +0100851 elsif ($1 eq "static-engine")
852 {
Richard Levitte19ab5792016-02-22 02:06:05 +0100853 delete $disabled{"dynamic-engine"};
Richard Levitte343ec2b2016-02-19 22:08:37 +0100854 }
855 elsif ($1 eq "dynamic-engine")
856 {
Richard Levitte19ab5792016-02-22 02:06:05 +0100857 $disabled{"dynamic-engine"} = "option";
Richard Levitte343ec2b2016-02-19 22:08:37 +0100858 }
Matt Caswell2b1343b2016-06-16 11:45:24 +0100859 elsif (exists $deprecated_disablables{$1})
860 {
861 $deprecated_options{$_} = 1;
862 if (defined $deprecated_disablables{$1})
863 {
864 $disabled{$deprecated_disablables{$1}} = "option";
865 }
866 }
Richard Levitte469ce8f2019-03-01 13:18:11 +0100867 elsif ($1 =~ m|hw(?:-.+)|) # deprecate hw options in regexp form
868 {
869 $deprecated_options{$_} = 1;
870 }
Rich Salze4ef2e22016-02-10 11:10:39 -0500871 else
872 {
873 $disabled{$1} = "option";
874 }
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100875 # No longer an automatic choice
876 $auto_threads = 0 if ($1 eq "threads");
877 }
878 elsif (/^enable-(.+)$/)
879 {
Richard Levitte343ec2b2016-02-19 22:08:37 +0100880 if ($1 eq "static-engine")
881 {
Richard Levitte19ab5792016-02-22 02:06:05 +0100882 $disabled{"dynamic-engine"} = "option";
Richard Levitte343ec2b2016-02-19 22:08:37 +0100883 }
884 elsif ($1 eq "dynamic-engine")
885 {
Richard Levitte19ab5792016-02-22 02:06:05 +0100886 delete $disabled{"dynamic-engine"};
Richard Levitte343ec2b2016-02-19 22:08:37 +0100887 }
Richard Levitte25004db2016-03-03 10:07:29 +0100888 elsif ($1 eq "zlib-dynamic")
889 {
890 delete $disabled{"zlib"};
891 }
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100892 my $algo = $1;
893 delete $disabled{$algo};
Richard Levittefe052642015-05-18 03:33:55 +0200894
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100895 # No longer an automatic choice
896 $auto_threads = 0 if ($1 eq "threads");
897 }
Richard Levitte18062612020-03-03 15:04:42 +0100898 elsif (/^-d$/) # From older 'config'
899 {
900 $config{build_type} = "debug";
901 }
902 elsif (/^-v$/) # From older 'config'
903 {
904 $guess_opts{verbose} = 1;
905 }
Rich Salzecb09ba2021-08-17 11:42:21 -0400906 elsif (/^-w$/)
Richard Levitte18062612020-03-03 15:04:42 +0100907 {
908 $guess_opts{nowait} = 1;
909 }
910 elsif (/^-t$/) # From older 'config'
911 {
912 $dryrun = 1;
913 }
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100914 elsif (/^--strict-warnings$/)
915 {
916 # Pretend that our strict flags is a C flag, and replace it
917 # with the proper flags later on
918 push @{$useradd{CFLAGS}}, '--ossl-strict-warnings';
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100919 $strict_warnings=1;
920 }
921 elsif (/^--debug$/)
922 {
923 $config{build_type} = "debug";
924 }
925 elsif (/^--release$/)
926 {
927 $config{build_type} = "release";
928 }
929 elsif (/^386$/)
930 { $config{processor}=386; }
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100931 elsif (/^rsaref$/)
932 {
933 # No RSAref support any more since it's not needed.
934 # The check for the option is there so scripts aren't
935 # broken
936 }
Dr. Matthias St. Pierref246f542019-09-21 00:14:16 +0200937 elsif (m|^[-+/]|)
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100938 {
939 if (/^--prefix=(.*)$/)
940 {
941 $config{prefix}=$1;
942 die "Directory given with --prefix MUST be absolute\n"
943 unless file_name_is_absolute($config{prefix});
Rich Salz8389ec42017-07-18 09:39:21 -0400944 }
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100945 elsif (/^--api=(.*)$/)
946 {
Richard Levittea6a4d0a2019-11-05 17:00:33 +0100947 my $api = $1;
948 die "Unknown API compatibility level $api"
949 unless defined $apitable->{$api};
950 $config{api}=$apitable->{$api};
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100951 }
952 elsif (/^--libdir=(.*)$/)
953 {
954 $config{libdir}=$1;
955 }
956 elsif (/^--openssldir=(.*)$/)
957 {
958 $config{openssldir}=$1;
959 }
960 elsif (/^--with-zlib-lib=(.*)$/)
961 {
962 $withargs{zlib_lib}=$1;
963 }
964 elsif (/^--with-zlib-include=(.*)$/)
965 {
966 $withargs{zlib_include}=$1;
967 }
968 elsif (/^--with-fuzzer-lib=(.*)$/)
969 {
970 $withargs{fuzzer_lib}=$1;
971 }
972 elsif (/^--with-fuzzer-include=(.*)$/)
973 {
974 $withargs{fuzzer_include}=$1;
975 }
976 elsif (/^--with-rand-seed=(.*)$/)
977 {
978 foreach my $x (split(m|,|, $1))
979 {
980 die "Unknown --with-rand-seed choice $x\n"
981 if ! grep { $x eq $_ } @known_seed_sources;
982 push @seed_sources, $x;
983 }
984 }
Rich Salz31214252020-06-29 12:20:41 +1000985 elsif (/^--fips-key=(.*)$/)
986 {
987 $user{FIPSKEY}=lc($1);
988 die "Non-hex character in FIPS key\n"
989 if $user{FIPSKEY} =~ /[^a-f0-9]/;
990 die "FIPS key must have even number of characters\n"
991 if length $1 & 1;
992 die "FIPS key too long (64 bytes max)\n"
993 if length $1 > 64;
994 }
Rich Salzd0364dc2021-05-12 10:42:46 -0400995 elsif (/^--banner=(.*)$/)
996 {
997 $banner = $1 . "\n";
998 }
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +0100999 elsif (/^--cross-compile-prefix=(.*)$/)
1000 {
1001 $user{CROSS_COMPILE}=$1;
1002 }
1003 elsif (/^--config=(.*)$/)
1004 {
1005 read_config $1;
1006 }
1007 elsif (/^-l(.*)$/)
1008 {
1009 push @{$useradd{LDLIBS}}, $_;
1010 }
1011 elsif (/^-framework$/)
1012 {
1013 push @{$useradd{LDLIBS}}, $_, shift(@argvcopy);
1014 }
1015 elsif (/^-L(.*)$/ or /^-Wl,/)
1016 {
1017 push @{$useradd{LDFLAGS}}, $_;
1018 }
1019 elsif (/^-rpath$/ or /^-R$/)
1020 # -rpath is the OSF1 rpath flag
1021 # -R is the old Solaris rpath flag
1022 {
1023 my $rpath = shift(@argvcopy) || "";
1024 $rpath .= " " if $rpath ne "";
1025 push @{$useradd{LDFLAGS}}, $_, $rpath;
1026 }
1027 elsif (/^-static$/)
1028 {
1029 push @{$useradd{LDFLAGS}}, $_;
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001030 }
Dr. Matthias St. Pierref246f542019-09-21 00:14:16 +02001031 elsif (m|^[-/]D(.*)$|)
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001032 {
1033 push @{$useradd{CPPDEFINES}}, $1;
1034 }
Dr. Matthias St. Pierref246f542019-09-21 00:14:16 +02001035 elsif (m|^[-/]I(.*)$|)
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001036 {
1037 push @{$useradd{CPPINCLUDES}}, $1;
1038 }
1039 elsif (/^-Wp,$/)
1040 {
1041 push @{$useradd{CPPFLAGS}}, $1;
1042 }
1043 else # common if (/^[-+]/), just pass down...
1044 {
Dr. Matthias St. Pierref246f542019-09-21 00:14:16 +02001045 # Treat %xx as an ASCII code (e.g. replace %20 by a space character).
1046 # This provides a simple way to pass options with arguments separated
1047 # by spaces without quoting (e.g. -opt%20arg translates to -opt arg).
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001048 $_ =~ s/%([0-9a-f]{1,2})/chr(hex($1))/gei;
1049 push @{$useradd{CFLAGS}}, $_;
1050 push @{$useradd{CXXFLAGS}}, $_;
1051 }
1052 }
Dr. Matthias St. Pierref246f542019-09-21 00:14:16 +02001053 elsif (m|^/|)
1054 {
1055 # Treat %xx as an ASCII code (e.g. replace %20 by a space character).
1056 # This provides a simple way to pass options with arguments separated
1057 # by spaces without quoting (e.g. /opt%20arg translates to /opt arg).
1058 $_ =~ s/%([0-9a-f]{1,2})/chr(hex($1))/gei;
1059 push @{$useradd{CFLAGS}}, $_;
1060 push @{$useradd{CXXFLAGS}}, $_;
1061 }
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001062 else
1063 {
1064 die "target already defined - $target (offending arg: $_)\n" if ($target ne "");
1065 $target=$_;
1066 }
1067 unless ($_ eq $target || /^no-/ || /^disable-/)
1068 {
1069 # "no-..." follows later after implied deactivations
1070 # have been derived. (Don't take this too seriously,
1071 # we really only write OPTIONS to the Makefile out of
1072 # nostalgia.)
Richard Levittefe052642015-05-18 03:33:55 +02001073
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001074 if ($config{options} eq "")
1075 { $config{options} = $_; }
1076 else
1077 { $config{options} .= " ".$_; }
1078 }
1079 }
Richard Levitte489eb742015-10-22 17:33:47 +02001080
Richard Levitteddbe7002018-07-22 10:56:25 +02001081if (keys %deprecated_options)
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001082 {
1083 warn "***** Deprecated options: ",
1084 join(", ", keys %deprecated_options), "\n";
1085 }
Richard Levitteddbe7002018-07-22 10:56:25 +02001086if (keys %unsupported_options)
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001087 {
1088 die "***** Unsupported options: ",
1089 join(", ", keys %unsupported_options), "\n";
1090 }
Richard Levitteb6e4dac2001-11-27 11:48:30 +00001091
Richard Levitteac6ae8a2018-03-16 08:24:50 +01001092# If any %useradd entry has been set, we must check that the "make
1093# variables" haven't been set. We start by checking of any %useradd entry
Richard Levittefb174fa2018-03-08 18:49:37 +01001094# is set.
Richard Levitteb9201362018-03-08 14:16:18 +01001095if (grep { scalar @$_ > 0 } values %useradd) {
Richard Levittefb174fa2018-03-08 18:49:37 +01001096 # Hash of env / make variables names. The possible values are:
Richard Levitteac6ae8a2018-03-16 08:24:50 +01001097 # 1 - "make vars"
Richard Levittefb174fa2018-03-08 18:49:37 +01001098 # 2 - %useradd entry set
1099 # 3 - both set
Richard Levitteac6ae8a2018-03-16 08:24:50 +01001100 my %detected_vars =
Richard Levittefb174fa2018-03-08 18:49:37 +01001101 map { my $v = 0;
Richard Levitteac6ae8a2018-03-16 08:24:50 +01001102 $v += 1 if $cmdvars{$_};
Richard Levittefb174fa2018-03-08 18:49:37 +01001103 $v += 2 if @{$useradd{$_}};
1104 $_ => $v }
1105 keys %useradd;
1106
Richard Levitteac6ae8a2018-03-16 08:24:50 +01001107 # If any of the corresponding "make variables" is set, we error
1108 if (grep { $_ & 1 } values %detected_vars) {
1109 my $names = join(', ', grep { $detected_vars{$_} > 0 }
1110 sort keys %detected_vars);
Richard Levitteb9201362018-03-08 14:16:18 +01001111 die <<"_____";
Richard Levitteac6ae8a2018-03-16 08:24:50 +01001112***** Mixing make variables and additional compiler/linker flags as
Richard Levitteb9201362018-03-08 14:16:18 +01001113***** configure command line option is not permitted.
Richard Levitteac6ae8a2018-03-16 08:24:50 +01001114***** Affected make variables: $names
Richard Levitteb9201362018-03-08 14:16:18 +01001115_____
1116 }
1117}
1118
Richard Levitteac6ae8a2018-03-16 08:24:50 +01001119# Check through all supported command line variables to see if any of them
1120# were set, and canonicalise the values we got. If no compiler or linker
1121# flag or anything else that affects %useradd was set, we also check the
1122# environment for values.
1123my $anyuseradd =
1124 grep { defined $_ && (ref $_ ne 'ARRAY' || @$_) } values %useradd;
Richard Levitte5b182352018-01-26 19:56:44 +01001125foreach (keys %user) {
Richard Levitteac6ae8a2018-03-16 08:24:50 +01001126 my $value = $cmdvars{$_};
1127 $value //= env($_) unless $anyuseradd;
1128 $value //=
1129 defined $user_synonyms{$_} ? $cmdvars{$user_synonyms{$_}} : undef;
1130 $value //= defined $user_synonyms{$_} ? env($user_synonyms{$_}) : undef
1131 unless $anyuseradd;
Richard Levitte5b182352018-01-26 19:56:44 +01001132
1133 if (defined $value) {
1134 if (ref $user{$_} eq 'ARRAY') {
Richard Levittebbe486c2020-01-09 14:49:53 +01001135 if ($_ eq 'CPPDEFINES' || $_ eq 'CPPINCLUDES') {
1136 $user{$_} = [ split /$list_separator_re/, $value ];
1137 } else {
1138 $user{$_} = [ $value ];
1139 }
Richard Levitte5b182352018-01-26 19:56:44 +01001140 } elsif (!defined $user{$_}) {
1141 $user{$_} = $value;
1142 }
1143 }
1144}
1145
Andy Polyakov07e4dc32018-06-18 19:08:50 +02001146if (grep { /-rpath\b/ } ($user{LDFLAGS} ? @{$user{LDFLAGS}} : ())
Richard Levitte342a1a22016-09-07 20:56:20 +02001147 && !$disabled{shared}
1148 && !($disabled{asan} && $disabled{msan} && $disabled{ubsan})) {
1149 die "***** Cannot simultaneously use -rpath, shared libraries, and\n",
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001150 "***** any of asan, msan or ubsan\n";
Richard Levitte342a1a22016-09-07 20:56:20 +02001151}
1152
Richard Levittee39795a2020-03-03 00:01:35 +01001153# If no target was given, try guessing.
1154unless ($target) {
Richard Levitte18062612020-03-03 15:04:42 +01001155 my %system_config = OpenSSL::config::get_platform(%guess_opts, %user);
Richard Levittee39795a2020-03-03 00:01:35 +01001156
1157 # The $system_config{disable} is used to populate %disabled with
1158 # entries that aren't already there.
1159 foreach ( @{$system_config{disable} // []} ) {
1160 $disabled{$_} = 'system' unless defined $disabled{$_};
1161 }
1162 delete $system_config{disable};
1163
1164 # Override config entries with stuff from the guesser.
1165 # It's assumed that this really is nothing new.
1166 %config = ( %config, %system_config );
1167 $target = $system_config{target};
1168}
1169
Richard Levitte71ef78d2019-04-23 09:41:19 +02001170sub disable {
1171 my $disable_type = shift;
1172
1173 for (@_) {
1174 $disabled{$_} = $disable_type;
1175 }
1176
1177 my @tocheckfor = (@_ ? @_ : keys %disabled);
1178 while (@tocheckfor) {
1179 my %new_tocheckfor = ();
1180 my @cascade_copy = (@disable_cascades);
1181 while (@cascade_copy) {
1182 my ($test, $descendents) =
1183 (shift @cascade_copy, shift @cascade_copy);
1184 if (ref($test) eq "CODE" ? $test->() : defined($disabled{$test})) {
1185 foreach (grep { !defined($disabled{$_}) } @$descendents) {
1186 $new_tocheckfor{$_} = 1; $disabled{$_} = "cascade";
1187 }
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001188 }
1189 }
Richard Levitte71ef78d2019-04-23 09:41:19 +02001190 @tocheckfor = (keys %new_tocheckfor);
Richard Levittec569e202015-05-18 11:03:47 +02001191 }
Richard Levittec569e202015-05-18 11:03:47 +02001192}
Richard Levitte71ef78d2019-04-23 09:41:19 +02001193disable(); # First cascade run
Ben Laurieedc032b2011-03-12 17:01:19 +00001194
Richard Levitted63c12c2016-08-31 19:47:35 +02001195our $die = sub { die @_; };
Bodo Möller436a3761999-05-28 23:18:51 +00001196if ($target eq "TABLE") {
Richard Levitted63c12c2016-08-31 19:47:35 +02001197 local $die = sub { warn @_; };
Richard Levitte00ae96c2015-05-18 12:53:38 +02001198 foreach (sort keys %table) {
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001199 print_table_entry($_, "TABLE");
Richard Levitte00ae96c2015-05-18 12:53:38 +02001200 }
1201 exit 0;
Bodo Möller436a3761999-05-28 23:18:51 +00001202}
1203
Ulf Möller10a926c2000-02-21 00:55:45 +00001204if ($target eq "LIST") {
Richard Levitte00ae96c2015-05-18 12:53:38 +02001205 foreach (sort keys %table) {
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001206 print $_,"\n" unless $table{$_}->{template};
Richard Levitte00ae96c2015-05-18 12:53:38 +02001207 }
1208 exit 0;
Ulf Möller10a926c2000-02-21 00:55:45 +00001209}
1210
Richard Levitteaaf878c2015-03-06 02:00:21 +01001211if ($target eq "HASH") {
Richard Levitted63c12c2016-08-31 19:47:35 +02001212 local $die = sub { warn @_; };
Richard Levitte00ae96c2015-05-18 12:53:38 +02001213 print "%table = (\n";
1214 foreach (sort keys %table) {
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001215 print_table_entry($_, "HASH");
Richard Levitte00ae96c2015-05-18 12:53:38 +02001216 }
1217 exit 0;
Richard Levitteaaf878c2015-03-06 02:00:21 +01001218}
1219
Dr. Matthias St. Pierre16942e02018-12-07 00:32:43 +01001220print "Configuring OpenSSL version $config{full_version} ";
1221print "for target $target\n";
Richard Levitte64119272016-10-03 17:39:11 +02001222
Richard Levitte51cf8e02018-02-15 18:08:54 +01001223if (scalar(@seed_sources) == 0) {
1224 print "Using os-specific seed configuration\n";
1225 push @seed_sources, 'os';
1226}
Bernd Edlingerddec3322020-05-17 02:08:56 +02001227if (scalar(grep { $_ eq 'egd' } @seed_sources) > 0) {
1228 delete $disabled{'egd'};
1229}
Richard Levitte2805ee12018-08-16 16:01:58 +02001230if (scalar(grep { $_ eq 'none' } @seed_sources) > 0) {
1231 die "Cannot seed with none and anything else" if scalar(@seed_sources) > 1;
1232 warn <<_____ if scalar(@seed_sources) == 1;
Richard Levitte2805ee12018-08-16 16:01:58 +02001233
Dr. Matthias St. Pierrecaa85952018-10-28 12:38:49 +01001234============================== WARNING ===============================
1235You have selected the --with-rand-seed=none option, which effectively
1236disables automatic reseeding of the OpenSSL random generator.
1237All operations depending on the random generator such as creating keys
1238will not work unless the random generator is seeded manually by the
1239application.
1240
1241Please read the 'Note on random number generation' section in the
Richard Levittef828ba02020-04-27 09:08:36 +02001242INSTALL.md instructions and the RAND_DRBG(7) manual page for more
1243details.
Dr. Matthias St. Pierrecaa85952018-10-28 12:38:49 +01001244============================== WARNING ===============================
1245
Richard Levitte2805ee12018-08-16 16:01:58 +02001246_____
1247}
Richard Levittee0bf7c02018-11-03 18:34:09 +01001248push @{$config{openssl_feature_defines}},
Richard Levitte51cf8e02018-02-15 18:08:54 +01001249 map { (my $x = $_) =~ tr|[\-a-z]|[_A-Z]|; "OPENSSL_RAND_SEED_$x" }
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001250 @seed_sources;
Richard Levitte51cf8e02018-02-15 18:08:54 +01001251
Richard Levitte00ae96c2015-05-18 12:53:38 +02001252# Backward compatibility?
Richard Levitte49e04542002-02-14 12:28:24 +00001253if ($target =~ m/^CygWin32(-.*)$/) {
Richard Levitte00ae96c2015-05-18 12:53:38 +02001254 $target = "Cygwin".$1;
Richard Levitte49e04542002-02-14 12:28:24 +00001255}
1256
Richard Levitte906eb3d2017-06-22 00:47:49 +02001257# Support for legacy targets having a name starting with 'debug-'
1258my ($d, $t) = $target =~ m/^(debug-)?(.*)$/;
1259if ($d) {
1260 $config{build_type} = "debug";
1261
1262 # If we do not find debug-foo in the table, the target is set to foo.
1263 if (!$table{$target}) {
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001264 $target = $t;
Richard Levitte906eb3d2017-06-22 00:47:49 +02001265 }
1266}
Richard Levitte4e360442018-08-07 12:38:16 +02001267
Richard Levitte081436b2020-03-03 00:06:52 +01001268if ($target) {
1269 # It's possible that we have different config targets for specific
1270 # toolchains, so we try to detect them, and go for the plain config
1271 # target if not.
1272 my $found;
1273 foreach ( ( "$target-$user{CC}", "$target", undef ) ) {
1274 $found=$_ if $table{$_} && !$table{$_}->{template};
1275 last if $found;
1276 }
1277 $target = $found;
1278} else {
1279 # If we don't have a config target now, we try the C compiler as we
1280 # fallback
1281 my $cc = $user{CC} // 'cc';
1282 $target = $cc if $table{$cc} && !$table{$cc}->{template};
1283}
1284
1285&usage unless $target;
Richard Levitte4e360442018-08-07 12:38:16 +02001286
Richard Levitte18062612020-03-03 15:04:42 +01001287exit 0 if $dryrun; # From older 'config'
1288
Richard Levitte906eb3d2017-06-22 00:47:49 +02001289$config{target} = $target;
1290my %target = resolve_config($target);
1291
Richard Levitteabe256e2018-03-06 20:35:30 +01001292foreach (keys %target_attr_translate) {
1293 $target{$target_attr_translate{$_}} = $target{$_}
1294 if $target{$_};
1295 delete $target{$_};
1296}
1297
Richard Levitte793077d2017-12-01 15:40:43 +01001298%target = ( %{$table{DEFAULTS}}, %target );
1299
Richard Levitte906eb3d2017-06-22 00:47:49 +02001300my %conf_files = map { $_ => 1 } (@{$target{_conf_fname_int}});
1301$config{conf_files} = [ sort keys %conf_files ];
Richard Levitte906eb3d2017-06-22 00:47:49 +02001302
Richard Levitte71ef78d2019-04-23 09:41:19 +02001303# Using sub disable within these loops may prove fragile, so we run
1304# a cascade afterwards
Richard Levitte906eb3d2017-06-22 00:47:49 +02001305foreach my $feature (@{$target{disable}}) {
1306 if (exists $deprecated_disablables{$feature}) {
1307 warn "***** config $target disables deprecated feature $feature\n";
1308 } elsif (!grep { $feature eq $_ } @disablables) {
1309 die "***** config $target disables unknown feature $feature\n";
1310 }
1311 $disabled{$feature} = 'config';
1312}
1313foreach my $feature (@{$target{enable}}) {
Richard Levitte7a8a35f2018-12-12 09:27:48 +01001314 if ("default" eq ($disabled{$feature} // "")) {
Richard Levitte906eb3d2017-06-22 00:47:49 +02001315 if (exists $deprecated_disablables{$feature}) {
1316 warn "***** config $target enables deprecated feature $feature\n";
1317 } elsif (!grep { $feature eq $_ } @disablables) {
1318 die "***** config $target enables unknown feature $feature\n";
1319 }
Richard Levitte7a8a35f2018-12-12 09:27:48 +01001320 delete $disabled{$feature};
Richard Levitte906eb3d2017-06-22 00:47:49 +02001321 }
1322}
Richard Levitteb19fe712019-06-16 12:37:21 +02001323
1324# If uplink_arch isn't defined, disable uplink
1325$disabled{uplink} = 'no uplink_arch' unless (defined $target{uplink_arch});
Richard Levittee6f98ae2019-06-16 13:32:58 +02001326# If asm_arch isn't defined, disable asm
1327$disabled{asm} = 'no asm_arch' unless (defined $target{asm_arch});
Richard Levitteb19fe712019-06-16 12:37:21 +02001328
Richard Levitte71ef78d2019-04-23 09:41:19 +02001329disable(); # Run a cascade now
Richard Levitte906eb3d2017-06-22 00:47:49 +02001330
Richard Levitteabe256e2018-03-06 20:35:30 +01001331$target{CXXFLAGS}//=$target{CFLAGS} if $target{CXX};
1332$target{cxxflags}//=$target{cflags} if $target{CXX};
Richard Levitte9dd4ed22018-10-23 15:09:57 +02001333$target{exe_extension}=".exe" if ($config{target} eq "DJGPP");
Richard Levitte107b5792015-05-20 20:03:20 +02001334$target{exe_extension}=".pm" if ($config{target} =~ /vos/);
Richard Levittee987f9f2016-02-15 17:20:15 +01001335
Richard Levitte9e265322018-07-08 12:00:06 +02001336# Fill %config with values from %user, and in case those are undefined or
1337# empty, use values from %target (acting as a default).
Richard Levitte5b182352018-01-26 19:56:44 +01001338foreach (keys %user) {
Richard Levitte5b182352018-01-26 19:56:44 +01001339 my $ref_type = ref $user{$_};
1340
1341 # Temporary function. Takes an intended ref type (empty string or "ARRAY")
1342 # and a value that's to be coerced into that type.
1343 my $mkvalue = sub {
1344 my $type = shift;
1345 my $value = shift;
1346 my $undef_p = shift;
1347
1348 die "Too many arguments for \$mkvalue" if @_;
1349
1350 while (ref $value eq 'CODE') {
1351 $value = $value->();
1352 }
1353
1354 if ($type eq 'ARRAY') {
1355 return undef unless defined $value;
1356 return undef if ref $value ne 'ARRAY' && !$value;
1357 return undef if ref $value eq 'ARRAY' && !@$value;
1358 return [ $value ] unless ref $value eq 'ARRAY';
1359 }
1360 return undef unless $value;
1361 return $value;
1362 };
1363
Richard Levitteabe256e2018-03-06 20:35:30 +01001364 $config{$_} =
Richard Levitte5b182352018-01-26 19:56:44 +01001365 $mkvalue->($ref_type, $user{$_})
Richard Levitteabe256e2018-03-06 20:35:30 +01001366 || $mkvalue->($ref_type, $target{$_});
1367 delete $config{$_} unless defined $config{$_};
Richard Levitte5b182352018-01-26 19:56:44 +01001368}
Richard Levitteaaf878c2015-03-06 02:00:21 +01001369
Richard Levittec1a09252019-04-23 09:24:38 +02001370# Finish up %config by appending things the user gave us on the command line
1371# apart from "make variables"
1372foreach (keys %useradd) {
1373 # The must all be lists, so we assert that here
1374 die "internal error: \$useradd{$_} isn't an ARRAY\n"
1375 unless ref $useradd{$_} eq 'ARRAY';
1376
1377 if (defined $config{$_}) {
1378 push @{$config{$_}}, @{$useradd{$_}};
1379 } else {
1380 $config{$_} = [ @{$useradd{$_}} ];
1381 }
1382}
1383# At this point, we can forget everything about %user and %useradd,
1384# because it's now all been merged into the corresponding $config entry
1385
Tom Cosgrove0221b082021-05-17 09:59:57 +01001386if (grep { $_ =~ /(?:^|\s)-static(?:\s|$)/ } @{$config{LDFLAGS}}) {
1387 disable('static', 'pic', 'threads');
1388}
1389
Richard Levitte8b5156d2016-08-29 21:45:19 +02001390# Allow overriding the build file name
Richard Levitte5b182352018-01-26 19:56:44 +01001391$config{build_file} = env('BUILDFILE') || $target{build_file} || "Makefile";
Richard Levitteaaf878c2015-03-06 02:00:21 +01001392
Richard Levitte291e94d2015-05-18 22:35:23 +02001393# Make sure build_scheme is consistent.
1394$target{build_scheme} = [ $target{build_scheme} ]
1395 if ref($target{build_scheme}) ne "ARRAY";
Richard Levitted0d046e2002-01-27 15:52:37 +00001396
Richard Levitteddf18472016-01-30 00:57:33 +01001397my ($builder, $builder_platform, @builder_opts) =
1398 @{$target{build_scheme}};
1399
Richard Levitted192a3a2017-03-05 21:51:18 +01001400foreach my $checker (($builder_platform."-".$target{build_file}."-checker.pm",
1401 $builder_platform."-checker.pm")) {
1402 my $checker_path = catfile($srcdir, "Configurations", $checker);
1403 if (-f $checker_path) {
1404 my $fn = $ENV{CONFIGURE_CHECKER_WARN}
1405 ? sub { warn $@; } : sub { die $@; };
1406 if (! do $checker_path) {
1407 if ($@) {
1408 $fn->($@);
1409 } elsif ($!) {
1410 $fn->($!);
1411 } else {
1412 $fn->("The detected tools didn't match the platform\n");
1413 }
1414 }
1415 last;
1416 }
1417}
1418
Richard Levitte488e2b02016-04-01 16:03:46 +02001419push @{$config{defines}}, "NDEBUG" if $config{build_type} eq "release";
1420
Richard Levitteabe256e2018-03-06 20:35:30 +01001421if ($target =~ /^mingw/ && `$config{CC} --target-help 2>&1` =~ m/-mno-cygwin/m)
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001422 {
1423 push @{$config{cflags}}, "-mno-cygwin";
1424 push @{$config{cxxflags}}, "-mno-cygwin" if $config{CXX};
1425 push @{$config{shared_ldflag}}, "-mno-cygwin";
1426 }
Andy Polyakovcbecd292010-11-30 22:18:02 +00001427
Richard Levitte5b182352018-01-26 19:56:44 +01001428if ($target =~ /linux.*-mips/ && !$disabled{asm}
Richard Levittec1a09252019-04-23 09:24:38 +02001429 && !grep { $_ !~ /-m(ips|arch=)/ } (@{$config{CFLAGS}})) {
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001430 # minimally required architecture flags for assembly modules
1431 my $value;
1432 $value = '-mips2' if ($target =~ /mips32/);
1433 $value = '-mips3' if ($target =~ /mips64/);
1434 unshift @{$config{cflags}}, $value;
1435 unshift @{$config{cxxflags}}, $value if $config{CXX};
Andy Polyakov63d88342012-09-15 11:21:50 +00001436}
1437
Richard Levitte9c62a272016-02-27 16:51:34 +01001438# If threads aren't disabled, check how possible they are
1439unless ($disabled{threads}) {
1440 if ($auto_threads) {
1441 # Enabled by default, disable it forcibly if unavailable
1442 if ($target{thread_scheme} eq "(unknown)") {
Richard Levitte71ef78d2019-04-23 09:41:19 +02001443 disable("unavailable", 'threads');
Richard Levitte9c62a272016-02-27 16:51:34 +01001444 }
1445 } else {
FdaSilvaYY8483a002016-03-10 21:34:48 +01001446 # The user chose to enable threads explicitly, let's see
Richard Levitte9c62a272016-02-27 16:51:34 +01001447 # if there's a chance that's possible
1448 if ($target{thread_scheme} eq "(unknown)") {
1449 # If the user asked for "threads" and we don't have internal
1450 # knowledge how to do it, [s]he is expected to provide any
1451 # system-dependent compiler options that are necessary. We
1452 # can't truly check that the given options are correct, but
1453 # we expect the user to know what [s]He is doing.
Richard Levittec1a09252019-04-23 09:24:38 +02001454 if (!@{$config{CFLAGS}} && !@{$config{CPPDEFINES}}) {
Richard Levitte9c62a272016-02-27 16:51:34 +01001455 die "You asked for multi-threading support, but didn't\n"
1456 ,"provide any system-specific compiler options\n";
1457 }
1458 }
1459 }
1460}
1461
Richard Levittebacc3082019-04-17 22:30:03 +02001462# Find out if clang's sanitizers have been enabled with -fsanitize
1463# flags and ensure that the corresponding %disabled elements area
1464# removed to reflect that the sanitizers are indeed enabled.
1465my %detected_sanitizers = ();
1466foreach (grep /^-fsanitize=/, @{$config{CFLAGS} || []}) {
1467 (my $checks = $_) =~ s/^-fsanitize=//;
1468 foreach (split /,/, $checks) {
1469 my $d = { address => 'asan',
1470 undefined => 'ubsan',
1471 memory => 'msan' } -> {$_};
1472 next unless defined $d;
1473
1474 $detected_sanitizers{$d} = 1;
1475 if (defined $disabled{$d}) {
1476 die "***** Conflict between disabling $d and enabling $_ sanitizer"
1477 if $disabled{$d} ne "default";
1478 delete $disabled{$d};
1479 }
1480 }
1481}
1482
Richard Levitte9c62a272016-02-27 16:51:34 +01001483# If threads still aren't disabled, add a C macro to ensure the source
1484# code knows about it. Any other flag is taken care of by the configs.
1485unless($disabled{threads}) {
Richard Levittee0bf7c02018-11-03 18:34:09 +01001486 push @{$config{openssl_feature_defines}}, "OPENSSL_THREADS";
Richard Levitte9c62a272016-02-27 16:51:34 +01001487}
Richard Levittee452de92001-07-12 09:11:14 +00001488
Richard Levitte8c3bc592018-01-23 13:54:55 +01001489my $no_shared_warn=0;
Richard Levittee1f5a922020-09-29 10:31:56 +02001490if (($target{shared_target} // '') eq "")
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001491 {
1492 $no_shared_warn = 1
1493 if (!$disabled{shared} || !$disabled{"dynamic-engine"});
Richard Levitte71ef78d2019-04-23 09:41:19 +02001494 disable('no-shared-target', 'pic');
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001495 }
Richard Levitteb436a982000-07-21 15:08:53 +00001496
Richard Levitte19ab5792016-02-22 02:06:05 +01001497if ($disabled{"dynamic-engine"}) {
Richard Levitte343ec2b2016-02-19 22:08:37 +01001498 $config{dynamic_engines} = 0;
Richard Levitte19ab5792016-02-22 02:06:05 +01001499} else {
Richard Levitte19ab5792016-02-22 02:06:05 +01001500 $config{dynamic_engines} = 1;
Richard Levitte343ec2b2016-02-19 22:08:37 +01001501}
Richard Levitteecd45312002-10-11 18:06:08 +00001502
Richard Levittebacc3082019-04-17 22:30:03 +02001503unless ($disabled{asan} || defined $detected_sanitizers{asan}) {
Richard Levitte5b182352018-01-26 19:56:44 +01001504 push @{$config{cflags}}, "-fsanitize=address";
Ben Lauriec38bb722016-03-26 17:19:14 +00001505}
1506
Richard Levittebacc3082019-04-17 22:30:03 +02001507unless ($disabled{ubsan} || defined $detected_sanitizers{ubsan}) {
FdaSilvaYYf430ba32016-06-19 19:39:01 +02001508 # -DPEDANTIC or -fnosanitize=alignment may also be required on some
Ben Lauriec38bb722016-03-26 17:19:14 +00001509 # platforms.
Richard Levitte5b182352018-01-26 19:56:44 +01001510 push @{$config{cflags}}, "-fsanitize=undefined", "-fno-sanitize-recover=all";
Ben Lauriec38bb722016-03-26 17:19:14 +00001511}
1512
Richard Levittebacc3082019-04-17 22:30:03 +02001513unless ($disabled{msan} || defined $detected_sanitizers{msan}) {
Richard Levitte5b182352018-01-26 19:56:44 +01001514 push @{$config{cflags}}, "-fsanitize=memory";
Emilia Kasper29df3062016-07-28 20:24:28 +02001515}
1516
Richard Levitte65cc6d52016-06-05 10:59:31 +02001517unless ($disabled{"fuzz-libfuzzer"} && $disabled{"fuzz-afl"}
Emilia Kasper29df3062016-07-28 20:24:28 +02001518 && $disabled{asan} && $disabled{ubsan} && $disabled{msan}) {
Richard Levitte5b182352018-01-26 19:56:44 +01001519 push @{$config{cflags}}, "-fno-omit-frame-pointer", "-g";
Richard Levitteabe256e2018-03-06 20:35:30 +01001520 push @{$config{cxxflags}}, "-fno-omit-frame-pointer", "-g" if $config{CXX};
Ben Lauriec38bb722016-03-26 17:19:14 +00001521}
Andy Polyakovc313e322007-09-16 12:23:47 +00001522#
1523# Platform fix-ups
1524#
Richard Levitteae482422016-02-22 02:09:11 +01001525
1526# This saves the build files from having to check
1527if ($disabled{pic})
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001528 {
1529 foreach (qw(shared_cflag shared_cxxflag shared_cppflag
1530 shared_defines shared_includes shared_ldflag
1531 module_cflags module_cxxflags module_cppflags
1532 module_defines module_includes module_lflags))
1533 {
1534 delete $config{$_};
1535 $target{$_} = "";
1536 }
1537 }
Richard Levitte4f160392016-02-21 20:52:39 +01001538else
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001539 {
1540 push @{$config{lib_defines}}, "OPENSSL_PIC";
1541 }
Richard Levitteae482422016-02-22 02:09:11 +01001542
Richard Levitte291e94d2015-05-18 22:35:23 +02001543if ($target{sys_id} ne "")
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001544 {
1545 push @{$config{openssl_sys_defines}}, "OPENSSL_SYS_$target{sys_id}";
1546 }
Richard Levittecf1b7d92001-02-19 16:06:34 +00001547
Richard Levittee373c702019-02-26 09:32:52 +01001548my %predefined_C = compiler_predefined($config{CROSS_COMPILE}.$config{CC});
1549my %predefined_CXX = $config{CXX}
1550 ? compiler_predefined($config{CROSS_COMPILE}.$config{CXX})
1551 : ();
Andy Polyakov54cf3b92017-08-29 15:47:08 +02001552
Andy Polyakov09840412019-05-05 18:30:55 +02001553unless ($disabled{asm}) {
1554 # big endian systems can use ELFv2 ABI
pkubajf5485b92021-11-20 20:40:06 +00001555 if ($target eq "linux-ppc64" || $target eq "BSD-ppc64") {
Andy Polyakov09840412019-05-05 18:30:55 +02001556 $target{perlasm_scheme} = "linux64v2" if ($predefined_C{_CALL_ELF} == 2);
1557 }
1558}
1559
Richard Levittefe191b42017-12-11 20:54:07 +01001560# Check for makedepend capabilities.
Richard Levitte6d75a832017-11-06 17:11:03 +01001561if (!$disabled{makedepend}) {
Richard Levitte2e535eb2021-04-26 09:17:05 +02001562 # If the attribute makedep_scheme is defined, then we assume that the
1563 # config target and its associated build file are programmed to deal
1564 # with it.
1565 # If makedep_scheme is undefined, we go looking for GCC compatible
1566 # dependency making, and if that's not available, we try to fall back
1567 # on 'makedepend'.
1568 if ($target{makedep_scheme}) {
1569 $config{makedep_scheme} = $target{makedep_scheme};
1570 # If the makedepcmd attribute is defined, copy it. If not, the
1571 # build files will have to fend for themselves.
1572 $config{makedepcmd} = $target{makedepcmd} if $target{makedepcmd};
Richard Levittee373c702019-02-26 09:32:52 +01001573 } elsif (($predefined_C{__GNUC__} // -1) >= 3
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001574 && !($predefined_C{__APPLE_CC__} && !$predefined_C{__clang__})) {
Richard Levittefe191b42017-12-11 20:54:07 +01001575 # We know that GNU C version 3 and up as well as all clang
Todd Short717f3082018-05-03 11:17:49 -04001576 # versions support dependency generation, but Xcode did not
1577 # handle $cc -M before clang support (but claims __GNUC__ = 3)
Richard Levitte2e535eb2021-04-26 09:17:05 +02001578 $config{makedep_scheme} = 'gcc';
Richard Levitte6d75a832017-11-06 17:11:03 +01001579 } else {
Richard Levitte2e535eb2021-04-26 09:17:05 +02001580 # In all other cases, we look for 'makedepend', and set the
1581 # makedep_scheme value if we found it.
1582 $config{makedepcmd} = which('makedepend');
1583 $config{makedep_scheme} = 'makedepend' if $config{makedepcmd};
Andy Polyakov54cf3b92017-08-29 15:47:08 +02001584 }
Richard Levitte2e535eb2021-04-26 09:17:05 +02001585
1586 # If no depend scheme is set, we disable makedepend
1587 disable('unavailable', 'makedepend') unless $config{makedep_scheme};
Rich Salzf1f07a22016-01-29 19:50:28 -05001588}
Richard Levitte8ed40b82016-01-27 19:03:13 +01001589
Richard Levittee373c702019-02-26 09:32:52 +01001590if (!$disabled{asm} && !$predefined_C{__MACH__} && $^O ne 'VMS') {
Andy Polyakov0ad40782018-05-04 14:06:44 +02001591 # probe for -Wa,--noexecstack option...
Richard Levittee373c702019-02-26 09:32:52 +01001592 if ($predefined_C{__clang__}) {
Andy Polyakov0ad40782018-05-04 14:06:44 +02001593 # clang has builtin assembler, which doesn't recognize --help,
1594 # but it apparently recognizes the option in question on all
1595 # supported platforms even when it's meaningless. In other words
1596 # probe would fail, but probed option always accepted...
1597 push @{$config{cflags}}, "-Wa,--noexecstack", "-Qunused-arguments";
Andy Polyakov8e5da572018-08-17 14:29:59 +02001598 } else {
Andy Polyakov0ad40782018-05-04 14:06:44 +02001599 my $cc = $config{CROSS_COMPILE}.$config{CC};
1600 open(PIPE, "$cc -Wa,--help -c -o null.$$.o -x assembler /dev/null 2>&1 |");
1601 while(<PIPE>) {
1602 if (m/--noexecstack/) {
1603 push @{$config{cflags}}, "-Wa,--noexecstack";
1604 last;
1605 }
1606 }
1607 close(PIPE);
1608 unlink("null.$$.o");
1609 }
1610}
Richard Levitte7d130f62015-05-19 01:40:54 +02001611
1612# Deal with bn_ops ###################################################
1613
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001614$config{bn_ll} =0;
Richard Levitte7d130f62015-05-19 01:40:54 +02001615my $def_int="unsigned int";
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001616$config{rc4_int} =$def_int;
Rich Salzb4f35e52016-01-23 13:23:25 -05001617($config{b64l},$config{b64},$config{b32})=(0,0,1);
Richard Levitte7d130f62015-05-19 01:40:54 +02001618
Rich Salz94af0cd2016-01-28 10:13:21 -05001619my $count = 0;
Richard Levitte7d130f62015-05-19 01:40:54 +02001620foreach (sort split(/\s+/,$target{bn_ops})) {
Rich Salz94af0cd2016-01-28 10:13:21 -05001621 $count++ if /SIXTY_FOUR_BIT|SIXTY_FOUR_BIT_LONG|THIRTY_TWO_BIT/;
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001622 $config{bn_ll}=1 if $_ eq 'BN_LLONG';
1623 $config{rc4_int}="unsigned char" if $_ eq 'RC4_CHAR';
Rich Salz94af0cd2016-01-28 10:13:21 -05001624 ($config{b64l},$config{b64},$config{b32})
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001625 =(0,1,0) if $_ eq 'SIXTY_FOUR_BIT';
Rich Salz94af0cd2016-01-28 10:13:21 -05001626 ($config{b64l},$config{b64},$config{b32})
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001627 =(1,0,0) if $_ eq 'SIXTY_FOUR_BIT_LONG';
Rich Salz94af0cd2016-01-28 10:13:21 -05001628 ($config{b64l},$config{b64},$config{b32})
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001629 =(0,0,1) if $_ eq 'THIRTY_TWO_BIT';
Richard Levitte7d130f62015-05-19 01:40:54 +02001630}
Rich Salz94af0cd2016-01-28 10:13:21 -05001631die "Exactly one of SIXTY_FOUR_BIT|SIXTY_FOUR_BIT_LONG|THIRTY_TWO_BIT can be set in bn_ops\n"
1632 if $count > 1;
Richard Levitte7d130f62015-05-19 01:40:54 +02001633
Richard Levittea6a4d0a2019-11-05 17:00:33 +01001634$config{api} = $config{major} * 10000 + $config{minor} * 100
1635 unless $config{api};
Richard Levitteb05d6322020-02-06 11:26:22 +01001636foreach (keys %$apitable) {
1637 $disabled{"deprecated-$_"} = "deprecation"
1638 if $disabled{deprecated} && $config{api} >= $apitable->{$_};
1639}
1640
1641disable(); # Run a cascade now
Richard Levitte7d130f62015-05-19 01:40:54 +02001642
1643# Hack cflags for better warnings (dev option) #######################
1644
Richard Levittefa153b52018-01-27 14:56:06 +01001645# "Stringify" the C and C++ flags string. This permits it to be made part of
1646# a string and works as well on command lines.
Richard Levitte5b182352018-01-26 19:56:44 +01001647$config{cflags} = [ map { (my $x = $_) =~ s/([\\\"])/\\$1/g; $x }
1648 @{$config{cflags}} ];
Richard Levittefa153b52018-01-27 14:56:06 +01001649$config{cxxflags} = [ map { (my $x = $_) =~ s/([\\\"])/\\$1/g; $x }
Richard Levitteabe256e2018-03-06 20:35:30 +01001650 @{$config{cxxflags}} ] if $config{CXX};
Richard Levitte1ed0c662002-05-30 18:06:35 +00001651
Richard Levittefcd2d5a2018-11-29 23:05:03 +00001652$config{openssl_api_defines} = [
Richard Levitteb05d6322020-02-06 11:26:22 +01001653 "OPENSSL_CONFIGURED_API=".$config{api},
Richard Levittefcd2d5a2018-11-29 23:05:03 +00001654];
Viktor Dukhovni98186eb2016-01-04 23:00:33 -05001655
Richard Levitte3b437402019-05-27 14:40:25 +02001656my @strict_warnings_collection=();
Dr. Stephen Henson0c28f272009-09-09 16:31:32 +00001657if ($strict_warnings)
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001658 {
1659 my $wopt;
1660 my $gccver = $predefined_C{__GNUC__} // -1;
Andy Polyakov6d505892017-09-21 22:47:12 +02001661
Richard Levitteb4a7b4e2019-10-29 13:37:54 +01001662 if ($gccver >= 4)
1663 {
1664 push @strict_warnings_collection, @gcc_devteam_warn;
1665 push @strict_warnings_collection, @clang_devteam_warn
1666 if (defined($predefined_C{__clang__}));
1667 }
1668 elsif ($config{target} =~ /^VC-/)
1669 {
1670 push @strict_warnings_collection, @cl_devteam_warn;
1671 }
1672 else
1673 {
1674 warn "WARNING --strict-warnings requires gcc[>=4] or gcc-alike, or MSVC"
1675 }
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001676 }
Richard Levitte4650d102019-04-23 09:29:45 +02001677
Richard Levitte3b437402019-05-27 14:40:25 +02001678$config{CFLAGS} = [ map { $_ eq '--ossl-strict-warnings'
1679 ? @strict_warnings_collection
1680 : ( $_ ) }
1681 @{$config{CFLAGS}} ];
Richard Levitteef8ca6b2016-02-14 12:16:52 +01001682
Emilia Kasperc91a0a82016-03-14 12:21:44 +01001683unless ($disabled{afalgeng}) {
1684 $config{afalgeng}="";
Sebastian Andrzej Siewior9e381e82018-01-25 22:50:55 +01001685 if (grep { $_ eq 'afalgeng' } @{$target{enable}}) {
Ross Burton9e1a54f2022-01-27 11:56:56 +00001686 push @{$config{engdirs}}, "afalg";
Richard Levitte79fff392016-03-09 09:04:01 +01001687 } else {
Richard Levitte71ef78d2019-04-23 09:41:19 +02001688 disable('not-linux', 'afalgeng');
clucey7f458a42016-02-17 13:38:36 +00001689 }
1690}
Matt Caswell8da00a32016-02-29 13:36:47 +00001691
Richard Levitte76d0a742019-12-04 00:14:02 +01001692unless ($disabled{devcryptoeng}) {
1693 if ($target =~ m/^BSD/) {
1694 my $maxver = 5*100 + 7;
1695 my $sysstr = `uname -s`;
1696 my $verstr = `uname -r`;
1697 $sysstr =~ s|\R$||;
1698 $verstr =~ s|\R$||;
1699 my ($ma, $mi, @rest) = split m|\.|, $verstr;
1700 my $ver = $ma*100 + $mi;
1701 if ($sysstr eq 'OpenBSD' && $ver >= $maxver) {
1702 disable('too-new-kernel', 'devcryptoeng');
1703 }
1704 }
1705}
1706
Boris Pismenny69495e32018-02-01 14:10:22 +02001707unless ($disabled{ktls}) {
1708 $config{ktls}="";
1709 if ($target =~ m/^linux/) {
1710 my $usr = "/usr/$config{cross_compile_prefix}";
1711 chop($usr);
1712 if ($config{cross_compile_prefix} eq "") {
1713 $usr = "/usr";
1714 }
1715 my $minver = (4 << 16) + (13 << 8) + 0;
1716 my @verstr = split(" ",`cat $usr/include/linux/version.h | grep LINUX_VERSION_CODE`);
1717
1718 if ($verstr[2] < $minver) {
Richard Levitte71ef78d2019-04-23 09:41:19 +02001719 disable('too-old-kernel', 'ktls');
Boris Pismenny69495e32018-02-01 14:10:22 +02001720 }
Andrew Gallatin2111f5c2018-10-22 11:02:19 -04001721 } elsif ($target =~ m/^BSD/) {
1722 my $cc = $config{CROSS_COMPILE}.$config{CC};
1723 system("printf '#include <sys/types.h>\n#include <sys/ktls.h>' | $cc -E - >/dev/null 2>&1");
1724 if ($? != 0) {
1725 disable('too-old-freebsd', 'ktls');
1726 }
Boris Pismenny69495e32018-02-01 14:10:22 +02001727 } else {
Andrew Gallatin2111f5c2018-10-22 11:02:19 -04001728 disable('not-linux-or-freebsd', 'ktls');
Boris Pismenny69495e32018-02-01 14:10:22 +02001729 }
1730}
1731
1732push @{$config{openssl_other_defines}}, "OPENSSL_NO_KTLS" if ($disabled{ktls});
1733
Richard Levitte8f0dd6d2019-04-30 10:33:55 +02001734# Get the extra flags used when building shared libraries and modules. We
1735# do this late because some of them depend on %disabled.
1736
1737# Make the flags to build DSOs the same as for shared libraries unless they
1738# are already defined
1739$target{module_cflags} = $target{shared_cflag} unless defined $target{module_cflags};
1740$target{module_cxxflags} = $target{shared_cxxflag} unless defined $target{module_cxxflags};
1741$target{module_ldflags} = $target{shared_ldflag} unless defined $target{module_ldflags};
1742{
1743 my $shared_info_pl =
1744 catfile(dirname($0), "Configurations", "shared-info.pl");
1745 my %shared_info = read_eval_file($shared_info_pl);
1746 push @{$target{_conf_fname_int}}, $shared_info_pl;
1747 my $si = $target{shared_target};
1748 while (ref $si ne "HASH") {
1749 last if ! defined $si;
1750 if (ref $si eq "CODE") {
1751 $si = $si->();
1752 } else {
1753 $si = $shared_info{$si};
1754 }
1755 }
1756
1757 # Some of the 'shared_target' values don't have any entries in
1758 # %shared_info. That's perfectly fine, AS LONG AS the build file
1759 # template knows how to handle this. That is currently the case for
1760 # Windows and VMS.
1761 if (defined $si) {
1762 # Just as above, copy certain shared_* attributes to the corresponding
1763 # module_ attribute unless the latter is already defined
1764 $si->{module_cflags} = $si->{shared_cflag} unless defined $si->{module_cflags};
1765 $si->{module_cxxflags} = $si->{shared_cxxflag} unless defined $si->{module_cxxflags};
1766 $si->{module_ldflags} = $si->{shared_ldflag} unless defined $si->{module_ldflags};
1767 foreach (sort keys %$si) {
1768 $target{$_} = defined $target{$_}
1769 ? add($si->{$_})->($target{$_})
1770 : $si->{$_};
1771 }
1772 }
1773}
1774
1775# ALL MODIFICATIONS TO %disabled, %config and %target MUST BE DONE FROM HERE ON
Richard Levitte5b182352018-01-26 19:56:44 +01001776
Richard Levitte8c06d712019-12-04 10:55:05 +01001777######################################################################
1778# Build up information for skipping certain directories depending on disabled
1779# features, as well as setting up macros for disabled features.
1780
1781# This is a tentative database of directories to skip. Some entries may not
1782# correspond to anything real, but that's ok, they will simply be ignored.
1783# The actual processing of these entries is done in the build.info lookup
1784# loop further down.
1785#
1786# The key is a Unix formatted path in the source tree, the value is an index
1787# into %disabled_info, so any existing path gets added to a corresponding
1788# 'skipped' entry in there with the list of skipped directories.
1789my %skipdir = ();
1790my %disabled_info = (); # For configdata.pm
1791foreach my $what (sort keys %disabled) {
1792 # There are deprecated disablables that translate to themselves.
Dimitris Apostoloue304aa82022-01-03 01:00:27 +02001793 # They cause disabling cascades, but should otherwise not register.
Richard Levitte8c06d712019-12-04 10:55:05 +01001794 next if $deprecated_disablables{$what};
Richard Levitteb05d6322020-02-06 11:26:22 +01001795 # The generated $disabled{"deprecated-x.y"} entries are special
1796 # and treated properly elsewhere
1797 next if $what =~ m|^deprecated-|;
Richard Levitte8c06d712019-12-04 10:55:05 +01001798
1799 $config{options} .= " no-$what";
1800
1801 if (!grep { $what eq $_ } ( 'buildtest-c++', 'fips', 'threads', 'shared',
1802 'module', 'pic', 'dynamic-engine', 'makedepend',
1803 'zlib-dynamic', 'zlib', 'sse2', 'legacy' )) {
1804 (my $WHAT = uc $what) =~ s|-|_|g;
1805 my $skipdir = $what;
1806
1807 # fix-up crypto/directory name(s)
1808 $skipdir = "ripemd" if $what eq "rmd160";
1809 $skipdir = "whrlpool" if $what eq "whirlpool";
1810
1811 my $macro = $disabled_info{$what}->{macro} = "OPENSSL_NO_$WHAT";
1812 push @{$config{openssl_feature_defines}}, $macro;
1813
1814 $skipdir{engines} = $what if $what eq 'engine';
1815 $skipdir{"crypto/$skipdir"} = $what
1816 unless $what eq 'async' || $what eq 'err' || $what eq 'dso';
1817 }
1818}
1819
1820if ($disabled{"dynamic-engine"}) {
1821 push @{$config{openssl_feature_defines}}, "OPENSSL_NO_DYNAMIC_ENGINE";
1822} else {
1823 push @{$config{openssl_feature_defines}}, "OPENSSL_NO_STATIC_ENGINE";
1824}
1825
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001826# If we use the unified build, collect information from build.info files
1827my %unified_info = ();
1828
Richard Levitte2b6b6062016-03-10 00:04:04 +01001829my $buildinfo_debug = defined($ENV{CONFIGURE_DEBUG_BUILDINFO});
Richard Levitteddf18472016-01-30 00:57:33 +01001830if ($builder eq "unified") {
Richard Levitte1935a582019-09-09 11:51:01 +02001831 use Text::Template 1.46;
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001832
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001833 sub cleandir {
Richard Levitte2e963842016-02-10 02:00:37 +01001834 my $base = shift;
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001835 my $dir = shift;
Richard Levitte2e963842016-02-10 02:00:37 +01001836 my $relativeto = shift || ".";
1837
1838 $dir = catdir($base,$dir) unless isabsolute($dir);
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001839
Richard Levitteec182ef2016-02-09 10:15:13 +01001840 # Make sure the directories we're building in exists
1841 mkpath($dir);
1842
Richard Levitte2e963842016-02-10 02:00:37 +01001843 my $res = abs2rel(absolutedir($dir), rel2abs($relativeto));
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001844 #print STDERR "DEBUG[cleandir]: $dir , $base => $res\n";
1845 return $res;
1846 }
1847
1848 sub cleanfile {
Richard Levitte2e963842016-02-10 02:00:37 +01001849 my $base = shift;
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001850 my $file = shift;
Richard Levitte2e963842016-02-10 02:00:37 +01001851 my $relativeto = shift || ".";
1852
1853 $file = catfile($base,$file) unless isabsolute($file);
1854
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001855 my $d = dirname($file);
1856 my $f = basename($file);
1857
Richard Levitteec182ef2016-02-09 10:15:13 +01001858 # Make sure the directories we're building in exists
1859 mkpath($d);
1860
Richard Levitte2e963842016-02-10 02:00:37 +01001861 my $res = abs2rel(catfile(absolutedir($d), $f), rel2abs($relativeto));
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001862 #print STDERR "DEBUG[cleanfile]: $d , $f => $res\n";
1863 return $res;
1864 }
1865
Richard Levitte1967a422016-09-15 23:55:24 +02001866 # Store the name of the template file we will build the build file from
1867 # in %config. This may be useful for the build file itself.
1868 my @build_file_template_names =
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001869 ( $builder_platform."-".$target{build_file}.".tmpl",
1870 $target{build_file}.".tmpl" );
Richard Levitte1967a422016-09-15 23:55:24 +02001871 my @build_file_templates = ();
1872
1873 # First, look in the user provided directory, if given
Richard Levitte7ecdf182017-11-29 13:09:01 +01001874 if (defined env($local_config_envname)) {
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001875 @build_file_templates =
1876 map {
1877 if ($^O eq 'VMS') {
1878 # VMS environment variables are logical names,
1879 # which can be used as is
1880 $local_config_envname . ':' . $_;
1881 } else {
1882 catfile(env($local_config_envname), $_);
1883 }
1884 }
1885 @build_file_template_names;
Richard Levitte1967a422016-09-15 23:55:24 +02001886 }
1887 # Then, look in our standard directory
1888 push @build_file_templates,
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001889 ( map { cleanfile($srcdir, catfile("Configurations", $_), $blddir) }
1890 @build_file_template_names );
Richard Levitte1967a422016-09-15 23:55:24 +02001891
1892 my $build_file_template;
1893 for $_ (@build_file_templates) {
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001894 $build_file_template = $_;
Richard Levitte1967a422016-09-15 23:55:24 +02001895 last if -f $build_file_template;
1896
1897 $build_file_template = undef;
1898 }
1899 if (!defined $build_file_template) {
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01001900 die "*** Couldn't find any of:\n", join("\n", @build_file_templates), "\n";
Richard Levitte1967a422016-09-15 23:55:24 +02001901 }
1902 $config{build_file_templates}
Richard Levitte82589752018-04-11 13:13:22 +02001903 = [ cleanfile($srcdir, catfile("Configurations", "common0.tmpl"),
1904 $blddir),
Richard Levitte2660b7c2021-05-17 14:33:16 +02001905 $build_file_template ];
Richard Levitte1967a422016-09-15 23:55:24 +02001906
Richard Levitte7f73eaf2018-11-03 15:03:59 +01001907 my @build_dirs = ( [ ] ); # current directory
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001908
Richard Levitte2e0956b2016-02-28 01:13:17 +01001909 $config{build_infos} = [ ];
1910
Richard Levitte507f8382021-01-10 09:08:46 +01001911 # We want to detect configdata.pm in the source tree, so we
1912 # don't use it if the build tree is different.
1913 my $src_configdata = cleanfile($srcdir, "configdata.pm", $blddir);
1914
1915 # Any source file that we recognise is placed in this hash table, with
1916 # the list of its intended destinations as value. When everything has
1917 # been collected, there's a routine that checks that these source files
1918 # exist, or if they are generated, that the generator exists.
1919 my %check_exist = ();
1920 my %check_generate = ();
1921
Richard Levitted201dbc2017-12-28 16:03:17 +01001922 my %ordinals = ();
Richard Levitte7f73eaf2018-11-03 15:03:59 +01001923 while (@build_dirs) {
1924 my @curd = @{shift @build_dirs};
1925 my $sourced = catdir($srcdir, @curd);
1926 my $buildd = catdir($blddir, @curd);
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001927
Richard Levitte75d47db2018-11-03 18:38:04 +01001928 my $unixdir = join('/', @curd);
1929 if (exists $skipdir{$unixdir}) {
1930 my $what = $skipdir{$unixdir};
1931 push @{$disabled_info{$what}->{skipped}}, catdir(@curd);
1932 next;
1933 }
1934
Richard Levittedca99382016-02-08 16:27:15 +01001935 mkpath($buildd);
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001936
Richard Levitte7f73eaf2018-11-03 15:03:59 +01001937 my $f = 'build.info';
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001938 # The basic things we're trying to build
1939 my @programs = ();
1940 my @libraries = ();
Richard Levitte1842f362019-01-31 00:06:50 +01001941 my @modules = ();
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001942 my @scripts = ();
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001943
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001944 my %sources = ();
Richard Levitte2a08d1a2016-03-29 16:45:03 +02001945 my %shared_sources = ();
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001946 my %includes = ();
Richard Levitteb96ab5e2016-10-14 16:56:34 +02001947 my %defines = ();
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001948 my %depends = ();
Richard Levitteae4c7452016-03-07 14:37:00 +01001949 my %generate = ();
Paulid594d2e2021-05-21 15:16:39 +10001950 my %imagedocs = ();
Richard Levitte829f86b2016-08-31 22:54:39 +02001951 my %htmldocs = ();
1952 my %mandocs = ();
Richard Levitte9fe2bb72016-01-29 19:45:51 +01001953
Richard Levitte26fe9b02019-06-12 12:03:31 +02001954 # Support for $variablename in build.info files.
1955 # Embedded perl code is the ultimate master, still. If its output
1956 # contains a dollar sign, it had better be escaped, or it will be
1957 # taken for a variable name prefix.
1958 my %variables = ();
Richard Levittee4292172020-02-26 14:35:17 +01001959 # Variable name syntax
1960 my $variable_name_re = qr/(?P<VARIABLE>[[:alpha:]][[:alnum:]_]*)/;
1961 # Value modifier syntaxes
1962 my $variable_subst_re = qr/\/(?P<RE>(?:\\\/|.)*?)\/(?P<SUBST>.*?)/;
Richard Levitte4975e8b2020-05-05 16:53:43 +02001963 # Variable reference
1964 my $variable_simple_re = qr/(?<!\\)\$${variable_name_re}/;
1965 my $variable_w_mod_re =
1966 qr/(?<!\\)\$\{${variable_name_re}(?P<MOD>(?:\\\/|.)*?)\}/;
1967 # Tie it all together
1968 my $variable_re = qr/${variable_simple_re}|${variable_w_mod_re}/;
1969
Richard Levitte26fe9b02019-06-12 12:03:31 +02001970 my $expand_variables = sub {
1971 my $value = '';
1972 my $value_rest = shift;
1973
Richard Levitte03f30c52019-08-19 08:54:00 +02001974 if ($ENV{CONFIGURE_DEBUG_VARIABLE_EXPAND}) {
1975 print STDERR
Richard Levittee4292172020-02-26 14:35:17 +01001976 "DEBUG[\$expand_variables] Parsed '$value_rest' ...\n"
Richard Levitte03f30c52019-08-19 08:54:00 +02001977 }
Richard Levitte4975e8b2020-05-05 16:53:43 +02001978
1979 while ($value_rest =~ /${variable_re}/) {
1980 # We must save important regexp values, because the next
1981 # regexp clears them
1982 my $mod = $+{MOD};
1983 my $variable_value = $variables{$+{VARIABLE}};
1984
Richard Levitte26fe9b02019-06-12 12:03:31 +02001985 $value_rest = $';
Richard Levittee4292172020-02-26 14:35:17 +01001986 $value .= $`;
1987
Richard Levittee4292172020-02-26 14:35:17 +01001988 # Process modifier expressions, if present
Richard Levitte4975e8b2020-05-05 16:53:43 +02001989 if (defined $mod) {
1990 if ($mod =~ /^${variable_subst_re}$/) {
1991 my $re = $+{RE};
1992 my $subst = $+{SUBST};
Richard Levittee4292172020-02-26 14:35:17 +01001993
Richard Levitte4975e8b2020-05-05 16:53:43 +02001994 $variable_value =~ s/\Q$re\E/$subst/g;
Richard Levittee4292172020-02-26 14:35:17 +01001995
Richard Levitte4975e8b2020-05-05 16:53:43 +02001996 if ($ENV{CONFIGURE_DEBUG_VARIABLE_EXPAND}) {
1997 print STDERR
1998 "DEBUG[\$expand_variables] ... and substituted ",
1999 "'$re' with '$subst'\n";
2000 }
Richard Levittee4292172020-02-26 14:35:17 +01002001 }
2002 }
2003
2004 $value .= $variable_value;
Richard Levitte26fe9b02019-06-12 12:03:31 +02002005 }
Richard Levitte03f30c52019-08-19 08:54:00 +02002006 if ($ENV{CONFIGURE_DEBUG_VARIABLE_EXPAND}) {
2007 print STDERR
Richard Levittee4292172020-02-26 14:35:17 +01002008 "DEBUG[\$expand_variables] ... into: '$value$value_rest'\n";
Richard Levitte03f30c52019-08-19 08:54:00 +02002009 }
Richard Levitte26fe9b02019-06-12 12:03:31 +02002010 return $value . $value_rest;
2011 };
2012
Richard Levitte285dacc2019-10-03 23:30:58 +02002013 # Support for attributes in build.info files
2014 my %attributes = ();
2015 my $handle_attributes = sub {
2016 my $attr_str = shift;
2017 my $ref = shift;
2018 my @goals = @_;
2019
2020 return unless defined $attr_str;
2021
2022 my @a = tokenize($attr_str, qr|\s*,\s*|);
2023 foreach my $a (@a) {
2024 my $ac = 1;
2025 my $ak = $a;
2026 my $av = 1;
Richard Levitteea4ee1522020-07-02 00:08:45 +02002027 if ($a =~ m|^(!)?(.*?)\s* = \s*(.*?)$|x) {
Richard Levitte285dacc2019-10-03 23:30:58 +02002028 $ac = ! $1;
Richard Levitteea4ee1522020-07-02 00:08:45 +02002029 $ak = $2;
2030 $av = $3;
Richard Levitte285dacc2019-10-03 23:30:58 +02002031 }
2032 foreach my $g (@goals) {
2033 if ($ac) {
2034 $$ref->{$g}->{$ak} = $av;
2035 } else {
2036 delete $$ref->{$g}->{$ak};
2037 }
2038 }
2039 }
2040 };
2041
Richard Levittead5be192020-02-26 14:30:38 +01002042 # Support for pushing values on multiple indexes of a given hash
2043 # array.
2044 my $push_to = sub {
2045 my $valueref = shift;
2046 my $index_str = shift; # May be undef or empty
2047 my $attrref = shift; # May be undef
2048 my $attr_str = shift;
2049 my @values = @_;
2050
2051 if (defined $index_str) {
2052 my @indexes = ( '' );
2053 if ($index_str !~ m|^\s*$|) {
2054 @indexes = tokenize($index_str);
2055 }
2056 foreach (@indexes) {
2057 push @{$valueref->{$_}}, @values;
2058 if (defined $attrref) {
2059 $handle_attributes->($attr_str, \$$attrref->{$_},
2060 @values);
2061 }
2062 }
2063 } else {
2064 push @$valueref, @values;
2065 $handle_attributes->($attr_str, $attrref, @values)
2066 if defined $attrref;
2067 }
2068 };
2069
Richard Levitte829f86b2016-08-31 22:54:39 +02002070 if ($buildinfo_debug) {
2071 print STDERR "DEBUG: Reading ",catfile($sourced, $f),"\n";
2072 }
Richard Levitte2e0956b2016-02-28 01:13:17 +01002073 push @{$config{build_infos}}, catfile(abs2rel($sourced, $blddir), $f);
Richard Levittecb6afcd2017-08-01 22:10:39 +02002074 my $template =
2075 Text::Template->new(TYPE => 'FILE',
2076 SOURCE => catfile($sourced, $f),
2077 PREPEND => qq{use lib "$FindBin::Bin/util/perl";});
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002078 die "Something went wrong with $sourced/$f: $!\n" unless $template;
2079 my @text =
2080 split /^/m,
2081 $template->fill_in(HASH => { config => \%config,
2082 target => \%target,
Richard Levitte9e04edf2016-02-22 13:45:46 +01002083 disabled => \%disabled,
Kurt Roeckxf59d0132016-05-07 22:09:13 +02002084 withargs => \%withargs,
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002085 builddir => abs2rel($buildd, $blddir),
2086 sourcedir => abs2rel($sourced, $blddir),
2087 buildtop => abs2rel($blddir, $blddir),
2088 sourcetop => abs2rel($srcdir, $blddir) },
2089 DELIMITERS => [ "{-", "-}" ]);
2090
2091 # The top item of this stack has the following values
2092 # -2 positive already run and we found ELSE (following ELSIF should fail)
2093 # -1 positive already run (skip until ENDIF)
2094 # 0 negatives so far (if we're at a condition, check it)
2095 # 1 last was positive (don't skip lines until next ELSE, ELSIF or ENDIF)
2096 # 2 positive ELSE (following ELSIF should fail)
2097 my @skip = ();
Richard Levitte285dacc2019-10-03 23:30:58 +02002098
2099 # A few useful generic regexps
2100 my $index_re = qr/\[\s*(?P<INDEX>(?:\\.|.)*?)\s*\]/;
2101 my $cond_re = qr/\[\s*(?P<COND>(?:\\.|.)*?)\s*\]/;
2102 my $attribs_re = qr/(?:\{\s*(?P<ATTRIBS>(?:\\.|.)*?)\s*\})?/;
Richard Levitte4a739382021-06-10 09:15:58 +02002103 my $value_re = qr/(?P<VALUE>.*?)/;
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002104 collect_information(
2105 collect_from_array([ @text ],
2106 qr/\\$/ => sub { my $l1 = shift; my $l2 = shift;
2107 $l1 =~ s/\\$//; $l1.$l2 }),
2108 # Info we're looking for
Richard Levitte285dacc2019-10-03 23:30:58 +02002109 qr/^\s* IF ${cond_re} \s*$/x
Richard Levitte635bd402016-03-09 14:33:37 +01002110 => sub {
Richard Levittec5798e02016-03-09 23:58:44 +01002111 if (! @skip || $skip[$#skip] > 0) {
Richard Levitte285dacc2019-10-03 23:30:58 +02002112 push @skip, !! $expand_variables->($+{COND});
Richard Levitte635bd402016-03-09 14:33:37 +01002113 } else {
2114 push @skip, -1;
2115 }
2116 },
Richard Levitte285dacc2019-10-03 23:30:58 +02002117 qr/^\s* ELSIF ${cond_re} \s*$/x
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002118 => sub { die "ELSIF out of scope" if ! @skip;
2119 die "ELSIF following ELSE" if abs($skip[$#skip]) == 2;
2120 $skip[$#skip] = -1 if $skip[$#skip] != 0;
Richard Levitte285dacc2019-10-03 23:30:58 +02002121 $skip[$#skip] = !! $expand_variables->($+{COND})
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002122 if $skip[$#skip] == 0; },
Richard Levitte285dacc2019-10-03 23:30:58 +02002123 qr/^\s* ELSE \s*$/x
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002124 => sub { die "ELSE out of scope" if ! @skip;
2125 $skip[$#skip] = -2 if $skip[$#skip] != 0;
2126 $skip[$#skip] = 2 if $skip[$#skip] == 0; },
Richard Levitte285dacc2019-10-03 23:30:58 +02002127 qr/^\s* ENDIF \s*$/x
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002128 => sub { die "ENDIF out of scope" if ! @skip;
2129 pop @skip; },
Richard Levitte4a739382021-06-10 09:15:58 +02002130 qr/^\s* ${variable_re} \s* = \s* ${value_re} \s* $/x
Richard Levitte26fe9b02019-06-12 12:03:31 +02002131 => sub {
2132 if (!@skip || $skip[$#skip] > 0) {
Richard Levitte285dacc2019-10-03 23:30:58 +02002133 $variables{$+{VARIABLE}} = $expand_variables->($+{VALUE});
Richard Levitte26fe9b02019-06-12 12:03:31 +02002134 }
2135 },
Richard Levitte4a739382021-06-10 09:15:58 +02002136 qr/^\s* SUBDIRS \s* = \s* ${value_re} \s* $/x
Richard Levitte7f73eaf2018-11-03 15:03:59 +01002137 => sub {
2138 if (!@skip || $skip[$#skip] > 0) {
Richard Levitte285dacc2019-10-03 23:30:58 +02002139 foreach (tokenize($expand_variables->($+{VALUE}))) {
Richard Levitte7f73eaf2018-11-03 15:03:59 +01002140 push @build_dirs, [ @curd, splitdir($_, 1) ];
2141 }
2142 }
2143 },
Richard Levitte4a739382021-06-10 09:15:58 +02002144 qr/^\s* PROGRAMS ${attribs_re} \s* = \s* ${value_re} \s* $/x
Richard Levittead5be192020-02-26 14:30:38 +01002145 => sub { $push_to->(\@programs, undef,
2146 \$attributes{programs}, $+{ATTRIBS},
2147 tokenize($expand_variables->($+{VALUE})))
2148 if !@skip || $skip[$#skip] > 0; },
Richard Levitte4a739382021-06-10 09:15:58 +02002149 qr/^\s* LIBS ${attribs_re} \s* = \s* ${value_re} \s* $/x
Richard Levittead5be192020-02-26 14:30:38 +01002150 => sub { $push_to->(\@libraries, undef,
2151 \$attributes{libraries}, $+{ATTRIBS},
2152 tokenize($expand_variables->($+{VALUE})))
2153 if !@skip || $skip[$#skip] > 0; },
Richard Levitte4a739382021-06-10 09:15:58 +02002154 qr/^\s* MODULES ${attribs_re} \s* = \s* ${value_re} \s* $/x
Richard Levittead5be192020-02-26 14:30:38 +01002155 => sub { $push_to->(\@modules, undef,
2156 \$attributes{modules}, $+{ATTRIBS},
2157 tokenize($expand_variables->($+{VALUE})))
2158 if !@skip || $skip[$#skip] > 0; },
Richard Levitte4a739382021-06-10 09:15:58 +02002159 qr/^\s* SCRIPTS ${attribs_re} \s* = \s* ${value_re} \s* $/x
Richard Levittead5be192020-02-26 14:30:38 +01002160 => sub { $push_to->(\@scripts, undef,
2161 \$attributes{scripts}, $+{ATTRIBS},
2162 tokenize($expand_variables->($+{VALUE})))
2163 if !@skip || $skip[$#skip] > 0; },
Richard Levitte4a739382021-06-10 09:15:58 +02002164 qr/^\s* IMAGEDOCS ${index_re} \s* = \s* ${value_re} \s* $/x
Paulid594d2e2021-05-21 15:16:39 +10002165 => sub { $push_to->(\%imagedocs, $expand_variables->($+{INDEX}),
2166 undef, undef,
2167 tokenize($expand_variables->($+{VALUE})))
2168 if !@skip || $skip[$#skip] > 0; },
Richard Levitte4a739382021-06-10 09:15:58 +02002169 qr/^\s* HTMLDOCS ${index_re} \s* = \s* ${value_re} \s* $/x
Richard Levittead5be192020-02-26 14:30:38 +01002170 => sub { $push_to->(\%htmldocs, $expand_variables->($+{INDEX}),
2171 undef, undef,
2172 tokenize($expand_variables->($+{VALUE})))
2173 if !@skip || $skip[$#skip] > 0; },
Richard Levitte4a739382021-06-10 09:15:58 +02002174 qr/^\s* MANDOCS ${index_re} \s* = \s* ${value_re} \s* $/x
Richard Levittead5be192020-02-26 14:30:38 +01002175 => sub { $push_to->(\%mandocs, $expand_variables->($+{INDEX}),
2176 undef, undef,
2177 tokenize($expand_variables->($+{VALUE})))
2178 if !@skip || $skip[$#skip] > 0; },
Richard Levitte4a739382021-06-10 09:15:58 +02002179 qr/^\s* SOURCE ${index_re} ${attribs_re} \s* = \s* ${value_re} \s* $/x
Richard Levittead5be192020-02-26 14:30:38 +01002180 => sub { $push_to->(\%sources, $expand_variables->($+{INDEX}),
Richard Levittedd05c792021-05-18 18:21:51 +02002181 \$attributes{sources}, $+{ATTRIBS},
Richard Levittead5be192020-02-26 14:30:38 +01002182 tokenize($expand_variables->($+{VALUE})))
2183 if !@skip || $skip[$#skip] > 0; },
Richard Levitte4a739382021-06-10 09:15:58 +02002184 qr/^\s* SHARED_SOURCE ${index_re} ${attribs_re} \s* = \s* ${value_re} \s* $/x
Richard Levittead5be192020-02-26 14:30:38 +01002185 => sub { $push_to->(\%shared_sources, $expand_variables->($+{INDEX}),
Richard Levittedd05c792021-05-18 18:21:51 +02002186 \$attributes{sources}, $+{ATTRIBS},
Richard Levittead5be192020-02-26 14:30:38 +01002187 tokenize($expand_variables->($+{VALUE})))
2188 if !@skip || $skip[$#skip] > 0; },
Richard Levitte4a739382021-06-10 09:15:58 +02002189 qr/^\s* INCLUDE ${index_re} \s* = \s* ${value_re} \s* $/x
Richard Levittead5be192020-02-26 14:30:38 +01002190 => sub { $push_to->(\%includes, $expand_variables->($+{INDEX}),
2191 undef, undef,
2192 tokenize($expand_variables->($+{VALUE})))
2193 if !@skip || $skip[$#skip] > 0; },
Richard Levitte4a739382021-06-10 09:15:58 +02002194 qr/^\s* DEFINE ${index_re} \s* = \s* ${value_re} \s* $/x
Richard Levittead5be192020-02-26 14:30:38 +01002195 => sub { $push_to->(\%defines, $expand_variables->($+{INDEX}),
2196 undef, undef,
2197 tokenize($expand_variables->($+{VALUE})))
2198 if !@skip || $skip[$#skip] > 0; },
Richard Levitte4a739382021-06-10 09:15:58 +02002199 qr/^\s* DEPEND ${index_re} ${attribs_re} \s* = \s* ${value_re} \s* $/x
Richard Levittead5be192020-02-26 14:30:38 +01002200 => sub { $push_to->(\%depends, $expand_variables->($+{INDEX}),
2201 \$attributes{depends}, $+{ATTRIBS},
2202 tokenize($expand_variables->($+{VALUE})))
2203 if !@skip || $skip[$#skip] > 0; },
Richard Levitte4a739382021-06-10 09:15:58 +02002204 qr/^\s* GENERATE ${index_re} \s* = \s* ${value_re} \s* $/x
Richard Levittead5be192020-02-26 14:30:38 +01002205 => sub { $push_to->(\%generate, $expand_variables->($+{INDEX}),
Richard Levitte7058b4d2021-06-01 07:45:54 +02002206 undef, undef, $expand_variables->($+{VALUE}))
Richard Levittead5be192020-02-26 14:30:38 +01002207 if !@skip || $skip[$#skip] > 0; },
Richard Levitte285dacc2019-10-03 23:30:58 +02002208 qr/^\s* (?:\#.*)? $/x => sub { },
Richard Levitte2b6b6062016-03-10 00:04:04 +01002209 "OTHERWISE" => sub { die "Something wrong with this line:\n$_\nat $sourced/$f" },
2210 "BEFORE" => sub {
2211 if ($buildinfo_debug) {
2212 print STDERR "DEBUG: Parsing ",join(" ", @_),"\n";
2213 print STDERR "DEBUG: ... before parsing, skip stack is ",join(" ", map { int($_) } @skip),"\n";
2214 }
2215 },
2216 "AFTER" => sub {
2217 if ($buildinfo_debug) {
2218 print STDERR "DEBUG: .... after parsing, skip stack is ",join(" ", map { int($_) } @skip),"\n";
2219 }
2220 },
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002221 );
2222 die "runaway IF?" if (@skip);
2223
Richard Levitte285dacc2019-10-03 23:30:58 +02002224 if (grep { defined $attributes{modules}->{$_}->{engine} } keys %attributes
Richard Levitte1842f362019-01-31 00:06:50 +01002225 and !$config{dynamic_engines}) {
2226 die <<"EOF"
Richard Levitte19ab5792016-02-22 02:06:05 +01002227ENGINES can only be used if configured with 'dynamic-engine'.
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002228This is usually a fault in a build.info file.
2229EOF
Richard Levitte1842f362019-01-31 00:06:50 +01002230 }
Richard Levittec91f24d2018-11-07 10:44:05 +01002231
Richard Levittec91f24d2018-11-07 10:44:05 +01002232 {
2233 my %infos = ( programs => [ @programs ],
2234 libraries => [ @libraries ],
Richard Levitte1842f362019-01-31 00:06:50 +01002235 modules => [ @modules ],
Richard Levitteda7e31e2019-01-30 19:10:26 +01002236 scripts => [ @scripts ] );
Richard Levittec91f24d2018-11-07 10:44:05 +01002237 foreach my $k (keys %infos) {
2238 foreach (@{$infos{$k}}) {
2239 my $item = cleanfile($buildd, $_, $blddir);
2240 $unified_info{$k}->{$item} = 1;
Richard Levitte285dacc2019-10-03 23:30:58 +02002241
2242 # Fix up associated attributes
2243 $unified_info{attributes}->{$k}->{$item} =
2244 $attributes{$k}->{$_}
2245 if defined $attributes{$k}->{$_};
Richard Levittec91f24d2018-11-07 10:44:05 +01002246 }
2247 }
Richard Levitte8a679462016-03-07 14:50:37 +01002248 }
2249
Richard Levittef5fb6f02018-10-23 15:45:24 +02002250 # Check that we haven't defined any library as both shared and
2251 # explicitly static. That is forbidden.
2252 my @doubles = ();
2253 foreach (grep /\.a$/, keys %{$unified_info{libraries}}) {
2254 (my $l = $_) =~ s/\.a$//;
2255 push @doubles, $l if defined $unified_info{libraries}->{$l};
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002256 }
Richard Levittef5fb6f02018-10-23 15:45:24 +02002257 die "these libraries are both explicitly static and shared:\n ",
2258 join(" ", @doubles), "\n"
2259 if @doubles;
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002260
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002261 foreach (keys %sources) {
2262 my $dest = $_;
Richard Levitte2e963842016-02-10 02:00:37 +01002263 my $ddest = cleanfile($buildd, $_, $blddir);
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002264 foreach (@{$sources{$dest}}) {
Richard Levitte2e963842016-02-10 02:00:37 +01002265 my $s = cleanfile($sourced, $_, $blddir);
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002266
Richard Levitte19cf4402020-02-26 14:42:10 +01002267 # If it's generated or we simply don't find it in the source
2268 # tree, we assume it's in the build tree.
2269 if ($s eq $src_configdata || $generate{$_} || ! -f $s) {
Richard Levitte2e963842016-02-10 02:00:37 +01002270 $s = cleanfile($buildd, $_, $blddir);
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002271 }
Richard Levittedd05c792021-05-18 18:21:51 +02002272 my $o = $_;
Richard Levitteea241952016-10-12 15:30:08 +02002273 # We recognise C++, C and asm files
2274 if ($s =~ /\.(cc|cpp|c|s|S)$/) {
Richard Levitte507f8382021-01-10 09:08:46 +01002275 push @{$check_exist{$s}}, $ddest;
Richard Levitteea241952016-10-12 15:30:08 +02002276 $o =~ s/\.[csS]$/.o/; # C and assembler
2277 $o =~ s/\.(cc|cpp)$/_cc.o/; # C++
Richard Levitte2e963842016-02-10 02:00:37 +01002278 $o = cleanfile($buildd, $o, $blddir);
Richard Levittebec2db12018-09-10 02:21:40 +02002279 $unified_info{sources}->{$ddest}->{$o} = -1;
2280 $unified_info{sources}->{$o}->{$s} = -1;
Rich Salz83900622018-03-22 10:21:33 -04002281 } elsif ($s =~ /\.rc$/) {
2282 # We also recognise resource files
Richard Levitte507f8382021-01-10 09:08:46 +01002283 push @{$check_exist{$s}}, $ddest;
Rich Salz83900622018-03-22 10:21:33 -04002284 $o =~ s/\.rc$/.res/; # Resource configuration
Richard Levitte5e16ac12021-01-10 09:13:14 +01002285 $o = cleanfile($buildd, $o, $blddir);
Richard Levittebec2db12018-09-10 02:21:40 +02002286 $unified_info{sources}->{$ddest}->{$o} = -1;
2287 $unified_info{sources}->{$o}->{$s} = -1;
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002288 } else {
Richard Levitte507f8382021-01-10 09:08:46 +01002289 push @{$check_exist{$s}}, $ddest;
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002290 $unified_info{sources}->{$ddest}->{$s} = 1;
2291 }
Richard Levittedd05c792021-05-18 18:21:51 +02002292 # Fix up associated attributes
2293 if ($o ne $_) {
2294 $unified_info{attributes}->{sources}->{$ddest}->{$o} =
2295 $unified_info{attributes}->{sources}->{$o}->{$s} =
2296 $attributes{sources}->{$dest}->{$_}
2297 if defined $attributes{sources}->{$dest}->{$_};
2298 } else {
2299 $unified_info{attributes}->{sources}->{$ddest}->{$s} =
2300 $attributes{sources}->{$dest}->{$_}
2301 if defined $attributes{sources}->{$dest}->{$_};
2302 }
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002303 }
2304 }
2305
Richard Levitte2a08d1a2016-03-29 16:45:03 +02002306 foreach (keys %shared_sources) {
2307 my $dest = $_;
2308 my $ddest = cleanfile($buildd, $_, $blddir);
Richard Levitte2a08d1a2016-03-29 16:45:03 +02002309 foreach (@{$shared_sources{$dest}}) {
2310 my $s = cleanfile($sourced, $_, $blddir);
2311
Richard Levitte19cf4402020-02-26 14:42:10 +01002312 # If it's generated or we simply don't find it in the source
2313 # tree, we assume it's in the build tree.
2314 if ($s eq $src_configdata || $generate{$_} || ! -f $s) {
Richard Levitte2a08d1a2016-03-29 16:45:03 +02002315 $s = cleanfile($buildd, $_, $blddir);
2316 }
Richard Levitteccce3e12017-12-01 15:43:43 +01002317
Richard Levittedd05c792021-05-18 18:21:51 +02002318 my $o = $_;
Richard Levitteea241952016-10-12 15:30:08 +02002319 if ($s =~ /\.(cc|cpp|c|s|S)$/) {
Richard Levitteccce3e12017-12-01 15:43:43 +01002320 # We recognise C++, C and asm files
Richard Levitte507f8382021-01-10 09:08:46 +01002321 push @{$check_exist{$s}}, $ddest;
Richard Levitteea241952016-10-12 15:30:08 +02002322 $o =~ s/\.[csS]$/.o/; # C and assembler
2323 $o =~ s/\.(cc|cpp)$/_cc.o/; # C++
Richard Levitte2a08d1a2016-03-29 16:45:03 +02002324 $o = cleanfile($buildd, $o, $blddir);
Richard Levittebec2db12018-09-10 02:21:40 +02002325 $unified_info{shared_sources}->{$ddest}->{$o} = -1;
2326 $unified_info{sources}->{$o}->{$s} = -1;
Richard Levitteccce3e12017-12-01 15:43:43 +01002327 } elsif ($s =~ /\.rc$/) {
2328 # We also recognise resource files
Richard Levitte507f8382021-01-10 09:08:46 +01002329 push @{$check_exist{$s}}, $ddest;
Richard Levitteccce3e12017-12-01 15:43:43 +01002330 $o =~ s/\.rc$/.res/; # Resource configuration
Richard Levitte5e16ac12021-01-10 09:13:14 +01002331 $o = cleanfile($buildd, $o, $blddir);
Richard Levittebec2db12018-09-10 02:21:40 +02002332 $unified_info{shared_sources}->{$ddest}->{$o} = -1;
2333 $unified_info{sources}->{$o}->{$s} = -1;
Richard Levitteef2dfc92018-09-30 14:44:59 +02002334 } elsif ($s =~ /\.ld$/) {
2335 # We also recognise linker scripts (or corresponding)
Richard Levitteccce3e12017-12-01 15:43:43 +01002336 # We know they are generated files
Richard Levitte507f8382021-01-10 09:08:46 +01002337 push @{$check_exist{$s}}, $ddest;
Richard Levittedd05c792021-05-18 18:21:51 +02002338 $o = cleanfile($buildd, $_, $blddir);
2339 $unified_info{shared_sources}->{$ddest}->{$o} = 1;
Richard Levitte2a08d1a2016-03-29 16:45:03 +02002340 } else {
2341 die "unrecognised source file type for shared library: $s\n";
2342 }
Richard Levittedd05c792021-05-18 18:21:51 +02002343 # Fix up associated attributes
2344 if ($o ne $_) {
2345 $unified_info{attributes}->{shared_sources}->{$ddest}->{$o} =
2346 $unified_info{attributes}->{sources}->{$o}->{$s} =
2347 $attributes{sources}->{$dest}->{$_}
2348 if defined $attributes{sources}->{$dest}->{$_};
2349 } else {
2350 $unified_info{attributes}->{shared_sources}->{$ddest}->{$o} =
2351 $attributes{sources}->{$dest}->{$_}
2352 if defined $attributes{sources}->{$dest}->{$_};
2353 }
Richard Levitte2a08d1a2016-03-29 16:45:03 +02002354 }
2355 }
2356
Richard Levitteae4c7452016-03-07 14:37:00 +01002357 foreach (keys %generate) {
2358 my $dest = $_;
2359 my $ddest = cleanfile($buildd, $_, $blddir);
Richard Levitteae4c7452016-03-07 14:37:00 +01002360 die "more than one generator for $dest: "
Richard Levittecff64af2019-11-20 14:58:20 +01002361 ,join(" ", @{$generate{$_}}),"\n"
2362 if scalar @{$generate{$_}} > 1;
Richard Levitteae4c7452016-03-07 14:37:00 +01002363 my @generator = split /\s+/, $generate{$dest}->[0];
Richard Levittecff64af2019-11-20 14:58:20 +01002364 my $gen = $generator[0];
2365 $generator[0] = cleanfile($sourced, $gen, $blddir);
2366
Richard Levitte19cf4402020-02-26 14:42:10 +01002367 # If the generator is itself generated, it's in the build tree
Richard Levitte79f47ef2021-02-25 17:43:57 +01002368 if ($generate{$gen} || ! -f $generator[0]) {
Richard Levittecff64af2019-11-20 14:58:20 +01002369 $generator[0] = cleanfile($buildd, $gen, $blddir);
2370 }
Richard Levitte2497e2e2021-01-10 09:26:22 +01002371 $check_generate{$ddest}->{$generator[0]}++;
Richard Levittecff64af2019-11-20 14:58:20 +01002372
Richard Levitteae4c7452016-03-07 14:37:00 +01002373 $unified_info{generate}->{$ddest} = [ @generator ];
2374 }
2375
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002376 foreach (keys %depends) {
2377 my $dest = $_;
Richard Levitte3f399e32021-02-25 16:55:39 +01002378 my $ddest = $dest;
Richard Levitte8d34daf2016-04-21 14:30:08 +02002379
Richard Levitte3f399e32021-02-25 16:55:39 +01002380 if ($dest =~ /^\|(.*)\|$/) {
2381 # Collect the raw target
2382 $unified_info{targets}->{$1} = 1;
2383 $ddest = $1;
2384 } elsif ($dest eq '') {
2385 $ddest = '';
2386 } else {
2387 $ddest = cleanfile($sourced, $_, $blddir);
2388
2389 # If the destination doesn't exist in source, it can only be
2390 # a generated file in the build tree.
2391 if ($ddest eq $src_configdata || ! -f $ddest) {
2392 $ddest = cleanfile($buildd, $_, $blddir);
2393 }
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002394 }
2395 foreach (@{$depends{$dest}}) {
Richard Levitte2e963842016-02-10 02:00:37 +01002396 my $d = cleanfile($sourced, $_, $blddir);
Richard Levitte2d101b02021-03-18 05:07:11 +01002397 my $d2 = cleanfile($buildd, $_, $blddir);
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002398
Richard Levittee737d7b2016-02-11 15:22:27 +01002399 # If we know it's generated, or assume it is because we can't
2400 # find it in the source tree, we set file we depend on to be
Richard Levitte19cf4402020-02-26 14:42:10 +01002401 # in the build tree rather than the source tree.
Richard Levitte846e4c42018-03-08 12:01:28 +01002402 if ($d eq $src_configdata
Richard Levitte2d101b02021-03-18 05:07:11 +01002403 || (grep { $d2 eq $_ }
2404 keys %{$unified_info{generate}})
Richard Levitte19cf4402020-02-26 14:42:10 +01002405 || ! -f $d) {
Richard Levitte2d101b02021-03-18 05:07:11 +01002406 $d = $d2;
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002407 }
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002408 $unified_info{depends}->{$ddest}->{$d} = 1;
Richard Levitte9eba5932019-10-04 00:00:24 +02002409
2410 # Fix up associated attributes
2411 $unified_info{attributes}->{depends}->{$ddest}->{$d} =
2412 $attributes{depends}->{$dest}->{$_}
2413 if defined $attributes{depends}->{$dest}->{$_};
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002414 }
2415 }
2416
2417 foreach (keys %includes) {
2418 my $dest = $_;
Richard Levitte8d34daf2016-04-21 14:30:08 +02002419 my $ddest = cleanfile($sourced, $_, $blddir);
2420
2421 # If the destination doesn't exist in source, it can only be
2422 # a generated file in the build tree.
Richard Levitte846e4c42018-03-08 12:01:28 +01002423 if ($ddest eq $src_configdata || ! -f $ddest) {
Richard Levitte8d34daf2016-04-21 14:30:08 +02002424 $ddest = cleanfile($buildd, $_, $blddir);
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002425 }
2426 foreach (@{$includes{$dest}}) {
Richard Levitte4748f892016-06-29 22:51:42 +02002427 my $is = cleandir($sourced, $_, $blddir);
2428 my $ib = cleandir($buildd, $_, $blddir);
2429 push @{$unified_info{includes}->{$ddest}->{source}}, $is
2430 unless grep { $_ eq $is } @{$unified_info{includes}->{$ddest}->{source}};
2431 push @{$unified_info{includes}->{$ddest}->{build}}, $ib
2432 unless grep { $_ eq $ib } @{$unified_info{includes}->{$ddest}->{build}};
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002433 }
2434 }
Richard Levitteb96ab5e2016-10-14 16:56:34 +02002435
Richard Levitteef57f792019-08-23 17:16:48 +02002436 foreach my $dest (keys %defines) {
2437 my $ddest;
Richard Levitteb96ab5e2016-10-14 16:56:34 +02002438
Richard Levitteef57f792019-08-23 17:16:48 +02002439 if ($dest ne "") {
2440 $ddest = cleanfile($sourced, $dest, $blddir);
2441
2442 # If the destination doesn't exist in source, it can only
2443 # be a generated file in the build tree.
2444 if (! -f $ddest) {
2445 $ddest = cleanfile($buildd, $dest, $blddir);
Richard Levitteb96ab5e2016-10-14 16:56:34 +02002446 }
2447 }
Richard Levitteef57f792019-08-23 17:16:48 +02002448 foreach my $v (@{$defines{$dest}}) {
2449 $v =~ m|^([^=]*)(=.*)?$|;
Richard Levitteb96ab5e2016-10-14 16:56:34 +02002450 die "0 length macro name not permitted\n" if $1 eq "";
Richard Levitteef57f792019-08-23 17:16:48 +02002451 if ($dest ne "") {
2452 die "$1 defined more than once\n"
2453 if defined $unified_info{defines}->{$ddest}->{$1};
2454 $unified_info{defines}->{$ddest}->{$1} = $2;
2455 } else {
2456 die "$1 defined more than once\n"
2457 if grep { $v eq $_ } @{$config{defines}};
2458 push @{$config{defines}}, $v;
2459 }
Richard Levitteb96ab5e2016-10-14 16:56:34 +02002460 }
2461 }
Richard Levitte829f86b2016-08-31 22:54:39 +02002462
Paulid594d2e2021-05-21 15:16:39 +10002463 foreach my $section (keys %imagedocs) {
2464 foreach (@{$imagedocs{$section}}) {
2465 my $imagedocs = cleanfile($buildd, $_, $blddir);
2466 $unified_info{imagedocs}->{$section}->{$imagedocs} = 1;
2467 }
2468 }
2469
Richard Levitte829f86b2016-08-31 22:54:39 +02002470 foreach my $section (keys %htmldocs) {
2471 foreach (@{$htmldocs{$section}}) {
2472 my $htmldocs = cleanfile($buildd, $_, $blddir);
2473 $unified_info{htmldocs}->{$section}->{$htmldocs} = 1;
2474 }
2475 }
2476
2477 foreach my $section (keys %mandocs) {
2478 foreach (@{$mandocs{$section}}) {
2479 my $mandocs = cleanfile($buildd, $_, $blddir);
2480 $unified_info{mandocs}->{$section}->{$mandocs} = 1;
2481 }
2482 }
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002483 }
2484
Richard Levitted201dbc2017-12-28 16:03:17 +01002485 my $ordinals_text = join(', ', sort keys %ordinals);
2486 warn <<"EOF" if $ordinals_text;
2487
2488WARNING: ORDINALS were specified for $ordinals_text
2489They are ignored and should be replaced with a combination of GENERATE,
2490DEPEND and SHARED_SOURCE.
2491EOF
2492
Richard Levitte507f8382021-01-10 09:08:46 +01002493 # Check that each generated file is only generated once
2494 my $ambiguous_generation = 0;
2495 foreach (sort keys %check_generate) {
2496 my @generators = sort keys %{$check_generate{$_}};
2497 my $generators_txt = join(', ', @generators);
2498 if (scalar @generators > 1) {
2499 warn "$_ is GENERATEd by more than one generator ($generators_txt)\n";
2500 $ambiguous_generation++;
2501 }
Richard Levitte2497e2e2021-01-10 09:26:22 +01002502 if ($check_generate{$_}->{$generators[0]} > 1) {
2503 warn "INFO: $_ has more than one GENERATE declaration (same generator)\n"
2504 }
Richard Levitte507f8382021-01-10 09:08:46 +01002505 }
2506 die "There are ambiguous source file generations\n"
2507 if $ambiguous_generation > 0;
2508
2509 # All given source files should exist, or if generated, their
2510 # generator should exist. This loop ensures this is true.
2511 my $missing = 0;
2512 foreach my $orig (sort keys %check_exist) {
2513 foreach my $dest (@{$check_exist{$orig}}) {
2514 if ($orig ne $src_configdata) {
2515 if ($orig =~ /\.a$/) {
2516 # Static library names may be used as sources, so we
2517 # need to detect those and give them special treatment.
2518 unless (grep { $_ eq $orig }
2519 keys %{$unified_info{libraries}}) {
2520 warn "$orig is given as source for $dest, but no such library is built\n";
2521 $missing++;
2522 }
2523 } else {
2524 # A source may be generated, and its generator may be
2525 # generated as well. We therefore loop to dig out the
2526 # first generator.
2527 my $gen = $orig;
2528
2529 while (my @next = keys %{$check_generate{$gen}}) {
2530 $gen = $next[0];
2531 }
2532
2533 if (! -f $gen) {
2534 if ($gen ne $orig) {
2535 $missing++;
2536 warn "$orig is given as source for $dest, but its generator (leading to $gen) is missing\n";
2537 } else {
2538 $missing++;
2539 warn "$orig is given as source for $dest, but is missing\n";
2540 }
2541 }
2542 }
2543 }
2544 }
2545 }
2546 die "There are files missing\n" if $missing > 0;
Richard Levitte51583cb2019-06-11 18:11:25 +02002547
2548 # Go through the sources of all libraries and check that the same basename
2549 # doesn't appear more than once. Some static library archivers depend on
2550 # them being unique.
2551 {
2552 my $err = 0;
2553 foreach my $prod (keys %{$unified_info{libraries}}) {
2554 my @prod_sources =
2555 map { keys %{$unified_info{sources}->{$_}} }
2556 keys %{$unified_info{sources}->{$prod}};
2557 my %srccnt = ();
2558
2559 # Count how many times a given each source basename
2560 # appears for each product.
2561 foreach my $src (@prod_sources) {
2562 $srccnt{basename $src}++;
2563 }
2564
2565 foreach my $src (keys %srccnt) {
2566 if ((my $cnt = $srccnt{$src}) > 1) {
2567 print STDERR "$src appears $cnt times for the product $prod\n";
2568 $err++
2569 }
2570 }
2571 }
2572 die if $err > 0;
2573 }
2574
Richard Levitte1b5ad512018-01-23 19:07:14 +01002575 # Massage the result
2576
Richard Levittee431bcf2018-01-23 19:13:48 +01002577 # If we depend on a header file or a perl module, add an inclusion of
2578 # its directory to allow smoothe inclusion
2579 foreach my $dest (keys %{$unified_info{depends}}) {
2580 next if $dest eq "";
2581 foreach my $d (keys %{$unified_info{depends}->{$dest}}) {
2582 next unless $d =~ /\.(h|pm)$/;
Richard Levitte906032d2018-03-07 15:58:04 +01002583 my $i = dirname($d);
2584 my $spot =
2585 $d eq "configdata.pm" || defined($unified_info{generate}->{$d})
2586 ? 'build' : 'source';
2587 push @{$unified_info{includes}->{$dest}->{$spot}}, $i
2588 unless grep { $_ eq $i } @{$unified_info{includes}->{$dest}->{$spot}};
Richard Levittee431bcf2018-01-23 19:13:48 +01002589 }
2590 }
2591
Richard Levitteef2dfc92018-09-30 14:44:59 +02002592 # Go through all intermediary files and change their names to something that
Richard Levittebec2db12018-09-10 02:21:40 +02002593 # reflects what they will be built for. Note that for some source files,
2594 # this leads to duplicate object files because they are used multiple times.
2595 # the goal is to rename all object files according to this scheme:
2596 # {productname}-{midfix}-{origobjname}.[o|res]
2597 # the {midfix} is a keyword indicating the type of product, which is mostly
2598 # valuable for libraries since they come in two forms.
2599 #
2600 # This also reorganises the {sources} and {shared_sources} so that the
2601 # former only contains ALL object files that are supposed to end up in
2602 # static libraries and programs, while the latter contains ALL object files
2603 # that are supposed to end up in shared libraries and DSOs.
2604 # The main reason for having two different source structures is to allow
2605 # the same name to be used for the static and the shared variants of a
2606 # library.
2607 {
2608 # Take copies so we don't get interference from added stuff
2609 my %unified_copy = ();
2610 foreach (('sources', 'shared_sources')) {
2611 $unified_copy{$_} = { %{$unified_info{$_}} }
2612 if defined($unified_info{$_});
2613 delete $unified_info{$_};
2614 }
Richard Levitte1842f362019-01-31 00:06:50 +01002615 foreach my $prodtype (('programs', 'libraries', 'modules', 'scripts')) {
Richard Levittebec2db12018-09-10 02:21:40 +02002616 # $intent serves multi purposes:
2617 # - give a prefix for the new object files names
2618 # - in the case of libraries, rearrange the object files so static
2619 # libraries use the 'sources' structure exclusively, while shared
2620 # libraries use the 'shared_sources' structure exclusively.
2621 my $intent = {
2622 programs => { bin => { src => [ 'sources' ],
2623 dst => 'sources' } },
2624 libraries => { lib => { src => [ 'sources' ],
2625 dst => 'sources' },
2626 shlib => { prodselect =>
2627 sub { grep !/\.a$/, @_ },
2628 src => [ 'sources',
2629 'shared_sources' ],
2630 dst => 'shared_sources' } },
Richard Levitte22b41462019-03-31 15:14:00 +02002631 modules => { dso => { src => [ 'sources' ],
2632 dst => 'sources' } },
Richard Levittebec2db12018-09-10 02:21:40 +02002633 scripts => { script => { src => [ 'sources' ],
2634 dst => 'sources' } }
2635 } -> {$prodtype};
2636 foreach my $kind (keys %$intent) {
Richard Levitte856b1b62018-11-15 21:37:55 +01002637 next if ($intent->{$kind}->{dst} eq 'shared_sources'
2638 && $disabled{shared});
2639
Richard Levittebec2db12018-09-10 02:21:40 +02002640 my @src = @{$intent->{$kind}->{src}};
2641 my $dst = $intent->{$kind}->{dst};
2642 my $prodselect = $intent->{$kind}->{prodselect} // sub { @_ };
2643 foreach my $prod ($prodselect->(keys %{$unified_info{$prodtype}})) {
2644 # %prod_sources has all applicable objects as keys, and
2645 # their corresponding sources as values
2646 my %prod_sources =
2647 map { $_ => [ keys %{$unified_copy{sources}->{$_}} ] }
2648 map { keys %{$unified_copy{$_}->{$prod}} }
2649 @src;
2650 foreach (keys %prod_sources) {
Richard Levitteef2dfc92018-09-30 14:44:59 +02002651 # Only affect object files and resource files,
2652 # the others simply get a new value
2653 # (+1 instead of -1)
Richard Levittebec2db12018-09-10 02:21:40 +02002654 if ($_ =~ /\.(o|res)$/) {
2655 (my $prodname = $prod) =~ s|\.a$||;
2656 my $newobj =
2657 catfile(dirname($_),
2658 basename($prodname)
2659 . '-' . $kind
2660 . '-' . basename($_));
2661 $unified_info{$dst}->{$prod}->{$newobj} = 1;
2662 foreach my $src (@{$prod_sources{$_}}) {
2663 $unified_info{sources}->{$newobj}->{$src} = 1;
Richard Levittedd05c792021-05-18 18:21:51 +02002664 # Adjust source attributes
2665 my $attrs = $unified_info{attributes}->{sources};
2666 if (defined $attrs->{$prod}
2667 && defined $attrs->{$prod}->{$_}) {
2668 $attrs->{$prod}->{$newobj} =
2669 $attrs->{$prod}->{$_};
2670 delete $attrs->{$prod}->{$_};
2671 }
2672 foreach my $objsrc (keys %{$attrs->{$_} // {}}) {
2673 $attrs->{$newobj}->{$objsrc} =
2674 $attrs->{$_}->{$objsrc};
2675 delete $attrs->{$_}->{$objsrc};
2676 }
Richard Levittebec2db12018-09-10 02:21:40 +02002677 }
2678 # Adjust dependencies
2679 foreach my $deps (keys %{$unified_info{depends}->{$_}}) {
2680 $unified_info{depends}->{$_}->{$deps} = -1;
2681 $unified_info{depends}->{$newobj}->{$deps} = 1;
2682 }
2683 # Adjust includes
2684 foreach my $k (('source', 'build')) {
2685 next unless
2686 defined($unified_info{includes}->{$_}->{$k});
2687 my @incs = @{$unified_info{includes}->{$_}->{$k}};
2688 $unified_info{includes}->{$newobj}->{$k} = [ @incs ];
2689 }
2690 } else {
2691 $unified_info{$dst}->{$prod}->{$_} = 1;
2692 }
2693 }
2694 }
2695 }
2696 }
2697 }
Richard Levitte51583cb2019-06-11 18:11:25 +02002698
Richard Levittebec2db12018-09-10 02:21:40 +02002699 # At this point, we have a number of sources with the value -1. They
2700 # aren't part of the local build and are probably meant for a different
2701 # platform, and can therefore be cleaned away. That happens when making
2702 # %unified_info more efficient below.
2703
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002704 ### Make unified_info a bit more efficient
2705 # One level structures
Richard Levitte3f399e32021-02-25 16:55:39 +01002706 foreach (("programs", "libraries", "modules", "scripts", "targets")) {
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002707 $unified_info{$_} = [ sort keys %{$unified_info{$_}} ];
2708 }
2709 # Two level structures
Richard Levitte829f86b2016-08-31 22:54:39 +02002710 foreach my $l1 (("sources", "shared_sources", "ldadd", "depends",
Paulid594d2e2021-05-21 15:16:39 +10002711 "imagedocs", "htmldocs", "mandocs")) {
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002712 foreach my $l2 (sort keys %{$unified_info{$l1}}) {
Richard Levittebec2db12018-09-10 02:21:40 +02002713 my @items =
2714 sort
2715 grep { $unified_info{$l1}->{$l2}->{$_} > 0 }
2716 keys %{$unified_info{$l1}->{$l2}};
2717 if (@items) {
2718 $unified_info{$l1}->{$l2} = [ @items ];
2719 } else {
2720 delete $unified_info{$l1}->{$l2};
2721 }
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002722 }
2723 }
Richard Levitteb96ab5e2016-10-14 16:56:34 +02002724 # Defines
2725 foreach my $dest (sort keys %{$unified_info{defines}}) {
2726 $unified_info{defines}->{$dest}
2727 = [ map { $_.$unified_info{defines}->{$dest}->{$_} }
2728 sort keys %{$unified_info{defines}->{$dest}} ];
2729 }
Richard Levitte4748f892016-06-29 22:51:42 +02002730 # Includes
2731 foreach my $dest (sort keys %{$unified_info{includes}}) {
2732 if (defined($unified_info{includes}->{$dest}->{build})) {
Richard Levittee431bcf2018-01-23 19:13:48 +01002733 my @source_includes = ();
2734 @source_includes = ( @{$unified_info{includes}->{$dest}->{source}} )
2735 if defined($unified_info{includes}->{$dest}->{source});
Richard Levitte4748f892016-06-29 22:51:42 +02002736 $unified_info{includes}->{$dest} =
2737 [ @{$unified_info{includes}->{$dest}->{build}} ];
2738 foreach my $inc (@source_includes) {
2739 push @{$unified_info{includes}->{$dest}}, $inc
2740 unless grep { $_ eq $inc } @{$unified_info{includes}->{$dest}};
2741 }
Richard Levitte609e4be2018-09-10 02:18:22 +02002742 } elsif (defined($unified_info{includes}->{$dest}->{source})) {
Richard Levitte4748f892016-06-29 22:51:42 +02002743 $unified_info{includes}->{$dest} =
2744 [ @{$unified_info{includes}->{$dest}->{source}} ];
Richard Levitte609e4be2018-09-10 02:18:22 +02002745 } else {
2746 delete $unified_info{includes}->{$dest};
Richard Levitte4748f892016-06-29 22:51:42 +02002747 }
2748 }
Richard Levitteb6e66072018-10-21 11:11:04 +02002749
2750 # For convenience collect information regarding directories where
2751 # files are generated, those generated files and the end product
2752 # they end up in where applicable. Then, add build rules for those
2753 # directories
2754 my %loopinfo = ( "lib" => [ @{$unified_info{libraries}} ],
Richard Levitte1842f362019-01-31 00:06:50 +01002755 "dso" => [ @{$unified_info{modules}} ],
Richard Levitteb6e66072018-10-21 11:11:04 +02002756 "bin" => [ @{$unified_info{programs}} ],
Richard Levitte829f86b2016-08-31 22:54:39 +02002757 "script" => [ @{$unified_info{scripts}} ],
Paulid594d2e2021-05-21 15:16:39 +10002758 "docs" => [ (map { @{$unified_info{imagedocs}->{$_} // []} }
2759 keys %{$unified_info{imagedocs} // {}}),
2760 (map { @{$unified_info{htmldocs}->{$_} // []} }
Richard Levitte829f86b2016-08-31 22:54:39 +02002761 keys %{$unified_info{htmldocs} // {}}),
2762 (map { @{$unified_info{mandocs}->{$_} // []} }
2763 keys %{$unified_info{mandocs} // {}}) ] );
Richard Levitteb6e66072018-10-21 11:11:04 +02002764 foreach my $type (keys %loopinfo) {
2765 foreach my $product (@{$loopinfo{$type}}) {
2766 my %dirs = ();
2767 my $pd = dirname($product);
2768
Richard Levitte3bed01a2018-11-01 13:55:32 +01002769 foreach (@{$unified_info{sources}->{$product} // []},
Richard Levitteb6e66072018-10-21 11:11:04 +02002770 @{$unified_info{shared_sources}->{$product} // []}) {
2771 my $d = dirname($_);
2772
2773 # We don't want to create targets for source directories
2774 # when building out of source
2775 next if ($config{sourcedir} ne $config{builddir}
2776 && $d =~ m|^\Q$config{sourcedir}\E|);
2777 # We already have a "test" target, and the current directory
2778 # is just silly to make a target for
2779 next if $d eq "test" || $d eq ".";
2780
2781 $dirs{$d} = 1;
2782 push @{$unified_info{dirinfo}->{$d}->{deps}}, $_
2783 if $d ne $pd;
2784 }
2785 foreach (keys %dirs) {
2786 push @{$unified_info{dirinfo}->{$_}->{products}->{$type}},
2787 $product;
2788 }
2789 }
2790 }
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002791}
2792
2793# For the schemes that need it, we provide the old *_obj configs
2794# from the *_asm_obj ones
Richard Levitte3a55c922016-02-18 18:43:56 +01002795foreach (grep /_(asm|aux)_src$/, keys %target) {
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002796 my $src = $_;
Richard Levitte3a55c922016-02-18 18:43:56 +01002797 (my $obj = $_) =~ s/_(asm|aux)_src$/_obj/;
Richard Levitteea241952016-10-12 15:30:08 +02002798 $target{$obj} = $target{$src};
2799 $target{$obj} =~ s/\.[csS]\b/.o/g; # C and assembler
2800 $target{$obj} =~ s/\.(cc|cpp)\b/_cc.o/g; # C++
Richard Levitte9fe2bb72016-01-29 19:45:51 +01002801}
2802
Richard Levitte291e94d2015-05-18 22:35:23 +02002803# Write down our configuration where it fits #########################
2804
Richard Levitte1f86b822019-08-25 10:46:22 +02002805my %template_vars = (
2806 config => \%config,
2807 target => \%target,
2808 disablables => \@disablables,
2809 disablables_int => \@disablables_int,
2810 disabled => \%disabled,
2811 withargs => \%withargs,
2812 unified_info => \%unified_info,
2813 tls => \@tls,
2814 dtls => \@dtls,
2815 makevars => [ sort keys %user ],
2816 disabled_info => \%disabled_info,
2817 user_crossable => \@user_crossable,
Richard Levitte291e94d2015-05-18 22:35:23 +02002818);
Richard Levitte1f86b822019-08-25 10:46:22 +02002819my $configdata_outname = 'configdata.pm';
2820print "Creating $configdata_outname\n";
2821open CONFIGDATA, ">$configdata_outname.new"
Richard Levitte2660b7c2021-05-17 14:33:16 +02002822 or die "Trying to create $configdata_outname.new: $!";
Richard Levitte1f86b822019-08-25 10:46:22 +02002823my $configdata_tmplname = cleanfile($srcdir, "configdata.pm.in", $blddir);
2824my $configdata_tmpl =
2825 OpenSSL::Template->new(TYPE => 'FILE', SOURCE => $configdata_tmplname);
2826$configdata_tmpl->fill_in(
2827 FILENAME => $configdata_tmplname,
2828 OUTPUT => \*CONFIGDATA,
2829 HASH => { %template_vars,
2830 autowarntext => [
2831 'WARNING: do not edit!',
2832 "Generated by Configure from $configdata_tmplname",
2833 ] }
2834) or die $Text::Template::ERROR;
2835close CONFIGDATA;
2836rename "$configdata_outname.new", $configdata_outname;
Richard Levitteb1fafff2018-01-29 06:19:17 +01002837if ($builder_platform eq 'unix') {
2838 my $mode = (0755 & ~umask);
2839 chmod $mode, 'configdata.pm'
2840 or warn sprintf("WARNING: Couldn't change mode for 'configdata.pm' to 0%03o: %s\n",$mode,$!);
2841}
Ben Lauriecba50681999-03-07 14:05:36 +00002842
Richard Levitte1f86b822019-08-25 10:46:22 +02002843print "Running $configdata_outname\n";
2844my $perlcmd = (quotify("maybeshell", $config{PERL}))[0];
2845my $cmd = "$perlcmd $configdata_outname";
2846#print STDERR "DEBUG[run_dofile]: \$cmd = $cmd\n";
2847system($cmd);
2848exit 1 if $? != 0;
Felix Laurie von Massenbachfce0ba52014-05-26 17:19:28 +01002849
Richard Levitte8937a4e2018-07-24 10:45:05 +02002850$SIG{__DIE__} = $orig_death_handler;
2851
Richard Levitte9c62a272016-02-27 16:51:34 +01002852print <<"EOF" if ($disabled{threads} eq "unavailable");
Bodo Möller5f8d5c91999-04-29 16:10:09 +00002853
2854The library could not be configured for supporting multi-threaded
2855applications as the compiler options required on this system are not known.
Richard Levittef828ba02020-04-27 09:08:36 +02002856See file INSTALL.md for details if you need multi-threading.
Bodo Möllerec577821999-04-23 22:13:45 +00002857EOF
2858
Richard Levitte76ffb432015-05-18 02:46:21 +02002859print <<"EOF" if ($no_shared_warn);
Richard Levitte2964ba82003-01-11 11:40:39 +00002860
Richard Levitteae482422016-02-22 02:09:11 +01002861The options 'shared', 'pic' and 'dynamic-engine' aren't supported on this
2862platform, so we will pretend you gave the option 'no-pic', which also disables
2863'shared' and 'dynamic-engine'. If you know how to implement shared libraries
2864or position independent code, please let us know (but please first make sure
2865you have tried with a current version of OpenSSL).
Rich Salz2e31ef02015-12-10 12:31:01 -05002866EOF
2867
Rich Salzd0364dc2021-05-12 10:42:46 -04002868print $banner;
Richard Levitte820e4142018-02-02 12:30:50 +01002869
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002870exit(0);
2871
Richard Levittebd5192b2015-05-18 02:57:24 +02002872######################################################################
2873#
2874# Helpers and utility functions
2875#
2876
Richard Levitte8937a4e2018-07-24 10:45:05 +02002877# Death handler, to print a helpful message in case of failure #######
2878#
2879sub death_handler {
Richard Levitteeb807d52018-07-24 21:46:55 +02002880 die @_ if $^S; # To prevent the added message in eval blocks
Richard Levitte8937a4e2018-07-24 10:45:05 +02002881 my $build_file = $target{build_file} // "build file";
Richard Levitteeb807d52018-07-24 21:46:55 +02002882 my @message = ( <<"_____", @_ );
Richard Levitte8937a4e2018-07-24 10:45:05 +02002883
2884Failure! $build_file wasn't produced.
Dr. David von Oheimb1dc1ea12020-06-10 17:49:25 +02002885Please read INSTALL.md and associated NOTES-* files. You may also have to
Richard Levittef828ba02020-04-27 09:08:36 +02002886look over your available compiler tool chain or change your configuration.
Richard Levitte8937a4e2018-07-24 10:45:05 +02002887
2888_____
Richard Levitteeb807d52018-07-24 21:46:55 +02002889
2890 # Dying is terminal, so it's ok to reset the signal handler here.
2891 $SIG{__DIE__} = $orig_death_handler;
2892 die @message;
Richard Levitte8937a4e2018-07-24 10:45:05 +02002893}
2894
Richard Levittebd5192b2015-05-18 02:57:24 +02002895# Configuration file reading #########################################
2896
Richard Levitte1f2e1cd2016-03-17 09:09:31 +01002897# Note: All of the helper functions are for lazy evaluation. They all
2898# return a CODE ref, which will return the intended value when evaluated.
2899# Thus, whenever there's mention of a returned value, it's about that
2900# intended value.
2901
Richard Levitte1f2e1cd2016-03-17 09:09:31 +01002902# Helper function to implement conditional value variants, with a default
2903# plus additional values based on the value of $config{build_type}.
2904# Arguments are given in hash table form:
2905#
2906# picker(default => "Basic string: ",
2907# debug => "debug",
2908# release => "release")
2909#
2910# When configuring with --debug, the resulting string will be
2911# "Basic string: debug", and when not, it will be "Basic string: release"
2912#
2913# This can be used to create variants of sets of flags according to the
2914# build type:
2915#
2916# cflags => picker(default => "-Wall",
2917# debug => "-g -O0",
2918# release => "-O3")
2919#
2920sub picker {
2921 my %opts = @_;
2922 return sub { add($opts{default} || (),
2923 $opts{$config{build_type}} || ())->(); }
2924}
2925
2926# Helper function to combine several values of different types into one.
2927# This is useful if you want to combine a string with the result of a
2928# lazy function, such as:
2929#
2930# cflags => combine("-Wall", sub { $disabled{zlib} ? () : "-DZLIB" })
2931#
2932sub combine {
2933 my @stuff = @_;
2934 return sub { add(@stuff)->(); }
2935}
2936
2937# Helper function to implement conditional values depending on the value
2938# of $disabled{threads}. Can be used as follows:
2939#
2940# cflags => combine("-Wall", threads("-pthread"))
2941#
2942sub threads {
2943 my @flags = @_;
2944 return sub { add($disabled{threads} ? () : @flags)->(); }
2945}
2946
Andy Polyakov60aa6c12018-06-11 12:22:29 +02002947sub shared {
2948 my @flags = @_;
2949 return sub { add($disabled{shared} ? () : @flags)->(); }
2950}
Richard Levitte1f2e1cd2016-03-17 09:09:31 +01002951
Richard Levitte9c62a272016-02-27 16:51:34 +01002952our $add_called = 0;
Richard Levitte88087412015-05-18 14:31:49 +02002953# Helper function to implement adding values to already existing configuration
2954# values. It handles elements that are ARRAYs, CODEs and scalars
2955sub _add {
2956 my $separator = shift;
2957
Richard Levittebcb19772016-01-30 02:17:05 +01002958 # If there's any ARRAY in the collection of values OR the separator
2959 # is undef, we will return an ARRAY of combined values, otherwise a
2960 # string of joined values with $separator as the separator.
2961 my $found_array = !defined($separator);
Richard Levitte88087412015-05-18 14:31:49 +02002962
2963 my @values =
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01002964 map {
2965 my $res = $_;
2966 while (ref($res) eq "CODE") {
2967 $res = $res->();
2968 }
2969 if (defined($res)) {
2970 if (ref($res) eq "ARRAY") {
2971 $found_array = 1;
2972 @$res;
2973 } else {
2974 $res;
2975 }
2976 } else {
2977 ();
2978 }
Richard Levitte88087412015-05-18 14:31:49 +02002979 } (@_);
2980
Richard Levitte9c62a272016-02-27 16:51:34 +01002981 $add_called = 1;
2982
Richard Levitte88087412015-05-18 14:31:49 +02002983 if ($found_array) {
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01002984 [ @values ];
Richard Levitte88087412015-05-18 14:31:49 +02002985 } else {
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01002986 join($separator, grep { defined($_) && $_ ne "" } @values);
Richard Levitte88087412015-05-18 14:31:49 +02002987 }
2988}
2989sub add_before {
Richard Levittebdcd83e2016-02-25 00:17:59 +01002990 my $separator = " ";
2991 if (ref($_[$#_]) eq "HASH") {
2992 my $opts = pop;
2993 $separator = $opts->{separator};
2994 }
Richard Levitte88087412015-05-18 14:31:49 +02002995 my @x = @_;
2996 sub { _add($separator, @x, @_) };
2997}
2998sub add {
Richard Levittebdcd83e2016-02-25 00:17:59 +01002999 my $separator = " ";
3000 if (ref($_[$#_]) eq "HASH") {
3001 my $opts = pop;
3002 $separator = $opts->{separator};
3003 }
Richard Levitte88087412015-05-18 14:31:49 +02003004 my @x = @_;
3005 sub { _add($separator, @_, @x) };
3006}
3007
Richard Levitte3b6c4b02017-12-01 15:29:05 +01003008sub read_eval_file {
3009 my $fname = shift;
3010 my $content;
3011 my @result;
3012
3013 open F, "< $fname" or die "Can't open '$fname': $!\n";
3014 {
3015 undef local $/;
3016 $content = <F>;
3017 }
3018 close F;
3019 {
3020 local $@;
3021
3022 @result = ( eval $content );
3023 warn $@ if $@;
3024 }
3025 return wantarray ? @result : $result[0];
3026}
3027
Richard Levittebd5192b2015-05-18 02:57:24 +02003028# configuration reader, evaluates the input file as a perl script and expects
3029# it to fill %targets with target configurations. Those are then added to
3030# %table.
3031sub read_config {
3032 my $fname = shift;
Richard Levitte3b6c4b02017-12-01 15:29:05 +01003033 my %targets;
3034
Richard Levittebd5192b2015-05-18 02:57:24 +02003035 {
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01003036 # Protect certain tables from tampering
3037 local %table = ();
Richard Levittebd5192b2015-05-18 02:57:24 +02003038
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01003039 %targets = read_eval_file($fname);
Richard Levittebd5192b2015-05-18 02:57:24 +02003040 }
Richard Levitte225f9802018-01-09 19:51:19 +01003041 my %preexisting = ();
3042 foreach (sort keys %targets) {
3043 $preexisting{$_} = 1 if $table{$_};
3044 }
3045 die <<"EOF",
3046The following config targets from $fname
3047shadow pre-existing config targets with the same name:
3048EOF
3049 map { " $_\n" } sort keys %preexisting
3050 if %preexisting;
3051
Richard Levittebd5192b2015-05-18 02:57:24 +02003052
3053 # For each target, check that it's configured with a hash table.
3054 foreach (keys %targets) {
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01003055 if (ref($targets{$_}) ne "HASH") {
3056 if (ref($targets{$_}) eq "") {
3057 warn "Deprecated target configuration for $_, ignoring...\n";
3058 } else {
3059 warn "Misconfigured target configuration for $_ (should be a hash table), ignoring...\n";
3060 }
3061 delete $targets{$_};
3062 } else {
Richard Levitteee9b0bb2016-09-14 22:21:41 +02003063 $targets{$_}->{_conf_fname_int} = add([ $fname ]);
3064 }
Richard Levittebd5192b2015-05-18 02:57:24 +02003065 }
3066
3067 %table = (%table, %targets);
3068
3069}
3070
FdaSilvaYY8483a002016-03-10 21:34:48 +01003071# configuration resolver. Will only resolve all the lazy evaluation
3072# codeblocks for the chosen target and all those it inherits from,
Richard Levittebd5192b2015-05-18 02:57:24 +02003073# recursively
3074sub resolve_config {
3075 my $target = shift;
3076 my @breadcrumbs = @_;
3077
Richard Levittec4718842016-03-09 17:18:07 +01003078# my $extra_checks = defined($ENV{CONFIGURE_EXTRA_CHECKS});
Richard Levitte9c62a272016-02-27 16:51:34 +01003079
Richard Levittebd5192b2015-05-18 02:57:24 +02003080 if (grep { $_ eq $target } @breadcrumbs) {
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01003081 die "inherit_from loop! target backtrace:\n "
3082 ,$target,"\n ",join("\n ", @breadcrumbs),"\n";
Richard Levittebd5192b2015-05-18 02:57:24 +02003083 }
3084
3085 if (!defined($table{$target})) {
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01003086 warn "Warning! target $target doesn't exist!\n";
3087 return ();
Richard Levittebd5192b2015-05-18 02:57:24 +02003088 }
3089 # Recurse through all inheritances. They will be resolved on the
3090 # fly, so when this operation is done, they will all just be a
3091 # bunch of attributes with string values.
3092 # What we get here, though, are keys with references to lists of
3093 # the combined values of them all. We will deal with lists after
3094 # this stage is done.
3095 my %combined_inheritance = ();
3096 if ($table{$target}->{inherit_from}) {
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01003097 my @inherit_from =
3098 map { ref($_) eq "CODE" ? $_->() : $_ } @{$table{$target}->{inherit_from}};
3099 foreach (@inherit_from) {
3100 my %inherited_config = resolve_config($_, $target, @breadcrumbs);
Richard Levittebd5192b2015-05-18 02:57:24 +02003101
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01003102 # 'template' is a marker that's considered private to
3103 # the config that had it.
3104 delete $inherited_config{template};
Richard Levittebd5192b2015-05-18 02:57:24 +02003105
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01003106 foreach (keys %inherited_config) {
3107 if (!$combined_inheritance{$_}) {
3108 $combined_inheritance{$_} = [];
3109 }
3110 push @{$combined_inheritance{$_}}, $inherited_config{$_};
3111 }
3112 }
Richard Levittebd5192b2015-05-18 02:57:24 +02003113 }
3114
3115 # We won't need inherit_from in this target any more, since we've
3116 # resolved all the inheritances that lead to this
3117 delete $table{$target}->{inherit_from};
3118
3119 # Now is the time to deal with those lists. Here's the place to
3120 # decide what shall be done with those lists, all based on the
3121 # values of the target we're currently dealing with.
3122 # - If a value is a coderef, it will be executed with the list of
3123 # inherited values as arguments.
3124 # - If the corresponding key doesn't have a value at all or is the
FdaSilvaYY8483a002016-03-10 21:34:48 +01003125 # empty string, the inherited value list will be run through the
Richard Levittebd5192b2015-05-18 02:57:24 +02003126 # default combiner (below), and the result becomes this target's
3127 # value.
3128 # - Otherwise, this target's value is assumed to be a string that
3129 # will simply override the inherited list of values.
Richard Levittea26d8be2016-02-26 12:25:13 +01003130 my $default_combiner = add();
Richard Levittebd5192b2015-05-18 02:57:24 +02003131
3132 my %all_keys =
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01003133 map { $_ => 1 } (keys %combined_inheritance,
3134 keys %{$table{$target}});
Richard Levitteb0b92a52016-02-27 11:08:21 +01003135
3136 sub process_values {
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01003137 my $object = shift;
3138 my $inherited = shift; # Always a [ list ]
3139 my $target = shift;
3140 my $entry = shift;
Richard Levitteb0b92a52016-02-27 11:08:21 +01003141
Richard Levitte9c62a272016-02-27 16:51:34 +01003142 $add_called = 0;
3143
Richard Levitteb0b92a52016-02-27 11:08:21 +01003144 while(ref($object) eq "CODE") {
3145 $object = $object->(@$inherited);
3146 }
3147 if (!defined($object)) {
3148 return ();
3149 }
3150 elsif (ref($object) eq "ARRAY") {
Richard Levitte9c62a272016-02-27 16:51:34 +01003151 local $add_called; # To make sure recursive calls don't affect it
Richard Levitteb0b92a52016-02-27 11:08:21 +01003152 return [ map { process_values($_, $inherited, $target, $entry) }
3153 @$object ];
3154 } elsif (ref($object) eq "") {
3155 return $object;
3156 } else {
3157 die "cannot handle reference type ",ref($object)
3158 ," found in target ",$target," -> ",$entry,"\n";
3159 }
3160 }
3161
Alexandros Roussosa595e322021-12-20 19:14:57 +01003162 foreach my $key (sort keys %all_keys) {
3163 my $previous = $combined_inheritance{$key};
Richard Levittebd5192b2015-05-18 02:57:24 +02003164
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01003165 # Current target doesn't have a value for the current key?
3166 # Assign it the default combiner, the rest of this loop body
3167 # will handle it just like any other coderef.
Alexandros Roussosa595e322021-12-20 19:14:57 +01003168 if (!exists $table{$target}->{$key}) {
3169 $table{$target}->{$key} = $default_combiner;
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01003170 }
Richard Levittebd5192b2015-05-18 02:57:24 +02003171
Alexandros Roussosa595e322021-12-20 19:14:57 +01003172 $table{$target}->{$key} = process_values($table{$target}->{$key},
3173 $combined_inheritance{$key},
3174 $target, $key);
3175 unless(defined($table{$target}->{$key})) {
3176 delete $table{$target}->{$key};
Richard Levitteb0b92a52016-02-27 11:08:21 +01003177 }
Richard Levittec4718842016-03-09 17:18:07 +01003178# if ($extra_checks &&
Alexandros Roussosa595e322021-12-20 19:14:57 +01003179# $previous && !($add_called || $previous ~~ $table{$target}->{$key})) {
3180# warn "$key got replaced in $target\n";
Richard Levittec4718842016-03-09 17:18:07 +01003181# }
Richard Levittebd5192b2015-05-18 02:57:24 +02003182 }
3183
3184 # Finally done, return the result.
3185 return %{$table{$target}};
3186}
3187
Ulf Möller462ba4f1999-04-24 22:59:36 +00003188sub usage
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01003189 {
3190 print STDERR $usage;
3191 print STDERR "\npick os/compiler from:\n";
3192 my $j=0;
3193 my $i;
Ulf Möller10a926c2000-02-21 00:55:45 +00003194 my $k=0;
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01003195 foreach $i (sort keys %table)
3196 {
3197 next if $table{$i}->{template};
3198 next if $i =~ /^debug/;
3199 $k += length($i) + 1;
3200 if ($k > 78)
3201 {
3202 print STDERR "\n";
3203 $k=length($i);
3204 }
3205 print STDERR $i . " ";
3206 }
3207 foreach $i (sort keys %table)
3208 {
3209 next if $table{$i}->{template};
3210 next if $i !~ /^debug/;
3211 $k += length($i) + 1;
3212 if ($k > 78)
3213 {
3214 print STDERR "\n";
3215 $k=length($i);
3216 }
3217 print STDERR $i . " ";
3218 }
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01003219 exit(1);
3220 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00003221
Richard Levitte6d75a832017-11-06 17:11:03 +01003222sub compiler_predefined {
3223 state %predefined;
Andy Polyakov41d6e0f2018-05-04 14:25:45 +02003224 my $cc = shift;
Richard Levitte6d75a832017-11-06 17:11:03 +01003225
3226 return () if $^O eq 'VMS';
3227
Andy Polyakov41d6e0f2018-05-04 14:25:45 +02003228 die 'compiler_predefined called without a compiler command'
3229 unless $cc;
Richard Levitte6d75a832017-11-06 17:11:03 +01003230
Andy Polyakov41d6e0f2018-05-04 14:25:45 +02003231 if (! $predefined{$cc}) {
Richard Levitte6d75a832017-11-06 17:11:03 +01003232
Andy Polyakov41d6e0f2018-05-04 14:25:45 +02003233 $predefined{$cc} = {};
Richard Levitte6d75a832017-11-06 17:11:03 +01003234
3235 # collect compiler pre-defines from gcc or gcc-alike...
3236 open(PIPE, "$cc -dM -E -x c /dev/null 2>&1 |");
3237 while (my $l = <PIPE>) {
3238 $l =~ m/^#define\s+(\w+(?:\(\w+\))?)(?:\s+(.+))?/ or last;
Andy Polyakov41d6e0f2018-05-04 14:25:45 +02003239 $predefined{$cc}->{$1} = $2 // '';
Richard Levitte6d75a832017-11-06 17:11:03 +01003240 }
3241 close(PIPE);
3242 }
3243
Andy Polyakov41d6e0f2018-05-04 14:25:45 +02003244 return %{$predefined{$cc}};
Richard Levitte6d75a832017-11-06 17:11:03 +01003245}
3246
Andy Polyakov656bbdc2016-05-20 21:31:11 +02003247sub which
3248{
3249 my ($name)=@_;
3250
3251 if (eval { require IPC::Cmd; 1; }) {
3252 IPC::Cmd->import();
3253 return scalar IPC::Cmd::can_run($name);
3254 } else {
3255 # if there is $directories component in splitpath,
3256 # then it's not something to test with $PATH...
3257 return $name if (File::Spec->splitpath($name))[1];
3258
3259 foreach (File::Spec->path()) {
3260 my $fullpath = catfile($_, "$name$target{exe_extension}");
3261 if (-f $fullpath and -x $fullpath) {
3262 return $fullpath;
3263 }
3264 }
3265 }
3266}
3267
Richard Levitte7ecdf182017-11-29 13:09:01 +01003268sub env
3269{
3270 my $name = shift;
Richard Levitteac6ae8a2018-03-16 08:24:50 +01003271 my %opts = @_;
Richard Levitte7ecdf182017-11-29 13:09:01 +01003272
Richard Levitteac6ae8a2018-03-16 08:24:50 +01003273 unless ($opts{cacheonly}) {
3274 # Note that if $ENV{$name} doesn't exist or is undefined,
3275 # $config{perlenv}->{$name} will be created with the value
3276 # undef. This is intentional.
Richard Levitte89bea082017-11-29 13:16:53 +01003277
Richard Levitteac6ae8a2018-03-16 08:24:50 +01003278 $config{perlenv}->{$name} = $ENV{$name}
3279 if ! exists $config{perlenv}->{$name};
3280 }
Richard Levitte7ecdf182017-11-29 13:09:01 +01003281 return $config{perlenv}->{$name};
3282}
3283
Richard Levitte00ae96c2015-05-18 12:53:38 +02003284# Configuration printer ##############################################
3285
3286sub print_table_entry
3287{
Andy Polyakovf770d752018-03-26 12:35:57 +02003288 local $now_printing = shift;
3289 my %target = resolve_config($now_printing);
Richard Levitte00ae96c2015-05-18 12:53:38 +02003290 my $type = shift;
3291
3292 # Don't print the templates
3293 return if $target{template};
3294
3295 my @sequence = (
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01003296 "sys_id",
3297 "cpp",
3298 "cppflags",
3299 "defines",
3300 "includes",
3301 "cc",
3302 "cflags",
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01003303 "ld",
3304 "lflags",
3305 "loutflag",
3306 "ex_libs",
3307 "bn_ops",
Richard Levitte37fe90a2020-09-21 13:13:25 +02003308 "enable",
3309 "disable",
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01003310 "poly1035_asm_src",
3311 "thread_scheme",
3312 "perlasm_scheme",
3313 "dso_scheme",
3314 "shared_target",
3315 "shared_cflag",
3316 "shared_defines",
3317 "shared_ldflag",
3318 "shared_rcflag",
3319 "shared_extension",
3320 "dso_extension",
3321 "obj_extension",
3322 "exe_extension",
3323 "ranlib",
3324 "ar",
3325 "arflags",
3326 "aroutflag",
3327 "rc",
3328 "rcflags",
3329 "rcoutflag",
3330 "mt",
3331 "mtflags",
3332 "mtinflag",
3333 "mtoutflag",
3334 "multilib",
3335 "build_scheme",
3336 );
Richard Levitte00ae96c2015-05-18 12:53:38 +02003337
3338 if ($type eq "TABLE") {
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01003339 print "\n";
3340 print "*** $now_printing\n";
Richard Levittecb212f22016-02-24 01:32:51 +01003341 foreach (@sequence) {
3342 if (ref($target{$_}) eq "ARRAY") {
3343 printf "\$%-12s = %s\n", $_, join(" ", @{$target{$_}});
3344 } else {
3345 printf "\$%-12s = %s\n", $_, $target{$_};
3346 }
3347 }
Richard Levitte00ae96c2015-05-18 12:53:38 +02003348 } elsif ($type eq "HASH") {
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01003349 my $largest =
3350 length((sort { length($a) <=> length($b) } @sequence)[-1]);
3351 print " '$now_printing' => {\n";
3352 foreach (@sequence) {
3353 if ($target{$_}) {
Richard Levittecb212f22016-02-24 01:32:51 +01003354 if (ref($target{$_}) eq "ARRAY") {
3355 print " '",$_,"'"," " x ($largest - length($_))," => [ ",join(", ", map { "'$_'" } @{$target{$_}})," ],\n";
3356 } else {
3357 print " '",$_,"'"," " x ($largest - length($_))," => '",$target{$_},"',\n";
3358 }
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01003359 }
3360 }
3361 print " },\n";
Richard Levitte00ae96c2015-05-18 12:53:38 +02003362 }
3363}
3364
3365# Utility routines ###################################################
3366
Richard Levitte2e963842016-02-10 02:00:37 +01003367# On VMS, if the given file is a logical name, File::Spec::Functions
3368# will consider it an absolute path. There are cases when we want a
3369# purely syntactic check without checking the environment.
3370sub isabsolute {
3371 my $file = shift;
3372
3373 # On non-platforms, we just use file_name_is_absolute().
3374 return file_name_is_absolute($file) unless $^O eq "VMS";
3375
FdaSilvaYY69687aa2017-03-28 23:57:28 +02003376 # If the file spec includes a device or a directory spec,
Richard Levitte2e963842016-02-10 02:00:37 +01003377 # file_name_is_absolute() is perfectly safe.
3378 return file_name_is_absolute($file) if $file =~ m|[:\[]|;
3379
3380 # Here, we know the given file spec isn't absolute
3381 return 0;
3382}
3383
Richard Levitteec182ef2016-02-09 10:15:13 +01003384# Makes a directory absolute and cleans out /../ in paths like foo/../bar
3385# On some platforms, this uses rel2abs(), while on others, realpath() is used.
3386# realpath() requires that at least all path components except the last is an
3387# existing directory. On VMS, the last component of the directory spec must
3388# exist.
3389sub absolutedir {
3390 my $dir = shift;
3391
3392 # realpath() is quite buggy on VMS. It uses LIB$FID_TO_NAME, which
3393 # will return the volume name for the device, no matter what. Also,
3394 # it will return an incorrect directory spec if the argument is a
3395 # directory that doesn't exist.
3396 if ($^O eq "VMS") {
3397 return rel2abs($dir);
3398 }
3399
3400 # We use realpath() on Unix, since no other will properly clean out
3401 # a directory spec.
3402 use Cwd qw/realpath/;
3403
3404 return realpath($dir);
3405}
3406
Richard Levitte610e2b32020-07-01 10:06:59 +02003407# Check if all paths are one and the same, using stat. They must both exist
3408# We need this for the cases when File::Spec doesn't detect case insensitivity
3409# (File::Spec::Unix assumes case sensitivity)
3410sub samedir {
3411 die "samedir expects two arguments\n" unless scalar @_ == 2;
3412
3413 my @stat0 = stat($_[0]); # First argument
3414 my @stat1 = stat($_[1]); # Second argument
3415
3416 die "Couldn't stat $_[0]" unless @stat0;
3417 die "Couldn't stat $_[1]" unless @stat1;
3418
3419 # Compare device number
3420 return 0 unless ($stat0[0] == $stat1[0]);
3421 # Compare "inode". The perl manual recommends comparing as
3422 # string rather than as number.
3423 return 0 unless ($stat0[1] eq $stat1[1]);
3424
3425 return 1; # All the same
3426}
3427
Richard Levittefe052642015-05-18 03:33:55 +02003428sub quotify {
3429 my %processors = (
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01003430 perl => sub { my $x = shift;
3431 $x =~ s/([\\\$\@"])/\\$1/g;
3432 return '"'.$x.'"'; },
3433 maybeshell => sub { my $x = shift;
3434 (my $y = $x) =~ s/([\\\"])/\\$1/g;
3435 if ($x ne $y || $x =~ m|\s|) {
3436 return '"'.$y.'"';
3437 } else {
3438 return $x;
3439 }
3440 },
3441 );
Richard Levittefe052642015-05-18 03:33:55 +02003442 my $for = shift;
3443 my $processor =
Dr. Matthias St. Pierre84f32c82019-03-18 11:43:59 +01003444 defined($processors{$for}) ? $processors{$for} : sub { shift; };
Richard Levittefe052642015-05-18 03:33:55 +02003445
Richard Levitte2110feb2016-04-06 15:02:57 +02003446 return map { $processor->($_); } @_;
Richard Levittefe052642015-05-18 03:33:55 +02003447}
Richard Levitte107b5792015-05-20 20:03:20 +02003448
Richard Levitte9fe2bb72016-01-29 19:45:51 +01003449# collect_from_file($filename, $line_concat_cond_re, $line_concat)
3450# $filename is a file name to read from
3451# $line_concat_cond_re is a regexp detecting a line continuation ending
3452# $line_concat is a CODEref that takes care of concatenating two lines
3453sub collect_from_file {
3454 my $filename = shift;
3455 my $line_concat_cond_re = shift;
3456 my $line_concat = shift;
3457
3458 open my $fh, $filename || die "unable to read $filename: $!\n";
3459 return sub {
3460 my $saved_line = "";
3461 $_ = "";
3462 while (<$fh>) {
Richard Levitte04f171c2016-02-12 12:10:27 +01003463 s|\R$||;
Richard Levitte9fe2bb72016-01-29 19:45:51 +01003464 if (defined $line_concat) {
3465 $_ = $line_concat->($saved_line, $_);
3466 $saved_line = "";
3467 }
3468 if (defined $line_concat_cond_re && /$line_concat_cond_re/) {
3469 $saved_line = $_;
3470 next;
3471 }
3472 return $_;
3473 }
3474 die "$filename ending with continuation line\n" if $_;
3475 close $fh;
3476 return undef;
3477 }
3478}
3479
3480# collect_from_array($array, $line_concat_cond_re, $line_concat)
3481# $array is an ARRAYref of lines
3482# $line_concat_cond_re is a regexp detecting a line continuation ending
3483# $line_concat is a CODEref that takes care of concatenating two lines
3484sub collect_from_array {
3485 my $array = shift;
3486 my $line_concat_cond_re = shift;
3487 my $line_concat = shift;
3488 my @array = (@$array);
3489
3490 return sub {
3491 my $saved_line = "";
3492 $_ = "";
3493 while (defined($_ = shift @array)) {
Richard Levitte04f171c2016-02-12 12:10:27 +01003494 s|\R$||;
Richard Levitte9fe2bb72016-01-29 19:45:51 +01003495 if (defined $line_concat) {
3496 $_ = $line_concat->($saved_line, $_);
3497 $saved_line = "";
3498 }
3499 if (defined $line_concat_cond_re && /$line_concat_cond_re/) {
3500 $saved_line = $_;
3501 next;
3502 }
3503 return $_;
3504 }
3505 die "input text ending with continuation line\n" if $_;
3506 return undef;
3507 }
3508}
3509
3510# collect_information($lineiterator, $line_continue, $regexp => $CODEref, ...)
3511# $lineiterator is a CODEref that delivers one line at a time.
Richard Levitte107b5792015-05-20 20:03:20 +02003512# All following arguments are regex/CODEref pairs, where the regexp detects a
3513# line and the CODEref does something with the result of the regexp.
3514sub collect_information {
Richard Levitte9fe2bb72016-01-29 19:45:51 +01003515 my $lineiterator = shift;
Richard Levitte107b5792015-05-20 20:03:20 +02003516 my %collectors = @_;
3517
Richard Levitte9fe2bb72016-01-29 19:45:51 +01003518 while(defined($_ = $lineiterator->())) {
Richard Levitte04f171c2016-02-12 12:10:27 +01003519 s|\R$||;
Richard Levitte9fe2bb72016-01-29 19:45:51 +01003520 my $found = 0;
Richard Levitte2b6b6062016-03-10 00:04:04 +01003521 if ($collectors{"BEFORE"}) {
3522 $collectors{"BEFORE"}->($_);
3523 }
Richard Levitte9fe2bb72016-01-29 19:45:51 +01003524 foreach my $re (keys %collectors) {
Richard Levitte2b6b6062016-03-10 00:04:04 +01003525 if ($re !~ /^OTHERWISE|BEFORE|AFTER$/ && /$re/) {
Richard Levitte9fe2bb72016-01-29 19:45:51 +01003526 $collectors{$re}->($lineiterator);
3527 $found = 1;
3528 };
3529 }
3530 if ($collectors{"OTHERWISE"}) {
3531 $collectors{"OTHERWISE"}->($lineiterator, $_)
3532 unless $found || !defined $collectors{"OTHERWISE"};
3533 }
Richard Levitte2b6b6062016-03-10 00:04:04 +01003534 if ($collectors{"AFTER"}) {
3535 $collectors{"AFTER"}->($_);
3536 }
Richard Levitte107b5792015-05-20 20:03:20 +02003537 }
Richard Levitte107b5792015-05-20 20:03:20 +02003538}
Richard Levittece959812016-05-24 17:39:52 +02003539
3540# tokenize($line)
Richard Levitte5d3af252018-11-07 10:34:05 +01003541# tokenize($line,$separator)
Richard Levittece959812016-05-24 17:39:52 +02003542# $line is a line of text to split up into tokens
Richard Levitte5d3af252018-11-07 10:34:05 +01003543# $separator [optional] is a regular expression that separates the tokens,
3544# the default being spaces. Do not use quotes of any kind as separators,
3545# that will give undefined results.
3546# Returns a list of tokens.
Richard Levittece959812016-05-24 17:39:52 +02003547#
Richard Levitte5d3af252018-11-07 10:34:05 +01003548# Tokens are divided by separator (spaces by default). If the tokens include
3549# the separators, they have to be quoted with single or double quotes.
3550# Double quotes inside a double quoted token must be escaped. Escaping is done
Richard Levittece959812016-05-24 17:39:52 +02003551# with backslash.
3552# Basically, the same quoting rules apply for " and ' as in any
3553# Unix shell.
3554sub tokenize {
3555 my $line = my $debug_line = shift;
Richard Levitte5d3af252018-11-07 10:34:05 +01003556 my $separator = shift // qr|\s+|;
Richard Levittece959812016-05-24 17:39:52 +02003557 my @result = ();
3558
Richard Levitte5d3af252018-11-07 10:34:05 +01003559 if ($ENV{CONFIGURE_DEBUG_TOKENIZE}) {
3560 print STDERR "DEBUG[tokenize]: \$separator = $separator\n";
3561 }
3562
3563 while ($line =~ s|^${separator}||, $line ne "") {
Richard Levittece959812016-05-24 17:39:52 +02003564 my $token = "";
Richard Levitte5d3af252018-11-07 10:34:05 +01003565 again:
3566 $line =~ m/^(.*?)(${separator}|"|'|$)/;
3567 $token .= $1;
3568 $line = $2.$';
3569
3570 if ($line =~ m/^"((?:[^"\\]+|\\.)*)"/) {
3571 $token .= $1;
3572 $line = $';
3573 goto again;
3574 } elsif ($line =~ m/^'([^']*)'/) {
3575 $token .= $1;
3576 $line = $';
3577 goto again;
Richard Levittece959812016-05-24 17:39:52 +02003578 }
3579 push @result, $token;
3580 }
3581
3582 if ($ENV{CONFIGURE_DEBUG_TOKENIZE}) {
Richard Levitte5d3af252018-11-07 10:34:05 +01003583 print STDERR "DEBUG[tokenize]: Parsed '$debug_line' into:\n";
3584 print STDERR "DEBUG[tokenize]: ('", join("', '", @result), "')\n";
Richard Levittece959812016-05-24 17:39:52 +02003585 }
3586 return @result;
3587}