1
1
# ===========================================================================
2
- # http ://www.gnu.org/software/autoconf-archive/ax_pthread.html
2
+ # https ://www.gnu.org/software/autoconf-archive/ax_pthread.html
3
3
# ===========================================================================
4
4
#
5
5
# SYNOPSIS
14
14
# flags that are needed. (The user can also force certain compiler
15
15
# flags/libs to be tested by setting these environment variables.)
16
16
#
17
- # Also sets PTHREAD_CC to any special C compiler that is needed for
18
- # multi-threaded programs (defaults to the value of CC otherwise). (This
19
- # is necessary on AIX to use the special cc_r compiler alias.)
17
+ # Also sets PTHREAD_CC and PTHREAD_CXX to any special C compiler that is
18
+ # needed for multi-threaded programs (defaults to the value of CC
19
+ # respectively CXX otherwise). (This is necessary on e.g. AIX to use the
20
+ # special cc_r/CC_r compiler alias.)
20
21
#
21
22
# NOTE: You are assumed to not only compile your program with these flags,
22
23
# but also to link with them as well. For example, you might link with
23
24
# $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS
25
+ # $PTHREAD_CXX $CXXFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS
24
26
#
25
27
# If you are only building threaded programs, you may wish to use these
26
28
# variables in your default LIBS, CFLAGS, and CC:
27
29
#
28
30
# LIBS="$PTHREAD_LIBS $LIBS"
29
31
# CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
32
+ # CXXFLAGS="$CXXFLAGS $PTHREAD_CFLAGS"
30
33
# CC="$PTHREAD_CC"
34
+ # CXX="$PTHREAD_CXX"
31
35
#
32
36
# In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant
33
37
# has a nonstandard name, this macro defines PTHREAD_CREATE_JOINABLE to
55
59
#
56
60
# Copyright (c) 2008 Steven G. Johnson <[email protected] >
57
61
# Copyright (c) 2011 Daniel Richard G. <[email protected] >
62
+ # Copyright (c) 2019 Marc Stevens <[email protected] >
58
63
#
59
64
# This program is free software: you can redistribute it and/or modify it
60
65
# under the terms of the GNU General Public License as published by the
67
72
# Public License for more details.
68
73
#
69
74
# You should have received a copy of the GNU General Public License along
70
- # with this program. If not, see <http ://www.gnu.org/licenses/>.
75
+ # with this program. If not, see <https ://www.gnu.org/licenses/>.
71
76
#
72
77
# As a special exception, the respective Autoconf Macro's copyright owner
73
78
# gives unlimited permission to copy, distribute and modify the configure
82
87
# modified version of the Autoconf Macro, you may extend this special
83
88
# exception to the GPL to apply to your modified version as well.
84
89
85
- # serial 23
90
+ # serial 31
86
91
87
92
AU_ALIAS ( [ ACX_PTHREAD] , [ AX_PTHREAD ] )
88
93
AC_DEFUN ( [ AX_PTHREAD ] , [
@@ -104,6 +109,7 @@ if test "x$PTHREAD_CFLAGS$PTHREAD_LIBS" != "x"; then
104
109
ax_pthread_save_CFLAGS="$CFLAGS"
105
110
ax_pthread_save_LIBS="$LIBS"
106
111
AS_IF ( [ test "x$PTHREAD_CC" != "x"] , [ CC="$PTHREAD_CC"] )
112
+ AS_IF ( [ test "x$PTHREAD_CXX" != "x"] , [ CXX="$PTHREAD_CXX"] )
107
113
CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
108
114
LIBS="$PTHREAD_LIBS $LIBS"
109
115
AC_MSG_CHECKING ( [ for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS] )
123
129
# (e.g. DEC) have both -lpthread and -lpthreads, where one of the
124
130
# libraries is broken (non-POSIX).
125
131
126
- # Create a list of thread flags to try. Items starting with a "-" are
127
- # C compiler flags, and other items are library names, except for "none"
128
- # which indicates that we try without any flags at all, and "pthread-config"
129
- # which is a program returning the flags for the Pth emulation library.
132
+ # Create a list of thread flags to try. Items with a "," contain both
133
+ # C compiler flags (before ",") and linker flags (after ","). Other items
134
+ # starting with a "-" are C compiler flags, and remaining items are
135
+ # library names, except for "none" which indicates that we try without
136
+ # any flags at all, and "pthread-config" which is a program returning
137
+ # the flags for the Pth emulation library.
130
138
131
139
ax_pthread_flags="pthreads none -Kthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config"
132
140
@@ -194,14 +202,47 @@ case $host_os in
194
202
# that too in a future libc.) So we'll check first for the
195
203
# standard Solaris way of linking pthreads (-mt -lpthread).
196
204
197
- ax_pthread_flags="-mt,pthread pthread $ax_pthread_flags"
205
+ ax_pthread_flags="-mt,-lpthread pthread $ax_pthread_flags"
198
206
;;
199
207
esac
200
208
209
+ # Are we compiling with Clang?
210
+
211
+ AC_CACHE_CHECK ( [ whether $CC is Clang] ,
212
+ [ ax_cv_PTHREAD_CLANG] ,
213
+ [ ax_cv_PTHREAD_CLANG=no
214
+ # Note that Autoconf sets GCC=yes for Clang as well as GCC
215
+ if test "x$GCC" = "xyes"; then
216
+ AC_EGREP_CPP ( [ AX_PTHREAD_CC_IS_CLANG] ,
217
+ [ /* Note: Clang 2.7 lacks __clang_[ a-z] +__ */
218
+ # if defined(__clang__) && defined(__llvm__)
219
+ AX_PTHREAD_CC_IS_CLANG
220
+ # endif
221
+ ] ,
222
+ [ ax_cv_PTHREAD_CLANG=yes] )
223
+ fi
224
+ ] )
225
+ ax_pthread_clang="$ax_cv_PTHREAD_CLANG"
226
+
227
+
201
228
# GCC generally uses -pthread, or -pthreads on some platforms (e.g. SPARC)
202
229
230
+ # Note that for GCC and Clang -pthread generally implies -lpthread,
231
+ # except when -nostdlib is passed.
232
+ # This is problematic using libtool to build C++ shared libraries with pthread:
233
+ # [ 1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=25460
234
+ # [ 2] https://bugzilla.redhat.com/show_bug.cgi?id=661333
235
+ # [ 3] https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=468555
236
+ # To solve this, first try -pthread together with -lpthread for GCC
237
+
203
238
AS_IF ( [ test "x$GCC" = "xyes"] ,
204
- [ ax_pthread_flags="-pthread -pthreads $ax_pthread_flags"] )
239
+ [ ax_pthread_flags="-pthread,-lpthread -pthread -pthreads $ax_pthread_flags"] )
240
+
241
+ # Clang takes -pthread (never supported any other flag), but we'll try with -lpthread first
242
+
243
+ AS_IF ( [ test "x$ax_pthread_clang" = "xyes"] ,
244
+ [ ax_pthread_flags="-pthread,-lpthread -pthread"] )
245
+
205
246
206
247
# The presence of a feature test macro requesting re-entrant function
207
248
# definitions is, on some systems, a strong hint that pthreads support is
@@ -224,25 +265,86 @@ AS_IF([test "x$ax_pthread_check_macro" = "x--"],
224
265
[ ax_pthread_check_cond=0] ,
225
266
[ ax_pthread_check_cond="!defined($ax_pthread_check_macro)"] )
226
267
227
- # Are we compiling with Clang?
228
268
229
- AC_CACHE_CHECK ( [ whether $CC is Clang] ,
230
- [ ax_cv_PTHREAD_CLANG] ,
231
- [ ax_cv_PTHREAD_CLANG=no
232
- # Note that Autoconf sets GCC=yes for Clang as well as GCC
233
- if test "x$GCC" = "xyes"; then
234
- AC_EGREP_CPP ( [ AX_PTHREAD_CC_IS_CLANG] ,
235
- [ /* Note: Clang 2.7 lacks __clang_[ a-z] +__ */
236
- # if defined(__clang__) && defined(__llvm__)
237
- AX_PTHREAD_CC_IS_CLANG
238
- # endif
239
- ] ,
240
- [ ax_cv_PTHREAD_CLANG=yes] )
241
- fi
242
- ] )
243
- ax_pthread_clang="$ax_cv_PTHREAD_CLANG"
269
+ if test "x$ax_pthread_ok" = "xno"; then
270
+ for ax_pthread_try_flag in $ax_pthread_flags; do
271
+
272
+ case $ax_pthread_try_flag in
273
+ none)
274
+ AC_MSG_CHECKING ( [ whether pthreads work without any flags] )
275
+ ;;
276
+
277
+ *,*)
278
+ PTHREAD_CFLAGS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\1/"`
279
+ PTHREAD_LIBS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\2/"`
280
+ AC_MSG_CHECKING ( [ whether pthreads work with "$PTHREAD_CFLAGS" and "$PTHREAD_LIBS"] )
281
+ ;;
282
+
283
+ -*)
284
+ AC_MSG_CHECKING ( [ whether pthreads work with $ax_pthread_try_flag] )
285
+ PTHREAD_CFLAGS="$ax_pthread_try_flag"
286
+ ;;
287
+
288
+ pthread-config)
289
+ AC_CHECK_PROG ( [ ax_pthread_config] , [ pthread-config] , [ yes] , [ no] )
290
+ AS_IF ( [ test "x$ax_pthread_config" = "xno"] , [ continue] )
291
+ PTHREAD_CFLAGS="`pthread-config --cflags`"
292
+ PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`"
293
+ ;;
294
+
295
+ *)
296
+ AC_MSG_CHECKING ( [ for the pthreads library -l$ax_pthread_try_flag] )
297
+ PTHREAD_LIBS="-l$ax_pthread_try_flag"
298
+ ;;
299
+ esac
300
+
301
+ ax_pthread_save_CFLAGS="$CFLAGS"
302
+ ax_pthread_save_LIBS="$LIBS"
303
+ CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
304
+ LIBS="$PTHREAD_LIBS $LIBS"
305
+
306
+ # Check for various functions. We must include pthread.h,
307
+ # since some functions may be macros. (On the Sequent, we
308
+ # need a special flag -Kthread to make this header compile.)
309
+ # We check for pthread_join because it is in -lpthread on IRIX
310
+ # while pthread_create is in libc. We check for pthread_attr_init
311
+ # due to DEC craziness with -lpthreads. We check for
312
+ # pthread_cleanup_push because it is one of the few pthread
313
+ # functions on Solaris that doesn't have a non-functional libc stub.
314
+ # We try pthread_create on general principles.
315
+
316
+ AC_LINK_IFELSE ( [ AC_LANG_PROGRAM ( [ #include <pthread.h>
317
+ # if $ax_pthread_check_cond
318
+ # error "$ax_pthread_check_macro must be defined"
319
+ # endif
320
+ static void *some_global = NULL;
321
+ static void routine(void *a)
322
+ {
323
+ /* To avoid any unused-parameter or
324
+ unused-but-set-parameter warning. */
325
+ some_global = a;
326
+ }
327
+ static void *start_routine(void *a) { return a; }] ,
328
+ [ pthread_t th; pthread_attr_t attr;
329
+ pthread_create(&th, 0, start_routine, 0);
330
+ pthread_join(th, 0);
331
+ pthread_attr_init(&attr);
332
+ pthread_cleanup_push(routine, 0);
333
+ pthread_cleanup_pop(0) /* ; */] ) ] ,
334
+ [ ax_pthread_ok=yes] ,
335
+ [ ] )
336
+
337
+ CFLAGS="$ax_pthread_save_CFLAGS"
338
+ LIBS="$ax_pthread_save_LIBS"
339
+
340
+ AC_MSG_RESULT ( [ $ax_pthread_ok] )
341
+ AS_IF ( [ test "x$ax_pthread_ok" = "xyes"] , [ break] )
342
+
343
+ PTHREAD_LIBS=""
344
+ PTHREAD_CFLAGS=""
345
+ done
346
+ fi
244
347
245
- ax_pthread_clang_warning=no
246
348
247
349
# Clang needs special handling, because older versions handle the -pthread
248
350
# option in a rather... idiosyncratic way
@@ -261,11 +363,6 @@ if test "x$ax_pthread_clang" = "xyes"; then
261
363
# -pthread does define _REENTRANT, and while the Darwin headers
262
364
# ignore this macro, third-party headers might not.)
263
365
264
- PTHREAD_CFLAGS="-pthread"
265
- PTHREAD_LIBS=
266
-
267
- ax_pthread_ok=yes
268
-
269
366
# However, older versions of Clang make a point of warning the user
270
367
# that, in an invocation where only linking and no compilation is
271
368
# taking place, the -pthread option has no effect ("argument unused
@@ -294,7 +391,7 @@ if test "x$ax_pthread_clang" = "xyes"; then
294
391
# step
295
392
ax_pthread_save_ac_link="$ac_link"
296
393
ax_pthread_sed='s/conftest\.\$ac_ext/conftest.$ac_objext/g'
297
- ax_pthread_link_step=`$as_echo "$ac_link" | sed "$ax_pthread_sed"`
394
+ ax_pthread_link_step=`AS_ECHO ( [ "$ac_link"] ) | sed "$ax_pthread_sed"`
298
395
ax_pthread_2step_ac_link="($ac_compile) && (echo ==== >&5) && ($ax_pthread_link_step)"
299
396
ax_pthread_save_CFLAGS="$CFLAGS"
300
397
for ax_pthread_try in '' -Qunused-arguments -Wno-unused-command-line-argument unknown; do
@@ -320,78 +417,7 @@ if test "x$ax_pthread_clang" = "xyes"; then
320
417
321
418
fi # $ax_pthread_clang = yes
322
419
323
- if test "x$ax_pthread_ok" = "xno"; then
324
- for ax_pthread_try_flag in $ax_pthread_flags; do
325
-
326
- case $ax_pthread_try_flag in
327
- none)
328
- AC_MSG_CHECKING ( [ whether pthreads work without any flags] )
329
- ;;
330
-
331
- -mt,pthread)
332
- AC_MSG_CHECKING ( [ whether pthreads work with -mt -lpthread] )
333
- PTHREAD_CFLAGS="-mt"
334
- PTHREAD_LIBS="-lpthread"
335
- ;;
336
-
337
- -*)
338
- AC_MSG_CHECKING ( [ whether pthreads work with $ax_pthread_try_flag] )
339
- PTHREAD_CFLAGS="$ax_pthread_try_flag"
340
- ;;
341
420
342
- pthread-config)
343
- AC_CHECK_PROG ( [ ax_pthread_config] , [ pthread-config] , [ yes] , [ no] )
344
- AS_IF ( [ test "x$ax_pthread_config" = "xno"] , [ continue] )
345
- PTHREAD_CFLAGS="`pthread-config --cflags`"
346
- PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`"
347
- ;;
348
-
349
- *)
350
- AC_MSG_CHECKING ( [ for the pthreads library -l$ax_pthread_try_flag] )
351
- PTHREAD_LIBS="-l$ax_pthread_try_flag"
352
- ;;
353
- esac
354
-
355
- ax_pthread_save_CFLAGS="$CFLAGS"
356
- ax_pthread_save_LIBS="$LIBS"
357
- CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
358
- LIBS="$PTHREAD_LIBS $LIBS"
359
-
360
- # Check for various functions. We must include pthread.h,
361
- # since some functions may be macros. (On the Sequent, we
362
- # need a special flag -Kthread to make this header compile.)
363
- # We check for pthread_join because it is in -lpthread on IRIX
364
- # while pthread_create is in libc. We check for pthread_attr_init
365
- # due to DEC craziness with -lpthreads. We check for
366
- # pthread_cleanup_push because it is one of the few pthread
367
- # functions on Solaris that doesn't have a non-functional libc stub.
368
- # We try pthread_create on general principles.
369
-
370
- AC_LINK_IFELSE ( [ AC_LANG_PROGRAM ( [ #include <pthread.h>
371
- # if $ax_pthread_check_cond
372
- # error "$ax_pthread_check_macro must be defined"
373
- # endif
374
- static void routine(void *a) { a = 0; }
375
- static void *start_routine(void *a) { return a; }] ,
376
- [ pthread_t th; pthread_attr_t attr;
377
- pthread_create(&th, 0, start_routine, 0);
378
- pthread_join(th, 0);
379
- pthread_attr_init(&attr);
380
- pthread_cleanup_push(routine, 0);
381
- pthread_cleanup_pop(0) /* ; */] ) ] ,
382
- [ ax_pthread_ok=yes] ,
383
- [ ] )
384
-
385
- CFLAGS="$ax_pthread_save_CFLAGS"
386
- LIBS="$ax_pthread_save_LIBS"
387
-
388
- AC_MSG_RESULT ( [ $ax_pthread_ok] )
389
- AS_IF ( [ test "x$ax_pthread_ok" = "xyes"] , [ break] )
390
-
391
- PTHREAD_LIBS=""
392
- PTHREAD_CFLAGS=""
393
- done
394
- fi
395
421
396
422
# Various other checks:
397
423
if test "x$ax_pthread_ok" = "xyes"; then
@@ -438,7 +464,8 @@ if test "x$ax_pthread_ok" = "xyes"; then
438
464
AC_CACHE_CHECK ( [ for PTHREAD_PRIO_INHERIT] ,
439
465
[ ax_cv_PTHREAD_PRIO_INHERIT] ,
440
466
[ AC_LINK_IFELSE ( [ AC_LANG_PROGRAM ( [ [ #include <pthread.h>] ] ,
441
- [ [ int i = PTHREAD_PRIO_INHERIT;] ] ) ] ,
467
+ [ [ int i = PTHREAD_PRIO_INHERIT;
468
+ return i;] ] ) ] ,
442
469
[ ax_cv_PTHREAD_PRIO_INHERIT=yes] ,
443
470
[ ax_cv_PTHREAD_PRIO_INHERIT=no] )
444
471
] )
@@ -460,18 +487,28 @@ if test "x$ax_pthread_ok" = "xyes"; then
460
487
[ #handle absolute path differently from PATH based program lookup
461
488
AS_CASE ( [ "x$CC"] ,
462
489
[ x/*] ,
463
- [ AS_IF ( [ AS_EXECUTABLE_P([ ${CC}_r] )] ,[ PTHREAD_CC="${CC}_r"] ) ] ,
464
- [ AC_CHECK_PROGS ( [ PTHREAD_CC] ,[ ${CC}_r] ,[ $CC] ) ] ) ] )
490
+ [
491
+ AS_IF ( [ AS_EXECUTABLE_P([ ${CC}_r] )] ,[ PTHREAD_CC="${CC}_r"] )
492
+ AS_IF ( [ test "x${CXX}" != "x"] , [ AS_IF ( [ AS_EXECUTABLE_P([ ${CXX}_r] )] ,[ PTHREAD_CXX="${CXX}_r"] ) ] )
493
+ ] ,
494
+ [
495
+ AC_CHECK_PROGS ( [ PTHREAD_CC] ,[ ${CC}_r] ,[ $CC] )
496
+ AS_IF ( [ test "x${CXX}" != "x"] , [ AC_CHECK_PROGS ( [ PTHREAD_CXX] ,[ ${CXX}_r] ,[ $CXX] ) ] )
497
+ ]
498
+ )
499
+ ] )
465
500
;;
466
501
esac
467
502
fi
468
503
fi
469
504
470
505
test -n "$PTHREAD_CC" || PTHREAD_CC="$CC"
506
+ test -n "$PTHREAD_CXX" || PTHREAD_CXX="$CXX"
471
507
472
508
AC_SUBST ( [ PTHREAD_LIBS] )
473
509
AC_SUBST ( [ PTHREAD_CFLAGS] )
474
510
AC_SUBST ( [ PTHREAD_CC] )
511
+ AC_SUBST ( [ PTHREAD_CXX] )
475
512
476
513
# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
477
514
if test "x$ax_pthread_ok" = "xyes"; then
0 commit comments