You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检查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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 08:27:49