Home | History | Annotate | Line # | Download | only in m4
      1  1.1  riastrad # ===========================================================================
      2  1.1  riastrad #        https://www.gnu.org/software/autoconf-archive/ax_pthread.html
      3  1.1  riastrad # ===========================================================================
      4  1.1  riastrad #
      5  1.1  riastrad # SYNOPSIS
      6  1.1  riastrad #
      7  1.1  riastrad #   AX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
      8  1.1  riastrad #
      9  1.1  riastrad # DESCRIPTION
     10  1.1  riastrad #
     11  1.1  riastrad #   This macro figures out how to build C programs using POSIX threads. It
     12  1.1  riastrad #   sets the PTHREAD_LIBS output variable to the threads library and linker
     13  1.1  riastrad #   flags, and the PTHREAD_CFLAGS output variable to any special C compiler
     14  1.1  riastrad #   flags that are needed. (The user can also force certain compiler
     15  1.1  riastrad #   flags/libs to be tested by setting these environment variables.)
     16  1.1  riastrad #
     17  1.1  riastrad #   Also sets PTHREAD_CC to any special C compiler that is needed for
     18  1.1  riastrad #   multi-threaded programs (defaults to the value of CC otherwise). (This
     19  1.1  riastrad #   is necessary on AIX to use the special cc_r compiler alias.)
     20  1.1  riastrad #
     21  1.1  riastrad #   NOTE: You are assumed to not only compile your program with these flags,
     22  1.1  riastrad #   but also to link with them as well. For example, you might link with
     23  1.1  riastrad #   $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS
     24  1.1  riastrad #
     25  1.1  riastrad #   If you are only building threaded programs, you may wish to use these
     26  1.1  riastrad #   variables in your default LIBS, CFLAGS, and CC:
     27  1.1  riastrad #
     28  1.1  riastrad #     LIBS="$PTHREAD_LIBS $LIBS"
     29  1.1  riastrad #     CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
     30  1.1  riastrad #     CC="$PTHREAD_CC"
     31  1.1  riastrad #
     32  1.1  riastrad #   In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant
     33  1.1  riastrad #   has a nonstandard name, this macro defines PTHREAD_CREATE_JOINABLE to
     34  1.1  riastrad #   that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX).
     35  1.1  riastrad #
     36  1.1  riastrad #   Also HAVE_PTHREAD_PRIO_INHERIT is defined if pthread is found and the
     37  1.1  riastrad #   PTHREAD_PRIO_INHERIT symbol is defined when compiling with
     38  1.1  riastrad #   PTHREAD_CFLAGS.
     39  1.1  riastrad #
     40  1.1  riastrad #   ACTION-IF-FOUND is a list of shell commands to run if a threads library
     41  1.1  riastrad #   is found, and ACTION-IF-NOT-FOUND is a list of commands to run it if it
     42  1.1  riastrad #   is not found. If ACTION-IF-FOUND is not specified, the default action
     43  1.1  riastrad #   will define HAVE_PTHREAD.
     44  1.1  riastrad #
     45  1.1  riastrad #   Please let the authors know if this macro fails on any platform, or if
     46  1.1  riastrad #   you have any other suggestions or comments. This macro was based on work
     47  1.1  riastrad #   by SGJ on autoconf scripts for FFTW (http://www.fftw.org/) (with help
     48  1.1  riastrad #   from M. Frigo), as well as ac_pthread and hb_pthread macros posted by
     49  1.1  riastrad #   Alejandro Forero Cuervo to the autoconf macro repository. We are also
     50  1.1  riastrad #   grateful for the helpful feedback of numerous users.
     51  1.1  riastrad #
     52  1.1  riastrad #   Updated for Autoconf 2.68 by Daniel Richard G.
     53  1.1  riastrad #
     54  1.1  riastrad # LICENSE
     55  1.1  riastrad #
     56  1.1  riastrad #   Copyright (c) 2008 Steven G. Johnson <stevenj (a] alum.mit.edu>
     57  1.1  riastrad #   Copyright (c) 2011 Daniel Richard G. <skunk (a] iSKUNK.ORG>
     58  1.1  riastrad #
     59  1.1  riastrad #   This program is free software: you can redistribute it and/or modify it
     60  1.1  riastrad #   under the terms of the GNU General Public License as published by the
     61  1.1  riastrad #   Free Software Foundation, either version 3 of the License, or (at your
     62  1.1  riastrad #   option) any later version.
     63  1.1  riastrad #
     64  1.1  riastrad #   This program is distributed in the hope that it will be useful, but
     65  1.1  riastrad #   WITHOUT ANY WARRANTY; without even the implied warranty of
     66  1.1  riastrad #   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
     67  1.1  riastrad #   Public License for more details.
     68  1.1  riastrad #
     69  1.1  riastrad #   You should have received a copy of the GNU General Public License along
     70  1.1  riastrad #   with this program. If not, see <https://www.gnu.org/licenses/>.
     71  1.1  riastrad #
     72  1.1  riastrad #   As a special exception, the respective Autoconf Macro's copyright owner
     73  1.1  riastrad #   gives unlimited permission to copy, distribute and modify the configure
     74  1.1  riastrad #   scripts that are the output of Autoconf when processing the Macro. You
     75  1.1  riastrad #   need not follow the terms of the GNU General Public License when using
     76  1.1  riastrad #   or distributing such scripts, even though portions of the text of the
     77  1.1  riastrad #   Macro appear in them. The GNU General Public License (GPL) does govern
     78  1.1  riastrad #   all other use of the material that constitutes the Autoconf Macro.
     79  1.1  riastrad #
     80  1.1  riastrad #   This special exception to the GPL applies to versions of the Autoconf
     81  1.1  riastrad #   Macro released by the Autoconf Archive. When you make and distribute a
     82  1.1  riastrad #   modified version of the Autoconf Macro, you may extend this special
     83  1.1  riastrad #   exception to the GPL to apply to your modified version as well.
     84  1.1  riastrad 
     85  1.1  riastrad #serial 24
     86  1.1  riastrad 
     87  1.1  riastrad AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD])
     88  1.1  riastrad AC_DEFUN([AX_PTHREAD], [
     89  1.1  riastrad AC_REQUIRE([AC_CANONICAL_HOST])
     90  1.1  riastrad AC_REQUIRE([AC_PROG_CC])
     91  1.1  riastrad AC_REQUIRE([AC_PROG_SED])
     92  1.1  riastrad AC_LANG_PUSH([C])
     93  1.1  riastrad ax_pthread_ok=no
     94  1.1  riastrad 
     95  1.1  riastrad # We used to check for pthread.h first, but this fails if pthread.h
     96  1.1  riastrad # requires special compiler flags (e.g. on Tru64 or Sequent).
     97  1.1  riastrad # It gets checked for in the link test anyway.
     98  1.1  riastrad 
     99  1.1  riastrad # First of all, check if the user has set any of the PTHREAD_LIBS,
    100  1.1  riastrad # etcetera environment variables, and if threads linking works using
    101  1.1  riastrad # them:
    102  1.1  riastrad if test "x$PTHREAD_CFLAGS$PTHREAD_LIBS" != "x"; then
    103  1.1  riastrad         ax_pthread_save_CC="$CC"
    104  1.1  riastrad         ax_pthread_save_CFLAGS="$CFLAGS"
    105  1.1  riastrad         ax_pthread_save_LIBS="$LIBS"
    106  1.1  riastrad         AS_IF([test "x$PTHREAD_CC" != "x"], [CC="$PTHREAD_CC"])
    107  1.1  riastrad         CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
    108  1.1  riastrad         LIBS="$PTHREAD_LIBS $LIBS"
    109  1.1  riastrad         AC_MSG_CHECKING([for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS])
    110  1.1  riastrad         AC_LINK_IFELSE([AC_LANG_CALL([], [pthread_join])], [ax_pthread_ok=yes])
    111  1.1  riastrad         AC_MSG_RESULT([$ax_pthread_ok])
    112  1.1  riastrad         if test "x$ax_pthread_ok" = "xno"; then
    113  1.1  riastrad                 PTHREAD_LIBS=""
    114  1.1  riastrad                 PTHREAD_CFLAGS=""
    115  1.1  riastrad         fi
    116  1.1  riastrad         CC="$ax_pthread_save_CC"
    117  1.1  riastrad         CFLAGS="$ax_pthread_save_CFLAGS"
    118  1.1  riastrad         LIBS="$ax_pthread_save_LIBS"
    119  1.1  riastrad fi
    120  1.1  riastrad 
    121  1.1  riastrad # We must check for the threads library under a number of different
    122  1.1  riastrad # names; the ordering is very important because some systems
    123  1.1  riastrad # (e.g. DEC) have both -lpthread and -lpthreads, where one of the
    124  1.1  riastrad # libraries is broken (non-POSIX).
    125  1.1  riastrad 
    126  1.1  riastrad # Create a list of thread flags to try.  Items starting with a "-" are
    127  1.1  riastrad # C compiler flags, and other items are library names, except for "none"
    128  1.1  riastrad # which indicates that we try without any flags at all, and "pthread-config"
    129  1.1  riastrad # which is a program returning the flags for the Pth emulation library.
    130  1.1  riastrad 
    131  1.1  riastrad ax_pthread_flags="pthreads none -Kthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config"
    132  1.1  riastrad 
    133  1.1  riastrad # The ordering *is* (sometimes) important.  Some notes on the
    134  1.1  riastrad # individual items follow:
    135  1.1  riastrad 
    136  1.1  riastrad # pthreads: AIX (must check this before -lpthread)
    137  1.1  riastrad # none: in case threads are in libc; should be tried before -Kthread and
    138  1.1  riastrad #       other compiler flags to prevent continual compiler warnings
    139  1.1  riastrad # -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)
    140  1.1  riastrad # -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads), Tru64
    141  1.1  riastrad #           (Note: HP C rejects this with "bad form for `-t' option")
    142  1.1  riastrad # -pthreads: Solaris/gcc (Note: HP C also rejects)
    143  1.1  riastrad # -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it
    144  1.1  riastrad #      doesn't hurt to check since this sometimes defines pthreads and
    145  1.1  riastrad #      -D_REENTRANT too), HP C (must be checked before -lpthread, which
    146  1.1  riastrad #      is present but should not be used directly; and before -mthreads,
    147  1.1  riastrad #      because the compiler interprets this as "-mt" + "-hreads")
    148  1.1  riastrad # -mthreads: Mingw32/gcc, Lynx/gcc
    149  1.1  riastrad # pthread: Linux, etcetera
    150  1.1  riastrad # --thread-safe: KAI C++
    151  1.1  riastrad # pthread-config: use pthread-config program (for GNU Pth library)
    152  1.1  riastrad 
    153  1.1  riastrad case $host_os in
    154  1.1  riastrad 
    155  1.1  riastrad         freebsd*)
    156  1.1  riastrad 
    157  1.1  riastrad         # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)
    158  1.1  riastrad         # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)
    159  1.1  riastrad 
    160  1.1  riastrad         ax_pthread_flags="-kthread lthread $ax_pthread_flags"
    161  1.1  riastrad         ;;
    162  1.1  riastrad 
    163  1.1  riastrad         hpux*)
    164  1.1  riastrad 
    165  1.1  riastrad         # From the cc(1) man page: "[-mt] Sets various -D flags to enable
    166  1.1  riastrad         # multi-threading and also sets -lpthread."
    167  1.1  riastrad 
    168  1.1  riastrad         ax_pthread_flags="-mt -pthread pthread $ax_pthread_flags"
    169  1.1  riastrad         ;;
    170  1.1  riastrad 
    171  1.1  riastrad         openedition*)
    172  1.1  riastrad 
    173  1.1  riastrad         # IBM z/OS requires a feature-test macro to be defined in order to
    174  1.1  riastrad         # enable POSIX threads at all, so give the user a hint if this is
    175  1.1  riastrad         # not set. (We don't define these ourselves, as they can affect
    176  1.1  riastrad         # other portions of the system API in unpredictable ways.)
    177  1.1  riastrad 
    178  1.1  riastrad         AC_EGREP_CPP([AX_PTHREAD_ZOS_MISSING],
    179  1.1  riastrad             [
    180  1.1  riastrad #            if !defined(_OPEN_THREADS) && !defined(_UNIX03_THREADS)
    181  1.1  riastrad              AX_PTHREAD_ZOS_MISSING
    182  1.1  riastrad #            endif
    183  1.1  riastrad             ],
    184  1.1  riastrad             [AC_MSG_WARN([IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support.])])
    185  1.1  riastrad         ;;
    186  1.1  riastrad 
    187  1.1  riastrad         solaris*)
    188  1.1  riastrad 
    189  1.1  riastrad         # On Solaris (at least, for some versions), libc contains stubbed
    190  1.1  riastrad         # (non-functional) versions of the pthreads routines, so link-based
    191  1.1  riastrad         # tests will erroneously succeed. (N.B.: The stubs are missing
    192  1.1  riastrad         # pthread_cleanup_push, or rather a function called by this macro,
    193  1.1  riastrad         # so we could check for that, but who knows whether they'll stub
    194  1.1  riastrad         # that too in a future libc.)  So we'll check first for the
    195  1.1  riastrad         # standard Solaris way of linking pthreads (-mt -lpthread).
    196  1.1  riastrad 
    197  1.1  riastrad         ax_pthread_flags="-mt,pthread pthread $ax_pthread_flags"
    198  1.1  riastrad         ;;
    199  1.1  riastrad esac
    200  1.1  riastrad 
    201  1.1  riastrad # GCC generally uses -pthread, or -pthreads on some platforms (e.g. SPARC)
    202  1.1  riastrad 
    203  1.1  riastrad AS_IF([test "x$GCC" = "xyes"],
    204  1.1  riastrad       [ax_pthread_flags="-pthread -pthreads $ax_pthread_flags"])
    205  1.1  riastrad 
    206  1.1  riastrad # The presence of a feature test macro requesting re-entrant function
    207  1.1  riastrad # definitions is, on some systems, a strong hint that pthreads support is
    208  1.1  riastrad # correctly enabled
    209  1.1  riastrad 
    210  1.1  riastrad case $host_os in
    211  1.1  riastrad         darwin* | hpux* | linux* | osf* | solaris*)
    212  1.1  riastrad         ax_pthread_check_macro="_REENTRANT"
    213  1.1  riastrad         ;;
    214  1.1  riastrad 
    215  1.1  riastrad         aix*)
    216  1.1  riastrad         ax_pthread_check_macro="_THREAD_SAFE"
    217  1.1  riastrad         ;;
    218  1.1  riastrad 
    219  1.1  riastrad         *)
    220  1.1  riastrad         ax_pthread_check_macro="--"
    221  1.1  riastrad         ;;
    222  1.1  riastrad esac
    223  1.1  riastrad AS_IF([test "x$ax_pthread_check_macro" = "x--"],
    224  1.1  riastrad       [ax_pthread_check_cond=0],
    225  1.1  riastrad       [ax_pthread_check_cond="!defined($ax_pthread_check_macro)"])
    226  1.1  riastrad 
    227  1.1  riastrad # Are we compiling with Clang?
    228  1.1  riastrad 
    229  1.1  riastrad AC_CACHE_CHECK([whether $CC is Clang],
    230  1.1  riastrad     [ax_cv_PTHREAD_CLANG],
    231  1.1  riastrad     [ax_cv_PTHREAD_CLANG=no
    232  1.1  riastrad      # Note that Autoconf sets GCC=yes for Clang as well as GCC
    233  1.1  riastrad      if test "x$GCC" = "xyes"; then
    234  1.1  riastrad         AC_EGREP_CPP([AX_PTHREAD_CC_IS_CLANG],
    235  1.1  riastrad             [/* Note: Clang 2.7 lacks __clang_[a-z]+__ */
    236  1.1  riastrad #            if defined(__clang__) && defined(__llvm__)
    237  1.1  riastrad              AX_PTHREAD_CC_IS_CLANG
    238  1.1  riastrad #            endif
    239  1.1  riastrad             ],
    240  1.1  riastrad             [ax_cv_PTHREAD_CLANG=yes])
    241  1.1  riastrad      fi
    242  1.1  riastrad     ])
    243  1.1  riastrad ax_pthread_clang="$ax_cv_PTHREAD_CLANG"
    244  1.1  riastrad 
    245  1.1  riastrad ax_pthread_clang_warning=no
    246  1.1  riastrad 
    247  1.1  riastrad # Clang needs special handling, because older versions handle the -pthread
    248  1.1  riastrad # option in a rather... idiosyncratic way
    249  1.1  riastrad 
    250  1.1  riastrad if test "x$ax_pthread_clang" = "xyes"; then
    251  1.1  riastrad 
    252  1.1  riastrad         # Clang takes -pthread; it has never supported any other flag
    253  1.1  riastrad 
    254  1.1  riastrad         # (Note 1: This will need to be revisited if a system that Clang
    255  1.1  riastrad         # supports has POSIX threads in a separate library.  This tends not
    256  1.1  riastrad         # to be the way of modern systems, but it's conceivable.)
    257  1.1  riastrad 
    258  1.1  riastrad         # (Note 2: On some systems, notably Darwin, -pthread is not needed
    259  1.1  riastrad         # to get POSIX threads support; the API is always present and
    260  1.1  riastrad         # active.  We could reasonably leave PTHREAD_CFLAGS empty.  But
    261  1.1  riastrad         # -pthread does define _REENTRANT, and while the Darwin headers
    262  1.1  riastrad         # ignore this macro, third-party headers might not.)
    263  1.1  riastrad 
    264  1.1  riastrad         PTHREAD_CFLAGS="-pthread"
    265  1.1  riastrad         PTHREAD_LIBS=
    266  1.1  riastrad 
    267  1.1  riastrad         ax_pthread_ok=yes
    268  1.1  riastrad 
    269  1.1  riastrad         # However, older versions of Clang make a point of warning the user
    270  1.1  riastrad         # that, in an invocation where only linking and no compilation is
    271  1.1  riastrad         # taking place, the -pthread option has no effect ("argument unused
    272  1.1  riastrad         # during compilation").  They expect -pthread to be passed in only
    273  1.1  riastrad         # when source code is being compiled.
    274  1.1  riastrad         #
    275  1.1  riastrad         # Problem is, this is at odds with the way Automake and most other
    276  1.1  riastrad         # C build frameworks function, which is that the same flags used in
    277  1.1  riastrad         # compilation (CFLAGS) are also used in linking.  Many systems
    278  1.1  riastrad         # supported by AX_PTHREAD require exactly this for POSIX threads
    279  1.1  riastrad         # support, and in fact it is often not straightforward to specify a
    280  1.1  riastrad         # flag that is used only in the compilation phase and not in
    281  1.1  riastrad         # linking.  Such a scenario is extremely rare in practice.
    282  1.1  riastrad         #
    283  1.1  riastrad         # Even though use of the -pthread flag in linking would only print
    284  1.1  riastrad         # a warning, this can be a nuisance for well-run software projects
    285  1.1  riastrad         # that build with -Werror.  So if the active version of Clang has
    286  1.1  riastrad         # this misfeature, we search for an option to squash it.
    287  1.1  riastrad 
    288  1.1  riastrad         AC_CACHE_CHECK([whether Clang needs flag to prevent "argument unused" warning when linking with -pthread],
    289  1.1  riastrad             [ax_cv_PTHREAD_CLANG_NO_WARN_FLAG],
    290  1.1  riastrad             [ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown
    291  1.1  riastrad              # Create an alternate version of $ac_link that compiles and
    292  1.1  riastrad              # links in two steps (.c -> .o, .o -> exe) instead of one
    293  1.1  riastrad              # (.c -> exe), because the warning occurs only in the second
    294  1.1  riastrad              # step
    295  1.1  riastrad              ax_pthread_save_ac_link="$ac_link"
    296  1.1  riastrad              ax_pthread_sed='s/conftest\.\$ac_ext/conftest.$ac_objext/g'
    297  1.1  riastrad              ax_pthread_link_step=`$as_echo "$ac_link" | sed "$ax_pthread_sed"`
    298  1.1  riastrad              ax_pthread_2step_ac_link="($ac_compile) && (echo ==== >&5) && ($ax_pthread_link_step)"
    299  1.1  riastrad              ax_pthread_save_CFLAGS="$CFLAGS"
    300  1.1  riastrad              for ax_pthread_try in '' -Qunused-arguments -Wno-unused-command-line-argument unknown; do
    301  1.1  riastrad                 AS_IF([test "x$ax_pthread_try" = "xunknown"], [break])
    302  1.1  riastrad                 CFLAGS="-Werror -Wunknown-warning-option $ax_pthread_try -pthread $ax_pthread_save_CFLAGS"
    303  1.1  riastrad                 ac_link="$ax_pthread_save_ac_link"
    304  1.1  riastrad                 AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])],
    305  1.1  riastrad                     [ac_link="$ax_pthread_2step_ac_link"
    306  1.1  riastrad                      AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])],
    307  1.1  riastrad                          [break])
    308  1.1  riastrad                     ])
    309  1.1  riastrad              done
    310  1.1  riastrad              ac_link="$ax_pthread_save_ac_link"
    311  1.1  riastrad              CFLAGS="$ax_pthread_save_CFLAGS"
    312  1.1  riastrad              AS_IF([test "x$ax_pthread_try" = "x"], [ax_pthread_try=no])
    313  1.1  riastrad              ax_cv_PTHREAD_CLANG_NO_WARN_FLAG="$ax_pthread_try"
    314  1.1  riastrad             ])
    315  1.1  riastrad 
    316  1.1  riastrad         case "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" in
    317  1.1  riastrad                 no | unknown) ;;
    318  1.1  riastrad                 *) PTHREAD_CFLAGS="$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG $PTHREAD_CFLAGS" ;;
    319  1.1  riastrad         esac
    320  1.1  riastrad 
    321  1.1  riastrad fi # $ax_pthread_clang = yes
    322  1.1  riastrad 
    323  1.1  riastrad if test "x$ax_pthread_ok" = "xno"; then
    324  1.1  riastrad for ax_pthread_try_flag in $ax_pthread_flags; do
    325  1.1  riastrad 
    326  1.1  riastrad         case $ax_pthread_try_flag in
    327  1.1  riastrad                 none)
    328  1.1  riastrad                 AC_MSG_CHECKING([whether pthreads work without any flags])
    329  1.1  riastrad                 ;;
    330  1.1  riastrad 
    331  1.1  riastrad                 -mt,pthread)
    332  1.1  riastrad                 AC_MSG_CHECKING([whether pthreads work with -mt -lpthread])
    333  1.1  riastrad                 PTHREAD_CFLAGS="-mt"
    334  1.1  riastrad                 PTHREAD_LIBS="-lpthread"
    335  1.1  riastrad                 ;;
    336  1.1  riastrad 
    337  1.1  riastrad                 -*)
    338  1.1  riastrad                 AC_MSG_CHECKING([whether pthreads work with $ax_pthread_try_flag])
    339  1.1  riastrad                 PTHREAD_CFLAGS="$ax_pthread_try_flag"
    340  1.1  riastrad                 ;;
    341  1.1  riastrad 
    342  1.1  riastrad                 pthread-config)
    343  1.1  riastrad                 AC_CHECK_PROG([ax_pthread_config], [pthread-config], [yes], [no])
    344  1.1  riastrad                 AS_IF([test "x$ax_pthread_config" = "xno"], [continue])
    345  1.1  riastrad                 PTHREAD_CFLAGS="`pthread-config --cflags`"
    346  1.1  riastrad                 PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`"
    347  1.1  riastrad                 ;;
    348  1.1  riastrad 
    349  1.1  riastrad                 *)
    350  1.1  riastrad                 AC_MSG_CHECKING([for the pthreads library -l$ax_pthread_try_flag])
    351  1.1  riastrad                 PTHREAD_LIBS="-l$ax_pthread_try_flag"
    352  1.1  riastrad                 ;;
    353  1.1  riastrad         esac
    354  1.1  riastrad 
    355  1.1  riastrad         ax_pthread_save_CFLAGS="$CFLAGS"
    356  1.1  riastrad         ax_pthread_save_LIBS="$LIBS"
    357  1.1  riastrad         CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
    358  1.1  riastrad         LIBS="$PTHREAD_LIBS $LIBS"
    359  1.1  riastrad 
    360  1.1  riastrad         # Check for various functions.  We must include pthread.h,
    361  1.1  riastrad         # since some functions may be macros.  (On the Sequent, we
    362  1.1  riastrad         # need a special flag -Kthread to make this header compile.)
    363  1.1  riastrad         # We check for pthread_join because it is in -lpthread on IRIX
    364  1.1  riastrad         # while pthread_create is in libc.  We check for pthread_attr_init
    365  1.1  riastrad         # due to DEC craziness with -lpthreads.  We check for
    366  1.1  riastrad         # pthread_cleanup_push because it is one of the few pthread
    367  1.1  riastrad         # functions on Solaris that doesn't have a non-functional libc stub.
    368  1.1  riastrad         # We try pthread_create on general principles.
    369  1.1  riastrad 
    370  1.1  riastrad         AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <pthread.h>
    371  1.1  riastrad #                       if $ax_pthread_check_cond
    372  1.1  riastrad #                        error "$ax_pthread_check_macro must be defined"
    373  1.1  riastrad #                       endif
    374  1.1  riastrad                         static void routine(void *a) { a = 0; }
    375  1.1  riastrad                         static void *start_routine(void *a) { return a; }],
    376  1.1  riastrad                        [pthread_t th; pthread_attr_t attr;
    377  1.1  riastrad                         pthread_create(&th, 0, start_routine, 0);
    378  1.1  riastrad                         pthread_join(th, 0);
    379  1.1  riastrad                         pthread_attr_init(&attr);
    380  1.1  riastrad                         pthread_cleanup_push(routine, 0);
    381  1.1  riastrad                         pthread_cleanup_pop(0) /* ; */])],
    382  1.1  riastrad             [ax_pthread_ok=yes],
    383  1.1  riastrad             [])
    384  1.1  riastrad 
    385  1.1  riastrad         CFLAGS="$ax_pthread_save_CFLAGS"
    386  1.1  riastrad         LIBS="$ax_pthread_save_LIBS"
    387  1.1  riastrad 
    388  1.1  riastrad         AC_MSG_RESULT([$ax_pthread_ok])
    389  1.1  riastrad         AS_IF([test "x$ax_pthread_ok" = "xyes"], [break])
    390  1.1  riastrad 
    391  1.1  riastrad         PTHREAD_LIBS=""
    392  1.1  riastrad         PTHREAD_CFLAGS=""
    393  1.1  riastrad done
    394  1.1  riastrad fi
    395  1.1  riastrad 
    396  1.1  riastrad # Various other checks:
    397  1.1  riastrad if test "x$ax_pthread_ok" = "xyes"; then
    398  1.1  riastrad         ax_pthread_save_CFLAGS="$CFLAGS"
    399  1.1  riastrad         ax_pthread_save_LIBS="$LIBS"
    400  1.1  riastrad         CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
    401  1.1  riastrad         LIBS="$PTHREAD_LIBS $LIBS"
    402  1.1  riastrad 
    403  1.1  riastrad         # Detect AIX lossage: JOINABLE attribute is called UNDETACHED.
    404  1.1  riastrad         AC_CACHE_CHECK([for joinable pthread attribute],
    405  1.1  riastrad             [ax_cv_PTHREAD_JOINABLE_ATTR],
    406  1.1  riastrad             [ax_cv_PTHREAD_JOINABLE_ATTR=unknown
    407  1.1  riastrad              for ax_pthread_attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do
    408  1.1  riastrad                  AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <pthread.h>],
    409  1.1  riastrad                                                  [int attr = $ax_pthread_attr; return attr /* ; */])],
    410  1.1  riastrad                                 [ax_cv_PTHREAD_JOINABLE_ATTR=$ax_pthread_attr; break],
    411  1.1  riastrad                                 [])
    412  1.1  riastrad              done
    413  1.1  riastrad             ])
    414  1.1  riastrad         AS_IF([test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xunknown" && \
    415  1.1  riastrad                test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xPTHREAD_CREATE_JOINABLE" && \
    416  1.1  riastrad                test "x$ax_pthread_joinable_attr_defined" != "xyes"],
    417  1.1  riastrad               [AC_DEFINE_UNQUOTED([PTHREAD_CREATE_JOINABLE],
    418  1.1  riastrad                                   [$ax_cv_PTHREAD_JOINABLE_ATTR],
    419  1.1  riastrad                                   [Define to necessary symbol if this constant
    420  1.1  riastrad                                    uses a non-standard name on your system.])
    421  1.1  riastrad                ax_pthread_joinable_attr_defined=yes
    422  1.1  riastrad               ])
    423  1.1  riastrad 
    424  1.1  riastrad         AC_CACHE_CHECK([whether more special flags are required for pthreads],
    425  1.1  riastrad             [ax_cv_PTHREAD_SPECIAL_FLAGS],
    426  1.1  riastrad             [ax_cv_PTHREAD_SPECIAL_FLAGS=no
    427  1.1  riastrad              case $host_os in
    428  1.1  riastrad              solaris*)
    429  1.1  riastrad              ax_cv_PTHREAD_SPECIAL_FLAGS="-D_POSIX_PTHREAD_SEMANTICS"
    430  1.1  riastrad              ;;
    431  1.1  riastrad              esac
    432  1.1  riastrad             ])
    433  1.1  riastrad         AS_IF([test "x$ax_cv_PTHREAD_SPECIAL_FLAGS" != "xno" && \
    434  1.1  riastrad                test "x$ax_pthread_special_flags_added" != "xyes"],
    435  1.1  riastrad               [PTHREAD_CFLAGS="$ax_cv_PTHREAD_SPECIAL_FLAGS $PTHREAD_CFLAGS"
    436  1.1  riastrad                ax_pthread_special_flags_added=yes])
    437  1.1  riastrad 
    438  1.1  riastrad         AC_CACHE_CHECK([for PTHREAD_PRIO_INHERIT],
    439  1.1  riastrad             [ax_cv_PTHREAD_PRIO_INHERIT],
    440  1.1  riastrad             [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <pthread.h>]],
    441  1.1  riastrad                                              [[int i = PTHREAD_PRIO_INHERIT;]])],
    442  1.1  riastrad                             [ax_cv_PTHREAD_PRIO_INHERIT=yes],
    443  1.1  riastrad                             [ax_cv_PTHREAD_PRIO_INHERIT=no])
    444  1.1  riastrad             ])
    445  1.1  riastrad         AS_IF([test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes" && \
    446  1.1  riastrad                test "x$ax_pthread_prio_inherit_defined" != "xyes"],
    447  1.1  riastrad               [AC_DEFINE([HAVE_PTHREAD_PRIO_INHERIT], [1], [Have PTHREAD_PRIO_INHERIT.])
    448  1.1  riastrad                ax_pthread_prio_inherit_defined=yes
    449  1.1  riastrad               ])
    450  1.1  riastrad 
    451  1.1  riastrad         CFLAGS="$ax_pthread_save_CFLAGS"
    452  1.1  riastrad         LIBS="$ax_pthread_save_LIBS"
    453  1.1  riastrad 
    454  1.1  riastrad         # More AIX lossage: compile with *_r variant
    455  1.1  riastrad         if test "x$GCC" != "xyes"; then
    456  1.1  riastrad             case $host_os in
    457  1.1  riastrad                 aix*)
    458  1.1  riastrad                 AS_CASE(["x/$CC"],
    459  1.1  riastrad                     [x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6],
    460  1.1  riastrad                     [#handle absolute path differently from PATH based program lookup
    461  1.1  riastrad                      AS_CASE(["x$CC"],
    462  1.1  riastrad                          [x/*],
    463  1.1  riastrad                          [AS_IF([AS_EXECUTABLE_P([${CC}_r])],[PTHREAD_CC="${CC}_r"])],
    464  1.1  riastrad                          [AC_CHECK_PROGS([PTHREAD_CC],[${CC}_r],[$CC])])])
    465  1.1  riastrad                 ;;
    466  1.1  riastrad             esac
    467  1.1  riastrad         fi
    468  1.1  riastrad fi
    469  1.1  riastrad 
    470  1.1  riastrad test -n "$PTHREAD_CC" || PTHREAD_CC="$CC"
    471  1.1  riastrad 
    472  1.1  riastrad AC_SUBST([PTHREAD_LIBS])
    473  1.1  riastrad AC_SUBST([PTHREAD_CFLAGS])
    474  1.1  riastrad AC_SUBST([PTHREAD_CC])
    475  1.1  riastrad 
    476  1.1  riastrad # Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
    477  1.1  riastrad if test "x$ax_pthread_ok" = "xyes"; then
    478  1.1  riastrad         ifelse([$1],,[AC_DEFINE([HAVE_PTHREAD],[1],[Define if you have POSIX threads libraries and header files.])],[$1])
    479  1.1  riastrad         :
    480  1.1  riastrad else
    481  1.1  riastrad         ax_pthread_ok=no
    482  1.1  riastrad         $2
    483  1.1  riastrad fi
    484  1.1  riastrad AC_LANG_POP
    485  1.1  riastrad ])dnl AX_PTHREAD
    486