On 25.01.2012 17:45, Joseph S. Myers wrote:
On Wed, 25 Jan 2012, Matthias Klose wrote:
This can end up in generation for dependency files, and other files parsing
the output. The solution I came up with is to check for sysroot set to '/' and
special case this in two places. Afaics, there are no other places.
I could imagine a sysroot path that isn't just '/' but ends with '/'
resulting in duplicate '/' in the middle of the path - although that's not
a correctness issue in the way that '//' at the start could be, maybe the
best check is actually for '/' at end of sysroot (in which case skip the
'/' at the start of the path within the sysroot)?
as in the attached trailing.diff? built and regression tested.
Or remove such a '/' at
end of sysroot at configure time rather than checking for it later....
that's not enough. you can pass --sysroot=/ to the driver as well. I tried that
in the attached tsr.diff, but I don't like it because the driver then pases
`-isysroot ""' to the cc*1 binaries, which looks a bit misleading.
Matthias
Index: gcc/incpath.c
===================================================================
--- gcc/incpath.c (revision 183555)
+++ gcc/incpath.c (working copy)
@@ -166,7 +166,15 @@
/* Should this directory start with the sysroot? */
if (sysroot && p->add_sysroot)
- str = concat (sysroot, p->fname, NULL);
+ {
+ char *sysroot_no_trailing_dir_separator = xstrdup (sysroot);
+ int sysroot_len = strlen (sysroot);
+
+ if (sysroot_len > 0 && sysroot[sysroot_len - 1] == DIR_SEPARATOR)
+ sysroot_no_trailing_dir_separator[sysroot_len - 1] = '\0';
+ str = concat (sysroot_no_trailing_dir_separator, p->fname, NULL);
+ free (sysroot_no_trailing_dir_separator);
+ }
else if (!p->add_sysroot && relocated
&& !filename_ncmp (p->fname, cpp_PREFIX, cpp_PREFIX_len))
{
Index: gcc/gcc.c
===================================================================
--- gcc/gcc.c (revision 183555)
+++ gcc/gcc.c (working copy)
@@ -2445,9 +2445,17 @@
if (target_system_root)
{
+ char *sysroot_no_trailing_dir_separator = xstrdup (target_system_root);
+ int sysroot_len = strlen (target_system_root);
+
+ if (sysroot_len > 0
+ && target_system_root[sysroot_len - 1] == DIR_SEPARATOR)
+ sysroot_no_trailing_dir_separator[sysroot_len - 1] = '\0';
+
if (target_sysroot_suffix)
prefix = concat (target_sysroot_suffix, prefix, NULL);
- prefix = concat (target_system_root, prefix, NULL);
+ prefix = concat (sysroot_no_trailing_dir_separator, prefix, NULL);
+ free (sysroot_no_trailing_dir_separator);
/* We have to override this because GCC's notion of sysroot
moves along with GCC. */
Index: gcc/gcc.c
===================================================================
--- gcc/gcc.c (revision 183514)
+++ gcc/gcc.c (working copy)
@@ -3417,6 +3417,12 @@
case OPT__sysroot_:
target_system_root = arg;
+ {
+ int target_system_root_len = strlen (target_system_root);
+
+ if (target_system_root[target_system_root_len - 1] == DIR_SEPARATOR)
+ target_system_root[target_system_root_len - 1] = '\0';
+ }
target_system_root_changed = 1;
do_save = false;
break;
Index: gcc/configure.ac
===================================================================
--- gcc/configure.ac (revision 183514)
+++ gcc/configure.ac (working copy)
@@ -767,7 +767,7 @@
[
case ${with_sysroot} in
yes) TARGET_SYSTEM_ROOT='${exec_prefix}/${target_noncanonical}/sys-root' ;;
- *) TARGET_SYSTEM_ROOT=$with_sysroot ;;
+ *) TARGET_SYSTEM_ROOT=`echo $with_sysroot | sed 's,/$,,'` ;;
esac
TARGET_SYSTEM_ROOT_DEFINE='-DTARGET_SYSTEM_ROOT=\"$(TARGET_SYSTEM_ROOT)\"'
@@ -1830,7 +1830,7 @@
*)
;;
esac
-elif test "x$TARGET_SYSTEM_ROOT" != x; then
+elif test "x$TARGET_SYSTEM_ROOT_DEFINE" != x; then
SYSTEM_HEADER_DIR=$build_system_header_dir
fi
@@ -4547,7 +4547,7 @@
[Define to PREFIX/include if cpp should also search that directory.])
fi
-if test x$host != x$target || test "x$TARGET_SYSTEM_ROOT" != x; then
+if test x$host != x$target || test "x$TARGET_SYSTEM_ROOT_DEFINE" != x; then
if test "x$with_headers" != x; then
target_header_dir=$with_headers
elif test "x$with_sysroot" = x; then