Skip to content

Commit

Permalink
Merge branch 'backport-target-objects' into release-3.27
Browse files Browse the repository at this point in the history
Merge-request: !8974
  • Loading branch information
bradking committed Nov 15, 2023
2 parents 8e90b95 + 50fdaf8 commit bc9ca03
Show file tree
Hide file tree
Showing 10 changed files with 82 additions and 30 deletions.
20 changes: 11 additions & 9 deletions Source/cmCommonTargetGenerator.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -170,15 +170,8 @@ std::vector<std::string> cmCommonTargetGenerator::GetLinkedTargetDirectories(
cmGlobalCommonGenerator* const gg = this->GlobalCommonGenerator;
if (cmComputeLinkInformation* cli =
this->GeneratorTarget->GetLinkInformation(config)) {
std::vector<cmGeneratorTarget const*> targets;
for (auto const& item : cli->GetItems()) {
targets.push_back(item.Target);
}
for (auto const* target : cli->GetObjectLibrariesLinked()) {
targets.push_back(target);
}

for (auto const* linkee : targets) {
auto addLinkedTarget = [this, &lang, &config, &dirs, &emitted,
gg](cmGeneratorTarget const* linkee) {
if (linkee &&
!linkee->IsImported()
// Skip targets that build after this one in a static lib cycle.
Expand All @@ -200,6 +193,15 @@ std::vector<std::string> cmCommonTargetGenerator::GetLinkedTargetDirectories(
}
dirs.push_back(std::move(di));
}
};
for (auto const& item : cli->GetItems()) {
addLinkedTarget(item.Target);
}
for (cmGeneratorTarget const* target : cli->GetObjectLibrariesLinked()) {
addLinkedTarget(target);
}
for (cmGeneratorTarget const* target : cli->GetExternalObjectTargets()) {
addLinkedTarget(target);
}
}
return dirs;
Expand Down
22 changes: 2 additions & 20 deletions Source/cmComputeLinkDepends.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@
#include "cmMakefile.h"
#include "cmMessageType.h"
#include "cmRange.h"
#include "cmSourceFile.h"
#include "cmStateTypes.h"
#include "cmStringAlgorithms.h"
#include "cmTarget.h"
Expand Down Expand Up @@ -320,9 +319,6 @@ cmComputeLinkDepends::Compute()
// Follow the link dependencies of the target to be linked.
this->AddDirectLinkEntries();

// Add dependencies on targets named by $<TARGET_OBJECTS:...> sources.
this->AddTargetObjectEntries();

// Complete the breadth-first search of dependencies.
while (!this->BFSQueue.empty()) {
// Get the next entry.
Expand Down Expand Up @@ -503,6 +499,8 @@ std::pair<size_t, bool> cmComputeLinkDepends::AddLinkEntry(

void cmComputeLinkDepends::AddLinkObject(cmLinkItem const& item)
{
assert(!item.Target); // The item is an object file, not its target.

// Allocate a spot for the item entry.
auto lei = this->AllocateLinkEntry(item);

Expand All @@ -516,7 +514,6 @@ void cmComputeLinkDepends::AddLinkObject(cmLinkItem const& item)
LinkEntry& entry = this->EntryList[index];
entry.Item = BT<std::string>(item.AsStr(), item.Backtrace);
entry.Kind = LinkEntry::Object;
entry.Target = item.Target;

// Record explicitly linked object files separately.
this->ObjectEntries.emplace_back(index);
Expand Down Expand Up @@ -705,21 +702,6 @@ void cmComputeLinkDepends::AddDirectLinkEntries()
}
}

void cmComputeLinkDepends::AddTargetObjectEntries()
{
std::vector<cmSourceFile const*> externalObjects;
this->Target->GetExternalObjects(externalObjects, this->Config);
for (auto const* externalObject : externalObjects) {
std::string const& objLib = externalObject->GetObjectLibrary();
if (objLib.empty()) {
continue;
}
cmLinkItem const& objItem =
this->Target->ResolveLinkItem(BT<std::string>(objLib));
this->AddLinkObject(objItem);
}
}

template <typename T>
void cmComputeLinkDepends::AddLinkEntries(size_t depender_index,
std::vector<T> const& libs)
Expand Down
1 change: 0 additions & 1 deletion Source/cmComputeLinkDepends.h
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,6 @@ class cmComputeLinkDepends
void AddLinkObject(cmLinkItem const& item);
void AddVarLinkEntries(size_t depender_index, const char* value);
void AddDirectLinkEntries();
void AddTargetObjectEntries();
template <typename T>
void AddLinkEntries(size_t depender_index, std::vector<T> const& libs);
void AddLinkObjects(std::vector<cmLinkItem> const& objs);
Expand Down
31 changes: 31 additions & 0 deletions Source/cmComputeLinkInformation.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
#include "cmComputeLinkDepends.h"
#include "cmGeneratorTarget.h"
#include "cmGlobalGenerator.h"
#include "cmLinkItem.h"
#include "cmList.h"
#include "cmListFileCache.h"
#include "cmLocalGenerator.h"
Expand All @@ -23,6 +24,7 @@
#include "cmOrderDirectories.h"
#include "cmPlaceholderExpander.h"
#include "cmPolicies.h"
#include "cmSourceFile.h"
#include "cmState.h"
#include "cmStateTypes.h"
#include "cmStringAlgorithms.h"
Expand Down Expand Up @@ -531,6 +533,12 @@ cmComputeLinkInformation::GetObjectLibrariesLinked() const
return this->ObjectLibrariesLinked;
}

const std::vector<const cmGeneratorTarget*>&
cmComputeLinkInformation::GetExternalObjectTargets() const
{
return this->ExternalObjectTargets;
}

bool cmComputeLinkInformation::Compute()
{
// Skip targets that do not link or have link-like information consumers may
Expand Down Expand Up @@ -678,6 +686,9 @@ bool cmComputeLinkInformation::Compute()
this->Target->GetBacktrace());
}

// Record targets referenced by $<TARGET_OBJECTS:...> sources.
this->AddExternalObjectTargets();

return true;
}

