CentOS6でmcrouterをビルドする手順

# mcrouterをビルドする
Facebookがmcrouterを発表してしばらく経つが、実はCentOS6でのビルド方法がなかなか見つからない。依存するパッケージが少し多めなのと公式のドキュメントがUbuntu 13.10/14.04をターゲットにしているからと思われる。それにいまならDockerがある。
それでもCentOS6上で動くmcrouterが必要な方に参照いただきたい。

## 依存性
以下のものは僕がビルドに成功したバージョン。より新しい/古いバージョンでもうまくいく可能性がある。

### Build Dependencies

 * libtool-2.4.4
 * autoconf-2.69
 * automake-1.13
 * gcc-4.8.4
 * ragel-6.9

### Runtime Dependencies 

 * gflags (epelのパッケージでOK)
 * glog-0.3.3
 * boost-1.55.0
 * double-conversion (github master)
 * folly (github 0.22.0)
 * mcrouter (github master)

## 手順
yumで入るものはここで入れておく。epel必須

```
yum install -y bzip2-devel  libevent-devel libcap-devel scons
yum install -y jemalloc-devel gmp-devel mpfr-devel libmpc-devel m4 wget
yum install -y python-devel bzip2-devel rpmbuild
yum install -y m4 cmake libicu-devel chrpath openmpi-devel
yum install -y mpich-devel openssl-devel
yum install -y glibc-devel.i686 glibc-devel.x86_64 gcc gcc-c++ zlib-devel
yum install -y gmp-devel mpfr-devel libmpc-devel
yum install -y gflags-devel
```

\# glog-0.3.3はtarballからrpmbuild

```
wget https://google-glog.googlecode.com/files/glog-0.3.3.tar.gz
rpmbuild -tb -D'NAME glog' -D'VERSION 0.3.3' glog-0.3.3.tar.gz
yum install -y ~/rpmbuild/RPMS/x86_64/glog-0.3.3-1.x86_64.rpm  ~/rpmbuild/RPMS/x86_64/glog-devel-0.3.3-1.x86_64.rpm
```
---------
```
cd /usr/local/src
wget http://ftpmirror.gnu.org/libtool/libtool-2.4.4.tar.gz
wget http://ftpmirror.gnu.org/autoconf/autoconf-2.69.tar.gz
wget http://ftpmirror.gnu.org/automake/automake-1.13.tar.gz
wget http://www.colm.net/files/ragel/ragel-6.9.tar.gz

tar xvzf ragel-6.9.tar.gz && cd ragel-6.9
./configure && make && make install

cd /usr/local/src
tar xvzf autoconf-2.69.tar.gz && cd autoconf-2.69
./configure --prefix=/opt/autotools && make && sudo make install

cd /usr/local/src
tar xvzf automake-1.13.tar.gz && cd automake-1.13
./configure --prefix=/opt/autotools && make && sudo make install

cd /usr/local/src
tar xvzf libtool-2.4.4.tar.gz && cd libtool-2.4.4
./configure --prefix=/opt/autotools && make && sudo make install
```

\# gcc-4.8.4は標準インストールされたgccのオプション情報を参照してビルドする。
\# 適宜 --enable-static --disable-shared --enable-languages=c,c++などを追加

```
wget http://ftpmirror.gnu.org/gcc/gcc-4.8.4/gcc-4.8.4.tar.bz2
tar xvjf gcc-4.8.4.tar.bz2
cd gcc-4.8.4
mkdir obj
cd obj
../configure --prefix=/opt/gcc --enable-bootstrap --disable-shared --enable-static --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-languages=c,c++ --disable-dssi --with-ppl --with-cloog --with-tune=generic --build=x86_64-redhat-linux --with-gmp --with-mpfr --with-mpc  --with-arch_32=i686
make && sudo make install
```

\# パスを通しておく

```
export PATH=/opt/autotools/bin:$PATH
export PATH=/opt/gcc/bin:$PATH
```

\# ここ、boostのコンパイルがキモかも知れない


```
cd /usr/local/src
wget http://downloads.sourceforge.net/project/boost/boost/1.55.0/boost_1_55_0.tar.gz
wget tar xvzf boost_1_55_0.tar.gz
cd boost_1_55_0
./bootstrap.sh
./b2 architecture=x86 address-model=64 link=static
./bjam architecture=x86 address-model=64 link=static install
```

```
cd /usr/local/src
wget -O double-conversion.zip https://github.com/floitsch/double-conversion/archive/master.zip
unzip double-conversion.zip
cd double-conversion-master
cmake . && make && sudo make install
```

```
cd /usr/local/src
wget -O folly-0.22.0.zip 'https://github.com/facebook/folly/archive/v0.22.0.zip'
unzip folly.zip
cd folly-master/folly
```

\# configure.acに細工を入れる。これがないとpthread_atforkの検出に失敗する。

```
sed '/Checks for library functions/ iAC_CHECK_LIB([pthread], [pthread_create])\n' configure.ac > configure.ac.new
autoreconf -ivf
./configure --disable-shared --enable-static && make && make install
```

### mcrouterをビルド
```
cd /usr/local/src
wget -O mcrouter-master.tar.gz https://github.com/facebook/mcrouter/archive/master.tar.gz
tar xvzf mcrouter-master.tar.gz
cd mcrouter-master/mcrouter
autoreconf -ivf
./configure && make && make install
```
 
ところどころstaticライブラリにすることで実行環境にライブラリをインストールしなくてすむようにしているが、場合によってはsharedライブラリのほうが都合がいいかもしれない。

rpmパッケージも作ってみた。specファイルは以下。
上記、最終段階まで完了させた環境でのみビルド可能。
https://gist.github.com/shivaken/a911d50a9f0069ed7bfa