Make sure the linked programs have the correct extension
[openssl.git] / Configurations / unix-Makefile.tmpl
index 0d4050d1a8880cb782ae362b74b7b3525e65c937..57108ce9acdc2cfa8f4a1d6e8779e6748a54c4d4 100644 (file)
@@ -4,6 +4,50 @@
 ## {- join("\n## ", @autowarntext) -}
 {-
      sub windowsdll { $config{target} =~ /^(?:Cygwin|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 {
+         return () if $config{no_shared};
+         my $lib = shift;
+         return $unified_info{sharednames}->{$lib} . '$(SHLIB_EXT)';
+     }
+     sub shlib_simple {
+         return () if $config{no_shared};
+
+         my $lib = shift;
+         if (windowsdll()) {
+             return $lib . '$(SHLIB_EXT_IMPORT)';
+         }
+         return $lib . '$(SHLIB_EXT_SIMPLE)';
+     }
+
+     # 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 {
+         return () if $config{no_shared};
+         my $engine = shift;
+
+         return $engine . '$(DSO_EXT)';
+     }
 -}
 PLATFORM={- $config{target} -}
 OPTIONS={- $config{options} -}
@@ -30,8 +74,8 @@ OBJ_EXT={- $target{obj_extension} || ".o" -}
 DEP_EXT={- $target{dep_extension} || ".d" -}
 
 LIBS={- join(" ", map { $_."\$(LIB_EXT)" } @{$unified_info{libraries}}) -}
-SHLIBS={- join(" ", map { $_."\$(SHLIB_EXT)" } map { $unified_info{sharednames}->{$_} || () } @{$unified_info{libraries}}) -}
-ENGINES={- join(" ", map { $_."\$(DSO_EXT)" } @{$unified_info{engines}}) -}
+SHLIBS={- join(" ", map { shlib($_) } @{$unified_info{libraries}}) -}
+ENGINES={- join(" ", map { dso($_) } @{$unified_info{engines}}) -}
 PROGRAMS={- join(" ", map { $_."\$(EXE_EXT)" } grep { !m|^test/| } @{$unified_info{programs}}) -}
 TESTPROGS={- join(" ", map { $_."\$(EXE_EXT)" } grep { m|^test/| } @{$unified_info{programs}}) -}
 SCRIPTS={- join(" ", @{$unified_info{scripts}}) -}
@@ -44,6 +88,8 @@ MISC_SCRIPTS=$(SRCDIR)/tools/c_hash $(SRCDIR)/tools/c_info \
             $(SRCDIR)/tools/c_issuer $(SRCDIR)/tools/c_name \
             $(BLDDIR)/apps/CA.pl $(SRCDIR)/apps/tsget
 
+SHLIB_INFO={- join(" ", map { "\"".shlib($_).";".shlib_simple($_)."\"" } @{$unified_info{libraries}}) -}
+
 # DESTDIR is for package builders so that they can configure for, say,
 # /usr/ and yet have everything installed to /tmp/somedir/usr/.
 # Normally it is left empty.
@@ -126,6 +172,7 @@ AR=$(CROSS_COMPILE){- $target{ar} || "ar" -} $(ARFLAGS) r
 RANLIB= {- $target{ranlib} -}
 NM= $(CROSS_COMPILE){- $target{nm} || "nm" -}
 RM= rm -f
+RMDIR= rmdir
 TAR= {- $target{tar} || "tar" -}
 TARFLAGS= {- $target{tarflags} -}
 MAKEDEPEND=$(CROSS_COMPILE){- $config{makedepprog} -}
@@ -172,7 +219,17 @@ list-tests:
        @TOP=$(SRCDIR) PERL=$(PERL) $(PERL) $(SRCDIR)/test/run_tests.pl list
 
 libclean:
-       -rm -f `find $(BLDDIR) -name '*$(LIB_EXT)' -o -name '*$(SHLIB_EXT)'`
+       @set -e; for s in $(SHLIB_INFO); do \
+               s1=`echo "$$s" | cut -f1 -d";"`; \
+               s2=`echo "$$s" | cut -f2 -d";"`; \
+               echo $(RM) $$s1; \
+               $(RM) $$s1; \
+               if [ "$$s1" != "$$s2" ]; then \
+                       echo $(RM) $$s2; \
+                       $(RM) $$s2; \
+               fi; \
+       done
+       $(RM) $(LIBS)
 
 install: install_sw install_ssldirs install_docs
 
@@ -205,7 +262,7 @@ Makefile: FORCE
 
 install_sw: all install_dev install_engines install_runtime
 
-uninstall_sw: uninstall_dev uninstall_engines uninstall_runtime
+uninstall_sw: uninstall_runtime uninstall_engines uninstall_dev
 
 install_docs: install_man_docs install_html_docs
 
@@ -238,25 +295,28 @@ install_dev:
                      $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn; \
        done
        @ : {- output_off() if $config{no_shared}; "" -}
-       @set -e; for s in $(SHLIBS); do \
-               fn=`basename $$s`; \
-               echo "install $$s -> $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn"; \
-               cp $$s $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn.new; \
-               chmod 644 $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn.new; \
-               mv -f $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn.new \
-                     $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn; \
-               if [ "$(SHLIB_EXT)" != "$(SHLIB_EXT_SIMPLE)" ]; then \
-                       echo "link $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn2 -> $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn"; \
-                       fn2=`basename $$fn $(SHLIB_EXT)`$(SHLIB_EXT_SIMPLE); \
-                       ln -sf $$fn $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn2; \
+       @set -e; for s in $(SHLIB_INFO); do \
+               s1=`echo "$$s" | cut -f1 -d";"`; \
+               s2=`echo "$$s" | cut -f2 -d";"`; \
+               fn1=`basename $$s1`; \
+               fn2=`basename $$s2`; \
+               : {- output_off() if windowsdll(); "" -}; \
+               echo "install $$s1 -> $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn1"; \
+               cp $$s1 $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn1.new; \
+               chmod 644 $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn1.new; \
+               mv -f $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn1.new \
+                     $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn1; \
+               if [ "$$fn1" != "$$fn2" ]; then \
+                       echo "link $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn2 -> $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn1"; \
+                       ln -sf $$fn1 $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn2; \
                fi; \
+               : {- output_on() if windowsdll(); "" -}{- output_off() unless windowsdll(); "" -}; \
+               echo "install $$s2 -> $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn2"; \
+               cp $$s2 $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn2.new; \
+               chmod 644 $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn2.new; \
+               mv -f $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn2.new \
+                     $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn2; \
                : {- output_off() unless windowsdll(); "" -}; \
-               echo "install $$s.a -> $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn.a"; \
-               cp $$s.a $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn.a.new; \
-               chmod 644 $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn.a.new; \
-               mv -f $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn.a.new \
-                     $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn.a; \
-               : {- output_on() unless windowsdll(); "" -}; \
        done
        @ : {- output_on() if $config{no_shared}; "" -}
        @$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/pkgconfig
@@ -278,31 +338,42 @@ uninstall_dev:
                echo "$(RM) $(DESTDIR)$(INSTALLTOP)/include/openssl/$$fn"; \
                $(RM) $(DESTDIR)$(INSTALLTOP)/include/openssl/$$fn; \
        done
+       -$(RMDIR) $(DESTDIR)$(INSTALLTOP)/include/openssl
+       -$(RMDIR) $(DESTDIR)$(INSTALLTOP)/include
        @set -e; for l in $(LIBS); do \
                fn=`basename $$l`; \
                echo "$(RM) $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn"; \
                $(RM) $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn; \
        done
-       @set -e; for s in $(SHLIBS); do \
-               fn=`basename $$s`; \
-               if [ "$(SHLIB_EXT)" != "$(SHLIB_EXT_SIMPLE)" ]; then \
-                       fn2=`basename $$fn $(SHLIB_EXT)`$(SHLIB_EXT_SIMPLE); \
+       @ : {- output_off() if $config{no_shared}; "" -}
+       @set -e; for s in $(SHLIB_INFO); do \
+               s1=`echo "$$s" | cut -f1 -d";"`; \
+               s2=`echo "$$s" | cut -f2 -d";"`; \
+               fn1=`basename $$s1`; \
+               fn2=`basename $$s2`; \
+               : {- output_off() if windowsdll(); "" -}; \
+               echo "$(RM) $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn1"; \
+               $(RM) $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn1; \
+               if [ "$$fn1" != "$$fn2" ]; then \
                        echo "$(RM) $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn2"; \
                        $(RM) $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn2; \
                fi; \
-               echo "$(RM) $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn"; \
-               $(RM) $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn; \
+               : {- output_on() if windowsdll(); "" -}{- output_off() unless windowsdll(); "" -}; \
+               echo "$(RM) $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn2"; \
+               $(RM) $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn2; \
                : {- output_off() unless windowsdll(); "" -}; \
-               echo "$(RM) $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn.a"; \
-               $(RM) $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn.a; \
-               : {- output_on() unless windowsdll(); "" -}; \
        done
+       @ : {- output_on() if $config{no_shared}; "" -}
        @echo "$(RM) $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/pkgconfig/libcrypto.pc"
        @$(RM) $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/pkgconfig/libcrypto.pc
        @echo "$(RM) $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/pkgconfig/libssl.pc"
        @$(RM) $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/pkgconfig/libssl.pc
        @echo "$(RM) $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/pkgconfig/openssl.pc"
        @$(RM) $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/pkgconfig/openssl.pc
+       @echo $(RMDIR) $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/pkgconfig
+       -@$(RMDIR) $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/pkgconfig
+       @echo $(RMDIR) $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)
+       -@$(RMDIR) $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)
 
 install_engines:
        @[ -n "$(INSTALLTOP)" ] || (echo INSTALLTOP should not be empty; exit 1)
