Visual Studio 2013 build

Started by Brar Pieningabout 12 years ago4 messages
#1Brar Piening
brar@gmx.de
1 attachment(s)

Hackers,
the attached patch enables Microsoft Visual Studio 2013 as additional
build environment.
After some tweaking (VS now has got its own rint and a few macro
definitions that were previously missing) the build runs without errors
or warnings and the product passes the regression tests.
I didn't test any special configurations though.
I'm using full Visual Studio 2013 actually so I can't conform that
everything still works with Visual Studio Express 2013 for Windows
Desktop, but there are no documented limitations that make any problems
foreseeable.
I will add it to the CommitFest 2014-01 so that there is time for
testing and tweaking.

Regards,
Brar

Attachments:

VS2013_01.patchtext/plain; charset=windows-1252; name=VS2013_01.patchDownload
diff --git a/doc/src/sgml/install-windows.sgml b/doc/src/sgml/install-windows.sgml
index 4c9ce5b..c564166 100644
--- a/doc/src/sgml/install-windows.sgml
+++ b/doc/src/sgml/install-windows.sgml
@@ -19,12 +19,12 @@
  <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 Express 2012
+  Microsoft tools is to install <productname>Visual Studio Express 2013
   for Windows Desktop</productname> and use the included
   compiler. It is also possible to build with the full
-  <productname>Microsoft Visual C++ 2005, 2008 or 2010</productname>. In some cases
-  that requires the installation of the <productname>Windows SDK</productname>
-  in addition to the compiler.
+  <productname>Microsoft Visual C++ 2005 to 2013</productname>.
+  In some cases that requires the installation of the
+  <productname>Windows SDK</productname> in addition to the compiler.
  </para>
 
  <para>
@@ -77,15 +77,15 @@
   <productname>Visual Studio Express</productname> or some versions of the
   <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 in the <productname>Windows SDK 7.1</productname>
-  or those from <productname>Visual Studio Express 2012 for Windows
-  Desktop</productname>, which are both free downloads from Microsoft.
+  ways are to use the compilers from <productname>Visual Studio Express 2013
+  for Windows Desktop</productname> or those in the <productname>Windows SDK
+  7.1</productname>, which are both free downloads from Microsoft.
  </para>
 
  <para>
   PostgreSQL is known to support compilation using the compilers shipped with
   <productname>Visual Studio 2005</productname> to
-  <productname>Visual Studio 2012</productname> (including Express editions),
+  <productname>Visual Studio 2013</productname> (including Express editions),
   as well as standalone Windows SDK releases 6.0 to 7.1.
   64-bit PostgreSQL builds are only supported with
   <productname>Microsoft Windows SDK</productname> version 6.0a to 7.1 or
diff --git a/src/backend/utils/adt/float.c b/src/backend/utils/adt/float.c
index 54690bd..3df877d 100644
--- a/src/backend/utils/adt/float.c
+++ b/src/backend/utils/adt/float.c
@@ -111,6 +111,14 @@ get_float8_infinity(void)
 #endif
 }
 
