Richard Levitte | de17db9 | 2015-11-24 14:06:45 +0100 | [diff] [blame] | 1 | #! /usr/bin/env perl |
Jacob Bandes-Storch | f4d8f03 | 2015-11-23 21:44:58 -0800 | [diff] [blame] | 2 | # -*- mode: perl; -*- |
Richard Levitte | 4333b89 | 2021-01-28 13:54:57 +0100 | [diff] [blame] | 3 | # Copyright 2016-2021 The OpenSSL Project Authors. All Rights Reserved. |
Rich Salz | ac3d0e1 | 2016-04-20 10:20:59 -0400 | [diff] [blame] | 4 | # |
Richard Levitte | 402dd55 | 2018-12-06 14:08:43 +0100 | [diff] [blame] | 5 | # Licensed under the Apache License 2.0 (the "License"). You may not use |
Rich Salz | ac3d0e1 | 2016-04-20 10:20:59 -0400 | [diff] [blame] | 6 | # this file except in compliance with the License. You can obtain a copy |
| 7 | # in the file LICENSE in the source distribution or at |
| 8 | # https://www.openssl.org/source/license.html |
Richard Levitte | de17db9 | 2015-11-24 14:06:45 +0100 | [diff] [blame] | 9 | |
Ralf S. Engelschall | a4ed553 | 1999-02-25 08:48:52 +0000 | [diff] [blame] | 10 | ## Configure -- OpenSSL source tree configuration script |
Ben Laurie | 1641cb6 | 1998-12-28 17:08:48 +0000 | [diff] [blame] | 11 | |
Andy Polyakov | d83112b | 2017-03-31 14:37:10 +0200 | [diff] [blame] | 12 | use 5.10.0; |
Ben Laurie | 1641cb6 | 1998-12-28 17:08:48 +0000 | [diff] [blame] | 13 | use strict; |
Rich Salz | 141d732 | 2016-09-06 12:26:38 -0400 | [diff] [blame] | 14 | use Config; |
Richard Levitte | cb6afcd | 2017-08-01 22:10:39 +0200 | [diff] [blame] | 15 | use FindBin; |
| 16 | use lib "$FindBin::Bin/util/perl"; |
Rich Salz | f09e7ca | 2015-02-24 17:40:22 -0500 | [diff] [blame] | 17 | use File::Basename; |
Richard Levitte | 7f73eaf | 2018-11-03 15:03:59 +0100 | [diff] [blame] | 18 | use File::Spec::Functions qw/:DEFAULT abs2rel rel2abs splitdir/; |
Richard Levitte | dca9938 | 2016-02-08 16:27:15 +0100 | [diff] [blame] | 19 | use File::Path qw/mkpath/; |
Richard Levitte | 1935a58 | 2019-09-09 11:51:01 +0200 | [diff] [blame] | 20 | use OpenSSL::fallback "$FindBin::Bin/external/perl/MODULES.txt"; |
Richard Levitte | 8d2214c | 2017-08-01 22:43:56 +0200 | [diff] [blame] | 21 | use OpenSSL::Glob; |
Richard Levitte | 1f86b82 | 2019-08-25 10:46:22 +0200 | [diff] [blame] | 22 | use OpenSSL::Template; |
Richard Levitte | e39795a | 2020-03-03 00:01:35 +0100 | [diff] [blame] | 23 | use OpenSSL::config; |
Ben Laurie | 1641cb6 | 1998-12-28 17:08:48 +0000 | [diff] [blame] | 24 | |
Richard Levitte | f828ba0 | 2020-04-27 09:08:36 +0200 | [diff] [blame] | 25 | # see INSTALL.md for instructions. |
Ulf Möller | 462ba4f | 1999-04-24 22:59:36 +0000 | [diff] [blame] | 26 | |
Richard Levitte | 8937a4e | 2018-07-24 10:45:05 +0200 | [diff] [blame] | 27 | my $orig_death_handler = $SIG{__DIE__}; |
| 28 | $SIG{__DIE__} = \&death_handler; |
| 29 | |
Richard Levitte | 31b6ed7 | 2019-03-31 16:15:02 +0200 | [diff] [blame] | 30 | my $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öller | 462ba4f | 1999-04-24 22:59:36 +0000 | [diff] [blame] | 31 | |
Rich Salz | d0364dc | 2021-05-12 10:42:46 -0400 | [diff] [blame] | 32 | my $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 | ********************************************************************** |
| 48 | EOF |
| 49 | |
Ulf Möller | 434c5dd | 1999-04-19 15:19:58 +0000 | [diff] [blame] | 50 | # Options: |
Bodo Möller | e5f3045 | 1999-04-29 21:52:08 +0000 | [diff] [blame] | 51 | # |
Rich Salz | f09e7ca | 2015-02-24 17:40:22 -0500 | [diff] [blame] | 52 | # --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 Levitte | d74dfaf | 2016-01-20 18:11:51 +0100 | [diff] [blame] | 55 | # --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 Salz | d0364dc | 2021-05-12 10:42:46 -0400 | [diff] [blame] | 64 | # --banner=".." Output specified text instead of default completion banner |
Bodo Möller | e5f3045 | 1999-04-29 21:52:08 +0000 | [diff] [blame] | 65 | # |
Rich Salz | ecb09ba | 2021-08-17 11:42:21 -0400 | [diff] [blame] | 66 | # -w Don't wait after showing a Configure warning |
| 67 | # |
Andy Polyakov | cbfb39d | 2006-10-21 13:38:16 +0000 | [diff] [blame] | 68 | # --cross-compile-prefix Add specified prefix to binutils components. |
| 69 | # |
Richard Levitte | a6a4d0a | 2019-11-05 17:00:33 +0100 | [diff] [blame] | 70 | # --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 Dukhovni | 98186eb | 2016-01-04 23:00:33 -0500 | [diff] [blame] | 75 | # |
Richard Levitte | 5270e70 | 2000-10-26 21:07:28 +0000 | [diff] [blame] | 76 | # 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öller | 5f8d5c9 | 1999-04-29 16:10:09 +0000 | [diff] [blame] | 81 | # [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. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 84 | # [no-]shared [don't] try to create shared libraries when supported. |
Richard Levitte | ae48242 | 2016-02-22 02:09:11 +0100 | [diff] [blame] | 85 | # [no-]pic [don't] try to build position independent code when supported. |
Richard Levitte | 45b71ab | 2016-02-22 15:57:25 +0100 | [diff] [blame] | 86 | # If disabled, it also disables shared and dynamic-engine. |
Ulf Möller | a723979 | 1999-04-19 14:55:56 +0000 | [diff] [blame] | 87 | # no-asm do not use assembler |
Benjamin Kaduk | 0423f81 | 2016-01-12 18:02:16 -0600 | [diff] [blame] | 88 | # no-egd do not compile support for the entropy-gathering daemon APIs |
Richard Levitte | e452de9 | 2001-07-12 09:11:14 +0000 | [diff] [blame] | 89 | # [no-]zlib [don't] compile support for zlib compression. |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 90 | # 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 Henson | 7e159e0 | 2011-12-25 14:45:15 +0000 | [diff] [blame] | 92 | # sctp include SCTP support |
MouriNaruto | 5ded1ca | 2019-05-12 05:10:58 +0800 | [diff] [blame] | 93 | # no-uplink Don't build support for UPLINK interface. |
Matt Caswell | 8b1a5af | 2016-03-03 15:40:51 +0000 | [diff] [blame] | 94 | # enable-weak-ssl-ciphers |
Paul Yang | edcdf38 | 2017-06-17 22:17:44 +0800 | [diff] [blame] | 95 | # Enable weak ciphers that are disabled by default. |
Andy Polyakov | 5ae5dc9 | 2016-11-20 21:52:41 +0100 | [diff] [blame] | 96 | # 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 Levitte | 3a1ee3c | 2020-12-17 21:37:15 +0100 | [diff] [blame] | 99 | # no-<cipher> build without specified algorithm (dsa, idea, rc5, ...) |
Dr. Matthias St. Pierre | f246f54 | 2019-09-21 00:14:16 +0200 | [diff] [blame] | 100 | # -<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 Polyakov | 047d97a | 2016-09-01 21:36:13 +0200 | [diff] [blame] | 109 | # -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 Levitte | 31b6ed7 | 2019-03-31 16:15:02 +0200 | [diff] [blame] | 112 | # namely no-pic, no-shared and no-threads. It is |
Andy Polyakov | 047d97a | 2016-09-01 21:36:13 +0200 | [diff] [blame] | 113 | # 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 Thorpe | e41c8d6 | 2000-06-01 05:13:52 +0000 | [diff] [blame] | 125 | # |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 126 | # 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 Polyakov | d0590fe | 2004-07-18 16:19:34 +0000 | [diff] [blame] | 128 | # Following are set automatically by this script |
| 129 | # |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 130 | # 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. Engelschall | d02b48c | 1998-12-21 10:52:47 +0000 | [diff] [blame] | 136 | |
Richard Levitte | 3b43740 | 2019-05-27 14:40:25 +0200 | [diff] [blame] | 137 | # 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 Henson | 363bd0b | 2009-01-11 15:56:32 +0000 | [diff] [blame] | 140 | |
Rich Salz | 7730533 | 2017-01-30 16:13:41 -0500 | [diff] [blame] | 141 | # -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 Levitte | 3b43740 | 2019-05-27 14:40:25 +0200 | [diff] [blame] | 153 | my @gcc_devteam_warn = qw( |
Rich Salz | a935791 | 2021-05-19 11:09:49 -0400 | [diff] [blame] | 154 | -DPEDANTIC -pedantic -Wno-long-long -DUNUSEDRESULT_DEBUG |
Richard Levitte | 3b43740 | 2019-05-27 14:40:25 +0200 | [diff] [blame] | 155 | -Wall |
Rich Salz | a935791 | 2021-05-19 11:09:49 -0400 | [diff] [blame] | 156 | -Wmissing-declarations |
Richard Levitte | 3b43740 | 2019-05-27 14:40:25 +0200 | [diff] [blame] | 157 | -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 Henson | 363bd0b | 2009-01-11 15:56:32 +0000 | [diff] [blame] | 170 | |
Ben Laurie | 190c8c6 | 2015-04-19 14:10:54 +0100 | [diff] [blame] | 171 | # 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 Laurie | 480405e | 2015-08-02 02:45:44 +0100 | [diff] [blame] | 173 | # following warnings can also be enabled: |
Rich Salz | 8bccbce | 2016-02-13 12:27:11 -0500 | [diff] [blame] | 174 | # -Wcast-align |
Rich Salz | 7730533 | 2017-01-30 16:13:41 -0500 | [diff] [blame] | 175 | # -Wunreachable-code -- no, too ugly/compiler-specific |
Rich Salz | a773b52 | 2016-02-13 22:33:56 -0500 | [diff] [blame] | 176 | # -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 Levitte | 3b43740 | 2019-05-27 14:40:25 +0200 | [diff] [blame] | 179 | my @clang_devteam_warn = qw( |
Dr. Matthias St. Pierre | 03e5668 | 2019-07-23 20:54:03 +0200 | [diff] [blame] | 180 | -Wno-unknown-warning-option |
Richard Levitte | 3b43740 | 2019-05-27 14:40:25 +0200 | [diff] [blame] | 181 | -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 Levitte | 3b43740 | 2019-05-27 14:40:25 +0200 | [diff] [blame] | 187 | -Wmissing-variable-declarations |
| 188 | ); |
Emilia Kasper | cb2bc05 | 2015-01-05 13:46:26 +0100 | [diff] [blame] | 189 | |
Richard Levitte | b4a7b4e | 2019-10-29 13:37:54 +0100 | [diff] [blame] | 190 | my @cl_devteam_warn = qw( |
| 191 | /WX |
| 192 | ); |
| 193 | |
Dr. Stephen Henson | 0c28f27 | 2009-09-09 16:31:32 +0000 | [diff] [blame] | 194 | my $strict_warnings = 0; |
| 195 | |
Andy Polyakov | b7efa56 | 2005-01-24 14:38:14 +0000 | [diff] [blame] | 196 | # As for $BSDthreads. Idea is to maintain "collective" set of flags, |
Felix Laurie von Massenbach | fce0ba5 | 2014-05-26 17:19:28 +0100 | [diff] [blame] | 197 | # which would cover all BSD flavors. -pthread applies to them all, |
Andy Polyakov | b7efa56 | 2005-01-24 14:38:14 +0000 | [diff] [blame] | 198 | # 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 Levitte | 9c62a27 | 2016-02-27 16:51:34 +0100 | [diff] [blame] | 203 | our $BSDthreads="-pthread -D_THREAD_SAFE -D_REENTRANT"; |
Ralf S. Engelschall | d02b48c | 1998-12-21 10:52:47 +0000 | [diff] [blame] | 204 | |
Viktor Dukhovni | 98186eb | 2016-01-04 23:00:33 -0500 | [diff] [blame] | 205 | # |
FdaSilvaYY | f430ba3 | 2016-06-19 19:39:01 +0200 | [diff] [blame] | 206 | # API compatibility name to version number mapping. |
Viktor Dukhovni | 98186eb | 2016-01-04 23:00:33 -0500 | [diff] [blame] | 207 | # |
Viktor Dukhovni | 98186eb | 2016-01-04 23:00:33 -0500 | [diff] [blame] | 208 | my $apitable = { |
Richard Levitte | a6a4d0a | 2019-11-05 17:00:33 +0100 | [diff] [blame] | 209 | # 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 Bevenius | 55affca | 2020-07-09 07:28:19 +0200 | [diff] [blame] | 213 | # From 3.0 and on, we internalise the given version number in decimal |
Richard Levitte | a6a4d0a | 2019-11-05 17:00:33 +0100 | [diff] [blame] | 214 | # 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 Dukhovni | 98186eb | 2016-01-04 23:00:33 -0500 | [diff] [blame] | 226 | }; |
| 227 | |
Richard Levitte | 1806261 | 2020-03-03 15:04:42 +0100 | [diff] [blame] | 228 | # For OpenSSL::config::get_platform |
| 229 | my %guess_opts = (); |
| 230 | |
| 231 | my $dryrun = 0; |
| 232 | |
Richard Levitte | 9e0724a | 2015-05-18 02:54:28 +0200 | [diff] [blame] | 233 | our %table = (); |
Richard Levitte | 291e94d | 2015-05-18 22:35:23 +0200 | [diff] [blame] | 234 | our %config = (); |
Richard Levitte | 98fdbce | 2016-02-27 11:37:33 +0100 | [diff] [blame] | 235 | our %withargs = (); |
Andy Polyakov | f770d75 | 2018-03-26 12:35:57 +0200 | [diff] [blame] | 236 | our $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. Engelschall | d02b48c | 1998-12-21 10:52:47 +0000 | [diff] [blame] | 240 | |
Richard Levitte | bd5192b | 2015-05-18 02:57:24 +0200 | [diff] [blame] | 241 | # Forward declarations ############################################### |
Andy Polyakov | 7ead0c8 | 2015-03-16 22:33:36 +0100 | [diff] [blame] | 242 | |
Richard Levitte | bd5192b | 2015-05-18 02:57:24 +0200 | [diff] [blame] | 243 | # read_config(filename) |
| 244 | # |
| 245 | # Reads a configuration file and populates %table with the contents |
| 246 | # (which the configuration file places in %targets). |
| 247 | sub read_config; |
Andy Polyakov | 7ead0c8 | 2015-03-16 22:33:36 +0100 | [diff] [blame] | 248 | |
Richard Levitte | bd5192b | 2015-05-18 02:57:24 +0200 | [diff] [blame] | 249 | # resolve_config(target) |
| 250 | # |
FdaSilvaYY | 8483a00 | 2016-03-10 21:34:48 +0100 | [diff] [blame] | 251 | # Resolves all the late evaluations, inheritances and so on for the |
Richard Levitte | bd5192b | 2015-05-18 02:57:24 +0200 | [diff] [blame] | 252 | # chosen target and any target it inherits from. |
| 253 | sub resolve_config; |
Richard Levitte | aaf878c | 2015-03-06 02:00:21 +0100 | [diff] [blame] | 254 | |
Rich Salz | f09e7ca | 2015-02-24 17:40:22 -0500 | [diff] [blame] | 255 | |
Richard Levitte | 107b579 | 2015-05-20 20:03:20 +0200 | [diff] [blame] | 256 | # Information collection ############################################# |
| 257 | |
Richard Levitte | 9fe2bb7 | 2016-01-29 19:45:51 +0100 | [diff] [blame] | 258 | # Unified build supports separate build dir |
Richard Levitte | ec182ef | 2016-02-09 10:15:13 +0100 | [diff] [blame] | 259 | my $srcdir = catdir(absolutedir(dirname($0))); # catdir ensures local syntax |
| 260 | my $blddir = catdir(absolutedir(".")); # catdir ensures local syntax |
Richard Levitte | 610e2b3 | 2020-07-01 10:06:59 +0200 | [diff] [blame] | 261 | |
| 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 Levitte | 9fe2bb7 | 2016-01-29 19:45:51 +0100 | [diff] [blame] | 271 | my $dofile = abs2rel(catfile($srcdir, "util/dofile.pl")); |
| 272 | |
Richard Levitte | b5293d4 | 2016-05-02 16:50:51 +0200 | [diff] [blame] | 273 | my $local_config_envname = 'OPENSSL_LOCAL_CONFIG_DIR'; |
| 274 | |
Richard Levitte | 610e2b3 | 2020-07-01 10:06:59 +0200 | [diff] [blame] | 275 | $config{sourcedir} = abs2rel($srcdir, $blddir); |
| 276 | $config{builddir} = abs2rel($blddir, $blddir); |
Rich Salz | 3121425 | 2020-06-29 12:20:41 +1000 | [diff] [blame] | 277 | # echo -n 'holy hand grenade of antioch' | openssl sha256 |
| 278 | $config{FIPSKEY} = |
| 279 | 'f4556650ac31d35461610bac4ed81b1a181b2d8a43ea2854cbae22ca74560813'; |
Richard Levitte | 9fe2bb7 | 2016-01-29 19:45:51 +0100 | [diff] [blame] | 280 | |
Richard Levitte | ee4cdb7 | 2016-08-29 22:11:36 +0200 | [diff] [blame] | 281 | # Collect reconfiguration information if needed |
| 282 | my @argvcopy=@ARGV; |
| 283 | |
| 284 | if (grep /^reconf(igure)?$/, @argvcopy) { |
Richard Levitte | 99aeeec | 2017-11-30 21:46:53 +0100 | [diff] [blame] | 285 | die "reconfiguring with other arguments present isn't supported" |
| 286 | if scalar @argvcopy > 1; |
Richard Levitte | ee4cdb7 | 2016-08-29 22:11:36 +0200 | [diff] [blame] | 287 | if (-f "./configdata.pm") { |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 288 | my $file = "./configdata.pm"; |
| 289 | unless (my $return = do $file) { |
| 290 | die "couldn't parse $file: $@" if $@; |
Richard Levitte | ee4cdb7 | 2016-08-29 22:11:36 +0200 | [diff] [blame] | 291 | die "couldn't do $file: $!" unless defined $return; |
| 292 | die "couldn't run $file" unless $return; |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 293 | } |
Richard Levitte | ee4cdb7 | 2016-08-29 22:11:36 +0200 | [diff] [blame] | 294 | |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 295 | @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 Levitte | ee4cdb7 | 2016-08-29 22:11:36 +0200 | [diff] [blame] | 300 | } else { |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 301 | die "Insufficient data to reconfigure, please do a normal configuration\n"; |
Richard Levitte | ee4cdb7 | 2016-08-29 22:11:36 +0200 | [diff] [blame] | 302 | } |
| 303 | } |
| 304 | |
| 305 | $config{perlargv} = [ @argvcopy ]; |
| 306 | |
Richard Levitte | b16654a | 2020-03-02 10:50:24 +0100 | [diff] [blame] | 307 | # 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). |
| 313 | foreach ( reverse sort( 'aes', 'aria', 'bf', 'camellia', 'cast', 'des', 'dh', |
| 314 | 'dsa', 'ec', 'hmac', 'idea', 'md2', 'md5', 'mdc2', |
Richard Levitte | 3a1ee3c | 2020-12-17 21:37:15 +0100 | [diff] [blame] | 315 | 'rc2', 'rc4', 'rc5', 'ripemd', 'seed', 'sha', |
Richard Levitte | b16654a | 2020-03-02 10:50:24 +0100 | [diff] [blame] | 316 | 'sm2', 'sm3', 'sm4') ) { |
| 317 | unshift @argvcopy, "no-$_" if ! -d catdir($srcdir, 'crypto', $_); |
| 318 | } |
| 319 | |
Richard Levitte | 107b579 | 2015-05-20 20:03:20 +0200 | [diff] [blame] | 320 | # Collect version numbers |
Richard Levitte | 20551b2 | 2019-10-17 16:03:06 +0200 | [diff] [blame] | 321 | my %version = (); |
Richard Levitte | 107b579 | 2015-05-20 20:03:20 +0200 | [diff] [blame] | 322 | |
| 323 | collect_information( |
Dr. David von Oheimb | 036cbb6 | 2020-06-10 14:15:28 +0200 | [diff] [blame] | 324 | collect_from_file(catfile($srcdir,'VERSION.dat')), |
Richard Levitte | 20551b2 | 2019-10-17 16:03:06 +0200 | [diff] [blame] | 325 | qr/\s*(\w+)\s*=\s*(.*?)\s*$/ => |
| 326 | sub { |
| 327 | # Only define it if there is a value at all |
Richard Levitte | 6a960a9 | 2020-04-23 18:59:10 +0200 | [diff] [blame] | 328 | 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 Levitte | 20551b2 | 2019-10-17 16:03:06 +0200 | [diff] [blame] | 335 | }, |
| 336 | "OTHERWISE" => |
Dr. David von Oheimb | 036cbb6 | 2020-06-10 14:15:28 +0200 | [diff] [blame] | 337 | sub { die "Something wrong with this line:\n$_\nin $srcdir/VERSION.dat" }, |
Richard Levitte | 107b579 | 2015-05-20 20:03:20 +0200 | [diff] [blame] | 338 | ); |
Richard Levitte | 20551b2 | 2019-10-17 16:03:06 +0200 | [diff] [blame] | 339 | |
| 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 Levitte | 107b579 | 2015-05-20 20:03:20 +0200 | [diff] [blame] | 349 | |
Dr. Matthias St. Pierre | 16942e0 | 2018-12-07 00:32:43 +0100 | [diff] [blame] | 350 | $config{version} = "$config{major}.$config{minor}.$config{patch}"; |
| 351 | $config{full_version} = "$config{version}$config{prerelease}$config{build_metadata}"; |
| 352 | |
Dr. David von Oheimb | 036cbb6 | 2020-06-10 14:15:28 +0200 | [diff] [blame] | 353 | die "erroneous version information in VERSION.dat: ", |
Richard Levitte | 20551b2 | 2019-10-17 16:03:06 +0200 | [diff] [blame] | 354 | "$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 Levitte | 107b579 | 2015-05-20 20:03:20 +0200 | [diff] [blame] | 360 | # Collect target configurations |
| 361 | |
Richard Levitte | 85152ca | 2016-02-02 19:47:05 +0100 | [diff] [blame] | 362 | my $pattern = catfile(dirname($0), "Configurations", "*.conf"); |
Andy Polyakov | 9785555 | 2016-05-28 16:11:01 +0200 | [diff] [blame] | 363 | foreach (sort glob($pattern)) { |
Rich Salz | f09e7ca | 2015-02-24 17:40:22 -0500 | [diff] [blame] | 364 | &read_config($_); |
| 365 | } |
| 366 | |
Richard Levitte | 7ecdf18 | 2017-11-29 13:09:01 +0100 | [diff] [blame] | 367 | if (defined env($local_config_envname)) { |
Richard Levitte | b5293d4 | 2016-05-02 16:50:51 +0200 | [diff] [blame] | 368 | 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 Levitte | 7ecdf18 | 2017-11-29 13:09:01 +0100 | [diff] [blame] | 373 | $pattern = catfile(env($local_config_envname), '*.conf'); |
Richard Levitte | b5293d4 | 2016-05-02 16:50:51 +0200 | [diff] [blame] | 374 | } |
| 375 | |
Andy Polyakov | 9785555 | 2016-05-28 16:11:01 +0200 | [diff] [blame] | 376 | foreach (sort glob($pattern)) { |
Richard Levitte | b5293d4 | 2016-05-02 16:50:51 +0200 | [diff] [blame] | 377 | &read_config($_); |
| 378 | } |
| 379 | } |
| 380 | |
Richard Levitte | d5fa703 | 2018-02-02 12:21:27 +0100 | [diff] [blame] | 381 | # Save away perl command information |
| 382 | $config{perl_cmd} = $^X; |
| 383 | $config{perl_version} = $Config{version}; |
| 384 | $config{perl_archname} = $Config{archname}; |
| 385 | |
Richard Levitte | 291e94d | 2015-05-18 22:35:23 +0200 | [diff] [blame] | 386 | $config{prefix}=""; |
| 387 | $config{openssldir}=""; |
Richard Levitte | 7d130f6 | 2015-05-19 01:40:54 +0200 | [diff] [blame] | 388 | $config{processor}=""; |
Richard Levitte | 107b579 | 2015-05-20 20:03:20 +0200 | [diff] [blame] | 389 | $config{libdir}=""; |
Richard Levitte | 9c62a27 | 2016-02-27 16:51:34 +0100 | [diff] [blame] | 390 | my $auto_threads=1; # enable threads automatically? true by default |
Bodo Möller | 0396479 | 2001-03-09 13:04:06 +0000 | [diff] [blame] | 391 | my $default_ranlib; |
Richard Levitte | 107b579 | 2015-05-20 20:03:20 +0200 | [diff] [blame] | 392 | |
Viktor Dukhovni | 6b01bed | 2016-01-18 13:10:21 -0500 | [diff] [blame] | 393 | # Known TLS and DTLS protocols |
Matt Caswell | 84a6833 | 2016-10-30 08:38:52 +0000 | [diff] [blame] | 394 | my @tls = qw(ssl3 tls1 tls1_1 tls1_2 tls1_3); |
Viktor Dukhovni | 6b01bed | 2016-01-18 13:10:21 -0500 | [diff] [blame] | 395 | my @dtls = qw(dtls1 dtls1_2); |
| 396 | |
FdaSilvaYY | 8483a00 | 2016-03-10 21:34:48 +0100 | [diff] [blame] | 397 | # Explicitly known options that are possible to disable. They can |
Richard Levitte | 8b527be | 2015-10-22 17:09:14 +0200 | [diff] [blame] | 398 | # be regexps, and will be used like this: /^no-${option}$/ |
| 399 | # For developers: keep it sorted alphabetically |
| 400 | |
| 401 | my @disablables = ( |
Pauli | 38230e3 | 2021-04-29 12:38:23 +1000 | [diff] [blame] | 402 | "acvp-tests", |
Emilia Kasper | c91a0a8 | 2016-03-14 12:21:44 +0100 | [diff] [blame] | 403 | "afalgeng", |
Pauli | d42d0a4 | 2017-02-01 10:10:13 +1000 | [diff] [blame] | 404 | "aria", |
Ben Laurie | c38bb72 | 2016-03-26 17:19:14 +0000 | [diff] [blame] | 405 | "asan", |
Richard Levitte | 8b527be | 2015-10-22 17:09:14 +0200 | [diff] [blame] | 406 | "asm", |
Todd Short | 52739e4 | 2016-02-04 11:41:25 -0500 | [diff] [blame] | 407 | "async", |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 408 | "autoalginit", |
Matt Caswell | 498abff | 2016-02-09 09:39:07 +0000 | [diff] [blame] | 409 | "autoerrinit", |
Bernd Edlinger | dbabc86 | 2018-04-15 12:02:25 +0200 | [diff] [blame] | 410 | "autoload-config", |
Richard Levitte | 8b527be | 2015-10-22 17:09:14 +0200 | [diff] [blame] | 411 | "bf", |
Bill Cox | 2d0b441 | 2016-03-09 23:08:31 +0100 | [diff] [blame] | 412 | "blake2", |
Richard Levitte | ac4033d | 2019-02-28 13:28:43 +0100 | [diff] [blame] | 413 | "buildtest-c++", |
Dr. David von Oheimb | 06f81af | 2020-12-01 17:15:45 +0100 | [diff] [blame] | 414 | "bulk", |
Pauli | 1eaf1fc | 2021-02-10 21:53:57 +1000 | [diff] [blame] | 415 | "cached-fetch", |
Richard Levitte | 8b527be | 2015-10-22 17:09:14 +0200 | [diff] [blame] | 416 | "camellia", |
| 417 | "capieng", |
| 418 | "cast", |
Andy Polyakov | 48f1484 | 2015-12-09 23:02:11 +0100 | [diff] [blame] | 419 | "chacha", |
Richard Levitte | 8b527be | 2015-10-22 17:09:14 +0200 | [diff] [blame] | 420 | "cmac", |
Richard Levitte | 538f38d | 2019-05-08 05:28:47 +0200 | [diff] [blame] | 421 | "cmp", |
Richard Levitte | 8b527be | 2015-10-22 17:09:14 +0200 | [diff] [blame] | 422 | "cms", |
| 423 | "comp", |
Mat | 3e45d39 | 2016-01-09 23:55:57 +0100 | [diff] [blame] | 424 | "crypto-mdebug", |
Richard Levitte | 8b527be | 2015-10-22 17:09:14 +0200 | [diff] [blame] | 425 | "ct", |
| 426 | "deprecated", |
| 427 | "des", |
Richard Levitte | 619eb33 | 2017-03-24 16:19:00 +0100 | [diff] [blame] | 428 | "devcryptoeng", |
Richard Levitte | 8b527be | 2015-10-22 17:09:14 +0200 | [diff] [blame] | 429 | "dgram", |
| 430 | "dh", |
| 431 | "dsa", |
Bernd Edlinger | 3b2f8c7 | 2019-09-13 10:45:29 +0200 | [diff] [blame] | 432 | "dso", |
Kurt Roeckx | a5ecdc6 | 2015-12-12 11:12:22 +0100 | [diff] [blame] | 433 | "dtls", |
Richard Levitte | 343ec2b | 2016-02-19 22:08:37 +0100 | [diff] [blame] | 434 | "dynamic-engine", |
Richard Levitte | 8b527be | 2015-10-22 17:09:14 +0200 | [diff] [blame] | 435 | "ec", |
| 436 | "ec2m", |
Dr. Matthias St. Pierre | afa0a13 | 2021-04-26 01:01:50 +0200 | [diff] [blame] | 437 | "ec_nistp_64_gcc_128", |
Viktor Dukhovni | 6b01bed | 2016-01-18 13:10:21 -0500 | [diff] [blame] | 438 | "ecdh", |
| 439 | "ecdsa", |
Richard Levitte | b31feae | 2016-02-03 21:08:17 +0100 | [diff] [blame] | 440 | "egd", |
Richard Levitte | 8b527be | 2015-10-22 17:09:14 +0200 | [diff] [blame] | 441 | "engine", |
Rich Salz | 1288f26 | 2016-02-17 13:33:51 -0500 | [diff] [blame] | 442 | "err", |
Matt Caswell | ce2596d | 2016-10-12 16:21:13 +0100 | [diff] [blame] | 443 | "external-tests", |
David Woodhouse | 02f7114 | 2015-07-30 11:45:25 +0100 | [diff] [blame] | 444 | "filenames", |
Matt Caswell | e754551 | 2019-03-20 14:29:05 +0000 | [diff] [blame] | 445 | "fips", |
Shane Lontis | 7a810fa | 2020-09-04 17:55:28 +1000 | [diff] [blame] | 446 | "fips-securitychecks", |
Kurt Roeckx | f59d013 | 2016-05-07 22:09:13 +0200 | [diff] [blame] | 447 | "fuzz-afl", |
Dr. Matthias St. Pierre | afa0a13 | 2021-04-26 01:01:50 +0200 | [diff] [blame] | 448 | "fuzz-libfuzzer", |
Matt Caswell | 168c3b7 | 2016-03-21 15:04:08 +0000 | [diff] [blame] | 449 | "gost", |
Richard Levitte | 8b527be | 2015-10-22 17:09:14 +0200 | [diff] [blame] | 450 | "idea", |
Rich Salz | 742ccab | 2019-12-04 13:15:08 -0500 | [diff] [blame] | 451 | "ktls", |
Matt Caswell | d030892 | 2019-04-05 10:47:05 +0100 | [diff] [blame] | 452 | "legacy", |
Richard Levitte | 4b2981f | 2021-05-17 23:10:02 +0200 | [diff] [blame] | 453 | "loadereng", |
Richard Levitte | 09aa263 | 2016-03-09 01:14:29 +0100 | [diff] [blame] | 454 | "makedepend", |
Richard Levitte | 8b527be | 2015-10-22 17:09:14 +0200 | [diff] [blame] | 455 | "md2", |
| 456 | "md4", |
Richard Levitte | 8b527be | 2015-10-22 17:09:14 +0200 | [diff] [blame] | 457 | "mdc2", |
Richard Levitte | 34786bd | 2019-03-31 15:17:58 +0200 | [diff] [blame] | 458 | "module", |
Emilia Kasper | 29df306 | 2016-07-28 20:24:28 +0200 | [diff] [blame] | 459 | "msan", |
Matt Caswell | fa22f98 | 2016-03-07 23:26:32 +0000 | [diff] [blame] | 460 | "multiblock", |
Richard Levitte | 8b527be | 2015-10-22 17:09:14 +0200 | [diff] [blame] | 461 | "nextprotoneg", |
| 462 | "ocb", |
| 463 | "ocsp", |
Richard Levitte | 469ce8f | 2019-03-01 13:18:11 +0100 | [diff] [blame] | 464 | "padlockeng", |
Richard Levitte | ae48242 | 2016-02-22 02:09:11 +0100 | [diff] [blame] | 465 | "pic", |
Dr. Matthias St. Pierre | afa0a13 | 2021-04-26 01:01:50 +0200 | [diff] [blame] | 466 | "pinshared", |
Andy Polyakov | 48f1484 | 2015-12-09 23:02:11 +0100 | [diff] [blame] | 467 | "poly1305", |
Richard Levitte | 8b527be | 2015-10-22 17:09:14 +0200 | [diff] [blame] | 468 | "posix-io", |
| 469 | "psk", |
| 470 | "rc2", |
| 471 | "rc4", |
| 472 | "rc5", |
| 473 | "rdrand", |
| 474 | "rfc3779", |
Richard Levitte | 8b527be | 2015-10-22 17:09:14 +0200 | [diff] [blame] | 475 | "rmd160", |
Richard Levitte | 8b527be | 2015-10-22 17:09:14 +0200 | [diff] [blame] | 476 | "scrypt", |
Richard Levitte | 8b527be | 2015-10-22 17:09:14 +0200 | [diff] [blame] | 477 | "sctp", |
Rich Salz | 6943335 | 2020-02-05 14:28:37 -0500 | [diff] [blame] | 478 | "secure-memory", |
Richard Levitte | 8b527be | 2015-10-22 17:09:14 +0200 | [diff] [blame] | 479 | "seed", |
Richard Levitte | 8b527be | 2015-10-22 17:09:14 +0200 | [diff] [blame] | 480 | "shared", |
Todd Short | 3f5616d | 2017-01-11 16:38:44 -0500 | [diff] [blame] | 481 | "siphash", |
Todd Short | b1ceb43 | 2017-05-19 10:27:28 -0400 | [diff] [blame] | 482 | "siv", |
Matt Caswell | 1bf2cc2 | 2018-03-19 16:17:58 +0000 | [diff] [blame] | 483 | "sm2", |
Jack Lloyd | a0c3e4f | 2017-10-25 13:19:02 -0400 | [diff] [blame] | 484 | "sm3", |
Ronald Tse | f19a5ff | 2017-10-31 15:19:14 +1000 | [diff] [blame] | 485 | "sm4", |
Richard Levitte | 8b527be | 2015-10-22 17:09:14 +0200 | [diff] [blame] | 486 | "sock", |
| 487 | "srp", |
| 488 | "srtp", |
| 489 | "sse2", |
| 490 | "ssl", |
Richard Levitte | 8b527be | 2015-10-22 17:09:14 +0200 | [diff] [blame] | 491 | "ssl-trace", |
| 492 | "static-engine", |
| 493 | "stdio", |
Richard Levitte | 93880ce | 2016-08-30 06:02:50 +0200 | [diff] [blame] | 494 | "tests", |
Todd Short | a3e53d5 | 2021-09-08 16:23:04 -0400 | [diff] [blame] | 495 | "tfo", |
Richard Levitte | 8b527be | 2015-10-22 17:09:14 +0200 | [diff] [blame] | 496 | "threads", |
| 497 | "tls", |
Richard Levitte | 16a9d37 | 2018-12-12 21:31:36 +0100 | [diff] [blame] | 498 | "trace", |
Rich Salz | 1288f26 | 2016-02-17 13:33:51 -0500 | [diff] [blame] | 499 | "ts", |
Ben Laurie | c38bb72 | 2016-03-26 17:19:14 +0000 | [diff] [blame] | 500 | "ubsan", |
Richard Levitte | 48feace | 2017-07-01 12:14:37 +0200 | [diff] [blame] | 501 | "ui-console", |
Richard Levitte | 8b527be | 2015-10-22 17:09:14 +0200 | [diff] [blame] | 502 | "unit-test", |
MouriNaruto | 5ded1ca | 2019-05-12 05:10:58 +0800 | [diff] [blame] | 503 | "uplink", |
Matt Caswell | 8b1a5af | 2016-03-03 15:40:51 +0000 | [diff] [blame] | 504 | "weak-ssl-ciphers", |
Dr. Matthias St. Pierre | afa0a13 | 2021-04-26 01:01:50 +0200 | [diff] [blame] | 505 | "whirlpool", |
Richard Levitte | 8b527be | 2015-10-22 17:09:14 +0200 | [diff] [blame] | 506 | "zlib", |
| 507 | "zlib-dynamic", |
| 508 | ); |
Viktor Dukhovni | 6b01bed | 2016-01-18 13:10:21 -0500 | [diff] [blame] | 509 | foreach my $proto ((@tls, @dtls)) |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 510 | { |
| 511 | push(@disablables, $proto); |
| 512 | push(@disablables, "$proto-method") unless $proto eq "tls1_3"; |
| 513 | } |
Richard Levitte | 8b527be | 2015-10-22 17:09:14 +0200 | [diff] [blame] | 514 | |
Richard Levitte | 538f38d | 2019-05-08 05:28:47 +0200 | [diff] [blame] | 515 | # 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 |
| 519 | my @disablables_int = qw( |
| 520 | crmf |
| 521 | ); |
| 522 | |
Matt Caswell | 2b1343b | 2016-06-16 11:45:24 +0100 | [diff] [blame] | 523 | my %deprecated_disablables = ( |
| 524 | "ssl2" => undef, |
| 525 | "buf-freelists" => undef, |
Rich Salz | 1461138 | 2019-12-11 10:56:12 -0500 | [diff] [blame] | 526 | "crypto-mdebug-backtrace" => undef, |
Richard Levitte | 469ce8f | 2019-03-01 13:18:11 +0100 | [diff] [blame] | 527 | "hw" => "hw", # causes cascade, but no macro |
| 528 | "hw-padlock" => "padlockeng", |
Richard Levitte | 48feace | 2017-07-01 12:14:37 +0200 | [diff] [blame] | 529 | "ripemd" => "rmd160", |
| 530 | "ui" => "ui-console", |
Richard Levitte | 0b45d8e | 2019-04-01 17:37:16 +0200 | [diff] [blame] | 531 | "heartbeats" => undef, |
Richard Levitte | e80381e | 2016-02-22 10:42:53 +0100 | [diff] [blame] | 532 | ); |
| 533 | |
Daniel Bevenius | 094925d | 2018-03-31 18:29:12 -0400 | [diff] [blame] | 534 | # All of the following are disabled by default: |
Bodo Möller | c9a112f | 2005-02-22 10:29:51 +0000 | [diff] [blame] | 535 | |
Richard Levitte | 9e04edf | 2016-02-22 13:45:46 +0100 | [diff] [blame] | 536 | our %disabled = ( # "what" => "comment" |
Dr. Matthias St. Pierre | b2d8c7b | 2021-04-26 01:04:26 +0200 | [diff] [blame] | 537 | "fips" => "default", |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 538 | "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. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 546 | "fuzz-afl" => "default", |
Dr. Matthias St. Pierre | afa0a13 | 2021-04-26 01:01:50 +0200 | [diff] [blame] | 547 | "fuzz-libfuzzer" => "default", |
| 548 | "ktls" => "default", |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 549 | "md2" => "default", |
Emilia Kasper | 29df306 | 2016-07-28 20:24:28 +0200 | [diff] [blame] | 550 | "msan" => "default", |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 551 | "rc5" => "default", |
| 552 | "sctp" => "default", |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 553 | "ssl3" => "default", |
| 554 | "ssl3-method" => "default", |
Todd Short | a3e53d5 | 2021-09-08 16:23:04 -0400 | [diff] [blame] | 555 | "tfo" => "default", |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 556 | "trace" => "default", |
| 557 | "ubsan" => "default", |
| 558 | "unit-test" => "default", |
| 559 | "weak-ssl-ciphers" => "default", |
| 560 | "zlib" => "default", |
| 561 | "zlib-dynamic" => "default", |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 562 | ); |
Bodo Möller | c9a112f | 2005-02-22 10:29:51 +0000 | [diff] [blame] | 563 | |
Richard Levitte | c569e20 | 2015-05-18 11:03:47 +0200 | [diff] [blame] | 564 | # Note: => pair form used for aesthetics, not to truly make a hash table |
| 565 | my @disable_cascades = ( |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 566 | # "what" => [ "cascade", ... ] |
Richard Levitte | e3577ad | 2020-12-18 15:39:50 +0100 | [diff] [blame] | 567 | "bulk" => [ "shared", "dso", |
Dr. David von Oheimb | 06f81af | 2020-12-01 17:15:45 +0100 | [diff] [blame] | 568 | "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-Bell | 726f92e | 2021-06-08 16:45:38 -0500 | [diff] [blame] | 580 | "srtp", "ssl3-method", "ssl-trace", |
Todd Short | a3e53d5 | 2021-09-08 16:23:04 -0400 | [diff] [blame] | 581 | "tfo", |
Dr. David von Oheimb | 06f81af | 2020-12-01 17:15:45 +0100 | [diff] [blame] | 582 | "ts", "ui-console", "whirlpool", |
| 583 | "fips-securitychecks" ], |
Richard Levitte | 7d130f6 | 2015-05-19 01:40:54 +0200 | [diff] [blame] | 584 | sub { $config{processor} eq "386" } |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 585 | => [ "sse2" ], |
| 586 | "ssl" => [ "ssl3" ], |
| 587 | "ssl3-method" => [ "ssl3" ], |
| 588 | "zlib" => [ "zlib-dynamic" ], |
| 589 | "des" => [ "mdc2" ], |
Dr. David von Oheimb | 06f81af | 2020-12-01 17:15:45 +0100 | [diff] [blame] | 590 | "ec" => [ "ec2m", "ecdsa", "ecdh", "sm2", "gost" ], |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 591 | "dgram" => [ "dtls", "sctp" ], |
Todd Short | a3e53d5 | 2021-09-08 16:23:04 -0400 | [diff] [blame] | 592 | "sock" => [ "dgram", "tfo" ], |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 593 | "dtls" => [ @dtls ], |
Richard Levitte | 343a746 | 2017-02-17 20:48:28 +0100 | [diff] [blame] | 594 | sub { 0 == scalar grep { !$disabled{$_} } @dtls } |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 595 | => [ "dtls" ], |
Richard Levitte | c569e20 | 2015-05-18 11:03:47 +0200 | [diff] [blame] | 596 | |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 597 | "tls" => [ @tls ], |
Richard Levitte | 343a746 | 2017-02-17 20:48:28 +0100 | [diff] [blame] | 598 | sub { 0 == scalar grep { !$disabled{$_} } @tls } |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 599 | => [ "tls" ], |
Richard Levitte | c569e20 | 2015-05-18 11:03:47 +0200 | [diff] [blame] | 600 | |
Richard Levitte | ef8ca6b | 2016-02-14 12:16:52 +0100 | [diff] [blame] | 601 | "crypto-mdebug" => [ "crypto-mdebug-backtrace" ], |
Richard Levitte | 343ec2b | 2016-02-19 22:08:37 +0100 | [diff] [blame] | 602 | |
Richard Levitte | 34786bd | 2019-03-31 15:17:58 +0200 | [diff] [blame] | 603 | # 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 Apostolou | e304aa8 | 2022-01-03 01:00:27 +0200 | [diff] [blame] | 609 | # those *have* to be exactly the same as the ones accessed from the app, |
Richard Levitte | 34786bd | 2019-03-31 15:17:58 +0200 | [diff] [blame] | 610 | # 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) |
MouriNaruto | 5ded1ca | 2019-05-12 05:10:58 +0800 | [diff] [blame] | 613 | "shared" => [ "dynamic-engine", "uplink" ], |
Bernd Edlinger | 3b2f8c7 | 2019-09-13 10:45:29 +0200 | [diff] [blame] | 614 | "dso" => [ "dynamic-engine", "module" ], |
Richard Levitte | 34786bd | 2019-03-31 15:17:58 +0200 | [diff] [blame] | 615 | # 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 Levitte | 469ce8f | 2019-03-01 13:18:11 +0100 | [diff] [blame] | 621 | |
Richard Levitte | e1f5a92 | 2020-09-29 10:31:56 +0200 | [diff] [blame] | 622 | "module" => [ "fips", "dso" ], |
Matt Caswell | e754551 | 2019-03-20 14:29:05 +0000 | [diff] [blame] | 623 | |
Matt Caswell | b8fa02e | 2020-11-24 16:45:48 +0000 | [diff] [blame] | 624 | "engine" => [ "dynamic-engine", grep(/eng$/, @disablables) ], |
Richard Levitte | 86ff7cf | 2021-06-22 12:10:21 +0200 | [diff] [blame] | 625 | "dynamic-engine" => [ "loadereng" ], |
Richard Levitte | 469ce8f | 2019-03-01 13:18:11 +0100 | [diff] [blame] | 626 | "hw" => [ "padlockeng" ], |
Matt Caswell | d90a6be | 2016-04-14 13:44:15 +0100 | [diff] [blame] | 627 | |
| 628 | # no-autoalginit is only useful when building non-shared |
Pauli | 9c11e8e | 2021-04-22 16:43:13 +1000 | [diff] [blame] | 629 | "autoalginit" => [ "shared", "apps", "fips" ], |
Matt Caswell | d90a6be | 2016-04-14 13:44:15 +0100 | [diff] [blame] | 630 | |
Richard Levitte | 15a1bd0 | 2017-09-12 07:47:05 +0200 | [diff] [blame] | 631 | "stdio" => [ "apps", "capieng", "egd" ], |
Matt Caswell | d90a6be | 2016-04-14 13:44:15 +0100 | [diff] [blame] | 632 | "apps" => [ "tests" ], |
Richard Levitte | 302eba3 | 2017-08-28 15:41:49 +0200 | [diff] [blame] | 633 | "tests" => [ "external-tests" ], |
Matt Caswell | 3cf96e8 | 2016-12-28 15:32:39 +0000 | [diff] [blame] | 634 | "comp" => [ "zlib" ], |
Todd Short | 9802002 | 2018-03-19 13:21:13 -0400 | [diff] [blame] | 635 | "sm3" => [ "sm2" ], |
Richard Levitte | b612799 | 2016-11-15 14:53:33 +0100 | [diff] [blame] | 636 | sub { !$disabled{"unit-test"} } => [ "heartbeats" ], |
Emilia Kasper | 29df306 | 2016-07-28 20:24:28 +0200 | [diff] [blame] | 637 | |
| 638 | sub { !$disabled{"msan"} } => [ "asm" ], |
Todd Short | b1ceb43 | 2017-05-19 10:27:28 -0400 | [diff] [blame] | 639 | |
Matt Caswell | 6d2a1ef | 2021-02-05 11:28:15 +0000 | [diff] [blame] | 640 | "cmac" => [ "siv" ], |
| 641 | "legacy" => [ "md2" ], |
Richard Levitte | 538f38d | 2019-05-08 05:28:47 +0200 | [diff] [blame] | 642 | |
| 643 | "cmp" => [ "crmf" ], |
Matt Caswell | c72fa25 | 2019-12-05 17:09:49 +0000 | [diff] [blame] | 644 | |
Pauli | c3c00c7 | 2021-07-16 10:31:41 +1000 | [diff] [blame] | 645 | "fips" => [ "fips-securitychecks", "acvp-tests" ], |
Randall S. Becker | ccdfcf0 | 2021-03-22 08:31:01 -0500 | [diff] [blame] | 646 | |
Matt Caswell | 6d2a1ef | 2021-02-05 11:28:15 +0000 | [diff] [blame] | 647 | "deprecated-3.0" => [ "engine", "srp" ] |
Richard Levitte | c569e20 | 2015-05-18 11:03:47 +0200 | [diff] [blame] | 648 | ); |
| 649 | |
| 650 | # Avoid protocol support holes. Also disable all versions below N, if version |
| 651 | # N is disabled while N+1 is enabled. |
| 652 | # |
| 653 | my @list = (reverse @tls); |
| 654 | while ((my $first, my $second) = (shift @list, shift @list)) { |
| 655 | last unless @list; |
| 656 | push @disable_cascades, ( sub { !$disabled{$first} && $disabled{$second} } |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 657 | => [ @list ] ); |
Richard Levitte | c569e20 | 2015-05-18 11:03:47 +0200 | [diff] [blame] | 658 | unshift @list, $second; |
| 659 | } |
| 660 | my @list = (reverse @dtls); |
| 661 | while ((my $first, my $second) = (shift @list, shift @list)) { |
| 662 | last unless @list; |
| 663 | push @disable_cascades, ( sub { !$disabled{$first} && $disabled{$second} } |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 664 | => [ @list ] ); |
Richard Levitte | c569e20 | 2015-05-18 11:03:47 +0200 | [diff] [blame] | 665 | unshift @list, $second; |
| 666 | } |
| 667 | |
Bodo Möller | 7a76219 | 2008-12-02 01:21:39 +0000 | [diff] [blame] | 668 | # Explicit "no-..." options will be collected in %disabled along with the defaults. |
Rich Salz | e4ef2e2 | 2016-02-10 11:10:39 -0500 | [diff] [blame] | 669 | # To remove something from %disabled, use "enable-foo". |
Bodo Möller | 7a76219 | 2008-12-02 01:21:39 +0000 | [diff] [blame] | 670 | # For symmetry, "disable-foo" is a synonym for "no-foo". |
| 671 | |
Richard Levitte | bbe486c | 2020-01-09 14:49:53 +0100 | [diff] [blame] | 672 | # For the "make variables" CPPINCLUDES and CPPDEFINES, we support lists with |
Richard Levitte | 5b18235 | 2018-01-26 19:56:44 +0100 | [diff] [blame] | 673 | # 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. |
| 677 | my $list_separator_re = |
| 678 | { VMS => qr/(?<!\^),/, |
| 679 | MSWin32 => qr/(?<!\\);/ } -> {$^O} // qr/(?<!\\)[:\s]/; |
| 680 | # All the "make variables" we support |
Richard Levitte | f584617 | 2018-03-16 08:59:03 +0100 | [diff] [blame] | 681 | # Some get pre-populated for the sake of backward compatibility |
| 682 | # (we supported those before the change to "make variable" support. |
Richard Levitte | 5b18235 | 2018-01-26 19:56:44 +0100 | [diff] [blame] | 683 | my %user = ( |
Richard Levitte | f584617 | 2018-03-16 08:59:03 +0100 | [diff] [blame] | 684 | AR => env('AR'), |
Richard Levitte | 5b18235 | 2018-01-26 19:56:44 +0100 | [diff] [blame] | 685 | ARFLAGS => [], |
| 686 | AS => undef, |
| 687 | ASFLAGS => [], |
Richard Levitte | f584617 | 2018-03-16 08:59:03 +0100 | [diff] [blame] | 688 | CC => env('CC'), |
Richard Levitte | 8e7984e | 2019-02-26 23:18:02 +0100 | [diff] [blame] | 689 | CFLAGS => [ env('CFLAGS') || () ], |
Richard Levitte | f584617 | 2018-03-16 08:59:03 +0100 | [diff] [blame] | 690 | CXX => env('CXX'), |
Richard Levitte | 8e7984e | 2019-02-26 23:18:02 +0100 | [diff] [blame] | 691 | CXXFLAGS => [ env('CXXFLAGS') || () ], |
Richard Levitte | 5b18235 | 2018-01-26 19:56:44 +0100 | [diff] [blame] | 692 | CPP => undef, |
Richard Levitte | 8e7984e | 2019-02-26 23:18:02 +0100 | [diff] [blame] | 693 | CPPFLAGS => [ env('CPPFLAGS') || () ], # -D, -I, -Wp, |
Richard Levitte | 5b18235 | 2018-01-26 19:56:44 +0100 | [diff] [blame] | 694 | CPPDEFINES => [], # Alternative for -D |
| 695 | CPPINCLUDES => [], # Alternative for -I |
Richard Levitte | f584617 | 2018-03-16 08:59:03 +0100 | [diff] [blame] | 696 | CROSS_COMPILE => env('CROSS_COMPILE'), |
| 697 | HASHBANGPERL=> env('HASHBANGPERL') || env('PERL'), |
Richard Levitte | 5b18235 | 2018-01-26 19:56:44 +0100 | [diff] [blame] | 698 | LD => undef, |
Richard Levitte | 8e7984e | 2019-02-26 23:18:02 +0100 | [diff] [blame] | 699 | LDFLAGS => [ env('LDFLAGS') || () ], # -L, -Wl, |
| 700 | LDLIBS => [ env('LDLIBS') || () ], # -l |
Richard Levitte | 5b18235 | 2018-01-26 19:56:44 +0100 | [diff] [blame] | 701 | MT => undef, |
| 702 | MTFLAGS => [], |
Richard Levitte | 9e26532 | 2018-07-08 12:00:06 +0200 | [diff] [blame] | 703 | PERL => env('PERL') || ($^O ne "VMS" ? $^X : "perl"), |
Richard Levitte | f584617 | 2018-03-16 08:59:03 +0100 | [diff] [blame] | 704 | RANLIB => env('RANLIB'), |
| 705 | RC => env('RC') || env('WINDRES'), |
Wojciech Kaluza | 0c4e984 | 2019-04-21 12:39:20 +0100 | [diff] [blame] | 706 | RCFLAGS => [ env('RCFLAGS') || () ], |
Richard Levitte | 5b18235 | 2018-01-26 19:56:44 +0100 | [diff] [blame] | 707 | RM => undef, |
| 708 | ); |
Richard Levitte | f729ba5 | 2018-02-02 12:27:29 +0100 | [diff] [blame] | 709 | # 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. |
| 711 | my @user_crossable = qw ( AR AS CC CXX CPP LD MT RANLIB RC ); |
Richard Levitte | 5b18235 | 2018-01-26 19:56:44 +0100 | [diff] [blame] | 712 | # 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 |
| 715 | my %useradd = ( |
| 716 | CPPDEFINES => [], |
| 717 | CPPINCLUDES => [], |
| 718 | CPPFLAGS => [], |
| 719 | CFLAGS => [], |
| 720 | CXXFLAGS => [], |
| 721 | LDFLAGS => [], |
| 722 | LDLIBS => [], |
Wojciech Kaluza | 0c4e984 | 2019-04-21 12:39:20 +0100 | [diff] [blame] | 723 | RCFLAGS => [], |
Richard Levitte | 5b18235 | 2018-01-26 19:56:44 +0100 | [diff] [blame] | 724 | ); |
| 725 | |
| 726 | my %user_synonyms = ( |
| 727 | HASHBANGPERL=> 'PERL', |
| 728 | RC => 'WINDRES', |
| 729 | ); |
Richard Levitte | abe256e | 2018-03-06 20:35:30 +0100 | [diff] [blame] | 730 | |
| 731 | # Some target attributes have been renamed, this is the translation table |
| 732 | my %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 Levitte | 5b18235 | 2018-01-26 19:56:44 +0100 | [diff] [blame] | 744 | ); |
Richard Levitte | 5b18235 | 2018-01-26 19:56:44 +0100 | [diff] [blame] | 745 | |
Richard Levitte | 2ab92ae | 2018-03-07 22:44:59 +0100 | [diff] [blame] | 746 | # Initialisers coming from 'config' scripts |
Andy Polyakov | ff455d9 | 2018-03-28 10:06:32 +0200 | [diff] [blame] | 747 | $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 Levitte | 2ab92ae | 2018-03-07 22:44:59 +0100 | [diff] [blame] | 754 | |
Richard Levitte | 7d130f6 | 2015-05-19 01:40:54 +0200 | [diff] [blame] | 755 | $config{openssl_api_defines}=[]; |
Richard Levitte | 7d130f6 | 2015-05-19 01:40:54 +0200 | [diff] [blame] | 756 | $config{openssl_sys_defines}=[]; |
Richard Levitte | e0bf7c0 | 2018-11-03 18:34:09 +0100 | [diff] [blame] | 757 | $config{openssl_feature_defines}=[]; |
Richard Levitte | 3fa04f0 | 2016-01-12 00:17:12 +0100 | [diff] [blame] | 758 | $config{options}=""; |
Richard Levitte | 8864f0d | 2016-03-02 19:13:26 +0100 | [diff] [blame] | 759 | $config{build_type} = "release"; |
Richard Levitte | 5b18235 | 2018-01-26 19:56:44 +0100 | [diff] [blame] | 760 | my $target=""; |
Richard Levitte | c59cb51 | 2000-08-17 10:23:45 +0000 | [diff] [blame] | 761 | |
Richard Levitte | ac6ae8a | 2018-03-16 08:24:50 +0100 | [diff] [blame] | 762 | my %cmdvars = (); # Stores FOO='blah' type arguments |
Richard Levitte | fe05264 | 2015-05-18 03:33:55 +0200 | [diff] [blame] | 763 | my %unsupported_options = (); |
Richard Levitte | e80381e | 2016-02-22 10:42:53 +0100 | [diff] [blame] | 764 | my %deprecated_options = (); |
Rich Salz | 8389ec4 | 2017-07-18 09:39:21 -0400 | [diff] [blame] | 765 | # If you change this, update apps/version.c |
| 766 | my @known_seed_sources = qw(getrandom devrandom os egd none rdcpu librandom); |
| 767 | my @seed_sources = (); |
Richard Levitte | fad599f | 2016-10-12 17:05:35 +0200 | [diff] [blame] | 768 | while (@argvcopy) |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 769 | { |
| 770 | $_ = shift @argvcopy; |
Richard Levitte | 89bea08 | 2017-11-29 13:16:53 +0100 | [diff] [blame] | 771 | |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 772 | # 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 Levitte | 89bea08 | 2017-11-29 13:16:53 +0100 | [diff] [blame] | 788 | |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 789 | # 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 Polyakov | 6d5e74f | 2018-03-14 09:42:42 +0100 | [diff] [blame] | 796 | |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 797 | # some people just can't read the instructions, clang people have to... |
| 798 | s/^-no-(?!integrated-as)/no-/; |
Richard Levitte | c59cb51 | 2000-08-17 10:23:45 +0000 | [diff] [blame] | 799 | |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 800 | # 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 Caswell | cc9f9b9 | 2021-05-19 11:46:00 +0100 | [diff] [blame] | 806 | s /^fips$/enable-fips/; |
Richard Levitte | c59cb51 | 2000-08-17 10:23:45 +0000 | [diff] [blame] | 807 | |
Rich Salz | e4ef2e2 | 2016-02-10 11:10:39 -0500 | [diff] [blame] | 808 | if (/^(no|disable|enable)-(.+)$/) |
Matt Caswell | 2b1343b | 2016-06-16 11:45:24 +0100 | [diff] [blame] | 809 | { |
| 810 | my $word = $2; |
Richard Levitte | 469ce8f | 2019-03-01 13:18:11 +0100 | [diff] [blame] | 811 | if ($word !~ m|hw(?:-.+)| # special treatment for hw regexp opt |
| 812 | && !exists $deprecated_disablables{$word} |
| 813 | && !grep { $word eq $_ } @disablables) |
Matt Caswell | 2b1343b | 2016-06-16 11:45:24 +0100 | [diff] [blame] | 814 | { |
| 815 | $unsupported_options{$_} = 1; |
| 816 | next; |
| 817 | } |
| 818 | } |
| 819 | if (/^no-(.+)$/ || /^disable-(.+)$/) |
| 820 | { |
Rich Salz | e4ef2e2 | 2016-02-10 11:10:39 -0500 | [diff] [blame] | 821 | 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 Roeckx | c5c7700 | 2016-03-28 00:31:23 +0200 | [diff] [blame] | 835 | $disabled{"dtls"} = "option(dtls)"; |
Rich Salz | e4ef2e2 | 2016-02-10 11:10:39 -0500 | [diff] [blame] | 836 | } |
| 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 Levitte | 343ec2b | 2016-02-19 22:08:37 +0100 | [diff] [blame] | 851 | elsif ($1 eq "static-engine") |
| 852 | { |
Richard Levitte | 19ab579 | 2016-02-22 02:06:05 +0100 | [diff] [blame] | 853 | delete $disabled{"dynamic-engine"}; |
Richard Levitte | 343ec2b | 2016-02-19 22:08:37 +0100 | [diff] [blame] | 854 | } |
| 855 | elsif ($1 eq "dynamic-engine") |
| 856 | { |
Richard Levitte | 19ab579 | 2016-02-22 02:06:05 +0100 | [diff] [blame] | 857 | $disabled{"dynamic-engine"} = "option"; |
Richard Levitte | 343ec2b | 2016-02-19 22:08:37 +0100 | [diff] [blame] | 858 | } |
Matt Caswell | 2b1343b | 2016-06-16 11:45:24 +0100 | [diff] [blame] | 859 | 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 Levitte | 469ce8f | 2019-03-01 13:18:11 +0100 | [diff] [blame] | 867 | elsif ($1 =~ m|hw(?:-.+)|) # deprecate hw options in regexp form |
| 868 | { |
| 869 | $deprecated_options{$_} = 1; |
| 870 | } |
Rich Salz | e4ef2e2 | 2016-02-10 11:10:39 -0500 | [diff] [blame] | 871 | else |
| 872 | { |
| 873 | $disabled{$1} = "option"; |
| 874 | } |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 875 | # No longer an automatic choice |
| 876 | $auto_threads = 0 if ($1 eq "threads"); |
| 877 | } |
| 878 | elsif (/^enable-(.+)$/) |
| 879 | { |
Richard Levitte | 343ec2b | 2016-02-19 22:08:37 +0100 | [diff] [blame] | 880 | if ($1 eq "static-engine") |
| 881 | { |
Richard Levitte | 19ab579 | 2016-02-22 02:06:05 +0100 | [diff] [blame] | 882 | $disabled{"dynamic-engine"} = "option"; |
Richard Levitte | 343ec2b | 2016-02-19 22:08:37 +0100 | [diff] [blame] | 883 | } |
| 884 | elsif ($1 eq "dynamic-engine") |
| 885 | { |
Richard Levitte | 19ab579 | 2016-02-22 02:06:05 +0100 | [diff] [blame] | 886 | delete $disabled{"dynamic-engine"}; |
Richard Levitte | 343ec2b | 2016-02-19 22:08:37 +0100 | [diff] [blame] | 887 | } |
Richard Levitte | 25004db | 2016-03-03 10:07:29 +0100 | [diff] [blame] | 888 | elsif ($1 eq "zlib-dynamic") |
| 889 | { |
| 890 | delete $disabled{"zlib"}; |
| 891 | } |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 892 | my $algo = $1; |
| 893 | delete $disabled{$algo}; |
Richard Levitte | fe05264 | 2015-05-18 03:33:55 +0200 | [diff] [blame] | 894 | |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 895 | # No longer an automatic choice |
| 896 | $auto_threads = 0 if ($1 eq "threads"); |
| 897 | } |
Richard Levitte | 1806261 | 2020-03-03 15:04:42 +0100 | [diff] [blame] | 898 | 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 Salz | ecb09ba | 2021-08-17 11:42:21 -0400 | [diff] [blame] | 906 | elsif (/^-w$/) |
Richard Levitte | 1806261 | 2020-03-03 15:04:42 +0100 | [diff] [blame] | 907 | { |
| 908 | $guess_opts{nowait} = 1; |
| 909 | } |
| 910 | elsif (/^-t$/) # From older 'config' |
| 911 | { |
| 912 | $dryrun = 1; |
| 913 | } |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 914 | 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. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 919 | $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. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 931 | 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. Pierre | f246f54 | 2019-09-21 00:14:16 +0200 | [diff] [blame] | 937 | elsif (m|^[-+/]|) |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 938 | { |
| 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 Salz | 8389ec4 | 2017-07-18 09:39:21 -0400 | [diff] [blame] | 944 | } |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 945 | elsif (/^--api=(.*)$/) |
| 946 | { |
Richard Levitte | a6a4d0a | 2019-11-05 17:00:33 +0100 | [diff] [blame] | 947 | my $api = $1; |
| 948 | die "Unknown API compatibility level $api" |
| 949 | unless defined $apitable->{$api}; |
| 950 | $config{api}=$apitable->{$api}; |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 951 | } |
| 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 Salz | 3121425 | 2020-06-29 12:20:41 +1000 | [diff] [blame] | 985 | 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 Salz | d0364dc | 2021-05-12 10:42:46 -0400 | [diff] [blame] | 995 | elsif (/^--banner=(.*)$/) |
| 996 | { |
| 997 | $banner = $1 . "\n"; |
| 998 | } |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 999 | 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. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 1030 | } |
Dr. Matthias St. Pierre | f246f54 | 2019-09-21 00:14:16 +0200 | [diff] [blame] | 1031 | elsif (m|^[-/]D(.*)$|) |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 1032 | { |
| 1033 | push @{$useradd{CPPDEFINES}}, $1; |
| 1034 | } |
Dr. Matthias St. Pierre | f246f54 | 2019-09-21 00:14:16 +0200 | [diff] [blame] | 1035 | elsif (m|^[-/]I(.*)$|) |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 1036 | { |
| 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. Pierre | f246f54 | 2019-09-21 00:14:16 +0200 | [diff] [blame] | 1045 | # 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. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 1048 | $_ =~ s/%([0-9a-f]{1,2})/chr(hex($1))/gei; |
| 1049 | push @{$useradd{CFLAGS}}, $_; |
| 1050 | push @{$useradd{CXXFLAGS}}, $_; |
| 1051 | } |
| 1052 | } |
Dr. Matthias St. Pierre | f246f54 | 2019-09-21 00:14:16 +0200 | [diff] [blame] | 1053 | 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. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 1062 | 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 Levitte | fe05264 | 2015-05-18 03:33:55 +0200 | [diff] [blame] | 1073 | |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 1074 | if ($config{options} eq "") |
| 1075 | { $config{options} = $_; } |
| 1076 | else |
| 1077 | { $config{options} .= " ".$_; } |
| 1078 | } |
| 1079 | } |
Richard Levitte | 489eb74 | 2015-10-22 17:33:47 +0200 | [diff] [blame] | 1080 | |
Richard Levitte | ddbe700 | 2018-07-22 10:56:25 +0200 | [diff] [blame] | 1081 | if (keys %deprecated_options) |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 1082 | { |
| 1083 | warn "***** Deprecated options: ", |
| 1084 | join(", ", keys %deprecated_options), "\n"; |
| 1085 | } |
Richard Levitte | ddbe700 | 2018-07-22 10:56:25 +0200 | [diff] [blame] | 1086 | if (keys %unsupported_options) |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 1087 | { |
| 1088 | die "***** Unsupported options: ", |
| 1089 | join(", ", keys %unsupported_options), "\n"; |
| 1090 | } |
Richard Levitte | b6e4dac | 2001-11-27 11:48:30 +0000 | [diff] [blame] | 1091 | |
Richard Levitte | ac6ae8a | 2018-03-16 08:24:50 +0100 | [diff] [blame] | 1092 | # 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 Levitte | fb174fa | 2018-03-08 18:49:37 +0100 | [diff] [blame] | 1094 | # is set. |
Richard Levitte | b920136 | 2018-03-08 14:16:18 +0100 | [diff] [blame] | 1095 | if (grep { scalar @$_ > 0 } values %useradd) { |
Richard Levitte | fb174fa | 2018-03-08 18:49:37 +0100 | [diff] [blame] | 1096 | # Hash of env / make variables names. The possible values are: |
Richard Levitte | ac6ae8a | 2018-03-16 08:24:50 +0100 | [diff] [blame] | 1097 | # 1 - "make vars" |
Richard Levitte | fb174fa | 2018-03-08 18:49:37 +0100 | [diff] [blame] | 1098 | # 2 - %useradd entry set |
| 1099 | # 3 - both set |
Richard Levitte | ac6ae8a | 2018-03-16 08:24:50 +0100 | [diff] [blame] | 1100 | my %detected_vars = |
Richard Levitte | fb174fa | 2018-03-08 18:49:37 +0100 | [diff] [blame] | 1101 | map { my $v = 0; |
Richard Levitte | ac6ae8a | 2018-03-16 08:24:50 +0100 | [diff] [blame] | 1102 | $v += 1 if $cmdvars{$_}; |
Richard Levitte | fb174fa | 2018-03-08 18:49:37 +0100 | [diff] [blame] | 1103 | $v += 2 if @{$useradd{$_}}; |
| 1104 | $_ => $v } |
| 1105 | keys %useradd; |
| 1106 | |
Richard Levitte | ac6ae8a | 2018-03-16 08:24:50 +0100 | [diff] [blame] | 1107 | # 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 Levitte | b920136 | 2018-03-08 14:16:18 +0100 | [diff] [blame] | 1111 | die <<"_____"; |
Richard Levitte | ac6ae8a | 2018-03-16 08:24:50 +0100 | [diff] [blame] | 1112 | ***** Mixing make variables and additional compiler/linker flags as |
Richard Levitte | b920136 | 2018-03-08 14:16:18 +0100 | [diff] [blame] | 1113 | ***** configure command line option is not permitted. |
Richard Levitte | ac6ae8a | 2018-03-16 08:24:50 +0100 | [diff] [blame] | 1114 | ***** Affected make variables: $names |
Richard Levitte | b920136 | 2018-03-08 14:16:18 +0100 | [diff] [blame] | 1115 | _____ |
| 1116 | } |
| 1117 | } |
| 1118 | |
Richard Levitte | ac6ae8a | 2018-03-16 08:24:50 +0100 | [diff] [blame] | 1119 | # 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. |
| 1123 | my $anyuseradd = |
| 1124 | grep { defined $_ && (ref $_ ne 'ARRAY' || @$_) } values %useradd; |
Richard Levitte | 5b18235 | 2018-01-26 19:56:44 +0100 | [diff] [blame] | 1125 | foreach (keys %user) { |
Richard Levitte | ac6ae8a | 2018-03-16 08:24:50 +0100 | [diff] [blame] | 1126 | 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 Levitte | 5b18235 | 2018-01-26 19:56:44 +0100 | [diff] [blame] | 1132 | |
| 1133 | if (defined $value) { |
| 1134 | if (ref $user{$_} eq 'ARRAY') { |
Richard Levitte | bbe486c | 2020-01-09 14:49:53 +0100 | [diff] [blame] | 1135 | if ($_ eq 'CPPDEFINES' || $_ eq 'CPPINCLUDES') { |
| 1136 | $user{$_} = [ split /$list_separator_re/, $value ]; |
| 1137 | } else { |
| 1138 | $user{$_} = [ $value ]; |
| 1139 | } |
Richard Levitte | 5b18235 | 2018-01-26 19:56:44 +0100 | [diff] [blame] | 1140 | } elsif (!defined $user{$_}) { |
| 1141 | $user{$_} = $value; |
| 1142 | } |
| 1143 | } |
| 1144 | } |
| 1145 | |
Andy Polyakov | 07e4dc3 | 2018-06-18 19:08:50 +0200 | [diff] [blame] | 1146 | if (grep { /-rpath\b/ } ($user{LDFLAGS} ? @{$user{LDFLAGS}} : ()) |
Richard Levitte | 342a1a2 | 2016-09-07 20:56:20 +0200 | [diff] [blame] | 1147 | && !$disabled{shared} |
| 1148 | && !($disabled{asan} && $disabled{msan} && $disabled{ubsan})) { |
| 1149 | die "***** Cannot simultaneously use -rpath, shared libraries, and\n", |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 1150 | "***** any of asan, msan or ubsan\n"; |
Richard Levitte | 342a1a2 | 2016-09-07 20:56:20 +0200 | [diff] [blame] | 1151 | } |
| 1152 | |
Richard Levitte | e39795a | 2020-03-03 00:01:35 +0100 | [diff] [blame] | 1153 | # If no target was given, try guessing. |
| 1154 | unless ($target) { |
Richard Levitte | 1806261 | 2020-03-03 15:04:42 +0100 | [diff] [blame] | 1155 | my %system_config = OpenSSL::config::get_platform(%guess_opts, %user); |
Richard Levitte | e39795a | 2020-03-03 00:01:35 +0100 | [diff] [blame] | 1156 | |
| 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 Levitte | 71ef78d | 2019-04-23 09:41:19 +0200 | [diff] [blame] | 1170 | sub 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. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 1188 | } |
| 1189 | } |
Richard Levitte | 71ef78d | 2019-04-23 09:41:19 +0200 | [diff] [blame] | 1190 | @tocheckfor = (keys %new_tocheckfor); |
Richard Levitte | c569e20 | 2015-05-18 11:03:47 +0200 | [diff] [blame] | 1191 | } |
Richard Levitte | c569e20 | 2015-05-18 11:03:47 +0200 | [diff] [blame] | 1192 | } |
Richard Levitte | 71ef78d | 2019-04-23 09:41:19 +0200 | [diff] [blame] | 1193 | disable(); # First cascade run |
Ben Laurie | edc032b | 2011-03-12 17:01:19 +0000 | [diff] [blame] | 1194 | |
Richard Levitte | d63c12c | 2016-08-31 19:47:35 +0200 | [diff] [blame] | 1195 | our $die = sub { die @_; }; |
Bodo Möller | 436a376 | 1999-05-28 23:18:51 +0000 | [diff] [blame] | 1196 | if ($target eq "TABLE") { |
Richard Levitte | d63c12c | 2016-08-31 19:47:35 +0200 | [diff] [blame] | 1197 | local $die = sub { warn @_; }; |
Richard Levitte | 00ae96c | 2015-05-18 12:53:38 +0200 | [diff] [blame] | 1198 | foreach (sort keys %table) { |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 1199 | print_table_entry($_, "TABLE"); |
Richard Levitte | 00ae96c | 2015-05-18 12:53:38 +0200 | [diff] [blame] | 1200 | } |
| 1201 | exit 0; |
Bodo Möller | 436a376 | 1999-05-28 23:18:51 +0000 | [diff] [blame] | 1202 | } |
| 1203 | |
Ulf Möller | 10a926c | 2000-02-21 00:55:45 +0000 | [diff] [blame] | 1204 | if ($target eq "LIST") { |
Richard Levitte | 00ae96c | 2015-05-18 12:53:38 +0200 | [diff] [blame] | 1205 | foreach (sort keys %table) { |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 1206 | print $_,"\n" unless $table{$_}->{template}; |
Richard Levitte | 00ae96c | 2015-05-18 12:53:38 +0200 | [diff] [blame] | 1207 | } |
| 1208 | exit 0; |
Ulf Möller | 10a926c | 2000-02-21 00:55:45 +0000 | [diff] [blame] | 1209 | } |
| 1210 | |
Richard Levitte | aaf878c | 2015-03-06 02:00:21 +0100 | [diff] [blame] | 1211 | if ($target eq "HASH") { |
Richard Levitte | d63c12c | 2016-08-31 19:47:35 +0200 | [diff] [blame] | 1212 | local $die = sub { warn @_; }; |
Richard Levitte | 00ae96c | 2015-05-18 12:53:38 +0200 | [diff] [blame] | 1213 | print "%table = (\n"; |
| 1214 | foreach (sort keys %table) { |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 1215 | print_table_entry($_, "HASH"); |
Richard Levitte | 00ae96c | 2015-05-18 12:53:38 +0200 | [diff] [blame] | 1216 | } |
| 1217 | exit 0; |
Richard Levitte | aaf878c | 2015-03-06 02:00:21 +0100 | [diff] [blame] | 1218 | } |
| 1219 | |
Dr. Matthias St. Pierre | 16942e0 | 2018-12-07 00:32:43 +0100 | [diff] [blame] | 1220 | print "Configuring OpenSSL version $config{full_version} "; |
| 1221 | print "for target $target\n"; |
Richard Levitte | 6411927 | 2016-10-03 17:39:11 +0200 | [diff] [blame] | 1222 | |
Richard Levitte | 51cf8e0 | 2018-02-15 18:08:54 +0100 | [diff] [blame] | 1223 | if (scalar(@seed_sources) == 0) { |
| 1224 | print "Using os-specific seed configuration\n"; |
| 1225 | push @seed_sources, 'os'; |
| 1226 | } |
Bernd Edlinger | ddec332 | 2020-05-17 02:08:56 +0200 | [diff] [blame] | 1227 | if (scalar(grep { $_ eq 'egd' } @seed_sources) > 0) { |
| 1228 | delete $disabled{'egd'}; |
| 1229 | } |
Richard Levitte | 2805ee1 | 2018-08-16 16:01:58 +0200 | [diff] [blame] | 1230 | if (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 Levitte | 2805ee1 | 2018-08-16 16:01:58 +0200 | [diff] [blame] | 1233 | |
Dr. Matthias St. Pierre | caa8595 | 2018-10-28 12:38:49 +0100 | [diff] [blame] | 1234 | ============================== WARNING =============================== |
| 1235 | You have selected the --with-rand-seed=none option, which effectively |
| 1236 | disables automatic reseeding of the OpenSSL random generator. |
| 1237 | All operations depending on the random generator such as creating keys |
| 1238 | will not work unless the random generator is seeded manually by the |
| 1239 | application. |
| 1240 | |
| 1241 | Please read the 'Note on random number generation' section in the |
Richard Levitte | f828ba0 | 2020-04-27 09:08:36 +0200 | [diff] [blame] | 1242 | INSTALL.md instructions and the RAND_DRBG(7) manual page for more |
| 1243 | details. |
Dr. Matthias St. Pierre | caa8595 | 2018-10-28 12:38:49 +0100 | [diff] [blame] | 1244 | ============================== WARNING =============================== |
| 1245 | |
Richard Levitte | 2805ee1 | 2018-08-16 16:01:58 +0200 | [diff] [blame] | 1246 | _____ |
| 1247 | } |
Richard Levitte | e0bf7c0 | 2018-11-03 18:34:09 +0100 | [diff] [blame] | 1248 | push @{$config{openssl_feature_defines}}, |
Richard Levitte | 51cf8e0 | 2018-02-15 18:08:54 +0100 | [diff] [blame] | 1249 | map { (my $x = $_) =~ tr|[\-a-z]|[_A-Z]|; "OPENSSL_RAND_SEED_$x" } |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 1250 | @seed_sources; |
Richard Levitte | 51cf8e0 | 2018-02-15 18:08:54 +0100 | [diff] [blame] | 1251 | |
Richard Levitte | 00ae96c | 2015-05-18 12:53:38 +0200 | [diff] [blame] | 1252 | # Backward compatibility? |
Richard Levitte | 49e0454 | 2002-02-14 12:28:24 +0000 | [diff] [blame] | 1253 | if ($target =~ m/^CygWin32(-.*)$/) { |
Richard Levitte | 00ae96c | 2015-05-18 12:53:38 +0200 | [diff] [blame] | 1254 | $target = "Cygwin".$1; |
Richard Levitte | 49e0454 | 2002-02-14 12:28:24 +0000 | [diff] [blame] | 1255 | } |
| 1256 | |
Richard Levitte | 906eb3d | 2017-06-22 00:47:49 +0200 | [diff] [blame] | 1257 | # Support for legacy targets having a name starting with 'debug-' |
| 1258 | my ($d, $t) = $target =~ m/^(debug-)?(.*)$/; |
| 1259 | if ($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. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 1264 | $target = $t; |
Richard Levitte | 906eb3d | 2017-06-22 00:47:49 +0200 | [diff] [blame] | 1265 | } |
| 1266 | } |
Richard Levitte | 4e36044 | 2018-08-07 12:38:16 +0200 | [diff] [blame] | 1267 | |
Richard Levitte | 081436b | 2020-03-03 00:06:52 +0100 | [diff] [blame] | 1268 | if ($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 Levitte | 4e36044 | 2018-08-07 12:38:16 +0200 | [diff] [blame] | 1286 | |
Richard Levitte | 1806261 | 2020-03-03 15:04:42 +0100 | [diff] [blame] | 1287 | exit 0 if $dryrun; # From older 'config' |
| 1288 | |
Richard Levitte | 906eb3d | 2017-06-22 00:47:49 +0200 | [diff] [blame] | 1289 | $config{target} = $target; |
| 1290 | my %target = resolve_config($target); |
| 1291 | |
Richard Levitte | abe256e | 2018-03-06 20:35:30 +0100 | [diff] [blame] | 1292 | foreach (keys %target_attr_translate) { |
| 1293 | $target{$target_attr_translate{$_}} = $target{$_} |
| 1294 | if $target{$_}; |
| 1295 | delete $target{$_}; |
| 1296 | } |
| 1297 | |
Richard Levitte | 793077d | 2017-12-01 15:40:43 +0100 | [diff] [blame] | 1298 | %target = ( %{$table{DEFAULTS}}, %target ); |
| 1299 | |
Richard Levitte | 906eb3d | 2017-06-22 00:47:49 +0200 | [diff] [blame] | 1300 | my %conf_files = map { $_ => 1 } (@{$target{_conf_fname_int}}); |
| 1301 | $config{conf_files} = [ sort keys %conf_files ]; |
Richard Levitte | 906eb3d | 2017-06-22 00:47:49 +0200 | [diff] [blame] | 1302 | |
Richard Levitte | 71ef78d | 2019-04-23 09:41:19 +0200 | [diff] [blame] | 1303 | # Using sub disable within these loops may prove fragile, so we run |
| 1304 | # a cascade afterwards |
Richard Levitte | 906eb3d | 2017-06-22 00:47:49 +0200 | [diff] [blame] | 1305 | foreach 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 | } |
| 1313 | foreach my $feature (@{$target{enable}}) { |
Richard Levitte | 7a8a35f | 2018-12-12 09:27:48 +0100 | [diff] [blame] | 1314 | if ("default" eq ($disabled{$feature} // "")) { |
Richard Levitte | 906eb3d | 2017-06-22 00:47:49 +0200 | [diff] [blame] | 1315 | 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 Levitte | 7a8a35f | 2018-12-12 09:27:48 +0100 | [diff] [blame] | 1320 | delete $disabled{$feature}; |
Richard Levitte | 906eb3d | 2017-06-22 00:47:49 +0200 | [diff] [blame] | 1321 | } |
| 1322 | } |
Richard Levitte | b19fe71 | 2019-06-16 12:37:21 +0200 | [diff] [blame] | 1323 | |
| 1324 | # If uplink_arch isn't defined, disable uplink |
| 1325 | $disabled{uplink} = 'no uplink_arch' unless (defined $target{uplink_arch}); |
Richard Levitte | e6f98ae | 2019-06-16 13:32:58 +0200 | [diff] [blame] | 1326 | # If asm_arch isn't defined, disable asm |
| 1327 | $disabled{asm} = 'no asm_arch' unless (defined $target{asm_arch}); |
Richard Levitte | b19fe71 | 2019-06-16 12:37:21 +0200 | [diff] [blame] | 1328 | |
Richard Levitte | 71ef78d | 2019-04-23 09:41:19 +0200 | [diff] [blame] | 1329 | disable(); # Run a cascade now |
Richard Levitte | 906eb3d | 2017-06-22 00:47:49 +0200 | [diff] [blame] | 1330 | |
Richard Levitte | abe256e | 2018-03-06 20:35:30 +0100 | [diff] [blame] | 1331 | $target{CXXFLAGS}//=$target{CFLAGS} if $target{CXX}; |
| 1332 | $target{cxxflags}//=$target{cflags} if $target{CXX}; |
Richard Levitte | 9dd4ed2 | 2018-10-23 15:09:57 +0200 | [diff] [blame] | 1333 | $target{exe_extension}=".exe" if ($config{target} eq "DJGPP"); |
Richard Levitte | 107b579 | 2015-05-20 20:03:20 +0200 | [diff] [blame] | 1334 | $target{exe_extension}=".pm" if ($config{target} =~ /vos/); |
Richard Levitte | e987f9f | 2016-02-15 17:20:15 +0100 | [diff] [blame] | 1335 | |
Richard Levitte | 9e26532 | 2018-07-08 12:00:06 +0200 | [diff] [blame] | 1336 | # Fill %config with values from %user, and in case those are undefined or |
| 1337 | # empty, use values from %target (acting as a default). |
Richard Levitte | 5b18235 | 2018-01-26 19:56:44 +0100 | [diff] [blame] | 1338 | foreach (keys %user) { |
Richard Levitte | 5b18235 | 2018-01-26 19:56:44 +0100 | [diff] [blame] | 1339 | 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 Levitte | abe256e | 2018-03-06 20:35:30 +0100 | [diff] [blame] | 1364 | $config{$_} = |
Richard Levitte | 5b18235 | 2018-01-26 19:56:44 +0100 | [diff] [blame] | 1365 | $mkvalue->($ref_type, $user{$_}) |
Richard Levitte | abe256e | 2018-03-06 20:35:30 +0100 | [diff] [blame] | 1366 | || $mkvalue->($ref_type, $target{$_}); |
| 1367 | delete $config{$_} unless defined $config{$_}; |
Richard Levitte | 5b18235 | 2018-01-26 19:56:44 +0100 | [diff] [blame] | 1368 | } |
Richard Levitte | aaf878c | 2015-03-06 02:00:21 +0100 | [diff] [blame] | 1369 | |
Richard Levitte | c1a0925 | 2019-04-23 09:24:38 +0200 | [diff] [blame] | 1370 | # Finish up %config by appending things the user gave us on the command line |
| 1371 | # apart from "make variables" |
| 1372 | foreach (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 Cosgrove | 0221b08 | 2021-05-17 09:59:57 +0100 | [diff] [blame] | 1386 | if (grep { $_ =~ /(?:^|\s)-static(?:\s|$)/ } @{$config{LDFLAGS}}) { |
| 1387 | disable('static', 'pic', 'threads'); |
| 1388 | } |
| 1389 | |
Richard Levitte | 8b5156d | 2016-08-29 21:45:19 +0200 | [diff] [blame] | 1390 | # Allow overriding the build file name |
Richard Levitte | 5b18235 | 2018-01-26 19:56:44 +0100 | [diff] [blame] | 1391 | $config{build_file} = env('BUILDFILE') || $target{build_file} || "Makefile"; |
Richard Levitte | aaf878c | 2015-03-06 02:00:21 +0100 | [diff] [blame] | 1392 | |
Richard Levitte | 291e94d | 2015-05-18 22:35:23 +0200 | [diff] [blame] | 1393 | # Make sure build_scheme is consistent. |
| 1394 | $target{build_scheme} = [ $target{build_scheme} ] |
| 1395 | if ref($target{build_scheme}) ne "ARRAY"; |
Richard Levitte | d0d046e | 2002-01-27 15:52:37 +0000 | [diff] [blame] | 1396 | |
Richard Levitte | ddf1847 | 2016-01-30 00:57:33 +0100 | [diff] [blame] | 1397 | my ($builder, $builder_platform, @builder_opts) = |
| 1398 | @{$target{build_scheme}}; |
| 1399 | |
Richard Levitte | d192a3a | 2017-03-05 21:51:18 +0100 | [diff] [blame] | 1400 | foreach 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 Levitte | 488e2b0 | 2016-04-01 16:03:46 +0200 | [diff] [blame] | 1419 | push @{$config{defines}}, "NDEBUG" if $config{build_type} eq "release"; |
| 1420 | |
Richard Levitte | abe256e | 2018-03-06 20:35:30 +0100 | [diff] [blame] | 1421 | if ($target =~ /^mingw/ && `$config{CC} --target-help 2>&1` =~ m/-mno-cygwin/m) |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 1422 | { |
| 1423 | push @{$config{cflags}}, "-mno-cygwin"; |
| 1424 | push @{$config{cxxflags}}, "-mno-cygwin" if $config{CXX}; |
| 1425 | push @{$config{shared_ldflag}}, "-mno-cygwin"; |
| 1426 | } |
Andy Polyakov | cbecd29 | 2010-11-30 22:18:02 +0000 | [diff] [blame] | 1427 | |
Richard Levitte | 5b18235 | 2018-01-26 19:56:44 +0100 | [diff] [blame] | 1428 | if ($target =~ /linux.*-mips/ && !$disabled{asm} |
Richard Levitte | c1a0925 | 2019-04-23 09:24:38 +0200 | [diff] [blame] | 1429 | && !grep { $_ !~ /-m(ips|arch=)/ } (@{$config{CFLAGS}})) { |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 1430 | # 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 Polyakov | 63d8834 | 2012-09-15 11:21:50 +0000 | [diff] [blame] | 1436 | } |
| 1437 | |
Richard Levitte | 9c62a27 | 2016-02-27 16:51:34 +0100 | [diff] [blame] | 1438 | # If threads aren't disabled, check how possible they are |
| 1439 | unless ($disabled{threads}) { |
| 1440 | if ($auto_threads) { |
| 1441 | # Enabled by default, disable it forcibly if unavailable |
| 1442 | if ($target{thread_scheme} eq "(unknown)") { |
Richard Levitte | 71ef78d | 2019-04-23 09:41:19 +0200 | [diff] [blame] | 1443 | disable("unavailable", 'threads'); |
Richard Levitte | 9c62a27 | 2016-02-27 16:51:34 +0100 | [diff] [blame] | 1444 | } |
| 1445 | } else { |
FdaSilvaYY | 8483a00 | 2016-03-10 21:34:48 +0100 | [diff] [blame] | 1446 | # The user chose to enable threads explicitly, let's see |
Richard Levitte | 9c62a27 | 2016-02-27 16:51:34 +0100 | [diff] [blame] | 1447 | # 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 Levitte | c1a0925 | 2019-04-23 09:24:38 +0200 | [diff] [blame] | 1454 | if (!@{$config{CFLAGS}} && !@{$config{CPPDEFINES}}) { |
Richard Levitte | 9c62a27 | 2016-02-27 16:51:34 +0100 | [diff] [blame] | 1455 | 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 Levitte | bacc308 | 2019-04-17 22:30:03 +0200 | [diff] [blame] | 1462 | # 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. |
| 1465 | my %detected_sanitizers = (); |
| 1466 | foreach (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 Levitte | 9c62a27 | 2016-02-27 16:51:34 +0100 | [diff] [blame] | 1483 | # 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. |
| 1485 | unless($disabled{threads}) { |
Richard Levitte | e0bf7c0 | 2018-11-03 18:34:09 +0100 | [diff] [blame] | 1486 | push @{$config{openssl_feature_defines}}, "OPENSSL_THREADS"; |
Richard Levitte | 9c62a27 | 2016-02-27 16:51:34 +0100 | [diff] [blame] | 1487 | } |
Richard Levitte | e452de9 | 2001-07-12 09:11:14 +0000 | [diff] [blame] | 1488 | |
Richard Levitte | 8c3bc59 | 2018-01-23 13:54:55 +0100 | [diff] [blame] | 1489 | my $no_shared_warn=0; |
Richard Levitte | e1f5a92 | 2020-09-29 10:31:56 +0200 | [diff] [blame] | 1490 | if (($target{shared_target} // '') eq "") |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 1491 | { |
| 1492 | $no_shared_warn = 1 |
| 1493 | if (!$disabled{shared} || !$disabled{"dynamic-engine"}); |
Richard Levitte | 71ef78d | 2019-04-23 09:41:19 +0200 | [diff] [blame] | 1494 | disable('no-shared-target', 'pic'); |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 1495 | } |
Richard Levitte | b436a98 | 2000-07-21 15:08:53 +0000 | [diff] [blame] | 1496 | |
Richard Levitte | 19ab579 | 2016-02-22 02:06:05 +0100 | [diff] [blame] | 1497 | if ($disabled{"dynamic-engine"}) { |
Richard Levitte | 343ec2b | 2016-02-19 22:08:37 +0100 | [diff] [blame] | 1498 | $config{dynamic_engines} = 0; |
Richard Levitte | 19ab579 | 2016-02-22 02:06:05 +0100 | [diff] [blame] | 1499 | } else { |
Richard Levitte | 19ab579 | 2016-02-22 02:06:05 +0100 | [diff] [blame] | 1500 | $config{dynamic_engines} = 1; |
Richard Levitte | 343ec2b | 2016-02-19 22:08:37 +0100 | [diff] [blame] | 1501 | } |
Richard Levitte | ecd4531 | 2002-10-11 18:06:08 +0000 | [diff] [blame] | 1502 | |
Richard Levitte | bacc308 | 2019-04-17 22:30:03 +0200 | [diff] [blame] | 1503 | unless ($disabled{asan} || defined $detected_sanitizers{asan}) { |
Richard Levitte | 5b18235 | 2018-01-26 19:56:44 +0100 | [diff] [blame] | 1504 | push @{$config{cflags}}, "-fsanitize=address"; |
Ben Laurie | c38bb72 | 2016-03-26 17:19:14 +0000 | [diff] [blame] | 1505 | } |
| 1506 | |
Richard Levitte | bacc308 | 2019-04-17 22:30:03 +0200 | [diff] [blame] | 1507 | unless ($disabled{ubsan} || defined $detected_sanitizers{ubsan}) { |
FdaSilvaYY | f430ba3 | 2016-06-19 19:39:01 +0200 | [diff] [blame] | 1508 | # -DPEDANTIC or -fnosanitize=alignment may also be required on some |
Ben Laurie | c38bb72 | 2016-03-26 17:19:14 +0000 | [diff] [blame] | 1509 | # platforms. |
Richard Levitte | 5b18235 | 2018-01-26 19:56:44 +0100 | [diff] [blame] | 1510 | push @{$config{cflags}}, "-fsanitize=undefined", "-fno-sanitize-recover=all"; |
Ben Laurie | c38bb72 | 2016-03-26 17:19:14 +0000 | [diff] [blame] | 1511 | } |
| 1512 | |
Richard Levitte | bacc308 | 2019-04-17 22:30:03 +0200 | [diff] [blame] | 1513 | unless ($disabled{msan} || defined $detected_sanitizers{msan}) { |
Richard Levitte | 5b18235 | 2018-01-26 19:56:44 +0100 | [diff] [blame] | 1514 | push @{$config{cflags}}, "-fsanitize=memory"; |
Emilia Kasper | 29df306 | 2016-07-28 20:24:28 +0200 | [diff] [blame] | 1515 | } |
| 1516 | |
Richard Levitte | 65cc6d5 | 2016-06-05 10:59:31 +0200 | [diff] [blame] | 1517 | unless ($disabled{"fuzz-libfuzzer"} && $disabled{"fuzz-afl"} |
Emilia Kasper | 29df306 | 2016-07-28 20:24:28 +0200 | [diff] [blame] | 1518 | && $disabled{asan} && $disabled{ubsan} && $disabled{msan}) { |
Richard Levitte | 5b18235 | 2018-01-26 19:56:44 +0100 | [diff] [blame] | 1519 | push @{$config{cflags}}, "-fno-omit-frame-pointer", "-g"; |
Richard Levitte | abe256e | 2018-03-06 20:35:30 +0100 | [diff] [blame] | 1520 | push @{$config{cxxflags}}, "-fno-omit-frame-pointer", "-g" if $config{CXX}; |
Ben Laurie | c38bb72 | 2016-03-26 17:19:14 +0000 | [diff] [blame] | 1521 | } |
Andy Polyakov | c313e32 | 2007-09-16 12:23:47 +0000 | [diff] [blame] | 1522 | # |
| 1523 | # Platform fix-ups |
| 1524 | # |
Richard Levitte | ae48242 | 2016-02-22 02:09:11 +0100 | [diff] [blame] | 1525 | |
| 1526 | # This saves the build files from having to check |
| 1527 | if ($disabled{pic}) |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 1528 | { |
| 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 Levitte | 4f16039 | 2016-02-21 20:52:39 +0100 | [diff] [blame] | 1538 | else |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 1539 | { |
| 1540 | push @{$config{lib_defines}}, "OPENSSL_PIC"; |
| 1541 | } |
Richard Levitte | ae48242 | 2016-02-22 02:09:11 +0100 | [diff] [blame] | 1542 | |
Richard Levitte | 291e94d | 2015-05-18 22:35:23 +0200 | [diff] [blame] | 1543 | if ($target{sys_id} ne "") |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 1544 | { |
| 1545 | push @{$config{openssl_sys_defines}}, "OPENSSL_SYS_$target{sys_id}"; |
| 1546 | } |
Richard Levitte | cf1b7d9 | 2001-02-19 16:06:34 +0000 | [diff] [blame] | 1547 | |
Richard Levitte | e373c70 | 2019-02-26 09:32:52 +0100 | [diff] [blame] | 1548 | my %predefined_C = compiler_predefined($config{CROSS_COMPILE}.$config{CC}); |
| 1549 | my %predefined_CXX = $config{CXX} |
| 1550 | ? compiler_predefined($config{CROSS_COMPILE}.$config{CXX}) |
| 1551 | : (); |
Andy Polyakov | 54cf3b9 | 2017-08-29 15:47:08 +0200 | [diff] [blame] | 1552 | |
Andy Polyakov | 0984041 | 2019-05-05 18:30:55 +0200 | [diff] [blame] | 1553 | unless ($disabled{asm}) { |
| 1554 | # big endian systems can use ELFv2 ABI |
pkubaj | f5485b9 | 2021-11-20 20:40:06 +0000 | [diff] [blame] | 1555 | if ($target eq "linux-ppc64" || $target eq "BSD-ppc64") { |
Andy Polyakov | 0984041 | 2019-05-05 18:30:55 +0200 | [diff] [blame] | 1556 | $target{perlasm_scheme} = "linux64v2" if ($predefined_C{_CALL_ELF} == 2); |
| 1557 | } |
| 1558 | } |
| 1559 | |
Richard Levitte | fe191b4 | 2017-12-11 20:54:07 +0100 | [diff] [blame] | 1560 | # Check for makedepend capabilities. |
Richard Levitte | 6d75a83 | 2017-11-06 17:11:03 +0100 | [diff] [blame] | 1561 | if (!$disabled{makedepend}) { |
Richard Levitte | 2e535eb | 2021-04-26 09:17:05 +0200 | [diff] [blame] | 1562 | # 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 Levitte | e373c70 | 2019-02-26 09:32:52 +0100 | [diff] [blame] | 1573 | } elsif (($predefined_C{__GNUC__} // -1) >= 3 |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 1574 | && !($predefined_C{__APPLE_CC__} && !$predefined_C{__clang__})) { |
Richard Levitte | fe191b4 | 2017-12-11 20:54:07 +0100 | [diff] [blame] | 1575 | # We know that GNU C version 3 and up as well as all clang |
Todd Short | 717f308 | 2018-05-03 11:17:49 -0400 | [diff] [blame] | 1576 | # versions support dependency generation, but Xcode did not |
| 1577 | # handle $cc -M before clang support (but claims __GNUC__ = 3) |
Richard Levitte | 2e535eb | 2021-04-26 09:17:05 +0200 | [diff] [blame] | 1578 | $config{makedep_scheme} = 'gcc'; |
Richard Levitte | 6d75a83 | 2017-11-06 17:11:03 +0100 | [diff] [blame] | 1579 | } else { |
Richard Levitte | 2e535eb | 2021-04-26 09:17:05 +0200 | [diff] [blame] | 1580 | # 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 Polyakov | 54cf3b9 | 2017-08-29 15:47:08 +0200 | [diff] [blame] | 1584 | } |
Richard Levitte | 2e535eb | 2021-04-26 09:17:05 +0200 | [diff] [blame] | 1585 | |
| 1586 | # If no depend scheme is set, we disable makedepend |
| 1587 | disable('unavailable', 'makedepend') unless $config{makedep_scheme}; |
Rich Salz | f1f07a2 | 2016-01-29 19:50:28 -0500 | [diff] [blame] | 1588 | } |
Richard Levitte | 8ed40b8 | 2016-01-27 19:03:13 +0100 | [diff] [blame] | 1589 | |
Richard Levitte | e373c70 | 2019-02-26 09:32:52 +0100 | [diff] [blame] | 1590 | if (!$disabled{asm} && !$predefined_C{__MACH__} && $^O ne 'VMS') { |
Andy Polyakov | 0ad4078 | 2018-05-04 14:06:44 +0200 | [diff] [blame] | 1591 | # probe for -Wa,--noexecstack option... |
Richard Levitte | e373c70 | 2019-02-26 09:32:52 +0100 | [diff] [blame] | 1592 | if ($predefined_C{__clang__}) { |
Andy Polyakov | 0ad4078 | 2018-05-04 14:06:44 +0200 | [diff] [blame] | 1593 | # 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 Polyakov | 8e5da57 | 2018-08-17 14:29:59 +0200 | [diff] [blame] | 1598 | } else { |
Andy Polyakov | 0ad4078 | 2018-05-04 14:06:44 +0200 | [diff] [blame] | 1599 | 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 Levitte | 7d130f6 | 2015-05-19 01:40:54 +0200 | [diff] [blame] | 1611 | |
| 1612 | # Deal with bn_ops ################################################### |
| 1613 | |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 1614 | $config{bn_ll} =0; |
Richard Levitte | 7d130f6 | 2015-05-19 01:40:54 +0200 | [diff] [blame] | 1615 | my $def_int="unsigned int"; |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 1616 | $config{rc4_int} =$def_int; |
Rich Salz | b4f35e5 | 2016-01-23 13:23:25 -0500 | [diff] [blame] | 1617 | ($config{b64l},$config{b64},$config{b32})=(0,0,1); |
Richard Levitte | 7d130f6 | 2015-05-19 01:40:54 +0200 | [diff] [blame] | 1618 | |
Rich Salz | 94af0cd | 2016-01-28 10:13:21 -0500 | [diff] [blame] | 1619 | my $count = 0; |
Richard Levitte | 7d130f6 | 2015-05-19 01:40:54 +0200 | [diff] [blame] | 1620 | foreach (sort split(/\s+/,$target{bn_ops})) { |
Rich Salz | 94af0cd | 2016-01-28 10:13:21 -0500 | [diff] [blame] | 1621 | $count++ if /SIXTY_FOUR_BIT|SIXTY_FOUR_BIT_LONG|THIRTY_TWO_BIT/; |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 1622 | $config{bn_ll}=1 if $_ eq 'BN_LLONG'; |
| 1623 | $config{rc4_int}="unsigned char" if $_ eq 'RC4_CHAR'; |
Rich Salz | 94af0cd | 2016-01-28 10:13:21 -0500 | [diff] [blame] | 1624 | ($config{b64l},$config{b64},$config{b32}) |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 1625 | =(0,1,0) if $_ eq 'SIXTY_FOUR_BIT'; |
Rich Salz | 94af0cd | 2016-01-28 10:13:21 -0500 | [diff] [blame] | 1626 | ($config{b64l},$config{b64},$config{b32}) |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 1627 | =(1,0,0) if $_ eq 'SIXTY_FOUR_BIT_LONG'; |
Rich Salz | 94af0cd | 2016-01-28 10:13:21 -0500 | [diff] [blame] | 1628 | ($config{b64l},$config{b64},$config{b32}) |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 1629 | =(0,0,1) if $_ eq 'THIRTY_TWO_BIT'; |
Richard Levitte | 7d130f6 | 2015-05-19 01:40:54 +0200 | [diff] [blame] | 1630 | } |
Rich Salz | 94af0cd | 2016-01-28 10:13:21 -0500 | [diff] [blame] | 1631 | die "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 Levitte | 7d130f6 | 2015-05-19 01:40:54 +0200 | [diff] [blame] | 1633 | |
Richard Levitte | a6a4d0a | 2019-11-05 17:00:33 +0100 | [diff] [blame] | 1634 | $config{api} = $config{major} * 10000 + $config{minor} * 100 |
| 1635 | unless $config{api}; |
Richard Levitte | b05d632 | 2020-02-06 11:26:22 +0100 | [diff] [blame] | 1636 | foreach (keys %$apitable) { |
| 1637 | $disabled{"deprecated-$_"} = "deprecation" |
| 1638 | if $disabled{deprecated} && $config{api} >= $apitable->{$_}; |
| 1639 | } |
| 1640 | |
| 1641 | disable(); # Run a cascade now |
Richard Levitte | 7d130f6 | 2015-05-19 01:40:54 +0200 | [diff] [blame] | 1642 | |
| 1643 | # Hack cflags for better warnings (dev option) ####################### |
| 1644 | |
Richard Levitte | fa153b5 | 2018-01-27 14:56:06 +0100 | [diff] [blame] | 1645 | # "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 Levitte | 5b18235 | 2018-01-26 19:56:44 +0100 | [diff] [blame] | 1647 | $config{cflags} = [ map { (my $x = $_) =~ s/([\\\"])/\\$1/g; $x } |
| 1648 | @{$config{cflags}} ]; |
Richard Levitte | fa153b5 | 2018-01-27 14:56:06 +0100 | [diff] [blame] | 1649 | $config{cxxflags} = [ map { (my $x = $_) =~ s/([\\\"])/\\$1/g; $x } |
Richard Levitte | abe256e | 2018-03-06 20:35:30 +0100 | [diff] [blame] | 1650 | @{$config{cxxflags}} ] if $config{CXX}; |
Richard Levitte | 1ed0c66 | 2002-05-30 18:06:35 +0000 | [diff] [blame] | 1651 | |
Richard Levitte | fcd2d5a | 2018-11-29 23:05:03 +0000 | [diff] [blame] | 1652 | $config{openssl_api_defines} = [ |
Richard Levitte | b05d632 | 2020-02-06 11:26:22 +0100 | [diff] [blame] | 1653 | "OPENSSL_CONFIGURED_API=".$config{api}, |
Richard Levitte | fcd2d5a | 2018-11-29 23:05:03 +0000 | [diff] [blame] | 1654 | ]; |
Viktor Dukhovni | 98186eb | 2016-01-04 23:00:33 -0500 | [diff] [blame] | 1655 | |
Richard Levitte | 3b43740 | 2019-05-27 14:40:25 +0200 | [diff] [blame] | 1656 | my @strict_warnings_collection=(); |
Dr. Stephen Henson | 0c28f27 | 2009-09-09 16:31:32 +0000 | [diff] [blame] | 1657 | if ($strict_warnings) |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 1658 | { |
| 1659 | my $wopt; |
| 1660 | my $gccver = $predefined_C{__GNUC__} // -1; |
Andy Polyakov | 6d50589 | 2017-09-21 22:47:12 +0200 | [diff] [blame] | 1661 | |
Richard Levitte | b4a7b4e | 2019-10-29 13:37:54 +0100 | [diff] [blame] | 1662 | 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. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 1676 | } |
Richard Levitte | 4650d10 | 2019-04-23 09:29:45 +0200 | [diff] [blame] | 1677 | |
Richard Levitte | 3b43740 | 2019-05-27 14:40:25 +0200 | [diff] [blame] | 1678 | $config{CFLAGS} = [ map { $_ eq '--ossl-strict-warnings' |
| 1679 | ? @strict_warnings_collection |
| 1680 | : ( $_ ) } |
| 1681 | @{$config{CFLAGS}} ]; |
Richard Levitte | ef8ca6b | 2016-02-14 12:16:52 +0100 | [diff] [blame] | 1682 | |
Emilia Kasper | c91a0a8 | 2016-03-14 12:21:44 +0100 | [diff] [blame] | 1683 | unless ($disabled{afalgeng}) { |
| 1684 | $config{afalgeng}=""; |
Sebastian Andrzej Siewior | 9e381e8 | 2018-01-25 22:50:55 +0100 | [diff] [blame] | 1685 | if (grep { $_ eq 'afalgeng' } @{$target{enable}}) { |
Ross Burton | 9e1a54f | 2022-01-27 11:56:56 +0000 | [diff] [blame] | 1686 | push @{$config{engdirs}}, "afalg"; |
Richard Levitte | 79fff39 | 2016-03-09 09:04:01 +0100 | [diff] [blame] | 1687 | } else { |
Richard Levitte | 71ef78d | 2019-04-23 09:41:19 +0200 | [diff] [blame] | 1688 | disable('not-linux', 'afalgeng'); |
clucey | 7f458a4 | 2016-02-17 13:38:36 +0000 | [diff] [blame] | 1689 | } |
| 1690 | } |
Matt Caswell | 8da00a3 | 2016-02-29 13:36:47 +0000 | [diff] [blame] | 1691 | |
Richard Levitte | 76d0a74 | 2019-12-04 00:14:02 +0100 | [diff] [blame] | 1692 | unless ($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 Pismenny | 69495e3 | 2018-02-01 14:10:22 +0200 | [diff] [blame] | 1707 | unless ($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 Levitte | 71ef78d | 2019-04-23 09:41:19 +0200 | [diff] [blame] | 1719 | disable('too-old-kernel', 'ktls'); |
Boris Pismenny | 69495e3 | 2018-02-01 14:10:22 +0200 | [diff] [blame] | 1720 | } |
Andrew Gallatin | 2111f5c | 2018-10-22 11:02:19 -0400 | [diff] [blame] | 1721 | } 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 Pismenny | 69495e3 | 2018-02-01 14:10:22 +0200 | [diff] [blame] | 1727 | } else { |
Andrew Gallatin | 2111f5c | 2018-10-22 11:02:19 -0400 | [diff] [blame] | 1728 | disable('not-linux-or-freebsd', 'ktls'); |
Boris Pismenny | 69495e3 | 2018-02-01 14:10:22 +0200 | [diff] [blame] | 1729 | } |
| 1730 | } |
| 1731 | |
| 1732 | push @{$config{openssl_other_defines}}, "OPENSSL_NO_KTLS" if ($disabled{ktls}); |
| 1733 | |
Richard Levitte | 8f0dd6d | 2019-04-30 10:33:55 +0200 | [diff] [blame] | 1734 | # 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 Levitte | 5b18235 | 2018-01-26 19:56:44 +0100 | [diff] [blame] | 1776 | |
Richard Levitte | 8c06d71 | 2019-12-04 10:55:05 +0100 | [diff] [blame] | 1777 | ###################################################################### |
| 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. |
| 1789 | my %skipdir = (); |
| 1790 | my %disabled_info = (); # For configdata.pm |
| 1791 | foreach my $what (sort keys %disabled) { |
| 1792 | # There are deprecated disablables that translate to themselves. |
Dimitris Apostolou | e304aa8 | 2022-01-03 01:00:27 +0200 | [diff] [blame] | 1793 | # They cause disabling cascades, but should otherwise not register. |
Richard Levitte | 8c06d71 | 2019-12-04 10:55:05 +0100 | [diff] [blame] | 1794 | next if $deprecated_disablables{$what}; |
Richard Levitte | b05d632 | 2020-02-06 11:26:22 +0100 | [diff] [blame] | 1795 | # The generated $disabled{"deprecated-x.y"} entries are special |
| 1796 | # and treated properly elsewhere |
| 1797 | next if $what =~ m|^deprecated-|; |
Richard Levitte | 8c06d71 | 2019-12-04 10:55:05 +0100 | [diff] [blame] | 1798 | |
| 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 | |
| 1820 | if ($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 Levitte | 9fe2bb7 | 2016-01-29 19:45:51 +0100 | [diff] [blame] | 1826 | # If we use the unified build, collect information from build.info files |
| 1827 | my %unified_info = (); |
| 1828 | |
Richard Levitte | 2b6b606 | 2016-03-10 00:04:04 +0100 | [diff] [blame] | 1829 | my $buildinfo_debug = defined($ENV{CONFIGURE_DEBUG_BUILDINFO}); |
Richard Levitte | ddf1847 | 2016-01-30 00:57:33 +0100 | [diff] [blame] | 1830 | if ($builder eq "unified") { |
Richard Levitte | 1935a58 | 2019-09-09 11:51:01 +0200 | [diff] [blame] | 1831 | use Text::Template 1.46; |
Richard Levitte | 9fe2bb7 | 2016-01-29 19:45:51 +0100 | [diff] [blame] | 1832 | |
Richard Levitte | 9fe2bb7 | 2016-01-29 19:45:51 +0100 | [diff] [blame] | 1833 | sub cleandir { |
Richard Levitte | 2e96384 | 2016-02-10 02:00:37 +0100 | [diff] [blame] | 1834 | my $base = shift; |
Richard Levitte | 9fe2bb7 | 2016-01-29 19:45:51 +0100 | [diff] [blame] | 1835 | my $dir = shift; |
Richard Levitte | 2e96384 | 2016-02-10 02:00:37 +0100 | [diff] [blame] | 1836 | my $relativeto = shift || "."; |
| 1837 | |
| 1838 | $dir = catdir($base,$dir) unless isabsolute($dir); |
Richard Levitte | 9fe2bb7 | 2016-01-29 19:45:51 +0100 | [diff] [blame] | 1839 | |
Richard Levitte | ec182ef | 2016-02-09 10:15:13 +0100 | [diff] [blame] | 1840 | # Make sure the directories we're building in exists |
| 1841 | mkpath($dir); |
| 1842 | |
Richard Levitte | 2e96384 | 2016-02-10 02:00:37 +0100 | [diff] [blame] | 1843 | my $res = abs2rel(absolutedir($dir), rel2abs($relativeto)); |
Richard Levitte | 9fe2bb7 | 2016-01-29 19:45:51 +0100 | [diff] [blame] | 1844 | #print STDERR "DEBUG[cleandir]: $dir , $base => $res\n"; |
| 1845 | return $res; |
| 1846 | } |
| 1847 | |
| 1848 | sub cleanfile { |
Richard Levitte | 2e96384 | 2016-02-10 02:00:37 +0100 | [diff] [blame] | 1849 | my $base = shift; |
Richard Levitte | 9fe2bb7 | 2016-01-29 19:45:51 +0100 | [diff] [blame] | 1850 | my $file = shift; |
Richard Levitte | 2e96384 | 2016-02-10 02:00:37 +0100 | [diff] [blame] | 1851 | my $relativeto = shift || "."; |
| 1852 | |
| 1853 | $file = catfile($base,$file) unless isabsolute($file); |
| 1854 | |
Richard Levitte | 9fe2bb7 | 2016-01-29 19:45:51 +0100 | [diff] [blame] | 1855 | my $d = dirname($file); |
| 1856 | my $f = basename($file); |
| 1857 | |
Richard Levitte | ec182ef | 2016-02-09 10:15:13 +0100 | [diff] [blame] | 1858 | # Make sure the directories we're building in exists |
| 1859 | mkpath($d); |
| 1860 | |
Richard Levitte | 2e96384 | 2016-02-10 02:00:37 +0100 | [diff] [blame] | 1861 | my $res = abs2rel(catfile(absolutedir($d), $f), rel2abs($relativeto)); |
Richard Levitte | 9fe2bb7 | 2016-01-29 19:45:51 +0100 | [diff] [blame] | 1862 | #print STDERR "DEBUG[cleanfile]: $d , $f => $res\n"; |
| 1863 | return $res; |
| 1864 | } |
| 1865 | |
Richard Levitte | 1967a42 | 2016-09-15 23:55:24 +0200 | [diff] [blame] | 1866 | # 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. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 1869 | ( $builder_platform."-".$target{build_file}.".tmpl", |
| 1870 | $target{build_file}.".tmpl" ); |
Richard Levitte | 1967a42 | 2016-09-15 23:55:24 +0200 | [diff] [blame] | 1871 | my @build_file_templates = (); |
| 1872 | |
| 1873 | # First, look in the user provided directory, if given |
Richard Levitte | 7ecdf18 | 2017-11-29 13:09:01 +0100 | [diff] [blame] | 1874 | if (defined env($local_config_envname)) { |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 1875 | @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 Levitte | 1967a42 | 2016-09-15 23:55:24 +0200 | [diff] [blame] | 1886 | } |
| 1887 | # Then, look in our standard directory |
| 1888 | push @build_file_templates, |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 1889 | ( map { cleanfile($srcdir, catfile("Configurations", $_), $blddir) } |
| 1890 | @build_file_template_names ); |
Richard Levitte | 1967a42 | 2016-09-15 23:55:24 +0200 | [diff] [blame] | 1891 | |
| 1892 | my $build_file_template; |
| 1893 | for $_ (@build_file_templates) { |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 1894 | $build_file_template = $_; |
Richard Levitte | 1967a42 | 2016-09-15 23:55:24 +0200 | [diff] [blame] | 1895 | last if -f $build_file_template; |
| 1896 | |
| 1897 | $build_file_template = undef; |
| 1898 | } |
| 1899 | if (!defined $build_file_template) { |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 1900 | die "*** Couldn't find any of:\n", join("\n", @build_file_templates), "\n"; |
Richard Levitte | 1967a42 | 2016-09-15 23:55:24 +0200 | [diff] [blame] | 1901 | } |
| 1902 | $config{build_file_templates} |
Richard Levitte | 8258975 | 2018-04-11 13:13:22 +0200 | [diff] [blame] | 1903 | = [ cleanfile($srcdir, catfile("Configurations", "common0.tmpl"), |
| 1904 | $blddir), |
Richard Levitte | 2660b7c | 2021-05-17 14:33:16 +0200 | [diff] [blame] | 1905 | $build_file_template ]; |
Richard Levitte | 1967a42 | 2016-09-15 23:55:24 +0200 | [diff] [blame] | 1906 | |
Richard Levitte | 7f73eaf | 2018-11-03 15:03:59 +0100 | [diff] [blame] | 1907 | my @build_dirs = ( [ ] ); # current directory |
Richard Levitte | 9fe2bb7 | 2016-01-29 19:45:51 +0100 | [diff] [blame] | 1908 | |
Richard Levitte | 2e0956b | 2016-02-28 01:13:17 +0100 | [diff] [blame] | 1909 | $config{build_infos} = [ ]; |
| 1910 | |
Richard Levitte | 507f838 | 2021-01-10 09:08:46 +0100 | [diff] [blame] | 1911 | # 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 Levitte | d201dbc | 2017-12-28 16:03:17 +0100 | [diff] [blame] | 1922 | my %ordinals = (); |
Richard Levitte | 7f73eaf | 2018-11-03 15:03:59 +0100 | [diff] [blame] | 1923 | while (@build_dirs) { |
| 1924 | my @curd = @{shift @build_dirs}; |
| 1925 | my $sourced = catdir($srcdir, @curd); |
| 1926 | my $buildd = catdir($blddir, @curd); |
Richard Levitte | 9fe2bb7 | 2016-01-29 19:45:51 +0100 | [diff] [blame] | 1927 | |
Richard Levitte | 75d47db | 2018-11-03 18:38:04 +0100 | [diff] [blame] | 1928 | 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 Levitte | dca9938 | 2016-02-08 16:27:15 +0100 | [diff] [blame] | 1935 | mkpath($buildd); |
Richard Levitte | 9fe2bb7 | 2016-01-29 19:45:51 +0100 | [diff] [blame] | 1936 | |
Richard Levitte | 7f73eaf | 2018-11-03 15:03:59 +0100 | [diff] [blame] | 1937 | my $f = 'build.info'; |
Richard Levitte | 9fe2bb7 | 2016-01-29 19:45:51 +0100 | [diff] [blame] | 1938 | # The basic things we're trying to build |
| 1939 | my @programs = (); |
| 1940 | my @libraries = (); |
Richard Levitte | 1842f36 | 2019-01-31 00:06:50 +0100 | [diff] [blame] | 1941 | my @modules = (); |
Richard Levitte | 9fe2bb7 | 2016-01-29 19:45:51 +0100 | [diff] [blame] | 1942 | my @scripts = (); |
Richard Levitte | 9fe2bb7 | 2016-01-29 19:45:51 +0100 | [diff] [blame] | 1943 | |
Richard Levitte | 9fe2bb7 | 2016-01-29 19:45:51 +0100 | [diff] [blame] | 1944 | my %sources = (); |
Richard Levitte | 2a08d1a | 2016-03-29 16:45:03 +0200 | [diff] [blame] | 1945 | my %shared_sources = (); |
Richard Levitte | 9fe2bb7 | 2016-01-29 19:45:51 +0100 | [diff] [blame] | 1946 | my %includes = (); |
Richard Levitte | b96ab5e | 2016-10-14 16:56:34 +0200 | [diff] [blame] | 1947 | my %defines = (); |
Richard Levitte | 9fe2bb7 | 2016-01-29 19:45:51 +0100 | [diff] [blame] | 1948 | my %depends = (); |
Richard Levitte | ae4c745 | 2016-03-07 14:37:00 +0100 | [diff] [blame] | 1949 | my %generate = (); |
Pauli | d594d2e | 2021-05-21 15:16:39 +1000 | [diff] [blame] | 1950 | my %imagedocs = (); |
Richard Levitte | 829f86b | 2016-08-31 22:54:39 +0200 | [diff] [blame] | 1951 | my %htmldocs = (); |
| 1952 | my %mandocs = (); |
Richard Levitte | 9fe2bb7 | 2016-01-29 19:45:51 +0100 | [diff] [blame] | 1953 | |
Richard Levitte | 26fe9b0 | 2019-06-12 12:03:31 +0200 | [diff] [blame] | 1954 | # 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 Levitte | e429217 | 2020-02-26 14:35:17 +0100 | [diff] [blame] | 1959 | # 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 Levitte | 4975e8b | 2020-05-05 16:53:43 +0200 | [diff] [blame] | 1963 | # 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 Levitte | 26fe9b0 | 2019-06-12 12:03:31 +0200 | [diff] [blame] | 1970 | my $expand_variables = sub { |
| 1971 | my $value = ''; |
| 1972 | my $value_rest = shift; |
| 1973 | |
Richard Levitte | 03f30c5 | 2019-08-19 08:54:00 +0200 | [diff] [blame] | 1974 | if ($ENV{CONFIGURE_DEBUG_VARIABLE_EXPAND}) { |
| 1975 | print STDERR |
Richard Levitte | e429217 | 2020-02-26 14:35:17 +0100 | [diff] [blame] | 1976 | "DEBUG[\$expand_variables] Parsed '$value_rest' ...\n" |
Richard Levitte | 03f30c5 | 2019-08-19 08:54:00 +0200 | [diff] [blame] | 1977 | } |
Richard Levitte | 4975e8b | 2020-05-05 16:53:43 +0200 | [diff] [blame] | 1978 | |
| 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 Levitte | 26fe9b0 | 2019-06-12 12:03:31 +0200 | [diff] [blame] | 1985 | $value_rest = $'; |
Richard Levitte | e429217 | 2020-02-26 14:35:17 +0100 | [diff] [blame] | 1986 | $value .= $`; |
| 1987 | |
Richard Levitte | e429217 | 2020-02-26 14:35:17 +0100 | [diff] [blame] | 1988 | # Process modifier expressions, if present |
Richard Levitte | 4975e8b | 2020-05-05 16:53:43 +0200 | [diff] [blame] | 1989 | if (defined $mod) { |
| 1990 | if ($mod =~ /^${variable_subst_re}$/) { |
| 1991 | my $re = $+{RE}; |
| 1992 | my $subst = $+{SUBST}; |
Richard Levitte | e429217 | 2020-02-26 14:35:17 +0100 | [diff] [blame] | 1993 | |
Richard Levitte | 4975e8b | 2020-05-05 16:53:43 +0200 | [diff] [blame] | 1994 | $variable_value =~ s/\Q$re\E/$subst/g; |
Richard Levitte | e429217 | 2020-02-26 14:35:17 +0100 | [diff] [blame] | 1995 | |
Richard Levitte | 4975e8b | 2020-05-05 16:53:43 +0200 | [diff] [blame] | 1996 | if ($ENV{CONFIGURE_DEBUG_VARIABLE_EXPAND}) { |
| 1997 | print STDERR |
| 1998 | "DEBUG[\$expand_variables] ... and substituted ", |
| 1999 | "'$re' with '$subst'\n"; |
| 2000 | } |
Richard Levitte | e429217 | 2020-02-26 14:35:17 +0100 | [diff] [blame] | 2001 | } |
| 2002 | } |
| 2003 | |
| 2004 | $value .= $variable_value; |
Richard Levitte | 26fe9b0 | 2019-06-12 12:03:31 +0200 | [diff] [blame] | 2005 | } |
Richard Levitte | 03f30c5 | 2019-08-19 08:54:00 +0200 | [diff] [blame] | 2006 | if ($ENV{CONFIGURE_DEBUG_VARIABLE_EXPAND}) { |
| 2007 | print STDERR |
Richard Levitte | e429217 | 2020-02-26 14:35:17 +0100 | [diff] [blame] | 2008 | "DEBUG[\$expand_variables] ... into: '$value$value_rest'\n"; |
Richard Levitte | 03f30c5 | 2019-08-19 08:54:00 +0200 | [diff] [blame] | 2009 | } |
Richard Levitte | 26fe9b0 | 2019-06-12 12:03:31 +0200 | [diff] [blame] | 2010 | return $value . $value_rest; |
| 2011 | }; |
| 2012 | |
Richard Levitte | 285dacc | 2019-10-03 23:30:58 +0200 | [diff] [blame] | 2013 | # 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 Levitte | ea4ee152 | 2020-07-02 00:08:45 +0200 | [diff] [blame] | 2027 | if ($a =~ m|^(!)?(.*?)\s* = \s*(.*?)$|x) { |
Richard Levitte | 285dacc | 2019-10-03 23:30:58 +0200 | [diff] [blame] | 2028 | $ac = ! $1; |
Richard Levitte | ea4ee152 | 2020-07-02 00:08:45 +0200 | [diff] [blame] | 2029 | $ak = $2; |
| 2030 | $av = $3; |
Richard Levitte | 285dacc | 2019-10-03 23:30:58 +0200 | [diff] [blame] | 2031 | } |
| 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 Levitte | ad5be19 | 2020-02-26 14:30:38 +0100 | [diff] [blame] | 2042 | # 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 Levitte | 829f86b | 2016-08-31 22:54:39 +0200 | [diff] [blame] | 2070 | if ($buildinfo_debug) { |
| 2071 | print STDERR "DEBUG: Reading ",catfile($sourced, $f),"\n"; |
| 2072 | } |
Richard Levitte | 2e0956b | 2016-02-28 01:13:17 +0100 | [diff] [blame] | 2073 | push @{$config{build_infos}}, catfile(abs2rel($sourced, $blddir), $f); |
Richard Levitte | cb6afcd | 2017-08-01 22:10:39 +0200 | [diff] [blame] | 2074 | my $template = |
| 2075 | Text::Template->new(TYPE => 'FILE', |
| 2076 | SOURCE => catfile($sourced, $f), |
| 2077 | PREPEND => qq{use lib "$FindBin::Bin/util/perl";}); |
Richard Levitte | 9fe2bb7 | 2016-01-29 19:45:51 +0100 | [diff] [blame] | 2078 | 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 Levitte | 9e04edf | 2016-02-22 13:45:46 +0100 | [diff] [blame] | 2083 | disabled => \%disabled, |
Kurt Roeckx | f59d013 | 2016-05-07 22:09:13 +0200 | [diff] [blame] | 2084 | withargs => \%withargs, |
Richard Levitte | 9fe2bb7 | 2016-01-29 19:45:51 +0100 | [diff] [blame] | 2085 | 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 Levitte | 285dacc | 2019-10-03 23:30:58 +0200 | [diff] [blame] | 2098 | |
| 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 Levitte | 4a73938 | 2021-06-10 09:15:58 +0200 | [diff] [blame] | 2103 | my $value_re = qr/(?P<VALUE>.*?)/; |
Richard Levitte | 9fe2bb7 | 2016-01-29 19:45:51 +0100 | [diff] [blame] | 2104 | 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 Levitte | 285dacc | 2019-10-03 23:30:58 +0200 | [diff] [blame] | 2109 | qr/^\s* IF ${cond_re} \s*$/x |
Richard Levitte | 635bd40 | 2016-03-09 14:33:37 +0100 | [diff] [blame] | 2110 | => sub { |
Richard Levitte | c5798e0 | 2016-03-09 23:58:44 +0100 | [diff] [blame] | 2111 | if (! @skip || $skip[$#skip] > 0) { |
Richard Levitte | 285dacc | 2019-10-03 23:30:58 +0200 | [diff] [blame] | 2112 | push @skip, !! $expand_variables->($+{COND}); |
Richard Levitte | 635bd40 | 2016-03-09 14:33:37 +0100 | [diff] [blame] | 2113 | } else { |
| 2114 | push @skip, -1; |
| 2115 | } |
| 2116 | }, |
Richard Levitte | 285dacc | 2019-10-03 23:30:58 +0200 | [diff] [blame] | 2117 | qr/^\s* ELSIF ${cond_re} \s*$/x |
Richard Levitte | 9fe2bb7 | 2016-01-29 19:45:51 +0100 | [diff] [blame] | 2118 | => 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 Levitte | 285dacc | 2019-10-03 23:30:58 +0200 | [diff] [blame] | 2121 | $skip[$#skip] = !! $expand_variables->($+{COND}) |
Richard Levitte | 9fe2bb7 | 2016-01-29 19:45:51 +0100 | [diff] [blame] | 2122 | if $skip[$#skip] == 0; }, |
Richard Levitte | 285dacc | 2019-10-03 23:30:58 +0200 | [diff] [blame] | 2123 | qr/^\s* ELSE \s*$/x |
Richard Levitte | 9fe2bb7 | 2016-01-29 19:45:51 +0100 | [diff] [blame] | 2124 | => 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 Levitte | 285dacc | 2019-10-03 23:30:58 +0200 | [diff] [blame] | 2127 | qr/^\s* ENDIF \s*$/x |
Richard Levitte | 9fe2bb7 | 2016-01-29 19:45:51 +0100 | [diff] [blame] | 2128 | => sub { die "ENDIF out of scope" if ! @skip; |
| 2129 | pop @skip; }, |
Richard Levitte | 4a73938 | 2021-06-10 09:15:58 +0200 | [diff] [blame] | 2130 | qr/^\s* ${variable_re} \s* = \s* ${value_re} \s* $/x |
Richard Levitte | 26fe9b0 | 2019-06-12 12:03:31 +0200 | [diff] [blame] | 2131 | => sub { |
| 2132 | if (!@skip || $skip[$#skip] > 0) { |
Richard Levitte | 285dacc | 2019-10-03 23:30:58 +0200 | [diff] [blame] | 2133 | $variables{$+{VARIABLE}} = $expand_variables->($+{VALUE}); |
Richard Levitte | 26fe9b0 | 2019-06-12 12:03:31 +0200 | [diff] [blame] | 2134 | } |
| 2135 | }, |
Richard Levitte | 4a73938 | 2021-06-10 09:15:58 +0200 | [diff] [blame] | 2136 | qr/^\s* SUBDIRS \s* = \s* ${value_re} \s* $/x |
Richard Levitte | 7f73eaf | 2018-11-03 15:03:59 +0100 | [diff] [blame] | 2137 | => sub { |
| 2138 | if (!@skip || $skip[$#skip] > 0) { |
Richard Levitte | 285dacc | 2019-10-03 23:30:58 +0200 | [diff] [blame] | 2139 | foreach (tokenize($expand_variables->($+{VALUE}))) { |
Richard Levitte | 7f73eaf | 2018-11-03 15:03:59 +0100 | [diff] [blame] | 2140 | push @build_dirs, [ @curd, splitdir($_, 1) ]; |
| 2141 | } |
| 2142 | } |
| 2143 | }, |
Richard Levitte | 4a73938 | 2021-06-10 09:15:58 +0200 | [diff] [blame] | 2144 | qr/^\s* PROGRAMS ${attribs_re} \s* = \s* ${value_re} \s* $/x |
Richard Levitte | ad5be19 | 2020-02-26 14:30:38 +0100 | [diff] [blame] | 2145 | => sub { $push_to->(\@programs, undef, |
| 2146 | \$attributes{programs}, $+{ATTRIBS}, |
| 2147 | tokenize($expand_variables->($+{VALUE}))) |
| 2148 | if !@skip || $skip[$#skip] > 0; }, |
Richard Levitte | 4a73938 | 2021-06-10 09:15:58 +0200 | [diff] [blame] | 2149 | qr/^\s* LIBS ${attribs_re} \s* = \s* ${value_re} \s* $/x |
Richard Levitte | ad5be19 | 2020-02-26 14:30:38 +0100 | [diff] [blame] | 2150 | => sub { $push_to->(\@libraries, undef, |
| 2151 | \$attributes{libraries}, $+{ATTRIBS}, |
| 2152 | tokenize($expand_variables->($+{VALUE}))) |
| 2153 | if !@skip || $skip[$#skip] > 0; }, |
Richard Levitte | 4a73938 | 2021-06-10 09:15:58 +0200 | [diff] [blame] | 2154 | qr/^\s* MODULES ${attribs_re} \s* = \s* ${value_re} \s* $/x |
Richard Levitte | ad5be19 | 2020-02-26 14:30:38 +0100 | [diff] [blame] | 2155 | => sub { $push_to->(\@modules, undef, |
| 2156 | \$attributes{modules}, $+{ATTRIBS}, |
| 2157 | tokenize($expand_variables->($+{VALUE}))) |
| 2158 | if !@skip || $skip[$#skip] > 0; }, |
Richard Levitte | 4a73938 | 2021-06-10 09:15:58 +0200 | [diff] [blame] | 2159 | qr/^\s* SCRIPTS ${attribs_re} \s* = \s* ${value_re} \s* $/x |
Richard Levitte | ad5be19 | 2020-02-26 14:30:38 +0100 | [diff] [blame] | 2160 | => sub { $push_to->(\@scripts, undef, |
| 2161 | \$attributes{scripts}, $+{ATTRIBS}, |
| 2162 | tokenize($expand_variables->($+{VALUE}))) |
| 2163 | if !@skip || $skip[$#skip] > 0; }, |
Richard Levitte | 4a73938 | 2021-06-10 09:15:58 +0200 | [diff] [blame] | 2164 | qr/^\s* IMAGEDOCS ${index_re} \s* = \s* ${value_re} \s* $/x |
Pauli | d594d2e | 2021-05-21 15:16:39 +1000 | [diff] [blame] | 2165 | => sub { $push_to->(\%imagedocs, $expand_variables->($+{INDEX}), |
| 2166 | undef, undef, |
| 2167 | tokenize($expand_variables->($+{VALUE}))) |
| 2168 | if !@skip || $skip[$#skip] > 0; }, |
Richard Levitte | 4a73938 | 2021-06-10 09:15:58 +0200 | [diff] [blame] | 2169 | qr/^\s* HTMLDOCS ${index_re} \s* = \s* ${value_re} \s* $/x |
Richard Levitte | ad5be19 | 2020-02-26 14:30:38 +0100 | [diff] [blame] | 2170 | => sub { $push_to->(\%htmldocs, $expand_variables->($+{INDEX}), |
| 2171 | undef, undef, |
| 2172 | tokenize($expand_variables->($+{VALUE}))) |
| 2173 | if !@skip || $skip[$#skip] > 0; }, |
Richard Levitte | 4a73938 | 2021-06-10 09:15:58 +0200 | [diff] [blame] | 2174 | qr/^\s* MANDOCS ${index_re} \s* = \s* ${value_re} \s* $/x |
Richard Levitte | ad5be19 | 2020-02-26 14:30:38 +0100 | [diff] [blame] | 2175 | => sub { $push_to->(\%mandocs, $expand_variables->($+{INDEX}), |
| 2176 | undef, undef, |
| 2177 | tokenize($expand_variables->($+{VALUE}))) |
| 2178 | if !@skip || $skip[$#skip] > 0; }, |
Richard Levitte | 4a73938 | 2021-06-10 09:15:58 +0200 | [diff] [blame] | 2179 | qr/^\s* SOURCE ${index_re} ${attribs_re} \s* = \s* ${value_re} \s* $/x |
Richard Levitte | ad5be19 | 2020-02-26 14:30:38 +0100 | [diff] [blame] | 2180 | => sub { $push_to->(\%sources, $expand_variables->($+{INDEX}), |
Richard Levitte | dd05c79 | 2021-05-18 18:21:51 +0200 | [diff] [blame] | 2181 | \$attributes{sources}, $+{ATTRIBS}, |
Richard Levitte | ad5be19 | 2020-02-26 14:30:38 +0100 | [diff] [blame] | 2182 | tokenize($expand_variables->($+{VALUE}))) |
| 2183 | if !@skip || $skip[$#skip] > 0; }, |
Richard Levitte | 4a73938 | 2021-06-10 09:15:58 +0200 | [diff] [blame] | 2184 | qr/^\s* SHARED_SOURCE ${index_re} ${attribs_re} \s* = \s* ${value_re} \s* $/x |
Richard Levitte | ad5be19 | 2020-02-26 14:30:38 +0100 | [diff] [blame] | 2185 | => sub { $push_to->(\%shared_sources, $expand_variables->($+{INDEX}), |
Richard Levitte | dd05c79 | 2021-05-18 18:21:51 +0200 | [diff] [blame] | 2186 | \$attributes{sources}, $+{ATTRIBS}, |
Richard Levitte | ad5be19 | 2020-02-26 14:30:38 +0100 | [diff] [blame] | 2187 | tokenize($expand_variables->($+{VALUE}))) |
| 2188 | if !@skip || $skip[$#skip] > 0; }, |
Richard Levitte | 4a73938 | 2021-06-10 09:15:58 +0200 | [diff] [blame] | 2189 | qr/^\s* INCLUDE ${index_re} \s* = \s* ${value_re} \s* $/x |
Richard Levitte | ad5be19 | 2020-02-26 14:30:38 +0100 | [diff] [blame] | 2190 | => sub { $push_to->(\%includes, $expand_variables->($+{INDEX}), |
| 2191 | undef, undef, |
| 2192 | tokenize($expand_variables->($+{VALUE}))) |
| 2193 | if !@skip || $skip[$#skip] > 0; }, |
Richard Levitte | 4a73938 | 2021-06-10 09:15:58 +0200 | [diff] [blame] | 2194 | qr/^\s* DEFINE ${index_re} \s* = \s* ${value_re} \s* $/x |
Richard Levitte | ad5be19 | 2020-02-26 14:30:38 +0100 | [diff] [blame] | 2195 | => sub { $push_to->(\%defines, $expand_variables->($+{INDEX}), |
| 2196 | undef, undef, |
| 2197 | tokenize($expand_variables->($+{VALUE}))) |
| 2198 | if !@skip || $skip[$#skip] > 0; }, |
Richard Levitte | 4a73938 | 2021-06-10 09:15:58 +0200 | [diff] [blame] | 2199 | qr/^\s* DEPEND ${index_re} ${attribs_re} \s* = \s* ${value_re} \s* $/x |
Richard Levitte | ad5be19 | 2020-02-26 14:30:38 +0100 | [diff] [blame] | 2200 | => sub { $push_to->(\%depends, $expand_variables->($+{INDEX}), |
| 2201 | \$attributes{depends}, $+{ATTRIBS}, |
| 2202 | tokenize($expand_variables->($+{VALUE}))) |
| 2203 | if !@skip || $skip[$#skip] > 0; }, |
Richard Levitte | 4a73938 | 2021-06-10 09:15:58 +0200 | [diff] [blame] | 2204 | qr/^\s* GENERATE ${index_re} \s* = \s* ${value_re} \s* $/x |
Richard Levitte | ad5be19 | 2020-02-26 14:30:38 +0100 | [diff] [blame] | 2205 | => sub { $push_to->(\%generate, $expand_variables->($+{INDEX}), |
Richard Levitte | 7058b4d | 2021-06-01 07:45:54 +0200 | [diff] [blame] | 2206 | undef, undef, $expand_variables->($+{VALUE})) |
Richard Levitte | ad5be19 | 2020-02-26 14:30:38 +0100 | [diff] [blame] | 2207 | if !@skip || $skip[$#skip] > 0; }, |
Richard Levitte | 285dacc | 2019-10-03 23:30:58 +0200 | [diff] [blame] | 2208 | qr/^\s* (?:\#.*)? $/x => sub { }, |
Richard Levitte | 2b6b606 | 2016-03-10 00:04:04 +0100 | [diff] [blame] | 2209 | "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 Levitte | 9fe2bb7 | 2016-01-29 19:45:51 +0100 | [diff] [blame] | 2221 | ); |
| 2222 | die "runaway IF?" if (@skip); |
| 2223 | |
Richard Levitte | 285dacc | 2019-10-03 23:30:58 +0200 | [diff] [blame] | 2224 | if (grep { defined $attributes{modules}->{$_}->{engine} } keys %attributes |
Richard Levitte | 1842f36 | 2019-01-31 00:06:50 +0100 | [diff] [blame] | 2225 | and !$config{dynamic_engines}) { |
| 2226 | die <<"EOF" |
Richard Levitte | 19ab579 | 2016-02-22 02:06:05 +0100 | [diff] [blame] | 2227 | ENGINES can only be used if configured with 'dynamic-engine'. |
Richard Levitte | 9fe2bb7 | 2016-01-29 19:45:51 +0100 | [diff] [blame] | 2228 | This is usually a fault in a build.info file. |
| 2229 | EOF |
Richard Levitte | 1842f36 | 2019-01-31 00:06:50 +0100 | [diff] [blame] | 2230 | } |
Richard Levitte | c91f24d | 2018-11-07 10:44:05 +0100 | [diff] [blame] | 2231 | |
Richard Levitte | c91f24d | 2018-11-07 10:44:05 +0100 | [diff] [blame] | 2232 | { |
| 2233 | my %infos = ( programs => [ @programs ], |
| 2234 | libraries => [ @libraries ], |
Richard Levitte | 1842f36 | 2019-01-31 00:06:50 +0100 | [diff] [blame] | 2235 | modules => [ @modules ], |
Richard Levitte | da7e31e | 2019-01-30 19:10:26 +0100 | [diff] [blame] | 2236 | scripts => [ @scripts ] ); |
Richard Levitte | c91f24d | 2018-11-07 10:44:05 +0100 | [diff] [blame] | 2237 | foreach my $k (keys %infos) { |
| 2238 | foreach (@{$infos{$k}}) { |
| 2239 | my $item = cleanfile($buildd, $_, $blddir); |
| 2240 | $unified_info{$k}->{$item} = 1; |
Richard Levitte | 285dacc | 2019-10-03 23:30:58 +0200 | [diff] [blame] | 2241 | |
| 2242 | # Fix up associated attributes |
| 2243 | $unified_info{attributes}->{$k}->{$item} = |
| 2244 | $attributes{$k}->{$_} |
| 2245 | if defined $attributes{$k}->{$_}; |
Richard Levitte | c91f24d | 2018-11-07 10:44:05 +0100 | [diff] [blame] | 2246 | } |
| 2247 | } |
Richard Levitte | 8a67946 | 2016-03-07 14:50:37 +0100 | [diff] [blame] | 2248 | } |
| 2249 | |
Richard Levitte | f5fb6f0 | 2018-10-23 15:45:24 +0200 | [diff] [blame] | 2250 | # 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 Levitte | 9fe2bb7 | 2016-01-29 19:45:51 +0100 | [diff] [blame] | 2256 | } |
Richard Levitte | f5fb6f0 | 2018-10-23 15:45:24 +0200 | [diff] [blame] | 2257 | die "these libraries are both explicitly static and shared:\n ", |
| 2258 | join(" ", @doubles), "\n" |
| 2259 | if @doubles; |
Richard Levitte | 9fe2bb7 | 2016-01-29 19:45:51 +0100 | [diff] [blame] | 2260 | |
Richard Levitte | 9fe2bb7 | 2016-01-29 19:45:51 +0100 | [diff] [blame] | 2261 | foreach (keys %sources) { |
| 2262 | my $dest = $_; |
Richard Levitte | 2e96384 | 2016-02-10 02:00:37 +0100 | [diff] [blame] | 2263 | my $ddest = cleanfile($buildd, $_, $blddir); |
Richard Levitte | 9fe2bb7 | 2016-01-29 19:45:51 +0100 | [diff] [blame] | 2264 | foreach (@{$sources{$dest}}) { |
Richard Levitte | 2e96384 | 2016-02-10 02:00:37 +0100 | [diff] [blame] | 2265 | my $s = cleanfile($sourced, $_, $blddir); |
Richard Levitte | 9fe2bb7 | 2016-01-29 19:45:51 +0100 | [diff] [blame] | 2266 | |
Richard Levitte | 19cf440 | 2020-02-26 14:42:10 +0100 | [diff] [blame] | 2267 | # 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 Levitte | 2e96384 | 2016-02-10 02:00:37 +0100 | [diff] [blame] | 2270 | $s = cleanfile($buildd, $_, $blddir); |
Richard Levitte | 9fe2bb7 | 2016-01-29 19:45:51 +0100 | [diff] [blame] | 2271 | } |
Richard Levitte | dd05c79 | 2021-05-18 18:21:51 +0200 | [diff] [blame] | 2272 | my $o = $_; |
Richard Levitte | ea24195 | 2016-10-12 15:30:08 +0200 | [diff] [blame] | 2273 | # We recognise C++, C and asm files |
| 2274 | if ($s =~ /\.(cc|cpp|c|s|S)$/) { |
Richard Levitte | 507f838 | 2021-01-10 09:08:46 +0100 | [diff] [blame] | 2275 | push @{$check_exist{$s}}, $ddest; |
Richard Levitte | ea24195 | 2016-10-12 15:30:08 +0200 | [diff] [blame] | 2276 | $o =~ s/\.[csS]$/.o/; # C and assembler |
| 2277 | $o =~ s/\.(cc|cpp)$/_cc.o/; # C++ |
Richard Levitte | 2e96384 | 2016-02-10 02:00:37 +0100 | [diff] [blame] | 2278 | $o = cleanfile($buildd, $o, $blddir); |
Richard Levitte | bec2db1 | 2018-09-10 02:21:40 +0200 | [diff] [blame] | 2279 | $unified_info{sources}->{$ddest}->{$o} = -1; |
| 2280 | $unified_info{sources}->{$o}->{$s} = -1; |
Rich Salz | 8390062 | 2018-03-22 10:21:33 -0400 | [diff] [blame] | 2281 | } elsif ($s =~ /\.rc$/) { |
| 2282 | # We also recognise resource files |
Richard Levitte | 507f838 | 2021-01-10 09:08:46 +0100 | [diff] [blame] | 2283 | push @{$check_exist{$s}}, $ddest; |
Rich Salz | 8390062 | 2018-03-22 10:21:33 -0400 | [diff] [blame] | 2284 | $o =~ s/\.rc$/.res/; # Resource configuration |
Richard Levitte | 5e16ac1 | 2021-01-10 09:13:14 +0100 | [diff] [blame] | 2285 | $o = cleanfile($buildd, $o, $blddir); |
Richard Levitte | bec2db1 | 2018-09-10 02:21:40 +0200 | [diff] [blame] | 2286 | $unified_info{sources}->{$ddest}->{$o} = -1; |
| 2287 | $unified_info{sources}->{$o}->{$s} = -1; |
Richard Levitte | 9fe2bb7 | 2016-01-29 19:45:51 +0100 | [diff] [blame] | 2288 | } else { |
Richard Levitte | 507f838 | 2021-01-10 09:08:46 +0100 | [diff] [blame] | 2289 | push @{$check_exist{$s}}, $ddest; |
Richard Levitte | 9fe2bb7 | 2016-01-29 19:45:51 +0100 | [diff] [blame] | 2290 | $unified_info{sources}->{$ddest}->{$s} = 1; |
| 2291 | } |
Richard Levitte | dd05c79 | 2021-05-18 18:21:51 +0200 | [diff] [blame] | 2292 | # 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 Levitte | 9fe2bb7 | 2016-01-29 19:45:51 +0100 | [diff] [blame] | 2303 | } |
| 2304 | } |
| 2305 | |
Richard Levitte | 2a08d1a | 2016-03-29 16:45:03 +0200 | [diff] [blame] | 2306 | foreach (keys %shared_sources) { |
| 2307 | my $dest = $_; |
| 2308 | my $ddest = cleanfile($buildd, $_, $blddir); |
Richard Levitte | 2a08d1a | 2016-03-29 16:45:03 +0200 | [diff] [blame] | 2309 | foreach (@{$shared_sources{$dest}}) { |
| 2310 | my $s = cleanfile($sourced, $_, $blddir); |
| 2311 | |
Richard Levitte | 19cf440 | 2020-02-26 14:42:10 +0100 | [diff] [blame] | 2312 | # 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 Levitte | 2a08d1a | 2016-03-29 16:45:03 +0200 | [diff] [blame] | 2315 | $s = cleanfile($buildd, $_, $blddir); |
| 2316 | } |
Richard Levitte | ccce3e1 | 2017-12-01 15:43:43 +0100 | [diff] [blame] | 2317 | |
Richard Levitte | dd05c79 | 2021-05-18 18:21:51 +0200 | [diff] [blame] | 2318 | my $o = $_; |
Richard Levitte | ea24195 | 2016-10-12 15:30:08 +0200 | [diff] [blame] | 2319 | if ($s =~ /\.(cc|cpp|c|s|S)$/) { |
Richard Levitte | ccce3e1 | 2017-12-01 15:43:43 +0100 | [diff] [blame] | 2320 | # We recognise C++, C and asm files |
Richard Levitte | 507f838 | 2021-01-10 09:08:46 +0100 | [diff] [blame] | 2321 | push @{$check_exist{$s}}, $ddest; |
Richard Levitte | ea24195 | 2016-10-12 15:30:08 +0200 | [diff] [blame] | 2322 | $o =~ s/\.[csS]$/.o/; # C and assembler |
| 2323 | $o =~ s/\.(cc|cpp)$/_cc.o/; # C++ |
Richard Levitte | 2a08d1a | 2016-03-29 16:45:03 +0200 | [diff] [blame] | 2324 | $o = cleanfile($buildd, $o, $blddir); |
Richard Levitte | bec2db1 | 2018-09-10 02:21:40 +0200 | [diff] [blame] | 2325 | $unified_info{shared_sources}->{$ddest}->{$o} = -1; |
| 2326 | $unified_info{sources}->{$o}->{$s} = -1; |
Richard Levitte | ccce3e1 | 2017-12-01 15:43:43 +0100 | [diff] [blame] | 2327 | } elsif ($s =~ /\.rc$/) { |
| 2328 | # We also recognise resource files |
Richard Levitte | 507f838 | 2021-01-10 09:08:46 +0100 | [diff] [blame] | 2329 | push @{$check_exist{$s}}, $ddest; |
Richard Levitte | ccce3e1 | 2017-12-01 15:43:43 +0100 | [diff] [blame] | 2330 | $o =~ s/\.rc$/.res/; # Resource configuration |
Richard Levitte | 5e16ac1 | 2021-01-10 09:13:14 +0100 | [diff] [blame] | 2331 | $o = cleanfile($buildd, $o, $blddir); |
Richard Levitte | bec2db1 | 2018-09-10 02:21:40 +0200 | [diff] [blame] | 2332 | $unified_info{shared_sources}->{$ddest}->{$o} = -1; |
| 2333 | $unified_info{sources}->{$o}->{$s} = -1; |
Richard Levitte | ef2dfc9 | 2018-09-30 14:44:59 +0200 | [diff] [blame] | 2334 | } elsif ($s =~ /\.ld$/) { |
| 2335 | # We also recognise linker scripts (or corresponding) |
Richard Levitte | ccce3e1 | 2017-12-01 15:43:43 +0100 | [diff] [blame] | 2336 | # We know they are generated files |
Richard Levitte | 507f838 | 2021-01-10 09:08:46 +0100 | [diff] [blame] | 2337 | push @{$check_exist{$s}}, $ddest; |
Richard Levitte | dd05c79 | 2021-05-18 18:21:51 +0200 | [diff] [blame] | 2338 | $o = cleanfile($buildd, $_, $blddir); |
| 2339 | $unified_info{shared_sources}->{$ddest}->{$o} = 1; |
Richard Levitte | 2a08d1a | 2016-03-29 16:45:03 +0200 | [diff] [blame] | 2340 | } else { |
| 2341 | die "unrecognised source file type for shared library: $s\n"; |
| 2342 | } |
Richard Levitte | dd05c79 | 2021-05-18 18:21:51 +0200 | [diff] [blame] | 2343 | # 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 Levitte | 2a08d1a | 2016-03-29 16:45:03 +0200 | [diff] [blame] | 2354 | } |
| 2355 | } |
| 2356 | |
Richard Levitte | ae4c745 | 2016-03-07 14:37:00 +0100 | [diff] [blame] | 2357 | foreach (keys %generate) { |
| 2358 | my $dest = $_; |
| 2359 | my $ddest = cleanfile($buildd, $_, $blddir); |
Richard Levitte | ae4c745 | 2016-03-07 14:37:00 +0100 | [diff] [blame] | 2360 | die "more than one generator for $dest: " |
Richard Levitte | cff64af | 2019-11-20 14:58:20 +0100 | [diff] [blame] | 2361 | ,join(" ", @{$generate{$_}}),"\n" |
| 2362 | if scalar @{$generate{$_}} > 1; |
Richard Levitte | ae4c745 | 2016-03-07 14:37:00 +0100 | [diff] [blame] | 2363 | my @generator = split /\s+/, $generate{$dest}->[0]; |
Richard Levitte | cff64af | 2019-11-20 14:58:20 +0100 | [diff] [blame] | 2364 | my $gen = $generator[0]; |
| 2365 | $generator[0] = cleanfile($sourced, $gen, $blddir); |
| 2366 | |
Richard Levitte | 19cf440 | 2020-02-26 14:42:10 +0100 | [diff] [blame] | 2367 | # If the generator is itself generated, it's in the build tree |
Richard Levitte | 79f47ef | 2021-02-25 17:43:57 +0100 | [diff] [blame] | 2368 | if ($generate{$gen} || ! -f $generator[0]) { |
Richard Levitte | cff64af | 2019-11-20 14:58:20 +0100 | [diff] [blame] | 2369 | $generator[0] = cleanfile($buildd, $gen, $blddir); |
| 2370 | } |
Richard Levitte | 2497e2e | 2021-01-10 09:26:22 +0100 | [diff] [blame] | 2371 | $check_generate{$ddest}->{$generator[0]}++; |
Richard Levitte | cff64af | 2019-11-20 14:58:20 +0100 | [diff] [blame] | 2372 | |
Richard Levitte | ae4c745 | 2016-03-07 14:37:00 +0100 | [diff] [blame] | 2373 | $unified_info{generate}->{$ddest} = [ @generator ]; |
| 2374 | } |
| 2375 | |
Richard Levitte | 9fe2bb7 | 2016-01-29 19:45:51 +0100 | [diff] [blame] | 2376 | foreach (keys %depends) { |
| 2377 | my $dest = $_; |
Richard Levitte | 3f399e3 | 2021-02-25 16:55:39 +0100 | [diff] [blame] | 2378 | my $ddest = $dest; |
Richard Levitte | 8d34daf | 2016-04-21 14:30:08 +0200 | [diff] [blame] | 2379 | |
Richard Levitte | 3f399e3 | 2021-02-25 16:55:39 +0100 | [diff] [blame] | 2380 | 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 Levitte | 9fe2bb7 | 2016-01-29 19:45:51 +0100 | [diff] [blame] | 2394 | } |
| 2395 | foreach (@{$depends{$dest}}) { |
Richard Levitte | 2e96384 | 2016-02-10 02:00:37 +0100 | [diff] [blame] | 2396 | my $d = cleanfile($sourced, $_, $blddir); |
Richard Levitte | 2d101b0 | 2021-03-18 05:07:11 +0100 | [diff] [blame] | 2397 | my $d2 = cleanfile($buildd, $_, $blddir); |
Richard Levitte | 9fe2bb7 | 2016-01-29 19:45:51 +0100 | [diff] [blame] | 2398 | |
Richard Levitte | e737d7b | 2016-02-11 15:22:27 +0100 | [diff] [blame] | 2399 | # 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 Levitte | 19cf440 | 2020-02-26 14:42:10 +0100 | [diff] [blame] | 2401 | # in the build tree rather than the source tree. |
Richard Levitte | 846e4c4 | 2018-03-08 12:01:28 +0100 | [diff] [blame] | 2402 | if ($d eq $src_configdata |
Richard Levitte | 2d101b0 | 2021-03-18 05:07:11 +0100 | [diff] [blame] | 2403 | || (grep { $d2 eq $_ } |
| 2404 | keys %{$unified_info{generate}}) |
Richard Levitte | 19cf440 | 2020-02-26 14:42:10 +0100 | [diff] [blame] | 2405 | || ! -f $d) { |
Richard Levitte | 2d101b0 | 2021-03-18 05:07:11 +0100 | [diff] [blame] | 2406 | $d = $d2; |
Richard Levitte | 9fe2bb7 | 2016-01-29 19:45:51 +0100 | [diff] [blame] | 2407 | } |
Richard Levitte | 9fe2bb7 | 2016-01-29 19:45:51 +0100 | [diff] [blame] | 2408 | $unified_info{depends}->{$ddest}->{$d} = 1; |
Richard Levitte | 9eba593 | 2019-10-04 00:00:24 +0200 | [diff] [blame] | 2409 | |
| 2410 | # Fix up associated attributes |
| 2411 | $unified_info{attributes}->{depends}->{$ddest}->{$d} = |
| 2412 | $attributes{depends}->{$dest}->{$_} |
| 2413 | if defined $attributes{depends}->{$dest}->{$_}; |
Richard Levitte | 9fe2bb7 | 2016-01-29 19:45:51 +0100 | [diff] [blame] | 2414 | } |
| 2415 | } |
| 2416 | |
| 2417 | foreach (keys %includes) { |
| 2418 | my $dest = $_; |
Richard Levitte | 8d34daf | 2016-04-21 14:30:08 +0200 | [diff] [blame] | 2419 | 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 Levitte | 846e4c4 | 2018-03-08 12:01:28 +0100 | [diff] [blame] | 2423 | if ($ddest eq $src_configdata || ! -f $ddest) { |
Richard Levitte | 8d34daf | 2016-04-21 14:30:08 +0200 | [diff] [blame] | 2424 | $ddest = cleanfile($buildd, $_, $blddir); |
Richard Levitte | 9fe2bb7 | 2016-01-29 19:45:51 +0100 | [diff] [blame] | 2425 | } |
| 2426 | foreach (@{$includes{$dest}}) { |
Richard Levitte | 4748f89 | 2016-06-29 22:51:42 +0200 | [diff] [blame] | 2427 | 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 Levitte | 9fe2bb7 | 2016-01-29 19:45:51 +0100 | [diff] [blame] | 2433 | } |
| 2434 | } |
Richard Levitte | b96ab5e | 2016-10-14 16:56:34 +0200 | [diff] [blame] | 2435 | |
Richard Levitte | ef57f79 | 2019-08-23 17:16:48 +0200 | [diff] [blame] | 2436 | foreach my $dest (keys %defines) { |
| 2437 | my $ddest; |
Richard Levitte | b96ab5e | 2016-10-14 16:56:34 +0200 | [diff] [blame] | 2438 | |
Richard Levitte | ef57f79 | 2019-08-23 17:16:48 +0200 | [diff] [blame] | 2439 | 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 Levitte | b96ab5e | 2016-10-14 16:56:34 +0200 | [diff] [blame] | 2446 | } |
| 2447 | } |
Richard Levitte | ef57f79 | 2019-08-23 17:16:48 +0200 | [diff] [blame] | 2448 | foreach my $v (@{$defines{$dest}}) { |
| 2449 | $v =~ m|^([^=]*)(=.*)?$|; |
Richard Levitte | b96ab5e | 2016-10-14 16:56:34 +0200 | [diff] [blame] | 2450 | die "0 length macro name not permitted\n" if $1 eq ""; |
Richard Levitte | ef57f79 | 2019-08-23 17:16:48 +0200 | [diff] [blame] | 2451 | 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 Levitte | b96ab5e | 2016-10-14 16:56:34 +0200 | [diff] [blame] | 2460 | } |
| 2461 | } |
Richard Levitte | 829f86b | 2016-08-31 22:54:39 +0200 | [diff] [blame] | 2462 | |
Pauli | d594d2e | 2021-05-21 15:16:39 +1000 | [diff] [blame] | 2463 | 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 Levitte | 829f86b | 2016-08-31 22:54:39 +0200 | [diff] [blame] | 2470 | 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 Levitte | 9fe2bb7 | 2016-01-29 19:45:51 +0100 | [diff] [blame] | 2483 | } |
| 2484 | |
Richard Levitte | d201dbc | 2017-12-28 16:03:17 +0100 | [diff] [blame] | 2485 | my $ordinals_text = join(', ', sort keys %ordinals); |
| 2486 | warn <<"EOF" if $ordinals_text; |
| 2487 | |
| 2488 | WARNING: ORDINALS were specified for $ordinals_text |
| 2489 | They are ignored and should be replaced with a combination of GENERATE, |
| 2490 | DEPEND and SHARED_SOURCE. |
| 2491 | EOF |
| 2492 | |
Richard Levitte | 507f838 | 2021-01-10 09:08:46 +0100 | [diff] [blame] | 2493 | # 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 Levitte | 2497e2e | 2021-01-10 09:26:22 +0100 | [diff] [blame] | 2502 | if ($check_generate{$_}->{$generators[0]} > 1) { |
| 2503 | warn "INFO: $_ has more than one GENERATE declaration (same generator)\n" |
| 2504 | } |
Richard Levitte | 507f838 | 2021-01-10 09:08:46 +0100 | [diff] [blame] | 2505 | } |
| 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 Levitte | 51583cb | 2019-06-11 18:11:25 +0200 | [diff] [blame] | 2547 | |
| 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 Levitte | 1b5ad51 | 2018-01-23 19:07:14 +0100 | [diff] [blame] | 2575 | # Massage the result |
| 2576 | |
Richard Levitte | e431bcf | 2018-01-23 19:13:48 +0100 | [diff] [blame] | 2577 | # 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 Levitte | 906032d | 2018-03-07 15:58:04 +0100 | [diff] [blame] | 2583 | 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 Levitte | e431bcf | 2018-01-23 19:13:48 +0100 | [diff] [blame] | 2589 | } |
| 2590 | } |
| 2591 | |
Richard Levitte | ef2dfc9 | 2018-09-30 14:44:59 +0200 | [diff] [blame] | 2592 | # Go through all intermediary files and change their names to something that |
Richard Levitte | bec2db1 | 2018-09-10 02:21:40 +0200 | [diff] [blame] | 2593 | # 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 Levitte | 1842f36 | 2019-01-31 00:06:50 +0100 | [diff] [blame] | 2615 | foreach my $prodtype (('programs', 'libraries', 'modules', 'scripts')) { |
Richard Levitte | bec2db1 | 2018-09-10 02:21:40 +0200 | [diff] [blame] | 2616 | # $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 Levitte | 22b4146 | 2019-03-31 15:14:00 +0200 | [diff] [blame] | 2631 | modules => { dso => { src => [ 'sources' ], |
| 2632 | dst => 'sources' } }, |
Richard Levitte | bec2db1 | 2018-09-10 02:21:40 +0200 | [diff] [blame] | 2633 | scripts => { script => { src => [ 'sources' ], |
| 2634 | dst => 'sources' } } |
| 2635 | } -> {$prodtype}; |
| 2636 | foreach my $kind (keys %$intent) { |
Richard Levitte | 856b1b6 | 2018-11-15 21:37:55 +0100 | [diff] [blame] | 2637 | next if ($intent->{$kind}->{dst} eq 'shared_sources' |
| 2638 | && $disabled{shared}); |
| 2639 | |
Richard Levitte | bec2db1 | 2018-09-10 02:21:40 +0200 | [diff] [blame] | 2640 | 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 Levitte | ef2dfc9 | 2018-09-30 14:44:59 +0200 | [diff] [blame] | 2651 | # Only affect object files and resource files, |
| 2652 | # the others simply get a new value |
| 2653 | # (+1 instead of -1) |
Richard Levitte | bec2db1 | 2018-09-10 02:21:40 +0200 | [diff] [blame] | 2654 | 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 Levitte | dd05c79 | 2021-05-18 18:21:51 +0200 | [diff] [blame] | 2664 | # 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 Levitte | bec2db1 | 2018-09-10 02:21:40 +0200 | [diff] [blame] | 2677 | } |
| 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 Levitte | 51583cb | 2019-06-11 18:11:25 +0200 | [diff] [blame] | 2698 | |
Richard Levitte | bec2db1 | 2018-09-10 02:21:40 +0200 | [diff] [blame] | 2699 | # 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 Levitte | 9fe2bb7 | 2016-01-29 19:45:51 +0100 | [diff] [blame] | 2704 | ### Make unified_info a bit more efficient |
| 2705 | # One level structures |
Richard Levitte | 3f399e3 | 2021-02-25 16:55:39 +0100 | [diff] [blame] | 2706 | foreach (("programs", "libraries", "modules", "scripts", "targets")) { |
Richard Levitte | 9fe2bb7 | 2016-01-29 19:45:51 +0100 | [diff] [blame] | 2707 | $unified_info{$_} = [ sort keys %{$unified_info{$_}} ]; |
| 2708 | } |
| 2709 | # Two level structures |
Richard Levitte | 829f86b | 2016-08-31 22:54:39 +0200 | [diff] [blame] | 2710 | foreach my $l1 (("sources", "shared_sources", "ldadd", "depends", |
Pauli | d594d2e | 2021-05-21 15:16:39 +1000 | [diff] [blame] | 2711 | "imagedocs", "htmldocs", "mandocs")) { |
Richard Levitte | 9fe2bb7 | 2016-01-29 19:45:51 +0100 | [diff] [blame] | 2712 | foreach my $l2 (sort keys %{$unified_info{$l1}}) { |
Richard Levitte | bec2db1 | 2018-09-10 02:21:40 +0200 | [diff] [blame] | 2713 | 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 Levitte | 9fe2bb7 | 2016-01-29 19:45:51 +0100 | [diff] [blame] | 2722 | } |
| 2723 | } |
Richard Levitte | b96ab5e | 2016-10-14 16:56:34 +0200 | [diff] [blame] | 2724 | # 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 Levitte | 4748f89 | 2016-06-29 22:51:42 +0200 | [diff] [blame] | 2730 | # Includes |
| 2731 | foreach my $dest (sort keys %{$unified_info{includes}}) { |
| 2732 | if (defined($unified_info{includes}->{$dest}->{build})) { |
Richard Levitte | e431bcf | 2018-01-23 19:13:48 +0100 | [diff] [blame] | 2733 | my @source_includes = (); |
| 2734 | @source_includes = ( @{$unified_info{includes}->{$dest}->{source}} ) |
| 2735 | if defined($unified_info{includes}->{$dest}->{source}); |
Richard Levitte | 4748f89 | 2016-06-29 22:51:42 +0200 | [diff] [blame] | 2736 | $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 Levitte | 609e4be | 2018-09-10 02:18:22 +0200 | [diff] [blame] | 2742 | } elsif (defined($unified_info{includes}->{$dest}->{source})) { |
Richard Levitte | 4748f89 | 2016-06-29 22:51:42 +0200 | [diff] [blame] | 2743 | $unified_info{includes}->{$dest} = |
| 2744 | [ @{$unified_info{includes}->{$dest}->{source}} ]; |
Richard Levitte | 609e4be | 2018-09-10 02:18:22 +0200 | [diff] [blame] | 2745 | } else { |
| 2746 | delete $unified_info{includes}->{$dest}; |
Richard Levitte | 4748f89 | 2016-06-29 22:51:42 +0200 | [diff] [blame] | 2747 | } |
| 2748 | } |
Richard Levitte | b6e6607 | 2018-10-21 11:11:04 +0200 | [diff] [blame] | 2749 | |
| 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 Levitte | 1842f36 | 2019-01-31 00:06:50 +0100 | [diff] [blame] | 2755 | "dso" => [ @{$unified_info{modules}} ], |
Richard Levitte | b6e6607 | 2018-10-21 11:11:04 +0200 | [diff] [blame] | 2756 | "bin" => [ @{$unified_info{programs}} ], |
Richard Levitte | 829f86b | 2016-08-31 22:54:39 +0200 | [diff] [blame] | 2757 | "script" => [ @{$unified_info{scripts}} ], |
Pauli | d594d2e | 2021-05-21 15:16:39 +1000 | [diff] [blame] | 2758 | "docs" => [ (map { @{$unified_info{imagedocs}->{$_} // []} } |
| 2759 | keys %{$unified_info{imagedocs} // {}}), |
| 2760 | (map { @{$unified_info{htmldocs}->{$_} // []} } |
Richard Levitte | 829f86b | 2016-08-31 22:54:39 +0200 | [diff] [blame] | 2761 | keys %{$unified_info{htmldocs} // {}}), |
| 2762 | (map { @{$unified_info{mandocs}->{$_} // []} } |
| 2763 | keys %{$unified_info{mandocs} // {}}) ] ); |
Richard Levitte | b6e6607 | 2018-10-21 11:11:04 +0200 | [diff] [blame] | 2764 | foreach my $type (keys %loopinfo) { |
| 2765 | foreach my $product (@{$loopinfo{$type}}) { |
| 2766 | my %dirs = (); |
| 2767 | my $pd = dirname($product); |
| 2768 | |
Richard Levitte | 3bed01a | 2018-11-01 13:55:32 +0100 | [diff] [blame] | 2769 | foreach (@{$unified_info{sources}->{$product} // []}, |
Richard Levitte | b6e6607 | 2018-10-21 11:11:04 +0200 | [diff] [blame] | 2770 | @{$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 Levitte | 9fe2bb7 | 2016-01-29 19:45:51 +0100 | [diff] [blame] | 2791 | } |
| 2792 | |
| 2793 | # For the schemes that need it, we provide the old *_obj configs |
| 2794 | # from the *_asm_obj ones |
Richard Levitte | 3a55c92 | 2016-02-18 18:43:56 +0100 | [diff] [blame] | 2795 | foreach (grep /_(asm|aux)_src$/, keys %target) { |
Richard Levitte | 9fe2bb7 | 2016-01-29 19:45:51 +0100 | [diff] [blame] | 2796 | my $src = $_; |
Richard Levitte | 3a55c92 | 2016-02-18 18:43:56 +0100 | [diff] [blame] | 2797 | (my $obj = $_) =~ s/_(asm|aux)_src$/_obj/; |
Richard Levitte | ea24195 | 2016-10-12 15:30:08 +0200 | [diff] [blame] | 2798 | $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 Levitte | 9fe2bb7 | 2016-01-29 19:45:51 +0100 | [diff] [blame] | 2801 | } |
| 2802 | |
Richard Levitte | 291e94d | 2015-05-18 22:35:23 +0200 | [diff] [blame] | 2803 | # Write down our configuration where it fits ######################### |
| 2804 | |
Richard Levitte | 1f86b82 | 2019-08-25 10:46:22 +0200 | [diff] [blame] | 2805 | my %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 Levitte | 291e94d | 2015-05-18 22:35:23 +0200 | [diff] [blame] | 2818 | ); |
Richard Levitte | 1f86b82 | 2019-08-25 10:46:22 +0200 | [diff] [blame] | 2819 | my $configdata_outname = 'configdata.pm'; |
| 2820 | print "Creating $configdata_outname\n"; |
| 2821 | open CONFIGDATA, ">$configdata_outname.new" |
Richard Levitte | 2660b7c | 2021-05-17 14:33:16 +0200 | [diff] [blame] | 2822 | or die "Trying to create $configdata_outname.new: $!"; |
Richard Levitte | 1f86b82 | 2019-08-25 10:46:22 +0200 | [diff] [blame] | 2823 | my $configdata_tmplname = cleanfile($srcdir, "configdata.pm.in", $blddir); |
| 2824 | my $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; |
| 2835 | close CONFIGDATA; |
| 2836 | rename "$configdata_outname.new", $configdata_outname; |
Richard Levitte | b1fafff | 2018-01-29 06:19:17 +0100 | [diff] [blame] | 2837 | if ($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 Laurie | cba5068 | 1999-03-07 14:05:36 +0000 | [diff] [blame] | 2842 | |
Richard Levitte | 1f86b82 | 2019-08-25 10:46:22 +0200 | [diff] [blame] | 2843 | print "Running $configdata_outname\n"; |
| 2844 | my $perlcmd = (quotify("maybeshell", $config{PERL}))[0]; |
| 2845 | my $cmd = "$perlcmd $configdata_outname"; |
| 2846 | #print STDERR "DEBUG[run_dofile]: \$cmd = $cmd\n"; |
| 2847 | system($cmd); |
| 2848 | exit 1 if $? != 0; |
Felix Laurie von Massenbach | fce0ba5 | 2014-05-26 17:19:28 +0100 | [diff] [blame] | 2849 | |
Richard Levitte | 8937a4e | 2018-07-24 10:45:05 +0200 | [diff] [blame] | 2850 | $SIG{__DIE__} = $orig_death_handler; |
| 2851 | |
Richard Levitte | 9c62a27 | 2016-02-27 16:51:34 +0100 | [diff] [blame] | 2852 | print <<"EOF" if ($disabled{threads} eq "unavailable"); |
Bodo Möller | 5f8d5c9 | 1999-04-29 16:10:09 +0000 | [diff] [blame] | 2853 | |
| 2854 | The library could not be configured for supporting multi-threaded |
| 2855 | applications as the compiler options required on this system are not known. |
Richard Levitte | f828ba0 | 2020-04-27 09:08:36 +0200 | [diff] [blame] | 2856 | See file INSTALL.md for details if you need multi-threading. |
Bodo Möller | ec57782 | 1999-04-23 22:13:45 +0000 | [diff] [blame] | 2857 | EOF |
| 2858 | |
Richard Levitte | 76ffb43 | 2015-05-18 02:46:21 +0200 | [diff] [blame] | 2859 | print <<"EOF" if ($no_shared_warn); |
Richard Levitte | 2964ba8 | 2003-01-11 11:40:39 +0000 | [diff] [blame] | 2860 | |
Richard Levitte | ae48242 | 2016-02-22 02:09:11 +0100 | [diff] [blame] | 2861 | The options 'shared', 'pic' and 'dynamic-engine' aren't supported on this |
| 2862 | platform, 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 |
| 2864 | or position independent code, please let us know (but please first make sure |
| 2865 | you have tried with a current version of OpenSSL). |
Rich Salz | 2e31ef0 | 2015-12-10 12:31:01 -0500 | [diff] [blame] | 2866 | EOF |
| 2867 | |
Rich Salz | d0364dc | 2021-05-12 10:42:46 -0400 | [diff] [blame] | 2868 | print $banner; |
Richard Levitte | 820e414 | 2018-02-02 12:30:50 +0100 | [diff] [blame] | 2869 | |
Ralf S. Engelschall | d02b48c | 1998-12-21 10:52:47 +0000 | [diff] [blame] | 2870 | exit(0); |
| 2871 | |
Richard Levitte | bd5192b | 2015-05-18 02:57:24 +0200 | [diff] [blame] | 2872 | ###################################################################### |
| 2873 | # |
| 2874 | # Helpers and utility functions |
| 2875 | # |
| 2876 | |
Richard Levitte | 8937a4e | 2018-07-24 10:45:05 +0200 | [diff] [blame] | 2877 | # Death handler, to print a helpful message in case of failure ####### |
| 2878 | # |
| 2879 | sub death_handler { |
Richard Levitte | eb807d5 | 2018-07-24 21:46:55 +0200 | [diff] [blame] | 2880 | die @_ if $^S; # To prevent the added message in eval blocks |
Richard Levitte | 8937a4e | 2018-07-24 10:45:05 +0200 | [diff] [blame] | 2881 | my $build_file = $target{build_file} // "build file"; |
Richard Levitte | eb807d5 | 2018-07-24 21:46:55 +0200 | [diff] [blame] | 2882 | my @message = ( <<"_____", @_ ); |
Richard Levitte | 8937a4e | 2018-07-24 10:45:05 +0200 | [diff] [blame] | 2883 | |
| 2884 | Failure! $build_file wasn't produced. |
Dr. David von Oheimb | 1dc1ea1 | 2020-06-10 17:49:25 +0200 | [diff] [blame] | 2885 | Please read INSTALL.md and associated NOTES-* files. You may also have to |
Richard Levitte | f828ba0 | 2020-04-27 09:08:36 +0200 | [diff] [blame] | 2886 | look over your available compiler tool chain or change your configuration. |
Richard Levitte | 8937a4e | 2018-07-24 10:45:05 +0200 | [diff] [blame] | 2887 | |
| 2888 | _____ |
Richard Levitte | eb807d5 | 2018-07-24 21:46:55 +0200 | [diff] [blame] | 2889 | |
| 2890 | # Dying is terminal, so it's ok to reset the signal handler here. |
| 2891 | $SIG{__DIE__} = $orig_death_handler; |
| 2892 | die @message; |
Richard Levitte | 8937a4e | 2018-07-24 10:45:05 +0200 | [diff] [blame] | 2893 | } |
| 2894 | |
Richard Levitte | bd5192b | 2015-05-18 02:57:24 +0200 | [diff] [blame] | 2895 | # Configuration file reading ######################################### |
| 2896 | |
Richard Levitte | 1f2e1cd | 2016-03-17 09:09:31 +0100 | [diff] [blame] | 2897 | # 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 Levitte | 1f2e1cd | 2016-03-17 09:09:31 +0100 | [diff] [blame] | 2902 | # 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 | # |
| 2920 | sub 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 | # |
| 2932 | sub 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 | # |
| 2942 | sub threads { |
| 2943 | my @flags = @_; |
| 2944 | return sub { add($disabled{threads} ? () : @flags)->(); } |
| 2945 | } |
| 2946 | |
Andy Polyakov | 60aa6c1 | 2018-06-11 12:22:29 +0200 | [diff] [blame] | 2947 | sub shared { |
| 2948 | my @flags = @_; |
| 2949 | return sub { add($disabled{shared} ? () : @flags)->(); } |
| 2950 | } |
Richard Levitte | 1f2e1cd | 2016-03-17 09:09:31 +0100 | [diff] [blame] | 2951 | |
Richard Levitte | 9c62a27 | 2016-02-27 16:51:34 +0100 | [diff] [blame] | 2952 | our $add_called = 0; |
Richard Levitte | 8808741 | 2015-05-18 14:31:49 +0200 | [diff] [blame] | 2953 | # Helper function to implement adding values to already existing configuration |
| 2954 | # values. It handles elements that are ARRAYs, CODEs and scalars |
| 2955 | sub _add { |
| 2956 | my $separator = shift; |
| 2957 | |
Richard Levitte | bcb1977 | 2016-01-30 02:17:05 +0100 | [diff] [blame] | 2958 | # 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 Levitte | 8808741 | 2015-05-18 14:31:49 +0200 | [diff] [blame] | 2962 | |
| 2963 | my @values = |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 2964 | 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 Levitte | 8808741 | 2015-05-18 14:31:49 +0200 | [diff] [blame] | 2979 | } (@_); |
| 2980 | |
Richard Levitte | 9c62a27 | 2016-02-27 16:51:34 +0100 | [diff] [blame] | 2981 | $add_called = 1; |
| 2982 | |
Richard Levitte | 8808741 | 2015-05-18 14:31:49 +0200 | [diff] [blame] | 2983 | if ($found_array) { |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 2984 | [ @values ]; |
Richard Levitte | 8808741 | 2015-05-18 14:31:49 +0200 | [diff] [blame] | 2985 | } else { |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 2986 | join($separator, grep { defined($_) && $_ ne "" } @values); |
Richard Levitte | 8808741 | 2015-05-18 14:31:49 +0200 | [diff] [blame] | 2987 | } |
| 2988 | } |
| 2989 | sub add_before { |
Richard Levitte | bdcd83e | 2016-02-25 00:17:59 +0100 | [diff] [blame] | 2990 | my $separator = " "; |
| 2991 | if (ref($_[$#_]) eq "HASH") { |
| 2992 | my $opts = pop; |
| 2993 | $separator = $opts->{separator}; |
| 2994 | } |
Richard Levitte | 8808741 | 2015-05-18 14:31:49 +0200 | [diff] [blame] | 2995 | my @x = @_; |
| 2996 | sub { _add($separator, @x, @_) }; |
| 2997 | } |
| 2998 | sub add { |
Richard Levitte | bdcd83e | 2016-02-25 00:17:59 +0100 | [diff] [blame] | 2999 | my $separator = " "; |
| 3000 | if (ref($_[$#_]) eq "HASH") { |
| 3001 | my $opts = pop; |
| 3002 | $separator = $opts->{separator}; |
| 3003 | } |
Richard Levitte | 8808741 | 2015-05-18 14:31:49 +0200 | [diff] [blame] | 3004 | my @x = @_; |
| 3005 | sub { _add($separator, @_, @x) }; |
| 3006 | } |
| 3007 | |
Richard Levitte | 3b6c4b0 | 2017-12-01 15:29:05 +0100 | [diff] [blame] | 3008 | sub 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 Levitte | bd5192b | 2015-05-18 02:57:24 +0200 | [diff] [blame] | 3028 | # 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. |
| 3031 | sub read_config { |
| 3032 | my $fname = shift; |
Richard Levitte | 3b6c4b0 | 2017-12-01 15:29:05 +0100 | [diff] [blame] | 3033 | my %targets; |
| 3034 | |
Richard Levitte | bd5192b | 2015-05-18 02:57:24 +0200 | [diff] [blame] | 3035 | { |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 3036 | # Protect certain tables from tampering |
| 3037 | local %table = (); |
Richard Levitte | bd5192b | 2015-05-18 02:57:24 +0200 | [diff] [blame] | 3038 | |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 3039 | %targets = read_eval_file($fname); |
Richard Levitte | bd5192b | 2015-05-18 02:57:24 +0200 | [diff] [blame] | 3040 | } |
Richard Levitte | 225f980 | 2018-01-09 19:51:19 +0100 | [diff] [blame] | 3041 | my %preexisting = (); |
| 3042 | foreach (sort keys %targets) { |
| 3043 | $preexisting{$_} = 1 if $table{$_}; |
| 3044 | } |
| 3045 | die <<"EOF", |
| 3046 | The following config targets from $fname |
| 3047 | shadow pre-existing config targets with the same name: |
| 3048 | EOF |
| 3049 | map { " $_\n" } sort keys %preexisting |
| 3050 | if %preexisting; |
| 3051 | |
Richard Levitte | bd5192b | 2015-05-18 02:57:24 +0200 | [diff] [blame] | 3052 | |
| 3053 | # For each target, check that it's configured with a hash table. |
| 3054 | foreach (keys %targets) { |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 3055 | 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 Levitte | ee9b0bb | 2016-09-14 22:21:41 +0200 | [diff] [blame] | 3063 | $targets{$_}->{_conf_fname_int} = add([ $fname ]); |
| 3064 | } |
Richard Levitte | bd5192b | 2015-05-18 02:57:24 +0200 | [diff] [blame] | 3065 | } |
| 3066 | |
| 3067 | %table = (%table, %targets); |
| 3068 | |
| 3069 | } |
| 3070 | |
FdaSilvaYY | 8483a00 | 2016-03-10 21:34:48 +0100 | [diff] [blame] | 3071 | # configuration resolver. Will only resolve all the lazy evaluation |
| 3072 | # codeblocks for the chosen target and all those it inherits from, |
Richard Levitte | bd5192b | 2015-05-18 02:57:24 +0200 | [diff] [blame] | 3073 | # recursively |
| 3074 | sub resolve_config { |
| 3075 | my $target = shift; |
| 3076 | my @breadcrumbs = @_; |
| 3077 | |
Richard Levitte | c471884 | 2016-03-09 17:18:07 +0100 | [diff] [blame] | 3078 | # my $extra_checks = defined($ENV{CONFIGURE_EXTRA_CHECKS}); |
Richard Levitte | 9c62a27 | 2016-02-27 16:51:34 +0100 | [diff] [blame] | 3079 | |
Richard Levitte | bd5192b | 2015-05-18 02:57:24 +0200 | [diff] [blame] | 3080 | if (grep { $_ eq $target } @breadcrumbs) { |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 3081 | die "inherit_from loop! target backtrace:\n " |
| 3082 | ,$target,"\n ",join("\n ", @breadcrumbs),"\n"; |
Richard Levitte | bd5192b | 2015-05-18 02:57:24 +0200 | [diff] [blame] | 3083 | } |
| 3084 | |
| 3085 | if (!defined($table{$target})) { |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 3086 | warn "Warning! target $target doesn't exist!\n"; |
| 3087 | return (); |
Richard Levitte | bd5192b | 2015-05-18 02:57:24 +0200 | [diff] [blame] | 3088 | } |
| 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. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 3097 | 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 Levitte | bd5192b | 2015-05-18 02:57:24 +0200 | [diff] [blame] | 3101 | |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 3102 | # 'template' is a marker that's considered private to |
| 3103 | # the config that had it. |
| 3104 | delete $inherited_config{template}; |
Richard Levitte | bd5192b | 2015-05-18 02:57:24 +0200 | [diff] [blame] | 3105 | |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 3106 | foreach (keys %inherited_config) { |
| 3107 | if (!$combined_inheritance{$_}) { |
| 3108 | $combined_inheritance{$_} = []; |
| 3109 | } |
| 3110 | push @{$combined_inheritance{$_}}, $inherited_config{$_}; |
| 3111 | } |
| 3112 | } |
Richard Levitte | bd5192b | 2015-05-18 02:57:24 +0200 | [diff] [blame] | 3113 | } |
| 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 |
FdaSilvaYY | 8483a00 | 2016-03-10 21:34:48 +0100 | [diff] [blame] | 3125 | # empty string, the inherited value list will be run through the |
Richard Levitte | bd5192b | 2015-05-18 02:57:24 +0200 | [diff] [blame] | 3126 | # 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 Levitte | a26d8be | 2016-02-26 12:25:13 +0100 | [diff] [blame] | 3130 | my $default_combiner = add(); |
Richard Levitte | bd5192b | 2015-05-18 02:57:24 +0200 | [diff] [blame] | 3131 | |
| 3132 | my %all_keys = |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 3133 | map { $_ => 1 } (keys %combined_inheritance, |
| 3134 | keys %{$table{$target}}); |
Richard Levitte | b0b92a5 | 2016-02-27 11:08:21 +0100 | [diff] [blame] | 3135 | |
| 3136 | sub process_values { |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 3137 | my $object = shift; |
| 3138 | my $inherited = shift; # Always a [ list ] |
| 3139 | my $target = shift; |
| 3140 | my $entry = shift; |
Richard Levitte | b0b92a5 | 2016-02-27 11:08:21 +0100 | [diff] [blame] | 3141 | |
Richard Levitte | 9c62a27 | 2016-02-27 16:51:34 +0100 | [diff] [blame] | 3142 | $add_called = 0; |
| 3143 | |
Richard Levitte | b0b92a5 | 2016-02-27 11:08:21 +0100 | [diff] [blame] | 3144 | while(ref($object) eq "CODE") { |
| 3145 | $object = $object->(@$inherited); |
| 3146 | } |
| 3147 | if (!defined($object)) { |
| 3148 | return (); |
| 3149 | } |
| 3150 | elsif (ref($object) eq "ARRAY") { |
Richard Levitte | 9c62a27 | 2016-02-27 16:51:34 +0100 | [diff] [blame] | 3151 | local $add_called; # To make sure recursive calls don't affect it |
Richard Levitte | b0b92a5 | 2016-02-27 11:08:21 +0100 | [diff] [blame] | 3152 | 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 Roussos | a595e32 | 2021-12-20 19:14:57 +0100 | [diff] [blame] | 3162 | foreach my $key (sort keys %all_keys) { |
| 3163 | my $previous = $combined_inheritance{$key}; |
Richard Levitte | bd5192b | 2015-05-18 02:57:24 +0200 | [diff] [blame] | 3164 | |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 3165 | # 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 Roussos | a595e32 | 2021-12-20 19:14:57 +0100 | [diff] [blame] | 3168 | if (!exists $table{$target}->{$key}) { |
| 3169 | $table{$target}->{$key} = $default_combiner; |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 3170 | } |
Richard Levitte | bd5192b | 2015-05-18 02:57:24 +0200 | [diff] [blame] | 3171 | |
Alexandros Roussos | a595e32 | 2021-12-20 19:14:57 +0100 | [diff] [blame] | 3172 | $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 Levitte | b0b92a5 | 2016-02-27 11:08:21 +0100 | [diff] [blame] | 3177 | } |
Richard Levitte | c471884 | 2016-03-09 17:18:07 +0100 | [diff] [blame] | 3178 | # if ($extra_checks && |
Alexandros Roussos | a595e32 | 2021-12-20 19:14:57 +0100 | [diff] [blame] | 3179 | # $previous && !($add_called || $previous ~~ $table{$target}->{$key})) { |
| 3180 | # warn "$key got replaced in $target\n"; |
Richard Levitte | c471884 | 2016-03-09 17:18:07 +0100 | [diff] [blame] | 3181 | # } |
Richard Levitte | bd5192b | 2015-05-18 02:57:24 +0200 | [diff] [blame] | 3182 | } |
| 3183 | |
| 3184 | # Finally done, return the result. |
| 3185 | return %{$table{$target}}; |
| 3186 | } |
| 3187 | |
Ulf Möller | 462ba4f | 1999-04-24 22:59:36 +0000 | [diff] [blame] | 3188 | sub usage |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 3189 | { |
| 3190 | print STDERR $usage; |
| 3191 | print STDERR "\npick os/compiler from:\n"; |
| 3192 | my $j=0; |
| 3193 | my $i; |
Ulf Möller | 10a926c | 2000-02-21 00:55:45 +0000 | [diff] [blame] | 3194 | my $k=0; |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 3195 | 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. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 3219 | exit(1); |
| 3220 | } |
Ralf S. Engelschall | d02b48c | 1998-12-21 10:52:47 +0000 | [diff] [blame] | 3221 | |
Richard Levitte | 6d75a83 | 2017-11-06 17:11:03 +0100 | [diff] [blame] | 3222 | sub compiler_predefined { |
| 3223 | state %predefined; |
Andy Polyakov | 41d6e0f | 2018-05-04 14:25:45 +0200 | [diff] [blame] | 3224 | my $cc = shift; |
Richard Levitte | 6d75a83 | 2017-11-06 17:11:03 +0100 | [diff] [blame] | 3225 | |
| 3226 | return () if $^O eq 'VMS'; |
| 3227 | |
Andy Polyakov | 41d6e0f | 2018-05-04 14:25:45 +0200 | [diff] [blame] | 3228 | die 'compiler_predefined called without a compiler command' |
| 3229 | unless $cc; |
Richard Levitte | 6d75a83 | 2017-11-06 17:11:03 +0100 | [diff] [blame] | 3230 | |
Andy Polyakov | 41d6e0f | 2018-05-04 14:25:45 +0200 | [diff] [blame] | 3231 | if (! $predefined{$cc}) { |
Richard Levitte | 6d75a83 | 2017-11-06 17:11:03 +0100 | [diff] [blame] | 3232 | |
Andy Polyakov | 41d6e0f | 2018-05-04 14:25:45 +0200 | [diff] [blame] | 3233 | $predefined{$cc} = {}; |
Richard Levitte | 6d75a83 | 2017-11-06 17:11:03 +0100 | [diff] [blame] | 3234 | |
| 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 Polyakov | 41d6e0f | 2018-05-04 14:25:45 +0200 | [diff] [blame] | 3239 | $predefined{$cc}->{$1} = $2 // ''; |
Richard Levitte | 6d75a83 | 2017-11-06 17:11:03 +0100 | [diff] [blame] | 3240 | } |
| 3241 | close(PIPE); |
| 3242 | } |
| 3243 | |
Andy Polyakov | 41d6e0f | 2018-05-04 14:25:45 +0200 | [diff] [blame] | 3244 | return %{$predefined{$cc}}; |
Richard Levitte | 6d75a83 | 2017-11-06 17:11:03 +0100 | [diff] [blame] | 3245 | } |
| 3246 | |
Andy Polyakov | 656bbdc | 2016-05-20 21:31:11 +0200 | [diff] [blame] | 3247 | sub 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 Levitte | 7ecdf18 | 2017-11-29 13:09:01 +0100 | [diff] [blame] | 3268 | sub env |
| 3269 | { |
| 3270 | my $name = shift; |
Richard Levitte | ac6ae8a | 2018-03-16 08:24:50 +0100 | [diff] [blame] | 3271 | my %opts = @_; |
Richard Levitte | 7ecdf18 | 2017-11-29 13:09:01 +0100 | [diff] [blame] | 3272 | |
Richard Levitte | ac6ae8a | 2018-03-16 08:24:50 +0100 | [diff] [blame] | 3273 | 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 Levitte | 89bea08 | 2017-11-29 13:16:53 +0100 | [diff] [blame] | 3277 | |
Richard Levitte | ac6ae8a | 2018-03-16 08:24:50 +0100 | [diff] [blame] | 3278 | $config{perlenv}->{$name} = $ENV{$name} |
| 3279 | if ! exists $config{perlenv}->{$name}; |
| 3280 | } |
Richard Levitte | 7ecdf18 | 2017-11-29 13:09:01 +0100 | [diff] [blame] | 3281 | return $config{perlenv}->{$name}; |
| 3282 | } |
| 3283 | |
Richard Levitte | 00ae96c | 2015-05-18 12:53:38 +0200 | [diff] [blame] | 3284 | # Configuration printer ############################################## |
| 3285 | |
| 3286 | sub print_table_entry |
| 3287 | { |
Andy Polyakov | f770d75 | 2018-03-26 12:35:57 +0200 | [diff] [blame] | 3288 | local $now_printing = shift; |
| 3289 | my %target = resolve_config($now_printing); |
Richard Levitte | 00ae96c | 2015-05-18 12:53:38 +0200 | [diff] [blame] | 3290 | my $type = shift; |
| 3291 | |
| 3292 | # Don't print the templates |
| 3293 | return if $target{template}; |
| 3294 | |
| 3295 | my @sequence = ( |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 3296 | "sys_id", |
| 3297 | "cpp", |
| 3298 | "cppflags", |
| 3299 | "defines", |
| 3300 | "includes", |
| 3301 | "cc", |
| 3302 | "cflags", |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 3303 | "ld", |
| 3304 | "lflags", |
| 3305 | "loutflag", |
| 3306 | "ex_libs", |
| 3307 | "bn_ops", |
Richard Levitte | 37fe90a | 2020-09-21 13:13:25 +0200 | [diff] [blame] | 3308 | "enable", |
| 3309 | "disable", |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 3310 | "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 Levitte | 00ae96c | 2015-05-18 12:53:38 +0200 | [diff] [blame] | 3337 | |
| 3338 | if ($type eq "TABLE") { |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 3339 | print "\n"; |
| 3340 | print "*** $now_printing\n"; |
Richard Levitte | cb212f2 | 2016-02-24 01:32:51 +0100 | [diff] [blame] | 3341 | 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 Levitte | 00ae96c | 2015-05-18 12:53:38 +0200 | [diff] [blame] | 3348 | } elsif ($type eq "HASH") { |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 3349 | my $largest = |
| 3350 | length((sort { length($a) <=> length($b) } @sequence)[-1]); |
| 3351 | print " '$now_printing' => {\n"; |
| 3352 | foreach (@sequence) { |
| 3353 | if ($target{$_}) { |
Richard Levitte | cb212f2 | 2016-02-24 01:32:51 +0100 | [diff] [blame] | 3354 | 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. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 3359 | } |
| 3360 | } |
| 3361 | print " },\n"; |
Richard Levitte | 00ae96c | 2015-05-18 12:53:38 +0200 | [diff] [blame] | 3362 | } |
| 3363 | } |
| 3364 | |
| 3365 | # Utility routines ################################################### |
| 3366 | |
Richard Levitte | 2e96384 | 2016-02-10 02:00:37 +0100 | [diff] [blame] | 3367 | # 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. |
| 3370 | sub 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 | |
FdaSilvaYY | 69687aa | 2017-03-28 23:57:28 +0200 | [diff] [blame] | 3376 | # If the file spec includes a device or a directory spec, |
Richard Levitte | 2e96384 | 2016-02-10 02:00:37 +0100 | [diff] [blame] | 3377 | # 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 Levitte | ec182ef | 2016-02-09 10:15:13 +0100 | [diff] [blame] | 3384 | # 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. |
| 3389 | sub 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 Levitte | 610e2b3 | 2020-07-01 10:06:59 +0200 | [diff] [blame] | 3407 | # 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) |
| 3410 | sub 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 Levitte | fe05264 | 2015-05-18 03:33:55 +0200 | [diff] [blame] | 3428 | sub quotify { |
| 3429 | my %processors = ( |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 3430 | 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 Levitte | fe05264 | 2015-05-18 03:33:55 +0200 | [diff] [blame] | 3442 | my $for = shift; |
| 3443 | my $processor = |
Dr. Matthias St. Pierre | 84f32c8 | 2019-03-18 11:43:59 +0100 | [diff] [blame] | 3444 | defined($processors{$for}) ? $processors{$for} : sub { shift; }; |
Richard Levitte | fe05264 | 2015-05-18 03:33:55 +0200 | [diff] [blame] | 3445 | |
Richard Levitte | 2110feb | 2016-04-06 15:02:57 +0200 | [diff] [blame] | 3446 | return map { $processor->($_); } @_; |
Richard Levitte | fe05264 | 2015-05-18 03:33:55 +0200 | [diff] [blame] | 3447 | } |
Richard Levitte | 107b579 | 2015-05-20 20:03:20 +0200 | [diff] [blame] | 3448 | |
Richard Levitte | 9fe2bb7 | 2016-01-29 19:45:51 +0100 | [diff] [blame] | 3449 | # 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 |
| 3453 | sub 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 Levitte | 04f171c | 2016-02-12 12:10:27 +0100 | [diff] [blame] | 3463 | s|\R$||; |
Richard Levitte | 9fe2bb7 | 2016-01-29 19:45:51 +0100 | [diff] [blame] | 3464 | 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 |
| 3484 | sub 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 Levitte | 04f171c | 2016-02-12 12:10:27 +0100 | [diff] [blame] | 3494 | s|\R$||; |
Richard Levitte | 9fe2bb7 | 2016-01-29 19:45:51 +0100 | [diff] [blame] | 3495 | 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 Levitte | 107b579 | 2015-05-20 20:03:20 +0200 | [diff] [blame] | 3512 | # 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. |
| 3514 | sub collect_information { |
Richard Levitte | 9fe2bb7 | 2016-01-29 19:45:51 +0100 | [diff] [blame] | 3515 | my $lineiterator = shift; |
Richard Levitte | 107b579 | 2015-05-20 20:03:20 +0200 | [diff] [blame] | 3516 | my %collectors = @_; |
| 3517 | |
Richard Levitte | 9fe2bb7 | 2016-01-29 19:45:51 +0100 | [diff] [blame] | 3518 | while(defined($_ = $lineiterator->())) { |
Richard Levitte | 04f171c | 2016-02-12 12:10:27 +0100 | [diff] [blame] | 3519 | s|\R$||; |
Richard Levitte | 9fe2bb7 | 2016-01-29 19:45:51 +0100 | [diff] [blame] | 3520 | my $found = 0; |
Richard Levitte | 2b6b606 | 2016-03-10 00:04:04 +0100 | [diff] [blame] | 3521 | if ($collectors{"BEFORE"}) { |
| 3522 | $collectors{"BEFORE"}->($_); |
| 3523 | } |
Richard Levitte | 9fe2bb7 | 2016-01-29 19:45:51 +0100 | [diff] [blame] | 3524 | foreach my $re (keys %collectors) { |
Richard Levitte | 2b6b606 | 2016-03-10 00:04:04 +0100 | [diff] [blame] | 3525 | if ($re !~ /^OTHERWISE|BEFORE|AFTER$/ && /$re/) { |
Richard Levitte | 9fe2bb7 | 2016-01-29 19:45:51 +0100 | [diff] [blame] | 3526 | $collectors{$re}->($lineiterator); |
| 3527 | $found = 1; |
| 3528 | }; |
| 3529 | } |
| 3530 | if ($collectors{"OTHERWISE"}) { |
| 3531 | $collectors{"OTHERWISE"}->($lineiterator, $_) |
| 3532 | unless $found || !defined $collectors{"OTHERWISE"}; |
| 3533 | } |
Richard Levitte | 2b6b606 | 2016-03-10 00:04:04 +0100 | [diff] [blame] | 3534 | if ($collectors{"AFTER"}) { |
| 3535 | $collectors{"AFTER"}->($_); |
| 3536 | } |
Richard Levitte | 107b579 | 2015-05-20 20:03:20 +0200 | [diff] [blame] | 3537 | } |
Richard Levitte | 107b579 | 2015-05-20 20:03:20 +0200 | [diff] [blame] | 3538 | } |
Richard Levitte | ce95981 | 2016-05-24 17:39:52 +0200 | [diff] [blame] | 3539 | |
| 3540 | # tokenize($line) |
Richard Levitte | 5d3af25 | 2018-11-07 10:34:05 +0100 | [diff] [blame] | 3541 | # tokenize($line,$separator) |
Richard Levitte | ce95981 | 2016-05-24 17:39:52 +0200 | [diff] [blame] | 3542 | # $line is a line of text to split up into tokens |
Richard Levitte | 5d3af25 | 2018-11-07 10:34:05 +0100 | [diff] [blame] | 3543 | # $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 Levitte | ce95981 | 2016-05-24 17:39:52 +0200 | [diff] [blame] | 3547 | # |
Richard Levitte | 5d3af25 | 2018-11-07 10:34:05 +0100 | [diff] [blame] | 3548 | # 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 Levitte | ce95981 | 2016-05-24 17:39:52 +0200 | [diff] [blame] | 3551 | # with backslash. |
| 3552 | # Basically, the same quoting rules apply for " and ' as in any |
| 3553 | # Unix shell. |
| 3554 | sub tokenize { |
| 3555 | my $line = my $debug_line = shift; |
Richard Levitte | 5d3af25 | 2018-11-07 10:34:05 +0100 | [diff] [blame] | 3556 | my $separator = shift // qr|\s+|; |
Richard Levitte | ce95981 | 2016-05-24 17:39:52 +0200 | [diff] [blame] | 3557 | my @result = (); |
| 3558 | |
Richard Levitte | 5d3af25 | 2018-11-07 10:34:05 +0100 | [diff] [blame] | 3559 | if ($ENV{CONFIGURE_DEBUG_TOKENIZE}) { |
| 3560 | print STDERR "DEBUG[tokenize]: \$separator = $separator\n"; |
| 3561 | } |
| 3562 | |
| 3563 | while ($line =~ s|^${separator}||, $line ne "") { |
Richard Levitte | ce95981 | 2016-05-24 17:39:52 +0200 | [diff] [blame] | 3564 | my $token = ""; |
Richard Levitte | 5d3af25 | 2018-11-07 10:34:05 +0100 | [diff] [blame] | 3565 | 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 Levitte | ce95981 | 2016-05-24 17:39:52 +0200 | [diff] [blame] | 3578 | } |
| 3579 | push @result, $token; |
| 3580 | } |
| 3581 | |
| 3582 | if ($ENV{CONFIGURE_DEBUG_TOKENIZE}) { |
Richard Levitte | 5d3af25 | 2018-11-07 10:34:05 +0100 | [diff] [blame] | 3583 | print STDERR "DEBUG[tokenize]: Parsed '$debug_line' into:\n"; |
| 3584 | print STDERR "DEBUG[tokenize]: ('", join("', '", @result), "')\n"; |
Richard Levitte | ce95981 | 2016-05-24 17:39:52 +0200 | [diff] [blame] | 3585 | } |
| 3586 | return @result; |
| 3587 | } |