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