カテゴリー
Linux

RPM パッケージの作成方法

RPM (Redhat Package Manager) はレッドハット社の開発したパッケージ管理ツールで、通常はバイナリをインストールするのに使用しますが、ソースファイルからバイナリ、パッケージをビルドするソースRPMもあります。Linux のディストリビューションが提供する機能の一部を変更するために、そのソースに手を入れて、RPMパッケージを再ビルドして、配布するということもできます。

RPMビルド開発環境の準備

Redhat 系 Linux ディストリをインストールする際にインストールタイプを選択する機会がありますここで、「ワークステーション」インストールを選択した場合は特に準備は必要ありません。

「デスクトップ」や他のオプションでインストールした場合は、開発ツールを別途インストールする必要があります。

# yum groupinstall 開発ツール
# yum install rpm-build

上記2つ(もしくは最初の1つ)をインストールするとビルドに必要なものがそろうはずです。

ソースRPM (SRPM) の入手

Linux ディストリの公開されているSRPMからカスタマイズしたいパッケージを入手します。

例えば、Scientific Linux 6.0 の場合:

https://ftp1.scientificlinux.org/linux/scientific/6.0/SRPMS/

にあります。

ここでは、gnome-panel パッケージを入手して試してみます。

# wget https://ftp1.scientificlinux.org/linux/scientific/6.0/SRPMS/vendor/gnome-panel-2.30.2-5.el6.src.rpm

ソースRPM (SRPM) の展開

入手した gnome-panel のソースRPMを展開してみます。
展開するには書きコマンドを実行します:

# rpm -i gnome-panel-2.30.2-5.el6.src.rpm

既定ではユーザーのホームディレクトリに展開され、~/rpmbuild フォルダができているかと思います。さらにその下に:

  • SOURCES
  • SPECS

ができています。

SOURCES には元になるソースの圧縮ファイル gnome-panel-2.30.2.tar.bz2 で格納され、さらに差分がパッチ (*.patch) ファイルが格納されています。

SPECS にはパッケージ作成用の仕様書(spec ファイル)が格納されています。

ソースRPM (SRPM) の構築(ビルド)

まずは、変更を加える前にソースRPMをビルドしてRPMを作成してみます。

# cd ~/rpmbuild
# rpmbuild -bc SPECS/gnome-panel.spec

上記コマンドを実行します:

エラー: ビルド依存性の失敗:
libwnck-devel >= 2.19.5 は gnome-panel-2.30.2-5.el6.i686 に必要とされています
gnome-menus-devel >= 2.27.92 は gnome-panel-2.30.2-5.el6.i686 に必要とされています
NetworkManager-devel は gnome-panel-2.30.2-5.el6.i686 に必要とされています

ビルド依存性の失敗というエラーになりました。不足している上記3つのモジュールをインストールします。

# su -c 'yum install libwnck-devel gnome-menus-devel NetworkManager-devel'

いろいろ依存関係がチェックされ、Complete! と表示されたらOKです。
再度、rpmbuild を実行します。

# rpmbuild -bc SPECS/gnome-panel.spec

ビルドが完了すると ~/rpmbuild ディレクトリの下にさらに下記のディレクトリが作成されてます。

  • BUILD
  • RPMS/i686
  • SRPMS

BUILD には SOURCES のソースが展開され、各パッチがあてられmakeが行われるディレクトリです。

RPMS/i686 には完成したバイナリパッケージ(*.rpm)が置かれます。

ソースの改変/パッチファイルの作成

ソースを改変は、改変対象の機能のオリジナルのソースを改変して、その差分をパッチ形式でビルドできるようにする必要があります。

例えば、gnome-panel/foo.c という名前のファイルがあるとしたら、gnome-panel.org/foo.c という名前のディレクトリにコピーして改変します。次にオリジナルとの差分をパッチとして、再ビルドすればよいことになります。

# diff -u gnome-panel/foo.c gnome-panel.org/foo.c > ~/rpmbuild/SOURCES/foo.patch

パッケージ作成用の仕様書 (SPEC) の作成

SPEC ファイルには、パッケージ情報や、rpm や src.rpm の作成方法が記述されています。

ここでは、一からSPECファイルを記述するのではなくて、すでにある spec ファイルに作成したパッチを当てることをします。

~/rpmbuild/SPEC/gnome-panel.spec というファイルを見ます。

ずらずらとみていくと、SourceX や PatchX (X は数字)と書かれている行があると思います。ここに SourceX はベースとなるソースファイルを記述して、 PatchX にはパッチファイルを記述します。

もともと存在していたソースファイルを改変した場合には SourceX は記述の必要はありません。PatchX を追記します。

例えば:

Patch101:foo.patchBuildRoot: の前(上の行) へ追記します。次に %changelog という行を探して、パッケージの更新履歴を追記します。

最新の更新情報が上にくるように書きます。また、英語で書くの方がよさそうです。

* Fri May 20 2011 mznetlab
- Created foo patch
- See source and patch for more detail

ソースRPM (SRPM) の最構築

ここまで、ひととおりソースRPMの入手から、ソースの改変、パッチ作成、SPECの変更までをやってみました。

変更したソースを反映したRPMを作成するには、再度 rpmbuild で spec ファイルを rpmbuild します。

# rpmbuild -bc SPECS/gnome-panel.spec

RPMS/i686 に更新されたたバイナリパッケージ(*.rpm) ができます。