X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=aclocal.m4;h=bee5085b4ba5b5b93646235a0d04fa7a7659137a;hp=2649df734fc973bbe053ef58b0d60faf317e3ce0;hb=e55d6fa8fcab24a7a072688a19b2e68e09c7f585;hpb=e2c77ecdd4c46c88767568f478ed5d7388c1b0b2 diff --git a/aclocal.m4 b/aclocal.m4 index 2649df7..bee5085 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -4,6 +4,37 @@ # 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], +[ + 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" + ;; + x86_64-apple-darwin) + $2="$$2 -m64" + $3="$$3 -m64" + ;; + 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 conftest.c conftest.o +]) + + # FPTOOLS_FLOAT_WORD_ORDER_BIGENDIAN # ---------------------------------- # Little endian Arm on Linux with some ABIs has big endian word order @@ -44,36 +75,38 @@ 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. +# FP_ARG_WITH_PATH_GNU_PROG +# -------------------- +# XXX # -# 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. +# $1 = the command to look for +# $2 = the variable to set # -# 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 +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 @@ -88,7 +121,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" @@ -121,7 +154,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], -[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 @@ -256,49 +289,56 @@ 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 - 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 ]) -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 - 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) ]) 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 - 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; @@ -306,47 +346,20 @@ 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.])])[] fi AlexVersion=$fptools_cv_alex_version; AC_SUBST(AlexVersion) ]) -# 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], -[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 -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], -[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 @@ -370,7 +383,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], -[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 @@ -390,10 +403,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 -fp_prog_ar=$fp_prog_ar_raw +fp_prog_ar="$fp_prog_ar_raw" 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 ;; @@ -407,15 +420,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], -[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 +AC_SUBST([ArIsGNUAr], [`echo $fp_prog_ar_is_gnu | tr 'a-z' 'A-Z'`]) ])# 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 @@ -433,7 +473,7 @@ else 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 @@ -444,7 +484,8 @@ else 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 @@ -490,7 +531,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 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* @@ -537,50 +578,37 @@ 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 - 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_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. + FP_COMPARE_VERSIONS([$fp_cv_gcc_version], [-lt], [3.4], GccLT34=YES) else - fp_gcc_version="not-installed" + fp_cv_gcc_version="not-installed" 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 -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 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* ]) @@ -600,11 +628,20 @@ 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 # OK, looks like a real "find". + 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. @@ -719,14 +756,28 @@ AS_VAR_POPDEF([fp_func])dnl # FP_GEN_DOCBOOK_XML # ------------------ # Generates a DocBook XML V4.2 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], -[rm -f conftest.xml +[rm -f conftest.xml conftest-book.xml cat > conftest.xml << EOF + "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [[ + +]]> - A DocBook Test Document +&conftest-book; + +EOF +cat >conftest-book.xml << EOF + + A DocBook “Test Document” A Chapter Title This is a paragraph, referencing . @@ -735,11 +786,23 @@ cat > conftest.xml << EOF Another Chapter Title This is another paragraph, referencing . - EOF ]) # FP_GEN_DOCBOOK_XML +# FP_PROG_DBLATEX +# ---------------- +# Sets the output variable DblatexCmd to the full path of dblatex, +# which we use for building PDF and PS docs. +# DblatexCmd is empty if dblatex could not be found. +AC_DEFUN([FP_PROG_DBLATEX], +[AC_PATH_PROG([DblatexCmd], [dblatex]) +if test -z "$DblatexCmd"; then + AC_MSG_WARN([cannot find dblatex in your PATH, you will not be able to build the PDF and PS documentation]) +fi +])# FP_PROG_DBLATEX + + # FP_PROG_XSLTPROC # ---------------- # Sets the output variable XsltprocCmd to the full path of the XSLT processor @@ -747,38 +810,33 @@ EOF AC_DEFUN([FP_PROG_XSLTPROC], [AC_PATH_PROG([XsltprocCmd], [xsltproc]) if test -z "$XsltprocCmd"; then - AC_MSG_WARN([cannot find xsltproc in your PATH, you will not be able to build the documentation]) + AC_MSG_WARN([cannot find xsltproc in your PATH, you will not be able to build the HTML documentation]) fi ])# 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_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 - 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]) - DIR_DOCBOOK_XSL= + HAVE_DOCBOOK_XSL=NO else - DIR_DOCBOOK_XSL=$fp_cv_dir_docbook_xsl + HAVE_DOCBOOK_XSL=YES fi -AC_SUBST([DIR_DOCBOOK_XSL]) -])# FP_DIR_DOCBOOK_XSL +AC_SUBST([HAVE_DOCBOOK_XSL]) +])# FP_DOCBOOK_XSL # FP_PROG_XMLLINT @@ -800,7 +858,7 @@ AC_DEFUN([FP_CHECK_DOCBOOK_DTD], 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]) @@ -865,106 +923,87 @@ AC_SUBST([FopCmd]) ])# FP_PROG_FOP -# FP_PROG_FO_PROCESSOR -# -------------------- -# Try to find an FO processor. PassiveTeX output is sometimes a bit strange, so -# try FOP first. Sets the output variables FopCmd, XmltexCmd, DvipsCmd, and -# PdfxmltexCmd. -AC_DEFUN([FP_PROG_FO_PROCESSOR], -[AC_REQUIRE([FP_PROG_FOP]) -AC_PATH_PROG([XmltexCmd], [xmltex]) -AC_PATH_PROG([DvipsCmd], [dvips]) -if test -z "$FopCmd"; then - if test -z "$XmltexCmd"; then - AC_MSG_WARN([cannot find an FO => DVI converter, you will not be able to build DVI or PostScript documentation]) - else - if test -z "$DvipsCmd"; then - AC_MSG_WARN([cannot find a DVI => PS converter, you will not be able to build PostScript documentation]) - fi - fi - AC_PATH_PROG([PdfxmltexCmd], [pdfxmltex]) - if test -z "$PdfxmltexCmd"; then - AC_MSG_WARN([cannot find an FO => PDF converter, you will not be able to build PDF documentation]) - fi -elif test -z "$XmltexCmd"; then - AC_MSG_WARN([cannot find an FO => DVI converter, you will not be able to build DVI documentation]) +# FP_PROG_HSTAGS +# ---------------- +# Sets the output variable HstagsCmd to the full Haskell tags program path. +# HstagsCmd is empty if no such program could be found. +AC_DEFUN([FP_PROG_HSTAGS], +[AC_PATH_PROG([HstagsCmd], [hasktags]) +if test -z "$HstagsCmd"; then + AC_MSG_WARN([cannot find hasktags in your PATH, you will not be able to build the tags]) fi -])# FP_PROG_FO_PROCESSOR +])# FP_PROG_HSTAGS # 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, -[fp_ghc_pkg_guess=`echo $WithGhc | sed 's,ghc\(@<:@^/\\@:>@*\)$,ghc-pkg\1,'` -if "$fp_ghc_pkg_guess" -l > /dev/null 2>&1; then +[ +# 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=no + AC_MSG_ERROR([Cannot find matching ghc-pkg]) 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_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_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_cv_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_cv_gcc_version], [-ge], [3.2], + [fp_cv_gcc_extra_opts="$fp_cv_gcc_extra_opts -mno-omit-leaf-frame-pointer"], + []) + 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_COMPARE_VERSIONS([$fp_cv_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 # --------------------- @@ -972,20 +1011,33 @@ AC_DEFUN([FP_SETUP_PROJECT_VERSION], [ if test "$RELEASE" = "NO"; then AC_MSG_CHECKING([for GHC version date]) - if test -d _darcs; 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=`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=`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" | ${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]) fi PACKAGE_VERSION=${PACKAGE_VERSION}.$ver_date - AC_MSG_RESULT($PACKAGE_VERSION) + AC_MSG_RESULT(inferred $PACKAGE_VERSION) elif test -f VERSION; then PACKAGE_VERSION=`cat VERSION` - AC_MSG_RESULT($PACKAGE_VERSION) + AC_MSG_RESULT(given $PACKAGE_VERSION) else - AC_MSG_ERROR([no version found]) + AC_MSG_WARN([cannot determine snapshot version: no .git or _darcs directory and no VERSION file]) fi fi @@ -1016,4 +1068,330 @@ 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 +#ifdef HAVE_SIGNAL_H +#include +#endif +#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[]) +{ + + 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); + } + + 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); +} + ], + [fptools_cv_timer_create_works=yes], + [fptools_cv_timer_create_works=no]) + ]) +case $fptools_cv_timer_create_works in + yes) AC_DEFINE([USE_TIMER_CREATE], 1, + [Define to 1 if we can use timer_create(CLOCK_PROCESS_CPUTIME_ID,...)]);; +esac +]) + +# FP_ARG_GMP +# ------------- +AC_DEFUN([FP_ARG_GMP], +[ +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]) +]) + +# 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/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 -no-user-package-conf --make ghc-pwd -o ghc-pwd + cd ../.. +fi + +hardtop=`utils/ghc-pwd/ghc-pwd` + +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 +]) + +# 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 +]) + +# 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" +]) + +# 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