https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96027
Bug ID: 96027
Summary: Windows: gcc does not resolve long relative header
paths correctly
Product: gcc
Version: 8.1.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: preprocessor
Assignee: unassigned at gcc dot gnu.org
Reporter: kai.koehne at qt dot io
Target Milestone: ---
Created attachment 48823
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=48823&action=edit
Test case with directory structure; should be extracted to C:\
In some scenarios gcc on Windows does not resolve includes of headers
correctly, resulting in errors like:
> fatal error:
> ../../../../../src/BBBBBBBBBBBBBBB/BBBBBBBBBBBBB/BBBBBBBB/BBBBBBBBBBBBBBBBBBBBBBB.h:
> No such file or directory
The exact circumstances are unclear, but both the length of the (relative)
header path and the length of the absolute paths in the file system play a
role.
Attached you can find a somewhat minimal example, which you need to extract
into a top-level directory (e.g. C:\).
# HOW TO REPRODUCE
Open Windows command line. Extract attachment into C:\, navigate into AAAAAAA,
run e.g. mingw32-make:
> C:\AAAAAAA>mingw32-make
> cd
> AAAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAA/src/AAAAAAA/AAAAAAAAA/AAAAAAAAA
> && mingw32-make
> mingw32-make[1]: Entering directory
> 'C:/AAAAAAA/AAAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAA/src/AAAAAAA/AAAAAAAAA/AAAAAAAAA'
> gcc.exe -I../../../../include/CCCCCCCCCCCCCCCCCCCCC\CCCCCC test.cpp
> In file included from test.cpp:1:
> ../../../../include/CCCCCCCCCCCCCCCCCCCCC\CCCCCC/BBBBBBBBBBBBBBBBBBBBB/BBBBBBB/BBBBBBBBBBBBBBBBBBBBBBB.h:1:10:
> fatal error:
> ../../../../../src/BBBBBBBBBBBBBBB/BBBBBBBBBBBBB/BBBBBBBB/BBBBBBBBBBBBBBBBBBBBBBB.h:
> No such file or directory
> #include
> "../../../../../src/BBBBBBBBBBBBBBB/BBBBBBBBBBBBB/BBBBBBBB/BBBBBBBBBBBBBBBBBBBBBBB.h"
> >
> ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> compilation terminated.
# WHAT IS THE EXPECTED OUPUT
If using clang, the header file is found:
> clang.exe -I../../../../include/CCCCCCCCCCCCCCCCCCCCC\CCCCCC test.cpp
> In file included from test.cpp:1:
> In file included from
> ../../../../include/CCCCCCCCCCCCCCCCCCCCC\CCCCCC\BBBBBBBBBBBBBBBBBBBBB/BBBBBBB/BBBBBBBBBBBBBBBBBBBBBBB.h:1:
> ../../../../include/CCCCCCCCCCCCCCCCCCCCC\CCCCCC\BBBBBBBBBBBBBBBBBBBBB/BBBBBBB/../../../../../src/BBBBBBBBBBBBBBB/BBBBBBBBBBBBB/BBBBBBBB/BBBBBBBBBBBBBBBBBBBBBBB.h:1:9:
> warning:
> HEADER FILE WAS FOUND, ALL GOOD! [-W#pragma-messages]
> #pragma message "HEADER FILE WAS FOUND, ALL GOOD!"
> ^
> 1 warning generated.
The same is also true for gcc if the path is shortened, e.g. by shortening the
very first path:
> C:\AAAAAAA>subst X: .
>
> C:\AAAAAAA>X:
>
> X:\>mingw32-make
> cd
> AAAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAA/src/AAAAAAA/AAAAAAAAA/AAAAAAAAA
> && mingw32-make
> mingw32-make[1]: Entering directory
> 'X:/AAAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAA/src/AAAAAAA/AAAAAAAAA/AAAAAAAAA'
> gcc.exe -I../../../../include/CCCCCCCCCCCCCCCCCCCCC\CCCCCC test.cpp
> In file included from
> ../../../../include/CCCCCCCCCCCCCCCCCCCCC\CCCCCC/BBBBBBBBBBBBBBBBBBBBB/BBBBBBB/BBBBBBBBBBBBBBBBBBBBBBB.h:1,
> from test.cpp:1:
> x:\aaaaaaaaa\aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\aaaaaa\src\bbbbbbbbbbbbbbb\bbbbbbbbbbbbb\bbbbbbbb\bbbbbbbbbbbbbbbbbbbbbbb.h:1:17:
> note: '#pragma message: HEADER FILE WAS FOUND, ALL GOOD!'
> 1 | #pragma message "HEADER FILE WAS FOUND, ALL GOOD!"
> | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> mingw32-make[1]: Leaving directory
> 'X:/AAAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAA/src/AAAAAAA/AAAAAAAAA/AAAAAAAAA'
# FURTHER INSIGHTS
If monitoring the Windows API it becomes clear that gcc somehow tries a wrong
path:
> 10:52:44,2386745 cc1plus.exe 20520 CreateFile
> C:\aaaaaaa\aaaaaaaaa\src\bbbbbbbbbbbbbbb\bbbbbbbbbbbbb\bbbbbbbb\bbbbbbbbbbbbbbbbbbbbbbb.h
> PATH NOT FOUND Desired Access: Generic Read, Disposition: Open,
> Options: Synchronous IO Non-Alert, Non-Directory File, Attributes: N,
> ShareMode: Read, Write, AllocationSize: n/a
> 10:52:44,2387339 cc1plus.exe 20520 CreateFile
> C:\src\bbbbbbbbbbbbbbb\bbbbbbbbbbbbb\bbbbbbbb\bbbbbbbbbbbbbbbbbbbbbbb.h PATH
> NOT FOUND Desired Access: Generic Read, Disposition: Open, Options:
> Synchronous IO Non-Alert, Non-Directory File, Attributes: N, ShareMode: Read,
> Write, AllocationSize: n/a
> 10:52:44,2387899 cc1plus.exe 20520 CreateFile
> C:\winlibs\src\bbbbbbbbbbbbbbb\bbbbbbbbbbbbb\bbbbbbbb\bbbbbbbbbbbbbbbbbbbbbbb.h
> PATH NOT FOUND Desired Access: Generic Read, Disposition: Open, Options:
> Synchronous IO Non-Alert, Non-Directory File, Attributes: N, ShareMode: Read,
> Write, AllocationSize: n/a
> 10:52:44,2388532 cc1plus.exe 20520 CreateFile
> C:\winlibs\winlibs-x86_64-posix-seh-gcc-10.1.0-llvm-10.0.0-mingw-w64-7.0.0-r3\src\bbbbbbbbbbbbbbb\bbbbbbbbbbbbb\bbbbbbbb\bbbbbbbbbbbbbbbbbbbbbbb.h
> PATH NOT FOUND Desired Access: Generic Read, Disposition: Open,
> Options: Synchronous IO Non-Alert, Non-Directory File, Attributes: N,
> ShareMode: Read, Write, AllocationSize: n/a
# GCC VERSIONS TESTED
> Using built-in specs.
> COLLECT_GCC=C:\winlibs\winlibs-x86_64-posix-seh-gcc-10.1.0-llvm-10.0.0-mingw-w64-7.0.0-r3\bin\gcc.exe
> COLLECT_LTO_WRAPPER=c:/winlibs/winlibs-x86_64-posix-seh-gcc-10.1.0-llvm-10.0.0-mingw-w64-7.0.0-r3/bin/../libexec/gcc/x86_64-w64-mingw32/10.1.0/lto-wrapper.exe
> Target: x86_64-w64-mingw32
> Configured with: ../configure
> --prefix=/R/winlibs64_10.1.0/inst_gcc-10.1.0/share/gcc
> --build=x86_64-w64-mingw32 --host=x86_64-w64-mingw32
> --with-pkgversion='MinGW-W64 x86_64-posix-seh, built by Brecht Sanders'
> --with-tune=generic --enable-checking=release --enable-threads=posix
> --disable-sjlj-exceptions --disable-libunwind-exceptions
> --enable-serial-configure --disable-bootstrap --enable-host-shared
> --enable-plugin --enable-default-ssp --disable-rpath --disable-libstdcxx-pch
> --enable-libstdcxx-time=yes --disable-libstdcxx-debug
> --disable-version-specific-runtime-libs --with-stabs --disable-symvers
> --enable-languages=c,c++,fortran,lto,objc,obj-c++,d --disable-gold
> --disable-nls --disable-stage1-checking --disable-win32-registry
> --disable-multilib --enable-ld --enable-libquadmath --enable-libada
> --enable-libssp --enable-libstdcxx --enable-lto --enable-fully-dynamic-string
> --enable-libgomp --enable-graphite --enable-mingw-wildcard
> --with-mpc=/d/winlibs64_10.1.0/custombuilt
> --with-mpfr=/d/winlibs64_10.1.0/custombuilt
> --with-gmp=/d/winlibs64_10.1.0/custombuilt
> --with-isl=/d/winlibs64_10.1.0/custombuilt --enable-install-libiberty
> --enable-__cxa_atexit --without-included-gettext
> --with-diagnostics-color=auto --with-libiconv --with-system-zlib
> --with-build-sysroot=/R/winlibs64_10.1.0/gcc-10.1.0/build_mingw/mingw-w64
> Thread model: posix
> Supported LTO compression algorithms: zlib zstd
> gcc version 10.1.0 (MinGW-W64 x86_64-posix-seh, built by Brecht Sanders)
> Using built-in specs.
> COLLECT_GCC=C:\mingw-builds\i686-8.1.0-release-posix-dwarf-rt_v6-rev0\bin\gcc
> COLLECT_LTO_WRAPPER=C:/mingw-builds/i686-8.1.0-release-posix-dwarf-rt_v6-rev0/bin/../libexec/gcc/i686-w64-mingw32/8.1.0/lto-wrapper.exe
> Target: i686-w64-mingw32
> Configured with: ../../../src/gcc-8.1.0/configure --host=i686-w64-mingw32
> --build=i686-w64-mingw32 --target=i686-w64-mingw32 --prefix=/mingw32
> --with-sysroot=/c/mingw810/i686-810-posix-dwarf-rt_v6-rev0/mingw32
> --enable-shared --enable-static --disable-multilib
> --enable-languages=c,c++,fortran,lto --enable-libstdcxx-time=yes
> --enable-threads=posix --enable-libgomp --enable-libatomic --enable-lto
> --enable-graphite --enable-checking=release --enable-fully-dynamic-string
> --enable-version-specific-runtime-libs --disable-sjlj-exceptions
> --with-dwarf2 --disable-libstdcxx-pch --disable-libstdcxx-debug
> --enable-bootstrap --disable-rpath --disable-win32-registry --disable-nls
> --disable-werror --disable-symvers --with-gnu-as --with-gnu-ld
> --with-arch=i686 --with-tune=generic --with-libiconv --with-system-zlib
> --with-gmp=/c/mingw810/prerequisites/i686-w64-mingw32-static
> --with-mpfr=/c/mingw810/prerequisites/i686-w64-mingw32-static
> --with-mpc=/c/mingw810/prerequisites/i686-w64-mingw32-static
> --with-isl=/c/mingw810/prerequisites/i686-w64-mingw32-static
> --with-pkgversion='i686-posix-dwarf-rev0, Built by MinGW-W64 project'
> --with-bugurl=https://sourceforge.net/projects/mingw-w64 CFLAGS='-O2 -pipe
> -fno-ident -I/c/mingw810/i686-810-posix-dwarf-rt_v6-rev0/mingw32/opt/include
> -I/c/mingw810/prerequisites/i686-zlib-static/include
> -I/c/mingw810/prerequisites/i686-w64-mingw32-static/include' CXXFLAGS='-O2
> -pipe -fno-ident
> -I/c/mingw810/i686-810-posix-dwarf-rt_v6-rev0/mingw32/opt/include
> -I/c/mingw810/prerequisites/i686-zlib-static/include
> -I/c/mingw810/prerequisites/i686-w64-mingw32-static/include' CPPFLAGS='
> -I/c/mingw810/i686-810-posix-dwarf-rt_v6-rev0/mingw32/opt/include
> -I/c/mingw810/prerequisites/i686-zlib-static/include
> -I/c/mingw810/prerequisites/i686-w64-mingw32-static/include' LDFLAGS='-pipe
> -fno-ident -L/c/mingw810/i686-810-posix-dwarf-rt_v6-rev0/mingw32/opt/lib
> -L/c/mingw810/prerequisites/i686-zlib-static/lib
> -L/c/mingw810/prerequisites/i686-w64-mingw32-static/lib
> -Wl,--large-address-aware'
> Thread model: posix
> gcc version 8.1.0 (i686-posix-dwarf-rev0, Built by MinGW-W64 project)
> gcc (MinGW.org GCC Build-20200227-1) 9.2.0
> Copyright (C) 2019 Free Software Foundation, Inc.
> This is free software; see the source for copying conditions. There is NO
> warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.