~ruther/guix-local

11a454f9dae84cc00b977d164dae764454ecb11d — Ludovic Courtès 2 years ago d9190ab
gexp: #:references-graphs accepts and honors <gexp-input> records.

* guix/gexp.scm (lower-reference-graphs)[tuple->gexp-input]: Add
‘gexp-input?’ case.
(gexp->derivation): Update docstring.
* doc/guix.texi (G-Expressions): Adjust accordingly.
* tests/gexp.scm ("references-file, non-default output"): New test.

Reviewed-by: Maxim Cournoyer <maxim.cournoyer@gmail.com>
Change-Id: I595cb75da0867ab8ab44552887dc06ed1d23315e
3 files changed, 41 insertions(+), 8 deletions(-)

M doc/guix.texi
M guix/gexp.scm
M tests/gexp.scm
M doc/guix.texi => doc/guix.texi +3 -4
@@ 12314,10 12314,9 @@ When @var{references-graphs} is true, it must be a list of tuples of one of the
following forms:

@example
(@var{file-name} @var{package})
(@var{file-name} @var{package} @var{output})
(@var{file-name} @var{derivation})
(@var{file-name} @var{derivation} @var{output})
(@var{file-name} @var{obj})
(@var{file-name} @var{obj} @var{output})
(@var{file-name} @var{gexp-input})
(@var{file-name} @var{store-item})
@end example


M guix/gexp.scm => guix/gexp.scm +8 -4
@@ 934,6 934,11 @@ When TARGET is true, use it as the cross-compilation target triplet."
corresponding <derivation-input> or store item."
  (define tuple->gexp-input
    (match-lambda
      (((? gexp-input? input))
       ;; This case lets users specify the output of interest more
       ;; conveniently, for instance by passing (gexp-input hwloc "lib") to
       ;; the 'references-file' procedure.
       input)
      ((thing)
       (%gexp-input thing "out" (not target)))
      ((thing output)


@@ 1152,10 1157,9 @@ applicable.
When REFERENCES-GRAPHS is true, it must be a list of tuples of one of the
following forms:

  (FILE-NAME PACKAGE)
  (FILE-NAME PACKAGE OUTPUT)
  (FILE-NAME DERIVATION)
  (FILE-NAME DERIVATION OUTPUT)
  (FILE-NAME OBJ)
  (FILE-NAME OBJ OUTPUT)
  (FILE-NAME GEXP-INPUT)
  (FILE-NAME STORE-ITEM)

The right-hand-side of each element of REFERENCES-GRAPHS is automatically made

M tests/gexp.scm => tests/gexp.scm +30 -0
@@ 1652,6 1652,36 @@ importing.* \\(guix config\\) from the host"
                           read)
                         refs)))))))

(test-assertm "references-file, non-default output"
  (let* ((exp      #~(begin
                       (mkdir #$output)
                       (symlink #$%bootstrap-guile #$output:extra)))
         (computed (computed-file "computed" exp
                                  #:guile %bootstrap-guile))
         (refs1    (references-file computed
                                    #:guile %bootstrap-guile))
         ;; Wrap COMPUTE in 'gexp-input' to get the "extra" output.
         (refs2    (references-file (gexp-input computed "extra")
                                    #:guile %bootstrap-guile)))
    (mlet* %store-monad ((drv0 (lower-object %bootstrap-guile))
                         (drv1 (lower-object computed))
                         (drv2 (lower-object refs2))
                         (drv3 (lower-object refs1)))
      (mbegin %store-monad
        (built-derivations (list drv2 drv3))
        (mlet %store-monad ((refs ((store-lift requisites)
                                   (list (derivation->output-path
                                          drv1 "extra")))))
          (return
           (and (lset= string=?
                       (call-with-input-file (derivation->output-path drv2)
                         read)
                       refs)
                (lset= string=?
                       (call-with-input-file (derivation->output-path drv3)
                         read)
                       (list (derivation->output-path drv1))))))))))

(test-assert "lower-object & gexp-input-error?"
  (guard (c ((gexp-input-error? c)
             (gexp-error-invalid-input c)))