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;
|
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;
|
|
|
|
|
2015-03-11 14:21:01 +01:00
|
|
|
# Set of variables for contrib modules
|
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 = {
|
2015-03-11 14:21:01 +01:00
|
|
|
'cube' => [ 'contrib\cube\cubescan.l', 'contrib\cube\cubeparse.y' ],
|
|
|
|
'pgbench' =>
|
|
|
|
[ 'contrib\pgbench\exprscan.l', 'contrib\pgbench\exprparse.y' ],
|
|
|
|
'seg' => [ 'contrib\seg\segscan.l', 'contrib\seg\segparse.y' ], };
|
2012-07-05 03:47:49 +02:00
|
|
|
my @contrib_excludes = ('pgcrypto', 'intagg', 'sepgsql');
|
2007-03-17 14:50:42 +01:00
|
|
|
|
2015-03-11 14:21:01 +01:00
|
|
|
# Set of variables for frontend modules
|
|
|
|
my $frontend_defines = { 'initdb' => 'FRONTEND' };
|
|
|
|
my @frontend_uselibpq = ('pg_ctl', 'psql');
|
|
|
|
my $frontend_extralibs = {
|
|
|
|
'initdb' => ['ws2_32.lib'],
|
|
|
|
'pg_restore' => ['ws2_32.lib'],
|
|
|
|
'psql' => ['ws2_32.lib'] };
|
|
|
|
my $frontend_extraincludes = {
|
|
|
|
'initdb' => ['src\timezone'],
|
|
|
|
'psql' => [ 'src\bin\pg_dump', 'src\backend' ] };
|
|
|
|
my $frontend_extrasource = { 'psql' => ['src\bin\psql\psqlscan.l'] };
|
|
|
|
my @frontend_excludes = ('pgevent', 'pg_basebackup', 'pg_dump', 'scripts');
|
|
|
|
|
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
|
2015-02-09 21:13:50 +01:00
|
|
|
pgcheckdir.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(
|
2015-02-09 21:13:50 +01:00
|
|
|
exec.c pg_crc.c pg_lzcompress.c pgfnames.c psprintf.c relpath.c rmtree.c
|
2015-02-09 07:15:24 +01:00
|
|
|
string.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');
|
2015-03-11 14:21:01 +01:00
|
|
|
|
2014-08-19 04:59:53 +02:00
|
|
|
# We need source files from src\timezone, but that directory's resource
|
|
|
|
# file pertains to "zic", not to the backend.
|
|
|
|
$postgres->RemoveFile('src\timezone\win32ver.rc');
|
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');
|
2015-03-11 14:21:01 +01:00
|
|
|
|
|
|
|
# The OBJS scraper doesn't know about ifdefs, so remove be-secure-openssl.c
|
|
|
|
# if building without OpenSSL
|
Break out OpenSSL-specific code to separate files.
This refactoring is in preparation for adding support for other SSL
implementations, with no user-visible effects. There are now two #defines,
USE_OPENSSL which is defined when building with OpenSSL, and USE_SSL which
is defined when building with any SSL implementation. Currently, OpenSSL is
the only implementation so the two #defines go together, but USE_SSL is
supposed to be used for implementation-independent code.
The libpq SSL code is changed to use a custom BIO, which does all the raw
I/O, like we've been doing in the backend for a long time. That makes it
possible to use MSG_NOSIGNAL to block SIGPIPE when using SSL, which avoids
a couple of syscall for each send(). Probably doesn't make much performance
difference in practice - the SSL encryption is expensive enough to mask the
effect - but it was a natural result of this refactoring.
Based on a patch by Martijn van Oosterhout from 2006. Briefly reviewed by
Alvaro Herrera, Andreas Karlsson, Jeff Janes.
2014-08-11 10:54:19 +02:00
|
|
|
if (!$solution->{options}->{openssl})
|
|
|
|
{
|
|
|
|
$postgres->RemoveFile('src\backend\libpq\be-secure-openssl.c');
|
|
|
|
}
|
2012-06-10 21:20:04 +02:00
|
|
|
|
2012-07-05 03:47:49 +02:00
|
|
|
my $snowball = $solution->AddProject('dict_snowball', 'dll', '',
|
|
|
|
'src\backend\snowball');
|
2015-03-11 14:21:01 +01:00
|
|
|
|
2014-08-19 04:59:53 +02:00
|
|
|
# This Makefile uses VPATH to find most source files in a subdirectory.
|
2012-06-10 21:20:04 +02:00
|
|
|
$snowball->RelocateFiles(
|
|
|
|
'src\backend\snowball\libstemmer',
|
|
|
|
sub {
|
2014-08-19 04:59:53 +02:00
|
|
|
return shift !~ /(dict_snowball.c|win32ver.rc)$/;
|
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);
|
2015-03-11 14:21:01 +01:00
|
|
|
|
|
|
|
# The OBJS scraper doesn't know about ifdefs, so remove fe-secure-openssl.c
|
|
|
|
# if building without OpenSSL
|
Break out OpenSSL-specific code to separate files.
This refactoring is in preparation for adding support for other SSL
implementations, with no user-visible effects. There are now two #defines,
USE_OPENSSL which is defined when building with OpenSSL, and USE_SSL which
is defined when building with any SSL implementation. Currently, OpenSSL is
the only implementation so the two #defines go together, but USE_SSL is
supposed to be used for implementation-independent code.
The libpq SSL code is changed to use a custom BIO, which does all the raw
I/O, like we've been doing in the backend for a long time. That makes it
possible to use MSG_NOSIGNAL to block SIGPIPE when using SSL, which avoids
a couple of syscall for each send(). Probably doesn't make much performance
difference in practice - the SSL encryption is expensive enough to mask the
effect - but it was a natural result of this refactoring.
Based on a patch by Martijn van Oosterhout from 2006. Briefly reviewed by
Alvaro Herrera, Andreas Karlsson, Jeff Janes.
2014-08-11 10:54:19 +02:00
|
|
|
if (!$solution->{options}->{openssl})
|
|
|
|
{
|
|
|
|
$libpq->RemoveFile('src\interfaces\libpq\fe-secure-openssl.c');
|
|
|
|
}
|
2012-06-10 21:20:04 +02:00
|
|
|
|
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');
|
2014-12-25 19:52:03 +01:00
|
|
|
$pgregress_ecpg->AddLibrary('ws2_32.lib');
|
2014-08-19 04:59:53 +02:00
|
|
|
$pgregress_ecpg->AddDirResourceFile('src\interfaces\ecpg\test');
|
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');
|
2014-08-19 04:59:53 +02:00
|
|
|
$isolation_tester->AddDirResourceFile('src\test\isolation');
|
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');
|
2014-12-25 19:52:03 +01:00
|
|
|
$pgregress_isolation->AddLibrary('ws2_32.lib');
|
2014-08-19 04:59:53 +02:00
|
|
|
$pgregress_isolation->AddDirResourceFile('src\test\isolation');
|
2013-10-18 14:15:20 +02:00
|
|
|
$pgregress_isolation->AddReference($libpgcommon, $libpgport);
|
2012-06-10 21:20:04 +02:00
|
|
|
|
|
|
|
# src/bin
|
2015-03-11 14:21:01 +01:00
|
|
|
my $D;
|
|
|
|
opendir($D, 'src/bin') || croak "Could not opendir on src/bin!\n";
|
|
|
|
while (my $d = readdir($D))
|
|
|
|
{
|
|
|
|
next if ($d =~ /^\./);
|
|
|
|
next unless (-f "src/bin/$d/Makefile");
|
|
|
|
next if (grep { /^$d$/ } @frontend_excludes);
|
|
|
|
AddSimpleFrontend($d);
|
|
|
|
}
|
2012-06-10 21:20:04 +02:00
|
|
|
|
|
|
|
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-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 $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');
|
2014-08-19 04:59:53 +02:00
|
|
|
$zic->AddDirResourceFile('src\timezone');
|
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);
|
|
|
|
|
|
|
|
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-08-19 04:59:53 +02:00
|
|
|
$proj->AddDirResourceFile('src\bin\scripts');
|
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');
|
2014-08-19 04:59:53 +02:00
|
|
|
$regress->AddDirResourceFile('src\test\regress');
|
2012-06-10 21:20:04 +02:00
|
|
|
$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"');
|
2014-12-25 19:52:03 +01:00
|
|
|
$pgregress->AddDefine('FRONTEND');
|
|
|
|
$pgregress->AddLibrary('ws2_32.lib');
|
2014-08-19 04:59:53 +02:00
|
|
|
$pgregress->AddDirResourceFile('src\test\regress');
|
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');
|
2015-03-21 10:53:47 +01:00
|
|
|
foreach my $xf (glob('src\\backend\\access\\rmgrdesc\\*desc.c'))
|
2013-02-25 18:00:53 +01:00
|
|
|
{
|
2015-03-21 10:53:47 +01:00
|
|
|
$pg_xlogdump->AddFile($xf)
|
2013-02-25 18:00:53 +01:00
|
|
|
}
|
2015-03-21 10:53:47 +01:00
|
|
|
$pg_xlogdump->AddFile('src\backend\access\transam\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);
|
|
|
|
}
|
2015-03-11 14:21:01 +01:00
|
|
|
|
|
|
|
# Adjust module definition using frontent variables
|
|
|
|
AdjustFrontendProj($p);
|
|
|
|
|
2012-06-10 21:20:04 +02:00
|
|
|
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;
|
2015-03-11 14:21:01 +01:00
|
|
|
$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;
|
2015-03-11 14:21:01 +01:00
|
|
|
AdjustModule(
|
|
|
|
$proj, $contrib_defines,
|
|
|
|
\@contrib_uselibpq, \@contrib_uselibpgport,
|
|
|
|
\@contrib_uselibpgcommon, $contrib_extralibs,
|
|
|
|
$contrib_extrasource, $contrib_extraincludes);
|
|
|
|
}
|
2012-06-10 21:20:04 +02:00
|
|
|
|
2015-03-11 14:21:01 +01:00
|
|
|
sub AdjustFrontendProj
|
|
|
|
{
|
|
|
|
my $proj = shift;
|
|
|
|
AdjustModule($proj, $frontend_defines, \@frontend_uselibpq, undef,
|
|
|
|
undef, $frontend_extralibs,
|
|
|
|
$frontend_extrasource, $frontend_extraincludes);
|
|
|
|
}
|
|
|
|
|
|
|
|
sub AdjustModule
|
|
|
|
{
|
|
|
|
my $proj = shift;
|
|
|
|
my $module_defines = shift;
|
|
|
|
my $module_uselibpq = shift;
|
|
|
|
my $module_uselibpgport = shift;
|
|
|
|
my $module_uselibpgcommon = shift;
|
|
|
|
my $module_extralibs = shift;
|
|
|
|
my $module_extrasource = shift;
|
|
|
|
my $module_extraincludes = shift;
|
|
|
|
my $n = $proj->{name};
|
|
|
|
|
|
|
|
if ($module_defines->{$n})
|
2012-06-10 21:20:04 +02:00
|
|
|
{
|
2015-03-11 14:21:01 +01:00
|
|
|
foreach my $d ($module_defines->{$n})
|
2012-06-10 21:20:04 +02:00
|
|
|
{
|
|
|
|
$proj->AddDefine($d);
|
|
|
|
}
|
|
|
|
}
|
2015-03-11 14:21:01 +01:00
|
|
|
if (grep { /^$n$/ } @{$module_uselibpq})
|
2012-06-10 21:20:04 +02:00
|
|
|
{
|
|
|
|
$proj->AddIncludeDir('src\interfaces\libpq');
|
|
|
|
$proj->AddReference($libpq);
|
|
|
|
}
|
2015-03-11 14:21:01 +01:00
|
|
|
if (grep { /^$n$/ } @{$module_uselibpgport})
|
2012-06-10 21:20:04 +02:00
|
|
|
{
|
|
|
|
$proj->AddReference($libpgport);
|
|
|
|
}
|
2015-03-11 14:21:01 +01:00
|
|
|
if (grep { /^$n$/ } @{$module_uselibpgcommon})
|
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
|
|
|
{
|
|
|
|
$proj->AddReference($libpgcommon);
|
|
|
|
}
|
2015-03-11 14:21:01 +01:00
|
|
|
if ($module_extralibs->{$n})
|
2012-06-10 21:20:04 +02:00
|
|
|
{
|
2015-03-11 14:21:01 +01:00
|
|
|
foreach my $l (@{ $module_extralibs->{$n} })
|
2012-06-10 21:20:04 +02:00
|
|
|
{
|
|
|
|
$proj->AddLibrary($l);
|
|
|
|
}
|
|
|
|
}
|
2015-03-11 14:21:01 +01:00
|
|
|
if ($module_extraincludes->{$n})
|
2012-06-10 21:20:04 +02:00
|
|
|
{
|
2015-03-11 14:21:01 +01:00
|
|
|
foreach my $i (@{ $module_extraincludes->{$n} })
|
2012-06-10 21:20:04 +02:00
|
|
|
{
|
|
|
|
$proj->AddIncludeDir($i);
|
|
|
|
}
|
|
|
|
}
|
2015-03-11 14:21:01 +01:00
|
|
|
if ($module_extrasource->{$n})
|
2012-06-10 21:20:04 +02:00
|
|
|
{
|
2015-03-11 14:21:01 +01:00
|
|
|
foreach my $i (@{ $module_extrasource->{$n} })
|
|
|
|
{
|
|
|
|
print "Files $i\n";
|
|
|
|
$proj->AddFile($i);
|
|
|
|
}
|
2012-06-10 21:20:04 +02:00
|
|
|
}
|
2007-03-17 14:50:42 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
1;
|