ENH: Create $CACHE{VAR} syntax

This syntax allows reading of cache entries even when variables of the
same name have been defined in the local scope.  See issue #7715.
This commit is contained in:
Brad King 2008-09-25 10:21:15 -04:00
parent 883d8e186c
commit f8bc0492e1
2 changed files with 30 additions and 1 deletions

View File

@ -87,9 +87,24 @@ char* cmCommandArgumentParserHelper::ExpandSpecialVariable(const char* key,
}
return this->EmptyVariable;
}
if ( strcmp(key, "CACHE") == 0 )
{
if(const char* c = this->Makefile->GetCacheManager()->GetCacheValue(var))
{
if(this->EscapeQuotes)
{
return this->AddString(cmSystemTools::EscapeQuotes(c).c_str());
}
else
{
return this->AddString(c);
}
}
return this->EmptyVariable;
}
cmOStringStream e;
e << "Syntax $" << key << "{} is not supported. "
<< "Only ${} and ENV{} are allowed.";
<< "Only ${}, $ENV{}, and $CACHE{} are allowed.";
this->SetError(e.str());
return 0;
}

View File

@ -32,6 +32,20 @@ if(NOT DEFINED BAR)
message(FATAL_ERROR "BAR not defined")
endif(NOT DEFINED BAR)
# Test interaction of cache entries with variables.
set(BAR "test-var")
if(NOT "$CACHE{BAR}" STREQUAL "test")
message(FATAL_ERROR "\$CACHE{BAR} changed by variable BAR")
endif(NOT "$CACHE{BAR}" STREQUAL "test")
if(NOT "${BAR}" STREQUAL "test-var")
message(FATAL_ERROR "\${BAR} not separate from \$CACHE{BAR}")
endif(NOT "${BAR}" STREQUAL "test-var")
unset(BAR)
if(NOT "${BAR}" STREQUAL "test")
message(FATAL_ERROR "\${BAR} does not fall through to \$CACHE{BAR}")
endif(NOT "${BAR}" STREQUAL "test")
# Test unsetting of CACHE entry.
unset(BAR CACHE)
if(DEFINED BAR)
message(FATAL_ERROR "BAR still defined")