diff options
author | Tim Blechmann <tim@klingt.org> | 2020-01-14 10:55:04 (GMT) |
---|---|---|
committer | Tim Blechmann <tim@klingt.org> | 2020-01-16 03:29:25 (GMT) |
commit | 9d5a554cc9de0ac03d2da7dc95b8ef1db4a526e9 (patch) | |
tree | aa91636887104b6c5a85023fde05373d107abfb1 /Source | |
parent | 23e782ce05b5996536eff4c075d4bc36a8d8ba85 (diff) | |
download | CMake-9d5a554cc9de0ac03d2da7dc95b8ef1db4a526e9.zip CMake-9d5a554cc9de0ac03d2da7dc95b8ef1db4a526e9.tar.gz CMake-9d5a554cc9de0ac03d2da7dc95b8ef1db4a526e9.tar.bz2 |
cmGlobalGenerator: Add cache for realpath() results
Cache the results of `realpath()` system calls in `cmGlobalGenerator`
to avoid repeating such calls for the same paths over and over.
Diffstat (limited to 'Source')
-rw-r--r-- | Source/cmGlobalGenerator.cxx | 11 | ||||
-rw-r--r-- | Source/cmGlobalGenerator.h | 4 | ||||
-rw-r--r-- | Source/cmLocalGenerator.cxx | 4 |
3 files changed, 17 insertions, 2 deletions
diff --git a/Source/cmGlobalGenerator.cxx b/Source/cmGlobalGenerator.cxx index bcc9050..c189ea5 100644 --- a/Source/cmGlobalGenerator.cxx +++ b/Source/cmGlobalGenerator.cxx @@ -7,6 +7,7 @@ #include <cstdio> #include <cstdlib> #include <cstring> +#include <functional> #include <initializer_list> #include <iterator> #include <sstream> @@ -3110,6 +3111,16 @@ cmGlobalGenerator::GetFilenameTargetDepends(cmSourceFile* sf) const return this->FilenameTargetDepends[sf]; } +const std::string& cmGlobalGenerator::GetRealPath(const std::string& dir) +{ + auto i = this->RealPaths.lower_bound(dir); + if (i == this->RealPaths.end() || + this->RealPaths.key_comp()(dir, i->first)) { + i = this->RealPaths.emplace_hint(i, dir, cmSystemTools::GetRealPath(dir)); + } + return i->second; +} + void cmGlobalGenerator::ProcessEvaluationFiles() { std::vector<std::string> generatedFiles; diff --git a/Source/cmGlobalGenerator.h b/Source/cmGlobalGenerator.h index f3078ac..4794853 100644 --- a/Source/cmGlobalGenerator.h +++ b/Source/cmGlobalGenerator.h @@ -485,6 +485,8 @@ public: configs.emplace_back("$<CONFIG>"); } + std::string const& GetRealPath(std::string const& dir); + protected: // for a project collect all its targets by following depend // information, and also collect all the targets @@ -676,6 +678,8 @@ private: mutable std::map<cmSourceFile*, std::set<cmGeneratorTarget const*>> FilenameTargetDepends; + std::map<std::string, std::string> RealPaths; + #if !defined(CMAKE_BOOTSTRAP) // Pool of file locks cmFileLockPool FileLockPool; diff --git a/Source/cmLocalGenerator.cxx b/Source/cmLocalGenerator.cxx index 1da6efe..5e39d9b 100644 --- a/Source/cmLocalGenerator.cxx +++ b/Source/cmLocalGenerator.cxx @@ -1177,7 +1177,7 @@ std::vector<BT<std::string>> cmLocalGenerator::GetIncludeDirectoriesImplicit( } for (std::string const& i : impDirVec) { - if (implicitSet.insert(cmSystemTools::GetRealPath(i)).second) { + if (implicitSet.insert(this->GlobalGenerator->GetRealPath(i)).second) { implicitDirs.emplace_back(i); } } @@ -1188,7 +1188,7 @@ std::vector<BT<std::string>> cmLocalGenerator::GetIncludeDirectoriesImplicit( &lang](std::string const& dir) { return ( // Do not exclude directories that are not in an excluded set. - ((!cmContains(implicitSet, cmSystemTools::GetRealPath(dir))) && + ((!cmContains(implicitSet, this->GlobalGenerator->GetRealPath(dir))) && (!cmContains(implicitExclude, dir))) // Do not exclude entries of the CPATH environment variable even though // they are implicitly searched by the compiler. They are meant to be |