[bug#79577] monad-repl: Add "build-options" command.

Message ID 2e0138e328c5ea94cf90b8b7cd63ed8b30252012.1759670383.git.~@wolfsden.cz
State New
Headers
Series [bug#79577] monad-repl: Add "build-options" command. |

Commit Message

Tomas Volf Oct. 5, 2025, 1:19 p.m. UTC
There currently was no way to disable build offload for ,build from inside the
REPL.  Since offloaded builds sometimes do not error report entirely
correctly, it is useful to be able to switch to local builds.

This commit adds new ,build-options meta command, which allows to specify
build options, including #:offload?.

* guix/monad-repl.scm (%build-options): New variable.
(evaluate/print-with-store, package-argument-command): Use it.
(build-options): New meta command to set it.
* doc/guix.texi (Using Guix Interactively): Document it.
---
 doc/guix.texi       | 10 ++++++++++
 guix/monad-repl.scm | 35 +++++++++++++++++++++++++++--------
 2 files changed, 37 insertions(+), 8 deletions(-)
  

Patch

diff --git a/doc/guix.texi b/doc/guix.texi
index 3fd2a13968..5c82445619 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -13204,6 +13204,16 @@  Using Guix Interactively
 output file name(s).
 @end deffn
 
+@deffn {REPL command} build-options @var{options}
+Set build options for rest of the REPL commands to @var{options}.  Must
+be a list of keywords with values accepted by procedure
+@code{(@@ (guix store) set-build-options)}.  An example would be:
+
+@example
+,build-options '(#:offload? #f)
+@end example
+@end deffn
+
 @deffn {REPL command} lower @var{object}
 Lower @var{object} into a derivation or store file name and return it.
 @end deffn
diff --git a/guix/monad-repl.scm b/guix/monad-repl.scm
index d6b39112b7..60bdd029f5 100644
--- a/guix/monad-repl.scm
+++ b/guix/monad-repl.scm
@@ -1,3 +1,5 @@ 
+;;; Copyright (C) 2024 Tomas Volf <~@wolfsden.cz>
+;;; SPDX-License-Identifier: AGPL-3.0-only
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2014-2016, 2022-2023 Ludovic Courtès <ludo@gnu.org>
 ;;;
@@ -81,13 +83,18 @@  (define %build-verbosity
   ;; Current build verbosity level.
   1)
 
+(define %build-options
+  ;; Additional build options.
+  '())
+
 (define* (evaluate/print-with-store mvalue #:key build?)
   "Run monadic value MVALUE in the store monad and print its value."
   (with-store store
-    (set-build-options store
-                       #:print-build-trace #t
-                       #:print-extended-build-trace? #t
-                       #:multiplexed-build-output? #t)
+    (apply set-build-options store
+           #:print-build-trace #t
+           #:print-extended-build-trace? #t
+           #:multiplexed-build-output? #t
+           %build-options)
     (with-status-verbosity %build-verbosity
       (let* ((guile  (or (%guile-for-build)
                          (default-guile-derivation store)))
@@ -130,6 +137,17 @@  (define-meta-command ((build guix) repl (form))
   (evaluate/print-with-store (lower-object (repl-eval repl form))
                              #:build? #t))
 
+(define-meta-command ((build-options guix) repl (opts))
+  "build-options OPTIONS
+Set build options to OPTIONS.  Print previous value (to allow easy restore).
+
+Must be a list of keywords with values accepted by procedure
+(@ (guix store) set-build-options).  An example would be:
+
+    ,build-options '(#:offload? #f)"
+  (repl-print repl %build-options)
+  (set! %build-options (repl-eval repl opts)))
+
 (define-meta-command ((enter-store-monad guix) repl)
   "enter-store-monad
 Enter a REPL for values in the store monad."
@@ -172,10 +190,11 @@  (define (package-argument-command repl form keyword default)
        (define phases
          (parameterize ((%graft? #f))
            (with-store store
-             (set-build-options store
-                                #:print-build-trace #t
-                                #:print-extended-build-trace? #t
-                                #:multiplexed-build-output? #t)
+             (apply set-build-options store
+                    #:print-build-trace #t
+                    #:print-extended-build-trace? #t
+                    #:multiplexed-build-output? #t
+                    %build-options)
              (run-with-store store
                (mlet %store-monad ((exp (bag->derivation bag*)))
                  (if (gexp? exp)