]> granicus.if.org Git - postgresql/blobdiff - src/tools/msvc/Mkvcbuild.pm
Unbreak MSVC builds for pg_archivecleanup by linking with libpgport
[postgresql] / src / tools / msvc / Mkvcbuild.pm
index b422fb08d62ab0a921b8972a7571abf9fdd98cb2..9ba8bd48c204c41757a9afd321fea470d9990f89 100644 (file)
@@ -3,7 +3,7 @@ package Mkvcbuild;
 #
 # Package that generates build files for msvc build
 #
-# $PostgreSQL: pgsql/src/tools/msvc/Mkvcbuild.pm,v 1.50 2010/01/20 04:29:07 adunstan Exp $
+# $PostgreSQL: pgsql/src/tools/msvc/Mkvcbuild.pm,v 1.58 2010/06/15 12:48:36 adunstan Exp $
 #
 use Carp;
 use Win32;
@@ -25,8 +25,10 @@ my $postgres;
 my $libpq;
 
 my $contrib_defines = {'refint' => 'REFINT_VERBOSE'};
-my @contrib_uselibpq = ('dblink', 'oid2name', 'pgbench', 'vacuumlo');
-my @contrib_uselibpgport = ('oid2name', 'pgbench', 'pg_standby', 'vacuumlo');
+my @contrib_uselibpq = ('dblink', 'oid2name', 'pgbench', 'pg_upgrade', 
+                                               'vacuumlo');
+my @contrib_uselibpgport = ('oid2name', 'pgbench', 'pg_standby', 
+                                                       'pg_archivecleanup', 'pg_upgrade', 'vacuumlo');
 my $contrib_extralibs = {'pgbench' => ['wsock32.lib']};
 my $contrib_extraincludes = {'tsearch2' => ['contrib/tsearch2'], 'dblink' => ['src/backend']};
 my $contrib_extrasource = {
@@ -75,9 +77,12 @@ sub mkvcbuild
     $postgres->FullExportDLL('postgres.lib');
 
     my $snowball = $solution->AddProject('dict_snowball','dll','','src\backend\snowball');
-    $snowball->RelocateFiles('src\backend\snowball\libstemmer', sub {
-        return shift !~ /dict_snowball.c$/;
-    });
+    $snowball->RelocateFiles(
+        'src\backend\snowball\libstemmer',
+        sub {
+            return shift !~ /dict_snowball.c$/;
+        }
+    );
     $snowball->AddIncludeDir('src\include\snowball');
     $snowball->AddReference($postgres);
 
@@ -87,34 +92,33 @@ sub mkvcbuild
 
     if ($solution->{options}->{perl})
     {
-               my $plperlsrc = "src\\pl\\plperl\\";
+        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"))
-                       {
-                               print "Building $plperlsrc$xsc...\n";
-                               system( $solution->{options}->{perl}
-                                               . '/bin/perl '
-                                               . $solution->{options}->{perl}
-                                               . '/lib/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";
-                               }
-                       }
-               }
+        foreach my $xs ('SPI.xs', 'Util.xs')
+        {
+            (my $xsc = $xs) =~ s/\.xs/.c/;
+            if (Solution::IsNewer("$plperlsrc$xsc","$plperlsrc$xs"))
+            {
+                print "Building $plperlsrc$xsc...\n";
+                system( $solution->{options}->{perl}
+                      . '/bin/perl '
+                      . $solution->{options}->{perl}
+                      . '/lib/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_safe_bad.pl')
-            ||Solution::IsNewer('src\pl\plperl\perlchunks.h','src\pl\plperl\plc_safe_ok.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;
@@ -123,7 +127,7 @@ sub mkvcbuild
                   . '/bin/perl '
                   . 'text2macro.pl '
                   . '--strip="^(\#.*|\s*)$$" '
-                  . 'plc_perlboot.pl plc_safe_bad.pl plc_safe_ok.pl '
+                  . 'plc_perlboot.pl plc_trusted.pl '
                   .    '>perlchunks.h');
             chdir $basedir;
             if ((!(-f 'src\pl\plperl\perlchunks.h')) || -z 'src\pl\plperl\perlchunks.h')
@@ -132,26 +136,56 @@ sub mkvcbuild
                 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');
+        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";
-               }
+        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 actually works, but gives no data...
+        die "Failed to query python for version information\n"
+          if (!(defined($pyprefix) && defined($pyver)));
+
         my $plpython = $solution->AddProject('plpython','dll','PLs','src\pl\plpython');
-        $plpython->AddIncludeDir($solution->{options}->{python} . '\include');
-        $solution->{options}->{python} =~ /\\Python(\d{2})/i
-          || croak "Could not determine python version from path";
-        $plpython->AddLibrary($solution->{options}->{python} . "\\Libs\\python$1.lib");
+        $plpython->AddIncludeDir($pyprefix . '\include');
+        $plpython->AddLibrary($pyprefix . "\\Libs\\python$pyver.lib");
         $plpython->AddReference($postgres);
     }
 
@@ -172,7 +206,7 @@ sub mkvcbuild
 
     $libpq = $solution->AddProject('libpq','dll','interfaces','src\interfaces\libpq');
     $libpq->AddDefine('FRONTEND');
-       $libpq->AddDefine('UNSAFE_STAT_OK');
+    $libpq->AddDefine('UNSAFE_STAT_OK');
     $libpq->AddIncludeDir('src\port');
     $libpq->AddLibrary('wsock32.lib');
     $libpq->AddLibrary('secur32.lib');
@@ -182,9 +216,10 @@ sub mkvcbuild
     $libpq->ReplaceFile('src\interfaces\libpq\libpqrc.c','src\interfaces\libpq\libpq.rc');
     $libpq->AddReference($libpgport);
 
-    my $walreceiver = $solution->AddProject('walreceiver', 'dll', '', 'src\backend\replication\walreceiver');
-    $walreceiver->AddIncludeDir('src\interfaces\libpq');
-    $walreceiver->AddReference($postgres,$libpq);
+    my $libpqwalreceiver = $solution->AddProject('libpqwalreceiver', 'dll', '',
+        'src\backend\replication\libpqwalreceiver');
+    $libpqwalreceiver->AddIncludeDir('src\interfaces\libpq');
+    $libpqwalreceiver->AddReference($postgres,$libpq);
 
     my $pgtypes =
       $solution->AddProject('libpgtypes','dll','interfaces','src\interfaces\ecpg\pgtypeslib');
@@ -307,12 +342,12 @@ sub mkvcbuild
 
     if ($solution->{options}->{uuid})
     {
-       $contrib_extraincludes->{'uuid-ossp'} = [ $solution->{options}->{uuid} . '\include' ];
-       $contrib_extralibs->{'uuid-ossp'} = [ $solution->{options}->{uuid} . '\lib\uuid.lib' ];
+        $contrib_extraincludes->{'uuid-ossp'} = [ $solution->{options}->{uuid} . '\include' ];
+        $contrib_extralibs->{'uuid-ossp'} = [ $solution->{options}->{uuid} . '\lib\uuid.lib' ];
     }
-        else
+    else
     {
-       push @contrib_excludes,'uuid-ossp';
+        push @contrib_excludes,'uuid-ossp';
     }
 
     # Pgcrypto makefile too complex to parse....
@@ -455,10 +490,10 @@ sub AddContrib
         $mf =~ s{\\\s*[\r\n]+}{}mg;
         my $proj = $solution->AddProject($dn, 'dll', 'contrib');
         $mf =~ /^OBJS\s*=\s*(.*)$/gm || croak "Could not find objects in MODULE_big for $n\n";
-               my $objs = $1;
+        my $objs = $1;
         while ($objs =~ /\b([\w-]+\.o)\b/g)
         {
-                       my $o = $1;
+            my $o = $1;
             $o =~ s/\.o$/.c/;
             $proj->AddFile('contrib\\' . $n . '\\' . $o);
         }
@@ -472,9 +507,9 @@ sub AddContrib
                 $mf2 =~ /^SUBOBJS\s*=\s*(.*)$/gm
                   || croak "Could not find objects in MODULE_big for $n, subdir $d\n";
                 $objs = $1;
-                               while ($objs =~ /\b([\w-]+\.o)\b/g)
-                               {
-                                       my $o = $1;
+                while ($objs =~ /\b([\w-]+\.o)\b/g)
+                {
+                    my $o = $1;
                     $o =~ s/\.o$/.c/;
                     $proj->AddFile('contrib\\' . $n . '\\' . $d . '\\' . $o);
                 }
@@ -495,11 +530,12 @@ sub AddContrib
     elsif ($mf =~ /^PROGRAM\s*=\s*(.*)$/mg)
     {
         my $proj = $solution->AddProject($1, 'exe', 'contrib');
-        $mf =~ /^OBJS\s*=\s*(.*)$/gm || croak "Could not find objects in MODULE_big for $n\n";
+        $mf =~ s{\\\s*[\r\n]+}{}mg;
+        $mf =~ /^OBJS\s*=\s*(.*)$/gm || croak "Could not find objects in PROGRAM for $n\n";
         my $objs = $1;
         while ($objs =~ /\b([\w-]+\.o)\b/g)
         {
-                       my $o = $1;
+            my $o = $1;
             $o =~ s/\.o$/.c/;
             $proj->AddFile('contrib\\' . $n . '\\' . $o);
         }