Fix MSVC builds for contrib transforms modules.
authorAndrew Dunstan <andrew@dunslane.net>
Tue, 28 Apr 2015 15:47:08 +0000 (11:47 -0400)
committerAndrew Dunstan <andrew@dunslane.net>
Tue, 28 Apr 2015 15:47:08 +0000 (11:47 -0400)
With this patch the MSVC build and installation will work correctly with
the transforms. However the python transform tests for hstore and ltree
are still disabled pending some further adjustments.

Michael Paquier with some tweaks from me.

src/tools/msvc/Install.pm
src/tools/msvc/Mkvcbuild.pm
src/tools/msvc/vcregress.pl

index bfcdf50e74abc591b96c6613c8179e55d152fcc5..b617835c0c5aff21dd8506a2c56f58fed44631af 100644 (file)
@@ -439,9 +439,12 @@ sub CopyContribFiles
        while (my $d = readdir($D))
        {
            # These configuration-based exclusions must match vcregress.pl
-           next if ($d eq "uuid-ossp" && !defined($config->{uuid}));
-           next if ($d eq "sslinfo"   && !defined($config->{openssl}));
-           next if ($d eq "xml2"      && !defined($config->{xml}));
+           next if ($d eq "uuid-ossp"       && !defined($config->{uuid}));
+           next if ($d eq "sslinfo"         && !defined($config->{openssl}));
+           next if ($d eq "xml2"            && !defined($config->{xml}));
+           next if ($d eq "hstore_plperl"   && !defined($config->{perl}));
+           next if ($d eq "hstore_plpython" && !defined($config->{python}));
+           next if ($d eq "ltree_plpython"  && !defined($config->{python}));
            next if ($d eq "sepgsql");
 
            CopySubdirFiles($subdir, $d, $config, $target);
index cfb9b24a0226ee23300b70320c645b39d9d913f4..be06898d1ae8599d3ede12ed31a6d8cfb2bdcd70 100644 (file)
@@ -46,7 +46,11 @@ my $contrib_extraincludes =
 my $contrib_extrasource = {
    'cube' => [ 'contrib/cube/cubescan.l', 'contrib/cube/cubeparse.y' ],
    'seg' => [ 'contrib/seg/segscan.l', 'contrib/seg/segparse.y' ], };
-my @contrib_excludes = ('pgcrypto', 'commit_ts', 'intagg', 'sepgsql');
+my @contrib_excludes = (
+   'commit_ts', 'hstore_plperl',
+   'hstore_plpython', 'intagg',
+   'ltree_plpython', 'pgcrypto',
+   'sepgsql');
 
 # Set of variables for frontend modules
 my $frontend_defines = { 'initdb' => 'FRONTEND' };
@@ -176,119 +180,6 @@ sub mkvcbuild
    $plpgsql->AddFiles('src/pl/plpgsql/src', 'pl_gram.y');
    $plpgsql->AddReference($postgres);
 
-   if ($solution->{options}->{perl})
-   {
-       my $plperlsrc = "src/pl/plperl/";
-       my $plperl =
-         $solution->AddProject('plperl', 'dll', 'PLs', 'src/pl/plperl');
-       $plperl->AddIncludeDir($solution->{options}->{perl} . '/lib/CORE');
-       $plperl->AddDefine('PLPERL_HAVE_UID_GID');
-       foreach my $xs ('SPI.xs', 'Util.xs')
-       {
-           (my $xsc = $xs) =~ s/\.xs/.c/;
-           if (Solution::IsNewer("$plperlsrc$xsc", "$plperlsrc$xs"))
-           {
-               my $xsubppdir = first { -e "$_/ExtUtils/xsubpp" } @INC;
-               print "Building $plperlsrc$xsc...\n";
-               system( $solution->{options}->{perl}
-                     . '/bin/perl '
-                     . "$xsubppdir/ExtUtils/xsubpp -typemap "
-                     . $solution->{options}->{perl}
-                     . '/lib/ExtUtils/typemap '
-                     . "$plperlsrc$xs "
-                     . ">$plperlsrc$xsc");
-               if ((!(-f "$plperlsrc$xsc")) || -z "$plperlsrc$xsc")
-               {
-                   unlink("$plperlsrc$xsc");    # if zero size
-                   die "Failed to create $xsc.\n";
-               }
-           }
-       }
-       if (Solution::IsNewer(
-               'src/pl/plperl/perlchunks.h',
-               'src/pl/plperl/plc_perlboot.pl')
-           || Solution::IsNewer(
-               'src/pl/plperl/perlchunks.h',
-               'src/pl/plperl/plc_trusted.pl'))
-       {
-           print 'Building src/pl/plperl/perlchunks.h ...' . "\n";
-           my $basedir = getcwd;
-           chdir 'src/pl/plperl';
-           system( $solution->{options}->{perl}
-                 . '/bin/perl '
-                 . 'text2macro.pl '
-                 . '--strip="^(\#.*|\s*)$$" '
-                 . 'plc_perlboot.pl plc_trusted.pl '
-                 . '>perlchunks.h');
-           chdir $basedir;
-           if ((!(-f 'src/pl/plperl/perlchunks.h'))
-               || -z 'src/pl/plperl/perlchunks.h')
-           {
-               unlink('src/pl/plperl/perlchunks.h');    # if zero size
-               die 'Failed to create perlchunks.h' . "\n";
-           }
-       }
-       if (Solution::IsNewer(
-               'src/pl/plperl/plperl_opmask.h',
-               'src/pl/plperl/plperl_opmask.pl'))
-       {
-           print 'Building src/pl/plperl/plperl_opmask.h ...' . "\n";
-           my $basedir = getcwd;
-           chdir 'src/pl/plperl';
-           system( $solution->{options}->{perl}
-                 . '/bin/perl '
-                 . 'plperl_opmask.pl '
-                 . 'plperl_opmask.h');
-           chdir $basedir;
-           if ((!(-f 'src/pl/plperl/plperl_opmask.h'))
-               || -z 'src/pl/plperl/plperl_opmask.h')
-           {
-               unlink('src/pl/plperl/plperl_opmask.h');    # if zero size
-               die 'Failed to create plperl_opmask.h' . "\n";
-           }
-       }
-       $plperl->AddReference($postgres);
-       my @perl_libs =
-         grep { /perl\d+.lib$/ }
-         glob($solution->{options}->{perl} . '\lib\CORE\perl*.lib');
-       if (@perl_libs == 1)
-       {
-           $plperl->AddLibrary($perl_libs[0]);
-       }
-       else
-       {
-           die "could not identify perl library version";
-       }
-   }
-
-   if ($solution->{options}->{python})
-   {
-
-       # Attempt to get python version and location.
-       # Assume python.exe in specified dir.
-       open(P,
-           $solution->{options}->{python}
-             . "\\python -c \"import sys;print(sys.prefix);print(str(sys.version_info[0])+str(sys.version_info[1]))\" |"
-       ) || die "Could not query for python version!\n";
-       my $pyprefix = <P>;
-       chomp($pyprefix);
-       my $pyver = <P>;
-       chomp($pyver);
-       close(P);
-
-       # Sometimes (always?) if python is not present, the execution
-       # appears to work, but gives no data...
-       die "Failed to query python for version information\n"
-         if (!(defined($pyprefix) && defined($pyver)));
-
-       my $pymajorver = substr($pyver, 0, 1);
-       my $plpython = $solution->AddProject('plpython' . $pymajorver,
-           'dll', 'PLs', 'src/pl/plpython');
-       $plpython->AddIncludeDir($pyprefix . '/include');
-       $plpython->AddLibrary($pyprefix . "/Libs/python$pyver.lib");
-       $plpython->AddReference($postgres);
-   }
-
    if ($solution->{options}->{tcl})
    {
        my $pltcl =
@@ -571,6 +462,138 @@ sub mkvcbuild
        closedir($D);
    }
 
+   # Build Perl and Python modules after contrib/ modules to satisfy some
+   # dependencies with transform contrib modules, like hstore_plpython
+   # ltree_plpython and hstore_plperl.
+   if ($solution->{options}->{python})
+   {
+       # Attempt to get python version and location.
+       # Assume python.exe in specified dir.
+       my $pythonprog = "import sys;print(sys.prefix);" .
+         "print(str(sys.version_info[0])+str(sys.version_info[1]))";
+       my $prefixcmd = $solution->{options}->{python}
+             . "\\python -c \"$pythonprog\"";
+       my $pyout = `$prefixcmd`;
+       die "Could not query for python version!\n" if $?;
+       my ($pyprefix,$pyver) = split(/\r?\n/,$pyout);
+
+       # Sometimes (always?) if python is not present, the execution
+       # appears to work, but gives no data...
+       die "Failed to query python for version information\n"
+         if (!(defined($pyprefix) && defined($pyver)));
+
+       my $pymajorver = substr($pyver, 0, 1);
+       my $plpython = $solution->AddProject('plpython' . $pymajorver,
+           'dll', 'PLs', 'src/pl/plpython');
+       $plpython->AddIncludeDir($pyprefix . '/include');
+       $plpython->AddLibrary($pyprefix . "/Libs/python$pyver.lib");
+       $plpython->AddReference($postgres);
+
+       # Add transform modules dependent on plpython
+       AddTransformModule('hstore_plpython' . $pymajorver,
+                          'contrib/hstore_plpython',
+                          'plpython' . $pymajorver,
+                          'src/pl/plpython', 'hstore',
+                          'contrib/hstore');
+       AddTransformModule('ltree_plpython' . $pymajorver,
+                          'contrib/ltree_plpython',
+                          'plpython' . $pymajorver,
+                          'src/pl/plpython', 'ltree',
+                          'contrib/ltree');
+   }
+
+   if ($solution->{options}->{perl})
+   {
+       my $plperlsrc = "src/pl/plperl/";
+       my $plperl =
+         $solution->AddProject('plperl', 'dll', 'PLs', 'src/pl/plperl');
+       $plperl->AddIncludeDir($solution->{options}->{perl} . '/lib/CORE');
+       $plperl->AddDefine('PLPERL_HAVE_UID_GID');
+       foreach my $xs ('SPI.xs', 'Util.xs')
+       {
+           (my $xsc = $xs) =~ s/\.xs/.c/;
+           if (Solution::IsNewer("$plperlsrc$xsc", "$plperlsrc$xs"))
+           {
+               my $xsubppdir = first { -e "$_/ExtUtils/xsubpp" } @INC;
+               print "Building $plperlsrc$xsc...\n";
+               system( $solution->{options}->{perl}
+                     . '/bin/perl '
+                     . "$xsubppdir/ExtUtils/xsubpp -typemap "
+                     . $solution->{options}->{perl}
+                     . '/lib/ExtUtils/typemap '
+                     . "$plperlsrc$xs "
+                     . ">$plperlsrc$xsc");
+               if ((!(-f "$plperlsrc$xsc")) || -z "$plperlsrc$xsc")
+               {
+                   unlink("$plperlsrc$xsc");    # if zero size
+                   die "Failed to create $xsc.\n";
+               }
+           }
+       }
+       if (Solution::IsNewer(
+               'src/pl/plperl/perlchunks.h',
+               'src/pl/plperl/plc_perlboot.pl')
+           || Solution::IsNewer(
+               'src/pl/plperl/perlchunks.h',
+               'src/pl/plperl/plc_trusted.pl'))
+       {
+           print 'Building src/pl/plperl/perlchunks.h ...' . "\n";
+           my $basedir = getcwd;
+           chdir 'src/pl/plperl';
+           system( $solution->{options}->{perl}
+                 . '/bin/perl '
+                 . 'text2macro.pl '
+                 . '--strip="^(\#.*|\s*)$$" '
+                 . 'plc_perlboot.pl plc_trusted.pl '
+                 . '>perlchunks.h');
+           chdir $basedir;
+           if ((!(-f 'src/pl/plperl/perlchunks.h'))
+               || -z 'src/pl/plperl/perlchunks.h')
+           {
+               unlink('src/pl/plperl/perlchunks.h');    # if zero size
+               die 'Failed to create perlchunks.h' . "\n";
+           }
+       }
+       if (Solution::IsNewer(
+               'src/pl/plperl/plperl_opmask.h',
+               'src/pl/plperl/plperl_opmask.pl'))
+       {
+           print 'Building src/pl/plperl/plperl_opmask.h ...' . "\n";
+           my $basedir = getcwd;
+           chdir 'src/pl/plperl';
+           system( $solution->{options}->{perl}
+                 . '/bin/perl '
+                 . 'plperl_opmask.pl '
+                 . 'plperl_opmask.h');
+           chdir $basedir;
+           if ((!(-f 'src/pl/plperl/plperl_opmask.h'))
+               || -z 'src/pl/plperl/plperl_opmask.h')
+           {
+               unlink('src/pl/plperl/plperl_opmask.h');    # if zero size
+               die 'Failed to create plperl_opmask.h' . "\n";
+           }
+       }
+       $plperl->AddReference($postgres);
+       my @perl_libs =
+         grep { /perl\d+.lib$/ }
+         glob($solution->{options}->{perl} . '\lib\CORE\perl*.lib');
+       if (@perl_libs == 1)
+       {
+           $plperl->AddLibrary($perl_libs[0]);
+       }
+       else
+       {
+           die "could not identify perl library version";
+       }
+
+       # Add transform module dependent on plperl
+       my $hstore_plperl =
+         AddTransformModule('hstore_plperl', 'contrib/hstore_plperl',
+                            'plperl', 'src/pl/plperl',
+                            'hstore', 'contrib/hstore');
+       $hstore_plperl->AddDefine('PLPERL_HAVE_UID_GID');
+   }
+
    $mf =
      Project::read_file('src/backend/utils/mb/conversion_procs/Makefile');
    $mf =~ s{\\\r?\n}{}g;
@@ -680,6 +703,68 @@ sub AddSimpleFrontend
    return $p;
 }
 
