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