From 22e65d10c175081ed5f21f86c7064c014fc3f39c Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Thu, 13 Jun 2019 23:58:30 +0200 Subject: find_package: Fixed CMAKE_FIND_PACKAGE_PREFER_CONFIG Module fallback Fixes: #19361 --- Source/cmFindPackageCommand.cxx | 20 ++++++++++++++++---- Source/cmFindPackageCommand.h | 9 ++++++++- Tests/FindPackageTest/CMakeLists.txt | 13 +++++++++++++ .../PreferConfigOnlyModule/FindACME.cmake | 1 + 4 files changed, 38 insertions(+), 5 deletions(-) create mode 100644 Tests/FindPackageTest/PreferConfigOnlyModule/FindACME.cmake diff --git a/Source/cmFindPackageCommand.cxx b/Source/cmFindPackageCommand.cxx index 8eefaa7..828488f 100644 --- a/Source/cmFindPackageCommand.cxx +++ b/Source/cmFindPackageCommand.cxx @@ -502,8 +502,13 @@ bool cmFindPackageCommand::InitialPass(std::vector const& args, if (this->Makefile->IsOn("CMAKE_FIND_PACKAGE_PREFER_CONFIG")) { if (this->UseConfigFiles && this->FindPackageUsingConfigMode()) { loadedPackage = true; - } else if (this->FindPackageUsingModuleMode()) { - loadedPackage = true; + } else { + if (this->FindPackageUsingModuleMode()) { + loadedPackage = true; + } else { + // The package was not loaded. Report errors. + HandlePackageMode(HandlePackageModeType::Module); + } } } else { if (this->UseFindModules && this->FindPackageUsingModuleMode()) { @@ -603,7 +608,7 @@ bool cmFindPackageCommand::FindPackageUsingConfigMode() this->IgnoredPaths.insert(ignored.begin(), ignored.end()); // Find and load the package. - return this->HandlePackageMode(); + return this->HandlePackageMode(HandlePackageModeType::Config); } void cmFindPackageCommand::SetModuleVariables(const std::string& components) @@ -722,7 +727,8 @@ bool cmFindPackageCommand::FindModule(bool& found) return true; } -bool cmFindPackageCommand::HandlePackageMode() +bool cmFindPackageCommand::HandlePackageMode( + HandlePackageModeType handlePackageModeType) { this->ConsideredConfigs.clear(); @@ -817,6 +823,12 @@ bool cmFindPackageCommand::HandlePackageMode() } } + if (this->Makefile->IsOn("CMAKE_FIND_PACKAGE_PREFER_CONFIG") && !found && + handlePackageModeType == HandlePackageModeType::Config) { + // Config mode failed. Allow Module case. + result = false; + } + // package not found if (result && !found) { // warn if package required or neither quiet nor in config mode diff --git a/Source/cmFindPackageCommand.h b/Source/cmFindPackageCommand.h index 4f6d97c..316ca0f 100644 --- a/Source/cmFindPackageCommand.h +++ b/Source/cmFindPackageCommand.h @@ -103,7 +103,14 @@ private: bool FindModule(bool& found); void AddFindDefinition(const std::string& var, const char* val); void RestoreFindDefinitions(); - bool HandlePackageMode(); + + enum /*class*/ HandlePackageModeType + { + Module, + Config + }; + bool HandlePackageMode(HandlePackageModeType type); + bool FindConfig(); bool FindPrefixedConfig(); bool FindFrameworkConfig(); diff --git a/Tests/FindPackageTest/CMakeLists.txt b/Tests/FindPackageTest/CMakeLists.txt index 8802b73..affe5d5 100644 --- a/Tests/FindPackageTest/CMakeLists.txt +++ b/Tests/FindPackageTest/CMakeLists.txt @@ -579,3 +579,16 @@ endif() set(CMAKE_FIND_PACKAGE_PREFER_CONFIG OFF) set(CMAKE_PREFIX_PATH) + +############################################################################ +##Test find_package CMAKE_FIND_PACKAGE_PREFER_CONFIG with module fallback + +set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/PreferConfigOnlyModule) + +set(CMAKE_FIND_PACKAGE_PREFER_CONFIG ON) + +find_package(ACME REQUIRED) + +if(NOT ACME_FOUND) + message(SEND_ERROR "Did not find ACME package") +endif() diff --git a/Tests/FindPackageTest/PreferConfigOnlyModule/FindACME.cmake b/Tests/FindPackageTest/PreferConfigOnlyModule/FindACME.cmake new file mode 100644 index 0000000..7a4e1b3 --- /dev/null +++ b/Tests/FindPackageTest/PreferConfigOnlyModule/FindACME.cmake @@ -0,0 +1 @@ +set(ACME_FOUND TRUE) -- cgit v0.12