Subject: bug#62672: closed (Unexpected interaction between gobject-introspection and grafts)

From: [email-masked] (GNU bug Tracking System)
Date: Sat, 27 Apr 2024 01:33:13 +0000

Your bug report

#62672: Unexpected interaction between gobject-introspection and grafts

which was filed against the guix package, has been closed.

The explanation is attached below, along with your original report.
If you require more details, please reply to [email-masked].

-- 
62672: https://debbugs.gnu.org/cgi/bugreport.cgi?bug=62672
GNU Bug Tracking System
Contact [email-masked] with problems

Subject: Unexpected interaction between gobject-introspection and grafts
From: "Collin J. Doering" <[email-masked]>
To: [email-masked]
Date: Fri, 26 Apr 2024 21:32:02 -0400
List-Id: <debbugs-submit.debbugs.gnu.org>

Thanks Josselin.

I haven't looked at this in some time, so I'm closing to avoid clutter.

-- 
Collin J. Doering

http://rekahsoft.ca
http://blog.rekahsoft.ca
http://git.rekahsoft.ca

Subject: Unexpected interaction between gobject-introspection and grafts
From: "Collin J. Doering" <[email-masked]>
To: [email-masked]
Date: Tue, 04 Apr 2023 20:04:00 -0400
List-Id: <debbugs-submit.debbugs.gnu.org>

Hi team Guix!

I was working on packaging taffybar (https://github.com/taffybar/taffybar), which depends on haskell-gi (https://github.com/haskell-gi/haskell-gi) - haskell bindings for goject-introspection capable libraries. While packaging gi-gdk, I hit this error:

--8<---------------cut here---------------start------------->8---
** (process:23): WARNING **: 00:09:56.407: Failed to load shared library '/gnu/store/91ar3zh59n19rdn00png5r9hxp3k0y13-gtk-4.8.1/lib/libgtk-4.so.1' referenced by the typelib: libgtk-4.so.1: cannot open shared object file: No such file or directory
Could not resolve symbol "gdk_device_pad_get_type" in namespace "Gdk-4.0"
CallStack (from HasCallStack):
  error, called at lib/Data/GI/CodeGen/LibGIRepository.hs:202:16 in haskell-gi-0.26.4-HCp1omjln8S5hdZ8Oexk5N:Data.GI.CodeGen.LibGIRepository
error: in phase 'configure': uncaught exception:
--8<---------------cut here---------------end--------------->8---

However, confusingly enough the shared library that is referenced by the typelib exists in my store (and is also included via the gtk package as a dependency, so I would expect its available during the build). It took me a bit to realize that the un-grafted gtk package is being used in the typelib, but really the grafted one is needed.

--8<---------------cut here---------------start------------->8---
➜ guix build --no-grafts gtk                                                                   
...
/gnu/store/91ar3zh59n19rdn00png5r9hxp3k0y13-gtk-4.8.1
➜ guix build gtk            
...
/gnu/store/sz90zf6yynsymb1a74zai87f2yi3da82-gtk-4.8.1
--8<---------------cut here---------------end--------------->8---

In the manual "Debugging Build Failures" (https://guix.gnu.org/manual/devel/en/html_node/Debugging-Build-Failures.html#Debugging-Build-Failures), it notes that the build environment can be mimicked using guix shell (explicitly specifying the '--no-grafts' options). Entering this environment and looking more closely at the gtk package in use, it appears that its typelib for libgtk references the .so appropriately.

--8<---------------cut here---------------start------------->8---
➜ guix shell --no-grafts -L . -C -D ghc-gi-gdk binutils
[env]$ readlink -f $GUIX_ENVIRONMENT/lib/girepository-1.0/Gtk-4.0.typelib
/gnu/store/91ar3zh59n19rdn00png5r9hxp3k0y13-gtk-4.8.1/lib/girepository-1.0/Gtk-4.0.typelib
[env]$ strings $GUIX_ENVIRONMENT/lib/girepository-1.0/Gtk-4.0.typelib | grep libgtk
/gnu/store/91ar3zh59n19rdn00png5r9hxp3k0y13-gtk-4.8.1/lib/libgtk-4.so.1
--8<---------------cut here---------------end--------------->8---

So this all to say that I'm not sure whats going wrong with my build, but I suspect it has something to do with grafting. Any help appreciated.

Here is my definition of ghc-gi-gtk (the package that causes this build failure to become apparent):

--8<---------------cut here---------------start------------->8---
(define-public ghc-gi-gdk
  (package
    (name "ghc-gi-gdk")
    (version "4.0.5")
    (source (origin
              (method url-fetch)
              (uri (hackage-uri "gi-gdk" version))
              (sha256
               (base32
                "1pa8vbm931xq3rb9xr441sccga9h1y03lzf6hp2rwkhyhs006hax"))))
    (build-system haskell-build-system)
    (properties '((upstream-name . "gi-gdk")))
    (inputs (list gtk
                  gdk-pixbuf
                  ghc-haskell-gi-base
                  ghc-haskell-gi
                  ghc-haskell-gi-overloading
                  ghc-gi-cairo
                  ghc-gi-pango
                  ghc-gi-gio
                  ghc-gi-gdkpixbuf
                  ghc-gi-gobject
                  ghc-gi-glib))
    (native-inputs (list pkg-config
                         gobject-introspection-cairo)) ; for GI repository files (.gir files)
    (home-page "https://github.com/haskell-gi/haskell-gi")
    (synopsis "Gdk bindings")
    (description "Bindings for Gdk, autogenerated by haskell-gi.")
    (license license:lgpl2.1)))
--8<---------------cut here---------------end--------------->8---

I did not include other dependencies that are not yet packaged upstream (eg. ghc-gi-*, ...), but am happy to provide them if they are useful for reproduction of this issue.

PS: If you noticed I'm using the package 'gobject-introspection-cairo', this is because I found that the cairo typelibs are not included in the cairo package, or gobject-introspection. I worked around this using the aforementioned variant, which is defined like so:

--8<---------------cut here---------------start------------->8---
(define-public gobject-introspection-cairo
  (package
    (inherit gobject-introspection)
    (name "gobject-introspection")
    (inputs (cons* (list "cairo" cairo) (package-inputs gobject-introspection)))
    (arguments
     `(#:phases
       (modify-phases %standard-phases
         (add-before 'configure 'patch-cairo-gir
           (lambda* (#:key inputs outputs #:allow-other-keys)
             (let* ((out (assoc-ref outputs "out"))
                    (cairo (assoc-ref inputs "cairo")))
               (substitute* '("gir/cairo-1.0.gir.in")
                 (("@CAIRO_SHARED_LIBRARY@")
                  (string-append cairo "/lib/@CAIRO_SHARED_LIBRARY@")))
               #t))))))))
--8<---------------cut here---------------end--------------->8---

Note: this adjustment to gobject-introspection should likely make it upstream (and was inspired by a similar change to nix (described https://github.com/NixOS/nixpkgs/pull/34081)).

-- 
Collin J. Doering

http://rekahsoft.ca
http://blog.rekahsoft.ca
http://git.rekahsoft.ca