読者です 読者をやめる 読者になる 読者になる

Write and Run

it's a simple way, but the only way.

Node.jsのビルドが遅い(主にV8)とお困りのせっかちな貴方へ送るビルド環境構築

こんにちは。遅くなりましたが、「JavaScript Advent Calendar 2011 (Node.js/WebSocketsコース)」10日目です。試験期間中で時間をとれてなくてですね(ry

「お前らー! Node してるかー!」
 『うぉあああああ!!』


「いつもソースからビルドしてるかー!!」
 『うぉあああああ!!』


「頻繁なリリースに従いてけてるかー!!」
 『うぉあああああ!!』


「でもビルド時間が長くねぇかぁああああ!!!」
 『なげぇえええええええ!!!!!』

Node.js のビルド、長いですよね。Mac ならパッケージ使いましょう。でも熱心な Noder はソースからビルドしたいんです。
というわけで、前置きが長くなりましたが、ながーいビルド時間を短縮する方法をご紹介しましょう。

元凶 - V8

ビルドが遅い原因は、なんといっても Google 謹製、C++ で書かれたちょうとってもビッグなライブラリ、V8 先輩でございます。つまり、この V8 のビルドをすっ飛ばせれば、タイムはぐっと縮まるわけですね。

方法 - ヒントは共有ライブラリ

実は、Node.js のビルドスクリプトには共有ライブラリの V8 を使う設定があります。これを使えば、毎回コンパイルする必要はなくなりますね!

では実際に共有ライブラリの V8 を使ってビルドしてみましょう。ちなみに環境は Mac なので、Linux だとちょっと違うと思いますが、UNIX 系に精通している方なら応用は利くと思います。

手順1 - V8 を共有ライブラリとしてビルド、インストール

まず、V8 を共有ライブラリとしてビルドする必要があります。V8 のソースは Node.js の tar ball に含まれているので、それをビルドしましょう。

$ curl -O http://nodejs.org/dist/v0.6.5/node-v0.6.5.tar.gz
$ tar zxvf node-v0.6.5.tar.gz
$ cd node-v0.6.5/deps/v8/
$ scons arch=x64 library=shared -j4

scons の引数はそれぞれ、

  1. arch=x64 : CPU のアーキテクチャx64
  2. library=shared : 共有ライブラリとしてビルド
  3. -j4 : 並列コンパイル数4

という意味です。ご自身の環境に合わせてください。

ビルドができたらそれらのライブラリをインストールしましょう。

$ pwd
~/node-v0.6.5/deps/v8/
$ sudo cp *.dylib /usr/local/lib/
$ sudo cp -r include/ /usr/local/include/v8/

こんな感じです。パスはお好みで変えて結構です。ただし、lib はパスが通ってるところにしないと不幸が訪れます。

手順2 - 共有ライブラリの V8 を使う設定で Node.js のビルドをする

V8 の準備ができたのでいよいよ Node.js のビルドです。しかし、通常とは違い、configure で幾つかオプションを指定します。

$ cd ../../
$ pwd
~/node-v0.6.5/
$ ./configure --shared-v8 --shared-v8-includes=/usr/local/include/v8/

shared-v8-includes では先程 include をコピーしたディレクトリを指定します。これで configure が通ればあとは難しくありません。いつもどおり、make && make install です。

$ pwd
~/node-v0.6.5/
$ make JOBS=4
$ sudo make install

これで完了です。どうです? ビルド時間は縮まりましたか?

ちなみに make の引数の JOBS=4 は並列コンパイル数を指定しています。普通は -j4 で並列できるっぽいんだけど、Mac だとバグがあってコケるらしいので、こんなオプション使ってます。

!!注意!!

Node.js はとっても進化の速いソフトウェアであり、また V8 も同様です。いつどこで仕様変更が起きて不整合に巻き込まれるかわかりません。なんかアレなことが起きたら、面倒臭がらずに新しい V8 を入れたり、静的ライブラリを使うように戻したりしましょう。

ではでは

楽しい Node 生活を!!