+/*
+* The funny placements of the two #pragmas is necessary because of a
+* log lived bug in the Microsoft compilers.
+* See http://support.microsoft.com/kb/120968/en-us for details
+*/
+#if (_MSC_VER >= 1800)
+#pragma warning(disable:4756)
+#endif
 float
 get_float4_infinity(void)
 {
@@ -118,6 +126,9 @@ get_float4_infinity(void)
 	/* C99 standard way */
 	return (float) INFINITY;
 #else
+#if (_MSC_VER >= 1800)
+#pragma warning(default:4756)
+#endif
 
 	/*
 	 * On some platforms, HUGE_VAL is an infinity, elsewhere it's just the
diff --git a/src/bin/pg_ctl/pg_ctl.c b/src/bin/pg_ctl/pg_ctl.c
index 8399cdd..2c8a0e9 100644
--- a/src/bin/pg_ctl/pg_ctl.c
+++ b/src/bin/pg_ctl/pg_ctl.c
@@ -133,6 +133,12 @@ static void print_msg(const char *msg);
 static void adjust_data_dir(void);
 
 #if defined(WIN32) || defined(__CYGWIN__)
+#if (_MSC_VER >= 1800)
+#include <versionhelpers.h>
+#else
+static bool IsWindowsXPOrGreater(void);
+static bool IsWindows7OrGreater(void);
+#endif
 static bool pgwin32_IsInstalled(SC_HANDLE);
 static char *pgwin32_CommandLine(bool);
 static void pgwin32_doRegister(void);
@@ -1224,6 +1230,29 @@ do_kill(pgpid_t pid)
 
 #if defined(WIN32) || defined(__CYGWIN__)
 
+#if (_MSC_VER < 1800)
+static bool
+IsWindowsXPOrGreater(void)
+{
+	OSVERSIONINFO osv;
+	osv.dwOSVersionInfoSize = sizeof(osv);
+
+	 /* Windows XP = Version 5.1 */
+	return (!GetVersionEx(&osv) || /* could not get version */
+			osv.dwMajorVersion > 5 || (osv.dwMajorVersion == 5 && osv.dwMinorVersion >= 1));
+}
+
+static bool IsWindows7OrGreater(void)
+{
+	OSVERSIONINFO osv;
+	osv.dwOSVersionInfoSize = sizeof(osv);
+
+	 /* Windows 7 = Version 6.0 */
+	return (!GetVersionEx(&osv) || /* could not get version */
+			osv.dwMajorVersion > 6 || (osv.dwMajorVersion == 6 && osv.dwMinorVersion >= 0));
+}
+#endif
+
 static bool
 pgwin32_IsInstalled(SC_HANDLE hSCM)
 {
@@ -1653,12 +1682,7 @@ CreateRestrictedProcess(char *cmd, PROCESS_INFORMATION *processInfo, bool as_ser
 		 * IsProcessInJob() is not available on < WinXP, so there is no need
 		 * to log the error every time in that case
 		 */
-		OSVERSIONINFO osv;
-
-		osv.dwOSVersionInfoSize = sizeof(osv);
-		if (!GetVersionEx(&osv) ||		/* could not get version */
-			(osv.dwMajorVersion == 5 && osv.dwMinorVersion > 0) ||		/* 5.1=xp, 5.2=2003, etc */
-			osv.dwMajorVersion > 5)		/* anything newer should have the API */
+		if (IsWindowsXPOrGreater())
 
 			/*
 			 * Log error if we can't get version, or if we're on WinXP/2003 or
@@ -1690,7 +1714,6 @@ CreateRestrictedProcess(char *cmd, PROCESS_INFORMATION *processInfo, bool as_ser
 					JOBOBJECT_BASIC_LIMIT_INFORMATION basicLimit;
 					JOBOBJECT_BASIC_UI_RESTRICTIONS uiRestrictions;
 					JOBOBJECT_SECURITY_LIMIT_INFORMATION securityLimit;
-					OSVERSIONINFO osv;
 
 					ZeroMemory(&basicLimit, sizeof(basicLimit));
 					ZeroMemory(&uiRestrictions, sizeof(uiRestrictions));
@@ -1706,10 +1729,7 @@ CreateRestrictedProcess(char *cmd, PROCESS_INFORMATION *processInfo, bool as_ser
 
 					if (as_service)
 					{
-						osv.dwOSVersionInfoSize = sizeof(osv);
-						if (!GetVersionEx(&osv) ||
-							osv.dwMajorVersion < 6 ||
-						(osv.dwMajorVersion == 6 && osv.dwMinorVersion == 0))
+						if (!IsWindows7OrGreater())
 						{
 							/*
 							 * On Windows 7 (and presumably later),
diff --git a/src/include/pg_config.h.win32 b/src/include/pg_config.h.win32
index 54db287..5731e61 100644
--- a/src/include/pg_config.h.win32
+++ b/src/include/pg_config.h.win32
@@ -307,7 +307,10 @@
 /* #undef HAVE_READLINK */
 
 /* Define to 1 if you have the `rint' function. */
-/*#define HAVE_RINT 1*/
+#if (_MSC_VER >= 1800)
+#define HAVE_RINT 1
+#endif
+
 
 /* Define to 1 if you have the global variable
    'rl_completion_append_character'. */
diff --git a/src/include/port/win32.h b/src/include/port/win32.h
index 2c2d937..974807f 100644
--- a/src/include/port/win32.h
+++ b/src/include/port/win32.h
@@ -427,8 +427,10 @@ typedef unsigned short mode_t;
 #define W_OK 2
 #define R_OK 4
 
+#if (_MSC_VER < 1800)
 #define isinf(x) ((_fpclass(x) == _FPCLASS_PINF) || (_fpclass(x) == _FPCLASS_NINF))
 #define isnan(x) _isnan(x)
+#endif
 
 /* Pulled from Makefile.port in mingw */
 #define DLSUFFIX ".dll"
diff --git a/src/tools/msvc/MSBuildProject.pm b/src/tools/msvc/MSBuildProject.pm
index 217c47a..82337c8 100644
--- a/src/tools/msvc/MSBuildProject.pm
+++ b/src/tools/msvc/MSBuildProject.pm
@@ -18,6 +18,7 @@ sub _new
 	bless($self, $classname);
 
 	$self->{filenameExtension} = '.vcxproj';
+	$self->{ToolsVersion} = '4.0';
 
 	return $self;
 }
@@ -28,7 +29,7 @@ sub WriteHeader
 
 	print $f <<EOF;
 <?xml version="1.0" encoding="Windows-1252"?>
-<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+<Project DefaultTargets="Build" ToolsVersion="$self->{ToolsVersion}" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <ItemGroup Label="ProjectConfigurations">
 EOF
 	$self->WriteConfigurationHeader($f, 'Debug');
@@ -414,6 +415,7 @@ sub new
 	bless($self, $classname);
 
 	$self->{vcver} = '11.00';
+	$self->{PlatformToolset} = 'v110';
 
 	return $self;
 }
