Просмотр исходного кода

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

Brad King 18 лет назад
Родитель
Сommit
f872c10b7e
3 измененных файлов с 65 добавлено и 0 удалено
  1. 41 0
      Source/cmLocalGenerator.cxx
  2. 21 0
      Source/cmLocalGenerator.h
  3. 3 0
      Source/cmStandardIncludes.h

+ 41 - 0
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));
+}

+ 21 - 0
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

+ 3 - 0
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 )