(zilch lang ninja): Support rewriting derivation inputs

This lets incremental Ninja builds depend on other incremental Ninja
builds.

Change-Id: I6a6a6964ef300cae2e180970048c8a4881c88e19
This commit is contained in:
puck 2025-07-26 15:42:17 +00:00
parent c1c606ee0b
commit 0023f3def8
4 changed files with 267 additions and 39 deletions

View file

@ -11,9 +11,14 @@
ninja-build-config-environment ninja-build-config-environment-drv
ninja-build-config-root-dir ninja-build-config-patches ninja-build-config-targets
ninja-build-config-override-source ninja-build-config-depfile ninja-build-config-depfile-path
ninja-build-config-disallow-elide
ninja-build-config-disallow-elide ninja-build-config-rewrites
set-ninja-build-config-root-dir! set-ninja-build-config-environment! set-ninja-build-config-depfile!
<drv-rewrite>
make-drv-rewrite drv-rewrite?
drv-rewrite-source-paths drv-rewrite-finalized-drv
drv-rewrite-vfs-bases drv-rewrite-overlay-paths
parse-ninja-config)
@ -21,7 +26,7 @@
;; Represents a parsed Ninja build configuration.
;; See `parse-ninja-config` for the definition of these fields.
(define-record-type <ninja-build-config>
(make-ninja-build-config environment environment-drv root-dir patches targets override-source depfile depfile-path disallow-elide)
(make-ninja-build-config environment environment-drv root-dir patches targets override-source depfile depfile-path disallow-elide rewrites)
ninja-build-config?
(environment ninja-build-config-environment set-ninja-build-config-environment!)
(environment-drv ninja-build-config-environment-drv set-ninja-build-config-environment-drv!)
@ -31,7 +36,8 @@
(override-source ninja-build-config-override-source set-ninja-build-config-override-source!)
(depfile ninja-build-config-depfile set-ninja-build-config-depfile!)
(depfile-path ninja-build-config-depfile-path set-ninja-build-config-depfile-path!)
(disallow-elide ninja-build-config-disallow-elide set-ninja-build-config-disallow-elide!))
(disallow-elide ninja-build-config-disallow-elide set-ninja-build-config-disallow-elide!)
(rewrites ninja-build-config-rewrites set-ninja-build-config-rewrites!))
(define (parse-config-inner conf data)
(cond
@ -88,6 +94,11 @@
(list-val (if (list? val) val (list val))))
(set-ninja-build-config-targets! conf (append list-val (ninja-build-config-targets conf))))
(parse-config-inner conf (cddr data)))
((#:rewrite)
(let*
((val (list-ref data 1)))
(set-ninja-build-config-rewrites! conf (cons (cons (car val) (parse-ninja-config (cdr val))) (ninja-build-config-rewrites conf))))
(parse-config-inner conf (cddr data)))
(else (error (string-append "Unknown directive " (keyword->string (car data)) " parsing Zilch Ninja config")))))))
;; Parses a Zilch Ninja configuration file.
@ -118,7 +129,22 @@
;; incorrect.
;; - `target: "foo"`/`targets: '("foo" "bar")`: Build these targets instead
;; of the default specified in the Ninja file.
;; - `rewrite: ("<derivation name>" . <nested config>): A nested Zilch
;; Ninja configuration to swap out the input derivation with equivalent
;; name.
(define (parse-ninja-config config)
(unless (list? config)
(error "expected Zilch Ninja config to be a list"))
(parse-config-inner (make-ninja-build-config #f #f #f '() #f #f #f #f #f) config))))
(parse-config-inner (make-ninja-build-config #f #f #f '() #f #f #f #f #f '()) config))
;; `source-paths`: mapping of original store path to virtual path.
;; `finalized-drv`: promise of a <finalized-drv>
;; `vfs-bases`: mapping of virtualised path to base VFS
;; `overlay-paths`: alist of virtualised path to promise of a store path
(define-record-type <drv-rewrite>
(make-drv-rewrite source-paths finalized-drv vfs-bases overlay-paths)
drv-rewrite?
(source-paths drv-rewrite-source-paths)
(finalized-drv drv-rewrite-finalized-drv)
(vfs-bases drv-rewrite-vfs-bases)
(overlay-paths drv-rewrite-overlay-paths))))