1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
|
/*============================================================================
CMake - Cross Platform Makefile Generator
Copyright 2000-2009 Kitware, Inc., Insight Software Consortium
Distributed under the OSI-approved BSD License (the "License");
see accompanying file Copyright.txt for details.
This software is distributed WITHOUT ANY WARRANTY; without even the
implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the License for more information.
============================================================================*/
#include "cmCMakeMinimumRequired.h"
#include "cmVersion.h"
// cmCMakeMinimumRequired
bool cmCMakeMinimumRequired
::InitialPass(std::vector<std::string> const& args, cmExecutionStatus &)
{
// Process arguments.
std::string version_string;
bool doing_version = false;
for(unsigned int i=0; i < args.size(); ++i)
{
if(args[i] == "VERSION")
{
doing_version = true;
}
else if(args[i] == "FATAL_ERROR")
{
if(doing_version)
{
this->SetError("called with no value for VERSION.");
return false;
}
doing_version = false;
}
else if(doing_version)
{
doing_version = false;
version_string = args[i];
}
else
{
this->UnknownArguments.push_back(args[i]);
}
}
if(doing_version)
{
this->SetError("called with no value for VERSION.");
return false;
}
// Make sure there was a version to check.
if(version_string.empty())
{
return this->EnforceUnknownArguments();
}
// Save the required version string.
this->Makefile->AddDefinition("CMAKE_MINIMUM_REQUIRED_VERSION",
version_string.c_str());
// Get the current version number.
int current_major = cmVersion::GetMajorVersion();
int current_minor = cmVersion::GetMinorVersion();
int current_patch = cmVersion::GetPatchVersion();
int current_tweak = cmVersion::GetTweakVersion();
// Parse at least two components of the version number.
// Use zero for those not specified.
int required_major = 0;
int required_minor = 0;
int required_patch = 0;
int required_tweak = 0;
if(sscanf(version_string.c_str(), "%u.%u.%u.%u",
&required_major, &required_minor,
&required_patch, &required_tweak) < 2)
{
cmOStringStream e;
e << "could not parse VERSION \"" << version_string.c_str() << "\".";
this->SetError(e.str().c_str());
return false;
}
// Compare the version numbers.
if((current_major < required_major) ||
(current_major == required_major &&
current_minor < required_minor) ||
(current_major == required_major &&
current_minor == required_minor &&
current_patch < required_patch) ||
(current_major == required_major &&
current_minor == required_minor &&
current_patch == required_patch &&
current_tweak < required_tweak))
{
// The current version is too low.
cmOStringStream e;
e << "CMake " << version_string.c_str()
<< " or higher is required. You are running version "
<< cmVersion::GetCMakeVersion();
this->Makefile->IssueMessage(cmake::FATAL_ERROR, e.str());
cmSystemTools::SetFatalErrorOccured();
return true;
}
// The version is not from the future, so enforce unknown arguments.
if(!this->EnforceUnknownArguments())
{
return false;
}
if (required_major < 2 || (required_major == 2 && required_minor < 4))
{
this->Makefile->SetPolicyVersion("2.4");
}
else
{
this->Makefile->SetPolicyVersion(version_string.c_str());
}
return true;
}
//----------------------------------------------------------------------------
bool cmCMakeMinimumRequired::EnforceUnknownArguments()
{
if(!this->UnknownArguments.empty())
{
cmOStringStream e;
e << "called with unknown argument \""
<< this->UnknownArguments[0] << "\".";
this->SetError(e.str().c_str());
return false;
}
return true;
}
|