Rework building: Unix changes to handle extensions and product names
authorRichard Levitte <levitte@openssl.org>
Tue, 23 Oct 2018 13:09:57 +0000 (15:09 +0200)
committerRichard Levitte <levitte@openssl.org>
Mon, 21 Jan 2019 18:31:32 +0000 (19:31 +0100)
Add platform::Unix, which is a generic Unix module to support product
name and extensions functionlity.  However, this isn't quite enough,
as mingw and Cygwin builds are done using the same templates, but
since shared libraries work as on Windows and are named accordingly,
platform::mingw and platform::Cygwin were also added to provide the
necessary tweaks.

This reworks Configurations/unix-Makefile.tmpl to work out product
names in platform::Unix et al terms.  In this one, we currently do
care about the *_extension config attributes, and the modules adapt
accordingly where it matters.

This change also affected crypto/include/internal/dso_conf.h.in, since
the DSO extension is meant to be the same as the short shared library
extension, which isn't '.so' everywhere.

'shared_extension' attributes that had the value
'.so.\$(SHLIB_VERSION_NUMBER)' are removed, platform::Unix provides
an extension where the shared library version number is hard-coded
instead.

Reviewed-by: Tim Hudson <tjh@openssl.org>
Reviewed-by: Paul Dale <paul.dale@oracle.com>
(Merged from https://github.com/openssl/openssl/pull/7473)

Configurations/00-base-templates.conf
Configurations/10-main.conf
Configurations/50-haiku.conf
Configurations/90-team.norelease.conf
Configurations/platform/Cygwin.pm [new file with mode: 0644]
Configurations/platform/Unix.pm [new file with mode: 0644]
Configurations/platform/mingw.pm [new file with mode: 0644]
Configurations/unix-Makefile.tmpl
Configure
crypto/include/internal/dso_conf.h.in

index 05672208ab48612886540e294cb15e7200eafc69..eb9feae946c2cad1af8af8a7a63494a24f83aded 100644 (file)
@@ -42,7 +42,6 @@ my %targets=(
        shared_defines  => [],
        shared_ldflag   => "",
        shared_rcflag   => "",
-       shared_extension        => "",
 
        #### Defaults for the benefit of the config targets who don't inherit
        #### a BASE and assume Unix defaults
@@ -102,10 +101,10 @@ my %targets=(
                                      ? "ranlib" : "" },
         RC              => "windres",
 
-        shared_extension => ".so",
-
         build_scheme    => [ "unified", "unix" ],
         build_file      => "Makefile",
+
+        perl_platform   => 'Unix',
     },
 
     BASE_Windows => {
index 3de8c29a26437f6c5f32ec5d51111f7135d9aa95..054e38c075e0a703390a747a7c03dd04e406dae0 100644 (file)
@@ -212,7 +212,6 @@ my %targets = (
         dso_scheme       => "dlfcn",
         thread_scheme    => "pthreads",
         shared_target    => "solaris",
-        shared_extension => ".so.\$(SHLIB_VERSION_NUMBER)",
         shared_ldflag    => "-Wl,-Bsymbolic",
         shared_defflag   => "-Wl,-M,",
         shared_sonameflag=> "-Wl,-h,",
@@ -365,7 +364,6 @@ my %targets = (
         thread_scheme    => "pthreads",
         dso_scheme       => "dlfcn",
         shared_target    => "self",
-        shared_extension => ".so.\$(SHLIB_VERSION_NUMBER)",
         shared_ldflag    => "-shared -Wl,-Bsymbolic",
         shared_sonameflag=> "-Wl,-soname,",
     },
@@ -534,7 +532,6 @@ my %targets = (
         bn_ops           => "SIXTY_FOUR_BIT",
         shared_cflag     => "+Z",
         shared_ldflag    => add_before("-b"),
-        shared_extension => ".so.\$(SHLIB_VERSION_NUMBER)",
         multilib         => "/hpux32",
     },
     "hpux64-ia64-cc" => {
@@ -548,7 +545,6 @@ my %targets = (
         bn_ops           => "SIXTY_FOUR_BIT_LONG",
         shared_cflag     => "+Z",
         shared_ldflag    => add_before("-b"),
-        shared_extension => ".so.\$(SHLIB_VERSION_NUMBER)",
         multilib         => "/hpux64",
     },
     # GCC builds...
@@ -562,7 +558,6 @@ my %targets = (
         bn_ops           => "SIXTY_FOUR_BIT",
         shared_cflag     => "-fpic",
         shared_ldflag    => add_before("-shared"),
-        shared_extension => ".so.\$(SHLIB_VERSION_NUMBER)",
         multilib         => "/hpux32",
     },
     "hpux64-ia64-gcc" => {
@@ -575,7 +570,6 @@ my %targets = (
         bn_ops           => "SIXTY_FOUR_BIT_LONG",
         shared_cflag     => "-fpic",
         shared_ldflag    => add_before("-shared"),
-        shared_extension => ".so.\$(SHLIB_VERSION_NUMBER)",
         multilib         => "/hpux64",
     },
 
@@ -652,7 +646,6 @@ my %targets = (
         shared_target    => "linux-shared",
         shared_cflag     => "-fPIC",
         shared_ldflag    => sub { $disabled{pinshared} ? () : "-Wl,-znodelete" },
-        shared_extension => ".so.\$(SHLIB_VERSION_NUMBER)",
         enable           => [ "afalgeng" ],
     },
     "linux-generic64" => {
@@ -906,7 +899,6 @@ my %targets = (
         shared_target    => "linux-shared",
         shared_cflag     => "--pic",
         shared_ldflag    => add("-z --sysv --shared"),
-        shared_extension => ".so.\$(SHLIB_VERSION_NUMBER)",
         ranlib           => "true",
     },
 
@@ -933,7 +925,6 @@ my %targets = (
         dso_scheme       => "dlfcn",
         shared_target    => "bsd-gcc-shared",
         shared_cflag     => "-fPIC",
-        shared_extension => ".so.\$(SHLIB_VERSION_NUMBER)",
     },
     "BSD-generic64" => {
         inherit_from     => [ "BSD-generic32" ],
@@ -991,7 +982,6 @@ my %targets = (
         dso_scheme       => "dlfcn",
         shared_target    => "bsd-gcc-shared",
         shared_cflag     => "-fPIC",
-        shared_extension => ".so.\$(SHLIB_VERSION_NUMBER)",
     },
 
     "nextstep" => {
@@ -1052,7 +1042,6 @@ my %targets = (
         dso_scheme       => "dlfcn",
         shared_target    => "svr5-shared",
         shared_cflag     => "-Kpic",
-        shared_extension => ".so.\$(SHLIB_VERSION_NUMBER)",
     },
     "unixware-7-gcc" => {
         inherit_from     => [ "BASE_unix", asm("x86_elf_asm") ],
@@ -1067,7 +1056,6 @@ my %targets = (
         dso_scheme       => "dlfcn",
         shared_target    => "gnu-shared",
         shared_cflag     => "-fPIC",
-        shared_extension => ".so.\$(SHLIB_VERSION_NUMBER)",
     },
 # SCO 5 - Ben Laurie says the -O breaks the SCO cc.
     "sco5-cc" => {
@@ -1080,7 +1068,6 @@ my %targets = (
         dso_scheme       => "dlfcn",
         shared_target    => "svr3-shared",
         shared_cflag     => "-Kpic",
-        shared_extension => ".so.\$(SHLIB_VERSION_NUMBER)",
     },
     "sco5-gcc" => {
         inherit_from     => [ "BASE_unix", asm("x86_elf_asm") ],
@@ -1093,7 +1080,6 @@ my %targets = (
         dso_scheme       => "dlfcn",
         shared_target    => "svr3-shared",
         shared_cflag     => "-fPIC",
-        shared_extension => ".so.\$(SHLIB_VERSION_NUMBER)",
     },
 
 #### IBM's AIX.
@@ -1114,8 +1100,6 @@ my %targets = (
         module_ldflags   => "-Wl,-G,-bsymbolic,-bexpall",
         shared_ldflag    => "-Wl,-G,-bsymbolic",
         shared_defflag   => "-Wl,-bE:",
-        shared_extension => ".so.\$(SHLIB_VERSION_NUMBER)",
-        dso_extension    => ".so",
         lib_extension    => shared("_a.a"),
         shared_extension_simple => shared(".a"),
     },
@@ -1376,30 +1360,37 @@ my %targets = (
     },
 
 #### MinGW
-    "mingw" => {
-        inherit_from     => [ "BASE_unix", asm("x86_asm"),
-                              sub { $disabled{shared} ? () : "x86_uplink" } ],
+    "mingw-common" => {
+        inherit_from     => [ 'BASE_unix' ],
+        template         => 1,
         CC               => "gcc",
         CFLAGS           => picker(default => "-Wall",
                                    debug   => "-g -O0",
-                                   release => "-O3 -fomit-frame-pointer"),
-        cflags           => "-m32",
+                                   release => "-O3"),
         cppflags         => combine("-DUNICODE -D_UNICODE -DWIN32_LEAN_AND_MEAN",
                                     threads("-D_MT")),
         lib_cppflags     => "-DL_ENDIAN",
-        sys_id           => "MINGW32",
         ex_libs          => add("-lws2_32 -lgdi32 -lcrypt32"),
-        bn_ops           => "BN_LLONG EXPORT_VAR_AS_FN",
+        bn_ops           => "EXPORT_VAR_AS_FN",
         thread_scheme    => "winthreads",
-        perlasm_scheme   => "coff",
         dso_scheme       => "win32",
         shared_target    => "mingw-shared",
         shared_cppflags  => add("_WINDLL"),
         shared_ldflag    => "-static-libgcc",
+        apps_aux_src     => add("win32_init.c"),
+
+        perl_platform    => 'mingw',
+    },
+    "mingw" => {
+        inherit_from     => [ "mingw-common", asm("x86_asm"),
+                              sub { $disabled{shared} ? () : "x86_uplink" } ],
+        CFLAGS           => add(picker(release => "-fomit-frame-pointer")),
+        cflags           => "-m32",
+        sys_id           => "MINGW32",
+        bn_ops           => add("BN_LLONG"),
+        perlasm_scheme   => "coff",
         shared_rcflag    => "--target=pe-i386",
-        shared_extension => ".dll",
         multilib         => "",
-        apps_aux_src     => add("win32_init.c"),
     },
     "mingw64" => {
         # As for OPENSSL_USE_APPLINK. Applink makes it possible to use
@@ -1410,28 +1401,13 @@ my %targets = (
         # consider its binaries for using with non-mingw64 run-time
         # environment. And as mingw64 is always consistent with itself,
         # Applink is never engaged and can as well be omitted.
-        inherit_from     => [ "BASE_unix", asm("x86_64_asm") ],
-        CC               => "gcc",
-        CFLAGS           => picker(default => "-Wall",
-                                   debug   => "-g -O0",
-                                   release => "-O3"),
+        inherit_from     => [ "mingw-common", asm("x86_64_asm") ],
         cflags           => "-m64",
-        cppflags         => combine("-DUNICODE -D_UNICODE -DWIN32_LEAN_AND_MEAN",
-                                    threads("-D_MT")),
-        lib_cppflags     => "-DL_ENDIAN",
         sys_id           => "MINGW64",
-        ex_libs          => add("-lws2_32 -lgdi32 -lcrypt32"),
-        bn_ops           => "SIXTY_FOUR_BIT EXPORT_VAR_AS_FN",
-        thread_scheme    => "winthreads",
+        bn_ops           => add("SIXTY_FOUR_BIT"),
         perlasm_scheme   => "mingw64",
-        dso_scheme       => "win32",
-        shared_target    => "mingw-shared",
-        shared_cppflags  => add("_WINDLL"),
-        shared_ldflag    => "-static-libgcc",
         shared_rcflag    => "--target=pe-x86-64",
-        shared_extension => ".dll",
         multilib         => "64",
-        apps_aux_src     => add("win32_init.c"),
     },
 
 #### UEFI
@@ -1455,37 +1431,34 @@ my %targets = (
     },
 
 #### Cygwin
-    "Cygwin-x86" => {
+    "Cygwin-common" => {
         inherit_from     => [ "BASE_unix", asm("x86_asm") ],
+        template         => 1,
+
         CC               => "gcc",
         CFLAGS           => picker(default => "-Wall",
                                    debug   => "-g -O0",
-                                   release => "-O3 -fomit-frame-pointer"),
+                                   release => "-O3"),
         lib_cppflags     => "-DTERMIOS -DL_ENDIAN",
         sys_id           => "CYGWIN",
-        bn_ops           => "BN_LLONG",
         thread_scheme    => "pthread",
-        perlasm_scheme   => "coff",
         dso_scheme       => "dlfcn",
         shared_target    => "cygwin-shared",
         shared_cppflags  => "-D_WINDLL",
-        shared_extension => ".dll",
+
+        perl_platform    => 'Cygwin',
+    },
+    "Cygwin-x86" => {
+        inherit_from     => [ "Cygwin-common", asm("x86_asm") ],
+        CFLAGS           => add(picker(release => "-O3 -fomit-frame-pointer")),
+        bn_ops           => "BN_LLONG",
+        perlasm_scheme   => "coff",
     },
     "Cygwin-x86_64" => {
-        inherit_from     => [ "BASE_unix", asm("x86_64_asm") ],
+        inherit_from     => [ "Cygwin-common", asm("x86_64_asm") ],
         CC               => "gcc",
-        CFLAGS           => picker(default => "-Wall",
-                                   debug   => "-g -O0",
-                                   release => "-O3"),
-        lib_cppflags     => "-DTERMIOS -DL_ENDIAN",
-        sys_id           => "CYGWIN",
         bn_ops           => "SIXTY_FOUR_BIT_LONG",
-        thread_scheme    => "pthread",
         perlasm_scheme   => "mingw64",
-        dso_scheme       => "dlfcn",
-        shared_target    => "cygwin-shared",
-        shared_cppflags  => "-D_WINDLL",
-        shared_extension => ".dll",
     },
     # Backward compatibility for those using this target
     "Cygwin" => {
@@ -1572,7 +1545,6 @@ my %targets = (
         dso_scheme       => "dlfcn",
         shared_target    => "linux-shared",
         shared_cflag     => "-fPIC",
-        shared_extension => ".so.\$(SHLIB_VERSION_NUMBER)",
     },
 
 ##### VxWorks for various targets
@@ -1688,7 +1660,6 @@ my %targets = (
         dso_scheme       => sub { env('LIBSSL_dlfcn') },
         shared_target    => "linux-shared",
         shared_cflag     => "-fPIC",
-        shared_extension => ".so.\$(SHLIB_VERSION_NUMBER)",
         ranlib           => sub { env('RANLIB') },
     },
     "uClinux-dist64" => {
@@ -1701,7 +1672,6 @@ my %targets = (
         dso_scheme       => sub { env('LIBSSL_dlfcn') },
         shared_target    => "linux-shared",
         shared_cflag     => "-fPIC",
-        shared_extension => ".so.\$(SHLIB_VERSION_NUMBER)",
         ranlib           => sub { env('RANLIB') },
     },
 
index cd6d10e5f082607c153dfa9d1613e757ecf070ab..5bc4db5f6e596c7f079871107631f08d2d995187 100644 (file)
@@ -15,7 +15,7 @@ my %targets = (
         shared_target    => "gnu-shared",
         shared_cflag     => "-fPIC",
         shared_ldflag    => "-shared",
-        shared_extension => ".so.\$(SHLIB_VERSION_NUMBER)",
+        perl_platform    => 'Unix',
     },
     "haiku-x86" => {
         inherit_from     => [ "haiku-common", asm("x86_elf_asm") ],
index a9ab98d0425bd36db38e131d2f28234d8243cb22..7849fdbf64bdedddbb5f93aa98f332d3ca1f6252 100644 (file)
@@ -28,7 +28,6 @@ my %targets = (
         shared_target    => "linux-shared",
         shared_cflag     => "-fPIC",
         shared_ldflag    => "-m64",
-        shared_extension => ".so.\$(SHLIB_VERSION_NUMBER)",
         multilib         => "64",
     },
     "debug-linux-pentium" => {
@@ -77,7 +76,6 @@ my %targets = (
         dso_scheme       => "dlfcn",
         shared_target    => "linux-shared",
         shared_cflag     => "-fPIC",
-        shared_extension => ".so.\$(SHLIB_VERSION_NUMBER)",
     },
     "debug-test-64-clang" => {
         inherit_from     => [ 'BASE_unix', "x86_64_asm" ],
@@ -90,7 +88,6 @@ my %targets = (
         dso_scheme       => "dlfcn",
         shared_target    => "bsd-gcc-shared",
         shared_cflag     => "-fPIC",
-        shared_extension => ".so.\$(SHLIB_VERSION_NUMBER)",
     },
     "darwin64-debug-test-64-clang" => {
         inherit_from     => [ 'BASE_unix', "x86_64_asm" ],
diff --git a/Configurations/platform/Cygwin.pm b/Configurations/platform/Cygwin.pm
new file mode 100644 (file)
index 0000000..bc62e9d
--- /dev/null
@@ -0,0 +1,22 @@
+package platform::Cygwin;
+
+use strict;
+use warnings;
+use Carp;
+
+use vars qw(@ISA);
+
+require platform::mingw;
+@ISA = qw(platform::mingw);
+
+# Assume someone set @INC right before loading this module
+use configdata;
+
+sub sharedname {
+    my $class = shift;
+    my $lib = platform::mingw->sharedname(@_);
+    $lib =~ s|^lib|cyg| if defined $lib;
+    return $lib;
+}
+
+1;
diff --git a/Configurations/platform/Unix.pm b/Configurations/platform/Unix.pm
new file mode 100644 (file)
index 0000000..7f69cac
--- /dev/null
@@ -0,0 +1,70 @@
+package platform::Unix;
+
+use strict;
+use warnings;
+use Carp;
+
+use vars qw(@ISA);
+
+require platform::BASE;
+@ISA = qw(platform::BASE);
+
+# Assume someone set @INC right before loading this module
+use configdata;
+
+sub binext              { $target{exe_extension} || '' }
+sub dsoext              { $target{dso_extension} || '.so' }
+# Because these are also used in scripts and not just Makefile, we must
+# convert $(SHLIB_VERSION_NUMBER) to the actual number.
+sub shlibext            { (my $x = $target{shared_extension}
+                               || '.so.$(SHLIB_VERSION_NUMBER)')
+                              =~ s|\.\$\(SHLIB_VERSION_NUMBER\)
+                                  |.$config{shlib_version}|x;
+                          $x; }
+sub libext              { $target{lib_extension} || '.a' }
+sub defext              { $target{def_extension} || '.ld' }
+sub objext              { $target{obj_extension} || '.o' }
+sub depext              { $target{obj_extension} || '.d' }
+
+# Other extra that aren't defined in platform::BASE
+sub shlibextsimple      { (my $x = $target{shared_extension} || '.so')
+                              =~ s|\.\$\(SHLIB_VERSION_NUMBER\)||;
+                          $x; }
+sub shlibvariant        { $target{shlib_variant} || "" }
+sub makedepprog         { $disabled{makedepend} ? undef : $config{makedepprog} }
+
+# No conversion of assembler extension on Unix
+sub asm {
+    return $_[1];
+}
+
+# At some point, we might decide that static libraries are called something
+# other than the default...
+sub staticname {
+    # Non-installed libraries are *always* static, and their names remain
+    # the same, except for the mandatory extension
+    my $in_libname = platform::BASE->staticname($_[1]);
+    return $in_libname
+        unless ( grep { platform::BASE->staticname($_) eq $in_libname }
+                 @{$unified_info{install}->{libraries}} );
+
+    # We currently return the same name anyway...  but we might choose to
+    # append '_static' or '_a' some time in the future.
+    return platform::BASE->staticname($_[1]);
+}
+
+sub sharedname {
+    return platform::BASE::__concat(platform::BASE->sharedname($_[1]),
+                                    ($_[0]->shlibvariant() // ''));
+}
+
+sub sharedname_simple {
+    return platform::BASE::__isshared($_[1]) ? $_[1] : undef;
+}
+
+sub sharedlib_simple {
+    return platform::BASE::__concat($_[0]->sharedname_simple($_[1]),
+                                    $_[0]->shlibextsimple());
+}
+
+1;
diff --git a/Configurations/platform/mingw.pm b/Configurations/platform/mingw.pm
new file mode 100644 (file)
index 0000000..5788a36
--- /dev/null
@@ -0,0 +1,45 @@
+package platform::mingw;
+
+use strict;
+use warnings;
+use Carp;
+
+use vars qw(@ISA);
+
+require platform::Unix;
+@ISA = qw(platform::Unix);
+
+# Assume someone set @INC right before loading this module
+use configdata;
+
+sub binext              { '.exe' }
+sub objext              { '.obj' }
+sub libext              { '.a' }
+sub dsoext              { '.dll' }
+sub defext              { '.def' }
+sub shlibext            { '.dll' }
+sub shlibextimport      { $target{shared_import_extension} || '.dll.a' }
+sub shlibextsimple      { undef }
+sub makedepprog         { $disabled{makedepend} ? undef : $config{makedepprog} }
+
+(my $sover_filename = $config{shlib_version}) =~ s|\.|_|g;
+sub shlib_version_as_filename {
+    return $sover_filename;
+}
+sub sharedname {
+    return platform::BASE::__concat(platform::BASE->sharedname($_[1]),
+                                    "-",
+                                    $_[0]->shlib_version_as_filename(),
+                                    ($config{target} eq "mingw64"
+                                         ? "-x64" : ""));
+}
+
+# With Mingw and other DLL producers, there isn't really any "simpler"
+# shared library name.  However, there is a static import library, so
+# we return that instead.
+sub sharedlib_simple {
+    return platform::BASE::__concat(platform::BASE->sharedname($_[1]),
+                                    $_[0]->shlibextimport());
+}
+
+1;
index 11fecc259b2f2c50be81a3ab7a88355ca1b68ef1..4c76b8d7ea665f71f7b80d2863bdeaa4b170e356 100644 (file)
@@ -3,17 +3,7 @@
 ##
 ## {- join("\n## ", @autowarntext) -}
 {-
-     our $objext = $target{obj_extension} || ".o";
-     our $defext = $target{def_extension} || ".ld";
-     our $depext = $target{dep_extension} || ".d";
-     our $exeext = $target{exe_extension} || "";
-     our $libext = $target{lib_extension} || ".a";
-     our $shlibext = $target{shared_extension} || ".so";
-     our $shlibvariant = $target{shlib_variant} || "";
-     our $shlibextsimple = $target{shared_extension_simple} || ".so";
-     our $shlibextimport = $target{shared_import_extension} || "";
-     our $dsoext = $target{dso_extension} || ".so";
-     our $makedepprog = $disabled{makedepend} ? undef : $config{makedepprog};
+     our $makedepprog = platform->makedepprog();
 
      sub windowsdll { $config{target} =~ /^(?:Cygwin|mingw)/ }
 
      # libcrypto.a and use libcrypto_a.a as static one.
      sub sharedaix  { !$disabled{shared} && $config{target} =~ /^aix/ }
 
-     our $sover_dirname = $config{shlib_version};
-     $sover_dirname =~ s|\.|_|g
-         if $config{target} =~ /^mingw/;
-
-     # shlib and shlib_simple both take a static library name and figure
-     # out what the shlib name should be.
-     #
-     # When OpenSSL is configured "no-shared", these functions will just
-     # return empty lists, making them suitable to join().
-     #
-     # With Windows DLL producers, shlib($libname) will return the shared
-     # library name (which usually is different from the static library
-     # name) with the default shared extension appended to it, while
-     # shlib_simple($libname) will return the static library name with
-     # the shared extension followed by ".a" appended to it.  The former
-     # result is used as the runtime shared library while the latter is
-     # used as the DLL import library.
-     #
-     # On all Unix systems, shlib($libname) will return the library name
-     # with the default shared extension, while shlib_simple($libname)
-     # will return the name from shlib($libname) with any SO version number
-     # removed.  On some systems, they may therefore return the exact same
-     # string.
-     sub shlib {
-         my $lib = shift;
-         return () if $disabled{shared} || $lib =~ /\.a$/;
-         return $unified_info{sharednames}->{$lib}. $shlibvariant. '$(SHLIB_EXT)';
-     }
-     sub shlib_simple {
-         my $lib = shift;
-         return () if $disabled{shared} || $lib =~ /\.a$/;
-
-         if (windowsdll()) {
-             return $lib . '$(SHLIB_EXT_IMPORT)';
-         }
-         return $lib .  '$(SHLIB_EXT_SIMPLE)';
-     }
-
-     # Easy fixing of static library names
-     sub lib {
-         (my $lib = shift) =~ s/\.a$//;
-         return $lib . $libext;
-     }
+     our $sover_dirname = platform->shlib_version_as_filename();
 
-     # dso is a complement to shlib / shlib_simple that returns the
-     # given libname with the simple shared extension (possible SO version
-     # removed).  This differs from shlib_simple() by being unconditional.
-     sub dso {
-         my $engine = shift;
-
-         return $engine . $dsoext;
-     }
      # This makes sure things get built in the order they need
      # to. You're welcome.
      sub dependmagic {
@@ -93,33 +33,33 @@ MAJOR={- $config{major} -}
 MINOR={- $config{minor} -}
 SHLIB_VERSION_NUMBER={- $config{shlib_version} -}
 SHLIB_TARGET={- $target{shared_target} -}
-SHLIB_EXT={- $shlibext -}
-SHLIB_EXT_SIMPLE={- $shlibextsimple -}
-SHLIB_EXT_IMPORT={- $shlibextimport -}
-
-LIBS={- join(" ", map { lib($_) } @{$unified_info{libraries}}) -}
-SHLIBS={- join(" ", map { shlib($_) } @{$unified_info{libraries}}) -}
-SHLIB_INFO={- join(" ", map { "\"".shlib($_).";".shlib_simple($_)."\"" } @{$unified_info{libraries}}) -}
-ENGINES={- join(" ", map { dso($_) } @{$unified_info{engines}}) -}
-PROGRAMS={- join(" ", map { $_.$exeext } @{$unified_info{programs}}) -}
+
+LIBS={- join(" ", map { platform->staticlib($_) // () } @{$unified_info{libraries}}) -}
+SHLIBS={- join(" ", map { platform->sharedlib($_) // () } @{$unified_info{libraries}}) -}
+SHLIB_INFO={- join(" ", map { my $x = platform->sharedlib($_);
+                              my $y = platform->sharedlib_simple($_);
+                              $x ? "\"$x;$y\"" : () }
+                        @{$unified_info{libraries}}) -}
+ENGINES={- join(" ", map { platform->dso($_) } @{$unified_info{engines}}) -}
+PROGRAMS={- join(" ", map { platform->bin($_) } @{$unified_info{programs}}) -}
 SCRIPTS={- join(" ", @{$unified_info{scripts}}) -}
 {- output_off() if $disabled{makedepend}; "" -}
-DEPS={- join(" ", map { (my $x = $_) =~ s|\.o$|$depext|; $x; }
+DEPS={- join(" ", map { platform->isobj($_) ? platform->dep($_) : () }
                   grep { $unified_info{sources}->{$_}->[0] =~ /\.c$/ }
                   keys %{$unified_info{sources}}); -}
 {- output_on() if $disabled{makedepend}; "" -}
 GENERATED_MANDATORY={- join(" ", @{$unified_info{depends}->{""}}) -}
 GENERATED={- # common0.tmpl provides @generated
-             join(" ", map { my $x = $_;
-                             $x =~ s|\.ld$|$defext|;
-                             $x }
-                       @generated ) -}
-
-INSTALL_LIBS={- join(" ", map { lib($_) } @{$unified_info{install}->{libraries}}) -}
-INSTALL_SHLIBS={- join(" ", map { shlib($_) } @{$unified_info{install}->{libraries}}) -}
-INSTALL_SHLIB_INFO={- join(" ", map { "\"".shlib($_).";".shlib_simple($_)."\"" } @{$unified_info{install}->{libraries}}) -}
-INSTALL_ENGINES={- join(" ", map { dso($_) } @{$unified_info{install}->{engines}}) -}
-INSTALL_PROGRAMS={- join(" ", map { $_.$exeext } @{$unified_info{install}->{programs}}) -}
+             join(" ", map { platform->convertext($_) } @generated ) -}
+
+INSTALL_LIBS={- join(" ", map { platform->staticlib($_) // () } @{$unified_info{install}->{libraries}}) -}
+INSTALL_SHLIBS={- join(" ", map { platform->sharedlib($_) // () } @{$unified_info{install}->{libraries}}) -}
+INSTALL_SHLIB_INFO={- join(" ", map { my $x = platform->sharedlib($_);
+                                      my $y = platform->sharedlib_simple($_);
+                                      $x ? "\"$x;$y\"" : () }
+                                @{$unified_info{install}->{libraries}}) -}
+INSTALL_ENGINES={- join(" ", map { platform->dso($_) } @{$unified_info{install}->{engines}}) -}
+INSTALL_PROGRAMS={- join(" ", map { platform->bin($_) } @{$unified_info{install}->{programs}}) -}
 {- output_off() if $disabled{apps}; "" -}
 BIN_SCRIPTS=$(BLDDIR)/tools/c_rehash
 MISC_SCRIPTS=$(BLDDIR)/apps/CA.pl $(BLDDIR)/apps/tsget.pl:tsget
@@ -374,7 +314,7 @@ test: tests
          BLDTOP=../$(BLDDIR) \
          RESULT_D=test-runs \
          PERL="$(PERL)" \
-         EXE_EXT={- $exeext -} \
+         EXE_EXT={- platform->binext() -} \
          OPENSSL_ENGINES=`cd ../$(BLDDIR)/engines 2>/dev/null && pwd` \
          OPENSSL_DEBUG_MEMORY=on \
            $(PERL) ../$(SRCDIR)/test/run_tests.pl $(TESTS) )
@@ -410,13 +350,13 @@ libclean:
                fi; \
        done
        $(RM) $(LIBS)
-       $(RM) *.{- $defext -}
+       $(RM) *{- platform->defext() -}
 
 clean: libclean
        $(RM) $(PROGRAMS) $(TESTPROGS) $(ENGINES) $(SCRIPTS)
        $(RM) $(GENERATED_MANDATORY) $(GENERATED)
-       -$(RM) `find . -name .git -prune -o -name '*{- $depext -}' -print`
-       -$(RM) `find . -name .git -prune -o -name '*{- $objext -}' -print`
+       -$(RM) `find . -name .git -prune -o -name '*{- platform->depext() -}' -print`
+       -$(RM) `find . -name .git -prune -o -name '*{- platform->objext() -}' -print`
        $(RM) core
        $(RM) tags TAGS doc-nits
        $(RM) -r test/test-runs
@@ -628,7 +568,7 @@ uninstall_engines:
        @set -e; for e in dummy $(INSTALL_ENGINES); do \
                if [ "$$e" = "dummy" ]; then continue; fi; \
                fn=`basename $$e`; \
-               if [ "$$fn" = '{- dso("ossltest") -}' ]; then \
+               if [ "$$fn" = '{- platform->dso("ossltest") -}' ]; then \
                        continue; \
                fi; \
                $(ECHO) "$(RM) $(DESTDIR)$(ENGINESDIR)/$$fn"; \
@@ -887,7 +827,7 @@ FORCE:
 
 # Building targets ###################################################
 
-libcrypto.pc libssl.pc openssl.pc: configdata.pm $(LIBS) {- join(" ",map { shlib_simple($_) } @{$unified_info{libraries}}) -}
+libcrypto.pc libssl.pc openssl.pc: configdata.pm $(LIBS) {- join(" ",map { platform->sharedlib_simple($_) // () } @{$unified_info{libraries}}) -}
 libcrypto.pc:
        @ ( echo 'prefix=$(INSTALLTOP)'; \
            echo 'exec_prefix=$${prefix}'; \
@@ -958,14 +898,10 @@ reconfigure reconf:
   # Helper function to figure out dependencies on libraries
   # It takes a list of library names and outputs a list of dependencies
   sub compute_lib_depends {
-      if ($disabled{shared}) {
-          return map { lib($_) } @_;
-      }
-
       # Depending on shared libraries:
       # On Windows POSIX layers, we depend on {libname}.dll.a
       # On Unix platforms, we depend on {shlibname}.so
-      return map { $_ =~ /\.a$/ ? $`.$libext : shlib_simple($_) } @_;
+      return map { platform->sharedlib_simple($_) // platform->staticlib($_) } @_;
   }
 
   sub generatesrc {
@@ -976,17 +912,16 @@ reconfigure reconf:
       my $defs = join("", map { " -D".$_ } @{$args{defs}});
       my $deps = join(" ", @{$args{generator_deps}}, @{$args{deps}});
 
-      if ($args{src} =~ /\.ld$/) {
-          (my $target = $args{src}) =~ s/\.ld$/${defext}/;
+      if (platform->isdef($args{src})) {
+          my $target = platform->def($args{src});
           (my $mkdef_os = $target{shared_target}) =~ s|-shared$||;
           my $ord_ver = $args{intent} eq 'lib' ? ' --version $(VERSION)' : '';
-          my $ord_name =
-              $args{generator}->[1] || basename($args{product}, $dsoext);
+          my $ord_name = $args{generator}->[1] || $args{product};
           return <<"EOF";
 $target: $args{generator}->[0] $deps \$(SRCDIR)/util/mkdef.pl
        \$(PERL) \$(SRCDIR)/util/mkdef.pl$ord_ver --ordinals $args{generator}->[0]  --name $ord_name --OS $mkdef_os > $target
 EOF
-      } elsif ($args{src} !~ /\.[sS]$/) {
+      } elsif (!platform->isasm($args{src})) {
           if ($args{generator}->[0] =~ m|^.*\.in$|) {
               my $dofile = abs2rel(rel2abs(catfile($config{sourcedir},
                                                    "util", "dofile.pl")),
@@ -1038,7 +973,8 @@ EOF
   # last in the line.  We may therefore need to put back a line ending.
   sub src2obj {
       my %args = @_;
-      (my $obj = $args{obj}) =~ s|\.o$||;
+      my $obj = platform->obj($args{obj});
+      my $dep = platform->dep($args{obj});
       my @srcs = @{$args{srcs}};
       my $srcs = join(" ",  @srcs);
       my $deps = join(" ", @srcs, @{$args{deps}});
@@ -1074,7 +1010,7 @@ EOF
       # extension-specific rules
       if (grep /\.s$/, @srcs) {
           $recipe .= <<"EOF";
-$obj$objext: $deps
+$obj: $deps
        $cmd $cmdflags -c -o \$\@ $srcs
 EOF
       } elsif (grep /\.S$/, @srcs) {
@@ -1084,30 +1020,30 @@ EOF
           # The platform is long discontinued by vendor so there is
           # hardly a point to drag it along...
           $recipe .= <<"EOF";
-$obj$objext: $deps
+$obj: $deps
        $cmd $incs $defs $cmdflags -c -o \$\@ $srcs
 EOF
       } elsif (defined $makedepprog && $makedepprog !~ /\/makedepend/
                && !grep /\.rc$/, @srcs) {
           $recipe .= <<"EOF";
-$obj$objext: $deps
-       $cmd $incs $defs $cmdflags -MMD -MF $obj$depext.tmp -MT \$\@ -c -o \$\@ $srcs
-       \@touch $obj$depext.tmp
-       \@if cmp $obj$depext.tmp $obj$depext > /dev/null 2> /dev/null; then \\
-               rm -f $obj$depext.tmp; \\
+$obj: $deps
+       $cmd $incs $defs $cmdflags -MMD -MF $dep.tmp -MT \$\@ -c -o \$\@ $srcs
+       \@touch $dep.tmp
+       \@if cmp $dep.tmp $dep > /dev/null 2> /dev/null; then \\
+               rm -f $dep.tmp; \\
        else \\
-               mv $obj$depext.tmp $obj$depext; \\
+               mv $dep.tmp $dep; \\
        fi
 EOF
       } else {
           $recipe .= <<"EOF";
-$obj$objext: $deps
+$obj: $deps
        $cmd $incs $defs $cmdflags $cmdcompile -o \$\@ $srcs
 EOF
           if (defined $makedepprog  && $makedepprog =~ /\/makedepend/) {
               $recipe .= <<"EOF";
        \$(MAKEDEPEND) -f- -Y -- $incs $cmdflags -- $srcs 2>/dev/null \\
-           > $obj$depext
+           > $dep
 EOF
           }
       }
@@ -1116,11 +1052,6 @@ EOF
   # We *know* this routine is only called when we've configure 'shared'.
   sub obj2shlib {
       my %args = @_;
-      my $lib = $args{lib};
-      my $shlib = $args{shlib};
-      my $libd = dirname($lib);
-      my $libn = basename($lib);
-      (my $libname = $libn) =~ s/^lib//;
       my @linkdirs = ();
       foreach (@{args{deps}}) {
           my $d = dirname($_);
@@ -1130,19 +1061,18 @@ EOF
       my $linklibs = join("", map { my $f = basename($_);
                                     (my $l = $f) =~ s/^lib//;
                                     " -l$l" } @{$args{deps}});
-      my @objs = map { (my $x = $_) =~ s|\.o$||; "$x$objext" }
-                 grep { $_ !~ m/\.ld$/ }
+      my @objs = map { platform->obj($_) }
+                 grep { !platform->isdef($_) }
                  @{$args{objs}};
-      my @defs = map { (my $x = $_) =~ s|\.ld$||; "$x$defext" }
-                 grep { $_ =~ /\.ld$/ }
+      my @defs = map { platform->def($_) }
+                 grep { platform->isdef($_) }
                  @{$args{objs}};
       my @deps = compute_lib_depends(@{$args{deps}});
       die "More than one exported symbol map" if scalar @defs > 1;
       my $objs = join(" ", @objs);
       my $deps = join(" ", @objs, @defs, @deps);
-      my $simple = shlib_simple($lib);
-      my $full = shlib($lib);
-      my $target = "$simple $full";
+      my $simple = platform->sharedlib_simple($args{lib});
+      my $full = platform->sharedlib($args{lib});
       my $shared_soname = "";
       $shared_soname .= ' '.$target{shared_sonameflag}.basename($full)
           if defined $target{shared_sonameflag};
@@ -1151,39 +1081,40 @@ EOF
           if defined $target{shared_impflag};
       my $shared_def = join("", map { ' '.$target{shared_defflag}.$_ } @defs);
       my $recipe = <<"EOF";
-$target: $deps
-       \$(CC) \$(LIB_CFLAGS) $linkflags\$(LIB_LDFLAGS)$shared_soname$shared_imp \\
-               -o $full$shared_def $objs \\
-                $linklibs \$(LIB_EX_LIBS)
+$simple: $full
 EOF
-      if (windowsdll()) {
+      if (sharedaix()) {
           $recipe .= <<"EOF";
-       rm -f apps/$shlib'\$(SHLIB_EXT)'
-       rm -f test/$shlib'\$(SHLIB_EXT)'
-       rm -f fuzz/$shlib'\$(SHLIB_EXT)'
-       cp -p $shlib'\$(SHLIB_EXT)' apps/
-       cp -p $shlib'\$(SHLIB_EXT)' test/
-       cp -p $shlib'\$(SHLIB_EXT)' fuzz/
+       rm -f $simple && \\
+       \$(AR) r $simple $full
 EOF
-      } elsif (sharedaix()) {
+      } elsif ($simple ne $full) {
           $recipe .= <<"EOF";
        rm -f $simple && \\
-       \$(AR) r $simple $full
+       ln -s $full $simple
 EOF
-      } else {
+      }
+      $recipe .= <<"EOF";
+$full: $deps
+       \$(CC) \$(LIB_CFLAGS) $linkflags\$(LIB_LDFLAGS)$shared_soname$shared_imp \\
+               -o $full$shared_def $objs \\
+                $linklibs \$(LIB_EX_LIBS)
+EOF
+      if (windowsdll()) {
           $recipe .= <<"EOF";
-       if [ '$simple' != '$full' ]; then \\
-               rm -f $simple; \\
-               ln -s $full $simple; \\
-       fi
+       rm -f apps/$full
+       rm -f test/$full
+       rm -f fuzz/$full
+       cp -p $full apps/
+       cp -p $full test/
+       cp -p $full fuzz/
 EOF
       }
+      return $recipe;
   }
   sub obj2dso {
       my %args = @_;
-      my $dso = $args{lib};
-      my $dsod = dirname($dso);
-      my $dson = basename($dso);
+      my $dso = platform->dso($args{lib});
       my @linkdirs = ();
       foreach (@{args{deps}}) {
           my $d = dirname($_);
@@ -1193,43 +1124,39 @@ EOF
       my $linklibs = join("", map { my $f = basename($_);
                                     (my $l = $f) =~ s/^lib//;
                                     " -l$l" } @{$args{deps}});
-      my @objs = map { (my $x = $_) =~ s|\.o$||; "$x$objext" }
-                 grep { $_ !~ m/\.ld$/ }
+      my @objs = map { platform->obj($_) }
+                 grep { !platform->isdef($_) }
                  @{$args{objs}};
-      my @defs = map { (my $x = $_) =~ s|\.ld$||; "$x$defext" }
-                 grep { $_ =~ /\.ld$/ }
+      my @defs = map { platform->def($_) }
+                 grep { platform->isdef($_) }
                  @{$args{objs}};
       my @deps = compute_lib_depends(@{$args{deps}});
       my $objs = join(" ", @objs);
       my $deps = join(" ", @objs, @defs, @deps);
-      my $target = dso($dso);
       my $shared_def = join("", map { ' '.$target{shared_defflag}.$_ } @defs);
       return <<"EOF";
-$target: $deps
+$dso: $deps
        \$(CC) \$(DSO_CFLAGS) $linkflags\$(DSO_LDFLAGS) \\
-               -o $target$shared_def $objs \\
+               -o $dso$shared_def $objs \\
                 $linklibs \$(DSO_EX_LIBS)
 EOF
   }
   sub obj2lib {
       my %args = @_;
-      (my $lib = $args{lib}) =~ s/\.a$//;
-      my @objs = map { (my $x = $_) =~ s|\.o$|$objext|; $x } @{$args{objs}};
+      my $lib = platform->staticlib($args{lib});
+      my @objs = map { platform->obj($_) } @{$args{objs}};
       my $objs = join(" ", @objs);
       return <<"EOF";
-$lib$libext: $objs
+$lib: $objs
        \$(AR) \$(ARFLAGS) \$\@ \$\?
        \$(RANLIB) \$\@ || echo Never mind.
 EOF
   }
   sub obj2bin {
       my %args = @_;
-      my $bin = $args{bin};
-      my $bind = dirname($bin);
-      my $binn = basename($bin);
-      my $objs = join(" ", map { (my $x = $_) =~ s|\.o$||; "$x$objext" }
-                           @{$args{objs}});
-      my $deps = join(" ",compute_lib_depends(@{$args{deps}}));
+      my $bin = platform->bin($args{bin});
+      my $objs = join(" ", map { platform->obj($_) } @{$args{objs}});
+      my $deps = join(" ", compute_lib_depends(@{$args{deps}}));
       my @linkdirs = ();
       foreach (@{args{deps}}) {
           next if $_ =~ /\.a$/;
@@ -1238,7 +1165,7 @@ EOF
       }
       my $linkflags = join("", map { "-L$_ " } @linkdirs);
       my $linklibs = join("", map { if ($_ =~ s/\.a$//) {
-                                        " $_$libext";
+                                        " ".platform->staticlib($_);
                                     } else {
                                         my $f = basename($_);
                                         (my $l = $f) =~ s/^lib//;
@@ -1252,10 +1179,10 @@ EOF
           $cmdflags = '$(BIN_CXXFLAGS)';
       }
       return <<"EOF";
-$bin$exeext: $objs $deps
-       rm -f $bin$exeext
+$bin: $objs $deps
+       rm -f $bin
        \$\${LDCMD:-$cmd} $cmdflags $linkflags\$(BIN_LDFLAGS) \\
-               -o $bin$exeext $objs \\
+               -o $bin $objs \\
                $linklibs \$(BIN_EX_LIBS)
 EOF
   }
@@ -1276,11 +1203,11 @@ EOF
   sub generatedir {
       my %args = @_;
       my $dir = $args{dir};
-      my @deps = map { s|\.o$|$objext|; $_ } @{$args{deps}};
+      my @deps = map { platform->convertext($_) } @{$args{deps}};
       my @actions = ();
-      my %extinfo = ( dso => $dsoext,
-                      lib => $libext,
-                      bin => $exeext );
+      my %extinfo = ( dso => platform->dsoext(),
+                      lib => platform->libext(),
+                      bin => platform->binext() );
 
       # We already have a 'test' target, and the top directory is just plain
       # silly
index 09d64b77d7d6552465acc4b83d885b099c66db11..a091dd39152d905b086a7b5e8ed5b26aac4db87c 100755 (executable)
--- a/Configure
+++ b/Configure
@@ -1125,18 +1125,8 @@ foreach my $feature (@{$target{enable}}) {
 
 $target{CXXFLAGS}//=$target{CFLAGS} if $target{CXX};
 $target{cxxflags}//=$target{cflags} if $target{CXX};
-$target{exe_extension}="";
-$target{exe_extension}=".exe" if ($config{target} eq "DJGPP"
-                                  || $config{target} =~ /^(?:Cygwin|mingw)/);
+$target{exe_extension}=".exe" if ($config{target} eq "DJGPP");
 $target{exe_extension}=".pm"  if ($config{target} =~ /vos/);
-$target{def_extension}=".ld";
-$target{def_extension}=".def" if $config{target} =~ /^mingw/;
-($target{shared_extension_simple}=$target{shared_extension})
-    =~ s|\.\$\(SHLIB_VERSION_NUMBER\)||
-    unless defined($target{shared_extension_simple});
-$target{dso_extension}//=$target{shared_extension_simple};
-($target{shared_import_extension}=$target{shared_extension_simple}.".a")
-    if ($config{target} =~ /^(?:Cygwin|mingw)/);
 
 # Fill %config with values from %user, and in case those are undefined or
 # empty, use values from %target (acting as a default).
index af9e30790567e0cdafc24c5b81a06077922b5987..6e6b9bc28193b0088c85df88d88392d1eedc8d6d 100644 (file)
@@ -25,6 +25,6 @@
         @macros = ( "DSO_DLFCN" );
     }
     join("\n", map { "# define $_" } @macros); -}
-# define DSO_EXTENSION "{- $target{dso_extension} -}"
+# define DSO_EXTENSION "{- platform->dsoext() -}"
 {- output_on() if $disabled{dso} -}
 #endif