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:
Nick Schultz 2018-10-24 18:49:12 -04:00 committed by Brad King
parent da1580b48e
commit 50c4dec072
3 changed files with 31 additions and 8 deletions

View File

@ -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()) {

View File

@ -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;

View File

@ -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";