3. Weston源码获取与编译
在 RK 平台进行 Weston 显示配置与调试部署,第一步便是获取正确的源码并搭建可靠的编译环境。本章将详细讲解从 Git 仓库拉取 Weston 及其依赖、使用 Meson/Ninja 现代构建系统进行配置,以及针对 ARM 架构的 RK 平台搭建交叉编译环境的完整流程。
3.1 Git 仓库拉取与分支选择
Weston 是 Wayland 协议的一个参考实现 Compositor,其源码托管在 freedesktop.org 的 GitLab 上。对于 RK 平台,通常建议使用长期支持(LTS)或稳定分支,以确保与 Rockchip 提供的 BSP 和 GPU 驱动兼容。
执行以下命令拉取 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 | 像素操作库,用于软件渲染后端 |
meson.build 文件中的 dependency() 版本声明,避免因版本不匹配导致编译失败。
3.2 Meson/Ninja 构建系统配置
Weston 从 7.0 版本开始全面采用 Meson 作为构建系统,Ninja 作为底层构建工具。相比传统的 Autotools,Meson 提供了更清晰、更快速的配置体验,尤其适合交叉编译场景。
下图展示了 Meson 构建系统的核心工作流程:
在 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 与目标板之间的数据流关系:
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 的运行时配置与显示后端调试。