From 9fc7ea4c620e849a719ea23ea6faff17f1d67ee6 Mon Sep 17 00:00:00 2001
From: Brad King <brad.king@kitware.com>
Date: Thu, 7 Apr 2011 15:36:05 -0400
Subject: 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.
---
 Source/cmFindPackageCommand.cxx                    | 37 ++++++++++++++--------
 Tests/FindPackageTest/CMakeLists.txt               |  2 +-
 .../lib/RecursiveA/recursivea-config.cmake         |  3 ++
 3 files changed, 27 insertions(+), 15 deletions(-)

diff --git a/Source/cmFindPackageCommand.cxx b/Source/cmFindPackageCommand.cxx
index fdc1a01..d3c4bc7 100644
--- a/Source/cmFindPackageCommand.cxx
+++ b/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());
+        }
       }
     }
 
diff --git a/Tests/FindPackageTest/CMakeLists.txt b/Tests/FindPackageTest/CMakeLists.txt
index f420f4b..d4984d7 100644
--- a/Tests/FindPackageTest/CMakeLists.txt
+++ b/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)
 
diff --git a/Tests/FindPackageTest/lib/RecursiveA/recursivea-config.cmake b/Tests/FindPackageTest/lib/RecursiveA/recursivea-config.cmake
index deffa57..eff4d4f 100644
--- a/Tests/FindPackageTest/lib/RecursiveA/recursivea-config.cmake
+++ b/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()
-- 
cgit v0.12