VS2010v8.patch

text/plain

Filename: VS2010v8.patch
Type: text/plain
Part: 1
Message: Re: Visual Studio 2010/Windows SDK 7.1 support

Patch

Same data as JSON: GET /api/v1/attachments/:id/patch the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes. API reference →
Format: context
File+
src/tools/msvc/builddoc.pl 2 2
src/tools/msvc/build.pl 6 2
src/tools/msvc/clean.bat 4 0
src/tools/msvc/Install.pm 46 21
src/tools/msvc/Mkvcbuild.pm 4 1
src/tools/msvc/pgbison.bat 0 51
src/tools/msvc/pgbison.pl 92 0
src/tools/msvc/pgflex.bat 0 45
src/tools/msvc/pgflex.pl 137 0
src/tools/msvc/Project.pm 90 70
src/tools/msvc/Solution.pm 10 22
src/tools/msvc/VC2005Project.pm 25 0
src/tools/msvc/VC2008Project.pm 25 0
src/tools/msvc/VC2010Project.pm 368 0
src/tools/msvc/VS2005Solution.pm 27 0
src/tools/msvc/VS2008Solution.pm 27 0
src/tools/msvc/VS2010Solution.pm 27 0
src/tools/msvc/VSObjectFactory.pm 126 0
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{<ConfigurationType>(\w+)</ConfigurationType>})
          {
!             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;
   <Files>
  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
! "<FileConfiguration Name=\"$cfg|$self->{platform}\"><Tool Name=\"VCCustomBuildTool\" Description=\"$desc\" CommandLine=\"$tool\" AdditionalDependencies=\"\" Outputs=\"$output\" /></FileConfiguration>";
! }
! 
! sub WriteReferences
! {
!     my ($self, $f) = @_;
!     print $f " <References>\n";
!     foreach my $ref (@{$self->{references}})
!     {
!         print $f
! "  <ProjectReference ReferencedProjectIdentifier=\"$ref->{guid}\" Name=\"$ref->{name}\" />\n";
!     }
!     print $f " </References>\n";
! }
! 
! sub WriteFiles
! {
!     my ($self, $f) = @_;
!     print $f <<EOF;
   <Files>
  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 . "  </Filter>\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 . "  </Filter>\n";
              pop @dirstack;
          }
  
*************** EOF
*** 388,414 ****
              $left =~ s/^\\//;
              my @pieces = split /\\/, $left;
              push @dirstack, $pieces[0];
!             print F ' ' x $#dirstack . "  <Filter Name=\"$pieces[0]\" Filter=\"\">\n";
          }
  
!         print F ' ' x $#dirstack . "   <File RelativePath=\"$f\"";
!         if ($f =~ /\.y$/)
          {
!             my $of = $f;
              $of =~ s/\.y$/.c/;
              $of =~ s{^src\\pl\\plpgsql\\src\\gram.c$}{src\\pl\\plpgsql\\src\\pl_gram.c};
!             print F '>'
!               . $self->GenerateCustomTool('Running bison on ' . $f,
!                 'cmd /V:ON /c src\tools\msvc\pgbison.bat ' . $f, $of)
                . '</File>' . "\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)
                . '</File>' . "\n";
          }
          elsif (defined($uniquefiles{$file}))
--- 424,450 ----
              $left =~ s/^\\//;
              my @pieces = split /\\/, $left;
              push @dirstack, $pieces[0];
!             print $f ' ' x $#dirstack . "  <Filter Name=\"$pieces[0]\" Filter=\"\">\n";
          }
  
!         print $f ' ' x $#dirstack . "   <File RelativePath=\"$fileNameWithPath\"";
!         if ($fileNameWithPath =~ /\.y$/)
          {
!             my $of = $fileNameWithPath;
              $of =~ s/\.y$/.c/;
              $of =~ s{^src\\pl\\plpgsql\\src\\gram.c$}{src\\pl\\plpgsql\\src\\pl_gram.c};
!             print $f '>'
!               . $self->GenerateCustomTool('Running bison on ' . $fileNameWithPath,
!                 "perl src\\tools\\msvc\\pgbison.pl $fileNameWithPath", $of)
                . '</File>' . "\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)
                . '</File>' . "\n";
          }
          elsif (defined($uniquefiles{$file}))
*************** EOF
*** 417,423 ****
              # File already exists, so fake a new name
              my $obj = $dir;
              $obj =~ s/\\/_/g;
