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)
{