为ARM6交叉编译Node.js(树莓派)

我试图让node.js v0.7.9编译为覆盆子pi,但是由于node和v8相当大,我希望能够在另一个更强大的PC上进行交叉编译。 我使用https://github.com/raspberrypi/tools中的linux-x86 arm-bcm2708-linux-gnueabi工具链,并使用它们成功构build了系统的其他可执行文件。 我最终设置了CC,CXX,CPP,STRIP,OBJCOPY等。 variables转换为环境variables中的工具链等价物,然后使用./configure --dest-cpu=arm --without-snapshot运行configuration以获取最终的可执行文件。 将其复制到系统并运行它会产生以下错误:

 Extension or internal compilation error at line 0. Segmentation fault 

但是,对于像node --versionnode --help这样的非javascript任务,不会发生分段错误。 有没有任何CFLAGS / CXXFLAGS我可能会丢失造成这个问题? 有点困惑….

NodeJS可以预编译为几个Linux发行版: https : //github.com/joyent/node/wiki/Installing-Node.js-via-package-manager

由于NodeJS仍然处于Debian的testing阶段,为了在Debian的喘息之下在我的Raspberry Pi上安装NodeJS,我需要:

 sudo su echo deb ftp://ftp.dk.debian.org/debian/ sid main > /etc/apt/sources.list.d/sid.list apt-get update apt-get install nodejs rm /etc/apt/sources.list.d/sid.list apt-get update exit 

NodeJS在我的Raspberry Pi上工作得非常好而且稳定。

只是一个说明 – 这对我很好,但没有安装NPM。 所以,如果你想NPM(你最确定的是我会认为)确保运行

apt-get install npm

在从更新列表中删除更新位置之前安装节点之后。

我一直在研究这个问题,因为这个问题最初被问到,甚至添加了一些补丁来帮助自动检测交叉编译器设置。 存储库中的Node.js(目前)是一个相当老的版本,并且可能支持或不支持完整的硬件浮动(VFP)体系结构。

有关完整详细的HOWTO,请参阅Nathan Rajlich在http://n8.io/cross-compiling-nodejs-v0.8/

我已经发布了其他人的二进制文件,他们不希望在https://gist.github.com/3245130

这里是我写的使用Jenkins自动为ARMv6(Raspbery Pi)交叉编译NodeJS的脚本。

https://gist.github.com/hertzg/12c2d7fc40f68ff6deeb

我已经使用@Adam MW的“包装”片段

该脚本将自动下载所需的一切,并开始build设。

请注意,由于这个问题,当前( v0.10.30 )版本不能编译: https : //github.com/joyent/node/issues/8062#issuecomment-52541037

