diff options
author | Brad King <brad.king@kitware.com> | 2022-03-22 15:56:32 (GMT) |
---|---|---|
committer | Kitware Robot <kwrobot@kitware.com> | 2022-03-22 15:56:43 (GMT) |
commit | 2aad4cef979bd5174f067424a117fac765e3da34 (patch) | |
tree | 10ef6e88800579c6f6978c92b2f59af7f0bd025d | |
parent | 25c31f19559732056fe11d472ad85ef4840eefc8 (diff) | |
parent | 687a91967f4cb02943421802e7929a6582cec63a (diff) | |
download | CMake-2aad4cef979bd5174f067424a117fac765e3da34.zip CMake-2aad4cef979bd5174f067424a117fac765e3da34.tar.gz CMake-2aad4cef979bd5174f067424a117fac765e3da34.tar.bz2 |
Merge topic 'revert-link-interface-direct-for-3.23' into release-3.23
687a91967f Revert INTERFACE_LINK_LIBRARIES_DIRECT feature for 3.23 branch
Acked-by: Kitware Robot <kwrobot@kitware.com>
Merge-request: !7098
78 files changed, 27 insertions, 1320 deletions
diff --git a/Help/manual/cmake-properties.7.rst b/Help/manual/cmake-properties.7.rst index f4efd3c..ddb917a 100644 --- a/Help/manual/cmake-properties.7.rst +++ b/Help/manual/cmake-properties.7.rst @@ -266,8 +266,6 @@ Properties on Targets /prop_tgt/INTERFACE_LINK_DEPENDS /prop_tgt/INTERFACE_LINK_DIRECTORIES /prop_tgt/INTERFACE_LINK_LIBRARIES - /prop_tgt/INTERFACE_LINK_LIBRARIES_DIRECT - /prop_tgt/INTERFACE_LINK_LIBRARIES_DIRECT_EXCLUDE /prop_tgt/INTERFACE_LINK_OPTIONS /prop_tgt/INTERFACE_POSITION_INDEPENDENT_CODE /prop_tgt/INTERFACE_PRECOMPILE_HEADERS diff --git a/Help/prop_tgt/INTERFACE_LINK_LIBRARIES.rst b/Help/prop_tgt/INTERFACE_LINK_LIBRARIES.rst index 53f5838..af3d9c2 100644 --- a/Help/prop_tgt/INTERFACE_LINK_LIBRARIES.rst +++ b/Help/prop_tgt/INTERFACE_LINK_LIBRARIES.rst @@ -26,12 +26,6 @@ manual for more on defining buildsystem properties. .. include:: LINK_LIBRARIES_INDIRECTION.txt -``INTERFACE_LINK_LIBRARIES`` adds transitive link dependencies for a -target's dependents. In advanced use cases, one may update the -direct link dependencies of a target's dependents by using the -:prop_tgt:`INTERFACE_LINK_LIBRARIES_DIRECT` and -:prop_tgt:`INTERFACE_LINK_LIBRARIES_DIRECT_EXCLUDE` target properties. - Creating Relocatable Packages ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/Help/prop_tgt/INTERFACE_LINK_LIBRARIES_DIRECT.rst b/Help/prop_tgt/INTERFACE_LINK_LIBRARIES_DIRECT.rst deleted file mode 100644 index 0507261..0000000 --- a/Help/prop_tgt/INTERFACE_LINK_LIBRARIES_DIRECT.rst +++ /dev/null @@ -1,223 +0,0 @@ -INTERFACE_LINK_LIBRARIES_DIRECT -------------------------------- - -.. versionadded:: 3.23 - -List of libraries that consumers of this library should treat -as direct link dependencies. - -This target property may be set to *include* items in a dependent -target's final set of direct link dependencies. See the -:prop_tgt:`INTERFACE_LINK_LIBRARIES_DIRECT_EXCLUDE` target property -to exclude items. - -The initial set of a dependent target's direct link dependencies is -specified by its :prop_tgt:`LINK_LIBRARIES` target property. Indirect -link dependencies are specified by the transitive closure of the direct -link dependencies' :prop_tgt:`INTERFACE_LINK_LIBRARIES` properties. -Any link dependency may specify additional direct link dependencies -using the ``INTERFACE_LINK_LIBRARIES_DIRECT`` target property. -The set of direct link dependencies is then filtered to exclude items named -by any dependency's :prop_tgt:`INTERFACE_LINK_LIBRARIES_DIRECT_EXCLUDE` -target property. - -.. |INTERFACE_PROPERTY_LINK_DIRECT| replace:: ``INTERFACE_LINK_LIBRARIES_DIRECT`` -.. include:: INTERFACE_LINK_LIBRARIES_DIRECT.txt - -Direct Link Dependencies as Usage Requirements -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -The ``INTERFACE_PROPERTY_LINK_DIRECT`` and -``INTERFACE_LINK_LIBRARIES_DIRECT_EXCLUDE`` target properties -are :ref:`usage requirements <Target Usage Requirements>`. -Their effects propagate to dependent targets transitively, and can -therefore affect the direct link dependencies of every target in a -chain of dependent libraries. Whenever some library target ``X`` links -to another library target ``Y`` whose direct or transitive usage -requirements contain ``INTERFACE_PROPERTY_LINK_DIRECT`` or -``INTERFACE_PROPERTY_LINK_DIRECT_EXCLUDE``, the properties may affect -``X``'s list of direct link dependencies: - -* If ``X`` is a shared library or executable, its dependencies are linked. - They also affect the usage requirements with which ``X``'s sources are - compiled. - -* If ``X`` is a static library or object library, it does not actually - link, so its dependencies at most affect the usage requirements with - which ``X``'s sources are compiled. - -The properties may also affect the list of direct link dependencies -on ``X``'s dependents: - -* If ``X`` links ``Y`` publicly: - - .. code-block:: cmake - - target_link_libraries(X PUBLIC Y) - - then ``Y`` is placed in ``X``'s :prop_tgt:`INTERFACE_LINK_LIBRARIES`, - so ``Y``'s usage requirements, including ``INTERFACE_PROPERTY_LINK_DIRECT`` - and ``INTERFACE_PROPERTY_LINK_DIRECT_EXCLUDE``, are propagated - to ``X``'s dependents. - -* If ``X`` links ``Y`` privately: - - .. code-block:: cmake - - target_link_libraries(X PRIVATE Y) - - then ``Y`` is not placed in ``X``'s :prop_tgt:`INTERFACE_LINK_LIBRARIES`, - so ``Y``'s usage requirements, even ``INTERFACE_PROPERTY_LINK_DIRECT`` - and ``INTERFACE_PROPERTY_LINK_DIRECT_EXCLUDE``, are not propagated - to ``X``'s dependents. - (If ``X`` is a static library or object library, then ``$<LINK_ONLY:Y>`` - is placed in ``X``'s :prop_tgt:`INTERFACE_LINK_LIBRARIES`, but the - :genex:`LINK_ONLY` generator expression block ``Y``'s usage requirements.) - -* In either case, the content of ``X``'s :prop_tgt:`INTERFACE_LINK_LIBRARIES` - is not affected by ``Y``'s ``INTERFACE_PROPERTY_LINK_DIRECT`` or - ``INTERFACE_PROPERTY_LINK_DIRECT_EXCLUDE``. - -One may limit the effects of ``INTERFACE_PROPERTY_LINK_DIRECT`` and -``INTERFACE_PROPERTY_LINK_DIRECT_EXCLUDE`` to a subset of dependent -targets by using the :genex:`TARGET_PROPERTY` generator expression. -For example, to limit the effects to executable targets, use an -entry of the form:: - - "$<$<STREQUAL:$<TARGET_PROPERTY:TYPE>,EXECUTABLE>:...>" - -Similarly, to limit the effects to specific targets, use an entry -of the form:: - - "$<$<BOOL:$<TARGET_PROPERTY:USE_IT>>:...>" - -This entry will only affect targets that set their ``USE_IT`` -target property to a true value. - -Direct Link Dependency Ordering -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -The list of direct link dependencies for a target is computed from an -initial ordered list in its :prop_tgt:`LINK_LIBRARIES` target property. -For each item, additional direct link dependencies are discovered from -its direct and transitive ``INTERFACE_LINK_LIBRARIES_DIRECT`` usage -requirements. Each discovered item is injected before the item that -specified it. However, a discovered item is added at most once, -and only if it did not appear anywhere in the initial list. -This gives :prop_tgt:`LINK_LIBRARIES` control over ordering of -those direct link dependencies that it explicitly specifies. - -Once all direct link dependencies have been collected, items named by -all of their :prop_tgt:`INTERFACE_LINK_LIBRARIES_DIRECT_EXCLUDE` -usage requirements are removed from the final list. This does not -affect the order of the items that remain. - -Example: Static Plugins -^^^^^^^^^^^^^^^^^^^^^^^ - -Consider a static library ``Foo`` that provides a static plugin -``FooPlugin`` to consuming application executables, where the -implementation of the plugin depends on ``Foo`` and other things. -In this case, the application should link to ``FooPlugin`` directly, -before ``Foo``. However, the application author only knows about ``Foo``. -We can express this as follows: - -.. code-block:: cmake - - # Core library used by other components. - add_library(Core STATIC core.cpp) - - # Foo is a static library for use by applications. - # Implementation of Foo depends on Core. - add_library(Foo STATIC foo.cpp foo_plugin_helper.cpp) - target_link_libraries(Foo PRIVATE Core) - - # Extra parts of Foo for use by its static plugins. - # Implementation of Foo's extra parts depends on both Core and Foo. - add_library(FooExtras STATIC foo_extras.cpp) - target_link_libraries(FooExtras PRIVATE Core Foo) - - # The Foo library has an associated static plugin - # that should be linked into the final executable. - # Implementation of the plugin depends on Core, Foo, and FooExtras. - add_library(FooPlugin STATIC foo_plugin.cpp) - target_link_libraries(FooPlugin PRIVATE Core Foo FooExtras) - - # An app that links Foo should link Foo's plugin directly. - set_property(TARGET Foo PROPERTY INTERFACE_LINK_LIBRARIES_DIRECT FooPlugin) - - # An app does not need to link Foo directly because the plugin links it. - set_property(TARGET Foo PROPERTY INTERFACE_LINK_LIBRARIES_DIRECT_EXCLUDE Foo) - -An application ``app`` only needs to specify that it links to ``Foo``: - -.. code-block:: cmake - - add_executable(app main.cpp) - target_link_libraries(app PRIVATE Foo) - -The ``INTERFACE_LINK_LIBRARIES_DIRECT`` target property on ``Foo`` tells -CMake to pretend that ``app`` also links directly to ``FooPlugin``. -The ``INTERFACE_LINK_LIBRARIES_DIRECT_EXCLUDE`` target property on ``Foo`` -tells CMake to pretend that ``app`` did *not* link directly to ``Foo``. -Instead, ``Foo`` will be linked as a dependency of ``FooPlugin``. The -final link line for ``app`` will link the libraries in the following -order: - -* ``FooPlugin`` as a direct link dependency of ``app`` - (via ``Foo``'s usage requiremens). -* ``FooExtras`` as a dependency of ``FooPlugin``. -* ``Foo`` as a dependency of ``FooPlugin`` and ``FooExtras``. -* ``Core`` as a dependency of ``FooPlugin``, ``FooExtras``, and ``Foo``. - -Note that without the ``INTERFACE_LINK_LIBRARIES_DIRECT_EXCLUDE`` target -property, ``Foo`` would be linked twice: once as a direct dependency -of ``app``, and once as a dependency of ``FooPlugin``. - -Example: Opt-In Static Plugins -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -In the above `Example: Static Plugins`_, the ``app`` executable specifies -that it links directly to ``Foo``. In a real application, there might -be an intermediate library: - -.. code-block:: cmake - - add_library(app_impl STATIC app_impl.cpp) - target_link_libraries(app_impl PUBLIC Foo) - - add_executable(app main.cpp) - target_link_libraries(app PRIVATE app_impl) - -In this case we do not want ``Foo``'s ``INTERFACE_LINK_LIBRARIES_DIRECT`` -and ``INTERFACE_LINK_LIBRARIES_DIRECT_EXCLUDE`` target properties to affect -the direct dependencies of ``app_impl``. To avoid this, we can revise -the property values to make their effects opt-in: - -.. code-block:: cmake - - # An app that links Foo should link Foo's plugin directly. - set_property(TARGET Foo PROPERTY INTERFACE_LINK_LIBRARIES_DIRECT - "$<$<BOOL:$<TARGET_PROPERTY:FOO_STATIC_PLUGINS>>:FooPlugin>" - ) - - # An app does not need to link Foo directly because the plugin links it. - set_property(TARGET Foo PROPERTY INTERFACE_LINK_LIBRARIES_DIRECT_EXCLUDE - "$<$<BOOL:$<TARGET_PROPERTY:FOO_STATIC_PLUGINS>>:Foo>" - ) - -Now, the ``app`` executable can opt-in to get ``Foo``'s plugin(s): - -.. code-block:: cmake - - set_property(TARGET app PROPERTY FOO_STATIC_PLUGINS 1) - -The final link line for ``app`` will now link the libraries in the following -order: - -* ``FooPlugin`` as a direct link dependency of ``app`` - (via ``Foo``'s usage requiremens). -* ``app_impl`` as a direct link dependency of ``app``. -* ``FooExtras`` as a dependency of ``FooPlugin``. -* ``Foo`` as a dependency of ``app_impl``, ``FooPlugin``, and ``FooExtras``. -* ``Core`` as a dependency of ``FooPlugin``, ``FooExtras``, and ``Foo``. diff --git a/Help/prop_tgt/INTERFACE_LINK_LIBRARIES_DIRECT.txt b/Help/prop_tgt/INTERFACE_LINK_LIBRARIES_DIRECT.txt deleted file mode 100644 index 077af42..0000000 --- a/Help/prop_tgt/INTERFACE_LINK_LIBRARIES_DIRECT.txt +++ /dev/null @@ -1,9 +0,0 @@ -The value of |INTERFACE_PROPERTY_LINK_DIRECT| may use -:manual:`generator expressions <cmake-generator-expressions(7)>`. - -.. note:: - - The |INTERFACE_PROPERTY_LINK_DIRECT| target property is intended for - advanced use cases such as injection of static plugins into a consuming - executable. It should not be used as a substitute for organizing - normal calls to :command:`target_link_libraries`. diff --git a/Help/prop_tgt/INTERFACE_LINK_LIBRARIES_DIRECT_EXCLUDE.rst b/Help/prop_tgt/INTERFACE_LINK_LIBRARIES_DIRECT_EXCLUDE.rst deleted file mode 100644 index c92f142..0000000 --- a/Help/prop_tgt/INTERFACE_LINK_LIBRARIES_DIRECT_EXCLUDE.rst +++ /dev/null @@ -1,34 +0,0 @@ -INTERFACE_LINK_LIBRARIES_DIRECT_EXCLUDE ---------------------------------------- - -.. versionadded:: 3.23 - -List of libraries that consumers of this library should *not* treat -as direct link dependencies. - -This target property may be set to *exclude* items from a dependent -target's final set of direct link dependencies. This property is -processed after the :prop_tgt:`INTERFACE_LINK_LIBRARIES_DIRECT` -target property of all other dependencies of the dependent target, so -exclusion from direct link dependence takes priority over inclusion. - -The initial set of a dependent target's direct link dependencies is -specified by its :prop_tgt:`LINK_LIBRARIES` target property. Indirect -link dependencies are specified by the transitive closure of the direct -link dependencies' :prop_tgt:`INTERFACE_LINK_LIBRARIES` properties. -Any link dependency may specify additional direct link dependencies -using the :prop_tgt:`INTERFACE_LINK_LIBRARIES_DIRECT` target property. -The set of direct link dependencies is then filtered to exclude items named -by any dependency's ``INTERFACE_LINK_LIBRARIES_DIRECT_EXCLUDE`` target -property. - -Excluding an item from a dependent target's direct link dependencies -does not mean the dependent target won't link the item. The item -may still be linked as an indirect link dependency via the -:prop_tgt:`INTERFACE_LINK_LIBRARIES` property on other dependencies. - -.. |INTERFACE_PROPERTY_LINK_DIRECT| replace:: ``INTERFACE_LINK_LIBRARIES_DIRECT_EXCLUDE`` -.. include:: INTERFACE_LINK_LIBRARIES_DIRECT.txt - -See the :prop_tgt:`INTERFACE_LINK_LIBRARIES_DIRECT` target property -documentation for more details and examples. diff --git a/Help/prop_tgt/LINK_LIBRARIES.rst b/Help/prop_tgt/LINK_LIBRARIES.rst index ae5334a..29baf8c 100644 --- a/Help/prop_tgt/LINK_LIBRARIES.rst +++ b/Help/prop_tgt/LINK_LIBRARIES.rst @@ -20,8 +20,3 @@ for available expressions. See the :manual:`cmake-buildsystem(7)` manual for more on defining buildsystem properties. .. include:: LINK_LIBRARIES_INDIRECTION.txt - -In advanced use cases, the list of direct link dependencies specified -by this property may be updated by usage requirements from dependencies. -See the :prop_tgt:`INTERFACE_LINK_LIBRARIES_DIRECT` and -:prop_tgt:`INTERFACE_LINK_LIBRARIES_DIRECT_EXCLUDE` target properties. diff --git a/Help/release/3.23.rst b/Help/release/3.23.rst index 285a471..1a3f53e 100644 --- a/Help/release/3.23.rst +++ b/Help/release/3.23.rst @@ -130,11 +130,6 @@ Properties not be treated as a system library (i.e. its include directories are not automatically ``SYSTEM``). -* The :prop_tgt:`INTERFACE_LINK_LIBRARIES_DIRECT` and - :prop_tgt:`INTERFACE_LINK_LIBRARIES_DIRECT_EXCLUDE` target properties - were added to express usage requirements affecting a consumer's - direct link dependencies. - * The :prop_tgt:`XCODE_EMBED_PLUGINS <XCODE_EMBED_<type>>` target property was added to tell the :generator:`Xcode` generator what targets to put in the ``Embed PlugIns`` build phase. diff --git a/Source/cmExportFileGenerator.cxx b/Source/cmExportFileGenerator.cxx index b46b933..ed1e4cb 100644 --- a/Source/cmExportFileGenerator.cxx +++ b/Source/cmExportFileGenerator.cxx @@ -2,7 +2,6 @@ file Copyright.txt or https://cmake.org/licensing for details. */ #include "cmExportFileGenerator.h" -#include <array> #include <cassert> #include <cstring> #include <sstream> @@ -176,24 +175,18 @@ bool cmExportFileGenerator::PopulateInterfaceLinkLibrariesProperty( if (!target->IsLinkable()) { return false; } - static const std::array<std::string, 3> linkIfaceProps = { - { "INTERFACE_LINK_LIBRARIES", "INTERFACE_LINK_LIBRARIES_DIRECT", - "INTERFACE_LINK_LIBRARIES_DIRECT_EXCLUDE" } - }; - bool hadINTERFACE_LINK_LIBRARIES = false; - for (std::string const& linkIfaceProp : linkIfaceProps) { - if (cmValue input = target->GetProperty(linkIfaceProp)) { - std::string prepro = - cmGeneratorExpression::Preprocess(*input, preprocessRule); - if (!prepro.empty()) { - this->ResolveTargetsInGeneratorExpressions( - prepro, target, missingTargets, ReplaceFreeTargets); - properties[linkIfaceProp] = prepro; - hadINTERFACE_LINK_LIBRARIES = true; - } + cmValue input = target->GetProperty("INTERFACE_LINK_LIBRARIES"); + if (input) { + std::string prepro = + cmGeneratorExpression::Preprocess(*input, preprocessRule); + if (!prepro.empty()) { + this->ResolveTargetsInGeneratorExpressions( + prepro, target, missingTargets, ReplaceFreeTargets); + properties["INTERFACE_LINK_LIBRARIES"] = prepro; + return true; } } - return hadINTERFACE_LINK_LIBRARIES; + return false; } static bool isSubDirectory(std::string const& a, std::string const& b) diff --git a/Source/cmExportTryCompileFileGenerator.cxx b/Source/cmExportTryCompileFileGenerator.cxx index e98aa05..db9b05b 100644 --- a/Source/cmExportTryCompileFileGenerator.cxx +++ b/Source/cmExportTryCompileFileGenerator.cxx @@ -111,8 +111,6 @@ void cmExportTryCompileFileGenerator::PopulateProperties( std::vector<std::string> props = target->GetPropertyKeys(); // Include special properties that might be relevant here. props.emplace_back("INTERFACE_LINK_LIBRARIES"); - props.emplace_back("INTERFACE_LINK_LIBRARIES_DIRECT"); - props.emplace_back("INTERFACE_LINK_LIBRARIES_DIRECT_EXCLUDE"); for (std::string const& p : props) { cmValue v = target->GetProperty(p); if (!v) { diff --git a/Source/cmGeneratorExpressionDAGChecker.cxx b/Source/cmGeneratorExpressionDAGChecker.cxx index d4b02a5..187db73 100644 --- a/Source/cmGeneratorExpressionDAGChecker.cxx +++ b/Source/cmGeneratorExpressionDAGChecker.cxx @@ -189,8 +189,6 @@ bool cmGeneratorExpressionDAGChecker::EvaluatingLinkLibraries( } return prop == "LINK_LIBRARIES"_s || prop == "INTERFACE_LINK_LIBRARIES"_s || - prop == "INTERFACE_LINK_LIBRARIES_DIRECT"_s || - prop == "INTERFACE_LINK_LIBRARIES_DIRECT_EXCLUDE"_s || prop == "LINK_INTERFACE_LIBRARIES"_s || prop == "IMPORTED_LINK_INTERFACE_LIBRARIES"_s || cmHasLiteralPrefix(prop, "LINK_INTERFACE_LIBRARIES_") || diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx index 63cf2ec..a8bc91c 100644 --- a/Source/cmGeneratorTarget.cxx +++ b/Source/cmGeneratorTarget.cxx @@ -58,10 +58,6 @@ using LinkInterfaceFor = cmGeneratorTarget::LinkInterfaceFor; const cmsys::RegularExpression FrameworkRegularExpression( "^(.*/)?([^/]*)\\.framework/(.*)$"); const std::string kINTERFACE_LINK_LIBRARIES = "INTERFACE_LINK_LIBRARIES"; -const std::string kINTERFACE_LINK_LIBRARIES_DIRECT = - "INTERFACE_LINK_LIBRARIES_DIRECT"; -const std::string kINTERFACE_LINK_LIBRARIES_DIRECT_EXCLUDE = - "INTERFACE_LINK_LIBRARIES_DIRECT_EXCLUDE"; } template <> @@ -6671,10 +6667,12 @@ cm::optional<cmLinkItem> cmGeneratorTarget::LookupLinkItem( return maybeItem; } -void cmGeneratorTarget::ExpandLinkItems( - std::string const& prop, cmBTStringRange entries, std::string const& config, - cmGeneratorTarget const* headTarget, LinkInterfaceFor interfaceFor, - LinkInterfaceField field, cmLinkInterface& iface) const +void cmGeneratorTarget::ExpandLinkItems(std::string const& prop, + cmBTStringRange entries, + std::string const& config, + cmGeneratorTarget const* headTarget, + LinkInterfaceFor interfaceFor, + cmLinkInterface& iface) const { if (entries.empty()) { return; @@ -6698,19 +6696,9 @@ void cmGeneratorTarget::ExpandLinkItems( this, headTarget->LinkerLanguage)); for (std::string const& lib : libs) { if (cm::optional<cmLinkItem> maybeItem = this->LookupLinkItem( - lib, cge->GetBacktrace(), &scope, - field == LinkInterfaceField::Libraries ? LookupSelf::No - : LookupSelf::Yes)) { + lib, cge->GetBacktrace(), &scope, LookupSelf::No)) { cmLinkItem item = std::move(*maybeItem); - if (field == LinkInterfaceField::HeadInclude) { - iface.HeadInclude.emplace_back(std::move(item)); - continue; - } - if (field == LinkInterfaceField::HeadExclude) { - iface.HeadExclude.emplace_back(std::move(item)); - continue; - } if (!item.Target) { // Report explicitly linked object files separately. std::string const& maybeObj = item.AsStr(); @@ -7181,9 +7169,7 @@ void cmGeneratorTarget::ComputeLinkInterfaceLibraries( this->GetPolicyStatusCMP0022() != cmPolicies::WARN); if (cmp0022NEW) { // CMP0022 NEW behavior is to use INTERFACE_LINK_LIBRARIES. - haveExplicitLibraries = !this->Target->GetLinkInterfaceEntries().empty() || - !this->Target->GetLinkInterfaceDirectEntries().empty() || - !this->Target->GetLinkInterfaceDirectExcludeEntries().empty(); + haveExplicitLibraries = !this->Target->GetLinkInterfaceEntries().empty(); } else { // CMP0022 OLD behavior is to use LINK_INTERFACE_LIBRARIES if set on a // shared lib or executable. @@ -7248,24 +7234,15 @@ void cmGeneratorTarget::ComputeLinkInterfaceLibraries( if (cmp0022NEW) { // The interface libraries are specified by INTERFACE_LINK_LIBRARIES. // Use its special representation directly to get backtraces. - this->ExpandLinkItems( - kINTERFACE_LINK_LIBRARIES, this->Target->GetLinkInterfaceEntries(), - config, headTarget, interfaceFor, LinkInterfaceField::Libraries, iface); - this->ExpandLinkItems(kINTERFACE_LINK_LIBRARIES_DIRECT, - this->Target->GetLinkInterfaceDirectEntries(), - config, headTarget, interfaceFor, - LinkInterfaceField::HeadInclude, iface); - this->ExpandLinkItems(kINTERFACE_LINK_LIBRARIES_DIRECT_EXCLUDE, - this->Target->GetLinkInterfaceDirectExcludeEntries(), - config, headTarget, interfaceFor, - LinkInterfaceField::HeadExclude, iface); + this->ExpandLinkItems(kINTERFACE_LINK_LIBRARIES, + this->Target->GetLinkInterfaceEntries(), config, + headTarget, interfaceFor, iface); } else if (explicitLibrariesCMP0022OLD) { // The interface libraries have been explicitly set in pre-CMP0022 style. std::vector<BT<std::string>> entries; entries.emplace_back(*explicitLibrariesCMP0022OLD); this->ExpandLinkItems(linkIfacePropCMP0022OLD, cmMakeRange(entries), - config, headTarget, interfaceFor, - LinkInterfaceField::Libraries, iface); + config, headTarget, interfaceFor, iface); } // If the link interface is explicit, do not fall back to the link impl. @@ -7285,8 +7262,7 @@ void cmGeneratorTarget::ComputeLinkInterfaceLibraries( cmLinkInterface ifaceNew; this->ExpandLinkItems(kINTERFACE_LINK_LIBRARIES, this->Target->GetLinkInterfaceEntries(), config, - headTarget, interfaceFor, - LinkInterfaceField::Libraries, ifaceNew); + headTarget, interfaceFor, ifaceNew); if (ifaceNew.Libraries != iface.Libraries) { std::string oldLibraries = cmJoin(impl->Libraries, ";"); std::string newLibraries = cmJoin(ifaceNew.Libraries, ";"); @@ -7426,17 +7402,8 @@ const cmLinkInterface* cmGeneratorTarget::GetImportLinkInterface( iface.LibrariesDone = true; iface.Multiplicity = info->Multiplicity; cmExpandList(info->Languages, iface.Languages); - this->ExpandLinkItems(kINTERFACE_LINK_LIBRARIES_DIRECT, - cmMakeRange(info->LibrariesHeadInclude), config, - headTarget, interfaceFor, - LinkInterfaceField::HeadInclude, iface); - this->ExpandLinkItems(kINTERFACE_LINK_LIBRARIES_DIRECT_EXCLUDE, - cmMakeRange(info->LibrariesHeadExclude), config, - headTarget, interfaceFor, - LinkInterfaceField::HeadExclude, iface); this->ExpandLinkItems(info->LibrariesProp, cmMakeRange(info->Libraries), - config, headTarget, interfaceFor, - LinkInterfaceField::Libraries, iface); + config, headTarget, interfaceFor, iface); std::vector<std::string> deps = cmExpandedList(info->SharedDeps); LookupLinkItemScope scope{ this->LocalGenerator }; for (std::string const& dep : deps) { @@ -7529,14 +7496,6 @@ void cmGeneratorTarget::ComputeImportInfo(std::string const& desired_config, } } } - for (BT<std::string> const& entry : - this->Target->GetLinkInterfaceDirectEntries()) { - info.LibrariesHeadInclude.emplace_back(entry); - } - for (BT<std::string> const& entry : - this->Target->GetLinkInterfaceDirectExcludeEntries()) { - info.LibrariesHeadExclude.emplace_back(entry); - } if (this->GetType() == cmStateEnums::INTERFACE_LIBRARY) { if (loc) { info.LibName = *loc; @@ -7970,112 +7929,6 @@ bool cmGeneratorTarget::IsNullImpliedByLinkLibraries( return cm::contains(this->LinkImplicitNullProperties, p); } -namespace { -class TransitiveLinkImpl -{ - cmGeneratorTarget const* Self; - std::string const& Config; - cmLinkImplementation& Impl; - - std::set<cmLinkItem> Emitted; - std::set<cmLinkItem> Excluded; - std::unordered_set<cmGeneratorTarget const*> Followed; - - void Follow(cmGeneratorTarget const* target); - -public: - TransitiveLinkImpl(cmGeneratorTarget const* self, std::string const& config, - cmLinkImplementation& impl) - : Self(self) - , Config(config) - , Impl(impl) - { - } - - void Compute(); -}; - -void TransitiveLinkImpl::Follow(cmGeneratorTarget const* target) -{ - if (!target || !this->Followed.insert(target).second || - target->GetPolicyStatusCMP0022() == cmPolicies::OLD || - target->GetPolicyStatusCMP0022() == cmPolicies::WARN) { - return; - } - - // Get this target's usage requirements. - cmLinkInterfaceLibraries const* iface = target->GetLinkInterfaceLibraries( - this->Config, this->Self, LinkInterfaceFor::Usage); - if (!iface) { - return; - } - if (iface->HadContextSensitiveCondition) { - this->Impl.HadContextSensitiveCondition = true; - } - - // Process 'INTERFACE_LINK_LIBRARIES_DIRECT' usage requirements. - for (cmLinkItem const& item : iface->HeadInclude) { - // Inject direct dependencies from the item's usage requirements - // before the item itself. - this->Follow(item.Target); - - // Add the item itself, but at most once. - if (this->Emitted.insert(item).second) { - this->Impl.Libraries.emplace_back(item, /* checkCMP0027= */ false); - } - } - - // Follow transitive dependencies. - for (cmLinkItem const& item : iface->Libraries) { - this->Follow(item.Target); - } - - // Record exclusions from 'INTERFACE_LINK_LIBRARIES_DIRECT_EXCLUDE' - // usage requirements. - for (cmLinkItem const& item : iface->HeadExclude) { - this->Excluded.insert(item); - } -} - -void TransitiveLinkImpl::Compute() -{ - // Save the original items and start with an empty list. - std::vector<cmLinkImplItem> original = std::move(this->Impl.Libraries); - - // Avoid injecting any original items as usage requirements. - // This gives LINK_LIBRARIES final control over the order - // if it explicitly lists everything. - this->Emitted.insert(original.cbegin(), original.cend()); - - // Process each original item. - for (cmLinkImplItem& item : original) { - // Inject direct dependencies listed in 'INTERFACE_LINK_LIBRARIES_DIRECT' - // usage requirements before the item itself. - this->Follow(item.Target); - - // Add the item itself. - this->Impl.Libraries.emplace_back(std::move(item)); - } - - // Remove items listed in 'INTERFACE_LINK_LIBRARIES_DIRECT_EXCLUDE' - // usage requirements found through any dependency above. - this->Impl.Libraries.erase( - std::remove_if(this->Impl.Libraries.begin(), this->Impl.Libraries.end(), - [this](cmLinkImplItem const& item) { - return this->Excluded.find(item) != this->Excluded.end(); - }), - this->Impl.Libraries.end()); -} - -void ComputeLinkImplTransitive(cmGeneratorTarget const* self, - std::string const& config, - cmLinkImplementation& impl) -{ - TransitiveLinkImpl transitiveLinkImpl(self, config, impl); - transitiveLinkImpl.Compute(); -} -} - void cmGeneratorTarget::ComputeLinkImplementationLibraries( const std::string& config, cmOptionalLinkImplementation& impl, cmGeneratorTarget const* head) const @@ -8182,11 +8035,6 @@ void cmGeneratorTarget::ComputeLinkImplementationLibraries( cge->GetMaxLanguageStandard(this, this->MaxLanguageStandards); } - // Update the list of direct link dependencies from usage requirements. - if (head == this) { - ComputeLinkImplTransitive(this, config, impl); - } - // Get the list of configurations considered to be DEBUG. std::vector<std::string> debugConfigs = this->Makefile->GetCMakeInstance()->GetDebugConfigs(); diff --git a/Source/cmGeneratorTarget.h b/Source/cmGeneratorTarget.h index 45639c0..7cf1720 100644 --- a/Source/cmGeneratorTarget.h +++ b/Source/cmGeneratorTarget.h @@ -1006,8 +1006,6 @@ private: std::string Languages; std::string LibrariesProp; std::vector<BT<std::string>> Libraries; - std::vector<BT<std::string>> LibrariesHeadInclude; - std::vector<BT<std::string>> LibrariesHeadExclude; std::string SharedDeps; }; @@ -1068,16 +1066,10 @@ private: bool IsLinkLookupScope(std::string const& n, cmLocalGenerator const*& lg) const; - enum class LinkInterfaceField - { - Libraries, - HeadExclude, - HeadInclude, - }; void ExpandLinkItems(std::string const& prop, cmBTStringRange entries, std::string const& config, const cmGeneratorTarget* headTarget, - LinkInterfaceFor interfaceFor, LinkInterfaceField field, + LinkInterfaceFor interfaceFor, cmLinkInterface& iface) const; struct LookupLinkItemScope diff --git a/Source/cmLinkItem.h b/Source/cmLinkItem.h index 262728b..e715659 100644 --- a/Source/cmLinkItem.h +++ b/Source/cmLinkItem.h @@ -70,12 +70,6 @@ struct cmLinkInterfaceLibraries // Object files listed in the interface. std::vector<cmLinkItem> Objects; - // Items to be included as if directly linked by the head target. - std::vector<cmLinkItem> HeadInclude; - - // Items to be excluded from direct linking by the head target. - std::vector<cmLinkItem> HeadExclude; - // Whether the list depends on a genex referencing the head target. bool HadHeadSensitiveCondition = false; diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index 6059055..e1a9667 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -203,8 +203,6 @@ public: std::vector<BT<std::string>> LinkDirectoriesEntries; std::vector<BT<std::string>> LinkImplementationPropertyEntries; std::vector<BT<std::string>> LinkInterfacePropertyEntries; - std::vector<BT<std::string>> LinkInterfaceDirectPropertyEntries; - std::vector<BT<std::string>> LinkInterfaceDirectExcludePropertyEntries; std::vector<BT<std::string>> HeaderSetsEntries; std::vector<BT<std::string>> InterfaceHeaderSetsEntries; std::vector<std::pair<cmTarget::TLLSignature, cmListFileContext>> @@ -1144,16 +1142,6 @@ cmBTStringRange cmTarget::GetLinkInterfaceEntries() const return cmMakeRange(this->impl->LinkInterfacePropertyEntries); } -cmBTStringRange cmTarget::GetLinkInterfaceDirectEntries() const -{ - return cmMakeRange(this->impl->LinkInterfaceDirectPropertyEntries); -} - -cmBTStringRange cmTarget::GetLinkInterfaceDirectExcludeEntries() const -{ - return cmMakeRange(this->impl->LinkInterfaceDirectExcludePropertyEntries); -} - cmBTStringRange cmTarget::GetHeaderSetsEntries() const { return cmMakeRange(this->impl->HeaderSetsEntries); @@ -1198,8 +1186,6 @@ MAKE_PROP(HEADER_SET); MAKE_PROP(HEADER_SETS); MAKE_PROP(INTERFACE_HEADER_SETS); MAKE_PROP(INTERFACE_LINK_LIBRARIES); -MAKE_PROP(INTERFACE_LINK_LIBRARIES_DIRECT); -MAKE_PROP(INTERFACE_LINK_LIBRARIES_DIRECT_EXCLUDE); #undef MAKE_PROP } @@ -1331,19 +1317,6 @@ void cmTarget::StoreProperty(const std::string& prop, ValueType value) cmListFileBacktrace lfbt = this->impl->Makefile->GetBacktrace(); this->impl->LinkInterfacePropertyEntries.emplace_back(value, lfbt); } - } else if (prop == propINTERFACE_LINK_LIBRARIES_DIRECT) { - this->impl->LinkInterfaceDirectPropertyEntries.clear(); - if (value) { - cmListFileBacktrace lfbt = this->impl->Makefile->GetBacktrace(); - this->impl->LinkInterfaceDirectPropertyEntries.emplace_back(value, lfbt); - } - } else if (prop == propINTERFACE_LINK_LIBRARIES_DIRECT_EXCLUDE) { - this->impl->LinkInterfaceDirectExcludePropertyEntries.clear(); - if (value) { - cmListFileBacktrace lfbt = this->impl->Makefile->GetBacktrace(); - this->impl->LinkInterfaceDirectExcludePropertyEntries.emplace_back(value, - lfbt); - } } else if (prop == propSOURCES) { this->impl->SourceEntries.clear(); if (value) { @@ -1602,17 +1575,6 @@ void cmTarget::AppendProperty(const std::string& prop, cmListFileBacktrace lfbt = this->impl->Makefile->GetBacktrace(); this->impl->LinkInterfacePropertyEntries.emplace_back(value, lfbt); } - } else if (prop == propINTERFACE_LINK_LIBRARIES_DIRECT) { - if (!value.empty()) { - cmListFileBacktrace lfbt = this->impl->Makefile->GetBacktrace(); - this->impl->LinkInterfaceDirectPropertyEntries.emplace_back(value, lfbt); - } - } else if (prop == propINTERFACE_LINK_LIBRARIES_DIRECT_EXCLUDE) { - if (!value.empty()) { - cmListFileBacktrace lfbt = this->impl->Makefile->GetBacktrace(); - this->impl->LinkInterfaceDirectExcludePropertyEntries.emplace_back(value, - lfbt); - } } else if (prop == "SOURCES") { cmListFileBacktrace lfbt = this->impl->Makefile->GetBacktrace(); this->impl->SourceEntries.emplace_back(value, lfbt); @@ -1923,8 +1885,6 @@ cmValue cmTarget::GetProperty(const std::string& prop) const propHEADER_SETS, propINTERFACE_HEADER_SETS, propINTERFACE_LINK_LIBRARIES, - propINTERFACE_LINK_LIBRARIES_DIRECT, - propINTERFACE_LINK_LIBRARIES_DIRECT_EXCLUDE, }; if (specialProps.count(prop)) { if (prop == propC_STANDARD || prop == propCXX_STANDARD || @@ -1954,25 +1914,6 @@ cmValue cmTarget::GetProperty(const std::string& prop) const output = cmJoin(this->impl->LinkInterfacePropertyEntries, ";"); return cmValue(output); } - if (prop == propINTERFACE_LINK_LIBRARIES_DIRECT) { - if (this->impl->LinkInterfaceDirectPropertyEntries.empty()) { - return nullptr; - } - - static std::string output; - output = cmJoin(this->impl->LinkInterfaceDirectPropertyEntries, ";"); - return cmValue(output); - } - if (prop == propINTERFACE_LINK_LIBRARIES_DIRECT_EXCLUDE) { - if (this->impl->LinkInterfaceDirectExcludePropertyEntries.empty()) { - return nullptr; - } - - static std::string output; - output = - cmJoin(this->impl->LinkInterfaceDirectExcludePropertyEntries, ";"); - return cmValue(output); - } // the type property returns what type the target is if (prop == propTYPE) { return cmValue(cmState::GetTargetTypeName(this->GetType())); diff --git a/Source/cmTarget.h b/Source/cmTarget.h index 0cdd2fc..1bbd0b0 100644 --- a/Source/cmTarget.h +++ b/Source/cmTarget.h @@ -269,8 +269,6 @@ public: cmBTStringRange GetLinkImplementationEntries() const; cmBTStringRange GetLinkInterfaceEntries() const; - cmBTStringRange GetLinkInterfaceDirectEntries() const; - cmBTStringRange GetLinkInterfaceDirectExcludeEntries() const; cmBTStringRange GetHeaderSetsEntries() const; diff --git a/Tests/CMakeLists.txt b/Tests/CMakeLists.txt index 6946ffb..faa199d 100644 --- a/Tests/CMakeLists.txt +++ b/Tests/CMakeLists.txt @@ -3589,8 +3589,6 @@ if(BUILD_TESTING) --test-command InterfaceLinkLibraries) list(APPEND TEST_BUILD_DIRS "${CMake_BINARY_DIR}/Tests/InterfaceLinkLibraries") - ADD_TEST_MACRO(InterfaceLinkLibrariesDirect) - if(NOT CMake_TEST_EXTERNAL_CMAKE) add_subdirectory(CMakeTests) endif() diff --git a/Tests/ExportImport/Export/CMakeLists.txt b/Tests/ExportImport/Export/CMakeLists.txt index c9e41f5..a79efd0 100644 --- a/Tests/ExportImport/Export/CMakeLists.txt +++ b/Tests/ExportImport/Export/CMakeLists.txt @@ -163,16 +163,6 @@ install( cmake_policy(PUSH) cmake_policy(SET CMP0022 NEW) - -# Test control over direct linking. -include(../../InterfaceLinkLibrariesDirect/testStaticLibPlugin.cmake) -include(../../InterfaceLinkLibrariesDirect/testSharedLibWithHelper.cmake) -include(../../InterfaceLinkLibrariesDirect/testExeWithPluginHelper.cmake) -if(NOT maybe_OBJECTS_DESTINATION) - target_compile_definitions(testSharedLibHelperObj INTERFACE testSharedLibHelperObj_NO_OBJECT) - target_compile_definitions(testExePluginHelperObj INTERFACE testExePluginHelperObj_NO_OBJECT) -endif() - # Test exporting dependent libraries into different exports add_library(testLibRequired testLibRequired.c) add_library(testLibDepends testLibDepends.c) @@ -554,9 +544,6 @@ install( testLibDeprecation testLibCycleA testLibCycleB testLibNoSONAME - testStaticLibWithPlugin testStaticLibPluginExtra testStaticLibPlugin - testSharedLibWithHelper testSharedLibHelperObj - testExeWithPluginHelper testExePluginHelperObj testMod1 testMod2 cmp0022NEW cmp0022OLD TopDirLib SubDirLinkA @@ -632,9 +619,6 @@ export(TARGETS testExe2 testLib4 testLib5 testLib6 testLib7 testExe3 testExe4 te testLib4lib testLib4libdbg testLib4libopt testLibCycleA testLibCycleB testLibNoSONAME - testStaticLibWithPlugin testStaticLibPluginExtra testStaticLibPlugin - testSharedLibWithHelper testSharedLibHelperObj - testExeWithPluginHelper testExePluginHelperObj testMod1 testMod2 testLibPerConfigDest NAMESPACE bld_ diff --git a/Tests/ExportImport/Import/A/CMakeLists.txt b/Tests/ExportImport/Import/A/CMakeLists.txt index 272c7a9..d6cc8d0 100644 --- a/Tests/ExportImport/Import/A/CMakeLists.txt +++ b/Tests/ExportImport/Import/A/CMakeLists.txt @@ -68,23 +68,16 @@ target_link_libraries(imp_testExe1 exp_testLib7 exp_testLibCycleA exp_testLibPerConfigDest - exp_testStaticLibWithPlugin ) add_library(imp_testInterfaceInclude1 STATIC imp_testInterfaceInclude1.c) target_include_directories(imp_testInterfaceInclude1 SYSTEM PRIVATE testInterfaceIncludeSystem) target_link_libraries(imp_testInterfaceInclude1 PRIVATE exp_testInterfaceIncludeUser) -add_executable(imp_UseSharedLibWithHelper1 ../../../InterfaceLinkLibrariesDirect/UseSharedLibWithHelper.c) -target_link_libraries(imp_UseSharedLibWithHelper1 PRIVATE exp_testSharedLibWithHelper testSharedLibHelperExclude) - # Try building a plugin to an executable imported from the install tree. add_library(imp_mod1 MODULE imp_mod1.c) target_link_libraries(imp_mod1 exp_testExe2) -add_library(imp_ExePlugin1 MODULE ../../../InterfaceLinkLibrariesDirect/ExePlugin.c) -target_link_libraries(imp_ExePlugin1 PRIVATE exp_testExeWithPluginHelper testExePluginHelperExclude) - # Try referencing an executable imported from the build tree. add_custom_command( OUTPUT ${Import_BINARY_DIR}/bld_generated.c @@ -119,7 +112,6 @@ target_link_libraries(imp_testExe1b bld_testLib7 bld_testLibCycleA bld_testLibPerConfigDest - bld_testStaticLibWithPlugin ) add_library(imp_testInterfaceInclude1b STATIC imp_testInterfaceInclude1.c) @@ -191,16 +183,10 @@ target_link_libraries(SubDirLink_bld PRIVATE bld_TopDirLib bld_SubDirLinkA) add_executable(SubDirLink_exp SubDirLink.c) target_link_libraries(SubDirLink_exp PRIVATE exp_TopDirLib exp_SubDirLinkA) -add_executable(imp_UseSharedLibWithHelper1b ../../../InterfaceLinkLibrariesDirect/UseSharedLibWithHelper.c) -target_link_libraries(imp_UseSharedLibWithHelper1b PRIVATE bld_testSharedLibWithHelper testSharedLibHelperExclude) - # Try building a plugin to an executable imported from the build tree. add_library(imp_mod1b MODULE imp_mod1.c) target_link_libraries(imp_mod1b bld_testExe2) -add_library(imp_ExePlugin1b MODULE ../../../InterfaceLinkLibrariesDirect/ExePlugin.c) -target_link_libraries(imp_ExePlugin1b PRIVATE bld_testExeWithPluginHelper testExePluginHelperExclude) - # Export/CMakeLists.txt pretends the RelWithDebInfo (as well as Debug) # configuration should link to debug libs. foreach(c DEBUG RELWITHDEBINFO) diff --git a/Tests/ExportImport/Import/A/imp_testExe1.c b/Tests/ExportImport/Import/A/imp_testExe1.c index 7490a80..8173557 100644 --- a/Tests/ExportImport/Import/A/imp_testExe1.c +++ b/Tests/ExportImport/Import/A/imp_testExe1.c @@ -10,7 +10,6 @@ extern int testLib6(void); extern int testLib7(void); extern int testLibCycleA1(void); extern int testLibPerConfigDest(void); -extern int testStaticLibPlugin(void); /* Switch a symbol between debug and optimized builds to make sure the proper library is found from the testLib4 link interface. */ @@ -25,7 +24,6 @@ int main() { return (testLib2() + generated_by_testExe1() + testLib3() + testLib4() + testLib5() + testLib6() + testLib7() + testLibCycleA1() + - testLibPerConfigDest() + testStaticLibPlugin() + - generated_by_testExe3() + generated_by_testExe4() + testLib4lib() + - testLib4libcfg()); + testLibPerConfigDest() + generated_by_testExe3() + + generated_by_testExe4() + testLib4lib() + testLib4libcfg()); } diff --git a/Tests/InterfaceLinkLibrariesDirect/CMakeLists.txt b/Tests/InterfaceLinkLibrariesDirect/CMakeLists.txt deleted file mode 100644 index b06a2fb..0000000 --- a/Tests/InterfaceLinkLibrariesDirect/CMakeLists.txt +++ /dev/null @@ -1,156 +0,0 @@ -cmake_minimum_required(VERSION 3.21) -project(InterfaceLinkLibrariesDirect C) - -include(testStaticLibPlugin.cmake) -add_executable(InterfaceLinkLibrariesDirect main.c) -target_link_libraries(InterfaceLinkLibrariesDirect PRIVATE testStaticLibWithPlugin) - -include(testSharedLibWithHelper.cmake) -add_executable(UseSharedLibWithHelper UseSharedLibWithHelper.c) -target_link_libraries(UseSharedLibWithHelper PRIVATE testSharedLibWithHelper testSharedLibHelperExclude) - -include(testExeWithPluginHelper.cmake) -add_library(ExePlugin MODULE ExePlugin.c) -target_link_libraries(ExePlugin PRIVATE testExeWithPluginHelper testExePluginHelperExclude) - -#---------------------------------------------------------------------------- - -# Offer usage requirements and symbols to be used through static libs below. -add_library(A STATIC - a_always.c - - # Good symbols that direct_from_A libraries poison if incorrectly used. - a_not_direct_from_A.c - a_not_direct_from_A_for_exe.c - a_not_direct_from_A_optional.c - - # Bad symbols in direct_from_A libraries below to ensure they come first. - a_poison_direct_from_A.c - a_poison_direct_from_A_for_exe.c - a_poison_direct_from_A_optional.c - ) - -# Propagates as usage requirement from A. -add_library(direct_from_A STATIC direct_from_A.c direct_from_A_poison.c) -target_compile_definitions(direct_from_A INTERFACE DEF_DIRECT_FROM_A) -set_property(TARGET A APPEND PROPERTY INTERFACE_LINK_LIBRARIES_DIRECT direct_from_A) - -# Propagates as usage requirement from A, but only for executables. -add_library(direct_from_A_for_exe STATIC direct_from_A_for_exe.c direct_from_A_for_exe_poison.c) -target_compile_definitions(direct_from_A_for_exe INTERFACE DEF_DIRECT_FROM_A_FOR_EXE) -set_property(TARGET A APPEND PROPERTY INTERFACE_LINK_LIBRARIES_DIRECT - "$<$<STREQUAL:$<TARGET_PROPERTY:TYPE>,EXECUTABLE>:direct_from_A_for_exe>") - -# Propagates as usage requirement from A, but only for targets that opt-in. -add_library(direct_from_A_optional STATIC direct_from_A_optional.c direct_from_A_optional_poison.c) -target_compile_definitions(direct_from_A_optional INTERFACE DEF_DIRECT_FROM_A_OPTIONAL) -set_property(TARGET A APPEND PROPERTY INTERFACE_LINK_LIBRARIES_DIRECT - "$<$<BOOL:$<TARGET_PROPERTY:A_LINK_OPTIONAL>>:direct_from_A_optional>") - -# Uses and propagates A's usage requirements. -# Does not use the exe-only or optional usage requirements. -add_library(static_A_public STATIC static_A_public.c) -target_link_libraries(static_A_public PUBLIC A) - -# Uses A's usage requirements, but does not propagate them. -# Does not use the exe-only usage requirement. Does use the optional one. -add_library(static_A_private STATIC static_A_private.c) -target_link_libraries(static_A_private PRIVATE A) -set_property(TARGET static_A_private PROPERTY A_LINK_OPTIONAL 1) - -# Uses A's usage requirements, including an optional one. -add_executable(exe_use_static_A_public exe_use_static_A_public.c) -target_link_libraries(exe_use_static_A_public PRIVATE static_A_public) -set_property(TARGET exe_use_static_A_public PROPERTY A_LINK_OPTIONAL 1) - -# Does not use A's usage requirements. -add_executable(exe_use_static_A_private exe_use_static_A_private.c) -target_link_libraries(exe_use_static_A_private PRIVATE static_A_private) - -#---------------------------------------------------------------------------- - -# Test how original and injected dependencies get ordered. - -# A bunch of static libraries that need to be linked in alphabetic order. -# Each library has an extra source to poison all symbols meant to be -# provided by earlier libraries. This enforces ordering on platforms -# whose linkers re-visit static libraries. -add_library(order_A STATIC order_A.c) -add_library(order_B STATIC order_B.c order_B_poison.c) -add_library(order_C STATIC order_C.c order_C_poison.c) -add_library(order_D STATIC order_D.c order_D_poison.c) -add_library(order_E STATIC order_E.c order_E_poison.c) -add_library(order_F STATIC order_F.c order_F_poison.c) -add_library(order_G STATIC order_G.c order_G_poison.c) -add_library(order_H STATIC order_H.c order_H_poison.c) -add_library(order_I STATIC order_I.c order_I_poison.c) -add_library(order_J STATIC order_J.c order_J_poison.c) - -# An executable to drive linking. -add_executable(order_main order_main.c) - -# In the following diagram, connection by a slash means the top -# target lists the bottom target in a link interface property: -# -# \ => INTERFACE_LINK_LIBRARIES -# / => INTERFACE_LINK_LIBRARIES_DIRECT -# -# The top of each tree represents an entry in the exe's LINK_LIBRARIES. -# CMake should evaluate this graph to generate the proper link order. -# -# D H -# / \ / \ -# B J F I -# / / / / \ -# A C E G J -set_property(TARGET order_main PROPERTY LINK_LIBRARIES order_D order_H) -set_property(TARGET order_D PROPERTY INTERFACE_LINK_LIBRARIES_DIRECT order_B) -set_property(TARGET order_D PROPERTY INTERFACE_LINK_LIBRARIES order_J) -set_property(TARGET order_B PROPERTY INTERFACE_LINK_LIBRARIES_DIRECT order_A) -set_property(TARGET order_J PROPERTY INTERFACE_LINK_LIBRARIES_DIRECT order_C) -set_property(TARGET order_H PROPERTY INTERFACE_LINK_LIBRARIES_DIRECT order_F) -set_property(TARGET order_H PROPERTY INTERFACE_LINK_LIBRARIES order_I) -set_property(TARGET order_F PROPERTY INTERFACE_LINK_LIBRARIES_DIRECT order_E) -set_property(TARGET order_I PROPERTY INTERFACE_LINK_LIBRARIES_DIRECT order_G) -set_property(TARGET order_I PROPERTY INTERFACE_LINK_LIBRARIES order_J) - -#---------------------------------------------------------------------------- - -# Test that the original LINK_LIBRARIES cannot be re-ordered by injection -# from usage requirements. - -# A bunch of static libraries that need to be linked in alphabetic order. -# Each library has an extra source to poison all symbols meant to be -# provided by earlier libraries. This enforces ordering on platforms -# whose linkers re-visit static libraries. -add_library(force_A STATIC order_A.c) -add_library(force_B STATIC order_B.c order_B_poison.c) -add_library(force_C STATIC order_C.c order_C_poison.c) -add_library(force_D STATIC order_D.c order_D_poison.c) -add_library(force_E STATIC order_E.c order_E_poison.c) -add_library(force_F STATIC order_F.c order_F_poison.c) -add_library(force_G STATIC order_G.c order_G_poison.c) -add_library(force_H STATIC order_H.c order_H_poison.c) -add_library(force_I STATIC order_I.c order_I_poison.c) -add_library(force_J STATIC order_J.c order_J_poison.c) - -# An executable to drive linking. -add_executable(force_main order_main.c) - -# The executable explicitly lists all the libraries in the right order. -target_link_libraries(force_main PRIVATE force_A force_B force_C force_D force_E force_F force_G force_H) - -# Add legitimate normal dependencies. -set_property(TARGET force_D PROPERTY INTERFACE_LINK_LIBRARIES force_J) -set_property(TARGET force_H PROPERTY INTERFACE_LINK_LIBRARIES force_I) -set_property(TARGET force_I PROPERTY INTERFACE_LINK_LIBRARIES force_J) - -# Add bogus injected direct dependencies to verify that they do not -# change the original order of LINK_LIBRARIES. -set_property(TARGET force_A PROPERTY INTERFACE_LINK_LIBRARIES_DIRECT force_B) -set_property(TARGET force_B PROPERTY INTERFACE_LINK_LIBRARIES_DIRECT force_C) -set_property(TARGET force_C PROPERTY INTERFACE_LINK_LIBRARIES_DIRECT force_D) -set_property(TARGET force_D PROPERTY INTERFACE_LINK_LIBRARIES_DIRECT force_E) -set_property(TARGET force_E PROPERTY INTERFACE_LINK_LIBRARIES_DIRECT force_F) -set_property(TARGET force_F PROPERTY INTERFACE_LINK_LIBRARIES_DIRECT force_G) -set_property(TARGET force_G PROPERTY INTERFACE_LINK_LIBRARIES_DIRECT force_H) diff --git a/Tests/InterfaceLinkLibrariesDirect/ExePlugin.c b/Tests/InterfaceLinkLibrariesDirect/ExePlugin.c deleted file mode 100644 index 40a261c..0000000 --- a/Tests/InterfaceLinkLibrariesDirect/ExePlugin.c +++ /dev/null @@ -1,21 +0,0 @@ -extern int testExePluginHelperObj(int n); - -#ifdef testExePluginHelperObj_NO_OBJECT -int testExePluginHelperObj(int n) -{ - return n; -} -#endif - -#if defined(_WIN32) -__declspec(dllimport) -#endif - int testExePluginAPI(int n); - -#if defined(_WIN32) -__declspec(dllexport) -#endif - int testExePlugin(int n) -{ - return testExePluginAPI(n) + testExePluginHelperObj(n); -} diff --git a/Tests/InterfaceLinkLibrariesDirect/UseSharedLibWithHelper.c b/Tests/InterfaceLinkLibrariesDirect/UseSharedLibWithHelper.c deleted file mode 100644 index 832e31f..0000000 --- a/Tests/InterfaceLinkLibrariesDirect/UseSharedLibWithHelper.c +++ /dev/null @@ -1,18 +0,0 @@ -extern int testSharedLibHelperObj(int n); - -#ifdef testSharedLibHelperObj_NO_OBJECT -int testSharedLibHelperObj(int n) -{ - return n; -} -#endif - -#if defined(_WIN32) -__declspec(dllimport) -#endif - int testSharedLibWithHelper(int n); - -int main(void) -{ - return testSharedLibWithHelper(0) + testSharedLibHelperObj(0); -} diff --git a/Tests/InterfaceLinkLibrariesDirect/a_always.c b/Tests/InterfaceLinkLibrariesDirect/a_always.c deleted file mode 100644 index 007680d..0000000 --- a/Tests/InterfaceLinkLibrariesDirect/a_always.c +++ /dev/null @@ -1,3 +0,0 @@ -void a_always(void) -{ -} diff --git a/Tests/InterfaceLinkLibrariesDirect/a_not_direct_from_A.c b/Tests/InterfaceLinkLibrariesDirect/a_not_direct_from_A.c deleted file mode 100644 index 732d36e..0000000 --- a/Tests/InterfaceLinkLibrariesDirect/a_not_direct_from_A.c +++ /dev/null @@ -1,3 +0,0 @@ -void not_direct_from_A(void) -{ -} diff --git a/Tests/InterfaceLinkLibrariesDirect/a_not_direct_from_A_for_exe.c b/Tests/InterfaceLinkLibrariesDirect/a_not_direct_from_A_for_exe.c deleted file mode 100644 index 9aed296..0000000 --- a/Tests/InterfaceLinkLibrariesDirect/a_not_direct_from_A_for_exe.c +++ /dev/null @@ -1,3 +0,0 @@ -void not_direct_from_A_for_exe(void) -{ -} diff --git a/Tests/InterfaceLinkLibrariesDirect/a_not_direct_from_A_optional.c b/Tests/InterfaceLinkLibrariesDirect/a_not_direct_from_A_optional.c deleted file mode 100644 index 3572e51..0000000 --- a/Tests/InterfaceLinkLibrariesDirect/a_not_direct_from_A_optional.c +++ /dev/null @@ -1,3 +0,0 @@ -void not_direct_from_A_optional(void) -{ -} diff --git a/Tests/InterfaceLinkLibrariesDirect/a_poison_direct_from_A.c b/Tests/InterfaceLinkLibrariesDirect/a_poison_direct_from_A.c deleted file mode 100644 index 6d1963d..0000000 --- a/Tests/InterfaceLinkLibrariesDirect/a_poison_direct_from_A.c +++ /dev/null @@ -1,5 +0,0 @@ -extern void poison_direct_from_A(void); -void direct_from_A(void) -{ - poison_direct_from_A(); -} diff --git a/Tests/InterfaceLinkLibrariesDirect/a_poison_direct_from_A_for_exe.c b/Tests/InterfaceLinkLibrariesDirect/a_poison_direct_from_A_for_exe.c deleted file mode 100644 index 623fc07..0000000 --- a/Tests/InterfaceLinkLibrariesDirect/a_poison_direct_from_A_for_exe.c +++ /dev/null @@ -1,5 +0,0 @@ -extern void poison_direct_from_A_for_exe(void); -void direct_from_A_for_exe(void) -{ - poison_direct_from_A_for_exe(); -} diff --git a/Tests/InterfaceLinkLibrariesDirect/a_poison_direct_from_A_optional.c b/Tests/InterfaceLinkLibrariesDirect/a_poison_direct_from_A_optional.c deleted file mode 100644 index 0f1328e..0000000 --- a/Tests/InterfaceLinkLibrariesDirect/a_poison_direct_from_A_optional.c +++ /dev/null @@ -1,5 +0,0 @@ -extern void poison_direct_from_A_optional(void); -void direct_from_A_optional(void) -{ - poison_direct_from_A_optional(); -} diff --git a/Tests/InterfaceLinkLibrariesDirect/direct_from_A.c b/Tests/InterfaceLinkLibrariesDirect/direct_from_A.c deleted file mode 100644 index d6d0df3..0000000 --- a/Tests/InterfaceLinkLibrariesDirect/direct_from_A.c +++ /dev/null @@ -1,3 +0,0 @@ -void direct_from_A(void) -{ -} diff --git a/Tests/InterfaceLinkLibrariesDirect/direct_from_A_for_exe.c b/Tests/InterfaceLinkLibrariesDirect/direct_from_A_for_exe.c deleted file mode 100644 index dfa6db1..0000000 --- a/Tests/InterfaceLinkLibrariesDirect/direct_from_A_for_exe.c +++ /dev/null @@ -1,3 +0,0 @@ -void direct_from_A_for_exe(void) -{ -} diff --git a/Tests/InterfaceLinkLibrariesDirect/direct_from_A_for_exe_poison.c b/Tests/InterfaceLinkLibrariesDirect/direct_from_A_for_exe_poison.c deleted file mode 100644 index c0ecb0b..0000000 --- a/Tests/InterfaceLinkLibrariesDirect/direct_from_A_for_exe_poison.c +++ /dev/null @@ -1,5 +0,0 @@ -extern void poison_not_direct_from_A_for_exe(void); -void not_direct_from_A_for_exe(void) -{ - poison_not_direct_from_A_for_exe(); -} diff --git a/Tests/InterfaceLinkLibrariesDirect/direct_from_A_optional.c b/Tests/InterfaceLinkLibrariesDirect/direct_from_A_optional.c deleted file mode 100644 index affdaeb..0000000 --- a/Tests/InterfaceLinkLibrariesDirect/direct_from_A_optional.c +++ /dev/null @@ -1,3 +0,0 @@ -void direct_from_A_optional(void) -{ -} diff --git a/Tests/InterfaceLinkLibrariesDirect/direct_from_A_optional_poison.c b/Tests/InterfaceLinkLibrariesDirect/direct_from_A_optional_poison.c deleted file mode 100644 index c7c3528..0000000 --- a/Tests/InterfaceLinkLibrariesDirect/direct_from_A_optional_poison.c +++ /dev/null @@ -1,5 +0,0 @@ -extern void poison_not_direct_from_A_optional(void); -void not_direct_from_A_optional(void) -{ - poison_not_direct_from_A_optional(); -} diff --git a/Tests/InterfaceLinkLibrariesDirect/direct_from_A_poison.c b/Tests/InterfaceLinkLibrariesDirect/direct_from_A_poison.c deleted file mode 100644 index b03cdf7..0000000 --- a/Tests/InterfaceLinkLibrariesDirect/direct_from_A_poison.c +++ /dev/null @@ -1,5 +0,0 @@ -extern void poison_not_direct_from_A(void); -void not_direct_from_A(void) -{ - poison_not_direct_from_A(); -} diff --git a/Tests/InterfaceLinkLibrariesDirect/exe_use_static_A_private.c b/Tests/InterfaceLinkLibrariesDirect/exe_use_static_A_private.c deleted file mode 100644 index 024e96e..0000000 --- a/Tests/InterfaceLinkLibrariesDirect/exe_use_static_A_private.c +++ /dev/null @@ -1,23 +0,0 @@ -#ifdef DEF_DIRECT_FROM_A -# error "DEF_DIRECT_FROM_A incorrectly defined" -#endif -#ifdef DEF_DIRECT_FROM_A_FOR_EXE -# error "DEF_DIRECT_FROM_A_FOR_EXE incorrectly defined" -#endif -#ifdef DEF_DIRECT_FROM_A_OPTIONAL -# error "DEF_DIRECT_FROM_A_OPTIONAL incorrectly defined" -#endif - -extern void static_A_private(void); -extern void not_direct_from_A(void); -extern void not_direct_from_A_for_exe(void); -extern void not_direct_from_A_optional(void); - -int main(void) -{ - static_A_private(); - not_direct_from_A(); - not_direct_from_A_for_exe(); - not_direct_from_A_optional(); - return 0; -} diff --git a/Tests/InterfaceLinkLibrariesDirect/exe_use_static_A_public.c b/Tests/InterfaceLinkLibrariesDirect/exe_use_static_A_public.c deleted file mode 100644 index b3b0a56..0000000 --- a/Tests/InterfaceLinkLibrariesDirect/exe_use_static_A_public.c +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef DEF_DIRECT_FROM_A -# error "DEF_DIRECT_FROM_A incorrectly not defined" -#endif -#ifndef DEF_DIRECT_FROM_A_FOR_EXE -# error "DEF_DIRECT_FROM_A_FOR_EXE incorrectly not defined" -#endif -#ifndef DEF_DIRECT_FROM_A_OPTIONAL -# error "DEF_DIRECT_FROM_A_OPTIONAL incorrectly not defined" -#endif - -extern void static_A_public(void); -extern void direct_from_A(void); -extern void direct_from_A_for_exe(void); -extern void direct_from_A_optional(void); - -int main(void) -{ - static_A_public(); - direct_from_A(); - direct_from_A_for_exe(); - direct_from_A_optional(); - return 0; -} diff --git a/Tests/InterfaceLinkLibrariesDirect/main.c b/Tests/InterfaceLinkLibrariesDirect/main.c deleted file mode 100644 index 53f0e6d..0000000 --- a/Tests/InterfaceLinkLibrariesDirect/main.c +++ /dev/null @@ -1,5 +0,0 @@ -extern int testStaticLibPlugin(void); -int main(void) -{ - return testStaticLibPlugin(); -} diff --git a/Tests/InterfaceLinkLibrariesDirect/order_A.c b/Tests/InterfaceLinkLibrariesDirect/order_A.c deleted file mode 100644 index 2cd4d60..0000000 --- a/Tests/InterfaceLinkLibrariesDirect/order_A.c +++ /dev/null @@ -1,5 +0,0 @@ -extern void order_B(void); -void order_A(void) -{ - order_B(); -} diff --git a/Tests/InterfaceLinkLibrariesDirect/order_B.c b/Tests/InterfaceLinkLibrariesDirect/order_B.c deleted file mode 100644 index 1787f1d..0000000 --- a/Tests/InterfaceLinkLibrariesDirect/order_B.c +++ /dev/null @@ -1,5 +0,0 @@ -extern void order_C(void); -void order_B(void) -{ - order_C(); -} diff --git a/Tests/InterfaceLinkLibrariesDirect/order_B_poison.c b/Tests/InterfaceLinkLibrariesDirect/order_B_poison.c deleted file mode 100644 index bcb7b4b..0000000 --- a/Tests/InterfaceLinkLibrariesDirect/order_B_poison.c +++ /dev/null @@ -1,6 +0,0 @@ -extern void order_B_poison(void); - -void order_A(void) -{ - order_B_poison(); -} diff --git a/Tests/InterfaceLinkLibrariesDirect/order_C.c b/Tests/InterfaceLinkLibrariesDirect/order_C.c deleted file mode 100644 index e67e719..0000000 --- a/Tests/InterfaceLinkLibrariesDirect/order_C.c +++ /dev/null @@ -1,5 +0,0 @@ -extern void order_D(void); -void order_C(void) -{ - order_D(); -} diff --git a/Tests/InterfaceLinkLibrariesDirect/order_C_poison.c b/Tests/InterfaceLinkLibrariesDirect/order_C_poison.c deleted file mode 100644 index fc31104..0000000 --- a/Tests/InterfaceLinkLibrariesDirect/order_C_poison.c +++ /dev/null @@ -1,11 +0,0 @@ -extern void order_C_poison(void); - -void order_A(void) -{ - order_C_poison(); -} - -void order_B(void) -{ - order_C_poison(); -} diff --git a/Tests/InterfaceLinkLibrariesDirect/order_D.c b/Tests/InterfaceLinkLibrariesDirect/order_D.c deleted file mode 100644 index f5bb2d6..0000000 --- a/Tests/InterfaceLinkLibrariesDirect/order_D.c +++ /dev/null @@ -1,5 +0,0 @@ -extern void order_E(void); -void order_D(void) -{ - order_E(); -} diff --git a/Tests/InterfaceLinkLibrariesDirect/order_D_poison.c b/Tests/InterfaceLinkLibrariesDirect/order_D_poison.c deleted file mode 100644 index d2d64e6..0000000 --- a/Tests/InterfaceLinkLibrariesDirect/order_D_poison.c +++ /dev/null @@ -1,16 +0,0 @@ -extern void order_D_poison(void); - -void order_A(void) -{ - order_D_poison(); -} - -void order_B(void) -{ - order_D_poison(); -} - -void order_C(void) -{ - order_D_poison(); -} diff --git a/Tests/InterfaceLinkLibrariesDirect/order_E.c b/Tests/InterfaceLinkLibrariesDirect/order_E.c deleted file mode 100644 index 2a56443..0000000 --- a/Tests/InterfaceLinkLibrariesDirect/order_E.c +++ /dev/null @@ -1,5 +0,0 @@ -extern void order_F(void); -void order_E(void) -{ - order_F(); -} diff --git a/Tests/InterfaceLinkLibrariesDirect/order_E_poison.c b/Tests/InterfaceLinkLibrariesDirect/order_E_poison.c deleted file mode 100644 index 7d8b53e..0000000 --- a/Tests/InterfaceLinkLibrariesDirect/order_E_poison.c +++ /dev/null @@ -1,21 +0,0 @@ -extern void order_E_poison(void); - -void order_A(void) -{ - order_E_poison(); -} - -void order_B(void) -{ - order_E_poison(); -} - -void order_C(void) -{ - order_E_poison(); -} - -void order_D(void) -{ - order_E_poison(); -} diff --git a/Tests/InterfaceLinkLibrariesDirect/order_F.c b/Tests/InterfaceLinkLibrariesDirect/order_F.c deleted file mode 100644 index d242284..0000000 --- a/Tests/InterfaceLinkLibrariesDirect/order_F.c +++ /dev/null @@ -1,5 +0,0 @@ -extern void order_G(void); -void order_F(void) -{ - order_G(); -} diff --git a/Tests/InterfaceLinkLibrariesDirect/order_F_poison.c b/Tests/InterfaceLinkLibrariesDirect/order_F_poison.c deleted file mode 100644 index 285f247..0000000 --- a/Tests/InterfaceLinkLibrariesDirect/order_F_poison.c +++ /dev/null @@ -1,26 +0,0 @@ -extern void order_F_poison(void); - -void order_A(void) -{ - order_F_poison(); -} - -void order_B(void) -{ - order_F_poison(); -} - -void order_C(void) -{ - order_F_poison(); -} - -void order_D(void) -{ - order_F_poison(); -} - -void order_E(void) -{ - order_F_poison(); -} diff --git a/Tests/InterfaceLinkLibrariesDirect/order_G.c b/Tests/InterfaceLinkLibrariesDirect/order_G.c deleted file mode 100644 index ff71038..0000000 --- a/Tests/InterfaceLinkLibrariesDirect/order_G.c +++ /dev/null @@ -1,5 +0,0 @@ -extern void order_H(void); -void order_G(void) -{ - order_H(); -} diff --git a/Tests/InterfaceLinkLibrariesDirect/order_G_poison.c b/Tests/InterfaceLinkLibrariesDirect/order_G_poison.c deleted file mode 100644 index 3a1fe1d..0000000 --- a/Tests/InterfaceLinkLibrariesDirect/order_G_poison.c +++ /dev/null @@ -1,31 +0,0 @@ -extern void order_G_poison(void); - -void order_A(void) -{ - order_G_poison(); -} - -void order_B(void) -{ - order_G_poison(); -} - -void order_C(void) -{ - order_G_poison(); -} - -void order_D(void) -{ - order_G_poison(); -} - -void order_E(void) -{ - order_G_poison(); -} - -void order_F(void) -{ - order_G_poison(); -} diff --git a/Tests/InterfaceLinkLibrariesDirect/order_H.c b/Tests/InterfaceLinkLibrariesDirect/order_H.c deleted file mode 100644 index 9c62bb1..0000000 --- a/Tests/InterfaceLinkLibrariesDirect/order_H.c +++ /dev/null @@ -1,5 +0,0 @@ -extern void order_I(void); -void order_H(void) -{ - order_I(); -} diff --git a/Tests/InterfaceLinkLibrariesDirect/order_H_poison.c b/Tests/InterfaceLinkLibrariesDirect/order_H_poison.c deleted file mode 100644 index 0c6b84f..0000000 --- a/Tests/InterfaceLinkLibrariesDirect/order_H_poison.c +++ /dev/null @@ -1,36 +0,0 @@ -extern void order_H_poison(void); - -void order_A(void) -{ - order_H_poison(); -} - -void order_B(void) -{ - order_H_poison(); -} - -void order_C(void) -{ - order_H_poison(); -} - -void order_D(void) -{ - order_H_poison(); -} - -void order_E(void) -{ - order_H_poison(); -} - -void order_F(void) -{ - order_H_poison(); -} - -void order_G(void) -{ - order_H_poison(); -} diff --git a/Tests/InterfaceLinkLibrariesDirect/order_I.c b/Tests/InterfaceLinkLibrariesDirect/order_I.c deleted file mode 100644 index 96152de..0000000 --- a/Tests/InterfaceLinkLibrariesDirect/order_I.c +++ /dev/null @@ -1,5 +0,0 @@ -extern void order_J(void); -void order_I(void) -{ - order_J(); -} diff --git a/Tests/InterfaceLinkLibrariesDirect/order_I_poison.c b/Tests/InterfaceLinkLibrariesDirect/order_I_poison.c deleted file mode 100644 index 3fabe1f..0000000 --- a/Tests/InterfaceLinkLibrariesDirect/order_I_poison.c +++ /dev/null @@ -1,41 +0,0 @@ -extern void order_I_poison(void); - -void order_A(void) -{ - order_I_poison(); -} - -void order_B(void) -{ - order_I_poison(); -} - -void order_C(void) -{ - order_I_poison(); -} - -void order_D(void) -{ - order_I_poison(); -} - -void order_E(void) -{ - order_I_poison(); -} - -void order_F(void) -{ - order_I_poison(); -} - -void order_G(void) -{ - order_I_poison(); -} - -void order_H(void) -{ - order_I_poison(); -} diff --git a/Tests/InterfaceLinkLibrariesDirect/order_J.c b/Tests/InterfaceLinkLibrariesDirect/order_J.c deleted file mode 100644 index 49eec47..0000000 --- a/Tests/InterfaceLinkLibrariesDirect/order_J.c +++ /dev/null @@ -1,3 +0,0 @@ -void order_J(void) -{ -} diff --git a/Tests/InterfaceLinkLibrariesDirect/order_J_poison.c b/Tests/InterfaceLinkLibrariesDirect/order_J_poison.c deleted file mode 100644 index 9724fd5..0000000 --- a/Tests/InterfaceLinkLibrariesDirect/order_J_poison.c +++ /dev/null @@ -1,46 +0,0 @@ -extern void order_J_poison(void); - -void order_A(void) -{ - order_J_poison(); -} - -void order_B(void) -{ - order_J_poison(); -} - -void order_C(void) -{ - order_J_poison(); -} - -void order_D(void) -{ - order_J_poison(); -} - -void order_E(void) -{ - order_J_poison(); -} - -void order_F(void) -{ - order_J_poison(); -} - -void order_G(void) -{ - order_J_poison(); -} - -void order_H(void) -{ - order_J_poison(); -} - -void order_I(void) -{ - order_J_poison(); -} diff --git a/Tests/InterfaceLinkLibrariesDirect/order_main.c b/Tests/InterfaceLinkLibrariesDirect/order_main.c deleted file mode 100644 index eed2453..0000000 --- a/Tests/InterfaceLinkLibrariesDirect/order_main.c +++ /dev/null @@ -1,6 +0,0 @@ -extern void order_A(void); -int main(void) -{ - order_A(); - return 0; -} diff --git a/Tests/InterfaceLinkLibrariesDirect/static_A_private.c b/Tests/InterfaceLinkLibrariesDirect/static_A_private.c deleted file mode 100644 index d98a22c..0000000 --- a/Tests/InterfaceLinkLibrariesDirect/static_A_private.c +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef DEF_DIRECT_FROM_A -# error "DEF_DIRECT_FROM_A incorrectly not defined" -#endif -#ifdef DEF_DIRECT_FROM_A_FOR_EXE -# error "DEF_DIRECT_FROM_A_FOR_EXE incorrectly defined" -#endif -#ifndef DEF_DIRECT_FROM_A_OPTIONAL -# error "DEF_DIRECT_FROM_A_OPTIONAL incorrectly not defined" -#endif - -extern void a_always(void); - -void static_A_private(void) -{ - a_always(); -} diff --git a/Tests/InterfaceLinkLibrariesDirect/static_A_public.c b/Tests/InterfaceLinkLibrariesDirect/static_A_public.c deleted file mode 100644 index ed88ca6..0000000 --- a/Tests/InterfaceLinkLibrariesDirect/static_A_public.c +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef DEF_DIRECT_FROM_A -# error "DEF_DIRECT_FROM_A incorrectly not defined" -#endif -#ifdef DEF_DIRECT_FROM_A_FOR_EXE -# error "DEF_DIRECT_FROM_A_FOR_EXE incorrectly defined" -#endif -#ifdef DEF_DIRECT_FROM_A_OPTIONAL -# error "DEF_DIRECT_FROM_A_OPTIONAL incorrectly defined" -#endif - -extern void a_always(void); - -void static_A_public(void) -{ - a_always(); -} diff --git a/Tests/InterfaceLinkLibrariesDirect/testExePluginHelperObj.c b/Tests/InterfaceLinkLibrariesDirect/testExePluginHelperObj.c deleted file mode 100644 index 49c495f..0000000 --- a/Tests/InterfaceLinkLibrariesDirect/testExePluginHelperObj.c +++ /dev/null @@ -1,4 +0,0 @@ -int testExePluginHelperObj(int n) -{ - return n; -} diff --git a/Tests/InterfaceLinkLibrariesDirect/testExeWithPluginHelper.c b/Tests/InterfaceLinkLibrariesDirect/testExeWithPluginHelper.c deleted file mode 100644 index f8787db..0000000 --- a/Tests/InterfaceLinkLibrariesDirect/testExeWithPluginHelper.c +++ /dev/null @@ -1,12 +0,0 @@ -#ifdef _WIN32 -__declspec(dllexport) -#endif - int testExePluginAPI(int n) -{ - return n; -} - -int main(void) -{ - return 0; -} diff --git a/Tests/InterfaceLinkLibrariesDirect/testExeWithPluginHelper.cmake b/Tests/InterfaceLinkLibrariesDirect/testExeWithPluginHelper.cmake deleted file mode 100644 index 97c5b65..0000000 --- a/Tests/InterfaceLinkLibrariesDirect/testExeWithPluginHelper.cmake +++ /dev/null @@ -1,7 +0,0 @@ -# Logic common to InterfaceLinkLibrariesDirect and ExportImport tests. -set(src ${CMAKE_CURRENT_LIST_DIR}) -add_executable(testExeWithPluginHelper ${src}/testExeWithPluginHelper.c) -add_library(testExePluginHelperObj OBJECT ${src}/testExePluginHelperObj.c) -set_property(TARGET testExeWithPluginHelper PROPERTY ENABLE_EXPORTS 1) -set_property(TARGET testExeWithPluginHelper PROPERTY INTERFACE_LINK_LIBRARIES_DIRECT $<TARGET_NAME:testExePluginHelperObj>) -set_property(TARGET testExeWithPluginHelper PROPERTY INTERFACE_LINK_LIBRARIES_DIRECT_EXCLUDE $<1:testExePluginHelperExclude>) diff --git a/Tests/InterfaceLinkLibrariesDirect/testSharedLibHelperObj.c b/Tests/InterfaceLinkLibrariesDirect/testSharedLibHelperObj.c deleted file mode 100644 index 9d55fcb..0000000 --- a/Tests/InterfaceLinkLibrariesDirect/testSharedLibHelperObj.c +++ /dev/null @@ -1,4 +0,0 @@ -int testSharedLibHelperObj(int n) -{ - return n; -} diff --git a/Tests/InterfaceLinkLibrariesDirect/testSharedLibWithHelper.c b/Tests/InterfaceLinkLibrariesDirect/testSharedLibWithHelper.c deleted file mode 100644 index f942b54..0000000 --- a/Tests/InterfaceLinkLibrariesDirect/testSharedLibWithHelper.c +++ /dev/null @@ -1,7 +0,0 @@ -#ifdef _WIN32 -__declspec(dllexport) -#endif - int testSharedLibWithHelper(int n) -{ - return n; -} diff --git a/Tests/InterfaceLinkLibrariesDirect/testSharedLibWithHelper.cmake b/Tests/InterfaceLinkLibrariesDirect/testSharedLibWithHelper.cmake deleted file mode 100644 index c51751c..0000000 --- a/Tests/InterfaceLinkLibrariesDirect/testSharedLibWithHelper.cmake +++ /dev/null @@ -1,6 +0,0 @@ -# Logic common to InterfaceLinkLibrariesDirect and ExportImport tests. -set(src ${CMAKE_CURRENT_LIST_DIR}) -add_library(testSharedLibWithHelper SHARED ${src}/testSharedLibWithHelper.c) -add_library(testSharedLibHelperObj OBJECT ${src}/testSharedLibHelperObj.c) -set_property(TARGET testSharedLibWithHelper PROPERTY INTERFACE_LINK_LIBRARIES_DIRECT $<TARGET_NAME:testSharedLibHelperObj>) -set_property(TARGET testSharedLibWithHelper PROPERTY INTERFACE_LINK_LIBRARIES_DIRECT_EXCLUDE $<1:testSharedLibHelperExclude>) diff --git a/Tests/InterfaceLinkLibrariesDirect/testStaticLibPlugin.c b/Tests/InterfaceLinkLibrariesDirect/testStaticLibPlugin.c deleted file mode 100644 index 17f643f..0000000 --- a/Tests/InterfaceLinkLibrariesDirect/testStaticLibPlugin.c +++ /dev/null @@ -1,6 +0,0 @@ -extern int testStaticLibWithPlugin1(void); -extern int testStaticLibPluginExtra(void); -int testStaticLibPlugin(void) -{ - return testStaticLibWithPlugin1() + testStaticLibPluginExtra(); -} diff --git a/Tests/InterfaceLinkLibrariesDirect/testStaticLibPlugin.cmake b/Tests/InterfaceLinkLibrariesDirect/testStaticLibPlugin.cmake deleted file mode 100644 index 907872f..0000000 --- a/Tests/InterfaceLinkLibrariesDirect/testStaticLibPlugin.cmake +++ /dev/null @@ -1,14 +0,0 @@ -# Logic common to InterfaceLinkLibrariesDirect and ExportImport tests. -set(src ${CMAKE_CURRENT_LIST_DIR}) -add_library(testStaticLibWithPlugin STATIC - ${src}/testStaticLibWithPlugin1.c # used by testStaticLibPlugin - ${src}/testStaticLibWithPlugin2.c # used by testStaticLibPluginExtra - ${src}/testStaticLibWithPluginBad1.c # link error if not after testStaticLibPlugin - ${src}/testStaticLibWithPluginBad2.c # link error if not after testStaticLibPluginExtra - ) -add_library(testStaticLibPluginExtra STATIC ${src}/testStaticLibPluginExtra.c) -add_library(testStaticLibPlugin STATIC ${src}/testStaticLibPlugin.c) -target_link_libraries(testStaticLibPlugin PUBLIC testStaticLibWithPlugin testStaticLibPluginExtra) -target_link_libraries(testStaticLibPluginExtra PUBLIC testStaticLibWithPlugin) -set_property(TARGET testStaticLibWithPlugin PROPERTY INTERFACE_LINK_LIBRARIES_DIRECT testStaticLibPlugin) -set_property(TARGET testStaticLibWithPlugin PROPERTY INTERFACE_LINK_LIBRARIES_DIRECT_EXCLUDE testStaticLibWithPlugin) diff --git a/Tests/InterfaceLinkLibrariesDirect/testStaticLibPluginExtra.c b/Tests/InterfaceLinkLibrariesDirect/testStaticLibPluginExtra.c deleted file mode 100644 index 11fe0f8..0000000 --- a/Tests/InterfaceLinkLibrariesDirect/testStaticLibPluginExtra.c +++ /dev/null @@ -1,5 +0,0 @@ -extern int testStaticLibWithPlugin2(void); -int testStaticLibPluginExtra(void) -{ - return testStaticLibWithPlugin2(); -} diff --git a/Tests/InterfaceLinkLibrariesDirect/testStaticLibWithPlugin1.c b/Tests/InterfaceLinkLibrariesDirect/testStaticLibWithPlugin1.c deleted file mode 100644 index 5e75dce..0000000 --- a/Tests/InterfaceLinkLibrariesDirect/testStaticLibWithPlugin1.c +++ /dev/null @@ -1,4 +0,0 @@ -int testStaticLibWithPlugin1(void) -{ - return 0; -} diff --git a/Tests/InterfaceLinkLibrariesDirect/testStaticLibWithPlugin2.c b/Tests/InterfaceLinkLibrariesDirect/testStaticLibWithPlugin2.c deleted file mode 100644 index 74ac1ae..0000000 --- a/Tests/InterfaceLinkLibrariesDirect/testStaticLibWithPlugin2.c +++ /dev/null @@ -1,4 +0,0 @@ -int testStaticLibWithPlugin2(void) -{ - return 0; -} diff --git a/Tests/InterfaceLinkLibrariesDirect/testStaticLibWithPluginBad1.c b/Tests/InterfaceLinkLibrariesDirect/testStaticLibWithPluginBad1.c deleted file mode 100644 index b41abc9..0000000 --- a/Tests/InterfaceLinkLibrariesDirect/testStaticLibWithPluginBad1.c +++ /dev/null @@ -1,6 +0,0 @@ -/* Produce an error if if the object compiled from this source is used. */ -extern int testStaticLibWithPlugin_linked_before_testStaticLibPlugin(void); -int testStaticLibPlugin(void) -{ - return testStaticLibWithPlugin_linked_before_testStaticLibPlugin(); -} diff --git a/Tests/InterfaceLinkLibrariesDirect/testStaticLibWithPluginBad2.c b/Tests/InterfaceLinkLibrariesDirect/testStaticLibWithPluginBad2.c deleted file mode 100644 index 43337a5..0000000 --- a/Tests/InterfaceLinkLibrariesDirect/testStaticLibWithPluginBad2.c +++ /dev/null @@ -1,7 +0,0 @@ -/* Produce an error if if the object compiled from this source is used. */ -extern int testStaticLibWithPlugin_linked_before_testStaticLibPluginExtra( - void); -int testStaticLibPluginExtra(void) -{ - return testStaticLibWithPlugin_linked_before_testStaticLibPluginExtra(); -} diff --git a/Tests/ObjectLibrary/Transitive/BarMain.c b/Tests/ObjectLibrary/Transitive/BarMain.c deleted file mode 100644 index aec3e48..0000000 --- a/Tests/ObjectLibrary/Transitive/BarMain.c +++ /dev/null @@ -1,6 +0,0 @@ -extern int BarObject1(void); - -int main(void) -{ - return BarObject1(); -} diff --git a/Tests/ObjectLibrary/Transitive/BarObject1.c b/Tests/ObjectLibrary/Transitive/BarObject1.c deleted file mode 100644 index 2f68386..0000000 --- a/Tests/ObjectLibrary/Transitive/BarObject1.c +++ /dev/null @@ -1,5 +0,0 @@ -extern int BarObject2(void); -int BarObject1(void) -{ - return BarObject2(); -} diff --git a/Tests/ObjectLibrary/Transitive/BarObject2.c b/Tests/ObjectLibrary/Transitive/BarObject2.c deleted file mode 100644 index 881c64a..0000000 --- a/Tests/ObjectLibrary/Transitive/BarObject2.c +++ /dev/null @@ -1,5 +0,0 @@ -extern int BarObject3(void); -int BarObject2(void) -{ - return BarObject3(); -} diff --git a/Tests/ObjectLibrary/Transitive/BarObject3.c b/Tests/ObjectLibrary/Transitive/BarObject3.c deleted file mode 100644 index e557dbc..0000000 --- a/Tests/ObjectLibrary/Transitive/BarObject3.c +++ /dev/null @@ -1,4 +0,0 @@ -int BarObject3(void) -{ - return 0; -} diff --git a/Tests/ObjectLibrary/Transitive/CMakeLists.txt b/Tests/ObjectLibrary/Transitive/CMakeLists.txt index 17247eb..e9f57d4 100644 --- a/Tests/ObjectLibrary/Transitive/CMakeLists.txt +++ b/Tests/ObjectLibrary/Transitive/CMakeLists.txt @@ -9,17 +9,3 @@ add_library(FooObject2 OBJECT FooObject.c) target_link_libraries(FooObject2 INTERFACE FooStatic) add_executable(Transitive2 Transitive.c) target_link_libraries(Transitive2 PRIVATE FooObject2) - -add_library(FooObjectDirect OBJECT FooObject.c) -add_library(FooStaticDirect STATIC FooStatic.c) -set_property(TARGET FooStaticDirect PROPERTY INTERFACE_LINK_LIBRARIES_DIRECT FooObjectDirect) -add_executable(TransitiveDirect Transitive.c) -target_link_libraries(TransitiveDirect PRIVATE FooStaticDirect) - -add_library(BarObject1 OBJECT BarObject1.c) -add_library(BarObject2 OBJECT BarObject2.c) -add_library(BarObject3 OBJECT BarObject3.c) -set_property(TARGET BarObject1 PROPERTY INTERFACE_LINK_LIBRARIES_DIRECT BarObject2) -set_property(TARGET BarObject2 PROPERTY INTERFACE_LINK_LIBRARIES_DIRECT BarObject3) -add_executable(BarMain BarMain.c) -target_link_libraries(BarMain PRIVATE BarObject1) |