[openssl] master update

Richard Levitte levitte at openssl.org
Sun Jun 28 16:45:01 UTC 2020


The branch master has been updated
       via  c9741726c1d3476beed071005770a71464f273b9 (commit)
       via  16b0e0fcb32f553b9302db997045950c6af5f805 (commit)
       via  180626159e31f04021fdb20b48b1e61b62a06073 (commit)
       via  bfa684622af3f50acefb32ed5e5f252240e1fe44 (commit)
       via  019e3a0b6b34ee0fdd8796a65ec99f5d11a2b7eb (commit)
       via  2f44c8151e4214174c6aa23731df643c40db38cd (commit)
       via  e39795af0a871a0bd560838ce54610a34c92fb49 (commit)
       via  081436bf732c0889b2649426df4e1c23c671d6d7 (commit)
       via  a3310b182ca3952c2876792b35035b54a4c77713 (commit)
       via  48704cc651b937bf2e265aeaae55d44c9ed81e55 (commit)
       via  69aa579e6d349fa25de9b4959e578005b86def4c (commit)
       via  33d5b4a68ade2cb51513907ee0b57f146857ede5 (commit)
       via  4901b570ba13bad06a6418a636f6bdf98585a753 (commit)
      from  92db29e5e8c26af79f740dfd3bddfeae9b5345a8 (commit)


