Make shared library targets more consistent
authorRichard Levitte <levitte@openssl.org>
Thu, 11 Feb 2016 12:10:11 +0000 (13:10 +0100)
committerRichard Levitte <levitte@openssl.org>
Thu, 11 Feb 2016 16:08:38 +0000 (17:08 +0100)
On Windows POSIX layers, two files are produced for a shared library,
there's {shlibname}.dll and there's the import library {libname}.dll.a

On some/most Unix platforms, a {shlibname}.{sover}.so and a symlink
{shlibname}.so are produced.

For each of them, unix-Makefile.tmpl was entirely consistent on which
to have as a target when building a shared library or which to use as
dependency.

This change clears this up and makes it consistent, we use the
simplest form possible, {lib}.dll.a on Windows POSIX layers and
{shlibname}.so on Unix platforms.  No exception.

Reviewed-by: Rich Salz <rsalz@openssl.org>
Configurations/unix-Makefile.tmpl

index 65f179d486240b901c8b8c8207bdd1ae59aa2709..75516cc91ed2d515f18c251504c2d86f827c4700 100644 (file)
@@ -630,6 +630,26 @@ Makefile: {- $config{build_file_template} -} $(SRCDIR)/Configure $(SRCDIR)/confi
 {-
   use File::Basename;
   use File::Spec::Functions qw/:DEFAULT abs2rel rel2abs/;
 {-
   use File::Basename;
   use File::Spec::Functions qw/:DEFAULT abs2rel rel2abs/;
+
+  # 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 ($config{no_shared}) {
+          return map { $_."\$(LIB_EXT)" } @_;
+      }
+
+      # Depending on shared libraries:
+      # On Windows POSIX layers, we depend on {libname}.dll.a
+      # On Unix platforms, we depend on {shlibname}.so
+      return map { if (windowsdll()) {
+                       "$_\$(SHLIB_EXT_SIMPLE).a"
+                  } else {
+                      my $libname =
+                          $unified_info{sharednames}->{$_} || $_;
+                      "$libname\$(SHLIB_EXT_SIMPLE)"
+                  } } @_;
+  }
+
   sub src2dep {
       my %args = @_;
       my $dep = $args{obj}.'$(DEP_EXT)';
   sub src2dep {
       my %args = @_;
       my $dep = $args{obj}.'$(DEP_EXT)';
@@ -674,28 +694,35 @@ EOF
       my $libd = dirname($lib);
       my $libn = basename($lib);
       (my $libname = $libn) =~ s/^lib//;
       my $libd = dirname($lib);
       my $libn = basename($lib);
       (my $libname = $libn) =~ s/^lib//;
-      my $shlibdeps = join("", map { my $d = dirname($_);
-                                     my $f = basename($_);
-                                     (my $l = $f) =~ s/^lib//;
-                                     " -L$d -l$l" } @{$args{deps}});
-      my $deps = join(" ",map { $_."\$(SHLIB_EXT_SIMPLE)" } @{$args{deps}});
+      my $linklibs = join("", map { my $d = dirname($_);
+                                    my $f = basename($_);
+                                    (my $l = $f) =~ s/^lib//;
+                                    " -L$d -l$l" } @{$args{deps}});
+      my $deps = join(" ",compute_lib_depends(@{$args{deps}}));
       my $shlib_target = $target{shared_target};
       my $ordinalsfile = defined($args{ordinals}) ? $args{ordinals}->[1] : "";
       my $shlib_target = $target{shared_target};
       my $ordinalsfile = defined($args{ordinals}) ? $args{ordinals}->[1] : "";
-      my $targets =
-         "$shlib".shlib_ext() .
-         (shlib_ext() ne shlib_ext_simple()
-          ? " $shlib".shlib_ext_simple() : "");
+      my $shlibtarget = windowsdll() ?
+         "$lib\$(SHLIB_EXT_SIMPLE).a" : "$shlib\$(SHLIB_EXT_SIMPLE)";
       return <<"EOF"
       return <<"EOF"
-$targets : $lib\$(LIB_EXT) $deps $ordinalsfile
+# With a build on a Windows POSIX layer (Cygwin or Mingw), we know for a fact
+# that two files get produced, {shlibname}.dll and {libname}.dll.a.
+# With all other Unix platforms, we often build a shared library with the
+# SO version built into the file name and a symlink without the SO version
+# It's not necessary to have both as targets.  The choice falls on the
+# simplest, {libname}\$(SHLIB_EXT_SIMPLE).a for Windows POSIX layers and
+# {libname}\$(SHLIB_EXT_SIMPLE) for the Unix platforms.
+$shlibtarget : $lib\$(LIB_EXT) $deps $ordinalsfile
        \$(MAKE) -f \$(SRCDIR)/Makefile.shared -e \\
        \$(MAKE) -f \$(SRCDIR)/Makefile.shared -e \\
+               PLATFORM=\$(PLATFORM) \\
                PERL=\$(PERL) SRCDIR="\$(SRCDIR)" DSTDIR="$libd" \\
                PERL=\$(PERL) SRCDIR="\$(SRCDIR)" DSTDIR="$libd" \\
-                INSTALLTOP="\$(INSTALLTOP)" LIBDIR="\$(LIBDIR)" \\
-                LIBDEPS="\$(PLIB_LDFLAGS) $shlibdeps \$(EX_LIBS)" \\
-                LIBNAME=$libname LIBVERSION=\$(SHLIB_MAJOR).\$(SHLIB_MINOR) \\
-                LIBCOMPATVERSIONS=";\$(SHLIB_VERSION_HISTORY)" \\
-                CC="\$(CC)" CFLAGS="\$(CFLAGS)" LDFLAGS="\$(LDFLAGS)" \\
-                SHARED_LDFLAGS="\$(SHARED_LDFLAGS)" SHLIB_EXT=\$(SHLIB_EXT) \\
-                link_a.$shlib_target
+               INSTALLTOP="\$(INSTALLTOP)" LIBDIR="\$(LIBDIR)" \\
+               LIBDEPS="\$(PLIB_LDFLAGS) $linklibs \$(EX_LIBS)" \\
+               LIBNAME=$libname LIBVERSION=\$(SHLIB_MAJOR).\$(SHLIB_MINOR) \\
+               LIBCOMPATVERSIONS=";\$(SHLIB_VERSION_HISTORY)" \\
+               CC="\$(CC)" CFLAGS="\$(CFLAGS)" LDFLAGS="\$(LDFLAGS)" \\
+               CROSS_COMPILE="\$(CROSS_COMPILE)" \\
+               SHARED_LDFLAGS="\$(SHARED_LDFLAGS)" SHLIB_EXT=\$(SHLIB_EXT) \\
+               link_a.$shlib_target
 EOF
          . (windowsdll() ? <<"EOF" : "");
        rm -f apps/$shlib\$(SHLIB_EXT)
 EOF
          . (windowsdll() ? <<"EOF" : "");
        rm -f apps/$shlib\$(SHLIB_EXT)
@@ -714,20 +741,21 @@ EOF
                                      my $f = basename($_);
                                      (my $l = $f) =~ s/^lib//;
                                      " -L$d -l$l" } @{$args{deps}});
                                      my $f = basename($_);
                                      (my $l = $f) =~ s/^lib//;
                                      " -L$d -l$l" } @{$args{deps}});
