SlideShare a Scribd company logo
1 of 24
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/5ce433fe5
059e34c?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            Node
http-parser     Core Modules                   V8

                             libuv
c-ares        libev             libeio
ネイティブモジュールの例
              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
> 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
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.js
binding.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

More Related Content

What's hot

What's hot (20)

TLS, HTTP/2演習
TLS, HTTP/2演習TLS, HTTP/2演習
TLS, HTTP/2演習
 
マイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチマイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチ
 
分散トレーシング技術について(Open tracingやjaeger)
分散トレーシング技術について(Open tracingやjaeger)分散トレーシング技術について(Open tracingやjaeger)
分散トレーシング技術について(Open tracingやjaeger)
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
 
Dockerイメージ管理の内部構造
Dockerイメージ管理の内部構造Dockerイメージ管理の内部構造
Dockerイメージ管理の内部構造
 
インフラエンジニアの綺麗で優しい手順書の書き方
インフラエンジニアの綺麗で優しい手順書の書き方インフラエンジニアの綺麗で優しい手順書の書き方
インフラエンジニアの綺麗で優しい手順書の書き方
 
Mavenの真実とウソ
Mavenの真実とウソMavenの真実とウソ
Mavenの真実とウソ
 
こんなに使える!今どきのAPIドキュメンテーションツール
こんなに使える!今どきのAPIドキュメンテーションツールこんなに使える!今どきのAPIドキュメンテーションツール
こんなに使える!今どきのAPIドキュメンテーションツール
 
マイクロサービスバックエンドAPIのためのRESTとgRPC
マイクロサービスバックエンドAPIのためのRESTとgRPCマイクロサービスバックエンドAPIのためのRESTとgRPC
マイクロサービスバックエンドAPIのためのRESTとgRPC
 
Google Cloud Game Servers 徹底入門 | 第 10 回 Google Cloud INSIDE Games & Apps Online
Google Cloud Game Servers 徹底入門 | 第 10 回 Google Cloud INSIDE Games & Apps OnlineGoogle Cloud Game Servers 徹底入門 | 第 10 回 Google Cloud INSIDE Games & Apps Online
Google Cloud Game Servers 徹底入門 | 第 10 回 Google Cloud INSIDE Games & Apps Online
 
ウェブセキュリティのありがちな誤解を解説する
ウェブセキュリティのありがちな誤解を解説するウェブセキュリティのありがちな誤解を解説する
ウェブセキュリティのありがちな誤解を解説する
 
AWSでDockerを扱うためのベストプラクティス
AWSでDockerを扱うためのベストプラクティスAWSでDockerを扱うためのベストプラクティス
AWSでDockerを扱うためのベストプラクティス
 
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計
 
Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門
 
BuildKitの概要と最近の機能
BuildKitの概要と最近の機能BuildKitの概要と最近の機能
BuildKitの概要と最近の機能
 
Lightweight Keycloak
Lightweight KeycloakLightweight Keycloak
Lightweight Keycloak
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 
マルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのことマルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのこと
 
Prometheus入門から運用まで徹底解説
Prometheus入門から運用まで徹底解説Prometheus入門から運用まで徹底解説
Prometheus入門から運用まで徹底解説
 
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドBuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルド
 

Viewers also liked

SPDYの中身を見てみよう
SPDYの中身を見てみようSPDYの中身を見てみよう
SPDYの中身を見てみよう
shigeki_ohtsu
 
httpbis interim@チューリッヒ レポート
httpbis interim@チューリッヒ レポートhttpbis interim@チューリッヒ レポート
httpbis interim@チューリッヒ レポート
shigeki_ohtsu
 
Node.js で SPDYのベンチマーク体験サイトを作りました
Node.js で SPDYのベンチマーク体験サイトを作りましたNode.js で SPDYのベンチマーク体験サイトを作りました
Node.js で SPDYのベンチマーク体験サイトを作りました
shigeki_ohtsu
 
HTTP/2.0 HPAC-03 エンコーディング手法 by tatsuhiro_t
HTTP/2.0 HPAC-03 エンコーディング手法 by tatsuhiro_tHTTP/2.0 HPAC-03 エンコーディング手法 by tatsuhiro_t
HTTP/2.0 HPAC-03 エンコーディング手法 by tatsuhiro_t
shigeki_ohtsu
 
第43回HTML5とか勉強会 SPDY/QUICデモ
第43回HTML5とか勉強会 SPDY/QUICデモ第43回HTML5とか勉強会 SPDY/QUICデモ
第43回HTML5とか勉強会 SPDY/QUICデモ
shigeki_ohtsu
 
Node の HTTP/2.0 モジュール iij-http2 の実装苦労話
Node の HTTP/2.0 モジュール iij-http2 の実装苦労話Node の HTTP/2.0 モジュール iij-http2 の実装苦労話
Node の HTTP/2.0 モジュール iij-http2 の実装苦労話
shigeki_ohtsu
 
