1 /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
2 file Copyright.txt or https://cmake.org/licensing for details. */
3 #include "cmInstallFileSetGenerator.h"
10 #include "cmFileSet.h"
11 #include "cmGeneratorExpression.h"
12 #include "cmGlobalGenerator.h"
13 #include "cmInstallType.h"
14 #include "cmListFileCache.h"
15 #include "cmLocalGenerator.h"
16 #include "cmStringAlgorithms.h"
18 cmInstallFileSetGenerator::cmInstallFileSetGenerator(
19 std::string targetName, cmFileSet* fileSet, std::string const& dest,
20 std::string file_permissions, std::vector<std::string> const& configurations,
21 std::string const& component, MessageLevel message, bool exclude_from_all,
22 bool optional, cmListFileBacktrace backtrace)
23 : cmInstallGenerator(dest, configurations, component, message,
24 exclude_from_all, false, std::move(backtrace))
25 , TargetName(std::move(targetName))
27 , FilePermissions(std::move(file_permissions))
30 this->ActionsPerConfig = true;
33 cmInstallFileSetGenerator::~cmInstallFileSetGenerator() = default;
35 bool cmInstallFileSetGenerator::Compute(cmLocalGenerator* lg)
37 this->LocalGenerator = lg;
39 // Lookup this target in the current directory.
40 this->Target = lg->FindLocalNonAliasGeneratorTarget(this->TargetName);
42 // If no local target has been found, find it in the global scope.
44 lg->GetGlobalGenerator()->FindGeneratorTarget(this->TargetName);
50 std::string cmInstallFileSetGenerator::GetDestination(
51 std::string const& config) const
53 return cmGeneratorExpression::Evaluate(this->Destination,
54 this->LocalGenerator, config);
57 void cmInstallFileSetGenerator::GenerateScriptForConfig(
58 std::ostream& os, const std::string& config, Indent indent)
60 for (auto const& dirEntry : this->CalculateFilesPerDir(config)) {
62 if (!dirEntry.first.empty()) {
63 destSub = cmStrCat('/', dirEntry.first);
65 this->AddInstallRule(os, cmStrCat(this->GetDestination(config), destSub),
66 cmInstallType_FILES, dirEntry.second,
67 this->GetOptional(), this->FilePermissions.c_str(),
68 nullptr, nullptr, nullptr, indent);
72 std::map<std::string, std::vector<std::string>>
73 cmInstallFileSetGenerator::CalculateFilesPerDir(
74 const std::string& config) const
76 std::map<std::string, std::vector<std::string>> result;
78 auto dirCges = this->FileSet->CompileDirectoryEntries();
79 auto dirs = this->FileSet->EvaluateDirectoryEntries(
80 dirCges, this->LocalGenerator, config, this->Target);
82 auto fileCges = this->FileSet->CompileFileEntries();
83 for (auto const& fileCge : fileCges) {
84 this->FileSet->EvaluateFileEntry(
85 dirs, result, fileCge, this->LocalGenerator, config, this->Target);