From 7cdf45ef9664e4d35b2a04043cf0bba3f19d3b9f Mon Sep 17 00:00:00 2001 From: Puck Meerburg Date: Fri, 9 May 2025 13:09:49 +0000 Subject: [PATCH] (zilch lang ninja build): support phony rules --- lang/ninja/src/build.sld | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/lang/ninja/src/build.sld b/lang/ninja/src/build.sld index 461d305..b32a80f 100644 --- a/lang/ninja/src/build.sld +++ b/lang/ninja/src/build.sld @@ -49,12 +49,19 @@ (define (append-file path) (define input-file (mapping-ref edges path (lambda () (mapping-ref/default edges (normalize-path path) #f)))) - ; if input-file is 'base, this is part of the base vfs; we don't filter that right now. - (unless (eq? input-file 'base) - (if input-file - ; This file is produced by another build edge. Add it to our input vfs. + (cond + ; if input-file is 'base, this is part of the base vfs; we don't filter that right now. + ((eq? input-file 'base) #f) + + ; Phony rule; pass through the inputs literally. + ((and (pair? input-file) (eq? (car input-file) 'phony)) (for-each append-file (cdr input-file))) + + ; This file is produced by another build edge. Add it to our input vfs. + (input-file (let ((prev-copy-input-files copy-input-files)) - (set! copy-input-files #~,(string-append #$prev-copy-input-files "\n" "$COREUTILS/mkdir -p bdir/" relative-to-root "/$($COREUTILS/dirname " path "); $COREUTILS/cp -rf " #$(force input-file) " bdir/" relative-to-root "/" path))); (set! vfs (vfs-append-file vfs (normalize-path path) (force input-file))) + (set! copy-input-files #~,(string-append #$prev-copy-input-files "\n" "$COREUTILS/mkdir -p bdir/" relative-to-root "/$($COREUTILS/dirname " path "); $COREUTILS/cp -rf " #$(force input-file) " bdir/" relative-to-root "/" path)))) + + (else (unless (string-prefix? "/nix/store" path) (error "Path doesn't exist as build edge" path)))) @@ -65,7 +72,7 @@ (when (string-suffix? ".so.symbols" path) (let ((index (string-contains path ".p/"))) (append-file (string-copy path 0 index))))) - + ; Add the inputs, implicit dependencies, _and_ order-only dependencies to our vfs. (for-each append-file (build-edge-inputs current-edge)) (for-each append-file (build-edge-implicit-dependencies current-edge)) @@ -138,8 +145,13 @@ (for-each (lambda (edge) (define processed (delay (derivation-for-edge environment vfs-store-path relative-to edges edge))) - (for-each (lambda (v) (set! edges (mapping-set! edges v (delay #~,(string-append #$(force processed) "/" v))))) - (append (build-edge-outputs edge) (build-edge-implicit-outputs edge)))) + (if (build-edge-resolved edge) + (for-each (lambda (v) (set! edges (mapping-set! edges v (delay #~,(string-append #$(force processed) "/" v))))) + (append (build-edge-outputs edge) (build-edge-implicit-outputs edge))) + + ; This edge is phony; mark the edge as having its outputs. + (for-each (lambda (v) (set! edges (mapping-set! edges v (cons 'phony (build-edge-inputs edge))))) + (append (build-edge-outputs edge) (build-edge-implicit-outputs edge))))) (build-file-build-edges file)) (define edge-ref (lambda (path) (force (mapping-ref/default edges path #f))))