http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56896
Bug #: 56896 Summary: Missing DIR_SEPARATOR if --with-gxx-include-dir configured as subdir of sysroot Classification: Unclassified Product: gcc Version: 4.9.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ AssignedTo: unassig...@gcc.gnu.org ReportedBy: rmansfi...@qnx.com If gcc is configured with --with-sysroot=<path> and --with-gxx-include-dir=<path>/<subpath> then gcc_gxx_include_dir will end up as a relative path, and then incpath.c will trip the trailing sysroot DIR_SEPARATOR and construct an invalid path. e.g. ~/gnu/gcc/trunk/tmp/gcc$ ./xgcc -v Using built-in specs. COLLECT_GCC=./xgcc Target: x86_64-unknown-linux-gnu Configured with: ../configure --enable-languages=c++ --disable-bootstrap --with-gxx-include-dir=/home/ryan/foo/bar/usr/include/4.9.0 --with-sysroot=/home/ryan/foo/bar/ Thread model: posix gcc version 4.9.0 20130409 (experimental) [trunk revision 197644] (GCC) ## --------- ## ## Platform. ## ~/gnu/gcc/trunk/tmp$ grep -nr gcc_gxx_include_dir * gcc/Makefile:623:gcc_gxx_include_dir = usr/include/4.9.0 gcc/Makefile:624:gcc_gxx_include_dir_add_sysroot = 1 gcc/Makefile:1108: "gxx_include_dir=$(gcc_gxx_include_dir)" \ gcc/Makefile:4055: -DGPLUSPLUS_INCLUDE_DIR=\"$(gcc_gxx_include_dir)\" \ gcc/Makefile:4056: -DGPLUSPLUS_INCLUDE_DIR_ADD_SYSROOT=$(gcc_gxx_include_dir_add_sysroot) \ gcc/Makefile:4057: -DGPLUSPLUS_TOOL_INCLUDE_DIR=\"$(gcc_gxx_include_dir)/$(target_noncanonical)\" \ gcc/Makefile:4058: -DGPLUSPLUS_BACKWARD_INCLUDE_DIR=\"$(gcc_gxx_include_dir)/backward\" \ gcc/config.log:6339:gcc_gxx_include_dir='usr/include/4.9.0' gcc/config.log:6340:gcc_gxx_include_dir_add_sysroot='1' gcc/config.status:682:S["gcc_gxx_include_dir_add_sysroot"]="1" gcc/config.status:683:S["gcc_gxx_include_dir"]="usr/include/4.9.0" ~/gnu/gcc/trunk/tmp/gcc$ ./xgcc -B. ~/hw.cc -v Reading specs from ./specs COLLECT_GCC=./xgcc COLLECT_LTO_WRAPPER=./lto-wrapper Target: x86_64-unknown-linux-gnu Configured with: ../configure --enable-languages=c++ --disable-bootstrap --with-gxx-include-dir=/home/ryan/foo/bar/usr/include/4.9.0 --with-sysroot=/home/ryan/foo/bar/ Thread model: posix gcc version 4.9.0 20130409 (experimental) [trunk revision 197644] (GCC) COLLECT_GCC_OPTIONS='-B' '.' '-v' '-mtune=generic' '-march=x86-64' ./cc1plus -quiet -v -iprefix /home/ryan/gnu/gcc/trunk/tmp/gcc/../lib/gcc/x86_64-unknown-linux-gnu/4.9.0/ -isystem ./include -isystem ./include-fixed -D_GNU_SOURCE /home/ryan/hw.cc -quiet -dumpbase hw.cc -mtune=generic -march=x86-64 -auxbase hw -version -o /tmp/cclOMQFL.s GNU C++ (GCC) version 4.9.0 20130409 (experimental) [trunk revision 197644] (x86_64-unknown-linux-gnu) compiled by GNU C version 4.7.2, GMP version 5.0.2, MPFR version 3.1.0-p3, MPC version 0.9 GGC heuristics: --param ggc-min-expand=30 --param ggc-min-heapsize=4096 ignoring nonexistent directory "/home/ryan/gnu/gcc/trunk/tmp/gcc/../lib/gcc/x86_64-unknown-linux-gnu/4.9.0/include" ignoring nonexistent directory "/home/ryan/gnu/gcc/trunk/tmp/gcc/../lib/gcc/x86_64-unknown-linux-gnu/4.9.0/include-fixed" ignoring nonexistent directory "/home/ryan/gnu/gcc/trunk/tmp/gcc/../lib/gcc/x86_64-unknown-linux-gnu/4.9.0/../../../../x86_64-unknown-linux-gnu/include" ignoring nonexistent directory "/home/ryan/foo/barusr/include/4.9.0" ignoring nonexistent directory "/home/ryan/foo/barusr/include/4.9.0/x86_64-unknown-linux-gnu" ignoring nonexistent directory "/home/ryan/foo/barusr/include/4.9.0/backward" <snip> Or: ~/gnu/gcc/trunk/tmp/gcc$ ./xgcc -B. ~/hw.cc --sysroot=/foo/bar <snip> ignoring nonexistent directory "/foo/barusr/include/4.9.0" ignoring nonexistent directory "/foo/barusr/include/4.9.0/x86_64-unknown-linux-gnu" ignoring nonexistent directory "/foo/barusr/include/4.9.0/backward" I'm not sure if the following is sufficient, or if the gcc_gxx_include_dir should never end up without a leading DIR_SEPARATOR. Index: gcc/incpath.c =================================================================== --- gcc/incpath.c (revision 197644) +++ gcc/incpath.c (working copy) @@ -179,7 +179,8 @@ char *sysroot_no_trailing_dir_separator = xstrdup (sysroot); size_t sysroot_len = strlen (sysroot); - if (sysroot_len > 0 && sysroot[sysroot_len - 1] == DIR_SEPARATOR) + if (sysroot_len > 0 && sysroot[sysroot_len - 1] == DIR_SEPARATOR + && p->fname[0] == 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);