aboutsummaryrefslogtreecommitdiff
path: root/guix
diff options
context:
space:
mode:
Diffstat (limited to 'guix')
-rw-r--r--guix/build/graft.scm5
-rw-r--r--guix/derivations.scm4
-rw-r--r--guix/ftp-client.scm4
-rw-r--r--guix/grafts.scm15
-rw-r--r--guix/hash.scm4
-rw-r--r--guix/http-client.scm2
-rw-r--r--guix/pki.scm9
-rw-r--r--guix/scripts/archive.scm4
-rw-r--r--guix/scripts/authenticate.scm9
-rw-r--r--guix/scripts/build.scm84
-rw-r--r--guix/scripts/download.scm2
-rw-r--r--guix/scripts/hash.scm4
-rw-r--r--guix/scripts/lint.scm15
-rw-r--r--guix/scripts/offload.scm11
-rw-r--r--guix/scripts/publish.scm6
-rw-r--r--guix/scripts/refresh.scm2
-rwxr-xr-xguix/scripts/substitute.scm5
-rw-r--r--guix/serialization.scm5
-rw-r--r--guix/store.scm4
-rw-r--r--guix/tests.scm2
-rw-r--r--guix/utils.scm3
21 files changed, 125 insertions, 74 deletions
diff --git a/guix/build/graft.scm b/guix/build/graft.scm
index 7025b72fea..16df169ec7 100644
--- a/guix/build/graft.scm
+++ b/guix/build/graft.scm
@@ -307,11 +307,6 @@ file name pairs."
(else
(error "unsupported file type" stat)))))
- ;; XXX: Work around occasional "suspicious ownership or permission" daemon
- ;; errors that arise when we create the top-level /gnu/store/… directory as
- ;; #o777.
- (umask #o022)
-
;; Use 'exit-on-exception' to force an exit upon I/O errors, given that
;; 'n-par-for-each' silently swallows exceptions.
;; See <http://bugs.gnu.org/23581>.
diff --git a/guix/derivations.scm b/guix/derivations.scm
index 7f74ed6c77..e378a7cb03 100644
--- a/guix/derivations.scm
+++ b/guix/derivations.scm
@@ -23,7 +23,7 @@
#:use-module (srfi srfi-26)
#:use-module (srfi srfi-34)
#:use-module (srfi srfi-35)
- #:use-module (rnrs io ports)
+ #:use-module (ice-9 binary-ports)
#:use-module (rnrs bytevectors)
#:use-module (ice-9 match)
#:use-module (ice-9 rdelim)
@@ -885,7 +885,7 @@ recursively."
(define (substitute-file file initial replacements)
(define contents
(with-fluids ((%default-port-encoding #f))
- (call-with-input-file file get-string-all)))
+ (call-with-input-file file read-string)))
(let ((updated (substitute contents initial replacements)))
(if (string=? updated contents)
diff --git a/guix/ftp-client.scm b/guix/ftp-client.scm
index 22d4c7dde2..0a179282ed 100644
--- a/guix/ftp-client.scm
+++ b/guix/ftp-client.scm
@@ -1,5 +1,5 @@
;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2010, 2011, 2012, 2013, 2014, 2015 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -22,7 +22,7 @@
#:use-module (srfi srfi-11)
#:use-module (srfi srfi-26)
#:use-module (srfi srfi-31)
- #:use-module (rnrs io ports)
+ #:use-module (ice-9 binary-ports)
#:use-module (rnrs bytevectors)
#:use-module (ice-9 match)
#:use-module (ice-9 regex)
diff --git a/guix/grafts.scm b/guix/grafts.scm
index 80ae27e9b0..dda7c1d235 100644
--- a/guix/grafts.scm
+++ b/guix/grafts.scm
@@ -280,8 +280,19 @@ derivations to the corresponding set of grafts."
(let* ((new (graft-derivation/shallow store drv applicable
#:guile guile
#:system system))
- (grafts (cons (graft (origin drv) (replacement new))
- grafts)))
+
+ ;; Replace references to any of the outputs of DRV,
+ ;; even if that's more than needed. This is so that
+ ;; the result refers only to the outputs of NEW and
+ ;; not to those of DRV.
+ (grafts (append (map (lambda (output)
+ (graft
+ (origin drv)
+ (origin-output output)
+ (replacement new)
+ (replacement-output output)))
+ (derivation-output-names drv))
+ grafts)))
(return/cache cache grafts))))))))))))
(define* (graft-derivation store drv grafts
diff --git a/guix/hash.scm b/guix/hash.scm
index a61dc980e6..44e4472580 100644
--- a/guix/hash.scm
+++ b/guix/hash.scm
@@ -1,5 +1,5 @@
;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2012, 2013, 2014, 2015 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2012, 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -19,7 +19,7 @@
(define-module (guix hash)
#:use-module (guix gcrypt)
#:use-module (rnrs bytevectors)
- #:use-module (rnrs io ports)
+ #:use-module (ice-9 binary-ports)
#:use-module (system foreign)
#:use-module ((guix build utils) #:select (dump-port))
#:use-module (srfi srfi-11)
diff --git a/guix/http-client.scm b/guix/http-client.scm
index 97a1e26d3e..a8324be09f 100644
--- a/guix/http-client.scm
+++ b/guix/http-client.scm
@@ -28,7 +28,7 @@
#:use-module (srfi srfi-34)
#:use-module (srfi srfi-35)
#:use-module (ice-9 match)
- #:use-module (rnrs io ports)
+ #:use-module (ice-9 binary-ports)
#:use-module (rnrs bytevectors)
#:use-module (guix ui)
#:use-module (guix utils)
diff --git a/guix/pki.scm b/guix/pki.scm
index 3cd9763fdf..1551425c33 100644
--- a/guix/pki.scm
+++ b/guix/pki.scm
@@ -1,5 +1,5 @@
;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2013, 2014 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2013, 2014, 2016 Ludovic Courtès <ludo@gnu.org>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -22,7 +22,8 @@
#:use-module ((guix utils) #:select (with-atomic-file-output))
#:use-module ((guix build utils) #:select (mkdir-p))
#:use-module (ice-9 match)
- #:use-module (rnrs io ports)
+ #:use-module (ice-9 rdelim)
+ #:use-module (ice-9 binary-ports)
#:export (%public-key-file
%private-key-file
%acl-file
@@ -80,7 +81,7 @@ element in KEYS must be a canonical sexp with type 'public-key'."
(when (file-exists? %public-key-file)
(let ((public-key (call-with-input-file %public-key-file
(compose string->canonical-sexp
- get-string-all))))
+ read-string))))
(mkdir-p (dirname %acl-file))
(with-atomic-file-output %acl-file
(lambda (port)
@@ -99,7 +100,7 @@ element in KEYS must be a canonical sexp with type 'public-key'."
(call-with-input-file %acl-file
(compose canonical-sexp->sexp
string->canonical-sexp
- get-string-all))
+ read-string))
(public-keys->acl '()))) ; the empty ACL
(define (acl->public-keys acl)
diff --git a/guix/scripts/archive.scm b/guix/scripts/archive.scm
index 8c7322d617..400353247c 100644
--- a/guix/scripts/archive.scm
+++ b/guix/scripts/archive.scm
@@ -40,7 +40,7 @@
#:use-module (srfi srfi-11)
#:use-module (srfi srfi-26)
#:use-module (srfi srfi-37)
- #:use-module (rnrs io ports)
+ #:use-module (ice-9 binary-ports)
#:export (guix-archive))
@@ -290,7 +290,7 @@ the input port."
(define (read-key)
(catch 'gcry-error
(lambda ()
- (string->canonical-sexp (get-string-all (current-input-port))))
+ (string->canonical-sexp (read-string (current-input-port))))
(lambda (key proc err)
(leave (_ "failed to read public key: ~a: ~a~%")
(error-source err) (error-string err)))))
diff --git a/guix/scripts/authenticate.scm b/guix/scripts/authenticate.scm
index eedebb4bac..d9f799df26 100644
--- a/guix/scripts/authenticate.scm
+++ b/guix/scripts/authenticate.scm
@@ -1,5 +1,5 @@
;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2013, 2014, 2015 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -22,7 +22,8 @@
#:use-module (guix pk-crypto)
#:use-module (guix pki)
#:use-module (guix ui)
- #:use-module (rnrs io ports)
+ #:use-module (ice-9 binary-ports)
+ #:use-module (ice-9 rdelim)
#:use-module (ice-9 match)
#:export (guix-authenticate))
@@ -36,12 +37,12 @@
(define read-canonical-sexp
;; Read a gcrypt sexp from a port and return it.
- (compose string->canonical-sexp get-string-all))
+ (compose string->canonical-sexp read-string))
(define (read-hash-data port key-type)
"Read sha256 hash data from PORT and return it as a gcrypt sexp. KEY-TYPE
is a symbol representing the type of public key algo being used."
- (let* ((hex (get-string-all port))
+ (let* ((hex (read-string port))
(bv (base16-string->bytevector (string-trim-both hex))))
(bytevector->hash-data bv #:key-type key-type)))
diff --git a/guix/scripts/build.scm b/guix/scripts/build.scm
index b64138ec0e..8c2c4902fc 100644
--- a/guix/scripts/build.scm
+++ b/guix/scripts/build.scm
@@ -179,27 +179,48 @@ matching URIs given in SOURCES."
(_
obj)))))
+(define (evaluate-replacement-specs specs proc)
+ "Parse SPECS, a list of strings like \"guile=guile@2.1\", and invoke PROC on
+each package pair specified by SPECS. Return the resulting list. Raise an
+error if an element of SPECS uses invalid syntax, or if a package it refers to
+could not be found."
+ (define not-equal
+ (char-set-complement (char-set #\=)))
+
+ (map (lambda (spec)
+ (match (string-tokenize spec not-equal)
+ ((old new)
+ (proc (specification->package old)
+ (specification->package new)))
+ (x
+ (leave (_ "invalid replacement specification: ~s~%") spec))))
+ specs))
+
(define (transform-package-inputs replacement-specs)
"Return a procedure that, when passed a package, replaces its direct
dependencies according to REPLACEMENT-SPECS. REPLACEMENT-SPECS is a list of
-strings like \"guile=guile@2.1\" meaning that, any direct dependency on a
-package called \"guile\" must be replaced with a dependency on a version 2.1
-of \"guile\"."
- (define not-equal
- (char-set-complement (char-set #\=)))
+strings like \"guile=guile@2.1\" meaning that, any dependency on a package
+called \"guile\" must be replaced with a dependency on a version 2.1 of
+\"guile\"."
+ (let* ((replacements (evaluate-replacement-specs replacement-specs cons))
+ (rewrite (package-input-rewriting replacements)))
+ (lambda (store obj)
+ (if (package? obj)
+ (rewrite obj)
+ obj))))
- (define replacements
- ;; List of name/package pairs.
- (map (lambda (spec)
- (match (string-tokenize spec not-equal)
- ((old new)
- (cons (specification->package old)
- (specification->package new)))
- (x
- (leave (_ "invalid replacement specification: ~s~%") spec))))
- replacement-specs))
-
- (let ((rewrite (package-input-rewriting replacements)))
+(define (transform-package-inputs/graft replacement-specs)
+ "Return a procedure that, when passed a package, replaces its direct
+dependencies according to REPLACEMENT-SPECS. REPLACEMENT-SPECS is a list of
+strings like \"gnutls=gnutls@3.5.4\" meaning that packages are built using the
+current 'gnutls' package, after which version 3.5.4 is grafted onto them."
+ (define (replacement-pair old new)
+ (cons old
+ (package (inherit old) (replacement new))))
+
+ (let* ((replacements (evaluate-replacement-specs replacement-specs
+ replacement-pair))
+ (rewrite (package-input-rewriting replacements)))
(lambda (store obj)
(if (package? obj)
(rewrite obj)
@@ -211,20 +232,22 @@ of \"guile\"."
;; procedure; it is called with two arguments: the store, and a list of
;; things to build.
`((with-source . ,transform-package-source)
- (with-input . ,transform-package-inputs)))
+ (with-input . ,transform-package-inputs)
+ (with-graft . ,transform-package-inputs/graft)))
(define %transformation-options
;; The command-line interface to the above transformations.
- (list (option '("with-source") #t #f
- (lambda (opt name arg result . rest)
- (apply values
- (cons (alist-cons 'with-source arg result)
- rest))))
- (option '("with-input") #t #f
- (lambda (opt name arg result . rest)
- (apply values
- (cons (alist-cons 'with-input arg result)
- rest))))))
+ (let ((parser (lambda (symbol)
+ (lambda (opt name arg result . rest)
+ (apply values
+ (alist-cons symbol arg result)
+ rest)))))
+ (list (option '("with-source") #t #f
+ (parser 'with-source))
+ (option '("with-input") #t #f
+ (parser 'with-input))
+ (option '("with-graft") #t #f
+ (parser 'with-graft)))))
(define (show-transformation-options-help)
(display (_ "
@@ -232,7 +255,10 @@ of \"guile\"."
use SOURCE when building the corresponding package"))
(display (_ "
--with-input=PACKAGE=REPLACEMENT
- replace dependency PACKAGE by REPLACEMENT")))
+ replace dependency PACKAGE by REPLACEMENT"))
+ (display (_ "
+ --with-graft=PACKAGE=REPLACEMENT
+ graft REPLACEMENT on packages that refer to PACKAGE")))
(define (options->transformation opts)
diff --git a/guix/scripts/download.scm b/guix/scripts/download.scm
index 1648198f6e..bcb4eaa043 100644
--- a/guix/scripts/download.scm
+++ b/guix/scripts/download.scm
@@ -31,7 +31,7 @@
#:use-module (srfi srfi-1)
#:use-module (srfi srfi-37)
#:use-module (rnrs bytevectors)
- #:use-module (rnrs io ports)
+ #:use-module (ice-9 binary-ports)
#:export (guix-download))
diff --git a/guix/scripts/hash.scm b/guix/scripts/hash.scm
index a6eced92fb..b269ead50f 100644
--- a/guix/scripts/hash.scm
+++ b/guix/scripts/hash.scm
@@ -25,7 +25,7 @@
#:use-module (guix ui)
#:use-module (guix scripts)
#:use-module (guix utils)
- #:use-module (rnrs io ports)
+ #:use-module (ice-9 binary-ports)
#:use-module (rnrs files)
#:use-module (ice-9 match)
#:use-module (srfi srfi-1)
@@ -137,7 +137,7 @@ and 'hexadecimal' can be used as well).\n"))
(if (assoc-ref opts 'recursive?)
(let-values (((port get-hash) (open-sha256-port)))
(write-file file port #:select? select?)
- (flush-output-port port)
+ (force-output port)
(get-hash))
(call-with-input-file file port-sha256))))
diff --git a/guix/scripts/lint.scm b/guix/scripts/lint.scm
index b3ec6d628e..d6281eae64 100644
--- a/guix/scripts/lint.scm
+++ b/guix/scripts/lint.scm
@@ -142,6 +142,10 @@ monad."
"Return #t if S starts with what looks like an abbreviation or acronym."
(string-match "^[A-Z][A-Z0-9]+\\>" s))
+(define %quoted-identifier-rx
+ ;; A quoted identifier, like 'this'.
+ (make-regexp "['`][[:graph:]]+'"))
+
(define (check-description-style package)
;; Emit a warning if stylistic issues are found in the description of PACKAGE.
(define (check-not-empty description)
@@ -173,6 +177,16 @@ trademark sign '~a' at ~d")
'description))
(else #t)))
+ (define (check-quotes description)
+ "Check whether DESCRIPTION contains single quotes and suggest @code."
+ (when (regexp-exec %quoted-identifier-rx description)
+ (emit-warning package
+
+ ;; TRANSLATORS: '@code' is Texinfo markup and must be kept
+ ;; as is.
+ (_ "use @code or similar ornament instead of quotes")
+ 'description)))
+
(define (check-proper-start description)
(unless (or (properly-starts-sentence? description)
(string-prefix-ci? (package-name package) description))
@@ -203,6 +217,7 @@ by two spaces; possible infraction~p at ~{~a~^, ~}")
(if (string? description)
(begin
(check-not-empty description)
+ (check-quotes description)
(check-trademarks description)
;; Use raw description for this because Texinfo rendering
;; automatically fixes end of sentence space.
diff --git a/guix/scripts/offload.scm b/guix/scripts/offload.scm
index b278f1e313..33d141e7ef 100644
--- a/guix/scripts/offload.scm
+++ b/guix/scripts/offload.scm
@@ -21,7 +21,8 @@
#:use-module (guix records)
#:use-module (guix store)
#:use-module (guix derivations)
- #:use-module (guix serialization)
+ #:use-module ((guix serialization)
+ #:select (nar-error? nar-error-file))
#:use-module (guix nar)
#:use-module (guix utils)
#:use-module ((guix build syscalls) #:select (fcntl-flock))
@@ -37,7 +38,7 @@
#:use-module (ice-9 match)
#:use-module (ice-9 regex)
#:use-module (ice-9 format)
- #:use-module (rnrs io ports)
+ #:use-module (ice-9 binary-ports)
#:export (build-machine
build-requirements
guix-offload))
@@ -336,7 +337,7 @@ hook."
(let ((pipe (remote-pipe machine OPEN_READ
`("guile" "-c" ,(object->string script)))))
- (get-string-all pipe)
+ (read-string pipe)
(let ((status (close-pipe pipe)))
(unless (zero? status)
;; Better be safe than sorry: if we ignore the error here, then FILE
@@ -368,7 +369,7 @@ hook."
(let ((pipe (remote-pipe machine OPEN_READ
`("guile" "-c" ,(object->string script)))))
- (get-string-all pipe)
+ (read-string pipe)
(close-pipe pipe)))
(define* (offload drv machine
@@ -462,7 +463,7 @@ success, #f otherwise."
'("guix" "archive" "--missing")))
(open-input-string files)))
((result)
- (get-string-all missing)))
+ (read-string missing)))
(for-each waitpid pids)
(string-tokenize result)))
diff --git a/guix/scripts/publish.scm b/guix/scripts/publish.scm
index 8404e540f8..1b32f639ea 100644
--- a/guix/scripts/publish.scm
+++ b/guix/scripts/publish.scm
@@ -23,7 +23,7 @@
#:use-module (ice-9 format)
#:use-module (ice-9 match)
#:use-module (ice-9 regex)
- #:use-module (rnrs io ports)
+ #:use-module (ice-9 rdelim)
#:use-module (rnrs bytevectors)
#:use-module (srfi srfi-1)
#:use-module (srfi srfi-2)
@@ -46,7 +46,7 @@
#:use-module (guix pki)
#:use-module (guix pk-crypto)
#:use-module (guix store)
- #:use-module (guix serialization)
+ #:use-module ((guix serialization) #:select (write-file))
#:use-module (guix zlib)
#:use-module (guix ui)
#:use-module (guix scripts)
@@ -167,7 +167,7 @@ compression disabled~%"))
(delay
(call-with-input-file file
(compose string->canonical-sexp
- get-string-all))))
+ read-string))))
(define %private-key
(lazy-read-file-sexp %private-key-file))
diff --git a/guix/scripts/refresh.scm b/guix/scripts/refresh.scm
index 84e2a8f2a6..b81c69f9fe 100644
--- a/guix/scripts/refresh.scm
+++ b/guix/scripts/refresh.scm
@@ -50,7 +50,7 @@
#:use-module (srfi srfi-11)
#:use-module (srfi srfi-26)
#:use-module (srfi srfi-37)
- #:use-module (rnrs io ports)
+ #:use-module (ice-9 binary-ports)
#:export (guix-refresh
%updaters))
diff --git a/guix/scripts/substitute.scm b/guix/scripts/substitute.scm
index 8f50477801..3d6fde0188 100755
--- a/guix/scripts/substitute.scm
+++ b/guix/scripts/substitute.scm
@@ -24,7 +24,7 @@
#:use-module (guix combinators)
#:use-module (guix config)
#:use-module (guix records)
- #:use-module (guix serialization)
+ #:use-module ((guix serialization) #:select (restore-file))
#:use-module (guix hash)
#:use-module (guix base32)
#:use-module (guix base64)
@@ -43,7 +43,6 @@
#:use-module (ice-9 format)
#:use-module (ice-9 ftw)
#:use-module (ice-9 binary-ports)
- #:use-module (rnrs io ports)
#:use-module (rnrs bytevectors)
#:use-module (srfi srfi-1)
#:use-module (srfi srfi-9)
@@ -938,7 +937,7 @@ DESTINATION as a nar file. Verify the substitute against ACL."
(and (file-exists? %public-key-file)
(let ((key (call-with-input-file %public-key-file
(compose string->canonical-sexp
- get-string-all))))
+ read-string))))
(match acl
((thing)
(equal? (canonical-sexp->string thing)
diff --git a/guix/serialization.scm b/guix/serialization.scm
index f17f516c09..5953b84616 100644
--- a/guix/serialization.scm
+++ b/guix/serialization.scm
@@ -19,11 +19,12 @@
(define-module (guix serialization)
#:use-module (guix combinators)
#:use-module (rnrs bytevectors)
- #:use-module (rnrs io ports)
#:use-module (srfi srfi-1)
#:use-module (srfi srfi-26)
#:use-module (srfi srfi-34)
#:use-module (srfi srfi-35)
+ #:use-module (ice-9 binary-ports)
+ #:use-module ((ice-9 rdelim) #:prefix rdelim:)
#:use-module (ice-9 match)
#:use-module (ice-9 ftw)
#:export (write-int read-int
@@ -143,7 +144,7 @@ substitute invalid byte sequences with question marks. This is a
(port (open-bytevector-input-port bv)))
(set-port-encoding! port "UTF-8")
(set-port-conversion-strategy! port 'substitute)
- (get-string-all port)))
+ (rdelim:read-string port)))
(define (write-string-list l p)
(write-int (length l) p)
diff --git a/guix/store.scm b/guix/store.scm
index 9f409b4209..43cfda9214 100644
--- a/guix/store.scm
+++ b/guix/store.scm
@@ -25,7 +25,7 @@
#:autoload (guix base32) (bytevector->base32-string)
#:autoload (guix build syscalls) (terminal-columns)
#:use-module (rnrs bytevectors)
- #:use-module (rnrs io ports)
+ #:use-module (ice-9 binary-ports)
#:use-module (srfi srfi-1)
#:use-module (srfi srfi-9)
#:use-module (srfi srfi-9 gnu)
@@ -481,7 +481,7 @@ encoding conversion errors."
(let ((s (read-maybe-utf8-string p)))
(display s (current-build-output-port))
(when (string-any %newlines s)
- (flush-output-port (current-build-output-port)))
+ (force-output (current-build-output-port)))
#f))
((= k %stderr-error)
;; Report an error.
diff --git a/guix/tests.scm b/guix/tests.scm
index 3cb4a671af..5110075e7d 100644
--- a/guix/tests.scm
+++ b/guix/tests.scm
@@ -27,7 +27,7 @@
#:use-module (gnu packages bootstrap)
#:use-module (srfi srfi-34)
#:use-module (rnrs bytevectors)
- #:use-module (rnrs io ports)
+ #:use-module (ice-9 binary-ports)
#:use-module (web uri)
#:export (open-connection-for-tests
random-text
diff --git a/guix/utils.scm b/guix/utils.scm
index decadf64a6..65a2baa0a2 100644
--- a/guix/utils.scm
+++ b/guix/utils.scm
@@ -30,7 +30,8 @@
#:use-module (srfi srfi-39)
#:use-module (srfi srfi-60)
#:use-module (rnrs bytevectors)
- #:use-module (rnrs io ports)
+ #:use-module (ice-9 binary-ports)
+ #:autoload (rnrs io ports) (make-custom-binary-input-port)
#:use-module ((rnrs bytevectors) #:select (bytevector-u8-set!))
#:use-module (guix combinators)
#:use-module ((guix build utils) #:select (dump-port))