[CMake] Symlink problem under linux for runtime search path generation

Brad King brad.king at kitware.com
Wed Dec 24 16:39:52 EST 2008


Nicolas Desprès wrote:
> But in this kind of case, cmake could figure out that these two
> directories are actually the same ?

There is code to figure that out but it doesn't seem to be working
for some reason.  My guess is that the recent change to help find
openbsd-style libraries enabled loading of the directory content
including that on disk from the directory.  This tricks the code
into thinking CMake will build the file which skips the same-file test.

Try the patch below.  If it doesn't work, look in
Source/cmOrderDirectories.cxx for the function

   cmOrderDirectoriesConstraint::FileMayConflict

This is the function that checks for a file in a given directory that
could conflict with a given file in another directory during the runtime
search.  First it checks whether a conflicting file will be built by
CMake.  If not, then it looks for a file on disk that is not the same
(considering symlinks) as the given file.  Can you please add some print
statements in there to see what it is doing?

-Brad

diff --git Source/cmOrderDirectories.cxx Source/cmOrderDirectories.cxx
index 54f23f7..24b7138 100644
--- Source/cmOrderDirectories.cxx
+++ 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();
  }

  //----------------------------------------------------------------------------


More information about the CMake mailing list