Genex LINK_LIBRARY and LINK_GROUP: check supported properties

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

Fixes: #23699
This commit is contained in:
Marc Chevrier
2022-07-06 15:06:53 +02:00
parent 4a8db1783c
commit 913ea78d7a
24 changed files with 107 additions and 28 deletions
@@ -1421,9 +1421,10 @@ Output-Related Expressions
* The ``$<LINK_LIBRARY:...>`` generator expression can only be used to * The ``$<LINK_LIBRARY:...>`` generator expression can only be used to
specify link libraries. In practice, this means it can appear in the specify link libraries. In practice, this means it can appear in the
:prop_tgt:`LINK_LIBRARIES` and :prop_tgt:`INTERFACE_LINK_LIBRARIES` :prop_tgt:`LINK_LIBRARIES`, :prop_tgt:`INTERFACE_LINK_LIBRARIES`, and
target properties, and be specified in :command:`target_link_libraries` :prop_tgt:`INTERFACE_LINK_LIBRARIES_DIRECT` target properties, and be
and :command:`link_libraries` commands. specified in :command:`target_link_libraries` and :command:`link_libraries`
commands.
* If a ``$<LINK_LIBRARY:...>`` generator expression appears in the * If a ``$<LINK_LIBRARY:...>`` generator expression appears in the
:prop_tgt:`INTERFACE_LINK_LIBRARIES` property of a target, it will be :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 * The ``$<LINK_GROUP:...>`` generator expression can only be used to
specify link libraries. In practice, this means it can appear in the specify link libraries. In practice, this means it can appear in the
:prop_tgt:`LINK_LIBRARIES` and :prop_tgt:`INTERFACE_LINK_LIBRARIES` :prop_tgt:`LINK_LIBRARIES`, :prop_tgt:`INTERFACE_LINK_LIBRARIES`,and
target properties, and be specified in :command:`target_link_libraries` :prop_tgt:`INTERFACE_LINK_LIBRARIES_DIRECT` target properties, and be
and :command:`link_libraries` commands. specified in :command:`target_link_libraries` and :command:`link_libraries`
commands.
* If a ``$<LINK_GROUP:...>`` generator expression appears in the * If a ``$<LINK_GROUP:...>`` generator expression appears in the
:prop_tgt:`INTERFACE_LINK_LIBRARIES` property of a target, it will be :prop_tgt:`INTERFACE_LINK_LIBRARIES` property of a target, it will be
+7 -3
View File
@@ -178,7 +178,7 @@ bool cmGeneratorExpressionDAGChecker::EvaluatingLinkOptionsExpression() const
} }
bool cmGeneratorExpressionDAGChecker::EvaluatingLinkLibraries( bool cmGeneratorExpressionDAGChecker::EvaluatingLinkLibraries(
cmGeneratorTarget const* tgt) const cmGeneratorTarget const* tgt, ForGenex genex) const
{ {
const auto* top = this->Top(); const auto* top = this->Top();
@@ -188,13 +188,17 @@ bool cmGeneratorExpressionDAGChecker::EvaluatingLinkLibraries(
return top->Target == tgt && prop == "LINK_LIBRARIES"_s; 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"_s ||
prop == "INTERFACE_LINK_LIBRARIES_DIRECT_EXCLUDE"_s ||
prop == "LINK_INTERFACE_LIBRARIES"_s || prop == "LINK_INTERFACE_LIBRARIES"_s ||
prop == "IMPORTED_LINK_INTERFACE_LIBRARIES"_s || prop == "IMPORTED_LINK_INTERFACE_LIBRARIES"_s ||
cmHasLiteralPrefix(prop, "LINK_INTERFACE_LIBRARIES_") || cmHasLiteralPrefix(prop, "LINK_INTERFACE_LIBRARIES_") ||
cmHasLiteralPrefix(prop, "IMPORTED_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() cmGeneratorExpressionDAGChecker const* cmGeneratorExpressionDAGChecker::Top()
+8 -1
View File
@@ -71,7 +71,14 @@ struct cmGeneratorExpressionDAGChecker
bool EvaluatingLinkExpression() const; bool EvaluatingLinkExpression() const;
bool EvaluatingLinkOptionsExpression() 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; #define DECLARE_TRANSITIVE_PROPERTY_METHOD(METHOD) bool METHOD() const;
+16 -6
View File
@@ -1662,11 +1662,16 @@ static const struct LinkLibraryNode : public cmGeneratorExpressionNode
const GeneratorExpressionContent* content, const GeneratorExpressionContent* content,
cmGeneratorExpressionDAGChecker* dagChecker) const override cmGeneratorExpressionDAGChecker* dagChecker) const override
{ {
using ForGenex = cmGeneratorExpressionDAGChecker::ForGenex;
if (!context->HeadTarget || !dagChecker || if (!context->HeadTarget || !dagChecker ||
!dagChecker->EvaluatingLinkLibraries()) { !dagChecker->EvaluatingLinkLibraries(nullptr,
ForGenex::LINK_LIBRARY)) {
reportError(context, content->GetOriginalExpression(), reportError(context, content->GetOriginalExpression(),
"$<LINK_LIBRARY:...> may only be used with binary targets " "$<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(); return std::string();
} }
@@ -1743,11 +1748,16 @@ static const struct LinkGroupNode : public cmGeneratorExpressionNode
const GeneratorExpressionContent* content, const GeneratorExpressionContent* content,
cmGeneratorExpressionDAGChecker* dagChecker) const override cmGeneratorExpressionDAGChecker* dagChecker) const override
{ {
using ForGenex = cmGeneratorExpressionDAGChecker::ForGenex;
if (!context->HeadTarget || !dagChecker || if (!context->HeadTarget || !dagChecker ||
!dagChecker->EvaluatingLinkLibraries()) { !dagChecker->EvaluatingLinkLibraries(nullptr, ForGenex::LINK_GROUP)) {
reportError(context, content->GetOriginalExpression(), reportError(
"$<LINK_GROUP:...> may only be used with binary targets " context, content->GetOriginalExpression(),
"to specify group of link libraries."); "$<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(); return std::string();
} }
@@ -6,6 +6,7 @@ run_cmake(add_link_options)
run_cmake(link_directories) run_cmake(link_directories)
run_cmake(target_link_options) run_cmake(target_link_options)
run_cmake(target_link_directories) run_cmake(target_link_directories)
run_cmake(invalid-property)
run_cmake(no-arguments) run_cmake(no-arguments)
run_cmake(empty-arguments) run_cmake(empty-arguments)
run_cmake(forbidden-arguments) run_cmake(forbidden-arguments)
@@ -4,6 +4,7 @@ CMake Error at add_custom_command.cmake:[0-9]+ \(add_custom_command\):
\$<LINK_GROUP:feat> \$<LINK_GROUP:feat>
\$<LINK_GROUP:...> may only be used with binary targets to specify group of \$<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\): Call Stack \(most recent call first\):
CMakeLists.txt:[0-9]+ \(include\) CMakeLists.txt:[0-9]+ \(include\)
@@ -4,6 +4,7 @@ CMake Error at add_custom_target.cmake:[0-9]+ \(add_custom_target\):
\$<LINK_GROUP:feat> \$<LINK_GROUP:feat>
\$<LINK_GROUP:...> may only be used with binary targets to specify group of \$<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\): Call Stack \(most recent call first\):
CMakeLists.txt:[0-9]+ \(include\) CMakeLists.txt:[0-9]+ \(include\)
@@ -4,6 +4,7 @@ CMake Error at add_link_options.cmake:[0-9]+ \(add_link_options\):
\$<LINK_GROUP:feat> \$<LINK_GROUP:feat>
\$<LINK_GROUP:...> may only be used with binary targets to specify group of \$<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\): Call Stack \(most recent call first\):
CMakeLists.txt:[0-9]+ \(include\) CMakeLists.txt:[0-9]+ \(include\)
@@ -0,0 +1 @@
1
@@ -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\)
@@ -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)
@@ -4,6 +4,7 @@ CMake Error at link_directories.cmake:[0-9]+ \(link_directories\):
\$<LINK_GROUP:feat> \$<LINK_GROUP:feat>
\$<LINK_GROUP:...> may only be used with binary targets to specify group of \$<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\): Call Stack \(most recent call first\):
CMakeLists.txt:[0-9]+ \(include\) CMakeLists.txt:[0-9]+ \(include\)
@@ -4,6 +4,7 @@ CMake Error at target_link_directories.cmake:[0-9]+ \(target_link_directories\):
\$<LINK_GROUP:feat> \$<LINK_GROUP:feat>
\$<LINK_GROUP:...> may only be used with binary targets to specify group of \$<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\): Call Stack \(most recent call first\):
CMakeLists.txt:[0-9]+ \(include\) CMakeLists.txt:[0-9]+ \(include\)
@@ -4,6 +4,7 @@ CMake Error at target_link_options.cmake:[0-9]+ \(target_link_options\):
\$<LINK_GROUP:FEAT> \$<LINK_GROUP:FEAT>
\$<LINK_GROUP:...> may only be used with binary targets to specify group of \$<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\): Call Stack \(most recent call first\):
CMakeLists.txt:[0-9]+ \(include\) CMakeLists.txt:[0-9]+ \(include\)
@@ -6,6 +6,7 @@ run_cmake(add_link_options)
run_cmake(link_directories) run_cmake(link_directories)
run_cmake(target_link_options) run_cmake(target_link_options)
run_cmake(target_link_directories) run_cmake(target_link_directories)
run_cmake(invalid-property)
run_cmake(no-arguments) run_cmake(no-arguments)
run_cmake(empty-arguments) run_cmake(empty-arguments)
run_cmake(forbidden-arguments) run_cmake(forbidden-arguments)
@@ -4,6 +4,7 @@ CMake Error at add_custom_command.cmake:[0-9]+ \(add_custom_command\):
\$<LINK_LIBRARY:feat> \$<LINK_LIBRARY:feat>
\$<LINK_LIBRARY:...> may only be used with binary targets to specify link \$<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\): Call Stack \(most recent call first\):
CMakeLists.txt:[0-9]+ \(include\) CMakeLists.txt:[0-9]+ \(include\)
@@ -4,6 +4,7 @@ CMake Error at add_custom_target.cmake:[0-9]+ \(add_custom_target\):
\$<LINK_LIBRARY:feat> \$<LINK_LIBRARY:feat>
\$<LINK_LIBRARY:...> may only be used with binary targets to specify link \$<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\): Call Stack \(most recent call first\):
CMakeLists.txt:[0-9]+ \(include\) CMakeLists.txt:[0-9]+ \(include\)
@@ -4,6 +4,7 @@ CMake Error at add_link_options.cmake:[0-9]+ \(add_link_options\):
\$<LINK_LIBRARY:feat> \$<LINK_LIBRARY:feat>
\$<LINK_LIBRARY:...> may only be used with binary targets to specify link \$<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\): Call Stack \(most recent call first\):
CMakeLists.txt:[0-9]+ \(include\) CMakeLists.txt:[0-9]+ \(include\)
@@ -0,0 +1 @@
1
@@ -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\)
@@ -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)
@@ -4,6 +4,7 @@ CMake Error at link_directories.cmake:[0-9]+ \(link_directories\):
\$<LINK_LIBRARY:feat> \$<LINK_LIBRARY:feat>
\$<LINK_LIBRARY:...> may only be used with binary targets to specify link \$<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\): Call Stack \(most recent call first\):
CMakeLists.txt:[0-9]+ \(include\) CMakeLists.txt:[0-9]+ \(include\)
@@ -4,6 +4,7 @@ CMake Error at target_link_directories.cmake:[0-9]+ \(target_link_directories\):
\$<LINK_LIBRARY:feat> \$<LINK_LIBRARY:feat>
\$<LINK_LIBRARY:...> may only be used with binary targets to specify link \$<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\): Call Stack \(most recent call first\):
CMakeLists.txt:[0-9]+ \(include\) CMakeLists.txt:[0-9]+ \(include\)
@@ -4,6 +4,7 @@ CMake Error at target_link_options.cmake:[0-9]+ \(target_link_options\):
\$<LINK_LIBRARY:FEAT> \$<LINK_LIBRARY:FEAT>
\$<LINK_LIBRARY:...> may only be used with binary targets to specify link \$<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\): Call Stack \(most recent call first\):
CMakeLists.txt:[0-9]+ \(include\) CMakeLists.txt:[0-9]+ \(include\)