On Wed, Mar 27, 2019 at 11:42 AM Haribabu Kommi <kommi.harib...@gmail.com>
wrote:

>
> On Wed, Mar 27, 2019 at 3:03 AM Andrew Dunstan <
> andrew.duns...@2ndquadrant.com> wrote:
>
>>
>> On 3/20/19 8:36 PM, Haribabu Kommi wrote:
>> > Hi Hackers,
>> >
>> > Here I attached a patch that supports building of PostgreSQL with VS
>> 2019.
>> > VS 2019 is going to release on Apr 2nd 2019, it will be good if version
>> 12
>> > supports compiling. The attached for is for review, it may needs some
>> > updates
>> > once the final version is released.
>> >
>> > Commit d9dd406fe281d22d5238d3c26a7182543c711e74 has reduced the
>> > minimum visual studio support to 2013 to support C99 standards,
>> > because of this
>> > reason, the current attached patch cannot be backpatched as it is.
>> >
>> > I can provide a separate back branches patch later once this patch
>> > comes to a stage of commit. Currently all the supported branches are
>> > possible to compile with VS 2017.
>> >
>> > comments?
>> >
>> >
>>
>>
>> I have verified that this works with VS2019.
>>
>>
>> There are a few typos in the comments that need cleaning up.
>>
>
> Thanks for the review.
>
> I corrected the typos in the comments, hopefully I covered everything.
> Attached is the updated patch. Once the final VS 2019, I will check the
> patch if it needs any more updates.
>

Visual Studio 2019 is officially released. There is no major change in the
patch, except some small comments update.

Also attached patches for the back branches also.

Regards,
Haribabu Kommi
Fujitsu Australia
From 6b21a229400bae51b225dd96d68249d2a61d9ac2 Mon Sep 17 00:00:00 2001
From: Hari Babu <kommi.haribabu@gmail.com>
Date: Fri, 5 Apr 2019 10:15:57 +1100
Subject: [PATCH] support building with visual studio 2019

---
 doc/src/sgml/install-windows.sgml | 21 ++++++++--------
 src/tools/msvc/MSBuildProject.pm  | 25 +++++++++++++++++++
 src/tools/msvc/README             | 12 +++++-----
 src/tools/msvc/Solution.pm        | 28 ++++++++++++++++++++++
 src/tools/msvc/VSObjectFactory.pm | 40 +++++++++++++++++++++++++------
 5 files changed, 103 insertions(+), 23 deletions(-)

diff --git a/doc/src/sgml/install-windows.sgml b/doc/src/sgml/install-windows.sgml
index ac00ac8232..efa9f5dbc2 100644
--- a/doc/src/sgml/install-windows.sgml
+++ b/doc/src/sgml/install-windows.sgml
@@ -19,10 +19,10 @@
  <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>
@@ -69,19 +69,19 @@
   <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</productname> 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</productname> and <productname>Windows Server 2008</productname>.
-   Building with <productname>Visual Studio 2017</productname> is supported
-   down to <productname>Windows 7 SP1</productname> and <productname>Windows Server 2008 R2 SP1</productname>.
+  Building with <productname>Visual Studio 2017</productname> and <productname>Visual Studio 2019</productname>
+  are supported down to <productname>Windows 7 SP1</productname> and
+  <productname>Windows Server 2008 R2 SP1</productname>.
  </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";></ulink>.
      </para>
      <para>