!             print F
  "><FileConfiguration Name=\"Debug|$self->{platform}\"><Tool Name=\"VCCLCompilerTool\" ObjectFile=\".\\debug\\$self->{name}\\$obj"
                . "_$file.obj\" /></FileConfiguration><FileConfiguration Name=\"Release|$self->{platform}\"><Tool Name=\"VCCLCompilerTool\" ObjectFile=\".\\release\\$self->{name}\\$obj"
                . "_$file.obj\" /></FileConfiguration></File>\n";
--- 453,459 ----
              # File already exists, so fake a new name
              my $obj = $dir;
              $obj =~ s/\\/_/g;
!             print $f
  "><FileConfiguration Name=\"Debug|$self->{platform}\"><Tool Name=\"VCCLCompilerTool\" ObjectFile=\".\\debug\\$self->{name}\\$obj"
                . "_$file.obj\" /></FileConfiguration><FileConfiguration Name=\"Release|$self->{platform}\"><Tool Name=\"VCCLCompilerTool\" ObjectFile=\".\\release\\$self->{name}\\$obj"
                . "_$file.obj\" /></FileConfiguration></File>\n";
*************** EOF
*** 425,464 ****
          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
! {
!     my ($self, $desc, $tool, $output, $cfg) = @_;
!     if (!defined($cfg))
!     {
!         return $self->GenerateCustomTool($desc, $tool, $output, 'Debug')
!           .$self->GenerateCustomTool($desc, $tool, $output, 'Release');
!     }
!     return
! "<FileConfiguration Name=\"$cfg|$self->{platform}\"><Tool Name=\"VCCustomBuildTool\" Description=\"$desc\" CommandLine=\"$tool\" AdditionalDependencies=\"\" Outputs=\"$output\" /></FileConfiguration>";
! }
! 
! sub WriteReferences
! {
!     my ($self, $f) = @_;
!     print $f " <References>\n";
!     foreach my $ref (@{$self->{references}})
!     {
!         print $f
! "  <ProjectReference ReferencedProjectIdentifier=\"$ref->{guid}\" Name=\"$ref->{name}\" />\n";
!     }
!     print $f " </References>\n";
  }
  
  sub WriteHeader
--- 461,477 ----
          else
          {
              $uniquefiles{$file} = 1;
!             print $f " />\n";
          }
      }
      while ($#dirstack >= 0)
      {
!         print $f ' ' x $#dirstack . "  </Filter>\n";
          pop @dirstack;
      }
!     print $f <<EOF;
!  </Files>
! EOF
  }
  
  sub WriteHeader
*************** EOF
*** 478,489 ****
      print $f <<EOF;
   </Configurations>
  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;
   </Configurations>
  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;
-  </Files>
   <Globals/>
  </VisualStudioProject>
  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 = <P>;
-     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 <<EOF;
! Microsoft Visual Studio Solution File, Format Version 9.00
! # Visual Studio 2005
  EOF
  
      foreach my $fld (keys %{$self->{projects}})
--- 476,483 ----
  
      open(SLN,">pgsql.sln") || croak "Could not write to pgsql.sln\n";
      print SLN <<EOF;
! Microsoft Visual Studio Solution File, Format Version $self->{solutionFileVersion}
! # $self->{visualStudioName}
  EOF
  
      foreach my $fld (keys %{$self->{projects}})
*************** EOF
*** 497,503 ****
          foreach my $proj (@{$self->{projects}->{$fld}})
          {
              print SLN <<EOF;
! Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "$proj->{name}", "$proj->{name}.vcproj", "$proj->{guid}"
  EndProject
  EOF
          }
--- 485,491 ----
          foreach my $proj (@{$self->{projects}->{$fld}})
          {
              print SLN <<EOF;
! Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "$proj->{name}", "$proj->{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;
+   <ItemGroup>
+ EOF
+         foreach my $ref (@references)
+         {
+             print $f <<EOF;
+     <ProjectReference Include="$ref->{name}$ref->{filenameExtension}">
+       <Project>$ref->{guid}</Project>
+     </ProjectReference>
+ EOF
+         }
+         print $f <<EOF;
+   </ItemGroup>
+ EOF
+     }
+ }
+ 
+ sub WriteFiles
+ {
+     my ($self, $f) = @_;
+     print $f <<EOF;
+   <ItemGroup>
+ 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 <<EOF;
+     <ClCompile Include="$fileNameWithPath">
+       <ObjectFileName Condition="'\$(Configuration)|\$(Platform)'=='Debug|$self->{platform}'">.\\debug\\$self->{name}\\${obj}_$fileName.obj</ObjectFileName>
+       <ObjectFileName Condition="'\$(Configuration)|\$(Platform)'=='Release|$self->{platform}'">.\\release\\$self->{name}\\${obj}_$fileName.obj</ObjectFileName>
+     </ClCompile>
+ EOF
+         }
+         else
+         {
+             $uniquefiles{$fileName} = 1;
+             print $f <<EOF;
+     <ClCompile Include="$fileNameWithPath" />
+ EOF
+         }
+ 
+     }
+     print $f <<EOF;
+   </ItemGroup>
+ EOF
+     if (scalar(@grammarFiles))
+     {
+         print $f <<EOF;
+   <ItemGroup>
+ 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 <<EOF;
+     <CustomBuild Include="$grammarFile">
+       <Message Condition="'\$(Configuration)|\$(Platform)'=='Debug|$self->{platform}'">Running bison on $grammarFile</Message>
+       <Command Condition="'\$(Configuration)|\$(Platform)'=='Debug|$self->{platform}'">perl "src\\tools\\msvc\\pgbison.pl" "$grammarFile"</Command>
+       <AdditionalInputs Condition="'\$(Configuration)|\$(Platform)'=='Debug|$self->{platform}'">%(AdditionalInputs)</AdditionalInputs>
+       <Outputs Condition="'\$(Configuration)|\$(Platform)'=='Debug|$self->{platform}'">$outputFile;%(Outputs)</Outputs>
+       <Message Condition="'\$(Configuration)|\$(Platform)'=='Release|$self->{platform}'">Running bison on $grammarFile</Message>
+       <Command Condition="'\$(Configuration)|\$(Platform)'=='Release|$self->{platform}'">perl "src\\tools\\msvc\\pgbison.pl" "$grammarFile"</Command>
+       <AdditionalInputs Condition="'\$(Configuration)|\$(Platform)'=='Release|$self->{platform}'">%(AdditionalInputs)</AdditionalInputs>
+       <Outputs Condition="'\$(Configuration)|\$(Platform)'=='Release|$self->{platform}'">$outputFile;%(Outputs)</Outputs>
+     </CustomBuild>
+ EOF
+             }
+             else #if ($grammarFile =~ /\.l$/)
+             {
+                 print $f <<EOF;
+     <CustomBuild Include="$grammarFile">
+       <Message Condition="'\$(Configuration)|\$(Platform)'=='Debug|$self->{platform}'">Running flex on $grammarFile</Message>
+       <Command Condition="'\$(Configuration)|\$(Platform)'=='Debug|$self->{platform}'">perl "src\\tools\\msvc\\pgflex.pl" "$grammarFile"</Command>
+       <AdditionalInputs Condition="'\$(Configuration)|\$(Platform)'=='Debug|$self->{platform}'">%(AdditionalInputs)</AdditionalInputs>
+       <Outputs Condition="'\$(Configuration)|\$(Platform)'=='Debug|$self->{platform}'">$outputFile;%(Outputs)</Outputs>
+       <Message Condition="'\$(Configuration)|\$(Platform)'=='Release|$self->{platform}'">Running flex on $grammarFile</Message>
+       <Command Condition="'\$(Configuration)|\$(Platform)'=='Release|$self->{platform}'">perl "src\\tools\\msvc\\pgflex.pl" "$grammarFile"</Command>
+       <AdditionalInputs Condition="'\$(Configuration)|\$(Platform)'=='Release|$self->{platform}'">%(AdditionalInputs)</AdditionalInputs>
+       <Outputs Condition="'\$(Configuration)|\$(Platform)'=='Release|$self->{platform}'">$outputFile;%(Outputs)</Outputs>
+     </CustomBuild>
+ EOF
+             }
+         }
+         print $f <<EOF;
+   </ItemGroup>
+ EOF
+     }
+     if (scalar(@resourceFiles))
+     {
+         print $f <<EOF;
+   <ItemGroup>
+ EOF
+         foreach my $rcFile (@resourceFiles)
+         {
+             print $f <<EOF;
+     <ResourceCompile Include="$rcFile" />
+ EOF
+         }
+         print $f <<EOF;
+   </ItemGroup>
+ EOF
+     }
+ }
+ 
+ sub WriteHeader
+ {
+     my ($self, $f) = @_;
+ 
+     print $f <<EOF;
+ <?xml version="1.0" encoding="Windows-1252"?>
+ <Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+   <ItemGroup Label="ProjectConfigurations">
+ EOF
+     $self->WriteConfigurationHeader($f, 'Debug');
+     $self->WriteConfigurationHeader($f, 'Release');
+     print $f <<EOF;
+   </ItemGroup>
+   <PropertyGroup Label="Globals">
+     <ProjectGuid>$self->{guid}</ProjectGuid>
+   </PropertyGroup>
+   <Import Project="\$(VCTargetsPath)\\Microsoft.Cpp.Default.props" />
+ EOF
+     $self->WriteConfigurationPropertyGroup($f, 'Release',{ wholeopt=>'false' });
+     $self->WriteConfigurationPropertyGroup($f, 'Debug',{ wholeopt=>'false' });
+     print $f <<EOF;
+   <Import Project="\$(VCTargetsPath)\\Microsoft.Cpp.props" />
+   <ImportGroup Label="ExtensionSettings">
+   </ImportGroup>
+ EOF
+     $self->WritePropertySheetsPropertyGroup($f, 'Release');
+     $self->WritePropertySheetsPropertyGroup($f, 'Debug');
+     print $f <<EOF;
+   <PropertyGroup Label="UserMacros" />
+   <PropertyGroup>
+     <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ EOF
+     $self->WriteAdditionalProperties($f, 'Debug');
+     $self->WriteAdditionalProperties($f, 'Release');
+     print $f <<EOF;
+   </PropertyGroup>
+ 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 <<EOF;
+     <ProjectConfiguration Include="$cfgname|$self->{platform}">
+       <Configuration>$cfgname</Configuration>
+       <Platform>$self->{platform}</Platform>
+     </ProjectConfiguration>
+ EOF
+ }
+ 
+ sub WriteConfigurationPropertyGroup
+ {
+     my ($self, $f, $cfgname, $p) = @_;
+     my $cfgtype =
+       ($self->{type} eq "exe")
+       ?'Application'
+       :($self->{type} eq "dll"?'DynamicLibrary':'StaticLibrary');
+ 
+     print $f <<EOF;
+   <PropertyGroup Condition="'\$(Configuration)|\$(Platform)'=='$cfgname|$self->{platform}'" Label="Configuration">
+     <ConfigurationType>$cfgtype</ConfigurationType>
+     <UseOfMfc>false</UseOfMfc>
+     <CharacterSet>MultiByte</CharacterSet>
+     <WholeProgramOptimization>$p->{wholeopt}</WholeProgramOptimization>
+   </PropertyGroup>
+ EOF
+ }
+ 
+ sub WritePropertySheetsPropertyGroup
+ {
+     my ($self, $f, $cfgname) = @_;
+     print $f <<EOF;
+   <ImportGroup Condition="'\$(Configuration)|\$(Platform)'=='$cfgname|$self->{platform}'" Label="PropertySheets">
+     <Import Project="\$(UserRootDir)\\Microsoft.Cpp.\$(Platform).user.props" Condition="exists('\$(UserRootDir)\\Microsoft.Cpp.\$(Platform).user.props')" Label="LocalAppDataPlatform" />
+   </ImportGroup>
+ EOF
+ }
+ 
+ sub WriteAdditionalProperties
+ {
+     my ($self, $f, $cfgname) = @_;
+     print $f <<EOF;
+     <OutDir Condition="'\$(Configuration)|\$(Platform)'=='$cfgname|$self->{platform}'">.\\$cfgname\\$self->{name}\\</OutDir>
+     <IntDir Condition="'\$(Configuration)|\$(Platform)'=='$cfgname|$self->{platform}'">.\\$cfgname\\$self->{name}\\</IntDir>
+     <LinkIncremental Condition="'\$(Configuration)|\$(Platform)'=='$cfgname|$self->{platform}'">false</LinkIncremental>
+ 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 <<EOF;
+   <ItemDefinitionGroup Condition="'\$(Configuration)|\$(Platform)'=='$cfgname|$self->{platform}'">
+     <ClCompile>
+       <Optimization>$p->{opt}</Optimization>
+       <AdditionalIncludeDirectories>$self->{prefixincludes}src/include;src/include/port/win32;src/include/port/win32_msvc;$includes\%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+       <PreprocessorDefinitions>WIN32;_WINDOWS;__WINDOWS__;__WIN32__;EXEC_BACKEND;WIN32_STACK_RLIMIT=4194304;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE$self->{defines}$p->{defs}\%(PreprocessorDefinitions)</PreprocessorDefinitions>
+       <StringPooling>$p->{strpool}</StringPooling>
+       <RuntimeLibrary>$p->{runtime}</RuntimeLibrary>
+       <DisableSpecificWarnings>$self->{disablewarnings};\%(DisableSpecificWarnings)</DisableSpecificWarnings>
+       <AdditionalOptions>/MP \%(AdditionalOptions)</AdditionalOptions>
+       <AssemblerOutput>
+       </AssemblerOutput>
+       <AssemblerListingLocation>.\\$cfgname\\$self->{name}\\</AssemblerListingLocation>
+       <ObjectFileName>.\\$cfgname\\$self->{name}\\</ObjectFileName>
+       <ProgramDataBaseFileName>.\\$cfgname\\$self->{name}\\</ProgramDataBaseFileName>
+       <BrowseInformation>false</BrowseInformation>
+       <WarningLevel>Level3</WarningLevel>
+       <SuppressStartupBanner>true</SuppressStartupBanner>
+       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+       <CompileAs>Default</CompileAs>
+     </ClCompile>
+     <Link>
+       <OutputFile>.\\$cfgname\\$self->{name}\\$self->{name}.$self->{type}</OutputFile>
+       <AdditionalDependencies>$libs;\%(AdditionalDependencies)</AdditionalDependencies>
+       <SuppressStartupBanner>true</SuppressStartupBanner>
+       <AdditionalLibraryDirectories>\%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+       <IgnoreSpecificDefaultLibraries>libc;\%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
+       <StackReserveSize>4194304</StackReserveSize>
+       <GenerateDebugInformation>true</GenerateDebugInformation>
+       <ProgramDatabaseFile>.\\$cfgname\\$self->{name}\\$self->{name}.pdb</ProgramDatabaseFile>
+       <GenerateMapFile>false</GenerateMapFile>
+       <MapFileName>.\\$cfgname\\$self->{name}\\$self->{name}.map</MapFileName>
+       <SubSystem>Console</SubSystem>
+       <TargetMachine>$targetmachine</TargetMachine>
+ EOF
+     if ($self->{disablelinkerwarnings})
+     {
+         print $f
+ "      <AdditionalOptions>/ignore:$self->{disablelinkerwarnings} \%(AdditionalOptions)</AdditionalOptions>\n";
+     }
+     if ($self->{implib})
+     {
+         my $l = $self->{implib};
+         $l =~ s/__CFGNAME__/$cfgname/g;
+         print $f "      <ImportLibrary>$l</ImportLibrary>\n";
+     }
+     if ($self->{def})
+     {
+         my $d = $self->{def};
+         $d =~ s/__CFGNAME__/$cfgname/g;
+         print $f "      <ModuleDefinitionFile>$d</ModuleDefinitionFile>\n";
+     }
+     print $f <<EOF;
+     </Link>
+     <ResourceCompile>
+       <AdditionalIncludeDirectories>src\\include;\%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+     </ResourceCompile>
+ EOF
+     if ($self->{builddef})
+     {
+         print $f <<EOF;
+     <PreLinkEvent>
+       <Message>Generate DEF file</Message>
+       <Command>perl src\\tools\\msvc\\gendef.pl $cfgname\\$self->{name} $self->{platform}</Command>
+     </PreLinkEvent>
+ EOF
+     }
+     print $f <<EOF;
+   </ItemDefinitionGroup>
+ EOF
+ }
+ 
+ sub Footer
+ {
+     my ($self, $f) = @_;
+     $self->WriteReferences($f);
+ 
+     print $f <<EOF;
+   <Import Project="\$(VCTargetsPath)\\Microsoft.Cpp.targets" />
+   <ImportGroup Label="ExtensionTargets">
+   </ImportGroup>
+ </Project>
+ 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(<P>)
+         {
+             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(<P>)
+     {
+         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 (<INFILE>)
+     {
+         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 (<INFILE>)
+         {
+             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(<P>)
+     {
+         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";
+ }