]> granicus.if.org Git - postgresql/commitdiff
Support building with Visual Studio 2015
authorAndrew Dunstan <andrew@dunslane.net>
Fri, 29 Apr 2016 11:59:47 +0000 (07:59 -0400)
committerAndrew Dunstan <andrew@dunslane.net>
Fri, 29 Apr 2016 12:09:07 +0000 (08:09 -0400)
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

doc/src/sgml/install-windows.sgml
src/backend/port/win32/crashdump.c
src/bin/pg_basebackup/pg_basebackup.c
src/include/port/win32.h
src/port/chklocale.c
src/port/win32env.c
src/tools/msvc/MSBuildProject.pm
src/tools/msvc/Solution.pm
src/tools/msvc/VSObjectFactory.pm

index 74265fc172cf5353b7d9aa25cc295d43175c5336..4e92cc9eb4dde15ec84f52621a075838f085f5da 100644 (file)
  <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>
   <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>
index ec7c325e4e95aafc2a809f5217676704ce3aa956..92e23cbf4be75986f61f5b925ca1f527d158e36e 100644 (file)
 #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,
index 5676d501229d96641d03ff357aad355c1b49fe6c..2927b60cc2d34f3b8870f2bbb1c53c3c41cdf4f1 100644 (file)
@@ -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"),
index bd2ad99c113cd842884dc96c5c9ca1033b214020..ddf818748b7acb7889d10a590e372197b3ffbd90 100644 (file)
@@ -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.
index a551fdc9efaead2c4f1ce4f2f91e006b411e88bb..7a7d88a6cfc78fe97314dba37eaf56898ffe6f38 100644 (file)
 #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
 
index 7e4ff624820b91dfb228a6b293b9beecd50b3e74..d6b0ebe7e57ac0535fcbd1737bd195c1743218a8 100644 (file)
@@ -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
                }
index 3d60b64ec9cbf508468f57a918034a7c78e896f5..d7638b458ef954ac14dc3b2faf06a0aa75ce4b23 100644 (file)
@@ -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;
index ac1ba0a9f74bd58552261e7b6eff6b32867481b7..43620c249fa4693e1e4d1aa08aa6ffb9626e33ae 100644 (file)
@@ -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) = @_;
index fee4684b21dd785174f99dd00494390590c50381..4190ada618464805873b68bac36218ad6471a674 100644 (file)
@@ -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)
        {