1 # Extra autoconf macros for the Glasgow fptools
3 # To be a good autoconf citizen, names of local macros have prefixed with FP_ to
4 # ensure we don't clash with any pre-supplied autoconf ones.
7 # FPTOOLS_SET_PLATFORM_VARS
8 # ----------------------------------
9 # Set the platform variables
10 AC_DEFUN([FPTOOLS_SET_PLATFORM_VARS],
12 # If no argument was given for a configuration variable, then discard
13 # the guessed canonical system and use the configuration of the
14 # bootstrapping ghc. If an argument was given, map it from gnu format
17 # For why we do it this way, see: #3637, #1717, #2951
19 # In bindists, we haven't called AC_CANONICAL_{BUILD,HOST,TARGET}
20 # so this justs uses $bootstrap_target.
22 if test "$build_alias" = ""
24 if test "$bootstrap_target" != ""
26 build=$bootstrap_target
27 echo "Build platform inferred as: $build"
29 echo "Can't work out build platform"
33 BuildArch=`echo "$build" | sed 's/-.*//'`
34 BuildVendor=`echo "$build" | sed -e 's/.*-\(.*\)-.*/\1/'`
35 BuildOS=`echo "$build" | sed 's/.*-//'`
37 GHC_CONVERT_CPU([$build_cpu], [BuildArch])
38 GHC_CONVERT_VENDOR([$build_vendor], [BuildVendor])
39 GHC_CONVERT_OS([$build_os], [$BuildArch], [BuildOS])
42 if test "$host_alias" = ""
44 if test "$bootstrap_target" != ""
46 host=$bootstrap_target
47 echo "Host platform inferred as: $host"
49 echo "Can't work out host platform"
53 HostArch=`echo "$host" | sed 's/-.*//'`
54 HostVendor=`echo "$host" | sed -e 's/.*-\(.*\)-.*/\1/'`
55 HostOS=`echo "$host" | sed 's/.*-//'`
57 GHC_CONVERT_CPU([$host_cpu], [HostArch])
58 GHC_CONVERT_VENDOR([$host_vendor], [HostVendor])
59 GHC_CONVERT_OS([$host_os], [$HostArch], [HostOS])
62 if test "$target_alias" = ""
64 if test "$host_alias" != ""
66 GHC_CONVERT_CPU([$host_cpu], [TargetArch])
67 GHC_CONVERT_VENDOR([$host_vendor], [TargetVendor])
68 GHC_CONVERT_OS([$host_os], [$TargetArch],[TargetOS])
70 if test "$bootstrap_target" != ""
72 target=$bootstrap_target
73 echo "Target platform inferred as: $target"
75 echo "Can't work out target platform"
79 TargetArch=`echo "$target" | sed 's/-.*//'`
80 TargetVendor=`echo "$target" | sed -e 's/.*-\(.*\)-.*/\1/'`
81 TargetOS=`echo "$target" | sed 's/.*-//'`
84 GHC_CONVERT_CPU([$target_cpu], [TargetArch])
85 GHC_CONVERT_VENDOR([$target_vendor], [TargetVendor])
86 GHC_CONVERT_OS([$target_os], [$TargetArch], [TargetOS])
94 AC_MSG_WARN([GHC does not support the Cygwin target at the moment])
95 AC_MSG_WARN([I'm assuming you wanted to build for i386-unknown-mingw32])
103 i386-apple-darwin|powerpc-apple-darwin)
111 BuildPlatform="$BuildArch-$BuildVendor-$BuildOS"
112 BuildPlatform_CPP=`echo "$BuildPlatform" | sed -e 's/\./_/g' -e 's/-/_/g'`
113 BuildArch_CPP=` echo "$BuildArch" | sed -e 's/\./_/g' -e 's/-/_/g'`
114 BuildVendor_CPP=` echo "$BuildVendor" | sed -e 's/\./_/g' -e 's/-/_/g'`
115 BuildOS_CPP=` echo "$BuildOS" | sed -e 's/\./_/g' -e 's/-/_/g'`
117 HostPlatform="$HostArch-$HostVendor-$HostOS"
118 HostPlatform_CPP=`echo "$HostPlatform" | sed -e 's/\./_/g' -e 's/-/_/g'`
119 HostArch_CPP=` echo "$HostArch" | sed -e 's/\./_/g' -e 's/-/_/g'`
120 HostVendor_CPP=` echo "$HostVendor" | sed -e 's/\./_/g' -e 's/-/_/g'`
121 HostOS_CPP=` echo "$HostOS" | sed -e 's/\./_/g' -e 's/-/_/g'`
123 TargetPlatform="$TargetArch-$TargetVendor-$TargetOS"
124 TargetPlatform_CPP=`echo "$TargetPlatform" | sed -e 's/\./_/g' -e 's/-/_/g'`
125 TargetArch_CPP=` echo "$TargetArch" | sed -e 's/\./_/g' -e 's/-/_/g'`
126 TargetVendor_CPP=` echo "$TargetVendor" | sed -e 's/\./_/g' -e 's/-/_/g'`
127 TargetOS_CPP=` echo "$TargetOS" | sed -e 's/\./_/g' -e 's/-/_/g'`
129 echo "GHC build : $BuildPlatform"
130 echo "GHC host : $HostPlatform"
131 echo "GHC target : $TargetPlatform"
133 AC_SUBST(BuildPlatform)
134 AC_SUBST(HostPlatform)
135 AC_SUBST(TargetPlatform)
136 AC_SUBST(HostPlatform_CPP)
137 AC_SUBST(BuildPlatform_CPP)
138 AC_SUBST(TargetPlatform_CPP)
140 AC_SUBST(HostArch_CPP)
141 AC_SUBST(BuildArch_CPP)
142 AC_SUBST(TargetArch_CPP)
145 AC_SUBST(BuildOS_CPP)
146 AC_SUBST(TargetOS_CPP)
148 AC_SUBST(HostVendor_CPP)
149 AC_SUBST(BuildVendor_CPP)
150 AC_SUBST(TargetVendor_CPP)
157 # FPTOOLS_SET_HASKELL_PLATFORM_VARS
158 # ----------------------------------
159 # Set the Haskell platform variables
160 AC_DEFUN([FPTOOLS_SET_HASKELL_PLATFORM_VARS],
165 test -z "[$]2" || eval "[$]2=ArchX86"
168 test -z "[$]2" || eval "[$]2=ArchX86_64"
171 test -z "[$]2" || eval "[$]2=ArchPPC"
174 test -z "[$]2" || eval "[$]2=ArchPPC_64"
177 test -z "[$]2" || eval "[$]2=ArchSPARC"
181 test -z "[$]2" || eval "[$]2=\"ArchARM {armISA = \$ARM_ISA, armISAExt = \$ARM_ISA_EXT, armABI = \$ARM_ABI}\""
184 test -z "[$]2" || eval "[$]2=ArchAlpha"
187 test -z "[$]2" || eval "[$]2=ArchMipseb"
190 test -z "[$]2" || eval "[$]2=ArchMipsel"
192 hppa|hppa1_1|ia64|m68k|rs6000|s390|s390x|sparc64|vax)
193 test -z "[$]2" || eval "[$]2=ArchUnknown"
196 echo "Unknown arch [$]1"
204 dec|unknown|hp|apple|next|sun|sgi|ibm|montavista|portbld)
207 echo "Unknown vendor [$]1"
216 test -z "[$]2" || eval "[$]2=OSLinux"
219 test -z "[$]2" || eval "[$]2=OSiOS"
222 test -z "[$]2" || eval "[$]2=OSDarwin"
225 test -z "[$]2" || eval "[$]2=OSSolaris2"
228 test -z "[$]2" || eval "[$]2=OSMinGW32"
231 test -z "[$]2" || eval "[$]2=OSFreeBSD"
234 test -z "[$]2" || eval "[$]2=OSDragonFly"
237 test -z "[$]2" || eval "[$]2=OSKFreeBSD"
240 test -z "[$]2" || eval "[$]2=OSOpenBSD"
243 test -z "[$]2" || eval "[$]2=OSNetBSD"
246 test -z "[$]2" || eval "[$]2=OSHaiku"
249 test -z "[$]2" || eval "[$]2=OSOsf3"
252 test -z "[$]2" || eval "[$]2=OSQNXNTO"
254 dragonfly|osf1|hpux|linuxaout|freebsd2|cygwin32|gnu|nextstep2|nextstep3|sunos4|ultrix|irix|aix)
255 test -z "[$]2" || eval "[$]2=OSUnknown"
258 test -z "[$]2" || eval "[$]2=OSAndroid"
261 echo "Unknown OS '[$]1'"
267 dnl ** check for Apple-style dead-stripping support
268 dnl (.subsections-via-symbols assembler directive)
270 AC_MSG_CHECKING(for .subsections_via_symbols)
272 [AC_LANG_PROGRAM([], [__asm__ (".subsections_via_symbols");])],
274 HaskellHaveSubsectionsViaSymbols=True
275 AC_DEFINE([HAVE_SUBSECTIONS_VIA_SYMBOLS],[1],
276 [Define to 1 if Apple-style dead-stripping is supported.])
278 [HaskellHaveSubsectionsViaSymbols=False
281 dnl ** check for .ident assembler directive
283 AC_MSG_CHECKING(whether your assembler supports .ident directive)
285 [AC_LANG_SOURCE([__asm__ (".ident \"GHC x.y.z\"");])],
287 HaskellHaveIdentDirective=True],
289 HaskellHaveIdentDirective=False])
291 dnl *** check for GNU non-executable stack note support (ELF only)
292 dnl (.section .note.GNU-stack,"",@progbits)
294 dnl This test doesn't work with "gcc -g" in gcc 4.4 (GHC trac #3889:
295 dnl Error: can't resolve `.note.GNU-stack' {.note.GNU-stack section} - `.Ltext0' {.text section}
296 dnl so we empty CFLAGS while running this test
299 AC_MSG_CHECKING(for GNU non-executable stack support)
301 [AC_LANG_PROGRAM([__asm__ (".section .note.GNU-stack,\"\",@progbits");], [0])],
303 HaskellHaveGnuNonexecStack=True],
305 HaskellHaveGnuNonexecStack=False])
308 checkArch "$BuildArch" "HaskellBuildArch"
309 checkVendor "$BuildVendor"
310 checkOS "$BuildOS" ""
312 checkArch "$HostArch" "HaskellHostArch"
313 checkVendor "$HostVendor"
316 checkArch "$TargetArch" "HaskellTargetArch"
317 checkVendor "$TargetVendor"
318 checkOS "$TargetOS" "HaskellTargetOs"
320 AC_SUBST(HaskellTargetArch)
321 AC_SUBST(HaskellTargetOs)
322 AC_SUBST(HaskellHaveSubsectionsViaSymbols)
323 AC_SUBST(HaskellHaveIdentDirective)
324 AC_SUBST(HaskellHaveGnuNonexecStack)
329 # ----------------------------------
330 # Get info about the ISA on the ARM arch
331 AC_DEFUN([GET_ARM_ISA],
336 [#if defined(__ARM_ARCH_2__) || \
337 defined(__ARM_ARCH_3__) || \
338 defined(__ARM_ARCH_3M__) || \
339 defined(__ARM_ARCH_4__) || \
340 defined(__ARM_ARCH_4T__) || \
341 defined(__ARM_ARCH_5__) || \
342 defined(__ARM_ARCH_5T__) || \
343 defined(__ARM_ARCH_5E__) || \
344 defined(__ARM_ARCH_5TE__)
350 [AC_DEFINE(arm_HOST_ARCH_PRE_ARMv6, 1, [ARM pre v6])
351 AC_DEFINE(arm_HOST_ARCH_PRE_ARMv7, 1, [ARM pre v7])
361 [#if defined(__ARM_ARCH_6__) || \
362 defined(__ARM_ARCH_6J__) || \
363 defined(__ARM_ARCH_6T2__) || \
364 defined(__ARM_ARCH_6Z__) || \
365 defined(__ARM_ARCH_6ZK__) || \
366 defined(__ARM_ARCH_6M__)
372 [AC_DEFINE(arm_HOST_ARCH_PRE_ARMv7, 1, [ARM pre v7])
377 [#if defined(__VFP_FP__)
384 ARM_ISA_EXT="[VFPv2]"
394 ARM_ISA_EXT="[VFPv3,NEON]"
402 [#if defined(__SOFTFP__)
415 [#if defined(__ARM_PCS_VFP)
429 # ----------------------------------
430 # Set the variables used in the settings file
431 AC_DEFUN([FP_SETTINGS],
433 if test "$windows" = YES
435 mingw_bin_prefix=mingw/bin/
436 SettingsCCompilerCommand="\$topdir/../${mingw_bin_prefix}gcc.exe"
437 SettingsLdCommand="\$topdir/../${mingw_bin_prefix}ld.exe"
438 SettingsArCommand="\$topdir/../${mingw_bin_prefix}ar.exe"
439 SettingsPerlCommand='$topdir/../perl/perl.exe'
440 SettingsDllWrapCommand="\$topdir/../${mingw_bin_prefix}dllwrap.exe"
441 SettingsWindresCommand="\$topdir/../${mingw_bin_prefix}windres.exe"
442 SettingsTouchCommand='$topdir/touchy.exe'
444 SettingsCCompilerCommand="$WhatGccIsCalled"
445 SettingsLdCommand="$LdCmd"
446 SettingsArCommand="$ArCmd"
447 SettingsPerlCommand="$PerlCmd"
448 SettingsDllWrapCommand="/bin/false"
449 SettingsWindresCommand="/bin/false"
450 SettingsTouchCommand='touch'
453 SettingsLlcCommand="llc"
455 SettingsLlcCommand="$LlcCmd"
459 SettingsOptCommand="opt"
461 SettingsOptCommand="$OptCmd"
464 SettingsCCompilerFlags="$CONF_CC_OPTS_STAGE2"
465 SettingsCCompilerLinkFlags="$CONF_GCC_LINKER_OPTS_STAGE2"
466 SettingsLdFlags="$CONF_LD_LINKER_OPTS_STAGE2"
467 AC_SUBST(SettingsCCompilerCommand)
468 AC_SUBST(SettingsCCompilerFlags)
469 AC_SUBST(SettingsCCompilerLinkFlags)
470 AC_SUBST(SettingsLdCommand)
471 AC_SUBST(SettingsLdFlags)
472 AC_SUBST(SettingsArCommand)
473 AC_SUBST(SettingsPerlCommand)
474 AC_SUBST(SettingsDllWrapCommand)
475 AC_SUBST(SettingsWindresCommand)
476 AC_SUBST(SettingsTouchCommand)
477 AC_SUBST(SettingsLlcCommand)
478 AC_SUBST(SettingsOptCommand)
482 # FPTOOLS_SET_C_LD_FLAGS
483 # ----------------------------------
484 # Set the C, LD and CPP flags for a given platform
486 # $2 is the name of the CC flags variable
487 # $3 is the name of the linker flags variable when linking with gcc
488 # $4 is the name of the linker flags variable when linking with ld
489 # $5 is the name of the CPP flags variable
490 AC_DEFUN([FPTOOLS_SET_C_LD_FLAGS],
492 AC_MSG_CHECKING([Setting up $2, $3, $4 and $5])
503 $4="$$4 -arch x86_64"
507 # For now, to suppress the gcc warning "call-clobbered
508 # register used for global register variable", we simply
509 # disable all warnings altogether using the -w flag. Oh well.
510 $2="$$2 -w -mieee -D_REENTRANT"
511 $3="$$3 -w -mieee -D_REENTRANT"
512 $5="$$5 -w -mieee -D_REENTRANT"
515 # ___HPUX_SOURCE, not _HPUX_SOURCE, is #defined if -ansi!
516 # (very nice, but too bad the HP /usr/include files don't agree.)
517 $2="$$2 -D_HPUX_SOURCE"
518 $3="$$3 -D_HPUX_SOURCE"
519 $5="$$5 -D_HPUX_SOURCE"
523 # If gcc knows about the stack protector, turn it off.
524 # Otherwise the stack-smash handler gets triggered.
525 echo 'int main(void) {return 0;}' > conftest.c
526 if $CC -c conftest.c -fno-stack-protector > /dev/null 2>&1
528 $2="$$2 -fno-stack-protector"
531 # Reduce memory usage when linking. See trac #5240.
532 if test -n "$LdHashSize31"
534 $3="$$3 -Wl,$LdHashSize31"
535 $4="$$4 $LdHashSize31"
537 if test -n "$LdReduceMemoryOverheads"
539 $3="$$3 -Wl,$LdReduceMemoryOverheads"
540 $4="$$4 $LdReduceMemoryOverheads"
543 rm -f conftest.c conftest.o
544 AC_MSG_RESULT([done])
548 AC_DEFUN([FP_PATH_PROG],[
549 AC_PATH_PROG($1,$2,$3,$4,$5,$6)
550 # If we have a cygwin path for something, and we try to run it
551 # from cabal or python, then it'll fail. So we convert to a
553 if test "$HostOS" = "mingw32" && \
554 test "${OSTYPE}" != "msys" && \
557 # Canonicalise to <drive>:/path/to/gcc
558 $1=`cygpath -m "${$1}"`
563 # FP_VISIBILITY_HIDDEN
564 # ----------------------------------
565 # Is the visibility hidden attribute supported?
566 AC_DEFUN([FP_VISIBILITY_HIDDEN],
568 AC_MSG_CHECKING([whether __attribute__((visibility("hidden"))) is supported])
569 echo '__attribute__((visibility("hidden"))) void foo(void) {}' > conftest.c
570 if $CC -Wall -Werror -c conftest.c > /dev/null 2>&1
573 AC_DEFINE(HAS_VISIBILITY_HIDDEN, 1, [Has visibility hidden])
577 rm -f conftest.c conftest.o
581 # FPTOOLS_FLOAT_WORD_ORDER_BIGENDIAN
582 # ----------------------------------
583 # Little endian ARM on Linux with some ABIs has big endian word order
584 # in doubles. Define FLOAT_WORDS_BIGENDIAN if this is the case.
585 AC_DEFUN([FPTOOLS_FLOAT_WORD_ORDER_BIGENDIAN],
586 [AC_CACHE_CHECK([whether float word order is big endian], [fptools_cv_float_word_order_bigendian],
589 [#include <endian.h>],
590 [#if defined(__FLOAT_WORD_ORDER) && __FLOAT_WORD_ORDER == BIG_ENDIAN
593 not float word order big endian
596 [fptools_cv_float_word_order_bigendian=yes],
597 [fptools_cv_float_word_order_bigendian=no])
599 case $fptools_cv_float_word_order_bigendian in
601 AC_DEFINE([FLOAT_WORDS_BIGENDIAN], 1,
602 [Define to 1 if your processor stores words of floats with
603 the most significant byte first]) ;;
608 # FP_ARG_WITH_PATH_GNU_PROG
609 # --------------------
610 # Find the specified command on the path or allow a user to set it manually
611 # with a --with-<command> option. An error will be thrown if the command isn't
614 # This is ignored on the mingw32 platform.
616 # $1 = the variable to set
617 # $2 = the with option name
618 # $3 = the command to look for
620 AC_DEFUN([FP_ARG_WITH_PATH_GNU_PROG],
623 [AC_HELP_STRING([--with-$2=ARG],
624 [Use ARG as the path to $2 [default=autodetect]])],
626 if test "$HostOS" = "mingw32"
628 AC_MSG_WARN([Request to use $withval will be ignored])
634 if test "$HostOS" != "mingw32"
636 if test "$target_alias" = "" ; then
637 AC_PATH_PROG([$1], [$3])
639 AC_PATH_PROG([$1], [$target_alias-$3])
643 AC_MSG_ERROR([cannot find $3 in your PATH])
648 ]) # FP_ARG_WITH_PATH_GNU_PROG
651 # FP_ARG_WITH_PATH_GNU_PROG_OPTIONAL
652 # --------------------
653 # Same as FP_ARG_WITH_PATH_GNU_PROG but no error will be thrown if the command
656 # This is ignored on the mingw32 platform.
658 # $1 = the variable to set
659 # $2 = the with option name
660 # $3 = the command to look for
662 AC_DEFUN([FP_ARG_WITH_PATH_GNU_PROG_OPTIONAL],
665 [AC_HELP_STRING([--with-$2=ARG],
666 [Use ARG as the path to $2 [default=autodetect]])],
668 if test "$HostOS" = "mingw32"
670 AC_MSG_WARN([Request to use $withval will be ignored])
676 if test "$HostOS" != "mingw32"
678 AC_PATH_PROG([$1], [$3])
682 ]) # FP_ARG_WITH_PATH_GNU_PROG_OPTIONAL
684 # FP_PROG_CONTEXT_DIFF
685 # --------------------
686 # Figure out how to do context diffs. Sets the output variable ContextDiffCmd.
688 # Note: NeXTStep thinks diff'ing a file against itself is "trouble".
690 # Used by ghc, glafp-utils/ltx, and glafp-utils/runstdtest.
691 AC_DEFUN([FP_PROG_CONTEXT_DIFF],
692 [AC_CACHE_CHECK([for a working context diff], [fp_cv_context_diff],
693 [echo foo > conftest1
695 fp_cv_context_diff=no
696 for fp_var in '-U 1' '-u1' '-C 1' '-c1'
698 if diff $fp_var conftest1 conftest2 > /dev/null 2>&1; then
699 fp_cv_context_diff="diff $fp_var"
703 if test x"$fp_cv_context_diff" = xno; then
704 AC_MSG_ERROR([cannot figure out how to do context diffs])
706 AC_SUBST(ContextDiffCmd, [$fp_cv_context_diff])
707 ])# FP_PROG_CONTEXT_DIFF
710 # FP_COMPUTE_INT(EXPRESSION, VARIABLE, INCLUDES, IF-FAILS)
711 # --------------------------------------------------------
712 # Assign VARIABLE the value of the compile-time EXPRESSION using INCLUDES for
713 # compilation. Execute IF-FAILS when unable to determine the value. Works for
714 # cross-compilation, too.
716 # Implementation note: We are lazy and use an internal autoconf macro, but it
717 # is supported in autoconf versions 2.50 up to the actual 2.57, so there is
719 AC_DEFUN([FP_COMPUTE_INT],
720 [_AC_COMPUTE_INT([$1], [$2], [$3], [$4])[]dnl
724 # FP_CHECK_ALIGNMENT(TYPE, [IGNORED], [INCLUDES = DEFAULT-INCLUDES])
725 # ------------------------------------------------------------------
726 # A variation of AC_CHECK_SIZEOF for computing the alignment restrictions of a
727 # given type. Defines ALIGNMENT_TYPE.
728 AC_DEFUN([FP_CHECK_ALIGNMENT],
729 [AS_LITERAL_IF(m4_translit([[$1]], [*], [p]), [],
730 [AC_FATAL([$0: requires literal arguments])])[]dnl
731 AC_CHECK_TYPE([$1], [], [], [$3])[]dnl
732 m4_pushdef([fp_Cache], [AS_TR_SH([fp_cv_alignment_$1])])[]dnl
733 AC_CACHE_CHECK([alignment of $1], [fp_Cache],
734 [if test "$AS_TR_SH([ac_cv_type_$1])" = yes; then
735 FP_COMPUTE_INT([offsetof(struct { char c; $1 ty; },ty)],
737 [AC_INCLUDES_DEFAULT([$3])],
738 [AC_MSG_ERROR([cannot compute alignment ($1)
739 See `config.log' for more details.], [77])])
743 AC_DEFINE_UNQUOTED(AS_TR_CPP(alignment_$1), $fp_Cache, [The alignment of a `$1'.])[]dnl
744 m4_popdef([fp_Cache])[]dnl
745 ])# FP_CHECK_ALIGNMENT
748 # FP_LEADING_UNDERSCORE
749 # ---------------------
750 # Test for determining whether symbol names have a leading underscore. We assume
751 # that they _haven't_ if anything goes wrong. Sets the output variable
752 # LeadingUnderscore to YES or NO and defines LEADING_UNDERSCORE correspondingly.
754 # Some nlist implementations seem to try to be compatible by ignoring a leading
755 # underscore sometimes (eg. FreeBSD). We therefore have to work around this by
756 # checking for *no* leading underscore first. Sigh. --SDM
758 # Similarly on OpenBSD, but this test doesn't help. -- dons
759 AC_DEFUN([FP_LEADING_UNDERSCORE],
760 [AC_CHECK_LIB([elf], [nlist], [LIBS="-lelf $LIBS"])
761 AC_CACHE_CHECK([leading underscore in symbol names], [fptools_cv_leading_underscore], [
762 # Hack!: nlist() under Digital UNIX insist on there being an _,
763 # but symbol table listings shows none. What is going on here?!?
765 # Another hack: cygwin doesn't come with nlist.h , so we hardwire
766 # the underscoredness of that "platform"
767 case $HostPlatform in
768 *openbsd*) # x86 openbsd is ELF from 3.4 >, meaning no leading uscore
770 i386-*2\.@<:@0-9@:>@ | i386-*3\.@<:@0-3@:>@ ) fptools_cv_leading_underscore=yes ;;
771 *) fptools_cv_leading_underscore=no ;;
773 alpha-dec-osf*) fptools_cv_leading_underscore=no;;
774 *cygwin32) fptools_cv_leading_underscore=yes;;
775 i386-unknown-mingw32) fptools_cv_leading_underscore=yes;;
776 x86_64-unknown-mingw32) fptools_cv_leading_underscore=no;;
778 # HACK: Apple doesn't seem to provide nlist in the 64-bit-libraries
779 x86_64-apple-darwin*) fptools_cv_leading_underscore=yes;;
780 *-apple-ios) fptools_cv_leading_underscore=yes;;
782 *) AC_RUN_IFELSE([AC_LANG_SOURCE([[#ifdef HAVE_NLIST_H
784 struct nlist xYzzY1[] = {{"xYzzY1", 0},{0}};
785 struct nlist xYzzY2[] = {{"_xYzzY2", 0},{0}};
793 if(nlist(argv[0], xYzzY1) == 0 && xYzzY1[0].n_value != 0)
795 if(nlist(argv[0], xYzzY2) == 0 && xYzzY2[0].n_value != 0)
799 }]])],[fptools_cv_leading_underscore=yes],[fptools_cv_leading_underscore=no],[fptools_cv_leading_underscore=no])
802 AC_SUBST([LeadingUnderscore], [`echo $fptools_cv_leading_underscore | sed 'y/yesno/YESNO/'`])
803 if test x"$fptools_cv_leading_underscore" = xyes; then
804 AC_DEFINE([LEADING_UNDERSCORE], [1], [Define to 1 if C symbols have a leading underscore added by the compiler.])
805 fi])# FP_LEADING_UNDERSCORE
808 # FP_COMPARE_VERSIONS(VERSION1, TEST, VERSION2, [ACTION-IF-TRUE], [ACTION-IF-FALSE])
809 # ----------------------------------------------------------------------------------
810 # Compare dotted version numbers VERSION1 and VERSION2 lexicographically according
811 # to TEST (one of -eq, -ne, -lt, -le, -gt, or -ge).
812 AC_DEFUN([FP_COMPARE_VERSIONS],
813 [fp_version1=$1; fp_version2=$3
814 fp_save_IFS=$IFS; IFS='.'
815 while test x"$fp_version1" != x || test x"$fp_version2" != x
818 set dummy $fp_version1; shift
820 test $[@%:@] = 0 || { fp_num1="[$]1"; shift; }
821 test x"$fp_num1" = x && fp_num1="0"
824 set dummy $fp_version2; shift
826 test $[@%:@] = 0 || { fp_num2="[$]1"; shift; }
827 test x"$fp_num2" = x && fp_num2="0"
830 test "$fp_num1" = "$fp_num2" || break;
833 AS_IF([test "$fp_num1" $2 "$fp_num2"], [$4], [$5])[]dnl
834 ])# FP_COMPARE_VERSIONS
838 dnl Check for Happy and version. If we're building GHC, then we need
839 dnl at least Happy version 1.14. If there's no installed Happy, we look
840 dnl for a happy source tree and point the build system at that instead.
842 AC_DEFUN([FPTOOLS_HAPPY],
843 [FP_PATH_PROG(HappyCmd,happy,)
845 AC_CACHE_CHECK([for version of happy], fptools_cv_happy_version,
847 [if test x"$HappyCmd" != x; then
848 fptools_cv_happy_version=`"$HappyCmd" -v |
849 grep 'Happy Version' | sed -e 's/Happy Version \([^ ]*\).*/\1/g'` ;
851 fptools_cv_happy_version="";
855 if test ! -f compiler/parser/Parser.hs || test ! -f compiler/cmm/CmmParse.hs || test ! -f compiler/parser/ParserCore.hs
857 FP_COMPARE_VERSIONS([$fptools_cv_happy_version],[-lt],[1.16],
858 [AC_MSG_ERROR([Happy version 1.16 or later is required to compile GHC.])])[]
860 HappyVersion=$fptools_cv_happy_version;
861 AC_SUBST(HappyVersion)
865 dnl Check for Alex and version. If we're building GHC, then we need
866 dnl at least Alex version 2.1.1.
868 AC_DEFUN([FPTOOLS_ALEX],
870 FP_PATH_PROG(AlexCmd,alex,)
872 AC_CACHE_CHECK([for version of alex], fptools_cv_alex_version,
874 [if test x"$AlexCmd" != x; then
875 fptools_cv_alex_version=`"$AlexCmd" -v |
876 grep 'Alex [Vv]ersion' | sed -e 's/Alex [Vv]ersion \([0-9\.]*\).*/\1/g'` ;
878 fptools_cv_alex_version="";
882 FP_COMPARE_VERSIONS([$fptools_cv_alex_version],[-ge],[3.0],
883 [Alex3=YES],[Alex3=NO])
884 if test ! -f compiler/cmm/CmmLex.hs || test ! -f compiler/parser/Lexer.hs
886 FP_COMPARE_VERSIONS([$fptools_cv_alex_version],[-lt],[2.1.0],
887 [AC_MSG_ERROR([Alex version 2.1.0 or later is required to compile GHC.])])[]
889 if test ! -f utils/haddock/src/Haddock/Lex.hs
891 FP_COMPARE_VERSIONS([$fptools_cv_alex_version],[-lt],[3.0],
892 [AC_MSG_ERROR([Alex version 3.0 or later is required to compile Haddock.])])[]
894 AlexVersion=$fptools_cv_alex_version;
895 AC_SUBST(AlexVersion)
902 # Sets the output variable $2 to $1 if ld supports the $1 flag.
903 # Otherwise the variable's value is empty.
904 AC_DEFUN([FP_PROG_LD_FLAG],
906 AC_CACHE_CHECK([whether ld understands $1], [fp_cv_$2],
907 [echo 'int foo() { return 0; }' > conftest.c
908 ${CC-cc} -c conftest.c
909 if ${LdCmd} -r $1 -o conftest2.o conftest.o > /dev/null 2>&1; then
919 # FP_PROG_LD_HashSize31
921 # Sets the output variable LdHashSize31 to --hash-size=31 if ld supports
922 # this flag. Otherwise the variable's value is empty.
923 AC_DEFUN([FP_PROG_LD_HashSize31],
925 FP_PROG_LD_FLAG([--hash-size=31],[LdHashSize31])
926 ])# FP_PROG_LD_HashSize31
929 # FP_PROG_LD_ReduceMemoryOverheads
931 # Sets the output variable LdReduceMemoryOverheads to
932 # --reduce-memory-overheads if ld supports this flag.
933 # Otherwise the variable's value is empty.
934 AC_DEFUN([FP_PROG_LD_ReduceMemoryOverheads],
936 FP_PROG_LD_FLAG([--reduce-memory-overheads],[LdReduceMemoryOverheads])
937 ])# FP_PROG_LD_ReduceMemoryOverheads
940 # FP_PROG_LD_BUILD_ID
943 # Sets the output variable LdHasBuildId to YES if ld supports
944 # --build-id, or NO otherwise.
945 AC_DEFUN([FP_PROG_LD_BUILD_ID],
947 AC_CACHE_CHECK([whether ld understands --build-id], [fp_cv_ld_build_id],
948 [echo 'int foo() { return 0; }' > conftest.c
949 ${CC-cc} -c conftest.c
950 if ${LdCmd} -r --build-id=none -o conftest2.o conftest.o > /dev/null 2>&1; then
951 fp_cv_ld_build_id=yes
956 if test "$fp_cv_ld_build_id" = yes; then
961 AC_SUBST([LdHasBuildId])
962 ])# FP_PROG_LD_BUILD_ID
967 # Sets the output variable LdIsGNULd to YES or NO, depending on whether it is
969 AC_DEFUN([FP_PROG_LD_IS_GNU],
971 AC_CACHE_CHECK([whether ld is GNU ld], [fp_cv_gnu_ld],
972 [if ${LdCmd} --version 2> /dev/null | grep "GNU" > /dev/null 2>&1; then
977 AC_SUBST([LdIsGNULd], [`echo $fp_cv_gnu_ld | sed 'y/yesno/YESNO/'`])
978 ])# FP_PROG_LD_IS_GNU
981 # FP_PROG_LD_NO_COMPACT_UNWIND
982 # ----------------------------
984 # Sets the output variable LdHasNoCompactUnwind to YES if ld supports
985 # -no_compact_unwind, or NO otherwise.
986 AC_DEFUN([FP_PROG_LD_NO_COMPACT_UNWIND],
988 AC_CACHE_CHECK([whether ld understands -no_compact_unwind], [fp_cv_ld_no_compact_unwind],
989 [echo 'int foo() { return 0; }' > conftest.c
990 ${CC-cc} -c conftest.c
991 if ${LdCmd} -r -no_compact_unwind -o conftest2.o conftest.o > /dev/null 2>&1; then
992 fp_cv_ld_no_compact_unwind=yes
994 fp_cv_ld_no_compact_unwind=no
997 if test "$fp_cv_ld_no_compact_unwind" = yes; then
998 LdHasNoCompactUnwind=YES
1000 LdHasNoCompactUnwind=NO
1002 AC_SUBST([LdHasNoCompactUnwind])
1003 ])# FP_PROG_LD_NO_COMPACT_UNWIND
1006 # FP_PROG_LD_FILELIST
1007 # -------------------
1009 # Sets the output variable LdHasFilelist to YES if ld supports
1010 # -filelist, or NO otherwise.
1011 AC_DEFUN([FP_PROG_LD_FILELIST],
1013 AC_CACHE_CHECK([whether ld understands -filelist], [fp_cv_ld_has_filelist],
1015 echo 'int foo() { return 0; }' > conftest1.c
1016 echo 'int bar() { return 0; }' > conftest2.c
1017 ${CC-cc} -c conftest1.c
1018 ${CC-cc} -c conftest2.c
1019 echo conftest1.o > conftest.o-files
1020 echo conftest2.o >> conftest.o-files
1021 if ${LdCmd} -r -filelist conftest.o-files -o conftest.o > /dev/null 2>&1
1023 fp_cv_ld_has_filelist=yes
1025 fp_cv_ld_has_filelist=no
1029 if test "$fp_cv_ld_has_filelist" = yes; then
1034 AC_SUBST([LdHasFilelist])
1035 ])# FP_PROG_LD_FILELIST
1040 # Sets fp_prog_ar to a (non-Cygwin) path to ar. Exits if no ar can be found
1041 AC_DEFUN([FP_PROG_AR],
1042 [FP_PATH_PROG([fp_prog_ar], [ar])
1043 if test -z "$fp_prog_ar"; then
1044 AC_MSG_ERROR([cannot find ar in your PATH, no idea how to make a library])
1051 # Sets fp_prog_ar_is_gnu to yes or no, depending on whether it is GNU ar or not.
1052 AC_DEFUN([FP_PROG_AR_IS_GNU],
1053 [AC_REQUIRE([FP_PROG_AR])
1054 AC_CACHE_CHECK([whether $fp_prog_ar is GNU ar], [fp_cv_prog_ar_is_gnu],
1055 [if "$fp_prog_ar" --version 2> /dev/null | grep "GNU" > /dev/null 2>&1; then
1056 fp_cv_prog_ar_is_gnu=yes
1058 fp_cv_prog_ar_is_gnu=no
1060 fp_prog_ar_is_gnu=$fp_cv_prog_ar_is_gnu
1061 AC_SUBST([ArIsGNUAr], [`echo $fp_prog_ar_is_gnu | tr 'a-z' 'A-Z'`])
1062 ])# FP_PROG_AR_IS_GNU
1065 # FP_PROG_AR_SUPPORTS_ATFILE
1067 # Sets fp_prog_ar_supports_atfile to yes or no, depending on whether
1068 # or not it supports the @file syntax
1069 AC_DEFUN([FP_PROG_AR_SUPPORTS_ATFILE],
1070 [AC_REQUIRE([FP_PROG_AR])
1071 AC_REQUIRE([FP_PROG_AR_ARGS])
1072 AC_CACHE_CHECK([whether $fp_prog_ar supports @file], [fp_cv_prog_ar_supports_atfile],
1076 echo conftest.file > conftest.atfile
1077 echo conftest.file >> conftest.atfile
1078 "$fp_prog_ar" $fp_prog_ar_args conftest.a @conftest.atfile > /dev/null 2>&1
1079 fp_prog_ar_supports_atfile_tmp=`"$fp_prog_ar" t conftest.a 2> /dev/null | grep -c conftest.file`
1081 if test "$fp_prog_ar_supports_atfile_tmp" -eq 2
1083 fp_cv_prog_ar_supports_atfile=yes
1085 fp_cv_prog_ar_supports_atfile=no
1087 fp_prog_ar_supports_atfile=$fp_cv_prog_ar_supports_atfile
1088 AC_SUBST([ArSupportsAtFile], [`echo $fp_prog_ar_supports_atfile | tr 'a-z' 'A-Z'`])
1089 ])# FP_PROG_AR_SUPPORTS_ATFILE
1093 # Sets fp_prog_ar_args to the arguments for ar and the output variable ArCmd
1094 # to a non-Cygwin invocation of ar including these arguments.
1095 AC_DEFUN([FP_PROG_AR_ARGS],
1096 [AC_REQUIRE([FP_PROG_AR_IS_GNU])
1097 AC_CACHE_CHECK([for ar arguments], [fp_cv_prog_ar_args],
1099 # GNU ar needs special treatment: it appears to have problems with
1100 # object files with the same name if you use the 's' modifier, but
1101 # simple 'ar q' works fine, and doesn't need a separate ranlib.
1102 if test $fp_prog_ar_is_gnu = yes; then
1103 fp_cv_prog_ar_args="q"
1105 touch conftest.dummy
1106 for fp_var in clqsZ clqs cqs clq cq ; do
1108 if "$fp_prog_ar" $fp_var conftest.a conftest.dummy > /dev/null 2> /dev/null; then
1109 fp_cv_prog_ar_args=$fp_var
1114 if test -z "$fp_cv_prog_ar_args"; then
1115 AC_MSG_ERROR([cannot figure out how to use your $fp_prog_ar])
1118 fp_prog_ar_args=$fp_cv_prog_ar_args
1119 AC_SUBST([ArCmd], ["$fp_prog_ar"])
1120 AC_SUBST([ArArgs], ["$fp_prog_ar_args"])
1125 # FP_PROG_AR_NEEDS_RANLIB
1126 # -----------------------
1127 # Sets the output variable RANLIB to "ranlib" if it is needed and found,
1128 # to "true" otherwise.
1129 AC_DEFUN([FP_PROG_AR_NEEDS_RANLIB],
1130 [AC_REQUIRE([FP_PROG_AR_IS_GNU])
1131 AC_REQUIRE([FP_PROG_AR_ARGS])
1132 AC_REQUIRE([AC_PROG_CC])
1133 AC_CACHE_CHECK([whether ranlib is needed], [fp_cv_prog_ar_needs_ranlib],
1134 [if test $fp_prog_ar_is_gnu = yes; then
1135 fp_cv_prog_ar_needs_ranlib=no
1136 elif echo $TargetPlatform | grep "^.*-apple-darwin$" > /dev/null 2> /dev/null; then
1137 # It's quite tedious to check for Apple's crazy timestamps in .a files,
1138 # so we hardcode it.
1139 fp_cv_prog_ar_needs_ranlib=yes
1140 elif echo $fp_prog_ar_args | grep "s" > /dev/null 2> /dev/null; then
1141 fp_cv_prog_ar_needs_ranlib=no
1143 fp_cv_prog_ar_needs_ranlib=yes
1145 if test $fp_cv_prog_ar_needs_ranlib = yes; then
1151 ])# FP_PROG_AR_NEEDS_RANLIB
1156 # Extra testing of the result AC_PROG_CC, testing the gcc version no. Sets the
1157 # output variable GccVersion.
1158 AC_DEFUN([FP_GCC_VERSION],
1159 [AC_REQUIRE([AC_PROG_CC])
1162 AC_MSG_ERROR([gcc is required])
1166 AC_CACHE_CHECK([version of gcc], [fp_cv_gcc_version],
1168 fp_cv_gcc_version="`$CC -v 2>&1 | grep 'version ' | sed -e 's/.*version [[^0-9]]*\([[0-9.]]*\).*/\1/g'`"
1169 FP_COMPARE_VERSIONS([$fp_cv_gcc_version], [-lt], [3.0],
1170 [AC_MSG_ERROR([Need at least gcc version 3.0 (3.4+ recommended)])])
1171 # See #2770: gcc 2.95 doesn't work any more, apparently. There probably
1172 # isn't a very good reason for that, but for now just make configure
1174 FP_COMPARE_VERSIONS([$fp_cv_gcc_version], [-lt], [3.4], GccLT34=YES)
1175 FP_COMPARE_VERSIONS([$fp_cv_gcc_version], [-lt], [4.6], GccLT46=YES)
1177 AC_SUBST([GccVersion], [$fp_cv_gcc_version])
1182 dnl Check to see if the C compiler is clang or llvm-gcc
1184 AC_DEFUN([FP_CC_LLVM_BACKEND],
1185 [AC_REQUIRE([AC_PROG_CC])
1186 AC_MSG_CHECKING([whether C compiler is clang])
1187 $CC -x c /dev/null -dM -E > conftest.txt 2>&1
1188 if grep "__clang__" conftest.txt >/dev/null 2>&1; then
1189 AC_SUBST([CC_CLANG_BACKEND], [1])
1190 AC_SUBST([CC_LLVM_BACKEND], [1])
1191 AC_MSG_RESULT([yes])
1194 AC_MSG_CHECKING([whether C compiler has an LLVM back end])
1195 if grep "__llvm__" conftest.txt >/dev/null 2>&1; then
1196 AC_SUBST([CC_CLANG_BACKEND], [0])
1197 AC_SUBST([CC_LLVM_BACKEND], [1])
1198 AC_MSG_RESULT([yes])
1200 AC_SUBST([CC_CLANG_BACKEND], [0])
1201 AC_SUBST([CC_LLVM_BACKEND], [0])
1209 dnl Small feature test for perl version. Assumes PerlCmd
1210 dnl contains path to perl binary.
1212 dnl (Perl versions prior to v5.6 does not contain the string "v5";
1213 dnl instead they display version strings such as "version 5.005".)
1215 AC_DEFUN([FPTOOLS_CHECK_PERL_VERSION],
1216 [$PerlCmd -v >conftest.out 2>&1
1217 if grep "v5" conftest.out >/dev/null 2>&1; then
1220 AC_MSG_ERROR([your version of perl probably won't work, try upgrading it.])
1226 # FP_CHECK_PROG(VARIABLE, PROG-TO-CHECK-FOR,
1227 # [VALUE-IF-NOT-FOUND], [PATH], [REJECT])
1228 # -----------------------------------------------------
1229 # HACK: A small wrapper around AC_CHECK_PROG, setting VARIABLE to the full path
1230 # of PROG-TO-CHECK-FOR when found.
1231 AC_DEFUN([FP_CHECK_PROG],
1232 [AC_CHECK_PROG([$1], [$2], [$as_dir/$ac_word$ac_exec_ext], [$3], [$4], [$5])][]dnl
1238 # Find a non-WinDoze version of the "find" utility.
1239 AC_DEFUN([FP_PROG_FIND],
1240 [AC_PATH_PROGS([fp_prog_find], [gfind find], find)
1241 echo foo > conftest.txt
1242 $fp_prog_find conftest.txt -print > conftest.out 2>&1
1243 if grep '^conftest.txt$' conftest.out > /dev/null 2>&1 ; then
1244 # OK, looks like a real "find".
1245 case $HostPlatform in
1247 if test x${OSTYPE} != xmsys
1249 fp_prog_find="`cygpath --mixed ${fp_prog_find}`"
1250 AC_MSG_NOTICE([normalized find command to $fp_prog_find])
1254 FindCmd="$fp_prog_find"
1256 # Found a poor WinDoze version of "find", ignore it.
1257 AC_MSG_WARN([$fp_prog_find looks like a non-*nix find, ignoring it])
1258 FP_CHECK_PROG([FindCmd], [find], [], [], [$fp_prog_find])
1260 rm -f conftest.txt conftest.out
1261 AC_SUBST([FindCmd])[]dnl
1267 # Find a Unix-like sort
1268 AC_DEFUN([FP_PROG_SORT],
1269 [AC_PATH_PROG([fp_prog_sort], [sort])
1270 echo conwip > conftest.txt
1271 $fp_prog_sort -f conftest.txt > conftest.out 2>&1
1272 if grep 'conwip' conftest.out > /dev/null 2>&1 ; then
1274 SortCmd="$fp_prog_sort"
1276 # Summink else..pick next one.
1277 AC_MSG_WARN([$fp_prog_sort looks like a non-*nix sort, ignoring it])
1278 FP_CHECK_PROG([SortCmd], [sort], [], [], [$fp_prog_sort])
1280 rm -f conftest.txt conftest.out
1281 AC_SUBST([SortCmd])[]dnl
1286 dnl FPTOOLS_NOCACHE_CHECK prints a message, then sets the
1287 dnl values of the second argument to the result of running
1288 dnl the commands given by the third. It does not cache its
1289 dnl result, so it is suitable for checks which should be
1292 AC_DEFUN([FPTOOLS_NOCACHE_CHECK],
1293 [AC_MSG_CHECKING([$1])
1295 AC_MSG_RESULT([$][$2])
1299 dnl FPTOOLS_GHC_VERSION(version)
1300 dnl FPTOOLS_GHC_VERSION(major, minor [, patchlevel])
1301 dnl FPTOOLS_GHC_VERSION(version, major, minor, patchlevel)
1303 dnl Test for version of installed ghc. Uses $GHC.
1304 dnl [original version pinched from c2hs]
1306 AC_DEFUN([FPTOOLS_GHC_VERSION],
1307 [FPTOOLS_NOCACHE_CHECK([version of ghc], [fptools_version_of_ghc],
1308 ["${WithGhc-ghc}" --version > conftestghc 2>&1
1309 cat conftestghc >&AS_MESSAGE_LOG_FD
1310 #Useless Use Of cat award...
1311 fptools_version_of_ghc=`cat conftestghc | sed -n -e 's/, patchlevel *\([[0-9]]\)/.\1/;s/.* version \([[0-9]][[0-9.]]*\).*/\1/p'`
1313 if test "[$]fptools_version_of_ghc" = ""
1315 fptools_version_of_ghc='unknown'
1317 fptools_version_of_ghc[_major]=`echo [$]fptools_version_of_ghc | sed -e 's/^\([[0-9]]\).*/\1/'`
1318 fptools_version_of_ghc[_minor]=`echo [$]fptools_version_of_ghc | sed -e 's/^[[0-9]]\.\([[0-9]]*\).*/\1/'`
1319 fptools_version_of_ghc[_pl]=`echo [$]fptools_version_of_ghc | sed -n -e 's/^[[0-9]]\.[[0-9]]*\.\([[0-9]]*\)/\1/p'`
1321 if test "[$]fptools_version_of_ghc[_pl]" = ""
1323 fptools_version_of_ghc[_all]="[$]fptools_version_of_ghc[_major].[$]fptools_version_of_ghc[_minor]"
1324 fptools_version_of_ghc[_pl]="0"
1326 fptools_version_of_ghc[_all]="[$]fptools_version_of_ghc[_major].[$]fptools_version_of_ghc[_minor].[$]fptools_version_of_ghc[_pl]"
1329 ifelse($#, [1], [dnl
1330 [$1]="[$]fptools_version_of_ghc[_all]"
1332 [$1]="[$]fptools_version_of_ghc[_major]"
1333 [$2]="[$]fptools_version_of_ghc[_minor]"
1335 [$1]="[$]fptools_version_of_ghc[_major]"
1336 [$2]="[$]fptools_version_of_ghc[_minor]"
1337 [$3]="[$]fptools_version_of_ghc[_pl]"
1339 [$1]="[$]fptools_version_of_ghc[_all]"
1340 [$2]="[$]fptools_version_of_ghc[_major]"
1341 [$3]="[$]fptools_version_of_ghc[_minor]"
1342 [$4]="[$]fptools_version_of_ghc[_pl]"
1348 # FP_CHECK_FUNC(FUNCTION, PROLOGUE, BODY, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
1349 # ---------------------------------------------------------------------------------
1350 # A variant of AC_CHECK_FUNCS, limited to a single FUNCTION, but with the
1351 # additional flexibility of specifying the PROLOGUE and BODY.
1352 AC_DEFUN([FP_CHECK_FUNC],
1353 [AS_VAR_PUSHDEF([fp_func], [fp_cv_func_$1])dnl
1354 AC_CACHE_CHECK([for $1], fp_func,
1355 [AC_LINK_IFELSE([AC_LANG_PROGRAM([$2], [$3])],
1356 [AS_VAR_SET(fp_func, yes)],
1357 [AS_VAR_SET(fp_func, no)])])
1358 AS_IF([test AS_VAR_GET(fp_func) = yes],
1359 [AC_DEFINE(AS_TR_CPP(HAVE_$1), [1],
1360 [Define to 1 if you have the `]$1[' function.]) $4],
1362 AS_VAR_POPDEF([fp_func])dnl
1366 # FP_GEN_DOCBOOK_XML
1367 # ------------------
1368 # Generates a DocBook XML V4.5 document in conftest.xml.
1370 # It took a lot of experimentation to find a document that will cause
1371 # xsltproc to fail with an error code when the relevant
1372 # stylesheets/DTDs are not found. I couldn't make xsltproc fail with
1373 # a single-file document, it seems a multi-file document is needed.
1376 AC_DEFUN([FP_GEN_DOCBOOK_XML],
1377 [rm -f conftest.xml conftest-book.xml
1378 cat > conftest.xml << EOF
1379 <?xml version="1.0" encoding="iso-8859-1"?>
1380 <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
1381 "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [[
1382 <!ENTITY conftest-book SYSTEM "conftest-book.xml">
1388 cat >conftest-book.xml << EOF
1389 <?xml version="1.0" encoding="iso-8859-1"?>
1390 <title>A DocBook “Test Document”</title>
1391 <chapter id="id-one">
1392 <title>A Chapter Title</title>
1393 <para>This is a paragraph, referencing <xref linkend="id-two"/>.</para>
1395 <chapter id="id-two">
1396 <title>Another Chapter Title</title>
1397 <para>This is another paragraph, referencing <xref linkend="id-one"/>.</para>
1400 ]) # FP_GEN_DOCBOOK_XML
1405 # Sets the output variable DblatexCmd to the full path of dblatex,
1406 # which we use for building PDF and PS docs.
1407 # DblatexCmd is empty if dblatex could not be found.
1408 AC_DEFUN([FP_PROG_DBLATEX],
1409 [FP_PATH_PROG([DblatexCmd], [dblatex])
1410 if test -z "$DblatexCmd"; then
1411 AC_MSG_WARN([cannot find dblatex in your PATH, you will not be able to build the PDF and PS documentation])
1418 # Sets the output variable XsltprocCmd to the full path of the XSLT processor
1419 # xsltproc. XsltprocCmd is empty if xsltproc could not be found.
1420 AC_DEFUN([FP_PROG_XSLTPROC],
1421 [FP_PATH_PROG([XsltprocCmd], [xsltproc])
1422 if test -z "$XsltprocCmd"; then
1423 AC_MSG_WARN([cannot find xsltproc in your PATH, you will not be able to build the HTML documentation])
1425 ])# FP_PROG_XSLTPROC
1429 # ----------------------------
1430 # Check that we can process a DocBook XML document to HTML using xsltproc.
1431 AC_DEFUN([FP_DOCBOOK_XSL],
1432 [AC_REQUIRE([FP_PROG_XSLTPROC])dnl
1433 if test -n "$XsltprocCmd"; then
1434 AC_CACHE_CHECK([for DocBook XSL stylesheet], fp_cv_dir_docbook_xsl,
1436 fp_cv_dir_docbook_xsl=no
1437 if $XsltprocCmd --nonet http://docbook.sourceforge.net/release/xsl/current/html/chunk.xsl conftest.xml > /dev/null 2>&1; then
1438 fp_cv_dir_docbook_xsl=yes
1442 if test x"$fp_cv_dir_docbook_xsl" = xno; then
1443 AC_MSG_WARN([cannot find DocBook XSL stylesheets, you will not be able to build the documentation])
1446 HAVE_DOCBOOK_XSL=YES
1448 AC_SUBST([HAVE_DOCBOOK_XSL])
1454 # Sets the output variable XmllintCmd to the full path of the XSLT processor
1455 # xmllint. XmllintCmd is empty if xmllint could not be found.
1456 AC_DEFUN([FP_PROG_XMLLINT],
1457 [FP_PATH_PROG([XmllintCmd], [xmllint])
1458 if test -z "$XmllintCmd"; then
1459 AC_MSG_WARN([cannot find xmllint in your PATH, you will not be able to validate your documentation])
1464 # FP_CHECK_DOCBOOK_DTD
1465 # --------------------
1466 AC_DEFUN([FP_CHECK_DOCBOOK_DTD],
1467 [AC_REQUIRE([FP_PROG_XMLLINT])dnl
1468 if test -n "$XmllintCmd"; then
1469 AC_MSG_CHECKING([for DocBook DTD])
1471 if $XmllintCmd --nonet --valid --noout conftest.xml ; then
1474 AC_MSG_RESULT([failed])
1475 AC_MSG_WARN([cannot find a DTD for DocBook XML V4.5, you will not be able to validate your documentation])
1476 AC_MSG_WARN([check your XML_CATALOG_FILES environment variable and/or /etc/xml/catalog])
1480 ])# FP_CHECK_DOCBOOK_DTD
1485 # Try to find a ghc-pkg matching the ghc mentioned in the environment variable
1486 # WithGhc. Sets the output variable GhcPkgCmd.
1487 AC_DEFUN([FP_PROG_GHC_PKG],
1488 [AC_CACHE_CHECK([for ghc-pkg matching $WithGhc], fp_cv_matching_ghc_pkg,
1490 # If we are told to use ghc-stage2, then we're using an in-tree
1491 # compiler. In this case, we just want ghc-pkg, not ghc-pkg-stage2,
1492 # so we sed off -stage[0-9]$. However, if we are told to use
1493 # ghc-6.12.1 then we want to use ghc-pkg-6.12.1, so we keep any
1495 fp_ghc_pkg_guess=`echo $WithGhc | sed -e 's/-stage@<:@0-9@:>@$//' -e 's,ghc\(@<:@^/\\@:>@*\)$,ghc-pkg\1,'`
1496 if "$fp_ghc_pkg_guess" list > /dev/null 2>&1; then
1497 fp_cv_matching_ghc_pkg=$fp_ghc_pkg_guess
1499 AC_MSG_ERROR([Cannot find matching ghc-pkg])
1501 GhcPkgCmd=$fp_cv_matching_ghc_pkg
1502 AC_SUBST([GhcPkgCmd])
1506 # FP_GCC_EXTRA_FLAGS
1507 # ------------------
1508 # Determine which extra flags we need to pass gcc when we invoke it
1509 # to compile .hc code.
1511 # -fwrapv is needed for gcc to emit well-behaved code in the presence of
1512 # integer wrap around. (Trac #952)
1514 AC_DEFUN([FP_GCC_EXTRA_FLAGS],
1515 [AC_REQUIRE([FP_GCC_VERSION])
1516 AC_CACHE_CHECK([for extra options to pass gcc when compiling via C], [fp_cv_gcc_extra_opts],
1517 [fp_cv_gcc_extra_opts=
1518 FP_COMPARE_VERSIONS([$fp_cv_gcc_version], [-ge], [3.4],
1519 [fp_cv_gcc_extra_opts="$fp_cv_gcc_extra_opts -fwrapv"],
1522 AC_SUBST([GccExtraViaCOpts],$fp_cv_gcc_extra_opts)
1526 # FP_SETUP_PROJECT_VERSION
1527 # ---------------------
1528 AC_DEFUN([FP_SETUP_PROJECT_VERSION],
1530 if test "$RELEASE" = "NO"; then
1531 AC_MSG_CHECKING([for GHC version date])
1532 if test -f VERSION_DATE; then
1533 PACKAGE_VERSION=${PACKAGE_VERSION}.`cat VERSION_DATE`
1534 AC_MSG_RESULT(given $PACKAGE_VERSION)
1535 elif test -d .git; then
1537 ver_date=`git log -n 1 --date=short --pretty=format:%ci | cut -d ' ' -f 1 | tr -d -`
1538 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
1539 changequote([, ])dnl
1540 AC_MSG_ERROR([failed to detect version date: check that git is in your path])
1542 PACKAGE_VERSION=${PACKAGE_VERSION}.$ver_date
1543 AC_MSG_RESULT(inferred $PACKAGE_VERSION)
1544 elif test -f VERSION; then
1545 PACKAGE_VERSION=`cat VERSION`
1546 AC_MSG_RESULT(given $PACKAGE_VERSION)
1548 AC_MSG_WARN([cannot determine snapshot version: no .git directory and no VERSION file])
1553 AC_SUBST([ProjectName], [$PACKAGE_NAME])
1554 AC_SUBST([ProjectVersion], [$PACKAGE_VERSION])
1556 # Split PACKAGE_VERSION into (possibly empty) parts
1557 VERSION_MAJOR=`echo $PACKAGE_VERSION | sed 's/^\(@<:@^.@:>@*\)\(\.\{0,1\}\(.*\)\)$/\1'/`
1558 VERSION_TMP=`echo $PACKAGE_VERSION | sed 's/^\(@<:@^.@:>@*\)\(\.\{0,1\}\(.*\)\)$/\3'/`
1559 VERSION_MINOR=`echo $VERSION_TMP | sed 's/^\(@<:@^.@:>@*\)\(\.\{0,1\}\(.*\)\)$/\1'/`
1560 ProjectPatchLevel=`echo $VERSION_TMP | sed 's/^\(@<:@^.@:>@*\)\(\.\{0,1\}\(.*\)\)$/\3'/`
1562 # Calculate project version as an integer, using 2 digits for minor version
1563 case $VERSION_MINOR in
1564 ?) ProjectVersionInt=${VERSION_MAJOR}0${VERSION_MINOR} ;;
1565 ??) ProjectVersionInt=${VERSION_MAJOR}${VERSION_MINOR} ;;
1566 *) AC_MSG_ERROR([bad minor version in $PACKAGE_VERSION]) ;;
1568 AC_SUBST([ProjectVersionInt])
1570 # The project patchlevel is zero unless stated otherwise
1571 test -z "$ProjectPatchLevel" && ProjectPatchLevel=0
1573 # Remove dots from the patch level; this allows us to have versions like 6.4.1.20050508
1574 ProjectPatchLevel=`echo $ProjectPatchLevel | sed 's/\.//'`
1576 AC_SUBST([ProjectPatchLevel])
1577 ])# FP_SETUP_PROJECT_VERSION
1580 # Check for a working timer_create(). We need a pretty detailed check
1581 # here, because there exist partially-working implementations of
1582 # timer_create() in certain versions of Linux (see bug #1933).
1584 AC_DEFUN([FP_CHECK_TIMER_CREATE],[
1585 AC_CHECK_FUNC([timer_create],[HAVE_timer_create=yes],[HAVE_timer_create=no])
1587 if test "$HAVE_timer_create" = "yes"
1589 if test "$cross_compiling" = "yes"
1591 # We can't test timer_create when we're cross-compiling, so we
1592 # optimistiaclly assume that it actually works properly.
1593 AC_DEFINE([USE_TIMER_CREATE], 1, [Define to 1 if we can use timer_create(CLOCK_PROCESS_CPUTIME_ID,...)])
1595 AC_CACHE_CHECK([for a working timer_create(CLOCK_REALTIME)],
1596 [fptools_cv_timer_create_works],
1599 #ifdef HAVE_STDLIB_H
1605 #ifdef HAVE_SIGNAL_H
1608 #ifdef HAVE_UNISTD_H
1612 static volatile int tock = 0;
1613 static void handler(int i)
1618 static void timeout(int i)
1620 // timer_settime() has been known to hang, so just in case
1621 // we install a 1-second timeout (see #2257)
1625 int main(int argc, char *argv[])
1630 struct itimerspec it;
1631 struct sigaction action;
1634 ev.sigev_notify = SIGEV_SIGNAL;
1635 ev.sigev_signo = SIGVTALRM;
1637 action.sa_handler = handler;
1638 action.sa_flags = 0;
1639 sigemptyset(&action.sa_mask);
1640 if (sigaction(SIGVTALRM, &action, NULL) == -1) {
1641 fprintf(stderr,"SIGVTALRM problem\n");
1645 action.sa_handler = timeout;
1646 action.sa_flags = 0;
1647 sigemptyset(&action.sa_mask);
1648 if (sigaction(SIGALRM, &action, NULL) == -1) {
1649 fprintf(stderr,"SIGALRM problem\n");
1654 if (timer_create(CLOCK_PROCESS_CPUTIME_ID, &ev, &timer) != 0) {
1655 fprintf(stderr,"No CLOCK_PROCESS_CPUTIME_ID timer\n");
1659 it.it_value.tv_sec = 0;
1660 it.it_value.tv_nsec = 1;
1661 it.it_interval = it.it_value;
1662 if (timer_settime(timer, 0, &it, NULL) != 0) {
1663 fprintf(stderr,"settime problem\n");
1669 for(n = 3; n < 20000; n++){
1670 for(m = 2; m <= n/2; m++){
1671 if (!(n%m)) count++;
1678 fprintf(stderr,"no CLOCK_PROCESS_CPUTIME_ID signal\n");
1682 timer_delete(timer);
1684 if (timer_create(CLOCK_REALTIME, &ev, &timer) != 0) {
1685 fprintf(stderr,"No CLOCK_REALTIME timer\n");
1689 it.it_value.tv_sec = 0;
1690 it.it_value.tv_nsec = 1000000;
1691 it.it_interval = it.it_value;
1692 if (timer_settime(timer, 0, &it, NULL) != 0) {
1693 fprintf(stderr,"settime problem\n");
1702 fprintf(stderr,"no CLOCK_REALTIME signal\n");
1706 timer_delete(timer);
1711 [fptools_cv_timer_create_works=yes],
1712 [fptools_cv_timer_create_works=no])
1714 case $fptools_cv_timer_create_works in
1715 yes) AC_DEFINE([USE_TIMER_CREATE], 1,
1716 [Define to 1 if we can use timer_create(CLOCK_PROCESS_CPUTIME_ID,...)]);;
1724 AC_DEFUN([FP_ICONV],
1726 dnl--------------------------------------------------------------------
1727 dnl * Deal with arguments telling us iconv is somewhere odd
1728 dnl--------------------------------------------------------------------
1730 dnl Note: ICONV_LIB_DIRS and ICONV_INCLUDE_DIRS are not predefined
1731 dnl to the empty string to allow them to be overridden from the
1734 AC_ARG_WITH([iconv-includes],
1735 [AC_HELP_STRING([--with-iconv-includes],
1736 [directory containing iconv.h])],
1737 [ICONV_INCLUDE_DIRS=$withval])
1739 AC_ARG_WITH([iconv-libraries],
1740 [AC_HELP_STRING([--with-iconv-libraries],
1741 [directory containing iconv library])],
1742 [ICONV_LIB_DIRS=$withval])
1744 AC_SUBST(ICONV_INCLUDE_DIRS)
1745 AC_SUBST(ICONV_LIB_DIRS)
1752 dnl--------------------------------------------------------------------
1753 dnl * Deal with arguments telling us gmp is somewhere odd
1754 dnl--------------------------------------------------------------------
1756 AC_ARG_WITH([gmp-includes],
1757 [AC_HELP_STRING([--with-gmp-includes],
1758 [directory containing gmp.h])],
1759 [GMP_INCLUDE_DIRS=$withval])
1761 AC_ARG_WITH([gmp-libraries],
1762 [AC_HELP_STRING([--with-gmp-libraries],
1763 [directory containing gmp library])],
1764 [GMP_LIB_DIRS=$withval])
1766 AC_SUBST(GMP_INCLUDE_DIRS)
1767 AC_SUBST(GMP_LIB_DIRS)
1770 # --------------------------------------------------------------
1771 # Calculate absolute path to build tree
1772 # --------------------------------------------------------------
1774 AC_DEFUN([FP_INTREE_GHC_PWD],[
1775 AC_MSG_NOTICE(Building in-tree ghc-pwd)
1777 dnl make -C utils/ghc-pwd clean && make -C utils/ghc-pwd
1778 dnl except we don't want to have to know what make is called. Sigh.
1779 rm -rf utils/ghc-pwd/dist-boot
1780 mkdir utils/ghc-pwd/dist-boot
1781 if ! "$WithGhc" -v0 -no-user-$GHC_PACKAGE_DB_FLAG -hidir utils/ghc-pwd/dist-boot -odir utils/ghc-pwd/dist-boot -stubdir utils/ghc-pwd/dist-boot --make utils/ghc-pwd/Main.hs -o utils/ghc-pwd/dist-boot/ghc-pwd
1783 AC_MSG_ERROR([Building ghc-pwd failed])
1786 GHC_PWD=utils/ghc-pwd/dist-boot/ghc-pwd
1789 AC_DEFUN([FP_BINDIST_GHC_PWD],[
1790 GHC_PWD=utils/ghc-pwd/dist-install/build/tmp/ghc-pwd-bindist
1793 AC_DEFUN([FP_FIND_ROOT],[
1794 AC_MSG_CHECKING(for path to top of build tree)
1797 dnl Remove common automounter nonsense
1798 hardtop=`echo $hardtop | sed 's|^/tmp_mnt.*\(/local/.*\)$|\1|' | sed 's|^/tmp_mnt/|/|'`
1800 if ! test -d "$hardtop"; then
1801 AC_MSG_ERROR([cannot determine current directory])
1804 dnl We don't support building in directories with spaces.
1808 The build system does not support building in a directory
1809 containing space characters.
1810 Suggestion: move the build tree somewhere else.])
1816 AC_MSG_RESULT($hardtop)
1819 # GHC_CONVERT_CPU(cpu, target_var)
1820 # --------------------------------
1821 # converts cpu from gnu to ghc naming, and assigns the result to $target_var
1822 AC_DEFUN([GHC_CONVERT_CPU],[
1836 i386|i486|i586|i686)
1882 echo "Unknown CPU $1"
1888 # GHC_CONVERT_VENDOR(vendor, target_var)
1889 # --------------------------------
1890 # converts vendor from gnu to ghc naming, and assigns the result to $target_var
1891 AC_DEFUN([GHC_CONVERT_VENDOR],[
1893 pc|gentoo|w64) # like i686-pc-linux-gnu, i686-gentoo-freebsd8, x86_64-w64-mingw32
1896 softfloat) # like armv5tel-softfloat-linux-gnueabi
1900 #pass thru by default
1906 # GHC_CONVERT_OS(os, converted_cpu, target_var)
1907 # --------------------------------
1908 # converts os from gnu to ghc naming, and assigns the result to $target_var
1909 AC_DEFUN([GHC_CONVERT_OS],[
1922 # As far as I'm aware, none of these have relevant variants
1923 freebsd|netbsd|openbsd|dragonfly|osf1|osf3|hpux|linuxaout|kfreebsdgnu|freebsd2|solaris2|cygwin32|mingw32|darwin|gnu|nextstep2|nextstep3|sunos4|ultrix|irix|aix|haiku)
1926 freebsd*) # like i686-gentoo-freebsd7
1927 # i686-gentoo-freebsd8
1928 # i686-gentoo-freebsd8.2
1935 echo "Unknown OS $1"
1943 # BOOTSTRAPPING_GHC_INFO_FIELD
1944 # --------------------------------
1945 # Set the variable $1 to the value of the ghc --info field $2.
1946 AC_DEFUN([BOOTSTRAPPING_GHC_INFO_FIELD],[
1947 $1=`"$WithGhc" --info | grep "^ ,(\"$2\"," | sed -e 's/.*","//' -e 's/")$//'`
1949 if test "${$1}" != "$tmp"
1951 topdir=`"$WithGhc" --print-libdir | sed 's#\\\\#/#g'`
1957 # LIBRARY_VERSION(lib, [dir])
1958 # --------------------------------
1959 # Gets the version number of a library.
1960 # If $1 is ghc-prim, then we define LIBRARY_ghc_prim_VERSION as 1.2.3
1961 # $2 points to the directory under libraries/
1962 AC_DEFUN([LIBRARY_VERSION],[
1963 dir=m4_default([$2],[$1])
1964 LIBRARY_[]translit([$1], [-], [_])[]_VERSION=`grep -i "^version:" libraries/${dir}/$1.cabal | sed "s/.* //"`
1965 AC_SUBST(LIBRARY_[]translit([$1], [-], [_])[]_VERSION)
1969 # --------------------------------
1970 # Gets the version number of XCode, if on a Mac
1971 AC_DEFUN([XCODE_VERSION],[
1972 if test "$TargetOS_CPP" = "darwin"
1974 AC_MSG_CHECKING(XCode version)
1975 XCodeVersion=`xcodebuild -version | grep Xcode | sed "s/Xcode //"`
1976 # Old XCode versions don't actually give the XCode version
1977 if test "$XCodeVersion" = ""
1979 AC_MSG_RESULT(not found (too old?))
1983 AC_MSG_RESULT($XCodeVersion)
1984 XCodeVersion1=`echo "$XCodeVersion" | sed 's/\..*//'`
1986 XCodeVersion2=`echo "$XCodeVersion" | sed 's/[^.]*\.\([^.]*\).*/\1/'`
1987 changequote([, ])dnl
1988 AC_MSG_NOTICE(XCode version component 1: $XCodeVersion1)
1989 AC_MSG_NOTICE(XCode version component 2: $XCodeVersion2)
1995 # --------------------------------
1996 # Find where the llvm tools are. We have a special function to handle when they
1997 # are installed with a version suffix (e.g., llc-3.1).
1999 # $1 = the variable to set
2000 # $2 = the with option name
2001 # $3 = the command to look for
2003 AC_DEFUN([FIND_LLVM_PROG],[
2004 FP_ARG_WITH_PATH_GNU_PROG_OPTIONAL([$1], [$2], [$3])
2005 if test "$$1" == ""; then
2008 for p in ${PATH}; do
2009 if test -d "${p}"; then
2010 $1=`${FindCmd} "${p}" -type f -perm +111 -maxdepth 1 -regex '.*/$3-[[0-9]]\.[[0-9]]' -or -type l -perm +111 -maxdepth 1 -regex '.*/$3-[[0-9]]\.[[0-9]]' | ${SortCmd} -n | tail -1`
2011 if test -n "$1"; then
2021 # --------------------------------
2022 # Finds where gcc is
2024 # $1 = the variable to set
2025 # $2 = the with option name
2026 # $3 = the command to look for
2027 AC_DEFUN([FIND_GCC],[
2028 if test "$TargetOS_CPP" = "darwin" &&
2029 test "$XCodeVersion1" -eq 4 &&
2030 test "$XCodeVersion2" -lt 2
2032 # In Xcode 4.1, 'gcc-4.2' is the gcc legacy backend (rather
2033 # than the LLVM backend). We prefer the legacy gcc, but in
2034 # Xcode 4.2 'gcc-4.2' was removed.
2035 FP_ARG_WITH_PATH_GNU_PROG([$1], [gcc-4.2], [gcc-4.2])
2036 elif test "$windows" = YES
2040 FP_ARG_WITH_PATH_GNU_PROG([$1], [$2], [$3])