Skip to content

Commit c13e524

Browse files
committed
Fix handling of CONFIG and keywords in component merging
Updated _cpp_library_track_find_package to strip CONFIG, NO_MODULE, and REQUIRED keywords from component lists, preventing them from being treated as components. Added a test to verify CONFIG is not merged as a component.
1 parent 7535323 commit c13e524

2 files changed

Lines changed: 39 additions & 0 deletions

File tree

cmake/cpp-library-dependency-provider.cmake

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,8 @@ function(_cpp_library_track_find_package package_name)
105105
if(TEMP_MATCH MATCHES "^(.+) +OPTIONAL_COMPONENTS")
106106
set(TEMP_MATCH "${CMAKE_MATCH_1}")
107107
endif()
108+
# Strip keywords (CONFIG, NO_MODULE, REQUIRED) that aren't component names
109+
string(REGEX REPLACE " +(REQUIRED|CONFIG|NO_MODULE).*$" "" TEMP_MATCH "${TEMP_MATCH}")
108110
string(REGEX REPLACE " +" ";" EXISTING_COMPONENTS "${TEMP_MATCH}")
109111
endif()
110112

tests/install/test_provider_merge.cmake

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ function(_cpp_library_track_find_package package_name)
5757
if(TEMP_MATCH MATCHES "^(.+) +OPTIONAL_COMPONENTS")
5858
set(TEMP_MATCH "${CMAKE_MATCH_1}")
5959
endif()
60+
# Strip keywords (CONFIG, NO_MODULE, REQUIRED) that aren't component names
61+
string(REGEX REPLACE " +(REQUIRED|CONFIG|NO_MODULE).*$" "" TEMP_MATCH "${TEMP_MATCH}")
6062
string(REGEX REPLACE " +" ";" EXISTING_COMPONENTS "${TEMP_MATCH}")
6163
endif()
6264

@@ -215,6 +217,41 @@ else()
215217
message(FATAL_ERROR "✗ FAIL: Expected '${EXPECTED_CONFIG2}' but got '${CONFIG_MERGED}'")
216218
endif()
217219

220+
# Test: CONFIG keyword in component list bug fix
221+
message(STATUS "")
222+
message(STATUS "Test: CONFIG not treated as component when merging")
223+
224+
# Clear state
225+
set_property(GLOBAL PROPERTY "_CPP_LIBRARY_TRACKED_DEP_Qt6")
226+
set_property(GLOBAL PROPERTY _CPP_LIBRARY_ALL_TRACKED_DEPS "")
227+
228+
# First call: find_package(Qt6 6.5.0 COMPONENTS Core CONFIG)
229+
_cpp_library_track_find_package("Qt6" "6.5.0" "COMPONENTS" "Core" "CONFIG")
230+
231+
get_property(FIRST_CONFIG GLOBAL PROPERTY "_CPP_LIBRARY_TRACKED_DEP_Qt6")
232+
message(STATUS "After first call: ${FIRST_CONFIG}")
233+
234+
# Verify initial state
235+
set(EXPECTED_FIRST "Qt6 6.5.0 COMPONENTS Core CONFIG")
236+
if(NOT "${FIRST_CONFIG}" STREQUAL "${EXPECTED_FIRST}")
237+
message(FATAL_ERROR "✗ FAIL: Expected '${EXPECTED_FIRST}' but got '${FIRST_CONFIG}'")
238+
endif()
239+
240+
# Second call: find_package(Qt6 6.5.0 COMPONENTS Widgets CONFIG)
241+
# This should merge components but NOT treat CONFIG as a component
242+
_cpp_library_track_find_package("Qt6" "6.5.0" "COMPONENTS" "Widgets" "CONFIG")
243+
244+
get_property(MERGED_CONFIG GLOBAL PROPERTY "_CPP_LIBRARY_TRACKED_DEP_Qt6")
245+
message(STATUS "After second call: ${MERGED_CONFIG}")
246+
247+
# Verify CONFIG is at the end, not in the component list
248+
set(EXPECTED_MERGED "Qt6 6.5.0 COMPONENTS Core Widgets CONFIG")
249+
if("${MERGED_CONFIG}" STREQUAL "${EXPECTED_MERGED}")
250+
message(STATUS "✓ PASS: CONFIG keyword not treated as component")
251+
else()
252+
message(FATAL_ERROR "✗ FAIL: Expected '${EXPECTED_MERGED}' but got '${MERGED_CONFIG}'")
253+
endif()
254+
218255
message(STATUS "")
219256
message(STATUS "===========================================")
220257
message(STATUS "All provider merging tests passed!")

0 commit comments

Comments
 (0)