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:
parent
e8f1d7f031
commit
16c0c7376c
|
@ -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.
|
// If the directory for the config file was found, try to read the file.
|
||||||
bool result = true;
|
bool result = true;
|
||||||
bool found = false;
|
bool found = false;
|
||||||
|
bool configFileSetFOUNDFalse = false;
|
||||||
|
|
||||||
if(fileFound)
|
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.
|
// Set the version variables before loading the config file.
|
||||||
// It may override them.
|
// It may override them.
|
||||||
this->StoreVersionFound();
|
this->StoreVersionFound();
|
||||||
|
@ -966,6 +981,15 @@ bool cmFindPackageCommand::HandlePackageMode()
|
||||||
{
|
{
|
||||||
// The package has been found.
|
// The package has been found.
|
||||||
found = true;
|
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
|
else
|
||||||
{
|
{
|
||||||
|
@ -973,14 +997,22 @@ bool cmFindPackageCommand::HandlePackageMode()
|
||||||
result = false;
|
result = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(!this->Quiet || this->Required)
|
|
||||||
|
if (result && !found && (!this->Quiet || this->Required))
|
||||||
{
|
{
|
||||||
// The variable is not set.
|
// The variable is not set.
|
||||||
cmOStringStream e;
|
cmOStringStream e;
|
||||||
cmOStringStream aw;
|
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
|
// If there are files in ConsideredConfigs, it means that FooConfig.cmake
|
||||||
// have been found, but they didn't have appropriate versions.
|
// 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 \""
|
e << "Could not find a configuration file for package \""
|
||||||
<< this->Name << "\" that "
|
<< this->Name << "\" that "
|
||||||
|
@ -1074,8 +1106,6 @@ bool cmFindPackageCommand::HandlePackageMode()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set a variable marking whether the package was found.
|
// 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");
|
this->Makefile->AddDefinition(foundVar.c_str(), found? "1":"0");
|
||||||
|
|
||||||
// Set a variable naming the configuration file that was found.
|
// Set a variable naming the configuration file that was found.
|
||||||
|
|
Loading…
Reference in New Issue