diff options
Diffstat (limited to 'aclocal.m4')
-rw-r--r-- | aclocal.m4 | 262 |
1 files changed, 203 insertions, 59 deletions
diff --git a/aclocal.m4 b/aclocal.m4 index a9788bf5fb..e2804cf642 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -109,6 +109,8 @@ AC_DEFUN([FPTOOLS_SET_PLATFORM_VARS], GHC_CONVERT_OS([$target_os], [$TargetArch], [TargetOS]) fi + GHC_LLVM_TARGET([$target_cpu],[$target_vendor],[$target_os],[LlvmTarget]) + GHC_SELECT_FILE_EXTENSIONS([$host], [exeext_host], [soext_host]) GHC_SELECT_FILE_EXTENSIONS([$target], [exeext_target], [soext_target]) windows=NO @@ -137,12 +139,12 @@ AC_DEFUN([FPTOOLS_SET_PLATFORM_VARS], TargetOS_CPP=` echo "$TargetOS" | sed -e 's/\./_/g' -e 's/-/_/g'` # we intend to pass trough --targets to llvm as is. - LLVMTarget_CPP=` echo "$target"` + LLVMTarget_CPP=` echo "$LlvmTarget"` echo "GHC build : $BuildPlatform" echo "GHC host : $HostPlatform" echo "GHC target : $TargetPlatform" - echo "LLVM target: $target" + echo "LLVM target: $LlvmTarget" AC_SUBST(BuildPlatform) AC_SUBST(HostPlatform) @@ -215,7 +217,7 @@ AC_DEFUN([FPTOOLS_SET_HASKELL_PLATFORM_VARS], mipsel) test -z "[$]2" || eval "[$]2=ArchMipsel" ;; - hppa|hppa1_1|ia64|m68k|rs6000|s390|s390x|sh4|vax) + hppa|hppa1_1|ia64|m68k|nios2|riscv32|riscv64|rs6000|s390|s390x|sh4|vax) test -z "[$]2" || eval "[$]2=ArchUnknown" ;; *) @@ -227,7 +229,7 @@ AC_DEFUN([FPTOOLS_SET_HASKELL_PLATFORM_VARS], checkVendor() { case [$]1 in - dec|none|unknown|hp|apple|next|sun|sgi|ibm|montavista|portbld) + dec|none|unknown|hp|apple|next|sun|sgi|ibm|montavista|portbld|alpine) ;; *) AC_MSG_WARN([Unknown vendor [$]1]) @@ -237,13 +239,10 @@ AC_DEFUN([FPTOOLS_SET_HASKELL_PLATFORM_VARS], checkOS() { case [$]1 in - linux) + linux|linux-android) test -z "[$]2" || eval "[$]2=OSLinux" ;; - ios) - test -z "[$]2" || eval "[$]2=OSiOS" - ;; - darwin) + darwin|ios|watchos|tvos) test -z "[$]2" || eval "[$]2=OSDarwin" ;; solaris2) @@ -273,14 +272,14 @@ AC_DEFUN([FPTOOLS_SET_HASKELL_PLATFORM_VARS], nto-qnx) test -z "[$]2" || eval "[$]2=OSQNXNTO" ;; - dragonfly|hpux|linuxaout|freebsd2|gnu|nextstep2|nextstep3|sunos4|ultrix) + dragonfly|hpux|linuxaout|freebsd2|nextstep2|nextstep3|sunos4|ultrix) test -z "[$]2" || eval "[$]2=OSUnknown" ;; aix) test -z "[$]2" || eval "[$]2=OSAIX" ;; - linux-android) - test -z "[$]2" || eval "[$]2=OSAndroid" + gnu) + test -z "[$]2" || eval "[$]2=OSHurd" ;; *) echo "Unknown OS '[$]1'" @@ -471,14 +470,15 @@ AC_DEFUN([FP_SETTINGS], if test "$windows" = YES -a "$EnableDistroToolchain" = "NO" then mingw_bin_prefix=mingw/bin/ - SettingsCCompilerCommand="\$topdir/../${mingw_bin_prefix}gcc.exe" - SettingsHaskellCPPCommand="\$topdir/../${mingw_bin_prefix}gcc.exe" + SettingsCCompilerCommand="\$tooldir/${mingw_bin_prefix}gcc.exe" + SettingsHaskellCPPCommand="\$tooldir/${mingw_bin_prefix}gcc.exe" SettingsHaskellCPPFlags="$HaskellCPPArgs" - SettingsLdCommand="\$topdir/../${mingw_bin_prefix}ld.exe" - SettingsArCommand="\$topdir/../${mingw_bin_prefix}ar.exe" - SettingsPerlCommand='$topdir/../perl/perl.exe' - SettingsDllWrapCommand="\$topdir/../${mingw_bin_prefix}dllwrap.exe" - SettingsWindresCommand="\$topdir/../${mingw_bin_prefix}windres.exe" + SettingsLdCommand="\$tooldir/${mingw_bin_prefix}ld.exe" + SettingsArCommand="\$tooldir/${mingw_bin_prefix}ar.exe" + SettingsRanlibCommand="\$tooldir/${mingw_bin_prefix}ranlib.exe" + SettingsPerlCommand='$tooldir/perl/perl.exe' + SettingsDllWrapCommand="\$tooldir/${mingw_bin_prefix}dllwrap.exe" + SettingsWindresCommand="\$tooldir/${mingw_bin_prefix}windres.exe" SettingsTouchCommand='$topdir/bin/touchy.exe' elif test "$EnableDistroToolchain" = "YES" then @@ -498,6 +498,7 @@ AC_DEFUN([FP_SETTINGS], SettingsHaskellCPPFlags="$HaskellCPPArgs" SettingsLdCommand="$LdCmd" SettingsArCommand="$ArCmd" + SettingsRanlibCommand="$RanlibCmd" SettingsPerlCommand="$PerlCmd" if test -z "$DllWrapCmd" then @@ -519,6 +520,12 @@ AC_DEFUN([FP_SETTINGS], else SettingsLibtoolCommand="$LibtoolCmd" fi + if test -z "$ClangCmd" + then + SettingsClangCommand="clang" + else + SettingsClangCommand="$ClangCmd" + fi if test -z "$LlcCmd" then SettingsLlcCommand="llc" @@ -544,11 +551,13 @@ AC_DEFUN([FP_SETTINGS], AC_SUBST(SettingsLdCommand) AC_SUBST(SettingsLdFlags) AC_SUBST(SettingsArCommand) + AC_SUBST(SettingsRanlibCommand) AC_SUBST(SettingsPerlCommand) AC_SUBST(SettingsDllWrapCommand) AC_SUBST(SettingsWindresCommand) AC_SUBST(SettingsLibtoolCommand) AC_SUBST(SettingsTouchCommand) + AC_SUBST(SettingsClangCommand) AC_SUBST(SettingsLlcCommand) AC_SUBST(SettingsOptCommand) ]) @@ -642,6 +651,14 @@ AC_DEFUN([FPTOOLS_SET_C_LD_FLAGS], $3="$$3 -D_HPUX_SOURCE" $5="$$5 -D_HPUX_SOURCE" ;; + + arm*freebsd*) + # On arm/freebsd, tell gcc to generate Arm + # instructions (ie not Thumb). + $2="$$2 -marm" + $3="$$3 -Wl,-z,noexecstack" + $4="$$4 -z noexecstack" + ;; arm*linux*) # On arm/linux and arm/android, tell gcc to generate Arm # instructions (ie not Thumb). @@ -650,6 +667,10 @@ AC_DEFUN([FPTOOLS_SET_C_LD_FLAGS], $4="$$4 -z noexecstack" ;; + aarch64*freebsd*) + $3="$$3 -Wl,-z,noexecstack" + $4="$$4 -z noexecstack" + ;; aarch64*linux*) $3="$$3 -Wl,-z,noexecstack" $4="$$4 -z noexecstack" @@ -852,8 +873,12 @@ char **argv; esac]); AC_SUBST([LeadingUnderscore], [`echo $fptools_cv_leading_underscore | sed 'y/yesno/YESNO/'`]) if test x"$fptools_cv_leading_underscore" = xyes; then + AC_SUBST([CabalLeadingUnderscore],[True]) AC_DEFINE([LEADING_UNDERSCORE], [1], [Define to 1 if C symbols have a leading underscore added by the compiler.]) -fi])# FP_LEADING_UNDERSCORE +else + AC_SUBST([CabalLeadingUnderscore],[False]) +fi +])# FP_LEADING_UNDERSCORE # FP_COMPARE_VERSIONS(VERSION1, TEST, VERSION2, [ACTION-IF-TRUE], [ACTION-IF-FALSE]) @@ -1065,9 +1090,20 @@ AC_SUBST([LdHasFilelist]) # FP_PROG_AR # ---------- # Sets fp_prog_ar to a path to ar. Exits if no ar can be found +# The host normalization on Windows breaks autoconf, it no longer +# thinks that target == host so it never checks the unqualified +# tools for Windows. See #14274. AC_DEFUN([FP_PROG_AR], [if test -z "$fp_prog_ar"; then - AC_PATH_PROG([fp_prog_ar], [ar]) + if test "$HostOS" = "mingw32" + then + AC_PATH_PROG([fp_prog_ar], [ar]) + if test -n "$fp_prog_ar"; then + fp_prog_ar=$(cygpath -m $fp_prog_ar) + fi + else + AC_CHECK_TARGET_TOOL([fp_prog_ar], [ar]) + fi fi if test -z "$fp_prog_ar"; then AC_MSG_ERROR([cannot find ar in your PATH, no idea how to make a library]) @@ -1132,11 +1168,15 @@ if test $fp_prog_ar_is_gnu = yes; then fp_cv_prog_ar_args="q" else touch conftest.dummy - for fp_var in clqsZ clqs cqs clq cq ; do + for fp_var in qclsZ qcls qcs qcl qc ; do rm -f conftest.a - if "$fp_prog_ar" $fp_var conftest.a conftest.dummy > /dev/null 2> /dev/null; then - fp_cv_prog_ar_args=$fp_var - break + if "$fp_prog_ar" $fp_var conftest.a conftest.dummy > /dev/null 2> /dev/null ; then + # Also check that a result was created; it seems some llvm-ar versions + # exit with code zero even if they fail to parse the command line. + if test -f conftest.a ; then + fp_cv_prog_ar_args=$fp_var + break + fi fi done rm -f conftest* @@ -1212,24 +1252,17 @@ if test -z "$CC" then AC_MSG_ERROR([gcc is required]) fi -GccLT34=NO -GccLT44=NO GccLT46=NO AC_CACHE_CHECK([version of gcc], [fp_cv_gcc_version], [ - fp_cv_gcc_version="`$CC -v 2>&1 | grep 'version ' | sed -e 's/.*version [[^0-9]]*\([[0-9.]]*\).*/\1/g'`" - FP_COMPARE_VERSIONS([$fp_cv_gcc_version], [-lt], [3.0], - [AC_MSG_ERROR([Need at least gcc version 3.0 (3.4+ recommended)])]) - # See #2770: gcc 2.95 doesn't work any more, apparently. There probably - # isn't a very good reason for that, but for now just make configure - # fail. - FP_COMPARE_VERSIONS([$fp_cv_gcc_version], [-lt], [3.4], GccLT34=YES) - FP_COMPARE_VERSIONS([$fp_cv_gcc_version], [-lt], [4.4], GccLT44=YES) + # Be sure only to look at the first occurrence of the "version " string; + # Some Apple compilers emit multiple messages containing this string. + fp_cv_gcc_version="`$CC -v 2>&1 | sed -n -e '1,/version /s/.*version [[^0-9]]*\([[0-9.]]*\).*/\1/p'`" + FP_COMPARE_VERSIONS([$fp_cv_gcc_version], [-lt], [4.4], + [AC_MSG_ERROR([Need at least gcc version 4.4 (4.7+ recommended)])]) FP_COMPARE_VERSIONS([$fp_cv_gcc_version], [-lt], [4.6], GccLT46=YES) ]) AC_SUBST([GccVersion], [$fp_cv_gcc_version]) -AC_SUBST(GccLT34) -AC_SUBST(GccLT44) AC_SUBST(GccLT46) ])# FP_GCC_VERSION @@ -1263,6 +1296,24 @@ AC_SUBST(GccIsClang) rm -f conftest.txt ]) +# FP_GCC_SUPPORTS__ATOMICS +# ------------------------ +# Does gcc support the __atomic_* family of builtins? +AC_DEFUN([FP_GCC_SUPPORTS__ATOMICS], +[ + AC_REQUIRE([AC_PROG_CC]) + AC_MSG_CHECKING([whether GCC supports __atomic_ builtins]) + echo 'int test(int *x) { int y; __atomic_load(&x, &y, __ATOMIC_SEQ_CST); return x; }' > conftest.c + if $CC -c conftest.c > /dev/null 2>&1; then + CONF_GCC_SUPPORTS__ATOMICS=YES + AC_MSG_RESULT([yes]) + else + CONF_GCC_SUPPORTS__ATOMICS=NO + AC_MSG_RESULT([no]) + fi + rm -f conftest.c conftest.o +]) + # FP_GCC_SUPPORTS_NO_PIE # ---------------------- # Does gcc support the -no-pie option? If so we should pass it to gcc when @@ -1273,7 +1324,7 @@ AC_DEFUN([FP_GCC_SUPPORTS_NO_PIE], AC_MSG_CHECKING([whether GCC supports -no-pie]) echo 'int main() { return 0; }' > conftest.c # Some GCC versions only warn when passed an unrecognized flag. - if $CC -no-pie -x c /dev/null -dM -E > conftest.txt 2>&1 && ! grep -i unrecognized conftest.txt > /dev/null 2>&1; then + 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 CONF_GCC_SUPPORTS_NO_PIE=YES AC_MSG_RESULT([yes]) else @@ -1513,7 +1564,7 @@ if test "$RELEASE" = "NO"; then fi AC_MSG_CHECKING([for GHC Git commit id]) - if test -d .git; then + if test -e .git; then git_commit_id=`git rev-parse HEAD` if test -n "$git_commit_id" 2>&1 >/dev/null; then true; else AC_MSG_ERROR([failed to detect revision: check that git is in your path]) @@ -1833,6 +1884,9 @@ case "$1" in mips*) $2="mips" ;; + nios2) + $2="nios2" + ;; powerpc64le*) $2="powerpc64le" ;; @@ -1842,6 +1896,12 @@ case "$1" in powerpc*) $2="powerpc" ;; + riscv64*) + $2="riscv64" + ;; + riscv|riscv32*) + $2="riscv32" + ;; rs6000) $2="rs6000" ;; @@ -1873,6 +1933,40 @@ case "$1" in esac ]) +# GHC_LLVM_TARGET(target_cpu, target_vendor, target_os, llvm_target_var) +# -------------------------------- +# converts the canonicalized target into someting llvm can understand +AC_DEFUN([GHC_LLVM_TARGET], [ + case "$2-$3" in + *-freebsd*-gnueabihf) + llvm_target_vendor="unknown" + llvm_target_os="freebsd-gnueabihf" + ;; + hardfloat-*eabi) + llvm_target_vendor="unknown" + llvm_target_os="$3""hf" + ;; + *-mingw32|*-mingw64|*-msys) + llvm_target_vendor="unknown" + llvm_target_os="windows" + ;; + # retain any android and gnueabi linux flavours + # for the LLVM Target. Otherwise these would be + # turned into just `-linux` and fail to be found + # in the `llvm-targets` file. + *-android*|*-gnueabi*) + GHC_CONVERT_VENDOR([$2],[llvm_target_vendor]) + llvm_target_os="$3" + ;; + *) + GHC_CONVERT_VENDOR([$2],[llvm_target_vendor]) + GHC_CONVERT_OS([$3],[$1],[llvm_target_os]) + ;; + esac + $4="$1-$llvm_target_vendor-$llvm_target_os" +]) + + # GHC_CONVERT_VENDOR(vendor, target_var) # -------------------------------- # converts vendor from gnu to ghc naming, and assigns the result to $target_var @@ -1899,6 +1993,9 @@ AC_DEFUN([GHC_CONVERT_VENDOR],[ # converts os from gnu to ghc naming, and assigns the result to $target_var AC_DEFUN([GHC_CONVERT_OS],[ case "$1" in + gnu*) # e.g. i686-unknown-gnu0.9 + $3="gnu" + ;; # watchos and tvos are ios variants as of May 2017. ios|watchos|tvos) $3="ios" @@ -1909,16 +2006,25 @@ AC_DEFUN([GHC_CONVERT_OS],[ linux-*|linux) $3="linux" ;; + openbsd*) + $3="openbsd" + ;; # As far as I'm aware, none of these have relevant variants - freebsd|netbsd|openbsd|dragonfly|hpux|linuxaout|kfreebsdgnu|freebsd2|solaris2|mingw32|darwin|gnu|nextstep2|nextstep3|sunos4|ultrix|haiku) + freebsd|netbsd|dragonfly|hpux|linuxaout|kfreebsdgnu|freebsd2|mingw32|darwin|nextstep2|nextstep3|sunos4|ultrix|haiku) $3="$1" ;; + msys) + 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?']) + ;; aix*) # e.g. powerpc-ibm-aix7.1.3.0 $3="aix" ;; darwin*) # e.g. aarch64-apple-darwin14 $3="darwin" ;; + solaris2*) + $3="solaris2" + ;; freebsd*) # like i686-gentoo-freebsd7 # i686-gentoo-freebsd8 # i686-gentoo-freebsd8.2 @@ -1996,7 +2102,7 @@ AC_DEFUN([XCODE_VERSION],[ # AC_DEFUN([FIND_LLVM_PROG],[ # Test for program with and without version name. - AC_CHECK_TOOLS([$1], [$2-$3 $2]) + AC_CHECK_TOOLS([$1], [$2-$3 $2], [:]) if test "$$1" != ":"; then AC_MSG_CHECKING([$$1 is version $3]) if test `$$1 --version | grep -c "version $3"` -gt 0 ; then @@ -2005,6 +2111,8 @@ AC_DEFUN([FIND_LLVM_PROG],[ AC_MSG_RESULT(no) $1="" fi + else + $1="" fi ]) @@ -2200,6 +2308,7 @@ $2=$HS_CPP_ARGS # ---------------------- # whether to use libbfd for debugging RTS AC_DEFUN([FP_BFD_SUPPORT], [ + AC_SUBST([CabalHaveLibbfd], [False]) AC_ARG_ENABLE(bfd-debug, [AC_HELP_STRING([--enable-bfd-debug], [Enable symbol resolution for -debug rts ('+RTS -Di') via binutils' libbfd [default=no]])], @@ -2237,7 +2346,7 @@ AC_DEFUN([FP_BFD_SUPPORT], [ bfd_get_symbol_info(abfd,symbol_table[0],&info); } ], - [],dnl bfd seems to work + [AC_SUBST([CabalHaveLibbfd], [True])],dnl bfd seems to work [AC_MSG_ERROR([can't use 'bfd' library])]) LIBS="$save_LIBS" ] @@ -2282,27 +2391,62 @@ AC_DEFUN([FIND_LD],[ [], [enable_ld_override=yes]) - if test "x$enable_ld_override" = "xyes"; then - AC_CHECK_TARGET_TOOLS([TmpLd], [ld.gold ld.lld ld]) - - out=`$TmpLd --version` - case $out in - "GNU ld"*) FP_CC_LINKER_FLAG_TRY(bfd, $2) ;; - "GNU gold"*) FP_CC_LINKER_FLAG_TRY(gold, $2) ;; - "LLD"*) FP_CC_LINKER_FLAG_TRY(lld, $2) ;; - *) AC_MSG_NOTICE([unknown linker version $out]) ;; - esac - if test "z$$2" = "z"; then - AC_MSG_NOTICE([unable to convince '$CC' to use linker '$TmpLd']) + find_ld() { + # Make sure the user didn't specify LD manually. + if test "z$LD" != "z"; then AC_CHECK_TARGET_TOOL([LD], [ld]) - else - LD="$TmpLd" + LD_NO_GOLD=$LD + return fi - else + + # Manually iterate over possible names since we want to ensure that, e.g., + # if ld.lld is installed but gcc doesn't support -fuse-ld=lld, that we + # then still try ld.gold and -fuse-ld=gold. + for possible_ld in ld.lld ld.gold ld; do + TmpLd="" # In case the user set LD + AC_CHECK_TARGET_TOOL([TmpLd], [$possible_ld]) + if test "x$TmpLd" = "x"; then continue; fi + + out=`$TmpLd --version` + LD_NO_GOLD=$TmpLd + case $out in + "GNU ld"*) + FP_CC_LINKER_FLAG_TRY(bfd, $2) ;; + "GNU gold"*) + FP_CC_LINKER_FLAG_TRY(gold, $2) + LD_NO_GOLD=ld + ;; + "LLD"*) + FP_CC_LINKER_FLAG_TRY(lld, $2) ;; + *) AC_MSG_NOTICE([unknown linker version $out]) ;; + esac + if test "z$$2" = "z"; then + AC_MSG_NOTICE([unable to convince '$CC' to use linker '$TmpLd']) + # a terrible hack to prevent autoconf from caching the previous + # AC_CHECK_TARGET_TOOL result since next time we'll be looking + # for another ld variant. + $as_unset ac_cv_prog_ac_ct_TmpLd + else + LD="$TmpLd" + return + fi + done + + # Fallback AC_CHECK_TARGET_TOOL([LD], [ld]) - fi + # This isn't entirely safe since $LD may have been discovered to be + $ ld.gold, but what else can we do? + if test "x$LD_NO_GOLD" = "x"; then LD_NO_GOLD=$LD; fi + } + + if test "x$enable_ld_override" = "xyes"; then + find_ld + else + AC_CHECK_TARGET_TOOL([LD], [ld]) + if test "x$LD_NO_GOLD" = "x"; then LD_NO_GOLD=$LD; fi + fi - CHECK_LD_COPY_BUG([$1]) + CHECK_LD_COPY_BUG([$1]) ]) # LocalWords: fi |