地球流体電脳倶楽部謹製 RPM パッケージの作成

担当: 神代 剛 <2010-03-09 地球流体データ解析・数値計算実習 (dcmodel/davis チュートリアル) 実習資料>



はじめに

RPM (RPM Package Manager) とは, 元は Red Hat Package Manager という名前で, その名のとおり Red Hat Linux のソフトウェアパッケージを管理するシステムとして開発されました. RPM を採用する Linux ディストリビューションは多く, Debian パッケージとともに Linux パッケージ管理システムのデファクトスタンダードと言えるものです.

地球流体電脳倶楽部では, RPM 系 Linux のうち, フリーでかつ(特に日本で)ユーザが多いと思われる Vine Linux, Fedora, CentOS の3つについて, 開発ソフトウェアの RPM パッケージを作成して公開しています(「地球流体電脳倶楽部謹製 RPM パッケージ」). ここでは DCL を例に, 我々の RPM パッケージの作成方法を簡単に紹介します. CentOS 5 (i386) の環境で説明を進めていきますが, Fedora 12, Vine Linux 5, あるいは x86_64 の環境についても適宜コメントします.

準備

最初に, RPM 開発環境をインストールします. rpm-build というパッケージが必要です.

% rpm -q rpm-build

として確認してください. まだ入っていなければ yum (Vine は apt) でインストールしましょう. 関連するパッケージも芋蔓式にインストールされます.

次に, 作業ディレクトリを用意します. デフォルトでは /usr/src/redhat になっており root 権限が必要ですが, 開発作業は一般ユーザでやるほうがいいので, $HOME/rpm に設定することにします.

% echo "%_topdir $HOME/rpm" > $HOME/.rpmmacros

として設定ファイルを作りましょう. 続いて, $HOME/rpm 以下に次のようにサブディレクトリを作ってください:

% mkdir -p $HOME/rpm/BUILD
% mkdir -p $HOME/rpm/RPMS/i386
% mkdir -p $HOME/rpm/RPMS/noarch
% mkdir -p $HOME/rpm/SOURCES
% mkdir -p $HOME/rpm/SPECS
% mkdir -p $HOME/rpm/SRPMS

x86_64 の環境では, 上記 i386 を x86_64 としてください. なお, Vine Linux では最初からこれらの環境が整っていると思います. Fedora の場合は, デフォルトの作業ディレクトリが $HOME/rpmbuild になっており, かつ, あとで必要なときに自動的に掘られるようになっているので, ここでの設定は不要です.

ソースパッケージのインストール

RPM パッケージを一から作成するのは大変なので, まずはすでに作成済のソースパッケージの中身を眺めてみましょう.

rpm コマンドや yum, apt でインストールするのはコンパイル済みのバイナリパッケージですが, これを作る際に, オリジナルのソースコードや修正パッチ, 設定ファイルをまとめてパッケージ化した, ソースパッケージ (SRPM) も同時に作ることができます.

DCL の SRPM (dcl-5.3.3-4dc.rpm) をダウンロードして, インストールしてみましょう:

% rpm -i dcl-5.3.3-4dc.src.rpm

すると, さきほど作成した $HOME/rpm/SOURCES 以下にオリジナルのソースコードや修正パッチが, $HOME/rpm/SPECS 以下に RPM 作成の設定ファイルである SPEC ファイルが, それぞれ配置されます.

SPEC ファイルの記述

RPM パッケージでは, SPEC ファイルにビルドするための設定がすべて書かれています. 要するに, このファイルさえ書けるようになれば, RPM パッケージを作れるようになれるというわけです.

DCL の SPEC ファイルは以下のようになっています:

Name: dcl
Summary: GFD-Dennou Club Libraries (DCL)
Version: 5.3.3
Release: 4dc

License: GPLv2+
Group: Development/Libraries
URL: http://www.gfd-dennou.org/library/dcl/
Source0: http://www.gfd-dennou.org/library/dcl/dcl-%{version}.tar.gz
Source1: http://www.gfd-dennou.org/member/koshiro/comp/dcl/clrmap/dcl-add-clrmap-20080131.tar.gz
Patch0: dcl-5.3.3-uetonc.patch
Patch1: dcl-5.3.3-swcmll.patch

BuildRoot: %{_tmppath}/%{name}-%{version}-root
BuildRequires: gcc-gfortran gtk2-devel
Requires: gcc-gfortran gtk2 tcsh

Vendor: GFD Dennou Club


%description
    the DCL graphic library is written in Fortran77.
    What it covers are
    * viasualization of numeric data: wide variety of 1D and 2D graphics
      and limited 3D graphics
    * mathematical libralies (FFT, Ordinary differential equation solver,
      Spherical harmonics analysis etc)


