diff -Napcdr -x .git postgresql/src/tools/msvc/Install.pm postgresql_dev/src/tools/msvc/Install.pm *** postgresql/src/tools/msvc/Install.pm Tue Jun 7 05:07:51 2011 --- postgresql_dev/src/tools/msvc/Install.pm Tue Jun 7 05:10:40 2011 *************** sub Install *** 56,66 **** my $majorver = DetermineMajorVersion(); print "Installing version $majorver for $conf in $target\n"; ! EnsureDirectories( ! $target, 'bin', 'lib', 'share', ! 'share/timezonesets','share/extension', 'share/contrib','doc', ! 'doc/extension', 'doc/contrib','symbols', 'share/tsearch_data' ! ); CopySolutionOutput($conf, $target); lcopy($target . '/lib/libpq.dll', $target . '/bin/libpq.dll'); --- 56,63 ---- my $majorver = DetermineMajorVersion(); print "Installing version $majorver for $conf in $target\n"; ! EnsureDirectories($target, 'bin', 'lib', 'share','share/timezonesets','share/extension', ! 'share/contrib','doc','doc/extension', 'doc/contrib','symbols', 'share/tsearch_data'); CopySolutionOutput($conf, $target); lcopy($target . '/lib/libpq.dll', $target . '/bin/libpq.dll'); *************** sub CopySolutionOutput *** 186,191 **** --- 183,195 ---- my $rem = qr{Project\("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}"\) = "([^"]+)"}; my $sln = read_file("pgsql.sln") || croak "Could not open pgsql.sln\n"; + + my $vcproj = 'vcproj'; + if ($sln =~ /Microsoft Visual Studio Solution File, Format Version (\d+)\.\d+/ && $1 >= 11) + { + $vcproj = 'vcxproj'; + } + print "Copying build output files..."; while ($sln =~ $rem) { *************** sub CopySolutionOutput *** 195,220 **** $sln =~ s/$rem//; ! my $proj = read_file("$pf.vcproj") || croak "Could not open $pf.vcproj\n"; ! if ($proj !~ qr{ConfigurationType="([^"]+)"}) ! { ! croak "Could not parse $pf.vcproj\n"; ! } ! if ($1 == 1) { ! $dir = "bin"; ! $ext = "exe"; } ! elsif ($1 == 2) { ! $dir = "lib"; ! $ext = "dll"; } else { ! ! # Static lib, such as libpgport, only used internally during build, don't install ! next; } lcopy("$conf\\$pf\\$pf.$ext","$target\\$dir\\$pf.$ext") || croak "Could not copy $pf.$ext\n"; --- 199,246 ---- $sln =~ s/$rem//; ! my $proj = read_file("$pf.$vcproj") || croak "Could not open $pf.$vcproj\n"; ! if ($vcproj eq 'vcproj' && $proj =~ qr{ConfigurationType="([^"]+)"}) { ! if ($1 == 1) ! { ! $dir = "bin"; ! $ext = "exe"; ! } ! elsif ($1 == 2) ! { ! $dir = "lib"; ! $ext = "dll"; ! } ! else ! { ! ! # Static lib, such as libpgport, only used internally during build, don't install ! next; ! } } ! elsif ($vcproj eq 'vcxproj' && $proj =~ qr{(\w+)}) { ! if ($1 eq 'Application') ! { ! $dir = "bin"; ! $ext = "exe"; ! } ! elsif ($1 eq 'DynamicLibrary') ! { ! $dir = "lib"; ! $ext = "dll"; ! } ! else # 'StaticLibrary' ! { ! ! # Static lib, such as libpgport, only used internally during build, don't install ! next; ! } } else { ! croak "Could not parse $pf.$vcproj\n"; } lcopy("$conf\\$pf\\$pf.$ext","$target\\$dir\\$pf.$ext") || croak "Could not copy $pf.$ext\n"; *************** sub CopyIncludeFiles *** 470,477 **** $target . '/include/server/', 'src/include/', 'pg_config.h', 'pg_config_os.h' ); ! CopyFiles('Grammar header', $target . '/include/server/parser/','src/backend/parser/', ! 'gram.h'); CopySetOfFiles('',[ glob("src\\include\\*.h") ],$target . '/include/server/'); my $D; opendir($D, 'src/include') || croak "Could not opendir on src/include!\n"; --- 496,502 ---- $target . '/include/server/', 'src/include/', 'pg_config.h', 'pg_config_os.h' ); ! CopyFiles('Grammar header', $target . '/include/server/parser/','src/backend/parser/','gram.h'); CopySetOfFiles('',[ glob("src\\include\\*.h") ],$target . '/include/server/'); my $D; opendir($D, 'src/include') || croak "Could not opendir on src/include!\n"; diff -Napcdr -x .git postgresql/src/tools/msvc/Mkvcbuild.pm postgresql_dev/src/tools/msvc/Mkvcbuild.pm *** postgresql/src/tools/msvc/Mkvcbuild.pm Tue Jun 7 05:07:51 2011 --- postgresql_dev/src/tools/msvc/Mkvcbuild.pm Tue Jun 7 05:10:40 2011 *************** sub mkvcbuild *** 45,51 **** chdir('..\..\..') if (-d '..\msvc' && -d '..\..\..\src'); die 'Must run from root or msvc directory' unless (-d 'src\tools\msvc' && -d 'src'); ! $solution = new Solution($config); our @pgportfiles = qw( chklocale.c crypt.c fseeko.c getrusage.c inet_aton.c random.c srandom.c --- 45,53 ---- chdir('..\..\..') if (-d '..\msvc' && -d '..\..\..\src'); die 'Must run from root or msvc directory' unless (-d 'src\tools\msvc' && -d 'src'); ! my $vsVersion = VSObjectFactory::DetermineVisualStudioVersion(); ! ! $solution = VSObjectFactory::CreateSolution($vsVersion, $config); our @pgportfiles = qw( chklocale.c crypt.c fseeko.c getrusage.c inet_aton.c random.c srandom.c *************** sub mkvcbuild *** 488,493 **** --- 490,496 ---- $pgregress->AddReference($libpgport); $solution->Save(); + return $solution->{vcver}; } ##################### diff -Napcdr -x .git postgresql/src/tools/msvc/Project.pm postgresql_dev/src/tools/msvc/Project.pm *** postgresql/src/tools/msvc/Project.pm Tue Jun 7 05:05:52 2011 --- postgresql_dev/src/tools/msvc/Project.pm Tue Jun 7 05:10:40 2011 *************** use strict; *** 10,18 **** use warnings; use File::Basename; ! sub new { ! my ($junk, $name, $type, $solution) = @_; my $good_types = { lib => 1, exe => 1, --- 10,18 ---- use warnings; use File::Basename; ! sub _new { ! my ($classname, $name, $type, $solution) = @_; my $good_types = { lib => 1, exe => 1, *************** sub new *** 20,43 **** }; confess("Bad project type: $type\n") unless exists $good_types->{$type}; my $self = { ! name => $name, ! type => $type, ! guid => Win32::GuidGen(), ! files => {}, ! references => [], ! libraries => [], ! suffixlib => [], ! includes => '', ! prefixincludes => '', ! defines => ';', ! solution => $solution, ! disablewarnings => '4018;4244;4273;4102;4090;4267', disablelinkerwarnings => '', ! vcver => $solution->{vcver}, ! platform => $solution->{platform}, }; ! bless $self; return $self; } --- 20,46 ---- }; confess("Bad project type: $type\n") unless exists $good_types->{$type}; my $self = { ! name => $name, ! type => $type, ! guid => Win32::GuidGen(), ! files => {}, ! references => [], ! libraries => [], ! suffixlib => [], ! includes => '', ! prefixincludes => '', ! defines => ';', ! solution => $solution, ! disablewarnings => '4018;4244;4273;4102;4090;4267', disablelinkerwarnings => '', ! ! # vcver has to be set in derived classes ! vcver => undef, ! filenameExtension => '.vcproj', ! platform => $solution->{platform}, }; ! bless($self, $classname); return $self; } *************** sub Save *** 355,371 **** $self->DisableLinkerWarnings('4197') if ($self->{platform} eq 'x64'); # Dump the project ! open(F, ">$self->{name}.vcproj") || croak("Could not write to $self->{name}.vcproj\n"); $self->WriteHeader(*F); ! $self->WriteReferences(*F); ! print F < EOF my @dirstack = (); my %uniquefiles; ! foreach my $f (sort keys %{ $self->{files} }) { ! confess "Bad format filename '$f'\n" unless ($f =~ /^(.*)\\([^\\]+)\.[r]?[cyl]$/); my $dir = $1; my $file = $2; --- 358,407 ---- $self->DisableLinkerWarnings('4197') if ($self->{platform} eq 'x64'); # Dump the project ! open(F, ">$self->{name}$self->{filenameExtension}") ! || croak("Could not write to $self->{name}$self->{filenameExtension}\n"); $self->WriteHeader(*F); ! $self->WriteFiles(*F); ! $self->Footer(*F); ! close(F); ! } ! ! sub GenerateCustomTool ! { ! my ($self, $desc, $tool, $output, $cfg) = @_; ! if (!defined($cfg)) ! { ! return $self->GenerateCustomTool($desc, $tool, $output, 'Debug') ! .$self->GenerateCustomTool($desc, $tool, $output, 'Release'); ! } ! return ! "{platform}\">"; ! } ! ! sub WriteReferences ! { ! my ($self, $f) = @_; ! print $f " \n"; ! foreach my $ref (@{$self->{references}}) ! { ! print $f ! " {guid}\" Name=\"$ref->{name}\" />\n"; ! } ! print $f " \n"; ! } ! ! sub WriteFiles ! { ! my ($self, $f) = @_; ! print $f < EOF my @dirstack = (); my %uniquefiles; ! foreach my $fileNameWithPath (sort keys %{ $self->{files} }) { ! confess "Bad format filename '$fileNameWithPath'\n" ! unless ($fileNameWithPath =~ /^(.*)\\([^\\]+)\.[r]?[cyl]$/); my $dir = $1; my $file = $2; *************** EOF *** 377,383 **** last if (length($dir) == length(join('\\',@dirstack))); last if (substr($dir, length(join('\\',@dirstack)),1) eq '\\'); } ! print F ' ' x $#dirstack . " \n"; pop @dirstack; } --- 413,419 ---- last if (length($dir) == length(join('\\',@dirstack))); last if (substr($dir, length(join('\\',@dirstack)),1) eq '\\'); } ! print $f ' ' x $#dirstack . " \n"; pop @dirstack; } *************** EOF *** 388,414 **** $left =~ s/^\\//; my @pieces = split /\\/, $left; push @dirstack, $pieces[0]; ! print F ' ' x $#dirstack . " \n"; } ! print F ' ' x $#dirstack . " ' ! . $self->GenerateCustomTool('Running bison on ' . $f, ! 'cmd /V:ON /c src\tools\msvc\pgbison.bat ' . $f, $of) . '' . "\n"; } ! elsif ($f =~ /\.l$/) { ! my $of = $f; $of =~ s/\.l$/.c/; ! print F '>' ! . $self->GenerateCustomTool('Running flex on ' . $f, ! 'src\tools\msvc\pgflex.bat ' . $f,$of) . '' . "\n"; } elsif (defined($uniquefiles{$file})) --- 424,450 ---- $left =~ s/^\\//; my @pieces = split /\\/, $left; push @dirstack, $pieces[0]; ! print $f ' ' x $#dirstack . " \n"; } ! print $f ' ' x $#dirstack . " ' ! . $self->GenerateCustomTool('Running bison on ' . $fileNameWithPath, ! "perl src\\tools\\msvc\\pgbison.pl $fileNameWithPath", $of) . '' . "\n"; } ! elsif ($fileNameWithPath =~ /\.l$/) { ! my $of = $fileNameWithPath; $of =~ s/\.l$/.c/; ! print $f '>' ! . $self->GenerateCustomTool('Running flex on ' . $fileNameWithPath, ! "perl src\\tools\\msvc\\pgflex.pl $fileNameWithPath", $of) . '' . "\n"; } elsif (defined($uniquefiles{$file})) *************** EOF *** 417,423 **** # File already exists, so fake a new name my $obj = $dir; $obj =~ s/\\/_/g; ! print F ">{platform}\">{name}\\$obj" . "_$file.obj\" />{platform}\">{name}\\$obj" . "_$file.obj\" />\n"; --- 453,459 ---- # File already exists, so fake a new name my $obj = $dir; $obj =~ s/\\/_/g; ! print $f ">{platform}\">{name}\\$obj" . "_$file.obj\" />{platform}\">{name}\\$obj" . "_$file.obj\" />\n"; *************** EOF *** 425,464 **** else { $uniquefiles{$file} = 1; ! print F " />\n"; } } while ($#dirstack >= 0) { ! print F ' ' x $#dirstack . " \n"; pop @dirstack; } ! $self->Footer(*F); ! close(F); ! } ! ! sub GenerateCustomTool ! { ! my ($self, $desc, $tool, $output, $cfg) = @_; ! if (!defined($cfg)) ! { ! return $self->GenerateCustomTool($desc, $tool, $output, 'Debug') ! .$self->GenerateCustomTool($desc, $tool, $output, 'Release'); ! } ! return ! "{platform}\">"; ! } ! ! sub WriteReferences ! { ! my ($self, $f) = @_; ! print $f " \n"; ! foreach my $ref (@{$self->{references}}) ! { ! print $f ! " {guid}\" Name=\"$ref->{name}\" />\n"; ! } ! print $f " \n"; } sub WriteHeader --- 461,477 ---- else { $uniquefiles{$file} = 1; ! print $f " />\n"; } } while ($#dirstack >= 0) { ! print $f ' ' x $#dirstack . " \n"; pop @dirstack; } ! print $f < ! EOF } sub WriteHeader *************** EOF *** 478,489 **** print $f < EOF } ! sub WriteConfiguration { ! my ($self, $f, $cfgname, $p) = @_; ! my $cfgtype = ($self->{type} eq "exe")?1:($self->{type} eq "dll"?2:4); my $libcfg = (uc $cfgname eq "RELEASE")?"MD":"MDd"; my $libs = ''; foreach my $lib (@{$self->{libraries}}) --- 491,502 ---- print $f < EOF + $self->WriteReferences($f); } ! sub GetAdditionalLinkerDependencies { ! my ($self, $cfgname, $seperator) = @_; my $libcfg = (uc $cfgname eq "RELEASE")?"MD":"MDd"; my $libs = ''; foreach my $lib (@{$self->{libraries}}) *************** sub WriteConfiguration *** 497,506 **** last; } } ! $libs .= $xlib . " "; } ! $libs =~ s/ $//; $libs =~ s/__CFGNAME__/$cfgname/g; my $targetmachine = $self->{platform} eq 'Win32' ? 1 : 17; --- 510,527 ---- last; } } ! $libs .= $xlib . $seperator; } ! $libs =~ s/.$//; $libs =~ s/__CFGNAME__/$cfgname/g; + return $libs; + } + + sub WriteConfiguration + { + my ($self, $f, $cfgname, $p) = @_; + my $cfgtype = ($self->{type} eq "exe")?1:($self->{type} eq "dll"?2:4); + my $libs = $self->GetAdditionalLinkerDependencies($cfgname, ' '); my $targetmachine = $self->{platform} eq 'Win32' ? 1 : 17; *************** sub Footer *** 563,569 **** my ($self, $f) = @_; print $f < EOF --- 584,589 ---- diff -Napcdr -x .git postgresql/src/tools/msvc/Solution.pm postgresql_dev/src/tools/msvc/Solution.pm *** postgresql/src/tools/msvc/Solution.pm Tue Jun 7 05:07:51 2011 --- postgresql_dev/src/tools/msvc/Solution.pm Tue Jun 7 05:10:41 2011 *************** package Solution; *** 8,17 **** use Carp; use strict; use warnings; ! sub new { ! my $junk = shift; my $options = shift; my $self = { projects => {}, --- 8,18 ---- use Carp; use strict; use warnings; + use VSObjectFactory; ! sub _new { ! my $classname = shift; my $options = shift; my $self = { projects => {}, *************** sub new *** 21,27 **** vcver => undef, platform => undef, }; ! bless $self; # integer_datetimes is now the default $options->{integer_datetimes} = 1 --- 22,28 ---- vcver => undef, platform => undef, }; ! bless($self, $classname); # integer_datetimes is now the default $options->{integer_datetimes} = 1 *************** sub new *** 53,80 **** die "Bad wal_segsize $options->{wal_segsize}" unless grep {$_ == $options->{wal_segsize}} (1,2,4,8,16,32,64); ! $self->DetermineToolVersions(); return $self; } ! sub DetermineToolVersions { my $self = shift; - # Determine version of vcbuild command, to set proper verison of visual studio - open(P,"vcbuild /? |") || die "vcbuild command not found"; - my $line =

; - close(P); - if ($line !~ /^Microsoft\s*\(R\) Visual C\+\+ [^-]+ - \D+(\d+)\.00\.\d+/) - { - die "Unable to determine vcbuild version from first line of output!"; - } - if ($1 == 8) { $self->{vcver} = '8.00' } - elsif ($1 == 9) { $self->{vcver} = '9.00' } - else { die "Unsupported version of Visual Studio: $1" } - print "Detected Visual Studio version $self->{vcver}\n"; - # Determine if we are in 32 or 64-bit mode. Do this by seeing if CL has # 64-bit only parameters. $self->{platform} = 'Win32'; --- 54,68 ---- die "Bad wal_segsize $options->{wal_segsize}" unless grep {$_ == $options->{wal_segsize}} (1,2,4,8,16,32,64); ! $self->DeterminePlatform(); return $self; } ! sub DeterminePlatform { my $self = shift; # Determine if we are in 32 or 64-bit mode. Do this by seeing if CL has # 64-bit only parameters. $self->{platform} = 'Win32'; *************** sub AddProject *** 428,434 **** { my ($self, $name, $type, $folder, $initialdir) = @_; ! my $proj = new Project($name, $type, $self); push @{$self->{projects}->{$folder}}, $proj; $proj->AddDir($initialdir) if ($initialdir); if ($self->{options}->{zlib}) --- 416,422 ---- { my ($self, $name, $type, $folder, $initialdir) = @_; ! my $proj = VSObjectFactory::CreateProject($self->{vcver}, $name, $type, $self); push @{$self->{projects}->{$folder}}, $proj; $proj->AddDir($initialdir) if ($initialdir); if ($self->{options}->{zlib}) *************** sub Save *** 488,495 **** open(SLN,">pgsql.sln") || croak "Could not write to pgsql.sln\n"; print SLN <{projects}}) --- 476,483 ---- open(SLN,">pgsql.sln") || croak "Could not write to pgsql.sln\n"; print SLN <{solutionFileVersion} ! # $self->{visualStudioName} EOF foreach my $fld (keys %{$self->{projects}}) *************** EOF *** 497,503 **** foreach my $proj (@{$self->{projects}->{$fld}}) { print SLN <{name}.vcproj", "$proj->{guid}" EndProject EOF } --- 485,491 ---- foreach my $proj (@{$self->{projects}->{$fld}}) { print SLN <{name}$proj->{filenameExtension}", "$proj->{guid}" EndProject EOF } diff -Napcdr -x .git postgresql/src/tools/msvc/VC2005Project.pm postgresql_dev/src/tools/msvc/VC2005Project.pm *** postgresql/src/tools/msvc/VC2005Project.pm Thu Jan 1 00:00:00 1970 --- postgresql_dev/src/tools/msvc/VC2005Project.pm Tue Jun 7 05:10:41 2011 *************** *** 0 **** --- 1,25 ---- + package VC2005Project; + + # + # Package that encapsulates a Visual C++ 2005 project file + # + # src/tools/msvc/VC2005Project.pm + # + + use Carp; + use strict; + use warnings; + use base qw(Project); + + sub new + { + my $classname = shift; + my $self = $classname->SUPER::_new(@_); + bless($self, $classname); + + $self->{vcver} = '8.00'; + + return $self; + } + + 1; diff -Napcdr -x .git postgresql/src/tools/msvc/VC2008Project.pm postgresql_dev/src/tools/msvc/VC2008Project.pm *** postgresql/src/tools/msvc/VC2008Project.pm Thu Jan 1 00:00:00 1970 --- postgresql_dev/src/tools/msvc/VC2008Project.pm Tue Jun 7 05:10:41 2011 *************** *** 0 **** --- 1,25 ---- + package VC2008Project; + + # + # Package that encapsulates a Visual C++ 2008 project file + # + # src/tools/msvc/VC2008Project.pm + # + + use Carp; + use strict; + use warnings; + use base qw(Project); + + sub new + { + my $classname = shift; + my $self = $classname->SUPER::_new(@_); + bless($self, $classname); + + $self->{vcver} = '9.00'; + + return $self; + } + + 1; diff -Napcdr -x .git postgresql/src/tools/msvc/VC2010Project.pm postgresql_dev/src/tools/msvc/VC2010Project.pm *** postgresql/src/tools/msvc/VC2010Project.pm Thu Jan 1 00:00:00 1970 --- postgresql_dev/src/tools/msvc/VC2010Project.pm Tue Jun 7 05:10:41 2011 *************** *** 0 **** --- 1,368 ---- + package VC2010Project; + + # + # Package that encapsulates a Visual C++ 2010 project file + # + # src/tools/msvc/VC2010Project.pm + # + + use Carp; + use strict; + use warnings; + use base qw(Project); + + sub new + { + my $classname = shift; + my $self = $classname->SUPER::_new(@_); + bless($self, $classname); + + $self->{vcver} = '10.00'; + $self->{filenameExtension} = '.vcxproj'; + + return $self; + } + + sub AddDefine + { + my ($self, $def) = @_; + + $self->{defines} .= $def . ';'; + } + + sub WriteReferences + { + my ($self, $f) = @_; + + my @references = @{$self->{references}}; + + if (scalar(@references)) + { + print $f < + EOF + foreach my $ref (@references) + { + print $f < + $ref->{guid} + + EOF + } + print $f < + EOF + } + } + + sub WriteFiles + { + my ($self, $f) = @_; + print $f < + EOF + my @grammarFiles = (); + my @resourceFiles = (); + my %uniquefiles; + foreach my $fileNameWithPath (sort keys %{ $self->{files} }) + { + confess "Bad format filename '$fileNameWithPath'\n" + unless ($fileNameWithPath =~ /^(.*)\\([^\\]+)\.[r]?[cyl]$/); + my $dir = $1; + my $fileName = $2; + if ($fileNameWithPath =~ /\.y$/ or $fileNameWithPath =~ /\.l$/) + { + push @grammarFiles, $fileNameWithPath; + } + elsif ($fileNameWithPath =~ /\.rc$/) + { + push @resourceFiles, $fileNameWithPath; + } + elsif (defined($uniquefiles{$fileName})) + { + + # File already exists, so fake a new name + my $obj = $dir; + $obj =~ s/\\/_/g; + + print $f < + .\\debug\\$self->{name}\\${obj}_$fileName.obj + .\\release\\$self->{name}\\${obj}_$fileName.obj + + EOF + } + else + { + $uniquefiles{$fileName} = 1; + print $f < + EOF + } + + } + print $f < + EOF + if (scalar(@grammarFiles)) + { + print $f < + EOF + foreach my $grammarFile (@grammarFiles) + { + (my $outputFile = $grammarFile) =~ s/\.(y|l)$/.c/; + if ($grammarFile =~ /\.y$/) + { + $outputFile =~ s{^src\\pl\\plpgsql\\src\\gram.c$}{src\\pl\\plpgsql\\src\\pl_gram.c}; + print $f < + Running bison on $grammarFile + perl "src\\tools\\msvc\\pgbison.pl" "$grammarFile" + %(AdditionalInputs) + $outputFile;%(Outputs) + Running bison on $grammarFile + perl "src\\tools\\msvc\\pgbison.pl" "$grammarFile" + %(AdditionalInputs) + $outputFile;%(Outputs) + + EOF + } + else #if ($grammarFile =~ /\.l$/) + { + print $f < + Running flex on $grammarFile + perl "src\\tools\\msvc\\pgflex.pl" "$grammarFile" + %(AdditionalInputs) + $outputFile;%(Outputs) + Running flex on $grammarFile + perl "src\\tools\\msvc\\pgflex.pl" "$grammarFile" + %(AdditionalInputs) + $outputFile;%(Outputs) + + EOF + } + } + print $f < + EOF + } + if (scalar(@resourceFiles)) + { + print $f < + EOF + foreach my $rcFile (@resourceFiles) + { + print $f < + EOF + } + print $f < + EOF + } + } + + sub WriteHeader + { + my ($self, $f) = @_; + + print $f < + + + EOF + $self->WriteConfigurationHeader($f, 'Debug'); + $self->WriteConfigurationHeader($f, 'Release'); + print $f < + + $self->{guid} + + + EOF + $self->WriteConfigurationPropertyGroup($f, 'Release',{ wholeopt=>'false' }); + $self->WriteConfigurationPropertyGroup($f, 'Debug',{ wholeopt=>'false' }); + print $f < + + + EOF + $self->WritePropertySheetsPropertyGroup($f, 'Release'); + $self->WritePropertySheetsPropertyGroup($f, 'Debug'); + print $f < + + <_ProjectFileVersion>10.0.30319.1 + EOF + $self->WriteAdditionalProperties($f, 'Debug'); + $self->WriteAdditionalProperties($f, 'Release'); + print $f < + EOF + $self->WriteItemDefinitionGroup( + $f, 'Debug', + { + defs=>'_DEBUG;DEBUG=1;', + opt=>'Disabled', + strpool=>'false', + runtime=>'MultiThreadedDebugDLL' + } + ); + $self->WriteItemDefinitionGroup($f, 'Release', + { defs=>'', opt=>'Full', strpool=>'true', runtime=>'MultiThreadedDLL' }); + } + + sub WriteConfigurationHeader + { + my ($self, $f, $cfgname) = @_; + print $f < + $cfgname + $self->{platform} + + EOF + } + + sub WriteConfigurationPropertyGroup + { + my ($self, $f, $cfgname, $p) = @_; + my $cfgtype = + ($self->{type} eq "exe") + ?'Application' + :($self->{type} eq "dll"?'DynamicLibrary':'StaticLibrary'); + + print $f < + $cfgtype + false + MultiByte + $p->{wholeopt} + + EOF + } + + sub WritePropertySheetsPropertyGroup + { + my ($self, $f, $cfgname) = @_; + print $f < + + + EOF + } + + sub WriteAdditionalProperties + { + my ($self, $f, $cfgname) = @_; + print $f <.\\$cfgname\\$self->{name}\\ + .\\$cfgname\\$self->{name}\\ + false + EOF + } + + sub WriteItemDefinitionGroup + { + my ($self, $f, $cfgname, $p) = @_; + my $cfgtype = + ($self->{type} eq "exe") + ?'Application' + :($self->{type} eq "dll"?'DynamicLibrary':'StaticLibrary'); + my $libs = $self->GetAdditionalLinkerDependencies($cfgname, ';'); + + my $targetmachine = $self->{platform} eq 'Win32' ? 'MachineX86' : 'MachineX64'; + + my $includes = $self->{includes}; + unless ($includes eq '' or $includes =~ /;$/) + { + $includes .= ';'; + } + print $f < + + $p->{opt} + $self->{prefixincludes}src/include;src/include/port/win32;src/include/port/win32_msvc;$includes\%(AdditionalIncludeDirectories) + WIN32;_WINDOWS;__WINDOWS__;__WIN32__;EXEC_BACKEND;WIN32_STACK_RLIMIT=4194304;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE$self->{defines}$p->{defs}\%(PreprocessorDefinitions) + $p->{strpool} + $p->{runtime} + $self->{disablewarnings};\%(DisableSpecificWarnings) + /MP \%(AdditionalOptions) + + + .\\$cfgname\\$self->{name}\\ + .\\$cfgname\\$self->{name}\\ + .\\$cfgname\\$self->{name}\\ + false + Level3 + true + ProgramDatabase + Default + + + .\\$cfgname\\$self->{name}\\$self->{name}.$self->{type} + $libs;\%(AdditionalDependencies) + true + \%(AdditionalLibraryDirectories) + libc;\%(IgnoreSpecificDefaultLibraries) + 4194304 + true + .\\$cfgname\\$self->{name}\\$self->{name}.pdb + false + .\\$cfgname\\$self->{name}\\$self->{name}.map + Console + $targetmachine + EOF + if ($self->{disablelinkerwarnings}) + { + print $f + " /ignore:$self->{disablelinkerwarnings} \%(AdditionalOptions)\n"; + } + if ($self->{implib}) + { + my $l = $self->{implib}; + $l =~ s/__CFGNAME__/$cfgname/g; + print $f " $l\n"; + } + if ($self->{def}) + { + my $d = $self->{def}; + $d =~ s/__CFGNAME__/$cfgname/g; + print $f " $d\n"; + } + print $f < + + src\\include;\%(AdditionalIncludeDirectories) + + EOF + if ($self->{builddef}) + { + print $f < + Generate DEF file + perl src\\tools\\msvc\\gendef.pl $cfgname\\$self->{name} $self->{platform} + + EOF + } + print $f < + EOF + } + + sub Footer + { + my ($self, $f) = @_; + $self->WriteReferences($f); + + print $f < + + + + EOF + } + + 1; diff -Napcdr -x .git postgresql/src/tools/msvc/VS2005Solution.pm postgresql_dev/src/tools/msvc/VS2005Solution.pm *** postgresql/src/tools/msvc/VS2005Solution.pm Thu Jan 1 00:00:00 1970 --- postgresql_dev/src/tools/msvc/VS2005Solution.pm Tue Jun 7 05:10:41 2011 *************** *** 0 **** --- 1,27 ---- + package VS2005Solution; + + # + # Package that encapsulates a Visual Studio 2005 solution file + # + # src/tools/msvc/VS2005Solution.pm + # + + use Carp; + use strict; + use warnings; + use base qw(Solution); + + sub new + { + my $classname = shift; + my $self = $classname->SUPER::_new(@_); + bless($self, $classname); + + $self->{solutionFileVersion} = '9.00'; + $self->{vcver} = '8.00'; + $self->{visualStudioName} = 'Visual Studio 2005'; + + return $self; + } + + 1; diff -Napcdr -x .git postgresql/src/tools/msvc/VS2008Solution.pm postgresql_dev/src/tools/msvc/VS2008Solution.pm *** postgresql/src/tools/msvc/VS2008Solution.pm Thu Jan 1 00:00:00 1970 --- postgresql_dev/src/tools/msvc/VS2008Solution.pm Tue Jun 7 05:10:41 2011 *************** *** 0 **** --- 1,27 ---- + package VS2008Solution; + + # + # Package that encapsulates a Visual Studio 2008 solution file + # + # src/tools/msvc/VS2008Solution.pm + # + + use Carp; + use strict; + use warnings; + use base qw(Solution); + + sub new + { + my $classname = shift; + my $self = $classname->SUPER::_new(@_); + bless($self, $classname); + + $self->{solutionFileVersion} = '10.00'; + $self->{vcver} = '9.00'; + $self->{visualStudioName} = 'Visual Studio 2008'; + + return $self; + } + + 1; diff -Napcdr -x .git postgresql/src/tools/msvc/VS2010Solution.pm postgresql_dev/src/tools/msvc/VS2010Solution.pm *** postgresql/src/tools/msvc/VS2010Solution.pm Thu Jan 1 00:00:00 1970 --- postgresql_dev/src/tools/msvc/VS2010Solution.pm Tue Jun 7 05:10:41 2011 *************** *** 0 **** --- 1,27 ---- + package VS2010Solution; + + # + # Package that encapsulates a Visual Studio 2010 solution file + # + # src/tools/msvc/VS2010Solution.pm + # + + use Carp; + use strict; + use warnings; + use base qw(Solution); + + sub new + { + my $classname = shift; + my $self = $classname->SUPER::_new(@_); + bless($self, $classname); + + $self->{solutionFileVersion} = '11.00'; + $self->{vcver} = '10.00'; + $self->{visualStudioName} = 'Visual Studio 2010'; + + return $self; + } + + 1; diff -Napcdr -x .git postgresql/src/tools/msvc/VSObjectFactory.pm postgresql_dev/src/tools/msvc/VSObjectFactory.pm *** postgresql/src/tools/msvc/VSObjectFactory.pm Thu Jan 1 00:00:00 1970 --- postgresql_dev/src/tools/msvc/VSObjectFactory.pm Tue Jun 7 05:10:41 2011 *************** *** 0 **** --- 1,126 ---- + package VSObjectFactory; + + # + # Package that creates Visual Studio wrapper objects for msvc build + # + # src/tools/msvc/VSObjectFactory.pm + # + + use Carp; + use strict; + use warnings; + + use Exporter; + use Project; + use Solution; + use VC2005Project; + use VC2008Project; + use VC2010Project; + use VS2005Solution; + use VS2008Solution; + use VS2010Solution; + + our (@ISA, @EXPORT_OK); + @ISA = qw(Exporter); + @EXPORT_OK = qw(CreateSolution CreateProject DetermineVisualStudioVersion); + + sub CreateSolution + { + my $visualStudioVersion = shift; + + if (!defined($visualStudioVersion)) + { + $visualStudioVersion = DetermineVisualStudioVersion(); + } + + if ($visualStudioVersion eq '8.00') + { + return new VS2005Solution(@_); + } + elsif ($visualStudioVersion eq '9.00') + { + return new VS2008Solution(@_); + } + elsif ($visualStudioVersion eq '10.00') + { + return new VS2010Solution(@_); + } + else + { + croak "The requested Visual Studio version is not supported."; + } + } + + sub CreateProject + { + my $visualStudioVersion = shift; + + if (!defined($visualStudioVersion)) + { + $visualStudioVersion = DetermineVisualStudioVersion(); + } + + if ($visualStudioVersion eq '8.00') + { + return new VC2005Project(@_); + } + elsif ($visualStudioVersion eq '9.00') + { + return new VC2008Project(@_); + } + elsif ($visualStudioVersion eq '10.00') + { + return new VC2010Project(@_); + } + else + { + croak "The requested Visual Studio version is not supported."; + } + } + + sub DetermineVisualStudioVersion + { + my $nmakeVersion = shift; + + if (!defined($nmakeVersion)) + { + + # Determine version of nmake command, to set proper verison of visual studio + # we use nmake as it has existed for a long time and still exists in visual studio 2010 + open(P,"nmake /? 2>&1 |") + || croak "Unable to determine Visual Studio version: The nmake command wasn't found."; + while(

) + { + chomp; + if (/(\d+)\.(\d+)\.\d+(\.\d+)?$/) + { + return _GetVisualStudioVersion($1, $2); + } + } + close(P); + } + elsif($nmakeVersion =~ /(\d+)\.(\d+)\.\d+(\.\d+)?$/) + { + return _GetVisualStudioVersion($1, $2); + } + croak "Unable to determine Visual Studio version: The nmake version could not be determined."; + } + + sub _GetVisualStudioVersion + { + my($major, $minor) = @_; + if ($major > 10) + { + carp + "The determined version of Visual Studio is newer than the latest supported version. Returning the latest supported version instead."; + return '10.00'; + } + elsif ($major < 6) + { + croak + "Unable to determine Visual Studio version: Visual Studio versions before 6.0 aren't supported."; + } + return "$major.$minor"; + } + + 1; diff -Napcdr -x .git postgresql/src/tools/msvc/build.pl postgresql_dev/src/tools/msvc/build.pl *** postgresql/src/tools/msvc/build.pl Tue Jun 7 05:05:52 2011 --- postgresql_dev/src/tools/msvc/build.pl Tue Jun 7 05:10:39 2011 *************** our $config; *** 33,39 **** require "config_default.pl"; require "config.pl" if (-f "src/tools/msvc/config.pl"); ! Mkvcbuild::mkvcbuild($config); # check what sort of build we are doing --- 33,39 ---- require "config_default.pl"; require "config.pl" if (-f "src/tools/msvc/config.pl"); ! my $vcver = Mkvcbuild::mkvcbuild($config); # check what sort of build we are doing *************** elsif ($ARGV[0] ne "RELEASE") *** 50,56 **** # ... and do it ! if ($buildwhat) { system("vcbuild $buildwhat.vcproj $bconf"); } --- 50,60 ---- # ... and do it ! if ($buildwhat and $vcver eq '10.00') ! { ! system("msbuild $buildwhat.vcxproj /verbosity:detailed /p:Configuration=$bconf"); ! } ! elsif ($buildwhat) { system("vcbuild $buildwhat.vcproj $bconf"); } diff -Napcdr -x .git postgresql/src/tools/msvc/builddoc.pl postgresql_dev/src/tools/msvc/builddoc.pl *** postgresql/src/tools/msvc/builddoc.pl Tue Jun 7 05:07:51 2011 --- postgresql_dev/src/tools/msvc/builddoc.pl Tue Jun 7 05:10:39 2011 *************** $cmd = *** 69,76 **** ."| findstr /V \"DTDDECL catalog entries are not supported\" "; system($cmd); # die "openjade" if $?; print "Running collateindex...\n"; ! $cmd ="perl \"$docroot/$dsssl/bin/collateindex.pl\" -f -g -i bookindex " ! ."-o bookindex.sgml HTML.index"; system($cmd); die "collateindex" if $?; mkdir "html"; --- 69,76 ---- ."| findstr /V \"DTDDECL catalog entries are not supported\" "; system($cmd); # die "openjade" if $?; print "Running collateindex...\n"; ! $cmd = ! "perl \"$docroot/$dsssl/bin/collateindex.pl\" -f -g -i bookindex "."-o bookindex.sgml HTML.index"; system($cmd); die "collateindex" if $?; mkdir "html"; diff -Napcdr -x .git postgresql/src/tools/msvc/clean.bat postgresql_dev/src/tools/msvc/clean.bat *** postgresql/src/tools/msvc/clean.bat Tue Jun 7 05:05:52 2011 --- postgresql_dev/src/tools/msvc/clean.bat Tue Jun 7 05:08:23 2011 *************** if exist ..\msvc if exist ..\..\..\src c *** 10,17 **** --- 10,21 ---- if exist debug rd /s /q debug if exist release rd /s /q release for %%f in (*.vcproj) do del %%f + for %%f in (*.vcxproj) do del %%f + for %%f in (*.vcxproj.user) do del %%f if exist pgsql.sln del /q pgsql.sln if exist pgsql.sln.cache del /q pgsql.sln.cache + if exist pgsql.sdf del /q pgsql.sdf + if exist pgsql.suo del /q /a:H pgsql.suo del /s /q src\bin\win32ver.rc 2> NUL del /s /q src\interfaces\win32ver.rc 2> NUL if exist src\backend\win32ver.rc del /q src\backend\win32ver.rc diff -Napcdr -x .git postgresql/src/tools/msvc/pgbison.bat postgresql_dev/src/tools/msvc/pgbison.bat *** postgresql/src/tools/msvc/pgbison.bat Tue Jun 7 05:05:52 2011 --- postgresql_dev/src/tools/msvc/pgbison.bat Thu Jan 1 00:00:00 1970 *************** *** 1,51 **** - @echo off - REM src/tools/msvc/pgbison.bat - - IF NOT EXIST src\tools\msvc\buildenv.pl goto nobuildenv - perl -e "require 'src/tools/msvc/buildenv.pl'; while(($k,$v) = each %ENV) { print qq[\@SET $k=$v\n]; }" > bldenv.bat - CALL bldenv.bat - del bldenv.bat - :nobuildenv - - SET BV= - for /F "tokens=4 usebackq" %%f in (`bison -V`) do if "!BV!"=="" SET BV=%%f - if "%BV%"=="" goto novarexp - if %BV% EQU 1.875 goto bisonok - if %BV% GEQ 2.2 goto bisonok - goto nobison - :bisonok - - if "%1" == "src\backend\parser\gram.y" call :generate %1 src\backend\parser\gram.c src\backend\parser\gram.h - if "%1" == "src\backend\bootstrap\bootparse.y" call :generate %1 src\backend\bootstrap\bootparse.c - if "%1" == "src\backend\replication\repl_gram.y" call :generate %1 src\backend\replication\repl_gram.c - if "%1" == "src\pl\plpgsql\src\gram.y" call :generate %1 src\pl\plpgsql\src\pl_gram.c src\pl\plpgsql\src\pl_gram.h - if "%1" == "src\test\isolation\specparse.y" call :generate %1 src\test\isolation\specparse.c - if "%1" == "src\interfaces\ecpg\preproc\preproc.y" call :generate %1 src\interfaces\ecpg\preproc\preproc.c src\interfaces\ecpg\preproc\preproc.h - if "%1" == "contrib\cube\cubeparse.y" call :generate %1 contrib\cube\cubeparse.c - if "%1" == "contrib\seg\segparse.y" call :generate %1 contrib\seg\segparse.c - - echo Unknown bison input: %1 - exit 1 - - :generate - SET fn=%1 - SET cf=%2 - bison.exe -d %fn% -o %cf% - if errorlevel 1 exit 1 - SET hf=%cf:~0,-2%.h - if not "%hf%"=="%3" ( - copy /y %hf% %3 - if errorlevel 1 exit 1 - del %hf% - ) - exit 0 - - - :novarexp - echo pgbison must be called with cmd /V:ON /C pgbison to work! - exit 1 - - :nobison - echo WARNING! Bison install not found, or unsupported Bison version. - echo Attempting to build without. - exit 0 --- 0 ---- diff -Napcdr -x .git postgresql/src/tools/msvc/pgbison.pl postgresql_dev/src/tools/msvc/pgbison.pl *** postgresql/src/tools/msvc/pgbison.pl Thu Jan 1 00:00:00 1970 --- postgresql_dev/src/tools/msvc/pgbison.pl Tue Jun 7 05:10:39 2011 *************** *** 0 **** --- 1,92 ---- + #!/usr/bin/perl + + use strict; + use warnings; + + require 'src/tools/msvc/buildenv.pl' if (-e 'src/tools/msvc/buildenv.pl'); + + checkBison(); + my $inputFile = $ARGV[0]; + + unless (defined($inputFile)) + { + die "Bison input file is missing.\n"; + } + elsif ($inputFile eq 'src\backend\parser\gram.y') + { + generate($inputFile, 'src\backend\parser\gram.c', 'src\backend\parser\gram.h'); + } + elsif ($inputFile eq 'src\backend\bootstrap\bootparse.y') + { + generate($inputFile, 'src\backend\bootstrap\bootparse.c'); + } + elsif ($inputFile eq 'src\backend\replication\repl_gram.y') + { + generate($inputFile, 'src\backend\replication\repl_gram.c'); + } + elsif ($inputFile eq 'src\pl\plpgsql\src\gram.y') + { + generate($inputFile, 'src\pl\plpgsql\src\pl_gram.c', 'src\pl\plpgsql\src\pl_gram.h'); + } + elsif ($inputFile eq 'src\test\isolation\specparse.y') + { + generate($inputFile, 'src\test\isolation\specparse.c'); + } + elsif ($inputFile eq 'src\interfaces\ecpg\preproc\preproc.y') + { + generate( + $inputFile, + 'src\interfaces\ecpg\preproc\preproc.c', + 'src\interfaces\ecpg\preproc\preproc.h' + ); + } + elsif ($inputFile eq 'contrib\cube\cubeparse.y') + { + generate($inputFile, 'contrib\cube\cubeparse.c'); + } + elsif ($inputFile eq 'contrib\seg\segparse.y') + { + generate($inputFile, 'contrib\seg\segparse.c'); + } + else + { + die "Unknown bison input: $inputFile\n"; + } + + sub generate + { + my($input, $output1, $output2) = @_; + system("bison -d \"$input\" -o \"$output1\"") == 0 + || die "ERROR! bison -d \"$input\" -o \"$output1\" failed: $?\n"; + + (my $headerFile = $output1) =~ s/\.c$/.h/; + + if (defined($output2) && $headerFile ne $output2) + { + system("copy /y \"$headerFile\" \"$output2\"") == 0 + || die "ERROR! copy /y \"$headerFile\" \"$output2\" failed: $?\n"; + unlink($headerFile); + } + } + + sub checkBison + { + open(P,'bison -V 2>&1 |') + || die "WARNING! Bison install not found. Attempting to build without.\n"; + while(

) + { + chomp; + if (/(\d+)\.(\d+)(\.\d+)?$/) + { + my $bisonVersion = "$1.$2"; + unless ($bisonVersion == 1.875 || $bisonVersion >= 2.2) + { + die "WARNING! Unsupported Bison version. Attempting to build without.\n"; + } + return; + } + } + close(P); + die + "WARNING! Bison install not found or unable to determine Bison version. Attempting to build without.\n"; + } diff -Napcdr -x .git postgresql/src/tools/msvc/pgflex.bat postgresql_dev/src/tools/msvc/pgflex.bat *** postgresql/src/tools/msvc/pgflex.bat Tue Jun 7 05:05:52 2011 --- postgresql_dev/src/tools/msvc/pgflex.bat Thu Jan 1 00:00:00 1970 *************** *** 1,45 **** - @echo off - REM src/tools/msvc/pgflex.bat - - REM silence flex bleatings about file path style - SET CYGWIN=nodosfilewarning - - IF NOT EXIST src\tools\msvc\buildenv.pl goto nobuildenv - perl -e "require 'src/tools/msvc/buildenv.pl'; while(($k,$v) = each %ENV) { print qq[\@SET $k=$v\n]; }" > bldenv.bat - CALL bldenv.bat - del bldenv.bat - :nobuildenv - - flex -V > NUL - if errorlevel 1 goto noflex - - if "%1" == "src\backend\parser\scan.l" call :generate %1 src\backend\parser\scan.c -CF - if "%1" == "src\backend\bootstrap\bootscanner.l" call :generate %1 src\backend\bootstrap\bootscanner.c - if "%1" == "src\backend\utils\misc\guc-file.l" call :generate %1 src\backend\utils\misc\guc-file.c - if "%1" == "src\backend\replication\repl_scanner.l" call :generate %1 src\backend\replication\repl_scanner.c - if "%1" == "src\test\isolation\specscanner.l" call :generate %1 src\test\isolation\specscanner.c - if "%1" == "src\interfaces\ecpg\preproc\pgc.l" call :generate %1 src\interfaces\ecpg\preproc\pgc.c - if "%1" == "src\bin\psql\psqlscan.l" call :generate %1 src\bin\psql\psqlscan.c - if "%1" == "contrib\cube\cubescan.l" call :generate %1 contrib\cube\cubescan.c - if "%1" == "contrib\seg\segscan.l" call :generate %1 contrib\seg\segscan.c - - echo Unknown flex input: %1 - exit 1 - - REM For non-reentrant scanners we need to fix up the yywrap macro definition - REM to keep the MS compiler happy. - REM For reentrant scanners (like the core scanner) we do not - REM need to (and must not) change the yywrap definition. - :generate - flex %3 -o%2 %1 - if errorlevel 1 exit %errorlevel% - perl -n -e "exit 1 if /^\%%option\s+reentrant/;" %1 - if errorlevel 1 exit 0 - perl -pi.bak -e "s/yywrap\(n\)/yywrap()/;" %2 - if errorlevel 1 exit %errorlevel% - del %2.bak - exit 0 - - :noflex - echo WARNING! flex install not found, attempting to build without - exit 0 --- 0 ---- diff -Napcdr -x .git postgresql/src/tools/msvc/pgflex.pl postgresql_dev/src/tools/msvc/pgflex.pl *** postgresql/src/tools/msvc/pgflex.pl Thu Jan 1 00:00:00 1970 --- postgresql_dev/src/tools/msvc/pgflex.pl Tue Jun 7 05:10:39 2011 *************** *** 0 **** --- 1,137 ---- + #!/usr/bin/perl + + use strict; + use warnings; + + require 'src/tools/msvc/buildenv.pl' if (-e 'src/tools/msvc/buildenv.pl'); + + checkFlex(); + my $inputFile = $ARGV[0]; + + unless (defined($inputFile)) + { + die "Flex input file is missing.\n"; + } + elsif ($inputFile eq 'src\backend\parser\scan.l') + { + generate($inputFile, 'src\backend\parser\scan.c', '-CF '); + } + elsif ($inputFile eq 'src\backend\bootstrap\bootscanner.l') + { + generate($inputFile, 'src\backend\bootstrap\bootscanner.c'); + } + elsif ($inputFile eq 'src\backend\utils\misc\guc-file.l') + { + generate($inputFile, 'src\backend\utils\misc\guc-file.c'); + } + elsif ($inputFile eq 'src\backend\replication\repl_scanner.l') + { + generate($inputFile, 'src\backend\replication\repl_scanner.c'); + } + elsif ($inputFile eq 'src\test\isolation\specscanner.l') + { + generate($inputFile, 'src\test\isolation\specscanner.c'); + } + elsif ($inputFile eq 'src\interfaces\ecpg\preproc\pgc.l') + { + generate($inputFile, 'src\interfaces\ecpg\preproc\pgc.c'); + } + elsif ($inputFile eq 'src\bin\psql\psqlscan.l') + { + generate($inputFile, 'src\bin\psql\psqlscan.c'); + } + elsif ($inputFile eq 'contrib\cube\cubescan.l') + { + generate($inputFile, 'contrib\cube\cubescan.c'); + } + elsif ($inputFile eq 'contrib\seg\segscan.l') + { + generate($inputFile, 'contrib\seg\segscan.c'); + } + else + { + die "Unknown flex input: $inputFile\n"; + } + + sub generate + { + my($input, $output, $flags) = @_; + + $flags = '' unless defined($flags); + + my $errorlevel = system("flex $flags-o\"$output\" \"$input\""); + if ($errorlevel == 1) + { + exit $errorlevel; + } + + # For non-reentrant scanners we need to fix up the yywrap macro definition + # to keep the MS compiler happy. + # For reentrant scanners (like the core scanner) we do not + # need to (and must not) change the yywrap definition. + if (is_reentrant($input)) + { + exit 0; + } + fix_yywrap($output); + exit 0; + } + + sub is_reentrant + { + my $input = shift; + open(INFILE, "<$input"); + while () + { + if (/^\%option\s+reentrant/) + { + close(INFILE); + return 1; + } + } + close(INFILE); + return 0; + } + + sub fix_yywrap + { + my $output = shift; + my $backup = $output . '.bak'; + rename($output, $backup); + eval { + open(INFILE, "<$backup"); + open(OUTFILE, ">$output"); + while () + { + s/yywrap\(n\)/yywrap()/; + print OUTFILE; + } + close(OUTFILE); + close(INFILE); + }; + exit 1 if $@; + + unlink($backup); + } + + sub checkFlex + { + open(P,'flex -V 2>&1 |') + || die "WARNING! Flex install not found. Attempting to build without.\n"; + while(

) + { + chomp; + if (/(\d+)\.(\d+)\.(\d+)$/) + { + my $flexVersion = "$1.$2"; + if ($flexVersion < 2.5 || ($flexVersion == 2.5 && $3 < 31)) + { + die "WARNING! Unsupported Flex version. Attempting to build without.\n"; + } + return; + } + } + close(P); + die + "WARNING! Flex install not found or unable to determine Flex version. Attempting to build without.\n"; + }