C++弱者ながらC++でNodeモジュールを作る事にしたのでいろいろと。
まずは公式サイトの解説を参考にしてみる。
まずは公式サイトの解説を参考にしてみる。
Addons Node.js v0.6.12 Manual & Documentationl
http://nodejs.org/docs/latest/api/addons.html
http://nodejs.org/docs/latest/api/addons.html
Hello World
最初にHello Worldのコードが載っているがusing namespace v8;とあるので早速この行を消して、修飾を補完して書くとこうなる。
#include <node.h> #include <v8.h> v8::Handle<v8::Value> Method(const v8::Arguments& args) { v8::HandleScope scope; return scope.Close(v8::String::New("world")); } void init(v8::Handle<v8::Object> target) { target->Set(v8::String::NewSymbol("hello"), v8::FunctionTemplate::New(Method)->GetFunction()); } NODE_MODULE(hello, init)v8::Stringやv8::ObjectというクラスがJSのそれぞれの型を表現しており、v8.hで定義されている模様。v8.hのコードを眺めるとJavaScriptの型が全て定義されているのがわかる。
NODE_MODULEマクロがどこで定義されているかを探すと node.h で定義されている。
#define NODE_MODULE(modname, regfunc) \ extern "C" { \ NODE_MODULE_EXPORT node::node_module_struct modname ## _module = \ { \ NODE_STANDARD_MODULE_STUFF, \ regfunc, \ NODE_STRINGIFY(modname) \ }; \ }モジュールエクスポート用の関数とモジュールの名前を渡す物らしい。なので上記Hello Worldのコードは、Stringの"world"を返すhelloというメソッドを一つ持つhelloモジュールを作っている。
ビルド
次にモジュールをビルドするためのwscriptのコードが載っている。ビルドするにはwscriptを作ってnode-wafコマンドを使う。
node-wafはpythonのビルドツールのhttp://docs.waf.googlecode.com/git/apidocs_16/index.htmlそのものと書いてある。rubyにおけるrakeコマンドとRakefileみたいな物なのかな。例として載っている
node-waf configure buildはconfigureタスクの後にbuildタスクを実行する。
wscriptの1行目
srcdir = '.'を適当に変えてソースディレクトリを指すようにしたら、何故かソースが読み込まれない。WAFのドキュメントにもsrcdirは載っていないので、wscriptはソースディレクトリに配置して使うしか無いのかも。
続きます Node.jsのモジュールをC++で書く (引数と戻り値)