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