[libvirt] [PATCHv2] build: fix build on mingw with winpthreads

Eric Blake eblake at redhat.com
Fri Jan 10 21:11:33 UTC 2014


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 at 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




More information about the libvir-list mailing list