Browse Source

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
Marc Chevrier 5 years ago
parent
commit
6491d2503c

+ 8 - 0
Source/cmGeneratorExpressionDAGChecker.cxx

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

+ 1 - 0
Source/cmGeneratorExpressionDAGChecker.h

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

+ 6 - 3
Source/cmGeneratorExpressionNode.cxx

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

+ 17 - 0
Tests/RunCMake/GenEx-COMPILE_LANGUAGE/COMPILE_LANGUAGE-TARGET_PROPERTY.cmake

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

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

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

+ 17 - 0
Tests/RunCMake/GenEx-COMPILE_LANG_AND_ID/COMPILE_LANG_AND_ID-TARGET_PROPERTY.cmake

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

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

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