mirror of
https://github.com/Kitware/CMake.git
synced 2025-12-30 10:20:56 -06:00
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:
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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\)
|
||||
|
||||
@@ -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\)
|
||||
|
||||
@@ -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\)
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
1
|
||||
10
Tests/RunCMake/GenEx-LINK_GROUP/invalid-property-stderr.txt
Normal file
10
Tests/RunCMake/GenEx-LINK_GROUP/invalid-property-stderr.txt
Normal 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\)
|
||||
10
Tests/RunCMake/GenEx-LINK_GROUP/invalid-property.cmake
Normal file
10
Tests/RunCMake/GenEx-LINK_GROUP/invalid-property.cmake
Normal 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)
|
||||
@@ -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\)
|
||||
|
||||
@@ -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\)
|
||||
|
||||
@@ -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\)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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\)
|
||||
|
||||
@@ -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\)
|
||||
|
||||
@@ -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\)
|
||||
|
||||
@@ -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\)
|
||||
10
Tests/RunCMake/GenEx-LINK_LIBRARY/invalid-property.cmake
Normal file
10
Tests/RunCMake/GenEx-LINK_LIBRARY/invalid-property.cmake
Normal 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)
|
||||
@@ -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\)
|
||||
|
||||
@@ -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\)
|
||||
|
||||
@@ -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\)
|
||||
|
||||
Reference in New Issue
Block a user