===== 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