diff options
author | Pavel Shramov <Pavel.Shramov@micex.com> | 2013-06-19 12:35:23 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2013-06-26 14:14:31 (GMT) |
commit | 551d3343cd16c566be4b33e96c892c3e769951af (patch) | |
tree | 38c2742a39cdc4234fab4d89cf97f3bfa514e56b /Source/cmSystemTools.cxx | |
parent | 7c61c73fbc1c508a6622b444e06c7fc9a0c280f1 (diff) | |
download | CMake-551d3343cd16c566be4b33e96c892c3e769951af.zip CMake-551d3343cd16c566be4b33e96c892c3e769951af.tar.gz CMake-551d3343cd16c566be4b33e96c892c3e769951af.tar.bz2 |
cmDependsC: Collapse relative include paths
While calculating dependencies collapse sequences such as
../../../a/b/c/../../d/e/../../e/f
to avoid total path lengths over the Windows path length limit as much
as possible.
Diffstat (limited to 'Source/cmSystemTools.cxx')
-rw-r--r-- | Source/cmSystemTools.cxx | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx index 21c361d..f32f2dc 100644 --- a/Source/cmSystemTools.cxx +++ b/Source/cmSystemTools.cxx @@ -1594,6 +1594,40 @@ std::string cmSystemTools::RelativePath(const char* local, const char* remote) return cmsys::SystemTools::RelativePath(local, remote); } +std::string cmSystemTools::CollapseCombinedPath(std::string const& dir, + std::string const& file) +{ + if(dir.empty() || dir == ".") + { + return file; + } + + std::vector<std::string> dirComponents; + std::vector<std::string> fileComponents; + cmSystemTools::SplitPath(dir.c_str(), dirComponents); + cmSystemTools::SplitPath(file.c_str(), fileComponents); + + if(fileComponents.empty()) + { + return dir; + } + if(fileComponents[0] != "") + { + // File is not a relative path. + return file; + } + + std::vector<std::string>::iterator i = fileComponents.begin()+1; + while(i != fileComponents.end() && *i == ".." && dirComponents.size() > 1) + { + ++i; // Remove ".." file component. + dirComponents.pop_back(); // Remove last dir component. + } + + dirComponents.insert(dirComponents.end(), i, fileComponents.end()); + return cmSystemTools::JoinPath(dirComponents); +} + #ifdef CMAKE_BUILD_WITH_CMAKE //---------------------------------------------------------------------- bool cmSystemTools::UnsetEnv(const char* value) |