Skip to content

An aarch64 package for omarchy-aquarium, which actually compiles #18

Closed

Description

@phmatray

Part of #14 — Releases publish no installable package, only GitHub's source zip.
Blocked by: Prove the release-package pattern on macarchy-touchbar (#16)

Problem

omarchy-aquarium is the one repo that genuinely compiles: nine C sources under src/ behind a Makefile. Its package cannot be arch=('any') and cannot be built in the x86_64 container the other slices use — it needs a real aarch64 Arch environment, which the org has never had in CI.

Proposed solution

An arch=('aarch64') PKGBUILD with a build() that runs the existing Makefile, built on the ubuntu-24.04-arm runner (already used by macarchy-install's clean machine workflow) inside an aarch64 Arch container.

Area

ci

📋 Spec

Goal

omarchy-aquarium's releases carry an aarch64 package built from that tag.

Design

The unknown here is the container, and it is the first thing to settle: the official archlinux image is x86_64-only, so this needs an Arch ARM image (menci/archlinuxarm, lopsided/archlinux-arm or equivalent) running on ubuntu-24.04-arm. If no usable image is found, the honest fallback is makepkg on the runner's own Ubuntu with a vendored pacman — and if that is not workable either, say so and leave the aquarium out rather than shipping a package built on the wrong architecture.

build() runs the repo's Makefile; package() installs the renderer, the toggle and notify scripts, and the theme hook. The Wayland/EGL build dependencies go in makedepends, not depends.

Acceptance criteria

  1. omarchy-aquarium's next release carries one *.pkg.tar.* whose .PKGINFO records arch = aarch64.
  2. The packaged binary runs on the target machine — omarchy-aquarium --help (or its equivalent) exits 0.
  3. The build happens on an aarch64 runner; no cross-compilation and no qemu emulation.
  4. If no usable aarch64 Arch container exists, the issue closes with that finding recorded on Releases publish no installable package, only GitHub's source zip #14 and no package shipped — never a package built on the wrong arch.

Testing decisions

Seams under test: .PKGINFO's arch field inside the built package, and the packaged binary's exit code on the target machine.
Prior art: macarchy-install/.github/workflows/clean-machine.yml — the existing ubuntu-24.04-arm job.
A good test here: assert arch = aarch64 from the built package rather than trusting the PKGBUILD's declaration.

Out of scope

  • Cross-compiling, or building under qemu emulation. Both produce a package nobody verified on real hardware.

🛠️ Implementation plan

For agentic workers: execute this plan task-by-task with implement-issue (subagent-per-task for broad plans, inline for small ones). Steps use checkbox (- [ ]) syntax for tracking.

Goal: an aarch64 package on every aquarium release, or a recorded finding that CI cannot build one.
Architecture: PKGBUILD wrapping the existing Makefile; a workflow on ubuntu-24.04-arm.
Tech stack: C, make, makepkg 7, GitHub Actions, an aarch64 Arch container.

Seams under test: .PKGINFO's arch field, and the packaged binary's exit code on the target machine.

Global constraints

  • No cross-compilation, no qemu. An unverifiable package is worse than none.
  • Wayland/EGL headers are makedepends, not depends.
  • Conventional Commit PR title decides the release bump; commits below use feat.
  • Commit trailer: Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>.

Task 1: settle the container question before writing anything

Files: none yet — this task produces a finding, recorded on this issue.

Interfaces: a container image that runs makepkg on ubuntu-24.04-arm, or a stated conclusion that none does.

  • Step 1: Try each candidate aarch64 Arch image in a scratch workflow on ubuntu-24.04-arm; record which pull and which run makepkg --version.
  • Step 2: Record the winner — or the failure — as a comment on this issue, with the run URL.
  • Step 3: If none works, stop here: report on Releases publish no installable package, only GitHub's source zip #14 and close this issue as not doable in CI today, without shipping a package.

Task 2: the PKGBUILD, built and verified

Files: create PKGBUILD, .github/workflows/package.yml; test tests/test_pkgbuild.sh.

Interfaces: arch=('aarch64'); build() calls make; package() installs the renderer, bin/* and hooks/*.

  • Step 1: Write the failing test (seam: .PKGINFO's arch inside the built package) — assert arch = aarch64.
  • Step 2: Run → FAIL (no PKGBUILD).
  • Step 3: Write the PKGBUILD; build it locally — this machine IS aarch64 Arch, so the local build is the real thing, not an approximation.
  • Step 4: tar -tf it, install it with pacman -U, and run the packaged binary.
  • Step 5: Add the workflow on ubuntu-24.04-arm with Task 1's image; assert release-only.
  • Step 6: Re-run the suite → PASS.
  • Step 7: Commit: feat(pkg): publish an aarch64 package on release.
  • Step 8: After the next release, confirm the asset's .PKGINFO says aarch64 and record it on Releases publish no installable package, only GitHub's source zip #14.

Activity

  1. added
    bugSomething isn't working
    priority: lowDo it when the queue is otherwise empty
    effort: mediumA handful of tasks inside one layer
    area: cithe workflows and the hermetic test suites
    on Sep 4, 2026
  2. phmatray commented on Sep 5, 2026

    @phmatray
    ContributorAuthor

    Done. omarchy-aquarium v0.3.1 carries omarchy-aquarium-0.3.1-1-aarch64.pkg.tar.xz, built on a real aarch64 runner.

    Task 1's container question, settled by a run

    There is no docker access on this machine, so the image could not be tried locally — which is exactly why Task 1 existed. menci/archlinuxarm:base-devel on ubuntu-24.04-arm works, after one fix:

    error: restricting filesystem access failed because the Landlock ruleset
           could not be applied: Operation not permitted
    error: switching to sandbox user 'alpm' failed!
    

    pacman 7 confines its downloader with Landlock and drops to the alpm user; neither is permitted in that container. v0.3.0 published with no package because of it. --disable-sandbox turns off only the downloader's confinement inside a throwaway CI container — signature checking is untouched — and the flag lives only in this repo's copy of the job, since the four arch=('any') repos build in archlinux:base-devel and never hit it.

    macarchy/omarchy-aquarium#10 and #12.

    Acceptance criteria

    1. .PKGINFO records arch = aarch64 — asserted by the job itself, which fails the build if it says anything else. Declaring the arch is not the same as building it.
    2. The packaged binary runs — verified locally before CI was written, because this machine is aarch64 Arch: file reports ELF 64-bit LSB pie executable, ARM aarch64, and omarchy-aquarium --help exits 0 from the extracted package.
    3. Built on an aarch64 runner, no cross-compilation, no qemu — ubuntu-24.04-arm, and a test asserts no qemu step exists in the workflow.
    4. Not reached: a usable image was found.

    One thing worth keeping

    The asset is …-aarch64.pkg.tar.**xz**, while the other five are .zst: the ARM image's PKGEXT differs from archlinux:base-devel's. The upload globs *.pkg.tar.* rather than naming an extension, which is the only reason this landed instead of silently uploading nothing.

    package() reuses the repo's own make install rule with PREFIX pointing at the staging root, so there is no second list of files to drift from the Makefile.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area: cithe workflows and the hermetic test suitesbugSomething isn't workingeffort: mediumA handful of tasks inside one layerpriority: lowDo it when the queue is otherwise empty

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions