1
0
Эх сурвалжийг харах

Merge topic 'objlib-own-target-objs'

d89e10cd Diagnose object library self-reference

Acked-by: Kitware Robot <[email protected]>
Merge-request: !1053
Brad King 8 жил өмнө
parent
commit
787017451c

+ 11 - 0
Source/cmGeneratorTarget.cxx

@@ -1025,12 +1025,23 @@ cmGeneratorTarget::KindedSources const& cmGeneratorTarget::GetKindedSources(
   std::string const key = cmSystemTools::UpperCase(config);
   std::string const key = cmSystemTools::UpperCase(config);
   KindedSourcesMapType::iterator it = this->KindedSourcesMap.find(key);
   KindedSourcesMapType::iterator it = this->KindedSourcesMap.find(key);
   if (it != this->KindedSourcesMap.end()) {
   if (it != this->KindedSourcesMap.end()) {
+    if (!it->second.Initialized) {
+      std::ostringstream e;
+      e << "The SOURCES of \"" << this->GetName()
+        << "\" use a generator expression that depends on the "
+           "SOURCES themselves.";
+      this->GlobalGenerator->GetCMakeInstance()->IssueMessage(
+        cmake::FATAL_ERROR, e.str(), this->GetBacktrace());
+      static KindedSources empty;
+      return empty;
+    }
     return it->second;
     return it->second;
   }
   }
 
 
   // Add an entry to the map for this configuration.
   // Add an entry to the map for this configuration.
   KindedSources& files = this->KindedSourcesMap[key];
   KindedSources& files = this->KindedSourcesMap[key];
   this->ComputeKindedSources(files, config);
   this->ComputeKindedSources(files, config);
+  files.Initialized = true;
   return files;
   return files;
 }
 }
 
 

+ 5 - 0
Source/cmGeneratorTarget.h

@@ -107,6 +107,11 @@ public:
     std::set<std::string> ExpectedResxHeaders;
     std::set<std::string> ExpectedResxHeaders;
     std::set<std::string> ExpectedXamlHeaders;
     std::set<std::string> ExpectedXamlHeaders;
     std::set<std::string> ExpectedXamlSources;
     std::set<std::string> ExpectedXamlSources;
+    bool Initialized;
+    KindedSources()
+      : Initialized(false)
+    {
+    }
   };
   };
 
 
   /** Get all sources needed for a configuration with kinds assigned.  */
   /** Get all sources needed for a configuration with kinds assigned.  */

+ 1 - 0
Tests/RunCMake/ObjectLibrary/OwnSources-result.txt

@@ -0,0 +1 @@
+1

+ 5 - 0
Tests/RunCMake/ObjectLibrary/OwnSources-stderr.txt

@@ -0,0 +1,5 @@
+^CMake Error at OwnSources.cmake:[0-9]+ \(add_library\):
+  The SOURCES of "A" use a generator expression that depends on the SOURCES
+  themselves.
+Call Stack \(most recent call first\):
+  CMakeLists.txt:[0-9]+ \(include\)$

+ 2 - 0
Tests/RunCMake/ObjectLibrary/OwnSources.cmake

@@ -0,0 +1,2 @@
+add_library(A OBJECT a.c)
+target_sources(A PRIVATE $<TARGET_OBJECTS:A>)

+ 1 - 0
Tests/RunCMake/ObjectLibrary/RunCMakeTest.cmake

@@ -19,6 +19,7 @@ run_cmake(LinkObjRHS1)
 run_cmake(LinkObjRHS2)
 run_cmake(LinkObjRHS2)
 run_cmake(MissingSource)
 run_cmake(MissingSource)
 run_cmake(ObjWithObj)
 run_cmake(ObjWithObj)
+run_cmake(OwnSources)
 run_cmake(PostBuild)
 run_cmake(PostBuild)
 run_cmake(PreBuild)
 run_cmake(PreBuild)
 run_cmake(PreLink)
 run_cmake(PreLink)