Add support for Visual Studio 2019 in build scripts
authorMichael Paquier <michael@paquier.xyz>
Tue, 2 Jul 2019 05:02:33 +0000 (14:02 +0900)
committerMichael Paquier <michael@paquier.xyz>
Tue, 2 Jul 2019 05:02:33 +0000 (14:02 +0900)
This fixes at the same time a set of inconsistencies in 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

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 22a2ffd55ee1a6137e416be9e519a10208a8af09..0bbb314c3b1e85debf65cf9e37e6fcb1f2fb82a0 100644 (file)
  <para>
   There are several different ways of building PostgreSQL on
   <productname>Windows</productname>. The simplest way to build with
-  Microsoft tools is to install <productname>Visual Studio Express 2017
+  Microsoft tools is to install <productname>Visual Studio Express 2019
   for Windows Desktop</productname> and use the included
   compiler. It is also possible to build with the full
-  <productname>Microsoft Visual C++ 2013 to 2017</productname>.
+  <productname>Microsoft Visual C++ 2013 to 2019</productname>.
   In some cases that requires the installation of the
   <productname>Windows SDK</productname> in addition to the compiler.
  </para>
   <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
-  ways are to use the compilers from <productname>Visual Studio Express 2017
+  ways are to use the compilers from <productname>Visual Studio Express 2019
   for Windows Desktop</productname> or those in the <productname>Windows SDK
-  8.1</productname>, which are both free downloads from Microsoft.
+  10</productname>, which are both free downloads from Microsoft.
  </para>
 
  <para>
   Both 32-bit and 64-bit builds are possible with the Microsoft Compiler suite.
   32-bit PostgreSQL builds are possible with
   <productname>Visual Studio 2013</productname> to
-  <productname>Visual Studio 2017</productname> (including Express editions),
-  as well as standalone Windows SDK releases 6.0 to 8.1.
+  <productname>Visual Studio 2019</productname> (including Express editions),
+  as well as standalone Windows SDK releases 8.1a to 10.
   64-bit PostgreSQL builds are supported with
-  <productname>Microsoft Windows SDK</productname> version 6.0a to 8.1 or
+  <productname>Microsoft Windows SDK</productname> version 8.1a to 10 or
   <productname>Visual Studio 2013</productname> and above. Compilation
   is supported down to <productname>Windows 7</productname> and
   <productname>Windows Server 2008 R2 SP1</productname> when building with
   <productname>Visual Studio 2013</productname> to
-  <productname>Visual Studio 2017</productname>.
+  <productname>Visual Studio 2019</productname>.
    <!--
        For 2013 requirements:
        https://docs.microsoft.com/en-us/visualstudio/productinfo/vs2013-sysrequirements-vs
@@ -94,6 +94,8 @@
        https://docs.microsoft.com/en-us/visualstudio/productinfo/vs2015-sysrequirements-vs
        For 2017 requirements:
        https://docs.microsoft.com/en-us/visualstudio/productinfo/vs2017-system-requirements-vs
+       For 2019 requirements:
+       https://docs.microsoft.com/en-us/visualstudio/releases/2019/system-requirements
    -->
  </para>
 
@@ -166,7 +168,7 @@ $ENV{MSBFLAGS}="/m";
       If your build environment doesn't ship with a supported version of the
       <productname>Microsoft Windows SDK</productname> it
       is recommended that you upgrade to the latest version (currently
-      version 7.1), available for download from
+      version 10), available for download from
       <ulink url="https://www.microsoft.com/download"></ulink>.
      </para>
      <para>
index 149213378cf20f67b2cf4f7728a27f84943aec71..ca965bdf1aa24eed327edf633007058d4036027d 100644 (file)
@@ -467,4 +467,29 @@ sub new
    return $self;
 }
 
+package VC2019Project;
+
+#
+# Package that encapsulates a Visual C++ 2019 project file
+#
+
+use strict;
+use warnings;
+use base qw(MSBuildProject);
+
+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 4ab81d3402fc2eccbe6181832cd04b2c6db2425a..d22fff331d67c752249561a84058f3627d6ea795 100644 (file)
@@ -4,7 +4,7 @@ MSVC build
 ==========
 
 This directory contains the tools required to build PostgreSQL using
-Microsoft Visual Studio 2013 - 2017. This builds the whole backend, not just
+Microsoft Visual Studio 2013 - 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.
 
@@ -16,7 +16,7 @@ has to be installed. Since this is not included in the product
 originally, extra steps are needed to make it work.
 
 First, download and install a supported version of the Microsoft Windows SDK
-from www.microsoft.com (v6.0 or greater).
+from www.microsoft.com (v8.1a or greater).
 
 Locate the files vcprojectengine.dll.express.config and
 vcprojectengine.dll.config in the vc\vcpackages directory of
@@ -88,11 +88,11 @@ config_default.pl to create the configuration arguments.
 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 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 (VC2013Project or VC2015Project or VC2017Project from
-MSBuildProject.pm) to it.
+implementing the Solution interface (this could be either VS2013Solution,
+VS2015Solution, VS2017Solution or VS2019Solution, all in Solution.pm,
+depending on the user's build environment) and adding objects implementing
+the corresponding Project interface (VC2013Project, VC2015Project,
+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) is
index fc270cfe1c2034086e873e670711b828e4f71352..51711c2bff98aedc070276db4df09c53a7f0abf3 100644 (file)
@@ -969,6 +969,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 1a94cd866eee48b569ec60871f6e2f2866db550b..610dc612866937dd1637728149a301f3062ce7bc 100644 (file)
@@ -39,16 +39,29 @@ 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.";
    }
 }
 
@@ -70,16 +83,29 @@ 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.";
    }
 }
 
@@ -106,17 +132,19 @@ 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)
+   elsif ($major < 12)
    {
        croak
-         "Unable to determine Visual Studio version: Visual Studio versions before 6.0 aren't supported.";
+         "Unable to determine Visual Studio version: Visual Studio versions before 12.0 aren't supported.";
    }
    return "$major.$minor";
 }