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
133 cmake_parse_arguments(_vtk_graphviz
135 "PRIVATE_DEPENDENCIES;KIT_CLUSTERS;OUTPUT" 139 if (_vtk_graphviz_UNPARSED_ARGUMENTS)
141 "Unparsed arguments for vtk_module_graphviz: " 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)