| /* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying | 
 |    file Copyright.txt or https://cmake.org/licensing for details.  */ | 
 | #include "cmInstallRuntimeDependencySet.h" | 
 |  | 
 | #include <set> | 
 | #include <string> | 
 | #include <utility> | 
 |  | 
 | #include "cmGeneratorTarget.h" | 
 | #include "cmGlobalGenerator.h" | 
 | #include "cmInstallImportedRuntimeArtifactsGenerator.h" | 
 | #include "cmInstallTargetGenerator.h" | 
 | #include "cmStateTypes.h" | 
 | #include "cmTargetDepend.h" | 
 |  | 
 | cmInstallRuntimeDependencySet::cmInstallRuntimeDependencySet(std::string name) | 
 |   : Name(std::move(name)) | 
 | { | 
 | } | 
 |  | 
 | void cmInstallRuntimeDependencySet::AddExecutable( | 
 |   std::unique_ptr<Item> executable) | 
 | { | 
 |   this->Executables.push_back(std::move(executable)); | 
 | } | 
 |  | 
 | void cmInstallRuntimeDependencySet::AddLibrary(std::unique_ptr<Item> library) | 
 | { | 
 |   this->Libraries.push_back(std::move(library)); | 
 | } | 
 |  | 
 | void cmInstallRuntimeDependencySet::AddModule(std::unique_ptr<Item> module) | 
 | { | 
 |   this->Modules.push_back(std::move(module)); | 
 | } | 
 |  | 
 | bool cmInstallRuntimeDependencySet::AddBundleExecutable( | 
 |   std::unique_ptr<Item> bundleExecutable) | 
 | { | 
 |   if (this->BundleExecutable) { | 
 |     return false; | 
 |   } | 
 |   this->BundleExecutable = bundleExecutable.get(); | 
 |   this->AddExecutable(std::move(bundleExecutable)); | 
 |   return true; | 
 | } | 
 |  | 
 | std::string cmInstallRuntimeDependencySet::TargetItem::GetItemPath( | 
 |   const std::string& config) const | 
 | { | 
 |   return this->Target->GetTarget()->GetFullPath(config); | 
 | } | 
 |  | 
 | namespace { | 
 | const std::set<const cmGeneratorTarget*>& GetTargetDependsClosure( | 
 |   std::map<const cmGeneratorTarget*, std::set<const cmGeneratorTarget*>>& | 
 |     targetDepends, | 
 |   const cmGeneratorTarget* tgt) | 
 | { | 
 |   auto it = targetDepends.insert({ tgt, {} }); | 
 |   auto& retval = it.first->second; | 
 |   if (it.second) { | 
 |     auto const& deps = tgt->GetGlobalGenerator()->GetTargetDirectDepends(tgt); | 
 |     for (auto const& dep : deps) { | 
 |       if (!dep.IsCross() && dep.IsLink()) { | 
 |         auto type = dep->GetType(); | 
 |         if (type == cmStateEnums::EXECUTABLE || | 
 |             type == cmStateEnums::SHARED_LIBRARY || | 
 |             type == cmStateEnums::MODULE_LIBRARY) { | 
 |           retval.insert(dep); | 
 |         } | 
 |         auto const& depDeps = GetTargetDependsClosure(targetDepends, dep); | 
 |         retval.insert(depDeps.begin(), depDeps.end()); | 
 |       } | 
 |     } | 
 |   } | 
 |   return retval; | 
 | } | 
 | } | 
 |  | 
 | void cmInstallRuntimeDependencySet::TargetItem::AddPostExcludeFiles( | 
 |   const std::string& config, std::set<std::string>& files, | 
 |   cmInstallRuntimeDependencySet* set) const | 
 | { | 
 |   for (auto const* dep : GetTargetDependsClosure(set->TargetDepends, | 
 |                                                  this->Target->GetTarget())) { | 
 |     files.insert(dep->GetFullPath(config)); | 
 |   } | 
 | } | 
 |  | 
 | std::string cmInstallRuntimeDependencySet::ImportedTargetItem::GetItemPath( | 
 |   const std::string& config) const | 
 | { | 
 |   return this->Target->GetTarget()->GetFullPath(config); | 
 | } |