aclocal.m4 62.1 KB
Newer Older
1
2
3
4
# Extra autoconf macros for the Glasgow fptools
#
# To be a good autoconf citizen, names of local macros have prefixed with FP_ to
# ensure we don't clash with any pre-supplied autoconf ones.
sof's avatar
sof committed
5

6

7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
AC_DEFUN([GHC_SELECT_FILE_EXTENSIONS],
[
    $2=''
    $3='.so'
    case $1 in
    *-unknown-cygwin32)
        AC_MSG_WARN([GHC does not support the Cygwin target at the moment])
        AC_MSG_WARN([I'm assuming you wanted to build for i386-unknown-mingw32])
        exit 1
        ;;
    *-unknown-mingw32)
        windows=YES
        $2='.exe'
        $3='.dll'
        ;;
    i386-apple-darwin|powerpc-apple-darwin)
        $3='.dylib'
        ;;
    x86_64-apple-darwin)
        $3='.dylib'
        ;;
28
    arm-apple-darwin10|i386-apple-darwin11)
29
30
31
32
33
34
        $2='.a'
        $3='.dylib'
        ;;
    esac
])

35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# FPTOOLS_SET_PLATFORM_VARS
# ----------------------------------
# Set the platform variables
AC_DEFUN([FPTOOLS_SET_PLATFORM_VARS],
[
    # If no argument was given for a configuration variable, then discard
    # the guessed canonical system and use the configuration of the
    # bootstrapping ghc. If an argument was given, map it from gnu format
    # to ghc format.
    #
    # For why we do it this way, see: #3637, #1717, #2951
    #
    # In bindists, we haven't called AC_CANONICAL_{BUILD,HOST,TARGET}
    # so this justs uses $bootstrap_target.

    if test "$build_alias" = ""
    then
        if test "$bootstrap_target" != ""
        then
            build=$bootstrap_target
            echo "Build platform inferred as: $build"
        else
            echo "Can't work out build platform"
            exit 1
        fi

        BuildArch=`echo "$build" | sed 's/-.*//'`
        BuildVendor=`echo "$build" | sed -e 's/.*-\(.*\)-.*/\1/'`
        BuildOS=`echo "$build" | sed 's/.*-//'`
    else
        GHC_CONVERT_CPU([$build_cpu], [BuildArch])
        GHC_CONVERT_VENDOR([$build_vendor], [BuildVendor])
67
        GHC_CONVERT_OS([$build_os], [$BuildArch], [BuildOS])
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
    fi

    if test "$host_alias" = ""
    then
        if test "$bootstrap_target" != ""
        then
            host=$bootstrap_target
            echo "Host platform inferred as: $host"
        else
            echo "Can't work out host platform"
            exit 1
        fi

        HostArch=`echo "$host" | sed 's/-.*//'`
        HostVendor=`echo "$host" | sed -e 's/.*-\(.*\)-.*/\1/'`
        HostOS=`echo "$host" | sed 's/.*-//'`
    else
        GHC_CONVERT_CPU([$host_cpu], [HostArch])
        GHC_CONVERT_VENDOR([$host_vendor], [HostVendor])
87
        GHC_CONVERT_OS([$host_os], [$HostArch], [HostOS])
88
89
90
91
    fi

    if test "$target_alias" = ""
    then
Simon Marlow's avatar
Simon Marlow committed
92
        if test "$host_alias" != ""
93
        then
Simon Marlow's avatar
Simon Marlow committed
94
95
            GHC_CONVERT_CPU([$host_cpu], [TargetArch])
            GHC_CONVERT_VENDOR([$host_vendor], [TargetVendor])
96
            GHC_CONVERT_OS([$host_os], [$TargetArch],[TargetOS])
97
        else
Simon Marlow's avatar
Simon Marlow committed
98
99
100
101
102
103
104
105
            if test "$bootstrap_target" != ""
            then
                target=$bootstrap_target
                echo "Target platform inferred as: $target"
            else
                echo "Can't work out target platform"
                exit 1
            fi
106

Simon Marlow's avatar
Simon Marlow committed
107
108
109
            TargetArch=`echo "$target" | sed 's/-.*//'`
            TargetVendor=`echo "$target" | sed -e 's/.*-\(.*\)-.*/\1/'`
            TargetOS=`echo "$target" | sed 's/.*-//'`
110
111
112
113
        fi
    else
        GHC_CONVERT_CPU([$target_cpu], [TargetArch])
        GHC_CONVERT_VENDOR([$target_vendor], [TargetVendor])
114
        GHC_CONVERT_OS([$target_os], [$TargetArch], [TargetOS])
115
    fi
116

117
118
    GHC_SELECT_FILE_EXTENSIONS([$host], [exeext_host], [soext_host])
    GHC_SELECT_FILE_EXTENSIONS([$target], [exeext_target], [soext_target])
119
120
121
122
123
124
    windows=NO
    case $host in
    *-unknown-mingw32)
        windows=YES
        ;;
    esac
125

126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
    BuildPlatform="$BuildArch-$BuildVendor-$BuildOS"
    BuildPlatform_CPP=`echo "$BuildPlatform" | sed -e 's/\./_/g' -e 's/-/_/g'`
    BuildArch_CPP=`    echo "$BuildArch"     | sed -e 's/\./_/g' -e 's/-/_/g'`
    BuildVendor_CPP=`  echo "$BuildVendor"   | sed -e 's/\./_/g' -e 's/-/_/g'`
    BuildOS_CPP=`      echo "$BuildOS"       | sed -e 's/\./_/g' -e 's/-/_/g'`

    HostPlatform="$HostArch-$HostVendor-$HostOS"
    HostPlatform_CPP=`echo "$HostPlatform" | sed -e 's/\./_/g' -e 's/-/_/g'`
    HostArch_CPP=`    echo "$HostArch"     | sed -e 's/\./_/g' -e 's/-/_/g'`
    HostVendor_CPP=`  echo "$HostVendor"   | sed -e 's/\./_/g' -e 's/-/_/g'`
    HostOS_CPP=`      echo "$HostOS"       | sed -e 's/\./_/g' -e 's/-/_/g'`

    TargetPlatform="$TargetArch-$TargetVendor-$TargetOS"
    TargetPlatform_CPP=`echo "$TargetPlatform" | sed -e 's/\./_/g' -e 's/-/_/g'`
    TargetArch_CPP=`    echo "$TargetArch"     | sed -e 's/\./_/g' -e 's/-/_/g'`
    TargetVendor_CPP=`  echo "$TargetVendor"   | sed -e 's/\./_/g' -e 's/-/_/g'`
    TargetOS_CPP=`      echo "$TargetOS"       | sed -e 's/\./_/g' -e 's/-/_/g'`

    echo "GHC build  : $BuildPlatform"
    echo "GHC host   : $HostPlatform"
    echo "GHC target : $TargetPlatform"

    AC_SUBST(BuildPlatform)
    AC_SUBST(HostPlatform)
    AC_SUBST(TargetPlatform)
    AC_SUBST(HostPlatform_CPP)
    AC_SUBST(BuildPlatform_CPP)
    AC_SUBST(TargetPlatform_CPP)

    AC_SUBST(HostArch_CPP)
    AC_SUBST(BuildArch_CPP)
    AC_SUBST(TargetArch_CPP)

    AC_SUBST(HostOS_CPP)
    AC_SUBST(BuildOS_CPP)
    AC_SUBST(TargetOS_CPP)

    AC_SUBST(HostVendor_CPP)
    AC_SUBST(BuildVendor_CPP)
    AC_SUBST(TargetVendor_CPP)

167
168
169
170
    AC_SUBST(exeext_host)
    AC_SUBST(exeext_target)
    AC_SUBST(soext_host)
    AC_SUBST(soext_target)
171
172
173
174
175
176
177
178
])


