The gnome extension helps with the creation of snaps that use GTK 3, GNOME 42+, and/or GLib.

This is an updated version of the gnome-3-38 extension that works with the core24 and core22 base snaps, built from Ubuntu 24.04 LTS and Ubuntu 22.04 LTS respectively.

Previous Gnome extensions were built to use core18, based on Ubuntu 18.04 LTS and core20, based on Ubuntu 20.04 LTS.

This extension provides many of the components needed for general desktop applications making it useful for a broader set of applications outside of those tailored for the GNOME desktop.

:information_source: Snapcraft extensions enable snap developers to easily incorporate a set of common requirements into a snap. See Snapcraft extensions for further details.

How to use it

To use this extension, add extensions: [gnome] to the application definition in your snapcraft.yaml file.

For instance:

apps:
    tali:
        extensions: [gnome]
        command: usr/bin/tali
[...]

See GTK3 applications for a comprehensive overview of using extensions with GNOME applications.

Interface connections

The following plugs are provided by the extension and implicitly included in your snapcraft.yaml:

Paths slightly differ between core24 and core22 bases.

core24
plugs:
    desktop:
        mount-host-font-cache: false
    gtk-3-themes:
        interface: content
        target: $SNAP/data-dir/themes
        default-provider: gtk-common-themes
    icon-themes:
        interface: content
        target: $SNAP/data-dir/icons
        default-provider: gtk-common-themes
    sound-themes:
        interface: content
        target: $SNAP/data-dir/sounds
        default-provider: gtk-common-themes
    gnome-46-2404:
        interface: content
        target: $SNAP/gnome-platform
        default-provider: gnome-46-2404
    gpu-2404:
        interface: content
        target: $SNAP/gpu-2404
        default-provider: mesa-2404
core22
plugs:
    desktop:
        mount-host-font-cache: false
    gtk-3-themes:
        interface: content
        target: $SNAP/data-dir/themes
        default-provider: gtk-common-themes
    icon-themes:
        interface: content
        target: $SNAP/data-dir/icons
        default-provider: gtk-common-themes
    sound-themes:
        interface: content
        target: $SNAP/data-dir/sounds
        default-provider: gtk-common-themes
    gnome-42-2204:
        interface: content
        target: $SNAP/gnome-platform
        default-provider: gnome-42-2204

Your app may still need additional plugs, but you can expect the following plugs to be automatically available to your apps as well:

plugs: [ desktop, desktop-legacy, gsettings, opengl, wayland, x11, mount-observe, calendar-service]

See Adding interfaces for more details.

Included packages

The GNOME extension is derived from two separate snaps; a build snap and a platform snap.

The build snap builds compiles libraries from source that are commonly used across GNOME applications. Examples include glib, gtk, and gnome-desktop. These are built to provide newer versions of these packages that exist in either the core24 or core22 base snaps (a subset of their respective Ubuntu archives).

The platform snap takes the build snap and makes all of those libraries available to your snap at build time without needing to include the pieces of the build snap that are unnecessary at runtime (like compilers) in your final snap.

Environment variables

In addition to using the build and platform snaps, the gnome-3-38 extension also sets a collection of environment variables, links, default plugs for the app to use, and a default build-environment for each part in your snap to use.

Build variables

The following “build-environment” section is made available to each part built in your snap.

If you define other build-environment variables, then those will get added to these and the set is used. If you define another value for one of these variables, then the value you’ve defined will be used instead of the value defined within the extension.

Paths slightly differ between core24 and core22 bases.

