From a03649d32c9ab7bae44f4cc68042a76c07422bd9 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Mon, 11 Apr 2016 14:36:56 +0900 Subject: [PATCH] Support for VS 2015 This uses a private header in ucrt/corecrt.h to fetch correctly the locale codepage, which is not directly available in the headers of VS 2015. --- doc/src/sgml/install-windows.sgml | 8 ++++---- src/port/chklocale.c | 18 +++++++++++++++++- src/tools/msvc/MSBuildProject.pm | 23 +++++++++++++++++++++++ src/tools/msvc/Solution.pm | 26 ++++++++++++++++++++++++++ src/tools/msvc/VSObjectFactory.pm | 12 ++++++++++-- 5 files changed, 80 insertions(+), 7 deletions(-) diff --git a/doc/src/sgml/install-windows.sgml b/doc/src/sgml/install-windows.sgml index 9360383..a62aa49 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,7 +85,7 @@ 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 diff --git a/src/port/chklocale.c b/src/port/chklocale.c index a551fdc..094abd1 100644 --- a/src/port/chklocale.c +++ b/src/port/chklocale.c @@ -209,9 +209,25 @@ win32_langinfo(const char *ctype) loct = _create_locale(LC_CTYPE, ctype); if (loct != NULL) { + unsigned int lc_codepage; + +#if (_MSC_VER == 1900) + /* + * Visual Studio 2015 does not publish directly _lc_codepage, so this + * code would fail to compile but it is available via the in-core + * header ucrt/corecrt.h which is proving to work similarly to the + * post-Visual 2012 version equivalent of this code. + */ + __crt_locale_data_public *pub = + (__crt_locale_data_public *) loct->locinfo; + lc_codepage = pub->_locale_lc_codepage; +#else + lc_codepage = loct->locinfo->lc_codepage; +#endif + r = malloc(16); /* excess */ if (r != NULL) - sprintf(r, "CP%u", loct->locinfo->lc_codepage); + sprintf(r, "CP%u", lc_codepage); _free_locale(loct); } #else 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) { -- 2.8.1