显然,必须将 Ninja 配置为将标头视为依赖项:https ://ninja-build.org/manual.html#ref_headers 。
如何告诉 CMake 将其生成到我的 build.ninja 中?
有 file 属性OBJECT_DEPENDS
,可用于指定从特定文件创建的任何对象对其他文件的依赖关系。
从文档:
编译的目标文件所依赖的附加文件。
指定
;
从该源文件编译的任何目标文件所依赖的文件的完整路径列表。在Makefile Generators和Ninja generator 上,如果任何命名文件比它新,则将重新编译目标文件。Visual Studio 生成器和Xcode生成器无法实现此类编译依赖项。此属性不需要用于指定源文件对其包含的生成的头文件的依赖关系。尽管该属性最初是为此目的而引入的,但已不再需要。如果生成的头文件是通过自定义命令在与源文件相同的目标中创建的,则自动依赖扫描过程将识别依赖关系。如果生成的头文件是由另一个目标创建的,则应使用该
add_dependencies()
命令创建目标间依赖关系(如果由于链接关系而尚未存在)。
要在给定的源文件上设置此属性,请使用:
set_property(SOURCE first.cpp second.cpp
APPEND PROPERTY OBJECT_DEPENDS "${PROJECT_SOURCE_DIR}/inc/header1.h;${PROJECT_SOURCE_DIR}/inc/header2;${PROJECT_SOURCE_DIR}/inc/global_deps.h"
如果我查看build.ninja
使用 CMake 为例如 GCC 生成的文件,我确实会自动生成必要的依赖文件条目(请参阅 参考资料DEP_FILE
):
#=============================================================================
# Object build statements for EXECUTABLE target MyExe
build CMakeFiles/MyExe.dir/foo.cc.obj: CXX_COMPILER ../foo.cc
DEP_FILE = CMakeFiles/MyExe.dir/foo.cc.obj.d
FLAGS = -fdiagnostics-color=always -Wconversion
OBJECT_DIR = CMakeFiles\MyExe.dir
OBJECT_FILE_DIR = CMakeFiles\MyExe.dir
并且依赖项检查按预期工作。只需touch
或更改其中一个标头依赖项,ninja
就会自动重建必要的源。