cmLocalCodeWarriorGenerator.cxx 43 KB

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