KyotoCabinetのruby拡張をmingwでビルド(2)

RubyInstaller(x64)のRubyでkyotocabinetの拡張を使うためにビルドしようとしたが、なかなかうまくいかなかった。
結局、かなり滅茶苦茶なやり方でビルドしたので、自分以外の役には立たないかもしれない。

1.準備

MSYS2をインストール

msys2-x86_64-20160205.exeをダウンロードしてインストールした。

mingw64_shell.batを起動して、各種パッケージをインストール。

pacman -S base-devel
pacman -S mingw-w64-x86_64-toolchain
pacman -S mingw-w64-x86_64-lzo2

LZOは実用的な圧縮速度なので入れておく。

regexのビルド・インストール

mingw-libgnurx-2.5.1-src.tar.gzをダウンロードしてビルド。
参考サイト

nasu@HANA MINGW64 ~/mingw-libgnurx-2.5.1
$ ./configure --prefix=/mingw64
$ make
$ rm libregex.a
$ ar rcs libregex.a regex.o
$ make install

2. Kyoto Cabinet のビルド・インストール

kyotocabinet-1.2.76.tar.gzをダウンロード、展開。

configureを編集 (置換)

/usr/local/include → /mingw64/include
/usr/local/lib → /mingw64/lib

kcthread.ccの編集 (置換)

(::DWORD)opq_ → (::DWORD_PTR)opq_

ビルド
./configure --prefix=/mingw64 --enable-lzo
make
make install

3. KyotoCabinet の ruby拡張をビルド・インストール

kyotocabinet-ruby-1.32.tar.gzをダウンロード、展開。

各種ファイルの編集

・extconf.rbとtest.rbの Config を RbConfig に置換。
・kyotocabinet.ccの「#define _KC_YARV_」をコメントアウト
(※ちなみにrb_thread_blocking_regionの所をrb_thread_call_without_gvlで書き直してみたら、test.rbでbugに遭遇。)

ruby extconf.rb

Makefileを作成。
ここのrubyは、RubyInstallerでインストールしたruby
パスが通ってなかったら、/c/ruby23-x64/bin/ruby みたいに書けばいいはず。

MakefileのLIBSを編集して、ビルド

余計なdllを必要としないように試行錯誤。

LIBS = $(LIBRUBYARG_SHARED)  -lkyotocabinet -llzo2 -lz -lregex -lstdc++ -lpthread -lm -lshell32 -lws2_32 -liphlpapi -limagehlp -lshlwapi  

↑この部分を、↓に書き換え。

LIBS = $(LIBRUBYARG_SHARED)  -lkyotocabinet -lz -static-libgcc -Wl,-Bstatic -llzo2 -lregex -lstdc++ -lpthread -lm -Wl,-Bdynamic -lshell32 -lws2_32 -liphlpapi -limagehlp -lshlwapi  

ビルド、テスト

make
make install
ruby test.rb

テストはwickedの所が全部failed。大丈夫なのかな?

まとめ

まあデータを突っ込むのに使えればいいかなという感じです

# 文字コードを設定
db.tune_encoding(Encoding::UTF_8)