@@ -330,6 +401,8 @@ uninstall_engines:
                echo "$(RM) $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/engines/$$fn"; \
                $(RM) $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/engines/$$fn; \
        done
+       @echo "$(RMDIR) $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/engines"
+       -@$(RMDIR) $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/engines
 
 install_runtime:
        @[ -n "$(INSTALLTOP)" ] || (echo INSTALLTOP should not be empty; exit 1)
@@ -338,7 +411,7 @@ install_runtime:
        @echo "*** Installing runtime files"
        : {- output_off() unless windowsdll(); "" -};
        @set -e; for s in $(SHLIBS); do \
-               fn=`basename $$i`; \
+               fn=`basename $$s`; \
                echo "install $$s -> $(DESTDIR)$(INSTALLTOP)/bin/$$fn"; \
                cp $$s $(DESTDIR)$(INSTALLTOP)/bin/$$fn.new; \
                chmod 644 $(DESTDIR)$(INSTALLTOP)/bin/$$fn.new; \
@@ -397,12 +470,16 @@ uninstall_runtime:
        done
        : {- output_off() unless windowsdll(); "" -};
        @set -e; for s in $(SHLIBS); do \
-               fn=`basename $$i`; \
+               fn=`basename $$s`; \
                echo "$(RM) $(DESTDIR)$(INSTALLTOP)/bin/$$fn"; \
                $(RM) $(DESTDIR)$(INSTALLTOP)/bin/$$fn; \
        done
        : {- output_on() unless windowsdll(); "" -};
        $(RM) $(DESTDIR)$(OPENSSLDIR)/openssl.cnf