diff --git a/src/tools/msvc/MSBuildProject.pm b/src/tools/msvc/MSBuildProject.pm
index 47252533a1..3edb11b9b5 100644
--- a/src/tools/msvc/MSBuildProject.pm
+++ b/src/tools/msvc/MSBuildProject.pm
@@ -535,4 +535,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;
diff --git a/src/tools/msvc/README b/src/tools/msvc/README
index 48082cab90..0a41dbff8c 100644
--- a/src/tools/msvc/README
+++ b/src/tools/msvc/README
@@ -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,11 @@ 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)
diff --git a/src/tools/msvc/Solution.pm b/src/tools/msvc/Solution.pm
index 78db247b29..a253b5ea5e 100644
--- a/src/tools/msvc/Solution.pm
+++ b/src/tools/msvc/Solution.pm
@@ -946,6 +946,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.32.32432';
+	$self->{MinimumVisualStudioVersion} = '10.0.40219.1';
+
+	return $self;
+}
+
 sub GetAdditionalHeaders
 {
 	my ($self, $f) = @_;
diff --git a/src/tools/msvc/VSObjectFactory.pm b/src/tools/msvc/VSObjectFactory.pm
index 92a4fb6841..d65fdd1259 100644
--- a/src/tools/msvc/VSObjectFactory.pm
+++ b/src/tools/msvc/VSObjectFactory.pm
@@ -56,15 +56,28 @@ 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')
+	# visual studio 2017 nmake version is greather than 14.10 and less than 14.20.
+	# but the version number is 15.00
+	# so adjust the check to support it.
+	elsif ((($visualStudioVersion ge '14.10')
+		and ($visualStudioVersion lt '14.20'))
 		or ($visualStudioVersion eq '15.00'))
 	{
 		return new VS2017Solution(@_);
 	}
+
+	# visual studio 2019 nmake version is greather than 14.20 and less than 14.30 (expected).
+	# but the version number is 16.00
+	# so adjust the check to support it.
+	elsif ((($visualStudioVersion ge '14.20')
+		and ($visualStudioVersion lt '14.30'))
+		or ($visualStudioVersion eq '16.00'))
+	{
+		return new VS2019Solution(@_);
+	}
 	else
 	{
-		croak $visualStudioVersion;
+		carp $visualStudioVersion;
 		croak "The requested Visual Studio version is not supported.";
 	}
 }
@@ -103,15 +116,28 @@ 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')
+	# visual studio 2017 nmake version is greather than 14.10 and less than 14.20.
+	# but the version number is 15.00
+	# so adjust the check to support it.
+	elsif ((($visualStudioVersion ge '14.10')
+		and ($visualStudioVersion lt '14.20'))
 		or ($visualStudioVersion eq '15.00'))
 	{
 		return new VC2017Project(@_);
 	}
+
+	# visual studio 2019 nmake version is greather than 14.20 and less than 14.30 (expected).
+	# but the version number is 16.00
+	# so adjust the check to support it.
+	elsif ((($visualStudioVersion ge '14.20')
+		and ($visualStudioVersion lt '14.30'))
+		or ($visualStudioVersion eq '16.00'))
+	{
+		return new VC2019Project(@_);
+	}
 	else
 	{
-		croak $visualStudioVersion;
+		carp $visualStudioVersion;
 		croak "The requested Visual Studio version is not supported.";
 	}
 }
@@ -139,7 +165,7 @@ sub _GetVisualStudioVersion
 {
 	my ($major, $minor) = @_;
 
-	# visual 2017 hasn't changed the nmake version to 15, so still using the older version for comparison.
+	# The major visual stuido that is suppored has nmake version >= 14.20 and < 15.
 	if ($major > 14)
 	{
 		carp
-- 
2.20.1.windows.1

From 0bb99859bd374e00577d3db1801cb6f634769ec6 Mon Sep 17 00:00:00 2001
From: Hari Babu <kommi.haribabu@gmail.com>
Date: Fri, 5 Apr 2019 11:08:43 +1100
Subject: [PATCH] support building with visual studio 2019

---
 doc/src/sgml/install-windows.sgml | 21 ++++++++-------
 src/tools/msvc/MSBuildProject.pm  | 25 ++++++++++++++++++
 src/tools/msvc/README             | 12 ++++-----
 src/tools/msvc/Solution.pm        | 28 ++++++++++++++++++++
 src/tools/msvc/VSObjectFactory.pm | 44 ++++++++++++++++++++++++++-----
 5 files changed, 107 insertions(+), 23 deletions(-)

diff --git a/doc/src/sgml/install-windows.sgml b/doc/src/sgml/install-windows.sgml
index f70fee407b..7d2552563a 100644
--- a/doc/src/sgml/install-windows.sgml
+++ b/doc/src/sgml/install-windows.sgml
@@ -19,10 +19,10 @@
  <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>
@@ -69,19 +69,19 @@
   <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
+   <prodcutname>Visual Studio 2019</prodcutname> are 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>
diff --git a/src/tools/msvc/MSBuildProject.pm b/src/tools/msvc/MSBuildProject.pm
index 9ddccc7c55..d0f2fe7779 100644
--- a/src/tools/msvc/MSBuildProject.pm
+++ b/src/tools/msvc/MSBuildProject.pm
@@ -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;
diff --git a/src/tools/msvc/README b/src/tools/msvc/README
index 48082cab90..0a41dbff8c 100644
--- a/src/tools/msvc/README
+++ b/src/tools/msvc/README
@@ -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,11 @@ 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)
diff --git a/src/tools/msvc/Solution.pm b/src/tools/msvc/Solution.pm
index 17f86c5ee8..54bd4b0098 100644
--- a/src/tools/msvc/Solution.pm
+++ b/src/tools/msvc/Solution.pm
@@ -881,6 +881,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.32.32432';
+	$self->{MinimumVisualStudioVersion} = '10.0.40219.1';
+
+	return $self;
+}
+
 sub GetAdditionalHeaders
 {
 	my ($self, $f) = @_;
diff --git a/src/tools/msvc/VSObjectFactory.pm b/src/tools/msvc/VSObjectFactory.pm
index 2f3480a1f6..6a75d874b3 100644
--- a/src/tools/msvc/VSObjectFactory.pm
+++ b/src/tools/msvc/VSObjectFactory.pm
@@ -53,14 +53,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'))
+
+	# visual studio 2017 nmake version is greather than 14.10 and less than 14.20.
+	# but the version number is 15.00
+	# so adjust the check to support it.
+	elsif ((($visualStudioVersion ge '14.10')
+		and ($visualStudioVersion lt '14.20'))
+		or ($visualStudioVersion eq '15.00'))
 	{
 		return new VS2017Solution(@_);
 	}
+
+	# visual studio 2019 nmake version is greather than 14.20 and less than 14.30 (expected).
+	# but the version number is 16.00
+	# so adjust the check to support it.
+	elsif ((($visualStudioVersion ge '14.20')
+		and ($visualStudioVersion lt '14.30'))
+		or ($visualStudioVersion eq '16.00'))
+	{
+		return new VS2019Solution(@_);
+	}
 	else
 	{
-		croak $visualStudioVersion;
+		carp $visualStudioVersion;
 		croak "The requested Visual Studio version is not supported.";
 	}
 }
