[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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |