Blame m4/threads.m4

Packit Service 6754ca
Packit Service 6754ca
dnl @synopsis ACX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
Packit Service 6754ca
dnl
Packit Service 6754ca
dnl Modified by Wojciech Jarosz (2005) to include check for POSIX
Packit Service 6754ca
dnl semaphore usability. Defines HAVE_POSIX_SEMAPHORES if found.
Packit Service 6754ca
dnl
Packit Service 6754ca
dnl This macro figures out how to build C programs using POSIX threads.
Packit Service 6754ca
dnl It sets the PTHREAD_LIBS output variable to the threads library and
Packit Service 6754ca
dnl linker flags, and the PTHREAD_CFLAGS output variable to any special
Packit Service 6754ca
dnl C compiler flags that are needed. (The user can also force certain
Packit Service 6754ca
dnl compiler flags/libs to be tested by setting these environment
Packit Service 6754ca
dnl variables.)
Packit Service 6754ca
dnl
Packit Service 6754ca
dnl Also sets PTHREAD_CC to any special C compiler that is needed for
Packit Service 6754ca
dnl multi-threaded programs (defaults to the value of CC otherwise).
Packit Service 6754ca
dnl (This is necessary on AIX to use the special cc_r compiler alias.)
Packit Service 6754ca
dnl
Packit Service 6754ca
dnl NOTE: You are assumed to not only compile your program with these
Packit Service 6754ca
dnl flags, but also link it with them as well. e.g. you should link
Packit Service 6754ca
dnl with $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS
Packit Service 6754ca
dnl $LIBS
Packit Service 6754ca
dnl
Packit Service 6754ca
dnl If you are only building threads programs, you may wish to use
Packit Service 6754ca
dnl these variables in your default LIBS, CFLAGS, and CC:
Packit Service 6754ca
dnl
Packit Service 6754ca
dnl        LIBS="$PTHREAD_LIBS $LIBS"
Packit Service 6754ca
dnl        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
Packit Service 6754ca
dnl        CC="$PTHREAD_CC"
Packit Service 6754ca
dnl
Packit Service 6754ca
dnl In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute
Packit Service 6754ca
dnl constant has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to
Packit Service 6754ca
dnl that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX).
Packit Service 6754ca
dnl
Packit Service 6754ca
dnl ACTION-IF-FOUND is a list of shell commands to run if a threads
Packit Service 6754ca
dnl library is found, and ACTION-IF-NOT-FOUND is a list of commands to
Packit Service 6754ca
dnl run it if it is not found. If ACTION-IF-FOUND is not specified, the
Packit Service 6754ca
dnl default action will define HAVE_PTHREAD.
Packit Service 6754ca
dnl
Packit Service 6754ca
dnl Please let the authors know if this macro fails on any platform, or
Packit Service 6754ca
dnl if you have any other suggestions or comments. This macro was based
Packit Service 6754ca
dnl on work by SGJ on autoconf scripts for FFTW (www.fftw.org) (with
Packit Service 6754ca
dnl help from M. Frigo), as well as ac_pthread and hb_pthread macros
Packit Service 6754ca
dnl posted by Alejandro Forero Cuervo to the autoconf macro repository.
Packit Service 6754ca
dnl We are also grateful for the helpful feedback of numerous users.
Packit Service 6754ca
dnl
Packit Service 6754ca
dnl @category InstalledPackages
Packit Service 6754ca
dnl @author Steven G. Johnson <stevenj@alum.mit.edu>
Packit Service 6754ca
dnl @version 2005-01-14
Packit Service 6754ca
dnl @license GPLWithACException
Packit Service 6754ca
Packit Service 6754ca
AC_DEFUN([ACX_PTHREAD], [
Packit Service 6754ca
AC_REQUIRE([AC_CANONICAL_HOST])
Packit Service 6754ca
AC_LANG_SAVE
Packit Service 6754ca
AC_LANG_C
Packit Service 6754ca
acx_pthread_ok=no
Packit Service 6754ca
Packit Service 6754ca
# We used to check for pthread.h first, but this fails if pthread.h
Packit Service 6754ca
# requires special compiler flags (e.g. on True64 or Sequent).
Packit Service 6754ca
# It gets checked for in the link test anyway.
Packit Service 6754ca
Packit Service 6754ca
# First of all, check if the user has set any of the PTHREAD_LIBS,
Packit Service 6754ca
# etcetera environment variables, and if threads linking works using
Packit Service 6754ca
# them:
Packit Service 6754ca
if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then
Packit Service 6754ca
        save_CFLAGS="$CFLAGS"
Packit Service 6754ca
        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
Packit Service 6754ca
        save_LIBS="$LIBS"
Packit Service 6754ca
        LIBS="$PTHREAD_LIBS $LIBS"
Packit Service 6754ca
        AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS])
