]> granicus.if.org Git - postgresql/blob - src/tools/msvc/Install.pm
Turn most vc build scripts into modules instead of scripts, and just have
[postgresql] / src / tools / msvc / Install.pm
1 package Install;
2
3 use strict;
4 use warnings;
5 use Carp;
6 use File::Basename;
7 use File::Copy;
8
9 use Exporter;
10 our (@ISA,@EXPORT_OK);
11 @ISA = qw(Exporter);
12 @EXPORT_OK = qw(Install);
13
14 sub Install
15 {
16     $| = 1;
17
18     my $target = shift;
19
20     chdir("../../..") if (-f "../../../configure");
21     my $conf = "";
22     if (-d "debug")
23     {
24         $conf = "debug";
25     }
26     if (-d "release")
27     {
28         $conf = "release";
29     }
30     die "Could not find debug or release binaries" if ($conf eq "");
31     print "Installing for $conf\n";
32
33     EnsureDirectories($target, 'bin','lib','share','share/timezonesets');
34
35     CopySolutionOutput($conf, $target);
36     copy($target . '/lib/libpq.dll', $target . '/bin/libpq.dll');
37     CopySetOfFiles('config files', "*.sample", $target . '/share/');
38     CopySetOfFiles('timezone names', 'src\timezone\tznames\*.txt',$target . '/share/timezonesets/');
39     CopyFiles(
40         'timezone sets',
41         $target . '/share/timezonesets/',
42         'src/timezone/tznames/', 'Default','Australia','India'
43     );
44     CopySetOfFiles('BKI files', "src\\backend\\catalog\\postgres.*", $target .'/share/');
45     CopySetOfFiles('SQL files', "src\\backend\\catalog\\*.sql", $target . '/share/');
46     CopyFiles(
47         'Information schema data',
48         $target . '/share/',
49         'src/backend/catalog/', 'sql_features.txt'
50     );
51     GenerateConversionScript($target);
52     GenerateTimezoneFiles($target,$conf);
53 }
54
55 sub EnsureDirectories
56 {
57     my $target = shift;
58     mkdir $target unless -d ($target);
59     while (my $d = shift)
60     {
61         mkdir $target . '/' . $d unless -d ($target . '/' . $d);
62     }
63 }
64
65 sub CopyFiles
66 {
67     my $what = shift;
68     my $target = shift;
69     my $basedir = shift;
70
71     print "Copying $what";
72     while (my $f = shift)
73     {
74         print ".";
75         $f = $basedir . $f;
76         die "No file $f\n" if (!-f $f);
77         copy($f, $target . basename($f))
78           || croak "Could not copy $f to $target". basename($f). " to $target". basename($f) . "\n";
79     }
80     print "\n";
81 }
82
83 sub CopySetOfFiles
84 {
85     my $what = shift;
86     my $spec = shift;
87     my $target = shift;
88     my $D;
89
90     print "Copying $what";
91     open($D, "dir /b /s $spec |") || croak "Could not list $spec\n";
92     while (<$D>)
93     {
94         chomp;
95         next if /regress/; # Skip temporary install in regression subdir
96         my $tgt = $target . basename($_);
97         print ".";
98         copy($_, $tgt) || croak "Could not copy $_: $!\n";
99     }
100     close($D);
101     print "\n";
102 }
103
104 sub CopySolutionOutput
105 {
106     my $conf = shift;
107     my $target = shift;
108     my $rem = qr{Project\("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}"\) = "([^"]+)"};
109
110     my $sln = read_file("pgsql.sln") || croak "Could not open pgsql.sln\n";
111     print "Copying build output files...";
112     while ($sln =~ $rem)
113     {
114         my $pf = $1;
115         my $dir;
116         my $ext;
117
118         $sln =~ s/$rem//;
119
120         my $proj = read_file("$pf.vcproj") || croak "Could not open $pf.vcproj\n";
121         if ($proj !~ qr{ConfigurationType="([^"]+)"})
122         {
123             croak "Could not parse $pf.vcproj\n";
124         }
125         if ($1 == 1)
126         {
127             $dir = "bin";
128             $ext = "exe";
129         }
130         elsif ($1 == 2)
131         {
132             $dir = "lib";
133             $ext = "dll";
134         }
135         else
136         {
137
138             # Static lib, such as libpgport, only used internally during build, don't install
139             next;
140         }
141         copy("$conf\\$pf\\$pf.$ext","$target\\$dir\\$pf.$ext") || croak "Could not copy $pf.$ext\n";
142         print ".";
143     }
144     print "\n";
145 }
146
147 sub GenerateConversionScript
148 {
149     my $target = shift;
150     my $sql = "";
151     my $F;
152
153     print "Generating conversion proc script...";
154     my $mf = read_file('src/backend/utils/mb/conversion_procs/Makefile');
155     $mf =~ s{\\\s*[\r\n]+}{}mg;
156     $mf =~ /^CONVERSIONS\s*=\s*(.*)$/m
157       || die "Could not find CONVERSIONS line in conversions Makefile\n";
158     my @pieces = split /\s+/,$1;
159     while ($#pieces > 0)
160     {
161         my $name = shift @pieces;
162         my $se = shift @pieces;
163         my $de = shift @pieces;
164         my $func = shift @pieces;
165         my $obj = shift @pieces;
166         $sql .= "-- $se --> $de\n";
167         $sql .=
168 "CREATE OR REPLACE FUNCTION $func (INTEGER, INTEGER, CSTRING, INTERNAL, INTEGER) RETURNS VOID AS '\$libdir/$obj', '$func' LANGUAGE C STRICT;\n";
169         $sql .= "DROP CONVERSION pg_catalog.$name;\n";
170         $sql .= "CREATE DEFAULT CONVERSION pg_catalog.$name FOR '$se' TO '$de' FROM $func;\n";
171     }
172     open($F,">$target/share/conversion_create.sql")
173       || die "Could not write to conversion_create.sql\n";
174     print $F $sql;
175     close($F);
176     print "\n";
177 }
178
179 sub GenerateTimezoneFiles
180 {
181     my $target = shift;
182     my $conf = shift;
183     my $mf = read_file("src/timezone/Makefile");
184     $mf =~ s{\\\s*[\r\n]+}{}mg;
185     $mf =~ /^TZDATA\s*:?=\s*(.*)$/m || die "Could not find TZDATA row in timezone makefile\n";
186     my @tzfiles = split /\s+/,$1;
187     unshift @tzfiles,'';
188     print "Generating timezone files...";
189     system("$conf\\zic\\zic -d $target/share/timezone " . join(" src/timezone/data/", @tzfiles));
190     print "\n";
191 }
192
193 sub read_file
194 {
195     my $filename = shift;
196     my $F;
197     my $t = $/;
198
199     undef $/;
200     open($F, $filename) || die "Could not open file $filename\n";
201     my $txt = <$F>;
202     close($F);
203     $/ = $t;
204
205     return $txt;
206 }
207
208 1;