summaryrefslogtreecommitdiffstats
path: root/Source
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2005-05-16 18:17:30 (GMT)
committerBrad King <brad.king@kitware.com>2005-05-16 18:17:30 (GMT)
commit7ed018ec09cd68bd1417b9bf0d29ebb963e2c213 (patch)
treeca8ecee93f41e2dfbb9528574207aa68a8d6a0ae /Source
parent26f82b064ce935e429dfcb3fd74bd277640e0b7e (diff)
downloadCMake-7ed018ec09cd68bd1417b9bf0d29ebb963e2c213.zip
CMake-7ed018ec09cd68bd1417b9bf0d29ebb963e2c213.tar.gz
CMake-7ed018ec09cd68bd1417b9bf0d29ebb963e2c213.tar.bz2
BUG: Changing to a new test for whether to do relative path conversion. Now only paths inside the source or binary trees are converted.
Diffstat (limited to 'Source')
-rw-r--r--Source/cmGlobalGenerator.cxx55
-rw-r--r--Source/cmGlobalGenerator.h11
2 files changed, 28 insertions, 38 deletions
diff --git a/Source/cmGlobalGenerator.cxx b/Source/cmGlobalGenerator.cxx
index 7818c0e..f63fa99 100644
--- a/Source/cmGlobalGenerator.cxx
+++ b/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;
}
diff --git a/Source/cmGlobalGenerator.h b/Source/cmGlobalGenerator.h
index c72ab67..8b35116 100644
--- a/Source/cmGlobalGenerator.h
+++ b/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