cmLocalCodeWarriorGenerator.cxx 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414
  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 "cmGlobalCodeWarriorGenerator.h"
  14. #include "cmLocalCodeWarriorGenerator.h"
  15. #include "cmMakefile.h"
  16. #include "cmSystemTools.h"
  17. #include "cmSourceFile.h"
  18. #include "cmCacheManager.h"
  19. cmLocalCodeWarriorGenerator::cmLocalCodeWarriorGenerator()
  20. {
  21. }
  22. cmLocalCodeWarriorGenerator::~cmLocalCodeWarriorGenerator()
  23. {
  24. }
  25. void cmLocalCodeWarriorGenerator::Generate(bool /* fromTheTop */)
  26. {
  27. }
  28. void cmLocalCodeWarriorGenerator::WriteTargets(std::ostream& fout)
  29. {
  30. cmTargets &tgts = m_Makefile->GetTargets();
  31. for(cmTargets::iterator l = tgts.begin();
  32. l != tgts.end(); l++)
  33. {
  34. this->WriteTarget(fout,l->first.c_str(),&(l->second));
  35. }
  36. }
  37. void cmLocalCodeWarriorGenerator::WriteTarget(std::ostream& fout,
  38. const char *tgtName,
  39. cmTarget const *l)
  40. {
  41. fout << "<TARGET>\n";
  42. fout << "<NAME>" << tgtName << "</NAME>\n";
  43. this->WriteSettingList(fout, tgtName,l);
  44. this->WriteFileList(fout, tgtName,l);
  45. this->WriteLinkOrder(fout, tgtName, l);
  46. // this->WriteSubTargetList(fout,l);
  47. fout << "</TARGET>\n";
  48. }
  49. void cmLocalCodeWarriorGenerator::AddFileMapping(std::ostream& fout,
  50. const char *ftype,
  51. const char *ext,
  52. const char *comp,
  53. const char *edit,
  54. bool precomp,
  55. bool launch,
  56. bool res,
  57. bool ignored)
  58. {
  59. fout << "<SETTING>\n";
  60. fout << "<SETTING><NAME>FileType</NAME><VALUE>" << ftype <<
  61. "</VALUE></SETTING>\n";
  62. fout << "<SETTING><NAME>FileExtension</NAME><VALUE>" << ext <<
  63. "</VALUE></SETTING>\n";
  64. fout << "<SETTING><NAME>Compiler</NAME><VALUE>" << comp <<
  65. "</VALUE></SETTING>\n";
  66. fout << "<SETTING><NAME>EditLanguage</NAME><VALUE>" << edit <<
  67. "</VALUE></SETTING>\n";
  68. fout << "<SETTING><NAME>Precompile</NAME><VALUE>"
  69. << (precomp ? "true" : "false") << "</VALUE></SETTING>\n";
  70. fout << "<SETTING><NAME>Launchable</NAME><VALUE>"
  71. << (launch ? "true" : "false") << "</VALUE></SETTING>\n";
  72. fout << "<SETTING><NAME>ResourceFile</NAME><VALUE>"
  73. << (res ? "true" : "false") << "</VALUE></SETTING>\n";
  74. fout << "<SETTING><NAME>IgnoredByMake</NAME><VALUE>"
  75. << (ignored ? "true" : "false") << "</VALUE></SETTING>\n";
  76. fout << "</SETTING>\n";
  77. }
  78. void cmLocalCodeWarriorGenerator::WriteSettingList(std::ostream& fout,
  79. const char *tgtName,
  80. cmTarget const *l)
  81. {
  82. fout << "<SETTINGLIST>\n";
  83. fout << "<SETTING><NAME>UserSourceTrees</NAME><VALUE></VALUE></SETTING>\n";
  84. fout << "<SETTING><NAME>AlwaysSearchUserPaths</NAME><VALUE>false</VALUE></SETTING>\n";
  85. fout << "<SETTING><NAME>InterpretDOSAndUnixPaths</NAME><VALUE>false</VALUE></SETTING>\n";
  86. fout << "<SETTING><NAME>RequireFrameworkStyleIncludes</NAME><VALUE>false</VALUE></SETTING>\n";
  87. // list the include paths
  88. fout << "<SETTING><NAME>UserSearchPaths</NAME>\n";
  89. std::vector<std::string>& includes = m_Makefile->GetIncludeDirectories();
  90. std::vector<std::string>::iterator i = includes.begin();
  91. for(;i != includes.end(); ++i)
  92. {
  93. fout << "<SETTING>\n";
  94. fout << "<SETTING><NAME>SearchPath</NAME>\n";
  95. fout << "<SETTING><NAME>Path</NAME><VALUE>" << i->c_str() << "</VALUE></SETTING>\n";
  96. fout << "<SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>\n";
  97. fout << "<SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>\n";
  98. fout << "</SETTING>\n";
  99. fout << "<SETTING><NAME>Recursive</NAME><VALUE>false</VALUE></SETTING>\n";
  100. fout << "<SETTING><NAME>FrameworkPath</NAME><VALUE>false</VALUE></SETTING>\n";
  101. fout << "<SETTING><NAME>HostFlags</NAME><VALUE>All</VALUE></SETTING>\n";
  102. fout << "</SETTING>\n";
  103. }
  104. fout << "</SETTING>\n";
  105. fout << "<SETTING><NAME>SystemSearchPaths</NAME>\n";
  106. fout << "<SETTING>\n";
  107. fout << "<SETTING><NAME>SearchPath</NAME>\n";
  108. fout << "<SETTING><NAME>Path</NAME><VALUE>:MSL:</VALUE></SETTING>\n";
  109. fout << "<SETTING><NAME>PathFormat</NAME><VALUE>MacOS</VALUE></SETTING>\n";
  110. fout << "<SETTING><NAME>PathRoot</NAME><VALUE>CodeWarrior</VALUE></SETTING>\n";
  111. fout << "</SETTING>\n";
  112. fout << "<SETTING><NAME>Recursive</NAME><VALUE>true</VALUE></SETTING>\n";
  113. fout << "<SETTING><NAME>FrameworkPath</NAME><VALUE>false</VALUE></SETTING>\n";
  114. fout << "<SETTING><NAME>HostFlags</NAME><VALUE>All</VALUE></SETTING>\n";
  115. fout << "</SETTING>\n";
  116. fout << "<SETTING>\n";
  117. fout << "<SETTING><NAME>SearchPath</NAME>\n";
  118. fout << "<SETTING><NAME>Path</NAME><VALUE>:MacOS Support:</VALUE></SETTING>\n";
  119. fout << "<SETTING><NAME>PathFormat</NAME><VALUE>MacOS</VALUE></SETTING>\n";
  120. fout << "<SETTING><NAME>PathRoot</NAME><VALUE>CodeWarrior</VALUE></SETTING>\n";
  121. fout << "</SETTING>\n";
  122. fout << "<SETTING><NAME>Recursive</NAME><VALUE>true</VALUE></SETTING>\n";
  123. fout << "<SETTING><NAME>FrameworkPath</NAME><VALUE>false</VALUE></SETTING>\n";
  124. fout << "<SETTING><NAME>HostFlags</NAME><VALUE>All</VALUE></SETTING>\n";
  125. fout << "</SETTING>\n";
  126. fout << "</SETTING>\n";
  127. fout << "<SETTING><NAME>MWRuntimeSettings_WorkingDirectory</NAME><VALUE></VALUE></SETTING>\n";
  128. fout << "<SETTING><NAME>MWRuntimeSettings_CommandLine</NAME><VALUE></VALUE></SETTING>\n";
  129. fout << "<SETTING><NAME>MWRuntimeSettings_HostApplication</NAME>\n";
  130. fout << "<SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>\n";
  131. fout << "<SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>\n";
  132. fout << "<SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>\n";
  133. fout << "</SETTING>\n";
  134. fout << "<SETTING><NAME>MWRuntimeSettings_EnvVars</NAME><VALUE></VALUE></SETTING>\n";
  135. // <!-- Settings for "Target Settings" panel -->
  136. fout << "<SETTING><NAME>Linker</NAME><VALUE>MacOS PPC Linker</VALUE></SETTING>\n";
  137. fout << "<SETTING><NAME>PreLinker</NAME><VALUE></VALUE></SETTING>\n";
  138. fout << "<SETTING><NAME>PostLinker</NAME><VALUE></VALUE></SETTING>\n";
  139. fout << "<SETTING><NAME>Targetname</NAME><VALUE>" << tgtName
  140. << "</VALUE></SETTING>\n";
  141. fout << "<SETTING><NAME>OutputDirectory</NAME>\n";
  142. fout << "<SETTING><NAME>Path</NAME><VALUE>:</VALUE></SETTING>\n";
  143. fout << "<SETTING><NAME>PathFormat</NAME><VALUE>MacOS</VALUE></SETTING>\n";
  144. fout << "<SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>\n";
  145. fout << "</SETTING>\n";
  146. fout << "<SETTING><NAME>SaveEntriesUsingRelativePaths</NAME><VALUE>false</VALUE></SETTING>\n";
  147. // add the cxx file type
  148. fout << "<SETTING><NAME>FileMappings</NAME>\n";
  149. this->AddFileMapping(fout,"TEXT",".cxx","MW C/C++ PPC","C/C++",
  150. false,false,false,false);
  151. this->AddFileMapping(fout,"TEXT",".cpp","MW C/C++ PPC","C/C++",
  152. false,false,false,false);
  153. this->AddFileMapping(fout,"TEXT",".c","MW C/C++ PPC","C/C++",
  154. false,false,false,false);
  155. this->AddFileMapping(fout,"TEXT",".cc","MW C/C++ PPC","C/C++",
  156. false,false,false,false);
  157. this->AddFileMapping(fout,"TEXT",".cp","MW C/C++ PPC","C/C++",
  158. false,false,false,false);
  159. this->AddFileMapping(fout,"TEXT",".cpp","MW C/C++ PPC","C/C++",
  160. false,false,false,false);
  161. this->AddFileMapping(fout,"TEXT",".h","MW C/C++ PPC","C/C++",
  162. false,false,false,true);
  163. this->AddFileMapping(fout,"TEXT",".hpp","MW C/C++ PPC","C/C++",
  164. false,false,false,true);
  165. this->AddFileMapping(fout,"TEXT",".m","MW C/C++ PPC","C/C++",
  166. false,false,false,false);
  167. this->AddFileMapping(fout,"TEXT",".mm","MW C/C++ PPC","C/C++",
  168. false,false,false,false);
  169. fout << "</SETTING>\n";
  170. // <!-- Settings for "MacOS Merge Panel" panel -->
  171. fout << "<SETTING><NAME>MWProject_PPC_type</NAME><VALUE>";
  172. switch (l->GetType())
  173. {
  174. case cmTarget::STATIC_LIBRARY:
  175. fout << "Library" << "</VALUE></SETTING>\n";
  176. fout << "<SETTING><NAME>MWProject_PPC_outfile</NAME><VALUE>";
  177. fout << tgtName << ".lib";
  178. fout << "</VALUE></SETTING>\n";
  179. break;
  180. case cmTarget::SHARED_LIBRARY:
  181. case cmTarget::MODULE_LIBRARY:
  182. // m_Makefile->GetDefinition("CMAKE_MODULE_SUFFIX");
  183. fout << "Shared Library" << "</VALUE></SETTING>\n";
  184. fout << "<SETTING><NAME>MWProject_PPC_outfile</NAME><VALUE>";
  185. fout << tgtName << ".dylib";
  186. fout << "</VALUE></SETTING>\n";
  187. break;
  188. case cmTarget::EXECUTABLE:
  189. case cmTarget::WIN32_EXECUTABLE:
  190. fout << "Application" << "</VALUE></SETTING>\n";
  191. fout << "<SETTING><NAME>MWProject_PPC_outfile</NAME><VALUE>";
  192. fout << tgtName << cmSystemTools::GetExecutableExtension();
  193. fout << "</VALUE></SETTING>\n";
  194. break;
  195. default:;
  196. }
  197. fout << "<SETTING><NAME>MWProject_PPC_filecreator</NAME><VALUE>????" << "</VALUE></SETTING>\n";
  198. fout << "<SETTING><NAME>MWProject_PPC_filetype</NAME><VALUE>APPL</VALUE></SETTING>\n";
  199. fout << "<SETTING><NAME>MWProject_PPC_size</NAME><VALUE>384</VALUE></SETTING>\n";
  200. fout << "<SETTING><NAME>MWProject_PPC_minsize</NAME><VALUE>384</VALUE></SETTING>\n";
  201. fout << "<SETTING><NAME>MWProject_PPC_stacksize</NAME><VALUE>64</VALUE></SETTING>\n";
  202. fout << "<SETTING><NAME>MWProject_PPC_flags</NAME><VALUE>22720</VALUE></SETTING>\n";
  203. fout << "<SETTING><NAME>MWProject_PPC_symfilename</NAME><VALUE></VALUE></SETTING>\n";
  204. fout << "<SETTING><NAME>MWProject_PPC_rsrcname</NAME><VALUE></VALUE></SETTING>\n";
  205. fout << "<SETTING><NAME>MWProject_PPC_rsrcheader</NAME><VALUE>Native</VALUE></SETTING>\n";
  206. fout << "<SETTING><NAME>MWProject_PPC_rsrctype</NAME><VALUE>????" << "</VALUE></SETTING>\n";
  207. fout << "<SETTING><NAME>MWProject_PPC_rsrcid</NAME><VALUE>0</VALUE></SETTING>\n";
  208. fout << "<SETTING><NAME>MWProject_PPC_rsrcflags</NAME><VALUE>0</VALUE></SETTING>\n";
  209. fout << "<SETTING><NAME>MWProject_PPC_rsrcstore</NAME><VALUE>0</VALUE></SETTING>\n";
  210. fout << "<SETTING><NAME>MWProject_PPC_rsrcmerge</NAME><VALUE>0</VALUE></SETTING>\n";
  211. fout << "<SETTING><NAME>MWProject_PPC_flatrsrc</NAME><VALUE>0</VALUE></SETTING>\n";
  212. fout << "<SETTING><NAME>MWProject_PPC_flatrsrcoutputdir</NAME>\n";
  213. fout << "<SETTING><NAME>Path</NAME><VALUE>:</VALUE></SETTING>\n";
  214. fout << "<SETTING><NAME>PathFormat</NAME><VALUE>MacOS</VALUE></SETTING>\n";
  215. fout << "<SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>\n";
  216. fout << "</SETTING>\n";
  217. fout << "<SETTING><NAME>MWProject_PPC_flatrsrcfilename</NAME><VALUE></VALUE></SETTING>\n";
  218. /*
  219. fout << "<SETTING><NAME>MWMerge_MacOS_outputCreator</NAME><VALUE>????</VALUE></SETTING>\n";
  220. fout << "<SETTING><NAME>MWMerge_MacOS_outputType</NAME><VALUE>APPL</VALUE></SETTING>\n";
  221. fout << "<SETTING><NAME>MWMerge_MacOS_suppressWarning</NAME><VALUE>0</VALUE></SETTING>\n";
  222. fout << "<SETTING><NAME>MWMerge_MacOS_copyFragments</NAME><VALUE>1</VALUE></SETTING>\n";
  223. fout << "<SETTING><NAME>MWMerge_MacOS_copyResources</NAME><VALUE>1</VALUE></SETTING>\n";
  224. fout << "<SETTING><NAME>MWMerge_MacOS_flattenResource</NAME><VALUE>0</VALUE></SETTING>\n";
  225. fout << "<SETTING><NAME>MWMerge_MacOS_flatFileName</NAME><VALUE>a.rsrc</VALUE></SETTING>\n";
  226. fout << "<SETTING><NAME>MWMerge_MacOS_flatFileOutputPath</NAME>\n";
  227. fout << "<SETTING><NAME>Path</NAME><VALUE>:</VALUE></SETTING>\n";
  228. fout << "<SETTING><NAME>PathFormat</NAME><VALUE>MacOS</VALUE></SETTING>\n";
  229. fout << "<SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>\n";
  230. fout << "</SETTING>\n";
  231. fout << "<SETTING><NAME>MWMerge_MacOS_skipResources</NAME><VALUE></VALUE></SETTING>\n";
  232. */
  233. fout << "</SETTINGLIST>\n";
  234. }
  235. void cmLocalCodeWarriorGenerator::WriteFileList(std::ostream& fout,
  236. const char* /*tgtName*/,
  237. cmTarget const *l)
  238. {
  239. fout << "<FILELIST>\n";
  240. // for each file
  241. std::vector<cmSourceFile*> const& classes = l->GetSourceFiles();
  242. for(std::vector<cmSourceFile*>::const_iterator i = classes.begin();
  243. i != classes.end(); i++)
  244. {
  245. // Add the file to the list of sources.
  246. std::string source = (*i)->GetFullPath();
  247. fout << "<FILE>\n";
  248. fout << "<PATHTYPE>Absolute</PATHTYPE>\n";
  249. fout << "<PATHROOT>Absolute</PATHROOT>\n";
  250. //fout << "<ACCESSPATH>common</ACCESSPATH>\n";
  251. fout << "<PATH>" << source << "</PATH>\n";
  252. fout << "<PATHFORMAT>Generic</PATHFORMAT>\n";
  253. fout << "<FILEKIND>Text</FILEKIND>\n";
  254. fout << "<FILEFLAGS>Debug</FILEFLAGS>\n";
  255. fout << "</FILE>\n";
  256. }
  257. // now add in the libraries we depend on
  258. // now add in the system libs (for an executable)
  259. if (l->GetType() == cmTarget::EXECUTABLE)
  260. {
  261. fout << "<FILE>\n";
  262. fout << "<PATHTYPE>Name</PATHTYPE>\n";
  263. fout << "<PATH>MSL RuntimePPC.Lib</PATH>\n";
  264. fout << "<PATHFORMAT>MacOS</PATHFORMAT>\n";
  265. fout << "<FILEKIND>Library</FILEKIND>\n";
  266. fout << "<FILEFLAGS>Debug</FILEFLAGS>\n";
  267. fout << "</FILE>\n";
  268. }
  269. fout << "</FILELIST>\n";
  270. }
  271. void cmLocalCodeWarriorGenerator::WriteLinkOrder(std::ostream& fout,
  272. const char* /*tgtName*/,
  273. cmTarget const *l)
  274. {
  275. fout << "<LINKORDER>\n";
  276. // for each file
  277. std::vector<cmSourceFile*> const& classes = l->GetSourceFiles();
  278. for(std::vector<cmSourceFile*>::const_iterator i = classes.begin();
  279. i != classes.end(); i++)
  280. {
  281. // Add the file to the list of sources.
  282. std::string source = (*i)->GetFullPath();
  283. fout << "<FILEREF>\n";
  284. fout << "<PATHTYPE>Absolute</PATHTYPE>\n";
  285. fout << "<PATHROOT>Absolute</PATHROOT>\n";
  286. //fout << "<ACCESSPATH>common</ACCESSPATH>\n";
  287. fout << "<PATH>" << source << "</PATH>\n";
  288. fout << "<PATHFORMAT>Generic</PATHFORMAT>\n";
  289. fout << "</FILEREF>\n";
  290. }
  291. // now add in the system libs (for an executable)
  292. if (l->GetType() == cmTarget::EXECUTABLE)
  293. {
  294. fout << "<FILEREF>\n";
  295. fout << "<PATHTYPE>Name</PATHTYPE>\n";
  296. fout << "<PATH>MSL RuntimePPC.Lib</PATH>\n";
  297. fout << "<PATHFORMAT>MacOS</PATHFORMAT>\n";
  298. fout << "</FILEREF>\n";
  299. }
  300. fout << "</LINKORDER>\n";
  301. }
  302. void cmLocalCodeWarriorGenerator::WriteGroups(std::ostream& fout)
  303. {
  304. cmTargets &tgts = m_Makefile->GetTargets();
  305. for(cmTargets::iterator l = tgts.begin();
  306. l != tgts.end(); l++)
  307. {
  308. this->WriteGroup(fout,l->first.c_str(),&(l->second));
  309. }
  310. }
  311. void cmLocalCodeWarriorGenerator::WriteGroup(std::ostream& fout,
  312. const char *tgtName,
  313. cmTarget const *l)
  314. {
  315. fout << "<GROUP><NAME>" << tgtName << "</NAME>\n";
  316. // for each file
  317. std::vector<cmSourceFile*> const& classes = l->GetSourceFiles();
  318. for(std::vector<cmSourceFile*>::const_iterator i = classes.begin();
  319. i != classes.end(); i++)
  320. {
  321. std::string source = (*i)->GetFullPath();
  322. fout << "<FILEREF>\n";
  323. fout << "<TARGETNAME>" << tgtName << "</TARGETNAME>\n";
  324. fout << "<PATHTYPE>Absolute</PATHTYPE>\n";
  325. fout << "<PATHROOT>Absolute</PATHROOT>\n";
  326. fout << "<PATH>" << source << "</PATH>\n";
  327. fout << "<PATHFORMAT>Generic</PATHFORMAT>\n";
  328. fout << "</FILEREF>\n";
  329. }
  330. // write out the libraries groups
  331. /*
  332. <FILEREF>
  333. <TARGETNAME>Classic Release</TARGETNAME>
  334. <PATHTYPE>Name</PATHTYPE>
  335. <PATH>console.stubs.c</PATH>
  336. <PATHFORMAT>MacOS</PATHFORMAT>
  337. </FILEREF>
  338. */
  339. if (l->GetType() == cmTarget::EXECUTABLE)
  340. {
  341. fout << "<FILEREF>\n";
  342. fout << "<TARGETNAME>" << tgtName << "</TARGETNAME>\n";
  343. fout << "<PATHTYPE>Name</PATHTYPE>\n";
  344. fout << "<PATH>MSL RuntimePPC.Lib</PATH>\n";
  345. fout << "<PATHFORMAT>MacOS</PATHFORMAT>\n";
  346. fout << "</FILEREF>\n";
  347. }
  348. /*
  349. <FILEREF>
  350. <TARGETNAME>Classic Release</TARGETNAME>
  351. <PATHTYPE>Name</PATHTYPE>
  352. <PATH>MSL C++.PPC.Lib</PATH>
  353. <PATHFORMAT>MacOS</PATHFORMAT>
  354. </FILEREF>
  355. <FILEREF>
  356. <TARGETNAME>Classic Release</TARGETNAME>
  357. <PATHTYPE>Name</PATHTYPE>
  358. <PATH>MSL C.PPC.Lib</PATH>
  359. <PATHFORMAT>MacOS</PATHFORMAT>
  360. </FILEREF>
  361. <FILEREF>
  362. <TARGETNAME>Carbon Debug</TARGETNAME>
  363. <PATHTYPE>Name</PATHTYPE>
  364. <PATH>MSL C.CARBON.Lib</PATH>
  365. <PATHFORMAT>MacOS</PATHFORMAT>
  366. </FILEREF>
  367. */
  368. fout << "</GROUP>\n";
  369. }