-      my $deps = join(" ",map { $_."\$(SHLIB_EXT_SIMPLE)" } @{$args{deps}});
+      my $deps = join(" ",compute_lib_depends(@{$args{deps}}));
       my $shlib_target = $target{shared_target};
       my $objs = join(" ", map { $_."\$(OBJ_EXT)" } @{$args{objs}});
       return <<"EOF";
 $lib\$(SHLIB_EXT_SIMPLE): $objs $deps
        \$(MAKE) -f \$(SRCDIR)/Makefile.shared -e \\
       my $shlib_target = $target{shared_target};
       my $objs = join(" ", map { $_."\$(OBJ_EXT)" } @{$args{objs}});
       return <<"EOF";
 $lib\$(SHLIB_EXT_SIMPLE): $objs $deps
        \$(MAKE) -f \$(SRCDIR)/Makefile.shared -e \\
-                PERL=\$(PERL) SRCDIR="\$(SRCDIR)" DSTDIR="$libd" \\
-                LIBDEPS="\$(PLIB_LDFLAGS) $shlibdeps \$(EX_LIBS)" \\
-                LIBNAME=$libname LDFLAGS="\$(LDFLAGS)" \\
-                CC="\$(CC)" CFLAGS="\$(CFLAGS)" \\
-                SHARED_LDFLAGS="\$(SHARED_LDFLAGS)" \\
+               PLATFORM=\$(PLATFORM) \\
+               PERL=\$(PERL) SRCDIR="\$(SRCDIR)" DSTDIR="$libd" \\
+               LIBDEPS="\$(PLIB_LDFLAGS) $shlibdeps \$(EX_LIBS)" \\
+               LIBNAME=$libname LDFLAGS="\$(LDFLAGS)" \\
+               CC="\$(CC)" CFLAGS="\$(CFLAGS)" \\
+               SHARED_LDFLAGS="\$(SHARED_LDFLAGS)" \\
                SHLIB_EXT=\$(SHLIB_EXT_SIMPLE) \\
                LIBEXTRAS="$objs" \\
                SHLIB_EXT=\$(SHLIB_EXT_SIMPLE) \\
                LIBEXTRAS="$objs" \\
