VTK  9.0.2
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(_vtk_graphviz
134  ""
135  "PRIVATE_DEPENDENCIES;KIT_CLUSTERS;OUTPUT"
136  "MODULES"
137  ${ARGN})
138 
139  if (_vtk_graphviz_UNPARSED_ARGUMENTS)
140  message(FATAL_ERROR
141  "Unparsed arguments for vtk_module_graphviz: "
142  "${_vtk_graphviz_UNPARSED_ARGUMENTS}")
143  endif ()
144 
145  if (NOT DEFINED _vtk_graphviz_OUTPUT)
146  message(FATAL_ERROR
147  "The `OUTPUT` argument is required.")
148  endif ()
149 
150  if (NOT _vtk_graphviz_MODULES)
151  message(FATAL_ERROR "No modules given to output.")
152  endif ()
153 
154  if (NOT DEFINED _vtk_graphviz_PRIVATE_DEPENDENCIES)
155  set(_vtk_graphviz_PRIVATE_DEPENDENCIES ON)
156  endif ()
157 
158  if (NOT DEFINED _vtk_graphviz_KIT_CLUSTERS)
159  set(_vtk_graphviz_KIT_CLUSTERS OFF)
160  endif ()
161 
162  if (NOT IS_ABSOLUTE "${_vtk_graphviz_OUTPUT}")
163  set(_vtk_graphviz_OUTPUT "${CMAKE_BINARY_DIR}/${_vtk_graphviz_OUTPUT}")
164  endif ()
165 
166  set(_vtk_graphviz_kits)
167  set(_vtk_graphviz_no_kit_modules)
168 
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}")
177  else ()
178  list(APPEND _vtk_graphviz_no_kit_modules
179  "${_vtk_graphviz_module}")
180  endif ()
181  endforeach ()
182  if (_vtk_graphviz_kits)
183  list(REMOVE_DUPLICATES _vtk_graphviz_kits)
184  endif ()
185  else ()
186  set(_vtk_graphviz_no_kit_modules "${_vtk_graphviz_MODULES}")
187  endif ()
188 
189  # Shapes
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\"")
194 
195  # Border style
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\"")
200 
201  # Dependencies
202  set(_vtk_graphviz_public_depends "solid")
203  set(_vtk_graphviz_private_depends "dotted")
204  set(_vtk_graphviz_implements "bold")
205 
206  set(_vtk_graphviz_required_depends "normal")
207  set(_vtk_graphviz_optional_depends "empty")
208 
209  set(_vtk_graphviz_contents "strict digraph modules {\nclusterrank=local;\nrankdir=TB;\n")
210 
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)
215  _vtk_module_graphviz_module_node(_vtk_graphviz_node "${_vtk_graphviz_module}")
216  string(APPEND _vtk_graphviz_contents
217  "${_vtk_graphviz_node}\n")
218  endforeach ()
219  string(APPEND _vtk_graphviz_contents
220  "}\n")
221 
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")
226 
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)
231  continue ()
232  endif ()
233 
234  _vtk_module_graphviz_module_node(_vtk_graphviz_node "${_vtk_graphviz_kit_module}")
235  string(APPEND _vtk_graphviz_contents
236  "${_vtk_graphviz_node}\n")
237 
238  endforeach ()
239 
240  string(APPEND _vtk_graphviz_contents
241  "}\n")
242  endforeach ()
243 
244  # Write the key cluster.
245  string(APPEND _vtk_graphviz_contents "
246 subgraph cluster_key {
247  label=Key;
248  subgraph cluster_party {
249  first_party [
250  label=\"First party\"
251  shape=${_vtk_graphviz_first_party}
252  style=filled
253  color=${_vtk_graphviz_not_implementable}
254  fillcolor=${_vtk_graphviz_internal}
255  penwidth=${_vtk_graphviz_include_wrap}
256  ];
257  third_party [
258  label=\"Third party\"
259  shape=${_vtk_graphviz_third_party}
260  style=filled
261  color=${_vtk_graphviz_not_implementable}
262  fillcolor=${_vtk_graphviz_internal}
263  penwidth=${_vtk_graphviz_include_wrap}
264  ];
265  }
266  subgraph cluster_whence {
267  internal [
268  label=\"Internal module\"
269  shape=${_vtk_graphviz_first_party}
270  style=filled
271  color=${_vtk_graphviz_not_implementable}
272  fillcolor=${_vtk_graphviz_internal}
273  penwidth=${_vtk_graphviz_include_wrap}
274  ];
275  external [
276  label=\"External module\"
277  shape=${_vtk_graphviz_first_party}
278  style=filled
279  color=${_vtk_graphviz_not_implementable}
280  fillcolor=${_vtk_graphviz_external}
281  penwidth=${_vtk_graphviz_include_wrap}
282  ];
283  }
284  subgraph cluster_wrapping {
285  include_wrap [
286  label=\"Wrappable\"
287  shape=${_vtk_graphviz_first_party}
288  style=filled
289  color=${_vtk_graphviz_not_implementable}
290  fillcolor=${_vtk_graphviz_internal}
291  penwidth=${_vtk_graphviz_include_wrap}
292  ];
293  exclude_wrap [
294  label=\"Not wrappable\"
295  shape=${_vtk_graphviz_first_party}
296  style=filled
297  color=${_vtk_graphviz_not_implementable}
298  fillcolor=${_vtk_graphviz_internal}
299  penwidth=${_vtk_graphviz_exclude_wrap}
300  ];
301  }
302  subgraph cluster_implementable {
303  implementable [
304  label=\"Implementable\"
305  shape=${_vtk_graphviz_first_party}
306  style=filled
307  color=${_vtk_graphviz_implementable}
308  fillcolor=${_vtk_graphviz_internal}
309  penwidth=${_vtk_graphviz_include_wrap}
310  ];
311  not_implementable [
312  label=\"Not implementable\"
313  shape=${_vtk_graphviz_first_party}
314  style=filled
315  color=${_vtk_graphviz_not_implementable}
316  fillcolor=${_vtk_graphviz_internal}
317  penwidth=${_vtk_graphviz_include_wrap}
318  ];
319  }
320  subgraph cluster_dependencies {
321  dependent [
322  label=\"Dependent\"
323  shape=${_vtk_graphviz_first_party}
324  style=filled
325  color=${_vtk_graphviz_not_implementable}
326  fillcolor=${_vtk_graphviz_internal}
327  penwidth=${_vtk_graphviz_include_wrap}
328  ];
329  private_dependee [
330  label=\"Private Dependee\"
331  shape=${_vtk_graphviz_first_party}
332  style=filled
333  color=${_vtk_graphviz_not_implementable}
334  fillcolor=${_vtk_graphviz_internal}
335  penwidth=${_vtk_graphviz_include_wrap}
336  ];
337  optional_dependee [
338  label=\"Optional Dependee\"
339  shape=${_vtk_graphviz_first_party}
340  style=filled
341  color=${_vtk_graphviz_not_implementable}
342  fillcolor=${_vtk_graphviz_internal}
343  penwidth=${_vtk_graphviz_include_wrap}
344  ];
345  public_dependee [
346  label=\"Public Dependee\"
347  shape=${_vtk_graphviz_first_party}
348  style=filled
349  color=${_vtk_graphviz_not_implementable}
350  fillcolor=${_vtk_graphviz_internal}
351  penwidth=${_vtk_graphviz_include_wrap}
352  ];
353  implemented [
354  label=\"Implemented\"
355  shape=${_vtk_graphviz_first_party}
356  style=filled
357  color=${_vtk_graphviz_implementable}
358  fillcolor=${_vtk_graphviz_internal}
359  penwidth=${_vtk_graphviz_include_wrap}
360  ];
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}];
365  }
366 }
367 ")
368  string(APPEND _vtk_graphviz_contents "}\n")
369 
370  #file(GENERATE
371  # OUTPUT "${_vtk_graphviz_OUTPUT}"
372  # CONTENT "${_vtk_graphviz_contents}")
373  file(WRITE "${_vtk_graphviz_OUTPUT}" "${_vtk_graphviz_contents}")
374 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)