summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBen Boeckel <ben.boeckel@kitware.com>2023-10-27 16:46:04 (GMT)
committerBen Boeckel <ben.boeckel@kitware.com>2023-10-30 14:06:12 (GMT)
commit22da18b9953f1ec9dff039572b5e8903009e4afb (patch)
treef63d2a5cc7272d8fc6cba5db15c2069f31b6faf2
parent64d9240564c778674e6d4b2a34de88f2cff14a96 (diff)
downloadCMake-22da18b9953f1ec9dff039572b5e8903009e4afb.zip
CMake-22da18b9953f1ec9dff039572b5e8903009e4afb.tar.gz
CMake-22da18b9953f1ec9dff039572b5e8903009e4afb.tar.bz2
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 `$<TARGET_OBJECT>` source lists. Also add tests which use target objects directly and through an `INTERFACE` library with target objects in its own sources. Fixes: #25365
-rw-r--r--Source/cmComputeLinkDepends.cxx19
-rw-r--r--Source/cmComputeLinkDepends.h1
-rw-r--r--Tests/FortranModules/CMakeLists.txt3
-rw-r--r--Tests/FortranModules/Issue25365-target-objects-iface/CMakeLists.txt11
-rw-r--r--Tests/FortranModules/Issue25365-target-objects-iface/iface.f9011
-rw-r--r--Tests/FortranModules/Issue25365-target-objects-iface/lib.f9013
-rw-r--r--Tests/FortranModules/Issue25365-target-objects/CMakeLists.txt5
-rw-r--r--Tests/FortranModules/Issue25365-target-objects/iface.f9011
-rw-r--r--Tests/FortranModules/Issue25365-target-objects/lib.f9013
9 files changed, 87 insertions, 0 deletions
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 $<TARGET_OBJECTS:...> 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<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)
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 <typename T>
void AddLinkEntries(size_t depender_index, std::vector<T> const& libs);
void AddLinkObjects(std::vector<cmLinkItem> 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
+ "$<TARGET_OBJECTS:fortran_target_objects_sources_iface>")
+
+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 "$<TARGET_OBJECTS:fortran_target_objects_sources>")
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