Files
evol-testbed/Dockerfile
T
mo7sen 9101023921
build-ci-image / image (push) Successful in 2m57s
pkg-config setup for vulkan
2026-05-06 01:57:07 +03:00

145 lines
5.3 KiB
Docker

# syntax=docker/dockerfile:1.7
# Gitea Actions CI image for C/C++ + Vulkan projects.
# This extends the Ubuntu image commonly used by Gitea/act_runner so JS actions
# such as actions/checkout keep working.
#
# Build:
# docker build -t evol-testbed:latest .
ARG BASE_IMAGE=catthehacker/ubuntu:act-latest
FROM ${BASE_IMAGE}
ARG LLVM_VERSION=22
ARG MESON_VERSION=latest
ARG LUNARG_SDK_VERSION=1.4.309.0
ENV DEBIAN_FRONTEND=noninteractive
ENV CC=clang
ENV CXX=clang++
ENV AR=llvm-ar
ENV RANLIB=llvm-ranlib
ENV NM=llvm-nm
ENV STRIP=llvm-strip
ENV VULKAN_SDK=/opt/vulkan-sdk/current/x86_64
ENV PATH="${VULKAN_SDK}/bin:${PATH}"
ENV LD_LIBRARY_PATH="${VULKAN_SDK}/lib:${LD_LIBRARY_PATH}"
ENV PKG_CONFIG_PATH="${VULKAN_SDK}/lib/pkgconfig:${PKG_CONFIG_PATH}"
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
# Base compiler/build/Python packages from Ubuntu.
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
set -eux; \
apt-get update; \
apt-get install -y --no-install-recommends \
ca-certificates \
curl \
gnupg \
lsb-release \
wget \
xz-utils \
libxrandr-dev \
libxinerama-dev \
libxcursor-dev \
libxi-dev \
libxkbcommon-dev \
git \
build-essential \
pkg-config \
software-properties-common \
python3 \
python3-pip \
python3-venv \
ninja-build \
cmake \
gcovr \
valgrind; \
rm -rf /var/lib/apt/lists/*
# LLVM/Clang from apt.llvm.org.
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
set -eux; \
codename="$(. /etc/os-release && echo "${VERSION_CODENAME}")"; \
curl -fsSL https://apt.llvm.org/llvm-snapshot.gpg.key \
| gpg --dearmor -o /usr/share/keyrings/llvm-snapshot.gpg; \
echo "deb [signed-by=/usr/share/keyrings/llvm-snapshot.gpg] http://apt.llvm.org/${codename}/ llvm-toolchain-${codename}-${LLVM_VERSION} main" \
> "/etc/apt/sources.list.d/llvm-${LLVM_VERSION}.list"; \
apt-get update; \
apt-get install -y --no-install-recommends \
"clang-${LLVM_VERSION}" \
"clang-tools-${LLVM_VERSION}" \
"clang-format-${LLVM_VERSION}" \
"clang-tidy-${LLVM_VERSION}" \
"lld-${LLVM_VERSION}" \
"lldb-${LLVM_VERSION}" \
"llvm-${LLVM_VERSION}" \
"llvm-${LLVM_VERSION}-dev" \
"llvm-${LLVM_VERSION}-tools"; \
rm -rf /var/lib/apt/lists/*
# LunarG Vulkan SDK from the official tarball.
RUN --mount=type=cache,target=/root/.cache/vulkan-sdk \
set -eux; \
sdk_archive="/root/.cache/vulkan-sdk/vulkansdk-linux-x86_64-${LUNARG_SDK_VERSION}.tar.xz"; \
if [ ! -f "${sdk_archive}" ]; then \
curl -fL "https://sdk.lunarg.com/sdk/download/${LUNARG_SDK_VERSION}/linux/vulkansdk-linux-x86_64-${LUNARG_SDK_VERSION}.tar.xz" \
-o "${sdk_archive}"; \
fi; \
mkdir -p /opt/vulkan-sdk; \
tar -xJf "${sdk_archive}" -C /opt/vulkan-sdk; \
ln -sfn "/opt/vulkan-sdk/${LUNARG_SDK_VERSION}" /opt/vulkan-sdk/current; \
mkdir -p "${VULKAN_SDK}/lib/pkgconfig"; \
if [ ! -f "${VULKAN_SDK}/lib/pkgconfig/vulkan.pc" ]; then \
{ \
echo "prefix=${VULKAN_SDK}"; \
echo 'exec_prefix=${prefix}'; \
echo 'libdir=${exec_prefix}/lib'; \
echo 'includedir=${prefix}/include'; \
echo; \
echo 'Name: Vulkan-Loader'; \
echo 'Description: Vulkan Loader'; \
echo "Version: ${LUNARG_SDK_VERSION}"; \
echo 'Libs: -L${libdir} -lvulkan'; \
echo 'Cflags: -I${includedir}'; \
} > "${VULKAN_SDK}/lib/pkgconfig/vulkan.pc"; \
fi; \
echo "${VULKAN_SDK}/lib" > /etc/ld.so.conf.d/vulkan-sdk.conf; \
ldconfig
# Make LLVM_VERSION the default clang toolchain.
RUN set -eux; \
update-alternatives --install /usr/bin/clang clang "/usr/bin/clang-${LLVM_VERSION}" 100; \
update-alternatives --install /usr/bin/clang++ clang++ "/usr/bin/clang++-${LLVM_VERSION}" 100; \
update-alternatives --install /usr/bin/clang-cpp clang-cpp "/usr/bin/clang-cpp-${LLVM_VERSION}" 100; \
update-alternatives --install /usr/bin/lld lld "/usr/bin/lld-${LLVM_VERSION}" 100; \
update-alternatives --install /usr/bin/lldb lldb "/usr/bin/lldb-${LLVM_VERSION}" 100; \
update-alternatives --install /usr/bin/llvm-ar llvm-ar "/usr/bin/llvm-ar-${LLVM_VERSION}" 100; \
update-alternatives --install /usr/bin/llvm-ranlib llvm-ranlib "/usr/bin/llvm-ranlib-${LLVM_VERSION}" 100; \
update-alternatives --install /usr/bin/llvm-nm llvm-nm "/usr/bin/llvm-nm-${LLVM_VERSION}" 100; \
update-alternatives --install /usr/bin/llvm-strip llvm-strip "/usr/bin/llvm-strip-${LLVM_VERSION}" 100
# Meson in an isolated venv avoids Debian/Ubuntu PEP 668 externally-managed pip errors.
RUN --mount=type=cache,target=/root/.cache/pip \
set -eux; \
python3 -m venv /opt/meson-venv; \
/opt/meson-venv/bin/python -m pip install --upgrade pip setuptools wheel; \
if [ "${MESON_VERSION}" = "latest" ]; then \
/opt/meson-venv/bin/python -m pip install --upgrade meson; \
else \
/opt/meson-venv/bin/python -m pip install --upgrade "meson==${MESON_VERSION}"; \
fi; \
ln -sf /opt/meson-venv/bin/meson /usr/local/bin/meson
# Verify installed tools at image build time.
RUN set -eux; \
python3 --version; \
clang --version; \
clang++ --version; \
meson --version; \
ninja --version; \
glslangValidator --version; \
spirv-val --version; \
pkg-config --modversion vulkan
CMD ["bash"]