]> granicus.if.org Git - postgresql/commitdiff
Absorb -D_USE_32BIT_TIME_T switch from Perl, if relevant.
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 14 Aug 2017 15:48:59 +0000 (11:48 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 14 Aug 2017 15:48:59 +0000 (11:48 -0400)
Commit 3c163a7fc's original choice to ignore all #define symbols whose
names begin with underscore turns out to be too simplistic.  On Windows,
some Perl installations are built with -D_USE_32BIT_TIME_T, and we must
absorb that or we get the wrong result for sizeof(PerlInterpreter).

This effectively re-reverts commit ef58b87df, which injected that symbol
in a hacky way, making it apply to all of Postgres not just PL/Perl.
More significantly, it did so on *all* 32-bit Windows builds, even when
the Perl build to be used did not select this option; so that it fails
to work properly with some newer Perl builds.

By making this change, we would be introducing an ABI break in 32-bit
Windows builds; but fortunately we have not used type time_t in any
exported Postgres APIs in a long time.  So it should be OK, both for
PL/Perl itself and for third-party extensions, if an extension library
is built with a different _USE_32BIT_TIME_T setting than the core code.

Patch by me, based on research by Ashutosh Sharma and Robert Haas.
Back-patch to all supported branches, as commit 3c163a7fc was.

Discussion: https://postgr.es/m/CANFyU97OVQ3+Mzfmt3MhuUm5NwPU=-FtbNH5Eb7nZL9ua8=rcA@mail.gmail.com

config/perl.m4
configure
src/tools/msvc/MSBuildProject.pm
src/tools/msvc/Mkvcbuild.pm
src/tools/msvc/VCBuildProject.pm

index 9706c4de6aca951b9187c0b3f689faf581084ddf..fbb13ed1c02f646516ae5d8112e028e0cd6ae3a7 100644 (file)
@@ -59,7 +59,9 @@ AC_DEFUN([PGAC_CHECK_PERL_CONFIGS],
 # to a different libc ABI than core Postgres uses.  The available information
 # says that all the symbols that affect Perl's own ABI begin with letters,
 # so it should be sufficient to adopt -D switches for symbols not beginning
-# with underscore.
+# with underscore.  An exception is that we need to let through
+# -D_USE_32BIT_TIME_T if it's present.  (We probably could restrict that to
+# only get through on Windows, but for the moment we let it through always.)
 # For debugging purposes, let's have the configure output report the raw
 # ccflags value as well as the set of flags we chose to adopt.
 AC_DEFUN([PGAC_CHECK_PERL_EMBED_CCFLAGS],
@@ -68,7 +70,7 @@ AC_MSG_CHECKING([for CFLAGS recommended by Perl])
 perl_ccflags=`$PERL -MConfig -e ['print $Config{ccflags}']`
 AC_MSG_RESULT([$perl_ccflags])
 AC_MSG_CHECKING([for CFLAGS to compile embedded Perl])
-perl_embed_ccflags=`$PERL -MConfig -e ['foreach $f (split(" ",$Config{ccflags})) {print $f, " " if ($f =~ /^-D[^_]/)}']`
+perl_embed_ccflags=`$PERL -MConfig -e ['foreach $f (split(" ",$Config{ccflags})) {print $f, " " if ($f =~ /^-D[^_]/ || $f =~ /^-D_USE_32BIT_TIME_T/)}']`
 AC_SUBST(perl_embed_ccflags)dnl
 AC_MSG_RESULT([$perl_embed_ccflags])
 ])# PGAC_CHECK_PERL_EMBED_CCFLAGS
index a9fb57b06c58a1640dd5c9367655c9fbfd749d4c..3c9603751a29a46691b93823e2e8933f8b08dccd 100755 (executable)
--- a/configure
+++ b/configure
@@ -7519,7 +7519,7 @@ perl_ccflags=`$PERL -MConfig -e 'print $Config{ccflags}'`
 $as_echo "$perl_ccflags" >&6; }
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFLAGS to compile embedded Perl" >&5
 $as_echo_n "checking for CFLAGS to compile embedded Perl... " >&6; }
