aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/guix.texi6
-rw-r--r--gnu/packages/bootstrap.scm7
-rw-r--r--guix/derivations.scm36
-rw-r--r--tests/derivations.scm115
-rw-r--r--tests/store.scm13
5 files changed, 89 insertions, 88 deletions
diff --git a/doc/guix.texi b/doc/guix.texi
index 57b6412939..c82d5f7480 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -1113,7 +1113,7 @@ derivations as Scheme objects, along with procedures to create and
otherwise manipulate derivations. The lowest-level primitive to create
a derivation is the @code{derivation} procedure:
-@deffn {Scheme Procedure} derivation @var{store} @var{name} @var{system} @var{builder} @var{args} @var{env-vars} @var{inputs} [#:outputs '("out")] [#:hash #f] [#:hash-algo #f] [#:hash-mode #f]
+@deffn {Scheme Procedure} derivation @var{store} @var{name} @var{builder} @var{args} [#:outputs '("out")] [#:hash #f] [#:hash-algo #f] [#:hash-mode #f] [#:inputs '()] [#:env-vars '()] [#:system (%current-system)]
Build a derivation with the given arguments. Return the resulting store
path and @code{<derivation>} object.
@@ -1137,9 +1137,9 @@ to a Bash executable in the store:
(let ((builder ; add the Bash script to the store
(add-text-to-store store "my-builder.sh"
"echo hello world > $out\n" '())))
- (derivation store "foo" (%current-system)
+ (derivation store "foo"
bash `("-e" ,builder)
- '(("HOME" . "/homeless")) '())))
+ #:env-vars '(("HOME" . "/homeless")))))
list)
@result{} ("/nix/store/@dots{}-foo.drv" #<<derivation> @dots{}>)
@end lisp
diff --git a/gnu/packages/bootstrap.scm b/gnu/packages/bootstrap.scm
index 86723a9591..a1d4c7fc67 100644
--- a/gnu/packages/bootstrap.scm
+++ b/gnu/packages/bootstrap.scm
@@ -184,9 +184,10 @@ cd $out
$out/bin/guile --version~%"
mkdir xz guile tar)
(list mkdir xz guile tar))))
- (derivation store name system
- bash `(,builder) '()
- `((,bash) (,builder)))))))))
+ (derivation store name
+ bash `(,builder)
+ #:system system
+ #:inputs `((,bash) (,builder)))))))))
(package
(name "guile-bootstrap")
(version "2.0")
diff --git a/guix/derivations.scm b/guix/derivations.scm
index 8ddef117d4..3d7a30aaa8 100644
--- a/guix/derivations.scm
+++ b/guix/derivations.scm
@@ -497,8 +497,11 @@ the derivation called NAME with hash HASH."
name
(string-append name "-" output))))
-(define* (derivation store name system builder args env-vars inputs
- #:key (outputs '("out")) hash hash-algo hash-mode)
+(define* (derivation store name builder args
+ #:key
+ (system (%current-system)) (env-vars '())
+ (inputs '()) (outputs '("out"))
+ hash hash-algo hash-mode)
"Build a derivation with the given arguments. Return the resulting
store path and <derivation> object. When HASH, HASH-ALGO, and HASH-MODE
are given, a fixed-output derivation is created---i.e., one whose result is
@@ -747,8 +750,8 @@ omitted or is #f, the value of the `%guile-for-build' fluid is used instead."
(define module-form?
(match-lambda
- (((or 'define-module 'use-modules) _ ...) #t)
- (_ #f)))
+ (((or 'define-module 'use-modules) _ ...) #t)
+ (_ #f)))
(define source-path
;; When passed an input that is a source, return its path; otherwise
@@ -833,22 +836,25 @@ omitted or is #f, the value of the `%guile-for-build' fluid is used instead."
#:system system)))
(go-dir (and go-drv
(derivation-path->output-path go-drv))))
- (derivation store name system guile
+ (derivation store name guile
`("--no-auto-compile"
,@(if mod-dir `("-L" ,mod-dir) '())
,builder)
+ #:system system
+
+ #:inputs `((,(or guile-for-build (%guile-for-build)))
+ (,builder)
+ ,@(map cdr inputs)
+ ,@(if mod-drv `((,mod-drv) (,go-drv)) '()))
+
;; When MODULES is non-empty, shamelessly clobber
;; $GUILE_LOAD_COMPILED_PATH.
- (if go-dir
- `(("GUILE_LOAD_COMPILED_PATH" . ,go-dir)
- ,@(alist-delete "GUILE_LOAD_COMPILED_PATH"
- env-vars))
- env-vars)
-
- `((,(or guile-for-build (%guile-for-build)))
- (,builder)
- ,@(map cdr inputs)
- ,@(if mod-drv `((,mod-drv) (,go-drv)) '()))
+ #:env-vars (if go-dir
+ `(("GUILE_LOAD_COMPILED_PATH" . ,go-dir)
+ ,@(alist-delete "GUILE_LOAD_COMPILED_PATH"
+ env-vars))
+ env-vars)
+
#:hash hash #:hash-algo hash-algo
#:outputs outputs)))
diff --git a/tests/derivations.scm b/tests/derivations.scm
index 788cffd7ad..9833e15112 100644
--- a/tests/derivations.scm
+++ b/tests/derivations.scm
@@ -106,9 +106,9 @@
(let* ((builder (add-text-to-store %store "my-builder.sh"
"echo hello, world\n"
'()))
- (drv-path (derivation %store "foo" (%current-system)
+ (drv-path (derivation %store "foo"
%bash `("-e" ,builder)
- '(("HOME" . "/homeless")) '())))
+ #:env-vars '(("HOME" . "/homeless")))))
(and (store-path? drv-path)
(valid-path? %store drv-path))))
@@ -118,12 +118,12 @@
"echo hello, world > \"$out\"\n"
'()))
((drv-path drv)
- (derivation %store "foo" (%current-system)
+ (derivation %store "foo"
%bash `(,builder)
- '(("HOME" . "/homeless")
- ("zzz" . "Z!")
- ("AAA" . "A!"))
- `((,builder))))
+ #:env-vars '(("HOME" . "/homeless")
+ ("zzz" . "Z!")
+ ("AAA" . "A!"))
+ #:inputs `((,builder))))
((succeeded?)
(build-derivations %store (list drv-path))))
(and succeeded?
@@ -139,18 +139,17 @@
"(while read line ; do echo \"$line\" ; done) < $in > $out"
'()))
(input (search-path %load-path "ice-9/boot-9.scm"))
+ (input* (add-to-store %store (basename input)
+ #t "sha256" input))
(drv-path (derivation %store "derivation-with-input-file"
- (%current-system)
%bash `(,builder)
- `(("in"
- ;; Cheat to pass the actual file
- ;; name to the builder.
- . ,(add-to-store %store
- (basename input)
- #t "sha256"
- input)))
- `((,builder)
- (,input))))) ; ← local file name
+
+ ;; Cheat to pass the actual file name to the
+ ;; builder.
+ #:env-vars `(("in" . ,input*))
+
+ #:inputs `((,builder)
+ (,input))))) ; ← local file name
(and (build-derivations %store (list drv-path))
;; Note: we can't compare the files because the above trick alters
;; the contents.
@@ -160,10 +159,9 @@
(let* ((builder (add-text-to-store %store "my-fixed-builder.sh"
"echo -n hello > $out" '()))
(hash (sha256 (string->utf8 "hello")))
- (drv-path (derivation %store "fixed" (%current-system)
+ (drv-path (derivation %store "fixed"
%bash `(,builder)
- '()
- `((,builder)) ; optional
+ #:inputs `((,builder)) ; optional
#:hash hash #:hash-algo 'sha256))
(succeeded? (build-derivations %store (list drv-path))))
(and succeeded?
@@ -178,13 +176,11 @@
(builder2 (add-text-to-store %store "fixed-builder2.sh"
"echo hey; echo -n hello > $out" '()))
(hash (sha256 (string->utf8 "hello")))
- (drv-path1 (derivation %store "fixed" (%current-system)
+ (drv-path1 (derivation %store "fixed"
%bash `(,builder1)
- '() `()
#:hash hash #:hash-algo 'sha256))
- (drv-path2 (derivation %store "fixed" (%current-system)
+ (drv-path2 (derivation %store "fixed"
%bash `(,builder2)
- '() `()
#:hash hash #:hash-algo 'sha256))
(succeeded? (build-derivations %store
(list drv-path1 drv-path2))))
@@ -201,27 +197,25 @@
(builder2 (add-text-to-store %store "fixed-builder2.sh"
"echo hey; echo -n hello > $out" '()))
(hash (sha256 (string->utf8 "hello")))
- (fixed1 (derivation %store "fixed" (%current-system)
+ (fixed1 (derivation %store "fixed"
%bash `(,builder1)
- '() `()
#:hash hash #:hash-algo 'sha256))
- (fixed2 (derivation %store "fixed" (%current-system)
+ (fixed2 (derivation %store "fixed"
%bash `(,builder2)
- '() `()
#:hash hash #:hash-algo 'sha256))
(fixed-out (derivation-path->output-path fixed1))
(builder3 (add-text-to-store
%store "final-builder.sh"
;; Use Bash hackery to avoid Coreutils.
"echo $in ; (read -u 3 c; echo $c) 3< $in > $out" '()))
- (final1 (derivation %store "final" (%current-system)
+ (final1 (derivation %store "final"
%bash `(,builder3)
- `(("in" . ,fixed-out))
- `((,builder3) (,fixed1))))
- (final2 (derivation %store "final" (%current-system)
+ #:env-vars `(("in" . ,fixed-out))
+ #:inputs `((,builder3) (,fixed1))))
+ (final2 (derivation %store "final"
%bash `(,builder3)
- `(("in" . ,fixed-out))
- `((,builder3) (,fixed2))))
+ #:env-vars `(("in" . ,fixed-out))
+ #:inputs `((,builder3) (,fixed2))))
(succeeded? (build-derivations %store
(list final1 final2))))
(and succeeded?
@@ -232,12 +226,12 @@
(let* ((builder (add-text-to-store %store "my-fixed-builder.sh"
"echo one > $out ; echo two > $second"
'()))
- (drv-path (derivation %store "fixed" (%current-system)
+ (drv-path (derivation %store "fixed"
%bash `(,builder)
- '(("HOME" . "/homeless")
- ("zzz" . "Z!")
- ("AAA" . "A!"))
- `((,builder))
+ #:env-vars '(("HOME" . "/homeless")
+ ("zzz" . "Z!")
+ ("AAA" . "A!"))
+ #:inputs `((,builder))
#:outputs '("out" "second")))
(succeeded? (build-derivations %store (list drv-path))))
(and succeeded?
@@ -255,10 +249,9 @@
(let* ((builder (add-text-to-store %store "my-fixed-builder.sh"
"echo one > $out ; echo two > $AAA"
'()))
- (drv-path (derivation %store "fixed" (%current-system)
+ (drv-path (derivation %store "fixed"
%bash `(,builder)
- '()
- `((,builder))
+ #:inputs `((,builder))
#:outputs '("out" "AAA")))
(succeeded? (build-derivations %store (list drv-path))))
(and succeeded?
@@ -273,10 +266,9 @@
(let* ((builder1 (add-text-to-store %store "my-mo-builder.sh"
"echo one > $out ; echo two > $two"
'()))
- (mdrv (derivation %store "multiple-output" (%current-system)
+ (mdrv (derivation %store "multiple-output"
%bash `(,builder1)
- '()
- `((,builder1))
+ #:inputs `((,builder1))
#:outputs '("out" "two")))
(builder2 (add-text-to-store %store "my-mo-user-builder.sh"
"read x < $one;
@@ -284,16 +276,17 @@
echo \"($x $y)\" > $out"
'()))
(udrv (derivation %store "multiple-output-user"
- (%current-system)
%bash `(,builder2)
- `(("one" . ,(derivation-path->output-path
- mdrv "out"))
- ("two" . ,(derivation-path->output-path
- mdrv "two")))
- `((,builder2)
- ;; two occurrences of MDRV:
- (,mdrv)
- (,mdrv "two")))))
+ #:env-vars `(("one"
+ . ,(derivation-path->output-path
+ mdrv "out"))
+ ("two"
+ . ,(derivation-path->output-path
+ mdrv "two")))
+ #:inputs `((,builder2)
+ ;; two occurrences of MDRV:
+ (,mdrv)
+ (,mdrv "two")))))
(and (build-derivations %store (list (pk 'udrv udrv)))
(let ((p (derivation-path->output-path udrv)))
(and (valid-path? %store p)
@@ -314,14 +307,14 @@
"echo $PATH ; mkdir --version ; mkdir $out ; touch $out/good"
'()))
(drv-path
- (derivation %store "foo" (%current-system)
+ (derivation %store "foo"
%bash `(,builder)
- `(("PATH" .
- ,(string-append
- (derivation-path->output-path %coreutils)
- "/bin")))
- `((,builder)
- (,%coreutils))))
+ #:env-vars `(("PATH" .
+ ,(string-append
+ (derivation-path->output-path %coreutils)
+ "/bin")))
+ #:inputs `((,builder)
+ (,%coreutils))))
(succeeded?
(build-derivations %store (list drv-path))))
(and succeeded?
diff --git a/tests/store.scm b/tests/store.scm
index 3d5d59b991..9625a6b308 100644
--- a/tests/store.scm
+++ b/tests/store.scm
@@ -80,9 +80,9 @@
;; (b (add-text-to-store %store "link-builder"
;; (format #f "echo ~a > $out" p1)
;; '()))
-;; (d1 (derivation %store "link" (%current-system)
-;; "/bin/sh" `("-e" ,b) '()
-;; `((,b) (,p1))))
+;; (d1 (derivation %store "link"
+;; "/bin/sh" `("-e" ,b)
+;; #:inputs `((,b) (,p1))))
;; (p2 (derivation-path->output-path d1)))
;; (and (add-temp-root %store p2)
;; (build-derivations %store (list d1))
@@ -130,9 +130,10 @@
(s (add-to-store %store "bash" #t "sha256"
(search-bootstrap-binary "bash"
(%current-system))))
- (d (derivation %store "the-thing" (%current-system)
- s `("-e" ,b) `(("foo" . ,(random-text)))
- `((,b) (,s))))
+ (d (derivation %store "the-thing"
+ s `("-e" ,b)
+ #:env-vars `(("foo" . ,(random-text)))
+ #:inputs `((,b) (,s))))
(o (derivation-path->output-path d)))
(and (build-derivations %store (list d))
(equal? (query-derivation-outputs %store d)