Annotation of embedaddon/libiconv/srcm4/threadlib.m4, revision 1.1.1.3

1.1.1.3 ! misho       1: # threadlib.m4 serial 16
        !             2: dnl Copyright (C) 2005-2019 Free Software Foundation, Inc.
1.1       misho       3: dnl This file is free software; the Free Software Foundation
                      4: dnl gives unlimited permission to copy and/or distribute it,
                      5: dnl with or without modifications, as long as this notice is preserved.
                      6: 
                      7: dnl From Bruno Haible.
                      8: 
1.1.1.3 ! misho       9: AC_PREREQ([2.60])
        !            10: 
1.1       misho      11: dnl gl_THREADLIB
                     12: dnl ------------
                     13: dnl Tests for a multithreading library to be used.
1.1.1.2   misho      14: dnl If the configure.ac contains a definition of the gl_THREADLIB_DEFAULT_NO
                     15: dnl (it must be placed before the invocation of gl_THREADLIB_EARLY!), then the
                     16: dnl default is 'no', otherwise it is system dependent. In both cases, the user
                     17: dnl can change the choice through the options --enable-threads=choice or
                     18: dnl --disable-threads.
1.1       misho      19: dnl Defines at most one of the macros USE_POSIX_THREADS, USE_SOLARIS_THREADS,
1.1.1.3 ! misho      20: dnl USE_PTH_THREADS, USE_WINDOWS_THREADS
1.1       misho      21: dnl Sets the variables LIBTHREAD and LTLIBTHREAD to the linker options for use
                     22: dnl in a Makefile (LIBTHREAD for use without libtool, LTLIBTHREAD for use with
                     23: dnl libtool).
                     24: dnl Sets the variables LIBMULTITHREAD and LTLIBMULTITHREAD similarly, for
                     25: dnl programs that really need multithread functionality. The difference
                     26: dnl between LIBTHREAD and LIBMULTITHREAD is that on platforms supporting weak
1.1.1.3 ! misho      27: dnl symbols, typically LIBTHREAD is empty whereas LIBMULTITHREAD is not.
1.1       misho      28: dnl Adds to CPPFLAGS the flag -D_REENTRANT or -D_THREAD_SAFE if needed for
                     29: dnl multithread-safe programs.
                     30: 
                     31: AC_DEFUN([gl_THREADLIB_EARLY],
                     32: [
                     33:   AC_REQUIRE([gl_THREADLIB_EARLY_BODY])
                     34: ])
                     35: 
                     36: dnl The guts of gl_THREADLIB_EARLY. Needs to be expanded only once.
                     37: 
                     38: AC_DEFUN([gl_THREADLIB_EARLY_BODY],
                     39: [
                     40:   dnl Ordering constraints: This macro modifies CPPFLAGS in a way that
                     41:   dnl influences the result of the autoconf tests that test for *_unlocked
                     42:   dnl declarations, on AIX 5 at least. Therefore it must come early.
                     43:   AC_BEFORE([$0], [gl_FUNC_GLIBC_UNLOCKED_IO])dnl
                     44:   AC_BEFORE([$0], [gl_ARGP])dnl
                     45: 
                     46:   AC_REQUIRE([AC_CANONICAL_HOST])
                     47:   dnl _GNU_SOURCE is needed for pthread_rwlock_t on glibc systems.
1.1.1.3 ! misho      48:   AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
1.1       misho      49:   dnl Check for multithreading.
1.1.1.2   misho      50:   m4_ifdef([gl_THREADLIB_DEFAULT_NO],
                     51:     [m4_divert_text([DEFAULTS], [gl_use_threads_default=no])],
                     52:     [m4_divert_text([DEFAULTS], [gl_use_threads_default=])])
1.1       misho      53:   AC_ARG_ENABLE([threads],
1.1.1.3 ! misho      54: AC_HELP_STRING([--enable-threads={posix|solaris|pth|windows}], [specify multithreading API])m4_ifdef([gl_THREADLIB_DEFAULT_NO], [], [
1.1.1.2   misho      55: AC_HELP_STRING([--disable-threads], [build without multithread safety])]),
1.1       misho      56:     [gl_use_threads=$enableval],
                     57:     [if test -n "$gl_use_threads_default"; then
                     58:        gl_use_threads="$gl_use_threads_default"
                     59:      else
1.1.1.2   misho      60: changequote(,)dnl
1.1       misho      61:        case "$host_os" in
                     62:          dnl Disable multithreading by default on OSF/1, because it interferes
                     63:          dnl with fork()/exec(): When msgexec is linked with -lpthread, its
                     64:          dnl child process gets an endless segmentation fault inside execvp().
1.1.1.2   misho      65:          dnl Disable multithreading by default on Cygwin 1.5.x, because it has
                     66:          dnl bugs that lead to endless loops or crashes. See
1.1.1.3 ! misho      67:          dnl <https://cygwin.com/ml/cygwin/2009-08/msg00283.html>.
1.1       misho      68:          osf*) gl_use_threads=no ;;
1.1.1.2   misho      69:          cygwin*)
                     70:                case `uname -r` in
                     71:                  1.[0-5].*) gl_use_threads=no ;;
                     72:                  *)         gl_use_threads=yes ;;
                     73:                esac
                     74:                ;;
1.1       misho      75:          *)    gl_use_threads=yes ;;
                     76:        esac
1.1.1.2   misho      77: changequote([,])dnl
1.1       misho      78:      fi
                     79:     ])
                     80:   if test "$gl_use_threads" = yes || test "$gl_use_threads" = posix; then
                     81:     # For using <pthread.h>:
                     82:     case "$host_os" in
                     83:       osf*)
                     84:         # On OSF/1, the compiler needs the flag -D_REENTRANT so that it
                     85:         # groks <pthread.h>. cc also understands the flag -pthread, but
                     86:         # we don't use it because 1. gcc-2.95 doesn't understand -pthread,
                     87:         # 2. putting a flag into CPPFLAGS that has an effect on the linker
1.1.1.2   misho      88:         # causes the AC_LINK_IFELSE test below to succeed unexpectedly,
1.1       misho      89:         # leading to wrong values of LIBTHREAD and LTLIBTHREAD.
                     90:         CPPFLAGS="$CPPFLAGS -D_REENTRANT"
                     91:         ;;
                     92:     esac
                     93:     # Some systems optimize for single-threaded programs by default, and
                     94:     # need special flags to disable these optimizations. For example, the
                     95:     # definition of 'errno' in <errno.h>.
                     96:     case "$host_os" in
                     97:       aix* | freebsd*) CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE" ;;
                     98:       solaris*) CPPFLAGS="$CPPFLAGS -D_REENTRANT" ;;
                     99:     esac
                    100:   fi
                    101: ])
                    102: 
                    103: dnl The guts of gl_THREADLIB. Needs to be expanded only once.
                    104: 
                    105: AC_DEFUN([gl_THREADLIB_BODY],
                    106: [
                    107:   AC_REQUIRE([gl_THREADLIB_EARLY_BODY])
                    108:   gl_threads_api=none
                    109:   LIBTHREAD=
                    110:   LTLIBTHREAD=
                    111:   LIBMULTITHREAD=
                    112:   LTLIBMULTITHREAD=
                    113:   if test "$gl_use_threads" != no; then
                    114:     dnl Check whether the compiler and linker support weak declarations.
1.1.1.2   misho     115:     AC_CACHE_CHECK([whether imported symbols can be declared weak],
                    116:       [gl_cv_have_weak],
                    117:       [gl_cv_have_weak=no
                    118:        dnl First, test whether the compiler accepts it syntactically.
                    119:        AC_LINK_IFELSE(
                    120:          [AC_LANG_PROGRAM(
                    121:             [[extern void xyzzy ();
                    122: #pragma weak xyzzy]],
                    123:             [[xyzzy();]])],
                    124:          [gl_cv_have_weak=maybe])
                    125:        if test $gl_cv_have_weak = maybe; then
                    126:          dnl Second, test whether it actually works. On Cygwin 1.7.2, with
                    127:          dnl gcc 4.3, symbols declared weak always evaluate to the address 0.
                    128:          AC_RUN_IFELSE(
                    129:            [AC_LANG_SOURCE([[
                    130: #include <stdio.h>
                    131: #pragma weak fputs
                    132: int main ()
                    133: {
                    134:   return (fputs == NULL);
                    135: }]])],
                    136:            [gl_cv_have_weak=yes],
                    137:            [gl_cv_have_weak=no],
                    138:            [dnl When cross-compiling, assume that only ELF platforms support
                    139:             dnl weak symbols.
                    140:             AC_EGREP_CPP([Extensible Linking Format],
                    141:               [#ifdef __ELF__
                    142:                Extensible Linking Format
                    143:                #endif
                    144:               ],
                    145:               [gl_cv_have_weak="guessing yes"],
                    146:               [gl_cv_have_weak="guessing no"])
                    147:            ])
                    148:        fi
1.1.1.3 ! misho     149:        dnl But when linking statically, weak symbols don't work.
        !           150:        case " $LDFLAGS " in
        !           151:          *" -static "*) gl_cv_have_weak=no ;;
        !           152:        esac
1.1.1.2   misho     153:       ])
1.1       misho     154:     if test "$gl_use_threads" = yes || test "$gl_use_threads" = posix; then
                    155:       # On OSF/1, the compiler needs the flag -pthread or -D_REENTRANT so that
                    156:       # it groks <pthread.h>. It's added above, in gl_THREADLIB_EARLY_BODY.
                    157:       AC_CHECK_HEADER([pthread.h],
                    158:         [gl_have_pthread_h=yes], [gl_have_pthread_h=no])
                    159:       if test "$gl_have_pthread_h" = yes; then
                    160:         # Other possible tests:
                    161:         #   -lpthreads (FSU threads, PCthreads)
                    162:         #   -lgthreads
                    163:         gl_have_pthread=
                    164:         # Test whether both pthread_mutex_lock and pthread_mutexattr_init exist
                    165:         # in libc. IRIX 6.5 has the first one in both libc and libpthread, but
                    166:         # the second one only in libpthread, and lock.c needs it.
1.1.1.3 ! misho     167:         #
        !           168:         # If -pthread works, prefer it to -lpthread, since Ubuntu 14.04
        !           169:         # needs -pthread for some reason.  See:
        !           170:         # https://lists.gnu.org/r/bug-gnulib/2014-09/msg00023.html
        !           171:         save_LIBS=$LIBS
        !           172:         for gl_pthread in '' '-pthread'; do
        !           173:           LIBS="$LIBS $gl_pthread"
        !           174:           AC_LINK_IFELSE(
        !           175:             [AC_LANG_PROGRAM(
        !           176:                [[#include <pthread.h>
        !           177:                  pthread_mutex_t m;
        !           178:                  pthread_mutexattr_t ma;
        !           179:                ]],
        !           180:                [[pthread_mutex_lock (&m);
        !           181:                  pthread_mutexattr_init (&ma);]])],
        !           182:             [gl_have_pthread=yes
        !           183:              LIBTHREAD=$gl_pthread LTLIBTHREAD=$gl_pthread
        !           184:              LIBMULTITHREAD=$gl_pthread LTLIBMULTITHREAD=$gl_pthread])
        !           185:           LIBS=$save_LIBS
        !           186:           test -n "$gl_have_pthread" && break
        !           187:         done
        !           188: 
1.1       misho     189:         # Test for libpthread by looking for pthread_kill. (Not pthread_self,
                    190:         # since it is defined as a macro on OSF/1.)
1.1.1.3 ! misho     191:         if test -n "$gl_have_pthread" && test -z "$LIBTHREAD"; then
1.1       misho     192:           # The program links fine without libpthread. But it may actually
                    193:           # need to link with libpthread in order to create multiple threads.
                    194:           AC_CHECK_LIB([pthread], [pthread_kill],
                    195:             [LIBMULTITHREAD=-lpthread LTLIBMULTITHREAD=-lpthread
                    196:              # On Solaris and HP-UX, most pthread functions exist also in libc.
                    197:              # Therefore pthread_in_use() needs to actually try to create a
                    198:              # thread: pthread_create from libc will fail, whereas
                    199:              # pthread_create will actually create a thread.
1.1.1.3 ! misho     200:              # On Solaris 10 or newer, this test is no longer needed, because
        !           201:              # libc contains the fully functional pthread functions.
1.1       misho     202:              case "$host_os" in
1.1.1.3 ! misho     203:                solaris | solaris2.[1-9] | solaris2.[1-9].* | hpux*)
1.1       misho     204:                  AC_DEFINE([PTHREAD_IN_USE_DETECTION_HARD], [1],
                    205:                    [Define if the pthread_in_use() detection is hard.])
                    206:              esac
                    207:             ])
1.1.1.3 ! misho     208:         elif test -z "$gl_have_pthread"; then
1.1       misho     209:           # Some library is needed. Try libpthread and libc_r.
                    210:           AC_CHECK_LIB([pthread], [pthread_kill],
                    211:             [gl_have_pthread=yes
                    212:              LIBTHREAD=-lpthread LTLIBTHREAD=-lpthread
                    213:              LIBMULTITHREAD=-lpthread LTLIBMULTITHREAD=-lpthread])
                    214:           if test -z "$gl_have_pthread"; then
                    215:             # For FreeBSD 4.
                    216:             AC_CHECK_LIB([c_r], [pthread_kill],
                    217:               [gl_have_pthread=yes
                    218:                LIBTHREAD=-lc_r LTLIBTHREAD=-lc_r
                    219:                LIBMULTITHREAD=-lc_r LTLIBMULTITHREAD=-lc_r])
                    220:           fi
                    221:         fi
                    222:         if test -n "$gl_have_pthread"; then
                    223:           gl_threads_api=posix
                    224:           AC_DEFINE([USE_POSIX_THREADS], [1],
                    225:             [Define if the POSIX multithreading library can be used.])
                    226:           if test -n "$LIBMULTITHREAD" || test -n "$LTLIBMULTITHREAD"; then
1.1.1.2   misho     227:             if case "$gl_cv_have_weak" in *yes) true;; *) false;; esac; then
1.1       misho     228:               AC_DEFINE([USE_POSIX_THREADS_WEAK], [1],
                    229:                 [Define if references to the POSIX multithreading library should be made weak.])
                    230:               LIBTHREAD=
                    231:               LTLIBTHREAD=
                    232:             fi
                    233:           fi
                    234:         fi
                    235:       fi
                    236:     fi
                    237:     if test -z "$gl_have_pthread"; then
                    238:       if test "$gl_use_threads" = yes || test "$gl_use_threads" = solaris; then
                    239:         gl_have_solaristhread=
                    240:         gl_save_LIBS="$LIBS"
                    241:         LIBS="$LIBS -lthread"
