mirror of
https://github.com/Kitware/CMake.git
synced 2026-01-09 07:11:05 -06:00
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:
@@ -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()
|
||||
|
||||
@@ -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\)
|
||||
|
||||
@@ -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\)
|
||||
|
||||
@@ -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\)
|
||||
|
||||
Reference in New Issue
Block a user