CMake如何创建依赖生成文件的自定义目标?
解决方案
要实现仅在构建自定义目标doc时才生成conf.py,你需要把configure_file的生成逻辑从配置阶段转移到构建阶段,具体通过add_custom_command来实现,再让自定义目标依赖该命令的输出文件。
修改后的CMake代码
# 用自定义命令生成conf.py,仅在依赖它的目标需要时执行 add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/conf.py COMMAND ${CMAKE_COMMAND} -E configure_file ${CMAKE_CURRENT_SOURCE_DIR}/conf.py.in ${CMAKE_CURRENT_BINARY_DIR}/conf.py @ONLY # 保持原configure_file的变量替换行为,根据你的需求可选 MAIN_DEPENDENCY ${CMAKE_CURRENT_SOURCE_DIR}/conf.py.in ) # 自定义文档目标,依赖生成的conf.py add_custom_target(doc COMMAND ${SPHINX_EXECUTABLE} -b html ${SPHINX_SOURCE} ${SPHINX_BUILD} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMENT "Generating documentation with Sphinx" DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/conf.py )
关键说明
add_custom_command的作用:将conf.py的生成动作延迟到构建阶段,只有当依赖它的doc目标被触发时(比如执行make doc或cmake --build . --target doc),才会检查conf.py是否需要更新:如果文件不存在、模板conf.py.in有修改,或者CMake变量有变化,才会重新生成conf.py。- 替代直接
configure_file的原因:原代码中的configure_file是在CMake配置阶段(运行cmake ..时)无条件执行的,无法通过目标依赖控制生成时机。而add_custom_command是构建阶段的动作,完全由目标依赖关系触发。 MAIN_DEPENDENCY:指定模板文件conf.py.in为主要依赖,确保模板修改时自动重新生成conf.py。
内容的提问来源于stack exchange,提问作者StoneThrow
相关产品推荐
相关产品推荐