+       @echo "$(RMDIR) $(DESTDIR)$(INSTALLTOP)/bin"
+       -@$(RMDIR) $(DESTDIR)$(INSTALLTOP)/bin
+       @echo "$(RMDIR) $(DESTDIR)$(OPENSSLDIR)/misc"
+       -@$(RMDIR) $(DESTDIR)$(OPENSSLDIR)/misc
 
 # A method to extract all names from a .pod file
 # The first sed extracts everything between "=head1 NAME" and the next =head1
@@ -736,13 +813,7 @@ configdata.pm: {- $config{build_file_template} -} $(SRCDIR)/Configure $(SRCDIR)/
       # 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_IMPORT)"
-                  } else {
-                      my $libname =
-                          $unified_info{sharednames}->{$_} || $_;
-                      "$libname\$(SHLIB_EXT_SIMPLE)"
-                  } } @_;
+      return map { shlib_simple($_) } @_;
   }
 
   sub src2obj {
@@ -788,8 +859,7 @@ EOF
       my $deps = join(" ",compute_lib_depends(@{$args{deps}}));
       my $shlib_target = $target{shared_target};
       my $ordinalsfile = defined($args{ordinals}) ? $args{ordinals}->[1] : "";
-      my $shlibtarget = windowsdll() ?
-         "$lib\$(SHLIB_EXT_IMPORT)" : "$shlib\$(SHLIB_EXT_SIMPLE)";
+      my $target = shlib_simple($lib);
       return <<"EOF"
 # 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.
@@ -798,7 +868,7 @@ EOF
 # It's not necessary to have both as targets.  The choice falls on the
 # simplest, {libname}\$(SHLIB_EXT_IMPORT) for Windows POSIX layers and
 # {libname}\$(SHLIB_EXT_SIMPLE) for the Unix platforms.
-$shlibtarget: $lib\$(LIB_EXT) $deps $ordinalsfile
+$target : $lib\$(LIB_EXT) $deps $ordinalsfile
        \$(MAKE) -f \$(SRCDIR)/Makefile.shared -e \\
                PLATFORM=\$(PLATFORM) \\
                PERL=\$(PERL) SRCDIR="\$(SRCDIR)" DSTDIR="$libd" \\
@@ -810,7 +880,7 @@ $shlibtarget: $lib\$(LIB_EXT) $deps $ordinalsfile
                CROSS_COMPILE="\$(CROSS_COMPILE)" \\
                SHARED_LDFLAGS="\$(SHARED_LDFLAGS)" SHLIB_EXT=\$(SHLIB_EXT) \\
                SHARED_RCFLAGS="\$(SHARED_RCFLAGS)" \\
-               link_a.$shlib_target
+               link_shlib.$shlib_target
 EOF
          . (windowsdll() ? <<"EOF" : "");
        rm -f apps/$shlib\$(SHLIB_EXT)
@@ -819,7 +889,7 @@ EOF
        cp -p $shlib\$(SHLIB_EXT) test/
 EOF
   }
