Bläddra i källkod

Merge topic 'graphviz-fix-alias'

50c4dec072 graphviz: dereference ALIAS targets

Acked-by: Kitware Robot <[email protected]>
Merge-request: !2521
Brad King 7 år sedan
förälder
incheckning
bcd61da350
3 ändrade filer med 31 tillägg och 8 borttagningar
  1. 27 6
      Source/cmGraphVizWriter.cxx
  2. 3 1
      Source/cmGraphVizWriter.h
  3. 1 1
      Source/cmake.cxx

+ 27 - 6
Source/cmGraphVizWriter.cxx

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

+ 3 - 1
Source/cmGraphVizWriter.h

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

+ 1 - 1
Source/cmake.cxx

@@ -2143,7 +2143,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";