cmGlobalXCodeGenerator.cxx 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. /*=========================================================================
  2. Program: CMake - Cross-Platform Makefile Generator
  3. Module: $RCSfile$
  4. Language: C++
  5. Date: $Date$
  6. Version: $Revision$
  7. Copyright (c) 2002 Kitware, Inc., Insight Consortium. All rights reserved.
  8. See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details.
  9. This software is distributed WITHOUT ANY WARRANTY; without even
  10. the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
  11. PURPOSE. See the above copyright notices for more information.
  12. =========================================================================*/
  13. #include "cmGlobalXCodeGenerator.h"
  14. #include "cmLocalXCodeGenerator.h"
  15. #include "cmMakefile.h"
  16. #include "cmXCodeObject.h"
  17. #include "cmake.h"
  18. #include "cmGeneratedFileStream.h"
  19. //----------------------------------------------------------------------------
  20. cmGlobalXCodeGenerator::cmGlobalXCodeGenerator()
  21. {
  22. m_FindMakeProgramFile = "CMakeFindXCode.cmake";
  23. m_RootObject = 0;
  24. }
  25. //----------------------------------------------------------------------------
  26. void cmGlobalXCodeGenerator::EnableLanguage(std::vector<std::string>const& lang,
  27. cmMakefile *mf)
  28. {
  29. //this->cmGlobalGenerator::EnableLanguage(lang, mf);
  30. }
  31. //----------------------------------------------------------------------------
  32. int cmGlobalXCodeGenerator::TryCompile(const char *,
  33. const char *bindir,
  34. const char *projectName,
  35. const char *targetName,
  36. std::string *output,
  37. cmMakefile* mf)
  38. {
  39. // FIXME
  40. return 1;
  41. }
  42. //----------------------------------------------------------------------------
  43. ///! Create a local generator appropriate to this Global Generator
  44. cmLocalGenerator *cmGlobalXCodeGenerator::CreateLocalGenerator()
  45. {
  46. cmLocalGenerator *lg = new cmLocalXCodeGenerator;
  47. lg->SetGlobalGenerator(this);
  48. return lg;
  49. }
  50. //----------------------------------------------------------------------------
  51. void cmGlobalXCodeGenerator::Generate()
  52. {
  53. this->cmGlobalGenerator::Generate();
  54. std::map<cmStdString, std::vector<cmLocalGenerator*> >::iterator it;
  55. for(it = m_ProjectMap.begin(); it!= m_ProjectMap.end(); ++it)
  56. {
  57. this->OutputXCodeProject(it->second[0], it->second);
  58. }
  59. }
  60. //----------------------------------------------------------------------------
  61. void cmGlobalXCodeGenerator::ClearXCodeObjects()
  62. {
  63. for(unsigned int i = 0; i < m_XCodeObjects.size(); ++i)
  64. {
  65. delete m_XCodeObjects[i];
  66. }
  67. m_XCodeObjects.clear();
  68. }
  69. //----------------------------------------------------------------------------
  70. cmXCodeObject* cmGlobalXCodeGenerator::CreateObject(cmXCodeObject::PBXType ptype,
  71. cmXCodeObject::Type type)
  72. {
  73. cmXCodeObject* obj = new cmXCodeObject(ptype, type);
  74. m_XCodeObjects.push_back(obj);
  75. return obj;
  76. }
  77. cmXCodeObject* cmGlobalXCodeGenerator::CreateString(const char* s)
  78. {
  79. cmXCodeObject* obj = new cmXCodeObject(cmXCodeObject::None, cmXCodeObject::STRING);
  80. m_XCodeObjects.push_back(obj);
  81. obj->SetString(s);
  82. return obj;
  83. }
  84. //----------------------------------------------------------------------------
  85. void cmGlobalXCodeGenerator::CreateXCodeObjects(cmLocalGenerator* root,
  86. std::vector<cmLocalGenerator*>&
  87. generators)
  88. {
  89. delete m_RootObject;
  90. this->ClearXCodeObjects();
  91. cmXCodeObject* group = this->CreateObject(cmXCodeObject::None, cmXCodeObject::ATTRIBUTE_GROUP);
  92. group->AddAttribute("COPY_PHASE_STRIP", this->CreateString("NO"));
  93. cmXCodeObject* developBuildStyle = this->CreateObject(cmXCodeObject::PBXBuildStyle,
  94. cmXCodeObject::OBJECT);
  95. developBuildStyle->AddAttribute("name", this->CreateString("Development"));
  96. developBuildStyle->AddAttribute("buildSettings", group);
  97. group = this->CreateObject(cmXCodeObject::None, cmXCodeObject::ATTRIBUTE_GROUP);
  98. group->AddAttribute("COPY_PHASE_STRIP", this->CreateString("YES"));
  99. cmXCodeObject* deployBuildStyle = this->CreateObject(cmXCodeObject::PBXBuildStyle,
  100. cmXCodeObject::OBJECT);
  101. deployBuildStyle->AddAttribute("name", this->CreateString("Deployment"));
  102. deployBuildStyle->AddAttribute("buildSettings", group);
  103. cmXCodeObject* listObjs = this->CreateObject(cmXCodeObject::None,
  104. cmXCodeObject::OBJECT_LIST);
  105. listObjs->AddObject(developBuildStyle);
  106. listObjs->AddObject(deployBuildStyle);
  107. m_RootObject = this->CreateObject(cmXCodeObject::PBXProject, cmXCodeObject::OBJECT);
  108. group = this->CreateObject(cmXCodeObject::None, cmXCodeObject::ATTRIBUTE_GROUP);
  109. m_RootObject->AddAttribute("buildSettings", group);
  110. m_RootObject->AddAttribute("buildSyles", listObjs);
  111. m_RootObject->AddAttribute("hasScannedForEncodings", this->CreateString("0"));
  112. }
  113. //----------------------------------------------------------------------------
  114. void cmGlobalXCodeGenerator::OutputXCodeProject(cmLocalGenerator* root,
  115. std::vector<cmLocalGenerator*>&
  116. generators)
  117. {
  118. if(generators.size() == 0)
  119. {
  120. return;
  121. }
  122. this->CreateXCodeObjects(root,
  123. generators);
  124. std::string xcodeDir = root->GetMakefile()->GetStartOutputDirectory();
  125. xcodeDir += "/";
  126. xcodeDir += root->GetMakefile()->GetProjectName();
  127. xcodeDir += ".xcode";
  128. cmSystemTools::MakeDirectory(xcodeDir.c_str());
  129. xcodeDir += "/project.pbxproj";
  130. cmGeneratedFileStream fout(xcodeDir.c_str());
  131. fout.SetCopyIfDifferent(true);
  132. if(!fout)
  133. {
  134. return;
  135. }
  136. this->WriteXCodePBXProj(fout, root, generators);
  137. this->ClearXCodeObjects();
  138. }
  139. //----------------------------------------------------------------------------
  140. void cmGlobalXCodeGenerator::WriteXCodePBXProj(std::ostream& fout,
  141. cmLocalGenerator* root,
  142. std::vector<cmLocalGenerator*>&
  143. generators)
  144. {
  145. fout << "// !$*UTF8*$!\n";
  146. fout << "{\n";
  147. cmXCodeObject::Indent(1, fout);
  148. fout << "archiveVersion = 1;\n";
  149. cmXCodeObject::Indent(1, fout);
  150. fout << "classes = {\n";
  151. cmXCodeObject::Indent(1, fout);
  152. fout << "};\n";
  153. cmXCodeObject::Indent(1, fout);
  154. fout << "objectVersion = 39;\n";
  155. cmXCodeObject::PrintList(m_XCodeObjects, fout);
  156. cmXCodeObject::Indent(1, fout);
  157. fout << "rootObject = " << m_RootObject->GetId() << ";\n";
  158. fout << "}\n";
  159. }
  160. //----------------------------------------------------------------------------
  161. void cmGlobalXCodeGenerator::GetDocumentation(cmDocumentationEntry& entry) const
  162. {
  163. entry.name = this->GetName();
  164. entry.brief = "NOT YET WORKING, Will generates XCode project files.";
  165. entry.full = "";
  166. }