Browse Source

ENH: Create automatic policy push/pop helper

This creates cmMakefile::PolicyPushPop to push and pop policy scope
automatically.  It also enforces balanced push/pop pairs inside the
scope it handles.
Brad King 17 years ago
parent
commit
a01eb6b27b
2 changed files with 41 additions and 0 deletions
  1. 29 0
      Source/cmMakefile.cxx
  2. 12 0
      Source/cmMakefile.h

+ 29 - 0
Source/cmMakefile.cxx

@@ -3674,6 +3674,35 @@ bool cmMakefile::SetPolicy(cmPolicies::PolicyID id,
   return true;
 }
 
+//----------------------------------------------------------------------------
+cmMakefile::PolicyPushPop::PolicyPushPop(cmMakefile* m): Makefile(m)
+{
+  this->Makefile->PushPolicy();
+  this->PolicyDepth = this->Makefile->PolicyStack.size();
+}
+
+//----------------------------------------------------------------------------
+cmMakefile::PolicyPushPop::~PolicyPushPop()
+{
+  // Enforce matching PUSH/POP pairs.
+  if(this->Makefile->PolicyStack.size() < this->PolicyDepth)
+    {
+    this->Makefile->IssueMessage(cmake::FATAL_ERROR,
+                                 "cmake_policy POP without matching PUSH");
+    return;
+    }
+  while(this->Makefile->PolicyStack.size() > this->PolicyDepth)
+    {
+    this->Makefile->IssueMessage(cmake::FATAL_ERROR,
+                                 "cmake_policy PUSH without matching POP");
+    this->Makefile->PopPolicy(false);
+    }
+
+  // Pop our scope.
+  this->Makefile->PopPolicy();
+}
+
+//----------------------------------------------------------------------------
 bool cmMakefile::PushPolicy()
 {
   // Allocate a new stack entry.

+ 12 - 0
Source/cmMakefile.h

@@ -346,6 +346,18 @@ public:
   bool SetPolicyVersion(const char *version);
   //@}
 
+  /** Helper class to push and pop policies automatically.  */
+  class PolicyPushPop
+  {
+  public:
+    PolicyPushPop(cmMakefile* m);
+    ~PolicyPushPop();
+  private:
+    cmMakefile* Makefile;
+    size_t PolicyDepth;
+  };
+  friend class PolicyPushPop;
+
   /**
     * Get the Policies Instance
     */