1*e71b7053SJung-uk Kim#! /usr/bin/env perl 2*e71b7053SJung-uk Kim# -*- mode: perl; -*- 3*e71b7053SJung-uk Kim# Copyright 2016-2018 The OpenSSL Project Authors. All Rights Reserved. 4*e71b7053SJung-uk Kim# 5*e71b7053SJung-uk Kim# Licensed under the OpenSSL license (the "License"). You may not use 6*e71b7053SJung-uk Kim# this file except in compliance with the License. You can obtain a copy 7*e71b7053SJung-uk Kim# in the file LICENSE in the source distribution or at 8*e71b7053SJung-uk Kim# https://www.openssl.org/source/license.html 974664626SKris Kennaway 10*e71b7053SJung-uk Kim## Configure -- OpenSSL source tree configuration script 11*e71b7053SJung-uk Kim 12*e71b7053SJung-uk Kimuse 5.10.0; 131f13597dSJung-uk Kimuse strict; 14*e71b7053SJung-uk Kimuse Config; 15*e71b7053SJung-uk Kimuse FindBin; 16*e71b7053SJung-uk Kimuse lib "$FindBin::Bin/util/perl"; 17*e71b7053SJung-uk Kimuse File::Basename; 18*e71b7053SJung-uk Kimuse File::Spec::Functions qw/:DEFAULT abs2rel rel2abs/; 19*e71b7053SJung-uk Kimuse File::Path qw/mkpath/; 20*e71b7053SJung-uk Kimuse OpenSSL::Glob; 2174664626SKris Kennaway 2274664626SKris Kennaway# see INSTALL for instructions. 2374664626SKris Kennaway 24*e71b7053SJung-uk Kimmy $orig_death_handler = $SIG{__DIE__}; 25*e71b7053SJung-uk Kim$SIG{__DIE__} = \&death_handler; 26*e71b7053SJung-uk Kim 27*e71b7053SJung-uk Kimmy $usage="Usage: Configure [no-<cipher> ...] [enable-<cipher> ...] [-Dxxx] [-lxxx] [-Lxxx] [-fxxx] [-Kxxx] [no-hw-xxx|no-hw] [[no-]threads] [[no-]shared] [[no-]zlib|zlib-dynamic] [no-asm] [no-dso] [no-egd] [sctp] [386] [--prefix=DIR] [--openssldir=OPENSSLDIR] [--with-xxx[=vvv]] [--config=FILE] os/compiler[:flags]\n"; 2874664626SKris Kennaway 2974664626SKris Kennaway# Options: 3074664626SKris Kennaway# 31*e71b7053SJung-uk Kim# --config add the given configuration file, which will be read after 32*e71b7053SJung-uk Kim# any "Configurations*" files that are found in the same 33*e71b7053SJung-uk Kim# directory as this script. 34*e71b7053SJung-uk Kim# --prefix prefix for the OpenSSL installation, which includes the 35*e71b7053SJung-uk Kim# directories bin, lib, include, share/man, share/doc/openssl 36*e71b7053SJung-uk Kim# This becomes the value of INSTALLTOP in Makefile 37*e71b7053SJung-uk Kim# (Default: /usr/local) 38*e71b7053SJung-uk Kim# --openssldir OpenSSL data area, such as openssl.cnf, certificates and keys. 39*e71b7053SJung-uk Kim# If it's a relative directory, it will be added on the directory 40*e71b7053SJung-uk Kim# given with --prefix. 41*e71b7053SJung-uk Kim# This becomes the value of OPENSSLDIR in Makefile and in C. 42*e71b7053SJung-uk Kim# (Default: PREFIX/ssl) 43c1803d78SJacques Vidrine# 441f13597dSJung-uk Kim# --cross-compile-prefix Add specified prefix to binutils components. 451f13597dSJung-uk Kim# 46*e71b7053SJung-uk Kim# --api One of 0.9.8, 1.0.0 or 1.1.0. Do not compile support for 47*e71b7053SJung-uk Kim# interfaces deprecated as of the specified OpenSSL version. 48*e71b7053SJung-uk Kim# 495c87c606SMark Murray# no-hw-xxx do not compile support for specific crypto hardware. 505c87c606SMark Murray# Generic OpenSSL-style methods relating to this support 515c87c606SMark Murray# are always compiled but return NULL if the hardware 525c87c606SMark Murray# support isn't compiled. 535c87c606SMark Murray# no-hw do not compile support for any crypto hardware. 5474664626SKris Kennaway# [no-]threads [don't] try to create a library that is suitable for 5574664626SKris Kennaway# multithreaded applications (default is "threads" if we 5674664626SKris Kennaway# know how to do it) 57ddd58736SKris Kennaway# [no-]shared [don't] try to create shared libraries when supported. 58*e71b7053SJung-uk Kim# [no-]pic [don't] try to build position independent code when supported. 59*e71b7053SJung-uk Kim# If disabled, it also disables shared and dynamic-engine. 6074664626SKris Kennaway# no-asm do not use assembler 61ddd58736SKris Kennaway# no-dso do not compile in any native shared-library methods. This 62ddd58736SKris Kennaway# will ensure that all methods just return NULL. 63*e71b7053SJung-uk Kim# no-egd do not compile support for the entropy-gathering daemon APIs 645c87c606SMark Murray# [no-]zlib [don't] compile support for zlib compression. 655c87c606SMark Murray# zlib-dynamic Like "zlib", but the zlib library is expected to be a shared 665c87c606SMark Murray# library and will be loaded in run-time by the OpenSSL library. 671f13597dSJung-uk Kim# sctp include SCTP support 684c6a0400SJung-uk Kim# enable-weak-ssl-ciphers 69*e71b7053SJung-uk Kim# Enable weak ciphers that are disabled by default. 706cf8931aSJung-uk Kim# 386 generate 80386 code in assembly modules 716cf8931aSJung-uk Kim# no-sse2 disables IA-32 SSE2 code in assembly modules, the above 726cf8931aSJung-uk Kim# mentioned '386' option implies this one 7374664626SKris Kennaway# no-<cipher> build without specified algorithm (rsa, idea, rc5, ...) 7474664626SKris Kennaway# -<xxx> +<xxx> compiler options are passed through 75*e71b7053SJung-uk Kim# -static while -static is also a pass-through compiler option (and 76*e71b7053SJung-uk Kim# as such is limited to environments where it's actually 77*e71b7053SJung-uk Kim# meaningful), it triggers a number configuration options, 78*e71b7053SJung-uk Kim# namely no-dso, no-pic, no-shared and no-threads. It is 79*e71b7053SJung-uk Kim# argued that the only reason to produce statically linked 80*e71b7053SJung-uk Kim# binaries (and in context it means executables linked with 81*e71b7053SJung-uk Kim# -static flag, and not just executables linked with static 82*e71b7053SJung-uk Kim# libcrypto.a) is to eliminate dependency on specific run-time, 83*e71b7053SJung-uk Kim# a.k.a. libc version. The mentioned config options are meant 84*e71b7053SJung-uk Kim# to achieve just that. Unfortunately on Linux it's impossible 85*e71b7053SJung-uk Kim# to eliminate the dependency completely for openssl executable 86*e71b7053SJung-uk Kim# because of getaddrinfo and gethostbyname calls, which can 87*e71b7053SJung-uk Kim# invoke dynamically loadable library facility anyway to meet 88*e71b7053SJung-uk Kim# the lookup requests. For this reason on Linux statically 89*e71b7053SJung-uk Kim# linked openssl executable has rather debugging value than 90*e71b7053SJung-uk Kim# production quality. 9174664626SKris Kennaway# 92ddd58736SKris Kennaway# DEBUG_SAFESTACK use type-safe stacks to enforce type-safety on stack items 93ddd58736SKris Kennaway# provided to stack calls. Generates unique stack functions for 94ddd58736SKris Kennaway# each possible stack type. 9574664626SKris Kennaway# BN_LLONG use the type 'long long' in crypto/bn/bn.h 9674664626SKris Kennaway# RC4_CHAR use 'char' instead of 'int' for RC4_INT in crypto/rc4/rc4.h 973b4e3dcbSSimon L. B. Nielsen# Following are set automatically by this script 983b4e3dcbSSimon L. B. Nielsen# 99*e71b7053SJung-uk Kim# MD5_ASM use some extra md5 assembler, 100*e71b7053SJung-uk Kim# SHA1_ASM use some extra sha1 assembler, must define L_ENDIAN for x86 101*e71b7053SJung-uk Kim# RMD160_ASM use some extra ripemd160 assembler, 1023b4e3dcbSSimon L. B. Nielsen# SHA256_ASM sha256_block is implemented in assembler 1033b4e3dcbSSimon L. B. Nielsen# SHA512_ASM sha512_block is implemented in assembler 104*e71b7053SJung-uk Kim# AES_ASM AES_[en|de]crypt is implemented in assembler 10574664626SKris Kennaway 106db522d3aSSimon L. B. Nielsen# Minimum warning options... any contributions to OpenSSL should at least get 107db522d3aSSimon L. B. Nielsen# past these. 108db522d3aSSimon L. B. Nielsen 109*e71b7053SJung-uk Kim# DEBUG_UNUSED enables __owur (warn unused result) checks. 110*e71b7053SJung-uk Kim# -DPEDANTIC complements -pedantic and is meant to mask code that 111*e71b7053SJung-uk Kim# is not strictly standard-compliant and/or implementation-specific, 112*e71b7053SJung-uk Kim# e.g. inline assembly, disregards to alignment requirements, such 113*e71b7053SJung-uk Kim# that -pedantic would complain about. Incidentally -DPEDANTIC has 114*e71b7053SJung-uk Kim# to be used even in sanitized builds, because sanitizer too is 115*e71b7053SJung-uk Kim# supposed to and does take notice of non-standard behaviour. Then 116*e71b7053SJung-uk Kim# -pedantic with pre-C9x compiler would also complain about 'long 117*e71b7053SJung-uk Kim# long' not being supported. As 64-bit algorithms are common now, 118*e71b7053SJung-uk Kim# it grew impossible to resolve this without sizeable additional 119*e71b7053SJung-uk Kim# code, so we just tell compiler to be pedantic about everything 120*e71b7053SJung-uk Kim# but 'long long' type. 121db522d3aSSimon L. B. Nielsen 122*e71b7053SJung-uk Kimmy $gcc_devteam_warn = "-DDEBUG_UNUSED" 123*e71b7053SJung-uk Kim . " -DPEDANTIC -pedantic -Wno-long-long" 124*e71b7053SJung-uk Kim . " -Wall" 125*e71b7053SJung-uk Kim . " -Wextra" 126*e71b7053SJung-uk Kim . " -Wno-unused-parameter" 127*e71b7053SJung-uk Kim . " -Wno-missing-field-initializers" 128*e71b7053SJung-uk Kim . " -Wswitch" 129*e71b7053SJung-uk Kim . " -Wsign-compare" 130*e71b7053SJung-uk Kim . " -Wmissing-prototypes" 131*e71b7053SJung-uk Kim . " -Wstrict-prototypes" 132*e71b7053SJung-uk Kim . " -Wshadow" 133*e71b7053SJung-uk Kim . " -Wformat" 134*e71b7053SJung-uk Kim . " -Wtype-limits" 135*e71b7053SJung-uk Kim . " -Wundef" 136*e71b7053SJung-uk Kim . " -Werror" 137*e71b7053SJung-uk Kim ; 1387bded2dbSJung-uk Kim 1397bded2dbSJung-uk Kim# These are used in addition to $gcc_devteam_warn when the compiler is clang. 1407bded2dbSJung-uk Kim# TODO(openssl-team): fix problems and investigate if (at least) the 141*e71b7053SJung-uk Kim# following warnings can also be enabled: 142*e71b7053SJung-uk Kim# -Wcast-align 143*e71b7053SJung-uk Kim# -Wunreachable-code -- no, too ugly/compiler-specific 144*e71b7053SJung-uk Kim# -Wlanguage-extension-token -- no, we use asm() 145*e71b7053SJung-uk Kim# -Wunused-macros -- no, too tricky for BN and _XOPEN_SOURCE etc 146*e71b7053SJung-uk Kim# -Wextended-offsetof -- no, needed in CMS ASN1 code 147*e71b7053SJung-uk Kimmy $clang_devteam_warn = "" 148*e71b7053SJung-uk Kim . " -Wswitch-default" 149*e71b7053SJung-uk Kim . " -Wno-parentheses-equality" 150*e71b7053SJung-uk Kim . " -Wno-language-extension-token" 151*e71b7053SJung-uk Kim . " -Wno-extended-offsetof" 152*e71b7053SJung-uk Kim . " -Wconditional-uninitialized" 153*e71b7053SJung-uk Kim . " -Wincompatible-pointer-types-discards-qualifiers" 154*e71b7053SJung-uk Kim . " -Wmissing-variable-declarations" 155*e71b7053SJung-uk Kim . " -Wno-unknown-warning-option" 156*e71b7053SJung-uk Kim ; 1577bded2dbSJung-uk Kim 158*e71b7053SJung-uk Kim# This adds backtrace information to the memory leak info. Is only used 159*e71b7053SJung-uk Kim# when crypto-mdebug-backtrace is enabled. 160*e71b7053SJung-uk Kimmy $memleak_devteam_backtrace = "-rdynamic"; 1618180e704SJung-uk Kim 1626a599222SSimon L. B. Nielsenmy $strict_warnings = 0; 1636a599222SSimon L. B. Nielsen 1643b4e3dcbSSimon L. B. Nielsen# As for $BSDthreads. Idea is to maintain "collective" set of flags, 1653b4e3dcbSSimon L. B. Nielsen# which would cover all BSD flavors. -pthread applies to them all, 1663b4e3dcbSSimon L. B. Nielsen# but is treated differently. OpenBSD expands is as -D_POSIX_THREAD 1673b4e3dcbSSimon L. B. Nielsen# -lc_r, which is sufficient. FreeBSD 4.x expands it as -lc_r, 1683b4e3dcbSSimon L. B. Nielsen# which has to be accompanied by explicit -D_THREAD_SAFE and 1693b4e3dcbSSimon L. B. Nielsen# sometimes -D_REENTRANT. FreeBSD 5.x expands it as -lc_r, which 1703b4e3dcbSSimon L. B. Nielsen# seems to be sufficient? 171*e71b7053SJung-uk Kimour $BSDthreads="-pthread -D_THREAD_SAFE -D_REENTRANT"; 17274664626SKris Kennaway 17374664626SKris Kennaway# 174*e71b7053SJung-uk Kim# API compatibility name to version number mapping. 17574664626SKris Kennaway# 176*e71b7053SJung-uk Kimmy $maxapi = "1.1.0"; # API for "no-deprecated" builds 177*e71b7053SJung-uk Kimmy $apitable = { 178*e71b7053SJung-uk Kim "1.1.0" => "0x10100000L", 179*e71b7053SJung-uk Kim "1.0.0" => "0x10000000L", 180*e71b7053SJung-uk Kim "0.9.8" => "0x00908000L", 181*e71b7053SJung-uk Kim}; 182*e71b7053SJung-uk Kim 183*e71b7053SJung-uk Kimour %table = (); 184*e71b7053SJung-uk Kimour %config = (); 185*e71b7053SJung-uk Kimour %withargs = (); 186*e71b7053SJung-uk Kimour $now_printing; # set to current entry's name in print_table_entry 187*e71b7053SJung-uk Kim # (todo: right thing would be to encapsulate name 188*e71b7053SJung-uk Kim # into %target [class] and make print_table_entry 189*e71b7053SJung-uk Kim # a method) 190*e71b7053SJung-uk Kim 191*e71b7053SJung-uk Kim# Forward declarations ############################################### 192*e71b7053SJung-uk Kim 193*e71b7053SJung-uk Kim# read_config(filename) 194c1803d78SJacques Vidrine# 195*e71b7053SJung-uk Kim# Reads a configuration file and populates %table with the contents 196*e71b7053SJung-uk Kim# (which the configuration file places in %targets). 197*e71b7053SJung-uk Kimsub read_config; 19874664626SKris Kennaway 199*e71b7053SJung-uk Kim# resolve_config(target) 20074664626SKris Kennaway# 201*e71b7053SJung-uk Kim# Resolves all the late evaluations, inheritances and so on for the 202*e71b7053SJung-uk Kim# chosen target and any target it inherits from. 203*e71b7053SJung-uk Kimsub resolve_config; 20474664626SKris Kennaway 20574664626SKris Kennaway 206*e71b7053SJung-uk Kim# Information collection ############################################# 20774664626SKris Kennaway 208*e71b7053SJung-uk Kim# Unified build supports separate build dir 209*e71b7053SJung-uk Kimmy $srcdir = catdir(absolutedir(dirname($0))); # catdir ensures local syntax 210*e71b7053SJung-uk Kimmy $blddir = catdir(absolutedir(".")); # catdir ensures local syntax 211*e71b7053SJung-uk Kimmy $dofile = abs2rel(catfile($srcdir, "util/dofile.pl")); 21274664626SKris Kennaway 213*e71b7053SJung-uk Kimmy $local_config_envname = 'OPENSSL_LOCAL_CONFIG_DIR'; 214a21b1b38SKris Kennaway 215*e71b7053SJung-uk Kim$config{sourcedir} = abs2rel($srcdir); 216*e71b7053SJung-uk Kim$config{builddir} = abs2rel($blddir); 21774664626SKris Kennaway 218*e71b7053SJung-uk Kim# Collect reconfiguration information if needed 219*e71b7053SJung-uk Kimmy @argvcopy=@ARGV; 22074664626SKris Kennaway 221*e71b7053SJung-uk Kimif (grep /^reconf(igure)?$/, @argvcopy) { 222*e71b7053SJung-uk Kim die "reconfiguring with other arguments present isn't supported" 223*e71b7053SJung-uk Kim if scalar @argvcopy > 1; 224*e71b7053SJung-uk Kim if (-f "./configdata.pm") { 225*e71b7053SJung-uk Kim my $file = "./configdata.pm"; 226*e71b7053SJung-uk Kim unless (my $return = do $file) { 227*e71b7053SJung-uk Kim die "couldn't parse $file: $@" if $@; 228*e71b7053SJung-uk Kim die "couldn't do $file: $!" unless defined $return; 229*e71b7053SJung-uk Kim die "couldn't run $file" unless $return; 2301f13597dSJung-uk Kim } 2313b4e3dcbSSimon L. B. Nielsen 232*e71b7053SJung-uk Kim @argvcopy = defined($configdata::config{perlargv}) ? 233*e71b7053SJung-uk Kim @{$configdata::config{perlargv}} : (); 234*e71b7053SJung-uk Kim die "Incorrect data to reconfigure, please do a normal configuration\n" 235*e71b7053SJung-uk Kim if (grep(/^reconf/,@argvcopy)); 236*e71b7053SJung-uk Kim $config{perlenv} = $configdata::config{perlenv} // {}; 237*e71b7053SJung-uk Kim } else { 238*e71b7053SJung-uk Kim die "Insufficient data to reconfigure, please do a normal configuration\n"; 239*e71b7053SJung-uk Kim } 240*e71b7053SJung-uk Kim} 2413b4e3dcbSSimon L. B. Nielsen 242*e71b7053SJung-uk Kim$config{perlargv} = [ @argvcopy ]; 243*e71b7053SJung-uk Kim 244*e71b7053SJung-uk Kim# Collect version numbers 245*e71b7053SJung-uk Kim$config{version} = "unknown"; 246*e71b7053SJung-uk Kim$config{version_num} = "unknown"; 247*e71b7053SJung-uk Kim$config{shlib_version_number} = "unknown"; 248*e71b7053SJung-uk Kim$config{shlib_version_history} = "unknown"; 249*e71b7053SJung-uk Kim 250*e71b7053SJung-uk Kimcollect_information( 251*e71b7053SJung-uk Kim collect_from_file(catfile($srcdir,'include/openssl/opensslv.h')), 252*e71b7053SJung-uk Kim qr/OPENSSL.VERSION.TEXT.*OpenSSL (\S+) / => sub { $config{version} = $1; }, 253*e71b7053SJung-uk Kim qr/OPENSSL.VERSION.NUMBER.*(0x\S+)/ => sub { $config{version_num}=$1 }, 254*e71b7053SJung-uk Kim qr/SHLIB_VERSION_NUMBER *"([^"]+)"/ => sub { $config{shlib_version_number}=$1 }, 255*e71b7053SJung-uk Kim qr/SHLIB_VERSION_HISTORY *"([^"]*)"/ => sub { $config{shlib_version_history}=$1 } 256*e71b7053SJung-uk Kim ); 257*e71b7053SJung-uk Kimif ($config{shlib_version_history} ne "") { $config{shlib_version_history} .= ":"; } 258*e71b7053SJung-uk Kim 259*e71b7053SJung-uk Kim($config{major}, $config{minor}) 260*e71b7053SJung-uk Kim = ($config{version} =~ /^([0-9]+)\.([0-9\.]+)/); 261*e71b7053SJung-uk Kim($config{shlib_major}, $config{shlib_minor}) 262*e71b7053SJung-uk Kim = ($config{shlib_version_number} =~ /^([0-9]+)\.([0-9\.]+)/); 263*e71b7053SJung-uk Kimdie "erroneous version information in opensslv.h: ", 264*e71b7053SJung-uk Kim "$config{major}, $config{minor}, $config{shlib_major}, $config{shlib_minor}\n" 265*e71b7053SJung-uk Kim if ($config{major} eq "" || $config{minor} eq "" 266*e71b7053SJung-uk Kim || $config{shlib_major} eq "" || $config{shlib_minor} eq ""); 267*e71b7053SJung-uk Kim 268*e71b7053SJung-uk Kim# Collect target configurations 269*e71b7053SJung-uk Kim 270*e71b7053SJung-uk Kimmy $pattern = catfile(dirname($0), "Configurations", "*.conf"); 271*e71b7053SJung-uk Kimforeach (sort glob($pattern)) { 272*e71b7053SJung-uk Kim &read_config($_); 273*e71b7053SJung-uk Kim} 274*e71b7053SJung-uk Kim 275*e71b7053SJung-uk Kimif (defined env($local_config_envname)) { 276*e71b7053SJung-uk Kim if ($^O eq 'VMS') { 277*e71b7053SJung-uk Kim # VMS environment variables are logical names, 278*e71b7053SJung-uk Kim # which can be used as is 279*e71b7053SJung-uk Kim $pattern = $local_config_envname . ':' . '*.conf'; 280*e71b7053SJung-uk Kim } else { 281*e71b7053SJung-uk Kim $pattern = catfile(env($local_config_envname), '*.conf'); 282*e71b7053SJung-uk Kim } 283*e71b7053SJung-uk Kim 284*e71b7053SJung-uk Kim foreach (sort glob($pattern)) { 285*e71b7053SJung-uk Kim &read_config($_); 286*e71b7053SJung-uk Kim } 287*e71b7053SJung-uk Kim} 288*e71b7053SJung-uk Kim 289*e71b7053SJung-uk Kim# Save away perl command information 290*e71b7053SJung-uk Kim$config{perl_cmd} = $^X; 291*e71b7053SJung-uk Kim$config{perl_version} = $Config{version}; 292*e71b7053SJung-uk Kim$config{perl_archname} = $Config{archname}; 293*e71b7053SJung-uk Kim 294*e71b7053SJung-uk Kim$config{prefix}=""; 295*e71b7053SJung-uk Kim$config{openssldir}=""; 296*e71b7053SJung-uk Kim$config{processor}=""; 297*e71b7053SJung-uk Kim$config{libdir}=""; 298*e71b7053SJung-uk Kimmy $auto_threads=1; # enable threads automatically? true by default 299*e71b7053SJung-uk Kimmy $default_ranlib; 300*e71b7053SJung-uk Kim 301*e71b7053SJung-uk Kim# Top level directories to build 302*e71b7053SJung-uk Kim$config{dirs} = [ "crypto", "ssl", "engines", "apps", "test", "util", "tools", "fuzz" ]; 303*e71b7053SJung-uk Kim# crypto/ subdirectories to build 304*e71b7053SJung-uk Kim$config{sdirs} = [ 305*e71b7053SJung-uk Kim "objects", 306*e71b7053SJung-uk Kim "md2", "md4", "md5", "sha", "mdc2", "hmac", "ripemd", "whrlpool", "poly1305", "blake2", "siphash", "sm3", 307*e71b7053SJung-uk Kim "des", "aes", "rc2", "rc4", "rc5", "idea", "aria", "bf", "cast", "camellia", "seed", "sm4", "chacha", "modes", 308*e71b7053SJung-uk Kim "bn", "ec", "rsa", "dsa", "dh", "sm2", "dso", "engine", 309*e71b7053SJung-uk Kim "buffer", "bio", "stack", "lhash", "rand", "err", 310*e71b7053SJung-uk Kim "evp", "asn1", "pem", "x509", "x509v3", "conf", "txt_db", "pkcs7", "pkcs12", "comp", "ocsp", "ui", 311*e71b7053SJung-uk Kim "cms", "ts", "srp", "cmac", "ct", "async", "kdf", "store" 312*e71b7053SJung-uk Kim ]; 313*e71b7053SJung-uk Kim# test/ subdirectories to build 314*e71b7053SJung-uk Kim$config{tdirs} = [ "ossl_shim" ]; 315*e71b7053SJung-uk Kim 316*e71b7053SJung-uk Kim# Known TLS and DTLS protocols 317*e71b7053SJung-uk Kimmy @tls = qw(ssl3 tls1 tls1_1 tls1_2 tls1_3); 318*e71b7053SJung-uk Kimmy @dtls = qw(dtls1 dtls1_2); 319*e71b7053SJung-uk Kim 320*e71b7053SJung-uk Kim# Explicitly known options that are possible to disable. They can 321*e71b7053SJung-uk Kim# be regexps, and will be used like this: /^no-${option}$/ 322*e71b7053SJung-uk Kim# For developers: keep it sorted alphabetically 323*e71b7053SJung-uk Kim 324*e71b7053SJung-uk Kimmy @disablables = ( 325*e71b7053SJung-uk Kim "afalgeng", 326*e71b7053SJung-uk Kim "aria", 327*e71b7053SJung-uk Kim "asan", 328*e71b7053SJung-uk Kim "asm", 329*e71b7053SJung-uk Kim "async", 330*e71b7053SJung-uk Kim "autoalginit", 331*e71b7053SJung-uk Kim "autoerrinit", 332*e71b7053SJung-uk Kim "autoload-config", 333*e71b7053SJung-uk Kim "bf", 334*e71b7053SJung-uk Kim "blake2", 335*e71b7053SJung-uk Kim "camellia", 336*e71b7053SJung-uk Kim "capieng", 337*e71b7053SJung-uk Kim "cast", 338*e71b7053SJung-uk Kim "chacha", 339*e71b7053SJung-uk Kim "cmac", 340*e71b7053SJung-uk Kim "cms", 341*e71b7053SJung-uk Kim "comp", 342*e71b7053SJung-uk Kim "crypto-mdebug", 343*e71b7053SJung-uk Kim "crypto-mdebug-backtrace", 344*e71b7053SJung-uk Kim "ct", 345*e71b7053SJung-uk Kim "deprecated", 346*e71b7053SJung-uk Kim "des", 347*e71b7053SJung-uk Kim "devcryptoeng", 348*e71b7053SJung-uk Kim "dgram", 349*e71b7053SJung-uk Kim "dh", 350*e71b7053SJung-uk Kim "dsa", 351*e71b7053SJung-uk Kim "dso", 352*e71b7053SJung-uk Kim "dtls", 353*e71b7053SJung-uk Kim "dynamic-engine", 354*e71b7053SJung-uk Kim "ec", 355*e71b7053SJung-uk Kim "ec2m", 356*e71b7053SJung-uk Kim "ecdh", 357*e71b7053SJung-uk Kim "ecdsa", 358*e71b7053SJung-uk Kim "ec_nistp_64_gcc_128", 359*e71b7053SJung-uk Kim "egd", 360*e71b7053SJung-uk Kim "engine", 361*e71b7053SJung-uk Kim "err", 362*e71b7053SJung-uk Kim "external-tests", 363*e71b7053SJung-uk Kim "filenames", 364*e71b7053SJung-uk Kim "fuzz-libfuzzer", 365*e71b7053SJung-uk Kim "fuzz-afl", 366*e71b7053SJung-uk Kim "gost", 367*e71b7053SJung-uk Kim "heartbeats", 368*e71b7053SJung-uk Kim "hw(-.+)?", 369*e71b7053SJung-uk Kim "idea", 370*e71b7053SJung-uk Kim "makedepend", 371*e71b7053SJung-uk Kim "md2", 372*e71b7053SJung-uk Kim "md4", 373*e71b7053SJung-uk Kim "mdc2", 374*e71b7053SJung-uk Kim "msan", 375*e71b7053SJung-uk Kim "multiblock", 376*e71b7053SJung-uk Kim "nextprotoneg", 377*e71b7053SJung-uk Kim "ocb", 378*e71b7053SJung-uk Kim "ocsp", 379*e71b7053SJung-uk Kim "pic", 380*e71b7053SJung-uk Kim "poly1305", 381*e71b7053SJung-uk Kim "posix-io", 382*e71b7053SJung-uk Kim "psk", 383*e71b7053SJung-uk Kim "rc2", 384*e71b7053SJung-uk Kim "rc4", 385*e71b7053SJung-uk Kim "rc5", 386*e71b7053SJung-uk Kim "rdrand", 387*e71b7053SJung-uk Kim "rfc3779", 388*e71b7053SJung-uk Kim "rmd160", 389*e71b7053SJung-uk Kim "scrypt", 390*e71b7053SJung-uk Kim "sctp", 391*e71b7053SJung-uk Kim "seed", 392*e71b7053SJung-uk Kim "shared", 393*e71b7053SJung-uk Kim "siphash", 394*e71b7053SJung-uk Kim "sm2", 395*e71b7053SJung-uk Kim "sm3", 396*e71b7053SJung-uk Kim "sm4", 397*e71b7053SJung-uk Kim "sock", 398*e71b7053SJung-uk Kim "srp", 399*e71b7053SJung-uk Kim "srtp", 400*e71b7053SJung-uk Kim "sse2", 401*e71b7053SJung-uk Kim "ssl", 402*e71b7053SJung-uk Kim "ssl-trace", 403*e71b7053SJung-uk Kim "static-engine", 404*e71b7053SJung-uk Kim "stdio", 405*e71b7053SJung-uk Kim "tests", 406*e71b7053SJung-uk Kim "threads", 407*e71b7053SJung-uk Kim "tls", 408*e71b7053SJung-uk Kim "ts", 409*e71b7053SJung-uk Kim "ubsan", 410*e71b7053SJung-uk Kim "ui-console", 411*e71b7053SJung-uk Kim "unit-test", 412*e71b7053SJung-uk Kim "whirlpool", 413*e71b7053SJung-uk Kim "weak-ssl-ciphers", 414*e71b7053SJung-uk Kim "zlib", 415*e71b7053SJung-uk Kim "zlib-dynamic", 416*e71b7053SJung-uk Kim ); 417*e71b7053SJung-uk Kimforeach my $proto ((@tls, @dtls)) 418*e71b7053SJung-uk Kim { 419*e71b7053SJung-uk Kim push(@disablables, $proto); 420*e71b7053SJung-uk Kim push(@disablables, "$proto-method") unless $proto eq "tls1_3"; 421*e71b7053SJung-uk Kim } 422*e71b7053SJung-uk Kim 423*e71b7053SJung-uk Kimmy %deprecated_disablables = ( 424*e71b7053SJung-uk Kim "ssl2" => undef, 425*e71b7053SJung-uk Kim "buf-freelists" => undef, 426*e71b7053SJung-uk Kim "ripemd" => "rmd160", 427*e71b7053SJung-uk Kim "ui" => "ui-console", 428*e71b7053SJung-uk Kim ); 429*e71b7053SJung-uk Kim 430*e71b7053SJung-uk Kim# All of the following are disabled by default: 431*e71b7053SJung-uk Kim 432*e71b7053SJung-uk Kimour %disabled = ( # "what" => "comment" 433*e71b7053SJung-uk Kim "asan" => "default", 434*e71b7053SJung-uk Kim "crypto-mdebug" => "default", 435*e71b7053SJung-uk Kim "crypto-mdebug-backtrace" => "default", 436*e71b7053SJung-uk Kim "devcryptoeng" => "default", 4371f13597dSJung-uk Kim "ec_nistp_64_gcc_128" => "default", 438*e71b7053SJung-uk Kim "egd" => "default", 439*e71b7053SJung-uk Kim "external-tests" => "default", 440*e71b7053SJung-uk Kim "fuzz-libfuzzer" => "default", 441*e71b7053SJung-uk Kim "fuzz-afl" => "default", 442*e71b7053SJung-uk Kim "heartbeats" => "default", 4431f13597dSJung-uk Kim "md2" => "default", 444*e71b7053SJung-uk Kim "msan" => "default", 4453b4e3dcbSSimon L. B. Nielsen "rc5" => "default", 4461f13597dSJung-uk Kim "sctp" => "default", 4477bded2dbSJung-uk Kim "ssl-trace" => "default", 448*e71b7053SJung-uk Kim "ssl3" => "default", 449*e71b7053SJung-uk Kim "ssl3-method" => "default", 450*e71b7053SJung-uk Kim "ubsan" => "default", 451a93cbc2bSJung-uk Kim "unit-test" => "default", 4524c6a0400SJung-uk Kim "weak-ssl-ciphers" => "default", 4533b4e3dcbSSimon L. B. Nielsen "zlib" => "default", 454*e71b7053SJung-uk Kim "zlib-dynamic" => "default", 4553b4e3dcbSSimon L. B. Nielsen ); 4563b4e3dcbSSimon L. B. Nielsen 457*e71b7053SJung-uk Kim# Note: => pair form used for aesthetics, not to truly make a hash table 458*e71b7053SJung-uk Kimmy @disable_cascades = ( 459*e71b7053SJung-uk Kim # "what" => [ "cascade", ... ] 460*e71b7053SJung-uk Kim sub { $config{processor} eq "386" } 461*e71b7053SJung-uk Kim => [ "sse2" ], 462*e71b7053SJung-uk Kim "ssl" => [ "ssl3" ], 463*e71b7053SJung-uk Kim "ssl3-method" => [ "ssl3" ], 464*e71b7053SJung-uk Kim "zlib" => [ "zlib-dynamic" ], 465*e71b7053SJung-uk Kim "des" => [ "mdc2" ], 466*e71b7053SJung-uk Kim "ec" => [ "ecdsa", "ecdh" ], 467*e71b7053SJung-uk Kim 468*e71b7053SJung-uk Kim "dgram" => [ "dtls", "sctp" ], 469*e71b7053SJung-uk Kim "sock" => [ "dgram" ], 470*e71b7053SJung-uk Kim "dtls" => [ @dtls ], 471*e71b7053SJung-uk Kim sub { 0 == scalar grep { !$disabled{$_} } @dtls } 472*e71b7053SJung-uk Kim => [ "dtls" ], 473*e71b7053SJung-uk Kim 474*e71b7053SJung-uk Kim "tls" => [ @tls ], 475*e71b7053SJung-uk Kim sub { 0 == scalar grep { !$disabled{$_} } @tls } 476*e71b7053SJung-uk Kim => [ "tls" ], 477*e71b7053SJung-uk Kim 478*e71b7053SJung-uk Kim "crypto-mdebug" => [ "crypto-mdebug-backtrace" ], 479*e71b7053SJung-uk Kim 480*e71b7053SJung-uk Kim # Without DSO, we can't load dynamic engines, so don't build them dynamic 481*e71b7053SJung-uk Kim "dso" => [ "dynamic-engine" ], 482*e71b7053SJung-uk Kim 483*e71b7053SJung-uk Kim # Without position independent code, there can be no shared libraries or DSOs 484*e71b7053SJung-uk Kim "pic" => [ "shared" ], 485*e71b7053SJung-uk Kim "shared" => [ "dynamic-engine" ], 486*e71b7053SJung-uk Kim "engine" => [ "afalgeng", "devcryptoeng" ], 487*e71b7053SJung-uk Kim 488*e71b7053SJung-uk Kim # no-autoalginit is only useful when building non-shared 489*e71b7053SJung-uk Kim "autoalginit" => [ "shared", "apps" ], 490*e71b7053SJung-uk Kim 491*e71b7053SJung-uk Kim "stdio" => [ "apps", "capieng", "egd" ], 492*e71b7053SJung-uk Kim "apps" => [ "tests" ], 493*e71b7053SJung-uk Kim "tests" => [ "external-tests" ], 494*e71b7053SJung-uk Kim "comp" => [ "zlib" ], 495*e71b7053SJung-uk Kim "ec" => [ "tls1_3", "sm2" ], 496*e71b7053SJung-uk Kim "sm3" => [ "sm2" ], 497*e71b7053SJung-uk Kim sub { !$disabled{"unit-test"} } => [ "heartbeats" ], 498*e71b7053SJung-uk Kim 499*e71b7053SJung-uk Kim sub { !$disabled{"msan"} } => [ "asm" ], 500*e71b7053SJung-uk Kim ); 501*e71b7053SJung-uk Kim 502*e71b7053SJung-uk Kim# Avoid protocol support holes. Also disable all versions below N, if version 503*e71b7053SJung-uk Kim# N is disabled while N+1 is enabled. 504*e71b7053SJung-uk Kim# 505*e71b7053SJung-uk Kimmy @list = (reverse @tls); 506*e71b7053SJung-uk Kimwhile ((my $first, my $second) = (shift @list, shift @list)) { 507*e71b7053SJung-uk Kim last unless @list; 508*e71b7053SJung-uk Kim push @disable_cascades, ( sub { !$disabled{$first} && $disabled{$second} } 509*e71b7053SJung-uk Kim => [ @list ] ); 510*e71b7053SJung-uk Kim unshift @list, $second; 511*e71b7053SJung-uk Kim} 512*e71b7053SJung-uk Kimmy @list = (reverse @dtls); 513*e71b7053SJung-uk Kimwhile ((my $first, my $second) = (shift @list, shift @list)) { 514*e71b7053SJung-uk Kim last unless @list; 515*e71b7053SJung-uk Kim push @disable_cascades, ( sub { !$disabled{$first} && $disabled{$second} } 516*e71b7053SJung-uk Kim => [ @list ] ); 517*e71b7053SJung-uk Kim unshift @list, $second; 518*e71b7053SJung-uk Kim} 519db522d3aSSimon L. B. Nielsen 520db522d3aSSimon L. B. Nielsen# Explicit "no-..." options will be collected in %disabled along with the defaults. 521*e71b7053SJung-uk Kim# To remove something from %disabled, use "enable-foo". 522db522d3aSSimon L. B. Nielsen# For symmetry, "disable-foo" is a synonym for "no-foo". 523db522d3aSSimon L. B. Nielsen 52474664626SKris Kennaway&usage if ($#ARGV < 0); 52574664626SKris Kennaway 526*e71b7053SJung-uk Kim# For the "make variables" CINCLUDES and CDEFINES, we support lists with 527*e71b7053SJung-uk Kim# platform specific list separators. Users from those platforms should 528*e71b7053SJung-uk Kim# recognise those separators from how you set up the PATH to find executables. 529*e71b7053SJung-uk Kim# The default is the Unix like separator, :, but as an exception, we also 530*e71b7053SJung-uk Kim# support the space as separator. 531*e71b7053SJung-uk Kimmy $list_separator_re = 532*e71b7053SJung-uk Kim { VMS => qr/(?<!\^),/, 533*e71b7053SJung-uk Kim MSWin32 => qr/(?<!\\);/ } -> {$^O} // qr/(?<!\\)[:\s]/; 534*e71b7053SJung-uk Kim# All the "make variables" we support 535*e71b7053SJung-uk Kim# Some get pre-populated for the sake of backward compatibility 536*e71b7053SJung-uk Kim# (we supported those before the change to "make variable" support. 537*e71b7053SJung-uk Kimmy %user = ( 538*e71b7053SJung-uk Kim AR => env('AR'), 539*e71b7053SJung-uk Kim ARFLAGS => [], 540*e71b7053SJung-uk Kim AS => undef, 541*e71b7053SJung-uk Kim ASFLAGS => [], 542*e71b7053SJung-uk Kim CC => env('CC'), 543*e71b7053SJung-uk Kim CFLAGS => [], 544*e71b7053SJung-uk Kim CXX => env('CXX'), 545*e71b7053SJung-uk Kim CXXFLAGS => [], 546*e71b7053SJung-uk Kim CPP => undef, 547*e71b7053SJung-uk Kim CPPFLAGS => [], # -D, -I, -Wp, 548*e71b7053SJung-uk Kim CPPDEFINES => [], # Alternative for -D 549*e71b7053SJung-uk Kim CPPINCLUDES => [], # Alternative for -I 550*e71b7053SJung-uk Kim CROSS_COMPILE => env('CROSS_COMPILE'), 551*e71b7053SJung-uk Kim HASHBANGPERL=> env('HASHBANGPERL') || env('PERL'), 552*e71b7053SJung-uk Kim LD => undef, 553*e71b7053SJung-uk Kim LDFLAGS => [], # -L, -Wl, 554*e71b7053SJung-uk Kim LDLIBS => [], # -l 555*e71b7053SJung-uk Kim MT => undef, 556*e71b7053SJung-uk Kim MTFLAGS => [], 557*e71b7053SJung-uk Kim PERL => env('PERL') || ($^O ne "VMS" ? $^X : "perl"), 558*e71b7053SJung-uk Kim RANLIB => env('RANLIB'), 559*e71b7053SJung-uk Kim RC => env('RC') || env('WINDRES'), 560*e71b7053SJung-uk Kim RCFLAGS => [], 561*e71b7053SJung-uk Kim RM => undef, 562*e71b7053SJung-uk Kim ); 563*e71b7053SJung-uk Kim# Info about what "make variables" may be prefixed with the cross compiler 564*e71b7053SJung-uk Kim# prefix. This should NEVER mention any such variable with a list for value. 565*e71b7053SJung-uk Kimmy @user_crossable = qw ( AR AS CC CXX CPP LD MT RANLIB RC ); 566*e71b7053SJung-uk Kim# The same but for flags given as Configure options. These are *additional* 567*e71b7053SJung-uk Kim# input, as opposed to the VAR=string option that override the corresponding 568*e71b7053SJung-uk Kim# config target attributes 569*e71b7053SJung-uk Kimmy %useradd = ( 570*e71b7053SJung-uk Kim CPPDEFINES => [], 571*e71b7053SJung-uk Kim CPPINCLUDES => [], 572*e71b7053SJung-uk Kim CPPFLAGS => [], 573*e71b7053SJung-uk Kim CFLAGS => [], 574*e71b7053SJung-uk Kim CXXFLAGS => [], 575*e71b7053SJung-uk Kim LDFLAGS => [], 576*e71b7053SJung-uk Kim LDLIBS => [], 577*e71b7053SJung-uk Kim ); 578ddd58736SKris Kennaway 579*e71b7053SJung-uk Kimmy %user_synonyms = ( 580*e71b7053SJung-uk Kim HASHBANGPERL=> 'PERL', 581*e71b7053SJung-uk Kim RC => 'WINDRES', 582*e71b7053SJung-uk Kim ); 583ddd58736SKris Kennaway 584*e71b7053SJung-uk Kim# Some target attributes have been renamed, this is the translation table 585*e71b7053SJung-uk Kimmy %target_attr_translate =( 586*e71b7053SJung-uk Kim ar => 'AR', 587*e71b7053SJung-uk Kim as => 'AS', 588*e71b7053SJung-uk Kim cc => 'CC', 589*e71b7053SJung-uk Kim cxx => 'CXX', 590*e71b7053SJung-uk Kim cpp => 'CPP', 591*e71b7053SJung-uk Kim hashbangperl => 'HASHBANGPERL', 592*e71b7053SJung-uk Kim ld => 'LD', 593*e71b7053SJung-uk Kim mt => 'MT', 594*e71b7053SJung-uk Kim ranlib => 'RANLIB', 595*e71b7053SJung-uk Kim rc => 'RC', 596*e71b7053SJung-uk Kim rm => 'RM', 597*e71b7053SJung-uk Kim ); 598*e71b7053SJung-uk Kim 599*e71b7053SJung-uk Kim# Initialisers coming from 'config' scripts 600*e71b7053SJung-uk Kim$config{defines} = [ split(/$list_separator_re/, env('__CNF_CPPDEFINES')) ]; 601*e71b7053SJung-uk Kim$config{includes} = [ split(/$list_separator_re/, env('__CNF_CPPINCLUDES')) ]; 602*e71b7053SJung-uk Kim$config{cppflags} = [ env('__CNF_CPPFLAGS') || () ]; 603*e71b7053SJung-uk Kim$config{cflags} = [ env('__CNF_CFLAGS') || () ]; 604*e71b7053SJung-uk Kim$config{cxxflags} = [ env('__CNF_CXXFLAGS') || () ]; 605*e71b7053SJung-uk Kim$config{lflags} = [ env('__CNF_LDFLAGS') || () ]; 606*e71b7053SJung-uk Kim$config{ex_libs} = [ env('__CNF_LDLIBS') || () ]; 607*e71b7053SJung-uk Kim 608*e71b7053SJung-uk Kim$config{openssl_api_defines}=[]; 609*e71b7053SJung-uk Kim$config{openssl_algorithm_defines}=[]; 610*e71b7053SJung-uk Kim$config{openssl_thread_defines}=[]; 611*e71b7053SJung-uk Kim$config{openssl_sys_defines}=[]; 612*e71b7053SJung-uk Kim$config{openssl_other_defines}=[]; 613*e71b7053SJung-uk Kim$config{options}=""; 614*e71b7053SJung-uk Kim$config{build_type} = "release"; 615*e71b7053SJung-uk Kimmy $target=""; 616*e71b7053SJung-uk Kim 617*e71b7053SJung-uk Kimmy %cmdvars = (); # Stores FOO='blah' type arguments 618*e71b7053SJung-uk Kimmy %unsupported_options = (); 619*e71b7053SJung-uk Kimmy %deprecated_options = (); 620*e71b7053SJung-uk Kim# If you change this, update apps/version.c 621*e71b7053SJung-uk Kimmy @known_seed_sources = qw(getrandom devrandom os egd none rdcpu librandom); 622*e71b7053SJung-uk Kimmy @seed_sources = (); 623*e71b7053SJung-uk Kimwhile (@argvcopy) 624ddd58736SKris Kennaway { 625*e71b7053SJung-uk Kim $_ = shift @argvcopy; 626ddd58736SKris Kennaway 627*e71b7053SJung-uk Kim # Support env variable assignments among the options 628*e71b7053SJung-uk Kim if (m|^(\w+)=(.+)?$|) 62974664626SKris Kennaway { 630*e71b7053SJung-uk Kim $cmdvars{$1} = $2; 631*e71b7053SJung-uk Kim # Every time a variable is given as a configuration argument, 632*e71b7053SJung-uk Kim # it acts as a reset if the variable. 633*e71b7053SJung-uk Kim if (exists $user{$1}) 634*e71b7053SJung-uk Kim { 635*e71b7053SJung-uk Kim $user{$1} = ref $user{$1} eq "ARRAY" ? [] : undef; 636*e71b7053SJung-uk Kim } 637*e71b7053SJung-uk Kim #if (exists $useradd{$1}) 638*e71b7053SJung-uk Kim # { 639*e71b7053SJung-uk Kim # $useradd{$1} = []; 640*e71b7053SJung-uk Kim # } 641*e71b7053SJung-uk Kim next; 642*e71b7053SJung-uk Kim } 643*e71b7053SJung-uk Kim 644*e71b7053SJung-uk Kim # VMS is a case insensitive environment, and depending on settings 645*e71b7053SJung-uk Kim # out of our control, we may receive options uppercased. Let's 646*e71b7053SJung-uk Kim # downcase at least the part before any equal sign. 647*e71b7053SJung-uk Kim if ($^O eq "VMS") 648*e71b7053SJung-uk Kim { 649*e71b7053SJung-uk Kim s/^([^=]*)/lc($1)/e; 650*e71b7053SJung-uk Kim } 651*e71b7053SJung-uk Kim 652*e71b7053SJung-uk Kim # some people just can't read the instructions, clang people have to... 653*e71b7053SJung-uk Kim s/^-no-(?!integrated-as)/no-/; 6543b4e3dcbSSimon L. B. Nielsen 6553b4e3dcbSSimon L. B. Nielsen # rewrite some options in "enable-..." form 6563b4e3dcbSSimon L. B. Nielsen s /^-?-?shared$/enable-shared/; 6571f13597dSJung-uk Kim s /^sctp$/enable-sctp/; 6583b4e3dcbSSimon L. B. Nielsen s /^threads$/enable-threads/; 6593b4e3dcbSSimon L. B. Nielsen s /^zlib$/enable-zlib/; 6603b4e3dcbSSimon L. B. Nielsen s /^zlib-dynamic$/enable-zlib-dynamic/; 6613b4e3dcbSSimon L. B. Nielsen 662*e71b7053SJung-uk Kim if (/^(no|disable|enable)-(.+)$/) 663*e71b7053SJung-uk Kim { 664*e71b7053SJung-uk Kim my $word = $2; 665*e71b7053SJung-uk Kim if (!exists $deprecated_disablables{$word} 666*e71b7053SJung-uk Kim && !grep { $word =~ /^${_}$/ } @disablables) 667*e71b7053SJung-uk Kim { 668*e71b7053SJung-uk Kim $unsupported_options{$_} = 1; 669*e71b7053SJung-uk Kim next; 670*e71b7053SJung-uk Kim } 671*e71b7053SJung-uk Kim } 6723b4e3dcbSSimon L. B. Nielsen if (/^no-(.+)$/ || /^disable-(.+)$/) 6733b4e3dcbSSimon L. B. Nielsen { 674*e71b7053SJung-uk Kim foreach my $proto ((@tls, @dtls)) 675db522d3aSSimon L. B. Nielsen { 676*e71b7053SJung-uk Kim if ($1 eq "$proto-method") 6773b4e3dcbSSimon L. B. Nielsen { 678*e71b7053SJung-uk Kim $disabled{"$proto"} = "option($proto-method)"; 679*e71b7053SJung-uk Kim last; 680*e71b7053SJung-uk Kim } 681*e71b7053SJung-uk Kim } 682*e71b7053SJung-uk Kim if ($1 eq "dtls") 683*e71b7053SJung-uk Kim { 684*e71b7053SJung-uk Kim foreach my $proto (@dtls) 685*e71b7053SJung-uk Kim { 686*e71b7053SJung-uk Kim $disabled{$proto} = "option(dtls)"; 687*e71b7053SJung-uk Kim } 688*e71b7053SJung-uk Kim $disabled{"dtls"} = "option(dtls)"; 689*e71b7053SJung-uk Kim } 690*e71b7053SJung-uk Kim elsif ($1 eq "ssl") 691*e71b7053SJung-uk Kim { 692*e71b7053SJung-uk Kim # Last one of its kind 6933b4e3dcbSSimon L. B. Nielsen $disabled{"ssl3"} = "option(ssl)"; 6943b4e3dcbSSimon L. B. Nielsen } 6953b4e3dcbSSimon L. B. Nielsen elsif ($1 eq "tls") 6963b4e3dcbSSimon L. B. Nielsen { 697*e71b7053SJung-uk Kim # XXX: Tests will fail if all SSL/TLS 698*e71b7053SJung-uk Kim # protocols are disabled. 699*e71b7053SJung-uk Kim foreach my $proto (@tls) 700751d2991SJung-uk Kim { 701*e71b7053SJung-uk Kim $disabled{$proto} = "option(tls)"; 702*e71b7053SJung-uk Kim } 703*e71b7053SJung-uk Kim } 704*e71b7053SJung-uk Kim elsif ($1 eq "static-engine") 705*e71b7053SJung-uk Kim { 706*e71b7053SJung-uk Kim delete $disabled{"dynamic-engine"}; 707*e71b7053SJung-uk Kim } 708*e71b7053SJung-uk Kim elsif ($1 eq "dynamic-engine") 709*e71b7053SJung-uk Kim { 710*e71b7053SJung-uk Kim $disabled{"dynamic-engine"} = "option"; 711*e71b7053SJung-uk Kim } 712*e71b7053SJung-uk Kim elsif (exists $deprecated_disablables{$1}) 713*e71b7053SJung-uk Kim { 714*e71b7053SJung-uk Kim $deprecated_options{$_} = 1; 715*e71b7053SJung-uk Kim if (defined $deprecated_disablables{$1}) 716*e71b7053SJung-uk Kim { 717*e71b7053SJung-uk Kim $disabled{$deprecated_disablables{$1}} = "option"; 718*e71b7053SJung-uk Kim } 719751d2991SJung-uk Kim } 7203b4e3dcbSSimon L. B. Nielsen else 7213b4e3dcbSSimon L. B. Nielsen { 7223b4e3dcbSSimon L. B. Nielsen $disabled{$1} = "option"; 7233b4e3dcbSSimon L. B. Nielsen } 724*e71b7053SJung-uk Kim # No longer an automatic choice 725*e71b7053SJung-uk Kim $auto_threads = 0 if ($1 eq "threads"); 7263b4e3dcbSSimon L. B. Nielsen } 727*e71b7053SJung-uk Kim elsif (/^enable-(.+)$/) 7283b4e3dcbSSimon L. B. Nielsen { 729*e71b7053SJung-uk Kim if ($1 eq "static-engine") 730*e71b7053SJung-uk Kim { 731*e71b7053SJung-uk Kim $disabled{"dynamic-engine"} = "option"; 732*e71b7053SJung-uk Kim } 733*e71b7053SJung-uk Kim elsif ($1 eq "dynamic-engine") 734*e71b7053SJung-uk Kim { 735*e71b7053SJung-uk Kim delete $disabled{"dynamic-engine"}; 736*e71b7053SJung-uk Kim } 737*e71b7053SJung-uk Kim elsif ($1 eq "zlib-dynamic") 738*e71b7053SJung-uk Kim { 739*e71b7053SJung-uk Kim delete $disabled{"zlib"}; 740*e71b7053SJung-uk Kim } 741db522d3aSSimon L. B. Nielsen my $algo = $1; 742db522d3aSSimon L. B. Nielsen delete $disabled{$algo}; 7433b4e3dcbSSimon L. B. Nielsen 744*e71b7053SJung-uk Kim # No longer an automatic choice 745*e71b7053SJung-uk Kim $auto_threads = 0 if ($1 eq "threads"); 7463b4e3dcbSSimon L. B. Nielsen } 747*e71b7053SJung-uk Kim elsif (/^--strict-warnings$/) 7486a599222SSimon L. B. Nielsen { 7496a599222SSimon L. B. Nielsen $strict_warnings = 1; 7506a599222SSimon L. B. Nielsen } 751*e71b7053SJung-uk Kim elsif (/^--debug$/) 752ddd58736SKris Kennaway { 753*e71b7053SJung-uk Kim $config{build_type} = "debug"; 754ddd58736SKris Kennaway } 755*e71b7053SJung-uk Kim elsif (/^--release$/) 756*e71b7053SJung-uk Kim { 757*e71b7053SJung-uk Kim $config{build_type} = "release"; 758ddd58736SKris Kennaway } 75974664626SKris Kennaway elsif (/^386$/) 760*e71b7053SJung-uk Kim { $config{processor}=386; } 761db522d3aSSimon L. B. Nielsen elsif (/^fips$/) 762db522d3aSSimon L. B. Nielsen { 763*e71b7053SJung-uk Kim die "FIPS mode not supported\n"; 764db522d3aSSimon L. B. Nielsen } 76574664626SKris Kennaway elsif (/^rsaref$/) 76674664626SKris Kennaway { 7675c87c606SMark Murray # No RSAref support any more since it's not needed. 7685c87c606SMark Murray # The check for the option is there so scripts aren't 7695c87c606SMark Murray # broken 77074664626SKris Kennaway } 771*e71b7053SJung-uk Kim elsif (/^nofipscanistercheck$/) 772*e71b7053SJung-uk Kim { 773*e71b7053SJung-uk Kim die "FIPS mode not supported\n"; 774*e71b7053SJung-uk Kim } 77574664626SKris Kennaway elsif (/^[-+]/) 77674664626SKris Kennaway { 7777bded2dbSJung-uk Kim if (/^--prefix=(.*)$/) 77874664626SKris Kennaway { 779*e71b7053SJung-uk Kim $config{prefix}=$1; 780*e71b7053SJung-uk Kim die "Directory given with --prefix MUST be absolute\n" 781*e71b7053SJung-uk Kim unless file_name_is_absolute($config{prefix}); 782*e71b7053SJung-uk Kim } 783*e71b7053SJung-uk Kim elsif (/^--api=(.*)$/) 784*e71b7053SJung-uk Kim { 785*e71b7053SJung-uk Kim $config{api}=$1; 78674664626SKris Kennaway } 7876a599222SSimon L. B. Nielsen elsif (/^--libdir=(.*)$/) 7886a599222SSimon L. B. Nielsen { 789*e71b7053SJung-uk Kim $config{libdir}=$1; 7906a599222SSimon L. B. Nielsen } 79174664626SKris Kennaway elsif (/^--openssldir=(.*)$/) 79274664626SKris Kennaway { 793*e71b7053SJung-uk Kim $config{openssldir}=$1; 7945c87c606SMark Murray } 7953b4e3dcbSSimon L. B. Nielsen elsif (/^--with-zlib-lib=(.*)$/) 7963b4e3dcbSSimon L. B. Nielsen { 797*e71b7053SJung-uk Kim $withargs{zlib_lib}=$1; 7983b4e3dcbSSimon L. B. Nielsen } 7993b4e3dcbSSimon L. B. Nielsen elsif (/^--with-zlib-include=(.*)$/) 8003b4e3dcbSSimon L. B. Nielsen { 801*e71b7053SJung-uk Kim $withargs{zlib_include}=$1; 8023b4e3dcbSSimon L. B. Nielsen } 803*e71b7053SJung-uk Kim elsif (/^--with-fuzzer-lib=(.*)$/) 8041f13597dSJung-uk Kim { 805*e71b7053SJung-uk Kim $withargs{fuzzer_lib}=$1; 8061f13597dSJung-uk Kim } 807*e71b7053SJung-uk Kim elsif (/^--with-fuzzer-include=(.*)$/) 808db522d3aSSimon L. B. Nielsen { 809*e71b7053SJung-uk Kim $withargs{fuzzer_include}=$1; 810db522d3aSSimon L. B. Nielsen } 811*e71b7053SJung-uk Kim elsif (/^--with-rand-seed=(.*)$/) 812db522d3aSSimon L. B. Nielsen { 813*e71b7053SJung-uk Kim foreach my $x (split(m|,|, $1)) 814*e71b7053SJung-uk Kim { 815*e71b7053SJung-uk Kim die "Unknown --with-rand-seed choice $x\n" 816*e71b7053SJung-uk Kim if ! grep { $x eq $_ } @known_seed_sources; 817*e71b7053SJung-uk Kim push @seed_sources, $x; 818*e71b7053SJung-uk Kim } 819db522d3aSSimon L. B. Nielsen } 8201f13597dSJung-uk Kim elsif (/^--cross-compile-prefix=(.*)$/) 8211f13597dSJung-uk Kim { 822*e71b7053SJung-uk Kim $user{CROSS_COMPILE}=$1; 8231f13597dSJung-uk Kim } 824*e71b7053SJung-uk Kim elsif (/^--config=(.*)$/) 82574664626SKris Kennaway { 826*e71b7053SJung-uk Kim read_config $1; 827*e71b7053SJung-uk Kim } 828*e71b7053SJung-uk Kim elsif (/^-l(.*)$/) 829*e71b7053SJung-uk Kim { 830*e71b7053SJung-uk Kim push @{$useradd{LDLIBS}}, $_; 831*e71b7053SJung-uk Kim } 832*e71b7053SJung-uk Kim elsif (/^-framework$/) 833*e71b7053SJung-uk Kim { 834*e71b7053SJung-uk Kim push @{$useradd{LDLIBS}}, $_, shift(@argvcopy); 835*e71b7053SJung-uk Kim } 836*e71b7053SJung-uk Kim elsif (/^-L(.*)$/ or /^-Wl,/) 837*e71b7053SJung-uk Kim { 838*e71b7053SJung-uk Kim push @{$useradd{LDFLAGS}}, $_; 839*e71b7053SJung-uk Kim } 840*e71b7053SJung-uk Kim elsif (/^-rpath$/ or /^-R$/) 841*e71b7053SJung-uk Kim # -rpath is the OSF1 rpath flag 842*e71b7053SJung-uk Kim # -R is the old Solaris rpath flag 843*e71b7053SJung-uk Kim { 844*e71b7053SJung-uk Kim my $rpath = shift(@argvcopy) || ""; 845*e71b7053SJung-uk Kim $rpath .= " " if $rpath ne ""; 846*e71b7053SJung-uk Kim push @{$useradd{LDFLAGS}}, $_, $rpath; 847*e71b7053SJung-uk Kim } 848*e71b7053SJung-uk Kim elsif (/^-static$/) 849*e71b7053SJung-uk Kim { 850*e71b7053SJung-uk Kim push @{$useradd{LDFLAGS}}, $_; 851*e71b7053SJung-uk Kim $disabled{"dso"} = "forced"; 852*e71b7053SJung-uk Kim $disabled{"pic"} = "forced"; 853*e71b7053SJung-uk Kim $disabled{"shared"} = "forced"; 854*e71b7053SJung-uk Kim $disabled{"threads"} = "forced"; 855*e71b7053SJung-uk Kim } 856*e71b7053SJung-uk Kim elsif (/^-D(.*)$/) 857*e71b7053SJung-uk Kim { 858*e71b7053SJung-uk Kim push @{$useradd{CPPDEFINES}}, $1; 859*e71b7053SJung-uk Kim } 860*e71b7053SJung-uk Kim elsif (/^-I(.*)$/) 861*e71b7053SJung-uk Kim { 862*e71b7053SJung-uk Kim push @{$useradd{CPPINCLUDES}}, $1; 863*e71b7053SJung-uk Kim } 864*e71b7053SJung-uk Kim elsif (/^-Wp,$/) 865*e71b7053SJung-uk Kim { 866*e71b7053SJung-uk Kim push @{$useradd{CPPFLAGS}}, $1; 8677bded2dbSJung-uk Kim } 8687bded2dbSJung-uk Kim else # common if (/^[-+]/), just pass down... 8697bded2dbSJung-uk Kim { 8707bded2dbSJung-uk Kim $_ =~ s/%([0-9a-f]{1,2})/chr(hex($1))/gei; 871*e71b7053SJung-uk Kim push @{$useradd{CFLAGS}}, $_; 872*e71b7053SJung-uk Kim push @{$useradd{CXXFLAGS}}, $_; 87374664626SKris Kennaway } 87474664626SKris Kennaway } 87574664626SKris Kennaway else 87674664626SKris Kennaway { 8773b4e3dcbSSimon L. B. Nielsen die "target already defined - $target (offending arg: $_)\n" if ($target ne ""); 87874664626SKris Kennaway $target=$_; 87974664626SKris Kennaway } 8803b4e3dcbSSimon L. B. Nielsen unless ($_ eq $target || /^no-/ || /^disable-/) 8815c87c606SMark Murray { 882*e71b7053SJung-uk Kim # "no-..." follows later after implied deactivations 883*e71b7053SJung-uk Kim # have been derived. (Don't take this too seriously, 8843b4e3dcbSSimon L. B. Nielsen # we really only write OPTIONS to the Makefile out of 8853b4e3dcbSSimon L. B. Nielsen # nostalgia.) 8863b4e3dcbSSimon L. B. Nielsen 887*e71b7053SJung-uk Kim if ($config{options} eq "") 888*e71b7053SJung-uk Kim { $config{options} = $_; } 8893b4e3dcbSSimon L. B. Nielsen else 890*e71b7053SJung-uk Kim { $config{options} .= " ".$_; } 8913b4e3dcbSSimon L. B. Nielsen } 8925c87c606SMark Murray } 8935c87c606SMark Murray 894*e71b7053SJung-uk Kimif (defined($config{api}) && !exists $apitable->{$config{api}}) { 895*e71b7053SJung-uk Kim die "***** Unsupported api compatibility level: $config{api}\n", 896*e71b7053SJung-uk Kim} 8973b4e3dcbSSimon L. B. Nielsen 898*e71b7053SJung-uk Kimif (keys %deprecated_options) 8995c87c606SMark Murray { 900*e71b7053SJung-uk Kim warn "***** Deprecated options: ", 901*e71b7053SJung-uk Kim join(", ", keys %deprecated_options), "\n"; 902*e71b7053SJung-uk Kim } 903*e71b7053SJung-uk Kimif (keys %unsupported_options) 904*e71b7053SJung-uk Kim { 905*e71b7053SJung-uk Kim die "***** Unsupported options: ", 906*e71b7053SJung-uk Kim join(", ", keys %unsupported_options), "\n"; 9075c87c606SMark Murray } 9085c87c606SMark Murray 909*e71b7053SJung-uk Kim# If any %useradd entry has been set, we must check that the "make 910*e71b7053SJung-uk Kim# variables" haven't been set. We start by checking of any %useradd entry 911*e71b7053SJung-uk Kim# is set. 912*e71b7053SJung-uk Kimif (grep { scalar @$_ > 0 } values %useradd) { 913*e71b7053SJung-uk Kim # Hash of env / make variables names. The possible values are: 914*e71b7053SJung-uk Kim # 1 - "make vars" 915*e71b7053SJung-uk Kim # 2 - %useradd entry set 916*e71b7053SJung-uk Kim # 3 - both set 917*e71b7053SJung-uk Kim my %detected_vars = 918*e71b7053SJung-uk Kim map { my $v = 0; 919*e71b7053SJung-uk Kim $v += 1 if $cmdvars{$_}; 920*e71b7053SJung-uk Kim $v += 2 if @{$useradd{$_}}; 921*e71b7053SJung-uk Kim $_ => $v } 922*e71b7053SJung-uk Kim keys %useradd; 923*e71b7053SJung-uk Kim 924*e71b7053SJung-uk Kim # If any of the corresponding "make variables" is set, we error 925*e71b7053SJung-uk Kim if (grep { $_ & 1 } values %detected_vars) { 926*e71b7053SJung-uk Kim my $names = join(', ', grep { $detected_vars{$_} > 0 } 927*e71b7053SJung-uk Kim sort keys %detected_vars); 928*e71b7053SJung-uk Kim die <<"_____"; 929*e71b7053SJung-uk Kim***** Mixing make variables and additional compiler/linker flags as 930*e71b7053SJung-uk Kim***** configure command line option is not permitted. 931*e71b7053SJung-uk Kim***** Affected make variables: $names 932*e71b7053SJung-uk Kim_____ 933*e71b7053SJung-uk Kim } 9345c87c606SMark Murray} 9355c87c606SMark Murray 936*e71b7053SJung-uk Kim# Check through all supported command line variables to see if any of them 937*e71b7053SJung-uk Kim# were set, and canonicalise the values we got. If no compiler or linker 938*e71b7053SJung-uk Kim# flag or anything else that affects %useradd was set, we also check the 939*e71b7053SJung-uk Kim# environment for values. 940*e71b7053SJung-uk Kimmy $anyuseradd = 941*e71b7053SJung-uk Kim grep { defined $_ && (ref $_ ne 'ARRAY' || @$_) } values %useradd; 942*e71b7053SJung-uk Kimforeach (keys %user) { 943*e71b7053SJung-uk Kim my $value = $cmdvars{$_}; 944*e71b7053SJung-uk Kim $value //= env($_) unless $anyuseradd; 945*e71b7053SJung-uk Kim $value //= 946*e71b7053SJung-uk Kim defined $user_synonyms{$_} ? $cmdvars{$user_synonyms{$_}} : undef; 947*e71b7053SJung-uk Kim $value //= defined $user_synonyms{$_} ? env($user_synonyms{$_}) : undef 948*e71b7053SJung-uk Kim unless $anyuseradd; 949*e71b7053SJung-uk Kim 950*e71b7053SJung-uk Kim if (defined $value) { 951*e71b7053SJung-uk Kim if (ref $user{$_} eq 'ARRAY') { 952*e71b7053SJung-uk Kim $user{$_} = [ split /$list_separator_re/, $value ]; 953*e71b7053SJung-uk Kim } elsif (!defined $user{$_}) { 954*e71b7053SJung-uk Kim $user{$_} = $value; 955*e71b7053SJung-uk Kim } 956*e71b7053SJung-uk Kim } 9573b4e3dcbSSimon L. B. Nielsen} 9583b4e3dcbSSimon L. B. Nielsen 959*e71b7053SJung-uk Kimif (grep { /-rpath\b/ } ($user{LDFLAGS} ? @{$user{LDFLAGS}} : ()) 960*e71b7053SJung-uk Kim && !$disabled{shared} 961*e71b7053SJung-uk Kim && !($disabled{asan} && $disabled{msan} && $disabled{ubsan})) { 962*e71b7053SJung-uk Kim die "***** Cannot simultaneously use -rpath, shared libraries, and\n", 963*e71b7053SJung-uk Kim "***** any of asan, msan or ubsan\n"; 9643b4e3dcbSSimon L. B. Nielsen} 9653b4e3dcbSSimon L. B. Nielsen 966*e71b7053SJung-uk Kimmy @tocheckfor = (keys %disabled); 967*e71b7053SJung-uk Kimwhile (@tocheckfor) { 968*e71b7053SJung-uk Kim my %new_tocheckfor = (); 969*e71b7053SJung-uk Kim my @cascade_copy = (@disable_cascades); 970*e71b7053SJung-uk Kim while (@cascade_copy) { 971*e71b7053SJung-uk Kim my ($test, $descendents) = (shift @cascade_copy, shift @cascade_copy); 972*e71b7053SJung-uk Kim if (ref($test) eq "CODE" ? $test->() : defined($disabled{$test})) { 973*e71b7053SJung-uk Kim foreach(grep { !defined($disabled{$_}) } @$descendents) { 974*e71b7053SJung-uk Kim $new_tocheckfor{$_} = 1; $disabled{$_} = "forced"; 975*e71b7053SJung-uk Kim } 976*e71b7053SJung-uk Kim } 977*e71b7053SJung-uk Kim } 978*e71b7053SJung-uk Kim @tocheckfor = (keys %new_tocheckfor); 9793b4e3dcbSSimon L. B. Nielsen} 9803b4e3dcbSSimon L. B. Nielsen 981*e71b7053SJung-uk Kimour $die = sub { die @_; }; 98274664626SKris Kennawayif ($target eq "TABLE") { 983*e71b7053SJung-uk Kim local $die = sub { warn @_; }; 984*e71b7053SJung-uk Kim foreach (sort keys %table) { 985*e71b7053SJung-uk Kim print_table_entry($_, "TABLE"); 98674664626SKris Kennaway } 98774664626SKris Kennaway exit 0; 98874664626SKris Kennaway} 98974664626SKris Kennaway 990f579bf8eSKris Kennawayif ($target eq "LIST") { 991f579bf8eSKris Kennaway foreach (sort keys %table) { 992*e71b7053SJung-uk Kim print $_,"\n" unless $table{$_}->{template}; 993f579bf8eSKris Kennaway } 994f579bf8eSKris Kennaway exit 0; 995f579bf8eSKris Kennaway} 996f579bf8eSKris Kennaway 997*e71b7053SJung-uk Kimif ($target eq "HASH") { 998*e71b7053SJung-uk Kim local $die = sub { warn @_; }; 999*e71b7053SJung-uk Kim print "%table = (\n"; 1000*e71b7053SJung-uk Kim foreach (sort keys %table) { 1001*e71b7053SJung-uk Kim print_table_entry($_, "HASH"); 1002*e71b7053SJung-uk Kim } 1003*e71b7053SJung-uk Kim exit 0; 1004*e71b7053SJung-uk Kim} 1005*e71b7053SJung-uk Kim 1006*e71b7053SJung-uk Kimprint "Configuring OpenSSL version $config{version} ($config{version_num}) "; 1007*e71b7053SJung-uk Kimprint "for $target\n"; 1008*e71b7053SJung-uk Kim 1009*e71b7053SJung-uk Kimif (scalar(@seed_sources) == 0) { 1010*e71b7053SJung-uk Kim print "Using os-specific seed configuration\n"; 1011*e71b7053SJung-uk Kim push @seed_sources, 'os'; 1012*e71b7053SJung-uk Kim} 1013*e71b7053SJung-uk Kimif (scalar(grep { $_ eq 'none' } @seed_sources) > 0) { 1014*e71b7053SJung-uk Kim die "Cannot seed with none and anything else" if scalar(@seed_sources) > 1; 1015*e71b7053SJung-uk Kim warn <<_____ if scalar(@seed_sources) == 1; 1016*e71b7053SJung-uk KimYou have selected the --with-rand-seed=none option, which effectively disables 1017*e71b7053SJung-uk Kimautomatic reseeding of the OpenSSL random generator. All operations depending 1018*e71b7053SJung-uk Kimon the random generator such as creating keys will not work unless the random 1019*e71b7053SJung-uk Kimgenerator is seeded manually by the application. 1020*e71b7053SJung-uk Kim 1021*e71b7053SJung-uk KimPlease read the 'Note on random number generation' section in the INSTALL 1022*e71b7053SJung-uk Kiminstructions and the RAND_DRBG(7) manual page for more details. 1023*e71b7053SJung-uk Kim_____ 1024*e71b7053SJung-uk Kim} 1025*e71b7053SJung-uk Kimpush @{$config{openssl_other_defines}}, 1026*e71b7053SJung-uk Kim map { (my $x = $_) =~ tr|[\-a-z]|[_A-Z]|; "OPENSSL_RAND_SEED_$x" } 1027*e71b7053SJung-uk Kim @seed_sources; 1028*e71b7053SJung-uk Kim 1029*e71b7053SJung-uk Kim# Backward compatibility? 1030c1803d78SJacques Vidrineif ($target =~ m/^CygWin32(-.*)$/) { 1031c1803d78SJacques Vidrine $target = "Cygwin".$1; 1032c1803d78SJacques Vidrine} 1033c1803d78SJacques Vidrine 1034*e71b7053SJung-uk Kim# Support for legacy targets having a name starting with 'debug-' 1035*e71b7053SJung-uk Kimmy ($d, $t) = $target =~ m/^(debug-)?(.*)$/; 1036*e71b7053SJung-uk Kimif ($d) { 1037*e71b7053SJung-uk Kim $config{build_type} = "debug"; 1038ddd58736SKris Kennaway 1039*e71b7053SJung-uk Kim # If we do not find debug-foo in the table, the target is set to foo. 1040*e71b7053SJung-uk Kim if (!$table{$target}) { 1041*e71b7053SJung-uk Kim $target = $t; 10421f13597dSJung-uk Kim } 1043*e71b7053SJung-uk Kim} 10441f13597dSJung-uk Kim 1045*e71b7053SJung-uk Kim&usage if !$table{$target} || $table{$target}->{template}; 1046*e71b7053SJung-uk Kim 1047*e71b7053SJung-uk Kim$config{target} = $target; 1048*e71b7053SJung-uk Kimmy %target = resolve_config($target); 1049*e71b7053SJung-uk Kim 1050*e71b7053SJung-uk Kimforeach (keys %target_attr_translate) { 1051*e71b7053SJung-uk Kim $target{$target_attr_translate{$_}} = $target{$_} 1052*e71b7053SJung-uk Kim if $target{$_}; 1053*e71b7053SJung-uk Kim delete $target{$_}; 1054*e71b7053SJung-uk Kim} 1055*e71b7053SJung-uk Kim 1056*e71b7053SJung-uk Kim%target = ( %{$table{DEFAULTS}}, %target ); 1057*e71b7053SJung-uk Kim 1058*e71b7053SJung-uk Kim# Make the flags to build DSOs the same as for shared libraries unless they 1059*e71b7053SJung-uk Kim# are already defined 1060*e71b7053SJung-uk Kim$target{module_cflags} = $target{shared_cflag} unless defined $target{module_cflags}; 1061*e71b7053SJung-uk Kim$target{module_cxxflags} = $target{shared_cxxflag} unless defined $target{module_cxxflags}; 1062*e71b7053SJung-uk Kim$target{module_ldflags} = $target{shared_ldflag} unless defined $target{module_ldflags}; 10631f13597dSJung-uk Kim{ 1064*e71b7053SJung-uk Kim my $shared_info_pl = 1065*e71b7053SJung-uk Kim catfile(dirname($0), "Configurations", "shared-info.pl"); 1066*e71b7053SJung-uk Kim my %shared_info = read_eval_file($shared_info_pl); 1067*e71b7053SJung-uk Kim push @{$target{_conf_fname_int}}, $shared_info_pl; 1068*e71b7053SJung-uk Kim my $si = $target{shared_target}; 1069*e71b7053SJung-uk Kim while (ref $si ne "HASH") { 1070*e71b7053SJung-uk Kim last if ! defined $si; 1071*e71b7053SJung-uk Kim if (ref $si eq "CODE") { 1072*e71b7053SJung-uk Kim $si = $si->(); 1073*e71b7053SJung-uk Kim } else { 1074*e71b7053SJung-uk Kim $si = $shared_info{$si}; 1075*e71b7053SJung-uk Kim } 1076*e71b7053SJung-uk Kim } 1077*e71b7053SJung-uk Kim 1078*e71b7053SJung-uk Kim # Some of the 'shared_target' values don't have any entried in 1079*e71b7053SJung-uk Kim # %shared_info. That's perfectly fine, AS LONG AS the build file 1080*e71b7053SJung-uk Kim # template knows how to handle this. That is currently the case for 1081*e71b7053SJung-uk Kim # Windows and VMS. 1082*e71b7053SJung-uk Kim if (defined $si) { 1083*e71b7053SJung-uk Kim # Just as above, copy certain shared_* attributes to the corresponding 1084*e71b7053SJung-uk Kim # module_ attribute unless the latter is already defined 1085*e71b7053SJung-uk Kim $si->{module_cflags} = $si->{shared_cflag} unless defined $si->{module_cflags}; 1086*e71b7053SJung-uk Kim $si->{module_cxxflags} = $si->{shared_cxxflag} unless defined $si->{module_cxxflags}; 1087*e71b7053SJung-uk Kim $si->{module_ldflags} = $si->{shared_ldflag} unless defined $si->{module_ldflags}; 1088*e71b7053SJung-uk Kim foreach (sort keys %$si) { 1089*e71b7053SJung-uk Kim $target{$_} = defined $target{$_} 1090*e71b7053SJung-uk Kim ? add($si->{$_})->($target{$_}) 1091*e71b7053SJung-uk Kim : $si->{$_}; 1092*e71b7053SJung-uk Kim } 1093*e71b7053SJung-uk Kim } 1094*e71b7053SJung-uk Kim} 1095*e71b7053SJung-uk Kim 1096*e71b7053SJung-uk Kimmy %conf_files = map { $_ => 1 } (@{$target{_conf_fname_int}}); 1097*e71b7053SJung-uk Kim$config{conf_files} = [ sort keys %conf_files ]; 1098*e71b7053SJung-uk Kim 1099*e71b7053SJung-uk Kimforeach my $feature (@{$target{disable}}) { 1100*e71b7053SJung-uk Kim if (exists $deprecated_disablables{$feature}) { 1101*e71b7053SJung-uk Kim warn "***** config $target disables deprecated feature $feature\n"; 1102*e71b7053SJung-uk Kim } elsif (!grep { $feature eq $_ } @disablables) { 1103*e71b7053SJung-uk Kim die "***** config $target disables unknown feature $feature\n"; 1104*e71b7053SJung-uk Kim } 1105*e71b7053SJung-uk Kim $disabled{$feature} = 'config'; 1106*e71b7053SJung-uk Kim} 1107*e71b7053SJung-uk Kimforeach my $feature (@{$target{enable}}) { 1108*e71b7053SJung-uk Kim if ("default" eq ($disabled{$_} // "")) { 1109*e71b7053SJung-uk Kim if (exists $deprecated_disablables{$feature}) { 1110*e71b7053SJung-uk Kim warn "***** config $target enables deprecated feature $feature\n"; 1111*e71b7053SJung-uk Kim } elsif (!grep { $feature eq $_ } @disablables) { 1112*e71b7053SJung-uk Kim die "***** config $target enables unknown feature $feature\n"; 1113*e71b7053SJung-uk Kim } 1114*e71b7053SJung-uk Kim delete $disabled{$_}; 1115*e71b7053SJung-uk Kim } 1116*e71b7053SJung-uk Kim} 1117*e71b7053SJung-uk Kim 1118*e71b7053SJung-uk Kim$target{CXXFLAGS}//=$target{CFLAGS} if $target{CXX}; 1119*e71b7053SJung-uk Kim$target{cxxflags}//=$target{cflags} if $target{CXX}; 1120*e71b7053SJung-uk Kim$target{exe_extension}=""; 1121*e71b7053SJung-uk Kim$target{exe_extension}=".exe" if ($config{target} eq "DJGPP" 1122*e71b7053SJung-uk Kim || $config{target} =~ /^(?:Cygwin|mingw)/); 1123*e71b7053SJung-uk Kim$target{exe_extension}=".pm" if ($config{target} =~ /vos/); 1124*e71b7053SJung-uk Kim 1125*e71b7053SJung-uk Kim($target{shared_extension_simple}=$target{shared_extension}) 1126*e71b7053SJung-uk Kim =~ s|\.\$\(SHLIB_VERSION_NUMBER\)|| 1127*e71b7053SJung-uk Kim unless defined($target{shared_extension_simple}); 1128*e71b7053SJung-uk Kim$target{dso_extension}//=$target{shared_extension_simple}; 1129*e71b7053SJung-uk Kim($target{shared_import_extension}=$target{shared_extension_simple}.".a") 1130*e71b7053SJung-uk Kim if ($config{target} =~ /^(?:Cygwin|mingw)/); 1131*e71b7053SJung-uk Kim 1132*e71b7053SJung-uk Kim# Fill %config with values from %user, and in case those are undefined or 1133*e71b7053SJung-uk Kim# empty, use values from %target (acting as a default). 1134*e71b7053SJung-uk Kimforeach (keys %user) { 1135*e71b7053SJung-uk Kim my $ref_type = ref $user{$_}; 1136*e71b7053SJung-uk Kim 1137*e71b7053SJung-uk Kim # Temporary function. Takes an intended ref type (empty string or "ARRAY") 1138*e71b7053SJung-uk Kim # and a value that's to be coerced into that type. 1139*e71b7053SJung-uk Kim my $mkvalue = sub { 1140*e71b7053SJung-uk Kim my $type = shift; 1141*e71b7053SJung-uk Kim my $value = shift; 1142*e71b7053SJung-uk Kim my $undef_p = shift; 1143*e71b7053SJung-uk Kim 1144*e71b7053SJung-uk Kim die "Too many arguments for \$mkvalue" if @_; 1145*e71b7053SJung-uk Kim 1146*e71b7053SJung-uk Kim while (ref $value eq 'CODE') { 1147*e71b7053SJung-uk Kim $value = $value->(); 1148*e71b7053SJung-uk Kim } 1149*e71b7053SJung-uk Kim 1150*e71b7053SJung-uk Kim if ($type eq 'ARRAY') { 1151*e71b7053SJung-uk Kim return undef unless defined $value; 1152*e71b7053SJung-uk Kim return undef if ref $value ne 'ARRAY' && !$value; 1153*e71b7053SJung-uk Kim return undef if ref $value eq 'ARRAY' && !@$value; 1154*e71b7053SJung-uk Kim return [ $value ] unless ref $value eq 'ARRAY'; 1155*e71b7053SJung-uk Kim } 1156*e71b7053SJung-uk Kim return undef unless $value; 1157*e71b7053SJung-uk Kim return $value; 1158*e71b7053SJung-uk Kim }; 1159*e71b7053SJung-uk Kim 1160*e71b7053SJung-uk Kim $config{$_} = 1161*e71b7053SJung-uk Kim $mkvalue->($ref_type, $user{$_}) 1162*e71b7053SJung-uk Kim || $mkvalue->($ref_type, $target{$_}); 1163*e71b7053SJung-uk Kim delete $config{$_} unless defined $config{$_}; 1164*e71b7053SJung-uk Kim} 1165*e71b7053SJung-uk Kim 1166*e71b7053SJung-uk Kim# Allow overriding the build file name 1167*e71b7053SJung-uk Kim$config{build_file} = env('BUILDFILE') || $target{build_file} || "Makefile"; 1168*e71b7053SJung-uk Kim 1169*e71b7053SJung-uk Kimmy %disabled_info = (); # For configdata.pm 1170*e71b7053SJung-uk Kimforeach my $what (sort keys %disabled) { 1171*e71b7053SJung-uk Kim $config{options} .= " no-$what"; 1172*e71b7053SJung-uk Kim 1173*e71b7053SJung-uk Kim if (!grep { $what eq $_ } ( 'dso', 'threads', 'shared', 'pic', 1174*e71b7053SJung-uk Kim 'dynamic-engine', 'makedepend', 1175*e71b7053SJung-uk Kim 'zlib-dynamic', 'zlib', 'sse2' )) { 1176*e71b7053SJung-uk Kim (my $WHAT = uc $what) =~ s|-|_|g; 1177*e71b7053SJung-uk Kim 1178*e71b7053SJung-uk Kim # Fix up C macro end names 1179*e71b7053SJung-uk Kim $WHAT = "RMD160" if $what eq "ripemd"; 1180*e71b7053SJung-uk Kim 11811f13597dSJung-uk Kim # fix-up crypto/directory name(s) 1182*e71b7053SJung-uk Kim $what = "ripemd" if $what eq "rmd160"; 1183*e71b7053SJung-uk Kim $what = "whrlpool" if $what eq "whirlpool"; 11841f13597dSJung-uk Kim 1185*e71b7053SJung-uk Kim my $macro = $disabled_info{$what}->{macro} = "OPENSSL_NO_$WHAT"; 1186*e71b7053SJung-uk Kim 1187*e71b7053SJung-uk Kim if ((grep { $what eq $_ } @{$config{sdirs}}) 1188*e71b7053SJung-uk Kim && $what ne 'async' && $what ne 'err') { 1189*e71b7053SJung-uk Kim @{$config{sdirs}} = grep { $what ne $_} @{$config{sdirs}}; 1190*e71b7053SJung-uk Kim $disabled_info{$what}->{skipped} = [ catdir('crypto', $what) ]; 1191*e71b7053SJung-uk Kim 1192*e71b7053SJung-uk Kim if ($what ne 'engine') { 1193*e71b7053SJung-uk Kim push @{$config{openssl_algorithm_defines}}, $macro; 1194*e71b7053SJung-uk Kim } else { 1195*e71b7053SJung-uk Kim @{$config{dirs}} = grep !/^engines$/, @{$config{dirs}}; 1196*e71b7053SJung-uk Kim push @{$disabled_info{engine}->{skipped}}, catdir('engines'); 1197*e71b7053SJung-uk Kim push @{$config{openssl_other_defines}}, $macro; 11981f13597dSJung-uk Kim } 1199*e71b7053SJung-uk Kim } else { 1200*e71b7053SJung-uk Kim push @{$config{openssl_other_defines}}, $macro; 12011f13597dSJung-uk Kim } 12021f13597dSJung-uk Kim 1203*e71b7053SJung-uk Kim } 12041f13597dSJung-uk Kim} 12051f13597dSJung-uk Kim 1206*e71b7053SJung-uk Kim# Make sure build_scheme is consistent. 1207*e71b7053SJung-uk Kim$target{build_scheme} = [ $target{build_scheme} ] 1208*e71b7053SJung-uk Kim if ref($target{build_scheme}) ne "ARRAY"; 1209*e71b7053SJung-uk Kim 1210*e71b7053SJung-uk Kimmy ($builder, $builder_platform, @builder_opts) = 1211*e71b7053SJung-uk Kim @{$target{build_scheme}}; 1212*e71b7053SJung-uk Kim 1213*e71b7053SJung-uk Kimforeach my $checker (($builder_platform."-".$target{build_file}."-checker.pm", 1214*e71b7053SJung-uk Kim $builder_platform."-checker.pm")) { 1215*e71b7053SJung-uk Kim my $checker_path = catfile($srcdir, "Configurations", $checker); 1216*e71b7053SJung-uk Kim if (-f $checker_path) { 1217*e71b7053SJung-uk Kim my $fn = $ENV{CONFIGURE_CHECKER_WARN} 1218*e71b7053SJung-uk Kim ? sub { warn $@; } : sub { die $@; }; 1219*e71b7053SJung-uk Kim if (! do $checker_path) { 1220*e71b7053SJung-uk Kim if ($@) { 1221*e71b7053SJung-uk Kim $fn->($@); 1222*e71b7053SJung-uk Kim } elsif ($!) { 1223*e71b7053SJung-uk Kim $fn->($!); 1224*e71b7053SJung-uk Kim } else { 1225*e71b7053SJung-uk Kim $fn->("The detected tools didn't match the platform\n"); 1226*e71b7053SJung-uk Kim } 1227*e71b7053SJung-uk Kim } 1228*e71b7053SJung-uk Kim last; 1229*e71b7053SJung-uk Kim } 1230*e71b7053SJung-uk Kim} 1231*e71b7053SJung-uk Kim 1232*e71b7053SJung-uk Kimpush @{$config{defines}}, "NDEBUG" if $config{build_type} eq "release"; 1233*e71b7053SJung-uk Kim 1234*e71b7053SJung-uk Kimif ($target =~ /^mingw/ && `$config{CC} --target-help 2>&1` =~ m/-mno-cygwin/m) 12351f13597dSJung-uk Kim { 1236*e71b7053SJung-uk Kim push @{$config{cflags}}, "-mno-cygwin"; 1237*e71b7053SJung-uk Kim push @{$config{cxxflags}}, "-mno-cygwin" if $config{CXX}; 1238*e71b7053SJung-uk Kim push @{$config{shared_ldflag}}, "-mno-cygwin"; 12391f13597dSJung-uk Kim } 12401f13597dSJung-uk Kim 1241*e71b7053SJung-uk Kimif ($target =~ /linux.*-mips/ && !$disabled{asm} 1242*e71b7053SJung-uk Kim && !grep { $_ !~ /-m(ips|arch=)/ } (@{$user{CFLAGS}}, 1243*e71b7053SJung-uk Kim @{$useradd{CFLAGS}})) { 12447bded2dbSJung-uk Kim # minimally required architecture flags for assembly modules 1245*e71b7053SJung-uk Kim my $value; 1246*e71b7053SJung-uk Kim $value = '-mips2' if ($target =~ /mips32/); 1247*e71b7053SJung-uk Kim $value = '-mips3' if ($target =~ /mips64/); 1248*e71b7053SJung-uk Kim unshift @{$config{cflags}}, $value; 1249*e71b7053SJung-uk Kim unshift @{$config{cxxflags}}, $value if $config{CXX}; 1250*e71b7053SJung-uk Kim} 1251*e71b7053SJung-uk Kim 1252*e71b7053SJung-uk Kim# If threads aren't disabled, check how possible they are 1253*e71b7053SJung-uk Kimunless ($disabled{threads}) { 1254*e71b7053SJung-uk Kim if ($auto_threads) { 1255*e71b7053SJung-uk Kim # Enabled by default, disable it forcibly if unavailable 1256*e71b7053SJung-uk Kim if ($target{thread_scheme} eq "(unknown)") { 1257*e71b7053SJung-uk Kim $disabled{threads} = "unavailable"; 1258*e71b7053SJung-uk Kim } 1259*e71b7053SJung-uk Kim } else { 1260*e71b7053SJung-uk Kim # The user chose to enable threads explicitly, let's see 1261*e71b7053SJung-uk Kim # if there's a chance that's possible 1262*e71b7053SJung-uk Kim if ($target{thread_scheme} eq "(unknown)") { 1263*e71b7053SJung-uk Kim # If the user asked for "threads" and we don't have internal 1264*e71b7053SJung-uk Kim # knowledge how to do it, [s]he is expected to provide any 1265*e71b7053SJung-uk Kim # system-dependent compiler options that are necessary. We 1266*e71b7053SJung-uk Kim # can't truly check that the given options are correct, but 1267*e71b7053SJung-uk Kim # we expect the user to know what [s]He is doing. 1268*e71b7053SJung-uk Kim if (!@{$user{CFLAGS}} && !@{$useradd{CFLAGS}} 1269*e71b7053SJung-uk Kim && !@{$user{CPPDEFINES}} && !@{$useradd{CPPDEFINES}}) { 1270*e71b7053SJung-uk Kim die "You asked for multi-threading support, but didn't\n" 1271*e71b7053SJung-uk Kim ,"provide any system-specific compiler options\n"; 1272*e71b7053SJung-uk Kim } 1273*e71b7053SJung-uk Kim } 1274*e71b7053SJung-uk Kim } 1275*e71b7053SJung-uk Kim} 1276*e71b7053SJung-uk Kim 1277*e71b7053SJung-uk Kim# If threads still aren't disabled, add a C macro to ensure the source 1278*e71b7053SJung-uk Kim# code knows about it. Any other flag is taken care of by the configs. 1279*e71b7053SJung-uk Kimunless($disabled{threads}) { 1280*e71b7053SJung-uk Kim push @{$config{openssl_thread_defines}}, "OPENSSL_THREADS"; 1281*e71b7053SJung-uk Kim} 1282*e71b7053SJung-uk Kim 1283*e71b7053SJung-uk Kim# With "deprecated" disable all deprecated features. 1284*e71b7053SJung-uk Kimif (defined($disabled{"deprecated"})) { 1285*e71b7053SJung-uk Kim $config{api} = $maxapi; 12867bded2dbSJung-uk Kim} 12877bded2dbSJung-uk Kim 1288fceca8a3SJacques Vidrinemy $no_shared_warn=0; 1289*e71b7053SJung-uk Kimif ($target{shared_target} eq "") 12905c87c606SMark Murray { 1291*e71b7053SJung-uk Kim $no_shared_warn = 1 1292*e71b7053SJung-uk Kim if (!$disabled{shared} || !$disabled{"dynamic-engine"}); 1293*e71b7053SJung-uk Kim $disabled{shared} = "no-shared-target"; 1294*e71b7053SJung-uk Kim $disabled{pic} = $disabled{shared} = $disabled{"dynamic-engine"} = 1295*e71b7053SJung-uk Kim "no-shared-target"; 12965c87c606SMark Murray } 12975c87c606SMark Murray 1298*e71b7053SJung-uk Kimif ($disabled{"dynamic-engine"}) { 1299*e71b7053SJung-uk Kim push @{$config{openssl_other_defines}}, "OPENSSL_NO_DYNAMIC_ENGINE"; 1300*e71b7053SJung-uk Kim $config{dynamic_engines} = 0; 1301*e71b7053SJung-uk Kim} else { 1302*e71b7053SJung-uk Kim push @{$config{openssl_other_defines}}, "OPENSSL_NO_STATIC_ENGINE"; 1303*e71b7053SJung-uk Kim $config{dynamic_engines} = 1; 1304ddd58736SKris Kennaway} 1305ddd58736SKris Kennaway 1306*e71b7053SJung-uk Kimunless ($disabled{asan}) { 1307*e71b7053SJung-uk Kim push @{$config{cflags}}, "-fsanitize=address"; 1308*e71b7053SJung-uk Kim push @{$config{cxxflags}}, "-fsanitize=address" if $config{CXX}; 130974664626SKris Kennaway} 131074664626SKris Kennaway 1311*e71b7053SJung-uk Kimunless ($disabled{ubsan}) { 1312*e71b7053SJung-uk Kim # -DPEDANTIC or -fnosanitize=alignment may also be required on some 1313*e71b7053SJung-uk Kim # platforms. 1314*e71b7053SJung-uk Kim push @{$config{cflags}}, "-fsanitize=undefined", "-fno-sanitize-recover=all"; 1315*e71b7053SJung-uk Kim push @{$config{cxxflags}}, "-fsanitize=undefined", "-fno-sanitize-recover=all" 1316*e71b7053SJung-uk Kim if $config{CXX}; 131774664626SKris Kennaway} 131874664626SKris Kennaway 1319*e71b7053SJung-uk Kimunless ($disabled{msan}) { 1320*e71b7053SJung-uk Kim push @{$config{cflags}}, "-fsanitize=memory"; 1321*e71b7053SJung-uk Kim push @{$config{cxxflags}}, "-fsanitize=memory" if $config{CXX}; 13225c87c606SMark Murray} 13235c87c606SMark Murray 1324*e71b7053SJung-uk Kimunless ($disabled{"fuzz-libfuzzer"} && $disabled{"fuzz-afl"} 1325*e71b7053SJung-uk Kim && $disabled{asan} && $disabled{ubsan} && $disabled{msan}) { 1326*e71b7053SJung-uk Kim push @{$config{cflags}}, "-fno-omit-frame-pointer", "-g"; 1327*e71b7053SJung-uk Kim push @{$config{cxxflags}}, "-fno-omit-frame-pointer", "-g" if $config{CXX}; 132874664626SKris Kennaway} 1329db522d3aSSimon L. B. Nielsen# 1330db522d3aSSimon L. B. Nielsen# Platform fix-ups 1331db522d3aSSimon L. B. Nielsen# 1332db522d3aSSimon L. B. Nielsen 1333*e71b7053SJung-uk Kim# This saves the build files from having to check 1334*e71b7053SJung-uk Kimif ($disabled{pic}) 1335db522d3aSSimon L. B. Nielsen { 1336*e71b7053SJung-uk Kim foreach (qw(shared_cflag shared_cxxflag shared_cppflag 1337*e71b7053SJung-uk Kim shared_defines shared_includes shared_ldflag 1338*e71b7053SJung-uk Kim module_cflags module_cxxflags module_cppflags 1339*e71b7053SJung-uk Kim module_defines module_includes module_lflags)) 1340*e71b7053SJung-uk Kim { 1341*e71b7053SJung-uk Kim delete $config{$_}; 1342*e71b7053SJung-uk Kim $target{$_} = ""; 1343ddd58736SKris Kennaway } 1344aeb5019cSJung-uk Kim } 1345aeb5019cSJung-uk Kimelse 1346aeb5019cSJung-uk Kim { 1347*e71b7053SJung-uk Kim push @{$config{lib_defines}}, "OPENSSL_PIC"; 1348aeb5019cSJung-uk Kim } 1349*e71b7053SJung-uk Kim 1350*e71b7053SJung-uk Kimif ($target{sys_id} ne "") 135174664626SKris Kennaway { 1352*e71b7053SJung-uk Kim push @{$config{openssl_sys_defines}}, "OPENSSL_SYS_$target{sys_id}"; 13533b4e3dcbSSimon L. B. Nielsen } 1354*e71b7053SJung-uk Kim 1355*e71b7053SJung-uk Kimunless ($disabled{asm}) { 1356*e71b7053SJung-uk Kim $target{cpuid_asm_src}=$table{DEFAULTS}->{cpuid_asm_src} if ($config{processor} eq "386"); 1357*e71b7053SJung-uk Kim push @{$config{lib_defines}}, "OPENSSL_CPUID_OBJ" if ($target{cpuid_asm_src} ne "mem_clr.c"); 1358*e71b7053SJung-uk Kim 1359*e71b7053SJung-uk Kim $target{bn_asm_src} =~ s/\w+-gf2m.c// if (defined($disabled{ec2m})); 1360*e71b7053SJung-uk Kim 1361*e71b7053SJung-uk Kim # bn-586 is the only one implementing bn_*_part_words 1362*e71b7053SJung-uk Kim push @{$config{lib_defines}}, "OPENSSL_BN_ASM_PART_WORDS" if ($target{bn_asm_src} =~ /bn-586/); 1363*e71b7053SJung-uk Kim push @{$config{lib_defines}}, "OPENSSL_IA32_SSE2" if (!$disabled{sse2} && $target{bn_asm_src} =~ /86/); 1364*e71b7053SJung-uk Kim 1365*e71b7053SJung-uk Kim push @{$config{lib_defines}}, "OPENSSL_BN_ASM_MONT" if ($target{bn_asm_src} =~ /-mont/); 1366*e71b7053SJung-uk Kim push @{$config{lib_defines}}, "OPENSSL_BN_ASM_MONT5" if ($target{bn_asm_src} =~ /-mont5/); 1367*e71b7053SJung-uk Kim push @{$config{lib_defines}}, "OPENSSL_BN_ASM_GF2m" if ($target{bn_asm_src} =~ /-gf2m/); 1368*e71b7053SJung-uk Kim 1369*e71b7053SJung-uk Kim if ($target{sha1_asm_src}) { 1370*e71b7053SJung-uk Kim push @{$config{lib_defines}}, "SHA1_ASM" if ($target{sha1_asm_src} =~ /sx86/ || $target{sha1_asm_src} =~ /sha1/); 1371*e71b7053SJung-uk Kim push @{$config{lib_defines}}, "SHA256_ASM" if ($target{sha1_asm_src} =~ /sha256/); 1372*e71b7053SJung-uk Kim push @{$config{lib_defines}}, "SHA512_ASM" if ($target{sha1_asm_src} =~ /sha512/); 137374664626SKris Kennaway } 1374*e71b7053SJung-uk Kim if ($target{keccak1600_asm_src} ne $table{DEFAULTS}->{keccak1600_asm_src}) { 1375*e71b7053SJung-uk Kim push @{$config{lib_defines}}, "KECCAK1600_ASM"; 137674664626SKris Kennaway } 1377*e71b7053SJung-uk Kim if ($target{rc4_asm_src} ne $table{DEFAULTS}->{rc4_asm_src}) { 1378*e71b7053SJung-uk Kim push @{$config{lib_defines}}, "RC4_ASM"; 137974664626SKris Kennaway } 1380*e71b7053SJung-uk Kim if ($target{md5_asm_src}) { 1381*e71b7053SJung-uk Kim push @{$config{lib_defines}}, "MD5_ASM"; 1382*e71b7053SJung-uk Kim } 1383*e71b7053SJung-uk Kim $target{cast_asm_src}=$table{DEFAULTS}->{cast_asm_src} unless $disabled{pic}; # CAST assembler is not PIC 1384*e71b7053SJung-uk Kim if ($target{rmd160_asm_src}) { 1385*e71b7053SJung-uk Kim push @{$config{lib_defines}}, "RMD160_ASM"; 1386*e71b7053SJung-uk Kim } 1387*e71b7053SJung-uk Kim if ($target{aes_asm_src}) { 1388*e71b7053SJung-uk Kim push @{$config{lib_defines}}, "AES_ASM" if ($target{aes_asm_src} =~ m/\baes-/);; 1389*e71b7053SJung-uk Kim # aes-ctr.fake is not a real file, only indication that assembler 13901f13597dSJung-uk Kim # module implements AES_ctr32_encrypt... 1391*e71b7053SJung-uk Kim push @{$config{lib_defines}}, "AES_CTR_ASM" if ($target{aes_asm_src} =~ s/\s*aes-ctr\.fake//); 1392*e71b7053SJung-uk Kim # aes-xts.fake indicates presence of AES_xts_[en|de]crypt... 1393*e71b7053SJung-uk Kim push @{$config{lib_defines}}, "AES_XTS_ASM" if ($target{aes_asm_src} =~ s/\s*aes-xts\.fake//); 1394*e71b7053SJung-uk Kim $target{aes_asm_src} =~ s/\s*(vpaes|aesni)-x86\.s//g if ($disabled{sse2}); 1395*e71b7053SJung-uk Kim push @{$config{lib_defines}}, "VPAES_ASM" if ($target{aes_asm_src} =~ m/vpaes/); 1396*e71b7053SJung-uk Kim push @{$config{lib_defines}}, "BSAES_ASM" if ($target{aes_asm_src} =~ m/bsaes/); 13973b4e3dcbSSimon L. B. Nielsen } 1398*e71b7053SJung-uk Kim if ($target{wp_asm_src} =~ /mmx/) { 1399*e71b7053SJung-uk Kim if ($config{processor} eq "386") { 1400*e71b7053SJung-uk Kim $target{wp_asm_src}=$table{DEFAULTS}->{wp_asm_src}; 1401*e71b7053SJung-uk Kim } elsif (!$disabled{"whirlpool"}) { 1402*e71b7053SJung-uk Kim push @{$config{lib_defines}}, "WHIRLPOOL_ASM"; 14036be8ae07SJacques Vidrine } 14041f13597dSJung-uk Kim } 1405*e71b7053SJung-uk Kim if ($target{modes_asm_src} =~ /ghash-/) { 1406*e71b7053SJung-uk Kim push @{$config{lib_defines}}, "GHASH_ASM"; 14071f13597dSJung-uk Kim } 1408*e71b7053SJung-uk Kim if ($target{ec_asm_src} =~ /ecp_nistz256/) { 1409*e71b7053SJung-uk Kim push @{$config{lib_defines}}, "ECP_NISTZ256_ASM"; 14101f13597dSJung-uk Kim } 1411*e71b7053SJung-uk Kim if ($target{ec_asm_src} =~ /x25519/) { 1412*e71b7053SJung-uk Kim push @{$config{lib_defines}}, "X25519_ASM"; 1413*e71b7053SJung-uk Kim } 1414*e71b7053SJung-uk Kim if ($target{padlock_asm_src} ne $table{DEFAULTS}->{padlock_asm_src}) { 1415*e71b7053SJung-uk Kim push @{$config{lib_defines}}, "PADLOCK_ASM"; 1416*e71b7053SJung-uk Kim } 1417*e71b7053SJung-uk Kim if ($target{poly1305_asm_src} ne "") { 1418*e71b7053SJung-uk Kim push @{$config{lib_defines}}, "POLY1305_ASM"; 1419*e71b7053SJung-uk Kim } 14207bded2dbSJung-uk Kim} 14216be8ae07SJacques Vidrine 1422*e71b7053SJung-uk Kimmy %predefined = compiler_predefined($config{CROSS_COMPILE}.$config{CC}); 14234f20a5a2SJacques Vidrine 1424*e71b7053SJung-uk Kim# Check for makedepend capabilities. 1425*e71b7053SJung-uk Kimif (!$disabled{makedepend}) { 1426*e71b7053SJung-uk Kim if ($config{target} =~ /^(VC|vms)-/) { 1427*e71b7053SJung-uk Kim # For VC- and vms- targets, there's nothing more to do here. The 1428*e71b7053SJung-uk Kim # functionality is hard coded in the corresponding build files for 1429*e71b7053SJung-uk Kim # cl (Windows) and CC/DECC (VMS). 1430*e71b7053SJung-uk Kim } elsif (($predefined{__GNUC__} // -1) >= 3 1431*e71b7053SJung-uk Kim && !($predefined{__APPLE_CC__} && !$predefined{__clang__})) { 1432*e71b7053SJung-uk Kim # We know that GNU C version 3 and up as well as all clang 1433*e71b7053SJung-uk Kim # versions support dependency generation, but Xcode did not 1434*e71b7053SJung-uk Kim # handle $cc -M before clang support (but claims __GNUC__ = 3) 1435*e71b7053SJung-uk Kim $config{makedepprog} = "\$(CROSS_COMPILE)$config{CC}"; 1436*e71b7053SJung-uk Kim } else { 1437*e71b7053SJung-uk Kim # In all other cases, we look for 'makedepend', and disable the 1438*e71b7053SJung-uk Kim # capability if not found. 1439*e71b7053SJung-uk Kim $config{makedepprog} = which('makedepend'); 1440*e71b7053SJung-uk Kim $disabled{makedepend} = "unavailable" unless $config{makedepprog}; 144174664626SKris Kennaway } 144274664626SKris Kennaway} 144374664626SKris Kennaway 1444*e71b7053SJung-uk Kimif (!$disabled{asm} && !$predefined{__MACH__} && $^O ne 'VMS') { 1445*e71b7053SJung-uk Kim # probe for -Wa,--noexecstack option... 1446*e71b7053SJung-uk Kim if ($predefined{__clang__}) { 1447*e71b7053SJung-uk Kim # clang has builtin assembler, which doesn't recognize --help, 1448*e71b7053SJung-uk Kim # but it apparently recognizes the option in question on all 1449*e71b7053SJung-uk Kim # supported platforms even when it's meaningless. In other words 1450*e71b7053SJung-uk Kim # probe would fail, but probed option always accepted... 1451*e71b7053SJung-uk Kim push @{$config{cflags}}, "-Wa,--noexecstack", "-Qunused-arguments"; 1452*e71b7053SJung-uk Kim } else { 1453*e71b7053SJung-uk Kim my $cc = $config{CROSS_COMPILE}.$config{CC}; 1454*e71b7053SJung-uk Kim open(PIPE, "$cc -Wa,--help -c -o null.$$.o -x assembler /dev/null 2>&1 |"); 1455dee36b4fSJung-uk Kim while(<PIPE>) { 1456*e71b7053SJung-uk Kim if (m/--noexecstack/) { 1457*e71b7053SJung-uk Kim push @{$config{cflags}}, "-Wa,--noexecstack"; 1458*e71b7053SJung-uk Kim last; 1459*e71b7053SJung-uk Kim } 1460dee36b4fSJung-uk Kim } 1461dee36b4fSJung-uk Kim close(PIPE); 1462*e71b7053SJung-uk Kim unlink("null.$$.o"); 1463*e71b7053SJung-uk Kim } 1464*e71b7053SJung-uk Kim} 146580815a77SJung-uk Kim 1466*e71b7053SJung-uk Kim# Deal with bn_ops ################################################### 1467*e71b7053SJung-uk Kim 1468*e71b7053SJung-uk Kim$config{bn_ll} =0; 1469*e71b7053SJung-uk Kim$config{export_var_as_fn} =0; 1470*e71b7053SJung-uk Kimmy $def_int="unsigned int"; 1471*e71b7053SJung-uk Kim$config{rc4_int} =$def_int; 1472*e71b7053SJung-uk Kim($config{b64l},$config{b64},$config{b32})=(0,0,1); 1473*e71b7053SJung-uk Kim 1474*e71b7053SJung-uk Kimmy $count = 0; 1475*e71b7053SJung-uk Kimforeach (sort split(/\s+/,$target{bn_ops})) { 1476*e71b7053SJung-uk Kim $count++ if /SIXTY_FOUR_BIT|SIXTY_FOUR_BIT_LONG|THIRTY_TWO_BIT/; 1477*e71b7053SJung-uk Kim $config{export_var_as_fn}=1 if $_ eq 'EXPORT_VAR_AS_FN'; 1478*e71b7053SJung-uk Kim $config{bn_ll}=1 if $_ eq 'BN_LLONG'; 1479*e71b7053SJung-uk Kim $config{rc4_int}="unsigned char" if $_ eq 'RC4_CHAR'; 1480*e71b7053SJung-uk Kim ($config{b64l},$config{b64},$config{b32}) 1481*e71b7053SJung-uk Kim =(0,1,0) if $_ eq 'SIXTY_FOUR_BIT'; 1482*e71b7053SJung-uk Kim ($config{b64l},$config{b64},$config{b32}) 1483*e71b7053SJung-uk Kim =(1,0,0) if $_ eq 'SIXTY_FOUR_BIT_LONG'; 1484*e71b7053SJung-uk Kim ($config{b64l},$config{b64},$config{b32}) 1485*e71b7053SJung-uk Kim =(0,0,1) if $_ eq 'THIRTY_TWO_BIT'; 1486*e71b7053SJung-uk Kim} 1487*e71b7053SJung-uk Kimdie "Exactly one of SIXTY_FOUR_BIT|SIXTY_FOUR_BIT_LONG|THIRTY_TWO_BIT can be set in bn_ops\n" 1488*e71b7053SJung-uk Kim if $count > 1; 1489*e71b7053SJung-uk Kim 1490*e71b7053SJung-uk Kim 1491*e71b7053SJung-uk Kim# Hack cflags for better warnings (dev option) ####################### 1492*e71b7053SJung-uk Kim 1493*e71b7053SJung-uk Kim# "Stringify" the C and C++ flags string. This permits it to be made part of 1494*e71b7053SJung-uk Kim# a string and works as well on command lines. 1495*e71b7053SJung-uk Kim$config{cflags} = [ map { (my $x = $_) =~ s/([\\\"])/\\$1/g; $x } 1496*e71b7053SJung-uk Kim @{$config{cflags}} ]; 1497*e71b7053SJung-uk Kim$config{cxxflags} = [ map { (my $x = $_) =~ s/([\\\"])/\\$1/g; $x } 1498*e71b7053SJung-uk Kim @{$config{cxxflags}} ] if $config{CXX}; 1499*e71b7053SJung-uk Kim 1500*e71b7053SJung-uk Kimif (defined($config{api})) { 1501*e71b7053SJung-uk Kim $config{openssl_api_defines} = [ "OPENSSL_MIN_API=".$apitable->{$config{api}} ]; 1502*e71b7053SJung-uk Kim my $apiflag = sprintf("OPENSSL_API_COMPAT=%s", $apitable->{$config{api}}); 1503*e71b7053SJung-uk Kim push @{$config{defines}}, $apiflag; 1504dea77ea6SJung-uk Kim} 1505dea77ea6SJung-uk Kim 150680815a77SJung-uk Kimif ($strict_warnings) 150780815a77SJung-uk Kim { 15086a599222SSimon L. B. Nielsen my $wopt; 1509*e71b7053SJung-uk Kim my $gccver = $predefined{__GNUC__} // -1; 1510*e71b7053SJung-uk Kim 1511*e71b7053SJung-uk Kim die "ERROR --strict-warnings requires gcc[>=4] or gcc-alike" 1512*e71b7053SJung-uk Kim unless $gccver >= 4; 15136a599222SSimon L. B. Nielsen foreach $wopt (split /\s+/, $gcc_devteam_warn) 15146a599222SSimon L. B. Nielsen { 1515*e71b7053SJung-uk Kim push @{$config{cflags}}, $wopt 1516*e71b7053SJung-uk Kim unless grep { $_ eq $wopt } @{$config{cflags}}; 1517*e71b7053SJung-uk Kim push @{$config{cxxflags}}, $wopt 1518*e71b7053SJung-uk Kim if ($config{CXX} 1519*e71b7053SJung-uk Kim && !grep { $_ eq $wopt } @{$config{cxxflags}}); 15206a599222SSimon L. B. Nielsen } 1521dee36b4fSJung-uk Kim if (defined($predefined{__clang__})) 15227bded2dbSJung-uk Kim { 15237bded2dbSJung-uk Kim foreach $wopt (split /\s+/, $clang_devteam_warn) 15247bded2dbSJung-uk Kim { 1525*e71b7053SJung-uk Kim push @{$config{cflags}}, $wopt 1526*e71b7053SJung-uk Kim unless grep { $_ eq $wopt } @{$config{cflags}}; 1527*e71b7053SJung-uk Kim push @{$config{cxxflags}}, $wopt 1528*e71b7053SJung-uk Kim if ($config{CXX} 1529*e71b7053SJung-uk Kim && !grep { $_ eq $wopt } @{$config{cxxflags}}); 15307bded2dbSJung-uk Kim } 15317bded2dbSJung-uk Kim } 15326a599222SSimon L. B. Nielsen } 15336a599222SSimon L. B. Nielsen 1534*e71b7053SJung-uk Kimunless ($disabled{"crypto-mdebug-backtrace"}) 153574664626SKris Kennaway { 1536*e71b7053SJung-uk Kim foreach my $wopt (split /\s+/, $memleak_devteam_backtrace) 15376a599222SSimon L. B. Nielsen { 1538*e71b7053SJung-uk Kim push @{$config{cflags}}, $wopt 1539*e71b7053SJung-uk Kim unless grep { $_ eq $wopt } @{$config{cflags}}; 1540*e71b7053SJung-uk Kim push @{$config{cxxflags}}, $wopt 1541*e71b7053SJung-uk Kim if ($config{CXX} 1542*e71b7053SJung-uk Kim && !grep { $_ eq $wopt } @{$config{cxxflags}}); 15436a599222SSimon L. B. Nielsen } 1544*e71b7053SJung-uk Kim if ($target =~ /^BSD-/) 1545a21b1b38SKris Kennaway { 1546*e71b7053SJung-uk Kim push @{$config{ex_libs}}, "-lexecinfo"; 15474f20a5a2SJacques Vidrine } 154874664626SKris Kennaway } 154974664626SKris Kennaway 1550*e71b7053SJung-uk Kimunless ($disabled{afalgeng}) { 1551*e71b7053SJung-uk Kim $config{afalgeng}=""; 1552*e71b7053SJung-uk Kim if (grep { $_ eq 'afalgeng' } @{$target{enable}}) { 1553*e71b7053SJung-uk Kim my $minver = 4*10000 + 1*100 + 0; 1554*e71b7053SJung-uk Kim if ($config{CROSS_COMPILE} eq "") { 1555*e71b7053SJung-uk Kim my $verstr = `uname -r`; 1556*e71b7053SJung-uk Kim my ($ma, $mi1, $mi2) = split("\\.", $verstr); 1557*e71b7053SJung-uk Kim ($mi2) = $mi2 =~ /(\d+)/; 1558*e71b7053SJung-uk Kim my $ver = $ma*10000 + $mi1*100 + $mi2; 1559*e71b7053SJung-uk Kim if ($ver < $minver) { 1560*e71b7053SJung-uk Kim $disabled{afalgeng} = "too-old-kernel"; 1561*e71b7053SJung-uk Kim } else { 1562*e71b7053SJung-uk Kim push @{$config{engdirs}}, "afalg"; 1563*e71b7053SJung-uk Kim } 1564*e71b7053SJung-uk Kim } else { 1565*e71b7053SJung-uk Kim $disabled{afalgeng} = "cross-compiling"; 1566*e71b7053SJung-uk Kim } 1567*e71b7053SJung-uk Kim } else { 1568*e71b7053SJung-uk Kim $disabled{afalgeng} = "not-linux"; 1569*e71b7053SJung-uk Kim } 1570*e71b7053SJung-uk Kim} 1571f579bf8eSKris Kennaway 1572*e71b7053SJung-uk Kimpush @{$config{openssl_other_defines}}, "OPENSSL_NO_AFALGENG" if ($disabled{afalgeng}); 1573*e71b7053SJung-uk Kim 1574*e71b7053SJung-uk Kim# Finish up %config by appending things the user gave us on the command line 1575*e71b7053SJung-uk Kim# apart from "make variables" 1576*e71b7053SJung-uk Kimforeach (keys %useradd) { 1577*e71b7053SJung-uk Kim # The must all be lists, so we assert that here 1578*e71b7053SJung-uk Kim die "internal error: \$useradd{$_} isn't an ARRAY\n" 1579*e71b7053SJung-uk Kim unless ref $useradd{$_} eq 'ARRAY'; 1580*e71b7053SJung-uk Kim 1581*e71b7053SJung-uk Kim if (defined $config{$_}) { 1582*e71b7053SJung-uk Kim push @{$config{$_}}, @{$useradd{$_}}; 1583*e71b7053SJung-uk Kim } else { 1584*e71b7053SJung-uk Kim $config{$_} = [ @{$useradd{$_}} ]; 1585*e71b7053SJung-uk Kim } 1586*e71b7053SJung-uk Kim} 1587*e71b7053SJung-uk Kim 1588*e71b7053SJung-uk Kim# ALL MODIFICATIONS TO %config and %target MUST BE DONE FROM HERE ON 1589*e71b7053SJung-uk Kim 1590*e71b7053SJung-uk Kim# If we use the unified build, collect information from build.info files 1591*e71b7053SJung-uk Kimmy %unified_info = (); 1592*e71b7053SJung-uk Kim 1593*e71b7053SJung-uk Kimmy $buildinfo_debug = defined($ENV{CONFIGURE_DEBUG_BUILDINFO}); 1594*e71b7053SJung-uk Kimif ($builder eq "unified") { 1595*e71b7053SJung-uk Kim use with_fallback qw(Text::Template); 1596*e71b7053SJung-uk Kim 1597*e71b7053SJung-uk Kim sub cleandir { 1598*e71b7053SJung-uk Kim my $base = shift; 1599*e71b7053SJung-uk Kim my $dir = shift; 1600*e71b7053SJung-uk Kim my $relativeto = shift || "."; 1601*e71b7053SJung-uk Kim 1602*e71b7053SJung-uk Kim $dir = catdir($base,$dir) unless isabsolute($dir); 1603*e71b7053SJung-uk Kim 1604*e71b7053SJung-uk Kim # Make sure the directories we're building in exists 1605*e71b7053SJung-uk Kim mkpath($dir); 1606*e71b7053SJung-uk Kim 1607*e71b7053SJung-uk Kim my $res = abs2rel(absolutedir($dir), rel2abs($relativeto)); 1608*e71b7053SJung-uk Kim #print STDERR "DEBUG[cleandir]: $dir , $base => $res\n"; 1609*e71b7053SJung-uk Kim return $res; 1610*e71b7053SJung-uk Kim } 1611*e71b7053SJung-uk Kim 1612*e71b7053SJung-uk Kim sub cleanfile { 1613*e71b7053SJung-uk Kim my $base = shift; 1614*e71b7053SJung-uk Kim my $file = shift; 1615*e71b7053SJung-uk Kim my $relativeto = shift || "."; 1616*e71b7053SJung-uk Kim 1617*e71b7053SJung-uk Kim $file = catfile($base,$file) unless isabsolute($file); 1618*e71b7053SJung-uk Kim 1619*e71b7053SJung-uk Kim my $d = dirname($file); 1620*e71b7053SJung-uk Kim my $f = basename($file); 1621*e71b7053SJung-uk Kim 1622*e71b7053SJung-uk Kim # Make sure the directories we're building in exists 1623*e71b7053SJung-uk Kim mkpath($d); 1624*e71b7053SJung-uk Kim 1625*e71b7053SJung-uk Kim my $res = abs2rel(catfile(absolutedir($d), $f), rel2abs($relativeto)); 1626*e71b7053SJung-uk Kim #print STDERR "DEBUG[cleanfile]: $d , $f => $res\n"; 1627*e71b7053SJung-uk Kim return $res; 1628*e71b7053SJung-uk Kim } 1629*e71b7053SJung-uk Kim 1630*e71b7053SJung-uk Kim # Store the name of the template file we will build the build file from 1631*e71b7053SJung-uk Kim # in %config. This may be useful for the build file itself. 1632*e71b7053SJung-uk Kim my @build_file_template_names = 1633*e71b7053SJung-uk Kim ( $builder_platform."-".$target{build_file}.".tmpl", 1634*e71b7053SJung-uk Kim $target{build_file}.".tmpl" ); 1635*e71b7053SJung-uk Kim my @build_file_templates = (); 1636*e71b7053SJung-uk Kim 1637*e71b7053SJung-uk Kim # First, look in the user provided directory, if given 1638*e71b7053SJung-uk Kim if (defined env($local_config_envname)) { 1639*e71b7053SJung-uk Kim @build_file_templates = 1640*e71b7053SJung-uk Kim map { 1641*e71b7053SJung-uk Kim if ($^O eq 'VMS') { 1642*e71b7053SJung-uk Kim # VMS environment variables are logical names, 1643*e71b7053SJung-uk Kim # which can be used as is 1644*e71b7053SJung-uk Kim $local_config_envname . ':' . $_; 1645*e71b7053SJung-uk Kim } else { 1646*e71b7053SJung-uk Kim catfile(env($local_config_envname), $_); 1647*e71b7053SJung-uk Kim } 1648*e71b7053SJung-uk Kim } 1649*e71b7053SJung-uk Kim @build_file_template_names; 1650*e71b7053SJung-uk Kim } 1651*e71b7053SJung-uk Kim # Then, look in our standard directory 1652*e71b7053SJung-uk Kim push @build_file_templates, 1653*e71b7053SJung-uk Kim ( map { cleanfile($srcdir, catfile("Configurations", $_), $blddir) } 1654*e71b7053SJung-uk Kim @build_file_template_names ); 1655*e71b7053SJung-uk Kim 1656*e71b7053SJung-uk Kim my $build_file_template; 1657*e71b7053SJung-uk Kim for $_ (@build_file_templates) { 1658*e71b7053SJung-uk Kim $build_file_template = $_; 1659*e71b7053SJung-uk Kim last if -f $build_file_template; 1660*e71b7053SJung-uk Kim 1661*e71b7053SJung-uk Kim $build_file_template = undef; 1662*e71b7053SJung-uk Kim } 1663*e71b7053SJung-uk Kim if (!defined $build_file_template) { 1664*e71b7053SJung-uk Kim die "*** Couldn't find any of:\n", join("\n", @build_file_templates), "\n"; 1665*e71b7053SJung-uk Kim } 1666*e71b7053SJung-uk Kim $config{build_file_templates} 1667*e71b7053SJung-uk Kim = [ cleanfile($srcdir, catfile("Configurations", "common0.tmpl"), 1668*e71b7053SJung-uk Kim $blddir), 1669*e71b7053SJung-uk Kim $build_file_template, 1670*e71b7053SJung-uk Kim cleanfile($srcdir, catfile("Configurations", "common.tmpl"), 1671*e71b7053SJung-uk Kim $blddir) ]; 1672*e71b7053SJung-uk Kim 1673*e71b7053SJung-uk Kim my @build_infos = ( [ ".", "build.info" ] ); 1674*e71b7053SJung-uk Kim foreach (@{$config{dirs}}) { 1675*e71b7053SJung-uk Kim push @build_infos, [ $_, "build.info" ] 1676*e71b7053SJung-uk Kim if (-f catfile($srcdir, $_, "build.info")); 1677*e71b7053SJung-uk Kim } 1678*e71b7053SJung-uk Kim foreach (@{$config{sdirs}}) { 1679*e71b7053SJung-uk Kim push @build_infos, [ catdir("crypto", $_), "build.info" ] 1680*e71b7053SJung-uk Kim if (-f catfile($srcdir, "crypto", $_, "build.info")); 1681*e71b7053SJung-uk Kim } 1682*e71b7053SJung-uk Kim foreach (@{$config{engdirs}}) { 1683*e71b7053SJung-uk Kim push @build_infos, [ catdir("engines", $_), "build.info" ] 1684*e71b7053SJung-uk Kim if (-f catfile($srcdir, "engines", $_, "build.info")); 1685*e71b7053SJung-uk Kim } 1686*e71b7053SJung-uk Kim foreach (@{$config{tdirs}}) { 1687*e71b7053SJung-uk Kim push @build_infos, [ catdir("test", $_), "build.info" ] 1688*e71b7053SJung-uk Kim if (-f catfile($srcdir, "test", $_, "build.info")); 1689*e71b7053SJung-uk Kim } 1690*e71b7053SJung-uk Kim 1691*e71b7053SJung-uk Kim $config{build_infos} = [ ]; 1692*e71b7053SJung-uk Kim 1693*e71b7053SJung-uk Kim my %ordinals = (); 1694*e71b7053SJung-uk Kim foreach (@build_infos) { 1695*e71b7053SJung-uk Kim my $sourced = catdir($srcdir, $_->[0]); 1696*e71b7053SJung-uk Kim my $buildd = catdir($blddir, $_->[0]); 1697*e71b7053SJung-uk Kim 1698*e71b7053SJung-uk Kim mkpath($buildd); 1699*e71b7053SJung-uk Kim 1700*e71b7053SJung-uk Kim my $f = $_->[1]; 1701*e71b7053SJung-uk Kim # The basic things we're trying to build 1702*e71b7053SJung-uk Kim my @programs = (); 1703*e71b7053SJung-uk Kim my @programs_install = (); 1704*e71b7053SJung-uk Kim my @libraries = (); 1705*e71b7053SJung-uk Kim my @libraries_install = (); 1706*e71b7053SJung-uk Kim my @engines = (); 1707*e71b7053SJung-uk Kim my @engines_install = (); 1708*e71b7053SJung-uk Kim my @scripts = (); 1709*e71b7053SJung-uk Kim my @scripts_install = (); 1710*e71b7053SJung-uk Kim my @extra = (); 1711*e71b7053SJung-uk Kim my @overrides = (); 1712*e71b7053SJung-uk Kim my @intermediates = (); 1713*e71b7053SJung-uk Kim my @rawlines = (); 1714*e71b7053SJung-uk Kim 1715*e71b7053SJung-uk Kim my %sources = (); 1716*e71b7053SJung-uk Kim my %shared_sources = (); 1717*e71b7053SJung-uk Kim my %includes = (); 1718*e71b7053SJung-uk Kim my %depends = (); 1719*e71b7053SJung-uk Kim my %renames = (); 1720*e71b7053SJung-uk Kim my %sharednames = (); 1721*e71b7053SJung-uk Kim my %generate = (); 1722*e71b7053SJung-uk Kim 1723*e71b7053SJung-uk Kim # We want to detect configdata.pm in the source tree, so we 1724*e71b7053SJung-uk Kim # don't use it if the build tree is different. 1725*e71b7053SJung-uk Kim my $src_configdata = cleanfile($srcdir, "configdata.pm", $blddir); 1726*e71b7053SJung-uk Kim 1727*e71b7053SJung-uk Kim push @{$config{build_infos}}, catfile(abs2rel($sourced, $blddir), $f); 1728*e71b7053SJung-uk Kim my $template = 1729*e71b7053SJung-uk Kim Text::Template->new(TYPE => 'FILE', 1730*e71b7053SJung-uk Kim SOURCE => catfile($sourced, $f), 1731*e71b7053SJung-uk Kim PREPEND => qq{use lib "$FindBin::Bin/util/perl";}); 1732*e71b7053SJung-uk Kim die "Something went wrong with $sourced/$f: $!\n" unless $template; 1733*e71b7053SJung-uk Kim my @text = 1734*e71b7053SJung-uk Kim split /^/m, 1735*e71b7053SJung-uk Kim $template->fill_in(HASH => { config => \%config, 1736*e71b7053SJung-uk Kim target => \%target, 1737*e71b7053SJung-uk Kim disabled => \%disabled, 1738*e71b7053SJung-uk Kim withargs => \%withargs, 1739*e71b7053SJung-uk Kim builddir => abs2rel($buildd, $blddir), 1740*e71b7053SJung-uk Kim sourcedir => abs2rel($sourced, $blddir), 1741*e71b7053SJung-uk Kim buildtop => abs2rel($blddir, $blddir), 1742*e71b7053SJung-uk Kim sourcetop => abs2rel($srcdir, $blddir) }, 1743*e71b7053SJung-uk Kim DELIMITERS => [ "{-", "-}" ]); 1744*e71b7053SJung-uk Kim 1745*e71b7053SJung-uk Kim # The top item of this stack has the following values 1746*e71b7053SJung-uk Kim # -2 positive already run and we found ELSE (following ELSIF should fail) 1747*e71b7053SJung-uk Kim # -1 positive already run (skip until ENDIF) 1748*e71b7053SJung-uk Kim # 0 negatives so far (if we're at a condition, check it) 1749*e71b7053SJung-uk Kim # 1 last was positive (don't skip lines until next ELSE, ELSIF or ENDIF) 1750*e71b7053SJung-uk Kim # 2 positive ELSE (following ELSIF should fail) 1751*e71b7053SJung-uk Kim my @skip = (); 1752*e71b7053SJung-uk Kim collect_information( 1753*e71b7053SJung-uk Kim collect_from_array([ @text ], 1754*e71b7053SJung-uk Kim qr/\\$/ => sub { my $l1 = shift; my $l2 = shift; 1755*e71b7053SJung-uk Kim $l1 =~ s/\\$//; $l1.$l2 }), 1756*e71b7053SJung-uk Kim # Info we're looking for 1757*e71b7053SJung-uk Kim qr/^\s*IF\[((?:\\.|[^\\\]])*)\]\s*$/ 1758*e71b7053SJung-uk Kim => sub { 1759*e71b7053SJung-uk Kim if (! @skip || $skip[$#skip] > 0) { 1760*e71b7053SJung-uk Kim push @skip, !! $1; 1761*e71b7053SJung-uk Kim } else { 1762*e71b7053SJung-uk Kim push @skip, -1; 1763*e71b7053SJung-uk Kim } 1764*e71b7053SJung-uk Kim }, 1765*e71b7053SJung-uk Kim qr/^\s*ELSIF\[((?:\\.|[^\\\]])*)\]\s*$/ 1766*e71b7053SJung-uk Kim => sub { die "ELSIF out of scope" if ! @skip; 1767*e71b7053SJung-uk Kim die "ELSIF following ELSE" if abs($skip[$#skip]) == 2; 1768*e71b7053SJung-uk Kim $skip[$#skip] = -1 if $skip[$#skip] != 0; 1769*e71b7053SJung-uk Kim $skip[$#skip] = !! $1 1770*e71b7053SJung-uk Kim if $skip[$#skip] == 0; }, 1771*e71b7053SJung-uk Kim qr/^\s*ELSE\s*$/ 1772*e71b7053SJung-uk Kim => sub { die "ELSE out of scope" if ! @skip; 1773*e71b7053SJung-uk Kim $skip[$#skip] = -2 if $skip[$#skip] != 0; 1774*e71b7053SJung-uk Kim $skip[$#skip] = 2 if $skip[$#skip] == 0; }, 1775*e71b7053SJung-uk Kim qr/^\s*ENDIF\s*$/ 1776*e71b7053SJung-uk Kim => sub { die "ENDIF out of scope" if ! @skip; 1777*e71b7053SJung-uk Kim pop @skip; }, 1778*e71b7053SJung-uk Kim qr/^\s*PROGRAMS(_NO_INST)?\s*=\s*(.*)\s*$/ 1779*e71b7053SJung-uk Kim => sub { 1780*e71b7053SJung-uk Kim if (!@skip || $skip[$#skip] > 0) { 1781*e71b7053SJung-uk Kim my $install = $1; 1782*e71b7053SJung-uk Kim my @x = tokenize($2); 1783*e71b7053SJung-uk Kim push @programs, @x; 1784*e71b7053SJung-uk Kim push @programs_install, @x unless $install; 1785*e71b7053SJung-uk Kim } 1786*e71b7053SJung-uk Kim }, 1787*e71b7053SJung-uk Kim qr/^\s*LIBS(_NO_INST)?\s*=\s*(.*)\s*$/ 1788*e71b7053SJung-uk Kim => sub { 1789*e71b7053SJung-uk Kim if (!@skip || $skip[$#skip] > 0) { 1790*e71b7053SJung-uk Kim my $install = $1; 1791*e71b7053SJung-uk Kim my @x = tokenize($2); 1792*e71b7053SJung-uk Kim push @libraries, @x; 1793*e71b7053SJung-uk Kim push @libraries_install, @x unless $install; 1794*e71b7053SJung-uk Kim } 1795*e71b7053SJung-uk Kim }, 1796*e71b7053SJung-uk Kim qr/^\s*ENGINES(_NO_INST)?\s*=\s*(.*)\s*$/ 1797*e71b7053SJung-uk Kim => sub { 1798*e71b7053SJung-uk Kim if (!@skip || $skip[$#skip] > 0) { 1799*e71b7053SJung-uk Kim my $install = $1; 1800*e71b7053SJung-uk Kim my @x = tokenize($2); 1801*e71b7053SJung-uk Kim push @engines, @x; 1802*e71b7053SJung-uk Kim push @engines_install, @x unless $install; 1803*e71b7053SJung-uk Kim } 1804*e71b7053SJung-uk Kim }, 1805*e71b7053SJung-uk Kim qr/^\s*SCRIPTS(_NO_INST)?\s*=\s*(.*)\s*$/ 1806*e71b7053SJung-uk Kim => sub { 1807*e71b7053SJung-uk Kim if (!@skip || $skip[$#skip] > 0) { 1808*e71b7053SJung-uk Kim my $install = $1; 1809*e71b7053SJung-uk Kim my @x = tokenize($2); 1810*e71b7053SJung-uk Kim push @scripts, @x; 1811*e71b7053SJung-uk Kim push @scripts_install, @x unless $install; 1812*e71b7053SJung-uk Kim } 1813*e71b7053SJung-uk Kim }, 1814*e71b7053SJung-uk Kim qr/^\s*EXTRA\s*=\s*(.*)\s*$/ 1815*e71b7053SJung-uk Kim => sub { push @extra, tokenize($1) 1816*e71b7053SJung-uk Kim if !@skip || $skip[$#skip] > 0 }, 1817*e71b7053SJung-uk Kim qr/^\s*OVERRIDES\s*=\s*(.*)\s*$/ 1818*e71b7053SJung-uk Kim => sub { push @overrides, tokenize($1) 1819*e71b7053SJung-uk Kim if !@skip || $skip[$#skip] > 0 }, 1820*e71b7053SJung-uk Kim 1821*e71b7053SJung-uk Kim qr/^\s*ORDINALS\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/, 1822*e71b7053SJung-uk Kim => sub { push @{$ordinals{$1}}, tokenize($2) 1823*e71b7053SJung-uk Kim if !@skip || $skip[$#skip] > 0 }, 1824*e71b7053SJung-uk Kim qr/^\s*SOURCE\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/ 1825*e71b7053SJung-uk Kim => sub { push @{$sources{$1}}, tokenize($2) 1826*e71b7053SJung-uk Kim if !@skip || $skip[$#skip] > 0 }, 1827*e71b7053SJung-uk Kim qr/^\s*SHARED_SOURCE\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/ 1828*e71b7053SJung-uk Kim => sub { push @{$shared_sources{$1}}, tokenize($2) 1829*e71b7053SJung-uk Kim if !@skip || $skip[$#skip] > 0 }, 1830*e71b7053SJung-uk Kim qr/^\s*INCLUDE\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/ 1831*e71b7053SJung-uk Kim => sub { push @{$includes{$1}}, tokenize($2) 1832*e71b7053SJung-uk Kim if !@skip || $skip[$#skip] > 0 }, 1833*e71b7053SJung-uk Kim qr/^\s*DEPEND\[((?:\\.|[^\\\]])*)\]\s*=\s*(.*)\s*$/ 1834*e71b7053SJung-uk Kim => sub { push @{$depends{$1}}, tokenize($2) 1835*e71b7053SJung-uk Kim if !@skip || $skip[$#skip] > 0 }, 1836*e71b7053SJung-uk Kim qr/^\s*GENERATE\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/ 1837*e71b7053SJung-uk Kim => sub { push @{$generate{$1}}, $2 1838*e71b7053SJung-uk Kim if !@skip || $skip[$#skip] > 0 }, 1839*e71b7053SJung-uk Kim qr/^\s*RENAME\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/ 1840*e71b7053SJung-uk Kim => sub { push @{$renames{$1}}, tokenize($2) 1841*e71b7053SJung-uk Kim if !@skip || $skip[$#skip] > 0 }, 1842*e71b7053SJung-uk Kim qr/^\s*SHARED_NAME\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/ 1843*e71b7053SJung-uk Kim => sub { push @{$sharednames{$1}}, tokenize($2) 1844*e71b7053SJung-uk Kim if !@skip || $skip[$#skip] > 0 }, 1845*e71b7053SJung-uk Kim qr/^\s*BEGINRAW\[((?:\\.|[^\\\]])+)\]\s*$/ 1846*e71b7053SJung-uk Kim => sub { 1847*e71b7053SJung-uk Kim my $lineiterator = shift; 1848*e71b7053SJung-uk Kim my $target_kind = $1; 1849*e71b7053SJung-uk Kim while (defined $lineiterator->()) { 1850*e71b7053SJung-uk Kim s|\R$||; 1851*e71b7053SJung-uk Kim if (/^\s*ENDRAW\[((?:\\.|[^\\\]])+)\]\s*$/) { 1852*e71b7053SJung-uk Kim die "ENDRAW doesn't match BEGINRAW" 1853*e71b7053SJung-uk Kim if $1 ne $target_kind; 1854*e71b7053SJung-uk Kim last; 1855*e71b7053SJung-uk Kim } 1856*e71b7053SJung-uk Kim next if @skip && $skip[$#skip] <= 0; 1857*e71b7053SJung-uk Kim push @rawlines, $_ 1858*e71b7053SJung-uk Kim if ($target_kind eq $target{build_file} 1859*e71b7053SJung-uk Kim || $target_kind eq $target{build_file}."(".$builder_platform.")"); 1860*e71b7053SJung-uk Kim } 1861*e71b7053SJung-uk Kim }, 1862*e71b7053SJung-uk Kim qr/^\s*(?:#.*)?$/ => sub { }, 1863*e71b7053SJung-uk Kim "OTHERWISE" => sub { die "Something wrong with this line:\n$_\nat $sourced/$f" }, 1864*e71b7053SJung-uk Kim "BEFORE" => sub { 1865*e71b7053SJung-uk Kim if ($buildinfo_debug) { 1866*e71b7053SJung-uk Kim print STDERR "DEBUG: Parsing ",join(" ", @_),"\n"; 1867*e71b7053SJung-uk Kim print STDERR "DEBUG: ... before parsing, skip stack is ",join(" ", map { int($_) } @skip),"\n"; 1868*e71b7053SJung-uk Kim } 1869*e71b7053SJung-uk Kim }, 1870*e71b7053SJung-uk Kim "AFTER" => sub { 1871*e71b7053SJung-uk Kim if ($buildinfo_debug) { 1872*e71b7053SJung-uk Kim print STDERR "DEBUG: .... after parsing, skip stack is ",join(" ", map { int($_) } @skip),"\n"; 1873*e71b7053SJung-uk Kim } 1874*e71b7053SJung-uk Kim }, 1875*e71b7053SJung-uk Kim ); 1876*e71b7053SJung-uk Kim die "runaway IF?" if (@skip); 1877*e71b7053SJung-uk Kim 1878*e71b7053SJung-uk Kim foreach (keys %renames) { 1879*e71b7053SJung-uk Kim die "$_ renamed to more than one thing: " 1880*e71b7053SJung-uk Kim ,join(" ", @{$renames{$_}}),"\n" 1881*e71b7053SJung-uk Kim if scalar @{$renames{$_}} > 1; 1882*e71b7053SJung-uk Kim my $dest = cleanfile($buildd, $_, $blddir); 1883*e71b7053SJung-uk Kim my $to = cleanfile($buildd, $renames{$_}->[0], $blddir); 1884*e71b7053SJung-uk Kim die "$dest renamed to more than one thing: " 1885*e71b7053SJung-uk Kim ,$unified_info{rename}->{$dest}, $to 1886*e71b7053SJung-uk Kim unless !defined($unified_info{rename}->{$dest}) 1887*e71b7053SJung-uk Kim or $unified_info{rename}->{$dest} eq $to; 1888*e71b7053SJung-uk Kim $unified_info{rename}->{$dest} = $to; 1889*e71b7053SJung-uk Kim } 1890*e71b7053SJung-uk Kim 1891*e71b7053SJung-uk Kim foreach (@programs) { 1892*e71b7053SJung-uk Kim my $program = cleanfile($buildd, $_, $blddir); 1893*e71b7053SJung-uk Kim if ($unified_info{rename}->{$program}) { 1894*e71b7053SJung-uk Kim $program = $unified_info{rename}->{$program}; 1895*e71b7053SJung-uk Kim } 1896*e71b7053SJung-uk Kim $unified_info{programs}->{$program} = 1; 1897*e71b7053SJung-uk Kim } 1898*e71b7053SJung-uk Kim 1899*e71b7053SJung-uk Kim foreach (@programs_install) { 1900*e71b7053SJung-uk Kim my $program = cleanfile($buildd, $_, $blddir); 1901*e71b7053SJung-uk Kim if ($unified_info{rename}->{$program}) { 1902*e71b7053SJung-uk Kim $program = $unified_info{rename}->{$program}; 1903*e71b7053SJung-uk Kim } 1904*e71b7053SJung-uk Kim $unified_info{install}->{programs}->{$program} = 1; 1905*e71b7053SJung-uk Kim } 1906*e71b7053SJung-uk Kim 1907*e71b7053SJung-uk Kim foreach (@libraries) { 1908*e71b7053SJung-uk Kim my $library = cleanfile($buildd, $_, $blddir); 1909*e71b7053SJung-uk Kim if ($unified_info{rename}->{$library}) { 1910*e71b7053SJung-uk Kim $library = $unified_info{rename}->{$library}; 1911*e71b7053SJung-uk Kim } 1912*e71b7053SJung-uk Kim $unified_info{libraries}->{$library} = 1; 1913*e71b7053SJung-uk Kim } 1914*e71b7053SJung-uk Kim 1915*e71b7053SJung-uk Kim foreach (@libraries_install) { 1916*e71b7053SJung-uk Kim my $library = cleanfile($buildd, $_, $blddir); 1917*e71b7053SJung-uk Kim if ($unified_info{rename}->{$library}) { 1918*e71b7053SJung-uk Kim $library = $unified_info{rename}->{$library}; 1919*e71b7053SJung-uk Kim } 1920*e71b7053SJung-uk Kim $unified_info{install}->{libraries}->{$library} = 1; 1921*e71b7053SJung-uk Kim } 1922*e71b7053SJung-uk Kim 1923*e71b7053SJung-uk Kim die <<"EOF" if scalar @engines and !$config{dynamic_engines}; 1924*e71b7053SJung-uk KimENGINES can only be used if configured with 'dynamic-engine'. 1925*e71b7053SJung-uk KimThis is usually a fault in a build.info file. 1926*e71b7053SJung-uk KimEOF 1927*e71b7053SJung-uk Kim foreach (@engines) { 1928*e71b7053SJung-uk Kim my $library = cleanfile($buildd, $_, $blddir); 1929*e71b7053SJung-uk Kim if ($unified_info{rename}->{$library}) { 1930*e71b7053SJung-uk Kim $library = $unified_info{rename}->{$library}; 1931*e71b7053SJung-uk Kim } 1932*e71b7053SJung-uk Kim $unified_info{engines}->{$library} = 1; 1933*e71b7053SJung-uk Kim } 1934*e71b7053SJung-uk Kim 1935*e71b7053SJung-uk Kim foreach (@engines_install) { 1936*e71b7053SJung-uk Kim my $library = cleanfile($buildd, $_, $blddir); 1937*e71b7053SJung-uk Kim if ($unified_info{rename}->{$library}) { 1938*e71b7053SJung-uk Kim $library = $unified_info{rename}->{$library}; 1939*e71b7053SJung-uk Kim } 1940*e71b7053SJung-uk Kim $unified_info{install}->{engines}->{$library} = 1; 1941*e71b7053SJung-uk Kim } 1942*e71b7053SJung-uk Kim 1943*e71b7053SJung-uk Kim foreach (@scripts) { 1944*e71b7053SJung-uk Kim my $script = cleanfile($buildd, $_, $blddir); 1945*e71b7053SJung-uk Kim if ($unified_info{rename}->{$script}) { 1946*e71b7053SJung-uk Kim $script = $unified_info{rename}->{$script}; 1947*e71b7053SJung-uk Kim } 1948*e71b7053SJung-uk Kim $unified_info{scripts}->{$script} = 1; 1949*e71b7053SJung-uk Kim } 1950*e71b7053SJung-uk Kim 1951*e71b7053SJung-uk Kim foreach (@scripts_install) { 1952*e71b7053SJung-uk Kim my $script = cleanfile($buildd, $_, $blddir); 1953*e71b7053SJung-uk Kim if ($unified_info{rename}->{$script}) { 1954*e71b7053SJung-uk Kim $script = $unified_info{rename}->{$script}; 1955*e71b7053SJung-uk Kim } 1956*e71b7053SJung-uk Kim $unified_info{install}->{scripts}->{$script} = 1; 1957*e71b7053SJung-uk Kim } 1958*e71b7053SJung-uk Kim 1959*e71b7053SJung-uk Kim foreach (@extra) { 1960*e71b7053SJung-uk Kim my $extra = cleanfile($buildd, $_, $blddir); 1961*e71b7053SJung-uk Kim $unified_info{extra}->{$extra} = 1; 1962*e71b7053SJung-uk Kim } 1963*e71b7053SJung-uk Kim 1964*e71b7053SJung-uk Kim foreach (@overrides) { 1965*e71b7053SJung-uk Kim my $override = cleanfile($buildd, $_, $blddir); 1966*e71b7053SJung-uk Kim $unified_info{overrides}->{$override} = 1; 1967*e71b7053SJung-uk Kim } 1968*e71b7053SJung-uk Kim 1969*e71b7053SJung-uk Kim push @{$unified_info{rawlines}}, @rawlines; 1970*e71b7053SJung-uk Kim 1971*e71b7053SJung-uk Kim unless ($disabled{shared}) { 1972*e71b7053SJung-uk Kim # Check sharednames. 1973*e71b7053SJung-uk Kim foreach (keys %sharednames) { 1974*e71b7053SJung-uk Kim my $dest = cleanfile($buildd, $_, $blddir); 1975*e71b7053SJung-uk Kim if ($unified_info{rename}->{$dest}) { 1976*e71b7053SJung-uk Kim $dest = $unified_info{rename}->{$dest}; 1977*e71b7053SJung-uk Kim } 1978*e71b7053SJung-uk Kim die "shared_name for $dest with multiple values: " 1979*e71b7053SJung-uk Kim ,join(" ", @{$sharednames{$_}}),"\n" 1980*e71b7053SJung-uk Kim if scalar @{$sharednames{$_}} > 1; 1981*e71b7053SJung-uk Kim my $to = cleanfile($buildd, $sharednames{$_}->[0], $blddir); 1982*e71b7053SJung-uk Kim die "shared_name found for a library $dest that isn't defined\n" 1983*e71b7053SJung-uk Kim unless $unified_info{libraries}->{$dest}; 1984*e71b7053SJung-uk Kim die "shared_name for $dest with multiple values: " 1985*e71b7053SJung-uk Kim ,$unified_info{sharednames}->{$dest}, ", ", $to 1986*e71b7053SJung-uk Kim unless !defined($unified_info{sharednames}->{$dest}) 1987*e71b7053SJung-uk Kim or $unified_info{sharednames}->{$dest} eq $to; 1988*e71b7053SJung-uk Kim $unified_info{sharednames}->{$dest} = $to; 1989*e71b7053SJung-uk Kim } 1990*e71b7053SJung-uk Kim 1991*e71b7053SJung-uk Kim # Additionally, we set up sharednames for libraries that don't 1992*e71b7053SJung-uk Kim # have any, as themselves. Only for libraries that aren't 1993*e71b7053SJung-uk Kim # explicitly static. 1994*e71b7053SJung-uk Kim foreach (grep !/\.a$/, keys %{$unified_info{libraries}}) { 1995*e71b7053SJung-uk Kim if (!defined $unified_info{sharednames}->{$_}) { 1996*e71b7053SJung-uk Kim $unified_info{sharednames}->{$_} = $_ 1997*e71b7053SJung-uk Kim } 1998*e71b7053SJung-uk Kim } 1999*e71b7053SJung-uk Kim 2000*e71b7053SJung-uk Kim # Check that we haven't defined any library as both shared and 2001*e71b7053SJung-uk Kim # explicitly static. That is forbidden. 2002*e71b7053SJung-uk Kim my @doubles = (); 2003*e71b7053SJung-uk Kim foreach (grep /\.a$/, keys %{$unified_info{libraries}}) { 2004*e71b7053SJung-uk Kim (my $l = $_) =~ s/\.a$//; 2005*e71b7053SJung-uk Kim push @doubles, $l if defined $unified_info{sharednames}->{$l}; 2006*e71b7053SJung-uk Kim } 2007*e71b7053SJung-uk Kim die "these libraries are both explicitly static and shared:\n ", 2008*e71b7053SJung-uk Kim join(" ", @doubles), "\n" 2009*e71b7053SJung-uk Kim if @doubles; 2010*e71b7053SJung-uk Kim } 2011*e71b7053SJung-uk Kim 2012*e71b7053SJung-uk Kim foreach (keys %sources) { 2013*e71b7053SJung-uk Kim my $dest = $_; 2014*e71b7053SJung-uk Kim my $ddest = cleanfile($buildd, $_, $blddir); 2015*e71b7053SJung-uk Kim if ($unified_info{rename}->{$ddest}) { 2016*e71b7053SJung-uk Kim $ddest = $unified_info{rename}->{$ddest}; 2017*e71b7053SJung-uk Kim } 2018*e71b7053SJung-uk Kim foreach (@{$sources{$dest}}) { 2019*e71b7053SJung-uk Kim my $s = cleanfile($sourced, $_, $blddir); 2020*e71b7053SJung-uk Kim 2021*e71b7053SJung-uk Kim # If it isn't in the source tree, we assume it's generated 2022*e71b7053SJung-uk Kim # in the build tree 2023*e71b7053SJung-uk Kim if ($s eq $src_configdata || ! -f $s || $generate{$_}) { 2024*e71b7053SJung-uk Kim $s = cleanfile($buildd, $_, $blddir); 2025*e71b7053SJung-uk Kim } 2026*e71b7053SJung-uk Kim # We recognise C++, C and asm files 2027*e71b7053SJung-uk Kim if ($s =~ /\.(cc|cpp|c|s|S)$/) { 2028*e71b7053SJung-uk Kim my $o = $_; 2029*e71b7053SJung-uk Kim $o =~ s/\.[csS]$/.o/; # C and assembler 2030*e71b7053SJung-uk Kim $o =~ s/\.(cc|cpp)$/_cc.o/; # C++ 2031*e71b7053SJung-uk Kim $o = cleanfile($buildd, $o, $blddir); 2032*e71b7053SJung-uk Kim $unified_info{sources}->{$ddest}->{$o} = 1; 2033*e71b7053SJung-uk Kim $unified_info{sources}->{$o}->{$s} = 1; 2034*e71b7053SJung-uk Kim } elsif ($s =~ /\.rc$/) { 2035*e71b7053SJung-uk Kim # We also recognise resource files 2036*e71b7053SJung-uk Kim my $o = $_; 2037*e71b7053SJung-uk Kim $o =~ s/\.rc$/.res/; # Resource configuration 2038*e71b7053SJung-uk Kim my $o = cleanfile($buildd, $o, $blddir); 2039*e71b7053SJung-uk Kim $unified_info{sources}->{$ddest}->{$o} = 1; 2040*e71b7053SJung-uk Kim $unified_info{sources}->{$o}->{$s} = 1; 2041*e71b7053SJung-uk Kim } else { 2042*e71b7053SJung-uk Kim $unified_info{sources}->{$ddest}->{$s} = 1; 2043*e71b7053SJung-uk Kim } 2044*e71b7053SJung-uk Kim } 2045*e71b7053SJung-uk Kim } 2046*e71b7053SJung-uk Kim 2047*e71b7053SJung-uk Kim foreach (keys %shared_sources) { 2048*e71b7053SJung-uk Kim my $dest = $_; 2049*e71b7053SJung-uk Kim my $ddest = cleanfile($buildd, $_, $blddir); 2050*e71b7053SJung-uk Kim if ($unified_info{rename}->{$ddest}) { 2051*e71b7053SJung-uk Kim $ddest = $unified_info{rename}->{$ddest}; 2052*e71b7053SJung-uk Kim } 2053*e71b7053SJung-uk Kim foreach (@{$shared_sources{$dest}}) { 2054*e71b7053SJung-uk Kim my $s = cleanfile($sourced, $_, $blddir); 2055*e71b7053SJung-uk Kim 2056*e71b7053SJung-uk Kim # If it isn't in the source tree, we assume it's generated 2057*e71b7053SJung-uk Kim # in the build tree 2058*e71b7053SJung-uk Kim if ($s eq $src_configdata || ! -f $s || $generate{$_}) { 2059*e71b7053SJung-uk Kim $s = cleanfile($buildd, $_, $blddir); 2060*e71b7053SJung-uk Kim } 2061*e71b7053SJung-uk Kim 2062*e71b7053SJung-uk Kim if ($s =~ /\.(cc|cpp|c|s|S)$/) { 2063*e71b7053SJung-uk Kim # We recognise C++, C and asm files 2064*e71b7053SJung-uk Kim my $o = $_; 2065*e71b7053SJung-uk Kim $o =~ s/\.[csS]$/.o/; # C and assembler 2066*e71b7053SJung-uk Kim $o =~ s/\.(cc|cpp)$/_cc.o/; # C++ 2067*e71b7053SJung-uk Kim $o = cleanfile($buildd, $o, $blddir); 2068*e71b7053SJung-uk Kim $unified_info{shared_sources}->{$ddest}->{$o} = 1; 2069*e71b7053SJung-uk Kim $unified_info{sources}->{$o}->{$s} = 1; 2070*e71b7053SJung-uk Kim } elsif ($s =~ /\.rc$/) { 2071*e71b7053SJung-uk Kim # We also recognise resource files 2072*e71b7053SJung-uk Kim my $o = $_; 2073*e71b7053SJung-uk Kim $o =~ s/\.rc$/.res/; # Resource configuration 2074*e71b7053SJung-uk Kim my $o = cleanfile($buildd, $o, $blddir); 2075*e71b7053SJung-uk Kim $unified_info{shared_sources}->{$ddest}->{$o} = 1; 2076*e71b7053SJung-uk Kim $unified_info{sources}->{$o}->{$s} = 1; 2077*e71b7053SJung-uk Kim } elsif ($s =~ /\.(def|map|opt)$/) { 2078*e71b7053SJung-uk Kim # We also recognise .def / .map / .opt files 2079*e71b7053SJung-uk Kim # We know they are generated files 2080*e71b7053SJung-uk Kim my $def = cleanfile($buildd, $s, $blddir); 2081*e71b7053SJung-uk Kim $unified_info{shared_sources}->{$ddest}->{$def} = 1; 2082*e71b7053SJung-uk Kim } else { 2083*e71b7053SJung-uk Kim die "unrecognised source file type for shared library: $s\n"; 2084*e71b7053SJung-uk Kim } 2085*e71b7053SJung-uk Kim } 2086*e71b7053SJung-uk Kim } 2087*e71b7053SJung-uk Kim 2088*e71b7053SJung-uk Kim foreach (keys %generate) { 2089*e71b7053SJung-uk Kim my $dest = $_; 2090*e71b7053SJung-uk Kim my $ddest = cleanfile($buildd, $_, $blddir); 2091*e71b7053SJung-uk Kim if ($unified_info{rename}->{$ddest}) { 2092*e71b7053SJung-uk Kim $ddest = $unified_info{rename}->{$ddest}; 2093*e71b7053SJung-uk Kim } 2094*e71b7053SJung-uk Kim die "more than one generator for $dest: " 2095*e71b7053SJung-uk Kim ,join(" ", @{$generate{$_}}),"\n" 2096*e71b7053SJung-uk Kim if scalar @{$generate{$_}} > 1; 2097*e71b7053SJung-uk Kim my @generator = split /\s+/, $generate{$dest}->[0]; 2098*e71b7053SJung-uk Kim $generator[0] = cleanfile($sourced, $generator[0], $blddir), 2099*e71b7053SJung-uk Kim $unified_info{generate}->{$ddest} = [ @generator ]; 2100*e71b7053SJung-uk Kim } 2101*e71b7053SJung-uk Kim 2102*e71b7053SJung-uk Kim foreach (keys %depends) { 2103*e71b7053SJung-uk Kim my $dest = $_; 2104*e71b7053SJung-uk Kim my $ddest = $dest eq "" ? "" : cleanfile($sourced, $_, $blddir); 2105*e71b7053SJung-uk Kim 2106*e71b7053SJung-uk Kim # If the destination doesn't exist in source, it can only be 2107*e71b7053SJung-uk Kim # a generated file in the build tree. 2108*e71b7053SJung-uk Kim if ($ddest ne "" && ($ddest eq $src_configdata || ! -f $ddest)) { 2109*e71b7053SJung-uk Kim $ddest = cleanfile($buildd, $_, $blddir); 2110*e71b7053SJung-uk Kim if ($unified_info{rename}->{$ddest}) { 2111*e71b7053SJung-uk Kim $ddest = $unified_info{rename}->{$ddest}; 2112*e71b7053SJung-uk Kim } 2113*e71b7053SJung-uk Kim } 2114*e71b7053SJung-uk Kim foreach (@{$depends{$dest}}) { 2115*e71b7053SJung-uk Kim my $d = cleanfile($sourced, $_, $blddir); 2116*e71b7053SJung-uk Kim 2117*e71b7053SJung-uk Kim # If we know it's generated, or assume it is because we can't 2118*e71b7053SJung-uk Kim # find it in the source tree, we set file we depend on to be 2119*e71b7053SJung-uk Kim # in the build tree rather than the source tree, and assume 2120*e71b7053SJung-uk Kim # and that there are lines to build it in a BEGINRAW..ENDRAW 2121*e71b7053SJung-uk Kim # section or in the Makefile template. 2122*e71b7053SJung-uk Kim if ($d eq $src_configdata 2123*e71b7053SJung-uk Kim || ! -f $d 2124*e71b7053SJung-uk Kim || (grep { $d eq $_ } 2125*e71b7053SJung-uk Kim map { cleanfile($srcdir, $_, $blddir) } 2126*e71b7053SJung-uk Kim grep { /\.h$/ } keys %{$unified_info{generate}})) { 2127*e71b7053SJung-uk Kim $d = cleanfile($buildd, $_, $blddir); 2128*e71b7053SJung-uk Kim } 2129*e71b7053SJung-uk Kim # Take note if the file to depend on is being renamed 2130*e71b7053SJung-uk Kim # Take extra care with files ending with .a, they should 2131*e71b7053SJung-uk Kim # be treated without that extension, and the extension 2132*e71b7053SJung-uk Kim # should be added back after treatment. 2133*e71b7053SJung-uk Kim $d =~ /(\.a)?$/; 2134*e71b7053SJung-uk Kim my $e = $1 // ""; 2135*e71b7053SJung-uk Kim $d = $`; 2136*e71b7053SJung-uk Kim if ($unified_info{rename}->{$d}) { 2137*e71b7053SJung-uk Kim $d = $unified_info{rename}->{$d}; 2138*e71b7053SJung-uk Kim } 2139*e71b7053SJung-uk Kim $d .= $e; 2140*e71b7053SJung-uk Kim $unified_info{depends}->{$ddest}->{$d} = 1; 2141*e71b7053SJung-uk Kim } 2142*e71b7053SJung-uk Kim } 2143*e71b7053SJung-uk Kim 2144*e71b7053SJung-uk Kim foreach (keys %includes) { 2145*e71b7053SJung-uk Kim my $dest = $_; 2146*e71b7053SJung-uk Kim my $ddest = cleanfile($sourced, $_, $blddir); 2147*e71b7053SJung-uk Kim 2148*e71b7053SJung-uk Kim # If the destination doesn't exist in source, it can only be 2149*e71b7053SJung-uk Kim # a generated file in the build tree. 2150*e71b7053SJung-uk Kim if ($ddest eq $src_configdata || ! -f $ddest) { 2151*e71b7053SJung-uk Kim $ddest = cleanfile($buildd, $_, $blddir); 2152*e71b7053SJung-uk Kim if ($unified_info{rename}->{$ddest}) { 2153*e71b7053SJung-uk Kim $ddest = $unified_info{rename}->{$ddest}; 2154*e71b7053SJung-uk Kim } 2155*e71b7053SJung-uk Kim } 2156*e71b7053SJung-uk Kim foreach (@{$includes{$dest}}) { 2157*e71b7053SJung-uk Kim my $is = cleandir($sourced, $_, $blddir); 2158*e71b7053SJung-uk Kim my $ib = cleandir($buildd, $_, $blddir); 2159*e71b7053SJung-uk Kim push @{$unified_info{includes}->{$ddest}->{source}}, $is 2160*e71b7053SJung-uk Kim unless grep { $_ eq $is } @{$unified_info{includes}->{$ddest}->{source}}; 2161*e71b7053SJung-uk Kim push @{$unified_info{includes}->{$ddest}->{build}}, $ib 2162*e71b7053SJung-uk Kim unless grep { $_ eq $ib } @{$unified_info{includes}->{$ddest}->{build}}; 2163*e71b7053SJung-uk Kim } 2164*e71b7053SJung-uk Kim } 2165*e71b7053SJung-uk Kim } 2166*e71b7053SJung-uk Kim 2167*e71b7053SJung-uk Kim my $ordinals_text = join(', ', sort keys %ordinals); 2168*e71b7053SJung-uk Kim warn <<"EOF" if $ordinals_text; 2169*e71b7053SJung-uk Kim 2170*e71b7053SJung-uk KimWARNING: ORDINALS were specified for $ordinals_text 2171*e71b7053SJung-uk KimThey are ignored and should be replaced with a combination of GENERATE, 2172*e71b7053SJung-uk KimDEPEND and SHARED_SOURCE. 2173*e71b7053SJung-uk KimEOF 2174*e71b7053SJung-uk Kim 2175*e71b7053SJung-uk Kim # Massage the result 2176*e71b7053SJung-uk Kim 2177*e71b7053SJung-uk Kim # If we depend on a header file or a perl module, add an inclusion of 2178*e71b7053SJung-uk Kim # its directory to allow smoothe inclusion 2179*e71b7053SJung-uk Kim foreach my $dest (keys %{$unified_info{depends}}) { 2180*e71b7053SJung-uk Kim next if $dest eq ""; 2181*e71b7053SJung-uk Kim foreach my $d (keys %{$unified_info{depends}->{$dest}}) { 2182*e71b7053SJung-uk Kim next unless $d =~ /\.(h|pm)$/; 2183*e71b7053SJung-uk Kim my $i = dirname($d); 2184*e71b7053SJung-uk Kim my $spot = 2185*e71b7053SJung-uk Kim $d eq "configdata.pm" || defined($unified_info{generate}->{$d}) 2186*e71b7053SJung-uk Kim ? 'build' : 'source'; 2187*e71b7053SJung-uk Kim push @{$unified_info{includes}->{$dest}->{$spot}}, $i 2188*e71b7053SJung-uk Kim unless grep { $_ eq $i } @{$unified_info{includes}->{$dest}->{$spot}}; 2189*e71b7053SJung-uk Kim } 2190*e71b7053SJung-uk Kim } 2191*e71b7053SJung-uk Kim 2192*e71b7053SJung-uk Kim # Trickle down includes placed on libraries, engines and programs to 2193*e71b7053SJung-uk Kim # their sources (i.e. object files) 2194*e71b7053SJung-uk Kim foreach my $dest (keys %{$unified_info{engines}}, 2195*e71b7053SJung-uk Kim keys %{$unified_info{libraries}}, 2196*e71b7053SJung-uk Kim keys %{$unified_info{programs}}) { 2197*e71b7053SJung-uk Kim foreach my $k (("source", "build")) { 2198*e71b7053SJung-uk Kim next unless defined($unified_info{includes}->{$dest}->{$k}); 2199*e71b7053SJung-uk Kim my @incs = reverse @{$unified_info{includes}->{$dest}->{$k}}; 2200*e71b7053SJung-uk Kim foreach my $obj (grep /\.o$/, 2201*e71b7053SJung-uk Kim (keys %{$unified_info{sources}->{$dest}}, 2202*e71b7053SJung-uk Kim keys %{$unified_info{shared_sources}->{$dest}})) { 2203*e71b7053SJung-uk Kim foreach my $inc (@incs) { 2204*e71b7053SJung-uk Kim unshift @{$unified_info{includes}->{$obj}->{$k}}, $inc 2205*e71b7053SJung-uk Kim unless grep { $_ eq $inc } @{$unified_info{includes}->{$obj}->{$k}}; 2206*e71b7053SJung-uk Kim } 2207*e71b7053SJung-uk Kim } 2208*e71b7053SJung-uk Kim } 2209*e71b7053SJung-uk Kim delete $unified_info{includes}->{$dest}; 2210*e71b7053SJung-uk Kim } 2211*e71b7053SJung-uk Kim 2212*e71b7053SJung-uk Kim ### Make unified_info a bit more efficient 2213*e71b7053SJung-uk Kim # One level structures 2214*e71b7053SJung-uk Kim foreach (("programs", "libraries", "engines", "scripts", "extra", "overrides")) { 2215*e71b7053SJung-uk Kim $unified_info{$_} = [ sort keys %{$unified_info{$_}} ]; 2216*e71b7053SJung-uk Kim } 2217*e71b7053SJung-uk Kim # Two level structures 2218*e71b7053SJung-uk Kim foreach my $l1 (("install", "sources", "shared_sources", "ldadd", "depends")) { 2219*e71b7053SJung-uk Kim foreach my $l2 (sort keys %{$unified_info{$l1}}) { 2220*e71b7053SJung-uk Kim $unified_info{$l1}->{$l2} = 2221*e71b7053SJung-uk Kim [ sort keys %{$unified_info{$l1}->{$l2}} ]; 2222*e71b7053SJung-uk Kim } 2223*e71b7053SJung-uk Kim } 2224*e71b7053SJung-uk Kim # Includes 2225*e71b7053SJung-uk Kim foreach my $dest (sort keys %{$unified_info{includes}}) { 2226*e71b7053SJung-uk Kim if (defined($unified_info{includes}->{$dest}->{build})) { 2227*e71b7053SJung-uk Kim my @source_includes = (); 2228*e71b7053SJung-uk Kim @source_includes = ( @{$unified_info{includes}->{$dest}->{source}} ) 2229*e71b7053SJung-uk Kim if defined($unified_info{includes}->{$dest}->{source}); 2230*e71b7053SJung-uk Kim $unified_info{includes}->{$dest} = 2231*e71b7053SJung-uk Kim [ @{$unified_info{includes}->{$dest}->{build}} ]; 2232*e71b7053SJung-uk Kim foreach my $inc (@source_includes) { 2233*e71b7053SJung-uk Kim push @{$unified_info{includes}->{$dest}}, $inc 2234*e71b7053SJung-uk Kim unless grep { $_ eq $inc } @{$unified_info{includes}->{$dest}}; 2235*e71b7053SJung-uk Kim } 2236*e71b7053SJung-uk Kim } else { 2237*e71b7053SJung-uk Kim $unified_info{includes}->{$dest} = 2238*e71b7053SJung-uk Kim [ @{$unified_info{includes}->{$dest}->{source}} ]; 2239*e71b7053SJung-uk Kim } 2240*e71b7053SJung-uk Kim } 2241*e71b7053SJung-uk Kim} 2242*e71b7053SJung-uk Kim 2243*e71b7053SJung-uk Kim# For the schemes that need it, we provide the old *_obj configs 2244*e71b7053SJung-uk Kim# from the *_asm_obj ones 2245*e71b7053SJung-uk Kimforeach (grep /_(asm|aux)_src$/, keys %target) { 2246*e71b7053SJung-uk Kim my $src = $_; 2247*e71b7053SJung-uk Kim (my $obj = $_) =~ s/_(asm|aux)_src$/_obj/; 2248*e71b7053SJung-uk Kim $target{$obj} = $target{$src}; 2249*e71b7053SJung-uk Kim $target{$obj} =~ s/\.[csS]\b/.o/g; # C and assembler 2250*e71b7053SJung-uk Kim $target{$obj} =~ s/\.(cc|cpp)\b/_cc.o/g; # C++ 2251*e71b7053SJung-uk Kim} 2252*e71b7053SJung-uk Kim 2253*e71b7053SJung-uk Kim# Write down our configuration where it fits ######################### 2254*e71b7053SJung-uk Kim 2255*e71b7053SJung-uk Kimprint "Creating configdata.pm\n"; 2256*e71b7053SJung-uk Kimopen(OUT,">configdata.pm") || die "unable to create configdata.pm: $!\n"; 2257*e71b7053SJung-uk Kimprint OUT <<"EOF"; 2258*e71b7053SJung-uk Kim#! $config{HASHBANGPERL} 2259*e71b7053SJung-uk Kim 2260*e71b7053SJung-uk Kimpackage configdata; 2261*e71b7053SJung-uk Kim 2262*e71b7053SJung-uk Kimuse strict; 2263*e71b7053SJung-uk Kimuse warnings; 2264*e71b7053SJung-uk Kim 2265*e71b7053SJung-uk Kimuse Exporter; 2266*e71b7053SJung-uk Kim#use vars qw(\@ISA \@EXPORT); 2267*e71b7053SJung-uk Kimour \@ISA = qw(Exporter); 2268*e71b7053SJung-uk Kimour \@EXPORT = qw(\%config \%target \%disabled \%withargs \%unified_info \@disablables); 2269*e71b7053SJung-uk Kim 2270*e71b7053SJung-uk KimEOF 2271*e71b7053SJung-uk Kimprint OUT "our %config = (\n"; 2272*e71b7053SJung-uk Kimforeach (sort keys %config) { 2273*e71b7053SJung-uk Kim if (ref($config{$_}) eq "ARRAY") { 2274*e71b7053SJung-uk Kim print OUT " ", $_, " => [ ", join(", ", 2275*e71b7053SJung-uk Kim map { quotify("perl", $_) } 2276*e71b7053SJung-uk Kim @{$config{$_}}), " ],\n"; 2277*e71b7053SJung-uk Kim } elsif (ref($config{$_}) eq "HASH") { 2278*e71b7053SJung-uk Kim print OUT " ", $_, " => {"; 2279*e71b7053SJung-uk Kim if (scalar keys %{$config{$_}} > 0) { 2280db522d3aSSimon L. B. Nielsen print OUT "\n"; 2281*e71b7053SJung-uk Kim foreach my $key (sort keys %{$config{$_}}) { 2282*e71b7053SJung-uk Kim print OUT " ", 2283*e71b7053SJung-uk Kim join(" => ", 2284*e71b7053SJung-uk Kim quotify("perl", $key), 2285*e71b7053SJung-uk Kim defined $config{$_}->{$key} 2286*e71b7053SJung-uk Kim ? quotify("perl", $config{$_}->{$key}) 2287*e71b7053SJung-uk Kim : "undef"); 2288*e71b7053SJung-uk Kim print OUT ",\n"; 22896a599222SSimon L. B. Nielsen } 2290*e71b7053SJung-uk Kim print OUT " "; 22916a599222SSimon L. B. Nielsen } 2292*e71b7053SJung-uk Kim print OUT "},\n"; 229374664626SKris Kennaway } else { 2294*e71b7053SJung-uk Kim print OUT " ", $_, " => ", quotify("perl", $config{$_}), ",\n" 2295ed7112f0SJung-uk Kim } 2296*e71b7053SJung-uk Kim} 2297*e71b7053SJung-uk Kimprint OUT <<"EOF"; 2298*e71b7053SJung-uk Kim); 2299*e71b7053SJung-uk Kim 2300*e71b7053SJung-uk KimEOF 2301*e71b7053SJung-uk Kimprint OUT "our %target = (\n"; 2302*e71b7053SJung-uk Kimforeach (sort keys %target) { 2303*e71b7053SJung-uk Kim if (ref($target{$_}) eq "ARRAY") { 2304*e71b7053SJung-uk Kim print OUT " ", $_, " => [ ", join(", ", 2305*e71b7053SJung-uk Kim map { quotify("perl", $_) } 2306*e71b7053SJung-uk Kim @{$target{$_}}), " ],\n"; 230774664626SKris Kennaway } else { 2308*e71b7053SJung-uk Kim print OUT " ", $_, " => ", quotify("perl", $target{$_}), ",\n" 230974664626SKris Kennaway } 2310*e71b7053SJung-uk Kim} 2311*e71b7053SJung-uk Kimprint OUT <<"EOF"; 2312*e71b7053SJung-uk Kim); 2313*e71b7053SJung-uk Kim 2314*e71b7053SJung-uk KimEOF 2315*e71b7053SJung-uk Kimprint OUT "our \%available_protocols = (\n"; 2316*e71b7053SJung-uk Kimprint OUT " tls => [ ", join(", ", map { quotify("perl", $_) } @tls), " ],\n"; 2317*e71b7053SJung-uk Kimprint OUT " dtls => [ ", join(", ", map { quotify("perl", $_) } @dtls), " ],\n"; 2318*e71b7053SJung-uk Kimprint OUT <<"EOF"; 2319*e71b7053SJung-uk Kim); 2320*e71b7053SJung-uk Kim 2321*e71b7053SJung-uk KimEOF 2322*e71b7053SJung-uk Kimprint OUT "our \@disablables = (\n"; 2323*e71b7053SJung-uk Kimforeach (@disablables) { 2324*e71b7053SJung-uk Kim print OUT " ", quotify("perl", $_), ",\n"; 2325*e71b7053SJung-uk Kim} 2326*e71b7053SJung-uk Kimprint OUT <<"EOF"; 2327*e71b7053SJung-uk Kim); 2328*e71b7053SJung-uk Kim 2329*e71b7053SJung-uk KimEOF 2330*e71b7053SJung-uk Kimprint OUT "our \%disabled = (\n"; 2331*e71b7053SJung-uk Kimforeach (sort keys %disabled) { 2332*e71b7053SJung-uk Kim print OUT " ", quotify("perl", $_), " => ", quotify("perl", $disabled{$_}), ",\n"; 2333*e71b7053SJung-uk Kim} 2334*e71b7053SJung-uk Kimprint OUT <<"EOF"; 2335*e71b7053SJung-uk Kim); 2336*e71b7053SJung-uk Kim 2337*e71b7053SJung-uk KimEOF 2338*e71b7053SJung-uk Kimprint OUT "our %withargs = (\n"; 2339*e71b7053SJung-uk Kimforeach (sort keys %withargs) { 2340*e71b7053SJung-uk Kim if (ref($withargs{$_}) eq "ARRAY") { 2341*e71b7053SJung-uk Kim print OUT " ", $_, " => [ ", join(", ", 2342*e71b7053SJung-uk Kim map { quotify("perl", $_) } 2343*e71b7053SJung-uk Kim @{$withargs{$_}}), " ],\n"; 2344*e71b7053SJung-uk Kim } else { 2345*e71b7053SJung-uk Kim print OUT " ", $_, " => ", quotify("perl", $withargs{$_}), ",\n" 2346*e71b7053SJung-uk Kim } 2347*e71b7053SJung-uk Kim} 2348*e71b7053SJung-uk Kimprint OUT <<"EOF"; 2349*e71b7053SJung-uk Kim); 2350*e71b7053SJung-uk Kim 2351*e71b7053SJung-uk KimEOF 2352*e71b7053SJung-uk Kimif ($builder eq "unified") { 2353*e71b7053SJung-uk Kim my $recurse; 2354*e71b7053SJung-uk Kim $recurse = sub { 2355*e71b7053SJung-uk Kim my $indent = shift; 2356*e71b7053SJung-uk Kim foreach (@_) { 2357*e71b7053SJung-uk Kim if (ref $_ eq "ARRAY") { 2358*e71b7053SJung-uk Kim print OUT " "x$indent, "[\n"; 2359*e71b7053SJung-uk Kim foreach (@$_) { 2360*e71b7053SJung-uk Kim $recurse->($indent + 4, $_); 2361*e71b7053SJung-uk Kim } 2362*e71b7053SJung-uk Kim print OUT " "x$indent, "],\n"; 2363*e71b7053SJung-uk Kim } elsif (ref $_ eq "HASH") { 2364*e71b7053SJung-uk Kim my %h = %$_; 2365*e71b7053SJung-uk Kim print OUT " "x$indent, "{\n"; 2366*e71b7053SJung-uk Kim foreach (sort keys %h) { 2367*e71b7053SJung-uk Kim if (ref $h{$_} eq "") { 2368*e71b7053SJung-uk Kim print OUT " "x($indent + 4), quotify("perl", $_), " => ", quotify("perl", $h{$_}), ",\n"; 2369*e71b7053SJung-uk Kim } else { 2370*e71b7053SJung-uk Kim print OUT " "x($indent + 4), quotify("perl", $_), " =>\n"; 2371*e71b7053SJung-uk Kim $recurse->($indent + 8, $h{$_}); 2372*e71b7053SJung-uk Kim } 2373*e71b7053SJung-uk Kim } 2374*e71b7053SJung-uk Kim print OUT " "x$indent, "},\n"; 2375*e71b7053SJung-uk Kim } else { 2376*e71b7053SJung-uk Kim print OUT " "x$indent, quotify("perl", $_), ",\n"; 2377*e71b7053SJung-uk Kim } 2378*e71b7053SJung-uk Kim } 2379*e71b7053SJung-uk Kim }; 2380*e71b7053SJung-uk Kim print OUT "our %unified_info = (\n"; 2381*e71b7053SJung-uk Kim foreach (sort keys %unified_info) { 2382*e71b7053SJung-uk Kim if (ref $unified_info{$_} eq "") { 2383*e71b7053SJung-uk Kim print OUT " "x4, quotify("perl", $_), " => ", quotify("perl", $unified_info{$_}), ",\n"; 2384*e71b7053SJung-uk Kim } else { 2385*e71b7053SJung-uk Kim print OUT " "x4, quotify("perl", $_), " =>\n"; 2386*e71b7053SJung-uk Kim $recurse->(8, $unified_info{$_}); 2387*e71b7053SJung-uk Kim } 2388*e71b7053SJung-uk Kim } 2389*e71b7053SJung-uk Kim print OUT <<"EOF"; 2390*e71b7053SJung-uk Kim); 2391*e71b7053SJung-uk Kim 2392*e71b7053SJung-uk KimEOF 2393*e71b7053SJung-uk Kim} 2394*e71b7053SJung-uk Kimprint OUT 2395*e71b7053SJung-uk Kim "# The following data is only used when this files is use as a script\n"; 2396*e71b7053SJung-uk Kimprint OUT "my \@makevars = (\n"; 2397*e71b7053SJung-uk Kimforeach (sort keys %user) { 2398*e71b7053SJung-uk Kim print OUT " '",$_,"',\n"; 2399*e71b7053SJung-uk Kim} 2400*e71b7053SJung-uk Kimprint OUT ");\n"; 2401*e71b7053SJung-uk Kimprint OUT "my \%disabled_info = (\n"; 2402*e71b7053SJung-uk Kimforeach my $what (sort keys %disabled_info) { 2403*e71b7053SJung-uk Kim print OUT " '$what' => {\n"; 2404*e71b7053SJung-uk Kim foreach my $info (sort keys %{$disabled_info{$what}}) { 2405*e71b7053SJung-uk Kim if (ref $disabled_info{$what}->{$info} eq 'ARRAY') { 2406*e71b7053SJung-uk Kim print OUT " $info => [ ", 2407*e71b7053SJung-uk Kim join(', ', map { "'$_'" } @{$disabled_info{$what}->{$info}}), 2408*e71b7053SJung-uk Kim " ],\n"; 2409*e71b7053SJung-uk Kim } else { 2410*e71b7053SJung-uk Kim print OUT " $info => '", $disabled_info{$what}->{$info}, 2411*e71b7053SJung-uk Kim "',\n"; 2412*e71b7053SJung-uk Kim } 2413*e71b7053SJung-uk Kim } 2414*e71b7053SJung-uk Kim print OUT " },\n"; 2415*e71b7053SJung-uk Kim} 2416*e71b7053SJung-uk Kimprint OUT ");\n"; 2417*e71b7053SJung-uk Kimprint OUT 'my @user_crossable = qw( ', join (' ', @user_crossable), " );\n"; 2418*e71b7053SJung-uk Kimprint OUT << 'EOF'; 2419*e71b7053SJung-uk Kim# If run directly, we can give some answers, and even reconfigure 2420*e71b7053SJung-uk Kimunless (caller) { 2421*e71b7053SJung-uk Kim use Getopt::Long; 2422*e71b7053SJung-uk Kim use File::Spec::Functions; 2423*e71b7053SJung-uk Kim use File::Basename; 2424*e71b7053SJung-uk Kim use Pod::Usage; 2425*e71b7053SJung-uk Kim 2426*e71b7053SJung-uk Kim my $here = dirname($0); 2427*e71b7053SJung-uk Kim 2428*e71b7053SJung-uk Kim my $dump = undef; 2429*e71b7053SJung-uk Kim my $cmdline = undef; 2430*e71b7053SJung-uk Kim my $options = undef; 2431*e71b7053SJung-uk Kim my $target = undef; 2432*e71b7053SJung-uk Kim my $envvars = undef; 2433*e71b7053SJung-uk Kim my $makevars = undef; 2434*e71b7053SJung-uk Kim my $buildparams = undef; 2435*e71b7053SJung-uk Kim my $reconf = undef; 2436*e71b7053SJung-uk Kim my $verbose = undef; 2437*e71b7053SJung-uk Kim my $help = undef; 2438*e71b7053SJung-uk Kim my $man = undef; 2439*e71b7053SJung-uk Kim GetOptions('dump|d' => \$dump, 2440*e71b7053SJung-uk Kim 'command-line|c' => \$cmdline, 2441*e71b7053SJung-uk Kim 'options|o' => \$options, 2442*e71b7053SJung-uk Kim 'target|t' => \$target, 2443*e71b7053SJung-uk Kim 'environment|e' => \$envvars, 2444*e71b7053SJung-uk Kim 'make-variables|m' => \$makevars, 2445*e71b7053SJung-uk Kim 'build-parameters|b' => \$buildparams, 2446*e71b7053SJung-uk Kim 'reconfigure|reconf|r' => \$reconf, 2447*e71b7053SJung-uk Kim 'verbose|v' => \$verbose, 2448*e71b7053SJung-uk Kim 'help' => \$help, 2449*e71b7053SJung-uk Kim 'man' => \$man) 2450*e71b7053SJung-uk Kim or die "Errors in command line arguments\n"; 2451*e71b7053SJung-uk Kim 2452*e71b7053SJung-uk Kim unless ($dump || $cmdline || $options || $target || $envvars || $makevars 2453*e71b7053SJung-uk Kim || $buildparams || $reconf || $verbose || $help || $man) { 2454*e71b7053SJung-uk Kim print STDERR <<"_____"; 2455*e71b7053SJung-uk KimYou must give at least one option. 2456*e71b7053SJung-uk KimFor more information, do '$0 --help' 2457*e71b7053SJung-uk Kim_____ 2458*e71b7053SJung-uk Kim exit(2); 2459*e71b7053SJung-uk Kim } 2460*e71b7053SJung-uk Kim 2461*e71b7053SJung-uk Kim if ($help) { 2462*e71b7053SJung-uk Kim pod2usage(-exitval => 0, 2463*e71b7053SJung-uk Kim -verbose => 1); 2464*e71b7053SJung-uk Kim } 2465*e71b7053SJung-uk Kim if ($man) { 2466*e71b7053SJung-uk Kim pod2usage(-exitval => 0, 2467*e71b7053SJung-uk Kim -verbose => 2); 2468*e71b7053SJung-uk Kim } 2469*e71b7053SJung-uk Kim if ($dump || $cmdline) { 2470*e71b7053SJung-uk Kim print "\nCommand line (with current working directory = $here):\n\n"; 2471*e71b7053SJung-uk Kim print ' ',join(' ', 2472*e71b7053SJung-uk Kim $config{PERL}, 2473*e71b7053SJung-uk Kim catfile($config{sourcedir}, 'Configure'), 2474*e71b7053SJung-uk Kim @{$config{perlargv}}), "\n"; 2475*e71b7053SJung-uk Kim print "\nPerl information:\n\n"; 2476*e71b7053SJung-uk Kim print ' ',$config{perl_cmd},"\n"; 2477*e71b7053SJung-uk Kim print ' ',$config{perl_version},' for ',$config{perl_archname},"\n"; 2478*e71b7053SJung-uk Kim } 2479*e71b7053SJung-uk Kim if ($dump || $options) { 2480*e71b7053SJung-uk Kim my $longest = 0; 2481*e71b7053SJung-uk Kim my $longest2 = 0; 2482*e71b7053SJung-uk Kim foreach my $what (@disablables) { 2483*e71b7053SJung-uk Kim $longest = length($what) if $longest < length($what); 2484*e71b7053SJung-uk Kim $longest2 = length($disabled{$what}) 2485*e71b7053SJung-uk Kim if $disabled{$what} && $longest2 < length($disabled{$what}); 2486*e71b7053SJung-uk Kim } 2487*e71b7053SJung-uk Kim print "\nEnabled features:\n\n"; 2488*e71b7053SJung-uk Kim foreach my $what (@disablables) { 2489*e71b7053SJung-uk Kim print " $what\n" unless $disabled{$what}; 2490*e71b7053SJung-uk Kim } 2491*e71b7053SJung-uk Kim print "\nDisabled features:\n\n"; 2492*e71b7053SJung-uk Kim foreach my $what (@disablables) { 2493*e71b7053SJung-uk Kim if ($disabled{$what}) { 2494*e71b7053SJung-uk Kim print " $what", ' ' x ($longest - length($what) + 1), 2495*e71b7053SJung-uk Kim "[$disabled{$what}]", ' ' x ($longest2 - length($disabled{$what}) + 1); 2496*e71b7053SJung-uk Kim print $disabled_info{$what}->{macro} 2497*e71b7053SJung-uk Kim if $disabled_info{$what}->{macro}; 2498*e71b7053SJung-uk Kim print ' (skip ', 2499*e71b7053SJung-uk Kim join(', ', @{$disabled_info{$what}->{skipped}}), 2500*e71b7053SJung-uk Kim ')' 2501*e71b7053SJung-uk Kim if $disabled_info{$what}->{skipped}; 2502*e71b7053SJung-uk Kim print "\n"; 2503*e71b7053SJung-uk Kim } 2504*e71b7053SJung-uk Kim } 2505*e71b7053SJung-uk Kim } 2506*e71b7053SJung-uk Kim if ($dump || $target) { 2507*e71b7053SJung-uk Kim print "\nConfig target attributes:\n\n"; 2508*e71b7053SJung-uk Kim foreach (sort keys %target) { 2509*e71b7053SJung-uk Kim next if $_ =~ m|^_| || $_ eq 'template'; 2510*e71b7053SJung-uk Kim my $quotify = sub { 2511*e71b7053SJung-uk Kim map { (my $x = $_) =~ s|([\\\$\@"])|\\$1|g; "\"$x\""} @_; 2512*e71b7053SJung-uk Kim }; 2513*e71b7053SJung-uk Kim print ' ', $_, ' => '; 2514*e71b7053SJung-uk Kim if (ref($target{$_}) eq "ARRAY") { 2515*e71b7053SJung-uk Kim print '[ ', join(', ', $quotify->(@{$target{$_}})), " ],\n"; 2516*e71b7053SJung-uk Kim } else { 2517*e71b7053SJung-uk Kim print $quotify->($target{$_}), ",\n" 2518*e71b7053SJung-uk Kim } 2519*e71b7053SJung-uk Kim } 2520*e71b7053SJung-uk Kim } 2521*e71b7053SJung-uk Kim if ($dump || $envvars) { 2522*e71b7053SJung-uk Kim print "\nRecorded environment:\n\n"; 2523*e71b7053SJung-uk Kim foreach (sort keys %{$config{perlenv}}) { 2524*e71b7053SJung-uk Kim print ' ',$_,' = ',($config{perlenv}->{$_} || ''),"\n"; 2525*e71b7053SJung-uk Kim } 2526*e71b7053SJung-uk Kim } 2527*e71b7053SJung-uk Kim if ($dump || $makevars) { 2528*e71b7053SJung-uk Kim print "\nMakevars:\n\n"; 2529*e71b7053SJung-uk Kim foreach my $var (@makevars) { 2530*e71b7053SJung-uk Kim my $prefix = ''; 2531*e71b7053SJung-uk Kim $prefix = $config{CROSS_COMPILE} 2532*e71b7053SJung-uk Kim if grep { $var eq $_ } @user_crossable; 2533*e71b7053SJung-uk Kim $prefix //= ''; 2534*e71b7053SJung-uk Kim print ' ',$var,' ' x (16 - length $var),'= ', 2535*e71b7053SJung-uk Kim (ref $config{$var} eq 'ARRAY' 2536*e71b7053SJung-uk Kim ? join(' ', @{$config{$var}}) 2537*e71b7053SJung-uk Kim : $prefix.$config{$var}), 2538*e71b7053SJung-uk Kim "\n" 2539*e71b7053SJung-uk Kim if defined $config{$var}; 2540*e71b7053SJung-uk Kim } 2541*e71b7053SJung-uk Kim 2542*e71b7053SJung-uk Kim my @buildfile = ($config{builddir}, $config{build_file}); 2543*e71b7053SJung-uk Kim unshift @buildfile, $here 2544*e71b7053SJung-uk Kim unless file_name_is_absolute($config{builddir}); 2545*e71b7053SJung-uk Kim my $buildfile = canonpath(catdir(@buildfile)); 2546*e71b7053SJung-uk Kim print <<"_____"; 2547*e71b7053SJung-uk Kim 2548*e71b7053SJung-uk KimNOTE: These variables only represent the configuration view. The build file 2549*e71b7053SJung-uk Kimtemplate may have processed these variables further, please have a look at the 2550*e71b7053SJung-uk Kimbuild file for more exact data: 2551*e71b7053SJung-uk Kim $buildfile 2552*e71b7053SJung-uk Kim_____ 2553*e71b7053SJung-uk Kim } 2554*e71b7053SJung-uk Kim if ($dump || $buildparams) { 2555*e71b7053SJung-uk Kim my @buildfile = ($config{builddir}, $config{build_file}); 2556*e71b7053SJung-uk Kim unshift @buildfile, $here 2557*e71b7053SJung-uk Kim unless file_name_is_absolute($config{builddir}); 2558*e71b7053SJung-uk Kim print "\nbuild file:\n\n"; 2559*e71b7053SJung-uk Kim print " ", canonpath(catfile(@buildfile)),"\n"; 2560*e71b7053SJung-uk Kim 2561*e71b7053SJung-uk Kim print "\nbuild file templates:\n\n"; 2562*e71b7053SJung-uk Kim foreach (@{$config{build_file_templates}}) { 2563*e71b7053SJung-uk Kim my @tmpl = ($_); 2564*e71b7053SJung-uk Kim unshift @tmpl, $here 2565*e71b7053SJung-uk Kim unless file_name_is_absolute($config{sourcedir}); 2566*e71b7053SJung-uk Kim print ' ',canonpath(catfile(@tmpl)),"\n"; 2567*e71b7053SJung-uk Kim } 2568*e71b7053SJung-uk Kim } 2569*e71b7053SJung-uk Kim if ($reconf) { 2570*e71b7053SJung-uk Kim if ($verbose) { 2571*e71b7053SJung-uk Kim print 'Reconfiguring with: ', join(' ',@{$config{perlargv}}), "\n"; 2572*e71b7053SJung-uk Kim foreach (sort keys %{$config{perlenv}}) { 2573*e71b7053SJung-uk Kim print ' ',$_,' = ',($config{perlenv}->{$_} || ""),"\n"; 25745c87c606SMark Murray } 257574664626SKris Kennaway } 257674664626SKris Kennaway 2577*e71b7053SJung-uk Kim chdir $here; 2578*e71b7053SJung-uk Kim exec $^X,catfile($config{sourcedir}, 'Configure'),'reconf'; 25793b4e3dcbSSimon L. B. Nielsen } 2580*e71b7053SJung-uk Kim} 25813b4e3dcbSSimon L. B. Nielsen 2582*e71b7053SJung-uk Kim1; 25833b4e3dcbSSimon L. B. Nielsen 2584*e71b7053SJung-uk Kim__END__ 2585*e71b7053SJung-uk Kim 2586*e71b7053SJung-uk Kim=head1 NAME 2587*e71b7053SJung-uk Kim 2588*e71b7053SJung-uk Kimconfigdata.pm - configuration data for OpenSSL builds 2589*e71b7053SJung-uk Kim 2590*e71b7053SJung-uk Kim=head1 SYNOPSIS 2591*e71b7053SJung-uk Kim 2592*e71b7053SJung-uk KimInteractive: 2593*e71b7053SJung-uk Kim 2594*e71b7053SJung-uk Kim perl configdata.pm [options] 2595*e71b7053SJung-uk Kim 2596*e71b7053SJung-uk KimAs data bank module: 2597*e71b7053SJung-uk Kim 2598*e71b7053SJung-uk Kim use configdata; 2599*e71b7053SJung-uk Kim 2600*e71b7053SJung-uk Kim=head1 DESCRIPTION 2601*e71b7053SJung-uk Kim 2602*e71b7053SJung-uk KimThis module can be used in two modes, interactively and as a module containing 2603*e71b7053SJung-uk Kimall the data recorded by OpenSSL's Configure script. 2604*e71b7053SJung-uk Kim 2605*e71b7053SJung-uk KimWhen used interactively, simply run it as any perl script, with at least one 2606*e71b7053SJung-uk Kimoption, and you will get the information you ask for. See L</OPTIONS> below. 2607*e71b7053SJung-uk Kim 2608*e71b7053SJung-uk KimWhen loaded as a module, you get a few databanks with useful information to 2609*e71b7053SJung-uk Kimperform build related tasks. The databanks are: 2610*e71b7053SJung-uk Kim 2611*e71b7053SJung-uk Kim %config Configured things. 2612*e71b7053SJung-uk Kim %target The OpenSSL config target with all inheritances 2613*e71b7053SJung-uk Kim resolved. 2614*e71b7053SJung-uk Kim %disabled The features that are disabled. 2615*e71b7053SJung-uk Kim @disablables The list of features that can be disabled. 2616*e71b7053SJung-uk Kim %withargs All data given through --with-THING options. 2617*e71b7053SJung-uk Kim %unified_info All information that was computed from the build.info 2618*e71b7053SJung-uk Kim files. 2619*e71b7053SJung-uk Kim 2620*e71b7053SJung-uk Kim=head1 OPTIONS 2621*e71b7053SJung-uk Kim 2622*e71b7053SJung-uk Kim=over 4 2623*e71b7053SJung-uk Kim 2624*e71b7053SJung-uk Kim=item B<--help> 2625*e71b7053SJung-uk Kim 2626*e71b7053SJung-uk KimPrint a brief help message and exit. 2627*e71b7053SJung-uk Kim 2628*e71b7053SJung-uk Kim=item B<--man> 2629*e71b7053SJung-uk Kim 2630*e71b7053SJung-uk KimPrint the manual page and exit. 2631*e71b7053SJung-uk Kim 2632*e71b7053SJung-uk Kim=item B<--dump> | B<-d> 2633*e71b7053SJung-uk Kim 2634*e71b7053SJung-uk KimPrint all relevant configuration data. This is equivalent to B<--command-line> 2635*e71b7053SJung-uk KimB<--options> B<--target> B<--environment> B<--make-variables> 2636*e71b7053SJung-uk KimB<--build-parameters>. 2637*e71b7053SJung-uk Kim 2638*e71b7053SJung-uk Kim=item B<--command-line> | B<-c> 2639*e71b7053SJung-uk Kim 2640*e71b7053SJung-uk KimPrint the current configuration command line. 2641*e71b7053SJung-uk Kim 2642*e71b7053SJung-uk Kim=item B<--options> | B<-o> 2643*e71b7053SJung-uk Kim 2644*e71b7053SJung-uk KimPrint the features, both enabled and disabled, and display defined macro and 2645*e71b7053SJung-uk Kimskipped directories where applicable. 2646*e71b7053SJung-uk Kim 2647*e71b7053SJung-uk Kim=item B<--target> | B<-t> 2648*e71b7053SJung-uk Kim 2649*e71b7053SJung-uk KimPrint the config attributes for this config target. 2650*e71b7053SJung-uk Kim 2651*e71b7053SJung-uk Kim=item B<--environment> | B<-e> 2652*e71b7053SJung-uk Kim 2653*e71b7053SJung-uk KimPrint the environment variables and their values at the time of configuration. 2654*e71b7053SJung-uk Kim 2655*e71b7053SJung-uk Kim=item B<--make-variables> | B<-m> 2656*e71b7053SJung-uk Kim 2657*e71b7053SJung-uk KimPrint the main make variables generated in the current configuration 2658*e71b7053SJung-uk Kim 2659*e71b7053SJung-uk Kim=item B<--build-parameters> | B<-b> 2660*e71b7053SJung-uk Kim 2661*e71b7053SJung-uk KimPrint the build parameters, i.e. build file and build file templates. 2662*e71b7053SJung-uk Kim 2663*e71b7053SJung-uk Kim=item B<--reconfigure> | B<--reconf> | B<-r> 2664*e71b7053SJung-uk Kim 2665*e71b7053SJung-uk KimRedo the configuration. 2666*e71b7053SJung-uk Kim 2667*e71b7053SJung-uk Kim=item B<--verbose> | B<-v> 2668*e71b7053SJung-uk Kim 2669*e71b7053SJung-uk KimVerbose output. 2670*e71b7053SJung-uk Kim 2671*e71b7053SJung-uk Kim=back 2672*e71b7053SJung-uk Kim 2673*e71b7053SJung-uk Kim=cut 2674*e71b7053SJung-uk Kim 26753b4e3dcbSSimon L. B. NielsenEOF 26763b4e3dcbSSimon L. B. Nielsenclose(OUT); 2677*e71b7053SJung-uk Kimif ($builder_platform eq 'unix') { 2678*e71b7053SJung-uk Kim my $mode = (0755 & ~umask); 2679*e71b7053SJung-uk Kim chmod $mode, 'configdata.pm' 2680*e71b7053SJung-uk Kim or warn sprintf("WARNING: Couldn't change mode for 'configdata.pm' to 0%03o: %s\n",$mode,$!); 26813b4e3dcbSSimon L. B. Nielsen} 26823b4e3dcbSSimon L. B. Nielsen 2683*e71b7053SJung-uk Kimmy %builders = ( 2684*e71b7053SJung-uk Kim unified => sub { 2685*e71b7053SJung-uk Kim print 'Creating ',$target{build_file},"\n"; 2686*e71b7053SJung-uk Kim run_dofile(catfile($blddir, $target{build_file}), 2687*e71b7053SJung-uk Kim @{$config{build_file_templates}}); 2688*e71b7053SJung-uk Kim }, 2689*e71b7053SJung-uk Kim ); 269074664626SKris Kennaway 2691*e71b7053SJung-uk Kim$builders{$builder}->($builder_platform, @builder_opts); 269274664626SKris Kennaway 2693*e71b7053SJung-uk Kim$SIG{__DIE__} = $orig_death_handler; 2694*e71b7053SJung-uk Kim 2695*e71b7053SJung-uk Kimprint <<"EOF" if ($disabled{threads} eq "unavailable"); 269674664626SKris Kennaway 269774664626SKris KennawayThe library could not be configured for supporting multi-threaded 269874664626SKris Kennawayapplications as the compiler options required on this system are not known. 269974664626SKris KennawaySee file INSTALL for details if you need multi-threading. 270074664626SKris KennawayEOF 270174664626SKris Kennaway 2702*e71b7053SJung-uk Kimprint <<"EOF" if ($no_shared_warn); 2703fceca8a3SJacques Vidrine 2704*e71b7053SJung-uk KimThe options 'shared', 'pic' and 'dynamic-engine' aren't supported on this 2705*e71b7053SJung-uk Kimplatform, so we will pretend you gave the option 'no-pic', which also disables 2706*e71b7053SJung-uk Kim'shared' and 'dynamic-engine'. If you know how to implement shared libraries 2707*e71b7053SJung-uk Kimor position independent code, please let us know (but please first make sure 2708*e71b7053SJung-uk Kimyou have tried with a current version of OpenSSL). 27098180e704SJung-uk KimEOF 27108180e704SJung-uk Kim 2711*e71b7053SJung-uk Kimprint <<"EOF"; 27128180e704SJung-uk Kim 2713*e71b7053SJung-uk Kim********************************************************************** 2714*e71b7053SJung-uk Kim*** *** 2715*e71b7053SJung-uk Kim*** If you want to report a building issue, please include the *** 2716*e71b7053SJung-uk Kim*** output from this command: *** 2717*e71b7053SJung-uk Kim*** *** 2718*e71b7053SJung-uk Kim*** perl configdata.pm --dump *** 2719*e71b7053SJung-uk Kim*** *** 2720*e71b7053SJung-uk Kim********************************************************************** 2721fceca8a3SJacques VidrineEOF 2722fceca8a3SJacques Vidrine 272374664626SKris Kennawayexit(0); 272474664626SKris Kennaway 2725*e71b7053SJung-uk Kim###################################################################### 2726*e71b7053SJung-uk Kim# 2727*e71b7053SJung-uk Kim# Helpers and utility functions 2728*e71b7053SJung-uk Kim# 2729*e71b7053SJung-uk Kim 2730*e71b7053SJung-uk Kim# Death handler, to print a helpful message in case of failure ####### 2731*e71b7053SJung-uk Kim# 2732*e71b7053SJung-uk Kimsub death_handler { 2733*e71b7053SJung-uk Kim die @_ if $^S; # To prevent the added message in eval blocks 2734*e71b7053SJung-uk Kim my $build_file = $target{build_file} // "build file"; 2735*e71b7053SJung-uk Kim my @message = ( <<"_____", @_ ); 2736*e71b7053SJung-uk Kim 2737*e71b7053SJung-uk KimFailure! $build_file wasn't produced. 2738*e71b7053SJung-uk KimPlease read INSTALL and associated NOTES files. You may also have to look over 2739*e71b7053SJung-uk Kimyour available compiler tool chain or change your configuration. 2740*e71b7053SJung-uk Kim 2741*e71b7053SJung-uk Kim_____ 2742*e71b7053SJung-uk Kim 2743*e71b7053SJung-uk Kim # Dying is terminal, so it's ok to reset the signal handler here. 2744*e71b7053SJung-uk Kim $SIG{__DIE__} = $orig_death_handler; 2745*e71b7053SJung-uk Kim die @message; 2746*e71b7053SJung-uk Kim} 2747*e71b7053SJung-uk Kim 2748*e71b7053SJung-uk Kim# Configuration file reading ######################################### 2749*e71b7053SJung-uk Kim 2750*e71b7053SJung-uk Kim# Note: All of the helper functions are for lazy evaluation. They all 2751*e71b7053SJung-uk Kim# return a CODE ref, which will return the intended value when evaluated. 2752*e71b7053SJung-uk Kim# Thus, whenever there's mention of a returned value, it's about that 2753*e71b7053SJung-uk Kim# intended value. 2754*e71b7053SJung-uk Kim 2755*e71b7053SJung-uk Kim# Helper function to implement conditional inheritance depending on the 2756*e71b7053SJung-uk Kim# value of $disabled{asm}. Used in inherit_from values as follows: 2757*e71b7053SJung-uk Kim# 2758*e71b7053SJung-uk Kim# inherit_from => [ "template", asm("asm_tmpl") ] 2759*e71b7053SJung-uk Kim# 2760*e71b7053SJung-uk Kimsub asm { 2761*e71b7053SJung-uk Kim my @x = @_; 2762*e71b7053SJung-uk Kim sub { 2763*e71b7053SJung-uk Kim $disabled{asm} ? () : @x; 2764*e71b7053SJung-uk Kim } 2765*e71b7053SJung-uk Kim} 2766*e71b7053SJung-uk Kim 2767*e71b7053SJung-uk Kim# Helper function to implement conditional value variants, with a default 2768*e71b7053SJung-uk Kim# plus additional values based on the value of $config{build_type}. 2769*e71b7053SJung-uk Kim# Arguments are given in hash table form: 2770*e71b7053SJung-uk Kim# 2771*e71b7053SJung-uk Kim# picker(default => "Basic string: ", 2772*e71b7053SJung-uk Kim# debug => "debug", 2773*e71b7053SJung-uk Kim# release => "release") 2774*e71b7053SJung-uk Kim# 2775*e71b7053SJung-uk Kim# When configuring with --debug, the resulting string will be 2776*e71b7053SJung-uk Kim# "Basic string: debug", and when not, it will be "Basic string: release" 2777*e71b7053SJung-uk Kim# 2778*e71b7053SJung-uk Kim# This can be used to create variants of sets of flags according to the 2779*e71b7053SJung-uk Kim# build type: 2780*e71b7053SJung-uk Kim# 2781*e71b7053SJung-uk Kim# cflags => picker(default => "-Wall", 2782*e71b7053SJung-uk Kim# debug => "-g -O0", 2783*e71b7053SJung-uk Kim# release => "-O3") 2784*e71b7053SJung-uk Kim# 2785*e71b7053SJung-uk Kimsub picker { 2786*e71b7053SJung-uk Kim my %opts = @_; 2787*e71b7053SJung-uk Kim return sub { add($opts{default} || (), 2788*e71b7053SJung-uk Kim $opts{$config{build_type}} || ())->(); } 2789*e71b7053SJung-uk Kim} 2790*e71b7053SJung-uk Kim 2791*e71b7053SJung-uk Kim# Helper function to combine several values of different types into one. 2792*e71b7053SJung-uk Kim# This is useful if you want to combine a string with the result of a 2793*e71b7053SJung-uk Kim# lazy function, such as: 2794*e71b7053SJung-uk Kim# 2795*e71b7053SJung-uk Kim# cflags => combine("-Wall", sub { $disabled{zlib} ? () : "-DZLIB" }) 2796*e71b7053SJung-uk Kim# 2797*e71b7053SJung-uk Kimsub combine { 2798*e71b7053SJung-uk Kim my @stuff = @_; 2799*e71b7053SJung-uk Kim return sub { add(@stuff)->(); } 2800*e71b7053SJung-uk Kim} 2801*e71b7053SJung-uk Kim 2802*e71b7053SJung-uk Kim# Helper function to implement conditional values depending on the value 2803*e71b7053SJung-uk Kim# of $disabled{threads}. Can be used as follows: 2804*e71b7053SJung-uk Kim# 2805*e71b7053SJung-uk Kim# cflags => combine("-Wall", threads("-pthread")) 2806*e71b7053SJung-uk Kim# 2807*e71b7053SJung-uk Kimsub threads { 2808*e71b7053SJung-uk Kim my @flags = @_; 2809*e71b7053SJung-uk Kim return sub { add($disabled{threads} ? () : @flags)->(); } 2810*e71b7053SJung-uk Kim} 2811*e71b7053SJung-uk Kim 2812*e71b7053SJung-uk Kimsub shared { 2813*e71b7053SJung-uk Kim my @flags = @_; 2814*e71b7053SJung-uk Kim return sub { add($disabled{shared} ? () : @flags)->(); } 2815*e71b7053SJung-uk Kim} 2816*e71b7053SJung-uk Kim 2817*e71b7053SJung-uk Kimour $add_called = 0; 2818*e71b7053SJung-uk Kim# Helper function to implement adding values to already existing configuration 2819*e71b7053SJung-uk Kim# values. It handles elements that are ARRAYs, CODEs and scalars 2820*e71b7053SJung-uk Kimsub _add { 2821*e71b7053SJung-uk Kim my $separator = shift; 2822*e71b7053SJung-uk Kim 2823*e71b7053SJung-uk Kim # If there's any ARRAY in the collection of values OR the separator 2824*e71b7053SJung-uk Kim # is undef, we will return an ARRAY of combined values, otherwise a 2825*e71b7053SJung-uk Kim # string of joined values with $separator as the separator. 2826*e71b7053SJung-uk Kim my $found_array = !defined($separator); 2827*e71b7053SJung-uk Kim 2828*e71b7053SJung-uk Kim my @values = 2829*e71b7053SJung-uk Kim map { 2830*e71b7053SJung-uk Kim my $res = $_; 2831*e71b7053SJung-uk Kim while (ref($res) eq "CODE") { 2832*e71b7053SJung-uk Kim $res = $res->(); 2833*e71b7053SJung-uk Kim } 2834*e71b7053SJung-uk Kim if (defined($res)) { 2835*e71b7053SJung-uk Kim if (ref($res) eq "ARRAY") { 2836*e71b7053SJung-uk Kim $found_array = 1; 2837*e71b7053SJung-uk Kim @$res; 2838*e71b7053SJung-uk Kim } else { 2839*e71b7053SJung-uk Kim $res; 2840*e71b7053SJung-uk Kim } 2841*e71b7053SJung-uk Kim } else { 2842*e71b7053SJung-uk Kim (); 2843*e71b7053SJung-uk Kim } 2844*e71b7053SJung-uk Kim } (@_); 2845*e71b7053SJung-uk Kim 2846*e71b7053SJung-uk Kim $add_called = 1; 2847*e71b7053SJung-uk Kim 2848*e71b7053SJung-uk Kim if ($found_array) { 2849*e71b7053SJung-uk Kim [ @values ]; 2850*e71b7053SJung-uk Kim } else { 2851*e71b7053SJung-uk Kim join($separator, grep { defined($_) && $_ ne "" } @values); 2852*e71b7053SJung-uk Kim } 2853*e71b7053SJung-uk Kim} 2854*e71b7053SJung-uk Kimsub add_before { 2855*e71b7053SJung-uk Kim my $separator = " "; 2856*e71b7053SJung-uk Kim if (ref($_[$#_]) eq "HASH") { 2857*e71b7053SJung-uk Kim my $opts = pop; 2858*e71b7053SJung-uk Kim $separator = $opts->{separator}; 2859*e71b7053SJung-uk Kim } 2860*e71b7053SJung-uk Kim my @x = @_; 2861*e71b7053SJung-uk Kim sub { _add($separator, @x, @_) }; 2862*e71b7053SJung-uk Kim} 2863*e71b7053SJung-uk Kimsub add { 2864*e71b7053SJung-uk Kim my $separator = " "; 2865*e71b7053SJung-uk Kim if (ref($_[$#_]) eq "HASH") { 2866*e71b7053SJung-uk Kim my $opts = pop; 2867*e71b7053SJung-uk Kim $separator = $opts->{separator}; 2868*e71b7053SJung-uk Kim } 2869*e71b7053SJung-uk Kim my @x = @_; 2870*e71b7053SJung-uk Kim sub { _add($separator, @_, @x) }; 2871*e71b7053SJung-uk Kim} 2872*e71b7053SJung-uk Kim 2873*e71b7053SJung-uk Kimsub read_eval_file { 2874*e71b7053SJung-uk Kim my $fname = shift; 2875*e71b7053SJung-uk Kim my $content; 2876*e71b7053SJung-uk Kim my @result; 2877*e71b7053SJung-uk Kim 2878*e71b7053SJung-uk Kim open F, "< $fname" or die "Can't open '$fname': $!\n"; 2879*e71b7053SJung-uk Kim { 2880*e71b7053SJung-uk Kim undef local $/; 2881*e71b7053SJung-uk Kim $content = <F>; 2882*e71b7053SJung-uk Kim } 2883*e71b7053SJung-uk Kim close F; 2884*e71b7053SJung-uk Kim { 2885*e71b7053SJung-uk Kim local $@; 2886*e71b7053SJung-uk Kim 2887*e71b7053SJung-uk Kim @result = ( eval $content ); 2888*e71b7053SJung-uk Kim warn $@ if $@; 2889*e71b7053SJung-uk Kim } 2890*e71b7053SJung-uk Kim return wantarray ? @result : $result[0]; 2891*e71b7053SJung-uk Kim} 2892*e71b7053SJung-uk Kim 2893*e71b7053SJung-uk Kim# configuration reader, evaluates the input file as a perl script and expects 2894*e71b7053SJung-uk Kim# it to fill %targets with target configurations. Those are then added to 2895*e71b7053SJung-uk Kim# %table. 2896*e71b7053SJung-uk Kimsub read_config { 2897*e71b7053SJung-uk Kim my $fname = shift; 2898*e71b7053SJung-uk Kim my %targets; 2899*e71b7053SJung-uk Kim 2900*e71b7053SJung-uk Kim { 2901*e71b7053SJung-uk Kim # Protect certain tables from tampering 2902*e71b7053SJung-uk Kim local %table = (); 2903*e71b7053SJung-uk Kim 2904*e71b7053SJung-uk Kim %targets = read_eval_file($fname); 2905*e71b7053SJung-uk Kim } 2906*e71b7053SJung-uk Kim my %preexisting = (); 2907*e71b7053SJung-uk Kim foreach (sort keys %targets) { 2908*e71b7053SJung-uk Kim $preexisting{$_} = 1 if $table{$_}; 2909*e71b7053SJung-uk Kim } 2910*e71b7053SJung-uk Kim die <<"EOF", 2911*e71b7053SJung-uk KimThe following config targets from $fname 2912*e71b7053SJung-uk Kimshadow pre-existing config targets with the same name: 2913*e71b7053SJung-uk KimEOF 2914*e71b7053SJung-uk Kim map { " $_\n" } sort keys %preexisting 2915*e71b7053SJung-uk Kim if %preexisting; 2916*e71b7053SJung-uk Kim 2917*e71b7053SJung-uk Kim 2918*e71b7053SJung-uk Kim # For each target, check that it's configured with a hash table. 2919*e71b7053SJung-uk Kim foreach (keys %targets) { 2920*e71b7053SJung-uk Kim if (ref($targets{$_}) ne "HASH") { 2921*e71b7053SJung-uk Kim if (ref($targets{$_}) eq "") { 2922*e71b7053SJung-uk Kim warn "Deprecated target configuration for $_, ignoring...\n"; 2923*e71b7053SJung-uk Kim } else { 2924*e71b7053SJung-uk Kim warn "Misconfigured target configuration for $_ (should be a hash table), ignoring...\n"; 2925*e71b7053SJung-uk Kim } 2926*e71b7053SJung-uk Kim delete $targets{$_}; 2927*e71b7053SJung-uk Kim } else { 2928*e71b7053SJung-uk Kim $targets{$_}->{_conf_fname_int} = add([ $fname ]); 2929*e71b7053SJung-uk Kim } 2930*e71b7053SJung-uk Kim } 2931*e71b7053SJung-uk Kim 2932*e71b7053SJung-uk Kim %table = (%table, %targets); 2933*e71b7053SJung-uk Kim 2934*e71b7053SJung-uk Kim} 2935*e71b7053SJung-uk Kim 2936*e71b7053SJung-uk Kim# configuration resolver. Will only resolve all the lazy evaluation 2937*e71b7053SJung-uk Kim# codeblocks for the chosen target and all those it inherits from, 2938*e71b7053SJung-uk Kim# recursively 2939*e71b7053SJung-uk Kimsub resolve_config { 2940*e71b7053SJung-uk Kim my $target = shift; 2941*e71b7053SJung-uk Kim my @breadcrumbs = @_; 2942*e71b7053SJung-uk Kim 2943*e71b7053SJung-uk Kim# my $extra_checks = defined($ENV{CONFIGURE_EXTRA_CHECKS}); 2944*e71b7053SJung-uk Kim 2945*e71b7053SJung-uk Kim if (grep { $_ eq $target } @breadcrumbs) { 2946*e71b7053SJung-uk Kim die "inherit_from loop! target backtrace:\n " 2947*e71b7053SJung-uk Kim ,$target,"\n ",join("\n ", @breadcrumbs),"\n"; 2948*e71b7053SJung-uk Kim } 2949*e71b7053SJung-uk Kim 2950*e71b7053SJung-uk Kim if (!defined($table{$target})) { 2951*e71b7053SJung-uk Kim warn "Warning! target $target doesn't exist!\n"; 2952*e71b7053SJung-uk Kim return (); 2953*e71b7053SJung-uk Kim } 2954*e71b7053SJung-uk Kim # Recurse through all inheritances. They will be resolved on the 2955*e71b7053SJung-uk Kim # fly, so when this operation is done, they will all just be a 2956*e71b7053SJung-uk Kim # bunch of attributes with string values. 2957*e71b7053SJung-uk Kim # What we get here, though, are keys with references to lists of 2958*e71b7053SJung-uk Kim # the combined values of them all. We will deal with lists after 2959*e71b7053SJung-uk Kim # this stage is done. 2960*e71b7053SJung-uk Kim my %combined_inheritance = (); 2961*e71b7053SJung-uk Kim if ($table{$target}->{inherit_from}) { 2962*e71b7053SJung-uk Kim my @inherit_from = 2963*e71b7053SJung-uk Kim map { ref($_) eq "CODE" ? $_->() : $_ } @{$table{$target}->{inherit_from}}; 2964*e71b7053SJung-uk Kim foreach (@inherit_from) { 2965*e71b7053SJung-uk Kim my %inherited_config = resolve_config($_, $target, @breadcrumbs); 2966*e71b7053SJung-uk Kim 2967*e71b7053SJung-uk Kim # 'template' is a marker that's considered private to 2968*e71b7053SJung-uk Kim # the config that had it. 2969*e71b7053SJung-uk Kim delete $inherited_config{template}; 2970*e71b7053SJung-uk Kim 2971*e71b7053SJung-uk Kim foreach (keys %inherited_config) { 2972*e71b7053SJung-uk Kim if (!$combined_inheritance{$_}) { 2973*e71b7053SJung-uk Kim $combined_inheritance{$_} = []; 2974*e71b7053SJung-uk Kim } 2975*e71b7053SJung-uk Kim push @{$combined_inheritance{$_}}, $inherited_config{$_}; 2976*e71b7053SJung-uk Kim } 2977*e71b7053SJung-uk Kim } 2978*e71b7053SJung-uk Kim } 2979*e71b7053SJung-uk Kim 2980*e71b7053SJung-uk Kim # We won't need inherit_from in this target any more, since we've 2981*e71b7053SJung-uk Kim # resolved all the inheritances that lead to this 2982*e71b7053SJung-uk Kim delete $table{$target}->{inherit_from}; 2983*e71b7053SJung-uk Kim 2984*e71b7053SJung-uk Kim # Now is the time to deal with those lists. Here's the place to 2985*e71b7053SJung-uk Kim # decide what shall be done with those lists, all based on the 2986*e71b7053SJung-uk Kim # values of the target we're currently dealing with. 2987*e71b7053SJung-uk Kim # - If a value is a coderef, it will be executed with the list of 2988*e71b7053SJung-uk Kim # inherited values as arguments. 2989*e71b7053SJung-uk Kim # - If the corresponding key doesn't have a value at all or is the 2990*e71b7053SJung-uk Kim # empty string, the inherited value list will be run through the 2991*e71b7053SJung-uk Kim # default combiner (below), and the result becomes this target's 2992*e71b7053SJung-uk Kim # value. 2993*e71b7053SJung-uk Kim # - Otherwise, this target's value is assumed to be a string that 2994*e71b7053SJung-uk Kim # will simply override the inherited list of values. 2995*e71b7053SJung-uk Kim my $default_combiner = add(); 2996*e71b7053SJung-uk Kim 2997*e71b7053SJung-uk Kim my %all_keys = 2998*e71b7053SJung-uk Kim map { $_ => 1 } (keys %combined_inheritance, 2999*e71b7053SJung-uk Kim keys %{$table{$target}}); 3000*e71b7053SJung-uk Kim 3001*e71b7053SJung-uk Kim sub process_values { 3002*e71b7053SJung-uk Kim my $object = shift; 3003*e71b7053SJung-uk Kim my $inherited = shift; # Always a [ list ] 3004*e71b7053SJung-uk Kim my $target = shift; 3005*e71b7053SJung-uk Kim my $entry = shift; 3006*e71b7053SJung-uk Kim 3007*e71b7053SJung-uk Kim $add_called = 0; 3008*e71b7053SJung-uk Kim 3009*e71b7053SJung-uk Kim while(ref($object) eq "CODE") { 3010*e71b7053SJung-uk Kim $object = $object->(@$inherited); 3011*e71b7053SJung-uk Kim } 3012*e71b7053SJung-uk Kim if (!defined($object)) { 3013*e71b7053SJung-uk Kim return (); 3014*e71b7053SJung-uk Kim } 3015*e71b7053SJung-uk Kim elsif (ref($object) eq "ARRAY") { 3016*e71b7053SJung-uk Kim local $add_called; # To make sure recursive calls don't affect it 3017*e71b7053SJung-uk Kim return [ map { process_values($_, $inherited, $target, $entry) } 3018*e71b7053SJung-uk Kim @$object ]; 3019*e71b7053SJung-uk Kim } elsif (ref($object) eq "") { 3020*e71b7053SJung-uk Kim return $object; 3021*e71b7053SJung-uk Kim } else { 3022*e71b7053SJung-uk Kim die "cannot handle reference type ",ref($object) 3023*e71b7053SJung-uk Kim ," found in target ",$target," -> ",$entry,"\n"; 3024*e71b7053SJung-uk Kim } 3025*e71b7053SJung-uk Kim } 3026*e71b7053SJung-uk Kim 3027*e71b7053SJung-uk Kim foreach (sort keys %all_keys) { 3028*e71b7053SJung-uk Kim my $previous = $combined_inheritance{$_}; 3029*e71b7053SJung-uk Kim 3030*e71b7053SJung-uk Kim # Current target doesn't have a value for the current key? 3031*e71b7053SJung-uk Kim # Assign it the default combiner, the rest of this loop body 3032*e71b7053SJung-uk Kim # will handle it just like any other coderef. 3033*e71b7053SJung-uk Kim if (!exists $table{$target}->{$_}) { 3034*e71b7053SJung-uk Kim $table{$target}->{$_} = $default_combiner; 3035*e71b7053SJung-uk Kim } 3036*e71b7053SJung-uk Kim 3037*e71b7053SJung-uk Kim $table{$target}->{$_} = process_values($table{$target}->{$_}, 3038*e71b7053SJung-uk Kim $combined_inheritance{$_}, 3039*e71b7053SJung-uk Kim $target, $_); 3040*e71b7053SJung-uk Kim unless(defined($table{$target}->{$_})) { 3041*e71b7053SJung-uk Kim delete $table{$target}->{$_}; 3042*e71b7053SJung-uk Kim } 3043*e71b7053SJung-uk Kim# if ($extra_checks && 3044*e71b7053SJung-uk Kim# $previous && !($add_called || $previous ~~ $table{$target}->{$_})) { 3045*e71b7053SJung-uk Kim# warn "$_ got replaced in $target\n"; 3046*e71b7053SJung-uk Kim# } 3047*e71b7053SJung-uk Kim } 3048*e71b7053SJung-uk Kim 3049*e71b7053SJung-uk Kim # Finally done, return the result. 3050*e71b7053SJung-uk Kim return %{$table{$target}}; 3051*e71b7053SJung-uk Kim} 3052*e71b7053SJung-uk Kim 305374664626SKris Kennawaysub usage 305474664626SKris Kennaway { 305574664626SKris Kennaway print STDERR $usage; 3056f579bf8eSKris Kennaway print STDERR "\npick os/compiler from:\n"; 305774664626SKris Kennaway my $j=0; 305874664626SKris Kennaway my $i; 3059f579bf8eSKris Kennaway my $k=0; 306074664626SKris Kennaway foreach $i (sort keys %table) 306174664626SKris Kennaway { 3062*e71b7053SJung-uk Kim next if $table{$i}->{template}; 306374664626SKris Kennaway next if $i =~ /^debug/; 3064f579bf8eSKris Kennaway $k += length($i) + 1; 3065f579bf8eSKris Kennaway if ($k > 78) 3066f579bf8eSKris Kennaway { 3067f579bf8eSKris Kennaway print STDERR "\n"; 3068f579bf8eSKris Kennaway $k=length($i); 3069f579bf8eSKris Kennaway } 3070f579bf8eSKris Kennaway print STDERR $i . " "; 307174664626SKris Kennaway } 307274664626SKris Kennaway foreach $i (sort keys %table) 307374664626SKris Kennaway { 3074*e71b7053SJung-uk Kim next if $table{$i}->{template}; 307574664626SKris Kennaway next if $i !~ /^debug/; 3076f579bf8eSKris Kennaway $k += length($i) + 1; 3077f579bf8eSKris Kennaway if ($k > 78) 3078f579bf8eSKris Kennaway { 307974664626SKris Kennaway print STDERR "\n"; 3080f579bf8eSKris Kennaway $k=length($i); 3081f579bf8eSKris Kennaway } 3082f579bf8eSKris Kennaway print STDERR $i . " "; 3083f579bf8eSKris Kennaway } 3084f579bf8eSKris Kennaway print STDERR "\n\nNOTE: If in doubt, on Unix-ish systems use './config'.\n"; 308574664626SKris Kennaway exit(1); 308674664626SKris Kennaway } 308774664626SKris Kennaway 3088*e71b7053SJung-uk Kimsub run_dofile 3089*e71b7053SJung-uk Kim{ 3090*e71b7053SJung-uk Kim my $out = shift; 3091*e71b7053SJung-uk Kim my @templates = @_; 3092*e71b7053SJung-uk Kim 3093*e71b7053SJung-uk Kim unlink $out || warn "Can't remove $out, $!" 3094*e71b7053SJung-uk Kim if -f $out; 3095*e71b7053SJung-uk Kim foreach (@templates) { 3096*e71b7053SJung-uk Kim die "Can't open $_, $!" unless -f $_; 3097*e71b7053SJung-uk Kim } 3098*e71b7053SJung-uk Kim my $perlcmd = (quotify("maybeshell", $config{PERL}))[0]; 3099*e71b7053SJung-uk Kim my $cmd = "$perlcmd \"-I.\" \"-Mconfigdata\" \"$dofile\" -o\"Configure\" \"".join("\" \"",@templates)."\" > \"$out.new\""; 3100*e71b7053SJung-uk Kim #print STDERR "DEBUG[run_dofile]: \$cmd = $cmd\n"; 3101*e71b7053SJung-uk Kim system($cmd); 3102*e71b7053SJung-uk Kim exit 1 if $? != 0; 3103*e71b7053SJung-uk Kim rename("$out.new", $out) || die "Can't rename $out.new, $!"; 3104*e71b7053SJung-uk Kim} 3105*e71b7053SJung-uk Kim 3106*e71b7053SJung-uk Kimsub compiler_predefined { 3107*e71b7053SJung-uk Kim state %predefined; 3108*e71b7053SJung-uk Kim my $cc = shift; 3109*e71b7053SJung-uk Kim 3110*e71b7053SJung-uk Kim return () if $^O eq 'VMS'; 3111*e71b7053SJung-uk Kim 3112*e71b7053SJung-uk Kim die 'compiler_predefined called without a compiler command' 3113*e71b7053SJung-uk Kim unless $cc; 3114*e71b7053SJung-uk Kim 3115*e71b7053SJung-uk Kim if (! $predefined{$cc}) { 3116*e71b7053SJung-uk Kim 3117*e71b7053SJung-uk Kim $predefined{$cc} = {}; 3118*e71b7053SJung-uk Kim 3119*e71b7053SJung-uk Kim # collect compiler pre-defines from gcc or gcc-alike... 3120*e71b7053SJung-uk Kim open(PIPE, "$cc -dM -E -x c /dev/null 2>&1 |"); 3121*e71b7053SJung-uk Kim while (my $l = <PIPE>) { 3122*e71b7053SJung-uk Kim $l =~ m/^#define\s+(\w+(?:\(\w+\))?)(?:\s+(.+))?/ or last; 3123*e71b7053SJung-uk Kim $predefined{$cc}->{$1} = $2 // ''; 3124*e71b7053SJung-uk Kim } 3125*e71b7053SJung-uk Kim close(PIPE); 3126*e71b7053SJung-uk Kim } 3127*e71b7053SJung-uk Kim 3128*e71b7053SJung-uk Kim return %{$predefined{$cc}}; 3129*e71b7053SJung-uk Kim} 3130*e71b7053SJung-uk Kim 313174664626SKris Kennawaysub which 313274664626SKris Kennaway{ 313374664626SKris Kennaway my ($name)=@_; 3134*e71b7053SJung-uk Kim 3135*e71b7053SJung-uk Kim if (eval { require IPC::Cmd; 1; }) { 3136*e71b7053SJung-uk Kim IPC::Cmd->import(); 3137*e71b7053SJung-uk Kim return scalar IPC::Cmd::can_run($name); 3138*e71b7053SJung-uk Kim } else { 3139*e71b7053SJung-uk Kim # if there is $directories component in splitpath, 3140*e71b7053SJung-uk Kim # then it's not something to test with $PATH... 3141*e71b7053SJung-uk Kim return $name if (File::Spec->splitpath($name))[1]; 3142*e71b7053SJung-uk Kim 3143*e71b7053SJung-uk Kim foreach (File::Spec->path()) { 3144*e71b7053SJung-uk Kim my $fullpath = catfile($_, "$name$target{exe_extension}"); 3145*e71b7053SJung-uk Kim if (-f $fullpath and -x $fullpath) { 3146*e71b7053SJung-uk Kim return $fullpath; 3147*e71b7053SJung-uk Kim } 314874664626SKris Kennaway } 314974664626SKris Kennaway } 315074664626SKris Kennaway} 315174664626SKris Kennaway 3152*e71b7053SJung-uk Kimsub env 315374664626SKris Kennaway{ 3154*e71b7053SJung-uk Kim my $name = shift; 3155*e71b7053SJung-uk Kim my %opts = @_; 315674664626SKris Kennaway 3157*e71b7053SJung-uk Kim unless ($opts{cacheonly}) { 3158*e71b7053SJung-uk Kim # Note that if $ENV{$name} doesn't exist or is undefined, 3159*e71b7053SJung-uk Kim # $config{perlenv}->{$name} will be created with the value 3160*e71b7053SJung-uk Kim # undef. This is intentional. 3161*e71b7053SJung-uk Kim 3162*e71b7053SJung-uk Kim $config{perlenv}->{$name} = $ENV{$name} 3163*e71b7053SJung-uk Kim if ! exists $config{perlenv}->{$name}; 316474664626SKris Kennaway } 3165*e71b7053SJung-uk Kim return $config{perlenv}->{$name}; 316674664626SKris Kennaway} 316774664626SKris Kennaway 3168*e71b7053SJung-uk Kim# Configuration printer ############################################## 3169*e71b7053SJung-uk Kim 317074664626SKris Kennawaysub print_table_entry 317174664626SKris Kennaway{ 3172*e71b7053SJung-uk Kim local $now_printing = shift; 3173*e71b7053SJung-uk Kim my %target = resolve_config($now_printing); 3174*e71b7053SJung-uk Kim my $type = shift; 317574664626SKris Kennaway 3176*e71b7053SJung-uk Kim # Don't print the templates 3177*e71b7053SJung-uk Kim return if $target{template}; 317874664626SKris Kennaway 3179*e71b7053SJung-uk Kim my @sequence = ( 3180*e71b7053SJung-uk Kim "sys_id", 3181*e71b7053SJung-uk Kim "cpp", 3182*e71b7053SJung-uk Kim "cppflags", 3183*e71b7053SJung-uk Kim "defines", 3184*e71b7053SJung-uk Kim "includes", 3185*e71b7053SJung-uk Kim "cc", 3186*e71b7053SJung-uk Kim "cflags", 3187*e71b7053SJung-uk Kim "unistd", 3188*e71b7053SJung-uk Kim "ld", 3189*e71b7053SJung-uk Kim "lflags", 3190*e71b7053SJung-uk Kim "loutflag", 3191*e71b7053SJung-uk Kim "ex_libs", 3192*e71b7053SJung-uk Kim "bn_ops", 3193*e71b7053SJung-uk Kim "apps_aux_src", 3194*e71b7053SJung-uk Kim "cpuid_asm_src", 3195*e71b7053SJung-uk Kim "uplink_aux_src", 3196*e71b7053SJung-uk Kim "bn_asm_src", 3197*e71b7053SJung-uk Kim "ec_asm_src", 3198*e71b7053SJung-uk Kim "des_asm_src", 3199*e71b7053SJung-uk Kim "aes_asm_src", 3200*e71b7053SJung-uk Kim "bf_asm_src", 3201*e71b7053SJung-uk Kim "md5_asm_src", 3202*e71b7053SJung-uk Kim "cast_asm_src", 3203*e71b7053SJung-uk Kim "sha1_asm_src", 3204*e71b7053SJung-uk Kim "rc4_asm_src", 3205*e71b7053SJung-uk Kim "rmd160_asm_src", 3206*e71b7053SJung-uk Kim "rc5_asm_src", 3207*e71b7053SJung-uk Kim "wp_asm_src", 3208*e71b7053SJung-uk Kim "cmll_asm_src", 3209*e71b7053SJung-uk Kim "modes_asm_src", 3210*e71b7053SJung-uk Kim "padlock_asm_src", 3211*e71b7053SJung-uk Kim "chacha_asm_src", 3212*e71b7053SJung-uk Kim "poly1035_asm_src", 3213*e71b7053SJung-uk Kim "thread_scheme", 3214*e71b7053SJung-uk Kim "perlasm_scheme", 3215*e71b7053SJung-uk Kim "dso_scheme", 3216*e71b7053SJung-uk Kim "shared_target", 3217*e71b7053SJung-uk Kim "shared_cflag", 3218*e71b7053SJung-uk Kim "shared_defines", 3219*e71b7053SJung-uk Kim "shared_ldflag", 3220*e71b7053SJung-uk Kim "shared_rcflag", 3221*e71b7053SJung-uk Kim "shared_extension", 3222*e71b7053SJung-uk Kim "dso_extension", 3223*e71b7053SJung-uk Kim "obj_extension", 3224*e71b7053SJung-uk Kim "exe_extension", 3225*e71b7053SJung-uk Kim "ranlib", 3226*e71b7053SJung-uk Kim "ar", 3227*e71b7053SJung-uk Kim "arflags", 3228*e71b7053SJung-uk Kim "aroutflag", 3229*e71b7053SJung-uk Kim "rc", 3230*e71b7053SJung-uk Kim "rcflags", 3231*e71b7053SJung-uk Kim "rcoutflag", 3232*e71b7053SJung-uk Kim "mt", 3233*e71b7053SJung-uk Kim "mtflags", 3234*e71b7053SJung-uk Kim "mtinflag", 3235*e71b7053SJung-uk Kim "mtoutflag", 3236*e71b7053SJung-uk Kim "multilib", 3237*e71b7053SJung-uk Kim "build_scheme", 3238*e71b7053SJung-uk Kim ); 323974664626SKris Kennaway 3240*e71b7053SJung-uk Kim if ($type eq "TABLE") { 3241*e71b7053SJung-uk Kim print "\n"; 3242*e71b7053SJung-uk Kim print "*** $now_printing\n"; 3243*e71b7053SJung-uk Kim foreach (@sequence) { 3244*e71b7053SJung-uk Kim if (ref($target{$_}) eq "ARRAY") { 3245*e71b7053SJung-uk Kim printf "\$%-12s = %s\n", $_, join(" ", @{$target{$_}}); 3246*e71b7053SJung-uk Kim } else { 3247*e71b7053SJung-uk Kim printf "\$%-12s = %s\n", $_, $target{$_}; 3248c1803d78SJacques Vidrine } 3249c1803d78SJacques Vidrine } 3250*e71b7053SJung-uk Kim } elsif ($type eq "HASH") { 3251*e71b7053SJung-uk Kim my $largest = 3252*e71b7053SJung-uk Kim length((sort { length($a) <=> length($b) } @sequence)[-1]); 3253*e71b7053SJung-uk Kim print " '$now_printing' => {\n"; 3254*e71b7053SJung-uk Kim foreach (@sequence) { 3255*e71b7053SJung-uk Kim if ($target{$_}) { 3256*e71b7053SJung-uk Kim if (ref($target{$_}) eq "ARRAY") { 3257*e71b7053SJung-uk Kim print " '",$_,"'"," " x ($largest - length($_))," => [ ",join(", ", map { "'$_'" } @{$target{$_}})," ],\n"; 3258*e71b7053SJung-uk Kim } else { 3259*e71b7053SJung-uk Kim print " '",$_,"'"," " x ($largest - length($_))," => '",$target{$_},"',\n"; 3260*e71b7053SJung-uk Kim } 3261*e71b7053SJung-uk Kim } 3262*e71b7053SJung-uk Kim } 3263*e71b7053SJung-uk Kim print " },\n"; 3264*e71b7053SJung-uk Kim } 3265c1803d78SJacques Vidrine} 32666cf8931aSJung-uk Kim 3267*e71b7053SJung-uk Kim# Utility routines ################################################### 3268*e71b7053SJung-uk Kim 3269*e71b7053SJung-uk Kim# On VMS, if the given file is a logical name, File::Spec::Functions 3270*e71b7053SJung-uk Kim# will consider it an absolute path. There are cases when we want a 3271*e71b7053SJung-uk Kim# purely syntactic check without checking the environment. 3272*e71b7053SJung-uk Kimsub isabsolute { 3273*e71b7053SJung-uk Kim my $file = shift; 3274*e71b7053SJung-uk Kim 3275*e71b7053SJung-uk Kim # On non-platforms, we just use file_name_is_absolute(). 3276*e71b7053SJung-uk Kim return file_name_is_absolute($file) unless $^O eq "VMS"; 3277*e71b7053SJung-uk Kim 3278*e71b7053SJung-uk Kim # If the file spec includes a device or a directory spec, 3279*e71b7053SJung-uk Kim # file_name_is_absolute() is perfectly safe. 3280*e71b7053SJung-uk Kim return file_name_is_absolute($file) if $file =~ m|[:\[]|; 3281*e71b7053SJung-uk Kim 3282*e71b7053SJung-uk Kim # Here, we know the given file spec isn't absolute 3283*e71b7053SJung-uk Kim return 0; 3284*e71b7053SJung-uk Kim} 3285*e71b7053SJung-uk Kim 3286*e71b7053SJung-uk Kim# Makes a directory absolute and cleans out /../ in paths like foo/../bar 3287*e71b7053SJung-uk Kim# On some platforms, this uses rel2abs(), while on others, realpath() is used. 3288*e71b7053SJung-uk Kim# realpath() requires that at least all path components except the last is an 3289*e71b7053SJung-uk Kim# existing directory. On VMS, the last component of the directory spec must 3290*e71b7053SJung-uk Kim# exist. 3291*e71b7053SJung-uk Kimsub absolutedir { 3292*e71b7053SJung-uk Kim my $dir = shift; 3293*e71b7053SJung-uk Kim 3294*e71b7053SJung-uk Kim # realpath() is quite buggy on VMS. It uses LIB$FID_TO_NAME, which 3295*e71b7053SJung-uk Kim # will return the volume name for the device, no matter what. Also, 3296*e71b7053SJung-uk Kim # it will return an incorrect directory spec if the argument is a 3297*e71b7053SJung-uk Kim # directory that doesn't exist. 3298*e71b7053SJung-uk Kim if ($^O eq "VMS") { 3299*e71b7053SJung-uk Kim return rel2abs($dir); 3300*e71b7053SJung-uk Kim } 3301*e71b7053SJung-uk Kim 3302*e71b7053SJung-uk Kim # We use realpath() on Unix, since no other will properly clean out 3303*e71b7053SJung-uk Kim # a directory spec. 3304*e71b7053SJung-uk Kim use Cwd qw/realpath/; 3305*e71b7053SJung-uk Kim 3306*e71b7053SJung-uk Kim return realpath($dir); 3307*e71b7053SJung-uk Kim} 3308*e71b7053SJung-uk Kim 3309*e71b7053SJung-uk Kimsub quotify { 3310*e71b7053SJung-uk Kim my %processors = ( 3311*e71b7053SJung-uk Kim perl => sub { my $x = shift; 3312*e71b7053SJung-uk Kim $x =~ s/([\\\$\@"])/\\$1/g; 3313*e71b7053SJung-uk Kim return '"'.$x.'"'; }, 3314*e71b7053SJung-uk Kim maybeshell => sub { my $x = shift; 3315*e71b7053SJung-uk Kim (my $y = $x) =~ s/([\\\"])/\\$1/g; 3316*e71b7053SJung-uk Kim if ($x ne $y || $x =~ m|\s|) { 3317*e71b7053SJung-uk Kim return '"'.$y.'"'; 3318*e71b7053SJung-uk Kim } else { 3319*e71b7053SJung-uk Kim return $x; 3320*e71b7053SJung-uk Kim } 3321*e71b7053SJung-uk Kim }, 3322*e71b7053SJung-uk Kim ); 3323*e71b7053SJung-uk Kim my $for = shift; 3324*e71b7053SJung-uk Kim my $processor = 3325*e71b7053SJung-uk Kim defined($processors{$for}) ? $processors{$for} : sub { shift; }; 3326*e71b7053SJung-uk Kim 3327*e71b7053SJung-uk Kim return map { $processor->($_); } @_; 3328*e71b7053SJung-uk Kim} 3329*e71b7053SJung-uk Kim 3330*e71b7053SJung-uk Kim# collect_from_file($filename, $line_concat_cond_re, $line_concat) 3331*e71b7053SJung-uk Kim# $filename is a file name to read from 3332*e71b7053SJung-uk Kim# $line_concat_cond_re is a regexp detecting a line continuation ending 3333*e71b7053SJung-uk Kim# $line_concat is a CODEref that takes care of concatenating two lines 3334*e71b7053SJung-uk Kimsub collect_from_file { 3335*e71b7053SJung-uk Kim my $filename = shift; 3336*e71b7053SJung-uk Kim my $line_concat_cond_re = shift; 3337*e71b7053SJung-uk Kim my $line_concat = shift; 3338*e71b7053SJung-uk Kim 3339*e71b7053SJung-uk Kim open my $fh, $filename || die "unable to read $filename: $!\n"; 3340*e71b7053SJung-uk Kim return sub { 3341*e71b7053SJung-uk Kim my $saved_line = ""; 3342*e71b7053SJung-uk Kim $_ = ""; 3343*e71b7053SJung-uk Kim while (<$fh>) { 3344*e71b7053SJung-uk Kim s|\R$||; 3345*e71b7053SJung-uk Kim if (defined $line_concat) { 3346*e71b7053SJung-uk Kim $_ = $line_concat->($saved_line, $_); 3347*e71b7053SJung-uk Kim $saved_line = ""; 3348*e71b7053SJung-uk Kim } 3349*e71b7053SJung-uk Kim if (defined $line_concat_cond_re && /$line_concat_cond_re/) { 3350*e71b7053SJung-uk Kim $saved_line = $_; 3351*e71b7053SJung-uk Kim next; 3352*e71b7053SJung-uk Kim } 3353*e71b7053SJung-uk Kim return $_; 3354*e71b7053SJung-uk Kim } 3355*e71b7053SJung-uk Kim die "$filename ending with continuation line\n" if $_; 3356*e71b7053SJung-uk Kim close $fh; 3357*e71b7053SJung-uk Kim return undef; 3358*e71b7053SJung-uk Kim } 3359*e71b7053SJung-uk Kim} 3360*e71b7053SJung-uk Kim 3361*e71b7053SJung-uk Kim# collect_from_array($array, $line_concat_cond_re, $line_concat) 3362*e71b7053SJung-uk Kim# $array is an ARRAYref of lines 3363*e71b7053SJung-uk Kim# $line_concat_cond_re is a regexp detecting a line continuation ending 3364*e71b7053SJung-uk Kim# $line_concat is a CODEref that takes care of concatenating two lines 3365*e71b7053SJung-uk Kimsub collect_from_array { 3366*e71b7053SJung-uk Kim my $array = shift; 3367*e71b7053SJung-uk Kim my $line_concat_cond_re = shift; 3368*e71b7053SJung-uk Kim my $line_concat = shift; 3369*e71b7053SJung-uk Kim my @array = (@$array); 3370*e71b7053SJung-uk Kim 3371*e71b7053SJung-uk Kim return sub { 3372*e71b7053SJung-uk Kim my $saved_line = ""; 3373*e71b7053SJung-uk Kim $_ = ""; 3374*e71b7053SJung-uk Kim while (defined($_ = shift @array)) { 3375*e71b7053SJung-uk Kim s|\R$||; 3376*e71b7053SJung-uk Kim if (defined $line_concat) { 3377*e71b7053SJung-uk Kim $_ = $line_concat->($saved_line, $_); 3378*e71b7053SJung-uk Kim $saved_line = ""; 3379*e71b7053SJung-uk Kim } 3380*e71b7053SJung-uk Kim if (defined $line_concat_cond_re && /$line_concat_cond_re/) { 3381*e71b7053SJung-uk Kim $saved_line = $_; 3382*e71b7053SJung-uk Kim next; 3383*e71b7053SJung-uk Kim } 3384*e71b7053SJung-uk Kim return $_; 3385*e71b7053SJung-uk Kim } 3386*e71b7053SJung-uk Kim die "input text ending with continuation line\n" if $_; 3387*e71b7053SJung-uk Kim return undef; 3388*e71b7053SJung-uk Kim } 3389*e71b7053SJung-uk Kim} 3390*e71b7053SJung-uk Kim 3391*e71b7053SJung-uk Kim# collect_information($lineiterator, $line_continue, $regexp => $CODEref, ...) 3392*e71b7053SJung-uk Kim# $lineiterator is a CODEref that delivers one line at a time. 3393*e71b7053SJung-uk Kim# All following arguments are regex/CODEref pairs, where the regexp detects a 3394*e71b7053SJung-uk Kim# line and the CODEref does something with the result of the regexp. 3395*e71b7053SJung-uk Kimsub collect_information { 3396*e71b7053SJung-uk Kim my $lineiterator = shift; 3397*e71b7053SJung-uk Kim my %collectors = @_; 3398*e71b7053SJung-uk Kim 3399*e71b7053SJung-uk Kim while(defined($_ = $lineiterator->())) { 3400*e71b7053SJung-uk Kim s|\R$||; 3401*e71b7053SJung-uk Kim my $found = 0; 3402*e71b7053SJung-uk Kim if ($collectors{"BEFORE"}) { 3403*e71b7053SJung-uk Kim $collectors{"BEFORE"}->($_); 3404*e71b7053SJung-uk Kim } 3405*e71b7053SJung-uk Kim foreach my $re (keys %collectors) { 3406*e71b7053SJung-uk Kim if ($re !~ /^OTHERWISE|BEFORE|AFTER$/ && /$re/) { 3407*e71b7053SJung-uk Kim $collectors{$re}->($lineiterator); 3408*e71b7053SJung-uk Kim $found = 1; 3409*e71b7053SJung-uk Kim }; 3410*e71b7053SJung-uk Kim } 3411*e71b7053SJung-uk Kim if ($collectors{"OTHERWISE"}) { 3412*e71b7053SJung-uk Kim $collectors{"OTHERWISE"}->($lineiterator, $_) 3413*e71b7053SJung-uk Kim unless $found || !defined $collectors{"OTHERWISE"}; 3414*e71b7053SJung-uk Kim } 3415*e71b7053SJung-uk Kim if ($collectors{"AFTER"}) { 3416*e71b7053SJung-uk Kim $collectors{"AFTER"}->($_); 3417*e71b7053SJung-uk Kim } 3418*e71b7053SJung-uk Kim } 3419*e71b7053SJung-uk Kim} 3420*e71b7053SJung-uk Kim 3421*e71b7053SJung-uk Kim# tokenize($line) 3422*e71b7053SJung-uk Kim# $line is a line of text to split up into tokens 3423*e71b7053SJung-uk Kim# returns a list of tokens 3424*e71b7053SJung-uk Kim# 3425*e71b7053SJung-uk Kim# Tokens are divided by spaces. If the tokens include spaces, they 3426*e71b7053SJung-uk Kim# have to be quoted with single or double quotes. Double quotes 3427*e71b7053SJung-uk Kim# inside a double quoted token must be escaped. Escaping is done 3428*e71b7053SJung-uk Kim# with backslash. 3429*e71b7053SJung-uk Kim# Basically, the same quoting rules apply for " and ' as in any 3430*e71b7053SJung-uk Kim# Unix shell. 3431*e71b7053SJung-uk Kimsub tokenize { 3432*e71b7053SJung-uk Kim my $line = my $debug_line = shift; 3433*e71b7053SJung-uk Kim my @result = (); 3434*e71b7053SJung-uk Kim 3435*e71b7053SJung-uk Kim while ($line =~ s|^\s+||, $line ne "") { 3436*e71b7053SJung-uk Kim my $token = ""; 3437*e71b7053SJung-uk Kim while ($line ne "" && $line !~ m|^\s|) { 3438*e71b7053SJung-uk Kim if ($line =~ m/^"((?:[^"\\]+|\\.)*)"/) { 3439*e71b7053SJung-uk Kim $token .= $1; 3440*e71b7053SJung-uk Kim $line = $'; 3441*e71b7053SJung-uk Kim } elsif ($line =~ m/^'([^']*)'/) { 3442*e71b7053SJung-uk Kim $token .= $1; 3443*e71b7053SJung-uk Kim $line = $'; 3444*e71b7053SJung-uk Kim } elsif ($line =~ m/^(\S+)/) { 3445*e71b7053SJung-uk Kim $token .= $1; 3446*e71b7053SJung-uk Kim $line = $'; 3447*e71b7053SJung-uk Kim } 3448*e71b7053SJung-uk Kim } 3449*e71b7053SJung-uk Kim push @result, $token; 3450*e71b7053SJung-uk Kim } 3451*e71b7053SJung-uk Kim 3452*e71b7053SJung-uk Kim if ($ENV{CONFIGURE_DEBUG_TOKENIZE}) { 3453*e71b7053SJung-uk Kim print STDERR "DEBUG[tokenize]: Parsed '$debug_line' into:\n"; 3454*e71b7053SJung-uk Kim print STDERR "DEBUG[tokenize]: ('", join("', '", @result), "')\n"; 3455*e71b7053SJung-uk Kim } 3456*e71b7053SJung-uk Kim return @result; 34576cf8931aSJung-uk Kim} 3458