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