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: Alex Neundorf <neundorf@kde.org>
This commit is contained in:
Brad King 2012-02-28 09:51:10 -05:00
parent 31ead5f695
commit d3651041e9
3 changed files with 62 additions and 0 deletions

View File

@ -745,6 +745,26 @@ void cmDocumentVariables::DefineVariables(cmake* cm)
"this package from the cache using the cache editor or cmake -U", false, "this package from the cache using the cache editor or cmake -U", false,
"Variables That Change Behavior"); "Variables That Change Behavior");
cm->DefineProperty
("CMAKE_FIND_PACKAGE_WARN_NO_MODULE", cmProperty::VARIABLE,
"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."
"\n"
"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");
cm->DefineProperty cm->DefineProperty
("CMAKE_USER_MAKE_RULES_OVERRIDE", cmProperty::VARIABLE, ("CMAKE_USER_MAKE_RULES_OVERRIDE", cmProperty::VARIABLE,
"Specify a CMake file that overrides platform information.", "Specify a CMake file that overrides platform information.",

View File

@ -73,6 +73,7 @@ cmFindPackageCommand::cmFindPackageCommand()
this->VersionFoundPatch = 0; this->VersionFoundPatch = 0;
this->VersionFoundTweak = 0; this->VersionFoundTweak = 0;
this->VersionFoundCount = 0; this->VersionFoundCount = 0;
this->RequiredCMakeVersion = 0;
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
@ -372,6 +373,15 @@ bool cmFindPackageCommand
return false; return false;
} }
// Lookup required version of CMake.
if(const char* rv =
this->Makefile->GetDefinition("CMAKE_MINIMUM_REQUIRED_VERSION"))
{
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. // Check for debug mode.
this->DebugMode = this->Makefile->IsOn("CMAKE_FIND_DEBUG_MODE"); this->DebugMode = this->Makefile->IsOn("CMAKE_FIND_DEBUG_MODE");
@ -691,6 +701,37 @@ bool cmFindPackageCommand
} }
} }
if(this->UseFindModules && this->UseConfigFiles &&
this->Makefile->IsOn("CMAKE_FIND_PACKAGE_WARN_NO_MODULE"))
{
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). ";
}
else
{
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 "
"CMAKE_MODULE_PATH.";
}
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 // No find module. Assume the project has a CMake config file. Use
// a <package>_DIR cache variable to locate it. // a <package>_DIR cache variable to locate it.
this->Variable = this->Name; this->Variable = this->Name;

View File

@ -130,6 +130,7 @@ private:
unsigned int VersionFoundPatch; unsigned int VersionFoundPatch;
unsigned int VersionFoundTweak; unsigned int VersionFoundTweak;
unsigned int VersionFoundCount; unsigned int VersionFoundCount;
unsigned int RequiredCMakeVersion;
bool Quiet; bool Quiet;
bool Required; bool Required;
bool Compatibility_1_6; bool Compatibility_1_6;