diff options
Diffstat (limited to 'Source/cmCMakeMinimumRequired.cxx')
-rw-r--r-- | Source/cmCMakeMinimumRequired.cxx | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/Source/cmCMakeMinimumRequired.cxx b/Source/cmCMakeMinimumRequired.cxx new file mode 100644 index 0000000..1376845 --- /dev/null +++ b/Source/cmCMakeMinimumRequired.cxx @@ -0,0 +1,117 @@ +/*============================================================================ + 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. + unsigned int current_major = cmVersion::GetMajorVersion(); + unsigned int current_minor = cmVersion::GetMinorVersion(); + unsigned int current_patch = cmVersion::GetPatchVersion(); + unsigned int current_tweak = cmVersion::GetTweakVersion(); + + // Parse at least two components of the version number. + // Use zero for those not specified. + unsigned int required_major = 0; + unsigned int required_minor = 0; + unsigned int required_patch = 0; + unsigned int required_tweak = 0; + if (sscanf(version_string.c_str(), "%u.%u.%u.%u", &required_major, + &required_minor, &required_patch, &required_tweak) < 2) { + std::ostringstream e; + e << "could not parse VERSION \"" << version_string << "\"."; + this->SetError(e.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. + std::ostringstream e; + e << "CMake " << version_string + << " 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->IssueMessage( + cmake::AUTHOR_WARNING, + "Compatibility with CMake < 2.4 is not supported by CMake >= 3.0."); + this->Makefile->SetPolicyVersion("2.4"); + } else { + this->Makefile->SetPolicyVersion(version_string.c_str()); + } + + return true; +} + +bool cmCMakeMinimumRequired::EnforceUnknownArguments() +{ + if (!this->UnknownArguments.empty()) { + std::ostringstream e; + e << "called with unknown argument \"" << this->UnknownArguments[0] + << "\"."; + this->SetError(e.str()); + return false; + } + return true; +} |