Add support for Visual Studio 2019 in build scripts
authorMichael Paquier
Tue, 2 Jul 2019 23:58:34 +0000 (08:58 +0900)
committerMichael Paquier
Tue, 2 Jul 2019 23:58:34 +0000 (08:58 +0900)
This adjusts the documentation and the scripts related to the versions
of Windows SDK supported.

Author: Haribabu Kommi
Reviewed-by: Andrew Dunstan, Juan José Santamaría Flecha, Michael
Paquier
Discussion: https://postgr.es/m/CAJrrPGcfqXhfPyMrny9apoDU7M1t59dzVAvoJ9AeAh5BJi+UzA@mail.gmail.com
Backpatch-through: 9.4

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 fca65ec41f131b12f876d4dc24822386c4db0c47..c08a076ea51ef98fd480e6b2117c1bbfe75a4422 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 2017
+  Microsoft tools is to install Visual Studio Express 2019
   for Windows Desktop and use the included
   compiler. It is also possible to build with the full
-  Microsoft Visual C++ 2005 to 2017.
+  Microsoft Visual C++ 2005 to 2019.
   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 2017
+  ways are to use the compilers from Visual Studio Express 2019
   for Windows Desktop or those in the Windows SDK
-  8.1, which are both free downloads from Microsoft.
+  10, which are both free downloads from Microsoft.
  
 
  
   Both 32-bit and 64-bit builds are possible with the Microsoft Compiler suite.
   32-bit PostgreSQL buils are possible with
   Visual Studio 2005 to
-  Visual Studio 2017 (including Express editions),
-  as well as standalone Windows SDK releases 6.0 to 8.1.
+  Visual Studio 2019 (including Express editions),
+  as well as standalone Windows SDK releases 6.0 to 10.
   64-bit PostgreSQL builds are supported with
-  Microsoft Windows SDK version 6.0a to 8.1 or
+  Microsoft Windows SDK version 6.0a to 10 or
   Visual Studio 2008 and above. Compilation
   is supported down to Windows XP and
   Windows Server 2003 when building with
@@ -97,8 +97,9 @@
   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.
+  Building with Visual Studio 2017 and
+  Visual Studio 2019 is supported
+  down to Windows 7 SP1 and Windows Server 2008 R2 SP1.
  
 
  
@@ -162,7 +163,7 @@ $ENV{PATH}=$ENV{PATH} . ';c:\some\where\bison\bin';
       If your build environment doesn't ship with a supported version of the
       Microsoft Windows SDK it
       is recommended that you upgrade to the latest version (currently
-      version 7.1), available for download from
+      version 10), available for download from
       .
      
      
index 2c4ae7b278fe0f205c24ed1dd04dcce6afd7a1e5..158763d9b2e32252c2667c86d7ffb59c912e6074 100644 (file)
@@ -508,4 +508,29 @@ sub new
    return $self;
 }
 
+package VC2019Project;
+
+#
+# Package that encapsulates a Visual C++ 2019 project file
+#
+
+use strict;
+use warnings;
+use base qw(VC2012Project);
+
+no warnings qw(redefine);    ## no critic
+
+sub new
+{
+   my $classname = shift;
+   my $self      = $classname->SUPER::_new(@_);
+   bless($self, $classname);
+
+   $self->{vcver}           = '16.00';
+   $self->{PlatformToolset} = 'v142';
+   $self->{ToolsVersion}    = '16.0';
+
+   return $self;
+}
+
 1;
index 48082cab90acb3cbbbb5f98f9b4df5795f37fcf5..c6db875730cf2ec5b26499ee3e6fa08b77dfb898 100644 (file)
@@ -4,7 +4,7 @@ MSVC build
 ==========
 
 This directory contains the tools required to build PostgreSQL using
-Microsoft Visual Studio 2005 - 2017. This builds the whole backend, not just
+Microsoft Visual Studio 2005 - 2019. 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.
 
