rpmの作り方(rpmbuild/checkinstall/fpm)とrpmレポジトリの作り方

# 概要

rpmを作る方法の備忘ログです。
srpmファイルがある場合はrpmbuildで作ります。
make installするものはcheckinstallとかfpmを使って作ります。
いずれもrpmだけじゃなくてdebも作れるけど紹介しません。
おまけでrpmレポジトリの立て方も紹介します。
自分でSPECファイルを一から書く方法は紹介しません。

# specファイルがある場合

* 必要に応じてrpmbuild等の必要なパッケージをyumでインストールします。

```bash:
yum -y install rpmbuild gcc gcc-c++ glibc glibc-devel
```
* srpm(src.rpm)ファイル入手します。
* srpmファイルをインストールします。
(srpmから直接rpmをビルドすることもできますが、SPECファイルを修正する必要がある場合等にはsrpmをインストールする必要があります)

```bash:
rpm -i hogehoge.src.rpm
```

* rpmbuildコマンドでspecファイルからrpmを作成します。
(specファイルに修正が必要な場合もあります)

```bash:
rpmbuild --bb --clean ~/rpmbuild/SPECS/hogehoge.spec
```

* 出来上がったrpmをインストールします。

```bash:
yum localinstall ~/rpmbuild/RPMS/x86_64/hogehoge.rpm
```

* ちなみに64ビットOSで32ビット版のrpmを作る場合はこんな感じでrpmbuildコマンドを叩きます。
(事前にyumでglibc-devel.i686辺りを入れておく必要があります)

```bash:
CC='gcc -m32' CXX='g++ -m32' linux32 rpmbuild --rebuild --target=i686 hogehoge.src.rpm
```

# make installするやつのrpmを作る
## checkinstall

[checkinstall](http://asic-linux.com.mx/~izto/checkinstall/)は昔からあるrpm作成ツールです。
最新版は2009年に出たもので最近のLinuxだと動かないこともあるようですが、CentOS6.5では普通に動きました。

* まずは必要なパッケージをインストールします。

```bash:
yum -y install make gcc rpm-build gettext git
```

* gitレポジトリからchekinstallを落としてきます。

```bash:
git clone http://checkinstall.izto.org/checkinstall.git
```

* checkinstallをインストールします。
残念ながら最初はmake install叩くしか無いです。

```bash:
cd checkinstall
make
sudo make install
```

* soファイルを64ビット版のlibディレクトリに移します(シンボリックリンク)。

```bash:
sudo ln -s /usr/local/lib/installwatch.so /usr/local/lib64/installwatch.so
```

* Makefileのあるディレクトリでcheckinstallを叩くとrpmが出来上がります。
(実際はインタラクティブなシェルですが聞かれる内容は明らかなため省略します)

```bash:
sudo /usr/local/sbin/checkinstall
```

上記をcheckinstallのディレクトリで実行するとcheckinstall自体のrpmを作成できます。
他のrpmを作る場合はconfigureとmakeしてからcheckinstallを実行します。

## fpm

[fpm](https://github.com/jordansissel/fpm)はruby製のパッケージ作成ツールです。
ここで紹介するソースのtarボールからrpmを作る他、様々なソース(gemとかnpmとか)から様々な形式のパッケージ(debとかsolarisとか)が作れます。
新しいLinuxでも動くのでcheckinstallが動かない場合はこちらが良いと思います。

* 必要なパッケージをインストールします。

```bash:
yum -y install gcc ruby ruby-devel ruby-libs rubygems rpm-build
```

* fpmをインストールします。

```bash:
sudo gem install fpm
```

* rpm作りたいソースを入手してmake installまでします。
(普通にmake installするじゃん、とか思うかもですが場所指定でインストールするためrpm作成後はキレイに消せます)

```bash:
wget http://hogehoge.com/hogehoge.tar.gz
tar xfz hogehoge.tar.gz
cd hogehoge
./configure
make
sudo make install DESTDIR=/path/to/destdir
cd /path/to/destdir/
fpm -s dir -t rpm -n hogehoge -v 0.0.1 -C /path/to/destdir -p hogehoge-0.0.1.rpm .
```

* 出来上がったrpmをインストールします。

```bash:
sudo yum localinstall libpafe-0.0.8.rpm
```

* /path/to/destdirは消しちゃってOKです。

# (おまけ)rpmレポジトリの立て方

社内にrpmレポジトリは立てておいた方が良いですよね。
先日[こちらの記事](http://qiita.com/kiida/items/3594a25b4e2e8695e2cb)でちらっと触れましたが、例えばAnsibleとかChefで複数台のOSにパッケージをインストールする際に全ノードがインターネット上のMirrorレポジトリを見に行くのは非効率ですね。
Mirrorレポジトリだけでなく独自レポジトリも立てて置いた方が管理面・効率面でオススメです。

* 必要なパッケージのインストール

```bash:
sudo yum -y install createrepo httpd
```

* httpdをstart

```bash:
sudo service httpd start
sudo chkconfig httpd on
```

* httpdの公開ディレクトリ以下にrpmレポジトリ用のディレクトリを作成
(httpdの実行ユーザが読み取り権限を持つ必要があります)

```bash:
mkdir /var/www/html/rpmrepo/x86_64/
```

* 何かrpmを置く

```bash:
cp hogehoge.rpm /var/www/html/rpmrepo/x86_64/
```

* repositoryの作成

```bash:
createrepo /var/www/html/rpmrepo/x86_64/
```

* yum実行するマシンで以下のファイルを作成します。

```bash:/etc/yum.repos.d/hogehoge.repo
[hogehoge]
name=hogehoge-CentOS-$releasever - additional
baseurl=http://hostname/rpmrepo/$basearch/
enabled=1
gpgcheck=0
```
(hostnameは上記rpmレポジトリを作ったマシンのhost名かipです)

* これでyumを実行時に上記のレポジトリに置いたrpmが取得できます。