BUG: All variable accesses should produce watch callbacks, including IF(DEFINED <var>) ones. Instead we define a new access type for IF(DEFINED) so that the error does not show up for backward compatibility variables.

This commit is contained in:
Brad King 2007-05-17 17:40:59 -04:00
parent b47807fc15
commit 9a5b4eba97
4 changed files with 29 additions and 7 deletions

View File

@ -307,17 +307,18 @@ bool cmIfCommand::IsTrue(const std::vector<std::string> &args,
if (*arg == "DEFINED" && argP1 != newArgs.end()) if (*arg == "DEFINED" && argP1 != newArgs.end())
{ {
size_t argP1len = argP1->size(); size_t argP1len = argP1->size();
bool bdef = false;
if(argP1len > 4 && argP1->substr(0, 4) == "ENV{" && if(argP1len > 4 && argP1->substr(0, 4) == "ENV{" &&
argP1->operator[](argP1len-1) == '}') argP1->operator[](argP1len-1) == '}')
{ {
std::string env = argP1->substr(4, argP1len-5); std::string env = argP1->substr(4, argP1len-5);
def = cmSystemTools::GetEnv(env.c_str()); bdef = cmSystemTools::GetEnv(env.c_str())?true:false;
} }
else else
{ {
def = makefile->GetDefinitionNoWatch((argP1)->c_str()); bdef = makefile->IsDefinitionSet((argP1)->c_str());
} }
if(def) if(bdef)
{ {
*arg = "1"; *arg = "1";
} }

View File

@ -1633,7 +1633,7 @@ const char* cmMakefile::GetRequiredDefinition(const char* name) const
return ret; return ret;
} }
const char* cmMakefile::GetDefinitionNoWatch(const char* name) const bool cmMakefile::IsDefinitionSet(const char* name) const
{ {
const char* def = 0; const char* def = 0;
DefinitionMap::const_iterator pos = this->Definitions.find(name); DefinitionMap::const_iterator pos = this->Definitions.find(name);
@ -1645,12 +1645,32 @@ const char* cmMakefile::GetDefinitionNoWatch(const char* name) const
{ {
def = this->GetCacheManager()->GetCacheValue(name); def = this->GetCacheManager()->GetCacheValue(name);
} }
return def; #ifdef CMAKE_BUILD_WITH_CMAKE
if(cmVariableWatch* vv = this->GetVariableWatch())
{
if(!def)
{
vv->VariableAccessed
(name, cmVariableWatch::UNKNOWN_VARIABLE_DEFINED_ACCESS,
def, this);
}
}
#endif
return def?true:false;
} }
const char* cmMakefile::GetDefinition(const char* name) const const char* cmMakefile::GetDefinition(const char* name) const
{ {
const char* def = this->GetDefinitionNoWatch(name); const char* def = 0;
DefinitionMap::const_iterator pos = this->Definitions.find(name);
if(pos != this->Definitions.end())
{
def = (*pos).second.c_str();
}
else
{
def = this->GetCacheManager()->GetCacheValue(name);
}
#ifdef CMAKE_BUILD_WITH_CMAKE #ifdef CMAKE_BUILD_WITH_CMAKE
cmVariableWatch* vv = this->GetVariableWatch(); cmVariableWatch* vv = this->GetVariableWatch();
if ( vv ) if ( vv )

View File

@ -492,9 +492,9 @@ public:
* cache is then queried. * cache is then queried.
*/ */
const char* GetDefinition(const char*) const; const char* GetDefinition(const char*) const;
const char* GetDefinitionNoWatch(const char*) const;
const char* GetSafeDefinition(const char*) const; const char* GetSafeDefinition(const char*) const;
const char* GetRequiredDefinition(const char* name) const; const char* GetRequiredDefinition(const char* name) const;
bool IsDefinitionSet(const char*) const;
/** /**
* Get the list of all variables in the current space. If argument * Get the list of all variables in the current space. If argument
* cacheonly is specified and is greater than 0, then only cache * cacheonly is specified and is greater than 0, then only cache

View File

@ -55,6 +55,7 @@ public:
{ {
VARIABLE_READ_ACCESS = 0, VARIABLE_READ_ACCESS = 0,
UNKNOWN_VARIABLE_READ_ACCESS, UNKNOWN_VARIABLE_READ_ACCESS,
UNKNOWN_VARIABLE_DEFINED_ACCESS,
ALLOWED_UNKNOWN_VARIABLE_READ_ACCESS, ALLOWED_UNKNOWN_VARIABLE_READ_ACCESS,
VARIABLE_MODIFIED_ACCESS, VARIABLE_MODIFIED_ACCESS,
VARIABLE_REMOVED_ACCESS, VARIABLE_REMOVED_ACCESS,