#概要
node-webkit使ってシリアルポート経由で、arduinoが送ってくるカラーセンサーの値を読もうとしたらserialportモジュール入れるのに苦労した。ので、対処したときの記録。もしかすると必要ないものとか、手順もあるかもしれない。
もっと簡単な方法とかあったらぜひ知りたい。
#なにが困るのか
node.jsのモジュールにはfsとかみたいな組み込みのモジュール、Javascriptで書かれたモジュール、c++なんかで書かれたネイティブモジュールがある。
で、ネイティブモジュールをnode-webkitで使うと、エラーが出て動かない(そのまま動くときがあるのかは知らん)。それはABI(application binary interface)がnode.jsで動くときとnode-webkitで動くときで違うらしいんだけど、詳しいことは良くわからない。
#ではどうするのか
npmでインストールしたあと自分でリビルドする。
node.js向けだとnode-gypってのを使ってビルドするんだけど、node-webkitではnw-gypっていうnode-gypのフォークを使う。で、そのためにはビルド環境を先に準備しておく必要がある。環境についてはnode-gypと同じでいいみたい。
#ビルド環境
Unixの場合、python2.7とmakeとGCC(とか)で、windowsの場合、python2.7とVC++(Express可)をあらかじめ入れておく必要がある。今回はwindowsでpython2.7、VC++2010 Expressを使った。
#手順
上記をインストールしたら、nw-gypをグローバルに入れる。
npm install nw-gyp -g
次にプロジェクトのnode_modules内の各モジュールのディレクトリに移動する。
たとえばserialportを利用するなら、プロジェクトのホーム以下のnode_modules/serialportに移動する。そこでnw-gypコマンドを実行する。で、そのときnode-webkitのターゲットバージョンを指定する。
nw-gyp rebuild --target=0.9.2
で、これでちゃんとイケるんじゃないかと思うけど、serialportの場合上手く行かなかった。以下の様な感じのエラーが出る。
gyp: Undefined variable module_name in binding.gyp
gyp ERR! configure error
エラーメッセージでググると、こんな記事があった。
node-pre-gypってパッケージを使え、ということらしい。
なんとなくで読むと、node-gypを簡単に使えるようにするパッケージか何かではないかと思うので、binding.gypを書いて適切に設定できれば必要ないのかもしれない。でもよく分からんので、入れて使う。
npm install node-pre-gyp -g
node-pre-gyp rebuild --runtime=node-webkit --target=0.9.2
runtimeをnode-webkitにしてあるので問題なくイケる。
で、32bitだとこれで大丈夫なんだけど、64bitのwindowsを入れてるマシンで試した時はちゃんと32bit向けのビルドだってことを明示しないとエラーで落ちた。
node-pre-gyp rebuild --runtime=node-webkit --target=0.9.2 --target_arch=ia32
というわけで、これで動くようになった。
やったね。