Unified - Adapt the Unix and VMS templates to support GENERATE
[openssl.git] / Configurations / unix-Makefile.tmpl
index 9dc6d7dfe89097592ae846aca2b1791db491a299..226f5bdfa88d46257570e403cbe55183e0178dcd 100644 (file)
@@ -3,6 +3,15 @@
 ##
 ## {- join("\n## ", @autowarntext) -}
 {-
+     our $objext = $target{obj_extension} || ".o";
+     our $depext = $target{dep_extension} || ".d";
+     our $exeext = $target{exe_extension} || "";
+     our $libext = $target{lib_extension} || ".a";
+     our $shlibext = $target{shared_extension} || ".so";
+     our $shlibextsimple = $target{shared_extension_simple} || ".so";
+     our $shlibextimport = $target{shared_import_extension} || "";
+     our $dsoext = $target{dso_extension} || ".so";
+
      sub windowsdll { $config{target} =~ /^(?:Cygwin|mingw)/ }
 
      # shlib and shlib_simple both take a static library name and figure
      # removed.  On some systems, they may therefore return the exact same
      # string.
      sub shlib {
-         return () if $config{no_shared};
+         return () if $disabled{shared};
          my $lib = shift;
-         return $unified_info{sharednames}->{$lib} . '$(SHLIB_EXT)';
+         return $unified_info{sharednames}->{$lib} . $shlibext;
      }
      sub shlib_simple {
-         return () if $config{no_shared};
+         return () if $disabled{shared};
 
          my $lib = shift;
          if (windowsdll()) {
-             return $lib . '$(SHLIB_EXT_IMPORT)';
+             return $lib . $shlibextimport;
          }
-         return $lib . '$(SHLIB_EXT_SIMPLE)';
+         return $lib .  $shlibextsimple;
      }
 
      # 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)';
+         return $engine . $dsoext;
      }
+     '';
 -}
 PLATFORM={- $config{target} -}
 OPTIONS={- $config{options} -}
@@ -64,22 +73,13 @@ SHLIB_MAJOR={- $config{shlib_major} -}
 SHLIB_MINOR={- $config{shlib_minor} -}
 SHLIB_TARGET={- $target{shared_target} -}
 
-EXE_EXT={- $target{exe_extension} || "" -}
-LIB_EXT={- $target{lib_extension} || ".a" -}
-SHLIB_EXT={- $target{shared_extension} || ".so" -}
-SHLIB_EXT_SIMPLE={- $target{shared_extension_simple} || ".so" -}
-SHLIB_EXT_IMPORT={- $target{shared_import_extension} || "" -}
-DSO_EXT={- $target{dso_extension} || ".so" -}
-OBJ_EXT={- $target{obj_extension} || ".o" -}
-DEP_EXT={- $target{dep_extension} || ".d" -}
-
-LIBS={- join(" ", map { $_."\$(LIB_EXT)" } @{$unified_info{libraries}}) -}
+LIBS={- join(" ", map { $_.$libext } @{$unified_info{libraries}}) -}
 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}}) -}
+PROGRAMS={- join(" ", map { $_.$exeext } grep { !m|^test/| } @{$unified_info{programs}}) -}
+TESTPROGS={- join(" ", map { $_.$exeext } grep { m|^test/| } @{$unified_info{programs}}) -}
 SCRIPTS={- join(" ", @{$unified_info{scripts}}) -}
