fpcmake.pp 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  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.4 2001-06-04 21:42:57 peter
  212. * Arguments added
  213. * Start of Package.fpc creation
  214. Revision 1.3 2001/02/22 21:11:24 peter
  215. * fpcdir detection added
  216. * fixed loading of variables in fpcmake itself
  217. Revision 1.2 2001/01/29 21:49:10 peter
  218. * lot of updates
  219. Revision 1.1 2001/01/24 21:59:36 peter
  220. * first commit of new fpcmake
  221. }