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
問題なく動いているようです。