Browse Source

LINK_DEPENDS: add support of 'generator expressions'

Marc Chevrier 7 years ago
parent
commit
724bd7790e

+ 5 - 0
Help/prop_tgt/LINK_DEPENDS.rst

@@ -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.

+ 5 - 0
Help/release/dev/LINK_DEPENDS-property.rst

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

+ 11 - 5
Source/cmGeneratorTarget.cxx

@@ -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,

+ 1 - 1
Tests/BuildDepends/Project/CMakeLists.txt

@@ -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}>)