summaryrefslogtreecommitdiffstats
path: root/Source
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2016-08-09 13:53:16 (GMT)
committerBrad King <brad.king@kitware.com>2016-08-09 14:09:52 (GMT)
commitc7a319ab057172071bf8fb909c4498ca87b1235a (patch)
tree7ae61249febff2785b714ab022e816b1abed830c /Source
parent4689d16e8aa90e57a8456357251b6575131529d7 (diff)
downloadCMake-c7a319ab057172071bf8fb909c4498ca87b1235a.zip
CMake-c7a319ab057172071bf8fb909c4498ca87b1235a.tar.gz
CMake-c7a319ab057172071bf8fb909c4498ca87b1235a.tar.bz2
install(EXPORT): Fix support for mid-length install destinations on Windows
The implementation of `install(EXPORT)` generates files into a staging directory for later installation. We use the full install destination in the path to the staging directory to avoid collisions. In order to avoid exceeding maximum path lengths (especially on Windows) we compute a hash of the install destination when it is too long. Fix this logic to account for the length of the file name(s) when deciding whether to switch to the hashed name. Reported-by: Alan W. Irwin <irwin@beluga.phys.uvic.ca>
Diffstat (limited to 'Source')
-rw-r--r--Source/cmInstallExportGenerator.cxx27
-rw-r--r--Source/cmInstallExportGenerator.h1
2 files changed, 26 insertions, 2 deletions
diff --git a/Source/cmInstallExportGenerator.cxx b/Source/cmInstallExportGenerator.cxx
index 6250012..0fcd8ba 100644
--- a/Source/cmInstallExportGenerator.cxx
+++ b/Source/cmInstallExportGenerator.cxx
@@ -74,9 +74,12 @@ void cmInstallExportGenerator::ComputeTempDir()
#else
std::string::size_type const max_total_len = 1000;
#endif
- if (this->TempDir.size() < max_total_len) {
+ // Will generate files of the form "<temp-dir>/<base>-<config>.<ext>".
+ std::string::size_type const len = this->TempDir.size() + 1 +
+ this->FileName.size() + 1 + this->GetMaxConfigLength();
+ if (len < max_total_len) {
// Keep the total path length below the limit.
- std::string::size_type max_len = max_total_len - this->TempDir.size();
+ std::string::size_type const max_len = max_total_len - len;
if (this->Destination.size() > max_len) {
useMD5 = true;
}
@@ -102,6 +105,26 @@ void cmInstallExportGenerator::ComputeTempDir()
}
}
+size_t cmInstallExportGenerator::GetMaxConfigLength() const
+{
+ // Always use at least 8 for "noconfig".
+ size_t len = 8;
+ if (this->ConfigurationTypes->empty()) {
+ if (this->ConfigurationName.size() > 8) {
+ len = this->ConfigurationName.size();
+ }
+ } else {
+ for (std::vector<std::string>::const_iterator ci =
+ this->ConfigurationTypes->begin();
+ ci != this->ConfigurationTypes->end(); ++ci) {
+ if (ci->size() > len) {
+ len = ci->size();
+ }
+ }
+ }
+ return len;
+}
+
void cmInstallExportGenerator::GenerateScript(std::ostream& os)
{
// Skip empty sets.
diff --git a/Source/cmInstallExportGenerator.h b/Source/cmInstallExportGenerator.h
index 4435f53..22e661b 100644
--- a/Source/cmInstallExportGenerator.h
+++ b/Source/cmInstallExportGenerator.h
@@ -53,6 +53,7 @@ protected:
void GenerateImportFile(cmExportSet const* exportSet);
void GenerateImportFile(const char* config, cmExportSet const* exportSet);
void ComputeTempDir();
+ size_t GetMaxConfigLength() const;
cmExportSet* ExportSet;
std::string FilePermissions;