Bläddra i källkod

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
Brad King 8 år sedan
förälder
incheckning
c3fb650c85
1 ändrade filer med 7 tillägg och 2 borttagningar
  1. 7 2
      Source/cmOrderDirectories.cxx

+ 7 - 2
Source/cmOrderDirectories.cxx

@@ -345,12 +345,17 @@ void cmOrderDirectories::AddLanguageDirectories(
 void cmOrderDirectories::SetImplicitDirectories(
   std::set<std::string> const& implicitDirs)
 {
-  this->ImplicitDirectories = implicitDirs;
+  this->ImplicitDirectories.clear();
+  for (std::set<std::string>::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();
 }