Subject: bug#70611: outputs are baked in gexps, cannot be removed in derived packages

From: Simon Tournier <[email-masked]>
Date: Fri, 03 May 2024 21:13:09 +0200

Hi,

On sam., 27 avril 2024 at 12:55, Maxim Cournoyer <[email-masked]> wrote:

> --8<---------------cut here---------------start------------->8---
> builder for `/gnu/store/f2pdg9m5q3bxrlahjvlrdgw41x6kp3zd-llvm-cling-18-20240227-01.drv' failed to produce output path `/gnu/store/m1z5257hj5vwc2rl47wkpf0wmr6x0bq2-llvm-cling-18-20240227-01-opt-viewer'
> --8<---------------cut here---------------end--------------->8---

Yeah something is unexpected.

--8<---------------cut here---------------start------------->8---
$ ./pre-inst-env guix build llvm-cling -d --no-grafts \
    | xargs guix drv-show | recsel -p outputs
outputs: 
+ /gnu/store/m1z5257hj5vwc2rl47wkpf0wmr6x0bq2-llvm-cling-18-20240227-01-opt-viewer   [opt-viewer]
+ /gnu/store/bg3xs25xyllpzw322sqcc8ipw9q8lph6-llvm-cling-18-20240227-01              [out]
--8<---------------cut here---------------end--------------->8---

But from ’guix repl’

--8<---------------cut here---------------start------------->8---
scheme@(guix-user)> ,pp (package-outputs llvm-cling-2)
$6 = ("out")
--8<---------------cut here---------------end--------------->8---

And the package arguments reads:

--8<---------------cut here---------------start------------->8---
scheme@(guix-user)> ,pp (package-arguments llvm-cling-2)
$5 = (#:configure-flags
 #<gexp  gnu/packages/llvm.scm:586:6 7f6a06421150>
 #:build-type
 "Release"
 #:phases
 #<gexp (modify-phases #<gexp-input
          #<gexp (modify-phases %standard-phases
                   (add-after (quote unpack) (quote change-directory)
                     (lambda _
                       (chdir "llvm")))
                   (add-after (quote install) (quote install-opt-viewer)
                     (lambda* (#:key outputs #:allow-other-keys)
                       (let* ((opt-viewer-share (string-append #<gexp-output opt-viewer> "/share")))
                         (mkdir-p opt-viewer-share)
                         (rename-file (string-append #<gexp-output out> "/share/opt-viewer") opt-viewer-share)))))
          gnu/packages/llvm.scm:612:6 7f6a06421090>:out>
          (delete (quote install-opt-viewer)))
 gnu/packages/llvm.scm:2443:10 7f6a06421060>)
--8<---------------cut here---------------end--------------->8---

Concretely,
/gnu/store/rhb3lmkbp5d92c0x0sxkmfwbpbs4b4hp-llvm-cling-18-20240227-01-builder
reads,

--8<---------------cut here---------------start------------->8---
    (define %outputs
      (list
       (cons "out"
             ((@
               (guile)
               getenv)
              "out"))))
    (define %output
      (assoc-ref %outputs "out"))
    (cmake-build
[...]

                 #:phases
                 (modify-phases
                     (modify-phases %standard-phases
                       (add-after
                           (quote unpack)
                           (quote change-directory)
                         (lambda _
                           (chdir "llvm")))
                       (add-after
                           (quote install)
                           (quote install-opt-viewer)
                         (lambda*
                             (#:key outputs #:allow-other-keys)
                           (let*
                               ((opt-viewer-share
                                 (string-append
                                  ((@
                                    (guile)
                                    getenv)
                                   "opt-viewer")
                                  "/share")))
                             (mkdir-p opt-viewer-share)
                             (rename-file
                              (string-append
                               ((@
                                 (guile)
                                 getenv)
                                "out")
                               "/share/opt-viewer")
                              opt-viewer-share)))))
                   (delete
                    (quote install-opt-viewer)))
--8<---------------cut here---------------end--------------->8---

Therefore, the bug comes from an incorrect derivation (drv) file.  It
contains an output that it should not.

Well, I have not investigated further… Probably an issue with code
staging (what is evaluated when).

Cheers,
simon