mirror of
https://github.com/Kitware/CMake.git
synced 2026-08-03 14:20:27 +00:00
find_package: Fix NO_MODULE under CMAKE_FIND_PACKAGE_PREFER_CONFIG
The module mode fallback added by commit 22e65d10c1 (find_package: Fixed
CMAKE_FIND_PACKAGE_PREFER_CONFIG Module fallback, 2019-06-13,
v3.15.0-rc2~6^2) should not be used unless the `find_package` call
allows module mode. Doing so can lead to infinite recursion if a find
module tries to call config mode with `find_package(... NO_MODULE)`.
Fix the logic and add a test case.
Fixes: #19478
This commit is contained in:
@@ -823,8 +823,9 @@ bool cmFindPackageCommand::HandlePackageMode(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this->Makefile->IsOn("CMAKE_FIND_PACKAGE_PREFER_CONFIG") && !found &&
|
if (this->UseFindModules && !found &&
|
||||||
handlePackageModeType == HandlePackageModeType::Config) {
|
handlePackageModeType == HandlePackageModeType::Config &&
|
||||||
|
this->Makefile->IsOn("CMAKE_FIND_PACKAGE_PREFER_CONFIG")) {
|
||||||
// Config mode failed. Allow Module case.
|
// Config mode failed. Allow Module case.
|
||||||
result = false;
|
result = false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -579,6 +579,26 @@ endif()
|
|||||||
|
|
||||||
set(CMAKE_FIND_PACKAGE_PREFER_CONFIG OFF)
|
set(CMAKE_FIND_PACKAGE_PREFER_CONFIG OFF)
|
||||||
set(CMAKE_PREFIX_PATH)
|
set(CMAKE_PREFIX_PATH)
|
||||||
|
set(CMAKE_MODULE_PATH)
|
||||||
|
|
||||||
|
############################################################################
|
||||||
|
##Test FIND_PACKAGE CMAKE_FIND_PACKAGE_PREFER_CONFIG - Do not recurse
|
||||||
|
|
||||||
|
# No CMAKE_PREFIX_PATH
|
||||||
|
set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/PreferConfigRecurse)
|
||||||
|
|
||||||
|
# Now prefer config mode
|
||||||
|
set(CMAKE_FIND_PACKAGE_PREFER_CONFIG ON)
|
||||||
|
unset(ACME_FOUND)
|
||||||
|
unset(ACME_CONFIG)
|
||||||
|
|
||||||
|
find_package(ACME)
|
||||||
|
if(ACME_FOUND AND ACME_CONFIG)
|
||||||
|
message(SEND_ERROR "Incorrectly found ACME in CONFIG mode, from the MODULE package")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(CMAKE_FIND_PACKAGE_PREFER_CONFIG OFF)
|
||||||
|
set(CMAKE_MODULE_PATH)
|
||||||
|
|
||||||
############################################################################
|
############################################################################
|
||||||
##Test find_package CMAKE_FIND_PACKAGE_PREFER_CONFIG with module fallback
|
##Test find_package CMAKE_FIND_PACKAGE_PREFER_CONFIG with module fallback
|
||||||
@@ -592,3 +612,16 @@ find_package(ACME REQUIRED)
|
|||||||
if(NOT ACME_FOUND)
|
if(NOT ACME_FOUND)
|
||||||
message(SEND_ERROR "Did not find ACME package")
|
message(SEND_ERROR "Did not find ACME package")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
############################################################################
|
||||||
|
##Test find_package CMAKE_FIND_PACKAGE_PREFER_CONFIG with NO_MODULE
|
||||||
|
|
||||||
|
set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/PreferConfigOnlyModule)
|
||||||
|
|
||||||
|
set(CMAKE_FIND_PACKAGE_PREFER_CONFIG ON)
|
||||||
|
|
||||||
|
find_package(ACME NO_MODULE)
|
||||||
|
|
||||||
|
if(ACME_FOUND)
|
||||||
|
message(SEND_ERROR "Should not find ACME package")
|
||||||
|
endif()
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
set(ACME_FOUND TRUE)
|
||||||
1
Tests/FindPackageTest/PreferConfigRecurse/FindACME.cmake
Normal file
1
Tests/FindPackageTest/PreferConfigRecurse/FindACME.cmake
Normal file
@@ -0,0 +1 @@
|
|||||||
|
find_package(ACME NO_MODULE)
|
||||||
Reference in New Issue
Block a user