提交 c91d13bd 编写于 作者: E Eric Blake

build: fix build on mingw with winpthreads

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 passed 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: NEric Blake <eblake@redhat.com>
上级 d9526198
dnl Process this file with autoconf to produce a configure script. 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
dnl This library is free software; you can redistribute it and/or dnl This library is free software; you can redistribute it and/or
dnl modify it under the terms of the GNU Lesser General Public 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. ...@@ -276,6 +276,22 @@ dnl LIB_PTHREAD and LIBMULTITHREAD were set during gl_INIT by gnulib.
old_LIBS=$LIBS old_LIBS=$LIBS
LIBS="$LIBS $LIB_PTHREAD $LIBMULTITHREAD" LIBS="$LIBS $LIB_PTHREAD $LIBMULTITHREAD"
AC_CHECK_FUNCS([pthread_mutexattr_init]) 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 LIBS=$old_libs
dnl Availability of various common headers (non-fatal if missing). dnl Availability of various common headers (non-fatal if missing).
......
/* /*
* virutil.h: common, generic utility functions * 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, 2007 Binary Karma
* Copyright (C) 2006 Shuveb Hussain * Copyright (C) 2006 Shuveb Hussain
* *
...@@ -96,20 +96,34 @@ const char *virEnumToString(const char *const*types, ...@@ -96,20 +96,34 @@ const char *virEnumToString(const char *const*types,
const char *name ## TypeToString(int type); \ const char *name ## TypeToString(int type); \
int name ## TypeFromString(const char*type); int name ## TypeFromString(const char*type);
/* No-op workarounds for functionality missing in mingw. */
# ifndef HAVE_GETUID # ifndef HAVE_GETUID
static inline int getuid (void) { return 0; } static inline int getuid(void) { return 0; }
# endif # endif
# ifndef HAVE_GETEUID # ifndef HAVE_GETEUID
static inline int geteuid (void) { return 0; } static inline int geteuid(void) { return 0; }
# endif # endif
# ifndef HAVE_GETGID # ifndef HAVE_GETGID
static inline int getgid (void) { return 0; } static inline int getgid(void) { return 0; }
# endif # endif
# ifndef HAVE_GETEGID # 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,
const void *set,
void *old)
{
(void) how;
(void) set;
(void) old;
return 0;
}
# endif # endif
char *virGetHostname(void); char *virGetHostname(void);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册