Browse Source

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.
Brad King 14 years ago
parent
commit
9fc7ea4c62

+ 23 - 14
Source/cmFindPackageCommand.cxx

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

+ 1 - 1
Tests/FindPackageTest/CMakeLists.txt

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

+ 3 - 0
Tests/FindPackageTest/lib/RecursiveA/recursivea-config.cmake

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