カラクリサイクル

『輝かしい青春』なんて失かった人の雑記

Cygwin環境にmemcachedをインストールしてみた

概要: 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で、memcachedutil.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をインストールしてみたというお話でした。