From 1655dce2a58c6629ae4455d369c34a8b40924b22 Mon Sep 17 00:00:00 2001 From: Brad King Date: Mon, 24 Mar 2008 10:56:26 -0400 Subject: ENH: Cleanup policy version interface presented to user. - In cmake_minimum_required do not set policy version if current CMake is too old - In cmPolicies::ApplyPolicyVersion report error if version is too new or cannot be parsed --- Source/cmCMakeMinimumRequired.cxx | 11 +++++------ Source/cmCMakePolicyCommand.cxx | 9 +-------- Source/cmPolicies.cxx | 24 ++++++++++++++++++++++++ 3 files changed, 30 insertions(+), 14 deletions(-) diff --git a/Source/cmCMakeMinimumRequired.cxx b/Source/cmCMakeMinimumRequired.cxx index bb5bdb0..f04600e 100644 --- a/Source/cmCMakeMinimumRequired.cxx +++ b/Source/cmCMakeMinimumRequired.cxx @@ -99,13 +99,12 @@ bool cmCMakeMinimumRequired { // The current version is too low. cmOStringStream e; - e << "This project requires version " << version_string.c_str() - << " of CMake. " - << "You are running version " - << current_major << "." << current_minor << "." << current_patch - << ".\n"; - cmSystemTools::Error(e.str().c_str()); + e << "CMake " << version_string.c_str() + << " or higher is required. You are running version " + << current_major << "." << current_minor << "." << current_patch; + this->Makefile->IssueMessage(cmake::FATAL_ERROR, e.str()); cmSystemTools::SetFatalErrorOccured(); + return true; } if (required_major < 2 || required_major == 2 && required_minor < 4) diff --git a/Source/cmCMakePolicyCommand.cxx b/Source/cmCMakePolicyCommand.cxx index f29938d..d6f1b3e 100644 --- a/Source/cmCMakePolicyCommand.cxx +++ b/Source/cmCMakePolicyCommand.cxx @@ -117,13 +117,6 @@ cmCMakePolicyCommand::HandleVersionMode(std::vector const& args) this->SetError("VERSION given too many arguments"); return false; } - if(!this->Makefile->SetPolicyVersion(args[1].c_str())) - { - cmOStringStream e; - e << "VERSION given invalid value \"" << args[1] << "\". " - << "A numeric major.minor[.patch] must be given."; - this->SetError(e.str().c_str()); - return false; - } + this->Makefile->SetPolicyVersion(args[1].c_str()); return true; } diff --git a/Source/cmPolicies.cxx b/Source/cmPolicies.cxx index 074bd7a..b37171b 100644 --- a/Source/cmPolicies.cxx +++ b/Source/cmPolicies.cxx @@ -301,6 +301,10 @@ bool cmPolicies::ApplyPolicyVersion(cmMakefile *mf, if(sscanf(ver.c_str(), "%u.%u.%u", &majorVer, &minorVer, &patchVer) < 2) { + cmOStringStream e; + e << "Invalid policy version value \"" << ver << "\". " + << "A numeric major.minor[.patch] must be given."; + mf->IssueMessage(cmake::FATAL_ERROR, e.str()); return false; } @@ -317,6 +321,26 @@ bool cmPolicies::ApplyPolicyVersion(cmMakefile *mf, "CMAKE_BACKWARDS_COMPATIBILITY variable. " "One way to so this is to set the policy version to 2.4 exactly." ); + return false; + } + + // It is an error if the policy version is greater than the running + // CMake. + if (majorVer > cmVersion::GetMajorVersion() || + (majorVer == cmVersion::GetMajorVersion() && + minorVer > cmVersion::GetMinorVersion()) || + (majorVer == cmVersion::GetMajorVersion() && + minorVer == cmVersion::GetMinorVersion() && + patchVer > cmVersion::GetPatchVersion())) + { + cmOStringStream e; + e << "An attempt was made to set the policy version of CMake to \"" + << version << "\" which is greater than this version of CMake. " + << "This is not allowed because the greater version may have new " + << "policies not known to this CMake. " + << "You may need a newer CMake version to build this project."; + mf->IssueMessage(cmake::FATAL_ERROR, e.str()); + return false; } // now loop over all the policies and set them as appropriate -- cgit v0.12