エンタープライズ:特集 | 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/にあるので参考にしてほしい。
[渡辺裕一,ITmedia]