-DEPS={- join(" ", map { (my $x = $_) =~ s|\.o$|\$(DEP_EXT)|; $x; }
+DEPS={- join(" ", map { (my $x = $_) =~ s|\.o$|$depext|; $x; }
                   grep { $unified_info{sources}->{$_}->[0] =~ /\.c$/ }
                   keys %{$unified_info{sources}}); -}
 
@@ -144,12 +144,13 @@ HTMLSUFFIX=html
 
 CROSS_COMPILE= {- $config{cross_compile_prefix} -}
 CC= $(CROSS_COMPILE){- $target{cc} -}
-CFLAGS={- our $cflags2 = join(" ",(map { "-D".$_} @{$config{defines}}),"-DOPENSSLDIR=\"\\\"\$(OPENSSLDIR)\\\"\"","-DENGINESDIR=\"\\\"\$(ENGINESDIR)\\\"\"") -} {- $config{cflags} -}
+CFLAGS={- our $cflags2 = join(" ",(map { "-D".$_} @{$target{defines}}, @{$config{defines}}),"-DOPENSSLDIR=\"\\\"\$(OPENSSLDIR)\\\"\"","-DENGINESDIR=\"\\\"\$(ENGINESDIR)\\\"\"") -} {- $target{cflags} -} {- $config{cflags} -}
 CFLAGS_Q={- $cflags2 =~ s|([\\"])|\\$1|g; $cflags2 -} {- $config{cflags} -}
-LDFLAGS= {- $config{lflags} -}
-PLIB_LDFLAGS= {- $config{plib_lflags} -}
-EX_LIBS= {- $config{ex_libs} -}
-SHARED_LDFLAGS={- $target{shared_ldflag}
+LDFLAGS= {- $target{lflags} -}
+PLIB_LDFLAGS= {- $target{plib_lflags} -}
+EX_LIBS= {- $target{ex_libs} -} {- $config{ex_libs} -}
+SHARED_CFLAGS={- $target{shared_cflag} || "" -}
+SHARED_LDFLAGS={- $target{shared_ldflag}." ".$config{shared_ldflag}
                   # Unlike other OSes (like Solaris, Linux, Tru64,
                   # IRIX) BSD run-time linkers (tested OpenBSD, NetBSD
                   # and FreeBSD) "demand" RPATH set on .so objects.
@@ -164,6 +165,8 @@ SHARED_LDFLAGS={- $target{shared_ldflag}
                   . ($config{target} =~ m|^BSD-| && $prefix !~ m|^/usr/.*$|
                      ? " -Wl,-rpath,\$\$(LIBRPATH)" : "") -}
 SHARED_RCFLAGS={- $target{shared_rcflag} -}
+DSO_CFLAGS={- $target{shared_cflag} || "" -}
+BIN_CFLAGS={- "" -}
 
 PERL={- $config{perl} -}
 
@@ -208,11 +211,11 @@ build_apps_nodep: $(PROGRAMS) $(SCRIPTS)
 build_tests: configdata.pm build_tests_nodep depend
 build_tests_nodep: $(TESTPROGS)
 
-test tests: build_tests_nodep build_apps_nodep build_engines_nodep depend rehash
+test tests: build_tests_nodep build_apps_nodep build_engines_nodep depend
        ( cd test; \
          SRCTOP=../$(SRCDIR) \
          BLDTOP=../$(BLDDIR) \
-         EXE_EXT=$(EXE_EXT) \
+         EXE_EXT={- $exeext -} \
            $(PERL) ../$(SRCDIR)/test/run_tests.pl $(TESTS) )
 
 list-tests:
@@ -237,27 +240,48 @@ uninstall: uninstall_docs uninstall_sw
 
 clean: libclean
        rm -f $(PROGRAMS) $(TESTPROGS)
-       rm -f `find $(BLDDIR) -name '*$(DEP_EXT)'`
-       rm -f `find $(BLDDIR) -name '*$(OBJ_EXT)'`
-       rm -f $(BLDDIR)/core $(BLDDIR)/rehash.time
+       rm -f `find $(BLDDIR) -name '*{- $depext -}'`
+       rm -f `find $(BLDDIR) -name '*{- $objext -}'`
+       rm -f $(BLDDIR)/core
        rm -f $(BLDDIR)/tags $(BLDDIR)/TAGS
        rm -f $(BLDDIR)/openssl.pc $(BLDDIR)/libcrypto.pc $(BLDDIR)/libssl.pc
        -rm -f `find $(BLDDIR) -type l`
        rm -f $(TARFILE)
 
 # This exists solely for those who still type 'make depend'
-depend: Makefile
-Makefile: FORCE
-       @( sed -e '/^# DO NOT DELETE THIS LINE.*/,$$d' < Makefile; \
-         echo '# DO NOT DELETE THIS LINE -- make depend depends on it.'; \
-         echo; \
+#
+# We check if any depfile is newer than Makefile and decide to
+# concatenate only if that is true, or if 'test' (a.k.a [ )
+# doesn't have the option to figure it out (-nt).
+#
+# To check if test has the file age comparison operator, we
+# simply try, and rely test to exit with 0 if the comparison
+# was true, 1 if false, and most importantly, 2 if it doesn't
+# recognise the operator.
+depend:
+       @catdepends=false; \
+       if [ Makefile -nt Makefile ] 2>/dev/null || [ $$? = 1 ]; then \
          for d in $(DEPS); do \
-           if [ -f $$d ]; then cat $$d; fi; \
-         done ) > Makefile.new
-       @if ! cmp Makefile.new Makefile >/dev/null 2>&1; then \
-               mv -f Makefile.new Makefile; \
+           if [ $$d -nt Makefile ]; then \
+             catdepends=true; \
+             break; \
+           fi; \
+         done; \
        else \
-               rm -f Makefile.new; \
+         catdepends=true; \
+       fi; \
+       if [ $$catdepends = true ]; then \
+         ( sed -e '/^# DO NOT DELETE THIS LINE.*/,$$d' < Makefile; \
+           echo '# DO NOT DELETE THIS LINE -- make depend depends on it.'; \
+           echo; \
+           for d in $(DEPS); do \
+             if [ -f $$d ]; then cat $$d; fi; \
+           done ) > Makefile.new; \
+         if ! cmp Makefile.new Makefile >/dev/null 2>&1; then \
+           mv -f Makefile.new Makefile; \
+         else \
+           rm -f Makefile.new; \
+         fi; \
        fi
 
 # Install helper targets #############################################
@@ -296,7 +320,7 @@ install_dev:
                mv -f $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn.new \
                      $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn; \
        done
-       @ : {- output_off() if $config{no_shared}; "" -}
+       @ : {- output_off() if $disabled{shared}; "" -}
        @set -e; for s in $(SHLIB_INFO); do \
                s1=`echo "$$s" | cut -f1 -d";"`; \
                s2=`echo "$$s" | cut -f2 -d";"`; \
@@ -320,7 +344,7 @@ install_dev:
                      $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn2; \
                : {- output_on() unless windowsdll(); "" -}; \
        done
-       @ : {- output_on() if $config{no_shared}; "" -}
+       @ : {- output_on() if $disabled{shared}; "" -}
        @$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/pkgconfig
        @echo "install libcrypto.pc -> $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/pkgconfig/libcrypto.pc"
        @cp libcrypto.pc $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/pkgconfig
@@ -347,7 +371,7 @@ uninstall_dev:
                echo "$(RM) $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn"; \
                $(RM) $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn; \
        done
-       @ : {- output_off() if $config{no_shared}; "" -}
+       @ : {- output_off() if $disabled{shared}; "" -}
        @set -e; for s in $(SHLIB_INFO); do \
                s1=`echo "$$s" | cut -f1 -d";"`; \
                s2=`echo "$$s" | cut -f2 -d";"`; \
@@ -365,17 +389,12 @@ uninstall_dev:
                $(RM) $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn2; \
                : {- 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)
+       @ : {- output_on() if $disabled{shared}; "" -}
+       $(RM) $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/pkgconfig/libcrypto.pc
+       $(RM) $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/pkgconfig/libssl.pc
+       $(RM) $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/pkgconfig/openssl.pc
+       -$(RMDIR) $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/pkgconfig
+       -$(RMDIR) $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)
 
 install_engines:
        @[ -n "$(INSTALLTOP)" ] || (echo INSTALLTOP should not be empty; exit 1)
@@ -403,8 +422,7 @@ 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
+       -$(RMDIR) $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/engines
 
 install_runtime:
        @[ -n "$(INSTALLTOP)" ] || (echo INSTALLTOP should not be empty; exit 1)
@@ -478,10 +496,8 @@ uninstall_runtime:
        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
+       -$(RMDIR) $(DESTDIR)$(INSTALLTOP)/bin
+       -$(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
@@ -626,8 +642,6 @@ errors:
              $(PERL) ../util/mkerr.pl -conf $$e \
                      -nostatic -staticloader -write *.c; \
          done )
-       ( cd $(SRCDIR)/crypto/ct; \
-         $(PERL) ../../util/mkerr.pl -conf ct.ec -hprefix internal/ -write *.c )
 
 ordinals:
        ( b=`pwd`; cd $(SRCDIR); $(PERL) -I$$b util/mkdef.pl crypto update )
@@ -671,17 +685,6 @@ dist:
 
 # Helper targets #####################################################
 
-rehash: link-utils copy-certs build_apps_nodep
-       @if [ -z "$(CROSS_COMPILE)" ]; then \
-               (OPENSSL="$(BLDDIR)/util/shlib_wrap.sh apps/openssl"; \
-               [ -x "$(BLDDIR)/openssl.exe" ] && OPENSSL="$(BLDDIR)/openssl.exe" || :; \
-               OPENSSL_DEBUG_MEMORY=on; OPENSSL_CONF=/dev/null ; \
-               export OPENSSL OPENSSL_DEBUG_MEMORY OPENSSL_CONF; \
-               $$OPENSSL rehash certs/demo \
-               || $(PERL) tools/c_rehash certs/demo) && \
-               touch rehash.time; \
-       else :; fi
-
 link-utils: $(BLDDIR)/util/opensslwrap.sh $(BLDDIR)/util/shlib_wrap.sh
 
 $(BLDDIR)/util/opensslwrap.sh: configdata.pm
@@ -695,11 +698,6 @@ $(BLDDIR)/util/shlib_wrap.sh: configdata.pm
            ln -sf "../$(SRCDIR)/util/shlib_wrap.sh" "$(BLDDIR)/util"; \
        fi
 
-copy-certs: FORCE
-       @if [ "$(SRCDIR)" != "$(BLDDIR)" ]; then \
-           cp -R "$(SRCDIR)/certs" "$(BLDDIR)/"; \
-       fi
-
 $(SRCDIR)/apps/openssl-vms.cnf: $(SRCDIR)/apps/openssl.cnf
        $(PERL) $(SRCDIR)/VMS/VMSify-conf.pl \
                 < $(SRCDIR)/apps/openssl.cnf > $(SRCDIR)/apps/openssl-vms.cnf
@@ -790,7 +788,7 @@ openssl.pc:
 # wasn't passed down automatically.  It's quite safe to use it like we do
 # below; if it doesn't exist, the result will be empty and 'make' will pick
 # up $(MAKEFLAGS) which is passed down as an environment variable.
-configdata.pm: {- $config{build_file_template} -} $(SRCDIR)/Configure $(SRCDIR)/config
+configdata.pm: {- $config{build_file_template} -} $(SRCDIR)/Configurations/common.tmpl $(SRCDIR)/Configure $(SRCDIR)/config {- join(" ", @{$config{build_infos}}) -}
        @echo "Detected changed: $?"
        @echo "Reconfiguring..."
        $(SRCDIR)/Configure reconf
@@ -808,8 +806,8 @@ configdata.pm: {- $config{build_file_template} -} $(SRCDIR)/Configure $(SRCDIR)/
   # 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)" } @_;
+      if ($disabled{shared}) {
+          return map { $_.$libext } @_;
       }
 
       # Depending on shared libraries:
@@ -818,30 +816,72 @@ configdata.pm: {- $config{build_file_template} -} $(SRCDIR)/Configure $(SRCDIR)/
       return map { shlib_simple($_) } @_;
   }
 
+  sub generatesrc {
+      my %args = @_;
+      my $generator = join(" ", @{$args{generator}});
+
+      if ($args{src} !~ /\.[sS]$/) {
+          return <<"EOF";
+$args{src}: $args{generator}->[0]
+       \$(PERL) $generator > \$@
+EOF
+      } else {
+          if ($args{generator}->[0] =~ /\.[sS]$/) {
+              return <<"EOF";
+$args{src}: $args{generator}->[0]
+       \$(CC) \$(CFLAGS) -E \$< > \$@
+EOF
+          } elsif ($args{generator}->[0] =~ /\.pl$/) {
+             return <<"EOF";
+$args{src}: $args{generator}->[0]
+       ( trap "rm -f \$@.S" INT; \\
+         CC="\$(CC)" \$(PERL) $generator \$@.S; \\
+         if grep '^#' \$@.S >/dev/null; then \\
+             \$(CC) -E -P \$@.S > \$@ && rm -f \$@.S; \\
+         else \\
+             mv \$@.S \$@; \\
+         fi )
+EOF
+          } elsif ($args{generator}->[0] =~ /\.m4$/) {
+              return <<"EOF";
+$args{src}: $args{generator}->[0]
+       m4 -B 8192 $generator > \$@
+EOF
+          } else {
+              die "Generator type for $args{src} unknown: $args{generator}\n";
+          }
+      }
+  }
+
   sub src2obj {
       my %args = @_;
       my $obj = $args{obj};
       my $srcs = join(" ", @{$args{srcs}});
       my $deps = join(" ", @{$args{srcs}}, @{$args{deps}});
-      my $incs = join(" ", map { " -I".$_ } @{$args{incs}});
+      my $incs = join("", map { " -I".$_ } @{$args{incs}});
+      my $ecflags = { lib => '$(SHARED_CFLAGS)',
+                      dso => '$(DSO_CFLAGS)',
+                      bin => '$(BIN_CFLAGS)' } -> {$args{intent}};
       my $makedepprog = $config{makedepprog};
       if ($makedepprog eq "makedepend") {
           return <<"EOF";
-$obj\$(DEP_EXT): $deps
+$obj$depext: $deps
        rm -f \$\@.tmp; touch \$\@.tmp
-       \$(MAKEDEPEND) -f\$\@.tmp -o"|$obj" -- \$(CFLAGS)$incs -- $srcs \\
+       -\$(MAKEDEPEND) -f\$\@.tmp -o"|$obj" -- \$(CFLAGS) $ecflags$incs -- $srcs \\
            2>/dev/null
        sed -e 's/^.*|//' -e 's/ \\/\\(\\\\.\\|[^ ]\\)*//g' -e '/: *\$\$/d' -e '/^\\(#.*\\| *\\)\$\$/d' \$\@.tmp > \$\@
        rm \$\@.tmp
-$obj\$(OBJ_EXT): $obj\$(DEP_EXT)
-       \$(CC) \$(CFLAGS)$incs -c -o \$\@ $srcs
+$obj$objext: $obj$depext
+       \$(CC) \$(CFLAGS) $ecflags$incs -c -o \$\@ $srcs
 EOF
       }
       return <<"EOF";
-$obj\$(DEP_EXT): $deps
-       \$(CC) \$(CFLAGS)$incs -MM -MF \$\@ -MQ $obj $srcs
-$obj\$(OBJ_EXT): $obj\$(DEP_EXT)
-       \$(CC) \$(CFLAGS)$incs -c -o \$\@ $srcs
+$obj$objext: $deps
+       \$(CC) \$(CFLAGS) $ecflags$incs -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 \\
+               mv $obj$depext.tmp $obj$depext; \\
+       fi
 EOF
   }
   # On Unix, we build shlibs from static libs, so we're ignoring the
@@ -868,9 +908,9 @@ EOF
 # 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_IMPORT) for Windows POSIX layers and
-# {libname}\$(SHLIB_EXT_SIMPLE) for the Unix platforms.
-$target : $lib\$(LIB_EXT) $deps $ordinalsfile
+# simplest, {libname}$shlibextimport for Windows POSIX layers and
+# {libname}$shlibextsimple for the Unix platforms.
+$target: $lib$libext $deps $ordinalsfile
        \$(MAKE) -f \$(SRCDIR)/Makefile.shared -e \\
                PLATFORM=\$(PLATFORM) \\
                PERL=\$(PERL) SRCDIR="\$(SRCDIR)" DSTDIR="$libd" \\
@@ -880,15 +920,15 @@ $target : $lib\$(LIB_EXT) $deps $ordinalsfile
                LIBCOMPATVERSIONS=";\$(SHLIB_VERSION_HISTORY)" \\
                CC="\$(CC)" CFLAGS="\$(CFLAGS)" LDFLAGS="\$(LDFLAGS)" \\
                CROSS_COMPILE="\$(CROSS_COMPILE)" \\
-               SHARED_LDFLAGS="\$(SHARED_LDFLAGS)" SHLIB_EXT=\$(SHLIB_EXT) \\
+               SHARED_LDFLAGS="\$(SHARED_LDFLAGS)" SHLIB_EXT=$shlibext \\
                SHARED_RCFLAGS="\$(SHARED_RCFLAGS)" \\
                link_shlib.$shlib_target
 EOF
          . (windowsdll() ? <<"EOF" : "");
-       rm -f apps/$shlib\$(SHLIB_EXT)
-       rm -f test/$shlib\$(SHLIB_EXT)
-       cp -p $shlib\$(SHLIB_EXT) apps/
-       cp -p $shlib\$(SHLIB_EXT) test/
+       rm -f apps/$shlib$shlibext
+       rm -f test/$shlib$shlibext
+       cp -p $shlib$shlibext apps/
+       cp -p $shlib$shlibext test/
 EOF
   }
   sub obj2dso {
@@ -903,7 +943,7 @@ EOF
                                      " -L$d -l$l" } @{$args{deps}});
       my $deps = join(" ",compute_lib_depends(@{$args{deps}}));
       my $shlib_target = $target{shared_target};
-      my $objs = join(" ", map { $_."\$(OBJ_EXT)" } @{$args{objs}});
+      my $objs = join(" ", map { $_.$objext } @{$args{objs}});
       my $target = dso($lib);
       return <<"EOF";
 $target: $objs $deps
@@ -914,7 +954,7 @@ $target: $objs $deps
                LIBNAME=$libname LDFLAGS="\$(LDFLAGS)" \\
                CC="\$(CC)" CFLAGS="\$(CFLAGS)" \\
                SHARED_LDFLAGS="\$(SHARED_LDFLAGS)" \\
-               SHLIB_EXT=\$(DSO_EXT) \\
+               SHLIB_EXT=$dsoext \\
                LIBEXTRAS="$objs" \\
                link_dso.$shlib_target
 EOF
@@ -922,9 +962,9 @@ EOF
   sub obj2lib {
       my %args = @_;
       my $lib = $args{lib};
-      my $objs = join(" ", map { $_."\$(OBJ_EXT)" } @{$args{objs}});
+      my $objs = join(" ", map { $_.$objext } @{$args{objs}});
       return <<"EOF";
-$lib\$(LIB_EXT): $objs
+$lib$libext: $objs
        \$(AR) \$\@ $objs
        \$(RANLIB) \$\@ || echo Never mind.
 EOF
@@ -934,20 +974,20 @@ EOF
       my $bin = $args{bin};
       my $bind = dirname($bin);
       my $binn = basename($bin);
-      my $objs = join(" ", map { $_."\$(OBJ_EXT)" } @{$args{objs}});
+      my $objs = join(" ", map { $_.$objext } @{$args{objs}});
       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};
+      my $shlib_target = $disabled{shared} ? "" : $target{shared_target};
       return <<"EOF";
-$bin\$(EXE_EXT): $objs $deps
-       \$(RM) $bin\$(EXE_EXT)
+$bin$exeext: $objs $deps
+       \$(RM) $bin$exeext
        \$(MAKE) -f \$(SRCDIR)/Makefile.shared -e \\
                PERL=\$(PERL) SRCDIR=\$(SRCDIR) \\
-               APPNAME=$bin\$(EXE_EXT) OBJECTS="$objs" \\
+               APPNAME=$bin$exeext OBJECTS="$objs" \\
                LIBDEPS="\$(PLIB_LDFLAGS) $linklibs \$(EX_LIBS)" \\
                CC="\$(CC)" CFLAGS="\$(CFLAGS)" LDFLAGS="\$(LDFLAGS)" \\
                LIBRPATH="\$(INSTALLTOP)/\$(LIBDIR)" \\