packages: Add 'package-development-inputs'.

* guix/packages.scm (package-development-inputs): New procedure.
* guix/scripts/environment.scm (package-environment-inputs): Use it.
* tests/packages.scm ("package-development-inputs")
("package-development-inputs, cross-compilation"): New tests.
* doc/guix.texi (package Reference): Document it.
This commit is contained in:
Ludovic Courtès 2021-10-01 10:49:22 +02:00
parent e4276fc4c1
commit fb368f4e76
No known key found for this signature in database
GPG Key ID: 090B11993D9AEBB5
4 changed files with 66 additions and 1 deletions

View File

@ -6848,6 +6848,47 @@ cross-compiling:
It is an error to refer to @code{this-package} outside a package definition.
@end deffn
@cindex development inputs, of a package
@cindex implicit inputs, of a package
Sometimes you will want to obtain the list of inputs needed to
@emph{develop} a package---all the inputs that are visible when the
package is compiled. This is what the @code{package-development-inputs}
procedure returns.
@deffn {Scheme Procedure} package-development-inputs @var{package} @
[@var{system}] [#:target #f]
Return the list of inputs required by @var{package} for development
purposes on @var{system}. When @var{target} is true, return the inputs
needed to cross-compile @var{package} from @var{system} to
@var{triplet}, where @var{triplet} is a triplet such as
@code{"aarch64-linux-gnu"}.
Note that the result includes both explicit inputs and implicit
inputs---inputs automatically added by the build system (@pxref{Build
Systems}). Let us take the @code{hello} package to illustrate that:
@lisp
(use-modules (gnu packages base) (guix packages))
hello
@result{} #<package hello@@2.10 gnu/packages/base.scm:79 7f585d4f6790>
(package-direct-inputs hello)
@result{} ()
(package-development-inputs hello)
@result{} (("source" @dots{}) ("tar" #<package tar@@1.32 @dots{}>) @dots{})
@end lisp
In this example, @code{package-direct-inputs} returns the empty list,
because @code{hello} has zero explicit dependencies. Conversely,
@code{package-development-inputs} includes inputs implicitly added by
@code{gnu-build-system} that are required to build @code{hello}: tar,
gzip, GCC, libc, Bash, and more. To visualize it, @command{guix graph
hello} would show you explicit inputs, whereas @command{guix graph -t
bag hello} would include implicit inputs (@pxref{Invoking guix graph}).
@end deffn
Because packages are regular Scheme objects that capture a complete
dependency graph and associated build procedures, it is often useful to
write procedures that take a package and return a modified version

View File

@ -153,6 +153,7 @@
bag-transitive-host-inputs
bag-transitive-build-inputs
bag-transitive-target-inputs
package-development-inputs
package-closure
default-guile
@ -1070,6 +1071,15 @@ dependencies are known to build on SYSTEM."
(%current-system (bag-system bag)))
(transitive-inputs (bag-target-inputs bag))))
(define* (package-development-inputs package
#:optional (system (%current-system))
#:key target)
"Return the list of inputs required by PACKAGE for development purposes on
SYSTEM. When TARGET is true, return the inputs needed to cross-compile
PACKAGE from SYSTEM to TRIPLET, where TRIPLET is a triplet such as
\"aarch64-linux-gnu\"."
(bag-transitive-inputs (package->bag package system target)))
(define* (package-closure packages #:key (system (%current-system)))
"Return the closure of PACKAGES on SYSTEM--i.e., PACKAGES and the list of
packages they depend on, recursively."

View File

@ -82,7 +82,7 @@ package."
packages for PACKAGE."
;; Remove non-package inputs such as origin records.
(filter-map input->manifest-entry
(bag-transitive-inputs (package->bag package))))
(package-development-inputs package)))
(define (show-help)
(display (G_ "Usage: guix environment [OPTION]... PACKAGE... [-- COMMAND...]

View File

@ -353,6 +353,20 @@
(package-transitive-supported-systems d)
(package-transitive-supported-systems e))))
(test-assert "package-development-inputs"
;; Note: Due to propagated inputs, 'package-development-inputs' returns a
;; couple more inputs, such as 'linux-libre-headers'.
(lset<= equal?
`(("source" ,(package-source hello)) ,@(standard-packages))
(package-development-inputs hello)))
(test-assert "package-development-inputs, cross-compilation"
(lset<= equal?
`(("source" ,(package-source hello))
,@(standard-cross-packages "mips64el-linux-gnu" 'host)
,@(standard-cross-packages "mips64el-linux-gnu" 'target))
(package-development-inputs hello #:target "mips64el-linux-gnu")))
(test-assert "package-closure"
(let-syntax ((dummy-package/no-implicit
(syntax-rules ()