curl, git の RPM ビルド

CentOS5にrpmforgeからgitを入れて使ってみるとcurlの古いバージョンが入った環境でビルドされているようで、git-http-pushが使えなかったのでcurl, gitともに最新版を手元でRPMビルドして入れたのでその時の手順を書こうと思う。

RPMビルド環境を用意する

まずはRPMビルド環境を用意する必要があるので下記コマンドを実行。

$ sudo yum install rpm-build
$ mkdir rpmbuild
$ cd rpmbuild
$ mkdir BUILD RPMS SOURCES SPECS SRPMS

次に上記で作ったディレクトリ内でビルドを行うために .rpmmacros を設定する。

$ vi ~/.rpmmacros
%_topdir %(echo $HOME)/rpmbuild

これで最低限のビルド環境は設定完了。

curl RPMビルド

gitをビルドする前にcurlの最新版をビルド、インストールしておく。
標準だと 7.15.5 が入っていたのでオフィシャルから最新版の 7.21.2 の src.rpm を落としてくる。

$ wget http://curl.haxx.se/download/curl-7.21.2-1.src.rpm

そしてそれを展開する。

$ rpm -ivh curl-7.21.2-1.src.rpm
$ ls rpmbuild/SPECS/
curl.spec
$ ls rpmbuild/SOURCES/
curl-7.21.2.tar.bz2

では実際にビルドして最新版のcurl RPMを作りたいがそのままの curl.spec ではうまくビルドできなかったので、curl.spec に下記の変更を加えた。

-Copyright: MIT/X derivate
+License: MIT/X derivate

また他のRPMも必要だったのでrpmforgeのリポジトリを追加して下記のように入れておいた。

$ sudo yum install gcc
$ wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.1-1.el5.rf.i386.rpm
$ sudo rpm -ivh rpmforge-release-0.5.1-1.el5.rf.i386.rpm
$ sudo yum install libssh2-devel

これでcurlビルドに必要な環境は整ったので実際にビルドしてみる。

$ cd ~/rpmbuild/
$ rpmbuild -ba SPEC/curl.spec
...

エラーが出ずにうまくいけば ~/rpmbuild/SRPMS/, ~/rpmbuild/RPMS/i386/ にRPM が作られている。

$ ls ~/rpmbuild/SRPMS/
curl-7.21.2-1.src.rpm
$ ls ~/rpmbuild/RPMS/i386/
curl-7.21.2-1.i386.rpm  libcurl4-7.21.2-1.i386.rpm  libcurl4-devel-7.21.2-1.i386.rpm

以上で最新版curlRPMビルドは完了。
あとは自前のyumリポジトリなどに反映させてインストールする。

$ sudo cp ~/rpmbuild/RPMS/i386/*curl* /var/www/html/centos/5/i386/
$ sudo createrepo -v /var/www/html/centos/5/i386/
$ sudo yum remove curl
$ sudo yum install curl

一応、バージョンを確認。

$ curl --version
curl 7.21.2 (i686-redhat-linux-gnu) libcurl/7.21.2 OpenSSL/0.9.8b zlib/1.2.3 libssh2/1.2.7

git RPMビルド

本題のgit RPMビルドに入る。
git も curl 同様、オフィシャルから src.rpm を取得して展開しておく。

$ wget http://kernel.org/pub/software/scm/git/RPMS/SRPMS/git-1.7.3.2-1.fc11.src.rpm
$ rpm -ivh git-1.7.3.2-1.fc11.src.rpm

git のビルドにはたくさんのパッケージ依存があってすごい大変。
そのため rpmforge も使っています。
以下に依存のあったパッケージを入れた手順を書きます。

$ sudo yum install expat-devel xmlto asciidoc perl-Error libcurl4-devel

では実際にビルドしてみます。

$ cd ~/rpmbuild/
$ rpmbuild -ba SPECS/git.spec

うまくいけば ~/rpmbuild/SRPMS/, ~/rpmbuild/RPMS/i386/ に RPM が出来ているので、上記curlの時と同様に /var/www/html/centos/5/i386/ にコピーして createrepo を実行すれば git-http-push が実行できる git を RPM で入れることが出来る。

$ sudo cp ~/rpmbuild/RPMS/i386/git* /var/www/html/centos/5/i386/
$ sudo cp ~/rpmbuild/RPMS/i386/perl-Git* /var/www/html/centos/5/i386/
$ sudo createrepo -v /var/www/html/centos/5/i386/

実際にインストールしてバージョンを確認してみます。

$ yum --disablerepo=* --enablerepo=local install git
$ git --version
git version 1.7.3.2

うまくいかない場合は rpmbuild 時の並列処理がうまく処理できていない場合があるので下記のように git.spec ファイルを変更して試してみてください。

@@ -112,7 +112,7 @@
 %setup -q
 
 %build
-make %{_smp_mflags} CFLAGS="$RPM_OPT_FLAGS" \
+make CFLAGS="$RPM_OPT_FLAGS" \
      %{path_settings} \
      all %{!?_without_docs: doc}

まとめ

今回はcurl, gitいずれもオフィシャルでsrc.rpmを提供していてspecを自分で書く必要がなかったのでなんとか無事にRPMビルドすることが出来た。
src.rpmを提供しているもののビルド方法として次回はMySQLRPMビルドを書こうと思う。