Кросс-компиляция Node.js для ARM6 (Raspberry Pi)

Я пытаюсь скомпилировать node.js v0.7.9 для Raspberry Pi, но, поскольку node и v8 довольно большие, я надеюсь, что смогу выполнить кросс-компиляцию на другом, более мощном ПК. Я использую набор инструментов linux-x86 arm-bcm2708-linux-gnueabi из https://github.com/raspberrypi/tools и использовали их для успешной сборки других исполняемых файлов для системы. В итоге я установил CC, CXX, CPP, STRIP, OBJCOPY и т. д. переменные в эквиваленты инструментальной цепочки в переменных среды и запустил configure с помощью: ./configure --dest-cpu=arm --without-snapshot, чтобы получить окончательный исполняемый файл. Однако копирование его в систему и запуск приводит к следующей ошибке:

Extension or internal compilation error at line 0.
Segmentation fault

Однако ошибка сегментации не возникает ни для одной из задач, не связанных с javascript, таких как node --version и node --help. Есть ли какие-либо CFLAGS/CXXFLAGS, которые я мог бы пропустить, вызывая эту проблему? Немного запутался....


person Adam M-W    schedule 14.06.2012    source источник
comment
Есть парень, который пытался сделать кросс-компиляцию всего, но в итоге кросскомпилировал v8 и скомпилировал узел на RPI. blog.greg-net.co. uk/post/21228054876/ А вот ссылка для компиляции на RPI в Arch.. nodejs-news.com/nodejs-tech/nodejs-armv5-armv6-howto Возможно, вы видели их, но они могут быть полезны для кого-то еще.   -  person kmpm    schedule 20.06.2012
comment
Я понятия не имел, сколько времени это займет... Вероятно, ушел час на компиляцию всего необходимого для node.js 0.10 на моем Raspberry Pi, и он все еще работает ›.‹   -  person Pluto    schedule 21.05.2014


Ответы (7)


NodeJS доступен в предварительно скомпилированном виде для нескольких дистрибутивов Linux: https://github.com/joyent/node/wiki/Installing-Node.js-via-package-manager

Поскольку NodeJS все еще находится на стадии тестирования для Debian, чтобы установить NodeJS на мой Raspberry Pi под Debian wheezy, я делаю:

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.

person Alexandre Alapetite    schedule 21.06.2012
comment
если вы получите ошибку NO_PUBKEY, поскольку я пытался выполнить следующие строки, чтобы получить и загрузить требуемый ключ. gpg --recv-keys AED4B06F473041FA --keyserver keys.gnupg.net gpg -a --export AED4B06F473041FA | apt-key add - удачи - person Erdogan Kurtur; 03.08.2012
comment
Сначала я попробовал это, но доступная версия node.js была 0.6, то есть 2 года назад! По крайней мере, у nvm была доступна более новая версия... Но все же 0.7. - person Pluto; 21.05.2014
comment
Я получаю node -v --› Ошибка сегментации. Как я могу это исправить (кроме сборки из исходников)? - person Saran; 31.10.2014
comment
У меня это не сработало, libc6 выдал ошибку при установке... и удалении. В итоге я просто стер свою SD-карту и переустановил Raspbian, потому что не мог понять, как ее очистить. - person Nathan Friedly; 19.02.2015

Просто примечание - это отлично сработало для меня, но не установило NPM. Поэтому, если вы хотите NPM (что вы, скорее всего, и делаете, я думаю), обязательно запустите

apt-получить установку npm

после установки узла, прежде чем удалять местоположения обновлений из списка обновлений.

person Lee Wenger    schedule 29.06.2012

Я немного работал над этим с тех пор, как вопрос был изначально задан, даже добавил несколько исправлений, чтобы помочь автоматически определять настройки кросс-компилятора. Node.js в репозиториях (на данный момент) является довольно старой версией и может поддерживать или не поддерживать архитектуру полного жесткого плавания (VFP).

Полный подробный HOWTO см. в статье Натана Райлиха по адресу http://n8.io/cross-compiling-nodejs-v0.8/

Я разместил двоичные файлы для тех, кто не хочет проходить через все эти хлопоты для того же оборудования, на https://gist.github.com/3245130

person Adam M-W    schedule 13.10.2012

Вот скрипт, который я написал для автоматической кросс-компиляции NodeJS для ARMv6 (Raspbery Pi) с использованием Jenkins.

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

Я использовал фрагмент упаковки @Adam M-W.

Скрипт автоматически загрузит все необходимое и начнет сборку.

Просто обратите внимание, что текущая (v0.10.30) версия не будет скомпилирована из-за этой проблемы: https://github.com/joyent/node/issues/8062#issuecomment-52541037

Запустите с _PARAMS_NODEJS_SOURCE_ARCHIVE_URL=http://nodejs.org/dist/v0.10.29/node-v0.10.29.tar.gz, чтобы получить последнюю версию с возможностью кросс-компиляции.

#!/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!"
person George    schedule 18.08.2014
comment
Это помогло мне настроить встроенный проект, в котором не работает менеджер пакетов. Большое спасибо! - person Banjocat; 21.11.2014

Мне удалось перекрестно скомпилировать nodejs версии 0.10 и запустить его на Freescale i.MX6. Я создал скрипт кросс-компиляции для настройки среды и выполнения make. Сценарий в основном просто устанавливает переменные CC, CXX и т. д. для моих инструментов кросс-компиляции, а также устанавливает арку и некоторые другие флаги для компилятора. Затем он запускает конфигурацию с dest-cpu=arm, которую я также пытался связать с библиотекой V8 (которую я также перекрестно скомпилировал), но она не скомпилировалась, когда я включил этот флаг и путь в конфигурации. Когда я компилирую узел, компилирует ли он свой собственный V8, так как мне удается компилировать, не указывая на библиотеку V8 (я вижу, что он компилирует некоторые вещи V8 во время компиляции)?

person user2775253    schedule 13.09.2013

Просто голова вверх, теперь вы можете просто сделать:

sudo apt-get install nodejs npm
person Mauvis Ledford    schedule 07.01.2014
comment
Это устанавливает последнюю версию nodejs? Когда я запускаю этот узел, загружается 0.6. - person Brannon; 18.12.2014

Для узла 0.12 http://conoroneill.net//download-compiled-version-of-nodejs-0120-stable-for-raspberry-pi-here содержит инструкции + готовые двоичные файлы.

person Nathan Friedly    schedule 19.02.2015