CentOS4.5でglibc 2.3.2を使ってビルドする方法

ちょっと前にCentOS3.9に改宗しますとブログに書いたのですが、これはglibc2.3.2にてMySQLとかSennaとかをビルドするためというのが理由でした。しかしいざ実際にCentOS3.9でビルド作業を開始してみると、、、

  • GCCのバージョンが古い(ver3.2.3)。そのためSennaのビルドができない(nfkc.cのコンパイルが30分以上待っても終わらないので無理)。
    • CentOS4系のrpmを落としてきて入れようとすると、依存関係のせいで大量に追加パッケージをいれたり、既存のファイルを上書きすることになる。
    • 新しいGCCをソースからビルドしようとすると、i386はビルドできるけどx86_64ではmakeが通らない。
  • subversionコマンドを使おうと思い、"yum install subversion"とやっても、公式レポジトリにsubversionが無い。
    • CentOS4系のrpmを持ってきていれようとするとこれまた大量の依存関係(ry
  • GNU Autotools、Bisonなどのバージョンが古い。その(ry

という感じでCentOS3.9を大改造せざるを得なくなりまして、断念しました。

そこでどうしようかしばし検討したのですが、CentOS4.5に用意されている、互換用のパッケージ(compat-XXX)を使うことにしました(早く気づけよw)。

yum install compat-glibc

CentOS3のglibcは2.3.2、CentOS4のglibcは2.3.4、CentOS5のglibcは2.5です。これらはRHEL3/4/5に対応しているわけですが、それぞれ1つ前のバージョンで使用されているglibcの互換用パッケージが用意されています。CentOS4ならcompat-glibcというパッケージがglibc2.3.2に、CentOS5ならglibc2.3.4に相当します。

インストールは極めて単純、yum install compat-glibcを実行するだけです。

yum install compat-glibc

これを実行するとcompat-glibc-headersという互換用のヘッダファイルも同時にインストールされます。

CLFAGS/CXXFLAGS/LDFLAGSで指定

インストールすると、1つ前の世代のファイル群は以下に格納されます。CentOS4なら末尾がlinux3E、CentOS5ならlinux4Eだと思います。

/usr/lib/i386-redhat-linux3E
/usr/include/i386-redhat-linux3E

で、configure時にこれらを指定します。CLFAGS/CXXFLAGSに-isystemオプションを指定、LDFLAGSに-Bオプションを指定です。例えばMySQLのビルドだと以下のようになります。

CC=gcc CXX=gcc \
CFLAGS="-isystem /usr/lib/i386-redhat-linux3E/include" \
CXXFLAGS="-isystem /usr/lib/i386-redhat-linux3E/include" \
LDFLAGS="-B /usr/lib/i386-redhat-linux3E/lib/" \
./configure \
'--prefix=/usr/local/mysql' \
'--localstatedir=/usr/local/mysql/data' \
'--libexecdir=/usr/local/mysql/bin' \
'--enable-thread-safe-client' \
'--enable-local-infile' \
'--enable-assembler' \
'--with-pic' \
'--with-fast-mutexes' \
'--with-client-ldflags=-static' \
'--with-mysqld-ldflags=-static' \
'--with-zlib-dir=bundled' \
'--with-big-tables' \
'--with-yassl' \
'--with-readline' \
'--with-extra-charsets=complex'

isystemで指定されたディレクトリは標準のシステムディレクトリと同等の特殊な扱いを受けることができます。

これによってできたバイナリは、CentOS4(glibc2.3.4)上でビルドしたにも関わらず、CentOS3(glibc2.3.2)上で動作させることが可能になります。

:参考

そもそも何でこんなことするの?

何でこんなことをするのか、なのですがこれは作ったバイナリをなるべく多くの環境で動作させるためというのが理由です。

例えばこういった配慮を行わずにCentOS4でビルドしてしまうと、glibc2.3.4以上の環境でないと動作しないことになってしまいます。例えばFedora7なら、glibc2.7でしたっけ、RHEL5でさえも動作させることができないバイナリとなります。ここで、glibc2.3.2にあわせてビルドしておくと皆が幸せになれる可能性があがるのです。

ちなみにこうしたglibcバージョン依存を排除するために完全static-linkなバイナリを作るという手段が一般的には存在しますが、MySQLに関しては今は完全staticにするとスレッドライブラリ等のバージョンの違いか何かが原因でmysqldが落ちます。つまり他に方法は無いです。

で、何でまたそんなことを言い出しているのかというと、それはうわなにをするやmr(略