Home My Page Projects Code Snippets Project Openings diderot
Summary Activity Tracker Tasks SCM

SCM Repository

[diderot] Annotation of /tests/config/acx_pthread.m4
ViewVC logotype

Annotation of /tests/config/acx_pthread.m4

Parent Directory Parent Directory | Revision Log Revision Log


Revision 5064 - (view) (download)

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

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0