core24
build-environment:
-   PATH: /snap/gnome-46-2404-sdk/current/usr/bin${PATH:+:$PATH}
-   XDG_DATA_DIRS: $CRAFT_STAGE/usr/share:/snap/gnome-46-2404-sdk/current/usr/share:/usr/share${XDG_DATA_DIRS:+:$XDG_DATA_DIRS}
-   LD_LIBRARY_PATH: /snap/gnome-46-2404-sdk/current/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR:/snap/gnome-46-2404-sdk/current/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR:/snap/gnome-46-2404-sdk/current/usr/lib:/snap/gnome-46-2404-sdk/current/usr/lib/vala-current:/snap/gnome-46-2404-sdk/current/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/pulseaudio${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}
-   PKG_CONFIG_PATH: /snap/gnome-46-2404-sdk/current/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/pkgconfig:/snap/gnome-46-2404-sdk/current/usr/lib/pkgconfig:/snap/gnome-46-2404-sdk/current/usr/share/pkgconfig${PKG_CONFIG_PATH:+:$PKG_CONFIG_PATH}
-   GETTEXTDATADIRS: /snap/gnome-46-2404-sdk/current/usr/share/gettext-current${GETTEXTDATADIRS:+:$GETTEXTDATADIRS}
-   GDK_PIXBUF_MODULE_FILE: /snap/gnome-46-2404-sdk/current/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/gdk-pixbuf-current/loaders.cache
-   ACLOCAL_PATH: /snap/gnome-46-2404-sdk/current/usr/share/aclocal${ACLOCAL_PATH:+:$ACLOCAL_PATH}
-   PYTHONPATH: /snap/gnome-46-2404-sdk/current/usr/lib/python3.10:/snap/gnome-46-2404-sdk/current/usr/lib/python3/dist-packages:/snap/gnome-46-2404-sdk/current/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/gobject-introspection${PYTHONPATH:+:$PYTHONPATH}
-   GI_TYPELIB_PATH: /snap/gnome-46-2404-sdk/current/usr/lib/girepository-1.0:/snap/gnome-46-2404-sdk/current/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/girepository-1.0${GI_TYPELIB_PATH:+:$GI_TYPELIB_PATH}
core22
build-environment:
-   PATH: /snap/gnome-42-2204-sdk/current/usr/bin${PATH:+:$PATH}
-   XDG_DATA_DIRS: $SNAPCRAFT_STAGE/usr/share:/snap/gnome-42-2204-sdk/current/usr/share:/usr/share${XDG_DATA_DIRS:+:$XDG_DATA_DIRS}
-   LD_LIBRARY_PATH: /snap/gnome-42-2204-sdk/current/lib/$CRAFT_ARCH_TRIPLET:/snap/gnome-42-2204-sdk/current/usr/lib/$CRAFT_ARCH_TRIPLET:/snap/gnome-42-2204-sdk/current/usr/lib:/snap/gnome-42-2204-sdk/current/usr/lib/vala-current:/snap/gnome-42-2204-sdk/current/usr/lib/$CRAFT_ARCH_TRIPLET/pulseaudio${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}
-   PKG_CONFIG_PATH: /snap/gnome-42-2204-sdk/current/usr/lib/$CRAFT_ARCH_TRIPLET/pkgconfig:/snap/gnome-42-2204-sdk/current/usr/lib/pkgconfig:/snap/gnome-42-2204-sdk/current/usr/share/pkgconfig${PKG_CONFIG_PATH:+:$PKG_CONFIG_PATH}
-   GETTEXTDATADIRS: /snap/gnome-42-2204-sdk/current/usr/share/gettext-current${GETTEXTDATADIRS:+:$GETTEXTDATADIRS}
-   GDK_PIXBUF_MODULE_FILE: /snap/gnome-42-2204-sdk/current/usr/lib/$CRAFT_ARCH_TRIPLET/gdk-pixbuf-current/loaders.cache
-   ACLOCAL_PATH: /snap/gnome-42-2204-sdk/current/usr/share/aclocal${ACLOCAL_PATH:+:$ACLOCAL_PATH}
-   PYTHONPATH: /snap/gnome-42-2204-sdk/current/usr/lib/python3.10:/snap/gnome-42-2204-sdk/current/usr/lib/python3/dist-packages:/snap/gnome-42-2204-sdk/current/usr/lib/$CRAFT_ARCH_TRIPLET/gobject-introspection${PYTHONPATH:+:$PYTHONPATH}

Runtime variables

The following environment is set when your application is run:

environment:
  SNAP_DESKTOP_RUNTIME: $SNAP/gnome-platform
  GTK_USE_PORTAL: '1'

Layouts set

The platform snap’s gjs, webkit2gtk-4.0, and iso-codes are used so they don’t need to be packaged as part of the snap and would greatly inflate the size.

core24
    /usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/webkit2gtk-4.0:
        bind: $SNAP/gnome-platform/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/webkit2gtk-4.0
    /usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/webkit2gtk-4.1:
        bind: $SNAP/gnome-platform/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/webkit2gtk-4.1
    /usr/share/xml/iso-codes:
        bind: $SNAP/gnome-platform/usr/share/xml/iso-codes
    /usr/share/libdrm:
        bind: $SNAP/gpu-2404/libdrm
    /usr/share/drirc.d:
        symlink: $SNAP/gpu-2404/drirc.d
    /usr/share/X11/XErrorDB:
        symlink: $SNAP/gpu-2404/X11/XErrorDB
core22
    /usr/lib/$SNAPCRAFT_ARCH_TRIPLET/libgweather-4:
        symlink: $SNAP/usr/lib/$SNAPCRAFT_ARCH_TRIPLET/libgweather-4
    /usr/lib/evolution-data-server:
        symlink: $SNAP/usr/lib/evolution-data-server
    /usr/bin/gnome-control-center:
        symlink: $SNAP/usr/bin/gnome-control-center
    /usr/lib/$SNAPCRAFT_ARCH_TRIPLET/webkit2gtk-4.0:
        bind: $SNAP/gnome-platform/usr/lib/$SNAPCRAFT_ARCH_TRIPLET/webkit2gtk-4.0
    /usr/share/xml/iso-codes:
        bind: $SNAP/gnome-platform/usr/share/xml/iso-codes
    /usr/share/libdrm:
        bind: $SNAP/gnome-platform/usr/share/libdrm

See Snap layouts for further details.

is this accurate? The layout shown here as evidence is explicitly using gjs, webkit2gtk, and iso-codes from the platform snap, and not the host. I equate “host” to mean the linux distro that spawns snapd and only valid in a classic distro world. An Ubuntu Core device, for example, does not have a “host”. In my case the “host” is an Ubuntu 22.04 system, but for other people it might be Debian, or Fedora, or other system. AFAIK there is no mechanism that mounts these utilities and libraries from the “host” into the snap confinement. I think you meant to say “platform snap” or other similar wording instead of “host”?

You’re absolutely right, thanks so much for reading through this and pointing it out. I’ve updated the text. I’ll also add platform snap to our glossary :slight_smile:

Hi @degville , does this extension work for a python-gi applications ? If so, is there any sample snapcraft file or tutorial ?

The list of automatically plugged interfaces includes calendar-service and mount-observe, but those are not actually defined in the extension: snapcraft/snapcraft/extensions/gnome.py at 187187d53d735d6f19dac7f474f321bd4c467f08 · canonical/snapcraft · GitHub

Looking at the git history, it would appear that they never were defined.

I believe this is wrong; should they be removed from the docs?