I’m running into the following issue: We have targets that set their include paths with the SYSTEM
property. We need to include them this way, because they contain code that would trigger warnings otherwise, and we have warnings set as errors.
The problem is that when we update those targets, and the headers change, the files including them aren’t correctly rebuilt. I think because they are marked as SYSTEM they are omitted from being checked.
Is there a way to fix the dependency checks here, while maintaining the behaviour suppressing warnings in the headers?
What is the version of CMake
and which compiler do you use?
I’m now at cmake 3.29.6, using clang 19.
And which system and CMake
generator?
That differs. The issue exists on Windows, macOS and Linux, using either the Ninja, Makefile or XCode generator.
These generators use different approaches regarding dependencies tracking.
Let try to identify what happen for Makefile
generator.
Dependencies are controlled by the following variables:
- CMAKE_DEPFILE_FLAGS_<LANG>
- CMAKE_USE_DEPENDS_USE_COMPILER or CMAKE_<LANG>_USE_DEPENDS_USE_COMPILER
What are the values for these variables?
Neither of them appear to be set on my linux system using the Makefile generator.
Sorry, but the variable names including language didn’t show up correctly… I fix-up my previous message.
I still cannot find those. I searched the cache for DEPENDS
and USE_COMPILER
. Neither is to be found anywhere in that file.
These variables are not cache ones.
Right, I misunderstood that. Only CMAKE_DEPFILE_FLAGS_ seems to be set. For C++ (main language in our codebase)
CMAKE_DEPFILE_FLAGS_CXX: -MD -MT <DEP_TARGET> -MF <DEP_FILE>
Ok. Sounds good.
Another variable should be considered: CMAKE_DEPENDS_IN_PROJECT_ONLY
Ok. Let take a look at the generated files.
Check in some project target binary directory (i.e. <bindir>/CMakeFiles/…/<your_target>.dir), the contents of dependency files (i.e. with extension .o.d
). All your headers should be here (of course after, at least, one compilation done).
Next check, after a second compilation run: in the same directory, you must have a file compiler_depend.make
which also holds all your headers.