ソースを参照

BUG: If the user specifies a cache entry on the command line without a type, the FIND_* commands should add the type and docstring to the given value and put it back in the cache.

Brad King 19 年 前
コミット
ec637248da

+ 19 - 9
Source/cmFindBase.cxx

@@ -19,6 +19,7 @@
 cmFindBase::cmFindBase()
 {
   this->AlreadyInCache = false;
+  this->AlreadyInCacheWithoutMetaInfo = false;
   this->NoDefaultPath = false;
   this->NoCMakePath = false;
   this->NoCMakeEnvironmentPath = false;
@@ -674,18 +675,27 @@ void cmFindBase::PrintFindStuff()
 
 bool cmFindBase::CheckForVariableInCache()
 {
-  const char* cacheValue
-    = this->Makefile->GetDefinition(this->VariableName.c_str());
-  if(cacheValue && !cmSystemTools::IsNOTFOUND(cacheValue))
+  if(const char* cacheValue =
+     this->Makefile->GetDefinition(this->VariableName.c_str()))
     {
-    return true;
-    }
-  if(cacheValue)
-    {
-    cmCacheManager::CacheIterator it = 
+    cmCacheManager::CacheIterator it =
       this->Makefile->GetCacheManager()->
       GetCacheIterator(this->VariableName.c_str());
-    if(!it.IsAtEnd())
+    bool found = !cmSystemTools::IsNOTFOUND(cacheValue);
+    bool cached = !it.IsAtEnd();
+    if(found)
+      {
+      // If the user specifies the entry on the command line without a
+      // type we should add the type and docstring but keep the
+      // original value.  Tell the subclass implementations to do
+      // this.
+      if(cached && it.GetType() == cmCacheManager::UNINITIALIZED)
+        {
+        this->AlreadyInCacheWithoutMetaInfo = true;
+        }
+      return true;
+      }
+    else if(cached)
       {
       const char* hs = it.GetProperty("HELPSTRING");
       this->VariableDocumentation = hs?hs:"(none)";

+ 1 - 0
Source/cmFindBase.h

@@ -67,6 +67,7 @@ protected:
   cmStdString EnvironmentPath; // LIB,INCLUDE
 
   bool AlreadyInCache;
+  bool AlreadyInCacheWithoutMetaInfo;
   bool NoDefaultPath;
   bool NoCMakePath;
   bool NoCMakeEnvironmentPath;

+ 9 - 0
Source/cmFindLibraryCommand.cxx

@@ -52,6 +52,15 @@ bool cmFindLibraryCommand::InitialPass(std::vector<std::string> const& argsIn)
     }
   if(this->AlreadyInCache)
     {
+    // If the user specifies the entry on the command line without a
+    // type we should add the type and docstring but keep the original
+    // value.
+    if(this->AlreadyInCacheWithoutMetaInfo)
+      {
+      this->Makefile->AddCacheDefinition(this->VariableName.c_str(), "",
+                                         this->VariableDocumentation.c_str(),
+                                         cmCacheManager::FILEPATH);
+      }
     return true;
     }
   // add special 64 bit paths if this is a 64 bit compile.

+ 12 - 0
Source/cmFindPathCommand.cxx

@@ -67,6 +67,18 @@ bool cmFindPathCommand::InitialPass(std::vector<std::string> const& argsIn)
     }
   if(this->AlreadyInCache)
     {
+    // If the user specifies the entry on the command line without a
+    // type we should add the type and docstring but keep the original
+    // value.
+    if(this->AlreadyInCacheWithoutMetaInfo)
+      {
+      this->Makefile->AddCacheDefinition(
+        this->VariableName.c_str(), "",
+        this->VariableDocumentation.c_str(),
+        (this->IncludeFileInPath ?
+         cmCacheManager::FILEPATH :cmCacheManager::PATH)
+        );
+      }
     return true;
     }
   std::string ff = this->Makefile->GetSafeDefinition("CMAKE_FIND_FRAMEWORK");

+ 9 - 0
Source/cmFindProgramCommand.cxx

@@ -51,6 +51,15 @@ bool cmFindProgramCommand::InitialPass(std::vector<std::string> const& argsIn)
     }
   if(this->AlreadyInCache)
     {
+    // If the user specifies the entry on the command line without a
+    // type we should add the type and docstring but keep the original
+    // value.
+    if(this->AlreadyInCacheWithoutMetaInfo)
+      {
+      this->Makefile->AddCacheDefinition(this->VariableName.c_str(), "",
+                                         this->VariableDocumentation.c_str(),
+                                         cmCacheManager::FILEPATH);
+      }
     return true;
     }