find_package: Forward component list for recursive calls in modules

Some find modules call find_package recursively to locate a package
configuration file for the package instead of searching for individual
pieces.  Commit 79e9b755 (Help recursive find_package calls in modules,
2008-10-03) taught find_package to forward the version number and EXACT
arguments through the recursive call automatically.  Do the same for the
component list.
This commit is contained in:
Brad King 2011-04-07 15:36:05 -04:00
parent c2f8a13715
commit 9fc7ea4c62
3 changed files with 26 additions and 14 deletions

View File

@ -101,9 +101,10 @@ void cmFindPackageCommand::GenerateDocumentation()
"The [version] argument requests a version with which the package found " "The [version] argument requests a version with which the package found "
"should be compatible (format is major[.minor[.patch[.tweak]]]). " "should be compatible (format is major[.minor[.patch[.tweak]]]). "
"The EXACT option requests that the version be matched exactly. " "The EXACT option requests that the version be matched exactly. "
"If no [version] is given to a recursive invocation inside a " "If no [version] and/or component list is given to a recursive "
"find-module, the [version] and EXACT arguments are forwarded " "invocation inside a find-module, the corresponding arguments "
"automatically from the outer call. " "are forwarded automatically from the outer call (including the "
"EXACT flag for [version]). "
"Version support is currently provided only on a package-by-package " "Version support is currently provided only on a package-by-package "
"basis (details below).\n" "basis (details below).\n"
"User code should generally look for packages using the above simple " "User code should generally look for packages using the above simple "
@ -524,7 +525,7 @@ bool cmFindPackageCommand
cmake::AUTHOR_WARNING, "Ignoring EXACT since no version is requested."); cmake::AUTHOR_WARNING, "Ignoring EXACT since no version is requested.");
} }
if(this->Version.empty()) if(this->Version.empty() || components.empty())
{ {
// Check whether we are recursing inside "Find<name>.cmake" within // Check whether we are recursing inside "Find<name>.cmake" within
// another find_package(<name>) call. // another find_package(<name>) call.
@ -532,16 +533,24 @@ bool cmFindPackageCommand
mod += "_FIND_MODULE"; mod += "_FIND_MODULE";
if(this->Makefile->IsOn(mod.c_str())) if(this->Makefile->IsOn(mod.c_str()))
{ {
// Get version information from the outer call if necessary. if(this->Version.empty())
// Requested version string. {
std::string ver = this->Name; // Get version information from the outer call if necessary.
ver += "_FIND_VERSION"; // Requested version string.
this->Version = this->Makefile->GetSafeDefinition(ver.c_str()); std::string ver = this->Name;
ver += "_FIND_VERSION";
this->Version = this->Makefile->GetSafeDefinition(ver.c_str());
// Whether an exact version is required. // Whether an exact version is required.
std::string exact = this->Name; std::string exact = this->Name;
exact += "_FIND_VERSION_EXACT"; exact += "_FIND_VERSION_EXACT";
this->VersionExact = this->Makefile->IsOn(exact.c_str()); this->VersionExact = this->Makefile->IsOn(exact.c_str());
}
if(components.empty())
{
std::string components_var = this->Name + "_FIND_COMPONENTS";
components = this->Makefile->GetSafeDefinition(components_var.c_str());
}
} }
} }

View File

@ -105,7 +105,7 @@ FIND_PACKAGE(wibbleA NAMES wibble PATHS B)
FIND_PACKAGE(wibbleB NAMES wibble HINTS B) FIND_PACKAGE(wibbleB NAMES wibble HINTS B)
# Look for package with recursive find-modules. # Look for package with recursive find-modules.
FIND_PACKAGE(RecursiveA) FIND_PACKAGE(RecursiveA COMPONENTS A)
FIND_PACKAGE(RecursiveB 2) FIND_PACKAGE(RecursiveB 2)
FIND_PACKAGE(RecursiveC 3.1 EXACT) FIND_PACKAGE(RecursiveC 3.1 EXACT)

View File

@ -1 +1,4 @@
# Test config file. # Test config file.
if(NOT "${RecursiveA_FIND_COMPONENTS}" STREQUAL "A")
message(FATAL_ERROR "find_package(RecursiveA NO_MODULE) did not forward components")
endif()