VTK  9.1.0
vtkModuleGraphviz.cmake
Go to the documentation of this file.
1 #[==[
2 @ingroup module-impl
3 @brief Output a node in the graph
4 
5 Queries the properties for modules and generates the node for it in the graph
6 and its outgoing dependency edges.
7 #]==]
8 function (_vtk_module_graphviz_module_node var module)
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")
26  else ()
27  get_property(_vtk_graphviz_module_third_party
28  TARGET "${module}"
29  PROPERTY "INTERFACE_vtk_module_third_party")
30  get_property(_vtk_graphviz_module_exclude_wrap
31  TARGET "${module}"
32  PROPERTY "INTERFACE_vtk_module_exclude_wrap")
33  get_property(_vtk_graphviz_module_depends
34  TARGET "${module}"
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
39  TARGET "${module}"
40  PROPERTY "INTERFACE_vtk_module_implements")
41  get_property(_vtk_graphviz_module_implementable
42  TARGET "${module}"
43  PROPERTY "INTERFACE_vtk_module_implementable")
44  endif ()
45 
46  if (_vtk_graphviz_module_third_party)
47  set(_vtk_graphviz_shape "${_vtk_graphviz_third_party}")
48  else ()
49  set(_vtk_graphviz_shape "${_vtk_graphviz_first_party}")
50  endif ()
51 
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}")
55  else ()
56  set(_vtk_graphviz_fillcolor "${_vtk_graphviz_internal}")
57  endif ()
58  else ()
59  set(_vtk_graphviz_fillcolor "${_vtk_graphviz_external}")
60  endif ()
61 
62  if (_vtk_graphviz_module_exclude_wrap)
63  set(_vtk_graphviz_penwidth "${_vtk_graphviz_exclude_wrap}")
64  else ()
65  set(_vtk_graphviz_penwidth "${_vtk_graphviz_include_wrap}")
66  endif ()
67 
68  if (_vtk_graphviz_module_implementable)
69  set(_vtk_graphviz_color "${_vtk_graphviz_implementable}")
70  else ()
71  set(_vtk_graphviz_color "${_vtk_graphviz_not_implementable}")
72  endif ()
73 
74  set(_vtk_graphviz_node_block "\"${module}\" [
75  label=\"${module}\"
76  shape=${_vtk_graphviz_shape}
77  style=filled
78  color=${_vtk_graphviz_color}
79  fillcolor=${_vtk_graphviz_fillcolor}
80  penwidth=${_vtk_graphviz_penwidth}
81 ];\n")
82 
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")
86  endforeach ()
87 
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")
91  endforeach ()
92 
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")
97  endforeach ()
98 
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")
102  endforeach ()
103  endif ()
104 
105  set("${var}" "${_vtk_graphviz_node_block}" PARENT_SCOPE)
106 endfunction ()
107 
108 #[==[
109 @ingroup module-support
110 @brief Generate graphviz output for a module dependency graph
111 
112 Information about the modules built and/or available may be dumped to a
113 Graphviz `.dot` file.
114 
115 ~~~
116 vtk_module_graphviz(
117  MODULES <module>...
118  OUTPUT <path>
119 
120  [PRIVATE_DEPENDENCIES <ON|OFF>]
121  [KIT_CLUSTERS <ON|OFF>])
122 ~~~
123 
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
128  edges or not..
129  * `KIT_CLUSTERS`: (Default `OFF`) Whether to draw modules as part of a kit as
130  a cluster or not.
131 #]==]
132 function (vtk_module_graphviz)
133  cmake_parse_arguments(PARSE_ARGV 0 _vtk_graphviz
134  ""
135  "PRIVATE_DEPENDENCIES;KIT_CLUSTERS;OUTPUT"
136  "MODULES")
137 
138  if (_vtk_graphviz_UNPARSED_ARGUMENTS)
139  message(FATAL_ERROR
140  "Unparsed arguments for vtk_module_graphviz: "
141  "${_vtk_graphviz_UNPARSED_ARGUMENTS}")
142  endif ()
143 
144  if (NOT DEFINED _vtk_graphviz_OUTPUT)
145  message(FATAL_ERROR
146  "The `OUTPUT` argument is required.")
147  endif ()
148 
149  if (NOT _vtk_graphviz_MODULES)
150  message(FATAL_ERROR "No modules given to output.")
151  endif ()
152 
153  if (NOT DEFINED _vtk_graphviz_PRIVATE_DEPENDENCIES)
154  set(_vtk_graphviz_PRIVATE_DEPENDENCIES ON)
155  endif ()
156 
157  if (NOT DEFINED _vtk_graphviz_KIT_CLUSTERS)
158  set(_vtk_graphviz_KIT_CLUSTERS OFF)
159  endif ()
160 
161  if (NOT IS_ABSOLUTE "${_vtk_graphviz_OUTPUT}")
162  string(PREPEND _vtk_graphviz_OUTPUT "${CMAKE_BINARY_DIR}/")
163  endif ()
164 
165  set(_vtk_graphviz_kits)
166  set(_vtk_graphviz_no_kit_modules)
167 
168  if (_vtk_graphviz_KIT_CLUSTERS)
169  # Get a list of all kits.
170  foreach (_vtk_graphviz_module IN LISTS _vtk_graphviz_MODULES)
171  get_property(_vtk_graphviz_kit GLOBAL
172  PROPERTY "_vtk_module_${_vtk_graphviz_module}_kit")
173  if (_vtk_graphviz_kit)
174  list(APPEND _vtk_graphviz_kits
175  "${_vtk_graphviz_kit}")
176  else ()
177  list(APPEND _vtk_graphviz_no_kit_modules
178  "${_vtk_graphviz_module}")
179  endif ()
180  endforeach ()
181  if (_vtk_graphviz_kits)
182  list(REMOVE_DUPLICATES _vtk_graphviz_kits)
183  endif ()
184  else ()
185  set(_vtk_graphviz_no_kit_modules "${_vtk_graphviz_MODULES}")
186  endif ()
187 
188  # Shapes
189  set(_vtk_graphviz_first_party "rectangle")
190  set(_vtk_graphviz_third_party "cds")
191  set(_vtk_graphviz_internal "\"/svg/white\"")
192  set(_vtk_graphviz_external "\"/svg/cyan\"")
193 
194  # Border style
195  set(_vtk_graphviz_include_wrap "5")
196  set(_vtk_graphviz_exclude_wrap "1")
197  set(_vtk_graphviz_implementable "\"/svg/darkorchid\"")
198  set(_vtk_graphviz_not_implementable "\"/svg/coral\"")
199 
200  # Dependencies
201  set(_vtk_graphviz_public_depends "solid")
202  set(_vtk_graphviz_private_depends "dotted")
203  set(_vtk_graphviz_implements "bold")
204 
205  set(_vtk_graphviz_required_depends "normal")
206  set(_vtk_graphviz_optional_depends "empty")
207 
208  set(_vtk_graphviz_contents "strict digraph modules {\nclusterrank=local;\nrankdir=TB;\n")
209 
210  # Output modules not part of a kit.
211  string(APPEND _vtk_graphviz_contents
212  "subgraph \"modules_without_kits\" {\n")
213  foreach (_vtk_graphviz_module IN LISTS _vtk_graphviz_no_kit_modules)
214  _vtk_module_graphviz_module_node(_vtk_graphviz_node "${_vtk_graphviz_module}")
215  string(APPEND _vtk_graphviz_contents
216  "${_vtk_graphviz_node}\n")
217  endforeach ()
218  string(APPEND _vtk_graphviz_contents
219  "}\n")
220 
221  # Output kits as clusters.
222  foreach (_vtk_graphviz_kit IN LISTS _vtk_graphviz_kits)
223  string(APPEND _vtk_graphviz_contents
224  "subgraph \"cluster_${_vtk_graphviz_kit}\" {\nlabel=\"${_vtk_graphviz_kit}\"\n")
225 
226  get_property(_vtk_graphviz_kit_modules GLOBAL
227  PROPERTY "_vtk_kit_${_vtk_graphviz_kit}_kit_modules")
228  foreach (_vtk_graphviz_kit_module IN LISTS _vtk_graphviz_kit_modules)
229  if (NOT _vtk_graphviz_kit_module IN_LIST _vtk_graphviz_MODULES)
230  continue ()
231  endif ()
232 
233  _vtk_module_graphviz_module_node(_vtk_graphviz_node "${_vtk_graphviz_kit_module}")
234  string(APPEND _vtk_graphviz_contents
235  "${_vtk_graphviz_node}\n")
236 
237  endforeach ()
238 
239  string(APPEND _vtk_graphviz_contents
240  "}\n")
241  endforeach ()
242 
243  # Write the key cluster.
244  string(APPEND _vtk_graphviz_contents "
245 subgraph cluster_key {
246  label=Key;
247  subgraph cluster_party {
248  first_party [
249  label=\"First party\"
250  shape=${_vtk_graphviz_first_party}
251  style=filled
252  color=${_vtk_graphviz_not_implementable}
253  fillcolor=${_vtk_graphviz_internal}
254  penwidth=${_vtk_graphviz_include_wrap}
255  ];
256  third_party [
257  label=\"Third party\"
258  shape=${_vtk_graphviz_third_party}
259  style=filled
260  color=${_vtk_graphviz_not_implementable}
261  fillcolor=${_vtk_graphviz_internal}
262  penwidth=${_vtk_graphviz_include_wrap}
263  ];
264  }
265  subgraph cluster_whence {
266  internal [
267  label=\"Internal module\"
268  shape=${_vtk_graphviz_first_party}
269  style=filled
270  color=${_vtk_graphviz_not_implementable}
271  fillcolor=${_vtk_graphviz_internal}
272  penwidth=${_vtk_graphviz_include_wrap}
273  ];
274  external [
275  label=\"External module\"
276  shape=${_vtk_graphviz_first_party}
277  style=filled
278  color=${_vtk_graphviz_not_implementable}
279  fillcolor=${_vtk_graphviz_external}
280  penwidth=${_vtk_graphviz_include_wrap}
281  ];
282  }
283  subgraph cluster_wrapping {
284  include_wrap [
285  label=\"Wrappable\"
286  shape=${_vtk_graphviz_first_party}
287  style=filled
288  color=${_vtk_graphviz_not_implementable}
289  fillcolor=${_vtk_graphviz_internal}
290  penwidth=${_vtk_graphviz_include_wrap}
291  ];
292  exclude_wrap [
293  label=\"Not wrappable\"
294  shape=${_vtk_graphviz_first_party}
295  style=filled
296  color=${_vtk_graphviz_not_implementable}
297  fillcolor=${_vtk_graphviz_internal}
298  penwidth=${_vtk_graphviz_exclude_wrap}
299  ];
300  }
301  subgraph cluster_implementable {
302  implementable [
303  label=\"Implementable\"
304  shape=${_vtk_graphviz_first_party}
305  style=filled
306  color=${_vtk_graphviz_implementable}
307  fillcolor=${_vtk_graphviz_internal}
308  penwidth=${_vtk_graphviz_include_wrap}
309  ];
310  not_implementable [
311  label=\"Not implementable\"
312  shape=${_vtk_graphviz_first_party}
313  style=filled
314  color=${_vtk_graphviz_not_implementable}
315  fillcolor=${_vtk_graphviz_internal}
316  penwidth=${_vtk_graphviz_include_wrap}
317  ];
318  }
319  subgraph cluster_dependencies {
320  dependent [
321  label=\"Dependent\"
322  shape=${_vtk_graphviz_first_party}
323  style=filled
324  color=${_vtk_graphviz_not_implementable}
325  fillcolor=${_vtk_graphviz_internal}
326  penwidth=${_vtk_graphviz_include_wrap}
327  ];
328  private_dependee [
329  label=\"Private Dependee\"
330  shape=${_vtk_graphviz_first_party}
331  style=filled
332  color=${_vtk_graphviz_not_implementable}
333  fillcolor=${_vtk_graphviz_internal}
334  penwidth=${_vtk_graphviz_include_wrap}
335  ];
336  optional_dependee [
337  label=\"Optional Dependee\"
338  shape=${_vtk_graphviz_first_party}
339  style=filled
340  color=${_vtk_graphviz_not_implementable}
341  fillcolor=${_vtk_graphviz_internal}
342  penwidth=${_vtk_graphviz_include_wrap}
343  ];
344  public_dependee [
345  label=\"Public Dependee\"
346  shape=${_vtk_graphviz_first_party}
347  style=filled
348  color=${_vtk_graphviz_not_implementable}
349  fillcolor=${_vtk_graphviz_internal}
350  penwidth=${_vtk_graphviz_include_wrap}
351  ];
352  implemented [
353  label=\"Implemented\"
354  shape=${_vtk_graphviz_first_party}
355  style=filled
356  color=${_vtk_graphviz_implementable}
357  fillcolor=${_vtk_graphviz_internal}
358  penwidth=${_vtk_graphviz_include_wrap}
359  ];
360  dependent -> private_dependee [style=${_vtk_graphviz_private_depends}, arrowhead=${_vtk_graphviz_required_depends}];
361  dependent -> optional_dependee [style=${_vtk_graphviz_private_depends}, arrowhead=${_vtk_graphviz_optional_depends}];
362  dependent -> public_dependee [style=${_vtk_graphviz_public_depends}, arrowhead=${_vtk_graphviz_required_depends}];
363  dependent -> implemented [style=${_vtk_graphviz_implements}, arrowhead=${_vtk_graphviz_required_depends}];
364  }
365 }
366 ")
367  string(APPEND _vtk_graphviz_contents "}\n")
368 
369  #file(GENERATE
370  # OUTPUT "${_vtk_graphviz_OUTPUT}"
371  # CONTENT "${_vtk_graphviz_contents}")
372  file(WRITE "${_vtk_graphviz_OUTPUT}" "${_vtk_graphviz_contents}")
373 endfunction ()
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.
@ string
Definition: vtkX3D.h:496
std::pair< boost::graph_traits< vtkGraph * >::edge_iterator, boost::graph_traits< vtkGraph * >::edge_iterator > edges(vtkGraph *g)