Packit Service 6754ca
        AC_TRY_LINK_FUNC(pthread_join, acx_pthread_ok=yes)
Packit Service 6754ca
        AC_MSG_RESULT($acx_pthread_ok)
Packit Service 6754ca
        if test x"$acx_pthread_ok" = xno; then
Packit Service 6754ca
                PTHREAD_LIBS=""
Packit Service 6754ca
                PTHREAD_CFLAGS=""
Packit Service 6754ca
        fi
Packit Service 6754ca
        LIBS="$save_LIBS"
Packit Service 6754ca
        CFLAGS="$save_CFLAGS"
Packit Service 6754ca
fi
Packit Service 6754ca
Packit Service 6754ca
# We must check for the threads library under a number of different
Packit Service 6754ca
# names; the ordering is very important because some systems
Packit Service 6754ca
# (e.g. DEC) have both -lpthread and -lpthreads, where one of the
Packit Service 6754ca
# libraries is broken (non-POSIX).
Packit Service 6754ca
Packit Service 6754ca
# Create a list of thread flags to try.  Items starting with a "-" are
Packit Service 6754ca
# C compiler flags, and other items are library names, except for "none"
Packit Service 6754ca
# which indicates that we try without any flags at all, and "pthread-config"
Packit Service 6754ca
# which is a program returning the flags for the Pth emulation library.
Packit Service 6754ca
Packit Service 6754ca
acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config"
Packit Service 6754ca
Packit Service 6754ca
# The ordering *is* (sometimes) important.  Some notes on the
Packit Service 6754ca
# individual items follow:
Packit Service 6754ca
Packit Service 6754ca
# pthreads: AIX (must check this before -lpthread)
Packit Service 6754ca
# none: in case threads are in libc; should be tried before -Kthread and
Packit Service 6754ca
#       other compiler flags to prevent continual compiler warnings
Packit Service 6754ca
# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)
Packit Service 6754ca
# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)
Packit Service 6754ca
# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)
Packit Service 6754ca
# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads)
Packit Service 6754ca
# -pthreads: Solaris/gcc
Packit Service 6754ca
# -mthreads: Mingw32/gcc, Lynx/gcc
Packit Service 6754ca
# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it
Packit Service 6754ca
#      doesn't hurt to check since this sometimes defines pthreads too;
Packit Service 6754ca
#      also defines -D_REENTRANT)
Packit Service 6754ca
# pthread: Linux, etcetera
Packit Service 6754ca
# --thread-safe: KAI C++
Packit Service 6754ca
# pthread-config: use pthread-config program (for GNU Pth library)
Packit Service 6754ca
Packit Service 6754ca
case "${host_cpu}-${host_os}" in
Packit Service 6754ca
        *solaris*)
Packit Service 6754ca
Packit Service 6754ca
        # On Solaris (at least, for some versions), libc contains stubbed
Packit Service 6754ca
        # (non-functional) versions of the pthreads routines, so link-based
Packit Service 6754ca
        # tests will erroneously succeed.  (We need to link with -pthread or
Packit Service 6754ca
        # -lpthread.)  (The stubs are missing pthread_cleanup_push, or rather
Packit Service 6754ca
        # a function called by this macro, so we could check for that, but
Packit Service 6754ca
        # who knows whether they'll stub that too in a future libc.)  So,
Packit Service 6754ca
        # we'll just look for -pthreads and -lpthread first:
Packit Service 6754ca
Packit Service 6754ca
        acx_pthread_flags="-pthread -pthreads pthread -mt $acx_pthread_flags"
Packit Service 6754ca
        ;;
Packit Service 6754ca
esac
Packit Service 6754ca
Packit Service 6754ca
if test x"$acx_pthread_ok" = xno; then
Packit Service 6754ca
for flag in $acx_pthread_flags; do
Packit Service 6754ca
Packit Service 6754ca
        case $flag in
Packit Service 6754ca
                none)
Packit Service 6754ca
                AC_MSG_CHECKING([whether pthreads work without any flags])
Packit Service 6754ca
                ;;
Packit Service 6754ca
Packit Service 6754ca
                -*)
Packit Service 6754ca
                AC_MSG_CHECKING([whether pthreads work with $flag])
Packit Service 6754ca
                PTHREAD_CFLAGS="$flag"
Packit Service 6754ca
                PTHREAD_LIBS="$flag"
