This document explains how RustScan's ARM support works, how to build ARM binaries locally, and how the CI pipeline validates ARM builds and tests.
The CI pipeline builds and tests Linux ARM64 using the target:
aarch64-unknown-linux-gnu
The build pipeline also produces additional Linux artifacts for other targets, but ARM validation focuses on aarch64 Linux.
ARM support is provided via GitHub Actions using actions/setup-rust plus cross for cross-compilation. The pipeline includes:
- A build matrix that includes
aarch64-unknown-linux-gnufor Linux builds. - A dedicated ARM test job that runs
cross testfor the aarch64 target. - Explicit Python installation and dependency setup for the scripting integration tests.
Key files:
- CI workflows: .github/workflows/build.yml and .github/workflows/test.yml
- Cross configuration: Cross.toml
cross runs builds and tests inside a container that has the right toolchain for the target. This avoids local toolchain setup and makes the aarch64 Linux build reproducible in CI.
RustScan’s scripting tests execute a Python script from the fixtures directory, so Python must exist in the test environment. For ARM CI, Python is installed in the cross container using the pre-build hooks in Cross.toml.
You can build ARM binaries locally using cross on any host OS that supports Docker/Podman.
cargo install cross
cross build --locked --release --target aarch64-unknown-linux-gnu
The resulting binary is located at:
target/aarch64-unknown-linux-gnu/release/rustscan
Run the test suite for the ARM target with:
cross test --target aarch64-unknown-linux-gnu
This runs the Rust unit and integration tests inside the aarch64 container. The Python script-based test is included and relies on the Python setup defined in Cross.toml.
If you need additional tools in the ARM container (for example, extra Python packages), update the pre-build list in Cross.toml. The current configuration installs Python and basic packaging tools.
If the run_python_script test fails, verify that the container has Python installed and that the script shebang is executable. In CI, this is handled by the pre-build steps in Cross.toml. For local use, ensure your Docker/Podman backend is functioning and that cross can download the base image.
If you see target-related errors, ensure cross is installed and you are using the correct target triple:
aarch64-unknown-linux-gnu
Does this add native ARM runners?
No. The ARM jobs run on standard GitHub-hosted runners and use cross to build and test aarch64 Linux in containers.
Can I build ARM binaries without cross?
Yes, but you’ll need to install a compatible target toolchain and linker locally. cross is the recommended approach because it’s consistent with CI.