[project @ 2003-07-24 15:12:35 by simonmar]
[ghc-hetmet.git] / configure.in
index b7ff483..e19c938 100644 (file)
@@ -16,6 +16,9 @@ dnl
 # First off, a distrib sanity check..
 AC_INIT(mk/config.mk.in)
 
+dnl * We require autoconf version 2.53 due to the use of AC_SYS_LARGEFILE
+AC_PREREQ(2.52)
+
 dnl * Declare subdirectories that have a private configure script
 dnl
 dnl After the toplevel configuration is complete, the script will recurse into
@@ -35,17 +38,6 @@ if test x"$srcdir" != 'x.' ; then
     exit 1
 fi
 
-#
-# Remove common automounter nonsense + convert from UNC to DOS style paths
-# (UNC awareness isn't quite there yet for cygwin32-beta18 and consituent tools.)
-#
-hardtop=`pwd`
-hardtop=`echo $hardtop | sed 's|^/tmp_mnt.*\(/local/.*\)$|\1|' | sed 's|^/tmp_mnt/|/|' | sed 's|^/grasp_tmp|/local/grasp_tmp|' | sed 's|^//\(.\)/|\1:/|' `
-
-echo ''
-echo "*** The top of your build tree is: $hardtop"
-AC_SUBST(hardtop)
-
 dnl--------------------------------------------------------------------
 dnl * Choose host(/target/build) platform
 dnl--------------------------------------------------------------------
@@ -75,7 +67,7 @@ exeext=''
 # We also record the architecture, vendor, and operating system (OS)
 # separately.
 case $HostPlatform in
-alpha-dec-osf[[12]]*)
+alpha*-dec-osf[[12]]*)
        HostPlatform=alpha-dec-osf1   # canonicalise for our purposes
        TargetPlatform=alpha-dec-osf1 # this will work for now... (hack)
        BuildPlatform=alpha-dec-osf1  # hack
@@ -84,7 +76,7 @@ alpha-dec-osf[[12]]*)
         HostVendor_CPP='dec'
         HostOS_CPP='osf1'
         ;;
-alpha-dec-osf[[34]]*)
+alpha*-dec-osf[[345]]*)
        HostPlatform=alpha-dec-osf3   # canonicalise for our purposes
        TargetPlatform=alpha-dec-osf3 # this will work for now... (hack)
        BuildPlatform=alpha-dec-osf3  # hack
@@ -93,7 +85,7 @@ alpha-dec-osf[[34]]*)
         HostVendor_CPP='dec'
         HostOS_CPP='osf3'
         ;;
-alpha-unknown-linux)
+alpha*-unknown-linux*)
        HostPlatform=alpha-unknown-linux
        TargetPlatform=alpha-unknown-linux
        BuildPlatform=alpha-unknown-linux
@@ -102,7 +94,7 @@ alpha-unknown-linux)
         HostVendor_CPP='unknown'
         HostOS_CPP='linux'
         ;;
-alpha-unknown-freebsd*)
+alpha*-unknown-freebsd*)
        HostPlatform=alpha-unknown-freebsd
        TargetPlatform=alpha-unknown-freebsd
        BuildPlatform=alpha-unknown-freebsd
@@ -203,6 +195,15 @@ i[[3456]]86-*-mingw32*)
         HostOS_CPP='mingw32'
        exeext='.exe'
         ;;
+ia64-*-linux*)
+        HostPlatform=ia64-unknown-linux # hack again
+        TargetPlatform=ia64-unknown-linux
+        BuildPlatform=ia64-unknown-linux
+        HostPlatform_CPP='ia64_unknown_linux'
+        HostArch_CPP='ia64'
+        HostVendor_CPP='unknown'
+        HostOS_CPP='linux'
+        ;;
 m68k-next-nextstep2)
         HostPlatform_CPP='m68k_next_nextstep2'
         HostArch_CPP='m68k'
@@ -224,6 +225,24 @@ i[[3456]]86-next-nextstep3)
         HostVendor_CPP='next'
         HostOS_CPP='nextstep3'
         ;;
+m68k-*-openbsd*)
+       HostPlatform=m68k-unknown-openbsd
+       TargetPlatform=m68k-unknown-openbsd
+       BuildPlatform=m68k-unknown-openbsd
+        HostPlatform_CPP='m68k_unknown_openbsd'
+        HostArch_CPP='m68k'
+        HostVendor_CPP='unknown'
+        HostOS_CPP='openbsd'
+        ;;
+m68k-apple-netbsd*)
+       HostPlatform=m68k-apple-netbsd
+       TargetPlatform=m68k-apple-netbsd
+       BuildPlatform=m68k-apple-netbsd
+        HostPlatform_CPP='m68k_apple_netbsd'
+        HostArch_CPP='m68k'
+        HostVendor_CPP='apple'
+        HostOS_CPP='netbsd'
+        ;;
 m68k-sun-sunos4*)
        HostPlatform=m68k-sun-sunos4
        TargetPlatform=m68k-sun-sunos4 #hack
