code wiki / _hdl_build / nx_solarsim_pack.nx
nx_solarsim_pack.nx source
↩ module page · 86 lines · 4427 B
1// nx_solarsim_pack.nx -- Compiles NishiLang code to WebAssembly and packages it into a self-contained HTML file.
2import "nx_gate_gn.nx"
3import "nx_gate_base.nx"
4// nx_solarsim_pack.nx -- SOVEREIGN build orchestrator for the browser solar-system sim: nx -> WAT -> WASM ->
5// self-contained HTML, entirely via the Nishi ecosystem from the hardware rung up (sys_fork / sys_execve /
6// sys_wait4 / sys_dup3 / sys_openat / sys_read_file). NO shell, NO sh/cp/wc/xxd. Same fork/exec idiom as
7// nx_simlab_pack. (1) builds the three sovereign tools through the runner, (2) compiles runtime/nx_solarsim.nx to
8// WAT (capturing stdout to a file via dup3 = sovereign `> out`), (3) assembles WAT->WASM, (4) packages WASM->HTML
9// with nx_solarsim_html, (5) reports byte sizes + verifies the wasm magic. CWD must be nxc2.
10// license_tier: ORIGINAL expect_exit: 0
11import "nx_syscalls.nx"
12const K_MAGIC_2000: i64 = 2000
13
14func grow(name: *u8, ok: i64) -> i64 { if ok==1 { gw(" PASS " as *u8) } else { gw(" FAIL " as *u8) } gw(name); gw("
15" as *u8); return ok }
16
17// spawn `path` with up to 3 args; if redir != 0, child stdout -> that file (truncating). returns child exit code.
18func spawn(path: *u8, a0: *u8, a1: *u8, a2: *u8, redir: *u8) -> i64 {
19 let pid: i64 = sys_fork()
20 if pid == 0 {
21 if (redir as i64) != 0 {
22 let fd: i64 = sys_openat_wr(redir, 420)
23 if fd >= 0 { sys_dup3(fd, 1, 0) }
24 } else {
25 let dn: i64 = sys_openat_wr("/dev/null\x00" as *u8, 420)
26 if dn >= 0 { sys_dup3(dn, 2, 0) }
27 }
28 let argv: *i64 = sys_mmap(64) as *i64
29 var n: i64 = 0
30 argv[0] = path as i64; n = 1
31 if (a0 as i64) != 0 { argv[n] = a0 as i64; n = n + 1 }
32 if (a1 as i64) != 0 { argv[n] = a1 as i64; n = n + 1 }
33 if (a2 as i64) != 0 { argv[n] = a2 as i64; n = n + 1 }
34 argv[n] = 0
35 let envp: *i64 = sys_mmap(16) as *i64
36 envp[0] = "PATH=/usr/bin:/bin\x00" as *u8 as i64; envp[1] = 0
37 sys_execve(path, argv, envp)
38 sys_exit(127)
39 }
40 let st: *i64 = sys_mmap(16) as *i64
41 sys_wait4(pid, st, 0)
42 return (st[0] >> 8) & 0xff
43}
44
45func fsize(path: *u8) -> i64 {
46 let lp: *i64 = sys_mmap(8) as *i64; lp[0] = 0
47 let p: *u8 = sys_read_file(path, lp)
48 if (p as i64) == 0 { return -1 }
49 return lp[0]
50}
51
52func main() -> i64 {
53 gw("=== nx_solarsim_pack: SOVEREIGN nx->wat->wasm->html (fork/exec, NO shell) ===\n")
54 let RUNNER: *u8 = "_offc/nx_sov_build_run.elf\x00" as *u8
55 let WAT_OUT: *u8 = "knowledge/nx_solarsim.wat\x00" as *u8
56 let WASM_OUT: *u8 = "web_assets/nx_solarsim.wasm\x00" as *u8
57 let HTML_OUT: *u8 = "knowledge/nx_solarsim.html\x00" as *u8
58
59 gw(" [1] build sovereign tools via the runner...\n")
60 spawn(RUNNER, "nx_compile_wat\x00" as *u8, 0 as *u8, 0 as *u8, "/dev/null\x00" as *u8)
61 spawn(RUNNER, "nx_wat_compiler\x00" as *u8, 0 as *u8, 0 as *u8, "/dev/null\x00" as *u8)
62 spawn(RUNNER, "nx_solarsim_html\x00" as *u8, 0 as *u8, 0 as *u8, "/dev/null\x00" as *u8)
63
64 gw(" [2] nx -> wat (capture stdout sovereignly via dup3)\n")
65 let c1: i64 = spawn("/tmp/nx_compile_wat.sov.elf\x00" as *u8, "runtime/nx_solarsim.nx\x00" as *u8, 0 as *u8, 0 as *u8, WAT_OUT)
66 gw(" rc="); gn(c1); gw(" wat_bytes="); gn(fsize(WAT_OUT)); gw("\n")
67
68 gw(" [3] wat -> wasm\n")
69 let c2: i64 = spawn("/tmp/nx_wat_compiler.sov.elf\x00" as *u8, WAT_OUT, WASM_OUT, 0 as *u8, 0 as *u8)
70 gw(" rc="); gn(c2); gw(" wasm_bytes="); gn(fsize(WASM_OUT)); gw("\n")
71
72 gw(" [4] wasm -> html\n")
73 let c3: i64 = spawn("/tmp/nx_solarsim_html.sov.elf\x00" as *u8, WASM_OUT, HTML_OUT, 0 as *u8, 0 as *u8)
74 gw(" rc="); gn(c3); gw(" html_bytes="); gn(fsize(HTML_OUT)); gw("\n")
75
76 let wsz: i64 = fsize(WASM_OUT); let hsz: i64 = fsize(HTML_OUT)
77 let lp: *i64 = sys_mmap(8) as *i64; let wb: *u8 = sys_read_file(WASM_OUT, lp)
78 var magic_ok: i64 = 0
79 if (wb as i64) != 0 { if lp[0] >= 8 { if wb[0]==(0 as u8) { if wb[1]==(0x61 as u8) { if wb[2]==(0x73 as u8) { if wb[3]==(0x6d as u8) { magic_ok=1 } } } } } }
80 gw(" wasm magic OK="); gn(magic_ok); gw(" wasm="); gn(wsz); gw("B html="); gn(hsz); gw("B\n")
81
82 var ok: i64 = 0
83 if magic_ok==1 { if hsz>K_MAGIC_2000 { ok=1 } }
84 if ok==1 { gw("SOLARSIM-PACK GREEN: sovereign wasm+html built (Nishi all the way up, no shell)\n"); sys_exit(0); return 0 }
85 gw("SOLARSIM-PACK RED\n"); sys_exit(1); return 1
86}