fpmake.pp 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. {$IFDEF HASAMIGA}
  2. {$DEFINE NO_UNIT_PROCESS}
  3. {$ENDIF}
  4. {$IFDEF OS2}
  5. {$DEFINE NO_UNIT_PROCESS}
  6. {$ENDIF OS2}
  7. {$IFDEF GO32V2}
  8. {$DEFINE NO_UNIT_PROCESS}
  9. {$ENDIF GO32V2}
  10. {$ifndef NO_UNIT_PROCESS}
  11. {$define HAS_UNIT_PROCESS}
  12. {$endif NO_UNIT_PROCESS}
  13. {$ifndef ALLPACKAGES}
  14. {$mode objfpc}{$H+}
  15. program fpmake;
  16. uses
  17. {$ifdef unix}
  18. cthreads,
  19. {$endif}
  20. fpmkunit,
  21. {$IFDEF HAS_UNIT_PROCESS}
  22. process,
  23. {$ENDIF HAS_UNIT_PROCESS}
  24. sysutils;
  25. {$endif ALLPACKAGES}
  26. {$ifdef HAS_UNIT_PROCESS}
  27. procedure fpcm_update_revision_info(Sender: TObject);
  28. function ReadGitLine(AProcess: TProcess; var ALine: string): boolean;
  29. var
  30. b,i: byte;
  31. begin
  32. result := true;
  33. ALine := '';
  34. i := 1;
  35. repeat
  36. if i = 0 then
  37. sleep(100);
  38. i := AProcess.Output.Read(b,1);
  39. if i > 0 then
  40. begin
  41. if b = 13 then
  42. continue;
  43. if b = 10 then
  44. exit;
  45. ALine := ALine + chr(b);
  46. end;
  47. until not AProcess.Running and (i=0);
  48. result := (ALine <> '');
  49. end;
  50. var
  51. P : TPackage;
  52. GitBin : String;
  53. GitProcess: TProcess;
  54. f: text;
  55. fileurl, line, date, lastdate,
  56. hash, lasthash, oldhash,
  57. oldhashstring, olddate : string;
  58. i, io : longint;
  59. begin
  60. // If revision.inc does exist, try to update the file with the latest
  61. // commit from git. And include this information in the fpcmake
  62. // executable.
  63. With installer do
  64. begin
  65. if not FileExists(BuildEngine.AddPathPrefix(P,'revision.inc')) then
  66. begin
  67. BuildEngine.Log(vlWarning, 'File revision.inc not found. Svn-revision will not be included in fpcmake executable.');
  68. Exit;
  69. end;
  70. // Run svn info, and catch output.
  71. P := sender as TPackage;
  72. P.Options.Add('-dREVINC');
  73. GitBin := ExeSearch(AddProgramExtension('git', Defaults.BuildOS), GetEnvironmentvariable('PATH'));
  74. if GitBin<>'' then
  75. begin
  76. GitProcess := TProcess.create(nil);
  77. try
  78. GitProcess.Executable := GitBin;
  79. GitProcess.Parameters.Add('log');
  80. GitProcess.Parameters.Add('-n');
  81. GitProcess.Parameters.Add('1');
  82. GitProcess.Parameters.Add('--date=short');
  83. GitProcess.Parameters.Add('--pretty=%cd');
  84. GitProcess.Parameters.Add(BuildEngine.AddPathPrefix(P,'fpcmpkg.pp'));
  85. GitProcess.Parameters.Add(BuildEngine.AddPathPrefix(P,'fpcmake.pp'));
  86. GitProcess.Parameters.Add(BuildEngine.AddPathPrefix(P,'fpcmwr.pp'));
  87. GitProcess.Parameters.Add(BuildEngine.AddPathPrefix(P,'fpcmmain.pp'));
  88. GitProcess.Parameters.Add(BuildEngine.AddPathPrefix(P,'fpcmdic.pp'));
  89. GitProcess.Parameters.Add(BuildEngine.AddPathPrefix(P,'fpcmake.ini'));
  90. GitProcess.Parameters.Add(BuildEngine.AddPathPrefix(P,'Makefile.fpc')); GitProcess.Options:=[poUsePipes];
  91. GitProcess.Execute;
  92. // Search for latest revision in output:
  93. lastdate:='0';
  94. ReadGitLine(GitProcess, lastdate);
  95. finally
  96. GitProcess.Free;
  97. end;
  98. GitProcess := TProcess.create(nil);
  99. try
  100. GitProcess.Executable := GitBin;
  101. GitProcess.Parameters.Add('log');
  102. GitProcess.Parameters.Add('-n');
  103. GitProcess.Parameters.Add('1');
  104. GitProcess.Parameters.Add('--pretty=%h');
  105. GitProcess.Parameters.Add(BuildEngine.AddPathPrefix(P,'fpcmpkg.pp'));
  106. GitProcess.Parameters.Add(BuildEngine.AddPathPrefix(P,'fpcmake.pp'));
  107. GitProcess.Parameters.Add(BuildEngine.AddPathPrefix(P,'fpcmwr.pp'));
  108. GitProcess.Parameters.Add(BuildEngine.AddPathPrefix(P,'fpcmmain.pp'));
  109. GitProcess.Parameters.Add(BuildEngine.AddPathPrefix(P,'fpcmdic.pp'));
  110. GitProcess.Parameters.Add(BuildEngine.AddPathPrefix(P,'fpcmake.ini'));
  111. GitProcess.Parameters.Add(BuildEngine.AddPathPrefix(P,'Makefile.fpc')); GitProcess.Options:=[poUsePipes];
  112. GitProcess.Options:=[poUsePipes];
  113. GitProcess.Execute;
  114. lasthash:='0';
  115. ReadGitLine(GitProcess, lasthash);
  116. finally
  117. GitProcess.Free;
  118. end;
  119. oldhash:='';
  120. olddate:='';
  121. // Write the latest change-date and revision to file revision.inc
  122. system.assign(f,BuildEngine.AddPathPrefix(P,'revision.inc'));
  123. io:=ioresult;
  124. reset(f);
  125. io:=ioresult;
  126. if io<>0 then
  127. begin
  128. BuildEngine.Log(vlWarning,'revision.inc reset failed, io='+IntToStr(io));
  129. end
  130. else
  131. begin
  132. readln(f,oldhashstring);
  133. close(f);
  134. BuildEngine.Log(vlCommand, 'oldhashstring '+oldhashstring);
  135. if oldhashstring[1]='''' then
  136. oldhashstring:=copy(oldhashstring,2,length(oldhashstring));
  137. i:=length(oldhashstring);
  138. if oldhashstring[i]='''' then
  139. oldhashstring:=copy(oldhashstring,1,i-1);
  140. i:=pos(' hash ',oldhashstring);
  141. if i>0 then
  142. begin
  143. oldhash:=copy(oldhashstring,i+6,length(oldhashstring));
  144. olddate:=copy(oldhashstring,1,i-1);
  145. BuildEngine.Log(vlCommand,'Old values '+olddate+' '+oldhash);
  146. if (olddate >= lastdate) and (oldhash <> lasthash) then
  147. begin
  148. BuildEngine.Log(vlCommand,'New values '+lastdate+' '+lasthash);
  149. BuildEngine.Log(vlCommand,'Keeping old values');
  150. lasthash:=oldhash;
  151. lastdate:=olddate;
  152. end;
  153. end;
  154. end;
  155. if (lastdate=olddate) and (lasthash=oldhash) then
  156. BuildEngine.Log(vlCommand,'revision.inc unchanged')
  157. else
  158. begin
  159. BuildEngine.Log(vlCommand,'revision.inc set to '''+lastdate+' hash '+lasthash+'''');
  160. system.assign(f,BuildEngine.AddPathPrefix(P,'revision.inc'));
  161. rewrite(f);
  162. io:=ioresult;
  163. if io <> 0 then
  164. begin
  165. BuildEngine.Log(vlError, 'Error opening revision.inc for writing');
  166. halt(3);
  167. end;
  168. Writeln(f,'''',lastdate,' hash ',lasthash,'''');
  169. close(f);
  170. end
  171. end
  172. else
  173. BuildEngine.Log(vlWarning,'Git executable (git) not found. Git-hash in fpcmake executable might be out of date.');
  174. end;
  175. end;
  176. {$endif HAS_UNIT_PROCESS}
  177. procedure add_fpcm(const ADirectory: string);
  178. Var
  179. P : TPackage;
  180. T : TTarget;
  181. Data2IncBin : String;
  182. begin
  183. With Installer do
  184. begin
  185. P:=AddPackage('utils-fpcm');
  186. P.ShortName:='fpcm';
  187. P.OSes:=AllOSes-[embedded,msdos,nativent,win16,macosclassic,atari,palmos,zxspectrum,msxdos,amstradcpc,sinclairql,human68k,ps1,wasip2];
  188. if Defaults.CPU=jvm then
  189. P.OSes := P.OSes - [java,android];
  190. P.Author := '<various>';
  191. P.License := 'LGPL with modification';
  192. P.HomepageURL := 'www.freepascal.org';
  193. P.Email := '';
  194. P.Description := 'Tool to generate Makefile''s out of Makefile.fpc files';
  195. P.NeedLibC:= false;
  196. {$ifdef ALLPACKAGES}
  197. P.Directory:=ADirectory;
  198. {$endif ALLPACKAGES}
  199. P.Version:='3.3.1';
  200. P.Dependencies.Add('fcl-base');
  201. {$ifdef TEST_FPMKUNIT}
  202. P.Dependencies.Add('fpmkunit');
  203. {$endif}
  204. T:=P.Targets.AddProgram('fpcmake.pp');
  205. {$ifdef HAS_UNIT_PROCESS}
  206. P.BeforeCompileProc:=@fpcm_update_revision_info;
  207. {$else HAS_UNIT_PROCESS}
  208. writeln('Process-unit not available. Svn-revision in fpmake executable might be out-of-date.');
  209. {$endif HAS_UNIT_PROCESS}
  210. Data2IncBin := AddProgramExtension('data2inc',Defaults.BuildOS);
  211. p.Commands.AddCommand(caBeforeCompile, Data2IncBin, '-b -s ' + P.Directory + 'fpcmake.ini ' + P.Directory + 'fpcmake.inc fpcmakeini','fpcmake.inc','fpcmake.ini');
  212. T:=P.Targets.AddUnit('fpcmmain.pp');
  213. T.install:=false;
  214. T.ResourceStrings:=true;
  215. P.Targets.AddUnit('fpcmdic.pp').install:=false;
  216. P.Targets.AddUnit('fpcmwr.pp').install:=false;
  217. P.Targets.AddUnit('fpcmpkg.pp').install:=false;
  218. // P.Sources.AddSrc('fpcmake.ini');
  219. P.Sources.AddSrc('fpcmake.inc');
  220. end;
  221. end;
  222. {$ifndef ALLPACKAGES}
  223. begin
  224. add_fpcm('');
  225. Installer.Run;
  226. end.
  227. {$endif ALLPACKAGES}