cmTarget: Add all sources traced from custom commands at once.
The AddSource method accepts one file and tries to avoiding adding it to the sources-list of the target if it already exists. This involves creating many cmSourceFileLocation objects for matching on existing files, which is an expensive operation. Avoid the searching algorithm by appending the new sources as one group. Generate-time processing of source files will ensure uniqueness. Add a new AddTracedSources for this purpose. The existing AddSources method must process the input for policy CMP0049, but as these source filenames come from cmSourceFile::GetFullPath(), we can forego that extra processing.
This commit is contained in:
parent
b1c3ae33ea
commit
4f1c71fdd2
|
@ -610,6 +610,7 @@ private:
|
|||
std::set<cmSourceFile*> SourcesQueued;
|
||||
typedef std::map<std::string, cmSourceFile*> NameMapType;
|
||||
NameMapType NameMap;
|
||||
std::vector<std::string> NewSources;
|
||||
|
||||
void QueueSource(cmSourceFile* sf);
|
||||
void FollowName(std::string const& name);
|
||||
|
@ -698,6 +699,8 @@ void cmTargetTraceDependencies::Trace()
|
|||
}
|
||||
}
|
||||
this->CurrentEntry = 0;
|
||||
|
||||
this->Target->AddTracedSources(this->NewSources);
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
|
@ -707,8 +710,8 @@ void cmTargetTraceDependencies::QueueSource(cmSourceFile* sf)
|
|||
{
|
||||
this->SourceQueue.push(sf);
|
||||
|
||||
// Make sure this file is in the target.
|
||||
this->Target->AddSource(sf->GetFullPath());
|
||||
// Make sure this file is in the target at the end.
|
||||
this->NewSources.push_back(sf->GetFullPath());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -849,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)
|
||||
{
|
||||
|
|
|
@ -144,6 +144,7 @@ public:
|
|||
* Add sources to the target.
|
||||
*/
|
||||
void AddSources(std::vector<std::string> const& srcs);
|
||||
void AddTracedSources(std::vector<std::string> const& srcs);
|
||||
cmSourceFile* AddSourceCMP0049(const std::string& src);
|
||||
cmSourceFile* AddSource(const std::string& src);
|
||||
|
||||
|
|
Loading…
Reference in New Issue