CMake自定义目标在源文件无变更时仍重复构建的原因是什么?
问题根本原因
你遇到的重复执行问题是add_custom_target的默认行为导致的:
- CMake 中
add_custom_target创建的目标默认始终被标记为过时,只要你显式触发该目标的构建(比如执行make generated_bar),不管关联的源码文件是否有修改,都会重新执行目标绑定的所有命令。 - 你在参数中指定的
SOURCES foo仅会将foo文件加入目标的源码索引(主要用于IDE识别展示),不会自动建立foo修改时间和目标是否需要重跑的依赖关系;BYPRODUCTS bar仅用于声明目标生成的产物,方便和其他目标建立依赖链,同样不会触发增量构建检查。
实现增量构建的调整方案
如果要实现仅foo文件修改时才重新生成bar,需要结合add_custom_command做文件级别的时间戳检查,调整后的写法如下:
# 首先定义生成bar文件的自定义命令,绑定foo作为依赖 add_custom_command( OUTPUT bar COMMAND ${CMAKE_COMMAND} -DOUT=bar -P generate-bar.cmake MAIN_DEPENDENCY foo COMMENT "Generating bar from foo" ) # 自定义目标仅依赖bar文件,自动继承自定义命令的增量检查逻辑 add_custom_target(generated_bar DEPENDS bar SOURCES foo )
调整后只有foo文件发生修改,或者bar文件不存在时,执行make generated_bar才会触发重生成逻辑。
内容的提问来源于stack exchange,提问作者einpoklum
相关产品推荐
相关产品推荐

