summaryrefslogtreecommitdiffstats
path: root/Source/cmInstallExportGenerator.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'Source/cmInstallExportGenerator.cxx')
-rw-r--r--Source/cmInstallExportGenerator.cxx94
1 files changed, 30 insertions, 64 deletions
diff --git a/Source/cmInstallExportGenerator.cxx b/Source/cmInstallExportGenerator.cxx
index 9cb376d..b80437d 100644
--- a/Source/cmInstallExportGenerator.cxx
+++ b/Source/cmInstallExportGenerator.cxx
@@ -2,7 +2,6 @@
file Copyright.txt or https://cmake.org/licensing for details. */
#include "cmInstallExportGenerator.h"
-#include <algorithm>
#include <map>
#include <sstream>
#include <utility>
@@ -15,6 +14,7 @@
#include "cmExportInstallFileGenerator.h"
#include "cmExportSet.h"
#include "cmInstallType.h"
+#include "cmListFileCache.h"
#include "cmLocalGenerator.h"
#include "cmStringAlgorithms.h"
#include "cmSystemTools.h"
@@ -32,7 +32,6 @@ cmInstallExportGenerator::cmInstallExportGenerator(
, FileName(std::move(filename))
, Namespace(std::move(name_space))
, ExportOld(exportOld)
- , LocalGenerator(nullptr)
{
if (android) {
#ifndef CMAKE_BOOTSTRAP
@@ -52,73 +51,36 @@ bool cmInstallExportGenerator::Compute(cmLocalGenerator* lg)
return this->ExportSet->Compute(lg);
}
-void cmInstallExportGenerator::ComputeTempDir()
+std::string cmInstallExportGenerator::TempDirCalculate() const
{
// Choose a temporary directory in which to generate the import
// files to be installed.
- this->TempDir = cmStrCat(this->LocalGenerator->GetCurrentBinaryDirectory(),
- "/CMakeFiles/Export");
+ std::string path = cmStrCat(
+ this->LocalGenerator->GetCurrentBinaryDirectory(), "/CMakeFiles/Export");
if (this->Destination.empty()) {
- return;
- }
- this->TempDir += "/";
-
- // Enforce a maximum length.
- bool useMD5 = false;
-#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
- // 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 const max_len = max_total_len - len;
- if (this->Destination.size() > max_len) {
- useMD5 = true;
- }
- } else {
- useMD5 = true;
+ return path;
}
- if (useMD5) {
- // Replace the destination path with a hash to keep it short.
+
#ifndef CMAKE_BOOTSTRAP
- this->TempDir += cmSystemTools::ComputeStringMD5(this->Destination);
+ path += '/';
+ // Replace the destination path with a hash to keep it short.
+ path += cmSystemTools::ComputeStringMD5(this->Destination);
#endif
- } else {
- std::string dest = this->Destination;
- // Avoid unix full paths.
- if (dest[0] == '/') {
- dest[0] = '_';
- }
- // Avoid windows full paths by removing colons.
- std::replace(dest.begin(), dest.end(), ':', '_');
- // Avoid relative paths that go up the tree.
- cmSystemTools::ReplaceString(dest, "../", "__/");
- // Avoid spaces.
- std::replace(dest.begin(), dest.end(), ' ', '_');
- this->TempDir += dest;
- }
+
+ return path;
}
-size_t cmInstallExportGenerator::GetMaxConfigLength() const
+void cmInstallExportGenerator::ComputeTempDir()
{
- // 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::string const& c : *this->ConfigurationTypes) {
- if (c.size() > len) {
- len = c.size();
- }
- }
+ this->TempDir = this->TempDirCalculate();
+}
+
+std::string cmInstallExportGenerator::GetTempDir() const
+{
+ if (this->TempDir.empty()) {
+ return this->TempDirCalculate();
}
- return len;
+ return this->TempDir;
}
void cmInstallExportGenerator::GenerateScript(std::ostream& os)
@@ -193,18 +155,22 @@ void cmInstallExportGenerator::GenerateScriptActions(std::ostream& os,
Indent indentNN = indentN.Next();
Indent indentNNN = indentNN.Next();
/* clang-format off */
- os << indentN << "file(DIFFERENT EXPORT_FILE_CHANGED FILES\n"
+ os << indentN << "file(DIFFERENT _cmake_export_file_changed FILES\n"
<< indentN << " \"" << installedFile << "\"\n"
<< indentN << " \"" << this->MainImportFile << "\")\n";
- os << indentN << "if(EXPORT_FILE_CHANGED)\n";
- os << indentNN << "file(GLOB OLD_CONFIG_FILES \"" << installedDir
+ os << indentN << "if(_cmake_export_file_changed)\n";
+ os << indentNN << "file(GLOB _cmake_old_config_files \"" << installedDir
<< this->EFGen->GetConfigImportFileGlob() << "\")\n";
- os << indentNN << "if(OLD_CONFIG_FILES)\n";
+ os << indentNN << "if(_cmake_old_config_files)\n";
+ os << indentNNN << "string(REPLACE \";\" \", \" _cmake_old_config_files_text \"${_cmake_old_config_files}\")\n";
os << indentNNN << R"(message(STATUS "Old export file \")" << installedFile
- << "\\\" will be replaced. Removing files [${OLD_CONFIG_FILES}].\")\n";
- os << indentNNN << "file(REMOVE ${OLD_CONFIG_FILES})\n";
+ << "\\\" will be replaced. Removing files [${_cmake_old_config_files_text}].\")\n";
+ os << indentNNN << "unset(_cmake_old_config_files_text)\n";
+ os << indentNNN << "file(REMOVE ${_cmake_old_config_files})\n";
os << indentNN << "endif()\n";
+ os << indentNN << "unset(_cmake_old_config_files)\n";
os << indentN << "endif()\n";
+ os << indentN << "unset(_cmake_export_file_changed)\n";
os << indent << "endif()\n";
/* clang-format on */