summaryrefslogtreecommitdiffstats
path: root/Source
diff options
context:
space:
mode:
authorTim Blechmann <tim@klingt.org>2020-01-14 10:55:04 (GMT)
committerTim Blechmann <tim@klingt.org>2020-01-16 03:29:25 (GMT)
commit9d5a554cc9de0ac03d2da7dc95b8ef1db4a526e9 (patch)
treeaa91636887104b6c5a85023fde05373d107abfb1 /Source
parent23e782ce05b5996536eff4c075d4bc36a8d8ba85 (diff)
downloadCMake-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.cxx11
-rw-r--r--Source/cmGlobalGenerator.h4
-rw-r--r--Source/cmLocalGenerator.cxx4
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