Genex $<COMPILE_LANGUAGE>: Extend contexts supported

When genex $<TARGET_PROPERTY:...> for properties like INCLUDE_DIRECTORIES
is evaluated as part of add_custom_command or add_custom_target,
genex $<COMPILE_LANGUAGE> and $<COMPLIE_LANG_AND_ID> should be supported.

Fixes: #20926
This commit is contained in:
Marc Chevrier
2020-07-12 15:25:18 +02:00
parent c361600fc4
commit 6491d2503c
7 changed files with 51 additions and 3 deletions

View File

@@ -154,6 +154,14 @@ bool cmGeneratorExpressionDAGChecker::EvaluatingPICExpression() const
return this->Top()->Property == "INTERFACE_POSITION_INDEPENDENT_CODE";
}
bool cmGeneratorExpressionDAGChecker::EvaluatingCompileExpression() const
{
cm::string_view property(this->Top()->Property);
return property == "INCLUDE_DIRECTORIES"_s ||
property == "COMPILE_DEFINITIONS"_s || property == "COMPILE_OPTIONS"_s;
}
bool cmGeneratorExpressionDAGChecker::EvaluatingLinkExpression() const
{
cm::string_view property(this->Top()->Property);

View File

@@ -68,6 +68,7 @@ struct cmGeneratorExpressionDAGChecker
bool EvaluatingGenexExpression() const;
bool EvaluatingPICExpression() const;
bool EvaluatingCompileExpression() const;
bool EvaluatingLinkExpression() const;
bool EvaluatingLinkOptionsExpression() const;

View File

@@ -967,9 +967,10 @@ static const struct CompileLanguageNode : public cmGeneratorExpressionNode
const std::vector<std::string>& parameters,
cmGeneratorExpressionContext* context,
const GeneratorExpressionContent* content,
cmGeneratorExpressionDAGChecker* /*dagChecker*/) const override
cmGeneratorExpressionDAGChecker* dagChecker) const override
{
if (context->Language.empty()) {
if (context->Language.empty() &&
(!dagChecker || !dagChecker->EvaluatingCompileExpression())) {
reportError(
context, content->GetOriginalExpression(),
"$<COMPILE_LANGUAGE:...> may only be used to specify include "
@@ -1014,7 +1015,9 @@ static const struct CompileLanguageAndIdNode : public cmGeneratorExpressionNode
const GeneratorExpressionContent* content,
cmGeneratorExpressionDAGChecker* dagChecker) const override
{
if (!context->HeadTarget || context->Language.empty()) {
if (!context->HeadTarget ||
(context->Language.empty() &&
(!dagChecker || !dagChecker->EvaluatingCompileExpression()))) {
// reportError(context, content->GetOriginalExpression(), "");
reportError(
context, content->GetOriginalExpression(),

View File

@@ -0,0 +1,17 @@
enable_language(C)
add_library (lib SHARED empty.c)
set_target_properties(lib PROPERTIES
INCLUDE_DIRECTORIES "$<$<COMPILE_LANGUAGE:C>:/usr/include>"
COMPILE_DEFINITIONS "$<$<COMPILE_LANGUAGE:C>:DEF>"
COMPILE_OPTIONS "$<$<COMPILE_LANGUAGE:C>:-O>")
add_custom_target(drive
COMMAND ${CMAKE_COMMAND} -E echo $<TARGET_PROPERTY:lib,INCLUDE_DIRECTORIES>
$<TARGET_PROPERTY:lib,COMPILE_DEFINITIONS>
$<TARGET_PROPERTY:lib,COMPILE_OPTIONS>)
add_custom_command(TARGET drive PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E echo $<TARGET_PROPERTY:lib,INCLUDE_DIRECTORIES>
$<TARGET_PROPERTY:lib,COMPILE_DEFINITIONS>
$<TARGET_PROPERTY:lib,COMPILE_OPTIONS>)

View File

@@ -8,3 +8,4 @@ run_cmake(COMPILE_LANGUAGE-add_executable)
run_cmake(COMPILE_LANGUAGE-add_library)
run_cmake(COMPILE_LANGUAGE-add_test)
run_cmake(COMPILE_LANGUAGE-unknown-lang)
run_cmake(COMPILE_LANGUAGE-TARGET_PROPERTY)

View File

@@ -0,0 +1,17 @@
enable_language(C)
add_library (lib SHARED empty.c)
set_target_properties(lib PROPERTIES
INCLUDE_DIRECTORIES "$<$<COMPILE_LANG_AND_ID:C,GNU>:/usr/include>"
COMPILE_DEFINITIONS "$<$<COMPILE_LANG_AND_ID:C,GNU>:DEF>"
COMPILE_OPTIONS "$<$<COMPILE_LANG_AND_ID:C,GNU>:-O>")
add_custom_target(drive
COMMAND ${CMAKE_COMMAND} -E echo $<TARGET_PROPERTY:lib,INCLUDE_DIRECTORIES>
$<TARGET_PROPERTY:lib,COMPILE_DEFINITIONS>
$<TARGET_PROPERTY:lib,COMPILE_OPTIONS>)
add_custom_command(TARGET drive PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E echo $<TARGET_PROPERTY:lib,INCLUDE_DIRECTORIES>
$<TARGET_PROPERTY:lib,COMPILE_DEFINITIONS>
$<TARGET_PROPERTY:lib,COMPILE_OPTIONS>)

View File

@@ -8,3 +8,4 @@ run_cmake(COMPILE_LANG_AND_ID-add_executable)
run_cmake(COMPILE_LANG_AND_ID-add_library)
run_cmake(COMPILE_LANG_AND_ID-add_test)
run_cmake(COMPILE_LANG_AND_ID-unknown-lang)
run_cmake(COMPILE_LANG_AND_ID-TARGET_PROPERTY)