@@ -98,14 +113,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'))
+
+	# visual studio 2017 nmake version is greather than 14.10 and less than 14.20.
+	# but the version number is 15.00
+	# so adjust the check to support it.
+	elsif ((($visualStudioVersion ge '14.10')
+		and ($visualStudioVersion lt '14.20'))
+		or ($visualStudioVersion eq '15.00'))
 	{
 		return new VC2017Project(@_);
 	}
+
+	# visual studio 2019 nmake version is greather than 14.20 and less than 14.30 (expected).
+	# but the version number is 16.00
+	# so adjust the check to support it.
+	elsif ((($visualStudioVersion ge '14.20')
+		and ($visualStudioVersion lt '14.30'))
+		or ($visualStudioVersion eq '16.00'))
+	{
+		return new VC2019Project(@_);
+	}
 	else
 	{
-		croak $visualStudioVersion;
+		carp $visualStudioVersion;
 		croak "The requested Visual Studio version is not supported.";
 	}
 }
@@ -132,7 +162,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.
+	# The major visual stuido that is suppored has nmake version >= 14.20 and < 15.
 	if ($major > 14)
 	{
 		carp
-- 
2.20.1.windows.1

From e360bc8ee3d392441ec3765347f6beda3bfb9c3b Mon Sep 17 00:00:00 2001
From: Hari Babu <kommi.haribabu@gmail.com>
Date: Wed, 20 Mar 2019 18:35:56 +1100
Subject: [PATCH] Support building with visual studio 2019

---
 doc/src/sgml/install-windows.sgml | 20 +++++++-------
 src/tools/msvc/MSBuildProject.pm  | 25 ++++++++++++++++++
 src/tools/msvc/README             | 10 +++----
 src/tools/msvc/Solution.pm        | 28 ++++++++++++++++++++
 src/tools/msvc/VSObjectFactory.pm | 44 ++++++++++++++++++++++++-------
 5 files changed, 104 insertions(+), 23 deletions(-)

diff --git a/doc/src/sgml/install-windows.sgml b/doc/src/sgml/install-windows.sgml
index 22a2ffd55e..0bbb314c3b 100644
--- a/doc/src/sgml/install-windows.sgml
+++ b/doc/src/sgml/install-windows.sgml
@@ -19,10 +19,10 @@
  <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>
@@ -69,24 +69,24 @@
   <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>
diff --git a/src/tools/msvc/MSBuildProject.pm b/src/tools/msvc/MSBuildProject.pm
index 149213378c..ca965bdf1a 100644
--- a/src/tools/msvc/MSBuildProject.pm
+++ b/src/tools/msvc/MSBuildProject.pm
@@ -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;
diff --git a/src/tools/msvc/README b/src/tools/msvc/README
index 4ab81d3402..45d71541fc 100644
--- a/src/tools/msvc/README
+++ b/src/tools/msvc/README
@@ -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.
 
@@ -89,10 +89,10 @@ 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 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.
+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 (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) is
diff --git a/src/tools/msvc/Solution.pm b/src/tools/msvc/Solution.pm
index 2ea224d770..ee999c0990 100644
--- a/src/tools/msvc/Solution.pm
+++ b/src/tools/msvc/Solution.pm
@@ -871,6 +871,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.32.32432';
+	$self->{MinimumVisualStudioVersion} = '10.0.40219.1';
+
+	return $self;
+}
+
 sub GetAdditionalHeaders
 {
 	my ($self, $f) = @_;
diff --git a/src/tools/msvc/VSObjectFactory.pm b/src/tools/msvc/VSObjectFactory.pm
index 1a94cd866e..c5c0b11004 100644
--- a/src/tools/msvc/VSObjectFactory.pm
+++ b/src/tools/msvc/VSObjectFactory.pm
@@ -39,15 +39,28 @@ 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')
+	# visual studio 2017 nmake version is greather than 14.10 and less than 14.20.
+	# but the version number is 15.00
+	# so adjust the check to support it.
+	elsif ((($visualStudioVersion ge '14.10')
+		and ($visualStudioVersion lt '14.20'))
 		or ($visualStudioVersion eq '15.00'))
 	{
 		return new VS2017Solution(@_);
 	}
+
+	# visual studio 2019 nmake version is greather than 14.20 and less than 14.30 (expected).
+	# but the version number is 16.00
+	# so adjust the check to support it.
+	elsif ((($visualStudioVersion ge '14.20')
+		and ($visualStudioVersion lt '14.30'))
+		or ($visualStudioVersion eq '16.00'))
+	{
+		return new VS2019Solution(@_);
+	}
 	else
 	{
-		croak $visualStudioVersion;
+		carp $visualStudioVersion;
 		croak "The requested Visual Studio version is not supported.";
 	}
 }
