Skip to content
Snippets Groups Projects
Commit c7a319ab authored by Brad King's avatar Brad King
Browse files

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: default avatarAlan W. Irwin <irwin@beluga.phys.uvic.ca>
parent 4689d16e
Branches
Tags
No related merge requests found
......@@ -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.
......
......@@ -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;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment