如何自动将DOXYGEN_INCLUDE_PATH设为目标的所有包含目录?
解决CMake嵌套项目中Doxygen自动获取目标包含目录的问题
我维护着一个嵌套结构的CMake项目:用add_subdirectory管理子目录组件,通过add_library/add_executable定义组件,依赖target_link_libraries关联,构建流程完全正常。但集成Doxygen生成API文档时遇到了麻烦:依赖库中用于代码生成的宏(比如GENERATE_ENUM)无法被Doxygen识别,必须配置DOXYGEN_INCLUDE_PATH才能让它找到这些宏的定义。
硬编码路径显然不是好办法——既不具备可移植性,后续维护也麻烦。我想直接复用目标编译时的所有包含目录,但尝试了两种方案都踩了坑:
- 直接用生成器表达式
$<TARGET_PROPERTY:${component},INCLUDE_DIRECTORIES>赋值给DOXYGEN_INCLUDE_PATH,完全无效; - 用
file(GENERATE)生成包含路径文件,又碰到CMake列表格式和Doxygen要求的多行+=格式不兼容的问题。
最终通过三步完美解决了问题:
解决步骤
1. 常规配置Doxygen参数,跳过INCLUDE_PATH
先按正常流程配置Doxygen的基础参数(比如输入文件、输出目录等),不要设置DOXYGEN_INCLUDE_PATH,留到后续处理:
find_package(Doxygen REQUIRED) set(DOXYGEN_PROJECT_NAME "My Project") set(DOXYGEN_INPUT "${PROJECT_SOURCE_DIR}/src") set(DOXYGEN_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/docs") # 其他Doxygen配置(比如GENERATE_HTML等)... # 初始化Doxygen目标,暂不处理INCLUDE_PATH doxygen_add_docs(doxygen-docs ${DOXYGEN_INPUT})
2. 修改生成的Doxyfile,追加@INCLUDE引用外部路径文件
Doxygen支持用@INCLUDE指令引入外部配置文件,我们可以在自动生成的Doxyfile末尾添加这个指令,让它读取后续生成的包含路径文件:
# 获取自动生成的Doxyfile路径 get_target_property(DOXYFILE_PATH doxygen-docs DOXYGEN_DOCS_FILE) # 在Doxyfile末尾追加@INCLUDE指令,指向待生成的路径文件 file(APPEND ${DOXYFILE_PATH} "\n@INCLUDE = ${PROJECT_BINARY_DIR}/doxygen_includes.txt")
3. 用生成器表达式转换格式,生成符合Doxygen要求的路径文件
利用CMake的$<LIST:JOIN,...>生成器表达式,把目标的包含目录列表转换成Doxygen支持的INCLUDE_PATH += <路径>格式,再用file(GENERATE)生成文件:
# 替换成你的目标名称,如果要处理多个组件,可以循环遍历 set(TARGET_NAME my_component) # 把目标的包含目录列表转换成Doxygen格式的行内容 set(DOXYGEN_INCLUDES_CONTENT "$<LIST:JOIN,$<TARGET_PROPERTY:${TARGET_NAME},INCLUDE_DIRECTORIES>,\nINCLUDE_PATH += >") # 给第一行补上开头的INCLUDE_PATH += string(PREPEND DOXYGEN_INCLUDES_CONTENT "INCLUDE_PATH += ") # 生成路径文件 file(GENERATE OUTPUT "${PROJECT_BINARY_DIR}/doxygen_includes.txt" CONTENT "${DOXYGEN_INCLUDES_CONTENT}" )
这样处理后,Doxygen会自动读取目标编译时的所有包含目录,不管项目目录结构怎么调整,都不需要手动更新路径,完全适配CMake的目标属性,既具备可移植性又易于维护。
内容的提问来源于stack exchange,提问作者cancech
相关产品推荐
相关产品推荐

