diff options
-rw-r--r-- | Source/cmCacheManager.cxx | 36 | ||||
-rw-r--r-- | Source/cmCacheManager.h | 6 | ||||
-rw-r--r-- | Source/cmMakefile.cxx | 11 | ||||
-rw-r--r-- | Source/cmake.cxx | 11 |
4 files changed, 56 insertions, 8 deletions
diff --git a/Source/cmCacheManager.cxx b/Source/cmCacheManager.cxx index 8d30fd0..4f272c9 100644 --- a/Source/cmCacheManager.cxx +++ b/Source/cmCacheManager.cxx @@ -81,6 +81,42 @@ bool cmCacheManager::LoadCache(const char* path, 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, CacheEntryType& type) { diff --git a/Source/cmCacheManager.h b/Source/cmCacheManager.h index 12c2aef..6655997 100644 --- a/Source/cmCacheManager.h +++ b/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; diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx index e891aa0..36997c6 100644 --- a/Source/cmMakefile.cxx +++ b/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); } diff --git a/Source/cmake.cxx b/Source/cmake.cxx index f309005..42c4f8f 100644 --- a/Source/cmake.cxx +++ b/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 { |