X-Git-Url: http://git.hcoop.net/bpt/guile.git/blobdiff_plain/eb9ef08b772597d002e1f183750881cc7662e0bf..2e12c1a2b7a5d066a4ef07b32c19cdf8d2f1738b:/acinclude.m4 diff --git a/acinclude.m4 b/acinclude.m4 dissimilarity index 69% index 9918d0e1b..6a1470f24 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -1,283 +1,578 @@ -dnl On the NeXT, #including doesn't give you a definition for -dnl struct utime, unless you #define _POSIX_SOURCE. - -AC_DEFUN(GUILE_STRUCT_UTIMBUF, [ - AC_CACHE_CHECK([whether we need POSIX to get struct utimbuf], - guile_cv_struct_utimbuf_needs_posix, - [AC_TRY_CPP([ -#ifdef __EMX__ -#include -#else -#include -#endif -struct utime blah; -], - guile_cv_struct_utimbuf_needs_posix=no, - guile_cv_struct_utimbuf_needs_posix=yes)]) - if test "$guile_cv_struct_utimbuf_needs_posix" = yes; then - AC_DEFINE(UTIMBUF_NEEDS_POSIX) - fi]) - - - - -dnl -dnl Apparently, at CMU they have a weird version of libc.h that is -dnl installed in /usr/local/include and conflicts with unistd.h. -dnl In these situations, we should not #include libc.h. -dnl This test arranges to #define LIBC_H_WITH_UNISTD_H iff libc.h is -dnl present on the system, and is safe to #include. -dnl -AC_DEFUN([GUILE_HEADER_LIBC_WITH_UNISTD], - [ - AC_CHECK_HEADERS(libc.h unistd.h) - AC_CACHE_CHECK( - "whether libc.h and unistd.h can be included together", - guile_cv_header_libc_with_unistd, - [ - if test "$ac_cv_header_libc_h" = "no"; then - guile_cv_header_libc_with_unistd="no" - elif test "$ac_cv_header_unistd.h" = "no"; then - guile_cv_header_libc_with_unistd="yes" - else - AC_TRY_COMPILE( - [ -# include -# include - ], - [], - [guile_cv_header_libc_with_unistd=yes], - [guile_cv_header_libc_with_unistd=no] - ) - fi - ] - ) - if test "$guile_cv_header_libc_with_unistd" = yes; then - AC_DEFINE(LIBC_H_WITH_UNISTD_H) - fi - ] -) - - - -dnl This is needed when we want to check for the same function repeatedly -dnl with other parameters, such as libraries, varying. -dnl -dnl GUILE_NAMED_CHECK_FUNC(FUNCTION, TESTNAME, -dnl [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) -AC_DEFUN(GUILE_NAMED_CHECK_FUNC, -[AC_MSG_CHECKING([for $1]) -AC_CACHE_VAL(ac_cv_func_$1_$2, -[AC_TRY_LINK( -dnl Don't include because on OSF/1 3.0 it includes -dnl which includes which contains a prototype for -dnl select. Similarly for bzero. -[/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $1(); below. */ -#include -/* Override any gcc2 internal prototype to avoid an error. */ -]ifelse(AC_LANG, CPLUSPLUS, [#ifdef __cplusplus -extern "C" -#endif -])dnl -[/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $1(); -], [ -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$1) || defined (__stub___$1) -choke me -#else -$1(); -#endif -], eval "ac_cv_func_$1_$2=yes", eval "ac_cv_func_$1_$2=no")]) -if eval "test \"`echo '$ac_cv_func_'$1'_'$2`\" = yes"; then - AC_MSG_RESULT(yes) - ifelse([$3], , :, [$3]) -else - AC_MSG_RESULT(no) -ifelse([$4], , , [$4 -])dnl -fi -]) - - - -dnl Check checks whether dlsym (if present) requires a leading underscore. -dnl Written by Dan Hagerty for scsh-0.5.0. -AC_DEFUN(GUILE_DLSYM_USCORE, [ - AC_MSG_CHECKING(for underscore before symbols) - AC_CACHE_VAL(guile_cv_uscore,[ - echo "main(){int i=1;} - fnord(){int i=23; int ltuae=42;}" > conftest.c - ${CC} conftest.c > /dev/null - if (nm a.out | grep _fnord) > /dev/null; then - guile_cv_uscore=yes - else - guile_cv_uscore=no - fi]) - AC_MSG_RESULT($guile_cv_uscore) - rm -f conftest.c a.out - - if test $guile_cv_uscore = yes; then - AC_DEFINE(USCORE) - - if test $ac_cv_func_dlopen = yes -o $ac_cv_lib_dl_dlopen = yes ; then - AC_MSG_CHECKING(whether dlsym always adds an underscore for us) - AC_CACHE_VAL(guile_cv_dlsym_adds_uscore,AC_TRY_RUN( [ -#include -#include -fnord() { int i=42;} -main() { void *self, *ptr1, *ptr2; self=dlopen(NULL,RTLD_LAZY); - if(self) { ptr1=dlsym(self,"fnord"); ptr2=dlsym(self,"_fnord"); - if(ptr1 && !ptr2) exit(0); } exit(1); } -], [guile_cv_dlsym_adds_uscore=yes - AC_DEFINE(DLSYM_ADDS_USCORE) ], guile_cv_dlsym_adds_uscore=no, - guile_cv_dlsym_adds_uscore=no)) - - AC_MSG_RESULT($guile_cv_dlsym_adds_uscore) - fi - fi -]) - -dnl QTHREADS_CONFIGURE configures the QuickThreads package. The QT -dnl sources should be in $srcdir/qt. If configuration succeeds, this -dnl macro creates the appropriate symlinks in the qt object directory, -dnl and sets the following variables, used in building libqthreads.a: -dnl QTHREAD_LTLIBS --- set to libqthreads.la if configuration -dnl succeeds, or the empty string if configuration fails. -dnl qtmd_h, qtmds_s, qtmdc_c, qtdmdb_s --- the names of the machine- -dnl dependent source files. -dnl qthread_asflags --- flags to pass to the compiler when processing -dnl assembly-language files. -dnl -dnl It also sets the following variables, which describe how clients -dnl can link against libqthreads.a: -dnl THREAD_PACKAGE --- set to "QT" if configuration succeeds, or -dnl the empty string if configuration fails. -dnl THREAD_CPPFLAGS --- set to `-I' flags for thread header files -dnl THREAD_LIBS_LOCAL --- linker options for use in this source tree -dnl THREAD_LIBS_INSTALLED --- linker options for use after this package -dnl is installed -dnl It would be nice if all thread configuration packages for Guile -dnl followed the same conventions. -dnl -dnl All of the above variables will be substituted into Makefiles in -dnl the usual autoconf fashion. -dnl -dnl We distinguish between THREAD_LIBS_LOCAL and -dnl THREAD_LIBS_INSTALLED because the thread library might be in -dnl this tree, and be built using libtool. This means that: -dnl 1) when building other executables in this tree, one must -dnl pass the relative path to the ../libfoo.la file, but -dnl 2) once the whole package has been installed, users should -dnl link using -lfoo. -dnl Normally, we only care about the first case, but since the -dnl guile-config script needs to give users all the flags they need -dnl to link programs against guile, the GUILE_WITH_THREADS macro -dnl needs to supply the second piece of information as well. -dnl -dnl This whole thing is a little confused about what ought to be -dnl done in the top-level configure script, and what ought to be -dnl taken care of in the subdirectory. For example, qtmds_s and -dnl friends really ought not to be even mentioned in the top-level -dnl configure script, but here they are. - -AC_DEFUN([QTHREADS_CONFIGURE],[ - AC_REQUIRE([AC_PROG_LN_S]) - - AC_MSG_CHECKING(QuickThreads configuration) - # How can we refer to the qt source directory from within the qt build - # directory? For headers, we can rely on the fact that the qt src - # directory appears in the #include path. - qtsrcdir="`(cd $srcdir; pwd)`/qt" - - changequote(,)dnl We use [ and ] in a regexp in the case - - THREAD_PACKAGE=QT - qthread_asflags='' - case "$host" in - i[3456]86-*-*) - port_name=i386 - qtmd_h=md/i386.h - qtmds_s=md/i386.s - qtmdc_c=md/null.c - qtdmdb_s= - case "$host" in - *-*-netbsd* ) - ## NetBSD needs to be told to pass the assembly code through - ## the C preprocessor. Other GCC installations seem to do - ## this by default, but NetBSD's doesn't. We could get the - ## same effect by giving the file a name ending with .S - ## instead of .s, but I don't see how to tell automake to do - ## that. - qthread_asflags='-x assembler-with-cpp' - ;; - esac - ;; - mips-sgi-irix[56]*) - port_name=irix - qtmd_h=md/mips.h - qtmds_s=md/mips-irix5.s - qtmdc_c=md/null.c - qtdmdb_s=md/mips_b.s - ;; - mips-*-*) - port_name=mips - qtmd_h=md/mips.h - qtmds_s=md/mips.s - qtmdc_c=md/null.c - qtdmdb_s=md/mips_b.s - ;; - sparc-*-sunos*) - port_name=sparc-sunos - qtmd_h=md/sparc.h - qtmds_s=md/_sparc.s - qtmdc_c=md/null.c - qtdmdb_s=md/_sparc_b.s - ;; - sparc-*-*) - port_name=sparc - qtmd_h=md/sparc.h - qtmds_s=md/sparc.s - qtmdc_c=md/null.c - qtdmdb_s=md/sparc_b.s - ;; - alpha-*-*) - port_name=alpha - qtmd_h=md/axp.h - qtmds_s=md/axp.s - qtmdc_c=md/null.c - qtdmdb_s=md/axp_b.s - ;; - *) - echo "Unknown configuration; threads package disabled" - THREAD_PACKAGE="" - ;; - esac - changequote([, ]) - - # Did configuration succeed? - if test -n "$THREAD_PACKAGE"; then - AC_MSG_RESULT($port_name) - QTHREAD_LTLIBS=libqthreads.la - THREAD_CPPFLAGS="-I$qtsrcdir -I../qt" - THREAD_LIBS_LOCAL="../qt/libqthreads.la" - THREAD_LIBS_INSTALLED="-lqthreads" - else - AC_MSG_RESULT(none; disabled) - fi - - AC_SUBST(QTHREAD_LTLIBS) - AC_SUBST(qtmd_h) - AC_SUBST(qtmds_s) - AC_SUBST(qtmdc_c) - AC_SUBST(qtdmdb_s) - AC_SUBST(qthread_asflags) - AC_SUBST(THREAD_PACKAGE) - AC_SUBST(THREAD_CPPFLAGS) - AC_SUBST(THREAD_LIBS_LOCAL) - AC_SUBST(THREAD_LIBS_INSTALLED) -]) +dnl -*- Autoconf -*- + +dnl Copyright (C) 1997, 1999, 2000, 2001, 2002, 2004, 2006, +dnl 2007, 2008, 2009, 2010, 2011, 2013 Free Software Foundation, Inc. +dnl +dnl This file is part of GUILE +dnl +dnl GUILE is free software; you can redistribute it and/or modify it under +dnl the terms of the GNU Lesser General Public License as published by the +dnl Free Software Foundation; either version 3, or (at your option) any +dnl later version. +dnl +dnl GUILE is distributed in the hope that it will be useful, but WITHOUT +dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public +dnl License for more details. +dnl +dnl You should have received a copy of the GNU Lesser General Public +dnl License along with GUILE; see the file COPYING.LESSER. If not, write +dnl to the Free Software Foundation, Inc., 51 Franklin Street, Fifth +dnl Floor, Boston, MA 02110-1301, USA. + + +dnl On the NeXT, #including doesn't give you a definition for +dnl struct utime, unless you #define _POSIX_SOURCE. + +AC_DEFUN([GUILE_STRUCT_UTIMBUF], [ + AC_CACHE_CHECK([whether we need POSIX to get struct utimbuf], + guile_cv_struct_utimbuf_needs_posix, + [AC_TRY_CPP([ +#ifdef __EMX__ +#include +#else +#include +#endif +struct utime blah; +], + guile_cv_struct_utimbuf_needs_posix=no, + guile_cv_struct_utimbuf_needs_posix=yes)]) + if test "$guile_cv_struct_utimbuf_needs_posix" = yes; then + AC_DEFINE([UTIMBUF_NEEDS_POSIX], 1, + [Define this if doesn't define struct utimbuf unless + _POSIX_SOURCE is defined. See GUILE_STRUCT_UTIMBUF in aclocal.m4.]) + fi]) + + + + +dnl +dnl Apparently, at CMU they have a weird version of libc.h that is +dnl installed in /usr/local/include and conflicts with unistd.h. +dnl In these situations, we should not #include libc.h. +dnl This test arranges to #define LIBC_H_WITH_UNISTD_H iff libc.h is +dnl present on the system, and is safe to #include. +dnl +AC_DEFUN([GUILE_HEADER_LIBC_WITH_UNISTD], + [ + AC_CHECK_HEADERS(libc.h unistd.h) + AC_CACHE_CHECK( + [whether libc.h and unistd.h can be included together], + guile_cv_header_libc_with_unistd, + [ + if test "$ac_cv_header_libc_h" = "no"; then + guile_cv_header_libc_with_unistd="no" + elif test "$ac_cv_header_unistd_h" = "no"; then + guile_cv_header_libc_with_unistd="yes" + else + AC_TRY_COMPILE( + [ +# include +# include + ], + [], + [guile_cv_header_libc_with_unistd=yes], + [guile_cv_header_libc_with_unistd=no] + ) + fi + ] + ) + if test "$guile_cv_header_libc_with_unistd" = yes; then + AC_DEFINE([LIBC_H_WITH_UNISTD_H], 1, + [Define this if we should include when we've already + included . On some systems, they conflict, and libc.h + should be omitted. See GUILE_HEADER_LIBC_WITH_UNISTD in + aclocal.m4.]) + fi + ] +) + + + +dnl This is needed when we want to check for the same function repeatedly +dnl with other parameters, such as libraries, varying. +dnl +dnl GUILE_NAMED_CHECK_FUNC(FUNCTION, TESTNAME, +dnl [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) +AC_DEFUN([GUILE_NAMED_CHECK_FUNC], +[AC_MSG_CHECKING([for $1]) +AC_CACHE_VAL(ac_cv_func_$1_$2, +[AC_TRY_LINK( +dnl Don't include because on OSF/1 3.0 it includes +dnl which includes which contains a prototype for +dnl select. Similarly for bzero. +[/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $1(); below. */ +#include +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $1(); +], [ +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$1) || defined (__stub___$1) +choke me +#else +$1(); +#endif +], eval "ac_cv_func_$1_$2=yes", eval "ac_cv_func_$1_$2=no")]) +if eval "test \"`echo '$ac_cv_func_'$1'_'$2`\" = yes"; then + AC_MSG_RESULT(yes) + ifelse([$3], , :, [$3]) +else + AC_MSG_RESULT(no) +ifelse([$4], , , [$4 +])dnl +fi +]) + + + + +dnl Available from the Autoconf Macro Archive at: +dnl http://autoconf-archive.cryp.to/acx_pthread.html +dnl +AC_DEFUN([ACX_PTHREAD], [ +AC_REQUIRE([AC_CANONICAL_HOST]) +AC_LANG_SAVE +AC_LANG_C +acx_pthread_ok=no + +# We used to check for pthread.h first, but this fails if pthread.h +# requires special compiler flags (e.g. on True64 or Sequent). +# It gets checked for in the link test anyway. + +# First of all, check if the user has set any of the PTHREAD_LIBS, +# etcetera environment variables, and if threads linking works using +# them: +if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + save_LIBS="$LIBS" + LIBS="$PTHREAD_LIBS $LIBS" + AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS]) + AC_TRY_LINK_FUNC(pthread_join, acx_pthread_ok=yes) + AC_MSG_RESULT($acx_pthread_ok) + if test x"$acx_pthread_ok" = xno; then + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" + fi + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" +fi + +# We must check for the threads library under a number of different +# names; the ordering is very important because some systems +# (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. + +acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" + +# The ordering *is* (sometimes) important. Some notes on the +# individual items follow: + +# pthreads: AIX (must check this before -lpthread) +# none: in case threads are in libc; should be tried before -Kthread and +# other compiler flags to prevent continual compiler warnings +# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) +# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) +# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) +# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) +# -pthreads: Solaris/gcc +# -mthreads: Mingw32/gcc, Lynx/gcc +# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it +# doesn't hurt to check since this sometimes defines pthreads too; +# also defines -D_REENTRANT) +# ... -mt is also the pthreads flag for HP/aCC +# pthread: Linux, etcetera +# --thread-safe: KAI C++ +# pthread-config: use pthread-config program (for GNU Pth library) + +case "${host_cpu}-${host_os}" in + *solaris*) + + # On Solaris (at least, for some versions), libc contains stubbed + # (non-functional) versions of the pthreads routines, so link-based + # tests will erroneously succeed. (We need to link with -pthreads/-mt/ + # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather + # a function called by this macro, so we could check for that, but + # who knows whether they'll stub that too in a future libc.) So, + # we'll just look for -pthreads and -lpthread first: + + acx_pthread_flags="-pthreads pthread -mt -pthread $acx_pthread_flags" + ;; +esac + +if test x"$acx_pthread_ok" = xno; then +for flag in $acx_pthread_flags; do + + case $flag in + none) + AC_MSG_CHECKING([whether pthreads work without any flags]) + ;; + + -*) + AC_MSG_CHECKING([whether pthreads work with $flag]) + PTHREAD_CFLAGS="$flag" + ;; + + pthread-config) + AC_CHECK_PROG(acx_pthread_config, pthread-config, yes, no) + if test x"$acx_pthread_config" = xno; then continue; fi + PTHREAD_CFLAGS="`pthread-config --cflags`" + PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" + ;; + + *) + AC_MSG_CHECKING([for the pthreads library -l$flag]) + PTHREAD_LIBS="-l$flag" + ;; + esac + + save_LIBS="$LIBS" + save_CFLAGS="$CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + + # Check for various functions. We must include pthread.h, + # since some functions may be macros. (On the Sequent, we + # need a special flag -Kthread to make this header compile.) + # We check for pthread_join because it is in -lpthread on IRIX + # while pthread_create is in libc. We check for pthread_attr_init + # due to DEC craziness with -lpthreads. We check for + # pthread_cleanup_push because it is one of the few pthread + # functions on Solaris that doesn't have a non-functional libc stub. + # We try pthread_create on general principles. + AC_TRY_LINK([#include ], + [pthread_t th; pthread_join(th, 0); + pthread_attr_init(0); pthread_cleanup_push(0, 0); + pthread_create(0,0,0,0); pthread_cleanup_pop(0); ], + [acx_pthread_ok=yes]) + + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + + AC_MSG_RESULT($acx_pthread_ok) + if test "x$acx_pthread_ok" = xyes; then + break; + fi + + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" +done +fi + +# Various other checks: +if test "x$acx_pthread_ok" = xyes; then + save_LIBS="$LIBS" + LIBS="$PTHREAD_LIBS $LIBS" + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + + # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. + AC_MSG_CHECKING([for joinable pthread attribute]) + attr_name=unknown + for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do + AC_TRY_LINK([#include ], [int attr=$attr; return attr;], + [attr_name=$attr; break]) + done + AC_MSG_RESULT($attr_name) + if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then + AC_DEFINE_UNQUOTED([PTHREAD_CREATE_JOINABLE], $attr_name, + [Define to necessary symbol if this constant + uses a non-standard name on your system.]) + fi + + AC_MSG_CHECKING([if more special flags are required for pthreads]) + flag=no + case "${host_cpu}-${host_os}" in + *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";; + *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";; + esac + AC_MSG_RESULT(${flag}) + if test "x$flag" != xno; then + PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" + fi + + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + + # More AIX lossage: must compile with xlc_r or cc_r + if test x"$GCC" != xyes; then + AC_CHECK_PROGS(PTHREAD_CC, xlc_r cc_r, ${CC}) + else + PTHREAD_CC=$CC + fi +else + PTHREAD_CC="$CC" +fi + +AC_SUBST(PTHREAD_LIBS) +AC_SUBST(PTHREAD_CFLAGS) +AC_SUBST(PTHREAD_CC) + +# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: +if test x"$acx_pthread_ok" = xyes; then + ifelse([$1],,AC_DEFINE([HAVE_PTHREAD],1,[Define if you have POSIX threads libraries and header files.]),[$1]) + : +else + acx_pthread_ok=no + $2 +fi +AC_LANG_RESTORE +])dnl ACX_PTHREAD + +dnl GUILE_GNU_LD_RELRO +dnl +dnl Check whether GNU ld's read-only relocations (the `PT_GNU_RELRO' +dnl ELF segment header) are supported. This allows things like +dnl statically allocated cells (1) to eventually be remapped read-only +dnl by the loader, and (2) to be identified as pointerless by the +dnl garbage collector. Substitute `GNU_LD_FLAGS' with the relevant +dnl flags. +AC_DEFUN([GUILE_GNU_LD_RELRO], [ + AC_MSG_CHECKING([whether the linker understands `-z relro']) + + GNU_LD_FLAGS="-Wl,-z -Wl,relro" + + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $GNU_LD_FLAGS" + AC_LINK_IFELSE([AC_LANG_PROGRAM([], [])], + [AC_MSG_RESULT([yes])], + [AC_MSG_RESULT([no]) + GNU_LD_FLAGS=""]) + LDFLAGS="$save_LDFLAGS" + + AC_SUBST([GNU_LD_FLAGS]) +]) + +dnl GUILE_THREAD_LOCAL_STORAGE +dnl +dnl Check for compiler thread-local storage (TLS) support. +AC_DEFUN([GUILE_THREAD_LOCAL_STORAGE], [ + AC_REQUIRE([AC_CANONICAL_HOST]) + + AC_CACHE_CHECK([whether the `__thread' storage class is available], + [ac_cv_have_thread_storage_class], + [dnl On some systems, e.g., NetBSD 5.0 with GCC 4.1, `__thread' is + dnl properly compiled but fails to link due to the lack of TLS + dnl support in the C library. Thus we try to link, not just + dnl compile. Unfortunately, this test is not enough, so we + dnl explicitly check for known-broken systems. See + dnl http://lists.gnu.org/archive/html/guile-devel/2009-10/msg00138.html + dnl for details. + dnl + dnl Known broken systems includes: + dnl - x86_64-unknown-netbsd5.0. + dnl - x86_64-unknown-netbsd5.1 + dnl - sparc-sun-solaris2.8 + dnl + dnl On `x86_64-unknown-freebsd8.0', thread-local storage appears to + dnl be reclaimed at the wrong time, leading to a segfault when + dnl running `threads.test'. So disable it. + case "$enable_shared--$host_os" in + [yes--netbsd[0-5].[0-9]*|yes--solaris2.8|yes--freebsd[0-8]*]) + ac_cv_have_thread_storage_class="no" + ;; + *) + AC_LINK_IFELSE([AC_LANG_PROGRAM([__thread int tls_integer;], + [tls_integer = 123;])], + [ac_cv_have_thread_storage_class="yes"], + [ac_cv_have_thread_storage_class="no"]) + ;; + esac]) + + if test "x$ac_cv_have_thread_storage_class" = "xyes"; then + SCM_I_GSC_HAVE_THREAD_STORAGE_CLASS=1 + else + SCM_I_GSC_HAVE_THREAD_STORAGE_CLASS=0 + fi + + AC_SUBST([SCM_I_GSC_HAVE_THREAD_STORAGE_CLASS]) +]) + +dnl GUILE_READLINE +dnl +dnl Check all the things needed by `guile-readline', the Readline +dnl bindings. +AC_DEFUN([GUILE_READLINE], [ + for termlib in ncurses curses termcap terminfo termlib pdcurses ; do + AC_CHECK_LIB(${termlib}, [tgoto], + [READLINE_LIBS="-l${termlib} $READLINE_LIBS"; break]) + done + + AC_LIB_LINKFLAGS([readline]) + + if test "x$LTLIBREADLINE" = "x"; then + AC_MSG_WARN([GNU Readline was not found on your system.]) + else + rl_save_LIBS="$LIBS" + LIBS="$LIBREADLINE $READLINE_LIBS $LIBS" + + AC_CHECK_FUNCS([siginterrupt rl_clear_signals rl_cleanup_after_signal]) + + dnl Check for modern readline naming + AC_CHECK_FUNCS([rl_filename_completion_function]) + AC_CHECK_DECLS([rl_catch_signals, rl_catch_sigwinch], [], [], + [[#include ] + [#include ]]) + + dnl Check for rl_get_keymap. We only use this for deciding whether to + dnl install paren matching on the Guile command line (when using + dnl readline for input), so it's completely optional. + AC_CHECK_FUNCS([rl_get_keymap]) + + AC_CACHE_CHECK([for rl_getc_function pointer in readline], + ac_cv_var_rl_getc_function, + [AC_TRY_LINK([ + #include + #include ], + [printf ("%ld", (long) rl_getc_function)], + [ac_cv_var_rl_getc_function=yes], + [ac_cv_var_rl_getc_function=no])]) + if test "${ac_cv_var_rl_getc_function}" = "yes"; then + AC_DEFINE([HAVE_RL_GETC_FUNCTION], 1, + [Define if your readline library has the rl_getc_function variable.]) + fi + + if test $ac_cv_var_rl_getc_function = no; then + AC_MSG_WARN([*** GNU Readline is too old on your system.]) + AC_MSG_WARN([*** You need readline version 2.1 or later.]) + LTLIBREADLINE="" + LIBREADLINE="" + fi + + LIBS="$rl_save_LIBS" + + READLINE_LIBS="$LTLIBREADLINE $READLINE_LIBS" + fi + + AM_CONDITIONAL([HAVE_READLINE], [test "x$LTLIBREADLINE" != "x"]) + + AC_CHECK_FUNCS([strdup]) + + AC_SUBST([READLINE_LIBS]) +]) + +dnl GUILE_LIBUNISTRING_WITH_ICONV_SUPPORT +dnl +dnl Check whether libunistring has iconv support. When it lacks iconv +dnl support, `mem_iconveh' returns -1 (ENOSYS) and conversions from one +dnl codeset to another do not work. +AC_DEFUN([GUILE_LIBUNISTRING_WITH_ICONV_SUPPORT], [ + AC_CACHE_CHECK([whether libunistring was built with iconv support], + [ac_cv_libunistring_with_iconv_support], [ + save_LIBS=$LIBS + LIBS="$LIBS $LIBUNISTRING" + AC_RUN_IFELSE([AC_LANG_SOURCE([[ + #include + #include + int + main (int argc, char *argv[]) + { + size_t result_size; + return (NULL == u32_conv_from_encoding ("ASCII", iconveh_question_mark, + "a", 1, + NULL, NULL, &result_size)); + } + ]])], + [ac_cv_libunistring_with_iconv_support=yes], + [ac_cv_libunistring_with_iconv_support=no], + [ac_cv_libunistring_with_iconv_support=yes]) + LIBS=$save_LIBS + ]) +]) + +dnl GUILE_UNISTRING_CONSTANT NAME +dnl +dnl Determine the compile-time value of NAME and define/substitute +dnl `SCM_I_GSC_NAME'. +AC_DEFUN([GUILE_UNISTRING_CONSTANT], [ + m4_pushdef([UPPER_CASE_NAME], + [m4_translit([$1],[abcdefghijklmnopqrstuvwxyz], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ])]) + + AC_CACHE_CHECK([the value of `$1'], [ac_cv_]$1, [ + AC_COMPUTE_INT([ac_cv_]$1, [$1], + [AC_INCLUDES_DEFAULT +#include +], + [AC_MSG_ERROR([failed to determine the value of `$1'])]) + ]) + + [SCM_I_GSC_]UPPER_CASE_NAME="$ac_cv_[]$1" + AC_SUBST([SCM_I_GSC_]UPPER_CASE_NAME) + m4_popdef([UPPER_CASE_NAME])]) + +dnl GUILE_UNISTRING_ICONVEH_VALUES +dnl +dnl Determine the values of the `iconveh_' libunistring constants. +AC_DEFUN([GUILE_UNISTRING_ICONVEH_VALUES], [ + GUILE_UNISTRING_CONSTANT([iconveh_error]) + GUILE_UNISTRING_CONSTANT([iconveh_question_mark]) + GUILE_UNISTRING_CONSTANT([iconveh_escape_sequence]) +]) + +dnl GUILE_CHECK_VERSION +dnl +dnl Ensure that $GUILE_FOR_BUILD has the same version as ourselves. +AC_DEFUN([GUILE_CHECK_VERSION], [ + if ! "$GUILE_FOR_BUILD" --version > /dev/null 2>&1; then + AC_MSG_ERROR([failed to run `$GUILE_FOR_BUILD']) + fi + + dnl Use MAJOR.MINOR.MICRO instead of (version) so that developers can + dnl freely shoot themselves in the foot by using, say, 2.0.3.80 and + dnl 2.0.3.42. + AC_CACHE_CHECK([the version of $GUILE_FOR_BUILD], + [ac_cv_guile_for_build_version], + [ac_cv_guile_for_build_version="`"$GUILE_FOR_BUILD" \ + -c '(format #t "~a.~a.~a" (major-version) (minor-version) (micro-version))'`" + ]) + + if test "$ac_cv_guile_for_build_version" != \ + "$GUILE_MAJOR_VERSION.$GUILE_MINOR_VERSION.$GUILE_MICRO_VERSION" + then + AC_MSG_ERROR([building Guile $PACKAGE_VERSION but `$GUILE_FOR_BUILD' has version $ac_cv_guile_for_build_version"]) + fi +]) + +dnl GUILE_CHECK_GUILE_FOR_BUILD +dnl +dnl When cross-compiling, ensure that $GUILE_FOR_BUILD is suitable. +AC_DEFUN([GUILE_CHECK_GUILE_FOR_BUILD], [ + if test "$cross_compiling" = "yes"; then + if test "x$GUILE_FOR_BUILD" = "x"; then + AC_PATH_PROG([GUILE_FOR_BUILD], [guile], [not-found]) + if test "$GUILE_FOR_BUILD" = "not-found"; then + AC_MSG_ERROR([a native Guile $PACKAGE_VERSION is required to cross-build Guile]) + fi + fi + AC_MSG_CHECKING([guile for build]) + AC_MSG_RESULT([$GUILE_FOR_BUILD]) + + dnl Since there is currently no distinction between the run-time + dnl search path, %load-path, and the compiler's search path, + dnl $GUILE_FOR_BUILD must be a native build of the very same version. + GUILE_CHECK_VERSION + else + GUILE_FOR_BUILD='this-value-will-never-be-used' + fi + + AC_ARG_VAR([GUILE_FOR_BUILD], [guile for the build system]) + AM_SUBST_NOTMAKE([GUILE_FOR_BUILD]) +]) + +dnl Declare file $1 to be a script that needs configuring, +dnl and arrange to make it executable in the process. +AC_DEFUN([GUILE_CONFIG_SCRIPT],[AC_CONFIG_FILES([$1],[chmod +x $1])])