@@ -266,15 +285,15 @@ powerpc-ibm-aix*)
         HostVendor_CPP='ibm'
         HostOS_CPP='aix'
         ;;
-powerpc-apple-macosx*)
-      HostPlatform=powerpc-apple-macosx
-      TargetPlatform=powerpc-apple-macosx #hack
-      BuildPlatform=powerpc-apple-macosx #hack
-        HostPlatform_CPP='powerpc_apple_macosx'
-        HostArch_CPP='powerpc'
-        HostVendor_CPP='apple'
-        HostOS_CPP='macosx'
-        ;;
+powerpc-apple-darwin*)
+       HostPlatform=powerpc-apple-darwin
+       TargetPlatform=powerpc-apple-darwin #hack
+       BuildPlatform=powerpc-apple-darwin #hack
+       HostPlatform_CPP='powerpc_apple_darwin'
+       HostArch_CPP='powerpc'
+       HostVendor_CPP='apple'
+       HostOS_CPP='darwin'
+       ;;
 sparc-sun-sunos4*)
        HostPlatform=sparc-sun-sunos4
        TargetPlatform=sparc-sun-sunos4 #hack
@@ -337,6 +356,36 @@ dnl AC_SUBST(TargetVendor_CPP)
 AC_SUBST(exeext)
 
 dnl --------------------------------------------------------------
+dnl * Calculate absolute path to build tree
+dnl --------------------------------------------------------------
+
+AC_MSG_CHECKING(for path to top of build tree)
+
+hardtop=`pwd`
+
+dnl Remove common automounter nonsense
+dnl
+hardtop=`echo $hardtop | sed 's|^/tmp_mnt.*\(/local/.*\)$|\1|' | sed 's|^/tmp_mnt/|/|' | sed 's|^//\(.\)/|\1:/|' `
+
+dnl Find 'hardtop_plat', the native format for 'hardtop' (i.e., right kind of \dnl slashes on a Win32 box, but with b-slashes being escaped).
+dnl
+case $HostPlatform in
+  i386-unknown-mingw32 | i386-unknown-cygwin32)
+       # convert $hardtop to a path that mingw will understand too
+       cyghardtop=${hardtop}
+       hardtop=`cygpath -w ${cyghardtop} | sed -e 's@\\\\@/@g'`
+       hardtop_plat=`cygpath -w ${cyghardtop} | sed -e 's@\\\\@\\\\\\\\@g'`
+       ;;
+  *)
+       hardtop_plat=${hardtop}
+       ;;
+esac
+AC_SUBST(hardtop)
+AC_SUBST(hardtop_plat)
+
+AC_MSG_RESULT(${hardtop})
+
+dnl --------------------------------------------------------------
 dnl * Project specific configuration options
 dnl --------------------------------------------------------------
 dnl What follows is a bunch of options that can either be configured
@@ -346,17 +395,19 @@ dnl use either is considered a Feature.
 
 dnl ** What command to use to compile compiler sources ?
 dnl --------------------------------------------------------------
-if test "$GHC" = ""; then
-  AC_PATH_PROG(GHC,ghc)
-fi
 
 AC_ARG_WITH(ghc,
 [  --with-ghc=<haskell compiler>
         Use a command different from 'ghc' to compile GHC-specific Haskell code
            (including GHC itself).
 ],
-[WithGhc="$withval"],
-[WithGhc=$GHC]
+[ WithGhc="$withval" ],
+[ 
+  if test "$GHC" = ""; then
+    AC_PATH_PROG(GHC,ghc)
+  fi
+  WithGhc=$GHC
+]
 )
 AC_SUBST(WithGhc)
 
@@ -387,6 +438,10 @@ AC_ARG_WITH(gcc,
         Use a different command instead of 'gcc' for the GNU C compiler.
 ],
 [WhatGccIsCalled="$withval"
+ if test "x$HostPlatform" = "xi386-unknown-mingw32"; then
+    # Canonicalise to <drive>:/path/to/gcc
+    withval=`cygpath -w ${withval} | sed -e 's@\\\\@/@g' `
+ fi;
  CC="$withval"],
 [WhatGccIsCalled="gcc"]
 )
@@ -404,6 +459,40 @@ AC_ARG_ENABLE(hc-boot,
 )
 AC_SUBST(BootingFromHc)
 
