summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Source/cmCacheManager.cxx36
-rw-r--r--Source/cmCacheManager.h6
-rw-r--r--Source/cmMakefile.cxx11
-rw-r--r--Source/cmake.cxx11
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
{