~ruther/guix-local

fb368f4e760777e399aa58b08b89df1832fda8ba — Ludovic Courtès 5 years ago e4276fc
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.
4 files changed, 66 insertions(+), 1 deletions(-)

M doc/guix.texi
M guix/packages.scm
M guix/scripts/environment.scm
M tests/packages.scm
M doc/guix.texi => doc/guix.texi +41 -0
@@ 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

M guix/packages.scm => guix/packages.scm +10 -0
@@ 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."

M guix/scripts/environment.scm => guix/scripts/environment.scm +1 -1
@@ 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...]

M tests/packages.scm => tests/packages.scm +14 -0
@@ 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 ()