2006-11-29 20:49:31 +01:00
|
|
|
use strict;
|
|
|
|
use warnings;
|
|
|
|
use Carp;
|
|
|
|
use File::Basename;
|
|
|
|
use File::Copy;
|
|
|
|
|
|
|
|
$| = 1;
|
|
|
|
|
|
|
|
my $target = shift || Usage();
|
|
|
|
|
|
|
|
chdir("../../..") if (-f "../../../configure");
|
|
|
|
my $conf = "";
|
2007-03-12 20:10:50 +01:00
|
|
|
if (-d "debug")
|
|
|
|
{
|
|
|
|
$conf = "debug";
|
2006-11-29 20:49:31 +01:00
|
|
|
}
|
2007-03-12 20:10:50 +01:00
|
|
|
if (-d "release")
|
|
|
|
{
|
|
|
|
$conf = "release";
|
2006-11-29 20:49:31 +01:00
|
|
|
}
|
|
|
|
die "Could not find debug or release binaries" if ($conf eq "");
|
|
|
|
print "Installing for $conf\n";
|
|
|
|
|
2007-03-12 20:10:50 +01:00
|
|
|
EnsureDirectories('bin','lib','share','share/timezonesets');
|
2006-11-29 20:49:31 +01:00
|
|
|
|
2007-02-02 17:25:34 +01:00
|
|
|
CopySolutionOutput($conf, $target);
|
2006-11-29 20:49:31 +01:00
|
|
|
copy($target . '/lib/libpq.dll', $target . '/bin/libpq.dll');
|
|
|
|
CopySetOfFiles('config files', "*.sample", $target . '/share/');
|
|
|
|
CopySetOfFiles('timezone names', 'src\timezone\tznames\*.txt', $target . '/share/timezonesets/');
|
2007-03-12 20:10:50 +01:00
|
|
|
CopyFiles(
|
|
|
|
'timezone sets',
|
|
|
|
$target . '/share/timezonesets/',
|
|
|
|
'src/timezone/tznames/', 'Default','Australia','India'
|
|
|
|
);
|
2006-11-29 20:49:31 +01:00
|
|
|
CopySetOfFiles('BKI files', "src\\backend\\catalog\\postgres.*", $target .'/share/');
|
|
|
|
CopySetOfFiles('SQL files', "src\\backend\\catalog\\*.sql", $target . '/share/');
|
2007-03-12 20:10:50 +01:00
|
|
|
CopyFiles(
|
|
|
|
'Information schema data',
|
|
|
|
$target . '/share/',
|
|
|
|
'src/backend/catalog/', 'sql_features.txt'
|
|
|
|
);
|
2006-11-29 20:49:31 +01:00
|
|
|
GenerateConversionScript();
|
|
|
|
GenerateTimezoneFiles();
|
|
|
|
|
2007-03-12 20:10:50 +01:00
|
|
|
sub Usage
|
|
|
|
{
|
|
|
|
print "Usage: install.pl <targetdir>\n";
|
|
|
|
exit(1);
|
2006-11-29 20:49:31 +01:00
|
|
|
}
|
|
|
|
|
2007-03-12 20:10:50 +01:00
|
|
|
sub EnsureDirectories
|
|
|
|
{
|
|
|
|
mkdir $target unless -d ($target);
|
|
|
|
while (my $d = shift)
|
|
|
|
{
|
|
|
|
mkdir $target . '/' . $d unless -d ($target . '/' . $d);
|
|
|
|
}
|
2006-11-29 20:49:31 +01:00
|
|
|
}
|
|
|
|
|
2007-03-12 20:10:50 +01:00
|
|
|
sub CopyFiles
|
|
|
|
{
|
|
|
|
my $what = shift;
|
|
|
|
my $target = shift;
|
|
|
|
my $basedir = shift;
|
|
|
|
|
|
|
|
print "Copying $what";
|
|
|
|
while (my $f = shift)
|
|
|
|
{
|
|
|
|
print ".";
|
|
|
|
$f = $basedir . $f;
|
|
|
|
die "No file $f\n" if (!-f $f);
|
|
|
|
copy($f, $target . basename($f))
|
|
|
|
|| croak "Could not copy $f to $target"
|
|
|
|
. basename($f)
|
|
|
|
. " to $target"
|
|
|
|
. basename($f) . "\n";
|
|
|
|
}
|
|
|
|
print "\n";
|
2006-11-29 20:49:31 +01:00
|
|
|
}
|
|
|
|
|
2007-03-12 20:10:50 +01:00
|
|
|
sub CopySetOfFiles
|
|
|
|
{
|
|
|
|
my $what = shift;
|
|
|
|
my $spec = shift;
|
|
|
|
my $target = shift;
|
|
|
|
my $D;
|
|
|
|
|
|
|
|
print "Copying $what";
|
|
|
|
open($D, "dir /b /s $spec |") || croak "Could not list $spec\n";
|
|
|
|
while (<$D>)
|
|
|
|
{
|
|
|
|
chomp;
|
|
|
|
next if /regress/; # Skip temporary install in regression subdir
|
|
|
|
my $tgt = $target . basename($_);
|
|
|
|
print ".";
|
|
|
|
copy($_, $tgt) || croak "Could not copy $_: $!\n";
|
|
|
|
}
|
|
|
|
close($D);
|
|
|
|
print "\n";
|
2006-11-29 20:49:31 +01:00
|
|
|
}
|
|
|
|
|
2007-03-12 20:10:50 +01:00
|
|
|
sub CopySolutionOutput
|
|
|
|
{
|
|
|
|
my $conf = shift;
|
|
|
|
my $target = shift;
|
|
|
|
my $rem = qr{Project\("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}"\) = "([^"]+)"};
|
|
|
|
|
|
|
|
my $sln = read_file("pgsql.sln") || croak "Could not open pgsql.sln\n";
|
|
|
|
print "Copying build output files...";
|
|
|
|
while ($sln =~ $rem)
|
|
|
|
{
|
|
|
|
my $pf = $1;
|
|
|
|
my $dir;
|
|
|
|
my $ext;
|
|
|
|
|
|
|
|
$sln =~ s/$rem//;
|
|
|
|
|
|
|
|
my $proj = read_file("$pf.vcproj") || croak "Could not open $pf.vcproj\n";
|
|
|
|
if ($proj !~ qr{ConfigurationType="([^"]+)"})
|
|
|
|
{
|
|
|
|
croak "Could not parse $pf.vcproj\n";
|
|
|
|
}
|
|
|
|
if ($1 == 1)
|
|
|
|
{
|
|
|
|
$dir = "bin";
|
|
|
|
$ext = "exe";
|
|
|
|
}
|
|
|
|
elsif ($1 == 2)
|
|
|
|
{
|
|
|
|
$dir = "lib";
|
|
|
|
$ext = "dll";
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
|
|
|
|
# Static lib, such as libpgport, only used internally during build, don't install
|
|
|
|
next;
|
|
|
|
}
|
|
|
|
copy("$conf\\$pf\\$pf.$ext","$target\\$dir\\$pf.$ext") || croak "Could not copy $pf.$ext\n";
|
|
|
|
print ".";
|
|
|
|
}
|
|
|
|
print "\n";
|
2007-02-02 17:25:34 +01:00
|
|
|
}
|
|
|
|
|
2007-03-12 20:10:50 +01:00
|
|
|
sub GenerateConversionScript
|
|
|
|
{
|
|
|
|
my $sql = "";
|
|
|
|
my $F;
|
|
|
|
|
|
|
|
print "Generating conversion proc script...";
|
|
|
|
my $mf = read_file('src/backend/utils/mb/conversion_procs/Makefile');
|
|
|
|
$mf =~ s{\\\s*[\r\n]+}{}mg;
|
|
|
|
$mf =~ /^CONVERSIONS\s*=\s*(.*)$/m
|
|
|
|
|| die "Could not find CONVERSIONS line in conversions Makefile\n";
|
|
|
|
my @pieces = split /\s+/,$1;
|
|
|
|
while ($#pieces > 0)
|
|
|
|
{
|
|
|
|
my $name = shift @pieces;
|
|
|
|
my $se = shift @pieces;
|
|
|
|
my $de = shift @pieces;
|
|
|
|
my $func = shift @pieces;
|
|
|
|
my $obj = shift @pieces;
|
|
|
|
$sql .= "-- $se --> $de\n";
|
|
|
|
$sql .=
|
|
|
|
"CREATE OR REPLACE FUNCTION $func (INTEGER, INTEGER, CSTRING, INTERNAL, INTEGER) RETURNS VOID AS '\$libdir/$obj', '$func' LANGUAGE C STRICT;\n";
|
|
|
|
$sql .= "DROP CONVERSION pg_catalog.$name;\n";
|
|
|
|
$sql .= "CREATE DEFAULT CONVERSION pg_catalog.$name FOR '$se' TO '$de' FROM $func;\n";
|
|
|
|
}
|
|
|
|
open($F,">$target/share/conversion_create.sql")
|
|
|
|
|| die "Could not write to conversion_create.sql\n";
|
|
|
|
print $F $sql;
|
|
|
|
close($F);
|
|
|
|
print "\n";
|
2006-11-29 20:49:31 +01:00
|
|
|
}
|
|
|
|
|
2007-03-12 20:10:50 +01:00
|
|
|
sub GenerateTimezoneFiles
|
|
|
|
{
|
|
|
|
my $mf = read_file("src/timezone/Makefile");
|
|
|
|
$mf =~ s{\\\s*[\r\n]+}{}mg;
|
|
|
|
$mf =~ /^TZDATA\s*:?=\s*(.*)$/m || die "Could not find TZDATA row in timezone makefile\n";
|
|
|
|
my @tzfiles = split /\s+/,$1;
|
|
|
|
unshift @tzfiles,'';
|
|
|
|
print "Generating timezone files...";
|
|
|
|
system("$conf\\zic\\zic -d $target/share/timezone " . join(" src/timezone/data/", @tzfiles));
|
|
|
|
print "\n";
|
2006-11-29 20:49:31 +01:00
|
|
|
}
|
|
|
|
|
2007-03-12 20:10:50 +01:00
|
|
|
sub read_file
|
|
|
|
{
|
|
|
|
my $filename = shift;
|
|
|
|
my $F;
|
|
|
|
my $t = $/;
|
2006-11-29 20:49:31 +01:00
|
|
|
|
2007-03-12 20:10:50 +01:00
|
|
|
undef $/;
|
|
|
|
open($F, $filename) || die "Could not open file $filename\n";
|
|
|
|
my $txt = <$F>;
|
|
|
|
close($F);
|
|
|
|
$/ = $t;
|
2006-11-29 20:49:31 +01:00
|
|
|
|
2007-03-12 20:10:50 +01:00
|
|
|
return $txt;
|
2006-11-29 20:49:31 +01:00
|
|
|
}
|
|
|
|
|