[PR #3019] Add ARM64 support for the Linux client #3056

Open
opened 2026-10-14 21:07:11 +00:00 by bsakaguchi · 0 comments
Owner

📋 Pull Request Information

Original PR: https://github.com/amnezia-vpn/amnezia-client/pull/3019
Author: @Broklam
Created: 8/22/2026
Status: 🔄 Open

Base: dev ← Head: feat/linux-arm64-build


📝 Commits (4)

  • 79f2c4e fix: derive Qt toolchain directory from host architecture on Linux
  • 576983f fix: name Linux packages after the target architecture
  • 891b233 docs: document building the Linux client on ARM64
  • 0c2e3ce ci: build the Linux client for ARM64

📊 Changes

4 files changed (+112 additions, -3 deletions)

View changed files

📝 .github/workflows/deploy.yml (+67 -0)
📝 README.md (+31 -0)
📝 cmake/CPack.cmake (+6 -1)
📝 deploy/build.sh (+8 -2)

📄 Description

Summary

Adds native ARM64 (aarch64) support for the Linux desktop client: the build scripts now work on ARM hosts, packages are named after the target architecture, and CI builds and uploads an ARM64 client.

Everything here was validated by building the client natively on an aarch64 board (Raspberry Pi, Debian) — Conan builds every dependency from source for armv8, so no prebuilt ARM binaries are required.

Changes

deploy/build.sh — derive the Qt toolchain directory from the host architecture

Qt names its Linux toolchain folder after the host arch, so an ARM64 install lands in gcc_arm64, not gcc_64. The script hardcoded gcc_64 in both QT_HOST_PATH and CMAKE_PREFIX_PATH, so it could never find Qt on ARM. It now picks the directory from uname -m; behaviour on x86_64 is unchanged.

cmake/CPack.cmake — name Linux packages after the target architecture

CPACK_PACKAGE_FILE_NAME was hardcoded to linux_x64, which would have produced an ARM64 package labelled x64. It now uses arm64 when CMAKE_SYSTEM_PROCESSOR is aarch64/arm64, and x64 otherwise.

README.md — document building on Linux ARM64

Qt does not offer ARM64 desktop packages through the online installer, but they are published and aqtinstall can fetch them, so the exact command is written out. Also notes the memory-constrained case (limiting Conan and build parallelism to avoid the compiler being OOM-killed), and adds the missing qtshadertools entry to the module list — it is required at runtime by Qt5Compat.GraphicalEffects.

.github/workflows/deploy.yml — build the Linux client for ARM64

New Build-Linux-Ubuntu-Arm64 job on the ubuntu-22.04-arm runner, mirroring the existing x64 job with three differences:

  • install-qt-action does not expose the linux_arm64 host, so aqt is driven directly.
  • There are no ARM64 prebuilts on the amnezia Conan remote, so every dependency is built from source. ~/.conan2 is cached to keep subsequent runs cheap.
  • No installer is produced — Qt Installer Framework has no ARM64 build — so the job uploads the AmneziaVPN client and AmneziaVPN-service binaries directly.

Test plan

  • Built the client natively on aarch64 (Debian, Qt 6.10.1 via aqtinstall) — Conan resolved and built all dependencies from source, and both AmneziaVPN and AmneziaVPN-service link and run.
  • x86_64 paths are untouched: uname -m falls through to gcc_64 and CPack falls through to linux_x64.
  • The new CI job has not run on this repo's runners yet; it needs a maintainer to approve the workflow run on the PR.

🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.

## 📋 Pull Request Information **Original PR:** https://github.com/amnezia-vpn/amnezia-client/pull/3019 **Author:** [@Broklam](https://github.com/Broklam) **Created:** 8/22/2026 **Status:** 🔄 Open **Base:** `dev` ← **Head:** `feat/linux-arm64-build` --- ### 📝 Commits (4) - [`79f2c4e`](https://github.com/amnezia-vpn/amnezia-client/commit/79f2c4e8ca9be2bf39948782984f5e53a49db29d) fix: derive Qt toolchain directory from host architecture on Linux - [`576983f`](https://github.com/amnezia-vpn/amnezia-client/commit/576983f020c56ad73e1632f9781775a965fdfa73) fix: name Linux packages after the target architecture - [`891b233`](https://github.com/amnezia-vpn/amnezia-client/commit/891b2330da68ccafd800eb05ee788f8dbca925d3) docs: document building the Linux client on ARM64 - [`0c2e3ce`](https://github.com/amnezia-vpn/amnezia-client/commit/0c2e3cea303a67670b278c5e6f0692bb0ed1ae4b) ci: build the Linux client for ARM64 ### 📊 Changes **4 files changed** (+112 additions, -3 deletions) <details> <summary>View changed files</summary> 📝 `.github/workflows/deploy.yml` (+67 -0) 📝 `README.md` (+31 -0) 📝 `cmake/CPack.cmake` (+6 -1) 📝 `deploy/build.sh` (+8 -2) </details> ### 📄 Description ## Summary Adds native ARM64 (`aarch64`) support for the Linux desktop client: the build scripts now work on ARM hosts, packages are named after the target architecture, and CI builds and uploads an ARM64 client. Everything here was validated by building the client natively on an `aarch64` board (Raspberry Pi, Debian) — Conan builds every dependency from source for `armv8`, so no prebuilt ARM binaries are required. ## Changes **`deploy/build.sh` — derive the Qt toolchain directory from the host architecture** Qt names its Linux toolchain folder after the host arch, so an ARM64 install lands in `gcc_arm64`, not `gcc_64`. The script hardcoded `gcc_64` in both `QT_HOST_PATH` and `CMAKE_PREFIX_PATH`, so it could never find Qt on ARM. It now picks the directory from `uname -m`; behaviour on x86_64 is unchanged. **`cmake/CPack.cmake` — name Linux packages after the target architecture** `CPACK_PACKAGE_FILE_NAME` was hardcoded to `linux_x64`, which would have produced an ARM64 package labelled x64. It now uses `arm64` when `CMAKE_SYSTEM_PROCESSOR` is `aarch64`/`arm64`, and `x64` otherwise. **`README.md` — document building on Linux ARM64** Qt does not offer ARM64 desktop packages through the online installer, but they are published and `aqtinstall` can fetch them, so the exact command is written out. Also notes the memory-constrained case (limiting Conan and build parallelism to avoid the compiler being OOM-killed), and adds the missing `qtshadertools` entry to the module list — it is required at runtime by `Qt5Compat.GraphicalEffects`. **`.github/workflows/deploy.yml` — build the Linux client for ARM64** New `Build-Linux-Ubuntu-Arm64` job on the `ubuntu-22.04-arm` runner, mirroring the existing x64 job with three differences: - `install-qt-action` does not expose the `linux_arm64` host, so `aqt` is driven directly. - There are no ARM64 prebuilts on the `amnezia` Conan remote, so every dependency is built from source. `~/.conan2` is cached to keep subsequent runs cheap. - No installer is produced — Qt Installer Framework has no ARM64 build — so the job uploads the `AmneziaVPN` client and `AmneziaVPN-service` binaries directly. ## Test plan - Built the client natively on `aarch64` (Debian, Qt 6.10.1 via `aqtinstall`) — Conan resolved and built all dependencies from source, and both `AmneziaVPN` and `AmneziaVPN-service` link and run. - x86_64 paths are untouched: `uname -m` falls through to `gcc_64` and CPack falls through to `linux_x64`. - The new CI job has not run on this repo's runners yet; it needs a maintainer to approve the workflow run on the PR. --- <sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
Sign in to join this conversation.
No labels
pull-request
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
amnezia-vpn/amnezia-client#3056
No description provided.