|
|
@@ -6275,8 +6275,8 @@ cm::optional<cmLinkItem> cmGeneratorTarget::LookupLinkItem(
|
|
|
void cmGeneratorTarget::ExpandLinkItems(
|
|
|
std::string const& prop, std::string const& value, std::string const& config,
|
|
|
cmGeneratorTarget const* headTarget, bool usage_requirements_only,
|
|
|
- std::vector<cmLinkItem>& items, bool& hadHeadSensitiveCondition,
|
|
|
- bool& hadContextSensitiveCondition,
|
|
|
+ std::vector<cmLinkItem>& items, std::vector<cmLinkItem>& objects,
|
|
|
+ bool& hadHeadSensitiveCondition, bool& hadContextSensitiveCondition,
|
|
|
bool& hadLinkLanguageSensitiveCondition) const
|
|
|
{
|
|
|
// Keep this logic in sync with ComputeLinkImplementationLibraries.
|
|
|
@@ -6294,9 +6294,22 @@ void cmGeneratorTarget::ExpandLinkItems(
|
|
|
cmExpandList(cge->Evaluate(this->LocalGenerator, config, headTarget,
|
|
|
&dagChecker, this, headTarget->LinkerLanguage),
|
|
|
libs);
|
|
|
+ cmMakefile const* mf = this->LocalGenerator->GetMakefile();
|
|
|
for (std::string const& lib : libs) {
|
|
|
if (cm::optional<cmLinkItem> maybeItem =
|
|
|
this->LookupLinkItem(lib, cge->GetBacktrace())) {
|
|
|
+ if (!maybeItem->Target) {
|
|
|
+ // Report explicitly linked object files separately.
|
|
|
+ std::string const& maybeObj = maybeItem->AsStr();
|
|
|
+ if (cmSystemTools::FileIsFullPath(maybeObj)) {
|
|
|
+ cmSourceFile const* sf =
|
|
|
+ mf->GetSource(maybeObj, cmSourceFileLocationKind::Known);
|
|
|
+ if (sf && sf->GetPropertyAsBool("EXTERNAL_OBJECT")) {
|
|
|
+ objects.emplace_back(std::move(*maybeItem));
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
items.emplace_back(std::move(*maybeItem));
|
|
|
}
|
|
|
}
|
|
|
@@ -6804,7 +6817,7 @@ void cmGeneratorTarget::ComputeLinkInterfaceLibraries(
|
|
|
// The interface libraries have been explicitly set.
|
|
|
this->ExpandLinkItems(linkIfaceProp, *explicitLibraries, config,
|
|
|
headTarget, usage_requirements_only, iface.Libraries,
|
|
|
- iface.HadHeadSensitiveCondition,
|
|
|
+ iface.Objects, iface.HadHeadSensitiveCondition,
|
|
|
iface.HadContextSensitiveCondition,
|
|
|
iface.HadLinkLanguageSensitiveCondition);
|
|
|
return;
|
|
|
@@ -6828,6 +6841,7 @@ void cmGeneratorTarget::ComputeLinkInterfaceLibraries(
|
|
|
// Compare the link implementation fallback link interface to the
|
|
|
// preferred new link interface property and warn if different.
|
|
|
std::vector<cmLinkItem> ifaceLibs;
|
|
|
+ std::vector<cmLinkItem> ifaceObjects;
|
|
|
static const std::string newProp = "INTERFACE_LINK_LIBRARIES";
|
|
|
if (cmProp newExplicitLibraries = this->GetProperty(newProp)) {
|
|
|
bool hadHeadSensitiveConditionDummy = false;
|
|
|
@@ -6835,7 +6849,7 @@ void cmGeneratorTarget::ComputeLinkInterfaceLibraries(
|
|
|
bool hadLinkLanguageSensitiveConditionDummy = false;
|
|
|
this->ExpandLinkItems(newProp, *newExplicitLibraries, config,
|
|
|
headTarget, usage_requirements_only, ifaceLibs,
|
|
|
- hadHeadSensitiveConditionDummy,
|
|
|
+ ifaceObjects, hadHeadSensitiveConditionDummy,
|
|
|
hadContextSensitiveConditionDummy,
|
|
|
hadLinkLanguageSensitiveConditionDummy);
|
|
|
}
|
|
|
@@ -6903,7 +6917,7 @@ const cmLinkInterface* cmGeneratorTarget::GetImportLinkInterface(
|
|
|
cmExpandList(info->Languages, iface.Languages);
|
|
|
this->ExpandLinkItems(info->LibrariesProp, info->Libraries, config,
|
|
|
headTarget, usage_requirements_only, iface.Libraries,
|
|
|
- iface.HadHeadSensitiveCondition,
|
|
|
+ iface.Objects, iface.HadHeadSensitiveCondition,
|
|
|
iface.HadContextSensitiveCondition,
|
|
|
iface.HadLinkLanguageSensitiveCondition);
|
|
|
std::vector<std::string> deps = cmExpandedList(info->SharedDeps);
|
|
|
@@ -7425,6 +7439,7 @@ void cmGeneratorTarget::ComputeLinkImplementationLibraries(
|
|
|
cmGeneratorTarget const* head) const
|
|
|
{
|
|
|
cmLocalGenerator const* lg = this->LocalGenerator;
|
|
|
+ cmMakefile const* mf = lg->GetMakefile();
|
|
|
cmStringRange entryRange = this->Target->GetLinkImplementationEntries();
|
|
|
cmBacktraceRange btRange = this->Target->GetLinkImplementationBacktraces();
|
|
|
cmBacktraceRange::const_iterator btIt = btRange.begin();
|
|
|
@@ -7500,6 +7515,19 @@ void cmGeneratorTarget::ComputeLinkImplementationLibraries(
|
|
|
|
|
|
// The entry is meant for this configuration.
|
|
|
cmLinkItem item = this->ResolveLinkItem(name, *btIt, lg);
|
|
|
+ if (!item.Target) {
|
|
|
+ // Report explicitly linked object files separately.
|
|
|
+ std::string const& maybeObj = item.AsStr();
|
|
|
+ if (cmSystemTools::FileIsFullPath(maybeObj)) {
|
|
|
+ cmSourceFile const* sf =
|
|
|
+ mf->GetSource(maybeObj, cmSourceFileLocationKind::Known);
|
|
|
+ if (sf && sf->GetPropertyAsBool("EXTERNAL_OBJECT")) {
|
|
|
+ impl.Objects.emplace_back(std::move(item));
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
impl.Libraries.emplace_back(std::move(item), evaluated != *le);
|
|
|
}
|
|
|
|