显然,Ninja必须配置为将标头视为依赖项:https://ninja-build.org/manual.html#ref_headers。
如何告诉CMake将其生成到我的build.ninja?
答案 0 :(得分:1)
有文件属性OBJECT_DEPENDS
,可用于指定对从特定文件创建的任何对象的其他文件的依赖。
来自the docs:
编译目标文件所依赖的其他文件。
指定
;
- 文件的完整路径列表,从该源文件编译的任何目标文件都依赖于该文件。在 Makefile生成器和 Ninja 生成器上,如果任何命名文件比它更新,则将重新编译目标文件。 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"
答案 1 :(得分:0)
如果我查看使用CMake生成的build.ninja
个文件,例如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
就会自动重建必要的来源。