|  | @@ -710,17 +710,8 @@ bool cmFindPackageCommand::HandlePackageMode()
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  // Search for the config file if it is not already found.
 | 
	
		
			
				|  |  | -  if(cmSystemTools::IsOff(def))
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -    this->FindConfig();
 | 
	
		
			
				|  |  | -    def = this->Makefile->GetDefinition(this->Variable.c_str());
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  // If the config file was found, load it.
 | 
	
		
			
				|  |  | -  std::string file;
 | 
	
		
			
				|  |  | -  bool result = true;
 | 
	
		
			
				|  |  | -  bool found = false;
 | 
	
		
			
				|  |  | +  // Try to load the config file if the directory is known
 | 
	
		
			
				|  |  | +  bool cachedDirectoryOk = false;
 | 
	
		
			
				|  |  |    if(!cmSystemTools::IsOff(def))
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  |      // Get the directory from the variable value.
 | 
	
	
		
			
				|  | @@ -733,38 +724,44 @@ bool cmFindPackageCommand::HandlePackageMode()
 | 
	
		
			
				|  |  |        dir = "/" + dir;
 | 
	
		
			
				|  |  |        dir = this->Makefile->GetCurrentDirectory() + dir;
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    // Find the configuration file.
 | 
	
		
			
				|  |  | -    if(this->FindConfigFileToLoad(dir, file))
 | 
	
		
			
				|  |  | +    // The file location was cached.  Look for the correct file.
 | 
	
		
			
				|  |  | +    std::string file;
 | 
	
		
			
				|  |  | +    if (this->FindConfigFile(dir, file))
 | 
	
		
			
				|  |  |        {
 | 
	
		
			
				|  |  | -      // Set the version variables before loading the config file.
 | 
	
		
			
				|  |  | -      // It may override them.
 | 
	
		
			
				|  |  | -      this->StoreVersionFound();
 | 
	
		
			
				|  |  | +      this->FileFound = file;
 | 
	
		
			
				|  |  | +      cachedDirectoryOk = true;
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    def = this->Makefile->GetDefinition(this->Variable.c_str());
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -      // Parse the configuration file.
 | 
	
		
			
				|  |  | -      if(this->ReadListFile(file.c_str()))
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -        // The package has been found.
 | 
	
		
			
				|  |  | -        found = true;
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -      else
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -        // The configuration file is invalid.
 | 
	
		
			
				|  |  | -        result = false;
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | +  // Search for the config file if it is not already found.
 | 
	
		
			
				|  |  | +  if(cmSystemTools::IsOff(def) || !cachedDirectoryOk)
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +    this->FindConfig();
 | 
	
		
			
				|  |  | +    def = this->Makefile->GetDefinition(this->Variable.c_str());
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // If the directory for the config file was found, try to read the file.
 | 
	
		
			
				|  |  | +  bool result = true;
 | 
	
		
			
				|  |  | +  bool found = false;
 | 
	
		
			
				|  |  | +  // in the following test FileFound should never be empty if def is valid
 | 
	
		
			
				|  |  | +  // but I don't want to put an assert() in there now, in case this still
 | 
	
		
			
				|  |  | +  // makes it into 2.6.3
 | 
	
		
			
				|  |  | +  if(!cmSystemTools::IsOff(def) && (!this->FileFound.empty()))
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +    // Set the version variables before loading the config file.
 | 
	
		
			
				|  |  | +    // It may override them.
 | 
	
		
			
				|  |  | +    this->StoreVersionFound();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    // Parse the configuration file.
 | 
	
		
			
				|  |  | +    if(this->ReadListFile(this->FileFound.c_str()))
 | 
	
		
			
				|  |  | +      {
 | 
	
		
			
				|  |  | +      // The package has been found.
 | 
	
		
			
				|  |  | +      found = true;
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |      else
 | 
	
		
			
				|  |  |        {
 | 
	
		
			
				|  |  | -      // The variable setting is wrong.
 | 
	
		
			
				|  |  | -      cmOStringStream e;
 | 
	
		
			
				|  |  | -      e << "cannot find package " << this->Name << " because "
 | 
	
		
			
				|  |  | -        << this->Variable << " is set to \"" << def << "\" "
 | 
	
		
			
				|  |  | -        << "which is not a directory containing a package configuration "
 | 
	
		
			
				|  |  | -        << "file (or it is not for the requested version).  "
 | 
	
		
			
				|  |  | -        << "Please set the cache entry " << this->Variable << " "
 | 
	
		
			
				|  |  | -        << "to the correct directory, or delete it to ask CMake "
 | 
	
		
			
				|  |  | -        << "to search.";
 | 
	
		
			
				|  |  | -      this->SetError(e.str().c_str());
 | 
	
		
			
				|  |  | +      // The configuration file is invalid.
 | 
	
		
			
				|  |  |        result = false;
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |      }
 | 
	
	
		
			
				|  | @@ -816,7 +813,7 @@ bool cmFindPackageCommand::HandlePackageMode()
 | 
	
		
			
				|  |  |    fileVar += "_CONFIG";
 | 
	
		
			
				|  |  |    if(found)
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  | -    this->Makefile->AddDefinition(fileVar.c_str(), file.c_str());
 | 
	
		
			
				|  |  | +    this->Makefile->AddDefinition(fileVar.c_str(), this->FileFound.c_str());
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |    else
 | 
	
		
			
				|  |  |      {
 | 
	
	
		
			
				|  | @@ -1244,24 +1241,6 @@ bool cmFindPackageCommand::FindConfigFile(std::string const& dir,
 | 
	
		
			
				|  |  |    return false;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -//----------------------------------------------------------------------------
 | 
	
		
			
				|  |  | -bool cmFindPackageCommand::FindConfigFileToLoad(std::string const& dir,
 | 
	
		
			
				|  |  | -                                                std::string& file)
 | 
	
		
			
				|  |  | -{
 | 
	
		
			
				|  |  | -  if(this->FileFound.empty())
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -    // The file location was cached.  Look for the correct file.
 | 
	
		
			
				|  |  | -    return this->FindConfigFile(dir, file);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -  else
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -    // The file location was just found during this call.
 | 
	
		
			
				|  |  | -    // Use the file found without searching again.
 | 
	
		
			
				|  |  | -    file = this->FileFound;
 | 
	
		
			
				|  |  | -    return true;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  //----------------------------------------------------------------------------
 | 
	
		
			
				|  |  |  bool cmFindPackageCommand::CheckVersion(std::string const& config_file)
 | 
	
		
			
				|  |  |  {
 |