CMake如何创建带输出的命名自定义目标,输出存在时不触发重新构建
CMake 自定义增量构建目标实现方案
你需要的效果可以通过add_custom_command + add_custom_target组合实现,两个接口搭配刚好能同时满足「增量构建判断」和「存在可调用目标」的要求,无需用到编译相关的接口。
具体实现步骤
- 第一步:调用
add_custom_command声明生成规则,明确指定OUTPUT参数为你要生成的文件路径,DEPENDS参数为所有依赖的输入文件,再填写实际要执行的命令。这一步CMake会自动维护时间戳比对逻辑,只要所有依赖的修改时间都早于输出文件,就不会重新执行命令。 - 第二步:调用
add_custom_target创建你需要的命名目标,通过DEPENDS参数关联到上一步add_custom_command中声明的输出文件,即可将生成规则绑定为可手动触发、也可被其他目标依赖的正式构建目标。
代码示例
# 示例场景:用python脚本处理源数据生成二进制产物,目标命名为process_data add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/output.bin DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/input.raw ${CMAKE_CURRENT_SOURCE_DIR}/process.py COMMAND python ${CMAKE_CURRENT_SOURCE_DIR}/process.py ${CMAKE_CURRENT_SOURCE_DIR}/input.raw ${CMAKE_CURRENT_BINARY_DIR}/output.bin COMMENT "Processing raw data..." ) add_custom_target( process_data # 若需要该目标随默认构建自动执行,保留ALL参数,不需要可删除 ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/output.bin )
注意事项
- 必须保证
add_custom_command的OUTPUT路径和add_custom_target的DEPENDS路径完全一致,推荐使用CMAKE_CURRENT_SOURCE_DIR、CMAKE_CURRENT_BINARY_DIR等内置变量明确路径,避免相对路径导致的关联失效问题。 - 如果你的目标没有实际生成的物理文件,可以生成一个标记文件(比如
.process_data.stamp)作为OUTPUT,命令执行完成后触摸这个文件即可,同样能实现增量构建判断。
内容的提问来源于stack exchange,提问作者Gergely Nagy
相关产品推荐
相关产品推荐

