unofficial mirror of guix-devel@gnu.org 
 help / color / mirror / code / Atom feed
* How to remove output from inherited package?
@ 2024-12-26  3:10 Bodertz
  2024-12-27  2:03 ` 宋文武 via Development of GNU Guix and the GNU System distribution.
  0 siblings, 1 reply; 5+ messages in thread
From: Bodertz @ 2024-12-26  3:10 UTC (permalink / raw)
  To: guix-devel

In trying to create a transmission-qt package, I inherit from
transmission, remove the gtkmm dependency and the phases that deal with
moving transmission-gtk to the :gui output, and add a few qt
dependencies so that transmission-qt is built.  See the package
definition below:

    (define-module (bodertz transmission-qt)
      #:use-module (gnu packages bittorrent)
      #:use-module (gnu packages qt)
      #:use-module (guix packages)
      #:use-module (guix gexp)
      #:use-module (guix utils))

    (define-public transmission-qt
      (package
        (inherit transmission)
        ;; (outputs '("out"))
        (name "transmission-qt")
        (arguments
         (substitute-keyword-arguments (package-arguments transmission)
           ((#:phases phases)
            #~(modify-phases #$phases
                (delete 'move-gui)
                (delete 'glib-or-gtk-wrap)
                (delete 'wrap-program)))))
        (inputs (modify-inputs (package-inputs transmission)
                  (delete "gtkmm")
                  (append qtbase qttools qtsvg)))))

This works fine, except that an unnecessary transmission-qt:gui output
is created which contains license files (apologies if the email messes
up the formatting):

    $ tree /gnu/store/k34zx89kvd712maqfi62spnbb5s31bqd-transmission-qt-4.0.6-gui
    /gnu/store/k34zx89kvd712maqfi62spnbb5s31bqd-transmission-qt-4.0.6-gui
    └── share
        └── doc
            └── transmission-qt-4.0.6
                ├── bsd-3-clause.txt
                ├── COPYING
                ├── gpl-2.0.txt
                ├── gpl-3.0.txt
                └── mit.txt


When I uncomment the ;; outputs '("out")) line from my package
definition, I expected that it would only create the ordinary :out
output, but instead, I get this error:

    $ guix build transmission-qt
    [...]
    builder for `/gnu/store/026fwjchyis1x99iqsgliqga284wydbc-transmission-qt-4.0.6.drv' failed to produce output path `/gnu/store/v331nyi7kqg4gi432gvhz1c719n8x7xf-transmission-qt-4.0.6-gui'


Is there a way to avoid the attempt to create a :gui output?



^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: How to remove output from inherited package?
  2024-12-26  3:10 How to remove output from inherited package? Bodertz
@ 2024-12-27  2:03 ` 宋文武 via Development of GNU Guix and the GNU System distribution.
  2024-12-27  4:52   ` Bodertz
  0 siblings, 1 reply; 5+ messages in thread
From: 宋文武 via Development of GNU Guix and the GNU System distribution. @ 2024-12-27  2:03 UTC (permalink / raw)
  To: Bodertz; +Cc: guix-devel

Bodertz <bodertz@gmail.com> writes:

> In trying to create a transmission-qt package, I inherit from
> transmission
> [...]
> When I uncomment the ;; outputs '("out")) line from my package
> definition, I expected that it would only create the ordinary :out
> output, but instead, I get this error:
>
>     $ guix build transmission-qt
>     [...]
>     builder for `/gnu/store/026fwjchyis1x99iqsgliqga284wydbc-transmission-qt-4.0.6.drv' failed to produce output path `/gnu/store/v331nyi7kqg4gi432gvhz1c719n8x7xf-transmission-qt-4.0.6-gui'
>
>
> Is there a way to avoid the attempt to create a :gui output?

I think you should not reuse phases from transmisison, the error came
from '#$phases', which has reference to 'gui' output.  so:

  ...
  (inherit transmission)
  (name "transmission-qt")
  (outputs '("out")
  (arguments
    (list ...))   ; instead of 'substitute-keyword-arguments'
  ...



^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: How to remove output from inherited package?
  2024-12-27  2:03 ` 宋文武 via Development of GNU Guix and the GNU System distribution.
@ 2024-12-27  4:52   ` Bodertz
  2024-12-27  6:55     ` Bodertz
  2024-12-27  7:34     ` 宋文武 via Development of GNU Guix and the GNU System distribution.
  0 siblings, 2 replies; 5+ messages in thread
From: Bodertz @ 2024-12-27  4:52 UTC (permalink / raw)
  To: guix-devel

宋文武 via "Development of GNU Guix and the GNU System distribution."
<guix-devel@gnu.org> writes:

> I think you should not reuse phases from transmisison, the error came
> from '#$phases', which has reference to 'gui' output.  so:
>
>   ...
>   (inherit transmission)
>   (name "transmission-qt")
>   (outputs '("out")
>   (arguments
>     (list ...))   ; instead of 'substitute-keyword-arguments'
>   ...

Hmm, you appear to be right, but I don't understand why, as I removed
the tests that referenced the :gui output: 'move-gui, 'glib-or-gtk-wrap,
and 'wrap-program.

Do you understand it?  Did I miss one?

When I try to build without using any of the inherited phases, a test
fails (the transmission package included a phase to remove that test),
so for now I'm building without tests:

    (define-public transmission-qt-without-arguments
      (package
        (inherit transmission)
        (outputs '("out"))
        (name "transmission-qt-without-arguments")
        (arguments
         (list))
        (inputs (modify-inputs (package-inputs transmission)
                  (delete "gtkmm")
                  (append qtbase qttools qtsvg)))))


    ~ guix build transmission-qt-without-arguments --without-tests=transmission-qt-without-arguments
    successfully built /gnu/store/i78ffafvchfn886b17s5vdwjqs387f98-transmission-qt-without-arguments-4.0.6.drv

Will I have to manually add back the phase that deals with removing that
test?  I was hoping to avoid that sort of thing by inheriting from
transmission in the first place...

Thanks.



^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: How to remove output from inherited package?
  2024-12-27  4:52   ` Bodertz
@ 2024-12-27  6:55     ` Bodertz
  2024-12-27  7:34     ` 宋文武 via Development of GNU Guix and the GNU System distribution.
  1 sibling, 0 replies; 5+ messages in thread
From: Bodertz @ 2024-12-27  6:55 UTC (permalink / raw)
  To: guix-devel

Hmm, I see that the delete in modify-phases doesn't "actually" delete
what you tell it to, but rather just adds (delete _) to the end of the
list:

(apologies for the long text; just notice that move-gui, for example
isn't actually removed from the output, and that (delete (quote
move-gui)) is added at the end)

--8<---------------cut here---------------start------------->8---
scheme@(guix-user)> (substitute-keyword-arguments transmission-args ((#:phases phases) #~(modify-phases #$phases (delete 'move-gui) (delete 'glib-or-gtk-wrap) (delete 'wrap-program))))

$30 = (#:imported-modules ((guix build glib-or-gtk-build-system) (guix build cmake-build-system) (guix build gnu-build-system) (guix build utils) (guix build gremlin) (guix elf)) #:modules (((guix build glib-or-gtk-build-system) #:prefix glib-or-gtk:) (guix build cmake-build-system) (guix build utils)) #:phases #<gexp (modify-phases #<gexp-input #<gexp (modify-phases %standard-phases (add-after (quote unpack) (quote remove-kernel-version) (lambda _ (substitute* "third-party/miniupnp/miniupnpc/updateminiupnpcstrings.sh" (("OS_VERSION=`uname -r`") "OS_VERSION=Guix")))) (replace (quote check) (lambda* (#:key tests? parallel-tests? #:allow-other-keys) (if tests? (invoke "ctest" "-E" "usesBootstrapFile" "-j" (if parallel-tests? (number->string (parallel-job-count)) "1")) (format #t "test suite not run~%")))) (add-after (quote install) (quote move-gui) (lambda* (#:key outputs #:allow-other-keys) (mkdir-p (string-append #<gexp-output gui> "/bin")) (mkdir-p (string-append #<gexp-output gui> "/share/man/man1")) (rename-file (string-append #<gexp-output out> "/bin/transmission-gtk") (string-append #<gexp-output gui> "/bin/transmission-gtk")) (for-each (lambda (dir) (rename-file (string-append #<gexp-output out> "/share/" dir) (string-append #<gexp-output gui> "/share/" dir))) (quote ("applications" "icons" "metainfo"))) (rename-file (string-append #<gexp-output out> "/share/man/man1/transmission-gtk.1") (string-append #<gexp-output gui> "/share/man/man1/transmission-gtk.1")))) (add-after (quote move-gui) (quote glib-or-gtk-wrap) (lambda* (#:key outputs #:allow-other-keys #:rest args) (apply (assoc-ref glib-or-gtk:%standard-phases (quote glib-or-gtk-wrap)) #:glib-or-gtk-wrap-excluded-outputs (list "out") args))) (add-after (quote glib-or-gtk-wrap) (quote wrap-program) (lambda* (#:key outputs #:allow-other-keys) (wrap-program (string-append #<gexp-output gui> "/bin/transmission-gtk") (quasiquote ("GDK_PIXBUF_MODULE_FILE" = ((unquote (getenv "GDK_PIXBUF_MODULE_FILE"))))))))) gnu/packages/bittorrent.scm:113:8 7f08847bfcc0>:out> (delete (quote move-gui)) (delete (quote glib-or-gtk-wrap)) (delete (quote wrap-program))) 7f088c309bd0>)
--8<---------------cut here---------------end--------------->8---


Is this the problem?  Is there some way to "actually" delete the
offending entries that mention #<gexp-output gui>?



^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: How to remove output from inherited package?
  2024-12-27  4:52   ` Bodertz
  2024-12-27  6:55     ` Bodertz
@ 2024-12-27  7:34     ` 宋文武 via Development of GNU Guix and the GNU System distribution.
  1 sibling, 0 replies; 5+ messages in thread
From: 宋文武 via Development of GNU Guix and the GNU System distribution. @ 2024-12-27  7:34 UTC (permalink / raw)
  To: Bodertz; +Cc: guix-devel

Bodertz <bodertz@gmail.com> writes:

> 宋文武 via "Development of GNU Guix and the GNU System distribution."
> <guix-devel@gnu.org> writes:
>
>> I think you should not reuse phases from transmisison, the error came
>> from '#$phases', which has reference to 'gui' output.  so:
>>
>>   ...
>>   (inherit transmission)
>>   (name "transmission-qt")
>>   (outputs '("out")
>>   (arguments
>>     (list ...))   ; instead of 'substitute-keyword-arguments'
>>   ...
>
> Hmm, you appear to be right, but I don't understand why, as I removed
> the tests that referenced the :gui output: 'move-gui, 'glib-or-gtk-wrap,
> and 'wrap-program.
>
> Do you understand it?  Did I miss one?

As described in the manual (8.12 G-Expressions), gexp is used to embed
"build code" into "host code".  In:

         (substitute-keyword-arguments (package-arguments transmission)
           ((#:phases phases)
            #~(modify-phases #$phases
                (delete 'move-gui)
                (delete 'glib-or-gtk-wrap)
                (delete 'wrap-program)))))


'substitute-keywoard-arguments', 'package-arguments' and 'transmission'
will be executed by the host guile, while 'modify-phases' will be
executed by the builder of 'transmission-qt'.  So in this case, the phases
have "gui" was deleted too late, if we managed to delete them before the
builder:

         (substitute-keyword-arguments (package-arguments transmission)
           ((#:phases phases)
            (modify-phases/xxx phases
                (delete 'move-gui)
                (delete 'glib-or-gtk-wrap)
                (delete 'wrap-program)))))

That could work.  But since phases of 'transmission' is a gexp object,
not a alist suitable for 'modify-phases', it not reusable now...



^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2024-12-27  7:38 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-12-26  3:10 How to remove output from inherited package? Bodertz
2024-12-27  2:03 ` 宋文武 via Development of GNU Guix and the GNU System distribution.
2024-12-27  4:52   ` Bodertz
2024-12-27  6:55     ` Bodertz
2024-12-27  7:34     ` 宋文武 via Development of GNU Guix and the GNU System distribution.

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/guix.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).