Patch from Alexei for enabling compilation on MinGW.
[ginac.git] / acinclude.m4
index 962a8c0115d1bde226163effb4f9cfd8d67afcb5..45ea8dae4661662cbf5709a4b82a96b881c3223d 100644 (file)
@@ -4,66 +4,67 @@ dnl additions' names with AC_ but with GINAC_ in order to steer clear of
 dnl future trouble.
 dnl ===========================================================================
 
 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_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;
+}], 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).])
+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([for doublefactorial in -lcln])
-    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/cl_integer.h>],
-                [doublefactorial(2);],
-                ginac_cv_lib_cln_link="-lcln",
-                ginac_cv_lib_cln_link="fail")
-            ;;
-        *)
-            AC_TRY_LINK([#include <cl_integer.h>],
-                [doublefactorial(2);],
-                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="${ginac_cv_lib_cln_link} ${saved_LIBS}"
-        AC_MSG_RESULT("yes")
-    ;;
-dnl linking failed:
-    "fail")
-        LIBS="${saved_LIBS}"
-        AC_MSG_RESULT([no])
-        GINAC_ERROR([I could not successfully link a test-program against libcln and run it.
-   You either need to set \$LDFLAGS or install/update the CLN library.])
-    ;;
-    esac
+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 Usage: GINAC_ERROR(message)
 dnl This macro displays the warning "message" and sets the flag ginac_error
 dnl to yes.
 ])
 
 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,[
+AC_DEFUN([GINAC_ERROR],[
 ginac_error_txt="$ginac_error_txt
 ** $1
 "
 ginac_error_txt="$ginac_error_txt
 ** $1
 "
@@ -72,33 +73,55 @@ ginac_error=yes])
 dnl Usage: GINAC_WARNING(message)
 dnl This macro displays the warning "message" and sets the flag ginac_warning
 dnl to 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,[
+AC_DEFUN([GINAC_WARNING],[
 ginac_warning_txt="$ginac_warning_txt
 == $1
 "
 ginac_warning=yes])
 
 dnl Usage: GINAC_CHECK_ERRORS
 ginac_warning_txt="$ginac_warning_txt
 == $1
 "
 ginac_warning=yes])
 
 dnl Usage: GINAC_CHECK_ERRORS
-dnl (preferably to be put at end of configure.in)
+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.
 dnl This macro displays a warning message if GINAC_ERROR or GINAC_WARNING 
 dnl has occured previously.
-AC_DEFUN(GINAC_CHECK_ERRORS,[
+AC_DEFUN([GINAC_CHECK_ERRORS],[
 if test "x${ginac_error}" = "xyes"; then
 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
-  echo "deleting cache ${cache_file}"
-  rm -f $cache_file
-  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"
+    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
     fi
-  echo "Configuration of GiNaC $VERSION done. Now type \"make\"."
+    echo "Configuration of GiNaC $VERSION done. Now type \"make\"."
 fi])
 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)
+])