diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx index 12ff1b66f7..238e92aaca 100644 --- a/Source/cmMakefile.cxx +++ b/Source/cmMakefile.cxx @@ -579,6 +579,7 @@ bool cmMakefile::ReadListFile(const char* filename_in, } // add this list file to the list of dependencies this->ListFiles.push_back( filenametoread); + bool endScopeNicely = filename? true: false; const size_t numberFunctions = cacheFile.Functions.size(); for(size_t i =0; i < numberFunctions; ++i) { @@ -587,17 +588,14 @@ bool cmMakefile::ReadListFile(const char* filename_in, if (status.GetReturnInvoked() || cmSystemTools::GetFatalErrorOccured() ) { - // pop the listfile off the stack - this->ListFileStack.pop_back(); - this->AddDefinition("CMAKE_PARENT_LIST_FILE", - currentParentFile.c_str()); - this->AddDefinition("CMAKE_CURRENT_LIST_FILE", currentFile.c_str()); - return true; + // Exit early from processing this file. + endScopeNicely = false; + break; } } // send scope ended to and function blockers - if (filename) + if (endScopeNicely) { // loop over all function blockers to see if any block this command std::list::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_CURRENT_LIST_FILE", currentFile.c_str());