cmGlobalXCodeGenerator.cxx 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514
  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. #include "cmSourceFile.h"
  20. //----------------------------------------------------------------------------
  21. cmGlobalXCodeGenerator::cmGlobalXCodeGenerator()
  22. {
  23. m_FindMakeProgramFile = "CMakeFindXCode.cmake";
  24. m_RootObject = 0;
  25. }
  26. //----------------------------------------------------------------------------
  27. void cmGlobalXCodeGenerator::EnableLanguage(std::vector<std::string>const& lang,
  28. cmMakefile * mf)
  29. {
  30. mf->AddDefinition("CMAKE_GENERATOR_CC", "gcc");
  31. mf->AddDefinition("CMAKE_GENERATOR_CXX", "g++");
  32. this->cmGlobalGenerator::EnableLanguage(lang, mf);
  33. }
  34. //----------------------------------------------------------------------------
  35. int cmGlobalXCodeGenerator::TryCompile(const char *,
  36. const char * bindir,
  37. const char * projectName,
  38. const char * targetName,
  39. std::string * output,
  40. cmMakefile*)
  41. {
  42. // now build the test
  43. std::string makeCommand =
  44. m_CMakeInstance->GetCacheManager()->GetCacheValue("CMAKE_MAKE_PROGRAM");
  45. if(makeCommand.size() == 0)
  46. {
  47. cmSystemTools::Error(
  48. "Generator cannot find the appropriate make command.");
  49. return 1;
  50. }
  51. makeCommand = cmSystemTools::ConvertToOutputPath(makeCommand.c_str());
  52. std::string lowerCaseCommand = makeCommand;
  53. cmSystemTools::LowerCase(lowerCaseCommand);
  54. /**
  55. * Run an executable command and put the stdout in output.
  56. */
  57. std::string cwd = cmSystemTools::GetCurrentWorkingDirectory();
  58. cmSystemTools::ChangeDirectory(bindir);
  59. // Usage: xcodebuild [-project <projectname>] [-activetarget]
  60. // [-alltargets] [-target <targetname>]... [-activebuildstyle]
  61. // [-buildstyle <buildstylename>] [-optionalbuildstyle <buildstylename>]
  62. // [<buildsetting>=<value>]... [<buildaction>]...
  63. // xcodebuild [-list]
  64. makeCommand += " -project ";
  65. makeCommand += projectName;
  66. makeCommand += " build ";
  67. if (targetName)
  68. {
  69. makeCommand += "-target ";
  70. makeCommand += targetName;
  71. }
  72. int retVal;
  73. int timeout = cmGlobalGenerator::s_TryCompileTimeout;
  74. if (!cmSystemTools::RunSingleCommand(makeCommand.c_str(), output, &retVal,
  75. 0, false, timeout))
  76. {
  77. cmSystemTools::Error("Generator: execution of xcodebuild failed.");
  78. // return to the original directory
  79. cmSystemTools::ChangeDirectory(cwd.c_str());
  80. return 1;
  81. }
  82. cmSystemTools::ChangeDirectory(cwd.c_str());
  83. return retVal;
  84. }
  85. //----------------------------------------------------------------------------
  86. ///! Create a local generator appropriate to this Global Generator
  87. cmLocalGenerator *cmGlobalXCodeGenerator::CreateLocalGenerator()
  88. {
  89. cmLocalGenerator *lg = new cmLocalXCodeGenerator;
  90. lg->SetGlobalGenerator(this);
  91. return lg;
  92. }
  93. //----------------------------------------------------------------------------
  94. void cmGlobalXCodeGenerator::Generate()
  95. {
  96. this->cmGlobalGenerator::Generate();
  97. std::map<cmStdString, std::vector<cmLocalGenerator*> >::iterator it;
  98. for(it = m_ProjectMap.begin(); it!= m_ProjectMap.end(); ++it)
  99. {
  100. this->OutputXCodeProject(it->second[0], it->second);
  101. }
  102. }
  103. //----------------------------------------------------------------------------
  104. void cmGlobalXCodeGenerator::ClearXCodeObjects()
  105. {
  106. for(unsigned int i = 0; i < m_XCodeObjects.size(); ++i)
  107. {
  108. delete m_XCodeObjects[i];
  109. }
  110. m_XCodeObjects.clear();
  111. }
  112. //----------------------------------------------------------------------------
  113. cmXCodeObject*
  114. cmGlobalXCodeGenerator::CreateObject(cmXCodeObject::PBXType ptype)
  115. {
  116. cmXCodeObject* obj = new cmXCodeObject(ptype, cmXCodeObject::OBJECT);
  117. m_XCodeObjects.push_back(obj);
  118. return obj;
  119. }
  120. //----------------------------------------------------------------------------
  121. cmXCodeObject*
  122. cmGlobalXCodeGenerator::CreateObject(cmXCodeObject::Type type)
  123. {
  124. cmXCodeObject* obj = new cmXCodeObject(cmXCodeObject::None, type);
  125. m_XCodeObjects.push_back(obj);
  126. return obj;
  127. }
  128. cmXCodeObject*
  129. cmGlobalXCodeGenerator::CreateString(const char* s)
  130. {
  131. cmXCodeObject* obj = this->CreateObject(cmXCodeObject::STRING);
  132. obj->SetString(s);
  133. return obj;
  134. }
  135. cmXCodeObject* cmGlobalXCodeGenerator::CreateObjectReference(cmXCodeObject* ref)
  136. {
  137. cmXCodeObject* obj = this->CreateObject(cmXCodeObject::OBJECT_REF);
  138. obj->SetObject(ref);
  139. return obj;
  140. }
  141. cmXCodeObject*
  142. cmGlobalXCodeGenerator::CreateXCodeSourceFile(cmLocalGenerator* lg,
  143. cmSourceFile* sf,
  144. cmXCodeObject* mainGroupChildren)
  145. {
  146. cmXCodeObject* fileRef = this->CreateObject(cmXCodeObject::PBXFileReference);
  147. mainGroupChildren->AddObject(fileRef);
  148. cmXCodeObject* buildFile = this->CreateObject(cmXCodeObject::PBXBuildFile);
  149. buildFile->AddAttribute("fileRef", this->CreateObjectReference(fileRef));
  150. cmXCodeObject* settings = this->CreateObject(cmXCodeObject::ATTRIBUTE_GROUP);
  151. buildFile->AddAttribute("settings", settings);
  152. fileRef->AddAttribute("fileEncoding", this->CreateString("4"));
  153. fileRef->AddAttribute("lastKnownFileType",
  154. this->CreateString("sourcecode.cpp.cpp"));
  155. fileRef->AddAttribute("path", this->CreateString(
  156. lg->ConvertToRelativeOutputPath(sf->GetFullPath().c_str()).c_str()));
  157. fileRef->AddAttribute("refType", this->CreateString("4"));
  158. fileRef->AddAttribute("sourceTree", this->CreateString("\"<absolute>\""));
  159. return buildFile;
  160. }
  161. //----------------------------------------------------------------------------
  162. void cmGlobalXCodeGenerator::CreateXCodeTargets(cmLocalGenerator* gen,
  163. std::vector<cmXCodeObject*>& targets,
  164. cmXCodeObject* mainGroupChildren)
  165. {
  166. cmTargets &tgts = gen->GetMakefile()->GetTargets();
  167. for(cmTargets::iterator l = tgts.begin(); l != tgts.end(); l++)
  168. {
  169. // create source build phase
  170. cmXCodeObject* sourceBuildPhase =
  171. this->CreateObject(cmXCodeObject::PBXSourcesBuildPhase);
  172. sourceBuildPhase->AddAttribute("buildActionMask",
  173. this->CreateString("2147483647"));
  174. cmXCodeObject* buildFiles = this->CreateObject(cmXCodeObject::OBJECT_LIST);
  175. sourceBuildPhase->AddAttribute("files", buildFiles);
  176. sourceBuildPhase->AddAttribute("runOnlyForDeploymentPostprocessing",
  177. this->CreateString("0"));
  178. std::vector<cmSourceFile*> &classes = l->second.GetSourceFiles();
  179. // add all the sources
  180. for(std::vector<cmSourceFile*>::iterator i = classes.begin();
  181. i != classes.end(); ++i)
  182. {
  183. buildFiles->AddObject(this->CreateXCodeSourceFile(gen, *i,
  184. mainGroupChildren));
  185. }
  186. // create header build phase
  187. cmXCodeObject* headerBuildPhase =
  188. this->CreateObject(cmXCodeObject::PBXHeadersBuildPhase);
  189. headerBuildPhase->AddAttribute("buildActionMask",
  190. this->CreateString("2147483647"));
  191. buildFiles = this->CreateObject(cmXCodeObject::OBJECT_LIST);
  192. headerBuildPhase->AddAttribute("files", buildFiles);
  193. headerBuildPhase->AddAttribute("runOnlyForDeploymentPostprocessing",
  194. this->CreateString("0"));
  195. // create framework build phase
  196. cmXCodeObject* frameworkBuildPhase =
  197. this->CreateObject(cmXCodeObject::PBXFrameworksBuildPhase);
  198. frameworkBuildPhase->AddAttribute("buildActionMask",
  199. this->CreateString("2147483647"));
  200. buildFiles = this->CreateObject(cmXCodeObject::OBJECT_LIST);
  201. frameworkBuildPhase->AddAttribute("files", buildFiles);
  202. frameworkBuildPhase->AddAttribute("runOnlyForDeploymentPostprocessing",
  203. this->CreateString("0"));
  204. cmXCodeObject* buildPhases = this->CreateObject(cmXCodeObject::OBJECT_LIST);
  205. buildPhases->AddObject(sourceBuildPhase);
  206. buildPhases->AddObject(headerBuildPhase);
  207. buildPhases->AddObject(frameworkBuildPhase);
  208. switch(l->second.GetType())
  209. {
  210. case cmTarget::STATIC_LIBRARY:
  211. targets.push_back(this->CreateStaticLibrary(l->second, buildPhases));
  212. break;
  213. case cmTarget::SHARED_LIBRARY:
  214. targets.push_back(this->CreateSharedLibrary(l->second, buildPhases));
  215. break;
  216. case cmTarget::MODULE_LIBRARY:
  217. targets.push_back(this->CreateSharedLibrary(l->second, buildPhases));
  218. break;
  219. case cmTarget::EXECUTABLE:
  220. targets.push_back(this->CreateExecutable(l->second, buildPhases));
  221. break;
  222. case cmTarget::UTILITY:
  223. break;
  224. case cmTarget::INSTALL_FILES:
  225. break;
  226. case cmTarget::INSTALL_PROGRAMS:
  227. break;
  228. }
  229. }
  230. }
  231. // to force the location of a target
  232. //6FE4372B07AAF276004FB461 = {
  233. //buildSettings = {
  234. //COPY_PHASE_STRIP = NO;
  235. //SYMROOT = "/Users/kitware/Bill/CMake-build/test/build/bin";
  236. //};
  237. //isa = PBXBuildStyle;
  238. //name = Development;
  239. //};
  240. cmXCodeObject* cmGlobalXCodeGenerator::CreateExecutable(cmTarget& cmtarget,
  241. cmXCodeObject* buildPhases)
  242. {
  243. cmXCodeObject* target = this->CreateObject(cmXCodeObject::PBXNativeTarget);
  244. target->AddAttribute("buildPhases", buildPhases);
  245. cmXCodeObject* buildRules = this->CreateObject(cmXCodeObject::OBJECT_LIST);
  246. target->AddAttribute("buildRules", buildRules);
  247. cmXCodeObject* buildSettings =
  248. this->CreateObject(cmXCodeObject::ATTRIBUTE_GROUP);
  249. buildSettings->AddAttribute("INSTALL_PATH",
  250. this->CreateString("/usr/local/bin"));
  251. buildSettings->AddAttribute("OPTIMIZATION_CFLAGS",
  252. this->CreateString(""));
  253. buildSettings->AddAttribute("OTHER_CFLAGS",
  254. this->CreateString(""));
  255. buildSettings->AddAttribute("OTHER_LDFLAGS",
  256. this->CreateString(""));
  257. buildSettings->AddAttribute("OTHER_REZFLAGS",
  258. this->CreateString(""));
  259. buildSettings->AddAttribute("PRODUCT_NAME",
  260. this->CreateString(cmtarget.GetName()));
  261. buildSettings->AddAttribute("SECTORDER_FLAGS",
  262. this->CreateString(""));
  263. buildSettings->AddAttribute("WARNING_CFLAGS",
  264. this->CreateString("-Wmost -Wno-four-char-constants -Wno-unknown-pragmas"));
  265. target->AddAttribute("buildSettings", buildSettings);
  266. cmXCodeObject* dependencies = this->CreateObject(cmXCodeObject::OBJECT_LIST);
  267. target->AddAttribute("dependencies", dependencies);
  268. target->AddAttribute("name", this->CreateString(cmtarget.GetName()));
  269. target->AddAttribute("productName",this->CreateString(cmtarget.GetName()));
  270. cmXCodeObject* fileRef = this->CreateObject(cmXCodeObject::PBXFileReference);
  271. fileRef->AddAttribute("explicitFileType",
  272. this->CreateString("\"compiled.mach-o.executable\""));
  273. fileRef->AddAttribute("includedInIndex", this->CreateString("0"));
  274. fileRef->AddAttribute("path", this->CreateString(cmtarget.GetName()));
  275. fileRef->AddAttribute("refType", this->CreateString("3"));
  276. fileRef->AddAttribute("sourceTree", this->CreateString("BUILT_PRODUCTS_DIR"));
  277. target->AddAttribute("productReference", this->CreateObjectReference(fileRef));
  278. target->AddAttribute("productType",
  279. this->CreateString("\"com.apple.product-type.tool\""));
  280. return target;
  281. }
  282. //----------------------------------------------------------------------------
  283. cmXCodeObject* cmGlobalXCodeGenerator::CreateStaticLibrary(cmTarget& cmtarget,
  284. cmXCodeObject* buildPhases)
  285. {
  286. cmXCodeObject* target = this->CreateObject(cmXCodeObject::PBXNativeTarget);
  287. target->AddAttribute("buildPhases", buildPhases);
  288. cmXCodeObject* buildRules = this->CreateObject(cmXCodeObject::OBJECT_LIST);
  289. target->AddAttribute("buildRules", buildRules);
  290. cmXCodeObject* buildSettings =
  291. this->CreateObject(cmXCodeObject::ATTRIBUTE_GROUP);
  292. buildSettings->AddAttribute("INSTALL_PATH",
  293. this->CreateString("/usr/local/bin"));
  294. buildSettings->AddAttribute("LIBRARY_STYLE",
  295. this->CreateString("STATIC"));
  296. buildSettings->AddAttribute("OPTIMIZATION_CFLAGS",
  297. this->CreateString(""));
  298. buildSettings->AddAttribute("OTHER_CFLAGS",
  299. this->CreateString(""));
  300. buildSettings->AddAttribute("OTHER_LDFLAGS",
  301. this->CreateString(""));
  302. buildSettings->AddAttribute("OTHER_REZFLAGS",
  303. this->CreateString(""));
  304. buildSettings->AddAttribute("PRODUCT_NAME",
  305. this->CreateString(cmtarget.GetName()));
  306. buildSettings->AddAttribute("SECTORDER_FLAGS",
  307. this->CreateString(""));
  308. buildSettings->AddAttribute("WARNING_CFLAGS",
  309. this->CreateString("-Wmost -Wno-four-char-constants -Wno-unknown-pragmas"));
  310. target->AddAttribute("buildSettings", buildSettings);
  311. cmXCodeObject* dependencies = this->CreateObject(cmXCodeObject::OBJECT_LIST);
  312. target->AddAttribute("dependencies", dependencies);
  313. target->AddAttribute("name", this->CreateString(cmtarget.GetName()));
  314. target->AddAttribute("productName",this->CreateString(cmtarget.GetName()));
  315. cmXCodeObject* fileRef = this->CreateObject(cmXCodeObject::PBXFileReference);
  316. fileRef->AddAttribute("explicitFileType",
  317. this->CreateString("\"compiled.mach-o.archive.ar\""));
  318. fileRef->AddAttribute("includedInIndex", this->CreateString("0"));
  319. fileRef->AddAttribute("path", this->CreateString(cmtarget.GetName()));
  320. fileRef->AddAttribute("refType", this->CreateString("3"));
  321. fileRef->AddAttribute("sourceTree", this->CreateString("BUILT_PRODUCTS_DIR"));
  322. target->AddAttribute("productReference", this->CreateObjectReference(fileRef));
  323. target->AddAttribute("productType",
  324. this->CreateString("\"com.apple.product-type.library.static\""));
  325. return target;
  326. }
  327. //----------------------------------------------------------------------------
  328. cmXCodeObject* cmGlobalXCodeGenerator::CreateSharedLibrary(cmTarget& cmtarget,
  329. cmXCodeObject* buildPhases)
  330. {
  331. cmXCodeObject* target = this->CreateObject(cmXCodeObject::PBXNativeTarget);
  332. target->AddAttribute("buildPhases", buildPhases);
  333. cmXCodeObject* buildRules = this->CreateObject(cmXCodeObject::OBJECT_LIST);
  334. target->AddAttribute("buildRules", buildRules);
  335. cmXCodeObject* buildSettings =
  336. this->CreateObject(cmXCodeObject::ATTRIBUTE_GROUP);
  337. buildSettings->AddAttribute("DYLIB_COMPATIBILITY_VERSION",
  338. this->CreateString("1"));
  339. buildSettings->AddAttribute("DYLIB_CURRENT_VERSION",
  340. this->CreateString("1"));
  341. buildSettings->AddAttribute("INSTALL_PATH",
  342. this->CreateString("/usr/local/lib"));
  343. buildSettings->AddAttribute("LIBRARY_STYLE",
  344. this->CreateString("DYNAMIC"));
  345. buildSettings->AddAttribute("OPTIMIZATION_CFLAGS",
  346. this->CreateString(""));
  347. buildSettings->AddAttribute("OTHER_CFLAGS",
  348. this->CreateString(""));
  349. const char* libFlag = "-dynamiclib";
  350. if(cmtarget.GetType() == cmTarget::MODULE_LIBRARY)
  351. {
  352. libFlag = "-bundle";
  353. }
  354. buildSettings->AddAttribute("OTHER_LDFLAGS",
  355. this->CreateString(libFlag));
  356. buildSettings->AddAttribute("OTHER_REZFLAGS",
  357. this->CreateString(""));
  358. buildSettings->AddAttribute("PRODUCT_NAME",
  359. this->CreateString(cmtarget.GetName()));
  360. buildSettings->AddAttribute("SECTORDER_FLAGS",
  361. this->CreateString(""));
  362. buildSettings->AddAttribute("WARNING_CFLAGS",
  363. this->CreateString("-Wmost -Wno-four-char-constants -Wno-unknown-pragmas"));
  364. target->AddAttribute("buildSettings", buildSettings);
  365. cmXCodeObject* dependencies = this->CreateObject(cmXCodeObject::OBJECT_LIST);
  366. target->AddAttribute("dependencies", dependencies);
  367. target->AddAttribute("name", this->CreateString(cmtarget.GetName()));
  368. target->AddAttribute("productName",this->CreateString(cmtarget.GetName()));
  369. cmXCodeObject* fileRef = this->CreateObject(cmXCodeObject::PBXFileReference);
  370. fileRef->AddAttribute("explicitFileType",
  371. this->CreateString("\"compiled.mach-o.dylib\""));
  372. fileRef->AddAttribute("includedInIndex", this->CreateString("0"));
  373. std::string path = cmtarget.GetName();
  374. path += ".dylib";
  375. fileRef->AddAttribute("path", this->CreateString(path.c_str()));
  376. fileRef->AddAttribute("refType", this->CreateString("3"));
  377. fileRef->AddAttribute("sourceTree", this->CreateString("BUILT_PRODUCTS_DIR"));
  378. target->AddAttribute("productReference", this->CreateObjectReference(fileRef));
  379. target->AddAttribute("productType",
  380. this->CreateString("\"com.apple.product-type.library.dynamic\""));
  381. return target;
  382. }
  383. //----------------------------------------------------------------------------
  384. void cmGlobalXCodeGenerator::CreateXCodeObjects(cmLocalGenerator* ,
  385. std::vector<cmLocalGenerator*>&
  386. generators
  387. )
  388. {
  389. delete m_RootObject;
  390. this->ClearXCodeObjects();
  391. cmXCodeObject* group = this->CreateObject(cmXCodeObject::ATTRIBUTE_GROUP);
  392. group->AddAttribute("COPY_PHASE_STRIP", this->CreateString("NO"));
  393. cmXCodeObject* developBuildStyle = this->CreateObject(cmXCodeObject::PBXBuildStyle);
  394. developBuildStyle->AddAttribute("name", this->CreateString("Development"));
  395. developBuildStyle->AddAttribute("buildSettings", group);
  396. group = this->CreateObject(cmXCodeObject::ATTRIBUTE_GROUP);
  397. group->AddAttribute("COPY_PHASE_STRIP", this->CreateString("YES"));
  398. cmXCodeObject* deployBuildStyle = this->CreateObject(cmXCodeObject::PBXBuildStyle);
  399. deployBuildStyle->AddAttribute("name", this->CreateString("Deployment"));
  400. deployBuildStyle->AddAttribute("buildSettings", group);
  401. cmXCodeObject* listObjs = this->CreateObject(cmXCodeObject::OBJECT_LIST);
  402. listObjs->AddObject(developBuildStyle);
  403. listObjs->AddObject(deployBuildStyle);
  404. cmXCodeObject* mainGroup = this->CreateObject(cmXCodeObject::PBXGroup);
  405. cmXCodeObject* mainGroupChildren = this->CreateObject(cmXCodeObject::OBJECT_LIST);
  406. mainGroup->AddAttribute("children", mainGroupChildren);
  407. mainGroup->AddAttribute("refType", this->CreateString("4"));
  408. mainGroup->AddAttribute("sourceTree", this->CreateString("\"<group>\""));
  409. m_RootObject = this->CreateObject(cmXCodeObject::PBXProject);
  410. group = this->CreateObject(cmXCodeObject::ATTRIBUTE_GROUP);
  411. m_RootObject->AddAttribute("mainGroup", this->CreateObjectReference(mainGroup));
  412. m_RootObject->AddAttribute("buildSettings", group);
  413. m_RootObject->AddAttribute("buildSyles", listObjs);
  414. m_RootObject->AddAttribute("hasScannedForEncodings", this->CreateString("0"));
  415. std::vector<cmXCodeObject*> targets;
  416. for(std::vector<cmLocalGenerator*>::iterator i = generators.begin();
  417. i != generators.end(); ++i)
  418. {
  419. this->CreateXCodeTargets(*i, targets, mainGroupChildren);
  420. }
  421. cmXCodeObject* allTargets = this->CreateObject(cmXCodeObject::OBJECT_LIST);
  422. for(std::vector<cmXCodeObject*>::iterator i = targets.begin();
  423. i != targets.end(); ++i)
  424. {
  425. allTargets->AddObject(*i);
  426. }
  427. m_RootObject->AddAttribute("targets", allTargets);
  428. }
  429. //----------------------------------------------------------------------------
  430. void cmGlobalXCodeGenerator::OutputXCodeProject(cmLocalGenerator* root,
  431. std::vector<cmLocalGenerator*>&
  432. generators)
  433. {
  434. if(generators.size() == 0)
  435. {
  436. return;
  437. }
  438. this->CreateXCodeObjects(root,
  439. generators);
  440. std::string xcodeDir = root->GetMakefile()->GetStartOutputDirectory();
  441. xcodeDir += "/";
  442. xcodeDir += root->GetMakefile()->GetProjectName();
  443. xcodeDir += ".xcode";
  444. cmSystemTools::MakeDirectory(xcodeDir.c_str());
  445. xcodeDir += "/project.pbxproj";
  446. cmGeneratedFileStream fout(xcodeDir.c_str());
  447. fout.SetCopyIfDifferent(true);
  448. if(!fout)
  449. {
  450. return;
  451. }
  452. this->WriteXCodePBXProj(fout, root, generators);
  453. this->ClearXCodeObjects();
  454. }
  455. //----------------------------------------------------------------------------
  456. void cmGlobalXCodeGenerator::WriteXCodePBXProj(std::ostream& fout,
  457. cmLocalGenerator* ,
  458. std::vector<cmLocalGenerator*>&
  459. )
  460. {
  461. fout << "// !$*UTF8*$!\n";
  462. fout << "{\n";
  463. cmXCodeObject::Indent(1, fout);
  464. fout << "archiveVersion = 1;\n";
  465. cmXCodeObject::Indent(1, fout);
  466. fout << "classes = {\n";
  467. cmXCodeObject::Indent(1, fout);
  468. fout << "};\n";
  469. cmXCodeObject::Indent(1, fout);
  470. fout << "objectVersion = 39;\n";
  471. cmXCodeObject::PrintList(m_XCodeObjects, fout);
  472. cmXCodeObject::Indent(1, fout);
  473. fout << "rootObject = " << m_RootObject->GetId() << ";\n";
  474. fout << "}\n";
  475. }
  476. //----------------------------------------------------------------------------
  477. void cmGlobalXCodeGenerator::GetDocumentation(cmDocumentationEntry& entry) const
  478. {
  479. entry.name = this->GetName();
  480. entry.brief = "NOT YET WORKING, Will generates XCode project files.";
  481. entry.full = "";
  482. }