Note: Fedora Atomic Workstation has recently been renamed to Team Silverblue. Learn more here.
I’m frequently building GTK+. Since I am using Fedora Atomic Workstation now, i have to figure out how to do GTK+ development in this new environment. GTK+ may be a good example for the big middle ground of things that are not desktop applications, but also not part of the OS itself.
Last week I figured out how to use a buildah container to build release tarballs for GNOME modules, and I actually used that setup to produce a GTK+ release as well.
But for fixing bugs and other development, I generally need to run test cases and demo apps, like the venerable gtk-demo. Running these outside the container does not work, since the GTK+ libraries I built are linked against libraries that are installed inside the container and not present on the host, such as libvulkan. I could of course resort to package layering to install them on the host, but that would miss the point of using Atomic Workstation.
The alternative is running the demo apps inside the container, which should work – its the same filesystem that they were built in. But they can’t talk to the compositor, since the Wayland socket is on the outside: /run/user/1000/wayland-0. I tried to work around this by making the socket visible in the container, but my knowledge of container tools and buildah is too limited to make it work. My apps still complain about not being able to open a display connection.
What now ? I decided that while GTK+ is not a desktop application, I can treat my test apps like one and write a flatpak manifest for them. This way, I can use GNOME builders awesome flatpak support to build and run them, like I already did for GNOME recipes.
Here is a minimal flatpak manifest that works:
{ "id" : "org.gtk.gtk-demo", "runtime" : "org.gnome.Sdk", "runtime-version" : "master", "sdk" : "org.gnome.Sdk", "command" : "gtk4-demo", "finish-args" : [ "--socket=wayland" ], "modules" : [ { "name" : "graphene", "buildsystem" : "meson", "builddir" : true, "sources" : [ { "type" : "git", "url" : "https://github.com/ebassi/graphene.git" } ] }, { "name" : "gtk+", "buildsystem" : "meson", "builddir" : true, "sources" : [ { "type" : "git", "url" : "https://gitlab.gnome.org/GNOME/gtk.git" } ] } ] }
After placing this json file into the toplevel directory of my GTK+ checkout, it appears as a new build configuration in GNOME builder:
If you look closely, you’ll notice that I added another manifest, for gtk4-widget-factory. You can have multiple manifests in your tree, and GNOME builder will let you switch between them in the Build Preferences.
After all this preparation, I can now hit the play button and have my demo app run right from inside GNOME builder. Note that the application is running inside a flatpak sandbox, using the runtime that was specified in the Build Preferences, so it is cleanly separated from the OS. And I can easily build and run against different runtimes, to test compatibility with older GNOME releases.
This may be the final push that makes me switch to GNOME Builder for day-to-day development on Fedora Atomic Workstation: It just works!
That’s the trick I’m using since months (or years?) to develop retro-gtk and libmanette and I never had to complain so far. 🙂
https://gitlab.gnome.org/GNOME/retro-gtk/blob/master/flatpak/org.gnome.Retro.DemoSamplesTest.json
https://gitlab.gnome.org/aplazas/libmanette/blob/master/demos/manette-test/org.gnome.Manette.Test.json