[project @ 2003-08-27 15:18:29 by panne]
[ghc-hetmet.git] / aclocal.m4
index bdef3bd..0fb7fcd 100644 (file)
@@ -1,61 +1,89 @@
-dnl $Id: aclocal.m4,v 1.78 2001/06/30 00:12:52 sof Exp $
-dnl 
-dnl Extra autoconf macros for the Glasgow fptools
-dnl
-dnl To be a good autoconf citizen, names of local macros have
-dnl prefixed with FPTOOLS_ to ensure we don't clash
-dnl with any pre-supplied autoconf ones.
-
-dnl
-dnl Is timezone around? (in a header file)
-dnl 
-AC_DEFUN(FPTOOLS_HAVE_TIMEZONE,
-[AC_CACHE_CHECK([timezone], fptools_cv_have_timezone,
-[AC_TRY_COMPILE([#if TIME_WITH_SYS_TIME
-# include <sys/time.h>
-# include <time.h>
-#else
-# if HAVE_SYS_TIME_H
-#  include <sys/time.h>
-# else
-#  include <time.h>
-# endif
-#endif
-], [return timezone;], 
-fptools_cv_have_timezone=yes, fptools_cv_have_timezone=no)])
-if test "$fptools_cv_have_timezone" = yes; then
-  AC_DEFINE(HAVE_TIMEZONE)
+# Extra autoconf macros for the Glasgow fptools
+#
+# To be a good autoconf citizen, names of local macros have prefixed with FP_ to
+# ensure we don't clash with any pre-supplied autoconf ones.
+
+
+# FP_EVAL_STDERR(COMMAND)
+# ------------------------
+# Eval COMMAND, save its stderr (without lines resulting from shell tracing)
+# into the file conftest.err and the exit status in the variable fp_status.
+AC_DEFUN([FP_EVAL_STDERR],
+[{ (eval $1) 2>conftest.er1
+  fp_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  (exit $fp_status); }[]dnl
+])# FP_EVAL_STDERR
+
+
+# FP_CHECK_FLAG(FLAG, [ACTION-IF-SUPPORTED], [ACTION-IF-NOT-SUPPORTED])
+# -----------------------------------------------------------------------
+# Check to see whether the compiler for the current language supports a
+# particular option.
+#
+# Implementation note: When given an unkown option, GCC issues an warning on
+# stderr only, but returns an exit value of 0 nevertheless. Consequently we have
+# to check stderr *and* the exit value.
+#
+# Used by ghc.
+AC_DEFUN(FP_CHECK_FLAG,
+[AC_LANG_COMPILER_REQUIRE()dnl
+AC_LANG_CASE([C],          [fp_compiler="$CC"  m4_pushdef([fp_Flags], [CFLAGS])],
+             [C++],        [fp_compiler="$CXX" m4_pushdef([fp_Flags], [CXXFLAGS])],
+             [Fortran 77], [fp_compiler="$F77" m4_pushdef([fp_Flags], [FFLAGS])])
+m4_pushdef([fp_Cache], [fp_cv_[]fp_Flags[]AS_TR_SH([$1])])[]dnl
+AC_CACHE_CHECK([whether $fp_compiler accepts $1], [fp_Cache],
+[AC_LANG_CONFTEST([AC_LANG_PROGRAM()])
+fp_save_flags="$fp_Flags"
+fp_Flags="$fp_Flags $1"
+fp_Cache=no
+if FP_EVAL_STDERR([$ac_compile conftest.$ac_ext]) >/dev/null; then
+  test -s conftest.err || fp_Cache=yes
 fi
 fi
-])
-
-dnl
-dnl Has timezone the type time_t or long (HP-UX 10.20 apparently
-dnl has `long'..)
-dnl 
-AC_DEFUN(FPTOOLS_TYPE_TIMEZONE,
-[AC_CACHE_CHECK([type of timezone], fptools_cv_type_timezone,
-[AC_TRY_COMPILE([#if TIME_WITH_SYS_TIME
-# include <sys/time.h>
-# include <time.h>
-#else
-# if HAVE_SYS_TIME_H
-#  include <sys/time.h>
-# else
-#  include <time.h>
-# endif
-#endif
-
-extern time_t timezone;        
-],
-[int i;], fptools_cv_type_timezone=time_t, fptools_cv_type_timezone=long)])
-AC_DEFINE_UNQUOTED(TYPE_TIMEZONE, $fptools_cv_type_timezone)
-])
-
-dnl *** Is altzone available? ***
-dnl 
-AC_DEFUN(FPTOOLS_ALTZONE,
-[AC_CACHE_CHECK([altzone], fptools_cv_altzone,
-[AC_TRY_LINK([#if TIME_WITH_SYS_TIME
+fp_Flags="$fp_save_flags"
+rm -f conftest.err conftest.$ac_ext])
+AS_IF([test $fp_Cache = yes], [$2], [$3])[]dnl
+m4_popdef([fp_Cache])[]dnl
+m4_popdef([fp_Flags])[]dnl
+])# FP_CHECK_FLAG
+
+
+# FP_PROG_CONTEXT_DIFF
+# --------------------
+# Figure out how to do context diffs. Sets the output variable ContextDiffCmd.
+#
+# Note: NeXTStep thinks diff'ing a file against itself is "trouble".
+#
+# Used by ghc, glafp-utils/ltx, and glafp-utils/runstdtest.
+AC_DEFUN([FP_PROG_CONTEXT_DIFF],
+[AC_CACHE_CHECK([for a working context diff], [fp_cv_context_diff],
+[echo foo > conftest1
+echo foo > conftest2
+fp_cv_context_diff=no
+for fp_var in '-C 1' '-c1'
+do
+  if diff $fp_var conftest1 conftest2 > /dev/null 2>&1; then
+    fp_cv_context_diff="diff $fp_var"
+    break
+  fi
+done])
+if test x"$fp_cv_context_diff" = xno; then
+   AC_MSG_ERROR([cannot figure out how to do context diffs])
+fi
+AC_SUBST(ContextDiffCmd, [$fp_cv_context_diff])
+])# FP_PROG_CONTEXT_DIFF
+
+
+# FP_DECL_ALTZONE
+# -------------------
+# Defines HAVE_DECL_ALTZONE to 1 if declared, 0 otherwise.
+#
+# Used by base package.
+AC_DEFUN([FP_DECL_ALTZONE],
+[AC_REQUIRE([AC_HEADER_TIME])dnl
+AC_CHECK_HEADERS([sys/time.h])
+AC_CHECK_DECLS([altzone], [], [],[#if TIME_WITH_SYS_TIME
 # include <sys/time.h>
 # include <time.h>
 #else
 # include <sys/time.h>
 # include <time.h>
 #else
@@ -64,34 +92,83 @@ AC_DEFUN(FPTOOLS_ALTZONE,
 # else
 #  include <time.h>
 # endif
 # else
 #  include <time.h>
 # endif
-#endif
-], [return altzone;], 
-fptools_cv_altzone=yes, fptools_cv_altzone=no)])
-if test "$fptools_cv_altzone" = yes; then
-  AC_DEFINE(HAVE_ALTZONE)
-fi
-])
-
-
-dnl *** Does libc contain GNU regex? ***
-dnl 
-AC_DEFUN(FPTOOLS_REGEX_IN_LIBC,
-[AC_CACHE_CHECK([for GNU regex in libc], fptools_cv_have_regex,
-[AC_TRY_LINK([#if HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#include <regex.h>
-],[ struct re_pattern_buffer patbuf; 
-    re_compile_pattern("",0,&patbuf);
-    re_search_2 (&patbuf, "", 0, "",0, 0,0,0,0); ],
-fptools_cv_have_regex=yes, fptools_cv_have_regex=no)])
-if test "$fptools_cv_have_regex" = yes; then
-       HaveRegex=YES
+#endif])
+])# FP_DECL_ALTZONE
+
+
+# FP_COMPUTE_INT(EXPRESSION, VARIABLE, INCLUDES, IF-FAILS)
+# ---------------------------------------------------------
+# Assign VARIABLE the value of the compile-time EXPRESSION using INCLUDES for
+# compilation. Execute IF-FAILS when unable to determine the value. Works for
+# cross-compilation, too.
+#
+# Implementation note: We are lazy and use an internal autoconf macro, but it
+# is supported in autoconf versions 2.50 up to the actual 2.57, so there is
+# little risk.
+AC_DEFUN([FP_COMPUTE_INT],
+[_AC_COMPUTE_INT([$1], [$2], [$3], [$4])[]dnl
+])# FP_COMPUTE_INT
+
+
+# FP_CHECK_ALIGNMENT(TYPE, [IGNORED], [INCLUDES = DEFAULT-INCLUDES])
+# ------------------------------------------------------------------
+# A variation of AC_CHECK_SIZEOF for computing the alignment restrictions of a
+# given type. Defines ALIGNMENT_TYPE.
+AC_DEFUN([FP_CHECK_ALIGNMENT],
+[AS_LITERAL_IF([$1], [],
+               [AC_FATAL([$0: requires literal arguments])])[]dnl
+AC_CHECK_TYPE([$1], [], [], [$3])[]dnl
+m4_pushdef([fp_Cache], [AS_TR_SH([fp_cv_alignment_$1])])[]dnl
+AC_CACHE_CHECK([alignment of $1], [fp_Cache],
+[if test "$AS_TR_SH([ac_cv_type_$1])" = yes; then
+  FP_COMPUTE_INT([(long) (&((struct { char c; $1 ty; } *)0)->ty)],
+                 [fp_Cache],
+                 [AC_INCLUDES_DEFAULT([$3])],
+                 [AC_MSG_ERROR([cannot compute alignment ($1)
+See `config.log' for more details.], [77])])
 else
 else
-       HaveRegex=NO
-fi
-AC_SUBST(HaveRegex)
-])
+  fp_Cache=0
+fi])[]dnl
+AC_DEFINE_UNQUOTED(AS_TR_CPP(alignment_$1), $fp_Cache, [The alignment of a `$1'.])[]dnl
+m4_popdef([fp_Cache])[]dnl
+])# FP_CHECK_ALIGNMENT
+
+
+# FP_CHECK_CONST(EXPRESSION, [INCLUDES = DEFAULT-INCLUDES], [VALUE-IF-FAIL = -1])
+# ---------------------------------------------------------------------------------
+# Defines CONST_EXPRESSION to the value of the compile-time EXPRESSION, using
+# INCLUDES. If the value cannot be determined, use VALUE-IF-FAIL.
+AC_DEFUN([FP_CHECK_CONST],
+[AS_VAR_PUSHDEF([fp_Cache], [fp_cv_const_$1])[]dnl
+AC_CACHE_CHECK([value of $1], fp_Cache,
+[FP_COMPUTE_INT([$1], fp_check_const_result, [AC_INCLUDES_DEFAULT([$2])],
+                [fp_check_const_result=m4_default([$3], ['-1'])])
+AS_VAR_SET(fp_Cache, [$fp_check_const_result])])[]dnl
+AC_DEFINE_UNQUOTED(AS_TR_CPP([CONST_$1]), AS_VAR_GET(fp_Cache), [The value of $1.])[]dnl
+AS_VAR_POPDEF([fp_Cache])[]dnl
+])# FP_CHECK_CONST
+
+
+# FP_CHECK_CONSTS_TEMPLATE(EXPRESSION...)
+# ----------------------------------
+# autoheader helper for FP_CHECK_CONSTS
+m4_define([FP_CHECK_CONSTS_TEMPLATE],
+[AC_FOREACH([fp_Const], [$1],
+  [AH_TEMPLATE(AS_TR_CPP(CONST_[]fp_Const),
+               [The value of ]fp_Const[.])])[]dnl
+])# FP_CHECK_CONSTS_TEMPLATE
+
+
+# FP_CHECK_CONSTS(EXPRESSION..., [INCLUDES = DEFAULT-INCLUDES], [VALUE-IF-FAIL = -1])
+# -------------------------------------------------------------------------------------
+# List version of FP_CHECK_CONST
+AC_DEFUN(FP_CHECK_CONSTS,
+[FP_CHECK_CONSTS_TEMPLATE([$1])dnl
+for fp_const_name in $1
+do
+FP_CHECK_CONST([$fp_const_name], [$2], [$3])
+done
+])# FP_CHECK_CONSTS
 
 
 dnl ** check for leading underscores in symbol names
 
 
 dnl ** check for leading underscores in symbol names
@@ -106,6 +183,8 @@ dnl a leading underscore sometimes (eg. FreeBSD).  We therefore have
 dnl to work around this by checking for *no* leading underscore first.
 dnl Sigh.  --SDM
 dnl
 dnl to work around this by checking for *no* leading underscore first.
 dnl Sigh.  --SDM
 dnl
+dnl Similarly on OpenBSD, but this test doesn't help. -- dons
+dnl
 AC_DEFUN(FPTOOLS_UNDERSCORE,
 [AC_CHECK_LIB(elf, nlist, LIBS="-lelf $LIBS")dnl
 AC_CACHE_CHECK([leading underscore in symbol names], fptools_cv_lead_uscore,
 AC_DEFUN(FPTOOLS_UNDERSCORE,
 [AC_CHECK_LIB(elf, nlist, LIBS="-lelf $LIBS")dnl
 AC_CACHE_CHECK([leading underscore in symbol names], fptools_cv_lead_uscore,
@@ -119,6 +198,11 @@ dnl the underscoredness of that "platform"
 changequote(<<, >>)dnl
 <<
 case $HostPlatform in
 changequote(<<, >>)dnl
 <<
 case $HostPlatform in
+*openbsd*) # x86 openbsd is ELF from 3.4 >, meaning no leading uscore
+    case $build in
+        i386-*2\.[[0-9]] | i386-*3\.[[0-3]] ) fptools_cv_lead_uscore='yes' ;;
+        *)      fptools_cv_lead_uscore='no' ;;
+    esac ;;
 alpha-dec-osf*) fptools_cv_lead_uscore='no';;
 *cygwin32) fptools_cv_lead_uscore='yes';;
 *mingw32) fptools_cv_lead_uscore='yes';;
 alpha-dec-osf*) fptools_cv_lead_uscore='no';;
 *cygwin32) fptools_cv_lead_uscore='yes';;
 *mingw32) fptools_cv_lead_uscore='yes';;
@@ -150,46 +234,65 @@ esac);
 LeadingUnderscore=`echo $fptools_cv_lead_uscore | sed 'y/yesno/YESNO/'`
 AC_SUBST(LeadingUnderscore)
 case $LeadingUnderscore in
 LeadingUnderscore=`echo $fptools_cv_lead_uscore | sed 'y/yesno/YESNO/'`
 AC_SUBST(LeadingUnderscore)
 case $LeadingUnderscore in
-YES) AC_DEFINE(LEADING_UNDERSCORE);;
+YES) AC_DEFINE([LEADING_UNDERSCORE], [1], [Define to 1 if C symbols have a leading underscore added by the compiler.]);;
 esac
 ])
 
 esac
 ])
 
+
+# FP_COMPARE_VERSIONS(VERSION1, TEST, VERSION2, [ACTION-IF-TRUE], [ACTION-IF-FALSE])
+# ----------------------------------------------------------------------------------
+# Compare dotted version numbers VERSION1 and VERSION2 lexicographically according
+# to TEST (one of -eq, -ne, -lt, -le, -gt, or -ge).
+AC_DEFUN([FP_COMPARE_VERSIONS],
+[fp_version1=$1; fp_version2=$3
+fp_save_IFS=$IFS; IFS='.'
+while test x"$fp_version1" != x || test x"$fp_version2" != x
+do
+
+  set dummy $fp_version1; shift
+  fp_num1=""
+  test $[@%:@] = 0 || { fp_num1="[$]1"; shift; }
+  test x"$fp_num1" = x && fp_num1="0"
+  fp_version1="[$]*"
+
+  set dummy $fp_version2; shift
+  fp_num2=""
+  test $[@%:@] = 0 || { fp_num2="[$]1"; shift; }
+  test x"$fp_num2" = x && fp_num2="0"
+  fp_version2="[$]*"
+
+  test "$fp_num1" = "$fp_num2" || break;
+done
+IFS=$fp_save_IFS
+AS_IF([test "$fp_num1" $2 "$fp_num2"], [$4], [$5])[]dnl
+])# FP_COMPARE_VERSIONS
+
+
 dnl
 dnl
-dnl FPTOOLS_PROG_CHECK_VERSION(VERSIONSTR1, TEST, VERSIONSTR2,
-dnl                            ACTION-IF-TRUE [, ACTION-IF-FALSE])
-dnl
-dnl compare versions field-wise (separator is '.')
-dnl TEST is one of {-lt,-le,-eq,-ge,-gt}
-dnl
-dnl quite shell-independant and SUSv2 compliant code
-dnl
-dnl NOTE: the loop could be unrolled within autoconf, but the
-dnl       macro code would be a) longer and b) harder to debug... ;)
+dnl Check for GreenCard and version.
 dnl
 dnl
-AC_DEFUN(FPTOOLS_PROG_CHECK_VERSION,
-[if ( IFS=".";
-      a="[$1]";  b="[$3]";
-      while test -n "$a$b"
-      do
-              set -- [$]a;  h1="[$]1";  shift 2>/dev/null;  a="[$]*"
-              set -- [$]b;  h2="[$]1";  shift 2>/dev/null;  b="[$]*"
-              test -n "[$]h1" || h1=0;  test -n "[$]h2" || h2=0
-              test [$]{h1} -eq [$]{h2} || break
-      done
-      test [$]{h1} [$2] [$]{h2}
-    )
-then ifelse([$4],,[:],[
-  $4])
-ifelse([$5],,,
-[else
-  $5])
+AC_DEFUN(FPTOOLS_GREENCARD,
+[
+AC_PATH_PROG(GreenCardCmd,greencard)
+AC_CACHE_CHECK([for version of greencard], fptools_cv_greencard_version,
+changequote(, )dnl
+[if test x"$GreenCardCmd" != x; then
+   fptools_cv_greencard_version="`$GreenCardCmd --version |
+                         grep 'version' | sed -e 's/greencard. version \([^ ]*\).*/\1/g'`"
+else
+   fptools_cv_greencard_version=""
 fi
 fi
-])])dnl
-
+changequote([, ])dnl
+])
+FP_COMPARE_VERSIONS([$fptools_cv_greencard_version],[-lt],[$1],
+  [AC_MSG_ERROR([greencard version $1 or later is required (found '$fptools_cv_greencard_version')])])[]dnl
+GreenCardVersion=$fptools_cv_greencard_version
+AC_SUBST(GreenCardVersion)
+])
 
 dnl
 dnl Check for Happy and version.  If we're building GHC, then we need
 
 dnl
 dnl Check for Happy and version.  If we're building GHC, then we need
-dnl at least Happy version 1.9.  If there's no installed Happy, we look
+dnl at least Happy version 1.13.  If there's no installed Happy, we look
 dnl for a happy source tree and point the build system at that instead.
 dnl
 AC_DEFUN(FPTOOLS_HAPPY,
 dnl for a happy source tree and point the build system at that instead.
 dnl
 AC_DEFUN(FPTOOLS_HAPPY,
@@ -197,7 +300,11 @@ AC_DEFUN(FPTOOLS_HAPPY,
 if test -d $srcdir/happy; then
    SrcTreeHappyCmd=$hardtop/happy/src/happy-inplace
 fi
 if test -d $srcdir/happy; then
    SrcTreeHappyCmd=$hardtop/happy/src/happy-inplace
 fi
-AC_PATH_PROG(HappyCmd,happy,$SrcTreeHappyCmd)
+if test x"$UseSrcTreeHappy" = xYES; then
+  HappyCmd=$SrcTreeHappyCmd
+else
+  AC_PATH_PROG(HappyCmd,happy,$SrcTreeHappyCmd)
+fi
 AC_CACHE_CHECK([for version of happy], fptools_cv_happy_version,
 changequote(, )dnl
 [if test x"$HappyCmd" = x"$SrcTreeHappyCmd"; then
 AC_CACHE_CHECK([for version of happy], fptools_cv_happy_version,
 changequote(, )dnl
 [if test x"$HappyCmd" = x"$SrcTreeHappyCmd"; then
@@ -210,106 +317,152 @@ else
 fi;
 changequote([, ])dnl
 ])
 fi;
 changequote([, ])dnl
 ])
-if test -d $srcdir/ghc; then
-  FPTOOLS_PROG_CHECK_VERSION([$fptools_cv_happy_version],-lt,[1.9],
-  [AC_MSG_ERROR([Happy version 1.9 or later is required to compile GHC.])])dnl
+if test -d $srcdir/ghc -a ! -f $srcdir/ghc/compiler/parser/Parser.hs; then
+  FP_COMPARE_VERSIONS([$fptools_cv_happy_version],[-lt],[1.13],
+  [AC_MSG_ERROR([Happy version 1.13 or later is required to compile GHC.])])[]dnl
 fi
 HappyVersion=$fptools_cv_happy_version;
 AC_SUBST(HappyVersion)
 ])
 
 dnl
 fi
 HappyVersion=$fptools_cv_happy_version;
 AC_SUBST(HappyVersion)
 ])
 
 dnl
-dnl What's the best way of doing context diffs?
+dnl Check for Haddock and version.  If there's no installed Haddock, we look
+dnl for a haddock source tree and point the build system at that instead.
 dnl
 dnl
-dnl (NB: NeXTStep thinks diff'ing a file against itself is "trouble")
+AC_DEFUN(FPTOOLS_HADDOCK,
+[
+if test -d $srcdir/haddock; then
+   SrcTreeHaddockCmd=$hardtop/haddock/src/haddock-inplace
+fi
+if test x"$UseSrcTreeHaddock" = xYES; then
+  HaddockCmd=$SrcTreeHaddockCmd
+else
+  AC_PATH_PROG(HaddockCmd,haddock,$SrcTreeHaddockCmd)
+fi
+dnl Darn, I forgot to make Haddock print out its version number when
+dnl invoked with -v.  We could try generating some HTML and grepping
+dnl through that to find the version number, but I think we'll make
+dnl do without it for now.
+])
+
 dnl
 dnl
-AC_DEFUN(FPTOOLS_PROG_DIFF,
-[AC_CACHE_CHECK([for ok way to do context diffs], fptools_cv_context_diffs,
-[echo foo > conftest1
-echo foo > conftest2
-if diff -C 1 conftest1 conftest2 > /dev/null 2>&1 ; then
-    fptools_cv_context_diffs='diff -C 1'
+dnl Check for Alex and version.  If we're building GHC, then we need
+dnl at least Alex version 2.0.  If there's no installed Alex, we look
+dnl for a alex source tree and point the build system at that instead.
+dnl
+AC_DEFUN(FPTOOLS_ALEX,
+[
+if test -d $srcdir/alex; then
+   SrcTreeAlexCmd=$hardtop/alex/src/alex-inplace
+fi
+if test x"$UseSrcTreeAlex" = xYES; then
+  AlexCmd=$SrcTreeAlexCmd
 else
 else
-    if diff -c1 conftest1 conftest2 > /dev/null 2>&1 ; then
-        fptools_cv_context_diffs='diff -c1'
-    else
-        echo "Can't figure out how to do context diffs."
-        echo "Neither \`diff -C 1' nor \`diff -c1' works."
-        exit 1
-    fi
+  AC_PATH_PROG(AlexCmd,alex,$SrcTreeAlexCmd)
 fi
 fi
-rm -f conftest1 conftest2
+AC_CACHE_CHECK([for version of alex], fptools_cv_alex_version,
+changequote(, )dnl
+[if test x"$AlexCmd" = x"$SrcTreeAlexCmd"; then
+   fptools_cv_alex_version=`grep '^ProjectVersion[     ]*=' $srcdir/alex/mk/version.mk | sed 's/.*\([0-9][0-9]*\.[0-9][0-9]*\).*/\1/g'`;
+elif test x"$AlexCmd" != x; then
+   fptools_cv_alex_version="`$AlexCmd -v |
+                         grep 'Alex [Vv]ersion' | sed -e 's/Alex [Vv]ersion \([0-9\.]*\).*/\1/g'`" ;
+else
+   fptools_cv_alex_version="";
+fi;
+changequote([, ])dnl
 ])
 ])
-ContextDiffCmd=$fptools_cv_context_diffs
-AC_SUBST(ContextDiffCmd)
+dnl if test -d $srcdir/ghc -a ! -f $srcdir/ghc/compiler/parser/Lexer.hs; then
+dnl   FP_COMPARE_VERSIONS([$fptools_cv_alex_version],[-lt],[2.0],
+dnl   [AC_MSG_ERROR([Alex version 2.0 or later is required to compile GHC.])])[]dnl
+dnl fi
+AlexVersion=$fptools_cv_alex_version;
+AC_SUBST(AlexVersion)
 ])
 
 ])
 
+
 dnl
 dnl
-dnl Finding the Right Yacc
+dnl Check whether ld supports -x
 dnl
 dnl
-AC_DEFUN(FPTOOLS_PROG_YACCY,
-[AC_PROG_YACC
-if test "$YACC" = "yacc"; then
-   AC_CACHE_CHECK([if it is an OK yacc], ac_cv_prog_yacc,
-   [AC_CHECK_PROG(WhatCmd, what, what, :)
-    $WhatCmd $YACC > conftest.out
-    if egrep 'y1\.c 1\..*SMI' conftest.out >/dev/null 2>&1; then
-        echo "I don't trust your $YaccCmd; it looks like an old Sun yacc"
-        if test -f /usr/lang/yacc; then
-           echo "I'm going to use /usr/lang/yacc instead"
-           ac_cv_prog_yacc=/usr/lang/yacc
-        else
-           echo "I'm assuming the worst...no parser generator at all"
-           ac_cv_prog_yacc=:
-        fi
-    elif egrep 'y1\.c.*Revision: 4\.2\.6\.3.*DEC' conftest.out >/dev/null 2>&1; then
-        echo "I don't trust your $YaccCmd; it looks like a lame DEC yacc"
-        echo "I'm assuming the worst...no parser generator at all"
-        ac_cv_prog_yacc=:
-    else
-       ac_cv_prog_yacc=$YACC
-    fi
-    rm -fr conftest*
+AC_DEFUN(FPTOOLS_LD_X,
+[AC_CACHE_CHECK([whether ld understands -x], fptools_cv_ld_x,
+[
+echo 'foo() {}' > conftest.c
+${CC-cc} -c conftest.c
+if ${LdCmd} -r -x -o foo.o conftest.o; then
+   fptools_cv_ld_x=yes
+else
+   fptools_cv_ld_x=no
+fi
+rm -rf conftest.c conftest.o foo.o
 ])
 ])
+if test "$fptools_cv_ld_x" = yes; then
+       LdXFlag=-x
 else
 else
-    ac_cv_prog_yacc=$YACC
+       LdXFlag=
 fi
 fi
-YaccCmd=$ac_cv_prog_yacc
-AC_SUBST(YaccCmd)
+AC_SUBST(LdXFlag)
 ])
 
 ])
 
+
 dnl *** Checking for ar and its arguments + whether we need ranlib.
 dnl
 dnl *** Checking for ar and its arguments + whether we need ranlib.
 dnl
-dnl ArCmd and RANLIB are AC_SUBST'ed
+dnl ArCmd, ArSupportsInput and RANLIB are AC_SUBST'ed
+dnl On Digital UNIX, we test for the -Z (compress) and
+dnl -input (take list of files from external file) flags.
 dnl 
 AC_DEFUN(FPTOOLS_PROG_AR_AND_RANLIB,
 dnl 
 AC_DEFUN(FPTOOLS_PROG_AR_AND_RANLIB,
-[AC_PATH_PROG(ArCmd,ar)
-if test -z "$ArCmd"; then
+[AC_PATH_PROG(ArCmdRaw,ar)
+if test -z "$ArCmdRaw"; then
     echo "You don't seem to have ar in your PATH...I have no idea how to make a library"
     exit 1;
 fi
     echo "You don't seem to have ar in your PATH...I have no idea how to make a library"
     exit 1;
 fi
-if $ArCmd clqs conftest.a >/dev/null 2>/dev/null; then
-    ArCmd="$ArCmd clqs"
+dnl GNU ar needs special treatment: it appears to have problems with
+dnl object files with the same name if you use the 's' modifier, but
+dnl simple 'ar q' works fine, and doesn't need a separate ranlib.
+if $ArCmdRaw --version | grep 'GNU' >/dev/null 2>/dev/null; then
+    ArCmdArgs='q'
     NeedRanLib=''
     NeedRanLib=''
-elif $ArCmd cqs conftest.a >/dev/null 2>/dev/null; then
-    ArCmd="$ArCmd cqs"
+elif $ArCmdRaw clqsZ conftest.a >/dev/null 2>/dev/null; then
+    ArCmdArgs="clqsZ"
     NeedRanLib=''
     NeedRanLib=''
-elif $ArCmd clq conftest.a >/dev/null 2>/dev/null; then
-    ArCmd="$ArCmd clq"
+elif $ArCmdRaw clqs conftest.a >/dev/null 2>/dev/null; then
+    ArCmdArgs="clqs"
+    NeedRanLib=''
+elif $ArCmdRaw cqs conftest.a >/dev/null 2>/dev/null; then
+    ArCmdArgs="cqs"
+    NeedRanLib=''
+elif $ArCmdRaw clq conftest.a >/dev/null 2>/dev/null; then
+    ArCmdArgs="clq"
     NeedRanLib='YES'
     NeedRanLib='YES'
-elif $ArCmd cq conftest.a >/dev/null 2>/dev/null; then
-    ArCmd="$ArCmd cq"
+elif $ArCmdRaw cq conftest.a >/dev/null 2>/dev/null; then
+    ArCmdArgs="cq"
     NeedRanLib='YES'
     NeedRanLib='YES'
-elif $ArCmd cq conftest.a 2>&1 | grep 'no archive members specified' >/dev/null 2>/dev/null; then
-    ArCmd="$ArCmd cq"
+elif $ArCmdRaw cq conftest.a 2>&1 | grep 'no archive members specified' >/dev/null 2>/dev/null; then
+    ArCmdArgs="cq"
     NeedRanLib='YES'
 else
     echo "I can't figure out how to use your $ArCmd"
     exit 1
 fi
 rm -rf conftest*
     NeedRanLib='YES'
 else
     echo "I can't figure out how to use your $ArCmd"
     exit 1
 fi
 rm -rf conftest*
+case $HostPlatform in
+ *mingw32) 
+         ArCmd="`cygpath -w ${ArCmdRaw} | sed -e 's@\\\\@/@g' ` ${ArCmdArgs}"
+         ;;
+ *) ArCmd="${ArCmdRaw} ${ArCmdArgs}"
+    ;;
+esac
 test -n "$ArCmd" && test -n "$verbose" && echo "        setting ArCmd to $ArCmd"
 AC_SUBST(ArCmd)
 test -n "$ArCmd" && test -n "$verbose" && echo "        setting ArCmd to $ArCmd"
 AC_SUBST(ArCmd)
+if $ArCmd conftest.a -input /dev/null >/dev/null 2>/dev/null; then
+    ArSupportsInput='-input'
+else
+    ArSupportsInput=''
+fi
+rm -rf conftest*
+test -n "$ArSupportsInput" && test -n "$verbose" && echo "        setting ArSupportsInput to $ArSupportsInput"
+AC_SUBST(ArSupportsInput)
 if test -z "$NeedRanLib"; then
     RANLIB=':'
     test -n "$verbose" && echo "        setting RANLIB to $RANLIB"
 if test -z "$NeedRanLib"; then
     RANLIB=':'
     test -n "$verbose" && echo "        setting RANLIB to $RANLIB"
@@ -350,20 +503,39 @@ AC_DEFUN(FPTOOLS_HAVE_GCC,
     fptools_cv_have_gcc='no'
 else
 changequote(, )dnl
     fptools_cv_have_gcc='no'
 else
 changequote(, )dnl
-    cmd_string="`$CC -v 2>&1 | grep 'version ' | sed -e 's/.*version [^0-9]*\([0-9][0-9]*\)\.\([0-9][0-9]*\).*/expr 20 \\\< \1 \\\* 10 + \2/g' `"
+    gcc_version_str="`$CC -v 2>&1 | grep 'version ' | sed -e 's/.*version [^0-9]*\([0-9][0-9]*\)\.\([0-9][0-9]*\).*/\1\.\2/g' `"
 changequote([, ])dnl
 changequote([, ])dnl
-    if test `eval $cmd_string 2>/dev/null` != "1"; then
-       echo ''
-        echo "I'm not sure if your version of gcc will work,"
-        echo "but it's worth a shot, eh?"
-    fi
     fptools_cv_have_gcc='yes'
     fptools_cv_have_gcc='yes'
+    FP_COMPARE_VERSIONS([$gcc_version_str], [-lt], [2.0],
+        [fptools_cv_have_gcc='no'
+        echo ""
+       echo "your gcc version appears to be ..."
+        $CC --version
+        echo "gcc prior to 2.0 and have never worked with ghc."
+        echo "we recommend 2.95.3, although versions back to 2.7.2 should be ok."
+        AC_MSG_ERROR([gcc 1.X has never been supported])])
 fi
 ])
 HaveGcc=`echo $fptools_cv_have_gcc | sed 'y/yesno/YESNO/'`
 AC_SUBST(HaveGcc)
 ])
 
 fi
 ])
 HaveGcc=`echo $fptools_cv_have_gcc | sed 'y/yesno/YESNO/'`
 AC_SUBST(HaveGcc)
 ])
 
+dnl
+dnl Some OSs (Mandrake Linux, in particular) configure GCC with
+dnl -momit-leaf-frame-pointer on by default.  If this is the case, we
+dnl need to turn it off for mangling to work.  The test is currently a bit
+dnl crude, using only the version number of gcc.
+dnl
+AC_DEFUN([FPTOOLS_GCC_NEEDS_NO_OMIT_LFPTR],
+[AC_CACHE_CHECK([whether gcc needs -mno-omit-leaf-frame-pointer], [fptools_cv_gcc_needs_no_omit_lfptr],
+[FP_COMPARE_VERSIONS([$gcc_version_str], [-ge], [3.2],
+  [fptools_cv_gcc_needs_no_omit_lfptr=yes],
+  [fptools_cv_gcc_needs_no_omit_lfptr=no])])
+if test "$fptools_cv_gcc_needs_no_omit_lfptr" = "yes"; then
+   AC_DEFINE([HAVE_GCC_MNO_OMIT_LFPTR], [1], [Define to 1 if gcc supports -mno-omit-leaf-frame-pointer.])
+fi])# FPTOOLS_GCC_NEEDS_NO_OMIT_LFPTR
+
+
 dnl Small feature test for perl version. Assumes PerlCmd
 dnl contains path to perl binary
 dnl
 dnl Small feature test for perl version. Assumes PerlCmd
 dnl contains path to perl binary
 dnl
@@ -372,20 +544,60 @@ AC_DEFUN(FPTOOLS_CHECK_PERL_VERSION,
 if grep "version 5" conftest.out >/dev/null 2>&1; then
    :
 else
 if grep "version 5" conftest.out >/dev/null 2>&1; then
    :
 else
-  if grep "v5.6" conftest.out >/dev/null 2>&1; then
-     :
-  else
-     if grep "version 6" conftest.out >/dev/null 2>&1; then
-       :
-     else
-       echo "Your version of perl probably won't work."
-     fi
-  fi
+   if grep "v5.6" conftest.out >/dev/null 2>&1; then
+      :
+   else
+      if grep "v5.8" conftest.out >/dev/null 2>&1; then
+         :
+      else
+         if grep "version 6" conftest.out >/dev/null 2>&1; then
+            :
+         else
+            echo "Your version of perl probably won't work."
+         fi  
+      fi
+   fi
 fi
 rm -fr conftest*
 ])
 
 dnl
 fi
 rm -fr conftest*
 ])
 
 dnl
+dnl Getting at the right version of 'find'
+dnl (i.e., not the MS util on a Win32 box).
+dnl
+AC_DEFUN(FPTOOLS_FIND_FIND,
+[
+AC_PATH_PROG(Find2Cmd, find)
+$Find2Cmd --version > conftest.out 2>&1 
+if grep "FIND: Parameter format" conftest.out >/dev/null 2>&1 ; then
+   # Encountered MS' find utility, which is not what we're after.
+   #
+   # HACK - AC_CHECK_PROG is useful here in that does let you reject
+   # an (absolute) entry in the path (Find2Cmd). It is not so useful
+   # in that it doesn't let you (AFAIU) set VARIABLE equal to the 
+   # absolute path eventually found. So, hack around this by inspecting
+   # what variables hold the abs. path & use them directly.
+   AC_CHECK_PROG(FindCmd,find,`echo $ac_dir/$ac_word`,find,,$Find2Cmd)
+else
+FindCmd=$Find2Cmd
+AC_SUBST(FindCmd)
+fi
+])
+
+dnl
+dnl FPTOOLS_NOCACHE_CHECK prints a message, then sets the
+dnl values of the second argument to the result of running
+dnl the commands given by the third. It does not cache its
+dnl result, so it is suitable for checks which should be
+dnl run every time.
+dnl
+AC_DEFUN(FPTOOLS_NOCACHE_CHECK,
+[AC_MSG_CHECKING([$1])
+ $3
+ AC_MSG_RESULT([$][$2])
+])
+
+dnl
 dnl FPTOOLS_GHC_VERSION(version)
 dnl FPTOOLS_GHC_VERSION(major, minor [, patchlevel])
 dnl FPTOOLS_GHC_VERSION(version, major, minor, patchlevel)
 dnl FPTOOLS_GHC_VERSION(version)
 dnl FPTOOLS_GHC_VERSION(major, minor [, patchlevel])
 dnl FPTOOLS_GHC_VERSION(version, major, minor, patchlevel)
@@ -394,93 +606,47 @@ dnl Test for version of installed ghc.  Uses $GHC.
 dnl [original version pinched from c2hs]
 dnl
 AC_DEFUN(FPTOOLS_GHC_VERSION,
 dnl [original version pinched from c2hs]
 dnl
 AC_DEFUN(FPTOOLS_GHC_VERSION,
-[define([FPTOOLS_CV_GHC_VERSION], [fptools_cv_ghc_version])dnl
-AC_CACHE_CHECK([version of ghc], FPTOOLS_CV_GHC_VERSION, [dnl
-${WithGhc-ghc} --version > conftestghc 2>&1
+[FPTOOLS_NOCACHE_CHECK([version of ghc], [fptools_version_of_ghc],
+["${WithGhc-ghc}" --version > conftestghc 2>&1
   cat conftestghc >&AC_FD_CC
   cat conftestghc >&AC_FD_CC
-dnl `Useless Use Of cat' award...
-changequote(<<, >>)dnl
-  FPTOOLS_CV_GHC_VERSION=`cat conftestghc | sed -n -e 's/, patchlevel *\([0-9]\)/.\1/;s/.* version \([0-9][0-9.]*\).*/\1/p'`
-changequote([, ])dnl
+#Useless Use Of cat award...
+  fptools_version_of_ghc=`cat conftestghc | sed -n -e 's/, patchlevel *\([[0-9]]\)/.\1/;s/.* version \([[0-9]][[0-9.]]*\).*/\1/p'`
   rm -fr conftest*
   rm -fr conftest*
-  if test "[$]FPTOOLS_CV_GHC_VERSION" = ""
+  if test "[$]fptools_version_of_ghc" = ""
   then
   then
-    FPTOOLS_CV_GHC_VERSION='unknown'
-  fi])
-changequote(<<, >>)dnl
-FPTOOLS_CV_GHC_VERSION<<_major>>=`echo <<$>>FPTOOLS_CV_GHC_VERSION | sed -e 's/^\([0-9]\).*/\1/'`
-FPTOOLS_CV_GHC_VERSION<<_minor>>=`echo <<$>>FPTOOLS_CV_GHC_VERSION | sed -e 's/^[0-9]\.\([0-9]*\).*/\1/'`
-FPTOOLS_CV_GHC_VERSION<<_pl>>=`echo <<$>>FPTOOLS_CV_GHC_VERSION | sed -n -e 's/^[0-9]\.[0-9]*\.\([0-9]*\)/\1/p'`
-changequote([, ])dnl
-if test "[$]FPTOOLS_CV_GHC_VERSION[_pl]" = ""
+    fptools_version_of_ghc='unknown'
+  fi
+fptools_version_of_ghc[_major]=`echo [$]fptools_version_of_ghc | sed -e 's/^\([[0-9]]\).*/\1/'`
+fptools_version_of_ghc[_minor]=`echo [$]fptools_version_of_ghc | sed -e 's/^[[0-9]]\.\([[0-9]]*\).*/\1/'`
+fptools_version_of_ghc[_pl]=`echo [$]fptools_version_of_ghc | sed -n -e 's/^[[0-9]]\.[[0-9]]*\.\([[0-9]]*\)/\1/p'`
+#
+if test "[$]fptools_version_of_ghc[_pl]" = ""
 then
 then
-  FPTOOLS_CV_GHC_VERSION[_all]="[$]FPTOOLS_CV_GHC_VERSION[_major].[$]FPTOOLS_CV_GHC_VERSION[_minor]"
-  FPTOOLS_CV_GHC_VERSION[_pl]="0"
+  fptools_version_of_ghc[_all]="[$]fptools_version_of_ghc[_major].[$]fptools_version_of_ghc[_minor]"
+  fptools_version_of_ghc[_pl]="0"
 else
 else
-  FPTOOLS_CV_GHC_VERSION[_all]="[$]FPTOOLS_CV_GHC_VERSION[_major].[$]FPTOOLS_CV_GHC_VERSION[_minor].[$]FPTOOLS_CV_GHC_VERSION[_pl]"
+  fptools_version_of_ghc[_all]="[$]fptools_version_of_ghc[_major].[$]fptools_version_of_ghc[_minor].[$]fptools_version_of_ghc[_pl]"
 fi
 fi
+#
 ifelse($#, [1], [dnl
 ifelse($#, [1], [dnl
-[$1]="[$]FPTOOLS_CV_GHC_VERSION[_all]"
+[$1]="[$]fptools_version_of_ghc[_all]"
 ], $#, [2], [dnl
 ], $#, [2], [dnl
-[$1]="[$]FPTOOLS_CV_GHC_VERSION[_major]"
-[$2]="[$]FPTOOLS_CV_GHC_VERSION[_minor]"
+[$1]="[$]fptools_version_of_ghc[_major]"
+[$2]="[$]fptools_version_of_ghc[_minor]"
 ], $#, [3], [dnl
 ], $#, [3], [dnl
