Commit eee22892 authored by Magnus Hagander's avatar Magnus Hagander

Make a run with perltidy to format the code. Per request from Andrew Dunstan.

parent 576027bb
...@@ -4,15 +4,16 @@ use Carp; ...@@ -4,15 +4,16 @@ use Carp;
use strict; use strict;
use warnings; use warnings;
sub new { sub new
my ($junk, $name, $type, $solution) = @_; {
my ($junk, $name, $type, $solution) = @_;
my $good_types = { my $good_types = {
lib => 1, lib => 1,
exe => 1, exe => 1,
dll => 1, dll => 1,
}; };
confess("Bad project type: $type\n") unless exists $good_types->{$type}; confess("Bad project type: $type\n") unless exists $good_types->{$type};
my $self = { my $self = {
name => $name, name => $name,
type => $type, type => $type,
guid => Win32::GuidGen(), guid => Win32::GuidGen(),
...@@ -22,362 +23,444 @@ sub new { ...@@ -22,362 +23,444 @@ sub new {
suffixlib => [], suffixlib => [],
includes => '', includes => '',
defines => ';', defines => ';',
solution => $solution, solution => $solution,
disablewarnings => '4018;4244;4273;4102', disablewarnings => '4018;4244;4273;4102',
disablelinkerwarnings => '' disablelinkerwarnings => ''
}; };
bless $self; bless $self;
return $self; return $self;
} }
sub AddFile { sub AddFile
my ($self, $filename) = @_; {
my ($self, $filename) = @_;
$self->{files}->{$filename} = 1; $self->{files}->{$filename} = 1;
} }
sub AddFiles { sub AddFiles
my $self = shift; {
my $dir = shift; my $self = shift;
my $dir = shift;
while (my $f = shift) { while (my $f = shift)
$self->{files}->{$dir . "\\" . $f} = 1; {
} $self->{files}->{$dir . "\\" . $f} = 1;
}
} }
sub ReplaceFile { sub ReplaceFile
my ($self, $filename, $newname) = @_; {
my $re = "\\\\$filename\$"; my ($self, $filename, $newname) = @_;
my $re = "\\\\$filename\$";
foreach my $file ( keys %{ $self->{files} } )
{
foreach my $file ( keys %{ $self->{files} } ) {
# Match complete filename # Match complete filename
if ($filename =~ /\\/) { if ($filename =~ /\\/)
if ($file eq $filename) { {
if ($file eq $filename)
{
delete $self->{files}{$file}; delete $self->{files}{$file};
$self->{files}{$newname} = 1; $self->{files}{$newname} = 1;
return; return;
} }
} }
elsif ($file =~ m/($re)/) { elsif ($file =~ m/($re)/)
{
delete $self->{files}{$file}; delete $self->{files}{$file};
$self->{files}{ "$newname\\$filename" } = 1; $self->{files}{"$newname\\$filename"} = 1;
return; return;
} }
} }
confess("Could not find file $filename to replace\n"); confess("Could not find file $filename to replace\n");
} }
sub RemoveFile { sub RemoveFile
my ($self, $filename) = @_; {
my ($self, $filename) = @_;
my $orig = scalar keys %{ $self->{files} }; my $orig = scalar keys %{ $self->{files} };
delete $self->{files}->{$filename}; delete $self->{files}->{$filename};
if ($orig > scalar keys %{$self->{files}} ) { if ($orig > scalar keys %{$self->{files}} )
{
return; return;
} }
confess("Could not find file $filename to remove\n"); confess("Could not find file $filename to remove\n");
} }
sub AddReference { sub AddReference
my $self = shift; {
my $self = shift;
while (my $ref = shift) { while (my $ref = shift)
push @{$self->{references}},$ref; {
$self->AddLibrary("__CFGNAME__\\" . $ref->{name} . "\\" . $ref->{name} . ".lib"); push @{$self->{references}},$ref;
} $self->AddLibrary("__CFGNAME__\\" . $ref->{name} . "\\" . $ref->{name} . ".lib");
}
} }
sub AddLibrary { sub AddLibrary
my ($self, $lib, $dbgsuffix) = @_; {
my ($self, $lib, $dbgsuffix) = @_;
push @{$self->{libraries}}, $lib; push @{$self->{libraries}}, $lib;
if ($dbgsuffix) { if ($dbgsuffix)
push @{$self->{suffixlib}}, $lib; {
} push @{$self->{suffixlib}}, $lib;
}
} }
sub AddIncludeDir { sub AddIncludeDir
my ($self, $inc) = @_; {
my ($self, $inc) = @_;
if ($self->{includes} ne '') { if ($self->{includes} ne '')
$self->{includes} .= ';'; {
} $self->{includes} .= ';';
$self->{includes} .= $inc; }
$self->{includes} .= $inc;
} }
sub AddDefine { sub AddDefine
my ($self, $def) = @_; {
my ($self, $def) = @_;
$def =~ s/"/""/g; $def =~ s/"/""/g;
$self->{defines} .= $def . ';'; $self->{defines} .= $def . ';';
} }
sub FullExportDLL { sub FullExportDLL
my ($self, $libname) = @_; {
my ($self, $libname) = @_;
$self->{builddef} = 1; $self->{builddef} = 1;
$self->{def} = ".\\__CFGNAME__\\$self->{name}\\$self->{name}.def"; $self->{def} = ".\\__CFGNAME__\\$self->{name}\\$self->{name}.def";
$self->{implib} = "__CFGNAME__\\$self->{name}\\$libname"; $self->{implib} = "__CFGNAME__\\$self->{name}\\$libname";
} }
sub UseDef { sub UseDef
my ($self, $def) = @_; {
my ($self, $def) = @_;
$self->{def} = $def; $self->{def} = $def;
} }
sub AddDir { sub AddDir
my ($self, $reldir) = @_; {
my $MF; my ($self, $reldir) = @_;
my $MF;
my $t = $/;undef $/;
open($MF,"$reldir\\Makefile") || open($MF,"$reldir\\GNUMakefile") || croak "Could not open $reldir\\Makefile\n"; my $t = $/;
my $mf = <$MF>; undef $/;
close($MF); open($MF,"$reldir\\Makefile")
|| open($MF,"$reldir\\GNUMakefile")
$mf =~ s{\\\s*[\r\n]+}{}mg; || croak "Could not open $reldir\\Makefile\n";
if ($mf =~ m{^(?:SUB)?DIRS[^=]*=\s*(.*)$}mg) { my $mf = <$MF>;
foreach my $subdir (split /\s+/,$1) { close($MF);
next if $subdir eq "\$(top_builddir)/src/timezone"; #special case for non-standard include
$self->AddDir($reldir . "\\" . $subdir); $mf =~ s{\\\s*[\r\n]+}{}mg;
} if ($mf =~ m{^(?:SUB)?DIRS[^=]*=\s*(.*)$}mg)
} {
while ($mf =~ m{^(?:EXTRA_)?OBJS[^=]*=\s*(.*)$}m) { foreach my $subdir (split /\s+/,$1)
my $s = $1; {
my $filter_re = qr{\$\(filter ([^,]+),\s+\$\(([^\)]+)\)\)}; next
while ($s =~ /$filter_re/) { if $subdir eq "\$(top_builddir)/src/timezone"; #special case for non-standard include
# Process $(filter a b c, $(VAR)) expressions $self->AddDir($reldir . "\\" . $subdir);
my $list = $1; }
my $filter = $2; }
$list =~ s/\.o/\.c/g; while ($mf =~ m{^(?:EXTRA_)?OBJS[^=]*=\s*(.*)$}m)
my @pieces = split /\s+/, $list; {
my $matches = ""; my $s = $1;
foreach my $p (@pieces) { my $filter_re = qr{\$\(filter ([^,]+),\s+\$\(([^\)]+)\)\)};
if ($filter eq "LIBOBJS") { while ($s =~ /$filter_re/)
if (grep(/$p/, @main::pgportfiles) == 1) { {
$p =~ s/\.c/\.o/;
$matches .= $p . " "; # Process $(filter a b c, $(VAR)) expressions
} my $list = $1;
} my $filter = $2;
else { $list =~ s/\.o/\.c/g;
confess "Unknown filter $filter\n"; my @pieces = split /\s+/, $list;
} my $matches = "";
} foreach my $p (@pieces)
$s =~ s/$filter_re/$matches/; {
}
foreach my $f (split /\s+/,$s) { if ($filter eq "LIBOBJS")
next if $f =~ /^\s*$/; {
next if $f eq "\\"; if (grep(/$p/, @main::pgportfiles) == 1)
next if $f =~ /\/SUBSYS.o$/; {
$f =~ s/,$//; # Remove trailing comma that can show up from filter stuff $p =~ s/\.c/\.o/;
next unless $f =~ /.*\.o$/; $matches .= $p . " ";
$f =~ s/\.o$/\.c/; }
if ($f =~ /^\$\(top_builddir\)\/(.*)/) { }
$f = $1; else
$f =~ s/\//\\/g; {
$self->{files}->{$f} = 1; confess "Unknown filter $filter\n";
} }
else { }
$f =~ s/\//\\/g; $s =~ s/$filter_re/$matches/;
$self->{files}->{"$reldir\\$f"} = 1; }
} foreach my $f (split /\s+/,$s)
} {
$mf =~ s{OBJS[^=]*=\s*(.*)$}{}m; next if $f =~ /^\s*$/;
} next if $f eq "\\";
next if $f =~ /\/SUBSYS.o$/;
# Match rules that pull in source files from different directories $f =~ s/,$//; # Remove trailing comma that can show up from filter stuff
my $replace_re = qr{^([^:\n\$]+\.c)\s*:\s*(?:%\s*: )?\$(\([^\)]+\))\/(.*)\/[^\/]+$}; next unless $f =~ /.*\.o$/;
while ($mf =~ m{$replace_re}m) { $f =~ s/\.o$/\.c/;
my $match = $1; if ($f =~ /^\$\(top_builddir\)\/(.*)/)
my $top = $2; {
my $target = $3; $f = $1;
$target =~ s{/}{\\}g; $f =~ s/\//\\/g;
my @pieces = split /\s+/,$match; $self->{files}->{$f} = 1;
foreach my $fn (@pieces) { }
if ($top eq "(top_srcdir)") { else
eval { $self->ReplaceFile($fn, $target) }; {
} $f =~ s/\//\\/g;
elsif ($top eq "(backend_src)") { $self->{files}->{"$reldir\\$f"} = 1;
eval { $self->ReplaceFile($fn, "src\\backend\\$target") }; }
} }
else { $mf =~ s{OBJS[^=]*=\s*(.*)$}{}m;
confess "Bad replacement top: $top, on line $_\n"; }
}
} # Match rules that pull in source files from different directories
$mf =~ s{$replace_re}{}m; my $replace_re = qr{^([^:\n\$]+\.c)\s*:\s*(?:%\s*: )?\$(\([^\)]+\))\/(.*)\/[^\/]+$};
} while ($mf =~ m{$replace_re}m)
{
# See if this Makefile contains a description, and should have a RC file my $match = $1;
if ($mf =~ /^PGFILEDESC\s*=\s*\"([^\"]+)\"/m) { my $top = $2;
my $desc = $1; my $target = $3;
my $ico; $target =~ s{/}{\\}g;
if ($mf =~ /^PGAPPICON\s*=\s*(.*)$/m) { $ico = $1; } my @pieces = split /\s+/,$match;
$self->AddResourceFile($reldir,$desc,$ico); foreach my $fn (@pieces)
} {
$/ = $t; if ($top eq "(top_srcdir)")
{
eval { $self->ReplaceFile($fn, $target) };
}
elsif ($top eq "(backend_src)")
{
eval { $self->ReplaceFile($fn, "src\\backend\\$target") };
}
else
{
confess "Bad replacement top: $top, on line $_\n";
}
}
$mf =~ s{$replace_re}{}m;
}
# See if this Makefile contains a description, and should have a RC file
if ($mf =~ /^PGFILEDESC\s*=\s*\"([^\"]+)\"/m)
{
my $desc = $1;
my $ico;
if ($mf =~ /^PGAPPICON\s*=\s*(.*)$/m) { $ico = $1; }
$self->AddResourceFile($reldir,$desc,$ico);
}
$/ = $t;
} }
sub AddResourceFile { sub AddResourceFile
my ($self, $dir, $desc, $ico) = @_; {
my ($self, $dir, $desc, $ico) = @_;
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
my $d = ($year - 100) . "$yday"; my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
my $d = ($year - 100) . "$yday";
if (Solution::IsNewer("$dir\\win32ver.rc",'src\port\win32ver.rc')) {
print "Generating win32ver.rc for $dir\n"; if (Solution::IsNewer("$dir\\win32ver.rc",'src\port\win32ver.rc'))
open(I,'src\port\win32ver.rc') || confess "Could not open win32ver.rc"; {
open(O,">$dir\\win32ver.rc") || confess "Could not write win32ver.rc"; print "Generating win32ver.rc for $dir\n";
my $icostr = $ico?"IDI_ICON ICON \"src/port/$ico.ico\"":""; open(I,'src\port\win32ver.rc') || confess "Could not open win32ver.rc";
while (<I>) { open(O,">$dir\\win32ver.rc") || confess "Could not write win32ver.rc";
s/FILEDESC/"$desc"/gm; my $icostr = $ico?"IDI_ICON ICON \"src/port/$ico.ico\"":"";
s/_ICO_/$icostr/gm; while (<I>)
s/(VERSION.*),0/$1,$d/; {
if ($self->{type} eq "dll") { s/FILEDESC/"$desc"/gm;
s/VFT_APP/VFT_DLL/gm; s/_ICO_/$icostr/gm;
} s/(VERSION.*),0/$1,$d/;
print O; if ($self->{type} eq "dll")
} {
} s/VFT_APP/VFT_DLL/gm;
close(O); }
close(I); print O;
$self->AddFile("$dir\\win32ver.rc"); }
}
close(O);
close(I);
$self->AddFile("$dir\\win32ver.rc");
} }
sub DisableLinkerWarnings { sub DisableLinkerWarnings
my ($self, $warnings) = @_; {
my ($self, $warnings) = @_;
$self->{disablelinkerwarnings} .= ';' unless ($self->{disablelinkerwarnings} eq ''); $self->{disablelinkerwarnings} .= ';' unless ($self->{disablelinkerwarnings} eq '');
$self->{disablelinkerwarnings} .= $warnings; $self->{disablelinkerwarnings} .= $warnings;
} }
sub Save { sub Save
my ($self) = @_; {
my ($self) = @_;
# If doing DLL and haven't specified a DEF file, do a full export of all symbols # If doing DLL and haven't specified a DEF file, do a full export of all symbols
# in the project. # in the project.
if ($self->{type} eq "dll" && !$self->{def}) { if ($self->{type} eq "dll" && !$self->{def})
$self->FullExportDLL($self->{name} . ".lib"); {
} $self->FullExportDLL($self->{name} . ".lib");
}
# Dump the project # Dump the project
open(F, ">$self->{name}.vcproj") || croak("Could not write to $self->{name}.vcproj\n"); open(F, ">$self->{name}.vcproj") || croak("Could not write to $self->{name}.vcproj\n");
$self->WriteHeader(*F); $self->WriteHeader(*F);
$self->WriteReferences(*F); $self->WriteReferences(*F);
print F <<EOF; print F <<EOF;
<Files> <Files>
EOF EOF
my @dirstack = (); my @dirstack = ();
my %uniquefiles; my %uniquefiles;
foreach my $f (sort keys %{ $self->{files} }) { foreach my $f (sort keys %{ $self->{files} })
confess "Bad format filename '$f'\n" unless ($f =~ /^(.*)\\([^\\]+)\.[r]?[cyl]$/); {
my $dir = $1; confess "Bad format filename '$f'\n" unless ($f =~ /^(.*)\\([^\\]+)\.[r]?[cyl]$/);
my $file = $2; my $dir = $1;
my $file = $2;
# Walk backwards down the directory stack and close any dirs we're done with
while ($#dirstack >= 0) { # Walk backwards down the directory stack and close any dirs we're done with
if (join('\\',@dirstack) eq substr($dir, 0, length(join('\\',@dirstack)))) { while ($#dirstack >= 0)
last if (length($dir) == length(join('\\',@dirstack))); {
last if (substr($dir, length(join('\\',@dirstack)),1) eq '\\'); if (join('\\',@dirstack) eq substr($dir, 0, length(join('\\',@dirstack))))
} {
print F ' ' x $#dirstack . " </Filter>\n"; last if (length($dir) == length(join('\\',@dirstack)));
pop @dirstack; last if (substr($dir, length(join('\\',@dirstack)),1) eq '\\');
} }
# Now walk forwards and create whatever directories are needed print F ' ' x $#dirstack . " </Filter>\n";
while (join('\\',@dirstack) ne $dir) { pop @dirstack;
my $left = substr($dir, length(join('\\',@dirstack))); }
$left =~ s/^\\//;
my @pieces = split /\\/, $left; # Now walk forwards and create whatever directories are needed
push @dirstack, $pieces[0]; while (join('\\',@dirstack) ne $dir)
print F ' ' x $#dirstack . " <Filter Name=\"$pieces[0]\" Filter=\"\">\n"; {
} my $left = substr($dir, length(join('\\',@dirstack)));
$left =~ s/^\\//;
print F ' ' x $#dirstack . " <File RelativePath=\"$f\""; my @pieces = split /\\/, $left;
if ($f =~ /\.y$/) { push @dirstack, $pieces[0];
my $of = $f; print F ' ' x $#dirstack . " <Filter Name=\"$pieces[0]\" Filter=\"\">\n";
$of =~ s/\.y$/.c/; }
$of =~ s{^src\\pl\\plpgsql\\src\\gram.c$}{src\\pl\\plpgsql\\src\\pl_gram.c};
print F '>' . GenerateCustomTool('Running bison on ' . $f, 'cmd /V:ON /c src\tools\msvc\pgbison.bat ' . $f, $of) . '</File>' . "\n"; print F ' ' x $#dirstack . " <File RelativePath=\"$f\"";
} if ($f =~ /\.y$/)
elsif ($f =~ /\.l$/) { {
my $of = $f; my $of = $f;
$of =~ s/\.l$/.c/; $of =~ s/\.y$/.c/;
$of =~ s{^src\\pl\\plpgsql\\src\\scan.c$}{src\\pl\\plpgsql\\src\\pl_scan.c}; $of =~ s{^src\\pl\\plpgsql\\src\\gram.c$}{src\\pl\\plpgsql\\src\\pl_gram.c};
print F '>' . GenerateCustomTool('Running flex on ' . $f, 'src\tools\msvc\pgflex.bat ' . $f,$of) . '</File>' . "\n"; print F '>'
} . GenerateCustomTool('Running bison on ' . $f,
elsif (defined($uniquefiles{$file})) { 'cmd /V:ON /c src\tools\msvc\pgbison.bat ' . $f, $of)
# File already exists, so fake a new name . '</File>' . "\n";
my $obj = $dir; }
$obj =~ s/\\/_/g; elsif ($f =~ /\.l$/)
print F "><FileConfiguration Name=\"Debug|Win32\"><Tool Name=\"VCCLCompilerTool\" ObjectFile=\".\\debug\\$self->{name}\\$obj" . "_$file.obj\" /></FileConfiguration><FileConfiguration Name=\"Release|Win32\"><Tool Name=\"VCCLCompilerTool\" ObjectFile=\".\\release\\$self->{name}\\$obj" . "_$file.obj\" /></FileConfiguration></File>\n"; {
} my $of = $f;
else { $of =~ s/\.l$/.c/;
$uniquefiles{$file} = 1; $of =~ s{^src\\pl\\plpgsql\\src\\scan.c$}{src\\pl\\plpgsql\\src\\pl_scan.c};
print F " />\n"; print F '>'
} . GenerateCustomTool('Running flex on ' . $f, 'src\tools\msvc\pgflex.bat ' . $f,$of)
} . '</File>' . "\n";
while ($#dirstack >= 0) { }
print F ' ' x $#dirstack . " </Filter>\n"; elsif (defined($uniquefiles{$file}))
pop @dirstack; {
}
$self->Footer(*F); # File already exists, so fake a new name
close(F); my $obj = $dir;
$obj =~ s/\\/_/g;
print F
"><FileConfiguration Name=\"Debug|Win32\"><Tool Name=\"VCCLCompilerTool\" ObjectFile=\".\\debug\\$self->{name}\\$obj"
. "_$file.obj\" /></FileConfiguration><FileConfiguration Name=\"Release|Win32\"><Tool Name=\"VCCLCompilerTool\" ObjectFile=\".\\release\\$self->{name}\\$obj"
. "_$file.obj\" /></FileConfiguration></File>\n";
}
else
{
$uniquefiles{$file} = 1;
print F " />\n";
}
}
while ($#dirstack >= 0)
{
print F ' ' x $#dirstack . " </Filter>\n";
pop @dirstack;
}
$self->Footer(*F);
close(F);
} }
sub GenerateCustomTool { sub GenerateCustomTool
my ($desc, $tool, $output, $cfg) = @_; {
if (!defined($cfg)) { my ($desc, $tool, $output, $cfg) = @_;
return GenerateCustomTool($desc, $tool, $output, 'Debug') . if (!defined($cfg))
GenerateCustomTool($desc, $tool, $output, 'Release'); {
} return GenerateCustomTool($desc, $tool, $output, 'Debug')
return "<FileConfiguration Name=\"$cfg|Win32\"><Tool Name=\"VCCustomBuildTool\" Description=\"$desc\" CommandLine=\"$tool\" AdditionalDependencies=\"\" Outputs=\"$output\" /></FileConfiguration>"; .GenerateCustomTool($desc, $tool, $output, 'Release');
}
return
"<FileConfiguration Name=\"$cfg|Win32\"><Tool Name=\"VCCustomBuildTool\" Description=\"$desc\" CommandLine=\"$tool\" AdditionalDependencies=\"\" Outputs=\"$output\" /></FileConfiguration>";
} }
sub WriteReferences { sub WriteReferences
my ($self, $f) = @_; {
print $f " <References>\n"; my ($self, $f) = @_;
foreach my $ref (@{$self->{references}}) { print $f " <References>\n";
print $f " <ProjectReference ReferencedProjectIdentifier=\"$ref->{guid}\" Name=\"$ref->{name}\" />\n"; foreach my $ref (@{$self->{references}})
} {
print $f " </References>\n"; print $f
" <ProjectReference ReferencedProjectIdentifier=\"$ref->{guid}\" Name=\"$ref->{name}\" />\n";
}
print $f " </References>\n";
} }
sub WriteHeader { sub WriteHeader
my ($self, $f) = @_; {
my ($self, $f) = @_;
print $f <<EOF; print $f <<EOF;
<?xml version="1.0" encoding="Windows-1252"?> <?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject ProjectType="Visual C++" Version="8.00" Name="$self->{name}" ProjectGUID="$self->{guid}"> <VisualStudioProject ProjectType="Visual C++" Version="8.00" Name="$self->{name}" ProjectGUID="$self->{guid}">
<Platforms><Platform Name="Win32"/></Platforms> <Platforms><Platform Name="Win32"/></Platforms>
<Configurations> <Configurations>
EOF EOF
$self->WriteConfiguration($f, 'Debug', { defs=>'_DEBUG;DEBUG=1;', wholeopt=>0 , opt=>0, strpool=>'false', runtime=>3 }); $self->WriteConfiguration($f, 'Debug',
$self->WriteConfiguration($f, 'Release', { defs=>'', wholeopt=>0, opt=>3, strpool=>'true', runtime=>2 }); { defs=>'_DEBUG;DEBUG=1;', wholeopt=>0, opt=>0, strpool=>'false', runtime=>3 });
print $f <<EOF; $self->WriteConfiguration($f, 'Release',
{ defs=>'', wholeopt=>0, opt=>3, strpool=>'true', runtime=>2 });
print $f <<EOF;
</Configurations> </Configurations>
EOF EOF
} }
sub WriteConfiguration sub WriteConfiguration
{ {
my ($self, $f, $cfgname, $p) = @_; my ($self, $f, $cfgname, $p) = @_;
my $cfgtype = ($self->{type} eq "exe")?1:($self->{type} eq "dll"?2:4); my $cfgtype = ($self->{type} eq "exe")?1:($self->{type} eq "dll"?2:4);
my $libcfg = (uc $cfgname eq "RELEASE")?"MD":"MDd"; my $libcfg = (uc $cfgname eq "RELEASE")?"MD":"MDd";
my $libs = ''; my $libs = '';
foreach my $lib (@{$self->{libraries}}) { foreach my $lib (@{$self->{libraries}})
my $xlib = $lib; {
foreach my $slib (@{$self->{suffixlib}}) { my $xlib = $lib;
if ($slib eq $lib) { foreach my $slib (@{$self->{suffixlib}})
$xlib =~ s/\.lib$/$libcfg.lib/; {
last; if ($slib eq $lib)
} {
} $xlib =~ s/\.lib$/$libcfg.lib/;
$libs .= $xlib . " "; last;
} }
$libs =~ s/ $//; }
$libs =~ s/__CFGNAME__/$cfgname/g; $libs .= $xlib . " ";
my $pth = $self->{solution}->{options}->{pthread}; }
$pth = '' unless $pth; $libs =~ s/ $//;
print $f <<EOF; $libs =~ s/__CFGNAME__/$cfgname/g;
my $pth = $self->{solution}->{options}->{pthread};
$pth = '' unless $pth;
print $f <<EOF;
<Configuration Name="$cfgname|Win32" OutputDirectory=".\\$cfgname\\$self->{name}" IntermediateDirectory=".\\$cfgname\\$self->{name}" <Configuration Name="$cfgname|Win32" OutputDirectory=".\\$cfgname\\$self->{name}" IntermediateDirectory=".\\$cfgname\\$self->{name}"
ConfigurationType="$cfgtype" UseOfMFC="0" ATLMinimizesCRunTimeLibraryUsage="FALSE" CharacterSet="2" WholeProgramOptimization="$p->{wholeopt}"> ConfigurationType="$cfgtype" UseOfMFC="0" ATLMinimizesCRunTimeLibraryUsage="FALSE" CharacterSet="2" WholeProgramOptimization="$p->{wholeopt}">
<Tool Name="VCCLCompilerTool" Optimization="$p->{opt}" <Tool Name="VCCLCompilerTool" Optimization="$p->{opt}"
...@@ -386,7 +469,7 @@ sub WriteConfiguration ...@@ -386,7 +469,7 @@ sub WriteConfiguration
StringPooling="$p->{strpool}" StringPooling="$p->{strpool}"
RuntimeLibrary="$p->{runtime}" DisableSpecificWarnings="$self->{disablewarnings}" RuntimeLibrary="$p->{runtime}" DisableSpecificWarnings="$self->{disablewarnings}"
EOF EOF
print $f <<EOF; print $f <<EOF;
AssemblerOutput="0" AssemblerListingLocation=".\\$cfgname\\$self->{name}\\" ObjectFile=".\\$cfgname\\$self->{name}\\" AssemblerOutput="0" AssemblerListingLocation=".\\$cfgname\\$self->{name}\\" ObjectFile=".\\$cfgname\\$self->{name}\\"
ProgramDataBaseFileName=".\\$cfgname\\$self->{name}\\" BrowseInformation="0" ProgramDataBaseFileName=".\\$cfgname\\$self->{name}\\" BrowseInformation="0"
WarningLevel="3" SuppressStartupBanner="TRUE" DebugInformationFormat="3" CompileAs="0"/> WarningLevel="3" SuppressStartupBanner="TRUE" DebugInformationFormat="3" CompileAs="0"/>
...@@ -398,55 +481,63 @@ EOF ...@@ -398,55 +481,63 @@ EOF
GenerateMapFile="FALSE" MapFileName=".\\$cfgname\\$self->{name}\\$self->{name}.map" GenerateMapFile="FALSE" MapFileName=".\\$cfgname\\$self->{name}\\$self->{name}.map"
SubSystem="1" TargetMachine="1" SubSystem="1" TargetMachine="1"
EOF EOF
if ($self->{disablelinkerwarnings}) { if ($self->{disablelinkerwarnings})
print $f "\t\tAdditionalOptions=\"/ignore:$self->{disablelinkerwarnings}\"\n"; {
} print $f "\t\tAdditionalOptions=\"/ignore:$self->{disablelinkerwarnings}\"\n";
if ($self->{implib}) { }
my $l = $self->{implib}; if ($self->{implib})
$l =~ s/__CFGNAME__/$cfgname/g; {
print $f "\t\tImportLibrary=\"$l\"\n"; my $l = $self->{implib};
} $l =~ s/__CFGNAME__/$cfgname/g;
if ($self->{def}) { print $f "\t\tImportLibrary=\"$l\"\n";
my $d = $self->{def}; }
$d =~ s/__CFGNAME__/$cfgname/g; if ($self->{def})
print $f "\t\tModuleDefinitionFile=\"$d\"\n"; {
} my $d = $self->{def};
$d =~ s/__CFGNAME__/$cfgname/g;
print $f "\t/>\n"; print $f "\t\tModuleDefinitionFile=\"$d\"\n";
print $f "\t<Tool Name=\"VCLibrarianTool\" OutputFile=\".\\$cfgname\\$self->{name}\\$self->{name}.lib\" IgnoreDefaultLibraryNames=\"libc\" />\n"; }
print $f "\t<Tool Name=\"VCResourceCompilerTool\" AdditionalIncludeDirectories=\"src\\include\" />\n";
if ($self->{builddef}) { print $f "\t/>\n";
print $f "\t<Tool Name=\"VCPreLinkEventTool\" Description=\"Generate DEF file\" CommandLine=\"perl src\\tools\\msvc\\gendef.pl $cfgname\\$self->{name}\" />\n"; print $f
} "\t<Tool Name=\"VCLibrarianTool\" OutputFile=\".\\$cfgname\\$self->{name}\\$self->{name}.lib\" IgnoreDefaultLibraryNames=\"libc\" />\n";
print $f <<EOF; print $f
"\t<Tool Name=\"VCResourceCompilerTool\" AdditionalIncludeDirectories=\"src\\include\" />\n";
if ($self->{builddef})
{
print $f
"\t<Tool Name=\"VCPreLinkEventTool\" Description=\"Generate DEF file\" CommandLine=\"perl src\\tools\\msvc\\gendef.pl $cfgname\\$self->{name}\" />\n";
}
print $f <<EOF;
</Configuration> </Configuration>
EOF EOF
} }
sub Footer { sub Footer
my ($self, $f) = @_; {
my ($self, $f) = @_;
print $f <<EOF; print $f <<EOF;
</Files> </Files>
<Globals/> <Globals/>
</VisualStudioProject> </VisualStudioProject>
EOF EOF
} }
# Utility function that loads a complete file # Utility function that loads a complete file
sub read_file { sub read_file
my $filename = shift; {
my $F; my $filename = shift;
my $t = $/; my $F;
my $t = $/;
undef $/;
open($F, $filename) || croak "Could not open file $filename\n"; undef $/;
my $txt = <$F>; open($F, $filename) || croak "Could not open file $filename\n";
close($F); my $txt = <$F>;
$/ = $t; close($F);
$/ = $t;
return $txt;
return $txt;
} }
1; 1;
...@@ -63,3 +63,11 @@ Get from http://www.zlib.net ...@@ -63,3 +63,11 @@ Get from http://www.zlib.net
libxml2 and libxslt - required for XML support libxml2 and libxslt - required for XML support
Get from http://www.zlatkovic.com/pub/libxml or build from source from Get from http://www.zlatkovic.com/pub/libxml or build from source from
http://xmlsoft.org. Note that libxml2 requires iconv. http://xmlsoft.org. Note that libxml2 requires iconv.
Code indention
--------------
If the perl code is modified, use perltidy on it since pgindent won't
touch perl code. Use the following commandline:
perltidy -b -bl -nsfs -naws -l=100 *.pl *.pm
...@@ -3,205 +3,243 @@ use Carp; ...@@ -3,205 +3,243 @@ use Carp;
use strict; use strict;
use warnings; use warnings;
sub new { sub new
my $junk = shift; {
my $options = shift; my $junk = shift;
my $self = { my $options = shift;
my $self = {
projects => {}, projects => {},
options => $options, options => $options,
numver => '', numver => '',
strver => '', strver => '',
}; };
bless $self; bless $self;
if ($options->{xml}) { if ($options->{xml})
if (!($options->{xslt} && $options->{iconv})) { {
die "XML requires both XSLT and ICONV\n"; if (!($options->{xslt} && $options->{iconv}))
} {
} die "XML requires both XSLT and ICONV\n";
return $self; }
}
return $self;
} }
# Return 1 if $oldfile is newer than $newfile, or if $newfile doesn't exist. # Return 1 if $oldfile is newer than $newfile, or if $newfile doesn't exist.
# Special case - if config.pl has changed, always return 1 # Special case - if config.pl has changed, always return 1
sub IsNewer { sub IsNewer
my ($newfile, $oldfile) = @_; {
if ($oldfile ne 'src\tools\msvc\config.pl') { my ($newfile, $oldfile) = @_;
return 1 if IsNewer($newfile, 'src\tools\msvc\config.pl'); if ($oldfile ne 'src\tools\msvc\config.pl')
} {
return 1 if (!(-e $newfile)); return 1 if IsNewer($newfile, 'src\tools\msvc\config.pl');
my @nstat = stat($newfile); }
my @ostat = stat($oldfile); return 1 if (!(-e $newfile));
return 1 if ($nstat[9] < $ostat[9]); my @nstat = stat($newfile);
return 0; my @ostat = stat($oldfile);
return 1 if ($nstat[9] < $ostat[9]);
return 0;
} }
# Copy a file, *not* preserving date. Only works for text files. # Copy a file, *not* preserving date. Only works for text files.
sub copyFile { sub copyFile
my ($src, $dest) = @_; {
open(I,$src) || croak "Could not open $src"; my ($src, $dest) = @_;
open(O,">$dest") || croak "Could not open $dest"; open(I,$src) || croak "Could not open $src";
while (<I>) { open(O,">$dest") || croak "Could not open $dest";
print O; while (<I>)
} {
close(I); print O;
close(O); }
close(I);
close(O);
} }
sub GenerateFiles { sub GenerateFiles
my $self = shift; {
my $self = shift;
# Parse configure.in to get version numbers # Parse configure.in to get version numbers
open(C,"configure.in") || confess("Could not open configure.in for reading\n"); open(C,"configure.in") || confess("Could not open configure.in for reading\n");
while (<C>) { while (<C>)
if (/^AC_INIT\(\[PostgreSQL\], \[([^\]]+)\]/) { {
$self->{strver} = $1; if (/^AC_INIT\(\[PostgreSQL\], \[([^\]]+)\]/)
if ($self->{strver} !~ /^(\d+)\.(\d+)(?:\.(\d+))?/) { {
confess "Bad format of version: $self->{strver}\n" $self->{strver} = $1;
} if ($self->{strver} !~ /^(\d+)\.(\d+)(?:\.(\d+))?/)
$self->{numver} = sprintf("%d%02d%02d", $1, $2, $3?$3:0); {
$self->{majorver} = sprintf("%d.%d", $1, $2); confess "Bad format of version: $self->{strver}\n";
} }
} $self->{numver} = sprintf("%d%02d%02d", $1, $2, $3?$3:0);
close(C); $self->{majorver} = sprintf("%d.%d", $1, $2);
confess "Unable to parse configure.in for all variables!" }
if ($self->{strver} eq '' || $self->{numver} eq ''); }
close(C);
confess "Unable to parse configure.in for all variables!"
if ($self->{strver} eq '' || $self->{numver} eq '');
if (IsNewer("src\\include\\pg_config_os.h","src\\include\\port\\win32.h")) { if (IsNewer("src\\include\\pg_config_os.h","src\\include\\port\\win32.h"))
print "Copying pg_config_os.h...\n"; {
copyFile("src\\include\\port\\win32.h","src\\include\\pg_config_os.h"); print "Copying pg_config_os.h...\n";
} copyFile("src\\include\\port\\win32.h","src\\include\\pg_config_os.h");
}
if (IsNewer("src\\include\\pg_config.h","src\\include\\pg_config.h.win32")) {
print "Generating pg_config.h...\n";
open(I,"src\\include\\pg_config.h.win32") || confess "Could not open pg_config.h.win32\n";
open(O,">src\\include\\pg_config.h") || confess "Could not write to pg_config.h\n";
while (<I>) {
s{PG_VERSION "[^"]+"}{PG_VERSION "$self->{strver}"};
s{PG_VERSION_NUM \d+}{PG_VERSION_NUM $self->{numver}};
s{PG_VERSION_STR "[^"]+"}{__STRINGIFY(x) #x\n#define __STRINGIFY2(z) __STRINGIFY(z)\n#define PG_VERSION_STR "PostgreSQL $self->{strver}, compiled by Visual C++ build " __STRINGIFY2(_MSC_VER)};
print O;
}
print O "/* defines added by config steps */\n";
print O "#define USE_ASSERT_CHECKING 1\n" if ($self->{options}->{asserts});
print O "#define USE_INTEGER_DATETIMES 1\n" if ($self->{options}->{integer_datetimes});
print O "#define USE_LDAP 1\n" if ($self->{options}->{ldap});
print O "#define HAVE_LIBZ 1\n" if ($self->{options}->{zlib});
print O "#define USE_SSL 1\n" if ($self->{options}->{openssl});
print O "#define ENABLE_NLS 1\n" if ($self->{options}->{nls});
print O "#define LOCALEDIR \"/share/locale\"\n" if ($self->{options}->{nls});
if ($self->{options}->{xml}) {
print O "#define HAVE_LIBXML2\n";
print O "#define USE_LIBXML\n";
}
if ($self->{options}->{krb5}) {
print O "#define KRB5 1\n";
print O "#define HAVE_KRB5_ERROR_TEXT_DATA 1\n";
print O "#define HAVE_KRB5_TICKET_ENC_PART2 1\n";
print O "#define PG_KRB_SRVNAM \"postgres\"\n";
}
close(O);
close(I);
}
if (IsNewer("src\\interfaces\\libpq\\libpqdll.def","src\\interfaces\\libpq\\exports.txt")) { if (IsNewer("src\\include\\pg_config.h","src\\include\\pg_config.h.win32"))
print "Generating libpqdll.def...\n"; {
open(I,"src\\interfaces\\libpq\\exports.txt") || confess("Could not open exports.txt\n"); print "Generating pg_config.h...\n";
open(O,">src\\interfaces\\libpq\\libpqdll.def") || confess("Could not open libpqdll.def\n"); open(I,"src\\include\\pg_config.h.win32") || confess "Could not open pg_config.h.win32\n";
print O "LIBRARY LIBPQ\nEXPORTS\n"; open(O,">src\\include\\pg_config.h") || confess "Could not write to pg_config.h\n";
while (<I>) { while (<I>)
next if (/^#/); {
my ($f, $o) = split; s{PG_VERSION "[^"]+"}{PG_VERSION "$self->{strver}"};
print O " $f @ $o\n"; s{PG_VERSION_NUM \d+}{PG_VERSION_NUM $self->{numver}};
} s{PG_VERSION_STR "[^"]+"}{__STRINGIFY(x) #x\n#define __STRINGIFY2(z) __STRINGIFY(z)\n#define PG_VERSION_STR "PostgreSQL $self->{strver}, compiled by Visual C++ build " __STRINGIFY2(_MSC_VER)};
close(O); print O;
close(I); }
} print O "/* defines added by config steps */\n";
print O "#define USE_ASSERT_CHECKING 1\n" if ($self->{options}->{asserts});
print O "#define USE_INTEGER_DATETIMES 1\n" if ($self->{options}->{integer_datetimes});
print O "#define USE_LDAP 1\n" if ($self->{options}->{ldap});
print O "#define HAVE_LIBZ 1\n" if ($self->{options}->{zlib});
print O "#define USE_SSL 1\n" if ($self->{options}->{openssl});
print O "#define ENABLE_NLS 1\n" if ($self->{options}->{nls});
print O "#define LOCALEDIR \"/share/locale\"\n" if ($self->{options}->{nls});
if (IsNewer("src\\backend\\utils\\fmgrtab.c","src\\include\\catalog\\pg_proc.h")) { if ($self->{options}->{xml})
print "Generating fmgrtab.c and fmgroids.h...\n"; {
open(I,"src\\include\\catalog\\pg_proc.h") || confess "Could not open pg_proc.h"; print O "#define HAVE_LIBXML2\n";
my @fmgr = (); print O "#define USE_LIBXML\n";
my %seenit; }
while (<I>) { if ($self->{options}->{krb5})
next unless (/^DATA/); {
s/^.*OID[^=]*=[^0-9]*//; print O "#define KRB5 1\n";
s/\(//g; print O "#define HAVE_KRB5_ERROR_TEXT_DATA 1\n";
s/[ \t]*\).*$//; print O "#define HAVE_KRB5_TICKET_ENC_PART2 1\n";
my @p = split; print O "#define PG_KRB_SRVNAM \"postgres\"\n";
next if ($p[4] ne "12"); }
push @fmgr,{ close(O);
close(I);
}
if (IsNewer("src\\interfaces\\libpq\\libpqdll.def","src\\interfaces\\libpq\\exports.txt"))
{
print "Generating libpqdll.def...\n";
open(I,"src\\interfaces\\libpq\\exports.txt") || confess("Could not open exports.txt\n");
open(O,">src\\interfaces\\libpq\\libpqdll.def") || confess("Could not open libpqdll.def\n");
print O "LIBRARY LIBPQ\nEXPORTS\n";
while (<I>)
{
next if (/^#/);
my ($f, $o) = split;
print O " $f @ $o\n";
}
close(O);
close(I);
}
if (IsNewer("src\\backend\\utils\\fmgrtab.c","src\\include\\catalog\\pg_proc.h"))
{
print "Generating fmgrtab.c and fmgroids.h...\n";
open(I,"src\\include\\catalog\\pg_proc.h") || confess "Could not open pg_proc.h";
my @fmgr = ();
my %seenit;
while (<I>)
{
next unless (/^DATA/);
s/^.*OID[^=]*=[^0-9]*//;
s/\(//g;
s/[ \t]*\).*$//;
my @p = split;
next if ($p[4] ne "12");
push @fmgr,
{
oid => $p[0], oid => $p[0],
proname => $p[1], proname => $p[1],
prosrc => $p[$#p-2], prosrc => $p[$#p-2],
nargs => $p[12], nargs => $p[12],
strict => $p[9], strict => $p[9],
retset => $p[10], retset => $p[10],
}; };
} }
close(I); close(I);
open(H,'>', 'src\include\utils\fmgroids.h') || open(H,'>', 'src\include\utils\fmgroids.h')
confess "Could not open fmgroids.h"; ||confess "Could not open fmgroids.h";
print H "/* fmgroids.h generated for Visual C++ */\n#ifndef FMGROIDS_H\n#define FMGROIDS_H\n\n"; print H
open(T,">src\\backend\\utils\\fmgrtab.c") || confess "Could not open fmgrtab.c"; "/* fmgroids.h generated for Visual C++ */\n#ifndef FMGROIDS_H\n#define FMGROIDS_H\n\n";
print T "/* fmgrtab.c generated for Visual C++ */\n#include \"postgres.h\"\n#include \"utils/fmgrtab.h\"\n\n"; open(T,">src\\backend\\utils\\fmgrtab.c") || confess "Could not open fmgrtab.c";
foreach my $s (sort {$a->{oid} <=> $b->{oid}} @fmgr) { print T
next if $seenit{$s->{prosrc}}; "/* fmgrtab.c generated for Visual C++ */\n#include \"postgres.h\"\n#include \"utils/fmgrtab.h\"\n\n";
$seenit{$s->{prosrc}} = 1; foreach my $s (sort {$a->{oid} <=> $b->{oid}} @fmgr)
print H "#define F_" . uc $s->{prosrc} . " $s->{oid}\n"; {
print T "extern Datum $s->{prosrc} (PG_FUNCTION_ARGS);\n"; next if $seenit{$s->{prosrc}};
} $seenit{$s->{prosrc}} = 1;
print H "\n#endif\n /* FMGROIDS_H */\n"; print H "#define F_" . uc $s->{prosrc} . " $s->{oid}\n";
close(H); print T "extern Datum $s->{prosrc} (PG_FUNCTION_ARGS);\n";
print T "const FmgrBuiltin fmgr_builtins[] = {\n"; }
my %bmap; print H "\n#endif\n /* FMGROIDS_H */\n";
$bmap{'t'} = 'true'; close(H);
$bmap{'f'} = 'false'; print T "const FmgrBuiltin fmgr_builtins[] = {\n";
foreach my $s (sort {$a->{oid} <=> $b->{oid}} @fmgr) { my %bmap;
print T " { $s->{oid}, \"$s->{prosrc}\", $s->{nargs}, $bmap{$s->{strict}}, $bmap{$s->{retset}}, $s->{prosrc} },\n"; $bmap{'t'} = 'true';
} $bmap{'f'} = 'false';
foreach my $s (sort {$a->{oid} <=> $b->{oid}} @fmgr)
{
print T
" { $s->{oid}, \"$s->{prosrc}\", $s->{nargs}, $bmap{$s->{strict}}, $bmap{$s->{retset}}, $s->{prosrc} },\n";
}
print T
print T " { 0, NULL, 0, false, false, NULL }\n};\n\nconst int fmgr_nbuiltins = (sizeof(fmgr_builtins) / sizeof(FmgrBuiltin)) - 1;\n"; " { 0, NULL, 0, false, false, NULL }\n};\n\nconst int fmgr_nbuiltins = (sizeof(fmgr_builtins) / sizeof(FmgrBuiltin)) - 1;\n";
close(T); close(T);
} }
if (IsNewer('src\interfaces\libpq\libpq.rc','src\interfaces\libpq\libpq.rc.in')) { if (IsNewer('src\interfaces\libpq\libpq.rc','src\interfaces\libpq\libpq.rc.in'))
print "Generating libpq.rc...\n"; {
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); print "Generating libpq.rc...\n";
my $d = ($year - 100) . "$yday"; my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
open(I,'<', 'src\interfaces\libpq\libpq.rc.in') || confess "Could not open libpq.rc.in"; my $d = ($year - 100) . "$yday";
open(O,'>', 'src\interfaces\libpq\libpq.rc') || confess "Could not open libpq.rc"; open(I,'<', 'src\interfaces\libpq\libpq.rc.in') || confess "Could not open libpq.rc.in";
while (<I>) { open(O,'>', 'src\interfaces\libpq\libpq.rc') || confess "Could not open libpq.rc";
s/(VERSION.*),0/$1,$d/; while (<I>)
print O; {
} s/(VERSION.*),0/$1,$d/;
close(I); print O;
close(O); }
} close(I);
close(O);
}
if (IsNewer('src\bin\psql\sql_help.h','src\bin\psql\create_help.pl')) { if (IsNewer('src\bin\psql\sql_help.h','src\bin\psql\create_help.pl'))
print "Generating sql_help.h...\n"; {
chdir('src\bin\psql'); print "Generating sql_help.h...\n";
system("perl create_help.pl ../../../doc/src/sgml/ref sql_help.h"); chdir('src\bin\psql');
chdir('..\..\..'); system("perl create_help.pl ../../../doc/src/sgml/ref sql_help.h");
} chdir('..\..\..');
}
if (IsNewer('src\interfaces\ecpg\include\ecpg_config.h', 'src\interfaces\ecpg\include\ecpg_config.h.in')) { if (
print "Generating ecpg_config.h...\n"; IsNewer(
open(O,'>','src\interfaces\ecpg\include\ecpg_config.h') || confess "Could not open ecpg_config.h"; 'src\interfaces\ecpg\include\ecpg_config.h',
print O <<EOF; 'src\interfaces\ecpg\include\ecpg_config.h.in'
)
)
{
print "Generating ecpg_config.h...\n";
open(O,'>','src\interfaces\ecpg\include\ecpg_config.h')
|| confess "Could not open ecpg_config.h";
print O <<EOF;
#if (_MSC_VER > 1200) #if (_MSC_VER > 1200)
#define HAVE_LONG_LONG_INT_64 #define HAVE_LONG_LONG_INT_64
#endif #endif
EOF EOF
close(O); close(O);
} }
unless (-f "src\\port\\pg_config_paths.h") { unless (-f "src\\port\\pg_config_paths.h")
print "Generating pg_config_paths.h...\n"; {
open(O,'>', 'src\port\pg_config_paths.h') || confess "Could not open pg_config_paths.h"; print "Generating pg_config_paths.h...\n";
print O <<EOF; open(O,'>', 'src\port\pg_config_paths.h') || confess "Could not open pg_config_paths.h";
print O <<EOF;
#define PGBINDIR "/bin" #define PGBINDIR "/bin"
#define PGSHAREDIR "/share" #define PGSHAREDIR "/share"
#define SYSCONFDIR "/etc" #define SYSCONFDIR "/etc"
...@@ -214,96 +252,112 @@ EOF ...@@ -214,96 +252,112 @@ EOF
#define DOCDIR "/doc" #define DOCDIR "/doc"
#define MANDIR "/man" #define MANDIR "/man"
EOF EOF
close(O); close(O);
} }
my $mf = Project::read_file('src\backend\catalog\Makefile'); my $mf = Project::read_file('src\backend\catalog\Makefile');
$mf =~ s{\\s*[\r\n]+}{}mg; $mf =~ s{\\s*[\r\n]+}{}mg;
$mf =~ /^POSTGRES_BKI_SRCS\s*:?=[^,]+,(.*)\)$/gm || croak "Could not find POSTGRES_BKI_SRCS in Makefile\n"; $mf =~ /^POSTGRES_BKI_SRCS\s*:?=[^,]+,(.*)\)$/gm
my @allbki = split /\s+/, $1; || croak "Could not find POSTGRES_BKI_SRCS in Makefile\n";
foreach my $bki (@allbki) { my @allbki = split /\s+/, $1;
next if $bki eq ""; foreach my $bki (@allbki)
if (IsNewer('src/backend/catalog/postgres.bki', "src/include/catalog/$bki")) { {
print "Generating postgres.bki...\n"; next if $bki eq "";
system("perl src/tools/msvc/genbki.pl $self->{majorver} src/backend/catalog/postgres " . join(' src/include/catalog/',@allbki)); if (IsNewer('src/backend/catalog/postgres.bki', "src/include/catalog/$bki"))
last; {
print "Generating postgres.bki...\n";
system("perl src/tools/msvc/genbki.pl $self->{majorver} src/backend/catalog/postgres "
. join(' src/include/catalog/',@allbki));
last;
} }
} }
open(O, ">doc/src/sgml/version.sgml") || croak "Could not write to version.sgml\n"; open(O, ">doc/src/sgml/version.sgml") || croak "Could not write to version.sgml\n";
print O <<EOF; print O <<EOF;
<!entity version "$self->{strver}"> <!entity version "$self->{strver}">
<!entity majorversion "$self->{majorver}"> <!entity majorversion "$self->{majorver}">
EOF EOF
close(O); close(O);
} }
sub AddProject { sub AddProject
my ($self, $name, $type, $folder, $initialdir) = @_; {
my ($self, $name, $type, $folder, $initialdir) = @_;
my $proj = new Project($name, $type, $self); my $proj = new Project($name, $type, $self);
push @{$self->{projects}->{$folder}}, $proj; push @{$self->{projects}->{$folder}}, $proj;
$proj->AddDir($initialdir) if ($initialdir); $proj->AddDir($initialdir) if ($initialdir);
if ($self->{options}->{zlib}) { if ($self->{options}->{zlib})
$proj->AddIncludeDir($self->{options}->{zlib} . '\include'); {
$proj->AddLibrary($self->{options}->{zlib} . '\lib\zdll.lib'); $proj->AddIncludeDir($self->{options}->{zlib} . '\include');
} $proj->AddLibrary($self->{options}->{zlib} . '\lib\zdll.lib');
if ($self->{options}->{openssl}) { }
$proj->AddIncludeDir($self->{options}->{openssl} . '\include'); if ($self->{options}->{openssl})
$proj->AddLibrary($self->{options}->{openssl} . '\lib\VC\ssleay32.lib', 1); {
$proj->AddLibrary($self->{options}->{openssl} . '\lib\VC\libeay32.lib', 1); $proj->AddIncludeDir($self->{options}->{openssl} . '\include');
} $proj->AddLibrary($self->{options}->{openssl} . '\lib\VC\ssleay32.lib', 1);
if ($self->{options}->{nls}) { $proj->AddLibrary($self->{options}->{openssl} . '\lib\VC\libeay32.lib', 1);
$proj->AddIncludeDir($self->{options}->{nls} . '\include'); }
$proj->AddLibrary($self->{options}->{nls} . '\lib\intl.lib'); if ($self->{options}->{nls})
} {
if ($self->{options}->{krb5}) { $proj->AddIncludeDir($self->{options}->{nls} . '\include');
$proj->AddIncludeDir($self->{options}->{krb5} . '\inc\krb5'); $proj->AddLibrary($self->{options}->{nls} . '\lib\intl.lib');
$proj->AddLibrary($self->{options}->{krb5} . '\lib\i386\krb5_32.lib'); }
$proj->AddLibrary($self->{options}->{krb5} . '\lib\i386\comerr32.lib'); if ($self->{options}->{krb5})
} {
if ($self->{options}->{xml}) { $proj->AddIncludeDir($self->{options}->{krb5} . '\inc\krb5');
$proj->AddIncludeDir($self->{options}->{xml} . '\include'); $proj->AddLibrary($self->{options}->{krb5} . '\lib\i386\krb5_32.lib');
$proj->AddIncludeDir($self->{options}->{iconv} . '\include'); $proj->AddLibrary($self->{options}->{krb5} . '\lib\i386\comerr32.lib');
$proj->AddLibrary($self->{options}->{xml} . '\lib\libxml2.lib'); }
} if ($self->{options}->{xml})
return $proj; {
$proj->AddIncludeDir($self->{options}->{xml} . '\include');
$proj->AddIncludeDir($self->{options}->{iconv} . '\include');
$proj->AddLibrary($self->{options}->{xml} . '\lib\libxml2.lib');
}
return $proj;
} }
sub Save { sub Save
my ($self) = @_; {
my %flduid; my ($self) = @_;
my %flduid;
$self->GenerateFiles(); $self->GenerateFiles();
foreach my $fld (keys %{$self->{projects}}) { foreach my $fld (keys %{$self->{projects}})
foreach my $proj (@{$self->{projects}->{$fld}}) { {
$proj->Save(); foreach my $proj (@{$self->{projects}->{$fld}})
} {
} $proj->Save();
}
}
open(SLN,">pgsql.sln") || croak "Could not write to pgsql.sln\n"; open(SLN,">pgsql.sln") || croak "Could not write to pgsql.sln\n";
print SLN <<EOF; print SLN <<EOF;
Microsoft Visual Studio Solution File, Format Version 9.00 Microsoft Visual Studio Solution File, Format Version 9.00
# Visual Studio 2005 # Visual Studio 2005
EOF EOF
foreach my $fld (keys %{$self->{projects}}) { foreach my $fld (keys %{$self->{projects}})
foreach my $proj (@{$self->{projects}->{$fld}}) { {
print SLN <<EOF; foreach my $proj (@{$self->{projects}->{$fld}})
{
print SLN <<EOF;
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "$proj->{name}", "$proj->{name}.vcproj", "$proj->{guid}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "$proj->{name}", "$proj->{name}.vcproj", "$proj->{guid}"
EndProject EndProject
EOF EOF
} }
if ($fld ne "") { if ($fld ne "")
$flduid{$fld} = Win32::GuidGen(); {
print SLN <<EOF; $flduid{$fld} = Win32::GuidGen();
print SLN <<EOF;
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "$fld", "$fld", "$flduid{$fld}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "$fld", "$fld", "$flduid{$fld}"
EndProject EndProject
EOF EOF
} }
} }
print SLN <<EOF; print SLN <<EOF;
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32 Debug|Win32 = Debug|Win32
...@@ -312,18 +366,20 @@ Global ...@@ -312,18 +366,20 @@ Global
GlobalSection(ProjectConfigurationPlatforms) = postSolution GlobalSection(ProjectConfigurationPlatforms) = postSolution
EOF EOF
foreach my $fld (keys %{$self->{projects}}) { foreach my $fld (keys %{$self->{projects}})
foreach my $proj (@{$self->{projects}->{$fld}}) { {
print SLN <<EOF; foreach my $proj (@{$self->{projects}->{$fld}})
{
print SLN <<EOF;
$proj->{guid}.Debug|Win32.ActiveCfg = Debug|Win32 $proj->{guid}.Debug|Win32.ActiveCfg = Debug|Win32
$proj->{guid}.Debug|Win32.Build.0 = Debug|Win32 $proj->{guid}.Debug|Win32.Build.0 = Debug|Win32
$proj->{guid}.Release|Win32.ActiveCfg = Release|Win32 $proj->{guid}.Release|Win32.ActiveCfg = Release|Win32
$proj->{guid}.Release|Win32.Build.0 = Release|Win32 $proj->{guid}.Release|Win32.Build.0 = Release|Win32
EOF EOF
} }
} }
print SLN <<EOF; print SLN <<EOF;
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE
...@@ -331,18 +387,20 @@ EOF ...@@ -331,18 +387,20 @@ EOF
GlobalSection(NestedProjects) = preSolution GlobalSection(NestedProjects) = preSolution
EOF EOF
foreach my $fld (keys %{$self->{projects}}) { foreach my $fld (keys %{$self->{projects}})
next if ($fld eq ""); {
foreach my $proj (@{$self->{projects}->{$fld}}) { next if ($fld eq "");
print SLN "\t\t$proj->{guid} = $flduid{$fld}\n"; foreach my $proj (@{$self->{projects}->{$fld}})
} {
} print SLN "\t\t$proj->{guid} = $flduid{$fld}\n";
}
}
print SLN <<EOF; print SLN <<EOF;
EndGlobalSection EndGlobalSection
EndGlobal EndGlobal
EOF EOF
close(SLN); close(SLN);
} }
1; 1;
...@@ -3,20 +3,20 @@ use strict; ...@@ -3,20 +3,20 @@ use strict;
use warnings; use warnings;
our $config = { our $config = {
asserts=>1, # --enable-cassert asserts=>1, # --enable-cassert
integer_datetimes=>1, # --enable-integer-datetimes integer_datetimes=>1, # --enable-integer-datetimes
nls=>undef, # --enable-nls=<path> nls=>undef, # --enable-nls=<path>
tcl=>'c:\tcl', # --with-tls=<path> tcl=>'c:\tcl', # --with-tls=<path>
perl=>'c:\perl', # --with-perl perl=>'c:\perl', # --with-perl
python=>'c:\python24', # --with-python=<path> python=>'c:\python24', # --with-python=<path>
krb5=>'c:\prog\pgsql\depend\krb5', # --with-krb5=<path> krb5=>'c:\prog\pgsql\depend\krb5', # --with-krb5=<path>
ldap=>1, # --with-ldap ldap=>1, # --with-ldap
openssl=>'c:\openssl', # --with-ssl=<path> openssl=>'c:\openssl', # --with-ssl=<path>
pthread=>'c:\prog\pgsql\depend\pthread', pthread=>'c:\prog\pgsql\depend\pthread',
xml=>'c:\prog\pgsql\depend\libxml2', xml=>'c:\prog\pgsql\depend\libxml2',
xslt=>'c:\prog\pgsql\depend\libxslt', xslt=>'c:\prog\pgsql\depend\libxslt',
iconv=>'c:\prog\pgsql\depend\iconv', iconv=>'c:\prog\pgsql\depend\iconv',
zlib=>'c:\prog\pgsql\depend\zlib'# --with-zlib=<path> zlib=>'c:\prog\pgsql\depend\zlib'# --with-zlib=<path>
}; };
1; 1;
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
# #
# #
# IDENTIFICATION # IDENTIFICATION
# $PostgreSQL: pgsql/src/tools/msvc/genbki.pl,v 1.4 2007/02/19 14:05:42 mha Exp $ # $PostgreSQL: pgsql/src/tools/msvc/genbki.pl,v 1.5 2007/03/12 19:10:50 mha Exp $
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
...@@ -25,24 +25,28 @@ $version =~ /^(\d+\.\d+)/ || die "Bad format verison $version\n"; ...@@ -25,24 +25,28 @@ $version =~ /^(\d+\.\d+)/ || die "Bad format verison $version\n";
my $majorversion = $1; my $majorversion = $1;
my $pgext = read_file("src/include/pg_config_manual.h"); my $pgext = read_file("src/include/pg_config_manual.h");
$pgext =~ /^#define\s+NAMEDATALEN\s+(\d+)$/mg || die "Could not read NAMEDATALEN from pg_config_manual.h\n"; $pgext =~ /^#define\s+NAMEDATALEN\s+(\d+)$/mg
|| die "Could not read NAMEDATALEN from pg_config_manual.h\n";
my $namedatalen = $1; my $namedatalen = $1;
my $pgauthid = read_file("src/include/catalog/pg_authid.h"); my $pgauthid = read_file("src/include/catalog/pg_authid.h");
$pgauthid =~ /^#define\s+BOOTSTRAP_SUPERUSERID\s+(\d+)$/mg || die "Could not read BOOTSTRAUP_SUPERUSERID from pg_authid.h\n"; $pgauthid =~ /^#define\s+BOOTSTRAP_SUPERUSERID\s+(\d+)$/mg
|| die "Could not read BOOTSTRAUP_SUPERUSERID from pg_authid.h\n";
my $bootstrapsuperuserid = $1; my $bootstrapsuperuserid = $1;
my $pgnamespace = read_file("src/include/catalog/pg_namespace.h"); my $pgnamespace = read_file("src/include/catalog/pg_namespace.h");
$pgnamespace =~ /^#define\s+PG_CATALOG_NAMESPACE\s+(\d+)$/mg || die "Could not read PG_CATALOG_NAMESPACE from pg_namespace.h\n"; $pgnamespace =~ /^#define\s+PG_CATALOG_NAMESPACE\s+(\d+)$/mg
|| die "Could not read PG_CATALOG_NAMESPACE from pg_namespace.h\n";
my $pgcatalognamespace = $1; my $pgcatalognamespace = $1;
my $indata = ""; my $indata = "";
while (my $f = shift) { while (my $f = shift)
$indata .= read_file($f); {
$indata .= "\n"; $indata .= read_file($f);
$indata .= "\n";
} }
# Strip C comments, from perl FAQ 4.27 # Strip C comments, from perl FAQ 4.27
$indata =~ s{/\*.*?\*/}{}gs; $indata =~ s{/\*.*?\*/}{}gs;
$indata =~ s{;\s*$}{}gm; $indata =~ s{;\s*$}{}gm;
...@@ -73,112 +77,143 @@ my $nc = 0; ...@@ -73,112 +77,143 @@ my $nc = 0;
my $inside = 0; my $inside = 0;
my @attr; my @attr;
my @types; my @types;
foreach my $line (split /\n/, $indata) {
if ($line =~ /^DATA\((.*)\)$/m) { foreach my $line (split /\n/, $indata)
my $data = $1; {
my @fields = split /\s+/,$data; if ($line =~ /^DATA\((.*)\)$/m)
if ($#fields >=4 && $fields[0] eq "insert" && $fields[1] eq "OID" && $fields[2] eq "=") { {
$oid = $fields[3]; my $data = $1;
} my @fields = split /\s+/,$data;
else { if ($#fields >=4 && $fields[0] eq "insert" && $fields[1] eq "OID" && $fields[2] eq "=")
$oid = 0; {
} $oid = $fields[3];
$data =~ s/\s{2,}/ /g; }
$bki .= $data . "\n"; else
} {
elsif ($line =~ /^DESCR\("(.*)"\)$/m){ $oid = 0;
if ($oid != 0) { }
$desc .= sprintf("%d\t%s\t0\t%s\n", $oid, $catalog, $1); $data =~ s/\s{2,}/ /g;
} $bki .= $data . "\n";
} }
elsif ($line =~ /^SHDESCR\("(.*)"\)$/m) { elsif ($line =~ /^DESCR\("(.*)"\)$/m)
if ($oid != 0) { {
$shdesc .= sprintf("%d\t%s\t%s\n", $oid, $catalog, $1); if ($oid != 0)
} {
} $desc .= sprintf("%d\t%s\t0\t%s\n", $oid, $catalog, $1);
elsif ($line =~ /^DECLARE_(UNIQUE_)?INDEX\((.*)\)$/m) { }
if ($reln_open) { }
$bki .= "close $catalog\n"; elsif ($line =~ /^SHDESCR\("(.*)"\)$/m)
$reln_open = 0; {
} if ($oid != 0)
my $u = $1?" unique":""; {
my @fields = split /,/,$2,3; $shdesc .= sprintf("%d\t%s\t%s\n", $oid, $catalog, $1);
$fields[2] =~ s/\s{2,}/ /g; }
$bki .= "declare$u index $fields[0] $fields[1] $fields[2]\n"; }
} elsif ($line =~ /^DECLARE_(UNIQUE_)?INDEX\((.*)\)$/m)
elsif ($line =~ /^DECLARE_TOAST\((.*)\)$/m) { {
if ($reln_open) { if ($reln_open)
$bki .= "close $catalog\n"; {
$reln_open = 0; $bki .= "close $catalog\n";
} $reln_open = 0;
my @fields = split /,/,$1; }
my $u = $1?" unique":"";
my @fields = split /,/,$2,3;
$fields[2] =~ s/\s{2,}/ /g;
$bki .= "declare$u index $fields[0] $fields[1] $fields[2]\n";
}
elsif ($line =~ /^DECLARE_TOAST\((.*)\)$/m)
{
if ($reln_open)
{
$bki .= "close $catalog\n";
$reln_open = 0;
}
my @fields = split /,/,$1;
$bki .= "declare toast $fields[1] $fields[2] on $fields[0]\n"; $bki .= "declare toast $fields[1] $fields[2] on $fields[0]\n";
} }
elsif ($line =~ /^BUILD_INDICES/) { elsif ($line =~ /^BUILD_INDICES/)
$bki .= "build indices\n"; {
} $bki .= "build indices\n";
elsif ($line =~ /^CATALOG\((.*)\)(.*)$/m) { }
if ($reln_open) { elsif ($line =~ /^CATALOG\((.*)\)(.*)$/m)
$bki .= "close $catalog\n"; {
$reln_open = 0; if ($reln_open)
} {
my $rest = $2; $bki .= "close $catalog\n";
my @fields = split /,/,$1; $reln_open = 0;
$catalog = $fields[0]; }
$oid = $fields[1]; my $rest = $2;
$bootstrap=$shared_relation=$without_oids=""; my @fields = split /,/,$1;
if ($rest =~ /BKI_BOOTSTRAP/) { $catalog = $fields[0];
$bootstrap = "bootstrap "; $oid = $fields[1];
} $bootstrap=$shared_relation=$without_oids="";
if ($rest =~ /BKI_SHARED_RELATION/) { if ($rest =~ /BKI_BOOTSTRAP/)
$shared_relation = "shared_relation "; {
} $bootstrap = "bootstrap ";
if ($rest =~ /BKI_WITHOUT_OIDS/) { }
$without_oids = "without_oids "; if ($rest =~ /BKI_SHARED_RELATION/)
} {
$nc++; $shared_relation = "shared_relation ";
$inside = 1; }
next; if ($rest =~ /BKI_WITHOUT_OIDS/)
} {
if ($inside==1) { $without_oids = "without_oids ";
next if ($line =~ /{/); }
if ($line =~ /}/) { $nc++;
# Last line $inside = 1;
$bki .= "create $bootstrap$shared_relation$without_oids$catalog $oid\n (\n"; next;
my $first = 1; }
for (my $i = 0; $i <= $#attr; $i++) { if ($inside==1)
if ($first == 1) { {
$first = 0; next if ($line =~ /{/);
} else { if ($line =~ /}/)
$bki .= ",\n"; {
}
$bki .= " " . $attr[$i] . " = " . $types[$i]; # Last line
} $bki .= "create $bootstrap$shared_relation$without_oids$catalog $oid\n (\n";
$bki .= "\n )\n"; my $first = 1;
undef(@attr); for (my $i = 0; $i <= $#attr; $i++)
undef(@types); {
$reln_open = 1; if ($first == 1)
$inside = 0; {
if ($bootstrap eq "") { $first = 0;
$bki .= "open $catalog\n"; }
} else
next; {
} $bki .= ",\n";
# inside catalog definition, so keep sucking up attributes }
my @fields = split /\s+/,$line; $bki .= " " . $attr[$i] . " = " . $types[$i];
if ($fields[1] =~ /(.*)\[.*\]/) { #Array attribute }
push @attr, $1; $bki .= "\n )\n";
push @types, $fields[0] . '[]'; undef(@attr);
} undef(@types);
else { $reln_open = 1;
push @attr, $fields[1]; $inside = 0;
push @types, $fields[0]; if ($bootstrap eq "")
} {
next; $bki .= "open $catalog\n";
} }
next;
}
# inside catalog definition, so keep sucking up attributes
my @fields = split /\s+/,$line;
if ($fields[1] =~ /(.*)\[.*\]/)
{ #Array attribute
push @attr, $1;
push @types, $fields[0] . '[]';
}
else
{
push @attr, $fields[1];
push @types, $fields[0];
}
next;
}
} }
if ($reln_open == 1) { if ($reln_open == 1)
$bki .= "close $catalog\n"; {
$bki .= "close $catalog\n";
} }
open(O,">$prefix.bki") || die "Could not write $prefix.bki\n"; open(O,">$prefix.bki") || die "Could not write $prefix.bki\n";
...@@ -192,22 +227,24 @@ open(O,">$prefix.shdescription") || die "Could not write $prefix.shdescription\n ...@@ -192,22 +227,24 @@ open(O,">$prefix.shdescription") || die "Could not write $prefix.shdescription\n
print O $shdesc; print O $shdesc;
close(O); close(O);
sub Usage { sub Usage
print "Usage: genbki.pl <version> <prefix> <input1> [<input2> <input3>...]\n"; {
exit(1); print "Usage: genbki.pl <version> <prefix> <input1> [<input2> <input3>...]\n";
exit(1);
} }
sub read_file { sub read_file
my $filename = shift; {
my $F; my $filename = shift;
my $t = $/; my $F;
my $t = $/;
undef $/;
open($F, $filename) || die "Could not open file $filename\n"; undef $/;
my $txt = <$F>; open($F, $filename) || die "Could not open file $filename\n";
close($F); my $txt = <$F>;
$/ = $t; close($F);
$/ = $t;
return $txt;
return $txt;
} }
...@@ -3,36 +3,39 @@ my @def; ...@@ -3,36 +3,39 @@ my @def;
die "Usage: gendef.pl <modulepath>\n" unless ($ARGV[0] =~ /\\([^\\]+$)/); die "Usage: gendef.pl <modulepath>\n" unless ($ARGV[0] =~ /\\([^\\]+$)/);
my $defname = uc $1; my $defname = uc $1;
if (-f "$ARGV[0]/$defname.def") { if (-f "$ARGV[0]/$defname.def")
print "Not re-generating $defname.DEF, file already exists.\n"; {
exit(0); print "Not re-generating $defname.DEF, file already exists.\n";
exit(0);
} }
print "Generating $defname.DEF from directory $ARGV[0]\n"; print "Generating $defname.DEF from directory $ARGV[0]\n";
while (<$ARGV[0]/*.obj>) { while (<$ARGV[0]/*.obj>)
{
print "."; print ".";
system("dumpbin /symbols /out:symbols.out $_ >NUL") && die "Could not call dumpbin"; system("dumpbin /symbols /out:symbols.out $_ >NUL") && die "Could not call dumpbin";
open(F, "<symbols.out") || die "Could not open symbols.out for $_\n"; open(F, "<symbols.out") || die "Could not open symbols.out for $_\n";
while (<F>) { while (<F>)
s/\(\)//g; {
next unless /^\d/; s/\(\)//g;
my @pieces = split ; next unless /^\d/;
next unless $pieces[6]; my @pieces = split;
next if ($pieces[2] eq "UNDEF"); next unless $pieces[6];
next unless ($pieces[4] eq "External"); next if ($pieces[2] eq "UNDEF");
next if $pieces[6] =~ /^@/; next unless ($pieces[4] eq "External");
next if $pieces[6] =~ /^\(/; next if $pieces[6] =~ /^@/;
next if $pieces[6] =~ /^__real/; next if $pieces[6] =~ /^\(/;
next if $pieces[6] =~ /^__imp/; next if $pieces[6] =~ /^__real/;
next if $pieces[6] =~ /NULL_THUNK_DATA$/; next if $pieces[6] =~ /^__imp/;
next if $pieces[6] =~ /^__IMPORT_DESCRIPTOR/; next if $pieces[6] =~ /NULL_THUNK_DATA$/;
next if $pieces[6] =~ /^__NULL_IMPORT/; next if $pieces[6] =~ /^__IMPORT_DESCRIPTOR/;
next if $pieces[6] =~ /^__NULL_IMPORT/;
push @def, $pieces[6]; push @def, $pieces[6];
} }
close(F); close(F);
unlink("symbols.out"); unlink("symbols.out");
} }
print "\n"; print "\n";
...@@ -40,13 +43,15 @@ open(DEF,">$ARGV[0]/$defname.def") || die "Could not write to $defname\n"; ...@@ -40,13 +43,15 @@ open(DEF,">$ARGV[0]/$defname.def") || die "Could not write to $defname\n";
print DEF "EXPORTS\n"; print DEF "EXPORTS\n";
my $i = 0; my $i = 0;
my $last = ""; my $last = "";
foreach my $f (sort @def) { foreach my $f (sort @def)
next if ($f eq $last); {
$last = $f; next if ($f eq $last);
$f =~ s/^_//; $last = $f;
$i++; $f =~ s/^_//;
# print DEF " $f \@ $i\n"; # ordinaled exports? $i++;
print DEF " $f\n";
# print DEF " $f \@ $i\n"; # ordinaled exports?
print DEF " $f\n";
} }
close(DEF); close(DEF);
print "Generated $i symbols\n"; print "Generated $i symbols\n";
...@@ -10,159 +10,193 @@ my $target = shift || Usage(); ...@@ -10,159 +10,193 @@ my $target = shift || Usage();
chdir("../../..") if (-f "../../../configure"); chdir("../../..") if (-f "../../../configure");
my $conf = ""; my $conf = "";
if (-d "debug") { if (-d "debug")
$conf = "debug"; {
$conf = "debug";
} }
if (-d "release") { if (-d "release")
$conf = "release"; {
$conf = "release";
} }
die "Could not find debug or release binaries" if ($conf eq ""); die "Could not find debug or release binaries" if ($conf eq "");
print "Installing for $conf\n"; print "Installing for $conf\n";
EnsureDirectories ('bin','lib','share','share/timezonesets'); EnsureDirectories('bin','lib','share','share/timezonesets');
CopySolutionOutput($conf, $target); CopySolutionOutput($conf, $target);
copy($target . '/lib/libpq.dll', $target . '/bin/libpq.dll'); copy($target . '/lib/libpq.dll', $target . '/bin/libpq.dll');
CopySetOfFiles('config files', "*.sample", $target . '/share/'); CopySetOfFiles('config files', "*.sample", $target . '/share/');
CopySetOfFiles('timezone names', 'src\timezone\tznames\*.txt', $target . '/share/timezonesets/'); CopySetOfFiles('timezone names', 'src\timezone\tznames\*.txt', $target . '/share/timezonesets/');
CopyFiles('timezone sets', $target . '/share/timezonesets/', 'src/timezone/tznames/', 'Default','Australia','India'); CopyFiles(
'timezone sets',
$target . '/share/timezonesets/',
'src/timezone/tznames/', 'Default','Australia','India'
);
CopySetOfFiles('BKI files', "src\\backend\\catalog\\postgres.*", $target .'/share/'); CopySetOfFiles('BKI files', "src\\backend\\catalog\\postgres.*", $target .'/share/');
CopySetOfFiles('SQL files', "src\\backend\\catalog\\*.sql", $target . '/share/'); CopySetOfFiles('SQL files', "src\\backend\\catalog\\*.sql", $target . '/share/');
CopyFiles('Information schema data', $target . '/share/', 'src/backend/catalog/', 'sql_features.txt'); CopyFiles(
'Information schema data',
$target . '/share/',
'src/backend/catalog/', 'sql_features.txt'
);
GenerateConversionScript(); GenerateConversionScript();
GenerateTimezoneFiles(); GenerateTimezoneFiles();
sub Usage { sub Usage
print "Usage: install.pl <targetdir>\n"; {
exit(1); print "Usage: install.pl <targetdir>\n";
exit(1);
} }
sub EnsureDirectories { sub EnsureDirectories
mkdir $target unless -d ($target); {
while (my $d = shift) { mkdir $target unless -d ($target);
mkdir $target . '/' . $d unless -d ($target . '/' . $d); while (my $d = shift)
} {
mkdir $target . '/' . $d unless -d ($target . '/' . $d);
}
} }
sub CopyFiles { sub CopyFiles
my $what = shift; {
my $target = shift; my $what = shift;
my $basedir = shift; my $target = shift;
my $basedir = shift;
print "Copying $what";
while (my $f = shift) { print "Copying $what";
print "."; while (my $f = shift)
$f = $basedir . $f; {
die "No file $f\n" if (! -f $f); print ".";
copy($f, $target . basename($f)) || croak "Could not copy $f to $target" . basename($f) . " to $target" . basename($f) . "\n"; $f = $basedir . $f;
} die "No file $f\n" if (!-f $f);
print "\n"; copy($f, $target . basename($f))
|| croak "Could not copy $f to $target"
. basename($f)
. " to $target"
. basename($f) . "\n";
}
print "\n";
} }
sub CopySetOfFiles { sub CopySetOfFiles
my $what = shift; {
my $spec = shift; my $what = shift;
my $target = shift; my $spec = shift;
my $D; my $target = shift;
my $D;
print "Copying $what";
open($D, "dir /b /s $spec |") || croak "Could not list $spec\n"; print "Copying $what";
while (<$D>) { open($D, "dir /b /s $spec |") || croak "Could not list $spec\n";
chomp; while (<$D>)
next if /regress/; # Skip temporary install in regression subdir {
my $tgt = $target . basename($_); chomp;
print "."; next if /regress/; # Skip temporary install in regression subdir
copy($_, $tgt) || croak "Could not copy $_: $!\n"; my $tgt = $target . basename($_);
} print ".";
close($D); copy($_, $tgt) || croak "Could not copy $_: $!\n";
print "\n"; }
close($D);
print "\n";
} }
sub CopySolutionOutput { sub CopySolutionOutput
my $conf = shift; {
my $target = shift; my $conf = shift;
my $rem = qr{Project\("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}"\) = "([^"]+)"}; 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..."; my $sln = read_file("pgsql.sln") || croak "Could not open pgsql.sln\n";
while ($sln =~ $rem) { print "Copying build output files...";
my $pf = $1; while ($sln =~ $rem)
my $dir; {
my $ext; my $pf = $1;
my $dir;
$sln =~ s/$rem//; my $ext;
my $proj = read_file("$pf.vcproj") || croak "Could not open $pf.vcproj\n"; $sln =~ s/$rem//;
if ($proj !~ qr{ConfigurationType="([^"]+)"}) {
croak "Could not parse $pf.vcproj\n"; my $proj = read_file("$pf.vcproj") || croak "Could not open $pf.vcproj\n";
} if ($proj !~ qr{ConfigurationType="([^"]+)"})
if ($1 == 1) { {
$dir = "bin"; croak "Could not parse $pf.vcproj\n";
$ext = "exe"; }
} if ($1 == 1)
elsif ($1 == 2) { {
$dir = "lib"; $dir = "bin";
$ext = "dll"; $ext = "exe";
} }
else { elsif ($1 == 2)
# Static lib, such as libpgport, only used internally during build, don't install {
next; $dir = "lib";
} $ext = "dll";
copy("$conf\\$pf\\$pf.$ext","$target\\$dir\\$pf.$ext") || croak "Could not copy $pf.$ext\n"; }
print "."; else
} {
print "\n";
# 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";
} }
sub GenerateConversionScript { sub GenerateConversionScript
my $sql = ""; {
my $F; my $sql = "";
my $F;
print "Generating conversion proc script...";
my $mf = read_file('src/backend/utils/mb/conversion_procs/Makefile'); print "Generating conversion proc script...";
$mf =~ s{\\\s*[\r\n]+}{}mg; my $mf = read_file('src/backend/utils/mb/conversion_procs/Makefile');
$mf =~ /^CONVERSIONS\s*=\s*(.*)$/m || die "Could not find CONVERSIONS line in conversions Makefile\n"; $mf =~ s{\\\s*[\r\n]+}{}mg;
my @pieces = split /\s+/,$1; $mf =~ /^CONVERSIONS\s*=\s*(.*)$/m
while ($#pieces > 0) { || die "Could not find CONVERSIONS line in conversions Makefile\n";
my $name = shift @pieces; my @pieces = split /\s+/,$1;
my $se = shift @pieces; while ($#pieces > 0)
my $de = shift @pieces; {
my $func = shift @pieces; my $name = shift @pieces;
my $obj = shift @pieces; my $se = shift @pieces;
$sql .= "-- $se --> $de\n"; my $de = shift @pieces;
$sql .= "CREATE OR REPLACE FUNCTION $func (INTEGER, INTEGER, CSTRING, INTERNAL, INTEGER) RETURNS VOID AS '\$libdir/$obj', '$func' LANGUAGE C STRICT;\n"; my $func = shift @pieces;
$sql .= "DROP CONVERSION pg_catalog.$name;\n"; my $obj = shift @pieces;
$sql .= "CREATE DEFAULT CONVERSION pg_catalog.$name FOR '$se' TO '$de' FROM $func;\n"; $sql .= "-- $se --> $de\n";
} $sql .=
open($F,">$target/share/conversion_create.sql") || die "Could not write to conversion_create.sql\n"; "CREATE OR REPLACE FUNCTION $func (INTEGER, INTEGER, CSTRING, INTERNAL, INTEGER) RETURNS VOID AS '\$libdir/$obj', '$func' LANGUAGE C STRICT;\n";
print $F $sql; $sql .= "DROP CONVERSION pg_catalog.$name;\n";
close($F); $sql .= "CREATE DEFAULT CONVERSION pg_catalog.$name FOR '$se' TO '$de' FROM $func;\n";
print "\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 { sub GenerateTimezoneFiles
my $mf = read_file("src/timezone/Makefile"); {
$mf =~ s{\\\s*[\r\n]+}{}mg; my $mf = read_file("src/timezone/Makefile");
$mf =~ /^TZDATA\s*:?=\s*(.*)$/m || die "Could not find TZDATA row in timezone makefile\n"; $mf =~ s{\\\s*[\r\n]+}{}mg;
my @tzfiles = split /\s+/,$1; $mf =~ /^TZDATA\s*:?=\s*(.*)$/m || die "Could not find TZDATA row in timezone makefile\n";
unshift @tzfiles,''; my @tzfiles = split /\s+/,$1;
print "Generating timezone files..."; unshift @tzfiles,'';
system("$conf\\zic\\zic -d $target/share/timezone " . join(" src/timezone/data/", @tzfiles)); print "Generating timezone files...";
print "\n"; 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 = $/;
sub read_file { undef $/;
my $filename = shift; open($F, $filename) || die "Could not open file $filename\n";
my $F; my $txt = <$F>;
my $t = $/; close($F);
$/ = $t;
undef $/; return $txt;
open($F, $filename) || die "Could not open file $filename\n";
my $txt = <$F>;
close($F);
$/ = $t;
return $txt;
} }
...@@ -15,11 +15,11 @@ require 'src/tools/msvc/config.pl'; ...@@ -15,11 +15,11 @@ require 'src/tools/msvc/config.pl';
my $solution = new Solution($config); my $solution = new Solution($config);
our @pgportfiles = qw( our @pgportfiles = qw(
crypt.c fseeko.c getrusage.c inet_aton.c random.c srandom.c crypt.c fseeko.c getrusage.c inet_aton.c random.c srandom.c
unsetenv.c getaddrinfo.c gettimeofday.c kill.c open.c rand.c unsetenv.c getaddrinfo.c gettimeofday.c kill.c open.c rand.c
snprintf.c strlcat.c strlcpy.c copydir.c dirmod.c exec.c noblock.c path.c pipe.c snprintf.c strlcat.c strlcpy.c copydir.c dirmod.c exec.c noblock.c path.c pipe.c
pgsleep.c pgstrcasecmp.c qsort.c qsort_arg.c sprompt.c thread.c pgsleep.c pgstrcasecmp.c qsort.c qsort_arg.c sprompt.c thread.c
getopt.c getopt_long.c dirent.c rint.c win32error.c); getopt.c getopt_long.c dirent.c rint.c win32error.c);
my $libpgport = $solution->AddProject('libpgport','lib','misc'); my $libpgport = $solution->AddProject('libpgport','lib','misc');
$libpgport->AddDefine('FRONTEND'); $libpgport->AddDefine('FRONTEND');
...@@ -46,35 +46,46 @@ my $plpgsql = $solution->AddProject('plpgsql','dll','PLs','src\pl\plpgsql\src'); ...@@ -46,35 +46,46 @@ my $plpgsql = $solution->AddProject('plpgsql','dll','PLs','src\pl\plpgsql\src');
$plpgsql->AddFiles('src\pl\plpgsql\src','scan.l','gram.y'); $plpgsql->AddFiles('src\pl\plpgsql\src','scan.l','gram.y');
$plpgsql->AddReference($postgres); $plpgsql->AddReference($postgres);
if ($solution->{options}->{perl}) { if ($solution->{options}->{perl})
my $plperl = $solution->AddProject('plperl','dll','PLs','src\pl\plperl'); {
$plperl->AddIncludeDir($solution->{options}->{perl} . '/lib/CORE'); my $plperl = $solution->AddProject('plperl','dll','PLs','src\pl\plperl');
$plperl->AddDefine('PLPERL_HAVE_UID_GID'); $plperl->AddIncludeDir($solution->{options}->{perl} . '/lib/CORE');
if (Solution::IsNewer('src\pl\plperl\SPI.c','src\pl\plperl\SPI.xs')) { $plperl->AddDefine('PLPERL_HAVE_UID_GID');
print 'Building src\pl\plperl\SPI.c...' . "\n"; if (Solution::IsNewer('src\pl\plperl\SPI.c','src\pl\plperl\SPI.xs'))
system($solution->{options}->{perl} . '/bin/perl ' . $solution->{options}->{perl} . '/lib/ExtUtils/xsubpp -typemap ' . $solution->{options}->{perl} . '/lib/ExtUtils/typemap src\pl\plperl\SPI.xs >src\pl\plperl\SPI.c'); {
if ((!(-f 'src\pl\plperl\SPI.c')) || -z 'src\pl\plperl\SPI.c') { print 'Building src\pl\plperl\SPI.c...' . "\n";
unlink('src\pl\plperl\SPI.c'); # if zero size system( $solution->{options}->{perl}
die 'Failed to create SPI.c' . "\n"; . '/bin/perl '
} . $solution->{options}->{perl}
} . '/lib/ExtUtils/xsubpp -typemap '
$plperl->AddReference($postgres); . $solution->{options}->{perl}
$plperl->AddLibrary($solution->{options}->{perl} . '\lib\CORE\perl58.lib'); . '/lib/ExtUtils/typemap src\pl\plperl\SPI.xs >src\pl\plperl\SPI.c');
if ((!(-f 'src\pl\plperl\SPI.c')) || -z 'src\pl\plperl\SPI.c')
{
unlink('src\pl\plperl\SPI.c'); # if zero size
die 'Failed to create SPI.c' . "\n";
}
}
$plperl->AddReference($postgres);
$plperl->AddLibrary($solution->{options}->{perl} . '\lib\CORE\perl58.lib');
} }
if ($solution->{options}->{python}) { if ($solution->{options}->{python})
my $plpython = $solution->AddProject('plpython','dll','PLs','src\pl\plpython'); {
$plpython->AddIncludeDir($solution->{options}->{python} . '\include'); my $plpython = $solution->AddProject('plpython','dll','PLs','src\pl\plpython');
$solution->{options}->{python} =~ /\\Python(\d{2})/i || croak "Could not determine python version from path"; $plpython->AddIncludeDir($solution->{options}->{python} . '\include');
$plpython->AddLibrary($solution->{options}->{python} . "\\Libs\\python$1.lib"); $solution->{options}->{python} =~ /\\Python(\d{2})/i
$plpython->AddReference($postgres); || croak "Could not determine python version from path";
$plpython->AddLibrary($solution->{options}->{python} . "\\Libs\\python$1.lib");
$plpython->AddReference($postgres);
} }
if ($solution->{options}->{tcl}) { if ($solution->{options}->{tcl})
my $pltcl = $solution->AddProject('pltcl','dll','PLs','src\pl\tcl'); {
$pltcl->AddIncludeDir($solution->{options}->{tcl} . '\include'); my $pltcl = $solution->AddProject('pltcl','dll','PLs','src\pl\tcl');
$pltcl->AddReference($postgres); $pltcl->AddIncludeDir($solution->{options}->{tcl} . '\include');
$pltcl->AddLibrary($solution->{options}->{tcl} . '\lib\tcl84.lib'); $pltcl->AddReference($postgres);
$pltcl->AddLibrary($solution->{options}->{tcl} . '\lib\tcl84.lib');
} }
my $libpq = $solution->AddProject('libpq','dll','interfaces','src\interfaces\libpq'); my $libpq = $solution->AddProject('libpq','dll','interfaces','src\interfaces\libpq');
...@@ -85,39 +96,42 @@ $libpq->AddLibrary('wldap32.lib') if ($solution->{options}->{ldap}); ...@@ -85,39 +96,42 @@ $libpq->AddLibrary('wldap32.lib') if ($solution->{options}->{ldap});
$libpq->UseDef('src\interfaces\libpq\libpqdll.def'); $libpq->UseDef('src\interfaces\libpq\libpqdll.def');
$libpq->ReplaceFile('src\interfaces\libpq\libpqrc.c','src\interfaces\libpq\libpq.rc'); $libpq->ReplaceFile('src\interfaces\libpq\libpqrc.c','src\interfaces\libpq\libpq.rc');
my $pgtypes = $solution->AddProject('libpgtypes','dll','interfaces','src\interfaces\ecpg\pgtypeslib'); my $pgtypes =
$solution->AddProject('libpgtypes','dll','interfaces','src\interfaces\ecpg\pgtypeslib');
$pgtypes->AddDefine('FRONTEND'); $pgtypes->AddDefine('FRONTEND');
$pgtypes->AddReference($postgres,$libpgport); $pgtypes->AddReference($postgres,$libpgport);
$pgtypes->AddIncludeDir('src\interfaces\ecpg\include'); $pgtypes->AddIncludeDir('src\interfaces\ecpg\include');
if ($config->{pthread}) { if ($config->{pthread})
my $libecpg = $solution->AddProject('libecpg','dll','interfaces','src\interfaces\ecpg\ecpglib'); {
$libecpg->AddDefine('FRONTEND'); my $libecpg = $solution->AddProject('libecpg','dll','interfaces','src\interfaces\ecpg\ecpglib');
$libecpg->AddIncludeDir('src\interfaces\ecpg\include'); $libecpg->AddDefine('FRONTEND');
$libecpg->AddIncludeDir('src\interfaces\libpq'); $libecpg->AddIncludeDir('src\interfaces\ecpg\include');
$libecpg->AddIncludeDir('src\port'); $libecpg->AddIncludeDir('src\interfaces\libpq');
$libecpg->AddLibrary('wsock32.lib'); $libecpg->AddIncludeDir('src\port');
$libecpg->AddLibrary($config->{'pthread'} . '\pthreadVC2.lib'); $libecpg->AddLibrary('wsock32.lib');
$libecpg->AddReference($libpq,$pgtypes); $libecpg->AddLibrary($config->{'pthread'} . '\pthreadVC2.lib');
$libecpg->AddReference($libpq,$pgtypes);
my $libecpgcompat = $solution->AddProject('libecpg_compat','dll','interfaces','src\interfaces\ecpg\compatlib');
$libecpgcompat->AddIncludeDir('src\interfaces\ecpg\include'); my $libecpgcompat =
$libecpgcompat->AddIncludeDir('src\interfaces\libpq'); $solution->AddProject('libecpg_compat','dll','interfaces','src\interfaces\ecpg\compatlib');
$libecpgcompat->AddReference($pgtypes,$libecpg); $libecpgcompat->AddIncludeDir('src\interfaces\ecpg\include');
$libecpgcompat->AddIncludeDir('src\interfaces\libpq');
my $ecpg = $solution->AddProject('ecpg','exe','interfaces','src\interfaces\ecpg\preproc'); $libecpgcompat->AddReference($pgtypes,$libecpg);
$ecpg->AddIncludeDir('src\interfaces\ecpg\include');
$ecpg->AddIncludeDir('src\interfaces\libpq'); my $ecpg = $solution->AddProject('ecpg','exe','interfaces','src\interfaces\ecpg\preproc');
$ecpg->AddFiles('src\interfaces\ecpg\preproc','pgc.l','preproc.y'); $ecpg->AddIncludeDir('src\interfaces\ecpg\include');
$ecpg->AddDefine('MAJOR_VERSION=4'); $ecpg->AddIncludeDir('src\interfaces\libpq');
$ecpg->AddDefine('MINOR_VERSION=2'); $ecpg->AddFiles('src\interfaces\ecpg\preproc','pgc.l','preproc.y');
$ecpg->AddDefine('PATCHLEVEL=1'); $ecpg->AddDefine('MAJOR_VERSION=4');
$ecpg->AddReference($libpgport); $ecpg->AddDefine('MINOR_VERSION=2');
$ecpg->AddDefine('PATCHLEVEL=1');
$ecpg->AddReference($libpgport);
}
else
{
print "Not building ecpg due to lack of pthreads.\n";
} }
else {
print "Not building ecpg due to lack of pthreads.\n";
}
# src/bin # src/bin
my $initdb = AddSimpleFrontend('initdb', 1); my $initdb = AddSimpleFrontend('initdb', 1);
...@@ -158,113 +172,130 @@ my $zic = $solution->AddProject('zic','exe','utils'); ...@@ -158,113 +172,130 @@ my $zic = $solution->AddProject('zic','exe','utils');
$zic->AddFiles('src\timezone','zic.c','ialloc.c','scheck.c','localtime.c'); $zic->AddFiles('src\timezone','zic.c','ialloc.c','scheck.c','localtime.c');
$zic->AddReference($libpgport); $zic->AddReference($libpgport);
my $contrib_defines = { my $contrib_defines = {'refint' => 'REFINT_VERBOSE'};
'refint' => 'REFINT_VERBOSE'
};
my @contrib_uselibpq = ('dblink', 'oid2name', 'pgbench', 'vacuumlo'); my @contrib_uselibpq = ('dblink', 'oid2name', 'pgbench', 'vacuumlo');
my @contrib_uselibpgport = ('oid2name', 'pgbench', 'pg_standby', 'vacuumlo'); my @contrib_uselibpgport = ('oid2name', 'pgbench', 'pg_standby', 'vacuumlo');
my $contrib_extralibs = { my $contrib_extralibs = {'pgbench' => ['wsock32.lib']};
'pgbench' => ['wsock32.lib'] my $contrib_extraincludes = {'tsearch2' => ['contrib/tsearch2']};
};
my $contrib_extraincludes = {
'tsearch2' => ['contrib/tsearch2']
};
my $contrib_extrasource = { my $contrib_extrasource = {
'cube' => ['cubescan.l','cubeparse.y'], 'cube' => ['cubescan.l','cubeparse.y'],
'seg' => ['segscan.l','segparse.y'] 'seg' => ['segscan.l','segparse.y']
}; };
my @contrib_excludes = ('pgcrypto'); my @contrib_excludes = ('pgcrypto');
if ($solution->{options}->{xml}) { if ($solution->{options}->{xml})
$contrib_extraincludes->{'xml2'} = [$solution->{options}->{xml} . '\include' , {
$solution->{options}->{xslt} . '\include', $contrib_extraincludes->{'xml2'} = [
$solution->{options}->{iconv} . '\include']; $solution->{options}->{xml} . '\include',
$solution->{options}->{xslt} . '\include',
$contrib_extralibs->{'xml2'} = [$solution->{options}->{xml} . '\lib\libxml2.lib', $solution->{options}->{iconv} . '\include'
$solution->{options}->{xslt} . '\lib\libxslt.lib']; ];
$contrib_extralibs->{'xml2'} = [
$solution->{options}->{xml} . '\lib\libxml2.lib',
$solution->{options}->{xslt} . '\lib\libxslt.lib'
];
} }
else { else
push @contrib_excludes,'xml2'; {
push @contrib_excludes,'xml2';
} }
if (!$solution->{options}->{openssl}) { if (!$solution->{options}->{openssl})
push @contrib_excludes,'sslinfo'; {
push @contrib_excludes,'sslinfo';
} }
# Pgcrypto makefile too complex to parse.... # Pgcrypto makefile too complex to parse....
my $pgcrypto = $solution->AddProject('pgcrypto','dll','crypto'); my $pgcrypto = $solution->AddProject('pgcrypto','dll','crypto');
$pgcrypto->AddFiles('contrib\pgcrypto','pgcrypto.c','px.c','px-hmac.c','px-crypt.c', $pgcrypto->AddFiles(
'crypt-gensalt.c','crypt-blowfish.c','crypt-des.c','crypt-md5.c','mbuf.c', 'contrib\pgcrypto','pgcrypto.c','px.c','px-hmac.c',
'pgp.c','pgp-armor.c','pgp-cfb.c','pgp-compress.c','pgp-decrypt.c','pgp-encrypt.c', 'px-crypt.c','crypt-gensalt.c','crypt-blowfish.c','crypt-des.c',
'pgp-info.c','pgp-mpi.c','pgp-pubdec.c','pgp-pubenc.c','pgp-pubkey.c','pgp-s2k.c', 'crypt-md5.c','mbuf.c','pgp.c','pgp-armor.c',
'pgp-pgsql.c'); 'pgp-cfb.c','pgp-compress.c','pgp-decrypt.c','pgp-encrypt.c',
if ($solution->{options}->{openssl}) { 'pgp-info.c','pgp-mpi.c','pgp-pubdec.c','pgp-pubenc.c',
$pgcrypto->AddFiles('contrib\pgcrypto', 'openssl.c','pgp-mpi-openssl.c'); 'pgp-pubkey.c','pgp-s2k.c','pgp-pgsql.c'
);
if ($solution->{options}->{openssl})
{
$pgcrypto->AddFiles('contrib\pgcrypto', 'openssl.c','pgp-mpi-openssl.c');
} }
else { else
$pgcrypto->AddFiles('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'); $pgcrypto->AddFiles(
'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'
);
} }
$pgcrypto->AddReference($postgres); $pgcrypto->AddReference($postgres);
$pgcrypto->AddLibrary('wsock32.lib'); $pgcrypto->AddLibrary('wsock32.lib');
my $D; my $D;
opendir($D, 'contrib') || croak "Could not opendir on contrib!\n"; opendir($D, 'contrib') || croak "Could not opendir on contrib!\n";
while (my $d = readdir($D)) { while (my $d = readdir($D))
next if ($d =~ /^\./); {
next unless (-f "contrib/$d/Makefile"); next if ($d =~ /^\./);
next if (grep {/^$d$/} @contrib_excludes); next unless (-f "contrib/$d/Makefile");
AddContrib($d); next if (grep {/^$d$/} @contrib_excludes);
AddContrib($d);
} }
closedir($D); closedir($D);
my $mf = Project::read_file('src\backend\utils\mb\conversion_procs\Makefile'); my $mf = Project::read_file('src\backend\utils\mb\conversion_procs\Makefile');
$mf =~ s{\\s*[\r\n]+}{}mg; $mf =~ s{\\s*[\r\n]+}{}mg;
$mf =~ m{DIRS\s*=\s*(.*)$}m || die 'Could not match in conversion makefile' . "\n"; $mf =~ m{DIRS\s*=\s*(.*)$}m || die 'Could not match in conversion makefile' . "\n";
foreach my $sub (split /\s+/,$1) { foreach my $sub (split /\s+/,$1)
my $mf = Project::read_file('src\backend\utils\mb\conversion_procs\\' . $sub . '\Makefile'); {
my $p = $solution->AddProject($sub, 'dll', 'conversion procs'); my $mf = Project::read_file('src\backend\utils\mb\conversion_procs\\' . $sub . '\Makefile');
$p->AddFile('src\backend\utils\mb\conversion_procs\\' . $sub . '\\' . $sub . '.c'); my $p = $solution->AddProject($sub, 'dll', 'conversion procs');
if ($mf =~ m{^SRCS\s*\+=\s*(.*)$}m) { $p->AddFile('src\backend\utils\mb\conversion_procs\\' . $sub . '\\' . $sub . '.c');
$p->AddFile('src\backend\utils\mb\conversion_procs\\' . $sub . '\\' . $1); if ($mf =~ m{^SRCS\s*\+=\s*(.*)$}m)
} {
$p->AddReference($postgres); $p->AddFile('src\backend\utils\mb\conversion_procs\\' . $sub . '\\' . $1);
}
$p->AddReference($postgres);
} }
$mf = Project::read_file('src\bin\scripts\Makefile'); $mf = Project::read_file('src\bin\scripts\Makefile');
$mf =~ s{\\s*[\r\n]+}{}mg; $mf =~ s{\\s*[\r\n]+}{}mg;
$mf =~ m{PROGRAMS\s*=\s*(.*)$}m || die 'Could not match in bin\scripts\Makefile' . "\n"; $mf =~ m{PROGRAMS\s*=\s*(.*)$}m || die 'Could not match in bin\scripts\Makefile' . "\n";
foreach my $prg (split /\s+/,$1) { foreach my $prg (split /\s+/,$1)
my $proj = $solution->AddProject($prg,'exe','bin'); {
$mf =~ m{$prg\s*:\s*(.*)$}m || die 'Could not find script define for $prg' . "\n"; my $proj = $solution->AddProject($prg,'exe','bin');
my @files = split /\s+/,$1; $mf =~ m{$prg\s*:\s*(.*)$}m || die 'Could not find script define for $prg' . "\n";
foreach my $f (@files) { my @files = split /\s+/,$1;
if ($f =~ /\/keywords\.o$/) { foreach my $f (@files)
$proj->AddFile('src\backend\parser\keywords.c'); {
} if ($f =~ /\/keywords\.o$/)
else { {
$f =~ s/\.o$/\.c/; $proj->AddFile('src\backend\parser\keywords.c');
if ($f eq 'dumputils.c') { }
$proj->AddFile('src\bin\pg_dump\dumputils.c'); else
} {
elsif ($f =~ /print\.c$/) { # Also catches mbprint.c $f =~ s/\.o$/\.c/;
$proj->AddFile('src\bin\psql\\' . $f); if ($f eq 'dumputils.c')
} {
else { $proj->AddFile('src\bin\pg_dump\dumputils.c');
$proj->AddFile('src\bin\scripts\\' . $f); }
} elsif ($f =~ /print\.c$/)
} { # Also catches mbprint.c
} $proj->AddFile('src\bin\psql\\' . $f);
$proj->AddIncludeDir('src\interfaces\libpq'); }
$proj->AddIncludeDir('src\bin\pg_dump'); else
$proj->AddIncludeDir('src\bin\psql'); {
$proj->AddReference($libpq,$libpgport); $proj->AddFile('src\bin\scripts\\' . $f);
$proj->AddResourceFile('src\bin\scripts','PostgreSQL Utility'); }
}
}
$proj->AddIncludeDir('src\interfaces\libpq');
$proj->AddIncludeDir('src\bin\pg_dump');
$proj->AddIncludeDir('src\bin\psql');
$proj->AddReference($libpq,$libpgport);
$proj->AddResourceFile('src\bin\scripts','PostgreSQL Utility');
} }
# Regression DLL and EXE # Regression DLL and EXE
my $regress = $solution->AddProject('regress','dll','misc'); my $regress = $solution->AddProject('regress','dll','misc');
$regress->AddFile('src\test\regress\regress.c'); $regress->AddFile('src\test\regress\regress.c');
...@@ -284,101 +315,124 @@ $solution->Save(); ...@@ -284,101 +315,124 @@ $solution->Save();
##################### #####################
# Add a simple frontend project (exe) # Add a simple frontend project (exe)
sub AddSimpleFrontend { sub AddSimpleFrontend
my $n = shift; {
my $uselibpq= shift; my $n = shift;
my $uselibpq= shift;
my $p = $solution->AddProject($n,'exe','bin');
$p->AddDir('src\bin\\' . $n); my $p = $solution->AddProject($n,'exe','bin');
$p->AddDefine('FRONTEND'); $p->AddDir('src\bin\\' . $n);
$p->AddReference($libpgport); $p->AddDefine('FRONTEND');
if ($uselibpq) { $p->AddReference($libpgport);
$p->AddIncludeDir('src\interfaces\libpq'); if ($uselibpq)
$p->AddReference($libpq); {
} $p->AddIncludeDir('src\interfaces\libpq');
return $p; $p->AddReference($libpq);
}
return $p;
} }
# Add a simple contrib project # Add a simple contrib project
sub AddContrib { sub AddContrib
my $n = shift; {
my $mf = Project::read_file('contrib\\' . $n . '\Makefile'); my $n = shift;
my $mf = Project::read_file('contrib\\' . $n . '\Makefile');
if ($mf =~ /^MODULE_big/mg) {
$mf =~ s{\\\s*[\r\n]+}{}mg; if ($mf =~ /^MODULE_big/mg)
my $proj = $solution->AddProject($n, 'dll', 'contrib'); {
$mf =~ /^OBJS\s*=\s*(.*)$/gm || croak "Could not find objects in MODULE_big for $n\n"; $mf =~ s{\\\s*[\r\n]+}{}mg;
foreach my $o (split /\s+/, $1) { my $proj = $solution->AddProject($n, 'dll', 'contrib');
$o =~ s/\.o$/.c/; $mf =~ /^OBJS\s*=\s*(.*)$/gm || croak "Could not find objects in MODULE_big for $n\n";
$proj->AddFile('contrib\\' . $n . '\\' . $o); foreach my $o (split /\s+/, $1)
} {
$proj->AddReference($postgres); $o =~ s/\.o$/.c/;
if ($mf =~ /^SUBDIRS\s*:?=\s*(.*)$/mg) { $proj->AddFile('contrib\\' . $n . '\\' . $o);
foreach my $d (split /\s+/, $1) { }
my $mf2 = Project::read_file('contrib\\' . $n . '\\' . $d . '\Makefile'); $proj->AddReference($postgres);
$mf2 =~ s{\\\s*[\r\n]+}{}mg; if ($mf =~ /^SUBDIRS\s*:?=\s*(.*)$/mg)
$mf2 =~ /^SUBOBJS\s*=\s*(.*)$/gm || croak "Could not find objects in MODULE_big for $n, subdir $d\n"; {
foreach my $o (split /\s+/, $1) { foreach my $d (split /\s+/, $1)
$o =~ s/\.o$/.c/; {
$proj->AddFile('contrib\\' . $n . '\\' . $d . '\\' . $o); my $mf2 = Project::read_file('contrib\\' . $n . '\\' . $d . '\Makefile');
} $mf2 =~ s{\\\s*[\r\n]+}{}mg;
} $mf2 =~ /^SUBOBJS\s*=\s*(.*)$/gm
} || croak "Could not find objects in MODULE_big for $n, subdir $d\n";
AdjustContribProj($proj); foreach my $o (split /\s+/, $1)
return $proj; {
} $o =~ s/\.o$/.c/;
elsif ($mf =~ /^MODULES\s*=\s*(.*)$/mg) { $proj->AddFile('contrib\\' . $n . '\\' . $d . '\\' . $o);
foreach my $mod (split /\s+/, $1) { }
my $proj = $solution->AddProject($mod, 'dll', 'contrib'); }
$proj->AddFile('contrib\\' . $n . '\\' . $mod . '.c'); }
$proj->AddReference($postgres); AdjustContribProj($proj);
AdjustContribProj($proj); return $proj;
} }
return undef; elsif ($mf =~ /^MODULES\s*=\s*(.*)$/mg)
} {
elsif ($mf =~ /^PROGRAM\s*=\s*(.*)$/mg) { foreach my $mod (split /\s+/, $1)
my $proj = $solution->AddProject($1, 'exe', 'contrib'); {
$mf =~ /^OBJS\s*=\s*(.*)$/gm || croak "Could not find objects in MODULE_big for $n\n"; my $proj = $solution->AddProject($mod, 'dll', 'contrib');
foreach my $o (split /\s+/, $1) { $proj->AddFile('contrib\\' . $n . '\\' . $mod . '.c');
$o =~ s/\.o$/.c/; $proj->AddReference($postgres);
$proj->AddFile('contrib\\' . $n . '\\' . $o); AdjustContribProj($proj);
} }
AdjustContribProj($proj); return undef;
return $proj; }
} elsif ($mf =~ /^PROGRAM\s*=\s*(.*)$/mg)
else { {
croak "Could not determine contrib module type for $n\n"; my $proj = $solution->AddProject($1, 'exe', 'contrib');
} $mf =~ /^OBJS\s*=\s*(.*)$/gm || croak "Could not find objects in MODULE_big for $n\n";
foreach my $o (split /\s+/, $1)
{
$o =~ s/\.o$/.c/;
$proj->AddFile('contrib\\' . $n . '\\' . $o);
}
AdjustContribProj($proj);
return $proj;
}
else
{
croak "Could not determine contrib module type for $n\n";
}
} }
sub AdjustContribProj { sub AdjustContribProj
my $proj = shift; {
my $n = $proj->{name}; my $proj = shift;
my $n = $proj->{name};
if ($contrib_defines->{$n}) {
foreach my $d ($contrib_defines->{$n}) { if ($contrib_defines->{$n})
$proj->AddDefine($d); {
} foreach my $d ($contrib_defines->{$n})
} {
if (grep {/^$n$/} @contrib_uselibpq) { $proj->AddDefine($d);
$proj->AddIncludeDir('src\interfaces\libpq'); }
$proj->AddReference($libpq); }
} if (grep {/^$n$/} @contrib_uselibpq)
if (grep {/^$n$/} @contrib_uselibpgport) { {
$proj->AddReference($libpgport); $proj->AddIncludeDir('src\interfaces\libpq');
} $proj->AddReference($libpq);
if ($contrib_extralibs->{$n}) { }
foreach my $l (@{$contrib_extralibs->{$n}}) { if (grep {/^$n$/} @contrib_uselibpgport)
$proj->AddLibrary($l); {
} $proj->AddReference($libpgport);
} }
if ($contrib_extraincludes->{$n}) { if ($contrib_extralibs->{$n})
foreach my $i (@{$contrib_extraincludes->{$n}}) { {
$proj->AddIncludeDir($i); foreach my $l (@{$contrib_extralibs->{$n}})
} {
} $proj->AddLibrary($l);
if ($contrib_extrasource->{$n}) { }
$proj->AddFiles('contrib\\' . $n, @{$contrib_extrasource->{$n}}); }
} if ($contrib_extraincludes->{$n})
{
foreach my $i (@{$contrib_extraincludes->{$n}})
{
$proj->AddIncludeDir($i);
}
}
if ($contrib_extrasource->{$n})
{
$proj->AddFiles('contrib\\' . $n, @{$contrib_extrasource->{$n}});
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment