pkgfpmake.pp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. unit pkgfpmake;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils,pkghandler;
  6. type
  7. { TFPMakeCompiler }
  8. TFPMakeCompiler = Class(TPackagehandler)
  9. Private
  10. Procedure CompileFPMake;
  11. Public
  12. Function Execute(const Args:TActionArgs):boolean;override;
  13. end;
  14. { TFPMakeRunner }
  15. TFPMakeRunner = Class(TPackagehandler)
  16. Protected
  17. Function RunFPMake(const Command:string):Integer;
  18. end;
  19. { TFPMakeRunnerBuild }
  20. TFPMakeRunnerBuild = Class(TFPMakeRunner)
  21. Public
  22. Function Execute(const Args:TActionArgs):boolean;override;
  23. end;
  24. { TFPMakeRunnerInstall }
  25. TFPMakeRunnerInstall = Class(TFPMakeRunner)
  26. Public
  27. Function Execute(const Args:TActionArgs):boolean;override;
  28. end;
  29. { TFPMakeRunnerManifest }
  30. TFPMakeRunnerManifest = Class(TFPMakeRunner)
  31. Public
  32. Function Execute(const Args:TActionArgs):boolean;override;
  33. end;
  34. implementation
  35. uses
  36. pkgoptions,
  37. pkgglobals,
  38. pkgmessages;
  39. { TFPMakeCompiler }
  40. Procedure TFPMakeCompiler.CompileFPMake;
  41. Var
  42. O,C : String;
  43. RTLDir,
  44. FPPkgDir,
  45. FPMakeBin,
  46. FPMakeSrc : string;
  47. HaveFpmake : boolean;
  48. begin
  49. SetCurrentDir(PackageBuildPath);
  50. { Check for fpmake source }
  51. FPMakeBin:='fpmake'+ExeExt;
  52. FPMakeSrc:='fpmake.pp';
  53. HaveFpmake:=FileExists(FPMakeSrc);
  54. If Not HaveFPMake then
  55. begin
  56. HaveFPMake:=FileExists('fpmake.pas');
  57. If HaveFPMake then
  58. FPMakeSrc:='fpmake.pas';
  59. end;
  60. { Need to compile fpmake executable? }
  61. if not FileExists(FPMakeBin) or
  62. (FileAge(FPMakeBin)<FileAge(FPMakeSrc)) then
  63. begin
  64. if Not HaveFPMake then
  65. Error(SErrMissingFPMake);
  66. { Detect installed units directories }
  67. if not DirectoryExists(Defaults.FPMakeUnitDir) then
  68. Error(SErrMissingDirectory,[Defaults.FPMakeUnitDir]);
  69. RTLDir:=Defaults.FPMakeUnitDir+'..'+PathDelim+'rtl'+PathDelim;
  70. if not DirectoryExists(RTLDir) then
  71. Error(SErrMissingDirectory,[RTLDir]);
  72. FPPkgDir:=Defaults.FPMakeUnitDir+'..'+PathDelim+'fppkg'+PathDelim;
  73. if not DirectoryExists(FPPkgDir) then
  74. FPPkgDir:='';
  75. { Call compiler }
  76. C:=Defaults.FPMakeCompiler;
  77. O:='-vi -n -Fu'+Defaults.FPMakeUnitDir+' -Fu'+RTLDir;
  78. // if FPPkgDir<>'' then
  79. // O:=O+' -Fu'+FPPkgDir+' -Fafpmkpkg';
  80. O:=O+' '+FPmakeSrc;
  81. If ExecuteProcess(C,O)<>0 then
  82. Error(SErrFailedToCompileFPCMake)
  83. end
  84. else
  85. Log(vCommands,SLogNotCompilingFPMake);
  86. end;
  87. function TFPMakeCompiler.Execute(const Args:TActionArgs):boolean;
  88. begin
  89. {$warning TODO Check arguments}
  90. CompileFPMake;
  91. result:=true;
  92. end;
  93. { TFPMakeRunner }
  94. Function TFPMakeRunner.RunFPMake(const Command:string) : Integer;
  95. Var
  96. I : integer;
  97. FPMakeBin : string;
  98. begin
  99. { Maybe compile fpmake executable? }
  100. ExecuteAction(CurrentPackage,'compilefpmake');
  101. { Run FPMake }
  102. FPMakeBin:='fpmake'+ExeExt;
  103. SetCurrentDir(PackageBuildPath);
  104. Result:=ExecuteProcess(FPMakeBin,Command);
  105. end;
  106. function TFPMakeRunnerBuild.Execute(const Args:TActionArgs):boolean;
  107. begin
  108. result:=(RunFPMake('build')=0);
  109. end;
  110. function TFPMakeRunnerInstall.Execute(const Args:TActionArgs):boolean;
  111. begin
  112. result:=(RunFPMake('install')=0);
  113. end;
  114. function TFPMakeRunnerManifest.Execute(const Args:TActionArgs):boolean;
  115. begin
  116. result:=(RunFPMake('manifest')=0);
  117. end;
  118. initialization
  119. RegisterPkgHandler('compilefpmake',TFPMakeCompiler);
  120. RegisterPkgHandler('fpmakebuild',TFPMakeRunnerBuild);
  121. RegisterPkgHandler('fpmakeinstall',TFPMakeRunnerInstall);
  122. RegisterPkgHandler('fpmakemanifest',TFPMakeRunnerManifest);
  123. end.