summaryrefslogtreecommitdiffstats
path: root/Source/cmLocalGenerator.cxx
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2005-02-24 21:04:54 (GMT)
committerBrad King <brad.king@kitware.com>2005-02-24 21:04:54 (GMT)
commitcb48e0c16178738c3d3bafd551f0f3e0b906c6c1 (patch)
treee6a6b05c3bf993e74eca255d6a00c70175956f1d /Source/cmLocalGenerator.cxx
parent9bf0811e34e7d26eb4aaf7bb250b1fd8be5cbb87 (diff)
downloadCMake-cb48e0c16178738c3d3bafd551f0f3e0b906c6c1.zip
CMake-cb48e0c16178738c3d3bafd551f0f3e0b906c6c1.tar.gz
CMake-cb48e0c16178738c3d3bafd551f0f3e0b906c6c1.tar.bz2
ENH: Merged implementations of ConvertToRelative*Path methods. The main ConvertToRelativePath method is now in cmGlobalGenerator. It converts paths only if they are at least inside the deepest common directory between the top-level source and build trees. Each cmLocalGenerator instance calls this global method with its own output directory as the "local" argument from which paths are relative. Added separate ConvertToOptionallyRelative path that pays attention to the CMAKE_USE_RELATIVE_PATHS option.
Diffstat (limited to 'Source/cmLocalGenerator.cxx')
-rw-r--r--Source/cmLocalGenerator.cxx130
1 files changed, 53 insertions, 77 deletions
diff --git a/Source/cmLocalGenerator.cxx b/Source/cmLocalGenerator.cxx
index e0d296c..61f20ec 100644
--- a/Source/cmLocalGenerator.cxx
+++ b/Source/cmLocalGenerator.cxx
@@ -51,6 +51,16 @@ void cmLocalGenerator::Configure()
std::string currentStart = m_Makefile->GetStartDirectory();
currentStart += "/CMakeLists.txt";
m_Makefile->ReadListFile(currentStart.c_str());
+
+ // Setup the current output directory components for use by
+ // ConvertToRelativePath.
+ std::string outdir =
+ cmSystemTools::CollapseFullPath(m_Makefile->GetCurrentOutputDirectory());
+ cmSystemTools::SplitPath(outdir.c_str(), m_CurrentOutputDirectoryComponents);
+
+ // Check whether relative paths should be used for optionally
+ // relative paths.
+ m_UseRelativePaths = m_Makefile->IsOn("CMAKE_USE_RELATIVE_PATHS");
}
void cmLocalGenerator::SetGlobalGenerator(cmGlobalGenerator *gg)
@@ -404,83 +414,6 @@ std::string cmLocalGenerator::GetFullTargetName(const char* n,
return name;
}
-
-std::string cmLocalGenerator::ConvertToRelativeOutputPath(const char* p)
-{
- if ( !m_Makefile->IsOn("CMAKE_USE_RELATIVE_PATHS") )
- {
- return cmSystemTools::ConvertToOutputPath(p);
- }
- // NOTE, much of this was copied to
- // cmGlobalXCodeGenerator::ConvertToRelativeOutputPath
- // fixes here should be made there as well.
-
- // 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 cmSystemTools::ConvertToOutputPath(p);
- }
-
- // do not use relative paths for network build trees
- // the network paths do not work
- const char* outputDirectory = m_Makefile->GetHomeOutputDirectory();
- if ( outputDirectory && *outputDirectory && *(outputDirectory+1) &&
- outputDirectory[0] == '/' && outputDirectory[1] == '/' )
- {
- return cmSystemTools::ConvertToOutputPath(p);
- }
- // if the path is double quoted remove the double quotes
- if(pathIn.size() && pathIn[0] == '\"')
- {
- pathIn = pathIn.substr(1, pathIn.size()-2);
- }
- // 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)
- {
- m_CurrentOutputDirectory = cmSystemTools::CollapseFullPath(m_Makefile->GetCurrentOutputDirectory());
- }
- // 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)
- {
- ret = ".";
- }
- // 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.erase(ret.size()-1, 1);
- }
- if(ret[ret.size()-1] != '/' &&
- pathIn[pathIn.size()-1] == '/')
- {
- 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;
-}
-
void cmLocalGenerator::AddCustomCommandToCreateObject(const char* ofname,
const char* lang,
cmSourceFile& source,
@@ -1356,3 +1289,46 @@ cmLocalGenerator::ConstructScript(const cmCustomCommandLines& commandLines,
}
return script;
}
+
+//----------------------------------------------------------------------------
+std::string cmLocalGenerator::ConvertToRelativePath(const char* remote)
+{
+ return (m_GlobalGenerator
+ ->ConvertToRelativePath(m_CurrentOutputDirectoryComponents,
+ remote));
+}
+
+//----------------------------------------------------------------------------
+std::string
+cmLocalGenerator::ConvertToRelativeOutputPath(const char* remote)
+{
+ // TODO: Make this behave like its documentation...always convert.
+ // This involves identifying all calls to it that should be calls to
+ // the optional one.
+ return this->ConvertToOptionallyRelativeOutputPath(remote);
+}
+
+//----------------------------------------------------------------------------
+std::string
+cmLocalGenerator::ConvertToOptionallyRelativePath(const char* remote)
+{
+ if(m_UseRelativePaths)
+ {
+ return this->ConvertToRelativePath(remote);
+ }
+ else
+ {
+ return remote;
+ }
+}
+
+//----------------------------------------------------------------------------
+std::string
+cmLocalGenerator::ConvertToOptionallyRelativeOutputPath(const char* remote)
+{
+ // Convert the path to a relative path.
+ std::string relative = this->ConvertToOptionallyRelativePath(remote);
+
+ // Now convert it to an output path.
+ return cmSystemTools::ConvertToOutputPath(relative.c_str());
+}