Add native AArch64 package build support - #240
Conversation
|
I was doing something similar and I've found out that some ARM packages are not fully compatible and contain x86 binaries inside. |
Thanks — I ran into the same issue while working on this PR. I added an audit that unpacks every built package, checks its ELF files, and fixed the foreign ELF payloads it found. However, my current audit doesn’t yet recursively inspect nested containers or cover non-ELF formats. Typora is a good example: its Linux binaries are AArch64, but the package still contains an x86_64 Mach-O Node addon. |
Summary
This pull request adds native AArch64 support to the existing Omarchy package
toolchain while preserving the current x86_64 behavior and release design.
through build, signing, repository-index, cleanup, and removal operations.
dependency ordering through package names and virtual
provides.AArch64 build/runtime closure and application set.
standard PKGBUILD fields,
.omarchy/patches, andpost-sync.shhooks.managed ECMA-335 assemblies, ASAR, and libarchive-supported payloads before
AArch64 artifacts enter the repository.
paths and SHA-256-pinned file/container reviews, including output-specific
policy for split PKGBUILDs.
public key before pacman synchronizes a signed baseline.
Operators retain the existing command shape, for example:
Outputs remain isolated under
<channel>/aarch64.Design boundaries
This is intentionally not a release-system rewrite. It does not add an
emulated CI build, change the scheduler, replace the edge/rc/stable release
train, introduce a downstream signing key, or include the fork's GitHub Release
adapter. Native AArch64 production scheduling and multi-architecture release
coordination are documented as follow-up work rather than hidden in this PR.
The existing optional cross-architecture behavior is left intact, but all
acceptance work for this change was performed on native AArch64 hardware with
no QEMU or binfmt emulation.
Package scope
The source tree contains 136 package bases after this PR. Their AArch64 status
is deliberately explicit:
The supported range is therefore 116 package bases: 69 unchanged, 27 adapted,
and 20 added.
dropbox-clibelongs to the excluded group, but its existingrecipe is changed from
anytox86_64so its real runtime constraint is notmisrepresented. This is why the Git diff touches 28 existing package
directories while only 27 are AArch64 adaptations.
27 existing recipes adapted for AArch64
1password,asdcontrol,cursor-bin,cursor-cli,github-copilot-cli,grok-bot,hermes-desktop,heroic-games-launcher-bin,hyprland-preview-share-picker,libretro-uae-git,limine-mkinitcpio-hook,lmstudio-bin,omasnap,openai-codex-desktop,qmk-hid,rustdesk,sunshine,symfony-cli,t3code-bin,tensaku,typora,tzupdate,v4l2-relayd,visual-studio-code-bin,voxtype-bin,xpadneo-dkms, andyt6801-dkms.20 package directories added
bindfs,dotnet-runtime-bin(pkgbasedotnet-core-bin),gradle,gtk-engine-murrine, andgtk2.bitwarden,brave-bin,brave-origin-bin,ghostty,google-chrome,obsidian,ollama,pandoc-cli,pinta,zed, andzen-browser-bin.libretro-blastem,libretro-desmume,libretro-kronos, andlibretro-ppsspp.20 package bases explicitly excluded from AArch64
dropbox,makima-bin,minecraft-launcher,spotify, andtmog-bin.dropbox-cliandnautilus-dropbox.lib32-nvidia-580xx-utilsandnvidia-580xx-utils.asusctl,dell-xps-touchpad-haptics,dell-xps13-sidecar-amps,intel-ipu7-camera,libfprint-git,macbook12-spi-driver-dkms,macbook8-spi-pxa2xx-nodma-dkms,supergfxctl, andtuxedo-drivers-nocompatcheck-dkms.linux-ptlandt3code-patched-bin(the supported ARM path ist3code-bin).Notable package and tooling decisions
repository. Wrong-architecture ELF and unreviewed Mach-O, native PE, or DOS
executables fail closed; extraction depth, files, bytes, and time are bounded.
dotnet-sdk-binsplit output retains five Microsoft Windows-target debuggingtools under an output-specific, exact path-and-digest policy; the other five
outputs from the same PKGBUILD receive no exception.
shims are product runtime data rather than Linux host executables. Each
retained file/container is checksum-pinned; a changed or unused entry fails.
cld.node. The AArch64 recipe removes that exact payload, accepts a futureAArch64 ELF replacement, and rejects any unknown replacement.
Windows/macOS prebuilds. Their recipes first require the corresponding Linux
ARM64 native files where applicable, so cleanup cannot hide a missing native
implementation.
apply-seccomphelper inside thevendor ASAR because the ARM64 archive has no replacement and rewriting the
ASAR would change the vendor container. Its exact nested bytes are reviewed;
the missing ARM64 helper remains a documented vendor limitation.
makepkg --packagelist. This fixes a genericbug where a recipe consuming an official
.pkg.tar.zstsource could havethat source archive mistaken for a newly built package.
expected fingerprint. The builder imports only that single matching key
before pacman synchronization; it does not embed a downstream key or disable
signature verification.
dropbox-cliis explicitly constrained to x86_64. Its Python code isportable, but it cannot operate without Dropbox's proprietary x86_64-only
daemon, so publishing it as
anywould create an unsatisfiable AArch64package.
the dependencies and install layout used by AUR
rustdesk-binand consumesRustDesk's official ARM64 RPM.
for its dependency-cache fetch. The sync hook fails closed if its upstream
baseline changes.
!strip, avoiding asecond strip pass over custom ELF sections.
and other exceptional packages remain package-local and are documented
individually.
Native validation
The repository's normal Docker entry point was exercised on a native AArch64
host. The complete upstream-aligned range contained 116 package bases and
produced 145 archives: 112 declared
aarch64and 33 declaredany.That zero-baseline validation:
AArch64;
name the same package set;
Those original counts predate the multi-format recursive gate, so they prove
native construction, direct ELF architecture, signing, completeness, and
dependency resolution, but not opaque nested-container contents.
A later read-only audit recursively inspected all 147 archives in the fork's
published edge snapshot, expanding 288,990 files (21.8 GB) and 424 containers.
It identified normal managed .NET assemblies, Gradle and Heroic's deliberate
cross-platform data, one
file(1)false positive, and the five removableforeign payload classes now fixed in Cursor, Copilot CLI, T3 Code, Typora, and
VS Code.
The stable snapshot was downloaded and verified independently because its 145
archive hashes differed from edge. All 145 matched the published checksums
before scanning. The recursive audit expanded 287,417 files (21.8 GB) and 422
containers: 140 historical archives passed the hardened policy and the same
five pre-fix package revisions failed, with no stable-only finding.
Targeted native builds through the normal Docker entry point then passed the
hardened build gate for Typora, Cursor, Copilot CLI, T3 Code, VS Code, and all
six outputs of the .NET split PKGBUILD. Cursor, Copilot, T3, and Typora had no
foreign executable after cleanup. VS Code retained only its one exact reviewed
nested helper. The .NET SDK selected its five-file output policy while its
other outputs used no exception. Gradle and Heroic's published payloads also
passed with their exact container/file reviews. No QEMU, GitHub Actions build,
release mutation, production signing key, or production repository write was
used for this acceptance work.
A signed-baseline rehearsal additionally exercised the generic key handoff.
The correct pinned fingerprint allowed pacman to synchronize the signed
AArch64 database and skip an up-to-date package; a deliberately incorrect
fingerprint failed before repository synchronization.
Static coverage is available through:
The metadata test verifies the 47 package bases added or adapted by this PR;
the architecture-audit test covers nested containers, managed PE, exact file
and container policies, stale/digest-mismatched entries, both target
architectures, false-positive archive signatures, and resource limits.
Review guide
The history is organized into eight reviewable commits:
affected package recipes; and
gitin the Actions test container used by the architecture patchchecks.
docs/aarch64-package-notes.mddocuments every package-level exception and itssync/update strategy.
docs/aarch64-follow-up.mdrecords the validation,explicit exclusions, vendor limitations, and the remaining production
edge/rc/stable rollout work.