1.1.1.2   misho     242:         AC_LINK_IFELSE(
                    243:           [AC_LANG_PROGRAM(
                    244:              [[
                    245: #include <thread.h>
                    246: #include <synch.h>
                    247:              ]],
                    248:              [[thr_self();]])],
1.1       misho     249:           [gl_have_solaristhread=yes])
                    250:         LIBS="$gl_save_LIBS"
                    251:         if test -n "$gl_have_solaristhread"; then
                    252:           gl_threads_api=solaris
                    253:           LIBTHREAD=-lthread
                    254:           LTLIBTHREAD=-lthread
                    255:           LIBMULTITHREAD="$LIBTHREAD"
                    256:           LTLIBMULTITHREAD="$LTLIBTHREAD"
                    257:           AC_DEFINE([USE_SOLARIS_THREADS], [1],
                    258:             [Define if the old Solaris multithreading library can be used.])
1.1.1.2   misho     259:           if case "$gl_cv_have_weak" in *yes) true;; *) false;; esac; then
1.1       misho     260:             AC_DEFINE([USE_SOLARIS_THREADS_WEAK], [1],
                    261:               [Define if references to the old Solaris multithreading library should be made weak.])
                    262:             LIBTHREAD=
                    263:             LTLIBTHREAD=
                    264:           fi
                    265:         fi
                    266:       fi
                    267:     fi
                    268:     if test "$gl_use_threads" = pth; then
                    269:       gl_save_CPPFLAGS="$CPPFLAGS"
                    270:       AC_LIB_LINKFLAGS([pth])
                    271:       gl_have_pth=
                    272:       gl_save_LIBS="$LIBS"
