Commit 2b1394fc authored by Michael Paquier's avatar Michael Paquier

Add support for Visual Studio 2019 in build scripts

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
parent 9adda245
...@@ -19,10 +19,10 @@ ...@@ -19,10 +19,10 @@
<para> <para>
There are several different ways of building PostgreSQL on There are several different ways of building PostgreSQL on
<productname>Windows</productname>. The simplest way to build with <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 for Windows Desktop</productname> and use the included
compiler. It is also possible to build with the full 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 In some cases that requires the installation of the
<productname>Windows SDK</productname> in addition to the compiler. <productname>Windows SDK</productname> in addition to the compiler.
</para> </para>
...@@ -69,24 +69,24 @@ ...@@ -69,24 +69,24 @@
<productname>Visual Studio Express</productname> or some versions of the <productname>Visual Studio Express</productname> or some versions of the
<productname>Microsoft Windows SDK</productname>. If you do not already have a <productname>Microsoft Windows SDK</productname>. If you do not already have a
<productname>Visual Studio</productname> environment set up, the easiest <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 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>
<para> <para>
Both 32-bit and 64-bit builds are possible with the Microsoft Compiler suite. Both 32-bit and 64-bit builds are possible with the Microsoft Compiler suite.
32-bit PostgreSQL builds are possible with 32-bit PostgreSQL builds are possible with
<productname>Visual Studio 2013</productname> to <productname>Visual Studio 2013</productname> to
<productname>Visual Studio 2017</productname> (including Express editions), <productname>Visual Studio 2019</productname> (including Express editions),
as well as standalone Windows SDK releases 6.0 to 8.1. as well as standalone Windows SDK releases 8.1a to 10.
64-bit PostgreSQL builds are supported with 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 <productname>Visual Studio 2013</productname> and above. Compilation
is supported down to <productname>Windows 7</productname> and is supported down to <productname>Windows 7</productname> and
<productname>Windows Server 2008 R2 SP1</productname> when building with <productname>Windows Server 2008 R2 SP1</productname> when building with
<productname>Visual Studio 2013</productname> to <productname>Visual Studio 2013</productname> to
<productname>Visual Studio 2017</productname>. <productname>Visual Studio 2019</productname>.
<!-- <!--
For 2013 requirements: For 2013 requirements:
https://docs.microsoft.com/en-us/visualstudio/productinfo/vs2013-sysrequirements-vs https://docs.microsoft.com/en-us/visualstudio/productinfo/vs2013-sysrequirements-vs
...@@ -94,6 +94,8 @@ ...@@ -94,6 +94,8 @@
https://docs.microsoft.com/en-us/visualstudio/productinfo/vs2015-sysrequirements-vs https://docs.microsoft.com/en-us/visualstudio/productinfo/vs2015-sysrequirements-vs
For 2017 requirements: For 2017 requirements:
https://docs.microsoft.com/en-us/visualstudio/productinfo/vs2017-system-requirements-vs 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> </para>
...@@ -166,7 +168,7 @@ $ENV{MSBFLAGS}="/m"; ...@@ -166,7 +168,7 @@ $ENV{MSBFLAGS}="/m";
If your build environment doesn't ship with a supported version of the If your build environment doesn't ship with a supported version of the
<productname>Microsoft Windows SDK</productname> it <productname>Microsoft Windows SDK</productname> it
is recommended that you upgrade to the latest version (currently 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>. <ulink url="https://www.microsoft.com/download"></ulink>.
</para> </para>
<para> <para>
......
...@@ -467,4 +467,29 @@ sub new ...@@ -467,4 +467,29 @@ sub new
return $self; 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; 1;
...@@ -4,7 +4,7 @@ MSVC build ...@@ -4,7 +4,7 @@ MSVC build
========== ==========
This directory contains the tools required to build PostgreSQL using 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 the libpq frontend library. For more information, see the documentation
chapter "Installation on Windows" and the description below. chapter "Installation on Windows" and the description below.
...@@ -16,7 +16,7 @@ has to be installed. Since this is not included in the product ...@@ -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. originally, extra steps are needed to make it work.
First, download and install a supported version of the Microsoft Windows SDK 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 Locate the files vcprojectengine.dll.express.config and
vcprojectengine.dll.config in the vc\vcpackages directory of vcprojectengine.dll.config in the vc\vcpackages directory of
...@@ -88,11 +88,11 @@ config_default.pl to create the configuration arguments. ...@@ -88,11 +88,11 @@ config_default.pl to create the configuration arguments.
These configuration arguments are passed over to Mkvcbuild::mkvcbuild These configuration arguments are passed over to Mkvcbuild::mkvcbuild
(Mkvcbuild.pm) which creates the Visual Studio project and solution files. (Mkvcbuild.pm) which creates the Visual Studio project and solution files.
It does this by using VSObjectFactory::CreateSolution to create an object It does this by using VSObjectFactory::CreateSolution to create an object
implementing the Solution interface (this could be either a VS2013Solution, implementing the Solution interface (this could be either VS2013Solution,
or a VS2015Solution or a VS2017Solution, all in Solution.pm, depending on VS2015Solution, VS2017Solution or VS2019Solution, all in Solution.pm,
the user's build environment) and adding objects implementing the corresponding depending on the user's build environment) and adding objects implementing
Project interface (VC2013Project or VC2015Project or VC2017Project from the corresponding Project interface (VC2013Project, VC2015Project,
MSBuildProject.pm) to it. VC2017Project or VC2019Project from MSBuildProject.pm) to it.
When Solution::Save is called, the implementations of Solution and Project When Solution::Save is called, the implementations of Solution and Project
save their content in the appropriate format. save their content in the appropriate format.
The final step of starting the appropriate build program (msbuild) is The final step of starting the appropriate build program (msbuild) is
......
...@@ -969,6 +969,34 @@ sub new ...@@ -969,6 +969,34 @@ sub new
return $self; 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 sub GetAdditionalHeaders
{ {
my ($self, $f) = @_; my ($self, $f) = @_;
......
...@@ -39,16 +39,29 @@ sub CreateSolution ...@@ -39,16 +39,29 @@ sub CreateSolution
return new VS2015Solution(@_); return new VS2015Solution(@_);
} }
# visual 2017 hasn't changed the nmake version to 15, so adjust the check to support it. # The version of nmake bundled in Visual Studio 2017 is greater
elsif (($visualStudioVersion ge '14.10') # than 14.10 and less than 14.20. And the version number is
or ($visualStudioVersion eq '15.00')) # actually 15.00.
elsif (
($visualStudioVersion ge '14.10' && $visualStudioVersion lt '14.20')
|| $visualStudioVersion eq '15.00')
{ {
return new VS2017Solution(@_); 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 else
{ {
croak $visualStudioVersion; croak
croak "The requested Visual Studio version is not supported."; "The requested Visual Studio version $visualStudioVersion is not supported.";
} }
} }
...@@ -70,16 +83,29 @@ sub CreateProject ...@@ -70,16 +83,29 @@ sub CreateProject
return new VC2015Project(@_); return new VC2015Project(@_);
} }
# visual 2017 hasn't changed the nmake version to 15, so adjust the check to support it. # The version of nmake bundled in Visual Studio 2017 is greater
elsif (($visualStudioVersion ge '14.10') # than 14.10 and less than 14.20. And the version number is
or ($visualStudioVersion eq '15.00')) # actually 15.00.
elsif (
($visualStudioVersion ge '14.10' && $visualStudioVersion lt '14.20')
|| $visualStudioVersion eq '15.00')
{ {
return new VC2017Project(@_); 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 else
{ {
croak $visualStudioVersion; croak
croak "The requested Visual Studio version is not supported."; "The requested Visual Studio version $visualStudioVersion is not supported.";
} }
} }
...@@ -106,17 +132,19 @@ sub _GetVisualStudioVersion ...@@ -106,17 +132,19 @@ sub _GetVisualStudioVersion
{ {
my ($major, $minor) = @_; my ($major, $minor) = @_;
# visual 2017 hasn't changed the nmake version to 15, so still using the older version for comparison. # The major visual studio that is supported has nmake
if ($major > 14) # version <= 14.30, so stick with it as the latest version
# if bumping on something even newer.
if ($major >= 14 && $minor >= 30)
{ {
carp carp
"The determined version of Visual Studio is newer than the latest supported version. Returning the latest supported version instead."; "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 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"; return "$major.$minor";
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment