在 RISC-V 上编译 Node.js 16
最近因为实习原因经常和 RISC-V 打交道,迫于需要,尝试在 riscv64gc
环境下编译运行 njs 16 并大获成功,记录一下流程步骤。
当前 njs 16(gallium LTS)主线版本是 v16.13.1
,把源代码拉下来:
1 | wget https://nodejs.org/dist/v16.13.1/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 | cd node-v16.13.1 |
之后用 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 | wget -c http://ns2.felixcat.org/images/archriscv-20210601.tar.zst |
这样你就得到了一个经过了 chroot 的 Arch Linux RISC-V 环境,它的 repo 源指向 PLCT archrv 小队(其实主要是 Felix Yan)维护的 repo。
这样甚至不用编译 njs,我们已经编译好了,形成
.pkg.tar.zst
放到 repo 里,直接pacman -S nodejs-lts-gallium
就可以装上。