mirror of
https://github.com/reactos/CMake.git
synced 2024-11-28 05:50:42 +00:00
graphviz: dereference ALIAS targets
Previous behavior treats ALIAS targets as external targets. This fix de-aliases these targets to their pointed target. Fixes: #15636
This commit is contained in:
parent
da1580b48e
commit
50c4dec072
@ -68,7 +68,7 @@ const char* getShapeForTarget(const cmGeneratorTarget* target)
|
||||
}
|
||||
|
||||
std::map<std::string, LinkLibraryScopeType> getScopedLinkLibrariesFromTarget(
|
||||
cmTarget* Target)
|
||||
cmTarget* Target, const cmGlobalGenerator* globalGenerator)
|
||||
{
|
||||
char sep = ';';
|
||||
std::map<std::string, LinkLibraryScopeType> tokens;
|
||||
@ -95,6 +95,13 @@ std::map<std::string, LinkLibraryScopeType> getScopedLinkLibrariesFromTarget(
|
||||
}
|
||||
|
||||
std::string element = interfaceLinkLibraries.substr(start, end - start);
|
||||
if (globalGenerator->IsAlias(element)) {
|
||||
const auto tgt = globalGenerator->FindTarget(element);
|
||||
if (tgt) {
|
||||
element = tgt->GetName();
|
||||
}
|
||||
}
|
||||
|
||||
if (std::string::npos == element.find("$<LINK_ONLY:", 0)) {
|
||||
// we assume first, that this library is an interface library.
|
||||
// if we find it again in the linklibraries property, we promote it to an
|
||||
@ -116,6 +123,12 @@ std::map<std::string, LinkLibraryScopeType> getScopedLinkLibrariesFromTarget(
|
||||
}
|
||||
|
||||
std::string element = linkLibraries.substr(start, end - start);
|
||||
if (globalGenerator->IsAlias(element)) {
|
||||
const auto tgt = globalGenerator->FindTarget(element);
|
||||
if (tgt) {
|
||||
element = tgt->GetName();
|
||||
}
|
||||
}
|
||||
|
||||
if (tokens.find(element) == tokens.end()) {
|
||||
// this library is not found in interfaceLinkLibraries but in
|
||||
@ -137,13 +150,13 @@ std::map<std::string, LinkLibraryScopeType> getScopedLinkLibrariesFromTarget(
|
||||
}
|
||||
}
|
||||
|
||||
cmGraphVizWriter::cmGraphVizWriter(
|
||||
const std::vector<cmLocalGenerator*>& localGenerators)
|
||||
cmGraphVizWriter::cmGraphVizWriter(const cmGlobalGenerator* globalGenerator)
|
||||
: GraphType("digraph")
|
||||
, GraphName("GG")
|
||||
, GraphHeader("node [\n fontsize = \"12\"\n];")
|
||||
, GraphNodePrefix("node")
|
||||
, LocalGenerators(localGenerators)
|
||||
, GlobalGenerator(globalGenerator)
|
||||
, LocalGenerators(globalGenerator->GetLocalGenerators())
|
||||
, GenerateForExecutables(true)
|
||||
, GenerateForStaticLibs(true)
|
||||
, GenerateForSharedLibs(true)
|
||||
@ -374,7 +387,8 @@ void cmGraphVizWriter::WriteConnections(
|
||||
|
||||
std::string myNodeName = this->TargetNamesNodes.find(targetName)->second;
|
||||
std::map<std::string, LinkLibraryScopeType> ll =
|
||||
getScopedLinkLibrariesFromTarget(targetPtrIt->second->Target);
|
||||
getScopedLinkLibrariesFromTarget(targetPtrIt->second->Target,
|
||||
GlobalGenerator);
|
||||
|
||||
for (auto const& llit : ll) {
|
||||
const char* libName = llit.first.c_str();
|
||||
@ -439,7 +453,7 @@ void cmGraphVizWriter::WriteDependerConnections(
|
||||
// Now we have a target, check whether it links against targetName.
|
||||
// If so, draw a connection, and then continue with dependers on that one.
|
||||
std::map<std::string, LinkLibraryScopeType> ll =
|
||||
getScopedLinkLibrariesFromTarget(tptr.second->Target);
|
||||
getScopedLinkLibrariesFromTarget(tptr.second->Target, GlobalGenerator);
|
||||
|
||||
for (auto const& llit : ll) {
|
||||
if (llit.first == targetName) {
|
||||
@ -540,6 +554,13 @@ int cmGraphVizWriter::CollectAllExternalLibs(int cnt)
|
||||
continue;
|
||||
}
|
||||
|
||||
if (GlobalGenerator->IsAlias(libName)) {
|
||||
const auto tgt = GlobalGenerator->FindTarget(libName);
|
||||
if (tgt) {
|
||||
libName = tgt->GetName().c_str();
|
||||
}
|
||||
}
|
||||
|
||||
std::map<std::string, const cmGeneratorTarget*>::const_iterator tarIt =
|
||||
this->TargetPtrs.find(libName);
|
||||
if (tarIt == this->TargetPtrs.end()) {
|
||||
|
@ -16,13 +16,14 @@
|
||||
class cmGeneratedFileStream;
|
||||
class cmGeneratorTarget;
|
||||
class cmLocalGenerator;
|
||||
class cmGlobalGenerator;
|
||||
|
||||
/** This class implements writing files for graphviz (dot) for graphs
|
||||
* representing the dependencies between the targets in the project. */
|
||||
class cmGraphVizWriter
|
||||
{
|
||||
public:
|
||||
cmGraphVizWriter(const std::vector<cmLocalGenerator*>& localGenerators);
|
||||
cmGraphVizWriter(const cmGlobalGenerator* globalGenerator);
|
||||
|
||||
void ReadSettings(const char* settingsFileName,
|
||||
const char* fallbackSettingsFileName);
|
||||
@ -69,6 +70,7 @@ protected:
|
||||
|
||||
std::vector<cmsys::RegularExpression> TargetsToIgnoreRegex;
|
||||
|
||||
const cmGlobalGenerator* GlobalGenerator;
|
||||
const std::vector<cmLocalGenerator*>& LocalGenerators;
|
||||
|
||||
std::map<std::string, const cmGeneratorTarget*> TargetPtrs;
|
||||
|
@ -2128,7 +2128,7 @@ void cmake::MarkCliAsUsed(const std::string& variable)
|
||||
void cmake::GenerateGraphViz(const char* fileName) const
|
||||
{
|
||||
#ifdef CMAKE_BUILD_WITH_CMAKE
|
||||
cmGraphVizWriter gvWriter(this->GetGlobalGenerator()->GetLocalGenerators());
|
||||
cmGraphVizWriter gvWriter(this->GetGlobalGenerator());
|
||||
|
||||
std::string settingsFile = this->GetHomeOutputDirectory();
|
||||
settingsFile += "/CMakeGraphVizOptions.cmake";
|
||||
|
Loading…
Reference in New Issue
Block a user