# FPTOOLS_SET_HASKELL_PLATFORM_VARS
# ----------------------------------
# Set the Haskell platform variables
AC_DEFUN([FPTOOLS_SET_HASKELL_PLATFORM_VARS],
[
179
180
    checkArch() {
        case [$]1 in
181
182
183
        i386)
            test -z "[$]2" || eval "[$]2=ArchX86"
            ;;
184
        x86_64|amd64)
185
186
187
188
189
190
191
192
193
194
195
196
197
            test -z "[$]2" || eval "[$]2=ArchX86_64"
            ;;
        powerpc)
            test -z "[$]2" || eval "[$]2=ArchPPC"
            ;;
        powerpc64)
            test -z "[$]2" || eval "[$]2=ArchPPC_64"
            ;;
        sparc)
            test -z "[$]2" || eval "[$]2=ArchSPARC"
            ;;
        arm)
            GET_ARM_ISA()
198
            test -z "[$]2" || eval "[$]2=\"ArchARM {armISA = \$ARM_ISA, armISAExt = \$ARM_ISA_EXT, armABI = \$ARM_ABI}\""
199
            ;;
200
201
202
203
204
205
206
207
208
209
        alpha)
            test -z "[$]2" || eval "[$]2=ArchAlpha"
            ;;
        mips|mipseb)
            test -z "[$]2" || eval "[$]2=ArchMipseb"
            ;;
        mipsel)
            test -z "[$]2" || eval "[$]2=ArchMipsel"
            ;;
        hppa|hppa1_1|ia64|m68k|rs6000|s390|s390x|sparc64|vax)
210
            test -z "[$]2" || eval "[$]2=ArchUnknown"
211
212
213
214
215
216
217
218
219
220
            ;;
        *)
            echo "Unknown arch [$]1"
            exit 1
            ;;
        esac
    }

    checkVendor() {
        case [$]1 in
221
        dec|unknown|hp|apple|next|sun|sgi|ibm|montavista|portbld)
222
223
224
225
226
227
228
229
230
231
            ;;
        *)
            echo "Unknown vendor [$]1"
            exit 1
            ;;
        esac
    }

    checkOS() {
        case [$]1 in
232
233
234
        linux)
            test -z "[$]2" || eval "[$]2=OSLinux"
            ;;
235
236
237
        ios)
            test -z "[$]2" || eval "[$]2=OSiOS"
            ;;
238
239
240
241
242
243
244
245
246
247
248
249
        darwin)
            test -z "[$]2" || eval "[$]2=OSDarwin"
            ;;
        solaris2)
            test -z "[$]2" || eval "[$]2=OSSolaris2"
            ;;
        mingw32)
            test -z "[$]2" || eval "[$]2=OSMinGW32"
            ;;
        freebsd)
            test -z "[$]2" || eval "[$]2=OSFreeBSD"
            ;;
250
251
252
        dragonfly)
            test -z "[$]2" || eval "[$]2=OSDragonFly"
            ;;
253
254
255
        kfreebsdgnu)
            test -z "[$]2" || eval "[$]2=OSKFreeBSD"
            ;;
256
257
258
        openbsd)
            test -z "[$]2" || eval "[$]2=OSOpenBSD"
            ;;
Ian Lynagh's avatar
Ian Lynagh committed
259
260
261
        netbsd)
            test -z "[$]2" || eval "[$]2=OSNetBSD"
            ;;
