Embed runtime source so a self-contained joltc can build apps
`joltc build` inlines the runtime (host/chez/rt.ss and everything it loads, the seed, compile-eval, loader, ffi, the vendored irregex) into each app binary by reading those files off disk. That works from a jolt checkout but not from the installed self-contained binary, which has no source tree: joltc build -m app.core => Exception in call-with-input-file: failed for host/chez/rt.ss: no such file build-joltc now bakes the exact transitive closure of files the build inlines into the binary as embedded resources (keyed by the path the `(load "…")` forms use), and build.ss/dce.ss read runtime source through bld-source-string, which takes the embedded copy when present and falls back to disk otherwise. So the same joltc builds apps both from a checkout and standalone. The release workflow now smoke-tests a self-contained build (compile a tiny app from an isolated dir, run it) — this is exactly what shipped broken, so it now gates the release. buildsmoke/shakesmoke/staticnativesmoke unchanged and green. Build tooling only — no re-mint, no runtime change.
This commit is contained in:
parent
f6bd2c6de5
commit
db08ecc1bc
4 changed files with 65 additions and 7 deletions
|
|
@ -141,12 +141,23 @@
|
|||
(q2 (let scan ((i (+ q1 1))) (if (char=? (string-ref s i) #\") i (scan (+ i 1))))))
|
||||
(substring s (+ q1 1) q2)))))
|
||||
|
||||
(define (bld-file-lines path)
|
||||
(call-with-input-file path
|
||||
(lambda (p)
|
||||
(let loop ((acc '()))
|
||||
(let ((l (get-line p)))
|
||||
(if (eof-object? l) (reverse acc) (loop (cons l acc))))))))
|
||||
;; runtime source for PATH: from the binary's embedded store if present (a
|
||||
;; self-contained joltc building an app, with no jolt checkout on disk), else read
|
||||
;; from disk (running from a source checkout). build-joltc embeds every runtime
|
||||
;; .ss the manifest inlines, so `build` never touches the filesystem for them.
|
||||
(define (bld-source-string path)
|
||||
(let ((emb (hashtable-ref embedded-resources path #f)))
|
||||
(if (string? emb) emb (read-file-string path))))
|
||||
|
||||
(define (bld-string-lines s)
|
||||
(let ((n (string-length s)))
|
||||
(let loop ((i 0) (start 0) (acc '()))
|
||||
(cond ((>= i n) (reverse (if (> i start) (cons (substring s start i) acc) acc)))
|
||||
((char=? (string-ref s i) #\newline)
|
||||
(loop (+ i 1) (+ i 1) (cons (substring s start i) acc)))
|
||||
(else (loop (+ i 1) start acc))))))
|
||||
|
||||
(define (bld-file-lines path) (bld-string-lines (bld-source-string path)))
|
||||
|
||||
;; Emit one line to OUT, recursively inlining a `(load ...)` of a repo file.
|
||||
(define (bld-inline-line line out depth)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue