cmLocalCodeWarriorGenerator.cxx 43 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026
  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. #include "cmake.h"
  20. #include <cmsys/RegularExpression.hxx>
  21. cmLocalCodeWarriorGenerator::cmLocalCodeWarriorGenerator()
  22. {
  23. }
  24. cmLocalCodeWarriorGenerator::~cmLocalCodeWarriorGenerator()
  25. {
  26. }
  27. void cmLocalCodeWarriorGenerator::Generate(bool /* fromTheTop */)
  28. {
  29. }
  30. void cmLocalCodeWarriorGenerator::WriteTargets(std::ostream& fout)
  31. {
  32. // collect up the output names
  33. // we do this here so any dependencies between targets will work,
  34. // even if they are forward declared in the previous targets
  35. cmTargets &tgts = m_Makefile->GetTargets();
  36. for(cmTargets::iterator l = tgts.begin();
  37. l != tgts.end(); l++)
  38. {
  39. std::string targetOutputName = l->first;
  40. switch (l->second.GetType())
  41. {
  42. case cmTarget::STATIC_LIBRARY:
  43. targetOutputName += ".lib";
  44. break;
  45. case cmTarget::SHARED_LIBRARY:
  46. case cmTarget::MODULE_LIBRARY:
  47. targetOutputName += ".dylib";
  48. break;
  49. case cmTarget::EXECUTABLE:
  50. targetOutputName += cmSystemTools::GetExecutableExtension();
  51. break;
  52. default:;
  53. }
  54. m_TargetOutputFiles[l->first] = targetOutputName;
  55. }
  56. // write out the individual targets
  57. for(cmTargets::iterator l = tgts.begin();
  58. l != tgts.end(); l++)
  59. {
  60. this->WriteTarget(fout,l->first.c_str(),&(l->second));
  61. }
  62. }
  63. void cmLocalCodeWarriorGenerator::WriteTarget(std::ostream& fout,
  64. const char *tgtName,
  65. cmTarget const *l)
  66. {
  67. fout << "<TARGET>\n";
  68. fout << "<NAME>" << tgtName << "</NAME>\n";
  69. this->WriteSettingList(fout, tgtName,l);
  70. this->WriteFileList(fout, tgtName,l);
  71. this->WriteLinkOrder(fout, tgtName, l);
  72. // this->WriteSubTargetList(fout,l);
  73. fout << "</TARGET>\n";
  74. }
  75. void cmLocalCodeWarriorGenerator::AddFileMapping(std::ostream& fout,
  76. const char *ftype,
  77. const char *ext,
  78. const char *comp,
  79. const char *edit,
  80. bool precomp,
  81. bool launch,
  82. bool res,
  83. bool ignored)
  84. {
  85. fout << "<SETTING>\n";
  86. if( strlen( ftype ) > 0 )
  87. {
  88. fout << "<SETTING><NAME>FileType</NAME><VALUE>" << ftype <<
  89. "</VALUE></SETTING>\n";
  90. }
  91. fout << "<SETTING><NAME>FileExtension</NAME><VALUE>" << ext <<
  92. "</VALUE></SETTING>\n";
  93. fout << "<SETTING><NAME>Compiler</NAME><VALUE>" << comp <<
  94. "</VALUE></SETTING>\n";
  95. fout << "<SETTING><NAME>EditLanguage</NAME><VALUE>" << edit <<
  96. "</VALUE></SETTING>\n";
  97. fout << "<SETTING><NAME>Precompile</NAME><VALUE>"
  98. << (precomp ? "true" : "false") << "</VALUE></SETTING>\n";
  99. fout << "<SETTING><NAME>Launchable</NAME><VALUE>"
  100. << (launch ? "true" : "false") << "</VALUE></SETTING>\n";
  101. fout << "<SETTING><NAME>ResourceFile</NAME><VALUE>"
  102. << (res ? "true" : "false") << "</VALUE></SETTING>\n";
  103. fout << "<SETTING><NAME>IgnoredByMake</NAME><VALUE>"
  104. << (ignored ? "true" : "false") << "</VALUE></SETTING>\n";
  105. fout << "</SETTING>\n";
  106. }
  107. void cmLocalCodeWarriorGenerator::WriteSettingList(std::ostream& fout,
  108. const char *tgtName,
  109. cmTarget const *l)
  110. {
  111. fout << "<SETTINGLIST>\n";
  112. fout << "<SETTING><NAME>UserSourceTrees</NAME><VALUE></VALUE></SETTING>\n";
  113. fout << "<SETTING><NAME>AlwaysSearchUserPaths</NAME><VALUE>false</VALUE></SETTING>\n";
  114. fout << "<SETTING><NAME>InterpretDOSAndUnixPaths</NAME><VALUE>false</VALUE></SETTING>\n";
  115. fout << "<SETTING><NAME>RequireFrameworkStyleIncludes</NAME><VALUE>false</VALUE></SETTING>\n";
  116. fout << "<SETTING><NAME>UserSearchPaths</NAME>\n";
  117. // project relative path
  118. fout << "<SETTING>\n";
  119. fout << "<SETTING><NAME>SearchPath</NAME>\n";
  120. fout << "<SETTING><NAME>Path</NAME><VALUE>:</VALUE></SETTING>\n";
  121. fout << "<SETTING><NAME>PathFormat</NAME><VALUE>MacOS</VALUE></SETTING>\n";
  122. fout << "<SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>\n";
  123. fout << "</SETTING>\n";
  124. fout << "<SETTING><NAME>Recursive</NAME><VALUE>true</VALUE></SETTING>\n";
  125. fout << "<SETTING><NAME>FrameworkPath</NAME><VALUE>false</VALUE></SETTING>\n";
  126. fout << "<SETTING><NAME>HostFlags</NAME><VALUE>All</VALUE></SETTING>\n";
  127. fout << "</SETTING>\n";
  128. // list the include paths
  129. /* std::vector<std::string>& includes = l->GetIncludeDirectories();
  130. std::vector<std::string>::iterator i = includes.begin();
  131. for(;i != includes.end(); ++i)
  132. {
  133. fout << "<SETTING>\n";
  134. fout << "<SETTING><NAME>SearchPath</NAME>\n";
  135. fout << "<SETTING><NAME>Path</NAME><VALUE>" << i->c_str() << "</VALUE></SETTING>\n";
  136. fout << "<SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>\n";
  137. fout << "<SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>\n";
  138. fout << "</SETTING>\n";
  139. fout << "<SETTING><NAME>Recursive</NAME><VALUE>false</VALUE></SETTING>\n";
  140. fout << "<SETTING><NAME>FrameworkPath</NAME><VALUE>false</VALUE></SETTING>\n";
  141. fout << "<SETTING><NAME>HostFlags</NAME><VALUE>All</VALUE></SETTING>\n";
  142. fout << "</SETTING>\n";
  143. }*/
  144. // library paths
  145. // now add in the libraries we depend on
  146. cmsys::RegularExpression isAframework("[ \t]*\\-framework");
  147. cmsys::RegularExpression isEnvironment("\\${");
  148. cmsys::RegularExpression isUNIX("[ \t]*\\-l([^ \t]+)");
  149. const cmTarget::LinkLibraries& libs = l->GetLinkLibraries();
  150. cmTarget::LinkLibraries::const_iterator lib = libs.begin();
  151. for(; lib != libs.end(); ++lib)
  152. {
  153. // no frameworks!
  154. if( isAframework.find( lib->first.c_str() ) ) continue;
  155. // no environment variables!
  156. if( isEnvironment.find( lib->first.c_str() ) ) continue;
  157. std::string libPath = lib->first + "_CMAKE_PATH";
  158. // is this lib part of this project? Look in the cache
  159. const char* cacheValue
  160. = GetGlobalGenerator()->GetCMakeInstance()
  161. ->GetCacheDefinition(libPath.c_str());
  162. if( cacheValue && *cacheValue )
  163. {
  164. // just tack it on
  165. fout << "<SETTING>\n";
  166. fout << "<SETTING><NAME>SearchPath</NAME>\n";
  167. fout << "<SETTING><NAME>Path</NAME><VALUE>" << cacheValue << "</VALUE></SETTING>\n";
  168. fout << "<SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>\n";
  169. fout << "<SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>\n";
  170. fout << "</SETTING>\n";
  171. fout << "<SETTING><NAME>Recursive</NAME><VALUE>false</VALUE></SETTING>\n";
  172. fout << "<SETTING><NAME>FrameworkPath</NAME><VALUE>false</VALUE></SETTING>\n";
  173. fout << "<SETTING><NAME>HostFlags</NAME><VALUE>All</VALUE></SETTING>\n";
  174. fout << "</SETTING>\n";
  175. }
  176. }
  177. const std::vector<std::string>& links = l->GetLinkDirectories();
  178. std::vector<std::string>::const_iterator j = links.begin();
  179. for(;j != links.end(); ++j)
  180. {
  181. fout << "<SETTING>\n";
  182. fout << "<SETTING><NAME>SearchPath</NAME>\n";
  183. fout << "<SETTING><NAME>Path</NAME><VALUE>" << j->c_str() << "</VALUE></SETTING>\n";
  184. fout << "<SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>\n";
  185. fout << "<SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>\n";
  186. fout << "</SETTING>\n";
  187. fout << "<SETTING><NAME>Recursive</NAME><VALUE>false</VALUE></SETTING>\n";
  188. fout << "<SETTING><NAME>FrameworkPath</NAME><VALUE>false</VALUE></SETTING>\n";
  189. fout << "<SETTING><NAME>HostFlags</NAME><VALUE>All</VALUE></SETTING>\n";
  190. fout << "</SETTING>\n";
  191. }
  192. fout << "</SETTING>\n";
  193. // system include and library paths
  194. fout << "<SETTING><NAME>SystemSearchPaths</NAME>\n";
  195. fout << "<SETTING>\n";
  196. fout << "<SETTING><NAME>SearchPath</NAME>\n";
  197. fout << "<SETTING><NAME>Path</NAME><VALUE>:MSL:</VALUE></SETTING>\n";
  198. fout << "<SETTING><NAME>PathFormat</NAME><VALUE>MacOS</VALUE></SETTING>\n";
  199. fout << "<SETTING><NAME>PathRoot</NAME><VALUE>CodeWarrior</VALUE></SETTING>\n";
  200. fout << "</SETTING>\n";
  201. fout << "<SETTING><NAME>Recursive</NAME><VALUE>true</VALUE></SETTING>\n";
  202. fout << "<SETTING><NAME>FrameworkPath</NAME><VALUE>false</VALUE></SETTING>\n";
  203. fout << "<SETTING><NAME>HostFlags</NAME><VALUE>All</VALUE></SETTING>\n";
  204. fout << "</SETTING>\n";
  205. fout << "<SETTING>\n";
  206. fout << "<SETTING><NAME>SearchPath</NAME>\n";
  207. fout << "<SETTING><NAME>Path</NAME><VALUE>:MacOS X Support:</VALUE></SETTING>\n";
  208. fout << "<SETTING><NAME>PathFormat</NAME><VALUE>MacOS</VALUE></SETTING>\n";
  209. fout << "<SETTING><NAME>PathRoot</NAME><VALUE>CodeWarrior</VALUE></SETTING>\n";
  210. fout << "</SETTING>\n";
  211. fout << "<SETTING><NAME>Recursive</NAME><VALUE>true</VALUE></SETTING>\n";
  212. fout << "<SETTING><NAME>FrameworkPath</NAME><VALUE>false</VALUE></SETTING>\n";
  213. fout << "<SETTING><NAME>HostFlags</NAME><VALUE>All</VALUE></SETTING>\n";
  214. fout << "</SETTING>\n";
  215. fout << "<SETTING>\n";
  216. fout << "<SETTING><NAME>SearchPath</NAME>\n";
  217. fout << "<SETTING><NAME>Path</NAME><VALUE>:usr:include:</VALUE></SETTING>\n";
  218. fout << "<SETTING><NAME>PathFormat</NAME><VALUE>MacOS</VALUE></SETTING>\n";
  219. fout << "<SETTING><NAME>PathRoot</NAME><VALUE>OS X Volume</VALUE></SETTING>\n";
  220. fout << "</SETTING>\n";
  221. fout << "<SETTING><NAME>Recursive</NAME><VALUE>false</VALUE></SETTING>\n";
  222. fout << "<SETTING><NAME>FrameworkPath</NAME><VALUE>false</VALUE></SETTING>\n";
  223. fout << "<SETTING><NAME>HostFlags</NAME><VALUE>All</VALUE></SETTING>\n";
  224. fout << "</SETTING>\n";
  225. fout << "<SETTING>\n";
  226. fout << "<SETTING><NAME>SearchPath</NAME>\n";
  227. fout << "<SETTING><NAME>Path</NAME><VALUE>:usr:lib:</VALUE></SETTING>\n";
  228. fout << "<SETTING><NAME>PathFormat</NAME><VALUE>MacOS</VALUE></SETTING>\n";
  229. fout << "<SETTING><NAME>PathRoot</NAME><VALUE>OS X Volume</VALUE></SETTING>\n";
  230. fout << "</SETTING>\n";
  231. fout << "<SETTING><NAME>Recursive</NAME><VALUE>false</VALUE></SETTING>\n";
  232. fout << "<SETTING><NAME>FrameworkPath</NAME><VALUE>false</VALUE></SETTING>\n";
  233. fout << "<SETTING><NAME>HostFlags</NAME><VALUE>All</VALUE></SETTING>\n";
  234. fout << "</SETTING>\n";
  235. fout << "<SETTING>\n";
  236. fout << "<SETTING><NAME>SearchPath</NAME>\n";
  237. fout << "<SETTING><NAME>Path</NAME><VALUE>:System:Library:Frameworks:</VALUE></SETTING>\n";
  238. fout << "<SETTING><NAME>PathFormat</NAME><VALUE>MacOS</VALUE></SETTING>\n";
  239. fout << "<SETTING><NAME>PathRoot</NAME><VALUE>OS X Volume</VALUE></SETTING>\n";
  240. fout << "</SETTING>\n";
  241. fout << "<SETTING><NAME>Recursive</NAME><VALUE>false</VALUE></SETTING>\n";
  242. fout << "<SETTING><NAME>FrameworkPath</NAME><VALUE>true</VALUE></SETTING>\n";
  243. fout << "<SETTING><NAME>HostFlags</NAME><VALUE>All</VALUE></SETTING>\n";
  244. fout << "</SETTING>\n";
  245. fout << "<SETTING>\n";
  246. fout << "<SETTING><NAME>SearchPath</NAME>\n";
  247. fout << "<SETTING><NAME>Path</NAME><VALUE>:Library:Frameworks:</VALUE></SETTING>\n";
  248. fout << "<SETTING><NAME>PathFormat</NAME><VALUE>MacOS</VALUE></SETTING>\n";
  249. fout << "<SETTING><NAME>PathRoot</NAME><VALUE>OS X Volume</VALUE></SETTING>\n";
  250. fout << "</SETTING>\n";
  251. fout << "<SETTING><NAME>Recursive</NAME><VALUE>false</VALUE></SETTING>\n";
  252. fout << "<SETTING><NAME>FrameworkPath</NAME><VALUE>true</VALUE></SETTING>\n";
  253. fout << "<SETTING><NAME>HostFlags</NAME><VALUE>All</VALUE></SETTING>\n";
  254. fout << "</SETTING>\n";
  255. fout << "</SETTING>\n";
  256. fout << "<SETTING><NAME>MWRuntimeSettings_WorkingDirectory</NAME><VALUE></VALUE></SETTING>\n";
  257. fout << "<SETTING><NAME>MWRuntimeSettings_CommandLine</NAME><VALUE></VALUE></SETTING>\n";
  258. fout << "<SETTING><NAME>MWRuntimeSettings_HostApplication</NAME>\n";
  259. fout << "<SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>\n";
  260. fout << "<SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>\n";
  261. fout << "<SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>\n";
  262. fout << "</SETTING>\n";
  263. fout << "<SETTING><NAME>MWRuntimeSettings_EnvVars</NAME><VALUE></VALUE></SETTING>\n";
  264. // <!-- Settings for "Target Settings" panel -->
  265. if( l->GetType() == cmTarget::SHARED_LIBRARY ||
  266. l->GetType() == cmTarget::MODULE_LIBRARY )
  267. {
  268. fout << "<SETTING><NAME>Linker</NAME><VALUE>Mach-O PPC Linker</VALUE></SETTING>\n";
  269. }
  270. else
  271. {
  272. fout << "<SETTING><NAME>Linker</NAME><VALUE>MacOS X PPC Linker</VALUE></SETTING>\n";
  273. }
  274. fout << "<SETTING><NAME>PreLinker</NAME><VALUE></VALUE></SETTING>\n";
  275. fout << "<SETTING><NAME>PostLinker</NAME><VALUE></VALUE></SETTING>\n";
  276. fout << "<SETTING><NAME>Targetname</NAME><VALUE>" << tgtName
  277. << "</VALUE></SETTING>\n";
  278. fout << "<SETTING><NAME>OutputDirectory</NAME>\n";
  279. fout << "<SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>\n";
  280. fout << "<SETTING><NAME>PathFormat</NAME><VALUE>Unix</VALUE></SETTING>\n";
  281. fout << "<SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>\n";
  282. fout << "</SETTING>\n";
  283. fout << "<SETTING><NAME>SaveEntriesUsingRelativePaths</NAME><VALUE>false</VALUE></SETTING>\n";
  284. // add the cxx file type, and others
  285. fout << "<SETTING><NAME>FileMappings</NAME>\n";
  286. if( l->GetType() == cmTarget::SHARED_LIBRARY ||
  287. l->GetType() == cmTarget::MODULE_LIBRARY )
  288. {
  289. this->AddFileMapping(fout,"TEXT",".cxx","MW C/C++ MachPPC","C/C++",
  290. false,false,false,false);
  291. this->AddFileMapping(fout,"TEXT",".cpp","MW C/C++ MachPPC","C/C++",
  292. false,false,false,false);
  293. this->AddFileMapping(fout,"TEXT",".c","MW C/C++ MachPPC","C/C++",
  294. false,false,false,false);
  295. this->AddFileMapping(fout,"TEXT",".cc","MW C/C++ MachPPC","C/C++",
  296. false,false,false,false);
  297. this->AddFileMapping(fout,"TEXT",".cp","MW C/C++ MachPPC","C/C++",
  298. false,false,false,false);
  299. this->AddFileMapping(fout,"TEXT",".cpp","MW C/C++ MachPPC","C/C++",
  300. false,false,false,false);
  301. this->AddFileMapping(fout,"TEXT",".h","MW C/C++ MachPPC","C/C++",
  302. false,false,false,true);
  303. this->AddFileMapping(fout,"TEXT",".hpp","MW C/C++ MachPPC","C/C++",
  304. false,false,false,true);
  305. this->AddFileMapping(fout,"TEXT",".m","MW C/C++ MachPPC","C/C++",
  306. false,false,false,false);
  307. this->AddFileMapping(fout,"TEXT",".mm","MW C/C++ MachPPC","C/C++",
  308. false,false,false,false);
  309. }
  310. else
  311. {
  312. this->AddFileMapping(fout,"TEXT",".cxx","MW C/C++ PPC Mac OS X","C/C++",
  313. false,false,false,false);
  314. this->AddFileMapping(fout,"TEXT",".cpp","MW C/C++ PPC Mac OS X","C/C++",
  315. false,false,false,false);
  316. this->AddFileMapping(fout,"TEXT",".c","MW C/C++ PPC Mac OS X","C/C++",
  317. false,false,false,false);
  318. this->AddFileMapping(fout,"TEXT",".cc","MW C/C++ PPC Mac OS X","C/C++",
  319. false,false,false,false);
  320. this->AddFileMapping(fout,"TEXT",".cp","MW C/C++ PPC Mac OS X","C/C++",
  321. false,false,false,false);
  322. this->AddFileMapping(fout,"TEXT",".cpp","MW C/C++ PPC Mac OS X","C/C++",
  323. false,false,false,false);
  324. this->AddFileMapping(fout,"TEXT",".h","MW C/C++ PPC Mac OS X","C/C++",
  325. false,false,false,true);
  326. this->AddFileMapping(fout,"TEXT",".hpp","MW C/C++ PPC Mac OS X","C/C++",
  327. false,false,false,true);
  328. this->AddFileMapping(fout,"TEXT",".m","MW C/C++ PPC Mac OS X","C/C++",
  329. false,false,false,false);
  330. this->AddFileMapping(fout,"TEXT",".mm","MW C/C++ PPC Mac OS X","C/C++",
  331. false,false,false,false);
  332. }
  333. this->AddFileMapping(fout,"",".lib","MachO Importer","C/C++",
  334. false,false,false,false);
  335. this->AddFileMapping(fout,"",".dylib","MachO Importer","C/C++",
  336. false,false,false,false);
  337. this->AddFileMapping(fout,"",".a","MachO Importer","C/C++",
  338. false,false,false,false);
  339. this->AddFileMapping(fout,"",".o","MachO Importer","C/C++",
  340. false,false,false,false);
  341. this->AddFileMapping(fout,"MDYL","","MachO Importer","C/C++",
  342. false,false,false,false);
  343. this->AddFileMapping(fout,"MLIB","","MachO Importer","C/C++",
  344. false,false,false,false);
  345. this->AddFileMapping(fout,"MMLB","","MachO Importer","C/C++",
  346. false,false,false,false);
  347. this->AddFileMapping(fout,"MPLF","","MachO Importer","C/C++",
  348. false,false,false,false);
  349. fout << "</SETTING>\n";
  350. // <!-- Settings for "Build Extras" panel -->
  351. fout << "<SETTING><NAME>CacheModDates</NAME><VALUE>true</VALUE></SETTING>\n";
  352. fout << "<SETTING><NAME>DumpBrowserInfo</NAME><VALUE>false</VALUE></SETTING>\n";
  353. fout << "<SETTING><NAME>CacheSubprojects</NAME><VALUE>true</VALUE></SETTING>\n";
  354. fout << "<SETTING><NAME>UseThirdPartyDebugger</NAME><VALUE>false</VALUE></SETTING>\n";
  355. fout << "<SETTING><NAME>BrowserGenerator</NAME><VALUE>1</VALUE></SETTING>\n";
  356. fout << "<SETTING><NAME>DebuggerAppPath</NAME>\n";
  357. fout << "<SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>\n";
  358. fout << "<SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>\n";
  359. fout << "<SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>\n";
  360. fout << "</SETTING>\n";
  361. fout << "<SETTING><NAME>DebuggerCmdLineArgs</NAME><VALUE></VALUE></SETTING>\n";
  362. fout << "<SETTING><NAME>DebuggerWorkingDir</NAME>\n";
  363. fout << "<SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>\n";
  364. fout << "<SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>\n";
  365. fout << "<SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>\n";
  366. fout << "</SETTING>\n";
  367. fout << "<SETTING><NAME>CodeCompletionPrefixFileName</NAME>"
  368. << "<VALUE>MacHeadersMach-O.c</VALUE></SETTING>\n";
  369. fout << "<SETTING><NAME>CodeCompletionMacroFileName</NAME>"
  370. << "<VALUE>MacOSX_MSL_C++_Macros.h</VALUE></SETTING>\n";
  371. fout << "<SETTING><NAME>MWFrontEnd_C_prefixname</NAME>"
  372. << "<VALUE>MSLCarbonPrefix.h</VALUE></SETTING>";
  373. // <!-- Settings for "PPC Mac OS X Linker" panel -->
  374. fout << "<SETTING><NAME>MWLinker_MacOSX_linksym</NAME><VALUE>1</VALUE></SETTING>\n";
  375. fout << "<SETTING><NAME>MWLinker_MacOSX_symfullpath</NAME><VALUE>1</VALUE></SETTING>\n";
  376. fout << "<SETTING><NAME>MWLinker_MacOSX_nolinkwarnings</NAME><VALUE>0</VALUE></SETTING>\n";
  377. fout << "<SETTING><NAME>MWLinker_MacOSX_linkmap</NAME><VALUE>0</VALUE></SETTING>\n";
  378. fout << "<SETTING><NAME>MWLinker_MacOSX_dontdeadstripinitcode</NAME><VALUE>0</VALUE></SETTING>\n";
  379. fout << "<SETTING><NAME>MWLinker_MacOSX_permitmultdefs</NAME><VALUE>0</VALUE></SETTING>\n";
  380. fout << "<SETTING><NAME>MWLinker_MacOSX_use_objectivec_semantics</NAME><VALUE>1</VALUE></SETTING>\n";
  381. fout << "<SETTING><NAME>MWLinker_MacOSX_strip_debug_symbols</NAME><VALUE>0</VALUE></SETTING>\n";
  382. fout << "<SETTING><NAME>MWLinker_MacOSX_split_segs</NAME><VALUE>0</VALUE></SETTING>\n";
  383. fout << "<SETTING><NAME>MWLinker_MacOSX_report_msl_overloads</NAME><VALUE>0</VALUE></SETTING>\n";
  384. fout << "<SETTING><NAME>MWLinker_MacOSX_objects_follow_linkorder</NAME><VALUE>0</VALUE></SETTING>\n";
  385. fout << "<SETTING><NAME>MWLinker_MacOSX_linkmode</NAME><VALUE>Fast</VALUE></SETTING>\n";
  386. switch (l->GetType())
  387. {
  388. case cmTarget::STATIC_LIBRARY:
  389. case cmTarget::SHARED_LIBRARY:
  390. case cmTarget::MODULE_LIBRARY:
  391. fout << "<SETTING><NAME>MWLinker_MacOSX_exports</NAME><VALUE>All</VALUE></SETTING>\n";
  392. break;
  393. default:
  394. fout << "<SETTING><NAME>MWLinker_MacOSX_exports</NAME><VALUE>ReferencedGlobals</VALUE></SETTING>\n";
  395. }
  396. fout << "<SETTING><NAME>MWLinker_MacOSX_sortcode</NAME><VALUE>None</VALUE></SETTING>\n";
  397. fout << "<SETTING><NAME>MWLinker_MacOSX_mainname</NAME><VALUE>start</VALUE></SETTING>\n";
  398. // <!-- Settings for "PPC Mac OS X Project" panel -->
  399. fout << "<SETTING><NAME>MWProject_MacOSX_type</NAME><VALUE>";
  400. std::string targetOutputType;
  401. switch (l->GetType())
  402. {
  403. case cmTarget::STATIC_LIBRARY:
  404. targetOutputType = "MMLB";
  405. fout << "Library";
  406. break;
  407. case cmTarget::SHARED_LIBRARY:
  408. case cmTarget::MODULE_LIBRARY:
  409. targetOutputType = "MDYL";
  410. fout << "SharedLibrary";
  411. break;
  412. case cmTarget::EXECUTABLE:
  413. targetOutputType = "APPL";
  414. fout << "ApplicationPackage";
  415. break;
  416. default:;
  417. }
  418. fout << "</VALUE></SETTING>\n";
  419. fout << "<SETTING><NAME>MWProject_MacOSX_outfile</NAME><VALUE>";
  420. fout << m_TargetOutputFiles[std::string(tgtName)];
  421. fout << "</VALUE></SETTING>\n";
  422. fout << "<SETTING><NAME>MWProject_MacOSX_filetype</NAME><VALUE>";
  423. fout << targetOutputType << "</VALUE></SETTING>\n";
  424. fout << "<SETTING><NAME>MWProject_MacOSX_vmaddress</NAME><VALUE>0</VALUE></SETTING>\n";
  425. fout << "<SETTING><NAME>MWProject_MacOSX_usedefaultvmaddr</NAME><VALUE>1</VALUE></SETTING>\n";
  426. fout << "<SETTING><NAME>MWProject_MacOSX_flatrsrc</NAME><VALUE>1</VALUE></SETTING>\n";
  427. fout << "<SETTING><NAME>MWProject_MacOSX_flatrsrcfilename</NAME><VALUE></VALUE></SETTING>\n";
  428. fout << "<SETTING><NAME>MWProject_MacOSX_flatrsrcoutputdir</NAME>\n";
  429. fout << "<SETTING><NAME>Path</NAME><VALUE>:</VALUE></SETTING>\n";
  430. fout << "<SETTING><NAME>PathFormat</NAME><VALUE>MacOS</VALUE></SETTING>\n";
  431. fout << "<SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>\n";
  432. fout << "</SETTING>\n";
  433. fout << "<SETTING><NAME>MWProject_MacOSX_installpath</NAME><VALUE>./</VALUE></SETTING>\n";
  434. fout << "<SETTING><NAME>MWProject_MacOSX_dont_prebind</NAME><VALUE>0</VALUE></SETTING>\n";
  435. fout << "<SETTING><NAME>MWProject_MacOSX_flat_namespace</NAME><VALUE>0</VALUE></SETTING>\n";
  436. fout << "<SETTING><NAME>MWProject_MacOSX_frameworkversion</NAME><VALUE>A</VALUE></SETTING>\n";
  437. fout << "<SETTING><NAME>MWProject_MacOSX_currentversion</NAME><VALUE>0</VALUE></SETTING>\n";
  438. fout << "<SETTING><NAME>MWProject_MacOSX_flat_oldimpversion</NAME><VALUE>0</VALUE></SETTING>\n";
  439. // <!-- Settings for "PPC Mach-O Linker" panel -->
  440. fout << "<SETTING><NAME>MWLinker_MachO_exports</NAME><VALUE>All</VALUE></SETTING>\n";
  441. fout << "<SETTING><NAME>MWLinker_MachO_mainname</NAME><VALUE>start</VALUE></SETTING>\n";
  442. fout << "<SETTING><NAME>MWLinker_MachO_currentversion</NAME><VALUE>0</VALUE></SETTING>\n";
  443. fout << "<SETTING><NAME>MWLinker_MachO_compatibleversion</NAME><VALUE>0</VALUE></SETTING>\n";
  444. fout << "<SETTING><NAME>MWLinker_MachO_symfullpath</NAME><VALUE>0</VALUE></SETTING>\n";
  445. fout << "<SETTING><NAME>MWLinker_MachO_supresswarnings</NAME><VALUE>0</VALUE></SETTING>\n";
  446. fout << "<SETTING><NAME>MWLinker_MachO_multisymerror</NAME><VALUE>0</VALUE></SETTING>\n";
  447. fout << "<SETTING><NAME>MWLinker_MachO_prebind</NAME><VALUE>1</VALUE></SETTING>\n";
  448. fout << "<SETTING><NAME>MWLinker_MachO_deadstrip</NAME><VALUE>1</VALUE></SETTING>\n";
  449. fout << "<SETTING><NAME>MWLinker_MachO_objectivecsemantics</NAME><VALUE>0</VALUE></SETTING>\n";
  450. fout << "<SETTING><NAME>MWLinker_MachO_whichfileloaded</NAME><VALUE>0</VALUE></SETTING>\n";
  451. fout << "<SETTING><NAME>MWLinker_MachO_whyfileloaded</NAME><VALUE>0</VALUE></SETTING>\n";
  452. fout << "<SETTING><NAME>MWLinker_MachO_readonlyrelocs</NAME><VALUE>Errors</VALUE></SETTING>\n";
  453. fout << "<SETTING><NAME>MWLinker_MachO_undefinedsymbols</NAME><VALUE>Errors</VALUE></SETTING>\n";
  454. fout << "<SETTING><NAME>MWLinker_MachO_twolevelnamespace</NAME><VALUE>1</VALUE></SETTING>\n";
  455. fout << "<SETTING><NAME>MWLinker_MachO_stripdebugsymbols</NAME><VALUE>0</VALUE></SETTING>\n";
  456. // <!-- Settings for "PPC Mach-O Target" panel -->
  457. fout << "<SETTING><NAME>MWProject_MachO_type</NAME><VALUE>";
  458. switch (l->GetType())
  459. {
  460. case cmTarget::STATIC_LIBRARY:
  461. targetOutputType = "MMLB";
  462. fout << "Library";
  463. break;
  464. case cmTarget::SHARED_LIBRARY:
  465. case cmTarget::MODULE_LIBRARY:
  466. targetOutputType = "MDYL";
  467. fout << "SharedLibrary";
  468. break;
  469. case cmTarget::EXECUTABLE:
  470. targetOutputType = "APPL";
  471. fout << "ApplicationPackage";
  472. break;
  473. default:;
  474. }
  475. fout << "</VALUE></SETTING>\n";
  476. fout << "<SETTING><NAME>MWProject_MachO_outfile</NAME><VALUE>";
  477. fout << m_TargetOutputFiles[std::string(tgtName)];
  478. fout << "</VALUE></SETTING>\n";
  479. fout << "<SETTING><NAME>MWProject_MachO_filecreator</NAME><VALUE>????" << "</VALUE></SETTING>\n";
  480. fout << "<SETTING><NAME>MWProject_MachO_filetype</NAME><VALUE>";
  481. fout << targetOutputType;
  482. fout << "</VALUE></SETTING>\n";
  483. fout << "<SETTING><NAME>MWProject_MachO_vmaddress</NAME><VALUE>4096</VALUE></SETTING>\n";
  484. fout << "<SETTING><NAME>MWProject_MachO_flatrsrc</NAME><VALUE>0</VALUE></SETTING>\n";
  485. fout << "<SETTING><NAME>MWProject_MachO_flatrsrcfilename</NAME><VALUE></VALUE></SETTING>\n";
  486. fout << "<SETTING><NAME>MWProject_MachO_flatrsrcoutputdir</NAME>\n";
  487. fout << "<SETTING><NAME>Path</NAME><VALUE>:</VALUE></SETTING>\n";
  488. fout << "<SETTING><NAME>PathFormat</NAME><VALUE>MacOS</VALUE></SETTING>\n";
  489. fout << "<SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>\n";
  490. fout << "</SETTING>\n";
  491. fout << "<SETTING><NAME>MWProject_MachO_installpath</NAME><VALUE>./</VALUE></SETTING>\n";
  492. fout << "<SETTING><NAME>MWProject_MachO_frameworkversion</NAME><VALUE></VALUE></SETTING>\n";
  493. fout << "</SETTINGLIST>\n";
  494. }
  495. void cmLocalCodeWarriorGenerator::WriteFileList(std::ostream& fout,
  496. const char* /*tgtName*/,
  497. cmTarget const *l)
  498. {
  499. fout << "<FILELIST>\n";
  500. // for each file
  501. std::vector<cmSourceFile*> const& classes = l->GetSourceFiles();
  502. for(std::vector<cmSourceFile*>::const_iterator i = classes.begin();
  503. i != classes.end(); i++)
  504. {
  505. // Add the file to the list of sources.
  506. std::string source = (*i)->GetFullPath();
  507. fout << "<FILE>\n";
  508. fout << "<PATHTYPE>Absolute</PATHTYPE>\n";
  509. fout << "<PATHROOT>Absolute</PATHROOT>\n";
  510. //fout << "<ACCESSPATH>common</ACCESSPATH>\n";
  511. fout << "<PATH>" << source << "</PATH>\n";
  512. fout << "<PATHFORMAT>Generic</PATHFORMAT>\n";
  513. fout << "<FILEKIND>Text</FILEKIND>\n";
  514. fout << "<FILEFLAGS>Debug</FILEFLAGS>\n";
  515. fout << "</FILE>\n";
  516. }
  517. // now add in the libraries we depend on
  518. cmsys::RegularExpression isAframework("[ \t]*\\-framework");
  519. cmsys::RegularExpression isEnvironment("\\${");
  520. cmsys::RegularExpression isUNIX("[ \t]*\\-l([^ \t]+)");
  521. const cmTarget::LinkLibraries& libs = l->GetLinkLibraries();
  522. cmTarget::LinkLibraries::const_iterator lib = libs.begin();
  523. for(; lib != libs.end(); ++lib)
  524. {
  525. // no frameworks!
  526. if( isAframework.find( lib->first.c_str() ) ) continue;
  527. // no environment variables!
  528. if( isEnvironment.find( lib->first.c_str() ) ) continue;
  529. std::string libPath = lib->first + "_CMAKE_PATH";
  530. // is this lib part of this project? Look in the cache
  531. const char* cacheValue
  532. = GetGlobalGenerator()->GetCMakeInstance()
  533. ->GetCacheDefinition(libPath.c_str());
  534. if( cacheValue && *cacheValue )
  535. {
  536. // just tack it on
  537. fout << "<FILE>\n";
  538. fout << "<PATHTYPE>RootRelative</PATHTYPE>\n";
  539. fout << "<PATHROOT>Project</PATHROOT>\n";
  540. fout << "<PATH>" << m_TargetOutputFiles[lib->first] << "</PATH>\n";
  541. fout << "<PATHFORMAT>Unix</PATHFORMAT>\n";
  542. fout << "<FILEKIND>Library</FILEKIND>\n";
  543. fout << "<FILEFLAGS>Debug, TargetOutputFile</FILEFLAGS>\n";
  544. fout << "</FILE>\n";
  545. }
  546. else if( lib->first.find('/') != std::string::npos )
  547. {
  548. // it's a path-based library, so we'll include it directly by path
  549. fout << "<FILE>\n";
  550. fout << "<PATHTYPE>Absolute</PATHTYPE>\n";
  551. fout << "<PATHROOT>Absolute</PATHROOT>\n";
  552. fout << "<PATH>" << lib->first.c_str() << "</PATH>\n";
  553. fout << "<PATHFORMAT>Unix</PATHFORMAT>\n";
  554. fout << "<FILEKIND>Text</FILEKIND>\n";
  555. fout << "<FILEFLAGS>Debug</FILEFLAGS>\n";
  556. fout << "</FILE>\n";
  557. }
  558. else if( isUNIX.find( lib->first.c_str() ) )
  559. {
  560. // now we need to search the library directories for this
  561. // library name, and if we don't find it, we have to search
  562. // in the cache to see if there's a target defining that lib.
  563. // for the first search, we have to check for
  564. // [lib]<name>[.<a|lib|so|dylib|dll>]
  565. std::string libName = isUNIX.match(1);
  566. }
  567. else
  568. {
  569. // just tack it on
  570. fout << "<FILE>\n";
  571. fout << "<PATHTYPE>Name</PATHTYPE>\n";
  572. fout << "<PATH>" << lib->first.c_str() << "</PATH>\n";
  573. fout << "<PATHFORMAT>Unix</PATHFORMAT>\n";
  574. fout << "<FILEKIND>Library</FILEKIND>\n";
  575. fout << "<FILEFLAGS>Debug</FILEFLAGS>\n";
  576. fout << "</FILE>\n";
  577. }
  578. }
  579. // now add in the system libs (for an executable)
  580. if (l->GetType() == cmTarget::EXECUTABLE)
  581. {
  582. fout << "<FILE>\n";
  583. fout << "<PATHTYPE>Name</PATHTYPE>\n";
  584. fout << "<PATH>crt1.o</PATH>\n";
  585. fout << "<PATHFORMAT>MacOS</PATHFORMAT>\n";
  586. fout << "<FILEKIND>Library</FILEKIND>\n";
  587. fout << "<FILEFLAGS>Debug</FILEFLAGS>\n";
  588. fout << "</FILE>\n";
  589. fout << "<FILE>\n";
  590. fout << "<PATHTYPE>Name</PATHTYPE>\n";
  591. fout << "<PATH>MSL_All_Mach-O.lib</PATH>\n";
  592. fout << "<PATHFORMAT>Unix</PATHFORMAT>\n";
  593. fout << "<FILEKIND>Library</FILEKIND>\n";
  594. fout << "<FILEFLAGS>Debug</FILEFLAGS>\n";
  595. fout << "</FILE>\n";
  596. fout << "<FILE>\n";
  597. fout << "<PATHTYPE>Name</PATHTYPE>\n";
  598. fout << "<PATH>console_OS_X.c</PATH>\n";
  599. fout << "<PATHFORMAT>Unix</PATHFORMAT>\n";
  600. fout << "<FILEKIND>Text</FILEKIND>\n";
  601. fout << "<FILEFLAGS>Debug</FILEFLAGS>\n";
  602. fout << "</FILE>\n";
  603. }
  604. // or a dynamic library
  605. /* else if (l->GetType() == cmTarget::SHARED_LIBRARY ||
  606. l->GetType() == cmTarget::MODULE_LIBRARY)
  607. {
  608. fout << "<FILE>\n";
  609. fout << "<PATHTYPE>Name</PATHTYPE>\n";
  610. fout << "<PATH>dylib1.o</PATH>\n";
  611. fout << "<PATHFORMAT>MacOS</PATHFORMAT>\n";
  612. fout << "<FILEKIND>Library</FILEKIND>\n";
  613. fout << "<FILEFLAGS>Debug</FILEFLAGS>\n";
  614. fout << "</FILE>\n";
  615. }*/
  616. fout << "</FILELIST>\n";
  617. }
  618. void cmLocalCodeWarriorGenerator::WriteLinkOrder(std::ostream& fout,
  619. const char* tgtName,
  620. cmTarget const *l)
  621. {
  622. fout << "<LINKORDER>\n";
  623. // for each file
  624. std::vector<cmSourceFile*> const& classes = l->GetSourceFiles();
  625. for(std::vector<cmSourceFile*>::const_iterator i = classes.begin();
  626. i != classes.end(); i++)
  627. {
  628. // Add the file to the list of sources.
  629. std::string source = (*i)->GetFullPath();
  630. fout << "<FILEREF>\n";
  631. fout << "<PATHTYPE>Absolute</PATHTYPE>\n";
  632. fout << "<PATHROOT>Absolute</PATHROOT>\n";
  633. //fout << "<ACCESSPATH>common</ACCESSPATH>\n";
  634. fout << "<PATH>" << source << "</PATH>\n";
  635. fout << "<PATHFORMAT>Generic</PATHFORMAT>\n";
  636. fout << "</FILEREF>\n";
  637. }
  638. // now add in the libraries we depend on
  639. cmsys::RegularExpression isAframework("[ \t]*\\-framework");
  640. cmsys::RegularExpression isEnvironment("\\${");
  641. cmsys::RegularExpression isUNIX("[ \t]*\\-l([^ \t]+)");
  642. const cmTarget::LinkLibraries& libs = l->GetLinkLibraries();
  643. cmTarget::LinkLibraries::const_iterator lib = libs.begin();
  644. std::map<std::string, std::string> referencedTargets;
  645. for(; lib != libs.end(); ++lib)
  646. {
  647. // no frameworks!
  648. if( isAframework.find( lib->first.c_str() ) ) continue;
  649. // no environment variables!
  650. if( isEnvironment.find( lib->first.c_str() ) ) continue;
  651. std::string libPath = lib->first + "_CMAKE_PATH";
  652. // is this lib part of this project? Look in the cache
  653. const char* cacheValue
  654. = GetGlobalGenerator()->GetCMakeInstance()
  655. ->GetCacheDefinition(libPath.c_str());
  656. if( cacheValue && *cacheValue )
  657. {
  658. // just tack it on
  659. fout << "<FILEREF>\n";
  660. fout << "<PATHTYPE>RootRelative</PATHTYPE>\n";
  661. fout << "<PATHROOT>Project</PATHROOT>\n";
  662. fout << "<PATH>" << m_TargetOutputFiles[lib->first] << "</PATH>\n";
  663. fout << "<PATHFORMAT>Unix</PATHFORMAT>\n";
  664. fout << "</FILEREF>\n";
  665. referencedTargets[lib->first] = m_TargetOutputFiles[lib->first];
  666. if( m_TargetReferencingList.count(m_TargetOutputFiles[lib->first]) == 0 )
  667. {
  668. m_TargetReferencingList[m_TargetOutputFiles[lib->first]] = std::string(tgtName);
  669. }
  670. }
  671. else if( lib->first.find('/') != std::string::npos )
  672. {
  673. // it's a path-based library, so we'll include it directly by path
  674. fout << "<FILEREF>\n";
  675. fout << "<PATHTYPE>Absolute</PATHTYPE>\n";
  676. fout << "<PATHROOT>Absolute</PATHROOT>\n";
  677. fout << "<PATH>" << lib->first.c_str() << "</PATH>\n";
  678. fout << "<PATHFORMAT>Unix</PATHFORMAT>\n";
  679. fout << "</FILEREF>\n";
  680. }
  681. else if( isUNIX.find( lib->first.c_str() ) )
  682. {
  683. // now we need to search the library directories for this
  684. // library name, and if we don't find it, we have to search
  685. // in the cache to see if there's a target defining that lib.
  686. // for the first search, we have to check for
  687. // [lib]<name>[.<a|lib|so|dylib|dll>]
  688. std::string libName = isUNIX.match(1);
  689. }
  690. else
  691. {
  692. // just tack it on
  693. fout << "<FILEREF>\n";
  694. fout << "<PATHTYPE>Name</PATHTYPE>\n";
  695. fout << "<PATH>" << lib->first.c_str() << "</PATH>\n";
  696. fout << "<PATHFORMAT>Unix</PATHFORMAT>\n";
  697. fout << "</FILEREF>\n";
  698. }
  699. }
  700. // now add in the system libs (for an executable)
  701. if (l->GetType() == cmTarget::EXECUTABLE)
  702. {
  703. fout << "<FILEREF>\n";
  704. fout << "<PATHTYPE>Name</PATHTYPE>\n";
  705. fout << "<PATH>crt1.o</PATH>\n";
  706. fout << "<PATHFORMAT>MacOS</PATHFORMAT>\n";
  707. fout << "</FILEREF>\n";
  708. fout << "<FILEREF>\n";
  709. fout << "<PATHTYPE>Name</PATHTYPE>\n";
  710. fout << "<PATH>MSL_All_Mach-O.lib</PATH>\n";
  711. fout << "<PATHFORMAT>Unix</PATHFORMAT>\n";
  712. fout << "</FILEREF>\n";
  713. fout << "<FILEREF>\n";
  714. fout << "<PATHTYPE>Name</PATHTYPE>\n";
  715. fout << "<PATH>console_OS_X.c</PATH>\n";
  716. fout << "<PATHFORMAT>Unix</PATHFORMAT>\n";
  717. fout << "</FILEREF>\n";
  718. }
  719. // or a shared library
  720. /* else if (l->GetType() == cmTarget::SHARED_LIBRARY ||
  721. l->GetType() == cmTarget::MODULE_LIBRARY)
  722. {
  723. fout << "<FILEREF>\n";
  724. fout << "<PATHTYPE>Name</PATHTYPE>\n";
  725. fout << "<PATH>dylib1.o</PATH>\n";
  726. fout << "<PATHFORMAT>MacOS</PATHFORMAT>\n";
  727. fout << "</FILEREF>\n";
  728. }*/
  729. fout << "</LINKORDER>\n";
  730. if( referencedTargets.size() )
  731. {
  732. fout << "<SUBTARGETLIST>\n";
  733. // output subtarget list
  734. std::map<std::string, std::string>::const_iterator target = referencedTargets.begin();
  735. for( ; target != referencedTargets.end(); target++ )
  736. {
  737. fout << "<SUBTARGET>\n";
  738. fout << "<TARGETNAME>" << target->first << "</TARGETNAME>\n";
  739. fout << "<ATTRIBUTES>LinkAgainst</ATTRIBUTES>\n";
  740. fout << "<FILEREF>\n<PATHTYPE>RootRelative</PATHTYPE>\n"
  741. << "<PATHROOT>Project</PATHROOT>\n"
  742. << "<PATH>" << target->second << "</PATH>\n"
  743. << "<PATHFORMAT>Unix</PATHFORMAT></FILEREF>\n";
  744. fout << "</SUBTARGET>\n";
  745. }
  746. fout << "</SUBTARGETLIST>\n";
  747. }
  748. // we need at least one framework for the XML to be valid
  749. // generate framework list
  750. cmsys::RegularExpression reg("[ \t]*\\-framework[ \t]+([^ \t]+)");
  751. std::vector<std::string> frameworks;
  752. lib = libs.begin();
  753. for(; lib != libs.end(); ++lib)
  754. {
  755. if( reg.find( lib->first.c_str() ) )
  756. {
  757. frameworks.push_back( reg.match(1) );
  758. }
  759. }
  760. if( frameworks.size() > 0 || l->GetType() == cmTarget::EXECUTABLE )
  761. {
  762. fout << "<FRAMEWORKLIST>\n";
  763. std::vector<std::string>::const_iterator framework = frameworks.begin();
  764. for(; framework != frameworks.end(); ++framework)
  765. {
  766. fout << "<FRAMEWORK>\n";
  767. fout << "<FILEREF>\n";
  768. fout << "<PATHTYPE>Name</PATHTYPE>\n";
  769. fout << "<PATH>" << framework->c_str() << ".framework</PATH>\n";
  770. fout << "<PATHFORMAT>MacOS</PATHFORMAT>\n";
  771. fout << "</FILEREF>\n";
  772. // this isn't strictly always true, I believe, but Apple adheres to it
  773. fout << "<DYNAMICLIBRARY>" << framework->c_str() << "</DYNAMICLIBRARY>\n";
  774. fout << "</FRAMEWORK>\n";
  775. }
  776. // if it's an executable, it needs to link into System.framework
  777. if (l->GetType() == cmTarget::EXECUTABLE)
  778. {
  779. fout << "<FRAMEWORK>\n";
  780. fout << "<FILEREF>\n";
  781. fout << "<PATHTYPE>Name</PATHTYPE>\n";
  782. fout << "<PATH>System.framework</PATH>\n";
  783. fout << "<PATHFORMAT>MacOS</PATHFORMAT>\n";
  784. fout << "</FILEREF>\n";
  785. fout << "<DYNAMICLIBRARY>System</DYNAMICLIBRARY>\n";
  786. fout << "</FRAMEWORK>\n";
  787. }
  788. fout << "</FRAMEWORKLIST>\n";
  789. }
  790. }
  791. void cmLocalCodeWarriorGenerator::WriteGroups(std::ostream& fout)
  792. {
  793. bool hasExecutableTarget = false, hasDynamicLibTarget = false;
  794. char *firstExecutableTarget = 0, *firstDynamicLibTarget = 0;
  795. cmTargets &tgts = m_Makefile->GetTargets();
  796. for(cmTargets::iterator l = tgts.begin();
  797. l != tgts.end(); l++)
  798. {
  799. this->WriteGroup(fout,l->first.c_str(),&(l->second));
  800. if (l->second.GetType() == cmTarget::EXECUTABLE)
  801. {
  802. hasExecutableTarget = true;
  803. if (firstExecutableTarget == 0)
  804. {
  805. firstExecutableTarget = const_cast<char*>(l->first.c_str());
  806. }
  807. }
  808. else if (l->second.GetType() == cmTarget::SHARED_LIBRARY ||
  809. l->second.GetType() == cmTarget::MODULE_LIBRARY)
  810. {
  811. hasDynamicLibTarget = true;
  812. if (firstDynamicLibTarget == 0)
  813. {
  814. firstDynamicLibTarget = const_cast<char*>(l->first.c_str());
  815. }
  816. }
  817. }
  818. // write out the libraries groups
  819. if( hasExecutableTarget )
  820. {
  821. fout << "<GROUP><NAME>" << "App Support" << "</NAME>\n";
  822. fout << "<FILEREF>\n";
  823. fout << "<TARGETNAME>" << firstExecutableTarget << "</TARGETNAME>\n";
  824. fout << "<PATHTYPE>Name</PATHTYPE>\n";
  825. fout << "<PATH>crt1.o</PATH>\n";
  826. fout << "<PATHFORMAT>MacOS</PATHFORMAT>\n";
  827. fout << "</FILEREF>\n";
  828. fout << "<FILEREF>\n";
  829. fout << "<TARGETNAME>" << firstExecutableTarget << "</TARGETNAME>\n";
  830. fout << "<PATHTYPE>Name</PATHTYPE>\n";
  831. fout << "<PATH>MSL_All_Mach-O.lib</PATH>\n";
  832. fout << "<PATHFORMAT>Unix</PATHFORMAT>\n";
  833. fout << "</FILEREF>\n";
  834. fout << "<FILEREF>\n";
  835. fout << "<TARGETNAME>" << firstExecutableTarget << "</TARGETNAME>\n";
  836. fout << "<PATHTYPE>Name</PATHTYPE>\n";
  837. fout << "<PATH>console_OS_X.c</PATH>\n";
  838. fout << "<PATHFORMAT>Unix</PATHFORMAT>\n";
  839. fout << "</FILEREF>\n";
  840. fout << "</GROUP>\n";
  841. }
  842. /* if (hasDynamicLibTarget)
  843. {
  844. fout << "<GROUP><NAME>" << "dylib Support" << "</NAME>\n";
  845. fout << "<FILEREF>\n";
  846. fout << "<TARGETNAME>" << firstDynamicLibTarget << "</TARGETNAME>\n";
  847. fout << "<PATHTYPE>Name</PATHTYPE>\n";
  848. fout << "<PATH>dylib1.o</PATH>\n";
  849. fout << "<PATHFORMAT>MacOS</PATHFORMAT>\n";
  850. fout << "</FILEREF>\n";
  851. fout << "</GROUP>\n";
  852. }*/
  853. // write out the referenced targets group
  854. if( m_TargetReferencingList.size() > 0 )
  855. {
  856. fout << "<GROUP><NAME>Subtarget Files</NAME>\n";
  857. std::map<std::string, std::string>::const_iterator subtarget = m_TargetReferencingList.begin();
  858. for( ; subtarget != m_TargetReferencingList.end(); subtarget++ )
  859. {
  860. fout << "<FILEREF>\n"
  861. << "<TARGETNAME>" << subtarget->second << "</TARGETNAME>\n";
  862. fout << "<PATHTYPE>RootRelative</PATHTYPE>\n<PATHROOT>Project</PATHROOT>\n";
  863. fout << "<PATH>" << subtarget->first << "</PATH>\n";
  864. fout << "<PATHFORMAT>Unix</PATHFORMAT>\n";
  865. fout << "</FILEREF>";
  866. }
  867. fout << "</GROUP>";
  868. }
  869. }
  870. void cmLocalCodeWarriorGenerator::WriteGroup(std::ostream& fout,
  871. const char *tgtName,
  872. cmTarget const *l)
  873. {
  874. fout << "<GROUP><NAME>" << tgtName << "</NAME>\n";
  875. // for each file
  876. std::vector<cmSourceFile*> const& classes = l->GetSourceFiles();
  877. for(std::vector<cmSourceFile*>::const_iterator i = classes.begin();
  878. i != classes.end(); i++)
  879. {
  880. std::string source = (*i)->GetFullPath();
  881. fout << "<FILEREF>\n";
  882. fout << "<TARGETNAME>" << tgtName << "</TARGETNAME>\n";
  883. fout << "<PATHTYPE>Absolute</PATHTYPE>\n";
  884. fout << "<PATHROOT>Absolute</PATHROOT>\n";
  885. fout << "<PATH>" << source << "</PATH>\n";
  886. fout << "<PATHFORMAT>Generic</PATHFORMAT>\n";
  887. fout << "</FILEREF>\n";
  888. }
  889. // now add in the libraries we depend on
  890. cmsys::RegularExpression isAframework("[ \t]*\\-framework");
  891. cmsys::RegularExpression isEnvironment("\\${");
  892. cmsys::RegularExpression isUNIX("[ \t]*\\-l([^ \t]+)");
  893. const cmTarget::LinkLibraries& libs = l->GetLinkLibraries();
  894. cmTarget::LinkLibraries::const_iterator lib = libs.begin();
  895. for(; lib != libs.end(); ++lib)
  896. {
  897. // no frameworks!
  898. if( isAframework.find( lib->first.c_str() ) ) continue;
  899. // no environment variables!
  900. if( isEnvironment.find( lib->first.c_str() ) ) continue;
  901. std::string libPath = lib->first + "_CMAKE_PATH";
  902. // is this lib part of this project? Look in the cache
  903. const char* cacheValue
  904. = GetGlobalGenerator()->GetCMakeInstance()
  905. ->GetCacheDefinition(libPath.c_str());
  906. if( cacheValue && *cacheValue )
  907. {
  908. // this is a subtarget reference, it will be taken care of later
  909. continue;
  910. }
  911. else if( lib->first.find('/') != std::string::npos )
  912. {
  913. // it's a path-based library, so we'll include it directly by path
  914. fout << "<FILEREF>\n";
  915. fout << "<TARGETNAME>" << tgtName << "</TARGETNAME>\n";
  916. fout << "<PATHTYPE>Absolute</PATHTYPE>\n";
  917. fout << "<PATHROOT>Absolute</PATHROOT>\n";
  918. fout << "<PATH>" << lib->first.c_str() << "</PATH>\n";
  919. fout << "<PATHFORMAT>Unix</PATHFORMAT>\n";
  920. fout << "</FILEREF>\n";
  921. }
  922. else if( isUNIX.find( lib->first.c_str() ) )
  923. {
  924. // now we need to search the library directories for this
  925. // library name, and if we don't find it, we have to search
  926. // in the cache to see if there's a target defining that lib.
  927. // for the first search, we have to check for
  928. // [lib]<name>[.<a|lib|so|dylib|dll>]
  929. std::string libName = isUNIX.match(1);
  930. }
  931. else
  932. {
  933. // just tack it on
  934. fout << "<FILEREF>\n";
  935. fout << "<TARGETNAME>" << tgtName << "</TARGETNAME>\n";
  936. fout << "<PATHTYPE>Name</PATHTYPE>\n";
  937. fout << "<PATH>" << lib->first.c_str() << "</PATH>\n";
  938. fout << "<PATHFORMAT>Unix</PATHFORMAT>\n";
  939. fout << "</FILEREF>\n";
  940. }
  941. }
  942. fout << "</GROUP>\n";
  943. }