From d602a3db8581271ca130ac8fa10f8b4c1cc1dac3 Mon Sep 17 00:00:00 2001 From: Brad King Date: Thu, 15 Jan 2009 14:37:14 -0500 Subject: [PATCH] BUG: Enforce matching policy PUSH/POP in all files The documentation of cmake_policy PUSH and POP states that they must always match. Previously we enforced this only for the top scope of each CMakeLists.txt file. This enforces the requirement for all files. --- Source/cmMakefile.cxx | 31 ++++++++++++++++++------------- Source/cmMakefile.h | 2 +- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx index 645de3741..c9a923866 100644 --- a/Source/cmMakefile.cxx +++ b/Source/cmMakefile.cxx @@ -562,6 +562,11 @@ bool cmMakefile::ReadListFile(const char* filename_in, // add this list file to the list of dependencies this->ListFiles.push_back( filenametoread); bool endScopeNicely = true; + + // Save the current policy stack depth. + size_t const policy_depth = this->PolicyStack.size(); + + // Run the parsed commands. const size_t numberFunctions = cacheFile.Functions.size(); for(size_t i =0; i < numberFunctions; ++i) { @@ -576,6 +581,17 @@ bool cmMakefile::ReadListFile(const char* filename_in, } } + // Restore policy stack depth. + while(this->PolicyStack.size() > policy_depth) + { + if(endScopeNicely) + { + this->IssueMessage(cmake::FATAL_ERROR, + "cmake_policy PUSH without matching POP"); + } + this->PopPolicy(false); + } + // send scope ended to and function blockers if (endScopeNicely) { @@ -597,7 +613,7 @@ bool cmMakefile::ReadListFile(const char* filename_in, // some extra checks. if(this->ListFileStack.size() == 1) { - this->EnforceDirectoryLevelRules(endScopeNicely); + this->EnforceDirectoryLevelRules(); } this->AddDefinition("CMAKE_PARENT_LIST_FILE", currentParentFile.c_str()); @@ -610,19 +626,8 @@ bool cmMakefile::ReadListFile(const char* filename_in, } //---------------------------------------------------------------------------- -void cmMakefile::EnforceDirectoryLevelRules(bool endScopeNicely) +void cmMakefile::EnforceDirectoryLevelRules() { - // Enforce policy stack depth. - while(this->PolicyStack.size() > 1) - { - if(endScopeNicely) - { - this->IssueMessage(cmake::FATAL_ERROR, - "cmake_policy PUSH without matching POP"); - } - this->PopPolicy(false); - } - // Diagnose a violation of CMP0000 if necessary. if(this->CheckCMP0000) { diff --git a/Source/cmMakefile.h b/Source/cmMakefile.h index c77fcdbca..77843e848 100644 --- a/Source/cmMakefile.h +++ b/Source/cmMakefile.h @@ -918,7 +918,7 @@ private: bool CheckCMP0000; // Enforce rules about CMakeLists.txt files. - void EnforceDirectoryLevelRules(bool endScopeNicely); + void EnforceDirectoryLevelRules(); };