[cmake-commits] martink committed cmGlobalGenerator.cxx 1.171 1.172 cmGlobalGenerator.h 1.72 1.73

cmake-commits at cmake.org cmake-commits at cmake.org
Thu Apr 12 15:46:08 EDT 2007


Update of /cvsroot/CMake/CMake/Source
In directory public:/mounts/ram/cvs-serv24465/Source

Modified Files:
	cmGlobalGenerator.cxx cmGlobalGenerator.h 
Log Message:
ENH: some code consolidation and cleanup


Index: cmGlobalGenerator.h
===================================================================
RCS file: /cvsroot/CMake/CMake/Source/cmGlobalGenerator.h,v
retrieving revision 1.72
retrieving revision 1.73
diff -u -d -r1.72 -r1.73
--- cmGlobalGenerator.h	13 Mar 2007 18:23:08 -0000	1.72
+++ cmGlobalGenerator.h	12 Apr 2007 19:46:06 -0000	1.73
@@ -193,6 +193,9 @@
   virtual const char* GetEditCacheTargetName()    { return 0; }
   virtual const char* GetRebuildCacheTargetName() { return 0; }
 
+  // what targets does the specified target depend on
+  std::vector<cmTarget *>& GetTargetDepends(cmTarget& target);
+
 protected:
   // Fill the ProjectMap, this must be called after LocalGenerators 
   // has been populated.
@@ -236,6 +239,8 @@
 
   // this is used to improve performance 
   std::map<cmStdString,cmTarget *> TotalTargets;
+  
+  std::map<cmStdString, std::vector<cmTarget *> > TargetDependencies;
 };
 
 #endif

Index: cmGlobalGenerator.cxx
===================================================================
RCS file: /cvsroot/CMake/CMake/Source/cmGlobalGenerator.cxx,v
retrieving revision 1.171
retrieving revision 1.172
diff -u -d -r1.171 -r1.172
--- cmGlobalGenerator.cxx	13 Mar 2007 18:23:08 -0000	1.171
+++ cmGlobalGenerator.cxx	12 Apr 2007 19:46:06 -0000	1.172
@@ -1110,31 +1110,10 @@
           {
           // add this target to the project
           this->ProjectToTargetMap[projectName].insert(&target);
-          // now get all the targets that link to this target and
-          // add them
-          cmTarget::LinkLibraryVectorType::const_iterator j, jend;
-          j = target.GetLinkLibraries().begin();
-          jend = target.GetLinkLibraries().end();
-          for(;j!= jend; ++j)
-            {
-            cmTarget* depTarget = this->FindTarget(0, j->first.c_str());
-            if(depTarget)
-              {
-              this->ProjectToTargetMap[projectName].insert(depTarget);
-              }
-            }
-          // Now add any utility targets used by this target
-          std::set<cmStdString>::const_iterator i, end;
-          i = target.GetUtilities().begin();
-          end = target.GetUtilities().end(); 
-          for(;i!= end; ++i)
-            {
-            cmTarget* depTarget = this->FindTarget(0, i->c_str());
-            if(depTarget)
-              {
-              this->ProjectToTargetMap[projectName].insert(depTarget);
-              }
-            }
+          // get the target's dependencies
+          std::vector<cmTarget *>& tgtdeps = this->GetTargetDepends(target);
+          this->ProjectToTargetMap[projectName].insert(tgtdeps.begin(),
+                                                       tgtdeps.end());
           }
         } 
       }
@@ -1504,3 +1483,80 @@
   // Only certain generators need this check.  They define this
   // method.
 }
+
+//----------------------------------------------------------------------------
+std::vector<cmTarget *>& cmGlobalGenerator
+::GetTargetDepends(cmTarget& target)
+{
+  // if the depends are already in the map then return
+  std::map<cmStdString, std::vector<cmTarget *> >::iterator tgtI = 
+    this->TargetDependencies.find(target.GetName());
+  if (tgtI != this->TargetDependencies.end())
+    {
+    return tgtI->second;
+    }
+  
+  // A target should not depend on itself.
+  std::set<cmStdString> emitted;
+  emitted.insert(target.GetName());
+  
+  // the vector of results
+  std::vector<cmTarget *>& result = 
+    this->TargetDependencies[target.GetName()];
+  
+  // Loop over all library dependencies but not for static libs
+  if (target.GetType() != cmTarget::STATIC_LIBRARY)
+    {
+    const cmTarget::LinkLibraryVectorType& tlibs = target.GetLinkLibraries();
+    for(cmTarget::LinkLibraryVectorType::const_iterator lib = tlibs.begin();
+        lib != tlibs.end(); ++lib)
+      {
+      // Don't emit the same library twice for this target.
+      if(emitted.insert(lib->first).second)
+        {
+        cmTarget *target2 = 
+          target.GetMakefile()->FindTarget(lib->first.c_str());
+        
+        // search each local generator until a match is found
+        if (!target2)
+          {
+          target2 = this->FindTarget(0,lib->first.c_str());
+          }
+        
+        // if a match was found then ...
+        if (target2)
+          {
+          // Add this dependency.
+          result.push_back(target2);
+          }
+        }
+      }
+    }
+  
+  // Loop over all utility dependencies.
+  const std::set<cmStdString>& tutils = target.GetUtilities();
+  for(std::set<cmStdString>::const_iterator util = tutils.begin();
+      util != tutils.end(); ++util)
+    {
+    // Don't emit the same utility twice for this target.
+    if(emitted.insert(*util).second)
+      {
+      cmTarget *target2 = target.GetMakefile()->FindTarget(util->c_str());
+      
+      // search each local generator until a match is found
+      if (!target2)
+        {
+        target2 = this->FindTarget(0,util->c_str());
+        }
+      
+      // if a match was found then ...
+      if (target2)
+        {
+        // Add this dependency.
+        result.push_back(target2);
+        }
+      }
+    }
+  return result;
+}
+



More information about the Cmake-commits mailing list