1*e985b929SDavid van Moolenbroek##### http://autoconf-archive.cryp.to/acx_pthread.html 2*e985b929SDavid van Moolenbroek# 3*e985b929SDavid van Moolenbroek# SYNOPSIS 4*e985b929SDavid van Moolenbroek# 5*e985b929SDavid van Moolenbroek# ACX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) 6*e985b929SDavid van Moolenbroek# 7*e985b929SDavid van Moolenbroek# DESCRIPTION 8*e985b929SDavid van Moolenbroek# 9*e985b929SDavid van Moolenbroek# This macro figures out how to build C programs using POSIX threads. 10*e985b929SDavid van Moolenbroek# It sets the PTHREAD_LIBS output variable to the threads library and 11*e985b929SDavid van Moolenbroek# linker flags, and the PTHREAD_CFLAGS output variable to any special 12*e985b929SDavid van Moolenbroek# C compiler flags that are needed. (The user can also force certain 13*e985b929SDavid van Moolenbroek# compiler flags/libs to be tested by setting these environment 14*e985b929SDavid van Moolenbroek# variables.) 15*e985b929SDavid van Moolenbroek# 16*e985b929SDavid van Moolenbroek# Also sets PTHREAD_CC to any special C compiler that is needed for 17*e985b929SDavid van Moolenbroek# multi-threaded programs (defaults to the value of CC otherwise). 18*e985b929SDavid van Moolenbroek# (This is necessary on AIX to use the special cc_r compiler alias.) 19*e985b929SDavid van Moolenbroek# 20*e985b929SDavid van Moolenbroek# NOTE: You are assumed to not only compile your program with these 21*e985b929SDavid van Moolenbroek# flags, but also link it with them as well. e.g. you should link 22*e985b929SDavid van Moolenbroek# with $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS 23*e985b929SDavid van Moolenbroek# $LIBS 24*e985b929SDavid van Moolenbroek# 25*e985b929SDavid van Moolenbroek# If you are only building threads programs, you may wish to use 26*e985b929SDavid van Moolenbroek# these variables in your default LIBS, CFLAGS, and CC: 27*e985b929SDavid van Moolenbroek# 28*e985b929SDavid van Moolenbroek# LIBS="$PTHREAD_LIBS $LIBS" 29*e985b929SDavid van Moolenbroek# CFLAGS="$CFLAGS $PTHREAD_CFLAGS" 30*e985b929SDavid van Moolenbroek# CC="$PTHREAD_CC" 31*e985b929SDavid van Moolenbroek# 32*e985b929SDavid van Moolenbroek# In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute 33*e985b929SDavid van Moolenbroek# constant has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to 34*e985b929SDavid van Moolenbroek# that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX). 35*e985b929SDavid van Moolenbroek# 36*e985b929SDavid van Moolenbroek# ACTION-IF-FOUND is a list of shell commands to run if a threads 37*e985b929SDavid van Moolenbroek# library is found, and ACTION-IF-NOT-FOUND is a list of commands to 38*e985b929SDavid van Moolenbroek# run it if it is not found. If ACTION-IF-FOUND is not specified, the 39*e985b929SDavid van Moolenbroek# default action will define HAVE_PTHREAD. 40*e985b929SDavid van Moolenbroek# 41*e985b929SDavid van Moolenbroek# Please let the authors know if this macro fails on any platform, or 42*e985b929SDavid van Moolenbroek# if you have any other suggestions or comments. This macro was based 43*e985b929SDavid van Moolenbroek# on work by SGJ on autoconf scripts for FFTW (http://www.fftw.org/) 44*e985b929SDavid van Moolenbroek# (with help from M. Frigo), as well as ac_pthread and hb_pthread 45*e985b929SDavid van Moolenbroek# macros posted by Alejandro Forero Cuervo to the autoconf macro 46*e985b929SDavid van Moolenbroek# repository. We are also grateful for the helpful feedback of 47*e985b929SDavid van Moolenbroek# numerous users. 48*e985b929SDavid van Moolenbroek# 49*e985b929SDavid van Moolenbroek# LAST MODIFICATION 50*e985b929SDavid van Moolenbroek# 51*e985b929SDavid van Moolenbroek# 2007-07-29 52*e985b929SDavid van Moolenbroek# 53*e985b929SDavid van Moolenbroek# COPYLEFT 54*e985b929SDavid van Moolenbroek# 55*e985b929SDavid van Moolenbroek# Copyright (c) 2007 Steven G. Johnson <stevenj@alum.mit.edu> 56*e985b929SDavid van Moolenbroek# 57*e985b929SDavid van Moolenbroek# This program is free software: you can redistribute it and/or 58*e985b929SDavid van Moolenbroek# modify it under the terms of the GNU General Public License as 59*e985b929SDavid van Moolenbroek# published by the Free Software Foundation, either version 3 of the 60*e985b929SDavid van Moolenbroek# License, or (at your option) any later version. 61*e985b929SDavid van Moolenbroek# 62*e985b929SDavid van Moolenbroek# This program is distributed in the hope that it will be useful, but 63*e985b929SDavid van Moolenbroek# WITHOUT ANY WARRANTY; without even the implied warranty of 64*e985b929SDavid van Moolenbroek# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 65*e985b929SDavid van Moolenbroek# General Public License for more details. 66*e985b929SDavid van Moolenbroek# 67*e985b929SDavid van Moolenbroek# You should have received a copy of the GNU General Public License 68*e985b929SDavid van Moolenbroek# along with this program. If not, see 69*e985b929SDavid van Moolenbroek# <http://www.gnu.org/licenses/>. 70*e985b929SDavid van Moolenbroek# 71*e985b929SDavid van Moolenbroek# As a special exception, the respective Autoconf Macro's copyright 72*e985b929SDavid van Moolenbroek# owner gives unlimited permission to copy, distribute and modify the 73*e985b929SDavid van Moolenbroek# configure scripts that are the output of Autoconf when processing 74*e985b929SDavid van Moolenbroek# the Macro. You need not follow the terms of the GNU General Public 75*e985b929SDavid van Moolenbroek# License when using or distributing such scripts, even though 76*e985b929SDavid van Moolenbroek# portions of the text of the Macro appear in them. The GNU General 77*e985b929SDavid van Moolenbroek# Public License (GPL) does govern all other use of the material that 78*e985b929SDavid van Moolenbroek# constitutes the Autoconf Macro. 79*e985b929SDavid van Moolenbroek# 80*e985b929SDavid van Moolenbroek# This special exception to the GPL applies to versions of the 81*e985b929SDavid van Moolenbroek# Autoconf Macro released by the Autoconf Macro Archive. When you 82*e985b929SDavid van Moolenbroek# make and distribute a modified version of the Autoconf Macro, you 83*e985b929SDavid van Moolenbroek# may extend this special exception to the GPL to apply to your 84*e985b929SDavid van Moolenbroek# modified version as well. 85*e985b929SDavid van Moolenbroek 86*e985b929SDavid van MoolenbroekAC_DEFUN([ACX_PTHREAD], [ 87*e985b929SDavid van MoolenbroekAC_REQUIRE([AC_CANONICAL_HOST]) 88*e985b929SDavid van MoolenbroekAC_LANG_SAVE 89*e985b929SDavid van MoolenbroekAC_LANG_C 90*e985b929SDavid van Moolenbroekacx_pthread_ok=no 91*e985b929SDavid van Moolenbroek 92*e985b929SDavid van Moolenbroek# We used to check for pthread.h first, but this fails if pthread.h 93*e985b929SDavid van Moolenbroek# requires special compiler flags (e.g. on True64 or Sequent). 94*e985b929SDavid van Moolenbroek# It gets checked for in the link test anyway. 95*e985b929SDavid van Moolenbroek 96*e985b929SDavid van Moolenbroek# First of all, check if the user has set any of the PTHREAD_LIBS, 97*e985b929SDavid van Moolenbroek# etcetera environment variables, and if threads linking works using 98*e985b929SDavid van Moolenbroek# them: 99*e985b929SDavid van Moolenbroekif test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then 100*e985b929SDavid van Moolenbroek save_CFLAGS="$CFLAGS" 101*e985b929SDavid van Moolenbroek CFLAGS="$CFLAGS $PTHREAD_CFLAGS" 102*e985b929SDavid van Moolenbroek save_LIBS="$LIBS" 103*e985b929SDavid van Moolenbroek LIBS="$PTHREAD_LIBS $LIBS" 104*e985b929SDavid van Moolenbroek AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS]) 105*e985b929SDavid van Moolenbroek AC_TRY_LINK_FUNC(pthread_join, acx_pthread_ok=yes) 106*e985b929SDavid van Moolenbroek AC_MSG_RESULT($acx_pthread_ok) 107*e985b929SDavid van Moolenbroek if test x"$acx_pthread_ok" = xno; then 108*e985b929SDavid van Moolenbroek PTHREAD_LIBS="" 109*e985b929SDavid van Moolenbroek PTHREAD_CFLAGS="" 110*e985b929SDavid van Moolenbroek fi 111*e985b929SDavid van Moolenbroek LIBS="$save_LIBS" 112*e985b929SDavid van Moolenbroek CFLAGS="$save_CFLAGS" 113*e985b929SDavid van Moolenbroekfi 114*e985b929SDavid van Moolenbroek 115*e985b929SDavid van Moolenbroek# We must check for the threads library under a number of different 116*e985b929SDavid van Moolenbroek# names; the ordering is very important because some systems 117*e985b929SDavid van Moolenbroek# (e.g. DEC) have both -lpthread and -lpthreads, where one of the 118*e985b929SDavid van Moolenbroek# libraries is broken (non-POSIX). 119*e985b929SDavid van Moolenbroek 120*e985b929SDavid van Moolenbroek# Create a list of thread flags to try. Items starting with a "-" are 121*e985b929SDavid van Moolenbroek# C compiler flags, and other items are library names, except for "none" 122*e985b929SDavid van Moolenbroek# which indicates that we try without any flags at all, and "pthread-config" 123*e985b929SDavid van Moolenbroek# which is a program returning the flags for the Pth emulation library. 124*e985b929SDavid van Moolenbroek 125*e985b929SDavid van Moolenbroekacx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" 126*e985b929SDavid van Moolenbroek 127*e985b929SDavid van Moolenbroek# The ordering *is* (sometimes) important. Some notes on the 128*e985b929SDavid van Moolenbroek# individual items follow: 129*e985b929SDavid van Moolenbroek 130*e985b929SDavid van Moolenbroek# pthreads: AIX (must check this before -lpthread) 131*e985b929SDavid van Moolenbroek# none: in case threads are in libc; should be tried before -Kthread and 132*e985b929SDavid van Moolenbroek# other compiler flags to prevent continual compiler warnings 133*e985b929SDavid van Moolenbroek# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) 134*e985b929SDavid van Moolenbroek# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) 135*e985b929SDavid van Moolenbroek# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) 136*e985b929SDavid van Moolenbroek# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) 137*e985b929SDavid van Moolenbroek# -pthreads: Solaris/gcc 138*e985b929SDavid van Moolenbroek# -mthreads: Mingw32/gcc, Lynx/gcc 139*e985b929SDavid van Moolenbroek# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it 140*e985b929SDavid van Moolenbroek# doesn't hurt to check since this sometimes defines pthreads too; 141*e985b929SDavid van Moolenbroek# also defines -D_REENTRANT) 142*e985b929SDavid van Moolenbroek# ... -mt is also the pthreads flag for HP/aCC 143*e985b929SDavid van Moolenbroek# pthread: Linux, etcetera 144*e985b929SDavid van Moolenbroek# --thread-safe: KAI C++ 145*e985b929SDavid van Moolenbroek# pthread-config: use pthread-config program (for GNU Pth library) 146*e985b929SDavid van Moolenbroek 147*e985b929SDavid van Moolenbroekcase "${host_cpu}-${host_os}" in 148*e985b929SDavid van Moolenbroek *solaris*) 149*e985b929SDavid van Moolenbroek 150*e985b929SDavid van Moolenbroek # On Solaris (at least, for some versions), libc contains stubbed 151*e985b929SDavid van Moolenbroek # (non-functional) versions of the pthreads routines, so link-based 152*e985b929SDavid van Moolenbroek # tests will erroneously succeed. (We need to link with -pthreads/-mt/ 153*e985b929SDavid van Moolenbroek # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather 154*e985b929SDavid van Moolenbroek # a function called by this macro, so we could check for that, but 155*e985b929SDavid van Moolenbroek # who knows whether they'll stub that too in a future libc.) So, 156*e985b929SDavid van Moolenbroek # we'll just look for -pthreads and -lpthread first: 157*e985b929SDavid van Moolenbroek 158*e985b929SDavid van Moolenbroek acx_pthread_flags="-pthreads pthread -mt -pthread $acx_pthread_flags" 159*e985b929SDavid van Moolenbroek ;; 160*e985b929SDavid van Moolenbroekesac 161*e985b929SDavid van Moolenbroek 162*e985b929SDavid van Moolenbroekif test x"$acx_pthread_ok" = xno; then 163*e985b929SDavid van Moolenbroekfor flag in $acx_pthread_flags; do 164*e985b929SDavid van Moolenbroek 165*e985b929SDavid van Moolenbroek case $flag in 166*e985b929SDavid van Moolenbroek none) 167*e985b929SDavid van Moolenbroek AC_MSG_CHECKING([whether pthreads work without any flags]) 168*e985b929SDavid van Moolenbroek ;; 169*e985b929SDavid van Moolenbroek 170*e985b929SDavid van Moolenbroek -*) 171*e985b929SDavid van Moolenbroek AC_MSG_CHECKING([whether pthreads work with $flag]) 172*e985b929SDavid van Moolenbroek PTHREAD_CFLAGS="$flag" 173*e985b929SDavid van Moolenbroek ;; 174*e985b929SDavid van Moolenbroek 175*e985b929SDavid van Moolenbroek pthread-config) 176*e985b929SDavid van Moolenbroek AC_CHECK_PROG(acx_pthread_config, pthread-config, yes, no) 177*e985b929SDavid van Moolenbroek if test x"$acx_pthread_config" = xno; then continue; fi 178*e985b929SDavid van Moolenbroek PTHREAD_CFLAGS="`pthread-config --cflags`" 179*e985b929SDavid van Moolenbroek PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" 180*e985b929SDavid van Moolenbroek ;; 181*e985b929SDavid van Moolenbroek 182*e985b929SDavid van Moolenbroek *) 183*e985b929SDavid van Moolenbroek AC_MSG_CHECKING([for the pthreads library -l$flag]) 184*e985b929SDavid van Moolenbroek PTHREAD_LIBS="-l$flag" 185*e985b929SDavid van Moolenbroek ;; 186*e985b929SDavid van Moolenbroek esac 187*e985b929SDavid van Moolenbroek 188*e985b929SDavid van Moolenbroek save_LIBS="$LIBS" 189*e985b929SDavid van Moolenbroek save_CFLAGS="$CFLAGS" 190*e985b929SDavid van Moolenbroek LIBS="$PTHREAD_LIBS $LIBS" 191*e985b929SDavid van Moolenbroek CFLAGS="$CFLAGS $PTHREAD_CFLAGS" 192*e985b929SDavid van Moolenbroek 193*e985b929SDavid van Moolenbroek # Check for various functions. We must include pthread.h, 194*e985b929SDavid van Moolenbroek # since some functions may be macros. (On the Sequent, we 195*e985b929SDavid van Moolenbroek # need a special flag -Kthread to make this header compile.) 196*e985b929SDavid van Moolenbroek # We check for pthread_join because it is in -lpthread on IRIX 197*e985b929SDavid van Moolenbroek # while pthread_create is in libc. We check for pthread_attr_init 198*e985b929SDavid van Moolenbroek # due to DEC craziness with -lpthreads. We check for 199*e985b929SDavid van Moolenbroek # pthread_cleanup_push because it is one of the few pthread 200*e985b929SDavid van Moolenbroek # functions on Solaris that doesn't have a non-functional libc stub. 201*e985b929SDavid van Moolenbroek # We try pthread_create on general principles. 202*e985b929SDavid van Moolenbroek AC_TRY_LINK([#include <pthread.h>], 203*e985b929SDavid van Moolenbroek [pthread_t th; pthread_join(th, 0); 204*e985b929SDavid van Moolenbroek pthread_attr_init(0); pthread_cleanup_push(0, 0); 205*e985b929SDavid van Moolenbroek pthread_create(0,0,0,0); pthread_cleanup_pop(0); ], 206*e985b929SDavid van Moolenbroek [acx_pthread_ok=yes]) 207*e985b929SDavid van Moolenbroek 208*e985b929SDavid van Moolenbroek LIBS="$save_LIBS" 209*e985b929SDavid van Moolenbroek CFLAGS="$save_CFLAGS" 210*e985b929SDavid van Moolenbroek 211*e985b929SDavid van Moolenbroek AC_MSG_RESULT($acx_pthread_ok) 212*e985b929SDavid van Moolenbroek if test "x$acx_pthread_ok" = xyes; then 213*e985b929SDavid van Moolenbroek break; 214*e985b929SDavid van Moolenbroek fi 215*e985b929SDavid van Moolenbroek 216*e985b929SDavid van Moolenbroek PTHREAD_LIBS="" 217*e985b929SDavid van Moolenbroek PTHREAD_CFLAGS="" 218*e985b929SDavid van Moolenbroekdone 219*e985b929SDavid van Moolenbroekfi 220*e985b929SDavid van Moolenbroek 221*e985b929SDavid van Moolenbroek# Various other checks: 222*e985b929SDavid van Moolenbroekif test "x$acx_pthread_ok" = xyes; then 223*e985b929SDavid van Moolenbroek save_LIBS="$LIBS" 224*e985b929SDavid van Moolenbroek LIBS="$PTHREAD_LIBS $LIBS" 225*e985b929SDavid van Moolenbroek save_CFLAGS="$CFLAGS" 226*e985b929SDavid van Moolenbroek CFLAGS="$CFLAGS $PTHREAD_CFLAGS" 227*e985b929SDavid van Moolenbroek 228*e985b929SDavid van Moolenbroek # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. 229*e985b929SDavid van Moolenbroek AC_MSG_CHECKING([for joinable pthread attribute]) 230*e985b929SDavid van Moolenbroek attr_name=unknown 231*e985b929SDavid van Moolenbroek for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do 232*e985b929SDavid van Moolenbroek AC_TRY_LINK([#include <pthread.h>], [int attr=$attr; return attr;], 233*e985b929SDavid van Moolenbroek [attr_name=$attr; break]) 234*e985b929SDavid van Moolenbroek done 235*e985b929SDavid van Moolenbroek AC_MSG_RESULT($attr_name) 236*e985b929SDavid van Moolenbroek if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then 237*e985b929SDavid van Moolenbroek AC_DEFINE_UNQUOTED(PTHREAD_CREATE_JOINABLE, $attr_name, 238*e985b929SDavid van Moolenbroek [Define to necessary symbol if this constant 239*e985b929SDavid van Moolenbroek uses a non-standard name on your system.]) 240*e985b929SDavid van Moolenbroek fi 241*e985b929SDavid van Moolenbroek 242*e985b929SDavid van Moolenbroek AC_MSG_CHECKING([if more special flags are required for pthreads]) 243*e985b929SDavid van Moolenbroek flag=no 244*e985b929SDavid van Moolenbroek case "${host_cpu}-${host_os}" in 245*e985b929SDavid van Moolenbroek *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";; 246*e985b929SDavid van Moolenbroek *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";; 247*e985b929SDavid van Moolenbroek esac 248*e985b929SDavid van Moolenbroek AC_MSG_RESULT(${flag}) 249*e985b929SDavid van Moolenbroek if test "x$flag" != xno; then 250*e985b929SDavid van Moolenbroek PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" 251*e985b929SDavid van Moolenbroek fi 252*e985b929SDavid van Moolenbroek 253*e985b929SDavid van Moolenbroek LIBS="$save_LIBS" 254*e985b929SDavid van Moolenbroek CFLAGS="$save_CFLAGS" 255*e985b929SDavid van Moolenbroek 256*e985b929SDavid van Moolenbroek # More AIX lossage: must compile with xlc_r or cc_r 257*e985b929SDavid van Moolenbroek if test x"$GCC" != xyes; then 258*e985b929SDavid van Moolenbroek AC_CHECK_PROGS(PTHREAD_CC, xlc_r cc_r, ${CC}) 259*e985b929SDavid van Moolenbroek else 260*e985b929SDavid van Moolenbroek PTHREAD_CC=$CC 261*e985b929SDavid van Moolenbroek fi 262*e985b929SDavid van Moolenbroekelse 263*e985b929SDavid van Moolenbroek PTHREAD_CC="$CC" 264*e985b929SDavid van Moolenbroekfi 265*e985b929SDavid van Moolenbroek 266*e985b929SDavid van MoolenbroekAC_SUBST(PTHREAD_LIBS) 267*e985b929SDavid van MoolenbroekAC_SUBST(PTHREAD_CFLAGS) 268*e985b929SDavid van MoolenbroekAC_SUBST(PTHREAD_CC) 269*e985b929SDavid van Moolenbroek 270*e985b929SDavid van Moolenbroek# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: 271*e985b929SDavid van Moolenbroekif test x"$acx_pthread_ok" = xyes; then 272*e985b929SDavid van Moolenbroek ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1]) 273*e985b929SDavid van Moolenbroek : 274*e985b929SDavid van Moolenbroekelse 275*e985b929SDavid van Moolenbroek acx_pthread_ok=no 276*e985b929SDavid van Moolenbroek $2 277*e985b929SDavid van Moolenbroekfi 278*e985b929SDavid van MoolenbroekAC_LANG_RESTORE 279*e985b929SDavid van Moolenbroek])dnl ACX_PTHREAD 280