X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=aclocal.m4;h=0432ed354b7aa2f1c362b6f086f21cfaf2c8a49c;hp=eca417a455550d0fb53c95a8fa2272211fffc11d;hb=refs%2Ftags%2F2008-06-01;hpb=519457cfd49b063f85e9595357e233feb5f0a7af diff --git a/aclocal.m4 b/aclocal.m4 index eca417a..0432ed3 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -1,3 +1,15 @@ + struct sigevent ev; + timer_t timer; + ev.sigev_notify = SIGEV_SIGNAL; + ev.sigev_signo = SIGVTALRM; + if (timer_create(CLOCK_PROCESS_CPUTIME_ID, &ev, &timer) != 0) { + exit(1); + } +#else + exit(1) +#endif + exit(0); +} # Extra autoconf macros for the Glasgow fptools # # To be a good autoconf citizen, names of local macros have prefixed with FP_ to @@ -571,22 +583,17 @@ AC_DEFUN([FP_MINGW_GCC], ]) dnl Small feature test for perl version. Assumes PerlCmd -dnl contains path to perl binary +dnl contains path to perl binary. +dnl +dnl (Perl versions prior to v5.6 does not contain the string "v5"; +dnl instead they display version strings such as "version 5.005".) dnl AC_DEFUN([FPTOOLS_CHECK_PERL_VERSION], [$PerlCmd -v >conftest.out 2>&1 - if grep "v5.6" conftest.out >/dev/null 2>&1; then + if grep "v5" 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 - AC_MSG_ERROR([your version of perl probably won't work, try upgrading it.]) - fi - fi + AC_MSG_ERROR([your version of perl probably won't work, try upgrading it.]) fi rm -fr conftest* ]) @@ -611,11 +618,15 @@ 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 # OK, looks like a real "find". - if which cygpath 1> /dev/null 2> /dev/null - then - fp_prog_find=`cygpath --mixed "$fp_prog_find"` - AC_MSG_NOTICE([Converted to "$fp_prog_find"]) - fi + case $HostPlatform in + *mingw32) + if test x${OSTYPE} != xmsys + then + fp_prog_find="`cygpath --mixed ${fp_prog_find}`" + AC_MSG_NOTICE([normalized find command to $fp_prog_find]) + fi ;; + *) ;; + esac FindCmd="$fp_prog_find" else # Found a poor WinDoze version of "find", ignore it. @@ -923,59 +934,61 @@ else 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"] + )], + []) + ;; + 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 # --------------------- @@ -1030,10 +1043,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 @@ -1043,19 +1065,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(300); + + if (!tock) { + fprintf(stderr,"no CLOCK_REALTIME signal\n"); + exit(5); + } + + timer_delete(timer); + exit(0); } ], @@ -1090,4 +1196,76 @@ AC_DEFUN([CHECK_GMP], 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 +# -------------------------------------------------------------- + +AC_DEFUN([FP_FIND_ROOT],[ +AC_MSG_CHECKING(for path to top of 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. +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/|/|'` + +AC_SUBST(hardtop) + +AC_MSG_RESULT(${hardtop}) + +# 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 +]) + # LocalWords: fi