• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
node-gypを使ったネイティブモジュールの作成
 

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

on

  • 11,491 views

How to make native module with node-gyp.

How to make native module with node-gyp.

Statistics

Views

Total Views
11,491
Views on SlideShare
8,670
Embed Views
2,821

Actions

Likes
10
Downloads
24
Comments
0

8 Embeds 2,821

http://d.hatena.ne.jp 2054
http://tech.nifty.co.jp 537
http://pegass85.wordpress.com 212
http://webcache.googleusercontent.com 12
https://twitter.com 2
http://hatenatunnel.appspot.com 2
http://translate.googleusercontent.com 1
http://cache.yahoofs.jp 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

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

    • 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 のバイナリーインストールがサ ポートされユーザ環境でのビルドをなくす方 向に。
    • Node.js アーキテクチャ概要(v0.6~) Node ネイティブ zlib JavaScript (C/C++) User Modules openssl Nodehttp-parser Core Modules V8 libuvc-ares libev libeio
    • ネイティブモジュールの例 node-qt(Linux/Win/Macで動作するNodeのデスクトップアプリ)
    • tools/gyp_addon による Hello Worldunixjp:~/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> 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
    • 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 によるビルドファイルの生成からコンパ イルまで行える。 普段はこっちを使おう。
    • 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)• OSの値を条件とした設定のスイッチ• 静的ライブラリとのリンク指定方法• OS毎に deps ディレクトリを用意してライブラ リファイルを格納• ビルトイン(gypデフォルト/node固有)変数の {利用 # ちょっと手の込んだといっても普通の binding.gyp例 "targets": [ { "target_name": "testaddon1", "sources": [ "testaddon1.cc" ], conditions: [ # 続く
    • ちょと手の込んだビルド(その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固有) pkg-config コマンドの出力を library に代入libraries: [ <!@(pkg-config --libs-only-l QtCore QtGui QtTest) ]
    • 役立つテクニック (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