]> granicus.if.org Git - postgresql/commitdiff
Support linking with MinGW-built Perl.
authorNoah Misch <noah@leadboat.com>
Fri, 24 Nov 2017 04:22:04 +0000 (20:22 -0800)
committerNoah Misch <noah@leadboat.com>
Fri, 24 Nov 2017 04:22:04 +0000 (20:22 -0800)
This is necessary for ActivePerl 5.18 onwards and for Strawberry Perl.
It is not sufficient for 32-bit builds with newer Visual Studio; these
fail with error LINK2026.  Back-patch to 9.3 (all supported versions).

Reported by Victor Wagner.

Discussion: https://postgr.es/m/20160326154321.7754ab8f@wagner.wagner.home

config/perl.m4
configure
src/pl/plperl/plperl.h
src/tools/msvc/Mkvcbuild.pm

index 8c21d0fb395df4a669669ef499f29266fcc73ab3..76b1a92e3a00f57c31f43429beee960f6ea74bd0 100644 (file)
@@ -83,12 +83,19 @@ AC_DEFUN([PGAC_CHECK_PERL_EMBED_LDFLAGS],
 [AC_REQUIRE([PGAC_PATH_PERL])
 AC_MSG_CHECKING(for flags to link embedded Perl)
 if test "$PORTNAME" = "win32" ; then
-perl_lib=`basename $perl_archlibexp/CORE/perl[[5-9]]*.lib .lib`
-test -e "$perl_archlibexp/CORE/$perl_lib.lib" && perl_embed_ldflags="-L$perl_archlibexp/CORE -l$perl_lib"
+       perl_lib=`basename $perl_archlibexp/CORE/perl[[5-9]]*.lib .lib`
+       if test -e "$perl_archlibexp/CORE/$perl_lib.lib"; then
+               perl_embed_ldflags="-L$perl_archlibexp/CORE -l$perl_lib"
+       else
+               perl_lib=`basename $perl_archlibexp/CORE/libperl[[5-9]]*.a .a | sed 's/^lib//'`
+               if test -e "$perl_archlibexp/CORE/lib$perl_lib.a"; then
+                       perl_embed_ldflags="-L$perl_archlibexp/CORE -l$perl_lib"
+               fi
+       fi
 else
-pgac_tmp1=`$PERL -MExtUtils::Embed -e ldopts`
-pgac_tmp2=`$PERL -MConfig -e 'print $Config{ccdlflags}'`
-perl_embed_ldflags=`echo X"$pgac_tmp1" | sed -e "s/^X//" -e "s%$pgac_tmp2%%" -e ["s/ -arch [-a-zA-Z0-9_]*//g"]`
+       pgac_tmp1=`$PERL -MExtUtils::Embed -e ldopts`
+       pgac_tmp2=`$PERL -MConfig -e 'print $Config{ccdlflags}'`
+       perl_embed_ldflags=`echo X"$pgac_tmp1" | sed -e "s/^X//" -e "s%$pgac_tmp2%%" -e ["s/ -arch [-a-zA-Z0-9_]*//g"]`
 fi
 AC_SUBST(perl_embed_ldflags)dnl
 if test -z "$perl_embed_ldflags" ; then
index 3203473f8745f7030d19be7025ee38cd9f9c3781..6c4d743b35e2a790ede54c09121c9af21166c4c6 100755 (executable)
--- a/configure
+++ b/configure
@@ -7818,12 +7818,19 @@ $as_echo "$perl_embed_ccflags" >&6; }
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for flags to link embedded Perl" >&5
 $as_echo_n "checking for flags to link embedded Perl... " >&6; }
 if test "$PORTNAME" = "win32" ; then
-perl_lib=`basename $perl_archlibexp/CORE/perl[5-9]*.lib .lib`
-test -e "$perl_archlibexp/CORE/$perl_lib.lib" && perl_embed_ldflags="-L$perl_archlibexp/CORE -l$perl_lib"
+       perl_lib=`basename $perl_archlibexp/CORE/perl[5-9]*.lib .lib`
+       if test -e "$perl_archlibexp/CORE/$perl_lib.lib"; then
+               perl_embed_ldflags="-L$perl_archlibexp/CORE -l$perl_lib"
+       else
+               perl_lib=`basename $perl_archlibexp/CORE/libperl[5-9]*.a .a | sed 's/^lib//'`
+               if test -e "$perl_archlibexp/CORE/lib$perl_lib.a"; then
+                       perl_embed_ldflags="-L$perl_archlibexp/CORE -l$perl_lib"
+               fi
+       fi
 else
-pgac_tmp1=`$PERL -MExtUtils::Embed -e ldopts`
-pgac_tmp2=`$PERL -MConfig -e 'print $Config{ccdlflags}'`
-perl_embed_ldflags=`echo X"$pgac_tmp1" | sed -e "s/^X//" -e "s%$pgac_tmp2%%" -e "s/ -arch [-a-zA-Z0-9_]*//g"`
+       pgac_tmp1=`$PERL -MExtUtils::Embed -e ldopts`
+       pgac_tmp2=`$PERL -MConfig -e 'print $Config{ccdlflags}'`
+       perl_embed_ldflags=`echo X"$pgac_tmp1" | sed -e "s/^X//" -e "s%$pgac_tmp2%%" -e "s/ -arch [-a-zA-Z0-9_]*//g"`
 fi
 if test -z "$perl_embed_ldflags" ; then
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
index c4e06d089f4118752c34a123ee9d13665f85c8b2..aac95f8d2ce60752541f69a5865c514b6be756b7 100644 (file)
 #undef vsnprintf
 #endif
 
+/*
+ * ActivePerl 5.18 and later are MinGW-built, and their headers use GCC's
+ * __inline__.  Translate to something MSVC recognizes.
+ */
+#ifdef _MSC_VER
+#define __inline__ inline
+#endif
+
 
 /*
  * Get the basic Perl API.  We use PERL_NO_GET_CONTEXT mode so that our code
index 686c7369f683c6a21c87fd41916d19cb93f24911..4c2e12e22894ea490f7cea0fc17ea3719c10b239 100644 (file)
@@ -615,9 +615,10 @@ sub mkvcbuild
                        }
                }
                $plperl->AddReference($postgres);
-               my $perl_path = $solution->{options}->{perl} . '\lib\CORE\perl*.lib';
+               my $perl_path = $solution->{options}->{perl} . '\lib\CORE\*perl*';
+               # ActivePerl 5.16 provided perl516.lib; 5.18 provided libperl518.a
                my @perl_libs =
-                 grep { /perl\d+.lib$/ } glob($perl_path);
+                 grep { /perl\d+\.lib$|libperl\d+\.a$/ } glob($perl_path);
                if (@perl_libs == 1)
                {
                        $plperl->AddLibrary($perl_libs[0]);