From 861876b9369226c6491bd1c1ad4f6ec98a967d0b Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Fri, 27 Oct 2023 13:25:17 -0400 Subject: Tests/ObjectLibrary: fix comment --- Tests/ObjectLibrary/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/ObjectLibrary/CMakeLists.txt b/Tests/ObjectLibrary/CMakeLists.txt index 05a35bb..b57761b 100644 --- a/Tests/ObjectLibrary/CMakeLists.txt +++ b/Tests/ObjectLibrary/CMakeLists.txt @@ -68,7 +68,7 @@ add_library(UseCstaticObjs STATIC $ $ # Test a shared library with sources from a different shared library add_library(UseCsharedObjs SHARED $ $ $) -# Test a shared executable with sources from a different shared library +# Test a shared executable with sources from a different executable add_executable(UseABstaticObjs $) target_link_libraries(UseABstaticObjs ABstatic) -- cgit v0.12 From 035302b7e3143537eaa9668738f4b6759f1e27ad Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Fri, 27 Oct 2023 12:45:41 -0400 Subject: cmComputeLinkDepends: also copy the target from object link items --- Source/cmComputeLinkDepends.cxx | 1 + 1 file changed, 1 insertion(+) diff --git a/Source/cmComputeLinkDepends.cxx b/Source/cmComputeLinkDepends.cxx index f51a1c8..ce0df6b 100644 --- a/Source/cmComputeLinkDepends.cxx +++ b/Source/cmComputeLinkDepends.cxx @@ -512,6 +512,7 @@ void cmComputeLinkDepends::AddLinkObject(cmLinkItem const& item) LinkEntry& entry = this->EntryList[index]; entry.Item = BT(item.AsStr(), item.Backtrace); entry.Kind = LinkEntry::Object; + entry.Target = item.Target; // Record explicitly linked object files separately. this->ObjectEntries.emplace_back(index); -- cgit v0.12 From 64d9240564c778674e6d4b2a34de88f2cff14a96 Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Fri, 27 Oct 2023 13:24:42 -0400 Subject: cmComputeLinkInformation: skip over linking to items for object purposes If a name is only found because it is a link entry of kind `Object`, do not add anything to the link line. --- Source/cmComputeLinkInformation.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/cmComputeLinkInformation.cxx b/Source/cmComputeLinkInformation.cxx index 7d3675e..f06e96f 100644 --- a/Source/cmComputeLinkInformation.cxx +++ b/Source/cmComputeLinkInformation.cxx @@ -1220,7 +1220,7 @@ void cmComputeLinkInformation::AddItem(LinkEntry const& entry) this->AddFullItem(entry); this->AddLibraryRuntimeInfo(item.Value); } - } else { + } else if (entry.Kind != cmComputeLinkDepends::LinkEntry::Object) { // This is a library or option specified by the user. this->AddUserItem(entry, true); } -- cgit v0.12 From 22da18b9953f1ec9dff039572b5e8903009e4afb Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Fri, 27 Oct 2023 12:46:04 -0400 Subject: Fortran: Restore support for TARGET_OBJECTS providing modules Continue b665966933 (cmComputeLinkInformation: track OBJECT library dependencies, 2023-07-22) which added explicitly listed `OBJECT` libraries to the list of targets which the collator needs to consider. Now also consider targets which provide objects directly to the target via a `$` source lists. Also add tests which use target objects directly and through an `INTERFACE` library with target objects in its own sources. Fixes: #25365 --- Source/cmComputeLinkDepends.cxx | 19 +++++++++++++++++++ Source/cmComputeLinkDepends.h | 1 + Tests/FortranModules/CMakeLists.txt | 3 +++ .../Issue25365-target-objects-iface/CMakeLists.txt | 11 +++++++++++ .../Issue25365-target-objects-iface/iface.f90 | 11 +++++++++++ .../Issue25365-target-objects-iface/lib.f90 | 13 +++++++++++++ .../Issue25365-target-objects/CMakeLists.txt | 5 +++++ .../Issue25365-target-objects/iface.f90 | 11 +++++++++++ .../FortranModules/Issue25365-target-objects/lib.f90 | 13 +++++++++++++ 9 files changed, 87 insertions(+) create mode 100644 Tests/FortranModules/Issue25365-target-objects-iface/CMakeLists.txt create mode 100644 Tests/FortranModules/Issue25365-target-objects-iface/iface.f90 create mode 100644 Tests/FortranModules/Issue25365-target-objects-iface/lib.f90 create mode 100644 Tests/FortranModules/Issue25365-target-objects/CMakeLists.txt create mode 100644 Tests/FortranModules/Issue25365-target-objects/iface.f90 create mode 100644 Tests/FortranModules/Issue25365-target-objects/lib.f90 diff --git a/Source/cmComputeLinkDepends.cxx b/Source/cmComputeLinkDepends.cxx index ce0df6b..4100135 100644 --- a/Source/cmComputeLinkDepends.cxx +++ b/Source/cmComputeLinkDepends.cxx @@ -26,6 +26,7 @@ #include "cmMakefile.h" #include "cmMessageType.h" #include "cmRange.h" +#include "cmSourceFile.h" #include "cmStateTypes.h" #include "cmStringAlgorithms.h" #include "cmTarget.h" @@ -319,6 +320,9 @@ cmComputeLinkDepends::Compute() // Follow the link dependencies of the target to be linked. this->AddDirectLinkEntries(); + // Add dependencies on targets named by $ sources. + this->AddTargetObjectEntries(); + // Complete the breadth-first search of dependencies. while (!this->BFSQueue.empty()) { // Get the next entry. @@ -701,6 +705,21 @@ void cmComputeLinkDepends::AddDirectLinkEntries() } } +void cmComputeLinkDepends::AddTargetObjectEntries() +{ + std::vector 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(objLib)); + this->AddLinkObject(objItem); + } +} + template void cmComputeLinkDepends::AddLinkEntries(size_t depender_index, std::vector const& libs) diff --git a/Source/cmComputeLinkDepends.h b/Source/cmComputeLinkDepends.h index 22c4e2a..63c289c 100644 --- a/Source/cmComputeLinkDepends.h +++ b/Source/cmComputeLinkDepends.h @@ -100,6 +100,7 @@ private: void AddLinkObject(cmLinkItem const& item); void AddVarLinkEntries(size_t depender_index, const char* value); void AddDirectLinkEntries(); + void AddTargetObjectEntries(); template void AddLinkEntries(size_t depender_index, std::vector const& libs); void AddLinkObjects(std::vector const& objs); diff --git a/Tests/FortranModules/CMakeLists.txt b/Tests/FortranModules/CMakeLists.txt index 00f3e57..16ea0d4 100644 --- a/Tests/FortranModules/CMakeLists.txt +++ b/Tests/FortranModules/CMakeLists.txt @@ -134,3 +134,6 @@ if( # Intel Fortran VS Integration breaks on custom targets with Fortran sources add_subdirectory(Issue25252-iface-target) endif() add_subdirectory(Issue25252-iface-sources) + +add_subdirectory(Issue25365-target-objects) +add_subdirectory(Issue25365-target-objects-iface) diff --git a/Tests/FortranModules/Issue25365-target-objects-iface/CMakeLists.txt b/Tests/FortranModules/Issue25365-target-objects-iface/CMakeLists.txt new file mode 100644 index 0000000..819ac05 --- /dev/null +++ b/Tests/FortranModules/Issue25365-target-objects-iface/CMakeLists.txt @@ -0,0 +1,11 @@ +enable_language(C) + +add_library(fortran_target_objects_sources_iface STATIC "${CMAKE_CURRENT_SOURCE_DIR}/iface.f90") + +add_library(fortran_target_objects_sources_iface_bridge INTERFACE) +target_sources(fortran_target_objects_sources_iface_bridge + INTERFACE + "$") + +add_library(lib25365-target-objects-iface lib.f90) +target_link_libraries(lib25365-target-objects-iface PRIVATE fortran_target_objects_sources_iface_bridge) diff --git a/Tests/FortranModules/Issue25365-target-objects-iface/iface.f90 b/Tests/FortranModules/Issue25365-target-objects-iface/iface.f90 new file mode 100644 index 0000000..6b5ddd5 --- /dev/null +++ b/Tests/FortranModules/Issue25365-target-objects-iface/iface.f90 @@ -0,0 +1,11 @@ +module m1 + +implicit none + +contains + +pure real function pi() +pi = 4*atan(1.) +end function + +end module m1 diff --git a/Tests/FortranModules/Issue25365-target-objects-iface/lib.f90 b/Tests/FortranModules/Issue25365-target-objects-iface/lib.f90 new file mode 100644 index 0000000..f971909 --- /dev/null +++ b/Tests/FortranModules/Issue25365-target-objects-iface/lib.f90 @@ -0,0 +1,13 @@ +module lib + +use m1, only : pi + +implicit none + +contains + +pure real function func() +func = pi() +end function + +end module diff --git a/Tests/FortranModules/Issue25365-target-objects/CMakeLists.txt b/Tests/FortranModules/Issue25365-target-objects/CMakeLists.txt new file mode 100644 index 0000000..64e36cb --- /dev/null +++ b/Tests/FortranModules/Issue25365-target-objects/CMakeLists.txt @@ -0,0 +1,5 @@ +enable_language(C) + +add_library(fortran_target_objects_sources STATIC "${CMAKE_CURRENT_SOURCE_DIR}/iface.f90") + +add_library(lib25365-target-objects lib.f90 "$") diff --git a/Tests/FortranModules/Issue25365-target-objects/iface.f90 b/Tests/FortranModules/Issue25365-target-objects/iface.f90 new file mode 100644 index 0000000..6b5ddd5 --- /dev/null +++ b/Tests/FortranModules/Issue25365-target-objects/iface.f90 @@ -0,0 +1,11 @@ +module m1 + +implicit none + +contains + +pure real function pi() +pi = 4*atan(1.) +end function + +end module m1 diff --git a/Tests/FortranModules/Issue25365-target-objects/lib.f90 b/Tests/FortranModules/Issue25365-target-objects/lib.f90 new file mode 100644 index 0000000..f971909 --- /dev/null +++ b/Tests/FortranModules/Issue25365-target-objects/lib.f90 @@ -0,0 +1,13 @@ +module lib + +use m1, only : pi + +implicit none + +contains + +pure real function func() +func = pi() +end function + +end module -- cgit v0.12