@@ -31,15 +31,21 @@ if(CMAKE_VERSION VERSION_LESS "3.24")
3131endif ()
3232
3333# Check if provider is already installed (avoid double-installation)
34+ # Skip this check in test mode to allow function definitions to be loaded
3435get_property (_CPP_LIBRARY_PROVIDER_INSTALLED GLOBAL PROPERTY _CPP_LIBRARY_PROVIDER_INSTALLED )
35- if (_CPP_LIBRARY_PROVIDER_INSTALLED)
36+ if (_CPP_LIBRARY_PROVIDER_INSTALLED AND NOT CPP_LIBRARY_TEST_MODE )
3637 return ()
3738endif ()
3839
3940# Define all functions BEFORE installing the provider
4041# The dependency provider implementation
4142# This function is called before every find_package() and FetchContent_MakeAvailable()
4243# It tracks dependency information; CMake automatically falls back to default behavior after return
44+ #
45+ # QUIET Dependency Handling:
46+ # When find_package() is called with QUIET, we track it tentatively, then use cmake_language(DEFER)
47+ # to verify after find_package() completes whether the package was found. If not found, we remove
48+ # the tracking to prevent phantom dependencies in the generated Config.cmake.
4349function (_cpp_library_dependency_provider method )
4450 if (method STREQUAL "FIND_PACKAGE" )
4551 _cpp_library_track_find_package (${ARGN} )
@@ -53,6 +59,7 @@ endfunction()
5359
5460# Track a find_package() call
5561# Records: package name, version, components, and full call syntax
62+ # For QUIET packages, defers verification until after find_package() completes
5663function (_cpp_library_track_find_package package_name )
5764 # Parse find_package arguments
5865 set (options QUIET REQUIRED NO_MODULE CONFIG)
@@ -171,6 +178,46 @@ function(_cpp_library_track_find_package package_name)
171178 endif ()
172179
173180 message (DEBUG "cpp-library: Tracked find_package(${package_name} ) → find_dependency(${FIND_DEP_CALL} )" )
181+
182+ # For QUIET packages, defer a check to remove the tracking if the package wasn't found
183+ # This prevents phantom dependencies from QUIET find_package() calls that fail
184+ if (FP_QUIET)
185+ cmake_language (DEFER CALL _cpp_library_verify_quiet_dependency "${package_name} " )
186+ endif ()
187+ endfunction ()
188+
189+ # Verify that a QUIET find_package() call actually found the package
190+ # Called via cmake_language(DEFER) after find_package() completes
191+ # Removes the tracking if the package wasn't found (prevents phantom dependencies)
192+ function (_cpp_library_verify_quiet_dependency package_name )
193+ # Check if the package was found using various possible _FOUND variable names
194+ # CMake allows packages to set <PackageName>_FOUND or <PACKAGENAME>_FOUND
195+ set (FOUND FALSE )
196+
197+ if (DEFINED ${package_name} _FOUND AND ${package_name} _FOUND)
198+ set (FOUND TRUE )
199+ else ()
200+ # Try uppercase version
201+ string (TOUPPER "${package_name} " package_upper)
202+ if (DEFINED ${package_upper} _FOUND AND ${package_upper} _FOUND)
203+ set (FOUND TRUE )
204+ endif ()
205+ endif ()
206+
207+ # If not found, remove from tracking
208+ if (NOT FOUND)
209+ # Remove from the tracked dependency
210+ set_property (GLOBAL PROPERTY "_CPP_LIBRARY_TRACKED_DEP_${package_name} " "" )
211+
212+ # Remove from the list of all tracked dependencies
213+ get_property (ALL_DEPS GLOBAL PROPERTY _CPP_LIBRARY_ALL_TRACKED_DEPS )
214+ list (REMOVE_ITEM ALL_DEPS "${package_name} " )
215+ set_property (GLOBAL PROPERTY _CPP_LIBRARY_ALL_TRACKED_DEPS "${ALL_DEPS} " )
216+
217+ message (DEBUG "cpp-library: Removed QUIET dependency ${package_name} (not found)" )
218+ else ()
219+ message (DEBUG "cpp-library: Verified QUIET dependency ${package_name} (found)" )
220+ endif ()
174221endfunction ()
175222
176223# Track a FetchContent_MakeAvailable() call
@@ -231,13 +278,16 @@ function(_cpp_library_get_all_tracked_deps OUTPUT_VAR)
231278endfunction ()
232279
233280# Now install the dependency provider (after all functions are defined)
234- set_property (GLOBAL PROPERTY _CPP_LIBRARY_PROVIDER_INSTALLED TRUE )
281+ # Only install if not already marked as installed (allows tests to skip installation)
282+ if (NOT _CPP_LIBRARY_PROVIDER_INSTALLED)
283+ set_property (GLOBAL PROPERTY _CPP_LIBRARY_PROVIDER_INSTALLED TRUE )
235284
236- cmake_language (SET_DEPENDENCY_PROVIDER _cpp_library_dependency_provider
237- SUPPORTED_METHODS
238- FIND_PACKAGE
239- FETCHCONTENT_MAKEAVAILABLE_SERIAL
240- )
285+ cmake_language (SET_DEPENDENCY_PROVIDER _cpp_library_dependency_provider
286+ SUPPORTED_METHODS
287+ FIND_PACKAGE
288+ FETCHCONTENT_MAKEAVAILABLE_SERIAL
289+ )
241290
242- message (STATUS "cpp-library: Dependency tracking enabled" )
291+ message (STATUS "cpp-library: Dependency tracking enabled" )
292+ endif ()
243293
0 commit comments