httpbis interim@シアトル レポート (第2回HTTP/2.0接続試験)
httpbis interim@シアトル レポート(第2回HTTP/2.0接続試験)httpbis interim@シアトル レポート(第2回HTTP/2.0接続試験)
httpbis interim@シアトル レポート (第2回HTTP/2.0接続試験)
shigeki_ohtsu
 
HTTP/2.0がもたらす Webサービスの進化(後半)
HTTP/2.0がもたらすWebサービスの進化(後半)HTTP/2.0がもたらすWebサービスの進化(後半)
HTTP/2.0がもたらす Webサービスの進化(後半)
shigeki_ohtsu
 
Node-v0.12の新機能について
Node-v0.12の新機能についてNode-v0.12の新機能について
Node-v0.12の新機能について
shigeki_ohtsu
 

Viewers also liked (20)

Androidの新ビルドシステム
Androidの新ビルドシステムAndroidの新ビルドシステム
Androidの新ビルドシステム
 
Ninja Build: Simple Guide for Beginners
Ninja Build: Simple Guide for BeginnersNinja Build: Simple Guide for Beginners
Ninja Build: Simple Guide for Beginners
 
How to Add Original Library to Android NDK
How to Add Original Library to Android NDKHow to Add Original Library to Android NDK
How to Add Original Library to Android NDK
 
SPDYの中身を見てみよう
SPDYの中身を見てみようSPDYの中身を見てみよう
SPDYの中身を見てみよう
 
httpbis interim@チューリッヒ レポート
httpbis interim@チューリッヒ レポートhttpbis interim@チューリッヒ レポート
httpbis interim@チューリッヒ レポート
 
Node.js で SPDYのベンチマーク体験サイトを作りました
Node.js で SPDYのベンチマーク体験サイトを作りましたNode.js で SPDYのベンチマーク体験サイトを作りました
Node.js で SPDYのベンチマーク体験サイトを作りました
 
HTTP/2.0 HPAC-03 エンコーディング手法 by tatsuhiro_t
HTTP/2.0 HPAC-03 エンコーディング手法 by tatsuhiro_tHTTP/2.0 HPAC-03 エンコーディング手法 by tatsuhiro_t
HTTP/2.0 HPAC-03 エンコーディング手法 by tatsuhiro_t
 
第43回HTML5とか勉強会 SPDY/QUICデモ
第43回HTML5とか勉強会 SPDY/QUICデモ第43回HTML5とか勉強会 SPDY/QUICデモ
第43回HTML5とか勉強会 SPDY/QUICデモ
 
Node の HTTP/2.0 モジュール iij-http2 の実装苦労話
Node の HTTP/2.0 モジュール iij-http2 の実装苦労話Node の HTTP/2.0 モジュール iij-http2 の実装苦労話
Node の HTTP/2.0 モジュール iij-http2 の実装苦労話
 
httpbis interim@シアトル レポート (第2回HTTP/2.0接続試験)
httpbis interim@シアトル レポート(第2回HTTP/2.0接続試験)httpbis interim@シアトル レポート(第2回HTTP/2.0接続試験)
httpbis interim@シアトル レポート (第2回HTTP/2.0接続試験)
 
HTTP/2.0がもたらす Webサービスの進化(後半)
HTTP/2.0がもたらすWebサービスの進化(後半)HTTP/2.0がもたらすWebサービスの進化(後半)
HTTP/2.0がもたらす Webサービスの進化(後半)
 
Node-v0.12のTLSを256倍使いこなす方法
Node-v0.12のTLSを256倍使いこなす方法Node-v0.12のTLSを256倍使いこなす方法
Node-v0.12のTLSを256倍使いこなす方法
 
Node-v0.12の新機能について
Node-v0.12の新機能についてNode-v0.12の新機能について
Node-v0.12の新機能について
 
Node最新トピックス
Node最新トピックスNode最新トピックス
Node最新トピックス
 
このPHP拡張がすごい!2017
このPHP拡張がすごい!2017このPHP拡張がすごい!2017
このPHP拡張がすごい!2017
 
Angular+Dart=より快適なSPA開発
Angular+Dart=より快適なSPA開発Angular+Dart=より快適なSPA開発
Angular+Dart=より快適なSPA開発
 
Riot.jsに触れてみた話
Riot.jsに触れてみた話Riot.jsに触れてみた話
Riot.jsに触れてみた話
 
Riot.jsを用いたweb開発 takusuta tech conf #1
Riot.jsを用いたweb開発   takusuta tech conf #1Riot.jsを用いたweb開発   takusuta tech conf #1
Riot.jsを用いたweb開発 takusuta tech conf #1
 
HTTP/2の現状とこれから
HTTP/2の現状とこれからHTTP/2の現状とこれから
HTTP/2の現状とこれから
 
イマドキのフロントエンドエンジニアの道具箱
イマドキのフロントエンドエンジニアの道具箱イマドキのフロントエンドエンジニアの道具箱
イマドキのフロントエンドエンジニアの道具箱
 

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

Nodejuku01 ohtsu
Nodejuku01 ohtsuNodejuku01 ohtsu
Nodejuku01 ohtsu
Nanha Park
 
関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU
Takuro Iizuka
 
