cmLocalCodeWarriorGenerator.cxx 43 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027
  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. cmLocalCodeWarriorGenerator::cmLocalCodeWarriorGenerator()
  21. {
  22. }
  23. cmLocalCodeWarriorGenerator::~cmLocalCodeWarriorGenerator()
  24. {
  25. }
  26. void cmLocalCodeWarriorGenerator::Generate(bool /* fromTheTop */)
  27. {
  28. }
  29. void cmLocalCodeWarriorGenerator::WriteTargets(std::ostream& fout)
  30. {
  31. // collect up the output names
  32. // we do this here so any dependencies between targets will work,
  33. // even if they are forward declared in the previous targets
  34. cmTargets &tgts = m_Makefile->GetTargets();
  35. for(cmTargets::iterator l = tgts.begin();
  36. l != tgts.end(); l++)
  37. {
  38. std::string targetOutputName = l->first;
  39. switch (l->second.GetType())
  40. {
  41. case cmTarget::STATIC_LIBRARY:
  42. targetOutputName += ".lib";
  43. break;
  44. case cmTarget::SHARED_LIBRARY:
  45. case cmTarget::MODULE_LIBRARY:
  46. targetOutputName += ".dylib";
  47. break;
  48. case cmTarget::EXECUTABLE:
  49. case cmTarget::WIN32_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. cmRegularExpression isAframework("[ \t]*\\-framework");
  147. cmRegularExpression isEnvironment("\\${");
  148. cmRegularExpression 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 )
  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. case cmTarget::WIN32_EXECUTABLE:
  414. targetOutputType = "APPL";
  415. fout << "ApplicationPackage";
  416. break;
  417. default:;
  418. }
  419. fout << "</VALUE></SETTING>\n";
  420. fout << "<SETTING><NAME>MWProject_MacOSX_outfile</NAME><VALUE>";
  421. fout << m_TargetOutputFiles[std::string(tgtName)];
  422. fout << "</VALUE></SETTING>\n";
  423. fout << "<SETTING><NAME>MWProject_MacOSX_filetype</NAME><VALUE>";
  424. fout << targetOutputType << "</VALUE></SETTING>\n";
  425. fout << "<SETTING><NAME>MWProject_MacOSX_vmaddress</NAME><VALUE>0</VALUE></SETTING>\n";
  426. fout << "<SETTING><NAME>MWProject_MacOSX_usedefaultvmaddr</NAME><VALUE>1</VALUE></SETTING>\n";
  427. fout << "<SETTING><NAME>MWProject_MacOSX_flatrsrc</NAME><VALUE>1</VALUE></SETTING>\n";
  428. fout << "<SETTING><NAME>MWProject_MacOSX_flatrsrcfilename</NAME><VALUE></VALUE></SETTING>\n";
  429. fout << "<SETTING><NAME>MWProject_MacOSX_flatrsrcoutputdir</NAME>\n";
  430. fout << "<SETTING><NAME>Path</NAME><VALUE>:</VALUE></SETTING>\n";
  431. fout << "<SETTING><NAME>PathFormat</NAME><VALUE>MacOS</VALUE></SETTING>\n";
  432. fout << "<SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>\n";
  433. fout << "</SETTING>\n";
  434. fout << "<SETTING><NAME>MWProject_MacOSX_installpath</NAME><VALUE>./</VALUE></SETTING>\n";
  435. fout << "<SETTING><NAME>MWProject_MacOSX_dont_prebind</NAME><VALUE>0</VALUE></SETTING>\n";
  436. fout << "<SETTING><NAME>MWProject_MacOSX_flat_namespace</NAME><VALUE>0</VALUE></SETTING>\n";
  437. fout << "<SETTING><NAME>MWProject_MacOSX_frameworkversion</NAME><VALUE>A</VALUE></SETTING>\n";
  438. fout << "<SETTING><NAME>MWProject_MacOSX_currentversion</NAME><VALUE>0</VALUE></SETTING>\n";
  439. fout << "<SETTING><NAME>MWProject_MacOSX_flat_oldimpversion</NAME><VALUE>0</VALUE></SETTING>\n";
  440. // <!-- Settings for "PPC Mach-O Linker" panel -->
  441. fout << "<SETTING><NAME>MWLinker_MachO_exports</NAME><VALUE>All</VALUE></SETTING>\n";
  442. fout << "<SETTING><NAME>MWLinker_MachO_mainname</NAME><VALUE>start</VALUE></SETTING>\n";
  443. fout << "<SETTING><NAME>MWLinker_MachO_currentversion</NAME><VALUE>0</VALUE></SETTING>\n";
  444. fout << "<SETTING><NAME>MWLinker_MachO_compatibleversion</NAME><VALUE>0</VALUE></SETTING>\n";
  445. fout << "<SETTING><NAME>MWLinker_MachO_symfullpath</NAME><VALUE>0</VALUE></SETTING>\n";
  446. fout << "<SETTING><NAME>MWLinker_MachO_supresswarnings</NAME><VALUE>0</VALUE></SETTING>\n";
  447. fout << "<SETTING><NAME>MWLinker_MachO_multisymerror</NAME><VALUE>0</VALUE></SETTING>\n";
  448. fout << "<SETTING><NAME>MWLinker_MachO_prebind</NAME><VALUE>1</VALUE></SETTING>\n";
  449. fout << "<SETTING><NAME>MWLinker_MachO_deadstrip</NAME><VALUE>1</VALUE></SETTING>\n";
  450. fout << "<SETTING><NAME>MWLinker_MachO_objectivecsemantics</NAME><VALUE>0</VALUE></SETTING>\n";
  451. fout << "<SETTING><NAME>MWLinker_MachO_whichfileloaded</NAME><VALUE>0</VALUE></SETTING>\n";
  452. fout << "<SETTING><NAME>MWLinker_MachO_whyfileloaded</NAME><VALUE>0</VALUE></SETTING>\n";
  453. fout << "<SETTING><NAME>MWLinker_MachO_readonlyrelocs</NAME><VALUE>Errors</VALUE></SETTING>\n";
  454. fout << "<SETTING><NAME>MWLinker_MachO_undefinedsymbols</NAME><VALUE>Errors</VALUE></SETTING>\n";
  455. fout << "<SETTING><NAME>MWLinker_MachO_twolevelnamespace</NAME><VALUE>1</VALUE></SETTING>\n";
  456. fout << "<SETTING><NAME>MWLinker_MachO_stripdebugsymbols</NAME><VALUE>0</VALUE></SETTING>\n";
  457. // <!-- Settings for "PPC Mach-O Target" panel -->
  458. fout << "<SETTING><NAME>MWProject_MachO_type</NAME><VALUE>";
  459. switch (l->GetType())
  460. {
  461. case cmTarget::STATIC_LIBRARY:
  462. targetOutputType = "MMLB";
  463. fout << "Library";
  464. break;
  465. case cmTarget::SHARED_LIBRARY:
  466. case cmTarget::MODULE_LIBRARY:
  467. targetOutputType = "MDYL";
  468. fout << "SharedLibrary";
  469. break;
  470. case cmTarget::EXECUTABLE:
  471. case cmTarget::WIN32_EXECUTABLE:
  472. targetOutputType = "APPL";
  473. fout << "ApplicationPackage";
  474. break;
  475. default:;
  476. }
  477. fout << "</VALUE></SETTING>\n";
  478. fout << "<SETTING><NAME>MWProject_MachO_outfile</NAME><VALUE>";
  479. fout << m_TargetOutputFiles[std::string(tgtName)];
  480. fout << "</VALUE></SETTING>\n";
  481. fout << "<SETTING><NAME>MWProject_MachO_filecreator</NAME><VALUE>????" << "</VALUE></SETTING>\n";
  482. fout << "<SETTING><NAME>MWProject_MachO_filetype</NAME><VALUE>";
  483. fout << targetOutputType;
  484. fout << "</VALUE></SETTING>\n";
  485. fout << "<SETTING><NAME>MWProject_MachO_vmaddress</NAME><VALUE>4096</VALUE></SETTING>\n";
  486. fout << "<SETTING><NAME>MWProject_MachO_flatrsrc</NAME><VALUE>0</VALUE></SETTING>\n";
  487. fout << "<SETTING><NAME>MWProject_MachO_flatrsrcfilename</NAME><VALUE></VALUE></SETTING>\n";
  488. fout << "<SETTING><NAME>MWProject_MachO_flatrsrcoutputdir</NAME>\n";
  489. fout << "<SETTING><NAME>Path</NAME><VALUE>:</VALUE></SETTING>\n";
  490. fout << "<SETTING><NAME>PathFormat</NAME><VALUE>MacOS</VALUE></SETTING>\n";
  491. fout << "<SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>\n";
  492. fout << "</SETTING>\n";
  493. fout << "<SETTING><NAME>MWProject_MachO_installpath</NAME><VALUE>./</VALUE></SETTING>\n";
  494. fout << "<SETTING><NAME>MWProject_MachO_frameworkversion</NAME><VALUE></VALUE></SETTING>\n";
  495. fout << "</SETTINGLIST>\n";
  496. }
  497. void cmLocalCodeWarriorGenerator::WriteFileList(std::ostream& fout,
  498. const char* /*tgtName*/,
  499. cmTarget const *l)
  500. {
  501. fout << "<FILELIST>\n";
  502. // for each file
  503. std::vector<cmSourceFile*> const& classes = l->GetSourceFiles();
  504. for(std::vector<cmSourceFile*>::const_iterator i = classes.begin();
  505. i != classes.end(); i++)
  506. {
  507. // Add the file to the list of sources.
  508. std::string source = (*i)->GetFullPath();
  509. fout << "<FILE>\n";
  510. fout << "<PATHTYPE>Absolute</PATHTYPE>\n";
  511. fout << "<PATHROOT>Absolute</PATHROOT>\n";
  512. //fout << "<ACCESSPATH>common</ACCESSPATH>\n";
  513. fout << "<PATH>" << source << "</PATH>\n";
  514. fout << "<PATHFORMAT>Generic</PATHFORMAT>\n";
  515. fout << "<FILEKIND>Text</FILEKIND>\n";
  516. fout << "<FILEFLAGS>Debug</FILEFLAGS>\n";
  517. fout << "</FILE>\n";
  518. }
  519. // now add in the libraries we depend on
  520. cmRegularExpression isAframework("[ \t]*\\-framework");
  521. cmRegularExpression isEnvironment("\\${");
  522. cmRegularExpression isUNIX("[ \t]*\\-l([^ \t]+)");
  523. const cmTarget::LinkLibraries& libs = l->GetLinkLibraries();
  524. cmTarget::LinkLibraries::const_iterator lib = libs.begin();
  525. for(; lib != libs.end(); ++lib)
  526. {
  527. // no frameworks!
  528. if( isAframework.find( lib->first.c_str() ) ) continue;
  529. // no environment variables!
  530. if( isEnvironment.find( lib->first.c_str() ) ) continue;
  531. std::string libPath = lib->first + "_CMAKE_PATH";
  532. // is this lib part of this project? Look in the cache
  533. const char* cacheValue
  534. = GetGlobalGenerator()->GetCMakeInstance()
  535. ->GetCacheDefinition(libPath.c_str());
  536. if( cacheValue )
  537. {
  538. // just tack it on
  539. fout << "<FILE>\n";
  540. fout << "<PATHTYPE>RootRelative</PATHTYPE>\n";
  541. fout << "<PATHROOT>Project</PATHROOT>\n";
  542. fout << "<PATH>" << m_TargetOutputFiles[lib->first] << "</PATH>\n";
  543. fout << "<PATHFORMAT>Unix</PATHFORMAT>\n";
  544. fout << "<FILEKIND>Library</FILEKIND>\n";
  545. fout << "<FILEFLAGS>Debug, TargetOutputFile</FILEFLAGS>\n";
  546. fout << "</FILE>\n";
  547. }
  548. else if( lib->first.find('/') != std::string::npos )
  549. {
  550. // it's a path-based library, so we'll include it directly by path
  551. fout << "<FILE>\n";
  552. fout << "<PATHTYPE>Absolute</PATHTYPE>\n";
  553. fout << "<PATHROOT>Absolute</PATHROOT>\n";
  554. fout << "<PATH>" << lib->first.c_str() << "</PATH>\n";
  555. fout << "<PATHFORMAT>Unix</PATHFORMAT>\n";
  556. fout << "<FILEKIND>Text</FILEKIND>\n";
  557. fout << "<FILEFLAGS>Debug</FILEFLAGS>\n";
  558. fout << "</FILE>\n";
  559. }
  560. else if( isUNIX.find( lib->first.c_str() ) )
  561. {
  562. // now we need to search the library directories for this
  563. // library name, and if we don't find it, we have to search
  564. // in the cache to see if there's a target defining that lib.
  565. // for the first search, we have to check for
  566. // [lib]<name>[.<a|lib|so|dylib|dll>]
  567. std::string libName = isUNIX.match(1);
  568. }
  569. else
  570. {
  571. // just tack it on
  572. fout << "<FILE>\n";
  573. fout << "<PATHTYPE>Name</PATHTYPE>\n";
  574. fout << "<PATH>" << lib->first.c_str() << "</PATH>\n";
  575. fout << "<PATHFORMAT>Unix</PATHFORMAT>\n";
  576. fout << "<FILEKIND>Library</FILEKIND>\n";
  577. fout << "<FILEFLAGS>Debug</FILEFLAGS>\n";
  578. fout << "</FILE>\n";
  579. }
  580. }
  581. // now add in the system libs (for an executable)
  582. if (l->GetType() == cmTarget::EXECUTABLE)
  583. {
  584. fout << "<FILE>\n";
  585. fout << "<PATHTYPE>Name</PATHTYPE>\n";
  586. fout << "<PATH>crt1.o</PATH>\n";
  587. fout << "<PATHFORMAT>MacOS</PATHFORMAT>\n";
  588. fout << "<FILEKIND>Library</FILEKIND>\n";
  589. fout << "<FILEFLAGS>Debug</FILEFLAGS>\n";
  590. fout << "</FILE>\n";
  591. fout << "<FILE>\n";
  592. fout << "<PATHTYPE>Name</PATHTYPE>\n";
  593. fout << "<PATH>MSL_All_Mach-O.lib</PATH>\n";
  594. fout << "<PATHFORMAT>Unix</PATHFORMAT>\n";
  595. fout << "<FILEKIND>Library</FILEKIND>\n";
  596. fout << "<FILEFLAGS>Debug</FILEFLAGS>\n";
  597. fout << "</FILE>\n";
  598. fout << "<FILE>\n";
  599. fout << "<PATHTYPE>Name</PATHTYPE>\n";
  600. fout << "<PATH>console_OS_X.c</PATH>\n";
  601. fout << "<PATHFORMAT>Unix</PATHFORMAT>\n";
  602. fout << "<FILEKIND>Text</FILEKIND>\n";
  603. fout << "<FILEFLAGS>Debug</FILEFLAGS>\n";
  604. fout << "</FILE>\n";
  605. }
  606. // or a dynamic library
  607. /* else if (l->GetType() == cmTarget::SHARED_LIBRARY ||
  608. l->GetType() == cmTarget::MODULE_LIBRARY)
  609. {
  610. fout << "<FILE>\n";
  611. fout << "<PATHTYPE>Name</PATHTYPE>\n";
  612. fout << "<PATH>dylib1.o</PATH>\n";
  613. fout << "<PATHFORMAT>MacOS</PATHFORMAT>\n";
  614. fout << "<FILEKIND>Library</FILEKIND>\n";
  615. fout << "<FILEFLAGS>Debug</FILEFLAGS>\n";
  616. fout << "</FILE>\n";
  617. }*/
  618. fout << "</FILELIST>\n";
  619. }
  620. void cmLocalCodeWarriorGenerator::WriteLinkOrder(std::ostream& fout,
  621. const char* tgtName,
  622. cmTarget const *l)
  623. {
  624. fout << "<LINKORDER>\n";
  625. // for each file
  626. std::vector<cmSourceFile*> const& classes = l->GetSourceFiles();
  627. for(std::vector<cmSourceFile*>::const_iterator i = classes.begin();
  628. i != classes.end(); i++)
  629. {
  630. // Add the file to the list of sources.
  631. std::string source = (*i)->GetFullPath();
  632. fout << "<FILEREF>\n";
  633. fout << "<PATHTYPE>Absolute</PATHTYPE>\n";
  634. fout << "<PATHROOT>Absolute</PATHROOT>\n";
  635. //fout << "<ACCESSPATH>common</ACCESSPATH>\n";
  636. fout << "<PATH>" << source << "</PATH>\n";
  637. fout << "<PATHFORMAT>Generic</PATHFORMAT>\n";
  638. fout << "</FILEREF>\n";
  639. }
  640. // now add in the libraries we depend on
  641. cmRegularExpression isAframework("[ \t]*\\-framework");
  642. cmRegularExpression isEnvironment("\\${");
  643. cmRegularExpression isUNIX("[ \t]*\\-l([^ \t]+)");
  644. const cmTarget::LinkLibraries& libs = l->GetLinkLibraries();
  645. cmTarget::LinkLibraries::const_iterator lib = libs.begin();
  646. std::map<std::string, std::string> referencedTargets;
  647. for(; lib != libs.end(); ++lib)
  648. {
  649. // no frameworks!
  650. if( isAframework.find( lib->first.c_str() ) ) continue;
  651. // no environment variables!
  652. if( isEnvironment.find( lib->first.c_str() ) ) continue;
  653. std::string libPath = lib->first + "_CMAKE_PATH";
  654. // is this lib part of this project? Look in the cache
  655. const char* cacheValue
  656. = GetGlobalGenerator()->GetCMakeInstance()
  657. ->GetCacheDefinition(libPath.c_str());
  658. if( cacheValue )
  659. {
  660. // just tack it on
  661. fout << "<FILEREF>\n";
  662. fout << "<PATHTYPE>RootRelative</PATHTYPE>\n";
  663. fout << "<PATHROOT>Project</PATHROOT>\n";
  664. fout << "<PATH>" << m_TargetOutputFiles[lib->first] << "</PATH>\n";
  665. fout << "<PATHFORMAT>Unix</PATHFORMAT>\n";
  666. fout << "</FILEREF>\n";
  667. referencedTargets[lib->first] = m_TargetOutputFiles[lib->first];
  668. if( m_TargetReferencingList.count(m_TargetOutputFiles[lib->first]) == 0 )
  669. {
  670. m_TargetReferencingList[m_TargetOutputFiles[lib->first]] = std::string(tgtName);
  671. }
  672. }
  673. else if( lib->first.find('/') != std::string::npos )
  674. {
  675. // it's a path-based library, so we'll include it directly by path
  676. fout << "<FILEREF>\n";
  677. fout << "<PATHTYPE>Absolute</PATHTYPE>\n";
  678. fout << "<PATHROOT>Absolute</PATHROOT>\n";
  679. fout << "<PATH>" << lib->first.c_str() << "</PATH>\n";
  680. fout << "<PATHFORMAT>Unix</PATHFORMAT>\n";
  681. fout << "</FILEREF>\n";
  682. }
  683. else if( isUNIX.find( lib->first.c_str() ) )
  684. {
  685. // now we need to search the library directories for this
  686. // library name, and if we don't find it, we have to search
  687. // in the cache to see if there's a target defining that lib.
  688. // for the first search, we have to check for
  689. // [lib]<name>[.<a|lib|so|dylib|dll>]
  690. std::string libName = isUNIX.match(1);
  691. }
  692. else
  693. {
  694. // just tack it on
  695. fout << "<FILEREF>\n";
  696. fout << "<PATHTYPE>Name</PATHTYPE>\n";
  697. fout << "<PATH>" << lib->first.c_str() << "</PATH>\n";
  698. fout << "<PATHFORMAT>Unix</PATHFORMAT>\n";
  699. fout << "</FILEREF>\n";
  700. }
  701. }
  702. // now add in the system libs (for an executable)
  703. if (l->GetType() == cmTarget::EXECUTABLE)
  704. {
  705. fout << "<FILEREF>\n";
  706. fout << "<PATHTYPE>Name</PATHTYPE>\n";
  707. fout << "<PATH>crt1.o</PATH>\n";
  708. fout << "<PATHFORMAT>MacOS</PATHFORMAT>\n";
  709. fout << "</FILEREF>\n";
  710. fout << "<FILEREF>\n";
  711. fout << "<PATHTYPE>Name</PATHTYPE>\n";
  712. fout << "<PATH>MSL_All_Mach-O.lib</PATH>\n";
  713. fout << "<PATHFORMAT>Unix</PATHFORMAT>\n";
  714. fout << "</FILEREF>\n";
  715. fout << "<FILEREF>\n";
  716. fout << "<PATHTYPE>Name</PATHTYPE>\n";
  717. fout << "<PATH>console_OS_X.c</PATH>\n";
  718. fout << "<PATHFORMAT>Unix</PATHFORMAT>\n";
  719. fout << "</FILEREF>\n";
  720. }
  721. // or a shared library
  722. /* else if (l->GetType() == cmTarget::SHARED_LIBRARY ||
  723. l->GetType() == cmTarget::MODULE_LIBRARY)
  724. {
  725. fout << "<FILEREF>\n";
  726. fout << "<PATHTYPE>Name</PATHTYPE>\n";
  727. fout << "<PATH>dylib1.o</PATH>\n";
  728. fout << "<PATHFORMAT>MacOS</PATHFORMAT>\n";
  729. fout << "</FILEREF>\n";
  730. }*/
  731. fout << "</LINKORDER>\n";
  732. if( referencedTargets.size() )
  733. {
  734. fout << "<SUBTARGETLIST>\n";
  735. // output subtarget list
  736. std::map<std::string, std::string>::const_iterator target = referencedTargets.begin();
  737. for( ; target != referencedTargets.end(); target++ )
  738. {
  739. fout << "<SUBTARGET>\n";
  740. fout << "<TARGETNAME>" << target->first << "</TARGETNAME>\n";
  741. fout << "<ATTRIBUTES>LinkAgainst</ATTRIBUTES>\n";
  742. fout << "<FILEREF>\n<PATHTYPE>RootRelative</PATHTYPE>\n"
  743. << "<PATHROOT>Project</PATHROOT>\n"
  744. << "<PATH>" << target->second << "</PATH>\n"
  745. << "<PATHFORMAT>Unix</PATHFORMAT></FILEREF>\n";
  746. fout << "</SUBTARGET>\n";
  747. }
  748. fout << "</SUBTARGETLIST>\n";
  749. }
  750. // we need at least one framework for the XML to be valid
  751. // generate framework list
  752. cmRegularExpression reg("[ \t]*\\-framework[ \t]+([^ \t]+)");
  753. std::vector<std::string> frameworks;
  754. lib = libs.begin();
  755. for(; lib != libs.end(); ++lib)
  756. {
  757. if( reg.find( lib->first.c_str() ) )
  758. {
  759. frameworks.push_back( reg.match(1) );
  760. }
  761. }
  762. if( frameworks.size() > 0 || l->GetType() == cmTarget::EXECUTABLE )
  763. {
  764. fout << "<FRAMEWORKLIST>\n";
  765. std::vector<std::string>::const_iterator framework = frameworks.begin();
  766. for(; framework != frameworks.end(); ++framework)
  767. {
  768. fout << "<FRAMEWORK>\n";
  769. fout << "<FILEREF>\n";
  770. fout << "<PATHTYPE>Name</PATHTYPE>\n";
  771. fout << "<PATH>" << framework->c_str() << ".framework</PATH>\n";
  772. fout << "<PATHFORMAT>MacOS</PATHFORMAT>\n";
  773. fout << "</FILEREF>\n";
  774. // this isn't strictly always true, I believe, but Apple adheres to it
  775. fout << "<DYNAMICLIBRARY>" << framework->c_str() << "</DYNAMICLIBRARY>\n";
  776. fout << "</FRAMEWORK>\n";
  777. }
  778. // if it's an executable, it needs to link into System.framework
  779. if (l->GetType() == cmTarget::EXECUTABLE)
  780. {
  781. fout << "<FRAMEWORK>\n";
  782. fout << "<FILEREF>\n";
  783. fout << "<PATHTYPE>Name</PATHTYPE>\n";
  784. fout << "<PATH>System.framework</PATH>\n";
  785. fout << "<PATHFORMAT>MacOS</PATHFORMAT>\n";
  786. fout << "</FILEREF>\n";
  787. fout << "<DYNAMICLIBRARY>System</DYNAMICLIBRARY>\n";
  788. fout << "</FRAMEWORK>\n";
  789. }
  790. fout << "</FRAMEWORKLIST>\n";
  791. }
  792. }
  793. void cmLocalCodeWarriorGenerator::WriteGroups(std::ostream& fout)
  794. {
  795. bool hasExecutableTarget = false, hasDynamicLibTarget = false;
  796. char *firstExecutableTarget = 0, *firstDynamicLibTarget = 0;
  797. cmTargets &tgts = m_Makefile->GetTargets();
  798. for(cmTargets::iterator l = tgts.begin();
  799. l != tgts.end(); l++)
  800. {
  801. this->WriteGroup(fout,l->first.c_str(),&(l->second));
  802. if (l->second.GetType() == cmTarget::EXECUTABLE)
  803. {
  804. hasExecutableTarget = true;
  805. if (firstExecutableTarget == 0)
  806. {
  807. firstExecutableTarget = const_cast<char*>(l->first.c_str());
  808. }
  809. }
  810. else if (l->second.GetType() == cmTarget::SHARED_LIBRARY ||
  811. l->second.GetType() == cmTarget::MODULE_LIBRARY)
  812. {
  813. hasDynamicLibTarget = true;
  814. if (firstDynamicLibTarget == 0)
  815. {
  816. firstDynamicLibTarget = const_cast<char*>(l->first.c_str());
  817. }
  818. }
  819. }
  820. // write out the libraries groups
  821. if( hasExecutableTarget )
  822. {
  823. fout << "<GROUP><NAME>" << "App Support" << "</NAME>\n";
  824. fout << "<FILEREF>\n";
  825. fout << "<TARGETNAME>" << firstExecutableTarget << "</TARGETNAME>\n";
  826. fout << "<PATHTYPE>Name</PATHTYPE>\n";
  827. fout << "<PATH>crt1.o</PATH>\n";
  828. fout << "<PATHFORMAT>MacOS</PATHFORMAT>\n";
  829. fout << "</FILEREF>\n";
  830. fout << "<FILEREF>\n";
  831. fout << "<TARGETNAME>" << firstExecutableTarget << "</TARGETNAME>\n";
  832. fout << "<PATHTYPE>Name</PATHTYPE>\n";
  833. fout << "<PATH>MSL_All_Mach-O.lib</PATH>\n";
  834. fout << "<PATHFORMAT>Unix</PATHFORMAT>\n";
  835. fout << "</FILEREF>\n";
  836. fout << "<FILEREF>\n";
  837. fout << "<TARGETNAME>" << firstExecutableTarget << "</TARGETNAME>\n";
  838. fout << "<PATHTYPE>Name</PATHTYPE>\n";
  839. fout << "<PATH>console_OS_X.c</PATH>\n";
  840. fout << "<PATHFORMAT>Unix</PATHFORMAT>\n";
  841. fout << "</FILEREF>\n";
  842. fout << "</GROUP>\n";
  843. }
  844. /* if (hasDynamicLibTarget)
  845. {
  846. fout << "<GROUP><NAME>" << "dylib Support" << "</NAME>\n";
  847. fout << "<FILEREF>\n";
  848. fout << "<TARGETNAME>" << firstDynamicLibTarget << "</TARGETNAME>\n";
  849. fout << "<PATHTYPE>Name</PATHTYPE>\n";
  850. fout << "<PATH>dylib1.o</PATH>\n";
  851. fout << "<PATHFORMAT>MacOS</PATHFORMAT>\n";
  852. fout << "</FILEREF>\n";
  853. fout << "</GROUP>\n";
  854. }*/
  855. // write out the referenced targets group
  856. if( m_TargetReferencingList.size() > 0 )
  857. {
  858. fout << "<GROUP><NAME>Subtarget Files</NAME>\n";
  859. std::map<std::string, std::string>::const_iterator subtarget = m_TargetReferencingList.begin();
  860. for( ; subtarget != m_TargetReferencingList.end(); subtarget++ )
  861. {
  862. fout << "<FILEREF>\n"
  863. << "<TARGETNAME>" << subtarget->second << "</TARGETNAME>\n";
  864. fout << "<PATHTYPE>RootRelative</PATHTYPE>\n<PATHROOT>Project</PATHROOT>\n";
  865. fout << "<PATH>" << subtarget->first << "</PATH>\n";
  866. fout << "<PATHFORMAT>Unix</PATHFORMAT>\n";
  867. fout << "</FILEREF>";
  868. }
  869. fout << "</GROUP>";
  870. }
  871. }
  872. void cmLocalCodeWarriorGenerator::WriteGroup(std::ostream& fout,
  873. const char *tgtName,
  874. cmTarget const *l)
  875. {
  876. fout << "<GROUP><NAME>" << tgtName << "</NAME>\n";
  877. // for each file
  878. std::vector<cmSourceFile*> const& classes = l->GetSourceFiles();
  879. for(std::vector<cmSourceFile*>::const_iterator i = classes.begin();
  880. i != classes.end(); i++)
  881. {
  882. std::string source = (*i)->GetFullPath();
  883. fout << "<FILEREF>\n";
  884. fout << "<TARGETNAME>" << tgtName << "</TARGETNAME>\n";
  885. fout << "<PATHTYPE>Absolute</PATHTYPE>\n";
  886. fout << "<PATHROOT>Absolute</PATHROOT>\n";
  887. fout << "<PATH>" << source << "</PATH>\n";
  888. fout << "<PATHFORMAT>Generic</PATHFORMAT>\n";
  889. fout << "</FILEREF>\n";
  890. }
  891. // now add in the libraries we depend on
  892. cmRegularExpression isAframework("[ \t]*\\-framework");
  893. cmRegularExpression isEnvironment("\\${");
  894. cmRegularExpression isUNIX("[ \t]*\\-l([^ \t]+)");
  895. const cmTarget::LinkLibraries& libs = l->GetLinkLibraries();
  896. cmTarget::LinkLibraries::const_iterator lib = libs.begin();
  897. for(; lib != libs.end(); ++lib)
  898. {
  899. // no frameworks!
  900. if( isAframework.find( lib->first.c_str() ) ) continue;
  901. // no environment variables!
  902. if( isEnvironment.find( lib->first.c_str() ) ) continue;
  903. std::string libPath = lib->first + "_CMAKE_PATH";
  904. // is this lib part of this project? Look in the cache
  905. const char* cacheValue
  906. = GetGlobalGenerator()->GetCMakeInstance()
  907. ->GetCacheDefinition(libPath.c_str());
  908. if( cacheValue )
  909. {
  910. // this is a subtarget reference, it will be taken care of later
  911. continue;
  912. }
  913. else if( lib->first.find('/') != std::string::npos )
  914. {
  915. // it's a path-based library, so we'll include it directly by path
  916. fout << "<FILEREF>\n";
  917. fout << "<TARGETNAME>" << tgtName << "</TARGETNAME>\n";
  918. fout << "<PATHTYPE>Absolute</PATHTYPE>\n";
  919. fout << "<PATHROOT>Absolute</PATHROOT>\n";
  920. fout << "<PATH>" << lib->first.c_str() << "</PATH>\n";
  921. fout << "<PATHFORMAT>Unix</PATHFORMAT>\n";
  922. fout << "</FILEREF>\n";
  923. }
  924. else if( isUNIX.find( lib->first.c_str() ) )
  925. {
  926. // now we need to search the library directories for this
  927. // library name, and if we don't find it, we have to search
  928. // in the cache to see if there's a target defining that lib.
  929. // for the first search, we have to check for
  930. // [lib]<name>[.<a|lib|so|dylib|dll>]
  931. std::string libName = isUNIX.match(1);
  932. }
  933. else
  934. {
  935. // just tack it on
  936. fout << "<FILEREF>\n";
  937. fout << "<TARGETNAME>" << tgtName << "</TARGETNAME>\n";
  938. fout << "<PATHTYPE>Name</PATHTYPE>\n";
  939. fout << "<PATH>" << lib->first.c_str() << "</PATH>\n";
  940. fout << "<PATHFORMAT>Unix</PATHFORMAT>\n";
  941. fout << "</FILEREF>\n";
  942. }
  943. }
  944. fout << "</GROUP>\n";
  945. }