Fuse an app's native-compiled numeric-leaf fns plus its source into one static executable: no sidecar .so, no toolchain on the target. The AOT path (#148) already produced a prebuilt module + manifest; this links them into the jpm-built exe so the app ships as a single file. `jolt cgen-build -m NS -o OUT` stages a build dir (src/jolt-core symlinks into the jolt tree, a generated cg.c of the hot fns, an uberscript bundle of the app, and an entry that bakes the runtime, installs the native fns as var roots, and runs -main), then runs `jpm build` there — declare-native builds cg.a and declare-executable static-links it (jpm's create-executable marshals the module cfns and calls its static entry at startup). Build needs cc + jpm; the result needs neither. Mechanics that bit, codified in cgen_build.janet: stdlib_embed slurps .clj cwd-relative so the build runs in a repo-mirroring dir; jpm hardcodes ./project.janet and sets syspath=modpath; the executable's dofile imports cg and static-links cg.a, neither ordered nor release-built by default, so deps are wired explicitly; cleanup must lstat (the tree symlinks must not be followed); the inner build runs --workers=1 so it doesn't starve siblings in the parallel gate. test/integration/cgen-build-test.janet builds the mandelbrot fixture, runs it from a clean dir with no src/ and no cg.so, and checks the total at native speed. Closes jolt-a7ds. Co-authored-by: Yogthos <yogthos@gmail.com>
30 lines
988 B
Clojure
30 lines
988 B
Clojure
;; Fixture app for the cgen single-binary build test (jolt-a7ds).
|
|
;; count-point is a numeric leaf -> compiled to native C and statically linked;
|
|
;; run/-main stay bytecode and call into it. -main prints a deterministic total.
|
|
(ns cgapp)
|
|
|
|
(defn count-point [cr ci cap]
|
|
(loop [i 0 zr 0.0 zi 0.0]
|
|
(if (or (>= i cap) (> (+ (* zr zr) (* zi zi)) 4.0))
|
|
i
|
|
(recur (inc i)
|
|
(+ (- (* zr zr) (* zi zi)) cr)
|
|
(+ (* 2.0 (* zr zi)) ci)))))
|
|
|
|
(defn run [n]
|
|
(let [cap 200
|
|
nd (* 1.0 n)]
|
|
(loop [y 0 acc 0]
|
|
(if (< y n)
|
|
(let [ci (- (/ (* 2.0 y) nd) 1.0)
|
|
row (loop [x 0 a 0]
|
|
(if (< x n)
|
|
(let [cr (- (/ (* 2.0 x) nd) 1.5)]
|
|
(recur (inc x) (+ a (count-point cr ci cap))))
|
|
a))]
|
|
(recur (inc y) (+ acc row)))
|
|
acc))))
|
|
|
|
(defn -main [& args]
|
|
(let [n (if (seq args) (Integer/parseInt (first args)) 200)]
|
|
(println (run n))))
|