summaryrefslogtreecommitdiffstats
path: root/Source
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2023-11-14 17:45:06 (GMT)
committerBrad King <brad.king@kitware.com>2023-11-14 19:50:08 (GMT)
commit50fdaf8f1f6e34d9362b679df0a26d6bbf77c0ba (patch)
treed6a62f015df772ea882e77cffdcc4f6f37f8efc8 /Source
parent0e26bd334db07e481e5585f5121fb7e9718e9c47 (diff)
downloadCMake-50fdaf8f1f6e34d9362b679df0a26d6bbf77c0ba.zip
CMake-50fdaf8f1f6e34d9362b679df0a26d6bbf77c0ba.tar.gz
CMake-50fdaf8f1f6e34d9362b679df0a26d6bbf77c0ba.tar.bz2
cmComputeLinkInformation: Track targets named by TARGET_OBJECTS sources
Since commit b6a5382217 (Ninja: depend on language module information files directly, 2023-02-10, v3.27.0-rc1~502^2), the return value of `cmCommonTargetGenerator::GetLinkedTargetDirectories` must account for linked object libraries because they may provide modules (#25112). These were added by commit b665966933 (cmComputeLinkInformation: track OBJECT library dependencies, 2023-07-22, v3.27.1~5^2). However, targets named by `$<TARGET_OBJECTS:...>` sources are also needed (#25365). The latter were added by commit 22da18b995 (Fortran: Restore support for TARGET_OBJECTS providing modules, 2023-10-27, v3.28.0-rc4~9^2) and commit 035302b7e3 (cmComputeLinkDepends: also copy the target from object link items, 2023-10-27, v3.28.0-rc4~9^2~2). However, their approach added link entries not actually specified by projects. It also incorrectly re-used `cmComputeLinkDepends::AddLinkObject` for object library targets when it is meant for their individual object files. These problems caused additional regressions (#25417). Revert the implementation parts of those commits and leave behind an assertion and comment to help avoid the mistake in the future. Instead, track targets named by `$<TARGET_OBJECTS:...>` sources with a dedicated member. Issue: #25112 Issue: #25365 Fixes: #25417 Co-authored-by: Ben Boeckel <ben.boeckel@kitware.com>
Diffstat (limited to 'Source')
-rw-r--r--Source/cmCommonTargetGenerator.cxx3
-rw-r--r--Source/cmComputeLinkDepends.cxx22
-rw-r--r--Source/cmComputeLinkDepends.h1
-rw-r--r--Source/cmComputeLinkInformation.cxx31
-rw-r--r--Source/cmComputeLinkInformation.h5
5 files changed, 41 insertions, 21 deletions
diff --git a/Source/cmCommonTargetGenerator.cxx b/Source/cmCommonTargetGenerator.cxx
index e9233b6..a5536d0 100644
--- a/Source/cmCommonTargetGenerator.cxx
+++ b/Source/cmCommonTargetGenerator.cxx
@@ -200,6 +200,9 @@ std::vector<std::string> cmCommonTargetGenerator::GetLinkedTargetDirectories(
for (cmGeneratorTarget const* target : cli->GetObjectLibrariesLinked()) {
addLinkedTarget(target);
}
+ for (cmGeneratorTarget const* target : cli->GetExternalObjectTargets()) {
+ addLinkedTarget(target);
+ }
}
return dirs;
}
diff --git a/Source/cmComputeLinkDepends.cxx b/Source/cmComputeLinkDepends.cxx
index 4100135..f80c5fb 100644
--- a/Source/cmComputeLinkDepends.cxx
+++ b/Source/cmComputeLinkDepends.cxx
@@ -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"
@@ -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.
@@ -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);
@@ -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);
@@ -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)
diff --git a/Source/cmComputeLinkDepends.h b/Source/cmComputeLinkDepends.h
index 63c289c..22c4e2a 100644
--- a/Source/cmComputeLinkDepends.h
+++ b/Source/cmComputeLinkDepends.h
@@ -100,7 +100,6 @@ 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/Source/cmComputeLinkInformation.cxx b/Source/cmComputeLinkInformation.cxx
index f06e96f..9046f92 100644
--- a/Source/cmComputeLinkInformation.cxx
+++ b/Source/cmComputeLinkInformation.cxx
@@ -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"
@@ -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"
@@ -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
@@ -678,6 +686,9 @@ bool cmComputeLinkInformation::Compute()
this->Target->GetBacktrace());
}
+ // Record targets referenced by $<TARGET_OBJECTS:...> sources.
+ this->AddExternalObjectTargets();
+
return true;
}
@@ -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.
diff --git a/Source/cmComputeLinkInformation.h b/Source/cmComputeLinkInformation.h
index 8393a29..1052b96 100644
--- a/Source/cmComputeLinkInformation.h
+++ b/Source/cmComputeLinkInformation.h
@@ -98,6 +98,8 @@ public:
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;
@@ -135,6 +137,7 @@ private:
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.
@@ -219,6 +222,8 @@ private:
bool FinishLinkerSearchDirectories();
void PrintLinkPolicyDiagnosis(std::ostream&);
+ void AddExternalObjectTargets();
+
// Implicit link libraries and directories for linker language.
void LoadImplicitLinkInfo();
void AddImplicitLinkInfo();