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

Revision 206, 135.0 KB checked in by yasumichi, 15 years ago (diff)

add prompt which request passphrase.

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