build: don't run any ${host} binaries while checking for readline.
authorAlexei Sheplyakov <varg@theor.jinr.ru>
Mon, 9 Jun 2008 12:21:30 +0000 (16:21 +0400)
committerAlexei Sheplyakov <varg@theor.jinr.ru>
Tue, 9 Sep 2008 10:17:07 +0000 (14:17 +0400)
Now GiNaC (to be more precise, ginsh) can be easily cross compiled.
However, ancient versions of readline (<= 4.2) are not supported any more.

acinclude.m4
configure.ac
ginsh/ginsh_parser.yy

index dd7299c..9645620 100644 (file)
@@ -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 <stdio.h>
-#include <sys/types.h>
-#include <readline/readline.h>
-
-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 <stdio.h>
+                       #include <readline/readline.h>
+                       #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(),
index 22f9c96..ab4c4b6 100644 (file)
@@ -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 <iosfwd> header file could not be found.]))
index 0594d94..b059172 100644 (file)
 
 #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<char *>((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<char *>(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<char *>(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;