1.1.1.2   misho     273:       LIBS="$LIBS $LIBPTH"
                    274:       AC_LINK_IFELSE(
                    275:         [AC_LANG_PROGRAM([[#include <pth.h>]], [[pth_self();]])],
                    276:         [gl_have_pth=yes])
1.1       misho     277:       LIBS="$gl_save_LIBS"
                    278:       if test -n "$gl_have_pth"; then
                    279:         gl_threads_api=pth
                    280:         LIBTHREAD="$LIBPTH"
                    281:         LTLIBTHREAD="$LTLIBPTH"
                    282:         LIBMULTITHREAD="$LIBTHREAD"
                    283:         LTLIBMULTITHREAD="$LTLIBTHREAD"
                    284:         AC_DEFINE([USE_PTH_THREADS], [1],
                    285:           [Define if the GNU Pth multithreading library can be used.])
                    286:         if test -n "$LIBMULTITHREAD" || test -n "$LTLIBMULTITHREAD"; then
1.1.1.2   misho     287:           if case "$gl_cv_have_weak" in *yes) true;; *) false;; esac; then
1.1       misho     288:             AC_DEFINE([USE_PTH_THREADS_WEAK], [1],
                    289:               [Define if references to the GNU Pth multithreading library should be made weak.])
                    290:             LIBTHREAD=
                    291:             LTLIBTHREAD=
                    292:           fi
                    293:         fi
                    294:       else
                    295:         CPPFLAGS="$gl_save_CPPFLAGS"
                    296:       fi
                    297:     fi
                    298:     if test -z "$gl_have_pthread"; then
1.1.1.3 ! misho     299:       case "$gl_use_threads" in
        !           300:         yes | windows | win32) # The 'win32' is for backward compatibility.
        !           301:           if { case "$host_os" in
        !           302:                  mingw*) true;;
        !           303:                  *) false;;
        !           304:                esac
        !           305:              }; then
        !           306:             gl_threads_api=windows
        !           307:             AC_DEFINE([USE_WINDOWS_THREADS], [1],
        !           308:               [Define if the native Windows multithreading API can be used.])
        !           309:           fi
        !           310:           ;;
        !           311:       esac
