Last modified: Fri Oct 6 05:48:43 JST 2000
[<<BACK] [NEXT>>]

3. RPM パッケージ

3.1 RPM とは

RPM (RedHat Package Manager) とは,RedHat社が開発したパッケージ 管理ツールです.例えば A というソフトが B というソフトを利用している とします.ある理由で B を消した場合,A は動作しなくなります. また,A,B がインストールされていない状態で,A が使いたくなった場合, A だけをインストールしても A は動作しません. このように A と B に依存関係がある場合,管理者がそのことを把握していれば 問題がないのですが,必ずしもそうとは限りません.また,単に A と B があるかないかだけではなく,A が動作するためには B のバージョンが いくつでないと駄目というような,さらに厳しい拘束条件がある場合が あります.このような条件を管理者が全て把握することは,よほどの 手練でない限り不可能に近いと思います.RPM はソフトの依存関係を 管理してくれます.

RPM でパッケージを管理するためには当然,全てを RPM 形式のパッケージに する必要があります.例えば,あるソフトのソースファイルだけがあった 場合,それをコンパイルして,インストールしてしまうと,そのソフトは 管理対象外となります.このようなソフトを増やしてしまうと,RPM の威力 が損なわれて,結局バージョンアップ時にはインストールし直しという ことになりかねません.

最近のディストリビューションの多くは,パッケージ化していないソフトの 置き場として /usr/local を用意しています.従って,パッケージを作る ことが面倒な場合,/usr/local 以下にインストールすると弊害は少くなります. しかしながら,これは消極的解決方法ですので,せっかく RPM で管理している のですから RPM パッケージを自分で作ってしまいましょう.

ちなみにもう一つの消極的解決法としてはひたすら,他の人が作ってくれた RPM パッケージを探してインストールをし,無い場合はあきらめるという 方法もあります.

3.2 RPM 作成の流れ

RPM パッケージの作成手順は

  1. 実際にコンパイルをしてみて作成手順を把握する
  2. spec ファイルを作る
  3. rpm -b コマンドによりパッケージを作成する

となります.以後それぞれの過程について説明します.

3.3 RPM の作成

3.3.1 前準備

RPM パッケージは一般ユーザーでも管理者でも作ることができます. 管理者の場合,/usr/src/redhat ディレクトリ以下が作業ディレクトリと なります.このディレクトリは最初から作られていると思います. /usr/src/redhat のサブディレクトリは以下のようになっています.

BUILD rpmパッケージをつくるときに,rpmコマンドがソースを展開したり, makeしたりするための作業に使うディレクトリ./tmpみたいな ところです.
RPMS できあがったrpmパッケージが収納されます.
SOURCES rpmパッケージをつくるのに必要なソースやパッチのデフォルトの 置場所です.また,srpmパッケージを展開したとき,ソースファイルは ここに出力されます.
SPECS srpmをrpm -ivhで展開したとき,specファイル はここに出力されます.
SRPMS できあがったsrpmパッケージが収納されます.

一般ユーザーの場合は,ホームディレクトリ以下に作業ディレクトリ を用意します.初めて RPM を作成する場合にはこのディレクトリを 用意する必要があります.

$ mkdir ~/BUILD
$ mkdir -p ~/RPMS/i386
$ mkdir -p ~/RPMS/noarch
$ mkdir ~/RPMS/SOURCES
$ mkdir ~/RPMS/SPECS
$ mkdir ~/RPMS/SRPMS

そして,~/RPM 以下で作業をしますということを宣言するファイルである ~/.rpmmacros を用意します.例えばこのファイルに

$ cat ~/.rpmmacros
%_topdir /home/kato/RPM

と1行だけ書くことによって(cat のある行は cat コマンドを使ったと思ってください), /home/kato/RPM 以下で作業をしますということを表しています.

3.3.2 実際にコンパイルをしてみる

RPM を作るためには自力でコンパイル及びインストールが出来る必要があります. 従って,ソフトのコンパイルを実際に適当なディレクトリで行うという ことを事前に行う必要があります.この時 調子に乗って make installを実行しないように しましょう.ただし,どのファイルがインストールされるかを知る必要が ありますので,

$ make -n install

を実行してインストールされるべきファイルを知りましょう.-n オプションは 実行する「ふり」をするオプションです.

3.3.3 spec ファイルを記述する

パッケージ作業の一番重要な作業です.spec ファイルには

に関する情報を記述します.ここでは必要最低限のものを具体例を示しながら 紹介します.

例 1: mpeg_encode

最初の例は mpeg_encode という MPEG-1 の動画を作成するソフトです. 以下に mpeg_encode をRPM 化するための spec ファイルを 紹介します.

