Merge topic 'optimize-source-file-processing'

4f1c71fd cmTarget: Add all sources traced from custom commands at once.
b1c3ae33 cmTarget: Short-circuit language computation if context independent.
This commit is contained in:
Brad King 2014-04-10 09:53:05 -04:00 committed by CMake Topic Stage
commit c590889310
3 changed files with 65 additions and 8 deletions

View File

@ -610,6 +610,7 @@ private:
std::set<cmSourceFile*> SourcesQueued; std::set<cmSourceFile*> SourcesQueued;
typedef std::map<std::string, cmSourceFile*> NameMapType; typedef std::map<std::string, cmSourceFile*> NameMapType;
NameMapType NameMap; NameMapType NameMap;
std::vector<std::string> NewSources;
void QueueSource(cmSourceFile* sf); void QueueSource(cmSourceFile* sf);
void FollowName(std::string const& name); void FollowName(std::string const& name);
@ -698,6 +699,8 @@ void cmTargetTraceDependencies::Trace()
} }
} }
this->CurrentEntry = 0; this->CurrentEntry = 0;
this->Target->AddTracedSources(this->NewSources);
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
@ -707,8 +710,8 @@ void cmTargetTraceDependencies::QueueSource(cmSourceFile* sf)
{ {
this->SourceQueue.push(sf); this->SourceQueue.push(sf);
// Make sure this file is in the target. // Make sure this file is in the target at the end.
this->Target->AddSource(sf->GetFullPath()); this->NewSources.push_back(sf->GetFullPath());
} }
} }

View File

