From c3fb650c85a01f1a31f3f56f5ae630d4e6c6e98d Mon Sep 17 00:00:00 2001 From: Brad King Date: Wed, 1 Mar 2017 11:55:51 -0500 Subject: cmOrderDirectories: Consider symlinks when checking implicit directories When checking whether a directory is "implicit" (e.g. implicit link directory or implicit rpath directory), resolve the real path of both sides of the comparison. Otherwise we will not recognize paths like `/usr/lib32` as implicit when `/usr/lib` is implicit and `lib32` is actually a symlink to `lib`. This can lead to addition of unnecessary entries to the RPATH of a binary, for example. Fixes: #16682 --- Source/cmOrderDirectories.cxx | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/Source/cmOrderDirectories.cxx b/Source/cmOrderDirectories.cxx index d93debe..d48eb53 100644 --- a/Source/cmOrderDirectories.cxx +++ b/Source/cmOrderDirectories.cxx @@ -345,12 +345,17 @@ void cmOrderDirectories::AddLanguageDirectories( void cmOrderDirectories::SetImplicitDirectories( std::set const& implicitDirs) { - this->ImplicitDirectories = implicitDirs; + this->ImplicitDirectories.clear(); + for (std::set::const_iterator i = implicitDirs.begin(); + i != implicitDirs.end(); ++i) { + this->ImplicitDirectories.insert(this->GetRealPath(*i)); + } } bool cmOrderDirectories::IsImplicitDirectory(std::string const& dir) { - return this->ImplicitDirectories.find(dir) != + std::string const& real = this->GetRealPath(dir); + return this->ImplicitDirectories.find(real) != this->ImplicitDirectories.end(); } -- cgit v0.12