BuildCommon.js 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. var fs = require('fs-extra');
  2. var os = require('os');
  3. var path = require("path");
  4. var host = require("./Host");
  5. var atomicRoot = host.atomicRoot;
  6. var glob = require('glob');
  7. var Tslint = require("tslint");
  8. var fso = require('fs');
  9. var buildInfoDir = atomicRoot + "Source/AtomicBuildInfo/";
  10. var editorAppFolder = host.artifactsRoot + "AtomicEditor/";
  11. var toolDataFolder = editorAppFolder + "Resources/ToolData/";
  12. var jsDocFolder = host.artifactsRoot + "Build/JSDoc/";
  13. namespace('build', function() {
  14. // Linting task
  15. task('lint_typescript', {
  16. async: true
  17. }, function(fileMask, failOnError) {
  18. console.log("TSLINT: Linting files in " + fileMask);
  19. var lintConfig = JSON.parse(fs.readFileSync("./Script/tslint.json"));
  20. var options = {
  21. configuration: lintConfig,
  22. formatter: "prose"
  23. };
  24. // lint
  25. // Since TSLint does not yet support recursively searching for files, then we need to
  26. // create a command per file. The main issue with this is that it will abort on the first error instead
  27. // of listing out all lint errors
  28. glob(fileMask, function(err, results) {
  29. var lintErrors = [];
  30. results.forEach(function(filename) {
  31. var contents = fs.readFileSync(filename, "utf8");
  32. var ll = new Tslint(filename, contents, options);
  33. var result = ll.lint();
  34. if (result.failureCount > 0) {
  35. lintErrors.push(result.output);
  36. }
  37. });
  38. if (lintErrors.length > 0) {
  39. console.warn("TSLINT: WARNING - Lint errors detected");
  40. console.warn(lintErrors.join(''));
  41. if (failOnError) {
  42. fail("TSLint errors detected");
  43. }
  44. }
  45. complete();
  46. });
  47. });
  48. // precreate script bindgs so they can be picked up by CMake
  49. task('precreateScriptBindings', {
  50. async: true
  51. }, function(clean) {
  52. if (clean === undefined) {
  53. clean = true;
  54. }
  55. console.log("Precreating script bindings");
  56. if (clean) {
  57. common.cleanCreateDir(common.getGenScriptRootDir())
  58. }
  59. common.createGenScriptFiles();
  60. complete();
  61. });
  62. function fileExists(filePath)
  63. {
  64. try
  65. {
  66. return fs.statSync(filePath).isFile();
  67. }
  68. catch (err)
  69. {
  70. return false;
  71. }
  72. }
  73. task('genAtomicNET', {
  74. async:true
  75. }, function(platform, configuration) {
  76. if (configuration != "Debug" && configuration != "Release")
  77. configuration = "Release";
  78. // Compile AtomicNET assemblies
  79. var cmds = [];
  80. cmds.push(host.atomicTool + " net compile " + atomicRoot + "Script/AtomicNET/AtomicNETProject.json -platform " + platform + " -config " + configuration);
  81. jake.exec(cmds, function() {
  82. complete();
  83. }, {
  84. printStdout: true
  85. });
  86. })
  87. task('genscripts', {
  88. async: true
  89. }, function(force) {
  90. // default to true
  91. if (force != "true" && force != "false") {
  92. force = "true";
  93. }
  94. var anyZero = false;
  95. if (force != "true") {
  96. var filenames = common.getGenScriptFilenames();
  97. for (var i in filenames) {
  98. if (!fileExists(filenames[i]))
  99. {
  100. console.log("genscripts: file missing, regenerating script bindings: " + filenames[i]);
  101. anyZero = true;
  102. break;
  103. }
  104. var stats = fs.statSync(filenames[i]);
  105. if (stats["size"] == 0) {
  106. console.log("genscripts: file zero size, regenerating script bindings: " + filenames[i]);
  107. anyZero = true;
  108. break;
  109. }
  110. }
  111. if (!anyZero)
  112. return;
  113. }
  114. process.chdir(atomicRoot);
  115. var modules = host.getScriptModules();
  116. var bindCmd = host.atomicTool + " bind \"" + atomicRoot + "\" ";
  117. var node;
  118. var tsc = "./Build/node_modules/typescript/lib/tsc";
  119. var tslint = "./Build/node_modules/tslint/lib/tslint-cli";
  120. var dtsGenerator = "./Build/node_modules/dts-generator/bin/dts-generator";
  121. switch(os.platform()) {
  122. case "win32":
  123. node = "Build\\Windows\\node\\node.exe";
  124. break;
  125. case "darwin":
  126. node = "Build/Mac/node/node";
  127. break;
  128. case "linux":
  129. node = "Build/Linux/node/node";
  130. break;
  131. }
  132. var cmds = [];
  133. for (var pkgName in modules) {
  134. cmds.push(bindCmd + "Script/Packages/" + pkgName + "/");
  135. }
  136. if (node) {
  137. // compile
  138. cmds.push(node + " " + tsc + " -p ./Script");
  139. cmds.push(node + " " + tsc + " -p ./Script/AtomicWebViewEditor");
  140. // generate combined atomic.d.ts
  141. cmds.push(node + " " + dtsGenerator + " --name Atomic --project ./Script/TypeScript --out ./Script/TypeScript/dist/Atomic.d.ts");
  142. var lintTask = jake.Task['build:lint_typescript'];
  143. lintTask.addListener('complete', function () {
  144. console.log("\n\nLint: Typescript linting complete.\n\n");
  145. jake.exec(cmds, function() {
  146. // copy some external dependencies into the editor modules directory
  147. var editorModulesDir = "./Artifacts/Build/Resources/EditorData/AtomicEditor/EditorScripts/AtomicEditor/modules";
  148. var webeditorModulesDir = "./Data/AtomicEditor/CodeEditor/source/editorCore/modules";
  149. var nodeModulesDir = "./Build/node_modules";
  150. fs.mkdirsSync(editorModulesDir);
  151. // TypeScript
  152. fs.copySync(nodeModulesDir + "/typescript/lib/typescript.js", webeditorModulesDir + "/typescript.js")
  153. // copy lib.core.d.ts into the tool data directory
  154. fs.mkdirsSync("./Artifacts/Build/Resources/EditorData/AtomicEditor/EditorScripts/AtomicEditor/TypeScriptSupport");
  155. fs.copySync("./Build/node_modules/typescript/lib/lib.core.d.ts","./Data/AtomicEditor/TypeScriptSupport/lib.core.d.ts")
  156. // copy the combined Atomic.d.ts to the tool data directory
  157. fs.copySync("./Script/TypeScript/dist/Atomic.d.ts","./Data/AtomicEditor/TypeScriptSupport/Atomic.d.ts")
  158. complete();
  159. }, {
  160. printStdout: true
  161. });
  162. });
  163. lintTask.invoke("{./Script/AtomicEditor/**/*.ts,./Script/AtomicWebViewEditor/**/*.ts}", false);
  164. } else {
  165. throw new Error("Node not configured for this platform: " + os.platform());
  166. }
  167. });
  168. task('gendocs', {
  169. async: true
  170. }, function() {
  171. fs.copySync(atomicRoot + "Build/Docs/Readme.md", jsDocFolder + "Readme.md");
  172. fs.copySync(atomicRoot + "Build/Docs/atomic-theme", jsDocFolder + "atomic-theme");
  173. cmds = [
  174. "cd " + jsDocFolder + " && echo {} > package.json", // newer versions of npm require package.json to be in the folder or else it searches up the heirarchy
  175. "cd " + jsDocFolder + " && npm install typedoc",
  176. "cd " + jsDocFolder + " && ./node_modules/.bin/typedoc --out out " + toolDataFolder + "TypeScriptSupport/Atomic.d.ts --module commonjs --includeDeclarations --mode file --theme atomic-theme --name 'Atomic Game Engine' --readme ./Readme.md",
  177. ];
  178. jake.exec(cmds, function() {
  179. common.cleanCreateDir( toolDataFolder + "Docs");
  180. fs.copySync(jsDocFolder + "out", toolDataFolder + "Docs/JSDocs");
  181. complete();
  182. console.log( "completed installing API documentation" );
  183. }, {
  184. printStdout: true
  185. });
  186. });
  187. task('genexamples', {
  188. async: true
  189. }, function() {
  190. common.cleanCreateDir( toolDataFolder + "AtomicExamples");
  191. cmds = [
  192. "git clone https://github.com/AtomicGameEngine/AtomicExamples " + toolDataFolder + "AtomicExamples && rm -rf " + toolDataFolder + "AtomicExamples/.git",
  193. ];
  194. jake.exec(cmds, function() {
  195. complete();
  196. console.log( "completed installing example programs" )
  197. }, {
  198. printStdout: true
  199. });
  200. });
  201. }); // end of build namespace