3. Weston源码获取与编译

在 RK 平台进行 Weston 显示配置与调试部署,第一步便是获取正确的源码并搭建可靠的编译环境。本章将详细讲解从 Git 仓库拉取 Weston 及其依赖、使用 Meson/Ninja 现代构建系统进行配置,以及针对 ARM 架构的 RK 平台搭建交叉编译环境的完整流程。

3.1 Git 仓库拉取与分支选择

Weston 是 Wayland 协议的一个参考实现 Compositor,其源码托管在 freedesktop.org 的 GitLab 上。对于 RK 平台,通常建议使用长期支持(LTS)或稳定分支,以确保与 Rockchip 提供的 BSP 和 GPU 驱动兼容。

推荐分支策略: 对于 RK3588/RK3568 等主流平台,建议使用 Weston 10.0 或 11.0 稳定分支。若需最新特性,可选用 master 分支,但需注意与 Mali GPU 驱动(如 bifrost 驱动)的适配性。

执行以下命令拉取 Weston 主仓库及关键子项目(如 wayland-protocols、libweston):

# 克隆 Weston 主仓库
git clone https://gitlab.freedesktop.org/wayland/weston.git
cd weston

# 切换到稳定分支(例如 11.0)
git checkout 11.0

# 初始化并更新子模块(包含 wayland-protocols 等)
git submodule update --init --recursive

除了 Weston 本身,还需要拉取其核心依赖库,这些库通常需要一并交叉编译:

依赖库 Git 仓库地址 作用说明
wayland https://gitlab.freedesktop.org/wayland/wayland.git 核心协议库,提供 libwayland-client/server
wayland-protocols https://gitlab.freedesktop.org/wayland/wayland-protocols.git 官方扩展协议描述文件(XML)
libdrm https://gitlab.freedesktop.org/mesa/drm.git 直接渲染管理器,用于 KMS/DRM 后端
pixman https://gitlab.freedesktop.org/pixman/pixman.git 像素操作库,用于软件渲染后端
版本一致性警告: Weston 与 wayland、wayland-protocols 之间存在严格的版本依赖关系。例如,Weston 11.0 要求 wayland >= 1.20 且 wayland-protocols >= 1.30。请务必检查 meson.build 文件中的 dependency() 版本声明,避免因版本不匹配导致编译失败。

3.2 Meson/Ninja 构建系统配置

Weston 从 7.0 版本开始全面采用 Meson 作为构建系统,Ninja 作为底层构建工具。相比传统的 Autotools,Meson 提供了更清晰、更快速的配置体验,尤其适合交叉编译场景。

下图展示了 Meson 构建系统的核心工作流程:

Meson/Ninja 构建系统工作流程 源码目录 (SRC) meson.build meson setup build/ 目录 ninja 编译产物 说明:Meson 读取 meson.build 描述文件,生成 Ninja 构建规则到独立的 build 目录,最终由 Ninja 执行并行编译。

在 RK 平台进行本地编译(非交叉)时,典型的 Meson 配置命令如下:

# 在 Weston 源码根目录下执行
meson setup build/ \
  -Dbackend-drm=true \
  -Dbackend-wayland=false \
  -Dbackend-x11=false \
  -Dbackend-rdp=false \
  -Dsimple-clients=egl \
  -Ddemo-clients=false \
  -Dshell-desktop=true \
  -Dshell-ivi=false \
  -Dcolor-management-lcms=false \
  -Dremoting=false \
  -Dpipewire=false

# 编译
ninja -C build/

关键配置选项说明:

  • backend-drm:启用 DRM/KMS 后端,这是 RK 平台最常用的硬件加速后端。
  • simple-clients:编译简单的测试客户端,egl 用于验证 EGL 初始化。
  • shell-desktop:启用桌面风格的 Shell(如 xdg-shell),适合通用 Linux 桌面。
  • shell-ivi:启用 IVI(In-Vehicle Infotainment)Shell,常用于车载仪表盘场景。

3.3 交叉编译环境搭建

RK 平台(如 RK3588、RK3568)通常采用 ARM64(aarch64)架构,而开发主机多为 x86_64。因此,必须搭建交叉编译环境,在 x86 主机上编译出可在 ARM 目标板上运行的 Weston 二进制文件。

