Benutzer-Werkzeuge

Webseiten-Werkzeuge


software:notes:traintastic_raspberry_build_with_docker

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
software/notes/traintastic_raspberry_build_with_docker.txt · Zuletzt geändert: von Tom, DL7BJ