fpcmake.pp 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  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. uses
  15. getopts,
  16. sysutils,
  17. fpcmmain,fpcmwr,fpcmpkg;
  18. type
  19. { Verbosity Level }
  20. TVerboseLevel = (v_Quiet,v_Default,v_Verbose);
  21. { Operation mode }
  22. TMode = (m_None,m_PackageFpc,m_Makefile);
  23. TFPCMakeConsole=class(TFPCMake)
  24. procedure Verbose(lvl:TFPCMakeVerbose;const s:string);override;
  25. end;
  26. var
  27. Mode : TMode;
  28. VerboseLevel : TVerboseLevel;
  29. {*****************************************************************************
  30. Helpers
  31. *****************************************************************************}
  32. procedure Show(lvl:TVerboseLevel;const s:string);
  33. begin
  34. if VerboseLevel>=lvl then
  35. Writeln(s);
  36. end;
  37. procedure Error(const s:string);
  38. begin
  39. Writeln('Error: ',s);
  40. Halt(1);
  41. end;
  42. {*****************************************************************************
  43. TFPCMakeConsole
  44. *****************************************************************************}
  45. procedure TFPCMakeConsole.Verbose(lvl:TFPCMakeVerbose;const s:string);
  46. begin
  47. case lvl of
  48. FPCMakeInfo :
  49. Show(V_Default,' '+VerboseIdent+s);
  50. FPCMakeDebug :
  51. Show(V_Verbose,' '+VerboseIdent+s);
  52. FPCMakeError :
  53. Error(s);
  54. end;
  55. end;
  56. {*****************************************************************************
  57. Makefile output
  58. *****************************************************************************}
  59. procedure ProcessFile_Makefile(const fn:string);
  60. var
  61. CurrFPCMake : TFPCMakeConsole;
  62. CurrMakefile : TMakefileWriter;
  63. {$ifdef SUBDIRS}
  64. s,Subdirs : string;
  65. t : ttarget;
  66. {$endif SUBDIRS}
  67. begin
  68. Show(V_Default,'Processing '+fn);
  69. CurrFPCMake:=nil;
  70. // try
  71. { Load Makefile.fpc }
  72. CurrFPCMake:=TFPCMakeConsole.Create(fn);
  73. CurrFPCMake.LoadMakefileFPC;
  74. // CurrFPCMake.Print;
  75. {$ifdef SUBDIRS}
  76. subdirs:=CurrFPCMake.GetVariable('target_dirs',true);
  77. for t:=low(ttarget) to high(ttarget) do
  78. subdirs:=subdirs+' '+CurrFPCMake.GetVariable('target_dirs'+targetsuffix[t],true);
  79. {$endif SUBDIRS}
  80. { Write Makefile }
  81. CurrMakefile:=TMakefileWriter.Create(CurrFPCMake,ExtractFilePath(fn)+'Makefile');
  82. CurrMakefile.WriteGenericMakefile;
  83. CurrMakefile.Free;
  84. // except
  85. // on e : exception do
  86. // begin
  87. // Error(e.message);
  88. // Subdirs:='';
  89. // end;
  90. // end;
  91. CurrFPCMake.Free;
  92. {$ifdef SUBDIRS}
  93. { Process subdirs }
  94. writeln('Subdirs found: ',subdirs);
  95. repeat
  96. s:=GetToken(subdirs);
  97. if s='' then
  98. break;
  99. ProcessFile(ExtractFilePath(fn)+s+'/Makefile.fpc');
  100. until false;
  101. {$endif SUBDIRS}
  102. end;
  103. {*****************************************************************************
  104. Package.fpc output
  105. *****************************************************************************}
  106. procedure ProcessFile_PackageFpc(const fn:string);
  107. var
  108. CurrFPCMake : TFPCMakeConsole;
  109. CurrPackageFpc : TPackageFpcWriter;
  110. begin
  111. Show(V_Default,'Processing '+fn);
  112. CurrFPCMake:=nil;
  113. // try
  114. { Load Makefile.fpc }
  115. CurrFPCMake:=TFPCMakeConsole.Create(fn);
  116. CurrFPCMake.LoadMakefileFPC;
  117. // CurrFPCMake.Print;
  118. { Write Package.fpc }
  119. CurrPackageFpc:=TPackageFpcWriter.Create(CurrFPCMake,ExtractFilePath(fn)+'Package.fpc');
  120. CurrPackageFpc.WritePackageFpc;
  121. CurrPackageFpc.Free;
  122. // except
  123. // on e : exception do
  124. // begin
  125. // Error(e.message);
  126. // Subdirs:='';
  127. // end;
  128. // end;
  129. CurrFPCMake.Free;
  130. end;
  131. procedure ProcessFile(const fn:string);
  132. begin
  133. case Mode of
  134. m_None :
  135. Error('No operation specified, see -h for help');
  136. m_Makefile :
  137. ProcessFile_Makefile(fn);
  138. m_PackageFpc :
  139. ProcessFile_PackageFpc(fn);
  140. end;
  141. end;
  142. procedure UseMakefilefpc;
  143. var
  144. fn : string;
  145. begin
  146. if FileExists('Makefile.fpc') then
  147. fn:='Makefile.fpc'
  148. else
  149. fn:='makefile.fpc';
  150. ProcessFile(fn);
  151. end;
  152. procedure UseParameters;
  153. var
  154. i : integer;
  155. begin
  156. for i:=OptInd to ParamCount do
  157. ProcessFile(ParamStr(i));
  158. end;
  159. Procedure Usage;
  160. {
  161. Print usage and exit.
  162. }
  163. begin
  164. writeln(paramstr(0),': <-pw> [-vqh] [file] [file ...]');
  165. writeln('Operations:');
  166. writeln(' -p Generate Package.fpc');
  167. writeln(' -w Write Makefile');
  168. writeln('');
  169. writeln('Options:');
  170. writeln(' -v Be more verbose');
  171. writeln(' -q Be quiet');
  172. writeln(' -h This help screen');
  173. Halt(0);
  174. end;
  175. Procedure ProcessOpts;
  176. {
  177. Process command line opions, and checks if command line options OK.
  178. }
  179. const
  180. ShortOpts = 'pwqvh';
  181. var
  182. C : char;
  183. begin
  184. if paramcount=0 then
  185. usage;
  186. { Reset }
  187. Mode:=m_none;
  188. VerboseLevel:=v_default;
  189. repeat
  190. c:=Getopt (ShortOpts);
  191. Case C of
  192. EndOfOptions : break;
  193. 'p' : Mode:=m_PackageFpc;
  194. 'w' : Mode:=m_Makefile;
  195. 'q' : VerboseLevel:=v_quiet;
  196. 'v' : VerboseLevel:=v_verbose;
  197. '?' : Usage;
  198. 'h' : Usage;
  199. end;
  200. until false;
  201. end;
  202. begin
  203. ProcessOpts;
  204. if (OptInd>Paramcount) then
  205. UseMakefilefpc
  206. else
  207. UseParameters;
  208. end.
  209. {
  210. $Log$
  211. Revision 1.5 2001-07-13 21:01:59 peter
  212. * cygdrive support
  213. * fixed cygwin detection
  214. * fixed some duplicate and extraeous spaces
  215. Revision 1.4 2001/06/04 21:42:57 peter
  216. * Arguments added
  217. * Start of Package.fpc creation
  218. Revision 1.3 2001/02/22 21:11:24 peter
  219. * fpcdir detection added
  220. * fixed loading of variables in fpcmake itself
  221. Revision 1.2 2001/01/29 21:49:10 peter
  222. * lot of updates
  223. Revision 1.1 2001/01/24 21:59:36 peter
  224. * first commit of new fpcmake
  225. }