理想未来ってなんやねん

娘可愛い。お父さん頑張る。

CentOS 6.xにCheckInstallをインストール、RPMを生成する際のコツ

CentOS 6.xにCheckInstallをインストールした時のメモ。
CheckInstall自身のRPMを作る方法も含めて、少しコツがあったのでメモとして残しておきます。
タイトルはCentOS 6.xと記載していますが、CentOS 5.xにも通用します。

CheckInstallとは

その前にCheckInstallとは何なのかについて。
CheckInstall は、.spec ファイルが無くても tarball から RPM を生成してくれるというツール。
.spec はCheckInstallが自動作成しインストールしてくれます。
RPMの他、Slackware,Debian用パッケージも生成できます。

インストール

gitでソースを取得する

まずソースをgitで取得します。
CheckInstallのソースは『CheckInstall download page』からもダウンロードできますが、CentOS 6.xにインストールする場合、
サイトにあるcheckinstall-1.6.2.tar.gzをダウンロードしてインストールしても失敗してしまいます。
この問題はgitリポジトリにある最新版ででは解決されています。

$ git clone http://checkinstall.izto.org/checkinstall.git
$ cd checkinstall
ライブラリのインストール先ディレクトリの調整

次にライブラリのインストール先ディレクトリを調整します。
64bit版のLinuxを使う場合は、『64bit版のライブラリのインストール先について - 理想未来はどうなった?』に記載の通り、lib64ディレクトリにインストールする必要がありますが、checkinstallがインストールするinstallwatch.soがinstallwatch/Makefileで$(PREFIX)/libにインストールされるように記述されている調整が必要になります。


修正箇所は下記の通り。

--- installwatch/Makefile     2012-09-16 11:04:18.013010783 -0400
+++ installwatch/Makefile_new     2012-09-16 11:05:53.673010843 -0400
@@ -11,7 +11,12 @@
 VERSION=0.7.0beta7
 
 BINDIR=$(PREFIX)/bin
-LIBDIR=$(PREFIX)/lib
+LBITS := $(shell getconf LONG_BIT)
+ifeq ($(LBITS),64)
+     LIBDIR=$(PREFIX)/lib64
+else
+     LIBDIR=$(PREFIX)/lib
+endif
 
 all: installwatch.so

64bitかどうかを判別してディレクトリを変えているので、32bit版であっても問題なく動作します。

checkinstallrc-distの修正

次に『Fedora12にcheckinstallをインストールする - 科学と非科学の迷宮』を参考にcheckinstallrc-distを調整します。
INSTYPEもRPMしか作らないので、RPM固定にしてしまいました。

MAKEPKG=
INSTYPE="R"
TRANSLATE=0
EXCLUDE="/selinux"

以下、変更した箇所のdiffです。

--- checkinstallrc-dist     2012-09-16 11:04:18.012010663 -0400
+++ checkinstallrc-dist_new     2012-09-16 11:14:23.895013969 -0400
@@ -23,7 +23,7 @@
 # included with checkinstall. If you want to use Slackware's native "makepkg"
 # then set this to "makepkg"
 
-MAKEPKG=/sbin/makepkg
+MAKEPKG=
 
 # makepkg optional flags. These are recommended if running a newer Slackware
 # version: "-l y -c n"
@@ -49,7 +49,7 @@
 #   R : RPM
 #   D : Debian
 
-INSTYPE=""
+INSTYPE="R"
 
 # Storage directory for newly created packages
 # By default they will be stored at the default
@@ -108,7 +108,7 @@
 AUTODOINST=1
 
 # Are we going to use filesystem translation?
-TRANSLATE=1           
+TRANSLATE=0           
 
 # Reset the owner/group of all files to root.root?
 RESET_UIDS=0              
@@ -117,7 +117,7 @@
 NEW_SLACK=1
 
 # Comma delimited list of files/directories to be ignored
-EXCLUDE=""
+EXCLUDE="/selinux"
 
 # Accept default values for all questions?
 ACCEPT_DEFAULT=0

一度目のインストール

この状態で一度、makeしてインストールします。

$ make
$ sudo make install

以上でインストール終了。
RPMを作成しない場合は、ここで終了です。

CheckInstallRPMを生成する

次にCheckInstallRPMの生成方法について。
まず/root/rpmbuild/SOURCESディレクトリが必要になるため作成しておきます。

$ sudo mkdir -p /root/rpmbuild/SOURCES


次にcheckinstall を実行します。
ここでは --review-spec オプションをつけて実行します。理由は後述します。

$ sudo /usr/local/sbin/checkinstall --review-spec

checkinstall 1.6.3, Copyright 2010 Felipe Eduardo Sanchez Diaz Duran
           このソフトウェアはGNU GPLの下でリリースしています。

The checkinstallrc file was not found at:
/usr/local/sbin/../checkinstallrc

デフォルトの内容を使うものとします

