我知道通过命令行生成CMake项目依赖关系图的常见方法:
cmake --graphviz=[file]
但是是否有一种方法可以通过在CMakeList中设置标志或命令来自动生成它?想法是让CMakeLists.txt本身触发图形生成,而不是用户通过命令行。
cmake --graphviz=[file]
但是是否有一种方法可以通过在CMakeList中设置标志或命令来自动生成它?想法是让CMakeLists.txt本身触发图形生成,而不是用户通过命令行。
你不仅可以创建一个CMake自定义目标来运行Graphviz,而且还可以更进一步,使用Dot为您生成图像文件:
add_custom_target(graphviz ALL
COMMAND ${CMAKE_COMMAND} "--graphviz=foo.dot" .
COMMAND dot -Tpng foo.dot -o foo.png
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}"
)
这样,自定义目标也会运行第二个命令 dot -Tpng foo.dot -o foo.png
。您可以在任何位置输出图像文件,只需在 foo.png
前面添加您选择的路径即可。
你可以在脚本中再次调用CMake,例如:
add_custom_target(graphviz ALL
"${CMAKE_COMMAND}" "--graphviz=foo" .
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}")
与其他答案相比,我认为只有在需要时才运行Graphviz生成更加方便。同时,我会检查Graphviz/Dot本身是否存在:
find_program(GRAPHVIZ dot)
if(GRAPHVIZ)
add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/_graphviz
COMMAND ${CMAKE_COMMAND} "--graphviz=graphviz/deps.txt" .
COMMAND dot -Tsvg graphviz/deps.txt -o deps.svg
COMMAND dot -Tpng graphviz/deps.txt -o deps.png
COMMENT "Plotting dependencies graph to deps.svg"
DEPENDS <some_target>
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}")
add_custom_target(graphviz ALL
DEPENDS ${CMAKE_BINARY_DIR}/_graphviz)
endif()
some_target
发生变化时,它还会尝试重新生成OUTPUT _graphviz
文件,从而绘制依赖关系。graphviz
目标始终构建,但它是空的,因此如果OUTPUT _graphviz
没有更新,则不会调用绘图本身。
ALL
参数,或在之后添加set_target_properties(Graphviz PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD 1)
。 - Kevin