ENH: Preserve <pkg>_FIND_XXX vars in find_package

When the find_package command loads a module it sets several
<pkg>_FIND_XXX variables to communicate information about the command
invocation to the module.  This restores the original state of the
variables when the command returns.  This behavior is useful when a
find-module recursively calls find_package with NO_MODULE so that the
inner call does not change the values in the find-module.
This commit is contained in:
Brad King 2008-12-09 10:08:54 -05:00
parent 360d9465a2
commit ae28ec9f24
2 changed files with 51 additions and 12 deletions

View File

@ -422,7 +422,7 @@ bool cmFindPackageCommand
// Set a variable telling the find script this component // Set a variable telling the find script this component
// is required. // is required.
std::string req_var = this->Name + "_FIND_REQUIRED_" + args[i]; std::string req_var = this->Name + "_FIND_REQUIRED_" + args[i];
this->Makefile->AddDefinition(req_var.c_str(), "1"); this->AddFindDefinition(req_var.c_str(), "1");
// Append to the list of required components. // Append to the list of required components.
components += components_sep; components += components_sep;
@ -579,7 +579,7 @@ void cmFindPackageCommand::SetModuleVariables(const std::string& components)
{ {
// Store the list of components. // Store the list of components.
std::string components_var = this->Name + "_FIND_COMPONENTS"; std::string components_var = this->Name + "_FIND_COMPONENTS";
this->Makefile->AddDefinition(components_var.c_str(), components.c_str()); this->AddFindDefinition(components_var.c_str(), components.c_str());
if(this->Quiet) if(this->Quiet)
{ {
@ -587,7 +587,7 @@ void cmFindPackageCommand::SetModuleVariables(const std::string& components)
// quietly. // quietly.
std::string quietly = this->Name; std::string quietly = this->Name;
quietly += "_FIND_QUIETLY"; quietly += "_FIND_QUIETLY";
this->Makefile->AddDefinition(quietly.c_str(), "1"); this->AddFindDefinition(quietly.c_str(), "1");
} }
if(this->Required) if(this->Required)
@ -596,7 +596,7 @@ void cmFindPackageCommand::SetModuleVariables(const std::string& components)
// a fatal error if the package is not found. // a fatal error if the package is not found.
std::string req = this->Name; std::string req = this->Name;
req += "_FIND_REQUIRED"; req += "_FIND_REQUIRED";
this->Makefile->AddDefinition(req.c_str(), "1"); this->AddFindDefinition(req.c_str(), "1");
} }
if(!this->Version.empty()) if(!this->Version.empty())
@ -605,27 +605,58 @@ void cmFindPackageCommand::SetModuleVariables(const std::string& components)
// package has been requested. // package has been requested.
std::string ver = this->Name; std::string ver = this->Name;
ver += "_FIND_VERSION"; ver += "_FIND_VERSION";
this->Makefile->AddDefinition(ver.c_str(), this->Version.c_str()); this->AddFindDefinition(ver.c_str(), this->Version.c_str());
char buf[64]; char buf[64];
sprintf(buf, "%u", this->VersionMajor); sprintf(buf, "%u", this->VersionMajor);
this->Makefile->AddDefinition((ver+"_MAJOR").c_str(), buf); this->AddFindDefinition((ver+"_MAJOR").c_str(), buf);
sprintf(buf, "%u", this->VersionMinor); sprintf(buf, "%u", this->VersionMinor);
this->Makefile->AddDefinition((ver+"_MINOR").c_str(), buf); this->AddFindDefinition((ver+"_MINOR").c_str(), buf);
sprintf(buf, "%u", this->VersionPatch); sprintf(buf, "%u", this->VersionPatch);
this->Makefile->AddDefinition((ver+"_PATCH").c_str(), buf); this->AddFindDefinition((ver+"_PATCH").c_str(), buf);
sprintf(buf, "%u", this->VersionTweak); sprintf(buf, "%u", this->VersionTweak);
this->Makefile->AddDefinition((ver+"_TWEAK").c_str(), buf); this->AddFindDefinition((ver+"_TWEAK").c_str(), buf);
sprintf(buf, "%u", this->VersionCount); sprintf(buf, "%u", this->VersionCount);
this->Makefile->AddDefinition((ver+"_COUNT").c_str(), buf); this->AddFindDefinition((ver+"_COUNT").c_str(), buf);
// Tell the module whether an exact version has been requested. // Tell the module whether an exact version has been requested.
std::string exact = this->Name; std::string exact = this->Name;
exact += "_FIND_VERSION_EXACT"; exact += "_FIND_VERSION_EXACT";
this->Makefile->AddDefinition(exact.c_str(), this->AddFindDefinition(exact.c_str(), this->VersionExact? "1":"0");
this->VersionExact? "1":"0");
} }
} }
//----------------------------------------------------------------------------
void cmFindPackageCommand::AddFindDefinition(const char* var, const char* val)
{
if(const char* old = this->Makefile->GetDefinition(var))
{
this->OriginalDefs[var].exists = true;
this->OriginalDefs[var].value = old;
}
else
{
this->OriginalDefs[var].exists = false;
}
this->Makefile->AddDefinition(var, val);
}
//----------------------------------------------------------------------------
void cmFindPackageCommand::RestoreFindDefinitions()
{
for(std::map<cmStdString, OriginalDef>::iterator
i = this->OriginalDefs.begin(); i != this->OriginalDefs.end(); ++i)
{
OriginalDef const& od = i->second;
if(od.exists)
{
this->Makefile->AddDefinition(i->first.c_str(), od.value.c_str());
}
else
{
this->Makefile->RemoveDefinition(i->first.c_str());
}
}
}
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
bool cmFindPackageCommand::FindModule(bool& found) bool cmFindPackageCommand::FindModule(bool& found)
@ -1008,6 +1039,9 @@ void cmFindPackageCommand::AppendSuccessInformation()
this->AppendToProperty("DISABLED_FEATURES"); this->AppendToProperty("DISABLED_FEATURES");
} }
} }
// Restore original state of "_FIND_" variables we set.
this->RestoreFindDefinitions();
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------

View File

@ -75,6 +75,8 @@ private:
void AppendToProperty(const char* propertyName); void AppendToProperty(const char* propertyName);
void SetModuleVariables(const std::string& components); void SetModuleVariables(const std::string& components);
bool FindModule(bool& found); bool FindModule(bool& found);
void AddFindDefinition(const char* var, const char* val);
void RestoreFindDefinitions();
bool HandlePackageMode(); bool HandlePackageMode();
void FindConfig(); void FindConfig();
bool FindPrefixedConfig(); bool FindPrefixedConfig();
@ -104,6 +106,9 @@ private:
friend class cmFindPackageFileList; friend class cmFindPackageFileList;
struct OriginalDef { bool exists; std::string value; };
std::map<cmStdString, OriginalDef> OriginalDefs;
std::string CommandDocumentation; std::string CommandDocumentation;
cmStdString Name; cmStdString Name;
cmStdString Variable; cmStdString Variable;