pcapriotti's avatar
pcapriotti committed
262
263
264
        haiku)
            test -z "[$]2" || eval "[$]2=OSHaiku"
            ;;
ian@well-typed.com's avatar
ian@well-typed.com committed
265
266
267
        osf3)
            test -z "[$]2" || eval "[$]2=OSOsf3"
            ;;
268
269
270
        nto-qnx)
            test -z "[$]2" || eval "[$]2=OSQNXNTO"
            ;;
ian@well-typed.com's avatar
ian@well-typed.com committed
271
        dragonfly|osf1|hpux|linuxaout|freebsd2|cygwin32|gnu|nextstep2|nextstep3|sunos4|ultrix|irix|aix)
272
            test -z "[$]2" || eval "[$]2=OSUnknown"
273
            ;;
274
275
276
        linux-android)
            test -z "[$]2" || eval "[$]2=OSAndroid"
            ;;
277
278
279
280
281
        *)
            echo "Unknown OS '[$]1'"
            exit 1
            ;;
        esac
282
    }
283

284
285
286
287
288
289
290
291
292
293
294
295
296
297
    dnl ** check for Apple-style dead-stripping support
    dnl    (.subsections-via-symbols assembler directive)

    AC_MSG_CHECKING(for .subsections_via_symbols)
    AC_COMPILE_IFELSE(
        [AC_LANG_PROGRAM([], [__asm__ (".subsections_via_symbols");])],
        [AC_MSG_RESULT(yes)
         HaskellHaveSubsectionsViaSymbols=True
         AC_DEFINE([HAVE_SUBSECTIONS_VIA_SYMBOLS],[1],
                   [Define to 1 if Apple-style dead-stripping is supported.])
        ],
        [HaskellHaveSubsectionsViaSymbols=False
         AC_MSG_RESULT(no)])

298
299
300
301
302
303
304
305
306
307
    dnl ** check for .ident assembler directive

    AC_MSG_CHECKING(whether your assembler supports .ident directive)
    AC_COMPILE_IFELSE(
        [AC_LANG_SOURCE([__asm__ (".ident \"GHC x.y.z\"");])],
        [AC_MSG_RESULT(yes)
         HaskellHaveIdentDirective=True],
        [AC_MSG_RESULT(no)
         HaskellHaveIdentDirective=False])

