Hi,

At present, we have somewhat strange sysroot in that --sysroot causes -isysroot 
to be passed to cc1* ...
... but no -syslibroot for collect2/ld.
Conversely, -isysroot /XYZZY causes this to be passed as -isysroot to cc1* and 
-syslibroot to collect/ld.

AFAIU the options, it ought to be the other way around.

However (possibly to be 'compatible' with GCC) currently clang has the same 
behaviour for both -isysroot and --sysroot.

In preparation for other improvements, I want to use the --sysroot properly, so 
the following patch makes GCC's behaviour match that of clang (for the Darwin 
platform only).  TODO: is to start a joint conversation with the clang folks 
about retiring the -syslibroot from the "-isysroot" case ( but that ship might 
have sailed - this behaviour is already "in the wild" ).

checked out with x86_64-darwin12 and an i686-darwin9 X x86_64-darwin12 cross, 
where the built-in configured --with-sysroot= is correctly overridden by 
--sysroot= on the c/l.

Unfortunately, other than detecting the version of ld in use, there's no 
sensible configure mechanism to set HAVE_LD_SYSROOT, and it seems somewhat 
overkill to do that for something that's essentially a constant for the 
versions of ld that work with current GCC.

OK for trunk?
Iain

gcc/
        * config/darwin.h (TARGET_SYSTEM_ROOT): Remove this from here (use the 
mechanism ing gcc.c)
        driven by - (HAVE_LD_SYSROOT): New. (SYSROOT_SPEC): New. 
        (LINK_SYSROOT_SPEC): Revise to remove the default for target sysroot.
        (STANDARD_STARTFILE_PREFIX_1): New.
        (STANDARD_STARTFILE_PREFIX_2): New.

From 3d20de66ec2e7da5f371175253f01d0dd74dc8c0 Mon Sep 17 00:00:00 2001
From: Iain Sandoe <i...@codesourcery.com>
Date: Fri, 11 Sep 2015 23:39:35 +0100
Subject: [PATCH] [darwin] Make sysroot stuff the same as clang

---
 gcc/config/darwin.h | 19 ++++++++++++++-----
 1 file changed, 14 insertions(+), 5 deletions(-)

diff --git a/gcc/config/darwin.h b/gcc/config/darwin.h
index bb4451a..7d093c9 100644
--- a/gcc/config/darwin.h
+++ b/gcc/config/darwin.h
@@ -207,12 +207,21 @@ extern GTY(()) int darwin_ms_struct;
 #undef  LINK_GCC_C_SEQUENCE_SPEC
 #define LINK_GCC_C_SEQUENCE_SPEC "%G %L"
 
-#ifdef TARGET_SYSTEM_ROOT
-#define LINK_SYSROOT_SPEC \
-  "%{isysroot*:-syslibroot %*;:-syslibroot " TARGET_SYSTEM_ROOT "}"
-#else
+/* ld64 supports a sysroot, it just has a different name and there's no easy
+   way to check for it at config time.  */
+#undef HAVE_LD_SYSROOT
+#define HAVE_LD_SYSROOT 1
+/* It seems the only (working) way to get a space after %R is to append a
+   dangling '/'.  */
+#define SYSROOT_SPEC "%{!isysroot*:-syslibroot %R/ }"
+
+/* Do the same as clang, for now, and insert the sysroot for ld when an
+   isysroot is specified.  */
 #define LINK_SYSROOT_SPEC "%{isysroot*:-syslibroot %*}"
-#endif
+
+/* Suppress the addition of extra prefix paths when a sysroot is in use.  */
+#define STANDARD_STARTFILE_PREFIX_1 ""
+#define STANDARD_STARTFILE_PREFIX_2 ""
 
 #define DARWIN_PIE_SPEC "%{fpie|pie|fPIE:}"
 
-- 
2.2.1


Reply via email to