resolve cyclic dependency with zstd
[platform/upstream/cmake.git] / Source / cmGraphVizWriter.h
1 /* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
2    file Copyright.txt or https://cmake.org/licensing for details.  */
3 #pragma once
4
5 #include "cmConfigure.h" // IWYU pragma: keep
6
7 #include <map>
8 #include <memory>
9 #include <set>
10 #include <string>
11 #include <utility>
12 #include <vector>
13
14 #include "cmsys/RegularExpression.hxx"
15
16 #include "cmGeneratedFileStream.h"
17 #include "cmLinkItem.h"
18 #include "cmLinkItemGraphVisitor.h"
19 #include "cmStateTypes.h"
20
21 class cmGlobalGenerator;
22
23 /** This class implements writing files for graphviz (dot) for graphs
24  * representing the dependencies between the targets in the project. */
25 class cmGraphVizWriter : public cmLinkItemGraphVisitor
26 {
27 public:
28   cmGraphVizWriter(std::string const& fileName,
29                    const cmGlobalGenerator* globalGenerator);
30   ~cmGraphVizWriter() override;
31
32   void VisitGraph(std::string const& name) override;
33
34   void OnItem(cmLinkItem const& item) override;
35
36   void OnDirectLink(cmLinkItem const& depender, cmLinkItem const& dependee,
37                     DependencyType dt) override;
38
39   void OnIndirectLink(cmLinkItem const& depender,
40                       cmLinkItem const& dependee) override;
41
42   void ReadSettings(const std::string& settingsFileName,
43                     const std::string& fallbackSettingsFileName);
44
45   void Write();
46
47 private:
48   struct Connection
49   {
50     Connection(cmLinkItem s, cmLinkItem d, std::string scope)
51       : src(std::move(s))
52       , dst(std::move(d))
53       , scopeType(std::move(scope))
54     {
55     }
56
57     cmLinkItem src;
58     cmLinkItem dst;
59     std::string scopeType;
60   };
61   using Connections = std::vector<Connection>;
62   using ConnectionsMap = std::map<cmLinkItem, Connections>;
63
64   void VisitLink(cmLinkItem const& depender, cmLinkItem const& dependee,
65                  bool isDirectLink, std::string const& scopeType = "");
66
67   void WriteHeader(cmGeneratedFileStream& fs, std::string const& name);
68
69   void WriteFooter(cmGeneratedFileStream& fs);
70
71   void WriteLegend(cmGeneratedFileStream& fs);
72
73   void WriteNode(cmGeneratedFileStream& fs, cmLinkItem const& item);
74
75   std::unique_ptr<cmGeneratedFileStream> CreateTargetFile(
76     cmLinkItem const& target, std::string const& fileNameSuffix = "");
77
78   void WriteConnection(cmGeneratedFileStream& fs,
79                        cmLinkItem const& dependerTargetName,
80                        cmLinkItem const& dependeeTargetName,
81                        std::string const& edgeStyle);
82
83   void FindAllConnections(const ConnectionsMap& connectionMap,
84                           const cmLinkItem& rootItem,
85                           Connections& extendedCons,
86                           std::set<cmLinkItem>& visitedItems);
87
88   void FindAllConnections(const ConnectionsMap& connectionMap,
89                           const cmLinkItem& rootItem,
90                           Connections& extendedCons);
91
92   template <typename DirFunc>
93   void WritePerTargetConnections(const ConnectionsMap& connections,
94                                  const std::string& fileNameSuffix = "");
95
96   bool ItemExcluded(cmLinkItem const& item);
97   bool ItemNameFilteredOut(std::string const& itemName);
98   bool TargetTypeEnabled(cmStateEnums::TargetType targetType) const;
99
100   std::string ItemNameWithAliases(std::string const& itemName) const;
101
102   static std::string GetEdgeStyle(DependencyType dt);
103
104   static std::string EscapeForDotFile(std::string const& str);
105
106   static std::string PathSafeString(std::string const& str);
107
108   std::string FileName;
109   cmGeneratedFileStream GlobalFileStream;
110
111   ConnectionsMap PerTargetConnections;
112   ConnectionsMap TargetDependersConnections;
113
114   std::string GraphName;
115   std::string GraphHeader;
116   std::string GraphNodePrefix;
117
118   std::vector<cmsys::RegularExpression> TargetsToIgnoreRegex;
119
120   cmGlobalGenerator const* GlobalGenerator;
121
122   int NextNodeId = 0;
123   // maps from the actual item names to node names in dot:
124   std::map<std::string, std::string> NodeNames;
125
126   bool GenerateForExecutables = true;
127   bool GenerateForStaticLibs = true;
128   bool GenerateForSharedLibs = true;
129   bool GenerateForModuleLibs = true;
130   bool GenerateForInterfaceLibs = true;
131   bool GenerateForObjectLibs = true;
132   bool GenerateForUnknownLibs = true;
133   bool GenerateForCustomTargets = false;
134   bool GenerateForExternals = true;
135   bool GeneratePerTarget = true;
136   bool GenerateDependers = true;
137 };