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 に何らかの値が入ってそうな雰囲気ですが