Dev tools
The Dev tools extension adds a build toolchain to a Frostyard bootc image: CMake and Ninja, the autotools, GDB, Python tooling, and the GTK4 and WebKitGTK development headers. Use it where you build software, not just where you run it. Every image carries the extension’s definition, switched off. The extension itself is not in the image: Updex turns it on and downloads it.
Before you start
Section titled “Before you start”You need:
- A Frostyard bootc image. Every image built on Base has
systemd-sysextandfrostyard-updex. - Root access to enable, update, and remove the extension.
- Network access to
https://repository.frostyard.org/ext/dev/. - Free space in
/varfor the image. Leave room for the toolchain and its headers. - Your source trees and build directories outside
/usr, for example in your home directory or in/var.
The Dev tools extension has no published test results on Frostyard images yet. Try it on a machine you can spare first.
Enable Dev tools
Section titled “Enable Dev tools”See what Updex found, then enable the feature and download it now:
updex features list --component=devsudo updex features enable dev --nowdev appears as a component, with its feature disabled. The enable command
downloads the image, checks its checksum and signature, links it, and refreshes
the merge.
Check the merge and the tools that the extension adds:
systemd-sysext statuscommand -v cmake gdb ninja automakesystemd-sysext status lists dev, and each name prints a path.
There is no unit to check. The extension ships no service.
If enable --now exits with a refresh error (refresh_error in JSON), the
download worked, but the activation did not. If the output says
activation did not finish, the extension is merged, but users and groups can
be missing: reboot. Otherwise the merge state is unknown: reboot. A
sudo systemd-sysext refresh by hand does not create users and groups. Then run
the checks above again.
Use Dev tools
Section titled “Use Dev tools”Build a project the way you normally do. The tools are on PATH: cmake with
ninja, the autotools with pkg-config, and the Python tools. The build asks
for gdb, valgrind, strace, and ltrace as well.
gcc, g++, and make come from the image, not from this extension. The
extension adds what Base does not have.
For GTK4 and WebKitGTK work, the headers are in /usr/include/gtk-4.0 and
/usr/include/webkitgtk-6.0.
The build repoints every /usr/bin and /usr/sbin link that goes through
/etc/alternatives to its real target. An extension cannot ship /etc, so a
link through /etc/alternatives would dangle after a merge. The tools need no
manual step.
live-build and debootstrap are also in the extension.
Update and remove
Section titled “Update and remove”An update swaps /usr under the running system. Start a long build after an
update, not during one. Your source trees and build directories are outside
/usr, so an update leaves them alone.
Remove Dev tools now:
sudo updex features disable dev --now --forceUpdex unmerges all extensions on the host, deletes the Dev tools image, and
merges the rest again. The tools this extension adds go; gcc, g++, and
make stay, because the image supplies them. Reboot when the command finishes.
Without --force, Updex refuses while the image is merged.
Roll back
Section titled “Roll back”Roll back with sudo updex features rollback dev. It takes effect at the next boot. Updex then holds updates until a newer version is published. To stop future updates instead, run sudo updex features disable dev. Your source trees and build directories stay either way. See Roll back.
See Manage system extensions for the update check, the
timer, and plain disable.
Troubleshooting
Section titled “Troubleshooting”| Symptom | Check | Fix |
|---|---|---|
cmake, gdb, ninja, or automake is missing |
systemd-sysext status and command -v cmake |
Check that the image is merged. If it is, reboot: a sudo systemd-sysext refresh does nothing when the merged images did not change. |
gcc or make is missing |
command -v gcc make |
They come from the image, not from this extension. Update the image. |
| GNOME icons render blank after the merge | The installed dev image version |
An older build carried a GdkPixbuf loaders.cache without the SVG loader, which hid Snow’s icons. Install the current image. |
A link under /usr/bin points into /etc/alternatives and does not resolve |
readlink -f /usr/bin/automake |
The build repoints these links, and reports one it cannot resolve. Install a corrected build. |
enable --now exits non-zero after the download |
The output shows Error: sysext refresh failed (refresh_error with --json) |
If the output says activation did not finish, reboot. Otherwise reboot too: a refresh by hand does not create the extension’s users and groups. Then check systemd-sysext status. |
Do not repair the extension with apt. If a merged image is missing files, the
fix is a corrected extension build.
What ships
Section titled “What ships”| Item | What you get |
|---|---|
| Build package requests | build-essential, make, automake, autoconf, libtool, pkg-config, cmake, ninja-build, python3, python3-pip, python3-setuptools, python3-venv, valgrind, gdb, strace, ltrace, live-build, debootstrap, libgtk-4-dev, libwebkitgtk-6.0-dev, librsvg2-common |
| Version | The image file name carries the build-essential version, plus a +rN snosi revision when one is set |
| Image file | dev_<version>_<os>_<arch>.raw.zst; .raw.xz, .raw.gz, and .raw also work |
| Download | From https://repository.frostyard.org/ext/dev/, signature required (Verify=true), into /var/lib/extensions.d/ |
| Tools in the delta | cmake, gdb, ninja, and automake; gcc, g++, and make come from the image |
| Headers | /usr/include/gtk-4.0 and /usr/include/webkitgtk-6.0 |
| Runtime libraries | libepoxy.so.0, libgdk_pixbuf-2.0.so.0, libgstreamer-1.0.so.0, and libpango-1.0.so.0 |
| Icon support | librsvg2-common, the SVG GdkPixbuf loader, and a loaders.cache that names it |
| Services | None |
Each build checks the tool paths, the header trees, the runtime libraries, and the SVG loader with its cache. A build that is missing one fails. The checks run against the finished image, not against the package list. The image holds only what Base does not have, so a package that Base already supplies is not in it.
The SVG loader matters on Snow. A GdkPixbuf loaders.cache in an extension
covers the whole /usr, and a cache without the SVG loader hides Snow’s SVG
icons. This extension therefore carries librsvg2-common and names the loader
in its cache.
The image is an overlay of Base. A later Base can break an older Dev tools image.
See also
Section titled “See also”- System extension catalog
- Nix system extension
- Visual Studio Code system extension
- Manage system extensions
- System extension model
- Updex v2.1.3 command reference
Sources
Section titled “Sources”Reviewed 2026-10-27; Updex facts reviewed 2026-10-30. snosi commit
b2858ca0222814c395cf8248db98f3e096d57dc9;
Updex v2.1.3 commit
2661e987faac986f2594d1d9bbbadf1bf3053f5b.
mkosi.images/dev/mkosi.confmkosi.images/dev/mkosi.postinst.chrootmkosi.images/dev/required-paths.txtmkosi.images/dev/README.mdmkosi.images/base/mkosi.extra/usr/lib/sysupdate.dev.d/dev.featuremkosi.images/base/mkosi.extra/usr/lib/sysupdate.dev.d/dev.transferdocs/design/sysexts.md- Updex v2.1.3
README.md - Updex v2.1.3
updex/features.go - Updex v2.1.3 release
- Updex
docs/adr/0019-apply-merged-sysusers-and-tmpfiles-on-a-live-refresh.md(a live refresh runssystemd-sysusersandsystemd-tmpfiles --create; when the last refresh fails, the merge state is unknown; a refresh by hand does not runsystemd-sysusers) src/data/extensions.jsondocs/adr/0016-automatic-sysext-updates-apply-at-next-boot.md