diff --git a/doc/src/sgml/install-windows.sgml b/doc/src/sgml/install-windows.sgml index ba60a6b16b4..53ad554f28f 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 1e90baf8c10..e970e6d7838 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 7e961743ebc..86e18f6e61b 100644 --- a/src/bin/pg_basebackup/pg_basebackup.c +++ b/src/bin/pg_basebackup/pg_basebackup.c @@ -1812,6 +1812,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 @@ -1874,7 +1879,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()); @@ -1882,7 +1887,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 cadba2b56ff..f9a9be1d1a1 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 6d716c19110..7a3e3af74d1 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,20 +231,41 @@ win32_langinfo(const char *ctype) #else char *codepage; - /* - * Locale format on Win32 is _. . For - * example, English_United States.1252. - */ - codepage = strrchr(ctype, '.'); - if (codepage != NULL) - { - int ln; +#if (_MSC_VER >= 1900) + uint32 cp; + WCHAR wctype[LOCALE_NAME_MAX_LENGTH]; - codepage++; - ln = strlen(codepage); - r = malloc(ln + 3); + 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%s", codepage); + sprintf(r, "CP%u", cp); + } + else +#endif + { + + /* + * Locale format on Win32 is _. . For + * example, English_United States.1252. + */ + codepage = strrchr(ctype, '.'); + if (codepage != NULL) + { + int ln; + + codepage++; + ln = strlen(codepage); + r = malloc(ln + 3); + if (r != NULL) + sprintf(r, "CP%s", codepage); + } + } #endif diff --git a/src/port/win32env.c b/src/port/win32env.c index bf1203f862c..dfe4c912030 100644 --- a/src/port/win32env.c +++ b/src/port/win32env.c @@ -69,6 +69,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 3d60b64ec9c..d7638b458ef 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 974590a9a48..7cae0beb15a 100644 --- a/src/tools/msvc/Solution.pm +++ b/src/tools/msvc/Solution.pm @@ -763,6 +763,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 fee4684b21d..4190ada6184 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) {