playbookはこちらです。checkinstallというroleになっています。
https://github.com/hnakamur/ansible-playbooks/tree/master/roles/checkinstall
64bit 版 CentOS での CheckInstall 導入方法 - akishin999の日記を参考にさせて頂きました。ありがとうございます。
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になります。
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が読み込めないのでエラーになっているようです。
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を作ってそちらをインストールするようにしました。
--- 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の拡張子付きで保存されるはずなので、問題無いと思います。