outputs are baked in gexps, cannot be removed in derived packages

  • Open
  • quality assurance status badge
Details
2 participants
  • Maxim Cournoyer
  • Simon Tournier
Owner
unassigned
Submitted by
Maxim Cournoyer
Severity
normal
M
M
Maxim Cournoyer wrote on 27 Apr 18:55 +0200
(name . bug-guix)(address . bug-guix@gnu.org)
87o79ueoez.fsf@gmail.com
Hi Guix,

I've stumbled upon the following existing use case that no longer works
when the base package is expressed using gexps:

Base package:

Toggle snippet (45 lines)
(define-public llvm-15
(package
(name "llvm")
(version "15.0.7")
[...]

#~(modify-phases %standard-phases
(add-after 'unpack 'change-directory
(lambda _
(chdir "llvm")))
(add-after 'install 'install-opt-viewer
(lambda* (#:key outputs #:allow-other-keys)
(let* ((opt-viewer-share (string-append #$output:opt-viewer
"/share")))
(mkdir-p opt-viewer-share)
(rename-file (string-append #$output "/share/opt-viewer")
opt-viewer-share)))))))

[...]

(define-public llvm-cling
(let ((base llvm-18))
(package/inherit base
(name "llvm-cling")
(version "18-20240227-01")
(source
(origin
(inherit (package-source base))
(method git-fetch)
(uri (git-reference
(url "https://github.com/root-project/llvm-project")
(commit (string-append "cling-llvm" version))))
(file-name (git-file-name "llvm-cling" version))
(sha256
(base32
"0m5hhqk9y80srvkws2gs9rhpi6bjdy8mfk94z8fx6nmfxwrqsya8"))))
(outputs '("out"))
(arguments
(substitute-keyword-arguments (package-arguments base)
((#:phases phases '%standard-phases)
#~(modify-phases #$phases
(delete 'install-opt-viewer))))))))

Attempting to build llvm-cling fails because the phases gexps inherited
from llvm-15 references the 'opt-viewer' output, which llvm-cling tries
to remove without success:

Toggle snippet (3 lines)
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'

--
Thanks,
Maxim
S
S
Simon Tournier wrote on 3 May 21:13 +0200
87wmoaiu9m.fsf@gmail.com
Hi,

On sam., 27 avril 2024 at 12:55, Maxim Cournoyer <maxim.cournoyer@gmail.com> wrote:

Toggle quote (4 lines)
> --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.

Toggle snippet (7 lines)
$ ./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]

But from ’guix repl’

Toggle snippet (4 lines)
scheme@(guix-user)> ,pp (package-outputs llvm-cling-2)
$6 = ("out")

And the package arguments reads:

Toggle snippet (21 lines)
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>)

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

Toggle snippet (46 lines)
(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)))

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
?