diff --git a/doc/src/sgml/install-windows.sgml b/doc/src/sgml/install-windows.sgml index 31b6116cbbb..00cf163384e 100644 --- a/doc/src/sgml/install-windows.sgml +++ b/doc/src/sgml/install-windows.sgml @@ -19,9 +19,9 @@ There are several different ways of building PostgreSQL on Windows. The simplest way to build with - Microsoft tools is to install Visual Studio 2019 + Microsoft tools is to install Visual Studio 2022 and use the included compiler. It is also possible to build with the full - Microsoft Visual C++ 2005 to 2019. + Microsoft Visual C++ 2005 to 2022. In some cases that requires the installation of the Windows SDK in addition to the compiler. @@ -69,7 +69,7 @@ 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 2019 or those in the + Visual Studio 2022 or those in the Windows SDK 10, which are both free downloads from Microsoft. @@ -78,7 +78,7 @@ 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 2019, + Visual Studio 2022, 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 10 or @@ -89,8 +89,8 @@ Visual Studio 2013. Building with Visual Studio 2015 is supported down to Windows Vista and Windows Server 2008. - Building with Visual Studio 2017 and - Visual Studio 2019 is supported + Building with Visual Studio 2017 to + Visual Studio 2022 is supported down to Windows 7 SP1 and Windows Server 2008 R2 SP1. diff --git a/src/tools/msvc/MSBuildProject.pm b/src/tools/msvc/MSBuildProject.pm index 305b7f4ae7c..c8147e19b14 100644 --- a/src/tools/msvc/MSBuildProject.pm +++ b/src/tools/msvc/MSBuildProject.pm @@ -546,4 +546,29 @@ sub new return $self; } +package VC2022Project; + +# +# Package that encapsulates a Visual C++ 2022 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} = '17.00'; + $self->{PlatformToolset} = 'v143'; + $self->{ToolsVersion} = '17.0'; + + return $self; +} + 1; diff --git a/src/tools/msvc/README b/src/tools/msvc/README index c6db875730c..e8e14bddeac 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 - 2019. This builds the whole backend, not just +Microsoft Visual Studio 2005 - 2022. 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. @@ -92,13 +92,13 @@ 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 VS2005Solution, -a VS2008Solution, a VS2010Solution or a VS2012Solution or a VS2013Solution, -or a VS2015Solution or a VS2017Solution or a VS2019Solution, all in -Solution.pm, depending on the user's build environment) and adding objects +a VS2008Solution, a VS2010Solution, a VS2012Solution, a VS2013Solution, +a VS2015Solution, a VS2017Solution, a VS2019Solution or a VS2022Solution, 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. +VC2013Project or VC2015Project or VC2017Project or VC2019Project or +VC2022Project 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 374931047c4..4c6db26014d 100644 --- a/src/tools/msvc/Solution.pm +++ b/src/tools/msvc/Solution.pm @@ -1021,6 +1021,34 @@ sub new return $self; } +package VS2022Solution; + +# +# Package that encapsulates a Visual Studio 2022 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} = '17.00'; + $self->{visualStudioName} = 'Visual Studio 2022'; + $self->{VisualStudioVersion} = '17.0.31903.59'; + $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 f8f6b300eba..734a926d22d 100644 --- a/src/tools/msvc/VSObjectFactory.pm +++ b/src/tools/msvc/VSObjectFactory.pm @@ -73,6 +73,16 @@ sub CreateSolution { return new VS2019Solution(@_); } + + # The version of nmake bundled in Visual Studio 2022 is greater + # than 14.30 and less than 14.40. And the version number is + # actually 17.00. + elsif ( + ($visualStudioVersion ge '14.30' && $visualStudioVersion lt '14.40') + || $visualStudioVersion eq '17.00') + { + return new VS2022Solution(@_); + } else { croak @@ -133,6 +143,16 @@ sub CreateProject { return new VC2019Project(@_); } + + # The version of nmake bundled in Visual Studio 2022 is greater + # than 14.30 and less than 14.40. And the version number is + # actually 17.00. + elsif ( + ($visualStudioVersion ge '14.30' && $visualStudioVersion lt '14.40') + || $visualStudioVersion eq '17.00') + { + return new VC2022Project(@_); + } else { croak @@ -164,13 +184,13 @@ sub _GetVisualStudioVersion my ($major, $minor) = @_; # The major visual studio that is supported has nmake - # version <= 14.30, so stick with it as the latest version + # version <= 14.40, so stick with it as the latest version # if bumping on something even newer. - if ($major >= 14 && $minor >= 30) + if ($major >= 14 && $minor >= 40) { carp "The determined version of Visual Studio is newer than the latest supported version. Returning the latest supported version instead."; - return '14.20'; + return '14.30'; } elsif ($major < 6) {