LINK_DEPENDS: add support of 'generator expressions'

This commit is contained in:
Marc Chevrier 2018-06-27 18:36:47 +02:00
parent cc9f88af53
commit 724bd7790e
4 changed files with 22 additions and 6 deletions

View File

@ -10,3 +10,8 @@ linked if any of the named files is newer than it.
This property is supported only by Makefile and Ninja generators. It is
intended to specify dependencies on "linker scripts" for custom Makefile link
rules.
Contents of ``LINK_DEPENDS`` may use "generator expressions" with
the syntax ``$<...>``. See the :manual:`cmake-generator-expressions(7)`
manual for available expressions. See the :manual:`cmake-buildsystem(7)`
manual for more on defining buildsystem properties.

View File

@ -0,0 +1,5 @@
LINK_DEPENDS-property
---------------------
* The :prop_tgt:`LINK_DEPENDS` target property learned to support
:manual:`generator expressions <cmake-generator-expressions(7)>`.

View File

@ -3027,15 +3027,21 @@ void cmGeneratorTarget::GetLinkDepends(std::vector<std::string>& result,
const std::string& config,
const std::string& language) const
{
if (const char* linkDepends = this->GetProperty("LINK_DEPENDS")) {
cmSystemTools::ExpandListArgument(linkDepends, result);
}
std::unordered_set<std::string> uniqueOptions;
std::vector<cmGeneratorTarget::TargetPropertyEntry*> linkDependsEntries;
std::unordered_set<std::string> uniqueOptions;
cmGeneratorExpressionDAGChecker dagChecker(this->GetName(), "LINK_DEPENDS",
nullptr, nullptr);
if (const char* linkDepends = this->GetProperty("LINK_DEPENDS")) {
std::vector<std::string> depends;
cmGeneratorExpression ge;
cmSystemTools::ExpandListArgument(linkDepends, depends);
for (const auto& depend : depends) {
std::unique_ptr<cmCompiledGeneratorExpression> cge = ge.Parse(depend);
linkDependsEntries.push_back(
new cmGeneratorTarget::TargetPropertyEntry(std::move(cge)));
}
}
AddInterfaceEntries(this, config, "INTERFACE_LINK_DEPENDS",
linkDependsEntries);
processLinkDepends(this, linkDependsEntries, result, uniqueOptions,

View File

@ -106,7 +106,7 @@ set_property(
if(TEST_LINK_DEPENDS)
add_executable(linkdep linkdep.cxx)
set_property(TARGET linkdep PROPERTY LINK_DEPENDS ${TEST_LINK_DEPENDS})
set_property(TARGET linkdep PROPERTY LINK_DEPENDS $<1:${TEST_LINK_DEPENDS}>)
add_library(foo_interface INTERFACE)
set_property(TARGET foo_interface PROPERTY INTERFACE_LINK_DEPENDS $<1:${TEST_LINK_DEPENDS}>)