From 6b21a229400bae51b225dd96d68249d2a61d9ac2 Mon Sep 17 00:00:00 2001 From: Hari Babu 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 @@ 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. @@ -69,19 +69,19 @@ 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 builds 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 @@ -89,8 +89,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 + are supported down to Windows 7 SP1 and + Windows Server 2008 R2 SP1. @@ -162,7 +163,7 @@ $ENV{MSBFLAGS}="/m"; 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 . 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