diff --git a/doc/src/sgml/install-windows.sgml b/doc/src/sgml/install-windows.sgml index f3b1a12b05f429e325e11a43c2bac1a5dcc4606d..28933b6cf55a65400a2ce34ef344fb348fde220f 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 e2a0812d194cf2ef3b2eac53f66da786500090c7..774267ed5d25fd77f8716c630c53eeecba8342f2 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 +* 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 diff --git a/src/bin/pg_ctl/pg_ctl.c b/src/bin/pg_ctl/pg_ctl.c index 74b23a4ab56f275dc9ce5245cf3bcdfe4bbff429..8a4a9193bf8ee5ace432d34fdf97ee57be50a483 100644 --- a/src/bin/pg_ctl/pg_ctl.c +++ b/src/bin/pg_ctl/pg_ctl.c @@ -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), diff --git a/src/include/pg_config.h.win32 b/src/include/pg_config.h.win32 index 19ef4c1a9fb2e7967797f0882d4784433d7bbf00..006b999a1a0059668aa0d0bbcd9c2ae461919488 100644 --- a/src/include/pg_config.h.win32 +++ b/src/include/pg_config.h.win32 @@ -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'. */ diff --git a/src/include/port/win32.h b/src/include/port/win32.h index 2c2d93765ee3bffdc7d5e3527be29e1c4a882fd1..974807f5841056ed03ce38ff13dfc3daca6c3ff0 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 217c47ab78a1e73aaf27371e2e707f2f5a65e5a5..82337c81744453c095b4ed36ddd2ed947b023bf0 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 a8324ff7b20ff2f96a47c9c057e5c9d2df7401d8..308a4b47b998f1416c270afa843fa1568ab86bff 100644 --- a/src/tools/msvc/Mkvcbuild.pm +++ b/src/tools/msvc/Mkvcbuild.pm @@ -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); diff --git a/src/tools/msvc/Solution.pm b/src/tools/msvc/Solution.pm index 3a173a6a0201385fc8b1b6d2cfb13991912294ab..95c6bcbc1bd5e43ec3c5aea0d0226584c736299c 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; @@ -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; diff --git a/src/tools/msvc/VSObjectFactory.pm b/src/tools/msvc/VSObjectFactory.pm index 0fbf3faa0eddc7dce5d70d58f42fc5e7bc7b479d..d255becfe8b9751cd0ebe99b990e0cd6a2b9fe38 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) {