mirror of
https://git.in.rschanz.org/ryan77627/guix.git
synced 2024-12-24 05:18:07 -05:00
guix build: Handle "guix build /….drv" correctly for non-existent derivations.
This lets the daemon substitute missing derivations, as in the example at <https://bugs.gnu.org/38226>, instead of failing with ENOENT. * guix/scripts/build.scm (options->things-to-build): In the 'derivation-path?' case, don't fail when 'read-derivation-from-file' raises to ENOENT; return the empty list in that case. (guix-build): Add non-existent '.drv' files to ITEMS. Pass ITEMS in addition to DRV to 'build-derivations'. * tests/guix-build.sh: Add test.
This commit is contained in:
parent
16ac74033a
commit
9c9982dc0c
2 changed files with 23 additions and 3 deletions
|
@ -802,7 +802,15 @@ (define (ensure-list x)
|
|||
(append-map (match-lambda
|
||||
(('argument . (? string? spec))
|
||||
(cond ((derivation-path? spec)
|
||||
(list (read-derivation-from-file spec)))
|
||||
(catch 'system-error
|
||||
(lambda ()
|
||||
(list (read-derivation-from-file spec)))
|
||||
(lambda args
|
||||
;; Non-existent .drv files can be substituted down
|
||||
;; the road, so don't error out.
|
||||
(if (= ENOENT (system-error-errno args))
|
||||
'()
|
||||
(apply throw args)))))
|
||||
((store-path? spec)
|
||||
;; Nothing to do; maybe for --log-file.
|
||||
'())
|
||||
|
@ -934,7 +942,11 @@ (define opts
|
|||
'())))
|
||||
(items (filter-map (match-lambda
|
||||
(('argument . (? store-path? file))
|
||||
(and (not (derivation-path? file))
|
||||
;; If FILE is a .drv that's not in
|
||||
;; store, keep it so that it can be
|
||||
;; substituted.
|
||||
(and (or (not (derivation-path? file))
|
||||
(not (file-exists? file)))
|
||||
file))
|
||||
(_ #f))
|
||||
opts))
|
||||
|
@ -965,7 +977,8 @@ (define opts
|
|||
(map (compose list derivation-file-name) drv)
|
||||
roots))
|
||||
((not (assoc-ref opts 'dry-run?))
|
||||
(and (build-derivations store drv mode)
|
||||
(and (build-derivations store (append drv items)
|
||||
mode)
|
||||
(for-each show-derivation-outputs drv)
|
||||
(for-each (cut register-root store <> <>)
|
||||
(map (lambda (drv)
|
||||
|
|
|
@ -42,6 +42,13 @@ out="`guix build "$drv"`"
|
|||
out2="`guix build -e '(@@ (gnu packages bootstrap) %bootstrap-guile)'`"
|
||||
test "$out" = "$out2"
|
||||
|
||||
# Passing the name of a .drv that doesn't exist. The daemon should try to
|
||||
# substitute the .drv. Here we just look for the "cannot build missing
|
||||
# derivation" error that indicates that the daemon did try to substitute the
|
||||
# .drv.
|
||||
guix build "$NIX_STORE_DIR/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-foo.drv" 2>&1 \
|
||||
| grep "missing derivation"
|
||||
|
||||
# Passing a URI.
|
||||
GUIX_DAEMON_SOCKET="file://$GUIX_STATE_DIRECTORY/daemon-socket/socket" \
|
||||
guix build -e '(@@ (gnu packages bootstrap) %bootstrap-guile)'
|
||||
|
|
Loading…
Reference in a new issue