Browse Source

Genex LINK_LIBRARY and LINK_GROUP: check supported properties

Refines check for properties supporting these genex.
Enhance error message.

Fixes: #23699
Marc Chevrier 3 years ago
parent
commit
913ea78d7a
24 changed files with 107 additions and 28 deletions
  1. 8 6
      Help/manual/cmake-generator-expressions.7.rst
  2. 7 3
      Source/cmGeneratorExpressionDAGChecker.cxx
  3. 8 1
      Source/cmGeneratorExpressionDAGChecker.h
  4. 16 6
      Source/cmGeneratorExpressionNode.cxx
  5. 1 0
      Tests/RunCMake/GenEx-LINK_GROUP/RunCMakeTest.cmake
  6. 2 1
      Tests/RunCMake/GenEx-LINK_GROUP/add_custom_command-stderr.txt
  7. 2 1
      Tests/RunCMake/GenEx-LINK_GROUP/add_custom_target-stderr.txt
  8. 2 1
      Tests/RunCMake/GenEx-LINK_GROUP/add_link_options-stderr.txt
  9. 1 0
      Tests/RunCMake/GenEx-LINK_GROUP/invalid-property-result.txt
  10. 10 0
      Tests/RunCMake/GenEx-LINK_GROUP/invalid-property-stderr.txt
  11. 10 0
      Tests/RunCMake/GenEx-LINK_GROUP/invalid-property.cmake
  12. 2 1
      Tests/RunCMake/GenEx-LINK_GROUP/link_directories-stderr.txt
  13. 2 1
      Tests/RunCMake/GenEx-LINK_GROUP/target_link_directories-stderr.txt
  14. 2 1
      Tests/RunCMake/GenEx-LINK_GROUP/target_link_options-stderr.txt
  15. 1 0
      Tests/RunCMake/GenEx-LINK_LIBRARY/RunCMakeTest.cmake
  16. 2 1
      Tests/RunCMake/GenEx-LINK_LIBRARY/add_custom_command-stderr.txt
  17. 2 1
      Tests/RunCMake/GenEx-LINK_LIBRARY/add_custom_target-stderr.txt
  18. 2 1
      Tests/RunCMake/GenEx-LINK_LIBRARY/add_link_options-stderr.txt
  19. 1 0
      Tests/RunCMake/GenEx-LINK_LIBRARY/invalid-property-result.txt
  20. 10 0
      Tests/RunCMake/GenEx-LINK_LIBRARY/invalid-property-stderr.txt
  21. 10 0
      Tests/RunCMake/GenEx-LINK_LIBRARY/invalid-property.cmake
  22. 2 1
      Tests/RunCMake/GenEx-LINK_LIBRARY/link_directories-stderr.txt
  23. 2 1
      Tests/RunCMake/GenEx-LINK_LIBRARY/target_link_directories-stderr.txt
  24. 2 1
      Tests/RunCMake/GenEx-LINK_LIBRARY/target_link_options-stderr.txt

+ 8 - 6
Help/manual/cmake-generator-expressions.7.rst

@@ -1421,9 +1421,10 @@ Output-Related Expressions
 
   * The ``$<LINK_LIBRARY:...>`` generator expression can only be used to
     specify link libraries.  In practice, this means it can appear in the
-    :prop_tgt:`LINK_LIBRARIES` and :prop_tgt:`INTERFACE_LINK_LIBRARIES`
-    target properties, and be specified in :command:`target_link_libraries`
-    and :command:`link_libraries` commands.
+    :prop_tgt:`LINK_LIBRARIES`, :prop_tgt:`INTERFACE_LINK_LIBRARIES`, and
+    :prop_tgt:`INTERFACE_LINK_LIBRARIES_DIRECT`  target properties, and be
+    specified in :command:`target_link_libraries` and :command:`link_libraries`
+    commands.
 
   * If a ``$<LINK_LIBRARY:...>`` generator expression appears in the
     :prop_tgt:`INTERFACE_LINK_LIBRARIES` property of a target, it will be
@@ -1596,9 +1597,10 @@ Output-Related Expressions
 
   * The ``$<LINK_GROUP:...>`` generator expression can only be used to
     specify link libraries.  In practice, this means it can appear in the
