cmake/Source/cmGraphVizWriter.h

138 lines
4.2 KiB
C
Raw Normal View History

2016-10-30 18:24:19 +01:00
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file Copyright.txt or https://cmake.org/licensing for details. */
2021-09-14 00:13:48 +02:00
#pragma once
2016-07-09 11:21:54 +02:00
2017-07-20 19:35:53 +02:00
#include "cmConfigure.h" // IWYU pragma: keep
2016-10-30 18:24:19 +01:00
#include <map>
2020-08-30 11:54:41 +02:00
#include <memory>
2016-10-30 18:24:19 +01:00
#include <set>
#include <string>
2020-08-30 11:54:41 +02:00
#include <utility>
2016-10-30 18:24:19 +01:00
#include <vector>
2011-01-16 11:35:12 +01:00
2020-02-01 23:06:01 +01:00
#include "cmsys/RegularExpression.hxx"
2020-08-30 11:54:41 +02:00
#include "cmGeneratedFileStream.h"
#include "cmLinkItem.h"
#include "cmLinkItemGraphVisitor.h"
2020-02-01 23:06:01 +01:00
#include "cmStateTypes.h"
2019-11-11 23:01:05 +01:00
class cmGlobalGenerator;
2011-01-16 11:35:12 +01:00
/** This class implements writing files for graphviz (dot) for graphs
* representing the dependencies between the targets in the project. */
2020-08-30 11:54:41 +02:00
class cmGraphVizWriter : public cmLinkItemGraphVisitor
2011-01-16 11:35:12 +01:00
{
public:
2020-08-30 11:54:41 +02:00
cmGraphVizWriter(std::string const& fileName,
const cmGlobalGenerator* globalGenerator);
~cmGraphVizWriter() override;
void VisitGraph(std::string const& name) override;
void OnItem(cmLinkItem const& item) override;
void OnDirectLink(cmLinkItem const& depender, cmLinkItem const& dependee,
DependencyType dt) override;
void OnIndirectLink(cmLinkItem const& depender,
cmLinkItem const& dependee) override;
2011-01-16 11:35:12 +01:00
2019-11-11 23:01:05 +01:00
void ReadSettings(const std::string& settingsFileName,
const std::string& fallbackSettingsFileName);
2011-01-16 11:35:12 +01:00
2020-08-30 11:54:41 +02:00
void Write();
private:
struct Connection
{
Connection(cmLinkItem s, cmLinkItem d, std::string scope)
: src(std::move(s))
, dst(std::move(d))
, scopeType(std::move(scope))
{
}
cmLinkItem src;
cmLinkItem dst;
std::string scopeType;
};
using Connections = std::vector<Connection>;
using ConnectionsMap = std::map<cmLinkItem, Connections>;
void VisitLink(cmLinkItem const& depender, cmLinkItem const& dependee,
bool isDirectLink, std::string const& scopeType = "");
void WriteHeader(cmGeneratedFileStream& fs, std::string const& name);
void WriteFooter(cmGeneratedFileStream& fs);
void WriteLegend(cmGeneratedFileStream& fs);
void WriteNode(cmGeneratedFileStream& fs, cmLinkItem const& item);
2021-09-14 00:13:48 +02:00
std::unique_ptr<cmGeneratedFileStream> CreateTargetFile(
cmLinkItem const& target, std::string const& fileNameSuffix = "");
2011-01-16 11:35:12 +01:00
2020-08-30 11:54:41 +02:00
void WriteConnection(cmGeneratedFileStream& fs,
cmLinkItem const& dependerTargetName,
cmLinkItem const& dependeeTargetName,
std::string const& edgeStyle);
2011-01-16 11:35:12 +01:00
2020-08-30 11:54:41 +02:00
void FindAllConnections(const ConnectionsMap& connectionMap,
const cmLinkItem& rootItem,
Connections& extendedCons,
std::set<cmLinkItem>& visitedItems);
2011-01-16 11:35:12 +01:00
2020-08-30 11:54:41 +02:00
void FindAllConnections(const ConnectionsMap& connectionMap,
const cmLinkItem& rootItem,
Connections& extendedCons);
2011-01-16 11:35:12 +01:00
2020-08-30 11:54:41 +02:00
template <typename DirFunc>
void WritePerTargetConnections(const ConnectionsMap& connections,
2021-09-14 00:13:48 +02:00
const std::string& fileNameSuffix = "");
2011-01-16 11:35:12 +01:00
2020-08-30 11:54:41 +02:00
bool ItemExcluded(cmLinkItem const& item);
bool ItemNameFilteredOut(std::string const& itemName);
bool TargetTypeEnabled(cmStateEnums::TargetType targetType) const;
2011-01-16 11:35:12 +01:00
2020-08-30 11:54:41 +02:00
std::string ItemNameWithAliases(std::string const& itemName) const;
2011-01-16 11:35:12 +01:00
2020-08-30 11:54:41 +02:00
static std::string GetEdgeStyle(DependencyType dt);
2011-06-19 15:41:06 +03:00
2020-08-30 11:54:41 +02:00
static std::string EscapeForDotFile(std::string const& str);
2011-01-16 11:35:12 +01:00
2020-08-30 11:54:41 +02:00
static std::string PathSafeString(std::string const& str);
2011-01-16 11:35:12 +01:00
2020-08-30 11:54:41 +02:00
std::string FileName;
cmGeneratedFileStream GlobalFileStream;
2011-01-16 11:35:12 +01:00
2020-08-30 11:54:41 +02:00
ConnectionsMap PerTargetConnections;
ConnectionsMap TargetDependersConnections;
2011-01-16 11:35:12 +01:00
2015-04-27 22:25:09 +02:00
std::string GraphName;
std::string GraphHeader;
std::string GraphNodePrefix;
2011-01-16 11:35:12 +01:00
2011-06-19 15:41:06 +03:00
std::vector<cmsys::RegularExpression> TargetsToIgnoreRegex;
2011-01-16 11:35:12 +01:00
2020-08-30 11:54:41 +02:00
cmGlobalGenerator const* GlobalGenerator;
2011-01-16 11:35:12 +01:00
2020-08-30 11:54:41 +02:00
int NextNodeId;
// maps from the actual item names to node names in dot:
std::map<std::string, std::string> NodeNames;
2011-01-16 11:35:12 +01:00
2015-11-17 17:22:37 +01:00
bool GenerateForExecutables;
bool GenerateForStaticLibs;
bool GenerateForSharedLibs;
bool GenerateForModuleLibs;
2020-08-30 11:54:41 +02:00
bool GenerateForInterfaceLibs;
bool GenerateForObjectLibs;
bool GenerateForUnknownLibs;
bool GenerateForCustomTargets;
2015-11-17 17:22:37 +01:00
bool GenerateForExternals;
bool GeneratePerTarget;
bool GenerateDependers;
2011-01-16 11:35:12 +01:00
};