diff options
author | Ludovic Courtès <ludo@gnu.org> | 2019-12-06 23:20:00 +0100 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2020-01-05 11:40:01 +0100 |
commit | 18c10b055e7b12cb33f69fabea04dc96c5b95906 (patch) | |
tree | 7abb772d5bbbc5c04a9baff3c6752887cc06d2dd | |
parent | ba6390df42a3495a6a68d9a32ddbb3edd090dc0d (diff) | |
download | guix-18c10b055e7b12cb33f69fabea04dc96c5b95906.tar.gz |
DRAFT gexp: Add 'object-sources'.
DRAFT: Add tests. * guix/gexp.scm (<object-sources>): New record type. (object-sources-compiler): New gexp compiler.
-rw-r--r-- | guix/gexp.scm | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/guix/gexp.scm b/guix/gexp.scm index 7bfff07766..ebde9eb7db 100644 --- a/guix/gexp.scm +++ b/guix/gexp.scm @@ -85,6 +85,9 @@ raw-derivation-closure raw-derivation-closure? + object-sources + object-sources? + load-path-expression gexp-modules @@ -323,6 +326,57 @@ The expander specifies how an object is converted to its sexp representation." (text-file "graph" (object->string refs))) (return obj)))) +;; Representation of all the sources and fixed-output derivations OBJ refers +;; to, directly or indirectly. +(define-record-type <object-sources> + (object-sources obj) + object-sources? + (obj object-sources-object)) + +(define-gexp-compiler (object-sources-compiler (obj <object-sources>) + system target) + (define (derivation-fixed-output-requirements drv) + (derivation-input-fold (lambda (input result) + (let ((drv (derivation-input-derivation input))) + (if (fixed-output-derivation? drv) + (cons drv result) + result))) + '() + (derivation-inputs drv) + + ;; Skip the dependencies of fixed-output + ;; derivations (e.g., 'git' for a 'git-fetch' + ;; derivation.) + #:skip-dependencies? + (compose fixed-output-derivation? + derivation-input-derivation))) + + (define (derivation-recursive-sources drv) + (delete-duplicates + (derivation-input-fold (lambda (input result) + (let ((drv (derivation-input-derivation input))) + (append (derivation-sources drv) + result))) + '() + (derivation-inputs drv)))) + + (mlet %store-monad ((obj (lower-object (object-sources-object obj) + system #:target target))) + (if (derivation? obj) + (let* ((drvs (derivation-fixed-output-requirements obj)) + (sources (derivation-recursive-sources obj)) + (pairs (append (map (lambda (drv) + `(,(store-path-package-name + (derivation-file-name drv)) + ,drv)) + drvs) + (map (lambda (file) + `(,(basename file) ,file)) + sources))) + (union (file-union "sources" pairs))) + (lower-object union system #:target target)) + (return obj)))) + ;;; ;;; File declarations. |