X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=acinclude.m4;h=99627aefc909c90a46be5c0b212785a5b2df848d;hp=0061968fd13df10dfdbe135aa78ed42482ec9e8d;hb=a2c08961530e08935a372913c9bc9bb5c3d89d27;hpb=0160f9ab1da453641e30539abcf0eaa4162582eb diff --git a/acinclude.m4 b/acinclude.m4 index 0061968f..99627aef 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -4,37 +4,91 @@ 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 +dnl GINAC_HEADER_GETVAL(NAME,FILE) +dnl ---------------------------- +dnl Expand at autoconf time to the value of a "#define NAME" from the given +dnl FILE. The regexps here aren't very rugged, but are enough for us. +dnl /dev/null as a parameter prevents a hang if $2 is accidentally omitted. +dnl (shamelessly ripped from GMP, and changed prefix to GINAC_). -int main() -{ - FILE *fd; - fd = fopen("conftest.out", "w"); - fprintf(fd, "%s\n", rl_library_version); - fclose(fd); - return 0; -}], ginac_cv_rlversion=`cat 'conftest.out'`, ginac_cv_rlversion='unknown', ginac_cv_rlversion='4.2')]) -if test "x${ginac_cv_rlversion}" != "xunknown"; then - 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.]) -else - GINAC_WARNING([I could not run a test of libreadline (needed for building ginsh).]) +define(GINAC_HEADER_GETVAL, +[patsubst(patsubst( +esyscmd([grep "^#define $1 " $2 /dev/null 2>/dev/null]), +[^.*$1[ ]+],[]), +[[ + ]*$],[])]) +define(GINAC_GET_VERSION, +[GINAC_HEADER_GETVAL(GINACLIB_$1_VERSION,[ginac/version.h])]) +define(GINAC_GET_LTVERSION, +[GINAC_HEADER_GETVAL(GINAC_LT_$1,[ginac/version.h])]) + +dnl Usage: GINAC_STD_CXX_HEADERS +dnl Check for standard C++ headers, bail out if something is missing. +AC_DEFUN([GINAC_STD_CXX_HEADERS], [ +AC_CACHE_CHECK([for standard C++ header files], [ginac_cv_std_cxx_headers], [ + ginac_cv_std_cxx_headers="no" + AC_LANG_PUSH([C++]) + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + ]])], [ginac_cv_std_cxx_headers="yes"]) + AC_LANG_POP([C++])]) +if test "${ginac_cv_std_cxx_headers}" != "yes"; then + AC_MSG_ERROR([Standard ISO C++ 98 headers are missing]) fi ]) +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([ginsh will not compile, because readline headers could not be found.]) +else + 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([ginsh will not compile, because of an 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([ginsh will not compile, because 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(), @@ -43,6 +97,10 @@ dnl When both libtermcap and libncurses exist, we prefer the latter, because dnl libtermcap is being phased out. AC_DEFUN([GINAC_TERMCAP], [LIBTERMCAP= +case $host_os in +*mingw32*) + ;; dnl no termcap libraries are necessary (need hacked libreadline) +*) AC_CHECK_FUNCS(tgetent) if test "x$ac_cv_func_tgetent" = "xyes"; then : @@ -52,6 +110,8 @@ else AC_CHECK_LIB(termcap, tgetent, LIBTERMCAP="-ltermcap") fi fi +;; +esac AC_SUBST(LIBTERMCAP) ]) @@ -79,6 +139,7 @@ dnl This macro displays a warning message if GINAC_ERROR or GINAC_WARNING dnl has occured previously. AC_DEFUN([GINAC_CHECK_ERRORS],[ if test "x${ginac_error}" = "xyes"; then + echo echo "**** The following problems have been detected by configure." echo "**** Please check the messages below before running \"make\"." echo "**** (see the section 'Common Problems' in the INSTALL file)" @@ -93,6 +154,7 @@ if test "x${ginac_error}" = "xyes"; then exit 1 else if test "x${ginac_warning}" = "xyes"; then + echo echo "=== The following minor problems have been detected by configure." echo "=== Please check the messages below before running \"make\"." echo "=== (see the section 'Common Problems' in the INSTALL file)" @@ -119,3 +181,56 @@ if test "$ac_cv_have_rusage" = yes; then fi AC_SUBST(CONFIG_RUSAGE) ]) + +dnl Usage: GINAC_EXCOMPILER +dnl - Checks if dlopen is available +dnl - Allows user to disable GiNaC::compile_ex (e.g. for security reasons) +dnl Defines HAVE_LIBDL preprocessor macro, sets DL_LIBS and CONFIG_EXCOMPILER +dnl variables. +AC_DEFUN([GINAC_EXCOMPILER], [ +CONFIG_EXCOMPILER=yes +DL_LIBS="" + +AC_ARG_ENABLE([excompiler], + [AS_HELP_STRING([--enable-excompiler], [Enable GiNaC::compile_ex (default: yes)])], + [if test "$enableval" = "no"; then + CONFIG_EXCOMPILER="no" + fi], + [CONFIG_EXCOMPILER="yes"]) + +case $host_os in + *mingw32*) + CONFIG_EXCOMPILER="notsupported" + ;; + *) + ;; +esac + +if test "$CONFIG_EXCOMPILER" = "yes"; then + AC_CHECK_HEADER([dlfcn.h], [CONFIG_EXCOMPILER="yes"], [CONFIG_EXCOMPILER="no"]) +elif test "$CONFIG_EXCOMPILER" = "no"; then + AC_MSG_NOTICE([GiNaC::compile_ex disabled at user request.]) +else + AC_MSG_NOTICE([GiNaC::compile_ex is not supported on $host_os.]) +fi + +if test "$CONFIG_EXCOMPILER" = "yes"; then + dnl Some systems (GNU/Linux, Solaris) have dlopen in -ldl, some + dnl others (OpenBSD) -- in libc + found_dlopen_lib="no" + DL_LIBS="-ldl" + AC_CHECK_LIB(dl, dlopen, [found_dlopen_lib="yes"]) + if test "$found_dlopen_lib" = "no"; then + DL_LIBS="" + AC_CHECK_FUNC(dlopen, [found_dlopen_lib="yes"]) + fi + if test "$found_dlopen_lib" = "no"; then + CONFIG_EXCOMPILER="no" + AC_MSG_WARN([Could not found working dlopen(). GiNaC::compile_ex will be disabled.]) + else + AC_DEFINE(HAVE_LIBDL, 1, [set to 1 if dlopen() works.]) + fi +fi +AC_SUBST(DL_LIBS) +AC_SUBST(CONFIG_EXCOMPILER)]) +