diff --git a/Source/cmDocumentVariables.cxx b/Source/cmDocumentVariables.cxx index d6d62676b..ea07da46f 100644 --- a/Source/cmDocumentVariables.cxx +++ b/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.", diff --git a/Source/cmGlobalXCodeGenerator.cxx b/Source/cmGlobalXCodeGenerator.cxx index 225d27183..e6957490e 100644 --- a/Source/cmGlobalXCodeGenerator.cxx +++ b/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 gg(new cmGlobalXCodeGenerator); - if (parser.Version == 20) + cmsys::auto_ptr + 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::vectorconst& cmMakefile * mf, bool optional) { mf->AddDefinition("XCODE","1"); + mf->AddDefinition("XCODE_VERSION", this->VersionString.c_str()); if(this->XcodeVersion == 15) { } diff --git a/Source/cmGlobalXCodeGenerator.h b/Source/cmGlobalXCodeGenerator.h index 189d7fb4a..adc675b6d 100644 --- a/Source/cmGlobalXCodeGenerator.h +++ b/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 XCodeObjects; cmXCodeObject* RootObject; private: diff --git a/Tests/SystemInformation/SystemInformation.in b/Tests/SystemInformation/SystemInformation.in index 477dea074..d2e4de44b 100644 --- a/Tests/SystemInformation/SystemInformation.in +++ b/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}"