node-webkitでネイティブモジュールを使う

  • 33
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

概要

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と同じでいいみたい。

ビルド環境

https://github.com/TooTallNate/node-gyp#installation

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

エラーメッセージでググると、こんな記事があった。

https://github.com/rogerwang/node-webkit/wiki/Build-native-modules-with-nw-gyp

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

というわけで、これで動くようになった。
やったね。