File: //snap/mesa-2404/1165/snap/snapcraft.yaml
name: mesa-2404
license: MIT
base: core24
summary: Mesa libraries for core24 snaps
description: |
A content snap containing the mesa libraries and drivers for `base: core24` snaps.
It supports a broad range of hardware through the Mesa stack as well as Nvidia
drivers installed from your distribution through the native SnapD support.
To make use of this snap in your application, allowing for GPU acceleration on
a broader set of hardware without including the drivers in your snap, refer to the
documentation below:
https://mir-server.io/docs/the-gpu-2404-snap-interface
website: https://github.com/canonical/mesa-2404
contact: https://github.com/canonical/mesa-2404/issues
source-code: https://github.com/canonical/mesa-2404
compression: lzo
adopt-info: dri
grade: stable
confinement: strict
platforms:
amd64:
arm64:
armhf:
ppc64el:
s390x:
riscv64:
package-repositories:
- type: apt
url: http://archive.ubuntu.com/ubuntu
suites: [noble]
components: [main]
architectures: [i386]
key-id: F6ECB3762474EDA9D21B7022871920D1991BC93C
key-server: keyserver.ubuntu.com
parts:
apis:
# This provides the essential APIs
# o libGL.so.0
# o libEGL.so.1
# o libva.so.2
# o libvulkan.so.1
# o libgbm.so.1
#
plugin: nil
stage-packages:
- libgl1
- libegl1
- libgles2
- libvulkan1
- libgbm1
prime:
- usr/lib
- usr/share/doc/*/copyright
- usr/share/glvnd
drm:
# DRM userspace
# o libdrm.so.2
plugin: nil
stage-packages:
- libdrm2
- libdrm-common
organize:
# Expected at /libdrm by the `gpu-2404` interface
usr/share/libdrm: libdrm
prime:
- usr/lib
- usr/share/doc/*/copyright
- libdrm
va:
# Video Acceleration API
# o libva.so.2
plugin: nil
stage-packages:
- libva2
- libva-drm2
- libva-x11-2
- libva-wayland2
prime:
- usr/lib
- usr/share/doc/*/copyright
dri:
# Userspace drivers
plugin: nil
stage-packages:
- libgl1-mesa-dri
- va-driver-all
- vdpau-driver-all
- libvdpau-va-gl1
- mesa-vulkan-drivers
- libglx-mesa0
organize:
# Expected at /drirc.d by the `gpu-2404` interface
usr/share/drirc.d: drirc.d
prime:
- usr/lib
- usr/share/doc/*/copyright
- usr/share/vulkan
- drirc.d
override-stage: |
sed -i 's@/usr/lib/[a-z0-9_-]\+/@@' ${CRAFT_PART_INSTALL}/usr/share/vulkan/*/*.json
craftctl default
craftctl set version=$(
dpkg-parsechangelog \
--file ${CRAFT_PART_INSTALL}/usr/share/doc/libgl1-mesa-dri/changelog* \
--show-field Version \
| sed -rne 's/(^[0-9.]+).*/\1/p'
)-snap$( git -C $CRAFT_PROJECT_DIR rev-list --count HEAD )
x11:
# X11 support (not much cost to having this)
# o libGLX.so.0
plugin: nil
stage-packages:
- libglx0
- libx11-xcb1
- libxau6
- libxcb-dri2-0
- libxcb-dri3-0
- libxcb-present0
- libxcb-sync1
- libxcb-xfixes0
- libxcb1
- libxdamage1
- libxdmcp6
- libxshmfence1
organize:
# Expected at /X11/XErrorDB by the `gpu-2404` interface
usr/share/X11/XErrorDB: X11/XErrorDB
prime:
- usr/lib
- usr/share/doc/*/copyright
- usr/share/X11/locale
- X11
wayland:
# Wayland support (not much cost to having this)
plugin: nil
stage-packages:
- libwayland-client0
- libwayland-cursor0
- libwayland-egl1
- libwayland-server0
prime:
- usr/lib
- usr/share/doc/*/copyright
nvidia-egl-ext-deps:
source: https://github.com/NVIDIA/eglexternalplatform.git
source-tag: 1.2
source-depth: 1
plugin: meson
build-packages:
- meson
override-prime: '' # only build headers
nvidia-egl-ext:
# EGL external platforms
after: [nvidia-egl-ext-deps]
# TODO: change to pull egl-x11 from the archive once packaged
source: https://github.com/NVIDIA/egl-x11.git
source-commit: 8aac36c712561ebfecc82af3db15c50cd0d573fb
source-depth: 1
plugin: meson
meson-parameters:
- --prefix=/usr
build-packages:
- meson
- pkgconf
- libdrm-dev
- libgbm-dev
- libgl-dev
- libegl-dev
- libx11-dev
- libx11-xcb-dev
- libxcb1-dev
- libxcb-dri3-dev
- libxcb-present-dev
stage-packages:
- libnvidia-egl-wayland1
- to amd64:
- libnvidia-egl-gbm1
- to arm64:
- libnvidia-egl-gbm1
prime:
- usr/lib/**/*.so.*
- usr/share/egl/egl_external_platform.d
apis-i386:
# This provides the essential APIs
# o libGL.so.1
# o libEGL.so.1
# o libva.so.2
# o libvulkan.so.1
# o libgbm.so.1
#
plugin: nil
stage-packages:
- on amd64:
- libgl1:i386
- libegl1:i386
- libgles2:i386
- libvulkan1:i386
- libgbm1:i386
override-prime: |
if [ `arch` = "x86_64" ]; then craftctl default; fi
prime:
- usr/lib
- usr/share/doc/*/copyright
- usr/share/glvnd
drm-i386:
# DRM userspace
# o libdrm.so.2
plugin: nil
stage-packages:
- on amd64:
- libdrm2:i386
- libdrm-common
override-prime: |
if [ `arch` = "x86_64" ]; then craftctl default; fi
organize:
# Expected at /libdrm by the `gpu-2404` interface
usr/share/libdrm: libdrm
prime:
- usr/lib
- usr/share/doc/*/copyright
- libdrm
va-i386:
# Video Acceleration API
# o libva.so.2
plugin: nil
stage-packages:
- on amd64:
- libva2:i386
- libva-drm2:i386
- libva-x11-2:i386
- libva-wayland2:i386
override-prime: |
if [ `arch` = "x86_64" ]; then craftctl default; fi
prime:
- usr/lib
- usr/share/doc/*/copyright
dri-i386:
# Userspace drivers
plugin: nil
stage-packages:
- on amd64:
- libgl1-mesa-dri:i386
- va-driver-all:i386
- vdpau-driver-all:i386
- mesa-vulkan-drivers:i386
- libglx-mesa0:i386
override-stage: |
if [ `arch` = "x86_64" ]; then
sed -i 's@/usr/lib/[a-z0-9_-]\+/@@' ${CRAFT_PART_INSTALL}/usr/share/vulkan/*/*.json
fi
craftctl default
organize:
# Expected at /drirc.d by the `gpu-2404` interface
usr/share/drirc.d: drirc.d
override-prime: |
if [ `arch` = "x86_64" ]; then craftctl default; fi
prime:
- usr/lib
- usr/share/vulkan
- usr/share/doc/*/copyright
- drirc.d
x11-i386:
# X11 support (not much cost to having this)
# o libGLX.so.0
plugin: nil
stage-packages:
- on amd64:
- libglx0:i386
- libva-x11-2:i386
- libx11-xcb1:i386
- libxau6:i386
- libxcb-dri2-0:i386
- libxcb-dri3-0:i386
- libxcb-present0:i386
- libxcb-sync1:i386
- libxcb-xfixes0:i386
- libxcb1:i386
- libxdamage1:i386
- libxdmcp6:i386
- libxshmfence1:i386
override-prime: |
if [ `arch` = "x86_64" ]; then craftctl default; fi
prime:
- usr/lib
- usr/share/doc/*/copyright
wayland-i386:
# Wayland support (not much cost to having this)
plugin: nil
stage-packages:
- on amd64:
- libwayland-client0:i386
- libwayland-cursor0:i386
- libwayland-egl1:i386
- libwayland-server0:i386
override-prime: |
if [ `arch` = "x86_64" ]; then craftctl default; fi
prime:
- usr/lib
- usr/share/doc/*/copyright
nvidia-egl-ext-i386:
# EGL external platforms
plugin: nil
stage-packages:
- on amd64:
- libnvidia-egl-wayland1:i386
override-prime: |
if [ `arch` = "x86_64" ]; then craftctl default; fi
prime:
- usr/lib
# These were at some point part of mesa-2404 and its cleanup lists,
# but are no longer dependencies.
# To avoid refreshes breaking consumer snaps, we need to hold on to them.
legacy:
plugin: nil
stage-packages:
- libdrm-nouveau2
- libdrm-radeon1
- libglapi-mesa
- libllvm17t64
- libllvm19
prime:
- usr/lib
- usr/share/doc/*/copyright
legacy-i386:
plugin: nil
stage-packages:
- on amd64:
- libdrm-nouveau2:i386
- libdrm-radeon1:i386
- libglapi-mesa:i386
- libllvm17t64:i386
- libllvm19:i386
- libpciaccess0:i386
override-prime: |
if [ `arch` = "x86_64" ]; then craftctl default; fi
prime:
- usr/lib
# Work around https://bugs.launchpad.net/snapcraft/+bug/2076115
cleanup:
after:
- apis
- drm
- dri
- nvidia-egl-ext
- va
- x11
- wayland
- apis-i386
- drm-i386
- dri-i386
- nvidia-egl-ext-i386
- va-i386
- x11-i386
- wayland-i386
- legacy
- legacy-i386
plugin: nil
build-snaps:
- core24
override-prime: |
set -eux
cd /snap/core24/current
find . -type f,l -exec rm -f ${CRAFT_PRIME}/{} \;
find ${CRAFT_PRIME} -empty -type d -delete
file-list:
after: [cleanup]
plugin: nil
override-prime: |
mkdir -p ${CRAFT_PRIME}/snap
# Avoid new userspace drivers slipping into the consumer snaps,
# using wildcards to support multi-arch snaps
cat <<EOF > ${CRAFT_PRIME}/snap/${CRAFT_ARCH_BUILD_FOR}.list
usr/lib/*/dri/*
usr/lib/*/libVkLayer_*.so
usr/lib/*/libgallium-*.so
usr/lib/*/libvulkan_*.so
usr/lib/*/vdpau/*
usr/share/X11/locale/*
usr/share/drirc.d/*
usr/share/egl/egl_external_platform.d/*
usr/share/glvnd/egl_vendor.d/*
usr/share/libdrm/*
usr/share/vulkan/*.d/*
EOF
# Elements that should be pruned from the list
cleanup_patterns=(
-e debconf # Cruft pulled in through python3 dependency (dropped upstream)
-e dpkg-reconfigure # https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1061658
-e ^usr/lib/.*/dri/ # Individual DRI and LibVA drivers
-e ^usr/lib/.*/libVkLayer_.*.so # Vulkan layer libraries
-e ^usr/lib/.*/libgallium-.*.so # Mesa's shared infrastracture libraries
-e ^usr/lib/.*/libvulkan_.*.so # Individual Vulkan drivers
-e ^usr/lib/.*/vdpau/ # Individual VDPAU drivers
-e ^usr/share/X11/locale/* # X11 locale files
-e ^usr/share/drirc.d/.* # Mesa quirk files
-e ^usr/share/egl/egl_external_platform.d/.* # EGL ICD files
-e ^usr/share/glvnd/egl_vendor.d/* # glvnd ICD files
-e ^usr/share/libdrm/.* # libdrm support files
-e ^usr/share/vulkan/.*.d/* # Vulkan ICD files
)
(
cd ${CRAFT_PART_INSTALL}/../..
# All the cruft coming from stage packages, but not actually primed
find $( ls -d */install/usr/share/{bug,doc,gcc,gdb,lintian,man} ) -type f,l | cut -d/ -f3-
cd ${CRAFT_PRIME}
# Everything that is indeed primed
find usr -type f,l
# The re-organized bits
find X11 -type f,l | awk '{ print "usr/share/" $0 }'
) \
| grep --invert-match "${cleanup_patterns[@]}" \
| sed 's/\(.so.[0-9]\+\)\([0-9\.]\+\)\?$/\1*/' \
| sort --unique \
>> ${CRAFT_PRIME}/snap/${CRAFT_ARCH_BUILD_FOR}.list
scripts:
after: [file-list]
plugin: nil
source: scripts
override-build: |
set -x
SCRIPT=bin/gpu-2404-provider-wrapper
ARCH_TRIPLETS=( ${CRAFT_ARCH_TRIPLET_BUILD_FOR} )
[ ${CRAFT_ARCH_BUILD_FOR} == amd64 ] && ARCH_TRIPLETS+=( i386-linux-gnu )
mkdir -p ${CRAFT_PART_INSTALL}/bin
sed \
-e "s/@ARCH_TRIPLETS@/${ARCH_TRIPLETS[*]}/" \
-e "s/@COMPONENT_SENTINEL@/kernel-gpu-2404-sentinel/" \
-e "s/@COMPONENT_MANGLER@/kernel-gpu-2404-provider-mangler/" \
${CRAFT_PART_SRC}/${SCRIPT}.in \
> ${CRAFT_PART_INSTALL}/${SCRIPT}
chmod 555 ${CRAFT_PART_INSTALL}/${SCRIPT}
component-monitor:
after: [file-list]
plugin: rust
source: component-monitor
plugs:
kernel-gpu-2404:
interface: content
target: $SNAP/kernel-gpu-2404
slots:
gpu-2404:
interface: content
read:
- $SNAP
- $SNAP_DATA/kernel-gpu-2404
environment:
COMPONENT_INTERFACE: kernel-gpu-2404
COMPONENT_SENTINEL_PATH: ${SNAP}/kernel-gpu-2404/kernel-gpu-2404-sentinel
COMPONENT_TARGET: ${SNAP_DATA}/kernel-gpu-2404
apps:
component-monitor:
daemon: simple
restart-condition: always
restart-delay: 3s
command: bin/component-monitor