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 <david.stoup@kitware.com>
This commit is contained in:
Brad King
2017-04-17 09:29:49 -04:00
parent 60307c5056
commit 5e616fcf9a
3 changed files with 33 additions and 0 deletions

View File

@@ -947,6 +947,26 @@ void cmGeneratorTarget::GetSourceFiles(std::vector<std::string>& files,
void cmGeneratorTarget::GetSourceFiles(std::vector<cmSourceFile*>& files, void cmGeneratorTarget::GetSourceFiles(std::vector<cmSourceFile*>& files,
const std::string& config) const 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); KindedSources const& kinded = this->GetKindedSources(config);
files.reserve(kinded.Sources.size()); files.reserve(kinded.Sources.size());
for (std::vector<SourceAndKind>::const_iterator si = kinded.Sources.begin(); for (std::vector<SourceAndKind>::const_iterator si = kinded.Sources.begin();

View File

@@ -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"
)

View File

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