# Base Docker Image
ARG BASE_IMAGE=alpine:latest
FROM ${BASE_IMAGE} as builder

# Install all needed build deps for Mesa3D
ARG LLVM_VERSION=19
RUN set -xe; \
  apk add --no-cache \
  autoconf \
  automake \
  bison \
  build-base \
  cmake \
  elfutils-dev \
  expat-dev \
  flex \
  gettext \
  git \
  glproto \
  libdrm-dev \
  libtool \
  libva-dev \
  libx11-dev \
  libxcb-dev \
  libxdamage-dev \
  libxext-dev \
  libxfixes-dev \
  libxrandr-dev \
  libxshmfence-dev \
  libxt-dev \
  libxvmc-dev \
  libxxf86vm-dev \
  llvm${LLVM_VERSION} \
  llvm${LLVM_VERSION}-dev \
  llvm-libunwind-dev \
  eudev-libs \
  makedepend \
  py3-meson-python \
  py-mako \
  py3-libxml2 \
  py3-mako \
  py3-yaml \
  python3 \
  python3-dev \
  talloc-dev \
  xorg-server-dev \
  xorgproto \
  zlib-dev \
  zstd-dev;

# Clone Mesa source repo. (this step caches)
# Due to ongoing packaging issues we build from git vs tar packages
# Refer to https://bugs.freedesktop.org/show_bug.cgi?id=107865
ARG MESA_VERSION=24.2
RUN set -xe; \
  mkdir -p /var/tmp/build; \
  cd /var/tmp/build/; \
  git clone --depth=1 --branch=${MESA_VERSION} https://gitlab.freedesktop.org/mesa/mesa.git;

# Build Mesa from source.
ARG BUILD_TYPE=release
ARG BUILD_OPTIMIZATION=3
RUN set -xe; \
  cd /var/tmp/build/mesa; \
  libtoolize; \
  galium_drivers=softpipe,llvmpipe; \
  meson setup \
  --buildtype=${BUILD_TYPE} \
  --prefix=/usr/local \
  --sysconfdir=/etc \
  -D b_ndebug=true \
  -D gallium-nine=false \
  -D gles1=disabled \
  -D gles2=disabled \
  -D opengl=true \
  -D dri-drivers-path=/usr/local/lib/xorg/modules/dri \
  -D dri3=disabled  \
  -D egl=disabled \
  -D gallium-drivers="$galium_drivers" \
  -D gbm=disabled \
  -D glx=xlib \
  -D llvm=enabled \
  -D lmsensors=disabled \
  -D optimization=${BUILD_OPTIMIZATION} \
  -D osmesa=true  \
  -D platforms=x11 \
  -D shared-glapi=enabled \
  -D shared-llvm=enabled \
  -D vulkan-drivers= \
  build/; \
  ninja -C build/ -j $(getconf _NPROCESSORS_ONLN); \
  ninja -C build/ install

# Copy our entrypoint into the container.
COPY ./entrypoint.sh /usr/local/bin/entrypoint.sh

# Create fresh image from alpine
ARG BASE_IMAGE=alpine:latest
FROM ${BASE_IMAGE}

# Copy the Mesa build & entrypoint script from previous stage
COPY --from=builder /usr/local /usr/local

# Install runtime dependencies for Mesa and link xorg dri modules
ARG LLVM_VERSION=18
RUN set -xe; \
  apk --update add --no-cache \
  binutils \
  expat \
  llvm${LLVM_VERSION}-libs \
  setxkbmap \
  xdpyinfo \
  xrandr \
  xvfb \
  xvfb-run \
  zstd-libs; \
  ln -sf /usr/local/lib/xorg/modules/dri/* /usr/lib/xorg/modules/dri/

# Setup our environment variables.
ENV \
  DISPLAY=":99" \
  GALLIUM_DRIVER="llvmpipe" \
  LD_LIBRARY_PATH="/usr/local/lib:$LD_LIBRARY_PATH" \
  LIBGL_ALWAYS_SOFTWARE="1" \
  LP_DEBUG="" \
  LP_NO_RAST="false" \
  LP_NUM_THREADS="" \
  LP_PERF="" \
  MESA_VERSION="${MESA_VERSION}" \
  XVFB_WHD="640x480x8"

ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]