- Log -----------------------------------------------------------------
commit c9741726c1d3476beed071005770a71464f273b9
Author: Richard Levitte <levitte at openssl.org>
Date:   Wed Mar 4 15:02:29 2020 +0100

    Configurations: drop toolchain from configuration targets
    
    Some configuration targets pretend to be for a specific compiler, but
    are more widely usable, and should reflect that.
    
    [work in progress]
    
    Reviewed-by: Tim Hudson <tjh at openssl.org>
    (Merged from https://github.com/openssl/openssl/pull/11230)

commit 16b0e0fcb32f553b9302db997045950c6af5f805
Author: Richard Levitte <levitte at openssl.org>
Date:   Tue Mar 3 17:20:07 2020 +0100

    DOC: Mention Configure consistently
    
    'config' is now a mere wrapper for backward compatibility.
    All documentation is changed accordingly.
    
    Reviewed-by: Tim Hudson <tjh at openssl.org>
    (Merged from https://github.com/openssl/openssl/pull/11230)

commit 180626159e31f04021fdb20b48b1e61b62a06073
Author: Richard Levitte <levitte at openssl.org>
Date:   Tue Mar 3 15:04:42 2020 +0100

    Configure: pick up options from older 'config'
    
    These options were coded in util/perl/OpenSSL/config.pm, but that got
    removed when the OpenSSL::config::main() function was removed.  We're
    not putting them back, but in 'Configure'.
    
    Reviewed-by: Tim Hudson <tjh at openssl.org>
    (Merged from https://github.com/openssl/openssl/pull/11230)

commit bfa684622af3f50acefb32ed5e5f252240e1fe44
Author: Richard Levitte <levitte at openssl.org>
Date:   Tue Mar 3 14:33:19 2020 +0100

    util/perl/OpenSSL/config.pm: refactor guess_system()
    
    There's no reason to have two different tables, when we can simply
    detect if the tuple elements are code or scalar.  Furthermore, order
    is important in some cases, and that order is harder not to say
    impossible when maintaining two tables.
    
    Reviewed-by: Tim Hudson <tjh at openssl.org>
    (Merged from https://github.com/openssl/openssl/pull/11230)

commit 019e3a0b6b34ee0fdd8796a65ec99f5d11a2b7eb
Author: Richard Levitte <levitte at openssl.org>
Date:   Tue Mar 3 14:31:35 2020 +0100

    util/perl/OpenSSL/config.pm: remove expand() and use eval
    
    The strings we expand contain other variable references than just
    ${MACHINE}.  Instead of having to remember what to expand, we simply
    evaluate the string as a, well, string.
    
    Reviewed-by: Tim Hudson <tjh at openssl.org>
    (Merged from https://github.com/openssl/openssl/pull/11230)

commit 2f44c8151e4214174c6aa23731df643c40db38cd
Author: Richard Levitte <levitte at openssl.org>
Date:   Tue Mar 3 00:08:41 2020 +0100

    config: Turn into a simple wrapper
    
    Now that Configure called config.pm's functions directly, the 'config'
    script doesn't have much else to do than to pass arguments.
    
    Reviewed-by: Tim Hudson <tjh at openssl.org>
    (Merged from https://github.com/openssl/openssl/pull/11230)

commit e39795af0a871a0bd560838ce54610a34c92fb49
Author: Richard Levitte <levitte at openssl.org>
Date:   Tue Mar 3 00:01:35 2020 +0100

    util/perl/OpenSSL/config.pm: refactor map_guess()
    
    map_guess() is now table driven, just like get_system().
    Additionally, it now takes a config hash table and returns one of its
    own.  This way, 'Configure' can pass whatever it has already found to
    OpenSSL::config::get_platform(), and easily merge the returned hash
    table into its %config.
    
    This also gets rid of variables that we no longer need.  That includes
    $PERL and all the $__CNF_ environment variables.
    
    Reviewed-by: Tim Hudson <tjh at openssl.org>
    (Merged from https://github.com/openssl/openssl/pull/11230)

commit 081436bf732c0889b2649426df4e1c23c671d6d7
Author: Richard Levitte <levitte at openssl.org>
Date:   Tue Mar 3 00:06:52 2020 +0100

    util/perl/OpenSSL/config.pm, Configure: move check of target with compiler
    
    Previously, ./config would check if "$target-$CC", then "$target"
    exists and choose the one that does.  This is now moved to Configure.
    
    Reviewed-by: Tim Hudson <tjh at openssl.org>
    (Merged from https://github.com/openssl/openssl/pull/11230)

commit a3310b182ca3952c2876792b35035b54a4c77713
Author: Richard Levitte <levitte at openssl.org>
Date:   Mon Mar 2 23:14:09 2020 +0100

    util/perl/OpenSSL/config.pm: Rework determining compiler information
    
    determine_compiler_settings() has been refactored to:
    
    - find a compiler if none has been given by the user
    - allow platform specific overrides, but only when the user didn't
      already specify a desired compiler
    - figure out the compiler vendor and version, making sure that the
      version number is deterministic
    - gather platform specific compiler information
    
    Reviewed-by: Tim Hudson <tjh at openssl.org>
    (Merged from https://github.com/openssl/openssl/pull/11230)

commit 48704cc651b937bf2e265aeaae55d44c9ed81e55
Author: Richard Levitte <levitte at openssl.org>
Date:   Mon Mar 2 23:01:25 2020 +0100

    Remove OpenSSL::config::main(), it's not necessary
    
    This also remove all option parsing.  We leave that to Configure.
    
    Reviewed-by: Tim Hudson <tjh at openssl.org>
    (Merged from https://github.com/openssl/openssl/pull/11230)

commit 69aa579e6d349fa25de9b4959e578005b86def4c
Author: Richard Levitte <levitte at openssl.org>
Date:   Mon Mar 2 18:42:30 2020 +0100

    util/perl/OpenSSL/config.pm: Prefer POSIX::uname() over piping the command
    
    POSIX::uname() has the advantage to work on non-POSIX systems as well,
    such as the Windows command prompt and VMS.
    
    Reviewed-by: Tim Hudson <tjh at openssl.org>
    (Merged from https://github.com/openssl/openssl/pull/11230)

commit 33d5b4a68ade2cb51513907ee0b57f146857ede5
Author: Richard Levitte <levitte at openssl.org>
Date:   Mon Mar 2 18:38:07 2020 +0100

    util/perl/OpenSSL/config.pm: Don't detect removed directories in
    
    This is much better handled in Configure.
    
    [There's another PR moving this to Configure, so this commit should
    eventually disappear because rebase]
    
    Reviewed-by: Tim Hudson <tjh at openssl.org>
    (Merged from https://github.com/openssl/openssl/pull/11230)

commit 4901b570ba13bad06a6418a636f6bdf98585a753
Author: Rich Salz <rsalz at akamai.com>
Date:   Mon Feb 3 21:41:20 2020 -0500

    Initial rewrite of config as a Perl module
    
    - Use $^X; to find perl.
    - Big re-ordering: Put all variables at the top, move most inline code into
      functions. The heart of the script now basically just calls
      functions to do its work.
    - Unify warning text, add -w option
    - Don't use needless (subshells)
    - Ensure Windows gets a VC-xxx option
    - Make config a perl module
    - Top-level "config" command-line is a dummy that just calls the module.
      Added module stuff so that it can be called from Configure.
    
    Reviewed-by: Tim Hudson <tjh at openssl.org>
    Reviewed-by: Richard Levitte <levitte at openssl.org>
    (Merged from https://github.com/openssl/openssl/pull/11230)

-----------------------------------------------------------------------

Summary of changes:
 CHANGES.md                  |   7 +
 Configurations/10-main.conf |  12 +-
 Configure                   |  63 ++-
 HACKING                     |   2 +-
 INSTALL.md                  | 129 +++---
 NOTES.ANDROID               |  42 +-
 NOTES.UNIX                  |   4 +-
 NOTES.WIN                   |   2 +-
 config                      | 922 +------------------------------------------
 util/perl/OpenSSL/config.pm | 929 ++++++++++++++++++++++++++++++++++++++++++++
 10 files changed, 1085 insertions(+), 1027 deletions(-)
 create mode 100755 util/perl/OpenSSL/config.pm

diff --git a/CHANGES.md b/CHANGES.md
index 7da5ccd55c..585a451d18 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -23,6 +23,13 @@ OpenSSL 3.0
 
 ### Changes between 1.1.1 and 3.0 [xx XXX xxxx]
 
+ * 'Configure' has been changed to figure out the configuration target if
+   none is given on the command line.  Consequently, the 'config' script is
+   now only a mere wrapper.  All documentation is changed to only mention
+   'Configure'.
+
+   *Rich Salz and Richard Levitte*
+
  * Added a library context that applications as well as other
    libraries can use to form a separate context within which libcrypto
    operations are performed.
diff --git a/Configurations/10-main.conf b/Configurations/10-main.conf
index 0313ad0a37..c30954f27d 100644
--- a/Configurations/10-main.conf
+++ b/Configurations/10-main.conf
@@ -1577,7 +1577,8 @@ my %targets = (
     # Option "freeze" such as -std=gnu9x can't negatively interfere
     # with future defaults for below two targets, because MacOS X
     # for PPC has no future, it was discontinued by vendor in 2009.
-    "darwin-ppc-cc" => {
+    "darwin-ppc-cc" => { inherit_from => [ "darwin-ppc" ] }, # Historic alias
+    "darwin-ppc" => {
         inherit_from     => [ "darwin-common" ],
         cflags           => add("-arch ppc -std=gnu9x -Wa,-force_cpusubtype_ALL"),
         lib_cppflags     => add("-DB_ENDIAN"),
@@ -1585,7 +1586,8 @@ my %targets = (
         asm_arch         => 'ppc32',
         perlasm_scheme   => "osx32",
     },
-    "darwin64-ppc-cc" => {
+    "darwin64-ppc-cc" => { inherit_from => [ "darwin64-ppc" ] }, # Historic alias
+    "darwin64-ppc" => {
         inherit_from     => [ "darwin-common" ],
         cflags           => add("-arch ppc64 -std=gnu9x"),
         lib_cppflags     => add("-DB_ENDIAN"),
@@ -1593,7 +1595,8 @@ my %targets = (
         asm_arch         => 'ppc64',
         perlasm_scheme   => "osx64",
     },
-    "darwin-i386-cc" => {
+    "darwin-i386-cc" => { inherit_from => [ "darwin-i386" ] }, # Historic alias
+    "darwin-i386" => {
         inherit_from     => [ "darwin-common" ],
         CFLAGS           => add(picker(release => "-fomit-frame-pointer")),
         cflags           => add("-arch i386"),
@@ -1602,7 +1605,8 @@ my %targets = (
         asm_arch         => 'x86',
         perlasm_scheme   => "macosx",
     },
-    "darwin64-x86_64-cc" => {
+    "darwin64-x86_64-cc" => { inherit_from => [ "darwin64-x86_64" ] }, # Historic alias
+    "darwin64-x86_64" => {
         inherit_from     => [ "darwin-common" ],
         CFLAGS           => add("-Wall"),
         cflags           => add("-arch x86_64"),
diff --git a/Configure b/Configure
index a0b9c22b6d..3129a23f9d 100755
--- a/Configure
+++ b/Configure
@@ -20,6 +20,7 @@ use File::Path qw/mkpath/;
 use OpenSSL::fallback "$FindBin::Bin/external/perl/MODULES.txt";
 use OpenSSL::Glob;
 use OpenSSL::Template;
+use OpenSSL::config;
 
 # see INSTALL.md for instructions.
 
@@ -204,6 +205,11 @@ my $apitable = {
     "0.9.8" =>   908,
 };
 
+# For OpenSSL::config::get_platform
+my %guess_opts = ();
+
+my $dryrun = 0;
+
 our %table = ();
 our %config = ();
 our %withargs = ();
@@ -608,8 +614,6 @@ while ((my $first, my $second) = (shift @list, shift @list)) {
 # To remove something from %disabled, use "enable-foo".
 # For symmetry, "disable-foo" is a synonym for "no-foo".
 
-&usage if ($#ARGV < 0);
-
 # For the "make variables" CPPINCLUDES and CPPDEFINES, we support lists with
 # platform specific list separators.  Users from those platforms should
 # recognise those separators from how you set up the PATH to find executables.
@@ -835,6 +839,22 @@ while (@argvcopy)
                 # No longer an automatic choice
                 $auto_threads = 0 if ($1 eq "threads");
                 }
+        elsif (/^-d$/)          # From older 'config'
+                {
+                $config{build_type} = "debug";
+                }
+        elsif (/^-v$/)          # From older 'config'
+                {
+                $guess_opts{verbose} = 1;
+                }
+        elsif (/^-w$/)          # From older 'config'
+                {
+                $guess_opts{nowait} = 1;
+                }
+        elsif (/^-t$/)          # From older 'config'
+                {
+                $dryrun = 1;
+                }
         elsif (/^--strict-warnings$/)
                 {
                 # Pretend that our strict flags is a C flag, and replace it
@@ -1068,6 +1088,23 @@ if (grep { /-rpath\b/ } ($user{LDFLAGS} ? @{$user{LDFLAGS}} : ())
         "***** any of asan, msan or ubsan\n";
 }
 
+# If no target was given, try guessing.
+unless ($target) {
+    my %system_config = OpenSSL::config::get_platform(%guess_opts, %user);
+
+    # The $system_config{disable} is used to populate %disabled with
+    # entries that aren't already there.
+    foreach ( @{$system_config{disable} // []} ) {
+        $disabled{$_} = 'system' unless defined $disabled{$_};
+    }
+    delete $system_config{disable};
+
+    # Override config entries with stuff from the guesser.
+    # It's assumed that this really is nothing new.
+    %config = ( %config, %system_config );
+    $target = $system_config{target};
+}
+
 sub disable {
     my $disable_type = shift;
 
@@ -1166,7 +1203,26 @@ if ($d) {
     }
 }
 
-&usage if !$table{$target} || $table{$target}->{template};
+if ($target) {
+    # It's possible that we have different config targets for specific
+    # toolchains, so we try to detect them, and go for the plain config
+    # target if not.
+    my $found;
+    foreach ( ( "$target-$user{CC}", "$target", undef ) ) {
+        $found=$_ if $table{$_} && !$table{$_}->{template};
+        last if $found;
+    }
+    $target = $found;
+} else {
+    # If we don't have a config target now, we try the C compiler as we
+    # fallback
+    my $cc = $user{CC} // 'cc';
+    $target = $cc if $table{$cc} && !$table{$cc}->{template};
+}
+
+&usage unless $target;
+
+exit 0 if $dryrun;              # From older 'config'
 
 $config{target} = $target;
 my %target = resolve_config($target);
@@ -2994,7 +3050,6 @@ sub usage
                         }
                 print STDERR $i . " ";
                 }
-        print STDERR "\n\nNOTE: If in doubt, on Unix-ish systems use './config'.\n";
         exit(1);
         }
 
diff --git a/HACKING b/HACKING
index a9e39d0258..abf199f541 100644
--- a/HACKING
+++ b/HACKING
@@ -8,7 +8,7 @@
 
  After that perform the following steps:
 
-    ./config -Werror --strict-warnings [your-options]
+    ./Configure -Werror --strict-warnings [your-options]
     make update
     make
     make test
diff --git a/INSTALL.md b/INSTALL.md
index 445c28b127..b6106ba6d2 100644
--- a/INSTALL.md
+++ b/INSTALL.md
@@ -151,7 +151,7 @@ OpenSSL for production use.
 
 ### Unix / Linux / macOS
 
-    $ ./config
+    $ ./Configure
     $ make
     $ make test
 
@@ -159,7 +159,7 @@ OpenSSL for production use.
 
 Use the following commands to build OpenSSL:
 
-    $ @config
+    $ perl Configure
     $ mms
     $ mms test
 
@@ -168,7 +168,7 @@ Use the following commands to build OpenSSL:
 If you are using Visual Studio, open a Developer Command Prompt and
 and issue the following commands to build OpenSSL.
 
-    $ perl Configure { VC-WIN32 | VC-WIN64A | VC-WIN64I | VC-CE }
+    $ perl Configure
     $ nmake
     $ nmake test
 
@@ -262,16 +262,16 @@ for 32bit binaries on 64bit Windows (WOW64).
 #### Installing to a different location
 
 To install OpenSSL to a different location (for example into your home
-directory for testing purposes) run config as shown in the following
+directory for testing purposes) run Configure as shown in the following
 examples.
 
 On Unix:
 
-    $ ./config --prefix=/opt/openssl --openssldir=/usr/local/ssl
+    $ ./Configure --prefix=/opt/openssl --openssldir=/usr/local/ssl
 
 On OpenVMS:
 
-    $ @config --prefix=PROGRAM:[INSTALLS] --openssldir=SYS$MANAGER:[OPENSSL]
+    $ perl Configure --prefix=PROGRAM:[INSTALLS] --openssldir=SYS$MANAGER:[OPENSSL]
 
 Note: if you do add options to the configuration command, please make sure
 you've read more than just this Quick Start, such as relevant `NOTES.*` files,
@@ -281,10 +281,10 @@ in otherwise unexpected ways.
 Configuration Options
 =====================
 
-There are several options to ./config (or ./Configure) to customize
-the build (note that for Windows, the defaults for `--prefix` and
-`--openssldir` depend in what configuration is used and what Windows
-implementation OpenSSL is built on.  More notes on this in NOTES.WIN):
+There are several options to ./Configure to customize the build (note that
+for Windows, the defaults for `--prefix` and `--openssldir` depend in what
+configuration is used and what Windows implementation OpenSSL is built on.
+More notes on this in NOTES.WIN):
 
 API Level
 ---------
@@ -311,20 +311,22 @@ Cross Compile Prefix
 
 The PREFIX to include in front of commands for your toolchain.
 
-It is likely to have to end with dash, e.g.  a-b-c- would invoke GNU compiler as
-a-b-c-gcc, etc.  Unfortunately cross-compiling is too case-specific to put
+It is likely to have to end with dash, e.g.  a-b-c- would invoke GNU compiler
+as a-b-c-gcc, etc.  Unfortunately cross-compiling is too case-specific to put
 together one-size-fits-all instructions.  You might have to pass more flags or
-set up environment variables to actually make it work.  Android and iOS cases are
-discussed in corresponding `Configurations/15-*.conf` files.  But there are cases
-when this option alone is sufficient.  For example to build the mingw64 target on
-Linux `--cross-compile-prefix=x86_64-w64-mingw32-` works.  Naturally provided
-that mingw packages are installed.  Today Debian and Ubuntu users have option to
-install a number of prepackaged cross-compilers along with corresponding
-run-time and development packages for "alien" hardware.  To give another example
-`--cross-compile-prefix=mipsel-linux-gnu-` suffices in such case.  Needless to
-mention that you have to invoke `./Configure`, not `./config`, and pass your target
-name explicitly.  Also, note that `--openssldir` refers to target's file system,
-not one you are building on.
+set up environment variables to actually make it work.  Android and iOS cases
+are discussed in corresponding `Configurations/15-*.conf` files.  But there are
+cases when this option alone is sufficient.  For example to build the mingw64
+target on Linux `--cross-compile-prefix=x86_64-w64-mingw32-` works.  Naturally
+provided that mingw packages are installed.  Today Debian and Ubuntu users
+have option to install a number of prepackaged cross-compilers along with
+corresponding run-time and development packages for "alien" hardware.  To give
+another example `--cross-compile-prefix=mipsel-linux-gnu-` suffices in such
+case.
+
+For cross compilation, you must [configure manually](#manual-configuration).
+Also, note that `--openssldir` refers to target's file system, not one you are
+building on.
 
 Build Type
 ----------
@@ -1026,7 +1028,7 @@ configuration.  The following variables are supported:
 These cannot be mixed with compiling/linking flags given on the command line.
 In other words, something like this isn't permitted.
 
-    $ ./config -DFOO CPPFLAGS=-DBAR -DCOOKIE
+    $ ./Configure -DFOO CPPFLAGS=-DBAR -DCOOKIE
 
 Backward compatibility note:
 
@@ -1038,11 +1040,11 @@ for the following:
 
 For example, the following command will not see -DBAR:
 
-    $ CPPFLAGS=-DBAR ./config -DCOOKIE
+    $ CPPFLAGS=-DBAR ./Configure -DCOOKIE
 
 However, the following will see both set variables:
 
-    $ CC=gcc CROSS_COMPILE=x86_64-w64-mingw32- ./config -DCOOKIE
+    $ CC=gcc CROSS_COMPILE=x86_64-w64-mingw32- ./Configure -DCOOKIE
 
 If CC is set, it is advisable to also set CXX to ensure both the C and C++
 compiler are in the same "family".  This becomes relevant with
@@ -1055,15 +1057,14 @@ compiler are in the same "family".  This becomes relevant with
 
 Reconfigure from earlier data.
 
-This fetches the previous command line options and environment from data saved
-in "configdata.pm" and runs the configuration process again, using these
-options and environment.  Note: NO other option is permitted together with
-"reconf".  This means that you also MUST use "./Configure" (or what corresponds
-to that on non-Unix platforms) directly to invoke this option.  Note: The
-original configuration saves away values for ALL environment variables that were
-used, and if they weren't defined, they are still saved away with information
-that they weren't originally defined.  This information takes precedence over
-environment variables that are defined when reconfiguring.
+This fetches the previous command line options and environment from data
+saved in "configdata.pm" and runs the configuration process again, using
+these options and environment.  Note: NO other option is permitted together
+with "reconf".  Note: The original configuration saves away values for ALL
+environment variables that were used, and if they weren't defined, they are
+still saved away with information that they weren't originally defined.
+This information takes precedence over environment variables that are
+defined when reconfiguring.
 
 Displaying configuration data
 -----------------------------
@@ -1097,42 +1098,26 @@ script.
 
 #### Unix / Linux / macOS
 
-    $ ./config [[ options ]]
+    $ ./Configure [[ options ]]
 
 #### OpenVMS
 
-    $ @config [[ options ]]
+    $ perl Configure [[ options ]]
 
 #### Windows
 
-Automatic configuration is not available on Windows.
-
-For the remainder of this text, the Unix form will be used in all examples,
-please use the appropriate form for your platform.
-
-You can run
-
-    $ ./config -t
-
-to see whether your target is guessed correctly.  If you want to use a different
-compiler, you  are cross-compiling for another platform, or the ./config guess
-was wrong for other reasons, see the [Manual Configuration](#manual-configuration)
-section.  Oherwise continue with the [Build OpenSSL](#build-openssl) section below.
-
-On some systems, you can include debugging information as follows:
-
-      $ ./config -d [[ options ]]
+    $ perl Configure [[ options ]]
 
 ### Manual Configuration
 
 OpenSSL knows about a range of different operating system, hardware and
 compiler combinations.  To see the ones it knows about, run
 
-    $ ./Configure                                    # Unix
+    $ ./Configure LIST                               # Unix
 
 or
 
-    $ perl Configure                                 # All other platforms
+    $ perl Configure LIST                            # All other platforms
 
 For the remainder of this text, the Unix form will be used in all examples.
 Please use the appropriate form for your platform.
@@ -1171,29 +1156,21 @@ directory and invoking the configuration commands from there.
 
     $ mkdir /var/tmp/openssl-build
     $ cd /var/tmp/openssl-build
-    $ /PATH/TO/OPENSSL/SOURCE/config [[ options ]]
-
-or
-
-    $ /PATH/TO/OPENSSL/SOURCE/Configure {{ target }} [[ options ]]
+    $ /PATH/TO/OPENSSL/SOURCE/Configure [[ options ]]
 
 #### OpenVMS example
 
     $ set default sys$login:
     $ create/dir [.tmp.openssl-build]
     $ set default [.tmp.openssl-build]
-    $ @[PATH.TO.OPENSSL.SOURCE]config [[ options ]]
-
-or
-
-    $ @[PATH.TO.OPENSSL.SOURCE]Configure {{ target }} [[ options ]]
+    $ perl D:[PATH.TO.OPENSSL.SOURCE]Configure [[ options ]]
 
 #### Windows example
 
     $ C:
     $ mkdir \temp-openssl
     $ cd \temp-openssl
-    $ perl d:\PATH\TO\OPENSSL\SOURCE\Configure {{ target }} [[ options ]]
+    $ perl d:\PATH\TO\OPENSSL\SOURCE\Configure [[ options ]]
 
 Paths can be relative just as well as absolute.  Configure will do its best
 to translate them to relative paths whenever possible.
@@ -1356,8 +1333,7 @@ Environment Variables
 
 A number of environment variables can be used to provide additional control
 over the build process.  Typically these should be defined prior to running
-config or Configure.  Not all environment variables are relevant to all
-platforms.
+Configure.  Not all environment variables are relevant to all platforms.
 
     AR
                    The name of the ar executable to use.
@@ -1401,9 +1377,8 @@ platforms.
 
     PERL
                    The name of the Perl executable to use when building OpenSSL.
-                   This variable is used in config script only. Configure on the
-                   other hand imposes the interpreter by which it itself was
-                   executed on the whole build procedure.
+                   Only needed if builing should use a different Perl executable
+                   than what is used to run the Configure script.
 
     HASHBANGPERL
                    The command string for the Perl executable to insert in the
@@ -1557,14 +1532,14 @@ Configuration Problems
 
 ### Selecting the correct target
 
-The `./config` script tries hard to guess your operating system, but in some
+The `./Configure` script tries hard to guess your operating system, but in some
 cases it does not succeed. You will see a message like the following:
 
-    $ ./config
+    $ ./Configure
     Operating system: x86-whatever-minix
     This system (minix) is not supported. See file INSTALL for details.
 
-Even if the automatic target selection by the `./config` script fails, chances
+Even if the automatic target selection by the `./Configure` script fails, chances
 are that you still might find a suitable target in the Configurations directory,
 which you can supply to the `./Configure` command, possibly after some adjustment.
 
@@ -1586,7 +1561,7 @@ a Perl list `my %targets = ( ... )`.
     ...
     )
 
-If you call `.\Configure` without arguments, it will give you a list of all
+If you call `./Configure` without arguments, it will give you a list of all
 known targets. Using `grep`, you can lookup the target definition in the
 Configurations directory. For example the "android-x86_64" can be found in
 Configurations/15-android.conf.
@@ -1605,7 +1580,7 @@ More about our support resources can be found in the [SUPPORT][] file.
 
 ### Configuration Errors
 
-If the `./config` or `./Configure`  command fails with an error message,
+If the `./Configure` or `./Configure` command fails with an error message,
 read the error message carefully and try to figure out whether you made
 a mistake (e.g., by providing a wrong option), or whether the script is
 working incorrectly. If you think you encountered a bug, please
diff --git a/NOTES.ANDROID b/NOTES.ANDROID
index 57c1ee9d1b..0173eca73b 100644
--- a/NOTES.ANDROID
+++ b/NOTES.ANDROID
@@ -15,19 +15,22 @@
  Configuration
  -------------
 
- Android is a naturally cross-compiled target and you can't use ./config.
- You have to use ./Configure and name your target explicitly; there are
- android-arm, android-arm64, android-mips, android-mip64, android-x86
- and android-x86_64 (*MIPS targets are no longer supported with NDK R20+).
- Do not pass --cross-compile-prefix (as you might be tempted), as it will
- be "calculated" automatically based on chosen platform. Though you still
- need to know the prefix to extend your PATH, in order to invoke
- $(CROSS_COMPILE)clang [*gcc on NDK 19 and lower] and company. (Configure
- will fail and give you a hint if you get it wrong.) Apart from PATH
- adjustment you need to set ANDROID_NDK_ROOT environment to point at the
- NDK directory. If you're using a side-by-side NDK the path will look
- something like /some/where/android-sdk/ndk/<ver>, and for a standalone
- NDK the path will be something like /some/where/android-ndk-<ver>.
+ Android is a cross-compiled target and you can't rely on ./Configure
+ to find out the configuration target for you.  You have to name your
+ target explicitly; there are android-arm, android-arm64, android-mips,
+ android-mip64, android-x86 and android-x86_64 (*MIPS targets are no
+ longer supported with NDK R20+).
+
+ Do not pass --cross-compile-prefix (as you might be tempted), as it
+ will be "calculated" automatically based on chosen platform. However,
+ you still need to know the prefix to extend your PATH, in order to
+ invoke $(CROSS_COMPILE)clang [*gcc on NDK 19 and lower] and company.
+ (Configure will fail and give you a hint if you get it wrong.)
+
+ Apart from PATH adjustment you need to set ANDROID_NDK_ROOT environment
+ to point at the NDK directory. If you're using a side-by-side NDK the path
+ will look something like /some/where/android-sdk/ndk/<ver>, and for a
+ standalone NDK the path will be something like /some/where/android-ndk-<ver>.
  Both variables are significant at both configuration and compilation times.
  The NDK customarily supports multiple Android API levels, e.g. android-14,
  android-21, etc. By default latest API level is chosen. If you need to
@@ -35,13 +38,14 @@
  with N being the numerical value of the target platform version. For example,
  to compile for Android 10 arm64 with a side-by-side NDK r20.0.5594570
 
-	export ANDROID_NDK_ROOT=/home/whoever/Android/android-sdk/ndk/20.0.5594570
-	PATH=$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64/bin:$ANDROID_NDK_ROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin:$PATH
-	./Configure android-arm64 -D__ANDROID_API__=29
-	make
+    export ANDROID_NDK_ROOT=/home/whoever/Android/android-sdk/ndk/20.0.5594570
+    PATH=$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64/bin:$ANDROID_NDK_ROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin:$PATH
+    ./Configure android-arm64 -D__ANDROID_API__=29
+    make
 
- Older versions of the NDK have GCC under their common prebuilt tools directory, so the bin path
- will be slightly different. EG: to compile for ICS on ARM with NDK 10d:
+ Older versions of the NDK have GCC under their common prebuilt tools
+ directory, so the bin path will be slightly different. EG: to compile
+ for ICS on ARM with NDK 10d:
 
     export ANDROID_NDK_ROOT=/some/where/android-ndk-10d
     PATH=$ANDROID_NDK_ROOT/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin:$PATH
diff --git a/NOTES.UNIX b/NOTES.UNIX
index 6c291cbab6..0e3c099ea2 100644
--- a/NOTES.UNIX
+++ b/NOTES.UNIX
@@ -59,7 +59,7 @@
  used with the runtime shared library search path options, as shown in
  this example:
 
-    $ ./config --prefix=/usr/local/ssl --openssldir=/usr/local/ssl \
+    $ ./Configure --prefix=/usr/local/ssl --openssldir=/usr/local/ssl \
         '-Wl,-rpath,$(LIBRPATH)'
 
  On modern ELF based systems, there are two runtime search paths tags to
@@ -88,7 +88,7 @@
  Debian GNU/Linux systems rather than DT_RPATH is to tell the linker to
  set new dtags, like this:
 
-    $ ./config --prefix=/usr/local/ssl --openssldir=/usr/local/ssl \
+    $ ./Configure --prefix=/usr/local/ssl --openssldir=/usr/local/ssl \
         '-Wl,--enable-new-dtags,-rpath,$(LIBRPATH)'
 
  It might be worth noting that some/most ELF systems implement support
diff --git a/NOTES.WIN b/NOTES.WIN
index bc6e3d2c32..a5792647af 100644
--- a/NOTES.WIN
+++ b/NOTES.WIN
@@ -140,7 +140,7 @@
    or
      ./Configure mingw64 ...
    or
-     ./config ...
+     ./Configure ...
    for the default architecture.
 
    Apart from that, follow the Unix / Linux instructions in INSTALL.md.
diff --git a/config b/config
index 2e149ded7c..e194d4bde4 100755
--- a/config
+++ b/config
@@ -1,926 +1,10 @@
-#!/bin/sh
-# Copyright 1998-2020 The OpenSSL Project Authors. All Rights Reserved.
+#! /bin/sh
+# Copyright 2020 The OpenSSL Project Authors. All Rights Reserved.
 #
 # Licensed under the Apache License 2.0 (the "License").  You may not use
 # this file except in compliance with the License.  You can obtain a copy
 # in the file LICENSE in the source distribution or at
 # https://www.openssl.org/source/license.html
 
-# OpenSSL config: determine the operating system and run ./Configure
-# Derived from minarch and GuessOS from Apache.
-#
-# Do "config -h" for usage information.
-SUFFIX=""
-DRYRUN="false"
-VERBOSE="false"
-EXE=""
 THERE=`dirname $0`
-
-# pick up any command line args to config
-for i
-do
-case "$i" in
--d*) options=$options" --debug";;
--t*) DRYRUN="true" VERBOSE="true";;
--v*) VERBOSE="true";;
--h*) DRYRUN="true"; cat <<EOF
-Usage: config [options]
- -d	Build with debugging when possible.
- -t	Test mode, do not run the Configure perl script.
- -v	Verbose mode, show the exact Configure call that is being made.
- -h	This help.
-
-Any other text will be passed to the Configure perl script.
-See INSTALL for instructions.
-
-EOF
-;;
-*)  i=`echo "$i" | sed -e "s|'|'\\\\\\''|g"`
-    options="$options '$i'" ;;
-esac
-done
-
-# Environment that's being passed to Configure
-__CNF_CPPDEFINES=
-__CNF_CPPINCLUDES=
-__CNF_CPPFLAGS=
-__CNF_CFLAGS=
-__CNF_CXXFLAGS=
-__CNF_LDFLAGS=
-__CNF_LDLIBS=
-
-# First get uname entries that we use below
-
-[ "$MACHINE" ] || MACHINE=`(uname -m) 2>/dev/null` || MACHINE="unknown"
-[ "$RELEASE" ] || RELEASE=`(uname -r) 2>/dev/null` || RELEASE="unknown"
-[ "$SYSTEM" ] || SYSTEM=`(uname -s) 2>/dev/null`  || SYSTEM="unknown"
-[ "$BUILD" ] || VERSION=`(uname -v) 2>/dev/null` || VERSION="unknown"
-
-
-# Now test for ISC and SCO, since it is has a braindamaged uname.
-#
-# We need to work around FreeBSD 1.1.5.1
-(
-XREL=`uname -X 2>/dev/null | grep "^Release" | awk '{print $3}'`
-if [ "x$XREL" != "x" ]; then
-    if [ -f /etc/kconfig ]; then
-	case "$XREL" in
-	    4.0|4.1)
-		    echo "${MACHINE}-whatever-isc4"; exit 0
-		;;
-	esac
-    else
-	case "$XREL" in
-	    3.2v4.2)
-		echo "whatever-whatever-sco3"; exit 0
-		;;
-	    3.2v5.0*)
-		echo "whatever-whatever-sco5"; exit 0
-		;;
-	    4.2MP)
-		case "x${VERSION}" in
-		    x2.0*) echo "whatever-whatever-unixware20"; exit 0 ;;
-		    x2.1*) echo "whatever-whatever-unixware21"; exit 0 ;;
-		    x2*)   echo "whatever-whatever-unixware2";  exit 0 ;;
-		esac
-		;;
-	    4.2)
-		echo "whatever-whatever-unixware1"; exit 0
-		;;
-	    5*)
-		case "x${VERSION}" in
-		    # We hardcode i586 in place of ${MACHINE} for the
-		    # following reason. The catch is that even though Pentium
-		    # is minimum requirement for platforms in question,
-		    # ${MACHINE} gets always assigned to i386. Now, problem
-		    # with i386 is that it makes ./config pass 386 to
-		    # ./Configure, which in turn makes make generate
-		    # inefficient SHA-1 (for this moment) code.
-		    x[678]*)  echo "i586-sco-unixware7"; exit 0 ;;
-		esac
-		;;
-	esac
-    fi
-fi
-# Now we simply scan though... In most cases, the SYSTEM info is enough
-#
-case "${SYSTEM}:${RELEASE}:${VERSION}:${MACHINE}" in
-    A/UX:*)
-	echo "m68k-apple-aux3"; exit 0
-	;;
-
-    AIX:[3-9]:4:*)
-	echo "${MACHINE}-ibm-aix"; exit 0
-	;;
-
-    AIX:*:[5-9]:*)
-	echo "${MACHINE}-ibm-aix"; exit 0
-	;;
-
-    AIX:*)
-	echo "${MACHINE}-ibm-aix3"; exit 0
-	;;
-
-    HI-UX:*)
-	echo "${MACHINE}-hi-hiux"; exit 0
-	;;
-
-    HP-UX:*)
-	HPUXVER=`echo ${RELEASE}|sed -e 's/[^.]*.[0B]*//'`
-	case "$HPUXVER" in
-	    1[0-9].*)	# HPUX 10 and 11 targets are unified
-		echo "${MACHINE}-hp-hpux1x"; exit 0
-		;;
-	    *)
-		echo "${MACHINE}-hp-hpux"; exit 0
-		;;
-	esac
-	;;
-
-    IRIX:6.*)
-	echo "mips3-sgi-irix"; exit 0
-	;;
-
-    IRIX64:*)
-	echo "mips4-sgi-irix64"; exit 0
-	;;
-
-    Linux:[2-9].*)
-	echo "${MACHINE}-whatever-linux2"; exit 0
-	;;
-
-    Linux:1.*)
-	echo "${MACHINE}-whatever-linux1"; exit 0
-	;;
-
-    GNU*)
-	echo "hurd-x86"; exit 0;
-	;;
-
-    LynxOS:*)
-	echo "${MACHINE}-lynx-lynxos"; exit 0
-	;;
-
-    BSD/OS:4.*)  # BSD/OS always says 386
-	echo "i486-whatever-bsdi4"; exit 0
-	;;
-
-    BSD/386:*:*:*486*|BSD/OS:*:*:*:*486*)
-        case `/sbin/sysctl -n hw.model` in
-	    Pentium*)
-                echo "i586-whatever-bsdi"; exit 0
-                ;;
-            *)
-                echo "i386-whatever-bsdi"; exit 0
-                ;;
-            esac;
-	;;
-
-    BSD/386:*|BSD/OS:*)
-	echo "${MACHINE}-whatever-bsdi"; exit 0
-	;;
-
-    FreeBSD:*:*:*386*)
-        VERS=`echo ${RELEASE} | sed -e 's/[-(].*//'`
-        MACH=`sysctl -n hw.model`
-        ARCH='whatever'
-        case ${MACH} in
-           *386*       ) MACH="i386"     ;;
-           *486*       ) MACH="i486"     ;;
-           Pentium\ II*) MACH="i686"     ;;
-           Pentium*    ) MACH="i586"     ;;
-           *           ) MACH="$MACHINE" ;;
-        esac
-        case ${MACH} in
-           i[0-9]86 ) ARCH="pc" ;;
-        esac
-        echo "${MACH}-${ARCH}-freebsd${VERS}"; exit 0
-        ;;
-
-    DragonFly:*)
-	echo "${MACHINE}-whatever-dragonfly"; exit 0
-	;;
-
-    FreeBSD:*)
-	echo "${MACHINE}-whatever-freebsd"; exit 0
-	;;
-
-    Haiku:*)
-	echo "${MACHINE}-whatever-haiku"; exit 0
-	;;
-
-    NetBSD:*:*:*386*)
-        echo "`(/usr/sbin/sysctl -n hw.model || /sbin/sysctl -n hw.model) | sed 's,.*\(.\)86-class.*,i\186,'`-whatever-netbsd"; exit 0
-	;;
-
-    NetBSD:*)
-	echo "${MACHINE}-whatever-netbsd"; exit 0
-	;;
-
-    OpenBSD:*)
-	echo "${MACHINE}-whatever-openbsd"; exit 0
-	;;
-
-    OpenUNIX:*)
-	echo "${MACHINE}-unknown-OpenUNIX${VERSION}"; exit 0
-	;;
-
-    OSF1:*:*:*alpha*)
-	OSFMAJOR=`echo ${RELEASE}| sed -e 's/^V\([0-9]*\)\..*$/\1/'`
-	case "$OSFMAJOR" in
-	    4|5)
-		echo "${MACHINE}-dec-tru64"; exit 0
-		;;
-	    1|2|3)
-		echo "${MACHINE}-dec-osf"; exit 0
-		;;
-	    *)
-		echo "${MACHINE}-dec-osf"; exit 0
-		;;
-	esac
-	;;
-
-    Paragon*:*:*:*)
-	echo "i860-intel-osf1"; exit 0
-	;;
-
-    Rhapsody:*)
-	echo "ppc-apple-rhapsody"; exit 0
-	;;
-
-    Darwin:*)
-	case "$MACHINE" in
-	    Power*)
-		echo "ppc-apple-darwin${VERSION}"
-		;;
-	    x86_64)
-		echo "x86_64-apple-darwin${VERSION}"
-		;;
-	    *)
-		echo "i686-apple-darwin${VERSION}"
-		;;
-	esac
-	exit 0
-	;;
-
-    SunOS:5.*)
-	echo "${MACHINE}-whatever-solaris2"; exit 0
-	;;
-
-    SunOS:*)
-	echo "${MACHINE}-sun-sunos4"; exit 0
-	;;
-
-    UNIX_System_V:4.*:*)
-	echo "${MACHINE}-whatever-sysv4"; exit 0
-	;;
-
-    VOS:*:*:i786)
-     echo "i386-stratus-vos"; exit 0
-     ;;
-
-    VOS:*:*:*)
-     echo "hppa1.1-stratus-vos"; exit 0
-     ;;
-
-    *:4*:R4*:m88k)
-	echo "${MACHINE}-whatever-sysv4"; exit 0
-	;;
-
-    DYNIX/ptx:4*:*)
-	echo "${MACHINE}-whatever-sysv4"; exit 0
-	;;
-
-    *:4.0:3.0:3[34]?? | *:4.0:3.0:3[34]??,*)
-	echo "i486-ncr-sysv4"; exit 0
-	;;
-
-    ULTRIX:*)
-	echo "${MACHINE}-unknown-ultrix"; exit 0
-	;;
-
-    POSIX-BC*)
-	echo "${MACHINE}-siemens-sysv4"; exit 0   # Here, $MACHINE == "BS2000"
-	;;
-
-    machten:*)
-       echo "${MACHINE}-tenon-${SYSTEM}"; exit 0;
-       ;;
-
-    library:*)
-	echo "${MACHINE}-ncr-sysv4"; exit 0
-	;;
-
-    ConvexOS:*:11.0:*)
-	echo "${MACHINE}-v11-${SYSTEM}"; exit 0;
-	;;
-
-    # The following combinations are supported
-    # MINGW64* on x86_64 => mingw64
-    # MINGW32* on x86_64 => mingw
-    # MINGW32* on i?86 => mingw
-    #
-    # MINGW64* on i?86 isn't expected to work...
-    MINGW64*:*:*:x86_64)
-	echo "${MACHINE}-whatever-mingw64"; exit 0;
-	;;
-    MINGW*)
-	echo "${MACHINE}-whatever-mingw"; exit 0;
-	;;
-    CYGWIN*)
-	echo "${MACHINE}-pc-cygwin"; exit 0
-	;;
-
-    vxworks*)
-       echo "${MACHINE}-whatever-vxworks"; exit 0;
-       ;;
-esac
-
-#
-# Ugg. These are all we can determine by what we know about
-# the output of uname. Be more creative:
-#
-
-# Do the Apollo stuff first. Here, we just simply assume
-# that the existence of the /usr/apollo directory is proof
-# enough
-if [ -d /usr/apollo ]; then
-    echo "whatever-apollo-whatever"
-    exit 0
-fi
-
-# At this point we gone through all the one's
-# we know of: Punt
-
-echo "${MACHINE}-whatever-${SYSTEM}"
-exit 0
-) 2>/dev/null | (
-
-# ---------------------------------------------------------------------------
-# this is where the translation occurs into SSLeay terms
-# ---------------------------------------------------------------------------
-
-# Only set CC if not supplied already
-if [ -z "$CROSS_COMPILE$CC" ]; then
-  GCCVER=`sh -c "gcc -dumpversion" 2>/dev/null`
-  if [ "$GCCVER" != "" ]; then
-    # then strip off whatever prefix egcs prepends the number with...
-    # Hopefully, this will work for any future prefixes as well.
-    GCCVER=`echo $GCCVER | LC_ALL=C sed 's/^[a-zA-Z]*\-//'`
-    # Since gcc 3.1 gcc --version behaviour has changed.  gcc -dumpversion
-    # does give us what we want though, so we use that.  We just just the
-    # major and minor version numbers.
-    # peak single digit before and after first dot, e.g. 2.95.1 gives 29
-    GCCVER=`echo $GCCVER | sed 's/\([0-9]\)\.\([0-9]\).*/\1\2/'`
-    CC=gcc
-  else
-    CC=cc
-  fi
-fi
-GCCVER=${GCCVER:-0}
-if [ "$SYSTEM" = "HP-UX" ];then
-  # By default gcc is a ILP32 compiler (with long long == 64).
-  GCC_BITS="32"
-  if [ $GCCVER -ge 30 ]; then
-    # PA64 support only came in with gcc 3.0.x.
-    # We check if the preprocessor symbol __LP64__ is defined...
-    if echo "__LP64__" | gcc -v -E -x c - 2>/dev/null | grep "^__LP64__" 2>&1 > /dev/null; then
-      : # __LP64__ has slipped through, it therefore is not defined
-    else
-      GCC_BITS="64"
-    fi
-  fi
-fi
-if [ "$SYSTEM" = "SunOS" ]; then
-  if [ $GCCVER -ge 30 ]; then
-    # 64-bit ABI isn't officially supported in gcc 3.0, but it appears
-    # to be working, at the very least 'make test' passes...
-    if gcc -v -E -x c /dev/null 2>&1 | grep __arch64__ > /dev/null; then
-      GCC_ARCH="-m64"
-    else
-      GCC_ARCH="-m32"
-    fi
-  fi
-  # check for WorkShop C, expected output is "cc: blah-blah C x.x"
-  CCVER=`(cc -V 2>&1) 2>/dev/null | \
-  	egrep -e '^cc: .* C [0-9]\.[0-9]' | \
-	sed 's/.* C \([0-9]\)\.\([0-9]\).*/\1\2/'`
-  CCVER=${CCVER:-0}
-  if [ $MACHINE != i86pc -a $CCVER -gt 40 ]; then
-    CC=cc	# overrides gcc!!!
-    if [ $CCVER -eq 50 ]; then
-      echo "WARNING! Detected WorkShop C 5.0. Do make sure you have"
-      echo "         patch #107357-01 or later applied."
-      sleep 5
-    fi
-  fi
-fi
-
-if [ "${SYSTEM}" = "AIX" ]; then	# favor vendor cc over gcc
-    (cc) 2>&1 | grep -iv "not found" > /dev/null && CC=cc
-fi
-
-CCVER=${CCVER:-0}
-
-# read the output of the embedded GuessOS
-read GUESSOS
-
-echo Operating system: $GUESSOS
-
-# now map the output into SSLeay terms ... really should hack into the
-# script above so we end up with values in vars but that would take
-# more time that I want to waste at the moment
-case "$GUESSOS" in
-  uClinux*64*)
-    OUT=uClinux-dist64
-	;;
-  uClinux*)
-    OUT=uClinux-dist
-	;;
-  mips3-sgi-irix)
-	OUT="irix-mips3-$CC"
-	;;
-  mips4-sgi-irix64)
-	echo "WARNING! If you wish to build 64-bit library, then you have to"
-	echo "         invoke '$THERE/Configure irix64-mips4-$CC' *manually*."
-	if [ "$DRYRUN" = "false" -a -t 1 ]; then
-	  echo "         You have about 5 seconds to press Ctrl-C to abort."
-	  (trap "stty `stty -g`; exit 0" 2 0; stty -icanon min 0 time 50; read waste) <&1
-	fi
-	OUT="irix-mips3-$CC"
-	;;
-  ppc-apple-rhapsody) OUT="rhapsody-ppc-cc" ;;
-  ppc-apple-darwin*)
-	ISA64=`(sysctl -n hw.optional.64bitops) 2>/dev/null`
-	if [ "$ISA64" = "1" -a -z "$KERNEL_BITS" ]; then
-	    echo "WARNING! If you wish to build 64-bit library, then you have to"
-	    echo "         invoke '$THERE/Configure darwin64-ppc-cc' *manually*."
-	    if [ "$DRYRUN" = "false" -a -t 1 ]; then
-	      echo "         You have about 5 seconds to press Ctrl-C to abort."
-	      (trap "stty `stty -g`; exit 0" 2 0; stty -icanon min 0 time 50; read waste) <&1
-	    fi
-	fi
-	if [ "$ISA64" = "1" -a "$KERNEL_BITS" = "64" ]; then
-	    OUT="darwin64-ppc-cc"
-	else
-	    OUT="darwin-ppc-cc"
-	fi ;;
-  i?86-apple-darwin*)
-	ISA64=`(sysctl -n hw.optional.x86_64) 2>/dev/null`
-	if [ "$ISA64" = "1" -a -z "$KERNEL_BITS" ]; then
-	    echo "WARNING! If you wish to build 64-bit library, then you have to"
-	    echo "         invoke 'KERNEL_BITS=64 $THERE/config $options'."
-	    if [ "$DRYRUN" = "false" -a -t 1 ]; then
-	      echo "         You have about 5 seconds to press Ctrl-C to abort."
-	      (trap "stty `stty -g`; exit 1" 2; stty -icanon min 0 time 50; read waste; exit 0) <&1 || exit
-	    fi
-	fi
-	if [ "$ISA64" = "1" -a "$KERNEL_BITS" = "64" ]; then
-	    OUT="darwin64-x86_64-cc"
-	else
-	    OUT="darwin-i386-cc"
-	fi ;;
-  x86_64-apple-darwin*)
-	if [ "$KERNEL_BITS" = "32" ]; then
-	    OUT="darwin-i386-cc"
-	else
-	    OUT="darwin64-x86_64-cc"
-	fi ;;
-  armv6+7-*-iphoneos)
-	__CNF_CFLAGS="$__CNF_CFLAGS -arch armv6 -arch armv7"
-	__CNF_CXXFLAGS="$__CNF_CXXFLAGS -arch armv6 -arch armv7"
-	OUT="iphoneos-cross" ;;
-  *-*-iphoneos)
-	__CNF_CFLAGS="$__CNF_CFLAGS -arch ${MACHINE}"
-	__CNF_CXXFLAGS="$__CNF_CXXFLAGS -arch ${MACHINE}"
-	OUT="iphoneos-cross" ;;
-  arm64-*-iphoneos|*-*-ios64)
-	OUT="ios64-cross" ;;
-  alpha-*-linux2)
-        ISA=`awk '/cpu model/{print$4;exit(0);}' /proc/cpuinfo`
-	OUT="linux-alpha-$CC"
-	if [ "$CC" = "gcc" ]; then
-	    case ${ISA:-generic} in
-	    EV5|EV45)		__CNF_CFLAGS="$__CNF_CFLAGS -mcpu=ev5"
-				__CNF_CXXFLAGS="$__CNF_CFLAGS -mcpu=ev5";;
-	    EV56|PCA56)		__CNF_CFLAGS="$__CNF_CFLAGS -mcpu=ev56"
-				__CNF_CXXFLAGS="$__CNF_CXXFLAGS -mcpu=ev56";;
-	    *)			__CNF_CFLAGS="$__CNF_CFLAGS -mcpu=ev6"
-				__CNF_CXXFLAGS="$__CNF_CXXFLAGS -mcpu=ev6";;
-	    esac
-	fi
-	;;
-  ppc64-*-linux2)
-	if [ -z "$KERNEL_BITS" ]; then
-	    echo "WARNING! If you wish to build 64-bit library, then you have to"
-	    echo "         invoke '$THERE/Configure linux-ppc64' *manually*."
-	    if [ "$DRYRUN" = "false" -a -t 1 ]; then
-		echo "         You have about 5 seconds to press Ctrl-C to abort."
-		(trap "stty `stty -g`; exit 0" 2 0; stty -icanon min 0 time 50; read waste) <&1
-	    fi
-	fi
-	if [ "$KERNEL_BITS" = "64" ]; then
-	    OUT="linux-ppc64"
-	else
-	    OUT="linux-ppc"
-	    if (echo "__LP64__" | gcc -E -x c - 2>/dev/null | grep "^__LP64__" 2>&1 > /dev/null); then
-		:;
-	    else
-		__CNF_CFLAGS="$__CNF_CFLAGS -m32"
-		__CNF_CXXFLAGS="$__CNF_CXXFLAGS -m32"
-	    fi
-	fi
-	;;
-  ppc64le-*-linux2) OUT="linux-ppc64le" ;;
-  ppc-*-linux2) OUT="linux-ppc" ;;
-  mips64*-*-linux2)
-	echo "WARNING! If you wish to build 64-bit library, then you have to"
-	echo "         invoke '$THERE/Configure linux64-mips64' *manually*."
-	if [ "$DRYRUN" = "false" -a -t 1 ]; then
-	    echo "         You have about 5 seconds to press Ctrl-C to abort."
-	    (trap "stty `stty -g`; exit 0" 2 0; stty -icanon min 0 time 50; read waste) <&1
-	fi
-	OUT="linux-mips64"
-	;;
-  mips*-*-linux2) OUT="linux-mips32" ;;
-  ppc60x-*-vxworks*) OUT="vxworks-ppc60x" ;;
-  ppcgen-*-vxworks*) OUT="vxworks-ppcgen" ;;
-  pentium-*-vxworks*) OUT="vxworks-pentium" ;;
-  simlinux-*-vxworks*) OUT="vxworks-simlinux" ;;
-  mips-*-vxworks*) OUT="vxworks-mips";;
-  e2k-*-linux*) OUT="linux-generic64 -DL_ENDIAN" ;;
-  ia64-*-linux?) OUT="linux-ia64" ;;
-  sparc64-*-linux2)
-	echo "WARNING! If you *know* that your GNU C supports 64-bit/V9 ABI"
-	echo "         and wish to build 64-bit library, then you have to"
-	echo "         invoke '$THERE/Configure linux64-sparcv9' *manually*."
-	if [ "$DRYRUN" = "false" -a -t 1 ]; then
-	  echo "          You have about 5 seconds to press Ctrl-C to abort."
-	  (trap "stty `stty -g`; exit 0" 2 0; stty -icanon min 0 time 50; read waste) <&1
-	fi
-	OUT="linux-sparcv9" ;;
-  sparc-*-linux2)
-	KARCH=`awk '/^type/{print$3;exit(0);}' /proc/cpuinfo`
-	case ${KARCH:-sun4} in
-	sun4u*)	OUT="linux-sparcv9" ;;
-	sun4m)	OUT="linux-sparcv8" ;;
-	sun4d)	OUT="linux-sparcv8" ;;
-	*)	OUT="linux-generic32";
-		__CNF_CPPFLAGS="$__CNF_CPPFLAGS -DB_ENDIAN" ;;
-	esac ;;
-  parisc*-*-linux2)
-	# 64-bit builds under parisc64 linux are not supported and
-	# compiler is expected to generate 32-bit objects...
-	CPUARCH=`awk '/cpu family/{print substr($5,1,3); exit(0);}' /proc/cpuinfo`
-	CPUSCHEDULE=`awk '/^cpu.[ 	]*: PA/{print substr($3,3); exit(0);}' /proc/cpuinfo`
-
-	# ??TODO ??  Model transformations
-	# 0. CPU Architecture for the 1.1 processor has letter suffixes. We strip that off
-	#    assuming no further arch. identification will ever be used by GCC.
-	# 1. I'm most concerned about whether is a 7300LC is closer to a 7100 versus a 7100LC.
-	# 2. The variant 64-bit processors cause concern should GCC support explicit schedulers
-	#    for these chips in the future.
-	#         PA7300LC -> 7100LC (1.1)
-	#         PA8200   -> 8000   (2.0)
-	#         PA8500   -> 8000   (2.0)
-	#         PA8600   -> 8000   (2.0)
-
-	CPUSCHEDULE=`echo $CPUSCHEDULE|sed -e 's/7300LC/7100LC/' -e 's/8.00/8000/'`
-	# Finish Model transformations
-
-	__CNF_CPPFLAGS="$__CNF_CPPFLAGS -DB_ENDIAN"
-	__CNF_CFLAGS="$__CNF_CFLAGS -mschedule=$CPUSCHEDULE -march=$CPUARCH"
-	__CNF_CXXFLAGS="$__CNF_CXXFLAGS -mschedule=$CPUSCHEDULE -march=$CPUARCH"
-	OUT="linux-generic32" ;;
-  armv[1-3]*-*-linux2) OUT="linux-generic32" ;;
-  armv[7-9]*-*-linux2) OUT="linux-armv4"
-		       __CNF_CFLAGS="$__CNF_CFLAGS -march=armv7-a"
-		       __CNF_CXXFLAGS="$__CNF_CXXFLAGS -march=armv7-a"
-		       ;;
-  arm*-*-linux2) OUT="linux-armv4" ;;
-  aarch64-*-linux2) OUT="linux-aarch64" ;;
-  sh*b-*-linux2) OUT="linux-generic32";
-		 __CNF_CPPFLAGS="$__CNF_CPPFLAGS -DB_ENDIAN" ;;
-  sh*-*-linux2)	 OUT="linux-generic32";
-		 __CNF_CPPFLAGS="$__CNF_CPPFLAGS -DL_ENDIAN" ;;
-  m68k*-*-linux2) OUT="linux-generic32";
-		  __CNF_CPPFLAGS="$__CNF_CPPFLAGS -DB_ENDIAN" ;;
-  s390-*-linux2) OUT="linux-generic32";
-		 __CNF_CPPFLAGS="$__CNF_CPPFLAGS -DB_ENDIAN" ;;
-  s390x-*-linux2)
-	# To be uncommented when glibc bug is fixed, see Configure...
-	#if egrep -e '^features.* highgprs' /proc/cpuinfo >/dev/null ; then
-	#  echo "WARNING! If you wish to build \"highgprs\" 32-bit library, then you"
-	#  echo "         have to invoke './Configure linux32-s390x' *manually*."
-	#  if [ "$DRYRUN" = "false" -a -t -1 ]; then
-	#    echo "         You have about 5 seconds to press Ctrl-C to abort."
-	#    (trap "stty `stty -g`; exit 0" 2 0; stty -icanon min 0 time 50; read waste) <&1
-	#  fi
-	#fi
-	OUT="linux64-s390x"
-	;;
-  x86_64-*-linux?)
-	if $CC -dM -E -x c /dev/null 2>&1 | grep -q ILP32 > /dev/null; then
-	    OUT="linux-x32"
-	else
-	    OUT="linux-x86_64"
-	fi ;;
-  *86-*-linux2)
-        # On machines where the compiler understands -m32, prefer a
-        # config target that uses it
-        if $CC -m32 -E -x c /dev/null > /dev/null 2>&1; then
-            OUT="linux-x86"
-        else
-            OUT="linux-elf"
-        fi ;;
-  *86-*-linux1) OUT="linux-aout" ;;
-  *-*-linux?) OUT="linux-generic32" ;;
-  sun4[uv]*-*-solaris2)
-	OUT="solaris-sparcv9-$CC"
-	ISA64=`(isainfo) 2>/dev/null | grep sparcv9`
-	if [ "$ISA64" != "" -a "$KERNEL_BITS" = "" ]; then
-	    if [ "$CC" = "cc" -a $CCVER -ge 50 ]; then
-		echo "WARNING! If you wish to build 64-bit library, then you have to"
-		echo "         invoke '$THERE/Configure solaris64-sparcv9-cc' *manually*."
-		if [ "$DRYRUN" = "false" -a -t 1 ]; then
-		  echo "         You have about 5 seconds to press Ctrl-C to abort."
-		  (trap "stty `stty -g`; exit 0" 2 0; stty -icanon min 0 time 50; read waste) <&1
-		fi
-	    elif [ "$CC" = "gcc" -a "$GCC_ARCH" = "-m64" ]; then
-		# $GCC_ARCH denotes default ABI chosen by compiler driver
-		# (first one found on the $PATH). I assume that user
-		# expects certain consistency with the rest of his builds
-		# and therefore switch over to 64-bit. <appro>
-		OUT="solaris64-sparcv9-gcc"
-		echo "WARNING! If you wish to build 32-bit library, then you have to"
-		echo "         invoke '$THERE/Configure solaris-sparcv9-gcc' *manually*."
-		if [ "$DRYRUN" = "false" -a -t 1 ]; then
-		  echo "         You have about 5 seconds to press Ctrl-C to abort."
-		  (trap "stty `stty -g`; exit 0" 2 0; stty -icanon min 0 time 50; read waste) <&1
-		fi
-	    elif [ "$GCC_ARCH" = "-m32" ]; then
-		echo "NOTICE! If you *know* that your GNU C supports 64-bit/V9 ABI"
-		echo "        and wish to build 64-bit library, then you have to"
-		echo "        invoke '$THERE/Configure solaris64-sparcv9-gcc' *manually*."
-		if [ "$DRYRUN" = "false" -a -t 1 ]; then
-		  echo "         You have about 5 seconds to press Ctrl-C to abort."
-		  (trap "stty `stty -g`; exit 0" 2 0; stty -icanon min 0 time 50; read waste) <&1
-		fi
-	    fi
-	fi
-	if [ "$ISA64" != "" -a "$KERNEL_BITS" = "64" ]; then
-	    OUT="solaris64-sparcv9-$CC"
-	fi
-	;;
-  sun4m-*-solaris2)	OUT="solaris-sparcv8-$CC" ;;
-  sun4d-*-solaris2)	OUT="solaris-sparcv8-$CC" ;;
-  sun4*-*-solaris2)	OUT="solaris-sparcv7-$CC" ;;
-  *86*-*-solaris2)
-	ISA64=`(isainfo) 2>/dev/null | grep amd64`
-	if [ "$ISA64" != "" -a ${KERNEL_BITS:-64} -eq 64 ]; then
-	    OUT="solaris64-x86_64-$CC"
-	else
-	    OUT="solaris-x86-$CC"
-	    if [ `uname -r | sed -e 's/5\.//'` -lt 10 ]; then
-		options="$options no-sse2"
-	    fi
-	fi
-	;;
-  *-*-sunos4)		OUT="sunos-$CC" ;;
-
-  *86*-*-bsdi4)		OUT="BSD-x86-elf"; options="$options no-sse2";
-			__CNF_LDFLAGS="$__CNF_LDFLAGS -ldl" ;;
-  alpha*-*-*bsd*)	OUT="BSD-generic64";
-			__CNF_CPPFLAGS="$__CNF_CPPFLAGS -DL_ENDIAN" ;;
-  powerpc64-*-*bsd*)	OUT="BSD-generic64";
-			__CNF_CPPFLAGS="$__CNF_CPPFLAGS -DB_ENDIAN" ;;
-  sparc64-*-*bsd*)	OUT="BSD-sparc64" ;;
-  ia64-*-*bsd*)		OUT="BSD-ia64" ;;
-  x86_64-*-dragonfly*)  OUT="BSD-x86_64" ;;
-  amd64-*-*bsd*)	OUT="BSD-x86_64" ;;
-  *86*-*-*bsd*)		# mimic ld behaviour when it's looking for libc...
-			if [ -L /usr/lib/libc.so ]; then	# [Free|Net]BSD
-			    libc=/usr/lib/libc.so
-			else					# OpenBSD
-			    # ld searches for highest libc.so.* and so do we
-			    libc=`(ls /usr/lib/libc.so.* /lib/libc.so.* | tail -1) 2>/dev/null`
-			fi
-			case "`(file -L $libc) 2>/dev/null`" in
-			*ELF*)	OUT="BSD-x86-elf" ;;
-			*)	OUT="BSD-x86"; options="$options no-sse2" ;;
-			esac ;;
-  *-*-*bsd*)		OUT="BSD-generic32" ;;
-
-  x86_64-*-haiku)	OUT="haiku-x86_64" ;;
-  *-*-haiku)		OUT="haiku-x86" ;;
-
-  *-*-osf)		OUT="osf1-alpha-cc" ;;
-  *-*-tru64)		OUT="tru64-alpha-cc" ;;
-  *-*-[Uu]nix[Ww]are7)
-	if [ "$CC" = "gcc" ]; then
-	  OUT="unixware-7-gcc" ; options="$options no-sse2"
-	else
-	  OUT="unixware-7" ; options="$options no-sse2"
-	  __CNF_CPPFLAGS="$__CNF_CPPFLAGS -D__i386__"
-	fi
-	;;
-  *-*-[Uu]nix[Ww]are20*) OUT="unixware-2.0"; options="$options no-sse2 no-sha512" ;;
-  *-*-[Uu]nix[Ww]are21*) OUT="unixware-2.1"; options="$options no-sse2 no-sha512" ;;
-  *-*-vos)
-	options="$options no-threads no-shared no-asm no-dso"
-	EXE=".pm"
-	OUT="vos-$CC" ;;
-  BS2000-siemens-sysv4) OUT="BS2000-OSD" ;;
-  *-hpux1*)
-	if [ $CC = "gcc" -a $GCC_BITS = "64" ]; then
-	    OUT="hpux64-parisc2-gcc"
-	fi
-	[ "$KERNEL_BITS" ] || KERNEL_BITS=`(getconf KERNEL_BITS) 2>/dev/null`
-	KERNEL_BITS=${KERNEL_BITS:-32}
-	CPU_VERSION=`(getconf CPU_VERSION) 2>/dev/null`
-	CPU_VERSION=${CPU_VERSION:-0}
-	# See <sys/unistd.h> for further info on CPU_VERSION.
-	if   [ $CPU_VERSION -ge 768 ]; then	# IA-64 CPU
-	     if [ $KERNEL_BITS -eq 64 -a "$CC" = "cc" ]; then
-	        OUT="hpux64-ia64-cc"
-             else
-	        OUT="hpux-ia64-cc"
-             fi
-	elif [ $CPU_VERSION -ge 532 ]; then	# PA-RISC 2.x CPU
-	     # PA-RISC 2.0 is no longer supported as separate 32-bit
-	     # target. This is compensated for by run-time detection
-	     # in most critical assembly modules and taking advantage
-	     # of 2.0 architecture in PA-RISC 1.1 build.
-	     OUT=${OUT:-"hpux-parisc1_1-${CC}"}
-	     if [ $KERNEL_BITS -eq 64 -a "$CC" = "cc" ]; then
-		echo "WARNING! If you wish to build 64-bit library then you have to"
-		echo "         invoke '$THERE/Configure hpux64-parisc2-cc' *manually*."
-		if [ "$DRYRUN" = "false" -a -t 1 ]; then
-		  echo "         You have about 5 seconds to press Ctrl-C to abort."
-		  (trap "stty `stty -g`; exit 0" 2 0; stty -icanon min 0 time 50; read waste) <&1
-		fi
-	     fi
-	elif [ $CPU_VERSION -ge 528 ]; then	# PA-RISC 1.1+ CPU
-	     OUT="hpux-parisc1_1-${CC}"
-	elif [ $CPU_VERSION -ge 523 ]; then	# PA-RISC 1.0 CPU
-	     OUT="hpux-parisc-${CC}"
-	else					# Motorola(?) CPU
-	     OUT="hpux-$CC"
-	fi
-	__CNF_CPPFLAGS="$__CNF_CPPFLAGS -D_REENTRANT" ;;
-  *-hpux)	OUT="hpux-parisc-$CC" ;;
-  *-aix)
-	[ "$KERNEL_BITS" ] || KERNEL_BITS=`(getconf KERNEL_BITMODE) 2>/dev/null`
-	KERNEL_BITS=${KERNEL_BITS:-32}
-	OBJECT_MODE=${OBJECT_MODE:-32}
-	if [ "$CC" = "gcc" ]; then
-	    OUT="aix-gcc"
-          if [ $OBJECT_MODE -eq 64 ]; then
-            echo 'Your $OBJECT_MODE was found to be set to 64'
-            OUT="aix64-gcc"
-          fi
-	elif [ $OBJECT_MODE -eq 64 ]; then
-	    echo 'Your $OBJECT_MODE was found to be set to 64'
-	    OUT="aix64-cc"
-	else
-	    OUT="aix-cc"
-	    if [ $KERNEL_BITS -eq 64 ]; then
-		echo "WARNING! If you wish to build 64-bit kit, then you have to"
-		echo "         invoke '$THERE/Configure aix64-cc' *manually*."
-		if [ "$DRYRUN" = "false" -a -t 1 ]; then
-		    echo "         You have ~5 seconds to press Ctrl-C to abort."
-		    (trap "stty `stty -g`; exit 0" 2 0; stty -icanon min 0 time 50; read waste) <&1
-		fi
-	    fi
-	fi
-	if (lsattr -E -O -l `lsdev -c processor|awk '{print$1;exit}'` | grep -i powerpc) >/dev/null 2>&1; then
-	    :	# this applies even to Power3 and later, as they return PowerPC_POWER[345]
-	else
-	    options="$options no-asm"
-	fi
-	;;
-  # these are all covered by the catchall below
-  i[3456]86-*-cygwin) OUT="Cygwin-x86" ;;
-  *-*-cygwin) OUT="Cygwin-${MACHINE}" ;;
-  x86-*-android|i?86-*-android) OUT="android-x86" ;;
-  armv[7-9]*-*-android)
-      OUT="android-armeabi"
-      __CNF_CFLAGS="$__CNF_CFLAGS -march=armv7-a"
-      __CNF_CXXFLAGS="$__CNF_CXXFLAGS -march=armv7-a";;
-  arm*-*-android) OUT="android-armeabi" ;;
-  *) OUT=`echo $GUESSOS | awk -F- '{print $3}'`;;
-esac
-
-# NB: This atalla support has been superseded by the ENGINE support
-# That contains its own header and definitions anyway. Support can
-# be enabled or disabled on any supported platform without external
-# headers, eg. by adding the "hw-atalla" switch to ./config or
-# perl Configure
-#
-# See whether we can compile Atalla support
-#if [ -f /usr/include/atasi.h ]
-#then
-#  __CNF_CPPFLAGS="$__CNF_CPPFLAGS -DATALLA"
-#fi
-
-if [ -n "$CONFIG_OPTIONS" ]; then
-  options="$options $CONFIG_OPTIONS"
-fi
-
-# gcc < 2.8 does not support -march=ultrasparc
-if [ "$OUT" = solaris-sparcv9-gcc -a $GCCVER -lt 28 ]
-then
-  echo "WARNING! Falling down to 'solaris-sparcv8-gcc'."
-  echo "         Upgrade to gcc-2.8 or later."
-  sleep 5
-  OUT=solaris-sparcv8-gcc
-fi
-if [ "$OUT" = "linux-sparcv9" -a $GCCVER -lt 28 ]
-then
-  echo "WARNING! Falling down to 'linux-sparcv8'."
-  echo "         Upgrade to gcc-2.8 or later."
-  sleep 5
-  OUT=linux-sparcv8
-fi
-
-case "$GUESSOS" in
-  i386-*) options="$options 386" ;;
-esac
-
-if [ -z "$OUT" ]; then
-  OUT="$CC"
-fi
-
-if [ ".$PERL" = . ] ; then
-	for i in . `echo $PATH | sed 's/:/ /g'`; do
-		if [ -f "$i/perl5$EXE" ] ; then
-			PERL="$i/perl5$EXE"
-			break;
-		fi;
-	done
-fi
-
-if [ ".$PERL" = . ] ; then
-	for i in . `echo $PATH | sed 's/:/ /g'`; do
-		if [ -f "$i/perl$EXE" ] ; then
-			if "$i/perl$EXE" -e 'exit($]<5.0)'; then
-				PERL="$i/perl$EXE"
-				break;
-			fi;
-		fi;
-	done
-fi
-
-if [ ".$PERL" = . ] ; then
-	echo "You need Perl 5."
-	exit 1
-fi
-
-# run Configure to check to see if we need to specify the
-# compiler for the platform ... in which case we add it on
-# the end ... otherwise we leave it off
-
-$PERL $THERE/Configure LIST | grep "$OUT-$CC" > /dev/null
-if [ $? = "0" ]; then
-  OUT="$OUT-$CC"
-fi
-
-OUT="$OUT"
-
-if [ "$OUT" = "darwin64-x86_64-cc" ]; then
-    echo "WARNING! If you wish to build 32-bit libraries, then you have to"
-    echo "         invoke 'KERNEL_BITS=32 $THERE/config $options'."
-fi
-
-if $PERL $THERE/Configure LIST | grep "$OUT" > /dev/null; then
-  if [ "$VERBOSE" = "true" ]; then
-    echo /usr/bin/env \
-	 __CNF_CPPDEFINES="'$__CNF_CPPDEFINES'" \
-	 __CNF_CPPINCLUDES="'$__CNF_CPPINCLUDES'" \
-	 __CNF_CPPFLAGS="'$__CNF_CPPFLAGS'" \
-	 __CNF_CFLAGS="'$__CNF_CFLAGS'" \
-	 __CNF_CXXFLAGS="'$__CNF_CXXFLAGS'" \
-	 __CNF_LDFLAGS="'$__CNF_LDFLAGS'" \
-	 __CNF_LDLIBS="'$__CNF_LDLIBS'" \
-	 $PERL $THERE/Configure $OUT $options
-  fi
-  if [ "$DRYRUN" = "false" ]; then
-    # eval to make sure quoted options, possibly with spaces inside,
-    # are treated right
-    eval /usr/bin/env \
-	 __CNF_CPPDEFINES="'$__CNF_CPPDEFINES'" \
-	 __CNF_CPPINCLUDES="'$__CNF_CPPINCLUDES'" \
-	 __CNF_CPPFLAGS="'$__CNF_CPPFLAGS'" \
-	 __CNF_CFLAGS="'$__CNF_CFLAGS'" \
-	 __CNF_CXXFLAGS="'$__CNF_CXXFLAGS'" \
-	 __CNF_LDFLAGS="'$__CNF_LDFLAGS'" \
-	 __CNF_LDLIBS="'$__CNF_LDLIBS'" \
-	 $PERL $THERE/Configure $OUT $options
-  fi
-else
-  echo "This system ($OUT) is not supported. See file INSTALL for details."
-  exit 1
-fi
-
-# Do not add anothing from here on, so we don't lose the Configure exit code
-)
+exec "$THERE/Configure" "$@"
diff --git a/util/perl/OpenSSL/config.pm b/util/perl/OpenSSL/config.pm
new file mode 100755
index 0000000000..46dad98d08
--- /dev/null
+++ b/util/perl/OpenSSL/config.pm
@@ -0,0 +1,929 @@
+#! /usr/bin/env perl
+# Copyright 1998-2020 The OpenSSL Project Authors. All Rights Reserved.
+#
+# Licensed under the Apache License 2.0 (the "License").  You may not use
+# this file except in compliance with the License.  You can obtain a copy
+# in the file LICENSE in the source distribution or at
+# https://www.openssl.org/source/license.html
+
+# Determine the operating system and run ./Configure.  Far descendant from
+# Apache's minarch and GuessOS.
+
+package OpenSSL::config;
+
+use strict;
+use warnings;
+use Getopt::Std;
+use File::Basename;
+use IPC::Cmd;
+use POSIX;
+use Carp;
+
+# These control our behavior.
+my $DRYRUN;
+my $VERBOSE;
+my $WAIT = 1;
+my $WHERE = dirname($0);
+
+# Machine type, etc., used to determine the platform
+my $MACHINE;
+my $RELEASE;
+my $SYSTEM;
+my $VERSION;
+my $CCVENDOR;
+my $CCVER;
+my $GCC_BITS;
+my $GCC_ARCH;
+
+# Some environment variables; they will affect Configure
+my $CONFIG_OPTIONS = $ENV{CONFIG_OPTIONS} // '';
+my $CC;
+my $CROSS_COMPILE;
+
+# For determine_compiler_settings, the list of known compilers
+my @c_compilers = qw(clang gcc cc);
+# Methods to determine compiler version.  The expected output is one of
+# MAJOR or MAJOR.MINOR or MAJOR.MINOR.PATCH...  or false if the compiler
+# isn't of the given brand.
+# This is a list to ensure that gnu comes last, as we've made it a fallback
+my @cc_version =
+    (
+     clang => sub {
+         my $v = `$CROSS_COMPILE$CC -v 2>&1`;
+         $v =~ m/(?:(?:^clang|LLVM) version|.*based on LLVM)\s+([0-9]+\.[0-9]+)/;
+         return $1;
+     },
+     gnu => sub {
+         my $v = `$CROSS_COMPILE$CC -dumpversion 2>/dev/null`;
+         # Strip off whatever prefix egcs prepends the number with.
+         # Hopefully, this will work for any future prefixes as well.
+         $v =~ s/^[a-zA-Z]*\-//;
+         return $v;
+     },
+    );
+
+# This is what we will set as the target for calling Configure.
+my $options = '';
+
+# Pattern matches against "${SYSTEM}:${RELEASE}:${VERSION}:${MACHINE}"
+# The patterns are assumed to be wrapped like this: /^(${pattern})$/
+my $guess_patterns = [
+    [ 'A\/UX:.*',                   'm68k-apple-aux3' ],
+    [ 'AIX:[3-9]:4:.*',             '${MACHINE}-ibm-aix' ],
+    [ 'AIX:.*?:[5-9]:.*',           '${MACHINE}-ibm-aix' ],
+    [ 'AIX:.*',                     '${MACHINE}-ibm-aix3' ],
+    [ 'HI-UX:.*',                   '${MACHINE}-hi-hiux' ],
+    [ 'HP-UX:.*',
+      sub {
+          my $HPUXVER = $RELEASE;
+          $HPUXVER = s/[^.]*.[0B]*//;
+          # HPUX 10 and 11 targets are unified
+          return "${MACHINE}-hp-hpux1x" if $HPUXVER =~ m at 1[0-9]@;
+          return "${MACHINE}-hp-hpux";
+      }
+    ],
+    [ 'IRIX:6\..*',                 'mips3-sgi-irix' ],
+    [ 'IRIX64:.*',                  'mips4-sgi-irix64' ],
+    [ 'Linux:[2-9]\..*',            '${MACHINE}-whatever-linux2' ],
+    [ 'Linux:1\..*',                '${MACHINE}-whatever-linux1' ],
+    [ 'GNU.*',                      'hurd-x86' ],
+    [ 'LynxOS:.*',                  '${MACHINE}-lynx-lynxos' ],
+    # BSD/OS always says 386
+    [ 'BSD\/OS:4\..*',              'i486-whatever-bsdi4' ],
+    # Order is important, this has to appear before 'BSD\/386:'
+    [ 'BSD/386:.*?:.*?:.*486.*|BSD/OS:.*?:.*?:.*?:.*486.*',
+      sub {
+          my $BSDVAR = `/sbin/sysctl -n hw.model`;
+          return "i586-whatever-bsdi" if $BSDVAR =~ m at Pentium@;
+          return "i386-whatever-bsdi";
+      }
+    ],
+    [ 'BSD\/386:.*|BSD\/OS:.*',     '${MACHINE}-whatever-bsdi' ],
+    # Order is important, this has to appear before 'FreeBSD:'
+    [ 'FreeBSD:.*?:.*?:.*386.*',
+      sub {
+          my $VERS = $RELEASE;
+          $VERS =~ s/[-(].*//;
+          my $MACH = `sysctl -n hw.model`;
+          $MACH = "i386" if $MACH =~ m at 386@;
+          $MACH = "i486" if $MACH =~ m at 486@;
+          $MACH = "i686" if $MACH =~ m at Pentium II@;
+          $MACH = "i586" if $MACH =~ m at Pentium@;
+          $MACH = "$MACHINE" if $MACH !~ /i.86/;
+          my $ARCH = 'whatever';
+          $ARCH = "pc" if $MACH =~ m at i[0-9]86@;
+          return "${MACH}-${ARCH}-freebsd${VERS}";
+      }
+    ],
+    [ 'DragonFly:.*',               '${MACHINE}-whatever-dragonfly' ],
+    [ 'FreeBSD:.*',                 '${MACHINE}-whatever-freebsd' ],
+    [ 'Haiku:.*',                   '${MACHINE}-whatever-haiku' ],
+    # Order is important, this has to appear before 'NetBSD:.*'
+    [ 'NetBSD:.*?:.*?:.*386.*',
+      sub {
+          my $hw = `/usr/sbin/sysctl -n hw.model || /sbin/sysctl -n hw.model`;
+          $hw =~  s at .*(.)86-class.*@i${1}86@;
+          return "${hw}-whatever-netbsd";
+      }
+    ],
+    [ 'NetBSD:.*',                  '${MACHINE}-whatever-netbsd' ],
+    [ 'OpenBSD:.*',                 '${MACHINE}-whatever-openbsd' ],
+    [ 'OpenUNIX:.*',                '${MACHINE}-unknown-OpenUNIX${VERSION}' ],
+    [ 'OSF1:.*?:.*?:.*alpha.*',
+      sub {
+          my $OSFMAJOR = $RELEASE;
+          $OSFMAJOR =~ 's/^V([0-9]*)\..*$/\1/';
+          return "${MACHINE}-dec-tru64" if $OSFMAJOR =~ m@[45]@;
+          return "${MACHINE}-dec-osf";
+      }
+    ],
+    [ 'Paragon.*?:.*',              'i860-intel-osf1' ],
+    [ 'Rhapsody:.*',                'ppc-apple-rhapsody' ],
+    [ 'Darwin:.*?:.*?:Power.*',     'ppc-apple-darwin' ],
+    [ 'Darwin:.*?:.*?:x86_64',      'x86_64-apple-darwin' ],
+    [ 'Darwin:.*',                  'i686-apple-darwin' ],
+    [ 'SunOS:5\..*',                '${MACHINE}-whatever-solaris2' ],
+    [ 'SunOS:.*',                   '${MACHINE}-sun-sunos4' ],
+    [ 'UNIX_System_V:4\..*?:.*',    '${MACHINE}-whatever-sysv4' ],
+    [ 'VOS:.*?:.*?:i786',           'i386-stratus-vos' ],
+    [ 'VOS:.*?:.*?:.*',             'hppa1.1-stratus-vos' ],
+    [ '.*?:4.*?:R4.*?:m88k',        '${MACHINE}-whatever-sysv4' ],
+    [ 'DYNIX\/ptx:4.*?:.*',         '${MACHINE}-whatever-sysv4' ],
+    [ '.*?:4\.0:3\.0:3[34]..(,.*)?', 'i486-ncr-sysv4' ],
+    [ 'ULTRIX:.*',                  '${MACHINE}-unknown-ultrix' ],
+    [ 'POSIX-BC.*',                 'BS2000-siemens-sysv4' ],
+    [ 'machten:.*',                 '${MACHINE}-tenon-${SYSTEM}' ],
+    [ 'library:.*',                 '${MACHINE}-ncr-sysv4' ],
+    [ 'ConvexOS:.*?:11\.0:.*',      '${MACHINE}-v11-${SYSTEM}' ],
+    [ 'MINGW64.*?:.*?:.*?:x86_64',  '${MACHINE}-whatever-mingw64' ],
+    [ 'MINGW.*',                    '${MACHINE}-whatever-mingw' ],
+    [ 'CYGWIN.*',                   '${MACHINE}-pc-cygwin' ],
+    [ 'vxworks.*',                  '${MACHINE}-whatever-vxworks' ],
+
+    # Windows values found by looking at Perl 5's win32/win32.c
+    [ 'Windows NT:.*:amd64',        'VC-WIN64A' ],
+    [ 'Windows NT:.*:ia64',         'VC-WIN64I' ],
+    [ 'Windows NT:.*:x86',          'VC-WIN32' ],
+
+    # VMS values found by observation on existing machinery.  Unfortunately,
+    # the machine part is a bit...  overdone.  It seems, though, that 'Alpha'
+    # exists in that part, making it distinguishable from Itanium.  It will
+    # be interesting to see what we'll get in the upcoming x86_64 port...
+    [ 'OpenVMS:.*?:.*?:.*?:.*Alpha.*', 'vms-alpha' ],
+    [ 'OpenVMS:.*',                 'vms-ia64' ],
+
+    [ sub { -d '/usr/apollo' },     'whatever-apollo-whatever' ],
+];
+
+# Run a command, return true if exit zero else false.
+# Multiple args are glued together into a pipeline.
+# Name comes from OpenSSL tests, often written as "ok(run(...."
+sub okrun {
+    my $command = join(' | ', @_);
+    my $status = system($command) >> 8;
+    return $status == 0;
+}
+
+# Give user a chance to abort/interrupt if interactive if interactive.
+sub maybe_abort {
+    if ( $WAIT && -t 1 ) {
+        eval {
+            local $SIG{ALRM} = sub { die "Timeout"; };
+            local $| = 1;
+            alarm(5);
+            print "You have about five seconds to abort: ";
+            my $ignored = <STDIN>;
+            alarm(0);
+        };
+        print "\n" if $@ =~ /Timeout/;
+    }
+}
+
+# Look for ISC/SCO with its unique uname program
+sub is_sco_uname {
+    open UNAME, "uname -X 2>/dev/null|" or return '';
+    my $line = "";
+    while ( <UNAME> ) {
+        chop;
+        $line = $_ if m@^Release@;
+    }
+    close UNAME;
+    return "" if $line eq '';
+    my @fields = split($line);
+    return $fields[2];
+}
+
+sub get_sco_type {
+    my $REL = shift;
+
+    if ( -f "/etc/kconfig" ) {
+        return "${MACHINE}-whatever-isc4" if $REL eq '4.0' || $REL eq '4.1';
+    } else {
+        return "whatever-whatever-sco3" if $REL eq '3.2v4.2';
+        return "whatever-whatever-sco5" if $REL =~ m at 3\.2v5\.0.*@;
+        if ( $REL eq "4.2MP" ) {
+            return "whatever-whatever-unixware20" if $VERSION =~ m at 2\.0.*@;
+            return "whatever-whatever-unixware21" if $VERSION =~ m at 2\.1.*@;
+            return "whatever-whatever-unixware2" if $VERSION =~ m at 2.*@;
+        }
+        return "whatever-whatever-unixware1" if $REL eq "4.2";
+        if ( $REL =~ m at 5.*@ ) {
+            # We hardcode i586 in place of ${MACHINE} for the following
+            # reason: even though Pentium is minimum requirement for
+            # platforms in question, ${MACHINE} gets always assigned to
+            # i386. This means i386 gets passed to Configure, which will
+            # cause bad assembler code to be generated.
+            return "i586-sco-unixware7" if $VERSION =~ m@[678].*@;
+        }
+    }
+}
+
+# Return the cputype-vendor-osversion
+sub guess_system {
+    ($SYSTEM, undef, $RELEASE, $VERSION, $MACHINE) = POSIX::uname();
+    my $sys = "${SYSTEM}:${RELEASE}:${VERSION}:${MACHINE}";
+
+    # Special-cases for ISC, SCO, Unixware
+    my $REL = is_sco_uname();
+    if ( $REL ne "" ) {
+        my $result = get_sco_type($REL);
+        return eval "\"$result\"" if $result ne '';
+    }
+
+    # Now pattern-match
+
+    # Simple cases
+    foreach my $tuple ( @$guess_patterns ) {
+        my $pat = @$tuple[0];
+        my $check = ref $pat eq 'CODE' ? $pat->($sys) : $sys =~ /^(${pat})$/;
+        next unless $check;
+
+        my $result = @$tuple[1];
+        $result = $result->() if ref $result eq 'CODE';
+        return eval "\"$result\"";
+    }
+
+    # Oh well.
+    return "${MACHINE}-whatever-${SYSTEM}";
+}
+
+# We would use List::Util::pair() for this...  unfortunately, that function
+# only appeared in perl v5.19.3, and we claim to support perl v5.10 and on.
+# Therefore, we implement a quick cheap variant of our own.
+sub _pairs (@) {
+    croak "Odd number of arguments" if @_ & 1;
+
+    my @pairlist = ();
+
+    while (@_) {
+        my $x = [ shift, shift ];
+        push @pairlist, $x;
+    }
+    return @pairlist;
+}
+
+# Figure out CC, GCCVAR, etc.
+sub determine_compiler_settings {
+    # Make a copy and don't touch it.  That helps determine if we're
+    # finding the compiler here
+    my $cc = $CC;
+
+    # Set certain default
+    $CCVER = 0;                 # Unknown
+    $CCVENDOR = '';             # Dunno, don't care (unless found later)
+
+    # Find a compiler if we don't already have one
+    if ( ! $cc ) {
+        foreach (@c_compilers) {
+            next unless IPC::Cmd::can_run("$CROSS_COMPILE$_");
+            $CC = $_;
+            last;
+        }
+    }
+
+    # Find the compiler vendor and version number for certain compilers
+    foreach my $pair (_pairs @cc_version) {
+        # Try to get the version number.
+        # Failure gets us undef or an empty string
+        my ( $k, $v ) = @$pair;
+        $v = $v->();
+
+        # If we got a version number, process it
+        if ($v) {
+            $CCVENDOR = $k;
+
+            # The returned version is expected to be one of
+            #
+            # MAJOR
+            # MAJOR.MINOR
+            # MAJOR.MINOR.{whatever}
+            #
+            # We don't care what comes after MAJOR.MINOR.  All we need is to
+            # have them calculated into a single number, using this formula:
+            #
+            # MAJOR * 100 + MINOR
+            # Here are a few examples of what we should get:
+            #
+            # 2.95.1    => 295
+            # 3.1       => 301
+            # 9         => 900
+            my @numbers = split /\./, $v;
+            my @factors = (100, 1);
+            while (@numbers && @factors) {
+                $CCVER += shift(@numbers) * shift(@factors)
+            }
+            last;
+        }
+    }
+
+    # If no C compiler has been determined at this point, we die.  Hard.
+    die <<_____
+ERROR!
+No C compiler found, please specify one with the environment variable CC,
+or configure with an explicit configuration target.
+_____
+        unless $CC;
+
+    # Vendor specific overrides, only if we determined the compiler here
+    if ( ! $cc ) {
+        if ( ${SYSTEM} eq 'AIX' ) {
+            # favor vendor cc over gcc
+            if (IPC::Cmd::can_run('cc')) {
+                $CC = 'cc';
+                $CCVENDOR = ''; # Determine later
+                $CCVER = 0;
+            }
+        }
+
+        if ( $SYSTEM eq "SunOS" ) {
+            # check for WorkShop C, expected output is "cc: blah-blah C x.x"
+            my $v = `(cc -V 2>&1) 2>/dev/null | egrep -e '^cc: .* C [0-9]\.[0-9]'`;
+            chomp $v;
+            $v =~ s/.* C \([0-9]\)\.\([0-9]\).*/$1.$2/;
+            my @numbers = split /\./, $v;
+            my @factors = (100, 1);
+            $v = 0;
+            while (@numbers && @factors) {
+                $v += shift(@numbers) * shift(@factors)
+            }
+
+            if ( $v > 40000 &&  $MACHINE ne 'i86pc' ) {
+                $CC = 'cc';
+                $CCVENDOR = ''; # Determine later
+                $CCVER = $v;
+
+                if ( $CCVER == 50000 ) {
+                    print <<'EOF';
+WARNING! Found WorkShop C 5.0.
+         Make sure you have patch #107357-01 or later applied.
+EOF
+                    maybe_abort();
+                }
+            }
+        }
+    }
+
+    # On some systems, we assume a cc vendor if it's not already determined
+
+    if ( ! $CCVENDOR ) {
+        $CCVENDOR = 'aix' if $SYSTEM eq 'AIX';
+        $CCVENDOR = 'sun' if $SYSTEM eq 'SunOS';
+    }
+
+    # Some systems need to know extra details
+
+    if ( $SYSTEM eq "HP-UX" && $CCVENDOR eq 'gnu' ) {
+        # By default gcc is a ILP32 compiler (with long long == 64).
+        $GCC_BITS = "32";
+        if ( $CCVER >= 300 ) {
+            # PA64 support only came in with gcc 3.0.x.
+            # We check if the preprocessor symbol __LP64__ is defined.
+            if ( okrun('echo __LP64__',
+                       "$CC -v -E -x c - 2>/dev/null",
+                       'grep "^__LP64__" 2>&1 >/dev/null') ) {
+                # __LP64__ has slipped through, it therefore is not defined
+            } else {
+                $GCC_BITS = '64';
+            }
+        }
+    }
+
+    if ( $SYSTEM eq "SunOS" && $CCVENDOR eq 'gnu' ) {
+        if ( $CCVER >= 300 ) {
+            # 64-bit ABI isn't officially supported in gcc 3.0, but seems
+            # to be working; at the very least 'make test' passes.
+            if ( okrun("$CC -v -E -x c /dev/null 2>&1",
+                       'grep __arch64__ >/dev/null') ) {
+                $GCC_ARCH = "-m64"
+            } else {
+                $GCC_ARCH = "-m32"
+            }
+        }
+    }
+
+    if ($VERBOSE) {
+        my $vendor = $CCVENDOR ? $CCVENDOR : "(undetermined)";
+        my $version = $CCVER ? $CCVER : "(undetermined)";
+        print "C compiler: $CC\n";
+        print "C compiler vendor: $vendor\n";
+        print "C compiler version: $version\n";
+    }
+}
+
+my $map_patterns =
+    [ [ 'uClinux.*64.*',          { target => 'uClinux-dist64' } ],
+      [ 'uClinux.*',              { target => 'uClinux-dist' } ],
+      [ 'mips3-sgi-irix',         { target => 'irix-mips3' } ],
+      [ 'mips4-sgi-irix64',
+        sub {
+            print <<EOF;
+WARNING! To build 64-bit package, do this:
+         $WHERE/Configure irix64-mips4-$CC
+EOF
+            maybe_abort();
+            return { target => "irix-mips3" };
+        }
+      ],
+      [ 'ppc-apple-rhapsody',     { target => "rhapsody-ppc" } ],
+      [ 'ppc-apple-darwin.*',
+        sub {
+            my $KERNEL_BITS = $ENV{KERNEL_BITS};
+            my $ISA64 = `sysctl -n hw.optional.64bitops 2>/dev/null`;
+            if ( $ISA64 == 1 && $KERNEL_BITS eq '' ) {
+                print <<EOF;
+WARNING! To build 64-bit package, do this:
+         $WHERE/Configure darwin64-ppc-cc
+EOF
+                maybe_abort();
+            }
+            return { target => "darwin64-ppc" }
+                if $ISA64 == 1 && $KERNEL_BITS eq '64';
+            return { target => "darwin-ppc" };
+        }
+      ],
+      [ 'i.86-apple-darwin.*',
+        sub {
+            my $KERNEL_BITS = $ENV{KERNEL_BITS};
+            my $ISA64 = `sysctl -n hw.optional.x86_64 2>/dev/null`;
+            if ( $ISA64 == 1 && $KERNEL_BITS eq '' ) {
+                print <<EOF;
+WARNING! To build 64-bit package, do this:
+         KERNEL_BITS=64 $WHERE/Configure \[\[ options \]\]
+EOF
+                maybe_abort();
+            }
+            return { target => "darwin64-x86_64" }
+                if $ISA64 == 1 && $KERNEL_BITS eq '64';
+            return { target => "darwin-i386" };
+        }
+      ],
+      [ 'x86_64-apple-darwin.*',
+        sub {
+            my $KERNEL_BITS = $ENV{KERNEL_BITS};
+            return { target => "darwin-i386" } if $KERNEL_BITS eq '32';
+
+            print <<EOF;
+WARNING! To build 32-bit package, do this:
+         KERNEL_BITS=32 $WHERE/Configure \[\[ options \]\]
+EOF
+            maybe_abort();
+            return { target => "darwin64-x86_64" };
+        }
+      ],
+      [ 'armv6\+7-.*-iphoneos',
+        { target => "iphoneos-cross",
+          cflags => [ qw(-arch armv6 -arch armv7) ],
+          cxxflags => [ qw(-arch armv6 -arch armv7) ] }
+      ],
+      [ 'arm64-.*-iphoneos|.*-.*-ios64',
+        { target => "ios64-cross" }
+      ],
+      [ '.*-.*-iphoneos',
+        sub { return { target => "iphoneos-cross",
+                       cflags => [ "-arch ${MACHINE}" ],
+                       cxxflags => [ "-arch ${MACHINE}" ] }; }
+      ],
+      [ 'alpha-.*-linux2.*',
+        sub {
+            my $ISA = `awk '/cpu model/{print \$4;exit(0);}' /proc/cpuinfo`;
+            $ISA //= 'generic';
+            my %config = ();
+            if ( $CCVENDOR eq "gnu" ) {
+                if ( $ISA =~ 'EV5|EV45' ) {
+                    %config = ( cflags => [ '-mcpu=ev5' ],
+                                cxxflags =>  [ '-mcpu=ev5' ] );
+                } elsif ( $ISA =~ 'EV56|PCA56' ) {
+                    %config = ( cflags => [ '-mcpu=ev56' ],
+                                cxxflags =>  [ '-mcpu=ev56' ] );
+                } else {
+                    %config = ( cflags => [ '-mcpu=ev6' ],
+                                cxxflags =>  [ '-mcpu=ev6' ] );
+                }
+            }
+            return { target => "linux-alpha",
+                     %config };
+        }
+      ],
+      [ 'ppc64-.*-linux2',
+        sub {
+            my $KERNEL_BITS = $ENV{KERNEL_BITS};
+            if ( $KERNEL_BITS eq '' ) {
+                print <<EOF;
+WARNING! To build 64-bit package, do this:
+         $WHERE/Configure linux-ppc64
+EOF
+                maybe_abort();
+            }
+            return { target => "linux-ppc64" } if $KERNEL_BITS eq '64';
+
+            my %config = ();
+            if (!okrun('echo __LP64__',
+                       'gcc -E -x c - 2>/dev/null',
+                       'grep "^__LP64__" 2>&1 >/dev/null') ) {
+                %config = ( cflags => [ '-m32' ],
+                            cxxflags =>  [ '-m32' ] );
+            }
+            return { target => "linux-ppc",
+                     %config };
+        }
+      ],
+      [ 'ppc64le-.*-linux2',      { target => "linux-ppc64le" } ],
+      [ 'ppc-.*-linux2',          { target => "linux-ppc" } ],
+      [ 'mips64.*-*-linux2',
+        sub {
+            print <<EOF;
+WARNING! To build 64-bit package, do this:
+         $WHERE/Configure linux64-mips64
+EOF
+            maybe_abort();
+            return { target => "linux-mips64" };
+        }
+      ],
+      [ 'mips.*-.*-linux2',       { target => "linux-mips32" } ],
+      [ 'ppc60x-.*-vxworks.*',    { target => "vxworks-ppc60x" } ],
+      [ 'ppcgen-.*-vxworks.*',    { target => "vxworks-ppcgen" } ],
+      [ 'pentium-.*-vxworks.*',   { target => "vxworks-pentium" } ],
+      [ 'simlinux-.*-vxworks.*',  { target => "vxworks-simlinux" } ],
+      [ 'mips-.*-vxworks.*',      { target => "vxworks-mips" } ],
+      [ 'e2k-.*-linux.*',         { target => "linux-generic64",
+                                    defines => [ 'L_ENDIAN' ] } ],
+      [ 'ia64-.*-linux.',         { target => "linux-ia64" } ],
+      [ 'sparc64-.*-linux2',
+        sub {
+            print <<EOF;
+WARNING! If you *know* that your GNU C supports 64-bit/V9 ABI and you
+         want to build 64-bit library, do this:
+         $WHERE/Configure linux64-sparcv9
+EOF
+            maybe_abort();
+            return { target => "linux-sparcv9" };
+        }
+      ],
+      [ 'sparc-.*-linux2',
+        sub {
+            my $KARCH = `awk '/^type/{print \$3;exit(0);}' /proc/cpuinfo`;
+            $KARCH //= "sun4";
+            return { target => "linux-sparcv9" } if $KARCH =~ 'sun4u.*';
+            return { target => "linux-sparcv8" } if $KARCH =~ 'sun4[md]';
+            return { target => "linux-generic32",
+                     defines => [ 'L_ENDIAN' ] };
+        }
+      ],
+      [ 'parisc.*-.*-linux2',
+        sub {
+            # 64-bit builds under parisc64 linux are not supported and
+            # compiler is expected to generate 32-bit objects...
+            my $CPUARCH =
+                `awk '/cpu family/{print substr(\$5,1,3); exit(0);}' /proc/cpuinfo`;
+            my $CPUSCHEDULE =
+                `awk '/^cpu.[ 	]*: PA/{print substr(\$3,3); exit(0);}' /proc/cpuinfo`;
+            # TODO XXX  Model transformations
+            # 0. CPU Architecture for the 1.1 processor has letter suffixes.
+            #    We strip that off assuming no further arch. identification
+            #    will ever be used by GCC.
+            # 1. I'm most concerned about whether is a 7300LC is closer to a
+            #    7100 versus a 7100LC.
+            # 2. The variant 64-bit processors cause concern should GCC support
+            #    explicit schedulers for these chips in the future.
+            #         PA7300LC -> 7100LC (1.1)
+            #         PA8200   -> 8000   (2.0)
+            #         PA8500   -> 8000   (2.0)
+            #         PA8600   -> 8000   (2.0)
+            $CPUSCHEDULE =~ s/7300LC/7100LC/;
+            $CPUSCHEDULE =~ s/8.00/8000/;
+            return
+                { target => "linux-generic32",
+                  defines => [ 'B_ENDIAN' ],
+                  cflags => [ "-mschedule=$CPUSCHEDULE", "-march=$CPUARCH" ],
+                  cxxflags => [ "-mschedule=$CPUSCHEDULE", "-march=$CPUARCH" ]
+                };
+        }
+      ],
+      [ 'armv[1-3].*-.*-linux2',  { target => "linux-generic32" } ],
+      [ 'armv[7-9].*-.*-linux2',  { target => "linux-armv4",
+                                    defines => [ 'B_ENDIAN' ],
+                                    cflags => [ '-march=armv7-a' ],
+                                    cxxflags => [ '-march=armv7-a' ] } ],
+      [ 'arm.*-.*-linux2',        { target => "linux-armv4" } ],
+      [ 'aarch64-.*-linux2',      { target => "linux-aarch64" } ],
+      [ 'sh.*b-.*-linux2',        { target => "linux-generic32",
+                                    defines => [ 'B_ENDIAN' ] } ],
+      [ 'sh.*-.*-linux2',         { target => "linux-generic32",
+                                    defines => [ 'L_ENDIAN' ] } ],
+      [ 'm68k.*-.*-linux2',       { target => "linux-generic32",
+                                    defines => [ 'B_ENDIAN' ] } ],
+      [ 's390-.*-linux2',         { target => "linux-generic32",
+                                    defines => [ 'B_ENDIAN' ] } ],
+      [ 's390x-.*-linux2',
+        sub {
+            # Disabled until a glibc bug is fixed; see Configure.
+            if (0
+                || okrun('egrep -e \'^features.* highgprs\' /proc/cpuinfo >/dev/null') )
+                {
+                    print <<EOF;
+WARNING! To build "highgprs" 32-bit package, do this:
+         $WHERE/Configure linux32-s390x
+EOF
+                    maybe_abort();
+                }
+            return { target => "linux64-s390x" };
+        }
+      ],
+      [ 'x86_64-.*-linux.',
+        sub {
+            return { target => "linux-x32" }
+                if okrun("$CC -dM -E -x c /dev/null 2>&1",
+                         'grep -q ILP32 >/dev/null');
+            return { target => "linux-x86_64" };
+        }
+      ],
+      [ '.*86-.*-linux2',
+        sub {
+            # On machines where the compiler understands -m32, prefer a
+            # config target that uses it
+            return { target => "linux-x86" }
+                if okrun("$CC -m32 -E -x c /dev/null >/dev/null 2>&1");
+            return { target => "linux-elf" };
+        }
+      ],
+      [ '.*86-.*-linux1',         { target => "linux-aout" } ],
+      [ '.*-.*-linux.',           { target => "linux-generic32" } ],
+      [ 'sun4[uv].*-.*-solaris2',
+        sub {
+            my $KERNEL_BITS = $ENV{KERNEL_BITS};
+            my $ISA64 = `isainfo 2>/dev/null | grep sparcv9`;
+            if ( $ISA64 ne "" && $KERNEL_BITS eq '' ) {
+                if ( $CCVENDOR eq "sun" && $CCVER >= 500 ) {
+                    print <<EOF;
+WARNING! To build 64-bit package, do this:
+         $WHERE/Configure solaris64-sparcv9-cc
+EOF
+                    maybe_abort();
+                } elsif ( $CCVENDOR eq "gnu" && $GCC_ARCH eq "-m64" ) {
+                    # $GCC_ARCH denotes default ABI chosen by compiler driver
+                    # (first one found on the $PATH). I assume that user
+                    # expects certain consistency with the rest of his builds
+                    # and therefore switch over to 64-bit. <appro>
+                    print <<EOF;
+WARNING! To build 32-bit package, do this:
+         $WHERE/Configure solaris-sparcv9-gcc
+EOF
+                    maybe_abort();
+                    return { target => "solaris64-sparcv9" };
+                } elsif ( $GCC_ARCH eq "-m32" ) {
+                    print <<EOF;
+NOTICE! If you *know* that your GNU C supports 64-bit/V9 ABI and you wish
+        to build 64-bit library, do this:
+        $WHERE/Configure solaris64-sparcv9-gcc
+EOF
+                    maybe_abort();
+                }
+            }
+            return { target => "solaris64-sparcv9" }
+                if $ISA64 ne "" && $KERNEL_BITS eq '64';
+            return { target => "solaris-sparcv9" };
+        }
+      ],
+      [ 'sun4m-.*-solaris2',      { target => "solaris-sparcv8" } ],
+      [ 'sun4d-.*-solaris2',      { target => "solaris-sparcv8" } ],
+      [ 'sun4.*-.*-solaris2',     { target => "solaris-sparcv7" } ],
+      [ '.*86.*-.*-solaris2',
+        sub {
+            my $KERNEL_BITS = $ENV{KERNEL_BITS};
+            my $ISA64 = `isainfo 2>/dev/null | grep amd64`;
+            my $KB = $KERNEL_BITS // '64';
+            return { target => "solaris64-x86_64" }
+                if $ISA64 ne "" && $KB eq '64';
+            my $REL = uname('-r');
+            $REL =~ s/5\.//;
+            my @tmp_disable = ();
+            push @tmp_disable, 'sse2' if int($REL) < 10;
+            return { target => "solaris-x86",
+                     disable => [ @tmp_disable ] };
+        }
+      ],
+      # We don't have any sunos target in Configurations/*.conf, so why here?
+      [ '.*-.*-sunos4',           { target => "sunos" } ],
+      [ '.*86.*-.*-bsdi4',        { target => "BSD-x86-elf",
+                                    lflags => [ '-ldl' ],
+                                    disable => [ 'sse2' ] } ],
+      [ 'alpha.*-.*-.*bsd.*',     { target => "BSD-generic64",
+                                    defines => [ 'L_ENDIAN' ] } ],
+      [ 'powerpc64-.*-.*bsd.*',   { target => "BSD-generic64",
+                                    defines => [ 'B_ENDIAN' ] } ],
+      [ 'sparc64-.*-.*bsd.*',     { target => "BSD-sparc64" } ],
+      [ 'ia64-.*-.*bsd.*',        { target => "BSD-ia64" } ],
+      [ 'x86_64-.*-dragonfly.*',  { target => "BSD-x86_64" } ],
+      [ 'amd64-.*-.*bsd.*',       { target => "BSD-x86_64" } ],
+      [ '.*86.*-.*-.*bsd.*',
+        sub {
+            # mimic ld behaviour when it's looking for libc...
+            my $libc;
+            if ( -l "/usr/lib/libc.so" ) {
+                $libc = "/usr/lib/libc.so";
+            } else {
+                # ld searches for highest libc.so.* and so do we
+                $libc =
+                    `(ls /usr/lib/libc.so.* /lib/libc.so.* | tail -1) 2>/dev/null`;
+            }
+            my $what = `file -L $libc 2>/dev/null`;
+            return { target => "BSD-x86-elf" } if $what =~ /ELF/;
+            return { target => "BSD-x86",
+                     disable => [ 'sse2' ] };
+        }
+      ],
+      [ '.*-.*-.*bsd.*',          { target => "BSD-generic32" } ],
+      [ 'x86_64-.*-haiku',        { target => "haiku-x86_64" } ],
+      [ '.*-.*-haiku',            { target => "haiku-x86" } ],
+      [ '.*-.*-osf',              { target => "osf1-alpha" } ],
+      [ '.*-.*-tru64',            { target => "tru64-alpha" } ],
+      [ '.*-.*-[Uu]nix[Ww]are7',
+        sub {
+            return { target => "unixware-7",
+                     disable => [ 'sse2' ] } if $CCVENDOR eq "gnu";
+            return { target => "unixware-7",
+                     defines => [ '__i386__' ] };
+        }
+      ],
+      [ '.*-.*-[Uu]nix[Ww]are20.*', { target => "unixware-2.0",
+                                      disable => [ 'sse2', 'sha512' ] } ],
+      [ '.*-.*-[Uu]nix[Ww]are21.*', { target => "unixware-2.1",
+                                      disable => [ 'sse2', 'sha512' ] } ],
+      [ '.*-.*-vos',              { target => "vos",
+                                    disable => [ 'threads', 'shared', 'asm',
+                                                 'dso' ] } ],
+      [ 'BS2000-siemens-sysv4',   { target => "BS2000-OSD" } ],
+      [ 'i[3456]86-.*-cygwin',    { target => "Cygwin-x86" } ],
+      [ '.*-.*-cygwin',
+        sub { return { target => "Cygwin-${MACHINE}" } } ],
+      [ 'x86-.*-android|i.86-.*-android', { target => "android-x86" } ],
+      [ 'armv[7-9].*-.*-android', { target => "android-armeabi",
+                                    cflags => [ '-march=armv7-a' ],
+                                    cxxflags => [ '-march=armv7-a' ] } ],
+      [ 'arm.*-.*-android',       { target => "android-armeabi" } ],
+      [ '.*-hpux1.*',
+        sub {
+            my $KERNEL_BITS = $ENV{KERNEL_BITS};
+            my %common_return = ( defines => [ '_REENTRANT' ] );
+            $KERNEL_BITS ||= `getconf KERNEL_BITS 2>/dev/null` // '32';
+            # See <sys/unistd.h> for further info on CPU_VERSION.
+            my $CPU_VERSION = `getconf CPU_VERSION 2>/dev/null` // 0;
+            if ( $CPU_VERSION >= 768 ) {
+                # IA-64 CPU
+                return { target => "hpux64-ia64",
+                         %common_return }
+                    if $KERNEL_BITS eq '64' && ! $CCVENDOR;
+                return { target => "hpux-ia64",
+                         %common_return };
+            }
+            if ( $CPU_VERSION >= 532 ) {
+                # PA-RISC 2.x CPU
+                # PA-RISC 2.0 is no longer supported as separate 32-bit
+                # target. This is compensated for by run-time detection
+                # in most critical assembly modules and taking advantage
+                # of 2.0 architecture in PA-RISC 1.1 build.
+                my $target = ($CCVENDOR eq "gnu" && $GCC_BITS eq '64')
+                    ? "hpux64-parisc2"
+                    : "hpux-parisc1_1";
+                if ( $KERNEL_BITS eq '64' && ! $CCVENDOR ) {
+                    print <<EOF;
+WARNING! To build 64-bit package, do this:
+         $WHERE/Configure hpux64-parisc2-cc
+EOF
+                    maybe_abort();
+                }
+                return { target => $target,
+                         %common_return };
+            }
+            # PA-RISC 1.1+ CPU?
+            return { target => "hpux-parisc1_1",
+                     %common_return } if $CPU_VERSION >= 528;
+            # PA-RISC 1.0 CPU
+            return { target => "hpux-parisc",
+                     %common_return } if $CPU_VERSION >= 523;
+            # Motorola(?) CPU
+            return { target => "hpux",
+                     %common_return };
+        }
+      ],
+      [ '.*-hpux',                { target => "hpux-parisc" } ],
+      [ '.*-aix',
+        sub {
+            my %config = ();
+            my $KERNEL_BITS = $ENV{KERNEL_BITS};
+            $KERNEL_BITS ||= `getconf KERNEL_BITMODE 2>/dev/null`;
+            $KERNEL_BITS ||= '32';
+            my $OBJECT_MODE = $ENV{OBJECT_MODE};
+            $OBJECT_MODE ||= 32;
+            $config{target} = "aix";
+            if ( $OBJECT_MODE == 64 ) {
+                print 'Your $OBJECT_MODE was found to be set to 64';
+                $config{target} = "aix64";
+            } else {
+                if ( $CCVENDOR ne 'gnu' && $KERNEL_BITS eq '64' ) {
+                    print <<EOF;
+WARNING! To build 64-bit package, do this:
+         $WHERE/Configure aix64-cc
+EOF
+                    maybe_abort();
+                }
+            }
+            if ( okrun(
+                       "lsattr -E -O -l `lsdev -c processor|awk '{print \$1;exit}'`",
+                       'grep -i powerpc) >/dev/null 2>&1') ) {
+                # this applies even to Power3 and later, as they return
+                # PowerPC_POWER[345]
+            } else {
+                $config{disable} = [ 'asm' ];
+            }
+            return %config;
+        }
+      ],
+    ];
+
+# Map GUESSOS into OpenSSL terminology.
+# Returns a hash table with diverse entries, most importantly 'target',
+# but also other entries that are fitting for Configure's %config
+# and MACHINE.
+# It would be nice to fix this so that this weren't necessary. :( XXX
+sub map_guess {
+    my $GUESSOS = shift;
+
+    foreach my $tuple ( @$map_patterns ) {
+        my $pat = @$tuple[0];
+        next if $GUESSOS !~ /^${pat}$/;
+        my $result = @$tuple[1];
+        $result = $result->() if ref $result eq 'CODE';
+        return %$result;
+    }
+
+    # Last case, return "z" from x-y-z
+    my @fields = split(/-/, $GUESSOS);
+    return ( target => $fields[2] );
+}
+
+# gcc < 2.8 does not support -march=ultrasparc
+sub check_solaris_sparc8 {
+    my $OUT = shift;
+    if ( $CCVENDOR eq 'gnu' && $CCVER < 208 ) {
+        if ( $OUT eq 'solaris-sparcv9-gcc' ) {
+            print <<EOF;
+WARNING! Downgrading to solaris-sparcv8-gcc
+         Upgrade to gcc-2.8 or later.
+EOF
+            maybe_abort();
+            return 'solaris-sparcv8-gcc';
+        }
+        if ( $OUT eq "linux-sparcv9" ) {
+            print <<EOF;
+WARNING! Downgrading to linux-sparcv8
+         Upgrade to gcc-2.8 or later.
+EOF
+            maybe_abort();
+            return 'linux-sparcv8';
+        }
+    }
+    return $OUT;
+}
+
+###
+###   MAIN PROCESSING
+###
+
+sub get_platform {
+    my %options = @_;
+
+    $VERBOSE = 1 if defined $options{verbose};
+    $WAIT = 0 if defined $options{nowait};
+    $CC = $options{CC};
+    $CROSS_COMPILE = $options{CROSS_COMPILE} // '';
+
+    my $GUESSOS = guess_system();
+    determine_compiler_settings();
+
+    my %ret = map_guess($GUESSOS);
+    $ret{target} = check_solaris_sparc8($ret{target});
+    return %ret;
+}
+
+1;


More information about the openssl-commits mailing list