|
|
@@ -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;
|
|
|
+}
|