Support building with Visual Studio 2017
authorAndrew Dunstan
Mon, 25 Sep 2017 12:03:05 +0000 (08:03 -0400)
committerAndrew Dunstan
Mon, 25 Sep 2017 12:03:05 +0000 (08:03 -0400)
Haribabu Kommi, reviewed by Takeshi Ideriha and Christian Ullrich

Backpatch to 9.6

doc/src/sgml/install-windows.sgml
src/tools/msvc/MSBuildProject.pm
src/tools/msvc/README
src/tools/msvc/Solution.pm
src/tools/msvc/VSObjectFactory.pm

index 1861e7e2f7795c0b41fc012bf31bdc013467491e..696c620b181b8528794d0de0760aa20799619289 100644 (file)
  
   There are several different ways of building PostgreSQL on
   Windows. The simplest way to build with
-  Microsoft tools is to install Visual Studio Express 2015
+  Microsoft tools is to install Visual Studio Express 2017
   for Windows Desktop and use the included
   compiler. It is also possible to build with the full
-  Microsoft Visual C++ 2005 to 2015.
+  Microsoft Visual C++ 2005 to 2017.
   In some cases that requires the installation of the
   Windows SDK in addition to the compiler.
  
   Visual Studio Express or some versions of the
   Microsoft Windows SDK. If you do not already have a
   Visual Studio environment set up, the easiest
-  ways are to use the compilers from Visual Studio Express 2015
+  ways are to use the compilers from Visual Studio Express 2017
   for Windows Desktop or those in the Windows SDK
-  7.1, which are both free downloads from Microsoft.
+  8.1, which are both free downloads from Microsoft.
  
 
  
   Both 32-bit and 64-bit builds are possible with the Microsoft Compiler suite.
   32-bit PostgreSQL builds are possible with
   Visual Studio 2005 to
-  Visual Studio 2015 (including Express editions),
-  as well as standalone Windows SDK releases 6.0 to 7.1.
+  Visual Studio 2017 (including Express editions),
+  as well as standalone Windows SDK releases 6.0 to 8.1.
   64-bit PostgreSQL builds are supported with
-  Microsoft Windows SDK version 6.0a to 7.1 or
+  Microsoft Windows SDK version 6.0a to 8.1 or
   Visual Studio 2008 and above. Compilation
   is supported down to Windows XP and
   Windows Server 2003 when building with
@@ -89,6 +89,8 @@
   Visual Studio 2013. Building with
   Visual Studio 2015 is supported down to
   Windows Vista and Windows Server 2008.
+   Building with Visual Studio 2017 is supported
+   down to Windows 7 SP1 and Windows Server 2008 R2 SP1.
  
 
  
index 27329f9e361808f44daa4be5b5c3629323a65e0c..7a287bd0bda8a913b61635d9753f58a34803add8 100644 (file)
@@ -483,4 +483,27 @@ sub new
    return $self;
 }
 
+package VC2017Project;
+
+#
+# Package that encapsulates a Visual C++ 2017 project file
+#
+
+use strict;
+use warnings;
+use base qw(VC2012Project);
+
+sub new
+{
+   my $classname = shift;
+   my $self      = $classname->SUPER::_new(@_);
+   bless($self, $classname);
+
+   $self->{vcver}           = '15.00';
+   $self->{PlatformToolset} = 'v141';
+   $self->{ToolsVersion}    = '15.0';
+
+   return $self;
+}
+
 1;
index b61ddb8791328dd594af6cf201fe3c70e79f8f73..48082cab90acb3cbbbb5f98f9b4df5795f37fcf5 100644 (file)
@@ -4,7 +4,7 @@ MSVC build
 ==========
 
 This directory contains the tools required to build PostgreSQL using
-Microsoft Visual Studio 2005 - 2011. This builds the whole backend, not just
+Microsoft Visual Studio 2005 - 2017. This builds the whole backend, not just
 the libpq frontend library. For more information, see the documentation
 chapter "Installation on Windows" and the description below.
 
@@ -92,11 +92,12 @@ These configuration arguments are passed over to Mkvcbuild::mkvcbuild
 (Mkvcbuild.pm) which creates the Visual Studio project and solution files.
 It does this by using VSObjectFactory::CreateSolution to create an object
 implementing the Solution interface (this could be either a VS2005Solution,
-a VS2008Solution, a VS2010Solution or a VS2012Solution, all in Solution.pm,
-depending on the user's build environment) and adding objects implementing
-the corresponding Project interface (VC2005Project or VC2008Project from
-VCBuildProject.pm or VC2010Project or VC2012Project from MSBuildProject.pm)
-to it.
+a VS2008Solution, a VS2010Solution or a VS2012Solution or a VS2013Solution,
+or a VS2015Solution or a VS2017Solution, all in Solution.pm, depending on
+the user's build environment) and adding objects implementing the corresponding
+Project interface (VC2005Project or VC2008Project from VCBuildProject.pm or
+VC2010Project or VC2012Project or VC2013Project or VC2015Project or VC2017Project
+from MSBuildProject.pm) to it.
 When Solution::Save is called, the implementations of Solution and Project
 save their content in the appropriate format.
 The final step of starting the appropriate build program (msbuild or vcbuild)
index 5d5f716b6f08f17f45be9774019d65d32461fd85..0925bef139e1ebe0bd2105c393f6c22fbc74785f 100644 (file)
@@ -849,6 +849,32 @@ sub new
    return $self;
 }
 
+package VS2017Solution;
+
+#
+# Package that encapsulates a Visual Studio 2017 solution file
+#
+
+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}        = '12.00';
+   $self->{vcver}                      = '15.00';
+   $self->{visualStudioName}           = 'Visual Studio 2017';
+   $self->{VisualStudioVersion}        = '15.0.26730.3';
+   $self->{MinimumVisualStudioVersion} = '10.0.40219.1';
+
+   return $self;
+}
+
 sub GetAdditionalHeaders
 {
    my ($self, $f) = @_;
index 4190ada618464805873b68bac36218ad6471a674..2f3480a1f603c262270abdecfb71c5e09e397f3b 100644 (file)
@@ -53,8 +53,14 @@ sub CreateSolution
    {
        return new VS2015Solution(@_);
    }
+   # visual 2017 hasn't changed the nmake version to 15, so adjust the check to support it.
+   elsif (($visualStudioVersion ge '14.10') or ($visualStudioVersion eq '15.00'))
+   {
+       return new VS2017Solution(@_);
+   }
    else
    {
+       croak $visualStudioVersion;
        croak "The requested Visual Studio version is not supported.";
    }
 }
@@ -92,8 +98,14 @@ sub CreateProject
    {
        return new VC2015Project(@_);
    }
+   # visual 2017 hasn't changed the nmake version to 15, so adjust the check to support it.
+   elsif (($visualStudioVersion ge '14.10') or ($visualStudioVersion eq '15.00'))
+   {
+       return new VC2017Project(@_);
+   }
    else
    {
+       croak $visualStudioVersion;
        croak "The requested Visual Studio version is not supported.";
    }
 }
@@ -120,6 +132,7 @@ sub DetermineVisualStudioVersion
 sub _GetVisualStudioVersion
 {
    my ($major, $minor) = @_;
+   # visual 2017 hasn't changed the nmake version to 15, so still using the older version for comparison.
    if ($major > 14)
    {
        carp