-my @def;\r
-\r
-die "Usage: gendef.pl \n" unless ($ARGV[0] =~ /\\([^\\]+$)/);\r
-my $defname = uc $1;\r
-\r
-if (-f "$ARGV[0]/$defname.def") {\r
- print "Not re-generating $defname.DEF, file already exists.\n";\r
- exit(0);\r
-}\r
-\r
-print "Generating $defname.DEF from directory $ARGV[0]\n";\r
-\r
-while (<$ARGV[0]/*>) {\r
- print ".";\r
- open(F,"dumpbin /symbols $_|") || die "Could not open $_\n";\r
- while () {\r
- s/\(\)//g;\r
- next unless /^\d/;\r
- my @pieces = split ;\r
- next unless $pieces[6];\r
- next if ($pieces[2] eq "UNDEF");\r
- next unless ($pieces[4] eq "External");\r
- next if $pieces[6] =~ /^@/;\r
- next if $pieces[6] =~ /^\(/;\r
- next if $pieces[6] =~ /^__real/;\r
- next if $pieces[6] =~ /^__imp/;\r
- next if $pieces[6] =~ /NULL_THUNK_DATA$/;\r
- next if $pieces[6] =~ /^__IMPORT_DESCRIPTOR/;\r
- next if $pieces[6] =~ /^__NULL_IMPORT/;\r
-\r
- push @def, $pieces[6];\r
- }\r
- close(F);\r
-}\r
-print "\n";\r
-\r
-open(DEF,">$ARGV[0]/$defname.def") || die "Could not write to $defname\n";\r
-print DEF "EXPORTS\n";\r
-my $i = 0;\r
-my $last = "";\r
-foreach my $f (sort @def) {\r
- next if ($f eq $last);\r
- $last = $f;\r
- $f =~ s/^_//;\r
- $i++;\r
-# print DEF " $f \@ $i\n"; # ordinaled exports?\r
- print DEF " $f\n";\r
-}\r
-close(DEF);\r
-print "Generated $i symbols\n";\r
+my @def;
+
+die "Usage: gendef.pl \n" unless ($ARGV[0] =~ /\\([^\\]+$)/);
+my $defname = uc $1;
+
+if (-f "$ARGV[0]/$defname.def") {
+ print "Not re-generating $defname.DEF, file already exists.\n";
+ exit(0);
+}
+
+print "Generating $defname.DEF from directory $ARGV[0]\n";
+
+while (<$ARGV[0]/*>) {
+ print ".";
+ open(F,"dumpbin /symbols $_|") || die "Could not open $_\n";
+ while () {
+ s/\(\)//g;
+ next unless /^\d/;
+ my @pieces = split ;
+ next unless $pieces[6];
+ next if ($pieces[2] eq "UNDEF");
+ next unless ($pieces[4] eq "External");
+ next if $pieces[6] =~ /^@/;
+ next if $pieces[6] =~ /^\(/;
+ next if $pieces[6] =~ /^__real/;
+ next if $pieces[6] =~ /^__imp/;
+ next if $pieces[6] =~ /NULL_THUNK_DATA$/;
+ next if $pieces[6] =~ /^__IMPORT_DESCRIPTOR/;
+ next if $pieces[6] =~ /^__NULL_IMPORT/;
+
+ push @def, $pieces[6];
+ }
+ close(F);
+}
+print "\n";
+
+open(DEF,">$ARGV[0]/$defname.def") || die "Could not write to $defname\n";
+print DEF "EXPORTS\n";
+my $i = 0;
+my $last = "";
+foreach my $f (sort @def) {
+ next if ($f eq $last);
+ $last = $f;
+ $f =~ s/^_//;
+ $i++;
+# print DEF " $f \@ $i\n"; # ordinaled exports?
+ print DEF " $f\n";
+}
+close(DEF);
+print "Generated $i symbols\n";
$pgrestore->{name} = 'pg_restore';
$pgrestore->AddFile('src\bin\pg_dump\pg_restore.c');
-open(MF,'src\backend\utils\mb\conversion_procs\Makefile') || die 'Could not open src\backend\utils\mb\conversion_procs\Makefile';
-my $t = $/;undef $/;
-my $mf = ;
-close(MF);
+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', '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';
+}
+
+# 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) {
- open(MF,'src\backend\utils\mb\conversion_procs\\' . $sub . '\Makefile') || die 'Could not open Makefile for $sub';
- $mf = ;
- close(MF);
+ 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->AddReference($postgres);
}
-open(MF,'src\bin\scripts\Makefile') || die 'Could not open src\bin\scripts\Makefile';
-$mf = ;
-close(MF);
+$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) {
$proj->AddReference($libpq,$libpgport);
$proj->AddResourceFile('src\bin\scripts','PostgreSQL Utility');
}
-$/ = $t;
# Regression DLLs
$regress->AddFile('src\test\regress\regress.c');
$regress->AddReference($postgres);
-my $refint = $solution->AddProject('refint','dll','contrib');
-$refint->AddFile('contrib\spi\refint.c');
-$refint->AddReference($postgres);
-$refint->AddDefine('REFINT_VERBOSE');
-
-my $autoinc = $solution->AddProject('autoinc','dll','contrib');
-$autoinc ->AddFile('contrib\spi\autoinc.c');
-$autoinc->AddReference($postgres);
-
-
$solution->Save();
#####################
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}});
+ }
+}
-@echo off\r
-bison -V > NUL\r
-if errorlevel 1 goto nobison\r
-\r
-if "%1" == "src\backend\parser\gram.y" call :generate %1 src\backend\parser\gram.c src\include\parser\parse.h\r
-if "%1" == "src\backend\bootstrap\bootparse.y" call :generate %1 src\backend\bootstrap\bootparse.c src\backend\bootstrap\bootstrap_tokens.h\r
-if "%1" == "src\pl\plpgsql\src\gram.y" call :generate %1 src\pl\plpgsql\src\pl_gram.c src\pl\plpgsql\src\pl.tab.h\r
-if "%1" == "src\interfaces\ecpg\preproc\preproc.y" call :generate %1 src\interfaces\ecpg\preproc\preproc.c src\interfaces\ecpg\preproc\preproc.h\r
-\r
-echo Unknown bison input: %1\r
-exit 1\r
-\r
-:generate\r
-SET fn=%1\r
-bison -d %fn%\r
-if errorlevel 1 exit 1\r
-copy /y %fn:~0,-2%.tab.c %2\r
-if errorlevel 1 exit 1\r
-copy /y %fn:~0,-2%.tab.h %3\r
-if errorlevel 1 exit 1\r
-del %fn:~0,-2%.tab.*\r
-exit 0\r
-\r
-\r
-:nobison\r
-echo WARNING! Bison install not found, attempting to build without!\r
-exit 0\r
+@echo off
+SET BV=
+for /F "tokens=4 usebackq" %%f in (`bison -V`) do if "!BV!"=="" SET BV=%%f
+if "%BV%"=="" goto novarexp
+if %BV% LSS 1.875 goto nobison
+if %BV% EQU 2.1 goto nobison
+
+if "%1" == "src\backend\parser\gram.y" call :generate %1 src\backend\parser\gram.c src\include\parser\parse.h
+if "%1" == "src\backend\bootstrap\bootparse.y" call :generate %1 src\backend\bootstrap\bootparse.c src\backend\bootstrap\bootstrap_tokens.h
+if "%1" == "src\pl\plpgsql\src\gram.y" call :generate %1 src\pl\plpgsql\src\pl_gram.c src\pl\plpgsql\src\pl.tab.h
+if "%1" == "src\interfaces\ecpg\preproc\preproc.y" call :generate %1 src\interfaces\ecpg\preproc\preproc.c src\interfaces\ecpg\preproc\preproc.h
+if "%1" == "contrib\cube\cubeparse.y" call :generate %1 contrib\cube\cubeparse.c contrib\cube\cubeparse.h
+if "%1" == "contrib\seg\segparse.y" call :generate %1 contrib\seg\segparse.c contrib\seg\segparse.h
+
+echo Unknown bison input: %1
+exit 1
+
+:generate
+SET fn=%1
+bison -d %fn%
+if errorlevel 1 exit 1
+copy /y %fn:~0,-2%.tab.c %2
+if errorlevel 1 exit 1
+copy /y %fn:~0,-2%.tab.h %3
+if errorlevel 1 exit 1
+del %fn:~0,-2%.tab.*
+exit 0
+
+
+:novarexp
+echo pgbison must be called with cmd /V:ON /C pgbison to work!
+exit 1
+
+:nobison
+echo WARNING! Bison install not found, or unsupported Bison version.
+echo Attempting to build without.
+exit 0