Commit d3651041 authored by Brad King's avatar Brad King

find_package: Optionally warn when implicitly using Config mode

Define variable CMAKE_FIND_PACKAGE_WARN_NO_MODULE for use by a project
that wants to use an explicit mode in every call to find_package in
order to generate more specific failure messages.  Word the warning
using the new CONFIG and MODULE mode keywords when the minimum required
version of CMake is new enough to have them.  Otherwise word the warning
using the old NO_MODULE mode keyword.
Inspired-by: Alexander Neundorf's avatarAlex Neundorf <>
parent 31ead5f6
......@@ -745,6 +745,26 @@ void cmDocumentVariables::DefineVariables(cmake* cm)
"this package from the cache using the cache editor or cmake -U", false,
"Variables That Change Behavior");
"Tell find_package to warn if called without an explicit mode.",
"If find_package is called without an explicit mode option "
"(MODULE, CONFIG or NO_MODULE) and no Find<pkg>.cmake module is "
"in CMAKE_MODULE_PATH then CMake implicitly assumes that the "
"caller intends to search for a package configuration file. "
"If no package configuration file is found then the wording "
"of the failure message must account for both the case that the "
"package is really missing and the case that the project has a "
"bug and failed to provide the intended Find module. "
"If instead the caller specifies an explicit mode option then "
"the failure message can be more specific."
"Set CMAKE_FIND_PACKAGE_WARN_NO_MODULE to TRUE to tell find_package "
"to warn when it implicitly assumes Config mode. "
"This helps developers enforce use of an explicit mode in all calls "
"to find_package within a project.", false,
"Variables That Change Behavior");
"Specify a CMake file that overrides platform information.",
......@@ -73,6 +73,7 @@ cmFindPackageCommand::cmFindPackageCommand()
this->VersionFoundPatch = 0;
this->VersionFoundTweak = 0;
this->VersionFoundCount = 0;
this->RequiredCMakeVersion = 0;
......@@ -372,6 +373,15 @@ bool cmFindPackageCommand
return false;
// Lookup required version of CMake.
if(const char* rv =
unsigned int v[3] = {0,0,0};
sscanf(rv, "%u.%u.%u", &v[0], &v[1], &v[2]);
this->RequiredCMakeVersion = CMake_VERSION_ENCODE(v[0],v[1],v[2]);
// Check for debug mode.
this->DebugMode = this->Makefile->IsOn("CMAKE_FIND_DEBUG_MODE");
......@@ -691,6 +701,37 @@ bool cmFindPackageCommand
if(this->UseFindModules && this->UseConfigFiles &&
cmOStringStream aw;
if(this->RequiredCMakeVersion >= CMake_VERSION_ENCODE(2,8,8))
aw << "find_package called without either MODULE or CONFIG option and "
"no Find" << this->Name << ".cmake module is in CMAKE_MODULE_PATH. "
"Add MODULE to exclusively request Module mode and fail if "
"Find" << this->Name << ".cmake is missing. "
"Add CONFIG to exclusively request Config mode and search for a "
"package configuration file provided by " << this->Name <<
" (" << this->Name << "Config.cmake or " <<
cmSystemTools::LowerCase(this->Name) << "-config.cmake). ";
aw << "find_package called without NO_MODULE option and no "
"Find" << this->Name << ".cmake module is in CMAKE_MODULE_PATH. "
"Add NO_MODULE to exclusively request Config mode and search for a "
"package configuration file provided by " << this->Name <<
" (" << this->Name << "Config.cmake or " <<
cmSystemTools::LowerCase(this->Name) << "-config.cmake). "
"Otherwise make Find" << this->Name << ".cmake available in "
aw << "\n"
"(Variable CMAKE_FIND_PACKAGE_WARN_NO_MODULE enabled this warning.)";
this->Makefile->IssueMessage(cmake::AUTHOR_WARNING, aw.str());
// No find module. Assume the project has a CMake config file. Use
// a <package>_DIR cache variable to locate it.
this->Variable = this->Name;
......@@ -130,6 +130,7 @@ private:
unsigned int VersionFoundPatch;
unsigned int VersionFoundTweak;
unsigned int VersionFoundCount;
unsigned int RequiredCMakeVersion;
bool Quiet;
bool Required;
bool Compatibility_1_6;
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment