Skip to content

Take Hyprtoolkit from the mirror so fresh guest builds work again - #284

Open
stevederico wants to merge 5 commits into
omacom:mainfrom
stevederico:fix/280-hyprtoolkit-mirror
Open

stevederico wants to merge 5 commits into
omacom:mainfrom
stevederico:fix/280-hyprtoolkit-mirror

Conversation

@stevederico

@stevederico stevederico commented Sep 28, 2026 •

Copy link
Copy Markdown
Contributor

What changed and why

Fixes #280. A fresh make guest on main stops at unable to satisfy dependency 'hyprland-guiutils' required by hyprland. Two things cause it:

  • Arch Linux ARM dropped hyprland-guiutils 0.2.2-3. Its replacement, 0.2.2-4, needs libhyprtoolkit.so=6, which only Hyprtoolkit 0.6.0 provides, not the local 0.5.4 rebuild.
  • fix: hold hyprland-guiutils with the compatible graphics stack #268 put hyprland-guiutils on the guest's IgnorePkg, and the factory builder reuses those holds. pacman won't install an ignored package to satisfy another package's dependency, so Hyprland can't pull it in even when a compatible version exists.

The mirror is consistent again: its Hyprtoolkit 0.6.0-1 is built against libaquamarine.so=14, the same ABI as the pinned aquamarine 0.15.1 and Hyprland 0.56.2. So this PR:

  • Drops the Hyprtoolkit 0.5.4 ABI rebuild (spec pin, PKGBUILD, launcher and contract checks) and takes Hyprtoolkit 0.6.0-1 and hyprland-guiutils 0.2.2-4 from the locked mirror transaction. The aquamarine rebuild stays.
  • Lets the builder release the two holds that only arrive as dependencies (DEPENDENCY_HOLDS in write-builder-pacman-conf.py). The finished guest still holds the kernel, Hyprland, aquamarine, Hyprtoolkit and hyprland-guiutils together, so omarchy update fails: hyprland-guiutils 0.2.2-4 needs libhyprtoolkit.so=6, but hyprtoolkit is held at 0.5.4 #266/fix: hold hyprland-guiutils with the compatible graphics stack #268 are unchanged for users.
  • Refreshes packages.lock.json (46 packages the mirror has moved, including linux-aarch64 7.2.8-1 and systemd 262).
  • Follows the mirror's Hyprland build tools (hyprland-protocols 0.7.1-1, meson 1.12.1-1; the pinned versions are gone), and pins the resulting Hyprland binary digest and the launcher's component identity.

Testing

On a Mac mini M4, macOS 26.6.2, Docker via Colima (6 CPUs, 10 GiB), native arm64:

  • guest/build-container.sh --refresh-package-lock guest/packages.lock.json: wrote the lock in this PR.
  • OMARCHY_GUEST_BUILD_JOBS=4 make guest: passes ([build-cache] recorded successful guest build). On main it fails with the error in make guest fails: hyprland-guiutils 0.2.2-3 is gone from ALARM, and 0.2.2-4 needs hyprtoolkit 0.6 #280.
  • Hyprland is reproducible with the new toolchain: two separate builds produced the same binary (32bd58fd…); the first failed the old digest check, the second matched the new pin.
  • make app: passes.
  • Launched the built app's run-qemu-gpu.sh --ephemeral: the fresh guest boots to omarchy-factory login:.
  • python3 guest/tests/verify.py: native guest contract verified.
  • python3 -m unittest guest.tests.test_builder_pacman_conf guest.tests.test_repair_update_holds: 18 tests pass. The builder test now asserts that the dependency-only holds are released in the builder config while the guest file keeps them.
  • The make test suites on the same Mac mini: test-contracts and test-guest pass (256 guest tests, 1 skipped). The Swift suite passes (377 tests in 81 suites). The nine test-shell suites and test-resize pass. The mini has Command Line Tools 26.4.1 rather than Xcode, so the Swift suite ran as swift test with the Command Line Tools' Testing.framework added to the search path; CI covers it with Xcode.
  • First boot of the built guest in the app's run-qemu-gpu.sh --ephemeral: owner provisioning ("Setting up your machine") completes and lands on the Hyprland desktop with Waybar and the first-run notifications. In the guest, pacman -Q reports hyprland 0.56.2-3.2, hyprtoolkit 0.6.0-1, hyprland-guiutils 0.2.2-4, aquamarine 0.15.1-1 and linux-aarch64 7.2.8-1.
  • omarchy-update in that guest: package databases sync, the full system upgrade reports "there is nothing to do", and mise tools are up to date. No errors.

Release

Once this is in, could we cut a release? main has 44 commits since v0.4.1, and users on 0.4.1 still hit issues that are already fixed there, including #257, #263, #266, #259, #238, #212 and the M4 startup crash (#151, fixed by #277). A fresh guest build was the blocker, which this PR clears.

Arch Linux ARM dropped hyprland-guiutils 0.2.2-3, and 0.2.2-4 needs
libhyprtoolkit.so=6, which the local Hyprtoolkit 0.5.4 rebuild does not
provide. The mirror's Hyprtoolkit 0.6.0 is already built against
libaquamarine.so=14, so the rebuild is no longer needed. Keep the aquamarine
rebuild and every guest hold.
pacman will not install an ignored package to satisfy another package's
dependency, so holding hyprland-guiutils (and now Hyprtoolkit) in the builder
leaves Hyprland unresolvable. The finished guest keeps both holds.
Resolved natively on Apple Silicon with guest/build-container.sh
--refresh-package-lock. Brings hyprtoolkit 0.6.0-1 and hyprland-guiutils
0.2.2-4 with the other packages the mirror has moved since the last refresh.
The ARM mirror replaced hyprland-protocols 0.7.0-1 and meson 1.12.0-1, so the
patched Hyprland build could not install its pinned toolchain.
hyprland-protocols 0.7.1 and meson 1.12.1 produce a different reproducible
Hyprland binary. Update its digest and the launcher's component identity.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

make guest fails: hyprland-guiutils 0.2.2-3 is gone from ALARM, and 0.2.2-4 needs hyprtoolkit 0.6

1 participant