Add 'hadrian/' from commit '45f3bff7016a2a0cd9a5455a882ced984655e90b'
[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     # examples: i386-unknown-mingw32, i686-w64-mingw32, x86_64-w64-mingw32
18     *-mingw32)
19         windows=YES
20         $2='.exe'
21         $3='.dll'
22         ;;
23     # apple platform uses .dylib (macOS, iOS, ...)
24     *-apple-*)
25         $3='.dylib'
26         ;;
27     esac
28 ])
29
30 # FPTOOLS_SET_PLATFORM_VARS
31 # ----------------------------------
32 # Set the platform variables
33 AC_DEFUN([FPTOOLS_SET_PLATFORM_VARS],
34 [
35     # If no argument was given for a configuration variable, then discard
36     # the guessed canonical system and use the configuration of the
37     # bootstrapping ghc. If an argument was given, map it from gnu format
38     # to ghc format.
39     #
40     # For why we do it this way, see: #3637, #1717, #2951
41     #
42     # In bindists, we haven't called AC_CANONICAL_{BUILD,HOST,TARGET}
43     # so this justs uses $bootstrap_target.
44
45     if test "$build_alias" = ""
46     then
47         if test "$bootstrap_target" != ""
48         then
49             build=$bootstrap_target
50             echo "Build platform inferred as: $build"
51         else
52             echo "Can't work out build platform"
53             exit 1
54         fi
55
56         BuildArch=`echo "$build" | sed 's/-.*//'`
57         BuildVendor=`echo "$build" | sed -e 's/.*-\(.*\)-.*/\1/'`
58         BuildOS=`echo "$build" | sed 's/.*-//'`
59     else
60         GHC_CONVERT_CPU([$build_cpu], [BuildArch])
61         GHC_CONVERT_VENDOR([$build_vendor], [BuildVendor])
62         GHC_CONVERT_OS([$build_os], [$BuildArch], [BuildOS])
63     fi
64
65     if test "$host_alias" = ""
66     then
67         if test "$bootstrap_target" != ""
68         then
69             host=$bootstrap_target
70             echo "Host platform inferred as: $host"
71         else
72             echo "Can't work out host platform"
73             exit 1
74         fi
75
76         HostArch=`echo "$host" | sed 's/-.*//'`
77         HostVendor=`echo "$host" | sed -e 's/.*-\(.*\)-.*/\1/'`
78         HostOS=`echo "$host" | sed 's/.*-//'`
79     else
80         GHC_CONVERT_CPU([$host_cpu], [HostArch])
81         GHC_CONVERT_VENDOR([$host_vendor], [HostVendor])
82         GHC_CONVERT_OS([$host_os], [$HostArch], [HostOS])
83     fi
84
85     if test "$target_alias" = ""
86     then
87         if test "$host_alias" != ""
88         then
89             GHC_CONVERT_CPU([$host_cpu], [TargetArch])
90             GHC_CONVERT_VENDOR([$host_vendor], [TargetVendor])
91             GHC_CONVERT_OS([$host_os], [$TargetArch],[TargetOS])
92         else
93             if test "$bootstrap_target" != ""
94             then
95                 target=$bootstrap_target
96                 echo "Target platform inferred as: $target"
97             else
98                 echo "Can't work out target platform"
99                 exit 1
100             fi
101
102             TargetArch=`echo "$target" | sed 's/-.*//'`
103             TargetVendor=`echo "$target" | sed -e 's/.*-\(.*\)-.*/\1/'`
104             TargetOS=`echo "$target" | sed 's/.*-//'`
105         fi
106     else
107         GHC_CONVERT_CPU([$target_cpu], [TargetArch])
108         GHC_CONVERT_VENDOR([$target_vendor], [TargetVendor])
109         GHC_CONVERT_OS([$target_os], [$TargetArch], [TargetOS])
110     fi
111
112     GHC_LLVM_TARGET([$target_cpu],[$target_vendor],[$target_os],[LlvmTarget])
113
114     GHC_SELECT_FILE_EXTENSIONS([$host], [exeext_host], [soext_host])
115     GHC_SELECT_FILE_EXTENSIONS([$target], [exeext_target], [soext_target])
116     windows=NO
117     case $host in
118     *-unknown-mingw32)
119         windows=YES
120         ;;
121     esac
122
123     BuildPlatform="$BuildArch-$BuildVendor-$BuildOS"
124     BuildPlatform_CPP=`echo "$BuildPlatform" | sed -e 's/\./_/g' -e 's/-/_/g'`
125     BuildArch_CPP=`    echo "$BuildArch"     | sed -e 's/\./_/g' -e 's/-/_/g'`
126     BuildVendor_CPP=`  echo "$BuildVendor"   | sed -e 's/\./_/g' -e 's/-/_/g'`
127     BuildOS_CPP=`      echo "$BuildOS"       | sed -e 's/\./_/g' -e 's/-/_/g'`
128
129     HostPlatform="$HostArch-$HostVendor-$HostOS"
130     HostPlatform_CPP=`echo "$HostPlatform" | sed -e 's/\./_/g' -e 's/-/_/g'`
131     HostArch_CPP=`    echo "$HostArch"     | sed -e 's/\./_/g' -e 's/-/_/g'`
132     HostVendor_CPP=`  echo "$HostVendor"   | sed -e 's/\./_/g' -e 's/-/_/g'`
133     HostOS_CPP=`      echo "$HostOS"       | sed -e 's/\./_/g' -e 's/-/_/g'`
134
135     TargetPlatform="$TargetArch-$TargetVendor-$TargetOS"
136     TargetPlatform_CPP=`echo "$TargetPlatform" | sed -e 's/\./_/g' -e 's/-/_/g'`
137     TargetArch_CPP=`    echo "$TargetArch"     | sed -e 's/\./_/g' -e 's/-/_/g'`
138     TargetVendor_CPP=`  echo "$TargetVendor"   | sed -e 's/\./_/g' -e 's/-/_/g'`
139     TargetOS_CPP=`      echo "$TargetOS"       | sed -e 's/\./_/g' -e 's/-/_/g'`
140
141     # we intend to pass trough --targets to llvm as is.
142     LLVMTarget_CPP=`    echo "$LlvmTarget"`
143
144     echo "GHC build  : $BuildPlatform"
145     echo "GHC host   : $HostPlatform"
146     echo "GHC target : $TargetPlatform"
147     echo "LLVM target: $LlvmTarget"
148
149     AC_SUBST(BuildPlatform)
150     AC_SUBST(HostPlatform)
151     AC_SUBST(TargetPlatform)
152     AC_SUBST(HostPlatform_CPP)
153     AC_SUBST(BuildPlatform_CPP)
154     AC_SUBST(TargetPlatform_CPP)
155
156     AC_SUBST(HostArch_CPP)
157     AC_SUBST(BuildArch_CPP)
158     AC_SUBST(TargetArch_CPP)
159
160     AC_SUBST(HostOS_CPP)
161     AC_SUBST(BuildOS_CPP)
162     AC_SUBST(TargetOS_CPP)
163     AC_SUBST(LLVMTarget_CPP)
164
165     AC_SUBST(HostVendor_CPP)
166     AC_SUBST(BuildVendor_CPP)
167     AC_SUBST(TargetVendor_CPP)
168
169     AC_SUBST(exeext_host)
170     AC_SUBST(exeext_target)
171     AC_SUBST(soext_host)
172     AC_SUBST(soext_target)
173 ])
174
175
176 # FPTOOLS_SET_HASKELL_PLATFORM_VARS
177 # ----------------------------------
178 # Set the Haskell platform variables
179 AC_DEFUN([FPTOOLS_SET_HASKELL_PLATFORM_VARS],
180 [
181     checkArch() {
182         case [$]1 in
183         i386)
184             test -z "[$]2" || eval "[$]2=ArchX86"
185             ;;
186         x86_64|amd64)
187             test -z "[$]2" || eval "[$]2=ArchX86_64"
188             ;;
189         powerpc)
190             test -z "[$]2" || eval "[$]2=ArchPPC"
191             ;;
192         powerpc64)
193             test -z "[$]2" || eval "[$]2=\"ArchPPC_64 {ppc_64ABI = ELF_V1}\""
194             ;;
195         powerpc64le)
196             test -z "[$]2" || eval "[$]2=\"ArchPPC_64 {ppc_64ABI = ELF_V2}\""
197             ;;
198         sparc)
199             test -z "[$]2" || eval "[$]2=ArchSPARC"
200             ;;
201         sparc64)
202             test -z "[$]2" || eval "[$]2=ArchSPARC64"
203             ;;
204         arm)
205             GET_ARM_ISA()
206             test -z "[$]2" || eval "[$]2=\"ArchARM {armISA = \$ARM_ISA, armISAExt = \$ARM_ISA_EXT, armABI = \$ARM_ABI}\""
207             ;;
208         aarch64)
209             test -z "[$]2" || eval "[$]2=ArchARM64"
210             ;;
211         alpha)
212             test -z "[$]2" || eval "[$]2=ArchAlpha"
213             ;;
214         mips|mipseb)
215             test -z "[$]2" || eval "[$]2=ArchMipseb"
216             ;;
217         mipsel)
218             test -z "[$]2" || eval "[$]2=ArchMipsel"
219             ;;
220         hppa|hppa1_1|ia64|m68k|nios2|riscv32|riscv64|rs6000|s390|s390x|sh4|vax)
221             test -z "[$]2" || eval "[$]2=ArchUnknown"
222             ;;
223         *)
224             echo "Unknown arch [$]1"
225             exit 1
226             ;;
227         esac
228     }
229
230     checkVendor() {
231         case [$]1 in
232         dec|none|unknown|hp|apple|next|sun|sgi|ibm|montavista|portbld|alpine)
233             ;;
234         *)
235             AC_MSG_WARN([Unknown vendor [$]1])
236             ;;
237         esac
238     }
239
240     checkOS() {
241         case [$]1 in
242         linux|linux-android)
243             test -z "[$]2" || eval "[$]2=OSLinux"
244             ;;
245         darwin|ios|watchos|tvos)
246             test -z "[$]2" || eval "[$]2=OSDarwin"
247             ;;
248         solaris2)
249             test -z "[$]2" || eval "[$]2=OSSolaris2"
250             ;;
251         mingw32)
252             test -z "[$]2" || eval "[$]2=OSMinGW32"
253             ;;
254         freebsd)
255             test -z "[$]2" || eval "[$]2=OSFreeBSD"
256             ;;
257         dragonfly)
258             test -z "[$]2" || eval "[$]2=OSDragonFly"
259             ;;
260         kfreebsdgnu)
261             test -z "[$]2" || eval "[$]2=OSKFreeBSD"
262             ;;
263         openbsd)
264             test -z "[$]2" || eval "[$]2=OSOpenBSD"
265             ;;
266         netbsd)
267             test -z "[$]2" || eval "[$]2=OSNetBSD"
268             ;;
269         haiku)
270             test -z "[$]2" || eval "[$]2=OSHaiku"
271             ;;
272         nto-qnx)
273             test -z "[$]2" || eval "[$]2=OSQNXNTO"
274             ;;
275         dragonfly|hpux|linuxaout|freebsd2|nextstep2|nextstep3|sunos4|ultrix)
276             test -z "[$]2" || eval "[$]2=OSUnknown"
277             ;;
278         aix)
279             test -z "[$]2" || eval "[$]2=OSAIX"
280             ;;
281         gnu)
282             test -z "[$]2" || eval "[$]2=OSHurd"
283             ;;
284         *)
285             echo "Unknown OS '[$]1'"
286             exit 1
287             ;;
288         esac
289     }
290
291     dnl ** check for Apple-style dead-stripping support
292     dnl    (.subsections-via-symbols assembler directive)
293
294     AC_MSG_CHECKING(for .subsections_via_symbols)
295     AC_COMPILE_IFELSE(
296         [AC_LANG_PROGRAM([], [__asm__ (".subsections_via_symbols");])],
297         [AC_MSG_RESULT(yes)
298          HaskellHaveSubsectionsViaSymbols=True
299          AC_DEFINE([HAVE_SUBSECTIONS_VIA_SYMBOLS],[1],
300                    [Define to 1 if Apple-style dead-stripping is supported.])
301         ],
302         [HaskellHaveSubsectionsViaSymbols=False
303          AC_MSG_RESULT(no)])
304
305     dnl ** check for .ident assembler directive
306
307     AC_MSG_CHECKING(whether your assembler supports .ident directive)
308     AC_COMPILE_IFELSE(
309         [AC_LANG_SOURCE([__asm__ (".ident \"GHC x.y.z\"");])],
310         [AC_MSG_RESULT(yes)
311          HaskellHaveIdentDirective=True],
312         [AC_MSG_RESULT(no)
313          HaskellHaveIdentDirective=False])
314
315     dnl *** check for GNU non-executable stack note support (ELF only)
316     dnl     (.section .note.GNU-stack,"",@progbits)
317
318     dnl This test doesn't work with "gcc -g" in gcc 4.4 (GHC trac #3889:
319     dnl     Error: can't resolve `.note.GNU-stack' {.note.GNU-stack section} - `.Ltext0' {.text section}
320     dnl so we empty CFLAGS while running this test
321     CFLAGS2="$CFLAGS"
322     CFLAGS=
323     case $TargetArch in
324       arm)
325         dnl See #13937.
326         progbits="%progbits"
327         ;;
328       *)
329         progbits="@progbits"
330         ;;
331     esac
332     AC_MSG_CHECKING(for GNU non-executable stack support)
333     AC_COMPILE_IFELSE(
334         [AC_LANG_PROGRAM([__asm__ (".section .note.GNU-stack,\"\",$progbits");], [0])],
335         [AC_MSG_RESULT(yes)
336          HaskellHaveGnuNonexecStack=True],
337         [AC_MSG_RESULT(no)
338          HaskellHaveGnuNonexecStack=False])
339     CFLAGS="$CFLAGS2"
340
341     checkArch "$BuildArch" "HaskellBuildArch"
342     checkVendor "$BuildVendor"
343     checkOS "$BuildOS" ""
344
345     checkArch "$HostArch" "HaskellHostArch"
346     checkVendor "$HostVendor"
347     checkOS "$HostOS" ""
348
349     checkArch "$TargetArch" "HaskellTargetArch"
350     checkVendor "$TargetVendor"
351     checkOS "$TargetOS" "HaskellTargetOs"
352
353     AC_SUBST(HaskellTargetArch)
354     AC_SUBST(HaskellTargetOs)
355     AC_SUBST(HaskellHaveSubsectionsViaSymbols)
356     AC_SUBST(HaskellHaveIdentDirective)
357     AC_SUBST(HaskellHaveGnuNonexecStack)
358 ])
359
360
361 # GET_ARM_ISA
362 # ----------------------------------
363 # Get info about the ISA on the ARM arch
364 AC_DEFUN([GET_ARM_ISA],
365 [
366     AC_COMPILE_IFELSE([
367         AC_LANG_PROGRAM(
368             [],
369             [#if defined(__ARM_ARCH_2__)  || \
370                  defined(__ARM_ARCH_3__)  || \
371                  defined(__ARM_ARCH_3M__) || \
372                  defined(__ARM_ARCH_4__)  || \
373                  defined(__ARM_ARCH_4T__) || \
374                  defined(__ARM_ARCH_5__)  || \
375                  defined(__ARM_ARCH_5T__) || \
376                  defined(__ARM_ARCH_5E__) || \
377                  defined(__ARM_ARCH_5TE__)
378                  return 0;
379              #else
380                  not pre arm v6
381              #endif]
382         )],
383         [AC_DEFINE(arm_HOST_ARCH_PRE_ARMv6, 1, [ARM pre v6])
384          AC_DEFINE(arm_HOST_ARCH_PRE_ARMv7, 1, [ARM pre v7])
385          changequote(, )dnl
386          ARM_ISA=ARMv5
387          ARM_ISA_EXT="[]"
388          changequote([, ])dnl
389         ],
390         [
391             AC_COMPILE_IFELSE([
392                 AC_LANG_PROGRAM(
393                     [],
394                     [#if defined(__ARM_ARCH_6__)   || \
395                          defined(__ARM_ARCH_6J__)  || \
396                          defined(__ARM_ARCH_6T2__) || \
397                          defined(__ARM_ARCH_6Z__)  || \
398                          defined(__ARM_ARCH_6ZK__) || \
399                          defined(__ARM_ARCH_6K__)  || \
400                          defined(__ARM_ARCH_6KZ__) || \
401                          defined(__ARM_ARCH_6M__)
402                          return 0;
403                      #else
404                          not pre arm v7
405                      #endif]
406                 )],
407                 [AC_DEFINE(arm_HOST_ARCH_PRE_ARMv7, 1, [ARM pre v7])
408                  ARM_ISA=ARMv6
409                  AC_COMPILE_IFELSE([
410                         AC_LANG_PROGRAM(
411                                 [],
412                                 [#if defined(__VFP_FP__)
413                                      return 0;
414                                 #else
415                                      no vfp
416                                 #endif]
417                         )],
418                         [changequote(, )dnl
419                          ARM_ISA_EXT="[VFPv2]"
420                          changequote([, ])dnl
421                         ],
422                         [changequote(, )dnl
423                          ARM_ISA_EXT="[]"
424                          changequote([, ])dnl
425                         ]
426                 )],
427                 [changequote(, )dnl
428                  ARM_ISA=ARMv7
429                  ARM_ISA_EXT="[VFPv3,NEON]"
430                  changequote([, ])dnl
431                 ])
432         ])
433
434         AC_COMPILE_IFELSE(
435                [AC_LANG_PROGRAM(
436                        [],
437                        [#if defined(__SOFTFP__)
438                             return 0;
439                        #else
440                             not softfp
441                        #endif]
442                )],
443                [changequote(, )dnl
444                 ARM_ABI="SOFT"
445                 changequote([, ])dnl
446                ],
447                [AC_COMPILE_IFELSE(
448                     [AC_LANG_PROGRAM(
449                        [],
450                        [#if defined(__ARM_PCS_VFP)
451                             return 0;
452                        #else
453                             no hard float ABI
454                        #endif]
455                     )],
456                     [ARM_ABI="HARD"],
457                     [ARM_ABI="SOFTFP"]
458                )]
459         )
460
461         AC_SUBST(ARM_ISA)
462 ])
463
464
465 # FP_SETTINGS
466 # ----------------------------------
467 # Set the variables used in the settings file
468 AC_DEFUN([FP_SETTINGS],
469 [
470     if test "$windows" = YES -a "$EnableDistroToolchain" = "NO"
471     then
472         mingw_bin_prefix=mingw/bin/
473         SettingsCCompilerCommand="\$tooldir/${mingw_bin_prefix}gcc.exe"
474         SettingsHaskellCPPCommand="\$tooldir/${mingw_bin_prefix}gcc.exe"
475         SettingsHaskellCPPFlags="$HaskellCPPArgs"
476         SettingsLdCommand="\$tooldir/${mingw_bin_prefix}ld.exe"
477         SettingsArCommand="\$tooldir/${mingw_bin_prefix}ar.exe"
478         SettingsRanlibCommand="\$tooldir/${mingw_bin_prefix}ranlib.exe"
479         SettingsPerlCommand='$tooldir/perl/perl.exe'
480         SettingsDllWrapCommand="\$tooldir/${mingw_bin_prefix}dllwrap.exe"
481         SettingsWindresCommand="\$tooldir/${mingw_bin_prefix}windres.exe"
482         SettingsTouchCommand='$topdir/bin/touchy.exe'
483     elif test "$EnableDistroToolchain" = "YES"
484     then
485         SettingsCCompilerCommand="$(basename $CC)"
486         SettingsCCompilerFlags="$CONF_CC_OPTS_STAGE2"
487         SettingsHaskellCPPCommand="$(basename $HaskellCPPCmd)"
488         SettingsHaskellCPPFlags="$HaskellCPPArgs"
489         SettingsLdCommand="$(basename $LdCmd)"
490         SettingsArCommand="$(basename $ArCmd)"
491         SettingsPerlCommand="$(basename $PerlCmd)"
492         SettingsDllWrapCommand="$(basename $DllWrapCmd)"
493         SettingsWindresCommand="$(basename $WindresCmd)"
494         SettingsTouchCommand='$topdir/bin/touchy.exe'
495     else
496         SettingsCCompilerCommand="$CC"
497         SettingsHaskellCPPCommand="$HaskellCPPCmd"
498         SettingsHaskellCPPFlags="$HaskellCPPArgs"
499         SettingsLdCommand="$LdCmd"
500         SettingsArCommand="$ArCmd"
501         SettingsRanlibCommand="$RanlibCmd"
502         SettingsPerlCommand="$PerlCmd"
503         if test -z "$DllWrapCmd"
504         then
505             SettingsDllWrapCommand="/bin/false"
506         else
507             SettingsDllWrapCommand="$DllWrapCmd"
508         fi
509         if test -z "$WindresCmd"
510         then
511             SettingsWindresCommand="/bin/false"
512         else
513             SettingsWindresCommand="$WindresCmd"
514         fi
515        SettingsTouchCommand='touch'
516     fi
517     if test -z "$LibtoolCmd"
518     then
519       SettingsLibtoolCommand="libtool"
520     else
521       SettingsLibtoolCommand="$LibtoolCmd"
522     fi
523     if test -z "$ClangCmd"
524     then
525         SettingsClangCommand="clang"
526     else
527         SettingsClangCommand="$ClangCmd"
528     fi
529     if test -z "$LlcCmd"
530     then
531       SettingsLlcCommand="llc"
532     else
533       SettingsLlcCommand="$LlcCmd"
534     fi
535     if test -z "$OptCmd"
536     then
537       SettingsOptCommand="opt"
538     else
539       SettingsOptCommand="$OptCmd"
540     fi
541     SettingsCCompilerFlags="$CONF_CC_OPTS_STAGE2"
542     SettingsCCompilerLinkFlags="$CONF_GCC_LINKER_OPTS_STAGE2"
543     SettingsCCompilerSupportsNoPie="$CONF_GCC_SUPPORTS_NO_PIE"
544     SettingsLdFlags="$CONF_LD_LINKER_OPTS_STAGE2"
545     AC_SUBST(SettingsCCompilerCommand)
546     AC_SUBST(SettingsHaskellCPPCommand)
547     AC_SUBST(SettingsHaskellCPPFlags)
548     AC_SUBST(SettingsCCompilerFlags)
549     AC_SUBST(SettingsCCompilerLinkFlags)
550     AC_SUBST(SettingsCCompilerSupportsNoPie)
551     AC_SUBST(SettingsLdCommand)
552     AC_SUBST(SettingsLdFlags)
553     AC_SUBST(SettingsArCommand)
554     AC_SUBST(SettingsRanlibCommand)
555     AC_SUBST(SettingsPerlCommand)
556     AC_SUBST(SettingsDllWrapCommand)
557     AC_SUBST(SettingsWindresCommand)
558     AC_SUBST(SettingsLibtoolCommand)
559     AC_SUBST(SettingsTouchCommand)
560     AC_SUBST(SettingsClangCommand)
561     AC_SUBST(SettingsLlcCommand)
562     AC_SUBST(SettingsOptCommand)
563 ])
564
565 # Helper for cloning a shell variable's state
566 AC_DEFUN([FP_COPY_SHELLVAR],
567 [if test -n "${$1+set}"; then $2="$$1"; else unset $2; fi ])
568
569 # FP_SET_CFLAGS_C99
570 # ----------------------------------
571 # figure out which CFLAGS are needed to place the compiler into C99 mode
572 # $1 is name of CC variable (unmodified)
573 # $2 is name of CC flags variable (augmented if needed)
574 # $3 is name of CPP flags variable (augmented if needed)
575 AC_DEFUN([FP_SET_CFLAGS_C99],
576 [
577     dnl save current state of AC_PROG_CC_C99
578     FP_COPY_SHELLVAR([CC],[fp_save_CC])
579     FP_COPY_SHELLVAR([CFLAGS],[fp_save_CFLAGS])
580     FP_COPY_SHELLVAR([CPPFLAGS],[fp_save_CPPFLAGS])
581     FP_COPY_SHELLVAR([ac_cv_prog_cc_c99],[fp_save_cc_c99])
582     dnl set local state
583     CC="$$1"
584     CFLAGS="$$2"
585     CPPFLAGS="$$3"
586     unset ac_cv_prog_cc_c99
587     dnl perform detection
588     _AC_PROG_CC_C99
589     fp_cc_c99="$ac_cv_prog_cc_c99"
590     case "x$ac_cv_prog_cc_c99" in
591       x)   ;; # noop
592       xno) AC_MSG_ERROR([C99-compatible compiler needed]) ;;
593       *)   $2="$$2 $ac_cv_prog_cc_c99"
594            $3="$$3 $ac_cv_prog_cc_c99"
595            ;;
596     esac
597     dnl restore saved state
598     FP_COPY_SHELLVAR([fp_save_CC],[CC])
599     FP_COPY_SHELLVAR([fp_save_CFLAGS],[CFLAGS])
600     FP_COPY_SHELLVAR([fp_save_CPPFLAGS],[CPPFLAGS])
601     FP_COPY_SHELLVAR([fp_save_cc_c99],[ac_cv_prog_cc_c99])
602     dnl cleanup
603     unset fp_save_CC
604     unset fp_save_CFLAGS
605     unset fp_save_cc_c99
606 ])
607
608 # FPTOOLS_SET_C_LD_FLAGS
609 # ----------------------------------
610 # Set the C, LD and CPP flags for a given platform.
611 # $1 is the platform
612 # $2 is the name of the CC flags variable
613 # $3 is the name of the linker flags variable when linking with gcc
614 # $4 is the name of the linker flags variable when linking with ld
615 # $5 is the name of the CPP flags variable
616 AC_DEFUN([FPTOOLS_SET_C_LD_FLAGS],
617 [
618     AC_MSG_CHECKING([Setting up $2, $3, $4 and $5])
619     case $$1 in
620     i386-*)
621         # Workaround for #7799
622         $2="$$2 -U__i686"
623         ;;
624     esac
625
626     case $$1 in
627     i386-unknown-mingw32)
628         $2="$$2 -march=i686"
629         ;;
630     i386-portbld-freebsd*)
631         $2="$$2 -march=i686"
632         ;;
633     x86_64-unknown-solaris2)
634         $2="$$2 -m64"
635         $3="$$3 -m64"
636         $4="$$4 -m64"
637         $5="$$5 -m64"
638         ;;
639     alpha-*)
640         # For now, to suppress the gcc warning "call-clobbered
641         # register used for global register variable", we simply
642         # disable all warnings altogether using the -w flag. Oh well.
643         $2="$$2 -w -mieee -D_REENTRANT"
644         $3="$$3 -w -mieee -D_REENTRANT"
645         $5="$$5 -w -mieee -D_REENTRANT"
646         ;;
647     hppa*)
648         # ___HPUX_SOURCE, not _HPUX_SOURCE, is #defined if -ansi!
649         # (very nice, but too bad the HP /usr/include files don't agree.)
650         $2="$$2 -D_HPUX_SOURCE"
651         $3="$$3 -D_HPUX_SOURCE"
652         $5="$$5 -D_HPUX_SOURCE"
653         ;;
654
655     arm*freebsd*)
656         # On arm/freebsd, tell gcc to generate Arm
657         # instructions (ie not Thumb).
658         $2="$$2 -marm"
659         $3="$$3 -Wl,-z,noexecstack"
660         $4="$$4 -z noexecstack"
661         ;;
662     arm*linux*)
663         # On arm/linux and arm/android, tell gcc to generate Arm
664         # instructions (ie not Thumb).
665         $2="$$2 -marm"
666         $3="$$3 -Wl,-z,noexecstack"
667         $4="$$4 -z noexecstack"
668         ;;
669
670     aarch64*freebsd*)
671         $3="$$3 -Wl,-z,noexecstack"
672         $4="$$4 -z noexecstack"
673         ;;
674     aarch64*linux*)
675         $3="$$3 -Wl,-z,noexecstack"
676         $4="$$4 -z noexecstack"
677         ;;
678
679     powerpc-ibm-aix*)
680         # We need `-D_THREAD_SAFE` to unlock the thread-local `errno`.
681         $2="$$2 -D_THREAD_SAFE"
682         $3="$$3 -D_THREAD_SAFE -Wl,-bnotextro"
683         $4="$$4 -bnotextro"
684         $5="$$5 -D_THREAD_SAFE"
685         ;;
686
687     x86_64-*-openbsd*)
688         # We need -z wxneeded at least to link ghc-stage2 to workaround
689         # W^X issue in GHCi on OpenBSD current (as of Aug 2016)
690         $3="$$3 -Wl,-z,wxneeded"
691         $4="$$4 -z wxneeded"
692         ;;
693
694     esac
695
696     # If gcc knows about the stack protector, turn it off.
697     # Otherwise the stack-smash handler gets triggered.
698     echo 'int main(void) {return 0;}' > conftest.c
699     if $CC -c conftest.c -fno-stack-protector > /dev/null 2>&1
700     then
701         $2="$$2 -fno-stack-protector"
702     fi
703
704     rm -f conftest.c conftest.o
705     AC_MSG_RESULT([done])
706 ])
707
708
709 # FP_VISIBILITY_HIDDEN
710 # ----------------------------------
711 # Is the visibility hidden attribute supported?
712 AC_DEFUN([FP_VISIBILITY_HIDDEN],
713 [
714     AC_MSG_CHECKING([whether __attribute__((visibility("hidden"))) is supported])
715     echo '__attribute__((visibility("hidden"))) void foo(void) {}' > conftest.c
716     if $CC -Wall -Werror -c conftest.c > /dev/null 2>&1
717     then
718         AC_MSG_RESULT([yes])
719         AC_DEFINE(HAS_VISIBILITY_HIDDEN, 1, [Has visibility hidden])
720     else
721         AC_MSG_RESULT([no])
722     fi
723     rm -f conftest.c conftest.o
724 ])
725
726
727 # FPTOOLS_FLOAT_WORD_ORDER_BIGENDIAN
728 # ----------------------------------
729 # Little endian ARM on Linux with some ABIs has big endian word order
730 # in doubles. Define FLOAT_WORDS_BIGENDIAN if this is the case.
731 AC_DEFUN([FPTOOLS_FLOAT_WORD_ORDER_BIGENDIAN],
732   [AC_CACHE_CHECK([whether float word order is big endian], [fptools_cv_float_word_order_bigendian],
733     [AC_COMPILE_IFELSE(
734       [AC_LANG_PROGRAM(
735         [#include <endian.h>],
736         [#if defined(__FLOAT_WORD_ORDER) && __FLOAT_WORD_ORDER == BIG_ENDIAN
737              return 0;
738          #else
739              not float word order big endian
740          #endif]
741       )],
742       [fptools_cv_float_word_order_bigendian=yes],
743       [fptools_cv_float_word_order_bigendian=no])
744     ])
745   case $fptools_cv_float_word_order_bigendian in
746       yes)
747           AC_DEFINE([FLOAT_WORDS_BIGENDIAN], 1,
748           [Define to 1 if your processor stores words of floats with
749            the most significant byte first]) ;;
750   esac
751 ])
752
753
754 # FP_PROG_CONTEXT_DIFF
755 # --------------------
756 # Figure out how to do context diffs. Sets the output variable ContextDiffCmd.
757 #
758 # Note: NeXTStep thinks diff'ing a file against itself is "trouble".
759 AC_DEFUN([FP_PROG_CONTEXT_DIFF],
760 [AC_CACHE_CHECK([for a working context diff], [fp_cv_context_diff],
761 [echo foo > conftest1
762 echo foo > conftest2
763 fp_cv_context_diff=no
764 for fp_var in '-U 1' '-u1' '-C 1' '-c1'
765 do
766   if diff $fp_var conftest1 conftest2 > /dev/null 2>&1; then
767     fp_cv_context_diff="diff $fp_var"
768     break
769   fi
770 done])
771 if test x"$fp_cv_context_diff" = xno; then
772    AC_MSG_ERROR([cannot figure out how to do context diffs])
773 fi
774 AC_SUBST(ContextDiffCmd, [$fp_cv_context_diff])
775 ])# FP_PROG_CONTEXT_DIFF
776
777
778 # FP_COMPUTE_INT(EXPRESSION, VARIABLE, INCLUDES, IF-FAILS)
779 # --------------------------------------------------------
780 # Assign VARIABLE the value of the compile-time EXPRESSION using INCLUDES for
781 # compilation. Execute IF-FAILS when unable to determine the value. Works for
782 # cross-compilation, too.
783 #
784 # Implementation note: We are lazy and use an internal autoconf macro, but it
785 # is supported in autoconf versions 2.50 up to the actual 2.57, so there is
786 # little risk.
787 AC_DEFUN([FP_COMPUTE_INT],
788 [_AC_COMPUTE_INT([$1], [$2], [$3], [$4])[]dnl
789 ])# FP_COMPUTE_INT
790
791
792 # FP_CHECK_ALIGNMENT(TYPE, [IGNORED], [INCLUDES = DEFAULT-INCLUDES])
793 # ------------------------------------------------------------------
794 # A variation of AC_CHECK_SIZEOF for computing the alignment restrictions of a
795 # given type. Defines ALIGNMENT_TYPE.
796 AC_DEFUN([FP_CHECK_ALIGNMENT],
797 [AS_LITERAL_IF(m4_translit([[$1]], [*], [p]), [],
798                [AC_FATAL([$0: requires literal arguments])])[]dnl
799 AC_CHECK_TYPE([$1], [], [], [$3])[]dnl
800 m4_pushdef([fp_Cache], [AS_TR_SH([fp_cv_alignment_$1])])[]dnl
801 AC_CACHE_CHECK([alignment of $1], [fp_Cache],
802 [if test "$AS_TR_SH([ac_cv_type_$1])" = yes; then
803   FP_COMPUTE_INT([offsetof(struct { char c; $1 ty; },ty)],
804                  [fp_Cache],
805                  [AC_INCLUDES_DEFAULT([$3])],
806                  [AC_MSG_ERROR([cannot compute alignment ($1)
807 See `config.log' for more details.], [77])])
808 else
809   fp_Cache=0
810 fi])[]dnl
811 AC_DEFINE_UNQUOTED(AS_TR_CPP(alignment_$1), $fp_Cache, [The alignment of a `$1'.])[]dnl
812 m4_popdef([fp_Cache])[]dnl
813 ])# FP_CHECK_ALIGNMENT
814
815
816
817 # FP_CHECK_SIZEOF_AND_ALIGNMENT(TYPE)
818 # ------------------------------------------------------------------
819 # Combines AC_CHECK_SIZEOF and FP_CHECK_ALIGNMENT.
820 AC_DEFUN([FP_CHECK_SIZEOF_AND_ALIGNMENT],
821 [AC_CHECK_SIZEOF([$1])
822 FP_CHECK_ALIGNMENT([$1])
823 ])# FP_CHECK_SIZEOF_AND_ALIGNMENT
824
825
826 # FP_LEADING_UNDERSCORE
827 # ---------------------
828 # Test for determining whether symbol names have a leading underscore. We assume
829 # that they _haven't_ if anything goes wrong. Sets the output variable
830 # LeadingUnderscore to YES or NO and defines LEADING_UNDERSCORE correspondingly.
831 #
832 # Some nlist implementations seem to try to be compatible by ignoring a leading
833 # underscore sometimes (eg. FreeBSD). We therefore have to work around this by
834 # checking for *no* leading underscore first. Sigh.  --SDM
835 #
836 # Similarly on OpenBSD, but this test doesn't help. -- dons
837 #
838 AC_DEFUN([FP_LEADING_UNDERSCORE],
839 [AC_CHECK_LIB([elf], [nlist], [LIBS="-lelf $LIBS"])
840 AC_CACHE_CHECK([leading underscore in symbol names], [fptools_cv_leading_underscore], [
841 # Hack!: nlist() under Digital UNIX insist on there being an _,
842 # but symbol table listings shows none. What is going on here?!?
843 case $TargetPlatform in
844     # Apples mach-o platforms use leading underscores
845     *-apple-*) fptools_cv_leading_underscore=yes;;
846     *linux-android*) fptools_cv_leading_underscore=no;;
847     *openbsd*) # x86 openbsd is ELF from 3.4 >, meaning no leading uscore
848       case $build in
849         i386-*2\.@<:@0-9@:>@ | i386-*3\.@<:@0-3@:>@ ) fptools_cv_leading_underscore=yes ;;
850         *) fptools_cv_leading_underscore=no ;;
851       esac ;;
852     i386-unknown-mingw32) fptools_cv_leading_underscore=yes;;
853     x86_64-unknown-mingw32) fptools_cv_leading_underscore=no;;
854     *) AC_RUN_IFELSE([AC_LANG_SOURCE([[#ifdef HAVE_NLIST_H
855 #include <nlist.h>
856 struct nlist xYzzY1[] = {{"xYzzY1", 0},{0}};
857 struct nlist xYzzY2[] = {{"_xYzzY2", 0},{0}};
858 #endif
859
860 int main(argc, argv)
861 int argc;
862 char **argv;
863 {
864 #ifdef HAVE_NLIST_H
865     if(nlist(argv[0], xYzzY1) == 0 && xYzzY1[0].n_value != 0)
866         exit(1);
867     if(nlist(argv[0], xYzzY2) == 0 && xYzzY2[0].n_value != 0)
868         exit(0);
869 #endif
870     exit(1);
871 }]])],[fptools_cv_leading_underscore=yes],[fptools_cv_leading_underscore=no],[fptools_cv_leading_underscore=no])
872 ;;
873 esac]);
874 AC_SUBST([LeadingUnderscore], [`echo $fptools_cv_leading_underscore | sed 'y/yesno/YESNO/'`])
875 if test x"$fptools_cv_leading_underscore" = xyes; then
876    AC_SUBST([CabalLeadingUnderscore],[True])
877    AC_DEFINE([LEADING_UNDERSCORE], [1], [Define to 1 if C symbols have a leading underscore added by the compiler.])
878 else
879    AC_SUBST([CabalLeadingUnderscore],[False])
880 fi
881 ])# FP_LEADING_UNDERSCORE
882
883
884 # FP_COMPARE_VERSIONS(VERSION1, TEST, VERSION2, [ACTION-IF-TRUE], [ACTION-IF-FALSE])
885 # ----------------------------------------------------------------------------------
886 # Compare dotted version numbers VERSION1 and VERSION2 lexicographically according
887 # to TEST (one of -eq, -ne, -lt, -le, -gt, or -ge).
888 AC_DEFUN([FP_COMPARE_VERSIONS],
889 [fp_version1=$1; fp_version2=$3
890 fp_save_IFS=$IFS; IFS='.'
891 while test x"$fp_version1" != x || test x"$fp_version2" != x
892 do
893
894   set dummy $fp_version1; shift
895   fp_num1=""
896   test $[@%:@] = 0 || { fp_num1="[$]1"; shift; }
897   test x"$fp_num1" = x && fp_num1="0"
898   fp_version1="[$]*"
899
900   set dummy $fp_version2; shift
901   fp_num2=""
902   test $[@%:@] = 0 || { fp_num2="[$]1"; shift; }
903   test x"$fp_num2" = x && fp_num2="0"
904   fp_version2="[$]*"
905
906   test "$fp_num1" = "$fp_num2" || break;
907 done
908 IFS=$fp_save_IFS
909 AS_IF([test "$fp_num1" $2 "$fp_num2"], [$4], [$5])[]dnl
910 ])# FP_COMPARE_VERSIONS
911
912
913 dnl
914 dnl Check for Happy and version.
915 dnl If there's no installed Happy, we look
916 dnl for a happy source tree and point the build system at that instead.
917 dnl If you increase the minimum version requirement, please also update:
918 dnl https://ghc.haskell.org/trac/ghc/wiki/Building/Preparation/Tools
919 dnl
920 AC_DEFUN([FPTOOLS_HAPPY],
921 [AC_PATH_PROG(HappyCmd,happy,)
922
923 AC_CACHE_CHECK([for version of happy], fptools_cv_happy_version,
924 changequote(, )dnl
925 [if test x"$HappyCmd" != x; then
926    fptools_cv_happy_version=`"$HappyCmd" -v |
927               grep 'Happy Version' | sed -e 's/Happy Version \([^ ]*\).*/\1/g'` ;
928 else
929    fptools_cv_happy_version="";
930 fi;
931 changequote([, ])dnl
932 ])
933 if test ! -f compiler/parser/Parser.hs || test ! -f compiler/cmm/CmmParse.hs
934 then
935     FP_COMPARE_VERSIONS([$fptools_cv_happy_version],[-lt],[1.19.4],
936       [AC_MSG_ERROR([Happy version 1.19.4 or later is required to compile GHC.])])[]
937 fi
938 HappyVersion=$fptools_cv_happy_version;
939 AC_SUBST(HappyVersion)
940 ])
941
942 dnl
943 dnl Check for Alex and version.
944 dnl If you increase the minimum version requirement, please also update:
945 dnl https://ghc.haskell.org/trac/ghc/wiki/Building/Preparation/Tools
946 dnl
947 AC_DEFUN([FPTOOLS_ALEX],
948 [
949 AC_PATH_PROG(AlexCmd,alex,)
950
951 AC_CACHE_CHECK([for version of alex], fptools_cv_alex_version,
952 changequote(, )dnl
953 [if test x"$AlexCmd" != x; then
954    fptools_cv_alex_version=`"$AlexCmd" -v |
955               grep 'Alex [Vv]ersion' | sed -e 's/Alex [Vv]ersion \([0-9\.]*\).*/\1/g'` ;
956 else
957    fptools_cv_alex_version="";
958 fi;
959 changequote([, ])dnl
960 ])
961 FP_COMPARE_VERSIONS([$fptools_cv_alex_version],[-ge],[3.0],
962   [Alex3=YES],[Alex3=NO])
963 if test ! -f compiler/cmm/CmmLex.hs || test ! -f compiler/parser/Lexer.hs
964 then
965     FP_COMPARE_VERSIONS([$fptools_cv_alex_version],[-lt],[3.1.0],
966       [AC_MSG_ERROR([Alex version 3.1.0 or later is required to compile GHC.])])[]
967 fi
968 AlexVersion=$fptools_cv_alex_version;
969 AC_SUBST(AlexVersion)
970 AC_SUBST(Alex3)
971 ])
972
973
974 # FP_PROG_LD_FLAG
975 # ---------------
976 # Sets the output variable $2 to $1 if ld supports the $1 flag.
977 # Otherwise the variable's value is empty.
978 AC_DEFUN([FP_PROG_LD_FLAG],
979 [
980 AC_CACHE_CHECK([whether ld understands $1], [fp_cv_$2],
981 [echo 'int foo() { return 0; }' > conftest.c
982 ${CC-cc} -c conftest.c
983 if ${LdCmd} -r $1 -o conftest2.o conftest.o > /dev/null 2>&1; then
984    fp_cv_$2=$1
985 else
986    fp_cv_$2=
987 fi
988 rm -rf conftest*])
989 $2=$fp_cv_$2
990 ])# FP_PROG_LD_FLAG
991
992
993 # FP_PROG_LD_BUILD_ID
994 # ------------
995
996 # Sets the output variable LdHasBuildId to YES if ld supports
997 # --build-id, or NO otherwise.
998 AC_DEFUN([FP_PROG_LD_BUILD_ID],
999 [
1000 AC_CACHE_CHECK([whether ld understands --build-id], [fp_cv_ld_build_id],
1001 [echo 'int foo() { return 0; }' > conftest.c
1002 ${CC-cc} -c conftest.c
1003 if ${LdCmd} -r --build-id=none -o conftest2.o conftest.o > /dev/null 2>&1; then
1004    fp_cv_ld_build_id=yes
1005 else
1006    fp_cv_ld_build_id=no
1007 fi
1008 rm -rf conftest*])
1009 if test "$fp_cv_ld_build_id" = yes; then
1010   LdHasBuildId=YES
1011 else
1012   LdHasBuildId=NO
1013 fi
1014 AC_SUBST([LdHasBuildId])
1015 ])# FP_PROG_LD_BUILD_ID
1016
1017
1018 # FP_PROG_LD_IS_GNU
1019 # -----------------
1020 # Sets the output variable LdIsGNULd to YES or NO, depending on whether it is
1021 # GNU ld or not.
1022 AC_DEFUN([FP_PROG_LD_IS_GNU],[
1023 AC_CACHE_CHECK([whether ld is GNU ld], [fp_cv_gnu_ld],
1024 [[if ${LdCmd} --version 2> /dev/null | grep "GNU" > /dev/null 2>&1; then
1025   fp_cv_gnu_ld=YES
1026 else
1027   fp_cv_gnu_ld=NO
1028 fi]])
1029 AC_SUBST([LdIsGNULd],["$fp_cv_gnu_ld"])
1030 ])# FP_PROG_LD_IS_GNU
1031
1032
1033 # FP_PROG_LD_NO_COMPACT_UNWIND
1034 # ----------------------------
1035
1036 # Sets the output variable LdHasNoCompactUnwind to YES if ld supports
1037 # -no_compact_unwind, or NO otherwise.
1038 AC_DEFUN([FP_PROG_LD_NO_COMPACT_UNWIND],
1039 [
1040 AC_CACHE_CHECK([whether ld understands -no_compact_unwind], [fp_cv_ld_no_compact_unwind],
1041 [echo 'int foo() { return 0; }' > conftest.c
1042 ${CC-cc} -c conftest.c
1043 if ${LdCmd} -r -no_compact_unwind -o conftest2.o conftest.o > /dev/null 2>&1; then
1044    fp_cv_ld_no_compact_unwind=yes
1045 else
1046    fp_cv_ld_no_compact_unwind=no
1047 fi
1048 rm -rf conftest*])
1049 if test "$fp_cv_ld_no_compact_unwind" = yes; then
1050   LdHasNoCompactUnwind=YES
1051 else
1052   LdHasNoCompactUnwind=NO
1053 fi
1054 AC_SUBST([LdHasNoCompactUnwind])
1055 ])# FP_PROG_LD_NO_COMPACT_UNWIND
1056
1057
1058 # FP_PROG_LD_FILELIST
1059 # -------------------
1060
1061 # Sets the output variable LdHasFilelist to YES if ld supports
1062 # -filelist, or NO otherwise.
1063 AC_DEFUN([FP_PROG_LD_FILELIST],
1064 [
1065 AC_CACHE_CHECK([whether ld understands -filelist], [fp_cv_ld_has_filelist],
1066 [
1067     echo 'int foo() { return 0; }' > conftest1.c
1068     echo 'int bar() { return 0; }' > conftest2.c
1069     ${CC-cc} -c conftest1.c
1070     ${CC-cc} -c conftest2.c
1071     echo conftest1.o  > conftest.o-files
1072     echo conftest2.o >> conftest.o-files
1073     if ${LdCmd} -r -filelist conftest.o-files -o conftest.o > /dev/null 2>&1
1074     then
1075         fp_cv_ld_has_filelist=yes
1076     else
1077         fp_cv_ld_has_filelist=no
1078     fi
1079     rm -rf conftest*
1080 ])
1081 if test "$fp_cv_ld_has_filelist" = yes; then
1082     LdHasFilelist=YES
1083 else
1084     LdHasFilelist=NO
1085 fi
1086 AC_SUBST([LdHasFilelist])
1087 ])# FP_PROG_LD_FILELIST
1088
1089
1090 # FP_PROG_AR
1091 # ----------
1092 # Sets fp_prog_ar to a path to ar. Exits if no ar can be found
1093 # The host normalization on Windows breaks autoconf, it no longer
1094 # thinks that target == host so it never checks the unqualified
1095 # tools for Windows. See #14274.
1096 AC_DEFUN([FP_PROG_AR],
1097 [if test -z "$fp_prog_ar"; then
1098   if test "$HostOS" = "mingw32"
1099   then
1100     AC_PATH_PROG([fp_prog_ar], [ar])
1101     if test -n "$fp_prog_ar"; then
1102       fp_prog_ar=$(cygpath -m $fp_prog_ar)
1103     fi
1104   else
1105     AC_CHECK_TARGET_TOOL([fp_prog_ar], [ar])
1106   fi
1107 fi
1108 if test -z "$fp_prog_ar"; then
1109   AC_MSG_ERROR([cannot find ar in your PATH, no idea how to make a library])
1110 fi
1111 ])# FP_PROG_AR
1112
1113
1114 # FP_PROG_AR_IS_GNU
1115 # -----------------
1116 # Sets fp_prog_ar_is_gnu to yes or no, depending on whether it is GNU ar or not.
1117 AC_DEFUN([FP_PROG_AR_IS_GNU],
1118 [AC_REQUIRE([FP_PROG_AR])
1119 AC_CACHE_CHECK([whether $fp_prog_ar is GNU ar], [fp_cv_prog_ar_is_gnu],
1120 [if "$fp_prog_ar" --version 2> /dev/null | grep "GNU" > /dev/null 2>&1; then
1121   fp_cv_prog_ar_is_gnu=yes
1122 else
1123   fp_cv_prog_ar_is_gnu=no
1124 fi])
1125 fp_prog_ar_is_gnu=$fp_cv_prog_ar_is_gnu
1126 AC_SUBST([ArIsGNUAr], [`echo $fp_prog_ar_is_gnu | tr 'a-z' 'A-Z'`])
1127 ])# FP_PROG_AR_IS_GNU
1128
1129
1130 # FP_PROG_AR_SUPPORTS_ATFILE
1131 # -----------------
1132 # Sets fp_prog_ar_supports_atfile to yes or no, depending on whether
1133 # or not it supports the @file syntax
1134 AC_DEFUN([FP_PROG_AR_SUPPORTS_ATFILE],
1135 [AC_REQUIRE([FP_PROG_AR])
1136  AC_REQUIRE([FP_PROG_AR_ARGS])
1137 AC_CACHE_CHECK([whether $fp_prog_ar supports @file], [fp_cv_prog_ar_supports_atfile],
1138 [
1139 rm -f conftest*
1140 touch conftest.file
1141 echo conftest.file  > conftest.atfile
1142 echo conftest.file >> conftest.atfile
1143 "$fp_prog_ar" $fp_prog_ar_args conftest.a @conftest.atfile > /dev/null 2>&1
1144 fp_prog_ar_supports_atfile_tmp=`"$fp_prog_ar" t conftest.a 2> /dev/null | grep -c conftest.file`
1145 rm -f conftest*
1146 if test "$fp_prog_ar_supports_atfile_tmp" -eq 2
1147 then
1148   fp_cv_prog_ar_supports_atfile=yes
1149 else
1150   fp_cv_prog_ar_supports_atfile=no
1151 fi])
1152 fp_prog_ar_supports_atfile=$fp_cv_prog_ar_supports_atfile
1153 AC_SUBST([ArSupportsAtFile], [`echo $fp_prog_ar_supports_atfile | tr 'a-z' 'A-Z'`])
1154 ])# FP_PROG_AR_SUPPORTS_ATFILE
1155
1156 # FP_PROG_AR_ARGS
1157 # ---------------
1158 # Sets fp_prog_ar_args to the arguments for ar and the output variable ArCmd
1159 # to an invocation of ar including these arguments.
1160 AC_DEFUN([FP_PROG_AR_ARGS],
1161 [AC_REQUIRE([FP_PROG_AR_IS_GNU])
1162 AC_CACHE_CHECK([for ar arguments], [fp_cv_prog_ar_args],
1163 [
1164 # GNU ar needs special treatment: it appears to have problems with
1165 # object files with the same name if you use the 's' modifier, but
1166 # simple 'ar q' works fine, and doesn't need a separate ranlib.
1167 if test $fp_prog_ar_is_gnu = yes; then
1168   fp_cv_prog_ar_args="q"
1169 else
1170   touch conftest.dummy
1171   for fp_var in qclsZ qcls qcs qcl qc ; do
1172      rm -f conftest.a
1173      if "$fp_prog_ar" $fp_var conftest.a conftest.dummy > /dev/null 2> /dev/null ; then
1174        # Also check that a result was created; it seems some llvm-ar versions
1175        # exit with code zero even if they fail to parse the command line.
1176        if test -f conftest.a ; then
1177          fp_cv_prog_ar_args=$fp_var
1178          break
1179        fi
1180      fi
1181   done
1182   rm -f conftest*
1183   if test -z "$fp_cv_prog_ar_args"; then
1184     AC_MSG_ERROR([cannot figure out how to use your $fp_prog_ar])
1185   fi
1186 fi])
1187 fp_prog_ar_args=$fp_cv_prog_ar_args
1188 AC_SUBST([ArCmd], ["$fp_prog_ar"])
1189 AC_SUBST([ArArgs], ["$fp_prog_ar_args"])
1190
1191 ])# FP_PROG_AR_ARGS
1192
1193
1194 # FP_PROG_AR_NEEDS_RANLIB
1195 # -----------------------
1196 # Sets the output variable RANLIB_CMD to "ranlib" if it is needed and
1197 # found, to "true" otherwise. Sets REAL_RANLIB_CMD to the ranlib program,
1198 # even if we don't need ranlib (libffi might still need it).
1199 AC_DEFUN([FP_PROG_AR_NEEDS_RANLIB],[
1200     AC_REQUIRE([FP_PROG_AR_IS_GNU])
1201     AC_REQUIRE([FP_PROG_AR_ARGS])
1202     AC_REQUIRE([AC_PROG_CC])
1203
1204     AC_PROG_RANLIB
1205
1206     if test $fp_prog_ar_is_gnu = yes
1207     then
1208         fp_cv_prog_ar_needs_ranlib=no
1209     elif test "$TargetVendor_CPP" = "apple"
1210     then
1211         # It's quite tedious to check for Apple's crazy timestamps in
1212         # .a files, so we hardcode it.
1213         fp_cv_prog_ar_needs_ranlib=yes
1214     else
1215         case $fp_prog_ar_args in
1216         *s*)
1217             fp_cv_prog_ar_needs_ranlib=no;;
1218         *)
1219             fp_cv_prog_ar_needs_ranlib=yes;;
1220         esac
1221     fi
1222
1223     # workaround for AC_PROG_RANLIB which sets RANLIB to `:' when
1224     # ranlib is missing on the target OS. The problem is that
1225     # ghc-cabal cannot execute `:' which is a shell built-in but can
1226     # execute `true' which is usually simple program supported by the
1227     # OS.
1228     # Fixes #8795
1229     if test "$RANLIB" = ":"
1230     then
1231         RANLIB="true"
1232     fi
1233     REAL_RANLIB_CMD="$RANLIB"
1234     if test $fp_cv_prog_ar_needs_ranlib = yes
1235     then
1236         RANLIB_CMD="$RANLIB"
1237     else
1238         RANLIB_CMD="true"
1239     fi
1240     AC_SUBST([REAL_RANLIB_CMD])
1241     AC_SUBST([RANLIB_CMD])
1242 ])# FP_PROG_AR_NEEDS_RANLIB
1243
1244
1245 # FP_GCC_VERSION
1246 # -----------
1247 # Extra testing of the result AC_PROG_CC, testing the gcc version no. Sets the
1248 # output variable GccVersion.
1249 AC_DEFUN([FP_GCC_VERSION],
1250 [AC_REQUIRE([AC_PROG_CC])
1251 if test -z "$CC"
1252 then
1253   AC_MSG_ERROR([gcc is required])
1254 fi
1255 GccLT46=NO
1256 AC_CACHE_CHECK([version of gcc], [fp_cv_gcc_version],
1257 [
1258     # Be sure only to look at the first occurrence of the "version " string;
1259     # Some Apple compilers emit multiple messages containing this string.
1260     fp_cv_gcc_version="`$CC -v 2>&1 | sed -n -e '1,/version /s/.*version [[^0-9]]*\([[0-9.]]*\).*/\1/p'`"
1261     FP_COMPARE_VERSIONS([$fp_cv_gcc_version], [-lt], [4.4],
1262                         [AC_MSG_ERROR([Need at least gcc version 4.4 (4.7+ recommended)])])
1263     FP_COMPARE_VERSIONS([$fp_cv_gcc_version], [-lt], [4.6], GccLT46=YES)
1264 ])
1265 AC_SUBST([GccVersion], [$fp_cv_gcc_version])
1266 AC_SUBST(GccLT46)
1267 ])# FP_GCC_VERSION
1268
1269 dnl Check to see if the C compiler is clang or llvm-gcc
1270 dnl
1271 GccIsClang=NO
1272 AC_DEFUN([FP_CC_LLVM_BACKEND],
1273 [AC_REQUIRE([AC_PROG_CC])
1274 AC_MSG_CHECKING([whether C compiler is clang])
1275 $CC -x c /dev/null -dM -E > conftest.txt 2>&1
1276 if grep "__clang__" conftest.txt >/dev/null 2>&1; then
1277   AC_SUBST([CC_CLANG_BACKEND], [1])
1278   AC_SUBST([CC_LLVM_BACKEND], [1])
1279   GccIsClang=YES
1280   AC_MSG_RESULT([yes])
1281 else
1282   AC_MSG_RESULT([no])
1283   AC_MSG_CHECKING([whether C compiler has an LLVM back end])
1284   if grep "__llvm__" conftest.txt >/dev/null 2>&1; then
1285     AC_SUBST([CC_CLANG_BACKEND], [0])
1286     AC_SUBST([CC_LLVM_BACKEND], [1])
1287     AC_MSG_RESULT([yes])
1288   else
1289     AC_SUBST([CC_CLANG_BACKEND], [0])
1290     AC_SUBST([CC_LLVM_BACKEND], [0])
1291     AC_MSG_RESULT([no])
1292   fi
1293 fi
1294 AC_SUBST(GccIsClang)
1295
1296 rm -f conftest.txt
1297 ])
1298
1299 # FP_GCC_SUPPORTS__ATOMICS
1300 # ------------------------
1301 # Does gcc support the __atomic_* family of builtins?
1302 AC_DEFUN([FP_GCC_SUPPORTS__ATOMICS],
1303 [
1304    AC_REQUIRE([AC_PROG_CC])
1305    AC_MSG_CHECKING([whether GCC supports __atomic_ builtins])
1306    echo 'int test(int *x) { int y; __atomic_load(x, &y, __ATOMIC_SEQ_CST); return y; }' > conftest.c
1307    if $CC -c conftest.c > /dev/null 2>&1; then
1308        CONF_GCC_SUPPORTS__ATOMICS=YES
1309        AC_MSG_RESULT([yes])
1310    else
1311        CONF_GCC_SUPPORTS__ATOMICS=NO
1312        AC_MSG_RESULT([no])
1313    fi
1314    rm -f conftest.c conftest.o
1315 ])
1316
1317 # FP_GCC_SUPPORTS_NO_PIE
1318 # ----------------------
1319 # Does gcc support the -no-pie option? If so we should pass it to gcc when
1320 # joining objects since -pie may be enabled by default.
1321 AC_DEFUN([FP_GCC_SUPPORTS_NO_PIE],
1322 [
1323    AC_REQUIRE([AC_PROG_CC])
1324    AC_MSG_CHECKING([whether GCC supports -no-pie])
1325    echo 'int main() { return 0; }' > conftest.c
1326    # Some GCC versions only warn when passed an unrecognized flag.
1327    if $CC -no-pie -Werror -x c /dev/null -dM -E > conftest.txt 2>&1 && ! grep -i unrecognized conftest.txt > /dev/null 2>&1; then
1328        CONF_GCC_SUPPORTS_NO_PIE=YES
1329        AC_MSG_RESULT([yes])
1330    else
1331        CONF_GCC_SUPPORTS_NO_PIE=NO
1332        AC_MSG_RESULT([no])
1333    fi
1334    rm -f conftest.c conftest.o conftest
1335 ])
1336
1337 dnl Small feature test for perl version. Assumes PerlCmd
1338 dnl contains path to perl binary.
1339 dnl
1340 dnl (Perl versions prior to v5.6 does not contain the string "v5";
1341 dnl instead they display version strings such as "version 5.005".)
1342 dnl
1343 AC_DEFUN([FPTOOLS_CHECK_PERL_VERSION],
1344 [$PerlCmd -v >conftest.out 2>&1
1345    if grep "v5" conftest.out >/dev/null 2>&1; then
1346       :
1347    else
1348       AC_MSG_ERROR([your version of perl probably won't work, try upgrading it.])
1349    fi
1350 rm -fr conftest*
1351 ])
1352
1353
1354 # FP_CHECK_PROG(VARIABLE, PROG-TO-CHECK-FOR,
1355 #               [VALUE-IF-NOT-FOUND], [PATH], [REJECT])
1356 # -----------------------------------------------------
1357 # HACK: A small wrapper around AC_CHECK_PROG, setting VARIABLE to the full path
1358 # of PROG-TO-CHECK-FOR when found.
1359 AC_DEFUN([FP_CHECK_PROG],
1360 [AC_CHECK_PROG([$1], [$2], [$as_dir/$ac_word$ac_exec_ext], [$3], [$4], [$5])][]dnl
1361 )# FP_CHECK_PROC
1362
1363
1364 # FP_PROG_FIND
1365 # ------------
1366 # Find a non-WinDoze version of the "find" utility.
1367 AC_DEFUN([FP_PROG_FIND],
1368 [AC_PATH_PROGS([fp_prog_find], [gfind find], find)
1369 echo foo > conftest.txt
1370 $fp_prog_find conftest.txt -print > conftest.out 2>&1
1371 if grep '^conftest.txt$' conftest.out > /dev/null 2>&1 ; then
1372   # OK, looks like a real "find".
1373   FindCmd="$fp_prog_find"
1374 else
1375   # Found a poor WinDoze version of "find", ignore it.
1376   AC_MSG_WARN([$fp_prog_find looks like a non-*nix find, ignoring it])
1377   FP_CHECK_PROG([FindCmd], [find], [], [], [$fp_prog_find])
1378 fi
1379 rm -f conftest.txt conftest.out
1380 AC_SUBST([FindCmd])[]dnl
1381 ])# FP_PROG_FIND
1382
1383
1384 # FP_PROG_SORT
1385 # ------------
1386 # Find a Unix-like sort
1387 AC_DEFUN([FP_PROG_SORT],
1388 [AC_PATH_PROG([fp_prog_sort], [sort])
1389 echo conwip > conftest.txt
1390 $fp_prog_sort -f conftest.txt > conftest.out 2>&1
1391 if grep 'conwip' conftest.out > /dev/null 2>&1 ; then
1392   # The goods
1393   SortCmd="$fp_prog_sort"
1394 else
1395   # Summink else..pick next one.
1396   AC_MSG_WARN([$fp_prog_sort looks like a non-*nix sort, ignoring it])
1397   FP_CHECK_PROG([SortCmd], [sort], [], [], [$fp_prog_sort])
1398 fi
1399 rm -f conftest.txt conftest.out
1400 AC_SUBST([SortCmd])[]dnl
1401 ])# FP_PROG_SORT
1402
1403
1404 dnl
1405 dnl FPTOOLS_NOCACHE_CHECK prints a message, then sets the
1406 dnl values of the second argument to the result of running
1407 dnl the commands given by the third. It does not cache its
1408 dnl result, so it is suitable for checks which should be
1409 dnl run every time.
1410 dnl
1411 AC_DEFUN([FPTOOLS_NOCACHE_CHECK],
1412 [AC_MSG_CHECKING([$1])
1413  $3
1414  AC_MSG_RESULT([$][$2])
1415 ])
1416
1417 dnl
1418 dnl FPTOOLS_GHC_VERSION(version)
1419 dnl FPTOOLS_GHC_VERSION(major, minor [, patchlevel])
1420 dnl FPTOOLS_GHC_VERSION(version, major, minor, patchlevel)
1421 dnl
1422 dnl Test for version of installed ghc.  Uses $GHC.
1423 dnl [original version pinched from c2hs]
1424 dnl
1425 AC_DEFUN([FPTOOLS_GHC_VERSION],
1426 [FPTOOLS_NOCACHE_CHECK([version of ghc], [fptools_version_of_ghc],
1427 ["${WithGhc-ghc}" --version > conftestghc 2>&1
1428   cat conftestghc >&AS_MESSAGE_LOG_FD
1429 #Useless Use Of cat award...
1430   fptools_version_of_ghc=`cat conftestghc | sed -n -e 's/, patchlevel *\([[0-9]]\)/.\1/;s/.* version \([[0-9]][[0-9.]]*\).*/\1/p'`
1431   rm -fr conftest*
1432   if test "[$]fptools_version_of_ghc" = ""
1433   then
1434     fptools_version_of_ghc='unknown'
1435   fi
1436 fptools_version_of_ghc[_major]=`echo [$]fptools_version_of_ghc | sed -e 's/^\([[0-9]]\).*/\1/'`
1437 fptools_version_of_ghc[_minor]=`echo [$]fptools_version_of_ghc | sed -e 's/^[[0-9]]\.\([[0-9]]*\).*/\1/'`
1438 fptools_version_of_ghc[_pl]=`echo [$]fptools_version_of_ghc | sed -n -e 's/^[[0-9]]\.[[0-9]]*\.\([[0-9]]*\)/\1/p'`
1439 #
1440 if test "[$]fptools_version_of_ghc[_pl]" = ""
1441 then
1442   fptools_version_of_ghc[_all]="[$]fptools_version_of_ghc[_major].[$]fptools_version_of_ghc[_minor]"
1443   fptools_version_of_ghc[_pl]="0"
1444 else
1445   fptools_version_of_ghc[_all]="[$]fptools_version_of_ghc[_major].[$]fptools_version_of_ghc[_minor].[$]fptools_version_of_ghc[_pl]"
1446 fi
1447 #
1448 ifelse($#, [1], [dnl
1449 [$1]="[$]fptools_version_of_ghc[_all]"
1450 ], $#, [2], [dnl
1451 [$1]="[$]fptools_version_of_ghc[_major]"
1452 [$2]="[$]fptools_version_of_ghc[_minor]"
1453 ], $#, [3], [dnl
1454 [$1]="[$]fptools_version_of_ghc[_major]"
1455 [$2]="[$]fptools_version_of_ghc[_minor]"
1456 [$3]="[$]fptools_version_of_ghc[_pl]"
1457 ], $#, [4], [dnl
1458 [$1]="[$]fptools_version_of_ghc[_all]"
1459 [$2]="[$]fptools_version_of_ghc[_major]"
1460 [$3]="[$]fptools_version_of_ghc[_minor]"
1461 [$4]="[$]fptools_version_of_ghc[_pl]"
1462 ])
1463 ])
1464 ])dnl
1465
1466
1467 # FP_CHECK_FUNC(FUNCTION, PROLOGUE, BODY, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
1468 # ---------------------------------------------------------------------------------
1469 # A variant of AC_CHECK_FUNCS, limited to a single FUNCTION, but with the
1470 # additional flexibility of specifying the PROLOGUE and BODY.
1471 AC_DEFUN([FP_CHECK_FUNC],
1472 [AS_VAR_PUSHDEF([fp_func], [fp_cv_func_$1])dnl
1473 AC_CACHE_CHECK([for $1], fp_func,
1474 [AC_LINK_IFELSE([AC_LANG_PROGRAM([$2], [$3])],
1475                 [AS_VAR_SET(fp_func, yes)],
1476                 [AS_VAR_SET(fp_func, no)])])
1477 AS_IF([test AS_VAR_GET(fp_func) = yes],
1478       [AC_DEFINE(AS_TR_CPP(HAVE_$1), [1],
1479                 [Define to 1 if you have the `]$1[' function.]) $4],
1480       [$5])dnl
1481 AS_VAR_POPDEF([fp_func])dnl
1482 ])# FP_CHECK_FUNC
1483
1484 # FP_PROG_GHC_PKG
1485 # ----------------
1486 # Try to find a ghc-pkg matching the ghc mentioned in the environment variable
1487 # WithGhc. Sets the output variable GhcPkgCmd.
1488 AC_DEFUN([FP_PROG_GHC_PKG],
1489 [AC_CACHE_CHECK([for ghc-pkg matching $WithGhc], fp_cv_matching_ghc_pkg,
1490 [
1491 # If we are told to use ghc-stage2, then we're using an in-tree
1492 # compiler. In this case, we just want ghc-pkg, not ghc-pkg-stage2,
1493 # so we sed off -stage[0-9]$. However, if we are told to use
1494 # ghc-6.12.1 then we want to use ghc-pkg-6.12.1, so we keep any
1495 # other suffix.
1496 fp_ghc_pkg_guess=`echo "$WithGhc" | sed -e 's/-stage@<:@0-9@:>@$//' -e 's,ghc\(@<:@^/\\@:>@*\)$,ghc-pkg\1,'`
1497 if "$fp_ghc_pkg_guess" list > /dev/null 2>&1; then
1498   fp_cv_matching_ghc_pkg=$fp_ghc_pkg_guess
1499 else
1500   AC_MSG_ERROR([Cannot find matching ghc-pkg])
1501 fi])
1502 GhcPkgCmd=$fp_cv_matching_ghc_pkg
1503 AC_SUBST([GhcPkgCmd])
1504 ])# FP_PROG_GHC_PKG
1505
1506
1507 # FP_GCC_EXTRA_FLAGS
1508 # ------------------
1509 # Determine which extra flags we need to pass gcc when we invoke it
1510 # to compile .hc code.
1511 #
1512 # -fwrapv is needed for gcc to emit well-behaved code in the presence of
1513 # integer wrap around. (Trac #952)
1514 #
1515 AC_DEFUN([FP_GCC_EXTRA_FLAGS],
1516 [AC_REQUIRE([FP_GCC_VERSION])
1517 AC_CACHE_CHECK([for extra options to pass gcc when compiling via C], [fp_cv_gcc_extra_opts],
1518 [fp_cv_gcc_extra_opts=
1519  FP_COMPARE_VERSIONS([$fp_cv_gcc_version], [-ge], [3.4],
1520   [fp_cv_gcc_extra_opts="$fp_cv_gcc_extra_opts -fwrapv"],
1521   [])
1522  FP_COMPARE_VERSIONS([$fp_cv_gcc_version], [-ge], [4.0],
1523   [fp_cv_gcc_extra_opts="$fp_cv_gcc_extra_opts -fno-builtin"],
1524   [])
1525 ])
1526 AC_SUBST([GccExtraViaCOpts],$fp_cv_gcc_extra_opts)
1527 ])
1528
1529
1530 # FP_SETUP_PROJECT_VERSION
1531 # ---------------------
1532 AC_DEFUN([FP_SETUP_PROJECT_VERSION],
1533 [
1534 if test "$RELEASE" = "NO"; then
1535     AC_MSG_CHECKING([for GHC version date])
1536     if test -f VERSION_DATE; then
1537         PACKAGE_VERSION=${PACKAGE_VERSION}.`cat VERSION_DATE`
1538         AC_MSG_RESULT(given $PACKAGE_VERSION)
1539     elif test -d .git; then
1540         changequote(, )dnl
1541         ver_posixtime=`git log -1 --pretty=format:%ct`
1542         ver_date=`perl -MPOSIX -e "print strftime('%Y%m%d', gmtime($ver_posixtime));"`
1543         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
1544         changequote([, ])dnl
1545                 AC_MSG_ERROR([failed to detect version date: check that git and perl are in your path])
1546         fi
1547         PACKAGE_VERSION=${PACKAGE_VERSION}.$ver_date
1548         AC_MSG_RESULT(inferred $PACKAGE_VERSION)
1549     elif test -f VERSION; then
1550         PACKAGE_VERSION=`cat VERSION`
1551         AC_MSG_RESULT(given $PACKAGE_VERSION)
1552     else
1553         AC_MSG_WARN([cannot determine snapshot version: no .git directory and no VERSION file])
1554         dnl We'd really rather this case didn't happen, but it might
1555         dnl do (in particular, people using lndir trees may find that
1556         dnl the build system can't find any other date). If it does
1557         dnl happen, then we use the current date.
1558         dnl This way we get some idea about how recent a build is.
1559         dnl It also means that packages built for 2 different builds
1560         dnl will probably use different version numbers, so things are
1561         dnl less likely to go wrong.
1562         PACKAGE_VERSION=${PACKAGE_VERSION}.`date +%Y%m%d`
1563     fi
1564 fi
1565
1566     AC_MSG_CHECKING([for GHC Git commit id])
1567     if test -e .git; then
1568         git_commit_id=`git rev-parse HEAD`
1569         if test -n "$git_commit_id" 2>&1 >/dev/null; then true; else
1570             AC_MSG_ERROR([failed to detect revision: check that git is in your path])
1571         fi
1572         PACKAGE_GIT_COMMIT_ID=$git_commit_id
1573         AC_MSG_RESULT(inferred $PACKAGE_GIT_COMMIT_ID)
1574     elif test -f GIT_COMMIT_ID; then
1575         PACKAGE_GIT_COMMIT_ID=`cat GIT_COMMIT_ID`
1576         AC_MSG_RESULT(given $PACKAGE_GIT_COMMIT_ID)
1577     else
1578         AC_MSG_WARN([cannot determine snapshot revision: no .git directory and no 'GIT_COMMIT_ID' file])
1579         PACKAGE_GIT_COMMIT_ID="0000000000000000000000000000000000000000"
1580     fi
1581
1582
1583 # Some renamings
1584 AC_SUBST([ProjectName], [$PACKAGE_NAME])
1585 AC_SUBST([ProjectVersion], [$PACKAGE_VERSION])
1586 AC_SUBST([ProjectGitCommitId], [$PACKAGE_GIT_COMMIT_ID])
1587
1588 # Split PACKAGE_VERSION into (possibly empty) parts
1589 VERSION_MAJOR=`echo $PACKAGE_VERSION | sed 's/^\(@<:@^.@:>@*\)\(\.\{0,1\}\(.*\)\)$/\1'/`
1590 VERSION_TMP=`echo $PACKAGE_VERSION | sed 's/^\(@<:@^.@:>@*\)\(\.\{0,1\}\(.*\)\)$/\3'/`
1591 VERSION_MINOR=`echo $VERSION_TMP | sed 's/^\(@<:@^.@:>@*\)\(\.\{0,1\}\(.*\)\)$/\1'/`
1592 ProjectPatchLevel=`echo $VERSION_TMP | sed 's/^\(@<:@^.@:>@*\)\(\.\{0,1\}\(.*\)\)$/\3'/`
1593
1594 # Calculate project version as an integer, using 2 digits for minor version
1595 case $VERSION_MINOR in
1596   ?) ProjectVersionInt=${VERSION_MAJOR}0${VERSION_MINOR} ;;
1597   ??) ProjectVersionInt=${VERSION_MAJOR}${VERSION_MINOR} ;;
1598   *) AC_MSG_ERROR([bad minor version in $PACKAGE_VERSION]) ;;
1599 esac
1600 AC_SUBST([ProjectVersionInt])
1601
1602 # The project patchlevel is zero unless stated otherwise
1603 test -z "$ProjectPatchLevel" && ProjectPatchLevel=0
1604
1605 # Save split version of ProjectPatchLevel
1606 ProjectPatchLevel1=`echo $ProjectPatchLevel | sed 's/^\(@<:@^.@:>@*\)\(\.\{0,1\}\(.*\)\)$/\1/'`
1607 ProjectPatchLevel2=`echo $ProjectPatchLevel | sed 's/^\(@<:@^.@:>@*\)\(\.\{0,1\}\(.*\)\)$/\3/'`
1608
1609 AC_SUBST([ProjectPatchLevel1])
1610 AC_SUBST([ProjectPatchLevel2])
1611
1612 # Remove dots from the patch level; this allows us to have versions like 6.4.1.20050508
1613 ProjectPatchLevel=`echo $ProjectPatchLevel | sed 's/\.//'`
1614
1615 AC_SUBST([ProjectPatchLevel])
1616
1617 # The version of the GHC package changes every day, since the
1618 # patchlevel is the current date.  We don't want to force
1619 # recompilation of the entire compiler when this happens, so for
1620 # GHC HEAD we omit the patchlevel from the package version number.
1621 #
1622 # The ProjectPatchLevel1 > 20000000 iff GHC HEAD. If it's for a stable
1623 # release like 7.10.1 or for a release candidate such as 7.10.1.20141224
1624 # then we don't omit the patchlevel components.
1625
1626 ProjectVersionMunged="$ProjectVersion"
1627 if test "$ProjectPatchLevel1" -gt 20000000; then
1628   ProjectVersionMunged="${VERSION_MAJOR}.${VERSION_MINOR}"
1629 fi
1630 AC_SUBST([ProjectVersionMunged])
1631 ])# FP_SETUP_PROJECT_VERSION
1632
1633 # Check for a working timer_create().  We need a pretty detailed check
1634 # here, because there exist partially-working implementations of
1635 # timer_create() in certain versions of Linux (see bug #1933).
1636 #
1637 AC_DEFUN([FP_CHECK_TIMER_CREATE],[
1638 AC_CHECK_FUNC([timer_create],[HAVE_timer_create=yes],[HAVE_timer_create=no])
1639
1640 if test "$HAVE_timer_create" = "yes"
1641 then
1642   if test "$cross_compiling" = "yes"
1643   then
1644     # We can't test timer_create when we're cross-compiling, so we
1645     # optimistiaclly assume that it actually works properly.
1646     AC_DEFINE([USE_TIMER_CREATE], 1,  [Define to 1 if we can use timer_create(CLOCK_REALTIME,...)])
1647   else
1648   AC_CACHE_CHECK([for a working timer_create(CLOCK_REALTIME)],
1649     [fptools_cv_timer_create_works],
1650     [AC_TRY_RUN([
1651 #include <stdio.h>
1652 #ifdef HAVE_STDLIB_H
1653 #include <stdlib.h>
1654 #endif
1655 #ifdef HAVE_TIME_H
1656 #include <time.h>
1657 #endif
1658 #ifdef HAVE_SIGNAL_H
1659 #include <signal.h>
1660 #endif
1661 #ifdef HAVE_UNISTD_H
1662 #include <unistd.h>
1663 #endif
1664
1665 static volatile int tock = 0;
1666 static void handler(int i)
1667 {
1668    tock = 1;
1669 }
1670
1671 static void timeout(int i)
1672 {
1673   // timer_settime() has been known to hang, so just in case
1674   // we install a 1-second timeout (see #2257)
1675   exit(99);
1676 }
1677
1678 int main(int argc, char *argv[])
1679 {
1680
1681     struct sigevent ev;
1682     timer_t timer;
1683     struct itimerspec it;
1684     struct sigaction action;
1685     int m,n,count = 0;
1686
1687     ev.sigev_notify = SIGEV_SIGNAL;
1688     ev.sigev_signo  = SIGVTALRM;
1689
1690     action.sa_handler = handler;
1691     action.sa_flags = 0;
1692     sigemptyset(&action.sa_mask);
1693     if (sigaction(SIGVTALRM, &action, NULL) == -1) {
1694         fprintf(stderr,"SIGVTALRM problem\n");
1695         exit(3);
1696     }
1697
1698     action.sa_handler = timeout;
1699     action.sa_flags = 0;
1700     sigemptyset(&action.sa_mask);
1701     if (sigaction(SIGALRM, &action, NULL) == -1) {
1702       fprintf(stderr,"SIGALRM problem\n");
1703       exit(3);
1704     }
1705     alarm(1);
1706
1707     if (timer_create(CLOCK_REALTIME, &ev, &timer) != 0) {
1708         fprintf(stderr,"No CLOCK_REALTIME timer\n");
1709         exit(2);
1710     }
1711
1712     tock = 0;
1713
1714     it.it_value.tv_sec = 0;
1715     it.it_value.tv_nsec = 1000000; // 1ms
1716     it.it_interval = it.it_value;
1717     if (timer_settime(timer, 0, &it, NULL) != 0) {
1718         fprintf(stderr,"settime problem\n");
1719         exit(4);
1720     }
1721
1722     // some environments have coarse scheduler/timer granularity of ~10ms and worse
1723     usleep(100000); // 100ms
1724
1725     if (!tock) {
1726         fprintf(stderr,"no CLOCK_REALTIME signal\n");
1727         exit(5);
1728     }
1729
1730     timer_delete(timer);
1731
1732     exit(0);
1733 }
1734      ],
1735      [fptools_cv_timer_create_works=yes],
1736      [fptools_cv_timer_create_works=no])
1737   ])
1738 case $fptools_cv_timer_create_works in
1739     yes) AC_DEFINE([USE_TIMER_CREATE], 1,
1740                    [Define to 1 if we can use timer_create(CLOCK_REALTIME,...)]);;
1741 esac
1742   fi
1743 fi
1744 ])
1745
1746 # FP_ICONV
1747 # -------------
1748 AC_DEFUN([FP_ICONV],
1749 [
1750   dnl--------------------------------------------------------------------
1751   dnl * Deal with arguments telling us iconv is somewhere odd
1752   dnl--------------------------------------------------------------------
1753
1754   dnl Note: ICONV_LIB_DIRS and ICONV_INCLUDE_DIRS are not predefined
1755   dnl to the empty string to allow them to be overridden from the
1756   dnl environment.
1757
1758   AC_ARG_WITH([iconv-includes],
1759     [AC_HELP_STRING([--with-iconv-includes],
1760       [directory containing iconv.h])],
1761       [ICONV_INCLUDE_DIRS=$withval])
1762
1763   AC_ARG_WITH([iconv-libraries],
1764     [AC_HELP_STRING([--with-iconv-libraries],
1765       [directory containing iconv library])],
1766       [ICONV_LIB_DIRS=$withval])
1767
1768   AC_SUBST(ICONV_INCLUDE_DIRS)
1769   AC_SUBST(ICONV_LIB_DIRS)
1770 ])# FP_ICONV
1771
1772 # FP_GMP
1773 # -------------
1774 AC_DEFUN([FP_GMP],
1775 [
1776   dnl--------------------------------------------------------------------
1777   dnl * Deal with arguments telling us gmp is somewhere odd
1778   dnl--------------------------------------------------------------------
1779
1780   AC_ARG_WITH([gmp-includes],
1781     [AC_HELP_STRING([--with-gmp-includes],
1782       [directory containing gmp.h])],
1783       [GMP_INCLUDE_DIRS=$withval])
1784
1785   AC_ARG_WITH([gmp-libraries],
1786     [AC_HELP_STRING([--with-gmp-libraries],
1787       [directory containing gmp library])],
1788       [GMP_LIB_DIRS=$withval])
1789
1790   AC_SUBST(GMP_INCLUDE_DIRS)
1791   AC_SUBST(GMP_LIB_DIRS)
1792 ])# FP_GMP
1793
1794 # FP_CURSES
1795 # -------------
1796 AC_DEFUN([FP_CURSES],
1797 [
1798   dnl--------------------------------------------------------------------
1799   dnl * Deal with arguments telling us curses is somewhere odd
1800   dnl--------------------------------------------------------------------
1801
1802   AC_ARG_WITH([curses-libraries],
1803     [AC_HELP_STRING([--with-curses-libraries],
1804       [directory containing curses libraries])],
1805       [CURSES_LIB_DIRS=$withval])
1806
1807   AC_SUBST(CURSES_INCLUDE_DIRS)
1808   AC_SUBST(CURSES_LIB_DIRS)
1809 ])# FP_CURSES
1810
1811 # --------------------------------------------------------------
1812 # Calculate absolute path to build tree
1813 # --------------------------------------------------------------
1814
1815 AC_DEFUN([FP_FIND_ROOT],[
1816 AC_MSG_CHECKING(for path to top of build tree)
1817     if test "$windows" = YES
1818     then
1819       dnl Make sure this is a c:/foo/bar (mixed) style path. Some parts of
1820       dnl the build system might depend on it (such as the sed expression
1821       dnl `"s|$(TOP)/||i"` in addCFileDeps in rules/build-dependencies.mk).
1822       hardtop=$(cygpath -m "$(pwd)")
1823     else
1824       hardtop=$(pwd)
1825     fi
1826
1827     dnl Remove common automounter nonsense
1828     hardtop=`echo $hardtop | sed 's|^/tmp_mnt.*\(/local/.*\)$|\1|' | sed 's|^/tmp_mnt/|/|'`
1829
1830     if ! test -d "$hardtop"; then
1831         AC_MSG_ERROR([cannot determine current directory])
1832     fi
1833
1834     dnl We don't support building in directories with spaces.
1835     case "$hardtop" in
1836     *' '*)
1837         AC_MSG_ERROR([
1838         The build system does not support building in a directory
1839         containing space characters.
1840         Suggestion: move the build tree somewhere else.])
1841         ;;
1842     esac
1843
1844     AC_SUBST(hardtop)
1845
1846     AC_MSG_RESULT($hardtop)
1847 ])
1848
1849 # GHC_CONVERT_CPU(cpu, target_var)
1850 # --------------------------------
1851 # converts cpu from gnu to ghc naming, and assigns the result to $target_var
1852 AC_DEFUN([GHC_CONVERT_CPU],[
1853 case "$1" in
1854   aarch64*)
1855     $2="aarch64"
1856     ;;
1857   alpha*)
1858     $2="alpha"
1859     ;;
1860   arm*)
1861     $2="arm"
1862     ;;
1863   hppa1.1*)
1864     $2="hppa1_1"
1865     ;;
1866   hppa*)
1867     $2="hppa"
1868     ;;
1869   i386|i486|i586|i686)
1870     $2="i386"
1871     ;;
1872   ia64)
1873     $2="ia64"
1874     ;;
1875   m68k*)
1876     $2="m68k"
1877     ;;
1878   mipseb*)
1879     $2="mipseb"
1880     ;;
1881   mipsel*)
1882     $2="mipsel"
1883     ;;
1884   mips*)
1885     $2="mips"
1886     ;;
1887   nios2)
1888     $2="nios2"
1889     ;;
1890   powerpc64le*)
1891     $2="powerpc64le"
1892     ;;
1893   powerpc64*)
1894     $2="powerpc64"
1895     ;;
1896   powerpc*)
1897     $2="powerpc"
1898     ;;
1899   riscv64*)
1900     $2="riscv64"
1901     ;;
1902   riscv|riscv32*)
1903     $2="riscv32"
1904     ;;
1905   rs6000)
1906     $2="rs6000"
1907     ;;
1908   s390x*)
1909     $2="s390x"
1910     ;;
1911   s390*)
1912     $2="s390"
1913     ;;
1914   sh4)
1915     $2="sh4"
1916     ;;
1917   sparc64*)
1918     $2="sparc64"
1919     ;;
1920   sparc*)
1921     $2="sparc"
1922     ;;
1923   vax)
1924     $2="vax"
1925     ;;
1926   x86_64|amd64)
1927     $2="x86_64"
1928     ;;
1929   *)
1930     echo "Unknown CPU $1"
1931     exit 1
1932     ;;
1933   esac
1934 ])
1935
1936 # GHC_LLVM_TARGET(target_cpu, target_vendor, target_os, llvm_target_var)
1937 # --------------------------------
1938 # converts the canonicalized target into someting llvm can understand
1939 AC_DEFUN([GHC_LLVM_TARGET], [
1940   case "$2-$3" in
1941     *-freebsd*-gnueabihf)
1942       llvm_target_vendor="unknown"
1943       llvm_target_os="freebsd-gnueabihf"
1944       ;;
1945     hardfloat-*eabi)
1946       llvm_target_vendor="unknown"
1947       llvm_target_os="$3""hf"
1948       ;;
1949     *-mingw32|*-mingw64|*-msys)
1950       llvm_target_vendor="unknown"
1951       llvm_target_os="windows"
1952       ;;
1953     # retain any android and gnueabi linux flavours
1954     # for the LLVM Target. Otherwise these would be
1955     # turned into just `-linux` and fail to be found
1956     # in the `llvm-targets` file.
1957     *-android*|*-gnueabi*)
1958       GHC_CONVERT_VENDOR([$2],[llvm_target_vendor])
1959       llvm_target_os="$3"
1960       ;;
1961     *)
1962       GHC_CONVERT_VENDOR([$2],[llvm_target_vendor])
1963       GHC_CONVERT_OS([$3],[$1],[llvm_target_os])
1964       ;;
1965   esac
1966   $4="$1-$llvm_target_vendor-$llvm_target_os"
1967 ])
1968
1969
1970 # GHC_CONVERT_VENDOR(vendor, target_var)
1971 # --------------------------------
1972 # converts vendor from gnu to ghc naming, and assigns the result to $target_var
1973 AC_DEFUN([GHC_CONVERT_VENDOR],[
1974   case "$1" in
1975   pc|gentoo|w64) # like i686-pc-linux-gnu, i686-gentoo-freebsd8, x86_64-w64-mingw32
1976     $2="unknown"
1977     ;;
1978   softfloat) # like armv5tel-softfloat-linux-gnueabi
1979     $2="unknown"
1980     ;;
1981   hardfloat) # like armv7a-hardfloat-linux-gnueabi
1982     $2="unknown"
1983     ;;
1984   *)
1985     #pass thru by default
1986     $2="$1"
1987     ;;
1988   esac
1989 ])
1990
1991 # GHC_CONVERT_OS(os, converted_cpu, target_var)
1992 # --------------------------------
1993 # converts os from gnu to ghc naming, and assigns the result to $target_var
1994 AC_DEFUN([GHC_CONVERT_OS],[
1995     case "$1" in
1996       gnu*) # e.g. i686-unknown-gnu0.9
1997         $3="gnu"
1998         ;;
1999       # watchos and tvos are ios variants as of May 2017.
2000       ios|watchos|tvos)
2001         $3="ios"
2002         ;;
2003       linux-android*)
2004         $3="linux-android"
2005         ;;
2006       linux-*|linux)
2007         $3="linux"
2008         ;;
2009       openbsd*)
2010         $3="openbsd"
2011         ;;
2012       # As far as I'm aware, none of these have relevant variants
2013       freebsd|netbsd|dragonfly|hpux|linuxaout|kfreebsdgnu|freebsd2|mingw32|darwin|nextstep2|nextstep3|sunos4|ultrix|haiku)
2014         $3="$1"
2015         ;;
2016       msys)
2017         AC_MSG_ERROR([Building GHC using the msys toolchain is not supported; please use mingw instead. Perhaps you need to set 'MSYSTEM=MINGW64 or MINGW32?'])
2018         ;;
2019       aix*) # e.g. powerpc-ibm-aix7.1.3.0
2020         $3="aix"
2021         ;;
2022       darwin*) # e.g. aarch64-apple-darwin14
2023         $3="darwin"
2024         ;;
2025       solaris2*)
2026         $3="solaris2"
2027         ;;
2028       freebsd*) # like i686-gentoo-freebsd7
2029                 #      i686-gentoo-freebsd8
2030                 #      i686-gentoo-freebsd8.2
2031         $3="freebsd"
2032         ;;
2033       nto-qnx*)
2034         $3="nto-qnx"
2035         ;;
2036       *)
2037         echo "Unknown OS $1"
2038         exit 1
2039         ;;
2040       esac
2041 ])
2042
2043 # BOOTSTRAPPING_GHC_INFO_FIELD
2044 # --------------------------------
2045 # Set the variable $1 to the value of the ghc --info field $2.
2046 AC_DEFUN([BOOTSTRAPPING_GHC_INFO_FIELD],[
2047 $1=`"$WithGhc" --info | grep "^ ,(\"$2\"," | sed -e 's/.*","//' -e 's/")$//'`
2048 tmp=${$1#\$topdir/}
2049 if test "${$1}" != "$tmp"
2050 then
2051     topdir=`"$WithGhc" --print-libdir | sed 's#\\\\#/#g'`
2052     $1="$topdir/$tmp"
2053 fi
2054 AC_SUBST($1)
2055 ])
2056
2057 # LIBRARY_VERSION(lib, [dir])
2058 # --------------------------------
2059 # Gets the version number of a library.
2060 # If $1 is ghc-prim, then we define LIBRARY_ghc_prim_VERSION as 1.2.3
2061 # $2 points to the directory under libraries/
2062 AC_DEFUN([LIBRARY_VERSION],[
2063 dir=m4_default([$2],[$1])
2064 LIBRARY_[]translit([$1], [-], [_])[]_VERSION=`grep -i "^version:" libraries/${dir}/$1.cabal | sed "s/.* //"`
2065 AC_SUBST(LIBRARY_[]translit([$1], [-], [_])[]_VERSION)
2066 ])
2067
2068 # XCODE_VERSION()
2069 # --------------------------------
2070 # Gets the version number of XCode, if on a Mac
2071 AC_DEFUN([XCODE_VERSION],[
2072     if test "$TargetVendor_CPP" = "apple"
2073     then
2074         AC_MSG_CHECKING(XCode version)
2075         XCodeVersion=`xcodebuild -version | grep Xcode | sed "s/Xcode //"`
2076         # Old XCode versions don't actually give the XCode version
2077         if test "$XCodeVersion" = ""
2078         then
2079             AC_MSG_RESULT(not found (too old?))
2080             XCodeVersion1=0
2081             XCodeVersion2=0
2082         else
2083             AC_MSG_RESULT($XCodeVersion)
2084             XCodeVersion1=`echo "$XCodeVersion" | sed 's/\..*//'`
2085             changequote(, )dnl
2086             XCodeVersion2=`echo "$XCodeVersion" | sed 's/[^.]*\.\([^.]*\).*/\1/'`
2087             changequote([, ])dnl
2088             AC_MSG_NOTICE(XCode version component 1: $XCodeVersion1)
2089             AC_MSG_NOTICE(XCode version component 2: $XCodeVersion2)
2090         fi
2091     fi
2092 ])
2093
2094 # FIND_LLVM_PROG()
2095 # --------------------------------
2096 # Find where the llvm tools are. We have a special function to handle when they
2097 # are installed with a version suffix (e.g., llc-3.1).
2098 #
2099 # $1 = the variable to set
2100 # $2 = the command to look for
2101 # $3 = the version of the command to look for
2102 #
2103 AC_DEFUN([FIND_LLVM_PROG],[
2104     # Test for program with and without version name.
2105     AC_CHECK_TOOLS([$1], [$2-$3 $2], [:])
2106     if test "$$1" != ":"; then
2107         AC_MSG_CHECKING([$$1 is version $3])
2108         if test `$$1 --version | grep -c "version $3"` -gt 0 ; then
2109             AC_MSG_RESULT(yes)
2110         else
2111             AC_MSG_RESULT(no)
2112             $1=""
2113         fi
2114     else
2115         $1=""
2116     fi
2117 ])
2118
2119 # CHECK_LD_COPY_BUG()
2120 # -------------------
2121 # Check for binutils bug #16177 present in some versions of the bfd ld
2122 # implementation affecting ARM relocations.
2123 # https://sourceware.org/bugzilla/show_bug.cgi?id=16177
2124 #
2125 # $1 = the platform
2126 #
2127 AC_DEFUN([CHECK_LD_COPY_BUG],[
2128     case $1 in
2129       arm*linux*)
2130         AC_CHECK_TARGET_TOOL([READELF], [readelf])
2131         AC_CHECK_TARGET_TOOL([AS], [as])
2132         AC_MSG_CHECKING([for ld bug 16177])
2133         cat >actest.s <<-EOF
2134           .globl _start
2135           .p2align 4
2136         _start:
2137           bkpt
2138
2139         .data
2140           .globl data_object
2141         object_reference:
2142           .long data_object
2143           .size object_reference, 4
2144 EOF
2145
2146         cat >aclib.s <<-EOF
2147           .data
2148           .globl data_object
2149           .type data_object, %object
2150           .size data_object, 4
2151         data_object:
2152             .long 123
2153 EOF
2154
2155         $AS -o aclib.o aclib.s
2156         $LD -shared -o aclib.so aclib.o
2157
2158         $AS -o actest.o actest.s
2159         $LD -o actest actest.o aclib.so
2160
2161         if $READELF -r actest | grep R_ARM_COPY > /dev/null; then
2162             AC_MSG_RESULT([affected])
2163             AC_MSG_ERROR(
2164               [Your linker is affected by binutils #16177, which
2165                critically breaks linkage of GHC objects. Please either upgrade
2166                binutils or supply a different linker with the LD environment
2167                variable.])
2168         else
2169             AC_MSG_RESULT([unaffected])
2170         fi
2171
2172         rm -f aclib.s aclib.o aclib.so actest.s actest.o actest
2173         ;;
2174       *)
2175         ;;
2176     esac
2177 ])
2178
2179 # FIND_GHC_BOOTSTRAP_PROG()
2180 # --------------------------------
2181 # Parse the bootstrap GHC's compier settings file for the location of things
2182 # like the `llc` and `opt` commands.
2183 #
2184 # $1 = the variable to set
2185 # $2 = The bootstrap compiler.
2186 # $3 = The string to grep for to find the correct line.
2187 #
2188 AC_DEFUN([FIND_GHC_BOOTSTRAP_PROG],[
2189     BootstrapTmpCmd=`grep $3 $($2 --print-libdir)/settings 2>/dev/null | sed 's/.*", "//;s/".*//'`
2190     if test -n "$BootstrapTmpCmd" && test `basename $BootstrapTmpCmd` = $BootstrapTmpCmd ; then
2191         AC_PATH_PROG([$1], [$BootstrapTmpCmd], "")
2192     else
2193         $1=$BootstrapTmpCmd
2194     fi
2195 ])
2196
2197
2198 AC_DEFUN([MAYBE_OVERRIDE_STAGE0],[
2199   if test ! -z "$With_$1" -a "$CrossCompiling" != "YES"; then
2200       AC_MSG_NOTICE([Not cross-compiling, so --with-$1 also sets $2])
2201       $2=$With_$1
2202   fi
2203 ])
2204
2205
2206 # FP_CPP_CMD_WITH_ARGS()
2207 # ----------------------
2208 # sets CPP command and its arguments
2209 #
2210 # $1 = the variable to set to CPP command
2211 # $2 = the variable to set to CPP command arguments
2212
2213 AC_DEFUN([FP_CPP_CMD_WITH_ARGS],[
2214 dnl ** what cpp to use?
2215 dnl --------------------------------------------------------------
2216 AC_ARG_WITH(hs-cpp,
2217 [AC_HELP_STRING([--with-hs-cpp=ARG],
2218       [Path to the (C) preprocessor for Haskell files [default=autodetect]])],
2219 [
2220     if test "$HostOS" = "mingw32"
2221     then
2222         AC_MSG_WARN([Request to use $withval will be ignored])
2223     else
2224         HS_CPP_CMD=$withval
2225     fi
2226 ],
2227 [
2228
2229     # We can't use $CPP here, since HS_CPP_CMD is expected to be a single
2230     # command (no flags), and AC_PROG_CPP defines CPP as "/usr/bin/gcc -E".
2231     HS_CPP_CMD=$CC
2232
2233     SOLARIS_GCC_CPP_BROKEN=NO
2234     SOLARIS_FOUND_GOOD_CPP=NO
2235     case $host in
2236         i386-*-solaris2)
2237         GCC_MAJOR_MINOR=`$CC --version|grep "gcc (GCC)"|cut -d ' ' -f 3-3|cut -d '.' -f 1-2`
2238         if test "$GCC_MAJOR_MINOR" != "3.4"; then
2239           # this is not 3.4.x release so with broken CPP
2240           SOLARIS_GCC_CPP_BROKEN=YES
2241         fi
2242         ;;
2243     esac
2244
2245     if test "$SOLARIS_GCC_CPP_BROKEN" = "YES"; then
2246       # let's try to find if GNU C 3.4.x is installed
2247       if test -x /usr/sfw/bin/gcc; then
2248         # something executable is in expected path so let's
2249         # see if it's really GNU C
2250         NEW_GCC_MAJOR_MINOR=`/usr/sfw/bin/gcc --version|grep "gcc (GCC)"|cut -d ' ' -f 3-3|cut -d '.' -f 1-2`
2251         if test "$NEW_GCC_MAJOR_MINOR" = "3.4"; then
2252           # this is GNU C 3.4.x which provides non-broken CPP on Solaris
2253           # let's use it as CPP then.
2254           HS_CPP_CMD=/usr/sfw/bin/gcc
2255           SOLARIS_FOUND_GOOD_CPP=YES
2256         fi
2257       fi
2258       if test "$SOLARIS_FOUND_GOOD_CPP" = "NO"; then
2259         AC_MSG_WARN([Your GNU C provides broken CPP and you do not have GNU C 3.4.x installed.])
2260         AC_MSG_WARN([Please install GNU C 3.4.x to solve this issue. It will be used as CPP only.])
2261       fi
2262     fi
2263 ]
2264 )
2265
2266
2267
2268 dnl ** what cpp flags to use?
2269 dnl -----------------------------------------------------------
2270 AC_ARG_WITH(hs-cpp-flags,
2271   [AC_HELP_STRING([--with-hs-cpp-flags=ARG],
2272       [Flags to the (C) preprocessor for Haskell files [default=autodetect]])],
2273   [
2274       if test "$HostOS" = "mingw32"
2275       then
2276           AC_MSG_WARN([Request to use $withval will be ignored])
2277       else
2278           HS_CPP_ARGS=$withval
2279       fi
2280   ],
2281 [
2282   $HS_CPP_CMD -x c /dev/null -dM -E > conftest.txt 2>&1
2283   if grep "__clang__" conftest.txt >/dev/null 2>&1; then
2284     HS_CPP_ARGS="-E -undef -traditional -Wno-invalid-pp-token -Wno-unicode -Wno-trigraphs"
2285   else
2286       $HS_CPP_CMD  -v > conftest.txt 2>&1
2287       if  grep "gcc" conftest.txt >/dev/null 2>&1; then
2288           HS_CPP_ARGS="-E -undef -traditional"
2289         else
2290           $HS_CPP_CMD  --version > conftest.txt 2>&1
2291           if grep "cpphs" conftest.txt >/dev/null 2>&1; then
2292             HS_CPP_ARGS="--cpp -traditional"
2293           else
2294             AC_MSG_WARN([configure can't recognize your CPP program, you may need to set --with-hs-cpp-flags=FLAGS explicitly])
2295             HS_CPP_ARGS=""
2296           fi
2297       fi
2298   fi
2299   ]
2300 )
2301
2302 $1=$HS_CPP_CMD
2303 $2=$HS_CPP_ARGS
2304
2305 ])
2306
2307 # FP_BFD_SUPPORT()
2308 # ----------------------
2309 # whether to use libbfd for debugging RTS
2310 AC_DEFUN([FP_BFD_SUPPORT], [
2311     AC_SUBST([CabalHaveLibbfd], [False])
2312     AC_ARG_ENABLE(bfd-debug,
2313         [AC_HELP_STRING([--enable-bfd-debug],
2314               [Enable symbol resolution for -debug rts ('+RTS -Di') via binutils' libbfd [default=no]])],
2315         [
2316             # don't pollute general LIBS environment
2317             save_LIBS="$LIBS"
2318             AC_CHECK_HEADERS([bfd.h])
2319             dnl ** check whether this machine has BFD and libiberty installed (used for debugging)
2320             dnl    the order of these tests matters: bfd needs libiberty
2321             AC_CHECK_LIB(iberty, xmalloc)
2322             dnl 'bfd_init' is a rare non-macro in libbfd
2323             AC_CHECK_LIB(bfd,    bfd_init)
2324
2325             AC_TRY_LINK([#include <bfd.h>],
2326                         [
2327                                 /* mimic our rts/Printer.c */
2328                                 bfd* abfd;
2329                                 const char * name;
2330                                 char **matching;
2331
2332                                 name = "some.executable";
2333                                 bfd_init();
2334                                 abfd = bfd_openr(name, "default");
2335                                 bfd_check_format_matches (abfd, bfd_object, &matching);
2336                                 {
2337                                     long storage_needed;
2338                                     storage_needed = bfd_get_symtab_upper_bound (abfd);
2339                                 }
2340                                 {
2341                                     asymbol **symbol_table;
2342                                     long number_of_symbols;
2343                                     symbol_info info;
2344
2345                                     number_of_symbols = bfd_canonicalize_symtab (abfd, symbol_table);
2346                                     bfd_get_symbol_info(abfd,symbol_table[0],&info);
2347                                 }
2348                         ],
2349                         [AC_SUBST([CabalHaveLibbfd], [True])],dnl bfd seems to work
2350                         [AC_MSG_ERROR([can't use 'bfd' library])])
2351             LIBS="$save_LIBS"
2352         ]
2353     )
2354 ])
2355
2356
2357 # FP_CC_LINKER_FLAG_TRY()
2358 # --------------------
2359 # Try a particular linker to see whether we can use it. In particular, determine
2360 # whether we can convince gcc to use it via a -fuse-ld=... flag.
2361 #
2362 # $1 = the name of the linker to try
2363 # $2 = the variable to set with the appropriate GHC flag if the linker is
2364 # found to be usable
2365 AC_DEFUN([FP_CC_LINKER_FLAG_TRY], [
2366     AC_MSG_CHECKING([whether C compiler supports -fuse-ld=$1])
2367     echo 'int main(void) {return 0;}' > conftest.c
2368     if $CC -o conftest.o -fuse-ld=$1 conftest.c > /dev/null 2>&1
2369     then
2370         $2="-fuse-ld=$1"
2371         AC_MSG_RESULT([yes])
2372     else
2373         AC_MSG_RESULT([no])
2374     fi
2375     rm -f conftest.c conftest.o
2376 ])
2377
2378 # FIND_LD
2379 # ---------
2380 # Find the version of `ld` to use and figure out how to get gcc to use it for
2381 # linking (if --enable-ld-override is enabled). This is used in both in the top
2382 # level configure.ac and in distrib/configure.ac.in.
2383 #
2384 # $1 = the platform
2385 # $2 = the variable to set with GHC options to configure gcc to use the chosen linker
2386 #
2387 AC_DEFUN([FIND_LD],[
2388     AC_ARG_ENABLE(ld-override,
2389       [AC_HELP_STRING([--disable-ld-override],
2390         [Prevent GHC from overriding the default linker used by gcc. If ld-override is enabled GHC will try to tell gcc to use whichever linker is selected by the LD environment variable. [default=override enabled]])],
2391       [],
2392       [enable_ld_override=yes])
2393
2394     find_ld() {
2395         # Make sure the user didn't specify LD manually.
2396         if test "z$LD" != "z"; then
2397             AC_CHECK_TARGET_TOOL([LD], [ld])
2398             LD_NO_GOLD=$LD
2399             return
2400         fi
2401
2402         # Manually iterate over possible names since we want to ensure that, e.g.,
2403         # if ld.lld is installed but gcc doesn't support -fuse-ld=lld, that we
2404         # then still try ld.gold and -fuse-ld=gold.
2405         for possible_ld in ld.lld ld.gold ld; do
2406             TmpLd="" # In case the user set LD
2407             AC_CHECK_TARGET_TOOL([TmpLd], [$possible_ld])
2408             if test "x$TmpLd" = "x"; then continue; fi
2409
2410             out=`$TmpLd --version`
2411             LD_NO_GOLD=$TmpLd
2412             case $out in
2413               "GNU ld"*)
2414                    FP_CC_LINKER_FLAG_TRY(bfd, $2) ;;
2415               "GNU gold"*)
2416                    FP_CC_LINKER_FLAG_TRY(gold, $2)
2417                    LD_NO_GOLD=ld
2418                    ;;
2419               "LLD"*)
2420                    FP_CC_LINKER_FLAG_TRY(lld, $2) ;;
2421               *) AC_MSG_NOTICE([unknown linker version $out]) ;;
2422             esac
2423             if test "z$$2" = "z"; then
2424                 AC_MSG_NOTICE([unable to convince '$CC' to use linker '$TmpLd'])
2425                 # a terrible hack to prevent autoconf from caching the previous
2426                 # AC_CHECK_TARGET_TOOL result since next time we'll be looking
2427                 # for another ld variant.
2428                 $as_unset ac_cv_prog_ac_ct_TmpLd
2429             else
2430                 LD="$TmpLd"
2431                 return
2432             fi
2433         done
2434
2435         # Fallback
2436         AC_CHECK_TARGET_TOOL([LD], [ld])
2437         # This isn't entirely safe since $LD may have been discovered to be
2438         # ld.gold, but what else can we do?
2439         if test "x$LD_NO_GOLD" = "x"; then LD_NO_GOLD=$LD; fi
2440     }
2441
2442     if test "x$enable_ld_override" = "xyes"; then
2443         find_ld
2444     else
2445         AC_CHECK_TARGET_TOOL([LD], [ld])
2446         if test "x$LD_NO_GOLD" = "x"; then LD_NO_GOLD=$LD; fi
2447     fi
2448
2449     CHECK_LD_COPY_BUG([$1])
2450 ])
2451
2452 # LocalWords:  fi