最近因为实习原因经常和 RISC-V 打交道,迫于需要,尝试在 riscv64gc 环境下编译运行 njs 16 并大获成功,记录一下流程步骤。

当前 njs 16(gallium LTS)主线版本是 v16.13.1,把源代码拉下来:

1
2
wget https://nodejs.org/dist/v16.13.1/node-v16.13.1.tar.xz
tar -xvf node-v16.13.1.tar.xz

把同事(luyahan)的 patch 拉下来:

1
wget https://github.com/nodejs/node/pull/41566.patch

这个 patch 是上游 v8 的 4 个 commit 的 cherry-pick,修复了编译时 node_mksnapshot 卡住、测试时 inspector 相关某个测试点 CRASH signal 11(也就是 SIGSEGV / Seg Fault)的问题。

把 patch 打上去:

1
2
cd node-v16.13.1
patch -Np1 -i ../41566.patch

之后用 riscv-gnu-toolchain 正常编译就行了,不会用 make 那套的话可以照抄 Arch Linux 官方源的 PKGBUILD。如果是 gcc>=10,注意在 make 的时候指定 CFLAGS="-fno-strict-aliasing $CFLAGS"CXXFLAGS="-fno-strict-aliasing $CXXFLAGS",否则会挂一个测试点(cctest/test_node_postmortem_metadata.cc)。

这个 toolchain 可以直接下载到针对 x86_64 平台 cross-compile 的版本。编译的时候会开 qemu-user 来模拟 RISC-V 环境,由于 QEMU 的 bug(和 feature),有几个测试点会挂,这是正常现象。

嫌麻烦可以开一台 Arch Linux,然后:

1
2
3
4
5
6
wget -c http://ns2.felixcat.org/images/archriscv-20210601.tar.zst
sha512sum archriscv-20210601.tar.zst
# 6f012a169fe6f1ea15aeb3283091466e7992f78d823951ee2170940fa030e7fa2394aee11bf67c29943d21579ab42d2262a3d5ca973b5de8be779f338ba1dd44 archriscv-20210601.tar.zst
mkdir ~/archriscv
tar -xvf archriscv-20210601.tar.zst -C ~/archriscv
sudo systemd-nspawn -D ~/archriscv/ --machine archriscv

这样你就得到了一个经过了 chroot 的 Arch Linux RISC-V 环境,它的 repo 源指向 PLCT archrv 小队(其实主要是 Felix Yan)维护的 repo。

这样甚至不用编译 njs,我们已经编译好了,形成 .pkg.tar.zst 放到 repo 里,直接 pacman -S nodejs-lts-gallium 就可以装上。

来源:https://blog.jiejiss.com/