| /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying | |
| file Copyright.txt or https://cmake.org/licensing for details. */ | |
| #include "cmInstallFileSetGenerator.h" | |
| #include <map> | |
| #include <string> | |
| #include <utility> | |
| #include <vector> | |
| #include "cmFileSet.h" | |
| #include "cmGeneratorExpression.h" | |
| #include "cmGlobalGenerator.h" | |
| #include "cmInstallType.h" | |
| #include "cmListFileCache.h" | |
| #include "cmLocalGenerator.h" | |
| #include "cmStringAlgorithms.h" | |
| cmInstallFileSetGenerator::cmInstallFileSetGenerator( | |
| std::string targetName, cmFileSet* fileSet, std::string const& dest, | |
| std::string file_permissions, std::vector<std::string> const& configurations, | |
| std::string const& component, MessageLevel message, bool exclude_from_all, | |
| bool optional, cmListFileBacktrace backtrace) | |
| : cmInstallGenerator(dest, configurations, component, message, | |
| exclude_from_all, false, std::move(backtrace)) | |
| , TargetName(std::move(targetName)) | |
| , FileSet(fileSet) | |
| , FilePermissions(std::move(file_permissions)) | |
| , Optional(optional) | |
| { | |
| this->ActionsPerConfig = true; | |
| } | |
| cmInstallFileSetGenerator::~cmInstallFileSetGenerator() = default; | |
| bool cmInstallFileSetGenerator::Compute(cmLocalGenerator* lg) | |
| { | |
| this->LocalGenerator = lg; | |
| // Lookup this target in the current directory. | |
| this->Target = lg->FindLocalNonAliasGeneratorTarget(this->TargetName); | |
| if (!this->Target) { | |
| // If no local target has been found, find it in the global scope. | |
| this->Target = | |
| lg->GetGlobalGenerator()->FindGeneratorTarget(this->TargetName); | |
| } | |
| return true; | |
| } | |
| std::string cmInstallFileSetGenerator::GetDestination( | |
| std::string const& config) const | |
| { | |
| return cmGeneratorExpression::Evaluate(this->Destination, | |
| this->LocalGenerator, config); | |
| } | |
| void cmInstallFileSetGenerator::GenerateScriptForConfig( | |
| std::ostream& os, const std::string& config, Indent indent) | |
| { | |
| for (auto const& dirEntry : this->CalculateFilesPerDir(config)) { | |
| std::string destSub; | |
| if (!dirEntry.first.empty()) { | |
| destSub = cmStrCat('/', dirEntry.first); | |
| } | |
| this->AddInstallRule(os, cmStrCat(this->GetDestination(config), destSub), | |
| cmInstallType_FILES, dirEntry.second, | |
| this->GetOptional(), this->FilePermissions.c_str(), | |
| nullptr, nullptr, nullptr, indent); | |
| } | |
| } | |
| std::map<std::string, std::vector<std::string>> | |
| cmInstallFileSetGenerator::CalculateFilesPerDir( | |
| const std::string& config) const | |
| { | |
| std::map<std::string, std::vector<std::string>> result; | |
| auto dirCges = this->FileSet->CompileDirectoryEntries(); | |
| auto dirs = this->FileSet->EvaluateDirectoryEntries( | |
| dirCges, this->LocalGenerator, config, this->Target); | |
| auto fileCges = this->FileSet->CompileFileEntries(); | |
| for (auto const& fileCge : fileCges) { | |
| this->FileSet->EvaluateFileEntry( | |
| dirs, result, fileCge, this->LocalGenerator, config, this->Target); | |
| } | |
| return result; | |
| } |