X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=acinclude.m4;h=78c3bdb7a86a62919ccde358bafc336f0b7af3e5;hp=1f621f98dbfbba2b6fe1202da2caaf4e2b0f9890;hb=1f7f3c85ec1b8063f475789544e9392ce59beb40;hpb=ab58fe9dace168295f9fac116ec4381103fb225e;ds=sidebyside diff --git a/acinclude.m4 b/acinclude.m4 index 1f621f98..78c3bdb7 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -4,114 +4,200 @@ dnl additions' names with AC_ but with GINAC_ in order to steer clear of dnl future trouble. dnl =========================================================================== -dnl Generally, it is a bad idea to put specialized header files for a library -dnl into a generic directory like /usr/local/include/. Instead, one should put -dnl them into a subdirectory. GiNaC does it, NTL does it. Unfortunately, CLN -dnl doesn't do so but some people choose to do it by hand. In these cases we -dnl need to #include , otherwise #include . This macro -dnl tries to be clever and find out the correct way by defining the variable -dnl HAVE_CLN_CLN_H in config.h: -AC_DEFUN(GINAC_CHECK_CLN_H, - [AC_PROVIDE([$0]) - AC_CHECK_HEADERS(CLN/cln.h, , - AC_CHECK_HEADERS(cln.h, , - AC_MSG_ERROR([cannot find header for Bruno Haible's CLN]); - ) - ) +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 This macro is needed because the generic AC_CHECK_LIB doesn't work because -dnl C++ is more strongly typed than C. Therefore we need to work with the -dnl more fundamental AC_TRY_LINK instead. -AC_DEFUN(GINAC_CHECK_LIBCLN, - [AC_PROVIDE([$0]) - AC_MSG_CHECKING([how to link with libcln]) - saved_LIBS="${LIBS}" - AC_CACHE_VAL(ginac_cv_lib_cln_link, - [LIBS="-lcln" - case "${ac_cv_header_CLN_cln_h}" in - "yes") - AC_TRY_LINK([#include ], - [factorial(1);], - ginac_cv_lib_cln_link="-lcln", - ginac_cv_lib_cln_link="fail") - ;; - *) - AC_TRY_LINK([#include ], - [factorial(1);], - ginac_cv_lib_cln_link="-lcln", - ginac_cv_lib_cln_link="fail") - ;; - esac - ]) - case "${ginac_cv_lib_cln_link}" in -dnl linking worked: - "-lcln") - LIBS="-lcln ${saved_LIBS}" - AC_MSG_RESULT([-lcln]) - GINAC_CHECK_LIBCLN_SANITY - ;; -dnl linking failed: - "fail") - LIBS="${saved_LIBS}" - AC_MSG_RESULT([]) - AC_MSG_ERROR([linking with libcln failed, maybe need to set \$LDFLAGS?]) - ;; -dnl should never ever get here: - *) - LIBS="${saved_LIBS}" - ;; - esac +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 + 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(), +dnl tgoto() in libc, some have it in libtermcap, some have it in libncurses. +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 + : +else + AC_CHECK_LIB(ncurses, tgetent, LIBTERMCAP="-lncurses") + if test -z "$LIBTERMCAP"; then + AC_CHECK_LIB(termcap, tgetent, LIBTERMCAP="-ltermcap") + fi +fi +;; +esac +AC_SUBST(LIBTERMCAP) ]) -dnl Check if the CLN library suits our needs, i.e. if it is new enough, by -dnl trying to run into a little bug which was present till version 1.0.1 and -dnl then removed. -AC_DEFUN(GINAC_CHECK_LIBCLN_SANITY, - [AC_PROVIDE([$0]) - AC_MSG_CHECKING([whether libcln behaves sane]) - AC_CACHE_VAL(ginac_cv_lib_cln_integrity, - [ - case "${ac_cv_header_CLN_cln_h}" in - "yes") - AC_TRY_RUN([#include -int main() { -cl_RA q(3); q = q/2; cl_RA p(3); p = p/2; -if (q+p != 3) return 1; else return 0; -}], - ginac_cv_lib_cln_integrity="sane", - ginac_cv_lib_cln_integrity="insane", - ginac_cv_lib_cln_integrity="guessing sane") - ;; - *) - AC_TRY_RUN([#include -int main() { -cl_RA q(3); q = q/2; cl_RA p(3); p = p/2; -if (q+p != 3) return 1; else return 0; -}], - ginac_cv_lib_cln_integrity="sane", - ginac_cv_lib_cln_integrity="insane", - ginac_cv_lib_cln_integrity="guessing sane") - ;; - esac - ]) - case "${ginac_cv_lib_cln_integrity}" in -dnl exit status was 0: - "sane") - AC_MSG_RESULT([yes]) - ;; -dnl exit status was not 0: - "insane") - AC_MSG_RESULT([no]) - AC_MSG_WARN([maybe version of libcln is older than 1.0.2?]) - ;; -dnl test-program was not run because we are cross-compiling: - "guessing sane") - AC_MSG_RESULT([hopefully]) - ;; -dnl should never ever get here: - *) - AC_MSG_WARN([you found a bug in the configure script!]) - ;; - esac +dnl Usage: GINAC_ERROR(message) +dnl This macro displays the warning "message" and sets the flag ginac_error +dnl to yes. +AC_DEFUN([GINAC_ERROR],[ +ginac_error_txt="$ginac_error_txt +** $1 +" +ginac_error=yes]) + +dnl Usage: GINAC_WARNING(message) +dnl This macro displays the warning "message" and sets the flag ginac_warning +dnl to yes. +AC_DEFUN([GINAC_WARNING],[ +ginac_warning_txt="$ginac_warning_txt +== $1 +" +ginac_warning=yes]) + +dnl Usage: GINAC_CHECK_ERRORS +dnl (must be put at end of configure.in, because it exits on error) +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 "**** 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)" + echo "$ginac_error_txt" + if test "x${ginac_warning_txt}" != "x"; then + echo "${ginac_warning_txt}" + fi + if test "x$cache_file" != "x/dev/null"; then + echo "deleting cache ${cache_file}" + rm -f $cache_file + fi + exit 1 +else + if test "x${ginac_warning}" = "xyes"; then + 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)" + echo "$ginac_warning_txt" + fi + echo "Configuration of GiNaC $VERSION done. Now type \"make\"." +fi]) + +AC_DEFUN([GINAC_HAVE_RUSAGE], +[AC_CACHE_CHECK([whether struct rusage is declared in ], +ac_cv_have_rusage, + [AC_TRY_COMPILE([#include + #include ], + [struct rusage resUsage; + getrusage(RUSAGE_SELF, &resUsage); + return 0;], + [ac_cv_have_rusage=yes], + [ac_cv_have_rusage=no]) ]) +CONFIG_RUSAGE="no" +if test "$ac_cv_have_rusage" = yes; then + CONFIG_RUSAGE="yes" + AC_DEFINE(HAVE_RUSAGE,,[define if struct rusage declared in ]) +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_LIB(dl, dlopen, [ + DL_LIBS="-ldl" + AC_DEFINE(HAVE_LIBDL, 1, [set to 1 if you have a working libdl installed.])], + + [AC_MSG_WARN([libdl not found. GiNaC::compile_ex will be disabled.]) + CONFIG_EXCOMPILER="no"]) +elif test "$CONFIG_EXCOMPILER" = "no"; then + AC_MSG_RESULT([INFO: GiNaC::compile_ex disabled at user request.]) +else + AC_MSG_RESULT([INFO: GiNaC::compile_ex is not supported on $host_os.]) +fi +AC_SUBST(DL_LIBS) +AC_SUBST(CONFIG_EXCOMPILER)]) +