运行_PARAMS_NODEJS_SOURCE_ARCHIVE_URL=http://nodejs.org/dist/v0.10.29/node-v0.10.29.tar.gz以获得最新的可交叉编译版本。

 #!/bin/bash set -e set -x ### IF we dont have archive url prefix if [ -z "$_PARAMS_NODEJS_SOURCE_ARCHIVE_URL" ]; then _PARAMS_NODEJS_SOURCE_ARCHIVE_URL=$(wget -qO- http://nodejs.org/dist/latest/ | egrep -o 'node-v[0-9\.]+.tar.gz' | tail -1); _PARAMS_NODEJS_SOURCE_ARCHIVE_URL="http://nodejs.org/dist/latest/"$_PARAMS_NODEJS_SOURCE_ARCHIVE_URL fi if [ -z "$_PRAMS_RPI_TOOLS_SOURCE_ARCHIVE_URL" ]; then _PRAMS_RPI_TOOLS_SOURCE_ARCHIVE_URL="https://github.com/raspberrypi/tools/archive/master.tar.gz" fi; NODEJS_SOURCE_ARCHIVE_FILENAME=$(basename $_PARAMS_NODEJS_SOURCE_ARCHIVE_URL) NODEJS_SOURCE_DIRECTORY=${NODEJS_SOURCE_ARCHIVE_FILENAME%.tar.gz} #Download NodeJS echo "-> Searching for NodeJS "$NODEJS_SOURCE_ARCHIVE_FILENAME; if [ ! -e "$PWD/$NODEJS_SOURCE_ARCHIVE_FILENAME" ]; then echo "--> Downloading from "$_PARAMS_NODEJS_SOURCE_ARCHIVE_URL; wget --no-check-certificate -O $NODEJS_SOURCE_ARCHIVE_FILENAME $_PARAMS_NODEJS_SOURCE_ARCHIVE_URL echo "--> Download finished!" fi; echo "--> Extracting" rm -rf $NODEJS_SOURCE_DIRECTORY tar --overwrite -xf $NODEJS_SOURCE_ARCHIVE_FILENAME echo "--> Linking" ln -snf "$PWD/$NODEJS_SOURCE_DIRECTORY" "$PWD/node" echo "-> Done!" echo "-> Searching Raspberry Pi Toolset"; if [ ! -d "$PWD/rpi" ]; then if [ ! -e "$PWD/rpi-tools.tar.gz" ] || [ -s "$PWD/rpi-tools.tar.gz" ]; then echo "--> Downloading from "$_PRAMS_RPI_TOOLS_SOURCE_ARCHIVE_URL wget --no-check-certificate -O "rpi-tools.tar.gz" $_PRAMS_RPI_TOOLS_SOURCE_ARCHIVE_URL echo "--> Download finished" else echo "--> Found rpi-tools.tar.gz." fi echo "--> Extracting" tar xf "rpi-tools.tar.gz" echo "--> Linking tools-master to rpi" ln -snf "$PWD/tools-master" "$PWD/rpi" else echo "-> found" fi; echo "-> Done!" echo "-> Cross-Compile..." echo "--> Setup ENV" export PATH="$PWD/rpi/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin:"$PATH export HOST="arm-bcm2708hardfp-linux-gnueabi" export CC="${HOST}-gcc" export CXX="${HOST}-g++" export AR="${HOST}-ar" export RANLIB="${HOST}-ranlib" export LD="${HOST}-ld" export CPP="${HOST}-gcc -E" export STRIP="${HOST}-strip" export OBJCOPY="${HOST}-objcopy" export OBJDUMP="${HOST}-objdump" export NM="${HOST}-nm" export AS="${HOST}-as" "${HOST}-gcc" --version echo "--> Waiting 5s to contiue" pushd "$PWD/node" sleep 5 echo "--> Clean" make clean echo "--> Configure" ./configure --prefix=/ --without-snapshot --dest-cpu=arm --dest-os=linux echo "--> Build" VERSION=${NODEJS_SOURCE_DIRECTORY##node-} export BINARYNAME=node-${VERSION}-linux-arm-armv6j-vfp-hard mkdir ${BINARYNAME} make install DESTDIR=${BINARYNAME} V=1 PORTABLE=1 echo "--> Pack" cp README.md ${BINARYNAME} cp LICENSE ${BINARYNAME} cp ChangeLog ${BINARYNAME} tar -czf ${BINARYNAME}.tar.gz ${BINARYNAME} echo "--> Cleanup" popd mv $PWD"/node/${BINARYNAME}.tar.gz" "./" echo "-> Done!" 

我设法交叉编译nodejs 0.10版并在飞思卡尔i.MX6上运行它。 我创build了一个交叉编译脚本来设置环境和执行make。 该脚本基本上只是将CC,CXX等variables设置为我的交叉编译工具,另外还为编译器设置了arch和其他标志。 然后它运行与dest-cpu = arm的configuration我试图也链接在V8库(我也交叉编译),但它不会编译,当我包括该标志加上在configurationpath。 当我编译节点时,是否编译自己的V8,因为我设法编译而不指向V8库(我可以看到编译过程中编译了一些V8的东西)?

现在只需要做一下:

 sudo apt-get install nodejs npm