Makes the inc8 fixpoint the actual build. host/chez/bootstrap.ss loads a seed
(prelude, image) pair and rebuilds the clojure.core prelude + compiler image from
source via the on-Chez compiler — read/analyze/emit all on Chez, zero Janet.
The seed (host/chez/seed/{prelude,image}.ss) is the checked-in bootstrap
compiler, minted once via the fixpoint (driver/mint-chez-seed* iterates
bootstrap.ss from the Janet-emitted pair to a joint byte-fixpoint). It's a joint
fixpoint: rebuilding from an up-to-date seed reproduces it exactly. So a fresh
checkout + Chez (no Janet) yields a working jolt.
test/chez/bootstrap-test.janet spawns only chez, asserts the rebuilt artifacts
match the seed byte-for-byte and compile+run real cases. Drift (seed sources
changed) fails the test with a re-mint pointer; host/chez/seed/README documents
re-minting.
72 lines
3.6 KiB
Text
72 lines
3.6 KiB
Text
# Chez Phase 3 inc9a (jolt-9phg) — the pure-Chez self-build (no Janet in the loop).
|
|
#
|
|
# inc8 proved the on-Chez compiler reproduces itself. inc9a makes that the actual
|
|
# build: host/chez/bootstrap.ss loads the CHECKED-IN seed (host/chez/seed/{prelude,
|
|
# image}.ss — the bootstrap compiler, minted once via the fixpoint) and rebuilds the
|
|
# clojure.core prelude + compiler image FROM SOURCE on Chez. No Janet is invoked in
|
|
# the compile path — this test only spawns `chez`; the read->analyze->emit is 100%
|
|
# Chez. So a fresh checkout + Chez (no Janet) yields a working jolt.
|
|
#
|
|
# The seed is a JOINT byte-fixpoint, so rebuilding from an up-to-date seed
|
|
# reproduces it exactly. If the seed SOURCES change (core tiers, the compiler, the
|
|
# host contract, the reader, emit-image.ss) the rebuilt artifacts will differ and
|
|
# this test fails — re-mint the seed with driver/mint-chez-seed* (see the failure
|
|
# message) and commit the refreshed seed.
|
|
#
|
|
# janet test/chez/bootstrap-test.janet
|
|
(import ../../host/chez/driver :as d)
|
|
|
|
(var total 0) (var fails 0)
|
|
(defn ok [name pred &opt extra]
|
|
(++ total)
|
|
(if pred (printf "ok: %s" name)
|
|
(do (++ fails) (printf "FAIL: %s %s" name (or extra "")))))
|
|
|
|
(unless (d/chez-available?)
|
|
(print "chez not on PATH — skipping bootstrap-test")
|
|
(os/exit 0))
|
|
|
|
(def seed-prelude "host/chez/seed/prelude.ss")
|
|
(def seed-image "host/chez/seed/image.ss")
|
|
(ok "checked-in seed prelude exists" (os/stat seed-prelude))
|
|
(ok "checked-in seed image exists" (os/stat seed-image))
|
|
|
|
(when (and (os/stat seed-prelude) (os/stat seed-image))
|
|
(def tmp (or (os/getenv "TMPDIR") "/tmp"))
|
|
(def out-prelude (string tmp "/jolt-bootstrap-pre-" (os/getpid) ".ss"))
|
|
(def out-image (string tmp "/jolt-bootstrap-img-" (os/getpid) ".ss"))
|
|
(def t0 (os/clock))
|
|
# PURE CHEZ: spawn `chez --script bootstrap.ss` — no Janet in the compile path.
|
|
(def [code out err] (d/run-bootstrap seed-prelude seed-image out-prelude out-image))
|
|
(printf "pure-Chez bootstrap pass: %.1fs" (- (os/clock) t0))
|
|
(ok "bootstrap.ss runs cleanly on Chez (no Janet)" (= code 0)
|
|
(string "exit " code " " (string/slice err 0 (min 300 (length err)))))
|
|
|
|
(defn- bytes= [a b] (and (os/stat a) (os/stat b)
|
|
(= (string (slurp a)) (string (slurp b)))))
|
|
(def remint "re-mint with driver/mint-chez-seed* and commit host/chez/seed/")
|
|
(when (= code 0)
|
|
(ok "rebuilt prelude == checked-in seed (joint fixpoint)" (bytes= out-prelude seed-prelude)
|
|
(string "seed is stale — " remint))
|
|
(ok "rebuilt image == checked-in seed (joint fixpoint)" (bytes= out-image seed-image)
|
|
(string "seed is stale — " remint))
|
|
|
|
# The rebuilt artifacts must be a WORKING compiler.
|
|
(def cases
|
|
[["(let [x 1 y 2] (+ x y))" "3"]
|
|
["(defn fib [n] (if (< n 2) n (+ (fib (- n 1)) (fib (- n 2))))) (fib 10)" "55"]
|
|
["(->> (range 10) (filter even?) (map #(* % %)) (reduce +))" "120"]
|
|
["(let [{:keys [a b] :or {b 9}} {:a 1}] [a b])" "[1 9]"]
|
|
["(require '[clojure.string :as s]) (s/join \",\" [1 2 3])" "1,2,3"]
|
|
["(loop [i 0 acc 0] (if (< i 5) (recur (inc i) (+ acc i)) acc))" "10"]])
|
|
(var pass 0)
|
|
(each [src want] cases
|
|
(def [c o _] (d/eval-zero-janet out-prelude out-image (string "(do " src ")")))
|
|
(when (and (= c 0) (= o want)) (++ pass)))
|
|
(ok "Chez-built artifacts compile+run real cases" (= pass (length cases))
|
|
(string pass "/" (length cases) " cases passed")))
|
|
|
|
(each p [out-prelude out-image] (when (os/stat p) (os/rm p))))
|
|
|
|
(printf "\nbootstrap-test: %d/%d checks passed" (- total fails) total)
|
|
(os/exit (if (zero? fails) 0 1))
|