Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

概要

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

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした