summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Dunstan2011-01-31 00:56:46 +0000
committerAndrew Dunstan2011-01-31 00:56:46 +0000
commit91812df4ed0facfb90bec3f9430dd5a97d56f695 (patch)
tree09e3d6d3f5ee3cfe1e4884b373b1271574153ad6
parent9688c4e6f1516d2fc0db5d200112c4d91538878d (diff)
Enable building with the Mingw64 compiler.
This can be used to build 64 bit Windows binaries, not only on 64 bit Windows but on supported cross-compiling hosts including 32 bit Windows, Cygwin, Darwin and Linux.
-rw-r--r--config/ac_func_accept_argtypes.m45
-rwxr-xr-xconfigure4
-rw-r--r--src/include/c.h2
-rw-r--r--src/include/port.h4
-rw-r--r--src/include/port/win32.h18
-rw-r--r--src/include/port/win32/sys/socket.h1
-rw-r--r--src/port/getaddrinfo.c3
-rw-r--r--src/test/regress/resultmap3
8 files changed, 32 insertions, 8 deletions
diff --git a/config/ac_func_accept_argtypes.m4 b/config/ac_func_accept_argtypes.m4
index 7cb5cb37767..1e7717922d5 100644
--- a/config/ac_func_accept_argtypes.m4
+++ b/config/ac_func_accept_argtypes.m4
@@ -38,6 +38,7 @@ dnl
# 'int' as the result, because that ought to work best.
#
# On Win32, accept() returns 'unsigned int PASCAL'
+# Win64 uses SOCKET for return and arg1
AC_DEFUN([AC_FUNC_ACCEPT_ARGTYPES],
[AC_MSG_CHECKING([types of arguments for accept()])
@@ -45,8 +46,8 @@ AC_DEFUN([AC_FUNC_ACCEPT_ARGTYPES],
[AC_CACHE_VAL(ac_cv_func_accept_arg1,dnl
[AC_CACHE_VAL(ac_cv_func_accept_arg2,dnl
[AC_CACHE_VAL(ac_cv_func_accept_arg3,dnl
- [for ac_cv_func_accept_return in 'int' 'unsigned int PASCAL'; do
- for ac_cv_func_accept_arg1 in 'int' 'unsigned int'; do
+ [for ac_cv_func_accept_return in 'int' 'unsigned int PASCAL' 'SOCKET'; do
+ for ac_cv_func_accept_arg1 in 'int' 'unsigned int' 'SOCKET'; do
for ac_cv_func_accept_arg2 in 'struct sockaddr *' 'const struct sockaddr *' 'void *'; do
for ac_cv_func_accept_arg3 in 'int' 'size_t' 'socklen_t' 'unsigned int' 'void'; do
AC_TRY_COMPILE(
diff --git a/configure b/configure
index 8ff61a6f773..cc809acd959 100755
--- a/configure
+++ b/configure
@@ -18696,8 +18696,8 @@ else
if test "${ac_cv_func_accept_arg3+set}" = set; then
$as_echo_n "(cached) " >&6
else
- for ac_cv_func_accept_return in 'int' 'unsigned int PASCAL'; do
- for ac_cv_func_accept_arg1 in 'int' 'unsigned int'; do
+ for ac_cv_func_accept_return in 'int' 'unsigned int PASCAL' 'SOCKET'; do
+ for ac_cv_func_accept_arg1 in 'int' 'unsigned int' 'SOCKET'; do
for ac_cv_func_accept_arg2 in 'struct sockaddr *' 'const struct sockaddr *' 'void *'; do
for ac_cv_func_accept_arg3 in 'int' 'size_t' 'socklen_t' 'unsigned int' 'void'; do
cat >conftest.$ac_ext <<_ACEOF
diff --git a/src/include/c.h b/src/include/c.h
index 634b21fa949..af1be9499ef 100644
--- a/src/include/c.h
+++ b/src/include/c.h
@@ -58,7 +58,7 @@
#endif
#include "postgres_ext.h"
-#if _MSC_VER >= 1400
+#if _MSC_VER >= 1400 || defined(WIN64)
#define errcode __msvc_errcode
#include <crtdefs.h>
#undef errcode
diff --git a/src/include/port.h b/src/include/port.h
index 7ad464c07dc..4d40cef7b4b 100644
--- a/src/include/port.h
+++ b/src/include/port.h
@@ -325,8 +325,12 @@ extern FILE *pgwin32_fopen(const char *, const char *);
#define fopen(a,b) pgwin32_fopen(a,b)
#endif
+#ifndef popen
#define popen(a,b) _popen(a,b)
+#endif
+#ifndef pclose
#define pclose(a) _pclose(a)
+#endif
/* New versions of MingW have gettimeofday, old mingw and msvc don't */
#ifndef HAVE_GETTIMEOFDAY
diff --git a/src/include/port/win32.h b/src/include/port/win32.h
index 93439f763d0..6d99ecbe88d 100644
--- a/src/include/port/win32.h
+++ b/src/include/port/win32.h
@@ -4,7 +4,16 @@
#define WIN32_ONLY_COMPILER
#endif
+/*
+ * Make sure _WIN32_WINNT has the minumum required value.
+ * Leave a higher value in place.
+*/
+#if defined(_WIN32_WINNT) && _WIN32_WINNT < 0x0501
+#undefine _WIN32_WINNT
+#endif
+#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0501
+#endif
/*
* Always build with SSPI support. Keep it as a #define in case
* we want a switch to disable it sometime in the future.
@@ -17,10 +26,17 @@
#undef mkdir
#undef ERROR
+
+/*
+ * The Mingw64 headers choke if this is already defined - they
+ * define it themselves.
+ */
+#if !defined(WIN64) || defined(WIN32_ONLY_COMPILER)
#define _WINSOCKAPI_
-#include <windows.h>
+#endif
#include <winsock2.h>
#include <ws2tcpip.h>
+#include <windows.h>
#undef small
#include <process.h>
#include <signal.h>
diff --git a/src/include/port/win32/sys/socket.h b/src/include/port/win32/sys/socket.h
index 6947ec07d62..edaee6a894c 100644
--- a/src/include/port/win32/sys/socket.h
+++ b/src/include/port/win32/sys/socket.h
@@ -13,6 +13,7 @@
*/
#include <winsock2.h>
#include <ws2tcpip.h>
+#include <windows.h>
#undef ERROR
#undef small
diff --git a/src/port/getaddrinfo.c b/src/port/getaddrinfo.c
index 654858e6393..fabd50dddbe 100644
--- a/src/port/getaddrinfo.c
+++ b/src/port/getaddrinfo.c
@@ -329,8 +329,7 @@ gai_strerror(int errcode)
return "Not enough memory";
#endif
#ifdef EAI_NODATA
-#ifndef WIN32_ONLY_COMPILER /* MSVC complains because another case has the
- * same value */
+#if !defined(WIN64) && !defined(WIN32_ONLY_COMPILER) /* MSVC/WIN64 duplicate */
case EAI_NODATA:
return "No host data of that type was found";
#endif
diff --git a/src/test/regress/resultmap b/src/test/regress/resultmap
index 7bfcee29b48..d02d221d56f 100644
--- a/src/test/regress/resultmap
+++ b/src/test/regress/resultmap
@@ -1,11 +1,14 @@
float4:out:i.86-pc-mingw32=float4-exp-three-digits.out
+float4:out:x86_64-w64-mingw32=float4-exp-three-digits.out
float4:out:i.86-pc-win32vc=float4-exp-three-digits.out
float8:out:i.86-.*-freebsd=float8-small-is-zero.out
float8:out:i.86-.*-openbsd=float8-small-is-zero.out
float8:out:i.86-.*-netbsd=float8-small-is-zero.out
float8:out:m68k-.*-netbsd=float8-small-is-zero.out
float8:out:i.86-pc-mingw32=float8-exp-three-digits-win32.out
+float8:out:x86_64-w64-mingw32=float8-exp-three-digits-win32.out
float8:out:i.86-pc-win32vc=float8-exp-three-digits-win32.out
float8:out:i.86-pc-cygwin=float8-small-is-zero.out
int8:out:i.86-pc-mingw32=int8-exp-three-digits.out
+int8:out:x86_64-w64-mingw32=int8-exp-three-digits.out
int8:out:i.86-pc-win32vc=int8-exp-three-digits.out