~ruther/guix-local

16eb115ef4986f319e6aebb04cefce12bc851e01 — nebuli 11 years ago 6efc160
guix: scripts: Add GUIX_BUILD_OPTIONS environment handling.

* doc/guix.texi (Invoking guix build): Mention 'GUIX_BUILD_OPTIONS'.
* guix/scripts/archive.scm: (append args (environment-build-options)).
* guix/scripts/build.scm: Ditto.
* guix/scripts/environment.scm: Ditto.
* guix/scripts/package.scm: Ditto.
* guix/scripts/system.scm: Ditto.
* guix/ui.scm (environment-build-options): New function.
* guix/utils.scm (arguments-from-environment-variable): New function.
* tests/guix-build.sh: Add tests.
* test-env.in: Unset GUIX_BUILD_OPTIONS.

Co-authored-by: Ludovic Courtès <ludo@gnu.org>
M doc/guix.texi => doc/guix.texi +18 -0
@@ 2781,6 2781,24 @@ the @code{package-derivation} procedure of the @code{(guix packages)}
module, and to the @code{build-derivations} procedure of the @code{(guix
store)} module.

In addition to options explicitly passed on the command line,
@command{guix build} and other @command{guix} commands that support
building honor the @code{GUIX_BUILD_OPTIONS} environment variable.

@defvr {Environment Variable} GUIX_BUILD_OPTIONS
Users can define this variable to a list of command line options that
will automatically be used by @command{guix build} and other
@command{guix} commands that can perform builds, as in the example
below:

@example
$ export GUIX_BUILD_OPTIONS="--no-substitutes -c 2 -L /foo/bar"
@end example

These options are appended to the ones passed on the command line.
@end defvr


@node Invoking guix download
@section Invoking @command{guix download}


M guix/scripts/archive.scm => guix/scripts/archive.scm +2 -1
@@ 293,7 293,8 @@ the input port."
(define (guix-archive . args)
  (define (parse-options)
    ;; Return the alist of option values.
    (args-fold* args %options
    (args-fold* (append args (environment-build-options))
                %options
                (lambda (opt name arg result)
                  (leave (_ "~A: unrecognized option~%") name))
                (lambda (arg result)

M guix/scripts/build.scm => guix/scripts/build.scm +2 -1
@@ 401,7 401,8 @@ arguments with packages that use the specified source."
(define (guix-build . args)
  (define (parse-options)
    ;; Return the alist of option values.
    (args-fold* args %options
    (args-fold* (append args (environment-build-options))
                %options
                (lambda (opt name arg result)
                  (leave (_ "~A: unrecognized option~%") name))
                (lambda (arg result)

M guix/scripts/environment.scm => guix/scripts/environment.scm +2 -1
@@ 213,7 213,8 @@ packages."
;; Entry point.
(define (guix-environment . args)
  (define (parse-options)
    (args-fold* args %options
    (args-fold* (append args (environment-build-options))
                %options
                (lambda (opt name arg result)
                  (leave (_ "~A: unrecognized option~%") name))
                (lambda (arg result)

M guix/scripts/package.scm => guix/scripts/package.scm +2 -1
@@ 668,7 668,8 @@ removed from MANIFEST."
(define (guix-package . args)
  (define (parse-options)
    ;; Return the alist of option values.
    (args-fold* args %options
    (args-fold* (append args (environment-build-options))
                %options
                (lambda (opt name arg result arg-handler)
                  (leave (_ "~A: unrecognized option~%") name))
                (lambda (arg result arg-handler)

M guix/scripts/system.scm => guix/scripts/system.scm +2 -1
@@ 467,7 467,8 @@ Build the operating system declared in FILE according to ACTION.\n"))
(define (guix-system . args)
  (define (parse-options)
    ;; Return the alist of option values.
    (args-fold* args %options
    (args-fold* (append args (environment-build-options))
                %options
                (lambda (opt name arg result)
                  (leave (_ "~A: unrecognized option~%") name))
                (lambda (arg result)

M guix/ui.scm => guix/ui.scm +5 -0
@@ 64,6 64,7 @@
            string->generations
            string->duration
            args-fold*
            environment-build-options
            run-guix-command
            program-name
            guix-warning-port


@@ 712,6 713,10 @@ reporting."
      (leave (_ "invalid argument: ~a~%")
             (apply format #f msg args)))))

(define (environment-build-options)
  "Return additional build options passed as environment variables."
  (arguments-from-environment-variable "GUIX_BUILD_OPTIONS"))

(define (show-guix-usage)
  (format (current-error-port)
          (_ "Try `guix --help' for more information.~%"))

M guix/utils.scm => guix/utils.scm +10 -0
@@ 72,6 72,7 @@
            package-name->name+version
            string-tokenize*
            string-replace-substring
            arguments-from-environment-variable
            file-extension
            file-sans-extension
            call-with-temporary-output-file


@@ 627,6 628,15 @@ REPLACEMENT."
                       (substring str start index)
                       pieces))))))))

(define (arguments-from-environment-variable variable)
  "Retrieve value of environment variable denoted by string VARIABLE in the
form of a list of strings (`char-set:graphic' tokens) suitable for consumption
by `args-fold', if VARIABLE is defined, otherwise return an empty list."
  (let ((env (getenv variable)))
    (if env
        (string-tokenize env char-set:graphic)
        '())))

(define (call-with-temporary-output-file proc)
  "Call PROC with a name of a temporary file and open output port to that
file; close the file and delete it when leaving the dynamic extent of this

M test-env.in => test-env.in +2 -2
@@ 99,8 99,8 @@ unset LANGUAGE
LC_MESSAGES=C
export LC_MESSAGES

# Ignore user modules.
unset GUIX_PACKAGE_PATH
# Ignore user settings.
unset GUIX_PACKAGE_PATH GUIX_BUILD_OPTIONS

storedir="@storedir@"
prefix="@prefix@"

M tests/guix-build.sh => tests/guix-build.sh +10 -0
@@ 84,3 84,13 @@ guix build -e "(begin
# Running a gexp.
guix build -e '#~(mkdir #$output)' -d
guix build -e '#~(mkdir #$output)' -d | grep 'gexp\.drv'

# Using 'GUIX_BUILD_OPTIONS'.
GUIX_BUILD_OPTIONS="--dry-run"
export GUIX_BUILD_OPTIONS

guix build emacs

GUIX_BUILD_OPTIONS="--something-completely-crazy"
if guix build emacs;
then false; else true; fi