diff options
author | Aaron Orenstein <aorenste@fb.com> | 2017-08-18 01:27:03 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2017-09-20 18:10:47 (GMT) |
commit | 3b95ab569345028a1a8fe521d5ecd81fa97f2653 (patch) | |
tree | 98aa64465c6607b9af1779e63fafb9556f7fe664 /Source/cmMakefile.cxx | |
parent | e018880350990565746a3b335b1606497ce94211 (diff) | |
download | CMake-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.cxx | 50 |
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; } |