cmake relies on inherently racey g++ output to figure out implicit include dirs, which sometimes breaks build
See CMakeOutput.txt: https://gist.github.com/q66/540d6d99c0b02af24d572d6841d71064
Notably this part:
#include <...> search starts here:
/usr/lib/gcc/powerpc64-linux-musl/9.1.0/../../../../include/c++/9.1.0
GNU assembler version 2.32 (powerpc64-linux-musl) using BFD version (GNU Binutils) 2.32 /usr/lib/gcc/powerpc64-linux-musl/9.1.0/../../../../include/c++/9.1.0/powerpc64-linux-musl
/usr/lib/gcc/powerpc64-linux-musl/9.1.0/../../../../include/c++/9.1.0/backward
/usr/local/include
/usr/include
/usr/lib/gcc/powerpc64-linux-musl/9.1.0/include
End of search list.
On this particular setup, the race results in the assembler info merging with the actual include path (/usr/lib/gcc/powerpc64-linux-musl/9.1.0/../../../../include/c++/9.1.0/powerpc64-linux-musl
) which later makes cmake skip it:
collapse include dir [/usr/lib/gcc/powerpc64-linux-musl/9.1.0/../../../../include/c++/9.1.0] ==> [/usr/include/c++/9.1.0]
skipping relative include dir [GNU assembler version 2.32 (powerpc64-linux-musl) using BFD version (GNU Binutils) 2.32 /usr/lib/gcc/powerpc64-linux-musl/9.1.0/../../../../include/c++/9.1.0/powerpc64-linux-musl]
skipping relative include dir []
collapse include dir [/usr/lib/gcc/powerpc64-linux-musl/9.1.0/../../../../include/c++/9.1.0/backward] ==> [/usr/include/c++/9.1.0/backward]
collapse include dir [/usr/local/include] ==> [/usr/local/include]
collapse include dir [/usr/include] ==> [/usr/include]
collapse include dir [/usr/lib/gcc/powerpc64-linux-musl/9.1.0/include] ==> [/usr/lib/gcc/powerpc64-linux-musl/9.1.0/include]
This notably affects projects using Qt and cmake's automoc, as then moc can't find the right includes and fails to parse.