<?xml version="1.0"?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" 
"http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [
<!ENTITY ex-usemacro SYSTEM "example.spec">
<!ENTITY ex-pkginfo SYSTEM "ex-pkginfo.spec">
<!ENTITY ex-script SYSTEM "ex-script.spec">
<!ENTITY ex-files SYSTEM "ex-files.spec">
<!ENTITY ex-changelog SYSTEM "ex-changelog.spec">
]>
<book id="making-rpm" lang="ja">

<bookinfo>
  <title>RPMパッケージの作成方法</title>
  <authorgroup>
    <author>
      <firstname>Jun</firstname>
      <surname>Nishii</surname>
    </author>
    <editor>
      <surname>Akahoshi</surname>
      <firstname>Yasumichi</firstname>
    </editor>
    <editor>
      <firstname>Kazutaka</firstname>
      <surname>HARADA</surname>
    </editor>
    <editor>
      <firstname>Takuya</firstname>
      <surname>Kobayashi</surname>
    </editor>
  </authorgroup>
  <abstract>
	  <para>この文書は、Vine Linux上で動くアプリケーションをRPMパッケージ化する方法を解説しています。</para>
	  <para>初めてRPMパッケージを作成する方を主な対象としておりますが、他のドキュメントでは分かりにくいあるいは触れられていない点に注意して説明していますので経験者にも参考になる点があります。</para>
	<para>なお、RPMパッケージのインストール方法やシェルスクリプト、基本的なコマンドの使い方は省略しております。</para>
	<!--para>間違いの指摘・コメント・要望等は、ML(メーリングリスト)や BTS(バグトラッキングシステム)で知らせていただければ、できるだけ反映していくつもりですので、ご協力をお願いします。また、SPECファイルを書く時にこういうことがわからなかったという意見や情報も募集中です。</para-->
  </abstract>
  <!--pubdate>2007/10/3</pubdate-->
</bookinfo>

<glossary id="mr-glossary">
	<title>用語の解説</title>
	<glossentry>
		<glossterm>RPM Package Manager</glossterm>
		<acronym>RPM</acronym>
		<glossdef>
			<para>アプリケーションの安全なインストール、更新、削除などを目的とした強力なパッケージ管理システムです。</para>
		</glossdef>
	</glossentry>
	<glossentry>
		<glossterm>バイナリパッケージ</glossterm>
		<glossdef>
			<para>展開すれば、そのまま実行可能な状態でアプリケーションに必要な全てのファイルがアーカイブされています。</para>
			<para>バイナリパッケージのファイル名は、<filename>name-version-release.arch.rpm</filename>という形式です。</para>
		</glossdef>
	</glossentry>
	<glossentry>
		<glossterm>ソースパッケージ</glossterm>
		<acronym>SRPM</acronym>
		<glossdef>
			<para>バイナリパッケージの作成に必要なソースやパッチ、SPECファイルがアーカイブされています。</para>
			<para>ソースパッケージのファイル名は、<filename>name-version-release.src.rpm</filename>という形式です。</para>
			<para><command>rpm <option>-ivh</option> <filename>hoge.src.rpm</filename></command> で<xref linkend="mr-directories"/>で解説するディレクトリに展開されます。</para>
		</glossdef>
	</glossentry>
	<glossentry>
		<glossterm>SPECファイル</glossterm>
		<acronym>SPEC</acronym>
		<glossdef>
			<para>ソースからパッケージを作成するための手順やパッケージの情報を記述するファイル。</para>
			<para>SPECファイルのファイル名は、<filename>name.spec</filename>という形式です。</para>
			<para>この文書では主にSPECファイルの書き方を説明します。</para>
		</glossdef>
	</glossentry>
	<glossentry>
		<glossterm>パッチファイル</glossterm>
		<acronym>パッチ</acronym>
		<glossdef>
			<para>オリジナルのソースに修正を加えるため、差分情報を記述したファイル。</para>
			<para>ファイル名は、<filename>name.patch</filename>という形式です。</para>
		</glossdef>
	</glossentry>
</glossary>

<part id="mr-setup">
	<title>環境設定</title>
	<partintro>
		<para><xref linkend="mr-setup" />では、VinePlus向けパッケージを作成するにあたって設定すべきことを説明します。</para>
	</partintro>
	<chapter id="rpmmacros">
		<title>設定ファイル</title>
		<para>RPMパッケージ(以下、パッケージ)作成環境の設定ファイルは、ユーザのホームディレクトリ(以下、<filename class="directory">~/</filename>)にある <filename>.rpmmacros</filename> です。</para>
		<para>Vine Linuxをインストールしたままの状態であれば、下記の様になっています。</para>

<screen>
%_topdir ${HOME}/rpm

# gpg signing
# %_signature gpg
# %_gpg_name Your Name &lt;your mail address&gt;
</screen>

		<para>既に削除してしまった場合は、<filename>/etc/skel/.rpmmacros</filename>から<filename class="directory">~/</filename>にコピーします。</para>
		<para>また、内容を変更している場合は、次節以降を参考に必要な設定が漏れていないか確認してください。</para>
		<important>
			<title>パッケージ作成は一般ユーザで行いましょう</title>
			<para>パッケージ作成をroot権限で行うとシステムを破壊する場合があります。必ず、一般ユーザ権限で行ってください。</para>
			<para>そのため設定ファイルは、あなたが通常使用している一般ユーザのホームディレクトリに用意してください。</para>
		</important>
	</chapter>

	<chapter id="mr-directories">
		<title>パッケージ作成に必要なディレクトリの準備</title>
		<para>パッケージ作成に必要なディレクトリは、<filename class="directory">~/.rpmmacros</filename>の<varname>%_topdir</varname>で設定されたディレクトリに以下の名前で配置します。</para>
		<table id="rpmdirs">
			<title>パッケージ作成に必要なディレクトリ名と使用目的</title>
			<tgroup cols="2">
				<thead>
					<row>
						<entry>ディレクトリ名</entry>
						<entry>使用目的</entry>
					</row>
				</thead>
				<tbody>
					<row>
						<entry>BUILD</entry>
						<entry>パッケージ作成時にソースの展開や make を実行するための作業用ディレクトリです。</entry>
					</row>
					<row>
						<entry>RPMS/arch</entry>
						<entry>作成されたバイナリパッケージ(<filename>*.rpm</filename>)が格納されます。対象となる architecture によって arch の部分が、i386・ppc などになります。なお、architecture に依存しないパッケージは、RPMS/noarch に格納されます。</entry>
					</row>
					<row>
						<entry>SRPMS</entry>
						<entry>作成されたソースパッケージ(<filename>*.srpm</filename>)が格納されます。</entry>
					</row>
					<row>
						<entry>SPECS</entry>
						<entry>パッケージ作成の指示書であるSPECファイル(<filename>*.spec</filename>)を格納します。</entry>
					</row>
					<row>
						<entry>SOURCES</entry>
						<entry>パッケージ化するアプリケーションのソースやパッチを格納します。</entry>
					</row>
				</tbody>
			</tgroup>
		</table>

		<para>Vine Linuxをインストールしたままの状態であれば、<varname>%_topdir</varname>が<literal>${HOME}/rpm</literal>に設定されており、上記のディレクトリも<filename class="directory">~/rpm</filename>の中に用意されています。</para>
		<para>以下、<xref linkend="rpmdirs" />で説明したディレクトリを単にBUILDとか、SOURCESと呼びます。</para>

		<important>
			<title>必要なディレクトリが存在しない場合</title>
			<para>もし必要なディレクトリが無い、または削除してしまった場合は、端末上で<command>mkrpmdir</command>コマンドを実行してください。</para>
			<screen>$ <command>mkrpmdir ~</command></screen>
			<para>このコマンドにより<filename class="directory">~/rpm</filename>配下に必要なディレクトリを作成できます。</para>
			<para>もし、<command>mkrpmdir</command>コマンドが見つからない場合は、vutilsパッケージをインストールしてください。</para>
		</important>
	</chapter>

	<chapter id="mr-gpgsign">
		<title>パッケージ署名の設定</title>
		<para>VineSeed および VinePlus では、原則として GnuPG による署名を行っていただきます。(GnuPG 鍵の作成方法は web などを参照してください。 )</para>
		<para><filename>~/.rpmmacros</filename>に以下の記述があるか確認して下さい。</para>

<screen>
# gpg signing
# %_signature gpg
# %_gpg_name Your Name &lt;your mail address&gt;
</screen>

		<para>行頭の # は、コメントを表しますので以下のように修正します。</para>

<!--screen>
# gpg signing
%_signature gpg
%_gpg_name Your Name &lt;your mail address&gt;
</screen-->
<screen>
# gpg signing
%_signature gpg	<co id="signature" />
%_gpg_name Your Name &lt;your mail address&gt;	<co id="gpg_name" />
</screen>
<calloutlist>
	<callout arearefs="signature">
		<para>署名に GnuPG を使用する宣言</para>
	</callout>
	<callout arearefs="gpg_name">
		<para>使用する GnuPG 鍵の宣言</para>
	</callout>
</calloutlist>

		<para>使用する GnuPG 鍵に合わせて、Your Nameはあなたの名前(ローマ字表記)、your mail addressはあなたのメールアドレスに変更して下さい。</para>
		<para>なお、パッケージ作成時には署名のためのオプションを与える必要がありますが、ファイル <filename>~/.popt</filename> に以下の記述を追加しておくとオプションを省略可能になります。</para>

<screen>
rpmbuild alias --ba		-ba --sign
rpmbuild alias --bb		-bb --sign
rpmbuild alias --bs		-bs --sign
rpmbuild alias --ta		-ta --sign
rpmbuild alias --rebuild        --rebuild --sign
</screen>

	</chapter>
</part>

<part id="mr-basicflow">
	<title>基本的なパッケージ作成の流れ</title>
	<partintro>
		<para><xref linkend="mr-basicflow" />では、共通的に必要となる事項を中心にパッケージ作成の基本的な流れを説明します。</para>
	</partintro>
<chapter id="mr-preparation">
	<title>パッケージ作成毎の準備</title>
	<para>この章から、実際にパッケージ作成の手順を説明していきます。</para>
	<sect1 id="mr-correct-info">
		<title>パッケージ化対象アプリケーションの情報収集</title>
		<para>次節以降の準備のためにパッケージ化しようとしているアプリケーションの情報を確認します。</para>
		<para>最初にパッケージ化するアプリケーションが、既にVinePlus(VineSeed)向けに用意されていないか確認します。</para>

		<example>
			<title>パッケージの存在を確認する</title>

<screen>
# apt-get update
$ apt-cache search name
</screen>

		</example>

		<note>
			<title>パッケージが存在した場合</title>
			<para>パッケージが存在していても不具合がある場合やバージョンアップする場合には、パッケージを修正する必要があります。</para>
			<para>この様な場合には、<command>apt-get source name</command>などとして既存のSPECファイルを取得し、修正するようにしてください。</para>
		</note>

		<para>パッケージが存在しないかバージョンアップする場合は、ダウンロードしたソースを<filename class="directory">SOURCES</filename>に保存してください。</para>

		<para>また、以下の情報についても配布元のサイトやソースに含まれる <filename>README</filename> などのファイルを見て確認してください。</para>
		<itemizedlist>
			<listitem><para>ビルド・インストールの方法</para></listitem>
			<listitem><para>ビルド・実行に必要なライブラリやアプリケーションとそのバージョン</para></listitem>
			<listitem><para>実行時に参照される設定ファイル</para></listitem>
		</itemizedlist>
	</sect1>
	<sect1 id="install-library">
		<title>アプリケーションのビルド・実行に必要なパッケージのインストール</title>
		<para>アプリケーションのビルド・実行に必要なライブラリやアプリケーションがあれば、それらのパッケージがインストールされているか確認してください。</para>
		<para>特にライブラリでは、ビルドにのみ必要なファイルがサブパッケージ(通常はname-devel)として用意されている場合があり、注意が必要です。</para>
		<para>また、複数のメジャーバージョンを共存させるためにパッケージ名にメジャーバージョンが追加されている場合があります。</para>
		<para>パッケージによっては、名前の一部が省略されている場合もあります。</para>
		<example>
			<title>gtk+-2.xを必要とする場合</title>
			<para>
				パッケージのビルドには、gtk2-develパッケージがインストールされている必要があります。
				(この例では、gtk+ の + が省略されている上、gtk+-1.xと共存するためにパッケージ名にメジャーバージョンである 2 が追加されています。)
			</para>
		</example>
		<para>なお、必要なライブラリ等のパッケージが用意されていない場合は、先にパッケージ化してください。</para>
	</sect1>
	<sect1 id="prepare-patch">
		<title>パッチの用意</title>
		<para>以下の様な場合には、パッチを用意します。</para>
		<itemizedlist>
			<listitem><para>必要なライブラリが全てインストールされているにも関わらずビルドに失敗する</para></listitem>
			<listitem><para>実行時の不具合がある</para></listitem>
			<listitem><para>アプリケーションのインストール先を変更できる仕組みになっていない</para></listitem>
			<listitem><para>設定ファイルをVine Linux向けにカスタマイズしたい</para></listitem>
		</itemizedlist>
		<para>ビルドや実行に関する不具合は、既に配布元でも承知して公式のパッチが用意されている場合もあります。</para>
		<para>その場合は、公式のパッチをダウンロードして<filename class="directory">SOURCES</filename>に保存します。</para>
		<note>
			<title>自分でパッチを作成する場合の手順</title>
			<orderedlist>
				<listitem><para>アプリケーションのソースを展開</para></listitem>
				<listitem>
					<para>展開されたディレクトリをコピー</para>
					<screen>$ cp -R srcdir srcdir.org</screen>
				</listitem>
				<listitem><para>コピー元のディレクトリ(srcdir)以下のファイルに必要な修正を加える</para></listitem>
				<listitem>
					<para>パッチを作成する</para>
					<screen>$ diff -uNr srcdir.org/ srcdir/ &gt; <replaceable>patchname</replaceable>.patch</screen>
				</listitem>
				<listitem><para>patchname.patchを<filename class="directory">SOURCES</filename>に保存</para></listitem>
			</orderedlist>
		</note>
	</sect1>
</chapter>