308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
    dnl *** check for GNU non-executable stack note support (ELF only)
    dnl     (.section .note.GNU-stack,"",@progbits)

    dnl This test doesn't work with "gcc -g" in gcc 4.4 (GHC trac #3889:
    dnl     Error: can't resolve `.note.GNU-stack' {.note.GNU-stack section} - `.Ltext0' {.text section}
    dnl so we empty CFLAGS while running this test
    CFLAGS2="$CFLAGS"
    CFLAGS=
    AC_MSG_CHECKING(for GNU non-executable stack support)
    AC_COMPILE_IFELSE(
        [AC_LANG_PROGRAM([__asm__ (".section .note.GNU-stack,\"\",@progbits");], [0])],
        [AC_MSG_RESULT(yes)
         HaskellHaveGnuNonexecStack=True],
        [AC_MSG_RESULT(no)
         HaskellHaveGnuNonexecStack=False])
    CFLAGS="$CFLAGS2"

325
    checkArch "$BuildArch" "HaskellBuildArch"
326
327
328
    checkVendor "$BuildVendor"
    checkOS "$BuildOS" ""

329
    checkArch "$HostArch" "HaskellHostArch"
330
331
332
333
334
335
336
337
338
    checkVendor "$HostVendor"
    checkOS "$HostOS" ""

    checkArch "$TargetArch" "HaskellTargetArch"
    checkVendor "$TargetVendor"
    checkOS "$TargetOS" "HaskellTargetOs"

    AC_SUBST(HaskellTargetArch)
    AC_SUBST(HaskellTargetOs)
339
    AC_SUBST(HaskellHaveSubsectionsViaSymbols)
340
    AC_SUBST(HaskellHaveIdentDirective)
341
    AC_SUBST(HaskellHaveGnuNonexecStack)
342
343
344
345
346
])


# GET_ARM_ISA
# ----------------------------------
Gabor Greif's avatar
Gabor Greif committed
347
# Get info about the ISA on the ARM arch
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
AC_DEFUN([GET_ARM_ISA],
[
    AC_COMPILE_IFELSE([
        AC_LANG_PROGRAM(
            [],
            [#if defined(__ARM_ARCH_2__)  || \
                 defined(__ARM_ARCH_3__)  || \
                 defined(__ARM_ARCH_3M__) || \
                 defined(__ARM_ARCH_4__)  || \
                 defined(__ARM_ARCH_4T__) || \
                 defined(__ARM_ARCH_5__)  || \
                 defined(__ARM_ARCH_5T__) || \
                 defined(__ARM_ARCH_5E__) || \
                 defined(__ARM_ARCH_5TE__)
                 return 0;
             #else
                 not pre arm v6
             #endif]
        )],
        [AC_DEFINE(arm_HOST_ARCH_PRE_ARMv6, 1, [ARM pre v6])
         AC_DEFINE(arm_HOST_ARCH_PRE_ARMv7, 1, [ARM pre v7])
         changequote(, )dnl
         ARM_ISA=ARMv5
         ARM_ISA_EXT="[]"
         changequote([, ])dnl
        ],
        [
            AC_COMPILE_IFELSE([
                AC_LANG_PROGRAM(
                    [],
                    [#if defined(__ARM_ARCH_6__)   || \
                         defined(__ARM_ARCH_6J__)  || \
                         defined(__ARM_ARCH_6T2__) || \
                         defined(__ARM_ARCH_6Z__)  || \
                         defined(__ARM_ARCH_6ZK__) || \
                         defined(__ARM_ARCH_6M__)
                         return 0;
                     #else
                         not pre arm v7
                     #endif]
                )],
                [AC_DEFINE(arm_HOST_ARCH_PRE_ARMv7, 1, [ARM pre v7])
                 ARM_ISA=ARMv6
391
392
393
394
395
396
397
398
399
400
401
                 AC_COMPILE_IFELSE([
                        AC_LANG_PROGRAM(
                                [],
                                [#if defined(__VFP_FP__)
                                     return 0;
                                #else
                                     no vfp
                                #endif]
                        )],
                        [changequote(, )dnl
                         ARM_ISA_EXT="[VFPv2]"
402
403
                         changequote([, ])dnl
                        ],
404
405
                        [changequote(, )dnl
                         ARM_ISA_EXT="[]"
406
407
                         changequote([, ])dnl
                        ]
408
                )],
409
410
                [changequote(, )dnl
                 ARM_ISA=ARMv7
411
                 ARM_ISA_EXT="[VFPv3,NEON]"
412
413
414
                 changequote([, ])dnl
                ])
        ])
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441

        AC_COMPILE_IFELSE(
               [AC_LANG_PROGRAM(
                       [],
                       [#if defined(__SOFTFP__)
                            return 0;
                       #else
                            not softfp
                       #endif]
               )],
               [changequote(, )dnl
                ARM_ABI="SOFT"
                changequote([, ])dnl
               ],
               [AC_COMPILE_IFELSE(
                    [AC_LANG_PROGRAM(
                       [],
                       [#if defined(__ARM_PCS_VFP)
                            return 0;
                       #else
                            no hard float ABI
                       #endif]
                    )],
                    [ARM_ABI="HARD"],
                    [ARM_ABI="SOFTFP"]
               )]
        )
442
443
444
445
446
447
448
449
450
451
])


# FP_SETTINGS
# ----------------------------------
# Set the variables used in the settings file
AC_DEFUN([FP_SETTINGS],
[
    if test "$windows" = YES
    then
452
453
        mingw_bin_prefix=mingw/bin/
        SettingsCCompilerCommand="\$topdir/../${mingw_bin_prefix}gcc.exe"
Simon Marlow's avatar
Simon Marlow committed
454
        SettingsLdCommand="\$topdir/../${mingw_bin_prefix}ld.exe"
455
        SettingsArCommand="\$topdir/../${mingw_bin_prefix}ar.exe"
456
        SettingsPerlCommand='$topdir/../perl/perl.exe'
457
458
        SettingsDllWrapCommand="\$topdir/../${mingw_bin_prefix}dllwrap.exe"
        SettingsWindresCommand="\$topdir/../${mingw_bin_prefix}windres.exe"
Ian Lynagh's avatar
Ian Lynagh committed
459
        SettingsTouchCommand='$topdir/touchy.exe'
460
461
    else
        SettingsCCompilerCommand="$WhatGccIsCalled"
Simon Marlow's avatar
Simon Marlow committed
462
        SettingsLdCommand="$LdCmd"
463
        SettingsArCommand="$ArCmd"
464
465
466
        SettingsPerlCommand="$PerlCmd"
        SettingsDllWrapCommand="/bin/false"
        SettingsWindresCommand="/bin/false"
467
        SettingsLibtoolCommand="libtool"
468
        SettingsTouchCommand='touch'
469
470
471
472
473
474
475
476
477
478
479
480
        if test -z "$LlcCmd"
        then
          SettingsLlcCommand="llc"
        else
          SettingsLlcCommand="$LlcCmd"
        fi
        if test -z "$OptCmd"
        then
          SettingsOptCommand="opt"
        else
          SettingsOptCommand="$OptCmd"
        fi
481
    fi
482
483
    SettingsCCompilerFlags="$CONF_CC_OPTS_STAGE2"
    SettingsCCompilerLinkFlags="$CONF_GCC_LINKER_OPTS_STAGE2"
484
    SettingsLdFlags="$CONF_LD_LINKER_OPTS_STAGE2"
485
486
    AC_SUBST(SettingsCCompilerCommand)
    AC_SUBST(SettingsCCompilerFlags)
487
    AC_SUBST(SettingsCCompilerLinkFlags)
Simon Marlow's avatar
Simon Marlow committed
488
    AC_SUBST(SettingsLdCommand)
489
    AC_SUBST(SettingsLdFlags)
490
    AC_SUBST(SettingsArCommand)
491
492
493
    AC_SUBST(SettingsPerlCommand)
    AC_SUBST(SettingsDllWrapCommand)
    AC_SUBST(SettingsWindresCommand)
494
    AC_SUBST(SettingsLibtoolCommand)
495
    AC_SUBST(SettingsTouchCommand)
496
497
    AC_SUBST(SettingsLlcCommand)
    AC_SUBST(SettingsOptCommand)
498
499
500
])


501
502
# FPTOOLS_SET_C_LD_FLAGS
# ----------------------------------
503
504
# Set the C, LD and CPP flags for a given platform
# $1 is the platform
505
506
507
508
# $2 is the name of the CC flags variable
# $3 is the name of the linker flags variable when linking with gcc
# $4 is the name of the linker flags variable when linking with ld
# $5 is the name of the CPP flags variable
509
510
AC_DEFUN([FPTOOLS_SET_C_LD_FLAGS],
[
511
    AC_MSG_CHECKING([Setting up $2, $3, $4 and $5])
512
    case $$1 in
513
    i386-*)
514
515
516
517
518
        # Workaround for #7799
        $2="$$2 -U__i686"
        ;;
    esac

519
    case $$1 in
520
    i386-apple-darwin)
521
522
        $2="$$2 -m32"
        $3="$$3 -m32"
523
        $4="$$4 -arch i386"
524
        $5="$$5 -m32"
525
526
527
        ;;
    x86_64-apple-darwin)
        $2="$$2 -m64"
528
        $3="$$3 -m64"
529
530
        $4="$$4 -arch x86_64"
        $5="$$5 -m64"
531
        ;;
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
    alpha-*)
        # For now, to suppress the gcc warning "call-clobbered
        # register used for global register variable", we simply
        # disable all warnings altogether using the -w flag. Oh well.
        $2="$$2 -w -mieee -D_REENTRANT"
        $3="$$3 -w -mieee -D_REENTRANT"
        $5="$$5 -w -mieee -D_REENTRANT"
        ;;
    hppa*)
        # ___HPUX_SOURCE, not _HPUX_SOURCE, is #defined if -ansi!
        # (very nice, but too bad the HP /usr/include files don't agree.)
        $2="$$2 -D_HPUX_SOURCE"
        $3="$$3 -D_HPUX_SOURCE"
        $5="$$5 -D_HPUX_SOURCE"
        ;;
547
    esac
548
549
550
551
552
553
554
555

    # If gcc knows about the stack protector, turn it off.
    # Otherwise the stack-smash handler gets triggered.
    echo 'int main(void) {return 0;}' > conftest.c
    if $CC -c conftest.c -fno-stack-protector > /dev/null 2>&1
    then
        $2="$$2 -fno-stack-protector"
    fi
556

Ian Lynagh's avatar
Ian Lynagh committed
557
    rm -f conftest.c conftest.o
Ian Lynagh's avatar
Ian Lynagh committed
558
    AC_MSG_RESULT([done])
559
560
561
])


562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
AC_DEFUN([FP_PATH_PROG],[
    AC_PATH_PROG($1,$2,$3,$4,$5,$6)
    # If we have a cygwin path for something, and we try to run it
    # from cabal or python, then it'll fail. So we convert to a
    # native path.
    if test "$HostOS"     = "mingw32" && \
       test "${OSTYPE}"  != "msys"    && \
       test "${$1}" != ""
    then
        # Canonicalise to <drive>:/path/to/gcc
        $1=`cygpath -m "${$1}"`
    fi
])


577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
# FP_VISIBILITY_HIDDEN
# ----------------------------------
# Is the visibility hidden attribute supported?
AC_DEFUN([FP_VISIBILITY_HIDDEN],
[
    AC_MSG_CHECKING([whether __attribute__((visibility("hidden"))) is supported])
    echo '__attribute__((visibility("hidden"))) void foo(void) {}' > conftest.c
    if $CC -Wall -Werror -c conftest.c > /dev/null 2>&1
    then
        AC_MSG_RESULT([yes])
        AC_DEFINE(HAS_VISIBILITY_HIDDEN, 1, [Has visibility hidden])
    else
        AC_MSG_RESULT([no])
    fi
    rm -f conftest.c conftest.o
])


595
596
# FPTOOLS_FLOAT_WORD_ORDER_BIGENDIAN
# ----------------------------------
Gabor Greif's avatar
Gabor Greif committed
597
# Little endian ARM on Linux with some ABIs has big endian word order
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
# in doubles. Define FLOAT_WORDS_BIGENDIAN if this is the case.
AC_DEFUN([FPTOOLS_FLOAT_WORD_ORDER_BIGENDIAN],
  [AC_CACHE_CHECK([whether float word order is big endian], [fptools_cv_float_word_order_bigendian],
    [AC_COMPILE_IFELSE(
      [AC_LANG_PROGRAM(
        [#include <endian.h>],
        [#if defined(__FLOAT_WORD_ORDER) && __FLOAT_WORD_ORDER == BIG_ENDIAN
             return 0;
         #else
             not float word order big endian
         #endif]
      )],
      [fptools_cv_float_word_order_bigendian=yes],
      [fptools_cv_float_word_order_bigendian=no])
    ])
  case $fptools_cv_float_word_order_bigendian in
      yes)
          AC_DEFINE([FLOAT_WORDS_BIGENDIAN], 1,
          [Define to 1 if your processor stores words of floats with
           the most significant byte first]) ;;
  esac
])


622
623
# FP_ARG_WITH_PATH_GNU_PROG
# --------------------
624
625
626
627
628
# Find the specified command on the path or allow a user to set it manually
# with a --with-<command> option. An error will be thrown if the command isn't
# found.
#
# This is ignored on the mingw32 platform.
629
#
630
# $1 = the variable to set
631
632
# $2 = the with option name
# $3 = the command to look for
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
#
AC_DEFUN([FP_ARG_WITH_PATH_GNU_PROG],
[
AC_ARG_WITH($2,
[AC_HELP_STRING([--with-$2=ARG],
        [Use ARG as the path to $2 [default=autodetect]])],
[
    if test "$HostOS" = "mingw32"
    then
        AC_MSG_WARN([Request to use $withval will be ignored])
    else
        $1=$withval
    fi
],
[
    if test "$HostOS" != "mingw32"
    then
650
651
652
653
654
        if test "$target_alias" = "" ; then
            AC_PATH_PROG([$1], [$3])
        else
            AC_PATH_PROG([$1], [$target_alias-$3])
        fi
655
656
        if test -z "$$1"
        then
Simon Marlow's avatar
Simon Marlow committed
657
            AC_MSG_ERROR([cannot find $3 in your PATH])
658
659
660
661
662
663
664
        fi
    fi
]
)
]) # FP_ARG_WITH_PATH_GNU_PROG


665
666
# FP_ARG_WITH_PATH_GNU_PROG_OPTIONAL
# --------------------
667
668
669
670
# Same as FP_ARG_WITH_PATH_GNU_PROG but no error will be thrown if the command
# isn't found.
#
# This is ignored on the mingw32 platform.
671
672
#
# $1 = the variable to set
673
674
# $2 = the with option name
# $3 = the command to look for
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
#
AC_DEFUN([FP_ARG_WITH_PATH_GNU_PROG_OPTIONAL],
[
AC_ARG_WITH($2,
[AC_HELP_STRING([--with-$2=ARG],
        [Use ARG as the path to $2 [default=autodetect]])],
[
    if test "$HostOS" = "mingw32"
    then
        AC_MSG_WARN([Request to use $withval will be ignored])
    else
        $1=$withval
    fi
],
[
    if test "$HostOS" != "mingw32"
    then
692
        AC_PATH_PROG([$1], [$3])
693
694
695
696
697
    fi
]
)
]) # FP_ARG_WITH_PATH_GNU_PROG_OPTIONAL

698
699
700
# FP_PROG_CONTEXT_DIFF
# --------------------
# Figure out how to do context diffs. Sets the output variable ContextDiffCmd.
701
702
#
# Note: NeXTStep thinks diff'ing a file against itself is "trouble".
703
704
705
706
707
AC_DEFUN([FP_PROG_CONTEXT_DIFF],
[AC_CACHE_CHECK([for a working context diff], [fp_cv_context_diff],
[echo foo > conftest1
echo foo > conftest2
fp_cv_context_diff=no
Ian Lynagh's avatar
Ian Lynagh committed
708
for fp_var in '-U 1' '-u1' '-C 1' '-c1'
709
710
711
712
713
714
715
716
717
718
719
720
721
do
  if diff $fp_var conftest1 conftest2 > /dev/null 2>&1; then
    fp_cv_context_diff="diff $fp_var"
    break
  fi
done])
if test x"$fp_cv_context_diff" = xno; then
   AC_MSG_ERROR([cannot figure out how to do context diffs])
fi
AC_SUBST(ContextDiffCmd, [$fp_cv_context_diff])
])# FP_PROG_CONTEXT_DIFF


722
# FP_COMPUTE_INT(EXPRESSION, VARIABLE, INCLUDES, IF-FAILS)
723
# --------------------------------------------------------
724
725
726
# Assign VARIABLE the value of the compile-time EXPRESSION using INCLUDES for
# compilation. Execute IF-FAILS when unable to determine the value. Works for
# cross-compilation, too.
727
728
729
730
#
# Implementation note: We are lazy and use an internal autoconf macro, but it
# is supported in autoconf versions 2.50 up to the actual 2.57, so there is
# little risk.
731
732
733
734
735
736
737
738
739
740
AC_DEFUN([FP_COMPUTE_INT],
[_AC_COMPUTE_INT([$1], [$2], [$3], [$4])[]dnl
])# FP_COMPUTE_INT


# FP_CHECK_ALIGNMENT(TYPE, [IGNORED], [INCLUDES = DEFAULT-INCLUDES])
# ------------------------------------------------------------------
# A variation of AC_CHECK_SIZEOF for computing the alignment restrictions of a
# given type. Defines ALIGNMENT_TYPE.
AC_DEFUN([FP_CHECK_ALIGNMENT],
741
[AS_LITERAL_IF(m4_translit([[$1]], [*], [p]), [],
742
               [AC_FATAL([$0: requires literal arguments])])[]dnl
743
744
745
AC_CHECK_TYPE([$1], [], [], [$3])[]dnl
m4_pushdef([fp_Cache], [AS_TR_SH([fp_cv_alignment_$1])])[]dnl
AC_CACHE_CHECK([alignment of $1], [fp_Cache],
746
[if test "$AS_TR_SH([ac_cv_type_$1])" = yes; then
747
  FP_COMPUTE_INT([offsetof(struct { char c; $1 ty; },ty)],
748
                 [fp_Cache],
749
                 [AC_INCLUDES_DEFAULT([$3])],
750
751
                 [AC_MSG_ERROR([cannot compute alignment ($1)
See `config.log' for more details.], [77])])
752
else
753
754
755
756
  fp_Cache=0
