/* 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 #include #include #include #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 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> cmInstallFileSetGenerator::CalculateFilesPerDir( const std::string& config) const { std::map> 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; }