annotate src/capnproto-0.6.0/c++/m4/acx_pthread.m4 @ 83:ae30d91d2ffe

Replace these with versions built using an older toolset (so as to avoid ABI compatibilities when linking on Ubuntu 14.04 for packaging purposes)
author Chris Cannam
date Fri, 07 Feb 2020 11:51:13 +0000
parents 0994c39f1e94
children
rev   line source
cannam@62 1 # This file was copied to Cap'n Proto from the Protocol Buffers distribution,
cannam@62 2 # version 2.3.0.
cannam@62 3
cannam@62 4 # This was retrieved from
cannam@62 5 # http://svn.0pointer.de/viewvc/trunk/common/acx_pthread.m4?revision=1277&root=avahi
cannam@62 6 # See also (perhaps for new versions?)
cannam@62 7 # http://svn.0pointer.de/viewvc/trunk/common/acx_pthread.m4?root=avahi
cannam@62 8 #
cannam@62 9 # We've rewritten the inconsistency check code (from avahi), to work
cannam@62 10 # more broadly. In particular, it no longer assumes ld accepts -zdefs.
cannam@62 11 # This caused a restructing of the code, but the functionality has only
cannam@62 12 # changed a little.
cannam@62 13
cannam@62 14 dnl @synopsis ACX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
cannam@62 15 dnl
cannam@62 16 dnl @summary figure out how to build C programs using POSIX threads
cannam@62 17 dnl
cannam@62 18 dnl This macro figures out how to build C programs using POSIX threads.
cannam@62 19 dnl It sets the PTHREAD_LIBS output variable to the threads library and
cannam@62 20 dnl linker flags, and the PTHREAD_CFLAGS output variable to any special
cannam@62 21 dnl C compiler flags that are needed. (The user can also force certain
cannam@62 22 dnl compiler flags/libs to be tested by setting these environment
cannam@62 23 dnl variables.)
cannam@62 24 dnl
cannam@62 25 dnl Also sets PTHREAD_CC to any special C compiler that is needed for
cannam@62 26 dnl multi-threaded programs (defaults to the value of CC otherwise).
cannam@62 27 dnl (This is necessary on AIX to use the special cc_r compiler alias.)
cannam@62 28 dnl
cannam@62 29 dnl NOTE: You are assumed to not only compile your program with these
cannam@62 30 dnl flags, but also link it with them as well. e.g. you should link
cannam@62 31 dnl with $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS
cannam@62 32 dnl $LIBS
cannam@62 33 dnl
cannam@62 34 dnl If you are only building threads programs, you may wish to use
cannam@62 35 dnl these variables in your default LIBS, CFLAGS, and CC:
cannam@62 36 dnl
cannam@62 37 dnl LIBS="$PTHREAD_LIBS $LIBS"
cannam@62 38 dnl CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
cannam@62 39 dnl CC="$PTHREAD_CC"
cannam@62 40 dnl
cannam@62 41 dnl In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute
cannam@62 42 dnl constant has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to
cannam@62 43 dnl that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX).
cannam@62 44 dnl
cannam@62 45 dnl ACTION-IF-FOUND is a list of shell commands to run if a threads
cannam@62 46 dnl library is found, and ACTION-IF-NOT-FOUND is a list of commands to
cannam@62 47 dnl run it if it is not found. If ACTION-IF-FOUND is not specified, the
cannam@62 48 dnl default action will define HAVE_PTHREAD.
cannam@62 49 dnl
cannam@62 50 dnl Please let the authors know if this macro fails on any platform, or
cannam@62 51 dnl if you have any other suggestions or comments. This macro was based
cannam@62 52 dnl on work by SGJ on autoconf scripts for FFTW (www.fftw.org) (with
cannam@62 53 dnl help from M. Frigo), as well as ac_pthread and hb_pthread macros
cannam@62 54 dnl posted by Alejandro Forero Cuervo to the autoconf macro repository.
cannam@62 55 dnl We are also grateful for the helpful feedback of numerous users.
cannam@62 56 dnl
cannam@62 57 dnl @category InstalledPackages
cannam@62 58 dnl @author Steven G. Johnson <stevenj@alum.mit.edu>
cannam@62 59 dnl @version 2006-05-29
cannam@62 60 dnl @license GPLWithACException
cannam@62 61 dnl
cannam@62 62 dnl Checks for GCC shared/pthread inconsistency based on work by
cannam@62 63 dnl Marcin Owsiany <marcin@owsiany.pl>
cannam@62 64
cannam@62 65
cannam@62 66 AC_DEFUN([ACX_PTHREAD], [
cannam@62 67 AC_REQUIRE([AC_CANONICAL_HOST])
cannam@62 68 AC_LANG_SAVE
cannam@62 69 AC_LANG_C
cannam@62 70 acx_pthread_ok=no
cannam@62 71
cannam@62 72 # We used to check for pthread.h first, but this fails if pthread.h
cannam@62 73 # requires special compiler flags (e.g. on True64 or Sequent).
cannam@62 74 # It gets checked for in the link test anyway.
cannam@62 75
cannam@62 76 # First of all, check if the user has set any of the PTHREAD_LIBS,
cannam@62 77 # etcetera environment variables, and if threads linking works using
cannam@62 78 # them:
cannam@62 79 if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then
cannam@62 80 save_CFLAGS="$CFLAGS"
cannam@62 81 CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
cannam@62 82 save_LIBS="$LIBS"
cannam@62 83 LIBS="$PTHREAD_LIBS $LIBS"
cannam@62 84 AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS])
cannam@62 85 AC_TRY_LINK_FUNC(pthread_join, acx_pthread_ok=yes)
cannam@62 86 AC_MSG_RESULT($acx_pthread_ok)
cannam@62 87 if test x"$acx_pthread_ok" = xno; then
cannam@62 88 PTHREAD_LIBS=""
cannam@62 89 PTHREAD_CFLAGS=""
cannam@62 90 fi
cannam@62 91 LIBS="$save_LIBS"
cannam@62 92 CFLAGS="$save_CFLAGS"
cannam@62 93 fi
cannam@62 94
cannam@62 95 # We must check for the threads library under a number of different
cannam@62 96 # names; the ordering is very important because some systems
cannam@62 97 # (e.g. DEC) have both -lpthread and -lpthreads, where one of the
cannam@62 98 # libraries is broken (non-POSIX).
cannam@62 99
cannam@62 100 # Create a list of thread flags to try. Items starting with a "-" are
cannam@62 101 # C compiler flags, and other items are library names, except for "none"
cannam@62 102 # which indicates that we try without any flags at all, and "pthread-config"
cannam@62 103 # which is a program returning the flags for the Pth emulation library.
cannam@62 104
cannam@62 105 acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config"
cannam@62 106
cannam@62 107 # The ordering *is* (sometimes) important. Some notes on the
cannam@62 108 # individual items follow:
cannam@62 109
cannam@62 110 # pthreads: AIX (must check this before -lpthread)
cannam@62 111 # none: in case threads are in libc; should be tried before -Kthread and
cannam@62 112 # other compiler flags to prevent continual compiler warnings
cannam@62 113 # -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)
cannam@62 114 # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)
cannam@62 115 # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)
cannam@62 116 # -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads)
cannam@62 117 # -pthreads: Solaris/gcc
cannam@62 118 # -mthreads: Mingw32/gcc, Lynx/gcc
cannam@62 119 # -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it
cannam@62 120 # doesn't hurt to check since this sometimes defines pthreads too;
cannam@62 121 # also defines -D_REENTRANT)
cannam@62 122 # ... -mt is also the pthreads flag for HP/aCC
cannam@62 123 # pthread: Linux, etcetera
cannam@62 124 # --thread-safe: KAI C++
cannam@62 125 # pthread-config: use pthread-config program (for GNU Pth library)
cannam@62 126
cannam@62 127 case "${host_cpu}-${host_os}" in
cannam@62 128 *solaris*)
cannam@62 129
cannam@62 130 # On Solaris (at least, for some versions), libc contains stubbed
cannam@62 131 # (non-functional) versions of the pthreads routines, so link-based
cannam@62 132 # tests will erroneously succeed. (We need to link with -pthreads/-mt/
cannam@62 133 # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather
cannam@62 134 # a function called by this macro, so we could check for that, but
cannam@62 135 # who knows whether they'll stub that too in a future libc.) So,
cannam@62 136 # we'll just look for -pthreads and -lpthread first:
cannam@62 137
cannam@62 138 acx_pthread_flags="-pthreads pthread -mt -pthread $acx_pthread_flags"
cannam@62 139 ;;
cannam@62 140 esac
cannam@62 141
cannam@62 142 if test x"$acx_pthread_ok" = xno; then
cannam@62 143 for flag in $acx_pthread_flags; do
cannam@62 144
cannam@62 145 case $flag in
cannam@62 146 none)
cannam@62 147 AC_MSG_CHECKING([whether pthreads work without any flags])
cannam@62 148 ;;
cannam@62 149
cannam@62 150 -*)
cannam@62 151 AC_MSG_CHECKING([whether pthreads work with $flag])
cannam@62 152 PTHREAD_CFLAGS="$flag"
cannam@62 153 ;;
cannam@62 154
cannam@62 155 pthread-config)
cannam@62 156 AC_CHECK_PROG(acx_pthread_config, pthread-config, yes, no)
cannam@62 157 if test x"$acx_pthread_config" = xno; then continue; fi
cannam@62 158 PTHREAD_CFLAGS="`pthread-config --cflags`"
cannam@62 159 PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`"
cannam@62 160 ;;
cannam@62 161
cannam@62 162 *)
cannam@62 163 AC_MSG_CHECKING([for the pthreads library -l$flag])
cannam@62 164 PTHREAD_LIBS="-l$flag"
cannam@62 165 ;;
cannam@62 166 esac
cannam@62 167
cannam@62 168 save_LIBS="$LIBS"
cannam@62 169 save_CFLAGS="$CFLAGS"
cannam@62 170 LIBS="$PTHREAD_LIBS $LIBS"
cannam@62 171 CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
cannam@62 172
cannam@62 173 # Check for various functions. We must include pthread.h,
cannam@62 174 # since some functions may be macros. (On the Sequent, we
cannam@62 175 # need a special flag -Kthread to make this header compile.)
cannam@62 176 # We check for pthread_join because it is in -lpthread on IRIX
cannam@62 177 # while pthread_create is in libc. We check for pthread_attr_init
cannam@62 178 # due to DEC craziness with -lpthreads. We check for
cannam@62 179 # pthread_cleanup_push because it is one of the few pthread
cannam@62 180 # functions on Solaris that doesn't have a non-functional libc stub.
cannam@62 181 # We try pthread_create on general principles.
cannam@62 182 AC_TRY_LINK([#include <pthread.h>],
cannam@62 183 [pthread_t th; pthread_join(th, 0);
cannam@62 184 pthread_attr_init(0); pthread_cleanup_push(0, 0);
cannam@62 185 pthread_create(0,0,0,0); pthread_cleanup_pop(0); ],
cannam@62 186 [acx_pthread_ok=yes])
cannam@62 187
cannam@62 188 LIBS="$save_LIBS"
cannam@62 189 CFLAGS="$save_CFLAGS"
cannam@62 190
cannam@62 191 AC_MSG_RESULT($acx_pthread_ok)
cannam@62 192 if test "x$acx_pthread_ok" = xyes; then
cannam@62 193 break;
cannam@62 194 fi
cannam@62 195
cannam@62 196 PTHREAD_LIBS=""
cannam@62 197 PTHREAD_CFLAGS=""
cannam@62 198 done
cannam@62 199 fi
cannam@62 200
cannam@62 201 # Various other checks:
cannam@62 202 if test "x$acx_pthread_ok" = xyes; then
cannam@62 203 save_LIBS="$LIBS"
cannam@62 204 LIBS="$PTHREAD_LIBS $LIBS"
cannam@62 205 save_CFLAGS="$CFLAGS"
cannam@62 206 CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
cannam@62 207
cannam@62 208 # Detect AIX lossage: JOINABLE attribute is called UNDETACHED.
cannam@62 209 AC_MSG_CHECKING([for joinable pthread attribute])
cannam@62 210 attr_name=unknown
cannam@62 211 for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do
cannam@62 212 AC_TRY_LINK([#include <pthread.h>], [int attr=$attr; return attr;],
cannam@62 213 [attr_name=$attr; break])
cannam@62 214 done
cannam@62 215 AC_MSG_RESULT($attr_name)
cannam@62 216 if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then
cannam@62 217 AC_DEFINE_UNQUOTED(PTHREAD_CREATE_JOINABLE, $attr_name,
cannam@62 218 [Define to necessary symbol if this constant
cannam@62 219 uses a non-standard name on your system.])
cannam@62 220 fi
cannam@62 221
cannam@62 222 AC_MSG_CHECKING([if more special flags are required for pthreads])
cannam@62 223 flag=no
cannam@62 224 case "${host_cpu}-${host_os}" in
cannam@62 225 *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";;
cannam@62 226 *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";;
cannam@62 227 esac
cannam@62 228 AC_MSG_RESULT(${flag})
cannam@62 229 if test "x$flag" != xno; then
cannam@62 230 PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS"
cannam@62 231 fi
cannam@62 232
cannam@62 233 LIBS="$save_LIBS"
cannam@62 234 CFLAGS="$save_CFLAGS"
cannam@62 235 # More AIX lossage: must compile with xlc_r or cc_r
cannam@62 236 if test x"$GCC" != xyes; then
cannam@62 237 AC_CHECK_PROGS(PTHREAD_CC, xlc_r cc_r, ${CC})
cannam@62 238 else
cannam@62 239 PTHREAD_CC=$CC
cannam@62 240 fi
cannam@62 241
cannam@62 242 # The next part tries to detect GCC inconsistency with -shared on some
cannam@62 243 # architectures and systems. The problem is that in certain
cannam@62 244 # configurations, when -shared is specified, GCC "forgets" to
cannam@62 245 # internally use various flags which are still necessary.
cannam@62 246
cannam@62 247 #
cannam@62 248 # Prepare the flags
cannam@62 249 #
cannam@62 250 save_CFLAGS="$CFLAGS"
cannam@62 251 save_LIBS="$LIBS"
cannam@62 252 save_CC="$CC"
cannam@62 253
cannam@62 254 # Try with the flags determined by the earlier checks.
cannam@62 255 #
cannam@62 256 # -Wl,-z,defs forces link-time symbol resolution, so that the
cannam@62 257 # linking checks with -shared actually have any value
cannam@62 258 #
cannam@62 259 # FIXME: -fPIC is required for -shared on many architectures,
cannam@62 260 # so we specify it here, but the right way would probably be to
cannam@62 261 # properly detect whether it is actually required.
cannam@62 262 CFLAGS="-shared -fPIC -Wl,-z,defs $CFLAGS $PTHREAD_CFLAGS"
cannam@62 263 LIBS="$PTHREAD_LIBS $LIBS"
cannam@62 264 CC="$PTHREAD_CC"
cannam@62 265
cannam@62 266 # In order not to create several levels of indentation, we test
cannam@62 267 # the value of "$done" until we find the cure or run out of ideas.
cannam@62 268 done="no"
cannam@62 269
cannam@62 270 # First, make sure the CFLAGS we added are actually accepted by our
cannam@62 271 # compiler. If not (and OS X's ld, for instance, does not accept -z),
cannam@62 272 # then we can't do this test.
cannam@62 273 if test x"$done" = xno; then
cannam@62 274 AC_MSG_CHECKING([whether to check for GCC pthread/shared inconsistencies])
cannam@62 275 AC_TRY_LINK(,, , [done=yes])
cannam@62 276
cannam@62 277 if test "x$done" = xyes ; then
cannam@62 278 AC_MSG_RESULT([no])
cannam@62 279 else
cannam@62 280 AC_MSG_RESULT([yes])
cannam@62 281 fi
cannam@62 282 fi
cannam@62 283
cannam@62 284 if test x"$done" = xno; then
cannam@62 285 AC_MSG_CHECKING([whether -pthread is sufficient with -shared])
cannam@62 286 AC_TRY_LINK([#include <pthread.h>],
cannam@62 287 [pthread_t th; pthread_join(th, 0);
cannam@62 288 pthread_attr_init(0); pthread_cleanup_push(0, 0);
cannam@62 289 pthread_create(0,0,0,0); pthread_cleanup_pop(0); ],
cannam@62 290 [done=yes])
cannam@62 291
cannam@62 292 if test "x$done" = xyes; then
cannam@62 293 AC_MSG_RESULT([yes])
cannam@62 294 else
cannam@62 295 AC_MSG_RESULT([no])
cannam@62 296 fi
cannam@62 297 fi
cannam@62 298
cannam@62 299 #
cannam@62 300 # Linux gcc on some architectures such as mips/mipsel forgets
cannam@62 301 # about -lpthread
cannam@62 302 #
cannam@62 303 if test x"$done" = xno; then
cannam@62 304 AC_MSG_CHECKING([whether -lpthread fixes that])
cannam@62 305 LIBS="-lpthread $PTHREAD_LIBS $save_LIBS"
cannam@62 306 AC_TRY_LINK([#include <pthread.h>],
cannam@62 307 [pthread_t th; pthread_join(th, 0);
cannam@62 308 pthread_attr_init(0); pthread_cleanup_push(0, 0);
cannam@62 309 pthread_create(0,0,0,0); pthread_cleanup_pop(0); ],
cannam@62 310 [done=yes])
cannam@62 311
cannam@62 312 if test "x$done" = xyes; then
cannam@62 313 AC_MSG_RESULT([yes])
cannam@62 314 PTHREAD_LIBS="-lpthread $PTHREAD_LIBS"
cannam@62 315 else
cannam@62 316 AC_MSG_RESULT([no])
cannam@62 317 fi
cannam@62 318 fi
cannam@62 319 #
cannam@62 320 # FreeBSD 4.10 gcc forgets to use -lc_r instead of -lc
cannam@62 321 #
cannam@62 322 if test x"$done" = xno; then
cannam@62 323 AC_MSG_CHECKING([whether -lc_r fixes that])
cannam@62 324 LIBS="-lc_r $PTHREAD_LIBS $save_LIBS"
cannam@62 325 AC_TRY_LINK([#include <pthread.h>],
cannam@62 326 [pthread_t th; pthread_join(th, 0);
cannam@62 327 pthread_attr_init(0); pthread_cleanup_push(0, 0);
cannam@62 328 pthread_create(0,0,0,0); pthread_cleanup_pop(0); ],
cannam@62 329 [done=yes])
cannam@62 330
cannam@62 331 if test "x$done" = xyes; then
cannam@62 332 AC_MSG_RESULT([yes])
cannam@62 333 PTHREAD_LIBS="-lc_r $PTHREAD_LIBS"
cannam@62 334 else
cannam@62 335 AC_MSG_RESULT([no])
cannam@62 336 fi
cannam@62 337 fi
cannam@62 338 if test x"$done" = xno; then
cannam@62 339 # OK, we have run out of ideas
cannam@62 340 AC_MSG_WARN([Impossible to determine how to use pthreads with shared libraries])
cannam@62 341
cannam@62 342 # so it's not safe to assume that we may use pthreads
cannam@62 343 acx_pthread_ok=no
cannam@62 344 fi
cannam@62 345
cannam@62 346 CFLAGS="$save_CFLAGS"
cannam@62 347 LIBS="$save_LIBS"
cannam@62 348 CC="$save_CC"
cannam@62 349 else
cannam@62 350 PTHREAD_CC="$CC"
cannam@62 351 fi
cannam@62 352
cannam@62 353 if test "x$acx_pthread_ok" = xyes; then
cannam@62 354 # One more check: If we chose to use a compiler flag like -pthread but it is combined with
cannam@62 355 # -nostdlib then the compiler won't implicitly link against libpthread. This can happen
cannam@62 356 # in particular when using some versions of libtool on some distros. See:
cannam@62 357 # https://bugzilla.redhat.com/show_bug.cgi?id=661333
cannam@62 358
cannam@62 359 save_CFLAGS="$CFLAGS"
cannam@62 360 save_LIBS="$LIBS"
cannam@62 361 save_CC="$CC"
cannam@62 362 CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
cannam@62 363 LIBS="-nostdlib $PTHREAD_LIBS $LIBS -lc"
cannam@62 364 CC="$PTHREAD_CC"
cannam@62 365
cannam@62 366 AC_MSG_CHECKING([whether pthread flag is sufficient with -nostdlib])
cannam@62 367 AC_TRY_LINK([#include <pthread.h>],
cannam@62 368 [pthread_t th; pthread_join(th, 0);
cannam@62 369 pthread_attr_init(0); pthread_cleanup_push(0, 0);
cannam@62 370 pthread_create(0,0,0,0); pthread_cleanup_pop(0); ],
cannam@62 371 [AC_MSG_RESULT([yes])], [
cannam@62 372 AC_MSG_RESULT([no])
cannam@62 373
cannam@62 374 AC_MSG_CHECKING([whether adding -lpthread fixes that])
cannam@62 375
cannam@62 376 LIBS="-nostdlib $PTHREAD_LIBS -lpthread $save_LIBS -lc"
cannam@62 377 AC_TRY_LINK([#include <pthread.h>],
cannam@62 378 [pthread_t th; pthread_join(th, 0);
cannam@62 379 pthread_attr_init(0); pthread_cleanup_push(0, 0);
cannam@62 380 pthread_create(0,0,0,0); pthread_cleanup_pop(0); ],
cannam@62 381 [
cannam@62 382 AC_MSG_RESULT([yes])
cannam@62 383 PTHREAD_LIBS="$PTHREAD_LIBS -lpthread"
cannam@62 384 ], [AC_MSG_RESULT([no])])
cannam@62 385 ])
cannam@62 386
cannam@62 387 CFLAGS="$save_CFLAGS"
cannam@62 388 LIBS="$save_LIBS"
cannam@62 389 CC="$save_CC"
cannam@62 390 fi
cannam@62 391
cannam@62 392 AC_SUBST(PTHREAD_LIBS)
cannam@62 393 AC_SUBST(PTHREAD_CFLAGS)
cannam@62 394 AC_SUBST(PTHREAD_CC)
cannam@62 395
cannam@62 396 # Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
cannam@62 397 if test x"$acx_pthread_ok" = xyes; then
cannam@62 398 ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1])
cannam@62 399 :
cannam@62 400 else
cannam@62 401 acx_pthread_ok=no
cannam@62 402 $2
cannam@62 403 fi
cannam@62 404 AC_LANG_RESTORE
cannam@62 405 ])dnl ACX_PTHREAD