source: projects/Vine-manual/trunk/making-rpm.xml @ 96

Revision 96, 125.6 KB checked in by yasumichi, 15 years ago (diff)

first import

Line 
1<?xml version="1.0"?>
2<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
3"http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd">
4<book id="making-rpm">
5
6<bookinfo>
7  <title>RPMパッケージの作成方法</title>
8  <authorgroup>
9    <author>
10      <firstname>Jun</firstname>
11      <surname>Nishii</surname>
12    </author>
13    <editor>
14      <firstname>Yasumichi</firstname>
15      <surname>Akahoshi</surname>
16    </editor>
17    <editor>
18      <firstname>Kazutaka</firstname>
19      <surname>HARADA</surname>
20    </editor>
21    <editor>
22      <firstname>Takuya</firstname>
23      <surname>Kobayashi</surname>
24    </editor>
25  </authorgroup>
26  <!--pubdate>2007/10/3</pubdate-->
27</bookinfo>
28
29<chapter id="making-rpm-1">
30        <title>はじめに</title>
31        <para>このドキュメントは、rpmパッケージの作り方の初歩を解説するように書きはじめたものです。
32                特に、他のドキュメントでは分かりにくかったり、触れられていなかったりする点に注意して書くようにしていますので、これまで何気なくrpmパッケージを作ってきた人にも、役に立つ点があると思います。</para>
33
34        <para>間違いの指摘・コメント・要望等は、ML(メーリングリスト)や BTS(バグトラッキングシステム)で知らせていただければ、できるだけ反映していくつもりですので、ご協力をお願いします。また、specファイルを書く時にこういうことがわからなかったという意見や情報も募集中です。</para>
35
36        <para>このドキュメントでは、rpmパッケージの作り方に関する知識は無いが、rpmパッケージのインストール方法や、シェルスクリプトや基本的なコマンドの使い方は知ってると仮定して、説明を省いてるところが多くあります。</para>
37
38        <para>rpmパッケージの作り方についてさらに知りたい人は、
39                <ulink url="http://www.linux.or.jp/JF/JFdocs/archive/RPM-BUILD-HOWTO.html">RPM-BUILD-HOWTO</ulink>
40                (古高さん、石岡さん著、JFにあります)や
41                <ulink url="http://www.rpm.org/max-rpm/index.html">Maximum-RPM</ulink>(英語です。)を読みましょう。
42                どちらも、書かれてからだいぶ時間が経っていますが、参考になると思います。</para>
43
44        <para>RPM-BUILD-HOWTO は JF というパッケージがインストールされていれば、
45          <ulink url="file:///usr/share/doc/JF/archive/RPM-BUILD-HOWTO.txt.gz">/usr/share/doc/JF/archive/RPM-BUILD-HOWTO.txt.gz</ulink> にあります。</para>
46
47        <para>また、rpm付属のドキュメントが /usr/share/doc/rpm-version/ 以下にあります。(英語です。)</para>
48        <para>細かなことについて知りたい場合は、apt-get source rpm , rpm -bp rpm.spec などとして、rpm 自体のソースを読むのもよいでしょう。</para>
49
50        <para>Vine Linux では <ulink url="http://vinelinux.org/packaging.html">パッケージングに関する指針</ulink> というドキュメントもあります。Vine Seed や Vine Plus のパッケージを作成する場合にはこの指針に従ってください。</para>
51
52        <para>なお、この文書の最新版は<ulink url="http://vinelinux.org/documentations.html">http://vinelinux.org/documentations.html</ulink>
53                から入手できます。</para>
54</chapter>
55
56<chapter id="making-rpm-2">
57        <title>更新記録(1999/2/16以降)</title>
58        <itemizedlist>
59                <listitem>
60                        <para>2007/10/3</para>
61                        <itemizedlist>
62                                <listitem><para>Appendix B で desktop file に関して修正</para></listitem>
63                        </itemizedlist>
64                </listitem>
65                <listitem>
66                        <para>2007/9/10</para>
67                        <itemizedlist>
68                                <listitem><para>Appendix B で desktop-file-install を使うよう修正</para></listitem>
69                        </itemizedlist>
70                </listitem>
71                <listitem>
72                        <para>2007/7/21</para>
73                        <itemizedlist>
74                                <listitem><para>Appendix B に desktop-file-validate について追記</para></listitem>
75                        </itemizedlist>
76                </listitem>
77                <listitem>
78                        <para>2007/6/26</para>
79                        <itemizedlist>
80                                <listitem><para>Copyright と Serial について追記</para></listitem>
81                        </itemizedlist>
82                </listitem>
83                <listitem>
84                        <para>2007/6/25</para>
85                        <itemizedlist>
86                                <listitem><para>%prep での %{SOURCE数字} の利用例を記載</para></listitem>
87                                <listitem><para>%post での install-info の例で、install時にのみ処理を行うように if文 を追加</para></listitem>
88                                <listitem><para>%files と Requires の探し方のヒントを記載</para></listitem>
89                                <listitem><para>ExclusiveArch と ExcludeArch の説明を記載</para></listitem>
90                                <listitem><para>Appendix B にalternatives を利用するパッケージについて追加</para></listitem>
91                        </itemizedlist>
92                </listitem>
93                <listitem>
94                        <para>2007/5/23</para>
95                        <itemizedlist>
96                                <listitem><para>Requires( ),BuildRequires( ) の説明を追加</para></listitem>
97                                <listitem><para>Prereq の代わりに Requires(pre,post) 等の使用を推奨</para></listitem>
98                                <listitem><para>%verifyscript について記載</para></listitem>
99                                <listitem><para>%verify について記載</para></listitem>
100                                <listitem><para>パッケージ作成後に確認することを記載</para></listitem>
101                                <listitem><para>リンクの修正</para></listitem>
102                        </itemizedlist>
103                </listitem>
104                <listitem>
105                        <para>2006/12/8</para>
106                        <itemizedlist>
107                                <listitem><para>Epoch の使用について記載</para></listitem>
108                                <listitem><para>install-info --delete の記述を修正</para></listitem>
109                                <listitem><para>Group 一覧、説明 の typo を修正</para></listitem>
110                        </itemizedlist>
111                </listitem>
112                <listitem>
113                        <para>2006/11/17</para>
114                        <itemizedlist>
115                                <listitem><para>Group 一覧、説明を rpm-4.4.2-0vl16 にあわせて修正</para></listitem>
116                        </itemizedlist>
117                </listitem>
118                <listitem>
119                        <para>2006/11/8</para>
120                        <itemizedlist>
121                                <listitem><para>License の説明を修正</para></listitem>
122                                <listitem><para>%check の説明を追記</para></listitem>
123                                <listitem><para>rpmbuild -bi で %check も実行されることを記述</para></listitem>
124                                <listitem><para>Vine Linux 4.x での Group 一覧、説明を修正</para></listitem>
125                                <listitem><para>Appendix B にGNOMEのメニューについて追加</para></listitem>
126                        </itemizedlist>
127                </listitem>
128                <listitem>
129                        <para>2006/11/3</para>
130                        <itemizedlist>
131                                <listitem><para>Vine Linux 4.x での Group 一覧、説明を追加</para></listitem>
132                                <listitem><para>BuildRequires と BuildConflictsの説明を追加</para></listitem>
133                                <listitem><para>Requires と Prereq、BuildRequires と BuildPrereq の説明を修正、それぞれの違いを追記</para></listitem>
134                                <listitem><para>%config に noreplace,missingok の説明を追加</para></listitem>
135                                <listitem><para>マクロの説明を追加</para></listitem>
136                                <listitem><para>spec の例を修正、マクロを使用した spec の例を追加</para></listitem>
137                                <listitem><para>%check の説明を追加</para></listitem>
138                                <listitem><para>%post,%postun に info ファイルの例を追加</para></listitem>
139                                <listitem><para>タグの -p の説明を追加</para></listitem>
140                                <listitem><para>Appendix B パッケージ固有の作法等についてを作成</para></listitem>
141                        </itemizedlist>
142                </listitem>
143                <listitem>
144                        <para>2006/10/26</para>
145                        <itemizedlist>
146                                <listitem><para>全体を見直し</para></listitem>
147                        </itemizedlist>
148                </listitem>
149                <listitem>
150                        <para>2004/9/19</para>
151                        <itemizedlist>
152                                <listitem><para>rpmbuildを推奨する様、追加。</para></listitem>
153                        </itemizedlist>
154                </listitem>
155                <listitem>
156                        <para>2004/6/30</para>
157                        <itemizedlist>
158                                <listitem><para>tex形式から、DocBook SGML形式に変更。</para></listitem>
159                        </itemizedlist>
160                </listitem>
161                <listitem>
162                        <para>2000/10/30</para>
163                        <itemizedlist>
164                                <listitem><para>細かい修正をすこし</para></listitem>
165                                <listitem><para>rpm-3.0.5 以降で binary が strip されることと、man/info がgzされることを記述</para></listitem>
166                                <listitem><para>Prereq の説明追加</para></listitem>
167                                <listitem><para>rpm -bp の説明追加</para></listitem>
168                        </itemizedlist>
169                </listitem>
170                <listitem>
171                        <para>2000/3/7</para>
172                        <itemizedlist>
173                                <listitem><para>minor なタイポや記述の修正</para></listitem>
174                                <listitem><para>%setup の記述修正(-a,-b)および追加(-q)</para></listitem>
175                                <listitem><para>.rpmmacros の説明に .rpmrc の場合も併記</para></listitem>
176                        </itemizedlist>
177                </listitem>
178                <listitem>
179                        <para>1999/9/3</para>
180                        <itemizedlist>
181                                <listitem><para>.rpmmacros の記述追加(rpm-3.0.x 対応)</para></listitem>
182                                <listitem><para>BuildPrereq に関する記述を追加</para></listitem>
183                        </itemizedlist>
184                </listitem>
185                <listitem>
186                        <para>1999/2/16</para>
187                        <itemizedlist>
188                                <listitem><para>Summary(ja), %description -l ja, %changelog に関する記述を追加</para></listitem>
189                                <listitem><para>その他細かい修正</para></listitem>
190                        </itemizedlist>
191                </listitem>
192        </itemizedlist>
193</chapter>
194
195<chapter id="making-rpm-3">
196        <title>rpm関連ファイルの説明</title>
197        <variablelist>
198                <varlistentry>
199                        <term>rpmパッケージ</term>
200                        <listitem><para>バイナリパッケージ。これの作り方をこのドキュメントでは解説します。</para></listitem>
201                </varlistentry>
202                <varlistentry>
203                        <term>srpmパッケージ</term>
204                        <listitem><para>
205                                        ソースパッケージ。rpmパッケージを作るために必要なソースやパッチ、
206                                        specファイルを含んでます。rpm -ivh &lt;hoge.src.rpm&gt; で展開できます。(次節も参照)
207                        </para></listitem>
208                </varlistentry>
209                <varlistentry>
210                        <term>specファイル</term>
211                        <listitem><para>
212                                        ソースからrpmをつくための、makeの手順やパッケージの情報を書いたファイル。
213                                        これを書くと、rpmコマンドによってrpmパッケージとsrpmパッケージをつくれます。
214                        </para></listitem>
215                </varlistentry>
216        </variablelist>
217        <para>以下では主にspecファイルの書き方を説明します。</para>
218</chapter>
219
220<chapter id="making-rpm-4">
221        <title>rpmパッケージをつくるための準備</title>
222        <sect1 id="making-rpm-4-1">
223                <title>環境設定</title>
224                <para>Vine Linuxでは、インストール直後から一般ユーザ権限でrpmパッケージが作れるように配慮されています。
225                        通常ユーザーのホームディレクトリにはrpmパッケージを作る為のディレクトリが以下のように用意されているはずです。</para>
226                <screen>
227~/rpm
228  |-- BUILD
229  |-- RPMS
230  |   |-- alpha
231  |   |-- athlon
232  |   |-- i386
233  |   |-- i586
234  |   |-- i686
235  |   |-- noarch
236  |   |-- ppc
237  |   `-- sparc
238  |-- SOURCES
239  |-- SPECS
240  `-- SRPMS</screen>
241                <para>またユーザー毎のマクロを記述する.rpmmacrosファイルもホームディレクトリに用意されているはずです。
242                もし必要なファイルやディレクトリが無い、または削除してしまった場合は、端末上で <command>mkrpmdir</command> コマンドを実行してください。</para>
243                <screen>$ <command>mkrpmdir ~</command></screen>
244
245                <para>
246このコマンドによりホームディレクトリ(~)配下に必要なrpmディレクトリツリーと.rpmmacrosを作成できます。
247<command>mkrpmdir</command>コマンドは、既存の .rpmmacros ファイルを上書きしません。
248                </para>
249
250                <note>
251                        <para>上記のコマンドは、Vine Linux特有のvutilsパッケージに含まれています。</para>
252                        <para>言語設定は LANG=ja_JP.eucJP もしくは LANG=C にする必要があります。</para>
253                </note>
254
255                <para>各ディレクトリはそれぞれ次のように使われます。</para>
256                <itemizedlist>
257                        <listitem><para>RPMS/i386:できあがったrpmパッケージが収納されます。
258                        (architectureによってi386の所がppcやsparcだったりします)</para></listitem>
259                        <listitem><para>SRPMS :できあがったsrpmパッケージが収納されます。</para></listitem>
260                        <listitem><para>SPECS :srpmパッケージをrpm -ivhで展開した時のspecファイルがここに出力されます。</para></listitem>
261                        <listitem><para>SOURCES :rpmパッケージをつくるのに必要なソースやパッチのデフォルトの置場所です。
262                        またsrpmパッケージをrpm -ivhで展開した時のソースファイルはここに出力されます。</para></listitem>
263                        <listitem><para>BUILD :rpmパッケージをつくるときに、rpmコマンドがソースを展開したり、
264                        makeしたりするための作業に使うディレクトリです。tmpみたいなところです。</para></listitem>
265                </itemizedlist>
266
267                <para>
268                        このディレクトリの位置を変更したいときには、
269                        <filename>/usr/lib/rpm/macros</filename><filename>~/.rpmmacros</filename>で設定します。
270                        例えば、上にあげたディレクトリを全て/usr/public/rpm以下に用意するときには、
271                        以下のように設定します。
272                </para>
273                <screen>%_topdir   /usr/public/rpm/</screen>
274                <para>また、個別に以下のように設定することもできます。</para>
275<screen>%_rpmdir    /usr/public/rpm/RPMS
276%_srcrpmdir /usr/public/rpm/SRPMS
277%_specdir   /usr/public/rpm/SPECS
278%_sourcedir /usr/public/rpm/SOURCES
279%_builddir  /usr/public/rpm/BUILD</screen>
280                <para>
281                        rpmdirやtopdirを設定したときには、RPMS/i386(architectureによってはRPMS/sparcなど)
282                        という名前の書き込み可能なディクレトリを作っておくのを忘れないようにしましょう。
283                        また、rpmパッケージを作る時にroot権限で行うとなんでもできてしまいますが、
284                        パッケージのビルド中にインストール先を間違って既存のファイルを上書きしてしまったり、
285                        あるいは消去してしまったりという危険を伴います。
286                        可能な限り、一般ユーザ権限で作成することを推奨します。
287                </para>
288                <para>
289                        以下では、上で説明したディレクトリを単にBUILDとか、SOURCESと呼びます。
290                </para>
291        </sect1>
292        <sect1 id="making-rpm-4-2">
293                <title>makeの準備</title>
294                <para>まず、作成したいrpmパッケージをつくるための、ソースを手にいれて、
295                        それを make, make install できるように、手直しして、パッチを用意します。
296                        オリジナルのソース・ディレクトリをhoge.org/、
297                        修正したソース・ディレクトリをhoge/とすると、
298                        <screen>$ <command>diff -uNr hoge.org/ hoge/ &gt; hoge.patch</command></screen>
299                        とかしてpatchをつくります。
300                        Makefileだけとか個別にdiffをとっても良いです。
301                        ソースとパッチは前節で設定したSOURCESのディレクトリにおきます。</para>
302                <para>rpmを作る時には、一度ソースを make install して、
303                        その出力ファイルをかき集めることによって、rpmを構築することになります
304                        (この作業は自動的に行われます。後述)。 しかし、この make install で、
305                        システム上の既存ファイルが上書きされたりしたら、とても悲しいですね。</para>
306                <para>このようなことを避けてrpmパッケージを構築するために、
307                        ある指定ディレクトリをルートディレクトリ"/"とみなして、
308                        その下にインストールを行なえば、
309                        そこにインストールされたファイルをもとにrpmを構築することができます。
310                        ソースによっては、例えばMakefileのオプション指定で、
311                        <screen>$ <command>make DESTDIR=/tmp/rpm-root/usr/local install</command></screen>
312                        と指定して/tmp/rpm-root/以下にバイナリ・ツリーをつくったりできるものも増えてきましたが、
313                        多くの場合Makefileをちょっと修正することになります。
314                        そのパッチも用意しましょう。</para>
315        </sect1>
316</chapter>
317
318<chapter id="making-rpm-5">
319        <title>specファイルを書く</title>
320        <para>
321                さて、rpmパッケージを作成するためには、specファイルを記述しないといけません。
322                specファイルを書き方を知るための、おすすめは、Maximum-RPMを読むことです。
323                分厚いですが、よくまとまってて、英語も読みやすいです。
324                てきとうに拾い読みすればいろいろわかります。
325                それから、古高さんと石岡さんのRPM-BUILD-HOWTOにも説明があります。
326                <command>rpm -ivh fugafuga-version-revision.src.rpm</command> とかして、
327                出てきたspecファイルを見るってのも良いです。
328        </para>
329        <para>
330                以下にサンプルとして簡単なspecファイルをあげ、その内容について説明をします。
331                なんとなくわかったら、小さなパッケージを作ってみて、
332                さらにいろいろ作りたくなったら上にあげたようなdocumentを読んでください。
333        </para>
334        <para>
335                より多くのマクロを使ったspecファイルの例が
336                <xref linkend="making-rpm-7-3" />にありますのでそちらも参照してください。
337        </para>
338
339<screen>
340---------spec ファイルの例 (#から始まる行は、コメント行です)--------
341#(1)データ定義部
342Summary: hoge is a harehare horehore
343Name: hoge
344Version: 1.1
345Release: 2
346Source: hoge-1.1.tar.gz
347Patch: hoge.patch.gz
348License: distributable
349Group: Local
350Packager: Jun Nishii &lt;jun@vinelinux.org&gt;
351Buildroot: %{_tmppath}/%{name}-%{version}-root
352Summary(ja): hoge は harehare な horehore です。
353
354%description
355Hoge is a harehare horehore and convenient for fugafuga.
356Enjoy!
357
358%description -l ja
359hoge は harehare な horehore で、fugafuga するときなどとても便利なツー
360ルです。みんなでなかよく使いましょう。
361
362%changelog
363* Tue Feb 16 1999 Jun Nishii &lt;jun@vinelinux.org&gt; 1.1-2
364- added Japanese messages
365
366* Mon Feb 15 1999 Jun Nishii &lt;jun@vinelinux.org&gt; 1.1-1
367- first release for version 1.1
368
369#(2)スクリプト部
370%prep       #rpmを構築する前の準備です。
371rm -rf $RPM_BUILD_ROOT
372
373%setup      #ソースをBUILDに展開します。
374%patch -p1  #パッチをあてます。
375
376%build      #makeのための手順を書きます。
377make
378(cd man; make man)
379
380%install    #installのための手順を書きます。
381make prefix=${RPM_BUILD_ROOT}/usr/local install
382(cd man; make prefix=${RPM_BUILD_ROOT}/usr/local install.man)
383
384%clean      #rpmを作ったあとの後始末です。
385rm -rf $RPM_BUILD_ROOT
386
387#(3)ファイルリスト部 --------------
388%files
389%defattr(-,root,root)
390%doc README
391%doc docs/
392/usr/bin/hoge.bin
393/usr/lib/hoge/
394/usr/man/man1/hoge.1.gz
395%dir /usr/lib/hoge/
396%config /usr/lib/hoge/fuga.conf
397
398---------specの例はここまで-----------------------------------------</screen>
399
400        <para>
401                specファイルは、(1)データ定義部と、(2)さまざまな作業をするためのscriptを書くスクリプト部、
402                そして、(3)バイナリパッケージであるrpmを構成するファイル名を列挙するファイルリスト部からなります。
403                では、上の例をみながら、各部分の説明をしましょう。
404        </para>
405        <sect1 id="making-rpm-5-1">
406                <title>データ定義部</title>
407                <para>
408                        データ定義部はパッケージに関する情報を記入する部分です。
409                        例の各タグの意味は以下の通りです。
410                        スクリプト部で環境変数に代入されて用いられるものは、その環境変数名も書いてます。
411                </para>
412
413                <para>
414                        <ulink url="http://vinelinux.org/packaging.html">パッケージングに関する指針</ulink> も参照してください。
415                </para>
416
417
418                <sect2 id="tag-package-information">
419                <para>パッケージの名前やバージョンなど、パッケージに関する情報を扱うタグです。</para>
420
421                <variablelist>
422                        <varlistentry>
423                                <term>Summary</term>
424                                <listitem><para>
425                                                パッケージの説明を簡単に一行で書きます。
426                                                タイトルのようにspecファイルの一行目に書くことが多いです。
427                                                英語で簡潔に書きましょう。Summaryは、国際化機能をもっており、
428                                                Summary(ja)のように、日本語のサマリーを書いておくと、
429                                                環境変数 LANGUAGE が ja な時には、日本語のほうが表示されます。
430                                                ただし、Summary(ja)を用意したときにも、英語のSummaryは必ず用意してください。
431                                                また、日本語がspecファイルの始めの方にあると、
432                                                rpmコマンドがエラーを出すことがあるので、
433                                                Summary(ja)はデータ定義部の下のほうに書くほうがいいようです。
434                                                また、日本語メッセージは必ず EUC で入れてください。
435                                </para></listitem>
436                        </varlistentry>
437                        <varlistentry>
438                                <term>Name</term>
439                                <listitem><para>
440                                                つくるrpmパッケージの名前です。
441                                                環境変数RPM_PACKAGE_NAMEに設定されます。
442                                </para></listitem>
443                        </varlistentry>
444                        <varlistentry>
445                                <term>Version</term>
446                                <listitem><para>
447                                                ソースのバージョン名を入れます。
448                                                環境変数RPM_PACKAGE_VERSIONに設定されます。
449                                </para></listitem>
450                        </varlistentry>
451                        <varlistentry>
452                                <term>Release</term>
453                                <listitem><para>
454                                                同じソースからつくるrpmパッケージのリリース番号です。
455                                                環境変数RPM_PACKAGE_RELEASEに設定されます。
456                                </para></listitem>
457                                <listitem><para>
458                                                rpmver というパッケージに含まれている rpmver というコマンドで、バージョンやリリース番号の比較ができます。
459                                                <screen>$ rpmver -v 1-a 1-1
460RPM version 1-a is lesser than version 1-1.</screen>
461                                </para></listitem>
462                        </varlistentry>
463                        <varlistentry>
464                                <term>License</term>
465                                <listitem><para>
466                                                作成するrpmパッケージのライセンスを書きます。
467                                                もとのソースの COPYING などのファイルを参照し、
468                                                できるだけ簡潔に書きましょう。
469                                          </para>
470                                          <para>
471                                                rpm 4.1 以降では Copyright ではなく License を使うようになりました。(rpm 4.4 で Copyright は obsolete となりました。)
472                                                Copyright を使っている場合は License に書き変えましょう。
473                                </para></listitem>
474                        </varlistentry>
475                        <varlistentry>
476                                <term>Group</term>
477                                <listitem><para>
478                                                作るパッケージのグループ名を書きます。
479
480                                                このグループ名は、
481                                                <command>rpmコマンド</command><option>-g,--group</option>オプションで利用したり、
482                                                <ulink url="synaptic.html">Synaptic</ulink><ulink url="synaptic-4.html#categories">分類に用いる</ulink>ことができます。
483                                               
484                                                <xref linkend="making-rpm-a" />にGroup一覧を示します。
485                                                自分で作ったパッケージのグループ名をとりあえず Local
486                                                にしておくなどグループ名はこの一覧に無いものでも自由に付けられますが、
487                                                分類ということを考え適切なグループ名を選択しておきましょう。
488                                </para></listitem>
489                        </varlistentry>
490                        <varlistentry>
491                                <term>Packager</term>
492                                <listitem><para>
493                                                rpmパッケージを作ってるあなたの名前です。Email addressを入れておくと、
494                                                思わぬとこからバグ報告とかもらえて嬉しいこともあります。
495                                </para></listitem>
496                        </varlistentry>
497                        <varlistentry>
498                                <term>%description</term>
499                                <listitem><para>
500                                                このタグの下に、rpmパッケージの解説を書きます。
501                                                <command>rpm -qip &lt;rpm-name&gt;</command>で出てくる説明です。
502                                                このタグも国際化機能をもってます。日本語メッセージを表示させたいときには、
503                                                %description -l ja を用います。ただし、日本語メッセージを用意したときにも、
504                                                必ず英語メッセージは書いておきましょう。
505                                                %description は、
506                                                specファイルの一番下(ファイルリスト部の下)に持って来ることもできます。
507                                </para></listitem>
508                        </varlistentry>
509                        <varlistentry>
510                                <term>Distribution</term>
511                                <listitem><para>
512                                                作成したrpmパッケージがなんらかのディストリビューションに含まれる時、
513                                                そのディストリビューション名を書きます。
514                                </para></listitem>
515                        </varlistentry>
516                        <varlistentry>
517                                <term>Vendor</term>
518                                <listitem><para>
519                                                作成したrpmパッケージに関する責任を負うVendor名です。
520                                                なんらかのプロジェクトでrpmパッケージを作ってる時には、
521                                                そのプロジェクト名を書きましょう
522                                </para></listitem>
523                        </varlistentry>
524                        <varlistentry>
525                                <term>Url</term>
526                                <listitem><para>
527                                                ソースの情報を提供しているURLを書きます。
528                                                例えば以下のように書きます。
529                                                <screen>URL: http://www.fugahogo.com/hogehoge.html</screen>
530                                </para></listitem>
531                        </varlistentry>
532                </variablelist>
533                </sect2>
534
535                <sect2 id="tag-build-information">
536
537                <para>次にパッケージ作成時に必要となる情報に関するタグです。</para>
538
539                <variablelist>
540                        <varlistentry>
541                                <term>Source</term>
542                                <listitem><para>
543                                                rpmパッケージをつくるソース名です。
544                                                <xref linkend="making-rpm-4-1" />で設定したSOURCESのディレクトリに置いておきましょう。
545                                                ソースの入手先を明示するために、
546                                                <screen>Source: ftp://ftp.hogehoge.org/hoge-1.1.tar.gz</screen>
547                                                と書いておくと便利です。自分でつくったソースならば、
548                                                サンプルのようにファイル名のみを書いておきます。</para>
549                                        <para>複数のソースファイルがあるときには、
550<screen>
551Source0: ftp://ftp.hogehoge.org/hoge-1.1.tar.gz
552Source1: ftp://ftp.hogehoge.org/hoge-devel.tar.gz</screen>
553                                                というふうに番号をふって列挙します。(Source0 と Source は同じ意味です)</para>
554
555                                        <para>
556                                                Souce数字 で指定したファイルは %{SOURCE数字} というマクロとして <xref linkend="making-rpm-5-2" />の %prep や %install などの部分で利用できます。
557                                                %{ } の中の SOURCE は全て大文字にしてください。%{Source数字} のように小文字を利用することはできません。
558                                </para></listitem>
559                        </varlistentry>
560                        <varlistentry>
561                                <term>Patch</term>
562                                <listitem><para>
563                                                上で設定したソースにあてる、パッチファイルです。書式はSourceと同じです。
564                                                このパッチファイルもディレクトリSOUCESに置いておきましょう。
565                                                複数あるときにも、Sourceと同様に番号をふって列挙できます。
566                                </para></listitem>
567                        </varlistentry>
568                        <varlistentry>
569                                <term>Buildroot</term>
570                                <listitem><para>
571                                                <xref linkend="making-rpm-7-1" />で説明した、
572                                                仮想インストールのためのディレクトリ名を書きます。
573                                                Buildrootの設定を行わなければ、RPM_BUILD_ROOTはnullです。
574                                        </para>
575                                        <para>
576                                                例では、%{_tmppath}, %{name}, %{version}というマクロを利用して、
577                                                Buildrootが定義されています。%{_tmppath}は/usr/lib/rpm/macrosで定義されており、
578                                                /var/tmpを指します。%{name}はパッケージの名前を、%{version}はパッケージのバージョンを示すマクロです。
579                                        </para>
580                                        <para>
581                                                直接ディレクトリ名を書くのではなく、マクロを利用することを推奨します。
582                                                例の場合の Buildroot は/var/tmp/hoge-1.1-rootというディレクトリを指すことになります。
583                                </para></listitem>
584                        </varlistentry>
585                        <varlistentry>
586                                <term>%changelog</term>
587                                <listitem><para>
588                                                ここには、更新のログを書いておきます。最新の更新情報が上にくるように書きます。
589                                                必須ではありませんが、バージョンアップの履歴や設定変更などといった更新情報は、
590                                                トラブル解決の重要なヒントにもなりますので必ず書いておきましょう。
591                                        </para>                                         
592                                        <para>
593                                                %changelogは、specファイルの一番下(ファイルリスト部の下)に持って来ることもできます。
594                                        </para>
595                                        <para>
596                                                一行目の最初に * を書き、日付と変更を加えた人の名前を書きます。
597                                                二行目以降に - を書き、更新内容を書きます。
598                                                今日の日付は <command>date コマンド</command> で
599                                                <command>LANG=C date +'%a %b %d %Y'</command> とすると確認できます。
600                                                12月1日のように日の部分が一桁の場合は 0 をつけ 01 のようにします。
601                                        </para>
602                                        <para>
603                                                Vine Linux でのパッケージングルールでは
604                                                一行目に日付、パッケージャーの名前、メールアドレス、パッケージのバージョン,、リリース番号を書くことになっています。
605                                        </para>
606<screen>
607* 曜日 月 日 西暦年 パッケージャーの名前 &lt;メールアドレス&gt; バージョン-リリース番号
608- 更新内容
609</screen>
610                                        <para>
611                                                更新内容の部分でもマクロは展開され %{name} は hoge になります。
612                                                マクロを展開せずにそのまま %{name} と書きたい場合は
613                                                %%{name} のように % を二つ続けて書いて下さい。
614                                        </para>
615                                        <para>
616                                                日本語を使うことも可能になっていますが、Summary や description
617                                                のように環境変数に応じて日本語や英語のどちらかを表示するという仕組みは無いので、
618                                                英語だけで書くほうがよいでしょう。
619                                        </para>
620                                </listitem>
621                        </varlistentry>
622                </variablelist>
623
624                <para>サンプルのspecファイルのような指定で、rpmパッケージをつくると、
625                        hoge-1.1-2.i386.rpm という名前のrpmができます
626                        (architectureがi386の場合)。</para>
627
628                <para>サンプルには書かれてませんが、他にも以下のようにいろいろなタグがあります。
629                        いろいろ設定したい時に参考にして下さい。</para>
630
631                </sect2>
632                <sect2 id="tag-dependencies-information">
633
634                <para>パッケージの依存情報など、他のパッケージとの関係を扱うタグです。</para>
635
636                <variablelist>
637                        <varlistentry>
638                                <term>Requires</term>
639                                <listitem><para>
640                                                作成しているrpmパッケージが動作するのに必要なパッケージ名を書きます。
641                                                例えば、
642                                                <screen>Requires: gs</screen>
643                                                として、動作にgsがインストールしていることが必要なことを示します。
644                                          </para>
645                                          <para>
646                                                &lt;, &gt;, =, &gt;=, &lt;=といった演算子を使って必要なバージョン、
647                                                リリース番号を示すことも出来ます。<emphasis>演算子の両側には必ずスペースを入れてください。</emphasis>
648                                                (入れないと一つの名前として認識されてしまいます)
649                                                <screen>Requires: ghostscript = 5.10</screen>
650                                                とするとghostscriptのバージョン5.10が必要なことを示し、
651                                                <screen>Requires: ghostscript &gt;= 5.10</screen>
652                                                として5.10以上が必要なことを示します。必要なライブラリ名を書くこともできます。
653                                          </para>
654                                          <para>
655                                                Requiresしたいものが複数あるときには、
656                                                <screen>Requires: ghostscript &gt;= 5.10, ghostscript-fonts, VFlib = 2.24</screen>
657                                                などのように、'','' や '' ''(スペース)で区切って並べます。
658                                          </para>
659                                          <para>
660                                                また、
661                                                <screen>Requires: ghostscript &gt;= 5.10, ghostscript-fonts, VFlib = 2.24
662Requires: tetex, tetex-extra</screen>
663                                                のように複数行で書くこともできます。
664                                                たくさんのパッケージが必要となる場合や、
665                                                それらのパッケージがいくつかのグループに分類できる場合には、
666                                                複数行に書いた方がわかりやすくなります。
667                                          </para>
668                                          <para>
669                                                rpmパッケージをbuildするときには、
670                                                そのパッケージに含まれるバイナリの実行に必要なライブラリ名も、
671                                                自動的にRequiresに加えられます(正確には必要なライブラリのsonameが加えられます)。
672                                                rpmパッケージをinstallするときに、必要なライブラリがシステム上にないと、
673                                                libhoge.so is neededとかいって、おこられますが、
674                                                libhoge.soがなんというパッケージに入ってるかわからずに困ることがよくあるので、
675                                                必要なパッケージ名をきちんとRequiresに書くように心がけましょう。
676                                          </para>
677                                          <para>
678                                                筆者はbuildした時に出力されるメッセージの
679                                                <screen>Requires: /bin/sh libICE.so.6 libORBit-2.so.0</screen>
680                                                といった部分を、(bash の for文 を利用して)<command>slocate</command> と <command>rpm -qf</command> で処理してパッケージ名を調べています。
681                                                <screen>$ for i in libICE.so.6 libORBit-2.so.0 ;
682 do slocate $i |xargs rpm -qf ;
683done | sort -u</screen>
684                                          </para>
685                                </listitem>
686                        </varlistentry>
687                        <varlistentry>
688                                <term>Requires( )</term>
689                                <listitem><para>
690                                    Requires には、従来の Requires: だけではなく Requires(pre): などのように
691                                    ( ) をつけて厳密に指定することもできるようになりました。
692                                  </para>
693                                  <para>
694                                    バージョン、リリース等を演算子を用いて指定することや、複数のパッケージをまとめて指定、複数行に分けて書くなど、書式は Requires: と同じです。
695                                  </para>
696
697                                  <para>
698                                    ( ) の中には<xref linkend="Requires-options" />にあるものが入ります。
699                                    ( ) の中に入る項目は <xref linkend="making-rpm-5-2" /> のタグ等に対応しています。どの部分で必要になるかを書きます。
700                                  </para>
701
702                                  <para>
703                                    Requires( ): のように ( ) の中に何も書かなかった場合は、Requires: として扱われます。
704                                  </para>
705
706                                  <para>
707                                    ( ) の中は、Requires(pre,preun,post,postun): のように , を用いることで複数を同時に指定できます。
708                                  </para>
709
710                                  <table id="Requires-options">
711                                    <title>Requires の ( ) の中で利用できるもの</title>
712                                      <tgroup cols="2">
713                                        <thead>
714                                          <row><entry>項目</entry><entry>対応するタグ等</entry></row>
715                                        </thead>
716                                        <tbody>
717                                          <row><entry>pre</entry><entry>%pre で必要になるもの</entry></row>
718                                          <row><entry>preun</entry><entry>%preun で必要になるもの</entry></row>
719                                          <row><entry>post</entry><entry>%post で必要になるもの</entry></row>
720                                          <row><entry>postun</entry><entry>%postun で必要になるもの</entry></row>
721                                          <row><entry>prereq</entry><entry>インストール時に必要になるもの</entry></row>
722
723                                          <row><entry>verify</entry><entry>%verifyscript で必要になるもの</entry></row>
724                                          <row><entry>interp</entry><entry>スクリプト部を解釈(interpret)するために必要になるもの</entry></row>
725                                          <row><entry>rpmlib</entry><entry>rpmのデータベース等を扱うために必要なもの</entry></row>
726                                        </tbody>
727                                      </tgroup>
728                                    </table>
729                                  <para>
730                                    Requires(pre): などを指定した場合には、PreReq: の時と同様に、<emphasis>インストール、アンインストールされる順番が保証されます。</emphasis>
731                                    指定されたパッケージは<emphasis>先にインストールされ、後にアンインストールされます。</emphasis>
732                                  </para>
733
734                                  <para>prereq は pre,preun,post,postun などよりも曖昧な書き方ですが、PreReq で書かれていたものを Requires に機械的に置き換える場合には利用できると思います。</para>
735
736                                  <para>rpmlib については、通常、build 時に自動的に追加されるものなので、特別な機能を利用するのでなければ、記述する必要はありません。</para>
737
738                                  <para>interp も、自動的に追加されますが、特別な shell などを利用する場合には記述しておいた方がよいでしょう。</para>
739
740                                </listitem>
741                        </varlistentry>
742
743                        <varlistentry>
744                                <term>PreReq</term>
745                                <listitem><para>
746                                    rpm 4.0. から 4.0.[12] の間の変更で、PreReq: の代わりに Requires(prereq): 等を用いるようになりました。
747                                    PreReq: もまだ利用できますが legacy という扱いなので、Requires(prereq): 等の使用を推奨します。
748                                </para></listitem>
749
750                                <listitem><para>
751                                    Requiresと同様に必要とするパッケージ名を書きます。バージョンの指定もできます。
752                                    Requiresとの違いは<emphasis>インストールされる順番が保証される</emphasis>ということだけです。
753                                    Prereqで指定されたパッケージは<emphasis>先にインストールされます。</emphasis>
754                                  </para>
755                                  <!-- 参照 /usr/share/doc/rpm-<ver>/dependencies -->
756                                  <para>
757                                    A というパッケージが Prereq: B として B というパッケージを要求した場合には、
758                                    B のパッケージが A のパッケージより先にインストールされているかチェックが行われるので、
759                                    <command>rpm -ivh A B</command> のように
760                                    A と B を同時にインストールするように指定した場合にも
761                                    B が A より先にインストールされるようになります。
762                                  </para>
763                                  <para>
764                                    パッケージの<emphasis>インストール時</emphasis>
765                                    <emphasis>アンインストール時</emphasis>に必要となるパッケージは、
766                                    Prereq で指定してください。
767                                    Requiresと重複してもかまいません。
768                                  </para>
769                                  <para>
770                                    例えば、infoファイルをもったパッケージでは、
771                                    パッケージインストール時(%post)の infoファイルのインストールに
772                                    install-info が必要となるので、Prereq で指定する必要があります。
773                                  </para>
774                                  <para>
775                                    パッケージの動作自体には直接必要なくても、
776                                    <emphasis>%pre</emphasis>,<emphasis>%post</emphasis>,<emphasis>%preun</emphasis>,<emphasis>%postun</emphasis>
777                                    などで必要になるコマンドやパッケージは、Prereq で指定する必要があります。
778                                  </para>
779                                 
780                                </listitem>
781                        </varlistentry>
782                        <varlistentry>
783                                <term>Conflicts</term>
784                                <listitem><para>
785                                                Requiresと逆の意味を持ちます。すなわち、共存できないパッケージ名を指定できます。
786                                                バージョンやリリース番号指定もRequiresと同様にできます。
787                                                例えば以下のように指定します。
788                                                <screen>Conflicts: fugefuge &gt;= 1.0, fugafuga = 1.2-1</screen>
789                                </para></listitem>
790                        </varlistentry>
791                        <varlistentry>
792                                <term>Provides</term>
793                                <listitem>
794                                          <para>
795                                                パッケージが提供する機能を書きます。
796                                          </para>
797                                          <para>
798                                                日本語化されたgsであるgs<emphasis>j</emphasis>というパッケージがあるとします。
799                                                このパッケージはもともとのgsと同等の機能を持っています。
800                                                インストールしたいhoge-1.1-2.rpmがgsを必要(Requires)としてるとしましょう。
801                                                しかし、gs<emphasis>j</emphasis>がインストールされているためにgsはインストールされていません。
802                                                このとき、hoge.rpmをインストールしようとするとrpmコマンドは
803                                                gsが無いためにエラー・メッセージを出します。
804                                          </para>
805                                          <para>
806                                                このようなトラブルをさけるためには、gs<emphasis>j</emphasis>を作るときに、
807                                                <screen>Provides: gs</screen>
808                                                と書いておくと、gs<emphasis>j</emphasis>はgsパッケージを提供することができます。
809                                          </para>
810                                          <para>
811                                                また、あるパッケージ A がpdfを読むツールをRequiresするときに、
812                                                xpdf と gs(pdf対応) のように複数の選択肢がある場合、
813                                                xpdf と gs の Providesに
814                                                <screen>Provides: pdf-reader</screen>
815                                                と仮想的なパッケージ名(仮想パッケージ virtual package)を書いておいて、
816                                                A で Requires: pdf-reader としておけば、パッケージ名を限定せずに、
817                                                なんらかのpdf-readerがインストールされてることを要求できます。
818                                                たとえば emacs lisp のパッケージでは emacs や xemacs ではなく
819                                                emacsen という仮想パッケージを要求するものが多いです。
820                                </para></listitem>
821                        </varlistentry>
822                        <varlistentry>
823                                <term>Obsoletes</term>
824                                <listitem><para>
825                                                仮に、pLaTeX2eのrpmをインストールするときには、
826                                                古いTeXのパッケージであったptexはアンインストールしたいとしましょう。
827                                                こんなときには、pLaTeX2eのspecファイルには、
828                                                <screen>Obsoletes: ptex</screen>
829                                                と書いておくと、pLaTeX2eのインストール時にptexは消去されます。
830                                </para></listitem>
831                        </varlistentry>
832                        <varlistentry>
833                                <term>BuildRequires</term>
834                                <listitem><para>
835                                                パッケージの作成の時に必要になるパッケージを書きます。
836                                                例えば、
837                                                <screen>BuildRequires: zlib-devel</screen>
838                                                として、パッケージの作成に zlib-devel パッケージが必要なことを示します。
839                                          </para>
840                                          <para>
841                                                コンパイラなどのパッケージや、
842                                                ヘッダーファイルやライブラリなどを含んだ hoge-devel
843                                                などのパッケージで不足するものがないか確認しましょう。
844                                          </para>
845                                          <para>
846                                                また、Source: で指定されたファイルが hoge.zip のように zip 形式の場合は、
847                                                ソースの展開に unzip のパッケージが、
848                                                同様に lzh 形式なら lha のパッケージが必要になります。
849                                          </para>
850                                          <para>
851                                                Vine Linux では <filename>build-essential</filename> という仮想パッケージがあり、
852                                                このパッケージをインストールすることでたくさんのパッケージがインストールされます。
853                                                参照 <ulink url="using-rpm-4.html#using-rpm-4-2">環境設定</ulink>
854                                          </para>
855                                          <para>
856                                                パッケージの作成時には build-essential をインストールすることを前提としているので、
857                                                build-essential に含まれている make,gzip,bzip2,tar,patch,findutils,coreutils,file,libtool,automake,autoconf などは省略してかまいません。
858                                                gcc や gettext などは、ソースが C言語であることや、メッセージが国際化されていることなどを示す意味もあるので、必要であれば書いておいた方がいいかもしれません。
859                                          </para>
860                                          <para>
861                                                <emphasis>%prep</emphasis>,<emphasis>%setup</emphasis>,<emphasis>%build</emphasis>,<emphasis>%install</emphasis> で必要になるコマンドやパッケージを指定します。
862                                </para></listitem>
863                        </varlistentry>
864                        <varlistentry>
865                                <term>BuildRequires( )</term>
866                                <listitem><para>
867                                    Requires( ): と同じように、BuildRequires も ( ) をつけて詳細な指定をすることができます。
868                                  </para>
869                                  <para>
870                                    ( ) の中には<xref linkend="BuildRequires-options" />にあるものが入ります。
871                                    ( ) の中に入る項目は <xref linkend="making-rpm-5-2" /> のタグ等に対応しています。どの部分で必要になるかを書きます。
872                                  </para>
873                                  <table id="BuildRequires-options">
874                                    <title>BuildRequires の ( ) の中で利用できるもの</title>
875                                      <tgroup cols="2">
876                                        <thead>
877                                          <row><entry>項目</entry><entry>対応するタグ等</entry></row>
878                                        </thead>
879                                        <tbody>
880                                          <row><entry>prep</entry><entry>%prep,%setup で必要になるもの</entry></row>
881                                          <row><entry>build</entry><entry>%build で必要になるもの</entry></row>
882                                          <row><entry>install</entry><entry>%install,%check で必要になるもの</entry></row>
883                                          <row><entry>clean</entry><entry>%clean で必要になるもの</entry></row>
884                                        </tbody>
885                                      </tgroup>
886                                    </table>
887
888                                </listitem>
889                        </varlistentry>
890                        <varlistentry>
891                                <term>BuildPrereq</term>
892                                <listitem><para>
893                                                BuildRequiresと同様にパッケージの作成の時に必要になるパッケージを書きます。
894                                                BuildRequiresとの違いは必要とするパッケージを<emphasis>作成する順番を決める</emphasis>ということです。
895                                  </para>
896                                  <para>
897                                    BuildRequiresと同様、BuildPrereq(prep) のように prep,build,install,clean を指定できます。
898                                  </para>
899                                    <!-- 参照 http://www.redhat.com/archives/rpm-list/2004-April/msg00164.html -->
900                                          <para>
901                                                A というパッケージがパッケージ作成時に B と C の二つのパッケージを必要としているとします。
902                                                この場合 B と C をインストールすれば、A というパッケージを作成することができます。
903                                          </para>
904                                          <para>
905                                                このときに B と C のパッケージがなくて、それぞれ作る必要があったとします。
906                                                B と C がそれぞれ独立したものではなく、C のパッケージ作成時に B が必要で、
907                                                できあがった C は B の特定のバージョンを必要とするパッケージになるということがあります。
908                                                このような場合には BuildPrereq に B を BuildRequires に C を指定し、
909                                                B を C よりも先に作成する必要があるということを示しておきます。
910                                </para></listitem>
911                        </varlistentry>
912                        <varlistentry>
913                                <term>BuildConflicts</term>
914                                <listitem><para>
915                                                BuildRequiresと逆の意味を持ちます。
916                                                パッケージ作成時にはインストールしておけないパッケージ名を指定できます。
917                                                例えば以下のように指定します。
918                                                <screen>BuildConflicts: huga</screen>
919                                </para></listitem>
920                        </varlistentry>
921                        <varlistentry>
922                                <term>Prefix</term>
923                                <listitem><para>
924                                                このタグを使うと、
925                                                rpmパッケージをインストールする時にインストールディレクトリをコントロールできます。
926                                                例えば、
927                                                <screen>Prefix: /usr</screen>
928                                                としていて、ファイル定義部で
929<screen>
930%files
931/usr/bin/fuga</screen>
932                                                と定義してたとしましょう。このパッケージをインストールする時に、
933                                                --prefix /usr/local とオプション指定すると、
934                                                fugaは/usr/local/bin/fuga.binにインストールされます。
935                                </para></listitem>
936                        </varlistentry>
937                        <varlistentry>
938                                <term>BuildArch</term>
939                                <listitem><para>
940                                                書いたspecファイルを使って生成されるrpmパッケージのアーキテクチャを指定できます。
941                                                例えば、elファイルとかシェルスクリプトとかばかりを含むrpmパッケージを作るときには、
942                                                i386やalphaなどのアーキテクチャに依存しないnoarchであることを、
943                                                <screen>BuildArch: noarch</screen>
944                                                というふうに明示します。
945                                                このような指定をしておくとnoarch.rpmという拡張子のつくrpmパッケージが作成できて、
946                                                いろいろなアーキテクチャ上で共用できます。
947                                </para></listitem>
948                        </varlistentry>
949                        <varlistentry>
950                                <term>ExclusiveArch</term>
951                                <listitem><para>
952                                                specファイルや src.rpmパッケージから、パッケージを生成 できる アーキテクチャーを指定します。
953                                                たとえば、ExclusiveArch: i386 とすると、i386 以外の ppc,i486,i586,i686,x86_64 といったアーキテクチャーではバイナリパッケージを生成できなくなります。
954                                </para></listitem>
955                        </varlistentry>
956                        <varlistentry>
957                                <term>ExcludeArch</term>
958                                <listitem><para>
959                                                specファイルや src.rpmパッケージから、パッケージを生成 できない アーキテクチャーを指定します。
960                                                たとえば、ExcludeArch: ppc とすると、ppc ではバイナリパッケージを生成できなくなります。ppc 以外の i386,i486,i586,i686,x86_64 といったアーキテクチャーではバイナリパッケージを生成できます。
961                                </para></listitem>
962                        </varlistentry>
963                </variablelist>
964                </sect2>
965
966                <para>データ定義部には、さらにいろいろな情報を付け加えることもできます。
967                        MaximumRPM等を見てください。</para>
968        </sect1>
969
970        <sect1 id="making-rpm-5-2">
971                <title>スクリプト部</title>
972                <para>
973                        データ定義部の次の部分は、以下のような%が頭に付くタグからはじまる、
974                        一連のscriptで構成されます。重要なのは、各タグから始まる次のタグの前までの部分は、
975                        独立したbashスクリプトとして実行されるということです。
976                        (注:以下で、%setup, %patchはスクリプトのはじまりを表すタグではなく、
977                        スクリプト中で記述を簡略するためのマクロです。)</para>
978
979                <para>より正確には、各タグが現れた時に #!/bin/sh -e
980                        が起動され(Vine Linuxでは/bin/shは/bin/bashにsym.linkされてる)、
981                        各環境変数(RPM_SOURCE_DIRやRPM_PACKAGE_NAMEなど)が定義された後、
982                        次のタグが出てくるまで、記述されているスクリプトが実行されます。</para>
983
984                <variablelist>
985                        <varlistentry>
986                                <term>%prep</term>
987                                <listitem><para>
988                                                ソースのmakeやインストール作業前の準備の開始を示すタグです。
989                                                以下で説明する%setup,%patchなどのマクロを用いたり、
990                                                シェルスクリプトを記述して、ソースの展開などを行います。
991                                                ここで、
992<screen>
993%prep
994rm -rf ${RPM_BUILD_ROOT}
995</screen>
996                                                として、${RPM_BUILD_ROOT}(先のBuildrootで指定したディレクトリ)
997                                                を掃除することが多いです。ただし、このときには、
998                                                Buildrootの設定には十分気をつけて下さい(何故かわかりますね?)
999                                </para></listitem>
1000                        </varlistentry>
1001                        <varlistentry>
1002                                <term>%setup</term>
1003                                <listitem><para>
1004                                                %prepからはじまるスクリプト中で、ソースを展開するためのマクロです。
1005                                                %setupとオプションなしで書くと、以下が順に行われます。</para>
1006                                        <orderedlist>
1007                                                <listitem><para>
1008                                                                <xref linkend="making-rpm-4-1" />で指定したディレクトリBUILDにcdする。
1009                                                </para></listitem>
1010                                                <listitem><para>
1011                                                                指定ディレクトリ(-nで指定できる。デフォルトのディレクトリ名は、
1012                                                                ${RPM_PACKAGE_NAME}-${RPM_PACKAGE_VERSION}、後述)
1013                                                                がカレント・ディレクトリ(BUILD)に存在すれば消去する。
1014                                                </para></listitem>
1015                                                <listitem><para>
1016                                                                Sourceで指定したtar.gzのソースを展開する。
1017                                                </para></listitem>
1018                                                <listitem><para>指定ディレクトリ(2の指定ディレクトリ名と同じ)にcdする。
1019                                                </para></listitem>
1020                                                <listitem><para>
1021                                                                以下を実行する。</para>
1022<screen>
1023chown -R root .
1024chgrp -R root .
1025chmod -R a+rX,g-w,o-w .
1026</screen>
1027                                                        <para>(注:一般userがrpmをbuildするときには、chown root,
1028                                                                chgrp rootは実行権限がないので行われない。
1029                                                                一般userでbuildするときには、
1030                                                                %filesの%attrでファイルの属性設定を行う。後述)
1031                                                </para></listitem>
1032                                        </orderedlist>
1033                                        <para>
1034                                                hoge-1.1.tar.gzを展開したときに、hoge-1.1/というディレクトリができるなら、
1035                                                オプションをつけなくても以上の作業が行われますが、例えば、
1036                                                hoge/というディレクトリができるなら、このディレクトリの下にcdできるように、
1037                                                <screen>%setup -n hoge</screen>
1038                                                または、
1039                                                <screen>%setup -n ${RPM_PACKAGE_NAME}</screen>
1040                                                と指定します。
1041                                        </para>
1042                                        <para>
1043                                                複数のソースがあるときには以下に述べるオプション-aや-bを使います。
1044                                                例えばSource、Source1、Source2の3つがあるときには、
1045                                                <screen>%setup -a 1 -a 2 -n hoge</screen>
1046                                                などとします。(以下のオプションの指定参照。)
1047                                        </para>
1048                                        <para>
1049                                                この%setupにはさまざまなオプションがありますが、
1050                                                代表的なものを以下に示します。
1051                                        </para>
1052                                        <variablelist>
1053                                                <varlistentry>
1054                                                        <term>-n &lt;ディレクトリ名&gt;</term>
1055                                                        <listitem><para>
1056                                                                        %setupを実行した後(もしくは前)にcdするディレクトリ名(name)を指定する。
1057                                                                        このオプションを省略したときの、デフォルトのディレクトリ名は、
1058                                                                        ${RPM_PACKAGE_NAME}-${RPM_PACKAGE_VERSION}。
1059                                                        </para></listitem>
1060                                                </varlistentry>
1061                                                <varlistentry>
1062                                                        <term>-c</term>
1063                                                        <listitem><para>
1064                                                                        指定ディレクトリ(上の-nオプションで指定したディレクトリ)
1065                                                                        を作成し(create)、そこにcdした後にソースの展開をします。
1066                                                        </para></listitem>
1067                                                </varlistentry>
1068                                                <varlistentry>
1069                                                        <term>-a &lt;#&gt;</term>
1070                                                        <listitem><para>
1071                                                                        Source0を展開した後、
1072                                                                        指定ディレクトリ(上と同じ)にcdした(after)、
1073                                                                        #番目のソース(Source#)の展開をします。
1074                                                                        %setup -a 2 -a 3 と複数-aオプションが指定された時には、
1075                                                                        Source0 が展開された後、指定ディレクトリに cd し、
1076                                                                        Source2、Source3を展開します。
1077                                                                        (Source0の展開は最初の一回だけです。)
1078                                                        </para></listitem>
1079                                                </varlistentry>
1080                                                <varlistentry>
1081                                                        <term>-b &lt;#&gt;</term>
1082                                                        <listitem><para>
1083                                                                        Source0を展開した後、
1084                                                                        指定ディレクトリ(上と同じ)にcdする前に(before)、
1085                                                                        #番目に指定されてるソース(Source#)の展開をします。
1086                                                        </para></listitem>
1087                                                </varlistentry>
1088                                                <varlistentry>
1089                                                        <term>-D</term>
1090                                                        <listitem><para>
1091                                                                        先に述べたように、%setupは、まず、指定ディレクトリ(上と同じ)が、
1092                                                                        ディレクトリBUILDの下にあるかどうかをチェックして、もし存在していたら、
1093                                                                        それを削除してから、ソースの展開などの作業を行います。
1094                                                                        %setupを複数回呼びたい場合、
1095                                                                        2回目に%setupを呼んだ時に最初の%setupで展開したディレクトリを削除されては困ります。
1096                                                                        この-Dオプションは、このような削除を行わないようにします。(あまり使いません)
1097                                                        </para></listitem>
1098                                                </varlistentry>
1099                                                <varlistentry>
1100                                                        <term>-T</term>
1101                                                        <listitem><para>
1102                                                                        ソースの展開を行いません。先に述べたように、
1103                                                                        オプション指定を -a 2 や -b 2 とすると、
1104                                                                        Source0とSource2で指定したものが展開されます。
1105                                                                        Source2だけを展開したいときには、このオプションを使って、
1106                                                                        <screen>%setup -T -a 2</screen>
1107                                                                        とします。また、
1108                                                                        <screen>%setup -T -c hoge</screen>
1109                                                                        とすると、パッケージの展開は行わず、ディレクトリhogeを作って、
1110                                                                        そこにcdします。
1111                                                        </para></listitem>
1112                                                </varlistentry>
1113                                                <varlistentry>
1114                                                        <term>-q</term>
1115                                                        <listitem><para>
1116                                                                        ソースの展開のとき、展開中の情報を表示しません。
1117                                                                        たとえば tar での展開の時に、-q 無しだと tar xvvf、-q 有りだと tar xf のように変わります。
1118                                                        </para></listitem>
1119                                                </varlistentry>
1120                                        </variablelist>
1121
1122                                        <variablelist>
1123                                                <varlistentry>
1124                                                  <listitem><para>
1125                                                      次のように tar.gz ではないファイルが Source0 となる場合があります。
1126                                                      <screen>Source0: hoge-%{version}.lzh</screen>
1127                                                      tar.gz ではないので、%setup では展開できません。
1128                                                </para>
1129                                                <para>
1130                                                        このような場合には、まず %setup の -Tオプション を利用して作業ディレクトリに移動します。
1131                                                        %setup のあとには、bash script を書いて作業を行うことができるので、
1132                                                        通常のコマンドで Source0 のファイルを展開します。
1133                                                        <screen>%setup -T hoge-%{version}
1134lha x %{SOURCE0}</screen>
1135                                                </para>
1136                                                <para>
1137                                                        %{SOURCE0} のかわりに ${RPM_SOURCE_DIR}とファイル名を用いて
1138                                                        <screen>%setup -T hoge-%{version}
1139lha x ${RPM_SOURCE_DIR}/hoge.lzh</screen>
1140                                                        とすることもできます。
1141                                                </para></listitem>
1142                                                </varlistentry>
1143                                                <varlistentry>
1144                                                        <listitem><para>
1145                                                                次のように tar.gz などでは無いファイルが Source2 としてあるということがあります。
1146                                                                <screen>Source0: hoge-%{version}.tar.gz
1147Source1: hoge-additional-%{version}.tar.gz
1148Source2: how-to-use-hoge.txt</screen>
1149                                                        </para>
1150                                                        <para>
1151                                                                こういった場合には、Source0 と Source1 を %setup で展開したあとで、<command>installコマンド</command>などで、Source2 に対応するマクロ %{SOURCE2} を処理します。
1152                                                        </para>
1153                                                        <para>%setup で展開するのと同じ処理をしたければ、
1154                                                                <screen>%setup -q -a 1
1155%{__install} -m 644 %{SOURCE2} .</screen>
1156                                                                のようにします。
1157                                                        </para>
1158                                                        <para>
1159                                                                %setup で Source0 を展開してできたディレクトリ BUILD/hoge-%version/  に移動しているので、<command>installコマンド</command> で . (カレントディレクトリ<footnote><para>current directory, 現在のディレクトリ</para></footnote>) を指定すると . は BUILD/hoge-%version/ となっているので、BUILD/hoge-%version/に Source2 が install されます。
1160                                                        </para>
1161                                                        <para>
1162                                                                他のファイルと同じように BUILD/hoge-%version/ にあるので %doc として指定するのもそのままできます。
1163                                                                <screen>%files
1164%doc how-to-use-hoge.txt</screen>
1165                                                        </para>
1166                                                        <para>
1167                                                                %{SOURCE2} といったマクロは %doc のところでは使えないので、%doc %{SOURCE2} とすることはできません。
1168                                                        </para></listitem>
1169                                                </varlistentry>
1170
1171                                                <varlistentry>
1172                                                        <listitem><para>
1173                                                                lha や unzip など、特別なコマンドが必要になる場合は、
1174                                                                BuildRequires(prep): で指定します。
1175                                                        </para></listitem>
1176                                                </varlistentry>
1177                                        </variablelist>
1178                                </listitem>
1179                        </varlistentry>
1180
1181                        <varlistentry>
1182                                <term>%patch</term>
1183                                <listitem><para>
1184                                                %prepからはじまるスクリプト中で、patchをあてるためのマクロとしてはたらきます。
1185                                                例のように書くと、
1186                                                <screen>patch -p1 -s &lt; ${RPM_SOURCE_DIR}/&lt;Patchで指定したファイル&gt;</screen>
1187                                                と同じことをするので、%patchを使うかわりに%setupのあとで上のように書いてもいいです。
1188                                                オプションなしで%patchと書くと、
1189                                                <screen>patch -p0 -s &lt; ${RPM_SOURCE_DIR}/&lt;Patchで指定したファイル&gt;</screen>
1190                                                が起動されます。%patchは%setupからはじまるスクリプトに含まれる、
1191                                                単なるマクロとしてはたらきます。
1192                                                Sourceと同様に、Patch0, Patch1,...と複数の設定に対して、
1193<screen>
1194%patch0 -p1
1195%patch1 -p1
1196</screen>
1197                                                と実行することも出来ます。%patchには-b &lt;name&gt;
1198                                                (バックアップ・ファイルの拡張子指定、デフォルトは.orig)などのオプ
1199                                                ションがあります。
1200                                </para></listitem>
1201                        </varlistentry>
1202
1203                        <varlistentry>
1204                                <term>%build</term>
1205                                <listitem><para>
1206                                                ソースをmakeするスクリプトの開始であることを示し、また、
1207                                                %setupで指定したディレクトリにcdするマクロとしてはたらきます。
1208                                                以下には、makeを行うときの手順をスクリプトとして書きます。
1209                                </para></listitem>
1210                                <listitem><para>
1211                                                ここでの処理で必要となるパッケージ等は、
1212                                                BuildRequires(build): で指定します。
1213                                </para></listitem>
1214                        </varlistentry>
1215
1216                        <varlistentry>
1217                                <term>%install</term>
1218                                <listitem><para>
1219                                                ファイルをinstallするスクリプトの開始であることを示し、また、
1220                                                %setupで指定したディレクトリにcdするマクロとしてはたらきます。
1221                                                以下には、installを行うときの手順を示します。
1222                                                ここで、<xref linkend="making-rpm-4-2" />で述べたように、
1223                                                データ定義部のBuildrootで設定したディレクトリ(${RPM_BUILD_ROOT})
1224                                                の下に全てのファイルがインストールされるように、工夫しましょう。
1225                                                Makefileが短いときには、修正してpatchをつくるかわりに、ここに、
1226                                                cp, installコマンド等を用いたinstallスクリプトを書くのも一手です。
1227                                        </para>
1228                                        <para>
1229                                                %setup のところと同じように、マクロ %{SOURCE数字} を使って Source: で指定したファイルを直接インストールすることもできます。
1230                                                <screen>%{__install} -m 644 %{SOURCE2} %{buildroot}/where/there/</screen>
1231                                        </para>
1232                                        <para>
1233                                                なお、rpm-3.0.5以降では、インストールされたバイナリは
1234                                                rpmパッケージにする段階で自動的にstripされますので、
1235                                                %installでbinaryのstripを行う必要はありません。
1236                                </para></listitem>
1237                                <listitem><para>
1238                                                ここでの処理で必要となるパッケージ等は、
1239                                                BuildRequires(install): で指定します。
1240                                </para></listitem>
1241                        </varlistentry>
1242
1243                        <varlistentry>
1244                                <term>%check</term>
1245                                <listitem><para>
1246                                                install が正しく実行されたかをcheckするスクリプトの開始であることを示します。
1247                                                %setupで指定したディレクトリにcdするマクロとしてはたらきます。
1248                                                以下には、make test や make check などを実行するときの手順を示します。
1249                                        </para>
1250                                        <para>
1251                                                GNOME などが利用する desktopファイルの書式チェックなどを行うこともできます。
1252                                                <xref linkend="making-rpm-b" />のGNOME,KDE,Xfce のメニューに追加するためにを参照してください。
1253                                        </para>
1254                                        <para>
1255                                                rpm-4.2以降で実装された機能です。
1256                                </para></listitem>
1257                                <listitem><para>
1258                                                ここでの処理で必要となるパッケージ等は、
1259                                                BuildRequires(install): で指定します。
1260                                </para></listitem>
1261                        </varlistentry>
1262
1263                        <varlistentry>
1264                                <term>%clean</term>
1265                                <listitem><para>
1266                                                rpmを作ったあとの後始末をこのタグの下に記述します。
1267                                </para></listitem>
1268                                <listitem><para>
1269                                                ここでの処理で必要となるパッケージ等は、
1270                                                BuildRequires(clean): で指定します。
1271                                </para></listitem>
1272
1273                        </varlistentry>
1274                </variablelist>
1275                <para>
1276                        スクリプト部に入れることができるタグは、ほかにも、いろいろあります。たとえば、
1277                        以下のタグはそれぞれインストール時やアンインストール時に起動するシェルスクリプトを記述するためのものです。
1278                </para>
1279                <variablelist>
1280                        <varlistentry>
1281                                <term>%pre</term>
1282                                <listitem><para>
1283                                                rpmパッケージをinstallするとき、パッケージの展開前に行うことを書く。
1284                                                -pオプションについては%postの場合(以下)参照。
1285                                </para></listitem>
1286                                <listitem><para>
1287                                                ここでの処理で必要となるパッケージ等は、
1288                                                Requires(pre): で指定します。
1289                                </para></listitem>
1290                        </varlistentry>
1291
1292                        <varlistentry>
1293                                <term>%post</term>
1294                                <listitem><para>
1295                                                rpmパッケージをinstallするとき、パッケージの展開後に行うことを書く。
1296                                        </para>
1297                                </listitem>
1298                                <listitem><para>
1299                                    ここでの処理で必要となるパッケージ等は、
1300                                    Requires(post): で指定します。
1301                                </para></listitem>
1302
1303                                <listitem>
1304                                        <para>
1305                                                たとえば、infoファイルをインストールする時には、
1306<screen>%post
1307if [ "$1" = 0 ] ; then
1308        %{_syssbindir}/install-info %{_infodir}/hoge.info.gz %{_infodir}/dir
1309fi</screen>
1310                                                として、info のメニューエントリに infoファイルを追加します。
1311                                                if [ $1 = 0 ]; then と fi の行は、
1312                                                アップグレード時には実行せず、インストール時だけに実行させるための記述です。
1313                                                <xref linkend="making-rpm-9" />を参照してください。
1314                                        </para>
1315                                        <para>
1316                                                %{_syssbindir}/install-info というコマンドが必要になるので、
1317                                                Requires(post): %{_syssbindir}/install-info とします。
1318                                        </para>
1319                                        <para>
1320                                                info ファイルは、アンインストール時にも処理が必要になります。
1321                                                %preun も参照してください。
1322                                        </para>
1323                                       
1324
1325                                        <para>
1326                                                たとえば、ライブラリをインストールする時には、
1327<screen>
1328%post
1329%{_syssbindir}/ldconfig
1330</screen>
1331                                                とすると、ldconfigが実行される。また、代わりに
1332                                                <screen>%post -p %{_syssbindir}/ldconfig</screen>
1333                                                と、-pオプションを用いて書くと、
1334                                                シェルを起動すること無く直接コマンドが実行される。
1335                                                またこのコマンドはrpmパッケージのインストール時に必要なコマンドとして、
1336                                                Requires(interp): %{_syssbindir}/install-info として登録される。
1337                                        </para>
1338
1339                                        <para>
1340                                                正確にいうと、タグに <option>-p</option>オプションをつけた場合は、
1341                                                /bin/sh ではなく別のプログラムでスクリプト部分を解釈(interpret)させるということになります。
1342                                                この場合には Requires(interp) として登録されます。(%postなので Requires(post) としても登録されます。)
1343                                        </para>
1344                                        <para>
1345                                                以下は問題が起こる例です。
1346<screen>
1347%post -p %{_syssbindir}/ldconfig
1348# update ld.so.cache
1349
1350%files</screen>
1351                                                この場合は %post と %files の間の2行が、スクリプト部分になります。
1352                                                一行目に
1353                                                <screen># update ld.so.cache</screen>
1354                                                と書いてあります。
1355                                                bash であれば、# で始まる行は コメントと解釈され無視されますが、
1356                                                このスクリプト部分を読み、実行するのは /bin/sh ではなく %{_syssbindir}/ldconfig です。
1357                                                ldconfig には # 以降をコメントとして無視するというルールは無いので、
1358                                                そのまま実行しようとしてエラーになります。
1359                                        </para>
1360                                        <para>
1361                                                エラーを起こさないようにするには
1362<screen>
1363%post -p %{_syssbindir}/ldconfig
1364
1365
1366%files</screen>
1367                                                とするか、
1368<screen>
1369%post
1370%{_syssbindir}/ldconfig
1371# update ld.so.cache
1372
1373%files</screen>
1374                                                とします。
1375                                        </para>
1376
1377                                        <para>
1378                                                一つ目の例では、%{_syssbindir}/ldconfig がスクリプト部分を実行するために起動し(、起動した時点で ld.so.cache が更新されますが)、スクリプト部分については何も書かれていないので何もせずに終了します。
1379                                        </para>
1380                                        <para>
1381                                                二つ目の例では、/bin/sh が起動し、スクリプト部分を解釈し %{_syssbindir}/ldconfig を実行、# 以下はコメントなので無視します。
1382                                </para></listitem>
1383                        </varlistentry>
1384
1385                        <varlistentry>
1386                                <term>%preun</term>
1387                                <listitem><para>
1388                                    rpmパッケージをuninstallするとき、展開ファイルの削除前に行うことを書く。
1389                                </para></listitem>
1390                                <listitem><para>
1391                                    ここでの処理で必要となるパッケージ等は、
1392                                    Requires(preun): で指定します。
1393                                </para></listitem>
1394                                <listitem><para>
1395                                                -pオプションについては%postの場合と同様です。Requires(interp): と Requires(preun): に登録されます。
1396                                        </para>
1397                                        <para>
1398                                                たとえば info ファイルをアンインストールする時には、
1399<screen>
1400%preun
1401if [ $1 = 0 ]; then
1402        %{_syssbindir}/install-info --delete %{_infodir}/hoge.info.gz %{_infodir}/dir
1403fi
1404</screen>
1405                                                として、info のメニューエントリから削除します。
1406                                                if [ $1 = 0 ]; then と fi の行は、
1407                                                アップグレード時には実行せず、アンインストール時だけに実行させるための記述です。
1408                                                <xref linkend="making-rpm-9" />を参照してください。
1409                                </para></listitem>
1410                        </varlistentry>
1411                        <varlistentry>
1412                                <term>%postun</term>
1413                                <listitem><para>
1414                                                rpmパッケージをuninstallするとき、各ファイルを削除した後に行うことを書く。
1415                                </para></listitem>
1416                                <listitem><para>
1417                                    ここでの処理で必要となるパッケージ等は、
1418                                    Requires(postun): で指定します。
1419                                </para></listitem>
1420                                <listitem><para>
1421                                                -pオプションについては%postの場合と同様です。Requires(interp): と Requires(postun): に登録されます。
1422                                </para></listitem>
1423                        </varlistentry>
1424
1425                </variablelist>
1426                <para>
1427                        以上のタグは、作成したrpmパッケージをinstallやuninstallするときの、
1428                        実行されるスクリプトの設定になるので、
1429                        specファイルからrpmパッケージを作るときには、実行されることはありません。
1430                </para>
1431                <para>
1432                        さらに、他のパッケージがインストールされた時に起動するスクリプトも記述できます。
1433                </para>
1434                <variablelist>
1435                        <varlistentry>
1436                                <term>%triggerin</term>
1437                                <listitem><para>
1438                                                あるパッケージがインストールされていた、
1439                                                もしくは、された時に起動するスクリプトを書く。たとえば、
1440<screen>
1441%triggerin -- hoge
1442echo "hoge is installed"
1443</screen>
1444                                                と書いておくと、パッケージhogeをインストールしたときに、
1445                                                上記メッセージが表示されます。以下のように、バージョン指定もできます。
1446<screen>
1447%triggerin -- hoge &gt; 3.0
1448echo "hoge is installed"
1449</screen>
1450                                                同様にして、あるパッケージの削除前に実行される%triggerun、
1451                                                あるパッケージの削除後に実行される%triggerpostunがあります。このタグについては、
1452                                                <filename>/usr/share/doc/rpm-&lt;version&gt;/triggers</filename> に詳しい説明があります。
1453                                </para></listitem>
1454                        </varlistentry>
1455                        <para>
1456                          <emphasis>%pre %post %preun %postun %triggerin %triggerun %triggerpostun といったタグを使うのは、ちょっと注意が必要です。</emphasis>
1457                          詳しくは、<xref linkend="making-rpm-9" />を参照してください。
1458                        </para>
1459
1460                        <para>パッケージが正しくインストールされているかを検証するには、rpm コマンドで -V オプションを用いますが、-V オプションでできることを増やすためのタグもあります。</para>
1461
1462                        <varlistentry>
1463                                <term>%verifyscript</term>
1464                                <listitem><para>
1465                                                rpmパッケージを検証するとき(rpm -Vを実行した時)に、追加して実行することを書く。
1466                                </para></listitem>
1467                                <listitem><para>
1468                                        ここでの処理で必要となるパッケージ等は、
1469                                        Requires(verify): で指定します。
1470                                </para></listitem>
1471                                <listitem><para>
1472                                                -pオプションについては%postの場合と同様です。Requires(interp): と Requires(verify): に登録されます。
1473                                  </para>
1474                                  <para>
1475                                                このスクリプトの実行結果は、成功した場合には何も表示されず、エラーが発生したときにエラーメッセージのみが標準出力に出力されます。rpm -Vvv などのようにした場合には、標準出力への出力も確認できます。
1476                                  </para></listitem>
1477
1478                                <listitem><para>
1479                                                たとえば、%pre で %{_sbindir}/useradd hoge などとしてユーザーを登録した場合には、
1480                                                <screen>%verifyscript
1481%{_bindir}/id hoge</screen>
1482                                                としておくと、hoge というユーザーが存在しているかどうかを確認することができます。
1483                                  </para>
1484                                  <para>
1485                                                この場合、/usr/bin/id というコマンドは coreutils というパッケージに含まれているので、
1486                                                Requires(verify): %{_bindir}/id あるいは、Requires(verify): coreutils とします。
1487                                </para></listitem>
1488
1489                        </varlistentry>
1490                </variablelist>
1491        </sect1>
1492
1493        <sect1 id="making-rpm-5-3">
1494                <title>ファイルリスト部</title>
1495                <para>
1496                        %filesはじまる部分で、rpmパッケージにつめこむファイル名を列挙します。
1497                        このとき以下に注意してください。
1498                </para>
1499                <itemizedlist>
1500                        <listitem><para>
1501                                        ここに書くファイル名は重複したらいけません。
1502                        </para></listitem>
1503                        <listitem><para>
1504                                        列挙されたファイルは、%docで指定するものを除いて、
1505                                        %installまでのスクリプトの実行によって、
1506                                        記述した通りの場所(${RPM_BUILD_ROOT}を''/''とみなす)
1507                                        にinstallされるものでないといけません。
1508                        </para></listitem>
1509                        <listitem><para>
1510                                        列挙されたファイルがおかしな userID/groupID を持っていると、
1511                                        rpmパッケージが正常にbuildできないことがあります。
1512                        </para></listitem>
1513                        <listitem><para>
1514                                        ファイルを含まないバーチャルパッケージ<footnote><para>Requires で他のパッケージをまとめてインストールしたり、%post, %preun, %postun などで何らかのコマンド処理を行うようなパッケージ。task-gnome や task-tetex などのように task- という名前が使われます。</para></footnote>を作る場合でも、%files という行だけは必要になります。%files という行を省略してしまうと、rpmbuild コマンドで処理しても src.rpm しか作れません。
1515                        </para></listitem>
1516                </itemizedlist>
1517                <para>
1518                        rpmコマンドは、specファイルに基づいてrpmパッケージを作るときに、
1519                        <xref linkend="making-rpm-5-2" />で設定した一連のスクリプトを実行した後、
1520                        ${RPM_BUILD_ROOT}をとみなして%files以下で指定されたファイルを回収し、
1521                        それを指定位置にinstallするようなrpmパッケージをつくります。
1522                </para>
1523                <itemizedlist>
1524                        <listitem>
1525                                <para>
1526                                        ドキュメント・ファイルの指定
1527                                </para>
1528                                <para>
1529                                        %docというマクロを用います。specファイルの例のように、%doc READMEとすると、
1530                                        %setupで指定したホームディレクトリ下のREADMEが、
1531                                        ${RPM_BUILD_ROOT}/usr/doc/hoge-1.1-2/にcpされたのち、
1532                                        rpmパッケージに回収されます。つまり%docは、
1533                                        ドキュメントファイルのインストールとパッケージングのためのファイル指定を同時に行うマクロとしてはたらきます。
1534                                        以下のように、ディレクトリごと指定もできます。
1535                                </para>
1536                                <screen>%doc doc/</screen>
1537                        </listitem>
1538                        <listitem>
1539                                <para>
1540                                        rpmに含めるファイルの指定
1541                                </para>
1542                                <para>
1543                                        その絶対パスで指定します。
1544                                        <itemizedlist>
1545                                                <listitem><para>
1546                                                                個別ファイルはそのまま指定。(/usr/bin/hoge.bin など)
1547                                                </para></listitem>
1548                                                <listitem><para>
1549                                                                あるディレクトリ以下の全てのファイルをrpmパッケージにいれたいときには、
1550                                                                そのディレクトリ名を書きます。(タグなし、/usr/hoge/ など)。
1551                                                                アンインストール時には、そのディレクトリごとなくなります。
1552                                                </para></listitem>
1553                                                <listitem><para>
1554                                                                ワイルドカードも使えます。(/usr/hoge/* など)
1555                                                </para></listitem>
1556                                        </itemizedlist>
1557                                        <warning>
1558                                                <para>
1559                                                        rpm-3.0.5以降では、man ファイルや info ファイルは自動的にgzipで圧縮されます。
1560                                                        %filesにmanやinfoのファイル名を書くときには拡張子.gzをつけるのを忘れないようにしましょう。
1561                                                </para>
1562                                        </warning>
1563                                </para>
1564                        </listitem>
1565                        <listitem>
1566                                <para>
1567                                        タグを用いたファイル指定
1568                                </para>
1569                                <variablelist>
1570                                        <varlistentry>
1571                                                <term>%dir &lt;dir name&gt;</term>
1572                                                <listitem><para>
1573                                                                指定したディレクトリだけをパッケージに含める。
1574                                                                <screen>``/usr/hoge/'' = ``%dir /usr/hoge/'' + ``/usr/hoge/*''</screen>
1575                                                                ってかんじです。
1576                                                </para></listitem>
1577                                        </varlistentry>
1578                                        <varlistentry>
1579                                                <term>%config &lt;file name&gt;</term>
1580                                                <listitem><para>
1581                                                                configファイルであることを示す。
1582                                                                ファイルが書き換えられていた場合、
1583                                                                アンインストール時には .rpmsaveをつけた名前で保存されます。
1584                                                                アップグレード時には新しいファイルと置き換えられ、
1585                                                                元のファイルは .rpmsaveをつけた名前で保存されます。
1586                                                          </para>
1587                                                          <para>
1588                                                                ファイルが変更されていた場合、
1589                                                                アップグレード時に新しいファイルに置き換えずにもとのファイルをそのまま使う場合には、
1590                                                                %config(noreplace) を指定します。
1591                                                                <screen>%config(noreplace) &lt;file name&gt;</screen>
1592                                                                この場合新しいパッケージに入っている設定ファイルは、
1593                                                                .rpmnew をつけた名前で保存されます。
1594                                                                また、アップグレードではなく、同じバージョンをインストールし直した時には、
1595                                                                .rpmorig をつけた名前で保存されます。
1596                                                          </para>
1597                                                          <para>
1598                                                                存在しなくても問題ないファイルの場合は、
1599                                                                %config(missingok) を指定します。
1600                                                                <screen>%config(missingok) &lt;file name&gt;</screen>
1601                                                                これは、rpmコマンドの -V オプションでチェックした時に、
1602                                                                ファイルが無くてもエラーにならないようにするためのものです。
1603                                                </para></listitem>
1604                                        </varlistentry>
1605                                        <varlistentry>
1606                                                <term>%attr(&lt;mode&gt;,&lt;owner&gt;,&lt;group&gt;[, dirmode]) &lt;file name&gt;</term>
1607                                                <listitem><para>
1608                                                                %filesに列挙するファイルのパーミッションやuser ID、group IDを設定する。
1609                                                                例えば、
1610                                                                <screen>%attr(755,root,root) /usr/lib/hoge</screen>
1611                                                                とする。一部の属性を省略(書き換えない)したいときには - を使って、
1612                                                                <screen>%attr(755,-,root) /usr/lib/hoge</screen>
1613                                                                とする。このタグを用いることによって、
1614                                                                root権限を持ってない人もrpmのパッケージ化を行える。
1615                                                          </para>
1616                                                          <para>
1617                                                                <screen>%attr(755,root,root)</screen>
1618                                                                のように( )の中には 3つしか書かないことが多いですが、
1619                                                                <screen>%attr(755,root,root,755)</screen>
1620                                                                のように 4つ書くこともできます。
1621                                                                4つ目の数字(dirmode)は、
1622                                                                <emphasis>ディレクトリとサブディレクトリのパーミッション</emphasis>になります。
1623                                                </para></listitem>
1624                                        </varlistentry>
1625                                        <varlistentry>
1626                                                <term>%defattr(&lt;mode&gt;,&lt;owner&gt;,&lt;group&gt;[, dirmode])</term>
1627                                                <listitem><para>
1628                                                                それ以降の行に書かれた属性のデフォルト値を設定する。
1629                                                                %attr が出てきた行を除いて、それ以降に書かれたものに共通になります。
1630                                                          </para>
1631                                                          <para>
1632                                                                %defattr も %attr も何度でも使えます。
1633                                                                次の例だと、/usr/bin/hoge と /usr/lib/hoge は一つ目の %defattr の 755 になり、
1634                                                                /usr/share/locale/ja 以降は二つ目の %defattr の 644 になります。
1635                                                                <screen>
1636%defattr(755,-,-)
1637/usr/bin/hoge
1638/usr/lib/hoge
1639%defattr(644,-,-)
1640/usr/share/locale/ja
1641/usr/share/locale/lv</screen>                                           
1642                                                          </para>
1643                                                          <para>
1644                                                                %attrと同様、4つ目の数字は、
1645                                                                ディレクトリとサブディレクトリのパーミッションになります。
1646                                                </para></listitem>
1647                                        </varlistentry>
1648
1649                                        <varlistentry>
1650                                                <term>%verify( ) &lt;file name&gt;</term>
1651                                                <listitem><para>
1652                                                    %filesに列挙するファイルについて、rpm -V でパッケージを検証する時に、検証する項目を指定する。</para>
1653                                                  <para>
1654                                                    ( ) の中には<xref linkend="verify-options" />にあるものが入ります。
1655                                                    複数指定する場合には、, もしくは スペース で区切ります。</para>
1656                                                 
1657
1658                                                  <table id="verify-options">
1659                                                    <title>%verify の ( ) の中で指定できるもの</title>
1660                                                    <tgroup cols="2">
1661                                                      <thead>
1662                                                        <row><entry>項目</entry><entry>内容</entry></row>
1663                                                      </thead>
1664                                                      <tbody>
1665                                                        <row><entry>size</entry><entry>サイズ</entry></row>
1666                                                        <row><entry>mode</entry><entry>パーミッションとファイルの種類</entry></row>
1667                                                        <row><entry>md5</entry><entry>md5 値</entry></row>
1668                                                        <row><entry>rdev</entry><entry>デバイスファイルのモードビットなど</entry></row>
1669                                                        <row><entry>link</entry><entry>リンク先</entry></row>
1670                                                        <row><entry>user</entry><entry>ファイルの所有者 user</entry></row>
1671                                                        <row><entry>group</entry><entry>ファイルのグループ group</entry></row>
1672                                                        <row><entry>mtime</entry><entry>ファイルの更新時刻 mtime(modification time)</entry></row>
1673                                                      </tbody>
1674                                                    </tgroup>
1675                                                  </table>
1676
1677                                                  <para><emphasis>not</emphasis> とすると<emphasis>検証しない項目</emphasis>だけを指定できます。</para>
1678                                                  <para>書き換えることが前提となる設定ファイルなので、ファイルサイズ と md5値 と 更新時刻 は検証する必要がないといった場合には、
1679                                                    <screen>%verify(not size,md5,mtime) /etc/hoge.conf</screen>
1680                                                  のように指定します。
1681                                                </para></listitem>
1682                                        </varlistentry>
1683
1684                                        <varlistentry>
1685                                                  <term>%defverify( )</term>
1686                                                <listitem><para>
1687                                                    それ以降の行に書かれたファイルについて検証する項目を設定します。
1688                                                </para></listitem>
1689                                                <listitem><para>
1690                                                    %verify と %defverify は、%attr と %defattr と同じような関係です。
1691                                                </para></listitem>
1692                                        </varlistentry>
1693
1694                                </variablelist>
1695                        </listitem>
1696                </itemizedlist>
1697
1698                <para>
1699                  %config %attr %verify などは、次のようにスペースを入れることで一つのファイルに複数指定できます。
1700                  <screen>%config %verify(not size,md5,mtime) /etc/hoge.conf</screen>
1701                </para>
1702
1703                <para>
1704                        この%filesの指定は少々面倒なとこかもしれません。
1705                        新しくパッケージをつくる場合などは、%install までのスクリプト部を書いたところで、%files以下は何も書かないまま、一度、そのspecファイルから rpm をbuildしてみるとよいかもしれません。(rpm -bi hoge.spec これについては次節)。
1706               
1707                        そのあとで、${RPM_BUILD_ROOT}以下にinstallされてるファイルを、find コマンドで見てみて%filesの指定をします。
1708                </para>
1709                <para>
1710                        %filesで書かれていないファイルがある場合には、build 時に
1711                        <screen>パッケージに未収録のファイルを検査中: /usr/lib/rpm/check-files /var/tmp/hoge-1.1-root
1712警告: パッケージに未収録のインストール済みファイルが見つかりました:</screen>
1713                        と未収録のファイルの名前などが表示されます。
1714                        この部分を利用して %files の部分を作成するのもよいでしょう。
1715                </para>
1716
1717                <para>
1718                        ソースのバージョンアップなどで、作成されるファイルが増減したり、ディレクトリが変わったりする場合があります。未収録のファイルがあっても、build が途中で終了せず、パッケージを作成できてしまう場合があるので、build 時のメッセージは必ず確認してください。
1719                </para>
1720        </sect1>
1721</chapter>
1722
1723<chapter id="making-rpm-6">
1724        <title>書いたspecファイルをもとにrpmパッケージをつくる</title>
1725        <para>Vine Linux 3.0以降で採用されているrpm-4.xではパッケージのビルドは<command>rpmbuild</command>コマンドを利用するようになりました。過去との互換性のためVine Linuxでは、<command>rpm</command>コマンドも利用できるようになっていますが、将来的に廃止の予定であるため今後は<command>rpmbuild</command>コマンドをお使いください。</para>
1726        <para>
1727                specファイルを書いた後は、以下のようにして、rpmパッケージをつくります。
1728        </para>
1729        <itemizedlist>
1730                <listitem>
1731                        <para>
1732                                rpmとsrpmをつくりたいときには、(build all)
1733                        </para>
1734                        <screen>$ <command>rpmbuild -ba hoge.spec</command></screen>
1735                </listitem>
1736                <listitem>
1737                        <para>
1738                                とりあえず、rpmだけつくりたいときは(build binary)
1739                        </para>
1740                        <screen>$ <command>rpmbuild -bb hoge.spec</command></screen>
1741                </listitem>
1742                <listitem>
1743                        <para>
1744                                srpmだけつくりたいときは(build srpm)
1745                        </para>
1746                        <screen>$ <command>rpmbuild -bs hoge.spec</command></screen>
1747                </listitem>
1748                <listitem>
1749                        <para>
1750                                rpmもsrpmもつくらずに、パッケージの展開だけしてみる
1751                                (%buildの前までを実行)(build prep、%prepが実行される。)
1752                        </para>
1753                        <screen>$ <command>rpmbuild -bp hoge.spec</command></screen>
1754                        <para>
1755                                これは、パッチをつくるときに便利です。
1756                        </para>
1757                </listitem>
1758                <listitem>
1759                        <para>
1760                                rpmもsrpmもつくらずに、ちょっとmakeがうまくいくかテスト
1761                                (build compile、%prep,%buildが実行される。)
1762                        </para>
1763                        <screen>$ <command>rpmbuild -bc hoge.spec</command></screen>
1764                        <para>
1765                                <option>--short-circuit</option>オプションをつけると
1766                                %build 以前の部分(%prep) を省略して %buildが実行されます。
1767                        </para>
1768                        <screen>$ <command>rpmbuild --short-circuit -bc hoge.spec</command></screen>
1769                </listitem>
1770                <listitem>
1771                        <para>
1772                                rpmもsrpmもつくらずに、ちょっとinstallまでうまくいくかテスト
1773                                (build install、%prep,%build,%install,%checkが実行される。)
1774                        </para>
1775                        <screen>$ <command>rpmbuild -bi hoge.spec</command></screen>
1776                        <para>
1777                                <option>--short-circuit</option>オプションをつけると
1778                                %install 以前の部分(%prep,%build) を省略して %install,%checkが実行されます。
1779                        </para>
1780                        <screen>$ <command>rpmbuild --short-circuit -bi hoge.spec</command></screen>
1781                        <para>
1782                                %files が正しく書かれているか確認できます。
1783                        </para>
1784                </listitem>
1785                <listitem>
1786                        <para>
1787                                次のように | (パイプ) と tee コマンドを利用して、ビルド中のメッセージをファイルに残しておくと、エラーの確認や、%files の確認、Requires の確認といった作業がやりやすくなります。
1788                        </para> 
1789                        <screen>$ <command>rpmbuild -ba hoge.spec 2&gt;&amp;1<footnote><para>2&gt;&amp;1 はエラーメッセージ(2:標準エラー出力の内容)を (tee コマンドに渡すために) 標準出力(1) にリダイレクトする(2に流れるメッセージを 1と合流させる)というものです。これで、tee で指定したファイル hoge-build.log に、標準出力のメッセージと一緒にエラーメッセージも書き込まれるようになります。</para></footnote> |tee hoge-build.log</command></screen>
1790                </listitem>
1791        </itemizedlist>
1792        <para>
1793                以上のコマンドを実行すると、segmentation faultを起こす時には、
1794                <xref linkend="making-rpm-4-1" />で述べたLANGの指定を再確認してください。
1795                うまくいけば、ディレクトリRPMS/i386にrpmパッケージが、
1796                ディレクトリSRPMSにsrpmパッケージができるはずです。
1797        </para>
1798        <para>
1799                他に、 tar.gz 形式のソースの中に含まれている spec ファイルを用いて build するときには、
1800                -b のかわりに -t を用いて、
1801                <screen>$ <command>rpmbuild -ta hoge.tar.gz</command></screen>
1802                などとします。
1803        </para>
1804</chapter>
1805
1806<chapter id="making-rpm-7">
1807        <title>変数とマクロを利用する</title>
1808        <sect1 id="making-rpm-7-1">
1809                <title>環境変数</title>
1810                <para>
1811                        スクリプト部の各タグからはじまる部分は、先にも述べた通り独立したbash scriptとして働くので、
1812                        その範囲内で、
1813                        <screen>TEXMF="/usr/share/texmf"</screen>
1814                        と変数を定義して用いることができます。
1815                </para>
1816                <para>
1817                        定義した変数は ${ } で囲んで
1818                        <screen>${TEXMF}</screen>
1819                        のようにすると利用できます。
1820                        $TEXMF のように { } を省略することもできます。
1821                </para>
1822                <para>
1823                        /usr/share というディレクトリは標準で %{_datadir} というマクロが定義されているので
1824                        <screen>TEXMF="%{_datadir}/texmf"</screen>
1825                        とすることができます。
1826                        マクロについては、次節以降で説明します。
1827                </para>
1828                <para>
1829                        また、以下の変数は各タグ毎に環境変数として定義されます。
1830                </para>
1831                <variablelist>
1832                        <varlistentry>
1833                                <term>RPM_SOURCE_DIR</term>
1834                                <listitem><para>
1835                                                ディレクトリSOURCESを表す。<xref linkend="making-rpm-4-1" />参照。
1836                                                デフォルトは、
1837                                                <screen>RPM_SOURCE_DIR="/usr/src/redhat/SOURCES"</screen>
1838                                </para></listitem>
1839                        </varlistentry>
1840                        <varlistentry>
1841                                <term>RPM_BUILD_DIR</term>
1842                                <listitem><para>
1843                                                ディレクトリBUILDを表す。<xref linkend="making-rpm-4-1" />参照。
1844                                                デフォルトは、
1845                                                <screen>RPM_BUILD_DIR="/usr/src/redhat/BUILD"</screen>
1846                                </para></listitem>
1847                        </varlistentry>
1848                        <varlistentry>
1849                                <term>RPM_DOC_DIR</term>
1850                                <listitem><para>
1851                                                %docで指定されたドキュメントファイルをインストールするためのディレクトリを表す。
1852                                                rpmrcファイルの、defaultdocdirで指定する。デフォルトは、
1853                                                <screen>RPM_DOC_DIR="/usr/doc"</screen>
1854                                </para></listitem>
1855                        </varlistentry>
1856                        <varlistentry>
1857                                <term>RPM_OPT_FLAGS</term>
1858                                <listitem><para>
1859                                                コンパイル時にコンパイラにわたすデフォルトのオプション指定を表す。
1860                                                rpmrcファイルの、optflagsで指定する。
1861                                                アーキテクチャ毎に指定ができる。
1862                                                例えば、%buildにおいて以下のように使う
1863                                                <screen>make CFLAGS=${RPM_OPT_FLAGS}</screen>
1864                                                デフォルトはarchitectureがi386のときには、
1865                                                <screen>RPM_OPT_FLAGS="-O2 -m486 -fno-strength-reduce"</screen>
1866                                </para></listitem>
1867                        </varlistentry>
1868                        <varlistentry>
1869                                <term>RPM_ARCH_FLAGS</term>
1870                                <listitem><para>
1871                                                buildを行なっているシステムのアーキテクチャを表す変数。
1872                                                アーキテクチャがi386なら、
1873                                                <screen>RPM_ARCH_FLAGS="i386"</screen>
1874                                </para></listitem>
1875                        </varlistentry>
1876                        <varlistentry>
1877                                <term>RPM_OS</term>
1878                                <listitem><para>
1879                                                buildを行なっているシステムのOSをあらわす変数。Linuxなら、
1880                                                <screen>RPM_OS="Linux"</screen>
1881                                </para></listitem>
1882                        </varlistentry>
1883                        <varlistentry>
1884                                <term>RPM_BUILD_ROOT</term>
1885                                <listitem><para>
1886                                                Buildrootで設定された仮想インストールのためのディレクトリを表す。
1887                                                (<xref linkend="making-rpm-5-1" />のBuildrootの項参照)
1888                                </para></listitem>
1889                        </varlistentry>
1890                        <varlistentry>
1891                                <term>RPM_PACKAGE_NAME</term>
1892                                <listitem><para>
1893                                                Nameで設定されたパッケージ名を表す。
1894                                                (<xref linkend="making-rpm-5-1" />のNameの項参照)
1895                                </para></listitem>
1896                        </varlistentry>
1897                        <varlistentry>
1898                                <term>RPM_PACKAGE_VERSION</term>
1899                                <listitem><para>
1900                                                Versionで設定されたバージョン名を表す。
1901                                                (<xref linkend="making-rpm-5-1" />のVersionの項参照)
1902                                </para></listitem>
1903                        </varlistentry>
1904                        <varlistentry>
1905                                <term>RPM_PACKAGE_RELEASE</term>
1906                                <listitem><para>
1907                                                Versionで設定されたリリース番号を表す。
1908                                                (<xref linkend="making-rpm-5-1" />のReleaseの項参照)
1909                                </para></listitem>
1910                        </varlistentry>
1911                </variablelist>
1912        </sect1>
1913        <sect1 id="making-rpm-7-2">
1914
1915                <title>specファイル中のマクロ定義</title>
1916                <para>
1917                        マクロは
1918                        <screen>%define マクロの名前 内容</screen>
1919                        のように書くことで定義できます。
1920                </para>
1921                <para>
1922                        <screen>%{マクロの名前}</screen>
1923                        のように書くことで利用できます。
1924                        {} を省略して %マクロの名前 と書くこともできますが、
1925                        {} をつけて利用したほうが、
1926                        <xref linkend="making-rpm-5-2" />に出てきた %prep や %build などといったタグと区別しやすくなります。
1927                </para>
1928                <para>
1929                        マクロは、%setupや%installなどのスクリプト部やファイル定義部など、
1930                        specファイル全体で使えるので、
1931                        うまく使うとバージョンアップに追随してspecファイルを書くときに楽ができます。
1932                </para>
1933                <para>
1934                        %define で定義せずに使えるマクロとして %{name} , %{version} , %{release} があります。
1935                        <xref linkend="making-rpm-5-1" />にでてきた、Name Version Release の値が、
1936                        それぞれ %{name} , %{version} , %{release} の内容になります。
1937                </para>
1938                <note><para>
1939                        %define name hoge として name を定義し Name: %{name} のように利用しているspecファイルを見かけることがありますが、
1940                        Name の値を参照するのが %{name} なので、本来とは逆の使い方になり問題を起こす場合があるかもしれません。
1941                        このような場合は %define pkg_name hoge , Name: %{pkg_name} のように
1942                        %{name} とは違う名前のマクロを利用したほうがよいでしょう。
1943                </para></note>
1944                <para>
1945                        <xref linkend="making-rpm-5" />のspecファイルの例のデータ定義部は、
1946                        %{name} と %{version} というマクロを利用して、以下のように書くことができます。
1947                        Name: hoge なので %{name} は hoge に、Version: 1.1 なので %{version} は 1.1 になります。
1948                </para>
1949<screen>
1950Name: hoge
1951Version: 1.1
1952Release: 1
1953Source: %{name}-%{version}.tar.gz
1954Patch: %{name}.patch
1955</screen>
1956
1957                <para>
1958                        specファイルの中(どこでもいいです)に %dump と書いておくと、
1959                        <command>rpmbuild</command> コマンドでパッケージを作る時に、
1960                        すべてのマクロが標準エラー出力に出力され、確認することができます。
1961                </para>
1962                <para>
1963                        マクロの定義を取り消したいけれど、行を削除するのではなくコメントとして残しておきたいという場合には、
1964                        %define に % をつけて、%%define にし、さらに # をつけます。
1965
1966                        <screen>%define hoge hige</screen> を <screen># %%define hoge hige</screen> のようにします。
1967
1968                        <screen># %define hoge hige</screen> ではだめです。
1969                        # 以降はコメントになるという処理よりも、マクロの %define の方が先に処理されるので、
1970                        %define hoge hige が解釈されてしまいます。
1971                </para>
1972
1973        </sect1>
1974
1975        <sect1 id="making-rpm-7-3">
1976
1977                <title>標準で定義されているマクロ</title>
1978
1979                <para>
1980                        よく利用されるコマンドやディレクトリなどにはあらかじめマクロが定義されています。
1981                        自分で定義した変数と同様にspecファイル全体で使えます。
1982                </para>
1983                <para>
1984                        標準で定義されているマクロは <filename>/usr/lib/rpm/macros</filename> に書かれています。
1985                        ユーザー毎のマクロを記述するファイルは<filename>~/.rpmmacros</filename>です。
1986                </para>
1987                <para>
1988                        <filename>~/.rpmmacros</filename> に書く場合には
1989                        <screen>%マクロの名前 内容</screen>
1990                        とします。
1991                        <xref linkend="making-rpm-4-1" />で出てきた %_topdir などもマクロです。
1992                </para>
1993                <para>
1994                        ユーザー毎のマクロと、標準で定義されているマクロをあわせたものは、
1995                        <command>rpm</command>コマンドの <option>--showrc</option>オプションで確認できます。
1996                        <screen>$ <command>rpm --showrc</command></screen>
1997                </para>
1998                <para>
1999                        また、それぞれのマクロがどんなものかは、
2000                        <screen>$ <command>rpm --eval "%{マクロ}"</command></screen>
2001                        のようにすると確認できます。
2002                </para>
2003                <para>
2004                        標準で定義されているマクロについてはなるべく利用してください。
2005                        specファイルのメンテナンスしやすさの向上につながります。
2006                </para>
2007                <para>
2008                        たとえば、%{configure} や %{makeinstall} といったマクロを利用することで、
2009                        %build や %install の部分を簡潔に書くことができる場合があります。
2010<screen>%build
2011%{configure}
2012%{__make}
2013
2014%install
2015%{makeinstall}</screen>
2016                        <screen>$ <command>rpm --eval "%{configure}"</command></screen>
2017                        などとやってそれぞれのマクロがどんなものか確認して下さい。
2018                </para>
2019
2020                <para>
2021                        rpm 4.x および Vine Linux 4.1 で定義されているマクロを使うと
2022                        <xref linkend="making-rpm-5" />のspecファイルは次のようになります。
2023                </para>
2024<screen>
2025---------spec ファイルの例 (#から始まる行は、コメント行です)--------
2026#(1)データ定義部
2027Summary: hoge is a harehare horehore
2028Name: hoge
2029Version: 1.1
2030Release: 2
2031Source: %{name}-%{version}.tar.gz
2032Patch: %{name}.patch.gz
2033License: GPL2
2034Group: Local
2035URL: http://www.fugahogo.com/hogehoge.html
2036Packager: Jun Nishii &lt;jun@vinelinux.org&gt;
2037Requires: hige
2038BuildRequires: hige-devel
2039Buildroot: %{_tmppath}/%{name}-%{version}-root
2040Summary(ja): hoge は harehare な horehore です。
2041
2042%description
2043Hoge is a harehare horehore and convenient for fugafuga.
2044Enjoy!
2045
2046%description -l ja
2047hoge は harehare な horehore で、fugafuga するときなどとても便利なツー
2048ルです。みんなでなかよく使いましょう。
2049
2050%changelog
2051* Tue Feb 16 1999 Jun Nishii &lt;jun@vinelinux.org&gt; 1.1-2
2052- added Japanese messages
2053
2054* Mon Feb 15 1999 Jun Nishii &lt;jun@vinelinux.org&gt; 1.1-1
2055- first release for version 1.1
2056
2057#(2)スクリプト部
2058%prep       #rpmを構築する前の準備です。
2059%{__rm} -rf $RPM_BUILD_ROOT
2060
2061%setup      #ソースをBUILDに展開します。
2062%patch -p1  #パッチをあてます。
2063
2064%build      #makeのための手順を書きます。
2065%{__make}
2066(cd man; %{__make} man)
2067
2068%install    #installのための手順を書きます。
2069%{__make} prefix=${RPM_BUILD_ROOT}/%{_prefix}/local install
2070(cd man; %{__make} prefix=${RPM_BUILD_ROOT}/%{_prefix}/local install.man)
2071
2072%clean      #rpmを作ったあとの後始末です。
2073%{__rm} -rf $RPM_BUILD_ROOT
2074
2075#(3)ファイルリスト部 --------------
2076%files
2077%defattr(-,root,root)
2078%doc README
2079%doc docs/
2080%{_bindir}/hoge.bin
2081%{_libdir}/hoge/
2082%{_mandir}/man1/hoge.1.gz
2083%dir %{_libdir}/hoge/
2084%config %{_libdir}/hoge/fuga.conf
2085
2086---------specの例はここまで-----------------------------------------
2087</screen>
2088
2089        </sect1>
2090</chapter>
2091
2092<chapter id="making-rpm-8">
2093        <title>サブパッケージの作成について</title>
2094        <para>
2095                大きなソースをmakeしてrpmパッケージを作るときなど、
2096                幾つかのrpmパッケージに分割したくなることがよくあります。
2097                たとえば、muleのrpmパッケージをつくるときに、
2098                baseのrpmパッケージがelcを含んでいれば、
2099                そのソースであるelファイルはなくてもmuleの実行には問題ないですから、
2100                mule.rpm と mule-el.rpm みたいにわけたほうがよいかもしれません。
2101                また、ライブラリや開発用インクルードファイルもソースに含まれるアプリケーションをrpm化する時は、
2102                アプリ本体の hoge.rpm と、開発者用にlibhoge.a や hoge.hを入れたhoge-devel.rpmにわけたいこともあるでしょう。
2103                ドキュメントが大きいと、hoge-docs.rpmも別に作りたいこともあるでしょう。
2104        </para>
2105        <para>
2106                こういうときには、ちょっとspecファイルを変更するだけで、
2107                サブパッケージの作成をすることができます。 具体的には、
2108                サブパッケージ(ここでは、hogeのサブパッケージhoge-docsとする)のための、
2109                データ定義部(%package docsではじまり、GroupやSummary、%description docsなどを書く部分)と、
2110                そのサブパッケージにいれるファイルを列挙した%files docs から始まるファイルリストを付け加えます。
2111                具体例は、RPM-BUILD-HOWTOにもありますので、興味のある人はそちらを参照してください。
2112        </para>
2113        <para>
2114                ただし、次節でものべるように、
2115                サブパッケージの作成は必要最小限にとどめるよう心掛けましょう。
2116        </para>
2117</chapter>
2118
2119<chapter id="making-rpm-9">
2120        <title>rpmパッケージをつくるときの注意</title>
2121        <orderedlist>
2122                <listitem>
2123                        <para>
2124                                <emphasis>重要:</emphasis> シンボリック・リンク等を%postとかで張らない。
2125                                間違えてもそれ(%postではったリンクなど)を%preunや%postunで削除してはいけない。
2126                        </para>
2127                        <para>
2128                                シンボリック・リンクを含む全てのファイルを%installまででインストールして、
2129                                %filesに加えるべきである。(詳しくは後述)
2130                        </para>
2131                </listitem>
2132                <listitem>
2133                        <para>
2134                                <emphasis>重要:</emphasis> むやみに Epoch を使わない。
2135                                Epoch については説明しませんが、
2136                                パッケージのバージョン管理に混乱を引き起こす場合があるので、
2137                                絶対に必要という場合以外は利用しないでください。
2138                                なお、Serial は rpm 4.4 で obsolete となっています。
2139                        </para>
2140                </listitem>
2141                <listitem>
2142                        <para>あまり細かくサブパッケージに分けない</para>
2143                        <para>
2144                                サブパッケージの作り方を覚えると、やたら沢山のサブパッケージをつくる人がいるが、
2145                                アップグレード時のメンテ(rpm -Uやspecの書き直し)が面倒になるばかりか、
2146                                どれがなんだか分からなくなったりする。分割は必要最小限に。
2147                        </para>
2148                </listitem>
2149                <listitem>
2150                        <para>%configは乱用しない</para>
2151                        <para>
2152                                %configを多くすると、%filesが非常にわかりづらくなることがあり、
2153                                version up等の時にこの部分のメンテに労力がかかるようになりよくない。
2154                                デフォルトのままで出来るだけ多くの人が利用できるようなconfigファイルを用意し、
2155                                ユーザの%configの設定は必要最小限ですむように心掛けると、
2156                                多くの人が利用しやすいものができ、多くの場合に%fileの記述もすっきりする。
2157                        </para>
2158                </listitem>
2159                <listitem>
2160                        <para>patchを使いすぎない</para>
2161                        <para>
2162                                configファイルの設定やMakefileなどを変えたりするために頑張ってpatchをいろいろつくるよりも、
2163                                別にファイルを用意してSourceに加えておき、%installあたりで
2164                                <screen>%{__cp} ${RPM_SOURCE_DIR}/hoge.conf .</screen>
2165                                とかしてしまったほうが、すっきりすることが多い。srpmをばらしても、
2166                                そのファイルがすぐ出てきてわかりやすく、
2167                                アップデートのためにspec修正するときも楽だったりする。
2168                        </para>
2169                </listitem>
2170                <listitem>
2171                        <para>specファイルはわかりやすく。第三者にもわかるようコメントを入れて。</para>
2172                        <para>
2173                                specファイルはソースのアップデートに対応して修正をしたり、
2174                                第三者が見て必要に応じて書き直したりすることがある。
2175                                凝っていろいろな設定をしたりする複雑なものを書くより、
2176                                ポータビリティを重視して簡潔に書いた方が後のメンテのためには吉。また、
2177                                違った環境でbuildができなくなるようなことが無いよう、
2178                                specファイル中のスクリプトで、特殊なコマンドを呼ぶようなことは避け、
2179                                一般的なコマンド使用にとどめるべき。
2180                        </para>
2181                </listitem>
2182        </orderedlist>
2183        <para>
2184                注意1は特に重要です。よく、%post で、シンボリック・リンクをはって、
2185                %preun でそのリンクを削除するようなspecファイルがあります。
2186                これを行うと、アップデート時に問題が生じることがあります。以前、
2187                libcのパッケージでこういう記述が入ってるものがあって、
2188                深刻な問題が生じたこともありました。
2189        </para>
2190
2191        <para>
2192                その理由は、rpm -U &lt;new-rpm&gt; としたときに、
2193<screen>
2194rpm -e &lt;old-rpm&gt;
2195rpm -i &lt;new-rpm&gt;
2196</screen>
2197                ではなく、
2198<screen>
2199rpm -i &lt;new-rpm&gt;
2200rpm -e &lt;old-rpm&gt;
2201</screen>
2202                とはたらくためです。
2203        </para>
2204        <para>
2205                つまり、%post で、シンボリック・リンクをはって、
2206                %preun でそれを削除するような rpm のバージョンアップをしようと、
2207                rpm -U (アップデート)を実行すると
2208                <orderedlist>
2209                        <listitem><para>
2210                                        新しいパッケージのインストールが行なわれ、
2211                                        %postでシンボリック・リンクがつくられる。
2212                        </para></listitem>
2213                        <listitem><para>
2214                                        古いパッケージのアンインストールが行なわれる。
2215                                        このとき、%preunでさっき新しいパッケージが作ったシンボリック・
2216                                        リンクが削除される。
2217                        </para></listitem>
2218                </orderedlist>
2219                この仕様は、libcとかのアップグレードの途中でlibcとかがなくなってトラブルが生じるのを避けようとしたためのものと思われます。
2220        </para>
2221        <para>
2222                実はこの問題は解決法があります。
2223                %pre, %post, %preun, %postunのスクリプト実行時には、スクリプトに対して以下の引数が与えられます。
2224        </para>
2225        <itemizedlist>
2226                <listitem>
2227                        <para>rpm -iでインストールを行うとき</para>
2228                        <para>%pre, %postに対して$1=1</para>
2229                </listitem>
2230                <listitem>
2231                        <para>rpm -Uでアップデートを行うとき</para>
2232                        <itemizedlist>
2233                                <listitem><para>
2234                                                新しいrpmのインストール時に、
2235                                                %pre, %postに対して$1=2
2236                                </para></listitem>
2237                                <listitem><para>
2238                                                古いrpmをアンインストール時に、
2239                                                %preun, %postunに対して$1=1
2240                                </para></listitem>
2241                        </itemizedlist>
2242                </listitem>
2243                <listitem>
2244                        <para>rpm -eでアンインストールを行うとき</para>
2245                        <para>%preun, %postunに対して$1=0</para>
2246                </listitem>
2247        </itemizedlist>
2248        <para>
2249                すなわち、はじめてインストールするときには、引数として1がわたされ、
2250                rpm -eでアンインストールするときには0がわたされるわけです。
2251                これを利用すると、
2252<screen>
2253%post
2254if [ $1 = 1]; then
2255        echo ``First installation!''
2256fi
2257%preun
2258if [ $1 = 0]; then
2259        echo ``Good bye!''
2260fi
2261</screen>
2262                とかできるわけです。
2263                (それでも%postなどでシンボリック・リンクをはったりすると、
2264                出どころ不明のファイルが増えることになります。その他トラブルをさけるため、
2265                できるだけファイルは%filesに加えるようにし、
2266                %postなどに書くスクリプトはできるだけ少なくしましょう)
2267        </para>
2268</chapter>
2269
2270<chapter id="making-rpm-10">
2271        <title>パッケージ作成後に確認すること</title>
2272        <orderedlist>
2273
2274          <listitem><para>SPEC ファイルのエンコーディング等を確認する。</para>
2275            <para><screen>$ <command>rpm -qpi hoge.rpm</command></screen>
2276              で文字化けしないかどうか、また、バージョンなど、記述した内容にミスが無いか確認する。</para>
2277            <para><screen>$ <command>LANG=C rpm -qpi hoge.rpm</command></screen>
2278              として英語での出力でも確認する。</para>
2279          </listitem>
2280         
2281          <listitem><para>Changelog の記述を確認する。</para>
2282            <para><screen>$ <command>rpm -qp --changelog hoge.rpm | head</command></screen>
2283              などで、追記した部分を確認する。</para>
2284          </listitem>
2285         
2286          <listitem><para>依存関係(Requires)を確認する。</para>
2287            <para><screen>$ <command>rpm -qpR hoge.rpm</command></screen></para>
2288           
2289            <para>パッケージがシェルスクリプトのファイルなどを含んでいる場合、その中で利用されるコマンド(もしくはパッケージ)が Requires: で指定されているかを確かめる必要もあります。これは、実際にシェルスクリプトを実行するなどして確かめる必要があります。</para>
2290          </listitem>
2291         
2292          <listitem><para>build 時の依存関係(BuildRequires)を確認する。</para>
2293           
2294            <para>できあがった src.rpm を、BuildRequires で指定していない devel などのパッケージをアンインストールした状態で rebuild してみる。</para>
2295
2296            <para>
2297              *-devel というパッケージをアンインストールするのに、筆者は(bash で)次のようなコマンド(for文)を利用しています。sed や awk で処理してる部分はもう少し上手なやり方があるかもしれません。
2298              <screen># <command>for i in `rpm -qa --last |grep devel |\
2299sed s/devel-/"devel "/ |awk '{print $1}'` ;
2300do echo $i ;
2301rpm -q $i &amp;&amp; rpm -e $i ;
2302rpm -q $i &amp;&amp; apt-get remove $i ;
2303done</command></screen>
2304            </para>
2305
2306          </listitem>
2307
2308        </orderedlist>
2309
2310        <para>ローカルに apt のリポジトリを作成しておくと、apt-get install や apt-get build-dep で、依存関係のチェック等が行えて便利です。</para>
2311
2312</chapter>
2313
2314
2315<!--appendix>
2316%section{デフォルト・マクロ名一覧}
2317</appendix-->
2318
2319<appendix id="making-rpm-a">
2320        <title>Vine Linux で使用できるGroup一覧</title>
2321        <para><filename>/usr/share/doc/rpm-*/GROUPS_for_vine.txt</filename> に記述されています。</para>
2322<screen>
2323Applications/Accessories
2324Applications/Administration
2325Applications/Archiving
2326Applications/Development
2327Applications/Documentation
2328Applications/Editors
2329Applications/Editors/Emacs
2330Applications/Edutainment
2331Applications/Games
2332Applications/Graphics
2333Applications/Internet
2334Applications/Multimedia
2335Applications/Other
2336Applications/Productivity
2337Applications/Publishing
2338Applications/Services
2339Applications/System
2340Applications/Text
2341Development/Languages
2342Development/Libraries
2343Development/Tools
2344System Environment/Base
2345System Environment/Daemons
2346System Environment/Kernel
2347System Environment/Libraries
2348System Environment/Shells
2349User Interface/Desktops
2350User Interface/X
2351</screen>
2352
2353        <para>それぞれの Group の簡単な説明です。</para>
2354        <para><filename>/usr/share/doc/rpm-*/GROUPS-DESC_for_vine.txt</filename> に記述されています。</para>
2355<screen>
2356Applications/Accessories
2357   ちょっとした小物や単機能のシンプルなアプリケーション
2358   例) 電卓、辞書等
2359Applications/Administration
2360   システムやデスクトップの設定、管理の為のアプリケーション
2361   (動作に root 権限が必要)
2362   例) synaptic、gnome-system-tools 等
2363Applications/Archiving
2364   ファイルの圧縮や解凍、書庫(アーカイブ)の作成に使用する
2365   アプリケーション
2366   例) bzip2, cpio, file-roller 等
2367Applications/Development
2368   アプリケーションの開発に使用するアプリケーション
2369   例) xxgdb、IDE 等
2370Applications/Documentation
2371   ドキュメントのみのパッケージ
2372   例)Vine-manual、JF 等
2373Applications/Editors
2374   テキストエディタ
2375   例) GEdit、Emacs、Vi 等
2376Applications/Editors/Emacs
2377   Emacs 及び Emacs 用のアプリケーション
2378Applications/Edutainment
2379   教育あるいは科学に関連したアプリケーション
2380   例) gnuplot、dia 等
2381Applications/Games
2382   ゲーム
2383Applications/Graphics
2384   画像を扱うアプリケーション
2385   例) GIMP、Inkscape 等
2386Applications/Internet
2387   インターネットを利用するアプリケーション
2388   例) firefox、Sylpheed、gFTP 等
2389Applications/Multimedia
2390   動画や音楽を扱うアプリケーション
2391   例) Totem、BMP 、XMMS 等。
2392Applications/Other
2393   Applications の他のどの Group にも割り当てられないもの
2394Applications/Productivity
2395   ワープロや表計算、PIM等のアプリケーション
2396   例) abiword、Gnumeric 等
2397Applications/Publishing
2398   印刷やフォントに関連したアプリケーション
2399   例) ghostscript, tetex 等
2400Applications/Services
2401   ウェブサーバーやメールサーバー及び各種 Daemon
2402   例) Apache、Postfix 等
2403Applications/System
2404   システムを設定したり監視したりするアプリケーション
2405   例)gnome-system-monitor、mtools 等 (ユーザー権限で動作可能)
2406Applications/Text
2407   テキストの処理に使用するアプリケーション
2408   例) less, nkf, namazu 等
2409Development/Libraries
2410   開発に必要なヘッダファイル等を含むパッケージ
2411   例) *-devel
2412Development/Languages
2413   開発に使用する各種言語用のパッケージ
2414   例) perl、php、ruby 等
2415Development/Tools
2416   開発に必要な各種 Tool を含むパッケージ
2417   例) automake、gettext 等
2418System Environment/Base
2419   システムの動作に必要な最小構成のパッケージ
2420   ※(インストーラでいうところの最小構成に該当)
2421System Environment/Daemons
2422   システムの動作で必要なサービス及びデーモン
2423   例) dbus、hal 等
2424System Enviroment/Kernel
2425   カーネル
2426System Environment/Libraries
2427   システムの動作に必要な各種ライブラリ
2428   例) gtk2、libpng 等
2429System Environment/Shells
2430   各種シェル
2431User Interface/Desktops
2432   デスクトップ環境やウィンドウマネージャのアプリケーション
2433   例) KDE、Xfce 、Fluxbox 等
2434User Interface/X
2435   XOrgと、それに付属するパッケージApplications/Accessories
2436</screen>
2437</appendix>
2438
2439<!--appendix>
2440%section{パッケージ固有の作法等について}
2441</appendix-->
2442
2443<appendix id="making-rpm-b">
2444        <title>パッケージ固有の作法等について</title>
2445
2446        <itemizedlist>
2447          <listitem><para>目次</para>
2448            <itemizedlist>
2449              <listitem><ulink url="making-rpm-b.html#add_to_gnome_menu">GNOME,KDE,Xfce のメニューに追加するために</ulink></listitem>
2450              <listitem><ulink url="making-rpm-b.html#emacs_lisp_package">Emacs Lisp のパッケージ</ulink></listitem>
2451              <listitem><ulink url="making-rpm-b.html#add_to_alternatives">alternatives を利用するパッケージ</ulink></listitem>
2452            </itemizedlist>
2453          </listitem>
2454        </itemizedlist>
2455
2456        <para id="add_to_gnome_menu">GNOME,KDE,Xfce のメニューに追加するために</para>
2457
2458        <variablelist>
2459                <varlistentry>
2460                        <listitem>
2461                                <para>GNOME,KDE,Xfce のメニューに追加するためには、ディレクトリ<filename>/usr/share/applications</filename><filename>アプリケーションの名前.desktop</filename> というファイル(以降 desktopファイルと呼びます)をインストールする必要があります。</para>
2462
2463                                <para>desktopファイルを取り扱う <command>desktop-file-install</command>コマンド、<command>desktop-file-validate</command>コマンド、<command>update-desktop-database</command>コマンドは、<filename>desktop-file-utils</filename>というパッケージに含まれています。</para>
2464
2465                                <para>desktopファイルの扱いは次のような手順になります。</para>
2466                                <itemizedlist>
2467                                        <listitem><para>
2468                                                %installタグの部分で次のようにして desktopファイルを<filename>%{buildroot}/%{_datadir}/applications</filename>にインストールしておきます。
2469                                                <screen>%install
2470%{__mkdir_p} %{buildroot}/%{_datadir}/applications
2471%{_bindir}/desktop-file-install --dir=%{buildroot}/%{_datadir}/applications <filename>hoge.desktop</filename></screen>
2472                                        </para></listitem>
2473                                        <listitem><para>
2474                                                %checkタグの部分で次のようにして desktopファイルが書式にしたがって正しく書かれているかをチェックします。
2475                                                <screen>%check
2476%{_bindir}/desktop-file-validate %{buildroot}/%{_datadir}/applications/hoge.desktop</screen></para>
2477                                                <para>ソースから make する、make install するなどの部分ではこのチェックが行われないことも多いので、%checkタグの部分でチェックを行うようにしておきます。</para>
2478                                                <para><command>desktop-file-validate</command>コマンドは複数のファイルをまとめて処理できないので、*.desktop のようにはできません。desktopファイルの数だけ、コマンドを書いてください。もちろん、for文などを使ってもかまいません。
2479                                        </para></listitem>
2480                                        <listitem><para>
2481                                                %postタグや%postunタグの部分で
2482                                                <screen>%post
2483if [ -x %{_bindir}/update-desktop-database ] ; then
2484    %{_bindir}/update-desktop-database %{_datadir}/applications
2485fi
2486
2487%postun
2488if [ -x %{_bindir}/update-desktop-database ] ; then
2489    %{_bindir}/update-desktop-database %{_datadir}/applications
2490fi</screen>
2491                                        のように処理します。
2492                                        <command>update-desktop-database</command> コマンドがインストールされていなければ実行しない、という形にすることで、twm や icewm や WindowMaker など、GNOME等のメニューとは直接関係ないウィンドウマネージャを使用しているときに、deskto-file-utils に依存せずにすむようになります。
2493                                        </para></listitem>
2494                                        <listitem><para>
2495                                                他のファイルと同じように %filesの部分に入れておきます。
2496                                                <screen>%files
2497%{_datadir}/applications/<filename>hoge.desktop</filename></screen>
2498                                        </para></listitem>
2499                                        <listitem><para>
2500                                                BuildRequires で desktop-file-utils を指定します。
2501                                                <screen>BuildRequires(install,check): <filename>desktop-file-utils</filename></screen>
2502                                        </para></listitem>
2503                                </itemizedlist>
2504                        </listitem>
2505                </varlistentry>
2506        </variablelist>
2507
2508        <para id="emacs_lisp_package">Emacs Lisp のパッケージ</para>
2509
2510        <variablelist>
2511                <varlistentry>
2512                        <listitem>
2513                                <para>Emacsen には emacsen-common というパッケージがあり、
2514                                インストールされている Emacsen の FLAVOR の情報や、
2515                                FLAVOR ごとに、その FLAVOR で byte compile された Emacs Lisp パッケージのリストを管理するという仕組みがあります。</para>
2516                                <para>この仕組みを用いることで以下のようなことが可能となっています。</para>
2517                                <itemizedlist>
2518                                        <listitem><para>
2519                                        パッケージのインストール時に、すでにインストールされている Emacsen の FLAVOR ごとにそれぞれ byte compile して elc ファイルを作成する。</para></listitem>
2520                                        <listitem><para>
2521                                        パッケージのアンインストール時に、すべての FLAVOR からパッケージの elc ファイルを削除する。</para></listitem>
2522                                        <listitem><para>
2523                                        Emacsen の FLAVOR のインストール時、アンインストール時に、その FLAVOR で byte compile する、FLAVOR で byte compile した elc を削除する。</para></listitem>
2524                                </itemizedlist>
2525                        </listitem>
2526                        <listitem>
2527                                <para>この仕組みを利用するために、Emacs Lisp のパッケージでは以下のようなことをしておきます。</para>
2528                                <itemizedlist>
2529                                        <listitem><para>
2530                                        %installタグの部分では byte compile していない el ファイルを
2531                                        %{_datadir}/emacs/site-lisp/%{name} 以下にインストールします。</para></listitem>
2532                                        <listitem><para>
2533                                        Source2 や Source3 などに byte-compile と install を行うためのスクリプトAと、
2534                                        byte-compile してできた elc ファイルを削除するためのスクリプトBを用意します。
2535                                        インストールに使える Makefile 等がある場合は %installタグの部分で
2536                                        %{_datadir}/emacs/site-lisp/%{name} 以下に Makefile 等をインストールしておき、
2537                                        スクリプトの中から利用できるようにします。</para></listitem>
2538                                        <listitem><para>
2539                                        install 用のスクリプトAでは、
2540                                        Emacsen の FLAVOR に応じて %{_datadir}/FLAVOR/site-list/%{name}/ 以下に
2541                                        bytecompile した elc ファイルをインストールするようにします。</para></listitem>
2542                                        <listitem><para>
2543                                        uninstall 用のスクリプトBでは、
2544                                        Emacsen の FLAVOR に応じてスクリプトAでインストールした elc ファイルを削除するようにしておきます。</para></listitem>
2545                                        <listitem><para>
2546                                        %installタグの部分で次のようにして、スクリプトAとスクリプトBをインストールします。
2547<screen>
2548%_installemacsenscript %{name} %{SOURCE2}
2549                               
2550%_removeemacsenscript  %{name} %{SOURCE3}
2551
2552</screen>
2553                                        スクリプトA,B はそれぞれ /usr/lib/emacsen-common/packages/install/ , /usr/lib/emacsen-common/packages/remove/ に、
2554                                        %{name} という名前でインストールされます。
2555                                        これによって、スクリプトA,B は、Emacs の FLAVOR がインストール、アンインストールされた時に実行されるようになります。</para>
2556                                        <para>%files の部分でそれぞれのスクリプトを記述しておきます。</para>
2557<screen>%{_libdir}/emacsen-common/packages/install/%{name}
2558%{_libdir}/emacsen-common/packages/remove/%{name}</screen></listitem>
2559                                        <listitem><para>
2560                                        %postタグの部分は次のように記述しておきます。
2561                                        if [ "$1" = 数字 ]; then ; fi は、インストール時、アップグレード時、アンインストール時、それぞれで違う動作をさせるためのものです。<xref linkend="making-rpm-9" />を参照してください。
2562<screen>
2563%post
2564#
2565# bytecompile and install
2566#
2567
2568if [ "$1" = 2 ]; then
2569%_emacsenPackageRemove %{name}
2570
2571fi
2572
2573%_addemacsenlist %{name}
2574
2575%_emacsenPackageInstall %{name}
2576
2577%preun
2578
2579if [ "$1" = 0 ]; then
2580%_emacsenPackageRemove %{name}
2581
2582%_removeemacsenlist %{name}
2583
2584fi
2585</screen></para>
2586                                        <para>%_emacsenPackageInstall と %_emacsenPackageRemove は スクリプトA,B を実行するためのマクロです。</para>
2587                                        <para>%_addemacsenlist と %_removeemacsenlist は、インストール済み Emacs Lisp パッケージのリストにパッケージを登録する、削除するというマクロです。</para>
2588                                        <para>
2589                                        %_installemacsenscript, %_removeemacsenscript, %_emacsenPackageRemove, %_addemacsenlist,
2590                                        %_removeemacsenlist の行の次の行は、空行にしておかないとエラーとなるようです。</para></listitem>
2591                                </itemizedlist>
2592                        </listitem>
2593                </varlistentry>
2594        </variablelist>
2595
2596
2597        <para id="add_to_alternatives">alternatives を利用するパッケージ</para>
2598       
2599        <variablelist>
2600          <varlistentry>
2601            <listitem>
2602              <para>
2603                alternatives については <ulink url="update-alternatives.html">update-alternatives による標準コマンドの切り替え</ulink> にまとめられています。
2604              </para>
2605             
2606              <para>
2607                alternatives に登録する場合には %post と %preun で次のようにします。
2608                <screen>%post
2609if [ "$1" = "1" ]; then
2610    %{_syssbindir}/update-alternatives --install リンク名 総称名 選択候補 優先度
2611fi
2612
2613%preun
2614if [ "$1" = "0" ]; then
2615    %{_syssbindir}/update-alternatives --remove 総称名 選択候補
2616fi</screen>
2617              </para>
2618              <para>Provides と Requires を指定します。
2619                  <screen>Provides: 総称名 リンク名
2620Requires: update-alternatives
2621Requires(post,preun): %{_syssbindir}/update-alternatives</screen>
2622                  とします。
2623              </para>
2624
2625              <para>
2626                Provides の リンク名 については、無くても問題はありませんが、%files には書かれないファイルなので、Provides に書いておいたほうがよいと思います。
2627              </para>
2628             
2629              <para>
2630                %post での登録と %preun での削除は、インストール時とアンインストール時だけに必要で、アップグレード時に実行してしまうと問題があるので、"$1" が 1 の場合(インストール時)と 0 の場合(アンインストール時)だけ処理するように if 文 にしておきます。
2631              </para>
2632             
2633              <para>
2634                %post での処理を、パッケージのアップグレード時にも行ってしまうと、パッケージのインストール後にユーザが優先度を変更していた場合、それを無視してパッケージ側で優先度を勝手に変更してしまうことになります。
2635              </para>
2636
2637              <para>
2638                新規パッケージではなく、既存のパッケージの %post,%preun に update-alternatives の処理を追加する場合には、次のようにするとよいかもしれません。
2639                <screen>%post
2640if [ "$1" = "1" ]; then
2641    if [ "`%{_sysbindir/update-alternatives --list '総称名' | grep -c 'リンク名'`" = "0" ]; then
2642        %{_syssbindir}/update-alternatives --install リンク名 総称名 選択候補 優先度
2643    fi
2644fi
2645
2646%preun
2647if [ "$1" = "0" ]; then
2648    %{_syssbindir}/update-alternatives --remove 総称名 選択候補
2649fi</screen>
2650              </para>
2651             
2652            </listitem>
2653            <listitem>
2654              <para>
2655                %triggerin と %triggerpreun と %preun を用いることで、他のパッケージが持っているファイルを alternatives で登録するようなパッケージを作ることもできます。
2656               
2657                <screen>Provides: 総称名 リンク名
2658Requires: update-alternatives
2659Requires(preun,triggerin,triggerpreun): %{_syssbindir}/update-alternatives
2660
2661%preun
2662if [ "$1" = "0" ]; then
2663    %{_syssbindir}/update-alternatives --remove-all 総称名
2664fi
2665
2666%triggerin -- 対象となるパッケージ
2667if [ "$1" = "1" ]; then
2668    echo triggerin scriptlet by %{name} start
2669    %{_syssbindir}/update-alternatives --install リンク名 総称名 選択候補 優先度
2670    echo triggerin scriptlet by %{name} end
2671fi
2672
2673%triggerpreun -- 対象となるパッケージ
2674if [ "$1" = "0" ]; then
2675    echo triggerpreun scriptlet by %{name} start
2676    %{_syssbindir}/update-alternatives --remove 総称名 選択候補
2677    echo triggerin scriptlet by %{name} end
2678fi</screen>
2679              </para>
2680             
2681            </listitem>
2682          </varlistentry>
2683        </variablelist>
2684       
2685</appendix>
2686
2687</book>
2688
2689<!--
2690                Local Variables:
2691                encode: utf-8-unix
2692                mode: nxml
2693                End:
2694-->
Note: See TracBrowser for help on using the repository browser.