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}")