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)
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-apple-darwin)
495         $2="$$2 -m32"
496         $3="$$3 -m32"
497         $4="$$4 -arch i386"
498         $5="$$5 -m32"
499         ;;
500     x86_64-apple-darwin)
501         $2="$$2 -m64"
502         $3="$$3 -m64"
503         $4="$$4 -arch x86_64"
504         $5="$$5 -m64"
505         ;;
506     alpha-*)
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"
513         ;;
514     hppa*)
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"
520         ;;
521     esac
522
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
527     then
528         $2="$$2 -fno-stack-protector"
529     fi
530
531     # Reduce memory usage when linking. See trac #5240.
532     if test -n "$LdHashSize31"
533     then
534         $3="$$3 -Wl,$LdHashSize31"
535         $4="$$4     $LdHashSize31"
536     fi
537     if test -n "$LdReduceMemoryOverheads"
538     then
539         $3="$$3 -Wl,$LdReduceMemoryOverheads"
540         $4="$$4     $LdReduceMemoryOverheads"
541     fi
542
543     rm -f conftest.c conftest.o
544     AC_MSG_RESULT([done])
545 ])
546
547
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
552     # native path.
553     if test "$HostOS"     = "mingw32" && \
554        test "${OSTYPE}"  != "msys"    && \
555        test "${$1}" != ""
556     then
557         # Canonicalise to <drive>:/path/to/gcc
558         $1=`cygpath -m "${$1}"`
559     fi
560 ])
561
562
563 # FP_VISIBILITY_HIDDEN
564 # ----------------------------------
565 # Is the visibility hidden attribute supported?
566 AC_DEFUN([FP_VISIBILITY_HIDDEN],
567 [
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
571     then
572         AC_MSG_RESULT([yes])
573         AC_DEFINE(HAS_VISIBILITY_HIDDEN, 1, [Has visibility hidden])
574     else
575         AC_MSG_RESULT([no])
576     fi
577     rm -f conftest.c conftest.o
578 ])
579
580
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],
587     [AC_COMPILE_IFELSE(
588       [AC_LANG_PROGRAM(
589         [#include <endian.h>],
590         [#if defined(__FLOAT_WORD_ORDER) && __FLOAT_WORD_ORDER == BIG_ENDIAN
591              return 0;
592          #else
593              not float word order big endian
594          #endif]
595       )],
596       [fptools_cv_float_word_order_bigendian=yes],
597       [fptools_cv_float_word_order_bigendian=no])
598     ])
599   case $fptools_cv_float_word_order_bigendian in
600       yes)
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]) ;;
604   esac
605 ])
606
607
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
612 # found.
613 #
614 # This is ignored on the mingw32 platform.
615 #
616 # $1 = the variable to set
617 # $2 = the with option name
618 # $3 = the command to look for
619 #
620 AC_DEFUN([FP_ARG_WITH_PATH_GNU_PROG],
621 [
622 AC_ARG_WITH($2,
623 [AC_HELP_STRING([--with-$2=ARG],
624         [Use ARG as the path to $2 [default=autodetect]])],
625 [
626     if test "$HostOS" = "mingw32"
627     then
628         AC_MSG_WARN([Request to use $withval will be ignored])
629     else
630         $1=$withval
631     fi
632 ],
633 [
634     if test "$HostOS" != "mingw32"
635     then
636         if test "$target_alias" = "" ; then
637             AC_PATH_PROG([$1], [$3])
638         else
639             AC_PATH_PROG([$1], [$target_alias-$3])
640         fi
641         if test -z "$$1"
642         then
643             AC_MSG_ERROR([cannot find $3 in your PATH])
644         fi
645     fi
646 ]
647 )
648 ]) # FP_ARG_WITH_PATH_GNU_PROG
649
650
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
654 # isn't found.
655 #
656 # This is ignored on the mingw32 platform.
657 #
658 # $1 = the variable to set
659 # $2 = the with option name
660 # $3 = the command to look for
661 #
662 AC_DEFUN([FP_ARG_WITH_PATH_GNU_PROG_OPTIONAL],
663 [
664 AC_ARG_WITH($2,
665 [AC_HELP_STRING([--with-$2=ARG],
666         [Use ARG as the path to $2 [default=autodetect]])],
667 [
668     if test "$HostOS" = "mingw32"
669     then
670         AC_MSG_WARN([Request to use $withval will be ignored])
671     else
672         $1=$withval
673     fi
674 ],
675 [
676     if test "$HostOS" != "mingw32"
677     then
678         AC_PATH_PROG([$1], [$3])
679     fi
680 ]
681 )
682 ]) # FP_ARG_WITH_PATH_GNU_PROG_OPTIONAL
683
684 # FP_PROG_CONTEXT_DIFF
685 # --------------------
686 # Figure out how to do context diffs. Sets the output variable ContextDiffCmd.
687 #
688 # Note: NeXTStep thinks diff'ing a file against itself is "trouble".
689 #
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
694 echo foo > conftest2
695 fp_cv_context_diff=no
696 for fp_var in '-U 1' '-u1' '-C 1' '-c1'
697 do
698   if diff $fp_var conftest1 conftest2 > /dev/null 2>&1; then
699     fp_cv_context_diff="diff $fp_var"
700     break
701   fi
702 done])
703 if test x"$fp_cv_context_diff" = xno; then
704    AC_MSG_ERROR([cannot figure out how to do context diffs])
705 fi
706 AC_SUBST(ContextDiffCmd, [$fp_cv_context_diff])
707 ])# FP_PROG_CONTEXT_DIFF
708
709
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.
715 #
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
718 # little risk.
719 AC_DEFUN([FP_COMPUTE_INT],
720 [_AC_COMPUTE_INT([$1], [$2], [$3], [$4])[]dnl
721 ])# FP_COMPUTE_INT
722
723
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)],
736                  [fp_Cache],
737                  [AC_INCLUDES_DEFAULT([$3])],
738                  [AC_MSG_ERROR([cannot compute alignment ($1)
739 See `config.log' for more details.], [77])])
740 else
741   fp_Cache=0
742 fi])[]dnl
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
746
747
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.
753 #
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
757 #
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?!?
764 #
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
769   case $build in
770     i386-*2\.@<:@0-9@:>@ | i386-*3\.@<:@0-3@:>@ ) fptools_cv_leading_underscore=yes ;;
771     *) fptools_cv_leading_underscore=no ;;
772   esac ;;
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;;
777
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;;
781
782 *) AC_RUN_IFELSE([AC_LANG_SOURCE([[#ifdef HAVE_NLIST_H
783 #include <nlist.h>
784 struct nlist xYzzY1[] = {{"xYzzY1", 0},{0}};
785 struct nlist xYzzY2[] = {{"_xYzzY2", 0},{0}};
786 #endif
787
788 int main(argc, argv)
789 int argc;
790 char **argv;
791 {
792 #ifdef HAVE_NLIST_H
793     if(nlist(argv[0], xYzzY1) == 0 && xYzzY1[0].n_value != 0)
794         exit(1);
795     if(nlist(argv[0], xYzzY2) == 0 && xYzzY2[0].n_value != 0)
796         exit(0);
797 #endif
798     exit(1);
799 }]])],[fptools_cv_leading_underscore=yes],[fptools_cv_leading_underscore=no],[fptools_cv_leading_underscore=no])
800 ;;
801 esac]);
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
806
807
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
816 do
817
818   set dummy $fp_version1; shift
819   fp_num1=""
820   test $[@%:@] = 0 || { fp_num1="[$]1"; shift; }
821   test x"$fp_num1" = x && fp_num1="0"
822   fp_version1="[$]*"
823
824   set dummy $fp_version2; shift
825   fp_num2=""
826   test $[@%:@] = 0 || { fp_num2="[$]1"; shift; }
827   test x"$fp_num2" = x && fp_num2="0"
828   fp_version2="[$]*"
829
830   test "$fp_num1" = "$fp_num2" || break;
831 done
832 IFS=$fp_save_IFS
833 AS_IF([test "$fp_num1" $2 "$fp_num2"], [$4], [$5])[]dnl
834 ])# FP_COMPARE_VERSIONS
835
836
837 dnl
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.
841 dnl
842 AC_DEFUN([FPTOOLS_HAPPY],
843 [FP_PATH_PROG(HappyCmd,happy,)
844
845 AC_CACHE_CHECK([for version of happy], fptools_cv_happy_version,
846 changequote(, )dnl
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'` ;
850 else
851    fptools_cv_happy_version="";
852 fi;
853 changequote([, ])dnl
854 ])
855 if test ! -f compiler/parser/Parser.hs || test ! -f compiler/cmm/CmmParse.hs || test ! -f compiler/parser/ParserCore.hs
856 then
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.])])[]
859 fi
860 HappyVersion=$fptools_cv_happy_version;
861 AC_SUBST(HappyVersion)
862 ])
863
864 dnl
865 dnl Check for Alex and version.  If we're building GHC, then we need
866 dnl at least Alex version 2.1.1.
867 dnl
868 AC_DEFUN([FPTOOLS_ALEX],
869 [
870 FP_PATH_PROG(AlexCmd,alex,)
871
872 AC_CACHE_CHECK([for version of alex], fptools_cv_alex_version,
873 changequote(, )dnl
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'` ;
877 else
878    fptools_cv_alex_version="";
879 fi;
880 changequote([, ])dnl
881 ])
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
885 then
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.])])[]
888 fi
889 if test ! -f utils/haddock/src/Haddock/Lex.hs
890 then
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.])])[]
893 fi
894 AlexVersion=$fptools_cv_alex_version;
895 AC_SUBST(AlexVersion)
896 AC_SUBST(Alex3)
897 ])
898
899
900 # FP_PROG_LD_FLAG
901 # ---------------
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],
905 [
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
910    fp_cv_$2=$1
911 else
912    fp_cv_$2=
913 fi
914 rm -rf conftest*])
915 $2=$fp_cv_$2
916 ])# FP_PROG_LD_FLAG
917
918
919 # FP_PROG_LD_HashSize31
920 # ------------
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],
924 [
925 FP_PROG_LD_FLAG([--hash-size=31],[LdHashSize31])
926 ])# FP_PROG_LD_HashSize31
927
928
929 # FP_PROG_LD_ReduceMemoryOverheads
930 # ------------
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],
935 [
936 FP_PROG_LD_FLAG([--reduce-memory-overheads],[LdReduceMemoryOverheads])
937 ])# FP_PROG_LD_ReduceMemoryOverheads
938
939
940 # FP_PROG_LD_BUILD_ID
941 # ------------
942
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],
946 [
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
952 else
953    fp_cv_ld_build_id=no
954 fi
955 rm -rf conftest*])
956 if test "$fp_cv_ld_build_id" = yes; then
957   LdHasBuildId=YES
958 else
959   LdHasBuildId=NO
960 fi
961 AC_SUBST([LdHasBuildId])
962 ])# FP_PROG_LD_BUILD_ID
963
964
965 # FP_PROG_LD_IS_GNU
966 # -----------------
967 # Sets the output variable LdIsGNULd to YES or NO, depending on whether it is
968 # GNU ld or not.
969 AC_DEFUN([FP_PROG_LD_IS_GNU],
970 [
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
973   fp_cv_gnu_ld=yes
974 else
975   fp_cv_gnu_ld=no
976 fi])
977 AC_SUBST([LdIsGNULd], [`echo $fp_cv_gnu_ld | sed 'y/yesno/YESNO/'`])
978 ])# FP_PROG_LD_IS_GNU
979
980
981 # FP_PROG_LD_NO_COMPACT_UNWIND
982 # ----------------------------
983
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],
987 [
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
993 else
994    fp_cv_ld_no_compact_unwind=no
995 fi
996 rm -rf conftest*])
997 if test "$fp_cv_ld_no_compact_unwind" = yes; then
998   LdHasNoCompactUnwind=YES
999 else
1000   LdHasNoCompactUnwind=NO
1001 fi
1002 AC_SUBST([LdHasNoCompactUnwind])
1003 ])# FP_PROG_LD_NO_COMPACT_UNWIND
1004
1005
1006 # FP_PROG_AR
1007 # ----------
1008 # Sets fp_prog_ar to a (non-Cygwin) path to ar. Exits if no ar can be found
1009 AC_DEFUN([FP_PROG_AR],
1010 [FP_PATH_PROG([fp_prog_ar], [ar])
1011 if test -z "$fp_prog_ar"; then
1012   AC_MSG_ERROR([cannot find ar in your PATH, no idea how to make a library])
1013 fi
1014 ])# FP_PROG_AR
1015
1016
1017 # FP_PROG_AR_IS_GNU
1018 # -----------------
1019 # Sets fp_prog_ar_is_gnu to yes or no, depending on whether it is GNU ar or not.
1020 AC_DEFUN([FP_PROG_AR_IS_GNU],
1021 [AC_REQUIRE([FP_PROG_AR])
1022 AC_CACHE_CHECK([whether $fp_prog_ar is GNU ar], [fp_cv_prog_ar_is_gnu],
1023 [if "$fp_prog_ar" --version 2> /dev/null | grep "GNU" > /dev/null 2>&1; then
1024   fp_cv_prog_ar_is_gnu=yes
1025 else
1026   fp_cv_prog_ar_is_gnu=no
1027 fi])
1028 fp_prog_ar_is_gnu=$fp_cv_prog_ar_is_gnu
1029 AC_SUBST([ArIsGNUAr], [`echo $fp_prog_ar_is_gnu | tr 'a-z' 'A-Z'`])
1030 ])# FP_PROG_AR_IS_GNU
1031
1032
1033 # FP_PROG_AR_SUPPORTS_ATFILE
1034 # -----------------
1035 # Sets fp_prog_ar_supports_atfile to yes or no, depending on whether
1036 # or not it supports the @file syntax
1037 AC_DEFUN([FP_PROG_AR_SUPPORTS_ATFILE],
1038 [AC_REQUIRE([FP_PROG_AR])
1039  AC_REQUIRE([FP_PROG_AR_ARGS])
1040 AC_CACHE_CHECK([whether $fp_prog_ar supports @file], [fp_cv_prog_ar_supports_atfile],
1041 [
1042 rm -f conftest*
1043 touch conftest.file
1044 echo conftest.file  > conftest.atfile
1045 echo conftest.file >> conftest.atfile
1046 "$fp_prog_ar" $fp_prog_ar_args conftest.a @conftest.atfile > /dev/null 2>&1
1047 fp_prog_ar_supports_atfile_tmp=`"$fp_prog_ar" t conftest.a 2> /dev/null | grep -c conftest.file`
1048 rm -f conftest*
1049 if test "$fp_prog_ar_supports_atfile_tmp" -eq 2
1050 then
1051   fp_cv_prog_ar_supports_atfile=yes
1052 else
1053   fp_cv_prog_ar_supports_atfile=no
1054 fi])
1055 fp_prog_ar_supports_atfile=$fp_cv_prog_ar_supports_atfile
1056 AC_SUBST([ArSupportsAtFile], [`echo $fp_prog_ar_supports_atfile | tr 'a-z' 'A-Z'`])
1057 ])# FP_PROG_AR_SUPPORTS_ATFILE
1058
1059 # FP_PROG_AR_ARGS
1060 # ---------------
1061 # Sets fp_prog_ar_args to the arguments for ar and the output variable ArCmd
1062 # to a non-Cygwin invocation of ar including these arguments.
1063 AC_DEFUN([FP_PROG_AR_ARGS],
1064 [AC_REQUIRE([FP_PROG_AR_IS_GNU])
1065 AC_CACHE_CHECK([for ar arguments], [fp_cv_prog_ar_args],
1066 [
1067 # GNU ar needs special treatment: it appears to have problems with
1068 # object files with the same name if you use the 's' modifier, but
1069 # simple 'ar q' works fine, and doesn't need a separate ranlib.
1070 if test $fp_prog_ar_is_gnu = yes; then
1071   fp_cv_prog_ar_args="q"
1072 else
1073   touch conftest.dummy
1074   for fp_var in clqsZ clqs cqs clq cq ; do
1075      rm -f conftest.a
1076      if "$fp_prog_ar" $fp_var conftest.a conftest.dummy > /dev/null 2> /dev/null; then
1077         fp_cv_prog_ar_args=$fp_var
1078         break
1079      fi
1080   done
1081   rm -f conftest*
1082   if test -z "$fp_cv_prog_ar_args"; then
1083     AC_MSG_ERROR([cannot figure out how to use your $fp_prog_ar])
1084   fi
1085 fi])
1086 fp_prog_ar_args=$fp_cv_prog_ar_args
1087 AC_SUBST([ArCmd], ["$fp_prog_ar"])
1088 AC_SUBST([ArArgs], ["$fp_prog_ar_args"])
1089
1090 ])# FP_PROG_AR_ARGS
1091
1092
1093 # FP_PROG_AR_NEEDS_RANLIB
1094 # -----------------------
1095 # Sets the output variable RANLIB to "ranlib" if it is needed and found,
1096 # to "true" otherwise.
1097 AC_DEFUN([FP_PROG_AR_NEEDS_RANLIB],
1098 [AC_REQUIRE([FP_PROG_AR_IS_GNU])
1099 AC_REQUIRE([FP_PROG_AR_ARGS])
1100 AC_REQUIRE([AC_PROG_CC])
1101 AC_CACHE_CHECK([whether ranlib is needed], [fp_cv_prog_ar_needs_ranlib],
1102 [if test $fp_prog_ar_is_gnu = yes; then
1103   fp_cv_prog_ar_needs_ranlib=no
1104 elif echo $TargetPlatform | grep "^.*-apple-darwin$"  > /dev/null 2> /dev/null; then
1105   # It's quite tedious to check for Apple's crazy timestamps in .a files,
1106   # so we hardcode it.
1107   fp_cv_prog_ar_needs_ranlib=yes
1108 elif echo $fp_prog_ar_args | grep "s" > /dev/null 2> /dev/null; then
1109   fp_cv_prog_ar_needs_ranlib=no
1110 else
1111   fp_cv_prog_ar_needs_ranlib=yes
1112 fi])
1113 if test $fp_cv_prog_ar_needs_ranlib = yes; then
1114    AC_PROG_RANLIB
1115 else
1116   RANLIB="true"
1117   AC_SUBST([RANLIB])
1118 fi
1119 ])# FP_PROG_AR_NEEDS_RANLIB
1120
1121
1122 # FP_GCC_VERSION
1123 # -----------
1124 # Extra testing of the result AC_PROG_CC, testing the gcc version no. Sets the
1125 # output variable GccVersion.
1126 AC_DEFUN([FP_GCC_VERSION],
1127 [AC_REQUIRE([AC_PROG_CC])
1128 if test -z "$CC"
1129 then
1130   AC_MSG_ERROR([gcc is required])
1131 fi
1132 GccLT34=NO
1133 GccLT46=NO
1134 AC_CACHE_CHECK([version of gcc], [fp_cv_gcc_version],
1135 [
1136     fp_cv_gcc_version="`$CC -v 2>&1 | grep 'version ' | sed -e 's/.*version [[^0-9]]*\([[0-9.]]*\).*/\1/g'`"
1137     FP_COMPARE_VERSIONS([$fp_cv_gcc_version], [-lt], [3.0],
1138                         [AC_MSG_ERROR([Need at least gcc version 3.0 (3.4+ recommended)])])
1139     # See #2770: gcc 2.95 doesn't work any more, apparently.  There probably
1140     # isn't a very good reason for that, but for now just make configure
1141     # fail.
1142     FP_COMPARE_VERSIONS([$fp_cv_gcc_version], [-lt], [3.4], GccLT34=YES)
1143     FP_COMPARE_VERSIONS([$fp_cv_gcc_version], [-lt], [4.6], GccLT46=YES)
1144 ])
1145 AC_SUBST([GccVersion], [$fp_cv_gcc_version])
1146 AC_SUBST(GccLT34)
1147 AC_SUBST(GccLT46)
1148 ])# FP_GCC_VERSION
1149
1150 dnl Check to see if the C compiler is clang or llvm-gcc
1151 dnl
1152 AC_DEFUN([FP_CC_LLVM_BACKEND],
1153 [AC_REQUIRE([AC_PROG_CC])
1154 AC_MSG_CHECKING([whether C compiler is clang])
1155 $CC -x c /dev/null -dM -E > conftest.txt 2>&1
1156 if grep "__clang__" conftest.txt >/dev/null 2>&1; then
1157   AC_SUBST([CC_CLANG_BACKEND], [1])
1158   AC_SUBST([CC_LLVM_BACKEND], [1])
1159   AC_MSG_RESULT([yes])
1160 else
1161   AC_MSG_RESULT([no])
1162   AC_MSG_CHECKING([whether C compiler has an LLVM back end])
1163   if grep "__llvm__" conftest.txt >/dev/null 2>&1; then
1164     AC_SUBST([CC_CLANG_BACKEND], [0])
1165     AC_SUBST([CC_LLVM_BACKEND], [1])
1166     AC_MSG_RESULT([yes])
1167   else
1168     AC_SUBST([CC_CLANG_BACKEND], [0])
1169     AC_SUBST([CC_LLVM_BACKEND], [0])
1170     AC_MSG_RESULT([no])
1171   fi
1172 fi
1173
1174 rm -f conftest.txt
1175 ])
1176
1177 dnl Small feature test for perl version. Assumes PerlCmd
1178 dnl contains path to perl binary.
1179 dnl
1180 dnl (Perl versions prior to v5.6 does not contain the string "v5";
1181 dnl instead they display version strings such as "version 5.005".)
1182 dnl
1183 AC_DEFUN([FPTOOLS_CHECK_PERL_VERSION],
1184 [$PerlCmd -v >conftest.out 2>&1
1185    if grep "v5" conftest.out >/dev/null 2>&1; then
1186       :
1187    else
1188       AC_MSG_ERROR([your version of perl probably won't work, try upgrading it.])
1189    fi
1190 rm -fr conftest*
1191 ])
1192
1193
1194 # FP_CHECK_PROG(VARIABLE, PROG-TO-CHECK-FOR,
1195 #               [VALUE-IF-NOT-FOUND], [PATH], [REJECT])
1196 # -----------------------------------------------------
1197 # HACK: A small wrapper around AC_CHECK_PROG, setting VARIABLE to the full path
1198 # of PROG-TO-CHECK-FOR when found.
1199 AC_DEFUN([FP_CHECK_PROG],
1200 [AC_CHECK_PROG([$1], [$2], [$as_dir/$ac_word$ac_exec_ext], [$3], [$4], [$5])][]dnl
1201 )# FP_CHECK_PROC
1202
1203
1204 # FP_PROG_FIND
1205 # ------------
1206 # Find a non-WinDoze version of the "find" utility.
1207 AC_DEFUN([FP_PROG_FIND],
1208 [AC_PATH_PROGS([fp_prog_find], [gfind find], find)
1209 echo foo > conftest.txt
1210 $fp_prog_find conftest.txt -print > conftest.out 2>&1
1211 if grep '^conftest.txt$' conftest.out > /dev/null 2>&1 ; then
1212   # OK, looks like a real "find".
1213   case $HostPlatform in
1214     *mingw32)
1215       if test x${OSTYPE} != xmsys
1216       then
1217             fp_prog_find="`cygpath --mixed ${fp_prog_find}`"
1218         AC_MSG_NOTICE([normalized find command to $fp_prog_find])
1219       fi ;;
1220     *) ;;
1221   esac
1222   FindCmd="$fp_prog_find"
1223 else
1224   # Found a poor WinDoze version of "find", ignore it.
1225   AC_MSG_WARN([$fp_prog_find looks like a non-*nix find, ignoring it])
1226   FP_CHECK_PROG([FindCmd], [find], [], [], [$fp_prog_find])
1227 fi
1228 rm -f conftest.txt conftest.out
1229 AC_SUBST([FindCmd])[]dnl
1230 ])# FP_PROG_FIND
1231
1232
1233 # FP_PROG_SORT
1234 # ------------
1235 # Find a Unix-like sort
1236 AC_DEFUN([FP_PROG_SORT],
1237 [AC_PATH_PROG([fp_prog_sort], [sort])
1238 echo conwip > conftest.txt
1239 $fp_prog_sort -f conftest.txt > conftest.out 2>&1
1240 if grep 'conwip' conftest.out > /dev/null 2>&1 ; then
1241   # The goods
1242   SortCmd="$fp_prog_sort"
1243 else
1244   # Summink else..pick next one.
1245   AC_MSG_WARN([$fp_prog_sort looks like a non-*nix sort, ignoring it])
1246   FP_CHECK_PROG([SortCmd], [sort], [], [], [$fp_prog_sort])
1247 fi
1248 rm -f conftest.txt conftest.out
1249 AC_SUBST([SortCmd])[]dnl
1250 ])# FP_PROG_SORT
1251
1252
1253 dnl
1254 dnl FPTOOLS_NOCACHE_CHECK prints a message, then sets the
1255 dnl values of the second argument to the result of running
1256 dnl the commands given by the third. It does not cache its
1257 dnl result, so it is suitable for checks which should be
1258 dnl run every time.
1259 dnl
1260 AC_DEFUN([FPTOOLS_NOCACHE_CHECK],
1261 [AC_MSG_CHECKING([$1])
1262  $3
1263  AC_MSG_RESULT([$][$2])
1264 ])
1265
1266 dnl
1267 dnl FPTOOLS_GHC_VERSION(version)
1268 dnl FPTOOLS_GHC_VERSION(major, minor [, patchlevel])
1269 dnl FPTOOLS_GHC_VERSION(version, major, minor, patchlevel)
1270 dnl
1271 dnl Test for version of installed ghc.  Uses $GHC.
1272 dnl [original version pinched from c2hs]
1273 dnl
1274 AC_DEFUN([FPTOOLS_GHC_VERSION],
1275 [FPTOOLS_NOCACHE_CHECK([version of ghc], [fptools_version_of_ghc],
1276 ["${WithGhc-ghc}" --version > conftestghc 2>&1
1277   cat conftestghc >&AS_MESSAGE_LOG_FD
1278 #Useless Use Of cat award...
1279   fptools_version_of_ghc=`cat conftestghc | sed -n -e 's/, patchlevel *\([[0-9]]\)/.\1/;s/.* version \([[0-9]][[0-9.]]*\).*/\1/p'`
1280   rm -fr conftest*
1281   if test "[$]fptools_version_of_ghc" = ""
1282   then
1283     fptools_version_of_ghc='unknown'
1284   fi
1285 fptools_version_of_ghc[_major]=`echo [$]fptools_version_of_ghc | sed -e 's/^\([[0-9]]\).*/\1/'`
1286 fptools_version_of_ghc[_minor]=`echo [$]fptools_version_of_ghc | sed -e 's/^[[0-9]]\.\([[0-9]]*\).*/\1/'`
1287 fptools_version_of_ghc[_pl]=`echo [$]fptools_version_of_ghc | sed -n -e 's/^[[0-9]]\.[[0-9]]*\.\([[0-9]]*\)/\1/p'`
1288 #
1289 if test "[$]fptools_version_of_ghc[_pl]" = ""
1290 then
1291   fptools_version_of_ghc[_all]="[$]fptools_version_of_ghc[_major].[$]fptools_version_of_ghc[_minor]"
1292   fptools_version_of_ghc[_pl]="0"
1293 else
1294   fptools_version_of_ghc[_all]="[$]fptools_version_of_ghc[_major].[$]fptools_version_of_ghc[_minor].[$]fptools_version_of_ghc[_pl]"
1295 fi
1296 #
1297 ifelse($#, [1], [dnl
1298 [$1]="[$]fptools_version_of_ghc[_all]"
1299 ], $#, [2], [dnl
1300 [$1]="[$]fptools_version_of_ghc[_major]"
1301 [$2]="[$]fptools_version_of_ghc[_minor]"
1302 ], $#, [3], [dnl
1303 [$1]="[$]fptools_version_of_ghc[_major]"
1304 [$2]="[$]fptools_version_of_ghc[_minor]"
1305 [$3]="[$]fptools_version_of_ghc[_pl]"
1306 ], $#, [4], [dnl
1307 [$1]="[$]fptools_version_of_ghc[_all]"
1308 [$2]="[$]fptools_version_of_ghc[_major]"
1309 [$3]="[$]fptools_version_of_ghc[_minor]"
1310 [$4]="[$]fptools_version_of_ghc[_pl]"
1311 ])
1312 ])
1313 ])dnl
1314
1315
1316 # FP_CHECK_FUNC(FUNCTION, PROLOGUE, BODY, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
1317 # ---------------------------------------------------------------------------------
1318 # A variant of AC_CHECK_FUNCS, limited to a single FUNCTION, but with the
1319 # additional flexibility of specifying the PROLOGUE and BODY.
1320 AC_DEFUN([FP_CHECK_FUNC],
1321 [AS_VAR_PUSHDEF([fp_func], [fp_cv_func_$1])dnl
1322 AC_CACHE_CHECK([for $1], fp_func,
1323 [AC_LINK_IFELSE([AC_LANG_PROGRAM([$2], [$3])],
1324                 [AS_VAR_SET(fp_func, yes)],
1325                 [AS_VAR_SET(fp_func, no)])])
1326 AS_IF([test AS_VAR_GET(fp_func) = yes],
1327       [AC_DEFINE(AS_TR_CPP(HAVE_$1), [1],
1328                 [Define to 1 if you have the `]$1[' function.]) $4],
1329       [$5])dnl
1330 AS_VAR_POPDEF([fp_func])dnl
1331 ])# FP_CHECK_FUNC
1332
1333
1334 # FP_GEN_DOCBOOK_XML
1335 # ------------------
1336 # Generates a DocBook XML V4.5 document in conftest.xml.
1337 #
1338 # It took a lot of experimentation to find a document that will cause
1339 # xsltproc to fail with an error code when the relevant
1340 # stylesheets/DTDs are not found.  I couldn't make xsltproc fail with
1341 # a single-file document, it seems a multi-file document is needed.
1342 # -- SDM 2009-06-03
1343 #
1344 AC_DEFUN([FP_GEN_DOCBOOK_XML],
1345 [rm -f conftest.xml conftest-book.xml
1346 cat > conftest.xml << EOF
1347 <?xml version="1.0" encoding="iso-8859-1"?>
1348 <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
1349    "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [[
1350 <!ENTITY conftest-book SYSTEM "conftest-book.xml">
1351 ]]>
1352 <book id="test">
1353 &conftest-book;
1354 </book>
1355 EOF
1356 cat >conftest-book.xml << EOF
1357 <?xml version="1.0" encoding="iso-8859-1"?>
1358   <title>A DocBook &ldquo;Test Document&rdquo;</title>
1359   <chapter id="id-one">
1360     <title>A Chapter Title</title>
1361     <para>This is a paragraph, referencing <xref linkend="id-two"/>.</para>
1362   </chapter>
1363   <chapter id="id-two">
1364     <title>Another Chapter Title</title>
1365     <para>This is another paragraph, referencing <xref linkend="id-one"/>.</para>
1366   </chapter>
1367 EOF
1368 ]) # FP_GEN_DOCBOOK_XML
1369
1370
1371 # FP_PROG_DBLATEX
1372 # ----------------
1373 # Sets the output variable DblatexCmd to the full path of dblatex,
1374 # which we use for building PDF and PS docs.
1375 # DblatexCmd is empty if dblatex could not be found.
1376 AC_DEFUN([FP_PROG_DBLATEX],
1377 [FP_PATH_PROG([DblatexCmd], [dblatex])
1378 if test -z "$DblatexCmd"; then
1379   AC_MSG_WARN([cannot find dblatex in your PATH, you will not be able to build the PDF and PS documentation])
1380 fi
1381 ])# FP_PROG_DBLATEX
1382
1383
1384 # FP_PROG_XSLTPROC
1385 # ----------------
1386 # Sets the output variable XsltprocCmd to the full path of the XSLT processor
1387 # xsltproc. XsltprocCmd is empty if xsltproc could not be found.
1388 AC_DEFUN([FP_PROG_XSLTPROC],
1389 [FP_PATH_PROG([XsltprocCmd], [xsltproc])
1390 if test -z "$XsltprocCmd"; then
1391   AC_MSG_WARN([cannot find xsltproc in your PATH, you will not be able to build the HTML documentation])
1392 fi
1393 ])# FP_PROG_XSLTPROC
1394
1395
1396 # FP_DOCBOOK_XSL
1397 # ----------------------------
1398 # Check that we can process a DocBook XML document to HTML using xsltproc.
1399 AC_DEFUN([FP_DOCBOOK_XSL],
1400 [AC_REQUIRE([FP_PROG_XSLTPROC])dnl
1401 if test -n "$XsltprocCmd"; then
1402   AC_CACHE_CHECK([for DocBook XSL stylesheet], fp_cv_dir_docbook_xsl,
1403   [FP_GEN_DOCBOOK_XML
1404   fp_cv_dir_docbook_xsl=no
1405   if $XsltprocCmd --nonet http://docbook.sourceforge.net/release/xsl/current/html/chunk.xsl conftest.xml > /dev/null 2>&1; then
1406      fp_cv_dir_docbook_xsl=yes
1407   fi
1408   rm -rf conftest*])
1409 fi
1410 if test x"$fp_cv_dir_docbook_xsl" = xno; then
1411   AC_MSG_WARN([cannot find DocBook XSL stylesheets, you will not be able to build the documentation])
1412   HAVE_DOCBOOK_XSL=NO
1413 else
1414   HAVE_DOCBOOK_XSL=YES
1415 fi
1416 AC_SUBST([HAVE_DOCBOOK_XSL])
1417 ])# FP_DOCBOOK_XSL
1418
1419
1420 # FP_PROG_XMLLINT
1421 # ----------------
1422 # Sets the output variable XmllintCmd to the full path of the XSLT processor
1423 # xmllint. XmllintCmd is empty if xmllint could not be found.
1424 AC_DEFUN([FP_PROG_XMLLINT],
1425 [FP_PATH_PROG([XmllintCmd], [xmllint])
1426 if test -z "$XmllintCmd"; then
1427   AC_MSG_WARN([cannot find xmllint in your PATH, you will not be able to validate your documentation])
1428 fi
1429 ])# FP_PROG_XMLLINT
1430
1431
1432 # FP_CHECK_DOCBOOK_DTD
1433 # --------------------
1434 AC_DEFUN([FP_CHECK_DOCBOOK_DTD],
1435 [AC_REQUIRE([FP_PROG_XMLLINT])dnl
1436 if test -n "$XmllintCmd"; then
1437   AC_MSG_CHECKING([for DocBook DTD])
1438   FP_GEN_DOCBOOK_XML
1439   if $XmllintCmd --nonet --valid --noout conftest.xml ; then
1440     AC_MSG_RESULT([ok])
1441   else
1442     AC_MSG_RESULT([failed])
1443     AC_MSG_WARN([cannot find a DTD for DocBook XML V4.5, you will not be able to validate your documentation])
1444     AC_MSG_WARN([check your XML_CATALOG_FILES environment variable and/or /etc/xml/catalog])
1445   fi
1446   rm -rf conftest*
1447 fi
1448 ])# FP_CHECK_DOCBOOK_DTD
1449
1450
1451 # FP_PROG_GHC_PKG
1452 # ----------------
1453 # Try to find a ghc-pkg matching the ghc mentioned in the environment variable
1454 # WithGhc. Sets the output variable GhcPkgCmd.
1455 AC_DEFUN([FP_PROG_GHC_PKG],
1456 [AC_CACHE_CHECK([for ghc-pkg matching $WithGhc], fp_cv_matching_ghc_pkg,
1457 [
1458 # If we are told to use ghc-stage2, then we're using an in-tree
1459 # compiler. In this case, we just want ghc-pkg, not ghc-pkg-stage2,
1460 # so we sed off -stage[0-9]$. However, if we are told to use
1461 # ghc-6.12.1 then we want to use ghc-pkg-6.12.1, so we keep any
1462 # other suffix.
1463 fp_ghc_pkg_guess=`echo $WithGhc | sed -e 's/-stage@<:@0-9@:>@$//' -e 's,ghc\(@<:@^/\\@:>@*\)$,ghc-pkg\1,'`
1464 if "$fp_ghc_pkg_guess" list > /dev/null 2>&1; then
1465   fp_cv_matching_ghc_pkg=$fp_ghc_pkg_guess
1466 else
1467   AC_MSG_ERROR([Cannot find matching ghc-pkg])
1468 fi])
1469 GhcPkgCmd=$fp_cv_matching_ghc_pkg
1470 AC_SUBST([GhcPkgCmd])
1471 ])# FP_PROG_GHC_PKG
1472
1473
1474 # FP_GCC_EXTRA_FLAGS
1475 # ------------------
1476 # Determine which extra flags we need to pass gcc when we invoke it
1477 # to compile .hc code.
1478 #
1479 # -fwrapv is needed for gcc to emit well-behaved code in the presence of
1480 # integer wrap around. (Trac #952)
1481 #
1482 AC_DEFUN([FP_GCC_EXTRA_FLAGS],
1483 [AC_REQUIRE([FP_GCC_VERSION])
1484 AC_CACHE_CHECK([for extra options to pass gcc when compiling via C], [fp_cv_gcc_extra_opts],
1485 [fp_cv_gcc_extra_opts=
1486  FP_COMPARE_VERSIONS([$fp_cv_gcc_version], [-ge], [3.4],
1487   [fp_cv_gcc_extra_opts="$fp_cv_gcc_extra_opts -fwrapv"],
1488   [])
1489 ])
1490 AC_SUBST([GccExtraViaCOpts],$fp_cv_gcc_extra_opts)
1491 ])
1492
1493
1494 # FP_SETUP_PROJECT_VERSION
1495 # ---------------------
1496 AC_DEFUN([FP_SETUP_PROJECT_VERSION],
1497 [
1498 if test "$RELEASE" = "NO"; then
1499     AC_MSG_CHECKING([for GHC version date])
1500     if test -f VERSION_DATE; then
1501         PACKAGE_VERSION=${PACKAGE_VERSION}.`cat VERSION_DATE`
1502         AC_MSG_RESULT(given $PACKAGE_VERSION)
1503     elif test -d .git; then
1504         changequote(, )dnl
1505         ver_date=`git log -n 1 --date=short --pretty=format:%ci | cut -d ' ' -f 1 | tr -d -`
1506         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
1507         changequote([, ])dnl
1508                 AC_MSG_ERROR([failed to detect version date: check that git is in your path])
1509         fi
1510         PACKAGE_VERSION=${PACKAGE_VERSION}.$ver_date
1511         AC_MSG_RESULT(inferred $PACKAGE_VERSION)
1512     elif test -f VERSION; then
1513         PACKAGE_VERSION=`cat VERSION`
1514         AC_MSG_RESULT(given $PACKAGE_VERSION)
1515     else
1516         AC_MSG_WARN([cannot determine snapshot version: no .git directory and no VERSION file])
1517     fi
1518 fi
1519
1520 # Some renamings
1521 AC_SUBST([ProjectName], [$PACKAGE_NAME])
1522 AC_SUBST([ProjectVersion], [$PACKAGE_VERSION])
1523
1524 # Split PACKAGE_VERSION into (possibly empty) parts
1525 VERSION_MAJOR=`echo $PACKAGE_VERSION | sed 's/^\(@<:@^.@:>@*\)\(\.\{0,1\}\(.*\)\)$/\1'/`
1526 VERSION_TMP=`echo $PACKAGE_VERSION | sed 's/^\(@<:@^.@:>@*\)\(\.\{0,1\}\(.*\)\)$/\3'/`
1527 VERSION_MINOR=`echo $VERSION_TMP | sed 's/^\(@<:@^.@:>@*\)\(\.\{0,1\}\(.*\)\)$/\1'/`
1528 ProjectPatchLevel=`echo $VERSION_TMP | sed 's/^\(@<:@^.@:>@*\)\(\.\{0,1\}\(.*\)\)$/\3'/`
1529
1530 # Calculate project version as an integer, using 2 digits for minor version
1531 case $VERSION_MINOR in
1532   ?) ProjectVersionInt=${VERSION_MAJOR}0${VERSION_MINOR} ;;
1533   ??) ProjectVersionInt=${VERSION_MAJOR}${VERSION_MINOR} ;;
1534   *) AC_MSG_ERROR([bad minor version in $PACKAGE_VERSION]) ;;
1535 esac
1536 AC_SUBST([ProjectVersionInt])
1537
1538 # The project patchlevel is zero unless stated otherwise
1539 test -z "$ProjectPatchLevel" && ProjectPatchLevel=0
1540
1541 # Remove dots from the patch level; this allows us to have versions like 6.4.1.20050508
1542 ProjectPatchLevel=`echo $ProjectPatchLevel | sed 's/\.//'`
1543
1544 AC_SUBST([ProjectPatchLevel])
1545 ])# FP_SETUP_PROJECT_VERSION
1546
1547
1548 # Check for a working timer_create().  We need a pretty detailed check
1549 # here, because there exist partially-working implementations of
1550 # timer_create() in certain versions of Linux (see bug #1933).
1551 #
1552 AC_DEFUN([FP_CHECK_TIMER_CREATE],[
1553 AC_CHECK_FUNC([timer_create],[HAVE_timer_create=yes],[HAVE_timer_create=no])
1554
1555 if test "$HAVE_timer_create" = "yes"
1556 then
1557   if test "$cross_compiling" = "yes"
1558   then
1559     # We can't test timer_create when we're cross-compiling, so we
1560     # optimistiaclly assume that it actually works properly.
1561     AC_DEFINE([USE_TIMER_CREATE], 1,  [Define to 1 if we can use timer_create(CLOCK_PROCESS_CPUTIME_ID,...)])
1562   else
1563   AC_CACHE_CHECK([for a working timer_create(CLOCK_REALTIME)], 
1564     [fptools_cv_timer_create_works],
1565     [AC_TRY_RUN([
1566 #include <stdio.h>
1567 #ifdef HAVE_STDLIB_H
1568 #include <stdlib.h>
1569 #endif
1570 #ifdef HAVE_TIME_H
1571 #include <time.h>
1572 #endif
1573 #ifdef HAVE_SIGNAL_H
1574 #include <signal.h>
1575 #endif
1576 #ifdef HAVE_UNISTD_H
1577 #include <unistd.h>
1578 #endif
1579
1580 static volatile int tock = 0;
1581 static void handler(int i)
1582 {
1583    tock = 1;
1584 }
1585
1586 static void timeout(int i)
1587 {
1588   // timer_settime() has been known to hang, so just in case
1589   // we install a 1-second timeout (see #2257)
1590   exit(99);
1591 }
1592
1593 int main(int argc, char *argv[])
1594 {
1595
1596     struct sigevent ev;
1597     timer_t timer;
1598     struct itimerspec it;
1599     struct sigaction action;
1600     int m,n,count = 0;
1601
1602     ev.sigev_notify = SIGEV_SIGNAL;
1603     ev.sigev_signo  = SIGVTALRM;
1604
1605     action.sa_handler = handler;
1606     action.sa_flags = 0;
1607     sigemptyset(&action.sa_mask);
1608     if (sigaction(SIGVTALRM, &action, NULL) == -1) {
1609         fprintf(stderr,"SIGVTALRM problem\n");
1610         exit(3);
1611     }
1612
1613     action.sa_handler = timeout;
1614     action.sa_flags = 0;
1615     sigemptyset(&action.sa_mask);
1616     if (sigaction(SIGALRM, &action, NULL) == -1) {
1617       fprintf(stderr,"SIGALRM problem\n");
1618       exit(3);
1619     }
1620     alarm(1);
1621
1622     if (timer_create(CLOCK_PROCESS_CPUTIME_ID, &ev, &timer) != 0) {
1623         fprintf(stderr,"No CLOCK_PROCESS_CPUTIME_ID timer\n");
1624        exit(1);
1625     }
1626
1627     it.it_value.tv_sec = 0;
1628     it.it_value.tv_nsec = 1;
1629     it.it_interval = it.it_value;
1630     if (timer_settime(timer, 0, &it, NULL) != 0) {
1631         fprintf(stderr,"settime problem\n");
1632         exit(4);
1633     }
1634
1635     tock = 0;
1636
1637     for(n = 3; n < 20000; n++){
1638         for(m = 2; m <= n/2; m++){
1639             if (!(n%m)) count++;
1640             if (tock) goto out;
1641         }
1642     }
1643 out:
1644
1645     if (!tock) {
1646         fprintf(stderr,"no CLOCK_PROCESS_CPUTIME_ID signal\n");
1647         exit(5);
1648     }
1649
1650     timer_delete(timer);
1651
1652     if (timer_create(CLOCK_REALTIME, &ev, &timer) != 0) {
1653         fprintf(stderr,"No CLOCK_REALTIME timer\n");
1654         exit(2);
1655     }
1656
1657     it.it_value.tv_sec = 0;
1658     it.it_value.tv_nsec = 1000000;
1659     it.it_interval = it.it_value;
1660     if (timer_settime(timer, 0, &it, NULL) != 0) {
1661         fprintf(stderr,"settime problem\n");
1662         exit(4);
1663     }
1664
1665     tock = 0;
1666
1667     usleep(3000);
1668
1669     if (!tock) {
1670         fprintf(stderr,"no CLOCK_REALTIME signal\n");
1671         exit(5);
1672     }
1673
1674     timer_delete(timer);
1675
1676     exit(0);
1677 }
1678      ],
1679      [fptools_cv_timer_create_works=yes],
1680      [fptools_cv_timer_create_works=no])
1681   ])
1682 case $fptools_cv_timer_create_works in
1683     yes) AC_DEFINE([USE_TIMER_CREATE], 1, 
1684                    [Define to 1 if we can use timer_create(CLOCK_PROCESS_CPUTIME_ID,...)]);;
1685 esac
1686   fi
1687 fi
1688 ])
1689
1690 # FP_ICONV
1691 # -------------
1692 AC_DEFUN([FP_ICONV],
1693 [
1694   dnl--------------------------------------------------------------------
1695   dnl * Deal with arguments telling us iconv is somewhere odd
1696   dnl--------------------------------------------------------------------
1697
1698   dnl Note: ICONV_LIB_DIRS and ICONV_INCLUDE_DIRS are not predefined
1699   dnl to the empty string to allow them to be overridden from the
1700   dnl environment.
1701
1702   AC_ARG_WITH([iconv-includes],
1703     [AC_HELP_STRING([--with-iconv-includes],
1704       [directory containing iconv.h])],
1705       [ICONV_INCLUDE_DIRS=$withval])
1706
1707   AC_ARG_WITH([iconv-libraries],
1708     [AC_HELP_STRING([--with-iconv-libraries],
1709       [directory containing iconv library])],
1710       [ICONV_LIB_DIRS=$withval])
1711
1712   AC_SUBST(ICONV_INCLUDE_DIRS)
1713   AC_SUBST(ICONV_LIB_DIRS)
1714 ])# FP_ICONV
1715
1716 # FP_GMP
1717 # -------------
1718 AC_DEFUN([FP_GMP],
1719 [
1720   dnl--------------------------------------------------------------------
1721   dnl * Deal with arguments telling us gmp is somewhere odd
1722   dnl--------------------------------------------------------------------
1723
1724   AC_ARG_WITH([gmp-includes],
1725     [AC_HELP_STRING([--with-gmp-includes],
1726       [directory containing gmp.h])],
1727       [GMP_INCLUDE_DIRS=$withval])
1728
1729   AC_ARG_WITH([gmp-libraries],
1730     [AC_HELP_STRING([--with-gmp-libraries],
1731       [directory containing gmp library])],
1732       [GMP_LIB_DIRS=$withval])
1733
1734   AC_SUBST(GMP_INCLUDE_DIRS)
1735   AC_SUBST(GMP_LIB_DIRS)
1736 ])# FP_GMP
1737
1738 # --------------------------------------------------------------
1739 # Calculate absolute path to build tree
1740 # --------------------------------------------------------------
1741
1742 AC_DEFUN([FP_INTREE_GHC_PWD],[
1743 AC_MSG_NOTICE(Building in-tree ghc-pwd)
1744     dnl This would be
1745     dnl     make -C utils/ghc-pwd clean && make -C utils/ghc-pwd
1746     dnl except we don't want to have to know what make is called. Sigh.
1747     rm -rf utils/ghc-pwd/dist-boot
1748     mkdir  utils/ghc-pwd/dist-boot
1749     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
1750     then
1751         AC_MSG_ERROR([Building ghc-pwd failed])
1752     fi
1753
1754     GHC_PWD=utils/ghc-pwd/dist-boot/ghc-pwd
1755 ])
1756
1757 AC_DEFUN([FP_BINDIST_GHC_PWD],[
1758     GHC_PWD=utils/ghc-pwd/dist-install/build/tmp/ghc-pwd-bindist
1759 ])
1760
1761 AC_DEFUN([FP_FIND_ROOT],[
1762 AC_MSG_CHECKING(for path to top of build tree)
1763     hardtop=`$GHC_PWD`
1764
1765     dnl Remove common automounter nonsense
1766     hardtop=`echo $hardtop | sed 's|^/tmp_mnt.*\(/local/.*\)$|\1|' | sed 's|^/tmp_mnt/|/|'`
1767
1768     if ! test -d "$hardtop"; then
1769         AC_MSG_ERROR([cannot determine current directory])
1770     fi
1771
1772     dnl We don't support building in directories with spaces.
1773     case "$hardtop" in
1774     *' '*)
1775         AC_MSG_ERROR([
1776         The build system does not support building in a directory
1777         containing space characters.
1778         Suggestion: move the build tree somewhere else.])
1779         ;;
1780     esac
1781
1782     AC_SUBST(hardtop)
1783
1784     AC_MSG_RESULT($hardtop)
1785 ])
1786
1787 # GHC_CONVERT_CPU(cpu, target_var)
1788 # --------------------------------
1789 # converts cpu from gnu to ghc naming, and assigns the result to $target_var
1790 AC_DEFUN([GHC_CONVERT_CPU],[
1791 case "$1" in
1792   alpha*)
1793     $2="alpha"
1794     ;;
1795   arm*)
1796     $2="arm"
1797     ;;
1798   hppa1.1*)
1799     $2="hppa1_1"
1800     ;;
1801   hppa*)
1802     $2="hppa"
1803     ;;
1804   i386|i486|i586|i686)
1805     $2="i386"
1806     ;;
1807   ia64)
1808     $2="ia64"
1809     ;;
1810   m68k*)
1811     $2="m68k"
1812     ;;
1813   mipseb*)
1814     $2="mipseb"
1815     ;;
1816   mipsel*)
1817     $2="mipsel"
1818     ;;
1819   mips*)
1820     $2="mips"
1821     ;;
1822   powerpc64*)
1823     $2="powerpc64"
1824     ;;
1825   powerpc*)
1826     $2="powerpc"
1827     ;;
1828   rs6000)
1829     $2="rs6000"
1830     ;;
1831   s390x*)
1832     $2="s390x"
1833     ;;
1834   s390*)
1835     $2="s390"
1836     ;;
1837   sparc64*)
1838     $2="sparc64"
1839     ;;
1840   sparc*)
1841     $2="sparc"
1842     ;;
1843   vax)
1844     $2="vax"
1845     ;;
1846   x86_64)
1847     $2="x86_64"
1848     ;;
1849   *)
1850     echo "Unknown CPU $1"
1851     exit 1
1852     ;;
1853   esac
1854 ])
1855
1856 # GHC_CONVERT_VENDOR(vendor, target_var)
1857 # --------------------------------
1858 # converts vendor from gnu to ghc naming, and assigns the result to $target_var
1859 AC_DEFUN([GHC_CONVERT_VENDOR],[
1860   case "$1" in
1861   pc|gentoo|w64) # like i686-pc-linux-gnu, i686-gentoo-freebsd8, x86_64-w64-mingw32
1862     $2="unknown"
1863     ;;
1864   softfloat) # like armv5tel-softfloat-linux-gnueabi
1865     $2="unknown"
1866     ;;
1867   *)
1868     #pass thru by default
1869     $2="$1"
1870     ;;
1871   esac
1872 ])
1873
1874 # GHC_CONVERT_OS(os, converted_cpu, target_var)
1875 # --------------------------------
1876 # converts os from gnu to ghc naming, and assigns the result to $target_var
1877 AC_DEFUN([GHC_CONVERT_OS],[
1878 case "$1-$2" in
1879   darwin10-arm)
1880     $3="ios"
1881     ;;
1882   *)
1883     case "$1" in
1884       linux-android*)
1885         $3="linux-android"
1886         ;;
1887       linux-*|linux)
1888         $3="linux"
1889         ;;
1890       # As far as I'm aware, none of these have relevant variants
1891       freebsd|netbsd|openbsd|dragonfly|osf1|osf3|hpux|linuxaout|kfreebsdgnu|freebsd2|solaris2|cygwin32|mingw32|darwin|gnu|nextstep2|nextstep3|sunos4|ultrix|irix|aix|haiku)
1892         $3="$1"
1893         ;;
1894       freebsd*) # like i686-gentoo-freebsd7
1895                 #      i686-gentoo-freebsd8
1896                 #      i686-gentoo-freebsd8.2
1897         $3="freebsd"
1898         ;;
1899       nto-qnx*)
1900         $3="nto-qnx"
1901         ;;
1902       *)
1903         echo "Unknown OS $1"
1904         exit 1
1905         ;;
1906       esac
1907       ;;
1908   esac
1909 ])
1910
1911 # BOOTSTRAPPING_GHC_INFO_FIELD
1912 # --------------------------------
1913 # Set the variable $1 to the value of the ghc --info field $2.
1914 AC_DEFUN([BOOTSTRAPPING_GHC_INFO_FIELD],[
1915 $1=`"$WithGhc" --info | grep "^ ,(\"$2\"," | sed -e 's/.*","//' -e 's/")$//'`
1916 tmp=${$1#\$topdir/}
1917 if test "${$1}" != "$tmp"
1918 then
1919     topdir=`"$WithGhc" --print-libdir | sed 's#\\\\#/#g'`
1920     $1="$topdir/$tmp"
1921 fi
1922 AC_SUBST($1)
1923 ])
1924
1925 # LIBRARY_VERSION(lib, [dir])
1926 # --------------------------------
1927 # Gets the version number of a library.
1928 # If $1 is ghc-prim, then we define LIBRARY_ghc_prim_VERSION as 1.2.3
1929 # $2 points to the directory under libraries/
1930 AC_DEFUN([LIBRARY_VERSION],[
1931 dir=m4_default([$2],[$1])
1932 LIBRARY_[]translit([$1], [-], [_])[]_VERSION=`grep -i "^version:" libraries/${dir}/$1.cabal | sed "s/.* //"`
1933 AC_SUBST(LIBRARY_[]translit([$1], [-], [_])[]_VERSION)
1934 ])
1935
1936 # XCODE_VERSION()
1937 # --------------------------------
1938 # Gets the version number of XCode, if on a Mac
1939 AC_DEFUN([XCODE_VERSION],[
1940     if test "$TargetOS_CPP" = "darwin"
1941     then
1942         AC_MSG_CHECKING(XCode version)
1943         XCodeVersion=`xcodebuild -version | grep Xcode | sed "s/Xcode //"`
1944         # Old XCode versions don't actually give the XCode version
1945         if test "$XCodeVersion" = ""
1946         then
1947             AC_MSG_RESULT(not found (too old?))
1948             XCodeVersion1=0
1949             XCodeVersion2=0
1950         else
1951             AC_MSG_RESULT($XCodeVersion)
1952             XCodeVersion1=`echo "$XCodeVersion" | sed 's/\..*//'`
1953             changequote(, )dnl
1954             XCodeVersion2=`echo "$XCodeVersion" | sed 's/[^.]*\.\([^.]*\).*/\1/'`
1955             changequote([, ])dnl
1956             AC_MSG_NOTICE(XCode version component 1: $XCodeVersion1)
1957             AC_MSG_NOTICE(XCode version component 2: $XCodeVersion2)
1958         fi
1959     fi
1960 ])
1961
1962 # FIND_LLVM_PROG()
1963 # --------------------------------
1964 # Find where the llvm tools are. We have a special function to handle when they
1965 # are installed with a version suffix (e.g., llc-3.1).
1966 #
1967 # $1 = the variable to set
1968 # $2 = the with option name
1969 # $3 = the command to look for
1970 #
1971 AC_DEFUN([FIND_LLVM_PROG],[
1972     FP_ARG_WITH_PATH_GNU_PROG_OPTIONAL([$1], [$2], [$3])
1973     if test "$$1" == ""; then
1974         save_IFS=$IFS
1975         IFS=":;"
1976         for p in ${PATH}; do
1977             if test -d "${p}"; then
1978                 $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`
1979                 if test -n "$1"; then
1980                     break
1981                 fi
1982             fi
1983         done
1984         IFS=$save_IFS
1985     fi
1986 ])
1987
1988 # FIND_GCC()
1989 # --------------------------------
1990 # Finds where gcc is
1991 #
1992 # $1 = the variable to set
1993 # $2 = the with option name
1994 # $3 = the command to look for
1995 AC_DEFUN([FIND_GCC],[
1996     if test "$TargetOS_CPP" = "darwin" &&
1997        test "$XCodeVersion1" -eq 4 &&
1998        test "$XCodeVersion2" -lt 2
1999     then
2000         # In Xcode 4.1, 'gcc-4.2' is the gcc legacy backend (rather
2001         # than the LLVM backend). We prefer the legacy gcc, but in
2002         # Xcode 4.2 'gcc-4.2' was removed.
2003         FP_ARG_WITH_PATH_GNU_PROG([$1], [gcc-4.2], [gcc-4.2])
2004     elif test "$windows" = YES
2005     then
2006         $1="$CC"
2007     else
2008         FP_ARG_WITH_PATH_GNU_PROG([$1], [$2], [$3])
2009     fi
2010     AC_SUBST($1)
2011 ])
2012
2013 # LocalWords:  fi