2025-05-11 22:21:07 +00:00
|
|
|
(define-library (zilch lang ninja config)
|
|
|
|
|
(import
|
|
|
|
|
(scheme base) (scheme eval)
|
2025-05-11 22:21:07 +00:00
|
|
|
(zilch magic) (zilch nixpkgs) (zilch vfs)
|
|
|
|
|
(prefix (only scheme eval) scheme-))
|
2025-05-11 22:21:07 +00:00
|
|
|
|
|
|
|
|
(export
|
|
|
|
|
ninja-build-config?
|
2025-05-11 22:21:07 +00:00
|
|
|
ninja-build-config-environment ninja-build-config-environment-drv
|
|
|
|
|
ninja-build-config-root-dir ninja-build-config-patches ninja-build-config-targets
|
2025-05-11 22:21:07 +00:00
|
|
|
|
2025-05-11 22:21:07 +00:00
|
|
|
set-ninja-build-config-root-dir! set-ninja-build-config-environment!
|
|
|
|
|
|
2025-05-11 22:21:07 +00:00
|
|
|
parse-ninja-config)
|
|
|
|
|
|
|
|
|
|
(begin
|
|
|
|
|
(define-record-type <ninja-build-config>
|
2025-05-11 22:21:07 +00:00
|
|
|
(make-ninja-build-config environment environment-drv root-dir patches targets)
|
2025-05-11 22:21:07 +00:00
|
|
|
ninja-build-config?
|
|
|
|
|
(environment ninja-build-config-environment set-ninja-build-config-environment!)
|
2025-05-11 22:21:07 +00:00
|
|
|
(environment-drv ninja-build-config-environment-drv set-ninja-build-config-environment-drv!)
|
2025-05-11 22:21:07 +00:00
|
|
|
(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!))
|
|
|
|
|
|
|
|
|
|
(define (parse-config-inner conf data)
|
|
|
|
|
(cond
|
|
|
|
|
((null? data) conf)
|
|
|
|
|
((null? (cdr data)) (error "Expected even list of directives in Zilch Ninja config"))
|
|
|
|
|
(else
|
|
|
|
|
(case (car data)
|
|
|
|
|
((#:env #:environment)
|
2025-05-11 22:21:07 +00:00
|
|
|
(if (string? (list-ref data 1))
|
|
|
|
|
(let ((drv (cdar (nixpkgs-eval (list-ref data 1)))))
|
|
|
|
|
(set-ninja-build-config-environment! conf (environment-for-derivation drv))
|
|
|
|
|
(set-ninja-build-config-environment-drv! conf (store-path-drv drv)))
|
|
|
|
|
(set-ninja-build-config-environment! conf (list-ref data 1)))
|
2025-05-11 22:21:07 +00:00
|
|
|
(parse-config-inner conf (cddr data)))
|
|
|
|
|
((#:root)
|
|
|
|
|
(set-ninja-build-config-root-dir! conf (if (string? (list-ref data 1)) (vfs-from-directory (list-ref data 1)) (list-ref data 1)))
|
|
|
|
|
(parse-config-inner conf (cddr data)))
|
|
|
|
|
((#:patch)
|
|
|
|
|
(let*
|
|
|
|
|
((patch-base (list-ref data 1))
|
|
|
|
|
(processed-patch
|
|
|
|
|
(cond
|
|
|
|
|
((string? patch-base)
|
|
|
|
|
(lambda (target) patch-base))
|
|
|
|
|
((list? patch-base)
|
2025-05-11 22:21:07 +00:00
|
|
|
(scheme-eval patch-base))
|
2025-05-11 22:21:07 +00:00
|
|
|
(else patch-base))))
|
|
|
|
|
(set-ninja-build-config-patches! conf (cons processed-patch (ninja-build-config-patches conf))))
|
|
|
|
|
(parse-config-inner conf (cddr data)))
|
|
|
|
|
((#:target #:targets)
|
|
|
|
|
(when (eq? (ninja-build-config-targets conf) #f)
|
|
|
|
|
(set-ninja-build-config-targets! conf '()))
|
|
|
|
|
(let*
|
|
|
|
|
((val (list-ref data 1))
|
|
|
|
|
(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)))
|
|
|
|
|
(else (error (string-append "Unknown directive " (symbol->string (car data)) " parsing Zilch Ninja config")))))))
|
|
|
|
|
|
|
|
|
|
(define (parse-ninja-config config)
|
|
|
|
|
(unless (list? config)
|
|
|
|
|
(error "expected Zilch Ninja config to be a list"))
|
2025-05-11 22:21:07 +00:00
|
|
|
(parse-config-inner (make-ninja-build-config #f #f #f '() #f) config))))
|