Browse Source

CMP0026: Fix OLD behavior with file written during configure step

Refactoring in commit 60307c5056 (cmGeneratorTarget: Replace source
classifier implementation, 2017-04-07) accidentally regressed support
for CMP0026's OLD behavior in the case of a source file written by
project code during the configure step after getting a LOCATION.  We
should not perform full source classification until the generate step
because files written by the project's configure step may not exist yet.

Add special logic to support this case.  Add a test case for it.

Reported-by: David Stoup <[email protected]>
Brad King 8 years ago
parent
commit
5e616fcf9a

+ 20 - 0
Source/cmGeneratorTarget.cxx

@@ -947,6 +947,26 @@ void cmGeneratorTarget::GetSourceFiles(std::vector<std::string>& files,
 void cmGeneratorTarget::GetSourceFiles(std::vector<cmSourceFile*>& files,
                                        const std::string& config) const
 {
+  if (!this->GlobalGenerator->GetConfigureDoneCMP0026()) {
+    // Since we are still configuring not all sources may exist yet,
+    // so we need to avoid full source classification because that
+    // requires the absolute paths to all sources to be determined.
+    // Since this is only for compatibility with old policies that
+    // projects should not depend on anymore, just compute the files
+    // without memoizing them.
+    std::vector<std::string> srcs;
+    this->GetSourceFiles(srcs, config);
+    std::set<cmSourceFile*> emitted;
+    for (std::vector<std::string>::const_iterator i = srcs.begin();
+         i != srcs.end(); ++i) {
+      cmSourceFile* sf = this->Makefile->GetOrCreateSource(*i);
+      if (emitted.insert(sf).second) {
+        files.push_back(sf);
+      }
+    }
+    return;
+  }
+
   KindedSources const& kinded = this->GetKindedSources(config);
   files.reserve(kinded.Sources.size());
   for (std::vector<SourceAndKind>::const_iterator si = kinded.Sources.begin();

+ 12 - 0
Tests/RunCMake/CMP0026/CMP0026-OLD.cmake

@@ -0,0 +1,12 @@
+enable_language(CXX)
+
+cmake_policy(SET CMP0026 OLD)
+
+set(out ${CMAKE_CURRENT_BINARY_DIR}/out.txt)
+
+add_library(somelib empty.cpp ${out})
+get_target_property(_loc somelib LOCATION)
+
+file(WRITE "${out}"
+  "source file written by project code after getting target LOCATION\n"
+  )

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

@@ -1,6 +1,7 @@
 include(RunCMake)
 
 run_cmake(CMP0026-WARN)
+run_cmake(CMP0026-OLD)
 run_cmake(CMP0026-NEW)
 run_cmake(CMP0026-IMPORTED)
 run_cmake(CMP0026-CONFIG-LOCATION-NEW)