More Related Content
Similar to node-gypを使ったネイティブモジュールの作成 (20)
More from shigeki_ohtsu (7)
node-gypを使ったネイティブモジュールの作成
- 2. はじめに、
• node-v0.7から ビルドシステムが WAF から GYP
に変わりました。
• ネイティブモジュールの作成方法も node-
waf/wscript を使ったものから node-
gyp/binding.gyp を使ったものに変更になります。
• 今回は、そのへんの紹介と(時間があれば)実
際の作成のデモを行います。
• Mac持ってないので、Linux/Win7だけの検証で
す。
node-v0.8 話はこの後の koichik さんに
お任せ
- 3. 自己紹介
• 大津 繁樹 (おおつ しげき)
• twitter: @jovi0608, github: shigeki
• IIJ アプリケーション開発部 戦略的開発室
• 流行ものの追っかけ Node.js/HTML5/Kinect
etc.
• 最近は Node.js にどっぷり。
typo修正の1行PRでも Node.js AUTHOR の仲間
入りできます。皆さんもgithubでNodeに参加
しましょう。
- 4. そもそも、
(ryのインタビューより、)
BostInno: (振り返って)nodeで(今と)違ってたこ
とをやっていればよかったと思うことは?
Dahl: はい 、 いっぱいあります. 例えば CommonJS の
モジュールシステムを使わなければよかった。ブラ
ウザが動作するより複雑過ぎて、しかも大きく異
なっているから。
WAF ビルドシステムも使わなければよかった。確か
に動いているよ、でも必要以上に厄介な事が起きて
いる。ある程度 WAFの下でいろんなごちゃごちゃを
整理できるかもしれないが、それはとてつもない大
事業になっちゃうだろう。
http://bostinno.com/2011/01/31/node-js-interview-4-questions-with-creator-ryan-dahl/
- 5. GYPに変えた理由 by ryan
• Makefile/XCode/Visual Studioプロジェクトを生成す
るメタビルドシステムである。(話者注:Scons/Ninjaも)
• 設定(ファイル・プリプロセッサ定義やフラグ
等)が JSON である。(話者注:一部仕様が違ってます。)
• Chrome のビルドシステムでも使われ、マルチプ
ラットフォーム構築の実績がある。(話者注:とういう
かもともとChromeのために作られたもの)
• ライブラリを出し入れ(plug)するのが簡単。必要
なプリプロセッサ定義やライブラリリンクのフラ
グをファイルで gyp に外出ししてビルドができる。
http://groups.google.com/group/nodejs/msg/5ce433fe5
059e34c?pli=1
- 8. で、GYPって何?
• Generate Your Projects の略
• Google 謹製 Chromeのためのビルドシステム
• python で書かれている。 (node/tools/gyp 以
下)
• 設定ファイル( .gypや.gypi)を書き、gyp を起動
すると実行OSに合ったビルドファイル(Linux:
Makefile/Mac:Xcode ?/Win: VisualStudio
sln/vcxprj) を生成。
• なので一つのソースツリーでマルチプラット
フォームのバイナリをビルドできる。
- 9. 鍵は gyp ファイル
{
‘targets’: [
# 設定の中にコメントが書ける
{
‘target_name’: ‘hello’, # いつもの key: value 形式
‘conditions’: [
[ ‘OS==linux’, { ‘cflags’: * ‘-Dhoge’ ] } ] #条件文もOK
],
‘libraries’: ‘<@(core_library_files)‘, #変数もOK
‘sources’: * ‘hello.cc’ + , # 最後がコンマもOK
}
]
}
- 10. ネイティブモジュール作成も 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 のバイナリーインストールがサ
ポートされユーザ環境でのビルドをなくす方
向に。
- 11. Node.js アーキテクチャ概要(v0.6~)
Node ネイティブ
zlib JavaScript (C/C++)
User Modules
openssl Node
http-parser Core Modules V8
libuv
c-ares libev libeio
- 13. 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 が必要
- 14. tools/gyp_addonによるモジュール作成
> cd test/addons/hello-world
> ls Windowsでは
binding.cc binding.gyp test.js python コマンドで
>../../../tools/gyp_addon
> ls Windowsでは msbuild
binding.cc binding.gyp build test.js コマンドもしくは
> cd build/ vcxprojファイルを開け
> 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.js
binding.hello() = world
- 15. node-gyp
https://github.com/TooTallNate/node-gyp
• tools/addon_gyp のフロントエンドCUI
• node-0.6系でも動作可能(あまり試したことな
い)
• npm と一緒にインストール(なければ npm –g で
インストール)
• Nodeのソースからモジュールビルドに必要な
もの(ヘッダ,lib, tools, common.gypi 等)を ~/.node-
gyp 以下にインストール&保持
• gyp によるビルドファイルの生成からコンパ
イルまで行える。
普段はこっちを使おう。
- 16. node-gyp コマンド一覧
Usage: node-gyp <command> [options]
コマンド 説明
install ビルドに必要なソースをダウンロード
list ビルドに必要なソースをダウンロード
remove インストールされているソースの削除
configure ビルドファイルを生成
build 実際にビルドを実行
clean ビルドディレクトリの削除
rebuild 再ビルド(clean+configure+build)
- 17. node-gyp によるモジュールの作り方
(事前にbinding.gypの作成が必要)
> cd test/addons/hello-world
> node-gyp configure
(出力略)
> node-gyp build
(出力略)
> node test.js
binding.hello() = world
- 19. ちょと手の込んだビルド(その2)
['OS`==`linux`, {
'include_dirs': [
'<(module_root_dir)/deps/hogelib/linux',
],
'ldflags': [
'-L<(module_root_dir)/deps/hogelib/linux',
],
'libraries': [
'-lhoge',
],
}],
# 続く
- 20. ちょと手の込んだビルド(その3)
['OS==`win`, {
'include_dirs': [
'<(module_root_dir)/deps/hogelib/win32/hogelib',
],
'libraries': [
'<(module_root_dir)/deps/hogelib/win32/Release/hogelib.lib',
],
}]
- 21. 便利な変数・テクニックの紹介
OS OSの種類(linux,win,mac 等)
include_dirs インクルードディレクトリ
libraries ライブラリの指定
cflags/ldflags コンパイル、リンクフラグ
node_root_dir Nodeのソースのインストールディレクトリ(*
Node固有)
module_root_dir モジュールのディレクトリ(* Node固有)
pkg-config コマンドの出力を library に代入
'libraries': [
'<!@(pkg-config --libs-only-l QtCore QtGui QtTest)'
]
- 22. 役立つテクニック (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
- 23. 時間があればデモ
(お題)
静的ライブラリを使った Hello Wold ネイ
ティブモジュールの作成
- 24. 参考資料
• 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