Brar Piening wrote:

The attached patch includes documentation changes and excludes my versions of pgbison.pl and pgflex.pl which have been replaced by Andrews' versions that are already commited.

Building current head today I noticed that the patch doesn't apply cleanly anymore.

Attached is a new version.

Regards,

Brar
diff -Napcdr -x .git postgresql/doc/src/sgml/install-windows.sgml 
postgresql_dev/doc/src/sgml/install-windows.sgml
*** postgresql/doc/src/sgml/install-windows.sgml        Wed Sep 28 19:23:58 2011
--- postgresql_dev/doc/src/sgml/install-windows.sgml    Wed Sep 28 19:32:22 2011
***************
*** 20,29 ****
    There are several different ways of building PostgreSQL on
    <productname>Windows</productname>. The simplest way to build with
    Microsoft tools is to install a supported version of the
!   <productname>Microsoft Platform SDK</productname> and use the included
    compiler. It is also possible to build with the full
!   <productname>Microsoft Visual C++ 2005 or 2008</productname>. In some cases
!   that requires the installation of the <productname>Platform 
SDK</productname>
    in addition to the compiler.
   </para>
  
--- 20,29 ----
    There are several different ways of building PostgreSQL on
    <productname>Windows</productname>. The simplest way to build with
    Microsoft tools is to install a supported version of the
!   <productname>Microsoft Windows SDK</productname> and use the included
    compiler. It is also possible to build with the full
!   <productname>Microsoft Visual C++ 2005, 2008 or 2010</productname>. In some 
cases
!   that requires the installation of the <productname>Windows SDK</productname>
    in addition to the compiler.
   </para>
  
***************
*** 69,100 ****
  
   <sect1 id="install-windows-full">
    <title>Building with <productname>Visual C++</productname> or the
!   <productname>Platform SDK</productname></title>
  
   <para>
    PostgreSQL can be built using the Visual C++ compiler suite from Microsoft.
    These compilers can be either from <productname>Visual Studio</productname>,
    <productname>Visual Studio Express</productname> or some versions of the
!   <productname>Platform SDK</productname>. If you do not already have a
    <productname>Visual Studio</productname> environment set up, the easiest
!   way us to use the compilers in the <productname>Platform SDK</productname>,
    which is a free download from Microsoft.
   </para>
  
   <para>
!   PostgreSQL supports the compilers from
!   <productname>Visual Studio 2005</productname> and
!   <productname>Visual Studio 2008</productname>. When using the Platform SDK
!   only, or when building for 64-bit Windows, only
!   <productname>Visual Studio 2008</productname> is supported.
!   <productname>Visual Studio 2010</productname> is not yet supported.
!  </para>
! 
!  <para>
!   When building using the <productname>Platform SDK</productname>, versions
!   6.0 to 7.0 of the SDK are supported. Older or newer versions will not work.
!   In particular, versions from 7.0a and later will not work, since
!   they include compilers from <productname>Visual Studio 2010</productname>.
   </para>
  
   <para>
--- 69,94 ----
  
   <sect1 id="install-windows-full">
    <title>Building with <productname>Visual C++</productname> or the
!   <productname>Microsoft Windows SDK</productname></title>
  
   <para>
    PostgreSQL can be built using the Visual C++ compiler suite from Microsoft.
    These compilers can be either from <productname>Visual Studio</productname>,
    <productname>Visual Studio Express</productname> or some versions of the
!   <productname>Microsoft Windows SDK</productname>. If you do not already 
have a
    <productname>Visual Studio</productname> environment set up, the easiest
!   way is to use the compilers in the <productname>Windows SDK</productname>,
    which is a free download from Microsoft.
   </para>
  
   <para>
!   PostgreSQL is known to support compilation using the compilers shipped with
!   <productname>Visual Studio 2005</productname> to
!   <productname>Visual Studio 2010</productname> (including Express editions),
!   as well as standalone Windows SDK releases 6.0 to 7.1.
!   64-bit PostgreSQL builds are only supported with
!   <productname>Microsoft Windows SDK</productname> version 6.0a and above or
!   <productname>Visual Studio 2008</productname> and above.
   </para>
  
   <para>
***************
*** 104,114 ****
    <productname>Cygwin</productname> present in your system PATH. Also, make
    sure you have all the required Visual C++ tools available in the PATH. In
    <productname>Visual Studio</productname>, start the
!   <application>Visual Studio Command Prompt</application>. In the
!   <productname>Platform SDK</productname>, start the
!   <application>CMD shell</application> listed under the SDK on the Start Menu.
    If you wish to build a 64-bit version, you must use the 64-bit version of
    the command, and vice versa.
    All commands should be run from the <filename>src\tools\msvc</filename>
    directory.
   </para>
