feat(examples): full Raspberry Pi family manifest (rpi4/5/zero-2w x bookworm/trixie)

Expand the rpi family example from a single bookworm/drm-kms-egl board into the
six targets the ivi-homescreen PiOS CI needs: {rpi5, rpi4, rpi-zero-2w} x
{bookworm, trixie}.

- OS variant drives toolchain + sysroot (and thus the container image):
  bookworm -> 12.3.rel1 + raspios-bookworm; trixie -> 15.2.rel1 + raspios-trixie.
  bookworm cross-builds libdisplay-info 0.2.0 (ships 0.1.1, drm-cxx needs >=0.2.0)
  and omits the apt libdisplay-info-dev so the static .a isn't shadowed; trixie
  keeps it. Vulkan headers are vendored by ivi-homescreen + drm-cxx, so neither
  OS stages them.
- Board only changes -mcpu (a76/a72/a53); all three share one sysroot per OS.
- Backends: rpi5 builds all five (incl. drm-kms-vulkan); rpi4 and zero-2w build
  the four without it. Plugins on (PLUGINS_DIR=../ivi-homescreen-plugins).

Validated: parses, --list-targets shows the right per-model backend sets, and
--dry-run resolves each target's toolchain/image/cpu/augment. Example tests pass.

Signed-off-by: Joel Winarske <joel.winarske@gmail.com>
This commit is contained in:
Joel Winarske
2026-06-19 13:48:50 -07:00
parent 878fc02bed
commit eae0f7650a
2 changed files with 185 additions and 45 deletions
+15
View File
@@ -29,11 +29,26 @@
"icefish",
"opencontainers",
"skopeo",
"libcamera",
"libdisplay",
"libdrm",
"libegl",
"libgbm",
"libgles",
"libglib",
"libgstreamer",
"libinput",
"libpipewire",
"libsecret",
"libsystemd",
"libudev",
"libvulkan",
"libxkbcommon",
"dlopens",
"gstreamer",
"pipewire",
"sdbus",
"waypp",
"mcpu",
"OECORE",
"passwordless",
+170 -45
View File
@@ -1,76 +1,201 @@
# Multi-platform manifest: one project, several boards via `cross.targets`.
#
# Shared config lives at the cross: level; each board overrides only its image
# and cpu tuning. Pick one with `--target`:
# Raspberry Pi family — ivi-homescreen cross-compiled for PiOS aarch64.
#
# One project, six targets: {rpi5, rpi4, rpi-zero-2w} x {bookworm, trixie}.
# emb cross . --list-targets
# emb cross . --target rpi5 --build --deb
# emb cross . --target radxa-zero3 --build
# emb cross . --target rpi5-bookworm --build --backend drm-kms-egl
# emb cross . --target rpi5-trixie --publish --image ghcr.io/<org>/emb-cross-aarch64-none-linux-gnu
#
# rpi4/rpi5/rpi-zero-2w share one raspios sysroot (same image, only -mcpu
# differs); radxa-zero3 uses a different image and gets its own. Parse/plan
# validated via --dry-run; the rpi5 single-target config is build-validated in
# pi5.emb.yaml.
# Why the matrix:
# - OS variant drives the toolchain + sysroot (and the container image):
# bookworm -> gcc 12 / glibc 2.36, raspios-bookworm image
# trixie -> gcc 15 / glibc 2.41, raspios-trixie image
# bookworm ships libdisplay-info 0.1.1 (< drm-cxx's 0.2.0), so it cross-
# builds 0.2.0 from source (augment) and omits the apt libdisplay-info-dev
# (its .so would shadow the static 0.2.0 at link time). trixie ships 0.2.0,
# so no augment and it keeps libdisplay-info-dev. (Vulkan headers are
# vendored by ivi-homescreen + drm-cxx, so neither OS stages them.)
# - Board only changes -mcpu (a76/a72/a53). All three boards on a given OS
# share one sysroot -> one container image (cpu_flags aren't in sysroot_key).
# - Backends: rpi5 builds all five (incl. drm-kms-vulkan); rpi4 and zero-2w
# build the four without drm-kms-vulkan.
#
# Plugins are built (DISABLE_PLUGINS=OFF): the sibling ivi-homescreen-plugins
# repo must sit next to this one (PLUGINS_DIR=../ivi-homescreen-plugins).
id: ivi-homescreen
type: app
supported_archs: [arm64]
supported_host_types: [ubuntu, fedora]
build:
app_path: .
archs: [arm64]
modes: [release]
output: bundles
cross:
provider: arm-gnu
version_policy: pinned
toolchain_version: 12.3.rel1 # bookworm → gcc 12 / glibc 2.36
triple: aarch64-none-linux-gnu
sysroot:
partition: 2
# Shared sysroot = the trixie layout (keeps the apt libdisplay-info-dev).
# bookworm targets override this (see &sysroot_bookworm) to drop it.
sysroot: &sysroot_trixie
partition: 2 # raspios rootfs is the Linux (type 83) p2
dev_packages:
# Embedder + plugins shared deps (waypp always needs wayland-*; plugins
# pull camera/gstreamer/pipewire/secret; sdbus-cpp needs libsystemd).
- libcamera-dev
- libcurl4-openssl-dev
- libegl-dev
- libgles2-mesa-dev
- libglib2.0-dev
- libgstreamer1.0-dev
- libgstreamer-plugins-base1.0-dev
- libjpeg-dev
- libpipewire-0.3-dev
- libsecret-1-dev
- libsystemd-dev
- libudev-dev
- libwayland-dev
- libxkbcommon-dev
- libxml2-dev
- wayland-protocols
- zlib1g-dev
# Vulkan (wayland-vulkan links the loader; drm-kms-vulkan dlopens it).
- libvulkan-dev
- mesa-vulkan-drivers
# DRM/KMS + GBM + seat/input (drm-kms-egl, drm-kms-vulkan, software).
- libdrm-dev
- libgbm-dev
- libinput-dev
- libxcursor-dev
- libseat-dev
- libegl-dev
- libgles2-mesa-dev
- libwayland-dev
- libxkbcommon-dev
- libudev-dev
- libsystemd-dev
- libglib2.0-dev
- wayland-protocols
- zlib1g-dev
# trixie ships libdisplay-info >= 0.2.0; link against it directly.
- libdisplay-info-dev
augment:
- pkg: libdisplay-info
min: "0.2.0"
url: https://gitlab.freedesktop.org/emersion/libdisplay-info/-/archive/0.2.0/libdisplay-info-0.2.0.tar.gz
build: meson
static: true
# Merged into every backend (a backend's own key wins on a clash).
defines:
BUILD_BACKEND_HEADLESS_EGL: 'OFF'
DISABLE_PLUGINS: 'OFF'
PLUGINS_DIR: '../ivi-homescreen-plugins'
# Default backend set (rpi4 / zero-2w): four backends, no drm-kms-vulkan.
# rpi5 targets override `backends` to add drm-kms-vulkan. Each entry is
# anchored so the rpi5 set and the per-OS targets can reuse it.
backends:
drm-kms-egl:
BUILD_BACKEND_DRM_KMS_EGL: 'ON'
wayland-egl: &be_wayland_egl
BUILD_BACKEND_WAYLAND_EGL: 'ON'
BUILD_BACKEND_WAYLAND_VULKAN: 'OFF'
BUILD_BACKEND_DRM_KMS_EGL: 'OFF'
BUILD_BACKEND_SOFTWARE: 'OFF'
wayland-vulkan: &be_wayland_vulkan
BUILD_BACKEND_WAYLAND_EGL: 'OFF'
BUILD_BACKEND_WAYLAND_VULKAN: 'ON'
BUILD_BACKEND_DRM_KMS_EGL: 'OFF'
BUILD_BACKEND_SOFTWARE: 'OFF'
drm-kms-egl: &be_drm_kms_egl
BUILD_BACKEND_WAYLAND_EGL: 'OFF'
BUILD_BACKEND_WAYLAND_VULKAN: 'OFF'
DISABLE_PLUGINS: 'ON'
BUILD_BACKEND_DRM_KMS_EGL: 'ON'
BUILD_BACKEND_SOFTWARE: 'OFF'
software: &be_software
BUILD_BACKEND_WAYLAND_EGL: 'OFF'
BUILD_BACKEND_WAYLAND_VULKAN: 'OFF'
BUILD_BACKEND_DRM_KMS_EGL: 'OFF'
BUILD_BACKEND_SOFTWARE: 'ON'
package:
name: ivi-homescreen
version: 1.0.0
maintainer: "Joel Winarske <joel.winarske@gmail.com>"
description: "IVI Flutter Shell (drm-kms-egl backend), cross-built by emb"
description: "IVI Flutter Shell, cross-built by emb"
section: utils
bin: shell/homescreen
bin: shell/homescreen # relative to each backend build dir
install_dir: /usr/bin
targets:
rpi5:
image_url: https://downloads.raspberrypi.com/raspios_lite_arm64/images/raspios_lite_arm64-2024-11-19/2024-11-19-raspios-bookworm-arm64-lite.img.xz
cpu_flags: [-mcpu=cortex-a76]
rpi4:
image_url: https://downloads.raspberrypi.com/raspios_lite_arm64/images/raspios_lite_arm64-2024-11-19/2024-11-19-raspios-bookworm-arm64-lite.img.xz
cpu_flags: [-mcpu=cortex-a72]
rpi-zero-2w:
image_url: https://downloads.raspberrypi.com/raspios_lite_arm64/images/raspios_lite_arm64-2024-11-19/2024-11-19-raspios-bookworm-arm64-lite.img.xz
cpu_flags: [-mcpu=cortex-a53]
radxa-zero3:
image_url: https://github.com/radxa-build/radxa-zero3/releases/download/rsdk-b1/radxa-zero3_bookworm_kde_b1.output_512.img.xz
cpu_flags: [-mcpu=cortex-a55]
# -- Raspberry Pi 5 (Cortex-A76) — all five backends -------------------
rpi5-bookworm:
toolchain_version: &tc_bookworm 12.3.rel1
image_url: &img_bookworm https://downloads.raspberrypi.com/raspios_oldstable_lite_arm64/images/raspios_oldstable_lite_arm64-2026-04-14/2026-04-13-raspios-bookworm-arm64-lite.img.xz
cpu_flags: &cpu_rpi5 [-mcpu=cortex-a76]
sysroot: &sysroot_bookworm
partition: 2
dev_packages:
# Identical to the shared list, minus libdisplay-info-dev: bookworm's
# apt 0.1.1 would shadow the static 0.2.0 we build in `augment`.
- libcamera-dev
- libcurl4-openssl-dev
- libegl-dev
- libgles2-mesa-dev
- libglib2.0-dev
- libgstreamer1.0-dev
- libgstreamer-plugins-base1.0-dev
- libjpeg-dev
- libpipewire-0.3-dev
- libsecret-1-dev
- libsystemd-dev
- libudev-dev
- libwayland-dev
- libxkbcommon-dev
- libxml2-dev
- wayland-protocols
- zlib1g-dev
- libvulkan-dev
- mesa-vulkan-drivers
- libdrm-dev
- libgbm-dev
- libinput-dev
- libxcursor-dev
- libseat-dev
augment: &augment_bookworm
# bookworm ships libdisplay-info 0.1.1; drm-cxx requires >= 0.2.0
# (pkg_check_modules libdisplay-info>=0.2.0), so build it static and
# stage into the sysroot. Vulkan headers are vendored by ivi-homescreen
# and drm-cxx (third_party/Vulkan-Headers), so none is needed here.
- pkg: libdisplay-info
min: "0.2.0"
url: https://gitlab.freedesktop.org/emersion/libdisplay-info/-/archive/0.2.0/libdisplay-info-0.2.0.tar.gz
build: meson
static: true
backends: &backends_rpi5
wayland-egl: *be_wayland_egl
wayland-vulkan: *be_wayland_vulkan
drm-kms-egl: *be_drm_kms_egl
drm-kms-vulkan:
BUILD_BACKEND_WAYLAND_EGL: 'OFF'
BUILD_BACKEND_WAYLAND_VULKAN: 'OFF'
BUILD_BACKEND_DRM_KMS_EGL: 'OFF'
BUILD_BACKEND_DRM_KMS_VULKAN: 'ON'
BUILD_BACKEND_SOFTWARE: 'OFF'
BUILD_COMPOSITOR: 'ON' # engine presents via the layer scene
software: *be_software
rpi5-trixie:
toolchain_version: &tc_trixie 15.2.rel1
image_url: &img_trixie https://downloads.raspberrypi.com/raspios_lite_arm64/images/raspios_lite_arm64-2026-04-21/2026-04-21-raspios-trixie-arm64-lite.img.xz
cpu_flags: *cpu_rpi5
backends: *backends_rpi5
# -- Raspberry Pi 4 (Cortex-A72) — four backends ----------------------
rpi4-bookworm:
toolchain_version: *tc_bookworm
image_url: *img_bookworm
cpu_flags: &cpu_rpi4 [-mcpu=cortex-a72]
sysroot: *sysroot_bookworm
augment: *augment_bookworm
rpi4-trixie:
toolchain_version: *tc_trixie
image_url: *img_trixie
cpu_flags: *cpu_rpi4
# -- Raspberry Pi Zero 2 W (Cortex-A53) — four backends ---------------
rpi-zero-2w-bookworm:
toolchain_version: *tc_bookworm
image_url: *img_bookworm
cpu_flags: &cpu_zero2w [-mcpu=cortex-a53]
sysroot: *sysroot_bookworm
augment: *augment_bookworm
rpi-zero-2w-trixie:
toolchain_version: *tc_trixie
image_url: *img_trixie
cpu_flags: *cpu_zero2w