Note: Fedora Atomic Workstation has recently been renamed to Team Silverblue. Learn more here.
A while ago, I wrote about using GNOME Builder for GTK+ work on my Fedora Atomic Workstation. I’ve done this with some success since then. I am using the nightly builds of GNOME Builder from the sdk.gnome.org flatpak repository, since I like to try the latest improvements.
As these things go, sometimes I hit a bug. Recently, I ran into a memory leak that caused GNOME Builder to crash and burn. This was happening just as I was trying to take some screenshots for a blog post. So, what to do?
I figured that I can go back to using the commandline, without giving up the flatpak environment that I’m used to now, by using flatpak-builder, which is a commandline tool to build flatpak applications. In my opinion, it should come out-of-the-box with the Atomic Workstation image, just like other container tools. But that is not the case right now, so I used the convenient workaround of package layering:
$ rpm-ostree install flatpak-builder
flatpak-builder uses a json manifest that describes what and how to build. GTK+ is shipping manifests for the demo apps in its source tree already, for example this one:
https://gitlab.gnome.org/GNOME/gtk/blob/master/build-aux/flatpak/org.gtk.WidgetFactory.json
These manifests are used in the GNOME gitlab instance to build testable flatpaks for merge requests, as can be seen here:
https://gitlab.gnome.org/GNOME/gtk/-/jobs/24276/artifacts/browse
This is pretty amazing as a way to let interested parties (designers, translators, everybody) test suggested changes without having to go through a prolonged and painful build process of ever-changing dependencies (the jhbuild experience). You can read more about it in Carlos‘ and Jordan’s posts.
For me, it means that I can just use one of these manifests as input to flatpak-builder to build GTK+:
$ flatpak-builder build \ build-aux/flatpak/org.gtk.WidgetFactory.json
This produces a local build in the build/ directory, and I can now run commands in a flatpak sandbox that is populated with the build results like this:
$ flatpak-builder --run build \ build-aux/flatpak/org.gtk.WidgetFactory.json \ gtk4-widget-factory
A few caveats are in order when you are using flatpak-builder for development:
flatpak-builder will complain if the build/ directory already exists, so for repeated building, you should add the –force-clean option.
The manifest we are using here is referring to the main GTK+ git repository, and will create a clean checkout from there, ignoring local changes in your checkout. To work around this, you can replace the https url pointing at the git repository by a file: url pointing at your checkout:
"url": "file:///home/mclasen/Sources/gtk"
You still have to remember to create a local commit for all the changes you want to go into the build. I have suggested that flatpak-builder should support a different kind of source to make this a little easier.
Once you have the basic setup working, things should be familiar. You can get a shell in the build sandbox by using ‘sh’ as the command:
$ flatpak-builder --run build \ build-aux/flatpak/org.gtk.WidgetFactory.json \ sh
flatpak-builder knows to use the sdk as runtime when setting up the sandbox, so tools like gdb are available to you. And the sandbox has access to the display server, so you can run graphical apps without problems.
In the end, I got my screenshots of the font chooser, and this setup should keep me going until GNOME Builder is back on track.