[Ansible] CentOS 6.4 x86_64用のcheckinstallのrpmを作成するplaybook

playbookはこちらです。checkinstallというroleになっています。
https://github.com/hnakamur/ansible-playbooks/tree/master/roles/checkinstall

[64bit 版 CentOS での CheckInstall 導入方法 - akishin999の日記](http://d.hatena.ne.jp/akishin999/20130220/1361316887)を参考にさせて頂きました。ありがとうございます。

akisin999さんの記事を参考にしつつ、さらに変更しています。

- インストール先プレフィクスは/usr/localではなく/usrとしています。
- 設定ファイルcheckinstallrcの場所は/usr/local/libではなく/etcとしています。

使用しているcheckinstallのソースはgitレポジトリの
http://checkinstall.izto.org/checkinstall.git
の最新版です。http://asic-linux.com.mx/~izto/checkinstall/download.php にある1.6.2の後にいくつか修正が入っています。

以下はplaybookを作るときに試行錯誤した対応のメモです。

## lib64問題の対応について

x86_64環境でもMakefileのLIBDIRが/usr/local/lib/になってしまうため、installwatch.soが/usr/local/lib64/ではなく/usr/local/lib/に入ってしまうという問題がありました。インストール後シンボリックリンクで凌ぐという手もあるのですが、これだとcheckinstallのrpmアンインストール時に残ってしまうのが残念です。

## checkinstallのオプション引数の後にはインストールコマンドを指定できる

checkinstallのbashスクリプトを読んでみると、オプション引数の後にインストールコマンドを指定できることがわかりました。何も指定しないとmake installになります。

```bash:checkinstall
INSTALLCMD=("$@")
[ -z "${INSTALLCMD[*]}" ] && INSTALLCMD=(make install)
```

そこで、make install時とcheckinstallの実行時にLIBDIR=/usr/lib64と指定するとinstallwatch.soのインストール先が/usr/lib64になりました。実際には以下のようにPREFIXとCONFDIRも指定しています。

```
$ sudo make install PREFIX=/usr LIBDIR=/usr/lib64 CONFDIR=/etc
$ sudo /usr/sbin/checkinstall -R --nodoc --pkgversion=1.6.2.20110309 -y \
    make install PREFIX=/usr LIBDIR=/usr/lib64 CONFDIR=/etc
```

## パスがあっているのにLD_PRELOADでエラーになる問題

上の対応で解決かと思いきや、checkinstall時に以下のエラーが出て生成されたrpmに /usr/local/lib64/installwatch.so が含まれないという問題が置きました。

```
ERROR: ld.so: object '/usr/local/lib64/installwatch.so' from LD_PRELOAD cannot be preloaded: ignored.
```

installwatch/Makefileを見てみると、既にファイルがある場合は一旦消してからinstallコマンドを実行しています。おそらくこのためにinstall実行時に/usr/local/lib64/installwatch.soが読み込めないのでエラーになっているようです。

```installwatch/Makefile
        if [ -r $(LIBDIR)/installwatch.so ]; then \
                rm -f  $(LIBDIR)/installwatch.so; \
        fi
        install installwatch.so $(LIBDIR)
```

そこでLD_PRELOADでソースディレクトリのinstallwatch.soを指定してcheckinstallを実行するようにしたところ、問題は解決しました。

```
$ env LD_PRELOAD=/usr/local/src/checkinstall/installwatch/installwatch.so \
   sudo /usr/sbin/checkinstall -R --nodoc --pkgversion=1.6.2.20110309 -y \
    make install PREFIX=/usr LIBDIR=/usr/lib64 CONFDIR=/etc
```


## checkinstallrcがファイルリストに含まれない問題

作成されたrpmを```rpm -ql /root/rpmbuild/x86_64/RPMS/checkinstall-1.6.2.20110309-1.x86_64.rpm```で調べると、checkinstallrcが含まれていませんでした。

checkinstallのソースのトップディレクトリのMakefileを見ると、checkinstallrcはソースディレクトリからinstallコマンドでインストールするのではなく、インストール後のcheckinstallrc-distをコピーして作っていました。詳しく調査はしていないですが、こういう場合はcheckinstallのウォッチ対象にならないようです。

デフォルトの設定を変更したいということもあるので、checkinstallrc-distを編集したcheckinstallrcを作ってそちらをインストールするようにしました。

```checkinstallrc.filename.patch
--- checkinstall/Makefile.orig  2013-09-07 02:25:03.299661612 +0900
+++ checkinstall/Makefile 2013-09-07 02:25:22.018245380 +0900
@@ -36,23 +36,7 @@
  done
                                                                                
  mkdir -p $(CONFDIR)
- install -m644  checkinstallrc-dist $(CONFDIR)
- if ! [ -f $(CONFDIR)/checkinstallrc ]; then \
-   cp $(CONFDIR)/checkinstallrc-dist $(CONFDIR)/checkinstallrc; \
- else \
-   echo; \
-   echo; \
-   echo ======================================================== ;\
-   echo; \
-   echo An existing checkinstallrc file has been found. ;\
-   echo The one from this distribution can be found at: ; \
-   echo; \
-   echo -e \\t$(CONFDIR)/checkinstallrc-dist ; \
-   echo; \
-   echo; \
-   echo ======================================================== ;\
-   echo; \
- fi
+ install -m644  checkinstallrc $(CONFDIR)/checkinstallrc

 clean:
  for file in locale/checkinstall-*.mo ; do \
```

一旦rpmにしてしまえば、インストール時に設定ファイルがある場合は.rpmsaveの拡張子付きで保存されるはずなので、問題無いと思います。