zilch/lang/ninja/src/config.sld

94 lines
4.3 KiB
Text
Raw Normal View History

(define-library (zilch lang ninja config)
(import
(scheme base) (scheme eval)
(zilch magic) (zilch nixpkgs) (zilch vfs)
(srfi 88)
(prefix (only scheme eval) scheme-))
(export
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-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-depfile!
parse-ninja-config)
(begin
(define-record-type <ninja-build-config>
(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!)
(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
((null? data) conf)
((null? (cdr data)) (error "Expected even list of directives in Zilch Ninja config"))
(else
(case (car data)
((#:env #:environment)
(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)))
(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)))
((#: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))
(processed-patch
(cond
((string? patch-base)
(lambda (target) patch-base))
((list? patch-base)
(scheme-eval patch-base))
(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 '()))
(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 " (keyword->string (car data)) " parsing Zilch Ninja config")))))))
(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))))