利用 RuyiSDK 玩转 RISC-V 版Endless-Sky
Endless Sky(无尽天空)是一款免费开源、跨平台的2D 沙盒式太空模拟游戏,玩家以飞船舰长身份,在开放宇宙中自由开展贸易、运输、战斗、探索,并可选择参与主线剧情或自由经营舰队,今天我们尝试用buildroot+RuyiSDK交叉编译,并且在ruyi-qemu尝试运行。
获取 buildroot
- 方法一
# 从GitHub仓库进行克隆
$ git clone https://github.com/buildroot/buildroot.git
- 方法二
# 从gitlab官方仓库进行克隆
$ git clone https://gitlab.com/buildroot.org/buildroot.git
- 方法三
# 从buildroot官网进行下载安装
```bash
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阶段报错会提醒的,之后再改也可以。
剩余选项
依赖补充
在Target Packages里可以根据分类选择你所需要的依赖即可,选择与否可以用空格确定,如果找不到的话,你也可以通过/键快速搜索确定位置
编译
确定好所需依赖(如果有依赖没选上的make失败后也可以重新补充)后通过ESC退出确认配置
# 编译依赖
$ make
构建Endless-Sky
获取Endless-Sky源码进行交叉编译
$ git clone https://github.com/endless-sky/endless-sky.git
编写toolchain.cmake
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR riscv64)
set(CMAKE_C_COMPILER "/home/cjh/桌面/Endless-Sky/ruyi-venv-sipeed-lpi4a/bin/riscv64-plctxthead-linux-gnu-gcc")
set(CMAKE_CXX_COMPILER "/home/cjh/桌面/Endless-Sky/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")
Endless-Sky需要的一些依赖
sdl2 sdl2_image sdl2_mixer sdl2_ttf libcurl libogg libvorbis glm fmt physfs libX11 libpng openal libavif minizip Catch2 libuuid libglu libjpeg-turbo
可能有所遗漏,如果缺少依赖的话请根据上文自行补充即可
(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:." \
./endless-sky









