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