Hi, I noticed that there is a subtle problem with build!=host configurations.
That is, the fixinclude machinery is using the path that would work on the target system to find the headers that need to be fixed, but the build machine can have different header files than the target machine, even if th are at the same location. This can theoretically cause a mis-compilation of the target libraries. However the mkheaders script works on the target, and would fix it up, but the target libraries are not rebuilt, and they may have used the wrong fixed headers. To fix this inconsistency I would like to introduce a new make variable BUILD_SYSTEM_HEADER_DIR that is identical to SYSTEM_HEADER_DIR if build==host and which is CROSS_SYSTEM_HEADER_DIR for canadian cross configs. Only mkheaders.conf uses SYSTEM_HEADER_DIR because it runs on the host system, all other places should use BUILD_SYSTEM_HEADER_DIR. I tested this change with different arm-linux-gnueabihf cross compilers, and verified that mkheaders still works on the host system. Bootstrapped and reg-tested on x86_64-pc-linux-gnu. Is it OK for trunk? Thanks Bernd.
2017-02-06 Bernd Edlinger <[email protected]> * Makefile.in (BUILD_SYSTEM_HEADER_DIR): New make variabe. (LIMITS_H_TEST, if_multiarch, stmp-fixinc): Use BUILD_SYSTEM_HEADER_DIR instead of SYSTEM_HEADER_DIR. Index: gcc/Makefile.in =================================================================== --- gcc/Makefile.in (revision 245184) +++ gcc/Makefile.in (working copy) @@ -517,11 +517,18 @@ # macro is also used in a double-quoted context. SYSTEM_HEADER_DIR = `echo @SYSTEM_HEADER_DIR@ | sed -e :a -e 's,[^/]*/\.\.\/,,' -e ta` +# Path to the system headers on the build machine +ifeq ($(build),$(host)) +BUILD_SYSTEM_HEADER_DIR = $(SYSTEM_HEADER_DIR) +else +BUILD_SYSTEM_HEADER_DIR = `echo $(CROSS_SYSTEM_HEADER_DIR) | sed -e :a -e 's,[^/]*/\.\.\/,,' -e ta` +endif + # Control whether to run fixincludes. STMP_FIXINC = @STMP_FIXINC@ # Test to see whether <limits.h> exists in the system header files. -LIMITS_H_TEST = [ -f $(SYSTEM_HEADER_DIR)/limits.h ] +LIMITS_H_TEST = [ -f $(BUILD_SYSTEM_HEADER_DIR)/limits.h ] # Directory for prefix to system directories, for # each of $(system_prefix)/usr/include, $(system_prefix)/usr/lib, etc. @@ -572,7 +579,7 @@ else ifeq ($(enable_multiarch),auto) # SYSTEM_HEADER_DIR is makefile syntax, cannot be evaluated in configure.ac - if_multiarch = $(if $(wildcard $(shell echo $(SYSTEM_HEADER_DIR))/../../usr/lib/*/crti.o),$(1)) + if_multiarch = $(if $(wildcard $(shell echo $(BUILD_SYSTEM_HEADER_DIR))/../../usr/lib/*/crti.o),$(1)) else if_multiarch = endif @@ -2990,11 +2997,11 @@ sysroot_headers_suffix=`echo $${ml} | sed -e 's/;.*$$//'`; \ multi_dir=`echo $${ml} | sed -e 's/^[^;]*;//'`; \ fix_dir=include-fixed$${multi_dir}; \ - if ! $(inhibit_libc) && test ! -d ${SYSTEM_HEADER_DIR}; then \ + if ! $(inhibit_libc) && test ! -d ${BUILD_SYSTEM_HEADER_DIR}; then \ echo The directory that should contain system headers does not exist: >&2 ; \ - echo " ${SYSTEM_HEADER_DIR}" >&2 ; \ + echo " ${BUILD_SYSTEM_HEADER_DIR}" >&2 ; \ tooldir_sysinc=`echo "${gcc_tooldir}/sys-include" | sed -e :a -e "s,[^/]*/\.\.\/,," -e ta`; \ - if test "x${SYSTEM_HEADER_DIR}" = "x$${tooldir_sysinc}"; \ + if test "x${BUILD_SYSTEM_HEADER_DIR}" = "x$${tooldir_sysinc}"; \ then sleep 1; else exit 1; fi; \ fi; \ $(mkinstalldirs) $${fix_dir}; \ @@ -3005,7 +3012,7 @@ export TARGET_MACHINE srcdir SHELL MACRO_LIST && \ cd $(build_objdir)/fixincludes && \ $(SHELL) ./fixinc.sh "$${gcc_dir}/$${fix_dir}" \ - $(SYSTEM_HEADER_DIR) $(OTHER_FIXINCLUDES_DIRS) ); \ + $(BUILD_SYSTEM_HEADER_DIR) $(OTHER_FIXINCLUDES_DIRS) ); \ rm -f $${fix_dir}/syslimits.h; \ if [ -f $${fix_dir}/limits.h ]; then \ mv $${fix_dir}/limits.h $${fix_dir}/syslimits.h; \
