build_web_example.odin 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. package karl2d_build_web_example
  2. import "core:os"
  3. import "core:fmt"
  4. import "core:path/filepath"
  5. import "core:os/os2"
  6. main :: proc() {
  7. if len(os.args) != 2 {
  8. fmt.eprintfln("Usage: 'odin run build_web_example -- example_directory_name'\nExample: 'odin run build_web_example -- minimal'")
  9. return
  10. }
  11. WEB_ENTRY_TEMPLATE :: #load("web_entry_templates/web_entry_template.odin")
  12. WEB_ENTRY_INDEX :: #load("web_entry_templates/index_template.html")
  13. dir := os.args[1]
  14. dir_handle, dir_handle_err := os.open(dir)
  15. fmt.ensuref(dir_handle_err == nil, "Failed finding directory %v. Error: %v", dir, dir_handle_err)
  16. dir_stat, dir_stat_err := os.fstat(dir_handle)
  17. fmt.ensuref(dir_stat_err == nil, "Failed checking status of directory %v. Error: %v", dir, dir_stat_err)
  18. fmt.ensuref(dir_stat.is_dir, "%v is not a directory!", dir)
  19. web_dir := filepath.join({dir, "web"})
  20. os.make_directory(web_dir, 0o644)
  21. web_build_dir := filepath.join({web_dir, "build"})
  22. os.write_entire_file(
  23. filepath.join(
  24. {web_dir, fmt.tprintf("%v_web_entry.odin", dir)},
  25. ),
  26. WEB_ENTRY_TEMPLATE,
  27. )
  28. os.write_entire_file(filepath.join({web_build_dir, "index.html"}), WEB_ENTRY_INDEX)
  29. _, odin_root_stdout, _, odin_root_err := os2.process_exec({
  30. command = { "odin", "root" },
  31. }, allocator = context.allocator)
  32. ensure(odin_root_err == nil, "Failed fetching 'odin root' (Odin in PATH needed!)")
  33. odin_root := string(odin_root_stdout)
  34. js_runtime_path := filepath.join({odin_root, "core", "sys", "wasm", "js", "odin.js"})
  35. fmt.ensuref(os2.exists(js_runtime_path), "File does not exist: %v -- It is the Odin Javascript runtime that this program needs to copy to the web build output folder!", js_runtime_path)
  36. os2.copy_file(filepath.join({web_build_dir, "odin.js"}), js_runtime_path)
  37. wasm_out_path := filepath.join({web_build_dir, "main.wasm"})
  38. build_status, build_std_out, build_std_err, build_err := os2.process_exec({
  39. command = {
  40. "odin",
  41. "build",
  42. web_dir,
  43. fmt.tprintf("-out:%v", wasm_out_path),
  44. "-target:js_wasm32",
  45. "-debug",
  46. "-vet",
  47. "-strict-style",
  48. },
  49. }, allocator = context.allocator)
  50. if len(build_std_out) > 0 {
  51. fmt.println(string(build_std_out))
  52. }
  53. if len(build_std_err) > 0 {
  54. fmt.println(string(build_std_err))
  55. }
  56. }