交叉编译环境的核心要素包括:

组件 说明 获取方式
交叉编译工具链 包含 aarch64-linux-gnu-gcc/g++ 等 Linaro 预编译工具链或 Buildroot/Yocto SDK
Sysroot 目标板的根文件系统,包含所有运行时库和头文件 从 RK SDK 导出或使用 Buildroot 生成
pkg-config 包装器 使 Meson 能正确找到 Sysroot 中的 .pc 文件 手动编写 .cmake 或使用 PKG_CONFIG_SYSROOT_DIR

以下是一个典型的交叉编译 Meson 配置脚本(cross-file.ini):

[binaries]
c = '/opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc'
cpp = '/opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-g++'
ar = '/opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-ar'
strip = '/opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-strip'
pkgconfig = '/usr/bin/aarch64-linux-gnu-pkg-config'

[host_machine]
system = 'linux'
cpu_family = 'aarch64'
cpu = 'armv8-a'
endian = 'little'

[properties]
sys_root = '/opt/sysroot/rk3588'
pkg_config_libdir = '/opt/sysroot/rk3588/usr/lib/aarch64-linux-gnu/pkgconfig:/opt/sysroot/rk3588/usr/share/pkgconfig'

使用该交叉编译文件配置 Weston:

# 确保依赖库已交叉编译并安装到 sysroot 中
# 例如 wayland、libdrm、pixman 等

meson setup build-cross/ \
  --cross-file cross-file.ini \
  -Dbackend-drm=true \
  -Dbackend-wayland=false \
  -Dbackend-x11=false \
  -Dsimple-clients=egl \
  -Ddemo-clients=false \
  -Dshell-desktop=true \
  -Dshell-ivi=false

ninja -C build-cross/
关键检查点: 交叉编译中最常见的错误是 dependency not found。这通常是因为 Sysroot 中缺少对应的 .pc 文件,或者 pkg_config_libdir 路径配置错误。建议在运行 Meson 前,先手动执行 aarch64-linux-gnu-pkg-config --libs wayland-client 验证依赖是否可被正确解析。

下图展示了交叉编译环境中,主机、工具链、Sysroot 与目标板之间的数据流关系:

交叉编译环境数据流 开发主机 (x86_64) Meson + Ninja 交叉工具链 aarch64-linux-gnu-gcc Sysroot 头文件 + 库文件 目标板 RK3588 编译产物部署流程: 1. 主机上 Meson 调用交叉工具链,链接 Sysroot 中的库,生成 ARM64 二进制。 2. 将编译好的 weston、libweston.so 及依赖库通过 NFS/SCP 部署到目标板。 3. 在目标板上运行 weston,验证显示效果与性能。

3.4 常见编译问题与解决方案

在 RK 平台编译 Weston 时,开发者常遇到以下问题,提前了解可大幅缩短调试时间:

  • 问题1:缺少 wayland-scanner 可执行文件
    原因:wayland-scanner 需要在编译主机上本地编译并安装,因为它是在编译时生成协议代码的工具。
    解决:先本地编译 wayland 并安装到主机 /usr/local/bin,再交叉编译 Weston。
  • 问题2:EGL/GLES 头文件找不到
    原因:RK 平台的 GPU 驱动(如 Mali)通常提供私有 EGL 实现,头文件不在标准 Sysroot 路径中。
    解决:将 Rockchip BSP 中的 mali_egl 头文件目录添加到 CFLAGS 或 Meson 的 c_args 中。
  • 问题3:libdrm 版本不匹配导致 KMS 后端初始化失败
    原因:Weston 的 DRM 后端依赖 libdrm 的特定 API(如 drmModeGetConnector 的 modifiers 支持)。
    解决:确保交叉编译的 libdrm 版本与 Weston 要求的版本一致,且启用了 --enable-udev 支持。
调试技巧: 在交叉编译完成后,使用 file build-cross/weston 命令验证生成的二进制是否为 ELF 64-bit LSB executable, ARM aarch64。若显示为 x86-64,则说明交叉编译配置未生效,需检查 --cross-file 路径是否正确。

通过以上步骤,开发者应能顺利在 RK 平台上完成 Weston 的源码获取、构建系统配置与交叉编译。下一阶段将进入 Weston 的运行时配置与显示后端调试。