Commit 33105818 authored by Richard Levitte's avatar Richard Levitte
Browse files

Make it possible to build static-only libraries



The trick is to use the .a extension explicitely in the build.info files.

Reviewed-by: default avatarRich Salz <rsalz@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/3243)
parent a68d3505
Loading
Loading
Loading
Loading
+15 −5
Original line number Diff line number Diff line
@@ -18,7 +18,8 @@
     my $thing = shift;
     my $extensionlessthing = extensionlesslib($thing);
     my @listsofar = @_;    # to check if we're looping
     my @list = @{$unified_info{depends}->{$extensionlessthing}};
     my @list = @{$unified_info{depends}->{$thing} //
                      $unified_info{depends}->{$extensionlessthing}};
     my @newlist = ();
     if (scalar @list) {
         foreach my $item (@list) {
@@ -33,13 +34,22 @@
 sub reducedepends {
     my @list = @_;
     my @newlist = ();
     my %replace = ();
     while (@list) {
         my $item = shift @list;
         my $extensionlessitem = extensionlesslib($item);
         push @newlist, $item
             unless grep { $extensionlessitem eq extensionlesslib($_) } @list;
         if (grep { $extensionlessitem eq extensionlesslib($_) } @list) {
             if ($item ne $extensionlessitem) {
                 # If this instance of the library is explicitely static, we
                 # prefer that to any shared library name, since it must have
                 # been done on purpose.
                 $replace{$extensionlessitem} = $item;
             }
     @newlist;
         } else {
             push @newlist, $item;
         }
     }
     map { $replace{$_} // $_; } @newlist;
 }

 # is_installed checks if a given file will be installed (i.e. they are
@@ -113,7 +123,7 @@
 sub dolib {
     my $lib = shift;
     return "" if $cache{$lib};
     unless ($disabled{shared}) {
     unless ($disabled{shared} || $lib =~ /\.a$/) {
         my %ordinals =
             $unified_info{ordinals}->{$lib}
             ? (ordinals => $unified_info{ordinals}->{$lib}) : ();
+19 −9
Original line number Diff line number Diff line
@@ -42,8 +42,18 @@

  # Because we need to make two computations of these data,
  # we store them in arrays for reuse
  our @shlibs = map { $unified_info{sharednames}->{$_} || () } @{$unified_info{libraries}};
  our @install_shlibs = map { $unified_info{sharednames}->{$_} || () } @{$unified_info{install}->{libraries}};
  our @libs =
      map { (my $x = $_) =~ s/\.a$//; $x }
      @{$unified_info{libraries}};
  our @shlibs =
      map { $unified_info{sharednames}->{$_} || () }
      grep(!/\.a$/, @{$unified_info{libraries}});
  our @install_libs =
      map { (my $x = $_) =~ s/\.a$//; $x }
      @{$unified_info{install}->{libraries}};
  our @install_shlibs =
      map { $unified_info{sharednames}->{$_} || () }
      grep(!/\.a$/, @{$unified_info{install}->{libraries}});
  our @generated = ( ( map { (my $x = $_) =~ s|\.S$|\.s|; $x }
                       grep { defined $unified_info{generate}->{$_} }
                       map { @{$unified_info{sources}->{$_}} }
@@ -113,7 +123,7 @@ SHLIB_EXT=.EXE
OBJ_EXT=.OBJ
DEP_EXT=.D

LIBS={- join(", ", map { "-\n\t".$_.".OLB" } @{$unified_info{libraries}}) -}
LIBS={- join(", ", map { "-\n\t".$_.".OLB" } @libs) -}
SHLIBS={- join(", ", map { "-\n\t".$_.".EXE" } @shlibs) -}
ENGINES={- join(", ", map { "-\n\t".$_.".EXE" } @{$unified_info{engines}}) -}
PROGRAMS={- join(", ", map { "-\n\t".$_.".EXE" } @{$unified_info{programs}}) -}
@@ -127,7 +137,7 @@ DEPS={- our @deps = map { (my $x = $_) =~ s|\.o$|\$(DEP_EXT)|; $x; }
GENERATED_MANDATORY={- join(", ", map { "-\n\t".$_ } @{$unified_info{depends}->{""}} ) -}
GENERATED={- join(", ", map { "-\n\t".$_ } @generated) -}

INSTALL_LIBS={- join(", ", map { "-\n\t".$_.".OLB" } @{$unified_info{install}->{libraries}}) -}
INSTALL_LIBS={- join(", ", map { "-\n\t".$_.".OLB" } @install_libs) -}
INSTALL_SHLIBS={- join(", ", map { "-\n\t".$_.".EXE" } @install_shlibs) -}
INSTALL_ENGINES={- join(", ", map { "-\n\t".$_.".EXE" } @{$unified_info{install}->{engines}}) -}
INSTALL_PROGRAMS={- join(", ", map { "-\n\t".$_.".EXE" } @{$unified_info{install}->{programs}}) -}
@@ -230,10 +240,10 @@ NODEBUG=@
        $(NODEBUG) ! Set up logical names for the libraries, so LINK and
        $(NODEBUG) ! running programs can use them.
        $(NODEBUG) !
        $(NODEBUG) {- join("\n\t\$(NODEBUG) ", map { "DEFINE ".uc($_)." 'F\$ENV(\"DEFAULT\")'".uc($_)."\$(SHLIB_EXT)" } map { $unified_info{sharednames}->{$_} || () } @{$unified_info{libraries}}) || "!" -}
        $(NODEBUG) {- join("\n\t\$(NODEBUG) ", map { "DEFINE ".uc($_)." 'F\$ENV(\"DEFAULT\")'".uc($_)."\$(SHLIB_EXT)" } @shlibs) || "!" -}

.LAST :
        $(NODEBUG) {- join("\n\t\$(NODEBUG) ", map { "DEASSIGN ".uc($_) } map { $unified_info{sharednames}->{$_} || () } @{$unified_info{libraries}}) || "!" -}
        $(NODEBUG) {- join("\n\t\$(NODEBUG) ", map { "DEASSIGN ".uc($_) } @shlibs) || "!" -}
        $(NODEBUG) DEASSIGN ossl_dataroot
        $(NODEBUG) DEASSIGN ossl_installroot
        $(NODEBUG) DEASSIGN internal
@@ -317,7 +327,7 @@ uninstall : uninstall_docs uninstall_sw
# Because VMS wants the generation number (or *) to delete files, we can't
# use $(LIBS), $(PROGRAMS), $(GENERATED) and $(ENGINES)directly.
libclean :
        {- join("\n\t", map { "- DELETE $_.OLB;*" } @{$unified_info{libraries}}) || "@ !" -}
        {- join("\n\t", map { "- DELETE $_.OLB;*" } @libs) || "@ !" -}
        {- join("\n\t", map { "- DELETE $_.EXE;*,$_.MAP;*,$_.OPT;*" } @shlibs) || "@ !" -}

clean : libclean
@@ -407,7 +417,7 @@ _install_dev_ns : check_INSTALLTOP
        - CREATE/DIR ossl_installroot:[LIB.'arch']
        {- join("\n        ",
                map { "COPY/PROT=W:R $_.OLB ossl_installroot:[LIB.'arch']" }
                @{$unified_info{install}->{libraries}}) -}
                @install_libs) -}

install_dev : install_shared _install_dev_ns

@@ -729,7 +739,7 @@ EOF
  }
  sub obj2lib {
      my %args = @_;
      my $lib = $args{lib};
      (my $lib = $args{lib}) =~ s/\.a$//;
      my $objs = join(", -\n\t\t", map { $_.".OBJ" } (@{$args{objs}}));
      my $fill_lib = join("\n\t", (map { "LIBRARY/REPLACE $lib.OLB $_.OBJ" }
                                    @{$args{objs}}));
+13 −7
Original line number Diff line number Diff line
@@ -38,20 +38,26 @@
     # removed.  On some systems, they may therefore return the exact same
     # string.
     sub shlib {
         return () if $disabled{shared};
         my $lib = shift;
         return () if $disabled{shared} || $lib =~ /\.a$/;
         return $unified_info{sharednames}->{$lib} . $shlibext;
     }
     sub shlib_simple {
         return () if $disabled{shared};

         my $lib = shift;
         return () if $disabled{shared} || $lib =~ /\.a$/;

         if (windowsdll()) {
             return $lib . $shlibextimport;
         }
         return $lib .  $shlibextsimple;
     }

     # Easy fixing of static library names
     sub lib {
         (my $lib = shift) =~ s/\.a$//;
         return $lib . $libext;
     }

     # 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.
@@ -84,7 +90,7 @@ SHLIB_MAJOR={- $config{shlib_major} -}
SHLIB_MINOR={- $config{shlib_minor} -}
SHLIB_TARGET={- $target{shared_target} -}

LIBS={- join(" ", map { $_.$libext } @{$unified_info{libraries}}) -}
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}}) -}
@@ -103,7 +109,7 @@ GENERATED={- join(" ",
                    grep { /\.o$/ } keys %{$unified_info{sources}} ),
                  ( grep { /\.h$/ } keys %{$unified_info{generate}} )) -}

INSTALL_LIBS={- join(" ", map { $_.$libext } @{$unified_info{install}->{libraries}}) -}
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}}) -}
@@ -769,7 +775,7 @@ configdata.pm: $(SRCDIR)/Configure $(SRCDIR)/config {- join(" ", @{$config{build
  # It takes a list of library names and outputs a list of dependencies
  sub compute_lib_depends {
      if ($disabled{shared}) {
          return map { $_ =~ /\.a$/ ? $`.$libext : $_.$libext } @_;
          return map { lib($_) } @_;
      }

      # Depending on shared libraries:
@@ -983,7 +989,7 @@ EOF
  }
  sub obj2lib {
      my %args = @_;
      my $lib = $args{lib};
      (my $lib = $args{lib}) =~ s/\.a$//;
      my $objs = join(" ", map { $_.$objext } @{$args{objs}});
      return <<"EOF";
$lib$libext: $objs
+22 −11
Original line number Diff line number Diff line
@@ -31,14 +31,20 @@
 $win_commonroot = $ENV{$win_commonroot};

 sub shlib {
     return () if $disabled{shared};
     my $lib = shift;
     return () if $disabled{shared} || $lib =~ /\.a$/;
     return () unless defined $unified_info{sharednames}->{$lib};
     return $unified_info{sharednames}->{$lib} . $shlibext;
 }

 sub lib {
     (my $lib = shift) =~ s/\.a$//;
     return $lib . $libext;
 }

 sub shlib_import {
     return () if $disabled{shared};
     my $lib = shift;
     return () if $disabled{shared} || $lib =~ /\.a$/;
     return $lib . $shlibextimport;
 }

@@ -67,7 +73,7 @@ MINOR={- $config{minor} -}

SHLIB_VERSION_NUMBER={- $config{shlib_version_number} -}

LIBS={- join(" ", map { $_.$libext } @{$unified_info{libraries}}) -}
LIBS={- join(" ", map { lib($_) } @{$unified_info{libraries}}) -}
SHLIBS={- join(" ", map { shlib($_) } @{$unified_info{libraries}}) -}
SHLIBPDBS={- join(" ", map { local $shlibext = ".pdb"; shlib($_) } @{$unified_info{libraries}}) -}
ENGINES={- join(" ", map { dso($_) } @{$unified_info{engines}}) -}
@@ -88,7 +94,7 @@ GENERATED={- join(" ",
                    grep { /\.o$/ } keys %{$unified_info{sources}} ),
                  ( grep { /\.h$/ } keys %{$unified_info{generate}} )) -}

INSTALL_LIBS={- join(" ", map { $_.$libext } @{$unified_info{install}->{libraries}}) -}
INSTALL_LIBS={- join(" ", map { lib($_) } @{$unified_info{install}->{libraries}}) -}
INSTALL_SHLIBS={- join(" ", map { shlib($_) } @{$unified_info{install}->{libraries}}) -}
INSTALL_SHLIBPDBS={- join(" ", map { local $shlibext = ".pdb"; shlib($_) } @{$unified_info{install}->{libraries}}) -}
INSTALL_ENGINES={- join(" ", map { dso($_) } @{$unified_info{install}->{engines}}) -}
@@ -352,11 +358,14 @@ configdata.pm: "$(SRCDIR)\Configure" {- join(" ", map { '"'.$_.'"' } @{$config{b
 # It takes a list of library names and outputs a list of dependencies
 sub compute_lib_depends {
     if ($disabled{shared}) {
	 return map { $_ =~ /\.a$/ ? $`.$libext : $_.$libext } @_;
	 return map { lib($_) } @_;
     }
     die "Linking with static OpenSSL libraries is not supported in this configuration\n"
         if grep /\.a$/, @_;
     return map { shlib_import($_) } @_;
     foreach (@_) {
         (my $l = $_) =~ s/\.a$//;
         die "Linking with static variants of shared libraries is not supported in this configuration\n"
             if $l ne $_ && shlib($l);
     }
     return map { shlib_import($_) or lib($_) } @_;
 }

  sub generatesrc {
@@ -530,13 +539,15 @@ $objs$linklibs \$(EX_LIBS)
EOF
 }
 sub obj2lib {
     my %args = @_;
     my $lib = $args{lib};

     # Because static libs and import libs are both named the same in native
     # Windows, we can't have both.  We skip the static lib in that case,
     # as the shared libs are what we use anyway.
     return "" unless $disabled{"shared"};
     return "" unless $disabled{"shared"} || $lib =~ /\.a$/;

     my %args = @_;
     my $lib = $args{lib};
     $lib =~ s/\.a$//;
     my $objs = join("\n", map { $_.$objext } @{$args{objs}});
     my $deps = join(" ", map { $_.$objext } @{$args{objs}});
     return <<"EOF";
+14 −2
Original line number Diff line number Diff line
@@ -1732,12 +1732,24 @@ EOF
            }

            # Additionally, we set up sharednames for libraries that don't
            # have any, as themselves.
            foreach (keys %{$unified_info{libraries}}) {
            # have any, as themselves.  Only for libraries that aren't
            # explicitely static.
            foreach (grep !/\.a$/, keys %{$unified_info{libraries}}) {
                if (!defined $unified_info{sharednames}->{$_}) {
                    $unified_info{sharednames}->{$_} = $_
                }
            }

            # Check that we haven't defined any library as both shared and
            # explicitely static.  That is forbidden.
            my @doubles = ();
            foreach (grep /\.a$/, keys %{$unified_info{libraries}}) {
                (my $l = $_) =~ s/\.a$//;
                push @doubles, $l if defined $unified_info{sharednames}->{$l};
            }
            die "these libraries are both explicitely static and shared:\n  ",
                join(" ", @doubles), "\n"
                if @doubles;
        }

        foreach (keys %ordinals) {