fpmake.pp 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. {$mode objfpc}{$H+}
  2. program fpmake;
  3. uses {$ifdef unix}cthreads,{$endif} sysutils, fpmkunit;
  4. function FilenameIsAbsolute(const TheFilename: string):boolean;
  5. begin
  6. {$IFDEF WINDOWS}
  7. // windows
  8. Result:=((length(TheFilename)>=2) and (TheFilename[1] in ['A'..'Z','a'..'z'])
  9. and (TheFilename[2]=':'))
  10. or ((length(TheFilename)>=2)
  11. and (TheFilename[1]='\') and (TheFilename[2]='\'));
  12. {$ELSE}
  13. // unix
  14. Result:=(TheFilename<>'') and (TheFilename[1]='/');
  15. {$ENDIF}
  16. end;
  17. Procedure CreateConfigFile(CfgFile,BaseDir : String; rtl_js_dir: string = '');
  18. Var
  19. F : Text;
  20. Procedure AddLn(S : String);
  21. begin
  22. Writeln(F,S);
  23. end;
  24. begin
  25. if not ForceDirectories(ExtractFilePath(CfgFile)) then
  26. begin
  27. Writeln(StdErr,'Could not create destination directory ',ExtractFilePath(CfgFile));
  28. Halt(2);
  29. end;
  30. Assign(F,CfgFile);
  31. try
  32. Rewrite(F);
  33. except
  34. On E : exception do
  35. begin
  36. Writeln(StdErr,'Could not create config file ',CfgFile,' : ',E.Message);
  37. Halt(3);
  38. end;
  39. end;
  40. if (BaseDir<>'') then
  41. BaseDir:=IncludeTrailingPathDelimiter(BaseDir);
  42. Addln('#');
  43. Addln('# Minimal config file for pas2js compiler');
  44. Addln('#');
  45. Addln('# -d is the same as #DEFINE');
  46. Addln('# -u is the same as #UNDEF');
  47. Addln('#');
  48. Addln('# Write always a nice logo ;)');
  49. Addln('-l');
  50. Addln('');
  51. Addln('# Display Warnings, Notes and Hints');
  52. Addln('-vwnh');
  53. Addln('# If you don''t want so much verbosity use');
  54. Addln('#-vw');
  55. Addln('');
  56. if FilenameIsAbsolute(BaseDir) then
  57. Addln('-Fu'+BaseDir+'*')
  58. else
  59. Addln('-Fu$CfgDir'+PathDelim+BaseDir+'*');
  60. if rtl_js_dir<>'' then
  61. if FilenameIsAbsolute(rtl_js_dir) then
  62. AddLn('-Fu'+rtl_js_dir)
  63. else
  64. AddLn('-Fu$CfgDir'+PathDelim+rtl_js_dir);
  65. Addln('');
  66. Addln('#IFDEF nodejs');
  67. Addln('-Jirtl.js');
  68. Addln('#ENDIF');
  69. Addln('');
  70. Addln('# Put all generated JavaScript into one file');
  71. Addln('-Jc');
  72. Addln('');
  73. Addln('# end.');
  74. Close(F);
  75. end;
  76. Procedure AddInstallFiles(Files : TConditionalDestStrings; ADir,AllowedExt,APrefix : String);
  77. Var
  78. Info : TSearchRec;
  79. ADestDir,E : String;
  80. P : Integer;
  81. begin
  82. ADestDir:=ADir;
  83. P:=Pos(PathDelim,ADestDir);
  84. if (P>0) then
  85. Delete(ADestDir,1,P);
  86. ADir:=IncludeTrailingPathDelimiter(ADir);
  87. ADestDir:=IncludeTrailingPathDelimiter(ADestDir);
  88. if FindFirst(aDir+AllFilesMask,0,Info)=0 then
  89. try
  90. Repeat
  91. E:=LowerCase(ExtractFileExt(Info.Name));
  92. if pos(E,AllowedExt)>0 then
  93. Files.Add(ADir+Info.Name,aPrefix+ADestDir);
  94. until (FindNext(Info)<>0);
  95. finally
  96. FindClose(Info);
  97. end;
  98. end;
  99. Procedure AddPackageFiles(Files : TConditionalDestStrings; ADir,APrefix : String);
  100. Const
  101. PackExt = '.pp.pas.inc.lpk';
  102. begin
  103. AddInstallFiles(Files,'packages'+PathDelim+ADir,packExt,aPrefix);
  104. end;
  105. Procedure AddDemoFiles(Files : TConditionalDestStrings; ADir,APrefix : String);
  106. Const
  107. DemoExt = '.pp.pas.inc.lpr.lpi.html.md';
  108. begin
  109. AddInstallFiles(Files,'demo'+PathDelim+ADir,demoExt,APrefix);
  110. end;
  111. Var
  112. P : TPackage;
  113. UnitDir,DemoDir,BD, TmpCfg: String;
  114. T: TTarget;
  115. begin
  116. With Installer do
  117. begin
  118. P:=AddPackage('pas2js');
  119. P.Author := 'Free Pascal Team';
  120. P.License := 'LGPL with modification';
  121. P.HomepageURL := 'www.freepascal.org';
  122. P.Description := 'Convert pascal sources to javascript.';
  123. P.Email := '[email protected]';
  124. P.NeedLibC:= false;
  125. P.Version:='3.3.1';
  126. P.SourcePath.Add('compiler/utils/pas2js');
  127. P.UnitPath.Add('compiler/utils/pas2js');
  128. P.UnitPath.Add('compiler/packages/pastojs/src');
  129. P.UnitPath.Add('compiler/packages/fcl-passrc/src');
  130. P.UnitPath.Add('compiler/packages/fcl-js/src');
  131. P.UnitPath.Add('compiler/packages/fcl-json/src');
  132. {$IFDEF VER3_0}
  133. P.UnitPath.Add('compiler/packages/compat');
  134. {$ENDIF}
  135. P.UnitPath.Add('compiler/packages/webidl/src');
  136. P.IncludePath.Add('compiler/packages/pastojs/src');
  137. P.Dependencies.Clear;
  138. Defaults.Options.Add('-Sc');
  139. P.Targets.AddProgram('pas2js.pp');
  140. P.Targets.AddProgram('webidl2pas.pp');
  141. {$IF FPC_FULLVERSION>=30101}
  142. P.Targets.AddProgram('compileserver.pp');
  143. P.Targets.AddProgram('makestub.pp');
  144. T:=P.Targets.AddLibrary('pas2jslib.pp');
  145. if Defaults.OS=Linux then
  146. T.Options.Add('-olibpas2js.so');
  147. {$ENDIF}
  148. P.Targets.AddImplicitUnit('fpjson',False).ResourceStrings:=True;
  149. P.Targets.AddImplicitUnit('fppas2js',False).ResourceStrings:=True;
  150. P.Targets.AddImplicitUnit('fppjssrcmap',False);
  151. P.Targets.AddImplicitUnit('jsbase',False);
  152. P.Targets.AddImplicitUnit('jsonparser',False).ResourceStrings:=True;
  153. P.Targets.AddImplicitUnit('jsonreader',False).ResourceStrings:=True;
  154. P.Targets.AddImplicitUnit('jsonscanner',False).ResourceStrings:=True;
  155. P.Targets.AddImplicitUnit('jssrcmap',False);
  156. P.Targets.AddImplicitUnit('jstoken',False);
  157. P.Targets.AddImplicitUnit('jstree',False);
  158. P.Targets.AddImplicitUnit('jswriter',False).ResourceStrings:=True;
  159. P.Targets.AddImplicitUnit('pas2jscompiler',False);
  160. P.Targets.AddImplicitUnit('pas2jslogger',False);
  161. P.Targets.AddImplicitUnit('pas2jspparser',False);
  162. P.Targets.AddImplicitUnit('pas2jsuseanalyzer',False);
  163. P.Targets.AddImplicitUnit('pas2jsfs',False);
  164. P.Targets.AddImplicitUnit('pas2jsfilecache',False);
  165. P.Targets.AddImplicitUnit('pas2jsfileutils',False);
  166. P.Targets.AddImplicitUnit('pas2jslibcompiler',False);
  167. P.Targets.AddImplicitUnit('pas2jsfscompiler',False);
  168. P.Targets.AddImplicitUnit('pas2jscompilercfg',False);
  169. P.Targets.AddImplicitUnit('pas2jscompilerpp',False);
  170. P.Targets.AddImplicitUnit('pas2jsutils',False);
  171. P.Targets.AddImplicitUnit('pasresolveeval',False).ResourceStrings:=True;
  172. P.Targets.AddImplicitUnit('pasresolver',False);
  173. P.Targets.AddImplicitUnit('pastree',False).ResourceStrings:=True;
  174. P.Targets.AddImplicitUnit('pasuseanalyzer',False);
  175. P.Targets.AddImplicitUnit('pparser',False).ResourceStrings:=True;
  176. P.Targets.AddImplicitUnit('pscanner',False).ResourceStrings:=True;
  177. P.Targets.AddImplicitUnit('pascodegen.o',False);
  178. P.Targets.AddImplicitUnit('webidldefs',False).ResourceStrings:=True;
  179. P.Targets.AddImplicitUnit('webidlscanner',False).ResourceStrings:=True;
  180. P.Targets.AddImplicitUnit('webidlparser',False).ResourceStrings:=True;
  181. P.Targets.AddImplicitUnit('webidltopas',False).ResourceStrings:=True;
  182. P.Targets.AddImplicitUnit('stubcreator',False).ResourceStrings:=True;
  183. // Determine unit files location
  184. BD:=IncludeTrailingPathDelimiter(P.GetBinOutputDir(Defaults.BuildCPU,Defaults.BuildOS));
  185. TmpCfg:='compiler/utils/pas2js/dist/pas2js.cfg';
  186. Case Installer.RunMode of
  187. rmCompile,rmBuild:
  188. begin
  189. if not FileExists(BD+'pas2js.cfg') then
  190. CreateConfigFile(BD+'pas2js.cfg',SetDirSeparators('../../packages'),
  191. SetDirSeparators('../../compiler/utils/pas2js/dist/'));
  192. end;
  193. rmInstall,rmArchive,rmZipInstall:
  194. begin
  195. // UnitDir = some\path\units\i386-win32\..\..\..\pas2js\
  196. UnitDir:=ExcludeTrailingPathDelimiter(Defaults.UnitInstallDir);
  197. UnitDir:=ExcludeTrailingPathDelimiter(ExtractFilePath(UnitDir));
  198. UnitDir:=ExcludeTrailingPathDelimiter(ExtractFilePath(UnitDir));
  199. UnitDir:=ExtractFilePath(UnitDir);
  200. UnitDir:=UnitDir+'pas2js'+PathDelim;
  201. // Config file
  202. // Create config file
  203. CreateConfigFile(TmpCfg,ExtractRelativePath(IncludeTrailingPathDelimiter(Defaults.BinInstallDir),IncludeTrailingPathDelimiter(UnitDir)));
  204. P.InstallFiles.Add(TmpCfg,Defaults.BinInstallDir);
  205. P.InstallFiles.Add('compiler/utils/pas2js/dist/rtl.js',IncludeTrailingPathDelimiter(UnitDir)+'rtl');
  206. AddPackageFiles(P.InstallFiles,'chartjs',UnitDir);
  207. AddPackageFiles(P.InstallFiles,'dataabstract',UnitDir);
  208. AddPackageFiles(P.InstallFiles,'fcl-base',UnitDir);
  209. AddPackageFiles(P.InstallFiles,'fcl-db',UnitDir);
  210. AddPackageFiles(P.InstallFiles,'fpcunit',UnitDir);
  211. AddPackageFiles(P.InstallFiles,'jspdf',UnitDir);
  212. AddPackageFiles(P.InstallFiles,'nodejs',UnitDir);
  213. AddPackageFiles(P.InstallFiles,'rtl',UnitDir);
  214. // Demo files
  215. DemoDir:=IncludeTrailingPathDelimiter(Defaults.ExamplesInstallDir);
  216. AddDemoFiles(P.InstallFiles,'fcldb',DemoDir);
  217. AddDemoFiles(P.InstallFiles,'fpcunit',DemoDir);
  218. AddDemoFiles(P.InstallFiles,'fpreport',DemoDir);
  219. AddDemoFiles(P.InstallFiles,'hotreload',DemoDir);
  220. AddDemoFiles(P.InstallFiles,'jquery',DemoDir);
  221. AddDemoFiles(P.InstallFiles,'rtl',DemoDir);
  222. end;
  223. rmClean:
  224. P.CleanFiles.Add(TmpCfg);
  225. rmDistClean:
  226. if FileExists(BD+'pas2js.cfg') then
  227. P.CleanFiles.Add(BD+'pas2js.cfg');
  228. end;
  229. Run;
  230. end;
  231. end.