(zilch lang ninja): process depfile, elide .h files where posssible

Incremental builds now take depfiles in account! Using a file that
contains a mapping of depfile to its cached contents, Zilch now
rebuilds less targets unnecessarily! If a build fails because an
include is added, it transparently rebuilds it with all possible header
dependencies, using the custom build scheduler built into Zilch. If an
include is removed, the target will be rebuilt with the new set of
headers the next time the CLI is invoked.

Change-Id: I6a6a6964c2fb191af4a474c45fd0f29623c588b0
This commit is contained in:
puck 2025-06-18 17:07:16 +00:00
parent 31bdc68f8c
commit 781e2b5534
5 changed files with 107 additions and 32 deletions

View file

@ -9,22 +9,26 @@
ninja-build-config?
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-override-source ninja-build-config-depfile ninja-build-config-depfile-path
ninja-build-config-disallow-elide
set-ninja-build-config-root-dir! set-ninja-build-config-environment!
set-ninja-build-config-root-dir! set-ninja-build-config-environment! set-ninja-build-config-depfile!
parse-ninja-config)
(begin
(define-record-type <ninja-build-config>
(make-ninja-build-config environment environment-drv root-dir patches targets override-source)
(make-ninja-build-config environment environment-drv root-dir patches targets override-source depfile depfile-path disallow-elide)
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!)
(root-dir ninja-build-config-root-dir set-ninja-build-config-root-dir!)
(patches ninja-build-config-patches set-ninja-build-config-patches!)
(targets ninja-build-config-targets set-ninja-build-config-targets!)
(override-source ninja-build-config-override-source set-ninja-build-config-override-source!))
(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!))
(define (parse-config-inner conf data)
(cond
@ -45,6 +49,12 @@
((#:override-source)
(set-ninja-build-config-override-source! conf (if (string? (list-ref data 1)) (vfs-from-directory (list-ref data 1)) (list-ref data 1)))
(parse-config-inner conf (cddr data)))
((#:depfile-path)
(set-ninja-build-config-depfile-path! conf (list-ref data 1))
(parse-config-inner conf (cddr data)))
((#:depfile)
(set-ninja-build-config-depfile! conf (list-ref data 1))
(parse-config-inner conf (cddr data)))
((#:patch)
(let*
((patch-base (list-ref data 1))
@ -57,6 +67,16 @@
(else patch-base))))
(set-ninja-build-config-patches! conf (cons processed-patch (ninja-build-config-patches conf))))
(parse-config-inner conf (cddr data)))
((#:disallow-elide)
(let*
((thunk (list-ref data 1))
(processed-thunk
(cond
((list? thunk)
(scheme-eval thunk))
(else thunk))))
(set-ninja-build-config-disallow-elide! conf processed-thunk))
(parse-config-inner conf (cddr data)))
((#:target #:targets)
(when (eq? (ninja-build-config-targets conf) #f)
(set-ninja-build-config-targets! conf '()))
@ -70,4 +90,4 @@
(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) config))))
(parse-config-inner (make-ninja-build-config #f #f #f '() #f #f #f #f #f) config))))