概要: Cygwin で memcached をコンパイルしてインストールする
個人的に作ってるライブラリ群(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 を参照してください。
でリンク先で、
sahandler がさらに内部で union のメンバになっているからというオチである。ちなみに普通にメンバに代入するように書くと、コンパイルできるのは何故なのだろうか? *1code:
include <signal.h>
void func(void) { struct sigaction action; action.sa_handler = SIG_IGN; action.sa_flags = 0; }
と述べられているように、問題の箇所を上記のように書き換えれば、 コンパイルは可能になるようです。
で、testapp.cの問題の箇所は line 125 の、
code:_ 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をインストールしてみたというお話でした。