Headless Rust gRPC daemon to drive Bluetooth, HLS/DASH playback, and snapcast/shairport-sync/squeezelite on Raspberry Pi audio rigs.
1FROM ghcr.io/cross-rs/aarch64-unknown-linux-gnu:main
2
3# arm64 system libs the cross-compiled binary links against.
4RUN dpkg --add-architecture arm64 && \
5 rm -f /etc/apt/preferences.d/all-packages && \
6 apt-get update && \
7 apt-get --assume-yes install --no-install-recommends \
8 curl \
9 unzip \
10 ca-certificates \
11 libasound2-dev:arm64 \
12 libdbus-1-dev:arm64 \
13 libsystemd-dev:arm64 \
14 libsystemd0:arm64 && \
15 rm -rf /var/lib/apt/lists/*
16
17# Modern protoc — see Dockerfile.arm-unknown-linux-gnueabihf for context.
18# protoc runs on the build host (x86_64), not on the aarch64 target.
19ARG PROTOC_VERSION=25.1
20RUN curl -fsSL "https://github.com/protocolbuffers/protobuf/releases/download/v${PROTOC_VERSION}/protoc-${PROTOC_VERSION}-linux-x86_64.zip" -o /tmp/protoc.zip && \
21 unzip -q /tmp/protoc.zip -d /usr/local && \
22 rm /tmp/protoc.zip && \
23 chmod +x /usr/local/bin/protoc && \
24 protoc --version
25
26ENV PKG_CONFIG_PATH=/usr/lib/aarch64-linux-gnu/pkgconfig \
27 PKG_CONFIG_LIBDIR=/usr/lib/aarch64-linux-gnu/pkgconfig \
28 PKG_CONFIG_SYSROOT_DIR=/ \
29 PKG_CONFIG_ALLOW_CROSS=1
30
31# `bluer` → libdbus-1 → libsystemd.so.0 (indirect). ld's `-L` search path
32# only resolves direct `-l<name>` args, so we need `-rpath-link` for the
33# indirect dep via the multiarch lib dir.
34ENV CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_RUSTFLAGS="-C link-arg=-Wl,-rpath-link=/usr/lib/aarch64-linux-gnu"