-  sub obj2dynlib {
+  sub obj2dso {
       my %args = @_;
       my $lib = $args{lib};
       my $libd = dirname($lib);
@@ -832,8 +902,9 @@ EOF
       my $deps = join(" ",compute_lib_depends(@{$args{deps}}));
       my $shlib_target = $target{shared_target};
       my $objs = join(" ", map { $_."\$(OBJ_EXT)" } @{$args{objs}});
+      my $target = dso($lib);
       return <<"EOF";
-$lib\$(DSO_EXT): $objs $deps
+$target: $objs $deps
        \$(MAKE) -f \$(SRCDIR)/Makefile.shared -e \\
                PLATFORM=\$(PLATFORM) \\
                PERL=\$(PERL) SRCDIR="\$(SRCDIR)" DSTDIR="$libd" \\
@@ -843,7 +914,7 @@ $lib\$(DSO_EXT): $objs $deps
                SHARED_LDFLAGS="\$(SHARED_LDFLAGS)" \\
                SHLIB_EXT=\$(DSO_EXT) \\
                LIBEXTRAS="$objs" \\
-               link_o.$shlib_target
+               link_dso.$shlib_target
 EOF
   }
   sub obj2lib {
@@ -874,7 +945,7 @@ $bin\$(EXE_EXT): $objs $deps
        \$(RM) $bin\$(EXE_EXT)
        \$(MAKE) -f \$(SRCDIR)/Makefile.shared -e \\
                PERL=\$(PERL) SRCDIR=\$(SRCDIR) \\
-               APPNAME=$bin OBJECTS="$objs" \\
+               APPNAME=$bin\$(EXE_EXT) OBJECTS="$objs" \\
                LIBDEPS="\$(PLIB_LDFLAGS) $linklibs \$(EX_LIBS)" \\
                CC="\$(CC)" CFLAGS="\$(CFLAGS)" LDFLAGS="\$(LDFLAGS)" \\
                LIBRPATH="\$(INSTALLTOP)/\$(LIBDIR)" \\