# syntax=docker/dockerfile:1

# Linux build environment. Isolated from the Windows cross image (Dockerfile.win)
# so the two toolchains and their standard libraries never interfere.
#
# dev target: clang + libc++ (for `import std;`) + SDL3 + debug tools.
FROM ubuntu:26.04 AS dev

ENV DEBIAN_FRONTEND=noninteractive

# Optional apt mirror override, e.g. --build-arg APT_MIRROR=http://mirrors.tuna.tsinghua.edu.cn/ubuntu
ARG APT_MIRROR=""
RUN if [ -n "$APT_MIRROR" ]; then \
        sed -i -e "s|http://archive.ubuntu.com/ubuntu|${APT_MIRROR}|g" \
               -e "s|http://security.ubuntu.com/ubuntu|${APT_MIRROR}|g" \
               -e "s|http://ports.ubuntu.com/ubuntu-ports|${APT_MIRROR}|g" \
               /etc/apt/sources.list /etc/apt/sources.list.d/*.sources 2>/dev/null || true; \
    fi

RUN --mount=type=cache,target=/var/lib/apt,sharing=locked \
    --mount=type=cache,target=/var/cache/apt,sharing=locked \
    for attempt in 1 2 3 4 5; do \
        apt-get -o Acquire::Retries=5 update && break; \
        echo "apt-get update failed (attempt $attempt), retrying"; \
        sleep 5; \
    done \
    && apt-get -o Acquire::Retries=5 install -y --no-install-recommends \
        ca-certificates \
        clang-21 \
        clang-tools-21 \
        cmake \
        dpkg-dev \
        file \
        gdb \
        git \
        libc++-21-dev \
        libc++abi-21-dev \
        libsdl3-dev \
        libvulkan-dev \
        ninja-build \
        pkg-config \
    && rm -rf /var/lib/apt/lists/*

ENV CC=clang-21
ENV CXX=clang++-21

WORKDIR /work
COPY . .

RUN cmake -S . -B build/linux -G Ninja -DCMAKE_BUILD_TYPE=Release -DOPENRA3_DISTRO_TAG=ubuntu26.04 \
    && cmake --build build/linux -j \
    && ctest --test-dir build/linux --output-on-failure \
    && (cd build/linux && cpack -G DEB)

# deploy target: runtime dependencies + final binary, minimal and fast.
FROM ubuntu:26.04 AS deploy

ENV DEBIAN_FRONTEND=noninteractive

RUN --mount=type=cache,target=/var/lib/apt,sharing=locked \
    --mount=type=cache,target=/var/cache/apt,sharing=locked \
    apt-get -o Acquire::Retries=5 update \
    &&     apt-get -o Acquire::Retries=5 install -y --no-install-recommends \
        libc++1 \
        libc++abi1 \
        libsdl3-0 \
        libvulkan1 \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /app
COPY --from=dev /work/build/linux/bin/openra3 /app/openra3

ENTRYPOINT ["/app/openra3"]