+dnl ** Booting from unregisterised .hc files?
+dnl --------------------------------------------------------------
+AC_ARG_ENABLE(hc-boot-unregisterised,
+[  --enable-hc-boot-unregisterised
+        With --enable-hc-boot, treat the intermediate .hc files as
+        unregisterised rather than registerised code.
+        (This option is mostly of interest to porters.)
+],
+[BootingFromUnregisterisedHc=YES],
+[BootingFromUnregisterisedHc=NO]
+)
+AC_SUBST(BootingFromUnregisterisedHc)
+
+if test "$BootingFromHc" = "NO"; then
+if test "$BootingFromUnregisterisedHc" = "YES"; then
+AC_MSG_ERROR([--enable-hc-boot-unregisterised requires --enable-hc-boot.])
+fi;
+fi;
+
+dnl ** Must have GHC to build GHC, unless --enable-hc-boot is on
+if test "$BootingFromHc" = "NO" -a "$WithGhc" = "" -a -d "$srcdir/ghc"; then
+AC_MSG_ERROR([GHC is required unless bootstrapping from .hc files.])
+fi;
+
+dnl ** Enable multi-thread friendly RTS?
+dnl --------------------------------------------------------------
+AC_ARG_ENABLE(threaded-rts,
+[  --enable-threaded-rts
+        Support better interop with OS threads.
+],
+[ThreadedRts=YES],
+[ThreadedRts=NO]
+)
+AC_SUBST(ThreadedRts)
 
 dnl ** Enable the construction of Win32 DLLs?
 dnl --------------------------------------------------------------
@@ -429,51 +518,38 @@ if test x"$EnableWin32DLLs" = "xYES" ; then
  AC_DEFINE(HAVE_WIN32_DLL_SUPPORT)
 fi
 
-dnl ** Building a Win32-friendlier compiler?
+dnl ** Enable the building of the ObjectIO?
 dnl --------------------------------------------------------------
-AC_ARG_ENABLE(minimal-unix-deps,
-[  --enable-minimal-unix-deps
-        Build a compiler that minimizes dependencies on Unix-like tools
-       under Win32, allowing the user to operate the compiler without
-       having to install Cygwin toolchain (say). (You still need
-       that toolchain to build GHC from sources though).
+AC_ARG_ENABLE(objectio,
+[  --enable-objectio
+        Build ObjectIO, a portable GUI library for Haskell.
 ],
-[MinimalUnixDeps=YES],
-[MinimalUnixDeps=NO]
+[GhcLibsWithObjectIO=YES],
+[GhcLibsWithObjectIO=NO]
 )
-AC_SUBST(MinimalUnixDeps)
+AC_SUBST(GhcLibsWithObjectIO)
 
 dnl ** Enable the building of the OpenGL/GLUT binding in hslibs?
 dnl --------------------------------------------------------------
 AC_ARG_ENABLE(hopengl,
 [  --enable-hopengl
-        Build HOpenGL, a Haskell binding for OpenGL/GLUT, too.
-        (This option is only relevant when hslibs are built.)
+        Build HOpenGL, a Haskell binding for OpenGL/GLUT.
 ],
 [GhcLibsWithHOpenGL=YES],
 [GhcLibsWithHOpenGL=NO]
 )
 AC_SUBST(GhcLibsWithHOpenGL)
 
-dnl ** Use a specific version of the GLUT API
-dnl --------------------------------------------------------------
-AC_ARG_WITH(glut-api,
-[  --with-glut-api=<version>
-        Use a specific version of the GLUT API when building HOpenGL.
-])
-test -n "$with_glut_api"  && CPPFLAGS="$CPPFLAGS -DGLUT_API_VERSION=$with_glut_api"
-
-
-dnl ** Use a specific version of the GLUT API
+dnl ** .NET interop support?
 dnl --------------------------------------------------------------
-AC_ARG_WITH(glut-xlib,
-[  --with-glut-xlib=<version>
-        Use a specific version of the GLUT Xlib implementation when building HOpenGL.
-])
-test -n "$with_glut_xlib" && CPPFLAGS="$CPPFLAGS -DGLUT_XLIB_IMPLEMENTATION=$with_glut_xlib"
-
-
-
+AC_ARG_ENABLE(dotnet,
+[  --enable-dotnet
+        Build .NET interop layer.
+],
+[DotnetSupport=YES; AC_DEFINE(WANT_DOTNET_SUPPORT)],
+[DotnetSupport=NO]
+)
+AC_SUBST(DotnetSupport)
 
 dnl --------------------------------------------------------------
 dnl End of configure script option section
@@ -512,30 +588,36 @@ esac
 dnl ** does #! path/to/perl work? (sometimes it's too long...)
 FPTOOLS_SHEBANG_PERL
 
+dnl ** check for Python
+AC_PATH_PROG(PythonCmd,python)
+
 dnl ** look for GCC and find out which version
 dnl     Figure out which C compiler to use.  Gcc is preferred.
 dnl     If gcc, make sure it's at least 2.1
 dnl
 AC_PROG_CC
 FPTOOLS_HAVE_GCC
+FPTOOLS_GCC_NEEDS_NO_OMIT_LFPTR
 
 dnl ** figure out how to invoke cpp directly (gcc -E is no good)
 AC_PROG_CPP
 
-dnl ** does the C compiler support the following options?
-FPTOOLS_CC_FLAG(-mwin32,CC_SUPPORTS_MWIN32)
-FPTOOLS_CC_FLAG(-mno-cygwin,CC_SUPPORTS_MNO_CYGWIN)
+dnl ** Without optimization some INLINE trickery fails for GHCi
+SRC_CC_OPTS="-O"
 
-EXTRA_CC_OPTS="$CC_SUPPORTS_MNO_CYGWIN $CC_SUPPORTS_MWIN32"
-SRC_CC_OPTS="-O $EXTRA_CC_OPTS"
-CPPFLAGS="$EXTRA_CC_OPTS $CPPFLAGS"
+dnl ** Try to add -mno-cygwin to the C compiler options for mingw32 targets
+if test x"$TargetOS_CPP" = x"mingw32"; then
+  FPTOOLS_CC_FLAG(-mno-cygwin,CC_SUPPORTS_MNO_CYGWIN)
+  SRC_CC_OPTS="$CC_SUPPORTS_MNO_CYGWIN $SRC_CC_OPTS"
+  CPPFLAGS="$CC_SUPPORTS_MNO_CYGWIN $CPPFLAGS"
+fi
 AC_SUBST(SRC_CC_OPTS)
 
 dnl ** figure out how to do context diffs
 FPTOOLS_PROG_DIFF
 
 dnl ** Find find command (for Win32's benefit)
-AC_PATH_PROG(FindCmd, find)
+FPTOOLS_FIND_FIND
 
 dnl ** look for a decent parser generator (bison preferred)
 dnl (FPTOOLS_PROG_YACCY is AC_PROG_YACC, but with some extra testing 
@@ -556,7 +638,6 @@ AC_DEFINE(HAVE_BIN_SH)
 dnl ** how to invoke `ar' and `ranlib'
 FPTOOLS_PROG_AR_AND_RANLIB
 
-
 dnl ** Check to see whether ln -s works
 AC_PROG_LN_S
 
@@ -568,7 +649,6 @@ AC_PATH_PROG(SedCmd,sed)
 dnl ** check for time command
 AC_PATH_PROG(TimeCmd,time)
 
-
 dnl ** check for tar
 dnl   if GNU tar is named gtar, look for it first.
 AC_PATH_PROGS(TarCmd,gtar tar,tar)
@@ -579,10 +659,24 @@ AC_PATH_PROGS(CompressCmd,gzip compress,gzip)
 dnl ** check for jade/openjade & determine a working catalog
 AC_PATH_PROGS(JadeCmd,openjade jade,jade)
 FPTOOLS_DOCBOOK_CATALOG(Catalog, $JadeCmd, docs/fptools-both.dsl, 
-                        /etc/sgml/catalog /etc/sgml.catalog /usr/share/sgml/CATALOG.docbkdsl $hardtop/glafp-utils/docbook/CATALOG*)
+                        /etc/sgml/catalog /etc/sgml.catalog /usr/share/sgml/CATALOG.docbkdsl /usr/local/share/sgml/catalog glafp-utils/docbook/CATALOG*)
 if test -z "$Catalog"; then
   AC_MSG_RESULT([Warning: You will not be able to build the documentation.])
 fi
+case $Catalog in
+   yes) # assume it is provided by other means (e.g., SGML_CATALOG_FILES env var).
+        Catalog=
+       ;;
+   glafp*) 
+       case $HostOS_CPP in
+          mingw32)
+             Catalog=`cygpath -w $hardtop/$Catalog`
+             ;;
+          *) Catalog=$hardtop/$Catalog
+             ;;
+       esac
+   ;;
+esac   
 AC_SUBST(Catalog)
 
 compress_nm=`basename $CompressCmd`
