summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Gamari <ben@smart-cactus.org>2021-07-25 16:46:48 -0400
committerMarge Bot <ben+marge-bot@smart-cactus.org>2021-09-23 16:00:18 -0400
commitee7bdc5c96d469092b5e2751cfeecfe9cd5a5495 (patch)
treeeefed43afb96a70def56c2925985dbb3f9349ab8
parentf48d747dd647111b2e78679eaf572006908a7a5a (diff)
downloadhaskell-ee7bdc5c96d469092b5e2751cfeecfe9cd5a5495.tar.gz
configure: Add check for whether CC supports --target
-rw-r--r--configure.ac6
-rw-r--r--distrib/configure.ac.in4
-rw-r--r--m4/fp_cc_supports_target.m433
3 files changed, 42 insertions, 1 deletions
diff --git a/configure.ac b/configure.ac
index c8ef451e5d..4ebd8f45ea 100644
--- a/configure.ac
+++ b/configure.ac
@@ -785,7 +785,7 @@ dnl If gcc, make sure it's at least 4.7
dnl
FP_GCC_VERSION
-dnl ** See whether gcc supports -no-pie
+dnl ** See whether cc supports -no-pie
FP_GCC_SUPPORTS_NO_PIE
dnl ** Used to determine how to compile ghc-prim's atomics.c, used by
@@ -809,6 +809,10 @@ FPTOOLS_SET_C_LD_FLAGS([target],[CONF_CC_OPTS_STAGE1],[CONF_GCC_LINKER_OPTS_STAG
FPTOOLS_SET_C_LD_FLAGS([target],[CONF_CC_OPTS_STAGE2],[CONF_GCC_LINKER_OPTS_STAGE2],[CONF_LD_LINKER_OPTS_STAGE2],[CONF_CPP_OPTS_STAGE2])
# Stage 3 won't be supported by cross-compilation
+dnl ** See whether cc supports --target=<triple> and set
+dnl CONF_CC_OPTS_STAGE[12] accordingly.
+FP_CC_SUPPORTS_TARGET
+
# See rules/distdir-way-opts.mk for details.
# Flags passed to the C compiler
AC_SUBST(CONF_CC_OPTS_STAGE0)
diff --git a/distrib/configure.ac.in b/distrib/configure.ac.in
index dfc06e5a43..a1abed4b03 100644
--- a/distrib/configure.ac.in
+++ b/distrib/configure.ac.in
@@ -168,6 +168,10 @@ dnl May need to use gcc to find platform details.
dnl --------------------------------------------------------------
FPTOOLS_SET_HASKELL_PLATFORM_VARS
+dnl ** See whether cc supports --target=<triple> and set
+dnl CONF_CC_OPTS_STAGE[12] accordingly.
+FP_CC_SUPPORTS_TARGET
+
dnl TargetWordSize for settings file
AC_CHECK_SIZEOF(void *, 4)
if test "x$ac_cv_sizeof_void_p" = "x0"; then
diff --git a/m4/fp_cc_supports_target.m4 b/m4/fp_cc_supports_target.m4
new file mode 100644
index 0000000000..b99b5bf194
--- /dev/null
+++ b/m4/fp_cc_supports_target.m4
@@ -0,0 +1,33 @@
+# FP_CC_SUPPORTS_TARGET
+# ---------------------
+# Does CC support the --target=<triple> option? If so, we should pass it
+# whenever possible to avoid ambiguity and potential compile-time errors (e.g.
+# see #20162).
+#
+# The primary effect of this is updating CONF_CC_OPTS_STAGE[12] to
+# explicitly ask the compiler to generate code for the $TargetPlatform.
+AC_DEFUN([FP_CC_SUPPORTS_TARGET],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([FPTOOLS_SET_PLATFORM_VARS])
+ AC_MSG_CHECKING([whether $1 CC supports --target])
+ echo 'int main() { return 0; }' > conftest.c
+ if $CC --target=$LlvmTarget -Werror conftest.c > /dev/null ; then
+ CONF_CC_SUPPORTS_TARGET=YES
+ AC_MSG_RESULT([yes])
+ else
+ CONF_CC_SUPPORTS_TARGET=NO
+ AC_MSG_RESULT([no])
+ fi
+ rm -f conftest.c conftest
+
+ if test $CONF_CC_SUPPORTS_TARGET = YES ; then
+ CONF_CC_OPTS_STAGE1="--target=$LlvmTarget $CONF_CC_OPTS_STAGE1"
+ CONF_CC_OPTS_STAGE2="--target=$LlvmTarget $CONF_CC_OPTS_STAGE2"
+ CONF_CXX_OPTS_STAGE1="--target=$LlvmTarget $CONF_CXX_OPTS_STAGE1"
+ CONF_CXX_OPTS_STAGE2="--target=$LlvmTarget $CONF_CXX_OPTS_STAGE2"
+ CONF_GCC_LINKER_OPTS_STAGE1="--target=$LlvmTarget $CONF_GCC_LINKER_OPTS_STAGE1"
+ CONF_GCC_LINKER_OPTS_STAGE2="--target=$LlvmTarget $CONF_GCC_LINKER_OPTS_STAGE2"
+ fi
+])
+