diff options
Diffstat (limited to 'guix')
-rw-r--r-- | guix/forge/utils.scm | 35 |
1 files changed, 34 insertions, 1 deletions
diff --git a/guix/forge/utils.scm b/guix/forge/utils.scm index dd980ef..f23f763 100644 --- a/guix/forge/utils.scm +++ b/guix/forge/utils.scm @@ -21,11 +21,44 @@ #:use-module (ice-9 match) #:use-module (guix derivations) #:use-module (guix gexp) + #:use-module (guix modules) #:use-module (guix monads) #:use-module (guix profiles) #:use-module (guix search-paths) #:use-module (guix store) - #:export (with-packages)) + #:export (with-manifest + with-packages)) + +(define (with-manifest manifest exp) + "Return a gexp executing EXP, another gexp, in a profile defined by +MANIFEST." + (with-imported-modules (source-module-closure '((guix search-paths))) + #~(begin + ;; Set the environment. + ;; We pull out match-lambda using module-ref instead of using + ;; use-modules because this gexp will be substituted into other + ;; gexps and use-modules only works at the top-level. + (let-syntax ((match-lambda (macro-transformer + (module-ref (resolve-module '(ice-9 match)) + 'match-lambda)))) + (let ((evaluate-search-paths (@@ (guix search-paths) evaluate-search-paths)) + (search-path-specification-variable (@@ (guix search-paths) + search-path-specification-variable)) + (sexp->search-path-specification (@@ (guix search-paths) + sexp->search-path-specification))) + (for-each (match-lambda + ((specification . value) + (setenv (search-path-specification-variable specification) + value))) + (evaluate-search-paths + (map sexp->search-path-specification + '#$(map search-path-specification->sexp + (manifest-search-paths manifest))) + (list #$(profile + (content manifest) + (allow-collisions? #t))))))) + ;; Run the provided expression. + #$exp))) (define (profile-with-packages packages) "Return profile with PACKAGES." |