Summary: MPEG-1 encorder
Name: mpeg_encode
Version: 1.5b
Release: 1
Source: mpeg_encode-1.5b-src.tar.gz
Patch: mpeg_encode-1.5b.diff
Copyright: distributable
Group: Local
Packager: Masaya Kato 
Buildroot: /tmp/rpm
Summary(ja): MPEG-1 エンコーダー

%description
mpeg_enocde is MPEG-1 encorder. 

%description -l ja
mpeg_encode は MPEG-1 形式の動画を作成するツールです。

%changelog
* Thu Jul 13 2000 Masaya Kato 
- first release

%prep

%setup -n mpeg_encode
%patch -p2

%build
make

%install
mkdir -p ${RPM_BUILD_ROOT}/usr/local/bin
mkdir -p ${RPM_BUILD_ROOT}/usr/local/man/man1
cp mpeg_encode ${RPM_BUILD_ROOT}/usr/local/bin
cp mpeg_encode.1 ${RPM_BUILD_ROOT}/usr/local/man/man1

%clean

%files
%defattr(-,root,root)
%doc BUGS CHANGES COPYRIGHT NOTES README TODO VERSION
%doc docs/
/usr/local/bin/mpeg_encode
/usr/local/man/man1/mpeg_encode.1
Summary
パッケージの説明を簡単に一行で書きます.タイトルのようにspec ファイルの一行目に書くことが多いです.英語で簡潔に書きましょう. Summaryは, 国際化機能をもっており, Summary(ja)のように, 日本語のサマリーを書いておくと, 環境変数 LANGUAGE が ja な時には, 日本語のほうが表示されます. ただし, Summary(ja)を用意したときにも, 英語の Summaryは必ず用意してください. また, 日本語がspecファ イルの 始めの方にあると, rpmコマンドがエラーを出すことがあるので, Summary(ja)はデータ定義部の下のほうに書くほうがいいようで す. また, 日本語メッセージは必ず EUC で入れてください.
Name
つくるrpmパッケージの名前です.
Version
ソースのバージョン名を入れます.
Release
同じソースからつくるrpmパッケージのリリース番号です.
Source
rpmパッケージをつくるソース名です.SOURCESのディレクトリに 置いておきましょう.ソースの入手先を明示するために,

Source: ftp://ftp.hogehoge.org/hoge-1.1.tar.gz

と書いておくと便利です.自分でつくったソースならば, サンプルのようにファ イル名のみを書いておきます.
Patch
上で設定したソースにあてる,パッチファイルです. 書式は Sourceと同じです.このパッチファイルもディレクトリ SOUCESに置いときましょう.
Copyright
作成するrpmパッケージの著作権を書きます. もとのソースの Copyright とかを良く読んで,できるだけ簡潔に書きましょう.
Group
つくるパッケージのカテゴリーを書きます.
Packager
rpmパッケージを作ってるあなたの名前です. Email addressを入れておくと, 思わぬとこからバグ報告とかもらえて 嬉しいこともあります.
Buildroot
仮想インストールのためのディレクトリ名を書きます.
%description
このタグの下に,rpmパッケージの解説を書きます. rpm -qip で出てくる説明です. このタグも国際化機能をもってます. 日本語メッセージを表示させたいときには, %description -l ja を用います. ただし, 日本語メッセージを用意したときにも, 必ず英語メ ッセージは書いておきましょう.
%changelog
更新履歴を書きます.
%prep
ソースのmakeやインストール作業前の準備の開始を示すタグです. 以下で説明する%setup,%patchなどのマクロを用いたり, シェルス クリプトを記述して,ソースの展開などを行います.
%setup
%prepからはじまるスクリプト中で,ソースを展開するためのマクロです. %setupとオプションなしで書くと, 以下が順に行われます
  1. BUILD ディレクトリに cd する
  2. 指定ディレクトリ(後述)が存在すれば消去する
  3. Source で指定したファイルを展開する
  4. 指定ディレクトリに cd する
指定したディレクトリは${RPM_PACKAGE_NAME}-${RPM_PACKAGE_VERSION} がデフォルトとなります.例の場合は mpeg_encode-1.5b がデフォルト となります.デフォルトとディレクトリが異なる場合には例にあるように -n オプションをつけて指定します.-n 以外にも %setup にはさまざま なオプションがありますが,ここでは省略します.
%patch
%prepからはじまるスクリプト中で,patchをあてるためのマクロ としてはたらきます.例のように書くと,

patch -p2 < mpeg_encode-1.5b.diff

