FreeBSD に簡単に node.js 0.4.5 を入れられるセットを作ってみた。
(本当は、さくらインターネットのレンタルサーバーのスタンダードにインストールできるようにしようとしていたが、できていない。)
尚、この記事の内容と配布物は、 FreeBSD 以外の OS では、無意味なので注意。
ビルドの確認は PC-BSD 8.2 amd64 (自宅のマシン)と FreeBSD 8.1 i386 (さくらインターネットの VPS )で行った。
ただし、 node.js が本当に全く問題なく動作しているかは、確かめていない。
事前に gmake と python 2.x 系(2.4以降)がインストールされていなければならない。
PC-BSD の場合は、 Ports コンソール上で行うべきだろう。
node-v0.4.5_hunyoi.tar.bz2 をダウンロードして展開する。
> curl http://hunyoi.com/pub/node/node-v0.4.5_hunyoi.tar.bz2 | tar xjvf –
node-v0.4.5_hunyoi に移動してインストールスクリプトを起動する。
> cd node-v0.4.5_hunyoi
> ./install.sh
これで、 ${HOME}/local 以下にインストールされるので、
検索パス関係の環境変数を設定すると node が起動できる。
> setenv LD_LIBRARY_PATH ${HOME}/local/lib
> setenv PATH ${PATH}:${HOME}/local/node/0.4.5/bin
> rehash
> node –version
${HOME}/local じゃなくて別の所にしたい場合は、 TOP 環境変数を設定して ./install.sh を起動する。
node に含まれている v8 をそのまま使う場合(v8 を置き換えない場合) USE_DEFAULT_V8=yes などと環境変数を設定して ./install.sh を起動する。
このディストリビューションは、以下のような事をしている。
・libexecinfo-1.1 にパッチを当ててコンパイルしている。
/etc/src.conf が読み込めない場合は、 SRCCONF 環境変数に /dev/null を指定して
/etc/src.conf を参照しないようにしている(src.conf の manpage を参照)。
Ports のパッチではなく、自分で作ったパッチ(C99用)を当てているが、
このパッチは Ports にパッチがあるのを知らずに作った物。
確か execinfo.c は、修正しないとコンパイルできなかった。
・mod_*.py で v8 のビルド時のライブラリの検索先パスを追加している。
node-v0.4.5/wscript, node-v0.4.5/deps/v8/SConstruct に対して、
TOP 環境変数が設定されていれば、 ${TOP}/lib, ${TOP}/include、
そうじゃなければ、 ${HOME}/local/lib, ${HOME}/local/include を参照するように
コードを挿入している。
node-v0.4.5/deps/v8/tools/gyp/v8.gyp は、コードが書き込めないので、
展開したディレクトリを挿入している。
これは、 libexecinfo をユーザーディレクトリ内にインストールしているが、
node.js や v8 のビルドのスクリプト内では、 libexecinfo を探すのに
/usr/local/lib しか見ていないため。
・mod_wscript.py で v8 のビルドのオプションに ‘importenv=”LD_LIBRARY_PATH”‘ を追加している。
v8 のビルド中、 mksnapshot をビルドし、実行して snapshot.cc を作成するが、
mksnapshot が libexecinfo を使うために LD_LIBRARY_PATH が参照できる必要がある。
しかし、 v8 のビルドの際に importenv で指定しないと外部で設定した LD_LIBRARY_PATH が
無視されてしまう為。
・node-v0.4.5 に含まれている v8 (バージョン 3.1.8.8) では、下記のエラーでビルドができないため、
v8 をより新しいバージョン(3.2.9)に置き換えている。
obj/release/mksnapshot obj/release/snapshot.cc –logfile “/usr/home/xxxxx/node_work/node-v0.4.5_hunyoi/node-v0.4.5/build/default/obj/release/snapshot.log” –log-snapshot-positions
#
# Fatal error in CALL_AND_RETRY_0
# Allocation failed – process out of memory
#
Abort
scons: *** [obj/release/snapshot.cc] Error 134
scons: building terminated because of errors.
Waf: Leaving directory `/usr/home/xxxxx/node_work/node-v0.4.5_hunyoi/node-v0.4.5/build’
Build failed: -> task failed (err #2):
{task: libv8.a SConstruct -> libv8.a}
gmake: *** [program] エラー 1
これらは、さくらサーバにnode.jsをインストールしたい(未完了) の問題を途中までは解決していると思う。
しかし、この node.js インストールセットでさくらインターネットのレンタルサーバーのスタンダードにインストールしようとすると、下記のエラーでビルドが失敗する。
g++ -o obj/release/api.o -c -Wall -Werror -W -Wno-unused-parameter -Wnon-virtual-dtor -m32 -O3 -fomit-frame-pointer -fdata-sections -ffunction-sections -ansi -fno-rtti -fno-exceptions -Wall -Werror -W -Wno-unused-parameter -Wnon-virtual-dtor -m32 -O3 -fomit-frame-pointer -fdata-sections -ffunction-sections -ansi -DV8_TARGET_ARCH_IA32 -DV8_FAST_TLS -DENABLE_DEBUGGER_SUPPORT -DENABLE_VMSTATE_TRACKING -DENABLE_LOGGING_AND_PROFILING -I/home/xxxxx/local/include -I/usr/local/include -I/home/xxxxx/node-v0.4.5_hunyoi/node-v0.4.5/deps/v8/src /home/xxxxx/node-v0.4.5_hunyoi/node-v0.4.5/deps/v8/src/api.cc
g++: Internal error: Killed: 9 (program cc1plus)
Please submit a full bug report.
See
scons: *** [obj/release/api.o] Error 1
scons: building terminated because of errors.
Waf: Leaving directory `/home/xxxxx/node-v0.4.5_hunyoi/node-v0.4.5/build’
Build failed: -> task failed (err #2):
{task: libv8.a SConstruct -> libv8.a}
gmake: *** [program] Error 1
これは、 FreeBSD 7.1 だからなのか、それとも高負荷の為にコンパイラのプロセスが kill されてしまうのか…
後日、別のマシンに FreeBSD 7.1 を入れて、コンパイルしてみようと思う。
しかし、ここまでのようなやり方は、果たして正しいのだろうか…?
ピンバック: FreeBSD 用の nave もどきを作ってみた | ふにょいサイト
「さくらの共有サーバーに Node.js のバイナリを置いて動かしてみた」で試してみたところ、別のPCにインストールした FreeBSD 7.1 i386 上でコンパイルできました。
また、生成されたバイナリをさくらの共有サーバー(スタンダード)においた所、簡単な hello, world プログラムが一応動きました。
gmake 部分を nice -n 20 gmake に書き換えることで、一発インストール完了しました。
さくらのビジネスプランです。ご報告まで。