浏览代码

ENH: some fixes for better backwards compatibility

Ken Martin 20 年之前
父节点
当前提交
345fb993aa
共有 4 个文件被更改,包括 48 次插入29 次删除
  1. 41 26
      Source/cmGlobalUnixMakefileGenerator3.cxx
  2. 3 1
      Source/cmGlobalUnixMakefileGenerator3.h
  3. 2 1
      Source/cmMakefile.cxx
  4. 2 1
      Source/cmTarget.h

+ 41 - 26
Source/cmGlobalUnixMakefileGenerator3.cxx

@@ -869,7 +869,8 @@ cmGlobalUnixMakefileGenerator3
       if(emitted.insert(lib->first).second)
         {
         // Add this dependency.
-        this->AppendAnyGlobalDepend(depends, lib->first.c_str(), emitted);
+        this->AppendAnyGlobalDepend(depends, lib->first.c_str(), 
+                                    emitted, target);
         }
       }
     }
@@ -883,7 +884,7 @@ cmGlobalUnixMakefileGenerator3
     if(emitted.insert(*util).second)
       {
       // Add this dependency.
-      this->AppendAnyGlobalDepend(depends, util->c_str(), emitted);
+      this->AppendAnyGlobalDepend(depends, util->c_str(), emitted, target);
       }
     }
 }
@@ -893,41 +894,55 @@ cmGlobalUnixMakefileGenerator3
 void
 cmGlobalUnixMakefileGenerator3
 ::AppendAnyGlobalDepend(std::vector<std::string>& depends, const char* name,
-                        std::set<cmStdString>& emitted)
+                        std::set<cmStdString>& emitted, cmTarget &target)
 {
   cmTarget *result;
+  cmLocalUnixMakefileGenerator3 *lg3;
+ 
+  // first check the same dir as the current target
+  lg3 = static_cast<cmLocalUnixMakefileGenerator3 *>
+    (target.GetMakefile()->GetLocalGenerator());
+  result = target.GetMakefile()->FindTarget(name);
   
   // search each local generator until a match is found
-  unsigned int i;
-  for (i = 0; i < m_LocalGenerators.size(); ++i)
+  if (!result)
+    {
+    unsigned int i;
+    for (i = 0; i < m_LocalGenerators.size(); ++i)
+      {
+      // search all targets
+      result = m_LocalGenerators[i]->GetMakefile()->FindTarget(name);
+      if (result)
+        {
+        lg3 = static_cast<cmLocalUnixMakefileGenerator3 *>
+          (m_LocalGenerators[i]);
+        break;
+        }
+      }
+    }
+  
+  // if a match was found then ...
+  if (result)
     {
-    // search all targets
-    result = m_LocalGenerators[i]->GetMakefile()->FindTarget(name);
-    // if a match was found then ...
-    if (result)
+    std::string tgtName = lg3->GetRelativeTargetDirectory(*result);
+    tgtName += "/all";
+    depends.push_back(tgtName);
+    if(result->GetType() == cmTarget::STATIC_LIBRARY)
       {
-      cmLocalUnixMakefileGenerator3 *lg3 = 
-        static_cast<cmLocalUnixMakefileGenerator3 *>(m_LocalGenerators[i]);
-      std::string tgtName = lg3->GetRelativeTargetDirectory(*result);
-      tgtName += "/all";
-      depends.push_back(tgtName);
-      if(result->GetType() == cmTarget::STATIC_LIBRARY)
+      const cmTarget::LinkLibraries& tlibs = result->GetLinkLibraries();
+      for(cmTarget::LinkLibraries::const_iterator lib = tlibs.begin();
+          lib != tlibs.end(); ++lib)
         {
-        const cmTarget::LinkLibraries& tlibs = result->GetLinkLibraries();
-        for(cmTarget::LinkLibraries::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)
           {
-          // Don't emit the same library twice for this target.
-          if(emitted.insert(lib->first).second)
-            {
-            // Add this dependency.
-            this->AppendAnyGlobalDepend(depends, lib->first.c_str(),
-                                        emitted);
-            }
+          // Add this dependency.
+          this->AppendAnyGlobalDepend(depends, lib->first.c_str(),
+                                      emitted, *result);
           }
         }
-      return;
       }
+    return;
     }
 }
 

+ 3 - 1
Source/cmGlobalUnixMakefileGenerator3.h

@@ -111,7 +111,9 @@ protected:
   void AppendGlobalTargetDepends(std::vector<std::string>& depends,
                                  cmTarget& target);
   void AppendAnyGlobalDepend(std::vector<std::string>& depends, 
-                             const char* name, std::set<cmStdString>& emitted);
+                             const char* name, 
+                             std::set<cmStdString>& emitted,
+                             cmTarget &target);
 
   // does this generator need a requires step for any of its targets
   bool NeedRequiresStep(cmLocalUnixMakefileGenerator3 *lg, const char *);

+ 2 - 1
Source/cmMakefile.cxx

@@ -701,7 +701,8 @@ void cmMakefile::AddUtilityCommand(const char* utilityName, bool all,
   cmTarget target;
   target.SetType(cmTarget::UTILITY, utilityName);
   target.SetInAll(all);
-
+  target.SetMakefile(this);
+  
   // Store the custom command in the target.
   cmCustomCommand cc(output, depends, commandLines, 0);
   target.GetPostBuildCommands().push_back(cc);

+ 2 - 1
Source/cmTarget.h

@@ -63,7 +63,8 @@ public:
 
   ///! Set the cmMakefile that owns this target
   void SetMakefile(cmMakefile *mf) { m_Makefile = mf; };
-
+  cmMakefile *GetMakefile() { return m_Makefile;};
+  
   /**
    * Get the list of the custom commands for this target
    */