2012-06-14 24 views
23

Estoy tratando de obtener node.js v0.7.9 para compilar para el raspberry pi, pero como el nodo y v8 son bastante grandes, espero poder para compilar de forma cruzada en otra PC más poderosa. Estoy usando la cadena de herramientas linux-x86 arm-bcm2708-linux-gnueabi de https://github.com/raspberrypi/tools y las he usado para construir exitosamente otros ejecutables para el sistema. Terminé configurando CC, CXX, CPP, STRIP, OBJCOPY, etc. variables a los equivalentes de cadena de herramientas en las variables de entorno y se ejecutó configure con: ./configure --dest-cpu=arm --without-snapshot para obtener el ejecutable final. Copiándolo sobre el sistema y ejecutarlo sin embargo produce el siguiente error:Node.js de compilación cruzada para ARM6 (Raspberry Pi)

Extension or internal compilation error at line 0. 
Segmentation fault 

Sin embargo, el fallo de segmentación no sucede por alguna de las tareas que no son de javascript como node --version y node --help. ¿Hay algún CFLAGS/CXXFLAGS que me pueda estar perdiendo causando este problema? Poco confundido ....

+1

Hay un tipo que intentó hacer una compilación cruzada de todo, pero terminó compilando v8 y compilando un nodo en el RPI. http://blog.greg-net.co.uk/post/21228054876/building-node-js-for-raspberry-pi Y aquí hay un enlace para compilar en el RPI en Arch .. http: //www.nodejs-news.com/nodejs-tech/nodejs-armv5-armv6-howto/ Podrías haberlos visto pero podría ser bueno para otra persona .. – kmpm

+0

No tenía ni idea de cuánto tardaría esto .. . Ha sido probablemente una hora de compilar todo lo necesario para node.js 0.10 en mi Raspberry Pi y aún está en ello>. < – Pluto

Respuesta

5

He estado trabajando en esto un poco desde que se formuló originalmente la pregunta, incluso agregué algunos parches para ayudar a detectar automáticamente la configuración del compilador cruzado. Node.js en los repositorios es (por el momento) una versión bastante antigua, y puede o no ser compatible con la arquitectura completa de hard-float (VFP).

Para un COMO completa y detallada, véase arriba escritura de Nathan Rajlich en http://n8.io/cross-compiling-nodejs-v0.8/

He publicado binarios para otras personas que no quieren pasar por todo esto sin problemas para el mismo hardware en https://gist.github.com/3245130

13

NodeJS está disponible pre-compilados por unos distribuciones de Linux: https://github.com/joyent/node/wiki/Installing-Node.js-via-package-manager

Desde NodeJS se encuentra todavía en fase de prueba para Debian, con el fin de instalar NodeJS en mi Raspberry Pi en Debian sibilante , Lo hago:

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 funciona muy bien y es estable en mi Raspberry Pi.

+1

si obtiene un error NO_PUBKEY, ya que intenté seguir las líneas para obtener y cargar la clave requerida. 'gpg --recv-keys AED4B06F473041FA --keyserver keys.gnupg.net' ' gpg -a --export AED4B06F473041FA | apt-key add -' buena suerte – edokan

+0

Intenté esto al principio, pero la versión de node.js disponible era 0.6, ¡que es como 2 años! Al menos nvm tenía una versión más nueva disponible ... Pero igual 0.7. – Pluto

+0

Obtengo 'node -v' ->" Error de segmentación ". ¿Cómo puedo solucionar esto (aparte de construir desde la fuente)? – Saran

5

Solo una nota: esto funcionó muy bien para mí pero no instaló NPM. Así que si quieres NPM (que con toda seguridad no lo pensaría) asegúrese de ejecutar

apt-get install NPM

después de instalar el nodo antes de retirar las ubicaciones de actualización de la lista de actualizaciones.

0

I se las arregló para compilar nodos de la versión 0.10 y ejecutarlos en Freescale i.MX6. Creé un script de compilación cruzada para configurar el entorno y la ejecución. El script simplemente establece las variables CC, CXX, etc. en mis herramientas de compilación cruzada, además de establecer el arco y algunas otras banderas para el compilador. Luego ejecuta la configuración con dest-cpu = brazo Intenté también vincular en la biblioteca V8 (que también compilé cruzado), pero no compilaría cuando incluí esa bandera más la ruta en configure. Cuando compilo el nodo, ¿compila su propio V8, ya que logro compilar sin apuntar a la biblioteca V8 (puedo ver que está compilando algunas cosas de V8 durante la compilación)?

0

Sólo una cabeza ahora se puede simplemente hacer:

sudo apt-get install nodejs npm 
+0

¿Esto instala la última versión de nodejs? Cuando ejecuto este nodo, se descarga 0.6. – Brannon

1

Aquí está el guión que escribí para cruzar automáticamente compilar NodeJS para ARMv6 (Raspbery Pi) utilizando Jenkins.

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

que he usado 'embalaje' de @ Adam M-W de fragmento de código

El script descargará automáticamente todo lo necesario y empezar a construir.

Sólo tenga en cuenta que la corriente (v0.10.30) versión no se compilará debido a este problema: https://github.com/joyent/node/issues/8062#issuecomment-52541037

Ejecutar con _PARAMS_NODEJS_SOURCE_ARCHIVE_URL=http://nodejs.org/dist/v0.10.29/node-v0.10.29.tar.gz para obtener la última versión de compilación cruzada poder.

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

Esto me ayudó a configurar en un proyecto incrustado que no ejecuta un administrador de paquetes. ¡Muchas gracias! – Banjocat

+0

De nada – George

Cuestiones relacionadas