Change the ranlib detection
[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_CMD to "ranlib" if it is needed and
1100 # found, to "true" otherwise. Sets REAL_RANLIB_CMD to the ranlib program,
1101 # even if we don't need ranlib (libffi might still need it).
1102 AC_DEFUN([FP_PROG_AR_NEEDS_RANLIB],[
1103     AC_REQUIRE([FP_PROG_AR_IS_GNU])
1104     AC_REQUIRE([FP_PROG_AR_ARGS])
1105     AC_REQUIRE([AC_PROG_CC])
1106
1107     AC_PROG_RANLIB
1108
1109     if test $fp_prog_ar_is_gnu = yes
1110     then
1111         fp_cv_prog_ar_needs_ranlib=no
1112     elif test "$TargetOS_CPP" = "darwin"
1113     then
1114         # It's quite tedious to check for Apple's crazy timestamps in
1115         # .a files, so we hardcode it.
1116         fp_cv_prog_ar_needs_ranlib=yes
1117     else
1118         case $fp_prog_ar_args in
1119         *s*)
1120             fp_cv_prog_ar_needs_ranlib=no;;
1121         *)
1122             fp_cv_prog_ar_needs_ranlib=yes;;
1123         esac
1124     fi
1125
1126     REAL_RANLIB_CMD="$RANLIB"
1127     if test $fp_cv_prog_ar_needs_ranlib = yes
1128     then
1129         RANLIB_CMD="$RANLIB"
1130     else
1131         RANLIB_CMD="true"
1132     fi
1133     AC_SUBST([REAL_RANLIB_CMD])
1134     AC_SUBST([RANLIB_CMD])
1135 ])# FP_PROG_AR_NEEDS_RANLIB
1136
1137
1138 # FP_GCC_VERSION
1139 # -----------
1140 # Extra testing of the result AC_PROG_CC, testing the gcc version no. Sets the
1141 # output variable GccVersion.
1142 AC_DEFUN([FP_GCC_VERSION],
1143 [AC_REQUIRE([AC_PROG_CC])
1144 if test -z "$CC"
1145 then
1146   AC_MSG_ERROR([gcc is required])
1147 fi
1148 GccLT34=NO
1149 GccLT46=NO
1150 AC_CACHE_CHECK([version of gcc], [fp_cv_gcc_version],
1151 [
1152     fp_cv_gcc_version="`$CC -v 2>&1 | grep 'version ' | sed -e 's/.*version [[^0-9]]*\([[0-9.]]*\).*/\1/g'`"
1153     FP_COMPARE_VERSIONS([$fp_cv_gcc_version], [-lt], [3.0],
1154                         [AC_MSG_ERROR([Need at least gcc version 3.0 (3.4+ recommended)])])
1155     # See #2770: gcc 2.95 doesn't work any more, apparently.  There probably
1156     # isn't a very good reason for that, but for now just make configure
1157     # fail.
1158     FP_COMPARE_VERSIONS([$fp_cv_gcc_version], [-lt], [3.4], GccLT34=YES)
1159     FP_COMPARE_VERSIONS([$fp_cv_gcc_version], [-lt], [4.6], GccLT46=YES)
1160 ])
1161 AC_SUBST([GccVersion], [$fp_cv_gcc_version])
1162 AC_SUBST(GccLT34)
1163 AC_SUBST(GccLT46)
1164 ])# FP_GCC_VERSION
1165
1166 dnl Check to see if the C compiler is clang or llvm-gcc
1167 dnl
1168 AC_DEFUN([FP_CC_LLVM_BACKEND],
1169 [AC_REQUIRE([AC_PROG_CC])
1170 AC_MSG_CHECKING([whether C compiler is clang])
1171 $CC -x c /dev/null -dM -E > conftest.txt 2>&1
1172 if grep "__clang__" conftest.txt >/dev/null 2>&1; then
1173   AC_SUBST([CC_CLANG_BACKEND], [1])
1174   AC_SUBST([CC_LLVM_BACKEND], [1])
1175   AC_MSG_RESULT([yes])
1176 else
1177   AC_MSG_RESULT([no])
1178   AC_MSG_CHECKING([whether C compiler has an LLVM back end])
1179   if grep "__llvm__" conftest.txt >/dev/null 2>&1; then
1180     AC_SUBST([CC_CLANG_BACKEND], [0])
1181     AC_SUBST([CC_LLVM_BACKEND], [1])
1182     AC_MSG_RESULT([yes])
1183   else
1184     AC_SUBST([CC_CLANG_BACKEND], [0])
1185     AC_SUBST([CC_LLVM_BACKEND], [0])
1186     AC_MSG_RESULT([no])
1187   fi
1188 fi
1189
1190 rm -f conftest.txt
1191 ])
1192
1193 dnl Small feature test for perl version. Assumes PerlCmd
1194 dnl contains path to perl binary.
1195 dnl
1196 dnl (Perl versions prior to v5.6 does not contain the string "v5";
1197 dnl instead they display version strings such as "version 5.005".)
1198 dnl
1199 AC_DEFUN([FPTOOLS_CHECK_PERL_VERSION],
1200 [$PerlCmd -v >conftest.out 2>&1
1201    if grep "v5" conftest.out >/dev/null 2>&1; then
1202       :
1203    else
1204       AC_MSG_ERROR([your version of perl probably won't work, try upgrading it.])
1205    fi
1206 rm -fr conftest*
1207 ])
1208
1209
1210 # FP_CHECK_PROG(VARIABLE, PROG-TO-CHECK-FOR,
1211 #               [VALUE-IF-NOT-FOUND], [PATH], [REJECT])
1212 # -----------------------------------------------------
1213 # HACK: A small wrapper around AC_CHECK_PROG, setting VARIABLE to the full path
1214 # of PROG-TO-CHECK-FOR when found.
1215 AC_DEFUN([FP_CHECK_PROG],
1216 [AC_CHECK_PROG([$1], [$2], [$as_dir/$ac_word$ac_exec_ext], [$3], [$4], [$5])][]dnl
1217 )# FP_CHECK_PROC
1218
1219
1220 # FP_PROG_FIND
1221 # ------------
1222 # Find a non-WinDoze version of the "find" utility.
1223 AC_DEFUN([FP_PROG_FIND],
1224 [AC_PATH_PROGS([fp_prog_find], [gfind find], find)
1225 echo foo > conftest.txt
1226 $fp_prog_find conftest.txt -print > conftest.out 2>&1
1227 if grep '^conftest.txt$' conftest.out > /dev/null 2>&1 ; then
1228   # OK, looks like a real "find".
1229   case $HostPlatform in
1230     *mingw32)
1231       if test x${OSTYPE} != xmsys
1232       then
1233             fp_prog_find="`cygpath --mixed ${fp_prog_find}`"
1234         AC_MSG_NOTICE([normalized find command to $fp_prog_find])
1235       fi ;;
1236     *) ;;
1237   esac
1238   FindCmd="$fp_prog_find"
1239 else
1240   # Found a poor WinDoze version of "find", ignore it.
1241   AC_MSG_WARN([$fp_prog_find looks like a non-*nix find, ignoring it])
1242   FP_CHECK_PROG([FindCmd], [find], [], [], [$fp_prog_find])
1243 fi
1244 rm -f conftest.txt conftest.out
1245 AC_SUBST([FindCmd])[]dnl
1246 ])# FP_PROG_FIND
1247
1248
1249 # FP_PROG_SORT
1250 # ------------
1251 # Find a Unix-like sort
1252 AC_DEFUN([FP_PROG_SORT],
1253 [AC_PATH_PROG([fp_prog_sort], [sort])
1254 echo conwip > conftest.txt
1255 $fp_prog_sort -f conftest.txt > conftest.out 2>&1
1256 if grep 'conwip' conftest.out > /dev/null 2>&1 ; then
1257   # The goods
1258   SortCmd="$fp_prog_sort"
1259 else
1260   # Summink else..pick next one.
1261   AC_MSG_WARN([$fp_prog_sort looks like a non-*nix sort, ignoring it])
1262   FP_CHECK_PROG([SortCmd], [sort], [], [], [$fp_prog_sort])
1263 fi
1264 rm -f conftest.txt conftest.out
1265 AC_SUBST([SortCmd])[]dnl
1266 ])# FP_PROG_SORT
1267
1268
1269 dnl
1270 dnl FPTOOLS_NOCACHE_CHECK prints a message, then sets the
1271 dnl values of the second argument to the result of running
1272 dnl the commands given by the third. It does not cache its
1273 dnl result, so it is suitable for checks which should be
1274 dnl run every time.
1275 dnl
1276 AC_DEFUN([FPTOOLS_NOCACHE_CHECK],
1277 [AC_MSG_CHECKING([$1])
1278  $3
1279  AC_MSG_RESULT([$][$2])
1280 ])
1281
1282 dnl
1283 dnl FPTOOLS_GHC_VERSION(version)
1284 dnl FPTOOLS_GHC_VERSION(major, minor [, patchlevel])
1285 dnl FPTOOLS_GHC_VERSION(version, major, minor, patchlevel)
1286 dnl
1287 dnl Test for version of installed ghc.  Uses $GHC.
1288 dnl [original version pinched from c2hs]
1289 dnl
1290 AC_DEFUN([FPTOOLS_GHC_VERSION],
1291 [FPTOOLS_NOCACHE_CHECK([version of ghc], [fptools_version_of_ghc],
1292 ["${WithGhc-ghc}" --version > conftestghc 2>&1
1293   cat conftestghc >&AS_MESSAGE_LOG_FD
1294 #Useless Use Of cat award...
1295   fptools_version_of_ghc=`cat conftestghc | sed -n -e 's/, patchlevel *\([[0-9]]\)/.\1/;s/.* version \([[0-9]][[0-9.]]*\).*/\1/p'`
1296   rm -fr conftest*
1297   if test "[$]fptools_version_of_ghc" = ""
1298   then
1299     fptools_version_of_ghc='unknown'
1300   fi
1301 fptools_version_of_ghc[_major]=`echo [$]fptools_version_of_ghc | sed -e 's/^\([[0-9]]\).*/\1/'`
1302 fptools_version_of_ghc[_minor]=`echo [$]fptools_version_of_ghc | sed -e 's/^[[0-9]]\.\([[0-9]]*\).*/\1/'`
1303 fptools_version_of_ghc[_pl]=`echo [$]fptools_version_of_ghc | sed -n -e 's/^[[0-9]]\.[[0-9]]*\.\([[0-9]]*\)/\1/p'`
1304 #
1305 if test "[$]fptools_version_of_ghc[_pl]" = ""
1306 then
1307   fptools_version_of_ghc[_all]="[$]fptools_version_of_ghc[_major].[$]fptools_version_of_ghc[_minor]"
1308   fptools_version_of_ghc[_pl]="0"
1309 else
1310   fptools_version_of_ghc[_all]="[$]fptools_version_of_ghc[_major].[$]fptools_version_of_ghc[_minor].[$]fptools_version_of_ghc[_pl]"
1311 fi
1312 #
1313 ifelse($#, [1], [dnl
1314 [$1]="[$]fptools_version_of_ghc[_all]"
1315 ], $#, [2], [dnl
1316 [$1]="[$]fptools_version_of_ghc[_major]"
1317 [$2]="[$]fptools_version_of_ghc[_minor]"
1318 ], $#, [3], [dnl
1319 [$1]="[$]fptools_version_of_ghc[_major]"
1320 [$2]="[$]fptools_version_of_ghc[_minor]"
1321 [$3]="[$]fptools_version_of_ghc[_pl]"
1322 ], $#, [4], [dnl
1323 [$1]="[$]fptools_version_of_ghc[_all]"
1324 [$2]="[$]fptools_version_of_ghc[_major]"
1325 [$3]="[$]fptools_version_of_ghc[_minor]"
1326 [$4]="[$]fptools_version_of_ghc[_pl]"
1327 ])
1328 ])
1329 ])dnl
1330
1331
1332 # FP_CHECK_FUNC(FUNCTION, PROLOGUE, BODY, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
1333 # ---------------------------------------------------------------------------------
1334 # A variant of AC_CHECK_FUNCS, limited to a single FUNCTION, but with the
1335 # additional flexibility of specifying the PROLOGUE and BODY.
1336 AC_DEFUN([FP_CHECK_FUNC],
1337 [AS_VAR_PUSHDEF([fp_func], [fp_cv_func_$1])dnl
1338 AC_CACHE_CHECK([for $1], fp_func,
1339 [AC_LINK_IFELSE([AC_LANG_PROGRAM([$2], [$3])],
1340                 [AS_VAR_SET(fp_func, yes)],
1341                 [AS_VAR_SET(fp_func, no)])])
1342 AS_IF([test AS_VAR_GET(fp_func) = yes],
1343       [AC_DEFINE(AS_TR_CPP(HAVE_$1), [1],
1344                 [Define to 1 if you have the `]$1[' function.]) $4],
1345       [$5])dnl
1346 AS_VAR_POPDEF([fp_func])dnl
1347 ])# FP_CHECK_FUNC
1348
1349
1350 # FP_GEN_DOCBOOK_XML
1351 # ------------------
1352 # Generates a DocBook XML V4.5 document in conftest.xml.
1353 #
1354 # It took a lot of experimentation to find a document that will cause
1355 # xsltproc to fail with an error code when the relevant
1356 # stylesheets/DTDs are not found.  I couldn't make xsltproc fail with
1357 # a single-file document, it seems a multi-file document is needed.
1358 # -- SDM 2009-06-03
1359 #
1360 AC_DEFUN([FP_GEN_DOCBOOK_XML],
1361 [rm -f conftest.xml conftest-book.xml
1362 cat > conftest.xml << EOF
1363 <?xml version="1.0" encoding="iso-8859-1"?>
1364 <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
1365    "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [[
1366 <!ENTITY conftest-book SYSTEM "conftest-book.xml">
1367 ]]>
1368 <book id="test">
1369 &conftest-book;
1370 </book>
1371 EOF
1372 cat >conftest-book.xml << EOF
1373 <?xml version="1.0" encoding="iso-8859-1"?>
1374   <title>A DocBook &ldquo;Test Document&rdquo;</title>
1375   <chapter id="id-one">
1376     <title>A Chapter Title</title>
1377     <para>This is a paragraph, referencing <xref linkend="id-two"/>.</para>
1378   </chapter>
1379   <chapter id="id-two">
1380     <title>Another Chapter Title</title>
1381     <para>This is another paragraph, referencing <xref linkend="id-one"/>.</para>
1382   </chapter>
1383 EOF
1384 ]) # FP_GEN_DOCBOOK_XML
1385
1386
1387 # FP_PROG_DBLATEX
1388 # ----------------
1389 # Sets the output variable DblatexCmd to the full path of dblatex,
1390 # which we use for building PDF and PS docs.
1391 # DblatexCmd is empty if dblatex could not be found.
1392 AC_DEFUN([FP_PROG_DBLATEX],
1393 [FP_PATH_PROG([DblatexCmd], [dblatex])
1394 if test -z "$DblatexCmd"; then
1395   AC_MSG_WARN([cannot find dblatex in your PATH, you will not be able to build the PDF and PS documentation])
1396 fi
1397 ])# FP_PROG_DBLATEX
1398
1399
1400 # FP_PROG_XSLTPROC
1401 # ----------------
1402 # Sets the output variable XsltprocCmd to the full path of the XSLT processor
1403 # xsltproc. XsltprocCmd is empty if xsltproc could not be found.
1404 AC_DEFUN([FP_PROG_XSLTPROC],
1405 [FP_PATH_PROG([XsltprocCmd], [xsltproc])
1406 if test -z "$XsltprocCmd"; then
1407   AC_MSG_WARN([cannot find xsltproc in your PATH, you will not be able to build the HTML documentation])
1408 fi
1409 ])# FP_PROG_XSLTPROC
1410
1411
1412 # FP_DOCBOOK_XSL
1413 # ----------------------------
1414 # Check that we can process a DocBook XML document to HTML using xsltproc.
1415 AC_DEFUN([FP_DOCBOOK_XSL],
1416 [AC_REQUIRE([FP_PROG_XSLTPROC])dnl
1417 if test -n "$XsltprocCmd"; then
1418   AC_CACHE_CHECK([for DocBook XSL stylesheet], fp_cv_dir_docbook_xsl,
1419   [FP_GEN_DOCBOOK_XML
1420   fp_cv_dir_docbook_xsl=no
1421   if $XsltprocCmd --nonet http://docbook.sourceforge.net/release/xsl/current/html/chunk.xsl conftest.xml > /dev/null 2>&1; then
1422      fp_cv_dir_docbook_xsl=yes
1423   fi
1424   rm -rf conftest*])
1425 fi
1426 if test x"$fp_cv_dir_docbook_xsl" = xno; then
1427   AC_MSG_WARN([cannot find DocBook XSL stylesheets, you will not be able to build the documentation])
1428   HAVE_DOCBOOK_XSL=NO
1429 else
1430   HAVE_DOCBOOK_XSL=YES
1431 fi
1432 AC_SUBST([HAVE_DOCBOOK_XSL])
1433 ])# FP_DOCBOOK_XSL
1434
1435
1436 # FP_PROG_XMLLINT
1437 # ----------------
1438 # Sets the output variable XmllintCmd to the full path of the XSLT processor
1439 # xmllint. XmllintCmd is empty if xmllint could not be found.
1440 AC_DEFUN([FP_PROG_XMLLINT],
1441 [FP_PATH_PROG([XmllintCmd], [xmllint])
1442 if test -z "$XmllintCmd"; then
1443   AC_MSG_WARN([cannot find xmllint in your PATH, you will not be able to validate your documentation])
1444 fi
1445 ])# FP_PROG_XMLLINT
1446
1447
1448 # FP_CHECK_DOCBOOK_DTD
1449 # --------------------
1450 AC_DEFUN([FP_CHECK_DOCBOOK_DTD],
1451 [AC_REQUIRE([FP_PROG_XMLLINT])dnl
1452 if test -n "$XmllintCmd"; then
1453   AC_MSG_CHECKING([for DocBook DTD])
1454   FP_GEN_DOCBOOK_XML
1455   if $XmllintCmd --nonet --valid --noout conftest.xml ; then
1456     AC_MSG_RESULT([ok])
1457   else
1458     AC_MSG_RESULT([failed])
1459     AC_MSG_WARN([cannot find a DTD for DocBook XML V4.5, you will not be able to validate your documentation])
1460     AC_MSG_WARN([check your XML_CATALOG_FILES environment variable and/or /etc/xml/catalog])
1461   fi
1462   rm -rf conftest*
1463 fi
1464 ])# FP_CHECK_DOCBOOK_DTD
1465
1466
1467 # FP_PROG_GHC_PKG
1468 # ----------------
1469 # Try to find a ghc-pkg matching the ghc mentioned in the environment variable
1470 # WithGhc. Sets the output variable GhcPkgCmd.
1471 AC_DEFUN([FP_PROG_GHC_PKG],
1472 [AC_CACHE_CHECK([for ghc-pkg matching $WithGhc], fp_cv_matching_ghc_pkg,
1473 [
1474 # If we are told to use ghc-stage2, then we're using an in-tree
1475 # compiler. In this case, we just want ghc-pkg, not ghc-pkg-stage2,
1476 # so we sed off -stage[0-9]$. However, if we are told to use
1477 # ghc-6.12.1 then we want to use ghc-pkg-6.12.1, so we keep any
1478 # other suffix.
1479 fp_ghc_pkg_guess=`echo $WithGhc | sed -e 's/-stage@<:@0-9@:>@$//' -e 's,ghc\(@<:@^/\\@:>@*\)$,ghc-pkg\1,'`
1480 if "$fp_ghc_pkg_guess" list > /dev/null 2>&1; then
1481   fp_cv_matching_ghc_pkg=$fp_ghc_pkg_guess
1482 else
1483   AC_MSG_ERROR([Cannot find matching ghc-pkg])
1484 fi])
1485 GhcPkgCmd=$fp_cv_matching_ghc_pkg
1486 AC_SUBST([GhcPkgCmd])
1487 ])# FP_PROG_GHC_PKG
1488
1489
1490 # FP_GCC_EXTRA_FLAGS
1491 # ------------------
1492 # Determine which extra flags we need to pass gcc when we invoke it
1493 # to compile .hc code.
1494 #
1495 # -fwrapv is needed for gcc to emit well-behaved code in the presence of
1496 # integer wrap around. (Trac #952)
1497 #
1498 AC_DEFUN([FP_GCC_EXTRA_FLAGS],
1499 [AC_REQUIRE([FP_GCC_VERSION])
1500 AC_CACHE_CHECK([for extra options to pass gcc when compiling via C], [fp_cv_gcc_extra_opts],
1501 [fp_cv_gcc_extra_opts=
1502  FP_COMPARE_VERSIONS([$fp_cv_gcc_version], [-ge], [3.4],
1503   [fp_cv_gcc_extra_opts="$fp_cv_gcc_extra_opts -fwrapv"],
1504   [])
1505 ])
1506 AC_SUBST([GccExtraViaCOpts],$fp_cv_gcc_extra_opts)
1507 ])
1508
1509
1510 # FP_SETUP_PROJECT_VERSION
1511 # ---------------------
1512 AC_DEFUN([FP_SETUP_PROJECT_VERSION],
1513 [
1514 if test "$RELEASE" = "NO"; then
1515     AC_MSG_CHECKING([for GHC version date])
1516     if test -f VERSION_DATE; then
1517         PACKAGE_VERSION=${PACKAGE_VERSION}.`cat VERSION_DATE`
1518         AC_MSG_RESULT(given $PACKAGE_VERSION)
1519     elif test -d .git; then
1520         changequote(, )dnl
1521         ver_date=`git log -n 1 --date=short --pretty=format:%ci | cut -d ' ' -f 1 | tr -d -`
1522         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
1523         changequote([, ])dnl
1524                 AC_MSG_ERROR([failed to detect version date: check that git is in your path])
1525         fi
1526         PACKAGE_VERSION=${PACKAGE_VERSION}.$ver_date
1527         AC_MSG_RESULT(inferred $PACKAGE_VERSION)
1528     elif test -f VERSION; then
1529         PACKAGE_VERSION=`cat VERSION`
1530         AC_MSG_RESULT(given $PACKAGE_VERSION)
1531     else
1532         AC_MSG_WARN([cannot determine snapshot version: no .git directory and no VERSION file])
1533         dnl We'd really rather this case didn't happen, but it might
1534         dnl do (in particular, people using lndir trees may find that
1535         dnl the build system can't find any other date). If it does
1536         dnl happen, then we use the current date.
1537         dnl This way we get some idea about how recent a build is.
1538         dnl It also means that packages built for 2 different builds
1539         dnl will probably use different version numbers, so things are
1540         dnl less likely to go wrong.
1541         PACKAGE_VERSION=${PACKAGE_VERSION}.`date +%Y%m%d`
1542     fi
1543 fi
1544
1545 # Some renamings
1546 AC_SUBST([ProjectName], [$PACKAGE_NAME])
1547 AC_SUBST([ProjectVersion], [$PACKAGE_VERSION])
1548
1549 # Split PACKAGE_VERSION into (possibly empty) parts
1550 VERSION_MAJOR=`echo $PACKAGE_VERSION | sed 's/^\(@<:@^.@:>@*\)\(\.\{0,1\}\(.*\)\)$/\1'/`
1551 VERSION_TMP=`echo $PACKAGE_VERSION | sed 's/^\(@<:@^.@:>@*\)\(\.\{0,1\}\(.*\)\)$/\3'/`
1552 VERSION_MINOR=`echo $VERSION_TMP | sed 's/^\(@<:@^.@:>@*\)\(\.\{0,1\}\(.*\)\)$/\1'/`
1553 ProjectPatchLevel=`echo $VERSION_TMP | sed 's/^\(@<:@^.@:>@*\)\(\.\{0,1\}\(.*\)\)$/\3'/`
1554
1555 # Calculate project version as an integer, using 2 digits for minor version
1556 case $VERSION_MINOR in
1557   ?) ProjectVersionInt=${VERSION_MAJOR}0${VERSION_MINOR} ;;
1558   ??) ProjectVersionInt=${VERSION_MAJOR}${VERSION_MINOR} ;;
1559   *) AC_MSG_ERROR([bad minor version in $PACKAGE_VERSION]) ;;
1560 esac
1561 AC_SUBST([ProjectVersionInt])
1562
1563 # The project patchlevel is zero unless stated otherwise
1564 test -z "$ProjectPatchLevel" && ProjectPatchLevel=0
1565
1566 # Remove dots from the patch level; this allows us to have versions like 6.4.1.20050508
1567 ProjectPatchLevel=`echo $ProjectPatchLevel | sed 's/\.//'`
1568
1569 AC_SUBST([ProjectPatchLevel])
1570 ])# FP_SETUP_PROJECT_VERSION
1571
1572
1573 # Check for a working timer_create().  We need a pretty detailed check
1574 # here, because there exist partially-working implementations of
1575 # timer_create() in certain versions of Linux (see bug #1933).
1576 #
1577 AC_DEFUN([FP_CHECK_TIMER_CREATE],[
1578 AC_CHECK_FUNC([timer_create],[HAVE_timer_create=yes],[HAVE_timer_create=no])
1579
1580 if test "$HAVE_timer_create" = "yes"
1581 then
1582   if test "$cross_compiling" = "yes"
1583   then
1584     # We can't test timer_create when we're cross-compiling, so we
1585     # optimistiaclly assume that it actually works properly.
1586     AC_DEFINE([USE_TIMER_CREATE], 1,  [Define to 1 if we can use timer_create(CLOCK_PROCESS_CPUTIME_ID,...)])
1587   else
1588   AC_CACHE_CHECK([for a working timer_create(CLOCK_REALTIME)], 
1589     [fptools_cv_timer_create_works],
1590     [AC_TRY_RUN([
1591 #include <stdio.h>
1592 #ifdef HAVE_STDLIB_H
1593 #include <stdlib.h>
1594 #endif
1595 #ifdef HAVE_TIME_H
1596 #include <time.h>
1597 #endif
1598 #ifdef HAVE_SIGNAL_H
1599 #include <signal.h>
1600 #endif
1601 #ifdef HAVE_UNISTD_H
1602 #include <unistd.h>
1603 #endif
1604
1605 static volatile int tock = 0;
1606 static void handler(int i)
1607 {
1608    tock = 1;
1609 }
1610
1611 static void timeout(int i)
1612 {
1613   // timer_settime() has been known to hang, so just in case
1614   // we install a 1-second timeout (see #2257)
1615   exit(99);
1616 }
1617
1618 int main(int argc, char *argv[])
1619 {
1620
1621     struct sigevent ev;
1622     timer_t timer;
1623     struct itimerspec it;
1624     struct sigaction action;
1625     int m,n,count = 0;
1626
1627     ev.sigev_notify = SIGEV_SIGNAL;
1628     ev.sigev_signo  = SIGVTALRM;
1629
1630     action.sa_handler = handler;
1631     action.sa_flags = 0;
1632     sigemptyset(&action.sa_mask);
1633     if (sigaction(SIGVTALRM, &action, NULL) == -1) {
1634         fprintf(stderr,"SIGVTALRM problem\n");
1635         exit(3);
1636     }
1637
1638     action.sa_handler = timeout;
1639     action.sa_flags = 0;
1640     sigemptyset(&action.sa_mask);
1641     if (sigaction(SIGALRM, &action, NULL) == -1) {
1642       fprintf(stderr,"SIGALRM problem\n");
1643       exit(3);
1644     }
1645     alarm(1);
1646
1647     if (timer_create(CLOCK_PROCESS_CPUTIME_ID, &ev, &timer) != 0) {
1648         fprintf(stderr,"No CLOCK_PROCESS_CPUTIME_ID timer\n");
1649        exit(1);
1650     }
1651
1652     it.it_value.tv_sec = 0;
1653     it.it_value.tv_nsec = 1;
1654     it.it_interval = it.it_value;
1655     if (timer_settime(timer, 0, &it, NULL) != 0) {
1656         fprintf(stderr,"settime problem\n");
1657         exit(4);
1658     }
1659
1660     tock = 0;
1661
1662     for(n = 3; n < 20000; n++){
1663         for(m = 2; m <= n/2; m++){
1664             if (!(n%m)) count++;
1665             if (tock) goto out;
1666         }
1667     }
1668 out:
1669
1670     if (!tock) {
1671         fprintf(stderr,"no CLOCK_PROCESS_CPUTIME_ID signal\n");
1672         exit(5);
1673     }
1674
1675     timer_delete(timer);
1676
1677     if (timer_create(CLOCK_REALTIME, &ev, &timer) != 0) {
1678         fprintf(stderr,"No CLOCK_REALTIME timer\n");
1679         exit(2);
1680     }
1681
1682     it.it_value.tv_sec = 0;
1683     it.it_value.tv_nsec = 1000000;
1684     it.it_interval = it.it_value;
1685     if (timer_settime(timer, 0, &it, NULL) != 0) {
1686         fprintf(stderr,"settime problem\n");
1687         exit(4);
1688     }
1689
1690     tock = 0;
1691
1692     usleep(3000);
1693
1694     if (!tock) {
1695         fprintf(stderr,"no CLOCK_REALTIME signal\n");
1696         exit(5);
1697     }
1698
1699     timer_delete(timer);
1700
1701     exit(0);
1702 }
1703      ],
1704      [fptools_cv_timer_create_works=yes],
1705      [fptools_cv_timer_create_works=no])
1706   ])
1707 case $fptools_cv_timer_create_works in
1708     yes) AC_DEFINE([USE_TIMER_CREATE], 1, 
1709                    [Define to 1 if we can use timer_create(CLOCK_PROCESS_CPUTIME_ID,...)]);;
1710 esac
1711   fi
1712 fi
1713 ])
1714
1715 # FP_ICONV
1716 # -------------
1717 AC_DEFUN([FP_ICONV],
1718 [
1719   dnl--------------------------------------------------------------------
1720   dnl * Deal with arguments telling us iconv is somewhere odd
1721   dnl--------------------------------------------------------------------
1722
1723   dnl Note: ICONV_LIB_DIRS and ICONV_INCLUDE_DIRS are not predefined
1724   dnl to the empty string to allow them to be overridden from the
1725   dnl environment.
1726
1727   AC_ARG_WITH([iconv-includes],
1728     [AC_HELP_STRING([--with-iconv-includes],
1729       [directory containing iconv.h])],
1730       [ICONV_INCLUDE_DIRS=$withval])
1731
1732   AC_ARG_WITH([iconv-libraries],
1733     [AC_HELP_STRING([--with-iconv-libraries],
1734       [directory containing iconv library])],
1735       [ICONV_LIB_DIRS=$withval])
1736
1737   AC_SUBST(ICONV_INCLUDE_DIRS)
1738   AC_SUBST(ICONV_LIB_DIRS)
1739 ])# FP_ICONV
1740
1741 # FP_GMP
1742 # -------------
1743 AC_DEFUN([FP_GMP],
1744 [
1745   dnl--------------------------------------------------------------------
1746   dnl * Deal with arguments telling us gmp is somewhere odd
1747   dnl--------------------------------------------------------------------
1748
1749   AC_ARG_WITH([gmp-includes],
1750     [AC_HELP_STRING([--with-gmp-includes],
1751       [directory containing gmp.h])],
1752       [GMP_INCLUDE_DIRS=$withval])
1753
1754   AC_ARG_WITH([gmp-libraries],
1755     [AC_HELP_STRING([--with-gmp-libraries],
1756       [directory containing gmp library])],
1757       [GMP_LIB_DIRS=$withval])
1758
1759   AC_SUBST(GMP_INCLUDE_DIRS)
1760   AC_SUBST(GMP_LIB_DIRS)
1761 ])# FP_GMP
1762
1763 # --------------------------------------------------------------
1764 # Calculate absolute path to build tree
1765 # --------------------------------------------------------------
1766
1767 AC_DEFUN([FP_INTREE_GHC_PWD],[
1768 AC_MSG_NOTICE(Building in-tree ghc-pwd)
1769     dnl This would be
1770     dnl     make -C utils/ghc-pwd clean && make -C utils/ghc-pwd
1771     dnl except we don't want to have to know what make is called. Sigh.
1772     rm -rf utils/ghc-pwd/dist-boot
1773     mkdir  utils/ghc-pwd/dist-boot
1774     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
1775     then
1776         AC_MSG_ERROR([Building ghc-pwd failed])
1777     fi
1778
1779     GHC_PWD=utils/ghc-pwd/dist-boot/ghc-pwd
1780 ])
1781
1782 AC_DEFUN([FP_BINDIST_GHC_PWD],[
1783     GHC_PWD=utils/ghc-pwd/dist-install/build/tmp/ghc-pwd-bindist
1784 ])
1785
1786 AC_DEFUN([FP_FIND_ROOT],[
1787 AC_MSG_CHECKING(for path to top of build tree)
1788     hardtop=`$GHC_PWD`
1789
1790     dnl Remove common automounter nonsense
1791     hardtop=`echo $hardtop | sed 's|^/tmp_mnt.*\(/local/.*\)$|\1|' | sed 's|^/tmp_mnt/|/|'`
1792
1793     if ! test -d "$hardtop"; then
1794         AC_MSG_ERROR([cannot determine current directory])
1795     fi
1796
1797     dnl We don't support building in directories with spaces.
1798     case "$hardtop" in
1799     *' '*)
1800         AC_MSG_ERROR([
1801         The build system does not support building in a directory
1802         containing space characters.
1803         Suggestion: move the build tree somewhere else.])
1804         ;;
1805     esac
1806
1807     AC_SUBST(hardtop)
1808
1809     AC_MSG_RESULT($hardtop)
1810 ])
1811
1812 # GHC_CONVERT_CPU(cpu, target_var)
1813 # --------------------------------
1814 # converts cpu from gnu to ghc naming, and assigns the result to $target_var
1815 AC_DEFUN([GHC_CONVERT_CPU],[
1816 case "$1" in
1817   alpha*)
1818     $2="alpha"
1819     ;;
1820   arm*)
1821     $2="arm"
1822     ;;
1823   hppa1.1*)
1824     $2="hppa1_1"
1825     ;;
1826   hppa*)
1827     $2="hppa"
1828     ;;
1829   i386|i486|i586|i686)
1830     $2="i386"
1831     ;;
1832   ia64)
1833     $2="ia64"
1834     ;;
1835   m68k*)
1836     $2="m68k"
1837     ;;
1838   mipseb*)
1839     $2="mipseb"
1840     ;;
1841   mipsel*)
1842     $2="mipsel"
1843     ;;
1844   mips*)
1845     $2="mips"
1846     ;;
1847   powerpc64*)
1848     $2="powerpc64"
1849     ;;
1850   powerpc*)
1851     $2="powerpc"
1852     ;;
1853   rs6000)
1854     $2="rs6000"
1855     ;;
1856   s390x*)
1857     $2="s390x"
1858     ;;
1859   s390*)
1860     $2="s390"
1861     ;;
1862   sparc64*)
1863     $2="sparc64"
1864     ;;
1865   sparc*)
1866     $2="sparc"
1867     ;;
1868   vax)
1869     $2="vax"
1870     ;;
1871   x86_64)
1872     $2="x86_64"
1873     ;;
1874   *)
1875     echo "Unknown CPU $1"
1876     exit 1
1877     ;;
1878   esac
1879 ])
1880
1881 # GHC_CONVERT_VENDOR(vendor, target_var)
1882 # --------------------------------
1883 # converts vendor from gnu to ghc naming, and assigns the result to $target_var
1884 AC_DEFUN([GHC_CONVERT_VENDOR],[
1885   case "$1" in
1886   pc|gentoo|w64) # like i686-pc-linux-gnu, i686-gentoo-freebsd8, x86_64-w64-mingw32
1887     $2="unknown"
1888     ;;
1889   softfloat) # like armv5tel-softfloat-linux-gnueabi
1890     $2="unknown"
1891     ;;
1892   *)
1893     #pass thru by default
1894     $2="$1"
1895     ;;
1896   esac
1897 ])
1898
1899 # GHC_CONVERT_OS(os, converted_cpu, target_var)
1900 # --------------------------------
1901 # converts os from gnu to ghc naming, and assigns the result to $target_var
1902 AC_DEFUN([GHC_CONVERT_OS],[
1903 case "$1-$2" in
1904   darwin10-arm)
1905     $3="ios"
1906     ;;
1907   *)
1908     case "$1" in
1909       linux-android*)
1910         $3="linux-android"
1911         ;;
1912       linux-*|linux)
1913         $3="linux"
1914         ;;
1915       # As far as I'm aware, none of these have relevant variants
1916       freebsd|netbsd|openbsd|dragonfly|osf1|osf3|hpux|linuxaout|kfreebsdgnu|freebsd2|solaris2|cygwin32|mingw32|darwin|gnu|nextstep2|nextstep3|sunos4|ultrix|irix|aix|haiku)
1917         $3="$1"
1918         ;;
1919       freebsd*) # like i686-gentoo-freebsd7
1920                 #      i686-gentoo-freebsd8
1921                 #      i686-gentoo-freebsd8.2
1922         $3="freebsd"
1923         ;;
1924       nto-qnx*)
1925         $3="nto-qnx"
1926         ;;
1927       *)
1928         echo "Unknown OS $1"
1929         exit 1
1930         ;;
1931       esac
1932       ;;
1933   esac
1934 ])
1935
1936 # BOOTSTRAPPING_GHC_INFO_FIELD
1937 # --------------------------------
1938 # Set the variable $1 to the value of the ghc --info field $2.
1939 AC_DEFUN([BOOTSTRAPPING_GHC_INFO_FIELD],[
1940 $1=`"$WithGhc" --info | grep "^ ,(\"$2\"," | sed -e 's/.*","//' -e 's/")$//'`
1941 tmp=${$1#\$topdir/}
1942 if test "${$1}" != "$tmp"
1943 then
1944     topdir=`"$WithGhc" --print-libdir | sed 's#\\\\#/#g'`
1945     $1="$topdir/$tmp"
1946 fi
1947 AC_SUBST($1)
1948 ])
1949
1950 # LIBRARY_VERSION(lib, [dir])
1951 # --------------------------------
1952 # Gets the version number of a library.
1953 # If $1 is ghc-prim, then we define LIBRARY_ghc_prim_VERSION as 1.2.3
1954 # $2 points to the directory under libraries/
1955 AC_DEFUN([LIBRARY_VERSION],[
1956 dir=m4_default([$2],[$1])
1957 LIBRARY_[]translit([$1], [-], [_])[]_VERSION=`grep -i "^version:" libraries/${dir}/$1.cabal | sed "s/.* //"`
1958 AC_SUBST(LIBRARY_[]translit([$1], [-], [_])[]_VERSION)
1959 ])
1960
1961 # XCODE_VERSION()
1962 # --------------------------------
1963 # Gets the version number of XCode, if on a Mac
1964 AC_DEFUN([XCODE_VERSION],[
1965     if test "$TargetOS_CPP" = "darwin"
1966     then
1967         AC_MSG_CHECKING(XCode version)
1968         XCodeVersion=`xcodebuild -version | grep Xcode | sed "s/Xcode //"`
1969         # Old XCode versions don't actually give the XCode version
1970         if test "$XCodeVersion" = ""
1971         then
1972             AC_MSG_RESULT(not found (too old?))
1973             XCodeVersion1=0
1974             XCodeVersion2=0
1975         else
1976             AC_MSG_RESULT($XCodeVersion)
1977             XCodeVersion1=`echo "$XCodeVersion" | sed 's/\..*//'`
1978             changequote(, )dnl
1979             XCodeVersion2=`echo "$XCodeVersion" | sed 's/[^.]*\.\([^.]*\).*/\1/'`
1980             changequote([, ])dnl
1981             AC_MSG_NOTICE(XCode version component 1: $XCodeVersion1)
1982             AC_MSG_NOTICE(XCode version component 2: $XCodeVersion2)
1983         fi
1984     fi
1985 ])
1986
1987 # FIND_LLVM_PROG()
1988 # --------------------------------
1989 # Find where the llvm tools are. We have a special function to handle when they
1990 # are installed with a version suffix (e.g., llc-3.1).
1991 #
1992 # $1 = the variable to set
1993 # $2 = the with option name
1994 # $3 = the command to look for
1995 #
1996 AC_DEFUN([FIND_LLVM_PROG],[
1997     FP_ARG_WITH_PATH_GNU_PROG_OPTIONAL([$1], [$2], [$3])
1998     if test "$$1" == ""; then
1999         save_IFS=$IFS
2000         IFS=":;"
2001         for p in ${PATH}; do
2002             if test -d "${p}"; then
2003                 $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`
2004                 if test -n "$$1"; then
2005                     break
2006                 fi
2007             fi
2008         done
2009         IFS=$save_IFS
2010     fi
2011 ])
2012
2013 # FIND_GCC()
2014 # --------------------------------
2015 # Finds where gcc is
2016 #
2017 # $1 = the variable to set
2018 # $2 = the with option name
2019 # $3 = the command to look for
2020 AC_DEFUN([FIND_GCC],[
2021     if test "$TargetOS_CPP" = "darwin" &&
2022        test "$XCodeVersion1" -eq 4 &&
2023        test "$XCodeVersion2" -lt 2
2024     then
2025         # In Xcode 4.1, 'gcc-4.2' is the gcc legacy backend (rather
2026         # than the LLVM backend). We prefer the legacy gcc, but in
2027         # Xcode 4.2 'gcc-4.2' was removed.
2028         FP_ARG_WITH_PATH_GNU_PROG([$1], [gcc-4.2], [gcc-4.2])
2029     elif test "$windows" = YES
2030     then
2031         $1="$CC"
2032     else
2033         FP_ARG_WITH_PATH_GNU_PROG([$1], [$2], [$3])
2034     fi
2035     AC_SUBST($1)
2036 ])
2037
2038 # LocalWords:  fi