diff options
| author | Ludovic Courtès <ludo@gnu.org> | 2018-11-26 11:48:33 +0100 |
|---|---|---|
| committer | Ludovic Courtès <ludo@gnu.org> | 2018-11-28 10:39:58 +0100 |
| commit | 94c0e61fe759924625c9e27d3da8c7c0c767ea2b (patch) | |
| tree | a40bc5de2f9e71a83532545367f2ecd153b1af2a | |
| parent | d4aa147eecc64a00d1463d4008b22c9595041552 (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.scm | 70 | ||||
| -rw-r--r-- | tests/inferior.scm | 9 |
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)) | 408 | thus 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 |
| 410 | and cross-built for TARGET if TARGET is true. The inferior corresponding to | 411 | ;; same options, the same per-session GC roots, etc. |
| 411 | PACKAGE 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 | ||
| 453 | and cross-built for TARGET if TARGET is true. The inferior corresponding to | ||
| 454 | PACKAGE 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") |
