--- /dev/null
+#!/usr/bin/perl
+#-------------------------------------------------------------------------
+#
+# Genbki.pm --
+# perl script which generates .bki files from specially formatted .h
+# files. These .bki files are used to initialize the postgres template
+# database.
+#
+# Portions Copyright (c) 1996-2007, PostgreSQL Global Development Group
+# Portions Copyright (c) 1994, Regents of the University of California
+#
+#
+# IDENTIFICATION
+# $PostgreSQL: pgsql/src/tools/msvc/Genbki.pm,v 1.1 2007/03/17 13:50:42 mha Exp $
+#
+#-------------------------------------------------------------------------
+
+package Genbki;
+
+use strict;
+use warnings;
+
+use Exporter;
+our (@ISA, @EXPORT_OK);
+@ISA = qw(Exporter);
+@EXPORT_OK = qw(genbki);
+
+sub genbki
+{
+ my $version = shift;
+ my $prefix = shift;
+
+ $version =~ /^(\d+\.\d+)/ || die "Bad format verison $version\n";
+ my $majorversion = $1;
+
+ my $pgext = read_file("src/include/pg_config_manual.h");
+ $pgext =~ /^#define\s+NAMEDATALEN\s+(\d+)$/mg
+ || die "Could not read NAMEDATALEN from pg_config_manual.h\n";
+ my $namedatalen = $1;
+
+ my $pgauthid = read_file("src/include/catalog/pg_authid.h");
+ $pgauthid =~ /^#define\s+BOOTSTRAP_SUPERUSERID\s+(\d+)$/mg
+ || die "Could not read BOOTSTRAUP_SUPERUSERID from pg_authid.h\n";
+ my $bootstrapsuperuserid = $1;
+
+ my $pgnamespace = read_file("src/include/catalog/pg_namespace.h");
+ $pgnamespace =~ /^#define\s+PG_CATALOG_NAMESPACE\s+(\d+)$/mg
+ || die "Could not read PG_CATALOG_NAMESPACE from pg_namespace.h\n";
+ my $pgcatalognamespace = $1;
+
+ my $indata = "";
+
+ while (@_)
+ {
+ my $f = shift;
+ next unless $f;
+ $indata .= read_file($f);
+ $indata .= "\n";
+ }
+
+ # Strip C comments, from perl FAQ 4.27
+ $indata =~ s{/\*.*?\*/}{}gs;
+
+ $indata =~ s{;\s*$}{}gm;
+ $indata =~ s{^\s+}{}gm;
+ $indata =~ s{^Oid}{oid}gm;
+ $indata =~ s{\(Oid}{(oid}gm;
+ $indata =~ s{^NameData}{name}gm;
+ $indata =~ s{\(NameData}{(name}g;
+ $indata =~ s{^TransactionId}{xid}gm;
+ $indata =~ s{\(TransactionId}{(xid}g;
+ $indata =~ s{PGUID}{$bootstrapsuperuserid}g;
+ $indata =~ s{NAMEDATALEN}{$namedatalen}g;
+ $indata =~ s{PGNSP}{$pgcatalognamespace}g;
+
+ #print $indata;
+
+ my $bki = "";
+ my $desc = "";
+ my $shdesc = "";
+
+ my $oid = 0;
+ my $catalog = 0;
+ my $reln_open = 0;
+ my $bootstrap = "";
+ my $shared_relation = "";
+ my $without_oids = "";
+ my $nc = 0;
+ my $inside = 0;
+ my @attr;
+ my @types;
+
+ foreach my $line (split /\n/, $indata)
+ {
+ if ($line =~ /^DATA\((.*)\)$/m)
+ {
+ my $data = $1;
+ my @fields = split /\s+/,$data;
+ if ($#fields >=4 && $fields[0] eq "insert" && $fields[1] eq "OID" && $fields[2] eq "=")
+ {
+ $oid = $fields[3];
+ }
+ else
+ {
+ $oid = 0;
+ }
+ $data =~ s/\s{2,}/ /g;
+ $bki .= $data . "\n";
+ }
+ elsif ($line =~ /^DESCR\("(.*)"\)$/m)
+ {
+ if ($oid != 0)
+ {
+ $desc .= sprintf("%d\t%s\t0\t%s\n", $oid, $catalog, $1);
+ }
+ }
+ elsif ($line =~ /^SHDESCR\("(.*)"\)$/m)
+ {
+ if ($oid != 0)
+ {
+ $shdesc .= sprintf("%d\t%s\t%s\n", $oid, $catalog, $1);
+ }
+ }
+ elsif ($line =~ /^DECLARE_(UNIQUE_)?INDEX\((.*)\)$/m)
+ {
+ if ($reln_open)
+ {
+ $bki .= "close $catalog\n";
+ $reln_open = 0;
+ }
+ my $u = $1?" unique":"";
+ my @fields = split /,/,$2,3;
+ $fields[2] =~ s/\s{2,}/ /g;
+ $bki .= "declare$u index $fields[0] $fields[1] $fields[2]\n";
+ }
+ elsif ($line =~ /^DECLARE_TOAST\((.*)\)$/m)
+ {
+ if ($reln_open)
+ {
+ $bki .= "close $catalog\n";
+ $reln_open = 0;
+ }
+ my @fields = split /,/,$1;
+ $bki .= "declare toast $fields[1] $fields[2] on $fields[0]\n";
+ }
+ elsif ($line =~ /^BUILD_INDICES/)
+ {
+ $bki .= "build indices\n";
+ }
+ elsif ($line =~ /^CATALOG\((.*)\)(.*)$/m)
+ {
+ if ($reln_open)
+ {
+ $bki .= "close $catalog\n";
+ $reln_open = 0;
+ }
+ my $rest = $2;
+ my @fields = split /,/,$1;
+ $catalog = $fields[0];
+ $oid = $fields[1];
+ $bootstrap=$shared_relation=$without_oids="";
+ if ($rest =~ /BKI_BOOTSTRAP/)
+ {
+ $bootstrap = "bootstrap ";
+ }
+ if ($rest =~ /BKI_SHARED_RELATION/)
+ {
+ $shared_relation = "shared_relation ";
+ }
+ if ($rest =~ /BKI_WITHOUT_OIDS/)
+ {
+ $without_oids = "without_oids ";
+ }
+ $nc++;
+ $inside = 1;
+ next;
+ }
+ if ($inside==1)
+ {
+ next if ($line =~ /{/);
+ if ($line =~ /}/)
+ {
+
+ # Last line
+ $bki .= "create $bootstrap$shared_relation$without_oids$catalog $oid\n (\n";
+ my $first = 1;
+ for (my $i = 0; $i <= $#attr; $i++)
+ {
+ if ($first == 1)
+ {
+ $first = 0;
+ }
+ else
+ {
+ $bki .= ",\n";
+ }
+ $bki .= " " . $attr[$i] . " = " . $types[$i];
+ }
+ $bki .= "\n )\n";
+ undef(@attr);
+ undef(@types);
+ $reln_open = 1;
+ $inside = 0;
+ if ($bootstrap eq "")
+ {
+ $bki .= "open $catalog\n";
+ }
+ next;
+ }
+
+ # inside catalog definition, so keep sucking up attributes
+ my @fields = split /\s+/,$line;
+ if ($fields[1] =~ /(.*)\[.*\]/)
+ { #Array attribute
+ push @attr, $1;
+ push @types, $fields[0] . '[]';
+ }
+ else
+ {
+ push @attr, $fields[1];
+ push @types, $fields[0];
+ }
+ next;
+ }
+ }
+ if ($reln_open == 1)
+ {
+ $bki .= "close $catalog\n";
+ }
+
+ open(O,">$prefix.bki") || die "Could not write $prefix.bki\n";
+ print O "# PostgreSQL $majorversion\n";
+ print O $bki;
+ close(O);
+ open(O,">$prefix.description") || die "Could not write $prefix.description\n";
+ print O $desc;
+ close(O);
+ open(O,">$prefix.shdescription") || die "Could not write $prefix.shdescription\n";
+ print O $shdesc;
+ close(O);
+}
+
+sub Usage
+{
+ print "Usage: genbki.pl <version> <prefix> <input1> [<input2> <input3>...]\n";
+ exit(1);
+}
+
+sub read_file
+{
+ my $filename = shift;
+ my $F;
+ my $t = $/;
+
+ undef $/;
+ open($F, $filename) || die "Could not open file $filename\n";
+ my $txt = <$F>;
+ close($F);
+ $/ = $t;
+
+ return $txt;
+}
+
+1;
--- /dev/null
+package Install;
+
+use strict;
+use warnings;
+use Carp;
+use File::Basename;
+use File::Copy;
+
+use Exporter;
+our (@ISA,@EXPORT_OK);
+@ISA = qw(Exporter);
+@EXPORT_OK = qw(Install);
+
+sub Install
+{
+ $| = 1;
+
+ my $target = shift;
+
+ chdir("../../..") if (-f "../../../configure");
+ my $conf = "";
+ if (-d "debug")
+ {
+ $conf = "debug";
+ }
+ if (-d "release")
+ {
+ $conf = "release";
+ }
+ die "Could not find debug or release binaries" if ($conf eq "");
+ print "Installing for $conf\n";
+
+ EnsureDirectories($target, 'bin','lib','share','share/timezonesets');
+
+ CopySolutionOutput($conf, $target);
+ copy($target . '/lib/libpq.dll', $target . '/bin/libpq.dll');
+ CopySetOfFiles('config files', "*.sample", $target . '/share/');
+ CopySetOfFiles('timezone names', 'src\timezone\tznames\*.txt',$target . '/share/timezonesets/');
+ CopyFiles(
+ 'timezone sets',
+ $target . '/share/timezonesets/',
+ 'src/timezone/tznames/', 'Default','Australia','India'
+ );
+ CopySetOfFiles('BKI files', "src\\backend\\catalog\\postgres.*", $target .'/share/');
+ CopySetOfFiles('SQL files', "src\\backend\\catalog\\*.sql", $target . '/share/');
+ CopyFiles(
+ 'Information schema data',
+ $target . '/share/',
+ 'src/backend/catalog/', 'sql_features.txt'
+ );
+ GenerateConversionScript($target);
+ GenerateTimezoneFiles($target,$conf);
+}
+
+sub EnsureDirectories
+{
+ my $target = shift;
+ mkdir $target unless -d ($target);
+ while (my $d = shift)
+ {
+ mkdir $target . '/' . $d unless -d ($target . '/' . $d);
+ }
+}
+
+sub CopyFiles
+{
+ my $what = shift;
+ my $target = shift;
+ my $basedir = shift;
+
+ print "Copying $what";
+ while (my $f = shift)
+ {
+ print ".";
+ $f = $basedir . $f;
+ die "No file $f\n" if (!-f $f);
+ copy($f, $target . basename($f))
+ || croak "Could not copy $f to $target". basename($f). " to $target". basename($f) . "\n";
+ }
+ print "\n";
+}
+
+sub CopySetOfFiles
+{
+ my $what = shift;
+ my $spec = shift;
+ my $target = shift;
+ my $D;
+
+ print "Copying $what";
+ open($D, "dir /b /s $spec |") || croak "Could not list $spec\n";
+ while (<$D>)
+ {
+ chomp;
+ next if /regress/; # Skip temporary install in regression subdir
+ my $tgt = $target . basename($_);
+ print ".";
+ copy($_, $tgt) || croak "Could not copy $_: $!\n";
+ }
+ close($D);
+ print "\n";
+}
+
+sub CopySolutionOutput
+{
+ my $conf = shift;
+ my $target = shift;
+ my $rem = qr{Project\("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}"\) = "([^"]+)"};
+
+ my $sln = read_file("pgsql.sln") || croak "Could not open pgsql.sln\n";
+ print "Copying build output files...";
+ while ($sln =~ $rem)
+ {
+ my $pf = $1;
+ my $dir;
+ my $ext;
+
+ $sln =~ s/$rem//;
+
+ my $proj = read_file("$pf.vcproj") || croak "Could not open $pf.vcproj\n";
+ if ($proj !~ qr{ConfigurationType="([^"]+)"})
+ {
+ croak "Could not parse $pf.vcproj\n";
+ }
+ if ($1 == 1)
+ {
+ $dir = "bin";
+ $ext = "exe";
+ }
+ elsif ($1 == 2)
+ {
+ $dir = "lib";
+ $ext = "dll";
+ }
+ else
+ {
+
+ # Static lib, such as libpgport, only used internally during build, don't install
+ next;
+ }
+ copy("$conf\\$pf\\$pf.$ext","$target\\$dir\\$pf.$ext") || croak "Could not copy $pf.$ext\n";
+ print ".";
+ }
+ print "\n";
+}
+
+sub GenerateConversionScript
+{
+ my $target = shift;
+ my $sql = "";
+ my $F;
+
+ print "Generating conversion proc script...";
+ my $mf = read_file('src/backend/utils/mb/conversion_procs/Makefile');
+ $mf =~ s{\\\s*[\r\n]+}{}mg;
+ $mf =~ /^CONVERSIONS\s*=\s*(.*)$/m
+ || die "Could not find CONVERSIONS line in conversions Makefile\n";
+ my @pieces = split /\s+/,$1;
+ while ($#pieces > 0)
+ {
+ my $name = shift @pieces;
+ my $se = shift @pieces;
+ my $de = shift @pieces;
+ my $func = shift @pieces;
+ my $obj = shift @pieces;
+ $sql .= "-- $se --> $de\n";
+ $sql .=
+"CREATE OR REPLACE FUNCTION $func (INTEGER, INTEGER, CSTRING, INTERNAL, INTEGER) RETURNS VOID AS '\$libdir/$obj', '$func' LANGUAGE C STRICT;\n";
+ $sql .= "DROP CONVERSION pg_catalog.$name;\n";
+ $sql .= "CREATE DEFAULT CONVERSION pg_catalog.$name FOR '$se' TO '$de' FROM $func;\n";
+ }
+ open($F,">$target/share/conversion_create.sql")
+ || die "Could not write to conversion_create.sql\n";
+ print $F $sql;
+ close($F);
+ print "\n";
+}
+
+sub GenerateTimezoneFiles
+{
+ my $target = shift;
+ my $conf = shift;
+ my $mf = read_file("src/timezone/Makefile");
+ $mf =~ s{\\\s*[\r\n]+}{}mg;
+ $mf =~ /^TZDATA\s*:?=\s*(.*)$/m || die "Could not find TZDATA row in timezone makefile\n";
+ my @tzfiles = split /\s+/,$1;
+ unshift @tzfiles,'';
+ print "Generating timezone files...";
+ system("$conf\\zic\\zic -d $target/share/timezone " . join(" src/timezone/data/", @tzfiles));
+ print "\n";
+}
+
+sub read_file
+{
+ my $filename = shift;
+ my $F;
+ my $t = $/;
+
+ undef $/;
+ open($F, $filename) || die "Could not open file $filename\n";
+ my $txt = <$F>;
+ close($F);
+ $/ = $t;
+
+ return $txt;
+}
+
+1;
--- /dev/null
+package Mkvcbuild;
+
+use Carp;
+use Win32;
+use strict;
+use warnings;
+use Project;
+use Solution;
+
+use Exporter;
+our (@ISA, @EXPORT_OK);
+@ISA = qw(Exporter);
+@EXPORT_OK = qw(Mkvcbuild);
+
+my $solution;
+my $libpgport;
+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_extralibs = {'pgbench' => ['wsock32.lib']};
+my $contrib_extraincludes = {'tsearch2' => ['contrib/tsearch2']};
+my $contrib_extrasource = {
+ 'cube' => ['cubescan.l','cubeparse.y'],
+ 'seg' => ['segscan.l','segparse.y']
+};
+my @contrib_excludes = ('pgcrypto');
+
+sub mkvcbuild
+{
+ our $config = shift;
+
+ chdir('..\..\..') if (-d '..\msvc' && -d '..\..\..\src');
+ die 'Must run from root or msvc directory' unless (-d 'src\tools\msvc' && -d 'src');
+
+ $solution = new Solution($config);
+
+ our @pgportfiles = qw(
+ crypt.c fseeko.c getrusage.c inet_aton.c random.c srandom.c
+ unsetenv.c getaddrinfo.c gettimeofday.c kill.c open.c rand.c
+ snprintf.c strlcat.c strlcpy.c copydir.c dirmod.c exec.c noblock.c path.c pipe.c
+ pgsleep.c pgstrcasecmp.c qsort.c qsort_arg.c sprompt.c thread.c
+ getopt.c getopt_long.c dirent.c rint.c win32error.c);
+
+ $libpgport = $solution->AddProject('libpgport','lib','misc');
+ $libpgport->AddDefine('FRONTEND');
+ $libpgport->AddFiles('src\port',@pgportfiles);
+
+ $postgres = $solution->AddProject('postgres','exe','','src\backend');
+ $postgres->AddIncludeDir('src\backend');
+ $postgres->AddDir('src\backend\port\win32');
+ $postgres->AddFile('src\backend\utils\fmgrtab.c');
+ $postgres->ReplaceFile('src\backend\port\dynloader.c','src\backend\port\dynloader\win32.c');
+ $postgres->ReplaceFile('src\backend\port\pg_sema.c','src\backend\port\win32_sema.c');
+ $postgres->ReplaceFile('src\backend\port\pg_shmem.c','src\backend\port\sysv_shmem.c');
+ $postgres->AddFiles('src\port',@pgportfiles);
+ $postgres->AddDir('src\timezone');
+ $postgres->AddFiles('src\backend\parser','scan.l','gram.y');
+ $postgres->AddFiles('src\backend\bootstrap','bootscanner.l','bootparse.y');
+ $postgres->AddFiles('src\backend\utils\misc','guc-file.l');
+ $postgres->AddDefine('BUILDING_DLL');
+ $postgres->AddLibrary('wsock32.lib ws2_32.lib');
+ $postgres->AddLibrary('wldap32.lib') if ($solution->{options}->{ldap});
+ $postgres->FullExportDLL('postgres.lib');
+
+ my $plpgsql = $solution->AddProject('plpgsql','dll','PLs','src\pl\plpgsql\src');
+ $plpgsql->AddFiles('src\pl\plpgsql\src','scan.l','gram.y');
+ $plpgsql->AddReference($postgres);
+
+ if ($solution->{options}->{perl})
+ {
+ my $plperl = $solution->AddProject('plperl','dll','PLs','src\pl\plperl');
+ $plperl->AddIncludeDir($solution->{options}->{perl} . '/lib/CORE');
+ $plperl->AddDefine('PLPERL_HAVE_UID_GID');
+ if (Solution::IsNewer('src\pl\plperl\SPI.c','src\pl\plperl\SPI.xs'))
+ {
+ print 'Building src\pl\plperl\SPI.c...' . "\n";
+ system( $solution->{options}->{perl}
+ . '/bin/perl '
+ . $solution->{options}->{perl}
+ . '/lib/ExtUtils/xsubpp -typemap '
+ . $solution->{options}->{perl}
+ . '/lib/ExtUtils/typemap src\pl\plperl\SPI.xs >src\pl\plperl\SPI.c');
+ if ((!(-f 'src\pl\plperl\SPI.c')) || -z 'src\pl\plperl\SPI.c')
+ {
+ unlink('src\pl\plperl\SPI.c'); # if zero size
+ die 'Failed to create SPI.c' . "\n";
+ }
+ }
+ $plperl->AddReference($postgres);
+ $plperl->AddLibrary($solution->{options}->{perl} . '\lib\CORE\perl58.lib');
+ }
+
+ if ($solution->{options}->{python})
+ {
+ 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->AddReference($postgres);
+ }
+
+ if ($solution->{options}->{tcl})
+ {
+ my $pltcl = $solution->AddProject('pltcl','dll','PLs','src\pl\tcl');
+ $pltcl->AddIncludeDir($solution->{options}->{tcl} . '\include');
+ $pltcl->AddReference($postgres);
+ $pltcl->AddLibrary($solution->{options}->{tcl} . '\lib\tcl84.lib');
+ }
+
+ $libpq = $solution->AddProject('libpq','dll','interfaces','src\interfaces\libpq');
+ $libpq->AddDefine('FRONTEND');
+ $libpq->AddIncludeDir('src\port');
+ $libpq->AddLibrary('wsock32.lib');
+ $libpq->AddLibrary('wldap32.lib') if ($solution->{options}->{ldap});
+ $libpq->UseDef('src\interfaces\libpq\libpqdll.def');
+ $libpq->ReplaceFile('src\interfaces\libpq\libpqrc.c','src\interfaces\libpq\libpq.rc');
+ $libpq->AddReference($libpgport);
+
+ my $pgtypes =
+ $solution->AddProject('libpgtypes','dll','interfaces','src\interfaces\ecpg\pgtypeslib');
+ $pgtypes->AddDefine('FRONTEND');
+ $pgtypes->AddReference($postgres,$libpgport);
+ $pgtypes->AddIncludeDir('src\interfaces\ecpg\include');
+
+ if ($config->{pthread})
+ {
+ my $libecpg =
+ $solution->AddProject('libecpg','dll','interfaces','src\interfaces\ecpg\ecpglib');
+ $libecpg->AddDefine('FRONTEND');
+ $libecpg->AddIncludeDir('src\interfaces\ecpg\include');
+ $libecpg->AddIncludeDir('src\interfaces\libpq');
+ $libecpg->AddIncludeDir('src\port');
+ $libecpg->AddLibrary('wsock32.lib');
+ $libecpg->AddLibrary($config->{'pthread'} . '\pthreadVC2.lib');
+ $libecpg->AddReference($libpq,$pgtypes);
+
+ my $libecpgcompat =
+ $solution->AddProject('libecpg_compat','dll','interfaces',
+ 'src\interfaces\ecpg\compatlib');
+ $libecpgcompat->AddIncludeDir('src\interfaces\ecpg\include');
+ $libecpgcompat->AddIncludeDir('src\interfaces\libpq');
+ $libecpgcompat->AddReference($pgtypes,$libecpg);
+
+ my $ecpg = $solution->AddProject('ecpg','exe','interfaces','src\interfaces\ecpg\preproc');
+ $ecpg->AddIncludeDir('src\interfaces\ecpg\include');
+ $ecpg->AddIncludeDir('src\interfaces\libpq');
+ $ecpg->AddFiles('src\interfaces\ecpg\preproc','pgc.l','preproc.y');
+ $ecpg->AddDefine('MAJOR_VERSION=4');
+ $ecpg->AddDefine('MINOR_VERSION=2');
+ $ecpg->AddDefine('PATCHLEVEL=1');
+ $ecpg->AddReference($libpgport);
+ }
+ else
+ {
+ print "Not building ecpg due to lack of pthreads.\n";
+ }
+
+ # src/bin
+ my $initdb = AddSimpleFrontend('initdb', 1);
+
+ my $pgconfig = AddSimpleFrontend('pg_config');
+
+ my $pgcontrol = AddSimpleFrontend('pg_controldata');
+
+ my $pgctl = AddSimpleFrontend('pg_ctl', 1);
+
+ my $pgreset = AddSimpleFrontend('pg_resetxlog');
+
+ my $pgevent = $solution->AddProject('pgevent','dll','bin');
+ $pgevent->AddFiles('src\bin\pgevent','pgevent.c','pgmsgevent.rc');
+ $pgevent->AddResourceFile('src\bin\pgevent','Eventlog message formatter');
+ $pgevent->RemoveFile('src\bin\pgevent\win32ver.rc');
+ $pgevent->UseDef('src\bin\pgevent\pgevent.def');
+ $pgevent->DisableLinkerWarnings('4104');
+
+ my $psql = AddSimpleFrontend('psql', 1);
+ $psql->AddIncludeDir('src\bin\pg_dump');
+ $psql->AddFile('src\bin\psql\psqlscan.l');
+
+ my $pgdump = AddSimpleFrontend('pg_dump', 1);
+ $pgdump->AddFile('src\bin\pg_dump\pg_dump.c');
+ $pgdump->AddFile('src\bin\pg_dump\common.c');
+ $pgdump->AddFile('src\bin\pg_dump\pg_dump_sort.c');
+
+ my $pgdumpall = AddSimpleFrontend('pg_dump', 1);
+ $pgdumpall->{name} = 'pg_dumpall';
+ $pgdumpall->AddFile('src\bin\pg_dump\pg_dumpall.c');
+
+ my $pgrestore = AddSimpleFrontend('pg_dump', 1);
+ $pgrestore->{name} = 'pg_restore';
+ $pgrestore->AddFile('src\bin\pg_dump\pg_restore.c');
+
+ my $zic = $solution->AddProject('zic','exe','utils');
+ $zic->AddFiles('src\timezone','zic.c','ialloc.c','scheck.c','localtime.c');
+ $zic->AddReference($libpgport);
+
+ if ($solution->{options}->{xml})
+ {
+ $contrib_extraincludes->{'xml2'} = [
+ $solution->{options}->{xml} . '\include',
+ $solution->{options}->{xslt} . '\include',
+ $solution->{options}->{iconv} . '\include'
+ ];
+
+ $contrib_extralibs->{'xml2'} = [
+ $solution->{options}->{xml} . '\lib\libxml2.lib',
+ $solution->{options}->{xslt} . '\lib\libxslt.lib'
+ ];
+ }
+ else
+ {
+ push @contrib_excludes,'xml2';
+ }
+
+ if (!$solution->{options}->{openssl})
+ {
+ push @contrib_excludes,'sslinfo';
+ }
+
+ # Pgcrypto makefile too complex to parse....
+ my $pgcrypto = $solution->AddProject('pgcrypto','dll','crypto');
+ $pgcrypto->AddFiles(
+ 'contrib\pgcrypto','pgcrypto.c','px.c','px-hmac.c',
+ 'px-crypt.c','crypt-gensalt.c','crypt-blowfish.c','crypt-des.c',
+ 'crypt-md5.c','mbuf.c','pgp.c','pgp-armor.c',
+ 'pgp-cfb.c','pgp-compress.c','pgp-decrypt.c','pgp-encrypt.c',
+ 'pgp-info.c','pgp-mpi.c','pgp-pubdec.c','pgp-pubenc.c',
+ 'pgp-pubkey.c','pgp-s2k.c','pgp-pgsql.c'
+ );
+ if ($solution->{options}->{openssl})
+ {
+ $pgcrypto->AddFiles('contrib\pgcrypto', 'openssl.c','pgp-mpi-openssl.c');
+ }
+ else
+ {
+ $pgcrypto->AddFiles(
+ 'contrib\pgcrypto', 'md5.c','sha1.c','sha2.c',
+ 'internal.c','internal-sha2.c','blf.c','rijndael.c',
+ 'fortuna.c','random.c','pgp-mpi-internal.c','imath.c'
+ );
+ }
+ $pgcrypto->AddReference($postgres);
+ $pgcrypto->AddLibrary('wsock32.lib');
+
+ my $D;
+ opendir($D, 'contrib') || croak "Could not opendir on contrib!\n";
+ while (my $d = readdir($D))
+ {
+ next if ($d =~ /^\./);
+ next unless (-f "contrib/$d/Makefile");
+ next if (grep {/^$d$/} @contrib_excludes);
+ AddContrib($d);
+ }
+ closedir($D);
+
+ my $mf = Project::read_file('src\backend\utils\mb\conversion_procs\Makefile');
+ $mf =~ s{\\s*[\r\n]+}{}mg;
+ $mf =~ m{DIRS\s*=\s*(.*)$}m || die 'Could not match in conversion makefile' . "\n";
+ foreach my $sub (split /\s+/,$1)
+ {
+ my $mf = Project::read_file('src\backend\utils\mb\conversion_procs\\' . $sub . '\Makefile');
+ my $p = $solution->AddProject($sub, 'dll', 'conversion procs');
+ $p->AddFile('src\backend\utils\mb\conversion_procs\\' . $sub . '\\' . $sub . '.c');
+ if ($mf =~ m{^SRCS\s*\+=\s*(.*)$}m)
+ {
+ $p->AddFile('src\backend\utils\mb\conversion_procs\\' . $sub . '\\' . $1);
+ }
+ $p->AddReference($postgres);
+ }
+
+ $mf = Project::read_file('src\bin\scripts\Makefile');
+ $mf =~ s{\\s*[\r\n]+}{}mg;
+ $mf =~ m{PROGRAMS\s*=\s*(.*)$}m || die 'Could not match in bin\scripts\Makefile' . "\n";
+ foreach my $prg (split /\s+/,$1)
+ {
+ my $proj = $solution->AddProject($prg,'exe','bin');
+ $mf =~ m{$prg\s*:\s*(.*)$}m || die 'Could not find script define for $prg' . "\n";
+ my @files = split /\s+/,$1;
+ foreach my $f (@files)
+ {
+ if ($f =~ /\/keywords\.o$/)
+ {
+ $proj->AddFile('src\backend\parser\keywords.c');
+ }
+ else
+ {
+ $f =~ s/\.o$/\.c/;
+ if ($f eq 'dumputils.c')
+ {
+ $proj->AddFile('src\bin\pg_dump\dumputils.c');
+ }
+ elsif ($f =~ /print\.c$/)
+ { # Also catches mbprint.c
+ $proj->AddFile('src\bin\psql\\' . $f);
+ }
+ else
+ {
+ $proj->AddFile('src\bin\scripts\\' . $f);
+ }
+ }
+ }
+ $proj->AddIncludeDir('src\interfaces\libpq');
+ $proj->AddIncludeDir('src\bin\pg_dump');
+ $proj->AddIncludeDir('src\bin\psql');
+ $proj->AddReference($libpq,$libpgport);
+ $proj->AddResourceFile('src\bin\scripts','PostgreSQL Utility');
+ }
+
+ # Regression DLL and EXE
+ my $regress = $solution->AddProject('regress','dll','misc');
+ $regress->AddFile('src\test\regress\regress.c');
+ $regress->AddReference($postgres);
+
+ my $pgregress = $solution->AddProject('pg_regress','exe','misc');
+ $pgregress->AddFile('src\test\regress\pg_regress.c');
+ $pgregress->AddIncludeDir('src\port');
+ $pgregress->AddDefine('HOST_TUPLE="i686-pc-win32vc"');
+ $pgregress->AddDefine('FRONTEND');
+ $pgregress->AddReference($libpgport);
+
+ $solution->Save();
+}
+
+#####################
+# Utility functions #
+#####################
+
+# Add a simple frontend project (exe)
+sub AddSimpleFrontend
+{
+ my $n = shift;
+ my $uselibpq= shift;
+
+ my $p = $solution->AddProject($n,'exe','bin');
+ $p->AddDir('src\bin\\' . $n);
+ $p->AddDefine('FRONTEND');
+ $p->AddReference($libpgport);
+ if ($uselibpq)
+ {
+ $p->AddIncludeDir('src\interfaces\libpq');
+ $p->AddReference($libpq);
+ }
+ return $p;
+}
+
+# Add a simple contrib project
+sub AddContrib
+{
+ my $n = shift;
+ my $mf = Project::read_file('contrib\\' . $n . '\Makefile');
+
+ if ($mf =~ /^MODULE_big/mg)
+ {
+ $mf =~ s{\\\s*[\r\n]+}{}mg;
+ my $proj = $solution->AddProject($n, 'dll', 'contrib');
+ $mf =~ /^OBJS\s*=\s*(.*)$/gm || croak "Could not find objects in MODULE_big for $n\n";
+ foreach my $o (split /\s+/, $1)
+ {
+ $o =~ s/\.o$/.c/;
+ $proj->AddFile('contrib\\' . $n . '\\' . $o);
+ }
+ $proj->AddReference($postgres);
+ if ($mf =~ /^SUBDIRS\s*:?=\s*(.*)$/mg)
+ {
+ foreach my $d (split /\s+/, $1)
+ {
+ my $mf2 = Project::read_file('contrib\\' . $n . '\\' . $d . '\Makefile');
+ $mf2 =~ s{\\\s*[\r\n]+}{}mg;
+ $mf2 =~ /^SUBOBJS\s*=\s*(.*)$/gm
+ || croak "Could not find objects in MODULE_big for $n, subdir $d\n";
+ foreach my $o (split /\s+/, $1)
+ {
+ $o =~ s/\.o$/.c/;
+ $proj->AddFile('contrib\\' . $n . '\\' . $d . '\\' . $o);
+ }
+ }
+ }
+ AdjustContribProj($proj);
+ return $proj;
+ }
+ elsif ($mf =~ /^MODULES\s*=\s*(.*)$/mg)
+ {
+ foreach my $mod (split /\s+/, $1)
+ {
+ my $proj = $solution->AddProject($mod, 'dll', 'contrib');
+ $proj->AddFile('contrib\\' . $n . '\\' . $mod . '.c');
+ $proj->AddReference($postgres);
+ AdjustContribProj($proj);
+ }
+ return undef;
+ }
+ 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";
+ foreach my $o (split /\s+/, $1)
+ {
+ $o =~ s/\.o$/.c/;
+ $proj->AddFile('contrib\\' . $n . '\\' . $o);
+ }
+ AdjustContribProj($proj);
+ return $proj;
+ }
+ else
+ {
+ croak "Could not determine contrib module type for $n\n";
+ }
+}
+
+sub AdjustContribProj
+{
+ my $proj = shift;
+ my $n = $proj->{name};
+
+ if ($contrib_defines->{$n})
+ {
+ foreach my $d ($contrib_defines->{$n})
+ {
+ $proj->AddDefine($d);
+ }
+ }
+ if (grep {/^$n$/} @contrib_uselibpq)
+ {
+ $proj->AddIncludeDir('src\interfaces\libpq');
+ $proj->AddReference($libpq);
+ }
+ if (grep {/^$n$/} @contrib_uselibpgport)
+ {
+ $proj->AddReference($libpgport);
+ }
+ if ($contrib_extralibs->{$n})
+ {
+ foreach my $l (@{$contrib_extralibs->{$n}})
+ {
+ $proj->AddLibrary($l);
+ }
+ }
+ if ($contrib_extraincludes->{$n})
+ {
+ foreach my $i (@{$contrib_extraincludes->{$n}})
+ {
+ $proj->AddIncludeDir($i);
+ }
+ }
+ if ($contrib_extrasource->{$n})
+ {
+ $proj->AddFiles('contrib\\' . $n, @{$contrib_extrasource->{$n}});
+ }
+}
+
+1;
--------------------------
If the perl code is modified, use perltidy on it since pgindent won't
touch perl code. Use the following commandline:
-perltidy -b -bl -nsfs -naws -l=100 *.pl *.pm
+perltidy -b -bl -nsfs -naws -l=100 -ole=unix *.pl *.pm
use strict;
use warnings;
+use Genbki;
+
sub new
{
my $junk = shift;
if (IsNewer('src/backend/catalog/postgres.bki', "src/include/catalog/$bki"))
{
print "Generating postgres.bki...\n";
- system("perl src/tools/msvc/genbki.pl $self->{majorver} src/backend/catalog/postgres "
- . join(' src/include/catalog/',@allbki));
+ Genbki::genbki(
+ $self->{majorver},
+ "src/backend/catalog/postgres",
+ split(/ /,join(' src/include/catalog/',@allbki))
+ );
last;
}
}
use strict;
use warnings;
-use Carp;
-use File::Basename;
-use File::Copy;
-$| = 1;
+use Install qw(Install);
my $target = shift || Usage();
-
-chdir("../../..") if (-f "../../../configure");
-my $conf = "";
-if (-d "debug")
-{
- $conf = "debug";
-}
-if (-d "release")
-{
- $conf = "release";
-}
-die "Could not find debug or release binaries" if ($conf eq "");
-print "Installing for $conf\n";
-
-EnsureDirectories('bin','lib','share','share/timezonesets');
-
-CopySolutionOutput($conf, $target);
-copy($target . '/lib/libpq.dll', $target . '/bin/libpq.dll');
-CopySetOfFiles('config files', "*.sample", $target . '/share/');
-CopySetOfFiles('timezone names', 'src\timezone\tznames\*.txt', $target . '/share/timezonesets/');
-CopyFiles(
- 'timezone sets',
- $target . '/share/timezonesets/',
- 'src/timezone/tznames/', 'Default','Australia','India'
-);
-CopySetOfFiles('BKI files', "src\\backend\\catalog\\postgres.*", $target .'/share/');
-CopySetOfFiles('SQL files', "src\\backend\\catalog\\*.sql", $target . '/share/');
-CopyFiles(
- 'Information schema data',
- $target . '/share/',
- 'src/backend/catalog/', 'sql_features.txt'
-);
-GenerateConversionScript();
-GenerateTimezoneFiles();
+Install($target);
sub Usage
{
print "Usage: install.pl <targetdir>\n";
exit(1);
}
-
-sub EnsureDirectories
-{
- mkdir $target unless -d ($target);
- while (my $d = shift)
- {
- mkdir $target . '/' . $d unless -d ($target . '/' . $d);
- }
-}
-
-sub CopyFiles
-{
- my $what = shift;
- my $target = shift;
- my $basedir = shift;
-
- print "Copying $what";
- while (my $f = shift)
- {
- print ".";
- $f = $basedir . $f;
- die "No file $f\n" if (!-f $f);
- copy($f, $target . basename($f))
- || croak "Could not copy $f to $target"
- . basename($f)
- . " to $target"
- . basename($f) . "\n";
- }
- print "\n";
-}
-
-sub CopySetOfFiles
-{
- my $what = shift;
- my $spec = shift;
- my $target = shift;
- my $D;
-
- print "Copying $what";
- open($D, "dir /b /s $spec |") || croak "Could not list $spec\n";
- while (<$D>)
- {
- chomp;
- next if /regress/; # Skip temporary install in regression subdir
- my $tgt = $target . basename($_);
- print ".";
- copy($_, $tgt) || croak "Could not copy $_: $!\n";
- }
- close($D);
- print "\n";
-}
-
-sub CopySolutionOutput
-{
- my $conf = shift;
- my $target = shift;
- my $rem = qr{Project\("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}"\) = "([^"]+)"};
-
- my $sln = read_file("pgsql.sln") || croak "Could not open pgsql.sln\n";
- print "Copying build output files...";
- while ($sln =~ $rem)
- {
- my $pf = $1;
- my $dir;
- my $ext;
-
- $sln =~ s/$rem//;
-
- my $proj = read_file("$pf.vcproj") || croak "Could not open $pf.vcproj\n";
- if ($proj !~ qr{ConfigurationType="([^"]+)"})
- {
- croak "Could not parse $pf.vcproj\n";
- }
- if ($1 == 1)
- {
- $dir = "bin";
- $ext = "exe";
- }
- elsif ($1 == 2)
- {
- $dir = "lib";
- $ext = "dll";
- }
- else
- {
-
- # Static lib, such as libpgport, only used internally during build, don't install
- next;
- }
- copy("$conf\\$pf\\$pf.$ext","$target\\$dir\\$pf.$ext") || croak "Could not copy $pf.$ext\n";
- print ".";
- }
- print "\n";
-}
-
-sub GenerateConversionScript
-{
- my $sql = "";
- my $F;
-
- print "Generating conversion proc script...";
- my $mf = read_file('src/backend/utils/mb/conversion_procs/Makefile');
- $mf =~ s{\\\s*[\r\n]+}{}mg;
- $mf =~ /^CONVERSIONS\s*=\s*(.*)$/m
- || die "Could not find CONVERSIONS line in conversions Makefile\n";
- my @pieces = split /\s+/,$1;
- while ($#pieces > 0)
- {
- my $name = shift @pieces;
- my $se = shift @pieces;
- my $de = shift @pieces;
- my $func = shift @pieces;
- my $obj = shift @pieces;
- $sql .= "-- $se --> $de\n";
- $sql .=
-"CREATE OR REPLACE FUNCTION $func (INTEGER, INTEGER, CSTRING, INTERNAL, INTEGER) RETURNS VOID AS '\$libdir/$obj', '$func' LANGUAGE C STRICT;\n";
- $sql .= "DROP CONVERSION pg_catalog.$name;\n";
- $sql .= "CREATE DEFAULT CONVERSION pg_catalog.$name FOR '$se' TO '$de' FROM $func;\n";
- }
- open($F,">$target/share/conversion_create.sql")
- || die "Could not write to conversion_create.sql\n";
- print $F $sql;
- close($F);
- print "\n";
-}
-
-sub GenerateTimezoneFiles
-{
- my $mf = read_file("src/timezone/Makefile");
- $mf =~ s{\\\s*[\r\n]+}{}mg;
- $mf =~ /^TZDATA\s*:?=\s*(.*)$/m || die "Could not find TZDATA row in timezone makefile\n";
- my @tzfiles = split /\s+/,$1;
- unshift @tzfiles,'';
- print "Generating timezone files...";
- system("$conf\\zic\\zic -d $target/share/timezone " . join(" src/timezone/data/", @tzfiles));
- print "\n";
-}
-
-sub read_file
-{
- my $filename = shift;
- my $F;
- my $t = $/;
-
- undef $/;
- open($F, $filename) || die "Could not open file $filename\n";
- my $txt = <$F>;
- close($F);
- $/ = $t;
-
- return $txt;
-}
-
-use Carp;
-use Win32;
use strict;
use warnings;
-use Project;
-use Solution;
+
+use Mkvcbuild;
chdir('..\..\..') if (-d '..\msvc' && -d '..\..\..\src');
die 'Must run from root or msvc directory' unless (-d 'src\tools\msvc' && -d 'src');
+
die 'Could not find config.pl' unless (-f 'src/tools/msvc/config.pl');
our $config;
require 'src/tools/msvc/config.pl';
-my $solution = new Solution($config);
-
-our @pgportfiles = qw(
- crypt.c fseeko.c getrusage.c inet_aton.c random.c srandom.c
- unsetenv.c getaddrinfo.c gettimeofday.c kill.c open.c rand.c
- snprintf.c strlcat.c strlcpy.c copydir.c dirmod.c exec.c noblock.c path.c pipe.c
- pgsleep.c pgstrcasecmp.c qsort.c qsort_arg.c sprompt.c thread.c
- getopt.c getopt_long.c dirent.c rint.c win32error.c);
-
-my $libpgport = $solution->AddProject('libpgport','lib','misc');
-$libpgport->AddDefine('FRONTEND');
-$libpgport->AddFiles('src\port',@pgportfiles);
-
-my $postgres = $solution->AddProject('postgres','exe','','src\backend');
-$postgres->AddIncludeDir('src\backend');
-$postgres->AddDir('src\backend\port\win32');
-$postgres->AddFile('src\backend\utils\fmgrtab.c');
-$postgres->ReplaceFile('src\backend\port\dynloader.c','src\backend\port\dynloader\win32.c');
-$postgres->ReplaceFile('src\backend\port\pg_sema.c','src\backend\port\win32_sema.c');
-$postgres->ReplaceFile('src\backend\port\pg_shmem.c','src\backend\port\sysv_shmem.c');
-$postgres->AddFiles('src\port',@pgportfiles);
-$postgres->AddDir('src\timezone');
-$postgres->AddFiles('src\backend\parser','scan.l','gram.y');
-$postgres->AddFiles('src\backend\bootstrap','bootscanner.l','bootparse.y');
-$postgres->AddFiles('src\backend\utils\misc','guc-file.l');
-$postgres->AddDefine('BUILDING_DLL');
-$postgres->AddLibrary('wsock32.lib ws2_32.lib');
-$postgres->AddLibrary('wldap32.lib') if ($solution->{options}->{ldap});
-$postgres->FullExportDLL('postgres.lib');
-
-my $plpgsql = $solution->AddProject('plpgsql','dll','PLs','src\pl\plpgsql\src');
-$plpgsql->AddFiles('src\pl\plpgsql\src','scan.l','gram.y');
-$plpgsql->AddReference($postgres);
-
-if ($solution->{options}->{perl})
-{
- my $plperl = $solution->AddProject('plperl','dll','PLs','src\pl\plperl');
- $plperl->AddIncludeDir($solution->{options}->{perl} . '/lib/CORE');
- $plperl->AddDefine('PLPERL_HAVE_UID_GID');
- if (Solution::IsNewer('src\pl\plperl\SPI.c','src\pl\plperl\SPI.xs'))
- {
- print 'Building src\pl\plperl\SPI.c...' . "\n";
- system( $solution->{options}->{perl}
- . '/bin/perl '
- . $solution->{options}->{perl}
- . '/lib/ExtUtils/xsubpp -typemap '
- . $solution->{options}->{perl}
- . '/lib/ExtUtils/typemap src\pl\plperl\SPI.xs >src\pl\plperl\SPI.c');
- if ((!(-f 'src\pl\plperl\SPI.c')) || -z 'src\pl\plperl\SPI.c')
- {
- unlink('src\pl\plperl\SPI.c'); # if zero size
- die 'Failed to create SPI.c' . "\n";
- }
- }
- $plperl->AddReference($postgres);
- $plperl->AddLibrary($solution->{options}->{perl} . '\lib\CORE\perl58.lib');
-}
-
-if ($solution->{options}->{python})
-{
- 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->AddReference($postgres);
-}
-
-if ($solution->{options}->{tcl})
-{
- my $pltcl = $solution->AddProject('pltcl','dll','PLs','src\pl\tcl');
- $pltcl->AddIncludeDir($solution->{options}->{tcl} . '\include');
- $pltcl->AddReference($postgres);
- $pltcl->AddLibrary($solution->{options}->{tcl} . '\lib\tcl84.lib');
-}
-
-my $libpq = $solution->AddProject('libpq','dll','interfaces','src\interfaces\libpq');
-$libpq->AddDefine('FRONTEND');
-$libpq->AddIncludeDir('src\port');
-$libpq->AddLibrary('wsock32.lib');
-$libpq->AddLibrary('wldap32.lib') if ($solution->{options}->{ldap});
-$libpq->UseDef('src\interfaces\libpq\libpqdll.def');
-$libpq->ReplaceFile('src\interfaces\libpq\libpqrc.c','src\interfaces\libpq\libpq.rc');
-
-my $pgtypes =
- $solution->AddProject('libpgtypes','dll','interfaces','src\interfaces\ecpg\pgtypeslib');
-$pgtypes->AddDefine('FRONTEND');
-$pgtypes->AddReference($postgres,$libpgport);
-$pgtypes->AddIncludeDir('src\interfaces\ecpg\include');
-
-if ($config->{pthread})
-{
- my $libecpg = $solution->AddProject('libecpg','dll','interfaces','src\interfaces\ecpg\ecpglib');
- $libecpg->AddDefine('FRONTEND');
- $libecpg->AddIncludeDir('src\interfaces\ecpg\include');
- $libecpg->AddIncludeDir('src\interfaces\libpq');
- $libecpg->AddIncludeDir('src\port');
- $libecpg->AddLibrary('wsock32.lib');
- $libecpg->AddLibrary($config->{'pthread'} . '\pthreadVC2.lib');
- $libecpg->AddReference($libpq,$pgtypes);
-
- my $libecpgcompat =
- $solution->AddProject('libecpg_compat','dll','interfaces','src\interfaces\ecpg\compatlib');
- $libecpgcompat->AddIncludeDir('src\interfaces\ecpg\include');
- $libecpgcompat->AddIncludeDir('src\interfaces\libpq');
- $libecpgcompat->AddReference($pgtypes,$libecpg);
-
- my $ecpg = $solution->AddProject('ecpg','exe','interfaces','src\interfaces\ecpg\preproc');
- $ecpg->AddIncludeDir('src\interfaces\ecpg\include');
- $ecpg->AddIncludeDir('src\interfaces\libpq');
- $ecpg->AddFiles('src\interfaces\ecpg\preproc','pgc.l','preproc.y');
- $ecpg->AddDefine('MAJOR_VERSION=4');
- $ecpg->AddDefine('MINOR_VERSION=2');
- $ecpg->AddDefine('PATCHLEVEL=1');
- $ecpg->AddReference($libpgport);
-}
-else
-{
- print "Not building ecpg due to lack of pthreads.\n";
-}
-
-# src/bin
-my $initdb = AddSimpleFrontend('initdb', 1);
-
-my $pgconfig = AddSimpleFrontend('pg_config');
-
-my $pgcontrol = AddSimpleFrontend('pg_controldata');
-
-my $pgctl = AddSimpleFrontend('pg_ctl', 1);
-
-my $pgreset = AddSimpleFrontend('pg_resetxlog');
-
-my $pgevent = $solution->AddProject('pgevent','dll','bin');
-$pgevent->AddFiles('src\bin\pgevent','pgevent.c','pgmsgevent.rc');
-$pgevent->AddResourceFile('src\bin\pgevent','Eventlog message formatter');
-$pgevent->RemoveFile('src\bin\pgevent\win32ver.rc');
-$pgevent->UseDef('src\bin\pgevent\pgevent.def');
-$pgevent->DisableLinkerWarnings('4104');
-
-my $psql = AddSimpleFrontend('psql', 1);
-$psql->AddIncludeDir('src\bin\pg_dump');
-$psql->AddFile('src\bin\psql\psqlscan.l');
-
-my $pgdump = AddSimpleFrontend('pg_dump', 1);
-$pgdump->AddFile('src\bin\pg_dump\pg_dump.c');
-$pgdump->AddFile('src\bin\pg_dump\common.c');
-$pgdump->AddFile('src\bin\pg_dump\pg_dump_sort.c');
-
-my $pgdumpall = AddSimpleFrontend('pg_dump', 1);
-$pgdumpall->{name} = 'pg_dumpall';
-$pgdumpall->AddFile('src\bin\pg_dump\pg_dumpall.c');
-
-my $pgrestore = AddSimpleFrontend('pg_dump', 1);
-$pgrestore->{name} = 'pg_restore';
-$pgrestore->AddFile('src\bin\pg_dump\pg_restore.c');
-
-my $zic = $solution->AddProject('zic','exe','utils');
-$zic->AddFiles('src\timezone','zic.c','ialloc.c','scheck.c','localtime.c');
-$zic->AddReference($libpgport);
-
-my $contrib_defines = {'refint' => 'REFINT_VERBOSE'};
-my @contrib_uselibpq = ('dblink', 'oid2name', 'pgbench', 'vacuumlo');
-my @contrib_uselibpgport = ('oid2name', 'pgbench', 'pg_standby', 'vacuumlo');
-my $contrib_extralibs = {'pgbench' => ['wsock32.lib']};
-my $contrib_extraincludes = {'tsearch2' => ['contrib/tsearch2']};
-my $contrib_extrasource = {
- 'cube' => ['cubescan.l','cubeparse.y'],
- 'seg' => ['segscan.l','segparse.y']
-};
-
-my @contrib_excludes = ('pgcrypto');
-
-if ($solution->{options}->{xml})
-{
- $contrib_extraincludes->{'xml2'} = [
- $solution->{options}->{xml} . '\include',
- $solution->{options}->{xslt} . '\include',
- $solution->{options}->{iconv} . '\include'
- ];
-
- $contrib_extralibs->{'xml2'} = [
- $solution->{options}->{xml} . '\lib\libxml2.lib',
- $solution->{options}->{xslt} . '\lib\libxslt.lib'
- ];
-}
-else
-{
- push @contrib_excludes,'xml2';
-}
-
-if (!$solution->{options}->{openssl})
-{
- push @contrib_excludes,'sslinfo';
-}
-
-# Pgcrypto makefile too complex to parse....
-my $pgcrypto = $solution->AddProject('pgcrypto','dll','crypto');
-$pgcrypto->AddFiles(
- 'contrib\pgcrypto','pgcrypto.c','px.c','px-hmac.c',
- 'px-crypt.c','crypt-gensalt.c','crypt-blowfish.c','crypt-des.c',
- 'crypt-md5.c','mbuf.c','pgp.c','pgp-armor.c',
- 'pgp-cfb.c','pgp-compress.c','pgp-decrypt.c','pgp-encrypt.c',
- 'pgp-info.c','pgp-mpi.c','pgp-pubdec.c','pgp-pubenc.c',
- 'pgp-pubkey.c','pgp-s2k.c','pgp-pgsql.c'
-);
-if ($solution->{options}->{openssl})
-{
- $pgcrypto->AddFiles('contrib\pgcrypto', 'openssl.c','pgp-mpi-openssl.c');
-}
-else
-{
- $pgcrypto->AddFiles(
- 'contrib\pgcrypto', 'md5.c','sha1.c','sha2.c',
- 'internal.c','internal-sha2.c','blf.c','rijndael.c',
- 'fortuna.c','random.c','pgp-mpi-internal.c','imath.c'
- );
-}
-$pgcrypto->AddReference($postgres);
-$pgcrypto->AddLibrary('wsock32.lib');
-
-my $D;
-opendir($D, 'contrib') || croak "Could not opendir on contrib!\n";
-while (my $d = readdir($D))
-{
- next if ($d =~ /^\./);
- next unless (-f "contrib/$d/Makefile");
- next if (grep {/^$d$/} @contrib_excludes);
- AddContrib($d);
-}
-closedir($D);
-
-my $mf = Project::read_file('src\backend\utils\mb\conversion_procs\Makefile');
-$mf =~ s{\\s*[\r\n]+}{}mg;
-$mf =~ m{DIRS\s*=\s*(.*)$}m || die 'Could not match in conversion makefile' . "\n";
-foreach my $sub (split /\s+/,$1)
-{
- my $mf = Project::read_file('src\backend\utils\mb\conversion_procs\\' . $sub . '\Makefile');
- my $p = $solution->AddProject($sub, 'dll', 'conversion procs');
- $p->AddFile('src\backend\utils\mb\conversion_procs\\' . $sub . '\\' . $sub . '.c');
- if ($mf =~ m{^SRCS\s*\+=\s*(.*)$}m)
- {
- $p->AddFile('src\backend\utils\mb\conversion_procs\\' . $sub . '\\' . $1);
- }
- $p->AddReference($postgres);
-}
-
-$mf = Project::read_file('src\bin\scripts\Makefile');
-$mf =~ s{\\s*[\r\n]+}{}mg;
-$mf =~ m{PROGRAMS\s*=\s*(.*)$}m || die 'Could not match in bin\scripts\Makefile' . "\n";
-foreach my $prg (split /\s+/,$1)
-{
- my $proj = $solution->AddProject($prg,'exe','bin');
- $mf =~ m{$prg\s*:\s*(.*)$}m || die 'Could not find script define for $prg' . "\n";
- my @files = split /\s+/,$1;
- foreach my $f (@files)
- {
- if ($f =~ /\/keywords\.o$/)
- {
- $proj->AddFile('src\backend\parser\keywords.c');
- }
- else
- {
- $f =~ s/\.o$/\.c/;
- if ($f eq 'dumputils.c')
- {
- $proj->AddFile('src\bin\pg_dump\dumputils.c');
- }
- elsif ($f =~ /print\.c$/)
- { # Also catches mbprint.c
- $proj->AddFile('src\bin\psql\\' . $f);
- }
- else
- {
- $proj->AddFile('src\bin\scripts\\' . $f);
- }
- }
- }
- $proj->AddIncludeDir('src\interfaces\libpq');
- $proj->AddIncludeDir('src\bin\pg_dump');
- $proj->AddIncludeDir('src\bin\psql');
- $proj->AddReference($libpq,$libpgport);
- $proj->AddResourceFile('src\bin\scripts','PostgreSQL Utility');
-}
-
-# Regression DLL and EXE
-my $regress = $solution->AddProject('regress','dll','misc');
-$regress->AddFile('src\test\regress\regress.c');
-$regress->AddReference($postgres);
-
-my $pgregress = $solution->AddProject('pg_regress','exe','misc');
-$pgregress->AddFile('src\test\regress\pg_regress.c');
-$pgregress->AddIncludeDir('src\port');
-$pgregress->AddDefine('HOST_TUPLE="i686-pc-win32vc"');
-$pgregress->AddDefine('FRONTEND');
-$pgregress->AddReference($libpgport);
-
-$solution->Save();
-
-#####################
-# Utility functions #
-#####################
-
-# Add a simple frontend project (exe)
-sub AddSimpleFrontend
-{
- my $n = shift;
- my $uselibpq= shift;
-
- my $p = $solution->AddProject($n,'exe','bin');
- $p->AddDir('src\bin\\' . $n);
- $p->AddDefine('FRONTEND');
- $p->AddReference($libpgport);
- if ($uselibpq)
- {
- $p->AddIncludeDir('src\interfaces\libpq');
- $p->AddReference($libpq);
- }
- return $p;
-}
-
-# Add a simple contrib project
-sub AddContrib
-{
- my $n = shift;
- my $mf = Project::read_file('contrib\\' . $n . '\Makefile');
-
- if ($mf =~ /^MODULE_big/mg)
- {
- $mf =~ s{\\\s*[\r\n]+}{}mg;
- my $proj = $solution->AddProject($n, 'dll', 'contrib');
- $mf =~ /^OBJS\s*=\s*(.*)$/gm || croak "Could not find objects in MODULE_big for $n\n";
- foreach my $o (split /\s+/, $1)
- {
- $o =~ s/\.o$/.c/;
- $proj->AddFile('contrib\\' . $n . '\\' . $o);
- }
- $proj->AddReference($postgres);
- if ($mf =~ /^SUBDIRS\s*:?=\s*(.*)$/mg)
- {
- foreach my $d (split /\s+/, $1)
- {
- my $mf2 = Project::read_file('contrib\\' . $n . '\\' . $d . '\Makefile');
- $mf2 =~ s{\\\s*[\r\n]+}{}mg;
- $mf2 =~ /^SUBOBJS\s*=\s*(.*)$/gm
- || croak "Could not find objects in MODULE_big for $n, subdir $d\n";
- foreach my $o (split /\s+/, $1)
- {
- $o =~ s/\.o$/.c/;
- $proj->AddFile('contrib\\' . $n . '\\' . $d . '\\' . $o);
- }
- }
- }
- AdjustContribProj($proj);
- return $proj;
- }
- elsif ($mf =~ /^MODULES\s*=\s*(.*)$/mg)
- {
- foreach my $mod (split /\s+/, $1)
- {
- my $proj = $solution->AddProject($mod, 'dll', 'contrib');
- $proj->AddFile('contrib\\' . $n . '\\' . $mod . '.c');
- $proj->AddReference($postgres);
- AdjustContribProj($proj);
- }
- return undef;
- }
- 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";
- foreach my $o (split /\s+/, $1)
- {
- $o =~ s/\.o$/.c/;
- $proj->AddFile('contrib\\' . $n . '\\' . $o);
- }
- AdjustContribProj($proj);
- return $proj;
- }
- else
- {
- croak "Could not determine contrib module type for $n\n";
- }
-}
-
-sub AdjustContribProj
-{
- my $proj = shift;
- my $n = $proj->{name};
-
- if ($contrib_defines->{$n})
- {
- foreach my $d ($contrib_defines->{$n})
- {
- $proj->AddDefine($d);
- }
- }
- if (grep {/^$n$/} @contrib_uselibpq)
- {
- $proj->AddIncludeDir('src\interfaces\libpq');
- $proj->AddReference($libpq);
- }
- if (grep {/^$n$/} @contrib_uselibpgport)
- {
- $proj->AddReference($libpgport);
- }
- if ($contrib_extralibs->{$n})
- {
- foreach my $l (@{$contrib_extralibs->{$n}})
- {
- $proj->AddLibrary($l);
- }
- }
- if ($contrib_extraincludes->{$n})
- {
- foreach my $i (@{$contrib_extraincludes->{$n}})
- {
- $proj->AddIncludeDir($i);
- }
- }
- if ($contrib_extrasource->{$n})
- {
- $proj->AddFiles('contrib\\' . $n, @{$contrib_extrasource->{$n}});
- }
-}
+Mkvcbuild::mkvcbuild($config);
SET TEMPPORT=54321
IF NOT "%2"=="" SET SCHEDULE=%2
+SET PERL5LIB=..\..\tools\msvc
+
if "%what%"=="INSTALLCHECK" ..\..\..\%CONFIG%\pg_regress\pg_regress --psqldir=..\..\..\%CONFIG%\psql --schedule=%SCHEDULE%_schedule --multibyte=SQL_ASCII --load-language=plpgsql --no-locale
if "%what%"=="CHECK" ..\..\..\%CONFIG%\pg_regress\pg_regress --psqldir=..\..\..\%CONFIG%\psql --schedule=%SCHEDULE%_schedule --multibyte=SQL_ASCII --load-language=plpgsql --no-locale --temp-install=./tmp_check --top-builddir=%TOPDIR% --temp-port=%TEMPPORT%