pg.ddx.io  pgsql-hackers@postgresql.org mailing list archive  
help / color / mirror / Atom feed
From: Hans Buschmann <buschmann@nidsa.net>
To: pgsql-hackers@postgresql.org <pgsql-hackers@postgresql.org>
Subject: VS2022: Support Visual Studio 2022 on Windows
Date: Fri, 1 Oct 2021 15:15:59 +0000
Message-ID: <1633101364685.39218@nidsa.net> (raw)


During testing of the new Visual Studio 2022 Preview Version 4.1 from Microsoft I also tried PG14.0 on it.

The x64 version built without error!.

Even when this is only a preview version (the real thing is to expected soon) it seems appropriate to include the support to Postgres msvc tools directory.

I followed the guideline of the patch msvc-2019-support-v4.patch for VS2019 support. New patch attached.

The only thing that will change later in the first non-preview release is the exact version number, which seems to change allways on every minor VS upgrade and is not used explicitely:

$self->{VisualStudioVersion}        = '17.0.31717.71';

The patch is not invasive, so it should follow the practice of backpatching it to (most) supported versions.

I have tested the x64 compile and install with the release source code of PG14.0 from 2021-09-30.

Due to bad development environment I did not a full run of all tests afterwords.


Visual Studio is co-installable to an already existing VS version on the same machine (I had VS2019 installed) and is separately choosable as compile environment.

Compilation time and file sizes are almost identical, but the GUI promises a native 64bit implementation, so it may appealing to use the new version.

HELP NEEDED:

Please could somebody test the patch and enter it to the next commit fest?
(Only my second patch, not much experience with the tool chain :-( )

Another point is the failure of using VS2019/VS2022 for building the 32bit version, but this has to be discussed in another thread (if the Windows 32bit Version is still important to support on newer VS Versions)

Thanks for looking at it

Hans Buschmann

=

Attachments:

  [application/octet-stream] 0001_support_vs2022.patch (7.7K, ../1633101364685.39218@nidsa.net/2-0001_support_vs2022.patch)
  download | inline diff:
diff --git a/postgresql-14.0_orig/doc/src/sgml/install-windows.sgml b/postgresql-14.0_vs2022/doc/src/sgml/install-windows.sgml
index 312edc6..940836a 100644
--- a/postgresql-14.0_orig/doc/src/sgml/install-windows.sgml
+++ b/postgresql-14.0_vs2022/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 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>
@@ -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 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>
@@ -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 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
@@ -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 2019</productname>.
+  <productname>Visual Studio 2022</productname>.
    <!--
        For 2013 requirements:
        https://docs.microsoft.com/en-us/visualstudio/productinfo/vs2013-sysrequirements-vs
@@ -96,6 +96,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>
 
diff --git a/postgresql-14.0_orig/src/tools/msvc/MSBuildProject.pm b/postgresql-14.0_vs2022/src/tools/msvc/MSBuildProject.pm
index ebe6530..52f8ec2 100644
--- a/postgresql-14.0_orig/src/tools/msvc/MSBuildProject.pm
+++ b/postgresql-14.0_vs2022/src/tools/msvc/MSBuildProject.pm
@@ -508,4 +508,30 @@ 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;
diff --git a/postgresql-14.0_orig/src/tools/msvc/README b/postgresql-14.0_vs2022/src/tools/msvc/README
index f154759..34ea4d5 100644
--- a/postgresql-14.0_orig/src/tools/msvc/README
+++ b/postgresql-14.0_vs2022/src/tools/msvc/README
@@ -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,10 +89,10 @@ 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,
+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 or VC2019Project from MSBuildProject.pm) to it.
+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
diff --git a/postgresql-14.0_orig/src/tools/msvc/Solution.pm b/postgresql-14.0_vs2022/src/tools/msvc/Solution.pm
index cfda5ac..a95754d 100644
--- a/postgresql-14.0_orig/src/tools/msvc/Solution.pm
+++ b/postgresql-14.0_vs2022/src/tools/msvc/Solution.pm
@@ -1315,6 +1315,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.31717.71';
+	$self->{MinimumVisualStudioVersion} = '10.0.40219.1';
+
+	return $self;
+}
+
 sub GetAdditionalHeaders
 {
 	my ($self, $f) = @_;
diff --git a/postgresql-14.0_orig/src/tools/msvc/VSObjectFactory.pm b/postgresql-14.0_vs2022/src/tools/msvc/VSObjectFactory.pm
index 61e83f5..f78e08c 100644
--- a/postgresql-14.0_orig/src/tools/msvc/VSObjectFactory.pm
+++ b/postgresql-14.0_vs2022/src/tools/msvc/VSObjectFactory.pm
@@ -61,6 +61,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
@@ -105,6 +115,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
@@ -134,7 +154,7 @@ sub DetermineVisualStudioVersion
 	else
 	{
 		# fake version
-		return '16.00';
+		return '17.00';
 	}
 }
 
@@ -143,13 +163,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)
 	{


view thread (10+ messages)  latest in thread

Message-ID: <1633101364685.39218@nidsa.net>
Permalink:  ../1633101364685.39218@nidsa.net/
Also on:    postgresql.org/message-id/1633101364685.39218@nidsa.net

 ·  · 

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: pgsql-hackers@postgresql.org
  Cc: buschmann@nidsa.net
  Subject: Re: VS2022: Support Visual Studio 2022 on Windows
  In-Reply-To: <1633101364685.39218@nidsa.net>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox