diff options
author | Brad King <brad.king@kitware.com> | 2005-02-24 21:04:54 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2005-02-24 21:04:54 (GMT) |
commit | cb48e0c16178738c3d3bafd551f0f3e0b906c6c1 (patch) | |
tree | e6a6b05c3bf993e74eca255d6a00c70175956f1d /Source/cmLocalUnixMakefileGenerator2.cxx | |
parent | 9bf0811e34e7d26eb4aaf7bb250b1fd8be5cbb87 (diff) | |
download | CMake-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/cmLocalUnixMakefileGenerator2.cxx')
-rw-r--r-- | Source/cmLocalUnixMakefileGenerator2.cxx | 147 |
1 files changed, 1 insertions, 146 deletions
diff --git a/Source/cmLocalUnixMakefileGenerator2.cxx b/Source/cmLocalUnixMakefileGenerator2.cxx index 5eec9f7..2a2aeae 100644 --- a/Source/cmLocalUnixMakefileGenerator2.cxx +++ b/Source/cmLocalUnixMakefileGenerator2.cxx @@ -33,8 +33,6 @@ #include <memory> // auto_ptr #include <queue> -#include <assert.h> - // TODO: Convert makefile name to a runtime switch. #define CMLUMG_MAKEFILE_NAME "Makefile" @@ -1998,6 +1996,7 @@ cmLocalUnixMakefileGenerator2 for(std::vector<std::string>::const_iterator i = objects.begin(); i != objects.end(); ++i) { + // TODO: Make sure we don't escape spaces and quote. ruleFileStream << " \\\n" << "\"" << this->ConvertToRelativeOutputPath(i->c_str()) << "\""; @@ -2310,94 +2309,6 @@ cmLocalUnixMakefileGenerator2 //---------------------------------------------------------------------------- std::string -cmLocalUnixMakefileGenerator2::ConvertToRelativePath(const char* p) -{ - // The path should never be quoted. - assert(p[0] != '\"'); - - // If the path is already relative or relative paths are disabled - // then just return the path. - if(m_RelativePathTop.size() == 0 || !cmSystemTools::FileIsFullPath(p)) - { - return p; - } - - // If the path does not begin with the minimum relative path prefix - // then do not convert it. - std::string original = p; - if(original.size() < m_RelativePathTop.size() || - !this->ComparePath(original.substr(0, m_RelativePathTop.size()).c_str(), - m_RelativePathTop.c_str())) - { - return p; - } - - // Identify the longest shared path component between the given path - // and the current output directory. - std::vector<std::string> path; - cmSystemTools::SplitPath(p, path); - unsigned int common=0; - while(common < path.size() && - common < m_CurrentOutputDirectoryComponents.size() && - this->ComparePath(path[common].c_str(), - m_CurrentOutputDirectoryComponents[common].c_str())) - { - ++common; - } - - // If the entire path is in common then just return a ".". - if(common == path.size() && - common == m_CurrentOutputDirectoryComponents.size()) - { - return "."; - } - - // If the entire path is in common except for a trailing slash then - // just return a "./". - if(common+1 == path.size() && path[common].size() == 0 && - common == m_CurrentOutputDirectoryComponents.size()) - { - return "./"; - } - - // Construct the relative path. - std::string relative; - - // First add enough ../ to get up to the level of the shared portion - // of the path. Leave off the trailing slash. Note that the last - // component of m_CurrentOutputDirectoryComponents will never be - // empty because m_CurrentOutputDirectory does not have a trailing - // slash. - for(unsigned int i=common; i < m_CurrentOutputDirectoryComponents.size(); ++i) - { - relative += ".."; - if(i < m_CurrentOutputDirectoryComponents.size()-1) - { - relative += "/"; - } - } - - // Now add the portion of the destination path that is not included - // in the shared portion of the path. Add a slash the first time - // only if there was already something in the path. If there was a - // trailing slash in the input then the last iteration of the loop - // will add a slash followed by an empty string which will preserve - // the trailing slash in the output. - for(unsigned int i=common; i < path.size(); ++i) - { - if(relative.size() > 0) - { - relative += "/"; - } - relative += path[i]; - } - - // Finally return the path. - return relative; -} - -//---------------------------------------------------------------------------- -std::string cmLocalUnixMakefileGenerator2::ConvertToRelativeOutputPath(const char* p) { // Convert the path to a relative path. @@ -2424,52 +2335,6 @@ void cmLocalUnixMakefileGenerator2::ConfigureOutputPaths() m_ExecutableOutputPath = exeOut; this->FormatOutputPath(m_ExecutableOutputPath, "EXECUTABLE"); } - - // Setup fully collapsed paths. - m_CurrentOutputDirectory = - cmSystemTools::CollapseFullPath(m_Makefile->GetCurrentOutputDirectory()); - m_HomeOutputDirectory = - cmSystemTools::CollapseFullPath(m_Makefile->GetHomeOutputDirectory()); - m_HomeDirectory = - cmSystemTools::CollapseFullPath(m_Makefile->GetHomeDirectory()); - - // 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_HomeDirectory.c_str(), source); - cmSystemTools::SplitPath(m_HomeOutputDirectory.c_str(), binary); - unsigned int common=0; - while(common < source.size() && common < binary.size() && - this->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] != "//") - { - // Build the minimum prefix required of a path to be converted to - // a relative path. - m_RelativePathTop = source[0]; - for(unsigned int i=1; i < common; ++i) - { - if(i > 1) - { - m_RelativePathTop += "/"; - } - m_RelativePathTop += source[i]; - } - - // Split the current output directory now to save time when - // converting paths. - cmSystemTools::SplitPath(m_CurrentOutputDirectory.c_str(), - m_CurrentOutputDirectoryComponents); - } } //---------------------------------------------------------------------------- @@ -2504,16 +2369,6 @@ void cmLocalUnixMakefileGenerator2::FormatOutputPath(std::string& path, } //---------------------------------------------------------------------------- -bool cmLocalUnixMakefileGenerator2::ComparePath(const char* c1, const char* c2) -{ -#if defined(_WIN32) || defined(__APPLE__) - return cmSystemTools::Strucmp(c1, c2) == 0; -#else - return strcmp(c1, c2) == 0; -#endif -} - -//---------------------------------------------------------------------------- void cmLocalUnixMakefileGenerator2 ::AppendTargetDepends(std::vector<std::string>& depends, |