ENH: Added method cmLocalGenerator::GetBackwardsCompatibility to reduce parsing of CMAKE_BACKWARDS_COMPATIBILITY variable. Add cmLocalGenerator::NeedBackwardsCompatibility to simplify checks for compatibility requirements.

This commit is contained in:
Brad King 2007-12-28 23:07:14 -05:00
parent 2da186266e
commit f872c10b7e
3 changed files with 65 additions and 0 deletions

View File

@ -56,6 +56,8 @@ cmLocalGenerator::cmLocalGenerator()
this->IsMakefileGenerator = false; this->IsMakefileGenerator = false;
this->RelativePathsConfigured = false; this->RelativePathsConfigured = false;
this->PathConversionsSetup = false; this->PathConversionsSetup = false;
this->BackwardsCompatibility = 0;
this->BackwardsCompatibilityFinal = false;
} }
cmLocalGenerator::~cmLocalGenerator() cmLocalGenerator::~cmLocalGenerator()
@ -2860,3 +2862,42 @@ cmLocalGenerator::GetTargetObjectFileDirectories(cmTarget* ,
cmSystemTools::Error("GetTargetObjectFileDirectories" cmSystemTools::Error("GetTargetObjectFileDirectories"
" called on cmLocalGenerator"); " 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));
}

View File

@ -251,6 +251,24 @@ public:
bool IsChrpathAvailable(const cmTarget& target); 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: protected:
/** Construct a comment for a custom command. */ /** Construct a comment for a custom command. */
@ -343,6 +361,9 @@ protected:
std::string RelativePathTopBinary; std::string RelativePathTopBinary;
bool RelativePathsConfigured; bool RelativePathsConfigured;
bool PathConversionsSetup; bool PathConversionsSetup;
unsigned int BackwardsCompatibility;
bool BackwardsCompatibilityFinal;
}; };
#endif #endif

View File

@ -38,6 +38,9 @@
CMAKE_TO_STRING(CMake_VERSION_MINOR) "." \ CMAKE_TO_STRING(CMake_VERSION_MINOR) "." \
CMAKE_TO_STRING(CMake_VERSION_PATCH) CMAKE_TO_STRING(CMake_VERSION_PATCH)
#define CMake_VERSION_ENCODE(major, minor, patch) \
((major)*0x10000u + (minor)*0x100u + (patch))
#ifdef _MSC_VER #ifdef _MSC_VER
#pragma warning ( disable : 4786 ) #pragma warning ( disable : 4786 )
#pragma warning ( disable : 4503 ) #pragma warning ( disable : 4503 )