runs @command{guile} in an environment where Guile and Guile-SDL are
available.
+Note that this example implicitly asks for the default output of
+@code{guile} and @code{guile-sdl} but it is possible to ask for a
+specific output---e.g., @code{glib:bin} asks for the @code{bin} output
+of @code{glib} (@pxref{Packages with Multiple Outputs}).
+
@item --pure
Unset existing environment variables when building the new environment.
This has the effect of creating an environment in which search paths
#:use-module (ice-9 format)
#:use-module (ice-9 match)
#:use-module (srfi srfi-1)
+ #:use-module (srfi srfi-11)
#:use-module (srfi srfi-26)
#:use-module (srfi srfi-37)
#:use-module (srfi srfi-98)
(newline)))
(evaluate-input-search-paths inputs search-paths)))
-(define (package+propagated-inputs package)
- "Return the union of PACKAGE and its transitive propagated inputs."
- `((,(package-name package) ,package)
+(define (package+propagated-inputs package output)
+ "Return the union of PACKAGE's OUTPUT and its transitive propagated inputs."
+ `((,(package-name package) ,package ,output)
,@(package-transitive-propagated-inputs package)))
(define (show-help)
(define (options/resolve-packages opts)
"Return OPTS with package specification strings replaced by actual
packages."
- (map (match-lambda
- (('package . (? string? spec))
- `(package . ,(specification->package spec)))
- (('expression . str)
- (match (read/eval str)
- ((? package? p)
- `(package . ,p))))
- (('load . file)
- `(package . ,(load (string-append (getcwd) "/" file))))
- (opt opt))
- opts))
+ (append-map (match-lambda
+ (('package . (? string? spec))
+ (let-values (((package output)
+ (specification->package+output spec)))
+ `((package ,package ,output))))
+ (('expression . str)
+ ;; Add all the outputs of the package STR evaluates to.
+ (match (read/eval str)
+ ((? package? package)
+ (map (lambda (output)
+ `(package ,package ,output))
+ (package-outputs package)))))
+ (('load . file)
+ ;; Add all the outputs of the package defined in FILE.
+ (let ((package (load (string-append (getcwd) "/" file))))
+ (map (lambda (output)
+ `(package ,package ,output))
+ (package-outputs package))))
+ (opt (list opt)))
+ opts))
(define (build-inputs inputs opts)
"Build the derivations in INPUTS, a list of (DERIVATION) or (DERIVATION
(command (assoc-ref opts 'exec))
(packages (pick-all (options/resolve-packages opts) 'package))
(inputs (if ad-hoc?
- (append-map package+propagated-inputs packages)
+ (append-map (match-lambda
+ ((package output)
+ (package+propagated-inputs package
+ output)))
+ packages)
(append-map (compose bag-transitive-inputs
- package->bag)
+ package->bag
+ first)
packages)))
(paths (delete-duplicates
(cons $PATH
# Check the environment variables for the bootstrap Guile.
guix environment --ad-hoc guile-bootstrap --pure --search-paths > "$tmpdir/a"
+guix environment --ad-hoc guile-bootstrap:out --pure --search-paths > "$tmpdir/b"
# $PATH must appear in the search paths, and nothing else.
grep -E '^export PATH=.*guile-bootstrap-[0-9.]+/bin' "$tmpdir/a"
test "`wc -l < "$tmpdir/a"`" = 1
+cmp "$tmpdir/a" "$tmpdir/b"
+
if guile -c '(getaddrinfo "www.gnu.org" "80" AI_NUMERICSERV)' 2> /dev/null
then
# Compute the build environment for the initial GNU Make.