mirror of https://github.com/postgres/postgres
Enable building with Visual Studion 2013.
Backpatch to 9.3. Brar Piening.
This commit is contained in:
parent
00ba97365d
commit
cec8394b5c
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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'. */
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue