summaryrefslogtreecommitdiffstats
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
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.
-rw-r--r--Source/cmCMakePolicyCommand.cxx61
-rw-r--r--Source/cmCMakePolicyCommand.h6
-rw-r--r--Tests/Complex/CMakeLists.txt5
-rw-r--r--Tests/ComplexOneConfig/CMakeLists.txt5
-rw-r--r--Tests/ComplexRelativePaths/CMakeLists.txt5
5 files changed, 82 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)
{
diff --git a/Source/cmCMakePolicyCommand.h b/Source/cmCMakePolicyCommand.h
index 54c494c..e478811 100644
--- a/Source/cmCMakePolicyCommand.h
+++ b/Source/cmCMakePolicyCommand.h
@@ -108,6 +108,11 @@ public:
"Alternatively one may fix the project to work with the new behavior "
"and set the policy state to NEW."
"\n"
+ " cmake_policy(GET CMP<NNNN> <variable>)\n"
+ "Check whether a given policy is set to OLD or NEW behavior. "
+ "The output variable value will be \"OLD\" or \"NEW\" if the "
+ "policy is set, and empty otherwise."
+ "\n"
" cmake_policy(PUSH)\n"
" cmake_policy(POP)\n"
"Push and pop the current policy setting state on a stack. "
@@ -123,6 +128,7 @@ public:
cmTypeMacro(cmCMakePolicyCommand, cmCommand);
private:
bool HandleSetMode(std::vector<std::string> const& args);
+ bool HandleGetMode(std::vector<std::string> const& args);
bool HandleVersionMode(std::vector<std::string> const& args);
};
diff --git a/Tests/Complex/CMakeLists.txt b/Tests/Complex/CMakeLists.txt
index c3f94b7..b2ed25c 100644
--- a/Tests/Complex/CMakeLists.txt
+++ b/Tests/Complex/CMakeLists.txt
@@ -7,6 +7,11 @@ PROJECT (Complex)
# Try setting a new policy. The IF test is for coverage.
IF(POLICY CMP0003)
CMAKE_POLICY(SET CMP0003 NEW)
+
+ CMAKE_POLICY(GET CMP0003 P3)
+ IF(NOT "${P3}" STREQUAL "NEW")
+ MESSAGE(FATAL_ERROR "CMAKE_POLICY(GET) did not report NEW!")
+ ENDIF(NOT "${P3}" STREQUAL "NEW")
ENDIF(POLICY CMP0003)
# Choose whether to test CMakeLib.
diff --git a/Tests/ComplexOneConfig/CMakeLists.txt b/Tests/ComplexOneConfig/CMakeLists.txt
index c3f94b7..b2ed25c 100644
--- a/Tests/ComplexOneConfig/CMakeLists.txt
+++ b/Tests/ComplexOneConfig/CMakeLists.txt
@@ -7,6 +7,11 @@ PROJECT (Complex)
# Try setting a new policy. The IF test is for coverage.
IF(POLICY CMP0003)
CMAKE_POLICY(SET CMP0003 NEW)
+
+ CMAKE_POLICY(GET CMP0003 P3)
+ IF(NOT "${P3}" STREQUAL "NEW")
+ MESSAGE(FATAL_ERROR "CMAKE_POLICY(GET) did not report NEW!")
+ ENDIF(NOT "${P3}" STREQUAL "NEW")
ENDIF(POLICY CMP0003)
# Choose whether to test CMakeLib.
diff --git a/Tests/ComplexRelativePaths/CMakeLists.txt b/Tests/ComplexRelativePaths/CMakeLists.txt
index c3f94b7..b2ed25c 100644
--- a/Tests/ComplexRelativePaths/CMakeLists.txt
+++ b/Tests/ComplexRelativePaths/CMakeLists.txt
@@ -7,6 +7,11 @@ PROJECT (Complex)
# Try setting a new policy. The IF test is for coverage.
IF(POLICY CMP0003)
CMAKE_POLICY(SET CMP0003 NEW)
+
+ CMAKE_POLICY(GET CMP0003 P3)
+ IF(NOT "${P3}" STREQUAL "NEW")
+ MESSAGE(FATAL_ERROR "CMAKE_POLICY(GET) did not report NEW!")
+ ENDIF(NOT "${P3}" STREQUAL "NEW")
ENDIF(POLICY CMP0003)
# Choose whether to test CMakeLib.