Upload
shigekiohtsu
View
14.148
Download
7
Embed Size (px)
Citation preview
node-gyp を使ったネイティブモジュールの作成
IIJ 大津繁樹ohtsu あっと iij.ad.jp
2012 年 4 月 18 日東京 Node 学園 5 時限目
はじめに、• node-v0.7 から ビルドシステムが WAF から GYP に変
わりました。• ネイティブモジュールの作成方法も node-waf/wscript
を使ったものから node-gyp/binding.gyp を使ったものに変更になります。
• 今回は、そのへんの紹介と(時間があれば)実際の作成のデモを行います。
• Mac 持ってないので、 Linux/Win7 だけの検証です。
node-v0.8 話はこの後の koichik さんにお任せ
自己紹介• 大津 繁樹 (おおつ しげき)• twitter: @jovi0608, github: shigeki• IIJ アプリケーション開発部 戦略的開発室 • 流行ものの追っかけ Node.js/HTML5/Kinect
etc.• 最近は Node.js にどっぷり。typo 修正の 1 行 PR でも Node.js AUTHOR の仲間入りできます。皆さんも github で Nodeに参加しましょう。
そもそも、 (ry のインタビューより、)
BostInno: (振り返って) node で(今と)違ってたことをやっていればよかったと思うことは ?
Dahl: はい 、 いっぱいあります . 例えば CommonJS のモジュールシステムを使わなければよかった。ブラウザが動作するより複雑過ぎて、しかも大きく異なっているから。 WAF ビルドシステムも使わなければよかった。確かに動いているよ、でも必要以上に厄介な事が起きている。ある程度 WAF の下でいろんなごちゃごちゃを整理できるかもしれないが、それはとてつもない大事業になっちゃうだろう。
http://bostinno.com/2011/01/31/node-js-interview-4-questions-with-creator-ryan-dahl/
GYP に変えた理由 by ryan• Makefile/XCode/Visual Studio プロジェクトを生成するメタ
ビルドシステムである。 (話者注: Scons/Ninja も)
• 設定(ファイル・プリプロセッサ定義やフラグ等)が JSON である。 (話者注:一部仕様が違ってます。)
• Chrome のビルドシステムでも使われ、マルチプラットフォーム構築の実績がある。 (話者注:とういうかもともと Chrome のために作られたもの)
• ライブラリを出し入れ( plug) するのが簡単。必要なプリプロセッサ定義やライブラリリンクのフラグをファイルで gyp に外出ししてビルドができる。
http://groups.google.com/group/nodejs/msg/5ce433fe5059e34c?pli=1
Node は WAF を捨て、 GYP に
https://github.com/joyent/node/commit/14b04b06b4a7f31b3b489abba5e1467678f0f6be
GYP による Node.js ソースビルド
configure: config.gypi の生成→ tools/gyp_node の起動→ out/Release/Makefile の生成
で、 GYP って何?• Generate Your Projects の略• Google 謹製 Chrome のためのビルドシステム• python で書かれている。 (node/tools/gyp 以下 )• 設定ファイル ( .gyp や .gypi) を書き、 gyp を起動
すると実行 OS に合ったビルドファイル (Linux: Makefile/Mac:Xcode ?/Win: VisualStudio sln/vcxprj) を生成。
• なので一つのソースツリーでマルチプラットフォームのバイナリをビルドできる。
鍵は gyp ファイル{ ‘targets’: [ # 設定の中にコメントが書ける { ‘target_name’: ‘hello’, # いつもの key: value 形式 ‘conditions’: [ [ ‘OS==linux’, { ‘cflags’: [ ‘-Dhoge’ ] } ] # 条件文も OK ], ‘libraries’: ‘<@(core_library_files)‘, # 変数も OK ‘sources’: [ ‘hello.cc’ ] , # 最後がコンマも OK } ] }
ネイティブモジュール作成も GYP に• v0.6 では node-waf だけ残った。 (Windows ?)• v0.7 からは gyp ベースに変更。 (Windows 対応 )• アドオン用 gyp のコマンド・設定を用意– tools/gyp_addon (gyp の実行コマンド )– tools/addon.gypi (デフォルトの設定ファイル )– 設定ファイルとしてローカルの binding.gyp を参照
• gyp_addon のフロントエンドモジュール node-gyp が npm と同梱されてインストール
• 次の node-v0.7.8 からマニュアルも記載• 今後は、 npm のバイナリーインストールがサ
ポートされユーザ環境でのビルドをなくす方向に。
libev libeioc-ares
http-parser
zlibopenssl
V8NodeCore Modules
NodeUser Modules
libuv
Node.js アーキテクチャ概要( v0.6 ~ )
JavaScriptネイティブ (C/
C++)
ネイティブモジュールの例node-qt
( Linux/Win/Mac で動作する Node のデスクトップアプリ )
tools/gyp_addon による Hello World
unixjp:~/tmp/github/node/test/addons/hello-world> cat binding.gyp
{ 'targets': [ { 'target_name': 'binding', 'sources': [ 'binding.cc' ] } ]} binding.gyp が必要
tools/gyp_addon によるモジュール作成> cd test/addons/hello-world> lsbinding.cc binding.gyp test.js>../../../tools/gyp_addon> lsbinding.cc binding.gyp build test.js> cd build/> make CXX(target) Release/obj.target/binding/binding.o SOLINK_MODULE(target) Release/obj.target/binding.node SOLINK_MODULE(target) Release/obj.target/binding.node: Finished COPY Release/binding.node>cd ..> node ./test.jsbinding.hello() = world
Windows ではpython コマンドで
Windows では msbuild コマンドもしくは
vcxproj ファイルを開けよう。
node-gyphttps://github.com/TooTallNate/node-gyp
• tools/addon_gyp のフロントエンドCUI• node-0.6 系でも動作可能(あまり試したことない)• npm と一緒にインストール(なければ npm –g でイ
ンストール )
• Node のソースからモジュールビルドに必要なもの(ヘッダ ,lib, tools, common.gypi 等 ) を ~/.node-gyp 以下にインストール&保持
• gyp によるビルドファイルの生成からコンパイルまで行える。
普段はこっちを使おう。
node-gyp コマンド一覧Usage: node-gyp <command> [options]
コマンド 説明install ビルドに必要なソースをダウンロードlist ビルドに必要なソースをダウンロードremove インストールされているソースの削除configure ビルドファイルを生成build 実際にビルドを実行clean ビルドディレクトリの削除rebuild 再ビルド (clean+configure+build)
node-gyp によるモジュールの作り方(事前に binding.gyp の作成が必要)
> cd test/addons/hello-world> node-gyp configure(出力略)> node-gyp build(出力略)> node test.jsbinding.hello() = world
ちょと手の込んだビルド(その1)
{ # ちょっと手の込んだといっても普通の binding.gyp 例 "targets": [ { "target_name": "testaddon1", "sources": [ "testaddon1.cc" ], 'conditions': [# 続く
• OSの値を条件とした設定のスイッチ• 静的ライブラリとのリンク指定方法• OS毎に deps ディレクトリを用意してライブラ
リファイルを格納• ビルトイン( gyp デフォルト /node 固有)変数
の利用
ちょと手の込んだビルド(その2)['OS`==`linux`, { 'include_dirs': [ '<(module_root_dir)/deps/hogelib/linux', ], 'ldflags': [ '-L<(module_root_dir)/deps/hogelib/linux', ], 'libraries': [ '-lhoge', ], }],# 続く
ちょと手の込んだビルド(その3) ['OS==`win`, { 'include_dirs': [ '<(module_root_dir)/deps/hogelib/win32/hogelib', ], 'libraries': [ '<(module_root_dir)/deps/hogelib/win32/Release/hogelib.lib', ], }]
便利な変数・テクニックの紹介OS OS の種類( linux,win,mac 等 )include_dirs インクルードディレクトリlibraries ライブラリの指定cflags/ldflags コンパイル、リンクフラグnode_root_dir Node のソースのインストールディレクトリ (*
Node 固有 )module_root_dir モジュールのディレクトリ (* Node 固有 )
'libraries': [ '<!@(pkg-config --libs-only-l QtCore QtGui QtTest)' ]
pkg-config コマンドの出力を library に代入
役立つテクニック (gypd debug)-f gypd : デバッグ用出力の設定-DOS=win: Windows として OS を設定 (linux,mac も指定可 )
.gypd ファイルに処理された結果た gyp が保存されます。
$ ../../../tools/gyp_addon -f gypd -DOS=win$ ls -l合計 24-rw-rw-r-- 1 ohtsu ohtsu 280 2012-03-06 01:34 binding.cc-rw-rw-r-- 1 ohtsu ohtsu 101 2012-03-01 10:07 binding.gyp-rw-rw-r-- 1 ohtsu ohtsu 8565 2012-04-18 15:24 binding.gypd-rw-rw-r-- 1 ohtsu ohtsu 173 2012-03-15 09:53 test.js
時間があればデモ(お題)
静的ライブラリを使った Hello Wold ネイティブモジュールの作成
参考資料• node-0.7.8 以降の addon マニュアル– http://nodejs.org/dist/v0.7.8/docs/api/addons.html
• GYPドキュメント– http://code.google.com/p/gyp/w/list
• node-gyp README.md– https://github.com/TooTallNate/node-gyp/blob/
master/README.md• node-qt モジュールの binding.gyp– https://github.com/arturadib/node-qt/blob/master/
binding.gyp