diff options
Diffstat (limited to 'Source/cmSetPropertyCommand.cxx')
-rw-r--r-- | Source/cmSetPropertyCommand.cxx | 95 |
1 files changed, 94 insertions, 1 deletions
diff --git a/Source/cmSetPropertyCommand.cxx b/Source/cmSetPropertyCommand.cxx index b683fe7..fbe877b 100644 --- a/Source/cmSetPropertyCommand.cxx +++ b/Source/cmSetPropertyCommand.cxx @@ -19,6 +19,8 @@ #include "cmSetTestsPropertiesCommand.h" #include "cmSetSourceFilesPropertiesCommand.h" +#include "cmCacheManager.h" + //---------------------------------------------------------------------------- cmSetPropertyCommand::cmSetPropertyCommand() { @@ -59,11 +61,15 @@ bool cmSetPropertyCommand { scope = cmProperty::TEST; } + else if(*arg == "CACHE") + { + scope = cmProperty::CACHE; + } else { cmOStringStream e; e << "given invalid scope " << *arg << ". " - << "Valid scopes are GLOBAL, DIRECTORY, TARGET, SOURCE, TEST."; + << "Valid scopes are GLOBAL, DIRECTORY, TARGET, SOURCE, TEST, CACHE."; this->SetError(e.str().c_str()); return false; } @@ -123,6 +129,7 @@ bool cmSetPropertyCommand case cmProperty::TARGET: return this->HandleTargetMode(); case cmProperty::SOURCE_FILE: return this->HandleSourceMode(); case cmProperty::TEST: return this->HandleTestMode(); + case cmProperty::CACHE: return this->HandleCacheMode(); case cmProperty::VARIABLE: case cmProperty::CACHED_VARIABLE: @@ -384,3 +391,89 @@ bool cmSetPropertyCommand::HandleTest(cmTest* test) return true; } + +//---------------------------------------------------------------------------- +bool cmSetPropertyCommand::HandleCacheMode() +{ + if(this->PropertyName == "ADVANCED") + { + if(!this->Remove && + !cmSystemTools::IsOn(this->PropertyValue.c_str()) && + !cmSystemTools::IsOff(this->PropertyValue.c_str())) + { + cmOStringStream e; + e << "given non-boolean value \"" << this->PropertyValue + << "\" for CACHE property \"ADVANCED\". "; + this->SetError(e.str().c_str()); + return false; + } + } + else if(this->PropertyName == "TYPE") + { + if(!cmCacheManager::IsType(this->PropertyValue.c_str())) + { + cmOStringStream e; + e << "given invalid CACHE entry TYPE \"" << this->PropertyValue << "\""; + this->SetError(e.str().c_str()); + return false; + } + } + else if(this->PropertyName != "HELPSTRING" && + this->PropertyName != "VALUE") + { + cmOStringStream e; + e << "given invalid CACHE property " << this->PropertyName << ". " + << "Settable CACHE properties are: " + << "ADVANCED, HELPSTRING, TYPE, and VALUE."; + this->SetError(e.str().c_str()); + return false; + } + + for(std::set<cmStdString>::const_iterator ni = this->Names.begin(); + ni != this->Names.end(); ++ni) + { + // Get the source file. + cmMakefile* mf = this->GetMakefile(); + cmake* cm = mf->GetCMakeInstance(); + cmCacheManager::CacheIterator it = + cm->GetCacheManager()->GetCacheIterator(ni->c_str()); + if(!it.IsAtEnd()) + { + if(!this->HandleCacheEntry(it)) + { + return false; + } + } + else + { + cmOStringStream e; + e << "could not find CACHE variable " << *ni + << ". Perhaps it has not yet been created."; + this->SetError(e.str().c_str()); + return false; + } + } + return true; +} + +//---------------------------------------------------------------------------- +bool cmSetPropertyCommand::HandleCacheEntry(cmCacheManager::CacheIterator& it) +{ + // Set or append the property. + const char* name = this->PropertyName.c_str(); + const char* value = this->PropertyValue.c_str(); + if (this->Remove) + { + value = 0; + } + if(this->AppendMode) + { + it.AppendProperty(name, value); + } + else + { + it.SetProperty(name, value); + } + + return true; +} |