を実行します.
%build
ソースをmakeするスクリプトの開始であることを示し,また, %setupで 指定したディレクトリにcdするマクロとしてはたらきます.以下 には,makeを行うときの手順をスクリプトとして書きます.上の例では makeコマンドにより make を行います.
%install
ファイルをinstallするスクリプトの開始であることを示し,また, %setupで指定したディレクトリにcdするマクロとしてはたらきます.以 下には,installを行うときの手順を示します. ここで,データ定義部の Buildrootで設定したディレクトリ (${RPM_BUILD_ROOT})の下に 全てのファイルがインストールされるように,工夫しましょう. Makefileが短いときには,修正してpatchをつくるかわりに,ここに, cp, installコマンド等を用いたinstallスクリプトを書くのも一手です. 上の例ではこの領域にスクリプトを書いています.
%clean
rpmを作ったあとの後始末をこのタグの下に記述します. 例では何もしてません.
%files
%filesはじまる部分で,rpmパッケージにつめこむファイル名を列挙します. このとき以下に注意して ください.
%defattr
ファイルの属性を変更します.上の例ではパーミッションは変更しないで, ユーザーID及びグループID を root に設定しています.
%doc
ドキュメントファイルの指定をします.指定されたファイルが /usr/doc/(パッケージ名) 以下に展開されます.あるディレクトリ 以下全てを指定したい場合には docs/ のようにします.
ファイル名列挙の注意点
ファイル名は絶対パスで指定します.あるディレクトリ以下のファイル 全てをインストールする場合には /usr/local/bin/ のように"/" で終了してください.また,ワイルドカードも利用できます.

例 2: netCDF

2番目の例は netCDF の RPM パッケージ作成例です.まずは spec ファイルを ご覧ください.

Summary: netCDF library
Name: netCDF
Version: 3.4
Release: 1
Source: netcdf-3.4.tar.Z
Copyright: distributable
Group: Local
Packager: Masaya Kato 
Buildroot: /tmp/rpm

%description
netCDF (network Common Data Form) is an interface for array-oriented data 
access and a library that provides an implementation of the interface. 
The netCDF library also defines a machine-independent format for representing 
scientific data. Together, the interface, library, and format support the 
creation, access, and sharing of scientific data. 

The netCDF software was developed at the Unidata Program Center in Boulder, 
Colorado.


%changelog
* Tue Aug 1 2000 Masaya Kato 
- version 3.4


%prep

%setup -n netcdf-3.4

%build
cd src
CPPFLAGS=-Df2cFortran FFLAGS="-g -Nx400 -w" ./configure --prefix=/usr/local
make

%install
cd src
mkdir -p ${RPM_BUILD_ROOT}/usr/local
make prefix=${RPM_BUILD_ROOT}/usr/local install

%clean

%files
%defattr(-,root,root)
%doc src/README src/VERSION src/COMPATIBILITY
/usr/local/bin/ncdump
/usr/local/bin/ncgen
/usr/local/include/ncvalues.hh
/usr/local/include/netcdf.h
/usr/local/include/netcdf.hh
/usr/local/include/netcdf.inc
/usr/local/lib/libnetcdf.a
/usr/local/lib/libnetcdf_c++.a
/usr/local/man/man1/ncdump.1
/usr/local/man/man1/ncgen.1
/usr/local/man/man3/netcdf.3
/usr/local/man/man3/netcdf.3f
/usr/local/man/man3f/netcdf.3f

ソースファイルに configure が用意されている場合には,--prefix オプション を効果的に使うことができます.%build の段階ではインストールする ディレクトリを指定して,%install の段階で prefix=${RPM_BUILD_ROOT}/(インストール先)のように指定します.

例 3: GrADS

3番目の例として GrADS を RPM 化したものを紹介します.GrADS はバイナリー 配布されているものです.まずは spec ファイルをご覧ください.

Summary: Grid Analysis and Display System
Name: GrADS
Version: 1.7_Beta9
Release: 1

# Source0, Source1
# http://grads.iges.org/grads/head.html
# ftp://huron.scd.ucar.edu/pub/ipcc/grads/ 
Source0: GrADS-1.7Beta9.linux5.bin.tar.gz
Source1: data.tar.gz
Source2: scripts.tar.gz
Nosource: 0
Nosource: 1
Copyright: distributable
Group: Local
Packager: Masaya Kato 
Buildroot: /tmp/rpm

%description
The Grid Analysis and Display System (GrADS) is an interactive desktop tool
that is currently in use worldwide for the analysis and display of earth 
science data. GrADS is implemented on all commonly available UNIX workstations,
Apple Macintosh, and DOS or Linux based PCs, and is freely distributed over the
Internet via anonymous ftp.

GrADS provides an integrated environment for access, manipulation, and display 
of earth science data. 

GrADS implements a 4-Dimensional data model, where the dimensions are usually 
latitude, longitude, level, and time. Each data set is located within this 
4-Dimensional space by use of a data description file. Both gridded and station
data may be described. Gridded data may be non-linearly spaced; Gaussian grids 
and variable resolution ocean model by use of a data description file. Both 
gridded and station data may be described. Gridded data may be non-linearly 
spaced; Gaussian grids and variable resolution ocean model grids are directly
supported. The internal data representation in a file may bi either binary,
GRIB, or NetCDF (as of version 1.6).

