Forráskód Böngészése

ENH: Added support for looking through CMAKE_MODULE_PATH to locate Find<name>.cmake modules.

Brad King 23 éve
szülő
commit
af96ba019e
1 módosított fájl, 31 hozzáadás és 10 törlés
  1. 31 10
      Source/cmFindPackageCommand.cxx

+ 31 - 10
Source/cmFindPackageCommand.cxx

@@ -101,18 +101,39 @@ bool cmFindPackageCommand::InitialPass(std::vector<std::string> const& args)
 //----------------------------------------------------------------------------
 bool cmFindPackageCommand::FindModule(bool& found)
 {
-  // If there is a find module, use it.
-  std::string module = m_Makefile->GetDefinition("CMAKE_ROOT");
-  module += "/Modules/Find";
-  module += this->Name;
-  module += ".cmake";
+  // Search the CMAKE_MODULE_PATH for a Find<name>.cmake module.
   found = false;
-  // TODO: CMAKE_PACKAGE_PATH for looking for Find<name>.cmake
-  // modules?
-  if(cmSystemTools::FileExists(module.c_str()))
+  std::string module;
+  std::vector<std::string> modulePath;
+  const char* def = m_Makefile->GetDefinition("CMAKE_MODULE_PATH");
+  if(def)
     {
-    found = true;
-    return this->ReadListFile(module.c_str());
+    cmSystemTools::ExpandListArgument(def, modulePath);
+    }
+  
+  // Also search in the standard modules location.
+  def = m_Makefile->GetDefinition("CMAKE_ROOT");
+  if(def)
+    {
+    std::string rootModules = def;
+    rootModules += "/Modules";
+    modulePath.push_back(rootModules);
+    }
+  
+  // Look through the possible module directories.
+  for(std::vector<std::string>::iterator i = modulePath.begin();
+      i != modulePath.end(); ++i)
+    {
+    module = *i;
+    cmSystemTools::ConvertToUnixSlashes(module);
+    module += "/Find";
+    module += this->Name;
+    module += ".cmake";
+    if(cmSystemTools::FileExists(module.c_str()))
+      {
+      found = true;
+      return this->ReadListFile(module.c_str());
+      }
     }
   return true;
 }