Merge branch 'master' of http://darcs.haskell.org/ghc
[ghc.git] / aclocal.m4
1 # Extra autoconf macros for the Glasgow fptools
2 #
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.
5
6
7 # FPTOOLS_SET_PLATFORM_VARS
8 # ----------------------------------
9 # Set the platform variables
10 AC_DEFUN([FPTOOLS_SET_PLATFORM_VARS],
11 [
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
15     # to ghc format.
16     #
17     # For why we do it this way, see: #3637, #1717, #2951
18     #
19     # In bindists, we haven't called AC_CANONICAL_{BUILD,HOST,TARGET}
20     # so this justs uses $bootstrap_target.
21
22     if test "$build_alias" = ""
23     then
24         if test "$bootstrap_target" != ""
25         then
26             build=$bootstrap_target
27             echo "Build platform inferred as: $build"
28         else
29             echo "Can't work out build platform"
30             exit 1
31         fi
32
33         BuildArch=`echo "$build" | sed 's/-.*//'`
34         BuildVendor=`echo "$build" | sed -e 's/.*-\(.*\)-.*/\1/'`
35         BuildOS=`echo "$build" | sed 's/.*-//'`
36     else
37         GHC_CONVERT_CPU([$build_cpu], [BuildArch])
38         GHC_CONVERT_VENDOR([$build_vendor], [BuildVendor])
39         GHC_CONVERT_OS([$build_os], [$BuildArch], [BuildOS])
40     fi
41
42     if test "$host_alias" = ""
43     then
44         if test "$bootstrap_target" != ""
45         then
46             host=$bootstrap_target
47             echo "Host platform inferred as: $host"
48         else
49             echo "Can't work out host platform"
50             exit 1
51         fi
52
53         HostArch=`echo "$host" | sed 's/-.*//'`
54         HostVendor=`echo "$host" | sed -e 's/.*-\(.*\)-.*/\1/'`
55         HostOS=`echo "$host" | sed 's/.*-//'`
56     else
57         GHC_CONVERT_CPU([$host_cpu], [HostArch])
58         GHC_CONVERT_VENDOR([$host_vendor], [HostVendor])
59         GHC_CONVERT_OS([$host_os], [$HostArch], [HostOS])
60     fi
61
62     if test "$target_alias" = ""
63     then
64         if test "$host_alias" != ""
65         then
66             GHC_CONVERT_CPU([$host_cpu], [TargetArch])
67             GHC_CONVERT_VENDOR([$host_vendor], [TargetVendor])
68             GHC_CONVERT_OS([$host_os], [$TargetArch],[TargetOS])
69         else
70             if test "$bootstrap_target" != ""
71             then
72                 target=$bootstrap_target
73                 echo "Target platform inferred as: $target"
74             else
75                 echo "Can't work out target platform"
76                 exit 1
77             fi
78     
79             TargetArch=`echo "$target" | sed 's/-.*//'`
80             TargetVendor=`echo "$target" | sed -e 's/.*-\(.*\)-.*/\1/'`
81             TargetOS=`echo "$target" | sed 's/.*-//'`
82         fi
83     else
84         GHC_CONVERT_CPU([$target_cpu], [TargetArch])
85         GHC_CONVERT_VENDOR([$target_vendor], [TargetVendor])
86         GHC_CONVERT_OS([$target_os], [$TargetArch], [TargetOS])
87     fi
88
89     windows=NO
90     exeext=''
91     soext='.so'
92     case $host in
93     *-unknown-cygwin32)
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])
96         exit 1
97         ;;
98     *-unknown-mingw32)
99         windows=YES
100         exeext='.exe'
101         soext='.dll'
102         ;;
103     i386-apple-darwin|powerpc-apple-darwin)
104         soext='.dylib'
105         ;;
106     x86_64-apple-darwin)
107         soext='.dylib'
108         ;;
109     esac
110
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'`
116
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'`
122
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'`
128
129     echo "GHC build  : $BuildPlatform"
130     echo "GHC host   : $HostPlatform"
131     echo "GHC target : $TargetPlatform"
132
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)
139
140     AC_SUBST(HostArch_CPP)
141     AC_SUBST(BuildArch_CPP)
142     AC_SUBST(TargetArch_CPP)
143
144     AC_SUBST(HostOS_CPP)
145     AC_SUBST(BuildOS_CPP)
146     AC_SUBST(TargetOS_CPP)
147
148     AC_SUBST(HostVendor_CPP)
149     AC_SUBST(BuildVendor_CPP)
150     AC_SUBST(TargetVendor_CPP)
151
152     AC_SUBST(exeext)
153     AC_SUBST(soext)
154 ])
155
156
157 # FPTOOLS_SET_HASKELL_PLATFORM_VARS
158 # ----------------------------------
159 # Set the Haskell platform variables
160 AC_DEFUN([FPTOOLS_SET_HASKELL_PLATFORM_VARS],
161 [
162     checkArch() {
163         case [$]1 in
164         i386)
165             test -z "[$]2" || eval "[$]2=ArchX86"
166             ;;
167         x86_64)
168             test -z "[$]2" || eval "[$]2=ArchX86_64"
169             ;;
170         powerpc)
171             test -z "[$]2" || eval "[$]2=ArchPPC"
172             ;;
173         powerpc64)
174             test -z "[$]2" || eval "[$]2=ArchPPC_64"
175             ;;
176         sparc)
177             test -z "[$]2" || eval "[$]2=ArchSPARC"
178             ;;
179         arm)
180             GET_ARM_ISA()
181             test -z "[$]2" || eval "[$]2=\"ArchARM {armISA = \$ARM_ISA, armISAExt = \$ARM_ISA_EXT, armABI = \$ARM_ABI}\""
182             ;;
183         alpha)
184             test -z "[$]2" || eval "[$]2=ArchAlpha"
185             ;;
186         mips|mipseb)
187             test -z "[$]2" || eval "[$]2=ArchMipseb"
188             ;;
189         mipsel)
190             test -z "[$]2" || eval "[$]2=ArchMipsel"
191             ;;
192         hppa|hppa1_1|ia64|m68k|rs6000|s390|s390x|sparc64|vax)
193             test -z "[$]2" || eval "[$]2=ArchUnknown"
194             ;;
195         *)
196             echo "Unknown arch [$]1"
197             exit 1
198             ;;
199         esac
200     }
201
202     checkVendor() {
203         case [$]1 in
204         dec|unknown|hp|apple|next|sun|sgi|ibm|montavista|portbld)
205             ;;
206         *)
207             echo "Unknown vendor [$]1"
208             exit 1
209             ;;
210         esac
211     }
212
213     checkOS() {
214         case [$]1 in
215         linux)
216             test -z "[$]2" || eval "[$]2=OSLinux"
217             ;;
218         ios)
219             test -z "[$]2" || eval "[$]2=OSiOS"
220             ;;
221         darwin)
222             test -z "[$]2" || eval "[$]2=OSDarwin"
223             ;;
224         solaris2)
225             test -z "[$]2" || eval "[$]2=OSSolaris2"
226             ;;
227         mingw32)
228             test -z "[$]2" || eval "[$]2=OSMinGW32"
229             ;;
230         freebsd)
231             test -z "[$]2" || eval "[$]2=OSFreeBSD"
232             ;;
233         dragonfly)
234             test -z "[$]2" || eval "[$]2=OSDragonFly"
235             ;;
236         kfreebsdgnu)
237             test -z "[$]2" || eval "[$]2=OSKFreeBSD"
238             ;;
239         openbsd)
240             test -z "[$]2" || eval "[$]2=OSOpenBSD"
241             ;;
242         netbsd)
243             test -z "[$]2" || eval "[$]2=OSNetBSD"
244             ;;
245         haiku)
246             test -z "[$]2" || eval "[$]2=OSHaiku"
247             ;;
248         osf3)
249             test -z "[$]2" || eval "[$]2=OSOsf3"
250             ;;
251         nto-qnx)
252             test -z "[$]2" || eval "[$]2=OSQNXNTO"
253             ;;
254         dragonfly|osf1|hpux|linuxaout|freebsd2|cygwin32|gnu|nextstep2|nextstep3|sunos4|ultrix|irix|aix)
255             test -z "[$]2" || eval "[$]2=OSUnknown"
256             ;;
257         linux-android)
258             test -z "[$]2" || eval "[$]2=OSAndroid"
259             ;;
260         *)
261             echo "Unknown OS '[$]1'"
262             exit 1
263             ;;
264         esac
265     }
266
267     dnl ** check for Apple-style dead-stripping support
268     dnl    (.subsections-via-symbols assembler directive)
269
270     AC_MSG_CHECKING(for .subsections_via_symbols)
271     AC_COMPILE_IFELSE(
272         [AC_LANG_PROGRAM([], [__asm__ (".subsections_via_symbols");])],
273         [AC_MSG_RESULT(yes)
274          HaskellHaveSubsectionsViaSymbols=True
275          AC_DEFINE([HAVE_SUBSECTIONS_VIA_SYMBOLS],[1],
276                    [Define to 1 if Apple-style dead-stripping is supported.])
277         ],
278         [HaskellHaveSubsectionsViaSymbols=False
279          AC_MSG_RESULT(no)])
280
281     dnl ** check for .ident assembler directive
282
283     AC_MSG_CHECKING(whether your assembler supports .ident directive)
284     AC_COMPILE_IFELSE(
285         [AC_LANG_SOURCE([__asm__ (".ident \"GHC x.y.z\"");])],
286         [AC_MSG_RESULT(yes)
287          HaskellHaveIdentDirective=True],
288         [AC_MSG_RESULT(no)
289          HaskellHaveIdentDirective=False])
290
291     dnl *** check for GNU non-executable stack note support (ELF only)
292     dnl     (.section .note.GNU-stack,"",@progbits)
293
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
297     CFLAGS2="$CFLAGS"
298     CFLAGS=
299     AC_MSG_CHECKING(for GNU non-executable stack support)
300     AC_COMPILE_IFELSE(
301         [AC_LANG_PROGRAM([__asm__ (".section .note.GNU-stack,\"\",@progbits");], [0])],
302         [AC_MSG_RESULT(yes)
303          HaskellHaveGnuNonexecStack=True],
304         [AC_MSG_RESULT(no)
305          HaskellHaveGnuNonexecStack=False])
306     CFLAGS="$CFLAGS2"
307
308     checkArch "$BuildArch" "HaskellBuildArch"
309     checkVendor "$BuildVendor"
310     checkOS "$BuildOS" ""
311
312     checkArch "$HostArch" "HaskellHostArch"
313     checkVendor "$HostVendor"
314     checkOS "$HostOS" ""
315
316     checkArch "$TargetArch" "HaskellTargetArch"
317     checkVendor "$TargetVendor"
318     checkOS "$TargetOS" "HaskellTargetOs"
319
320     AC_SUBST(HaskellTargetArch)
321     AC_SUBST(HaskellTargetOs)
322     AC_SUBST(HaskellHaveSubsectionsViaSymbols)
323     AC_SUBST(HaskellHaveIdentDirective)
324     AC_SUBST(HaskellHaveGnuNonexecStack)
325 ])
326
327
328 # GET_ARM_ISA
329 # ----------------------------------
330 # Get info about the ISA on the ARM arch
331 AC_DEFUN([GET_ARM_ISA],
332 [
333     AC_COMPILE_IFELSE([
334         AC_LANG_PROGRAM(
335             [],
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__)
345                  return 0;
346              #else
347                  not pre arm v6
348              #endif]
349         )],
350         [AC_DEFINE(arm_HOST_ARCH_PRE_ARMv6, 1, [ARM pre v6])
351          AC_DEFINE(arm_HOST_ARCH_PRE_ARMv7, 1, [ARM pre v7])
352          changequote(, )dnl
353          ARM_ISA=ARMv5
354          ARM_ISA_EXT="[]"
355          changequote([, ])dnl
356         ],
357         [
358             AC_COMPILE_IFELSE([
359                 AC_LANG_PROGRAM(
360                     [],
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__)
367                          return 0;
368                      #else
369                          not pre arm v7
370                      #endif]
371                 )],
372                 [AC_DEFINE(arm_HOST_ARCH_PRE_ARMv7, 1, [ARM pre v7])
373                  ARM_ISA=ARMv6
374                  AC_COMPILE_IFELSE([
375                         AC_LANG_PROGRAM(
376                                 [],
377                                 [#if defined(__VFP_FP__)
378                                      return 0;
379                                 #else
380                                      no vfp
381                                 #endif]
382                         )],
383                         [changequote(, )dnl
384                          ARM_ISA_EXT="[VFPv2]"
385                          changequote([, ])dnl
386                         ],
387                         [changequote(, )dnl
388                          ARM_ISA_EXT="[]"
389                          changequote([, ])dnl
390                         ]
391                 )],
392                 [changequote(, )dnl
393                  ARM_ISA=ARMv7
394                  ARM_ISA_EXT="[VFPv3,NEON]"
395                  changequote([, ])dnl
396                 ])
397         ])
398
399         AC_COMPILE_IFELSE(
400                [AC_LANG_PROGRAM(
401                        [],
402                        [#if defined(__SOFTFP__)
403                             return 0;
404                        #else
405                             not softfp
406                        #endif]
407                )],
408                [changequote(, )dnl
409                 ARM_ABI="SOFT"
410                 changequote([, ])dnl
411                ],
412                [AC_COMPILE_IFELSE(
413                     [AC_LANG_PROGRAM(
414                        [],
415                        [#if defined(__ARM_PCS_VFP)
416                             return 0;
417                        #else
418                             no hard float ABI
419                        #endif]
420                     )],
421                     [ARM_ABI="HARD"],
422                     [ARM_ABI="SOFTFP"]
423                )]
424         )
425 ])
426
427
428 # FP_SETTINGS
429 # ----------------------------------
430 # Set the variables used in the settings file
431 AC_DEFUN([FP_SETTINGS],
432 [
433     if test "$windows" = YES
434     then
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'
443     else
444         SettingsCCompilerCommand="$WhatGccIsCalled"
445         SettingsLdCommand="$LdCmd"
446         SettingsArCommand="$ArCmd"
447         SettingsPerlCommand="$PerlCmd"
448         SettingsDllWrapCommand="/bin/false"
449         SettingsWindresCommand="/bin/false"
450         SettingsTouchCommand='touch'
451         if test -z "$LlcCmd"
452         then
453           SettingsLlcCommand="llc"
454         else
455           SettingsLlcCommand="$LlcCmd"
456         fi
457         if test -z "$OptCmd"
458         then
459           SettingsOptCommand="opt"
460         else
461           SettingsOptCommand="$OptCmd"
462         fi
463     fi
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)
479 ])
480
481
482 # FPTOOLS_SET_C_LD_FLAGS
483 # ----------------------------------
484 # Set the C, LD and CPP flags for a given platform
485 # $1 is the 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],
491 [
492     AC_MSG_CHECKING([Setting up $2, $3, $4 and $5])
493     case $$1 in
494     i386-*)
495         # Workaround for #7799
496         $2="$$2 -U__i686"
497         ;;
498     esac
499
500     case $$1 in
501     i386-apple-darwin)
502         $2="$$2 -m32"
503         $3="$$3 -m32"
504         $4="$$4 -arch i386"
505         $5="$$5 -m32"
506         ;;
507     x86_64-apple-darwin)
508         $2="$$2 -m64"
509         $3="$$3 -m64"
510         $4="$$4 -arch x86_64"
511         $5="$$5 -m64"
512         ;;
513     alpha-*)
514         # For now, to suppress the gcc warning "call-clobbered
515         # register used for global register variable", we simply
516         # disable all warnings altogether using the -w flag. Oh well.
517         $2="$$2 -w -mieee -D_REENTRANT"
518         $3="$$3 -w -mieee -D_REENTRANT"
519         $5="$$5 -w -mieee -D_REENTRANT"
520         ;;
521     hppa*)
522         # ___HPUX_SOURCE, not _HPUX_SOURCE, is #defined if -ansi!
523         # (very nice, but too bad the HP /usr/include files don't agree.)
524         $2="$$2 -D_HPUX_SOURCE"
525         $3="$$3 -D_HPUX_SOURCE"
526         $5="$$5 -D_HPUX_SOURCE"
527         ;;
528     esac
529
530     # If gcc knows about the stack protector, turn it off.
531     # Otherwise the stack-smash handler gets triggered.
532     echo 'int main(void) {return 0;}' > conftest.c
533     if $CC -c conftest.c -fno-stack-protector > /dev/null 2>&1
534     then
535         $2="$$2 -fno-stack-protector"
536     fi
537
538     # Reduce memory usage when linking. See trac #5240.
539     if test -n "$LdHashSize31"
540     then
541         $3="$$3 -Wl,$LdHashSize31"
542         $4="$$4     $LdHashSize31"
543     fi
544     if test -n "$LdReduceMemoryOverheads"
545     then
546         $3="$$3 -Wl,$LdReduceMemoryOverheads"
547         $4="$$4     $LdReduceMemoryOverheads"
548     fi
549
550     rm -f conftest.c conftest.o
551     AC_MSG_RESULT([done])
552 ])
553
554
555 AC_DEFUN([FP_PATH_PROG],[
556     AC_PATH_PROG($1,$2,$3,$4,$5,$6)
557     # If we have a cygwin path for something, and we try to run it
558     # from cabal or python, then it'll fail. So we convert to a
559     # native path.
560     if test "$HostOS"     = "mingw32" && \
561        test "${OSTYPE}"  != "msys"    && \
562        test "${$1}" != ""
563     then
564         # Canonicalise to <drive>:/path/to/gcc
565         $1=`cygpath -m "${$1}"`
566     fi
567 ])
568
569
570 # FP_VISIBILITY_HIDDEN
571 # ----------------------------------
572 # Is the visibility hidden attribute supported?
573 AC_DEFUN([FP_VISIBILITY_HIDDEN],
574 [
575     AC_MSG_CHECKING([whether __attribute__((visibility("hidden"))) is supported])
576     echo '__attribute__((visibility("hidden"))) void foo(void) {}' > conftest.c
577     if $CC -Wall -Werror -c conftest.c > /dev/null 2>&1
578     then
579         AC_MSG_RESULT([yes])
580         AC_DEFINE(HAS_VISIBILITY_HIDDEN, 1, [Has visibility hidden])
581     else
582         AC_MSG_RESULT([no])
583     fi
584     rm -f conftest.c conftest.o
585 ])
586
587
588 # FPTOOLS_FLOAT_WORD_ORDER_BIGENDIAN
589 # ----------------------------------
590 # Little endian ARM on Linux with some ABIs has big endian word order
591 # in doubles. Define FLOAT_WORDS_BIGENDIAN if this is the case.
592 AC_DEFUN([FPTOOLS_FLOAT_WORD_ORDER_BIGENDIAN],
593   [AC_CACHE_CHECK([whether float word order is big endian], [fptools_cv_float_word_order_bigendian],
594     [AC_COMPILE_IFELSE(
595       [AC_LANG_PROGRAM(
596         [#include <endian.h>],
597         [#if defined(__FLOAT_WORD_ORDER) && __FLOAT_WORD_ORDER == BIG_ENDIAN
598              return 0;
599          #else
600              not float word order big endian
601          #endif]
602       )],
603       [fptools_cv_float_word_order_bigendian=yes],
604       [fptools_cv_float_word_order_bigendian=no])
605     ])
606   case $fptools_cv_float_word_order_bigendian in
607       yes)
608           AC_DEFINE([FLOAT_WORDS_BIGENDIAN], 1,
609           [Define to 1 if your processor stores words of floats with
610            the most significant byte first]) ;;
611   esac
612 ])
613
614
615 # FP_ARG_WITH_PATH_GNU_PROG
616 # --------------------
617 # Find the specified command on the path or allow a user to set it manually
618 # with a --with-<command> option. An error will be thrown if the command isn't
619 # found.
620 #
621 # This is ignored on the mingw32 platform.
622 #
623 # $1 = the variable to set
624 # $2 = the with option name
625 # $3 = the command to look for
626 #
627 AC_DEFUN([FP_ARG_WITH_PATH_GNU_PROG],
628 [
629 AC_ARG_WITH($2,
630 [AC_HELP_STRING([--with-$2=ARG],
631         [Use ARG as the path to $2 [default=autodetect]])],
632 [
633     if test "$HostOS" = "mingw32"
634     then
635         AC_MSG_WARN([Request to use $withval will be ignored])
636     else
637         $1=$withval
638     fi
639 ],
640 [
641     if test "$HostOS" != "mingw32"
642     then
643         if test "$target_alias" = "" ; then
644             AC_PATH_PROG([$1], [$3])
645         else
646             AC_PATH_PROG([$1], [$target_alias-$3])
647         fi
648         if test -z "$$1"
649         then
650             AC_MSG_ERROR([cannot find $3 in your PATH])
651         fi
652     fi
653 ]
654 )
655 ]) # FP_ARG_WITH_PATH_GNU_PROG
656
657
658 # FP_ARG_WITH_PATH_GNU_PROG_OPTIONAL
659 # --------------------
660 # Same as FP_ARG_WITH_PATH_GNU_PROG but no error will be thrown if the command
661 # isn't found.
662 #
663 # This is ignored on the mingw32 platform.
664 #
665 # $1 = the variable to set
666 # $2 = the with option name
667 # $3 = the command to look for
668 #
669 AC_DEFUN([FP_ARG_WITH_PATH_GNU_PROG_OPTIONAL],
670 [
671 AC_ARG_WITH($2,
672 [AC_HELP_STRING([--with-$2=ARG],
673         [Use ARG as the path to $2 [default=autodetect]])],
674 [
675     if test "$HostOS" = "mingw32"
676     then
677         AC_MSG_WARN([Request to use $withval will be ignored])
678     else
679         $1=$withval
680     fi
681 ],
682 [
683     if test "$HostOS" != "mingw32"
684     then
685         AC_PATH_PROG([$1], [$3])
686     fi
687 ]
688 )
689 ]) # FP_ARG_WITH_PATH_GNU_PROG_OPTIONAL
690
691 # FP_PROG_CONTEXT_DIFF
692 # --------------------
693 # Figure out how to do context diffs. Sets the output variable ContextDiffCmd.
694 #
695 # Note: NeXTStep thinks diff'ing a file against itself is "trouble".
696 AC_DEFUN([FP_PROG_CONTEXT_DIFF],
697 [AC_CACHE_CHECK([for a working context diff], [fp_cv_context_diff],
698 [echo foo > conftest1
699 echo foo > conftest2
700 fp_cv_context_diff=no
701 for fp_var in '-U 1' '-u1' '-C 1' '-c1'
702 do
703   if diff $fp_var conftest1 conftest2 > /dev/null 2>&1; then
704     fp_cv_context_diff="diff $fp_var"
705     break
706   fi
707 done])
708 if test x"$fp_cv_context_diff" = xno; then
709    AC_MSG_ERROR([cannot figure out how to do context diffs])
710 fi
711 AC_SUBST(ContextDiffCmd, [$fp_cv_context_diff])
712 ])# FP_PROG_CONTEXT_DIFF
713
714
715 # FP_COMPUTE_INT(EXPRESSION, VARIABLE, INCLUDES, IF-FAILS)
716 # --------------------------------------------------------
717 # Assign VARIABLE the value of the compile-time EXPRESSION using INCLUDES for
718 # compilation. Execute IF-FAILS when unable to determine the value. Works for
719 # cross-compilation, too.
720 #
721 # Implementation note: We are lazy and use an internal autoconf macro, but it
722 # is supported in autoconf versions 2.50 up to the actual 2.57, so there is
723 # little risk.
724 AC_DEFUN([FP_COMPUTE_INT],
725 [_AC_COMPUTE_INT([$1], [$2], [$3], [$4])[]dnl
726 ])# FP_COMPUTE_INT
727
728
729 # FP_CHECK_ALIGNMENT(TYPE, [IGNORED], [INCLUDES = DEFAULT-INCLUDES])
730 # ------------------------------------------------------------------
731 # A variation of AC_CHECK_SIZEOF for computing the alignment restrictions of a
732 # given type. Defines ALIGNMENT_TYPE.
733 AC_DEFUN([FP_CHECK_ALIGNMENT],
734 [AS_LITERAL_IF(m4_translit([[$1]], [*], [p]), [],
735                [AC_FATAL([$0: requires literal arguments])])[]dnl
736 AC_CHECK_TYPE([$1], [], [], [$3])[]dnl
737 m4_pushdef([fp_Cache], [AS_TR_SH([fp_cv_alignment_$1])])[]dnl
738 AC_CACHE_CHECK([alignment of $1], [fp_Cache],
739 [if test "$AS_TR_SH([ac_cv_type_$1])" = yes; then
740   FP_COMPUTE_INT([offsetof(struct { char c; $1 ty; },ty)],
741                  [fp_Cache],
742                  [AC_INCLUDES_DEFAULT([$3])],
743                  [AC_MSG_ERROR([cannot compute alignment ($1)
744 See `config.log' for more details.], [77])])
745 else
746   fp_Cache=0
747 fi])[]dnl
748 AC_DEFINE_UNQUOTED(AS_TR_CPP(alignment_$1), $fp_Cache, [The alignment of a `$1'.])[]dnl
749 m4_popdef([fp_Cache])[]dnl
750 ])# FP_CHECK_ALIGNMENT
751
752
753 # FP_LEADING_UNDERSCORE
754 # ---------------------
755 # Test for determining whether symbol names have a leading underscore. We assume
756 # that they _haven't_ if anything goes wrong. Sets the output variable
757 # LeadingUnderscore to YES or NO and defines LEADING_UNDERSCORE correspondingly.
758 #
759 # Some nlist implementations seem to try to be compatible by ignoring a leading
760 # underscore sometimes (eg. FreeBSD). We therefore have to work around this by
761 # checking for *no* leading underscore first. Sigh.  --SDM
762 #
763 # Similarly on OpenBSD, but this test doesn't help. -- dons
764 AC_DEFUN([FP_LEADING_UNDERSCORE],
765 [AC_CHECK_LIB([elf], [nlist], [LIBS="-lelf $LIBS"])
766 AC_CACHE_CHECK([leading underscore in symbol names], [fptools_cv_leading_underscore], [
767 # Hack!: nlist() under Digital UNIX insist on there being an _,
768 # but symbol table listings shows none. What is going on here?!?
769 #
770 # Another hack: cygwin doesn't come with nlist.h , so we hardwire
771 # the underscoredness of that "platform"
772 case $HostPlatform in
773 *openbsd*) # x86 openbsd is ELF from 3.4 >, meaning no leading uscore
774   case $build in
775     i386-*2\.@<:@0-9@:>@ | i386-*3\.@<:@0-3@:>@ ) fptools_cv_leading_underscore=yes ;;
776     *) fptools_cv_leading_underscore=no ;;
777   esac ;;
778 alpha-dec-osf*) fptools_cv_leading_underscore=no;;
779 *cygwin32) fptools_cv_leading_underscore=yes;;
780 i386-unknown-mingw32) fptools_cv_leading_underscore=yes;;
781 x86_64-unknown-mingw32) fptools_cv_leading_underscore=no;;
782
783     # HACK: Apple doesn't seem to provide nlist in the 64-bit-libraries
784 x86_64-apple-darwin*) fptools_cv_leading_underscore=yes;;
785 *-apple-ios) fptools_cv_leading_underscore=yes;;
786
787 *) AC_RUN_IFELSE([AC_LANG_SOURCE([[#ifdef HAVE_NLIST_H
788 #include <nlist.h>
789 struct nlist xYzzY1[] = {{"xYzzY1", 0},{0}};
790 struct nlist xYzzY2[] = {{"_xYzzY2", 0},{0}};
791 #endif
792
793 int main(argc, argv)
794 int argc;
795 char **argv;
796 {
797 #ifdef HAVE_NLIST_H
798     if(nlist(argv[0], xYzzY1) == 0 && xYzzY1[0].n_value != 0)
799         exit(1);
800     if(nlist(argv[0], xYzzY2) == 0 && xYzzY2[0].n_value != 0)
801         exit(0);
802 #endif
803     exit(1);
804 }]])],[fptools_cv_leading_underscore=yes],[fptools_cv_leading_underscore=no],[fptools_cv_leading_underscore=no])
805 ;;
806 esac]);
807 AC_SUBST([LeadingUnderscore], [`echo $fptools_cv_leading_underscore | sed 'y/yesno/YESNO/'`])
808 if test x"$fptools_cv_leading_underscore" = xyes; then
809    AC_DEFINE([LEADING_UNDERSCORE], [1], [Define to 1 if C symbols have a leading underscore added by the compiler.])
810 fi])# FP_LEADING_UNDERSCORE
811
812
813 # FP_COMPARE_VERSIONS(VERSION1, TEST, VERSION2, [ACTION-IF-TRUE], [ACTION-IF-FALSE])
814 # ----------------------------------------------------------------------------------
815 # Compare dotted version numbers VERSION1 and VERSION2 lexicographically according
816 # to TEST (one of -eq, -ne, -lt, -le, -gt, or -ge).
817 AC_DEFUN([FP_COMPARE_VERSIONS],
818 [fp_version1=$1; fp_version2=$3
819 fp_save_IFS=$IFS; IFS='.'
820 while test x"$fp_version1" != x || test x"$fp_version2" != x
821 do
822
823   set dummy $fp_version1; shift
824   fp_num1=""
825   test $[@%:@] = 0 || { fp_num1="[$]1"; shift; }
826   test x"$fp_num1" = x && fp_num1="0"
827   fp_version1="[$]*"
828
829   set dummy $fp_version2; shift
830   fp_num2=""
831   test $[@%:@] = 0 || { fp_num2="[$]1"; shift; }
832   test x"$fp_num2" = x && fp_num2="0"
833   fp_version2="[$]*"
834
835   test "$fp_num1" = "$fp_num2" || break;
836 done
837 IFS=$fp_save_IFS
838 AS_IF([test "$fp_num1" $2 "$fp_num2"], [$4], [$5])[]dnl
839 ])# FP_COMPARE_VERSIONS
840
841
842 dnl
843 dnl Check for Happy and version.  If we're building GHC, then we need
844 dnl at least Happy version 1.14.  If there's no installed Happy, we look
845 dnl for a happy source tree and point the build system at that instead.
846 dnl
847 AC_DEFUN([FPTOOLS_HAPPY],
848 [FP_PATH_PROG(HappyCmd,happy,)
849
850 AC_CACHE_CHECK([for version of happy], fptools_cv_happy_version,
851 changequote(, )dnl
852 [if test x"$HappyCmd" != x; then
853    fptools_cv_happy_version=`"$HappyCmd" -v |
854                           grep 'Happy Version' | sed -e 's/Happy Version \([^ ]*\).*/\1/g'` ;
855 else
856    fptools_cv_happy_version="";
857 fi;
858 changequote([, ])dnl
859 ])
860 if test ! -f compiler/parser/Parser.hs || test ! -f compiler/cmm/CmmParse.hs || test ! -f compiler/parser/ParserCore.hs
861 then
862     FP_COMPARE_VERSIONS([$fptools_cv_happy_version],[-lt],[1.16],
863       [AC_MSG_ERROR([Happy version 1.16 or later is required to compile GHC.])])[]
864 fi
865 HappyVersion=$fptools_cv_happy_version;
866 AC_SUBST(HappyVersion)
867 ])
868
869 dnl
870 dnl Check for Alex and version.  If we're building GHC, then we need
871 dnl at least Alex version 2.1.1.
872 dnl
873 AC_DEFUN([FPTOOLS_ALEX],
874 [
875 FP_PATH_PROG(AlexCmd,alex,)
876
877 AC_CACHE_CHECK([for version of alex], fptools_cv_alex_version,
878 changequote(, )dnl
879 [if test x"$AlexCmd" != x; then
880    fptools_cv_alex_version=`"$AlexCmd" -v |
881                           grep 'Alex [Vv]ersion' | sed -e 's/Alex [Vv]ersion \([0-9\.]*\).*/\1/g'` ;
882 else
883    fptools_cv_alex_version="";
884 fi;
885 changequote([, ])dnl
886 ])
887 FP_COMPARE_VERSIONS([$fptools_cv_alex_version],[-ge],[3.0],
888   [Alex3=YES],[Alex3=NO])
889 if test ! -f compiler/cmm/CmmLex.hs || test ! -f compiler/parser/Lexer.hs
890 then
891     FP_COMPARE_VERSIONS([$fptools_cv_alex_version],[-lt],[2.1.0],
892       [AC_MSG_ERROR([Alex version 2.1.0 or later is required to compile GHC.])])[]
893 fi
894 if test ! -f utils/haddock/src/Haddock/Lex.hs
895 then
896     FP_COMPARE_VERSIONS([$fptools_cv_alex_version],[-lt],[3.0],
897       [AC_MSG_ERROR([Alex version 3.0 or later is required to compile Haddock.])])[]
898 fi
899 AlexVersion=$fptools_cv_alex_version;
900 AC_SUBST(AlexVersion)
901 AC_SUBST(Alex3)
902 ])
903
904
905 # FP_PROG_LD_FLAG
906 # ---------------
907 # Sets the output variable $2 to $1 if ld supports the $1 flag.
908 # Otherwise the variable's value is empty.
909 AC_DEFUN([FP_PROG_LD_FLAG],
910 [
911 AC_CACHE_CHECK([whether ld understands $1], [fp_cv_$2],
912 [echo 'int foo() { return 0; }' > conftest.c
913 ${CC-cc} -c conftest.c
914 if ${LdCmd} -r $1 -o conftest2.o conftest.o > /dev/null 2>&1; then
915    fp_cv_$2=$1
916 else
917    fp_cv_$2=
918 fi
919 rm -rf conftest*])
920 $2=$fp_cv_$2
921 ])# FP_PROG_LD_FLAG
922
923
924 # FP_PROG_LD_HashSize31
925 # ------------
926 # Sets the output variable LdHashSize31 to --hash-size=31 if ld supports
927 # this flag. Otherwise the variable's value is empty.
928 AC_DEFUN([FP_PROG_LD_HashSize31],
929 [
930 FP_PROG_LD_FLAG([--hash-size=31],[LdHashSize31])
931 ])# FP_PROG_LD_HashSize31
932
933
934 # FP_PROG_LD_ReduceMemoryOverheads
935 # ------------
936 # Sets the output variable LdReduceMemoryOverheads to
937 # --reduce-memory-overheads if ld supports this flag.
938 # Otherwise the variable's value is empty.
939 AC_DEFUN([FP_PROG_LD_ReduceMemoryOverheads],
940 [
941 FP_PROG_LD_FLAG([--reduce-memory-overheads],[LdReduceMemoryOverheads])
942 ])# FP_PROG_LD_ReduceMemoryOverheads
943
944
945 # FP_PROG_LD_BUILD_ID
946 # ------------
947
948 # Sets the output variable LdHasBuildId to YES if ld supports
949 # --build-id, or NO otherwise.
950 AC_DEFUN([FP_PROG_LD_BUILD_ID],
951 [
952 AC_CACHE_CHECK([whether ld understands --build-id], [fp_cv_ld_build_id],
953 [echo 'int foo() { return 0; }' > conftest.c
954 ${CC-cc} -c conftest.c
955 if ${LdCmd} -r --build-id=none -o conftest2.o conftest.o > /dev/null 2>&1; then
956    fp_cv_ld_build_id=yes
957 else
958    fp_cv_ld_build_id=no
959 fi
960 rm -rf conftest*])
961 if test "$fp_cv_ld_build_id" = yes; then
962   LdHasBuildId=YES
963 else
964   LdHasBuildId=NO
965 fi
966 AC_SUBST([LdHasBuildId])
967 ])# FP_PROG_LD_BUILD_ID
968
969
970 # FP_PROG_LD_IS_GNU
971 # -----------------
972 # Sets the output variable LdIsGNULd to YES or NO, depending on whether it is
973 # GNU ld or not.
974 AC_DEFUN([FP_PROG_LD_IS_GNU],
975 [
976 AC_CACHE_CHECK([whether ld is GNU ld], [fp_cv_gnu_ld],
977 [if ${LdCmd} --version 2> /dev/null | grep "GNU" > /dev/null 2>&1; then
978   fp_cv_gnu_ld=yes
979 else
980   fp_cv_gnu_ld=no
981 fi])
982 AC_SUBST([LdIsGNULd], [`echo $fp_cv_gnu_ld | sed 'y/yesno/YESNO/'`])
983 ])# FP_PROG_LD_IS_GNU
984
985
986 # FP_PROG_LD_NO_COMPACT_UNWIND
987 # ----------------------------
988
989 # Sets the output variable LdHasNoCompactUnwind to YES if ld supports
990 # -no_compact_unwind, or NO otherwise.
991 AC_DEFUN([FP_PROG_LD_NO_COMPACT_UNWIND],
992 [
993 AC_CACHE_CHECK([whether ld understands -no_compact_unwind], [fp_cv_ld_no_compact_unwind],
994 [echo 'int foo() { return 0; }' > conftest.c
995 ${CC-cc} -c conftest.c
996 if ${LdCmd} -r -no_compact_unwind -o conftest2.o conftest.o > /dev/null 2>&1; then
997    fp_cv_ld_no_compact_unwind=yes
998 else
999    fp_cv_ld_no_compact_unwind=no
1000 fi
1001 rm -rf conftest*])
1002 if test "$fp_cv_ld_no_compact_unwind" = yes; then
1003   LdHasNoCompactUnwind=YES
1004 else
1005   LdHasNoCompactUnwind=NO
1006 fi
1007 AC_SUBST([LdHasNoCompactUnwind])
1008 ])# FP_PROG_LD_NO_COMPACT_UNWIND
1009
1010
1011 # FP_PROG_LD_FILELIST
1012 # -------------------
1013
1014 # Sets the output variable LdHasFilelist to YES if ld supports
1015 # -filelist, or NO otherwise.
1016 AC_DEFUN([FP_PROG_LD_FILELIST],
1017 [
1018 AC_CACHE_CHECK([whether ld understands -filelist], [fp_cv_ld_has_filelist],
1019 [
1020     echo 'int foo() { return 0; }' > conftest1.c
1021     echo 'int bar() { return 0; }' > conftest2.c
1022     ${CC-cc} -c conftest1.c
1023     ${CC-cc} -c conftest2.c
1024     echo conftest1.o  > conftest.o-files
1025     echo conftest2.o >> conftest.o-files
1026     if ${LdCmd} -r -filelist conftest.o-files -o conftest.o > /dev/null 2>&1
1027     then
1028         fp_cv_ld_has_filelist=yes
1029     else
1030         fp_cv_ld_has_filelist=no
1031     fi
1032     rm -rf conftest*
1033 ])
1034 if test "$fp_cv_ld_has_filelist" = yes; then
1035     LdHasFilelist=YES
1036 else
1037     LdHasFilelist=NO
1038 fi
1039 AC_SUBST([LdHasFilelist])
1040 ])# FP_PROG_LD_FILELIST
1041
1042
1043 # FP_PROG_AR
1044 # ----------
1045 # Sets fp_prog_ar to a (non-Cygwin) path to ar. Exits if no ar can be found
1046 AC_DEFUN([FP_PROG_AR],
1047 [FP_PATH_PROG([fp_prog_ar], [ar])
1048 if test -z "$fp_prog_ar"; then
1049   AC_MSG_ERROR([cannot find ar in your PATH, no idea how to make a library])
1050 fi
1051 ])# FP_PROG_AR
1052
1053
1054 # FP_PROG_AR_IS_GNU
1055 # -----------------
1056 # Sets fp_prog_ar_is_gnu to yes or no, depending on whether it is GNU ar or not.
1057 AC_DEFUN([FP_PROG_AR_IS_GNU],
1058 [AC_REQUIRE([FP_PROG_AR])
1059 AC_CACHE_CHECK([whether $fp_prog_ar is GNU ar], [fp_cv_prog_ar_is_gnu],
1060 [if "$fp_prog_ar" --version 2> /dev/null | grep "GNU" > /dev/null 2>&1; then
1061   fp_cv_prog_ar_is_gnu=yes
1062 else
1063   fp_cv_prog_ar_is_gnu=no
1064 fi])
1065 fp_prog_ar_is_gnu=$fp_cv_prog_ar_is_gnu
1066 AC_SUBST([ArIsGNUAr], [`echo $fp_prog_ar_is_gnu | tr 'a-z' 'A-Z'`])
1067 ])# FP_PROG_AR_IS_GNU
1068
1069
1070 # FP_PROG_AR_SUPPORTS_ATFILE
1071 # -----------------
1072 # Sets fp_prog_ar_supports_atfile to yes or no, depending on whether
1073 # or not it supports the @file syntax
1074 AC_DEFUN([FP_PROG_AR_SUPPORTS_ATFILE],
1075 [AC_REQUIRE([FP_PROG_AR])
1076  AC_REQUIRE([FP_PROG_AR_ARGS])
1077 AC_CACHE_CHECK([whether $fp_prog_ar supports @file], [fp_cv_prog_ar_supports_atfile],
1078 [
1079 rm -f conftest*
1080 touch conftest.file
1081 echo conftest.file  > conftest.atfile
1082 echo conftest.file >> conftest.atfile
1083 "$fp_prog_ar" $fp_prog_ar_args conftest.a @conftest.atfile > /dev/null 2>&1
1084 fp_prog_ar_supports_atfile_tmp=`"$fp_prog_ar" t conftest.a 2> /dev/null | grep -c conftest.file`
1085 rm -f conftest*
1086 if test "$fp_prog_ar_supports_atfile_tmp" -eq 2
1087 then
1088   fp_cv_prog_ar_supports_atfile=yes
1089 else
1090   fp_cv_prog_ar_supports_atfile=no
1091 fi])
1092 fp_prog_ar_supports_atfile=$fp_cv_prog_ar_supports_atfile
1093 AC_SUBST([ArSupportsAtFile], [`echo $fp_prog_ar_supports_atfile | tr 'a-z' 'A-Z'`])
1094 ])# FP_PROG_AR_SUPPORTS_ATFILE
1095
1096 # FP_PROG_AR_ARGS
1097 # ---------------
1098 # Sets fp_prog_ar_args to the arguments for ar and the output variable ArCmd
1099 # to a non-Cygwin invocation of ar including these arguments.
1100 AC_DEFUN([FP_PROG_AR_ARGS],
1101 [AC_REQUIRE([FP_PROG_AR_IS_GNU])
1102 AC_CACHE_CHECK([for ar arguments], [fp_cv_prog_ar_args],
1103 [
1104 # GNU ar needs special treatment: it appears to have problems with
1105 # object files with the same name if you use the 's' modifier, but
1106 # simple 'ar q' works fine, and doesn't need a separate ranlib.
1107 if test $fp_prog_ar_is_gnu = yes; then
1108   fp_cv_prog_ar_args="q"
1109 else
1110   touch conftest.dummy
1111   for fp_var in clqsZ clqs cqs clq cq ; do
1112      rm -f conftest.a
1113      if "$fp_prog_ar" $fp_var conftest.a conftest.dummy > /dev/null 2> /dev/null; then
1114         fp_cv_prog_ar_args=$fp_var
1115         break
1116      fi
1117   done
1118   rm -f conftest*
1119   if test -z "$fp_cv_prog_ar_args"; then
1120     AC_MSG_ERROR([cannot figure out how to use your $fp_prog_ar])
1121   fi
1122 fi])
1123 fp_prog_ar_args=$fp_cv_prog_ar_args
1124 AC_SUBST([ArCmd], ["$fp_prog_ar"])
1125 AC_SUBST([ArArgs], ["$fp_prog_ar_args"])
1126
1127 ])# FP_PROG_AR_ARGS
1128
1129
1130 # FP_PROG_AR_NEEDS_RANLIB
1131 # -----------------------
1132 # Sets the output variable RANLIB to "ranlib" if it is needed and found,
1133 # to "true" otherwise.
1134 AC_DEFUN([FP_PROG_AR_NEEDS_RANLIB],
1135 [AC_REQUIRE([FP_PROG_AR_IS_GNU])
1136 AC_REQUIRE([FP_PROG_AR_ARGS])
1137 AC_REQUIRE([AC_PROG_CC])
1138 AC_CACHE_CHECK([whether ranlib is needed], [fp_cv_prog_ar_needs_ranlib],
1139 [if test $fp_prog_ar_is_gnu = yes; then
1140   fp_cv_prog_ar_needs_ranlib=no
1141 elif echo $TargetPlatform | grep "^.*-apple-darwin$"  > /dev/null 2> /dev/null; then
1142   # It's quite tedious to check for Apple's crazy timestamps in .a files,
1143   # so we hardcode it.
1144   fp_cv_prog_ar_needs_ranlib=yes
1145 elif echo $fp_prog_ar_args | grep "s" > /dev/null 2> /dev/null; then
1146   fp_cv_prog_ar_needs_ranlib=no
1147 else
1148   fp_cv_prog_ar_needs_ranlib=yes
1149 fi])
1150 if test $fp_cv_prog_ar_needs_ranlib = yes; then
1151    AC_PROG_RANLIB
1152 else
1153   RANLIB="true"
1154   AC_SUBST([RANLIB])
1155 fi
1156 ])# FP_PROG_AR_NEEDS_RANLIB
1157
1158
1159 # FP_GCC_VERSION
1160 # -----------
1161 # Extra testing of the result AC_PROG_CC, testing the gcc version no. Sets the
1162 # output variable GccVersion.
1163 AC_DEFUN([FP_GCC_VERSION],
1164 [AC_REQUIRE([AC_PROG_CC])
1165 if test -z "$CC"
1166 then
1167   AC_MSG_ERROR([gcc is required])
1168 fi
1169 GccLT34=NO
1170 GccLT46=NO
1171 AC_CACHE_CHECK([version of gcc], [fp_cv_gcc_version],
1172 [
1173     fp_cv_gcc_version="`$CC -v 2>&1 | grep 'version ' | sed -e 's/.*version [[^0-9]]*\([[0-9.]]*\).*/\1/g'`"
1174     FP_COMPARE_VERSIONS([$fp_cv_gcc_version], [-lt], [3.0],
1175                         [AC_MSG_ERROR([Need at least gcc version 3.0 (3.4+ recommended)])])
1176     # See #2770: gcc 2.95 doesn't work any more, apparently.  There probably
1177     # isn't a very good reason for that, but for now just make configure
1178     # fail.
1179     FP_COMPARE_VERSIONS([$fp_cv_gcc_version], [-lt], [3.4], GccLT34=YES)
1180     FP_COMPARE_VERSIONS([$fp_cv_gcc_version], [-lt], [4.6], GccLT46=YES)
1181 ])
1182 AC_SUBST([GccVersion], [$fp_cv_gcc_version])
1183 AC_SUBST(GccLT34)
1184 AC_SUBST(GccLT46)
1185 ])# FP_GCC_VERSION
1186
1187 dnl Check to see if the C compiler is clang or llvm-gcc
1188 dnl
1189 AC_DEFUN([FP_CC_LLVM_BACKEND],
1190 [AC_REQUIRE([AC_PROG_CC])
1191 AC_MSG_CHECKING([whether C compiler is clang])
1192 $CC -x c /dev/null -dM -E > conftest.txt 2>&1
1193 if grep "__clang__" conftest.txt >/dev/null 2>&1; then
1194   AC_SUBST([CC_CLANG_BACKEND], [1])
1195   AC_SUBST([CC_LLVM_BACKEND], [1])
1196   AC_MSG_RESULT([yes])
1197 else
1198   AC_MSG_RESULT([no])
1199   AC_MSG_CHECKING([whether C compiler has an LLVM back end])
1200   if grep "__llvm__" conftest.txt >/dev/null 2>&1; then
1201     AC_SUBST([CC_CLANG_BACKEND], [0])
1202     AC_SUBST([CC_LLVM_BACKEND], [1])
1203     AC_MSG_RESULT([yes])
1204   else
1205     AC_SUBST([CC_CLANG_BACKEND], [0])
1206     AC_SUBST([CC_LLVM_BACKEND], [0])
1207     AC_MSG_RESULT([no])
1208   fi
1209 fi
1210
1211 rm -f conftest.txt
1212 ])
1213
1214 dnl Small feature test for perl version. Assumes PerlCmd
1215 dnl contains path to perl binary.
1216 dnl
1217 dnl (Perl versions prior to v5.6 does not contain the string "v5";
1218 dnl instead they display version strings such as "version 5.005".)
1219 dnl
1220 AC_DEFUN([FPTOOLS_CHECK_PERL_VERSION],
1221 [$PerlCmd -v >conftest.out 2>&1
1222    if grep "v5" conftest.out >/dev/null 2>&1; then
1223       :
1224    else
1225       AC_MSG_ERROR([your version of perl probably won't work, try upgrading it.])
1226    fi
1227 rm -fr conftest*
1228 ])
1229
1230
1231 # FP_CHECK_PROG(VARIABLE, PROG-TO-CHECK-FOR,
1232 #               [VALUE-IF-NOT-FOUND], [PATH], [REJECT])
1233 # -----------------------------------------------------
1234 # HACK: A small wrapper around AC_CHECK_PROG, setting VARIABLE to the full path
1235 # of PROG-TO-CHECK-FOR when found.
1236 AC_DEFUN([FP_CHECK_PROG],
1237 [AC_CHECK_PROG([$1], [$2], [$as_dir/$ac_word$ac_exec_ext], [$3], [$4], [$5])][]dnl
1238 )# FP_CHECK_PROC
1239
1240
1241 # FP_PROG_FIND
1242 # ------------
1243 # Find a non-WinDoze version of the "find" utility.
1244 AC_DEFUN([FP_PROG_FIND],
1245 [AC_PATH_PROGS([fp_prog_find], [gfind find], find)
1246 echo foo > conftest.txt
1247 $fp_prog_find conftest.txt -print > conftest.out 2>&1
1248 if grep '^conftest.txt$' conftest.out > /dev/null 2>&1 ; then
1249   # OK, looks like a real "find".
1250   case $HostPlatform in
1251     *mingw32)
1252       if test x${OSTYPE} != xmsys
1253       then
1254             fp_prog_find="`cygpath --mixed ${fp_prog_find}`"
1255         AC_MSG_NOTICE([normalized find command to $fp_prog_find])
1256       fi ;;
1257     *) ;;
1258   esac
1259   FindCmd="$fp_prog_find"
1260 else
1261   # Found a poor WinDoze version of "find", ignore it.
1262   AC_MSG_WARN([$fp_prog_find looks like a non-*nix find, ignoring it])
1263   FP_CHECK_PROG([FindCmd], [find], [], [], [$fp_prog_find])
1264 fi
1265 rm -f conftest.txt conftest.out
1266 AC_SUBST([FindCmd])[]dnl
1267 ])# FP_PROG_FIND
1268
1269
1270 # FP_PROG_SORT
1271 # ------------
1272 # Find a Unix-like sort
1273 AC_DEFUN([FP_PROG_SORT],
1274 [AC_PATH_PROG([fp_prog_sort], [sort])
1275 echo conwip > conftest.txt
1276 $fp_prog_sort -f conftest.txt > conftest.out 2>&1
1277 if grep 'conwip' conftest.out > /dev/null 2>&1 ; then
1278   # The goods
1279   SortCmd="$fp_prog_sort"
1280 else
1281   # Summink else..pick next one.
1282   AC_MSG_WARN([$fp_prog_sort looks like a non-*nix sort, ignoring it])
1283   FP_CHECK_PROG([SortCmd], [sort], [], [], [$fp_prog_sort])
1284 fi
1285 rm -f conftest.txt conftest.out
1286 AC_SUBST([SortCmd])[]dnl
1287 ])# FP_PROG_SORT
1288
1289
1290 dnl
1291 dnl FPTOOLS_NOCACHE_CHECK prints a message, then sets the
1292 dnl values of the second argument to the result of running
1293 dnl the commands given by the third. It does not cache its
1294 dnl result, so it is suitable for checks which should be
1295 dnl run every time.
1296 dnl
1297 AC_DEFUN([FPTOOLS_NOCACHE_CHECK],
1298 [AC_MSG_CHECKING([$1])
1299  $3
1300  AC_MSG_RESULT([$][$2])
1301 ])
1302
1303 dnl
1304 dnl FPTOOLS_GHC_VERSION(version)
1305 dnl FPTOOLS_GHC_VERSION(major, minor [, patchlevel])
1306 dnl FPTOOLS_GHC_VERSION(version, major, minor, patchlevel)
1307 dnl
1308 dnl Test for version of installed ghc.  Uses $GHC.
1309 dnl [original version pinched from c2hs]
1310 dnl
1311 AC_DEFUN([FPTOOLS_GHC_VERSION],
1312 [FPTOOLS_NOCACHE_CHECK([version of ghc], [fptools_version_of_ghc],
1313 ["${WithGhc-ghc}" --version > conftestghc 2>&1
1314   cat conftestghc >&AS_MESSAGE_LOG_FD
1315 #Useless Use Of cat award...
1316   fptools_version_of_ghc=`cat conftestghc | sed -n -e 's/, patchlevel *\([[0-9]]\)/.\1/;s/.* version \([[0-9]][[0-9.]]*\).*/\1/p'`
1317   rm -fr conftest*
1318   if test "[$]fptools_version_of_ghc" = ""
1319   then
1320     fptools_version_of_ghc='unknown'
1321   fi
1322 fptools_version_of_ghc[_major]=`echo [$]fptools_version_of_ghc | sed -e 's/^\([[0-9]]\).*/\1/'`
1323 fptools_version_of_ghc[_minor]=`echo [$]fptools_version_of_ghc | sed -e 's/^[[0-9]]\.\([[0-9]]*\).*/\1/'`
1324 fptools_version_of_ghc[_pl]=`echo [$]fptools_version_of_ghc | sed -n -e 's/^[[0-9]]\.[[0-9]]*\.\([[0-9]]*\)/\1/p'`
1325 #
1326 if test "[$]fptools_version_of_ghc[_pl]" = ""
1327 then
1328   fptools_version_of_ghc[_all]="[$]fptools_version_of_ghc[_major].[$]fptools_version_of_ghc[_minor]"
1329   fptools_version_of_ghc[_pl]="0"
1330 else
1331   fptools_version_of_ghc[_all]="[$]fptools_version_of_ghc[_major].[$]fptools_version_of_ghc[_minor].[$]fptools_version_of_ghc[_pl]"
1332 fi
1333 #
1334 ifelse($#, [1], [dnl
1335 [$1]="[$]fptools_version_of_ghc[_all]"
1336 ], $#, [2], [dnl
1337 [$1]="[$]fptools_version_of_ghc[_major]"
1338 [$2]="[$]fptools_version_of_ghc[_minor]"
1339 ], $#, [3], [dnl
1340 [$1]="[$]fptools_version_of_ghc[_major]"
1341 [$2]="[$]fptools_version_of_ghc[_minor]"
1342 [$3]="[$]fptools_version_of_ghc[_pl]"
1343 ], $#, [4], [dnl
1344 [$1]="[$]fptools_version_of_ghc[_all]"
1345 [$2]="[$]fptools_version_of_ghc[_major]"
1346 [$3]="[$]fptools_version_of_ghc[_minor]"
1347 [$4]="[$]fptools_version_of_ghc[_pl]"
1348 ])
1349 ])
1350 ])dnl
1351
1352
1353 # FP_CHECK_FUNC(FUNCTION, PROLOGUE, BODY, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
1354 # ---------------------------------------------------------------------------------
1355 # A variant of AC_CHECK_FUNCS, limited to a single FUNCTION, but with the
1356 # additional flexibility of specifying the PROLOGUE and BODY.
1357 AC_DEFUN([FP_CHECK_FUNC],
1358 [AS_VAR_PUSHDEF([fp_func], [fp_cv_func_$1])dnl
1359 AC_CACHE_CHECK([for $1], fp_func,
1360 [AC_LINK_IFELSE([AC_LANG_PROGRAM([$2], [$3])],
1361                 [AS_VAR_SET(fp_func, yes)],
1362                 [AS_VAR_SET(fp_func, no)])])
1363 AS_IF([test AS_VAR_GET(fp_func) = yes],
1364       [AC_DEFINE(AS_TR_CPP(HAVE_$1), [1],
1365                 [Define to 1 if you have the `]$1[' function.]) $4],
1366       [$5])dnl
1367 AS_VAR_POPDEF([fp_func])dnl
1368 ])# FP_CHECK_FUNC
1369
1370
1371 # FP_GEN_DOCBOOK_XML
1372 # ------------------
1373 # Generates a DocBook XML V4.5 document in conftest.xml.
1374 #
1375 # It took a lot of experimentation to find a document that will cause
1376 # xsltproc to fail with an error code when the relevant
1377 # stylesheets/DTDs are not found.  I couldn't make xsltproc fail with
1378 # a single-file document, it seems a multi-file document is needed.
1379 # -- SDM 2009-06-03
1380 #
1381 AC_DEFUN([FP_GEN_DOCBOOK_XML],
1382 [rm -f conftest.xml conftest-book.xml
1383 cat > conftest.xml << EOF
1384 <?xml version="1.0" encoding="iso-8859-1"?>
1385 <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
1386    "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [[
1387 <!ENTITY conftest-book SYSTEM "conftest-book.xml">
1388 ]]>
1389 <book id="test">
1390 &conftest-book;
1391 </book>
1392 EOF
1393 cat >conftest-book.xml << EOF
1394 <?xml version="1.0" encoding="iso-8859-1"?>
1395   <title>A DocBook &ldquo;Test Document&rdquo;</title>
1396   <chapter id="id-one">
1397     <title>A Chapter Title</title>
1398     <para>This is a paragraph, referencing <xref linkend="id-two"/>.</para>
1399   </chapter>
1400   <chapter id="id-two">
1401     <title>Another Chapter Title</title>
1402     <para>This is another paragraph, referencing <xref linkend="id-one"/>.</para>
1403   </chapter>
1404 EOF
1405 ]) # FP_GEN_DOCBOOK_XML
1406
1407
1408 # FP_PROG_DBLATEX
1409 # ----------------
1410 # Sets the output variable DblatexCmd to the full path of dblatex,
1411 # which we use for building PDF and PS docs.
1412 # DblatexCmd is empty if dblatex could not be found.
1413 AC_DEFUN([FP_PROG_DBLATEX],
1414 [FP_PATH_PROG([DblatexCmd], [dblatex])
1415 if test -z "$DblatexCmd"; then
1416   AC_MSG_WARN([cannot find dblatex in your PATH, you will not be able to build the PDF and PS documentation])
1417 fi
1418 ])# FP_PROG_DBLATEX
1419
1420
1421 # FP_PROG_XSLTPROC
1422 # ----------------
1423 # Sets the output variable XsltprocCmd to the full path of the XSLT processor
1424 # xsltproc. XsltprocCmd is empty if xsltproc could not be found.
1425 AC_DEFUN([FP_PROG_XSLTPROC],
1426 [FP_PATH_PROG([XsltprocCmd], [xsltproc])
1427 if test -z "$XsltprocCmd"; then
1428   AC_MSG_WARN([cannot find xsltproc in your PATH, you will not be able to build the HTML documentation])
1429 fi
1430 ])# FP_PROG_XSLTPROC
1431
1432
1433 # FP_DOCBOOK_XSL
1434 # ----------------------------
1435 # Check that we can process a DocBook XML document to HTML using xsltproc.
1436 AC_DEFUN([FP_DOCBOOK_XSL],
1437 [AC_REQUIRE([FP_PROG_XSLTPROC])dnl
1438 if test -n "$XsltprocCmd"; then
1439   AC_CACHE_CHECK([for DocBook XSL stylesheet], fp_cv_dir_docbook_xsl,
1440   [FP_GEN_DOCBOOK_XML
1441   fp_cv_dir_docbook_xsl=no
1442   if $XsltprocCmd --nonet http://docbook.sourceforge.net/release/xsl/current/html/chunk.xsl conftest.xml > /dev/null 2>&1; then
1443      fp_cv_dir_docbook_xsl=yes
1444   fi
1445   rm -rf conftest*])
1446 fi
1447 if test x"$fp_cv_dir_docbook_xsl" = xno; then
1448   AC_MSG_WARN([cannot find DocBook XSL stylesheets, you will not be able to build the documentation])
1449   HAVE_DOCBOOK_XSL=NO
1450 else
1451   HAVE_DOCBOOK_XSL=YES
1452 fi
1453 AC_SUBST([HAVE_DOCBOOK_XSL])
1454 ])# FP_DOCBOOK_XSL
1455
1456
1457 # FP_PROG_XMLLINT
1458 # ----------------
1459 # Sets the output variable XmllintCmd to the full path of the XSLT processor
1460 # xmllint. XmllintCmd is empty if xmllint could not be found.
1461 AC_DEFUN([FP_PROG_XMLLINT],
1462 [FP_PATH_PROG([XmllintCmd], [xmllint])
1463 if test -z "$XmllintCmd"; then
1464   AC_MSG_WARN([cannot find xmllint in your PATH, you will not be able to validate your documentation])
1465 fi
1466 ])# FP_PROG_XMLLINT
1467
1468
1469 # FP_CHECK_DOCBOOK_DTD
1470 # --------------------
1471 AC_DEFUN([FP_CHECK_DOCBOOK_DTD],
1472 [AC_REQUIRE([FP_PROG_XMLLINT])dnl
1473 if test -n "$XmllintCmd"; then
1474   AC_MSG_CHECKING([for DocBook DTD])
1475   FP_GEN_DOCBOOK_XML
1476   if $XmllintCmd --nonet --valid --noout conftest.xml ; then
1477     AC_MSG_RESULT([ok])
1478   else
1479     AC_MSG_RESULT([failed])
1480     AC_MSG_WARN([cannot find a DTD for DocBook XML V4.5, you will not be able to validate your documentation])
1481     AC_MSG_WARN([check your XML_CATALOG_FILES environment variable and/or /etc/xml/catalog])
1482   fi
1483   rm -rf conftest*
1484 fi
1485 ])# FP_CHECK_DOCBOOK_DTD
1486
1487
1488 # FP_PROG_GHC_PKG
1489 # ----------------
1490 # Try to find a ghc-pkg matching the ghc mentioned in the environment variable
1491 # WithGhc. Sets the output variable GhcPkgCmd.
1492 AC_DEFUN([FP_PROG_GHC_PKG],
1493 [AC_CACHE_CHECK([for ghc-pkg matching $WithGhc], fp_cv_matching_ghc_pkg,
1494 [
1495 # If we are told to use ghc-stage2, then we're using an in-tree
1496 # compiler. In this case, we just want ghc-pkg, not ghc-pkg-stage2,
1497 # so we sed off -stage[0-9]$. However, if we are told to use
1498 # ghc-6.12.1 then we want to use ghc-pkg-6.12.1, so we keep any
1499 # other suffix.
1500 fp_ghc_pkg_guess=`echo $WithGhc | sed -e 's/-stage@<:@0-9@:>@$//' -e 's,ghc\(@<:@^/\\@:>@*\)$,ghc-pkg\1,'`
1501 if "$fp_ghc_pkg_guess" list > /dev/null 2>&1; then
1502   fp_cv_matching_ghc_pkg=$fp_ghc_pkg_guess
1503 else
1504   AC_MSG_ERROR([Cannot find matching ghc-pkg])
1505 fi])
1506 GhcPkgCmd=$fp_cv_matching_ghc_pkg
1507 AC_SUBST([GhcPkgCmd])
1508 ])# FP_PROG_GHC_PKG
1509
1510
1511 # FP_GCC_EXTRA_FLAGS
1512 # ------------------
1513 # Determine which extra flags we need to pass gcc when we invoke it
1514 # to compile .hc code.
1515 #
1516 # -fwrapv is needed for gcc to emit well-behaved code in the presence of
1517 # integer wrap around. (Trac #952)
1518 #
1519 AC_DEFUN([FP_GCC_EXTRA_FLAGS],
1520 [AC_REQUIRE([FP_GCC_VERSION])
1521 AC_CACHE_CHECK([for extra options to pass gcc when compiling via C], [fp_cv_gcc_extra_opts],
1522 [fp_cv_gcc_extra_opts=
1523  FP_COMPARE_VERSIONS([$fp_cv_gcc_version], [-ge], [3.4],
1524   [fp_cv_gcc_extra_opts="$fp_cv_gcc_extra_opts -fwrapv"],
1525   [])
1526 ])
1527 AC_SUBST([GccExtraViaCOpts],$fp_cv_gcc_extra_opts)
1528 ])
1529
1530
1531 # FP_SETUP_PROJECT_VERSION
1532 # ---------------------
1533 AC_DEFUN([FP_SETUP_PROJECT_VERSION],
1534 [
1535 if test "$RELEASE" = "NO"; then
1536     AC_MSG_CHECKING([for GHC version date])
1537     if test -f VERSION_DATE; then
1538         PACKAGE_VERSION=${PACKAGE_VERSION}.`cat VERSION_DATE`
1539         AC_MSG_RESULT(given $PACKAGE_VERSION)
1540     elif test -d .git; then
1541         changequote(, )dnl
1542         ver_date=`git log -n 1 --date=short --pretty=format:%ci | cut -d ' ' -f 1 | tr -d -`
1543         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
1544         changequote([, ])dnl
1545                 AC_MSG_ERROR([failed to detect version date: check that git is in your path])
1546         fi
1547         PACKAGE_VERSION=${PACKAGE_VERSION}.$ver_date
1548         AC_MSG_RESULT(inferred $PACKAGE_VERSION)
1549     elif test -f VERSION; then
1550         PACKAGE_VERSION=`cat VERSION`
1551         AC_MSG_RESULT(given $PACKAGE_VERSION)
1552     else
1553         AC_MSG_WARN([cannot determine snapshot version: no .git directory and no VERSION file])
1554     fi
1555 fi
1556
1557 # Some renamings
1558 AC_SUBST([ProjectName], [$PACKAGE_NAME])
1559 AC_SUBST([ProjectVersion], [$PACKAGE_VERSION])
1560
1561 # Split PACKAGE_VERSION into (possibly empty) parts
1562 VERSION_MAJOR=`echo $PACKAGE_VERSION | sed 's/^\(@<:@^.@:>@*\)\(\.\{0,1\}\(.*\)\)$/\1'/`
1563 VERSION_TMP=`echo $PACKAGE_VERSION | sed 's/^\(@<:@^.@:>@*\)\(\.\{0,1\}\(.*\)\)$/\3'/`
1564 VERSION_MINOR=`echo $VERSION_TMP | sed 's/^\(@<:@^.@:>@*\)\(\.\{0,1\}\(.*\)\)$/\1'/`
1565 ProjectPatchLevel=`echo $VERSION_TMP | sed 's/^\(@<:@^.@:>@*\)\(\.\{0,1\}\(.*\)\)$/\3'/`
1566
1567 # Calculate project version as an integer, using 2 digits for minor version
1568 case $VERSION_MINOR in
1569   ?) ProjectVersionInt=${VERSION_MAJOR}0${VERSION_MINOR} ;;
1570   ??) ProjectVersionInt=${VERSION_MAJOR}${VERSION_MINOR} ;;
1571   *) AC_MSG_ERROR([bad minor version in $PACKAGE_VERSION]) ;;
1572 esac
1573 AC_SUBST([ProjectVersionInt])
1574
1575 # The project patchlevel is zero unless stated otherwise
1576 test -z "$ProjectPatchLevel" && ProjectPatchLevel=0
1577
1578 # Remove dots from the patch level; this allows us to have versions like 6.4.1.20050508
1579 ProjectPatchLevel=`echo $ProjectPatchLevel | sed 's/\.//'`
1580
1581 AC_SUBST([ProjectPatchLevel])
1582 ])# FP_SETUP_PROJECT_VERSION
1583
1584
1585 # Check for a working timer_create().  We need a pretty detailed check
1586 # here, because there exist partially-working implementations of
1587 # timer_create() in certain versions of Linux (see bug #1933).
1588 #
1589 AC_DEFUN([FP_CHECK_TIMER_CREATE],[
1590 AC_CHECK_FUNC([timer_create],[HAVE_timer_create=yes],[HAVE_timer_create=no])
1591
1592 if test "$HAVE_timer_create" = "yes"
1593 then
1594   if test "$cross_compiling" = "yes"
1595   then
1596     # We can't test timer_create when we're cross-compiling, so we
1597     # optimistiaclly assume that it actually works properly.
1598     AC_DEFINE([USE_TIMER_CREATE], 1,  [Define to 1 if we can use timer_create(CLOCK_PROCESS_CPUTIME_ID,...)])
1599   else
1600   AC_CACHE_CHECK([for a working timer_create(CLOCK_REALTIME)], 
1601     [fptools_cv_timer_create_works],
1602     [AC_TRY_RUN([
1603 #include <stdio.h>
1604 #ifdef HAVE_STDLIB_H
1605 #include <stdlib.h>
1606 #endif
1607 #ifdef HAVE_TIME_H
1608 #include <time.h>
1609 #endif
1610 #ifdef HAVE_SIGNAL_H
1611 #include <signal.h>
1612 #endif
1613 #ifdef HAVE_UNISTD_H
1614 #include <unistd.h>
1615 #endif
1616
1617 static volatile int tock = 0;
1618 static void handler(int i)
1619 {
1620    tock = 1;
1621 }
1622
1623 static void timeout(int i)
1624 {
1625   // timer_settime() has been known to hang, so just in case
1626   // we install a 1-second timeout (see #2257)
1627   exit(99);
1628 }
1629
1630 int main(int argc, char *argv[])
1631 {
1632
1633     struct sigevent ev;
1634     timer_t timer;
1635     struct itimerspec it;
1636     struct sigaction action;
1637     int m,n,count = 0;
1638
1639     ev.sigev_notify = SIGEV_SIGNAL;
1640     ev.sigev_signo  = SIGVTALRM;
1641
1642     action.sa_handler = handler;
1643     action.sa_flags = 0;
1644     sigemptyset(&action.sa_mask);
1645     if (sigaction(SIGVTALRM, &action, NULL) == -1) {
1646         fprintf(stderr,"SIGVTALRM problem\n");
1647         exit(3);
1648     }
1649
1650     action.sa_handler = timeout;
1651     action.sa_flags = 0;
1652     sigemptyset(&action.sa_mask);
1653     if (sigaction(SIGALRM, &action, NULL) == -1) {
1654       fprintf(stderr,"SIGALRM problem\n");
1655       exit(3);
1656     }
1657     alarm(1);
1658
1659     if (timer_create(CLOCK_PROCESS_CPUTIME_ID, &ev, &timer) != 0) {
1660         fprintf(stderr,"No CLOCK_PROCESS_CPUTIME_ID timer\n");
1661        exit(1);
1662     }
1663
1664     it.it_value.tv_sec = 0;
1665     it.it_value.tv_nsec = 1;
1666     it.it_interval = it.it_value;
1667     if (timer_settime(timer, 0, &it, NULL) != 0) {
1668         fprintf(stderr,"settime problem\n");
1669         exit(4);
1670     }
1671
1672     tock = 0;
1673
1674     for(n = 3; n < 20000; n++){
1675         for(m = 2; m <= n/2; m++){
1676             if (!(n%m)) count++;
1677             if (tock) goto out;
1678         }
1679     }
1680 out:
1681
1682     if (!tock) {
1683         fprintf(stderr,"no CLOCK_PROCESS_CPUTIME_ID signal\n");
1684         exit(5);
1685     }
1686
1687     timer_delete(timer);
1688
1689     if (timer_create(CLOCK_REALTIME, &ev, &timer) != 0) {
1690         fprintf(stderr,"No CLOCK_REALTIME timer\n");
1691         exit(2);
1692     }
1693
1694     it.it_value.tv_sec = 0;
1695     it.it_value.tv_nsec = 1000000;
1696     it.it_interval = it.it_value;
1697     if (timer_settime(timer, 0, &it, NULL) != 0) {
1698         fprintf(stderr,"settime problem\n");
1699         exit(4);
1700     }
1701
1702     tock = 0;
1703
1704     usleep(3000);
1705
1706     if (!tock) {
1707         fprintf(stderr,"no CLOCK_REALTIME signal\n");
1708         exit(5);
1709     }
1710
1711     timer_delete(timer);
1712
1713     exit(0);
1714 }
1715      ],
1716      [fptools_cv_timer_create_works=yes],
1717      [fptools_cv_timer_create_works=no])
1718   ])
1719 case $fptools_cv_timer_create_works in
1720     yes) AC_DEFINE([USE_TIMER_CREATE], 1, 
1721                    [Define to 1 if we can use timer_create(CLOCK_PROCESS_CPUTIME_ID,...)]);;
1722 esac
1723   fi
1724 fi
1725 ])
1726
1727 # FP_ICONV
1728 # -------------
1729 AC_DEFUN([FP_ICONV],
1730 [
1731   dnl--------------------------------------------------------------------
1732   dnl * Deal with arguments telling us iconv is somewhere odd
1733   dnl--------------------------------------------------------------------
1734
1735   dnl Note: ICONV_LIB_DIRS and ICONV_INCLUDE_DIRS are not predefined
1736   dnl to the empty string to allow them to be overridden from the
1737   dnl environment.
1738
1739   AC_ARG_WITH([iconv-includes],
1740     [AC_HELP_STRING([--with-iconv-includes],
1741       [directory containing iconv.h])],
1742       [ICONV_INCLUDE_DIRS=$withval])
1743
1744   AC_ARG_WITH([iconv-libraries],
1745     [AC_HELP_STRING([--with-iconv-libraries],
1746       [directory containing iconv library])],
1747       [ICONV_LIB_DIRS=$withval])
1748
1749   AC_SUBST(ICONV_INCLUDE_DIRS)
1750   AC_SUBST(ICONV_LIB_DIRS)
1751 ])# FP_ICONV
1752
1753 # FP_GMP
1754 # -------------
1755 AC_DEFUN([FP_GMP],
1756 [
1757   dnl--------------------------------------------------------------------
1758   dnl * Deal with arguments telling us gmp is somewhere odd
1759   dnl--------------------------------------------------------------------
1760
1761   AC_ARG_WITH([gmp-includes],
1762     [AC_HELP_STRING([--with-gmp-includes],
1763       [directory containing gmp.h])],
1764       [GMP_INCLUDE_DIRS=$withval])
1765
1766   AC_ARG_WITH([gmp-libraries],
1767     [AC_HELP_STRING([--with-gmp-libraries],
1768       [directory containing gmp library])],
1769       [GMP_LIB_DIRS=$withval])
1770
1771   AC_SUBST(GMP_INCLUDE_DIRS)
1772   AC_SUBST(GMP_LIB_DIRS)
1773 ])# FP_GMP
1774
1775 # --------------------------------------------------------------
1776 # Calculate absolute path to build tree
1777 # --------------------------------------------------------------
1778
1779 AC_DEFUN([FP_INTREE_GHC_PWD],[
1780 AC_MSG_NOTICE(Building in-tree ghc-pwd)
1781     dnl This would be
1782     dnl     make -C utils/ghc-pwd clean && make -C utils/ghc-pwd
1783     dnl except we don't want to have to know what make is called. Sigh.
1784     rm -rf utils/ghc-pwd/dist-boot
1785     mkdir  utils/ghc-pwd/dist-boot
1786     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
1787     then
1788         AC_MSG_ERROR([Building ghc-pwd failed])
1789     fi
1790
1791     GHC_PWD=utils/ghc-pwd/dist-boot/ghc-pwd
1792 ])
1793
1794 AC_DEFUN([FP_BINDIST_GHC_PWD],[
1795     GHC_PWD=utils/ghc-pwd/dist-install/build/tmp/ghc-pwd-bindist
1796 ])
1797
1798 AC_DEFUN([FP_FIND_ROOT],[
1799 AC_MSG_CHECKING(for path to top of build tree)
1800     hardtop=`$GHC_PWD`
1801
1802     dnl Remove common automounter nonsense
1803     hardtop=`echo $hardtop | sed 's|^/tmp_mnt.*\(/local/.*\)$|\1|' | sed 's|^/tmp_mnt/|/|'`
1804
1805     if ! test -d "$hardtop"; then
1806         AC_MSG_ERROR([cannot determine current directory])
1807     fi
1808
1809     dnl We don't support building in directories with spaces.
1810     case "$hardtop" in
1811     *' '*)
1812         AC_MSG_ERROR([
1813         The build system does not support building in a directory
1814         containing space characters.
1815         Suggestion: move the build tree somewhere else.])
1816         ;;
1817     esac
1818
1819     AC_SUBST(hardtop)
1820
1821     AC_MSG_RESULT($hardtop)
1822 ])
1823
1824 # GHC_CONVERT_CPU(cpu, target_var)
1825 # --------------------------------
1826 # converts cpu from gnu to ghc naming, and assigns the result to $target_var
1827 AC_DEFUN([GHC_CONVERT_CPU],[
1828 case "$1" in
1829   alpha*)
1830     $2="alpha"
1831     ;;
1832   arm*)
1833     $2="arm"
1834     ;;
1835   hppa1.1*)
1836     $2="hppa1_1"
1837     ;;
1838   hppa*)
1839     $2="hppa"
1840     ;;
1841   i386|i486|i586|i686)
1842     $2="i386"
1843     ;;
1844   ia64)
1845     $2="ia64"
1846     ;;
1847   m68k*)
1848     $2="m68k"
1849     ;;
1850   mipseb*)
1851     $2="mipseb"
1852     ;;
1853   mipsel*)
1854     $2="mipsel"
1855     ;;
1856   mips*)
1857     $2="mips"
1858     ;;
1859   powerpc64*)
1860     $2="powerpc64"
1861     ;;
1862   powerpc*)
1863     $2="powerpc"
1864     ;;
1865   rs6000)
1866     $2="rs6000"
1867     ;;
1868   s390x*)
1869     $2="s390x"
1870     ;;
1871   s390*)
1872     $2="s390"
1873     ;;
1874   sparc64*)
1875     $2="sparc64"
1876     ;;
1877   sparc*)
1878     $2="sparc"
1879     ;;
1880   vax)
1881     $2="vax"
1882     ;;
1883   x86_64)
1884     $2="x86_64"
1885     ;;
1886   *)
1887     echo "Unknown CPU $1"
1888     exit 1
1889     ;;
1890   esac
1891 ])
1892
1893 # GHC_CONVERT_VENDOR(vendor, target_var)
1894 # --------------------------------
1895 # converts vendor from gnu to ghc naming, and assigns the result to $target_var
1896 AC_DEFUN([GHC_CONVERT_VENDOR],[
1897   case "$1" in
1898   pc|gentoo|w64) # like i686-pc-linux-gnu, i686-gentoo-freebsd8, x86_64-w64-mingw32
1899     $2="unknown"
1900     ;;
1901   softfloat) # like armv5tel-softfloat-linux-gnueabi
1902     $2="unknown"
1903     ;;
1904   *)
1905     #pass thru by default
1906     $2="$1"
1907     ;;
1908   esac
1909 ])
1910
1911 # GHC_CONVERT_OS(os, converted_cpu, target_var)
1912 # --------------------------------
1913 # converts os from gnu to ghc naming, and assigns the result to $target_var
1914 AC_DEFUN([GHC_CONVERT_OS],[
1915 case "$1-$2" in
1916   darwin10-arm)
1917     $3="ios"
1918     ;;
1919   *)
1920     case "$1" in
1921       linux-android*)
1922         $3="linux-android"
1923         ;;
1924       linux-*|linux)
1925         $3="linux"
1926         ;;
1927       # As far as I'm aware, none of these have relevant variants
1928       freebsd|netbsd|openbsd|dragonfly|osf1|osf3|hpux|linuxaout|kfreebsdgnu|freebsd2|solaris2|cygwin32|mingw32|darwin|gnu|nextstep2|nextstep3|sunos4|ultrix|irix|aix|haiku)
1929         $3="$1"
1930         ;;
1931       freebsd*) # like i686-gentoo-freebsd7
1932                 #      i686-gentoo-freebsd8
1933                 #      i686-gentoo-freebsd8.2
1934         $3="freebsd"
1935         ;;
1936       nto-qnx*)
1937         $3="nto-qnx"
1938         ;;
1939       *)
1940         echo "Unknown OS $1"
1941         exit 1
1942         ;;
1943       esac
1944       ;;
1945   esac
1946 ])
1947
1948 # BOOTSTRAPPING_GHC_INFO_FIELD
1949 # --------------------------------
1950 # Set the variable $1 to the value of the ghc --info field $2.
1951 AC_DEFUN([BOOTSTRAPPING_GHC_INFO_FIELD],[
1952 $1=`"$WithGhc" --info | grep "^ ,(\"$2\"," | sed -e 's/.*","//' -e 's/")$//'`
1953 tmp=${$1#\$topdir/}
1954 if test "${$1}" != "$tmp"
1955 then
1956     topdir=`"$WithGhc" --print-libdir | sed 's#\\\\#/#g'`
1957     $1="$topdir/$tmp"
1958 fi
1959 AC_SUBST($1)
1960 ])
1961
1962 # LIBRARY_VERSION(lib, [dir])
1963 # --------------------------------
1964 # Gets the version number of a library.
1965 # If $1 is ghc-prim, then we define LIBRARY_ghc_prim_VERSION as 1.2.3
1966 # $2 points to the directory under libraries/
1967 AC_DEFUN([LIBRARY_VERSION],[
1968 dir=m4_default([$2],[$1])
1969 LIBRARY_[]translit([$1], [-], [_])[]_VERSION=`grep -i "^version:" libraries/${dir}/$1.cabal | sed "s/.* //"`
1970 AC_SUBST(LIBRARY_[]translit([$1], [-], [_])[]_VERSION)
1971 ])
1972
1973 # XCODE_VERSION()
1974 # --------------------------------
1975 # Gets the version number of XCode, if on a Mac
1976 AC_DEFUN([XCODE_VERSION],[
1977     if test "$TargetOS_CPP" = "darwin"
1978     then
1979         AC_MSG_CHECKING(XCode version)
1980         XCodeVersion=`xcodebuild -version | grep Xcode | sed "s/Xcode //"`
1981         # Old XCode versions don't actually give the XCode version
1982         if test "$XCodeVersion" = ""
1983         then
1984             AC_MSG_RESULT(not found (too old?))
1985             XCodeVersion1=0
1986             XCodeVersion2=0
1987         else
1988             AC_MSG_RESULT($XCodeVersion)
1989             XCodeVersion1=`echo "$XCodeVersion" | sed 's/\..*//'`
1990             changequote(, )dnl
1991             XCodeVersion2=`echo "$XCodeVersion" | sed 's/[^.]*\.\([^.]*\).*/\1/'`
1992             changequote([, ])dnl
1993             AC_MSG_NOTICE(XCode version component 1: $XCodeVersion1)
1994             AC_MSG_NOTICE(XCode version component 2: $XCodeVersion2)
1995         fi
1996     fi
1997 ])
1998
1999 # FIND_LLVM_PROG()
2000 # --------------------------------
2001 # Find where the llvm tools are. We have a special function to handle when they
2002 # are installed with a version suffix (e.g., llc-3.1).
2003 #
2004 # $1 = the variable to set
2005 # $2 = the with option name
2006 # $3 = the command to look for
2007 #
2008 AC_DEFUN([FIND_LLVM_PROG],[
2009     FP_ARG_WITH_PATH_GNU_PROG_OPTIONAL([$1], [$2], [$3])
2010     if test "$$1" == ""; then
2011         save_IFS=$IFS
2012         IFS=":;"
2013         for p in ${PATH}; do
2014             if test -d "${p}"; then
2015                 $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`
2016                 if test -n "$1"; then
2017                     break
2018                 fi
2019             fi
2020         done
2021         IFS=$save_IFS
2022     fi
2023 ])
2024
2025 # FIND_GCC()
2026 # --------------------------------
2027 # Finds where gcc is
2028 #
2029 # $1 = the variable to set
2030 # $2 = the with option name
2031 # $3 = the command to look for
2032 AC_DEFUN([FIND_GCC],[
2033     if test "$TargetOS_CPP" = "darwin" &&
2034        test "$XCodeVersion1" -eq 4 &&
2035        test "$XCodeVersion2" -lt 2
2036     then
2037         # In Xcode 4.1, 'gcc-4.2' is the gcc legacy backend (rather
2038         # than the LLVM backend). We prefer the legacy gcc, but in
2039         # Xcode 4.2 'gcc-4.2' was removed.
2040         FP_ARG_WITH_PATH_GNU_PROG([$1], [gcc-4.2], [gcc-4.2])
2041     elif test "$windows" = YES
2042     then
2043         $1="$CC"
2044     else
2045         FP_ARG_WITH_PATH_GNU_PROG([$1], [$2], [$3])
2046     fi
2047     AC_SUBST($1)
2048 ])
2049
2050 # LocalWords:  fi