-perl_embed_ccflags=`$PERL -MConfig -e 'foreach $f (split(" ",$Config{ccflags})) {print $f, " " if ($f =~ /^-D[^_]/)}'`
+perl_embed_ccflags=`$PERL -MConfig -e 'foreach $f (split(" ",$Config{ccflags})) {print $f, " " if ($f =~ /^-D[^_]/ || $f =~ /^-D_USE_32BIT_TIME_T/)}'`
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $perl_embed_ccflags" >&5
 $as_echo "$perl_embed_ccflags" >&6; }
 
index d7638b458ef954ac14dc3b2faf06a0aa75ce4b23..27329f9e361808f44daa4be5b5c3629323a65e0c 100644 (file)
@@ -63,21 +63,16 @@ EOF
   </PropertyGroup>
 EOF
 
-       # We have to use this flag on 32 bit targets because the 32bit perls
-       # are built with it and sometimes crash if we don't.
-       my $use_32bit_time_t =
-         $self->{platform} eq 'Win32' ? '_USE_32BIT_TIME_T;' : '';
-
        $self->WriteItemDefinitionGroup(
                $f, 'Debug',
-               {   defs    => "_DEBUG;DEBUG=1;$use_32bit_time_t",
+               {   defs    => "_DEBUG;DEBUG=1",
                        opt     => 'Disabled',
                        strpool => 'false',
                        runtime => 'MultiThreadedDebugDLL' });
        $self->WriteItemDefinitionGroup(
                $f,
                'Release',
-               {   defs    => "$use_32bit_time_t",
+               {   defs    => "",
                        opt     => 'Full',
                        strpool => 'true',
                        runtime => 'MultiThreadedDLL' });
index f3bd30540a27b8b88e38a150902500e511ba749a..6988eea1c88e3a6ba0e0a36a89b4c1969f2a31b4 100644 (file)
@@ -521,14 +521,15 @@ sub mkvcbuild
                my @perl_embed_ccflags;
                foreach my $f (split(" ",$Config{ccflags}))
                {
-                       if ($f =~ /^-D[^_]/)
+                       if ($f =~ /^-D[^_]/ ||
+                           $f =~ /^-D_USE_32BIT_TIME_T/)
                        {
                                $f =~ s/\-D//;
                                push(@perl_embed_ccflags, $f);
                        }
                }
 
-               # XXX this probably is redundant now?
+               # Also, a hack to prevent duplicate definitions of uid_t/gid_t
                push(@perl_embed_ccflags, 'PLPERL_HAVE_UID_GID');
 
                foreach my $f (@perl_embed_ccflags)
index a8d75d88f316d9d264d8cdcafed6bc8e90f13da4..669ba1730bcaa0c2a97339fb464736cbfddd34ed 100644 (file)
@@ -33,15 +33,9 @@ sub WriteHeader
  <Configurations>
 EOF
 
-       # We have to use this flag on 32 bit targets because the 32bit perls
-       # are built with it and sometimes crash if we don't.
-       my $use_32bit_time_t =
-         $self->{platform} eq 'Win32' ? '_USE_32BIT_TIME_T;' : '';
-
-
        $self->WriteConfiguration(
                $f, 'Debug',
-               {   defs     => "_DEBUG;DEBUG=1;$use_32bit_time_t",
+               {   defs     => "_DEBUG;DEBUG=1",
                        wholeopt => 0,
                        opt      => 0,
                        strpool  => 'false',
@@ -49,7 +43,7 @@ EOF
        $self->WriteConfiguration(
                $f,
                'Release',
-               {   defs     => "$use_32bit_time_t",
+               {   defs     => "",
                        wholeopt => 0,
                        opt      => 3,
                        strpool  => 'true',