nodejs 交叉编译

2022 年 08 月 05 日

换了新东家,又开始面对各种奇怪的需求。这次是要让 nodejs 在开发板上运行。

需求方一开始的想法是利用开发板的编译系统,仔细看了看还是作罢。两套编译系统整合在一起,这工作量不是开玩笑的。

我一开始的想法是仅仅使用开发板的工具链,但试了多次都是失败,似乎工具链不全,不足以编译 nodejs。

最后没办法,看了一下 cpuinfo,再用 file 命令分析了一下系统中其他可执行程序的类型,最后确定用 arm-musl 的工具链。在 musl.cc 可以找到。我用的是 arm-linux-musleabi-cross.tgz

然后编译就简单了,就是时间长点,执行脚本即可:

# 将工具链加入 PATH,注意路径
export PATH=~/arm-linux-musleabi-cross/bin/:$PATH
# 指定工具链前缀
export TOOL_PREFIX="arm-linux-musleabi"
# 指定环境变量
export CC="${TOOL_PREFIX}-gcc"
export CXX="${TOOL_PREFIX}-g++"
export AR="${TOOL_PREFIX}-ar"
export RANLIB="${TOOL_PREFIX}-ranlib"
export LINK="${CXX}"
# nodejs 还需要编译一些 host 上运行的应用,也需要指定环境变量
export CC_host="gcc -m32"
export CXX_host="g++ -m32"
export AR_host="ar"
export RANLIB_host="ranlib"
export LINK_host="${CXX_host}"
# 根据 cpu 所支持的 feature 调整浮点和 fpu 的模式
./configure --dest-cpu=arm --dest-os=linux --cross-compiling --with-arm-float-abi=soft --with-arm-fpu=vfpv3
# 开始编译,8 线程
make -j8

这样编译的结果是动态链接的,这样就需要工具链中的几个库。假如嫌麻烦的话,可以做成静态链接。在 configure 之前加入:

export CFLAGS="-static"
export CXXFLAGS="-static"

最后是 npm 的部分,由于 npm 都是脚本,放在 nodejs 源码的 /dep/npm 目录。所以把需要的几个目录,以及 package.json 打个包一起放上去再解压,再参考官方版本做一个 npm 脚本就可以了。

Top