2012-06-14 88 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