1.1       misho     312:     fi
                    313:   fi
                    314:   AC_MSG_CHECKING([for multithread API to use])
                    315:   AC_MSG_RESULT([$gl_threads_api])
                    316:   AC_SUBST([LIBTHREAD])
                    317:   AC_SUBST([LTLIBTHREAD])
                    318:   AC_SUBST([LIBMULTITHREAD])
                    319:   AC_SUBST([LTLIBMULTITHREAD])
                    320: ])
                    321: 
                    322: AC_DEFUN([gl_THREADLIB],
                    323: [
                    324:   AC_REQUIRE([gl_THREADLIB_EARLY])
                    325:   AC_REQUIRE([gl_THREADLIB_BODY])
                    326: ])
                    327: 
                    328: 
                    329: dnl gl_DISABLE_THREADS
                    330: dnl ------------------
                    331: dnl Sets the gl_THREADLIB default so that threads are not used by default.
                    332: dnl The user can still override it at installation time, by using the
                    333: dnl configure option '--enable-threads'.
                    334: 
                    335: AC_DEFUN([gl_DISABLE_THREADS], [
                    336:   m4_divert_text([INIT_PREPARE], [gl_use_threads_default=no])
                    337: ])
                    338: 
                    339: 
                    340: dnl Survey of platforms:
                    341: dnl
