guix: scripts: Parse $GUIX_BUILD_OPTIONS separately.

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 <ludo@gnu.org>
This commit is contained in:
nebuli 2014-12-05 01:28:12 +01:00 committed by Ludovic Courtès
parent 6496de9bc2
commit 847391fe62
7 changed files with 46 additions and 11 deletions

View File

@ -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

View File

@ -293,8 +293,12 @@ the input port."
(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)

View File

@ -401,8 +401,12 @@ arguments with packages that use the specified source."
(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)

View File

@ -213,8 +213,13 @@ packages."
;; 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)

View File

@ -668,8 +668,12 @@ removed from MANIFEST."
(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)

View File

@ -477,8 +477,12 @@ 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* (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)

View File

@ -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