-[$1]="[$]FPTOOLS_CV_GHC_VERSION[_major]"
-[$2]="[$]FPTOOLS_CV_GHC_VERSION[_minor]"
-[$3]="[$]FPTOOLS_CV_GHC_VERSION[_pl]"
+[$1]="[$]fptools_version_of_ghc[_major]"
+[$2]="[$]fptools_version_of_ghc[_minor]"
+[$3]="[$]fptools_version_of_ghc[_pl]"
 ], $#, [4], [dnl
 ], $#, [4], [dnl
-[$1]="[$]FPTOOLS_CV_GHC_VERSION[_all]"
-[$2]="[$]FPTOOLS_CV_GHC_VERSION[_major]"
-[$3]="[$]FPTOOLS_CV_GHC_VERSION[_minor]"
-[$4]="[$]FPTOOLS_CV_GHC_VERSION[_pl]"
-], [AC_MSG_ERROR([wrong number of arguments to [$0]])])dnl
-undefine([FPTOOLS_CV_GHC_VERSION])dnl
+[$1]="[$]fptools_version_of_ghc[_all]"
+[$2]="[$]fptools_version_of_ghc[_major]"
+[$3]="[$]fptools_version_of_ghc[_minor]"
+[$4]="[$]fptools_version_of_ghc[_pl]"
+])
+])
 ])dnl
 
 
 ])dnl
 
 