@@ -434,9 +436,32 @@ sub WriteConfigurationPropertyGroup
     <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
     <WholeProgramOptimization>$p->{wholeopt}</WholeProgramOptimization>
-    <PlatformToolset>v110</PlatformToolset>
+    <PlatformToolset>$self->{PlatformToolset}</PlatformToolset>
   </PropertyGroup>
 EOF
 }
 
+package VC2013Project;
+
+#
+# Package that encapsulates a Visual C++ 2013 project file
+#
+
+use strict;
+use warnings;
+use base qw(VC2012Project);
+
+sub new
+{
+	my $classname = shift;
+	my $self      = $classname->SUPER::_new(@_);
+	bless($self, $classname);
+
+	$self->{vcver} = '12.00';
+	$self->{PlatformToolset} = 'v120';
+	$self->{ToolsVersion} = '12.0';
+
+	return $self;
+}
+
 1;
diff --git a/src/tools/msvc/Mkvcbuild.pm b/src/tools/msvc/Mkvcbuild.pm
index bc7f449..29b8fa3 100644
--- a/src/tools/msvc/Mkvcbuild.pm
+++ b/src/tools/msvc/Mkvcbuild.pm
@@ -70,9 +70,13 @@ sub mkvcbuild
 	  erand48.c snprintf.c strlcat.c strlcpy.c dirmod.c noblock.c path.c
 	  pgcheckdir.c pg_crc.c pgmkdirp.c pgsleep.c pgstrcasecmp.c pqsignal.c
 	  qsort.c qsort_arg.c quotes.c
-	  sprompt.c tar.c thread.c getopt.c getopt_long.c dirent.c rint.c win32env.c
+	  sprompt.c tar.c thread.c getopt.c getopt_long.c dirent.c win32env.c
 	  win32error.c win32setlocale.c);
 
+	if ($vsVersion < '12.00') {
+		push(@pgportfiles, 'rint.c');
+	}
+
 	our @pgcommonallfiles = qw(
 	  exec.c pgfnames.c psprintf.c relpath.c rmtree.c wait_error.c);
 
diff --git a/src/tools/msvc/Solution.pm b/src/tools/msvc/Solution.pm
index bc52086..9c4e9f7 100644
--- a/src/tools/msvc/Solution.pm
+++ b/src/tools/msvc/Solution.pm
@@ -19,6 +19,8 @@ sub _new
 		options  => $options,
 		numver   => '',
 		strver   => '',
+		VisualStudioVersion => undef,
+		MinimumVisualStudioVersion => undef,
 		vcver    => undef,
 		platform => undef, };
 	bless($self, $classname);
@@ -59,6 +61,11 @@ sub _new
 	return $self;
 }
 
