2012-06-14 79 views
23

我试图让node.js v0.7.9为树莓派编译,但由于node和v8相当大,我希望能够在另一个更强大的PC上进行交叉编译。我正在使用来自https://github.com/raspberrypi/tools的linux-x86 arm-bcm2708-linux-gnueabi工具链,并使用它们成功构建了系统的其他可执行文件。我最终设置了CC,CXX,CPP,STRIP,OBJCOPY等。变量添加到环境变量中的工具链等价物中,并运行配置:./configure --dest-cpu=arm --without-snapshot以获取最终的可执行文件。它复制到系统并运行。然而它产生以下错误:针对ARM6(Raspberry Pi)的交叉编译Node.js

Extension or internal compilation error at line 0. 
Segmentation fault 

然而,分段错误不会发生任何的像node --versionnode --help非JavaScript的任务。是否有任何CFLAGS/CXXFLAGS我可能会丢失导致此问题?有点迷茫....

+1

有一个人试图对所有东西进行交叉编译,但最终在RPI上交叉编译v8和编译节点。 http://blog.greg-net.co.uk/post/21228054876/building-node-js-for-raspberry-pi 这里是一个链接,用于编译Arch中的RPI .. http: //www.nodejs-news.com/nodejs-tech/nodejs-armv5-armv6-howto/ 你可能已经见过他们,但可能是个好别人.. – kmpm

+0

我不知道这需要多久.. 。在我的Raspberry Pi上编译node.js 0.10所需的所有内容大概需要一个小时,如果你得到NO_PUBKEY错误,我还是试着按照下面的代码获取和加载所需的密钥,它仍然是它的< – Pluto

回答

5

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

对于一个完整详细的HOWTO,请参阅http://n8.io/cross-compiling-nodejs-v0.8/

弥敦道Rajlich的写了,我已经发布了别人的二进制谁不想在https://gist.github.com/3245130

13

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

由于是的NodeJS仍处于测试阶段为Debian,以Debian的喘息下,在我的树莓派安装的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上工作得非常好而且稳定。

+1

。 'GPG --recv密钥AED4B06F473041FA --keyserver keys.gnupg.net' 'GPG -a --export AED4B06F473041FA |易键添加 - ' 好运 – edokan

+0

我想这在第一,但可用的node.js的版本是0.6,它是如2岁!至少nvm有一个更新的版本可用...但仍然0.7。 – Pluto

+0

我得到'node -v' - >“分段错误”。我怎样才能解决这个问题(除了从源头建设)? – Saran

5

只是一个说明 - 这对我很好,但没有安装NPM。所以,如果你想NPM(你最稳妥我想)确保运行

的apt-get安装NPM

安装节点删除从更新列表中选择更新前的位置后。

0

我经历这一切麻烦了相同的硬件设法交叉编译nodejs 0.10版并在飞思卡尔i.MX6上运行它。 我创建了一个交叉编译脚本来设置环境和执行make。 该脚本基本上只是将CC,CXX等变量设置为我的交叉编译工具,另外还为编译器设置了arch和其他标志。 然后它运行配置与dest-cpu = arm 我试图也链接在V8库(我也交叉编译),但它不会编译,当我包含该标志加上在配置路径。 当我编译节点时,是否编译它自己的V8,因为我设法编译时没有指向V8库(我可以看到它在编译期间编译了一些V8的东西)?

0

刚抬起头,你现在只是做:

sudo apt-get install nodejs npm 
+0

这是否安装最新版本的nodejs?当我运行这个节点时,0.6被下载。 – Brannon

1

这是我写的脚本来自动交叉编译使用ARMv6的詹金斯(Raspbery PI)的NodeJS。

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

我用@Adam M-W公司的 '包装' 片断

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

只需注意电流(v0.10.30)版本不会编译由于这个问题: 与_PARAMS_NODEJS_SOURCE_ARCHIVE_URL=http://nodejs.org/dist/v0.10.29/node-v0.10.29.tar.gzhttps://github.com/joyent/node/issues/8062#issuecomment-52541037

运行以获取最新的交叉编译,能够版本。

#!/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!" 
+0

这帮助我设置了一个不运行包管理器的嵌入式项目。非常感谢! – Banjocat

+0

不客气 – George