It has been a while now that I switched to Fedora Silverblue as my primary operating system, and I really dig the separation of using
- an immutable operating system
- flatpak for graphical applications
- toolbox for non-graphical development
You probably know that flatpak is not only a great option for running graphical applications, but also for developing them — in particular when using the amazing GNOME Builder.
It is however not an option for developing core desktop components like gnome-shell — sadly old-fashioned JHBuild is still the tool of choice there. And on Silverblue, the cleanest option for installing that tool is inside a toolbox container.
The whole process is not completely straight-forward and took me a while to figure out, which is why I’m now sharing it in this friendly service blog.
Creating a toolbox
Fortunately that first step is easy enough:
host$ toolbox create --container jhbuild
host$ toolbox enter --container jhbuild
Next we need to install jhbuild inside the toolbox. That process is not fundamentally different from installing it on a traditional distribution like Fedora Workstation, except for one caveat: The
jhbuild sysdeps command relies on PackageKit, which is not available inside the container.
dnf builddep is one way to get around that, I opted for a small helper script that automates the jhbuild setup:
toolbox$ ./sb-jhbuild-setup.sh gnome-shell
Setting it up to run gnome-shell
We can now use
jhbuild to build GNOME modules, just like we would do normally1:
toolbox$ jhbuild build --skip=WebKit gnome-shell
For most modules, we are done now — we can simply run them through
jhbuild run inside the toolbox.
Big surprise though: That doesn’t apply to running a wayland compositor like gnome-shell. We need quite a bit more there, namely
- suitable graphics drivers
- access to the “real” /tmp directory
- access to the host’s logind
Graphics drivers are a relatively easy problem to fix, we just need to install the correct package. And for the last two items, toolbox thankfully makes the host filesystem available under /run/host inside the container.
As you may have guessed: There’s another script to automate those steps, which then allows us to run gnome-shell in nested mode:
toolbox$ su -c ./sb-gnome-shell-setup.sh
toolbox$ jhbuild run dbus-run-session gnome-shell --wayland --nested
Setting up a jhbuild session
In a lot of cases, nested mode is good enough for testing changes. But sometimes we really want to test a full session.
And that’s it!