-dnl ** figure out the alignment restriction of a type
-dnl    (required SIZEOF test but AC_CHECK_SIZEOF doesn't call PROVIDE
-dnl     so we can't call REQUIRE)
-
-dnl FPTOOLS_CHECK_ALIGNMENT(TYPE)
-AC_DEFUN(FPTOOLS_CHECK_ALIGNMENT,
-[changequote(<<, >>)dnl
-dnl The name to #define.
-define(<<AC_TYPE_NAME>>, translit(alignment_$1, [a-z *], [A-Z_P]))dnl
-dnl The cache variable name.
-define(<<AC_CV_NAME>>, translit(ac_cv_alignment_$1, [ *], [_p]))dnl
-dnl The name of the corresponding size.
-define(<<AC_CV_SIZEOF_NAME>>, translit(ac_cv_sizeof_$1, [ *], [_p]))dnl
-changequote([, ])dnl
-AC_MSG_CHECKING(alignment of $1)
-AC_CACHE_VAL(AC_CV_NAME,
-[AC_TRY_RUN([
-#include <stdio.h>
-#if HAVE_STDDEF_H
-#include <stddef.h>
-#endif
-#ifndef offsetof
-#define offsetof(ty,field) ((size_t)((char *)&((ty *)0)->field - (char *)(ty *)0))
-#endif
-int
-main()
-{
-  FILE *f=fopen("conftestval", "w");
-  if (!f) exit(1);
-  fprintf(f, "%d", offsetof(struct { char c; $1 ty;},ty));
-  exit(0);
-}],
-AC_CV_NAME=`cat conftestval`,
-AC_CV_NAME=$AC_CV_SIZEOF_NAME,
-AC_CV_NAME=$AC_CV_SIZEOF_NAME)])
-AC_MSG_RESULT($AC_CV_NAME)
-AC_DEFINE_UNQUOTED(AC_TYPE_NAME, $AC_CV_NAME)
-AC_PROVIDE($AC_TYPE_NAME)
-undefine([AC_TYPE_NAME])dnl
-undefine([AC_CV_NAME])dnl
-undefine([AC_CV_SIZEOF_NAME])dnl
-])
-
 dnl ** Map an arithmetic C type to a Haskell type.
 dnl    Based on autconf's AC_CHECK_SIZEOF.
 
 dnl ** Map an arithmetic C type to a Haskell type.
 dnl    Based on autconf's AC_CHECK_SIZEOF.
 
@@ -496,14 +662,53 @@ AC_MSG_CHECKING(Haskell type for $1)
 AC_CACHE_VAL(AC_CV_NAME,
 [AC_TRY_RUN([#include <stdio.h>
 #include <stddef.h>
 AC_CACHE_VAL(AC_CV_NAME,
 [AC_TRY_RUN([#include <stdio.h>
 #include <stddef.h>
+
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+
+#ifdef HAVE_FCNTL_H
+# include <fcntl.h>
+#endif
+
 #ifdef HAVE_SIGNAL_H
 #ifdef HAVE_SIGNAL_H
-#include <signal.h>
+# include <signal.h>
 #endif
 #endif
+
 #ifdef HAVE_TIME_H
 #ifdef HAVE_TIME_H
-#include <time.h>
+# include <time.h>
+#endif
+
+#ifdef HAVE_TERMIOS_H
+# include <termios.h>
+#endif
+
+#ifdef HAVE_STRING_H
+# include <string.h>
+#endif
+
+#ifdef HAVE_CTYPE_H
+# include <ctype.h>
 #endif
 #endif
+
 #ifdef HAVE_GL_GL_H
 #ifdef HAVE_GL_GL_H
-#include <GL/gl.h>
+# include <GL/gl.h>
+#endif
+
+#ifdef HAVE_OPENGL_GL_H
+# include <OpenGL/gl.h>
+#endif
+
+#ifdef HAVE_SYS_RESOURCE_H
+# include <sys/resource.h>
 #endif
 
 typedef $1 testing;
 #endif
 
 typedef $1 testing;
@@ -526,177 +731,11 @@ main() {
 ifelse([$2], , AC_CV_NAME=NotReallyAType,      AC_CV_NAME=$2),
 ifelse([$3], , AC_CV_NAME=NotReallyATypeCross, AC_CV_NAME=$3))]) dnl
 AC_MSG_RESULT($AC_CV_NAME)
 ifelse([$2], , AC_CV_NAME=NotReallyAType,      AC_CV_NAME=$2),
 ifelse([$3], , AC_CV_NAME=NotReallyATypeCross, AC_CV_NAME=$3))]) dnl
 AC_MSG_RESULT($AC_CV_NAME)
-AC_DEFINE_UNQUOTED(AC_TYPE_NAME, $AC_CV_NAME)
+AC_DEFINE_UNQUOTED(AC_TYPE_NAME, $AC_CV_NAME, [Define to Haskell type for $1])
 undefine([AC_TYPE_NAME])dnl
 undefine([AC_CV_NAME])dnl
 ])
 
 undefine([AC_TYPE_NAME])dnl
 undefine([AC_CV_NAME])dnl
 ])
 
