Major refactoring of the type inference engine
[ghc-hetmet.git] / aclocal.m4
index 35ddbdb..f5ae279 100644 (file)
@@ -4,6 +4,68 @@
 # ensure we don't clash with any pre-supplied autoconf ones.
 
 
 # ensure we don't clash with any pre-supplied autoconf ones.
 
 
+# FPTOOLS_SET_C_LD_FLAGS
+# ----------------------------------
+# Set the C and LD flags for a given platform
+AC_DEFUN([FPTOOLS_SET_C_LD_FLAGS],
+[
+    AC_MSG_CHECKING([Setting up $2, $3 and $4])
+    case $$1 in
+    i386-apple-darwin)
+        # By default, gcc on OS X will generate SSE
+        # instructions, which need things 16-byte aligned,
+        # but we don't 16-byte align things. Thus drop
+        # back to generic i686 compatibility. Trac #2983.
+        $2="$$2 -march=i686 -m32"
+        $3="$$3 -march=i686 -m32"
+        $4="$$4 -march=i686 -m32"
+        ;;
+    x86_64-apple-darwin)
+        $2="$$2 -m64"
+        $3="$$3 -m64"
+        $4="$$4 -m64"
+        ;;
+    esac
+
+    case $$1 in
+    i386-apple-darwin|x86_64-apple-darwin)
+        # We support back to OS X 10.5
+        $2="$$2 -isysroot /Developer/SDKs/MacOSX10.5.sdk -mmacosx-version-min=10.5"
+        $3="$$3 -isysroot /Developer/SDKs/MacOSX10.5.sdk -mmacosx-version-min=10.5"
+        $4="$$4 -isysroot /Developer/SDKs/MacOSX10.5.sdk -mmacosx-version-min=10.5"
+        ;;
+    esac
+
+    # If gcc knows about the stack protector, turn it off.
+    # Otherwise the stack-smash handler gets triggered.
+    echo 'int main(void) {return 0;}' > conftest.c
+    if $CC -c conftest.c -fno-stack-protector > /dev/null 2>&1
+    then
+        $2="$$2 -fno-stack-protector"
+    fi
+    rm -f conftest.c conftest.o
+    AC_MSG_RESULT([done])
+])
+
+
+# FP_VISIBILITY_HIDDEN
+# ----------------------------------
+# Is the visibility hidden attribute supported?
+AC_DEFUN([FP_VISIBILITY_HIDDEN],
+[
+    AC_MSG_CHECKING([whether __attribute__((visibility("hidden"))) is supported])
+    echo '__attribute__((visibility("hidden"))) void foo(void) {}' > conftest.c
+    if $CC -Wall -Werror -c conftest.c > /dev/null 2>&1
+    then
+        AC_MSG_RESULT([yes])
+        AC_DEFINE(HAS_VISIBILITY_HIDDEN, 1, [Has visibility hidden])
+    else
+        AC_MSG_RESULT([no])
+    fi
+    rm -f conftest.c conftest.o
+])
+
+
 # FPTOOLS_FLOAT_WORD_ORDER_BIGENDIAN
 # ----------------------------------
 # Little endian Arm on Linux with some ABIs has big endian word order
 # FPTOOLS_FLOAT_WORD_ORDER_BIGENDIAN
 # ----------------------------------
 # Little endian Arm on Linux with some ABIs has big endian word order
@@ -44,6 +106,40 @@ AC_DEFUN([FP_EVAL_STDERR],
 ])# FP_EVAL_STDERR
 
 
 ])# FP_EVAL_STDERR
 
 
+# FP_ARG_WITH_PATH_GNU_PROG
+# --------------------
+# XXX
+#
+# $1 = the command to look for
+# $2 = the variable to set
+#
+AC_DEFUN([FP_ARG_WITH_PATH_GNU_PROG],
+[
+AC_ARG_WITH($2,
+[AC_HELP_STRING([--with-$2=ARG],
+        [Use ARG as the path to $2 [default=autodetect]])],
+[
+    if test "$HostOS" = "mingw32"
+    then
+        AC_MSG_WARN([Request to use $withval will be ignored])
+    else
+        $1=$withval
+    fi
+],
+[
+    if test "$HostOS" != "mingw32"
+    then
+        AC_PATH_PROG([$1], [$2])
+        if test -z "$$1"
+        then
+            AC_MSG_ERROR([cannot find $2 in your PATH, no idea how to link])
+        fi
+    fi
+]
+)
+]) # FP_ARG_WITH_PATH_GNU_PROG
+
+
 # FP_PROG_CONTEXT_DIFF
 # --------------------
 # Figure out how to do context diffs. Sets the output variable ContextDiffCmd.
 # FP_PROG_CONTEXT_DIFF
 # --------------------
 # Figure out how to do context diffs. Sets the output variable ContextDiffCmd.
