(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

@ -58,24 +58,29 @@
(when (and (ninja-build-config-depfile-path config) (file-exists? (ninja-build-config-depfile-path config)))
(set-ninja-build-config-depfile! config (alist->mapping (make-default-comparator) (call-with-input-file (ninja-build-config-depfile-path config) read))))
(define (export-depfiles finalized-drv)
(define config (finalized-drv-config finalized-drv))
(when (ninja-build-config-depfile-path config)
(call-with-output-file (ninja-build-config-depfile-path config) (lambda (p) (write (mapping->alist (finalized-drv-depfile finalized-drv)) p))))
(for-each (lambda (v) (export-depfiles (force (drv-rewrite-finalized-drv v)))) (finalized-drv-rewritten-drvs finalized-drv)))
(cond
((string=? (car args) "source")
(let*-values
(((_ configured-drv _ _ _ _) (setup-ninja-environment config))
(((_ configured-drv _ _ _ _ _) (setup-ninja-environment config '()))
((realised) (store-path-realised configured-drv))
((path) (if (null? (cdr args)) "src" (cadr args))))
(system* (string-append "cp -rf --no-preserve=ownership " realised "/src " (qs path)))
(system* (string-append "chmod -R u+rw " (qs path)))))
((string=? (car args) "build")
(if (null? (cdr args))
(let-values (((built export-depfile) (build-nixpkgs-drv-reproducibly config)))
(let ((output (build-nixpkgs-drv-reproducibly config)))
(for-each
(lambda (output-and-path)
(store-path-realised (cdr output-and-path))
(printf "~A\t-> ~S\n" (car output-and-path) (cdr output-and-path)))
built)
(when (ninja-build-config-depfile-path config)
(call-with-output-file (ninja-build-config-depfile-path config) (lambda (p) (write (mapping->alist (export-depfile)) p)))))
(finalized-drv-output-store-paths output))
(export-depfiles output))
(let-values (((_ _ _ edge-ref defaults _) (setup-ninja-environment config)))
(for-each
(lambda (target)
@ -84,7 +89,7 @@
(cdr args)))))
((string=? (car args) "diff")
(let*-values
(((_ configured-drv _ _ _ _) (setup-ninja-environment config))
(((_ configured-drv _ _ _ _ _) (setup-ninja-environment config '()))
((realised) (store-path-realised configured-drv))
((path) (or source "src")))
(process-execute "git" (list "diff" "--no-index" "--" (string-append realised "/src") path))))