hagino3000's blog

平成アーカイブス (更新停止)

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はソースディレクトリに配置して使うしか無いのかも。

続きます Node.jsのモジュールをC++で書く (引数と戻り値)