Jelajahi Sumber

Merge topic 'install-export-staging-dir'

c7a319ab install(EXPORT): Fix support for mid-length install destinations on Windows
Brad King 9 tahun lalu
induk
melakukan
f4cec30b53
2 mengubah file dengan 26 tambahan dan 2 penghapusan
  1. 25 2
      Source/cmInstallExportGenerator.cxx
  2. 1 0
      Source/cmInstallExportGenerator.h

+ 25 - 2
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.

+ 1 - 0
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;