summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2018-11-26 11:48:33 +0100
committerLudovic Courtès <ludo@gnu.org>2018-11-28 10:39:58 +0100
commit94c0e61fe759924625c9e27d3da8c7c0c767ea2b (patch)
treea40bc5de2f9e71a83532545367f2ecd153b1af2a
parentd4aa147eecc64a00d1463d4008b22c9595041552 (diff)
inferior: Add 'inferior-eval-with-store'.
* guix/inferior.scm (inferior-eval-with-store): New procedure, with code formerly in 'inferior-package-derivation'. (inferior-package-derivation): Rewrite in terms of 'inferior-eval-with-store'. * tests/inferior.scm ("inferior-eval-with-store"): New test.
-rw-r--r--guix/inferior.scm70
-rw-r--r--tests/inferior.scm9
2 files changed, 52 insertions, 27 deletions
diff --git a/guix/inferior.scm b/guix/inferior.scm
index 1dbb9e16992..ccc1c27cb26 100644
--- a/guix/inferior.scm
+++ b/guix/inferior.scm
@@ -56,6 +56,7 @@
56 open-inferior 56 open-inferior
57 close-inferior 57 close-inferior
58 inferior-eval 58 inferior-eval
59 inferior-eval-with-store
59 inferior-object? 60 inferior-object?
60 61
61 inferior-packages 62 inferior-packages
@@ -402,55 +403,70 @@ input/output ports.)"
402 (unless (port-closed? client) 403 (unless (port-closed? client)
403 (loop)))))) 404 (loop))))))
404 405
405(define* (inferior-package-derivation store package 406(define (inferior-eval-with-store inferior store code)
406 #:optional 407 "Evaluate CODE in INFERIOR, passing it STORE as its argument. CODE must
407 (system (%current-system)) 408thus be the code of a one-argument procedure that accepts a store."
408 #:key target) 409 ;; Create a named socket in /tmp and let INFERIOR connect to it and use it
409 "Return the derivation for PACKAGE, an inferior package, built for SYSTEM 410 ;; as its store. This ensures the inferior uses the same store, with the
410and cross-built for TARGET if TARGET is true. The inferior corresponding to 411 ;; same options, the same per-session GC roots, etc.
411PACKAGE must be live."
412 ;; Create a named socket in /tmp and let the inferior of PACKAGE connect to
413 ;; it and use it as its store. This ensures the inferior uses the same
414 ;; store, with the same options, the same per-session GC roots, etc.
415 (call-with-temporary-directory 412 (call-with-temporary-directory
416 (lambda (directory) 413 (lambda (directory)
417 (chmod directory #o700) 414 (chmod directory #o700)
418 (let* ((name (string-append directory "/inferior")) 415 (let* ((name (string-append directory "/inferior"))
419 (socket (socket AF_UNIX SOCK_STREAM 0)) 416 (socket (socket AF_UNIX SOCK_STREAM 0))
420 (inferior (inferior-package-inferior package))
421 (major (nix-server-major-version store)) 417 (major (nix-server-major-version store))
422 (minor (nix-server-minor-version store)) 418 (minor (nix-server-minor-version store))
423 (proto (logior major minor))) 419 (proto (logior major minor)))
424 (bind socket AF_UNIX name) 420 (bind socket AF_UNIX name)
425 (listen socket 1024) 421 (listen socket 1024)
426 (send-inferior-request 422 (send-inferior-request
427 `(let ((socket (socket AF_UNIX SOCK_STREAM 0))) 423 `(let ((proc ,code)
424 (socket (socket AF_UNIX SOCK_STREAM 0)))
428 (connect socket AF_UNIX ,name) 425 (connect socket AF_UNIX ,name)
429 426
430 ;; 'port->connection' appeared in June 2018 and we can hardly 427 ;; 'port->connection' appeared in June 2018 and we can hardly
431 ;; emulate it on older versions. Thus fall back to 428 ;; emulate it on older versions. Thus fall back to
432 ;; 'open-connection', at the risk of talking to the wrong daemon or 429 ;; 'open-connection', at the risk of talking to the wrong daemon or
433 ;; having our build result reclaimed (XXX). 430 ;; having our build result reclaimed (XXX).
434 (let* ((store (if (defined? 'port->connection) 431 (let ((store (if (defined? 'port->connection)
435 (port->connection socket #:version ,proto) 432 (port->connection socket #:version ,proto)
436 (open-connection))) 433 (open-connection))))
437 (package (hashv-ref %package-table 434 (dynamic-wind
438 ,(inferior-package-id package))) 435 (const #t)
439 (drv ,(if target 436 (lambda ()
440 `(package-cross-derivation store package 437 (proc store))
441 ,target 438 (lambda ()
442 ,system) 439 (close-connection store)
443 `(package-derivation store package 440 (close-port socket)))))
444 ,system))))
445 (close-connection store)
446 (close-port socket)
447 (derivation-file-name drv)))
448 inferior) 441 inferior)
449 (match (accept socket) 442 (match (accept socket)
450 ((client . address) 443 ((client . address)
451 (proxy client (nix-server-socket store)))) 444 (proxy client (nix-server-socket store))))
452 (close-port socket) 445 (close-port socket)
453 (read-derivation-from-file (read-inferior-response inferior)))))) 446 (read-inferior-response inferior)))))
447
448(define* (inferior-package-derivation store package
449 #:optional
450 (system (%current-system))
451 #:key target)
452 "Return the derivation for PACKAGE, an inferior package, built for SYSTEM
453and cross-built for TARGET if TARGET is true. The inferior corresponding to
454PACKAGE must be live."
455 (define proc
456 `(lambda (store)
457 (let* ((package (hashv-ref %package-table
458 ,(inferior-package-id package)))
459 (drv ,(if target
460 `(package-cross-derivation store package
461 ,target
462 ,system)
463 `(package-derivation store package
464 ,system))))
465 (derivation-file-name drv))))
466
467 (and=> (inferior-eval-with-store (inferior-package-inferior package) store
468 proc)
469 read-derivation-from-file))
454 470
455(define inferior-package->derivation 471(define inferior-package->derivation
456 (store-lift inferior-package-derivation)) 472 (store-lift inferior-package-derivation))
diff --git a/tests/inferior.scm b/tests/inferior.scm
index d1d5c00a773..d5a894ca8ff 100644
--- a/tests/inferior.scm
+++ b/tests/inferior.scm
@@ -157,6 +157,15 @@
157 (close-inferior inferior) 157 (close-inferior inferior)
158 result)) 158 result))
159 159
160(test-equal "inferior-eval-with-store"
161 (add-text-to-store %store "foo" "Hello, world!")
162 (let* ((inferior (open-inferior %top-builddir
163 #:command "scripts/guix")))
164 (inferior-eval-with-store inferior %store
165 '(lambda (store)
166 (add-text-to-store store "foo"
167 "Hello, world!")))))
168
160(test-equal "inferior-package-derivation" 169(test-equal "inferior-package-derivation"
161 (map derivation-file-name 170 (map derivation-file-name
162 (list (package-derivation %store %bootstrap-guile "x86_64-linux") 171 (list (package-derivation %store %bootstrap-guile "x86_64-linux")