@@ -595,12 +689,50 @@ fi
 AC_SUBST(CompressCmd)
 AC_SUBST(CompressSuffix)
 
+dnl ** check for ghc-pkg command
+changequote(, )dnl
+ghc_pkg_guess=`echo $WithGhc | sed 's@ghc\([^/\\]*\)$@ghc-pkg\1@'`
+changequote([, ])dnl
+if $ghc_pkg_guess -l >/dev/null 2>/dev/null; then
+   GhcPkgCmd=$ghc_pkg_guess
+   AC_MSG_NOTICE([using $ghc_pkg_guess for ghc-pkg])
+else
+   AC_PATH_PROG(GhcPkgCmd,ghc-pkg)
+fi
+
+AC_ARG_WITH(greencard,
+[  --with-greencard=<greencard compiler>
+        Use a command different from 'green-card' to compile GreenCard files
+],
+[
+GreencardCmd=$withval;
+FPTOOLS_GREENCARD(3.00)
+]
+)
+
+AC_ARG_ENABLE(src-tree-happy,
+[  --enable-src-tree-happy
+        Build and use source tree (fptools/happy) version of happy.
+],
+[UseSrcTreeHappy=YES],
+[UseSrcTreeHappy=NO]
+)
 dnl ** check for installed happy binary + version
 dnl    (don't do it if we're booting from .hc files though.)
 if test "$BootingFromHc" = "NO"; then
 FPTOOLS_HAPPY
 fi;
 