ホームディレクトリに埋もれた便利なコードをさがせ!
ホームディレクトリに埋もれた便利なコードをさがせ!ホームディレクトリに埋もれた便利なコードをさがせ!
ホームディレクトリに埋もれた便利なコードをさがせ!
Yohei Fushii
 

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

Nodejuku01 ohtsu
Nodejuku01 ohtsuNodejuku01 ohtsu
Nodejuku01 ohtsu
 
Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2
Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2
Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2
 
Getting Started GraalVM (再アップロード)
Getting Started GraalVM (再アップロード)Getting Started GraalVM (再アップロード)
Getting Started GraalVM (再アップロード)
 
OpenShiftでJBoss EAP構築
OpenShiftでJBoss EAP構築OpenShiftでJBoss EAP構築
OpenShiftでJBoss EAP構築
 
AzureDevOpsで作るHoloLensアプリCI環境
AzureDevOpsで作るHoloLensアプリCI環境AzureDevOpsで作るHoloLensアプリCI環境
AzureDevOpsで作るHoloLensアプリCI環境
 
LibreOffice を Windows 上でビルドする UPDATE
LibreOffice を Windows 上でビルドする UPDATELibreOffice を Windows 上でビルドする UPDATE
LibreOffice を Windows 上でビルドする UPDATE
 
Yesod on Heroku
Yesod on HerokuYesod on Heroku
Yesod on Heroku
 
Node.js Hands-On
Node.js Hands-OnNode.js Hands-On
Node.js Hands-On
 
はてなにおける継続的デプロイメントの現状と Docker の導入
はてなにおける継続的デプロイメントの現状と Docker の導入はてなにおける継続的デプロイメントの現状と Docker の導入
はてなにおける継続的デプロイメントの現状と Docker の導入
 
ソフトウェア工学2023 14 ビルド
ソフトウェア工学2023 14 ビルドソフトウェア工学2023 14 ビルド
ソフトウェア工学2023 14 ビルド
 
関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU
 
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスするEWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
 
ホームディレクトリに埋もれた便利なコードをさがせ!
ホームディレクトリに埋もれた便利なコードをさがせ!ホームディレクトリに埋もれた便利なコードをさがせ!
ホームディレクトリに埋もれた便利なコードをさがせ!
 
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
 
オープン・ソースで構築するARMマイコン開発環境 ―― GCC,Eclipse,OpenOCDで統合開発環境,JTAGデバッグもできる!
オープン・ソースで構築するARMマイコン開発環境 ―― GCC,Eclipse,OpenOCDで統合開発環境,JTAGデバッグもできる!オープン・ソースで構築するARMマイコン開発環境 ―― GCC,Eclipse,OpenOCDで統合開発環境,JTAGデバッグもできる!
オープン・ソースで構築するARMマイコン開発環境 ―― GCC,Eclipse,OpenOCDで統合開発環境,JTAGデバッグもできる!
 
PF部第19回資料 poor man's JTAG
PF部第19回資料 poor man's JTAGPF部第19回資料 poor man's JTAG
PF部第19回資料 poor man's JTAG
 
JellyBeanのソースをとりあえず眺めてみた(手抜き)
JellyBeanのソースをとりあえず眺めてみた(手抜き)JellyBeanのソースをとりあえず眺めてみた(手抜き)
JellyBeanのソースをとりあえず眺めてみた(手抜き)
 
Bluetooth Low Energy入門講座 -part2
Bluetooth Low Energy入門講座 -part2Bluetooth Low Energy入門講座 -part2
Bluetooth Low Energy入門講座 -part2
 
LibreOffice を Windows 上でビルドする UPDATE2
LibreOffice を Windows 上でビルドする UPDATE2LibreOffice を Windows 上でビルドする UPDATE2
LibreOffice を Windows 上でビルドする UPDATE2
 
Code igniterでテスト駆動開発 資料作成中
Code igniterでテスト駆動開発 資料作成中Code igniterでテスト駆動開発 資料作成中
Code igniterでテスト駆動開発 資料作成中
 

More from shigeki_ohtsu (7)

HTTP/2, QUIC入門
HTTP/2, QUIC入門HTTP/2, QUIC入門
HTTP/2, QUIC入門
 
SSL/TLSの基礎と最新動向
SSL/TLSの基礎と最新動向SSL/TLSの基礎と最新動向
SSL/TLSの基礎と最新動向
 
Technical Overview of QUIC
Technical  Overview of QUICTechnical  Overview of QUIC
Technical Overview of QUIC
 
httpbis interim とhttp2.0相互接続試験の話
httpbis interim とhttp2.0相互接続試験の話httpbis interim とhttp2.0相互接続試験の話
httpbis interim とhttp2.0相互接続試験の話
 
Stream2の基本
Stream2の基本Stream2の基本
Stream2の基本
 
SPDYの話
SPDYの話SPDYの話
SPDYの話
 
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解するそうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
 

Recently uploaded

Recently uploaded (11)

Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 

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

  • 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/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
  • 12. ネイティブモジュールの例 node-qt (Linux/Win/Macで動作するNodeのデスクトップアプリ)
  • 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
  • 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