fi])[]dnl
AC_DEFINE_UNQUOTED(AS_TR_CPP(alignment_$1), $fp_Cache, [The alignment of a `$1'.])[]dnl
m4_popdef([fp_Cache])[]dnl
757
758
759
])# FP_CHECK_ALIGNMENT


760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
# FP_LEADING_UNDERSCORE
# ---------------------
# Test for determining whether symbol names have a leading underscore. We assume
# that they _haven't_ if anything goes wrong. Sets the output variable
# LeadingUnderscore to YES or NO and defines LEADING_UNDERSCORE correspondingly.
#
# Some nlist implementations seem to try to be compatible by ignoring a leading
# underscore sometimes (eg. FreeBSD). We therefore have to work around this by
# checking for *no* leading underscore first. Sigh.  --SDM
#
# Similarly on OpenBSD, but this test doesn't help. -- dons
AC_DEFUN([FP_LEADING_UNDERSCORE],
[AC_CHECK_LIB([elf], [nlist], [LIBS="-lelf $LIBS"])
AC_CACHE_CHECK([leading underscore in symbol names], [fptools_cv_leading_underscore], [
# Hack!: nlist() under Digital UNIX insist on there being an _,
# but symbol table listings shows none. What is going on here?!?
#
# Another hack: cygwin doesn't come with nlist.h , so we hardwire
# the underscoredness of that "platform"
779
case $HostPlatform in
dons's avatar
dons committed
780
*openbsd*) # x86 openbsd is ELF from 3.4 >, meaning no leading uscore
781
782
783
784
785
786
  case $build in
    i386-*2\.@<:@0-9@:>@ | i386-*3\.@<:@0-3@:>@ ) fptools_cv_leading_underscore=yes ;;
    *) fptools_cv_leading_underscore=no ;;
  esac ;;
alpha-dec-osf*) fptools_cv_leading_underscore=no;;
*cygwin32) fptools_cv_leading_underscore=yes;;
787
788
i386-unknown-mingw32) fptools_cv_leading_underscore=yes;;
x86_64-unknown-mingw32) fptools_cv_leading_underscore=no;;
789
790
791

    # HACK: Apple doesn't seem to provide nlist in the 64-bit-libraries
x86_64-apple-darwin*) fptools_cv_leading_underscore=yes;;
792
*-apple-ios) fptools_cv_leading_underscore=yes;;
793

794
*) AC_RUN_IFELSE([AC_LANG_SOURCE([[#ifdef HAVE_NLIST_H
sof's avatar
sof committed
795
#include <nlist.h>
796
797
struct nlist xYzzY1[] = {{"xYzzY1", 0},{0}};
struct nlist xYzzY2[] = {{"_xYzzY2", 0},{0}};
sof's avatar
sof committed
798
799
#endif

800
801
802
int main(argc, argv)
int argc;
char **argv;
sof's avatar
sof committed
803
804
{
#ifdef HAVE_NLIST_H
805
806
807
    if(nlist(argv[0], xYzzY1) == 0 && xYzzY1[0].n_value != 0)
        exit(1);
    if(nlist(argv[0], xYzzY2) == 0 && xYzzY2[0].n_value != 0)
808
        exit(0);
sof's avatar
sof committed
809
810
#endif
    exit(1);
811
}]])],[fptools_cv_leading_underscore=yes],[fptools_cv_leading_underscore=no],[fptools_cv_leading_underscore=no])
812
;;
813
814
815
816
817
esac]);
AC_SUBST([LeadingUnderscore], [`echo $fptools_cv_leading_underscore | sed 'y/yesno/YESNO/'`])
if test x"$fptools_cv_leading_underscore" = xyes; then
   AC_DEFINE([LEADING_UNDERSCORE], [1], [Define to 1 if C symbols have a leading underscore added by the compiler.])
fi])# FP_LEADING_UNDERSCORE
sof's avatar
sof committed
818

819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846

# FP_COMPARE_VERSIONS(VERSION1, TEST, VERSION2, [ACTION-IF-TRUE], [ACTION-IF-FALSE])
# ----------------------------------------------------------------------------------
# Compare dotted version numbers VERSION1 and VERSION2 lexicographically according
# to TEST (one of -eq, -ne, -lt, -le, -gt, or -ge).
AC_DEFUN([FP_COMPARE_VERSIONS],
[fp_version1=$1; fp_version2=$3
fp_save_IFS=$IFS; IFS='.'
while test x"$fp_version1" != x || test x"$fp_version2" != x
do

  set dummy $fp_version1; shift
  fp_num1=""
  test $[@%:@] = 0 || { fp_num1="[$]1"; shift; }
  test x"$fp_num1" = x && fp_num1="0"
  fp_version1="[$]*"

  set dummy $fp_version2; shift
  fp_num2=""
  test $[@%:@] = 0 || { fp_num2="[$]1"; shift; }
  test x"$fp_num2" = x && fp_num2="0"
  fp_version2="[$]*"

  test "$fp_num1" = "$fp_num2" || break;
done
IFS=$fp_save_IFS
AS_IF([test "$fp_num1" $2 "$fp_num2"], [$4], [$5])[]dnl
])# FP_COMPARE_VERSIONS
847
848


sof's avatar
sof committed
849
dnl
850
dnl Check for Happy and version.  If we're building GHC, then we need
krakrjak's avatar
krakrjak committed
851
dnl at least Happy version 1.19.  If there's no installed Happy, we look
852
853
dnl for a happy source tree and point the build system at that instead.
dnl
854
AC_DEFUN([FPTOOLS_HAPPY],
855
[FP_PATH_PROG(HappyCmd,happy,)
856

sof's avatar
sof committed
857
AC_CACHE_CHECK([for version of happy], fptools_cv_happy_version,
sof's avatar
sof committed
858
changequote(, )dnl
859
[if test x"$HappyCmd" != x; then
860
861
   fptools_cv_happy_version=`"$HappyCmd" -v |
			  grep 'Happy Version' | sed -e 's/Happy Version \([^ ]*\).*/\1/g'` ;
sof's avatar
sof committed
862
else
sof's avatar
sof committed
863
   fptools_cv_happy_version="";
sof's avatar
sof committed
864
fi;
865
changequote([, ])dnl
866
])
867
if test ! -f compiler/parser/Parser.hs || test ! -f compiler/cmm/CmmParse.hs || test ! -f compiler/parser/ParserCore.hs
868
then
869
870
    FP_COMPARE_VERSIONS([$fptools_cv_happy_version],[-lt],[1.19],
      [AC_MSG_ERROR([Happy version 1.19 or later is required to compile GHC.])])[]
871
fi
872
HappyVersion=$fptools_cv_happy_version;
sof's avatar
sof committed
873
874
875
AC_SUBST(HappyVersion)
])

876
877
dnl
dnl Check for Alex and version.  If we're building GHC, then we need
878
dnl at least Alex version 2.1.1.
879
dnl
880
AC_DEFUN([FPTOOLS_ALEX],
881
[
882
FP_PATH_PROG(AlexCmd,alex,)
883

884
885
AC_CACHE_CHECK([for version of alex], fptools_cv_alex_version,
changequote(, )dnl
886
[if test x"$AlexCmd" != x; then
887
888
   fptools_cv_alex_version=`"$AlexCmd" -v |
			  grep 'Alex [Vv]ersion' | sed -e 's/Alex [Vv]ersion \([0-9\.]*\).*/\1/g'` ;
889
890
891
892
893
else
   fptools_cv_alex_version="";
fi;
changequote([, ])dnl
])
894
895
FP_COMPARE_VERSIONS([$fptools_cv_alex_version],[-ge],[3.0],
  [Alex3=YES],[Alex3=NO])
896
897
if test ! -f compiler/cmm/CmmLex.hs || test ! -f compiler/parser/Lexer.hs
then
898
899
    FP_COMPARE_VERSIONS([$fptools_cv_alex_version],[-lt],[3.1.0],
      [AC_MSG_ERROR([Alex version 3.1.0 or later is required to compile GHC.])])[]
900
fi
901
902
AlexVersion=$fptools_cv_alex_version;
AC_SUBST(AlexVersion)
903
AC_SUBST(Alex3)
904
905
])

sof's avatar
sof committed
906

907
908
909
910
911
# FP_PROG_LD_FLAG
# ---------------
# Sets the output variable $2 to $1 if ld supports the $1 flag.
# Otherwise the variable's value is empty.
AC_DEFUN([FP_PROG_LD_FLAG],
912
[
913
AC_CACHE_CHECK([whether ld understands $1], [fp_cv_$2],
914
[echo 'int foo() { return 0; }' > conftest.c
915
${CC-cc} -c conftest.c
916
917
if ${LdCmd} -r $1 -o conftest2.o conftest.o > /dev/null 2>&1; then
   fp_cv_$2=$1
918
else
919
   fp_cv_$2=
920
fi
921
rm -rf conftest*])
922
923
924
925
$2=$fp_cv_$2
])# FP_PROG_LD_FLAG


926
927
928
929
930
931
932
933
# FP_PROG_LD_BUILD_ID
# ------------

# Sets the output variable LdHasBuildId to YES if ld supports
# --build-id, or NO otherwise.
AC_DEFUN([FP_PROG_LD_BUILD_ID],
[
AC_CACHE_CHECK([whether ld understands --build-id], [fp_cv_ld_build_id],
934
[echo 'int foo() { return 0; }' > conftest.c
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
${CC-cc} -c conftest.c
if ${LdCmd} -r --build-id=none -o conftest2.o conftest.o > /dev/null 2>&1; then
   fp_cv_ld_build_id=yes
else
   fp_cv_ld_build_id=no
fi
rm -rf conftest*])
if test "$fp_cv_ld_build_id" = yes; then
  LdHasBuildId=YES
else
  LdHasBuildId=NO
fi
AC_SUBST([LdHasBuildId])
])# FP_PROG_LD_BUILD_ID


951
952
953
954
955
# FP_PROG_LD_IS_GNU
# -----------------
# Sets the output variable LdIsGNULd to YES or NO, depending on whether it is
# GNU ld or not.
AC_DEFUN([FP_PROG_LD_IS_GNU],
956
[
957
958
959
960
961
962
963
964
AC_CACHE_CHECK([whether ld is GNU ld], [fp_cv_gnu_ld],
[if ${LdCmd} --version 2> /dev/null | grep "GNU" > /dev/null 2>&1; then
  fp_cv_gnu_ld=yes
else
  fp_cv_gnu_ld=no
fi])
AC_SUBST([LdIsGNULd], [`echo $fp_cv_gnu_ld | sed 'y/yesno/YESNO/'`])
])# FP_PROG_LD_IS_GNU
965

sof's avatar
sof committed
966

967
968
969
970
971
972
973
974
# FP_PROG_LD_NO_COMPACT_UNWIND
# ----------------------------

# Sets the output variable LdHasNoCompactUnwind to YES if ld supports
# -no_compact_unwind, or NO otherwise.
AC_DEFUN([FP_PROG_LD_NO_COMPACT_UNWIND],
[
AC_CACHE_CHECK([whether ld understands -no_compact_unwind], [fp_cv_ld_no_compact_unwind],
975
[echo 'int foo() { return 0; }' > conftest.c
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
${CC-cc} -c conftest.c
if ${LdCmd} -r -no_compact_unwind -o conftest2.o conftest.o > /dev/null 2>&1; then
   fp_cv_ld_no_compact_unwind=yes
else
   fp_cv_ld_no_compact_unwind=no
fi
rm -rf conftest*])
if test "$fp_cv_ld_no_compact_unwind" = yes; then
  LdHasNoCompactUnwind=YES
else
  LdHasNoCompactUnwind=NO
fi
AC_SUBST([LdHasNoCompactUnwind])
])# FP_PROG_LD_NO_COMPACT_UNWIND


992
993
994
995
996
997
998
999
1000
# FP_PROG_LD_FILELIST
# -------------------

# Sets the output variable LdHasFilelist to YES if ld supports
# -filelist, or NO otherwise.
AC_DEFUN([FP_PROG_LD_FILELIST],
[
AC_CACHE_CHECK([whether ld understands -filelist], [fp_cv_ld_has_filelist],
[