--- 98,110 ----
    <productname>Cygwin</productname> present in your system PATH. Also, make
    sure you have all the required Visual C++ tools available in the PATH. In
    <productname>Visual Studio</productname>, start the
!   <application>Visual Studio Command Prompt</application>.
    If you wish to build a 64-bit version, you must use the 64-bit version of
    the command, and vice versa.
+   In the <productname>Microsoft Windows SDK</productname>, start the
+   <application>CMD shell</application> listed under the SDK on the Start Menu.
+   In recent SDK versions you can change the targeted CPU architecture by using
+   the <command>setenv</command> command.
    All commands should be run from the <filename>src\tools\msvc</filename>
    directory.
   </para>
*************** $ENV{PATH}=$ENV{PATH} . ';c:\some\where\
*** 148,164 ****
  
     <variablelist>
      <varlistentry>
!      <term><productname>Microsoft Platform SDK</productname></term>
       <listitem><para>
        It is recommended that you upgrade to the latest supported version
!       of the <productname>Microsoft Platform SDK</productname> (currently
!       version 7.0), available for download from
        <ulink url="http://www.microsoft.com/downloads/";></>.
       </para>
       <para>
        You must always include the
        <application>Windows Headers and Libraries</application> part of the 
SDK.
!       If you install the <productname>Platform SDK</productname>
        including the <application>Visual C++ Compilers</application>,
        you don't need <productname>Visual Studio</productname> to build.
       </para></listitem>
--- 144,160 ----
  
     <variablelist>
      <varlistentry>
!      <term><productname>Microsoft Windows SDK</productname></term>
       <listitem><para>
        It is recommended that you upgrade to the latest supported version
!       of the <productname>Microsoft Windows SDK</productname> (currently
!       version 7.1), available for download from
        <ulink url="http://www.microsoft.com/downloads/";></>.
       </para>
       <para>
        You must always include the
        <application>Windows Headers and Libraries</application> part of the 
SDK.
!       If you install the <productname>Windows SDK</productname>
        including the <application>Visual C++ Compilers</application>,
        you don't need <productname>Visual Studio</productname> to build.
       </para></listitem>
*************** $ENV{PATH}=$ENV{PATH} . ';c:\some\where\
*** 202,207 ****
--- 198,207 ----
        Bison can be downloaded from <ulink 
url="http://gnuwin32.sourceforge.net";></>.
        Flex can be downloaded from
        <ulink url="http://www.postgresql.org/ftp/misc/winflex/";></>.
+       If you are using <productname>msysGit</productname> for accessing the
+       PostgreSQL <productname>Git</productname> repository you probably 
already
+       have recent versions of bison and flex in your 
<productname>Git</productname>
+       binary directory.
       </para>
  
       <note>
*************** $ENV{DOCROOT}='c:\docbook';
*** 479,485 ****
    static library to link into an application. For normal use the
    <productname>MinGW</productname> or
    <productname>Visual Studio</productname> or
!   <productname>Platform SDK</productname> method is recommended.
   </para>
  
   <para>
--- 479,485 ----
    static library to link into an application. For normal use the
    <productname>MinGW</productname> or
    <productname>Visual Studio</productname> or
!   <productname>Windows SDK</productname> method is recommended.
   </para>
  
   <para>
diff -Napcdr -x .git postgresql/src/tools/msvc/Install.pm 
postgresql_dev/src/tools/msvc/Install.pm
*** postgresql/src/tools/msvc/Install.pm        Mon Aug 15 18:08:31 2011
--- postgresql_dev/src/tools/msvc/Install.pm    Wed Sep 28 19:26:02 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      Wed Sep 28 19:23:58 2011
--- postgresql_dev/src/tools/msvc/Mkvcbuild.pm  Wed Sep 28 19:26:02 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
*** 490,495 ****
--- 492,498 ----
      $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        Mon Aug 15 18:08:31 2011
--- postgresql_dev/src/tools/msvc/Project.pm    Wed Sep 28 19:26:02 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       Mon Aug 15 18:08:31 2011
--- postgresql_dev/src/tools/msvc/Solution.pm   Wed Sep 28 19:26:02 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      Wed Sep 28 19:26:02 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      Wed Sep 28 19:26:02 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      Wed Sep 28 19:26:02 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     Wed Sep 28 19:26:02 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     Wed Sep 28 19:26:02 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     Wed Sep 28 19:26:02 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    Wed Sep 28 19:26:02 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  Mon Aug 15 18:08:31 2011
--- postgresql_dev/src/tools/msvc/build.pl      Wed Sep 28 19:26:02 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       Mon Aug 15 18:08:31 2011
--- postgresql_dev/src/tools/msvc/builddoc.pl   Wed Sep 28 19:26:02 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 Mon Aug 15 18:08:31 2011
--- postgresql_dev/src/tools/msvc/clean.bat     Wed Sep 28 19:26:02 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
-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to