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