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 "cmLinkItemGraphVisitor.h"
9 #include "cmGeneratorTarget.h"
10 #include "cmLinkItem.h"
11 #include "cmMakefile.h"
13 void cmLinkItemGraphVisitor::VisitItem(cmLinkItem
const& item
)
15 if (this->ItemVisited(item
)) {
21 this->VisitLinks(item
, item
);
24 void cmLinkItemGraphVisitor::VisitLinks(cmLinkItem
const& item
,
25 cmLinkItem
const& rootItem
)
31 for (auto const& config
: item
.Target
->Makefile
->GetGeneratorConfigs(
32 cmMakefile::IncludeEmptyConfig
)) {
33 this->VisitLinks(item
, rootItem
, config
);
37 void cmLinkItemGraphVisitor::VisitLinks(cmLinkItem
const& item
,
38 cmLinkItem
const& rootItem
,
39 std::string
const& config
)
41 auto const& target
= *item
.Target
;
43 DependencyMap dependencies
;
44 cmLinkItemGraphVisitor::GetDependencies(target
, config
, dependencies
);
46 for (auto const& d
: dependencies
) {
47 auto const& dependency
= d
.second
;
48 auto const& dependencyType
= dependency
.first
;
49 auto const& dependee
= dependency
.second
;
50 this->VisitItem(dependee
);
52 if (this->LinkVisited(item
, dependee
)) {
56 this->OnDirectLink(item
, dependee
, dependencyType
);
58 if (rootItem
.AsStr() != item
.AsStr()) {
59 this->OnIndirectLink(rootItem
, dependee
);
62 // Visit all the direct and indirect links.
63 this->VisitLinks(dependee
, dependee
);
64 this->VisitLinks(dependee
, item
);
65 this->VisitLinks(dependee
, rootItem
);
69 bool cmLinkItemGraphVisitor::ItemVisited(cmLinkItem
const& item
)
71 auto& collection
= this->VisitedItems
;
73 bool const visited
= collection
.find(item
.AsStr()) != collection
.cend();
76 collection
.insert(item
.AsStr());
82 bool cmLinkItemGraphVisitor::LinkVisited(cmLinkItem
const& depender
,
83 cmLinkItem
const& dependee
)
85 auto const link
= std::make_pair(depender
.AsStr(), dependee
.AsStr());
87 bool const linkVisited
=
88 this->VisitedLinks
.find(link
) != this->VisitedLinks
.cend();
91 this->VisitedLinks
.insert(link
);
97 void cmLinkItemGraphVisitor::GetDependencies(cmGeneratorTarget
const& target
,
98 std::string
const& config
,
99 DependencyMap
& dependencies
)
101 const auto* implementationLibraries
= target
.GetLinkImplementationLibraries(
102 config
, cmGeneratorTarget::UseTo::Link
);
103 if (implementationLibraries
) {
104 for (auto const& lib
: implementationLibraries
->Libraries
) {
105 auto const& name
= lib
.AsStr();
106 dependencies
[name
] = Dependency(DependencyType::LinkPrivate
, lib
);
110 const auto* interfaceLibraries
= target
.GetLinkInterfaceLibraries(
111 config
, &target
, cmGeneratorTarget::UseTo::Compile
);
112 if (interfaceLibraries
) {
113 for (auto const& lib
: interfaceLibraries
->Libraries
) {
114 auto const& name
= lib
.AsStr();
115 if (dependencies
.find(name
) != dependencies
.cend()) {
116 dependencies
[name
] = Dependency(DependencyType::LinkPublic
, lib
);
118 dependencies
[name
] = Dependency(DependencyType::LinkInterface
, lib
);
123 std::vector
<cmGeneratorTarget
*> objectLibraries
;
124 target
.GetObjectLibrariesCMP0026(objectLibraries
);
125 for (auto const& lib
: objectLibraries
) {
126 auto const& name
= lib
->GetName();
127 if (dependencies
.find(name
) == dependencies
.cend()) {
128 auto objectItem
= cmLinkItem(lib
, false, lib
->GetBacktrace());
129 dependencies
[name
] = Dependency(DependencyType::Object
, objectItem
);
133 auto const& utilityItems
= target
.GetUtilityItems();
134 for (auto const& item
: utilityItems
) {
135 auto const& name
= item
.AsStr();
136 if (dependencies
.find(name
) == dependencies
.cend()) {
137 dependencies
[name
] = Dependency(DependencyType::Utility
, item
);