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
This commit is contained in:
Brad King 2008-03-24 10:56:26 -04:00
parent a24ff4e453
commit 1655dce2a5
3 changed files with 30 additions and 14 deletions

View File

@ -99,13 +99,12 @@ bool cmCMakeMinimumRequired
{ {
// The current version is too low. // The current version is too low.
cmOStringStream e; cmOStringStream e;
e << "This project requires version " << version_string.c_str() e << "CMake " << version_string.c_str()
<< " of CMake. " << " or higher is required. You are running version "
<< "You are running version " << current_major << "." << current_minor << "." << current_patch;
<< current_major << "." << current_minor << "." << current_patch this->Makefile->IssueMessage(cmake::FATAL_ERROR, e.str());
<< ".\n";
cmSystemTools::Error(e.str().c_str());
cmSystemTools::SetFatalErrorOccured(); cmSystemTools::SetFatalErrorOccured();
return true;
} }
if (required_major < 2 || required_major == 2 && required_minor < 4) if (required_major < 2 || required_major == 2 && required_minor < 4)

View File

@ -117,13 +117,6 @@ cmCMakePolicyCommand::HandleVersionMode(std::vector<std::string> const& args)
this->SetError("VERSION given too many arguments"); this->SetError("VERSION given too many arguments");
return false; return false;
} }
if(!this->Makefile->SetPolicyVersion(args[1].c_str())) 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;
}
return true; return true;
} }

View File

@ -301,6 +301,10 @@ bool cmPolicies::ApplyPolicyVersion(cmMakefile *mf,
if(sscanf(ver.c_str(), "%u.%u.%u", if(sscanf(ver.c_str(), "%u.%u.%u",
&majorVer, &minorVer, &patchVer) < 2) &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; return false;
} }
@ -317,6 +321,26 @@ bool cmPolicies::ApplyPolicyVersion(cmMakefile *mf,
"CMAKE_BACKWARDS_COMPATIBILITY variable. " "CMAKE_BACKWARDS_COMPATIBILITY variable. "
"One way to so this is to set the policy version to 2.4 exactly." "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 // now loop over all the policies and set them as appropriate