|
@@ -752,6 +752,7 @@ void cmGeneratorTarget::ClearSourcesCache()
|
|
|
this->Objects.clear();
|
|
|
this->VisitedConfigsForObjects.clear();
|
|
|
this->LinkImplMap.clear();
|
|
|
+ this->LinkImplUsageRequirementsOnlyMap.clear();
|
|
|
}
|
|
|
|
|
|
void cmGeneratorTarget::ClearLinkInterfaceCache()
|
|
@@ -1302,7 +1303,8 @@ bool cmGeneratorTarget::IsSystemIncludeDirectory(
|
|
|
&dagChecker, result, excludeImported, language);
|
|
|
}
|
|
|
|
|
|
- cmLinkImplementation const* impl = this->GetLinkImplementation(config);
|
|
|
+ cmLinkImplementation const* impl =
|
|
|
+ this->GetLinkImplementation(config, LinkInterfaceFor::Usage);
|
|
|
if (impl != nullptr) {
|
|
|
auto runtimeEntries = impl->LanguageRuntimeLibraries.find(language);
|
|
|
if (runtimeEntries != impl->LanguageRuntimeLibraries.end()) {
|
|
@@ -1519,7 +1521,8 @@ void AddLangSpecificImplicitIncludeDirectories(
|
|
|
const std::string& config, const std::string& propertyName,
|
|
|
IncludeDirectoryFallBack mode, EvaluatedTargetPropertyEntries& entries)
|
|
|
{
|
|
|
- if (const auto* libraries = target->GetLinkImplementationLibraries(config)) {
|
|
|
+ if (const auto* libraries = target->GetLinkImplementationLibraries(
|
|
|
+ config, LinkInterfaceFor::Usage)) {
|
|
|
cmGeneratorExpressionDAGChecker dag{ target->GetBacktrace(), target,
|
|
|
propertyName, nullptr, nullptr };
|
|
|
|
|
@@ -1609,7 +1612,7 @@ void AddInterfaceEntries(
|
|
|
{
|
|
|
if (searchRuntime == IncludeRuntimeInterface::Yes) {
|
|
|
if (cmLinkImplementation const* impl =
|
|
|
- headTarget->GetLinkImplementation(config)) {
|
|
|
+ headTarget->GetLinkImplementation(config, interfaceFor)) {
|
|
|
entries.HadContextSensitiveCondition =
|
|
|
impl->HadContextSensitiveCondition;
|
|
|
|
|
@@ -1623,7 +1626,7 @@ void AddInterfaceEntries(
|
|
|
}
|
|
|
} else {
|
|
|
if (cmLinkImplementationLibraries const* impl =
|
|
|
- headTarget->GetLinkImplementationLibraries(config)) {
|
|
|
+ headTarget->GetLinkImplementationLibraries(config, interfaceFor)) {
|
|
|
entries.HadContextSensitiveCondition =
|
|
|
impl->HadContextSensitiveCondition;
|
|
|
addInterfaceEntry(headTarget, config, prop, lang, dagChecker, entries,
|
|
@@ -1638,7 +1641,8 @@ void AddObjectEntries(cmGeneratorTarget const* headTarget,
|
|
|
EvaluatedTargetPropertyEntries& entries)
|
|
|
{
|
|
|
if (cmLinkImplementationLibraries const* impl =
|
|
|
- headTarget->GetLinkImplementationLibraries(config)) {
|
|
|
+ headTarget->GetLinkImplementationLibraries(config,
|
|
|
+ LinkInterfaceFor::Usage)) {
|
|
|
entries.HadContextSensitiveCondition = impl->HadContextSensitiveCondition;
|
|
|
for (cmLinkImplItem const& lib : impl->Libraries) {
|
|
|
if (lib.Target &&
|
|
@@ -2821,7 +2825,7 @@ bool cmGeneratorTarget::ComputeLinkClosure(const std::string& config,
|
|
|
// Get languages built in this target.
|
|
|
std::unordered_set<std::string> languages;
|
|
|
cmLinkImplementation const* impl =
|
|
|
- this->GetLinkImplementation(config, secondPass);
|
|
|
+ this->GetLinkImplementation(config, LinkInterfaceFor::Link, secondPass);
|
|
|
assert(impl);
|
|
|
languages.insert(impl->Languages.cbegin(), impl->Languages.cend());
|
|
|
|
|
@@ -3089,7 +3093,7 @@ cmGeneratorTarget::GetLinkImplementationClosure(
|
|
|
std::set<cmGeneratorTarget const*> emitted;
|
|
|
|
|
|
cmLinkImplementationLibraries const* impl =
|
|
|
- this->GetLinkImplementationLibraries(config);
|
|
|
+ this->GetLinkImplementationLibraries(config, LinkInterfaceFor::Usage);
|
|
|
assert(impl);
|
|
|
|
|
|
for (cmLinkImplItem const& lib : impl->Libraries) {
|
|
@@ -3831,7 +3835,8 @@ std::vector<BT<std::string>> cmGeneratorTarget::GetIncludeDirectories(
|
|
|
|
|
|
if (this->Makefile->IsOn("APPLE")) {
|
|
|
if (cmLinkImplementationLibraries const* impl =
|
|
|
- this->GetLinkImplementationLibraries(config)) {
|
|
|
+ this->GetLinkImplementationLibraries(config,
|
|
|
+ LinkInterfaceFor::Usage)) {
|
|
|
for (cmLinkImplItem const& lib : impl->Libraries) {
|
|
|
std::string libDir = cmSystemTools::CollapseFullPath(
|
|
|
lib.AsStr(), this->Makefile->GetHomeOutputDirectory());
|
|
@@ -6845,8 +6850,8 @@ void cmGeneratorTarget::ComputeLinkInterface(
|
|
|
emitted.insert(lib);
|
|
|
}
|
|
|
if (this->GetType() != cmStateEnums::INTERFACE_LIBRARY) {
|
|
|
- cmLinkImplementation const* impl =
|
|
|
- this->GetLinkImplementation(config, secondPass);
|
|
|
+ cmLinkImplementation const* impl = this->GetLinkImplementation(
|
|
|
+ config, LinkInterfaceFor::Link, secondPass);
|
|
|
for (cmLinkImplItem const& lib : impl->Libraries) {
|
|
|
if (emitted.insert(lib).second) {
|
|
|
if (lib.Target) {
|
|
@@ -6868,15 +6873,16 @@ void cmGeneratorTarget::ComputeLinkInterface(
|
|
|
this->GetPolicyStatusCMP0022() == cmPolicies::OLD) {
|
|
|
// The link implementation is the default link interface.
|
|
|
cmLinkImplementationLibraries const* impl =
|
|
|
- this->GetLinkImplementationLibrariesInternal(config, headTarget);
|
|
|
+ this->GetLinkImplementationLibrariesInternal(config, headTarget,
|
|
|
+ LinkInterfaceFor::Link);
|
|
|
iface.ImplementationIsInterface = true;
|
|
|
iface.WrongConfigLibraries = impl->WrongConfigLibraries;
|
|
|
}
|
|
|
|
|
|
if (this->LinkLanguagePropagatesToDependents()) {
|
|
|
// Targets using this archive need its language runtime libraries.
|
|
|
- if (cmLinkImplementation const* impl =
|
|
|
- this->GetLinkImplementation(config, secondPass)) {
|
|
|
+ if (cmLinkImplementation const* impl = this->GetLinkImplementation(
|
|
|
+ config, LinkInterfaceFor::Link, secondPass)) {
|
|
|
iface.Languages = impl->Languages;
|
|
|
}
|
|
|
}
|
|
@@ -7307,7 +7313,8 @@ void cmGeneratorTarget::ComputeLinkInterfaceLibraries(
|
|
|
|
|
|
// The link implementation is the default link interface.
|
|
|
if (cmLinkImplementationLibraries const* impl =
|
|
|
- this->GetLinkImplementationLibrariesInternal(config, headTarget)) {
|
|
|
+ this->GetLinkImplementationLibrariesInternal(config, headTarget,
|
|
|
+ interfaceFor)) {
|
|
|
iface.Libraries.insert(iface.Libraries.end(), impl->Libraries.begin(),
|
|
|
impl->Libraries.end());
|
|
|
if (this->GetPolicyStatusCMP0022() == cmPolicies::WARN &&
|
|
@@ -7686,27 +7693,30 @@ cmGeneratorTarget::GetHeadToLinkInterfaceUsageRequirementsMap(
|
|
|
}
|
|
|
|
|
|
const cmLinkImplementation* cmGeneratorTarget::GetLinkImplementation(
|
|
|
- const std::string& config) const
|
|
|
+ const std::string& config, LinkInterfaceFor implFor) const
|
|
|
{
|
|
|
- return this->GetLinkImplementation(config, false);
|
|
|
+ return this->GetLinkImplementation(config, implFor, false);
|
|
|
}
|
|
|
|
|
|
const cmLinkImplementation* cmGeneratorTarget::GetLinkImplementation(
|
|
|
- const std::string& config, bool secondPass) const
|
|
|
+ const std::string& config, LinkInterfaceFor implFor, bool secondPass) const
|
|
|
{
|
|
|
// There is no link implementation for targets that cannot compile sources.
|
|
|
if (!this->CanCompileSources()) {
|
|
|
return nullptr;
|
|
|
}
|
|
|
|
|
|
- cmOptionalLinkImplementation& impl =
|
|
|
- this->LinkImplMap[cmSystemTools::UpperCase(config)][this];
|
|
|
+ HeadToLinkImplementationMap& hm =
|
|
|
+ (implFor == LinkInterfaceFor::Usage
|
|
|
+ ? this->GetHeadToLinkImplementationUsageRequirementsMap(config)
|
|
|
+ : this->GetHeadToLinkImplementationMap(config));
|
|
|
+ cmOptionalLinkImplementation& impl = hm[this];
|
|
|
if (secondPass) {
|
|
|
impl = cmOptionalLinkImplementation();
|
|
|
}
|
|
|
if (!impl.LibrariesDone) {
|
|
|
impl.LibrariesDone = true;
|
|
|
- this->ComputeLinkImplementationLibraries(config, impl, this);
|
|
|
+ this->ComputeLinkImplementationLibraries(config, impl, this, implFor);
|
|
|
}
|
|
|
if (!impl.LanguagesDone) {
|
|
|
impl.LanguagesDone = true;
|
|
@@ -7716,6 +7726,21 @@ const cmLinkImplementation* cmGeneratorTarget::GetLinkImplementation(
|
|
|
return &impl;
|
|
|
}
|
|
|
|
|
|
+cmGeneratorTarget::HeadToLinkImplementationMap&
|
|
|
+cmGeneratorTarget::GetHeadToLinkImplementationMap(
|
|
|
+ std::string const& config) const
|
|
|
+{
|
|
|
+ return this->LinkImplMap[cmSystemTools::UpperCase(config)];
|
|
|
+}
|
|
|
+
|
|
|
+cmGeneratorTarget::HeadToLinkImplementationMap&
|
|
|
+cmGeneratorTarget::GetHeadToLinkImplementationUsageRequirementsMap(
|
|
|
+ std::string const& config) const
|
|
|
+{
|
|
|
+ return this
|
|
|
+ ->LinkImplUsageRequirementsOnlyMap[cmSystemTools::UpperCase(config)];
|
|
|
+}
|
|
|
+
|
|
|
bool cmGeneratorTarget::GetConfigCommonSourceFilesForXcode(
|
|
|
std::vector<cmSourceFile*>& files) const
|
|
|
{
|
|
@@ -7956,7 +7981,7 @@ bool cmGeneratorTarget::HaveBuildTreeRPATH(const std::string& config) const
|
|
|
return true;
|
|
|
}
|
|
|
if (cmLinkImplementationLibraries const* impl =
|
|
|
- this->GetLinkImplementationLibraries(config)) {
|
|
|
+ this->GetLinkImplementationLibraries(config, LinkInterfaceFor::Link)) {
|
|
|
return !impl->Libraries.empty();
|
|
|
}
|
|
|
return false;
|
|
@@ -7964,14 +7989,15 @@ bool cmGeneratorTarget::HaveBuildTreeRPATH(const std::string& config) const
|
|
|
|
|
|
cmLinkImplementationLibraries const*
|
|
|
cmGeneratorTarget::GetLinkImplementationLibraries(
|
|
|
- const std::string& config) const
|
|
|
+ const std::string& config, LinkInterfaceFor implFor) const
|
|
|
{
|
|
|
- return this->GetLinkImplementationLibrariesInternal(config, this);
|
|
|
+ return this->GetLinkImplementationLibrariesInternal(config, this, implFor);
|
|
|
}
|
|
|
|
|
|
cmLinkImplementationLibraries const*
|
|
|
cmGeneratorTarget::GetLinkImplementationLibrariesInternal(
|
|
|
- const std::string& config, cmGeneratorTarget const* head) const
|
|
|
+ const std::string& config, cmGeneratorTarget const* head,
|
|
|
+ LinkInterfaceFor implFor) const
|
|
|
{
|
|
|
// There is no link implementation for targets that cannot compile sources.
|
|
|
if (!this->CanCompileSources()) {
|
|
@@ -7980,7 +8006,9 @@ cmGeneratorTarget::GetLinkImplementationLibrariesInternal(
|
|
|
|
|
|
// Populate the link implementation libraries for this configuration.
|
|
|
HeadToLinkImplementationMap& hm =
|
|
|
- this->LinkImplMap[cmSystemTools::UpperCase(config)];
|
|
|
+ (implFor == LinkInterfaceFor::Usage
|
|
|
+ ? this->GetHeadToLinkImplementationUsageRequirementsMap(config)
|
|
|
+ : this->GetHeadToLinkImplementationMap(config));
|
|
|
|
|
|
// If the link implementation does not depend on the head target
|
|
|
// then re-use the one from the head we computed first.
|
|
@@ -7991,7 +8019,7 @@ cmGeneratorTarget::GetLinkImplementationLibrariesInternal(
|
|
|
cmOptionalLinkImplementation& impl = hm[head];
|
|
|
if (!impl.LibrariesDone) {
|
|
|
impl.LibrariesDone = true;
|
|
|
- this->ComputeLinkImplementationLibraries(config, impl, head);
|
|
|
+ this->ComputeLinkImplementationLibraries(config, impl, head, implFor);
|
|
|
}
|
|
|
return &impl;
|
|
|
}
|
|
@@ -8110,8 +8138,9 @@ void ComputeLinkImplTransitive(cmGeneratorTarget const* self,
|
|
|
|
|
|
void cmGeneratorTarget::ComputeLinkImplementationLibraries(
|
|
|
const std::string& config, cmOptionalLinkImplementation& impl,
|
|
|
- cmGeneratorTarget const* head) const
|
|
|
+ cmGeneratorTarget const* head, LinkInterfaceFor implFor) const
|
|
|
{
|
|
|
+ static_cast<void>(implFor);
|
|
|
cmLocalGenerator const* lg = this->LocalGenerator;
|
|
|
cmMakefile const* mf = lg->GetMakefile();
|
|
|
cmBTStringRange entryRange = this->Target->GetLinkImplementationEntries();
|