diff --git a/doc/src/sgml/install-windows.sgml b/doc/src/sgml/install-windows.sgml index 74265fc172cf5353b7d9aa25cc295d43175c5336..4e92cc9eb4dde15ec84f52621a075838f085f5da 100644 --- a/doc/src/sgml/install-windows.sgml +++ b/doc/src/sgml/install-windows.sgml @@ -19,10 +19,10 @@ <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 2013 + Microsoft tools is to install <productname>Visual Studio Express 2015 for Windows Desktop</productname> and use the included compiler. It is also possible to build with the full - <productname>Microsoft Visual C++ 2005 to 2013</productname>. + <productname>Microsoft Visual C++ 2005 to 2015</productname>. In some cases that requires the installation of the <productname>Windows SDK</productname> in addition to the compiler. </para> @@ -77,19 +77,26 @@ <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 from <productname>Visual Studio Express 2013 + ways are to use the compilers from <productname>Visual Studio Express 2015 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 + Both 32-bit and 64-bit builds are possible with the Microsoft Compiler suite. + 32-bit PostgreSQL buils are possible with <productname>Visual Studio 2005</productname> to - <productname>Visual Studio 2013</productname> (including Express editions), + <productname>Visual Studio 2015</productname> (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 <productname>Microsoft Windows SDK</productname> version 6.0a to 7.1 or - <productname>Visual Studio 2008</productname> and above. + <productname>Visual Studio 2008</productname> and above. Compilation + is supported down to <productname>Windows XP</productname> and + <productname>Windows Server 2003</> when building with + <productname>Visual Studio 2005</> to + <productname>Visual Studio 2013</productname>. Building with + <productname>Visual Studio 2015</productname> is supported down to + <productname>Windows Vista</> and <productname>Windows Server 2008</>. </para> <para> @@ -210,9 +217,7 @@ $ENV{PATH}=$ENV{PATH} . ';c:\some\where\bison\bin'; Both <productname>Bison</productname> and <productname>Flex</productname> are included in the <productname>msys</productname> tool suite, available from <ulink url="http://www.mingw.org/wiki/MSYS"></> as part of the - <productname>MinGW</productname> compiler suite. You can also get - <productname>msys</productname> as part of - <productname>msysGit</productname> from <ulink url="http://git-scm.com/"></>. + <productname>MinGW</productname> compiler suite. </para> <para> @@ -221,9 +226,7 @@ $ENV{PATH}=$ENV{PATH} . ';c:\some\where\bison\bin'; PATH environment variable in <filename>buildenv.pl</filename> unless they are already in PATH. In the case of MinGW, the directory is the <filename>\msys\1.0\bin</filename> subdirectory of your MinGW - installation directory. For msysGit, it's the <filename>bin</filename> - directory in your Git install directory. Do not add the MinGW compiler - tools themselves to PATH. + installation directory. </para> <note> diff --git a/src/backend/port/win32/crashdump.c b/src/backend/port/win32/crashdump.c index ec7c325e4e95aafc2a809f5217676704ce3aa956..92e23cbf4be75986f61f5b925ca1f527d158e36e 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 <windows.h> #include <string.h> +/* + * 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 <dbghelp.h> +#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 5676d501229d96641d03ff357aad355c1b49fe6c..2927b60cc2d34f3b8870f2bbb1c53c3c41cdf4f1 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 bd2ad99c113cd842884dc96c5c9ca1033b214020..ddf818748b7acb7889d10a590e372197b3ffbd90 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 a551fdc9efaead2c4f1ce4f2f91e006b411e88bb..7a7d88a6cfc78fe97314dba37eaf56898ffe6f38 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 <windows.h> +#endif + #include <locale.h> #ifdef HAVE_LANGINFO_H #include <langinfo.h> @@ -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 <Language>_<Country>.<CodePage> 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 <Language>_<Country>.<CodePage> . 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]; + + memset(wctype, 0, sizeof(wctype)); + MultiByteToWideChar(CP_ACP, 0, ctype, -1, wctype, LOCALE_NAME_MAX_LENGTH); - codepage++; - ln = strlen(codepage); - r = malloc(ln + 3); + 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 <Language>_<Country>.<CodePage> . 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 7e4ff624820b91dfb228a6b293b9beecd50b3e74..d6b0ebe7e57ac0535fcbd1737bd195c1743218a8 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 3d60b64ec9cbf508468f57a918034a7c78e896f5..d7638b458ef954ac14dc3b2faf06a0aa75ce4b23 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 ac1ba0a9f74bd58552261e7b6eff6b32867481b7..43620c249fa4693e1e4d1aa08aa6ffb9626e33ae 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 fee4684b21dd785174f99dd00494390590c50381..4190ada618464805873b68bac36218ad6471a674 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) {