ENH: Enforce matching PUSH/POP calls for cmake_policy.

This commit is contained in:
Brad King 2008-03-10 15:41:07 -04:00
parent eb6b300978
commit 7f2bf83132

View File

@ -579,6 +579,7 @@ bool cmMakefile::ReadListFile(const char* filename_in,
} }
// add this list file to the list of dependencies // add this list file to the list of dependencies
this->ListFiles.push_back( filenametoread); this->ListFiles.push_back( filenametoread);
bool endScopeNicely = filename? true: false;
const size_t numberFunctions = cacheFile.Functions.size(); const size_t numberFunctions = cacheFile.Functions.size();
for(size_t i =0; i < numberFunctions; ++i) for(size_t i =0; i < numberFunctions; ++i)
{ {
@ -587,17 +588,14 @@ bool cmMakefile::ReadListFile(const char* filename_in,
if (status.GetReturnInvoked() || if (status.GetReturnInvoked() ||
cmSystemTools::GetFatalErrorOccured() ) cmSystemTools::GetFatalErrorOccured() )
{ {
// pop the listfile off the stack // Exit early from processing this file.
this->ListFileStack.pop_back(); endScopeNicely = false;
this->AddDefinition("CMAKE_PARENT_LIST_FILE", break;
currentParentFile.c_str());
this->AddDefinition("CMAKE_CURRENT_LIST_FILE", currentFile.c_str());
return true;
} }
} }
// send scope ended to and function blockers // send scope ended to and function blockers
if (filename) if (endScopeNicely)
{ {
// loop over all function blockers to see if any block this command // loop over all function blockers to see if any block this command
std::list<cmFunctionBlocker *>::iterator pos; std::list<cmFunctionBlocker *>::iterator pos;
@ -613,6 +611,20 @@ bool cmMakefile::ReadListFile(const char* filename_in,
} }
} }
// If this is the directory-level CMakeLists.txt file then enforce
// policy stack depth.
if(this->ListFileStack.size() == 1)
{
while(this->PolicyStack.size() > 1)
{
if(endScopeNicely)
{
this->IssueError("cmake_policy PUSH without matching POP");
}
this->PopPolicy(false);
}
}
this->AddDefinition("CMAKE_PARENT_LIST_FILE", currentParentFile.c_str()); this->AddDefinition("CMAKE_PARENT_LIST_FILE", currentParentFile.c_str());
this->AddDefinition("CMAKE_CURRENT_LIST_FILE", currentFile.c_str()); this->AddDefinition("CMAKE_CURRENT_LIST_FILE", currentFile.c_str());