Enable building with Visual Studion 2013.

Backpatch to 9.3.

Brar Piening.
This commit is contained in:
Andrew Dunstan 2014-01-26 09:49:10 -05:00
parent 00ba97365d
commit cec8394b5c
9 changed files with 140 additions and 25 deletions

View File

@ -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

View File

@ -111,6 +111,14 @@ get_float8_infinity(void)
#endif
}
/*
* The funny placements of the two #pragmas is necessary because of a
* long 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

View File

@ -135,6 +135,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);
@ -1226,6 +1232,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)
{
@ -1655,12 +1684,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
@ -1692,7 +1716,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));
@ -1708,10 +1731,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),

View File

@ -295,7 +295,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'. */

View File

@ -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"

View File

@ -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;

View File

@ -70,9 +70,11 @@ 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
sprompt.c tar.c thread.c getopt.c getopt_long.c dirent.c
win32env.c win32error.c win32setlocale.c);
push(@pgportfiles, 'rint.c') if ($vsVersion < '12.00');
our @pgcommonallfiles = qw(
exec.c pgfnames.c psprintf.c relpath.c rmtree.c username.c wait_error.c);

View File

@ -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;
@ -541,6 +548,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} })
@ -723,4 +732,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;

View File

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