[Cmake-commits] CMake branch, next, updated. v3.0.0-rc3-1927-g85b8950
Stephen Kelly
steveire at gmail.com
Sat Apr 5 08:31:38 EDT 2014
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "CMake".
The branch, next has been updated
via 85b895033e2f98990d3e98cdbac68cfe130e2a09 (commit)
via 9bc502b42f187ee3269edee8b59457d658a4d7f9 (commit)
via 6049606c6baa77725131b14e1dbe9d9436337a6b (commit)
via fa733831944b11bc926c19b63da54fd7738f86cc (commit)
via d6bf82cffe0adbdbf18aa730a54ae8f1038d527c (commit)
via 19b7c22d020a3b1bf26065beb33b0f2f499cd1ad (commit)
from c33add41e8deaf4ffb78cf14494b69a98036ce99 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=85b895033e2f98990d3e98cdbac68cfe130e2a09
commit 85b895033e2f98990d3e98cdbac68cfe130e2a09
Merge: c33add4 9bc502b
Author: Stephen Kelly <steveire at gmail.com>
AuthorDate: Sat Apr 5 08:31:37 2014 -0400
Commit: CMake Topic Stage <kwrobot at kitware.com>
CommitDate: Sat Apr 5 08:31:37 2014 -0400
Merge topic 'optimize-source-file-processing' into next
9bc502b4 cmTarget: Make GetSourceFiles string overload private.
6049606c cmGeneratorTarget: Trace cmSourceFile objects instead of strings.
fa733831 cmTarget: Cache the cmSourceFiles in GetSourceFiles.
d6bf82cf cmTarget: Extract a ProcessSourceItemCMP0049 method.
19b7c22d Ninja: Query custom commands once per target, not once per file.
http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=9bc502b42f187ee3269edee8b59457d658a4d7f9
commit 9bc502b42f187ee3269edee8b59457d658a4d7f9
Author: Stephen Kelly <steveire at gmail.com>
AuthorDate: Sat Apr 5 12:35:43 2014 +0200
Commit: Stephen Kelly <steveire at gmail.com>
CommitDate: Sat Apr 5 14:28:11 2014 +0200
cmTarget: Make GetSourceFiles string overload private.
Consumers should use the cmSourceFile overload, which is now
always the case.
diff --git a/Source/cmTarget.h b/Source/cmTarget.h
index 997f7e5..7491dea 100644
--- a/Source/cmTarget.h
+++ b/Source/cmTarget.h
@@ -135,9 +135,6 @@ public:
/**
* Get the list of the source files used by this target
*/
- void GetSourceFiles(std::vector<std::string> &files,
- const std::string& config,
- cmTarget const* head = 0) const;
void GetSourceFiles(std::vector<cmSourceFile*> &files,
const std::string& config,
cmTarget const* head = 0) const;
@@ -683,6 +680,9 @@ private:
const std::string& config,
bool contentOnly) const;
+ void GetSourceFiles(std::vector<std::string> &files,
+ const std::string& config,
+ cmTarget const* head = 0) const;
private:
std::string Name;
std::vector<cmCustomCommand> PreBuildCommands;
http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=6049606c6baa77725131b14e1dbe9d9436337a6b
commit 6049606c6baa77725131b14e1dbe9d9436337a6b
Author: Stephen Kelly <steveire at gmail.com>
AuthorDate: Sat Apr 5 11:41:58 2014 +0200
Commit: Stephen Kelly <steveire at gmail.com>
CommitDate: Sat Apr 5 14:28:10 2014 +0200
cmGeneratorTarget: Trace cmSourceFile objects instead of strings.
This reverses the decision in commit d38423ec (cmTarget: Add a
method to obtain list of filenames for sources., 2014-03-17). The
cmSourceFile based API is preferred because that avoids creation of
many cmSourceFileLocation objects for matching strings, and the
result is cached by cmTarget.
diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx
index 69a2977..0d25a00 100644
--- a/Source/cmGeneratorTarget.cxx
+++ b/Source/cmGeneratorTarget.cxx
@@ -606,12 +606,12 @@ private:
cmGlobalGenerator const* GlobalGenerator;
typedef cmGeneratorTarget::SourceEntry SourceEntry;
SourceEntry* CurrentEntry;
- std::queue<std::string> SourceQueue;
- std::set<std::string> SourcesQueued;
+ std::queue<cmSourceFile*> SourceQueue;
+ std::set<cmSourceFile*> SourcesQueued;
typedef std::map<std::string, cmSourceFile*> NameMapType;
NameMapType NameMap;
- void QueueSource(std::string const& name);
+ void QueueSource(cmSourceFile* sf);
void FollowName(std::string const& name);
void FollowNames(std::vector<std::string> const& names);
bool IsUtility(std::string const& dep);
@@ -642,19 +642,19 @@ cmTargetTraceDependencies
{
configs.push_back("");
}
- std::set<std::string> emitted;
+ std::set<cmSourceFile*> emitted;
for(std::vector<std::string>::const_iterator ci = configs.begin();
ci != configs.end(); ++ci)
{
- std::vector<std::string> sources;
+ std::vector<cmSourceFile*> sources;
this->Target->GetSourceFiles(sources, *ci);
- for(std::vector<std::string>::const_iterator si = sources.begin();
+ for(std::vector<cmSourceFile*>::const_iterator si = sources.begin();
si != sources.end(); ++si)
{
- if(emitted.insert(*si).second && this->SourcesQueued.insert(*si).second)
+ cmSourceFile* sf = *si;
+ if(emitted.insert(sf).second && this->SourcesQueued.insert(sf).second)
{
- this->SourceQueue.push(*si);
- this->Makefile->GetOrCreateSource(*si);
+ this->SourceQueue.push(sf);
}
}
}
@@ -673,8 +673,7 @@ void cmTargetTraceDependencies::Trace()
while(!this->SourceQueue.empty())
{
// Get the next source from the queue.
- std::string src = this->SourceQueue.front();
- cmSourceFile* sf = this->Makefile->GetSource(src);
+ cmSourceFile* sf = this->SourceQueue.front();
this->SourceQueue.pop();
this->CurrentEntry = &this->GeneratorTarget->SourceEntries[sf];
@@ -702,14 +701,14 @@ void cmTargetTraceDependencies::Trace()
}
//----------------------------------------------------------------------------
-void cmTargetTraceDependencies::QueueSource(std::string const& name)
+void cmTargetTraceDependencies::QueueSource(cmSourceFile* sf)
{
- if(this->SourcesQueued.insert(name).second)
+ if(this->SourcesQueued.insert(sf).second)
{
- this->SourceQueue.push(name);
+ this->SourceQueue.push(sf);
// Make sure this file is in the target.
- this->Target->AddSource(name);
+ this->Target->AddSource(sf->GetFullPath());
}
}
@@ -731,7 +730,7 @@ void cmTargetTraceDependencies::FollowName(std::string const& name)
{
this->CurrentEntry->Depends.push_back(sf);
}
- this->QueueSource(sf->GetFullPath());
+ this->QueueSource(sf);
}
}
http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=fa733831944b11bc926c19b63da54fd7738f86cc
commit fa733831944b11bc926c19b63da54fd7738f86cc
Author: Stephen Kelly <steveire at gmail.com>
AuthorDate: Sat Apr 5 11:40:38 2014 +0200
Commit: Stephen Kelly <steveire at gmail.com>
CommitDate: Sat Apr 5 14:27:54 2014 +0200
cmTarget: Cache the cmSourceFiles in GetSourceFiles.
Avoid calling GetSourceFiles with the same result container multiple
times when tracing target dependencies. The result from the previous
configuration is cached and used later otherwise.
diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx
index 01fad26..69a2977 100644
--- a/Source/cmGeneratorTarget.cxx
+++ b/Source/cmGeneratorTarget.cxx
@@ -636,26 +636,26 @@ cmTargetTraceDependencies
// Queue all the source files already specified for the target.
if (this->Target->GetType() != cmTarget::INTERFACE_LIBRARY)
{
- std::vector<std::string> sources;
std::vector<std::string> configs;
this->Makefile->GetConfigurations(configs);
if (configs.empty())
{
configs.push_back("");
}
+ std::set<std::string> emitted;
for(std::vector<std::string>::const_iterator ci = configs.begin();
ci != configs.end(); ++ci)
{
+ std::vector<std::string> sources;
this->Target->GetSourceFiles(sources, *ci);
- }
- std::set<std::string> emitted;
- for(std::vector<std::string>::const_iterator si = sources.begin();
- si != sources.end(); ++si)
- {
- if(emitted.insert(*si).second && this->SourcesQueued.insert(*si).second)
+ for(std::vector<std::string>::const_iterator si = sources.begin();
+ si != sources.end(); ++si)
{
- this->SourceQueue.push(*si);
- this->Makefile->GetOrCreateSource(*si);
+ if(emitted.insert(*si).second && this->SourcesQueued.insert(*si).second)
+ {
+ this->SourceQueue.push(*si);
+ this->Makefile->GetOrCreateSource(*si);
+ }
}
}
}
diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx
index e5ed48b..d8fa96e 100644
--- a/Source/cmTarget.cxx
+++ b/Source/cmTarget.cxx
@@ -138,6 +138,10 @@ public:
LinkClosureMapType;
LinkClosureMapType LinkClosureMap;
+ typedef std::map<TargetConfigPair, std::vector<cmSourceFile*> >
+ SourceFilesMapType;
+ SourceFilesMapType SourceFilesMap;
+
struct TargetPropertyEntry {
TargetPropertyEntry(cmsys::auto_ptr<cmCompiledGeneratorExpression> cge,
const std::string &targetName = std::string())
@@ -793,19 +797,33 @@ void cmTarget::GetSourceFiles(std::vector<cmSourceFile*> &files,
const std::string& config,
cmTarget const* head) const
{
- std::vector<std::string> srcs;
- this->GetSourceFiles(srcs, config, head);
- std::set<cmSourceFile*> emitted;
+ // Lookup any existing link implementation for this configuration.
+ TargetConfigPair key(head, cmSystemTools::UpperCase(config));
- for(std::vector<std::string>::const_iterator i = srcs.begin();
- i != srcs.end(); ++i)
+ cmTargetInternals::SourceFilesMapType::iterator
+ it = this->Internal->SourceFilesMap.find(key);
+ if(it != this->Internal->SourceFilesMap.end())
+ {
+ files = it->second;
+ }
+ else
{
- cmSourceFile* sf = this->Makefile->GetOrCreateSource(*i);
- if (emitted.insert(sf).second)
+ std::vector<std::string> srcs;
+ this->GetSourceFiles(srcs, config, head);
+
+ std::set<cmSourceFile*> emitted;
+
+ for(std::vector<std::string>::const_iterator i = srcs.begin();
+ i != srcs.end(); ++i)
{
- files.push_back(sf);
+ cmSourceFile* sf = this->Makefile->GetOrCreateSource(*i);
+ if (emitted.insert(sf).second)
+ {
+ files.push_back(sf);
+ }
}
+ this->Internal->SourceFilesMap[key] = files;
}
}
@@ -836,6 +854,7 @@ void cmTarget::AddSources(std::vector<std::string> const& srcs)
}
if (!srcFiles.empty())
{
+ this->Internal->SourceFilesMap.clear();
cmListFileBacktrace lfbt;
this->Makefile->GetBacktrace(lfbt);
cmGeneratorExpression ge(lfbt);
@@ -973,6 +992,7 @@ cmSourceFile* cmTarget::AddSource(const std::string& src)
TargetPropertyEntryFinder(sfl))
== this->Internal->SourceEntries.end())
{
+ this->Internal->SourceFilesMap.clear();
cmListFileBacktrace lfbt;
this->Makefile->GetBacktrace(lfbt);
cmGeneratorExpression ge(lfbt);
@@ -1742,6 +1762,7 @@ void cmTarget::SetProperty(const std::string& prop, const char* value)
this->Makefile->IssueMessage(cmake::FATAL_ERROR, e.str());
return;
}
+ this->Internal->SourceFilesMap.clear();
cmListFileBacktrace lfbt;
this->Makefile->GetBacktrace(lfbt);
cmGeneratorExpression ge(lfbt);
@@ -1828,7 +1849,7 @@ void cmTarget::AppendProperty(const std::string& prop, const char* value,
this->Makefile->IssueMessage(cmake::FATAL_ERROR, e.str());
return;
}
-
+ this->Internal->SourceFilesMap.clear();
cmListFileBacktrace lfbt;
this->Makefile->GetBacktrace(lfbt);
cmGeneratorExpression ge(lfbt);
http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=d6bf82cffe0adbdbf18aa730a54ae8f1038d527c
commit d6bf82cffe0adbdbf18aa730a54ae8f1038d527c
Author: Stephen Kelly <steveire at gmail.com>
AuthorDate: Fri Apr 4 17:45:28 2014 +0200
Commit: Stephen Kelly <steveire at gmail.com>
CommitDate: Sat Apr 5 14:22:48 2014 +0200
cmTarget: Extract a ProcessSourceItemCMP0049 method.
Avoid calling AddSource for each src filename. That involves
checking each entry for uniqueness and creating a separate
generator expression for each one.
Instead, add a single entry for the list of sources. The source
files are passed through a uniqueness filter at generate-time, so
duplicates don't matter so much.
diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx
index b6bb2d3..e5ed48b 100644
--- a/Source/cmTarget.cxx
+++ b/Source/cmTarget.cxx
@@ -812,23 +812,43 @@ void cmTarget::GetSourceFiles(std::vector<cmSourceFile*> &files,
//----------------------------------------------------------------------------
void cmTarget::AddSources(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)
{
- const char* src = i->c_str();
- if(src[0] == '$' && src[1] == '<')
- {
- this->AddSource(src);
- }
- else
+ std::string filename = *i;
+ const char* src = filename.c_str();
+
+ if(!(src[0] == '$' && src[1] == '<'))
{
- this->AddSourceCMP0049(src);
+ bool hadError = false;
+ filename = this->ProcessSourceItemCMP0049(filename, hadError);
+ if (hadError)
+ {
+ return;
+ }
+ this->Makefile->GetOrCreateSource(filename);
}
+ srcFiles += sep;
+ srcFiles += filename;
+ sep = ";";
+ }
+ if (!srcFiles.empty())
+ {
+ 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));
}
}
//----------------------------------------------------------------------------
-cmSourceFile* cmTarget::AddSourceCMP0049(const std::string& s)
+std::string cmTarget::ProcessSourceItemCMP0049(const std::string& s,
+ bool& hadError)
{
std::string src = s;
@@ -863,10 +883,24 @@ cmSourceFile* cmTarget::AddSourceCMP0049(const std::string& s)
this->Makefile->IssueMessage(messageType, e.str());
if (messageType == cmake::FATAL_ERROR)
{
- return 0;
+ return "";
+ hadError = true;
}
}
}
+ return src;
+}
+
+//----------------------------------------------------------------------------
+cmSourceFile* cmTarget::AddSourceCMP0049(const std::string& s)
+{
+ bool hadError = false;
+ std::string src = this->ProcessSourceItemCMP0049(s, hadError);
+
+ if (hadError)
+ {
+ return 0;
+ }
return this->AddSource(src);
}
diff --git a/Source/cmTarget.h b/Source/cmTarget.h
index da032a5..997f7e5 100644
--- a/Source/cmTarget.h
+++ b/Source/cmTarget.h
@@ -752,6 +752,8 @@ private:
void ComputeLinkClosure(const std::string& config, LinkClosure& lc,
cmTarget const* head) const;
+ std::string ProcessSourceItemCMP0049(const std::string& s, bool& hadError);
+
void ClearLinkMaps();
void MaybeInvalidatePropertyCache(const std::string& prop);
http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=19b7c22d020a3b1bf26065beb33b0f2f499cd1ad
commit 19b7c22d020a3b1bf26065beb33b0f2f499cd1ad
Author: Stephen Kelly <steveire at gmail.com>
AuthorDate: Fri Apr 4 17:09:56 2014 +0200
Commit: Stephen Kelly <steveire at gmail.com>
CommitDate: Sat Apr 5 14:22:48 2014 +0200
Ninja: Query custom commands once per target, not once per file.
Computing the source files is now more expensive, so the Ninja
generator became very slow with a large number of files.
diff --git a/Source/cmNinjaTargetGenerator.cxx b/Source/cmNinjaTargetGenerator.cxx
index 56155ef..cb6eb90 100644
--- a/Source/cmNinjaTargetGenerator.cxx
+++ b/Source/cmNinjaTargetGenerator.cxx
@@ -494,6 +494,9 @@ cmNinjaTargetGenerator
{
cmCustomCommand const* cc = (*si)->GetCustomCommand();
this->GetLocalGenerator()->AddCustomCommandTarget(cc, this->GetTarget());
+ // Record the custom commands for this target. The container is used
+ // in WriteObjectBuildStatement when called in a loop below.
+ this->CustomCommands.push_back((*si)->GetCustomCommand());
}
std::vector<cmSourceFile const*> headerSources;
this->GeneratorTarget->GetHeaderSources(headerSources, config);
@@ -565,14 +568,11 @@ cmNinjaTargetGenerator
}
// Add order-only dependencies on custom command outputs.
- std::vector<cmSourceFile const*> customCommands;
- std::string config = this->Makefile->GetSafeDefinition("CMAKE_BUILD_TYPE");
- this->GeneratorTarget->GetCustomCommands(customCommands, config);
- for(std::vector<cmSourceFile const*>::const_iterator
- si = customCommands.begin();
- si != customCommands.end(); ++si)
+ for(std::vector<cmCustomCommand const*>::const_iterator
+ cci = this->CustomCommands.begin();
+ cci != this->CustomCommands.end(); ++cci)
{
- cmCustomCommand const* cc = (*si)->GetCustomCommand();
+ cmCustomCommand const* cc = *cci;
cmCustomCommandGenerator ccg(*cc, this->GetConfigName(),
this->GetMakefile());
const std::vector<std::string>& ccoutputs = ccg.GetOutputs();
diff --git a/Source/cmNinjaTargetGenerator.h b/Source/cmNinjaTargetGenerator.h
index 8669e6e..8073af2 100644
--- a/Source/cmNinjaTargetGenerator.h
+++ b/Source/cmNinjaTargetGenerator.h
@@ -153,6 +153,7 @@ private:
cmLocalNinjaGenerator* LocalGenerator;
/// List of object files for this target.
cmNinjaDeps Objects;
+ std::vector<cmCustomCommand const*> CustomCommands;
typedef std::map<std::string, std::string> LanguageFlagMap;
LanguageFlagMap LanguageFlags;
-----------------------------------------------------------------------
Summary of changes:
hooks/post-receive
--
CMake
More information about the Cmake-commits
mailing list