+AC_ARG_ENABLE(src-tree-haddock,
+[  --enable-src-tree-haddock
+        Build and use source tree (fptools/haddock) version of haddock.
+],
+[UseSrcTreeHaddock=YES],
+[UseSrcTreeHaddock=NO]
+)
+dnl ** check for installed haddock
+FPTOOLS_HADDOCK
+
 dnl --------------------------------------------------
 dnl ### program checking section ends here ###
 dnl --------------------------------------------------
@@ -612,11 +744,16 @@ dnl ### checking the state of the local header files and syscalls ###
 dnl ** check for full ANSI header (.h) files
 AC_HEADER_STDC
 
+dnl ** Enable large file support.  NB. do this before testing the type of
+dnl    off_t, because it will affect the result of that test.
+AC_SYS_LARGEFILE
+
 dnl ** check for specific header (.h) files that we are interested in
-AC_CHECK_HEADERS(Files.h arpa/inet.h assert.h console.h ctype.h dirent.h errno.h fcntl.h float.h ftw.h grp.h ieee754.h inttypes.h malloc.h memory.h nlist.h pascal.h pwd.h sgtty.h siginfo.h signal.h stat.h stdint.h stdlib.h stdarg.h string.h sys/fault.h sys/file.h sys/ioctl.h sys/limits.h sys/mman.h sys/param.h sys/procfs.h sys/resource.h sys/signal.h sys/socket.h netdb.h netinet/in.h netinet/tcp.h sys/stat.h sys/syscall.h sys/time.h sys/timeb.h sys/timers.h sys/times.h sys/types.h sys/un.h sys/utsname.h sys/vadvise.h sys/wait.h termio.h termios.h time.h types.h unistd.h utime.h values.h vfork.h bfd.h winsock.h)
+AC_CHECK_HEADERS(Files.h arpa/inet.h assert.h console.h ctype.h dirent.h errno.h fcntl.h float.h ftw.h grp.h ieee754.h inttypes.h limits.h malloc.h memory.h nlist.h pascal.h pwd.h sgtty.h siginfo.h signal.h stat.h stdint.h stdlib.h stddef.h stdarg.h string.h sys/fault.h sys/file.h sys/ioctl.h sys/limits.h sys/mman.h sys/param.h sys/procfs.h sys/resource.h sys/signal.h sys/socket.h netdb.h netinet/in.h netinet/tcp.h sys/stat.h sys/syscall.h sys/time.h sys/timeb.h sys/timers.h sys/times.h sys/types.h sys/un.h sys/utsname.h sys/vadvise.h sys/wait.h termio.h termios.h time.h types.h unistd.h utime.h values.h bfd.h winsock.h pthread.h sys/uio.h)
+AC_CHECK_HEADER(unistd.h,[AC_CHECK_FUNCS(lchown)])
 
-AC_CHECK_HEADER(readline/readline.h, HaveReadlineReadlineH=YES, HaveReadlineReadlineH=NO)
-AC_CHECK_HEADER(readline/history.h, HaveReadlineHistoryH=YES, HaveReadlineHistoryH=NO)
+AC_CHECK_HEADER(readline/readline.h, [HaveReadlineReadlineH=YES], [HaveReadlineReadlineH=NO])
+AC_CHECK_HEADER(readline/history.h, [HaveReadlineHistoryH=YES], [HaveReadlineHistoryH=NO])
 
 if test $HaveReadlineReadlineH = YES && test $HaveReadlineHistoryH = YES ; then
   HaveReadlineHeaders=YES
@@ -643,10 +780,15 @@ dnl dynamic loading include files
 AC_CHECK_HEADERS(dlfcn.h dl.h) 
 
 dnl ** check for farcalloc (in bcc)
-AC_CHECK_HEADER(alloc.h,AC_CHECK_FUNCS(farcalloc))
+AC_CHECK_HEADER(alloc.h,[AC_CHECK_FUNCS(farcalloc)])
 
 dnl ** check for valloc (in sunos, solaris, mips, amiga, next, minix, ultrix)
-AC_CHECK_HEADER(malloc.h,AC_CHECK_FUNCS(valloc))
+AC_CHECK_HEADER(malloc.h,[AC_CHECK_FUNCS(valloc)])
+
+dnl ** check for POSIX regex
+HavePosixRegex=NO
+AC_CHECK_HEADER(regex.h,[AC_CHECK_FUNC(regcomp, [HavePosixRegex=YES])])
+AC_SUBST(HavePosixRegex)
 
 dnl ** how do we get a timezone name, and UTC offset ?
 AC_STRUCT_TIMEZONE
@@ -664,6 +806,10 @@ AC_STRUCT_ST_BLKSIZE
 dnl ** do we have long longs?
 FPTOOLS_C_LONG_LONG
 
+dnl ** check what fields struct msghdr contains
+FPTOOLS_MSGHDR_MSG_ACCRIGHTS
+FPTOOLS_MSGHDR_MSG_CONTROL
+
 dnl ** what are the sizes of various types
 dnl    (these must come before GHC_CHECK_ALIGNMENT)
 AC_CHECK_SIZEOF(char,               1)
