There were a number of recent threads about building PostgreSQL on
MSYS2. This has been confusing on occasion; see for example [0]. MSYS2
is actually a derivative of Cygwin. What most people are actually doing
is using MSYS2 has the host environment for doing a kind of
cross-compilation to MinGW.
You can also build natively on MSYS2, using the existing Cygwin support.
Except that it won't work because configure doesn't recognize the
config.guess output. Attached are a couple of small patches to fix that
up. The first patch fixes configure as explained. The second patch
fixes some warnings in ps_status.c. It's curious why the existing build
farm members don't issue warnings there, but maybe their compilers are
too old. The third patch fixes another warning; again, not sure why
original Cygwin doesn't warn. It might be a bit too broad to apply like
that.
MSYS2 doesn't ship with cygserver AFAICT, so you can't run a PostgreSQL
server, but everything else should work.
[0]:
https://www.postgresql.org/message-id/6672cebd-0c07-ce1e-36f8-6ae82c496...@2ndquadrant.com
--
Peter Eisentraut http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
From 676e1392705e017cc5ae17e0f35952f8a1405eab Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <pe...@eisentraut.org>
Date: Sun, 18 Aug 2019 00:17:16 +0200
Subject: [PATCH 1/3] Add support for MSYS2
It's basically a variant of Cygwin, so use that template.
---
configure | 12 +++++-------
configure.in | 12 +++++-------
2 files changed, 10 insertions(+), 14 deletions(-)
diff --git a/configure b/configure
index 3d9bd0bdf8..7f86a7e5ff 100755
--- a/configure
+++ b/configure
@@ -2946,7 +2946,7 @@ else
case $host_os in
aix*) template=aix ;;
- cygwin*) template=cygwin ;;
+ cygwin*|msys*) template=cygwin ;;
darwin*) template=darwin ;;
dragonfly*) template=netbsd ;;
freebsd*) template=freebsd ;;
@@ -15843,24 +15843,22 @@ fi
-case $host_os in
+if test "$PORTNAME" = "win32" -o "$PORTNAME" = "cygwin"; then
# Cygwin and (apparently, based on test results) Mingw both
# have a broken strtof(), so substitute the same replacement
# code we use with VS2013. That's not a perfect fix, since
# (unlike with VS2013) it doesn't avoid double-rounding, but
# we have no better options. To get that, though, we have to
# force the file to be compiled despite HAVE_STRTOF.
- mingw*|cygwin*)
- case " $LIBOBJS " in
+ case " $LIBOBJS " in
*" strtof.$ac_objext "* ) ;;
*) LIBOBJS="$LIBOBJS strtof.$ac_objext"
;;
esac
- { $as_echo "$as_me:${as_lineno-$LINENO}: On $host_os we will
use our strtof wrapper." >&5
+ { $as_echo "$as_me:${as_lineno-$LINENO}: On $host_os we will use our
strtof wrapper." >&5
$as_echo "$as_me: On $host_os we will use our strtof wrapper." >&6;}
- ;;
-esac
+fi
case $host_os in
diff --git a/configure.in b/configure.in
index 34aea0b4ac..797a9db01d 100644
--- a/configure.in
+++ b/configure.in
@@ -59,7 +59,7 @@ PGAC_ARG_REQ(with, template, [NAME], [override operating
system template],
case $host_os in
aix*) template=aix ;;
- cygwin*) template=cygwin ;;
+ cygwin*|msys*) template=cygwin ;;
darwin*) template=darwin ;;
dragonfly*) template=netbsd ;;
freebsd*) template=freebsd ;;
@@ -1743,18 +1743,16 @@ AC_REPLACE_FUNCS(m4_normalize([
strtof
]))
-case $host_os in
+if test "$PORTNAME" = "win32" -o "$PORTNAME" = "cygwin"; then
# Cygwin and (apparently, based on test results) Mingw both
# have a broken strtof(), so substitute the same replacement
# code we use with VS2013. That's not a perfect fix, since
# (unlike with VS2013) it doesn't avoid double-rounding, but
# we have no better options. To get that, though, we have to
# force the file to be compiled despite HAVE_STRTOF.
- mingw*|cygwin*)
- AC_LIBOBJ([strtof])
- AC_MSG_NOTICE([On $host_os we will use our strtof wrapper.])
- ;;
-esac
+ AC_LIBOBJ([strtof])
+ AC_MSG_NOTICE([On $host_os we will use our strtof wrapper.])
+fi
case $host_os in
--
2.24.0
From bf5be8c29babcd86e12d9f3acfb87d391d61e187 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <pe...@eisentraut.org>
Date: Wed, 11 Dec 2019 08:52:50 +0100
Subject: [PATCH 2/3] Fix compiler warnings
The PS_USE_NONE case left a couple of unused variables exposed.
---
src/backend/utils/misc/ps_status.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/src/backend/utils/misc/ps_status.c
b/src/backend/utils/misc/ps_status.c
index 6c851dd498..288d71d4d2 100644
--- a/src/backend/utils/misc/ps_status.c
+++ b/src/backend/utils/misc/ps_status.c
@@ -89,6 +89,8 @@ bool update_process_title = true;
#endif
+#ifndef PS_USE_NONE
+
#ifndef PS_USE_CLOBBER_ARGV
/* all but one option need a buffer to write their ps line in */
#define PS_BUFFER_SIZE 256
@@ -104,6 +106,8 @@ static size_t ps_buffer_cur_len; /* nominal
strlen(ps_buffer) */
static size_t ps_buffer_fixed_size; /* size of the constant prefix */
+#endif
+
/* save the original argv[] location here */
static int save_argc;
static char **save_argv;
@@ -420,7 +424,11 @@ get_ps_display(int *displen)
}
#endif
+#ifdef PS_USE_NONE
+ return "";
+#else
*displen = (int) (ps_buffer_cur_len - ps_buffer_fixed_size);
return ps_buffer + ps_buffer_fixed_size;
+#endif
}
--
2.24.0
From c265d26a9c73555860980f36a127049407dcf695 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <pe...@eisentraut.org>
Date: Wed, 11 Dec 2019 08:55:25 +0100
Subject: [PATCH 3/3] Fix compiler warning for ppoll() on MSYS2
Apparently, _GNU_SOURCE is required to get the prototype, so just
define that globally.
---
src/template/cygwin | 3 +++
1 file changed, 3 insertions(+)
diff --git a/src/template/cygwin b/src/template/cygwin
index 79a108145f..0a1ab04e3d 100644
--- a/src/template/cygwin
+++ b/src/template/cygwin
@@ -2,6 +2,9 @@
SRCH_LIB="/usr/local/lib"
+# to get ppoll() prototype
+CPPFLAGS="$CPPFLAGS -D_GNU_SOURCE"
+
# Extra CFLAGS for code that will go into a shared library
CFLAGS_SL=""
--
2.24.0