===== Build Traintastic with QEMU and Docker on a x86_64 machine =====
Build script
#!/usr/bin/env bash
set -e
DID_START_DOCKER=0
cleanup() {
if [ "$DID_START_DOCKER" -eq 1 ]; then
echo "[INFO] Stopping Docker service..."
sudo systemctl stop docker
fi
}
trap cleanup EXIT
# --- Docker Status prüfen ---
if ! systemctl is-active --quiet docker; then
echo "[INFO] Starting Docker service..."
sudo systemctl start docker
DID_START_DOCKER=1
else
echo "[INFO] Docker already running"
fi
# ===== Configuration =====
IMAGE="traintastic-trixie-arm64"
BASE_DIR="$(pwd)"
SRC_DIR="$BASE_DIR/traintastic"
OUT_DIR="$BASE_DIR/out"
mkdir -p "$OUT_DIR" "$SRC_DIR"
# ===== Activate QEMU (ARM Emulation) =====
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
# ===== Build Docker Image (if not exists) =====
if [[ "$(docker images -q $IMAGE 2> /dev/null)" == "" ]]; then
echo "[INFO] Building Docker image..."
docker build -t $IMAGE .
fi
# ===== Refresh repo =====
if [ ! -d "$SRC_DIR/.git" ]; then
echo "[INFO] Cloning repository..."
git clone --recurse-submodules https://github.com/traintastic/traintastic.git "$SRC_DIR"
else
echo "[INFO] Updating repository..."
cd "$SRC_DIR"
git pull
git submodule update --init --recursive --remote
cd "$BASE_DIR"
fi
# ===== Build =====
docker run --rm -it \
--platform linux/arm64 \
--memory=16g \
--memory-swap=16g \
--cpus=6
-v "$SRC_DIR:/traintastic" \
-v "$OUT_DIR:/out" \
-w /traintastic \
$IMAGE \
bash -c '
set -e
export PKG_CONFIG_LIBDIR=/usr/lib/aarch64-linux-gnu/pkgconfig:/usr/share/pkgconfig
export PKG_CONFIG_PATH=/usr/lib/aarch64-linux-gnu/pkgconfig
export CMAKE_PREFIX_PATH=/usr/lib/aarch64-linux-gnu
export CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH=ON
export CMAKE_FIND_USE_CMAKE_SYSTEM_PATH=ON
echo "[INFO] Building SERVER..."
cmake -S server -B server/build -DCMAKE_BUILD_TYPE=Release
# to many parallel build processes results in seg faults of gmake or cc1plus
cmake --build server/build -j2
echo "[INFO] Building CLIENT..."
cmake -S client -B client/build -DCMAKE_BUILD_TYPE=Release
# to many parallel build processes results in seg faults of gmake or cc1plus
cmake --build client/build -j2
echo "[INFO] Collecting artifacts..."
mkdir -p /out
cp server/build/traintastic-server /out/ || true
cp client/build/traintastic-client /out/ || true
echo "[DONE]"
'
echo "[INFO] Output available in ./out"
sudo systemctl disable docker
Dockerfile
FROM --platform=linux/arm64 debian:trixie
ENV DEBIAN_FRONTEND=noninteractive
RUN apt update && apt install -y \
git \
build-essential \
cmake \
pkg-config \
ca-certificates \
qt6-base-dev \
qt6-tools-dev \
libqt6core5compat6-dev \
libboost-all-dev \
libssl-dev \
libsystemd-dev \
libarchive-dev \
liblua5.4-dev \
qt6-base-dev \
qt6-tools-dev \
qt6-tools-dev-tools \
qt6-svg-dev \
qt6-websockets-dev \
ccache
WORKDIR /traintastic