From b1a37362b87c24d409f4037cd59c33056468c11b Mon Sep 17 00:00:00 2001 From: Brad King Date: Wed, 1 Mar 2017 11:55:37 -0500 Subject: cmOrderDirectories: Factor out implicit directory check --- Source/cmOrderDirectories.cxx | 15 +++++++++------ Source/cmOrderDirectories.h | 2 ++ 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/Source/cmOrderDirectories.cxx b/Source/cmOrderDirectories.cxx index 7744a5a82c..d93debe499 100644 --- a/Source/cmOrderDirectories.cxx +++ b/Source/cmOrderDirectories.cxx @@ -287,8 +287,7 @@ void cmOrderDirectories::AddRuntimeLibrary(std::string const& fullPath, } } - if (this->ImplicitDirectories.find(dir) != - this->ImplicitDirectories.end()) { + if (this->IsImplicitDirectory(dir)) { this->ImplicitDirEntries.push_back( new cmOrderDirectoriesConstraintSOName(this, fullPath, soname)); return; @@ -316,8 +315,7 @@ void cmOrderDirectories::AddLinkLibrary(std::string const& fullPath) // Implicit link directories need special handling. if (!this->ImplicitDirectories.empty()) { std::string dir = cmSystemTools::GetFilenamePath(fullPath); - if (this->ImplicitDirectories.find(dir) != - this->ImplicitDirectories.end()) { + if (this->IsImplicitDirectory(dir)) { this->ImplicitDirEntries.push_back( new cmOrderDirectoriesConstraintLibrary(this, fullPath)); return; @@ -350,6 +348,12 @@ void cmOrderDirectories::SetImplicitDirectories( this->ImplicitDirectories = implicitDirs; } +bool cmOrderDirectories::IsImplicitDirectory(std::string const& dir) +{ + return this->ImplicitDirectories.find(dir) != + this->ImplicitDirectories.end(); +} + void cmOrderDirectories::SetLinkExtensionInfo( std::vector const& linkExtensions, std::string const& removeExtRegex) @@ -394,8 +398,7 @@ void cmOrderDirectories::AddOriginalDirectories( for (std::vector::const_iterator di = dirs.begin(); di != dirs.end(); ++di) { // We never explicitly specify implicit link directories. - if (this->ImplicitDirectories.find(*di) != - this->ImplicitDirectories.end()) { + if (this->IsImplicitDirectory(*di)) { continue; } diff --git a/Source/cmOrderDirectories.h b/Source/cmOrderDirectories.h index 90a67e7dfa..d9e01269f5 100644 --- a/Source/cmOrderDirectories.h +++ b/Source/cmOrderDirectories.h @@ -82,6 +82,8 @@ private: // Compare directories after resolving symlinks. bool IsSameDirectory(std::string const& l, std::string const& r); + bool IsImplicitDirectory(std::string const& dir); + std::string const& GetRealPath(std::string const& dir); std::map RealPaths; -- cgit v1.2.1 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 d93debe499..d48eb53a3f 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 v1.2.1