SWIGの基本的な使い方を説明するためにCで書かれた以下の関数を拡張ライブラリ化する例を示します。
%cat test.c int add(int a, int b) { return(a + b); }
今回、このaddという関数をTestというモジュールの関数にラップします。 次のようなファイルを用意します。名前はtest.iにしておきましょう。
%cat test.i %module test int add(int a, int b);
一行目で"Test"というモジュールを作るということを宣言します。
以下、追加する関数を列挙していきます。
編集が終わったらこのファイルを利用してモジュール用のソースを生成します。
%swig -ruby test.i %ls -al total 12 drwxr-xr-x 2 kozuka staff 512 Jun 28 02:44 . drwxr-xr-x 4 kozuka staff 512 Jun 28 02:11 .. -rw-r--r-- 1 kozuka staff 45 Jun 28 02:12 test.c -rw-r--r-- 1 kozuka staff 39 Jun 28 02:36 test.i -rw-r--r-- 1 kozuka staff 7746 Jun 28 02:43 test_wrap.c
test_wrap.c、これが拡張ライブラリのソースになります。
後はMakefileを用意してmakeするだけです。
%cat Makefile.rb require 'mkmf' create_makefile('test') ^C %ruby Makefile.rb %make cc -fPIC -D_THREAD_SAFE -O -pipe -fPIC -I/usr/local/lib/ruby/1.6/i386-freebsd4.3 -I/usr/local/include -c -o test_wrap.o test_wrap.c cc -shared -Wl,-soname,test.so -L/usr/local/lib -o test.so test.o test_wrap.o -L. -lruby -lc
ここではMakefile.rbのcreate_makefileで指定した名前の共有オブジェクトを作るMakefileを生成しています。mkmfの使い方の詳細はRuby付属のREADME.EXTをよんでください
最後にadd関数のラップができているかテストしてみます。
%ruby -e "require 'test.so'; p Test.add(1, 2)" 3
問題なく動いているようです。