Expand Down Expand Up @@ -1052,6 +1063,26 @@ cmComputeLinkInformation::GetGroupFeature(std::string const& feature)
.first->second;
}

void cmComputeLinkInformation::AddExternalObjectTargets()
{
std::vector<cmSourceFile const*> externalObjects;
this->Target->GetExternalObjects(externalObjects, this->Config);
std::set<std::string> emitted;
for (auto const* externalObject : externalObjects) {
std::string const& objLib = externalObject->GetObjectLibrary();
if (objLib.empty()) {
continue;
}
if (emitted.insert(objLib).second) {
cmLinkItem const& objItem =
this->Target->ResolveLinkItem(BT<std::string>(objLib));
if (objItem.Target) {
this->ExternalObjectTargets.emplace_back(objItem.Target);
}
}
}
}

void cmComputeLinkInformation::AddImplicitLinkInfo()
{
// The link closure lists all languages whose implicit info is needed.
Expand Down
5 changes: 5 additions & 0 deletions Source/cmComputeLinkInformation.h
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,8 @@ class cmComputeLinkInformation
std::set<cmGeneratorTarget const*> const& GetSharedLibrariesLinked() const;
std::vector<cmGeneratorTarget const*> const& GetObjectLibrariesLinked()
const;
std::vector<cmGeneratorTarget const*> const& GetExternalObjectTargets()
const;
std::vector<cmGeneratorTarget const*> const& GetRuntimeDLLs() const
{
return this->RuntimeDLLs;
Expand Down Expand Up @@ -135,6 +137,7 @@ class cmComputeLinkInformation
std::vector<std::string> RuntimeSearchPath;
std::set<cmGeneratorTarget const*> SharedLibrariesLinked;
std::vector<cmGeneratorTarget const*> ObjectLibrariesLinked;
std::vector<cmGeneratorTarget const*> ExternalObjectTargets;
std::vector<cmGeneratorTarget const*> RuntimeDLLs;

// Context information.
Expand Down Expand Up @@ -219,6 +222,8 @@ class cmComputeLinkInformation
bool FinishLinkerSearchDirectories();
void PrintLinkPolicyDiagnosis(std::ostream&);

void AddExternalObjectTargets();

// Implicit link libraries and directories for linker language.
void LoadImplicitLinkInfo();
void AddImplicitLinkInfo();
Expand Down
2 changes: 2 additions & 0 deletions Tests/ObjectLibrary/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -77,3 +77,5 @@ add_subdirectory(ExportLanguages)
add_subdirectory(LinkObjects)

add_subdirectory(Transitive)

add_subdirectory(TransitiveLinkDeps)
15 changes: 15 additions & 0 deletions Tests/ObjectLibrary/TransitiveLinkDeps/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
add_library(implgather INTERFACE)

add_library(dep STATIC dep.c)

add_library(deps INTERFACE)
target_link_libraries(deps INTERFACE dep)

add_library(impl_obj OBJECT impl_obj.c)
target_link_libraries(impl_obj PUBLIC deps)

target_sources(implgather INTERFACE "$<TARGET_OBJECTS:impl_obj>")
target_link_libraries(implgather INTERFACE impl_obj)

add_executable(useimpl main.c)
target_link_libraries(useimpl PRIVATE implgather)
4 changes: 4 additions & 0 deletions Tests/ObjectLibrary/TransitiveLinkDeps/dep.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
int from_dep(void)
{
return 0;
}
6 changes: 6 additions & 0 deletions Tests/ObjectLibrary/TransitiveLinkDeps/impl_obj.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
int from_dep(void);

int impl_obj(void)
{
return from_dep();
}
6 changes: 6 additions & 0 deletions Tests/ObjectLibrary/TransitiveLinkDeps/main.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
int impl_obj(void);

int main(int argc, char* argv[])
{
return impl_obj();
}

0 comments on commit bc9ca03

Please sign in to comment.