はちゅにっき

こっちのブログはまったり更新

Debian/wheezy に Kyoto{Cabinet, Tycoon} をいれたい

と思ったら、予想以上にはまったのでメモ。

下準備

まずはコンパイルに必要なものをそろえます。
Debian なので、いつものように

$ sudo aptitude install build-essential zlib1g-dev

自分の環境下ではこれだけ入れれば OK でした。

KyotoCabinet をインストールする

deb パッケージが提供されていないようなので、自前でコンパイルしてインストールすることに。
本当は deb パッケージを作ってからインストールしたほうがパッケージ管理としては正しいと思うんだけど、そのへんがよくわかっていないので。。。
今度べんきょうしておかなくっちゃ。

g2p/kyotocabinet
https://github.com/g2p/kyotocabinet

というのもあるみたいですが、少しバージョンが古かったのでせっかくだし、最新のものをインストールしてみることに。

$ wget http://fallabs.com/kyotocabinet/pkg/kyotocabinet-1.2.51.tar.gz
$ tar zxvf kyotocabinet-1.2.51.tar.gz
$ cd kyotocabinet-1.2.51
$ ./configure
$ make
$ make check
$ make install

すんなりインストールが完了しました。
特に動作確認していないけれど "make check" が通ったからとりあえず OK ということで。

KyotoTycoon をインストールする

リモートから KyotoCabinet にアクセスするため、KyotoTycoon をインストールします。
これも KyotoCabinet と一緒で「よゆうッスよー」

$ wget wget http://fallabs.com/kyototycoon/pkg/kyototycoon-0.9.38.tar.gz
$ tar zxvf kyototycoon-0.9.38.tar.gz
$ cd kyototycoon-0.9.38
$ ./configure
$ make
(...中略...)
/usr/bin/ld: ktutiltest.o: undefined reference to symbol 'kyotocabinet::SpinLock::lock_try()'
/usr/bin/ld: note: 'kyotocabinet::SpinLock::lock_try()' is defined in DSO /usr/local/lib/libkyotocabinet.so.9 so try adding it to the linker command line
/usr/local/lib/libkyotocabinet.so.9: could not read symbols: Invalid operation
collect2: ld returned 1 exit status
make: *** [ktutiltest] エラー 1

やだ、なにこれ・・・。
よくわからないので、いろいろ調べてみると、以下のサイトを発見

UnderstandingDSOLinkChange
http://fedoraproject.org/wiki/UnderstandingDSOLinkChange

どうやら Fedora でも発生するみたいですね。
というよりも、リンカ (でいいのかな?) に起因するコンパイルエラーなので、ディストリビューションに限らず発生する可能性はありそう。
解決方法については、上記記事の下の方を読んで察するには、コンパイル時に共有オブジェクトを指定しておけばよさそうなので、Makefile の方を書き換えることにしました。
手元の環境だと 56 行目に

CMDLDFLAGS =

と、なんかすごい右辺に値を設定したくなる箇所があったため、ここに設定しました。 *1
Makefile を見る限りだと、ふつうに LDFLAGS に設定しても問題なさそう。
diff とるとこんな感じ

56c56
< CMDLDFLAGS =
---
> CMDLDFLAGS = -lkyotocabinet

と、ここまで設定したところで、もう一度コンパイルすると無事にインストールできました。

$ make
$ make check
$ sudo make install
$ ldconfig
$ ktserver
2011-04-13T21:29:07.789999+09:00: [SYSTEM]: ================ [START]: pid=17748
2011-04-13T21:29:07.789999+09:00: [SYSTEM]: opening a database: path=:
2011-04-13T21:29:07.799999+09:00: [SYSTEM]: starting the server: expr=:1978
2011-04-13T21:29:07.799999+09:00: [SYSTEM]: server socket opened: expr=:1978 timeout=30.0
2011-04-13T21:29:07.799999+09:00: [SYSTEM]: listening server socket started: fd=3

ということで、たぶん OK っぽい?
次は Perl からアクセスしてみよー。ということで、今回はここまで。
わーい。

*1:./configure 時にオプションを指定した場合には CMDLDFLAGS に何らかの値が入ってそうな雰囲気ですが