Autogen: Clear sources meta data cache

Adds cmGeneratorTarget::clearSourcesCache() which clears the cache
of precomputed sources lists and object names. The cache gets
recomputed on demand.

Clearing the cache is necessary in case an OBJECT library
gets a source added after a target (ORIGIN) that includes it
computed it's external sources cache.
This may happen in AUTOMOC when ORIGIN is processed before the
OBJECT library which gets a mocs_compilation.cpp file added.

Closes #17152
Closes #17139
Closes #17085
Closes #15967
This commit is contained in:
Sebastian Holtermann committed 2017-08-10 18:33:02 +02:00
1 parent 14b2f85cd4
commit 952fc65d14
3 files changed
+19 -2

No files matched your search

+8 -2
View File
@@ -326,6 +326,13 @@ std::string cmGeneratorTarget::GetOutputName(
return i->second;
}
void cmGeneratorTarget::ClearSourcesCache()
{
this->KindedSourcesMap.clear();
this->LinkImplementationLanguageIsContextDependent = true;
this->Objects.clear();
}
void cmGeneratorTarget::AddSourceCommon(const std::string& src)
{
cmListFileBacktrace lfbt = this->Makefile->GetBacktrace();
@@ -333,8 +340,7 @@ void cmGeneratorTarget::AddSourceCommon(const std::string& src)
CM_AUTO_PTR<cmCompiledGeneratorExpression> cge = ge.Parse(src);
cge->SetEvaluateForBuildsystem(true);
this->SourceEntries.push_back(new TargetPropertyEntry(cge));
this->KindedSourcesMap.clear();
this->LinkImplementationLanguageIsContextDependent = true;
this->ClearSourcesCache();
}
void cmGeneratorTarget::AddSource(const std::string& src)
+5
View File
@@ -491,6 +491,11 @@ public:
std::string GetOutputName(const std::string& config,
cmStateEnums::ArtifactType artifact) const;
/** Clears cached meta data for local and external source files.
* The meta data will be recomputed on demand.
*/
void ClearSourcesCache();
void AddSource(const std::string& src);
void AddTracedSources(std::vector<std::string> const& srcs);
+6
View File
@@ -919,6 +919,12 @@ void cmQtAutoGeneratorInitializer::InitializeAutogenTarget(
}
}
// cmGeneratorTarget::GetConfigCommonSourceFiles computes the target's
// sources meta data cache. Clear it so that OBJECT library targets that
// are AUTOGEN initialized after this target get their added
// mocs_compilation.cpp source acknowledged by this target.
target->ClearSourcesCache();
// Convert std::set to std::vector
const std::vector<std::string> autogenDepends(autogenDependsSet.begin(),
autogenDependsSet.end());