C++弱者ながらC++でNodeモジュールを作る事にしたのでいろいろと。
まずは公式サイトの解説を参考にしてみる。
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++で書く (引数と戻り値)