@@ -726,6 +872,20 @@ dnl Int32 is a HACK for non-ISO C compilers
 FPTOOLS_CHECK_HTYPE(sig_atomic_t, Int32)
 FPTOOLS_CHECK_HTYPE(clock_t)
 FPTOOLS_CHECK_HTYPE(time_t)
+FPTOOLS_CHECK_HTYPE(dev_t, Word32)
+FPTOOLS_CHECK_HTYPE(ino_t)
+FPTOOLS_CHECK_HTYPE(mode_t)
+FPTOOLS_CHECK_HTYPE(off_t)
+FPTOOLS_CHECK_HTYPE(pid_t)
+FPTOOLS_CHECK_HTYPE(gid_t)
+FPTOOLS_CHECK_HTYPE(uid_t)
+FPTOOLS_CHECK_HTYPE(cc_t)
+FPTOOLS_CHECK_HTYPE(speed_t)
+FPTOOLS_CHECK_HTYPE(tcflag_t)
+FPTOOLS_CHECK_HTYPE(blkcnt_t)
+FPTOOLS_CHECK_HTYPE(nlink_t)
+FPTOOLS_CHECK_HTYPE(ssize_t)
+FPTOOLS_CHECK_HTYPE(rlim_t)
 
 dnl ** Map OpenGL data types to Haskell types
 if test $GhcLibsWithHOpenGL = YES ; then
@@ -820,18 +980,56 @@ AC_CHECK_FUNCS(vsnprintf _vsnprintf)
 AC_CHECK_FUNCS(snprintf  _snprintf )  
 AC_CHECK_FUNCS(popen     _popen )  
 AC_CHECK_FUNCS(pclose    _pclose )  
+AC_CHECK_FUNCS(setenv unsetenv)
 
 
 dnl ** check for specific library functions that we are interested in
-AC_CHECK_FUNCS(access ftime getclock getpagesize getrusage gettimeofday mktime mprotect readlink setitimer stat symlink sysconf timelocal times vadvise vfork)
+AC_CHECK_FUNCS(access ftime getclock getpagesize getrusage gettimeofday mktime mprotect readlink setitimer stat lstat symlink sysconf timelocal times vadvise localtime_r gmtime_r readdir_r getgrgid_r getgrnam_r getpwuid_r getpwnam_r)
+
+dnl ** Solaris2 needs additionl flag for getpw*_r()
+case "$TargetPlatform" in
+  *-solaris2*)
+    unix_SRC_HSC2HS_OPTS="-D_POSIX_PTHREAD_SEMANTICS"
+    AC_SUBST(unix_SRC_HSC2HS_OPTS)
+  ;;
+esac
 
 dnl ** check whether this machine has gmp3 installed
 AC_CHECK_LIB(gmp,  __gmpz_fdiv_qr, HaveLibGmp=YES; LibGmp=gmp,
   AC_CHECK_LIB(gmp3, __gmpz_fdiv_qr,  HaveLibGmp=YES; LibGmp=gmp3,
-    HaveLibGmp=No; LibGmp=not-installed))
+    HaveLibGmp=NO; LibGmp=not-installed))
 AC_SUBST(HaveLibGmp)
 AC_SUBST(LibGmp)
 
+dnl ** (Mac OS X only: check for HaskellSupport.framework)
+HaveFrameworkHaskellSupport=NO
+if test $HostPlatform = "powerpc-apple-darwin"; then
+ AC_MSG_CHECKING([for HaskellSupport.framework])
+ save_libs="$LIBS"
+ LIBS="-framework HaskellSupport"
+ AC_TRY_LINK_FUNC(__gmpz_fdiv_qr, HaveFrameworkHaskellSupport=YES,)
+ if test $HaveFrameworkHaskellSupport = YES; then
+  AC_DEFINE(HAVE_FRAMEWORK_HASKELLSUPPORT)
+ fi;
+ LIBS="$save_libs"
+ AC_MSG_RESULT([$HaveFrameworkHaskellSupport])
+fi;
+AC_SUBST(HaveFrameworkHaskellSupport)
+
+dnl ** check for mingwex library
+AC_CHECK_LIB(mingwex, closedir, HaveLibMingwEx=YES, HaveLibMingwEx=NO)
+AC_SUBST(HaveLibMingwEx)
+
+if test $HaveLibMingwEx = YES ; then
+  AC_DEFINE(HAVE_MINGWEX)
+fi
+
+if test "$HaveLibGmp" = "NO"; then
+if test "$HostArch_CPP" = "ia64"; then
+AC_MSG_ERROR([You need to install libgmp (the in-tree version does not work on IA64).])
+fi;
+fi;
+
 dnl ** check whether this machine has GNU regex in libc.
 FPTOOLS_REGEX_IN_LIBC
 
@@ -878,26 +1076,163 @@ dnl ** check for math library
 FPTOOLS_CHECK_LIBM()
 AC_SUBST(LIBM)
 
