node.js を iPhone アプリから動かす
結論から言うと、 jailbreak してないと動きません。詳細はこの辺:
Issue 1312 - v8 - It's time to get iOS supported! - V8 JavaScript Engine - Google Project Hosting
というわけでターゲットがデベロッパー用に絞られてしまいますがやってみましょう!
Node ダウンロード
今回はリリースされたばかりの 0.6.0 を使いました。
からダウンロードして展開しましょう
libuv にパッチを当てる
libev はなにもしないでもそのまま iOS で動きますが、 libuv はそうではないようです。
$ cd deps/uv
$ wget --no-check-certificate https://raw.github.com/gist/1354552/cfb4e9a544185bdbda1a8374aaf1cd5cc812c070/libuv-ios.patch
$ patch -p1 < libuv-ios.patch
なお、このパッチは本家に pull req 送っておきました。取り込まれると良いですね。
V8 にパッチを当てる
V8 自体は ARM に対応しているようですが、iOS SDK でクロスコンパイルしようとすると
ARM EABI support is required.
とか言われてしまいます。iPhone の ARM が EABI をサポートしてないためでしょうか。
ただ、最初にリンクした Goole Code の issue 内で iOS 対応のパッチを投稿している人がいて、そのパッチを当てることでビルド可能になる模様。
$ cd deps/v8/src
$ patch -p0 < ~/Downloads/v8-ios.patch
Node にパッチを当てる
プロセスリストにでるプロセス名を設定する機能が Carbon をつかっているので関数殺しちゃいます。iOS でプロセス名かえられても誰得ですよね。具体的には
process.title = "hoge";
が動かなくなります。
$ wget --no-check-certificate https://raw.github.com/gist/1354570/0c28584c07f0410c5e5608d4e2e9ea68e6d5dbc4/node-ios.patch
$ patch -p1 < node-ios.patch
ビルド
まずもろもろ環境変数をセットし:
export CC=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc
export CFLAGS="-arch armv7 -isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk -I$HOME/dev/iphone/lib/openssl/include"
export CXX=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/g++
export CXXFLAGS=$CFLAGS
export CPP=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/cpp
export AR=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/ar
export LINKFLAGS="-arch armv7 -isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk -L$HOME/dev/iphone/lib/openssl/lib"
ビルド:
./tools/waf-light configure build --product-type=cstaticlib --dest-cpu=arm --without-snapshot
ひっそり、前もってビルド済みの openssl を参照していますが、ない場合は --without-ssl
を追加すればいけるはずです。
成功すると
./out/Release/deps/uv/uv.a
./out/Release/libnode.a
./out/Release/libv8.a
./out/Release/libv8preparser.a
といった静的ライブラリが出来てると思うんで、これらをアプリに埋め込んであげればいいわけですね。
armv6, armv7, i386 用それぞれビルドし、lipo
でユニバーサルバイナリに仕上げるのが iOS 用静的ライブラリ作成のセオリーですが、ここではめんどいので省略します。
アプリ
だいぶ適当ですが、サンプル作ってみました。
lib ディレクトリにさっきビルドした .a ファイルを突っ込んであげる必要があります。 また node.h
の参照元を nave でインストールした node のパスを設定してあるので、違う環境の人は Header Search Path を環境に合わせて書き換える必要もあります。
こんな感じの画面が出るんで、適当にコード書いて Run おせば動かすことが出来ます。
注意
コードみてもらえばわかりますがだいぶ適当につくっておりまして、node の標準出力などをうけとっておりません。また、二回目実行しようとするとアプリが落ちますw
直していただける方お待ちしております!