想研究下 Wayland,Jetpack 4.x 系统自带 Weston,但是不支持 X11 backend,只能以 standalone 模式运行。我不想放弃那个桌面。我设置成自动登录桌面,方便 vnc 远程访问。文档中说,那个 Gnome 桌面可切换到 Wayland,本来这样最好不过,但文档操作步骤中需要修改的一个文件不存在,这条路也不通。所以我得自己编译 Weston。
系统自带的 Weston 是 6.0 版本,已经很旧了(Jetson Nano 和 Jetpack 4.x 本来就是老瓶装旧酒)。Weston 文档说,一般要依赖当前最新 release 的 wayland
和 wayland-protocols
库,而 wayland
本身又有自己的依赖。系统是 Ubuntu 18.04,软件包仓库中很多工具和开发库版本都非常旧,合理怀疑,如果要编译最新的 Weston/wayland
会相当麻烦。就弄 6.0 版。
编译和安装 Weston
首先,按照安装文档,准备好 pip3 和 meson。meson 需要 CMake 或者 ninja,默认 ninja,所以还要安装 ninja。接下来,执行下面的命令,安装 Weston 的依赖包。注意,执行下面命令之前需要把 apt 的 Source 源打开:
bash
sudo apt-get build-dep weston
这个命令会把几乎所有依赖包都安装好,漏网之鱼等到编译过程中报错再个别安装。把 Weston 6.0 源码下载下来:
bash
git clone -b 6.0 https://gitlab.freedesktop.org/wayland/weston.git
cd weston
参照安装文档,设置一些环境变量,自定义安装目录。因为不想覆盖系统自带的 Weston,决定安装在用户主目录下:
bash
export WLD=$HOME/weston_install_dir
export LD_LIBRARY_PATH=$WLD/lib
export PKG_CONFIG_PATH=$WLD/lib/pkgconfig/:$WLD/share/pkgconfig/
export PATH=$WLD/bin:$PATH
我的目标是在 Gnome 桌面环境下运行 Weston,只需要支持 X11 backend。先修改 meson_options.txt
,把不需要的东西都禁用掉,然后开始进行配置:
bash
mkdir -p build
meson setup build/
如果有依赖包不满足,meson setup
命令会报错,根据错误信息提示,从 apt 仓库安装。这里有一个例外,wayland-protocols
要求最低版本是 17.0,而 Ubuntu 18.04 apt 仓库中的版本太低,所以需要下载 v17.0 版本的源码并安装,具体步骤放到后面。
等 meson setup
命令通过后,继续进行配置:
bash
meson configure build/ -Dprefix=$WLD
这里通过 prefix
配置项来指定自定义安装目录。若直接执行 meson configure build/
命令(不带其他选项),则会打印出所有配置项。仔细检查,如有必要可直接修改 meson_options.txt
文件,或者像上面的命令用 -Dname=value
的形式进行修改。可以了就开始编译和安装:
bash
ninja -C build/
ninja -C build install
安装 wayland-protocols
wayland-protocols
使用 autotools:
bash
git clone -b 17.0 https://gitlab.freedesktop.org/wayland/wayland-protocols.git
cd wayland-protocols
aclocal
autoconf
automake --add-missing
./configure --prefix=$WLD
make
make install
其实 wayland-protocols
不需编译,只要安装到与 Weston 相同的目录下即可。前面已设置 LD_LIBRARY_PATH
等环境变量,使得在编译 Weston 时,编译工具能够找到新版本的 wayland-protocols
。
运行 Weston
这里有一个要点。weston
可执行程序动态链接到 $WLD/lib/aarch64-linux-gnu/libweston-6.so.0
,因此需要将该动态库所在目录添加到 LD_LIBRARY_PATH
环境变量中,否则,在运行 Weston 时会链接系统目录(在 /usr/local
下)中同一文件名(libweston-6.so.0
)的动态库,这显然不好。除此以外,不同的 libweston-6.so.0
还会进一步加载不同路径下的 x11-backend.so
等其他动态库。
arduino
export LD_LIBRARY_PATH="$WLD/lib/aarch64-linux-gnu"
weston --no-config
在 Gnome/X11 环境下,Weston 会自动选择 x11-backend.so
。Weston 默认启动 desktop-shell
,如下图:
不过,在 Weston / desktop-shell
中检查仍是 X11 session,这就奇怪了哦