-case $HostOS_CPP in
-cygwin32) ;;
-mingw32)  ;;
-*) AC_PATH_XTRA() ;;
-esac
+dnl ** check for X Window System
+AC_PATH_XTRA()
+
+dnl ** check for OpenGL/GLUT/GLX include paths and libraries
+if test $GhcLibsWithHOpenGL = YES ; then
+FPTOOLS_HAVE_OPENGL
+fi
 
 dnl ################################################################
 dnl Check for libraries
 dnl ################################################################
 
-AC_CHECK_LIB(dl, dlopen, 
-       [HaveLibDL=YES
-        AC_DEFINE(HAVE_LIBDL)
-        LIBS="$LIBS -ldl"], 
-       [HaveLibDL=NO])
-AC_CHECK_FUNCS(dlopen)
-AC_SUBST(HaveLibDL)
+dnl ** check for libdl & RTLD_NEXT
+
+dnl (Mac OS X only) ... but don't check if we already have the
+dnl HaskellSupport.framework
+
+if test $HaveFrameworkHaskellSupport = YES; then
+    HaveLibDL=NO
+    HaveRtldNext=NO
+    HaveRtldLocal=YES
+    AC_DEFINE(HAVE_RTLDLOCAL)
+    HaveRtldGlobal=YES
+    AC_DEFINE(HAVE_RTLDGLOBAL)
+    HaveRtldNow=YES
+    AC_DEFINE(HAVE_RTLDNOW)
+    AC_SUBST(HaveLibDL)
+    AC_SUBST(HaveRtldNext)
+    AC_SUBST(HaveRtldLocal)
+    AC_SUBST(HaveRtldGlobal)
+    AC_SUBST(HaveRtldNow)
+else
+    AC_CHECK_LIB(dl, dlopen, 
+       [HaveLibDL=YES
+        AC_DEFINE(HAVE_LIBDL)
+        LIBS="$LIBS -ldl"], 
+       [HaveLibDL=NO])
+    AC_CHECK_FUNCS(dlopen)
+    AC_SUBST(HaveLibDL)
+
+    dnl ** sometimes RTLD_NEXT is hidden in #ifdefs we really don't wan to set
+    AC_MSG_CHECKING(for RTLD_NEXT from dlfcn.h)
+    AC_EGREP_CPP(yes,
+    [
+     #include <dlfcn.h>
+     #ifdef RTLD_NEXT
+            yes
+     #endif
+    ], [
+      AC_MSG_RESULT(yes)
+      AC_DEFINE(HAVE_RTLDNEXT)
+      HaveRtldNext=YES
+    ], [
+      AC_MSG_RESULT(no)
+      HaveRtldNext=NO
+      ])    
+    AC_SUBST(HaveRtldNext)
+
+    dnl ** RTLD_LOCAL isn't available on cygwin or openbsd
+    AC_MSG_CHECKING(for RTLD_LOCAL from dlfcn.h)
+    AC_EGREP_CPP(yes,
+    [
+     #include <dlfcn.h>
+     #ifdef RTLD_LOCAL
+            yes
+     #endif
+    ], [
+      AC_MSG_RESULT(yes)
+      AC_DEFINE(HAVE_RTLDLOCAL)
+      HaveRtldLocal=YES
+    ], [
+      AC_MSG_RESULT(no)
+      HaveRtldLocal=NO
+      ])    
+    AC_SUBST(HaveRtldLocal)
+
+    dnl ** RTLD_GLOBAL isn't available on openbsd
+    AC_MSG_CHECKING(for RTLD_GLOBAL from dlfcn.h)
+    AC_EGREP_CPP(yes,
+    [
+     #include <dlfcn.h>
+     #ifdef RTLD_GLOBAL
+            yes
+     #endif
+    ], [
+      AC_MSG_RESULT(yes)
+      AC_DEFINE(HAVE_RTLDGLOBAL)
+      HaveRtldGlobal=YES
+    ], [
+      AC_MSG_RESULT(no)
+      HaveRtldGlobal=NO
+      ])    
+    AC_SUBST(HaveRtldGlobal)
+
+    dnl ** RTLD_NOW isn't available on openbsd
+    AC_MSG_CHECKING(for RTLD_NOW from dlfcn.h)
+    AC_EGREP_CPP(yes,
+    [
+     #include <dlfcn.h>
+     #ifdef RTLD_NOW
+            yes
+     #endif
+    ], [
+      AC_MSG_RESULT(yes)
+      AC_DEFINE(HAVE_RTLDNOW)
+      HaveRtldNow=YES
+    ], [
+      AC_MSG_RESULT(no)
+      HaveRtldNow=NO
+      ])    
+    AC_SUBST(HaveRtldNow)
+fi
 
 FPTOOLS_CHECK_LIB_NOWARN(m, atan)
 
