2012-06-14 12 views
23

Ich versuche, node.js v0.7.9 kompilieren für die Raspberry Pi, aber wie Knoten und V8 sind ziemlich groß, ich hoffe, in der Lage sein auf einem anderen leistungsfähigeren PC zu kompilieren. Ich benutze die Toolchain linux-x86 arm-bcm2708-linux-gnueabi von https://github.com/raspberrypi/tools und habe sie verwendet, um andere ausführbare Dateien für das System erfolgreich zu erstellen. Ich habe am Ende die CC, CXX, CPP, STRIP, OBJCOPY, etc. Variablen zu den Toolchain-Äquivalenten in den Umgebungsvariablen und ran konfigurieren mit: ./configure --dest-cpu=arm --without-snapshot, um die endgültige ausführbare Datei zu erhalten. Kopieren Sie über auf das System und es läuft jedoch erzeugt den folgenden Fehler:Cross-kompilieren Node.js für ARM6 (Raspberry Pi)

Extension or internal compilation error at line 0. 
Segmentation fault 

jedoch passieren die Segmentierungsfehler nicht für eine der nicht-javascript Aufgaben wie node --version und node --help. Gibt es irgendwelche CFLAGS/CXXFLAGS, die ich vermisse, die dieses Problem verursachen? Bit verwirrt ....

+1

Es gibt einen Typ, der versucht hat, eine Kreuzkompilierung von allem zu machen, aber am Ende crosscompiling v8 und Kompilieren von Knoten auf dem RPI. http://blog.greg-net.co.uk/post/21228054876/building-node-js-for-raspberry-pi Und hier ist ein Link auf der RPI in Arch für die Erstellung .. http: //www.nodejs-news.com/nodejs-tech/nodejs-armv5-armv6-howto/ Sie könnten sie gesehen haben, könnte aber gut für jemand anderen sein .. – kmpm

+0

Ich hatte keine Ahnung, wie lange das dauern würde .. Es war wahrscheinlich eine Stunde, alles Notwendige für node.js 0.10 auf meinem Raspberry Pi zu kompilieren, und es ist immer noch>. < – Pluto

Antwort

5

Ich habe ein bisschen daran gearbeitet, seit die Frage ursprünglich gestellt wurde, sogar einige Patches hinzugefügt, um Cross-Compiler-Einstellungen automatisch zu erkennen. Node.js in den Repositories ist (im Moment) eine ziemlich alte Version und unterstützt möglicherweise nicht die vollständige Hard-Float (VFP) -Architektur.

Für eine detaillierte und vollständige HOWTO finden Nathan Rajlich des aufzuschreiben bei http://n8.io/cross-compiling-nodejs-v0.8/

ich Binärdateien für andere geschrieben haben, die nicht wollen bei https://gist.github.com/3245130

13

NodeJS ist verfügbar vorkompilierte für einige Linux-Distributionen: https://github.com/joyent/node/wiki/Installing-Node.js-via-package-manager

Seit NodeJS ist noch in der Testphase für Debian, um NodeJS auf meine Raspberry Pi unter Debian sid zu installieren , Mache ich:

NodeJS funktioniert sehr gut und stabil auf meinem Raspberry Pi.

+1

, wenn Sie einen NO_PUBKEY-Fehler bekommen, wie ich folgende Zeilen versuchte, benötigten Schlüssel zu bekommen und zu laden. 'gpg --recv-keys AED4B06F473041FA --keyserver keys.gnupg.net' ' gpg -a --export AED4B06F473041FA | apt-key add-' viel Glück – edokan

+0

Ich habe dies zuerst versucht, aber die Version von node.js verfügbar war 0,6, das ist wie 2 Jahre alt! Zumindest hatte nvm eine neuere Version zur Verfügung ... Aber immer noch 0,7. – Pluto

+0

Ich bekomme 'node -v' ->" Segmentation fault ". Wie kann ich das beheben (abgesehen von der Quelle)? – Saran

5

Nur eine Anmerkung - das funktionierte gut für mich, aber NPM nicht installiert. Also, wenn Sie wollen NPM (die Sie ganz sicher tun würde, glaube ich) stellen Sie sicher,

apt-get install npm

nach der Installation von Knoten ausführen, bevor Sie die Update-Standorte von der Update-Liste entfernen.

0

ich durch all diese Mühe für die gleiche Hardware gehen hat es geschafft, nodejs Version 0.10 kompilieren zu lassen und es auf Freescale i.MX6 laufen zu lassen. Ich habe ein Cross-Kompilier-Skript erstellt, um die Umgebung und das Execute-Make einzurichten. Das Skript setzt im Grunde nur die Variablen CC, CXX usw. zu meinen Kreuzkompilierwerkzeugen und es setzt den Bogen und einige andere Flags für den Compiler. Dann läuft die configure mit dest-cpu = arm Ich habe versucht, auch in der V8-Bibliothek (die ich auch kompiliert) zu verknüpfen, aber es würde nicht kompilieren, wenn ich dieses Flag und den Pfad in konfigurieren. Wenn ich Knoten kompiliere, kompiliert es sein eigenes V8, da ich kompiliere, ohne auf die V8-Bibliothek zu zeigen (ich kann sehen, dass es einige V8-Sachen während der Kompilierung kompiliert)?

0

Nur ein Heads-up können Sie jetzt einfach:

sudo apt-get install nodejs npm 
+0

Installiert dies die neueste Version von nodejs? Wenn ich diesen Knoten starte, wird 0.6 heruntergeladen. – Brannon

1

Hier ist das Skript, das ich automatisch geschrieben kompilieren überqueren NodeJS für ARMv6 (Raspbery Pi) mit Jenkins.

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

Ich habe @ Adam M-Ws ‚Verpackung‘ Snippet wird automatisch heruntergeladen alles

Das Skript erforderlich verwendet und Gebäude beginnen.

beachten Sie, dass nur aktuelle (v0.10.30) Version wird nicht aufgrund dieses Problems kompilieren: https://github.com/joyent/node/issues/8062#issuecomment-52541037

Run mit _PARAMS_NODEJS_SOURCE_ARCHIVE_URL=http://nodejs.org/dist/v0.10.29/node-v0.10.29.tar.gz die neueste Kreuz kompilieren-able Version zu bekommen.

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

Dies half mir bei der Einrichtung eines eingebetteten Projekts, das keinen Paketmanager ausführt. Danke vielmals! – Banjocat

+0

Gern geschehen – George