Nodo de compilación cruzada.js para ARM6 (Raspberry Pi)


Estoy tratando de obtener nodo.js v0.7.9 para compilar para raspberry pi, pero como node y v8 son bastante grandes, espero poder compilar en otro PC más potente. Estoy usando la cadena de herramientas linux-x86 arm-bcm2708-linux-gnueabi de https://github.com/raspberrypi/tools y los han usado para construir con éxito otros ejecutables para el sistema. Terminé configurando el CC, CXX, CPP, STRIP, OBJCOPY, etc. variables a los equivalentes de la cadena de herramientas en las variables de entorno y ran configurar con: ./configure --dest-cpu=arm --without-snapshot para obtener el ejecutable final. Copiarlo en el sistema y ejecutarlo sin embargo produce el siguiente error:

Extension or internal compilation error at line 0.
Segmentation fault

Sin embargo, el error de segmentación no ocurre para ninguna de las tareas que no son javascript como node --version y node --help. ¿Hay algún CFLAGS / CXXFLAGS que pueda faltar causando este problema? Un poco confundido....

Author: Adam M-W, 2012-06-14

7 answers

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

Dado que NodeJS todavía está en fase de prueba para Debian, para instalar NodeJS en mi Raspberry Pi bajo Debian wheezy, 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 estable en mi Raspberry Pi.

 14
Author: Alexandre Alapetite,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-13 11:20:32

Solo una nota - esto funcionó muy bien para mí, pero no instaló NPM. Así que si quieres NPM (que seguramente lo haces yo creo) asegúrese de ejecutar

Apt-get install npm

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

 5
Author: Lee Wenger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-29 22:33:55

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

Para obtener un HOWTO completo y detallado, consulte el artículo de Nathan Rajlich en http://n8.io/cross-compiling-nodejs-v0.8 /

He publicado binarios para otros que no quieren pasar por toda esta molestia para el mismo hardware en https://gist.github.com/3245130

 5
Author: Adam M-W,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-26 11:55:43

Aquí está el script que escribí para compilar automáticamente NodeJS para ARMv6 (Raspbery Pi) usando Jenkins.

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

He utilizado el fragmento de 'embalaje' de @Adam M-W

El script descargará automáticamente todo lo necesario y comenzará a compilar.

Solo tenga en cuenta que la versión actual (v0.10.30) no se compilará debido a esto cuestión: https://github.com/joyent/node/issues/8062#issuecomment-52541037

Ejecute 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 compatible con compilación cruzada.

#!/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!"
 1
Author: George,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-18 21:20:07

Me las arreglé para compilar nodejs versión 0.10 y ejecutarlo en Freescale i.MX6. Creé un script de compilación cruzada para configurar el entorno y ejecutar make. El script básicamente solo establece el CC, CXX, etc. variables a mis herramientas de compilación cruzada más establece el arco y algunas otras banderas para el compilador. Luego ejecuta el configure con dest-cpu = arm Intenté también enlazar en la biblioteca V8 (que también crucé compilado), pero no compilaría cuando incluyo esa bandera más la ruta en configurar. Cuando compilo node, ¿compila su propia V8, ya que me las arreglo para compilar sin apuntar a la biblioteca V8 (puedo ver que está compilando algunas cosas de V8 durante la compilación)?

 0
Author: user2775253,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-13 13:32:53

Solo un heads up ahora puedes hacer:

sudo apt-get install nodejs npm
 0
Author: Mauvis Ledford,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-07 22:01:11

Para el nodo 0.12, http://conoroneill.net//download-compiled-version-of-nodejs-0120-stable-for-raspberry-pi-here tiene instrucciones + binarios predefinidos.

 0
Author: Nathan Friedly,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-19 17:36:54