3 @brief Output a node in the graph
5 Queries the properties
for modules and generates the node
for it in the graph
6 and its outgoing dependency
edges.
9 get_property(_vtk_graphviz_file GLOBAL
10 PROPERTY
"_vtk_module_${module}_file")
11 if (_vtk_graphviz_file)
12 get_property(_vtk_graphviz_module_third_party GLOBAL
13 PROPERTY
"_vtk_module_${module}_third_party")
14 get_property(_vtk_graphviz_module_exclude_wrap GLOBAL
15 PROPERTY
"_vtk_module_${module}_exclude_wrap")
16 get_property(_vtk_graphviz_module_depends GLOBAL
17 PROPERTY
"_vtk_module_${module}_depends")
18 get_property(_vtk_graphviz_module_private_depends GLOBAL
19 PROPERTY
"_vtk_module_${module}_private_depends")
20 get_property(_vtk_graphviz_module_optional_depends GLOBAL
21 PROPERTY
"_vtk_module_${module}_optional_depends")
22 get_property(_vtk_graphviz_module_implements GLOBAL
23 PROPERTY
"_vtk_module_${module}_implements")
24 get_property(_vtk_graphviz_module_implementable GLOBAL
25 PROPERTY
"_vtk_module_${module}_implementable")
27 get_property(_vtk_graphviz_module_third_party
29 PROPERTY
"INTERFACE_vtk_module_third_party")
30 get_property(_vtk_graphviz_module_exclude_wrap
32 PROPERTY
"INTERFACE_vtk_module_exclude_wrap")
33 get_property(_vtk_graphviz_module_depends
35 PROPERTY
"INTERFACE_vtk_module_depends")
36 set(_vtk_graphviz_module_private_depends)
37 set(_vtk_graphviz_module_optional_depends)
38 get_property(_vtk_graphviz_module_implements
40 PROPERTY
"INTERFACE_vtk_module_implements")
41 get_property(_vtk_graphviz_module_implementable
43 PROPERTY
"INTERFACE_vtk_module_implementable")
46 if (_vtk_graphviz_module_third_party)
47 set(_vtk_graphviz_shape "${_vtk_graphviz_third_party}
") 49 set(_vtk_graphviz_shape "${_vtk_graphviz_first_party}
") 52 if (_vtk_graphviz_file) 53 if (DEFINED "VTK_MODULE_USE_EXTERNAL_${module}
" AND VTK_MODULE_USE_EXTERNAL_${module}) 54 set(_vtk_graphviz_fillcolor "${_vtk_graphviz_external}
") 56 set(_vtk_graphviz_fillcolor "${_vtk_graphviz_internal}
") 59 set(_vtk_graphviz_fillcolor "${_vtk_graphviz_external}
") 62 if (_vtk_graphviz_module_exclude_wrap) 63 set(_vtk_graphviz_penwidth "${_vtk_graphviz_exclude_wrap}
") 65 set(_vtk_graphviz_penwidth "${_vtk_graphviz_include_wrap}
") 68 if (_vtk_graphviz_module_implementable) 69 set(_vtk_graphviz_color "${_vtk_graphviz_implementable}
") 71 set(_vtk_graphviz_color "${_vtk_graphviz_not_implementable}
") 74 set(_vtk_graphviz_node_block "\
"${module}\" [ 76 shape=${_vtk_graphviz_shape} 78 color=${_vtk_graphviz_color} 79 fillcolor=${_vtk_graphviz_fillcolor} 80 penwidth=${_vtk_graphviz_penwidth} 83 foreach (_vtk_graphviz_module_implement IN LISTS _vtk_graphviz_module_implements)
84 string(APPEND _vtk_graphviz_node_block
85 "\"${module}\" -> \"${_vtk_graphviz_module_implement}\" [style=${_vtk_graphviz_implements}, arrowhead=${_vtk_graphviz_required_depends}];\n")
88 foreach (_vtk_graphviz_module_depend IN LISTS _vtk_graphviz_module_depends)
89 string(APPEND _vtk_graphviz_node_block
90 "\"${module}\
" -> \"${_vtk_graphviz_module_depend}\" [style=${_vtk_graphviz_public_depends}, arrowhead=${_vtk_graphviz_required_depends}];\n")
93 if (_vtk_graphviz_PRIVATE_DEPENDENCIES)
94 foreach (_vtk_graphviz_module_private_depend IN LISTS _vtk_graphviz_module_private_depends)
95 string(APPEND _vtk_graphviz_node_block
96 "\"${module}\
" -> \"${_vtk_graphviz_module_private_depend}\" [style=${_vtk_graphviz_private_depends}, arrowhead=${_vtk_graphviz_required_depends}];\n")
99 foreach (_vtk_graphviz_module_optional_depend IN LISTS _vtk_graphviz_module_optional_depends)
100 string(APPEND _vtk_graphviz_node_block
101 "\"${module}\
" -> \"${_vtk_graphviz_module_optional_depend}\" [style=${_vtk_graphviz_optional_depends}, arrowhead=${_vtk_graphviz_optional_depends}];\n")
105 set("${var}
" "${_vtk_graphviz_node_block}
" PARENT_SCOPE) 109 @ingroup module-support 110 @brief Generate graphviz output for a module dependency graph 112 Information about the modules built and/or available may be dumped to a 113 Graphviz `.dot` file. 120 [PRIVATE_DEPENDENCIES <ON|OFF>] 121 [KIT_CLUSTERS <ON|OFF>]) 124 * `MODULES`: (Required) The modules to output information for. 125 * `OUTPUT`: (Required) A Graphviz file describing the modules built will 126 be output to this path. Relative paths are rooted to `CMAKE_BINARY_DIR`. 127 * `PRIVATE_DEPENDENCIES`: (Default `ON`) Whether to draw private dependency 129 * `KIT_CLUSTERS`: (Default `OFF`) Whether to draw modules as part of a kit as 132 function (vtk_module_graphviz) 133 cmake_parse_arguments(_vtk_graphviz 135 "PRIVATE_DEPENDENCIES;KIT_CLUSTERS;OUTPUT
" 139 if (_vtk_graphviz_UNPARSED_ARGUMENTS) 142 "${_vtk_graphviz_UNPARSED_ARGUMENTS}
") 145 if (NOT DEFINED _vtk_graphviz_OUTPUT) 147 "The `OUTPUT` argument is required.
") 150 if (NOT _vtk_graphviz_MODULES) 151 message(FATAL_ERROR "No modules given to output.
") 154 if (NOT DEFINED _vtk_graphviz_PRIVATE_DEPENDENCIES) 155 set(_vtk_graphviz_PRIVATE_DEPENDENCIES ON) 158 if (NOT DEFINED _vtk_graphviz_KIT_CLUSTERS) 159 set(_vtk_graphviz_KIT_CLUSTERS OFF) 162 if (NOT IS_ABSOLUTE "${_vtk_graphviz_OUTPUT}
") 163 set(_vtk_graphviz_OUTPUT "${CMAKE_BINARY_DIR}/${_vtk_graphviz_OUTPUT}
") 166 set(_vtk_graphviz_kits) 167 set(_vtk_graphviz_no_kit_modules) 169 if (_vtk_graphviz_KIT_CLUSTERS) 170 # Get a list of all kits. 171 foreach (_vtk_graphviz_module IN LISTS _vtk_graphviz_MODULES) 172 get_property(_vtk_graphviz_kit GLOBAL 173 PROPERTY "_vtk_module_${_vtk_graphviz_module}_kit
") 174 if (_vtk_graphviz_kit) 175 list(APPEND _vtk_graphviz_kits 176 "${_vtk_graphviz_kit}
") 178 list(APPEND _vtk_graphviz_no_kit_modules 179 "${_vtk_graphviz_module}
") 182 if (_vtk_graphviz_kits) 183 list(REMOVE_DUPLICATES _vtk_graphviz_kits) 186 set(_vtk_graphviz_no_kit_modules "${_vtk_graphviz_MODULES}
") 190 set(_vtk_graphviz_first_party "rectangle
") 191 set(_vtk_graphviz_third_party "cds
") 192 set(_vtk_graphviz_internal "\
"/svg/white\"")
193 set(_vtk_graphviz_external
"\"/svg/cyan\"")
196 set(_vtk_graphviz_include_wrap
"5")
197 set(_vtk_graphviz_exclude_wrap
"1")
198 set(_vtk_graphviz_implementable
"\"/svg/darkorchid\"")
199 set(_vtk_graphviz_not_implementable
"\"/svg/coral\"")
202 set(_vtk_graphviz_public_depends
"solid")
203 set(_vtk_graphviz_private_depends
"dotted")
204 set(_vtk_graphviz_implements
"bold")
206 set(_vtk_graphviz_required_depends
"normal")
207 set(_vtk_graphviz_optional_depends
"empty")
209 set(_vtk_graphviz_contents
"strict digraph modules {\nclusterrank=local;\nrankdir=TB;\n")
211 # Output modules not part of a kit. 212 string(APPEND _vtk_graphviz_contents
213 "subgraph \"modules_without_kits\" {\n")
214 foreach (_vtk_graphviz_module IN LISTS _vtk_graphviz_no_kit_modules)
216 string(APPEND _vtk_graphviz_contents
217 "${_vtk_graphviz_node}\n")
219 string(APPEND _vtk_graphviz_contents
222 # Output kits as clusters. 223 foreach (_vtk_graphviz_kit IN LISTS _vtk_graphviz_kits)
224 string(APPEND _vtk_graphviz_contents
225 "subgraph \"cluster_${_vtk_graphviz_kit}\" {\nlabel=\"${_vtk_graphviz_kit}\"\n")
227 get_property(_vtk_graphviz_kit_modules GLOBAL
228 PROPERTY
"_vtk_kit_${_vtk_graphviz_kit}_kit_modules")
229 foreach (_vtk_graphviz_kit_module IN LISTS _vtk_graphviz_kit_modules)
230 if (NOT _vtk_graphviz_kit_module IN_LIST _vtk_graphviz_MODULES)
235 string(APPEND _vtk_graphviz_contents 236 "${_vtk_graphviz_node}\n
") 240 string(APPEND _vtk_graphviz_contents 244 # Write the key cluster. 245 string(APPEND _vtk_graphviz_contents " 246 subgraph cluster_key {
248 subgraph cluster_party {
250 label=\
"First party\" 251 shape=${_vtk_graphviz_first_party} 253 color=${_vtk_graphviz_not_implementable} 254 fillcolor=${_vtk_graphviz_internal} 255 penwidth=${_vtk_graphviz_include_wrap} 258 label=\"Third party\" 259 shape=${_vtk_graphviz_third_party} 261 color=${_vtk_graphviz_not_implementable} 262 fillcolor=${_vtk_graphviz_internal} 263 penwidth=${_vtk_graphviz_include_wrap} 266 subgraph cluster_whence { 268 label=\"Internal module\" 269 shape=${_vtk_graphviz_first_party} 271 color=${_vtk_graphviz_not_implementable} 272 fillcolor=${_vtk_graphviz_internal} 273 penwidth=${_vtk_graphviz_include_wrap} 276 label=\"External module\" 277 shape=${_vtk_graphviz_first_party} 279 color=${_vtk_graphviz_not_implementable} 280 fillcolor=${_vtk_graphviz_external} 281 penwidth=${_vtk_graphviz_include_wrap} 284 subgraph cluster_wrapping { 287 shape=${_vtk_graphviz_first_party} 289 color=${_vtk_graphviz_not_implementable} 290 fillcolor=${_vtk_graphviz_internal} 291 penwidth=${_vtk_graphviz_include_wrap} 294 label=\"Not wrappable\" 295 shape=${_vtk_graphviz_first_party} 297 color=${_vtk_graphviz_not_implementable} 298 fillcolor=${_vtk_graphviz_internal} 299 penwidth=${_vtk_graphviz_exclude_wrap} 302 subgraph cluster_implementable { 304 label=\"Implementable\" 305 shape=${_vtk_graphviz_first_party} 307 color=${_vtk_graphviz_implementable} 308 fillcolor=${_vtk_graphviz_internal} 309 penwidth=${_vtk_graphviz_include_wrap} 312 label=\"Not implementable\" 313 shape=${_vtk_graphviz_first_party} 315 color=${_vtk_graphviz_not_implementable} 316 fillcolor=${_vtk_graphviz_internal} 317 penwidth=${_vtk_graphviz_include_wrap} 320 subgraph cluster_dependencies { 323 shape=${_vtk_graphviz_first_party} 325 color=${_vtk_graphviz_not_implementable} 326 fillcolor=${_vtk_graphviz_internal} 327 penwidth=${_vtk_graphviz_include_wrap} 330 label=\"Private Dependee\" 331 shape=${_vtk_graphviz_first_party} 333 color=${_vtk_graphviz_not_implementable} 334 fillcolor=${_vtk_graphviz_internal} 335 penwidth=${_vtk_graphviz_include_wrap} 338 label=\"Optional Dependee\" 339 shape=${_vtk_graphviz_first_party} 341 color=${_vtk_graphviz_not_implementable} 342 fillcolor=${_vtk_graphviz_internal} 343 penwidth=${_vtk_graphviz_include_wrap} 346 label=\"Public Dependee\" 347 shape=${_vtk_graphviz_first_party} 349 color=${_vtk_graphviz_not_implementable} 350 fillcolor=${_vtk_graphviz_internal} 351 penwidth=${_vtk_graphviz_include_wrap} 354 label=\"Implemented\" 355 shape=${_vtk_graphviz_first_party} 357 color=${_vtk_graphviz_implementable} 358 fillcolor=${_vtk_graphviz_internal} 359 penwidth=${_vtk_graphviz_include_wrap} 361 dependent -> private_dependee [style=${_vtk_graphviz_private_depends}, arrowhead=${_vtk_graphviz_required_depends}]; 362 dependent -> optional_dependee [style=${_vtk_graphviz_private_depends}, arrowhead=${_vtk_graphviz_optional_depends}]; 363 dependent -> public_dependee [style=${_vtk_graphviz_public_depends}, arrowhead=${_vtk_graphviz_required_depends}]; 364 dependent -> implemented [style=${_vtk_graphviz_implements}, arrowhead=${_vtk_graphviz_required_depends}]; 368 string(APPEND _vtk_graphviz_contents
"}\n")
371 # OUTPUT "${_vtk_graphviz_OUTPUT}" 372 # CONTENT "${_vtk_graphviz_contents}") 373 file(WRITE
"${_vtk_graphviz_OUTPUT}" "${_vtk_graphviz_contents}")
function _vtk_module_graphviz_module_node(var, module)
Output a node in the graph
function vtk_module_graphviz()
Generate graphviz output for a module dependency graph
std::pair< boost::graph_traits< vtkGraph * >::edge_iterator, boost::graph_traits< vtkGraph * >::edge_iterator > edges(vtkGraph *g)