diff --git a/doc/src/sgml/install-windows.sgml b/doc/src/sgml/install-windows.sgml
index 74265fc..4e92cc9 100644
--- a/doc/src/sgml/install-windows.sgml
+++ b/doc/src/sgml/install-windows.sgml
@@ -19,10 +19,10 @@
There are several different ways of building PostgreSQL on
Windows. The simplest way to build with
- Microsoft tools is to install Visual Studio Express 2013
+ Microsoft tools is to install Visual Studio Express 2015
for Windows Desktop and use the included
compiler. It is also possible to build with the full
- Microsoft Visual C++ 2005 to 2013.
+ Microsoft Visual C++ 2005 to 2015.
In some cases that requires the installation of the
Windows SDK in addition to the compiler.
@@ -77,19 +77,26 @@
Visual Studio Express or some versions of the
Microsoft Windows SDK. If you do not already have a
Visual Studio environment set up, the easiest
- ways are to use the compilers from Visual Studio Express 2013
+ ways are to use the compilers from Visual Studio Express 2015
for Windows Desktop or those in the Windows SDK
7.1, which are both free downloads from Microsoft.
- PostgreSQL is known to support compilation using the compilers shipped with
+ Both 32-bit and 64-bit builds are possible with the Microsoft Compiler suite.
+ 32-bit PostgreSQL buils are possible with
Visual Studio 2005 to
- Visual Studio 2013 (including Express editions),
+ Visual Studio 2015 (including Express editions),
as well as standalone Windows SDK releases 6.0 to 7.1.
- 64-bit PostgreSQL builds are only supported with
+ 64-bit PostgreSQL builds are supported with
Microsoft Windows SDK version 6.0a to 7.1 or
- Visual Studio 2008 and above.
+ Visual Studio 2008 and above. Compilation
+ is supported down to Windows XP and
+ Windows Server 2003> when building with
+ Visual Studio 2005> to
+ Visual Studio 2013. Building with
+ Visual Studio 2015 is supported down to
+ Windows Vista> and Windows Server 2008>.
@@ -210,9 +217,7 @@ $ENV{PATH}=$ENV{PATH} . ';c:\some\where\bison\bin';
Both Bison and Flex
are included in the msys tool suite, available
from > as part of the
- MinGW compiler suite. You can also get
- msys as part of
- msysGit from >.
+ MinGW compiler suite.
@@ -221,9 +226,7 @@ $ENV{PATH}=$ENV{PATH} . ';c:\some\where\bison\bin';
PATH environment variable in buildenv.pl unless
they are already in PATH. In the case of MinGW, the directory is the
\msys\1.0\bin subdirectory of your MinGW
- installation directory. For msysGit, it's the bin
- directory in your Git install directory. Do not add the MinGW compiler
- tools themselves to PATH.
+ installation directory.
diff --git a/src/backend/port/win32/crashdump.c b/src/backend/port/win32/crashdump.c
index ec7c325..92e23cb 100644
--- a/src/backend/port/win32/crashdump.c
+++ b/src/backend/port/win32/crashdump.c
@@ -41,7 +41,21 @@
#define WIN32_LEAN_AND_MEAN
#include
#include
+/*
+ * Some versions of the MS SDK contain "typedef enum { ... } ;" which the MS
+ * compiler quite sanely complains about. Well done, Microsoft.
+ * This pragma disables the warning just while we include the header.
+ * The pragma is known to work with all (as at the time of writing) supported
+ * versions of MSVC.
+ */
+#ifdef _MSC_VER
+#pragma warning(push)
+#pragma warning(disable : 4091)
+#endif
#include
+#ifdef _MSC_VER
+#pragma warning(pop)
+#endif
/*
* Much of the following code is based on CodeProject and MSDN examples,
diff --git a/src/bin/pg_basebackup/pg_basebackup.c b/src/bin/pg_basebackup/pg_basebackup.c
index 5676d50..2927b60 100644
--- a/src/bin/pg_basebackup/pg_basebackup.c
+++ b/src/bin/pg_basebackup/pg_basebackup.c
@@ -1830,6 +1830,11 @@ BaseBackup(void)
int r;
#else
DWORD status;
+ /*
+ * get a pointer sized version of bgchild to avoid warnings about
+ * casting to a different size on WIN64.
+ */
+ intptr_t bgchild_handle = bgchild;
uint32 hi,
lo;
#endif
@@ -1892,7 +1897,7 @@ BaseBackup(void)
InterlockedIncrement(&has_xlogendptr);
/* First wait for the thread to exit */
- if (WaitForSingleObjectEx((HANDLE) bgchild, INFINITE, FALSE) !=
+ if (WaitForSingleObjectEx((HANDLE) bgchild_handle, INFINITE, FALSE) !=
WAIT_OBJECT_0)
{
_dosmaperr(GetLastError());
@@ -1900,7 +1905,7 @@ BaseBackup(void)
progname, strerror(errno));
disconnect_and_exit(1);
}
- if (GetExitCodeThread((HANDLE) bgchild, &status) == 0)
+ if (GetExitCodeThread((HANDLE) bgchild_handle, &status) == 0)
{
_dosmaperr(GetLastError());
fprintf(stderr, _("%s: could not get child thread exit status: %s\n"),
diff --git a/src/include/port/win32.h b/src/include/port/win32.h
index bd2ad99..ddf8187 100644
--- a/src/include/port/win32.h
+++ b/src/include/port/win32.h
@@ -6,14 +6,28 @@
/*
* Make sure _WIN32_WINNT has the minimum required value.
- * Leave a higher value in place.
-*/
-#if defined(_WIN32_WINNT) && _WIN32_WINNT < 0x0501
+ * Leave a higher value in place. When building with at least Visual
+ * Studio 2015 the minimum requirement is Windows Vista (0x0600) to
+ * get support for GetLocaleInfoEx() with locales. For everything else
+ * the minumum version is Windows XP (0x0501).
+ * Also for VS2015, add a define that stops compiler complaints about
+ * using the old Winsock API.
+ */
+#if defined(_MSC_VER) && _MSC_VER >= 1900
+#define _WINSOCK_DEPRECATED_NO_WARNINGS
+#define MIN_WINNT 0x0600
+#else
+#define MIN_WINNT 0x0501
+#endif
+
+#if defined(_WIN32_WINNT) && _WIN32_WINNT < MIN_WINNT
#undef _WIN32_WINNT
#endif
+
#ifndef _WIN32_WINNT
-#define _WIN32_WINNT 0x0501
+#define _WIN32_WINNT MIN_WINNT
#endif
+
/*
* Always build with SSPI support. Keep it as a #define in case
* we want a switch to disable it sometime in the future.
diff --git a/src/port/chklocale.c b/src/port/chklocale.c
index a551fdc..f6edf54 100644
--- a/src/port/chklocale.c
+++ b/src/port/chklocale.c
@@ -19,6 +19,10 @@
#include "postgres_fe.h"
#endif
+#if defined(WIN32) && (_MSC_VER >= 1900)
+#include
+#endif
+
#include
#ifdef HAVE_LANGINFO_H
#include
@@ -196,6 +200,16 @@ static const struct encoding_match encoding_match_list[] = {
* locale machinery determine the code page. See comments at IsoLocaleName().
* For other compilers, follow the locale's predictable format.
*
+ * Visual Studio 2015 should still be able to do the same, but the declaration
+ * of lc_codepage is missing in _locale_t, causing this code compilation to
+ * fail, hence this falls back instead on GetLocaleInfoEx. VS 2015 may be an
+ * exception and post-VS2015 versions should be able to handle properly the
+ * codepage number using _create_locale(). So, instead of the same logic as
+ * VS 2012 and VS 2013, this routine uses GetLocaleInfoEx to parse short
+ * locale names like "de-DE", "fr-FR", etc. If those cannot be parsed correctly
+ * process falls back to the pre-VS-2010 manual parsing done with
+ * using _. as a base.
+ *
* Returns a malloc()'d string for the caller to free.
*/
static char *
@@ -203,7 +217,7 @@ win32_langinfo(const char *ctype)
{
char *r = NULL;
-#if (_MSC_VER >= 1700)
+#if (_MSC_VER >= 1700) && (_MSC_VER < 1900)
_locale_t loct = NULL;
loct = _create_locale(LC_CTYPE, ctype);
@@ -217,6 +231,25 @@ win32_langinfo(const char *ctype)
#else
char *codepage;
+#if (_MSC_VER >= 1900)
+ uint32 cp;
+ WCHAR wctype[LOCALE_NAME_MAX_LENGTH];
+
+ memset(wctype, 0, sizeof(wctype));
+ MultiByteToWideChar(CP_ACP, 0, ctype, -1, wctype, LOCALE_NAME_MAX_LENGTH);
+
+ if (GetLocaleInfoEx(wctype,
+ LOCALE_IDEFAULTANSICODEPAGE | LOCALE_RETURN_NUMBER,
+ (LPWSTR) &cp, sizeof(cp) / sizeof(WCHAR)) > 0)
+ {
+ r = malloc(16); /* excess */
+ if (r != NULL)
+ sprintf(r, "CP%u", cp);
+ }
+ else
+ {
+#endif
+
/*
* Locale format on Win32 is _. . For
* example, English_United States.1252.
@@ -232,6 +265,10 @@ win32_langinfo(const char *ctype)
if (r != NULL)
sprintf(r, "CP%s", codepage);
}
+
+#if (_MSC_VER >= 1900)
+ }
+#endif
#endif
return r;
diff --git a/src/port/win32env.c b/src/port/win32env.c
index 7e4ff62..d6b0ebe 100644
--- a/src/port/win32env.c
+++ b/src/port/win32env.c
@@ -70,6 +70,9 @@ pgwin32_putenv(const char *envval)
"msvcr120", 0, NULL
}, /* Visual Studio 2013 */
{
+ "urctbase", 0, NULL
+ }, /* Visual Studio 2015 and later */
+ {
NULL, 0, NULL
}
};
diff --git a/src/tools/msvc/MSBuildProject.pm b/src/tools/msvc/MSBuildProject.pm
index 3d60b64..d7638b4 100644
--- a/src/tools/msvc/MSBuildProject.pm
+++ b/src/tools/msvc/MSBuildProject.pm
@@ -465,4 +465,27 @@ sub new
return $self;
}
+package VC2015Project;
+
+#
+# Package that encapsulates a Visual C++ 2015 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} = '14.00';
+ $self->{PlatformToolset} = 'v140';
+ $self->{ToolsVersion} = '14.0';
+
+ return $self;
+}
+
1;
diff --git a/src/tools/msvc/Solution.pm b/src/tools/msvc/Solution.pm
index ac1ba0a..43620c2 100644
--- a/src/tools/msvc/Solution.pm
+++ b/src/tools/msvc/Solution.pm
@@ -790,6 +790,32 @@ sub new
return $self;
}
+package VS2015Solution;
+
+#
+# Package that encapsulates a Visual Studio 2015 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} = '14.00';
+ $self->{visualStudioName} = 'Visual Studio 2015';
+ $self->{VisualStudioVersion} = '14.0.24730.2';
+ $self->{MinimumVisualStudioVersion} = '10.0.40219.1';
+
+ return $self;
+}
+
sub GetAdditionalHeaders
{
my ($self, $f) = @_;
diff --git a/src/tools/msvc/VSObjectFactory.pm b/src/tools/msvc/VSObjectFactory.pm
index fee4684..4190ada 100644
--- a/src/tools/msvc/VSObjectFactory.pm
+++ b/src/tools/msvc/VSObjectFactory.pm
@@ -49,6 +49,10 @@ sub CreateSolution
{
return new VS2013Solution(@_);
}
+ elsif ($visualStudioVersion eq '14.00')
+ {
+ return new VS2015Solution(@_);
+ }
else
{
croak "The requested Visual Studio version is not supported.";
@@ -84,6 +88,10 @@ sub CreateProject
{
return new VC2013Project(@_);
}
+ elsif ($visualStudioVersion eq '14.00')
+ {
+ return new VC2015Project(@_);
+ }
else
{
croak "The requested Visual Studio version is not supported.";
@@ -112,11 +120,11 @@ sub DetermineVisualStudioVersion
sub _GetVisualStudioVersion
{
my ($major, $minor) = @_;
- if ($major > 12)
+ if ($major > 14)
{
carp
"The determined version of Visual Studio is newer than the latest supported version. Returning the latest supported version instead.";
- return '12.00';
+ return '14.00';
}
elsif ($major < 6)
{