aboutsummaryrefslogtreecommitdiff
path: root/src/tools/msvc/install.pl
blob: c00b730871ca29dd264eea3f817c6cdbf105a5b2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
use strict;
use warnings;
use Carp;
use File::Basename;
use File::Copy;

$| = 1;

my $target = shift || Usage();

chdir("../../..") if (-f "../../../configure");
my $conf = "";
if (-d "debug") {
	$conf = "debug";
}
if (-d "release") {
	$conf = "release";
}
die "Could not find debug or release binaries" if ($conf eq "");
print "Installing for $conf\n";

EnsureDirectories ('bin','lib','share','share/timezonesets');

CopySetOfFiles('programs', "$conf\\*.exe", $target . '/bin/');
CopySetOfFiles('libraries', "$conf\\*.dll", $target . '/lib/');
copy($target . '/lib/libpq.dll', $target . '/bin/libpq.dll');
CopySetOfFiles('config files', "*.sample", $target . '/share/');
CopySetOfFiles('timezone names', 'src\timezone\tznames\*.txt', $target . '/share/timezonesets/');
CopyFiles('timezone sets', $target . '/share/timezonesets/', 'src/timezone/tznames/', 'Default','Australia','India');
CopySetOfFiles('BKI files', "src\\backend\\catalog\\postgres.*", $target .'/share/');
CopySetOfFiles('SQL files', "src\\backend\\catalog\\*.sql", $target . '/share/');
CopyFiles('Information schema data', $target . '/share/', 'src/backend/catalog/', 'sql_features.txt');
GenerateConversionScript();
GenerateTimezoneFiles();

sub Usage {
	print "Usage: install.pl <targetdir>\n";
	exit(1);
}

sub EnsureDirectories {
	mkdir $target unless -d ($target);
	while (my $d = shift) {
		mkdir $target . '/' . $d unless -d ($target . '/' . $d);
	}
}

sub CopyFiles {
	my $what = shift;
	my $target = shift;
	my $basedir = shift;

	print "Copying $what";
	while (my $f = shift) {
		print ".";
		$f = $basedir . $f;
		die "No file $f\n" if (! -f $f);
		copy($f, $target . basename($f)) || croak "Could not copy $f to $target" . basename($f) . " to $target" . basename($f) . "\n";
	}
	print "\n";
}

sub CopySetOfFiles {
	my $what = shift;
	my $spec = shift;
	my $target = shift;
	my $D;

	print "Copying $what";
	open($D, "dir /b /s $spec |") || croak "Could not list $spec\n";
	while (<$D>) {
		chomp;
		my $tgt = $target . basename($_);
		print ".";
		copy($_, $tgt) || croak "Could not copy $_\n";
	}
	close($D);
	print "\n";
}

sub GenerateConversionScript {
	my $sql = "";
	my $F;

	print "Generating conversion proc script...";
	my $mf = read_file('src/backend/utils/mb/conversion_procs/Makefile');
	$mf =~ s{\\\s*[\r\n]+}{}mg;
	$mf =~ /^CONVERSIONS\s*=\s*(.*)$/m || die "Could not find CONVERSIONS line in conversions Makefile\n";
	my @pieces = split /\s+/,$1;
	while ($#pieces > 0) {
		my $name = shift @pieces;
		my $se = shift @pieces;
		my $de = shift @pieces;
		my $func = shift @pieces;
		my $obj = shift @pieces;
		$sql .= "-- $se --> $de\n";
		$sql .= "CREATE OR REPLACE FUNCTION $func (INTEGER, INTEGER, CSTRING, INTERNAL, INTEGER) RETURNS VOID AS '\$libdir/$obj', '$func' LANGUAGE C STRICT;\n";
		$sql .= "DROP CONVERSION pg_catalog.$name;\n";
		$sql .= "CREATE DEFAULT CONVERSION pg_catalog.$name FOR '$se' TO '$de' FROM $func;\n";
	}
	open($F,">$target/share/conversion_create.sql") || die "Could not write to conversion_create.sql\n";
	print $F $sql;
	close($F);
	print "\n";
}

sub GenerateTimezoneFiles {
	my $mf = read_file("src/timezone/Makefile");
	$mf =~ s{\\\s*[\r\n]+}{}mg;
	$mf =~ /^TZDATA\s*:=\s*(.*)$/m || die "Could not find TZDATA row in timezone makefile\n";
	my @tzfiles = split /\s+/,$1;
	unshift @tzfiles,'';
	print "Generating timezone files...";
	system("$conf\\zic\\zic -d $target/share/timezone " . join(" src/timezone/data/", @tzfiles));
	print "\n";
}


sub read_file {
	my $filename = shift;
	my $F;
	my $t = $/;

	undef $/;
	open($F, $filename) || die "Could not open file $filename\n";
	my $txt = <$F>;
	close($F);
	$/ = $t;

	return $txt;
}