find_package: allow <pkg>Config.cmake to set <pkg>_FOUND to FALSE

Before, find_package in Config mode always set Foo_FOUND to true if the
Config file has been found and could be executed.
If the Config file itself detected some problem, like a missing dependency,
it did not have a way to signal to the outside that the package is not working.
With this patch, if a Config file sets Foo_FOUND to FALSE, this is taken into
account and not overridden.

Alex
This commit is contained in:
Alex Neundorf 2012-03-10 11:21:05 +01:00 committed by Brad King
parent e8f1d7f031
commit 16c0c7376c
1 changed files with 34 additions and 4 deletions

View File

@ -952,11 +952,26 @@ bool cmFindPackageCommand::HandlePackageMode()
}
}
std::string foundVar = this->Name;
foundVar += "_FOUND";
// If the directory for the config file was found, try to read the file.
bool result = true;
bool found = false;
bool configFileSetFOUNDFalse = false;
if(fileFound)
{
if ((this->Makefile->IsDefinitionSet(foundVar.c_str()))
&& (this->Makefile->IsOn(foundVar.c_str()) == false))
{
// by removing Foo_FOUND here if it is FALSE, we don't really change
// the situation for the Config file which is about to be included,
// but we make it possible to detect later on whether the Config file
// has set Foo_FOUND to FALSE itself:
this->Makefile->RemoveDefinition(foundVar.c_str());
}
// Set the version variables before loading the config file.
// It may override them.
this->StoreVersionFound();
@ -966,6 +981,15 @@ bool cmFindPackageCommand::HandlePackageMode()
{
// The package has been found.
found = true;
// Check whether the Config file has set Foo_FOUND to FALSE:
if ((this->Makefile->IsDefinitionSet(foundVar.c_str()))
&& (this->Makefile->IsOn(foundVar.c_str()) == false))
{
// we get here if the Config file has set Foo_FOUND actively to FALSE
found = false;
configFileSetFOUNDFalse = true;
}
}
else
{
@ -973,14 +997,22 @@ bool cmFindPackageCommand::HandlePackageMode()
result = false;
}
}
else if(!this->Quiet || this->Required)
if (result && !found && (!this->Quiet || this->Required))
{
// The variable is not set.
cmOStringStream e;
cmOStringStream aw;
if (configFileSetFOUNDFalse)
{
e << "Found package configuration file:\n"
" " << this->FileFound << "\n"
"but it set " << foundVar << " to FALSE so package \"" <<
this->Name << "\" is considered to be NOT FOUND.";
}
// If there are files in ConsideredConfigs, it means that FooConfig.cmake
// have been found, but they didn't have appropriate versions.
if (this->ConsideredConfigs.size() > 0)
else if (this->ConsideredConfigs.size() > 0)
{
e << "Could not find a configuration file for package \""
<< this->Name << "\" that "
@ -1074,8 +1106,6 @@ bool cmFindPackageCommand::HandlePackageMode()
}
// Set a variable marking whether the package was found.
std::string foundVar = this->Name;
foundVar += "_FOUND";
this->Makefile->AddDefinition(foundVar.c_str(), found? "1":"0");
// Set a variable naming the configuration file that was found.