From: Alexei Sheplyakov Date: Mon, 9 Jun 2008 12:21:30 +0000 (+0400) Subject: build: don't run any ${host} binaries while checking for readline. X-Git-Tag: release_1-5-0~63^2~8 X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=commitdiff_plain;h=0f26d08929532724d24a60e9fa5e5e98c4b2fa55 build: don't run any ${host} binaries while checking for readline. Now GiNaC (to be more precise, ginsh) can be easily cross compiled. However, ancient versions of readline (<= 4.2) are not supported any more. --- diff --git a/acinclude.m4 b/acinclude.m4 index dd7299c0..9645620e 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -4,44 +4,46 @@ dnl additions' names with AC_ but with GINAC_ in order to steer clear of dnl future trouble. dnl =========================================================================== -dnl Usage: GINAC_RLVERSION -dnl The maintainers of libreadline are complete morons: they don't care a shit -dnl about compatiblilty (which is not so bad by itself) and at the same time -dnl they don't export the version to the preprocessor so we could kluge around -dnl incomatiblities. The only reliable way to figure out the version is by -dnl checking the extern variable rl_library_version at runtime. &#@$%*! -AC_DEFUN([GINAC_LIB_READLINE_VERSION], -[AC_CACHE_CHECK([for version of libreadline], ginac_cv_rlversion, [ -AC_TRY_RUN([ -#include -#include -#include - -int main() -{ - FILE *fd; - fd = fopen("conftest.out", "w"); - fprintf(fd, "%s\n", rl_library_version); - fclose(fd); - return 0; -}], [ -dnl Some non-GNU readline implementations have non-numeric rl_library_version -ginac_cv_rlversion=`sed -e 's/[[^0-9.]]//g' 'conftest.out'`], [ ginac_cv_rlversion='unknown'], [ ginac_cv_rlversion='4.2'])]) -if test -z "$ginac_cv_rlversion"; then - GINAC_WARNING([Unsupported version of libreadline.]) - ginac_cv_rlversion='unknown' -fi -if test "x${ginac_cv_rlversion}" != "xunknown"; then - AC_DEFINE(REALLY_HAVE_LIBREADLINE, ,[Define if GNU libreadline is installed]) - RL_VERSION_MAJOR=`echo ${ginac_cv_rlversion} | sed -e 's/\([[0-9]]*\)\.\([[0-9]]*\).*/\1/'` - AC_DEFINE_UNQUOTED(GINAC_RL_VERSION_MAJOR, $RL_VERSION_MAJOR, [Major version of installed readline library.]) - RL_VERSION_MINOR=`echo ${ginac_cv_rlversion} | sed -e 's/\([[0-9]]*\)\.\([[0-9]]*\).*/\2/'` - AC_DEFINE_UNQUOTED(GINAC_RL_VERSION_MINOR, $RL_VERSION_MINOR, [Minor version of installed readline library.]) +dnl Usage: GINAC_LIBREADLINE +dnl +dnl Check if GNU readline library and headers are avialable. +dnl Defines GINSH_LIBS variable, and HAVE_LIBREADLINE, +dnl HAVE_READLINE_READLINE_H, HAVE_READLINE_HISTORY_H preprocessor macros. +dnl +dnl Note: this macro rejects readline versions <= 4.2 and non-GNU +dnl implementations. +dnl +AC_DEFUN([GINAC_READLINE],[ +AC_REQUIRE([GINAC_TERMCAP]) +GINSH_LIBS="" +AC_CHECK_HEADERS(readline/readline.h readline/history.h) +if test "x${ac_cv_header_readline_readline_h}" != "xyes" -o "x${ac_cv_header_readline_history_h}" != "xyes"; then + GINAC_WARNING([readline headers could not be found.]) else - GINAC_WARNING([I could not run a test of libreadline (needed for building ginsh).]) + AC_CACHE_CHECK([for version of libreadline], [ginac_cv_rl_supported], [ + ginac_cv_rl_supported="no" + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #include + #include + #if !defined(RL_VERSION_MAJOR) || !defined(RL_VERSION_MINOR) + #error "Ancient/unsupported version of readline" + #endif]])], + [ginac_cv_rl_supported="yes"])]) + if test "x${ginac_cv_rl_supported}" != "xyes"; then + GINAC_WARNING([Unsupported version of readline (<= 4.2 or non-GNU).]) + else + save_LIBS="$LIBS" + LIBS="$LIBTERMCAP $LIBS" + AC_CHECK_LIB(readline, readline) + if test "x${ac_cv_lib_readline_readline}" != "xyes"; then + GINAC_WARNING([libreadline could not be found.]) + fi + GINSH_LIBS="$LIBS" + LIBS="$save_LIBS" + fi fi -]) - +AC_SUBST(GINSH_LIBS)]) + dnl Usage: GINAC_TERMCAP dnl libreadline is based on the termcap functions. dnl Some systems have tgetent(), tgetnum(), tgetstr(), tgetflag(), tputs(), diff --git a/configure.ac b/configure.ac index 22f9c965..ab4c4b6a 100644 --- a/configure.ac +++ b/configure.ac @@ -85,22 +85,7 @@ AC_LANG([C++]) dnl Check for stuff needed for building the GiNaC interactive shell (ginsh). AC_CHECK_HEADERS(unistd.h) GINAC_HAVE_RUSAGE -AC_CHECK_HEADERS(readline/readline.h readline/history.h) -if test "x${ac_cv_header_readline_readline_h}" != "xyes" -o "x${ac_cv_header_readline_history_h}" != "xyes"; then - GINAC_WARNING([I could not find the headers for libreadline (needed for building ginsh).]) -fi -GINAC_TERMCAP -save_LIBS=$LIBS -LIBS="$LIBTERMCAP $LIBS" -AC_CHECK_LIB(readline, readline) -if test "x${ac_cv_lib_readline_readline}" = "xyes"; then - GINAC_LIB_READLINE_VERSION -else - GINAC_WARNING([I could not find libreadline (needed by ginsh).]) -fi -GINSH_LIBS=$LIBS -LIBS=$save_LIBS -AC_SUBST(GINSH_LIBS) +GINAC_READLINE dnl Make sure all the necessary standard headers are installed on the system. AC_CHECK_HEADER(iosfwd, , GINAC_ERROR([The standard header file could not be found.])) diff --git a/ginsh/ginsh_parser.yy b/ginsh/ginsh_parser.yy index 0594d948..b059172e 100644 --- a/ginsh/ginsh_parser.yy +++ b/ginsh/ginsh_parser.yy @@ -45,21 +45,17 @@ #define YYERROR_VERBOSE 1 -#ifdef REALLY_HAVE_LIBREADLINE +#ifdef HAVE_LIBREADLINE // Original readline settings static int orig_completion_append_character; -#if (GINAC_RL_VERSION_MAJOR < 4) || (GINAC_RL_VERSION_MAJOR == 4 && GINAC_RL_VERSION_MINOR < 2) -static char *orig_basic_word_break_characters; -#else static const char *orig_basic_word_break_characters; -#endif -#if (GINAC_RL_VERSION_MAJOR >= 5) +#if (RL_VERSION_MAJOR >= 5) #define GINAC_RL_COMPLETER_CAST(a) const_cast((a)) #else #define GINAC_RL_COMPLETER_CAST(a) (a) #endif -#endif // REALLY_HAVE_LIBREADLINE +#endif // HAVE_LIBREADLINE // Expression stack for %, %% and %%% static void push(const ex &e); @@ -864,7 +860,7 @@ static char *fcn_generator(const char *text, int state) return NULL; } -#ifdef REALLY_HAVE_LIBREADLINE +#ifdef HAVE_LIBREADLINE static char **fcn_completion(const char *text, int start, int end) { if (rl_line_buffer[0] == '!') { @@ -872,24 +868,27 @@ static char **fcn_completion(const char *text, int start, int end) rl_completion_append_character = orig_completion_append_character; rl_basic_word_break_characters = orig_basic_word_break_characters; rl_completer_word_break_characters = GINAC_RL_COMPLETER_CAST(rl_basic_word_break_characters); -#if (GINAC_RL_VERSION_MAJOR < 4) || (GINAC_RL_VERSION_MAJOR == 4 && GINAC_RL_VERSION_MINOR < 2) - return completion_matches(const_cast(text), (CPFunction *)filename_completion_function); -#else return rl_completion_matches(text, rl_filename_completion_function); -#endif } else { // Otherwise, complete function names rl_completion_append_character = '('; rl_basic_word_break_characters = " \t\n\"#$%&'()*+,-./:;<=>?@[\\]^`{|}~"; rl_completer_word_break_characters = GINAC_RL_COMPLETER_CAST(rl_basic_word_break_characters); -#if (GINAC_RL_VERSION_MAJOR < 4) || (GINAC_RL_VERSION_MAJOR == 4 && GINAC_RL_VERSION_MINOR < 2) - return completion_matches(const_cast(text), (CPFunction *)fcn_generator); -#else return rl_completion_matches(text, fcn_generator); -#endif } } -#endif // REALLY_HAVE_LIBREADLINE +#endif // HAVE_LIBREADLINE + +static void ginsh_readline_init(char* name) +{ +#ifdef HAVE_LIBREADLINE + // Init readline completer + rl_readline_name = name; + rl_attempted_completion_function = fcn_completion; + orig_completion_append_character = rl_completion_append_character; + orig_basic_word_break_characters = rl_basic_word_break_characters; +#endif // HAVE_LIBREADLINE +} void greeting(void) { @@ -934,17 +933,7 @@ int main(int argc, char **argv) insert_help("print_latex", "print_latex(expression) - prints a LaTeX representation of the given expression"); insert_help("print_csrc", "print_csrc(expression) - prints a C source code representation of the given expression"); -#ifdef REALLY_HAVE_LIBREADLINE - // Init readline completer - rl_readline_name = argv[0]; -#if (GINAC_RL_VERSION_MAJOR < 4) || (GINAC_RL_VERSION_MAJOR == 4 && GINAC_RL_VERSION_MINOR < 2) - rl_attempted_completion_function = (CPPFunction *)fcn_completion; -#else - rl_attempted_completion_function = fcn_completion; -#endif - orig_completion_append_character = rl_completion_append_character; - orig_basic_word_break_characters = rl_basic_word_break_characters; -#endif + ginsh_readline_init(argv[0]); // Init input file list, open first file num_files = argc - 1;