如何在CMake Graphviz生成的目标依赖图中添加源文件信息?
如何在CMake Graphviz生成的目标依赖图中添加源文件信息?
嘿,这个问题我之前也碰到过!默认的CMake Graphviz输出确实只显示目标名称和类型,要加源文件信息得动点小手脚,下面给你两个实用的办法:
一、自定义CMake脚本扩展输出
你可以通过在项目的CMake配置里添加自定义逻辑,来给生成的dot文件追加源文件信息:
- 第一步还是正常生成基础依赖图:
cmake -S . --graphviz=targets.dot - 然后在你的
CMakeLists.txt里添加一段代码,用来收集每个目标的源文件并更新dot文件:
先启用Graphviz生成支持,再创建一个自定义目标来处理dot文件:# 启用Graphviz生成基础依赖图 set(CMAKE_GRAPHVIZ_FILE_NAME targets.dot) set(CMAKE_GRAPHVIZ_GENERATE ON) # 创建自定义目标,用来扩展dot文件的内容 add_custom_target(enhance_graphviz ALL COMMAND ${CMAKE_COMMAND} -D DOT_FILE=${CMAKE_BINARY_DIR}/targets.dot -P ${CMAKE_SOURCE_DIR}/enhance_graphviz.cmake DEPENDS ${CMAKE_BINARY_DIR}/targets.dot ) - 接着在项目根目录创建
enhance_graphviz.cmake脚本,写入以下逻辑:# 获取项目中所有的构建目标 get_cmake_property(TARGET_LIST BUILDSYSTEM_TARGETS) foreach(TARGET ${TARGET_LIST}) # 获取当前目标的源文件列表 get_target_property(TARGET_SOURCES ${TARGET} SOURCES) if(TARGET_SOURCES) # 把源文件列表转成适合Dot语法的换行格式 string(REPLACE ";" "\\n" FORMATTED_SOURCES "${TARGET_SOURCES}") # 追加到Dot文件,修改目标节点的标签,加入源文件信息 file(APPEND ${DOT_FILE} "\n\"${TARGET}\" [label=\"${TARGET}\\n${FORMATTED_SOURCES}\"];") endif() endforeach() - 这样重新构建后,生成的
targets.dot里每个目标节点的标签就会包含对应的源文件了,用Dot工具转成图片或者直接查看都能看到。
二、使用第三方脚本工具
如果你不想修改项目的CMake配置,也可以用社区里的脚本工具来处理已生成的dot文件:
- 核心思路是两步:先通过CMake命令提取所有目标的源文件,再解析dot文件并把源文件信息插入到对应节点中。
- 比如你可以自己写个简单的Python脚本:
- 在构建目录下运行
cmake -E cmake_print_properties --TARGETS * --PROPERTY SOURCES,把输出保存为target_sources.txt,从中提取每个目标对应的源文件列表。 - 用
pydot库读取targets.dot,遍历每个节点,找到对应的目标,把源文件添加到节点的label属性里,最后保存修改后的dot文件。
- 在构建目录下运行
- 这类脚本不需要侵入项目配置,适合临时使用,网上也能找到一些现成的社区脚本可以直接用。
需要说明的是,CMake官方的CMakeGraphVizOptions模块确实没有提供直接添加源文件的选项,所以目前只能通过这些自定义方式来实现需求。
内容来源于stack exchange
相关产品推荐
相关产品推荐

