Node.jsのモジュールをC++で書く (Hello World編)
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はソースディレクトリに配置して使うしか無いのかも。