Node.jsv0.7.9をRaspberryPi用にコンパイルしようとしていますが、nodeとv8は非常に大きいため、別のより強力なPCでクロスコンパイルできることを望んでいます。 https://github.com/raspberrypi/tools のlinux-x86 arm-bcm2708-linux-gnueabi
ツールチェーンを使用しており、それらを使用してシステムの他の実行可能ファイルを正常にビルドしました。 CC、CXX、CPP、STRIP、OBJCOPYなどを設定することになりました。変数を環境変数のツールチェーンに相当するものに変換し、configure with:./configure --dest-cpu=arm --without-snapshot
を実行して、最終的な実行可能ファイルを取得します。ただし、システムにコピーして実行すると、次のエラーが発生します。
Extension or internal compilation error at line 0.
Segmentation fault
ただし、node --version
やnode --help
などのJavaScript以外のタスクではセグメンテーション違反は発生しません。この問題の原因として欠落している可能性のあるCFLAGS/CXXFLAGSはありますか?少し混乱しています...
質問が最初に出されて以来、私はこれに少し取り組んできました。クロスコンパイラ設定を自動検出するのに役立つパッチをいくつか追加しました。リポジトリ内のNode.jsは(現時点では)かなり古いバージョンであり、完全なハードフロート(VFP)アーキテクチャをサポートしている場合とサポートしていない場合があります。
詳細なHOWTOについては、Nathan Rajlichの記事 http://n8.io/cross-compiling-nodejs-v0.8/ を参照してください。
同じハードウェアでこのような面倒な作業をすべてやりたくない他の人のために、バイナリを投稿しました https://Gist.github.com/32451
NodeJSは、いくつかのLinuxディストリビューション用にプリコンパイルされて利用できます: https://github.com/joyent/node/wiki/Installing-Node.js-via-package-manager
NodeJSはまだDebianのテスト段階にあるため、DebianwheezyでRaspberryPiにNodeJSをインストールするには、次のようにします。
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は、私のRaspberryPiで非常に正常に動作します。
注意点-これは私にとってはうまくいきましたが、NPMをインストールしませんでした。したがって、NPMが必要な場合(私が思うに最も確実にそうします)、必ず実行してください
apt-get install npm
ノードをインストールした後、更新リストから更新場所を削除する前。
これは、Jenkinsを使用してARMv6(Raspbery Pi)用のNodeJSを自動的にクロスコンパイルするために作成したスクリプトです。
https://Gist.github.com/hertzg/12c2d7fc40f68ff6deeb
@ AdamM-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!"
ただ注意してくださいあなたは今ただすることができます:
Sudo apt-get install nodejs npm
Nodejsバージョン0.10をクロスコンパイルし、Freescalei.MX6で実行することができました。環境をセットアップしてmakeを実行するためのクロスコンパイルスクリプトを作成しました。スクリプトは基本的に、CC、CXXなどの変数をクロスコンパイルツールに設定するだけでなく、Archやその他のコンパイラのフラグを設定します。次に、dest-cpu = armを使用してconfigureを実行します。V8ライブラリ(これもクロスコンパイルしました)にリンクしようとしましたが、そのフラグとパスをconfigureに含めた場合はコンパイルされませんでした。ノードをコンパイルすると、V8ライブラリをポイントせずにコンパイルできるため、ノード自体のV8をコンパイルしますか(コンパイル中にV8のものをコンパイルしていることがわかります)?
ノード0.12の場合、 http://conoroneill.net//download-compiled-version-of-nodejs-0120-stable-for-raspberry-pi-here には、命令とビルド済みのバイナリがあります。