<chapter id="make-spec">
	<title>SPECファイルの記述</title>
	<para>いよいよ、パッケージ作成の肝となるSPECファイルの記述について説明します。</para>
	<para>SPECファイルの内容は、以下の主要部分に分類できます。</para>
	<itemizedlist>
		<listitem><para>パッケージ情報</para></listitem>
		<listitem><para>パッケージの作成やインストール等の手順(スクリプト部)</para></listitem>
		<listitem><para>インストールされるファイルの一覧</para></listitem>
		<listitem><para>パッケージの変更履歴</para></listitem>
	</itemizedlist>
	<important>
		<title>SPECファイルの文字コード</title>
		<para>SPECファイルの文字コードは<emphasis>UTF-8</emphasis>にしてください。</para>
	</important>
	<note>
		<title>マクロの定義</title>
		<para>SPECファイルの冒頭にパッケージのバージョンなど頻繁に使用されるものをマクロとして定義しておくと後々の修正が楽になります。</para>
		<para><screen>%define	macro	literal</screen>ようにするとパッケージ作成時に<varname>%{macro}</varname>と書かれた部分を<literal>literal</literal>に置換して処理します。</para>
		<para><xref linkend="common-macro" />も参照して下さい。</para>
	</note>
	<sect1 id="package-info">
		<title>パッケージ情報の記述</title>
		<para><command>rpm</command>コマンドでパッケージに関する問い合わせを実行した場合に表示される情報やパッケージの依存情報などを記述します。</para>
		<example id="ex-pkginfo">
			<title>パッケージ情報の記述例</title>
			<para>以下にパッケージ情報の記述例を示します。(#を記述すると#から行末までがコメントとして扱われます。)</para>

			<screen>&ex-pkginfo;&ex-pkginfo;</screen>
			
		</example>

		<para>基本情報から依存情報の部分は、1行につき1つの情報を記述する構成となっています。</para>
		<para>各行は「Summary:」のようにタグとそれに続くコロンで始まり、さらにタグに対応する情報が続く形式になっています。</para>

		<sect2>
			<title>基本情報</title>
			<para><xref linkend="spec-basic-info" />の情報は、<command>rpm -qi</command>などでパッケージに関して問い合わせを行った場合に表示されます。</para>
			<table id="spec-basic-info">
				<title>基本情報で使用されるタグ</title>
				<tgroup cols="2">
					<thead><row><entry>タグ</entry><entry>内容</entry></row></thead>
					<tbody>
						<row>
							<entry>Summary</entry>
							<entry>パッケージの簡単な説明を英語で記述します。</entry>
						</row>
						<row>
							<entry>Summary(ja)</entry>
							<entry>Summaryを日本語で翻訳します。</entry>
						</row>
						<row>
							<entry>Name</entry>
							<entry>パッケージの名前です。定義以降、%{name}というマクロで参照できます。</entry>
						</row>
						<row>
							<entry>Version</entry>
							<entry>パッケージのバージョンです。定義以降、%{version}というマクロで参照できます。</entry>
						</row>
						<row>
							<entry>Release</entry>
							<entry>冒頭の数字は同じバージョンで何回目のリリースになるかを意味します。%{?_dist_release}は、vl5の様に対象となるVine Linuxのバージョンに置き換えられます。定義以降、%{release}というマクロで参照できます。</entry>
						</row>
						<row>
							<entry>License</entry>
							<entry>アプリケーションのライセンス</entry>
						</row>
						<row>
							<entry>Group</entry>
							<entry>アプリケーションの種類。<xref linkend="group-list" />を参照して下さい。</entry>
						</row>
						<row>
							<entry>Packager</entry>
							<entry>パッケージメンテナ。BTS.VineLinux.Orgへのログインユーザ名を使用してください。複数のメンテナがいる場合、カンマで区切ります。</entry>
						</row>
						<row>
							<entry>Distribution</entry>
							<entry>VinePlusやVineSeedのパッケージは、Vine Linuxを指定します。</entry>
						</row>
						<row>
							<entry>Vendor</entry>
							<entry>作成したrpmパッケージに関する責任を負うVendor名です。VinePlusやVineSeedのパッケージは、Project Vineを指定します。</entry>
						</row>
						<row>
							<entry>Url</entry>
							<entry>アプリケーションの情報を提供しているURL</entry>
						</row>
					</tbody>
				</tgroup>
			</table>
		</sect2>

		<sect2>
			<title>パッケージ作成時に必要となるタグ</title>
			<table>
				<title>パッケージ作成時に必要となるタグ</title>
				<tgroup cols="2">
					<thead><row><entry>タグ</entry><entry>内容</entry></row></thead>
					<tbody>
						<row>
							<entry>Source</entry>
							<entry>パッケージ化するアプリケーションのソースファイル名。ソースの入手先を明示するためにURL形式で記述することも可能。</entry>
						</row>
						<row>
							<entry>Patch</entry>
							<entry>
								<xref linkend="prepare-patch" />で用意したパッチファイルを指定します。
								書式はSourceと同じです。
							</entry>
						</row>
						<row>
							<entry>BuildRoot</entry>
							<entry>仮想インストールのためのディレクトリ名を書きます。直接ディレクトリ名を書くのではなく、例のようにマクロを利用してください。</entry>
						</row>
					</tbody>
				</tgroup>
			</table>
			<para>複数のソースファイルやパッチがあるときはSource0、Source1、...やPatch0、Patch1、...というふうに番号をふって列挙します。(Source0は、Sourceと省略できます。)</para>
			<para>Souce数字 で指定したファイルは %{SOURCE数字} というマクロとして <xref linkend="mr-script" />の %prep や %install などの部分で利用できます。</para>
		</sect2>

		<sect2>
			<title>依存情報</title>
			<para>パッケージの依存情報など他のパッケージとの関係を示すには、<xref linkend="dependency-tag" />のようなタグを使用します。</para>
			<table id="dependency-tag">
				<title>パッケージの依存関係を扱うタグ</title>
				<tgroup cols="2">
					<thead><row><entry>タグ</entry><entry>内容</entry></row></thead>
					<tbody>
						<row>
							<entry>Requires</entry>
							<entry>作成しているrpmパッケージが動作するのに必要なパッケージ名</entry>
						</row>
						<row>
							<entry>BuildRequires</entry>
							<entry>パッケージの作成時に必要となるパッケージ名</entry>
						</row>
						<row>
							<entry>Conflicts</entry>
							<entry>共存できないパッケージ名</entry>
						</row>
						<row>
							<entry>Provides</entry>
							<entry>作成するパッケージが他のパッケージの代替となる場合、そのパッケージ名を記述</entry>
						</row>
						<row>
							<entry>Obsoletes</entry>
							<entry>パッケージをインストールする際にアンインストールしたいパッケージ名</entry>
						</row>
						<row>
							<entry>BuildConflicts</entry>
							<entry>パッケージ作成時にはインストールしておけないパッケージ名</entry>
						</row>
					</tbody>
				</tgroup>
			</table>
			<para>&lt;, &gt;, =, &gt;=, &lt;=といった演算子を使うとパッケージのバージョン、リリース番号を限定することもできます。</para>
			<example>
				<title>ghostscriptのバージョン5.10がパッケージの動作に必要な場合</title>
				<screen>Requires: ghostscript = 5.10</screen>
			</example>
			<example>
				<title>gtk2-develのバージョン2.16.0以上がパッケージの作成に必要な場合</title>
				<screen>BuildRequires: gtk2-devel &gt;= 2.16.0</screen>
			</example>
			<important>
				<title>演算子の両側には必ずスペースやタブを入れてください。</title>
				<para>演算子の両側にスペースやタブを入れない場合、パッケージ名からバージョンまでが一つのパッケージ名として認識されてしまいます</para>
				<para>例えば、<screen>BuildRequires: gtk2-devel&gt;=2.16.0</screen>とすると「gtk2-devel&gt;=2.16.0」というパッケージ名だと認識してしまいます。</para>
			</important>
			<para>複数のパッケージが関係する場合は、カンマ(,)やスペースで区切って列挙したり、複数行に分けて記述できます。複数行に分ける場合は、各行にタグが必要です。</para>
			<para>パッケージがいくつかのグループに分類できる場合には、複数行に書いた方がわかりやすくなります。</para>
			<example>
				<title>一行で記述する例</title>
				<screen>Requires: ghostscript &gt;= 5.10, ghostscript-fonts, VFlib = 2.24, tetex, tetex-extra</screen>
			</example>
			<example>
				<title>複数行に分けて記述する例</title>

<screen>
Requires: ghostscript &gt;= 5.10, ghostscript-fonts, VFlib = 2.24
Requires: tetex, tetex-extra
</screen>

			</example>
		</sect2>

		<sect2>
			<title>詳しい解説</title>
			<para>Summaryよりも詳しいパッケージの解説を<screen>%description</screen>の次の行から、<emphasis>英語で</emphasis>記述します。</para>
			<para>Summaryタグの場合と違い、複数行にわたる解説を書くことができます。</para>
			<para>なお、日本語による翻訳を追加する場合は、<screen>%description -l ja</screen>として、同様に記述できます。</para>
		</sect2>
	</sect1>

	<sect1 id="mr-script">
		<title>スクリプト部</title>
		<para>スクリプト部では、パッケージの作成やインストール等の手順を記述します。</para>
		<example id="ex-script">
			<title>スクリプト部の記述例</title>
			<screen>&ex-script;</screen>
		</example>
		<para>スクリプト部は、<xref linkend="section-list" />で示すセクションに分かれます。</para>
		<para>各セクションは、独立したbashスクリプトとして実行できるように記述します。</para>

	<note>
			<title>rpmbuild時の内部の仕組み</title>
			<para>各セクション名が現れた時に #!/bin/sh -eが起動され(Vine Linuxでは/bin/shは/bin/bashにsym.linkされてる)、
				各環境変数(RPM_SOURCE_DIRやRPM_PACKAGE_NAMEなど)が定義された後、
				次のセクション名が出てくるまで、記述されているスクリプトが実行されます。</para>
			<para>環境変数の詳細については、<xref linkend="mr-env" />を参照してください。</para>
		</note>

		<table id="section-list">
			<title>スクリプト部のセクション</title>
			<tgroup cols="3">
				<thead><row><entry>セクション名</entry><entry>概要</entry><entry>詳細説明</entry></row></thead>
				<tbody>
					<row>
						<entry>%prep</entry>
						<entry>ソースをビルドする前に実施する準備事項</entry>
						<entry><xref linkend="prep-section" /></entry>
					</row>
					<row>
						<entry>%build</entry>
						<entry>ソースのビルド手順</entry>
						<entry><xref linkend="build-section" /></entry>
					</row>
					<row>
						<entry>%install</entry>
						<entry>ソースからのインストール手順</entry>
						<entry><xref linkend="install-section" /></entry>
					</row>
					<row>
						<entry>%check</entry>
						<entry>インストールが正しく実行されたかを検査する手順</entry>
						<entry><xref linkend="check-section" /></entry>
					</row>
					<row>
						<entry>%clean</entry>
						<entry>パッケージ作成後の後始末</entry>
						<entry><xref linkend="clean-section" /></entry>
					</row>
					<row>
						<entry>その他</entry>
						<entry>パッケージのインストール等の前後に実行する手順</entry>
						<entry><xref linkend="other-section" /></entry>
					</row>
				</tbody>
			</tgroup>
		</table>
		<para>以下、各セクションの詳細を解説します。</para>

		<sect2 id="prep-section">
			<title>%prepセクション</title>
			<para>ソースをビルドする前に実施する準備事項をシェルスクリプトで記述します。</para>
			<para>以下で説明する%setup,%patchなどのマクロを用いて、ソースの展開やパッチの適用などを行います。</para>
			<para>なお、このセクションの最初で<screen>rm -rf ${RPM_BUILD_ROOT}</screen>として、
				${RPM_BUILD_ROOT}(<xref linkend="package-info" />のBuildRootで指定したディレクトリ)
				を掃除することが多いです。ただし、このときには、
				BuildRootの設定には十分気をつけて下さい（何故かわかりますね？）
			</para>
			<variablelist>
				<varlistentry>
					<term>%setup</term>
					<listitem><para>
							<command>tar</command>でアーカイブされ、
							<command>gzip</command>または<command>bzip2</command>圧縮されたソースを展開します。
							%setupとオプションなしで書くと、以下が順に行われます。</para>
						<orderedlist>
							<listitem><para>
									<xref linkend="mr-directories" />で指定したディレクトリBUILDにcdする。
							</para></listitem>
							<listitem><para>
									指定ディレクトリ(-nで指定できる。デフォルトのディレクトリ名は、
									${RPM_PACKAGE_NAME}-${RPM_PACKAGE_VERSION}、後述)
									がカレント・ディレクトリ(BUILD)に存在すれば消去する。
							</para></listitem>
							<listitem><para>
									Sourceで指定したソースのアーカイブを展開する。
							</para></listitem>
							<listitem><para>指定ディレクトリ(2の指定ディレクトリ名と同じ)にcdする。
							</para></listitem>
						</orderedlist>
						<para>%setupの動作を制御する必要がある場合は、<xref linkend="setup-macro" />を参照してください。</para>
					</listitem>
				</varlistentry>

				<varlistentry>
					<term>%patch</term>
					<listitem>
						<para>%setupで展開したソースにパッチをあてるためのマクロとしてはたらきます。</para>
						<para>オプションなしで%patchと書くと、
							<screen>patch -p0 -s &lt; ${RPM_SOURCE_DIR}/&lt;Patchで指定したファイル&gt;</screen>
							が起動されます。</para>
						<para><xref linkend="ex-script" />のように書くと、
							<screen>patch -p1 -s &lt; ${RPM_SOURCE_DIR}/&lt;Patchで指定したファイル&gt;</screen>
							と同じことをします。</para>
							
						<para>パッチファイルが複数ある場合、Patch0, Patch1,...に対して、 
<screen>
%patch0 -p1
%patch1 -p1
</screen>
							と実行することも出来ます。%patchには-b &lt;name&gt;
							(バックアップ・ファイルの拡張子指定、デフォルトは.orig)などのオプ
							ションがあります。
					</para></listitem>
				</varlistentry>
			</variablelist>
		</sect2>

		<sect2 id="build-section">
			<title>%buildセクション</title>
			<para>
					ソースをmakeするスクリプトの開始であることを示し、また、
					%setupで指定したディレクトリにcdするマクロとしてはたらきます。
					以下には、makeを行うときの手順をスクリプトとして書きます。
			</para>
			<para>ここでの処理で必要となるパッケージ等は、BuildRequires(build): で指定します。</para>
			<note>
				<title>ソースにconfigureスクリプトが用意されている場合</title>
				<para>autoconf化されたソースなどmakeの前に
					<screen>$ configure --prefix=/usr</screen>
					などとしてインストールするディレクトリなどを制御できるソースがあります。</para>
				<para>configureスクリプトが用意されている場合には、%configureマクロを利用すると便利です。</para>
				<para>%configureマクロは、<filename>/usr/lib/rpm/macros</filename>で次のように定義されており、
					Vine Linux推奨のコンパイルフラグやインストールディレクトリを設定できます。</para>
<screen>
%configure \
  CFLAGS="${CFLAGS:-%optflags}" ; export CFLAGS ; \
  CXXFLAGS="${CXXFLAGS:-%optflags}" ; export CXXFLAGS ; \
  FFLAGS="${FFLAGS:-%optflags}" ; export FFLAGS ; \
  ./configure --host=%{_host} --build=%{_build} \\\
	--target=%{_target_platform} \\\
	--program-prefix=%{?_program_prefix} \\\
 	--prefix=%{_prefix} \\\
	--exec-prefix=%{_exec_prefix} \\\
	--bindir=%{_bindir} \\\
	--sbindir=%{_sbindir} \\\
	--sysconfdir=%{_sysconfdir} \\\
	--datadir=%{_datadir} \\\
	--includedir=%{_includedir} \\\
	--libdir=%{_libdir} \\\
	--libexecdir=%{_libexecdir} \\\
	--localstatedir=%{_localstatedir} \\\
	--sharedstatedir=%{_sharedstatedir} \\\
	--mandir=%{_mandir} \\\
	--infodir=%{_infodir}
</screen>
				<para>ここで定義されていないオプション、例えば--disable-scrollkeeperというようなオプションが必要な場合には
					<screen>%configure --disable-scroolkeeper</screen>のように追加でオプションを指定できます。</para>
			</note>
		</sect2>

		<sect2 id="install-section">
			<title>%installセクション</title>
			<para>
				ファイルをinstallするスクリプトの開始であることを示し、また、
				%setupで指定したディレクトリにcdするマクロとしてはたらきます。
				以下には、installを行うときの手順を示します。
				データ定義部のBuildRootで設定したディレクトリ(${RPM_BUILD_ROOT})
				の下に全てのファイルがインストールされるように、工夫しましょう。
				Makefileが短いときには、修正してpatchをつくるかわりに、ここに、
				cp, installコマンド等を用いたinstallスクリプトを書くのも一手です。
			</para>
			<para>
				%setup のところと同じように、マクロ %{SOURCE数字} を使って Source: で指定したファイルを直接インストールすることもできます。
				<screen>%{__install} -m 644 %{SOURCE2} %{buildroot}/where/there/</screen>
			</para>
			<para>
				なお、rpm-3.0.5以降では、インストールされたバイナリは
				rpmパッケージにする段階で自動的にstripされますので、
				%installでbinaryのstripを行う必要はありません。
			</para>
			<para>
				ここでの処理で必要となるパッケージ等は、
				BuildRequires(install): で指定します。
			</para>
		</sect2>

		<sect2 id="check-section">
			<title>%checkセクション</title>
			<para>
				install が正しく実行されたかをcheckするスクリプトの開始であることを示します。
				%setupで指定したディレクトリにcdするマクロとしてはたらきます。
				以下には、make test や make check などを実行するときの手順を示します。
			</para>
			<para>
				GNOME などが利用する desktopファイルの書式チェックなどを行うこともできます。
				<xref linkend="add_to_gnome_menu" />を参照してください。
			</para>
			<para>
				rpm-4.2以降で実装された機能です。
			</para>
			<para>
					ここでの処理で必要となるパッケージ等は、
					BuildRequires(install): で指定します。
			</para>
		</sect2>

		<sect2 id="clean-section">
			<title>%cleanセクション</title>
			<para>
					rpmを作ったあとの後始末を記述します。
			</para>
			<para>
					ここでの処理で必要となるパッケージ等は、
					BuildRequires(clean): で指定します。
			</para>

		</sect2>
	</sect1>

	<sect1 id="making-rpm-5-3">
		<title>ファイルリスト部</title>
		<para>%filesはじまる部分で、RPMパッケージに収録するファイル名を列挙します。</para>
		<example id="ex-filelist">
			<title>ファイルリスト部の例</title>
			<screen>&ex-files;</screen>
		</example>
		<para>このとき以下に注意してください。</para>
		<itemizedlist>
			<listitem><para>
					ここに書くファイル名は重複してはいけません。
			</para></listitem>
			<listitem><para>
					列挙されたファイルは、%docで指定するものを除いて、
					%installまでのスクリプトの実行によって、
					記述した通りの場所(${RPM_BUILD_ROOT}を''/''とみなす)
					にinstallされるものでないといけません。
			</para></listitem>
			<listitem><para>
					列挙されたファイルがおかしな userID/groupID を持っていると、
					rpmパッケージが正常にbuildできないことがあります。
			</para></listitem>
			<listitem><para>
					ファイルを含まないバーチャルパッケージ<footnote><para>Requires で他のパッケージをまとめてインストールしたり、%post, %preun, %postun などで何らかのコマンド処理を行うようなパッケージ。task-gnome や task-tetex などのように task- という名前が使われます。</para></footnote>を作る場合でも、%files という行だけは必要になります。%files という行を省略してしまうと、rpmbuild コマンドで処理しても src.rpm しか作れません。
			</para></listitem>
		</itemizedlist>
		<para>
			<command>rpmbuild</command>コマンドは、SPECファイルに基づいてRPMパッケージを作るときに、
			<xref linkend="mr-script" />で設定した一連のスクリプトを実行した後、
			${RPM_BUILD_ROOT}をとみなして%files以下で指定されたファイルを回収し、
			それを指定位置にinstallするようなRPMパッケージをつくります。
		</para>
		<sect2>
			<title>ドキュメント・ファイルの指定</title>
			<para>
				%docというマクロを用います。<xref linkend="ex-filelist" />のように、%doc READMEとすると、
				%setupで指定したホームディレクトリ下のREADMEが、
				${RPM_BUILD_ROOT}/usr/doc/hoge-1.1-2/にcpされたのち、
				rpmパッケージに回収されます。つまり%docは、
				ドキュメントファイルのインストールとパッケージングのためのファイル指定を同時に行うマクロとしてはたらきます。
				以下のように、ディレクトリごと指定もできます。
			</para>
			<screen>%doc doc/</screen>
		</sect2>
		<sect2>
			<title>パッケージに収録するファイルの指定</title>
			<para>その絶対パスで指定します。</para>
			<itemizedlist>
				<listitem><para>
						個別ファイルはそのまま指定。(/usr/bin/hoge.bin など)
				</para></listitem>
				<listitem><para>
						あるディレクトリ以下の全てのファイルをrpmパッケージにいれたいときには、
						そのディレクトリ名を書きます。(タグなし、/usr/hoge/ など)。
						アンインストール時には、そのディレクトリごとなくなります。
				</para></listitem>
				<listitem><para>
						ワイルドカードも使えます。(/usr/hoge/* など)
				</para></listitem>
			</itemizedlist>
			<warning>
				<para>
					rpm-3.0.5以降では、man ファイルや info ファイルは自動的にgzipで圧縮されます。
					%filesにmanやinfoのファイル名を書くときには拡張子.gzをつけるのを忘れないようにしましょう。
				</para>
			</warning>
		</sect2>
		<sect2>
			<title>タグを用いたファイル指定</title>
			<variablelist>
				<varlistentry>
					<term>%dir &lt;dir name&gt;</term>
					<listitem><para>
							指定したディレクトリだけをパッケージに含める。
							<screen>``/usr/hoge/'' = ``%dir /usr/hoge/'' + ``/usr/hoge/*''</screen>
							ってかんじです。
					</para></listitem>
				</varlistentry>
				<varlistentry>
					<term>%config &lt;file name&gt;</term>
					<listitem><para>
							configファイルであることを示す。
							ファイルが書き換えられていた場合、
							アンインストール時には .rpmsaveをつけた名前で保存されます。
							アップグレード時には新しいファイルと置き換えられ、
							元のファイルは .rpmsaveをつけた名前で保存されます。
						</para>
						<para>
							ファイルが変更されていた場合、
							アップグレード時に新しいファイルに置き換えずにもとのファイルをそのまま使う場合には、
							%config(noreplace) を指定します。
							<screen>%config(noreplace) &lt;file name&gt;</screen>
							この場合新しいパッケージに入っている設定ファイルは、
							.rpmnew をつけた名前で保存されます。
							また、アップグレードではなく、同じバージョンをインストールし直した時には、
							.rpmorig をつけた名前で保存されます。
						</para>
						<para>
							存在しなくても問題ないファイルの場合は、
							%config(missingok) を指定します。
							<screen>%config(missingok) &lt;file name&gt;</screen>
							これは、rpmコマンドの -V オプションでチェックした時に、
							ファイルが無くてもエラーにならないようにするためのものです。
					</para></listitem>
				</varlistentry>
				<varlistentry>
					<term>%attr(&lt;mode&gt;,&lt;owner&gt;,&lt;group&gt;[, dirmode]) &lt;file name&gt;</term>
					<listitem><para>
							%filesに列挙するファイルのパーミッションやuser ID、group IDを設定する。
							例えば、
							<screen>%attr(755,root,root) /usr/lib/hoge</screen>
							とする。一部の属性を省略(書き換えない)したいときには - を使って、
							<screen>%attr(755,-,root) /usr/lib/hoge</screen>
							とする。このタグを用いることによって、
							root権限を持ってない人もrpmのパッケージ化を行える。
						</para>
						<para>
							<screen>%attr(755,root,root)</screen>
							のように( )の中には 3つしか書かないことが多いですが、
							<screen>%attr(755,root,root,755)</screen>
							のように 4つ書くこともできます。
							4つ目の数字(dirmode)は、
							<emphasis>ディレクトリとサブディレクトリのパーミッション</emphasis>になります。
					</para></listitem>
				</varlistentry>
				<varlistentry>
					<term>%defattr(&lt;mode&gt;,&lt;owner&gt;,&lt;group&gt;[, dirmode])</term>
					<listitem><para>
							それ以降の行に書かれた属性のデフォルト値を設定する。
							%attr が出てきた行を除いて、それ以降に書かれたものに共通になります。
						</para>
						<para>
							%defattr も %attr も何度でも使えます。
							次の例だと、/usr/bin/hoge と /usr/lib/hoge は一つ目の %defattr の 755 になり、
							/usr/share/locale/ja 以降は二つ目の %defattr の 644 になります。
						</para>
<screen>
%defattr(755,-,-)
/usr/bin/hoge
/usr/lib/hoge
%defattr(644,-,-)
/usr/share/locale/ja
/usr/share/locale/lv</screen>						
						<para>
							%attrと同様、4つ目の数字は、
							ディレクトリとサブディレクトリのパーミッションになります。
					</para></listitem>
				</varlistentry>

				<varlistentry>
					<term>%verify( ) &lt;file name&gt;</term>
					<listitem><para>
							%filesに列挙するファイルについて、rpm -V でパッケージを検証する時に、検証する項目を指定する。</para>
						<para>
							( ) の中には<xref linkend="verify-options" />にあるものが入ります。
							複数指定する場合には、, もしくは スペース で区切ります。</para>


						<table id="verify-options">
							<title>%verify の ( ) の中で指定できるもの</title>
							<tgroup cols="2">
								<thead>
									<row><entry>項目</entry><entry>内容</entry></row>
								</thead>
								<tbody>
									<row><entry>size</entry><entry>サイズ</entry></row>
									<row><entry>mode</entry><entry>パーミッションとファイルの種類</entry></row>
									<row><entry>md5</entry><entry>md5 値</entry></row>
									<row><entry>rdev</entry><entry>デバイスファイルのモードビットなど</entry></row>
									<row><entry>link</entry><entry>リンク先</entry></row>
									<row><entry>user</entry><entry>ファイルの所有者 user</entry></row>
									<row><entry>group</entry><entry>ファイルのグループ group</entry></row>
									<row><entry>mtime</entry><entry>ファイルの更新時刻 mtime(modification time)</entry></row>
								</tbody>
							</tgroup>
						</table>

						<para><emphasis>not</emphasis> とすると<emphasis>検証しない項目</emphasis>だけを指定できます。</para>
						<para>書き換えることが前提となる設定ファイルなので、ファイルサイズ と md5値 と 更新時刻 は検証する必要がないといった場合には、
							<screen>%verify(not size,md5,mtime) /etc/hoge.conf</screen>
							のように指定します。
					</para></listitem>
				</varlistentry>

				<varlistentry>
					<term>%defverify( )</term>
					<listitem><para>
							それ以降の行に書かれたファイルについて検証する項目を設定します。
					</para></listitem>
					<listitem><para>
							%verify と %defverify は、%attr と %defattr と同じような関係です。
					</para></listitem>
				</varlistentry>

			</variablelist>
			<para>
				%config %attr %verify などは、次のようにスペースを入れることで一つのファイルに複数指定できます。
				<screen>%config %verify(not size,md5,mtime) /etc/hoge.conf</screen>
			</para>

			<para>
				この%filesの指定は少々面倒なとこかもしれません。
				新しくパッケージをつくる場合などは、%install までのスクリプト部を書いたところで、%files以下は何も書かないまま、一度、そのSPECファイルから rpm をbuildしてみるとよいかもしれません。(rpm -bi hoge.spec これについては次節)。

				そのあとで、${RPM_BUILD_ROOT}以下にinstallされてるファイルを、find コマンドで見てみて%filesの指定をします。
			</para>
			<para>
				%filesで書かれていないファイルがある場合には、build 時に
				<screen>パッケージに未収録のファイルを検査中: /usr/lib/rpm/check-files /var/tmp/hoge-1.1-root
					警告: パッケージに未収録のインストール済みファイルが見つかりました:</screen>
				と未収録のファイルの名前などが表示されます。
				この部分を利用して %files の部分を作成するのもよいでしょう。
			</para>

			<para>
				ソースのバージョンアップなどで、作成されるファイルが増減したり、ディレクトリが変わったりする場合があります。未収録のファイルがあっても、build が途中で終了せず、パッケージを作成できてしまう場合があるので、build 時のメッセージは必ず確認してください。
			</para>
		</sect2>
	</sect1>

	<sect1 id="package-changelog">
		<title>パッケージの更新履歴</title>
		<para>%changelog以下にパッケージの更新履歴を英語で記述します。最新の更新情報が上にくるように書きます。</para>
		<example>
			<title>パッケージの更新履歴の例</title>
			<screen>&ex-changelog;</screen>
		</example>
		<para>
			一行目の最初に * を書き、日付と変更を加えた人の名前を書きます。
			二行目以降に - を書き、更新内容を書きます。
			今日の日付は <command>date コマンド</command> で
			<command>LANG=C date +'%a %b %d %Y'</command> とすると確認できます。
			12月1日のように日の部分が一桁の場合は 0 をつけ 01 のようにします。
		</para>
		<para>
			Vine Linux でのパッケージングルールでは
			一行目に日付、パッケージャーの名前、メールアドレス、パッケージのバージョン,、リリース番号を書くことになっています。
		</para>
<screen>
* 曜日 月 日 西暦年 パッケージャーの名前 &lt;メールアドレス&gt; バージョン-リリース番号
- 更新内容
</screen>
		<para>
			更新内容の部分でもマクロは展開され %{name} は hoge になります。
			マクロを展開せずにそのまま %{name} と書きたい場合は
			%%{name} のように % を二つ続けて書いて下さい。
		</para>
		<para>
			日本語を使うことも可能になっていますが、Summary や description
			のように環境変数に応じて日本語や英語のどちらかを表示するという仕組みは無いので、
			英語だけで書くほうがよいでしょう。
		</para>
	</sect1>
</chapter>

<chapter id="rpmbuild">
	<title>SPECファイルをもとにRPMパッケージを作成する</title>
	<para>RPMパッケージを作成するには、次のコマンドを実行します。</para>
	<screen>$ <command>rpmbuild -ba --sign hoge.spec</command></screen>
	<para>特に問題がなければ、バイナリパッケージとソースパッケージの両方が作成されます。</para>
	<para>どちらか一方のみを作成する場合は、オプション<option>-ba</option>(build all)の代わりに
		<option>-bb</option>(build binary)あるいは<option>-bs</option>(build source)を使用します。</para>
	<para>なお、オプション<option>--sign</option>は、パッケージに署名することを意味します。<xref linkend="mr-gpgsign" />で<filename>~/.popt</filename>の設定をした場合は、省略可能です。</para>
	<para>署名オプションが有効になっていれば、次の様なプロンプトが表示されるのでGnuPG鍵のパスフレーズを入力して下さい。</para>
	<screen>パスフレーズの入力:</screen>

	<important>
		<title>rpmbuildの推奨</title>
		<para>Vine Linux 3.0以降で採用されているrpm-4.xではパッケージのビルドは<command>rpmbuild</command>コマンドを利用するようになりました。過去との互換性のためVine Linuxでは、<command>rpm</command>コマンドも利用できるようになっていますが、将来的に廃止の予定であるため今後は<command>rpmbuild</command>コマンドをお使いください。</para>
	</important>

	<para>パッケージを作成せずに段階的にスクリプト部を検証する場合は、<xref linkend="verify-script" />のオプションを使用します。
		この際、オプション<option>--short-circuit</option>を併用すると一つ前の段階の動作結果を利用できます。</para>
	<table id="verify-script">
		<title>スクリプト部の検証オプション</title>
		<tgroup cols="2">
			<thead><row><entry>オプション</entry><entry>実行内容</entry></row></thead>
			<tbody>
				<row>
					<entry>-bp</entry>
					<entry>%prepセクションの実行(build prep)</entry>
				</row>
				<row>
					<entry>-bc</entry>
					<entry>%prep、%buildセクションの実行(build compile)</entry>
				</row>
				<row>
					<entry>-bi</entry>
					<entry>%prep,%build,%install,%checkセクションの実行(build install)</entry>
				</row>
			</tbody>
		</tgroup>
	</table>

	<note>
		<title>メッセージの記録</title>
		<para>
			次のように | (パイプ) と tee コマンドを利用して、ビルド中のメッセージをファイルに残しておくと、エラーの確認や、%files の確認、Requires の確認といった作業がやりやすくなります。 
		</para>	
		<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>
	</note>

	<note>
		<title>tarballからRPMパッケージを作成する</title>
		<para>
			他に、 tar.gz 形式のソースの中に含まれている SPEC ファイルを用いて build するときには、
			-b のかわりに -t を用いて、
			<screen>$ <command>rpmbuild -ta hoge.tar.gz</command></screen>
			などとします。
		</para>
	</note>
		<!--para>サンプルのSPECファイルのような指定で、rpmパッケージをつくると、hoge-1.1-2vl5.i386.rpm という名前のrpmができます(architectureがi386の場合)。</para-->
</chapter>


<chapter id="mr-followup">
  	<title>パッケージ作成後に確認すること</title>
	<orderedlist>

	  <listitem><para>SPEC ファイルのエンコーディング等を確認する。</para>
	    <para><screen>$ <command>rpm -qpi hoge.rpm</command></screen>
	      で文字化けしないかどうか、また、バージョンなど、記述した内容にミスが無いか確認する。</para>
	    <para><screen>$ <command>LANG=C rpm -qpi hoge.rpm</command></screen>
	      として英語による出力も確認する。</para>
	  </listitem>
	  
	  <listitem><para>Changelog の記述を確認する。</para>
	    <para><screen>$ <command>rpm -qp --changelog hoge.rpm | head</command></screen>
	      などで、追記した部分を確認する。</para>
	  </listitem>
	  
	  <listitem><para>依存関係(Requires)を確認する。</para>
	    <para><screen>$ <command>rpm -qpR hoge.rpm</command></screen></para>
	    
	    <para>パッケージがシェルスクリプトのファイルなどを含んでいる場合、その中で利用されるコマンド(もしくはパッケージ)が Requires: で指定されているかを確かめる必要もあります。これは、実際にシェルスクリプトを実行するなどして確かめる必要があります。</para>
	    <para>
		    RPMパッケージをbuildするときには、
		    そのパッケージに含まれるバイナリの実行に必要なライブラリ名も、
		    自動的にRequiresに加えられます(正確には必要なライブラリのsonameが加えられます)。
		    rpmパッケージをinstallするときに、必要なライブラリがシステム上にないと、
		    libhoge.so is neededとかいって、おこられますが、
		    libhoge.soがなんというパッケージに入ってるかわからずに困ることがよくあるので、
		    必要なパッケージ名をきちんとRequiresに書くように心がけましょう。
	    </para>
	    <para>
		    筆者はbuildした時に出力されるメッセージの
		    <screen>Requires: /bin/sh libICE.so.6 libORBit-2.so.0</screen>
		    といった部分を、(bash の for文 を利用して)<command>slocate</command> と <command>rpm -qf</command> で処理してパッケージ名を調べています。
<screen>$ for i in libICE.so.6 libORBit-2.so.0 ;
do slocate $i |xargs rpm -qf ;
done | sort -u</screen>
	    </para>
	  </listitem>
	  
	  <listitem><para>build 時の依存関係(BuildRequires)を確認する。</para>
	    
	    <para>できあがった src.rpm を、BuildRequires で指定していない devel などのパッケージをアンインストールした状態で rebuild してみる。</para>

	    <para>
		    *-devel というパッケージをアンインストールするのに、筆者は(bash で)次のようなコマンド(for文)を利用しています。sed や awk で処理してる部分はもう少し上手なやり方があるかもしれません。</para>
	    <example id="rm-devel">
		    <title>*-develパッケージをアンインストールするシェルスクリプト</title>
<screen>
for i in `rpm -qa --last | grep devel | sed s/devel-/"devel "/ | awk '{print $1}'` ;
do
	echo $i ;
	rpm -q $i &amp;&amp; rpm -e $i ;
	rpm -q $i &amp;&amp; apt-get remove $i ;
done</screen>
	    </example>

	  </listitem>

	</orderedlist>

	<para>ローカルに apt のリポジトリを作成しておくと、apt-get install や apt-get build-dep で、依存関係のチェック等が行えて便利です。</para>

</chapter>
</part>

<part id="mr-advanced">
	<title>より高度なパッケージ作成のための情報</title>
	<partintro>
		<para><xref linkend="mr-advanced" />では、<xref linkend="mr-basicflow" />を一通り理解した方向けにより高度なパッケージ作成に必要な情報を提供します。</para>
	</partintro>
	<chapter id="env-and-macro">
		<title>環境変数とマクロの活用</title>
		<sect1 id="mr-env">
			<title>環境変数</title>
			<para>
				スクリプト部の各タグからはじまる部分は、先にも述べた通り独立したbash scriptとして働くので、
				その範囲内で、
				<screen>TEXMF="/usr/share/texmf"</screen>
				と変数を定義して用いることができます。
			</para>
			<para>
				定義した変数は ${ } で囲んで
				<screen>${TEXMF}</screen>
				のようにすると利用できます。
				$TEXMF のように { } を省略することもできます。
			</para>
			<para>
				/usr/share というディレクトリは標準で %{_datadir} というマクロが定義されているので
				<screen>TEXMF="%{_datadir}/texmf"</screen>
				とすることができます。
				マクロについては、次節以降で説明します。
			</para>
			<para>
				また、以下の変数は各タグ毎に環境変数として定義されます。
			</para>
			<variablelist>
				<varlistentry>
					<term>RPM_SOURCE_DIR</term>
					<listitem><para>
							ディレクトリSOURCESを表す。<xref linkend="rpmdirs" />参照。
							デフォルトは、
							<screen>RPM_SOURCE_DIR="/usr/src/redhat/SOURCES"</screen>
					</para></listitem>
				</varlistentry>
				<varlistentry>
					<term>RPM_BUILD_DIR</term>
					<listitem><para>
							ディレクトリBUILDを表す。<xref linkend="rpmdirs" />参照。
							デフォルトは、
							<screen>RPM_BUILD_DIR="/usr/src/redhat/BUILD"</screen>
					</para></listitem>
				</varlistentry>
				<varlistentry>
					<term>RPM_DOC_DIR</term>
					<listitem><para>
							%docで指定されたドキュメントファイルをインストールするためのディレクトリを表す。
							rpmrcファイルの、defaultdocdirで指定する。デフォルトは、
							<screen>RPM_DOC_DIR="/usr/doc"</screen>
					</para></listitem>
				</varlistentry>
				<varlistentry>
					<term>RPM_OPT_FLAGS</term>
					<listitem><para>
							コンパイル時にコンパイラにわたすデフォルトのオプション指定を表す。 
							rpmrcファイルの、optflagsで指定する。
							アーキテクチャ毎に指定ができる。
							例えば、%buildにおいて以下のように使う
							<screen>make CFLAGS=${RPM_OPT_FLAGS}</screen>
							デフォルトはarchitectureがi386のときには、
							<screen>RPM_OPT_FLAGS="-O2 -m486 -fno-strength-reduce"</screen>
					</para></listitem>
				</varlistentry>
				<varlistentry>
					<term>RPM_ARCH_FLAGS</term>
					<listitem><para>
							buildを行なっているシステムのアーキテクチャを表す変数。
							アーキテクチャがi386なら、
							<screen>RPM_ARCH_FLAGS="i386"</screen>
					</para></listitem>
				</varlistentry>
				<varlistentry>
					<term>RPM_OS</term>
					<listitem><para>
							buildを行なっているシステムのOSをあらわす変数。Linuxなら、
							<screen>RPM_OS="Linux"</screen>
					</para></listitem>
				</varlistentry>
				<varlistentry>
					<term>RPM_BUILD_ROOT</term>
					<listitem><para>
							BuildRootで設定された仮想インストールのためのディレクトリを表す。
							(<xref linkend="package-info" />のBuildRootの項参照)
					</para></listitem>
				</varlistentry>
				<varlistentry>
					<term>RPM_PACKAGE_NAME</term>
					<listitem><para>
							Nameで設定されたパッケージ名を表す。
							(<xref linkend="package-info" />のNameの項参照)
					</para></listitem>
				</varlistentry>
				<varlistentry>
					<term>RPM_PACKAGE_VERSION</term>
					<listitem><para>
							Versionで設定されたバージョン名を表す。
							(<xref linkend="package-info" />のVersionの項参照)
					</para></listitem>
				</varlistentry>
				<varlistentry>
					<term>RPM_PACKAGE_RELEASE</term>
					<listitem><para>
							Releaseで設定されたリリース番号を表す。
							(<xref linkend="package-info" />のReleaseの項参照)
					</para></listitem>
				</varlistentry>
			</variablelist>
		</sect1>
		<sect1 id="define-macro">

			<title>SPECファイル中のマクロ定義</title>
			<para>
				マクロは
				<screen>%define マクロの名前 内容</screen>
				のように書くことで定義できます。
			</para>
			<para>
				<screen>%{マクロの名前}</screen>
				のように書くことで利用できます。
				{} を省略して %マクロの名前 と書くこともできますが、
				{} をつけて利用したほうが、
				<xref linkend="mr-script" />に出てきた %prep や %build などといったタグと区別しやすくなります。
			</para>
			<para>
				マクロは、%setupや%installなどのスクリプト部やファイル定義部など、
				SPECファイル全体で使えるので、
				うまく使うとバージョンアップに追随してSPECファイルを書くときに楽ができます。 
			</para>
			<para>
				%define で定義せずに使えるマクロとして %{name} , %{version} , %{release} があります。
				<xref linkend="package-info" />にでてきた、Name Version Release の値が、
				それぞれ %{name} , %{version} , %{release} の内容になります。
			</para>
			<note><para>
					%define name hoge として name を定義し Name: %{name} のように利用しているSPECファイルを見かけることがありますが、
					Name の値を参照するのが %{name} なので、本来とは逆の使い方になり問題を起こす場合があるかもしれません。
					このような場合は %define pkg_name hoge , Name: %{pkg_name} のように
					%{name} とは違う名前のマクロを利用したほうがよいでしょう。
			</para></note>
			<para>
				<xref linkend="make-spec" />のSPECファイルの例のデータ定義部は、
				%{name} と %{version} というマクロを利用して、以下のように書くことができます。
				Name: hoge なので %{name} は hoge に、Version: 1.1 なので %{version} は 1.1 になります。
			</para>
<screen>
Name: hoge
Version: 1.1
Release: 1
Source: %{name}-%{version}.tar.gz
Patch: %{name}.patch
</screen>

			<para>
				SPECファイルの中(どこでもいいです)に %dump と書いておくと、
				<command>rpmbuild</command> コマンドでパッケージを作る時に、
				すべてのマクロが標準エラー出力に出力され、確認することができます。
			</para>
			<para>
				マクロの定義を取り消したいけれど、行を削除するのではなくコメントとして残しておきたいという場合には、
				%define に % をつけて、%%define にし、さらに # をつけます。

				<screen>%define hoge hige</screen> を <screen># %%define hoge hige</screen> のようにします。

				<screen># %define hoge hige</screen> ではだめです。
				# 以降はコメントになるという処理よりも、マクロの %define の方が先に処理されるので、
				%define hoge hige が解釈されてしまいます。
			</para>

		</sect1>

		<sect1 id="common-macro">

			<title>標準で定義されているマクロ</title>

			<para>
				よく利用されるコマンドやディレクトリなどにはあらかじめマクロが定義されています。
				自分で定義した変数と同様にSPECファイル全体で使えます。
			</para>
			<para>
				標準で定義されているマクロは <filename>/usr/lib/rpm/macros</filename> に書かれています。
				ユーザー毎のマクロを記述するファイルは<filename>~/.rpmmacros</filename>です。
			</para>
			<para>
				<filename>~/.rpmmacros</filename> に書く場合には
				<screen>%マクロの名前 内容</screen>
				とします。
				<xref linkend="mr-directories" />で出てきた %_topdir などもマクロです。
			</para>
			<para>
				ユーザー毎のマクロと、標準で定義されているマクロをあわせたものは、
				<command>rpm</command>コマンドの <option>--showrc</option>オプションで確認できます。
				<screen>$ <command>rpm --showrc</command></screen>
			</para>
			<para>
				また、それぞれのマクロがどんなものかは、
				<screen>$ <command>rpm --eval "%{マクロ}"</command></screen>
				のようにすると確認できます。
			</para>
			<para>
				標準で定義されているマクロについてはなるべく利用してください。
				SPECファイルのメンテナンスしやすさの向上につながります。
			</para>
			<para>
				たとえば、%{configure} や %{makeinstall} といったマクロを利用することで、
				%build や %install の部分を簡潔に書くことができる場合があります。
<screen>%build
%{configure}
%{__make}

%install
%{makeinstall}</screen>
				<screen>$ <command>rpm --eval "%{configure}"</command></screen>
				などとやってそれぞれのマクロがどんなものか確認して下さい。
			</para>

			<para>
				rpm 4.x および Vine Linux 4.1 で定義されているマクロを使うと
				<xref linkend="make-spec" />のSPECファイルは次のようになります。
			</para>
			<screen>&ex-usemacro;</screen>

		</sect1>
	</chapter>

	<chapter id="tag-dependencies-information">
		<title>依存情報の記述に関する詳細</title>

		<sect1 id="mr-requires">
			<title>Requires</title>
			<para>
				Requires には、従来の Requires: だけではなく Requires(pre): などのように
				( ) をつけて厳密に指定することもできるようになりました。
			</para>

			<para>
				( ) の中には<xref linkend="Requires-options" />にあるものが入ります。
				( ) の中に入る項目は <xref linkend="mr-script" /> のタグ等に対応しています。どの部分で必要になるかを書きます。
			</para>

			<para>
				Requires( ): のように ( ) の中に何も書かなかった場合は、Requires: として扱われます。
			</para>

			<para>
				( ) の中は、Requires(pre,preun,post,postun): のように , を用いることで複数を同時に指定できます。
			</para>

			<table id="Requires-options">
				<title>Requires の ( ) の中で利用できるもの</title>
				<tgroup cols="2">
					<thead>
						<row><entry>項目</entry><entry>対応するタグ等</entry></row>
					</thead>
					<tbody>
						<row><entry>pre</entry><entry>%pre で必要になるもの</entry></row>
						<row><entry>preun</entry><entry>%preun で必要になるもの</entry></row>
						<row><entry>post</entry><entry>%post で必要になるもの</entry></row>
						<row><entry>postun</entry><entry>%postun で必要になるもの</entry></row>
						<row><entry>prereq</entry><entry>インストール時に必要になるもの</entry></row>

						<row><entry>verify</entry><entry>%verifyscript で必要になるもの</entry></row>
						<row><entry>interp</entry><entry>スクリプト部を解釈(interpret)するために必要になるもの</entry></row>
						<row><entry>rpmlib</entry><entry>rpmのデータベース等を扱うために必要なもの</entry></row>
					</tbody>
				</tgroup>
			</table>

			<para>
				Requires(pre): などを指定した場合には、<emphasis>インストール、アンインストールされる順番が保証されます。</emphasis>
				指定されたパッケージは<emphasis>先にインストールされ、後にアンインストールされます。</emphasis>
			</para>

			<para>prereq は pre,preun,post,postun などよりも曖昧な書き方ですが、以前 PreReq で書かれていたものを Requires に機械的に置き換える場合には利用できると思います。</para>

			<para>rpmlib については、通常、build 時に自動的に追加されるものなので、特別な機能を利用するのでなければ、記述する必要はありません。</para>

			<para>interp も、自動的に追加されますが、特別な shell などを利用する場合には記述しておいた方がよいでしょう。</para>
		</sect1>

		<sect1 id="mr-provides">
			<title>Provides</title>
			<para>
				日本語化されたgsであるgs<emphasis>j</emphasis>というパッケージがあるとします。
				このパッケージはもともとのgsと同等の機能を持っています。
				インストールしたいhoge-1.1-2.rpmがgsを必要(Requires)としてるとしましょう。
				しかし、gs<emphasis>j</emphasis>がインストールされているためにgsはインストールされていません。
				このとき、hoge.rpmをインストールしようとするとrpmコマンドは
				gsが無いためにエラー・メッセージを出します。
			</para>
			<para>
				このようなトラブルをさけるためには、gs<emphasis>j</emphasis>を作るときに、
				<screen>Provides: gs</screen>
				と書いておくと、gs<emphasis>j</emphasis>はgsパッケージを提供することができます。
			</para>
			<para>
				また、あるパッケージ A がpdfを読むツールをRequiresするときに、
				xpdf と gs(pdf対応) のように複数の選択肢がある場合、
				xpdf と gs の Providesに
				<screen>Provides: pdf-reader</screen>
				と仮想的なパッケージ名(仮想パッケージ virtual package)を書いておいて、
				A で Requires: pdf-reader としておけば、パッケージ名を限定せずに、
				なんらかのpdf-readerがインストールされてることを要求できます。
				たとえば emacs lisp のパッケージでは emacs や xemacs ではなく
				emacsen という仮想パッケージを要求するものが多いです。
			</para>
		</sect1>

		<sect1 id="mr-buildreq">
			<title>BuildRequires</title>
			<para>
				コンパイラなどのパッケージや、
				ヘッダーファイルやライブラリなどを含んだ hoge-devel
				などのパッケージで不足するものがないか確認しましょう。
			</para>
			<para>
				また、Source: で指定されたファイルが hoge.zip のように zip 形式の場合は、
				ソースの展開に unzip のパッケージが、
				同様に lzh 形式なら lha のパッケージが必要になります。
			</para>
			<para>
				Vine Linux では <filename>build-essential</filename> という仮想パッケージがあり、
				このパッケージをインストールすることでたくさんのパッケージがインストールされます。
				参照 <ulink url="using-rpm-4.html#using-rpm-4-2">環境設定</ulink>
			</para>
			<para>
				パッケージの作成時には build-essential をインストールすることを前提としているので、
				build-essential に含まれている make,gzip,bzip2,tar,patch,findutils,coreutils,file,libtool,automake,autoconf などは省略してかまいません。
				gcc や gettext などは、ソースが C言語であることや、メッセージが国際化されていることなどを示す意味もあるので、必要であれば書いておいた方がいいかもしれません。
			</para>
			<para>
				<emphasis>%prep</emphasis>,<emphasis>%setup</emphasis>,<emphasis>%build</emphasis>,<emphasis>%install</emphasis> で必要になるコマンドやパッケージを指定します。
			</para>
			<para>
				Requires( ): と同じように、BuildRequires も ( ) をつけて詳細な指定をすることができます。
			</para>
			<para>
				( ) の中には<xref linkend="BuildRequires-options" />にあるものが入ります。
				( ) の中に入る項目は <xref linkend="mr-script" /> のタグ等に対応しています。どの部分で必要になるかを書きます。
			</para>
			<table id="BuildRequires-options">
				<title>BuildRequires の ( ) の中で利用できるもの</title>
				<tgroup cols="2">
					<thead>
						<row><entry>項目</entry><entry>対応するタグ等</entry></row>
					</thead>
					<tbody>
						<row><entry>prep</entry><entry>%prep,%setup で必要になるもの</entry></row>
						<row><entry>build</entry><entry>%build で必要になるもの</entry></row>
						<row><entry>install</entry><entry>%install,%check で必要になるもの</entry></row>
						<row><entry>clean</entry><entry>%clean で必要になるもの</entry></row>
					</tbody>
				</tgroup>
			</table>
		</sect1>

		<sect1 id="mr-buildprereq">
			<title>BuildPrereq</title>
			<para>
				BuildRequiresと同様にパッケージの作成の時に必要になるパッケージを書きます。
				BuildRequiresとの違いは必要とするパッケージを<emphasis>作成する順番を決める</emphasis>ということです。
			</para>
			<para>
				BuildRequiresと同様、BuildPrereq(prep) のように prep,build,install,clean を指定できます。
			</para>
			<!-- 参照 http://www.redhat.com/archives/rpm-list/2004-April/msg00164.html -->
			<para>
				A というパッケージがパッケージ作成時に B と C の二つのパッケージを必要としているとします。
				この場合 B と C をインストールすれば、A というパッケージを作成することができます。
			</para>
			<para>
				このときに B と C のパッケージがなくて、それぞれ作る必要があったとします。
				B と C がそれぞれ独立したものではなく、C のパッケージ作成時に B が必要で、
				できあがった C は B の特定のバージョンを必要とするパッケージになるということがあります。
				このような場合には BuildPrereq に B を BuildRequires に C を指定し、
				B を C よりも先に作成する必要があるということを示しておきます。
			</para>
		</sect1>
	</chapter>

	<chapter id="setup-macro">
		<title>%setupマクロの詳細</title>
		<para>
			hoge-1.1.tar.gzを展開したときに、hoge-1.1/というディレクトリができるなら、
			オプションをつけなくても以上の作業が行われますが、例えば、
			hoge/というディレクトリができるなら、このディレクトリの下にcdできるように、
			<screen>%setup -n hoge</screen>
			または、
			<screen>%setup -n ${RPM_PACKAGE_NAME}</screen>
			と指定します。
		</para>
		<para>
			複数のソースがあるときには以下に述べるオプション-aや-bを使います。
			例えばSource、Source1、Source2の3つがあるときには、 
			<screen>%setup -a 1 -a 2 -n hoge</screen>
			などとします。(以下のオプションの指定参照。)
		</para>
		<para>
			この%setupにはさまざまなオプションがありますが、
			代表的なものを以下に示します。
		</para>
		<variablelist>
			<varlistentry>
				<term>-n &lt;ディレクトリ名&gt;</term>
				<listitem><para>
						%setupを実行した後(もしくは前)にcdするディレクトリ名(name)を指定する。
						このオプションを省略したときの、デフォルトのディレクトリ名は、
						${RPM_PACKAGE_NAME}-${RPM_PACKAGE_VERSION}。
				</para></listitem>
			</varlistentry>
			<varlistentry>
				<term>-c</term>
				<listitem><para>
						指定ディレクトリ(上の-nオプションで指定したディレクトリ)
						を作成し(create)、そこにcdした後にソースの展開をします。
				</para></listitem>
			</varlistentry>
			<varlistentry>
				<term>-a &lt;#&gt;</term>
				<listitem><para>
						Source0を展開した後、
						指定ディレクトリ(上と同じ)にcdした(after)、
						#番目のソース(Source#)の展開をします。
						%setup -a 2 -a 3 と複数-aオプションが指定された時には、
						Source0 が展開された後、指定ディレクトリに cd し、
						Source2、Source3を展開します。
						(Source0の展開は最初の一回だけです。)
				</para></listitem>
			</varlistentry>
			<varlistentry>
				<term>-b &lt;#&gt;</term>
				<listitem><para>
						Source0を展開した後、
						指定ディレクトリ(上と同じ)にcdする前に(before)、
						#番目に指定されてるソース(Source#)の展開をします。
				</para></listitem>
			</varlistentry>
			<varlistentry>
				<term>-D</term>
				<listitem><para>
						先に述べたように、%setupは、まず、指定ディレクトリ(上と同じ)が、
						ディレクトリBUILDの下にあるかどうかをチェックして、もし存在していたら、
						それを削除してから、ソースの展開などの作業を行います。
						%setupを複数回呼びたい場合、
						2回目に%setupを呼んだ時に最初の%setupで展開したディレクトリを削除されては困ります。
						この-Dオプションは、このような削除を行わないようにします。(あまり使いません) 
				</para></listitem>
			</varlistentry>
			<varlistentry>
				<term>-T</term>
				<listitem><para>
						ソースの展開を行いません。先に述べたように、
						オプション指定を -a 2 や -b 2 とすると、
						Source0とSource2で指定したものが展開されます。
						Source2だけを展開したいときには、このオプションを使って、
						<screen>%setup -T -a 2</screen>
						とします。また、
						<screen>%setup -T -c hoge</screen>
						とすると、パッケージの展開は行わず、ディレクトリhogeを作って、
						そこにcdします。
				</para></listitem>
			</varlistentry>
			<varlistentry>
				<term>-q</term>
				<listitem><para>
						ソースの展開のとき、展開中の情報を表示しません。
						たとえば tar での展開の時に、-q 無しだと tar xvvf、-q 有りだと tar xf のように変わります。
				</para></listitem>
			</varlistentry>
		</variablelist>

		<para>
			次のように tar.gz ではないファイルが Source0 となる場合があります。
			<screen>Source0: hoge-%{version}.lzh</screen>
			tar.gz ではないので、%setup では展開できません。
		</para>
		<para>
			このような場合には、まず %setup の -Tオプション を利用して作業ディレクトリに移動します。
			%setup のあとには、bash script を書いて作業を行うことができるので、
			通常のコマンドで Source0 のファイルを展開します。
<screen>%setup -T hoge-%{version}
lha x %{SOURCE0}</screen>
		</para>
		<para>
			次のように tar.gz などでは無いファイルが Source2 としてあるということがあります。
<screen>Source0: hoge-%{version}.tar.gz
Source1: hoge-additional-%{version}.tar.gz
Source2: how-to-use-hoge.txt</screen>
		</para>
		<para>
			こういった場合には、Source0 と Source1 を %setup で展開したあとで、<command>installコマンド</command>などで、Source2 に対応するマクロ %{SOURCE2} を処理します。
		</para>
		<para>%setup で展開するのと同じ処理をしたければ、
<screen>%setup -q -a 1
%{__install} -m 644 %{SOURCE2} .</screen>
			のようにします。
		</para>
		<para>
			%setup で Source0 を展開してできたディレクトリ BUILD/hoge-%version/  に移動しているので、<command>installコマンド</command> で . (カレントディレクトリ<footnote><para>current directory, 現在のディレクトリ</para></footnote>) を指定すると . は BUILD/hoge-%version/ となっているので、BUILD/hoge-%version/に Source2 が install されます。
		</para>
		<para>他のファイルと同じように BUILD/hoge-%version/ にあるので %doc として指定するのもそのままできます。</para>
<screen>%files
%doc how-to-use-hoge.txt</screen>
		<para>%{SOURCE2} といったマクロは %doc のところでは使えないので、%doc %{SOURCE2} とすることはできません。</para>

		<para>
			lha や unzip など、特別なコマンドが必要になる場合は、
			BuildRequires(prep): で指定します。
		</para>
	</chapter>

	<chapter id="other-section">
		<title>スクリプト部で使用できるその他のセクション</title>
		<para>スクリプト部に入れることができるセクションは、<xref linkend="mr-script" />で説明したほかにもいろいろあります。</para>
		<!--以下のセクションはそれぞれインストール時やアンインストール時に起動するシェルスクリプトを記述するためのものです。-->
		<table id="pre-and-post">
			<title>インストール時やアンインストール時に起動するセクション</title>
			<tgroup cols="3">
				<thead><row><entry>セクション名</entry><entry>概要</entry><entry>詳細説明</entry></row></thead>
				<tbody>
					<row>
						<entry>%pre</entry>
						<entry>RPMパッケージをインストールするときパッケージの展開前に行うことを書く</entry>
						<entry><xref linkend="pre-section" /></entry>
					</row>
					<row>
						<entry>%post</entry>
						<entry>RPMパッケージをインストールするときパッケージの展開後に行うことを書く</entry>
						<entry><xref linkend="post-section" /></entry>
					</row>
					<row>
						<entry>%preun</entry>
						<entry>RPMパッケージをアンインストールするとき展開ファイルの削除前に行うことを書く</entry>
						<entry><xref linkend="preun-section" /></entry>
					</row>
					<row>
						<entry>%postun</entry>
						<entry>RPMパッケージをアンインストールするとき各ファイルを削除した後に行うことを書く</entry>
						<entry><xref linkend="postun-section" /></entry>
					</row>
				</tbody>
			</tgroup>
		</table>
		<para>さらに、他のパッケージがインストールされた時に起動するスクリプトも記述できます。</para>
		<table id="triggers">
			<title>他のパッケージがインストールされた時に起動するセクション</title>
			<tgroup cols="3">
				<thead><row><entry>セクション名</entry><entry>概要</entry><entry>詳細説明</entry></row></thead>
				<tbody>
					<row>
						<entry>%triggerin</entry>
						<entry>あるパッケージがインストールされていた、もしくは、された時に起動するスクリプト</entry>
						<entry><xref linkend="triggerin-section" /></entry>
					</row>
					<row>
						<entry>%triggerun</entry>
						<entry>あるパッケージの削除前に起動するスクリプト</entry>
						<entry><xref linkend="triggerin-section" />参照</entry>
					</row>
					<row>
						<entry>%triggerpostun</entry>
						<entry>あるパッケージの削除後に起動するスクリプト</entry>
						<entry><xref linkend="triggerin-section" />参照</entry>
					</row>
				</tbody>
			</tgroup>
		</table>
		<para>パッケージが正しくインストールされているかを検証するには、rpm コマンドで -V オプションを用いますが、-V オプションでできることを増やすためのセクションもあります。</para>
		<table id="verifyscript-table">
			<title>パッケージの検証時に起動するセクション</title>
			<tgroup cols="3">
				<thead><row><entry>セクション名</entry><entry>概要</entry><entry>詳細説明</entry></row></thead>
				<tbody>
					<row>
						<entry>%verifyscript</entry>
						<entry>RPMパッケージを検証するとき(rpm -Vを実行した時)に追加して起動するスクリプト</entry>
						<entry><xref linkend="verifyscript-section" /></entry>
					</row>
				</tbody>
			</tgroup>
		</table>
		<para>この章で説明するセクションは、SPECファイルからRPMパッケージを作るときには、実行されることはありません。</para>
		<para>
			<emphasis>%pre %post %preun %postun %triggerin %triggerun %triggerpostun といったセクションを使うのは、ちょっと注意が必要です。</emphasis>
			詳しくは、<xref linkend="mr-important" />を参照してください。
		</para>
		<sect1 id="pre-section">
			<title>%preセクション</title>
			<para>
				RPMパッケージをインストールするとき、パッケージの展開前に行うことを書く。
				-pオプションについては%postの場合（以下）参照。
			</para>
			<para>ここでの処理で必要となるパッケージ等は、Requires(pre): で指定します。</para>
		</sect1>

		<sect1 id="post-section">
			<title>%postセクション</title>
			<para>RPMパッケージをインストールするとき、パッケージの展開後に行うことを書く。</para>
			<para>ここでの処理で必要となるパッケージ等は、Requires(post): で指定します。</para>
			<example>
				<title>%postセクションを利用してinfoファイルをインストールする例</title>
				<para>
<screen>%post
if [ "$1" = 0 ] ; then
%{_syssbindir}/install-info %{_infodir}/hoge.info.gz %{_infodir}/dir
fi</screen>
					として、info のメニューエントリに infoファイルを追加します。
					if [ $1 = 0 ]; then と fi の行は、
					アップグレード時には実行せず、インストール時だけに実行させるための記述です。
					<xref linkend="mr-symlink" />も参照してください。
				</para>
				<para>
					%{_syssbindir}/install-info というコマンドが必要になるので、
					Requires(post): %{_syssbindir}/install-info とします。
				</para>
				<para>
					info ファイルは、アンインストール時にも処理が必要になります。
					<xref linkend="preun-section" /> も参照してください。
				</para>
			</example>

			<example>
				<title>ライブラリをインストールする後にldconfigを実行する例</title>
				<para>
<screen>
%post
%{_syssbindir}/ldconfig
</screen>
					とすると、ldconfigが実行される。また、代わりに
					<screen>%post -p %{_syssbindir}/ldconfig</screen>
					と、-pオプションを用いて書くと、
					シェルを起動すること無く直接コマンドが実行される。
					またこのコマンドはrpmパッケージのインストール時に必要なコマンドとして、
					Requires(interp): %{_syssbindir}/install-info として登録される。
				</para>

				<para>
					正確にいうと、タグに <option>-p</option>オプションをつけた場合は、
					/bin/sh	ではなく別のプログラムでスクリプト部分を解釈(interpret)させるということになります。
					この場合には Requires(interp) として登録されます。(%postなので Requires(post) としても登録されます。)
				</para>
			</example>
			<example>
				<title>%postセクションで-pオプションを使用して問題が起こる例</title>
				<para>
<screen>
%post -p %{_syssbindir}/ldconfig
# update ld.so.cache

%files</screen>
					この場合は %post と %files の間の2行が、スクリプト部分になります。
					一行目に
					<screen># update ld.so.cache</screen>
					と書いてあります。
					bash であれば、# で始まる行は コメントと解釈され無視されますが、
					このスクリプト部分を読み、実行するのは /bin/sh ではなく %{_syssbindir}/ldconfig です。
					ldconfig には # 以降をコメントとして無視するというルールは無いので、
					そのまま実行しようとしてエラーになります。
				</para>
				<para>
					エラーを起こさないようにするには
<screen>
%post -p %{_syssbindir}/ldconfig


%files</screen>
					とするか、
<screen>
%post
%{_syssbindir}/ldconfig
# update ld.so.cache

%files</screen>
					とします。
				</para>

				<para>
					一つ目の例では、%{_syssbindir}/ldconfig がスクリプト部分を実行するために起動し(、起動した時点で ld.so.cache が更新されますが)、スクリプト部分については何も書かれていないので何もせずに終了します。
				</para>
				<para>
					二つ目の例では、/bin/sh が起動し、スクリプト部分を解釈し %{_syssbindir}/ldconfig を実行、# 以下はコメントなので無視します。
				</para>
			</example>
		</sect1>

		<sect1 id="preun-section">
			<title>%preunセクション</title>
			<para>RPMパッケージをアンインストールするとき、展開ファイルの削除前に行うことを書く。</para>
			<para>ここでの処理で必要となるパッケージ等は、Requires(preun): で指定します。</para>
			<para>-pオプションについては%postの場合と同様です。Requires(interp): と Requires(preun): に登録されます。</para>
			<example>
				<title>%preunセクションを利用してinfoファイルをアンインストールする例</title>
				<para>
<screen>
%preun
if [ $1 = 0 ]; then
%{_syssbindir}/install-info --delete %{_infodir}/hoge.info.gz %{_infodir}/dir
fi
</screen>
					として、info のメニューエントリから削除します。
					if [ $1 = 0 ]; then と fi の行は、
					アップグレード時には実行せず、アンインストール時だけに実行させるための記述です。
					<xref linkend="mr-symlink" />も参照してください。
				</para>
			</example>
		</sect1>
		<sect1 id="postun-section">
			<title>%postunセクション</title>
			<para>RPMパッケージをアンインストールするとき、各ファイルを削除した後に行うことを書く。</para>
			<para>ここでの処理で必要となるパッケージ等は、Requires(postun): で指定します。</para>
			<para>-pオプションについては%postの場合と同様です。Requires(interp): と Requires(postun): に登録されます。</para>
		</sect1>

		<sect1 id="triggerin-section">
			<title>%triggerinセクション</title>
			<para>あるパッケージがインストールされていた、もしくは、された時に起動するスクリプトを書く。</para>
			<example>
				<title>%triggerinセクションの使用例</title>
				<para>
<screen>
%triggerin -- hoge
echo "hoge is installed"
</screen>
					と書いておくと、パッケージhogeをインストールしたときに、
					上記メッセージが表示されます。以下のように、バージョン指定もできます。
<screen>
%triggerin -- hoge &gt; 3.0
echo "hoge is installed"
</screen>
				</para>
			</example>
			<para>
				同様にして、あるパッケージの削除前に実行される%triggerun、
				あるパッケージの削除後に実行される%triggerpostunがあります。このセクションについては、
				<filename>/usr/share/doc/rpm-&lt;version&gt;/triggers</filename> に詳しい説明があります。
			</para>
		</sect1>

		<sect1 id="verifyscript-section">
			<title>%verifyscriptセクション</title>
			<para>RPMパッケージを検証するとき(rpm -Vを実行した時)に、追加して実行することを書く。</para>
			<para>ここでの処理で必要となるパッケージ等は、Requires(verify): で指定します。</para>
			<para>-pオプションについては%postの場合と同様です。Requires(interp): と Requires(verify): に登録されます。</para>
			<para>このスクリプトの実行結果は、成功した場合には何も表示されず、エラーが発生したときにエラーメッセージのみが標準出力に出力されます。rpm -Vvv などのようにした場合には、標準出力への出力も確認できます。</para>

			<para>
				たとえば、%pre で %{_sbindir}/useradd hoge などとしてユーザーを登録した場合には、
<screen>%verifyscript
%{_bindir}/id hoge</screen>
				としておくと、hoge というユーザーが存在しているかどうかを確認することができます。
			</para>
			<para>
				この場合、/usr/bin/id というコマンドは coreutils というパッケージに含まれているので、
				Requires(verify): %{_bindir}/id あるいは、Requires(verify): coreutils とします。
			</para>
		</sect1>
	</chapter>

	<chapter id="mr-subpkg">
		<title>サブパッケージの作成方法</title>
		<para>インストールされるファイル全体の容量が大きくなる場合、アプリケーションの実行時に必要なファイルのみを本体に収録し、他のファイルをサブパッケージ化することがあります。</para>
		<para>たとえば、muleのRPMパッケージをつくるときに、本体のRPMパッケージがelcを含んでいれば、
			そのソースであるelファイルはなくてもmuleの実行には問題ないですから、
			mule.rpm と mule-el.rpm みたいにわけたほうがよいかもしれません。</para>
		<para>また、ライブラリや開発用ヘッダファイルもソースに含まれるアプリケーションをパッケージ化する時は、
			アプリ本体の hoge.rpm と、開発者用に hoge.h を入れたhoge-devel.rpmにわけたいこともあるでしょう。
			ドキュメントが大きいと、hoge-docs.rpmも別に作りたいこともあるでしょう。
		</para>
		<para>
			こういうときには、ちょっとSPECファイルを変更するだけで、
			サブパッケージの作成をすることができます。 具体的には、
			サブパッケージ(ここでは、hogeのサブパッケージhoge-docsとする)のための、
			データ定義部(%package docsではじまり、GroupやSummary、%description docsなどを書く部分)と、
			そのサブパッケージにいれるファイルを列挙した%files docs から始まるファイルリストを付け加えます。
			具体例は、RPM-BUILD-HOWTOにもありますので、興味のある人はそちらを参照してください。 
		</para>
		<para><xref linkend="subpkg-name" />には、よく使われるサブパッケージ名を記載しています。サブパッケージ作成時の参考としてください。</para>
		<table id="subpkg-name">
			<title>一般的なサブパッケージ名</title>
			<tgroup cols="2">
				<thead><row><entry>サブパッケージ名</entry><entry>収録内容</entry></row></thead>
				<tbody>
					<row>
						<entry>devel</entry>
						<entry>メインパッケージのライブラリを使うプログラムをコンパイルする際に必要なヘッダファイル (*.h)</entry>
					</row>
					<row>
						<entry>libs</entry>
						<entry>ランタイムライブラリ *.so.*。本体パッケージのサイズがある程度大きくなった場合などの理由がある場合、本体にはバイナリや設定ファイルを、ライブラリを -libs サブパッケージに分けて収録することがあります。</entry>
					</row>
					<row>
						<entry>static</entry>
						<entry>static ライブラリ (*.a)。明確な理由により static ライブラリを必要とする場合にサブパッケージ化する。それ以外の場合は、パッケージ対象から除外してください。</entry>
					</row>
					<row>
						<entry>tools, utils</entry>
						<entry>本体のパッケージが主にライブラリを収録している場合、ツールなどのバイナリやスクリプト群をサブパッケージ化する場合があります</entry>
					</row>
					<row>
						<entry>doc, docs</entry>
						<entry>付属ドキュメント類などを独立したサブパッケージに分けたもの</entry>
					</row>
					<row>
						<entry>demos, example</entry>
						<entry>サンプルスクリプトやサンプルコード類をサブパッケージに分けたもの</entry>
					</row>
				</tbody>
			</tgroup>
		</table>
		<!-- ここにtracからサブパッケージ化のルールをもってくる -->
	</chapter>

	<chapter id="mr-specific">
		<title>パッケージ固有の作法等について</title>

		<sect1 id="add_to_gnome_menu">
			<title>GNOME,KDE,Xfce のメニューに追加するために</title>

			<para>GNOME,KDE,Xfce のメニューに追加するためには、ディレクトリ<filename>/usr/share/applications</filename>に <filename>アプリケーションの名前.desktop</filename> というファイル(以降 desktopファイルと呼びます)をインストールする必要があります。</para>

			<para>desktopファイルを取り扱う <command>desktop-file-install</command>コマンド、<command>desktop-file-validate</command>コマンド、<command>update-desktop-database</command>コマンドは、<filename>desktop-file-utils</filename>というパッケージに含まれています。</para>

			<para>desktopファイルの扱いは次のような手順になります。</para>
			<itemizedlist>
				<listitem><para>
						%installタグの部分で次のようにして desktopファイルを<filename>%{buildroot}/%{_datadir}/applications</filename>にインストールしておきます。

<screen>
%install
%{__mkdir_p} %{buildroot}/%{_datadir}/applications
%{_bindir}/desktop-file-install --dir=%{buildroot}/%{_datadir}/applications <filename>hoge.desktop</filename>
</screen>

				</para></listitem>
				<listitem><para>%checkタグの部分で次のようにして desktopファイルが書式にしたがって正しく書かれているかをチェックします。</para>
<screen>
%check
%{_bindir}/desktop-file-validate %{buildroot}/%{_datadir}/applications/hoge.desktop
</screen>

					<para>ソースから make する、make install するなどの部分ではこのチェックが行われないことも多いので、%checkタグの部分でチェックを行うようにしておきます。</para>
					<para><command>desktop-file-validate</command>コマンドは複数のファイルをまとめて処理できないので、*.desktop のようにはできません。desktopファイルの数だけ、コマンドを書いてください。もちろん、for文などを使ってもかまいません。
				</para></listitem>
				<listitem><para>
						%postタグや%postunタグの部分で
<screen>
%post
if [ -x %{_bindir}/update-desktop-database ] ; then
%{_bindir}/update-desktop-database %{_datadir}/applications
fi

%postun
if [ -x %{_bindir}/update-desktop-database ] ; then
%{_bindir}/update-desktop-database %{_datadir}/applications
fi
</screen>
						のように処理します。
						<command>update-desktop-database</command> コマンドがインストールされていなければ実行しない、という形にすることで、twm や icewm や WindowMaker など、GNOME等のメニューとは直接関係ないウィンドウマネージャを使用しているときに、deskto-file-utils に依存せずにすむようになります。
				</para></listitem>
				<listitem><para>
						他のファイルと同じように %filesの部分に入れておきます。
<screen>%files
%{_datadir}/applications/<filename>hoge.desktop</filename></screen>
				</para></listitem>
				<listitem><para>
						BuildRequires で desktop-file-utils を指定します。
						<screen>BuildRequires(install,check): <filename>desktop-file-utils</filename></screen>
				</para></listitem>
			</itemizedlist>
		</sect1>

		<sect1 id="emacs_lisp_package">
			<title>Emacs Lisp のパッケージ</title>

			<para>Emacsen には emacsen-common というパッケージがあり、
				インストールされている Emacsen の FLAVOR の情報や、
				FLAVOR ごとに、その FLAVOR で byte compile された Emacs Lisp パッケージのリストを管理するという仕組みがあります。</para>
			<para>この仕組みを用いることで以下のようなことが可能となっています。</para>
			<itemizedlist>
				<listitem><para>
						パッケージのインストール時に、すでにインストールされている Emacsen の FLAVOR ごとにそれぞれ byte compile して elc ファイルを作成する。</para></listitem>
				<listitem><para>
						パッケージのアンインストール時に、すべての FLAVOR からパッケージの elc ファイルを削除する。</para></listitem>
				<listitem><para>
						Emacsen の FLAVOR のインストール時、アンインストール時に、その FLAVOR で byte compile する、FLAVOR で byte compile した elc を削除する。</para></listitem>
			</itemizedlist>
			<para>この仕組みを利用するために、Emacs Lisp のパッケージでは以下のようなことをしておきます。</para>
			<itemizedlist>
				<listitem><para>
						%installタグの部分では byte compile していない el ファイルを
						%{_datadir}/emacs/site-lisp/%{name} 以下にインストールします。</para></listitem>
				<listitem><para>
						Source2 や Source3 などに byte-compile と install を行うためのスクリプトAと、
						byte-compile してできた elc ファイルを削除するためのスクリプトBを用意します。
						インストールに使える Makefile 等がある場合は %installタグの部分で
						%{_datadir}/emacs/site-lisp/%{name} 以下に Makefile 等をインストールしておき、
						スクリプトの中から利用できるようにします。</para></listitem>
				<listitem><para>
						install 用のスクリプトAでは、
						Emacsen の FLAVOR に応じて %{_datadir}/FLAVOR/site-list/%{name}/ 以下に
						bytecompile した elc ファイルをインストールするようにします。</para></listitem>
				<listitem><para>
						uninstall 用のスクリプトBでは、
						Emacsen の FLAVOR に応じてスクリプトAでインストールした elc ファイルを削除するようにしておきます。</para></listitem>
				<listitem><para>
						%installタグの部分で次のようにして、スクリプトAとスクリプトBをインストールします。
<screen>
%_installemacsenscript %{name} %{SOURCE2}

%_removeemacsenscript  %{name} %{SOURCE3}

</screen>
						スクリプトA,B はそれぞれ /usr/lib/emacsen-common/packages/install/ , /usr/lib/emacsen-common/packages/remove/ に、
						%{name} という名前でインストールされます。
						これによって、スクリプトA,B は、Emacs の FLAVOR がインストール、アンインストールされた時に実行されるようになります。</para>
					<para>%files の部分でそれぞれのスクリプトを記述しておきます。</para>
<screen>%{_libdir}/emacsen-common/packages/install/%{name}
%{_libdir}/emacsen-common/packages/remove/%{name}</screen></listitem>
				<listitem><para>
						%postタグの部分は次のように記述しておきます。
						if [ "$1" = 数字 ]; then ; fi は、インストール時、アップグレード時、アンインストール時、それぞれで違う動作をさせるためのものです。<xref linkend="mr-important" />を参照してください。
<screen>
%post
#
# bytecompile and install
#

if [ "$1" = 2 ]; then
%_emacsenPackageRemove %{name}

fi

%_addemacsenlist %{name}

%_emacsenPackageInstall %{name}

%preun

if [ "$1" = 0 ]; then
%_emacsenPackageRemove %{name}

%_removeemacsenlist %{name}

fi
</screen>
					</para>
					<para>%_emacsenPackageInstall と %_emacsenPackageRemove は スクリプトA,B を実行するためのマクロです。</para>
					<para>%_addemacsenlist と %_removeemacsenlist は、インストール済み Emacs Lisp パッケージのリストにパッケージを登録する、削除するというマクロです。</para>
					<para>
						%_installemacsenscript, %_removeemacsenscript, %_emacsenPackageRemove, %_addemacsenlist, 
						%_removeemacsenlist の行の次の行は、空行にしておかないとエラーとなるようです。</para></listitem>
			</itemizedlist>
		</sect1>


		<sect1 id="add_to_alternatives">
			<title>alternatives を利用するパッケージ</title>

			<para>alternatives については <ulink url="update-alternatives.html">update-alternatives による標準コマンドの切り替え</ulink> にまとめられています。</para>

			<para>
				alternatives に登録する場合には %post と %preun で次のようにします。
<screen>%post
if [ "$1" = "1" ]; then
%{_syssbindir}/update-alternatives --install リンク名 総称名 選択候補 優先度
fi

%preun
if [ "$1" = "0" ]; then
%{_syssbindir}/update-alternatives --remove 総称名 選択候補
fi</screen>
			</para>
			<para>Provides と Requires を指定します。
<screen>Provides: 総称名 リンク名
Requires: update-alternatives
Requires(post,preun): %{_syssbindir}/update-alternatives</screen>
				とします。
			</para>

			<para>
				Provides の リンク名 については、無くても問題はありませんが、%files には書かれないファイルなので、Provides に書いておいたほうがよいと思います。
			</para>

			<para>
				%post での登録と %preun での削除は、インストール時とアンインストール時だけに必要で、アップグレード時に実行してしまうと問題があるので、"$1" が 1 の場合(インストール時)と 0 の場合(アンインストール時)だけ処理するように if 文 にしておきます。
			</para>

			<para>
				%post での処理を、パッケージのアップグレード時にも行ってしまうと、パッケージのインストール後にユーザが優先度を変更していた場合、それを無視してパッケージ側で優先度を勝手に変更してしまうことになります。
			</para>

			<para>
				新規パッケージではなく、既存のパッケージの %post,%preun に update-alternatives の処理を追加する場合には、次のようにするとよいかもしれません。
<screen>%post
if [ "$1" = "1" ]; then
if [ "`%{_sysbindir/update-alternatives --list '総称名' | grep -c 'リンク名'`" = "0" ]; then
%{_syssbindir}/update-alternatives --install リンク名 総称名 選択候補 優先度
fi
fi

%preun
if [ "$1" = "0" ]; then
%{_syssbindir}/update-alternatives --remove 総称名 選択候補
fi</screen>
			</para>

			<para>
				%triggerin と %triggerpreun と %preun を用いることで、他のパッケージが持っているファイルを alternatives で登録するようなパッケージを作ることもできます。

<screen>Provides: 総称名 リンク名
Requires: update-alternatives
Requires(preun,triggerin,triggerpreun): %{_syssbindir}/update-alternatives

%preun
if [ "$1" = "0" ]; then
%{_syssbindir}/update-alternatives --remove-all 総称名
fi

%triggerin -- 対象となるパッケージ
if [ "$1" = "1" ]; then
echo triggerin scriptlet by %{name} start
%{_syssbindir}/update-alternatives --install リンク名 総称名 選択候補 優先度
echo triggerin scriptlet by %{name} end
fi

%triggerpreun -- 対象となるパッケージ
if [ "$1" = "0" ]; then
echo triggerpreun scriptlet by %{name} start
%{_syssbindir}/update-alternatives --remove 総称名 選択候補
echo triggerin scriptlet by %{name} end
fi</screen>
			</para>
		</sect1>

		<sect1 id="use-gconf2">
			<title>GConf2を利用するパッケージ</title>
			<para>GConf2を設定の保存に利用しているアプリケーションの場合、通常、<command>make install</command>の途中でデフォルトの設定値が記述されたファイルをGConf2に登録しようとします。</para>
			<para>しかし、このタイミングでGConf2への登録を行うとRPMパッケージ化の際にエラーを吐きますし、RPMパッケージをインストールしてもGConf2には何も登録されません。</para>
			<para>この様なアプリケーションをパッケージ化する場合は、以下のようにSPECファイルを記述してGConf2への登録のタイミングを制御する必要があります。</para>
			<itemizedlist>
				<listitem>
					<para>%installセクションのmake installの前後を以下のように記述します。</para>
<screen>
export GCONF_DISABLE_MAKEFILE_SCHEMA_INSTALL=1
make install
unset GCONF_DISABLE_MAKEFILE_SCHEMA_INSTALL
</screen>
					<para>これでmake install時にGConf2への登録が省略されます。</para>
				</listitem>
				<listitem>
					<para>%postセクションに以下の記述を追加します。</para>
<screen>
export GCONF_CONFIG_SOURCE=`gconftool-2 --get-default-source`
gconftool-2 --makefile-install-rule %{_sysconfdir}/gconf/schemas/<replaceable>package</replaceable>.schemas > /dev/null
</screen>
					<para><replaceable>package</replaceable>の部分は、適切な名前(ワイルドカード使用可)に置き換えてください。</para>
				</listitem>
				<listitem>
					<para><emphasis>%preun</emphasis>セクションに以下の記述を追加します。</para>
<screen>
if [ $1 = 0 ]; then
	export GCONF_CONFIG_SOURCE=`gconftool-2 --get-default-source`
	gconftool-2 --makefile-uninstall-rule %{_sysconfdir}/gconf/schemas/<replaceable>package</replaceable>.schemas > /dev/null
fi
</screen>
					<para>これは、削除される前の .schemas ファイルを利用しますので%postunセクションでは駄目です。</para>
				</listitem>
			</itemizedlist>
		</sect1>

		<sect1 id="library-package">
			<title>ライブラリのパッケージングポリシー</title>
			<sect2>
				<title>staticライブラリを収録しない</title>
				<para>Vine Linuxでは従来、staticライブラリ(*.a)を-develサブパッケージに収録していました。しかし、以下の理由から今後は原則としてstaticライブラリをパッケージに収録しないこととします。</para>
				<itemizedlist>
					<listitem><para>あるライブラリにバグ、セキュリティホールなどが発見された場合にそれをリンクしているパッケージを追跡することが難しい</para></listitem>
					<listitem><para>staticリンクした場合、ライブラリの問題でアプリケーション全体の再ビルドが必要となる</para></listitem>
				</itemizedlist>
				<para>ただし、明確な理由によりstaticライブラリを必要とする場合は、メインパッケージや -devel サブパッケージに収録するのではなく、-static サブパッケージを作成して収録してください。</para>
			</sect2>
			<sect2>
				<title>libtoolライブラリを収録しない</title>
				<para>従来、一部のパッケージで Libtool で使われる .la ファイル (ライブラリアーカイブ、擬似ライブラリ)がパッケージに収録されていました。しかし、以下の理由から今後は原則としてパッケージには収録しないこととします。 </para>
				<itemizedlist>
					<listitem><para>Linux などの場合では .la ファイルを使わずとも .so に情報が内包されているため、.la ファイルは必要ではない</para></listitem>
					<listitem><para>間違った情報がはいっていることもあり、それが原因で問題がおこる場合がある</para></listitem>
					<listitem><para>.la があったりなかったりという状態が混在すると、ライブラリを見つけられない場合が発生する</para></listitem>
				</itemizedlist>
			</sect2>
		</sect1>
	</chapter>
</part>

<appendix id="mr-important">
	<title>RPMパッケージをつくるときの注意</title>
	<sect1 id="mr-symlink">
		<title>シンボリック・リンク等を%postとかで張らない</title>
		<subtitle>間違えてもそれ(%postではったリンクなど)を%preunや%postunで削除してはいけない</subtitle>
		<para>
			シンボリック・リンクを含む全てのファイルを%installまででインストールして、
			%filesに加えるべきである。
		</para>
		<para>
			これは特に重要です。よく、%post で、シンボリック・リンクをはって、
			%preun でそのリンクを削除するようなSPECファイルがあります。
			これを行うと、アップデート時に問題が生じることがあります。以前、
			libcのパッケージでこういう記述が入ってるものがあって、
			深刻な問題が生じたこともありました。
		</para>

		<para>
			その理由は、rpm -U &lt;new-rpm&gt; としたときに、
<screen>
rpm -e &lt;old-rpm&gt;
rpm -i &lt;new-rpm&gt;
</screen>
		ではなく、
<screen>
rpm -i &lt;new-rpm&gt;
rpm -e &lt;old-rpm&gt;
</screen>
			とはたらくためです。
		</para>
		<para>
			つまり、%post で、シンボリック・リンクをはって、
			%preun でそれを削除するような rpm のバージョンアップをしようと、
			rpm -U （アップデート）を実行すると
			<orderedlist>
				<listitem><para>
						新しいパッケージのインストールが行なわれ、
						%postでシンボリック・リンクがつくられる。
				</para></listitem>
				<listitem><para>
						古いパッケージのアンインストールが行なわれる。
						このとき、%preunでさっき新しいパッケージが作ったシンボリック・
						リンクが削除される。
				</para></listitem>
			</orderedlist>
			この仕様は、libcとかのアップグレードの途中でlibcとかがなくなってトラブルが生じるのを避けようとしたためのものと思われます。
		</para>
		<para>
			実はこの問題は解決法があります。
			%pre, %post, %preun, %postunのスクリプト実行時には、スクリプトに対して以下の引数が与えられます。
		</para>
		<itemizedlist>
			<listitem>
				<para>rpm -iでインストールを行うとき</para>
				<para>%pre, %postに対して$1=1</para>
			</listitem>
			<listitem>
				<para>rpm -Uでアップデートを行うとき</para>
				<itemizedlist>
					<listitem><para>
							新しいrpmのインストール時に、
							%pre, %postに対して$1=2
					</para></listitem>
					<listitem><para>
							古いrpmをアンインストール時に、
							%preun, %postunに対して$1=1
					</para></listitem>
				</itemizedlist>
			</listitem>
			<listitem>
				<para>rpm -eでアンインストールを行うとき</para>
				<para>%preun, %postunに対して$1=0</para>
			</listitem>
		</itemizedlist>
		<para>
			すなわち、はじめてインストールするときには、引数として1がわたされ、
			rpm -eでアンインストールするときには0がわたされるわけです。
			これを利用すると、
<screen>
%post
if [ $1 = 1]; then
	echo ``First installation!''
fi
%preun
if [ $1 = 0]; then
	echo ``Good bye!''
fi
</screen>
			とかできるわけです。
			（それでも%postなどでシンボリック・リンクをはったりすると、
			出どころ不明のファイルが増えることになります。その他トラブルをさけるため、
			できるだけファイルは%filesに加えるようにし、
			%postなどに書くスクリプトはできるだけ少なくしましょう)
		</para>
	</sect1>
	<sect1 id="minimum-epoch">
		<title>むやみに Epoch を使わない。</title>
		<para>Epoch については説明しませんが、
			パッケージのバージョン管理に混乱を引き起こす場合があるので、
			絶対に必要という場合以外は利用しないでください。
			なお、Serial は rpm 4.4 で obsolete となっています。
		</para>
	</sect1>
	<sect1 id="minimum-subpkgs">
		<title>あまり細かくサブパッケージに分けない</title>
		<para>
			サブパッケージの作り方を覚えると、やたら沢山のサブパッケージをつくる人がいるが、
			アップグレード時のメンテ(rpm -UやSPECの書き直し)が面倒になるばかりか、
			どれがなんだか分からなくなったりする。分割は必要最小限に。
		</para>
	</sect1>
	<sect1 id="minimum-config">
		<title>%configは乱用しない</title>
		<para>
			%configを多くすると、%filesが非常にわかりづらくなることがあり、
			version up等の時にこの部分のメンテに労力がかかるようになりよくない。
			デフォルトのままで出来るだけ多くの人が利用できるようなconfigファイルを用意し、
			ユーザの%configの設定は必要最小限ですむように心掛けると、
			多くの人が利用しやすいものができ、多くの場合に%fileの記述もすっきりする。
		</para>
	</sect1>
	<sect1 id="minimum-patch">
		<title>patchを使いすぎない</title>
		<para>
			configファイルの設定やMakefileなどを変えたりするために頑張ってpatchをいろいろつくるよりも、
			別にファイルを用意してSourceに加えておき、%installあたりで
			<screen>%{__cp} ${RPM_SOURCE_DIR}/hoge.conf .</screen>
			とかしてしまったほうが、すっきりすることが多い。srpmをばらしても、
			そのファイルがすぐ出てきてわかりやすく、
			アップデートのためにSPEC修正するときも楽だったりする。
		</para>
	</sect1>
	<sect1 id="mr-usecomment">
		<title>SPECファイルは第三者にもわかりやすくする</title>
		<para>
			SPECファイルはソースのアップデートに対応して修正をしたり、
			第三者が見て必要に応じて書き直したりすることがある。
			凝っていろいろな設定をしたりする複雑なものを書くより、
			ポータビリティを重視して簡潔に書いた方が後のメンテのためには吉。また、
			違った環境でbuildができなくなるようなことが無いよう、
			SPECファイル中のスクリプトで、特殊なコマンドを呼ぶようなことは避け、
			一般的なコマンド使用にとどめるべき。
		</para>
	</sect1>
</appendix>


<appendix id="group-list">
	<title>Vine Linux で使用できるGroup一覧</title>
	<table>
		<title>Vine Linux で使用できるGroup一覧</title>
		<tgroup cols="3">
			<thead><row><entry>Group</entry><entry>説明</entry><entry>例</entry></row></thead>
			<tbody>
				<row>
					<entry>Applications/Accessories</entry>
					<entry>ちょっとした小物や単機能のシンプルなアプリケーション</entry>
					<entry>電卓、辞書</entry>
				</row>
				<row>
					<entry>Applications/Administration</entry>
					<entry>システムやデスクトップの設定、管理の為のアプリケーション(動作に root 権限が必要)</entry>
					<entry>synaptic、gnome-system-tools</entry>
				</row>
				<row>
					<entry>Applications/Archiving</entry>
					<entry>ファイルの圧縮や解凍、書庫(アーカイブ)の作成に使用するアプリケーション</entry>
					<entry>bzip2, cpio, file-roller</entry>
				</row>
				<row>
					<entry>Applications/Development</entry>
					<entry>アプリケーションの開発に使用するアプリケーション</entry>
					<entry>xxgdb、IDE</entry>
				</row>
				<row>
					<entry>Applications/Documentation</entry>
					<entry>ドキュメントのみのパッケージ</entry>
					<entry>Vine-manual、JF</entry>
				</row>
				<row>
					<entry>Applications/Editors</entry>
					<entry>テキストエディタ</entry>
					<entry>GEdit、Emacs、Vi</entry>
				</row>
				<row>
					<entry>Applications/Editors/Emacs</entry>
					<entry>Emacs 及び Emacs 用のアプリケーション</entry>
					<entry></entry>
				</row>
				<row>
					<entry>Applications/Edutainment</entry>
					<entry>教育あるいは科学に関連したアプリケーション</entry>
					<entry>gnuplot、dia</entry>
				</row>
				<row>
					<entry>Applications/Games</entry>
					<entry>ゲーム</entry>
					<entry></entry>
				</row>
				<row>
					<entry>Applications/Graphics</entry>
					<entry>画像を扱うアプリケーション</entry>
					<entry>GIMP、Inkscape</entry>
				</row>
				<row>
					<entry>Applications/Internet</entry>
					<entry>インターネットを利用するアプリケーション</entry>
					<entry>firefox、Sylpheed、gFTP</entry>
				</row>
				<row>
					<entry>Applications/Multimedia</entry>
					<entry>動画や音楽を扱うアプリケーション</entry>
					<entry>Totem、BMP 、XMMS</entry>
				</row>
				<row>
					<entry>Applications/Other</entry>
					<entry>Applications の他のどの Group にも割り当てられないもの</entry>
					<entry></entry>
				</row>
				<row>
					<entry>Applications/Productivity</entry>
					<entry>ワープロや表計算、PIM等のアプリケーション</entry>
					<entry>abiword、Gnumeric</entry>
				</row>
				<row>
					<entry>Applications/Publishing</entry>
					<entry>印刷やフォントに関連したアプリケーション</entry>
					<entry>ghostscript, tetex</entry>
				</row>
				<row>
					<entry>Applications/Services</entry>
					<entry>ウェブサーバーやメールサーバー及び各種デーモン(Daemon)</entry>
					<entry>Apache、Postfix</entry>
				</row>
				<row>
					<entry>Applications/System</entry>
					<entry>システムを設定したり監視したりするアプリケーション(ユーザー権限で動作可能)</entry>
					<entry>gnome-system-monitor、mtools</entry>
				</row>
				<row>
					<entry>Applications/Text</entry>
					<entry>テキストの処理に使用するアプリケーション</entry>
					<entry>less, nkf, namazu</entry>
				</row>
				<row>
					<entry>Development/Libraries</entry>
					<entry>開発に必要なヘッダファイル等を含むパッケージ</entry>
					<entry>*-devel</entry>
				</row>
				<row>
					<entry>Development/Languages</entry>
					<entry>開発に使用する各種言語用のパッケージ</entry>
					<entry>perl、php、ruby</entry>
				</row>
				<row>
					<entry>Development/Tools</entry>
					<entry>開発に必要な各種 Tool を含むパッケージ</entry>
					<entry>automake、gettext</entry>
				</row>
				<row>
					<entry>System Environment/Base</entry>
					<entry>システムの動作に必要な最小構成のパッケージ(インストーラでいうところの最小構成に該当)</entry>
					<entry></entry>
				</row>
				<row>
					<entry>System Environment/Daemons</entry>
					<entry>システムの動作で必要なサービス及びデーモン</entry>
					<entry>dbus、hal</entry>
				</row>
				<row>
					<entry>System Enviroment/Kernel</entry>
					<entry>カーネル</entry>
					<entry></entry>
				</row>
				<row>
					<entry>System Environment/Libraries</entry>
					<entry>システムの動作に必要な各種ライブラリ</entry>
					<entry>gtk2、libpng</entry>
				</row>
				<row>
					<entry>System Environment/Shells</entry>
					<entry>各種シェル</entry>
					<entry></entry>
				</row>
				<row>
					<entry>User Interface/Desktops</entry>
					<entry>デスクトップ環境やウィンドウマネージャのアプリケーション</entry>
					<entry>KDE、Xfce 、Fluxbox</entry>
				</row>
				<row>
					<entry>User Interface/X</entry>
					<entry>XOrgと、それに付属するパッケージApplications/Accessories</entry>
					<entry></entry>
				</row>
			</tbody>
		</tgroup>
	</table>
	<note>
		<title>参考</title>
		<para>Vine Linux で使用できるGroup一覧は、<filename>/usr/share/doc/rpm-*/GROUPS_for_vine.txt</filename> に記述されています。</para>
		<para>それぞれの Group の簡単な説明は、<filename>/usr/share/doc/rpm-*/GROUPS-DESC_for_vine.txt</filename> に記述されています。</para>
	</note>
</appendix>

<appendix id="custom-dir">
	<title>パッケージ作成に必要なディレクトリの変更方法</title>
	<para>パッケージ作成に必要なディレクトリを変更したいときには、<filename>~/.rpmmacros</filename>の設定を変更します。</para>
	<example>
		<title>トップディレクトリの変更例</title>
		<para>パッケージ作成に必要なディレクトリを全て/home/user/VinePlus以下に格納する場合は、以下のように変更します。</para>
		<screen>%_topdir   /home/user/VinePlus</screen>
	</example>
	<para>また、以下のマクロを設定することで個別に設定することもできます。</para>
	<table>
		<title>ディレクトリ制御用マクロ</title>
		<tgroup cols="3">
			<thead>
				<row>
					<entry>マクロ名</entry>
					<entry>使用目的</entry>
					<entry>既定値</entry>
				</row>
			</thead>
			<tbody>
				<row>
					<entry>%_builddir</entry>
					<entry>ソースの展開・ビルド用</entry>
					<entry>%_topdir/BUILD</entry>
				</row>
				<row>
					<entry>%_rpmdir</entry>
					<entry>バイナリパッケージ格納用</entry>
					<entry>%_topdir/RPMS</entry>
				</row>
				<row>
					<entry>%_srcrpmdir</entry>
					<entry>ソースパッケージ格納用</entry>
					<entry>%_topdir/SRPMS</entry>
				</row>
				<row>
					<entry>%_specdir</entry>
					<entry>SPECファイル格納用</entry>
					<entry>%_topdir/SPECS</entry>
				</row>
				<row>
					<entry>%_sourcedir</entry>
					<entry>アプリケーションのソース・パッチ格納用</entry>
					<entry>%_topdir/SOURCES</entry>
				</row>
			</tbody>
		</tgroup>
	</table>
	<warning>
		<title>ディレクトリの作成を忘れないように</title>
		<para>ここで説明したマクロを設定した場合は、設定に合わせて書き込み可能なディレクトリを作成する必要があります。</para>
		<para>特に%_rpmdirを設定したとき(%_topdirの変更による位置の変化も含む)には、設定したディレクトリの中に i386・noarch などのarchitecture 毎のディクレトリも忘れずに作成してください。</para>
	</warning>
</appendix>

<appendix id="mr-othertag">
	<title>SPECファイルで使用できる便利なタグ</title>
	<variablelist>
		<varlistentry>
			<term>Prefix</term>
			<listitem><para>
					このタグを使うと、
					rpmパッケージをインストールする時にインストールディレクトリをコントロールできます。
					例えば、
					<screen>Prefix: /usr</screen>
					としていて、ファイル定義部で
<screen>
%files
/usr/bin/fuga</screen>
					と定義してたとしましょう。このパッケージをインストールする時に、
					--prefix /usr/local とオプション指定すると、
					fugaは/usr/local/bin/fuga.binにインストールされます。
			</para></listitem>
		</varlistentry>
		<varlistentry>
			<term>BuildArch</term>
			<listitem><para>
					書いたSPECファイルを使って生成されるrpmパッケージのアーキテクチャを指定できます。
					例えば、elファイルとかシェルスクリプトとかばかりを含むrpmパッケージを作るときには、
					i386やalphaなどのアーキテクチャに依存しないnoarchであることを、
					<screen>BuildArch: noarch</screen>
					というふうに明示します。
					このような指定をしておくとnoarch.rpmという拡張子のつくrpmパッケージが作成できて、
					いろいろなアーキテクチャ上で共用できます。
			</para></listitem>
		</varlistentry>
		<varlistentry>
			<term>ExclusiveArch</term>
			<listitem><para>
					SPECファイルや src.rpmパッケージから、パッケージを生成 できる アーキテクチャーを指定します。
					たとえば、ExclusiveArch: i386 とすると、i386 以外の ppc,i486,i586,i686,x86_64 といったアーキテクチャーではバイナリパッケージを生成できなくなります。
			</para></listitem>
		</varlistentry>
		<varlistentry>
			<term>ExcludeArch</term>
			<listitem><para>
					SPECファイルや src.rpmパッケージから、パッケージを生成 できない アーキテクチャーを指定します。
					たとえば、ExcludeArch: ppc とすると、ppc ではバイナリパッケージを生成できなくなります。ppc 以外の i386,i486,i586,i686,x86_64 といったアーキテクチャーではバイナリパッケージを生成できます。
			</para></listitem>
		</varlistentry>
	</variablelist>
</appendix>

<appendix id="mr-changelog">
	<title>更新記録(1999/2/16以降)</title>
	<itemizedlist>
		<listitem>
			<para>2009/7/4</para>
			<itemizedlist>
				<listitem><para>「環境設定」、「基本的な流れ」、「より高度なパッケージ作成のための情報」の３部構成に変更</para></listitem>
				<listitem><para>「ライブラリのパッケージングポリシー」を追加</para></listitem>
			</itemizedlist>
		</listitem>
		<listitem>
			<para>2009/6/26</para>
			<itemizedlist>
				<listitem><para>「rpm関連ファイルの説明」を「用語の解説」に修正</para></listitem>
				<listitem><para>「rpmパッケージをつくるための準備」を「パッケージ作成毎の準備」に変更</para></listitem>
			</itemizedlist>
		</listitem>
		<listitem>
			<para>2009/6/25</para>
			<itemizedlist>
				<listitem><para>「はじめに」を「文書の概要」と「さらに深く知りたい方へ」に分割</para></listitem>
				<listitem><para>「環境設定」を「rpmパッケージをつくるための準備」から分割</para></listitem>
				<listitem><para>「更新記録」を付録に変更</para></listitem>
			</itemizedlist>
		</listitem>
		<listitem>
			<para>2007/10/3</para>
			<itemizedlist>
				<listitem><para>Appendix B で desktop file に関して修正</para></listitem>
			</itemizedlist>
		</listitem>
		<listitem>
			<para>2007/9/10</para>
			<itemizedlist>
				<listitem><para>Appendix B で desktop-file-install を使うよう修正</para></listitem>
			</itemizedlist>
		</listitem>
		<listitem>
			<para>2007/7/21</para>
			<itemizedlist>
				<listitem><para>Appendix B に desktop-file-validate について追記</para></listitem>
			</itemizedlist>
		</listitem>
		<listitem>
			<para>2007/6/26</para>
			<itemizedlist>
				<listitem><para>Copyright と Serial について追記</para></listitem>
			</itemizedlist>
		</listitem>
		<listitem>
			<para>2007/6/25</para>
			<itemizedlist>
				<listitem><para>%prep での %{SOURCE数字} の利用例を記載</para></listitem>
				<listitem><para>%post での install-info の例で、install時にのみ処理を行うように if文 を追加</para></listitem>
				<listitem><para>%files と Requires の探し方のヒントを記載</para></listitem>
				<listitem><para>ExclusiveArch と ExcludeArch の説明を記載</para></listitem>
				<listitem><para>Appendix B にalternatives を利用するパッケージについて追加</para></listitem>
			</itemizedlist>
		</listitem>
		<listitem>
			<para>2007/5/23</para>
			<itemizedlist>
				<listitem><para>Requires( ),BuildRequires( ) の説明を追加</para></listitem>
				<listitem><para>Prereq の代わりに Requires(pre,post) 等の使用を推奨</para></listitem>
				<listitem><para>%verifyscript について記載</para></listitem>
				<listitem><para>%verify について記載</para></listitem>
				<listitem><para>パッケージ作成後に確認することを記載</para></listitem>
				<listitem><para>リンクの修正</para></listitem>
			</itemizedlist>
		</listitem>
		<listitem>
			<para>2006/12/8</para>
			<itemizedlist>
				<listitem><para>Epoch の使用について記載</para></listitem>
				<listitem><para>install-info --delete の記述を修正</para></listitem>
				<listitem><para>Group 一覧、説明 の typo を修正</para></listitem>
			</itemizedlist>
		</listitem>
		<listitem>
			<para>2006/11/17</para>
			<itemizedlist>
				<listitem><para>Group 一覧、説明を rpm-4.4.2-0vl16 にあわせて修正</para></listitem>
			</itemizedlist>
		</listitem>
		<listitem>
			<para>2006/11/8</para>
			<itemizedlist>
				<listitem><para>License の説明を修正</para></listitem>
				<listitem><para>%check の説明を追記</para></listitem>
				<listitem><para>rpmbuild -bi で %check も実行されることを記述</para></listitem>
				<listitem><para>Vine Linux 4.x での Group 一覧、説明を修正</para></listitem>
				<listitem><para>Appendix B にGNOMEのメニューについて追加</para></listitem>
			</itemizedlist>
		</listitem>
		<listitem>
			<para>2006/11/3</para>
			<itemizedlist>
				<listitem><para>Vine Linux 4.x での Group 一覧、説明を追加</para></listitem>
				<listitem><para>BuildRequires と BuildConflictsの説明を追加</para></listitem>
				<listitem><para>Requires と Prereq、BuildRequires と BuildPrereq の説明を修正、それぞれの違いを追記</para></listitem>
				<listitem><para>%config に noreplace,missingok の説明を追加</para></listitem>
				<listitem><para>マクロの説明を追加</para></listitem>
				<listitem><para>spec の例を修正、マクロを使用した spec の例を追加</para></listitem>
				<listitem><para>%check の説明を追加</para></listitem>
				<listitem><para>%post,%postun に info ファイルの例を追加</para></listitem>
				<listitem><para>タグの -p の説明を追加</para></listitem>
				<listitem><para>Appendix B パッケージ固有の作法等についてを作成</para></listitem>
			</itemizedlist>
		</listitem>
		<listitem>
			<para>2006/10/26</para>
			<itemizedlist>
				<listitem><para>全体を見直し</para></listitem>
			</itemizedlist>
		</listitem>
		<listitem>
			<para>2004/9/19</para>
			<itemizedlist>
				<listitem><para>rpmbuildを推奨する様、追加。</para></listitem>
			</itemizedlist>
		</listitem>
		<listitem>
			<para>2004/6/30</para>
			<itemizedlist>
				<listitem><para>tex形式から、DocBook SGML形式に変更。</para></listitem>
			</itemizedlist>
		</listitem>
		<listitem>
			<para>2000/10/30</para>
			<itemizedlist>
				<listitem><para>細かい修正をすこし</para></listitem>
				<listitem><para>rpm-3.0.5 以降で binary が strip されることと、man/info がgzされることを記述</para></listitem>
				<listitem><para>Prereq の説明追加</para></listitem>
				<listitem><para>rpm -bp の説明追加</para></listitem>
			</itemizedlist>
		</listitem>
		<listitem>
			<para>2000/3/7</para>
			<itemizedlist>
				<listitem><para>minor なタイポや記述の修正</para></listitem>
				<listitem><para>%setup の記述修正(-a,-b)および追加(-q)</para></listitem>
				<listitem><para>.rpmmacros の説明に .rpmrc の場合も併記</para></listitem>
			</itemizedlist>
		</listitem>
		<listitem>
			<para>1999/9/3</para>
			<itemizedlist>
				<listitem><para>.rpmmacros の記述追加(rpm-3.0.x 対応)</para></listitem>
				<listitem><para>BuildPrereq に関する記述を追加</para></listitem>
			</itemizedlist>
		</listitem>
		<listitem>
			<para>1999/2/16</para>
			<itemizedlist>
				<listitem><para>Summary(ja), %description -l ja, %changelog に関する記述を追加</para></listitem>
				<listitem><para>その他細かい修正</para></listitem>
			</itemizedlist>
		</listitem>
	</itemizedlist>
</appendix>

<appendix id="mr-more">
	<title>さらに深く知りたい方へ</title>
	<para>rpmパッケージの作り方についてさらに知りたい人は、
		<ulink url="http://www.linux.or.jp/JF/JFdocs/archive/RPM-BUILD-HOWTO.html">RPM-BUILD-HOWTO</ulink>
		(古高さん、石岡さん著、JFにあります)や
		<ulink url="http://www.rpm.org/max-rpm/index.html">Maximum-RPM</ulink>(英語です。)を読みましょう。
		どちらも、書かれてからだいぶ時間が経っていますが、参考になると思います。</para>

	<note>
		<para>RPM-BUILD-HOWTO は JF というパッケージがインストールされていれば、
			<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>
	</note>

	<para>また、rpm付属のドキュメントが /usr/share/doc/rpm-version/ 以下にあります。(英語です。)</para>
	<para>細かなことについて知りたい場合は、apt-get source rpm , rpm -bp rpm.spec などとして、rpm 自体のソースを読むのもよいでしょう。</para>

	<para>Vine Linux では <ulink url="http://vinelinux.org/packaging.html">パッケージングに関する指針</ulink> というドキュメントもあります。Vine Seed や Vine Plus のパッケージを作成する場合にはこの指針に従ってください。</para>
</appendix>

</book>

<!--
		Local Variables:
		encode: utf-8-unix
		mode: nxml
		End:
-->
