1 /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
2 file Copyright.txt or https://cmake.org/licensing for details. */
5 #include "cmConfigure.h" // IWYU pragma: keep
14 #include "cmsys/RegularExpression.hxx"
16 #include "cmGeneratedFileStream.h"
17 #include "cmLinkItem.h"
18 #include "cmLinkItemGraphVisitor.h"
19 #include "cmStateTypes.h"
21 class cmGlobalGenerator;
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
28 cmGraphVizWriter(std::string const& fileName,
29 const cmGlobalGenerator* globalGenerator);
30 ~cmGraphVizWriter() override;
32 void VisitGraph(std::string const& name) override;
34 void OnItem(cmLinkItem const& item) override;
36 void OnDirectLink(cmLinkItem const& depender, cmLinkItem const& dependee,
37 DependencyType dt) override;
39 void OnIndirectLink(cmLinkItem const& depender,
40 cmLinkItem const& dependee) override;
42 void ReadSettings(const std::string& settingsFileName,
43 const std::string& fallbackSettingsFileName);
50 Connection(cmLinkItem s, cmLinkItem d, std::string scope)
53 , scopeType(std::move(scope))
59 std::string scopeType;
61 using Connections = std::vector<Connection>;
62 using ConnectionsMap = std::map<cmLinkItem, Connections>;
64 void VisitLink(cmLinkItem const& depender, cmLinkItem const& dependee,
65 bool isDirectLink, std::string const& scopeType = "");
67 void WriteHeader(cmGeneratedFileStream& fs, std::string const& name);
69 void WriteFooter(cmGeneratedFileStream& fs);
71 void WriteLegend(cmGeneratedFileStream& fs);
73 void WriteNode(cmGeneratedFileStream& fs, cmLinkItem const& item);
75 std::unique_ptr<cmGeneratedFileStream> CreateTargetFile(
76 cmLinkItem const& target, std::string const& fileNameSuffix = "");
78 void WriteConnection(cmGeneratedFileStream& fs,
79 cmLinkItem const& dependerTargetName,
80 cmLinkItem const& dependeeTargetName,
81 std::string const& edgeStyle);
83 void FindAllConnections(const ConnectionsMap& connectionMap,
84 const cmLinkItem& rootItem,
85 Connections& extendedCons,
86 std::set<cmLinkItem>& visitedItems);
88 void FindAllConnections(const ConnectionsMap& connectionMap,
89 const cmLinkItem& rootItem,
90 Connections& extendedCons);
92 template <typename DirFunc>
93 void WritePerTargetConnections(const ConnectionsMap& connections,
94 const std::string& fileNameSuffix = "");
96 bool ItemExcluded(cmLinkItem const& item);
97 bool ItemNameFilteredOut(std::string const& itemName);
98 bool TargetTypeEnabled(cmStateEnums::TargetType targetType) const;
100 std::string ItemNameWithAliases(std::string const& itemName) const;
102 static std::string GetEdgeStyle(DependencyType dt);
104 static std::string EscapeForDotFile(std::string const& str);
106 static std::string PathSafeString(std::string const& str);
108 std::string FileName;
109 cmGeneratedFileStream GlobalFileStream;
111 ConnectionsMap PerTargetConnections;
112 ConnectionsMap TargetDependersConnections;
114 std::string GraphName;
115 std::string GraphHeader;
116 std::string GraphNodePrefix;
118 std::vector<cmsys::RegularExpression> TargetsToIgnoreRegex;
120 cmGlobalGenerator const* GlobalGenerator;
123 // maps from the actual item names to node names in dot:
124 std::map<std::string, std::string> NodeNames;
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;