+sub GetAdditionalHeaders
+{
+	return '';
+}
+
 sub DeterminePlatform
 {
 	my $self = shift;
@@ -545,6 +552,8 @@ Microsoft Visual Studio Solution File, Format Version $self->{solutionFileVersio
 # $self->{visualStudioName}
 EOF
 
+	print SLN $self->GetAdditionalHeaders();
+
 	foreach my $fld (keys %{ $self->{projects} })
 	{
 		foreach my $proj (@{ $self->{projects}->{$fld} })
@@ -727,4 +736,39 @@ sub new
 	return $self;
 }
 
+package VS2013Solution;
+
+#
+# Package that encapsulates a Visual Studio 2013 solution file
+#
+
+use Carp;
+use strict;
+use warnings;
+use base qw(Solution);
+
+sub new
+{
+	my $classname = shift;
+	my $self      = $classname->SUPER::_new(@_);
+	bless($self, $classname);
+
+	$self->{solutionFileVersion}        = '12.00';
+	$self->{vcver}                      = '12.00';
+	$self->{visualStudioName}           = 'Visual Studio 2013';
+	$self->{VisualStudioVersion}        = '12.0.21005.1',
+	$self->{MinimumVisualStudioVersion} = '10.0.40219.1',
+
+	return $self;
+}
+
+sub GetAdditionalHeaders
+{
+	my ($self, $f) = @_;
+
+	return qq|VisualStudioVersion = $self->{VisualStudioVersion}
+MinimumVisualStudioVersion = $self->{MinimumVisualStudioVersion}
+|;
+}
+
 1;
diff --git a/src/tools/msvc/VSObjectFactory.pm b/src/tools/msvc/VSObjectFactory.pm
index 0fbf3fa..d255bec 100644
--- a/src/tools/msvc/VSObjectFactory.pm
+++ b/src/tools/msvc/VSObjectFactory.pm
@@ -45,6 +45,10 @@ sub CreateSolution
 	{
 		return new VS2012Solution(@_);
 	}
+	elsif ($visualStudioVersion eq '12.00')
+	{
+		return new VS2013Solution(@_);
+	}
 	else
 	{
 		croak "The requested Visual Studio version is not supported.";
@@ -76,6 +80,10 @@ sub CreateProject
 	{
 		return new VC2012Project(@_);
 	}
+	elsif ($visualStudioVersion eq '12.00')
+	{
+		return new VC2013Project(@_);
+	}
 	else
 	{
 		croak "The requested Visual Studio version is not supported.";
@@ -115,11 +123,11 @@ sub DetermineVisualStudioVersion
 sub _GetVisualStudioVersion
 {
 	my ($major, $minor) = @_;
-	if ($major > 11)
+	if ($major > 12)
 	{
 		carp
 "The determined version of Visual Studio is newer than the latest supported version. Returning the latest supported version instead.";
-		return '11.00';
+		return '12.00';
 	}
 	elsif ($major < 6)
 	{
#2Josh Berkus
josh@agliodbs.com
In reply to: Brar Piening (#1)
Re: Visual Studio 2013 build

On 12/02/2013 02:12 PM, Brar Piening wrote:

Hackers,
the attached patch enables Microsoft Visual Studio 2013 as additional
build environment.
After some tweaking (VS now has got its own rint and a few macro
definitions that were previously missing) the build runs without errors
or warnings and the product passes the regression tests.
I didn't test any special configurations though.
I'm using full Visual Studio 2013 actually so I can't conform that
everything still works with Visual Studio Express 2013 for Windows
Desktop, but there are no documented limitations that make any problems
foreseeable.
I will add it to the CommitFest 2014-01 so that there is time for
testing and tweaking.

Wow, thanks for doing this!

--
Josh Berkus
PostgreSQL Experts Inc.
http://pgexperts.com

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#3Andrew Dunstan
andrew@dunslane.net
In reply to: Brar Piening (#1)
Re: Visual Studio 2013 build

On 12/02/2013 05:12 PM, Brar Piening wrote:

Hackers,
the attached patch enables Microsoft Visual Studio 2013 as additional
build environment.
After some tweaking (VS now has got its own rint and a few macro
definitions that were previously missing) the build runs without
errors or warnings and the product passes the regression tests.
I didn't test any special configurations though.
I'm using full Visual Studio 2013 actually so I can't conform that
everything still works with Visual Studio Express 2013 for Windows
Desktop, but there are no documented limitations that make any
problems foreseeable.
I will add it to the CommitFest 2014-01 so that there is time for
testing and tweaking.

OK, I have tested this out with the development branch and Visual Studio
Express 2013 for Windows Desktop, on Windows Server 2008 R2-SP1 64 bit.
With a slight adjustment to make the patch apply it works fine.

How far back should we go? About a year ago when we did this we applied
it for 9.2 (then the latest stable release) and 9.3dev.

cheers

andrew

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#4Magnus Hagander
magnus@hagander.net
In reply to: Andrew Dunstan (#3)
Re: Visual Studio 2013 build

On Sun, Jan 26, 2014 at 1:13 AM, Andrew Dunstan <andrew@dunslane.net> wrote:

On 12/02/2013 05:12 PM, Brar Piening wrote:

Hackers,
the attached patch enables Microsoft Visual Studio 2013 as additional
build environment.
After some tweaking (VS now has got its own rint and a few macro
definitions that were previously missing) the build runs without errors or
warnings and the product passes the regression tests.
I didn't test any special configurations though.
I'm using full Visual Studio 2013 actually so I can't conform that
everything still works with Visual Studio Express 2013 for Windows
Desktop, but there are no documented limitations that make any problems
foreseeable.
I will add it to the CommitFest 2014-01 so that there is time for testing
and tweaking.

OK, I have tested this out with the development branch and Visual Studio
Express 2013 for Windows Desktop, on Windows Server 2008 R2-SP1 64 bit.
With a slight adjustment to make the patch apply it works fine.

How far back should we go? About a year ago when we did this we applied it
for 9.2 (then the latest stable release) and 9.3dev.

Seems reasonable to follow the same pattern, and apply it for 9.3 stable
and 9.4dev. The argument being that it's a new build env, and it's not
likely that people are going to use that t o build very old versions of
postgres.

--
Magnus Hagander
Me: http://www.hagander.net/
Work: http://www.redpill-linpro.com/