@@ -93,11 +93,12 @@ These configuration arguments are passed over to Mkvcbuild::mkvcbuild
 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 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.
+or a VS2015Solution or a VS2017Solution or a VS2019Solution, 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 or VC2019Project 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 6e6e6de4dd6234b4f617630fa8177b68d1f229e8..cccc9df52576dc2bed0c7e5bcb536a2f8e338728 100644 (file)
@@ -925,6 +925,34 @@ sub new
    return $self;
 }
 
+package VS2019Solution;
+
+#
+# Package that encapsulates a Visual Studio 2019 solution file
+#
+
+use Carp;
+use strict;
+use warnings;
+use base qw(Solution);
+
+no warnings qw(redefine);    ## no critic
+
+sub new
+{
+   my $classname = shift;
+   my $self      = $classname->SUPER::_new(@_);
+   bless($self, $classname);
+
+   $self->{solutionFileVersion}        = '12.00';
+   $self->{vcver}                      = '16.00';
+   $self->{visualStudioName}           = 'Visual Studio 2019';
+   $self->{VisualStudioVersion}        = '16.0.28729.10';
+   $self->{MinimumVisualStudioVersion} = '10.0.40219.1';
+
+   return $self;
+}
+
 sub GetAdditionalHeaders
 {
    my ($self, $f) = @_;
index cb1e55e9996010ff59924fc892cf70ad038633f0..4aa47e54dd7ecaa814668baac5fabd0e6c2c72c7 100644 (file)
@@ -53,15 +53,30 @@ 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'))
+
+   # The version of nmake bundled in Visual Studio 2017 is greater
+   # than 14.10 and less than 14.20.  And the version number is
+   # actually 15.00.
+   elsif (
+       ($visualStudioVersion ge '14.10' && $visualStudioVersion lt '14.20')
+       || $visualStudioVersion eq '15.00')
    {
        return new VS2017Solution(@_);
    }
+
+   # The version of nmake bundled in Visual Studio 2019 is greater
+   # than 14.20 and less than 14.30.  And the version number is
+   # actually 16.00.
+   elsif (
+       ($visualStudioVersion ge '14.20' && $visualStudioVersion lt '14.30')
+       || $visualStudioVersion eq '16.00')
+   {
+       return new VS2019Solution(@_);
+   }
    else
    {
-       croak $visualStudioVersion;
-       croak "The requested Visual Studio version is not supported.";
+       croak
+         "The requested Visual Studio version $visualStudioVersion is not supported.";
    }
 }
 
@@ -98,15 +113,30 @@ 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'))
+
+   # The version of nmake bundled in Visual Studio 2017 is greater
+   # than 14.10 and less than 14.20.  And the version number is
+   # actually 15.00.
+   elsif (
+       ($visualStudioVersion ge '14.10' && $visualStudioVersion lt '14.20')
+       || $visualStudioVersion eq '15.00')
    {
        return new VC2017Project(@_);
    }
+
+   # The version of nmake bundled in Visual Studio 2019 is greater
+   # than 14.20 and less than 14.30.  And the version number is
+   # actually 16.00.
+   elsif (
+       ($visualStudioVersion ge '14.20' && $visualStudioVersion lt '14.30')
+       || $visualStudioVersion eq '16.00')
+   {
+       return new VC2019Project(@_);
+   }
    else
    {
-       croak $visualStudioVersion;
-       croak "The requested Visual Studio version is not supported.";
+       croak
+         "The requested Visual Studio version $visualStudioVersion is not supported.";
    }
 }
 
@@ -143,12 +173,15 @@ 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)
+
+   # The major visual studio that is supported has nmake
+   # version <= 14.30, so stick with it as the latest version
+   # if bumping on something even newer.
+   if ($major >= 14 && $minor >= 30)
    {
        carp
 "The determined version of Visual Studio is newer than the latest supported version. Returning the latest supported version instead.";
-       return '14.00';
+       return '14.20';
    }
    elsif ($major < 6)
    {