在 RISC - V 上安装 Neovim

由于目前 LuaJIT 对 RISC - V 的支持不够完善,OS 软件包里的 Neovim 通常并没有使用 LuaJIT 构建,而是使用 Lua,导致我们有一些插件无法使用。本文将使用第三方修改的 LuaJIT,来构建几乎全功能的 Neovim。

获取与交叉编译 LuaJIT

仓库:https://github.com/plctlab/LuaJIT/tree/riscv

git clone https://github.com/plctlab/LuaJIT/tree/riscv
cd LuaJIT

将以下脚本保存为 compile.sh:

#!/bin/bash
set -euo pipefail

HOST_CC="/usr/lib/llvm-20/bin/clang" # 当前主机的 CC
TOOLCHAIN="/workspace/mingyi/opt/clang-riscv64-unknown-linux-gnu/bin" # RISC-V 交叉编译工具链的位置
SYSROOT="/workspace/mingyi/opt/riscv/sysroot" # RISC-V sysroot 的位置
TARGET_ARCH_FLAGS="-march=rva23u64 -mabi=lp64d" # 由于我的 target CPU 为 SpacemiT K3, 此处为 RVA23U64 进行编译。

make clean
make -j32 \
  HOST_CC="$HOST_CC" \
  STATIC_CC="$TOOLCHAIN/clang" \
  DYNAMIC_CC="$TOOLCHAIN/clang -fPIC" \
  TARGET_LD="$TOOLCHAIN/clang" \
  TARGET_AR="$TOOLCHAIN/llvm-ar rcus" \
  TARGET_STRIP="$TOOLCHAIN/llvm-strip" \
  TARGET_SYS=Linux \
  TARGET_FLAGS="--sysroot=$SYSROOT $TARGET_ARCH_FLAGS" \
  TARGET_CFLAGS="-DLUAJIT_UNWIND_INTERNAL"

之后执行 bash compile.sh 进行编译。

编译好后,安装到某个方便日后传送到目标机器上的位置,例如 /workspace/mingyi/opt/luajit:

make install PREFIX=/workspace/mingyi/opt/luajit

此时对应目录的结构大致为:

luajit/
├── bin
│   ├── luajit -> luajit-2.1.1783679736
│   └── luajit-2.1.1783679736
├── include
│   └── luajit-2.1
│       ├── lauxlib.h
│       ├── luaconf.h
│       ├── lua.h
│       ├── lua.hpp
│       ├── luajit.h
│       └── lualib.h
├── lib
│   ├── libluajit-5.1.a
│   ├── libluajit-5.1.so -> libluajit-5.1.so.2.1.1783679736
│   ├── libluajit-5.1.so.2 -> libluajit-5.1.so.2.1.1783679736
│   ├── libluajit-5.1.so.2.1.1783679736
│   ├── lua
│   │   └── 5.1
│   └── pkgconfig
│       └── luajit.pc
└── share
    ├── lua
    │   └── 5.1
    ├── luajit-2.1
    │   └── jit
    │       ├── bc.lua
    │       ├── bcsave.lua
    │       ├── dis_arm64be.lua
    │       ├── dis_arm64.lua
    │       ├── dis_arm.lua
    │       ├── dis_mips64el.lua
    │       ├── dis_mips64.lua
    │       ├── dis_mips64r6el.lua
    │       ├── dis_mips64r6.lua
    │       ├── dis_mipsel.lua
    │       ├── dis_mips.lua
    │       ├── dis_ppc.lua
    │       ├── dis_riscv64.lua
    │       ├── dis_riscv.lua
    │       ├── dis_x64.lua
    │       ├── dis_x86.lua
    │       ├── dump.lua
    │       ├── p.lua
    │       ├── v.lua
    │       ├── vmdef.lua
    │       └── zone.lua
    └── man
        └── man1
            └── luajit.1

15 directories, 35 files

这之后我们就能将该文件夹同步到目标机器上:

rsync -azP --delete /workspace/mingyi/opt/luajit/ K3:/workspace/mingyi/opt/luajit/

在目标机器上编译 Neovim

由于交叉编译 Neovim 有些麻烦(其实是我还没摸索出来),所以我们就直接在 RISC - V 上编译 Neovim

首先拿下源代码:

git clone https://github.com/neovim/neovim.git
cd neovim

同样的保存一个脚本 compile.sh 来编译:

#!/bin/bash

make distclean

export CC=/usr/bin/clang
export CXX=/usr/bin/clang++
export CFLAGS="-march=rva23u64 -pipe"
export CXXFLAGS="-march=rva23u64 -pipe"

LUAJIT_PREFIX=/workspace/mingyi/opt/luajit # LuaJIT 存放的位置
export CMAKE_PREFIX_PATH="$LUAJIT_PREFIX${CMAKE_PREFIX_PATH:+:$CMAKE_PREFIX_PATH}"

LUAJIT_CMAKE_FLAGS="\
-DLUAJIT_LIBRARY:FILEPATH=$LUAJIT_PREFIX/lib/libluajit-5.1.so \
-DLUAJIT_INCLUDE_DIR:PATH=$LUAJIT_PREFIX/include/luajit-2.1"

make \
  CMAKE_BUILD_TYPE=Release \
  ENABLE_LTO=ON \
  CMAKE_INSTALL_PREFIX=/workspace/mingyi/opt/neovim \ # 安装 Neovim 的目标位置
  DEPS_CMAKE_FLAGS="-DUSE_BUNDLED_LUAJIT=OFF $LUAJIT_CMAKE_FLAGS" \
  CMAKE_EXTRA_FLAGS="$LUAJIT_CMAKE_FLAGS"

同样执行 bash compile.sh 来编译。

编译好后 make install 即可。这样就获得了一个在 RISC - V 上运行的,使用 LuaJIT 的 Neovim。别忘了加入 PATH 来替换掉 OS 软件包提供的版本。