mirror of
https://github.com/Kitware/CMake.git
synced 2026-03-17 09:11:36 -05:00
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:
@@ -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
Tests/RunCMake/CMP0026/CMP0026-OLD.cmake
Normal file
12
Tests/RunCMake/CMP0026/CMP0026-OLD.cmake
Normal 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"
|
||||
)
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user