diff --git a/Configurations/00-base-templates.conf b/Configurations/00-base-templates.conf new file mode 100644 index 0000000000..064648f15a --- /dev/null +++ b/Configurations/00-base-templates.conf @@ -0,0 +1,168 @@ +%targets=( + BASE => { + template => 1, + cpuid_obj => "mem_clr.o", + bn_obj => "bn_asm.o", + ec_obj => "", + des_obj => "des_enc.o fcrypt_b.o", + aes_obj => "aes_core.o aes_cbc.o", + bf_obj => "bf_enc.o", + md5_obj => "", + cast_obj => "c_enc.o", + rc4_obj => "rc4_enc.o rc4_skey.o", + rmd160_obj => "", + rc5_obj => "rc5_enc.o", + wp_obj => "wp_block.o", + cmll_obj => "camellia.o cmll_misc.o cmll_cbc.o", + modes_obj => "", + engines_obj => "", + chacha_obj => "chacha_enc.o", + poly1305_obj => "", + + unistd => "", + }, + + x86_asm => { + template => 1, + cpuid_obj => "x86cpuid.o", + bn_obj => "bn-586.o co-586.o x86-mont.o x86-gf2m.o", + ec_obj => "ecp_nistz256.o ecp_nistz256-x86.o", + des_obj => "des-586.o crypt586.o", + aes_obj => "aes-586.o vpaes-x86.o aesni-x86.o", + bf_obj => "bf-586.o", + md5_obj => "md5-586.o", + sha1_obj => "sha1-586.o sha256-586.o sha512-586.o", + rc4_obj => "rc4-586.o", + rmd160_obj => "rmd-586.o", + rc5_obj => "rc5-586.o", + wp_obj => "wp_block.o wp-mmx.o", + cmll_obj => "cmll-x86.o", + modes_obj => "ghash-x86.o", + engines_obj => "e_padlock-x86.o" + }, + x86_elf_asm => { + template => 1, + inherit_from => [ "x86_asm" ], + perlasm_scheme => "elf" + }, + x86_64_asm => { + template => 1, + cpuid_obj => "x86_64cpuid.o", + bn_obj => "x86_64-gcc.o x86_64-mont.o x86_64-mont5.o x86_64-gf2m.o rsaz_exp.o rsaz-x86_64.o rsaz-avx2.o", + ec_obj => "ecp_nistz256.o ecp_nistz256-x86_64.o", + aes_obj => "aes-x86_64.o vpaes-x86_64.o bsaes-x86_64.o aesni-x86_64.o aesni-sha1-x86_64.o aesni-sha256-x86_64.o aesni-mb-x86_64.o", + md5_obj => "md5-x86_64.o", + sha1_obj => "sha1-x86_64.o sha256-x86_64.o sha512-x86_64.o sha1-mb-x86_64.o sha256-mb-x86_64.o", + rc4_obj => "rc4-x86_64.o rc4-md5-x86_64.o", + wp_obj => "wp-x86_64.o", + cmll_obj => "cmll-x86_64.o cmll_misc.o", + modes_obj => "ghash-x86_64.o aesni-gcm-x86_64.o", + engines_obj => "e_padlock-x86_64.o" + }, + ia64_asm => { + template => 1, + cpuid_obj => "ia64cpuid.o", + bn_obj => "bn-ia64.o ia64-mont.o", + aes_obj => "aes_core.o aes_cbc.o aes-ia64.o", + md5_obj => "md5-ia64.o", + sha1_obj => "sha1-ia64.o sha256-ia64.o sha512-ia64.o", + rc4_obj => "rc4-ia64.o rc4_skey.o", + modes_obj => "ghash-ia64.o", + perlasm_scheme => "void" + }, + sparcv9_asm => { + template => 1, + cpuid_obj => "sparcv9cap.o sparccpuid.o", + bn_obj => "bn-sparcv9.o sparcv9-mont.o sparcv9a-mont.o vis3-mont.o sparct4-mont.o sparcv9-gf2m.o", + ec_obj => "ecp_nistz256.o ecp_nistz256-sparcv9.o", + des_obj => "des_enc-sparc.o fcrypt_b.o dest4-sparcv9.o", + aes_obj => "aes_core.o aes_cbc.o aes-sparcv9.o aest4-sparcv9.o", + md5_obj => "md5-sparcv9.o", + sha1_obj => "sha1-sparcv9.o sha256-sparcv9.o sha512-sparcv9.o", + cmll_obj => "camellia.o cmll_misc.o cmll_cbc.o cmllt4-sparcv9.o", + modes_obj => "ghash-sparcv9.o", + perlasm_scheme => "void" + }, + sparcv8_asm => { + template => 1, + cpuid_obj => "", + bn_obj => "sparcv8.o", + des_obj => "des_enc-sparc.o fcrypt_b.o", + perlasm_scheme => "void" + }, + alpha_asm => { + template => 1, + cpuid_obj => "alphacpuid.o", + bn_obj => "bn_asm.o alpha-mont.o", + sha1_obj => "sha1-alpha.o", + modes_obj => "ghash-alpha.o", + perlasm_scheme => "void" + }, + mips32_asm => { + template => 1, + bn_obj => "bn-mips.o mips-mont.o", + aes_obj => "aes_cbc.o aes-mips.o", + sha1_obj => "sha1-mips.o sha256-mips.o", + }, + mips64_asm => { + inherit_from => [ "mips32_asm" ], + template => 1, + sha1_obj => sub { join(" ", @_, "sha512-mips.o") } + }, + s390x_asm => { + template => 1, + cpuid_obj => "s390xcap.o s390xcpuid.o", + bn_obj => "bn-s390x.o s390x-mont.o s390x-gf2m.o", + aes_obj => "aes-s390x.o aes-ctr.o aes-xts.o", + sha1_obj => "sha1-s390x.o sha256-s390x.o sha512-s390x.o", + rc4_obj => "rc4-s390x.o", + modes_obj => "ghash-s390x.o", + }, + armv4_asm => { + template => 1, + cpuid_obj => "armcap.o armv4cpuid.o", + bn_obj => "bn_asm.o armv4-mont.o armv4-gf2m.o", + ec_obj => "ecp_nistz256.o ecp_nistz256-armv4.o", + aes_obj => "aes_cbc.o aes-armv4.o bsaes-armv7.o aesv8-armx.o", + sha1_obj => "sha1-armv4-large.o sha256-armv4.o sha512-armv4.o", + modes_obj => "ghash-armv4.o ghashv8-armx.o", + perlasm_scheme => "void" + }, + aarch64_asm => { + template => 1, + cpuid_obj => "armcap.o arm64cpuid.o mem_clr.o", + ec_obj => "ecp_nistz256.o ecp_nistz256-armv8.o", + bn_obj => "bn_asm.o armv8-mont.o", + aes_obj => "aes_core.o aes_cbc.o aesv8-armx.o vpaes-armv8.o", + sha1_obj => "sha1-armv8.o sha256-armv8.o sha512-armv8.o", + modes_obj => "ghashv8-armx.o", + }, + parisc11_asm => { + template => 1, + cpuid_obj => "pariscid.o", + bn_obj => "bn_asm.o parisc-mont.o", + aes_obj => "aes_core.o aes_cbc.o aes-parisc.o", + sha1_obj => "sha1-parisc.o sha256-parisc.o sha512-parisc.o", + rc4_obj => "rc4-parisc.o", + modes_obj => "ghash-parisc.o", + perlasm_scheme => "32" + }, + parisc20_64_asm => { + template => 1, + inherit_from => [ "parisc11_asm" ], + bn_obj => sub { my $r=join(" ",@_); $r=~s/bn_asm/pa-risc2W/; $r; }, + perlasm_scheme => "64", + }, + ppc64_asm => { + template => 1, + cpuid_obj => "ppccpuid.o ppccap.o", + bn_obj => "bn-ppc.o ppc-mont.o ppc64-mont.o", + aes_obj => "aes_core.o aes_cbc.o aes-ppc.o vpaes-ppc.o aesp8-ppc.o", + sha1_obj => "sha1-ppc.o sha256-ppc.o sha512-ppc.o sha256p8-ppc.o sha512p8-ppc.o", + modes_obj => "ghashp8-ppc.o", + }, + ppc32_asm => { + inherit_from => [ "ppc64_asm" ], + template => 1 + }, +); diff --git a/Configurations/README b/Configurations/README new file mode 100644 index 0000000000..e1327e57f9 --- /dev/null +++ b/Configurations/README @@ -0,0 +1,288 @@ +Configurations of OpenSSL target platforms +------------------------------------------ + +Target configurations are a collection of facts that we know about +different platforms and their capabilities. We organise them in a +hash table, where each entry represent a specific target. + +In each table entry, the following keys are significant: + + inherit_from => Other targets to inherit values from. + Explained further below. [1] + template => Set to 1 if this isn't really a platform + target. Instead, this target is a template + upon which other targets can be built. + Explained further below. [1] + + sys_id => System identity for systems where that + is difficult to determine automatically. + + cc => The compiler command, usually one of "cc", + "gcc" or "clang". This command is normally + also used to link object files and + libraries into the final program. + cflags => Flags that are used at all times when + compiling. + debug_cflags => Extra compilation flags used when making a + debug build (when Configure receives the + --debug option). Typically something like + "-g -O0". + release_cflags => Extra compilation flags used when making a + release build (when Configure receives the + --release option, or doesn't receive the + --debug option). Typically something like + "-O" or "-O3". + thread_cflags => Extra compilation flags used when + compiling with threading enabled. + Explained further below. [2] + shared_cflag => Extra compilation flags used when + compiling for shared libraries, typically + something like "-fPIC". + + ld => the linker command, usually not defined + (meaning the compiler command is used + instead). + (NOTE: this is here for future use, it's + not implemented yet) + lflags => the flags that are used at all times when + linking. These can have a % sign in them + showing where the OpenSSL libraries should + appear, otherwise these flags will come + last. So in a typical links situation, + this is a quick table of results: + + "-foo%-bar" > -foo -lssl -lcrypto -bar + "-foo%" > -foo -lssl -lcrypto + "-foo" > -lssl -lcrypto -foo + + debug_lflags => Like debug_cflags, but used when linking. + release_lflags => Like release_cflags, but used when linking. + shared_lflags => Like shared_cflags, but used when linking. + + ar => The library archive command, the default is + "ar". + (NOTE: this is here for future use, it's + not implemented yet) + arflags => Flags to be used with the library archive + command. + + ranlib => The library archive indexing command, the + default is 'ranlib' it it exists. + + unistd => An alternative header to the typical + ''. This is very rarely needed. + + shared_extension => File name extension used for shared + libraries. + obj_extension => File name extension used for object files. + On unix, this defaults to ".o" (NOTE: this + is here for future use, it's not + implemented yet) + exe_extension => File name extension used for executable + files. On unix, this defaults to "" (NOTE: + this is here for future use, it's not + implemented yet) + + dso_scheme => The type of dynamic shared objects to build + for. This mostly comes into play with + engines, but can be used for other purposes + as well. Valid values are "DLFCN" + (dlopen() et al), "DLFCN_NO_H" (for systems + that use dlopen() et al but do not have + fcntl.h), "DL" (shl_load() et al), "WIN32" + and "VMS". + perlasm_scheme => The perlasm method used to created the + assembler files used when compiling with + assembler implementations. + shared_target => The shared library building method used. + This is a target found in Makefile.shared. + build_scheme => The scheme used to build up a Makefile. + (NOTE: this is here for future use, it's + not implemented yet) + + multilib => On systems that support having multiple + implementations of a library (typically a + 32-bit and a 64-bit variant), this is used + to have the different variants in different + directories. + + bn_ops => Building options (was just bignum options + in the earlier history of this option, + hence the name). This a string of words + that describe properties on the designated + target platform, such as the type of + integers used to build up the bitnum, + different ways to implement certain ciphers + and so on. To fully comprehend the + meaning, the best is to read the affected + source. + The valid words are: + + DES_PTR use a pointer to DES_SPtrans + rather that DES_SPtrans + directly in D_ENCRYPT. + DES_RISC1 Alternate implementations of + DES_RISC2 D_ENCRYPT for certain RISC + processors. + DES_UNROLL do not loop around calls to + D_ENCRYPT. + DES_INT have unsigned int as the + integer type for DES rather + than unsigned long. + BN_LLONG use 'unsigned long long' in + some bignum calculations. + This has no value when + SIXTY_FOUR_BIT or + SIXTY_FOUR_BIT_LONG is given. + RC4_CHAR makes the basic RC4 unif of + calculation an unsigned char. + RC4_LONG makes the basic RC4 unif of + calculation an unsigned long. + RC4_INDEX go through input and output + data by indexing into them + rather than incrementing the + pointer. + RC4_CHUNK sets the chunk type to + unsigned long. + RC4_CHUNK_LL sets the chunk type to + unsigned long long. + both these chunk sizes are for + handling data in chunks on + processors that do not have + byte load/store instructions. + MD2_CHAR makes the basic MD2 unit of + calculation an unsigned char. + MD2_LONG makes the basic MD2 unit of + calculation an unsigned long. + IDEA_SHORT makes the basic IDEA unit of + calculation an unsigned short. + IDEA_LONG makes the basic IDEA unit of + calculation an unsigned long. + RC2_SHORT makes the basic RC2 unit of + calculation an unsigned short. + RC2_LONG makes the basic RC2 unit of + calculation an unsigned long. + BF_PTR use different pointer based + BF_PTR2 versions of BF_ENC. + SIXTY_FOUR_BIT processor registers + are 64 bits, long is + 32 bits, long long is + 64 bits. + SIXTY_FOUR_BIT_LONG processor registers + are 64 bits, long is + 64 bits. + THIRTY_TWO_BIT processor registers + are 32 bits. + EXPORT_VAR_AS_FN for shared libraries, + export vars as + accessor functions. + + cpuid_obj => assembler implementation of cpuid code as + well as OPENSSL_cleanse(). + Default to mem_clr.o + bn_obj => assembler implementation of core bignum + functions. + Defaults to bn_asm.o + ec_obj => assembler implementation of core EC + functions. + des_obj => assembler implementation of core DES + encryption functions. + Defaults to 'des_enc.o fcrypt_b.o' + aes_obj => assembler implementation of core AES + functions. + Defaults to 'aes_core.o aes_cbc.o' + bf_obj => assembler implementation of core BF + functions. + Defaults to 'bf_enc.o' + md5_obj => assembler implementation of core MD5 + functions. + sha1_obj => assembler implementation of core SHA1, + functions, and also possibly SHA256 and + SHA512 ones. + cast_obj => assembler implementation of core BF + functions. + Defaults to 'c_enc.o' + rc4_obj => assembler implementation of core BF + functions. + Defaults to 'rc4_enc.o rc4_skey.o' + rmd160_obj => assembler implementation of core RMD160 + functions. + rc5_obj => assembler implementation of core RC4 + functions. + Defaults to 'rc5_enc.o' + wp_obj => assembler implementation of core WHIRLPOOL + functions. + cmll_obj => assembler implementation of core CAMELLIA + functions. + Defaults to 'camellia.o cmll_misc.o cmll_cbc.o' + modes_obj => assembler implementation of the + functions gcm_gmult_4bit and gcm_ghash_4bit. + engines_obj => assembler implementation of core parts of + the padlock engine. This is mandatory on + any platform where the padlock engine might + actually be built. + + +[1] as part of the target configuration, one can have a key called + 'inherit_from' that indicate what other configurations to inherit + data from. These are resolved recursively. + + Inheritance works as a set of default values that can be overriden + by corresponding key values in the inheriting configuration. + + Note 1: any configuration table can be used as a template. + Note 2: pure templates have the attribute 'template => 1' and + cannot be used as build targets. + + If several configurations are given in the 'inherit_from' array, + the values of same attribute are concatenated with space + separation. With this, it's possible to have several smaller + templates for different configuration aspects that can be combined + into a complete configuration. + + instead of a scalar value or an array, a value can be a code block + of the form 'sub { /* your code here */ }'. This code block will + be called with the list of inherited values for that key as + arguments. In fact, the concatenation of strings is really done + by using 'sub { join(" ",@_) }' on the list of inherited values. + + An example: + + "foo" => { + template => 1, + haha => "ha ha", + hoho => "ho", + ignored => "This should not appear in the end result", + }, + "bar" => { + template => 1, + haha => "ah", + hoho => "haho", + hehe => "hehe" + }, + "laughter" => { + inherit_from => [ "foo", "bar" ], + hehe => sub { join(" ",(@_,"!!!")) }, + ignored => "", + } + + The entry for "laughter" will become as follows after processing: + + "laughter" => { + haha => "ha ha ah", + hoho => "ho haho", + hehe => "hehe !!!", + ignored => "" + } + +[2] OpenSSL is built with threading capabilities unless the user + specifies 'no-threads'. The value of the key 'thread_cflags' may + be "(unknown)", in which case the user MUST give some compilation + flags to Configure. + + +Historically, the target configurations came in form of a string with +values separated by colons. This use is deprecated, although +currently somewhat supported. The string form looks like this: + + "target" => "{cc}:{cflags}:{unistd}:{thread_cflag}:{sys_id}:{lflags}:{bn_ops}:{cpuid_obj}:{bn_obj}:{ec_obj}:{des_obj}:{aes_obj}:{bf_obj}:{md5_obj}:{sha1_obj}:{cast_obj}:{rc4_obj}:{rmd160_obj}:{rc5_obj}:{wp_obj}:{cmll_obj}:{modes_obj}:{engines_obj}:{perlasm_scheme}:{dso_scheme}:{shared_target}:{shared_cflag}:{shared_ldflag}:{shared_extension}:{ranlib}:{arflags}:{multilib}" diff --git a/Configure b/Configure index 4c2f01fdb3..be55d8ce83 100755 --- a/Configure +++ b/Configure @@ -148,283 +148,8 @@ my $apitable = { "0.9.8" => "0x00908000L", }; -# table of known configurations, read in from files -# -# The content of each entry comes in the form of config hash table, -# which has additional attributes for debug and non-debug flags to be -# added to the common flags, for cflags and lflags: -# -# { -# cc => $cc, -# cflags => $cflags, -# debug_cflags => $debug_cflags, -# release_cflags => $release_cflags, -# unistd => $unistd, -# thread_cflag => $thread_cflag, -# sys_id => $sys_id, -# lflags => $lflags, -# debug_lflags => $debug_lflags, -# release_lflags => $release_lflags, -# bn_ops => $bn_ops, -# cpuid_obj => $cpuid_obj, -# bn_obj => $bn_obj, -# ec_obj => $ec_obj, -# des_obj => $des_obj, -# aes_obj => $aes_obj, -# bf_obj => $bf_obj, -# md5_obj => $md5_obj, -# sha1_obj => $sha1_obj, -# cast_obj => $cast_obj, -# rc4_obj => $rc4_obj, -# rmd160_obj => $rmd160_obj, -# rc5_obj => $rc5_obj, -# wp_obj => $wp_obj, -# cmll_obj => $cmll_obj, -# modes_obj => $modes_obj, -# engines_obj => $engines_obj, -# chacha_obj => $wp_obj, -# poly1305_obj => $cmll_obj, -# dso_scheme => $dso_scheme, -# shared_target => $shared_target, -# shared_cflag => $shared_cflag, -# shared_ldflag => $shared_ldflag, -# shared_extension => $shared_extension, -# ranlib => $ranlib, -# arflags => $arflags, -# multilib => $multilib -# } -# -# The configuration hashes can refer to templates in two different manners: -# -# - as part of the hash, one can have a key called 'inherit_from' that -# indicate what other configuration hashes to inherit data from. -# These are resolved recursively. -# -# Inheritance works as a set of default values that can be overriden -# by corresponding attribute values in the inheriting configuration. -# -# If several configurations are given in the 'inherit_from' array, the -# values of same attribute are concatenated with space separation. -# With this, it's possible to have several smaller templates for -# different configuration aspects that can be combined into a complete -# configuration. -# -# Example: -# -# "foo" => { -# template => 1, -# haha => "haha", -# hoho => "ho" -# }, -# "bar" => { -# template => 1, -# hoho => "ho", -# hehe => "hehe" -# }, -# "laughter" => { -# inherit_from => [ "foo", "bar" ], -# } -# -# The entry for "foo" will become as follows after processing: -# -# "laughter" => { -# haha => "haha", -# hoho => "ho ho", -# hehe => "hehe" -# } -# -# Note 1: any entry from the table can be used as a template. -# Note 2: pure templates have the attribute 'template => 1' and cannot -# be used as targets. -# -# - instead of a string, one can have a code block of the form -# 'sub { /* your code here */ }', where the arguments are the list of -# inherited values for that key. In fact, the concatenation of strings -# is really done by using 'sub { join(" ",@_) }' on the list of inherited -# values. -# -# Example: -# -# "foo" => { -# template => 1, -# haha => "ha ha", -# hoho => "ho", -# ignored => "This should not appear in the end result", -# }, -# "bar" => { -# template => 1, -# haha => "ah", -# hoho => "haho", -# hehe => "hehe" -# }, -# "laughter" => { -# inherit_from => [ "foo", "bar" ], -# hehe => sub { join(" ",(@_,"!!!")) }, -# ignored => "", -# } -# -# The entry for "foo" will become as follows after processing: -# -# "laughter" => { -# haha => "ha ha ah", -# hoho => "ho haho", -# hehe => "hehe !!!", -# ignored => "" -# } -# - -our %table=( - - # All these templates are merely a translation of the corresponding - # variables further up. - # - # Note: as long as someone might use old style configuration strings, - # or we bother supporting that, those variables need to stay - - x86_asm => { - template => 1, - cpuid_obj => "x86cpuid.o", - bn_obj => "bn-586.o co-586.o x86-mont.o x86-gf2m.o", - ec_obj => "ecp_nistz256.o ecp_nistz256-x86.o", - des_obj => "des-586.o crypt586.o", - aes_obj => "aes-586.o vpaes-x86.o aesni-x86.o", - bf_obj => "bf-586.o", - md5_obj => "md5-586.o", - sha1_obj => "sha1-586.o sha256-586.o sha512-586.o", - rc4_obj => "rc4-586.o", - rmd160_obj => "rmd-586.o", - rc5_obj => "rc5-586.o", - wp_obj => "wp_block.o wp-mmx.o", - cmll_obj => "cmll-x86.o", - modes_obj => "ghash-x86.o", - engines_obj => "e_padlock-x86.o" - }, - x86_elf_asm => { - template => 1, - inherit_from => [ "x86_asm" ], - perlasm_scheme => "elf" - }, - x86_64_asm => { - template => 1, - cpuid_obj => "x86_64cpuid.o", - bn_obj => "x86_64-gcc.o x86_64-mont.o x86_64-mont5.o x86_64-gf2m.o rsaz_exp.o rsaz-x86_64.o rsaz-avx2.o", - ec_obj => "ecp_nistz256.o ecp_nistz256-x86_64.o", - aes_obj => "aes-x86_64.o vpaes-x86_64.o bsaes-x86_64.o aesni-x86_64.o aesni-sha1-x86_64.o aesni-sha256-x86_64.o aesni-mb-x86_64.o", - md5_obj => "md5-x86_64.o", - sha1_obj => "sha1-x86_64.o sha256-x86_64.o sha512-x86_64.o sha1-mb-x86_64.o sha256-mb-x86_64.o", - rc4_obj => "rc4-x86_64.o rc4-md5-x86_64.o", - wp_obj => "wp-x86_64.o", - cmll_obj => "cmll-x86_64.o cmll_misc.o", - modes_obj => "ghash-x86_64.o aesni-gcm-x86_64.o", - engines_obj => "e_padlock-x86_64.o" - }, - ia64_asm => { - template => 1, - cpuid_obj => "ia64cpuid.o", - bn_obj => "bn-ia64.o ia64-mont.o", - aes_obj => "aes_core.o aes_cbc.o aes-ia64.o", - md5_obj => "md5-ia64.o", - sha1_obj => "sha1-ia64.o sha256-ia64.o sha512-ia64.o", - rc4_obj => "rc4-ia64.o rc4_skey.o", - modes_obj => "ghash-ia64.o", - perlasm_scheme => "void" - }, - sparcv9_asm => { - template => 1, - cpuid_obj => "sparcv9cap.o sparccpuid.o", - bn_obj => "bn-sparcv9.o sparcv9-mont.o sparcv9a-mont.o vis3-mont.o sparct4-mont.o sparcv9-gf2m.o", - ec_obj => "ecp_nistz256.o ecp_nistz256-sparcv9.o", - des_obj => "des_enc-sparc.o fcrypt_b.o dest4-sparcv9.o", - aes_obj => "aes_core.o aes_cbc.o aes-sparcv9.o aest4-sparcv9.o", - md5_obj => "md5-sparcv9.o", - sha1_obj => "sha1-sparcv9.o sha256-sparcv9.o sha512-sparcv9.o", - cmll_obj => "camellia.o cmll_misc.o cmll_cbc.o cmllt4-sparcv9.o", - modes_obj => "ghash-sparcv9.o", - perlasm_scheme => "void" - }, - sparcv8_asm => { - template => 1, - cpuid_obj => "", - bn_obj => "sparcv8.o", - des_obj => "des_enc-sparc.o fcrypt_b.o", - perlasm_scheme => "void" - }, - alpha_asm => { - template => 1, - cpuid_obj => "alphacpuid.o", - bn_obj => "bn_asm.o alpha-mont.o", - sha1_obj => "sha1-alpha.o", - modes_obj => "ghash-alpha.o", - perlasm_scheme => "void" - }, - mips32_asm => { - template => 1, - bn_obj => "bn-mips.o mips-mont.o", - aes_obj => "aes_cbc.o aes-mips.o", - sha1_obj => "sha1-mips.o sha256-mips.o", - }, - mips64_asm => { - inherit_from => [ "mips32_asm" ], - template => 1, - sha1_obj => sub { join(" ", @_, "sha512-mips.o") } - }, - s390x_asm => { - template => 1, - cpuid_obj => "s390xcap.o s390xcpuid.o", - bn_obj => "bn-s390x.o s390x-mont.o s390x-gf2m.o", - aes_obj => "aes-s390x.o aes-ctr.o aes-xts.o", - sha1_obj => "sha1-s390x.o sha256-s390x.o sha512-s390x.o", - rc4_obj => "rc4-s390x.o", - modes_obj => "ghash-s390x.o", - }, - armv4_asm => { - template => 1, - cpuid_obj => "armcap.o armv4cpuid.o", - bn_obj => "bn_asm.o armv4-mont.o armv4-gf2m.o", - ec_obj => "ecp_nistz256.o ecp_nistz256-armv4.o", - aes_obj => "aes_cbc.o aes-armv4.o bsaes-armv7.o aesv8-armx.o", - sha1_obj => "sha1-armv4-large.o sha256-armv4.o sha512-armv4.o", - modes_obj => "ghash-armv4.o ghashv8-armx.o", - perlasm_scheme => "void" - }, - aarch64_asm => { - template => 1, - cpuid_obj => "armcap.o arm64cpuid.o mem_clr.o", - ec_obj => "ecp_nistz256.o ecp_nistz256-armv8.o", - bn_obj => "bn_asm.o armv8-mont.o", - aes_obj => "aes_core.o aes_cbc.o aesv8-armx.o vpaes-armv8.o", - sha1_obj => "sha1-armv8.o sha256-armv8.o sha512-armv8.o", - modes_obj => "ghashv8-armx.o", - }, - parisc11_asm => { - template => 1, - cpuid_obj => "pariscid.o", - bn_obj => "bn_asm.o parisc-mont.o", - aes_obj => "aes_core.o aes_cbc.o aes-parisc.o", - sha1_obj => "sha1-parisc.o sha256-parisc.o sha512-parisc.o", - rc4_obj => "rc4-parisc.o", - modes_obj => "ghash-parisc.o", - perlasm_scheme => "32" - }, - parisc20_64_asm => { - template => 1, - inherit_from => [ "parisc11_asm" ], - bn_obj => sub { my $r=join(" ",@_); $r=~s/bn_asm/pa-risc2W/; $r; }, - perlasm_scheme => "64", - }, - ppc64_asm => { - template => 1, - cpuid_obj => "ppccpuid.o ppccap.o", - bn_obj => "bn-ppc.o ppc-mont.o ppc64-mont.o", - aes_obj => "aes_core.o aes_cbc.o aes-ppc.o vpaes-ppc.o aesp8-ppc.o", - sha1_obj => "sha1-ppc.o sha256-ppc.o sha512-ppc.o sha256p8-ppc.o sha512p8-ppc.o", - modes_obj => "ghashp8-ppc.o", - }, - ppc32_asm => { - inherit_from => [ "ppc64_asm" ], - template => 1 - }, -); +my $base_target = "BASE"; # The template that all other inherit from +our %table = (); # Forward declarations ############################################### @@ -472,24 +197,6 @@ my $no_asm=0; my $no_dso=0; my @skip=(); my $Makefile="Makefile"; -my $des_locl="crypto/des/des_locl.h"; -my $des ="include/openssl/des.h"; -my $bn ="include/openssl/bn.h"; -my $md2 ="include/openssl/md2.h"; -my $rc4 ="include/openssl/rc4.h"; -my $rc4_locl="crypto/rc4/rc4_locl.h"; -my $idea ="include/openssl/idea.h"; -my $rc2 ="include/openssl/rc2.h"; -my $bf ="crypto/bf/bf_locl.h"; -my $bn_asm ="bn_asm.o"; -my $des_enc="des_enc.o fcrypt_b.o"; -my $aes_enc="aes_core.o aes_cbc.o"; -my $bf_enc ="bf_enc.o"; -my $cast_enc="c_enc.o"; -my $rc4_enc="rc4_enc.o rc4_skey.o"; -my $rc5_enc="rc5_enc.o"; -my $cmll_enc="camellia.o cmll_misc.o cmll_cbc.o"; -my $chacha_enc="chacha_enc.o"; my $processor=""; my $default_ranlib; my $perl; @@ -972,24 +679,6 @@ if ($target =~ m/^CygWin32(-.*)$/) { $target = "Cygwin".$1; } -print "Configuring for $target\n"; - -# Support for legacy targets having a name starting with 'debug-' -my ($d, $t) = $target =~ m/^(debug-)?(.*)$/; -if ($d) { - $build_prefix = "debug_"; - - # If we do not find debug-foo in the table, the target is set to foo, - # but only if the foo target has a noon-empty debug_cflags or debug_lflags - # attribute. - if (!$table{$target}) { - $target = $t; - } -} -my %target = resolve_config($target); - -&usage if (!%target || $target{template}); - foreach (sort (keys %disabled)) { $options .= " no-$_"; @@ -1056,6 +745,24 @@ foreach (sort @experimental) $exp_cflags .= " -DOPENSSL_EXPERIMENTAL_$ALGO"; } +print "Configuring for $target\n"; + +# Support for legacy targets having a name starting with 'debug-' +my ($d, $t) = $target =~ m/^(debug-)?(.*)$/; +if ($d) { + $build_prefix = "debug_"; + + # If we do not find debug-foo in the table, the target is set to foo. + if (!$table{$target}) { + $target = $t; + } +} + +delete $table{$base_target}->{template}; # or the next test will fail. +my %target = ( %{$table{$base_target}}, resolve_config($target) ); + +&usage if (!%target || $target{template}); + my $IsMK1MF=scalar grep /^$target$/,@MK1MF_Builds; $exe_ext=".exe" if ($target eq "Cygwin" || $target eq "DJGPP" || $target =~ /^mingw/); @@ -1219,22 +926,9 @@ $lflags="$libs$lflags" if ($libs ne ""); if ($no_asm) { - $cpuid_obj=$bn_obj=$ec_obj= - $des_obj=$aes_obj=$bf_obj=$cast_obj=$rc4_obj=$rc5_obj=$cmll_obj= - $modes_obj=$sha1_obj=$md5_obj=$rmd160_obj=$wp_obj=$engines_obj= - $chacha_obj=$poly1305_obj=""; $cflags=~s/\-D[BL]_ENDIAN// if ($fips); $thread_cflags=~s/\-D[BL]_ENDIAN// if ($fips); } -elsif (defined($disabled{ec2m})) - { - $bn_obj =~ s/\w+-gf2m.o//; - } - -if (!$no_shared) - { - $cast_obj=""; # CAST assembler is not PIC - } if ($threads) { @@ -1297,8 +991,6 @@ if (!$IsMK1MF) } } -$cpuid_obj.=" uplink.o uplink-x86.o" if ($cflags =~ /\-DOPENSSL_USE_APPLINK/); - # # Platform fix-ups # @@ -1358,58 +1050,44 @@ if ($ranlib eq "") $ranlib = $default_ranlib; } -#my ($bn1)=split(/\s+/,$bn_obj); -#$bn1 = "" unless defined $bn1; -#$bn1=$bn_asm unless ($bn1 =~ /\.o$/); -#$bn_obj="$bn1"; +if (!$no_asm) { + $cpuid_obj=$table{BASE}->{cpuid_obj} if ($processor eq "386"); + $cpuid_obj.=" uplink.o uplink-x86.o" if ($cflags =~ /\-DOPENSSL_USE_APPLINK/); -$cpuid_obj="" if ($processor eq "386"); + $bn_obj =~ s/\w+-gf2m.o// if (defined($disabled{ec2m})); -$bn_obj = $bn_asm unless $bn_obj ne ""; -# bn-586 is the only one implementing bn_*_part_words -$cflags.=" -DOPENSSL_BN_ASM_PART_WORDS" if ($bn_obj =~ /bn-586/); -$cflags.=" -DOPENSSL_IA32_SSE2" if (!$no_sse2 && $bn_obj =~ /86/); + # bn-586 is the only one implementing bn_*_part_words + $cflags.=" -DOPENSSL_BN_ASM_PART_WORDS" if ($bn_obj =~ /bn-586/); + $cflags.=" -DOPENSSL_IA32_SSE2" if (!$no_sse2 && $bn_obj =~ /86/); -$cflags.=" -DOPENSSL_BN_ASM_MONT" if ($bn_obj =~ /-mont/); -$cflags.=" -DOPENSSL_BN_ASM_MONT5" if ($bn_obj =~ /-mont5/); -$cflags.=" -DOPENSSL_BN_ASM_GF2m" if ($bn_obj =~ /-gf2m/); + $cflags.=" -DOPENSSL_BN_ASM_MONT" if ($bn_obj =~ /-mont/); + $cflags.=" -DOPENSSL_BN_ASM_MONT5" if ($bn_obj =~ /-mont5/); + $cflags.=" -DOPENSSL_BN_ASM_GF2m" if ($bn_obj =~ /-gf2m/); -if ($fips) - { + if ($fips) { $openssl_other_defines.="#define OPENSSL_FIPS\n"; - } + } -$cpuid_obj="mem_clr.o" unless ($cpuid_obj =~ /\.o$/); -$des_obj=$des_enc unless ($des_obj =~ /\.o$/); -$bf_obj=$bf_enc unless ($bf_obj =~ /\.o$/); -$cast_obj=$cast_enc unless ($cast_obj =~ /\.o$/); -$rc4_obj=$rc4_enc unless ($rc4_obj =~ /\.o$/); -$rc5_obj=$rc5_enc unless ($rc5_obj =~ /\.o$/); -if ($sha1_obj =~ /\.o$/) - { -# $sha1_obj=$sha1_enc; + if ($sha1_obj =~ /\.o$/) { $cflags.=" -DSHA1_ASM" if ($sha1_obj =~ /sx86/ || $sha1_obj =~ /sha1/); $cflags.=" -DSHA256_ASM" if ($sha1_obj =~ /sha256/); $cflags.=" -DSHA512_ASM" if ($sha1_obj =~ /sha512/); - if ($sha1_obj =~ /sse2/) - { if ($no_sse2) - { $sha1_obj =~ s/\S*sse2\S+//; } - elsif ($cflags !~ /OPENSSL_IA32_SSE2/) - { $cflags.=" -DOPENSSL_IA32_SSE2"; } + if ($sha1_obj =~ /sse2/) { + if ($no_sse2) { + $sha1_obj =~ s/\S*sse2\S+//; + } elsif ($cflags !~ /OPENSSL_IA32_SSE2/) { + $cflags.=" -DOPENSSL_IA32_SSE2"; } } -if ($md5_obj =~ /\.o$/) - { -# $md5_obj=$md5_enc; + } + if ($md5_obj =~ /\.o$/) { $cflags.=" -DMD5_ASM"; - } -if ($rmd160_obj =~ /\.o$/) - { -# $rmd160_obj=$rmd160_enc; + } + $cast_obj=$table{BASE}->{cast_obj} if (!$no_shared); # CAST assembler is not PIC + if ($rmd160_obj =~ /\.o$/) { $cflags.=" -DRMD160_ASM"; - } -if ($aes_obj =~ /\.o$/) - { + } + if ($aes_obj =~ /\.o$/) { $cflags.=" -DAES_ASM" if ($aes_obj =~ m/\baes\-/);; # aes-ctr.o is not a real file, only indication that assembler # module implements AES_ctr32_encrypt... @@ -1419,32 +1097,22 @@ if ($aes_obj =~ /\.o$/) $aes_obj =~ s/\s*(vpaes|aesni)\-x86\.o//g if ($no_sse2); $cflags.=" -DVPAES_ASM" if ($aes_obj =~ m/vpaes/); $cflags.=" -DBSAES_ASM" if ($aes_obj =~ m/bsaes/); - } -else { - $aes_obj=$aes_enc; - } -$wp_obj="" if ($wp_obj =~ /mmx/ && $processor eq "386"); -if ($wp_obj =~ /\.o$/ && !$disabled{"whirlpool"}) - { + } + if ($wp_obj =~ /mmx/ && $processor eq "386") { + $wp_obj=$table{BASE}->{wp_obj}; + } elsif (!$disabled{"whirlpool"}) { $cflags.=" -DWHIRLPOOL_ASM"; - } -else { - $wp_obj="wp_block.o"; - } -$cmll_obj=$cmll_enc unless ($cmll_obj =~ /.o$/); -if ($modes_obj =~ /ghash\-/) - { + } + if ($modes_obj =~ /ghash\-/) { $cflags.=" -DGHASH_ASM"; - } -if ($ec_obj =~ /ecp_nistz256/) - { + } + if ($ec_obj =~ /ecp_nistz256/) { $cflags.=" -DECP_NISTZ256_ASM"; - } -$chacha_obj=$chacha_enc unless ($chacha_obj =~ /\.o$/); -if ($poly1305_obj =~ /\.o$/) - { + } + if ($poly1305_obj =~ /\.o$/) { $cflags.=" -DPOLY1305_ASM"; - } + } +} # "Stringify" the C flags string. This permits it to be made part of a string # and works as well on command lines. @@ -1771,7 +1439,6 @@ while () ($export_var_as_fn)?"define":"undef"; } elsif (/^#define\s+OPENSSL_UNISTD/) { - $unistd = "" if $unistd eq ""; print OUT "#define OPENSSL_UNISTD $unistd\n"; } elsif (/^#((define)|(undef))\s+SIXTY_FOUR_BIT_LONG/)