GNULib's pthread_sigmask() is configured and builds incorrectly on MinGW64. Configure script detects it as present, and this is technically correct, but: --- cut --- /* Windows has rudimentary signals support. */ #define pthread_sigmask(H, S1, S2) 0 --- cut --- (see http://sourceforge.net/p/mingw-w64/mingw-w64/ci/master/tree/mingw-w64-libraries/winpthread s/include/pthread_signal.h)
And this causes failure building gnulib's pthread_sigmask.c, because it tries to refer to original pthread_sigmask() after #undef'ing it. This patch recognizes that pthread_sigmask is a simple macro and there's no real function behind it, and in this case it produces the following settings: HAVE_PTHREAD_SIGMASK=0 LIB_PTHREAD_SIGMASK='' REPLACE_PTHREAD_SIGMASK=1 so that pthread_sigmask() is entirely emulated by GNULib. Related topic: http://lists.gnu.org/archive/html/bug-gnulib/2015-04/msg00065.html Signed-off-by: Pavel Fedin <p.fe...@samsung.com> m4/pthread_sigmask.m4 | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/m4/pthread_sigmask.m4 b/m4/pthread_sigmask.m4 index 5c17dfc..a974848 100644 --- a/m4/pthread_sigmask.m4 +++ b/m4/pthread_sigmask.m4 @@ -40,6 +40,30 @@ AC_DEFUN([gl_FUNC_PTHREAD_SIGMASK], LIBS="$gl_save_LIBS" ]) if test $gl_cv_func_pthread_sigmask_in_LIBMULTITHREAD = yes; then + AC_CACHE_CHECK([whether pthread_sigmask is only a macro], + [gl_cv_func_pthread_sigmask_is_macro], + [gl_save_LIBS="$LIBS" + LIBS="$LIBS $LIBMULTITHREAD" + AC_LINK_IFELSE( + [AC_LANG_PROGRAM( + [[#include <pthread.h> + #include <signal.h> + #undef pthread_sigmask + ]], + [[return pthread_sigmask (0, (sigset_t *) 0, (sigset_t *) 0);]]) + ], + [gl_cv_func_pthread_sigmask_is_macro=no], + [gl_cv_func_pthread_sigmask_is_macro=yes]) + LIBS="$gl_save_LIBS" + ]) + if test $gl_cv_func_pthread_sigmask_is_macro = yes; then + dnl On MinGW pthread_sigmask is just a macro which always return 0. + dnl It does not exist as a real function, which is required by POSIX. + REPLACE_PTHREAD_SIGMASK=1 + gl_cv_func_pthread_sigmask_in_LIBMULTITHREAD=no + fi + fi + if test $gl_cv_func_pthread_sigmask_in_LIBMULTITHREAD = yes; then dnl pthread_sigmask is available with -pthread or -lpthread. LIB_PTHREAD_SIGMASK="$LIBMULTITHREAD" else -- Kind regards, Pavel Fedin Expert Engineer Samsung Electronics Research center Russia