])# 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
-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.
[echo foo > conftest1
echo foo > conftest2
fp_cv_context_diff=no
-for fp_var in '-C 1' '-c1'
+for fp_var in '-U 1' '-u1' '-C 1' '-c1'
do
if diff $fp_var conftest1 conftest2 > /dev/null 2>&1; then
fp_cv_context_diff="diff $fp_var"
dnl
AC_DEFUN([FPTOOLS_HAPPY],
[AC_PATH_PROG(HappyCmd,happy,)
+# Happy is passed to Cabal, so we need a native path
+if test "x$HostPlatform" = "xi386-unknown-mingw32" && \
+ test "${OSTYPE}" != "msys" && \
+ test "${HappyCmd}" != ""
+then
+ # Canonicalise to <drive>:/path/to/gcc
+ 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
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.
+# Haddock is passed to Cabal, so we need a native path
+if test "x$HostPlatform" = "xi386-unknown-mingw32" && \
+ test "${OSTYPE}" != "msys" && \
+ test "${HaddockCmd}" != ""
+then
+ # Canonicalise to <drive>:/path/to/gcc
+ HaddockCmd=`cygpath -m ${HaddockCmd}`
+ AC_MSG_NOTICE([normalized haddock command to $HaddockCmd])
+fi
])
dnl
AC_DEFUN([FPTOOLS_ALEX],
[
AC_PATH_PROG(AlexCmd,alex,)
+# Alex is passed to Cabal, so we need a native path
+if test "x$HostPlatform" = "xi386-unknown-mingw32" && \
+ test "${OSTYPE}" != "msys" && \
+ test "${AlexCmd}" != ""
+then
+ # Canonicalise to <drive>:/path/to/gcc
+ 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])# FP_PROG_GHC_PKG
-# FP_GHC_HAS_READLINE
+# FP_GHC_HAS_EDITLINE
# -------------------
-AC_DEFUN([FP_GHC_HAS_READLINE],
+AC_DEFUN([FP_GHC_HAS_EDITLINE],
[AC_REQUIRE([FP_PROG_GHC_PKG])
-AC_CACHE_CHECK([whether ghc has readline package], [fp_cv_ghc_has_readline],
-[if "${GhcPkgCmd-ghc-pkg}" --show-package readline >/dev/null 2>&1; then
- fp_cv_ghc_has_readline=yes
+AC_CACHE_CHECK([whether ghc has editline package], [fp_cv_ghc_has_editline],
+[if "${GhcPkgCmd-ghc-pkg}" --show-package editline >/dev/null 2>&1; then
+ fp_cv_ghc_has_editline=yes
else
- fp_cv_ghc_has_readline=no
+ fp_cv_ghc_has_editline=no
fi])
-AC_SUBST([GhcHasReadline], [`echo $fp_cv_ghc_has_readline | sed 'y/yesno/YESNO/'`])
-])# FP_GHC_HAS_READLINE
+AC_SUBST([GhcHasEditline], [`echo $fp_cv_ghc_has_editline | sed 'y/yesno/YESNO/'`])
+])# FP_GHC_HAS_EDITLINE
-# FP_GCC_NEEDS_NO_OMIT_LFPTR
-# --------------------------
+# FP_GCC_EXTRA_FLAGS
+# ------------------
+# Determine which extra flags we need to pass gcc when we invoke it
+# to compile .hc code.
+#
# Some OSs (Mandrake Linux, in particular) configure GCC with
-# -momit-leaf-frame-pointer on by default. If this is the case, we need to turn
-# it off for mangling to work. The test is currently a bit crude, using only the
-# version number of gcc. Defines HAVE_GCC_MNO_OMIT_LFPTR.
-AC_DEFUN([FP_GCC_NEEDS_NO_OMIT_LFPTR],
-[AC_REQUIRE([FP_HAVE_GCC])
-AC_CACHE_CHECK([whether gcc needs -mno-omit-leaf-frame-pointer], [fp_cv_gcc_needs_no_omit_lfptr],
-[FP_COMPARE_VERSIONS([$fp_gcc_version], [-ge], [3.2],
- [fp_cv_gcc_needs_no_omit_lfptr=yes],
- [fp_cv_gcc_needs_no_omit_lfptr=no])])
-if test "$fp_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])# FP_GCC_NEEDS_NO_OMIT_LFPTR
-
-# FP_GCC_HAS_NO_UNIT_AT_A_TIME
-# --------------------------
-AC_DEFUN([FP_GCC_HAS_NO_UNIT_AT_A_TIME],
+# -momit-leaf-frame-pointer on by default. If this is the case, we
+# need to turn it off for mangling to work. The test is currently a
+# bit crude, using only the version number of gcc.
+#
+# -fwrapv is needed for gcc to emit well-behaved code in the presence of
+# integer wrap around. (Trac #952)
+#
+# -fno-unit-at-a-time or -fno-toplevel-reoder is necessary to avoid gcc
+# reordering things in the module and confusing the manger and/or splitter.
+# (eg. Trac #1427)
+#
+AC_DEFUN([FP_GCC_EXTRA_FLAGS],
[AC_REQUIRE([FP_HAVE_GCC])
-AC_CACHE_CHECK([whether gcc has -fno-unit-at-a-time], [fp_cv_gcc_has_no_unit_at_a_time],
-[FP_COMPARE_VERSIONS([$fp_gcc_version], [-ge], [3.4],
- [fp_cv_gcc_has_no_unit_at_a_time=yes],
- [fp_cv_gcc_has_no_unit_at_a_time=no])])
-if test "$fp_cv_gcc_has_no_unit_at_a_time" = "yes"; then
- AC_DEFINE([HAVE_GCC_HAS_NO_UNIT_AT_A_TIME], [1], [Define to 1 if gcc supports -fno-unit-at-a-time.])
-fi])
+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_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_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_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_cv_gcc_extra_opts="$fp_cv_gcc_extra_opts -fno-toplevel-reorder"],
+ [])
+ ;;
+ esac
+])
+AC_SUBST([GccExtraViaCOpts],$fp_cv_gcc_extra_opts)
+])
-# FP_GCC_HAS_WRAPV
-# --------------------------
-AC_DEFUN([FP_GCC_HAS_WRAPV],
-[AC_REQUIRE([FP_HAVE_GCC])
-AC_CACHE_CHECK([whether gcc has -fwrapv], [fp_cv_gcc_has_wrapv],
-[FP_COMPARE_VERSIONS([$fp_gcc_version], [-ge], [3.4],
- [fp_cv_gcc_has_wrapv=yes],
- [fp_cv_gcc_has_wrapv=no])])
-if test "$fp_cv_gcc_has_wrapv" = "yes"; then
- AC_DEFINE([HAVE_GCC_HAS_WRAPV], [1], [Define to 1 if gcc supports -fwrapv.])
-fi])
# FP_SETUP_PROJECT_VERSION
# ---------------------
if test -f VERSION_DATE; then
PACKAGE_VERSION=${PACKAGE_VERSION}.`cat VERSION_DATE`
AC_MSG_RESULT(given $PACKAGE_VERSION)
+ elif test -d .git; then
+ changequote(, )dnl
+ ver_date=`git log -n 1 --date=short --pretty=format:%ci | sed "s/^.*\([0-9][0-9][0-9][0-9]\)-\([0-9][0-9]\)-\([0-9][0-9]\).*$/\1\2\3/"`
+ 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 git is in your path])
+ fi
+ PACKAGE_VERSION=${PACKAGE_VERSION}.$ver_date
+ AC_MSG_RESULT(inferred $PACKAGE_VERSION)
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`
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
PACKAGE_VERSION=`cat VERSION`
AC_MSG_RESULT(given $PACKAGE_VERSION)
else
- AC_MSG_WARN([cannot determine snapshot version: no _darcs directory and no VERSION file])
+ AC_MSG_WARN([cannot determine snapshot version: no .git or _darcs directory and no VERSION file])
fi
fi
AC_SUBST([ProjectPatchLevel])
])# FP_SETUP_PROJECT_VERSION
+
+# Check for a working timer_create(). We need a pretty detailed check
+# here, because there exist partially-working implementations of
+# timer_create() in certain versions of Linux (see bug #1933).
+#
AC_DEFUN([FP_CHECK_TIMER_CREATE],
[AC_CACHE_CHECK([for a working timer_create(CLOCK_REALTIME)],
[fptools_cv_timer_create_works],
[AC_TRY_RUN([
+#include <stdio.h>
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
#ifdef HAVE_TIME_H
#include <time.h>
#endif
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
+
+static volatile int tock = 0;
+static void handler(int i)
+{
+ tock = 1;
+}
+
+static void timeout(int i)
+{
+ // timer_settime() has been known to hang, so just in case
+ // we install a 1-second timeout (see #2257)
+ exit(99);
+}
+
int main(int argc, char *argv[])
{
-#if HAVE_TIMER_CREATE && HAVE_TIMER_SETTIME
+
struct sigevent ev;
timer_t timer;
+ struct itimerspec it;
+ struct sigaction action;
+ int m,n,count = 0;
+
ev.sigev_notify = SIGEV_SIGNAL;
ev.sigev_signo = SIGVTALRM;
+
+ action.sa_handler = handler;
+ action.sa_flags = 0;
+ sigemptyset(&action.sa_mask);
+ if (sigaction(SIGVTALRM, &action, NULL) == -1) {
+ fprintf(stderr,"SIGVTALRM problem\n");
+ exit(3);
+ }
+
+ action.sa_handler = timeout;
+ action.sa_flags = 0;
+ sigemptyset(&action.sa_mask);
+ if (sigaction(SIGALRM, &action, NULL) == -1) {
+ fprintf(stderr,"SIGALRM problem\n");
+ exit(3);
+ }
+ alarm(1);
+
if (timer_create(CLOCK_PROCESS_CPUTIME_ID, &ev, &timer) != 0) {
+ fprintf(stderr,"No CLOCK_PROCESS_CPUTIME_ID timer\n");
exit(1);
}
-#else
- exit(1)
-#endif
+
+ it.it_value.tv_sec = 0;
+ it.it_value.tv_nsec = 1;
+ it.it_interval = it.it_value;
+ if (timer_settime(timer, 0, &it, NULL) != 0) {
+ fprintf(stderr,"settime problem\n");
+ exit(4);
+ }
+
+ tock = 0;
+
+ for(n = 3; n < 20000; n++){
+ for(m = 2; m <= n/2; m++){
+ if (!(n%m)) count++;
+ if (tock) goto out;
+ }
+ }
+out:
+
+ if (!tock) {
+ fprintf(stderr,"no CLOCK_PROCESS_CPUTIME_ID signal\n");
+ exit(5);
+ }
+
+ timer_delete(timer);
+
+ if (timer_create(CLOCK_REALTIME, &ev, &timer) != 0) {
+ fprintf(stderr,"No CLOCK_REALTIME timer\n");
+ exit(2);
+ }
+
+ it.it_value.tv_sec = 0;
+ it.it_value.tv_nsec = 1000000;
+ it.it_interval = it.it_value;
+ if (timer_settime(timer, 0, &it, NULL) != 0) {
+ fprintf(stderr,"settime problem\n");
+ exit(4);
+ }
+
+ tock = 0;
+
+ usleep(3000);
+
+ if (!tock) {
+ fprintf(stderr,"no CLOCK_REALTIME signal\n");
+ exit(5);
+ }
+
+ timer_delete(timer);
+
exit(0);
}
],
AC_REQUIRE([AC_PROG_CC])
])
+# FP_CHECK_MACOSX_DEPLOYMENT_TARGET
+# ---------------------------------
+AC_DEFUN([FP_CHECK_MACOSX_DEPLOYMENT_TARGET],
+[
+if test "x$TargetOS_CPP-$TargetVendor_CPP" = "xdarwin-apple"; then
+ AC_MSG_CHECKING([Mac OS X deployment target])
+ case $FP_MACOSX_DEPLOYMENT_TARGET in
+ none) ;;
+ 10.4) MACOSX_DEPLOYMENT_VERSION=10.4
+ MACOSX_DEPLOYMENT_SDK=/Developer/SDKs/MacOSX10.4u.sdk
+ ;;
+ 10.4u) MACOSX_DEPLOYMENT_VERSION=10.4
+ MACOSX_DEPLOYMENT_SDK=/Developer/SDKs/MacOSX10.4u.sdk
+ ;;
+ *) MACOSX_DEPLOYMENT_VERSION=$FP_MACOSX_DEPLOYMENT_TARGET
+ MACOSX_DEPLOYMENT_SDK=/Developer/SDKs/MacOSX${FP_MACOSX_DEPLOYMENT_TARGET}.sdk
+ ;;
+ esac
+ if test "x$FP_MACOSX_DEPLOYMENT_TARGET" = "xnone"; then
+ AC_MSG_RESULT(none)
+ else
+ if test ! -d $MACOSX_DEPLOYMENT_SDK; then
+ AC_MSG_ERROR([Unknown deployment target $FP_MACOSX_DEPLOYMENT_TARGET])
+ fi
+ AC_MSG_RESULT([${MACOSX_DEPLOYMENT_VERSION} (${MACOSX_DEPLOYMENT_SDK})])
+ fi
+fi
+])
+
# --------------------------------------------------------------
# Calculate absolute path to build tree
# --------------------------------------------------------------
dnl This would be
dnl make -C utils/pwd clean && make -C utils/pwd
dnl except we don't want to have to know what make is called. Sigh.
-cd utils/pwd
-rm -f *.o
-rm -f *.hi
-rm -f pwd
-rm -f pwd.exe
-$WithGhc -v0 --make pwd
-cd ../..
+if test ! -f utils/pwd/pwd && test ! -f utils/pwd/pwd.exe; then
+ cd utils/pwd
+ rm -f *.o
+ rm -f *.hi
+ rm -f pwd
+ rm -f pwd.exe
+ $WithGhc -v0 --make pwd -o pwd
+ cd ../..
+fi
hardtop=`utils/pwd/pwd forwardslash`
+if ! test -d "$hardtop"; then
+ AC_MSG_ERROR([cannot determine current directory])
+fi
+
dnl Remove common automounter nonsense
dnl
hardtop=`echo $hardtop | sed 's|^/tmp_mnt.*\(/local/.*\)$|\1|' | sed 's|^/tmp_mnt/|/|'`
-hardtop_plat="$hardtop"
-
AC_SUBST(hardtop)
-AC_SUBST(hardtop_plat)
AC_MSG_RESULT(${hardtop})