@ -229,6 +229,7 @@ cmTarget::cmTarget()
this->DebugCompileOptionsDone = false; this->DebugCompileOptionsDone = false;
this->DebugCompileDefinitionsDone = false; this->DebugCompileDefinitionsDone = false;
this->DebugSourcesDone = false; this->DebugSourcesDone = false;
this->LinkImplementationLanguageIsContextDependent = true;
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
@ -461,6 +462,7 @@ void cmTarget::FinishConfigure()
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
void cmTarget::ClearLinkMaps() void cmTarget::ClearLinkMaps()
{ {
this->LinkImplementationLanguageIsContextDependent = true;
this->Internal->LinkImplMap.clear(); this->Internal->LinkImplMap.clear();
this->Internal->LinkInterfaceMap.clear(); this->Internal->LinkInterfaceMap.clear();
this->Internal->LinkClosureMap.clear(); this->Internal->LinkClosureMap.clear();
@ -552,7 +554,7 @@ bool cmTarget::IsBundleOnApple() const
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
static void processSources(cmTarget const* tgt, static bool processSources(cmTarget const* tgt,
const std::vector<cmTargetInternals::TargetPropertyEntry*> &entries, const std::vector<cmTargetInternals::TargetPropertyEntry*> &entries,
std::vector<std::string> &srcs, std::vector<std::string> &srcs,
std::set<std::string> &uniqueSrcs, std::set<std::string> &uniqueSrcs,
@ -562,6 +564,8 @@ static void processSources(cmTarget const* tgt,
{ {
cmMakefile *mf = tgt->GetMakefile(); cmMakefile *mf = tgt->GetMakefile();
bool contextDependent = false;
for (std::vector<cmTargetInternals::TargetPropertyEntry*>::const_iterator for (std::vector<cmTargetInternals::TargetPropertyEntry*>::const_iterator
it = entries.begin(), end = entries.end(); it != end; ++it) it = entries.begin(), end = entries.end(); it != end; ++it)
{ {
@ -576,8 +580,12 @@ static void processSources(cmTarget const* tgt,
tgt, tgt,
dagChecker), dagChecker),
entrySources); entrySources);
if (mf->IsGeneratingBuildSystem()
&& !(*it)->ge->GetHadContextSensitiveCondition()) if ((*it)->ge->GetHadContextSensitiveCondition())
{
contextDependent = true;
}
else if (mf->IsGeneratingBuildSystem())
{ {
cacheSources = true; cacheSources = true;
} }
@ -598,7 +606,7 @@ static void processSources(cmTarget const* tgt,
cm->IssueMessage(cmake::FATAL_ERROR, e, cm->IssueMessage(cmake::FATAL_ERROR, e,
tgt->GetBacktrace()); tgt->GetBacktrace());
} }
return; return contextDependent;
} }
} }
if (cacheSources) if (cacheSources)
@ -629,6 +637,7 @@ static void processSources(cmTarget const* tgt,
+ usedSources, (*it)->ge->GetBacktrace()); + usedSources, (*it)->ge->GetBacktrace());
} }
} }
return contextDependent;
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
@ -664,7 +673,7 @@ void cmTarget::GetSourceFiles(std::vector<std::string> &files,
"SOURCES", 0, 0); "SOURCES", 0, 0);
std::set<std::string> uniqueSrcs; std::set<std::string> uniqueSrcs;
processSources(this, bool contextDependentDirectSources = processSources(this,
this->Internal->SourceEntries, this->Internal->SourceEntries,
files, files,
uniqueSrcs, uniqueSrcs,
@ -716,7 +725,8 @@ void cmTarget::GetSourceFiles(std::vector<std::string> &files,
} }
} }
processSources(this, std::vector<std::string>::size_type numFilesBefore = files.size();
bool contextDependentInterfaceSources = processSources(this,
this->Internal->CachedLinkInterfaceSourcesEntries[config], this->Internal->CachedLinkInterfaceSourcesEntries[config],
files, files,
uniqueSrcs, uniqueSrcs,
@ -725,6 +735,12 @@ void cmTarget::GetSourceFiles(std::vector<std::string> &files,
config, config,
debugSources); debugSources);
if (!contextDependentDirectSources
&& !(contextDependentInterfaceSources && numFilesBefore < files.size()))
{
this->LinkImplementationLanguageIsContextDependent = false;
}
if (!this->Makefile->IsGeneratingBuildSystem()) if (!this->Makefile->IsGeneratingBuildSystem())
{ {
deleteAndClear(this->Internal->CachedLinkInterfaceSourcesEntries); deleteAndClear(this->Internal->CachedLinkInterfaceSourcesEntries);
@ -801,6 +817,12 @@ void cmTarget::GetSourceFiles(std::vector<cmSourceFile*> &files,
// Lookup any existing link implementation for this configuration. // Lookup any existing link implementation for this configuration.
TargetConfigPair key(head, cmSystemTools::UpperCase(config)); TargetConfigPair key(head, cmSystemTools::UpperCase(config));
if(!this->LinkImplementationLanguageIsContextDependent)
{
files = this->Internal->SourceFilesMap.begin()->second;
return;
}
cmTargetInternals::SourceFilesMapType::iterator cmTargetInternals::SourceFilesMapType::iterator
it = this->Internal->SourceFilesMap.find(key); it = this->Internal->SourceFilesMap.find(key);
if(it != this->Internal->SourceFilesMap.end()) if(it != this->Internal->SourceFilesMap.end())
@ -827,6 +849,33 @@ void cmTarget::GetSourceFiles(std::vector<cmSourceFile*> &files,
} }
} }
//----------------------------------------------------------------------------
void cmTarget::AddTracedSources(std::vector<std::string> const& srcs)
{
std::string srcFiles;
const char* sep = "";
for(std::vector<std::string>::const_iterator i = srcs.begin();
i != srcs.end(); ++i)
{
std::string filename = *i;
srcFiles += sep;
srcFiles += filename;
sep = ";";
}
if (!srcFiles.empty())
{
this->Internal->SourceFilesMap.clear();
this->LinkImplementationLanguageIsContextDependent = true;
cmListFileBacktrace lfbt;
this->Makefile->GetBacktrace(lfbt);
cmGeneratorExpression ge(lfbt);
cmsys::auto_ptr<cmCompiledGeneratorExpression> cge = ge.Parse(srcFiles);
cge->SetEvaluateForBuildsystem(true);
this->Internal->SourceEntries.push_back(
new cmTargetInternals::TargetPropertyEntry(cge));
}
}
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
void cmTarget::AddSources(std::vector<std::string> const& srcs) void cmTarget::AddSources(std::vector<std::string> const& srcs)
{ {
@ -854,6 +903,7 @@ void cmTarget::AddSources(std::vector<std::string> const& srcs)
if (!srcFiles.empty()) if (!srcFiles.empty())
{ {
this->Internal->SourceFilesMap.clear(); this->Internal->SourceFilesMap.clear();
this->LinkImplementationLanguageIsContextDependent = true;
cmListFileBacktrace lfbt; cmListFileBacktrace lfbt;
this->Makefile->GetBacktrace(lfbt); this->Makefile->GetBacktrace(lfbt);
cmGeneratorExpression ge(lfbt); cmGeneratorExpression ge(lfbt);
@ -989,6 +1039,7 @@ cmSourceFile* cmTarget::AddSource(const std::string& src)
== this->Internal->SourceEntries.end()) == this->Internal->SourceEntries.end())
{ {
this->Internal->SourceFilesMap.clear(); this->Internal->SourceFilesMap.clear();
this->LinkImplementationLanguageIsContextDependent = true;
cmListFileBacktrace lfbt; cmListFileBacktrace lfbt;
this->Makefile->GetBacktrace(lfbt); this->Makefile->GetBacktrace(lfbt);
cmGeneratorExpression ge(lfbt); cmGeneratorExpression ge(lfbt);

View File

@ -144,6 +144,7 @@ public:
* Add sources to the target. * Add sources to the target.
*/ */
void AddSources(std::vector<std::string> const& srcs); void AddSources(std::vector<std::string> const& srcs);
void AddTracedSources(std::vector<std::string> const& srcs);
cmSourceFile* AddSourceCMP0049(const std::string& src); cmSourceFile* AddSourceCMP0049(const std::string& src);
cmSourceFile* AddSource(const std::string& src); cmSourceFile* AddSource(const std::string& src);
@ -784,6 +785,8 @@ private:
std::string const& suffix, std::string const& suffix,
std::string const& name, std::string const& name,
const char* version) const; const char* version) const;
mutable bool LinkImplementationLanguageIsContextDependent;
}; };
typedef std::map<std::string,cmTarget> cmTargets; typedef std::map<std::string,cmTarget> cmTargets;