Commit a01eb6b2 authored by Brad King's avatar Brad King 💬
Browse files

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.
parent 8997f476
......@@ -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.
......
......@@ -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
*/
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment