尽管没有更改任何来源,但 CMake 会重建自定义目标 [重复]
Posted
技术标签:
【中文标题】尽管没有更改任何来源,但 CMake 会重建自定义目标 [重复]【英文标题】:CMake rebuilts custom target despite no sources having changed [duplicate] 【发布时间】:2021-12-12 03:59:23 【问题描述】:我在我的 CMake 文件中使用自定义目标,如下所示:
add_custom_target(generated_bar
COMMAND $CMAKE_COMMAND -DOUT=bar -P generate-bar.cmake
BYPRODUCTS bar
COMMENT "Generating bar from foo"
SOURCES foo)
这对我来说很好,bar
会生成。但是,如果我再次 make generated_bar
- bar
再次生成,即使源文件 foo
没有更改。
为什么会这样?
注意:This question 是相关的。
【问题讨论】:
您可能期望选项BYPRODUCTS
和SOURCES
用于指定依赖项,但它们不是。根据documentation,SOURCES
指定文件仅用于 IDE,BYPRODUCTS
仅用于 Ninja 生成器。
【参考方案1】:
自定义的target 总是被认为是过时的,所以它的命令总是运行。但是,这并没有扩展到它的依赖项:
add_custom_command(
OUTPUT bar
COMMAND $CMAKE_COMMAND -DOUT=bar -P generate-bar.cmake
DEPENDS "$CMAKE_CURRENT_BINARY_DIR/generate-bar.cmake" foo
COMMENT "Generating bar from foo"
)
add_custom_target(
generate_bar
DEPENDS "$CMAKE_CURRENT_BINARY_DIR/bar"
)
您应该将自定义目标视为 Make 中的 .PHONY
规则...它可以帮助您对事物进行排序或提供特殊实用程序作为构建规则(不是“构建”为 ALL
的一部分) )
【讨论】:
哇,为了让一个文件以两种语言编译,我必须编写的代码量是惊人的:生成器生成命令,自定义 cuoomand 中的生成器调用,以及阻止自动重建的自定义目标... gitlab.kitware.com/cmake/cmake/-/issues ;) gitlab.kitware.com/cmake/cmake/-/issues/22779 :-(以上是关于尽管没有更改任何来源,但 CMake 会重建自定义目标 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
CMake、Ninja 和 Visual Studio 2019 重建一切