resolve cyclic dependency with zstd
[platform/upstream/cmake.git] / Source / cmInstallFileSetGenerator.cxx
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"
4
5 #include <map>
6 #include <string>
7 #include <utility>
8 #include <vector>
9
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"
17
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))
26   , FileSet(fileSet)
27   , FilePermissions(std::move(file_permissions))
28   , Optional(optional)
29 {
30   this->ActionsPerConfig = true;
31 }
32
33 cmInstallFileSetGenerator::~cmInstallFileSetGenerator() = default;
34
35 bool cmInstallFileSetGenerator::Compute(cmLocalGenerator* lg)
36 {
37   this->LocalGenerator = lg;
38
39   // Lookup this target in the current directory.
40   this->Target = lg->FindLocalNonAliasGeneratorTarget(this->TargetName);
41   if (!this->Target) {
42     // If no local target has been found, find it in the global scope.
43     this->Target =
44       lg->GetGlobalGenerator()->FindGeneratorTarget(this->TargetName);
45   }
46
47   return true;
48 }
49
50 std::string cmInstallFileSetGenerator::GetDestination(
51   std::string const& config) const
52 {
53   return cmGeneratorExpression::Evaluate(this->Destination,
54                                          this->LocalGenerator, config);
55 }
56
57 void cmInstallFileSetGenerator::GenerateScriptForConfig(
58   std::ostream& os, const std::string& config, Indent indent)
59 {
60   for (auto const& dirEntry : this->CalculateFilesPerDir(config)) {
61     std::string destSub;
62     if (!dirEntry.first.empty()) {
63       destSub = cmStrCat('/', dirEntry.first);
64     }
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);
69   }
70 }
71
72 std::map<std::string, std::vector<std::string>>
73 cmInstallFileSetGenerator::CalculateFilesPerDir(
74   const std::string& config) const
75 {
76   std::map<std::string, std::vector<std::string>> result;
77
78   auto dirCges = this->FileSet->CompileDirectoryEntries();
79   auto dirs = this->FileSet->EvaluateDirectoryEntries(
80     dirCges, this->LocalGenerator, config, this->Target);
81
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);
86   }
87
88   return result;
89 }