-                link_o.$shlib_target
+               link_o.$shlib_target
 EOF
   }
   sub obj2lib {
 EOF
   }
   sub obj2lib {
@@ -746,25 +774,22 @@ EOF
       my $bind = dirname($bin);
       my $binn = basename($bin);
       my $objs = join(" ", map { $_."\$(OBJ_EXT)" } @{$args{objs}});
       my $bind = dirname($bin);
       my $binn = basename($bin);
       my $objs = join(" ", map { $_."\$(OBJ_EXT)" } @{$args{objs}});
-      my $deps = join(" ",
-                      (map { $_."\$(OBJ_EXT)" } @{$args{objs}}),
-                      (map { $_.($config{no_shared} ? "\$(LIB_EXT)" : "\$(SHLIB_EXT)" ) }
-                       @{$args{deps}}));
-      my $libdeps = join("", map { my $d = dirname($_);
-                                   my $f = basename($_);
-                                   $d = "." if $d eq $f;
-                                   (my $l = $f) =~ s/^lib//;
-                                   " -L$d -l$l" } @{$args{deps}});
+      my $deps = join(" ",compute_lib_depends(@{$args{deps}}));
+      my $linklibs = join("", map { my $d = dirname($_);
+                                    my $f = basename($_);
+                                    $d = "." if $d eq $f;
+                                    (my $l = $f) =~ s/^lib//;
+                                    " -L$d -l$l" } @{$args{deps}});
       my $shlib_target = $config{no_shared} ? "" : $target{shared_target};
       return <<"EOF";
       my $shlib_target = $config{no_shared} ? "" : $target{shared_target};
       return <<"EOF";
-$bin\$(EXE_EXT) : $deps
+$bin\$(EXE_EXT) : $objs $deps
        \$(RM) $bin\$(EXE_EXT)
        \$(MAKE) -f \$(SRCDIR)/Makefile.shared -e \\
        \$(RM) $bin\$(EXE_EXT)
        \$(MAKE) -f \$(SRCDIR)/Makefile.shared -e \\
-                PERL=\$(PERL) SRCDIR=\$(SRCDIR) \\
+               PERL=\$(PERL) SRCDIR=\$(SRCDIR) \\
                APPNAME=$bin OBJECTS="$objs" \\
                APPNAME=$bin OBJECTS="$objs" \\
-               LIBDEPS="\$(PLIB_LDFLAGS) \$(LDFLAGS) $libdeps \$(EX_LIBS)" \\
-                CC="\$(CC)" CFLAGS="\$(CFLAGS)" LDFLAGS="\$(LDFLAGS)" \\
-                LIBRPATH="\$(INSTALLTOP)/\$(LIBDIR)" \\
+               LIBDEPS="\$(PLIB_LDFLAGS) \$(LDFLAGS) $linklibs \$(EX_LIBS)" \\
+               CC="\$(CC)" CFLAGS="\$(CFLAGS)" LDFLAGS="\$(LDFLAGS)" \\
+               LIBRPATH="\$(INSTALLTOP)/\$(LIBDIR)" \\
                link_app.$shlib_target
 EOF
   }
                link_app.$shlib_target
 EOF
   }