]> granicus.if.org Git - postgresql/commitdiff
Add support for Visual Studio 2019 in build scripts
authorMichael Paquier <michael@paquier.xyz>
Tue, 2 Jul 2019 23:58:04 +0000 (08:58 +0900)
committerMichael Paquier <michael@paquier.xyz>
Tue, 2 Jul 2019 23:58:04 +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 f70fee407b3fc170dc1e7d2f469cc1e4d17bc384..d41d953b0e9b8b6d2e508286deeb8d03ab0f0c8b 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++ 2005 to 2017</productname>.
+  <productname>Microsoft Visual C++ 2005 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 2005</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 6.0 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 6.0a to 10 or
   <productname>Visual Studio 2008</productname> and above. Compilation
   is supported down to <productname>Windows XP</productname> and
   <productname>Windows Server 2003</> when building with
@@ -89,8 +89,9 @@
   <productname>Visual Studio 2013</productname>. Building with
   <productname>Visual Studio 2015</productname> is supported down to
   <productname>Windows Vista</> and <productname>Windows Server 2008</>.
-   Building with <productname>Visual Studio 2017</productname> is supported
-   down to <productname>Windows 7 SP1</> and <productname>Windows Server 2008 R2 SP1</>.
+  Building with <productname>Visual Studio 2017</productname> and
+  <productname>Visual Studio 2019</productname> is supported
+  down to <productname>Windows 7 SP1</> and <productname>Windows Server 2008 R2 SP1</>.
  </para>
 
  <para>
@@ -162,7 +163,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"></>.
      </para>
      <para>
index 9ddccc7c55407753bb1f599212bce06cc1236bbc..d0f2fe7779eafce420ca6507e2b939da2c0e8e87 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 a5f35bf3971ef3ae25c6a6eb7119bf83242593ac..cb0edd387b6bb76b66a111c31b56848afda748df 100644 (file)
@@ -972,6 +972,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 2f3480a1f603c262270abdecfb71c5e09e397f3b..07be39f2bd8d3996dc0bd164fe60c56d9eb86c83 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.";
        }
 }
 
@@ -132,12 +162,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)
        {