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 <CLN/cln.h>, otherwise #include <cln.h>. 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 <iosfwd>
+ #include <iostream>
+ #include <vector>
+ #include <list>
+ #include <map>
+ #include <set>
+ #include <string>
+ #include <sstream>
+ #include <typeinfo>
+ #include <stdexcept>
+ #include <algorithm>
+ #include <limits>
+ #include <ctime>
+ ]])], [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 <CLN/cln.h>],
- [factorial(1);],
- ginac_cv_lib_cln_link="-lcln",
- ginac_cv_lib_cln_link="fail")
- ;;
- *)
- AC_TRY_LINK([#include <cln.h>],
- [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([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 <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([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(),
+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 <CLN/cln.h>
-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 <cln.h>
-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
+ 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
+ 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 <sys/resource.h>],
+ac_cv_have_rusage,
+ [AC_TRY_COMPILE([#include <sys/times.h>
+ #include <sys/resource.h>],
+ [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 <sys/resource.h>])
+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)])
+