summaryrefslogtreecommitdiff
path: root/Source/cmLocalGenerator.cxx
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2008-08-21 09:54:36 -0400
committerBrad King <brad.king@kitware.com>2008-08-21 09:54:36 -0400
commit990c6b0b908a3ecad3c5038953752dd2256b957d (patch)
tree386158a87531d8868307b41411ff0739ac1f9fcb /Source/cmLocalGenerator.cxx
parent5fda12b73f367844ba1a664584afd7cc268dc667 (diff)
downloadcmake-990c6b0b908a3ecad3c5038953752dd2256b957d.tar.gz
ENH: Allow custom limit on object file path length
Some native build tools, particularly those for cross compiling, may have a limit on the length of the full path to an object file name that is lower than the platform otherwise supports. This change allows the limit to be set by the project toolchain file through the variable CMAKE_OBJECT_PATH_MAX.
Diffstat (limited to 'Source/cmLocalGenerator.cxx')
-rw-r--r--Source/cmLocalGenerator.cxx52
1 files changed, 42 insertions, 10 deletions
diff --git a/Source/cmLocalGenerator.cxx b/Source/cmLocalGenerator.cxx
index 4bf183943a..52322ff012 100644
--- a/Source/cmLocalGenerator.cxx
+++ b/Source/cmLocalGenerator.cxx
@@ -101,6 +101,43 @@ void cmLocalGenerator::Configure()
// relative paths.
this->UseRelativePaths = this->Makefile->IsOn("CMAKE_USE_RELATIVE_PATHS");
+ // Choose a maximum object file name length.
+ {
+#if defined(_WIN32) || defined(__CYGWIN__)
+ this->ObjectPathMax = 250;
+#else
+ this->ObjectPathMax = 1000;
+#endif
+ const char* plen = this->Makefile->GetDefinition("CMAKE_OBJECT_PATH_MAX");
+ if(plen && *plen)
+ {
+ unsigned int pmax;
+ if(sscanf(plen, "%u", &pmax) == 1)
+ {
+ if(pmax >= 128)
+ {
+ this->ObjectPathMax = pmax;
+ }
+ else
+ {
+ cmOStringStream w;
+ w << "CMAKE_OBJECT_PATH_MAX is set to " << pmax
+ << ", which is less than the minimum of 128. "
+ << "The value will be ignored.";
+ this->Makefile->IssueMessage(cmake::AUTHOR_WARNING, w.str());
+ }
+ }
+ else
+ {
+ cmOStringStream w;
+ w << "CMAKE_OBJECT_PATH_MAX is set to \"" << plen
+ << "\", which fails to parse as a positive integer. "
+ << "The value will be ignored.";
+ this->Makefile->IssueMessage(cmake::AUTHOR_WARNING, w.str());
+ }
+ }
+ }
+
this->Configured = true;
this->GetGlobalGenerator()->SetCurrentLocalGenerator(previousLg);
@@ -2314,16 +2351,11 @@ cmLocalGeneratorShortenObjectName(std::string& objName,
}
}
-static bool cmLocalGeneratorCheckObjectName(std::string& objName,
- std::string::size_type dir_len)
+static
+bool cmLocalGeneratorCheckObjectName(std::string& objName,
+ std::string::size_type dir_len,
+ std::string::size_type max_total_len)
{
- // Choose a maximum file name length.
-#if defined(_WIN32) || defined(__CYGWIN__)
- std::string::size_type const max_total_len = 250;
-#else
- std::string::size_type const max_total_len = 1000;
-#endif
-
// Enforce the maximum file name length if possible.
std::string::size_type max_obj_len = max_total_len;
if(dir_len < max_total_len)
@@ -2414,7 +2446,7 @@ cmLocalGenerator
}
#if defined(CM_LG_ENCODE_OBJECT_NAMES)
- cmLocalGeneratorCheckObjectName(ssin, dir_len);
+ cmLocalGeneratorCheckObjectName(ssin, dir_len, this->ObjectPathMax);
#else
(void)dir_len;
#endif