2012-06-14 18 views
23

Sto cercando di ottenere node.js v0.7.9 per compilare il raspberry pi, ma dato che node e v8 sono piuttosto grandi, spero di essere in grado per eseguire la cross-compilazione su un altro PC più potente. Sto usando la toolchain linux-x86 arm-bcm2708-linux-gnueabi da https://github.com/raspberrypi/tools e li ho usati per costruire con successo altri eseguibili per il sistema. Ho finito per impostare CC, CXX, CPP, STRIP, OBJCOPY, ecc. variabili per gli equivalenti della toolchain nelle variabili ambientali e correva configurato con: ./configure --dest-cpu=arm --without-snapshot per ottenere l'eseguibile finale. Copia di sopra al sistema e l'esecuzione è comunque produce il seguente errore:Node.js cross-compiling per ARM6 (Raspberry Pi)

Extension or internal compilation error at line 0. 
Segmentation fault 

Tuttavia, l'errore di segmentazione non accade per uno dei compiti non javascript come node --version e node --help. Esistono CFLAGS/CXXFLAGS che potrebbero mancare per causare questo problema? Po 'confuso ....

+1

c'è un ragazzo che ha cercato di fare un cross-compilazione di tutto, ma ha finito per crosscompilando v8 e la compilazione nodo sulla RPI. http://blog.greg-net.co.uk/post/21228054876/building-node-js-for-raspberry-pi E qui c'è un collegamento per la compilazione sull'RPI in Arch .. http: //www.nodejs-news.com/nodejs-tech/nodejs-armv5-armv6-howto/ Potresti averli visti ma potrebbe essere buono per qualcun altro .. – kmpm

+0

Non avevo idea di quanto tempo ci sarebbe voluto .. . e 'stato probabilmente un ora di compilazione di tutto il necessario per node.js 0,10 sul mio Raspberry Pi ed è ancora a farlo>. < – Pluto

risposta

5

Ho lavorato su questo un po 'da quando la domanda è stata inizialmente posta, anche aggiunto alcune patch per aiutare a rilevare automaticamente le impostazioni del cross-compiler. Node.js nei repository è (al momento) una versione piuttosto vecchia, e potrebbe o meno supportare l'architettura full hard-float (VFP).

Per una guida dettagliata completa, vedere di Nathan Rajlich scrittura fino a http://n8.io/cross-compiling-nodejs-v0.8/

ho postato i binari per gli altri che non vogliono passare attraverso tutto questo fastidio per lo stesso hardware in https://gist.github.com/3245130

13

NodeJS è disponibile pre-compilato per un paio di distribuzioni Linux: https://github.com/joyent/node/wiki/Installing-Node.js-via-package-manager

Dal NodeJS è ancora in fase di test per Debian, per installare sul mio NodeJS Raspberry Pi sotto Debian wheezy , lo faccio:

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 funziona molto bene e stabile sul mio Raspberry Pi.

+1

se si ottiene un errore di NO_PUBKEY come ho fatto provare a seguire le linee di ottenere e la chiave necessaria di carico. 'gpg --recv-keys AED4B06F473041FA --keyserver keys.gnupg.net' ' gpg -a --export AED4B06F473041FA | apt-key add -' buona fortuna – edokan

+0

Ho provato questo in un primo momento, ma la versione di node.js disponibile era 0.6, che è come 2 anni! Almeno nvm aveva una versione più recente disponibile ... Ma ancora 0.7. – Pluto

+0

Ricevo 'nodo -v' ->" Errore di segmentazione ". Come posso risolvere questo problema (a parte la costruzione dalla fonte)? – Saran

5

Solo una nota: questo ha funzionato benissimo ma non ha installato NPM. Quindi, se volete NPM (che quasi sicuramente non penserei) assicurarsi di eseguire

apt-get install NPM

dopo l'installazione del nodo prima di rimuovere le posizioni di aggiornamento dalla lista aggiornamento.

0

I riuscito ad attraversare la versione 0.10 di nodejs di compilazione ed eseguirlo su Freescale i.MX6. Ho creato uno script di compilazione incrociata per configurare l'ambiente e l'esecuzione make. Lo script in pratica imposta le variabili CC, CXX, ecc. Ai miei strumenti di compilazione incrociata, oltre a impostare l'arco e alcuni altri flag per il compilatore. Quindi esegue la configurazione con dest-cpu = arm Ho provato a collegare anche nella libreria V8 (che ho anche compilato in croce), ma non si compila quando ho incluso quel flag più il percorso in configure. Quando compilo nodo, compila il proprio V8, dato che riesco a compilare senza puntare alla libreria V8 (posso vedere che sta compilando alcune cose V8 durante la compilazione)?

0

Solo un heads up è ora possibile solo fare:

sudo apt-get install nodejs npm 
+0

Installa l'ultima versione di nodejs? Quando eseguo questo nodo, viene scaricato. – Brannon

1

Ecco lo script che ho scritto per attraversare automaticamente compilare NodeJS per ARMv6 (Raspbery Pi) con Jenkins.

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

ho usato 'imballaggio' di @ Adamo M-W snippet

Lo script scaricherà automaticamente tutto il necessario e iniziare a costruire.

Basta notare che la corrente (v0.10.30) versione non verrà compilato a causa di questo problema: https://github.com/joyent/node/issues/8062#issuecomment-52541037

Run with _PARAMS_NODEJS_SOURCE_ARCHIVE_URL=http://nodejs.org/dist/v0.10.29/node-v0.10.29.tar.gz per ottenere le ultime croce versione di compilazione in grado.

#!/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

Questo mi ha aiutato a eseguire l'installazione su un progetto incorporato che non esegue un gestore di pacchetti. Molte grazie! – Banjocat

+0

Prego – George