Ver código fonte

Merge topic 'genex-TARGET_PROPERTY-scope'

8437141b53 Genex: Fix TARGET_PROPERTY lookup scope in transitive usage requirements

Acked-by: Kitware Robot <[email protected]>
Tested-by: buildbot <[email protected]>
Acked-by: Robert Maynard <[email protected]>
Merge-request: !7928
Brad King 2 anos atrás
pai
commit
1cc936f314

+ 7 - 0
Help/manual/cmake-generator-expressions.7.rst

@@ -1401,6 +1401,13 @@ In the following, the phrase "the ``tgt`` filename" means the name of the
   Note that ``tgt`` is not added as a dependency of the target this
   expression is evaluated on.
 
+  .. versionchanged:: 3.26
+    When encountered during evaluation of :ref:`Target Usage Requirements`,
+    typically in an ``INTERFACE_*`` target property, lookup of the ``tgt``
+    name occurs in the directory of the target specifying the requirement,
+    rather than the directory of the consuming target for which the
+    expression is being evaluated.
+
 .. genex:: $<TARGET_PROPERTY:prop>
 
   Value of the property ``prop`` on the target for which the expression

+ 4 - 1
Source/cmGeneratorExpressionNode.cxx

@@ -1970,7 +1970,10 @@ static const struct TargetPropertyNode : public cmGeneratorExpressionNode
         }
         return std::string();
       }
-      target = context->LG->FindGeneratorTargetToUse(targetName);
+      cmLocalGenerator const* lg = context->CurrentTarget
+        ? context->CurrentTarget->GetLocalGenerator()
+        : context->LG;
+      target = lg->FindGeneratorTargetToUse(targetName);
 
       if (!target) {
         std::ostringstream e;

+ 7 - 0
Tests/RunCMake/GenEx-TARGET_PROPERTY/RunCMakeTest.cmake

@@ -13,3 +13,10 @@ run_cmake(LinkImplementationCycle5)
 run_cmake(LinkImplementationCycle6)
 run_cmake(LOCATION)
 run_cmake(SOURCES)
+
+block()
+  run_cmake(Scope)
+  set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/Scope-build)
+  set(RunCMake_TEST_NO_CLEAN 1)
+  run_cmake_command(Scope-build ${CMAKE_COMMAND} --build . --config Debug)
+endblock()

+ 6 - 0
Tests/RunCMake/GenEx-TARGET_PROPERTY/Scope-build-stdout.txt

@@ -0,0 +1,6 @@
+.*iface scope1: 'SCOPED_A_1;SCOPED_B_1'
+.*iface scope2: 'SCOPED_A_2'
+.*iface scope2 in scope1: 'SCOPED_A_2'
+.*custom scope1: 'SCOPED_A_1;SCOPED_B_1'
+.*custom scope2: 'SCOPED_A_2'
+.*custom scope2 in scope1: 'SCOPED_A_1'

+ 12 - 0
Tests/RunCMake/GenEx-TARGET_PROPERTY/Scope.c

@@ -0,0 +1,12 @@
+#ifndef SCOPED_A_1
+#  error "SCOPED_A_1 not defined"
+#endif
+#ifndef SCOPED_B_1
+#  error "SCOPED_B_1 not defined"
+#endif
+#ifndef SCOPED_A_2
+#  error "SCOPED_A_2 not defined"
+#endif
+void Scope(void)
+{
+}

+ 19 - 0
Tests/RunCMake/GenEx-TARGET_PROPERTY/Scope.cmake

@@ -0,0 +1,19 @@
+enable_language(C)
+
+add_subdirectory(Scope1)
+add_subdirectory(Scope2)
+
+add_library(Scope Scope.c)
+target_link_libraries(Scope PRIVATE
+  scope1_iface
+  scope2_iface
+  )
+
+add_custom_target(Custom ALL VERBATIM
+  COMMAND ${CMAKE_COMMAND} -E echo "iface scope1: '$<TARGET_PROPERTY:scope1_iface,INTERFACE_COMPILE_DEFINITIONS>'"
+  COMMAND ${CMAKE_COMMAND} -E echo "iface scope2: '$<TARGET_PROPERTY:scope2_iface,INTERFACE_COMPILE_DEFINITIONS>'"
+  COMMAND ${CMAKE_COMMAND} -E echo "iface scope2 in scope1: '$<TARGET_GENEX_EVAL:scope1_iface,$<TARGET_PROPERTY:scope2_iface,INTERFACE_COMPILE_DEFINITIONS>>'"
+  COMMAND ${CMAKE_COMMAND} -E echo "custom scope1: '$<TARGET_GENEX_EVAL:scope1_iface,$<TARGET_PROPERTY:scope1_iface,CUSTOM_PROP>>'"
+  COMMAND ${CMAKE_COMMAND} -E echo "custom scope2: '$<TARGET_GENEX_EVAL:scope2_iface,$<TARGET_PROPERTY:scope2_iface,CUSTOM_PROP>>'"
+  COMMAND ${CMAKE_COMMAND} -E echo "custom scope2 in scope1: '$<TARGET_GENEX_EVAL:scope1_iface,$<TARGET_PROPERTY:scope2_iface,CUSTOM_PROP>>'"
+  )

+ 15 - 0
Tests/RunCMake/GenEx-TARGET_PROPERTY/Scope1/CMakeLists.txt

@@ -0,0 +1,15 @@
+add_library(scopedA INTERFACE IMPORTED)
+set_property(TARGET scopedA PROPERTY INTERFACE_COMPILE_DEFINITIONS "SCOPED_A_1")
+
+add_library(scopedB INTERFACE IMPORTED)
+set_property(TARGET scopedB PROPERTY INTERFACE_COMPILE_DEFINITIONS "SCOPED_B_1")
+
+add_library(scope1_iface INTERFACE)
+set_property(TARGET scope1_iface PROPERTY INTERFACE_COMPILE_DEFINITIONS
+  "$<TARGET_PROPERTY:scopedA,INTERFACE_COMPILE_DEFINITIONS>"
+  "$<TARGET_PROPERTY:scopedB,INTERFACE_COMPILE_DEFINITIONS>"
+  )
+set_property(TARGET scope1_iface PROPERTY CUSTOM_PROP
+  "$<TARGET_PROPERTY:scopedA,INTERFACE_COMPILE_DEFINITIONS>"
+  "$<TARGET_PROPERTY:scopedB,INTERFACE_COMPILE_DEFINITIONS>"
+  )

+ 10 - 0
Tests/RunCMake/GenEx-TARGET_PROPERTY/Scope2/CMakeLists.txt

@@ -0,0 +1,10 @@
+add_library(scopedA INTERFACE IMPORTED)
+set_property(TARGET scopedA PROPERTY INTERFACE_COMPILE_DEFINITIONS "SCOPED_A_2")
+
+add_library(scope2_iface INTERFACE)
+set_property(TARGET scope2_iface PROPERTY INTERFACE_COMPILE_DEFINITIONS
+  "$<TARGET_PROPERTY:scopedA,INTERFACE_COMPILE_DEFINITIONS>"
+  )
+set_property(TARGET scope2_iface PROPERTY CUSTOM_PROP
+  "$<TARGET_PROPERTY:scopedA,INTERFACE_COMPILE_DEFINITIONS>"
+  )