diff --git a/Source/cmLocalGenerator.cxx b/Source/cmLocalGenerator.cxx index 3e1436f5f..78db8ed8a 100644 --- a/Source/cmLocalGenerator.cxx +++ b/Source/cmLocalGenerator.cxx @@ -56,6 +56,8 @@ cmLocalGenerator::cmLocalGenerator() this->IsMakefileGenerator = false; this->RelativePathsConfigured = false; this->PathConversionsSetup = false; + this->BackwardsCompatibility = 0; + this->BackwardsCompatibilityFinal = false; } cmLocalGenerator::~cmLocalGenerator() @@ -2860,3 +2862,42 @@ cmLocalGenerator::GetTargetObjectFileDirectories(cmTarget* , cmSystemTools::Error("GetTargetObjectFileDirectories" " called on cmLocalGenerator"); } + +//---------------------------------------------------------------------------- +unsigned int cmLocalGenerator::GetBackwardsCompatibility() +{ + // The computed version may change until the project is fully + // configured. + if(!this->BackwardsCompatibilityFinal) + { + unsigned int major = 0; + unsigned int minor = 0; + unsigned int patch = 0; + if(const char* value + = this->Makefile->GetDefinition("CMAKE_BACKWARDS_COMPATIBILITY")) + { + switch(sscanf(value, "%u.%u.%u", &major, &minor, &patch)) + { + case 2: patch = 0; break; + case 1: minor = 0; patch = 0; break; + default: break; + } + } + this->BackwardsCompatibility = CMake_VERSION_ENCODE(major, minor, patch); + this->BackwardsCompatibilityFinal = this->Configured; + } + + return this->BackwardsCompatibility; +} + +//---------------------------------------------------------------------------- +bool cmLocalGenerator::NeedBackwardsCompatibility(unsigned int major, + unsigned int minor, + unsigned int patch) +{ + // Compatibility is needed if CMAKE_BACKWARDS_COMPATIBILITY is set + // equal to or lower than the given version. + unsigned int actual_compat = this->GetBackwardsCompatibility(); + return (actual_compat && + actual_compat <= CMake_VERSION_ENCODE(major, minor, patch)); +} diff --git a/Source/cmLocalGenerator.h b/Source/cmLocalGenerator.h index dcb86bd51..7c61cede2 100644 --- a/Source/cmLocalGenerator.h +++ b/Source/cmLocalGenerator.h @@ -251,6 +251,24 @@ public: bool IsChrpathAvailable(const cmTarget& target); + /** + * Get the level of backwards compatibility requested by the project + * in this directory. This is the value of the CMake variable + * CMAKE_BACKWARDS_COMPATIBILITY whose format is + * "major.minor[.patch]". The returned integer is encoded as + * + * CMake_VERSION_ENCODE(major, minor, patch) + * + * and is monotonically increasing with the CMake version. + */ + unsigned int GetBackwardsCompatibility(); + + /** + * Test whether compatibility is set to a given version or lower. + */ + bool NeedBackwardsCompatibility(unsigned int major, + unsigned int minor, + unsigned int patch = 0xFFu); protected: /** Construct a comment for a custom command. */ @@ -343,6 +361,9 @@ protected: std::string RelativePathTopBinary; bool RelativePathsConfigured; bool PathConversionsSetup; + + unsigned int BackwardsCompatibility; + bool BackwardsCompatibilityFinal; }; #endif diff --git a/Source/cmStandardIncludes.h b/Source/cmStandardIncludes.h index 4ba86ce83..5b0ccfb4b 100644 --- a/Source/cmStandardIncludes.h +++ b/Source/cmStandardIncludes.h @@ -38,6 +38,9 @@ CMAKE_TO_STRING(CMake_VERSION_MINOR) "." \ CMAKE_TO_STRING(CMake_VERSION_PATCH) +#define CMake_VERSION_ENCODE(major, minor, patch) \ + ((major)*0x10000u + (minor)*0x100u + (patch)) + #ifdef _MSC_VER #pragma warning ( disable : 4786 ) #pragma warning ( disable : 4503 )