From e0a0becca90ebf4bc1837172b90a4232b2708080 Mon Sep 17 00:00:00 2001 From: Davide Grilli Date: Wed, 29 Oct 2025 16:23:21 +0100 Subject: [PATCH] feat(docker): add ARM64 cross-compilation support via Docker Add Dockerfile and build script for Linux aarch64 cross-compilation targeting ARM64 devices like Raspberry Pi. Includes documentation updates explaining the build process and troubleshooting tips. The changes enable building Palladium binaries for ARM64 architecture using cross-compilation in a Docker container, with output binaries placed in the build directory. --- docker-build/Dockerfile.linux-aarch64 | 16 ++++++ docker-build/README.md | 71 +++++++++++++++++++++++++++ docker-build/build-linux-aarch64.sh | 61 +++++++++++++++++++++++ 3 files changed, 148 insertions(+) create mode 100644 docker-build/Dockerfile.linux-aarch64 create mode 100644 docker-build/build-linux-aarch64.sh diff --git a/docker-build/Dockerfile.linux-aarch64 b/docker-build/Dockerfile.linux-aarch64 new file mode 100644 index 0000000..aa6f2e8 --- /dev/null +++ b/docker-build/Dockerfile.linux-aarch64 @@ -0,0 +1,16 @@ +FROM ubuntu:20.04 + +ENV DEBIAN_FRONTEND=noninteractive TZ=UTC + +RUN apt-get update && apt-get install -y --no-install-recommends \ + build-essential libtool autotools-dev automake autoconf pkg-config \ + bsdmainutils python3 curl ca-certificates git unzip zip file rsync \ + make cmake patch \ + g++-aarch64-linux-gnu binutils-aarch64-linux-gnu \ + && rm -rf /var/lib/apt/lists/* + +WORKDIR /src + +COPY . /src + +CMD ["/bin/bash"] \ No newline at end of file diff --git a/docker-build/README.md b/docker-build/README.md index 479dc0a..f39dacc 100644 --- a/docker-build/README.md +++ b/docker-build/README.md @@ -64,6 +64,77 @@ docker run --rm -it -v "$(pwd)/../build/linux-x86_64":/out palladium-builder:lin **Missing dependencies:** The Dockerfile installs all required build dependencies automatically +## Linux aarch64 Build + +### Overview + +This build creates Linux aarch64 (ARM64) binaries specifically designed for single board computers like the popular Raspberry Pi and other ARM-based devices. The build process uses cross-compilation in a Docker container: + +1. **Builds a Docker image** (`palladium-builder:linux-aarch64-ubuntu20.04`) containing ARM64 cross-compilation toolchain +2. **Copies the entire repository** into the container during image build +3. **Cross-compiles for ARM64** using the `depends` system with `aarch64-linux-gnu` target +4. **Outputs binaries** to a mounted volume for host access + +### Quick Start + +```bash +cd docker-build +chmod +x build-linux-aarch64.sh +./build-linux-aarch64.sh +``` + +ARM64 binaries will be available in `../build/linux-aarch64/` directory. + +### Prerequisites + +- Docker installed and running ([installation guide](https://docs.docker.com/get-docker/)) +- Sufficient disk space for the build process (at least 12 GB free) +- Internet connection for downloading dependencies and ARM64 cross-compilation toolchain + +### Target Devices + +This build is optimized for: +- **Raspberry Pi 4** and newer models +- **Raspberry Pi 3** (64-bit mode) +- Other ARM64-based single board computers +- ARM64 Linux servers and workstations + +### Produced Binaries + +The following ARM64 binaries are built and copied to the output directory: + +- `palladiumd`: Main daemon +- `palladium-cli`: Command-line client +- `palladium-tx`: Transaction utility +- `palladium-wallet`: Wallet utility +- `palladium-qt`: GUI application (if Qt dependencies are available) + +### Output Directory + +Binaries are placed in: `../build/linux-aarch64/` (relative to the docker-build directory) + +### Cross-Compilation Details + +- **Target Triple**: `aarch64-linux-gnu` +- **Toolchain**: GCC ARM64 cross-compiler +- **Dependencies**: Built using the `depends` system for ARM64 target +- **Configuration**: Uses `CONFIG_SITE` for proper cross-compilation setup + +### Troubleshooting + +**Permission errors:** The build script automatically handles file permissions using host UID/GID + +**Build failed:** Run interactive container for debugging: +```bash +docker run --rm -it -v "$(pwd)/../build/linux-aarch64":/out palladium-builder:linux-aarch64-ubuntu20.04 bash +``` + +**Cross-compilation issues:** Ensure the ARM64 cross-compilation toolchain is properly installed in the container + +**Missing binaries:** Check that the configure script detected the ARM64 target correctly + +**Docker build issues:** Ensure Docker has sufficient resources and the daemon is running + ## Windows x86_64 Build ### Overview diff --git a/docker-build/build-linux-aarch64.sh b/docker-build/build-linux-aarch64.sh new file mode 100644 index 0000000..90d7b95 --- /dev/null +++ b/docker-build/build-linux-aarch64.sh @@ -0,0 +1,61 @@ +#!/usr/bin/env bash +set -euo pipefail + +IMAGE_NAME="palladium-builder:linux-aarch64-ubuntu20.04" +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +REPO_DIR="$(cd "${SCRIPT_DIR}/.." && pwd)" +OUT_DIR="${REPO_DIR}/build/aarch64" +HOST_TRIPLE="aarch64-linux-gnu" + +HOST_UID="$(id -u)" +HOST_GID="$(id -g)" + +echo "[*] Build image including ALL repository files (COPY . /src)..." + +docker build --platform=linux/amd64 \ + -t "$IMAGE_NAME" \ + -f "${SCRIPT_DIR}/Dockerfile.linux-aarch64" \ + "${REPO_DIR}" + +mkdir -p "${OUT_DIR}" + +echo "[*] Start container: build COMPLETED in container; mount ONLY output..." +docker run --rm --platform=linux/amd64 \ + -e HOST_UID="${HOST_UID}" -e HOST_GID="${HOST_GID}" \ + -v "${OUT_DIR}":/out \ + "$IMAGE_NAME" \ + bash -c " + set -euo pipefail + cd /src + + echo '[*] depends (HOST=${HOST_TRIPLE})...' + cd depends && make HOST=${HOST_TRIPLE} -j\$(nproc) && cd .. + + echo '[*] autogen/configure...' + [[ -x ./autogen.sh ]] && ./autogen.sh + [[ -f ./configure ]] || { echo 'configure not found: autogen failed'; exit 1; } + + ./configure --prefix=\$PWD/depends/${HOST_TRIPLE} \ + --host=${HOST_TRIPLE} \ + --enable-glibc-back-compat \ + --enable-reduce-exports \ + CC=${HOST_TRIPLE}-gcc CXX=${HOST_TRIPLE}-g++ \ + AR=${HOST_TRIPLE}-ar RANLIB=${HOST_TRIPLE}-ranlib STRIP=${HOST_TRIPLE}-strip \ + LDFLAGS='-static-libstdc++' + + echo '[*] make...' + make -j\$(nproc) + + echo '[*] copy binaries to /out...' + mkdir -p /out + for b in src/palladiumd src/palladium-cli src/palladium-tx src/palladium-wallet src/qt/palladium-qt; do + [[ -f \"\$b\" ]] && install -m 0755 \"\$b\" /out/ + done + + # Add permissions to host user + chown -R \${HOST_UID:-0}:\${HOST_GID:-0} /out + + echo '[*] build COMPLETED (all binaries in container) → /out' + " + +echo "[*] Binaries aarch64 available in: ${OUT_DIR}"