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