On my Fedora 20 box with mingw cross-compiler, the build failed with:
../../src/rpc/virnetclient.c: In function 'virNetClientSetTLSSession':
../../src/rpc/virnetclient.c:745:14: error: unused variable 'oldmask'
[-Werror=unused-variable]
sigset_t oldmask, blockedsigs;
^
I traced it to the fact that mingw64-winpthreads installs a header
that does #define pthread_sigmask(...) 0, which means any argument
only ever passeed to pthread_sigmask is reported as unused. This
patch works around the compilation failure, with behavior no worse
than what mingw already gives us regarding the function being a
no-op.
* configure.ac (pthread_sigmask): Probe for broken mingw macro.
* src/util/virutil.h (pthread_sigmask): Rewrite to something that
avoids unused variables.
Signed-off-by: Eric Blake <eblake(a)redhat.com>
---
It helps if I save my editor buffer _before_ creating the commit
and sending the email :)
configure.ac | 18 +++++++++++++++++-
src/util/virutil.h | 21 ++++++++++++++++-----
2 files changed, 33 insertions(+), 6 deletions(-)
diff --git a/configure.ac b/configure.ac
index d02b9d2..f5dccf1 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,6 +1,6 @@
dnl Process this file with autoconf to produce a configure script.
-dnl Copyright (C) 2005-2013 Red Hat, Inc.
+dnl Copyright (C) 2005-2014 Red Hat, Inc.
dnl
dnl This library is free software; you can redistribute it and/or
dnl modify it under the terms of the GNU Lesser General Public
@@ -276,6 +276,22 @@ dnl LIB_PTHREAD and LIBMULTITHREAD were set during gl_INIT by
gnulib.
old_LIBS=$LIBS
LIBS="$LIBS $LIB_PTHREAD $LIBMULTITHREAD"
AC_CHECK_FUNCS([pthread_mutexattr_init])
+dnl At least mingw64-winpthreads #defines pthread_sigmask to 0,
+dnl which in turn causes compilation to complain about unused variables.
+dnl Expose this broken implementation, so we can work around it.
+AC_CACHE_CHECK([whether pthread_sigmask does anything],
+ [lv_cv_pthread_sigmask_works],
+ [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+ #include <sys/types.h>
+ #include <signal.h>
+ ]], [[
+ int (*foo)(int, const sigset_t *, sigset_t *) = &pthread_sigmask;
+ return !foo;
+ ]])], [lv_cv_pthread_sigmask_works=yes], [lv_cv_pthread_sigmask_works=no])])
+if test "x$lv_cv_pthread_sigmask_works" != xyes; then
+ AC_DEFINE([FUNC_PTHREAD_SIGMASK_BROKEN], [1],
+ [Define to 1 if pthread_sigmask is not a real function])
+fi
LIBS=$old_libs
dnl Availability of various common headers (non-fatal if missing).
diff --git a/src/util/virutil.h b/src/util/virutil.h
index 2229c73..7b2af75 100644
--- a/src/util/virutil.h
+++ b/src/util/virutil.h
@@ -1,7 +1,7 @@
/*
* virutil.h: common, generic utility functions
*
- * Copyright (C) 2010-2013 Red Hat, Inc.
+ * Copyright (C) 2010-2014 Red Hat, Inc.
* Copyright (C) 2006, 2007 Binary Karma
* Copyright (C) 2006 Shuveb Hussain
*
@@ -96,20 +96,31 @@ const char *virEnumToString(const char *const*types,
const char *name ## TypeToString(int type); \
int name ## TypeFromString(const char*type);
+/* No-op workarounds for functionality missing in mingw. */
# ifndef HAVE_GETUID
-static inline int getuid (void) { return 0; }
+static inline int getuid(void) { return 0; }
# endif
# ifndef HAVE_GETEUID
-static inline int geteuid (void) { return 0; }
+static inline int geteuid(void) { return 0; }
# endif
# ifndef HAVE_GETGID
-static inline int getgid (void) { return 0; }
+static inline int getgid(void) { return 0; }
# endif
# ifndef HAVE_GETEGID
-static inline int getegid (void) { return 0; }
+static inline int getegid(void) { return 0; }
+# endif
+
+# ifdef FUNC_PTHREAD_SIGMASK_BROKEN
+# undef pthread_sigmask
+static inline int pthread_sigmask(int how ATTRIBUTE_UNUSED,
+ const void *set ATTRIBUTE_UNUSED,
+ void *old ATTRIBUTE_UNUSED)
+{
+ return 0;
+}
# endif
char *virGetHostname(void);
--
1.8.4.2