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