%prep
rm -rf ${RPM_BUILD_ROOT}

%setup -a 1 -q
%patch0 -p1
%patch1 -p1

%build
export CC=gcc
export FC=gfortran
./configure --prefix=/usr
make LIBDIR=%{_libdir}

%install
mkdir -p ${RPM_BUILD_ROOT}
make LIBDIR=${RPM_BUILD_ROOT}%{_libdir} prefix=${RPM_BUILD_ROOT}/usr install
install -m 644 dcl-add-clrmap-20080131/cmaplist ${RPM_BUILD_ROOT}%{_libdir}/dcldbase/
install -m 644 dcl-add-clrmap-20080131/colormap_*.x11 ${RPM_BUILD_ROOT}%{_libdir}/dcldbase/

%clean
rm -rf ${RPM_BUILD_ROOT}


%files
%defattr(-,root,root)
%doc CHECK CREDITS HISTORY IMG_* INSTALL Mkinclude README* index.html demo/
%{_bindir}/*
%{_libdir}/*.a
%{_libdir}/dcldbase/


%changelog
* Tue Feb 23 2010 KOSHIRO Tsuyoshi <koshiro@gfd-dennou.org> - 5.3.3-4dc
- License: GPLv2+
- Vendor: GFD Dennou Club
- Patches: dcl-5.3.3-uetonc.patch, dcl-5.3.3-swcmll.patch
- Add additional colormaps
- Add tcsh to Requires

* Sun Dec  9 2007 KOSHIRO Tsuyoshi <koshiro@gfd-dennou.org> - 5.3.3-3dc
- minor change for the detection of the distribution

* Tue Jun 12 2007 KOSHIRO Tsuyoshi <koshiro@gfd-dennou.org> - 5.3.3-2dc
- Debugged conditional branches (%if ~ %endif)

* Wed May 23 2007 KOSHIRO Tsuyoshi <koshiro@gfd-dennou.org> - 5.3.3-1dc
- initial package

SPEC ファイルの書き方については, Project Vine による 「RPMパッケージの作成方法」 のページに非常にわかりやすく(日本語で!)まとめられています. 詳しくはそちらを見ていただくとして, ここでは簡単に概要のみ説明します.

SPEC ファイルは, 大きくわけて「パッケージ情報」「スクリプト」「ファイルリスト」「更新履歴」の4つのパートがあります. 順に見ていきます.

パッケージ情報部

最初のほうにはパッケージ名や簡単な内容など, 基本的な情報が書いてあります. Version はソフトウェアのバージョン, Release は RPM パッケージとしてのリリース番号です. 電脳倶楽部謹製という意味で, Release の頭に "dc" をつけるようにしています. 作成される RPM パッケージのファイル名は [Name]-[Version]-[Release].i386.rpm となります. なお, このように定義した値は %{name}, %{version} といったかたちで下で参照できるようになります.

次がビルドするソースについての記述です. Source がソースコード, Patch がそれに適用する修正パッチです. この RPM では, Source0 に記述しているオリジナルのソースコードそのままではなく, UETONC の欠損値処理のバグ修正パッチ [dcdvlop:2007/07/14] (Patch0) および 追加カラーマップ (Source1) とそれを使うための修正パッチ (Patch1) を適用してパッケージ化しています.

BuildRoot は仮想インストールディレクトリ名です. マクロで書かれていますので, どんなソフトウェアでも基本的に共通の記述です. まぁそんなものだと思ってください. ここで指定したディレクトリは, 下で ${RPM_BUILD_ROOT} という名前で参照されます.

BuildRequires, Requires では外部パッケージとの依存関係を定義します. BuildRequires はビルド時に必要なパッケージ, Requires は作成したバイナリパッケージインストール後, ソフトウェアを使用する際に必要なパッケージです. DCLの場合, ビルド時は, Fortran コンパイラが必要なのと, 出力装置番号 4 の GTK を使えるようにしたいので, gcc-gfortran と GTK2 の開発パッケージ gtk2-devel を BuildRequires に指定します. 使用時は, やはり gcc-gfortran と, GTK2ライブラリ gtk2, それに一部コマンドが csh スクリプトになっているので tcsh が必要です. これらを Requires に指定します. ここが適切に書かれていないと, 他の環境に持っていってリビルドしようと思ったときに依存関係を解決するのに苦労することになりますので, 非常に重要な部分です.

最後に, Vendor はこの RPM パッケージの作成・配布元(ここでは地球流体電脳倶楽部), %description はソフトウェアの詳細な記述です.

このパートの情報は,

% rpm -qpi (RPMパッケージのファイル名)

あるいは, インストール後であれば

% rpm -qi (RPMパッケージ名)

といったコマンドでバイナリパッケージ作成後に確認できるようになります.

スクリプト部

実際のパッケージの作成手順を記述する部分です.

の各セクションにわかれています.

%prep では, まず仮想インストールディレクトリの掃除をして, %setup で SOURCE0, SOURCE1 を作業ディレクトリ $HOME/rpm/BUILD に展開し, 展開したディレクトリに移動, %patch0, %patch1 で Patch0, Patch1 をそれぞれあてています. %setup の "-a 1" は, まず SOURCE0 を展開したあと, 展開先に cd してその中で SOURCE1 を展開するというオプション, "-q" は, ソース展開中の情報を表示しないというオプションです.

%build では, 環境によって異なるコンパイラが使われることを防ぐために CC, FC の環境変数で C および Fortran コンパイラを陽に指定してから, configure, make をおこなっています.

%install では, 仮想インストールディレクトリにインストールされるようにインストール先を指定して make install をおこない, 追加カラーマップをあとからインストールしています.

%check は, この例では省略しています. make check が用意されているソフトウェアの場合は, 記述しておくとベターだと思います.

このあとパッケージが構築され, %clean で仮想インストールディレクトリの掃除して終わり, という手順になります.

ファイルリスト部

%files のところから, RPMパッケージに収録するファイル名を列挙する部分が始まります.

%defattr は, mode, owner, group の属性のデフォルトを決める部分です. 普通はこの記述のように書けばいいでしょう. %doc は, ドキュメントとしてパッケージに含めたいファイルを指定する部分で, ここに指定されたファイルやディレクトリは ${RPM_BUILD_ROOT}/usr/share/doc/%{name}-%{version}/ に自動的にコピーされるようになっています. それ以降は, パッケージに収録するファイルの列挙です. ここに書いてあるファイルが ${RPM_BUILD_ROOT} 以下になかったり, 逆に書いてないファイルが ${RPM_BUILD_ROOT} 以下にあったりすると, エラーになってパッケージの作成が中止されるようになっています.

更新履歴部

%changelog 以下はパッケージの更新履歴を記述する部分です. 最新の更新情報が上にくるように, 英語で記述します. ある程度フォーマットが決まっていますので, Vine Linux や Fedora, CentOS のオフィシャルパッケージでの記述にしたがって書いています.

* * * * * * * *

以上で説明は終わりです.

このままでは面白くないので, SPEC ファイルを少し変更してみましょう. DCL に新しい描画ルーチン UETONB を追加するパッチ dcl-5.3.3-uetonb.patch (ここで公開しています) を追加します. SPECファイルは以下のようになります.

Name: dcl
Summary: GFD-Dennou Club Libraries (DCL)
Version: 5.3.3
Release: 4dc1

License: GPLv2+
Group: Development/Libraries
URL: http://www.gfd-dennou.org/library/dcl/
Source0: http://www.gfd-dennou.org/library/dcl/dcl-%{version}.tar.gz
Source1: http://www.gfd-dennou.org/member/koshiro/comp/dcl/clrmap/dcl-add-clrmap-20080131.tar.gz
Patch0: dcl-5.3.3-uetonc.patch
Patch1: dcl-5.3.3-swcmll.patch
Patch2: dcl-5.3.3-uetonb.patch

BuildRoot: %{_tmppath}/%{name}-%{version}-root
BuildRequires: gcc-gfortran gtk2-devel
Requires: gcc-gfortran gtk2 tcsh

Vendor: GFD Dennou Club


%description
    the DCL graphic library is written in Fortran77.
    What it covers are
    * viasualization of numeric data: wide variety of 1D and 2D graphics
      and limited 3D graphics
    * mathematical libralies (FFT, Ordinary differential equation solver,
      Spherical harmonics analysis etc)


%prep
rm -rf ${RPM_BUILD_ROOT}

%setup -a 1 -q
%patch0 -p1
%patch1 -p1
%patch2 -p1

%build
export CC=gcc
export FC=gfortran
./configure --prefix=/usr
make LIBDIR=%{_libdir}

%install
mkdir -p ${RPM_BUILD_ROOT}
make LIBDIR=${RPM_BUILD_ROOT}%{_libdir} prefix=${RPM_BUILD_ROOT}/usr install
install -m 644 dcl-add-clrmap-20080131/cmaplist ${RPM_BUILD_ROOT}%{_libdir}/dcldbase/
install -m 644 dcl-add-clrmap-20080131/colormap_*.x11 ${RPM_BUILD_ROOT}%{_libdir}/dcldbase/

%clean
rm -rf ${RPM_BUILD_ROOT}


%files
%defattr(-,root,root)
%doc CHECK CREDITS HISTORY IMG_* INSTALL Mkinclude README* index.html demo/
%{_bindir}/*
%{_libdir}/*.a
%{_libdir}/dcldbase/


%changelog
* Tue Mar  9 2010 KOSHIRO Tsuyoshi <koshiro@gfd-dennou.org> - 5.3.3-4dc1
- Add dcl-5.3.3-uetonb.patch

* Tue Feb 23 2010 KOSHIRO Tsuyoshi <koshiro@gfd-dennou.org> - 5.3.3-4dc
- License: GPLv2+
- Vendor: GFD Dennou Club
- Patches: dcl-5.3.3-uetonc.patch, dcl-5.3.3-swcmll.patch
- Add additional colormaps
- Add tcsh to Requires

* Sun Dec  9 2007 KOSHIRO Tsuyoshi <koshiro@gfd-dennou.org> - 5.3.3-3dc
- minor change for the detection of the distribution

* Tue Jun 12 2007 KOSHIRO Tsuyoshi <koshiro@gfd-dennou.org> - 5.3.3-2dc
- Debugged conditional branches (%if ~ %endif)

* Wed May 23 2007 KOSHIRO Tsuyoshi <koshiro@gfd-dennou.org> - 5.3.3-1dc
- initial package

変更点は,

です.

バイナリパッケージの作成

それでは, 実際にビルドしてみましょう.

$HOME/rpm/SPECS に今編集したファイルがあると思いますから, このディレクトリで,

% rpmbuild -bb dcl.spec

としてください. -bb はバイナリパッケージを作成するオプションです. $HOME/rpm/RPMS/i386/ に dcl-5.3.3-4dc1.i386.rpm ができているはずです. -bs だと, ソースパッケージが $HOME/rpm/SRPMS/ に作成されます(-ba だと両方が作成されます). --clean を追加すると, 最後に作業ディレクトリ $HOME/rpm/BUILD/ の中を掃除してくれます. また, SPECファイルを修正せず単に SRPM をリビルドするだけの場合は, SRPM を rpm -i でインストールして展開する必要はなく, いきなり

% rpm --rebuild dcl-5.3.3-4dc.src.rpm

とすればよいです.

それではできあがったバイナリパッケージをインストールしてみましょう.

% cd ../RPMS/i386
% su
# rpm -ivh dcl-5.3.3-4dc1.i386.rpm

うまくインストールできたでしょうか.

% rpm -qi dcl

とか

% rpm -ql dcl

とかして確認してみましょう. また, /usr/share/doc/dcl-5.3.3/ に demo がインストールされていると思いますので, これでテストしてみましょう.

% cp -a /usr/share/doc/dcl-5.3.3 $HOME/
% cd $HOME/dcl-5.3.3/demo/grph2/ximage
% make
% ./ximg01

月平均オゾン全量の全球分布がうまく描けたでしょうか?

あとで追加した UETONB のテストもしてみましょう. サンプルプログラム (u2d7b.f) をダウンロードして,

% dclfrt u2d7b.f
% ./a.out

として実行してみてください. こちらもうまくできたでしょうか?

* * * * * * * *

以上で実習は終わりです. 余裕がある方は, フォントを追加するパッチ dcl-5.3.3-add_greek_fonts.patch (ここで公開しています) もありますので, これも含めて RPM パッケージを再構築してみてください.

おわりに

RPMパッケージは, 所定の場所に資源を置いてしかるべく SPEC ファイルを書くだけで, 比較的簡単に作成できます. SPEC ファイルも一から自分で作ることはほとんどなくて, 私自身は Vine Linux や Fedora, CentOS の最新版(あるいは開発版)の SRPM を取ってきて作り始めることが多いです. また, Debian など他のパッケージ管理システムでどうビルドしているかというのも大変参考になります.

ここでは紹介できませんでしたが, 地球流体電脳倶楽部では Vine Linux, Fedora, CentOS のすべてのバイナリパッケージを同じ SRPM から作成しています. ディストリビューション間の差を吸収するために if 文で分岐したりというようなテクニックを使っています. SRPMアーカイブ には DCL 以外のパッケージの SRPM も置いてありますので, それらも参考にしてください.

また, パッケージの署名についてもここでは触れませんでした. このあたりについては他の文献を参照していただければと思います.


cc-env Group / GFD Dennou Staff dcstaff@gfd-dennou.org
Last Updated: 2010/03/02, Since: 2010/03/11