From 16eb115ef4986f319e6aebb04cefce12bc851e01 Mon Sep 17 00:00:00 2001 From: nebuli Date: Sun, 30 Nov 2014 17:47:22 +0100 Subject: [PATCH] guix: scripts: Add GUIX_BUILD_OPTIONS environment handling. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 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 --- doc/guix.texi | 18 ++++++++++++++++++ guix/scripts/archive.scm | 3 ++- guix/scripts/build.scm | 3 ++- guix/scripts/environment.scm | 3 ++- guix/scripts/package.scm | 3 ++- guix/scripts/system.scm | 3 ++- guix/ui.scm | 5 +++++ guix/utils.scm | 10 ++++++++++ test-env.in | 4 ++-- tests/guix-build.sh | 10 ++++++++++ 10 files changed, 55 insertions(+), 7 deletions(-) diff --git a/doc/guix.texi b/doc/guix.texi index f313ba5db4..75ce632602 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -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} diff --git a/guix/scripts/archive.scm b/guix/scripts/archive.scm index 84904e29da..29a3ad15a7 100644 --- a/guix/scripts/archive.scm +++ b/guix/scripts/archive.scm @@ -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) diff --git a/guix/scripts/build.scm b/guix/scripts/build.scm index b4aa33b3a0..76a743f0b3 100644 --- a/guix/scripts/build.scm +++ b/guix/scripts/build.scm @@ -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) diff --git a/guix/scripts/environment.scm b/guix/scripts/environment.scm index 81bad963f6..a309dfa362 100644 --- a/guix/scripts/environment.scm +++ b/guix/scripts/environment.scm @@ -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) diff --git a/guix/scripts/package.scm b/guix/scripts/package.scm index 3a72053766..9ff4d17bf4 100644 --- a/guix/scripts/package.scm +++ b/guix/scripts/package.scm @@ -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) diff --git a/guix/scripts/system.scm b/guix/scripts/system.scm index 398a5a371b..8ea77e4f3c 100644 --- a/guix/scripts/system.scm +++ b/guix/scripts/system.scm @@ -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) diff --git a/guix/ui.scm b/guix/ui.scm index 69b073da50..c77e04172e 100644 --- a/guix/ui.scm +++ b/guix/ui.scm @@ -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.~%")) diff --git a/guix/utils.scm b/guix/utils.scm index 9b802b6fb3..d0d2e8a3d4 100644 --- a/guix/utils.scm +++ b/guix/utils.scm @@ -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 diff --git a/test-env.in b/test-env.in index 39b205dc8a..f66a0db555 100644 --- a/test-env.in +++ b/test-env.in @@ -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@" diff --git a/tests/guix-build.sh b/tests/guix-build.sh index 27b3fdc39e..836c45e776 100644 --- a/tests/guix-build.sh +++ b/tests/guix-build.sh @@ -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