[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH 06/20] tools: Correct PTHREAD options in config/StdGNU.mk



On Fri, 2012-03-16 at 16:26 +0000, Ian Jackson wrote:
> It is not correct to say -lpthread.  The correct option is -pthread,
> which may have sundry other effects on code generation etc.  It needs
> to be passed both to compilation and linking.

I guess this is a gcc-ism rather than a Linux-ism and so applies to the
BSDs too (at least so long as they use gcc and not clang)?

> Fix the configure test to test -pthread, and plumb the resulting flag
> through to PTHREAD_{CFLAGS,LDFLAGS} in Tools.mk; also substitute
> PTHREAD_LIBS (although this will currently always be empty).
> Remove PTHREAD_LIBS setting from StdGNU.mk.
> 
> Fix the one user (libxc) to use PTHREAD_{CFLAGS,LDFLAGS} too.
> 
> There are still some other users in tree which pass -pthread or
> -lpthread by adding it as a literal to their own compiler options.
> These will be fixed in a later patch.
> 
> Signed-off-by: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>
> Cc: Roger Pau Monne <roger.pau@xxxxxxxxxxxxx>
> ---
>  config/StdGNU.mk     |    1 -
>  config/Tools.mk.in   |    4 ++
>  tools/configure      |   95 
> +++++++++++++++++++++++++++++++++++---------------
>  tools/configure.ac   |    5 ++-
>  tools/libxc/Makefile |    4 ++-
>  tools/m4/pthread.m4  |   41 +++++++++++++++++++++
>  tools/m4/savevar.m4  |    6 +++
>  7 files changed, 124 insertions(+), 32 deletions(-)
>  create mode 100644 tools/m4/pthread.m4
>  create mode 100644 tools/m4/savevar.m4
> 
> diff --git a/config/StdGNU.mk b/config/StdGNU.mk
> index e2c9335..e2f2e1e 100644
> --- a/config/StdGNU.mk
> +++ b/config/StdGNU.mk
> @@ -67,7 +67,6 @@ XEN_CONFIG_DIR = $(CONFIG_DIR)/xen
>  XEN_SCRIPT_DIR = $(XEN_CONFIG_DIR)/scripts
>  
>  SOCKET_LIBS =
> -PTHREAD_LIBS = -lpthread
>  UTIL_LIBS = -lutil
>  DLOPEN_LIBS = -ldl
>  
> diff --git a/config/Tools.mk.in b/config/Tools.mk.in
> index 057b055..8247e4a 100644
> --- a/config/Tools.mk.in
> +++ b/config/Tools.mk.in
> @@ -23,6 +23,10 @@ PREPEND_LIB         := @PREPEND_LIB@
>  APPEND_INCLUDES     := @APPEND_INCLUDES@
>  APPEND_LIB          := @APPEND_LIB@
>  
> +PTHREAD_CFLAGS      := @PTHREAD_CFLAGS@
> +PTHREAD_LDFLAGS     := @PTHREAD_LDFLAGS@
> +PTHREAD_LIBS        := @PTHREAD_LIBS@
> +
>  # Download GIT repositories via HTTP or GIT's own protocol?
>  # GIT's protocol is faster and more robust, when it works at all (firewalls
>  # may block it). We make it the default, but if your GIT repository downloads
> diff --git a/tools/configure b/tools/configure
> index c686130..7ee4e3e 100755
> --- a/tools/configure
> +++ b/tools/configure
> @@ -602,6 +602,9 @@ POW_LIB
>  LIBOBJS
>  ALLOCA
>  libiconv
> +PTHREAD_LIBS
> +PTHREAD_LDFLAGS
> +PTHREAD_CFLAGS
>  libgcrypt
>  libext2fs
>  system_aio
> @@ -3844,6 +3847,9 @@ case $host_os in *\ *) host_os=`echo "$host_os" | sed 
> 's/ /-/g'`;; esac
>  
> 
> 
> +
> +
> +
>  # pkg.m4 - Macros to locate and utilise pkg-config.            -*- Autoconf 
> -*-
>  # serial 1 (pkg-config-0.24)
>  #
> @@ -3908,6 +3914,16 @@ case $host_os in *\ *) host_os=`echo "$host_os" | sed 
> 's/ /-/g'`;; esac
>  
> 
> 
> +
> +
> +
> +
> +
> +
> +
> +
> +
> +
>  # Enable/disable options
>  # Check whether --enable-githttp was given.
>  if test "${enable_githttp+set}" = set; then :
> @@ -7010,47 +7026,70 @@ else
>  fi
>  
> 
> -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create in 
> -lpthread" >&5
> -$as_echo_n "checking for pthread_create in -lpthread... " >&6; }
> -if test "${ac_cv_lib_pthread_pthread_create+set}" = set; then :
> +
> +    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread flag" >&5
> +$as_echo_n "checking for pthread flag... " >&6; }
> +if test "${ax_cv_pthread_flags+set}" = set; then :
>    $as_echo_n "(cached) " >&6
>  else
> -  ac_check_lib_save_LIBS=$LIBS
> -LIBS="-lpthread  $LIBS"
> -cat confdefs.h - <<_ACEOF >conftest.$ac_ext
> +
> +        ax_cv_pthread_flags=-pthread
> +
> +    PTHREAD_CFLAGS="$ax_cv_pthread_flags"
> +    PTHREAD_LDFLAGS="$ax_cv_pthread_flags"
> +    PTHREAD_LIBS=""
> +
> +
> +    saved_CFLAGS="$CFLAGS"
> +
> +    saved_LDFLAGS="$LDFLAGS"
> +
> +    saved_LIBS="$LIBS"
> +
> +
> +    CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
> +
> +    LDFLAGS="$LDFLAGS $PTHREAD_LDFLAGS"
> +
> +    LIBS="$LIBS $PTHREAD_LIBS"
> +
> +        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
>  /* end confdefs.h.  */
>  
> -/* Override any GCC internal prototype to avoid an error.
> -   Use char because int might match the return type of a GCC
> -   builtin and then its argument prototype would still apply.  */
> -#ifdef __cplusplus
> -extern "C"
> -#endif
> -char pthread_create ();
> -int
> -main ()
> -{
> -return pthread_create ();
> -  ;
> -  return 0;
> +#include <pthread.h>
> +int main(void) {
> +  pthread_atfork(0,0,0);
> +  pthread_create(0,0,0,0);
>  }
> +
>  _ACEOF
>  if ac_fn_c_try_link "$LINENO"; then :
> -  ac_cv_lib_pthread_pthread_create=yes
> +
>  else
> -  ac_cv_lib_pthread_pthread_create=no
> +  ax_cv_pthread_flags=failed
>  fi
>  rm -f core conftest.err conftest.$ac_objext \
>      conftest$ac_exeext conftest.$ac_ext
> -LIBS=$ac_check_lib_save_LIBS
> -fi
> -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: 
> $ac_cv_lib_pthread_pthread_create" >&5
> -$as_echo "$ac_cv_lib_pthread_pthread_create" >&6; }
> -if test "x$ac_cv_lib_pthread_pthread_create" = x""yes; then :
>  
> -else
> -  as_fn_error $? "Could not find libpthread" "$LINENO" 5
> +    CFLAGS="$saved_CFLAGS"
> +
> +    LDFLAGS="$saved_LDFLAGS"
> +
> +    LIBS="$saved_LIBS"
> +
> +
>  fi
> +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_pthread_flags" >&5
> +$as_echo "$ax_cv_pthread_flags" >&6; }
> +    if test "x$ax_cv_pthread_flags" = xfailed; then
> +        as_fn_error $? "-pthread does not work" "$LINENO" 5
> +    fi
> +
> +    PTHREAD_CFLAGS="$ax_cv_pthread_flags"
> +    PTHREAD_LDFLAGS="$ax_cv_pthread_flags"
> +    PTHREAD_LIBS=""
> +
> +
>  
>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for clock_gettime in -lrt" 
> >&5
>  $as_echo_n "checking for clock_gettime in -lrt... " >&6; }
> diff --git a/tools/configure.ac b/tools/configure.ac
> index 3d53a95..3da0c82 100644
> --- a/tools/configure.ac
> +++ b/tools/configure.ac
> @@ -23,6 +23,7 @@ AC_USE_SYSTEM_EXTENSIONS
>  AC_CANONICAL_HOST
>  
>  # M4 Macro includes
> +m4_include([m4/savevar.m4])
>  m4_include([m4/enable_feature.m4])
>  m4_include([m4/disable_feature.m4])
>  m4_include([m4/path_or_fail.m4])
> @@ -34,6 +35,7 @@ m4_include([m4/set_cflags_ldflags.m4])
>  m4_include([m4/uuid.m4])
>  m4_include([m4/pkg.m4])
>  m4_include([m4/curses.m4])
> +m4_include([m4/pthread.m4])
>  
>  # Enable/disable options
>  AX_ARG_ENABLE_AND_EXPORT([githttp], [Download GIT repositories via HTTP])
> @@ -123,8 +125,7 @@ AC_CHECK_LIB([ext2fs], [ext2fs_open2], [libext2fs="y"], 
> [libext2fs="n"])
>  AC_SUBST(libext2fs)
>  AC_CHECK_LIB([gcrypt], [gcry_md_hash_buffer], [libgcrypt="y"], 
> [libgcrypt="n"])
>  AC_SUBST(libgcrypt)
> -AC_CHECK_LIB([pthread], [pthread_create], [] ,
> -    [AC_MSG_ERROR([Could not find libpthread])])
> +AX_CHECK_PTHREAD
>  AC_CHECK_LIB([rt], [clock_gettime])
>  AC_CHECK_LIB([yajl], [yajl_alloc], [],
>      [AC_MSG_ERROR([Could not find yajl])])
> diff --git a/tools/libxc/Makefile b/tools/libxc/Makefile
> index 55eb755..a1ba134 100644
> --- a/tools/libxc/Makefile
> +++ b/tools/libxc/Makefile
> @@ -73,6 +73,8 @@ CFLAGS   += -I. $(CFLAGS_xeninclude)
>  # Needed for posix_fadvise64() in xc_linux.c
>  CFLAGS-$(CONFIG_Linux) += -D_GNU_SOURCE
>  
> +CFLAGS       += $(PTHREAD_CFLAGS)
> +
>  # Define this to make it possible to run valgrind on code linked with these
>  # libraries.
>  #CFLAGS   += -DVALGRIND -O0 -ggdb3
> @@ -157,7 +159,7 @@ libxenctrl.so.$(MAJOR): libxenctrl.so.$(MAJOR).$(MINOR)
>       ln -sf $< $@
>  
>  libxenctrl.so.$(MAJOR).$(MINOR): $(CTRL_PIC_OBJS)
> -     $(CC) $(LDFLAGS) -Wl,$(SONAME_LDFLAG) -Wl,libxenctrl.so.$(MAJOR) 
> $(SHLIB_LDFLAGS) -o $@ $^ $(DLOPEN_LIBS) $(PTHREAD_LIBS) $(APPEND_LDFLAGS)
> +     $(CC) $(LDFLAGS) $(PTHREAD_LDFLAGS) -Wl,$(SONAME_LDFLAG) 
> -Wl,libxenctrl.so.$(MAJOR) $(SHLIB_LDFLAGS) -o $@ $^ $(DLOPEN_LIBS) 
> $(PTHREAD_LIBS) $(APPEND_LDFLAGS)
>  
>  # libxenguest
>  
> diff --git a/tools/m4/pthread.m4 b/tools/m4/pthread.m4
> new file mode 100644
> index 0000000..57ea85c
> --- /dev/null
> +++ b/tools/m4/pthread.m4
> @@ -0,0 +1,41 @@
> +# We define, separately, PTHREAD_CFLAGS, _LDFLAGS and _LIBS
> +# even though currently we don't set them very separately.
> +# This means that the makefiles will not need to change in
> +# the future if we make the test more sophisticated.
> +
> +AC_DEFUN([AX_PTHREAD_CV2VARS],[
> +    PTHREAD_CFLAGS="$ax_cv_pthread_flags"
> +    PTHREAD_LDFLAGS="$ax_cv_pthread_flags"
> +    PTHREAD_LIBS=""
> +])
> +
> +# We invoke AX_PTHREAD_VARS with the name of another macro
> +# which is then expanded once for each variable.
> +AC_DEFUN([AX_PTHREAD_VARS],[$1(CFLAGS) $1(LDFLAGS) $1(LIBS)])
> +
> +AC_DEFUN([AX_PTHREAD_VAR_APPLY],[
> +    $1="$$1 $PTHREAD_$1"
> +])
> +AC_DEFUN([AX_PTHREAD_VAR_SUBST],[AC_SUBST(PTHREAD_$1)])
> +
> +AC_DEFUN([AX_CHECK_PTHREAD],[
> +    AC_CACHE_CHECK([for pthread flag], [ax_cv_pthread_flags], [
> +        ax_cv_pthread_flags=-pthread
> +        AX_PTHREAD_CV2VARS
> +        AX_PTHREAD_VARS([AX_SAVEVAR_SAVE])
> +        AX_PTHREAD_VARS([AX_PTHREAD_VAR_APPLY])
> +        AC_LINK_IFELSE([
> +#include <pthread.h>
> +int main(void) {
> +  pthread_atfork(0,0,0);
> +  pthread_create(0,0,0,0);
> +}
> +],[],[ax_cv_pthread_flags=failed])
> +        AX_PTHREAD_VARS([AX_SAVEVAR_RESTORE])
> +    ])
> +    if test "x$ax_cv_pthread_flags" = xfailed; then
> +        AC_MSG_ERROR([-pthread does not work])
> +    fi
> +    AX_PTHREAD_CV2VARS
> +    AX_PTHREAD_VARS([AX_PTHREAD_VAR_SUBST])
> +])
> diff --git a/tools/m4/savevar.m4 b/tools/m4/savevar.m4
> new file mode 100644
> index 0000000..2156bee
> --- /dev/null
> +++ b/tools/m4/savevar.m4
> @@ -0,0 +1,6 @@
> +AC_DEFUN([AX_SAVEVAR_SAVE],[
> +    saved_$1="$$1"
> +])
> +AC_DEFUN([AX_SAVEVAR_RESTORE],[
> +    $1="$saved_$1"
> +])



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.