mirror of
https://github.com/reactos/CMake.git
synced 2024-11-24 03:59:58 +00:00
553658393c
* Added a fairly comprehensive test suite * Separated the graph traversal logic from the Graphviz generation code by introducing a new class, cmLinkItemsGraphVisitor{.h,cxx} * Made the graph traversal logic less ad-hoc by using existing methods in the GlobalGenerator; this fixed a few bugs * Added support for new target types: custom targets, object and unknown libraries * Improved support for ALIAS libraries by showing the alias(es) in the graph * Introduced new flags to control those new libraries (consistent with existing flags) * Updated the documentation * Removed useless setting to set graph type in dot file * Improved the node/edge shapes (nicer, more consistent) * Added a legend to the graph * Some refactoring and cleanup of the Graphviz generation code * Added test and fix for issue 19746
76 lines
2.2 KiB
C++
76 lines
2.2 KiB
C++
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
|
file Copyright.txt or https://cmake.org/licensing for details. */
|
|
#ifndef cmLinkItemGraphVisitor_h
|
|
#define cmLinkItemGraphVisitor_h
|
|
|
|
#include <map>
|
|
#include <set>
|
|
#include <string>
|
|
#include <utility>
|
|
|
|
#include "cmLinkItem.h"
|
|
|
|
class cmGeneratorTarget;
|
|
|
|
/** \class cmLinkItemGraphVisitor
|
|
* \brief Visits a graph of linked items.
|
|
*
|
|
* Allows to visit items and dependency links (direct and indirect) between
|
|
* those items.
|
|
* This abstract class takes care of the graph traversal, making sure that:
|
|
* - it terminates even in the presence of cycles;
|
|
* - it visits every object once (and only once);
|
|
* - it visits the objects in the same order every time.
|
|
*
|
|
* Children classes only have to implement OnItem() etc. to handle whatever
|
|
* logic they care about.
|
|
*/
|
|
class cmLinkItemGraphVisitor
|
|
{
|
|
public:
|
|
virtual ~cmLinkItemGraphVisitor() = default;
|
|
|
|
virtual void VisitGraph(std::string const& name) = 0;
|
|
|
|
void VisitItem(cmLinkItem const& item);
|
|
|
|
protected:
|
|
enum class DependencyType
|
|
{
|
|
LinkInterface,
|
|
LinkPublic,
|
|
LinkPrivate,
|
|
Object,
|
|
Utility
|
|
};
|
|
|
|
virtual void OnItem(cmLinkItem const& item) = 0;
|
|
|
|
virtual void OnDirectLink(cmLinkItem const& depender,
|
|
cmLinkItem const& dependee, DependencyType dt) = 0;
|
|
|
|
virtual void OnIndirectLink(cmLinkItem const& depender,
|
|
cmLinkItem const& dependee) = 0;
|
|
|
|
private:
|
|
std::set<std::string> VisitedItems;
|
|
|
|
std::set<std::pair<std::string, std::string>> VisitedLinks;
|
|
|
|
void VisitLinks(cmLinkItem const& item, cmLinkItem const& rootItem);
|
|
void VisitLinks(cmLinkItem const& item, cmLinkItem const& rootItem,
|
|
std::string const& config);
|
|
|
|
using Dependency = std::pair<DependencyType, cmLinkItem>;
|
|
using DependencyMap = std::map<std::string, Dependency>;
|
|
|
|
bool ItemVisited(cmLinkItem const& item);
|
|
bool LinkVisited(cmLinkItem const& depender, cmLinkItem const& dependee);
|
|
|
|
static void GetDependencies(cmGeneratorTarget const& target,
|
|
std::string const& config,
|
|
DependencyMap& dependencies);
|
|
};
|
|
|
|
#endif
|