浏览代码

BUG: Changing to a new test for whether to do relative path conversion. Now only paths inside the source or binary trees are converted.

Brad King 20 年之前
父节点
当前提交
7ed018ec09
共有 2 个文件被更改,包括 28 次插入38 次删除
  1. 21 34
      Source/cmGlobalGenerator.cxx
  2. 7 4
      Source/cmGlobalGenerator.h

+ 21 - 34
Source/cmGlobalGenerator.cxx

@@ -889,36 +889,20 @@ cmTarget* cmGlobalGenerator::FindTarget(const char* project,
 //----------------------------------------------------------------------------
 void cmGlobalGenerator::ConfigureRelativePaths()
 {
-  // Identify the longest shared path component between the source
-  // directory and the build directory.
-  std::vector<std::string> source;
-  std::vector<std::string> binary;
-  cmSystemTools::SplitPath(m_CMakeInstance->GetHomeDirectory(), source);
-  cmSystemTools::SplitPath(m_CMakeInstance->GetHomeOutputDirectory(), binary);
-  unsigned int common=0;
-  while(common < source.size() && common < binary.size() &&
-        cmSystemTools::ComparePath(source[common].c_str(),
-                                   binary[common].c_str()))
-    {
-    ++common;
-    }
-
-  // Require more than just the root portion of the path to be in
-  // common before allowing relative paths.  Also disallow relative
-  // paths if the build tree is a network path.  The current working
-  // directory on Windows cannot be a network path.  Therefore
-  // relative paths cannot work with network paths.
-  if(common > 1 && source[0] != "//")
+  // The current working directory on Windows cannot be a network
+  // path.  Therefore relative paths cannot work when the build tree
+  // is a network path.
+  std::string source = m_CMakeInstance->GetHomeDirectory();
+  std::string binary = m_CMakeInstance->GetHomeOutputDirectory();
+  if(binary.size() < 2 || binary.substr(0, 2) != "//")
     {
-    // Build the minimum prefix required of a path to be converted to
-    // a relative path.
-    source.erase(source.begin()+common, source.end());
-    m_RelativePathTop = cmSystemTools::JoinPath(source);
+    m_RelativePathTopSource = source;
+    m_RelativePathTopBinary = binary;
     }
   else
     {
-    // Disable relative paths.
-    m_RelativePathTop = "";
+    m_RelativePathTopSource = "";
+    m_RelativePathTopBinary = "";
     }
 }
 
@@ -939,13 +923,16 @@ cmGlobalGenerator::ConvertToRelativePath(const std::vector<std::string>& local,
     return in_remote;
     }
 
-  // if the path does not contain all of the relative top path then return
-  // because it is going too far out of the tree
+  // Skip conversion if the path is not in the source or binary tree.
   std::string original = in_remote;
-  if(original.size() < m_RelativePathTop.size() ||
-     !cmSystemTools::ComparePath(
-       original.substr(0, m_RelativePathTop.size()).c_str(),
-       m_RelativePathTop.c_str()))
+  if((original.size() < m_RelativePathTopSource.size() ||
+      !cmSystemTools::ComparePath(
+        original.substr(0, m_RelativePathTopSource.size()).c_str(),
+        m_RelativePathTopSource.c_str())) &&
+     (original.size() < m_RelativePathTopBinary.size() ||
+      !cmSystemTools::ComparePath(
+        original.substr(0, m_RelativePathTopBinary.size()).c_str(),
+        m_RelativePathTopBinary.c_str())))
     {
     return in_remote;
     }
@@ -963,8 +950,8 @@ cmGlobalGenerator::ConvertToRelativePath(const std::vector<std::string>& local,
     ++common;
     }
 
-  // if nothiong is in common the return
-  if (common == 0)
+  // If no part of the path is in common then return the full path.
+  if(common == 0)
     {
     return in_remote;
     }

+ 7 - 4
Source/cmGlobalGenerator.h

@@ -171,10 +171,13 @@ private:
   std::map<cmStdString, cmStdString> m_ExtensionToLanguage;
   std::map<cmStdString, cmStdString> m_LanguageToLinkerPreference; 
 
-  // The prefix required of a path to be converted to a relative path.
-  // No sequence of ../.. will ever go past this path.  This is the
-  // longest common path between the top level source and build trees.
-  std::string m_RelativePathTop;
+  // The paths to the tops of the source and binary trees used for
+  // relative path computation.  A path must be either in the source
+  // tree or the build tree to be converted to a relative path.  The
+  // ConfigureRelativePaths method may set these to be empty when
+  // using relative paths is unsafe.
+  std::string m_RelativePathTopSource;
+  std::string m_RelativePathTopBinary;
 };
 
 #endif