利用 RuyiSDK 玩转 RISC-V 版supertux
圆滚滚的小企鹅 Tux 憨态可掬,却怀揣着勇敢与执着,在奇幻世界里踏上一场拯救伙伴的冒险之旅!
之前的blog通常是通过clone github上的缺失的依赖,然后通过工具链进行手动编译,不仅效率低,而且可能会造成依赖地狱(编译了第一个依赖时发现这个依赖却需要编译另一个依赖,循环下来不知道要编译多少个才能终结,深受折磨),今天来玩点不一样的,buildroot闪亮登场,可以通过 Buildroot 一键配置、自动交叉编译所需的第三方库与系统组件,生成与目标平台完全兼容的依赖文件,解决开发中依赖缺失问题。
获取 buildroot
- 方法一
# 从GitHub仓库进行克隆
$ git clone https://github.com/buildroot/buildroot.git
- 方法二
# 从gitlab官方仓库进行克隆
$ git clone https://gitlab.com/buildroot.org/buildroot.git
- 方法三
# 从buildroot官网进行下载安装
https://buildroot.org/download.html
配置buildroot
$ make menuconfig
架构选择
在Target options → Target Architecture → RISCV
在Target options → Target Architecture Variant → Custom architecture
工具链选择
在Toolchain → Toolchain type → External toolchain
在Toolchain → Toolchain → Custom toolchain
在Toolchain → Toolchain → Toolchain origin (Pre-installed toolchain) → /home/cjh/buildroot/ruyi-venv-sipeed-lpi4a
(这里是你当前虚拟环境工具链的路径,到虚拟环境即可,由于可能识别不到中文,建议放在主目录下即可)
在Toolchain → Toolchain → Toolchain prefix → riscv64-plctxthead-linux-gnu
(这里是交叉工具链的前缀)
以及一些工具链的相关参数,可以用 riscv64-plctxthead-linux-gnu-gcc -v 查到一些,如果填错也没关系,buildroot在make阶段报错会提醒的,之后再改也可以。
剩余选项
(这里的debug symbools不建议选, 调试信息会让二进制 / 库体积增加 数倍,设备存储紧张)
依赖补充
在Target Packages里可以根据分类选择你所需要的依赖即可,选择与否可以用空格确定,如果找不到的话,你也可以通过/键快速搜索确定位置
编译
确定好所需依赖(如果有依赖没选上的make失败后也可以重新补充)后通过ESC退出确认配置
# 编译依赖
$ make
构建supertux
获取supertux源码进行交叉编译
$ git clone https://github.com/SuperTux/supertux.git
编写toolchain.cmake
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR riscv64)
set(CMAKE_C_COMPILER "/home/cjh/桌面/supertux/ruyi-venv-sipeed-lpi4a/bin/riscv64-plctxthead-linux-gnu-gcc")
set(CMAKE_CXX_COMPILER "/home/cjh/桌面/supertux/ruyi-venv-sipeed-lpi4a/bin/riscv64-plctxthead-linux-gnu-g++")
set(CMAKE_SYSROOT "/home/cjh/buildroot/output/staging")
set(CMAKE_FIND_ROOT_PATH "/home/cjh/buildroot/output/staging")
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
set(PKG_CONFIG_EXECUTABLE "/home/cjh/buildroot/output/host/bin/pkg-config")
set(ENV{PKG_CONFIG_SYSROOT_DIR} ${CMAKE_SYSROOT})
set(ENV{PKG_CONFIG_PATH} "${CMAKE_SYSROOT}/usr/lib/pkgconfig")
supertux需要的一些依赖
sdl2 sdl2_image sdl2_mixer sdl2_ttf libcurl libogg libvorbis glm fmt physfs libX11 libpng openal
可能有所遗漏,如果缺少依赖的话请根据上文自行补充即可
(x11等相关驱动如果在sdl2编译后补充的话,需要重新编译sdl2)
交叉编译
$ cmake .. -DCMAKE_TOOLCHAIN_FILE=../toolchain.cmake
$ make -j$(nproc)
###小问题
如果出现如上问题,sdl2_image链接失败的情况,是由于cmake硬编码导致去宿主机找sdl2_image了,需要更改为buildroot路径下的sdl2_image,代码参考如下
$ sed -i 's|/usr/lib/libSDL2_image.so|/home/cjh/buildroot/output/staging/usr/lib/libSDL2_image.so|g' CMakeFiles/supertux2.dir/build.make
$ sed -i 's|/usr/lib/libSDL2_image.so|/home/cjh/buildroot/output/staging/usr/lib/libSDL2_image.so|g' CMakeFiles/supertux2.dir/link.txt
运行
$ xhost +local:
$ ruyi-qemu -cpu thead-c906 \
-L /home/cjh/buildroot/output/staging \
-E DISPLAY=$DISPLAY \
-E SDL_VIDEODRIVER=x11 \
-E LD_LIBRARY_PATH="/usr/lib:/lib:/usr/lib64/lp64d:/lib64/lp64d:." \
./supertux2








