2007-03-17 14:50:42 +01:00
|
|
|
package Mkvcbuild;
|
2007-03-23 10:53:33 +01:00
|
|
|
|
2007-03-17 15:01:01 +01:00
|
|
|
#
|
|
|
|
# Package that generates build files for msvc build
|
|
|
|
#
|
2010-09-20 22:08:53 +02:00
|
|
|
# src/tools/msvc/Mkvcbuild.pm
|
2007-03-17 15:01:01 +01:00
|
|
|
#
|
2007-03-17 14:50:42 +01:00
|
|
|
use Carp;
|
|
|
|
use Win32;
|
|
|
|
use strict;
|
|
|
|
use warnings;
|
|
|
|
use Project;
|
|
|
|
use Solution;
|
2010-01-09 15:45:47 +01:00
|
|
|
use Cwd;
|
|
|
|
use File::Copy;
|
2013-02-25 18:00:53 +01:00
|
|
|
use File::Basename;
|
2011-11-26 21:22:32 +01:00
|
|
|
use Config;
|
2012-01-03 14:44:26 +01:00
|
|
|
use VSObjectFactory;
|
2011-11-26 21:22:32 +01:00
|
|
|
use List::Util qw(first);
|
2007-03-17 14:50:42 +01:00
|
|
|
|
|
|
|
use Exporter;
|
|
|
|
our (@ISA, @EXPORT_OK);
|
2012-07-05 03:47:49 +02:00
|
|
|
@ISA = qw(Exporter);
|
2007-03-17 14:50:42 +01:00
|
|
|
@EXPORT_OK = qw(Mkvcbuild);
|
|
|
|
|
|
|
|
my $solution;
|
|
|
|
my $libpgport;
|
Create libpgcommon, and move pg_malloc et al to it
libpgcommon is a new static library to allow sharing code among the
various frontend programs and backend; this lets us eliminate duplicate
implementations of common routines. We avoid libpgport, because that's
intended as a place for porting issues; per discussion, it seems better
to keep them separate.
The first use case, and the only implemented by this patch, is pg_malloc
and friends, which many frontend programs were already using.
At the same time, we can use this to provide palloc emulation functions
for the frontend; this way, some palloc-using files in the backend can
also be used by the frontend cleanly. To do this, we change palloc() in
the backend to be a function instead of a macro on top of
MemoryContextAlloc(). This was previously believed to cause loss of
performance, but this implementation has been tweaked by Tom and Andres
so that on modern compilers it provides a slight improvement over the
previous one.
This lets us clean up some places that were already with
localized hacks.
Most of the pg_malloc/palloc changes in this patch were authored by
Andres Freund. Zoltán Böszörményi also independently provided a form of
that. libpgcommon infrastructure was authored by Álvaro.
2013-02-12 14:33:40 +01:00
|
|
|
my $libpgcommon;
|
2007-03-17 14:50:42 +01:00
|
|
|
my $postgres;
|
|
|
|
my $libpq;
|
|
|
|
|
2012-07-05 03:47:49 +02:00
|
|
|
my $contrib_defines = { 'refint' => 'REFINT_VERBOSE' };
|
|
|
|
my @contrib_uselibpq =
|
2013-02-21 12:43:15 +01:00
|
|
|
('dblink', 'oid2name', 'pgbench', 'pg_upgrade', 'postgres_fdw', 'vacuumlo');
|
2012-07-05 03:47:49 +02:00
|
|
|
my @contrib_uselibpgport = (
|
|
|
|
'oid2name', 'pgbench',
|
|
|
|
'pg_standby', 'pg_archivecleanup',
|
|
|
|
'pg_test_fsync', 'pg_test_timing',
|
2013-02-25 02:28:42 +01:00
|
|
|
'pg_upgrade', 'pg_xlogdump',
|
|
|
|
'vacuumlo');
|
Create libpgcommon, and move pg_malloc et al to it
libpgcommon is a new static library to allow sharing code among the
various frontend programs and backend; this lets us eliminate duplicate
implementations of common routines. We avoid libpgport, because that's
intended as a place for porting issues; per discussion, it seems better
to keep them separate.
The first use case, and the only implemented by this patch, is pg_malloc
and friends, which many frontend programs were already using.
At the same time, we can use this to provide palloc emulation functions
for the frontend; this way, some palloc-using files in the backend can
also be used by the frontend cleanly. To do this, we change palloc() in
the backend to be a function instead of a macro on top of
MemoryContextAlloc(). This was previously believed to cause loss of
performance, but this implementation has been tweaked by Tom and Andres
so that on modern compilers it provides a slight improvement over the
previous one.
This lets us clean up some places that were already with
localized hacks.
Most of the pg_malloc/palloc changes in this patch were authored by
Andres Freund. Zoltán Böszörményi also independently provided a form of
that. libpgcommon infrastructure was authored by Álvaro.
2013-02-12 14:33:40 +01:00
|
|
|
my @contrib_uselibpgcommon = (
|
|
|
|
'oid2name', 'pgbench',
|
|
|
|
'pg_standby', 'pg_archivecleanup',
|
|
|
|
'pg_test_fsync', 'pg_test_timing',
|
2013-02-25 02:28:42 +01:00
|
|
|
'pg_upgrade', 'pg_xlogdump',
|
|
|
|
'vacuumlo');
|
2014-07-15 14:18:39 +02:00
|
|
|
my $contrib_extralibs = { 'pgbench' => ['ws2_32.lib'] };
|
2012-07-05 03:47:49 +02:00
|
|
|
my $contrib_extraincludes =
|
|
|
|
{ 'tsearch2' => ['contrib/tsearch2'], 'dblink' => ['src/backend'] };
|
2007-03-17 14:50:42 +01:00
|
|
|
my $contrib_extrasource = {
|
2012-07-05 03:47:49 +02:00
|
|
|
'cube' => [ 'cubescan.l', 'cubeparse.y' ],
|
2013-05-29 22:58:43 +02:00
|
|
|
'seg' => [ 'segscan.l', 'segparse.y' ], };
|
2012-07-05 03:47:49 +02:00
|
|
|
my @contrib_excludes = ('pgcrypto', 'intagg', 'sepgsql');
|
2007-03-17 14:50:42 +01:00
|
|
|
|
|
|
|
sub mkvcbuild
|
|
|
|
{
|
2012-06-10 21:20:04 +02:00
|
|
|
our $config = shift;
|
|
|
|
|
|
|
|
chdir('..\..\..') if (-d '..\msvc' && -d '..\..\..\src');
|
2012-07-05 03:47:49 +02:00
|
|
|
die 'Must run from root or msvc directory'
|
|
|
|
unless (-d 'src\tools\msvc' && -d 'src');
|
2012-06-10 21:20:04 +02:00
|
|
|
|
|
|
|
my $vsVersion = DetermineVisualStudioVersion();
|
|
|
|
|
|
|
|
$solution = CreateSolution($vsVersion, $config);
|
|
|
|
|
|
|
|
our @pgportfiles = qw(
|
2013-10-23 00:42:13 +02:00
|
|
|
chklocale.c crypt.c fls.c fseeko.c getrusage.c inet_aton.c random.c
|
2012-06-10 21:20:04 +02:00
|
|
|
srandom.c getaddrinfo.c gettimeofday.c inet_net_ntop.c kill.c open.c
|
2013-10-18 03:52:54 +02:00
|
|
|
erand48.c snprintf.c strlcat.c strlcpy.c dirmod.c noblock.c path.c
|
2013-03-17 20:19:47 +01:00
|
|
|
pgcheckdir.c pg_crc.c pgmkdirp.c pgsleep.c pgstrcasecmp.c pqsignal.c
|
2014-06-14 15:41:13 +02:00
|
|
|
mkdtemp.c qsort.c qsort_arg.c quotes.c system.c
|
2014-01-26 15:49:10 +01:00
|
|
|
sprompt.c tar.c thread.c getopt.c getopt_long.c dirent.c
|
2013-12-18 18:16:16 +01:00
|
|
|
win32env.c win32error.c win32setlocale.c);
|
2012-06-10 21:20:04 +02:00
|
|
|
|
2014-01-26 15:49:10 +01:00
|
|
|
push(@pgportfiles, 'rint.c') if ($vsVersion < '12.00');
|
|
|
|
|
2013-02-22 02:46:17 +01:00
|
|
|
our @pgcommonallfiles = qw(
|
2014-01-11 00:03:28 +01:00
|
|
|
exec.c pgfnames.c psprintf.c relpath.c rmtree.c username.c wait_error.c);
|
Create libpgcommon, and move pg_malloc et al to it
libpgcommon is a new static library to allow sharing code among the
various frontend programs and backend; this lets us eliminate duplicate
implementations of common routines. We avoid libpgport, because that's
intended as a place for porting issues; per discussion, it seems better
to keep them separate.
The first use case, and the only implemented by this patch, is pg_malloc
and friends, which many frontend programs were already using.
At the same time, we can use this to provide palloc emulation functions
for the frontend; this way, some palloc-using files in the backend can
also be used by the frontend cleanly. To do this, we change palloc() in
the backend to be a function instead of a macro on top of
MemoryContextAlloc(). This was previously believed to cause loss of
performance, but this implementation has been tweaked by Tom and Andres
so that on modern compilers it provides a slight improvement over the
previous one.
This lets us clean up some places that were already with
localized hacks.
Most of the pg_malloc/palloc changes in this patch were authored by
Andres Freund. Zoltán Böszörményi also independently provided a form of
that. libpgcommon infrastructure was authored by Álvaro.
2013-02-12 14:33:40 +01:00
|
|
|
|
2013-05-29 22:58:43 +02:00
|
|
|
our @pgcommonfrontendfiles = (@pgcommonallfiles, qw(fe_memutils.c));
|
2013-02-22 02:46:17 +01:00
|
|
|
|
|
|
|
our @pgcommonbkndfiles = @pgcommonallfiles;
|
Create libpgcommon, and move pg_malloc et al to it
libpgcommon is a new static library to allow sharing code among the
various frontend programs and backend; this lets us eliminate duplicate
implementations of common routines. We avoid libpgport, because that's
intended as a place for porting issues; per discussion, it seems better
to keep them separate.
The first use case, and the only implemented by this patch, is pg_malloc
and friends, which many frontend programs were already using.
At the same time, we can use this to provide palloc emulation functions
for the frontend; this way, some palloc-using files in the backend can
also be used by the frontend cleanly. To do this, we change palloc() in
the backend to be a function instead of a macro on top of
MemoryContextAlloc(). This was previously believed to cause loss of
performance, but this implementation has been tweaked by Tom and Andres
so that on modern compilers it provides a slight improvement over the
previous one.
This lets us clean up some places that were already with
localized hacks.
Most of the pg_malloc/palloc changes in this patch were authored by
Andres Freund. Zoltán Böszörményi also independently provided a form of
that. libpgcommon infrastructure was authored by Álvaro.
2013-02-12 14:33:40 +01:00
|
|
|
|
2012-07-05 03:47:49 +02:00
|
|
|
$libpgport = $solution->AddProject('libpgport', 'lib', 'misc');
|
2012-06-10 21:20:04 +02:00
|
|
|
$libpgport->AddDefine('FRONTEND');
|
2012-07-05 03:47:49 +02:00
|
|
|
$libpgport->AddFiles('src\port', @pgportfiles);
|
2012-06-10 21:20:04 +02:00
|
|
|
|
Create libpgcommon, and move pg_malloc et al to it
libpgcommon is a new static library to allow sharing code among the
various frontend programs and backend; this lets us eliminate duplicate
implementations of common routines. We avoid libpgport, because that's
intended as a place for porting issues; per discussion, it seems better
to keep them separate.
The first use case, and the only implemented by this patch, is pg_malloc
and friends, which many frontend programs were already using.
At the same time, we can use this to provide palloc emulation functions
for the frontend; this way, some palloc-using files in the backend can
also be used by the frontend cleanly. To do this, we change palloc() in
the backend to be a function instead of a macro on top of
MemoryContextAlloc(). This was previously believed to cause loss of
performance, but this implementation has been tweaked by Tom and Andres
so that on modern compilers it provides a slight improvement over the
previous one.
This lets us clean up some places that were already with
localized hacks.
Most of the pg_malloc/palloc changes in this patch were authored by
Andres Freund. Zoltán Böszörményi also independently provided a form of
that. libpgcommon infrastructure was authored by Álvaro.
2013-02-12 14:33:40 +01:00
|
|
|
$libpgcommon = $solution->AddProject('libpgcommon', 'lib', 'misc');
|
|
|
|
$libpgcommon->AddDefine('FRONTEND');
|
2013-02-22 02:46:17 +01:00
|
|
|
$libpgcommon->AddFiles('src\common', @pgcommonfrontendfiles);
|
Create libpgcommon, and move pg_malloc et al to it
libpgcommon is a new static library to allow sharing code among the
various frontend programs and backend; this lets us eliminate duplicate
implementations of common routines. We avoid libpgport, because that's
intended as a place for porting issues; per discussion, it seems better
to keep them separate.
The first use case, and the only implemented by this patch, is pg_malloc
and friends, which many frontend programs were already using.
At the same time, we can use this to provide palloc emulation functions
for the frontend; this way, some palloc-using files in the backend can
also be used by the frontend cleanly. To do this, we change palloc() in
the backend to be a function instead of a macro on top of
MemoryContextAlloc(). This was previously believed to cause loss of
performance, but this implementation has been tweaked by Tom and Andres
so that on modern compilers it provides a slight improvement over the
previous one.
This lets us clean up some places that were already with
localized hacks.
Most of the pg_malloc/palloc changes in this patch were authored by
Andres Freund. Zoltán Böszörményi also independently provided a form of
that. libpgcommon infrastructure was authored by Álvaro.
2013-02-12 14:33:40 +01:00
|
|
|
|
2012-07-05 03:47:49 +02:00
|
|
|
$postgres = $solution->AddProject('postgres', 'exe', '', 'src\backend');
|
2012-06-10 21:20:04 +02:00
|
|
|
$postgres->AddIncludeDir('src\backend');
|
|
|
|
$postgres->AddDir('src\backend\port\win32');
|
|
|
|
$postgres->AddFile('src\backend\utils\fmgrtab.c');
|
2012-07-05 03:47:49 +02:00
|
|
|
$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\win32_shmem.c');
|
|
|
|
$postgres->ReplaceFile('src\backend\port\pg_latch.c',
|
|
|
|
'src\backend\port\win32_latch.c');
|
2013-05-29 22:58:43 +02:00
|
|
|
$postgres->AddFiles('src\port', @pgportfiles);
|
Create libpgcommon, and move pg_malloc et al to it
libpgcommon is a new static library to allow sharing code among the
various frontend programs and backend; this lets us eliminate duplicate
implementations of common routines. We avoid libpgport, because that's
intended as a place for porting issues; per discussion, it seems better
to keep them separate.
The first use case, and the only implemented by this patch, is pg_malloc
and friends, which many frontend programs were already using.
At the same time, we can use this to provide palloc emulation functions
for the frontend; this way, some palloc-using files in the backend can
also be used by the frontend cleanly. To do this, we change palloc() in
the backend to be a function instead of a macro on top of
MemoryContextAlloc(). This was previously believed to cause loss of
performance, but this implementation has been tweaked by Tom and Andres
so that on modern compilers it provides a slight improvement over the
previous one.
This lets us clean up some places that were already with
localized hacks.
Most of the pg_malloc/palloc changes in this patch were authored by
Andres Freund. Zoltán Böszörményi also independently provided a form of
that. libpgcommon infrastructure was authored by Álvaro.
2013-02-12 14:33:40 +01:00
|
|
|
$postgres->AddFiles('src\common', @pgcommonbkndfiles);
|
2012-06-10 21:20:04 +02:00
|
|
|
$postgres->AddDir('src\timezone');
|
2012-07-05 03:47:49 +02:00
|
|
|
$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->AddFiles('src\backend\replication', 'repl_scanner.l',
|
|
|
|
'repl_gram.y');
|
2012-06-10 21:20:04 +02:00
|
|
|
$postgres->AddDefine('BUILDING_DLL');
|
|
|
|
$postgres->AddLibrary('secur32.lib');
|
2014-07-15 14:18:39 +02:00
|
|
|
$postgres->AddLibrary('ws2_32.lib');
|
2012-06-10 21:20:04 +02:00
|
|
|
$postgres->AddLibrary('wldap32.lib') if ($solution->{options}->{ldap});
|
|
|
|
$postgres->FullExportDLL('postgres.lib');
|
|
|
|
|
2012-07-05 03:47:49 +02:00
|
|
|
my $snowball = $solution->AddProject('dict_snowball', 'dll', '',
|
|
|
|
'src\backend\snowball');
|
2012-06-10 21:20:04 +02:00
|
|
|
$snowball->RelocateFiles(
|
|
|
|
'src\backend\snowball\libstemmer',
|
|
|
|
sub {
|
|
|
|
return shift !~ /dict_snowball.c$/;
|
2012-07-05 03:47:49 +02:00
|
|
|
});
|
2012-06-10 21:20:04 +02:00
|
|
|
$snowball->AddIncludeDir('src\include\snowball');
|
|
|
|
$snowball->AddReference($postgres);
|
|
|
|
|
2012-07-05 03:47:49 +02:00
|
|
|
my $plpgsql =
|
|
|
|
$solution->AddProject('plpgsql', 'dll', 'PLs', 'src\pl\plpgsql\src');
|
2012-10-05 04:40:33 +02:00
|
|
|
$plpgsql->AddFiles('src\pl\plpgsql\src', 'pl_gram.y');
|
2012-06-10 21:20:04 +02:00
|
|
|
$plpgsql->AddReference($postgres);
|
|
|
|
|
|
|
|
if ($solution->{options}->{perl})
|
|
|
|
{
|
|
|
|
my $plperlsrc = "src\\pl\\plperl\\";
|
2012-07-05 03:47:49 +02:00
|
|
|
my $plperl =
|
|
|
|
$solution->AddProject('plperl', 'dll', 'PLs', 'src\pl\plperl');
|
2012-06-10 21:20:04 +02:00
|
|
|
$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/;
|
2012-07-05 03:47:49 +02:00
|
|
|
if (Solution::IsNewer("$plperlsrc$xsc", "$plperlsrc$xs"))
|
2012-06-10 21:20:04 +02:00
|
|
|
{
|
|
|
|
my $xsubppdir = first { -e "$_\\ExtUtils\\xsubpp" } @INC;
|
|
|
|
print "Building $plperlsrc$xsc...\n";
|
2012-07-05 03:47:49 +02:00
|
|
|
system( $solution->{options}->{perl}
|
2012-06-10 21:20:04 +02:00
|
|
|
. '/bin/perl '
|
|
|
|
. "$xsubppdir/ExtUtils/xsubpp -typemap "
|
|
|
|
. $solution->{options}->{perl}
|
|
|
|
. '/lib/ExtUtils/typemap '
|
|
|
|
. "$plperlsrc$xs "
|
|
|
|
. ">$plperlsrc$xsc");
|
|
|
|
if ((!(-f "$plperlsrc$xsc")) || -z "$plperlsrc$xsc")
|
|
|
|
{
|
2012-07-05 03:47:49 +02:00
|
|
|
unlink("$plperlsrc$xsc"); # if zero size
|
2012-06-10 21:20:04 +02:00
|
|
|
die "Failed to create $xsc.\n";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2012-07-05 03:47:49 +02:00
|
|
|
if (Solution::IsNewer(
|
|
|
|
'src\pl\plperl\perlchunks.h',
|
2012-06-10 21:20:04 +02:00
|
|
|
'src\pl\plperl\plc_perlboot.pl')
|
2012-07-05 03:47:49 +02:00
|
|
|
|| Solution::IsNewer(
|
|
|
|
'src\pl\plperl\perlchunks.h',
|
|
|
|
'src\pl\plperl\plc_trusted.pl'))
|
2012-06-10 21:20:04 +02:00
|
|
|
{
|
|
|
|
print 'Building src\pl\plperl\perlchunks.h ...' . "\n";
|
|
|
|
my $basedir = getcwd;
|
|
|
|
chdir 'src\pl\plperl';
|
2012-07-05 03:47:49 +02:00
|
|
|
system( $solution->{options}->{perl}
|
2012-06-10 21:20:04 +02:00
|
|
|
. '/bin/perl '
|
|
|
|
. 'text2macro.pl '
|
|
|
|
. '--strip="^(\#.*|\s*)$$" '
|
|
|
|
. 'plc_perlboot.pl plc_trusted.pl '
|
2012-07-05 03:47:49 +02:00
|
|
|
. '>perlchunks.h');
|
2012-06-10 21:20:04 +02:00
|
|
|
chdir $basedir;
|
2012-07-05 03:47:49 +02:00
|
|
|
if ((!(-f 'src\pl\plperl\perlchunks.h'))
|
|
|
|
|| -z 'src\pl\plperl\perlchunks.h')
|
2012-06-10 21:20:04 +02:00
|
|
|
{
|
2012-07-05 03:47:49 +02:00
|
|
|
unlink('src\pl\plperl\perlchunks.h'); # if zero size
|
2012-06-10 21:20:04 +02:00
|
|
|
die 'Failed to create perlchunks.h' . "\n";
|
|
|
|
}
|
|
|
|
}
|
2012-07-05 03:47:49 +02:00
|
|
|
if (Solution::IsNewer(
|
2012-06-10 21:20:04 +02:00
|
|
|
'src\pl\plperl\plperl_opmask.h',
|
2012-07-05 03:47:49 +02:00
|
|
|
'src\pl\plperl\plperl_opmask.pl'))
|
2012-06-10 21:20:04 +02:00
|
|
|
{
|
|
|
|
print 'Building src\pl\plperl\plperl_opmask.h ...' . "\n";
|
|
|
|
my $basedir = getcwd;
|
|
|
|
chdir 'src\pl\plperl';
|
2012-07-05 03:47:49 +02:00
|
|
|
system( $solution->{options}->{perl}
|
2012-06-10 21:20:04 +02:00
|
|
|
. '/bin/perl '
|
|
|
|
. 'plperl_opmask.pl '
|
2012-07-05 03:47:49 +02:00
|
|
|
. 'plperl_opmask.h');
|
2012-06-10 21:20:04 +02:00
|
|
|
chdir $basedir;
|
|
|
|
if ((!(-f 'src\pl\plperl\plperl_opmask.h'))
|
|
|
|
|| -z 'src\pl\plperl\plperl_opmask.h')
|
|
|
|
{
|
2012-07-05 03:47:49 +02:00
|
|
|
unlink('src\pl\plperl\plperl_opmask.h'); # if zero size
|
2012-06-10 21:20:04 +02:00
|
|
|
die 'Failed to create plperl_opmask.h' . "\n";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
$plperl->AddReference($postgres);
|
|
|
|
my @perl_libs =
|
2012-07-05 03:47:49 +02:00
|
|
|
grep { /perl\d+.lib$/ }
|
|
|
|
glob($solution->{options}->{perl} . '\lib\CORE\perl*.lib');
|
2012-06-10 21:20:04 +02:00
|
|
|
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);
|
2012-07-05 03:47:49 +02:00
|
|
|
my $plpython = $solution->AddProject('plpython' . $pymajorver,
|
|
|
|
'dll', 'PLs', 'src\pl\plpython');
|
2012-06-10 21:20:04 +02:00
|
|
|
$plpython->AddIncludeDir($pyprefix . '\include');
|
|
|
|
$plpython->AddLibrary($pyprefix . "\\Libs\\python$pyver.lib");
|
|
|
|
$plpython->AddReference($postgres);
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($solution->{options}->{tcl})
|
|
|
|
{
|
2012-07-05 03:47:49 +02:00
|
|
|
my $pltcl =
|
|
|
|
$solution->AddProject('pltcl', 'dll', 'PLs', 'src\pl\tcl');
|
2012-06-10 21:20:04 +02:00
|
|
|
$pltcl->AddIncludeDir($solution->{options}->{tcl} . '\include');
|
|
|
|
$pltcl->AddReference($postgres);
|
|
|
|
if (-e $solution->{options}->{tcl} . '\lib\tcl85.lib')
|
|
|
|
{
|
2012-07-05 03:47:49 +02:00
|
|
|
$pltcl->AddLibrary(
|
|
|
|
$solution->{options}->{tcl} . '\lib\tcl85.lib');
|
2012-06-10 21:20:04 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2012-07-05 03:47:49 +02:00
|
|
|
$pltcl->AddLibrary(
|
|
|
|
$solution->{options}->{tcl} . '\lib\tcl84.lib');
|
2012-06-10 21:20:04 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-07-05 03:47:49 +02:00
|
|
|
$libpq = $solution->AddProject('libpq', 'dll', 'interfaces',
|
|
|
|
'src\interfaces\libpq');
|
2012-06-10 21:20:04 +02:00
|
|
|
$libpq->AddDefine('FRONTEND');
|
|
|
|
$libpq->AddDefine('UNSAFE_STAT_OK');
|
|
|
|
$libpq->AddIncludeDir('src\port');
|
|
|
|
$libpq->AddLibrary('secur32.lib');
|
|
|
|
$libpq->AddLibrary('ws2_32.lib');
|
|
|
|
$libpq->AddLibrary('wldap32.lib') if ($solution->{options}->{ldap});
|
|
|
|
$libpq->UseDef('src\interfaces\libpq\libpqdll.def');
|
2012-07-05 03:47:49 +02:00
|
|
|
$libpq->ReplaceFile('src\interfaces\libpq\libpqrc.c',
|
|
|
|
'src\interfaces\libpq\libpq.rc');
|
2012-06-10 21:20:04 +02:00
|
|
|
$libpq->AddReference($libpgport);
|
|
|
|
|
2012-07-05 03:47:49 +02:00
|
|
|
my $libpqwalreceiver =
|
|
|
|
$solution->AddProject('libpqwalreceiver', 'dll', '',
|
2012-06-10 21:20:04 +02:00
|
|
|
'src\backend\replication\libpqwalreceiver');
|
|
|
|
$libpqwalreceiver->AddIncludeDir('src\interfaces\libpq');
|
2012-07-05 03:47:49 +02:00
|
|
|
$libpqwalreceiver->AddReference($postgres, $libpq);
|
2012-06-10 21:20:04 +02:00
|
|
|
|
2012-07-05 03:47:49 +02:00
|
|
|
my $pgtypes = $solution->AddProject(
|
|
|
|
'libpgtypes', 'dll',
|
|
|
|
'interfaces', 'src\interfaces\ecpg\pgtypeslib');
|
2012-06-10 21:20:04 +02:00
|
|
|
$pgtypes->AddDefine('FRONTEND');
|
|
|
|
$pgtypes->AddReference($libpgport);
|
|
|
|
$pgtypes->UseDef('src\interfaces\ecpg\pgtypeslib\pgtypeslib.def');
|
|
|
|
$pgtypes->AddIncludeDir('src\interfaces\ecpg\include');
|
|
|
|
|
2012-07-05 03:47:49 +02:00
|
|
|
my $libecpg = $solution->AddProject('libecpg', 'dll', 'interfaces',
|
|
|
|
'src\interfaces\ecpg\ecpglib');
|
2012-06-10 21:20:04 +02:00
|
|
|
$libecpg->AddDefine('FRONTEND');
|
|
|
|
$libecpg->AddIncludeDir('src\interfaces\ecpg\include');
|
|
|
|
$libecpg->AddIncludeDir('src\interfaces\libpq');
|
|
|
|
$libecpg->AddIncludeDir('src\port');
|
|
|
|
$libecpg->UseDef('src\interfaces\ecpg\ecpglib\ecpglib.def');
|
2014-07-15 14:18:39 +02:00
|
|
|
$libecpg->AddLibrary('ws2_32.lib');
|
2012-07-05 03:47:49 +02:00
|
|
|
$libecpg->AddReference($libpq, $pgtypes, $libpgport);
|
2012-06-10 21:20:04 +02:00
|
|
|
|
2012-07-05 03:47:49 +02:00
|
|
|
my $libecpgcompat = $solution->AddProject(
|
|
|
|
'libecpg_compat', 'dll',
|
|
|
|
'interfaces', 'src\interfaces\ecpg\compatlib');
|
2012-06-10 21:20:04 +02:00
|
|
|
$libecpgcompat->AddIncludeDir('src\interfaces\ecpg\include');
|
|
|
|
$libecpgcompat->AddIncludeDir('src\interfaces\libpq');
|
|
|
|
$libecpgcompat->UseDef('src\interfaces\ecpg\compatlib\compatlib.def');
|
2012-07-05 03:47:49 +02:00
|
|
|
$libecpgcompat->AddReference($pgtypes, $libecpg, $libpgport);
|
2012-06-10 21:20:04 +02:00
|
|
|
|
2012-07-05 03:47:49 +02:00
|
|
|
my $ecpg = $solution->AddProject('ecpg', 'exe', 'interfaces',
|
|
|
|
'src\interfaces\ecpg\preproc');
|
2012-06-10 21:20:04 +02:00
|
|
|
$ecpg->AddIncludeDir('src\interfaces\ecpg\include');
|
|
|
|
$ecpg->AddIncludeDir('src\interfaces\libpq');
|
|
|
|
$ecpg->AddPrefixInclude('src\interfaces\ecpg\preproc');
|
2012-07-05 03:47:49 +02:00
|
|
|
$ecpg->AddFiles('src\interfaces\ecpg\preproc', 'pgc.l', 'preproc.y');
|
2012-06-10 21:20:04 +02:00
|
|
|
$ecpg->AddDefine('MAJOR_VERSION=4');
|
2014-06-11 03:40:21 +02:00
|
|
|
$ecpg->AddDefine('MINOR_VERSION=11');
|
2012-06-14 04:06:26 +02:00
|
|
|
$ecpg->AddDefine('PATCHLEVEL=0');
|
2012-06-10 21:20:04 +02:00
|
|
|
$ecpg->AddDefine('ECPG_COMPILE');
|
2013-10-18 14:15:20 +02:00
|
|
|
$ecpg->AddReference($libpgcommon, $libpgport);
|
2012-06-10 21:20:04 +02:00
|
|
|
|
2012-07-05 03:47:49 +02:00
|
|
|
my $pgregress_ecpg =
|
|
|
|
$solution->AddProject('pg_regress_ecpg', 'exe', 'misc');
|
2012-06-10 21:20:04 +02:00
|
|
|
$pgregress_ecpg->AddFile('src\interfaces\ecpg\test\pg_regress_ecpg.c');
|
|
|
|
$pgregress_ecpg->AddFile('src\test\regress\pg_regress.c');
|
|
|
|
$pgregress_ecpg->AddIncludeDir('src\port');
|
|
|
|
$pgregress_ecpg->AddIncludeDir('src\test\regress');
|
|
|
|
$pgregress_ecpg->AddDefine('HOST_TUPLE="i686-pc-win32vc"');
|
|
|
|
$pgregress_ecpg->AddDefine('FRONTEND');
|
2013-10-18 14:15:20 +02:00
|
|
|
$pgregress_ecpg->AddReference($libpgcommon, $libpgport);
|
2012-06-10 21:20:04 +02:00
|
|
|
|
2012-07-05 03:47:49 +02:00
|
|
|
my $isolation_tester =
|
|
|
|
$solution->AddProject('isolationtester', 'exe', 'misc');
|
2012-06-10 21:20:04 +02:00
|
|
|
$isolation_tester->AddFile('src\test\isolation\isolationtester.c');
|
|
|
|
$isolation_tester->AddFile('src\test\isolation\specparse.y');
|
|
|
|
$isolation_tester->AddFile('src\test\isolation\specscanner.l');
|
|
|
|
$isolation_tester->AddFile('src\test\isolation\specparse.c');
|
|
|
|
$isolation_tester->AddIncludeDir('src\test\isolation');
|
|
|
|
$isolation_tester->AddIncludeDir('src\port');
|
|
|
|
$isolation_tester->AddIncludeDir('src\test\regress');
|
|
|
|
$isolation_tester->AddIncludeDir('src\interfaces\libpq');
|
|
|
|
$isolation_tester->AddDefine('HOST_TUPLE="i686-pc-win32vc"');
|
|
|
|
$isolation_tester->AddDefine('FRONTEND');
|
2014-07-15 14:18:39 +02:00
|
|
|
$isolation_tester->AddLibrary('ws2_32.lib');
|
2013-10-18 15:54:41 +02:00
|
|
|
$isolation_tester->AddReference($libpq, $libpgcommon, $libpgport);
|
2012-06-10 21:20:04 +02:00
|
|
|
|
2012-07-05 03:47:49 +02:00
|
|
|
my $pgregress_isolation =
|
|
|
|
$solution->AddProject('pg_isolation_regress', 'exe', 'misc');
|
2012-06-10 21:20:04 +02:00
|
|
|
$pgregress_isolation->AddFile('src\test\isolation\isolation_main.c');
|
|
|
|
$pgregress_isolation->AddFile('src\test\regress\pg_regress.c');
|
|
|
|
$pgregress_isolation->AddIncludeDir('src\port');
|
|
|
|
$pgregress_isolation->AddIncludeDir('src\test\regress');
|
|
|
|
$pgregress_isolation->AddDefine('HOST_TUPLE="i686-pc-win32vc"');
|
|
|
|
$pgregress_isolation->AddDefine('FRONTEND');
|
2013-10-18 14:15:20 +02:00
|
|
|
$pgregress_isolation->AddReference($libpgcommon, $libpgport);
|
2012-06-10 21:20:04 +02:00
|
|
|
|
|
|
|
# src/bin
|
|
|
|
my $initdb = AddSimpleFrontend('initdb');
|
|
|
|
$initdb->AddIncludeDir('src\interfaces\libpq');
|
|
|
|
$initdb->AddIncludeDir('src\timezone');
|
|
|
|
$initdb->AddDefine('FRONTEND');
|
|
|
|
$initdb->AddLibrary('ws2_32.lib');
|
|
|
|
|
|
|
|
my $pgbasebackup = AddSimpleFrontend('pg_basebackup', 1);
|
|
|
|
$pgbasebackup->AddFile('src\bin\pg_basebackup\pg_basebackup.c');
|
|
|
|
$pgbasebackup->AddLibrary('ws2_32.lib');
|
|
|
|
|
|
|
|
my $pgreceivexlog = AddSimpleFrontend('pg_basebackup', 1);
|
|
|
|
$pgreceivexlog->{name} = 'pg_receivexlog';
|
|
|
|
$pgreceivexlog->AddFile('src\bin\pg_basebackup\pg_receivexlog.c');
|
|
|
|
$pgreceivexlog->AddLibrary('ws2_32.lib');
|
|
|
|
|
2014-05-06 18:12:18 +02:00
|
|
|
my $pgrecvlogical = AddSimpleFrontend('pg_basebackup', 1);
|
2014-04-24 09:30:44 +02:00
|
|
|
$pgrecvlogical->{name} = 'pg_recvlogical';
|
|
|
|
$pgrecvlogical->AddFile('src\bin\pg_basebackup\pg_recvlogical.c');
|
|
|
|
$pgrecvlogical->AddLibrary('ws2_32.lib');
|
|
|
|
|
2012-06-10 21:20:04 +02:00
|
|
|
my $pgconfig = AddSimpleFrontend('pg_config');
|
|
|
|
|
|
|
|
my $pgcontrol = AddSimpleFrontend('pg_controldata');
|
|
|
|
|
|
|
|
my $pgctl = AddSimpleFrontend('pg_ctl', 1);
|
|
|
|
|
|
|
|
my $pgreset = AddSimpleFrontend('pg_resetxlog');
|
|
|
|
|
2012-07-05 03:47:49 +02:00
|
|
|
my $pgevent = $solution->AddProject('pgevent', 'dll', 'bin');
|
|
|
|
$pgevent->AddFiles('src\bin\pgevent', 'pgevent.c', 'pgmsgevent.rc');
|
2014-07-14 20:07:41 +02:00
|
|
|
$pgevent->AddResourceFile('src\bin\pgevent', 'Eventlog message formatter',
|
|
|
|
'win32');
|
2012-06-10 21:20:04 +02:00
|
|
|
$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->AddIncludeDir('src\backend');
|
|
|
|
$psql->AddFile('src\bin\psql\psqlscan.l');
|
2013-03-24 16:27:20 +01:00
|
|
|
$psql->AddLibrary('ws2_32.lib');
|
2012-06-10 21:20:04 +02:00
|
|
|
|
|
|
|
my $pgdump = AddSimpleFrontend('pg_dump', 1);
|
|
|
|
$pgdump->AddIncludeDir('src\backend');
|
|
|
|
$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');
|
|
|
|
$pgdump->AddFile('src\bin\pg_dump\keywords.c');
|
|
|
|
$pgdump->AddFile('src\backend\parser\kwlookup.c');
|
2013-03-24 16:27:20 +01:00
|
|
|
$pgdump->AddLibrary('ws2_32.lib');
|
2012-06-10 21:20:04 +02:00
|
|
|
|
|
|
|
my $pgdumpall = AddSimpleFrontend('pg_dump', 1);
|
|
|
|
|
|
|
|
# pg_dumpall doesn't use the files in the Makefile's $(OBJS), unlike
|
|
|
|
# pg_dump and pg_restore.
|
|
|
|
# So remove their sources from the object, keeping the other setup that
|
|
|
|
# AddSimpleFrontend() has done.
|
2012-07-05 03:47:49 +02:00
|
|
|
my @nodumpall = grep { m/src\\bin\\pg_dump\\.*\.c$/ }
|
|
|
|
keys %{ $pgdumpall->{files} };
|
|
|
|
delete @{ $pgdumpall->{files} }{@nodumpall};
|
2012-06-10 21:20:04 +02:00
|
|
|
$pgdumpall->{name} = 'pg_dumpall';
|
|
|
|
$pgdumpall->AddIncludeDir('src\backend');
|
|
|
|
$pgdumpall->AddFile('src\bin\pg_dump\pg_dumpall.c');
|
|
|
|
$pgdumpall->AddFile('src\bin\pg_dump\dumputils.c');
|
|
|
|
$pgdumpall->AddFile('src\bin\pg_dump\keywords.c');
|
|
|
|
$pgdumpall->AddFile('src\backend\parser\kwlookup.c');
|
2013-03-24 16:27:20 +01:00
|
|
|
$pgdumpall->AddLibrary('ws2_32.lib');
|
2012-06-10 21:20:04 +02:00
|
|
|
|
|
|
|
my $pgrestore = AddSimpleFrontend('pg_dump', 1);
|
|
|
|
$pgrestore->{name} = 'pg_restore';
|
|
|
|
$pgrestore->AddIncludeDir('src\backend');
|
|
|
|
$pgrestore->AddFile('src\bin\pg_dump\pg_restore.c');
|
|
|
|
$pgrestore->AddFile('src\bin\pg_dump\keywords.c');
|
|
|
|
$pgrestore->AddFile('src\backend\parser\kwlookup.c');
|
2013-03-24 16:27:20 +01:00
|
|
|
$pgrestore->AddLibrary('ws2_32.lib');
|
2012-06-10 21:20:04 +02:00
|
|
|
|
2012-07-05 03:47:49 +02:00
|
|
|
my $zic = $solution->AddProject('zic', 'exe', 'utils');
|
|
|
|
$zic->AddFiles('src\timezone', 'zic.c', 'ialloc.c', 'scheck.c',
|
|
|
|
'localtime.c');
|
2013-10-18 14:15:20 +02:00
|
|
|
$zic->AddReference($libpgcommon, $libpgport);
|
2012-06-10 21:20:04 +02:00
|
|
|
|
|
|
|
if ($solution->{options}->{xml})
|
|
|
|
{
|
|
|
|
$contrib_extraincludes->{'pgxml'} = [
|
|
|
|
$solution->{options}->{xml} . '\include',
|
|
|
|
$solution->{options}->{xslt} . '\include',
|
2012-07-05 03:47:49 +02:00
|
|
|
$solution->{options}->{iconv} . '\include' ];
|
2012-06-10 21:20:04 +02:00
|
|
|
|
|
|
|
$contrib_extralibs->{'pgxml'} = [
|
|
|
|
$solution->{options}->{xml} . '\lib\libxml2.lib',
|
2012-07-05 03:47:49 +02:00
|
|
|
$solution->{options}->{xslt} . '\lib\libxslt.lib' ];
|
2012-06-10 21:20:04 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2012-07-05 03:47:49 +02:00
|
|
|
push @contrib_excludes, 'xml2';
|
2012-06-10 21:20:04 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
if (!$solution->{options}->{openssl})
|
|
|
|
{
|
2012-07-05 03:47:49 +02:00
|
|
|
push @contrib_excludes, 'sslinfo';
|
2012-06-10 21:20:04 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
if ($solution->{options}->{uuid})
|
|
|
|
{
|
|
|
|
$contrib_extraincludes->{'uuid-ossp'} =
|
|
|
|
[ $solution->{options}->{uuid} . '\include' ];
|
|
|
|
$contrib_extralibs->{'uuid-ossp'} =
|
|
|
|
[ $solution->{options}->{uuid} . '\lib\uuid.lib' ];
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2012-07-05 03:47:49 +02:00
|
|
|
push @contrib_excludes, 'uuid-ossp';
|
2012-06-10 21:20:04 +02:00
|
|
|
}
|
|
|
|
|
2014-07-14 20:07:21 +02:00
|
|
|
# AddProject() does not recognize the constructs used to populate OBJS in
|
|
|
|
# the pgcrypto Makefile, so it will discover no files.
|
|
|
|
my $pgcrypto =
|
|
|
|
$solution->AddProject('pgcrypto', 'dll', 'crypto', 'contrib\\pgcrypto');
|
2012-06-10 21:20:04 +02:00
|
|
|
$pgcrypto->AddFiles(
|
2012-07-05 03:47:49 +02:00
|
|
|
'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');
|
2012-06-10 21:20:04 +02:00
|
|
|
if ($solution->{options}->{openssl})
|
|
|
|
{
|
2012-07-05 03:47:49 +02:00
|
|
|
$pgcrypto->AddFiles('contrib\pgcrypto', 'openssl.c',
|
|
|
|
'pgp-mpi-openssl.c');
|
2012-06-10 21:20:04 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
$pgcrypto->AddFiles(
|
2012-07-05 03:47:49 +02:00
|
|
|
'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');
|
2012-06-10 21:20:04 +02:00
|
|
|
}
|
|
|
|
$pgcrypto->AddReference($postgres);
|
2014-07-15 14:18:39 +02:00
|
|
|
$pgcrypto->AddLibrary('ws2_32.lib');
|
2012-06-10 21:20:04 +02:00
|
|
|
my $mf = Project::read_file('contrib/pgcrypto/Makefile');
|
|
|
|
GenerateContribSqlFiles('pgcrypto', $mf);
|
|
|
|
|
|
|
|
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");
|
2012-07-05 03:47:49 +02:00
|
|
|
next if (grep { /^$d$/ } @contrib_excludes);
|
2012-06-10 21:20:04 +02:00
|
|
|
AddContrib($d);
|
|
|
|
}
|
|
|
|
closedir($D);
|
|
|
|
|
2012-07-05 03:47:49 +02:00
|
|
|
$mf =
|
|
|
|
Project::read_file('src\backend\utils\mb\conversion_procs\Makefile');
|
2014-07-14 20:07:27 +02:00
|
|
|
$mf =~ s{\\\r?\n}{}g;
|
2012-07-05 03:47:49 +02:00
|
|
|
$mf =~ m{SUBDIRS\s*=\s*(.*)$}m
|
|
|
|
|| die 'Could not match in conversion makefile' . "\n";
|
|
|
|
foreach my $sub (split /\s+/, $1)
|
2012-06-10 21:20:04 +02:00
|
|
|
{
|
2014-07-14 20:07:21 +02:00
|
|
|
my $dir = 'src\backend\utils\mb\conversion_procs\\' . $sub;
|
|
|
|
my $p = $solution->AddProject($sub, 'dll', 'conversion procs', $dir);
|
|
|
|
$p->AddFile("$dir\\$sub.c"); # implicit source file
|
2012-06-10 21:20:04 +02:00
|
|
|
$p->AddReference($postgres);
|
|
|
|
}
|
|
|
|
|
|
|
|
$mf = Project::read_file('src\bin\scripts\Makefile');
|
2014-07-14 20:07:27 +02:00
|
|
|
$mf =~ s{\\\r?\n}{}g;
|
2012-07-05 03:47:49 +02:00
|
|
|
$mf =~ m{PROGRAMS\s*=\s*(.*)$}m
|
|
|
|
|| die 'Could not match in bin\scripts\Makefile' . "\n";
|
|
|
|
foreach my $prg (split /\s+/, $1)
|
2012-06-10 21:20:04 +02:00
|
|
|
{
|
2012-07-05 03:47:49 +02:00
|
|
|
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;
|
2012-06-10 21:20:04 +02:00
|
|
|
foreach my $f (@files)
|
|
|
|
{
|
|
|
|
$f =~ s/\.o$/\.c/;
|
|
|
|
if ($f eq 'keywords.c')
|
|
|
|
{
|
|
|
|
$proj->AddFile('src\bin\pg_dump\keywords.c');
|
|
|
|
}
|
|
|
|
elsif ($f eq 'kwlookup.c')
|
|
|
|
{
|
|
|
|
$proj->AddFile('src\backend\parser\kwlookup.c');
|
|
|
|
}
|
|
|
|
elsif ($f eq 'dumputils.c')
|
|
|
|
{
|
|
|
|
$proj->AddFile('src\bin\pg_dump\dumputils.c');
|
|
|
|
}
|
|
|
|
elsif ($f =~ /print\.c$/)
|
2012-07-05 03:47:49 +02:00
|
|
|
{ # Also catches mbprint.c
|
2012-06-10 21:20:04 +02:00
|
|
|
$proj->AddFile('src\bin\psql\\' . $f);
|
|
|
|
}
|
|
|
|
elsif ($f =~ /\.c$/)
|
|
|
|
{
|
|
|
|
$proj->AddFile('src\bin\scripts\\' . $f);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
$proj->AddIncludeDir('src\interfaces\libpq');
|
|
|
|
$proj->AddIncludeDir('src\bin\pg_dump');
|
|
|
|
$proj->AddIncludeDir('src\bin\psql');
|
2013-10-18 14:15:20 +02:00
|
|
|
$proj->AddReference($libpq, $libpgcommon, $libpgport);
|
2014-07-14 20:07:41 +02:00
|
|
|
$proj->AddResourceFile('src\bin\scripts', 'PostgreSQL Utility',
|
|
|
|
'win32');
|
2013-03-24 16:27:20 +01:00
|
|
|
$proj->AddLibrary('ws2_32.lib');
|
2012-06-10 21:20:04 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
# Regression DLL and EXE
|
2012-07-05 03:47:49 +02:00
|
|
|
my $regress = $solution->AddProject('regress', 'dll', 'misc');
|
2012-06-10 21:20:04 +02:00
|
|
|
$regress->AddFile('src\test\regress\regress.c');
|
|
|
|
$regress->AddReference($postgres);
|
|
|
|
|
2012-07-05 03:47:49 +02:00
|
|
|
my $pgregress = $solution->AddProject('pg_regress', 'exe', 'misc');
|
2012-06-10 21:20:04 +02:00
|
|
|
$pgregress->AddFile('src\test\regress\pg_regress.c');
|
|
|
|
$pgregress->AddFile('src\test\regress\pg_regress_main.c');
|
|
|
|
$pgregress->AddIncludeDir('src\port');
|
|
|
|
$pgregress->AddDefine('HOST_TUPLE="i686-pc-win32vc"');
|
2013-10-18 14:15:20 +02:00
|
|
|
$pgregress->AddReference($libpgcommon, $libpgport);
|
2012-06-10 21:20:04 +02:00
|
|
|
|
2013-02-25 18:00:53 +01:00
|
|
|
# fix up pg_xlogdump once it's been set up
|
|
|
|
# files symlinked on Unix are copied on windows
|
2013-05-29 22:58:43 +02:00
|
|
|
my $pg_xlogdump =
|
|
|
|
(grep { $_->{name} eq 'pg_xlogdump' }
|
|
|
|
@{ $solution->{projects}->{contrib} })[0];
|
2013-02-25 02:28:42 +01:00
|
|
|
$pg_xlogdump->AddDefine('FRONTEND');
|
2013-05-29 22:58:43 +02:00
|
|
|
foreach my $xf (glob('src/backend/access/rmgrdesc/*desc.c'))
|
2013-02-25 18:00:53 +01:00
|
|
|
{
|
|
|
|
my $bf = basename $xf;
|
2013-05-29 22:58:43 +02:00
|
|
|
copy($xf, "contrib/pg_xlogdump/$bf");
|
2013-02-25 18:00:53 +01:00
|
|
|
$pg_xlogdump->AddFile("contrib\\pg_xlogdump\\$bf");
|
|
|
|
}
|
2013-05-29 22:58:43 +02:00
|
|
|
copy(
|
|
|
|
'src/backend/access/transam/xlogreader.c',
|
|
|
|
'contrib/pg_xlogdump/xlogreader.c');
|
2013-02-25 02:28:42 +01:00
|
|
|
|
2012-06-10 21:20:04 +02:00
|
|
|
$solution->Save();
|
|
|
|
return $solution->{vcver};
|
2007-03-17 14:50:42 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
#####################
|
|
|
|
# Utility functions #
|
|
|
|
#####################
|
|
|
|
|
|
|
|
# Add a simple frontend project (exe)
|
|
|
|
sub AddSimpleFrontend
|
|
|
|
{
|
2012-07-05 03:47:49 +02:00
|
|
|
my $n = shift;
|
|
|
|
my $uselibpq = shift;
|
2012-06-10 21:20:04 +02:00
|
|
|
|
2012-07-05 03:47:49 +02:00
|
|
|
my $p = $solution->AddProject($n, 'exe', 'bin');
|
2012-06-10 21:20:04 +02:00
|
|
|
$p->AddDir('src\bin\\' . $n);
|
2013-10-18 14:15:20 +02:00
|
|
|
$p->AddReference($libpgcommon, $libpgport);
|
2012-06-10 21:20:04 +02:00
|
|
|
if ($uselibpq)
|
|
|
|
{
|
|
|
|
$p->AddIncludeDir('src\interfaces\libpq');
|
|
|
|
$p->AddReference($libpq);
|
|
|
|
}
|
|
|
|
return $p;
|
2007-03-17 14:50:42 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
# Add a simple contrib project
|
|
|
|
sub AddContrib
|
|
|
|
{
|
2012-07-05 03:47:49 +02:00
|
|
|
my $n = shift;
|
2012-06-10 21:20:04 +02:00
|
|
|
my $mf = Project::read_file('contrib\\' . $n . '\Makefile');
|
|
|
|
|
|
|
|
if ($mf =~ /^MODULE_big\s*=\s*(.*)$/mg)
|
|
|
|
{
|
|
|
|
my $dn = $1;
|
2014-07-14 20:07:21 +02:00
|
|
|
my $proj =
|
|
|
|
$solution->AddProject($dn, 'dll', 'contrib', 'contrib\\' . $n);
|
2012-06-10 21:20:04 +02:00
|
|
|
$proj->AddReference($postgres);
|
|
|
|
AdjustContribProj($proj);
|
|
|
|
}
|
|
|
|
elsif ($mf =~ /^MODULES\s*=\s*(.*)$/mg)
|
|
|
|
{
|
|
|
|
foreach my $mod (split /\s+/, $1)
|
|
|
|
{
|
2014-07-14 20:07:21 +02:00
|
|
|
my $proj =
|
|
|
|
$solution->AddProject($mod, 'dll', 'contrib', 'contrib\\' . $n);
|
2012-06-10 21:20:04 +02:00
|
|
|
$proj->AddFile('contrib\\' . $n . '\\' . $mod . '.c');
|
|
|
|
$proj->AddReference($postgres);
|
|
|
|
AdjustContribProj($proj);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
elsif ($mf =~ /^PROGRAM\s*=\s*(.*)$/mg)
|
|
|
|
{
|
2014-07-14 20:07:21 +02:00
|
|
|
my $proj =
|
|
|
|
$solution->AddProject($1, 'exe', 'contrib', 'contrib\\' . $n);
|
2012-06-10 21:20:04 +02:00
|
|
|
AdjustContribProj($proj);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
croak "Could not determine contrib module type for $n\n";
|
|
|
|
}
|
|
|
|
|
|
|
|
# Are there any output data files to build?
|
|
|
|
GenerateContribSqlFiles($n, $mf);
|
2007-03-23 10:53:33 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
sub GenerateContribSqlFiles
|
|
|
|
{
|
2012-07-05 03:47:49 +02:00
|
|
|
my $n = shift;
|
2012-06-10 21:20:04 +02:00
|
|
|
my $mf = shift;
|
2014-07-14 20:07:27 +02:00
|
|
|
$mf =~ s{\\\r?\n}{}g;
|
2012-06-10 21:20:04 +02:00
|
|
|
if ($mf =~ /^DATA_built\s*=\s*(.*)$/mg)
|
|
|
|
{
|
|
|
|
my $l = $1;
|
|
|
|
|
|
|
|
# Strip out $(addsuffix) rules
|
|
|
|
if (index($l, '$(addsuffix ') >= 0)
|
|
|
|
{
|
|
|
|
my $pcount = 0;
|
|
|
|
my $i;
|
|
|
|
for ($i = index($l, '$(addsuffix ') + 12; $i < length($l); $i++)
|
|
|
|
{
|
|
|
|
$pcount++ if (substr($l, $i, 1) eq '(');
|
|
|
|
$pcount-- if (substr($l, $i, 1) eq ')');
|
2012-07-05 03:47:49 +02:00
|
|
|
last if ($pcount < 0);
|
2012-06-10 21:20:04 +02:00
|
|
|
}
|
2012-07-05 03:47:49 +02:00
|
|
|
$l =
|
|
|
|
substr($l, 0, index($l, '$(addsuffix ')) . substr($l, $i + 1);
|
2012-06-10 21:20:04 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
foreach my $d (split /\s+/, $l)
|
|
|
|
{
|
2012-07-05 03:47:49 +02:00
|
|
|
my $in = "$d.in";
|
2012-06-10 21:20:04 +02:00
|
|
|
my $out = "$d";
|
|
|
|
|
|
|
|
if (Solution::IsNewer("contrib/$n/$out", "contrib/$n/$in"))
|
|
|
|
{
|
|
|
|
print "Building $out from $in (contrib/$n)...\n";
|
|
|
|
my $cont = Project::read_file("contrib/$n/$in");
|
2012-07-05 03:47:49 +02:00
|
|
|
my $dn = $out;
|
|
|
|
$dn =~ s/\.sql$//;
|
2012-06-10 21:20:04 +02:00
|
|
|
$cont =~ s/MODULE_PATHNAME/\$libdir\/$dn/g;
|
|
|
|
my $o;
|
2012-07-05 03:47:49 +02:00
|
|
|
open($o, ">contrib/$n/$out")
|
2012-06-10 21:20:04 +02:00
|
|
|
|| croak "Could not write to contrib/$n/$d";
|
|
|
|
print $o $cont;
|
|
|
|
close($o);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2007-03-17 14:50:42 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
sub AdjustContribProj
|
|
|
|
{
|
2012-06-10 21:20:04 +02:00
|
|
|
my $proj = shift;
|
2012-07-05 03:47:49 +02:00
|
|
|
my $n = $proj->{name};
|
2012-06-10 21:20:04 +02:00
|
|
|
|
|
|
|
if ($contrib_defines->{$n})
|
|
|
|
{
|
|
|
|
foreach my $d ($contrib_defines->{$n})
|
|
|
|
{
|
|
|
|
$proj->AddDefine($d);
|
|
|
|
}
|
|
|
|
}
|
2012-07-05 03:47:49 +02:00
|
|
|
if (grep { /^$n$/ } @contrib_uselibpq)
|
2012-06-10 21:20:04 +02:00
|
|
|
{
|
|
|
|
$proj->AddIncludeDir('src\interfaces\libpq');
|
|
|
|
$proj->AddReference($libpq);
|
|
|
|
}
|
2012-07-05 03:47:49 +02:00
|
|
|
if (grep { /^$n$/ } @contrib_uselibpgport)
|
2012-06-10 21:20:04 +02:00
|
|
|
{
|
|
|
|
$proj->AddReference($libpgport);
|
|
|
|
}
|
Create libpgcommon, and move pg_malloc et al to it
libpgcommon is a new static library to allow sharing code among the
various frontend programs and backend; this lets us eliminate duplicate
implementations of common routines. We avoid libpgport, because that's
intended as a place for porting issues; per discussion, it seems better
to keep them separate.
The first use case, and the only implemented by this patch, is pg_malloc
and friends, which many frontend programs were already using.
At the same time, we can use this to provide palloc emulation functions
for the frontend; this way, some palloc-using files in the backend can
also be used by the frontend cleanly. To do this, we change palloc() in
the backend to be a function instead of a macro on top of
MemoryContextAlloc(). This was previously believed to cause loss of
performance, but this implementation has been tweaked by Tom and Andres
so that on modern compilers it provides a slight improvement over the
previous one.
This lets us clean up some places that were already with
localized hacks.
Most of the pg_malloc/palloc changes in this patch were authored by
Andres Freund. Zoltán Böszörményi also independently provided a form of
that. libpgcommon infrastructure was authored by Álvaro.
2013-02-12 14:33:40 +01:00
|
|
|
if (grep { /^$n$/ } @contrib_uselibpgcommon)
|
|
|
|
{
|
|
|
|
$proj->AddReference($libpgcommon);
|
|
|
|
}
|
2012-06-10 21:20:04 +02:00
|
|
|
if ($contrib_extralibs->{$n})
|
|
|
|
{
|
2012-07-05 03:47:49 +02:00
|
|
|
foreach my $l (@{ $contrib_extralibs->{$n} })
|
2012-06-10 21:20:04 +02:00
|
|
|
{
|
|
|
|
$proj->AddLibrary($l);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ($contrib_extraincludes->{$n})
|
|
|
|
{
|
2012-07-05 03:47:49 +02:00
|
|
|
foreach my $i (@{ $contrib_extraincludes->{$n} })
|
2012-06-10 21:20:04 +02:00
|
|
|
{
|
|
|
|
$proj->AddIncludeDir($i);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ($contrib_extrasource->{$n})
|
|
|
|
{
|
2012-07-05 03:47:49 +02:00
|
|
|
$proj->AddFiles('contrib\\' . $n, @{ $contrib_extrasource->{$n} });
|
2012-06-10 21:20:04 +02:00
|
|
|
}
|
2007-03-17 14:50:42 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
1;
|