CMake中生成的文件的运行时依赖关系

Posted

技术标签:

【中文标题】CMake中生成的文件的运行时依赖关系【英文标题】:Run-time dependency on generated file in CMake 【发布时间】:2018-03-19 11:23:16 【问题描述】:

我有一个测试 (add_executable(MyTest ...)) 在运行时需要一个文件。该文件是使用自定义命令生成的。我想在 CMake 中为 run-time 依赖建模。

目前,使用add_dependencies(MyTest GenerateFile) 生成的文件存在构建时间 依赖关系,其中GenerateFile 是依赖于自定义命令输出的自定义目标。 缺点: MyTestGenerateFile 完成构建之前不会开始编译代码。这是不必要的——我想构建MyTest 并并行生成文件。

我考虑的另一个选项是添加一个新目标MyTestAndGenerateFile,它同时依赖于MyTestGenerateFile缺点:调用make MyTest 不再生成文件。一定要记得打电话给make MyTestAndGenerateFile

或者,可以将新目标称为MyTest,并且可以使用add_executable(MyTest_Code ...) 添加测试。 缺点:使用 Visual Studio 生成器时,测试代码现在将位于名为 MyTest_Code 而不是 MyTest 的项目中,这违反了命名约定。此外,您现在必须构建 MyTest 项目,但运行 MyTest_Code 项目,因此您不能使用设置为启动项目 em> 没有了。

简而言之,我正在寻找一种add_dependencies 的形式,表示在构建时不需要依赖项,而是在运行时需要。

【问题讨论】:

CMake 无法跟踪您如何启动已编译的二进制文件。让它跟踪它的唯一方法是添加一个自定义目标来运行它。 @arrowd 也许“运行时依赖”在这里具有误导性,但我想不出更好的术语。我只想确保在构建MyTest 时将GenerateFile 更新到最新状态,但没有MyTest 等待GenerateFile 在开始构建之前完成。 【参考方案1】:

您可以尝试添加一个调用目标GenerateFile 的测试,并使您的实际测试依赖于前者。像这样的:

add_test(NAME MakeGenerateFile COMMAND $CMAKE_COMMAND --build $CMAKE_BINARY_DIR --target GenerateFile)
add_test(MyTest MyTest)
set_tests_properties(MyTest PROPERTIES DEPENDS MakeGenerateFile)

【讨论】:

以上是关于CMake中生成的文件的运行时依赖关系的主要内容,如果未能解决你的问题,请参考以下文章

Cmake 库依赖关系的传递

在 CMake 中具有依赖关系的自定义对象

运行测试时如何考虑依赖关系? [关闭]

下列软件包有未满足的依赖关系: cmake-qt-gui : 依赖: cmake (= 3.10.2-1ubuntu2) E: 无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依

协议缓冲区文件的 Makefile 自动依赖关系问题

Nix 中的构建与运行时依赖关系