エンタープライズ:特集 2003/09/26 18:00:00 更新


特集:第2回 RPM活用のステップアップ−SRPMリビルドとコンパイルマスター (3/6)

SPECファイルの内容を理解する

 ソースのtar.gzからコンパイルする際、アーカイブをツリーを解凍した後に含まれている./configureを実行する。configureはシステムを調べ、それに適したオプションを付けてMakefileを作成するのが通例だ。

 SPECファイルはこのconfigureと同じ働き(+α)の機能を持つ。ある程度ターゲットとなる環境(ディストリビューション、バージョン)を予測し、RPMパッケージに必要な情報を付加する。いってみればRPMパッケージの「設計図」である。以下は、balsa(GNOME環境用メールクライアントソフトの1つ)でのSPECファイル例だ。

Summary: An email client for GNOME.
Name: balsa
Version: 2.0.6
Release: 1
License: GPL
Group: Applications/Internet
Source0: http://balsa.gnome.org/balsa-%{version}.tar.bz2
Patch0: rpm-po.patch
Patch1: balsa-broken-flock.patch
Patch2: balsa-2.0.5-soundlist.patch
Patch3: balsa-2.0.3-spoolbox.patch
Patch4: balsa-2.0.5-desktop.patch
URL: http://balsa.gnome.org/
Prereq: /usr/bin/scrollkeeper-update
BuildRoot: %{_tmppath}/%{name}-%{version}-root
BuildRequires: gtk2-devel, autoconf >= 2.52
BuildRequires: libesmtp-devel >= 0.8.11, pspell-devel, krb5-devel, openssl-devel
BuildRequires: gtkhtml2-devel, gnome-print-devel, openldap-devel
BuildRequires: desktop-file-utils, pkgconfig

%description
Balsa is a GNOME email client which supports mbox, maildir, and mh
local mailboxes, and IMAP4 and POP3 remote mailboxes. Email can be
sent via sendmail or SMTP. Optional multithreading support allows for
non-intrusive retrieval and sending of mail. A finished GUI similar to
that of the Eudora email client supports viewing images inline, saving
message parts, viewing headers, adding attachments, moving messages,
and printing messages.

%prep
%setup -q
%patch0 -p1
%patch1 -p1
%patch2 -p1
%patch3 -p1
%patch4 -p1
autoconf
cd libmutt
autoconf

%build
CPPFLAGS="-I/usr/kerberos/include" ; export CPPFLAGS
LDFLAGS="-L/usr/kerberos/%{_lib}" ; export LDFLAGS
if pkgconfig openssl ; then
LDFLAGS="$LDFLAGS `pkg-config --libs openssl`"
fi
%configure --disable-system-install --disable-more-warnings \
--with-gss=/usr/kerberos --with-ssl --enable-gtkhtml --enable-ldap \
--disable-flock --enable-fcntl --enable-deprecated-pspell

make %{?_smp_mflags}


%install
rm -rf $RPM_BUILD_ROOT
%makeinstall
mkdir -p $RPM_BUILD_ROOT/%{_datadir}/applications desktop-file-install \
--vendor=net \
--dir $RPM_BUILD_ROOT/%{_datadir}/applications \
--delete-original \
$RPM_BUILD_ROOT/%{_datadir}/applications/balsa.desktop

