https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94667
Bug ID: 94667 Summary: GCC duplicates prerequisites when generating 'make' rules if headers are not in current directory Product: gcc Version: 9.3.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c Assignee: unassigned at gcc dot gnu.org Reporter: iskustvo at yahoo dot com Target Milestone: --- Invoking GCC with both -I and -M* flags ends up duplicating prerequisites in generated 'make' rule. Small SHELL script which can create minimal environment for reproduction: -------------------------------------------------------------------- #!/bin/sh mkdir -p bug/src bug/include touch bug/include/a.h echo '#include "a.h"' > bug/include/b.h printf '%s\n%s\n' '#include "a.h"' '#include "b.h"' > bug/src/main.c gcc -I bug/include -MM bug/src/main.c -------------------------------------------------------------------- Output from the above script: ---------------------------------------------------------------------- main.o: bug/src/main.c bug/include/a.h bug/include/b.h bug/include/a.h ---------------------------------------------------------------------- Note that "bug/include/a.h" is duplicated in the prerequisite list. Additional notes: 1) Issue was originally detected in C++ code. 2) Header guards(omitted for simplicity of example) don't solve this issue. 3) After moving headers from 'include' to 'src', GCC gives desired output. 4) Replacing "gcc" with "clang" gives desired output. Issue is reproducible with both system's and latest versions of GCC. System GCC: /usr/bin/gcc -v ---------------------------------------------------------------------- Using built-in specs. COLLECT_GCC=/usr/bin/gcc COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-pc-linux-gnu/9.3.0/lto-wrapper Target: x86_64-pc-linux-gnu Configured with: /build/gcc/src/gcc/configure --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --with-pkgversion='Arch Linux 9.3.0-1' --with-bugurl=https://bugs.archlinux.org/ --enable-languages=c,c++,ada,fortran,go,lto,objc,obj-c++,d --enable-shared --enable-threads=posix --with-system-zlib --with-isl --enable-__cxa_atexit --disable-libunwind-exceptions --enable-clocale=gnu --disable-libstdcxx-pch --disable-libssp --enable-gnu-unique-object --enable-linker-build-id --enable-lto --enable-plugin --enable-install-libiberty --with-linker-hash-style=gnu --enable-gnu-indirect-function --enable-multilib --disable-werror --enable-checking=release --enable-default-pie --enable-default-ssp --enable-cet=auto gdc_include_dir=/usr/include/dlang/gdc Thread model: posix gcc version 9.3.0 (Arch Linux 9.3.0-1) ---------------------------------------------------------------------- Latest manually built GCC: /usr/local/bin/gcc -v ---------------------------------------------------------------------- Using built-in specs. COLLECT_GCC=/usr/local/bin/gcc COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/x86_64-pc-linux-gnu/10.0.1/lto-wrapper Target: x86_64-pc-linux-gnu Configured with: ./configure Thread model: posix Supported LTO compression algorithms: zlib zstd gcc version 10.0.1 20200419 (experimental) [master revision 62f3d4ea899:7def9c6a6f6:fc186077486fb6e5453157ad8507c66d0a34017c] (GCC) ----------------------------------------------------------------------