+dnl ---------- usleep ----------
+dnl --- stolen from guile configure ---
+dnl --- FIXME: /usr/include/unistd.h can't be right?
+
+### On some systems usleep has no return value.  If it does have one,
+### we'd like to return it; otherwise, we'll fake it.
+AC_CACHE_CHECK([return type of usleep], cv_func_usleep_return_type,
+  [AC_EGREP_HEADER(changequote(<, >)<void[      ]+usleep>changequote([, ]),
+                   /usr/include/unistd.h,
+                   [cv_func_usleep_return_type=void],
+                   [cv_func_usleep_return_type=int])])
+case "$cv_func_usleep_return_type" in
+  "void" )
+    AC_DEFINE(USLEEP_RETURNS_VOID, 1,
+      [Define if the system headers declare usleep to return void.])
+  ;;
+esac
+
+dnl --------------------------------------------------
+dnl * test for in_addr_t
+dnl --------------------------------------------------
+AC_MSG_CHECKING(for in_addr_t in netinet/in.h)
+AC_EGREP_HEADER(in_addr_t, netinet/in.h,
+ [ AC_DEFINE(HAVE_IN_ADDR_T) AC_MSG_RESULT(yes) ],
+ AC_MSG_RESULT(no))
+
+dnl --------------------------------------------------
+dnl * test for Linux sendfile(2)
+dnl --------------------------------------------------
+AC_MSG_CHECKING(for sendfile in sys/sendfile.h)
+AC_EGREP_HEADER(sendfile, sys/sendfile.h,
+ [ AC_DEFINE(HAVE_LINUX_SENDFILE) AC_MSG_RESULT(yes) ],
+ AC_MSG_RESULT(no))
+
+dnl --------------------------------------------------
+dnl * test for BSD sendfile(2)
+dnl --------------------------------------------------
+AC_MSG_CHECKING(for sendfile in sys/socket.h)
+AC_EGREP_HEADER(sendfile, sys/socket.h,
+ [ AC_DEFINE(HAVE_BSD_SENDFILE) AC_MSG_RESULT(yes) ],
+ AC_MSG_RESULT(no))
+
 dnl --------------------------------------------------
 dnl * test for GTK+
 dnl --------------------------------------------------
@@ -929,6 +1264,9 @@ dnl --------------------------------------------------
 dnl ** can we get alloca?
 AC_FUNC_ALLOCA
 
+dnl ** Working vfork?
+AC_FUNC_VFORK
+
 dnl ** determine whether or not const works
 AC_C_CONST
 
@@ -937,21 +1275,52 @@ AC_C_PROTOTYPES
 
 dnl ** are we big endian?
 AC_C_BIGENDIAN
-# Allay users' general fear of warnings of any kind.
-errprint((fptools configure script wizard sez: "don't worry, the above warning is harmless (to us.)")
-)
 
 dnl ** check for leading underscores in symbol names
 FPTOOLS_UNDERSCORE
 
-dnl ** how is the end of text section signalled?
-FPTOOLS_END_TEXT_SECTION
-
-dnl ** how is the end of data section signalled?
-FPTOOLS_END_DATA_SECTION
+dnl ** check for ld, and whether ld has -x option
+AC_PATH_PROG(LdCmdRaw, ld)
+case $HostOS_CPP in
+ mingw32) LdCmd=`cygpath -w ${LdCmdRaw} | sed -e 's@\\\\@/@g' `
+          ;;
+ *) LdCmd=${LdCmdRaw}
+    ;;
+esac
+AC_SUBST(LdCmd)
+FPTOOLS_LD_X
+
+AC_MSG_CHECKING([for SIGPOLL])
+AC_EGREP_CPP(we_have_sigpoll,
+[#include <signal.h>
+#ifdef SIGPOLL
+we_have_sigpoll
+#endif
+], AC_DEFINE(HAVE_SIGPOLL) haveSIGPOLL=yes, haveSIGPOLL=no)
+AC_MSG_RESULT([$haveSIGPOLL])
 
-dnl ** code before data?
-FPTOOLS_CODE_BEFORE_DATA
+AC_MSG_CHECKING([for _SC_GETGR_R_SIZE_MAX])
+AC_EGREP_CPP(we_have_that_sysconf_thing,
+[
+#include <unistd.h>
+#ifdef _SC_GETGR_R_SIZE_MAX
+we_have_that_sysconf_thing
+#endif
+],
+[AC_MSG_RESULT([yes])
+AC_DEFINE(HAVE_SC_GETGR_R_SIZE_MAX)],
+[AC_MSG_RESULT([no])])
 
+AC_MSG_CHECKING([for _SC_GETPW_R_SIZE_MAX])
+AC_EGREP_CPP(we_have_that_sysconf_thing,
+[
+#include <unistd.h>
+#ifdef _SC_GETPW_R_SIZE_MAX
+we_have_that_sysconf_thing
+#endif
+],
+[AC_MSG_RESULT([yes])
+AC_DEFINE(HAVE_SC_GETPW_R_SIZE_MAX)],
+[AC_MSG_RESULT([no])])
 
 AC_OUTPUT(mk/config.mk, echo timestamp > mk/stamp-h )