X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=aclocal.m4;h=013f7ff76ba23c876b6ba60713666da1e9f2c027;hp=3df243f53a45c42eaf96cee352d1ab484d5b6ae5;hb=ce14988222b8da2abc57c68a087a61efe5ba709b;hpb=5b846fa36eee0f96c4c47128706d0131f8bb4113 diff --git a/aclocal.m4 b/aclocal.m4 index 3df243f..013f7ff 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -44,38 +44,6 @@ AC_DEFUN([FP_EVAL_STDERR], ])# 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. @@ -88,7 +56,7 @@ AC_DEFUN([FP_PROG_CONTEXT_DIFF], [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" @@ -256,6 +224,16 @@ dnl for a happy source tree and point the build system at that instead. 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 :/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 @@ -276,24 +254,21 @@ AC_SUBST(HappyVersion) ]) dnl -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 -AC_DEFUN([FPTOOLS_HADDOCK], -[AC_PATH_PROG(HaddockCmd,haddock,) -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 Check for Alex and version. If we're building GHC, then we need dnl at least Alex version 2.0.1. 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 :/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 @@ -306,14 +281,54 @@ 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.0.1], - [AC_MSG_ERROR([Alex version 2.0.1 or later is required to compile GHC.])])[]dnl + 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 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 :/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 @@ -546,8 +561,11 @@ fi AC_CACHE_CHECK([version of gcc], [fp_gcc_version], [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], [2.0], - [AC_MSG_ERROR([Need at least gcc version 2.0 (3.4+ recommended)])]) + FP_COMPARE_VERSIONS([$fp_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. else fp_gcc_version="not-installed" fi @@ -601,7 +619,7 @@ AC_DEFUN([FP_CHECK_PROG], # ------------ # Find a non-WinDoze version of the "find" utility. AC_DEFUN([FP_PROG_FIND], -[AC_PATH_PROG([fp_prog_find], [find]) +[AC_PATH_PROGS([fp_prog_find], [gfind find], find) echo foo > conftest.txt $fp_prog_find conftest.txt -print > conftest.out 2>&1 if grep '^conftest.txt$' conftest.out > /dev/null 2>&1 ; then @@ -912,6 +930,9 @@ AC_DEFUN([FP_PROG_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 + fp_cv_matching_ghc_pkg=$fp_ghc_pkg_guess else fp_cv_matching_ghc_pkg=no fi]) @@ -922,20 +943,6 @@ else fi])# FP_PROG_GHC_PKG -# FP_GHC_HAS_READLINE -# ------------------- -AC_DEFUN([FP_GHC_HAS_READLINE], -[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 -else - fp_cv_ghc_has_readline=no - fi]) -AC_SUBST([GhcHasReadline], [`echo $fp_cv_ghc_has_readline | sed 'y/yesno/YESNO/'`]) -])# FP_GHC_HAS_READLINE - - # FP_GCC_EXTRA_FLAGS # ------------------ # Determine which extra flags we need to pass gcc when we invoke it @@ -972,6 +979,11 @@ AC_CACHE_CHECK([for extra options to pass gcc when compiling via C], [fp_cv_gcc_ )], []) ;; + 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) @@ -987,7 +999,17 @@ if test "$RELEASE" = "NO"; then 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 @@ -1000,7 +1022,7 @@ if test "$RELEASE" = "NO"; then 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 @@ -1031,10 +1053,19 @@ ProjectPatchLevel=`echo $ProjectPatchLevel | sed 's/\.//'` 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 +#ifdef HAVE_STDLIB_H +#include +#endif #ifdef HAVE_TIME_H #include #endif @@ -1044,19 +1075,103 @@ AC_DEFUN([FP_CHECK_TIMER_CREATE], #ifdef HAVE_UNISTD_H #include #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); } ],