RPM パッケージの作り方

2011年1月3日

はじめに

ソースパッケージからの RPM パッケージの作り方について。

使用バージョン

openSUSE 11.3 x86_64, RPM 4.8.0。

セットアップ

RPM パッケージを作るためのセットアップを行う。まず RPM 用のディレクトリを作成。

$ mkdir -p ~/redhat/{BUILD,RPMS,SOURCES,SPECS,SRPMS}

redhat ディレクトリのパスを ~/.rpmmacros で設定。

$ echo "%_topdir $HOME/redhat" > ~/.rpmmacros

RPM パッケージを作り始める前に

ソースパッケージの RPM パッケージを作ろうとする場合、その前に SRPM パッケージが存在していないか確認してみる。もし SRPM ファイルがあれば、以下のようにして RPM ファイルを作ることができる。

$ rpmbuild --rebuild sample-1.0.src.rpm

あるいは、ソースパッケージが SPEC ファイル (*.spec) を含む場合は、ソースパッケージから直接 RPM ファイルを作ることができる。

$ rpmbuild -tb sample-1.0.tar.gz

RPM ファイルは ~/redhat/RPMS のなかに作成される。

以上の手段が採用できない場合は、自分で SPEC ファイルを書いて RPM パッケージを作ることになる。

コンパイル

まずは RPM パッケージを作りたいソースパッケージのコンパイルを成功させる。コンパイルの手順は詳細に書き留めておく。コンパイルに必要になったライブラリなどの情報も必要。

最近のソースパッケージの多くは以下のようにコンパイルできる。

$ mkdir ~/temp
$ tar xvzf sample-1.0.tar.gz
$ cd sample-1.0
$ ./configure --prefix=$HOME/temp/usr/local
$ make
$ make install

インストールされるファイルのリストを得るために、ホームディレクトリの temp ディレクトリをルートディレクトリに見立ててインストールしている。

インストールされたファイルのリストを取得する。

$ cd
$ find temp > list

以下のようなリストが得られる。

temp
temp/usr
temp/usr/local
temp/usr/local/bin
temp/usr/local/bin/sample
...

エディタの置換機能で行頭の "temp" を削除し、手動でディレクトリの行を削除する。

SPEC ファイルを作る

RPM パッケージを作るためには SPEC ファイルが必要である。SPEC ファイルは ~/redhat/SPECS に作る。たとえばつぎのようなものである。

sample.spec

Name: sample
Summary: This is sample
Version: 1.0
Release: 1.0
License: GPL
Group:   Productivity/Graphics/3D Editors
Source: %name-%version.tar.gz
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root
BuildRequires: make autoconf automake gcc gcc-c++

%description
SAMPLE is a sample source package for an exercise building RPM package.

%prep
%setup

%build
./configure --prefix=$RPM_BUILD_ROOT/usr/local
make

%install
make install

%clean
rm -rf $RPM_BUILD_ROOT

%files
/usr/local/bin/sample
/usr/local/lib/libsample.so
Nameパッケージ名
Summaryパッケージの概要
Versionソースパッケージのバージョン
ReleaseRPM パッケージのリリース番号
Licenseライセンス
Groupパッケージが属するグループ
Sourceソースパッケージ
BuildRootビルドの際のルートディレクトリ
BuildRequiresビルドに必要なパッケージ

%descriptionパッケージの詳細を記述
%prepパッケージ作成の準備作業を記述
%setupソースパッケージを展開後その中に移動
%buildビルドの手順を記述
%installインストールの手順を記述
%clean後始末の手順を記述
%filesパッケージに含まれるファイルのリスト

"%files" 以下に前もって作っておいたファイルのリストを挿入する。

"Group" に何を書いたらよいのかで迷うかもしれない。これはディストリビューションにより異なる。openSUSE の場合は YaST の "ソフトウエア管理" の "RPM グループ" を参考にすればよい。関連する既存の SRPM ファイル (バージョン違いの同パッケージなど) の SPEC ファイルを参考にするのが早い。

既存の SRPM ファイルの SPEC ファイルを参考にしたい場合は、つぎのようにして SRPM ファイルをインストールする。

$ rpm -i sample-0.9-1.0.src.rpm

~/redhat/SPECS に SPEC ファイル (上の場合たぶん "sample.spec") がインストールされる。

RPM パッケージを作る

ソースパッケージを ~/redhat/SOURCES に入れる。

$ cp sample-1.0-1.0.rpm ~/redhat/SOURCES

つぎのようにして SPEC ファイルから RPM ファイルを作成できる。

$ rpmbuild -bb sample.spec

RPM ファイルは ~/redhat/RPMS の中に作成される。RPM パッケージと SRPM パッケージを同時に作りたい場合はつぎのようにする。

$ rpmbuild -ba sample.spec

SRPM ファイルは ~/redhat/SRPMS の中にできる。SRPM ファイルだけ作りたい場合はオプション "-ba" の代わりに "-bs" を指定すればよい。

CheckInstall を使う

CheckInstall というものを使えば、もっと簡単に RPM パッケージを作成できる (openSUSE であれば YaST の "ソフトウエア管理" でインストール可能)。以下は Netgen 4.9.13 の RPM ファイルを CheckInstall で作成した例である。configure 実行後、checkinstall を実行している。

$ cd netgen-4.9.13
$ ./configure \
    --with-tcl=/usr/lib64 \
    --with-tk=/usr/lib64 \
    --enable-occ --with-occ=/opt/OpenCASCADE \
    --enable-nglib \
    --enable-jpeglib \
    --prefix=/usr/local \
    --libdir=/usr/local/lib64

...

$ /usr/sbin/checkinstall 

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


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

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

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

このパッケージの説明を書いてください
説明の末尾は空行かEOFにしてください。
>>  (Enter を入力)

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

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

1 -  Summary: [ Package created with checkinstall 1.6.2 ]
2 -  Name:    [ netgen ]
3 -  Version: [ 4.9.13 ]
4 -  Release: [ 1 ]
5 -  License: [ GPL ]
6 -  Group:   [ Applications/System ]
7 -  Architecture: [ x86_64 ]
8 -  Source location: [ netgen-4.9.13 ]
9 -  Alternate source location: [  ]
10 - Requires: [  ]
11 - Provides: [ netgen ]

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

...  (コンパイルが実行される)

**********************************************************************

 Done. The new package has been saved to

 /home/adelie/redhat/RPMS/x86_64/netgen-4.9.13-1.x86_64.rpm
 You can install it in your system anytime using: 

      rpm -i netgen-4.9.13-1.x86_64.rpm

**********************************************************************

これで ~/redhat/RPMS 以下に RPM ファイルができる。SPEC ファイルを用意する必要はない。