Skip to content

Commit ae8c1be

Browse files
committed
More MSVC build support from Magnus.
1 parent 0943799 commit ae8c1be

File tree

4 files changed

+411
-0
lines changed

4 files changed

+411
-0
lines changed

src/tools/msvc/Solution.pm

+14
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ sub GenerateFiles {
5555
confess "Bad format of version: $self->{strver}\n"
5656
}
5757
$self->{numver} = sprintf("%d%02d%02d", $1, $2, $3?$3:0);
58+
$self->{majorver} = sprintf("%d.%d", $1, $2);
5859
}
5960
}
6061
close(C);
@@ -206,6 +207,19 @@ EOF
206207
EOF
207208
close(O);
208209
}
210+
211+
my $mf = Project::read_file('src\backend\catalog\Makefile');
212+
$mf =~ s{\\s*[\r\n]+}{}mg;
213+
$mf =~ /^POSTGRES_BKI_SRCS\s*:=[^,]+,(.*)\)$/gm || croak "Could not find POSTGRES_BKI_SRCS in Makefile\n";
214+
my @allbki = split /\s+/, $1;
215+
foreach my $bki (@allbki) {
216+
next if $bki eq "";
217+
if (IsNewer('src/backend/catalog/postgres.bki', "src/include/catalog/$bki")) {
218+
print "Generating postgres.bki...\n";
219+
system("perl src/tools/msvc/genbki.pl $self->{majorver} src/backend/catalog/postgres " . join(' src/include/catalog/',@allbki));
220+
last;
221+
}
222+
}
209223
}
210224

