(define-library (zilch lang ninja config) (import (scheme base) (scheme eval) (zilch nixpkgs) (zilch vfs)) (export ninja-build-config? ninja-build-config-environment ninja-build-config-root-dir ninja-build-config-patches ninja-build-config-targets parse-ninja-config) (begin (define-record-type (make-ninja-build-config environment root-dir patches targets) ninja-build-config? (environment ninja-build-config-environment set-ninja-build-config-environment!) (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) (set-ninja-build-config-environment! conf (if (string? (list-ref data 1)) (environment-for-derivation (cdar (nixpkgs-eval (list-ref data 1)))) (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))) ((#:patch) (let* ((patch-base (list-ref data 1)) (processed-patch (cond ((string? patch-base) (lambda (target) patch-base)) ((list? patch-base) (eval patch-base (environment '(scheme base) '(zilch lang ninja)))) (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")) (parse-config-inner (make-ninja-build-config #f #f '() #f) config))))