69 lines
2.2 KiB
Docker
69 lines
2.2 KiB
Docker
# 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 \
|
|
gdb \
|
|
git \
|
|
libc++-21-dev \
|
|
libc++abi-21-dev \
|
|
libsdl3-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 \
|
|
&& cmake --build build/linux -j \
|
|
&& ctest --test-dir build/linux --output-on-failure
|
|
|
|
# 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 \
|
|
&& rm -rf /var/lib/apt/lists/*
|
|
|
|
WORKDIR /app
|
|
COPY --from=dev /work/build/linux/bin/openra3 /app/openra3
|
|
|
|
ENTRYPOINT ["/app/openra3"]
|