fpcmake.pp 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  1. {
  2. $Id$
  3. Copyright (c) 2001 by Peter Vreman
  4. Convert Makefile.fpc to Makefile
  5. See the file COPYING.FPC, included in this distribution,
  6. for details about the copyright.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  10. **********************************************************************}
  11. {$ifdef fpc}{$mode objfpc}{$endif}
  12. {$H+}
  13. program fpcmake;
  14. { Define to not catch exceptions and output backtraces }
  15. { define NOEXCEPT}
  16. uses
  17. getopts,
  18. sysutils,
  19. fpcmmain,fpcmwr,fpcmpkg;
  20. type
  21. { Verbosity Level }
  22. TVerboseLevel = (v_Quiet,v_Default,v_Verbose);
  23. { Operation mode }
  24. TMode = (m_None,m_PackageFpc,m_Makefile);
  25. TFPCMakeConsole=class(TFPCMake)
  26. procedure Verbose(lvl:TFPCMakeVerbose;const s:string);override;
  27. end;
  28. var
  29. ParaMode : TMode;
  30. ParaVerboseLevel : TVerboseLevel;
  31. ParaTargets : string;
  32. {*****************************************************************************
  33. Helpers
  34. *****************************************************************************}
  35. procedure Show(lvl:TVerboseLevel;const s:string);
  36. begin
  37. if ParaVerboseLevel>=lvl then
  38. Writeln(s);
  39. end;
  40. procedure Error(const s:string);
  41. begin
  42. Writeln('Error: ',s);
  43. Halt(1);
  44. end;
  45. {*****************************************************************************
  46. TFPCMakeConsole
  47. *****************************************************************************}
  48. procedure TFPCMakeConsole.Verbose(lvl:TFPCMakeVerbose;const s:string);
  49. begin
  50. case lvl of
  51. FPCMakeInfo :
  52. Show(V_Default,' '+VerboseIdent+s);
  53. FPCMakeDebug :
  54. Show(V_Verbose,' '+VerboseIdent+s);
  55. FPCMakeError :
  56. Error(s);
  57. end;
  58. end;
  59. {*****************************************************************************
  60. Makefile output
  61. *****************************************************************************}
  62. procedure ProcessFile_Makefile(const fn:string);
  63. var
  64. CurrFPCMake : TFPCMakeConsole;
  65. CurrMakefile : TMakefileWriter;
  66. {$ifdef SUBDIRS}
  67. s,Subdirs : string;
  68. t : ttarget;
  69. {$endif SUBDIRS}
  70. begin
  71. Show(V_Default,'Processing '+fn);
  72. CurrFPCMake:=nil;
  73. {$ifndef NOEXCEPT}
  74. try
  75. {$endif NOEXCEPT}
  76. { Load Makefile.fpc }
  77. CurrFPCMake:=TFPCMakeConsole.Create(fn);
  78. if ParaTargets<>'' then
  79. CurrFPCMake.SetTargets(ParaTargets);
  80. CurrFPCMake.LoadMakefileFPC;
  81. // CurrFPCMake.Print;
  82. {$ifdef SUBDIRS}
  83. subdirs:=CurrFPCMake.GetVariable('target_dirs',true);
  84. for t:=low(ttarget) to high(ttarget) do
  85. subdirs:=subdirs+' '+CurrFPCMake.GetVariable('target_dirs'+targetsuffix[t],true);
  86. {$endif SUBDIRS}
  87. { Write Makefile }
  88. CurrMakefile:=TMakefileWriter.Create(CurrFPCMake,ExtractFilePath(fn)+'Makefile');
  89. CurrMakefile.WriteGenericMakefile;
  90. CurrMakefile.Free;
  91. {$ifndef NOEXCEPT}
  92. except
  93. on e : exception do
  94. begin
  95. Error(e.message);
  96. {$ifdef SUBDIRS}
  97. Subdirs:='';
  98. {$endif SUBDIRS}
  99. end;
  100. end;
  101. {$endif NOEXCEPT}
  102. CurrFPCMake.Free;
  103. {$ifdef SUBDIRS}
  104. { Process subdirs }
  105. writeln('Subdirs found: ',subdirs);
  106. repeat
  107. s:=GetToken(subdirs);
  108. if s='' then
  109. break;
  110. ProcessFile(ExtractFilePath(fn)+s+'/Makefile.fpc');
  111. until false;
  112. {$endif SUBDIRS}
  113. end;
  114. {*****************************************************************************
  115. Package.fpc output
  116. *****************************************************************************}
  117. procedure ProcessFile_PackageFpc(const fn:string);
  118. var
  119. CurrFPCMake : TFPCMakeConsole;
  120. CurrPackageFpc : TPackageFpcWriter;
  121. begin
  122. Show(V_Default,'Processing '+fn);
  123. CurrFPCMake:=nil;
  124. {$ifndef NOEXCEPT}
  125. try
  126. {$endif NOEXCEPT}
  127. { Load Makefile.fpc }
  128. CurrFPCMake:=TFPCMakeConsole.Create(fn);
  129. if ParaTargets<>'' then
  130. CurrFPCMake.SetTargets(ParaTargets);
  131. CurrFPCMake.LoadMakefileFPC;
  132. // CurrFPCMake.Print;
  133. { Write Package.fpc }
  134. CurrPackageFpc:=TPackageFpcWriter.Create(CurrFPCMake,ExtractFilePath(fn)+'Package.fpc');
  135. CurrPackageFpc.WritePackageFpc;
  136. CurrPackageFpc.Free;
  137. {$ifndef NOEXCEPT}
  138. except
  139. on e : exception do
  140. begin
  141. Error(e.message);
  142. end;
  143. end;
  144. {$endif NOEXCEPT}
  145. CurrFPCMake.Free;
  146. end;
  147. procedure ProcessFile(const fn:string);
  148. begin
  149. case ParaMode of
  150. m_None :
  151. Error('No operation specified, see -h for help');
  152. m_Makefile :
  153. ProcessFile_Makefile(fn);
  154. m_PackageFpc :
  155. ProcessFile_PackageFpc(fn);
  156. end;
  157. end;
  158. procedure UseMakefilefpc;
  159. var
  160. fn : string;
  161. begin
  162. if FileExists('Makefile.fpc') then
  163. fn:='Makefile.fpc'
  164. else
  165. fn:='makefile.fpc';
  166. ProcessFile(fn);
  167. end;
  168. procedure UseParameters;
  169. var
  170. i : integer;
  171. begin
  172. for i:=OptInd to ParamCount do
  173. ProcessFile(ParamStr(i));
  174. end;
  175. Procedure Usage;
  176. {
  177. Print usage and exit.
  178. }
  179. begin
  180. writeln(paramstr(0),': <-pw> [-vqh] [file] [file ...]');
  181. writeln('Operations:');
  182. writeln(' -p Generate Package.fpc');
  183. writeln(' -w Write Makefile');
  184. writeln('');
  185. writeln('Options:');
  186. writeln(' -T<target>[,target] Support only specified targets');
  187. writeln(' -v Be more verbose');
  188. writeln(' -q Be quiet');
  189. writeln(' -h This help screen');
  190. Halt(0);
  191. end;
  192. Procedure ProcessOpts;
  193. {
  194. Process command line opions, and checks if command line options OK.
  195. }
  196. const
  197. ShortOpts = 'pwqvhT:';
  198. var
  199. C : char;
  200. begin
  201. if paramcount=0 then
  202. usage;
  203. { Reset }
  204. ParaMode:=m_none;
  205. ParaVerboseLevel:=v_default;
  206. repeat
  207. c:=Getopt (ShortOpts);
  208. Case C of
  209. EndOfOptions : break;
  210. 'p' : ParaMode:=m_PackageFpc;
  211. 'w' : ParaMode:=m_Makefile;
  212. 'q' : ParaVerboseLevel:=v_quiet;
  213. 'v' : ParaVerboseLevel:=v_verbose;
  214. 'T' : ParaTargets:=OptArg;
  215. '?' : Usage;
  216. 'h' : Usage;
  217. end;
  218. until false;
  219. end;
  220. begin
  221. ProcessOpts;
  222. if (OptInd>Paramcount) then
  223. UseMakefilefpc
  224. else
  225. UseParameters;
  226. end.
  227. {
  228. $Log$
  229. Revision 1.6 2001-08-02 20:50:29 peter
  230. * -T<target> support
  231. * better error reporting for not found dirs
  232. * some cleanups and nicer strings
  233. Revision 1.5 2001/07/13 21:01:59 peter
  234. * cygdrive support
  235. * fixed cygwin detection
  236. * fixed some duplicate and extraeous spaces
  237. Revision 1.4 2001/06/04 21:42:57 peter
  238. * Arguments added
  239. * Start of Package.fpc creation
  240. Revision 1.3 2001/02/22 21:11:24 peter
  241. * fpcdir detection added
  242. * fixed loading of variables in fpcmake itself
  243. Revision 1.2 2001/01/29 21:49:10 peter
  244. * lot of updates
  245. Revision 1.1 2001/01/24 21:59:36 peter
  246. * first commit of new fpcmake
  247. }