@@ -70,15 +83,28 @@ 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')
+	# visual studio 2017 nmake version is greather than 14.10 and less than 14.20.
+	# but the version number is 15.00
+	# so adjust the check to support it.
+	elsif ((($visualStudioVersion ge '14.10')
+		and ($visualStudioVersion lt '14.20'))
 		or ($visualStudioVersion eq '15.00'))
 	{
 		return new VC2017Project(@_);
 	}
+
+	# visual studio 2019 nmake version is greather than 14.20 and less than 14.30 (expected).
+	# but the version number is 16.00
+	# so adjust the check to support it.
+	elsif ((($visualStudioVersion ge '14.20')
+		and ($visualStudioVersion lt '14.30'))
+		or ($visualStudioVersion eq '16.00'))
+	{
+		return new VC2019Project(@_);
+	}
 	else
 	{
-		croak $visualStudioVersion;
+		carp $visualStudioVersion;
 		croak "The requested Visual Studio version is not supported.";
 	}
 }
@@ -106,17 +132,17 @@ sub _GetVisualStudioVersion
 {
 	my ($major, $minor) = @_;
 
-	# visual 2017 hasn't changed the nmake version to 15, so still using the older version for comparison.
+	# The major visual stuido that is suppored has nmake version >= 14.20 and < 15.
 	if ($major > 14)
 	{
 		carp
 		  "The determined version of Visual Studio is newer than the latest supported version. Returning the latest supported version instead.";
 		return '14.00';
 	}
-	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";
 }
-- 
2.20.1.windows.1

From 5d524cdebf21d7d35d561171784acf689ab86a0f Mon Sep 17 00:00:00 2001
From: Hari Babu <kommi.haribabu@gmail.com>
Date: Fri, 5 Apr 2019 11:24:58 +1100
Subject: [PATCH] support building with visual studio 2019

---
 doc/src/sgml/install-windows.sgml | 21 ++++++++-------
 src/tools/msvc/MSBuildProject.pm  | 25 ++++++++++++++++++
 src/tools/msvc/README             | 12 ++++-----
 src/tools/msvc/Solution.pm        | 28 ++++++++++++++++++++
 src/tools/msvc/VSObjectFactory.pm | 44 ++++++++++++++++++++++++++-----
 5 files changed, 107 insertions(+), 23 deletions(-)