@@ -89,7 +185,7 @@ AC_DEFUN([FP_COMPUTE_INT],
 # A variation of AC_CHECK_SIZEOF for computing the alignment restrictions of a
 # given type. Defines ALIGNMENT_TYPE.
 AC_DEFUN([FP_CHECK_ALIGNMENT],
 # 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], [],
+[AS_LITERAL_IF(m4_translit([[$1]], [*], [p]), [],
                [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_FATAL([$0: requires literal arguments])])[]dnl
 AC_CHECK_TYPE([$1], [], [], [$3])[]dnl
 m4_pushdef([fp_Cache], [AS_TR_SH([fp_cv_alignment_$1])])[]dnl
@@ -230,24 +326,24 @@ if test "x$HostPlatform"  = "xi386-unknown-mingw32" && \
    test "${HappyCmd}"    != ""
 then
     # Canonicalise to <drive>:/path/to/gcc
    test "${HappyCmd}"    != ""
 then
     # Canonicalise to <drive>:/path/to/gcc
-    HappyCmd=`cygpath -m ${HappyCmd}`
+    HappyCmd=`cygpath -m "${HappyCmd}"`
     AC_MSG_NOTICE([normalized happy command to $HappyCmd])
 fi
 
 AC_CACHE_CHECK([for version of happy], fptools_cv_happy_version,
 changequote(, )dnl
 [if test x"$HappyCmd" != x; then
     AC_MSG_NOTICE([normalized happy command to $HappyCmd])
 fi
 
 AC_CACHE_CHECK([for version of happy], fptools_cv_happy_version,
 changequote(, )dnl
 [if test x"$HappyCmd" != x; then
-   fptools_cv_happy_version="`$HappyCmd -v |
-                         grep 'Happy Version' | sed -e 's/Happy Version \([^ ]*\).*/\1/g'`" ;
+   fptools_cv_happy_version=`"$HappyCmd" -v |
+                         grep 'Happy Version' | sed -e 's/Happy Version \([^ ]*\).*/\1/g'` ;
 else
    fptools_cv_happy_version="";
 fi;
 changequote([, ])dnl
 ])
 else
    fptools_cv_happy_version="";
 fi;
 changequote([, ])dnl
 ])
-if test ! -f compiler/parser/Parser.hs || test ! -f compiler/main/ParsePkgConf.hs || test ! -f compiler/cmm/CmmParse.hs || test ! -f compiler/parser/ParserCore.hs
+if test ! -f compiler/parser/Parser.hs || test ! -f compiler/cmm/CmmParse.hs || test ! -f compiler/parser/ParserCore.hs
 then
 then
-    FP_COMPARE_VERSIONS([$fptools_cv_happy_version],[-lt],[1.15],
-      [AC_MSG_ERROR([Happy version 1.15 or later is required to compile GHC.])])[]dnl
+    FP_COMPARE_VERSIONS([$fptools_cv_happy_version],[-lt],[1.16],
+      [AC_MSG_ERROR([Happy version 1.16 or later is required to compile GHC.])])[]
 fi
 HappyVersion=$fptools_cv_happy_version;
 AC_SUBST(HappyVersion)
 fi
 HappyVersion=$fptools_cv_happy_version;
 AC_SUBST(HappyVersion)
@@ -266,14 +362,14 @@ if test "x$HostPlatform"  = "xi386-unknown-mingw32" && \
    test "${AlexCmd}"     != ""
 then
     # Canonicalise to <drive>:/path/to/gcc
    test "${AlexCmd}"     != ""
 then
     # Canonicalise to <drive>:/path/to/gcc
-    AlexCmd=`cygpath -m ${AlexCmd}`
+    AlexCmd=`cygpath -m "${AlexCmd}"`
 fi
 
 AC_CACHE_CHECK([for version of alex], fptools_cv_alex_version,
 changequote(, )dnl
 [if test x"$AlexCmd" != x; then
 fi
 
 AC_CACHE_CHECK([for version of alex], fptools_cv_alex_version,
 changequote(, )dnl
 [if 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'`" ;
+   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;
 else
    fptools_cv_alex_version="";
 fi;
@@ -282,92 +378,19 @@ changequote([, ])dnl
 if test ! -f compiler/cmm/CmmLex.hs || test ! -f compiler/parser/Lexer.hs
 then
     FP_COMPARE_VERSIONS([$fptools_cv_alex_version],[-lt],[2.1.0],
 if test ! -f compiler/cmm/CmmLex.hs || test ! -f compiler/parser/Lexer.hs
 then
     FP_COMPARE_VERSIONS([$fptools_cv_alex_version],[-lt],[2.1.0],
-      [AC_MSG_ERROR([Alex version 2.1.0 or later is required to compile GHC.])])[]dnl
+      [AC_MSG_ERROR([Alex version 2.1.0 or later is required to compile GHC.])])[]
 fi
 AlexVersion=$fptools_cv_alex_version;
 AC_SUBST(AlexVersion)
 ])
 
 
 fi
 AlexVersion=$fptools_cv_alex_version;
 AC_SUBST(AlexVersion)
 ])
 
 
-dnl
-dnl Check for windres and version.
-dnl 2.15.91 works
-dnl 2.17.50 doesn't work
-dnl 2.18.50 works
-dnl
-AC_DEFUN([FPTOOLS_WINDRES],
-[
-if test "x$HostPlatform"  = "xi386-unknown-mingw32"
-then
-    AC_PATH_PROG(WindResCmd,windres,)
-    # Alex is passed to Cabal, so we need a native path
-    if test "${OSTYPE}"      != "msys"                  && \
-       test "${WindResCmd}"  != ""
-    then
-        # Canonicalise to <drive>:/path/to/gcc
-        WindResCmd=`cygpath -m ${WindResCmd}`
-    fi
-
-    AC_CACHE_CHECK([for version of windres], fptools_cv_windres_version,
-    changequote(, )dnl
-    [
-        if test x"$WindResCmd" != x
-        then
-            fptools_cv_windres_version="`$WindResCmd --version |
-                         grep 'GNU windres' |
-              sed -e 's/GNU windres[^0-9]* \([0-9\.]*\).*/\1/g'`" ;
-        else
-            fptools_cv_windres_version="";
-        fi
-        changequote([, ])dnl
-    ])
-    FP_COMPARE_VERSIONS([$fptools_cv_windres_version],[-eq],[2.17.50],
-      [AC_MSG_ERROR([Your windres version isn't compatible with GHC. 2.15.91 and 2.18.50 are known to work.])])[]dnl
-    indResVersion=$fptools_cv_windres_version;
-    AC_SUBST(WindResVersion)
-fi
-])
-
-
-# FP_PROG_LD
-# ----------
-# Sets the output variable LdCmd to the (non-Cygwin version of the) full path
-# of ld. Exits if no ld can be found
-AC_DEFUN([FP_PROG_LD],
-[
-if test -z "$1"
-then
-  AC_PATH_PROG([fp_prog_ld_raw], [ld])
-  if test -z "$fp_prog_ld_raw"; then
-    AC_MSG_ERROR([cannot find ld in your PATH, no idea how to link])
-  fi
-  LdCmd=$fp_prog_ld_raw
-  case $HostPlatform in
-    *mingw32) if test x${OSTYPE} != xmsys; then
-             LdCmd="`cygpath -w ${fp_prog_ld_raw} | sed -e 's@\\\\@/@g'`"
-                AC_MSG_NOTICE([normalized ld command to $LdCmd])
-              fi
-           # Insist on >= ld-2.15.x, since earlier versions doesn't handle
-           # the generation of relocatable object files with large amounts
-           # of relocations correctly. (cf. HSbase.o splittage-hack)
-           fp_prog_ld_version=`${LdCmd} --version | sed -n '/GNU ld/p' | tr -cd 0-9 | cut -b1-3`
-           FP_COMPARE_VERSIONS([$fp_prog_ld_version],[-lt],[214],
-                                  [AC_MSG_ERROR([GNU ld version later than 2.14 required to compile GHC on Windows.])])[]dnl
-              ;;
-  esac
-else
-  LdCmd="$1"
-fi
-AC_SUBST([LdCmd])
-])# FP_PROG_LD
-
-
 # FP_PROG_LD_X
 # ------------
 # Sets the output variable LdXFlag to -x if ld supports this flag, otherwise the
 # variable's value is empty.
 AC_DEFUN([FP_PROG_LD_X],
 # FP_PROG_LD_X
 # ------------
 # Sets the output variable LdXFlag to -x if ld supports this flag, otherwise the
 # variable's value is empty.
 AC_DEFUN([FP_PROG_LD_X],
-[AC_REQUIRE([FP_PROG_LD])
+[
 AC_CACHE_CHECK([whether ld understands -x], [fp_cv_ld_x],
 [echo 'foo() {}' > conftest.c
 ${CC-cc} -c conftest.c
 AC_CACHE_CHECK([whether ld understands -x], [fp_cv_ld_x],
 [echo 'foo() {}' > conftest.c
 ${CC-cc} -c conftest.c
@@ -391,7 +414,7 @@ AC_SUBST([LdXFlag])
 # Sets the output variable LdIsGNULd to YES or NO, depending on whether it is
 # GNU ld or not.
 AC_DEFUN([FP_PROG_LD_IS_GNU],
 # Sets the output variable LdIsGNULd to YES or NO, depending on whether it is
 # GNU ld or not.
 AC_DEFUN([FP_PROG_LD_IS_GNU],
-[AC_REQUIRE([FP_PROG_LD])
+[
 AC_CACHE_CHECK([whether ld is GNU ld], [fp_cv_gnu_ld],
 [if ${LdCmd} --version 2> /dev/null | grep "GNU" > /dev/null 2>&1; then
   fp_cv_gnu_ld=yes
 AC_CACHE_CHECK([whether ld is GNU ld], [fp_cv_gnu_ld],
 [if ${LdCmd} --version 2> /dev/null | grep "GNU" > /dev/null 2>&1; then
   fp_cv_gnu_ld=yes
@@ -411,10 +434,10 @@ AC_DEFUN([FP_PROG_AR],
 if test -z "$fp_prog_ar_raw"; then
   AC_MSG_ERROR([cannot find ar in your PATH, no idea how to make a library])
 fi
 if test -z "$fp_prog_ar_raw"; then
   AC_MSG_ERROR([cannot find ar in your PATH, no idea how to make a library])
 fi
-fp_prog_ar=$fp_prog_ar_raw
+fp_prog_ar="$fp_prog_ar_raw"
 case $HostPlatform in
   *mingw32) if test x${OSTYPE} != xmsys; then
 case $HostPlatform in
   *mingw32) if test x${OSTYPE} != xmsys; then
-             fp_prog_ar="`cygpath -w ${fp_prog_ar_raw} | sed -e 's@\\\\@/@g'`"
+             fp_prog_ar="`cygpath -w "${fp_prog_ar_raw}" | sed -e 's@\\\\@/@g'`"
               AC_MSG_NOTICE([normalized ar command to $fp_prog_ar])
             fi
             ;;
               AC_MSG_NOTICE([normalized ar command to $fp_prog_ar])
             fi
             ;;
@@ -428,15 +451,42 @@ esac
 AC_DEFUN([FP_PROG_AR_IS_GNU],
 [AC_REQUIRE([FP_PROG_AR])
 AC_CACHE_CHECK([whether $fp_prog_ar_raw is GNU ar], [fp_cv_prog_ar_is_gnu],
 AC_DEFUN([FP_PROG_AR_IS_GNU],
 [AC_REQUIRE([FP_PROG_AR])
 AC_CACHE_CHECK([whether $fp_prog_ar_raw is GNU ar], [fp_cv_prog_ar_is_gnu],
-[if $fp_prog_ar_raw --version 2> /dev/null | grep "GNU" > /dev/null 2>&1; then
+[if "$fp_prog_ar_raw" --version 2> /dev/null | grep "GNU" > /dev/null 2>&1; then
   fp_cv_prog_ar_is_gnu=yes
 else
   fp_cv_prog_ar_is_gnu=no
 fi])
 fp_prog_ar_is_gnu=$fp_cv_prog_ar_is_gnu
   fp_cv_prog_ar_is_gnu=yes
 else
   fp_cv_prog_ar_is_gnu=no
 fi])
 fp_prog_ar_is_gnu=$fp_cv_prog_ar_is_gnu
+AC_SUBST([ArIsGNUAr], [`echo $fp_prog_ar_is_gnu | tr 'a-z' 'A-Z'`])
 ])# FP_PROG_AR_IS_GNU
 
 
 ])# FP_PROG_AR_IS_GNU
 
 
+# FP_PROG_AR_SUPPORTS_ATFILE
+# -----------------
+# Sets fp_prog_ar_supports_atfile to yes or no, depending on whether
+# or not it supports the @file syntax
+AC_DEFUN([FP_PROG_AR_SUPPORTS_ATFILE],
+[AC_REQUIRE([FP_PROG_AR])
+ AC_REQUIRE([FP_PROG_AR_ARGS])
+AC_CACHE_CHECK([whether $fp_prog_ar_raw supports @file], [fp_cv_prog_ar_supports_atfile],
+[
+rm -f conftest*
+touch conftest.file
+echo conftest.file  > conftest.atfile
+echo conftest.file >> conftest.atfile
+"$fp_prog_ar_raw" $fp_prog_ar_args conftest.a @conftest.atfile > /dev/null 2>&1
+fp_prog_ar_supports_atfile_tmp=`"$fp_prog_ar_raw" t conftest.a 2> /dev/null | grep -c conftest.file`
+rm -f conftest*
+if test "$fp_prog_ar_supports_atfile_tmp" -eq 2
+then
+  fp_cv_prog_ar_supports_atfile=yes
+else
+  fp_cv_prog_ar_supports_atfile=no
+fi])
+fp_prog_ar_supports_atfile=$fp_cv_prog_ar_supports_atfile
+AC_SUBST([ArSupportsAtFile], [`echo $fp_prog_ar_supports_atfile | tr 'a-z' 'A-Z'`])
+])# FP_PROG_AR_SUPPORTS_ATFILE
+
 # FP_PROG_AR_ARGS
 # ---------------
 # Sets fp_prog_ar_args to the arguments for ar and the output variable ArCmd
 # FP_PROG_AR_ARGS
 # ---------------
 # Sets fp_prog_ar_args to the arguments for ar and the output variable ArCmd
@@ -454,7 +504,7 @@ else
   touch conftest.dummy
   for fp_var in clqsZ clqs cqs clq cq ; do
      rm -f conftest.a
   touch conftest.dummy
   for fp_var in clqsZ clqs cqs clq cq ; do
      rm -f conftest.a
-     if $fp_prog_ar_raw $fp_var conftest.a conftest.dummy > /dev/null 2> /dev/null; then
+     if "$fp_prog_ar_raw" $fp_var conftest.a conftest.dummy > /dev/null 2> /dev/null; then
         fp_cv_prog_ar_args=$fp_var
         break
      fi
         fp_cv_prog_ar_args=$fp_var
         break
      fi
@@ -465,7 +515,8 @@ else
   fi
 fi])
 fp_prog_ar_args=$fp_cv_prog_ar_args
   fi
 fi])
 fp_prog_ar_args=$fp_cv_prog_ar_args
-AC_SUBST([ArCmd], ["$fp_prog_ar $fp_prog_ar_args"])
+AC_SUBST([ArCmd], ["$fp_prog_ar"])
+AC_SUBST([ArArgs], ["$fp_prog_ar_args"])
 
 ])# FP_PROG_AR_ARGS
 
 
 ])# FP_PROG_AR_ARGS
 
@@ -511,7 +562,7 @@ AC_CACHE_CHECK([whether $fp_prog_ar_raw supports -input], [fp_cv_prog_ar_support
 if test $fp_prog_ar_is_gnu = no; then
   rm -f conftest*
   touch conftest.lst
 if test $fp_prog_ar_is_gnu = no; then
   rm -f conftest*
   touch conftest.lst
-  if FP_EVAL_STDERR([$fp_prog_ar_raw $fp_prog_ar_args conftest.a -input conftest.lst]) >/dev/null; then
+  if FP_EVAL_STDERR(["$fp_prog_ar_raw" $fp_prog_ar_args conftest.a -input conftest.lst]) >/dev/null; then
     test -s conftest.err || fp_cv_prog_ar_supports_input=yes
   fi
   rm -f conftest*
     test -s conftest.err || fp_cv_prog_ar_supports_input=yes
   fi
   rm -f conftest*
@@ -558,36 +609,25 @@ fi
 if test "$fp_have_gcc" = "NO" -a -d $srcdir/ghc; then
   AC_MSG_ERROR([gcc is required])
 fi
 if test "$fp_have_gcc" = "NO" -a -d $srcdir/ghc; then
   AC_MSG_ERROR([gcc is required])
 fi
-AC_CACHE_CHECK([version of gcc], [fp_gcc_version],
+GccLT34=
+AC_CACHE_CHECK([version of gcc], [fp_cv_gcc_version],
 [if test "$fp_have_gcc" = "YES"; then
 [if test "$fp_have_gcc" = "YES"; then
-   fp_gcc_version="`$CC -v 2>&1 | grep 'version ' | sed -e 's/.*version [[^0-9]]*\([[0-9.]]*\).*/\1/g'`"
-   FP_COMPARE_VERSIONS([$fp_gcc_version], [-lt], [3.0],
+   fp_cv_gcc_version="`$CC -v 2>&1 | grep 'version ' | sed -e 's/.*version [[^0-9]]*\([[0-9.]]*\).*/\1/g'`"
+   FP_COMPARE_VERSIONS([$fp_cv_gcc_version], [-lt], [3.0],
      [AC_MSG_ERROR([Need at least gcc version 3.0 (3.4+ recommended)])])
    # See #2770: gcc 2.95 doesn't work any more, apparently.  There probably
    # isn't a very good reason for that, but for now just make configure
    # fail.
      [AC_MSG_ERROR([Need at least gcc version 3.0 (3.4+ recommended)])])
    # See #2770: gcc 2.95 doesn't work any more, apparently.  There probably
    # isn't a very good reason for that, but for now just make configure
    # fail.
+   FP_COMPARE_VERSIONS([$fp_cv_gcc_version], [-lt], [3.4], GccLT34=YES)
  else
  else
-   fp_gcc_version="not-installed"
+   fp_cv_gcc_version="not-installed"
  fi
 ])
 AC_SUBST([HaveGcc], [$fp_have_gcc])
  fi
 ])
 AC_SUBST([HaveGcc], [$fp_have_gcc])
-AC_SUBST([GccVersion], [$fp_gcc_version])
+AC_SUBST([GccVersion], [$fp_cv_gcc_version])
+AC_SUBST(GccLT34)
 ])# FP_HAVE_GCC
 
 ])# FP_HAVE_GCC
 
-AC_DEFUN([FP_MINGW_GCC],
-[
-  case $HostOS_CPP in
-    mingw*)  AC_MSG_CHECKING([whether $CC is a mingw gcc])
-            if $CC -v 2>&1 | grep mingw >/dev/null; then
-               AC_MSG_RESULT([yes])
-            else
-               AC_MSG_RESULT([no])
-               AC_MSG_ERROR([Please use --with-gcc to specify a mingw gcc])
-            fi;;
-    *) ;;      
-  esac
-])
-
 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
@@ -746,15 +786,29 @@ AS_VAR_POPDEF([fp_func])dnl
 
 # FP_GEN_DOCBOOK_XML
 # ------------------
 
 # FP_GEN_DOCBOOK_XML
 # ------------------
-# Generates a DocBook XML V4.2 document in conftest.xml.
+# Generates a DocBook XML V4.5 document in conftest.xml.
+#
+# It took a lot of experimentation to find a document that will cause
+# xsltproc to fail with an error code when the relevant
+# stylesheets/DTDs are not found.  I couldn't make xsltproc fail with
+# a single-file document, it seems a multi-file document is needed.
+# -- SDM 2009-06-03
+#
 AC_DEFUN([FP_GEN_DOCBOOK_XML],
 AC_DEFUN([FP_GEN_DOCBOOK_XML],
-[rm -f conftest.xml
+[rm -f conftest.xml conftest-book.xml
 cat > conftest.xml << EOF
 <?xml version="1.0" encoding="iso-8859-1"?>
 cat > conftest.xml << EOF
 <?xml version="1.0" encoding="iso-8859-1"?>
-<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
-   "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
+   "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [[
+<!ENTITY conftest-book SYSTEM "conftest-book.xml">
+]]>
 <book id="test">
 <book id="test">
-  <title>A DocBook Test Document</title>
+&conftest-book;
+</book>
+EOF
+cat >conftest-book.xml << EOF
+<?xml version="1.0" encoding="iso-8859-1"?>
+  <title>A DocBook &ldquo;Test Document&rdquo;</title>
   <chapter id="id-one">
     <title>A Chapter Title</title>
     <para>This is a paragraph, referencing <xref linkend="id-two"/>.</para>
   <chapter id="id-one">
     <title>A Chapter Title</title>
     <para>This is a paragraph, referencing <xref linkend="id-two"/>.</para>
@@ -763,7 +817,6 @@ cat > conftest.xml << EOF
     <title>Another Chapter Title</title>
     <para>This is another paragraph, referencing <xref linkend="id-one"/>.</para>
   </chapter>
     <title>Another Chapter Title</title>
     <para>This is another paragraph, referencing <xref linkend="id-one"/>.</para>
   </chapter>
-</book>
 EOF
 ]) # FP_GEN_DOCBOOK_XML
 
 EOF
 ]) # FP_GEN_DOCBOOK_XML
 
@@ -793,33 +846,28 @@ fi
 ])# FP_PROG_XSLTPROC
 
 
 ])# FP_PROG_XSLTPROC
 
 
-# FP_DIR_DOCBOOK_XSL(XSL-DIRS)
+# FP_DOCBOOK_XSL
 # ----------------------------
 # ----------------------------
-# Check which of the directories XSL-DIRS contains DocBook XSL stylesheets. The
-# output variable DIR_DOCBOOK_XSL will contain the first usable directory or
-# will be empty if none could be found.
-AC_DEFUN([FP_DIR_DOCBOOK_XSL],
+# Check that we can process a DocBook XML document to HTML using xsltproc.
+AC_DEFUN([FP_DOCBOOK_XSL],
 [AC_REQUIRE([FP_PROG_XSLTPROC])dnl
 if test -n "$XsltprocCmd"; then
 [AC_REQUIRE([FP_PROG_XSLTPROC])dnl
 if test -n "$XsltprocCmd"; then
-  AC_CACHE_CHECK([for DocBook XSL stylesheet directory], fp_cv_dir_docbook_xsl,
+  AC_CACHE_CHECK([for DocBook XSL stylesheet], fp_cv_dir_docbook_xsl,
   [FP_GEN_DOCBOOK_XML
   fp_cv_dir_docbook_xsl=no
   [FP_GEN_DOCBOOK_XML
   fp_cv_dir_docbook_xsl=no
-  for fp_var in $1; do
-     if $XsltprocCmd ${fp_var}/html/docbook.xsl conftest.xml > /dev/null 2>&1; then
-        fp_cv_dir_docbook_xsl=$fp_var
-        break
-     fi
-  done
+  if $XsltprocCmd --nonet http://docbook.sourceforge.net/release/xsl/current/html/chunk.xsl conftest.xml > /dev/null 2>&1; then
+     fp_cv_dir_docbook_xsl=yes
+  fi
   rm -rf conftest*])
 fi
 if test x"$fp_cv_dir_docbook_xsl" = xno; then
   AC_MSG_WARN([cannot find DocBook XSL stylesheets, you will not be able to build the documentation])
   rm -rf conftest*])
 fi
 if test x"$fp_cv_dir_docbook_xsl" = xno; then
   AC_MSG_WARN([cannot find DocBook XSL stylesheets, you will not be able to build the documentation])
-  DIR_DOCBOOK_XSL=
+  HAVE_DOCBOOK_XSL=NO
 else
 else
-  DIR_DOCBOOK_XSL=$fp_cv_dir_docbook_xsl
+  HAVE_DOCBOOK_XSL=YES
 fi
 fi
-AC_SUBST([DIR_DOCBOOK_XSL])
-])# FP_DIR_DOCBOOK_XSL
+AC_SUBST([HAVE_DOCBOOK_XSL])
+])# FP_DOCBOOK_XSL
 
 
 # FP_PROG_XMLLINT
 
 
 # FP_PROG_XMLLINT
@@ -841,11 +889,11 @@ AC_DEFUN([FP_CHECK_DOCBOOK_DTD],
 if test -n "$XmllintCmd"; then
   AC_MSG_CHECKING([for DocBook DTD])
   FP_GEN_DOCBOOK_XML
 if test -n "$XmllintCmd"; then
   AC_MSG_CHECKING([for DocBook DTD])
   FP_GEN_DOCBOOK_XML
-  if $XmllintCmd --valid --noout conftest.xml > /dev/null 2>&1; then
+  if $XmllintCmd --nonet --valid --noout conftest.xml ; then
     AC_MSG_RESULT([ok])
   else
     AC_MSG_RESULT([failed])
     AC_MSG_RESULT([ok])
   else
     AC_MSG_RESULT([failed])
-    AC_MSG_WARN([cannot find a DTD for DocBook XML V4.2, you will not be able to validate your documentation])
+    AC_MSG_WARN([cannot find a DTD for DocBook XML V4.5, you will not be able to validate your documentation])
     AC_MSG_WARN([check your XML_CATALOG_FILES environment variable and/or /etc/xml/catalog])
   fi
   rm -rf conftest*
     AC_MSG_WARN([check your XML_CATALOG_FILES environment variable and/or /etc/xml/catalog])
   fi
   rm -rf conftest*
@@ -921,24 +969,24 @@ fi
 # FP_PROG_GHC_PKG
 # ----------------
 # Try to find a ghc-pkg matching the ghc mentioned in the environment variable
 # FP_PROG_GHC_PKG
 # ----------------
 # Try to find a ghc-pkg matching the ghc mentioned in the environment variable
-# WithGhc. If the latter is unset or no matching ghc-pkg can be found, try to
-# find a plain ghc-pkg. Sets the output variable GhcPkgCmd.
+# WithGhc. Sets the output variable GhcPkgCmd.
 AC_DEFUN([FP_PROG_GHC_PKG],
 [AC_CACHE_CHECK([for ghc-pkg matching $WithGhc], fp_cv_matching_ghc_pkg,
 AC_DEFUN([FP_PROG_GHC_PKG],
 [AC_CACHE_CHECK([for ghc-pkg matching $WithGhc], fp_cv_matching_ghc_pkg,
-[fp_ghc_pkg_guess=`echo $WithGhc | sed 's,ghc\(@<:@^/\\@:>@*\)$,ghc-pkg\1,'`
-if "$fp_ghc_pkg_guess" -l > /dev/null 2>&1; then
-  fp_cv_matching_ghc_pkg=$fp_ghc_pkg_guess
-elif "$fp_ghc_pkg_guess" list > /dev/null 2>&1; then
-  # from 6.10, ghc-pkg doesn't support the old -l syntax any more
+[
+# If we are told to use ghc-stage2, then we're using an in-tree
+# compiler. In this case, we just want ghc-pkg, not ghc-pkg-stage2,
+# so we sed off -stage[0-9]$. However, if we are told to use
+# ghc-6.12.1 then we want to use ghc-pkg-6.12.1, so we keep any
+# other suffix.
+fp_ghc_pkg_guess=`echo $WithGhc | sed -e 's/-stage@<:@0-9@:>@$//' -e 's,ghc\(@<:@^/\\@:>@*\)$,ghc-pkg\1,'`
+if "$fp_ghc_pkg_guess" list > /dev/null 2>&1; then
   fp_cv_matching_ghc_pkg=$fp_ghc_pkg_guess
 else
   fp_cv_matching_ghc_pkg=$fp_ghc_pkg_guess
 else
-  fp_cv_matching_ghc_pkg=no
+  AC_MSG_ERROR([Cannot find matching ghc-pkg])
 fi])
 fi])
-if test x"$fp_cv_matching_ghc_pkg" = xno; then
-  AC_PATH_PROG([GhcPkgCmd], [ghc-pkg])
-else
-  GhcPkgCmd=$fp_cv_matching_ghc_pkg
-fi])# FP_PROG_GHC_PKG
+GhcPkgCmd=$fp_cv_matching_ghc_pkg
+AC_SUBST([GhcPkgCmd])
+])# FP_PROG_GHC_PKG
 
 
 # FP_GCC_EXTRA_FLAGS
 
 
 # FP_GCC_EXTRA_FLAGS
@@ -962,23 +1010,23 @@ AC_DEFUN([FP_GCC_EXTRA_FLAGS],
 [AC_REQUIRE([FP_HAVE_GCC])
 AC_CACHE_CHECK([for extra options to pass gcc when compiling via C], [fp_cv_gcc_extra_opts],
 [fp_cv_gcc_extra_opts=
 [AC_REQUIRE([FP_HAVE_GCC])
 AC_CACHE_CHECK([for extra options to pass gcc when compiling via C], [fp_cv_gcc_extra_opts],
 [fp_cv_gcc_extra_opts=
- FP_COMPARE_VERSIONS([$fp_gcc_version], [-ge], [3.4],
+ FP_COMPARE_VERSIONS([$fp_cv_gcc_version], [-ge], [3.4],
   [fp_cv_gcc_extra_opts="$fp_cv_gcc_extra_opts -fwrapv"],
   [])
  case $TargetPlatform in
   i386-*|x86_64-*) 
   [fp_cv_gcc_extra_opts="$fp_cv_gcc_extra_opts -fwrapv"],
   [])
  case $TargetPlatform in
   i386-*|x86_64-*) 
-     FP_COMPARE_VERSIONS([$fp_gcc_version], [-ge], [3.2],
+     FP_COMPARE_VERSIONS([$fp_cv_gcc_version], [-ge], [3.2],
       [fp_cv_gcc_extra_opts="$fp_cv_gcc_extra_opts -mno-omit-leaf-frame-pointer"],
       [])
       [fp_cv_gcc_extra_opts="$fp_cv_gcc_extra_opts -mno-omit-leaf-frame-pointer"],
       [])
-    FP_COMPARE_VERSIONS([$fp_gcc_version], [-ge], [3.4],
-     [FP_COMPARE_VERSIONS([$fp_gcc_version], [-ge], [4.2],
+    FP_COMPARE_VERSIONS([$fp_cv_gcc_version], [-ge], [3.4],
+     [FP_COMPARE_VERSIONS([$fp_cv_gcc_version], [-ge], [4.2],
        [fp_cv_gcc_extra_opts="$fp_cv_gcc_extra_opts -fno-toplevel-reorder"],
        [fp_cv_gcc_extra_opts="$fp_cv_gcc_extra_opts -fno-unit-at-a-time"]
      )],
      [])
   ;;
   sparc-*-solaris2) 
        [fp_cv_gcc_extra_opts="$fp_cv_gcc_extra_opts -fno-toplevel-reorder"],
        [fp_cv_gcc_extra_opts="$fp_cv_gcc_extra_opts -fno-unit-at-a-time"]
      )],
      [])
   ;;
   sparc-*-solaris2) 
-    FP_COMPARE_VERSIONS([$fp_gcc_version], [-ge], [4.2],
+    FP_COMPARE_VERSIONS([$fp_cv_gcc_version], [-ge], [4.2],
       [fp_cv_gcc_extra_opts="$fp_cv_gcc_extra_opts -fno-toplevel-reorder"],
       [])
   ;;
       [fp_cv_gcc_extra_opts="$fp_cv_gcc_extra_opts -fno-toplevel-reorder"],
       [])
   ;;
@@ -1009,7 +1057,7 @@ if test "$RELEASE" = "NO"; then
     elif test -d _darcs; then
         # TODO: Remove this branch after conversion to Git
         changequote(, )dnl
     elif test -d _darcs; then
         # TODO: Remove this branch after conversion to Git
         changequote(, )dnl
-        ver_date=`darcs changes --quiet --no-summary --xml | head -500 | grep 'date=' | sed "s/^.*date='\([0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]\).*$/\1/g" | sort -n | tail -1`
+        ver_date=`darcs changes --quiet --no-summary --xml | head -500 | grep 'date=' | sed "s/^.*date='\([0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]\).*$/\1/g" | ${SortCmd} -n | tail -1`
         if echo $ver_date | grep '^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$' 2>&1 >/dev/null; then true; else
         changequote([, ])dnl
                 AC_MSG_ERROR([failed to detect version date: check that darcs is in your path])
         if echo $ver_date | grep '^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$' 2>&1 >/dev/null; then true; else
         changequote([, ])dnl
                 AC_MSG_ERROR([failed to detect version date: check that darcs is in your path])
@@ -1182,27 +1230,53 @@ case $fptools_cv_timer_create_works in
 esac
 ])
 
 esac
 ])
 
-# FP_ARG_GMP
+# FP_ICONV
 # -------------
 # -------------
-AC_DEFUN([FP_ARG_GMP],
+AC_DEFUN([FP_ICONV],
 [
 [
-AC_ARG_WITH([gmp-includes],
-  [AC_HELP_STRING([--with-gmp-includes],
-    [directory containing gmp.h])],
-    [gmp_includes=$withval],
-    [gmp_includes=NONE])
-
-AC_ARG_WITH([gmp-libraries],
-  [AC_HELP_STRING([--with-gmp-libraries],
-    [directory containing gmp library])],
-    [gmp_libraries=$withval],
-    [gmp_libraries=NONE])
-])# FP_ARG_GMP
-
-AC_DEFUN([CHECK_GMP],
-[AC_REQUIRE([AC_PROG_CPP])
-AC_REQUIRE([AC_PROG_CC])
-])
+  dnl--------------------------------------------------------------------
+  dnl * Deal with arguments telling us iconv is somewhere odd
+  dnl--------------------------------------------------------------------
+
+  dnl Note: ICONV_LIB_DIRS and ICONV_INCLUDE_DIRS are not predefined
+  dnl to the empty string to allow them to be overridden from the
+  dnl environment.
+
+  AC_ARG_WITH([iconv-includes],
+    [AC_HELP_STRING([--with-iconv-includes],
+      [directory containing iconv.h])],
+      [ICONV_INCLUDE_DIRS=$withval])
+
+  AC_ARG_WITH([iconv-libraries],
+    [AC_HELP_STRING([--with-iconv-libraries],
+      [directory containing iconv library])],
+      [ICONV_LIB_DIRS=$withval])
+
+  AC_SUBST(ICONV_INCLUDE_DIRS)
+  AC_SUBST(ICONV_LIB_DIRS)
+])# FP_ICONV
+
+# FP_GMP
+# -------------
+AC_DEFUN([FP_GMP],
+[
+  dnl--------------------------------------------------------------------
+  dnl * Deal with arguments telling us gmp is somewhere odd
+  dnl--------------------------------------------------------------------
+
+  AC_ARG_WITH([gmp-includes],
+    [AC_HELP_STRING([--with-gmp-includes],
+      [directory containing gmp.h])],
+      [GMP_INCLUDE_DIRS=$withval])
+
+  AC_ARG_WITH([gmp-libraries],
+    [AC_HELP_STRING([--with-gmp-libraries],
+      [directory containing gmp library])],
+      [GMP_LIB_DIRS=$withval])
+
+  AC_SUBST(GMP_INCLUDE_DIRS)
+  AC_SUBST(GMP_LIB_DIRS)
+])# FP_GMP
 
 # FP_CHECK_MACOSX_DEPLOYMENT_TARGET
 # ---------------------------------
 
 # FP_CHECK_MACOSX_DEPLOYMENT_TARGET
 # ---------------------------------
 # Calculate absolute path to build tree
 # --------------------------------------------------------------
 
 # Calculate absolute path to build tree
 # --------------------------------------------------------------
 
+AC_DEFUN([FP_INTREE_GHC_PWD],[
+AC_MSG_NOTICE(Building in-tree ghc-pwd)
+    dnl This would be
+    dnl     make -C utils/ghc-pwd clean && make -C utils/ghc-pwd
+    dnl except we don't want to have to know what make is called. Sigh.
+    rm -rf utils/ghc-pwd/dist-boot
+    mkdir  utils/ghc-pwd/dist-boot
+    if ! "$WithGhc" -v0 -no-user-package-conf -hidir utils/ghc-pwd/dist-boot -odir utils/ghc-pwd/dist-boot -stubdir utils/ghc-pwd/dist-boot --make utils/ghc-pwd/Main.hs -o utils/ghc-pwd/dist-boot/ghc-pwd
+    then
+        AC_MSG_ERROR([Building ghc-pwd failed])
+    fi
+
+    GHC_PWD=utils/ghc-pwd/dist-boot/ghc-pwd
+])
+
+AC_DEFUN([FP_BINDIST_GHC_PWD],[
+    GHC_PWD=utils/ghc-pwd/dist/build/tmp/ghc-pwd
+])
+
 AC_DEFUN([FP_FIND_ROOT],[
 AC_MSG_CHECKING(for path to top of build tree)
 AC_DEFUN([FP_FIND_ROOT],[
 AC_MSG_CHECKING(for path to top of build tree)
+    hardtop=`$GHC_PWD`
 
 
-dnl This would be
-dnl     make -C utils/ghc-pwd clean && make -C utils/ghc-pwd
-dnl except we don't want to have to know what make is called. Sigh.
-if test ! -f utils/ghc-pwd/ghc-pwd && test ! -f utils/ghc-pwd/ghc-pwd.exe; then
-  cd utils/ghc-pwd
-  rm -f *.o
-  rm -f *.hi
-  rm -f ghc-pwd
-  rm -f ghc-pwd.exe
-  $WithGhc -v0 --make ghc-pwd -o ghc-pwd
-  cd ../..
-fi
+    dnl Remove common automounter nonsense
+    hardtop=`echo $hardtop | sed 's|^/tmp_mnt.*\(/local/.*\)$|\1|' | sed 's|^/tmp_mnt/|/|'`
 
 
-hardtop=`utils/ghc-pwd/ghc-pwd`
+    if ! test -d "$hardtop"; then
+        AC_MSG_ERROR([cannot determine current directory])
+    fi
 
 
-if ! test -d "$hardtop"; then
-  AC_MSG_ERROR([cannot determine current directory])
-fi   
+    dnl We don't support building in directories with spaces.
+    case "$hardtop" in
+    *' '*)
+        AC_MSG_ERROR([
+        The build system does not support building in a directory
+        containing space characters.
+        Suggestion: move the build tree somewhere else.])
+        ;;
+    esac
 
 
-dnl Remove common automounter nonsense
-dnl
-hardtop=`echo $hardtop | sed 's|^/tmp_mnt.*\(/local/.*\)$|\1|' | sed 's|^/tmp_mnt/|/|'`
+    AC_SUBST(hardtop)
+
+    AC_MSG_RESULT($hardtop)
+])
 
 
-AC_SUBST(hardtop)
+# GHC_CONVERT_CPU(cpu, target_var)
+# --------------------------------
+# converts cpu from gnu to ghc naming, and assigns the result to $target_var
+AC_DEFUN([GHC_CONVERT_CPU],[
+case "$1" in
+  alpha*)
+    $2="alpha"
+    ;;
+  arm*)
+    $2="arm"
+    ;;
+  hppa1.1*)
+    $2="hppa1_1"
+    ;;
+  hppa*)
+    $2="hppa"
+    ;;
+  i386)
+    $2="i386"
+    ;;
+  ia64)
+    $2="ia64"
+    ;;
+  m68k*)
+    $2="m68k"
+    ;;
+  mipseb*)
+    $2="mipseb"
+    ;;
+  mipsel*)
+    $2="mipsel"
+    ;;
+  mips*)
+    $2="mips"
+    ;;
+  powerpc64*)
+    $2="powerpc64"
+    ;;
+  powerpc*)
+    $2="powerpc"
+    ;;
+  rs6000)
+    $2="rs6000"
+    ;;
+  s390*)
+    $2="s390"
+    ;;
+  sparc64*)
+    $2="sparc64"
+    ;;
+  sparc*)
+    $2="sparc"
+    ;;
+  vax)
+    $2="vax"
+    ;;
+  x86_64)
+    $2="x86_64"
+    ;;
+  *)
+    echo "Unknown CPU $1"
+    exit 1
+    ;;
+  esac
+])
 
 
-AC_MSG_RESULT(${hardtop})
+# GHC_CONVERT_VENDOR(vendor, target_var)
+# --------------------------------
+# converts vendor from gnu to ghc naming, and assigns the result to $target_var
+AC_DEFUN([GHC_CONVERT_VENDOR],[
+$2="$1"
+])
 
 
-# We don't support building in directories with spaces.
-case "$hardtop" in
-  *' '*) AC_MSG_ERROR([
-   The build system does not support building in a directory containing
-   space characters.  Suggestion: move the build tree somewhere else.])
- ;;
-esac
+# GHC_CONVERT_OS(os, target_var)
+# --------------------------------
+# converts os from gnu to ghc naming, and assigns the result to $target_var
+AC_DEFUN([GHC_CONVERT_OS],[
+case "$1" in
+  linux-*|linux)
+    $2="linux"
+    ;;
+  # As far as I'm aware, none of these have relevant variants
+  freebsd|netbsd|openbsd|dragonfly|osf1|osf3|hpux|linuxaout|kfreebsdgnu|freebsd2|solaris2|cygwin32|mingw32|darwin|gnu|nextstep2|nextstep3|sunos4|ultrix|irix|aix|haiku)
+    $2="$1"
+    ;;
+  *)
+    echo "Unknown OS $1"
+    exit 1
+    ;;
+  esac
+])
+
+# LIBRARY_VERSION(lib)
+# --------------------------------
+# Gets the version number of a library.
+# If $1 is ghc-prim, then we define LIBRARY_ghc_prim_VERSION as 1.2.3
+AC_DEFUN([LIBRARY_VERSION],[
+LIBRARY_[]translit([$1], [-], [_])[]_VERSION=`grep -i "^version:" libraries/$1/$1.cabal | sed "s/.* //"`
+AC_SUBST(LIBRARY_[]translit([$1], [-], [_])[]_VERSION)
 ])
 
 # LocalWords:  fi
 ])
 
 # LocalWords:  fi