瀏覽代碼

cmComputeTargetDepends: Track object library depends.

Relieve cmGeneratorTarget of that responsibility.
Stephen Kelly 11 年之前
父節點
當前提交
c355d10865
共有 2 個文件被更改,包括 29 次插入1 次删除
  1. 29 0
      Source/cmComputeTargetDepends.cxx
  2. 0 1
      Source/cmGeneratorTarget.cxx

+ 29 - 0
Source/cmComputeTargetDepends.cxx

@@ -16,6 +16,7 @@
 #include "cmLocalGenerator.h"
 #include "cmMakefile.h"
 #include "cmSystemTools.h"
+#include "cmSourceFile.h"
 #include "cmTarget.h"
 #include "cmake.h"
 
@@ -213,6 +214,34 @@ void cmComputeTargetDepends::CollectTargetDepends(int depender_index)
   {
   std::set<std::string> emitted;
   {
+  cmGeneratorTarget* gt = depender->GetMakefile()->GetLocalGenerator()
+                                  ->GetGlobalGenerator()
+                                  ->GetGeneratorTarget(depender);
+  std::vector<cmSourceFile const*> objectFiles;
+  gt->GetExternalObjects(objectFiles);
+  for(std::vector<cmSourceFile const*>::const_iterator
+      it = objectFiles.begin(); it != objectFiles.end(); ++it)
+    {
+    std::string objLib = (*it)->GetObjectLibrary();
+    if (!objLib.empty() && emitted.insert(objLib).second)
+      {
+      if(depender->GetType() != cmTarget::EXECUTABLE &&
+          depender->GetType() != cmTarget::STATIC_LIBRARY &&
+          depender->GetType() != cmTarget::SHARED_LIBRARY &&
+          depender->GetType() != cmTarget::MODULE_LIBRARY)
+        {
+        this->GlobalGenerator->GetCMakeInstance()
+          ->IssueMessage(cmake::FATAL_ERROR,
+                          "Only executables and non-OBJECT libraries may "
+                          "reference target objects.",
+                          depender->GetBacktrace());
+        return;
+        }
+      const_cast<cmTarget*>(depender)->AddUtility(objLib);
+      }
+    }
+  }
+  {
   std::vector<std::string> tlibs;
   depender->GetDirectLinkLibraries("", tlibs, depender);
   // A target should not depend on itself.

+ 0 - 1
Source/cmGeneratorTarget.cxx

@@ -528,7 +528,6 @@ void cmGeneratorTarget::LookupObjectLibraries()
                            this->Target->GetBacktrace());
           return;
           }
-        this->Target->AddUtility(objLib->GetName());
         this->ObjectLibraries.push_back(objLib);
         }
       else