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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -0,0 +1 @@
1

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -0,0 +1 @@
1

View File

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

View File

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

View File

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

View File

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

View File

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