gh-117845: Detect libedit hook function signature in configure (#117870)

Older libedit versions (like Apple's) use a different type signature
for rl_startup_hook and rl_pre_input_hook. Add a configure check to
determine which signature is accepted by introducing the
Py_RL_STARTUP_HOOK_TAKES_ARGS macro in pyconfig.h.
This commit is contained in:
Joshua Root 2024-04-17 19:26:10 +10:00 committed by GitHub
parent f74e51229c
commit 8515fd79fe
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 71 additions and 2 deletions

View File

@ -0,0 +1 @@
Fix building against recent libedit versions by detecting readline hook signatures in :program:`configure`.

View File

@ -1041,7 +1041,7 @@ on_hook(PyObject *func)
}
static int
#if defined(_RL_FUNCTION_TYPEDEF)
#if defined(_RL_FUNCTION_TYPEDEF) || !defined(Py_RL_STARTUP_HOOK_TAKES_ARGS)
on_startup_hook(void)
#else
on_startup_hook(const char *Py_UNUSED(text), int Py_UNUSED(state))
@ -1061,7 +1061,7 @@ on_startup_hook(const char *Py_UNUSED(text), int Py_UNUSED(state))
#ifdef HAVE_RL_PRE_INPUT_HOOK
static int
#if defined(_RL_FUNCTION_TYPEDEF)
#if defined(_RL_FUNCTION_TYPEDEF) || !defined(Py_RL_STARTUP_HOOK_TAKES_ARGS)
on_pre_input_hook(void)
#else
on_pre_input_hook(const char *Py_UNUSED(text), int Py_UNUSED(state))

50
configure generated vendored
View File

@ -25367,6 +25367,56 @@ printf "%s\n" "#define HAVE_RL_COMPDISP_FUNC_T 1" >>confdefs.h
fi
# Some editline versions declare rl_startup_hook as taking no args, others
# declare it as taking 2.
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if rl_startup_hook takes arguments" >&5
printf %s "checking if rl_startup_hook takes arguments... " >&6; }
if test ${ac_cv_readline_rl_startup_hook_takes_args+y}
then :
printf %s "(cached) " >&6
else $as_nop
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <stdio.h> /* Must be first for Gnu Readline */
#ifdef WITH_EDITLINE
# include <editline/readline.h>
#else
# include <readline/readline.h>
# include <readline/history.h>
#endif
extern int test_hook_func(const char *text, int state);
int
main (void)
{
rl_startup_hook=test_hook_func;
;
return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
ac_cv_readline_rl_startup_hook_takes_args=yes
else $as_nop
ac_cv_readline_rl_startup_hook_takes_args=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_readline_rl_startup_hook_takes_args" >&5
printf "%s\n" "$ac_cv_readline_rl_startup_hook_takes_args" >&6; }
if test "x$ac_cv_readline_rl_startup_hook_takes_args" = xyes
then :
printf "%s\n" "#define Py_RL_STARTUP_HOOK_TAKES_ARGS 1" >>confdefs.h
fi
CFLAGS=$save_CFLAGS

View File

@ -6341,6 +6341,21 @@ AS_VAR_IF([with_readline], [no], [
# in readline as well as newer editline (April 2023)
AC_CHECK_TYPES([rl_compdisp_func_t], [], [], [readline_includes])
# Some editline versions declare rl_startup_hook as taking no args, others
# declare it as taking 2.
AC_CACHE_CHECK([if rl_startup_hook takes arguments], [ac_cv_readline_rl_startup_hook_takes_args], [
AC_COMPILE_IFELSE(
[AC_LANG_PROGRAM([readline_includes]
[extern int test_hook_func(const char *text, int state);],
[rl_startup_hook=test_hook_func;])],
[ac_cv_readline_rl_startup_hook_takes_args=yes],
[ac_cv_readline_rl_startup_hook_takes_args=no]
)
])
AS_VAR_IF([ac_cv_readline_rl_startup_hook_takes_args], [yes], [
AC_DEFINE([Py_RL_STARTUP_HOOK_TAKES_ARGS], [1], [Define if rl_startup_hook takes arguments])
])
m4_undefine([readline_includes])
])dnl WITH_SAVE_ENV()
])

View File

@ -1659,6 +1659,9 @@
SipHash13: 3, externally defined: 0 */
#undef Py_HASH_ALGORITHM
/* Define if rl_startup_hook takes arguments */
#undef Py_RL_STARTUP_HOOK_TAKES_ARGS
/* Define if you want to enable internal statistics gathering. */
#undef Py_STATS