%changelog
* Tue Aug 1 2000 Masaya Kato 
- version 1.7-Beta9


%prep

%setup -n GrADS-1.7Beta9
mkdir dat
%setup -n GrADS-1.7Beta9/dat -D -T -a 1
cd ..
mkdir lib
%setup -n GrADS-1.7Beta9 -D -T  -a 2

%build

%install
mkdir -p ${RPM_BUILD_ROOT}/usr/local/GrADS
cp -r * ${RPM_BUILD_ROOT}/usr/local/GrADS

%clean

%files
%defattr(-,root,root)
%doc README
/usr/local/GrADS

多くのスクリプト言語と同様に "#"で始まる行はコメントを 表しています.ソースファイルが複数存在する場合には例のように Source0, Source1のようにSource の後に数字をつけて指定します. また,必要とするソースを SRPM パッケージに加えない場合には Nosource: 行に加えないソースを指定します.例の場合,Source0 のファイルと Source1 のファイルはパッケージに加えません.ちなみに SRPM パッケージ とはソースファイル及びspec ファイルをまとめたパッケージです.自分の 環境でコンパイルする必要がある場合,SRPM を展開し,パッケージを作ります.

複数のファイルを扱う場合,どのタイミングでどのファイルを展開するかを 指定する必要があります.これは %setup の -a オプションで指定します. -a の後に数字を指定することにより,展開するファイルをしていします. -a 1とした場合,Source1: で指定したファイルが展開されます.

例 4: w3m

最後に w3m を RPM 化したものを紹介します.例によって spec ファイルを ご覧ください.

Summary: WWW browser
Name: w3m
Version: 0.1.10
Release: 1
Source: w3m-0.1.10.tar.gz
Copyright: distributable
Group: Local
Packager: Masaya Kato 
Buildroot: /tmp/rpm
Summary(ja): WWW ブラウザー
Requires: SSLeay >= 0.9

%description
w3m is text-based WWW browser.

%description -l ja
w3m はテキストベースの WWW ブラウザーです。

%changelog
* Tue Jul 25 2000 Masaya Kato 
- version 0.1.10

* Thu Jun 23 2000 Masaya Kato 
- first release

%prep

%setup -n w3m-0.1.10

%build
./configure
make

%install
make DESTDIR=/tmp/rpm install

%clean

%files
%defattr(-,root,root)
%doc README
%doc doc-jp/ doc/
/usr/local/bin/w3m
/usr/local/lib/w3m/

w3m で SSL なページを見るためには SSLeay ライブラリーが必要です. その情報を Requires: で指定します.上のように指定することにより SSLeay というパッケージのバージョン 0.9 以上が w3m に必要である ということを示しています.

3.3.4 RPM パッケージの作成

3.3.3 節で説明した spec ファイルをただしく記述することができたら, RPM パッケージは 99% 出来たと言っても過言ではありません.あとは 実際にパッケージを作成するだけです.作成するコマンドは rpm です.作成したいパッケージによりオプションが異なります.以下に hoge.spec という spec ファイルを基にパッケージを作る場合について 紹介します.

rpm -ba hoge.spec rpm と srpm を作りたい場合(build all)
rpm -bb hoge.spec rpm だけを作りたい場合(build binary)
rpm -bs hoge.spec srpm だけを作りたい場合(build srpm)
rpm -bc hoge.spec rpm と srpm を作らず,make がうまく行くかを テストする場合(build compile)
rpm -bi hoge.spec rpm と srpm を作らず,install までうまく行くかを テストする場合(build install)

rpm や srpm を作ると指定した場合で,正常に作ることが出来た場合には rpm が RPMS/i386 ディレクトリに srpm が SRPMS/ に作成されます.

3.4 RPM パッケージのインストール及びアンインストール

hoge-1-1.i386.rpm のインストール等の操作方法を以下に紹介します.

rpm -i hoge-1-1.i386.rpm インストール作業
rpm -U hoge-1-1.i386.rpm アップグレード作業
rpm -e hoge-1-1 アンインストール作業
rpm -qpi hoge-1-1.i386.rpm hoge パッケージの情報を得る
rpm -qi hoge-1-1 既にインストールされている hoge パッケージの情報を得る

以上の他にも rpm コマンドはたくさんの操作を行うことができます.

3.5 より高度な道をめざして

今回紹介した RPM の作成は初級編です.より高度な技術,例えば インストール時にスクリプトを走らせるとかいったことに関しては 説明をしていません.そういうことをしたい場合には JF にある RPM-Howto を参考にしてください.

[<<BACK] [NEXT>>]

kato@ep.sci.hokudai.ac.jp