+# Add a simple transform module
+sub AddTransformModule
+{
+   my $n = shift;
+   my $n_src = shift;
+   my $pl_proj_name = shift;
+   my $pl_src = shift;
+   my $transform_name = shift;
+   my $transform_src = shift;
+
+   my $transform_proj = undef;
+   foreach my $proj (@{ $solution->{projects}->{'contrib'} })
+   {
+       if ($proj->{name} eq $transform_name)
+       {
+           $transform_proj = $proj;
+           last;
+       }
+   }
+   die "could not find base module $transform_name for transform module $n"
+       if (!defined($transform_proj));
+
+   my $pl_proj = undef;
+   foreach my $proj (@{ $solution->{projects}->{'PLs'} })
+   {
+       if ($proj->{name} eq $pl_proj_name)
+       {
+           $pl_proj = $proj;
+           last;
+       }
+   }
+   die "could not find PL $pl_proj_name for transform module $n"
+       if (!defined($pl_proj));
+
+   my $p = $solution->AddProject($n, 'dll', 'contrib', $n_src);
+   for my $file (glob("$n_src/*.c"))
+   {
+       $p->AddFile($file);
+   }
+   $p->AddReference($postgres);
+
+   # Add PL dependencies
+   $p->AddIncludeDir($pl_src);
+   $p->AddReference($pl_proj);
+   $p->AddIncludeDir($pl_proj->{includes});
+   foreach my $pl_lib (@{$pl_proj->{libraries}})
+   {
+       $p->AddLibrary($pl_lib);
+   }
+
+   # Add base module dependencies
+   $p->AddIncludeDir($transform_src);
+   $p->AddIncludeDir($transform_proj->{includes});
+   foreach my $trans_lib (@{$transform_proj->{libraries}})
+   {
+       $p->AddLibrary($trans_lib);
+   }
+   $p->AddReference($transform_proj);
+
+   return $p;
+}
+
 # Add a simple contrib project
 sub AddContrib
 {
index 0153f054f5205b3276491d16bf120355e2dcb6b5..8c071a5edde6740b92d004ba964c97170449f230 100644 (file)
@@ -262,9 +262,12 @@ sub contribcheck
    foreach my $module (glob("*"))
    {
        # these configuration-based exclusions must match Install.pm
-       next if ($module eq "uuid-ossp" && !defined($config->{uuid}));
-       next if ($module eq "sslinfo"   && !defined($config->{openssl}));
-       next if ($module eq "xml2"      && !defined($config->{xml}));
+       next if ($module eq "uuid-ossp"       && !defined($config->{uuid}));
+       next if ($module eq "sslinfo"         && !defined($config->{openssl}));
+       next if ($module eq "xml2"            && !defined($config->{xml}));
+       next if ($module eq "hstore_plperl"   && !defined($config->{perl}));
+       next if ($module eq "hstore_plpython");
+       next if ($module eq "ltree_plpython");
        next if ($module eq "sepgsql");
 
        subdircheck("$topdir/contrib", $module);
@@ -375,7 +378,6 @@ sub fetchRegressOpts
    $m =~ s{\\\r?\n}{}g;
    if ($m =~ /^\s*REGRESS_OPTS\s*=(.*)/m)
    {
-
        # Substitute known Makefile variables, then ignore options that retain
        # an unhandled variable reference.  Ignore anything that isn't an
        # option starting with "--".