1.1.1.3 ! misho     342: dnl Platform           Available  Compiler    Supports   test-lock
        !           343: dnl                    flavours   option      weak       result
        !           344: dnl ---------------    ---------  ---------   --------   ---------
        !           345: dnl Linux 2.4/glibc    posix      -lpthread       Y      OK
        !           346: dnl
        !           347: dnl GNU Hurd/glibc     posix
1.1       misho     348: dnl
1.1.1.3 ! misho     349: dnl Ubuntu 14.04       posix      -pthread        Y      OK
1.1       misho     350: dnl
1.1.1.3 ! misho     351: dnl FreeBSD 5.3        posix      -lc_r           Y
        !           352: dnl                    posix      -lkse ?         Y
        !           353: dnl                    posix      -lpthread ?     Y
        !           354: dnl                    posix      -lthr           Y
1.1       misho     355: dnl
1.1.1.3 ! misho     356: dnl FreeBSD 5.2        posix      -lc_r           Y
        !           357: dnl                    posix      -lkse           Y
        !           358: dnl                    posix      -lthr           Y
1.1       misho     359: dnl
1.1.1.3 ! misho     360: dnl FreeBSD 4.0,4.10   posix      -lc_r           Y      OK
1.1       misho     361: dnl
1.1.1.3 ! misho     362: dnl NetBSD 1.6         --
1.1       misho     363: dnl
1.1.1.3 ! misho     364: dnl OpenBSD 3.4        posix      -lpthread       Y      OK
1.1       misho     365: dnl
1.1.1.3 ! misho     366: dnl Mac OS X 10.[123]  posix      -lpthread       Y      OK
1.1       misho     367: dnl
1.1.1.3 ! misho     368: dnl Solaris 7,8,9      posix      -lpthread       Y      Sol 7,8: 0.0; Sol 9: OK
        !           369: dnl                    solaris    -lthread        Y      Sol 7,8: 0.0; Sol 9: OK
1.1       misho     370: dnl
1.1.1.3 ! misho     371: dnl HP-UX 11           posix      -lpthread       N (cc) OK
1.1       misho     372: dnl                                               Y (gcc)
                    373: dnl
1.1.1.3 ! misho     374: dnl IRIX 6.5           posix      -lpthread       Y      0.5
1.1       misho     375: dnl
1.1.1.3 ! misho     376: dnl AIX 4.3,5.1        posix      -lpthread       N      AIX 4: 0.5; AIX 5: OK
1.1       misho     377: dnl
1.1.1.3 ! misho     378: dnl OSF/1 4.0,5.1      posix      -pthread (cc)   N      OK
1.1       misho     379: dnl                               -lpthread (gcc) Y
                    380: dnl
1.1.1.3 ! misho     381: dnl Cygwin             posix      -lpthread       Y      OK
1.1       misho     382: dnl
1.1.1.3 ! misho     383: dnl Any of the above   pth        -lpth                  0.0
1.1       misho     384: dnl
1.1.1.3 ! misho     385: dnl Mingw              windows                    N      OK
1.1       misho     386: dnl
1.1.1.3 ! misho     387: dnl BeOS 5             --
1.1       misho     388: dnl
                    389: dnl The test-lock result shows what happens if in test-lock.c EXPLICIT_YIELD is
                    390: dnl turned off:
                    391: dnl   OK if all three tests terminate OK,
                    392: dnl   0.5 if the first test terminates OK but the second one loops endlessly,
                    393: dnl   0.0 if the first test already loops endlessly.

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>