-dnl ** figure out whether C compiler supports 'long long's
-dnl    (Closely based on Andreas Zeller's macro for testing
-dnl     for this under C++)
-dnl
-dnl    If the C compiler supports `long long' types,
-dnl    define `HAVE_LONG_LONG'.
-dnl
-AC_DEFUN(FPTOOLS_C_LONG_LONG,
-[
-AC_REQUIRE([AC_PROG_CC])
-AC_MSG_CHECKING(whether ${CC} supports long long types)
-AC_CACHE_VAL(fptools_cv_have_long_long,
-[
-AC_LANG_SAVE
-AC_LANG_C
-AC_TRY_COMPILE(,[long long a;],
-fptools_cv_have_long_long=yes,
-fptools_cv_have_long_long=no)
-AC_LANG_RESTORE
-])
-AC_MSG_RESULT($fptools_cv_have_long_long)
-if test "$fptools_cv_have_long_long" = yes; then
-AC_DEFINE(HAVE_LONG_LONG)
-fi
-])
-
-dnl ** Obtain the value of a C constant.
-dnl    The value will be `(-1)' if the constant is undefined.
-dnl
-dnl    This is set up so that the argument can be a shell variable.
-dnl
-AC_DEFUN(FPTOOLS_CHECK_CCONST,
-[
-eval "def_name=CCONST_$1"
-eval "cv_name=ac_cv_cconst_$1"
-AC_MSG_CHECKING(value of $1)
-AC_CACHE_VAL($cv_name,
-[AC_TRY_RUN([#include <stdio.h>
-#include <errno.h>
-main()
-{
-  FILE *f=fopen("conftestval", "w");
-  if (!f) exit(1);
-  fprintf(f, "%d\n", $1);
-  exit(0);
-}], 
-eval "$cv_name=`cat conftestval`",
-eval "$cv_name=-1",
-ifelse([$2], , , eval "$cv_name=$2"))])dnl
-eval "fptools_check_cconst_result=`echo '$'{$cv_name}`"
-AC_MSG_RESULT($fptools_check_cconst_result)
-AC_DEFINE_UNQUOTED($def_name, $fptools_check_cconst_result)
-unset fptools_check_cconst_result
-])
-
-dnl ** Invoke AC_CHECK_CCONST on each argument (which have to separate with 
-dnl    spaces)
-dnl
-AC_DEFUN(FPTOOLS_CHECK_CCONSTS,
-[for ac_const_name in $1
-do
-FPTOOLS_CHECK_CCONST($ac_const_name)dnl
-done
-])
-
-
-dnl *** Can we open files in binary mode? ***
-dnl 
-AC_DEFUN(FPTOOLS_O_BINARY,
-[
-AC_REQUIRE([AC_PROG_CC])
-AC_MSG_CHECKING(whether we can open files in binary mode)
-AC_CACHE_VAL(fptools_cv_have_o_binary,
-[
-AC_LANG_SAVE
-AC_LANG_C
-AC_TRY_COMPILE(,
-[#ifdef HAVE_FCNTL_H
-#include <fcntl.h>
-#endif
-int x = O_BINARY;],
-fptools_cv_have_o_binary=yes,
-fptools_cv_have_o_binary=no)
-AC_LANG_RESTORE
-])
-AC_MSG_RESULT($fptools_cv_have_o_binary)
-if test "$fptools_cv_have_o_binary" = yes; then
-AC_DEFINE(HAVE_O_BINARY)
-fi
-])
-
-dnl *** Which one comes first, .text or .data? ***
-dnl 
-AC_DEFUN(FPTOOLS_CODE_BEFORE_DATA,
-[AC_CACHE_CHECK([if code section appears before data], fptools_cv_code_bef_data,
-[AC_TRY_RUN([
-int f() { return 1; }
-int i;
-int main() { return ((char*)&f > (char*)&i); }
-
-],
-fptools_cv_code_bef_data=yes, fptools_cv_code_bef_data=no,false)])
-if test "$fptools_cv_code_bef_data" = yes; then
-  AC_DEFINE(CODE_BEFORE_DATA)
-fi
-])
-
-dnl *** Helper function **
-dnl 
-AC_DEFUN(FPTOOLS_IN_SCOPE,AC_TRY_LINK([extern char* $1;],[return (int)&$2], $3=yes, $3=no))
-
-dnl *** What's the end-of-text-section marker called? ***
-dnl
-AC_DEFUN(FPTOOLS_END_TEXT_SECTION,
-[AC_MSG_CHECKING([for end of text section marker])
-not_done=1
-for i in data_start _data_start etext _etext __etext; do
-  FPTOOLS_IN_SCOPE($i,$i,fptools_end_of_text)
-  if test "$fptools_end_of_text" = yes; then
-   AC_CACHE_VAL([fptools_cv_end_of_text_decl], AC_DEFINE_UNQUOTED(TEXT_SECTION_END_MARKER_DECL, $i))
-   AC_CACHE_VAL([fptools_cv_end_of_text], AC_DEFINE_UNQUOTED(TEXT_SECTION_END_MARKER, $i))
-   not_done=0
-   break
-  fi
-done
-if test "$not_done" = 1; then
-FPTOOLS_IN_SCOPE(etext asm("etext"),etext,fptools_end_of_text);
-if test "$fptools_end_of_text" = yes; then
-  AC_CACHE_VAL([fptools_cv_end_of_text], AC_DEFINE_UNQUOTED(TEXT_SECTION_END_MARKER, etext))
-  AC_CACHE_VAL([fptools_cv_end_of_text_decl], AC_DEFINE_UNQUOTED(TEXT_SECTION_END_MARKER_DECL, etext asm("etext")))
-else
-  AC_DEFINE_UNQUOTED(TEXT_SECTION_END_MARKER_DECL, dunno_what_it_is)
-  AC_DEFINE_UNQUOTED(TEXT_SECTION_END_MARKER, dunno_what_it_is)
-fi
-fi
-AC_MSG_RESULT([$]fptools_cv_end_of_text)
-])
-
-dnl *** What's the end-of-data-section marker called? ***
-dnl
-AC_DEFUN(FPTOOLS_END_DATA_SECTION,
-[AC_MSG_CHECKING([for end of data section marker])
-not_done=1
-for i in end _end __end; do
-  FPTOOLS_IN_SCOPE($i,$i,fptools_end_of_data)
-  if test "$fptools_end_of_data" = yes; then
-   AC_CACHE_VAL([fptools_cv_end_of_data_decl], [AC_DEFINE_UNQUOTED(DATA_SECTION_END_MARKER_DECL, $i)])
-   AC_CACHE_VAL([fptools_cv_end_of_data], [AC_DEFINE_UNQUOTED(DATA_SECTION_END_MARKER, $i)])
-   not_done=0
-   break
-  fi
-done
-if test "$not_done" = 1; then
-FPTOOLS_IN_SCOPE(end asm("end"),end,fptools_end_of_data);
-if test "$fptools_end_of_data" = yes; then
-  AC_CACHE_VAL([fptools_cv_end_of_data_decl], [AC_DEFINE_UNQUOTED(DATA_SECTION_END_MARKER_DECL, end asm("end"))])
-  AC_CACHE_VAL([fptools_cv_end_of_data], [AC_DEFINE_UNQUOTED(DATA_SECTION_END_MARKER, end)])
-else
-  AC_CACHE_VAL([fptools_cv_end_of_data_decl], [AC_DEFINE_UNQUOTED(DATA_SECTION_END_MARKER_DECL, dunno_what_it_is)])
-  AC_CACHE_VAL([fptools_cv_end_of_data], [AC_DEFINE_UNQUOTED(DATA_SECTION_END_MARKER, dunno_what_it_is)])
-fi
-fi
-AC_MSG_RESULT([$]fptools_cv_end_of_data)
-])
-
-
 
 dnl Based on AC_TRY_LINK - run iftrue if links cleanly with no warning
 
 
 dnl Based on AC_TRY_LINK - run iftrue if links cleanly with no warning
 
@@ -770,24 +809,6 @@ AC_DEFUN(FPTOOLS_CHECK_LIB_NOWARN,
 )])]
 )
 
 )])]
 )
 
-dnl check for prototypes
-dnl
-AC_DEFUN(AC_C_PROTOTYPES,
-[AC_CACHE_CHECK([prototypes], ac_cv_prototypes,
-[AC_TRY_COMPILE([
-void foo(int);
-void foo(i)
-int i; { 
-return;
-}
-],
-[int i;], 
-ac_cv_prototypes=yes,
-ac_cv_prototypes=no)])
-if test "$ac_cv_prototypes" = yes; then
-AC_DEFINE(HAVE_PROTOTYPES)
-fi
-])
 
 dnl ** Check which CATALOG file we have to use with DocBook SGML.
 dnl
 
 dnl ** Check which CATALOG file we have to use with DocBook SGML.
 dnl
@@ -818,13 +839,18 @@ Test.
 </Article>
 EOF
 fptools_cv_sgml_catalog=no
 </Article>
 EOF
 fptools_cv_sgml_catalog=no
-for fptools_catalog in $4; do
-  ac_try="$2 -t rtf -d $3#print -c $fptools_catalog conftest.sgml"
-  if AC_TRY_EVAL(ac_try); then
-    fptools_cv_sgml_catalog=[$]fptools_catalog
-    break
-  fi
-done
+if test -z "$SGML_CATALOG_FILES" ; then
+ for fptools_catalog in $4; do
+   ac_try="$2 -t rtf -d $3#print -c $fptools_catalog conftest.sgml"
+   if AC_TRY_EVAL(ac_try); then
+     fptools_cv_sgml_catalog=[$]fptools_catalog
+     break
+   fi
+ done
+else
+# If the env var SGML_CATALOG_FILES is defined, assume things are cool.
+  fptools_cv_sgml_catalog="yes"
+fi
 ])
 rm -rf conftest*
 if test $fptools_cv_sgml_catalog != "no"; then
 ])
 rm -rf conftest*
 if test $fptools_cv_sgml_catalog != "no"; then
@@ -898,7 +924,7 @@ AC_DEFUN(FPTOOLS_CHECK_LIBM,
 [AC_REQUIRE([AC_CANONICAL_HOST])dnl
 LIBM=
 case "$host" in
 [AC_REQUIRE([AC_CANONICAL_HOST])dnl
 LIBM=
 case "$host" in
-*-*-beos* | *-*-macosx*)
+*-*-beos*)
   # These system don't have libm
   ;;
 *-ncr-sysv4.3*)
   # These system don't have libm
   ;;
 *-ncr-sysv4.3*)
@@ -912,9 +938,7 @@ esac
 ])
 
 dnl ######################################################################
 ])
 
 dnl ######################################################################
-dnl NOTE: Because of portability issues between different autoconf
-dnl versions the AC_HELP_STRING macro has been removed from FPTOOLS_HAVE_OPENGL.
-dnl Furthermore, caching has been completely rewritten.
+dnl Note: Caching has been completely rewritten, but is still no perfect yet.
 dnl ######################################################################
 
 dnl ########################### -*- Mode: M4 -*- #######################
 dnl ######################################################################
 
 dnl ########################### -*- Mode: M4 -*- #######################
@@ -942,8 +966,8 @@ dnl ####################################################################
 dnl @synopsis FPTOOLS_HAVE_OPENGL
 dnl 
 dnl Search for OpenGL.  We search first for Mesa (a GPL'ed version of
 dnl @synopsis FPTOOLS_HAVE_OPENGL
 dnl 
 dnl Search for OpenGL.  We search first for Mesa (a GPL'ed version of
-dnl OpenGL) before a vendor's version of OpenGL, unless we were
-dnl specifically asked not to with `--with-Mesa=no' or `--without-Mesa'.
+dnl OpenGL) before a vendor's version of OpenGL if we were specifically
+dnl asked to with `--with-Mesa=yes' or `--with-Mesa'.
 dnl
 dnl The four "standard" OpenGL libraries are searched for: "-lGL",
 dnl "-lGLU", "-lGLX" (or "-lMesaGL", "-lMesaGLU" as the case may be) and
 dnl
 dnl The four "standard" OpenGL libraries are searched for: "-lGL",
 dnl "-lGLU", "-lGLX" (or "-lMesaGL", "-lMesaGLU" as the case may be) and
