mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-05-14 01:30:19 +02:00
As the Autoconf documentation says, "These days portable programs [...] should not rely on `HAVE_RESTARTABLE_SYSCALLS', since nowadays whether a system call is restartable is a dynamic issue, not a configuration-time issue." In other words, if we ever rely on HAVE_RESTARTABLE_SYSCALLS, we are at the mercy of any code that Guile happens to be linked with, because that code could install a signal handler without the SA_RESTART flag, and then a Guile system call could unexpectedly return EINTR. The readline part of this goes back to this problem report: excellent example of the above paragraph. It was noted during the discussion that undefining HAVE_RESTARTABLE_SYSCALLS would fix the problem, but that solution wasn't adopted - I guess because Guile was still using cooperative threads then (not pthreads) and so there was a significant concern (whether founded or not) that not using restartable syscalls (where available) could lead to a loss of performance. Now Guile's default mode of operation is with pthreads, where we already don't assume that HAVE_RESTARTABLE_SYSCALLS is reliable, so there is no possible further performance loss. And in any case we really have no choice, if we want correct operation. * configure.in (AC_SYS_RESTARTABLE_SYSCALLS): Removed. * doc/ref/posix.texi (Signals): Remove statement that Guile always sets SA_RESTART flag. * guile-readline/configure.in (GUILE_SIGWINCH_SA_RESTART_CLEARED): Remove this setting, together with its test code. (HAVE_RL_PRE_INPUT_HOOK): Remove this setting and its code, as no longer needed. * guile-readline/readline.c (sigwinch_enable_restart): Removed. (scm_init_readline): Remove setting of rl_pre_input_hook. * libguile/_scm.h (SCM_SYSCALL): Remove the definition that relies on HAVE_RESTARTABLE_SYSCALLS. * libguile/scmsigs.c (scm_sigaction_for_thread): Don't always set the SA_RESTART flag if available. Update docstring accordingly. (scm_init_scmsigs): Remove code that sets SA_RESTART flag for all signals.
87 lines
2.4 KiB
Text
87 lines
2.4 KiB
Text
AC_PREREQ(2.50)
|
|
|
|
dnl Don't use "echo -n", which is not portable (e.g., not available on
|
|
dnl MacOS X). Instead, use `patsubst' to remove the newline.
|
|
AC_INIT(guile-readline,
|
|
patsubst(m4_esyscmd(. ../GUILE-VERSION && echo ${GUILE_VERSION}), [
|
|
]),
|
|
[bug-guile@gnu.org])
|
|
|
|
AC_CONFIG_AUX_DIR([.])
|
|
AC_CONFIG_SRCDIR(readline.c)
|
|
AM_CONFIG_HEADER([guile-readline-config.h])
|
|
AM_INIT_AUTOMAKE([foreign no-define])
|
|
|
|
. $srcdir/../GUILE-VERSION
|
|
|
|
AC_PROG_INSTALL
|
|
AC_PROG_CC
|
|
AM_PROG_CC_STDC
|
|
AC_LIBTOOL_WIN32_DLL
|
|
AC_PROG_LIBTOOL
|
|
|
|
dnl
|
|
dnl Check for Winsock and other functionality on Win32 (*not* CygWin)
|
|
dnl
|
|
AC_CYGWIN
|
|
AC_MINGW32
|
|
EXTRA_DEFS=""
|
|
if test "$MINGW32" = "yes" ; then
|
|
if test $enable_shared = yes ; then
|
|
EXTRA_DEFS="-DSCM_IMPORT"
|
|
fi
|
|
fi
|
|
AC_SUBST(EXTRA_DEFS)
|
|
|
|
for termlib in ncurses curses termcap terminfo termlib ; do
|
|
AC_CHECK_LIB(${termlib}, tgoto,
|
|
[LIBS="-l${termlib} $LIBS"; break])
|
|
done
|
|
|
|
AC_CHECK_LIB(readline, readline)
|
|
if test $ac_cv_lib_readline_readline = no; then
|
|
AC_MSG_WARN([libreadline was not found on your system.])
|
|
fi
|
|
|
|
AC_CHECK_FUNCS(siginterrupt rl_clear_signals rl_cleanup_after_signal)
|
|
|
|
dnl Check for modern readline naming
|
|
AC_CHECK_FUNCS(rl_filename_completion_function)
|
|
|
|
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 <stdio.h>
|
|
#include <readline/readline.h>],
|
|
[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_lib_readline_readline = yes \
|
|
-a $ac_cv_var_rl_getc_function = no; then
|
|
AC_MSG_WARN([*** libreadline is too old on your system.])
|
|
AC_MSG_WARN([*** You need readline version 2.1 or later.])
|
|
fi
|
|
|
|
AC_CHECK_FUNCS(strdup)
|
|
|
|
. $srcdir/LIBGUILEREADLINE-VERSION
|
|
AC_SUBST(LIBGUILEREADLINE_MAJOR)
|
|
AC_SUBST(LIBGUILEREADLINE_INTERFACE_CURRENT)
|
|
AC_SUBST(LIBGUILEREADLINE_INTERFACE_REVISION)
|
|
AC_SUBST(LIBGUILEREADLINE_INTERFACE_AGE)
|
|
AC_SUBST(LIBGUILEREADLINE_INTERFACE)
|
|
|
|
AC_SUBST(GUILE_EFFECTIVE_VERSION)
|
|
|
|
AC_CONFIG_FILES(Makefile ice-9/Makefile)
|
|
AC_OUTPUT
|