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