瀏覽代碼

Teach Xcode generator to set XCODE_VERSION

We set the variable 'XCODE_VERSION' in the CMake language to the Xcode
version string (e.g. "3.1.2").  Platform config files may use it later.
Brad King 16 年之前
父節點
當前提交
e55bbab88b

+ 7 - 0
Source/cmDocumentVariables.cxx

@@ -784,6 +784,13 @@ void cmDocumentVariables::DefineVariables(cmake* cm)
      "Set to true when the target system is Windows and on cygwin.",false,
      "Variables That Describe the System");
 
+  cm->DefineProperty
+    ("XCODE_VERSION", cmProperty::VARIABLE,
+     "Version of Xcode (Xcode generator only).",
+     "Under the Xcode generator, this is the version of Xcode as specified in "
+     "\"Xcode.app/Contents/version.plist\" (such as \"3.1.2\").",false,
+     "Variables That Describe the System");
+
   cm->DefineProperty
     ("CMAKE_HOST_APPLE", cmProperty::VARIABLE,
      "True for Apple OSXoperating systems.",

+ 16 - 7
Source/cmGlobalXCodeGenerator.cxx

@@ -35,6 +35,7 @@ PURPOSE.  See the above copyright notices for more information.
 class cmXcodeVersionParser : public cmXMLParser
 {
 public:
+  cmXcodeVersionParser(): Version("1.5") {}
   void StartElement(const char* , const char** )
     {
       this->Data = "";
@@ -49,7 +50,7 @@ public:
         {
         if(this->Key == "CFBundleShortVersionString")
           {
-          this->Version = (int)(10.0 * atof(this->Data.c_str()));
+          this->Version = this->Data;
           }
         }
     }
@@ -57,7 +58,7 @@ public:
     {
       this->Data.append(data, length);
     }
-  int Version;
+  std::string Version;
   std::string Key;
   std::string Data;
 };
@@ -115,8 +116,15 @@ public:
 };
 
 //----------------------------------------------------------------------------
-cmGlobalXCodeGenerator::cmGlobalXCodeGenerator()
+cmGlobalXCodeGenerator::cmGlobalXCodeGenerator(std::string const& version)
 {
+  this->VersionString = version;
+
+  // Compute an integer form of the version number.
+  unsigned int v[2] = {0,0};
+  sscanf(this->VersionString.c_str(), "%u.%u", &v[0], &v[1]);
+  this->XcodeVersion = 10*v[0] + v[1];
+
   this->FindMakeProgramFile = "CMakeFindXCode.cmake";
   this->RootObject = 0;
   this->MainGroupChildren = 0;
@@ -124,7 +132,6 @@ cmGlobalXCodeGenerator::cmGlobalXCodeGenerator()
   this->ResourcesGroupChildren = 0;
   this->CurrentMakefile = 0;
   this->CurrentLocalGenerator = 0;
-  this->XcodeVersion = 15;
 }
 
 //----------------------------------------------------------------------------
@@ -134,13 +141,14 @@ cmGlobalGenerator* cmGlobalXCodeGenerator::New()
   cmXcodeVersionParser parser;
   parser.ParseFile
     ("/Developer/Applications/Xcode.app/Contents/version.plist");
-  cmsys::auto_ptr<cmGlobalXCodeGenerator> gg(new cmGlobalXCodeGenerator);
-  if (parser.Version == 20)
+  cmsys::auto_ptr<cmGlobalXCodeGenerator>
+    gg(new cmGlobalXCodeGenerator(parser.Version));
+  if (gg->XcodeVersion == 20)
     {
     cmSystemTools::Message("Xcode 2.0 not really supported by cmake, "
                            "using Xcode 15 generator\n");
+    gg->XcodeVersion = 15;
     }
-  gg->SetVersion(parser.Version);
   return gg.release();
 #else
   std::cerr << "CMake should be built with cmake to use XCode, "
@@ -155,6 +163,7 @@ void cmGlobalXCodeGenerator::EnableLanguage(std::vector<std::string>const&
                                             cmMakefile * mf, bool optional)
 { 
   mf->AddDefinition("XCODE","1");
+  mf->AddDefinition("XCODE_VERSION", this->VersionString.c_str());
   if(this->XcodeVersion == 15)
     {
     }

+ 3 - 3
Source/cmGlobalXCodeGenerator.h

@@ -33,10 +33,9 @@ class cmSourceGroup;
 class cmGlobalXCodeGenerator : public cmGlobalGenerator
 {
 public:
-  cmGlobalXCodeGenerator();
+  cmGlobalXCodeGenerator(std::string const& version);
   static cmGlobalGenerator* New();
 
-  void SetVersion(int v) { this->XcodeVersion = v;}
   ///! Get the name for the generator.
   virtual const char* GetName() const {
     return cmGlobalXCodeGenerator::GetActualName();}
@@ -193,7 +192,8 @@ protected:
   virtual const char* GetInstallTargetName()      { return "install"; }
   virtual const char* GetPackageTargetName()      { return "package"; }
 
-  int XcodeVersion;
+  unsigned int XcodeVersion;
+  std::string VersionString;
   std::vector<cmXCodeObject*> XCodeObjects;
   cmXCodeObject* RootObject;
 private:

+ 1 - 0
Tests/SystemInformation/SystemInformation.in

@@ -93,3 +93,4 @@ CMAKE_C_IMPLICIT_LINK_DIRECTORIES == "${CMAKE_C_IMPLICIT_LINK_DIRECTORIES}"
 CMAKE_CXX_IMPLICIT_LINK_LIBRARIES == "${CMAKE_CXX_IMPLICIT_LINK_LIBRARIES}"
 CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES == "${CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES}"
 
+XCODE_VERSION == "${XCODE_VERSION}"