Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Add support for Visual Studio 2022 in build scripts
authorMichael Paquier <michael@paquier.xyz>
Wed, 24 Nov 2021 04:03:59 +0000 (13:03 +0900)
committerMichael Paquier <michael@paquier.xyz>
Wed, 24 Nov 2021 04:03:59 +0000 (13:03 +0900)
Documentation and any code paths related to VS are updated to keep the
whole consistent.  Similarly to 2017 and 2019, the version of VS and the
version of nmake that we use to determine which code paths to use for
the build are still inconsistent in their own way.

Backpatch down to 10, so as buildfarm members are able to use this new
version of Visual Studio on all the stable branches supported.

Author: Hans Buschmann
Discussion: https://postgr.es/m/1633101364685.39218@nidsa.net
Backpatch-through: 10

doc/src/sgml/install-windows.sgml
src/tools/msvc/MSBuildProject.pm
src/tools/msvc/README
src/tools/msvc/Solution.pm
src/tools/msvc/VSObjectFactory.pm

index 11f5957aca5b26f33611fc7d3c973a86e1e78e16..34eb42d8d0d2813341e54adeb9a8ffd7d605a64e 100644 (file)
@@ -19,9 +19,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 2019</productname>
+  Microsoft tools is to install <productname>Visual Studio 2022</productname>
   and use the included compiler. It is also possible to build with the full
-  <productname>Microsoft Visual C++ 2013 to 2019</productname>.
+  <productname>Microsoft Visual C++ 2013 to 2022</productname>.
   In some cases that requires the installation of the
   <productname>Windows SDK</productname> in addition to the compiler.
  </para>
@@ -68,7 +68,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 2019</productname> or those in the
+  <productname>Visual Studio 2022</productname> or those in the
   <productname>Windows SDK 10</productname>, which are both free downloads
   from Microsoft.
  </para>
@@ -77,7 +77,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 2019</productname>,
+  <productname>Visual Studio 2022</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
@@ -85,7 +85,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 2019</productname>.
+  <productname>Visual Studio 2022</productname>.
    <!--
        For 2013 requirements:
        https://docs.microsoft.com/en-us/visualstudio/productinfo/vs2013-sysrequirements-vs
@@ -95,6 +95,8 @@
        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
+       For 2022 requirements:
+       https://docs.microsoft.com/en-us/visualstudio/releases/2022/system-requirements
    -->
  </para>
 
index ebb169e20120272ff1a246452d2600d04e681f00..22a3868c60b8ecf495521f3a27fea84d21ce5891 100644 (file)
@@ -505,4 +505,29 @@ sub new
    return $self;
 }
 
+package VC2022Project;
+
+#
+# Package that encapsulates a Visual C++ 2022 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}           = '17.00';
+   $self->{PlatformToolset} = 'v143';
+   $self->{ToolsVersion}    = '17.0';
+
+   return $self;
+}
+
 1;
index d22fff331d67c752249561a84058f3627d6ea795..9039f0cd27161b7473183b6d5cf0364d6ada921f 100644 (file)
@@ -4,7 +4,7 @@ MSVC build
 ==========
 
 This directory contains the tools required to build PostgreSQL using
-Microsoft Visual Studio 2013 - 2019. This builds the whole backend, not just
+Microsoft Visual Studio 2013 - 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.
 
@@ -89,11 +89,11 @@ 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 or VS2019Solution, all in Solution.pm,
-depending on the user's build environment) and adding objects implementing
-the corresponding Project interface (VC2013Project, VC2015Project,
-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.
+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
+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.
index cf8b24f069087db62de0ad0becf5a211a990c62e..3c100f858c7160e2c7d70d7c257395aa61fe2fbd 100644 (file)
@@ -1292,6 +1292,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) = @_;
index 541254006128a20474b8e66701f3e2e1f0860454..c0b402828f9fb92907b237c5d575a217e9950aaf 100644 (file)
@@ -58,6 +58,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
@@ -102,6 +112,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
@@ -131,7 +151,7 @@ sub DetermineVisualStudioVersion
    else
    {
        # fake version
-       return '16.00';
+       return '17.00';
    }
 }
 
@@ -140,13 +160,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 < 12)
    {