211225
sub AddProject {

src/tools/msvc/clean.bat

+55
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
@echo off
2+
3+
set D=%CD%
4+
if exist ..\msvc if exist ..\..\..\src cd ..\..\..
5+
6+
if exist debug rd /s /q debug
7+
if exist release rd /s /q release
8+
call :del *.vcproj
9+
call :del pgsql.sln
10+
del /s /q src\bin\win32ver.rc 2> NUL
11+
del /s /q src\interfaces\win32ver.rc 2> NUL
12+
call :del src\backend\win32ver.rc
13+
14+
15+
REM Delete files created with GenerateFiles() in Solution.pm
16+
call :del src\include\pg_config.h
17+
call :del src\include\pg_config_os.h
18+
call :del src\include\parser\parse.h
19+
call :del src\include\utils\fmgroids.h
20+
21+
call :del src\backend\utils\fmgrtab.c
22+
call :del src\backend\catalog\postgres.bki
23+
call :del src\backend\catalog\postgres.description
24+
call :del src\backend\catalog\postgres.shdescription
25+
call :del src\backend\parser\gram.c
26+
call :del src\backend\bootstrap\bootparse.c
27+
call :del src\backend\bootstrap\bootstrap_tokens.h
28+
29+
call :del src\bin\psql\sql_help.h
30+
31+
call :del src\interfaces\libpq\libpq.rc
32+
call :del src\interfaces\libpq\libpqdll.def
33+
call :del src\interfaces\ecpg\include\ecpg_config.h
34+
call :del src\interfaces\ecpg\preproc\preproc.c
35+
call :del src\interfaces\ecpg\preproc\preproc.h
36+
37+
call :del src\port\pg_config_paths.h
38+
39+
call :del src\pl\plperl\spi.c
40+
call :del src\pl\plpgsql\src\pl_gram.c
41+
call :del src\pl\plpgsql\src\pl.tab.h
42+
43+
call :del contrib\cube\cubeparse.c
44+
call :del contrib\cube\cubeparse.h
45+
call :del contrib\seg\segparse.c
46+
call :del contrib\seg\segparse.h
47+
48+
49+
cd %D%
50+
goto :eof
51+
52+
53+
:del
54+
if exist %1 del /q %1
55+
goto :eof

src/tools/msvc/genbki.pl

+210
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,210 @@
1+
#!/usr/bin/perl
2+
#-------------------------------------------------------------------------
3+
#
4+
# genbki.pl--
5+
# perl script which generates .bki files from specially formatted .h
6+
# files. These .bki files are used to initialize the postgres template
7+
# database.
8+
#
9+
# Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group
10+
# Portions Copyright (c) 1994, Regents of the University of California
11+
#
12+
#
13+
# IDENTIFICATION
14+
# $PostgreSQL: pgsql/src/tools/msvc/genbki.pl,v 1.1 2006/11/29 19:49:31 tgl Exp $
15+
#
16+
#-------------------------------------------------------------------------
17+
18+
use strict;
19+
use warnings;
20+
21+
my $version = shift || Usage();
22+
my $prefix = shift || Usage();
23+
24+
$version =~ /^(\d+\.\d+)/ || die "Bad format verison $version\n";
25+
my $majorversion = $1;
26+
27+
my $pgext = read_file("src/include/postgres_ext.h");
28+
$pgext =~ /^#define\s+NAMEDATALEN\s+(\d+)$/mg || die "Could not read NAMEDATALEN from postgres_ext.h\n";
29+
my $namedatalen = $1;
30+
31+
my $pgauthid = read_file("src/include/catalog/pg_authid.h");
32+
$pgauthid =~ /^#define\s+BOOTSTRAP_SUPERUSERID\s+(\d+)$/mg || die "Could not read BOOTSTRAUP_SUPERUSERID from pg_authid.h\n";
33+
my $bootstrapsuperuserid = $1;
34+
35+
my $pgnamespace = read_file("src/include/catalog/pg_namespace.h");
36+
$pgnamespace =~ /^#define\s+PG_CATALOG_NAMESPACE\s+(\d+)$/mg || die "Could not read PG_CATALOG_NAMESPACE from pg_namespace.h\n";
37+
my $pgcatalognamespace = $1;
38+
39+
my $indata = "";
40+
while (my $f = shift) {
41+
$indata .= read_file($f);
42+
$indata .= "\n";
43+
}
44+
45+
# Strip C comments, from perl FAQ 4.27
46+
$indata =~ s{/\*.*?\*/}{}gs;
47+
48+
$indata =~ s{;\s*$}{}gm;
49+
$indata =~ s{^\s+}{}gm;
50+
$indata =~ s{^Oid}{oid}gm;
51+
$indata =~ s{\(Oid}{(oid}gm;
52+
$indata =~ s{^NameData}{name}gm;
53+
$indata =~ s{\(NameData}{(name}g;
54+
$indata =~ s{^TransactionId}{xid}gm;
55+
$indata =~ s{\(TransactionId}{(xid}g;
56+
$indata =~ s{PGUID}{$bootstrapsuperuserid}g;
57+
$indata =~ s{NAMEDATALEN}{$namedatalen}g;
58+
$indata =~ s{PGNSP}{$pgcatalognamespace}g;
59+
60+
#print $indata;
61+
62+
my $bki = "";
63+
my $desc = "";
64+
my $shdesc = "";
65+
66+
my $oid = 0;
67+
my $catalog = 0;
68+
my $reln_open = 0;
69+
my $bootstrap = "";
70+
my $shared_relation = "";
71+
my $without_oids = "";
72+
my $nc = 0;
73+
my $inside = 0;
74+
my @attr;
75+
my @types;
76+
foreach my $line (split /\n/, $indata) {
77+
if ($line =~ /^DATA\((.*)\)$/m) {
78+
my $data = $1;
79+
my @fields = split /\s+/,$data;
80+
if ($#fields >=4 && $fields[0] eq "insert" && $fields[1] eq "OID" && $fields[2] eq "=") {
81+
$oid = $fields[3];
82+
}
83+
$data =~ s/\s{2,}/ /g;
84+
$bki .= $data . "\n";
85+
}
86+
elsif ($line =~ /^DESCR\("(.*)"\)$/m){
87+
if ($oid != 0) {
88+
$desc .= sprintf("%d\t%s\t0\t%s\n", $oid, $catalog, $1);
89+
}
90+
}
91+
elsif ($line =~ /^SHDESCR\("(.*)"\)$/m) {
92+
if ($oid != 0) {
93+
$shdesc .= sprintf("%d\t%s\t%s\n", $oid, $catalog, $1);
94+
}
95+
}
96+
elsif ($line =~ /^DECLARE_(UNIQUE_)?INDEX\((.*)\)$/m) {
97+
if ($reln_open) {
98+
$bki .= "close $catalog\n";
99+
$reln_open = 0;
100+
}
101+
my $u = $1?" unique":"";
102+
my @fields = split /,/,$2,3;
103+
$fields[2] =~ s/\s{2,}/ /g;
104+
$bki .= "declare$u index $fields[0] $fields[1] $fields[2]\n";
105+
}
106+
elsif ($line =~ /^DECLARE_TOAST\((.*)\)$/m) {
107+
if ($reln_open) {
108+
$bki .= "close $catalog\n";
109+
$reln_open = 0;
110+
}
111+
my @fields = split /,/,$1;
112+
$bki .= "declare toast $fields[1] $fields[2] on $fields[0]\n";
113+
}
114+
elsif ($line =~ /^BUILD_INDICES/) {
115+
$bki .= "build indices\n";
116+
}
117+
elsif ($line =~ /^CATALOG\((.*)\)(.*)$/m) {
118+
if ($reln_open) {
119+
$bki .= "close $catalog\n";
120+
$reln_open = 0;
121+
}
122+
my $rest = $2;
123+
my @fields = split /,/,$1;
124+
$catalog = $fields[0];
125+
$oid = $fields[1];
126+
$bootstrap=$shared_relation=$without_oids="";
127+
if ($rest =~ /BKI_BOOTSTRAP/) {
128+
$bootstrap = "bootstrap ";
129+
}
130+
if ($rest =~ /BKI_SHARED_RELATION/) {
131+
$shared_relation = "shared_relation ";
132+
}
133+
if ($rest =~ /BKI_WITHOUT_OIDS/) {
134+
$without_oids = "without_oids ";
135+
}
136+
$nc++;
137+
$inside = 1;
138+
next;
139+
}
140+
if ($inside==1) {
141+
next if ($line =~ /{/);
142+
if ($line =~ /}/) {
143+
# Last line
144+
$bki .= "create $bootstrap$shared_relation$without_oids$catalog $oid\n (\n";
145+
my $first = 1;
146+
for (my $i = 0; $i <= $#attr; $i++) {
147+
if ($first == 1) {
148+
$first = 0;
149+
} else {
150+
$bki .= ",\n";
151+
}
152+
$bki .= " " . $attr[$i] . " = " . $types[$i];
153+
}
154+
$bki .= "\n )\n";
155+
undef(@attr);
156+
undef(@types);
157+
$reln_open = 1;
158+
$inside = 0;
159+
if ($bootstrap eq "") {
160+
$bki .= "open $catalog\n";
161+
}
162+
next;
163+
}
164+
# inside catalog definition, so keep sucking up attributes
165+
my @fields = split /\s+/,$line;
166+
if ($fields[1] =~ /(.*)\[.*\]/) { #Array attribute
167+
push @attr, $1;
168+
push @types, $fields[0] . '[]';
169+
}
170+
else {
171+
push @attr, $fields[1];
172+
push @types, $fields[0];
173+
}
174+
next;
175+
}
176+
}
177+
if ($reln_open == 1) {
178+
$bki .= "close $catalog\n";
179+
}
180+
181+
open(O,">$prefix.bki") || die "Could not write $prefix.bki\n";
182+
print O "# PostgreSQL $majorversion\n";
183+
print O $bki;
184+
close(O);
185+
open(O,">$prefix.description") || die "Could not write $prefix.description\n";
186+
print O $desc;
187+
close(O);
188+
open(O,">$prefix.shdescription") || die "Could not write $prefix.shdescription\n";
189+
print O $shdesc;
190+
close(O);
191+
192+
sub Usage {
193+
print "Usage: genbki.pl <version> <prefix> <input1> [<input2> <input3>...]\n";
194+
exit(1);
195+
}
196+
197+
sub read_file {
198+
my $filename = shift;
199+
my $F;
200+
my $t = $/;
201+
202+
undef $/;
203+
open($F, $filename) || die "Could not open file $filename\n";
204+
my $txt = <$F>;
205+
close($F);
206+
$/ = $t;
207+
208+
return $txt;
209+
}
210+

0 commit comments

Comments
 (0)