Cmake 使用GRAPHVIZ_custom_targets=TRUE为自定义目标生成依赖关系图

Cmake 使用GRAPHVIZ_custom_targets=TRUE为自定义目标生成依赖关系图,cmake,graphviz,Cmake,Graphviz,(使用底部的工作解决方案进行更新) 据我所知,到目前为止,支持使用自定义目标生成依赖关系图。但是,当尝试这样做时,我的目标之间没有依赖关系映射,我得到以下警告: CMake Warning: Manually-specified variables were not used by the project: GRAPHVIZ_CUSTOM_TARGETS 我偶然发现了这个答案,但没有多大帮助。我能找到的下一个最接近的东西是支持一些不同用例的不完整代码 我在Windows上运行这个

(使用底部的工作解决方案进行更新)

据我所知,到目前为止,支持使用自定义目标生成依赖关系图。但是,当尝试这样做时,我的目标之间没有依赖关系映射,我得到以下警告:

CMake Warning:
  Manually-specified variables were not used by the project:

    GRAPHVIZ_CUSTOM_TARGETS
我偶然发现了这个答案,但没有多大帮助。我能找到的下一个最接近的东西是支持一些不同用例的不完整代码

我在Windows上运行这个,但我不知道这是否是问题所在

所以,我被难住了,在我对KitWare提起诉讼之前,我需要一些帮助。。。因为我觉得我错过了一些非常明显的东西。任何帮助都将不胜感激

CMakeLists.txt

cmake_minimum_required(VERSION 3.18)

project(
    gviz 
    LANGUAGES NONE
)
add_custom_command(
    OUTPUT foo.txt
    COMMAND cmake --version > foo.txt
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
)

add_custom_command(
    OUTPUT bar.txt
    COMMAND cmake --version > bar.txt
    DEPENDS foo.txt
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
)


add_custom_target(
    foo
    DEPENDS foo.txt
)

add_custom_target(
    bar
    DEPENDS bar.txt
)
命令从控制台运行,并输出:

控制台输出:

cmake_graphviz> cmake --graphviz=group.dot -BNBuild -GNinja . -DGRAPHVIZ_CUSTOM_TARGETS=TRUE
-- Configuring done
-- Generating done
Generate graphviz: cmake_graphviz/group.dot
CMake Warning:
  Manually-specified variables were not used by the project:

    GRAPHVIZ_CUSTOM_TARGETS


-- Build files have been written to: cmake_graphviz/NBuild
最后是
group.dot
文件:

digraph "gviz" {
node [
  fontsize = "12"
];
subgraph clusterLegend {
  label = "Legend";
  color = black;
  edge [ style = invis ];
  legendNode0 [ label = "Executable", shape = egg ];
  legendNode1 [ label = "Static Library", shape = octagon ];
  legendNode2 [ label = "Shared Library", shape = doubleoctagon ];
  legendNode3 [ label = "Module Library", shape = tripleoctagon ];
  legendNode4 [ label = "Interface Library", shape = pentagon ];
  legendNode5 [ label = "Object Library", shape = hexagon ];
  legendNode6 [ label = "Unknown Library", shape = septagon ];
  legendNode7 [ label = "Custom Target", shape = box ];
  legendNode0 -> legendNode1 [ style = solid ];
  legendNode0 -> legendNode2 [ style = solid ];
  legendNode0 -> legendNode3;
  legendNode1 -> legendNode4 [ label = "Interface", style = dashed ];
  legendNode2 -> legendNode5 [ label = "Private", style = dotted ];
  legendNode3 -> legendNode6 [ style = solid ];
  legendNode0 -> legendNode7;
}
}
工作解决方案:

CMakeLists.txt

cmake_minimum_required(VERSION 3.18)

project(
    gviz 
    LANGUAGES NONE
)

# Because I don't like cmake files flooding my root directory
file(COPY cmake/CMakeGraphVizOptions.cmake DESTINATION ${CMAKE_BINARY_DIR})

add_custom_command(
    OUTPUT foo.txt
    COMMAND cmake --version > foo.txt
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
)

add_custom_command(
    OUTPUT bar.txt
    COMMAND cmake --version > bar.txt
    DEPENDS foo.txt
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
)


add_custom_target(
    foo
    DEPENDS foo.txt
)

add_custom_target(bar)

add_dependencies(bar foo)
cmake/CMakeGraphVizOptions.cmake

# This file sets some options to control GraphViz graphs.
set(GRAPHVIZ_GRAPH_NAME "MyGraph")
set(GRAPHVIZ_CUSTOM_TARGETS TRUE)
set(GRAPHVIZ_NODE_PREFIX "blah")
文件列表输出:

group.dot
group.dot.bar
group.dot.foo
group.dot.bar.dependers
group.dot.bar.dependers
现在,我唯一的问题是,它似乎没有通过文件输出链接依赖项,但这超出了这个问题的范围:)

在链接中,它声明:

生成的图形的外观和内容可以使用文件
CMakeGraphVizOptions.cmake
进行控制。首先在
CMAKE\u BINARY\u DIR
中搜索此文件,然后在
CMAKE\u SOURCE\u DIR
中搜索。如果找到,其中设置的变量将用于调整生成的Graphviz文件的选项

因此,不要在
cmake
命令行中设置
GRAPHVIZ\u CUSTOM\u目标,而是将其设置在名为
CMakeGraphVizOptions.cmake
的文件中,并将此文件添加到顶级源代码目录中

示例
CMakeGraphVizOptions.cmake

# This file sets some options to control GraphViz graphs.
set(GRAPHVIZ_GRAPH_NAME "MyGraph")
set(GRAPHVIZ_CUSTOM_TARGETS TRUE)

非常感谢。不幸的是,图表中缺少的“链接”可能是由于链接的Kitware合并请求的未完成状态。听起来要完成这个定制的目标图形功能还有很多工作要做。