Browse Source

BUG: now that system tools relative path works, clean up the convert to relative output path code

Bill Hoffman 21 years ago
parent
commit
9fe79b2297
1 changed files with 43 additions and 110 deletions
  1. 43 110
      Source/cmLocalGenerator.cxx

+ 43 - 110
Source/cmLocalGenerator.cxx

@@ -385,6 +385,20 @@ std::string cmLocalGenerator::ConvertToRelativeOutputPath(const char* p)
     {
     return cmSystemTools::ConvertToOutputPath(p);
     }
+  // copy to a string class
+  std::string pathIn = p;
+  // check to see if the path is already relative, it is
+  // considered relative if one of the following is true
+  // - has no / in it at all
+  // - does not start with / or drive leter :
+  // - starts with a ".."
+  if(pathIn.find('/') == pathIn.npos ||        
+     (pathIn[0] != '/' && pathIn[1] != ':') || 
+     pathIn.find("..") == 0)
+    {
+    return pathIn;
+    } 
+
   // do not use relative paths for network build trees
   // the network paths do not work
   const char* outputDirectory = m_Makefile->GetHomeOutputDirectory();
@@ -393,128 +407,47 @@ std::string cmLocalGenerator::ConvertToRelativeOutputPath(const char* p)
     {
     return cmSystemTools::ConvertToOutputPath(p);
     }
-
-  // The first time this is called, initialize all
-  // the path ivars that are used.   This can not
-  // be moved to the constructor because all the paths are not set yet.
-  if(m_CurrentOutputDirectory.size() == 0)
-    {
-    m_CurrentOutputDirectory = m_Makefile->GetCurrentOutputDirectory();
-    m_HomeOutputDirectory =  m_Makefile->GetHomeOutputDirectory();
-    m_HomeDirectory = m_Makefile->GetHomeDirectory();
-    if(m_RelativePathToSourceDir.size() == 0)
-      {
-      m_RelativePathToSourceDir = cmSystemTools::RelativePath(
-        m_CurrentOutputDirectory.c_str(),
-        m_HomeDirectory.c_str());
-      std::string path = m_CurrentOutputDirectory;
-      cmSystemTools::ReplaceString(path, m_HomeOutputDirectory.c_str(), "");
-      unsigned i;
-      m_RelativePathToBinaryDir = "";
-      for(i =0; i < path.size(); ++i)
-        {
-        if(path[i] == '/')
-          {
-          m_RelativePathToBinaryDir += "../";
-          }
-        }
-      }
-    m_HomeOutputDirectoryNoSlash = m_HomeOutputDirectory;
-    m_HomeOutputDirectory += "/";
-    m_CurrentOutputDirectory += "/";
-    }
-
-  // Do the work of converting to a relative path
-  std::string pathIn = p;
-  if(pathIn.find('/') == pathIn.npos)
-    {
-    return pathIn;
-    }
-
+  // if the path is double quoted remove the double quotes
   if(pathIn.size() && pathIn[0] == '\"')
     {
     pathIn = pathIn.substr(1, pathIn.size()-2);
-    }
-
-  std::string ret = pathIn;
-  if(m_CurrentOutputDirectory.size() <= ret.size())
-    {
-    std::string sub = ret.substr(0, m_CurrentOutputDirectory.size());
-    if(
-#if defined(_WIN32) || defined(__APPLE__)
-      cmSystemTools::LowerCase(sub) ==
-      cmSystemTools::LowerCase(m_CurrentOutputDirectory)
-#else
-      sub == m_CurrentOutputDirectory
-#endif
-      )
-      {
-      ret = ret.substr(m_CurrentOutputDirectory.size(), ret.npos);
-      }
-    }
-  if(m_HomeDirectory.size() <= ret.size())
-    {
-    std::string sub = ret.substr(0, m_HomeDirectory.size());
-    if(
-#if defined(_WIN32) || defined(__APPLE__)
-      cmSystemTools::LowerCase(sub) ==
-      cmSystemTools::LowerCase(m_HomeDirectory)
-#else
-      sub == m_HomeDirectory
-#endif
-      )
-      {
-      ret = m_RelativePathToSourceDir + ret.substr(m_HomeDirectory.size(), ret.npos);
-      }
-    }
-  if(m_HomeOutputDirectory.size() <= ret.size())
-    {
-    std::string sub = ret.substr(0, m_HomeOutputDirectory.size());
-    if(
-#if defined(_WIN32) || defined(__APPLE__)
-      cmSystemTools::LowerCase(sub) ==
-      cmSystemTools::LowerCase(m_HomeOutputDirectory)
-#else
-      sub == m_HomeOutputDirectory
-#endif
-      )
-      {
-      ret = m_RelativePathToBinaryDir + ret.substr(m_HomeOutputDirectory.size(), ret.npos);
-      }
-    }
-
-  std::string relpath = m_RelativePathToBinaryDir;
-  if(relpath.size())
+    } 
+  // The first time this is called
+  // initialize m_CurrentOutputDirectory to contain
+  // the full path to the current output directory
+  // This has to be done here and not in the constructor
+  // because the output directory is not yet set in the constructor.
+  if(m_CurrentOutputDirectory.size() == 0)
     {
-    relpath.erase(relpath.size()-1, 1);
+    m_CurrentOutputDirectory = cmSystemTools::CollapseFullPath(m_Makefile->GetCurrentOutputDirectory());
     }
-  else
+  // Given that we are in m_CurrentOutputDirectory how to we
+  // get to pathIn with a relative path, store in ret
+  std::string ret = cmSystemTools::RelativePath(m_CurrentOutputDirectory.c_str(), pathIn.c_str());
+  // If the path is 0 sized make it a .
+  // this happens when pathIn is the same as m_CurrentOutputDirectory
+  if(ret.size() == 0)
     {
-    relpath = ".";
+    ret = ".";
     }
-  if(
-#if defined(_WIN32) || defined(__APPLE__)
-    cmSystemTools::LowerCase(ret) ==
-    cmSystemTools::LowerCase(m_HomeOutputDirectoryNoSlash)
-#else
-    ret == m_HomeOutputDirectoryNoSlash
-#endif
-    )
+  // if there was a trailing / there still is one, and
+  // if there was not one, there still is not one
+  if(ret[ret.size()-1] == '/' && 
+     pathIn[pathIn.size()-1] != '/')
     {
-    ret = relpath;
+    ret.erase(ret.size()-1, 1);
     }
-
-  // Relative paths should always start in a '.', so add a './' if
-  // necessary.
-  if(ret.size()
-     && ret[0] != '\"' && ret[0] != '/' && ret[0] != '.' && ret[0] != '$')
+  if(ret[ret.size()-1] != '/' && 
+     pathIn[pathIn.size()-1] == '/')
     {
-    if(ret.size() > 1 && ret[1] != ':')
-      {
-      ret = std::string("./") + ret;
-      }
+    ret += "/";
     }
+  // Now convert the relative path to an output path
   ret = cmSystemTools::ConvertToOutputPath(ret.c_str());
+  // finally return the path 
+  // at this point it should be relative and in the correct format
+  // for the native build system.  (i.e. \ for windows and / for unix,
+  // and correct escaping/quoting of spaces in the path
   return ret;
 }