summaryrefslogtreecommitdiffstats
path: root/Source/cmMakefile.cxx
diff options
context:
space:
mode:
authorAaron Orenstein <aorenste@fb.com>2017-08-18 01:27:03 (GMT)
committerBrad King <brad.king@kitware.com>2017-09-20 18:10:47 (GMT)
commit3b95ab569345028a1a8fe521d5ecd81fa97f2653 (patch)
tree98aa64465c6607b9af1779e63fafb9556f7fe664 /Source/cmMakefile.cxx
parente018880350990565746a3b335b1606497ce94211 (diff)
downloadCMake-3b95ab569345028a1a8fe521d5ecd81fa97f2653.zip
CMake-3b95ab569345028a1a8fe521d5ecd81fa97f2653.tar.gz
CMake-3b95ab569345028a1a8fe521d5ecd81fa97f2653.tar.bz2
Performance: Improve efficiency of source file lookup in cmMakefile
Add an unordered map to cmMakefile to speed up GetSource() lookups.
Diffstat (limited to 'Source/cmMakefile.cxx')
-rw-r--r--Source/cmMakefile.cxx50
1 files changed, 47 insertions, 3 deletions
diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx
index e51cfcc..c96b892 100644
--- a/Source/cmMakefile.cxx
+++ b/Source/cmMakefile.cxx
@@ -3082,9 +3082,18 @@ void cmMakefile::SetArgcArgv(const std::vector<std::string>& args)
cmSourceFile* cmMakefile::GetSource(const std::string& sourceName) const
{
cmSourceFileLocation sfl(this, sourceName);
- for (cmSourceFile* sf : this->SourceFiles) {
- if (sf->Matches(sfl)) {
- return sf;
+
+#if defined(_WIN32) || defined(__APPLE__)
+ const auto& name = cmSystemTools::LowerCase(sfl.GetName());
+#else
+ const auto& name = sfl.GetName();
+#endif
+ auto sfsi = this->SourceFileSearchIndex.find(name);
+ if (sfsi != this->SourceFileSearchIndex.end()) {
+ for (auto sf : sfsi->second) {
+ if (sf->Matches(sfl)) {
+ return sf;
+ }
}
}
return nullptr;
@@ -3098,6 +3107,41 @@ cmSourceFile* cmMakefile::CreateSource(const std::string& sourceName,
sf->SetProperty("GENERATED", "1");
}
this->SourceFiles.push_back(sf);
+
+ auto name = sf->GetLocation().GetName();
+#if defined(_WIN32) || defined(__APPLE__)
+ name = cmSystemTools::LowerCase(name);
+#endif
+
+ // For a file in the form "a.b.c" add the cmSourceFile to the index
+ // at "a.b.c", "a.b" and "a".
+ auto partial = name;
+ while (true) {
+ this->SourceFileSearchIndex[partial].insert(sf);
+ auto i = partial.rfind('.');
+ if (i == std::string::npos) {
+ break;
+ }
+ partial = partial.substr(0, i);
+ }
+
+ if (sf->GetLocation().ExtensionIsAmbiguous()) {
+ // For an ambiguous extension also add the various "known"
+ // extensions to the original filename.
+
+ const auto& srcExts = this->GetCMakeInstance()->GetSourceExtensions();
+ for (const auto& ext : srcExts) {
+ auto name_ext = name + "." + cmSystemTools::LowerCase(ext);
+ this->SourceFileSearchIndex[name_ext].insert(sf);
+ }
+
+ const auto& hdrExts = this->GetCMakeInstance()->GetHeaderExtensions();
+ for (const auto& ext : hdrExts) {
+ auto name_ext = name + "." + cmSystemTools::LowerCase(ext);
+ this->SourceFileSearchIndex[name_ext].insert(sf);
+ }
+ }
+
return sf;
}