|
@@ -55,6 +55,7 @@
|
|
|
#
|
|
#
|
|
|
# Copyright (c) 2008 Steven G. Johnson <[email protected]>
|
|
# Copyright (c) 2008 Steven G. Johnson <[email protected]>
|
|
|
# Copyright (c) 2011 Daniel Richard G. <[email protected]>
|
|
# Copyright (c) 2011 Daniel Richard G. <[email protected]>
|
|
|
|
|
+# Copyright (c) 2019 Marc Stevens <[email protected]>
|
|
|
#
|
|
#
|
|
|
# This program is free software: you can redistribute it and/or modify it
|
|
# 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
|
|
# 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
|
|
# modified version of the Autoconf Macro, you may extend this special
|
|
|
# exception to the GPL to apply to your modified version as well.
|
|
# exception to the GPL to apply to your modified version as well.
|
|
|
|
|
|
|
|
-#serial 26
|
|
|
|
|
|
|
+#serial 27
|
|
|
|
|
|
|
|
AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD])
|
|
AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD])
|
|
|
AC_DEFUN([AX_PTHREAD], [
|
|
AC_DEFUN([AX_PTHREAD], [
|
|
@@ -123,10 +124,12 @@ fi
|
|
|
# (e.g. DEC) have both -lpthread and -lpthreads, where one of the
|
|
# (e.g. DEC) have both -lpthread and -lpthreads, where one of the
|
|
|
# libraries is broken (non-POSIX).
|
|
# 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"
|
|
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
|
|
# that too in a future libc.) So we'll check first for the
|
|
|
# standard Solaris way of linking pthreads (-mt -lpthread).
|
|
# 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
|
|
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?
|
|
# Are we compiling with Clang?
|
|
|
|
|
|
|
|
AC_CACHE_CHECK([whether $CC is 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="$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
|
|
if test "x$ax_pthread_ok" = "xno"; then
|
|
|
for ax_pthread_try_flag in $ax_pthread_flags; do
|
|
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])
|
|
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
|
|
done
|
|
|
fi
|
|
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:
|
|
# Various other checks:
|
|
|
if test "x$ax_pthread_ok" = "xyes"; then
|
|
if test "x$ax_pthread_ok" = "xyes"; then
|
|
|
ax_pthread_save_CFLAGS="$CFLAGS"
|
|
ax_pthread_save_CFLAGS="$CFLAGS"
|