From 9081e73104e7f368813c82d45a6046d94d9c15f9 Mon Sep 17 00:00:00 2001 From: Matthew Woehlke Date: Wed, 30 Apr 2025 11:56:09 -0400 Subject: [PATCH] CPS: Fix mangling of relative requirement names CPS names look like `[package]:component`, which needs to get mangled into `package::component` to match CMake's convention. This was implemented correctly for fully qualified component requirements, but relative names were not being properly mangled. Adjust handling of relative names to correctly translate from CPS to CMake convention. --- Source/cmPackageInfoReader.cxx | 2 +- Tests/FindPackageCpsTest/CMakeLists.txt | 8 ++++++++ Tests/FindPackageCpsTest/cps/RequiresTest.cps | 19 +++++++++++++++++++ Tests/FindPackageCpsTest/requires-test.cxx | 7 +++++++ 4 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 Tests/FindPackageCpsTest/cps/RequiresTest.cps create mode 100644 Tests/FindPackageCpsTest/requires-test.cxx diff --git a/Source/cmPackageInfoReader.cxx b/Source/cmPackageInfoReader.cxx index a3e973e76c..3d20c4844f 100644 --- a/Source/cmPackageInfoReader.cxx +++ b/Source/cmPackageInfoReader.cxx @@ -212,7 +212,7 @@ std::string NormalizeTargetName(std::string const& name, std::string const& context) { if (cmHasLiteralPrefix(name, ":")) { - return cmStrCat(context, name); + return cmStrCat(context, ':', name); } std::string::size_type const n = name.find_first_of(':'); diff --git a/Tests/FindPackageCpsTest/CMakeLists.txt b/Tests/FindPackageCpsTest/CMakeLists.txt index d905104147..f36badad7b 100644 --- a/Tests/FindPackageCpsTest/CMakeLists.txt +++ b/Tests/FindPackageCpsTest/CMakeLists.txt @@ -180,6 +180,14 @@ else() target_link_libraries(defs-test defs::defs) endif() +############################################################################### +# Test importing and mangling of requirements (i.e. link libraries). + +find_package(RequiresTest CONFIG REQUIRED) + +add_library(requires-test STATIC requires-test.cxx) +target_link_libraries(requires-test RequiresTest::Indirect) + ############################################################################### # Test importing of (language-specific) include paths. diff --git a/Tests/FindPackageCpsTest/cps/RequiresTest.cps b/Tests/FindPackageCpsTest/cps/RequiresTest.cps new file mode 100644 index 0000000000..736e25c827 --- /dev/null +++ b/Tests/FindPackageCpsTest/cps/RequiresTest.cps @@ -0,0 +1,19 @@ +{ + "cps_version": "0.13", + "name": "RequiresTest", + "cps_path": "@prefix@/cps", + "components": { + "Indirect": { + "type": "interface", + "requires": [ ":Direct" ] + }, + "Direct": { + "type": "interface", + "definitions": { + "*": { + "ANSWER": 42 + } + } + } + } +} diff --git a/Tests/FindPackageCpsTest/requires-test.cxx b/Tests/FindPackageCpsTest/requires-test.cxx new file mode 100644 index 0000000000..39d649c357 --- /dev/null +++ b/Tests/FindPackageCpsTest/requires-test.cxx @@ -0,0 +1,7 @@ +#ifndef ANSWER +# error ANSWER is not defined +#else +# if ANSWER != 42 +# error ANSWER has the wrong value +# endif +#endif