Merge branch 'reduce-realpath-calls' into release

This commit is contained in:
Brad King 2015-12-01 11:00:49 -05:00
commit 7b13759d5f
2 changed files with 28 additions and 4 deletions

View File

@ -73,9 +73,7 @@ public:
{ {
// Check if this directory conflicts with the entry. // Check if this directory conflicts with the entry.
std::string const& dir = this->OD->OriginalDirectories[i]; std::string const& dir = this->OD->OriginalDirectories[i];
if(dir != this->Directory && if (!this->OD->IsSameDirectory(dir, this->Directory) &&
cmSystemTools::GetRealPath(dir) !=
cmSystemTools::GetRealPath(this->Directory) &&
this->FindConflict(dir)) this->FindConflict(dir))
{ {
// The library will be found in this directory but this is not // The library will be found in this directory but this is not
@ -639,3 +637,23 @@ void cmOrderDirectories::DiagnoseCycle()
->IssueMessage(cmake::WARNING, e.str(), ->IssueMessage(cmake::WARNING, e.str(),
this->Target->Target->GetBacktrace()); this->Target->Target->GetBacktrace());
} }
bool cmOrderDirectories::IsSameDirectory(std::string const& l,
std::string const& 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;
}

View File

@ -80,6 +80,12 @@ private:
struct ConflictList: public std::vector<ConflictPair> {}; struct ConflictList: public std::vector<ConflictPair> {};
std::vector<ConflictList> ConflictGraph; std::vector<ConflictList> ConflictGraph;
// 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 cmOrderDirectoriesConstraint;
friend class cmOrderDirectoriesConstraintLibrary; friend class cmOrderDirectoriesConstraintLibrary;
}; };