The package documentation directory ./doc-pak does not exist.
Should I create a default set of package docs?  [y]: 


通常であれば、Enterを入力して次に進みます。
ここで1つ工夫があります。


checkinstallMakefileの中に、下記のような記載があります。

〜〜〜中略〜〜〜
install: all
〜〜〜中略〜〜〜
        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
〜〜〜中略〜〜〜


上記の処理をみると、$(CONFDIR)/checkinstallrc がある事をチェックして、$(CONFDIR)/checkinstallrc-dist $(CONFDIR)/checkinstallrcをコピーするかどうかを決めています。
$(CONFDIR)/checkinstallrc は最初のインストールでインストールされているため存在している状態になっています。
その為、elseに分岐するようになっておりinstallwatchでインストールされたことを検知できません。


上記を避けるためにCTRL+zを入力して、一時中断します。

〜〜〜中略〜〜〜
Should I create a default set of package docs?  [y]: ^Z
[1]+  停止                  sudo /usr/local/sbin/checkinstall


ここで一度 /usr/local/lib/checkinstall/checkinstallrc を削除し、fgコマンドで停止したcheckinstallプロセスに戻ります。

$ sudo rm -f /usr/local/lib/checkinstall/checkinstallrc
$ fg
sudo /usr/local/sbin/checkinstall --review-spec


あとはEnterキーを入力して処理を続けます。

sudo /usr/local/sbin/checkinstall


パッケージのドキュメンテーションを準備..OK

使用するパッケージ方式を選んでください。
Slackwareなら[S], RPMなら[R], Debianなら[D]を入力R


**************************************
**** RPM package creation selected ***
**************************************

このパッケージは以下の内容で構成されます:

1 -  Summary: [ CheckInstall installations tracker, version 1.6.2 ]
2 -  Name:    [ checkinstall ]
3 -  Version: [ 20120916 ]
4 -  Release: [ 1 ]
5 -  License: [ GPL ]
6 -  Group:   [ Applications/System ]
7 -  Architecture: [ x86_64 ]
8 -  Source location: [ checkinstall ]
9 -  Alternate source location: [  ]
10 - Requires: [  ]
11 - Provides: [ checkinstall ]

変更するものの番号を入力してください。Enterで続行します:


ここもEnterで続行します。

.specファイルの編集

次に.specファイルの編集に移ります。

〜〜〜中略〜〜〜
tempディレクトリにファイルをコピー..OK

Stripping ELF binaries...OK

manページを圧縮..OK

ファイルリストを作成..OK

You requested to review the .spec file for this package.
Now you'll have the chance to review and optionally modify this file.

Enterキーを押すと続けます。


ここでEnterキーを押すと、.specファイルの編集画面に移ります。
先ほど削除した /usr/local/lib/checkinstall/checkinstallrc が下記のように記録されていることを確認します。

"//usr/local/lib/checkinstall/checkinstallrc"


上記行を変更し、ファイルが存在した場合に削除されないように下記の通り変更します。

%config(noreplace) /usr/local/lib/checkinstall/checkinstallrc


これにより変更した場合などでアンインストールした場合には .rpmsave ファイルが生成され、
既にファイルが存在した時に、新しいバージョンをインストールした場合には上書きせずに .rpmnew ファイルが生成されるようになります。


書き込んで継続すると、/root/rpmbuild/RPMS/x86_64/ 以下にRPMが生成されます。

$ sudo ls /root/rpmbuild/RPMS/x86_64/
checkinstall-20120916-1.x86_64.rpm

インストールテスト

実際にRPMが意図した通りに生成されているか確認します。
テストの為、敢えてcheckinstallrc編集します。

$ sudo vim /usr/local/lib/checkinstall/checkinstallrc

改行を追加するなどして適当に変更し保存し、rpmコマンドによりcheckinstallをアンインストールします。

$ sudo rpm -e checkinstall
警告: /usr/local/lib/checkinstall/checkinstallrc は /usr/local/lib/checkinstall/checkinstallrc.rpmsave として保存されました。

正しくcheckinstallrc.rpmsaveとして保存されることが確認できました。
次にインストールした時に、checkinstallrc.rpmnewができる事を確認します。

保存されたcheckinstallrc.rpmsaveをcheckinstallrcに変更しcheckinstallをインストールします。

$ sudo mv /usr/local/lib/checkinstall/checkinstallrc.rpmsave /usr/local/lib/checkinstall/checkinstallrc
$ sudo rpm -ivh /root/rpmbuild/RPMS/x86_64/checkinstall-*.x86_64.rpm
準備中...                ########################################### [100%]
   1:checkinstall           警告: /usr/local/lib/checkinstall/checkinstallrc は /usr/local/lib/checkinstall/checkinstallrc.rpmnew として作成されました。
########################################### [100%]

.rpmnew も問題なく作成できました。
以上、何かのお役に立てれば幸いです。