CMake graphviz自动生成

11
我知道通过命令行生成CMake项目依赖关系图的常见方法:
cmake --graphviz=[file]

但是是否有一种方法可以通过在CMakeList中设置标志或命令来自动生成它?想法是让CMakeLists.txt本身触发图形生成,而不是用户通过命令行。

3个回答

15

你不仅可以创建一个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 前面添加您选择的路径即可。


1
这将始终运行并触发 CMake 重新配置运行。是否有一种方法只在确实有更改时运行它? - Axel Heider
@AxelHeider 您可以删除 ALL 参数,或在之后添加 set_target_properties(Graphviz PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD 1) - Kevin
我希望在某些更改发生时自动重新创建。 核心问题似乎是在一个目标中调用CMake似乎会更改构建输出中的某些内容,从而触发每次构建运行它。 - Axel Heider
“EXCLUDE_FROM_DEFAULT_BUILD”是Visual Studio特定的属性,不是通用解决方案。 - Zitrax

11

你可以在脚本中再次调用CMake,例如:

add_custom_target(graphviz ALL
                  "${CMAKE_COMMAND}" "--graphviz=foo" .
                  WORKING_DIRECTORY "${CMAKE_BINARY_DIR}")

这将始终运行并触发CMake重新配置运行。是否有一种方法只在确实发生更改时运行它? - Axel Heider

0

与其他答案相比,我认为只有在需要时才运行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文件,从而绘制依赖关系。
默认情况下,TARGET graphviz目标始终构建,但它是空的,因此如果OUTPUT _graphviz没有更新,则不会调用绘图本身。
附注:看到了Alternative to CMake POST_BUILD command when target is in subdirectory的答案时发现这个。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接