浏览代码

BUG: Fix same-file check for directory ordering

When computing runtime search path ordering a constraint exists when a
file that may be found by the runtime search exists in a directory other
than that containing the desired file.  We test whether a potential
conflict is really the same due to a symlink.  Recently the change to
cmFindLibraryCommand to load directory content created a case in which
the same-file check would be incorrectly skipped.  This avoids skipping
the check.
Brad King 17 年之前
父节点
当前提交
85a46e9e51
共有 1 个文件被更改,包括 11 次插入14 次删除
  1. 11 14
      Source/cmOrderDirectories.cxx

+ 11 - 14
Source/cmOrderDirectories.cxx

@@ -113,25 +113,22 @@ protected:
 bool cmOrderDirectoriesConstraint::FileMayConflict(std::string const& dir,
                                                    std::string const& name)
 {
-  // Check if the file will be built by cmake.
-  std::set<cmStdString> const& files =
-    (this->GlobalGenerator->GetDirectoryContent(dir, false));
-  if(std::set<cmStdString>::const_iterator(files.find(name)) != files.end())
-    {
-    return true;
-    }
-
-  // Check if the file exists on disk and is not a symlink back to the
-  // original file.
+  // Check if the file exists on disk.
   std::string file = dir;
   file += "/";
   file += name;
-  if(cmSystemTools::FileExists(file.c_str(), true) &&
-     !cmSystemTools::SameFile(this->FullPath.c_str(), file.c_str()))
+  if(cmSystemTools::FileExists(file.c_str(), true))
     {
-    return true;
+    // The file conflicts only if it is not the same as the original
+    // file due to a symlink or hardlink.
+    return !cmSystemTools::SameFile(this->FullPath.c_str(), file.c_str());
     }
-  return false;
+
+  // Check if the file will be built by cmake.
+  std::set<cmStdString> const& files =
+    (this->GlobalGenerator->GetDirectoryContent(dir, false));
+  std::set<cmStdString>::const_iterator fi = files.find(name);
+  return fi != files.end();
 }
 
 //----------------------------------------------------------------------------