project.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400
  1. let project = new Project(flags.name);
  2. {
  3. project.add_define("KINC_G1");
  4. project.add_define("KINC_G2");
  5. let g5 = false;
  6. project.add_cfiles("sources/kinc/*");
  7. project.add_cfiles("sources/kinc/graphics2/*");
  8. project.add_cfiles("sources/kinc/graphics4/*");
  9. project.add_cfiles("sources/kinc/input/*");
  10. project.add_cfiles("sources/kinc/io/*");
  11. project.add_cfiles("sources/kinc/math/*");
  12. project.add_cfiles("sources/kinc/network/*");
  13. project.add_cfiles("sources/kinc/simd/*");
  14. project.add_cfiles("sources/kinc/threads/*");
  15. project.add_include_dir("sources");
  16. function add_backend(name) {
  17. project.add_cfiles("sources/backends/" + name + "/**");
  18. project.add_include_dir("sources/backends/" + name);
  19. }
  20. if (platform === "windows") {
  21. add_backend("windows");
  22. add_backend("microsoft");
  23. project.add_lib("dxguid");
  24. project.add_lib("dsound");
  25. project.add_lib("dinput8");
  26. project.add_define("_CRT_SECURE_NO_WARNINGS");
  27. project.add_define("_WINSOCK_DEPRECATED_NO_WARNINGS");
  28. project.add_lib("ws2_32");
  29. project.add_lib("Winhttp");
  30. project.add_lib("wbemuuid");
  31. if (graphics === "direct3d11") {
  32. add_backend("direct3d11");
  33. project.add_define("KINC_DIRECT3D");
  34. project.add_define("KINC_DIRECT3D11");
  35. project.add_lib("d3d11");
  36. }
  37. else if (graphics === "direct3d12" || graphics === "default") {
  38. g5 = true;
  39. add_backend("direct3d12");
  40. project.add_define("KINC_DIRECT3D");
  41. project.add_define("KINC_DIRECT3D12");
  42. project.add_lib("dxgi");
  43. project.add_lib("d3d12");
  44. }
  45. else {
  46. throw new Error("Graphics API " + graphics + " is not available for Windows.");
  47. }
  48. add_backend("wasapi");
  49. }
  50. else if (platform === "macos") {
  51. add_backend("apple");
  52. add_backend("macos");
  53. add_backend("posix");
  54. if (graphics === "metal" || graphics === "default") {
  55. g5 = true;
  56. add_backend("metal");
  57. project.add_define("KINC_METAL");
  58. project.add_lib("Metal");
  59. project.add_lib("MetalKit");
  60. }
  61. else {
  62. throw new Error("Graphics API " + graphics + " is not available for macOS.");
  63. }
  64. project.add_lib("IOKit");
  65. project.add_lib("Cocoa");
  66. project.add_lib("AppKit");
  67. project.add_lib("CoreAudio");
  68. project.add_lib("CoreData");
  69. project.add_lib("CoreMedia");
  70. project.add_lib("CoreVideo");
  71. project.add_lib("AVFoundation");
  72. project.add_lib("Foundation");
  73. }
  74. else if (platform === "ios") {
  75. add_backend("apple");
  76. add_backend("ios");
  77. add_backend("posix");
  78. if (graphics === "metal" || graphics === "default") {
  79. g5 = true;
  80. add_backend("metal");
  81. project.add_define("KINC_METAL");
  82. project.add_lib("Metal");
  83. }
  84. else {
  85. throw new Error("Graphics API " + graphics + " is not available for iOS.");
  86. }
  87. project.add_lib("UIKit");
  88. project.add_lib("Foundation");
  89. project.add_lib("CoreGraphics");
  90. project.add_lib("QuartzCore");
  91. project.add_lib("CoreAudio");
  92. project.add_lib("AudioToolbox");
  93. project.add_lib("CoreMotion");
  94. project.add_lib("AVFoundation");
  95. project.add_lib("CoreFoundation");
  96. project.add_lib("CoreVideo");
  97. project.add_lib("CoreMedia");
  98. }
  99. else if (platform === "android") {
  100. project.add_define("KINC_ANDROID");
  101. add_backend("android");
  102. add_backend("posix");
  103. if (graphics === "vulkan") {
  104. g5 = true;
  105. add_backend("vulkan");
  106. project.add_define("KINC_VULKAN");
  107. project.add_define("VK_USE_PLATFORM_ANDROID_KHR");
  108. project.add_lib("vulkan");
  109. project.add_define("KINC_ANDROID_API=24");
  110. }
  111. else if (graphics === "opengl" || graphics === "default") {
  112. add_backend("opengl");
  113. project.add_define("KINC_OPENGL");
  114. project.add_define("KINC_OPENGL_ES");
  115. project.add_define("KINC_ANDROID_API=19");
  116. project.add_define("KINC_EGL");
  117. }
  118. else {
  119. throw new Error("Graphics API " + graphics + " is not available for Android.");
  120. }
  121. project.add_lib("log");
  122. project.add_lib("android");
  123. project.add_lib("EGL");
  124. project.add_lib("GLESv3");
  125. project.add_lib("OpenSLES");
  126. project.add_lib("OpenMAXAL");
  127. }
  128. else if (platform === "wasm") {
  129. project.add_define("KINC_WASM");
  130. add_backend("wasm");
  131. project.add_include_dir("miniClib");
  132. project.add_cfiles("sources/libs/miniClib/**");
  133. if (graphics === "webgpu") {
  134. g5 = true;
  135. add_backend("webgpu");
  136. project.add_define("KINC_WEBGPU");
  137. }
  138. else if (graphics === "opengl" || graphics === "default") {
  139. add_backend("opengl");
  140. project.add_define("KINC_OPENGL");
  141. project.add_define("KINC_OPENGL_ES");
  142. }
  143. else {
  144. throw new Error("Graphics API " + graphics + " is not available for Wasm.");
  145. }
  146. }
  147. else if (platform === "linux") {
  148. add_backend("linux");
  149. add_backend("posix");
  150. project.add_lib("asound");
  151. project.add_lib("dl");
  152. project.add_lib("udev");
  153. // try {
  154. // if (!fs_exists("build")) {
  155. // fs_mkdir("build");
  156. // }
  157. // if (!fs_exists(path_join("build", "wayland"))) {
  158. // fs_mkdir(path_join("build", "wayland"));
  159. // }
  160. // const waylandDir = path_join("build", "wayland", "wayland-generated");
  161. // if (!fs_exists(waylandDir)) {
  162. // fs_mkdir(waylandDir);
  163. // }
  164. // let good_wayland = false;
  165. // const wayland_call = os_exec("wayland-scanner", ["--version"]);
  166. // if (wayland_call.status !== 0) {
  167. // throw "Could not run wayland-scanner to ask for its version";
  168. // }
  169. // const wayland_version = wayland_call.stderr;
  170. // try {
  171. // const scanner_versions = wayland_version.split(" ")[1].split(".");
  172. // const w_x = parseInt(scanner_versions[0]);
  173. // const w_y = parseInt(scanner_versions[1]);
  174. // const w_z = parseInt(scanner_versions[2]);
  175. // if (w_x > 1) {
  176. // good_wayland = true;
  177. // }
  178. // else if (w_x === 1) {
  179. // if (w_y > 17) {
  180. // good_wayland = true;
  181. // }
  182. // else if (w_y === 17) {
  183. // if (w_z >= 91) {
  184. // good_wayland = true;
  185. // }
  186. // }
  187. // }
  188. // }
  189. // catch (err) {
  190. // console.log("Could not parse wayland-version " + wayland_version);
  191. // }
  192. // let c_ending = ".c";
  193. // if (good_wayland) {
  194. // c_ending = ".c.h";
  195. // }
  196. // let chfiles = [];
  197. // function wl_protocol(protocol, file) {
  198. // chfiles.push(file);
  199. // const backend_path = path_resolve(waylandDir);
  200. // const protocol_path = path_resolve("/usr/share/wayland-protocols", protocol);
  201. // if (os_exec("wayland-scanner", ["private-code", protocol_path, path_resolve(backend_path, file + c_ending)]).status !== 0) {
  202. // throw "Failed to generate wayland protocol files for" + protocol;
  203. // }
  204. // if (os_exec("wayland-scanner", ["client-header", protocol_path, path_resolve(backend_path, file + ".h")]).status !== 0) {
  205. // throw "Failed to generate wayland protocol header for" + protocol;
  206. // }
  207. // }
  208. // if (os_exec("wayland-scanner", ["private-code", "/usr/share/wayland/wayland.xml", path_resolve(waylandDir, "wayland-protocol" + c_ending)]).status !== 0) {
  209. // throw "Failed to generate wayland protocol files for /usr/share/wayland/wayland.xml";
  210. // }
  211. // if (os_exec("wayland-scanner", ["client-header", "/usr/share/wayland/wayland.xml", path_resolve(waylandDir, "wayland-protocol.h")]).status !== 0) {
  212. // throw "Failed to generate wayland protocol header for /usr/share/wayland/wayland.xml";
  213. // }
  214. // wl_protocol("stable/viewporter/viewporter.xml", "wayland-viewporter");
  215. // wl_protocol("stable/xdg-shell/xdg-shell.xml", "xdg-shell");
  216. // wl_protocol("unstable/xdg-decoration/xdg-decoration-unstable-v1.xml", "xdg-decoration");
  217. // wl_protocol("unstable/tablet/tablet-unstable-v2.xml", "wayland-tablet");
  218. // wl_protocol("unstable/pointer-constraints/pointer-constraints-unstable-v1.xml", "wayland-pointer-constraint");
  219. // wl_protocol("unstable/relative-pointer/relative-pointer-unstable-v1.xml", "wayland-relative-pointer");
  220. // if (good_wayland) {
  221. // let cfile = "#include \"wayland-protocol.c.h\"\n";
  222. // for (const chfile of chfiles) {
  223. // cfile += "#include \"" + chfile + ".c.h\"\n";
  224. // }
  225. // fs_writefile(path_resolve(waylandDir, "waylandunit.c"), cfile);
  226. // }
  227. // project.add_include_dir(path_join("build", "wayland"));
  228. // project.add_cfiles(path_resolve(waylandDir, "**"));
  229. // }
  230. // catch (err) {
  231. // console.log("Failed to include wayland-support, setting KINC_NO_WAYLAND.");
  232. // console.log("Wayland error was: " + err);
  233. // project.add_define("KINC_NO_WAYLAND");
  234. // }
  235. if (graphics === "vulkan" || graphics === "default") {
  236. g5 = true;
  237. add_backend("vulkan");
  238. project.add_lib("vulkan");
  239. project.add_define("KINC_VULKAN");
  240. }
  241. else if (graphics === "opengl") {
  242. add_backend("opengl");
  243. project.add_lib("GL");
  244. project.add_define("KINC_OPENGL");
  245. project.add_lib("EGL");
  246. project.add_define("KINC_EGL");
  247. }
  248. else {
  249. throw new Error("Graphics API " + graphics + " is not available for Linux.");
  250. }
  251. project.add_define("_POSIX_C_SOURCE=200112L");
  252. project.add_define("_XOPEN_SOURCE=600");
  253. }
  254. project.add_define("KINC_G4");
  255. if (g5) {
  256. project.add_cfiles("sources/kinc/graphics5/*");
  257. project.add_define("KINC_G5");
  258. project.add_define("KINC_G4ONG5");
  259. add_backend("g4ong5");
  260. }
  261. }
  262. if (fs_exists(os_cwd() + "/icon.png")) {
  263. project.icon = "icon.png";
  264. if (platform === "macos" && fs_exists(os_cwd() + "/icon_macos.png")) {
  265. project.icon = "icon_macos.png";
  266. }
  267. }
  268. project.add_include_dir("sources/libs");
  269. project.add_cfiles("sources/libs/gc.c");
  270. project.add_cfiles("sources/libs/dir.c");
  271. project.add_include_dir("sources");
  272. project.add_cfiles("sources/iron.c");
  273. project.add_define("IRON_C_PATH=\"" + os_cwd() + "/build/iron.c" + "\"");
  274. project.add_define("EMBED_H_PATH=\"" + os_cwd() + "/build/embed.h" + "\"");
  275. if (flags.with_audio) {
  276. project.add_define("KINC_A1");
  277. project.add_define("KINC_A2");
  278. project.add_define("WITH_AUDIO");
  279. project.add_define("arm_audio");
  280. project.add_cfiles("sources/kinc/audio1/*");
  281. project.add_cfiles("sources/kinc/audio2/*");
  282. project.add_cfiles("sources/libs/stb_vorbis.c");
  283. }
  284. if (flags.with_eval) {
  285. project.add_define("WITH_EVAL");
  286. project.add_cfiles("sources/libs/quickjs/*.c");
  287. if (platform === "linux") {
  288. project.add_lib("m");
  289. project.add_define("_GNU_SOURCE");
  290. project.add_define("environ=__environ");
  291. project.add_define("sighandler_t=__sighandler_t");
  292. }
  293. else if (platform === "windows") {
  294. project.add_define("WIN32_LEAN_AND_MEAN");
  295. project.add_define("_WIN32_WINNT=0x0602");
  296. }
  297. }
  298. if (flags.with_iron) {
  299. project.add_define("WITH_IRON");
  300. project.add_cfiles("sources/*.c");
  301. }
  302. if (platform === "windows") {
  303. project.add_lib("Dbghelp"); // Stack walk
  304. project.add_lib("Dwmapi"); // DWMWA_USE_IMMERSIVE_DARK_MODE
  305. if (flags.with_d3dcompiler) {
  306. project.add_define("WITH_D3DCOMPILER");
  307. project.add_lib("d3d11");
  308. project.add_lib("d3dcompiler");
  309. }
  310. }
  311. else if (platform === "linux") {
  312. project.add_define("KINC_NO_WAYLAND"); // TODO: kinc_wayland_display_init() not implemented
  313. }
  314. else if (platform === "android") {
  315. project.add_define("IDLE_SLEEP");
  316. project.target_options.android.package = flags.package;
  317. project.target_options.android.permissions = ["android.permission.WRITE_EXTERNAL_STORAGE", "android.permission.READ_EXTERNAL_STORAGE", "android.permission.INTERNET"];
  318. project.target_options.android.screenOrientation = ["sensorLandscape"];
  319. project.target_options.android.minSdkVersion = 30;
  320. project.target_options.android.targetSdkVersion = 33;
  321. project.target_options.android.versionCode = 240000;
  322. project.target_options.android.versionName = "1.0 alpha";
  323. }
  324. else if (platform === "ios") {
  325. project.add_define("IDLE_SLEEP");
  326. }
  327. if (flags.with_nfd && (platform === "windows" || platform === "linux" || platform === "macos")) {
  328. project.add_define("WITH_NFD");
  329. project.add_include_dir("sources/libs/nfd");
  330. project.add_cfiles("sources/libs/nfd/nfd_common.c");
  331. if (platform === "windows") {
  332. project.add_cfiles("sources/libs/nfd/nfd_win.cpp");
  333. }
  334. else if (platform === "linux") {
  335. project.add_cfiles("sources/libs/nfd/nfd_gtk.c");
  336. project.add_include_dir("/usr/include/gtk-3.0");
  337. project.add_include_dir("/usr/include/glib-2.0");
  338. project.add_include_dir("/usr/lib/x86_64-linux-gnu/glib-2.0/include");
  339. project.add_include_dir("/usr/include/pango-1.0");
  340. project.add_include_dir("/usr/include/cairo");
  341. project.add_include_dir("/usr/include/gdk-pixbuf-2.0");
  342. project.add_include_dir("/usr/include/atk-1.0");
  343. project.add_include_dir("/usr/lib64/glib-2.0/include");
  344. project.add_include_dir("/usr/lib/glib-2.0/include");
  345. project.add_include_dir("/usr/include/harfbuzz");
  346. project.add_lib("gtk-3");
  347. project.add_lib("gobject-2.0");
  348. project.add_lib("glib-2.0");
  349. }
  350. else {
  351. project.add_cfiles("sources/libs/nfd/nfd_cocoa.m");
  352. }
  353. }
  354. if (flags.with_compress) {
  355. project.add_define("WITH_COMPRESS");
  356. }
  357. if (flags.with_image_write) {
  358. project.add_define("WITH_IMAGE_WRITE");
  359. }
  360. if (flags.with_video_write) {
  361. project.add_define("WITH_VIDEO_WRITE");
  362. project.add_cfiles("sources/libs/minimp4.c");
  363. project.add_cfiles("sources/libs/minih264e.c");
  364. }
  365. project.flatten();
  366. return project;