~ruther/guix-local

c9c282cea04ec5a3ee7bd17e6ad8846600220feb — David Thompson 10 years ago 4fca58a
scripts: environment: Allow lists of packages in expressions.

* guix/scripts/environment.scm (options/resolve-packages): Match against
  lists of packages when evaluating expressions.
* tests/guix-environment.sh: Add test.
* doc/guix.texi ("invoking guix environment"): Add docs.
3 files changed, 38 insertions(+), 12 deletions(-)

M doc/guix.texi
M guix/scripts/environment.scm
M tests/guix-environment.sh
M doc/guix.texi => doc/guix.texi +12 -3
@@ 4730,7 4730,8 @@ The available options are summarized below.
@table @code
@item --expression=@var{expr}
@itemx -e @var{expr}
Create an environment for the package that @var{expr} evaluates to.
Create an environment for the package or list of packages that
@var{expr} evaluates to.

For example, running:



@@ 4741,10 4742,18 @@ (gnu packages maths) petsc-openmpi)'
starts a shell with the environment for this specific variant of the
PETSc package.

Running:

@example
guix environment --ad-hoc -e '(@ (gnu) %base-packages)'
@end example

starts a shell with all the GuixSD base packages available.

@item --load=@var{file}
@itemx -l @var{file}
Create an environment for the package that the code within @var{file}
evaluates to.
Create an environment for the package or list of packages that the code
within @var{file} evaluates to.

As an example, @var{file} might contain a definition like this
(@pxref{Defining Packages}):

M guix/scripts/environment.scm => guix/scripts/environment.scm +15 -9
@@ 253,6 253,18 @@ COMMAND or an interactive shell in that environment.\n"))
(define (options/resolve-packages opts)
  "Return OPTS with package specification strings replaced by actual
packages."
  (define (package->outputs package mode)
    (map (lambda (output)
           (list mode package output))
         (package-outputs package)))

  (define (packages->outputs packages mode)
    (match packages
      ((? package? package)
       (package->outputs package mode))
      (((? package? packages) ...)
       (append-map (cut package->outputs <> mode) packages))))

  (compact
   (append-map (match-lambda
                 (('package mode (? string? spec))


@@ 261,17 273,11 @@ packages."
                    (list (list mode package output))))
                 (('expression mode str)
                  ;; Add all the outputs of the package STR evaluates to.
                  (match (read/eval str)
                    ((? package? package)
                     (map (lambda (output)
                            (list mode package output))
                          (package-outputs package)))))
                  (packages->outputs (read/eval str) mode))
                 (('load mode file)
                  ;; Add all the outputs of the package defined in FILE.
                  (let ((package (load* file (make-user-module '()))))
                    (map (lambda (output)
                           (list mode package output))
                         (package-outputs package))))
                  (let ((module (make-user-module '())))
                    (packages->outputs (load* file module) mode)))
                 (_ '(#f)))
               opts)))


M tests/guix-environment.sh => tests/guix-environment.sh +11 -0
@@ 111,4 111,15 @@ then
    grep -E '^export CPATH=.*-gcc-bootstrap-0/include'      "$tmpdir/a"
    grep -E '^export CPATH=.*-glibc-bootstrap-0/include'    "$tmpdir/a"
    grep -E '^export LIBRARY_PATH=.*-glibc-bootstrap-0/lib' "$tmpdir/a"

    # Make sure a package list can be used with -e.
    expr_list_test_code="
(list (@@ (gnu packages commencement) gnu-make-boot0)
      (@ (gnu packages bootstrap) %bootstrap-guile))"

    guix environment --ad-hoc --no-substitutes --search-paths --pure \
         -e "$expr_list_test_code" > "$tmpdir/a"

    grep -E '^export PATH=.*-make-boot0-4.1/bin'      "$tmpdir/a"
    grep -E '^export PATH=.*-guile-bootstrap-2.0/bin' "$tmpdir/a"
fi