diff options
-rw-r--r-- | Source/cmOrderDirectories.cxx | 17 | ||||
-rw-r--r-- | Source/cmOrderDirectories.h | 3 |
2 files changed, 18 insertions, 2 deletions
diff --git a/Source/cmOrderDirectories.cxx b/Source/cmOrderDirectories.cxx index 9491204..e3406a8 100644 --- a/Source/cmOrderDirectories.cxx +++ b/Source/cmOrderDirectories.cxx @@ -641,6 +641,19 @@ void cmOrderDirectories::DiagnoseCycle() bool cmOrderDirectories::IsSameDirectory(std::string const& l, std::string const& r) { - return (l == r || - cmSystemTools::GetRealPath(l) == cmSystemTools::GetRealPath(r)); + return this->GetRealPath(l) == this->GetRealPath(r); +} + +std::string const& cmOrderDirectories::GetRealPath(std::string const& dir) +{ + std::map<std::string, std::string>::iterator i = + this->RealPaths.lower_bound(dir); + if (i == this->RealPaths.end() || + this->RealPaths.key_comp()(dir, i->first)) + { + typedef std::map<std::string, std::string>::value_type value_type; + i = this->RealPaths.insert( + i, value_type(dir, cmSystemTools::GetRealPath(dir))); + } + return i->second; } diff --git a/Source/cmOrderDirectories.h b/Source/cmOrderDirectories.h index 0657e92..477216b 100644 --- a/Source/cmOrderDirectories.h +++ b/Source/cmOrderDirectories.h @@ -83,6 +83,9 @@ private: // Compare directories after resolving symlinks. bool IsSameDirectory(std::string const& l, std::string const& r); + std::string const& GetRealPath(std::string const& dir); + std::map<std::string, std::string> RealPaths; + friend class cmOrderDirectoriesConstraint; friend class cmOrderDirectoriesConstraintLibrary; }; |