@@ -987,12 +1011,13 @@ AC_DEFUN(FPTOOLS_HAVE_OPENGL,
   AC_REQUIRE([AC_PATH_XTRA])
   AC_REQUIRE([FPTOOLS_CHECK_LIBM])
 
   AC_REQUIRE([AC_PATH_XTRA])
   AC_REQUIRE([FPTOOLS_CHECK_LIBM])
 
-dnl Check for Mesa first, unless we were asked not to.
-dnl    AC_HELP_STRING([--with-Mesa],
-dnl                   [Prefer the Mesa library over a vendors native OpenGL library (default=yes)],
-dnl                   with_Mesa_help_string)
-dnl    AC_ARG_ENABLE(Mesa, $with_Mesa_help_string, use_Mesa=$enableval, use_Mesa=yes)
-  AC_ARG_ENABLE(Mesa, [  --with-Mesa             Prefer the Mesa library over a vendors native OpenGL library (default=yes)], use_Mesa=$enableval, use_Mesa=yes)
+dnl Check for Mesa first if we were asked to.
+  AC_ARG_ENABLE(Mesa,
+[  --enable-mesa
+       Prefer Mesa over a vendor's native OpenGL library (default=no)
+],
+                use_Mesa=$enableval,
+                use_Mesa=no)
 
   if test x"$use_Mesa" = xyes; then
      GL_search_list="MesaGL  GL  opengl32"
 
   if test x"$use_Mesa" = xyes; then
      GL_search_list="MesaGL  GL  opengl32"
@@ -1008,11 +1033,12 @@ dnl    AC_ARG_ENABLE(Mesa, $with_Mesa_help_string, use_Mesa=$enableval, use_Mesa
   AC_LANG_C
 
 dnl If we are running under X11 then add in the appropriate libraries.
   AC_LANG_C
 
 dnl If we are running under X11 then add in the appropriate libraries.
-  if ! test x"$no_x" = xyes; then
+  if test x"$no_x" != xyes; then
 dnl Add everything we need to compile and link X programs to GL_CFLAGS
 dnl Add everything we need to compile and link X programs to GL_CFLAGS
-dnl and GL_X_LIBS.
-    GL_CFLAGS="$X_CFLAGS"
-    GL_X_LIBS="$X_PRE_LIBS $X_LIBS -lX11 -lXext -lXmu -lXt -lXi $X_EXTRA_LIBS $LIBM"
+dnl and GL_X_LIBS/GLUT_X_LIBS.
+    GL_CFLAGS="$CPPFLAGS $X_CFLAGS"
+    GL_X_LIBS="$X_LIBS $X_PRE_LIBS -lXext -lX11 $X_EXTRA_LIBS $LIBM"
+    GLUT_X_LIBS="$X_LIBS $X_PRE_LIBS -lXmu -lXt -lXi -lXext -lX11 $X_EXTRA_LIBS $LIBM"
   fi
   GL_save_CPPFLAGS="$CPPFLAGS"
   CPPFLAGS="$GL_CFLAGS"
   fi
   GL_save_CPPFLAGS="$CPPFLAGS"
   CPPFLAGS="$GL_CFLAGS"
@@ -1020,28 +1046,39 @@ dnl and GL_X_LIBS.
   GL_save_LIBS="$LIBS"
   LIBS="$GL_X_LIBS"
 
   GL_save_LIBS="$LIBS"
   LIBS="$GL_X_LIBS"
 
-  FPTOOLS_SEARCH_LIBS([#include <GL/gl.h>],   glEnd,           $GL_search_list,  have_GL=yes,   have_GL=no)
-  FPTOOLS_SEARCH_LIBS([#include <GL/glu.h>],  gluNewQuadric,   $GLU_search_list, have_GLU=yes,  have_GLU=no)
-  FPTOOLS_SEARCH_LIBS([#include <GL/glx.h>],  glXChooseVisual, $GLX_search_list, have_GLX=yes,  have_GLX=no)
-  FPTOOLS_SEARCH_LIBS([#include <GL/glut.h>], glutMainLoop,    glut glut32,      have_glut=yes, have_glut=no)
+  FPTOOLS_SEARCH_LIBS([#include <GL/gl.h>],   glEnd,         $GL_search_list,  have_GL=yes,   have_GL=no)
+  FPTOOLS_SEARCH_LIBS([#include <GL/glu.h>],  gluNewQuadric, $GLU_search_list, have_GLU=yes,  have_GLU=no)
+  FPTOOLS_SEARCH_LIBS([#include <GL/glx.h>],  glXWaitX,      $GLX_search_list, have_GLX=yes,  have_GLX=no)
 
   if test -n "$LIBS"; then
 
   if test -n "$LIBS"; then
-    GL_LIBS="$LIBS"
+    GL_LIBS="$LDFLAGS $LIBS"
   else
   else
-    GL_LIBS=
+    GL_LIBS="$LDFLAGS"
     GL_CFLAGS=
   fi
 
     GL_CFLAGS=
   fi
 
+  LIBS="$GLUT_X_LIBS"
+
+  FPTOOLS_SEARCH_LIBS([#include <GL/glut.h>], glutMainLoop,  glut32 glut,      have_glut=yes, have_glut=no)
+
+  if test -n "$LIBS"; then
+    GLUT_LIBS="$LDFLAGS $LIBS"
+  fi
+
   AC_CACHE_CHECK([OpenGL flags], mdl_cv_gl_cflags, [mdl_cv_gl_cflags="$GL_CFLAGS"])
   GL_CFLAGS="$mdl_cv_gl_cflags"
   AC_SUBST(GL_CFLAGS)
   AC_CACHE_CHECK([OpenGL libs],  mdl_cv_gl_libs,   [mdl_cv_gl_libs="$GL_LIBS"])
   GL_LIBS="$mdl_cv_gl_libs"
   AC_SUBST(GL_LIBS)
   AC_CACHE_CHECK([OpenGL flags], mdl_cv_gl_cflags, [mdl_cv_gl_cflags="$GL_CFLAGS"])
   GL_CFLAGS="$mdl_cv_gl_cflags"
   AC_SUBST(GL_CFLAGS)
   AC_CACHE_CHECK([OpenGL libs],  mdl_cv_gl_libs,   [mdl_cv_gl_libs="$GL_LIBS"])
   GL_LIBS="$mdl_cv_gl_libs"
   AC_SUBST(GL_LIBS)
+  AC_CACHE_CHECK([GLUT libs],  mdl_cv_glut_libs,   [mdl_cv_glut_libs="$GLUT_LIBS"])
+  GLUT_LIBS="$mdl_cv_glut_libs"
+  AC_SUBST(GLUT_LIBS)
 
 
-dnl Reset GL_X_LIBS regardless, since it was just a temporary variable
+dnl Reset GL_X_LIBS/GLUT_X_LIBS regardless, since they were just temporary variables
 dnl and we don't want to be global namespace polluters.
   GL_X_LIBS=
 dnl and we don't want to be global namespace polluters.
   GL_X_LIBS=
+  GLUT_X_LIBS=
 
   LIBS="$GL_save_LIBS"
   CPPFLAGS="$GL_save_CPPFLAGS"
 
   LIBS="$GL_save_LIBS"
   CPPFLAGS="$GL_save_CPPFLAGS"
@@ -1050,38 +1087,3 @@ dnl and we don't want to be global namespace polluters.
 ])
 
 # LocalWords:  fi
 ])
 
 # LocalWords:  fi
-
-dnl 
-dnl acspecific.m4's defn of AC_PROG_LEX is a bit too permissive, as it
-dnl defaults to 'lex' if 'flex' isn't found (without checking whether
-dnl 'lex' is actually present along the user's PATH).
-dnl
-AC_DEFUN(AC_PROG_LEX_STRICT,
-[AC_CHECK_PROG(LEX, flex, flex)
-if test -z "$LEX"
-then
-  AC_CHECK_PROG(LEX,lex,lex)
-  test -z "$LEX" && AC_MSG_ERROR(['lex' or 'flex' is required to compile GHC.])
-fi
-])
-
-dnl
-dnl Check to see whether CC (gcc) supports a particular option.
-dnl 
-AC_DEFUN(FPTOOLS_CC_FLAG,
-[
-AC_CACHE_CHECK([whether $CC accepts $1], [ac_cv_cc_$2],
-[save_CFLAGS="$CFLAGS"
- CFLAGS="$CFLAGS $1"
- AC_LANG_C
- AC_TRY_COMPILE(,[int main(){return(0);}],
-                 [ac_cv_cc_$2=yes],
-                [ac_cv_cc_$2=no])
- CFLAGS="$save_CFLAGS"
-])
-if test "$ac_cv_cc_$2"x = "yesx"; then
-  $2=$extra_flag;
-else
-  $2=$extra_flag;
-fi;
-])