Кросс-компиляция Node.js для ARM6 (малина Pi)
Я пытаюсь получить node.js v0.7.9 для компиляции для малины pi, но поскольку node и v8 довольно большие, я надеюсь, что вы сможете перекрестно скомпилировать еще одну мощную ПК. Я использую toolchain 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, вызывающие эту проблему? Бит путают....
Ответы
Ответ 1
Я немного поработал над этим вопросом, так как вопрос изначально был задан, даже добавил некоторые исправления, чтобы помочь автоматически определять параметры кросс-компилятора. Node.js в репозиториях (на данный момент) довольно старая версия и может содержать или не поддерживать полную архитектуру с жестким поплавком (VFP).
Для полного подробного HOWTO см. Nathan Rajlich, напишите в http://n8.io/cross-compiling-nodejs-v0.8/
Я отправил двоичные файлы для других, которые не хотят проходить через все эти трудности для того же оборудования на https://gist.github.com/3245130
Ответ 2
NodeJS доступен, предварительно скомпилированный для нескольких дистрибутивов Linux:
https://github.com/joyent/node/wiki/Installing-Node.js-via-package-manager
Так как NodeJS все еще находится на стадии тестирования для Debian, для установки NodeJS на моем малине Pi под управлением Debian, я делаю:
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 работает очень хорошо и стабильно на моей малиновой пи.
Ответ 3
Просто примечание - это отлично поработало для меня, но не установило NPM. Поэтому, если вы хотите, чтобы NPM (что вы, несомненно, делаете, я думаю), обязательно запустите
apt-get install npm
после установки node перед удалением местоположений обновления из списка обновлений.
Ответ 4
Здесь script я написал для автоматической перекрестной компиляции NodeJS для ARMv6 (Raspbery Pi) с помощью Jenkins.
https://gist.github.com/hertzg/12c2d7fc40f68ff6deeb
Я использовал фрагмент упаковки @Adam M-W
script автоматически загрузит все необходимое и начнет строить.
Просто помните, что текущая версия (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!"
Ответ 5
Мне удалось перебрать compile nodejs версии 0.10 и запустить его на Freescale i.MX6.
Я создал кросс-компиляцию script для настройки среды и выполнения make.
script в основном просто устанавливает переменные CC, CXX и т.д. Для моих инструментов кросс-компиляции плюс он устанавливает арку и некоторые другие флаги для компилятора.
Затем он запускает configure с помощью dest-cpu = arm
Я попытался также связать в библиотеке V8 (которую я также перекрестно скомпилировал), но он не будет компилироваться, когда я включил этот флаг плюс путь в configure.
Когда я компилирую node, он компилирует собственный V8, так как мне удается скомпилировать, не указывая на библиотеку V8 (я вижу, что он компилирует некоторые вещи V8 во время компиляции)?
Ответ 6
Просто вы можете просто сделать хедз-ап:
sudo apt-get install nodejs npm
Ответ 7
Для node 0.12 http://conoroneill.net//download-compiled-version-of-nodejs-0120-stable-for-raspberry-pi-here содержит инструкции + предварительно созданные двоичные файлы.