Packit Service 6754ca
                ;;
Packit Service 6754ca
Packit Service 6754ca
		pthread-config)
Packit Service 6754ca
		AC_CHECK_PROG(acx_pthread_config, pthread-config, yes, no)
Packit Service 6754ca
		if test x"$acx_pthread_config" = xno; then continue; fi
Packit Service 6754ca
		PTHREAD_CFLAGS="`pthread-config --cflags`"
Packit Service 6754ca
		PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`"
Packit Service 6754ca
		;;
Packit Service 6754ca
Packit Service 6754ca
                *)
Packit Service 6754ca
                AC_MSG_CHECKING([for the pthreads library -l$flag])
Packit Service 6754ca
                PTHREAD_LIBS="-l$flag"
Packit Service 6754ca
                ;;
Packit Service 6754ca
        esac
Packit Service 6754ca
Packit Service 6754ca
        save_LIBS="$LIBS"
Packit Service 6754ca
        save_CFLAGS="$CFLAGS"
Packit Service 6754ca
        LIBS="$PTHREAD_LIBS $LIBS"
Packit Service 6754ca
        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
Packit Service 6754ca
Packit Service 6754ca
        # Check for various functions.  We must include pthread.h,
Packit Service 6754ca
        # since some functions may be macros.  (On the Sequent, we
Packit Service 6754ca
        # need a special flag -Kthread to make this header compile.)
Packit Service 6754ca
        # We check for pthread_join because it is in -lpthread on IRIX
Packit Service 6754ca
        # while pthread_create is in libc.  We check for pthread_attr_init
Packit Service 6754ca
        # due to DEC craziness with -lpthreads.  We check for
Packit Service 6754ca
        # pthread_cleanup_push because it is one of the few pthread
Packit Service 6754ca
        # functions on Solaris that doesn't have a non-functional libc stub.
Packit Service 6754ca
        # We try pthread_create on general principles.
Packit Service 6754ca
        AC_TRY_LINK([#include <pthread.h>],
Packit Service 6754ca
                    [pthread_t th; pthread_join(th, 0);
Packit Service 6754ca
                     pthread_attr_init(0); pthread_cleanup_push(0, 0);
Packit Service 6754ca
                     pthread_create(0,0,0,0); pthread_cleanup_pop(0); ],
Packit Service 6754ca
                    [acx_pthread_ok=yes])
Packit Service 6754ca
Packit Service 6754ca
        LIBS="$save_LIBS"
Packit Service 6754ca
        CFLAGS="$save_CFLAGS"
Packit Service 6754ca
Packit Service 6754ca
        AC_MSG_RESULT($acx_pthread_ok)
Packit Service 6754ca
        if test "x$acx_pthread_ok" = xyes; then
Packit Service 6754ca
                break;
Packit Service 6754ca
        fi
Packit Service 6754ca
Packit Service 6754ca
        PTHREAD_LIBS=""
Packit Service 6754ca
        PTHREAD_CFLAGS=""
Packit Service 6754ca
done
Packit Service 6754ca
fi
Packit Service 6754ca
Packit Service 6754ca
# Various other checks:
Packit Service 6754ca
if test "x$acx_pthread_ok" = xyes; then
Packit Service 6754ca
        save_LIBS="$LIBS"
Packit Service 6754ca
        LIBS="$PTHREAD_LIBS $LIBS"
Packit Service 6754ca
        save_CFLAGS="$CFLAGS"
Packit Service 6754ca
        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
Packit Service 6754ca
Packit Service 6754ca
        # Detect AIX lossage: JOINABLE attribute is called UNDETACHED.
Packit Service 6754ca
	AC_MSG_CHECKING([for joinable pthread attribute])
Packit Service 6754ca
	attr_name=unknown
Packit Service 6754ca
	for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do
Packit Service 6754ca
	    AC_TRY_LINK([#include <pthread.h>], [int attr=$attr;],
Packit Service 6754ca
                        [attr_name=$attr; break])
Packit Service 6754ca
	done
Packit Service 6754ca
        AC_MSG_RESULT($attr_name)
Packit Service 6754ca
        if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then
Packit Service 6754ca
            AC_DEFINE_UNQUOTED(PTHREAD_CREATE_JOINABLE, $attr_name,
Packit Service 6754ca
                               [Define to necessary symbol if this constant
Packit Service 6754ca
                                uses a non-standard name on your system.])
Packit Service 6754ca
        fi
Packit Service 6754ca
Packit Service 6754ca
        AC_MSG_CHECKING([if more special flags are required for pthreads])
Packit Service 6754ca
        flag=no
Packit Service 6754ca
        case "${host_cpu}-${host_os}" in
Packit Service 6754ca
            *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";;
Packit Service 6754ca
            *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";;
Packit Service 6754ca
        esac
Packit Service 6754ca
        AC_MSG_RESULT(${flag})
Packit Service 6754ca
        if test "x$flag" != xno; then
Packit Service 6754ca
            PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS"
Packit Service 6754ca
        fi
Packit Service 6754ca
Packit Service 6754ca
        LIBS="$save_LIBS"
Packit Service 6754ca
        CFLAGS="$save_CFLAGS"
Packit Service 6754ca
Packit Service 6754ca
        # More AIX lossage: must compile with cc_r
Packit Service 6754ca
        AC_CHECK_PROG(PTHREAD_CC, cc_r, cc_r, ${CC})
Packit Service 6754ca
else
Packit Service 6754ca
        PTHREAD_CC="$CC"
Packit Service 6754ca
fi
Packit Service 6754ca
Packit Service 6754ca
AC_SUBST(PTHREAD_LIBS)
Packit Service 6754ca
AC_SUBST(PTHREAD_CFLAGS)
Packit Service 6754ca
AC_SUBST(PTHREAD_CC)
Packit Service 6754ca
Packit Service 6754ca
# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
Packit Service 6754ca
if test x"$acx_pthread_ok" = xyes; then
Packit Service 6754ca
        ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1])
Packit Service 6754ca
        :
Packit Service 6754ca
else
Packit Service 6754ca
        acx_pthread_ok=no
Packit Service 6754ca
        $2
Packit Service 6754ca
fi
Packit Service 6754ca
Packit Service 6754ca
AC_LANG_RESTORE
Packit Service 6754ca
])dnl ACX_PTHREAD
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
dnl
Packit Service 6754ca
dnl Posix Semaphore support
Packit Service 6754ca
dnl
Packit Service 6754ca
Packit Service 6754ca
AC_DEFUN([AM_POSIX_SEM],
Packit Service 6754ca
[
Packit Service 6754ca
AC_ARG_ENABLE([posix-sem], AC_HELP_STRING([--disable-posix-sem],
Packit Service 6754ca
    [do not attempt to use POSIX unnamed semaphores]))
Packit Service 6754ca
Packit Service 6754ca
am_posix_sem_ok=no
Packit Service 6754ca
if test "${enable_posix_sem:-yes}" != "no"; then
Packit Service 6754ca
    AC_CHECK_HEADERS([semaphore.h], [
Packit Service 6754ca
	AC_SEARCH_LIBS(sem_init, [posix4 pthread], [
Packit Service 6754ca
	    AC_MSG_CHECKING([whether to use POSIX unnamed semaphores])
Packit Service 6754ca
	    AC_RUN_IFELSE([
Packit Service 6754ca
		AC_LANG_PROGRAM([#include <semaphore.h>], [
Packit Service 6754ca
		    sem_t mysem;
Packit Service 6754ca
		    if (sem_init (&mysem, 1, 1) == 0)
Packit Service 6754ca
		    {
Packit Service 6754ca
			if (sem_wait (&mysem) == 0)
Packit Service 6754ca
			{
Packit Service 6754ca
			    sem_post (&mysem);
Packit Service 6754ca
			    sem_destroy (&mysem);
Packit Service 6754ca
			    return 0;
Packit Service 6754ca
			}
Packit Service 6754ca
		    }
Packit Service 6754ca
		    return 1;
Packit Service 6754ca
		])
Packit Service 6754ca
		], [
Packit Service 6754ca
		AC_MSG_RESULT([yes])
Packit Service 6754ca
		am_posix_sem_ok=yes], [
Packit Service 6754ca
		AC_MSG_RESULT([no (pshared not usable)])], [
Packit Service 6754ca
		AC_MSG_RESULT([no (cannot check usability when cross compiling)])])
Packit Service 6754ca
	])
Packit Service 6754ca
    ])
Packit Service 6754ca
fi
Packit Service 6754ca
Packit Service 6754ca
# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
Packit Service 6754ca
if test x"$am_posix_sem_ok" = xyes; then
Packit Service 6754ca
        ifelse([$1],,AC_DEFINE(HAVE_POSIX_SEMAPHORES),[$1])
Packit Service 6754ca
        :
Packit Service 6754ca
else
Packit Service 6754ca
        am_posix_sem_ok=no
Packit Service 6754ca
        $2
Packit Service 6754ca
fi
Packit Service 6754ca
])
Packit Service 6754ca
Packit Service 6754ca