diff --git a/doc/src/sgml/install-windows.sgml b/doc/src/sgml/install-windows.sgml
index fca65ec41f..ef89e4bb34 100644
--- a/doc/src/sgml/install-windows.sgml
+++ b/doc/src/sgml/install-windows.sgml
@@ -19,10 +19,10 @@
  <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>
@@ -77,19 +77,19 @@
   <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 buils 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
@@ -97,8 +97,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
+   <prodcutname>Visual Studio 2019</prodcutname> are supported down to
+   <productname>Windows 7 SP1</> and <productname>Windows Server 2008 R2 SP1</>.
  </para>
 
  <para>
@@ -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
       <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>
diff --git a/src/tools/msvc/MSBuildProject.pm b/src/tools/msvc/MSBuildProject.pm
index 2c4ae7b278..158763d9b2 100644
--- a/src/tools/msvc/MSBuildProject.pm
+++ b/src/tools/msvc/MSBuildProject.pm
@@ -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;
diff --git a/src/tools/msvc/README b/src/tools/msvc/README
index 48082cab90..0a41dbff8c 100644
--- a/src/tools/msvc/README
+++ b/src/tools/msvc/README
@@ -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,11 @@ 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)
diff --git a/src/tools/msvc/Solution.pm b/src/tools/msvc/Solution.pm
index d1a791c5ad..12ac1ebc99 100644
--- a/src/tools/msvc/Solution.pm
+++ b/src/tools/msvc/Solution.pm
@@ -833,6 +833,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.32.32432';
+	$self->{MinimumVisualStudioVersion} = '10.0.40219.1';
+
+	return $self;
+}
+
 sub GetAdditionalHeaders
 {
 	my ($self, $f) = @_;
diff --git a/src/tools/msvc/VSObjectFactory.pm b/src/tools/msvc/VSObjectFactory.pm
index cb1e55e999..7c21962beb 100644
--- a/src/tools/msvc/VSObjectFactory.pm
+++ b/src/tools/msvc/VSObjectFactory.pm
@@ -53,14 +53,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'))
+
+	# visual studio 2017 nmake version is greather than 14.10 and less than 14.20.
+	# but the version number is 15.00
+	# so adjust the check to support it.
+	elsif ((($visualStudioVersion ge '14.10')
+		and ($visualStudioVersion lt '14.20'))
+		or ($visualStudioVersion eq '15.00'))
 	{
 		return new VS2017Solution(@_);
 	}
+
+	# visual studio 2019 nmake version is greather than 14.20 and less than 14.30 (expected).
+	# but the version number is 16.00
+	# so adjust the check to support it.
+	elsif ((($visualStudioVersion ge '14.20')
+		and ($visualStudioVersion lt '14.30'))
+		or ($visualStudioVersion eq '16.00'))
+	{
+		return new VS2019Solution(@_);
+	}
 	else
 	{
-		croak $visualStudioVersion;
+		carp $visualStudioVersion;
 		croak "The requested Visual Studio version is not supported.";
 	}
 }
@@ -98,14 +113,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'))
+
+	# visual studio 2017 nmake version is greather than 14.10 and less than 14.20.
+	# but the version number is 15.00
+	# so adjust the check to support it.
+	elsif ((($visualStudioVersion ge '14.10')
+		and ($visualStudioVersion lt '14.20'))
+		or ($visualStudioVersion eq '15.00'))
 	{
 		return new VC2017Project(@_);
 	}
+
+	# visual studio 2019 nmake version is greather than 14.20 and less than 14.30 (expected).
+	# but the version number is 16.00
+	# so adjust the check to support it.
+	elsif ((($visualStudioVersion ge '14.20')
+		and ($visualStudioVersion lt '14.30'))
+		or ($visualStudioVersion eq '16.00'))
+	{
+		return new VC2019Project(@_);
+	}
 	else
 	{
-		croak $visualStudioVersion;
+		carp $visualStudioVersion;
 		croak "The requested Visual Studio version is not supported.";
 	}
 }
@@ -143,7 +173,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.
+	# The major visual stuido that is suppored has nmake version >= 14.20 and < 15.
 	if ($major > 14)
 	{
 		carp
-- 
2.20.1.windows.1

Reply via email to