-    :prop_tgt:`LINK_LIBRARIES` and :prop_tgt:`INTERFACE_LINK_LIBRARIES`
-    target properties, and be specified in :command:`target_link_libraries`
-    and :command:`link_libraries` commands.
+    :prop_tgt:`LINK_LIBRARIES`, :prop_tgt:`INTERFACE_LINK_LIBRARIES`,and
+    :prop_tgt:`INTERFACE_LINK_LIBRARIES_DIRECT` target properties, and be
+    specified in :command:`target_link_libraries` and :command:`link_libraries`
+    commands.
 
   * If a ``$<LINK_GROUP:...>`` generator expression appears in the
     :prop_tgt:`INTERFACE_LINK_LIBRARIES` property of a target, it will be

+ 7 - 3
Source/cmGeneratorExpressionDAGChecker.cxx

@@ -178,7 +178,7 @@ bool cmGeneratorExpressionDAGChecker::EvaluatingLinkOptionsExpression() const
 }
 
 bool cmGeneratorExpressionDAGChecker::EvaluatingLinkLibraries(
-  cmGeneratorTarget const* tgt) const
+  cmGeneratorTarget const* tgt, ForGenex genex) const
 {
   const auto* top = this->Top();
 
@@ -188,13 +188,17 @@ bool cmGeneratorExpressionDAGChecker::EvaluatingLinkLibraries(
     return top->Target == tgt && prop == "LINK_LIBRARIES"_s;
   }
 
-  return prop == "LINK_LIBRARIES"_s || prop == "INTERFACE_LINK_LIBRARIES"_s ||
+  auto result = 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_") ||
     cmHasLiteralPrefix(prop, "IMPORTED_LINK_INTERFACE_LIBRARIES_");
+
+  return genex == ForGenex::LINK_LIBRARY || genex == ForGenex::LINK_GROUP
+    ? result
+    : (result || prop == "INTERFACE_LINK_LIBRARIES_DIRECT_EXCLUDE"_s);
 }
 
 cmGeneratorExpressionDAGChecker const* cmGeneratorExpressionDAGChecker::Top()

+ 8 - 1
Source/cmGeneratorExpressionDAGChecker.h

@@ -71,7 +71,14 @@ struct cmGeneratorExpressionDAGChecker
   bool EvaluatingLinkExpression() const;
   bool EvaluatingLinkOptionsExpression() const;
 
-  bool EvaluatingLinkLibraries(cmGeneratorTarget const* tgt = nullptr) const;
+  enum class ForGenex
+  {
+    ANY,
+    LINK_LIBRARY,
+    LINK_GROUP
+  };
+  bool EvaluatingLinkLibraries(cmGeneratorTarget const* tgt = nullptr,
+                               ForGenex genex = ForGenex::ANY) const;
 
 #define DECLARE_TRANSITIVE_PROPERTY_METHOD(METHOD) bool METHOD() const;
 

+ 16 - 6
Source/cmGeneratorExpressionNode.cxx

@@ -1662,11 +1662,16 @@ static const struct LinkLibraryNode : public cmGeneratorExpressionNode
     const GeneratorExpressionContent* content,
     cmGeneratorExpressionDAGChecker* dagChecker) const override
   {
+    using ForGenex = cmGeneratorExpressionDAGChecker::ForGenex;
+
     if (!context->HeadTarget || !dagChecker ||
-        !dagChecker->EvaluatingLinkLibraries()) {
+        !dagChecker->EvaluatingLinkLibraries(nullptr,
+                                             ForGenex::LINK_LIBRARY)) {
       reportError(context, content->GetOriginalExpression(),
                   "$<LINK_LIBRARY:...> may only be used with binary targets "
-                  "to specify link libraries.");
+                  "to specify link libraries through 'LINK_LIBRARIES', "
+                  "'INTERFACE_LINK_LIBRARIES', and "
+                  "'INTERFACE_LINK_LIBRARIES_DIRECT' properties.");
       return std::string();
     }
 
