summaryrefslogtreecommitdiffstats
path: root/Source/cmCMakePolicyCommand.cxx
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2008-08-18 13:53:06 (GMT)
committerBrad King <brad.king@kitware.com>2008-08-18 13:53:06 (GMT)
commit7f7068e9d48666ce58f6ba9455a52e7fadee9d6f (patch)
tree13a69737cb6d663ea7b055b0d0d8bb5bdbccf5e7 /Source/cmCMakePolicyCommand.cxx
parentf2d2a82cd0030315e91307fa3a306a947e938d29 (diff)
downloadCMake-7f7068e9d48666ce58f6ba9455a52e7fadee9d6f.zip
CMake-7f7068e9d48666ce58f6ba9455a52e7fadee9d6f.tar.gz
CMake-7f7068e9d48666ce58f6ba9455a52e7fadee9d6f.tar.bz2
ENH: Add cmake_policy(GET) command mode
It is likely that projects or CMake modules in the future will need to check the value of a policy setting. For example, if we add a policy that affects the results of FindXYZ.cmake modules, the module code will need to be able to check the policy.
Diffstat (limited to 'Source/cmCMakePolicyCommand.cxx')
-rw-r--r--Source/cmCMakePolicyCommand.cxx61
1 files changed, 61 insertions, 0 deletions
diff --git a/Source/cmCMakePolicyCommand.cxx b/Source/cmCMakePolicyCommand.cxx
index d6f1b3e..7672a6c 100644
--- a/Source/cmCMakePolicyCommand.cxx
+++ b/Source/cmCMakePolicyCommand.cxx
@@ -32,6 +32,10 @@ bool cmCMakePolicyCommand
{
return this->HandleSetMode(args);
}
+ else if(args[0] == "GET")
+ {
+ return this->HandleGetMode(args);
+ }
else if(args[0] == "PUSH")
{
if(args.size() > 1)
@@ -104,6 +108,63 @@ bool cmCMakePolicyCommand::HandleSetMode(std::vector<std::string> const& args)
}
//----------------------------------------------------------------------------
+bool cmCMakePolicyCommand::HandleGetMode(std::vector<std::string> const& args)
+{
+ if(args.size() != 3)
+ {
+ this->SetError("GET must be given exactly 2 additional arguments.");
+ return false;
+ }
+
+ // Get arguments.
+ std::string const& id = args[1];
+ std::string const& var = args[2];
+
+ // Lookup the policy number.
+ cmPolicies::PolicyID pid;
+ if(!this->Makefile->GetPolicies()->GetPolicyID(id.c_str(), pid))
+ {
+ cmOStringStream e;
+ e << "GET given policy \"" << id << "\" which is not known to this "
+ << "version of CMake.";
+ this->SetError(e.str().c_str());
+ return false;
+ }
+
+ // Lookup the policy setting.
+ cmPolicies::PolicyStatus status = this->Makefile->GetPolicyStatus(pid);
+ switch (status)
+ {
+ case cmPolicies::OLD:
+ // Report that the policy is set to OLD.
+ this->Makefile->AddDefinition(var.c_str(), "OLD");
+ break;
+ case cmPolicies::WARN:
+ // Report that the policy is not set.
+ this->Makefile->AddDefinition(var.c_str(), "");
+ break;
+ case cmPolicies::NEW:
+ // Report that the policy is set to NEW.
+ this->Makefile->AddDefinition(var.c_str(), "NEW");
+ break;
+ case cmPolicies::REQUIRED_IF_USED:
+ case cmPolicies::REQUIRED_ALWAYS:
+ // The policy is required to be set before anything needs it.
+ {
+ cmOStringStream e;
+ e << this->Makefile->GetPolicies()->GetRequiredPolicyError(pid)
+ << "\n"
+ << "The call to cmake_policy(GET " << id << " ...) at which this "
+ << "error appears requests the policy, and this version of CMake "
+ << "requires that the policy be set to NEW before it is checked.";
+ this->Makefile->IssueMessage(cmake::FATAL_ERROR, e.str());
+ }
+ }
+
+ return true;
+}
+
+//----------------------------------------------------------------------------
bool
cmCMakePolicyCommand::HandleVersionMode(std::vector<std::string> const& args)
{