Prevent paths relative to sysroot directory from being transformed to Windows 
form with MSYS prefix.

Second attempt:
Moved most changes to x-mingw32. Only thing added to Makefile.in are new 
variables to ease overriding in included file.
Disabled overriding standard lib and include paths (with /mingw/lib and 
/mingw/include) in mingw32.h when TARGET_SYSTEM_ROOT is defined.

Side notes:

I've tested the patch together with patches from 
github.com/Alexpux/MINGW-packages. One of those patches disables overriding 
NATIVE_SYSTEM_HEADER_DIR in config scripts, so it's complement to this patch.

Target s-selftest in gcc fails on MinGW:
/home/tadek/gcc/gcc-build-mingw32-sysroot/./gcc/xgcc 
-B/home/tadek/gcc/gcc-build-mingw32-sysroot/./gcc/ -xc -S -c /dev/null 
-fself-test
cc1.exe: fatal error: input file 'nul.s' is the same as output file
It's enough to specify any output file, like '-o self-test-result.s' to fix the 
issue. Specifying '-o /dev/null' works as well, but I'm not sure if it's safe 
on all systems. It's a topic for separate patch.

Manual at "https://gcc.gnu.org/install/configure.html"; does mention that path specified with|--with-native-system-header-dir is located within sysroot, but it fails to mention that the same applies to ||--with-local-prefix. Changelog: 2016-10-08 Tadek Kijkowski <tkijkow...@gmail.com> * gcc/Makefile.in, gcc/config/i386/x-mingw32: |Fix sysroot relative paths for MinGW
        * gcc/config/i386/mingw32.h: Disable overriding default library and 
include paths when sysroot is defined

Index: gcc/Makefile.in
===================================================================
--- gcc/Makefile.in     (revision 240805)
+++ gcc/Makefile.in     (working copy)
@@ -680,6 +680,15 @@
 exeext = @host_exeext@
 build_exeext = @build_exeext@
+
+# This allows overriding include paths in host specific Makefile
+# (config/i386/x-mingw32 overrides those variables and local_includedir).
+gplusplus_includedir = $(gcc_gxx_include_dir)
+gplusplus_tool_includedir = $(gcc_gxx_include_dir)/$(target_noncanonical)
+gplusplus_backward_includedir = $(gcc_gxx_include_dir)/backward
+native_system_includedir = $(NATIVE_SYSTEM_HEADER_DIR)
+
+
 # Directory in which to put man pages.
 mandir = @mandir@
 man1dir = $(mandir)/man1
@@ -2757,14 +2766,14 @@
 PREPROCESSOR_DEFINES = \
   -DGCC_INCLUDE_DIR=\"$(libsubdir)/include\" \
   -DFIXED_INCLUDE_DIR=\"$(libsubdir)/include-fixed\" \
-  -DGPLUSPLUS_INCLUDE_DIR=\"$(gcc_gxx_include_dir)\" \
+  -DGPLUSPLUS_INCLUDE_DIR=\"$(gplusplus_includedir)\" \
   -DGPLUSPLUS_INCLUDE_DIR_ADD_SYSROOT=$(gcc_gxx_include_dir_add_sysroot) \
-  
-DGPLUSPLUS_TOOL_INCLUDE_DIR=\"$(gcc_gxx_include_dir)/$(target_noncanonical)\" \
-  -DGPLUSPLUS_BACKWARD_INCLUDE_DIR=\"$(gcc_gxx_include_dir)/backward\" \
+  -DGPLUSPLUS_TOOL_INCLUDE_DIR=\"$(gplusplus_tool_includedir)\" \
+  -DGPLUSPLUS_BACKWARD_INCLUDE_DIR=\"$(gplusplus_backward_includedir)\" \
   -DLOCAL_INCLUDE_DIR=\"$(local_includedir)\" \
   -DCROSS_INCLUDE_DIR=\"$(CROSS_SYSTEM_HEADER_DIR)\" \
   -DTOOL_INCLUDE_DIR=\"$(gcc_tooldir)/include\" \
-  -DNATIVE_SYSTEM_HEADER_DIR=\"$(NATIVE_SYSTEM_HEADER_DIR)\" \
+  -DNATIVE_SYSTEM_HEADER_DIR=\"$(native_system_includedir)\" \
   -DPREFIX=\"$(prefix)/\" \
   -DSTANDARD_EXEC_PREFIX=\"$(libdir)/gcc/\" \
   @TARGET_SYSTEM_ROOT_DEFINE@
Index: gcc/config/i386/mingw32.h
===================================================================
--- gcc/config/i386/mingw32.h   (revision 240805)
+++ gcc/config/i386/mingw32.h   (working copy)
@@ -157,6 +161,8 @@
     fvtable-verify=std:vtv_end.o%s} \
   crtend.o%s"
+#if !defined(TARGET_SYSTEM_ROOT)
+
 /* Override startfile prefix defaults.  */
 #ifndef STANDARD_STARTFILE_PREFIX_1
 #define STANDARD_STARTFILE_PREFIX_1 "/mingw/lib/"
@@ -170,6 +176,8 @@
 #undef NATIVE_SYSTEM_HEADER_DIR
 #define NATIVE_SYSTEM_HEADER_DIR "/mingw/include"
+#endif /* !defined(TARGET_SYSTEM_ROOT) */
+
 /* Output STRING, a string representing a filename, to FILE.
    We canonicalize it to be in Unix format (backslashes are replaced
    forward slashes.  */
Index: gcc/config/i386/x-mingw32
===================================================================
--- gcc/config/i386/x-mingw32   (revision 240805)
+++ gcc/config/i386/x-mingw32   (working copy)
@@ -16,11 +16,45 @@
 # along with GCC; see the file COPYING3.  If not see
 # <http://www.gnu.org/licenses/>.
 #
+
+# MSYS will zealously translate all paths to Windows form, so /usr/include 
becomes c:/msysX/usr/include.
+# This is undesirable when TARGET_SYSTEM_ROOT is specified, so this function 
converts /usr/include to //usr\include,
+# which will become /usr/include again when passed to gcc.
+
+# This function takes two parameters: first parameter is include directory 
path, second parameter tells
+# if the path is relative to TARGET_SYSTEM_ROOT.
+# If TARGET_SYSTEM_ROOT is not configured, or
+#   this function always expands to the unmodified first parameter
+# if TARGET_SYSTEM_ROOT is configured, but second parameter is not 1,
+#   this function again expands to the unmodified first parameter
+# otherwise,
+#  it expands to a shell expression which will transform the first parameter 
as described above.
+ifneq ($(TARGET_SYSTEM_ROOT),)
+sysroot_relative_path = $(if $(filter 1,$(2)),`echo "$(1)" | tr '/' '\\\\' | 
sed 's|^\\\\|//|'`,$(1))
+else
+sysroot_relative_path = $(1)
+endif
+
+ifneq ($(TARGET_SYSTEM_ROOT),)
 #
+# Make sure that relative the path is not converted to absolute DOS style path
+#
+local_includedir = $(call sysroot_relative_path,$(local_prefix)/include,1)
+else
+#
 # Make local_includedir relative to EXEC_PREFIX
 #
 local_includedir=$(libsubdir)/$(unlibsubdir)/..`echo $(exec_prefix) | sed -e 
's|^$(prefix)||' -e 's|/[^/]*|/..|g'`/include
+endif
+#
+# Make sure that relative path are not converted to absolute DOS style paths
+#
+gplusplus_includedir = $(call 
sysroot_relative_path,$(gcc_gxx_include_dir),$(gcc_gxx_include_dir_add_sysroot))
+gplusplus_tool_includedir = $(call 
sysroot_relative_path,$(gcc_gxx_include_dir)/$(target_noncanonical),$(gcc_gxx_include_dir_add_sysroot))
+gplusplus_backward_includedir = $(call 
sysroot_relative_path,$(gcc_gxx_include_dir)/backward,$(gcc_gxx_include_dir_add_sysroot))
+native_system_includedir = $(call 
sysroot_relative_path,$(NATIVE_SYSTEM_HEADER_DIR),1)
+
 # On MinGW, we use "%IA64d" to print 64-bit integers, and the format-checking
 # code does not handle that, so we have to disable checking here.
 WERROR_FLAGS += -Wno-format

Reply via email to