FindDependency: Split up macro to allow for no_return variant

Automatic dependency export requires a version of find_dependency that
does not automatically return on a failure to discover a dependency.
This allows the caller to perform clean-up prior to unwinding the
include stack.

Additionally, by making the dependency hash itself a macro "variable",
the hash stack mechanism is no longer necessary.
This commit is contained in:
Vito Gamberini
2025-07-24 14:02:26 -04:00
parent 2d30c49cb9
commit bba78d656e
4 changed files with 52 additions and 31 deletions

View File

@@ -56,44 +56,59 @@ avoid setting such variables before their calls to ``find_dependency``.
#]=======================================================================]
macro(find_dependency dep)
macro(__find_dependency_common cmake_fd_call_hash dep)
set(cmake_fd_quiet_arg)
if(${CMAKE_FIND_PACKAGE_NAME}_FIND_QUIETLY)
set(cmake_fd_quiet_arg QUIET)
endif()
set(cmake_fd_required_arg)
if(${CMAKE_FIND_PACKAGE_NAME}_FIND_REQUIRED)
set(cmake_fd_required_arg REQUIRED)
endif()
get_property(cmake_fd_alreadyTransitive GLOBAL PROPERTY
_CMAKE_${dep}_TRANSITIVE_DEPENDENCY
)
find_package(${dep} ${ARGN}
${cmake_fd_quiet_arg}
${cmake_fd_required_arg}
)
set("_CMAKE_${dep}_${cmake_fd_call_hash}_FOUND" "${${dep}_FOUND}")
if(NOT DEFINED cmake_fd_alreadyTransitive OR cmake_fd_alreadyTransitive)
set_property(GLOBAL PROPERTY _CMAKE_${dep}_TRANSITIVE_DEPENDENCY TRUE)
endif()
unset(cmake_fd_alreadyTransitive)
unset(cmake_fd_quiet_arg)
unset(cmake_fd_required_arg)
endmacro()
macro(__find_dependency_no_return dep)
string(SHA256 cmake_fd_call_hash "${dep};${ARGN};${${CMAKE_FIND_PACKAGE_NAME}_FIND_REQUIRED}")
if(_CMAKE_${dep}_${cmake_fd_call_hash}_FOUND)
unset(cmake_fd_call_hash)
set(${dep}_FOUND ${_CMAKE_${dep}_${cmake_fd_call_hash}_FOUND})
else()
list(APPEND _CMAKE_${dep}_HASH_STACK ${cmake_fd_call_hash})
set(cmake_fd_quiet_arg)
if(${CMAKE_FIND_PACKAGE_NAME}_FIND_QUIETLY)
set(cmake_fd_quiet_arg QUIET)
endif()
set(cmake_fd_required_arg)
if(${CMAKE_FIND_PACKAGE_NAME}_FIND_REQUIRED)
set(cmake_fd_required_arg REQUIRED)
endif()
get_property(cmake_fd_alreadyTransitive GLOBAL PROPERTY
_CMAKE_${dep}_TRANSITIVE_DEPENDENCY
)
find_package(${dep} ${ARGN}
${cmake_fd_quiet_arg}
${cmake_fd_required_arg}
)
list(POP_BACK _CMAKE_${dep}_HASH_STACK cmake_fd_call_hash)
set("_CMAKE_${dep}_${cmake_fd_call_hash}_FOUND" "${${dep}_FOUND}")
if(NOT DEFINED cmake_fd_alreadyTransitive OR cmake_fd_alreadyTransitive)
set_property(GLOBAL PROPERTY _CMAKE_${dep}_TRANSITIVE_DEPENDENCY TRUE)
endif()
unset(cmake_fd_alreadyTransitive)
unset(cmake_fd_call_hash)
unset(cmake_fd_quiet_arg)
unset(cmake_fd_required_arg)
__find_dependency_common(${cmake_fd_call_hash} ${ARGV})
if (NOT ${dep}_FOUND)
set(${CMAKE_FIND_PACKAGE_NAME}_NOT_FOUND_MESSAGE "${CMAKE_FIND_PACKAGE_NAME} could not be found because dependency ${dep} could not be found.")
set(${CMAKE_FIND_PACKAGE_NAME}_FOUND False)
endif()
endif()
unset(cmake_fd_call_hash)
endmacro()
macro(find_dependency dep)
string(SHA256 cmake_fd_call_hash "${dep};${ARGN};${${CMAKE_FIND_PACKAGE_NAME}_FIND_REQUIRED}")
if(NOT _CMAKE_${dep}_${cmake_fd_call_hash}_FOUND)
__find_dependency_common(${cmake_fd_call_hash} ${ARGV})
if (NOT ${dep}_FOUND)
set(${CMAKE_FIND_PACKAGE_NAME}_NOT_FOUND_MESSAGE "${CMAKE_FIND_PACKAGE_NAME} could not be found because dependency ${dep} could not be found.")
set(${CMAKE_FIND_PACKAGE_NAME}_FOUND False)
unset(cmake_fd_call_hash)
return()
endif()
endif()
unset(cmake_fd_call_hash)
endmacro()

View File

@@ -7,5 +7,7 @@ CMake Error at .*/Modules/CMakeFindDependencyMacro.cmake:[0-9]+ \(find_package\)
.*/Tests/RunCMake/find_dependency/share/cmake/Pack1/Pack1Config.cmake, version: 1.3
Call Stack \(most recent call first\):
[^
]*/Modules/CMakeFindDependencyMacro.cmake:[0-9]+ \(__find_dependency_common\)
bad-version-exact.cmake:5 \(find_dependency\)
CMakeLists.txt:3 \(include\)

View File

@@ -7,5 +7,7 @@ CMake Error at .*/Modules/CMakeFindDependencyMacro.cmake:[0-9]+ \(find_package\)
.*/Tests/RunCMake/find_dependency/share/cmake/Pack1/Pack1Config.cmake, version: 1.3
Call Stack \(most recent call first\):
[^
]*/Modules/CMakeFindDependencyMacro.cmake:[0-9]+ \(__find_dependency_common\)
bad-version-fuzzy.cmake:5 \(find_dependency\)
CMakeLists.txt:3 \(include\)

View File

@@ -1,5 +1,7 @@
CMake Error at .*Modules/CMakeFindDependencyMacro.cmake:[0-9]+ \(find_package\):
find_package called with invalid argument "EXACTYPO"
Call Stack \(most recent call first\):
[^
]*/Modules/CMakeFindDependencyMacro.cmake:[0-9]+ \(__find_dependency_common\)
invalid-arg.cmake:5 \(find_dependency\)
CMakeLists.txt:3 \(include\)