AC_MSG_WARN([I'm assuming you wanted to build for i386-unknown-mingw32])
exit 1
;;
- *-unknown-mingw32)
+ # examples: i386-unknown-mingw32, i686-w64-mingw32, x86_64-w64-mingw32
+ *-mingw32)
windows=YES
$2='.exe'
$3='.dll'
;;
- i386-apple-darwin|powerpc-apple-darwin)
- $3='.dylib'
- ;;
- x86_64-apple-darwin)
- $3='.dylib'
- ;;
- arm-apple-darwin10|i386-apple-darwin11|aarch64-apple-darwin14|x86_64-apple-darwin14)
- $2='.a'
+ # apple platform uses .dylib (macOS, iOS, ...)
+ *-apple-*)
$3='.dylib'
;;
esac
TargetVendor_CPP=` echo "$TargetVendor" | sed -e 's/\./_/g' -e 's/-/_/g'`
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"`
+
echo "GHC build : $BuildPlatform"
echo "GHC host : $HostPlatform"
echo "GHC target : $TargetPlatform"
+ echo "LLVM target: $target"
AC_SUBST(BuildPlatform)
AC_SUBST(HostPlatform)
AC_SUBST(HostOS_CPP)
AC_SUBST(BuildOS_CPP)
AC_SUBST(TargetOS_CPP)
+ AC_SUBST(LLVMTarget_CPP)
AC_SUBST(HostVendor_CPP)
AC_SUBST(BuildVendor_CPP)
checkVendor() {
case [$]1 in
- dec|unknown|hp|apple|next|sun|sgi|ibm|montavista|portbld)
+ dec|none|unknown|hp|apple|next|sun|sgi|ibm|montavista|portbld)
;;
*)
- echo "Unknown vendor [$]1"
- exit 1
+ AC_MSG_WARN([Unknown vendor [$]1])
;;
esac
}
checkOS() {
case [$]1 in
- linux)
+ linux|linux-android)
test -z "[$]2" || eval "[$]2=OSLinux"
;;
- ios)
- test -z "[$]2" || eval "[$]2=OSiOS"
- ;;
- darwin)
+ darwin|ios)
test -z "[$]2" || eval "[$]2=OSDarwin"
;;
solaris2)
aix)
test -z "[$]2" || eval "[$]2=OSAIX"
;;
- linux-android)
- test -z "[$]2" || eval "[$]2=OSAndroid"
- ;;
*)
echo "Unknown OS '[$]1'"
exit 1
dnl so we empty CFLAGS while running this test
CFLAGS2="$CFLAGS"
CFLAGS=
+ case $TargetArch in
+ arm)
+ dnl See #13937.
+ progbits="%progbits"
+ ;;
+ *)
+ progbits="@progbits"
+ ;;
+ esac
AC_MSG_CHECKING(for GNU non-executable stack support)
AC_COMPILE_IFELSE(
- [AC_LANG_PROGRAM([__asm__ (".section .note.GNU-stack,\"\",@progbits");], [0])],
+ [AC_LANG_PROGRAM([__asm__ (".section .note.GNU-stack,\"\",$progbits");], [0])],
[AC_MSG_RESULT(yes)
HaskellHaveGnuNonexecStack=True],
[AC_MSG_RESULT(no)
defined(__ARM_ARCH_6T2__) || \
defined(__ARM_ARCH_6Z__) || \
defined(__ARM_ARCH_6ZK__) || \
+ defined(__ARM_ARCH_6K__) || \
+ defined(__ARM_ARCH_6KZ__) || \
defined(__ARM_ARCH_6M__)
return 0;
#else
# Set the variables used in the settings file
AC_DEFUN([FP_SETTINGS],
[
- SettingsCCompilerCommand="$CC"
- SettingsHaskellCPPCommand="$HaskellCPPCmd"
- SettingsHaskellCPPFlags="$HaskellCPPArgs"
- SettingsLdCommand="$LdCmd"
- SettingsArCommand="$ArCmd"
- SettingsPerlCommand="$PerlCmd"
-
- if test -z "$DllWrap"
+ if test "$windows" = YES -a "$EnableDistroToolchain" = "NO"
then
- SettingsDllWrapCommand="/bin/false"
- else
- SettingsDllWrapCommand="$DllWrap"
- fi
-
- if test -z "$Windres"
+ mingw_bin_prefix=mingw/bin/
+ SettingsCCompilerCommand="\$topdir/../${mingw_bin_prefix}gcc.exe"
+ SettingsHaskellCPPCommand="\$topdir/../${mingw_bin_prefix}gcc.exe"
+ SettingsHaskellCPPFlags="$HaskellCPPArgs"
+ SettingsLdCommand="\$topdir/../${mingw_bin_prefix}ld.exe"
+ SettingsArCommand="\$topdir/../${mingw_bin_prefix}ar.exe"
+ SettingsRanlibCommand="\$topdir/../${mingw_bin_prefix}ranlib.exe"
+ SettingsPerlCommand='$topdir/../perl/perl.exe'
+ SettingsDllWrapCommand="\$topdir/../${mingw_bin_prefix}dllwrap.exe"
+ SettingsWindresCommand="\$topdir/../${mingw_bin_prefix}windres.exe"
+ SettingsTouchCommand='$topdir/bin/touchy.exe'
+ elif test "$EnableDistroToolchain" = "YES"
then
- SettingsWindresCommand="/bin/false"
+ SettingsCCompilerCommand="$(basename $CC)"
+ SettingsCCompilerFlags="$CONF_CC_OPTS_STAGE2"
+ SettingsHaskellCPPCommand="$(basename $HaskellCPPCmd)"
+ SettingsHaskellCPPFlags="$HaskellCPPArgs"
+ SettingsLdCommand="$(basename $LdCmd)"
+ SettingsArCommand="$(basename $ArCmd)"
+ SettingsPerlCommand="$(basename $PerlCmd)"
+ SettingsDllWrapCommand="$(basename $DllWrapCmd)"
+ SettingsWindresCommand="$(basename $WindresCmd)"
+ SettingsTouchCommand='$topdir/bin/touchy.exe'
else
- SettingsWindresCommand="$Windres"
+ SettingsCCompilerCommand="$CC"
+ SettingsHaskellCPPCommand="$HaskellCPPCmd"
+ SettingsHaskellCPPFlags="$HaskellCPPArgs"
+ SettingsLdCommand="$LdCmd"
+ SettingsArCommand="$ArCmd"
+ SettingsRanlibCommand="$RanlibCmd"
+ SettingsPerlCommand="$PerlCmd"
+ if test -z "$DllWrapCmd"
+ then
+ SettingsDllWrapCommand="/bin/false"
+ else
+ SettingsDllWrapCommand="$DllWrapCmd"
+ fi
+ if test -z "$WindresCmd"
+ then
+ SettingsWindresCommand="/bin/false"
+ else
+ SettingsWindresCommand="$WindresCmd"
+ fi
+ SettingsTouchCommand='touch'
fi
-
- if test -z "$Libtool"
+ if test -z "$LibtoolCmd"
then
- SettingsLibtoolCommand="libtool"
+ SettingsLibtoolCommand="libtool"
else
- SettingsLibtoolCommand="$Libtool"
+ SettingsLibtoolCommand="$LibtoolCmd"
fi
-
- if test -z "$Touch"
+ if test -z "$ClangCmd"
then
- SettingsTouchCommand='touch'
+ SettingsClangCommand="clang"
else
- SettingsTouchCommand='$Touch'
+ SettingsClangCommand="$ClangCmd"
fi
-
if test -z "$LlcCmd"
then
SettingsLlcCommand="llc"
else
SettingsLlcCommand="$LlcCmd"
fi
-
if test -z "$OptCmd"
then
SettingsOptCommand="opt"
else
SettingsOptCommand="$OptCmd"
fi
-
SettingsCCompilerFlags="$CONF_CC_OPTS_STAGE2"
SettingsCCompilerLinkFlags="$CONF_GCC_LINKER_OPTS_STAGE2"
SettingsCCompilerSupportsNoPie="$CONF_GCC_SUPPORTS_NO_PIE"
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)
])
# FPTOOLS_SET_C_LD_FLAGS
# ----------------------------------
-# Set the C, LD and CPP flags for a given platform
+# Set the C, LD and CPP flags for a given platform.
# $1 is the platform
# $2 is the name of the CC flags variable
# $3 is the name of the linker flags variable when linking with gcc
i386-portbld-freebsd*)
$2="$$2 -march=i686"
;;
- i386-apple-darwin)
- $2="$$2 -m32"
- $3="$$3 -m32"
- $4="$$4 -arch i386"
- $5="$$5 -m32"
- ;;
- x86_64-apple-darwin)
- $2="$$2 -m64"
- $3="$$3 -m64"
- $4="$$4 -arch x86_64"
- $5="$$5 -m64"
- ;;
x86_64-unknown-solaris2)
$2="$$2 -m64"
$3="$$3 -m64"
;;
arm*linux*)
# On arm/linux and arm/android, tell gcc to generate Arm
- # instructions (ie not Thumb) and to link using the gold linker.
- # Forcing LD to be ld.gold is done in FIND_LD m4 macro.
+ # instructions (ie not Thumb).
$2="$$2 -marm"
- $3="$$3 -fuse-ld=gold -Wl,-z,noexecstack"
+ $3="$$3 -Wl,-z,noexecstack"
$4="$$4 -z noexecstack"
;;
aarch64*linux*)
- # On aarch64/linux and aarch64/android, tell gcc to link using the
- # gold linker.
- # Forcing LD to be ld.gold is done in FIND_LD m4 macro.
- $3="$$3 -fuse-ld=gold -Wl,-z,noexecstack"
+ $3="$$3 -Wl,-z,noexecstack"
$4="$$4 -z noexecstack"
;;
x86_64-*-openbsd*)
# We need -z wxneeded at least to link ghc-stage2 to workaround
# W^X issue in GHCi on OpenBSD current (as of Aug 2016)
- $3="$$3 -Wl,-zwxneeded"
+ $3="$$3 -Wl,-z,wxneeded"
$4="$$4 -z wxneeded"
;;
])
-# FP_ARG_WITH_PATH_GNU_PROG_GENERAL
-# --------------------
-# Find the specified command on the path or allow a user to set it manually
-# with a --with-<command> option.
-#
-# This is ignored on the mingw32 platform.
-#
-# $1 = the variable to set
-# $2 = the with option name
-# $3 = the command to look for
-# $4 = prepend target to program name? if 'no', use the name unchanged
-# $5 = optional? if 'no', then raise an error if the command isn't found
-#
-AC_DEFUN([FP_ARG_WITH_PATH_GNU_PROG_GENERAL],
-[
-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
-
- # Remember that we set this manually. Used to override CC_STAGE0
- # and friends later, if we are not cross-compiling.
- With_$2=$withval
-],
-[
- if test "$HostOS" != "mingw32"
- then
- if test "$4" = "no" -o "$target_alias" = "" ; then
- AC_PATH_PROG([$1], [$3])
- else
- AC_PATH_PROG([$1], [$target_alias-$3])
- fi
- if test "$5" = "no" -a -z "$$1"
- then
- AC_MSG_ERROR([cannot find $3 in your PATH])
- fi
- fi
-]
-)
-]) # FP_ARG_WITH_PATH_GNU_PROG_GENERAL
-
-
-# FP_ARG_WITH_PATH_GNU_PROG
-# --------------------
-# The usual case: prepend the target, and the program is not optional.
-AC_DEFUN([FP_ARG_WITH_PATH_GNU_PROG],
-[FP_ARG_WITH_PATH_GNU_PROG_GENERAL([$1], [$2], [$3], [yes], [no])])
-
-# FP_ARG_WITH_PATH_GNU_PROG_OPTIONAL
-# --------------------
-# Same as FP_ARG_WITH_PATH_GNU_PROG but no error will be thrown if the command
-# isn't found.
-AC_DEFUN([FP_ARG_WITH_PATH_GNU_PROG_OPTIONAL],
-[FP_ARG_WITH_PATH_GNU_PROG_GENERAL([$1], [$2], [$3], [yes], [yes])])
-
-# FP_ARG_WITH_PATH_GNU_PROG_OPTIONAL_NOTARGET
-# --------------------
-# Same as FP_ARG_WITH_PATH_GNU_PROG_OPTIONAL but don't prepend the target name
-# (used for LLVM).
-AC_DEFUN([FP_ARG_WITH_PATH_GNU_PROG_OPTIONAL_NOTARGET],
-[FP_ARG_WITH_PATH_GNU_PROG_GENERAL([$1], [$2], [$3], [no], [yes])])
-
-
# FP_PROG_CONTEXT_DIFF
# --------------------
# Figure out how to do context diffs. Sets the output variable ContextDiffCmd.
# 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?!?
-case $HostPlatform in
-*openbsd*) # x86 openbsd is ELF from 3.4 >, meaning no leading uscore
- case $build in
- i386-*2\.@<:@0-9@:>@ | i386-*3\.@<:@0-3@:>@ ) fptools_cv_leading_underscore=yes ;;
- *) fptools_cv_leading_underscore=no ;;
- esac ;;
-i386-unknown-mingw32) fptools_cv_leading_underscore=yes;;
-x86_64-unknown-mingw32) fptools_cv_leading_underscore=no;;
-
- # HACK: Apple doesn't seem to provide nlist in the 64-bit-libraries
-x86_64-apple-darwin*) fptools_cv_leading_underscore=yes;;
-*-apple-ios) fptools_cv_leading_underscore=yes;;
-
-*) AC_RUN_IFELSE([AC_LANG_SOURCE([[#ifdef HAVE_NLIST_H
+case $TargetPlatform in
+ # Apples mach-o platforms use leading underscores
+ *-apple-*) fptools_cv_leading_underscore=yes;;
+ *linux-android*) fptools_cv_leading_underscore=no;;
+ *openbsd*) # x86 openbsd is ELF from 3.4 >, meaning no leading uscore
+ case $build in
+ i386-*2\.@<:@0-9@:>@ | i386-*3\.@<:@0-3@:>@ ) fptools_cv_leading_underscore=yes ;;
+ *) fptools_cv_leading_underscore=no ;;
+ esac ;;
+ i386-unknown-mingw32) fptools_cv_leading_underscore=yes;;
+ x86_64-unknown-mingw32) fptools_cv_leading_underscore=no;;
+ *) AC_RUN_IFELSE([AC_LANG_SOURCE([[#ifdef HAVE_NLIST_H
#include <nlist.h>
struct nlist xYzzY1[] = {{"xYzzY1", 0},{0}};
struct nlist xYzzY2[] = {{"_xYzzY2", 0},{0}};
# -----------------
# 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],
-[
+AC_DEFUN([FP_PROG_LD_IS_GNU],[
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
+[[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_cv_gnu_ld=NO
+fi]])
+AC_SUBST([LdIsGNULd],["$fp_cv_gnu_ld"])
])# FP_PROG_LD_IS_GNU
# ----------
# Sets fp_prog_ar to a path to ar. Exits if no ar can be found
AC_DEFUN([FP_PROG_AR],
-[AC_PATH_PROG([fp_prog_ar], [ar])
+[if test -z "$fp_prog_ar"; then
+ AC_PATH_PROG([fp_prog_ar], [ar])
+fi
if test -z "$fp_prog_ar"; then
AC_MSG_ERROR([cannot find ar in your PATH, no idea how to make a library])
fi
fi
fi])
fp_prog_ar_args=$fp_cv_prog_ar_args
+if test "$HostOS" != "mingw32"; then
+ ArCmd = "$(cygpath -m $ArCmd)"
+fi
AC_SUBST([ArCmd], ["$fp_prog_ar"])
AC_SUBST([ArArgs], ["$fp_prog_ar_args"])
if test $fp_prog_ar_is_gnu = yes
then
fp_cv_prog_ar_needs_ranlib=no
- elif test "$TargetOS_CPP" = "darwin"
+ elif test "$TargetVendor_CPP" = "apple"
then
# It's quite tedious to check for Apple's crazy timestamps in
# .a files, so we hardcode it.
AC_REQUIRE([AC_PROG_CC])
AC_MSG_CHECKING([whether GCC supports -no-pie])
echo 'int main() { return 0; }' > conftest.c
- if ${CC-cc} -o conftest -no-pie conftest.c > /dev/null 2>&1; then
+ # 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
CONF_GCC_SUPPORTS_NO_PIE=YES
AC_MSG_RESULT([yes])
else
dnl * Deal with arguments telling us curses is somewhere odd
dnl--------------------------------------------------------------------
- AC_ARG_WITH([curses-includes],
- [AC_HELP_STRING([--with-curses-includes],
- [directory containing curses headers])],
- [CURSES_INCLUDE_DIRS=$withval])
-
AC_ARG_WITH([curses-libraries],
[AC_HELP_STRING([--with-curses-libraries],
[directory containing curses libraries])],
# --------------------------------
# converts os from gnu to ghc naming, and assigns the result to $target_var
AC_DEFUN([GHC_CONVERT_OS],[
-case "$1-$2" in
- darwin10-arm|darwin11-i386|darwin14-aarch64|darwin14-x86_64)
- $3="ios"
- ;;
- *)
case "$1" in
+ # watchos and tvos are ios variants as of May 2017.
+ ios|watchos|tvos)
+ $3="ios"
+ ;;
linux-android*)
$3="linux-android"
;;
aix*) # e.g. powerpc-ibm-aix7.1.3.0
$3="aix"
;;
+ darwin*) # e.g. aarch64-apple-darwin14
+ $3="darwin"
+ ;;
freebsd*) # like i686-gentoo-freebsd7
# i686-gentoo-freebsd8
# i686-gentoo-freebsd8.2
exit 1
;;
esac
- ;;
- esac
])
# BOOTSTRAPPING_GHC_INFO_FIELD
# --------------------------------
# Gets the version number of XCode, if on a Mac
AC_DEFUN([XCODE_VERSION],[
- if test "$TargetOS_CPP" = "darwin"
+ if test "$TargetVendor_CPP" = "apple"
then
AC_MSG_CHECKING(XCode version)
XCodeVersion=`xcodebuild -version | grep Xcode | sed "s/Xcode //"`
# are installed with a version suffix (e.g., llc-3.1).
#
# $1 = the variable to set
-# $2 = the with option name
-# $3 = the command to look for
-# $4 = the version of the command to look for
+# $2 = the command to look for
+# $3 = the version of the command to look for
#
AC_DEFUN([FIND_LLVM_PROG],[
- # Test for program with version name.
- FP_ARG_WITH_PATH_GNU_PROG_OPTIONAL_NOTARGET([$1], [$2], [$3-$4])
- if test -z "$$1"; then
- # Test for program without version name.
- FP_ARG_WITH_PATH_GNU_PROG_OPTIONAL_NOTARGET([$1], [$2], [$3])
- if test -n "$$1"; then
- AC_MSG_CHECKING([$$1 is version $4])
- if test `$$1 --version | grep -c "version $4"` -gt 0 ; then
- AC_MSG_RESULT(yes)
- else
- AC_MSG_RESULT(no)
- $1=""
- fi
+ # Test for program with and without version name.
+ 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
+ AC_MSG_RESULT(yes)
+ else
+ AC_MSG_RESULT(no)
+ $1=""
fi
fi
])
-# FIND_LD
-# Find the version of `ld` to use. This is used in both in the top level
-# configure.ac and in distrib/configure.ac.in.
+# CHECK_LD_COPY_BUG()
+# -------------------
+# Check for binutils bug #16177 present in some versions of the bfd ld
+# implementation affecting ARM relocations.
+# https://sourceware.org/bugzilla/show_bug.cgi?id=16177
#
-# $1 = the variable to set
+# $1 = the platform
#
-AC_DEFUN([FIND_LD],[
- FP_ARG_WITH_PATH_GNU_PROG([LD], [ld], [ld])
- case $target in
- arm*linux* | \
- aarch64*linux* )
- # Arm and Aarch64 requires use of the binutils ld.gold linker.
- # This case should catch at least arm-unknown-linux-gnueabihf,
- # arm-linux-androideabi, arm64-unknown-linux and
- # aarch64-linux-android
- FP_ARG_WITH_PATH_GNU_PROG([LD_GOLD], [ld.gold], [ld.gold])
- $1="$LD_GOLD"
- ;;
- *)
- $1="$LD"
- ;;
+AC_DEFUN([CHECK_LD_COPY_BUG],[
+ case $1 in
+ arm*linux*)
+ AC_CHECK_TARGET_TOOL([READELF], [readelf])
+ AC_CHECK_TARGET_TOOL([AS], [as])
+ AC_MSG_CHECKING([for ld bug 16177])
+ cat >actest.s <<-EOF
+ .globl _start
+ .p2align 4
+ _start:
+ bkpt
+
+ .data
+ .globl data_object
+ object_reference:
+ .long data_object
+ .size object_reference, 4
+EOF
+
+ cat >aclib.s <<-EOF
+ .data
+ .globl data_object
+ .type data_object, %object
+ .size data_object, 4
+ data_object:
+ .long 123
+EOF
+
+ $AS -o aclib.o aclib.s
+ $LD -shared -o aclib.so aclib.o
+
+ $AS -o actest.o actest.s
+ $LD -o actest actest.o aclib.so
+
+ if $READELF -r actest | grep R_ARM_COPY > /dev/null; then
+ AC_MSG_RESULT([affected])
+ AC_MSG_ERROR(
+ [Your linker is affected by binutils #16177, which
+ critically breaks linkage of GHC objects. Please either upgrade
+ binutils or supply a different linker with the LD environment
+ variable.])
+ else
+ AC_MSG_RESULT([unaffected])
+ fi
+
+ rm -f aclib.s aclib.o aclib.so actest.s actest.o actest
+ ;;
+ *)
+ ;;
esac
])
# sets CPP command and its arguments
#
# $1 = the variable to set to CPP command
-# $2 = the varibale to set to CPP command arguments
+# $2 = the variable to set to CPP command arguments
AC_DEFUN([FP_CPP_CMD_WITH_ARGS],[
dnl ** what cpp to use?
)
])
+
+# FP_CC_LINKER_FLAG_TRY()
+# --------------------
+# Try a particular linker to see whether we can use it. In particular, determine
+# whether we can convince gcc to use it via a -fuse-ld=... flag.
+#
+# $1 = the name of the linker to try
+# $2 = the variable to set with the appropriate GHC flag if the linker is
+# found to be usable
+AC_DEFUN([FP_CC_LINKER_FLAG_TRY], [
+ AC_MSG_CHECKING([whether C compiler supports -fuse-ld=$1])
+ echo 'int main(void) {return 0;}' > conftest.c
+ if $CC -o conftest.o -fuse-ld=$1 conftest.c > /dev/null 2>&1
+ then
+ $2="-fuse-ld=$1"
+ AC_MSG_RESULT([yes])
+ else
+ AC_MSG_RESULT([no])
+ fi
+ rm -f conftest.c conftest.o
+])
+
+# FIND_LD
+# ---------
+# Find the version of `ld` to use and figure out how to get gcc to use it for
+# linking (if --enable-ld-override is enabled). This is used in both in the top
+# level configure.ac and in distrib/configure.ac.in.
+#
+# $1 = the platform
+# $2 = the variable to set with GHC options to configure gcc to use the chosen linker
+#
+AC_DEFUN([FIND_LD],[
+ AC_ARG_ENABLE(ld-override,
+ [AC_HELP_STRING([--disable-ld-override],
+ [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]])],
+ [],
+ [enable_ld_override=yes])
+
+ if test "x$enable_ld_override" = "xyes"; then
+ TmpLd="$LD" # In case the user set LD
+ AC_CHECK_TARGET_TOOLS([TmpLd], [ld.lld ld.gold 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'])
+ AC_CHECK_TARGET_TOOL([LD], [ld])
+ else
+ LD="$TmpLd"
+ fi
+ else
+ AC_CHECK_TARGET_TOOL([LD], [ld])
+ fi
+
+ CHECK_LD_COPY_BUG([$1])
+])
+
# LocalWords: fi