From 8437141b53919619f6d21f5f446d26df42373c68 Mon Sep 17 00:00:00 2001 From: Brad King Date: Tue, 15 Nov 2022 10:53:49 -0500 Subject: Genex: Fix TARGET_PROPERTY lookup scope in transitive usage requirements When `$` is used in an `INTERFACE_*` target property for usage requirements, it may be evaluated in the context of a dependent target in another directory. Look up the `tgt` name in the directory of the target whose property holds the expression so that imported targets isolated to that directory are visible. Fixes: #24163 --- Help/manual/cmake-generator-expressions.7.rst | 7 +++++++ Source/cmGeneratorExpressionNode.cxx | 5 ++++- .../RunCMake/GenEx-TARGET_PROPERTY/RunCMakeTest.cmake | 7 +++++++ .../GenEx-TARGET_PROPERTY/Scope-build-stdout.txt | 6 ++++++ Tests/RunCMake/GenEx-TARGET_PROPERTY/Scope.c | 12 ++++++++++++ Tests/RunCMake/GenEx-TARGET_PROPERTY/Scope.cmake | 19 +++++++++++++++++++ .../GenEx-TARGET_PROPERTY/Scope1/CMakeLists.txt | 15 +++++++++++++++ .../GenEx-TARGET_PROPERTY/Scope2/CMakeLists.txt | 10 ++++++++++ 8 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 Tests/RunCMake/GenEx-TARGET_PROPERTY/Scope-build-stdout.txt create mode 100644 Tests/RunCMake/GenEx-TARGET_PROPERTY/Scope.c create mode 100644 Tests/RunCMake/GenEx-TARGET_PROPERTY/Scope.cmake create mode 100644 Tests/RunCMake/GenEx-TARGET_PROPERTY/Scope1/CMakeLists.txt create mode 100644 Tests/RunCMake/GenEx-TARGET_PROPERTY/Scope2/CMakeLists.txt diff --git a/Help/manual/cmake-generator-expressions.7.rst b/Help/manual/cmake-generator-expressions.7.rst index faa793f..eb57b1e 100644 --- a/Help/manual/cmake-generator-expressions.7.rst +++ b/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:: $ Value of the property ``prop`` on the target for which the expression diff --git a/Source/cmGeneratorExpressionNode.cxx b/Source/cmGeneratorExpressionNode.cxx index 562c31e..81629c6 100644 --- a/Source/cmGeneratorExpressionNode.cxx +++ b/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; diff --git a/Tests/RunCMake/GenEx-TARGET_PROPERTY/RunCMakeTest.cmake b/Tests/RunCMake/GenEx-TARGET_PROPERTY/RunCMakeTest.cmake index ac0843e..b613ad1 100644 --- a/Tests/RunCMake/GenEx-TARGET_PROPERTY/RunCMakeTest.cmake +++ b/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() diff --git a/Tests/RunCMake/GenEx-TARGET_PROPERTY/Scope-build-stdout.txt b/Tests/RunCMake/GenEx-TARGET_PROPERTY/Scope-build-stdout.txt new file mode 100644 index 0000000..fefad22 --- /dev/null +++ b/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' diff --git a/Tests/RunCMake/GenEx-TARGET_PROPERTY/Scope.c b/Tests/RunCMake/GenEx-TARGET_PROPERTY/Scope.c new file mode 100644 index 0000000..a4bec6f --- /dev/null +++ b/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) +{ +} diff --git a/Tests/RunCMake/GenEx-TARGET_PROPERTY/Scope.cmake b/Tests/RunCMake/GenEx-TARGET_PROPERTY/Scope.cmake new file mode 100644 index 0000000..48a878a --- /dev/null +++ b/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: '$'" + COMMAND ${CMAKE_COMMAND} -E echo "iface scope2: '$'" + COMMAND ${CMAKE_COMMAND} -E echo "iface scope2 in scope1: '$>'" + COMMAND ${CMAKE_COMMAND} -E echo "custom scope1: '$>'" + COMMAND ${CMAKE_COMMAND} -E echo "custom scope2: '$>'" + COMMAND ${CMAKE_COMMAND} -E echo "custom scope2 in scope1: '$>'" + ) diff --git a/Tests/RunCMake/GenEx-TARGET_PROPERTY/Scope1/CMakeLists.txt b/Tests/RunCMake/GenEx-TARGET_PROPERTY/Scope1/CMakeLists.txt new file mode 100644 index 0000000..d546267 --- /dev/null +++ b/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 + "$" + "$" + ) +set_property(TARGET scope1_iface PROPERTY CUSTOM_PROP + "$" + "$" + ) diff --git a/Tests/RunCMake/GenEx-TARGET_PROPERTY/Scope2/CMakeLists.txt b/Tests/RunCMake/GenEx-TARGET_PROPERTY/Scope2/CMakeLists.txt new file mode 100644 index 0000000..a6d7e6b --- /dev/null +++ b/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 + "$" + ) +set_property(TARGET scope2_iface PROPERTY CUSTOM_PROP + "$" + ) -- cgit v0.12