From 847391fe6229bc9b989939470b4a84bd82c75088 Mon Sep 17 00:00:00 2001 From: nebuli Date: Fri, 5 Dec 2014 01:28:12 +0100 Subject: guix: scripts: Parse $GUIX_BUILD_OPTIONS separately. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Appending to "raw" args broke optional parameters in 'guix package -I' and 'guix package -A', and possibly other places. Therefore, switch to parsing each set of options on its own and append resulting alists together afterwards. * guix/scripts/archive.scm (parse-options-from): Rename from (parse-options) and add explicit argument. New form of (parse-options) using its old algorithm via -from function. * guix/scripts/build.scm: Ditto. * guix/scripts/environment.scm: Ditto. * guix/scripts/package.scm: Ditto. * guix/scripts/system.scm: Ditto. * tests/guix-package.sh: Add test. * doc/guix.texi (Invoking guix build): Make it clear that the options are parsed independently. Co-authored-by: Ludovic Courtès --- doc/guix.texi | 3 ++- guix/scripts/archive.scm | 8 ++++++-- guix/scripts/build.scm | 8 ++++++-- guix/scripts/environment.scm | 9 +++++++-- guix/scripts/package.scm | 8 ++++++-- guix/scripts/system.scm | 8 ++++++-- tests/guix-package.sh | 13 +++++++++++++ 7 files changed, 46 insertions(+), 11 deletions(-) diff --git a/doc/guix.texi b/doc/guix.texi index e804d79ed0..1d4a012b16 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -2802,7 +2802,8 @@ below: $ 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. +These options are parsed independently, and the result is appended to +the parsed command-line options. @end defvr diff --git a/guix/scripts/archive.scm b/guix/scripts/archive.scm index 29a3ad15a7..781ffc5f58 100644 --- a/guix/scripts/archive.scm +++ b/guix/scripts/archive.scm @@ -293,8 +293,12 @@ (define (read-key) (define (guix-archive . args) (define (parse-options) ;; Return the alist of option values. - (args-fold* (append args (environment-build-options)) - %options + (append (parse-options-from args) + (parse-options-from (environment-build-options)))) + + (define (parse-options-from args) + ;; Actual parsing takes place here. + (args-fold* args %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 76a743f0b3..26e9f42774 100644 --- a/guix/scripts/build.scm +++ b/guix/scripts/build.scm @@ -401,8 +401,12 @@ (define new-sources (define (guix-build . args) (define (parse-options) ;; Return the alist of option values. - (args-fold* (append args (environment-build-options)) - %options + (append (parse-options-from args) + (parse-options-from (environment-build-options)))) + + (define (parse-options-from args) + ;; Actual parsing takes place here. + (args-fold* args %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 a309dfa362..c388b0c52c 100644 --- a/guix/scripts/environment.scm +++ b/guix/scripts/environment.scm @@ -213,8 +213,13 @@ (define (build-inputs inputs opts) ;; Entry point. (define (guix-environment . args) (define (parse-options) - (args-fold* (append args (environment-build-options)) - %options + ;; Return the alist of option values. + (append (parse-options-from args) + (parse-options-from (environment-build-options)))) + + (define (parse-options-from args) + ;; Actual parsing takes place here. + (args-fold* args %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 9ff4d17bf4..21dc66cb75 100644 --- a/guix/scripts/package.scm +++ b/guix/scripts/package.scm @@ -668,8 +668,12 @@ (define (readlink* file) (define (guix-package . args) (define (parse-options) ;; Return the alist of option values. - (args-fold* (append args (environment-build-options)) - %options + (append (parse-options-from args) + (parse-options-from (environment-build-options)))) + + (define (parse-options-from args) + ;; Actual parsing takes place here. + (args-fold* args %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 f2a25dd65a..56228601cc 100644 --- a/guix/scripts/system.scm +++ b/guix/scripts/system.scm @@ -477,8 +477,12 @@ (define %default-options (define (guix-system . args) (define (parse-options) ;; Return the alist of option values. - (args-fold* (append args (environment-build-options)) - %options + (append (parse-options-from args) + (parse-options-from (environment-build-options)))) + + (define (parse-options-from args) + ;; Actual parsing takes place here. + (args-fold* args %options (lambda (opt name arg result) (leave (_ "~A: unrecognized option~%") name)) (lambda (arg result) diff --git a/tests/guix-package.sh b/tests/guix-package.sh index 3e0e36fa23..f4e091a5a2 100644 --- a/tests/guix-package.sh +++ b/tests/guix-package.sh @@ -289,3 +289,16 @@ GUIX_PACKAGE_PATH="$module_dir" export GUIX_PACKAGE_PATH guix package -A emacs-foo-bar | grep 42 guix package -i emacs-foo-bar-42 -n +unset GUIX_PACKAGE_PATH + +# Using 'GUIX_BUILD_OPTIONS'. + +available="`guix package -A | sort`" +GUIX_BUILD_OPTIONS="--dry-run" +export GUIX_BUILD_OPTIONS + +# Make sure $GUIX_BUILD_OPTIONS is not simply appended to the command-line, +# which would break 'guix package -A' and similar. +available2="`guix package -A | sort`" +test "$available2" = "$available" +guix package -I -- cgit v1.2.3