Greetings, Peter E pinged me recently about the need to upgrade drongo because he was planning to commit some stuff that would break on VS 2019. I chose to update it to VS2026, and this promptly broke on the old branches. I've hacked its config for now to use the older setup for 14 and 15, but that's not very principled - and buildfarm members are supposed to use the same compiler for all branches. If anyone wants to set up a buildfarm animal now they will have to choose between using an older compiler (VS2022) and not supporting all the live branches. So here's a patch (which I have tested) that adds support for VS2026 on those old branches, pretty much in line with what we've done before. With any luck, Microsoft won't come out with another release until after the date our release 15 goes EOL, at which point we will be done with this kabuki dance.
cheers andrew
From: Andrew Dunstan <[email protected]> Date: Mon, 6 Jul 2026 00:00:00 +0000 Subject: [PATCH] Add support for Visual Studio 2026 in pre-17 build scripts Documentation and any code paths related to VS are updated to keep the whole consistent. Similarly to 2017, 2019 and 2022. --- doc/src/sgml/install-windows.sgml | 12 +++++++----- src/tools/msvc/MSBuildProject.pm | 25 +++++++++++++++++++++++++ src/tools/msvc/README | 13 +++++++------ src/tools/msvc/Solution.pm | 28 ++++++++++++++++++++++++++++ src/tools/msvc/VSObjectFactory.pm | 36 ++++++++++++++++++++++++++++-------- 5 files changed, 95 insertions(+), 19 deletions(-) diff --git a/doc/src/sgml/install-windows.sgml b/doc/src/sgml/install-windows.sgml index a3f12a1f826..8b4ae42e8be 100644 --- a/doc/src/sgml/install-windows.sgml +++ b/doc/src/sgml/install-windows.sgml @@ -20,9 +20,9 @@ <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 2022</productname> + Microsoft tools is to install <productname>Visual Studio 2026</productname> and use the included compiler. It is also possible to build with the full - <productname>Microsoft Visual C++ 2013 to 2022</productname>. + <productname>Microsoft Visual C++ 2013 to 2026</productname>. In some cases that requires the installation of the <productname>Windows SDK</productname> in addition to the compiler. </para> @@ -69,7 +69,7 @@ <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 2022</productname> or those in the + <productname>Visual Studio 2026</productname> or those in the <productname>Windows SDK 10</productname>, which are both free downloads from Microsoft. </para> @@ -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 <productname>Visual Studio 2013</productname> to - <productname>Visual Studio 2022</productname>, + <productname>Visual Studio 2026</productname>, as well as standalone Windows SDK releases 8.1a to 10. 64-bit PostgreSQL builds are supported with <productname>Microsoft Windows SDK</productname> version 8.1a to 10 or @@ -86,7 +86,7 @@ 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 2022</productname>. + <productname>Visual Studio 2026</productname>. <!-- For 2013 requirements: https://docs.microsoft.com/en-us/visualstudio/productinfo/vs2013-sysrequirements-vs @@ -98,6 +98,8 @@ https://docs.microsoft.com/en-us/visualstudio/releases/2019/system-requirements For 2022 requirements: https://docs.microsoft.com/en-us/visualstudio/releases/2022/system-requirements + For 2026 requirements: + https://docs.microsoft.com/en-us/visualstudio/releases/2026/system-requirements --> </para> diff --git a/src/tools/msvc/MSBuildProject.pm b/src/tools/msvc/MSBuildProject.pm index 33595cce0fc..0fed480b1d6 100644 --- a/src/tools/msvc/MSBuildProject.pm +++ b/src/tools/msvc/MSBuildProject.pm @@ -533,4 +533,29 @@ sub new return $self; } +package VC2026Project; + +# +# Package that encapsulates a Visual C++ 2026 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} = '18.00'; + $self->{PlatformToolset} = 'v145'; + $self->{ToolsVersion} = '18.0'; + + return $self; +} + 1; diff --git a/src/tools/msvc/README b/src/tools/msvc/README index 473d6f425b2..a42de4b10fb 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 - 2022. This builds the whole backend, not just +Microsoft Visual Studio 2013 - 2026. 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,11 +89,12 @@ 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 VS2013Solution, -VS2015Solution, VS2017Solution, VS2019Solution or VS2022Solution, all in -Solution.pm, depending on the user's build environment) and adding objects -implementing the corresponding Project interface (VC2013Project, -VC2015Project, VC2017Project, VC2019Project or VC2022Project from -MSBuildProject.pm) to it. When Solution::Save is called, the implementations +VS2015Solution, VS2017Solution, VS2019Solution, VS2022Solution or +VS2026Solution, all in Solution.pm, depending on the user's build +environment) and adding objects implementing the corresponding Project +interface (VC2013Project, VC2015Project, VC2017Project, VC2019Project, +VC2022Project or VC2026Project 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 performed in build.pl again. diff --git a/src/tools/msvc/Solution.pm b/src/tools/msvc/Solution.pm index 65e7992c21f..f699a76af5c 100644 --- a/src/tools/msvc/Solution.pm +++ b/src/tools/msvc/Solution.pm @@ -1357,6 +1357,34 @@ sub new return $self; } +package VS2026Solution; + +# +# Package that encapsulates a Visual Studio 2026 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} = '18.00'; + $self->{visualStudioName} = 'Visual Studio 2026'; + $self->{VisualStudioVersion} = '18.7.11925.98'; + $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 a865604a5a1..e0c7ee3e086 100644 --- a/src/tools/msvc/VSObjectFactory.pm +++ b/src/tools/msvc/VSObjectFactory.pm @@ -63,14 +63,24 @@ sub CreateSolution } # The version of nmake bundled in Visual Studio 2022 is greater - # than 14.30 and less than 14.40. And the version number is + # than 14.30 and less than 14.50. And the version number is # actually 17.00. elsif ( - ($visualStudioVersion ge '14.30' && $visualStudioVersion lt '14.40') + ($visualStudioVersion ge '14.30' && $visualStudioVersion lt '14.50') || $visualStudioVersion eq '17.00') { return new VS2022Solution(@_); } + + # The version of nmake bundled in Visual Studio 2026 is greater + # than 14.50 and less than 14.60. And the version number is + # actually 18.00. + elsif ( + ($visualStudioVersion ge '14.50' && $visualStudioVersion lt '14.60') + || $visualStudioVersion eq '18.00') + { + return new VS2026Solution(@_); + } else { croak @@ -117,14 +127,24 @@ sub CreateProject } # The version of nmake bundled in Visual Studio 2022 is greater - # than 14.30 and less than 14.40. And the version number is + # than 14.30 and less than 14.50. And the version number is # actually 17.00. elsif ( - ($visualStudioVersion ge '14.30' && $visualStudioVersion lt '14.40') + ($visualStudioVersion ge '14.30' && $visualStudioVersion lt '14.50') || $visualStudioVersion eq '17.00') { return new VC2022Project(@_); } + + # The version of nmake bundled in Visual Studio 2026 is greater + # than 14.50 and less than 14.60. And the version number is + # actually 18.00. + elsif ( + ($visualStudioVersion ge '14.50' && $visualStudioVersion lt '14.60') + || $visualStudioVersion eq '18.00') + { + return new VC2026Project(@_); + } else { croak @@ -154,7 +174,7 @@ sub DetermineVisualStudioVersion else { # fake version - return '17.00'; + return '18.00'; } } @@ -163,13 +183,13 @@ sub _GetVisualStudioVersion my ($major, $minor) = @_; # The major visual studio that is supported has nmake - # version <= 14.40, so stick with it as the latest version + # version <= 14.60, so stick with it as the latest version # if bumping on something even newer. - if ($major >= 14 && $minor >= 40) + if ($major >= 14 && $minor >= 60) { carp "The determined version of Visual Studio is newer than the latest supported version. Returning the latest supported version instead."; - return '14.30'; + return '14.50'; } elsif ($major < 12) { -- 2.43.0