@@ -1743,11 +1748,16 @@ static const struct LinkGroupNode : public cmGeneratorExpressionNode
     const GeneratorExpressionContent* content,
     cmGeneratorExpressionDAGChecker* dagChecker) const override
   {
+    using ForGenex = cmGeneratorExpressionDAGChecker::ForGenex;
+
     if (!context->HeadTarget || !dagChecker ||
-        !dagChecker->EvaluatingLinkLibraries()) {
-      reportError(context, content->GetOriginalExpression(),
-                  "$<LINK_GROUP:...> may only be used with binary targets "
-                  "to specify group of link libraries.");
+        !dagChecker->EvaluatingLinkLibraries(nullptr, ForGenex::LINK_GROUP)) {
+      reportError(
+        context, content->GetOriginalExpression(),
+        "$<LINK_GROUP:...> may only be used with binary targets "
+        "to specify group of link libraries through 'LINK_LIBRARIES', "
+        "'INTERFACE_LINK_LIBRARIES', and "
+        "'INTERFACE_LINK_LIBRARIES_DIRECT' properties.");
       return std::string();
     }
 

+ 1 - 0
Tests/RunCMake/GenEx-LINK_GROUP/RunCMakeTest.cmake

@@ -6,6 +6,7 @@ run_cmake(add_link_options)
 run_cmake(link_directories)
 run_cmake(target_link_options)
 run_cmake(target_link_directories)
+run_cmake(invalid-property)
 run_cmake(no-arguments)
 run_cmake(empty-arguments)
 run_cmake(forbidden-arguments)

+ 2 - 1
Tests/RunCMake/GenEx-LINK_GROUP/add_custom_command-stderr.txt

@@ -4,6 +4,7 @@ CMake Error at add_custom_command.cmake:[0-9]+ \(add_custom_command\):
     \$<LINK_GROUP:feat>
 
   \$<LINK_GROUP:...> may only be used with binary targets to specify group of
-  link libraries.
+  link libraries through 'LINK_LIBRARIES', 'INTERFACE_LINK_LIBRARIES', and
+  'INTERFACE_LINK_LIBRARIES_DIRECT' properties.
 Call Stack \(most recent call first\):
   CMakeLists.txt:[0-9]+ \(include\)

+ 2 - 1
Tests/RunCMake/GenEx-LINK_GROUP/add_custom_target-stderr.txt

@@ -4,6 +4,7 @@ CMake Error at add_custom_target.cmake:[0-9]+ \(add_custom_target\):
     \$<LINK_GROUP:feat>
 
   \$<LINK_GROUP:...> may only be used with binary targets to specify group of
-  link libraries.
+  link libraries through 'LINK_LIBRARIES', 'INTERFACE_LINK_LIBRARIES', and
+  'INTERFACE_LINK_LIBRARIES_DIRECT' properties.
 Call Stack \(most recent call first\):
   CMakeLists.txt:[0-9]+ \(include\)

+ 2 - 1
Tests/RunCMake/GenEx-LINK_GROUP/add_link_options-stderr.txt

@@ -4,6 +4,7 @@ CMake Error at add_link_options.cmake:[0-9]+ \(add_link_options\):
     \$<LINK_GROUP:feat>
 
   \$<LINK_GROUP:...> may only be used with binary targets to specify group of
-  link libraries.
+  link libraries through 'LINK_LIBRARIES', 'INTERFACE_LINK_LIBRARIES', and
+  'INTERFACE_LINK_LIBRARIES_DIRECT' properties.
 Call Stack \(most recent call first\):
   CMakeLists.txt:[0-9]+ \(include\)

+ 1 - 0
Tests/RunCMake/GenEx-LINK_GROUP/invalid-property-result.txt

@@ -0,0 +1 @@
+1

+ 10 - 0
Tests/RunCMake/GenEx-LINK_GROUP/invalid-property-stderr.txt

@@ -0,0 +1,10 @@
+CMake Error at invalid-property.cmake:[0-9]+ \(set_property\):
+  Error evaluating generator expression:
+
+    \$<LINK_GROUP:feat,dep>
+
+  \$<LINK_GROUP:...> may only be used with binary targets to specify group of
+  link libraries through 'LINK_LIBRARIES', 'INTERFACE_LINK_LIBRARIES', and
+  'INTERFACE_LINK_LIBRARIES_DIRECT' properties.
+Call Stack \(most recent call first\):
+  CMakeLists.txt:[0-9]+ \(include\)

+ 10 - 0
Tests/RunCMake/GenEx-LINK_GROUP/invalid-property.cmake

@@ -0,0 +1,10 @@
+enable_language(C)
+
+set (CMAKE_LINK_GROUP_USING_feat "--prefix" "--suffix")
+set (CMAKE_LINK_GROUP_USING_feat_SUPPORTED TRUE)
+
+add_library(dep SHARED empty.c)
+set_property(TARGET dep PROPERTY INTERFACE_LINK_LIBRARIES_DIRECT_EXCLUDE "$<LINK_GROUP:feat,dep>")
+
+add_library(lib SHARED empty.c)
+target_link_libraries(lib PRIVATE dep)

+ 2 - 1
Tests/RunCMake/GenEx-LINK_GROUP/link_directories-stderr.txt

@@ -4,6 +4,7 @@ CMake Error at link_directories.cmake:[0-9]+ \(link_directories\):
     \$<LINK_GROUP:feat>
 
   \$<LINK_GROUP:...> may only be used with binary targets to specify group of
-  link libraries.
+  link libraries through 'LINK_LIBRARIES', 'INTERFACE_LINK_LIBRARIES', and
+  'INTERFACE_LINK_LIBRARIES_DIRECT' properties.
 Call Stack \(most recent call first\):
   CMakeLists.txt:[0-9]+ \(include\)

+ 2 - 1
Tests/RunCMake/GenEx-LINK_GROUP/target_link_directories-stderr.txt

@@ -4,6 +4,7 @@ CMake Error at target_link_directories.cmake:[0-9]+ \(target_link_directories\):
     \$<LINK_GROUP:feat>
 
   \$<LINK_GROUP:...> may only be used with binary targets to specify group of
-  link libraries.
+  link libraries through 'LINK_LIBRARIES', 'INTERFACE_LINK_LIBRARIES', and
+  'INTERFACE_LINK_LIBRARIES_DIRECT' properties.
 Call Stack \(most recent call first\):
   CMakeLists.txt:[0-9]+ \(include\)

+ 2 - 1
Tests/RunCMake/GenEx-LINK_GROUP/target_link_options-stderr.txt

@@ -4,6 +4,7 @@ CMake Error at target_link_options.cmake:[0-9]+ \(target_link_options\):
     \$<LINK_GROUP:FEAT>
 
   \$<LINK_GROUP:...> may only be used with binary targets to specify group of
-  link libraries.
+  link libraries through 'LINK_LIBRARIES', 'INTERFACE_LINK_LIBRARIES', and
+  'INTERFACE_LINK_LIBRARIES_DIRECT' properties.
 Call Stack \(most recent call first\):
   CMakeLists.txt:[0-9]+ \(include\)

+ 1 - 0
Tests/RunCMake/GenEx-LINK_LIBRARY/RunCMakeTest.cmake

@@ -6,6 +6,7 @@ run_cmake(add_link_options)
 run_cmake(link_directories)
 run_cmake(target_link_options)
 run_cmake(target_link_directories)
+run_cmake(invalid-property)
 run_cmake(no-arguments)
 run_cmake(empty-arguments)
 run_cmake(forbidden-arguments)

+ 2 - 1
Tests/RunCMake/GenEx-LINK_LIBRARY/add_custom_command-stderr.txt

@@ -4,6 +4,7 @@ CMake Error at add_custom_command.cmake:[0-9]+ \(add_custom_command\):
     \$<LINK_LIBRARY:feat>
 
   \$<LINK_LIBRARY:...> may only be used with binary targets to specify link
-  libraries.
+  libraries through 'LINK_LIBRARIES', 'INTERFACE_LINK_LIBRARIES', and
+  'INTERFACE_LINK_LIBRARIES_DIRECT' properties.
 Call Stack \(most recent call first\):
   CMakeLists.txt:[0-9]+ \(include\)

+ 2 - 1
Tests/RunCMake/GenEx-LINK_LIBRARY/add_custom_target-stderr.txt

@@ -4,6 +4,7 @@ CMake Error at add_custom_target.cmake:[0-9]+ \(add_custom_target\):
     \$<LINK_LIBRARY:feat>
 
   \$<LINK_LIBRARY:...> may only be used with binary targets to specify link
-  libraries.
+  libraries through 'LINK_LIBRARIES', 'INTERFACE_LINK_LIBRARIES', and
+  'INTERFACE_LINK_LIBRARIES_DIRECT' properties.
 Call Stack \(most recent call first\):
   CMakeLists.txt:[0-9]+ \(include\)

+ 2 - 1
Tests/RunCMake/GenEx-LINK_LIBRARY/add_link_options-stderr.txt

@@ -4,6 +4,7 @@ CMake Error at add_link_options.cmake:[0-9]+ \(add_link_options\):
     \$<LINK_LIBRARY:feat>
 
   \$<LINK_LIBRARY:...> may only be used with binary targets to specify link
-  libraries.
+  libraries through 'LINK_LIBRARIES', 'INTERFACE_LINK_LIBRARIES', and
+  'INTERFACE_LINK_LIBRARIES_DIRECT' properties.
 Call Stack \(most recent call first\):
   CMakeLists.txt:[0-9]+ \(include\)

+ 1 - 0
Tests/RunCMake/GenEx-LINK_LIBRARY/invalid-property-result.txt

@@ -0,0 +1 @@
+1

+ 10 - 0
Tests/RunCMake/GenEx-LINK_LIBRARY/invalid-property-stderr.txt

@@ -0,0 +1,10 @@
+CMake Error at invalid-property.cmake:[0-9]+ \(set_property\):
+  Error evaluating generator expression:
+
+    \$<LINK_LIBRARY:feat,dep>
+
+  \$<LINK_LIBRARY:...> may only be used with binary targets to specify link
+  libraries through 'LINK_LIBRARIES', 'INTERFACE_LINK_LIBRARIES', and
+  'INTERFACE_LINK_LIBRARIES_DIRECT' properties.
+Call Stack \(most recent call first\):
+  CMakeLists.txt:[0-9]+ \(include\)

+ 10 - 0
Tests/RunCMake/GenEx-LINK_LIBRARY/invalid-property.cmake

@@ -0,0 +1,10 @@
+enable_language(C)
+
+set (CMAKE_LINK_LIBRARY_USING_feat "<LIBRARY>")
+set (CMAKE_LINK_LIBRARY_USING_feat_SUPPORTED TRUE)
+
+add_library(dep SHARED empty.c)
+set_property(TARGET dep PROPERTY INTERFACE_LINK_LIBRARIES_DIRECT_EXCLUDE "$<LINK_LIBRARY:feat,dep>")
+
+add_library(lib SHARED empty.c)
+target_link_libraries(lib PRIVATE dep)

+ 2 - 1
Tests/RunCMake/GenEx-LINK_LIBRARY/link_directories-stderr.txt

@@ -4,6 +4,7 @@ CMake Error at link_directories.cmake:[0-9]+ \(link_directories\):
     \$<LINK_LIBRARY:feat>
 
   \$<LINK_LIBRARY:...> may only be used with binary targets to specify link
-  libraries.
+  libraries through 'LINK_LIBRARIES', 'INTERFACE_LINK_LIBRARIES', and
+  'INTERFACE_LINK_LIBRARIES_DIRECT' properties.
 Call Stack \(most recent call first\):
   CMakeLists.txt:[0-9]+ \(include\)

+ 2 - 1
Tests/RunCMake/GenEx-LINK_LIBRARY/target_link_directories-stderr.txt

@@ -4,6 +4,7 @@ CMake Error at target_link_directories.cmake:[0-9]+ \(target_link_directories\):
     \$<LINK_LIBRARY:feat>
 
   \$<LINK_LIBRARY:...> may only be used with binary targets to specify link
-  libraries.
+  libraries through 'LINK_LIBRARIES', 'INTERFACE_LINK_LIBRARIES', and
+  'INTERFACE_LINK_LIBRARIES_DIRECT' properties.
 Call Stack \(most recent call first\):
   CMakeLists.txt:[0-9]+ \(include\)

+ 2 - 1
Tests/RunCMake/GenEx-LINK_LIBRARY/target_link_options-stderr.txt

@@ -4,6 +4,7 @@ CMake Error at target_link_options.cmake:[0-9]+ \(target_link_options\):
     \$<LINK_LIBRARY:FEAT>
 
   \$<LINK_LIBRARY:...> may only be used with binary targets to specify link
-  libraries.
+  libraries through 'LINK_LIBRARIES', 'INTERFACE_LINK_LIBRARIES', and
+  'INTERFACE_LINK_LIBRARIES_DIRECT' properties.
 Call Stack \(most recent call first\):
   CMakeLists.txt:[0-9]+ \(include\)