diff --git a/doc/src/sgml/install-windows.sgml b/doc/src/sgml/install-windows.sgml index 9360383..bda19a3 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,7 +77,7 @@ 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. @@ -85,11 +85,17 @@ PostgreSQL is known to support compilation using the compilers shipped 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 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. diff --git a/src/include/port/win32.h b/src/include/port/win32.h index 69cd1c4..163ac5e 100644 --- a/src/include/port/win32.h +++ b/src/include/port/win32.h @@ -6,14 +6,21 @@ /* * Make sure _WIN32_WINNT has the minimum required value. - * Leave a higher value in place. -*/ + * 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. + */ #if defined(_WIN32_WINNT) && _WIN32_WINNT < 0x0501 #undef _WIN32_WINNT #endif #ifndef _WIN32_WINNT +#if (_MSC_VER >= 1900) +#define _WIN32_WINNT 0x0600 +#else #define _WIN32_WINNT 0x0501 #endif +#endif /* _WIN32_WINNT */ + /* * 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..59a6415 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[80]; + + memset(wctype, 0, 80 * sizeof(WCHAR)); + MultiByteToWideChar(CP_ACP, 0, ctype, -1, wctype, 80); + + 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/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..2b21bf0 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} = '14.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) {