From e166bbef7bd8fa59c427911d96f41cd8a305af75 Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Mon, 24 Jul 2023 15:02:21 -0400 Subject: cmComputeLinkInformation: prepare Item consumers for `OBJECT` libraries After b665966933 (cmComputeLinkInformation: track `OBJECT` library dependencies, 2023-07-22), introduced in !8645 as a fix for #25112, `OBJECT` libraries were tracked in a separate member to reduce the risk of further regressions. This commit prepares consumers to handle `OBJECT` libraries once they start appearing as link items. --- Source/cmExportFileGenerator.cxx | 2 +- Source/cmGeneratorTarget.cxx | 2 +- Source/cmGlobalXCodeGenerator.cxx | 7 +++++++ Source/cmLinkLineComputer.cxx | 3 ++- Source/cmLinkLineDeviceComputer.cxx | 1 + Source/cmLocalVisualStudio7Generator.cxx | 3 ++- Source/cmVisualStudio10TargetGenerator.cxx | 3 ++- 7 files changed, 16 insertions(+), 5 deletions(-) diff --git a/Source/cmExportFileGenerator.cxx b/Source/cmExportFileGenerator.cxx index 481c98f..41234f4 100644 --- a/Source/cmExportFileGenerator.cxx +++ b/Source/cmExportFileGenerator.cxx @@ -536,7 +536,7 @@ static void getCompatibleInterfaceProperties( const cmComputeLinkInformation::ItemVector& deps = info->GetItems(); for (auto const& dep : deps) { - if (!dep.Target) { + if (!dep.Target || dep.Target->GetType() == cmStateEnums::OBJECT_LIBRARY) { continue; } getPropertyContents(dep.Target, "COMPATIBLE_INTERFACE_BOOL", diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx index 3be3697..8f1818d 100644 --- a/Source/cmGeneratorTarget.cxx +++ b/Source/cmGeneratorTarget.cxx @@ -5858,7 +5858,7 @@ void cmGeneratorTarget::CheckPropertyCompatibility( static const std::string strNumMax = "COMPATIBLE_INTERFACE_NUMBER_MAX"; for (auto const& dep : deps) { - if (!dep.Target) { + if (!dep.Target || dep.Target->GetType() == cmStateEnums::OBJECT_LIBRARY) { continue; } diff --git a/Source/cmGlobalXCodeGenerator.cxx b/Source/cmGlobalXCodeGenerator.cxx index da9d6ce..9834b64 100644 --- a/Source/cmGlobalXCodeGenerator.cxx +++ b/Source/cmGlobalXCodeGenerator.cxx @@ -3598,6 +3598,13 @@ void cmGlobalXCodeGenerator::AddDependAndLinkInformation(cmXCodeObject* target) continue; } for (auto const& libItem : cli->GetItems()) { + // Explicitly ignore OBJECT libraries as Xcode emulates them as static + // libraries without an artifact. Avoid exposing this to the rest of + // CMake's compilation model. + if (libItem.Target && + libItem.Target->GetType() == cmStateEnums::OBJECT_LIBRARY) { + continue; + } // We want to put only static libraries, dynamic libraries, frameworks // and bundles that are built from targets that are not imported in "Link // Binary With Libraries" build phase. Except if the target property diff --git a/Source/cmLinkLineComputer.cxx b/Source/cmLinkLineComputer.cxx index b7ee4fa..1f5005b 100644 --- a/Source/cmLinkLineComputer.cxx +++ b/Source/cmLinkLineComputer.cxx @@ -65,7 +65,8 @@ void cmLinkLineComputer::ComputeLinkLibs( ItemVector const& items = cli.GetItems(); for (auto const& item : items) { if (item.Target && - item.Target->GetType() == cmStateEnums::INTERFACE_LIBRARY) { + (item.Target->GetType() == cmStateEnums::INTERFACE_LIBRARY || + item.Target->GetType() == cmStateEnums::OBJECT_LIBRARY)) { continue; } diff --git a/Source/cmLinkLineDeviceComputer.cxx b/Source/cmLinkLineDeviceComputer.cxx index b06dc3d..ded6466 100644 --- a/Source/cmLinkLineDeviceComputer.cxx +++ b/Source/cmLinkLineDeviceComputer.cxx @@ -115,6 +115,7 @@ void cmLinkLineDeviceComputer::ComputeLinkLibraries( switch (item.Target->GetType()) { case cmStateEnums::SHARED_LIBRARY: case cmStateEnums::MODULE_LIBRARY: + case cmStateEnums::OBJECT_LIBRARY: case cmStateEnums::INTERFACE_LIBRARY: skip = true; break; diff --git a/Source/cmLocalVisualStudio7Generator.cxx b/Source/cmLocalVisualStudio7Generator.cxx index ef8a7e2..7b02c56 100644 --- a/Source/cmLocalVisualStudio7Generator.cxx +++ b/Source/cmLocalVisualStudio7Generator.cxx @@ -1318,7 +1318,8 @@ void cmLocalVisualStudio7GeneratorInternals::OutputLibraries( fout << (lib.HasFeature() ? lib.GetFormattedItem(rel).Value : rel) << " "; } else if (!lib.Target || - lib.Target->GetType() != cmStateEnums::INTERFACE_LIBRARY) { + (lib.Target->GetType() != cmStateEnums::INTERFACE_LIBRARY && + lib.Target->GetType() != cmStateEnums::OBJECT_LIBRARY)) { fout << lib.Value.Value << " "; } } diff --git a/Source/cmVisualStudio10TargetGenerator.cxx b/Source/cmVisualStudio10TargetGenerator.cxx index f930223..1559420 100644 --- a/Source/cmVisualStudio10TargetGenerator.cxx +++ b/Source/cmVisualStudio10TargetGenerator.cxx @@ -4603,7 +4603,8 @@ void cmVisualStudio10TargetGenerator::AddLibraries( : path); } } else if (!l.Target || - l.Target->GetType() != cmStateEnums::INTERFACE_LIBRARY) { + (l.Target->GetType() != cmStateEnums::INTERFACE_LIBRARY && + l.Target->GetType() != cmStateEnums::OBJECT_LIBRARY)) { libVec.push_back(l.Value.Value); } } -- cgit v0.12 From 2c7acd34e2c3d7c314de278469349d5587910173 Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Mon, 24 Jul 2023 15:12:16 -0400 Subject: cmComputeLinkInformation: add `OBJECT` libraries as link items This completes the transition started in commit b665966933 (cmComputeLinkInformation: track OBJECT library dependencies, 2023-07-22). --- Source/cmCommonTargetGenerator.cxx | 8 +------- Source/cmComputeLinkInformation.cxx | 13 +------------ Source/cmComputeLinkInformation.h | 3 --- 3 files changed, 2 insertions(+), 22 deletions(-) diff --git a/Source/cmCommonTargetGenerator.cxx b/Source/cmCommonTargetGenerator.cxx index e583daa..2d6ce98 100644 --- a/Source/cmCommonTargetGenerator.cxx +++ b/Source/cmCommonTargetGenerator.cxx @@ -173,13 +173,7 @@ std::vector cmCommonTargetGenerator::GetLinkedTargetDirectories( this->GeneratorTarget->GetLinkInformation(config)) { std::vector 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 const* linkee = item.Target; if (linkee && !linkee->IsImported() // Skip targets that build after this one in a static lib cycle. diff --git a/Source/cmComputeLinkInformation.cxx b/Source/cmComputeLinkInformation.cxx index be73fa3..ccd20a0 100644 --- a/Source/cmComputeLinkInformation.cxx +++ b/Source/cmComputeLinkInformation.cxx @@ -536,12 +536,6 @@ cmComputeLinkInformation::GetSharedLibrariesLinked() const return this->SharedLibrariesLinked; } -const std::vector& -cmComputeLinkInformation::GetObjectLibrariesLinked() const -{ - return this->ObjectLibrariesLinked; -} - bool cmComputeLinkInformation::Compute() { // Skip targets that do not link. @@ -1164,12 +1158,7 @@ void cmComputeLinkInformation::AddItem(LinkEntry const& entry) this->AddItem(BT(libName, item.Backtrace)); } } else if (tgt->GetType() == cmStateEnums::OBJECT_LIBRARY) { - if (!tgt->HaveCxx20ModuleSources() && !tgt->HaveFortranSources(config)) { - // Ignore object library! - // Its object-files should already have been extracted for linking. - } else { - this->ObjectLibrariesLinked.push_back(entry.Target); - } + this->Items.emplace_back(entry.Item, ItemIsPath::No, entry.Target); } else if (this->GlobalGenerator->IsXcode() && !tgt->GetImportedXcFrameworkPath(config).empty()) { this->Items.emplace_back( diff --git a/Source/cmComputeLinkInformation.h b/Source/cmComputeLinkInformation.h index e75423f..a988307 100644 --- a/Source/cmComputeLinkInformation.h +++ b/Source/cmComputeLinkInformation.h @@ -97,8 +97,6 @@ public: std::string GetRPathString(bool for_install) const; std::string GetChrpathString() const; std::set const& GetSharedLibrariesLinked() const; - std::vector const& GetObjectLibrariesLinked() - const; std::vector const& GetRuntimeDLLs() const { return this->RuntimeDLLs; @@ -136,7 +134,6 @@ private: std::vector XcFrameworkHeaderPaths; std::vector RuntimeSearchPath; std::set SharedLibrariesLinked; - std::vector ObjectLibrariesLinked; std::vector RuntimeDLLs; // Context information. -- cgit v0.12