CMake add_custom_command总是执行问题排查求助
问题根源与解决方案
你的问题出在生成文件的路径选择上:你把生成的generated.h放到了源目录(CMAKE_CURRENT_SOURCE_DIR)中,而CMake默认不会追踪源目录内文件的修改时间——它只负责管理构建目录(CMAKE_CURRENT_BINARY_DIR)下的产物。因为CMake无法确认源目录里的生成文件是否已经是最新状态,所以每次构建都会强制重新执行自定义命令。
修复步骤
将生成文件移至构建目录
把生成文件的路径改为构建目录下的位置,这样CMake可以直接追踪它的时间戳,对比输入文件的修改时间来决定是否重新生成。调整CMake代码
修改后的自定义命令和目标示例:# 提前创建构建目录下的auto子目录,避免生成命令因目录不存在失败 file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/auto) add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/auto/generated.h COMMAND bash -c "${CMAKE_CURRENT_SOURCE_DIR}/generate_code --output ${CMAKE_CURRENT_BINARY_DIR}/auto/generated.h ${CMAKE_CURRENT_SOURCE_DIR}/input_file.c" DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/input_file.c ) add_custom_target(generate_target DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/auto/generated.h )让主目标找到生成的头文件
记得把构建目录下的auto目录加入主目标的包含路径,否则编译时会找不到generated.h:target_include_directories(your_main_target PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/auto)
额外说明
CMake的设计原则是分离源文件目录和构建产物目录,源目录应保持只读(不被构建过程修改),这样不仅能让CMake准确管理文件依赖关系,还能方便清理构建产物(直接删除整个构建目录即可),同时避免污染版本控制中的源文件。
内容的提问来源于stack exchange,提问作者shaharhoch
相关产品推荐
相关产品推荐

