個人的に作ってるライブラリ群(Applishのことです。詳しくは僕のリポジトリ参照)
のキャッシュクラスで、memcachedを使ったクラスを作ってて、
実際に動かしてテストしてみたかったんで、Cygwinにmemcachedをインストールしてみました。
今回はすんなりいくかと思いきや、ソースコードにパッチを当てる必要があったので、 そこら辺もまとめて掲載してみる。
1. ソースコードの取得
$ cd ~/tmp
$ wget http://memcached.googlecode.com/files/memcached-1.4.5.tar.gz
2. libeventのインストール
memcachedの動作にはlibeventが必要なので、
先にlibeventをインストールします。
こっちは割りとすんなりいって、
$ wget http://monkey.org/~provos/libevent-1.4.14b-stable.tar.gz
$ tar zxvf libevent-1.4.14b-stable.tar.gz
$ cd libevent-1.4.14b-stable
$ ./configure --prefix=/usr/local/libevent
$ make
$ make install
でインストールが終了しました。で、あと./configureのオプションについては各自で調整してください。
3. memcachedのソースコード修正
で、次にmemcachedにソースコード修正に行きます。
まず、最初がutil.cで、memcachedの生のコードだと、
CygwinとSolarisで問題が発生するみたいです。詳しくはIssue 111: compile errors: array subscript has type 'char'
を参照。
で、この問題については、先のリンク先で、個人的に修正していた人がいたので、 そこからパクってきます。正確には、
のリポジトリのutil.cで、memcachedのutil.cを上書きすればOKです。
で、今度はtestapp.cの修正をします。
testapp.cについてなんですが、このファイルはコンパイル時に、
testapp.c: In function 'cache_redzone_test':
testapp.c:125: error: unknown field 'sa_handler' specified in initializer
cc1: warnings being treated as errors
みたいなエラーを吐きます。
でこのエラーメッセージのunknown field 'sa_handler' specified in initializer
でGoogle検索したら一発で出てくるんですが、どうもこのエラーは、Cygwinのヘッダファイルの都合上おきるそうです。
まあ僕は詳しいことは分からないんで詳細はDesignated Initializer - BOOLEANLABELを参照してください。
でリンク先で、
sa_handler がさらに内部で union のメンバになっているからというオチである。
ちなみに普通にメンバに代入するように書くと、コンパイルできるのは何故なのだろうか? *1
#include <signal.h> void func(void) { struct sigaction action; action.sa_handler = SIG_IGN; action.sa_flags = 0; }
と述べられているように、問題の箇所を上記のように書き換えれば、 コンパイルは可能になるようです。
で、testapp.cの問題の箇所はline 125の、
struct sigaction action = { .sa_handler = SIG_IGN, .sa_flags = 0};
となっているところを、
struct sigaction action;
action.sa_handler = SIG_IGN;
action.sa_flags = 0;
と書き換えればOKです。
4. memcachedのコンパイル
これでmemcachedのソースの修正は終わったので、あとは端末で、
$ cd ~/tmp/memcached-1.4.5
$ ./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent
$ make
$ make test
$ make install
すればCygwinにmemcachedをインストールできます。
ちなみに僕はmemcachedの動作確認をするのにmake testしかやってないので、
本番環境で本当に動くかどうかは確認できていません。
まあmake testでテストがこけるようなことはなかったので、多分大丈夫でしょう。
というわけで以上でmemcachedのインストールは終わりです。
5. 以上終了。以下感想
まあ今回memcachedを実際にインストールしてみたわけですが、
詰まった箇所が自分でなんとかできる範囲だったのが幸いでした。
これでわけの分からんエラーとか、ソースを大幅に書き換えないとダメな箇所とか出てきたら、
多分お手上げだったでしょう。
まあこれでmemcachedは手に入ったので、あとはmemcachedを使うテストを書くだけです。
というわけで、今日はCygwinにmemcachedをインストールしてみたというお話でした。