如何检查add_custom_command的DEPENDS是否由其他add_custom_command生成?
解决CMake中依赖生成文件的条件判断问题
要实现当a.txt存在时,先复制a到b再复制b到c,同时避免a.txt不存在时的构建错误,不能直接用EXISTS判断生成文件(因为构建阶段生成的文件在配置阶段不存在),可以通过变量标记生成状态的方式解决:
修改后的代码
# 初始化标记变量 SET(B_TXT_WILL_BE_GENERATED OFF) if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/a.txt) add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/b.txt DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/a.txt COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/a.txt ${CMAKE_CURRENT_BINARY_DIR}/b.txt) add_custom_target(copy-a-to-b ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/b.txt) # 标记b.txt会被生成 SET(B_TXT_WILL_BE_GENERATED ON) endif() # 根据变量判断是否添加生成c.txt的规则 if(B_TXT_WILL_BE_GENERATED) add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/c.txt DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/b.txt COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/b.txt ${CMAKE_CURRENT_BINARY_DIR}/c.txt) add_custom_target(copy-b-to-c ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/c.txt) endif()
原理说明
- CMake的
EXISTS指令仅在配置阶段检查文件是否存在,而b.txt是构建阶段才会生成的,所以原判断无法生效。 - 通过变量
B_TXT_WILL_BE_GENERATED传递状态:当a.txt存在时,变量设为ON,触发生成c.txt的规则;当a.txt不存在时,变量保持OFF,不会添加c.txt的生成规则,自然避免了构建错误。
内容的提问来源于stack exchange,提问作者user3667089
相关产品推荐
相关产品推荐

