mirror of
https://github.com/postgres/postgres.git
synced 2025-07-30 11:03:19 +03:00
Support building with Visual Studio 2015
Adjust the way we detect the locale. As a result the minumum Windows version supported by VS2015 and later is Windows Vista. Add some tweaks to remove new compiler warnings. Remove documentation references to the now obsolete msysGit. Michael Paquier, somewhat edited by me, reviewed by Christian Ullrich. Backpatch to 9.5
This commit is contained in:
@ -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,
|
||||
|
@ -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"),
|
||||
|
@ -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.
|
||||
|
@ -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];
|
||||
|
||||
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 <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
|
||||
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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) = @_;
|
||||
|
@ -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)
|
||||
{
|
||||
|
Reference in New Issue
Block a user