rm -f $RPM_BUILD_ROOT/usr/share/sounds/balsa/*
%find_lang %{name}
rm -rf $RPM_BUILD_ROOT/var/scrollkeeper

%clean
rm -rf $RPM_BUILD_ROOT

%post -p /usr/bin/scrollkeeper-update

%postun -p /usr/bin/scrollkeeper-update


%files -f %{name}.lang
%defattr(-, root, root)
%doc README COPYING ChangeLog NEWS TODO AUTHORS HACKING docs
%{_bindir}/balsa
%{_bindir}/balsa-ab
%{_datadir}/applications/*
%{_datadir}/balsa
%{_datadir}/gnome/help/balsa
%{_datadir}/omf/balsa
%{_datadir}/pixmaps/gnome-balsa2.png
%{_datadir}/sounds/balsa
%{_mandir}/*/*
%config %{_sysconfdir}/sound/events/*


%changelog
* Wed Feb 5 2003 Bill Nottingham <notting@redhat.com> 2.0.6-1
- upgrade to 2.0.6

〜以下略〜

 このファイルを見ると、大きく2つのセクションに分割できる。ひとつは「大文字」で書かれた部分(タグ)。もうひとつは「%」から小文字で始まる部分(マクロ)部分だ。

 「%description」を除けば、大文字で書かれている部分はパッケージの基礎情報。そのほかの「%小文字」の部分は、実際のコンパイル作業やインストール、アンインストール時に行われる具体的な作業が記述されている。

One Point:
パッケージ情報について記述されている部分(大文字で始まるタグ、%discriptionと%changelogマクロ)を「プリアンプル部」と呼ぶ。さらに、細部を見ると、

・ %prep〜%cleanマクロ:「パッケージ作成部」
・ %post〜%unpostマクロ:「インストールアンインストールスクリプト部」
・ %filesマクロ以下:「ファイルリスト部」

として区別することもある。

 以下、このSPECファイルをサンプルとしてさらに詳しく見ていこう。

プリアンプル部にはクエリー情報が書かれている

 プリアンプル部は、おもにRPMパッケージとしてクエリーされた際の情報を記述する部分だ。サンプルの%discriptionは英語だが、日本語で書くこともできる。ここで注意したいのは、上記リスト黄色文字部の「BuildReqruire」行だ。

BuildRequires: gtk2-devel, autoconf >= 2.52
BuildRequires: libesmtp-devel >= 0.8.11, pspell-devel, krb5-devel, openssl-devel
BuildRequires: gtkhtml2-devel, gnome-print-devel, openldap-devel
BuildRequires: desktop-file-utils, pkgconfig

 この節はRPMの依存関係と同じである。コンパイルするためにはこれらのパッケージが含まれていなければならないことを意味する。devel系のパッケージが必要になることが多いため、「デスクトップ用途で使うから」と開発環境をインストールしていなければ、この段階で多くが弾かれる。例えば次のようなエラーだ。

# rpmbuild -bp balsa.spec
エラー: Failed build dependencies:
   libesmtp-devel >= 0.8.11 is needed by balsa-2.0.6-1
   pspell-devel is needed by balsa-2.0.6-1
   gtkhtml2-devel is needed by balsa-2.0.6-1

 上記の解決は簡単であり、必要なパッケージをインストールすればよい。しかし、上記にはチョっとした引っかけがある。「automake」や「autoconf」はSPECファイルのBuildRequiresで頻繁に指定されるパッケージだが、バージョン指定されていると面倒なことが起きやすい。他ディストリビューション向けのsrc.rpmを利用する時に頻発するのだ。

 automakeやautoconfの依存関係を調べると、m4(マクロ)がシステムの基幹ライブラリへと依存関係が連鎖している。rpmのクエリーで「-R」オプションを利用すると、依存しているほかのパッケージやファイルが調べられる。

# rpm -qR autoconf ← 依存関係を調べる
/bin/sh
/bin/sh
/bin/sh
/sbin/install-info
/usr/bin/perl
gawk
m4 ← autoconfはm4パッケージに依存している
mktemp
perl
perl >= 0:5.000
perl >= 0:5.005_03

〜以下略〜


# rpm -qR m4 ← m4パッケージの依存関係を調べる
/bin/sh
/bin/sh
/sbin/install-info
libc.so.6 ← libc.so.6系列のパッケージに依存している
libc.so.6(GLIBC_2.0)
libc.so.6(GLIBC_2.1)
libc.so.6(GLIBC_2.2)
libc.so.6(GLIBC_2.3)
rpmlib(CompressedFileNames) <= 3.0.4-1
rpmlib(PayloadFilesHavePrefix) <= 4.0-1

 autoconfは「configureスクリプトの自動作成機」で、操作にPerlやgawk、m4を使う。そしてglibcやrpmlibにがっちりと依存している。つまり、autoconfをバージョンしようとしたら依存関係でm4に波及し、そこからシステムのglibcを「丸ごとアップデートする」という可能性もある。これはあまり行いたくない作業だ。

 対処療法的には「要求指定を緩くする」という方法がある。autoconf自体はたいていのディストリビューションにインストールされる。問題はバージョンだ。autoconfのVer.が「2.49」で、要求されているVer.が「2.51」だとしよう。しかし、2.51へのバージョンアップが困難ならば、BuildRequireのバージョンを「2.49」に下げてしまうのだ。

BuildRequires: gtk2-devel, autoconf >= 2.52
       ↓
BuildRequires: gtk2-devel, autoconf >= 2.49

 もちろん、バージョン指定には何らかの意味があるかもしれない。バージョン2.49にはなかった2.52の追加機能を利用しているということも考えられる。このレベルはパスできたとしても、makefileがうまく作成できずに失敗するかもしれない。しかし、単に「対象ディストリビューションのバージョンに合わせているだけ」ということもある。筆者の「経験」でいえば、autoconfのバージョン指定は多少緩めてもあまり関係がないことのほうが多い。なお、autoconfのより詳細な情報はhttp://www.gnu.org/software/autoconf/にあるので参考にしてほしい。

前のページ | 1 2 3 4 5 6 | 次のページ

[渡辺裕一,ITmedia]