Your SlideShare is downloading. ×
0
node-gypを使ったネイティブモジュールの作成
node-gypを使ったネイティブモジュールの作成
node-gypを使ったネイティブモジュールの作成
node-gypを使ったネイティブモジュールの作成
node-gypを使ったネイティブモジュールの作成
node-gypを使ったネイティブモジュールの作成
node-gypを使ったネイティブモジュールの作成
node-gypを使ったネイティブモジュールの作成
node-gypを使ったネイティブモジュールの作成
node-gypを使ったネイティブモジュールの作成
node-gypを使ったネイティブモジュールの作成
node-gypを使ったネイティブモジュールの作成
node-gypを使ったネイティブモジュールの作成
node-gypを使ったネイティブモジュールの作成
node-gypを使ったネイティブモジュールの作成
node-gypを使ったネイティブモジュールの作成
node-gypを使ったネイティブモジュールの作成
node-gypを使ったネイティブモジュールの作成
node-gypを使ったネイティブモジュールの作成
node-gypを使ったネイティブモジュールの作成
node-gypを使ったネイティブモジュールの作成
node-gypを使ったネイティブモジュールの作成
node-gypを使ったネイティブモジュールの作成
node-gypを使ったネイティブモジュールの作成
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

node-gypを使ったネイティブモジュールの作成

13,773

Published on

How to make native module with node-gyp.

How to make native module with node-gyp.

Published in: Technology
0 Comments
16 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
13,773
On Slideshare
0
From Embeds
0
Number of Embeds
9
Actions
Shares
0
Downloads
27
Comments
0
Likes
16
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. node-gyp を使ったネイティブ モジュールの作成 IIJ 大津繁樹 ohtsuあっとiij.ad.jp 2012年4月18日 東京Node学園 5時限目
  • 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/5ce433fe5059e34c?pli=1
  • 6. NodeはWAFを捨て、 GYP にhttps://github.com/joyent/node/commit/14b04b06b4a7f31b3b489abba5e1467678f0f6be
  • 7. GYPによるNode.jsソースビルドconfigure: config.gypiの生成→ tools/gyp_nodeの起動→out/Release/Makefileの生成
  • 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 Nodehttp-parser Core Modules V8 libuvc-ares libev libeio
  • 12. ネイティブモジュールの例 node-qt(Linux/Win/Macで動作するNodeのデスクトップアプリ)
  • 13. tools/gyp_addon による Hello Worldunixjp:~/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では msbuildbinding.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.jsbinding.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.jsbinding.hello() = world
  • 18. ちょと手の込んだビルド(その1)• OSの値を条件とした設定のスイッチ• 静的ライブラリとのリンク指定方法• OS毎に deps ディレクトリを用意してライブラ リファイルを格納• ビルトイン(gypデフォルト/node固有)変数の {利用 # ちょっと手の込んだといっても普通の binding.gyp例 "targets": [ { "target_name": "testaddon1", "sources": [ "testaddon1.cc" ], conditions: [ # 続く
  • 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

×