pkgfpmake.pp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  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. O:=O+' '+FPmakeSrc;
  79. If ExecuteProcess(C,O)<>0 then
  80. Error(SErrFailedToCompileFPCMake)
  81. end
  82. else
  83. Log(vCommands,SLogNotCompilingFPMake);
  84. end;
  85. function TFPMakeCompiler.Execute(const Args:TActionArgs):boolean;
  86. begin
  87. {$warning TODO Check arguments}
  88. CompileFPMake;
  89. result:=true;
  90. end;
  91. { TFPMakeRunner }
  92. Function TFPMakeRunner.RunFPMake(const Command:string) : Integer;
  93. Var
  94. FPMakeBin : string;
  95. begin
  96. { Maybe compile fpmake executable? }
  97. ExecuteAction(CurrentPackage,'compilefpmake');
  98. { Run FPMake }
  99. FPMakeBin:='fpmake'+ExeExt;
  100. SetCurrentDir(PackageBuildPath);
  101. Result:=ExecuteProcess(FPMakeBin,Command);
  102. end;
  103. function TFPMakeRunnerBuild.Execute(const Args:TActionArgs):boolean;
  104. begin
  105. result:=(RunFPMake('build')=0);
  106. end;
  107. function TFPMakeRunnerInstall.Execute(const Args:TActionArgs):boolean;
  108. begin
  109. result:=(RunFPMake('install')=0);
  110. end;
  111. function TFPMakeRunnerManifest.Execute(const Args:TActionArgs):boolean;
  112. begin
  113. result:=(RunFPMake('manifest')=0);
  114. end;
  115. initialization
  116. RegisterPkgHandler('compilefpmake',TFPMakeCompiler);
  117. RegisterPkgHandler('fpmakebuild',TFPMakeRunnerBuild);
  118. RegisterPkgHandler('fpmakeinstall',TFPMakeRunnerInstall);
  119. RegisterPkgHandler('fpmakemanifest',TFPMakeRunnerManifest);
  120. end.