소스 검색

ENH: Allow specifying cmake variables on the command line without specifying the type Bug #118 - Specifying cache entries with -D should not need the type

Andy Cedilnik 22 년 전
부모
커밋
2f98c791fa
4개의 변경된 파일56개의 추가작업 그리고 8개의 파일을 삭제
  1. 36 0
      Source/cmCacheManager.cxx
  2. 5 1
      Source/cmCacheManager.h
  3. 9 2
      Source/cmMakefile.cxx
  4. 6 5
      Source/cmake.cxx

+ 36 - 0
Source/cmCacheManager.cxx

@@ -79,6 +79,42 @@ bool cmCacheManager::LoadCache(const char* path,
   return this->LoadCache(path, internal, emptySet, emptySet);
 }
 
+bool cmCacheManager::ParseEntry(const char* entry, 
+                                std::string& var,
+                                std::string& value)
+{
+  // input line is:         key:type=value
+  cmsys::RegularExpression reg("^([^:]*)=(.*[^\t ]|[\t ]*)[\t ]*$");
+  // input line is:         "key":type=value
+  cmsys::RegularExpression regQuoted("^\"([^\"]*)\"=(.*[^\t ]|[\t ]*)[\t ]*$");
+  bool flag = false;
+  if(regQuoted.find(entry))
+    {
+    var = regQuoted.match(1);
+    value = regQuoted.match(2);
+    flag = true;
+    }
+  else if (reg.find(entry))
+    {
+    var = reg.match(1);
+    value = reg.match(2);
+    flag = true;
+    }
+
+  // if value is enclosed in single quotes ('foo') then remove them
+  // it is used to enclose trailing space or tab
+  if (flag && 
+      value.size() >= 2 &&
+      value[0] == '\'' && 
+      value[value.size() - 1] == '\'') 
+    {
+    value = value.substr(1, 
+                         value.size() - 2);
+    }
+
+  return flag;
+}
+
 bool cmCacheManager::ParseEntry(const char* entry, 
                                 std::string& var,
                                 std::string& value,

+ 5 - 1
Source/cmCacheManager.h

@@ -31,7 +31,7 @@ class cmCacheManager
 public:
   class CacheIterator;
   friend class cmCacheManager::CacheIterator;
-  enum CacheEntryType{ BOOL=0, PATH, FILEPATH, STRING, INTERNAL,STATIC,UNINITIALIZED };
+  enum CacheEntryType{ BOOL=0, PATH, FILEPATH, STRING, INTERNAL,STATIC, UNINITIALIZED };
 
 private:
   struct CacheEntry
@@ -125,6 +125,10 @@ public:
                          std::string& value,
                          CacheEntryType& type);
 
+  static bool ParseEntry(const char* entry, 
+                         std::string& var,
+                         std::string& value);
+
   ///! Get a value from the cache given a key
   const char* GetCacheValue(const char* key) const;
 

+ 9 - 2
Source/cmMakefile.cxx

@@ -839,8 +839,15 @@ void cmMakefile::AddCacheDefinition(const char* name, const char* value,
                                     const char* doc,
                                     cmCacheManager::CacheEntryType type)
 {
-  this->GetCacheManager()->AddCacheEntry(name, value, doc, type);
-  this->AddDefinition(name, value);
+  const char* val = value;
+  cmCacheManager::CacheIterator it = 
+    this->GetCacheManager()->GetCacheIterator(name);
+  if(!it.IsAtEnd() && (it.GetType() == cmCacheManager::UNINITIALIZED))
+    {
+    val = it.GetValue();
+    }
+  this->GetCacheManager()->AddCacheEntry(name, val, doc, type);
+  this->AddDefinition(name, val);
 }
 
 

+ 6 - 5
Source/cmake.cxx

@@ -185,12 +185,13 @@ void cmake::SetCacheArgs(const std::vector<std::string>& args)
       {
       std::string entry = arg.substr(2);
       std::string var, value;
-      cmCacheManager::CacheEntryType type;
-      if(cmCacheManager::ParseEntry(entry.c_str(), var, value, type))
+      cmCacheManager::CacheEntryType type = cmCacheManager::UNINITIALIZED;
+      if(cmCacheManager::ParseEntry(entry.c_str(), var, value, type) ||
+        cmCacheManager::ParseEntry(entry.c_str(), var, value))
         {
-          this->m_CacheManager->AddCacheEntry(var.c_str(), value.c_str(),
-            "No help, variable specified on the command line.",
-            type);
+        this->m_CacheManager->AddCacheEntry(var.c_str(), value.c_str(),
+          "No help, variable specified on the command line.",
+          type);
         }
       else
         {