|
|
@ -55,6 +55,7 @@ |
|
|
|
# |
|
|
|
# Copyright (c) 2008 Steven G. Johnson <stevenj@alum.mit.edu> |
|
|
|
# Copyright (c) 2011 Daniel Richard G. <skunk@iSKUNK.ORG> |
|
|
|
# Copyright (c) 2019 Marc Stevens <marc.stevens@cwi.nl> |
|
|
|
# |
|
|
|
# This program is free software: you can redistribute it and/or modify it |
|
|
|
# under the terms of the GNU General Public License as published by the |
|
|
@ -82,7 +83,7 @@ |
|
|
|
# modified version of the Autoconf Macro, you may extend this special |
|
|
|
# exception to the GPL to apply to your modified version as well. |
|
|
|
|
|
|
|
#serial 26 |
|
|
|
#serial 27 |
|
|
|
|
|
|
|
AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD]) |
|
|
|
AC_DEFUN([AX_PTHREAD], [ |
|
|
@ -123,10 +124,12 @@ fi |
|
|
|
# (e.g. DEC) have both -lpthread and -lpthreads, where one of the |
|
|
|
# libraries is broken (non-POSIX). |
|
|
|
|
|
|
|
# Create a list of thread flags to try. Items starting with a "-" are |
|
|
|
# C compiler flags, and other items are library names, except for "none" |
|
|
|
# which indicates that we try without any flags at all, and "pthread-config" |
|
|
|
# which is a program returning the flags for the Pth emulation library. |
|
|
|
# Create a list of thread flags to try. Items with a "," contain both |
|
|
|
# C compiler flags (before ",") and linker flags (after ","). Other items |
|
|
|
# starting with a "-" are C compiler flags, and remaining items are |
|
|
|
# library names, except for "none" which indicates that we try without |
|
|
|
# any flags at all, and "pthread-config" which is a program returning |
|
|
|
# the flags for the Pth emulation library. |
|
|
|
|
|
|
|
ax_pthread_flags="pthreads none -Kthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" |
|
|
|
|
|
|
@ -194,36 +197,10 @@ case $host_os in |
|
|
|
# that too in a future libc.) So we'll check first for the |
|
|
|
# standard Solaris way of linking pthreads (-mt -lpthread). |
|
|
|
|
|
|
|
ax_pthread_flags="-mt,pthread pthread $ax_pthread_flags" |
|
|
|
ax_pthread_flags="-mt,-lpthread pthread $ax_pthread_flags" |
|
|
|
;; |
|
|
|
esac |
|
|
|
|
|
|
|
# GCC generally uses -pthread, or -pthreads on some platforms (e.g. SPARC) |
|
|
|
|
|
|
|
AS_IF([test "x$GCC" = "xyes"], |
|
|
|
[ax_pthread_flags="-pthread -pthreads $ax_pthread_flags"]) |
|
|
|
|
|
|
|
# The presence of a feature test macro requesting re-entrant function |
|
|
|
# definitions is, on some systems, a strong hint that pthreads support is |
|
|
|
# correctly enabled |
|
|
|
|
|
|
|
case $host_os in |
|
|
|
darwin* | hpux* | linux* | osf* | solaris*) |
|
|
|
ax_pthread_check_macro="_REENTRANT" |
|
|
|
;; |
|
|
|
|
|
|
|
aix*) |
|
|
|
ax_pthread_check_macro="_THREAD_SAFE" |
|
|
|
;; |
|
|
|
|
|
|
|
*) |
|
|
|
ax_pthread_check_macro="--" |
|
|
|
;; |
|
|
|
esac |
|
|
|
AS_IF([test "x$ax_pthread_check_macro" = "x--"], |
|
|
|
[ax_pthread_check_cond=0], |
|
|
|
[ax_pthread_check_cond="!defined($ax_pthread_check_macro)"]) |
|
|
|
|
|
|
|
# Are we compiling with Clang? |
|
|
|
|
|
|
|
AC_CACHE_CHECK([whether $CC is Clang], |
|
|
@ -242,83 +219,47 @@ AC_CACHE_CHECK([whether $CC is Clang], |
|
|
|
]) |
|
|
|
ax_pthread_clang="$ax_cv_PTHREAD_CLANG" |
|
|
|
|
|
|
|
ax_pthread_clang_warning=no |
|
|
|
|
|
|
|
# Clang needs special handling, because older versions handle the -pthread |
|
|
|
# option in a rather... idiosyncratic way |
|
|
|
# GCC generally uses -pthread, or -pthreads on some platforms (e.g. SPARC) |
|
|
|
|
|
|
|
if test "x$ax_pthread_clang" = "xyes"; then |
|
|
|
# Note that for GCC and Clang -pthread generally implies -lpthread, |
|
|
|
# except when -nostdlib is passed. |
|
|
|
# This is problematic using libtool to build C++ shared libraries with pthread: |
|
|
|
# [1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=25460 |
|
|
|
# [2] https://bugzilla.redhat.com/show_bug.cgi?id=661333 |
|
|
|
# [3] https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=468555 |
|
|
|
# To solve this, first try -pthread together with -lpthread for GCC |
|
|
|
|
|
|
|
# Clang takes -pthread; it has never supported any other flag |
|
|
|
AS_IF([test "x$GCC" = "xyes"], |
|
|
|
[ax_pthread_flags="-pthread,-lpthread -pthread -pthreads $ax_pthread_flags"]) |
|
|
|
|
|
|
|
# (Note 1: This will need to be revisited if a system that Clang |
|
|
|
# supports has POSIX threads in a separate library. This tends not |
|
|
|
# to be the way of modern systems, but it's conceivable.) |
|
|
|
# Clang takes -pthread (never supported any other flag), but we'll try with -lpthread first |
|
|
|
|
|
|
|
# (Note 2: On some systems, notably Darwin, -pthread is not needed |
|
|
|
# to get POSIX threads support; the API is always present and |
|
|
|
# active. We could reasonably leave PTHREAD_CFLAGS empty. But |
|
|
|
# -pthread does define _REENTRANT, and while the Darwin headers |
|
|
|
# ignore this macro, third-party headers might not.) |
|
|
|
AS_IF([test "x$ax_pthread_clang" = "xyes"], |
|
|
|
[ax_pthread_flags="-pthread,-lpthread -pthread"]) |
|
|
|
|
|
|
|
PTHREAD_CFLAGS="-pthread" |
|
|
|
PTHREAD_LIBS= |
|
|
|
|
|
|
|
ax_pthread_ok=yes |
|
|
|
# The presence of a feature test macro requesting re-entrant function |
|
|
|
# definitions is, on some systems, a strong hint that pthreads support is |
|
|
|
# correctly enabled |
|
|
|
|
|
|
|
# However, older versions of Clang make a point of warning the user |
|
|
|
# that, in an invocation where only linking and no compilation is |
|
|
|
# taking place, the -pthread option has no effect ("argument unused |
|
|
|
# during compilation"). They expect -pthread to be passed in only |
|
|
|
# when source code is being compiled. |
|
|
|
# |
|
|
|
# Problem is, this is at odds with the way Automake and most other |
|
|
|
# C build frameworks function, which is that the same flags used in |
|
|
|
# compilation (CFLAGS) are also used in linking. Many systems |
|
|
|
# supported by AX_PTHREAD require exactly this for POSIX threads |
|
|
|
# support, and in fact it is often not straightforward to specify a |
|
|
|
# flag that is used only in the compilation phase and not in |
|
|
|
# linking. Such a scenario is extremely rare in practice. |
|
|
|
# |
|
|
|
# Even though use of the -pthread flag in linking would only print |
|
|
|
# a warning, this can be a nuisance for well-run software projects |
|
|
|
# that build with -Werror. So if the active version of Clang has |
|
|
|
# this misfeature, we search for an option to squash it. |
|
|
|
case $host_os in |
|
|
|
darwin* | hpux* | linux* | osf* | solaris*) |
|
|
|
ax_pthread_check_macro="_REENTRANT" |
|
|
|
;; |
|
|
|
|
|
|
|
AC_CACHE_CHECK([whether Clang needs flag to prevent "argument unused" warning when linking with -pthread], |
|
|
|
[ax_cv_PTHREAD_CLANG_NO_WARN_FLAG], |
|
|
|
[ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown |
|
|
|
# Create an alternate version of $ac_link that compiles and |
|
|
|
# links in two steps (.c -> .o, .o -> exe) instead of one |
|
|
|
# (.c -> exe), because the warning occurs only in the second |
|
|
|
# step |
|
|
|
ax_pthread_save_ac_link="$ac_link" |
|
|
|
ax_pthread_sed='s/conftest\.\$ac_ext/conftest.$ac_objext/g' |
|
|
|
ax_pthread_link_step=`$as_echo "$ac_link" | sed "$ax_pthread_sed"` |
|
|
|
ax_pthread_2step_ac_link="($ac_compile) && (echo ==== >&5) && ($ax_pthread_link_step)" |
|
|
|
ax_pthread_save_CFLAGS="$CFLAGS" |
|
|
|
for ax_pthread_try in '' -Qunused-arguments -Wno-unused-command-line-argument unknown; do |
|
|
|
AS_IF([test "x$ax_pthread_try" = "xunknown"], [break]) |
|
|
|
CFLAGS="-Werror -Wunknown-warning-option $ax_pthread_try -pthread $ax_pthread_save_CFLAGS" |
|
|
|
ac_link="$ax_pthread_save_ac_link" |
|
|
|
AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])], |
|
|
|
[ac_link="$ax_pthread_2step_ac_link" |
|
|
|
AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])], |
|
|
|
[break]) |
|
|
|
]) |
|
|
|
done |
|
|
|
ac_link="$ax_pthread_save_ac_link" |
|
|
|
CFLAGS="$ax_pthread_save_CFLAGS" |
|
|
|
AS_IF([test "x$ax_pthread_try" = "x"], [ax_pthread_try=no]) |
|
|
|
ax_cv_PTHREAD_CLANG_NO_WARN_FLAG="$ax_pthread_try" |
|
|
|
]) |
|
|
|
aix*) |
|
|
|
ax_pthread_check_macro="_THREAD_SAFE" |
|
|
|
;; |
|
|
|
|
|
|
|
case "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" in |
|
|
|
no | unknown) ;; |
|
|
|
*) PTHREAD_CFLAGS="$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG $PTHREAD_CFLAGS" ;; |
|
|
|
esac |
|
|
|
*) |
|
|
|
ax_pthread_check_macro="--" |
|
|
|
;; |
|
|
|
esac |
|
|
|
AS_IF([test "x$ax_pthread_check_macro" = "x--"], |
|
|
|
[ax_pthread_check_cond=0], |
|
|
|
[ax_pthread_check_cond="!defined($ax_pthread_check_macro)"]) |
|
|
|
|
|
|
|
fi # $ax_pthread_clang = yes |
|
|
|
|
|
|
|
if test "x$ax_pthread_ok" = "xno"; then |
|
|
|
for ax_pthread_try_flag in $ax_pthread_flags; do |
|
|
@ -328,10 +269,10 @@ for ax_pthread_try_flag in $ax_pthread_flags; do |
|
|
|
AC_MSG_CHECKING([whether pthreads work without any flags]) |
|
|
|
;; |
|
|
|
|
|
|
|
-mt,pthread) |
|
|
|
AC_MSG_CHECKING([whether pthreads work with -mt -lpthread]) |
|
|
|
PTHREAD_CFLAGS="-mt" |
|
|
|
PTHREAD_LIBS="-lpthread" |
|
|
|
*,*) |
|
|
|
PTHREAD_CFLAGS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\1/"` |
|
|
|
PTHREAD_LIBS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\2/"` |
|
|
|
AC_MSG_CHECKING([whether pthreads work with "$PTHREAD_CFLAGS" and "$PTHREAD_LIBS"]) |
|
|
|
;; |
|
|
|
|
|
|
|
-*) |
|
|
@ -399,6 +340,80 @@ for ax_pthread_try_flag in $ax_pthread_flags; do |
|
|
|
done |
|
|
|
fi |
|
|
|
|
|
|
|
|
|
|
|
# Clang needs special handling, because older versions handle the -pthread |
|
|
|
# option in a rather... idiosyncratic way |
|
|
|
|
|
|
|
if test "x$ax_pthread_clang" = "xyes"; then |
|
|
|
|
|
|
|
# Clang takes -pthread; it has never supported any other flag |
|
|
|
|
|
|
|
# (Note 1: This will need to be revisited if a system that Clang |
|
|
|
# supports has POSIX threads in a separate library. This tends not |
|
|
|
# to be the way of modern systems, but it's conceivable.) |
|
|
|
|
|
|
|
# (Note 2: On some systems, notably Darwin, -pthread is not needed |
|
|
|
# to get POSIX threads support; the API is always present and |
|
|
|
# active. We could reasonably leave PTHREAD_CFLAGS empty. But |
|
|
|
# -pthread does define _REENTRANT, and while the Darwin headers |
|
|
|
# ignore this macro, third-party headers might not.) |
|
|
|
|
|
|
|
# However, older versions of Clang make a point of warning the user |
|
|
|
# that, in an invocation where only linking and no compilation is |
|
|
|
# taking place, the -pthread option has no effect ("argument unused |
|
|
|
# during compilation"). They expect -pthread to be passed in only |
|
|
|
# when source code is being compiled. |
|
|
|
# |
|
|
|
# Problem is, this is at odds with the way Automake and most other |
|
|
|
# C build frameworks function, which is that the same flags used in |
|
|
|
# compilation (CFLAGS) are also used in linking. Many systems |
|
|
|
# supported by AX_PTHREAD require exactly this for POSIX threads |
|
|
|
# support, and in fact it is often not straightforward to specify a |
|
|
|
# flag that is used only in the compilation phase and not in |
|
|
|
# linking. Such a scenario is extremely rare in practice. |
|
|
|
# |
|
|
|
# Even though use of the -pthread flag in linking would only print |
|
|
|
# a warning, this can be a nuisance for well-run software projects |
|
|
|
# that build with -Werror. So if the active version of Clang has |
|
|
|
# this misfeature, we search for an option to squash it. |
|
|
|
|
|
|
|
AC_CACHE_CHECK([whether Clang needs flag to prevent "argument unused" warning when linking with -pthread], |
|
|
|
[ax_cv_PTHREAD_CLANG_NO_WARN_FLAG], |
|
|
|
[ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown |
|
|
|
# Create an alternate version of $ac_link that compiles and |
|
|
|
# links in two steps (.c -> .o, .o -> exe) instead of one |
|
|
|
# (.c -> exe), because the warning occurs only in the second |
|
|
|
# step |
|
|
|
ax_pthread_save_ac_link="$ac_link" |
|
|
|
ax_pthread_sed='s/conftest\.\$ac_ext/conftest.$ac_objext/g' |
|
|
|
ax_pthread_link_step=`$as_echo "$ac_link" | sed "$ax_pthread_sed"` |
|
|
|
ax_pthread_2step_ac_link="($ac_compile) && (echo ==== >&5) && ($ax_pthread_link_step)" |
|
|
|
ax_pthread_save_CFLAGS="$CFLAGS" |
|
|
|
for ax_pthread_try in '' -Qunused-arguments -Wno-unused-command-line-argument unknown; do |
|
|
|
AS_IF([test "x$ax_pthread_try" = "xunknown"], [break]) |
|
|
|
CFLAGS="-Werror -Wunknown-warning-option $ax_pthread_try -pthread $ax_pthread_save_CFLAGS" |
|
|
|
ac_link="$ax_pthread_save_ac_link" |
|
|
|
AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])], |
|
|
|
[ac_link="$ax_pthread_2step_ac_link" |
|
|
|
AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])], |
|
|
|
[break]) |
|
|
|
]) |
|
|
|
done |
|
|
|
ac_link="$ax_pthread_save_ac_link" |
|
|
|
CFLAGS="$ax_pthread_save_CFLAGS" |
|
|
|
AS_IF([test "x$ax_pthread_try" = "x"], [ax_pthread_try=no]) |
|
|
|
ax_cv_PTHREAD_CLANG_NO_WARN_FLAG="$ax_pthread_try" |
|
|
|
]) |
|
|
|
|
|
|
|
case "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" in |
|
|
|
no | unknown) ;; |
|
|
|
*) PTHREAD_CFLAGS="$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG $PTHREAD_CFLAGS" ;; |
|
|
|
esac |
|
|
|
|
|
|
|
fi # $ax_pthread_clang = yes |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Various other checks: |
|
|
|
if test "x$ax_pthread_ok" = "xyes"; then |
|
|
|
ax_pthread_save_CFLAGS="$CFLAGS" |
|
|
|