24
node-gyp ををををををををををををを をををを IIJ をををを ohtsu ををを iij.ad.jp 2012 を 4 を 18 を 東東 Node 東東 5 東東東

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

Embed Size (px)

Citation preview

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

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

IIJ 大津繁樹ohtsu あっと iij.ad.jp

2012 年 4 月 18 日東京 Node 学園 5 時限目

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

はじめに、• node-v0.7 から ビルドシステムが WAF から GYP に変

わりました。• ネイティブモジュールの作成方法も node-waf/wscript

を使ったものから node-gyp/binding.gyp を使ったものに変更になります。

• 今回は、そのへんの紹介と(時間があれば)実際の作成のデモを行います。

• Mac 持ってないので、 Linux/Win7 だけの検証です。

node-v0.8 話はこの後の koichik さんにお任せ

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

自己紹介• 大津 繁樹 (おおつ しげき)• twitter: @jovi0608, github: shigeki• IIJ アプリケーション開発部 戦略的開発室 • 流行ものの追っかけ Node.js/HTML5/Kinect

etc.• 最近は Node.js にどっぷり。typo 修正の 1 行 PR でも Node.js AUTHOR の仲間入りできます。皆さんも github で Nodeに参加しましょう。

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

そもそも、 (ry のインタビューより、)

BostInno: (振り返って) node で(今と)違ってたことをやっていればよかったと思うことは ?

Dahl: はい 、 いっぱいあります . 例えば CommonJS のモジュールシステムを使わなければよかった。ブラウザが動作するより複雑過ぎて、しかも大きく異なっているから。 WAF ビルドシステムも使わなければよかった。確かに動いているよ、でも必要以上に厄介な事が起きている。ある程度 WAF の下でいろんなごちゃごちゃを整理できるかもしれないが、それはとてつもない大事業になっちゃうだろう。

http://bostinno.com/2011/01/31/node-js-interview-4-questions-with-creator-ryan-dahl/

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

GYP に変えた理由 by ryan• Makefile/XCode/Visual Studio プロジェクトを生成するメタ

ビルドシステムである。 (話者注: Scons/Ninja も)

• 設定(ファイル・プリプロセッサ定義やフラグ等)が JSON である。 (話者注:一部仕様が違ってます。)

• Chrome のビルドシステムでも使われ、マルチプラットフォーム構築の実績がある。 (話者注:とういうかもともと Chrome のために作られたもの)

• ライブラリを出し入れ( plug) するのが簡単。必要なプリプロセッサ定義やライブラリリンクのフラグをファイルで gyp に外出ししてビルドができる。

http://groups.google.com/group/nodejs/msg/5ce433fe5059e34c?pli=1

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

Node は WAF を捨て、 GYP に

https://github.com/joyent/node/commit/14b04b06b4a7f31b3b489abba5e1467678f0f6be

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

GYP による Node.js ソースビルド

configure: config.gypi の生成→ tools/gyp_node の起動→ out/Release/Makefile の生成

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

で、 GYP って何?• Generate Your Projects の略• Google 謹製 Chrome のためのビルドシステム• python で書かれている。 (node/tools/gyp 以下 )• 設定ファイル ( .gyp や .gypi) を書き、 gyp を起動

すると実行 OS に合ったビルドファイル (Linux: Makefile/Mac:Xcode ?/Win: VisualStudio sln/vcxprj) を生成。

• なので一つのソースツリーでマルチプラットフォームのバイナリをビルドできる。

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

鍵は gyp ファイル{ ‘targets’: [ # 設定の中にコメントが書ける { ‘target_name’: ‘hello’, # いつもの key: value 形式 ‘conditions’: [ [ ‘OS==linux’, { ‘cflags’: [ ‘-Dhoge’ ] } ] # 条件文も OK ], ‘libraries’: ‘<@(core_library_files)‘, # 変数も OK ‘sources’: [ ‘hello.cc’ ] , # 最後がコンマも OK } ] }

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

ネイティブモジュール作成も 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 のバイナリーインストールがサ

ポートされユーザ環境でのビルドをなくす方向に。

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

libev libeioc-ares

http-parser

zlibopenssl

V8NodeCore Modules

NodeUser Modules

libuv

Node.js アーキテクチャ概要( v0.6 ~ )

JavaScriptネイティブ (C/

C++)

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

ネイティブモジュールの例node-qt

( Linux/Win/Mac で動作する Node のデスクトップアプリ )

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

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 が必要

Page 14: node-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 ファイルを開けよう。

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

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 によるビルドファイルの生成からコンパイルまで行える。

普段はこっちを使おう。

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

node-gyp コマンド一覧Usage: node-gyp <command> [options]

コマンド 説明install ビルドに必要なソースをダウンロードlist ビルドに必要なソースをダウンロードremove インストールされているソースの削除configure ビルドファイルを生成build 実際にビルドを実行clean ビルドディレクトリの削除rebuild 再ビルド (clean+configure+build)

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

node-gyp によるモジュールの作り方(事前に binding.gyp の作成が必要)

> cd test/addons/hello-world> node-gyp configure(出力略)> node-gyp build(出力略)> node test.jsbinding.hello() = world

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

ちょと手の込んだビルド(その1)

{ # ちょっと手の込んだといっても普通の binding.gyp 例 "targets": [ { "target_name": "testaddon1", "sources": [ "testaddon1.cc" ], 'conditions': [# 続く

• OSの値を条件とした設定のスイッチ• 静的ライブラリとのリンク指定方法• OS毎に deps ディレクトリを用意してライブラ

リファイルを格納• ビルトイン( gyp デフォルト /node 固有)変数

の利用

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

ちょと手の込んだビルド(その2)['OS`==`linux`, { 'include_dirs': [ '<(module_root_dir)/deps/hogelib/linux', ], 'ldflags': [ '-L<(module_root_dir)/deps/hogelib/linux', ], 'libraries': [ '-lhoge', ], }],# 続く

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

ちょと手の込んだビルド(その3) ['OS==`win`, { 'include_dirs': [ '<(module_root_dir)/deps/hogelib/win32/hogelib', ], 'libraries': [ '<(module_root_dir)/deps/hogelib/win32/Release/hogelib.lib', ], }]

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

便利な変数・テクニックの紹介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 に代入

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

役立つテクニック (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

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

時間があればデモ(お題)

静的ライブラリを使った Hello Wold ネイティブモジュールの作成

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

参考資料• 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