doc/ja_JP.eucJP/books/porters-handbook/book.xml
2013-11-13 07:52:45 +00:00

7610 lines
250 KiB
XML

<?xml version="1.0" encoding="euc-jp"?>
<!DOCTYPE book PUBLIC "-//FreeBSD//DTD DocBook XML V5.0-Based Extension//EN"
"http://www.FreeBSD.org/XML/share/xml/freebsd50.dtd">
<!--
The FreeBSD Documentation Project
The FreeBSD Japanese Documentation Project
Original revision: r20962
$FreeBSD$
-->
<book xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:lang="ja">
<info><title>FreeBSD port 作成者のためのハンドブック</title>
<authorgroup>
<author><orgname>FreeBSD ドキュメンテーションプロジェクト</orgname></author>
</authorgroup>
<pubdate>2000 年 4 月</pubdate>
<copyright>
<year>2000</year>
<year>2001</year>
<year>2002</year>
<year>2003</year>
<year>2004</year>
<holder role="mailto:doc@FreeBSD.org">The FreeBSD Documentation
Project</holder>
</copyright>
<abstract>
<para>このハンドブックは FreeBSD の port 作成者 (porter) 向けに、
具体的な port の作成方法や注意点などをまとめたものです。</para>
<para>日本語版の作成は FreeBSD 日本語ドキュメンテーション
プロジェクト (FreeBSD doc-jp) が行なっています。
日本語訳および、日本語版のみに関することは FreeBSD &a.jp.doc-jp;
おいて日本語で議論されています。
</para>
<para>文書の日本語訳に関するお問い合わせや、
文書の原文に関する問い合わせをしたいが英語が得意でないという方は、
FreeBSD &a.jp.doc-jp; まで日本語でコメントをお寄せください。</para>
</abstract>
&trademarks;
&legalnotice;
<releaseinfo>$FreeBSD$</releaseinfo>
</info>
<chapter xml:id="why-port">
<title>はじめに</title>
<para>FreeBSD Ports Collection は、ほとんどの人が FreeBSD
でアプリケーション ("ports") をインストールする手段です。
FreeBSD に関する他のすべてと同じく、
これも基本的にボランティア活動によるものです。
この文書を読む際には必ずこのことを念頭においてください。</para>
<para>FreeBSD では、誰もが新たな port を提出したり、
メンテナンスされていない既存の port をメンテナンスできます。
そのためには特にソースコードを管理する (commit) 権限は必要ありません。</para>
</chapter>
<chapter xml:id="own-port">
<title>自分で port を作成するには</title>
<para>自分で port を作ることや、既存の port の
更新作業に興味があるのですか。それはすばらしい!</para>
<para>ここでは FreeBSD 用の port を作る際の
ガイドラインをいくつか示します。
既存の port を更新したいと考えている場合であっても、
まずこの章を読んでから、次に
<xref linkend="port-upgrading"/> を読むようにしてください。</para>
<para>この文書では充分に詳細がわからない場合には、
<filename>/usr/ports/Mk/bsd.port.mk</filename> を参照してください。
このファイルは、port の Makefile が例外なくインクルードしているものです。
これには細かくコメントが書かれていますので、Makefile を読むのに
あまり慣れていない人でも、たくさんの情報を得ることができるでしょう。
それでも解決できないような質問は、&a.ports; にポストしてみるのも
良いでしょう。</para>
<note>
<para>この文書では、上書き可能な
変数 (<varname><replaceable>VAR</replaceable></varname>) のうち
一部のものについてだけ述べています。
(すべてでは無いかもしれませんが、) ほとんどの変数は
<filename>bsd.port.mk</filename> の先頭部分に記述されています。
それ以外のものも記述すべきかもしれません。
なお、このファイルは非標準のタブ設定を使用しています。
<application>Emacs</application><application>Vim</application> は、
この設定をファイルの読み込み時に認識するはずです。
&man.vi.1;&man.ex.1; では、
一旦ファイルを読み込んでから <command>:set tabstop=4</command>
タイプすることで、正しい値に設定することができます。</para>
</note>
</chapter>
<chapter xml:id="quick-porting">
<title>3 分間 porting</title>
<para>このセクションでは、簡単な port の作り方について説明します。
多くの場合、これだけでは不十分なので、
この文書の続きを読まなければならないでしょう。</para>
<para>まず、元の tar ファイルを
<varname>DISTDIR</varname> に置きます。この変数の
デフォルト値は <filename>/usr/ports/distfiles</filename> です。</para>
<note>
<para>以下の例では、そのソフトウェアが
そのままコンパイル可能なものと仮定しています。
つまり、FreeBSD マシンで動かすために、
変更がまったく必要ないという意味です。
もし何か変更が必要な場合には、次のセクションも
参照する必要があるでしょう。</para>
</note>
<sect1 xml:id="porting-makefile">
<title><filename>Makefile</filename> の作成</title>
<para>最小限の <filename>Makefile</filename>
次のようなものになります。</para>
<programlisting># New ports collection makefile for: oneko
# Date created: 5 December 1994
# Whom: asami
#
# &dollar;FreeBSD&dollar;
#
PORTNAME= oneko
PORTVERSION= 1.1b
CATEGORIES= games
MASTER_SITES= ftp://ftp.cs.columbia.edu/archives/X11R5/contrib/
MAINTAINER= asami@FreeBSD.org
COMMENT= A cat chasing a mouse all over the screen
MAN1= oneko.1
MANCOMPRESSED= yes
USE_IMAKE= yes
.include &lt;bsd.port.mk&gt;</programlisting>
<para>おわかりでしょうか。<literal>&dollar;FreeBSD&dollar;</literal>
含む行の内容については、気にする必要はありません。
この行は、このファイルが FreeBSD の ports ツリーに
取り込まれる際に、CVS によって自動的に書き込まれます。
もっと詳しい例が見たい場合には、
<link linkend="porting-samplem">Makefile のサンプル</link>
セクションをご覧ください。</para>
</sect1>
<sect1 xml:id="porting-desc">
<title>package 記述ファイルの作成</title>
<para>package にするしないに関わらず、どのような port でも
2 つの記述ファイルが必要です。それは
<filename>pkg-descr</filename>
<filename>pkg-plist</filename> です。ファイル名が
<filename>pkg-</filename> で始まっていることで
他のファイルと区別できるようになっています。</para>
<sect2>
<title><filename>pkg-descr</filename></title>
<para>このファイルには、その port についての少し長い説明を書きます。
その port が何をするのかについての、
数段落程度の簡潔な解説があれば充分です。</para>
<note>
<para>これはマニュアルでもなければ、使用方法やコンパイル方法に
ついての細かい説明書でも<emphasis>ありません</emphasis>
<emphasis><filename>README</filename> ファイルや
マニュアルを引用するつもりなら注意が必要です</emphasis>
これらは多くの場合、その port の簡潔な説明になっていなかったり、
扱いにくい形式になっていたりします。
(マニュアルの場合、行を揃えるために空白が調整されていたりします。)
このソフトウェアに公式のウェブサイトがあるのなら、
ここに書いてください。その際自動化ツールが正しく動作するように、
ウェブサイトのうちの<emphasis>一つ</emphasis>には、
先頭に <literal>WWW:</literal> をつけておいてください。</para>
</note>
<para>このファイルの最後に、あなたの名前を書くことが推奨されています。
たとえば、こんな具合です。</para>
<programlisting>This is a port of oneko, in which a cat chases a poor mouse all over
the screen.
:
(うんぬん。)
WWW: http://www.oneko.org/
- Satoshi
asami@cs.berkeley.edu</programlisting>
</sect2>
<sect2>
<title><filename>pkg-plist</filename></title>
<para>このファイルには、その port によってインストールされる
すべてのファイルを列挙します。
このファイルは package を作る際のリストとして使われるため、
<quote>パッキングリスト (packing list)</quote> とも呼ばれます。
ここに書くパス名は、インストール時のプレフィックス
(通常 <filename>/usr/local</filename> または
<filename>/usr/X11R6</filename>) からの相対パスです。
<varname>MAN<replaceable>n</replaceable></varname> 変数を
使用している場合 (使用することが推奨されています)、このリストに
マニュアルは入れないようにしてください。</para>
<para>簡単な例を載せておきましょう。</para>
<programlisting>bin/oneko
lib/X11/app-defaults/Oneko
lib/X11/oneko/cat1.xpm
lib/X11/oneko/cat2.xpm
lib/X11/oneko/mouse.xpm
@dirrm lib/X11/oneko</programlisting>
<para>パッキングリストの詳細については、
&man.pkg.create.1; のマニュアルを参照してください。</para>
<note>
<para>このリストには、すべてのファイルを列挙しなければ
なりませんが、ディレクトリそのものは列挙する必要がありません。
また、この port がインストール時に独自のディレクトリを
作成する場合には、この port が削除されるときに
そのディレクトリも削除されるよう、<literal>@dirrm</literal> の行を
追加しておくのを忘れないでください。</para>
<para>このファイルでは、すべてのファイル名を
アルファベット順にソートしておくことを推奨します。
そうすることで、port を更新する際の
変更点の確認が楽になります。</para>
<para>パッキングリストを手作業で作成するのは、
時にとても退屈な作業になります。
その port が非常に多数のファイルをインストールするとしたら、
<link linkend="porting-autoplist"> パッキングリストの
自動生成</link>を行なえば、時間の節約になるかもしれません。</para>
</note>
</sect2>
</sect1>
<sect1 xml:id="porting-checksum">
<title>チェックサムファイルの作成</title>
<para><command>make makesum</command> と入力するだけで、
(訳注: <filename>bsd.port.mk</filename> に書かれている)
port 生成ルールに従い、
自動的に <filename>distinfo</filename> ファイルが生成されます。</para>
</sect1>
<sect1 xml:id="porting-testing">
<title>port のテスト</title>
<para>package 化も含め、その port が思った通りに
動くことを確認してください。
確認の必要な重要ポイントは以下の通りです。</para>
<itemizedlist>
<listitem>
<para>その port がインストールしないものが
<filename>pkg-plist</filename> に含まれていないこと。</para>
</listitem>
<listitem>
<para>その port がインストールする、すべてのものが
<filename>pkg-plist</filename> に含まれていること。</para>
</listitem>
<listitem>
<para><buildtarget>reinstall</buildtarget>
ターゲットを使うことで、その port が
何度でもインストール可能なこと。</para>
</listitem>
<listitem>
<para>その port が deintall される際には
<link linkend="porting-cleaning">後片付け</link>をすること。</para>
</listitem>
</itemizedlist>
<procedure>
<title>推奨されるテストの手順</title>
<step>
<para><command>make install</command></para>
</step>
<step>
<para><command>make package</command></para>
</step>
<step>
<para><command>make deinstall</command></para>
</step>
<step>
<para><command>pkg_add package 名
</command></para>
</step>
<step>
<para><command>make deinstall</command></para>
</step>
<step>
<para><command>make reinstall</command></para>
</step>
<step>
<para><command>make package</command></para>
</step>
</procedure>
<para><buildtarget>package</buildtarget> および
<buildtarget>deinstall</buildtarget> の段階で、
どんな警告 (warning) も出力されないことを確認してください。
ステップ 3 の後、(訳注: その port が作成した) すべての新しい
ディレクトリが正しく消去されていることを確認してください。
また、ステップ 4 の後にそのソフトウェアを使用してみて、
package からインストールされた場合にも正しく動作することを
確認してください。</para>
</sect1>
<sect1 xml:id="porting-portlint">
<title><command>portlint</command> によるチェック</title>
<para><command>portlint</command> を使い、その port が FreeBSD の
ガイドラインに沿っているかどうかを確認してください。
<command>portlint</command> プログラムは ports collection に
含まれています。
特に、<link linkend="porting-samplem">Makefile</link>
正しい形式になっているか、
<link linkend="porting-pkgname">package</link>
名前が正しいかどうかをチェックするのに良いでしょう。</para>
</sect1>
<sect1 xml:id="porting-submitting">
<title>port の提出</title>
<para>まず、<link linkend="porting-dads"> やって良いこと悪いこと</link>
セクションを読んでください。</para>
<para>さて、満足のいく port が完成したら、残るは
それを FreeBSD のメインの ports ツリーに置いて、
他の人にも使ってもらうだけです。
<filename>work</filename> ディレクトリや
<filename>pkgname.tgz</filename> といった package は
必要ありませんから、まずこれらを消去してください。
あとは <command>shar `find port_dir`</command> の出力を
バグレポートに入れ、&man.send-pr.1; プログラムを使用して
送ってください (&man.send-pr.1; についての詳細は<link xlink:href="../../articles/contributing/contrib-how.html#CONTRIB-GENERAL">
バグ報告と一般的な論評</link>を参照してください)。
もし、圧縮していない状態で 20KB 以上あるような port であれば、
それを ひとつの tar ファイルにまとめて圧縮し、
バグレポートに入れる前に &man.uuencode.1; を使用してください
(20KB 以下のものを tar ファイルにして送っても良いのですが、
あまり歓迎されません)。
バクレポートの category は必ず <literal>ports</literal>,
class は <literal>change-request</literal> としてください
(レポートを <literal>confidential</literal> (機密) 指定には
しないでください!)。
また、port 化したプログラムの短い説明文を
バグレポートの <quote>Description</quote> フィールドに追加して、
<quote>Fix</quote> フィールドには shar したファイル、
もしくは uuencode した
tar ファイルを追加するようにしてください。</para>
<note>
<para>障害報告の概要 (synopsis) 欄がよく書けていると、
わたしたちが作業しやすくなります。
新しい port を提出するなら
<quote>New port: &lt;カテゴリ&gt;/&lt;port 名&gt;
&lt;短い port の概要&gt;</quote>
port の更新なら、
<quote>Update port: &lt;カテゴリ&gt;/&lt;port 名&gt;
&lt;短い更新の概要&gt;</quote>
のような形が歓迎されます。
この考え方に沿っていれば、
誰かがあなたの障害報告を時間をおかずに見てくれる可能性が高くなります。</para>
</note>
<para>もう一度、<emphasis>オリジナルのソースファイルや
<filename>work</filename> ディレクトリ、
<command>make package</command> で作成した package が
含まれていないこと</emphasis>を確認してください。</para>
<para>port を提出したら、辛抱強くお待ちください。時には、ある
port が FreeBSD に取り込まれるまで、数日しかかかりそうもないの
に、数ヶ月かかることもあります。<link xlink:href="http://www.FreeBSD.org/cgi/query-pr-summary.cgi?category=ports">
FreeBSD へのコミット待ちの ports</link> の一覧が見られます。</para>
<para>わたしたちがひとたびその port をチェックしたら、必要なら
あなたに確認して、それをツリーへ置きます。
あなたの名前は<link xlink:href="../../articles/contributors/contrib-additional.html">その他の
FreeBSD への貢献者</link>の一覧やその他のファイルにも載るでしょう。
う~ん、素晴らしい。<!-- smiley -->:-)</para>
<!-- kuriyama - should use link tag? -->
</sect1>
</chapter>
<chapter xml:id="slow">
<title>本格的な port</title>
<para>残念ながら移植がそう簡単ではなく、それを動かすために
多少の変更が必要になる場合もあるでしょう。
このセクションでは、模範的な ports の作法に従い、
どのように変更を行なって動くようにするのかを
順を追って説明します。</para>
<sect1 xml:id="slow-work">
<title>port 構築の詳細</title>
<para>まず、あなたが port のディレクトリで
<command>make</command>
入力してから起こる一連の出来事について、
順を追って説明します。
ここを読むときには、別のウィンドウに
<filename>bsd.port.mk</filename> を表示しておくと
理解の助けになるかもしれません。</para>
<para>しかし、<filename>bsd.port.mk</filename> が何をしているのか
完全に理解できなくても 心配する必要はありません。
それほど多くの人が理解している というわけでは ありませんから…。
<!-- smiley --><emphasis>f(^_^;)</emphasis></para>
<procedure>
<step>
<para>まず、<buildtarget>fetch</buildtarget> という
ターゲットが実行されます。
この <buildtarget>fetch</buildtarget> ターゲットは、
配布ファイルがローカルの <varname>DISTDIR</varname>
存在することを保証する役目を持っています。
もし必要なファイルが <varname>DISTDIR</varname>
存在しなければ、<buildtarget>fetch</buildtarget> ターゲットは
<filename>Makefile</filename> で指定された
<varname>MASTER_SITES</varname> 中の URL や、
FreeBSD のメイン FTP サイト <uri xlink:href="ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/distfiles/">ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/distfiles/</uri>
(ここにはバックアップとして、われわれ ports 管理者が確認した
配布ファイルを置いてあります) を探しにいきます。
<command>make</command> を実行するマシンがインターネットに
接続されていて、目的のファイルを <varname>FETCH</varname>
取ってこれた場合には、それを <varname>DISTDIR</varname>
保存します。</para>
</step>
<step>
<para>次に <buildtarget>extract</buildtarget> ターゲットが実行されます。
このターゲットは <varname>DISTDIR</varname> から
配布ファイル (普通は gzip された tar ファイル) を読み込み、
その内容を作業ディレクトリ <varname>WRKDIR</varname>
(デフォルトでは <filename>work</filename>) に展開します。</para>
</step>
<step>
<para>次に <buildtarget>patch</buildtarget> ターゲットが実行されます。
まず、<varname>PATCHFILES</varname> にパッチファイルが
指定されていれば、そのパッチを適用します。
次に、<varname>PATCHDIR</varname> ディレクトリ
(デフォルトでは <filename>files</filename> サブディレクトリ) に
<filename>patch-*</filename> という
名前のパッチファイルが存在すれば、
これらをアルファベット順に適用します。</para>
</step>
<step>
<para>次に <buildtarget>configure</buildtarget> ターゲットが
実行されます。
これには、いろいろな場合があります。</para>
<orderedlist>
<listitem>
<para><filename>scripts/configure</filename>
存在する場合には、そのスクリプトが実行されます。</para>
</listitem>
<listitem>
<para><varname>HAS_CONFIGURE</varname> または
<varname>GNU_CONFIGURE</varname> がセットされていれば、
<filename>WRKSRC/configure</filename>
実行されます。</para>
</listitem>
<listitem>
<para><varname>USE_IMAKE</varname> がセットされていれば、
<varname>XMKMF</varname>
(デフォルトでは <command>xmkmf -a</command>) が
実行されます。</para>
</listitem>
</orderedlist>
</step>
<step>
<para>最後に <buildtarget>build</buildtarget> ターゲットが実行されます。
これは作業ディレクトリ (<varname>WRKSRC</varname>) に降りていき、
ビルド (コンパイル) を実行するのが役目です。
<varname>USE_GMAKE</varname> がセットされていれば
GNU <command>make</command> が使用され、
セットされていなければ FreeBSD の <command>make</command>
使用されます。</para>
</step>
</procedure>
<para>上記はデフォルトの動作です。これに加えて
<buildtarget>pre-<replaceable> 何とか</replaceable></buildtarget>
<buildtarget>post-<replaceable> 何とか</replaceable></buildtarget>という
ターゲットを定義したり、そのような名前のスクリプトを
<filename>scripts</filename> サブディレクトリに置くことも可能で、
それぞれデフォルトの動作の前や後に実行されます。</para>
<para>たとえば、<buildtarget>post-extract</buildtarget> ターゲットが
<filename>Makefile</filename> に定義されていて、
<filename>scripts</filename> サブディレクトリに
<filename>pre-build</filename> というファイルが置かれている場合、
<buildtarget>post-extract</buildtarget> ターゲットは
通常の展開動作の後に呼び出され、
<filename>pre-build</filename> スクリプトは
デフォルトのコンパイル動作の前に実行されます。
実行する動作が簡単であれば、スクリプトよりも
<filename>Makefile</filename> のターゲットを使用することが
推奨されています。
なぜなら、その port では どのような非標準の動作が必要とされるのか、
一箇所にまとめて書いてあった方が他の人に理解しやすいからです。</para>
<para>デフォルトの動作は <filename>bsd.port.mk</filename>
<buildtarget>do-<replaceable> 何とか</replaceable></buildtarget>という
ターゲットで実行されます。
たとえば port を展開するコマンドは
<buildtarget>do-extract</buildtarget> ターゲットに書かれています。
もしデフォルトのターゲットに不満があれば、
<filename>Makefile</filename> 中で
<buildtarget>do-<replaceable> 何とか</replaceable></buildtarget>という
ターゲットを再定義することにより、
好きなように変更することができます。</para>
<note>
<para><quote>メイン</quote>のターゲット
(たとえば <buildtarget>extract</buildtarget>,
<buildtarget>configure</buildtarget>、その他) は、
すべての前段階が実行されていることを確認してから、
実際のターゲットやスクリプトを呼び出す以外のことは
行ないませんし、これらが変更されることも想定されていません。
もし展開の方法を変更したいときには
<buildtarget>do-extract</buildtarget> の変更によって実現し、
<buildtarget>extract</buildtarget>
の動作は絶対に変更しないでください。</para>
</note>
<para>これで、ユーザが <command>make</command>
入力したときに何が起こるのかが理解できたと思います。
では、完璧な port を作成するための推奨手順を
順に見ていきましょう。</para>
</sect1>
<sect1 xml:id="slow-sources">
<title>オリジナルのソースの入手</title>
<para>(通常の場合、) 圧縮された tar ファイルの形
(<filename>foo.tar.gz</filename> あるいは
<filename>foo.tar.Z</filename>) で
オリジナルのソースを入手して、
それを <varname>DISTDIR</varname> にコピーします。
できる限り、<emphasis>主流の</emphasis>ソースを
使用するようにしてください。</para>
<para>もとの tar ファイルがどこにあるかを示すために、変数
<varname>MASTER_SITES</varname> を設定する必要があります。
主なサイトのほとんどについては省略形が
<filename>bsd.sites.mk</filename> で定義されています。
これらのサイト (と付随する定義)
を、ソースコード内で同じ情報が繰り返されるのを避けるために、
可能な限り使うようにしてください。
これらのサイトは時とともに変わってゆきますので、そうしないと、
関係者一同にとってメンテナンスの悪夢になってしまいます。</para>
<para>ネットワークへの接続の良好な FTP/HTTP サイトを
見つけることができなかったり、頭にくるような非標準的な形式しか
置いていないサイトしか見つけられないときには、
自分の管理下にあり信頼できる FTP サーバや HTTP サーバ
(たとえば、あなた自身のホームページ) に置くこともできます。</para>
<para>そのような便利かつ信頼のおける置き場所が見つからない場合、
我々が <systemitem>ftp.FreeBSD.org</systemitem>
<quote>置き場所</quote>を提供することもできますが、
これはなるべく避けたい解決法です。
配布ファイルは、誰かの <systemitem>freefall</systemitem> アカウントの
<filename>~/public_distfiles/</filename> に置かれることでしょう。
その port をコミットする人に、置いてもらえるように頼んでください。
その人は配布ファイルを置いて、<varname>MASTER_SITES</varname>
<varname>MASTER_SITE_LOCAL</varname> にセットし、
<varname>MASTER_SITE_SUBDIR</varname> には
自分の <systemitem>freefall</systemitem> ユーザ名を
入れておいてくれるでしょう。</para>
<para>その port の配布ファイルが、
作者によるバージョン更新のようなことがなく変更されるなら、
その配布ファイルを
あなたのホームページに置いて、<varname>MASTER_SITES</varname>
最初に指定することも考えてみてください。できれば、その port
の作者にそういうことをしないようにお願いしてみてください。
そのためには、何かしらのソースコード管理を行うと役に立つでしょう。
あなたが独自のバージョンを置けば、ユーザが
<errorname>checksum mismatch</errorname>
エラーに悩まされることもなくなりますし、FreeBSD の FTP サイトの
保守担当者の負担も減らすこともできます。
また、その port にマスターサイトが一つしか存在しない場合には、
あなたのサイトにバックアップを置き、
それを <varname>MASTER_SITES</varname> の 2 番目に
指定すると良いでしょう。</para>
<para>その port がインターネット上で入手できる追加パッチを
必要とするのなら、それも取ってきて
<varname>DISTDIR</varname> に置いてください。
それらがメインのソースの tar ファイルとは別のサイトに
あったとしても、心配する必要はありません。
そのような状況にも ちゃんと対応できるようになっています
(後述の <link linkend="porting-patchfiles">PATCHFILES の記述</link>
ご覧ください)。</para>
</sect1>
<sect1 xml:id="slow-modifying">
<title>port の修正</title>
<para>作業用のディレクトリに tar ファイルを展開し、
最新バージョンの FreeBSD 上で正しくコンパイルするために必要な、
あらゆる変更を行ないます。
この処理は最終的に自動化するわけですから、
何を行なったかを<emphasis>注意深く記録しておきましょう</emphasis>
この port が完成した暁には、ファイルの削除、追加、
修正を含むすべての処理が自動化されたスクリプトや
パッチファイルで行なえるようになっていなければなりません。</para>
<para>その port のコンパイルやインストールのために必要な手作業が
あまりに多いようならば、Larry Wall の芸術的な
<application>Configure</application> スクリプトを
参考にしたほうが良いかもしれません。
新しい ports collection は、エンドユーザにとって個々の port が
可能な限り<quote>プラグ &amp; プレイ</quote>かつ
最小のディスク消費で make できることを目指しています。</para>
<note>
<para>明示的に記述されている場合を除き、あなたが作成して
FreeBSD の ports collection に寄付したパッチファイル、
スクリプトおよびその他のファイルは、標準的な BSD の
著作権条件によりカバーされているものと見なされます。</para>
</note>
</sect1>
<sect1 xml:id="slow-patch">
<title>パッチの適用</title>
<para>port の準備段階で追加されたり変更されたりしたファイルは、
再帰的 &man.diff.1; により後で &man.patch.1;
に与えられる形にすることができます。
パッチは適当にまとめて
<filename>patch-*</filename>
という名前のファイルに入れてください。
<filename>*</filename>
はパッチが適用される順番を示します &mdash; これらは
<emphasis>アルファベット順</emphasis>
つまり <literal>aa</literal> が最初、
<literal>ab</literal> が その次といった順番で処理されます。
お望みなら、<filename>patch-Imakefile</filename> とか
<filename>patch-src-config.h</filename> のように、
パッチ対象のファイルのパス名を示す名前を使うこともできます。
これらのファイルは <varname>PATCHDIR</varname> に置いてください。
そうすれば自動的に適用されるようになっています。
すべてのパッチは <varname>WRKSRC</varname>
からの相対パスにするべきです (通常、<varname>WRKSRC</varname>
は port の tar ファイルが展開されるディレクトリで、
make が実行されるところと同じです)。
修正やアップグレードを容易にするため、
複数のパッチで同じファイルを修正するのは避けてください
(たとえば、<filename>patch-aa</filename>
<filename>patch-ab</filename> が共に
<filename>WRKSRC/foobar.c</filename>
を修正するなど)。</para>
<para>RCS
にとって特別な意味を持つ文字列をパッチ内に入れないようにしてください。
ファイルを私たちのソースツリーに入れる時、
これらの文字列は CVS によって書き換えられてしまい、
後でまたパッチを使おうとした時にうまくいかないことがあります。
RCS 文字列はドル記号 (<literal>&dollar;</literal>)
で囲まれており、
<literal>&dollar;FreeBSD</literal>
<literal>&dollar;RCS</literal>
などで始まります。</para>
<para>&man.diff.1; の再帰 (<option>-r</option>)
フラグを使って再帰的なパッチを作るのは大変結構なのですが、
でき上がったパッチは必ず目でチェックして余計なゴミが入っていないことを確認してください。
よくあるのはバックアップファイル同士の変更点、あるいは
<command>Imake</command>
GNU <command>configure</command>
を使うソフトウェアの
<filename>Makefile</filename>
の変更点が入っている場合などです。
また <filename>configure.in</filename> を編集して
<command>autoconf</command> を使って
<command>configure</command> を作り直すときには、
<command>configure</command> の diff は含めずに
(それらは良く数千行におよぶことがあります)、
<literal>USE_AUTOCONF=yes</literal> を定義して
<filename>configure.in</filename>
diff をとってください。</para>
<para>ファイルをまるごと消す場合には、
パッチを使わずに
<buildtarget>post-extract</buildtarget>
ターゲットで消す方が簡単です。
できあがった差分に満足したら、
それらをソースのファイルごとに別々のパッチファイルに分割してください。</para>
</sect1>
<sect1 xml:id="slow-configure">
<title>コンフィグレーション</title>
<para>カスタマイズのために追加したいコマンドがあれば、
<filename>configure</filename> という名前のスクリプトに入れて
<filename>scripts</filename> サブディレクトリに置いてください。
上で述べたように、<filename>pre-configure</filename>
あるいは <filename>post-configure</filename> という
<filename>Makefile</filename> ターゲットや、
スクリプトで処理することもできます。</para>
</sect1>
<sect1 xml:id="slow-user-input">
<title>ユーザからの入力の扱い</title>
<para>もし、その port がビルド、コンフィグレーション、または
インストールの際にユーザからの入力を必要とするならば、
<filename>Makefile</filename> 中で
<varname>IS_INTERACTIVE</varname> を設定しなければなりません。
これにより、ユーザが環境変数 <envar>BATCH</envar>
セットしている場合には、この port の処理がスキップされるので
<quote>夜間の無人ビルド</quote> が実行可能になります。
(逆に環境変数 <envar>INTERACTIVE</envar> がセットされていると、
ユーザからの入力を必要とする port <emphasis>だけ</emphasis>
コンパイルされます)。
これは、連続して ports をビルドするマシン群で、
無駄になる時間を大きく減らします。</para>
<para>もし、適切なデフォルト設定が存在するのであれば、
<varname>PACKAGE_BUILDING</varname> 変数をチェックして、
それが設定されている場合には
ユーザ入力のスクリプトを起動しないようにしてください。
こうすることによって、我々 ports 管理者が
CDROM や FTP に 置く package を作成することができます。
</para>
</sect1>
</chapter>
<chapter xml:id="makefile">
<title><filename>Makefile</filename> の作成</title>
<para><filename>Makefile</filename> の作成は非常に単純です。
繰り返しますが、始めるまえに既存の例を見ておくことを推奨します。
また、このハンドブックには <link linkend="porting-samplem">Makefile のサンプル</link>があります。
それを見て、Makefile 内の変数の順番や
空行を入れるところなどの参考にしてください。
そうすると他の人々にも読みやすいものとなります。</para>
<para>では、<filename>Makefile</filename> を設計するときに
問題となるところを順に追って見てみましょう。</para>
<sect1 xml:id="makefile-source">
<title>オリジナルのソース</title>
<para>ソースは <filename>foozolix-1.2.tar.gz</filename> といった名前の
標準的な gzip された tar ファイルの形式で
<varname>DISTDIR</varname> に置かれていますか?
そうなっていれば、次のステップに進めます。
異なっている場合には、変数 <varname>DISTNAME</varname>,
<varname>EXTRACT_CMD</varname>,
<varname>EXTRACT_BEFORE_ARGS</varname>,
<varname>EXTRACT_AFTER_ARGS</varname>,
<varname>EXTRACT_SUFX</varname>,
<varname>DISTFILES</varname> のうち
いくつかを書き換える必要があります。
どれだけ変更しないといけないかは、その port の配布ファイルが
どの程度標準からかけはなれているかによります
(最もよくあるのは gzip ではなく普通の compress コマンドで
tar ファイルが圧縮されている場合で、そのときは
<literal>EXTRACT_SUFX=.tar.Z</literal> とするだけです)。</para>
<para>最悪の場合には、自分で
<buildtarget>do-extract</buildtarget> ターゲットを作成して、
デフォルトを上書きすることもできます。
しかし、そこまでする必要があることはめったにないでしょう。</para>
</sect1>
<sect1 xml:id="makefile-naming">
<title>名前の付け方</title>
<para>Port の <filename>Makefile</filename> のはじめの部分で port
に名前をつけ、バージョン番号を記述し、適切なカテゴリに載せます。</para>
<sect2>
<title><varname>PORTNAME</varname> および
<varname>PORTVERSION</varname></title>
<para><varname>PORTNAME</varname> には
port の名前の基幹部分を入れ、
<varname>PORTVERSION</varname>
には port のバージョン番号を入れます。</para>
</sect2>
<sect2>
<title><varname>PORTREVISION</varname> および
<varname>PORTEPOCH</varname></title>
<sect3>
<title><varname>PORTREVISION</varname></title>
<para><varname>PORTREVISION</varname> 変数は単調増加する値です。
<varname>PORTVERSION</varname> が増加した時 (つまり、
新しいオフィシャルベンダーリリースが行なわれた時) には
いつでも 0 にリセットされます。
また、その値が 0 でない場合には package 名に追加されます。
<varname>PORTREVISION</varname> の変更は、(例えば
&man.pkg.version.1; 等の) 自動化ツールが、
新たな package が入手できることを示すのに使われます。</para>
<para>その port から作られる package の内容や構造に
大きな影響を与える変更を行なった時には、
<varname>PORTREVISION</varname> を増やしてください。</para>
<para><varname>PORTREVISION</varname>
を上げる必要がある変更の例:</para>
<itemizedlist>
<listitem>
<para>セキュリティ上の脆弱性やバグを修正するため、または
その port に新しい機能を追加するためのパッチの追加。</para>
</listitem>
<listitem>
<para>package のコンパイル時オプションの有効化や
無効化のための port の <filename>Makefile</filename>
の変更。</para>
</listitem>
<listitem>
<para>パッキングリストの変更や、package のインストール時の
挙動の変更 (たとえば、ssh のホストキーのような package の
初期データを生成するスクリプトの変更など)。</para>
</listitem>
<listitem>
<para>その port が依存する共有ライブラリのバージョンを
上げる場合 (新しいバージョンの共有ライブラリが
インストールされた後に、そのライブラリに依存していた
古い package をインストールを試みる場合、
その package は新しい libfoo.(x+1) ではなく
古い libfoo.x を探そうとするため、インストールに失敗します。
(訳注: そのため、PORTREVISION を上げた package を
作成する必要があるわけです))。</para>
</listitem>
<listitem>
<para>ひそかに port 配布ファイルの変更が行なわれ、
その機能に大きな変化があった場合。
つまり、<filename>distinfo</filename> の修正を
必要とするような配布ファイルの変更が行なわれ、
新旧のバージョンの <command>diff -ru</command> を取ると
些細とは言えない変更が認められるにもかかわらず、
オリジナルのバージョン番号が変更されていないことから
<varname>PORTVERSION</varname> の変更は難しい場合。</para>
</listitem>
</itemizedlist>
<para>PORTREVISION を上げる必要の無い変更の例:</para>
<itemizedlist>
<listitem>
<para>生成される package に機能の変化が起らないような
port スケルトンのスタイル変更。</para>
</listitem>
<listitem>
<para>生成される package に影響しないような
<varname>MASTER_SITES</varname> その他の
port に対する機能変更。</para>
</listitem>
<listitem>
<para>誤植の修正などの些細な変更で、その package のユーザが
アップグレードを必要とするほどには重要でないパッチ。</para>
</listitem>
<listitem>
<para>以前にはコンパイルが通らなかった package を
ビルド可能にするための修正 (その port が以前にビルド可能だった
プラットフォームにおいて、その変更により何らかの機能的な
違いが発生しない場合に限ります)。
<varname>PORTREVISION</varname> は package
の内容を反映したものなので、その package
が以前にビルド可能でなかったのなら、変更を示すために、
<varname>PORTREVISION</varname>
増やす必要はありません。</para>
</listitem>
</itemizedlist>
<para>経験的な判断方法としては、ある port にコミットされた変更が
(それが強化や修正によるものであれ、新しい package による
実質的な効能であれ)、アップデートすることにより、
誰もが利益を受けるような何かかどうか、また定期的に ports
ツリーを更新している人に更新を強制するということに値するか自問してみることです。
もし答がイエスであれば、
<varname>PORTREVISION</varname> を上げるべきでしょう。</para>
</sect3>
<sect3>
<title><varname>PORTEPOCH</varname></title>
<para>ソフトウェアのベンダや FreeBSD の port 作成者は、
以前のものよりも小さい数字のバージョン番号をつけたソフトウェアをリリースするといった、
何か馬鹿げたことをすることが時々あります。
例をあげると、ある port が foo-20000801 から foo-1.0
になるといった具合です
(数字として見ると 20000801 は 1 よりも大きいため、
間違って前者の方が新しいバージョンとして扱われてしまいます)。</para>
<para>このような場合には <varname>PORTEPOCH</varname>
バージョンを増やしてください。
上のセクション 0 で説明したように、
<varname>PORTEPOCH</varname> がゼロでない場合には、
それがパッケージ名の後ろにつけられます。絶対に
<varname>PORTEPOCH</varname>
を減らしたり、ゼロにリセットしてはいけません。
さもないと、以前に作成された package との比較に失敗する
(つまり、その package が古くなっていることがわからない) ためです:
新しいバージョン番号 (上の例では<literal>1.0,1</literal>) は
依然として前のバージョン番号 (20000801) よりも
数字としては小さいのですが、自動化ツールが
サフィックス <literal>,1</literal> を特別扱いすることで、
以前の package には明示されていないサフィックス
<literal>,0</literal> よりも新しいことがわかります。</para>
<para>誤って <varname>PORTEPOCH</varname>
を削除したりリセットしたりすると、終わりのない悲劇に見舞われます。
上記の議論を理解できないなら、
わかるまで議論をたどるかメーリングリストで質問してください。</para>
<para>大多数の ports では、<varname>PORTEPOCH</varname>
必要になることは まず無いものと考えられています。
また、注意深く <varname>PORTVERSION</varname> を使用することで、
そのソフトウェアの将来のリリースがバージョン構造を変更する必要が出てきた場合にも、
多くの場合前もって対応しておくことができるでしょう。
しかし、<quote>スナップショット</quote>リリースのように、
オフィシャルなバージョン番号を持たないベンダーリリースが行なわれた時には、
FreeBSD 版の port 作者によるケアが必要になります。
そういったリリースに対し、
リリース日付を使ったラベルを付けたいという誘惑にかられることがあるでしょうが、
そうすると新しい<quote>オフィシャル</quote>リリースが行なわれた時に、
上の例で示したような問題が起きることでしょう。</para>
<para>例えば、あるソフトウェアのスナップショットリリースが
20000917 に行なわれ、以前のバージョン番号が 1.2 だったとすると、
そのスナップショットの <varname>PORTVERSION</varname> には
20000917 ではなく 1.2.20000917 か何か、そのような番号を
指定するのが良いでしょう。
そうしておけば、例えばバージョン番号 1.3 として後続のリリースが
行なわれた場合にも、大小関係が崩されずにすむわけです。</para>
</sect3>
<sect3>
<title><varname>PORTREVISION</varname>
<varname>PORTEPOCH</varname> の使い方の例</title>
<para><literal>gtkmumble</literal> の port,
バージョン <literal>0.10</literal>
ports collection にコミットされます。</para>
<programlisting>PORTNAME= gtkmumble
PORTVERSION= 0.10</programlisting>
<para><varname>PKGNAME</varname>
<literal>gtkmumble-0.10</literal> になります。</para>
<para>ローカルな FreeBSD パッチを必要とする
セキュリティホールが発見されました。
それに合わせて <varname>PORTREVISION</varname> を増やします。</para>
<programlisting>PORTNAME= gtkmumble
PORTVERSION= 0.10
PORTREVISION= 1</programlisting>
<para><varname>PKGNAME</varname>
<literal>gtkmumble-0.10_1</literal> になります。</para>
<para>ベンダから <literal>0.2</literal> という番号が振られた
新バージョンがリリースされます (これにより、
作者は <literal>0.10</literal> という番号を
<quote>0.9 の次という意味ではなく</quote>
実際には <literal>0.1.0</literal> のつもりで
使用していたことがわかります - あらら、今さら遅すぎる)。
新しいマイナーバージョン <literal>2</literal>
は数字として以前のバージョン番号
<literal>10</literal> より小さいので、
強制的に新しい package <quote>の方が新しい</quote>と認識させるため
<varname>PORTEPOCH</varname> を増やす必要があります。
これは新しいベンダーリリースなので、
<varname>PORTREVISION</varname> は 0 にリセット
(または <filename>Makefile</filename> から削除) されます。</para>
<programlisting>PORTNAME= gtkmumble
PORTVERSION= 0.2
PORTEPOCH= 1</programlisting>
<para><varname>PKGNAME</varname>
<literal>gtkmumble-0.2,1</literal> になります。</para>
<para>次のリリースは 0.3 です。
<varname>PORTEPOCH</varname> は減少することが無いため、
今度のバージョン変数は次のようになります:</para>
<programlisting>PORTNAME= gtkmumble
PORTVERSION= 0.3
PORTEPOCH= 1</programlisting>
<para><varname>PKGNAME</varname>
<literal>gtkmumble-0.3,1</literal> になります。</para>
<note>
<para>もし、このアップグレードによって
<varname>PORTEPOCH</varname><literal>0</literal>
リセットされたとすると、<literal>3</literal> は数字として
<literal>10</literal> よりも小さいため、
<literal>gtkmumble-0.10_1</literal>
の package をインストールした誰かは
<literal>gtkmumble-0.3</literal> の package
の方が新しいことに気がつかないことになるでしょう。
これが、そもそも <varname>PORTEPOCH</varname>
が導入された肝心な理由です。</para>
</note>
</sect3>
</sect2>
<sect2>
<title><varname>PKGNAMEPREFIX</varname> および
<varname>PKGNAMESUFFIX</varname></title>
<para>二つのオプション変数 <varname>PKGNAMEPREFIX</varname>
<varname>PKGNAMESUFFIX</varname> は、
<varname>PORTNAME</varname> および
<varname>PORTVERSION</varname> と結合され、
<varname>PKGNAME</varname>
<literal>${PKGNAMEPREFIX}${PORTNAME}${PKGNAMESUFFIX}-${PORTVERSION}</literal>
として定義します。
この時、<link linkend="porting-pkgname">適切な package 名を選ぶための
ガイドライン</link>に沿っているかどうかを確認してください。
特に、<varname>PORTVERSION</varname> 中に
ハイフン (<literal>-</literal>)
を使用することは<emphasis>禁止</emphasis>されています。
また、package 名に
<replaceable>language-</replaceable> もしくは
<replaceable>-compiled.specifics</replaceable> 部分が
含まれる場合、それぞれ <varname>PKGNAMEPREFIX</varname>
<varname>PKGNAMESUFFIX</varname> を使用してください。
これらを <varname>PORTNAME</varname> の一部としてはいけません。</para>
</sect2>
<sect2 xml:id="porting-pkgname">
<title>package 名についての規則</title>
<para>package の名前は以下のルールにしたがってつけてください。
これは package のディレクトリを見やすくするためで、
既に何千ものパッケージがありますし、
目を痛めてしまうようだとユーザはそっぽを向くでしょう。</para>
<para>package の名前は以下のようにしてください。
<filename>言語-名前-オプションバージョン.番号</filename></para>
<para>package 名は
<literal>${PKGNAMEPREFIX}${PORTNAME}${PKGNAMESUFFIX}-${PORTVERSION}</literal>
というように定義されています。
変数がこの書式と適合していることを確認してください。</para>
<orderedlist>
<listitem>
<para>FreeBSD
はユーザの慣れ親しんだ言語のサポートに力を入れています。
特定の言語のための port の package 名には
<replaceable>言語-</replaceable> に ISO-639
で定義されている言語名の略称を入れてください。
たとえば日本語なら <literal>ja</literal>
ロシア語なら <literal>ru</literal>
ベトナム語なら <literal>vi</literal>
中国語なら <literal>zh</literal>
韓国語ならば <literal>ko</literal>
ドイツ語なら <literal>de</literal>
といった具合です。</para>
<para>port がある言語地域に特化したものである場合には、
さらに二文字の国名コードを付加してください。
たとえば合衆国英語圏は <literal>en_US</literal> となり、
スイスのフランス語圏は <literal>fr_CH</literal> となります。</para>
<para><replaceable>言語-</replaceable> 部分は、
<varname>PKGNAMEPREFIX</varname> 変数に
定義されなければなりません。</para>
</listitem>
<listitem>
<para><filename>名前</filename>の部分の最初の文字は
小文字でなければなりません。
(名前の残りの部分は大文字を含んでいても構わないため、
大文字を含んだソフトウェア名を変換する際の規則は、
あなた自身の裁量に任されています。)
<literal>perl 5</literal> のモジュールでは先頭に
<literal>p5-</literal> を付け、
二重コロン (<literal>::</literal>)
のセパレータをハイフン
(<literal>-</literal>)
に置きかえる習慣になっています。
たとえば
<literal>Data::Dumper</literal>
<literal>p5-Data-Dumper</literal> になります。
また、そのソフトウェアの名前として通常使われるものに番号、
ハイフン、あるいは下線が入っている場合には、
それらを使うことも構いません
(<literal>kinput2</literal>など)。</para>
</listitem>
<listitem>
<para>コンパイル時に環境変数や
<command>make</command> の引数などで<link linkend="porting-masterdir">ハードコードされたデフォルト</link>を変えてコンパイルできる場合、
<replaceable>-compiled.specifics</replaceable>
にそのコンパイル時のデフォルトを入れてください
(ハイフンはあってもなくてもかまいません)。
用紙のサイズ、あるいはフォントの解像度などがこれにあたります。</para>
<para><replaceable>-compiled.specifics</replaceable> 部分は、
<varname>PKGNAMESUFFIX</varname> 変数に定義されなければなりません。</para>
</listitem>
<listitem>
<para>バージョン番号は数字とアルファベットからなり、
ピリオド (.) で区切ります。
アルファベットは二文字以上続けてはいけません。
唯一の例外は<quote>パッチレベル</quote>を意味する文字列
<literal>pl</literal> で、
それ以外にバージョン番号がまったくついていない場合にのみ使うことができます。
もしソフトウェアのバージョンに
<quote>alpha</quote>, <quote>beta</quote>, <quote>rc</quote>
<quote>pre</quote> といった文字列が含まれるなら、
ピリオドの後に最初の一文字をとってください。
これらの後に、さらにバージョン文字列が続く場合には、
一文字のアルファベットの後にピリオドをつけずに番号を続けます。</para>
<para>この考え方は、
バージョン文字列を見て簡単に ports を並べられるようにするためのものです。
特に、バージョン番号の各部分が必ずピリオドで区切られていること、
また日付の部分がバージョン文字列の一部となっている場合には
<literal>yyyy.mm.dd</literal>
という書式を使っていることを確認してください。
<literal>dd.mm.yyyy</literal>
や、2000 年問題に対応していない
<literal>yy.mm.dd</literal>
という書式を使ってはいけません。</para>
</listitem>
</orderedlist>
<para>では、<varname>DISTNAME</varname>を正しい
<varname>PKGNAME</varname>
に直す例を見てみましょう:</para>
<para>以下は、ソフトウェアの作者が決めた名前から
適切な package 名に変換する方法を示した (実際の) 例です。</para>
<informaltable frame="none">
<tgroup cols="6">
<thead>
<row>
<entry>配布名</entry>
<entry><varname>PKGNAMEPREFIX</varname></entry>
<entry><varname>PORTNAME</varname></entry>
<entry><varname>PKGNAMESUFFIX</varname></entry>
<entry><varname>PORTVERSION</varname></entry>
<entry>理由</entry>
</row>
</thead>
<tbody>
<row>
<entry>mule-2.2.2</entry>
<entry>(空)</entry>
<entry>mule</entry>
<entry>(空)</entry>
<entry>2.2.2</entry>
<entry>変更の必要はありません</entry>
</row>
<row>
<entry>XFree86-3.3.6</entry>
<entry>(空)</entry>
<entry>XFree86</entry>
<entry>(空)</entry>
<entry>3.3.6</entry>
<entry>変更の必要はありません</entry>
</row>
<row>
<entry>EmiClock-1.0.2</entry>
<entry>(空)</entry>
<entry>emiclock</entry>
<entry>(空)</entry>
<entry>1.0.2</entry>
<entry>プログラム一つだけの時は小文字のみ</entry>
</row>
<row>
<entry>rdist-1.3alpha</entry>
<entry>(空)</entry>
<entry>rdist</entry>
<entry>(空)</entry>
<entry>1.3.a</entry>
<entry><literal>alpha</literal> のような文字列は使えない</entry>
</row>
<row>
<entry>es-0.9-beta1</entry>
<entry>(空)</entry>
<entry>es</entry>
<entry>(空)</entry>
<entry>0.9.b1</entry>
<entry><literal>alpha</literal> のような文字列は使えない</entry>
</row>
<row>
<entry>mailman-2.0rc3</entry>
<entry>(空)</entry>
<entry>mailman</entry>
<entry>(空)</entry>
<entry>2.0.r3</entry>
<entry><literal>rc</literal> のような文字列は使えない</entry>
</row>
<row>
<entry>v3.3beta021.src</entry>
<entry>(空)</entry>
<entry>tiff</entry>
<entry>(空)</entry>
<entry>3.3</entry>
<entry>なんなんでしょう ;)</entry>
</row>
<row>
<entry>tvtwm</entry>
<entry>(空)</entry>
<entry>tvtwm</entry>
<entry>(空)</entry>
<entry>pl11</entry>
<entry>バージョン番号は必ず必要</entry>
</row>
<row>
<entry>piewm</entry>
<entry>(空)</entry>
<entry>piewm</entry>
<entry>(空)</entry>
<entry>1.0</entry>
<entry>同上</entry>
</row>
<row>
<entry>xvgr-2.10pl1</entry>
<entry>(空)</entry>
<entry>xvgr</entry>
<entry>(空)</entry>
<entry>2.10.1</entry>
<entry><literal>pl</literal> が使えるのは、
他にメジャー/マイナーバージョン番号がない場合のみ</entry>
</row>
<row>
<entry>gawk-2.15.6</entry>
<entry>ja-</entry>
<entry>gawk</entry>
<entry>(空)</entry>
<entry>2.15.6</entry>
<entry>日本語バージョン</entry>
</row>
<row>
<entry>psutils-1.13</entry>
<entry>(空)</entry>
<entry>psutils</entry>
<entry>-letter</entry>
<entry>1.13</entry>
<entry>コンパイル時に用紙のサイズを指定</entry>
</row>
<row>
<entry>pkfonts</entry>
<entry>(空)</entry>
<entry>pkfonts</entry>
<entry>300</entry>
<entry>1.0</entry>
<entry>300dpiフォント用の package</entry>
</row>
</tbody>
</tgroup>
</informaltable>
<para>オリジナルのソースにまったくバージョン情報が見当たらず、
また原作者が新しいバージョンをリリースする可能性が低いときには、
バージョン番号として
<literal>1.0</literal> を使えばいいでしょう
(上記の <literal>piewm</literal> の例がこれにあたります)。
そうでない場合には原作者に聞くか、日付
(<literal>yyyy.mm.dd</literal>)
を使うなどしてください。</para>
</sect2>
</sect1>
<sect1 xml:id="makefile-categories">
<title>カテゴリ分類</title>
<sect2>
<title><varname>CATEGORIES</varname></title>
<para>パッケージが作成されると
<filename>/usr/ports/packages/All</filename> に置かれ、一つ以上の
<filename>/usr/ports/packages</filename>
のサブディレクトリからリンクが張られます。
これらのサブディレクトリの名称は、<varname>CATEGORIES</varname>
変数で指定されます。これは、ユーザが FTP サイトや CDROM
のパッケージの山から探し出すのを容易にするためのものです。
既存の<link linkend="porting-categories">カテゴリ</link>を参照して、
あなたの port にふさわしいものを選んでください。</para>
<para>また、このリストは、その port が
ports ツリーのどこにインポートされるかも決定します。
ここに複数のカテゴリを指定すると、port
のファイルは最初のカテゴリ名のサブディレクトリに置かれることになります。
適切なカテゴリの選択方法については<link linkend="porting-categories">カテゴリ</link>節をご覧ください。</para>
<para>あなたが作成した port
が、本当に既存のどのカテゴリにも当てはまらない場合には、
新たにカテゴリ名を作成することもできます。
その場合、新しいカテゴリを提案するメールを &a.ports;
宛に送ってください。
しかし、一般的にはあなたが提案したカテゴリにあてはまる ports
が一握りではすまない場合でなければ、
あなたの提案は却下されるでしょう。</para>
<note><para>時々、カテゴリを 2 階層構造や、
何か他のキーワードを利用した構造に再構成することを提案する人がいます。
今日まで、その提案はどれも実現しませんでした。
なぜなら、その構成を実現することは簡単なのですが、既存の Ports
Collection 全体を構成しなおしたものに合わせて改修する労力は、
控え目にいっても気が遠くなるものだからです。
こういうアイディアを送る前に、
それらの提案の歴史をメーリングリストのアーカイブで調べてください。
さらに、動作するプロトタイプを示せと言われるのに対する準備をしておきましょう。</para></note>
</sect2>
<sect2 xml:id="porting-categories">
<title>現在のカテゴリのリスト</title>
<para>ここに現在の port のカテゴリの一覧を示します。
アスタリスク(<literal>*</literal>)
が付いているものは仮想 (<emphasis>virtual</emphasis>)
カテゴリです &mdash;
これらには対応するサブディレクトリが
<!-- kuriyama - don't use " - - " as literal -->
port ツリーにはありません。
これらは第 2 の補助的なカテゴリとして、
検索目的にしか使われません。</para>
<note>
<para>仮想カテゴリでないものは、
そのサブディレクトリ内の
<filename>pkg/COMMENT</filename>
に一行の記述があります
(例: <filename>archivers/pkg/COMMENT</filename>)。</para>
</note>
<informaltable frame="none">
<tgroup cols="3">
<thead>
<row>
<entry>カテゴリ</entry>
<entry>説明</entry>
<entry>Notes</entry>
</row>
</thead>
<tbody>
<row>
<entry><filename>accessibility</filename></entry>
<entry>障害を持ったユーザの役に立つ ports</entry>
<entry/>
</row>
<row>
<entry><filename>afterstep*</filename></entry>
<entry><link xlink:href="http://www.afterstep.org">AfterStep</link>
ウィンドウマネージャをサポートする ports</entry>
<entry/>
</row>
<row>
<entry><filename>arabic</filename></entry>
<entry>アラビア語サポート</entry>
<entry/>
</row>
<row>
<entry><filename>archivers</filename></entry>
<entry>アーカイブ用ツール</entry>
<entry/>
</row>
<row>
<entry><filename>astro</filename></entry>
<entry>天文学関連の ports</entry>
<entry/>
</row>
<row>
<entry><filename>audio</filename></entry>
<entry>サウンドをサポートする ports</entry>
<entry/>
</row>
<row>
<entry><filename>benchmarks</filename></entry>
<entry>ベンチマークユーティリティ</entry>
<entry/>
</row>
<row>
<entry><filename>biology</filename></entry>
<entry>生物学関連のソフトウェア</entry>
<entry/>
</row>
<row>
<entry><filename>cad</filename></entry>
<entry>CAD ツール</entry>
<entry/>
</row>
<row>
<entry><filename>chinese</filename></entry>
<entry>中国語サポート</entry>
<entry/>
</row>
<row>
<entry><filename>comms</filename></entry>
<entry>通信ソフトウェア</entry>
<entry>ほとんどはシリアルポート用のソフトウェア</entry>
</row>
<row>
<entry><filename>converters</filename></entry>
<entry>文字コード変換</entry>
<entry/>
</row>
<row>
<entry><filename>databases</filename></entry>
<entry>データベース</entry>
<entry/>
</row>
<row>
<entry><filename>deskutils</filename></entry>
<entry>コンピュータが発明される以前に机上で使われていた道具</entry>
<entry>(訳注: いわゆるデスクトップユーティリティのこと)</entry>
</row>
<row>
<entry><filename>devel</filename></entry>
<entry>開発ユーティリティ</entry>
<entry>単にライブラリだからというだけで、
どうしてもここに置かなければならない理由があるのでない限り、
ライブラリをここに含めないでください。</entry>
</row>
<row>
<entry><filename>dns</filename></entry>
<entry>DNS 関連ソフトウェア</entry>
<entry/>
</row>
<row>
<entry><filename>editors</filename></entry>
<entry>一般的なエディタ</entry>
<entry>特殊なエディタはそれぞれふさわしいセクションに入れます
(たとえば数式エディタは
<filename>math</filename> です)。</entry>
</row>
<row>
<entry><filename>elisp</filename></entry>
<entry>Emacs-lisp の ports</entry>
<entry/>
</row>
<row>
<entry><filename>emulators</filename></entry>
<entry>他のオペレーティングシステム用のエミュレータ</entry>
<entry>端末エミュレータはここに<emphasis>含まれません</emphasis>
&mdash; X ベースのものは <filename>x11</filename> に、
テキストベースのものは機能によって
<filename>comms</filename>
<filename>misc</filename> に分類されます。</entry>
</row>
<row>
<entry><filename>finance</filename></entry>
<entry>金融や財務会計関連のアプリケーション。</entry>
<entry/>
</row>
<row>
<entry><filename>french</filename></entry>
<entry>フランス語サポート</entry>
<entry/>
</row>
<row>
<entry><filename>ftp</filename></entry>
<entry>FTP クライアントとサーバユーティリティ</entry>
<entry>port が FTP と HTTP の両方に対応していれば、
<filename>ftp</filename> に入れ、第 2 カテゴリを
<filename>www</filename> とします。</entry>
</row>
<row>
<entry><filename>games</filename></entry>
<entry>ゲーム</entry>
<entry/>
</row>
<row>
<entry><filename>german</filename></entry>
<entry>ドイツ語サポート</entry>
<entry/>
</row>
<row>
<entry><filename>gnome*</filename></entry>
<entry><link xlink:href="http://www.gnome.org">GNOME</link>
プロジェクトの ports</entry>
<entry/>
</row>
<row>
<entry><filename>graphics</filename></entry>
<entry>グラフィックユーティリティ</entry>
<entry/>
</row>
<row>
<entry><filename>haskell*</filename></entry>
<entry>Haskell 言語関連のソフトウェア。</entry>
<entry/>
</row>
<row>
<entry><filename>hebrew</filename></entry>
<entry>ヘブライ語サポート</entry>
<entry/>
</row>
<row>
<entry><filename>hungarian</filename></entry>
<entry>ハンガリー語サポート</entry>
<entry/>
</row>
<row>
<entry><filename>ipv6*</filename></entry>
<entry>IPv6 関連のソフトウェア</entry>
<entry/>
</row>
<row>
<entry><filename>irc</filename></entry>
<entry>インターネットリレーチャット (IRC)
用ユーティリティ</entry>
<entry/>
</row>
<row>
<entry><filename>japanese</filename></entry>
<entry>日本語サポート</entry>
<entry/>
</row>
<row>
<entry><filename>java</filename></entry>
<entry>Java 言語関連のソフトウェア</entry>
<entry/>
</row>
<row>
<entry><filename>kde*</filename></entry>
<entry><link xlink:href="http://www.kde.org">K Desktop
Environment (kde)</link> プロジェクトの
ports</entry>
<entry/>
</row>
<row>
<entry><filename>korean</filename></entry>
<entry>韓国語サポート</entry>
<entry/>
</row>
<row>
<entry><filename>lang</filename></entry>
<entry>プログラミング言語</entry>
<entry/>
</row>
<row>
<entry><filename>linux*</filename></entry>
<entry>Linux アプリケーションとサポートユーティリティ</entry>
<entry/>
</row>
<row>
<entry><filename>lisp*</filename></entry>
<entry>Lisp 言語関連のソフトウェア</entry>
<entry/>
</row>
<row>
<entry><filename>mail</filename></entry>
<entry>メールソフトウェア</entry>
<entry/>
</row>
<row>
<entry><filename>math</filename></entry>
<entry>数値計算ソフトウェアやその他の数学ソフトウェア</entry>
<entry/>
</row>
<row>
<entry><filename>mbone</filename></entry>
<entry>MBone アプリケーション</entry>
<entry/>
</row>
<row>
<entry><filename>misc</filename></entry>
<entry>種々のユーティリティ</entry>
<entry>基本的に他のカテゴリに属さないものです。
これは他の仮想でないカテゴリを伴わない、唯一のカテゴリです。
<literal>misc</literal> と他のカテゴリが
<varname>CATEGORIES</varname> 行に書かれている場合、
<literal>misc</literal>
を削除して他のサブディレクトリにおいて良いという意味になります。
このカテゴリに置かれた ports は見落とされやすいので、
可能な限り <literal>misc</literal>
よりふさわしいカテゴリを探してください。</entry>
</row>
<row>
<entry><filename>multimedia</filename></entry>
<entry>マルチメディアソフトウェア</entry>
<entry/>
</row>
<row>
<entry><filename>net</filename></entry>
<entry>種々のネットワークソフトウェア</entry>
<entry/>
</row>
<row>
<entry><filename>net-mgmt</filename></entry>
<entry>ネットワーク管理ソフトウェア</entry>
<entry/>
</row>
<row>
<entry><filename>news</filename></entry>
<entry>USENET ニュースソフトウェア</entry>
<entry/>
</row>
<row>
<entry><filename>offix*</filename></entry>
<entry><link xlink:href="http://leb.net/OffiX/">OffiX</link>
suite の ports</entry>
<entry/>
</row>
<row>
<entry><filename>palm</filename></entry>
<entry><link xlink:href="http://www.palm.com/">Palm&trade;</link>
シリーズをサポートするソフトウェア</entry>
<entry/>
</row>
<row>
<entry><filename>parallel*</filename></entry>
<entry>並列計算を行うアプリケーション</entry>
<entry/>
</row>
<row>
<entry><filename>pear*</filename></entry>
<entry>Pear PHP フレームワーク関連の ports</entry>
<entry/>
</row>
<row>
<entry><filename>perl5*</filename></entry>
<entry>実行に <application>Perl</application>
バージョン 5 を必要とする ports</entry>
<entry/>
</row>
<row>
<entry><filename>picobsd</filename></entry>
<entry><link xlink:href="http://people.FreeBSD.org/~picobsd/">PicoBSD</link>
をサポートするための ports</entry>
<entry/>
</row>
<row>
<entry><filename>plan9*</filename></entry>
<entry><link xlink:href="http://www.cs.bell-labs.com/plan9dist/">Plan9</link>
に由来するさまざまなソフトウェア</entry>
<entry/>
</row>
<row>
<entry><filename>polish</filename></entry>
<entry>ポーランド語サポート</entry>
<entry/>
</row>
<row>
<entry><filename>portuguese</filename></entry>
<entry>ポルトガル語サポート</entry>
<entry/>
</row>
<row>
<entry><filename>print</filename></entry>
<entry>印刷ソフトウェア</entry>
<entry>DTP 用ツール (プレビューアなど)
もここに分類されます。</entry>
</row>
<row>
<entry><filename>python*</filename></entry>
<entry><link xlink:href="http://www.python.org/">Python</link>
言語関連のソフトウェア</entry>
<entry/>
</row>
<row>
<entry><filename>ruby*</filename></entry>
<entry><link xlink:href="http://www.ruby-lang.org/">Ruby</link>
言語関連のソフトウェア</entry>
<entry/>
</row>
<row>
<entry><filename>russian</filename></entry>
<entry>ロシア語サポート</entry>
<entry/>
</row>
<row>
<entry><filename>science</filename></entry>
<entry><filename>astro</filename>
<filename>biology</filename>,
<filename>math</filename> 等、
他のカテゴリにはあてはまらない科学関連の ports</entry>
<entry/>
</row>
<row>
<entry><filename>security</filename></entry>
<entry>セキュリティ関連のユーティリティ</entry>
<entry/>
</row>
<row>
<entry><filename>shells</filename></entry>
<entry>コマンドラインシェル</entry>
<entry/>
</row>
<row>
<entry><filename>sysutils</filename></entry>
<entry>システムユーティリティ</entry>
<entry/>
</row>
<row>
<entry><filename>tcl76*</filename></entry>
<entry>実行に Tcl バージョン 7.6 を必要とする ports</entry>
<entry/>
</row>
<row>
<entry><filename>tcl80*</filename></entry>
<entry>実行に Tcl バージョン 8.0 を必要とする ports</entry>
<entry/>
</row>
<row>
<entry><filename>tcl81*</filename></entry>
<entry>実行に Tcl バージョン 8.1 を必要とする ports</entry>
<entry/>
</row>
<row>
<entry><filename>tcl82*</filename></entry>
<entry>実行に Tcl バージョン 8.2 を必要とする ports</entry>
<entry/>
</row>
<row>
<entry><filename>tcl83*</filename></entry>
<entry>実行に Tcl バージョン 8.3 を必要とする ports</entry>
<entry/>
</row>
<row>
<entry><filename>textproc</filename></entry>
<entry>テキスト処理ユーティリティ</entry>
<entry>DTP ツールはここではなく、<filename>print</filename>
に分類されます。</entry>
</row>
<row>
<entry><filename>tk42*</filename></entry>
<entry>実行に Tk バージョン 4.2 を必要とする ports</entry>
<entry/>
</row>
<row>
<entry><filename>tk80*</filename></entry>
<entry>実行に Tk バージョン 8.0 を必要とする ports</entry>
<entry/>
</row>
<row>
<entry><filename>tk81*</filename></entry>
<entry>実行に Tk バージョン 8.1 を必要とする ports</entry>
<entry/>
</row>
<row>
<entry><filename>tk82*</filename></entry>
<entry>実行に Tk バージョン 8.2 を必要とする ports</entry>
<entry/>
</row>
<row>
<entry><filename>tk83*</filename></entry>
<entry>実行に Tk バージョン 8.3 を必要とする ports</entry>
<entry/>
</row>
<row>
<entry><filename>tkstep80*</filename></entry>
<entry>実行に TkSTEP バージョン 8.0 を必要とする ports</entry>
<entry/>
</row>
<row>
<entry><filename>ukrainian</filename></entry>
<entry>ウクライナ語サポート</entry>
<entry/>
</row>
<row>
<entry><filename>vietnamese</filename></entry>
<entry>ベトナム語サポート</entry>
<entry/>
</row>
<row>
<entry><filename>windowmaker*</filename></entry>
<entry>WindowMaker ウィンドウマネージャをサポートする ports</entry>
<entry/>
</row>
<row>
<entry><filename>www</filename></entry>
<entry>World Wide Web 関連のソフトウェア</entry>
<entry>HTML 言語サポートもここに分類されます。</entry>
</row>
<row>
<entry><filename>x11</filename></entry>
<entry>X ウィンドウシステムとその関連ソフトウェア</entry>
<entry>このカテゴリは、
直接ウィンドウシステムをサポートするソフトウェアのみを対象とするものです。
通常の X アプリケーションをここに分類しないでください。
ほとんどは他の <filename>x11-*</filename> カテゴリ
(下記参照) に分類されるべきです。
あなたの port が X アプリケーションで、
<varname>USE_XLIB</varname> を定義し
(<varname>USE_IMAKE</varname>
を定義すると自動的に定義されます)、
適切なカテゴリに分類してください。</entry>
</row>
<row>
<entry><filename>x11-clocks</filename></entry>
<entry>X11 用時計</entry>
<entry/>
</row>
<row>
<entry><filename>x11-fm</filename></entry>
<entry>X11 用ファイルマネージャ</entry>
<entry/>
</row>
<row>
<entry><filename>x11-fonts</filename></entry>
<entry>X11 フォントとフォントユーティリティ</entry>
<entry/>
</row>
<row>
<entry><filename>x11-servers</filename></entry>
<entry>X11 サーバ</entry>
<entry/>
</row>
<row>
<entry><filename>x11-toolkits</filename></entry>
<entry>X11 ツールキット</entry>
<entry/>
</row>
<row>
<entry><filename>x11-wm</filename></entry>
<entry>X11 ウィンドウマネージャ</entry>
<entry/>
</row>
<row>
<entry><filename>zope*</filename></entry>
<entry><link xlink:href="http://www.zope.org/">Zope</link>
サポート</entry>
<entry/>
</row>
</tbody>
</tgroup>
</informaltable>
</sect2>
<sect2>
<title>適切なカテゴリの選択</title>
<para>多くのカテゴリに重なるので、
どれを<quote>第一</quote>カテゴリにするかを決めなければならないことがたびたびあるでしょう。
これをうまく決めるルールがいくつかあります。
以下はその優先順のリストで、優先度の高いものから低いものの順に書いてあります。</para>
<itemizedlist>
<listitem>
<para>言語特有のカテゴリがまず最初です。
たとえば日本語の
X11 のフォントをインストールする port の場合、
<varname>CATEGORIES</varname> 行は
<filename>japanese x11-fonts</filename>
となるでしょう。</para>
</listitem>
<listitem>
<para>より特徴的なカテゴリが、
一般的なカテゴリより優先されます。
たとえば、HTML エディタの場合は <filename>www editors</filename> となります。
これを逆順にはしないでください。
また、
port が <filename>irc</filename>,
<filename>mail</filename>,
<filename>mbone</filename>,
<filename>news</filename>,
<filename>security</filename>,
<filename>www</filename>
のいずれかに属する場合には <filename>net</filename>
は暗黙のうちに含まれますので、入れるべきではありません。</para>
</listitem>
<listitem>
<para><filename>x11</filename>
を第二カテゴリにするのは第一カテゴリが自然言語の場合のみにしてください。
特に X のアプリケーションには
<filename>x11</filename> を指定しないでください。</para>
</listitem>
<listitem>
<para><application>Emacs</application> のモードは、
そのモードで対応しているアプリケーションと同じ
ports カテゴリに置くようにして、
<filename>editors</filename> には置かないでください。
例えば、あるプログラミング言語のソースファイルを編集するための
<application>Emacs</application> モードは、
<filename>lang</filename> に置くべきです。</para>
</listitem>
<listitem>
<para>もし、あなたの port が他のどのカテゴリにも属しない場合には
<filename>misc</filename> にしてください。</para>
</listitem>
</itemizedlist>
<para>もし、あなたがカテゴリについて自信が持てない場合には、
そのことを &man.send-pr.1; する時に書き加えてください。
そうすればインポートする前にそれについて議論できます
(もしあなたがコミッターであれば、
そのことを &a.ports; に送って先に議論するようにしてください。
新しい port が間違ったカテゴリに import されて、
すぐ移動されることがあまりに多いのです。そうなると、
ソースリポジトリのマスターが不要で好ましくない膨れ方をしてしまいます。</para>
</sect2>
</sect1>
<sect1 xml:id="makefile-distfiles">
<title>配布ファイル</title>
<para><filename>Makefile</filename> の第二の部分では、
その port をビルドするためにダウンロードしなければならないファイルと、
それをどこからダウンロードできるか説明しています。</para>
<sect2>
<title><varname>DISTNAME</varname></title>
<para><varname>DISTNAME</varname>
は製作者が決めたソフトウェアの名前です。
デフォルトでは <varname>DISTNAME</varname>
<literal>${PORTNAME}-${PORTVERSION}</literal> になりますので、
必要にな場合だけ書き換えるようにしてください。
<varname>DISTNAME</varname> は二つの場所でしか使われません。
一つ目は配布ファイルリスト (<varname>DISTFILES</varname>) のデフォルト
<varname>${DISTNAME}</varname><varname>${EXTRACT_SUFX}</varname>
で、二つ目は配布ファイルが展開されるサブディレクトリ
<varname>WRKSRC</varname> のデフォルト
<filename>work/${DISTNAME}</filename>
です。</para>
<note>
<para><varname>PKGNAMEPREFIX</varname>
<varname>PKGNAMESUFFIX</varname>
<varname>DISTNAME</varname> に影響を与えません。
また、元のソースアーカイブが
<varname>${PORTNAME}-${PORTVERSION}${EXTRACT_SUFX}</varname> という
名前ではないのに、<varname>WRKSRC</varname>
<filename>work/${PORTNAME}-${PORTVERSION}</filename>
と設定しているなら、おそらく <varname>DISTNAME</varname>
はそのままにしておく必要があることに注意してください &mdash;
<varname>DISTNAME</varname><varname>WRKSRC</varname>
の両方を (そして おそらく <varname>EXTRACT_SUFX</varname> も)
セットするよりは、<varname>DISTFILES</varname>
を定義する方が楽でしょう。</para>
</note>
</sect2>
<sect2>
<title><varname>MASTER_SITES</varname></title>
<para>元になる配布ファイルを指し示す、FTP/HTTP の URL のファイル名を除いた部分を
<varname>MASTER_SITES</varname> に設定します。
最後にスラッシュ (<filename>/</filename>)
をつけることをお忘れなく!</para>
<para>このシステム上に配布ファイルが見つからなかった場合、
<command>make</command> マクロは <varname>FETCH</varname>
を使ってこの変数に指定されたサイトから配布ファイルを取得しようとします。</para>
<para>このリストには、
できれば異なる大陸に存在する複数のサイトを入れておくことが推奨されています。
これにより、広域ネットワークのトラブルに対する耐性を高めることができます。
さらに私たちは、自動的に最も近いマスタサイトを判断して、
そこから取ってくるメカニズムの導入を計画しています。
複数のサイトがあれば、この取組を大きく助けることになります。</para>
<para>元になる tar ファイルが X-contrib や GNU, Perl CPAN
等の有名なアーカイブサイトに置かれている場合には、
<varname>MASTER_SITE_<replaceable>*</replaceable></varname>
を使ってこれらのサイトを簡潔に
(例えば <varname>MASTER_SITE_XCONTRIB</varname> とか、
<varname>MASTER_SITE_PERL_CPAN</varname> のように) 指定することができます。
<varname>MASTER_SITES</varname> を これらの変数の一つにセットし、
サイト内でのパスを <varname>MASTER_SITE_SUBDIR</varname>
に指定するだけです。
以下に例を示します。</para>
<programlisting>MASTER_SITES= ${MASTER_SITE_XCONTRIB}
MASTER_SITE_SUBDIR= applications</programlisting>
<para>これらの変数は <filename>/usr/ports/Mk/bsd.sites.mk</filename>
で定義されています。
いつでも新しい項目が追加されて行きますので、
port を提出する前に このファイルの最新版を
チェックするように心掛けてください。</para>
<para>ユーザは <filename>/etc/make.conf</filename> 中で
<varname>MASTER_SITE_*</varname> 変数を上書きすることもできます。
そうすることで、これらの有名なアーカイブそのものではなく、
好みのミラーサイトを使用することができます。</para>
</sect2>
<sect2>
<title><varname>EXTRACT_SUFX</varname></title>
<para>配布ファイルが 1 つで、
圧縮方式を示すのに普通と異なる接尾辞を使っていたら、
<varname>EXTRACT_SUFX</varname> を設定してください。</para>
<para>例えば、配布ファイルがより一般的な
<filename>foo.tar.gz</filename> ではなく、
<filename>foo.tgz</filename> となっていたら、
次のように書きます。</para>
<programlisting>DISTNAME= foo
EXTRACT_SUFX= .tgz</programlisting>
<para><varname>USE_BZIP2</varname><varname>USE_ZIP</varname>
変数を設定すると、<varname>EXTRACT_SUFX</varname>
は必要に応じて自動的に <literal>.bz2</literal>
または <literal>.zip</literal> に設定されます。
どちらも設定されていなければ、<varname>EXTRACT_SUFX</varname>
<literal>.tar.gz</literal> に設定されます。</para>
<note>
<para><varname>EXTRACT_SUFX</varname>
<varname>DISTFILES</varname>
を両方設定する必要はありません。</para>
</note>
</sect2>
<sect2>
<title><varname>DISTFILES</varname></title>
<para>時々、ダウンロードするファイルの名称が port
の名称とまったく似ていないことがあります。たとえば、
<filename>source.tar.gz</filename>
などと名づけられていることもあるでしょう。
ほかに、ソースコードがいくつかのアーカイブに分かれていて、
そのすべてをダウンロードしなければならないならないこともあります。</para>
<para>この場合、<varname>DISTFILES</varname>
に、ダウンロードしなければならないファイルすべてのリストを、
スペースで区切って設定してください。</para>
<programlisting>DISTFILES= source1.tar.gz source2.tar.gz</programlisting>
<para>明示的に設定されていない場合、
<varname>DISTFILES</varname>
<literal>${DISTNAME}${EXTRACT_SUFX}</literal>
に設定されます。</para>
</sect2>
<sect2>
<title><varname>EXTRACT_ONLY</varname></title>
<para><varname>DISTFILES</varname> の一部だけを展開すべき
(例えば、一方がソースコードで、もう一方は圧縮されていない文書という)
場合、展開しなければならないファイル名を
<varname>EXTRACT_ONLY</varname> に設定してください。</para>
<programlisting>DISTFILES= source.tar.gz manual.html
EXTRACT_ONLY= source.tar.gz</programlisting>
<para><emphasis>どの</emphasis> <varname>DISTFILES</varname>
も展開すべきでは<emphasis>ない</emphasis>なら、
<varname>EXTRACT_ONLY</varname>
に空文字列を設定してください。</para>
<programlisting>EXTRACT_ONLY=</programlisting>
</sect2>
<sect2 xml:id="porting-patchfiles">
<title><varname>PATCHFILES</varname></title>
<para>その port が配布ファイルの他に FTP や HTTP
で手に入る追加パッチを必要とする場合には、
<varname>PATCHFILES</varname> にはそのパッチのファイル名を、
<varname>PATCH_SITES</varname>
にはそのファイルが置かれているディレクトリの URL
をセットしてください。(書き方は
<varname>MASTER_SITES</varname> と同じです。)</para>
<para>そのパッチに記録されているファイル名に余計なパス名がついていて、
ソースツリーのトップディレクトリ
(つまり <varname>WKRSRC</varname>)
からの相対パスになっていない場合には、
それに応じた <varname>PATCH_DIST_STRIP</varname> を指定してください。
たとえば、パッチ内のすべてのファイル名の先頭に、余計な
<literal>foozolix-1.0/</literal> がついている場合には、
<literal>PATCH_DIST_STRIP=-p1</literal>
としてください。</para>
<para>これらのパッチは圧縮されていても大丈夫です。
ファイル名が <filename>.gz</filename><filename>.Z</filename>
で終わる場合には、自動的に展開されるようになっています。</para>
<para>もしパッチが、ドキュメント等その他のファイルと一緒に
gzip された tar ファイルで配布されている場合には、単に
<varname>PATCHFILES</varname> を使うだけではうまくいきません。
このような場合には、このパッチの tar ファイルの名前と場所を
<varname>DISTFILES</varname>
<varname>MASTER_SITES</varname> に追加しておきます。
それから、<varname>EXTRA_PATCHES</varname>
変数にそれらのパッチを指定すれば、
<filename>bsd.port.mk</filename>
自動的にパッチを適用してくれます。
特に注意が必要なのは、パッチファイルを
<varname>PATCHDIR</varname>
ディレクトリにコピー<emphasis>してはならない</emphasis>ことです
&mdash; (訳注: port が CD-ROM 上に置かれている等の場合には、)
そのディレクトリには書き込みができないかもしれません。</para>
<note>
<para>それが普通の gzip か compress された tar ファイルであれば、
通常のソースファイルと一緒にパッチ適用時までに展開されていますので、
明示的に展開する必要はありません。
もしパッチを <varname>DISTFILES</varname>
に追加した場合には、パッチを含むファイルが展開される際に、
そのディレクトリにある何かを上書きしないように注意してください。
さらに、コピーされたパッチファイルを削除するコマンドを
<buildtarget>pre-clean</buildtarget>
ターゲットに追加することを忘れないでください。</para>
</note>
</sect2>
<sect2 xml:id="porting-master-sites-n">
<title>異なるサイトやサブディレクトリからの複数の配布ファイルまたはパッチ
(<literal>MASTER_SITES:n</literal>)</title>
<para>(これはいささか<quote>高度な話題</quote>です。
この文書を初めて読む人は、
最初はこの節を飛ばしてもよいでしょう)。</para>
<para>この節は <literal>MASTER_SITES:n</literal>
<literal>MASTER_SITES_NN</literal>
と呼ばれる取得方法について説明しています。
ここでは、この方式を <literal>MASTER_SITES:n</literal>
と呼びます。</para>
<para>まず、背景を少し説明しておきましょう。OpenBSD
には、<varname>DISTFILES</varname>
<varname>PATCHFILES</varname>
変数の両方に素敵な機能があります。ファイル、パッチの両方とも、
後ろに <literal>:n</literal> (<literal>n</literal>
<literal>[0-9]</literal> のどれかになります)
をつけてグループを指示できます。たとえば、</para>
<programlisting>DISTFILES= alpha:0 beta:1</programlisting>
<para>OpenBSD では、配布ファイル <filename>alpha</filename>
は、通常の <varname>MASTER_SITES</varname> ではなく
<varname>MASTER_SITES0</varname> に、
<filename>beta</filename><varname>MASTER_SITES1</varname>
に結び付けられます。</para>
<para>これは、正しいダウンロードサイトを際限なく探す羽目になるのを減らせる、
興味深い機能です。</para>
<para><varname>DISTFILES</varname> にファイルが
2 つ指定され、<varname>MASTER_SITES</varname>
20 サイトあって、サイトはものすごく遅く、
<filename>beta</filename><varname>MASTER_SITES</varname>
中のすべてのサイトに置かれていますが、
<filename>alpha</filename>
20 番目のサイトにしかないという場合を考えてください。
メンテナがあらかじめそのことを知っていたら、
すべてのサイトを確認するのは無駄だと思いませんか?
楽しい週末のはじまりというわけにはゆきませんね。</para>
<para>イメージできたら、今度は <varname>DISTFILES</varname>
<varname>MASTER_SITES</varname>
がもっと沢山あるのを想像してください。
<quote>distfiles 調査マイスタ</quote>は、
ネットワーク負荷が緩和されることを喜ぶに違いありません。</para>
<para>次節からは、FreeBSD におけるこのアイディアの実装について説明します。
OpenBSD の考え方を多少改良しています。</para>
<sect3>
<title>簡単な説明</title>
<para>この節では、複数の配布ファイルやパッチを、
異なるサイトやサブディレクトリから細かく分けて取得する簡単な設定を示します。
ここでは、単純化した <literal>MASTER_SITES:n</literal>
の使い方を説明します。ほとんどの場面ではこれで十分です。
さらに詳しいことを知りたければ、次の節をお読みください。</para>
<para>アプリケーションによっては、
いくつもの異なるサイトからダウンロードする複数の配布ファイルからなっているものがあります。
たとえば、<application>Ghostscript</application>
は、中核部のプログラムと、
ユーザのプリンタに応じて使い分けられる多数のドライバファイルからなっています。
このドライバファイルの一部は中核部と共に配布されますが、
多くはさまざまなサイトからダウンロードしなければなりません。</para>
<para>これに対応するため、<varname>DISTFILES</varname>
の各項目の後ろには、コロンと<quote>タグ名</quote>
をつけられるようになっています。<varname>MASTER_SITES</varname>
に設定されているそれぞれのサイトの末尾にも、コロンと、
そのサイトからダウンロードすべきファイルを示すためのタグを加えます。</para>
<para>たとえば、ソースコードが
<filename>source1.tar.gz</filename>
<filename>source2.tar.gz</filename>
2 つに分けられていて、
2 つの別のサイトからダウンロードしなければならないアプリケーションを考えてみましょう。
その port の <filename>Makefile</filename>
には、<xref linkend="ports-master-sites-n-example-simple-use-one-file-per-site"/>
のような行があるとします。</para>
<example xml:id="ports-master-sites-n-example-simple-use-one-file-per-site">
<title>各サイトに 1 つファイルがある場合の、簡単な
<literal>MASTER_SITES:n</literal> の使用法</title>
<programlisting>MASTER_SITES= ftp://ftp.example1.com/:source1 \
ftp://ftp.example2.com/:source2
DISTFILES= source1.tar.gz:source1 \
source2.tar.gz:source2</programlisting>
</example>
<para>複数の配布ファイルに同じタグがついていてもかまいません。
先ほどの例に続いて、3 番目の配布ファイル
<filename>source3.tar.gz</filename> があって、
<systemitem>ftp.example2.com</systemitem> からダウンロードすべきだとしましょう。
<filename>Makefile</filename><xref linkend="ports-master-sites-n-example-simple-use-more-than-one-file-per-site"/>
のようになります。</para>
<example xml:id="ports-master-sites-n-example-simple-use-more-than-one-file-per-site">
<title>各サイトに 1 つ以上ファイルがある場合の、簡単な
<literal>MASTER_SITES:n</literal> の使用法</title>
<programlisting>MASTER_SITES= ftp://ftp.example1.com/:source1 \
ftp://ftp.example2.com/:source2
DISTFILES= source1.tar.gz:source1 \
source2.tar.gz:source2 \
source3.tar.gz:source2</programlisting>
</example>
</sect3>
<sect3>
<title>詳しい説明</title>
<para>分かりました。
前節の例ではあなたの要求を満足できなかったわけですね。
この節では、ファイルの取得を細かく制御する仕組み
<literal>MASTER_SITES:n</literal>
がどう働くかと、これを利用するために
ports をどう変更すればよいかを詳しく説明します。</para>
<orderedlist>
<listitem>
<para>要素の末尾に
<literal>:n</literal>
をつけることができます。
ここで、<replaceable>n</replaceable>
<literal>[^:,]+</literal>
つまり、概念上はいかなる文字と数字からなる文字列でもよいのですが、
われわれとしては、当面は
<literal>[a-zA-Z_][0-9a-zA-Z_]+</literal>
に制限します。</para>
<para>さらに、文字列のマッチは大文字と小文字を区別します。
つまり、<literal>n</literal><literal>N</literal>
は別の文字として扱われます。</para>
<para>しかし、
<literal>default</literal>, <literal>all</literal>,
<literal>ALL</literal>
は特別な意味を与えられているので、
末尾に付加するのには使えません
(これは、<xref linkend="porting-master-sites-n-what-changes-in-port-targets"/>
項で内部的に利用されています)。
さらに、<literal>DEFAULT</literal>
は特別な意味を持つ単語です
(<xref linkend="porting-master-sites-n-DEFAULT-group"/>
の項を確認してください)。</para>
</listitem>
<listitem>
<para><literal>:n</literal> がついた要素は、グループ
<literal>n</literal> に属し、
<literal>:m</literal> がついた要素は、グループ
<literal>m</literal>
に属するということになります。</para>
</listitem>
<listitem xml:id="porting-master-sites-n-DEFAULT-group">
<para>接尾辞がついていない要素はグループに属しません。
これは、特別なグループ <literal>DEFAULT</literal>
に属しているとして扱われます。
要素の後ろに <literal>DEFAULT</literal>
をつけるのは、その要素を <literal>DEFAULT</literal>
とそれ以外のグループに同時に割り当てたいのでなければ、
冗長に過ぎません
(<xref linkend="porting-master-sites-n-comma-operator"/>
の項を確認してください)。</para>
<para>次の例はどちらも同じ意味ですが、
最初の方が好ましいです。</para>
<programlisting>MASTER_SITES= alpha
MASTER_SITES= alpha:DEFAULT</programlisting>
</listitem>
<listitem>
<para>グループは相互排他ではありません。
ひとつの要素が同時に複数のグループに属することができ、
ひとつのグループには複数の要素が属することも、
何も割り当てないこともできます。
同じグループで何回も指定された要素は、
単に複数回指定された要素ということになります。</para>
</listitem>
<listitem xml:id="porting-master-sites-n-comma-operator">
<para>ある要素を同時にいくつものグループに所属させたい時は、
カンマ演算子 (<literal>,</literal>) が使えます。</para>
<para>その都度別の接尾辞をつけて繰り返すかわりに、
一度だけ接尾辞を指定して複数のグループを指定できます。
たとえば、<literal>:m,n,o</literal>
と書くと、その要素はグループ <literal>m</literal>,
<literal>n</literal> および <literal>o</literal>
に属することを示します。</para>
<para>以下の例はすべて同等ですが、
最後の形式がもっともよいでしょう。</para>
<programlisting>MASTER_SITES= alpha alpha:SOME_SITE
MASTER_SITES= alpha:DEFAULT alpha:SOME_SITE
MASTER_SITES= alpha:SOME_SITE,DEFAULT
MASTER_SITES= alpha:DEFAULT,SOME_SITE</programlisting>
</listitem>
<listitem>
<para>任意のグループ内のサイトは、
<varname>MASTER_SORT_AWK</varname>
によって整列されます。
<varname>MASTER_SITES</varname>
<varname>PATCH_SITES</varname>
内のすべてのグループについても同様に整列されます。</para>
</listitem>
<listitem xml:id="porting-master-sites-n-group-semantics">
<para>グループの概念は、変数
<varname>MASTER_SITES</varname>,
<varname>PATCH_SITES</varname>,
<varname>MASTER_SITE_SUBDIR</varname>,
<varname>PATCH_SITE_SUBDIR</varname>,
<varname>DISTFILES</varname> および
<varname>PATCHFILES</varname>
においても、下記の文法に従って使えます。</para>
<orderedlist>
<listitem>
<para><varname>MASTER_SITES</varname>,
<varname>PATCH_SITES</varname>,
<varname>MASTER_SITE_SUBDIR</varname> および
<varname>PATCH_SITE_SUBDIR</varname>
のすべての要素はスラッシュ <literal>/</literal>
記号で終端されていなければなりません。
ある要素がどれかのグループに属しているなら、
グループの接尾辞
<literal>:n</literal>
は、終端記号 <literal>/</literal>
のすぐ後にこなければなりません。
<literal>MASTER_SITES:n</literal>
の仕組みでは、終端記号
<literal>/</literal> があることで、
<literal>:n</literal> が要素の有効な一部である場合と、
<literal>:n</literal> がグループ <literal>n</literal>
を示す場合の混同を避けることができます。
以前は、
<varname>MASTER_SITE_SUBDIR</varname>
<varname>PATCH_SITE_SUBDIR</varname>
要素のいずれにおいても終端記号 <literal>/</literal>
は不要だったので、互換性を保つために、
接尾辞の直前の文字が <literal>/</literal>
でなければ、
要素の接尾辞が <literal>:n</literal> であっても、
グループの接尾語ではなく、
要素の有効な一部分として扱われます。
<xref linkend="ports-master-sites-n-example-detailed-use-master-site-subdir"/>
<xref linkend="ports-master-sites-n-example-detailed-use-complete-example-master-sites"/>
の両方をご覧ください。</para>
<example xml:id="ports-master-sites-n-example-detailed-use-master-site-subdir">
<title><varname>MASTER_SITE_SUBDIR</varname> における
<literal>MASTER_SITES:n</literal> の詳細な使用法</title>
<programlisting>MASTER_SITE_SUBDIR= old:n new/:NEW</programlisting>
<itemizedlist>
<listitem>
<para>グループ <literal>DEFAULT</literal>
に属するディレクトリ -&gt; old:n</para>
</listitem>
<listitem>
<para>グループ <literal>NEW</literal>
に属するディレクトリ -&gt; new</para>
</listitem>
</itemizedlist>
</example>
<example xml:id="ports-master-sites-n-example-detailed-use-complete-example-master-sites">
<title>カンマ演算子、複数のファイル、複数のサイト、
複数のサブディレクトリと合わせた
<literal>MASTER_SITES:n</literal>
の詳細な使用法</title>
<programlisting>MASTER_SITES= http://site1/%SUBDIR%/ http://site2/:DEFAULT \
http://site3/:group3 http://site4/:group4 \
http://site5/:group5 http://site6/:group6 \
http://site7/:DEFAULT,group6 \
http://site8/%SUBDIR%/:group6,group7 \
http://site9/:group8
DISTFILES= file1 file2:DEFAULT file3:group3 \
file4:group4,group5,group6 file5:grouping \
file6:group7
MASTER_SITE_SUBDIR= directory-trial:1 directory-n/:groupn \
directory-one/:group6,DEFAULT \
directory</programlisting>
<para>上の例は、次のような細かく分けた取得を実現します。
サイトは、利用される順番で挙げられています。</para>
<itemizedlist>
<listitem>
<para><filename>file1</filename>
は次のサイトから取得されます。</para>
<itemizedlist>
<listitem>
<para><varname>MASTER_SITE_OVERRIDE</varname></para>
</listitem>
<listitem>
<para>http://site1/directory/</para>
</listitem>
<listitem>
<para>http://site1/directory-one/</para>
</listitem>
<listitem>
<para>http://site1/directory-trial:1/</para>
</listitem>
<listitem>
<para>http://site2/</para>
</listitem>
<listitem>
<para>http://site7/</para>
</listitem>
<listitem>
<para><varname>MASTER_SITE_BACKUP</varname></para>
</listitem>
</itemizedlist>
</listitem>
<listitem>
<para><filename>file2</filename>
は、<filename>file1</filename>
と同じグループに属しているので、
まったく同じように取得されます。</para>
<itemizedlist>
<listitem>
<para><varname>MASTER_SITE_OVERRIDE</varname></para>
</listitem>
<listitem>
<para>http://site1/directory/</para>
</listitem>
<listitem>
<para>http://site1/directory-one/</para>
</listitem>
<listitem>
<para>http://site1/directory-trial:1/</para>
</listitem>
<listitem>
<para>http://site2/</para>
</listitem>
<listitem>
<para>http://site7/</para>
</listitem>
<listitem>
<para><varname>MASTER_SITE_BACKUP</varname></para>
</listitem>
</itemizedlist>
</listitem>
<listitem>
<para><filename>file3</filename>
は次のサイトから取得されます。</para>
<itemizedlist>
<listitem>
<para><varname>MASTER_SITE_OVERRIDE</varname></para>
</listitem>
<listitem>
<para>http://site3/</para>
</listitem>
<listitem>
<para><varname>MASTER_SITE_BACKUP</varname></para>
</listitem>
</itemizedlist>
</listitem>
<listitem>
<para><filename>file4</filename>
は次のサイトから取得されます。</para>
<itemizedlist>
<listitem>
<para><varname>MASTER_SITE_OVERRIDE</varname></para>
</listitem>
<listitem>
<para>http://site4/</para>
</listitem>
<listitem>
<para>http://site5/</para>
</listitem>
<listitem>
<para>http://site6/</para>
</listitem>
<listitem>
<para>http://site7/</para>
</listitem>
<listitem>
<para>http://site8/directory-one/</para>
</listitem>
<listitem>
<para><varname>MASTER_SITE_BACKUP</varname></para>
</listitem>
</itemizedlist>
</listitem>
<listitem>
<para><filename>file5</filename>
は次のサイトから取得されます。</para>
<itemizedlist>
<listitem>
<para><varname>MASTER_SITE_OVERRIDE</varname></para>
</listitem>
<listitem>
<para><varname>MASTER_SITE_BACKUP</varname></para>
</listitem>
</itemizedlist>
</listitem>
<listitem>
<para><filename>file6</filename>
は次のサイトから取得されます。</para>
<itemizedlist>
<listitem>
<para><varname>MASTER_SITE_OVERRIDE</varname></para>
</listitem>
<listitem>
<para>http://site8/directory-one/</para>
</listitem>
<listitem>
<para><varname>MASTER_SITE_BACKUP</varname></para>
</listitem>
</itemizedlist>
</listitem>
</itemizedlist>
</example>
</listitem>
</orderedlist>
</listitem>
<listitem>
<para><varname>MASTER_SITE_SOURCEFORGE</varname>
のように、<filename>bsd.sites.mk</filename>
で定義される特別な変数をグループに割り当てるにはどうすればよいですか?</para>
<para><xref linkend="ports-master-sites-n-example-detailed-use-master-site-sourceforge"/>
をご覧ください。</para>
<example xml:id="ports-master-sites-n-example-detailed-use-master-site-sourceforge">
<title><varname>MASTER_SITE_SOURCEFORGE</varname>
と合わせた <literal>MASTER_SITES:n</literal>
の詳しい使用法</title>
<programlisting>MASTER_SITES= http://site1/ ${MASTER_SITE_SOURCEFORGE:S/$/:sourceforge,TEST/}
DISTFILES= something.tar.gz:sourceforge</programlisting>
</example>
<para><filename>something.tar.gz</filename>
は、<varname>MASTER_SITE_SOURCEFORGE</varname>
に含まれるあらゆるサイトから取得されます。</para>
</listitem>
<listitem>
<para>これを <varname>PATCH*</varname>
変数と組み合わせて使うにはどうすればよいでしょうか?</para>
<para>すべての例で <varname>MASTER*</varname>
変数を使っていますが、<xref linkend="ports-master-sites-n-example-detailed-use-patch-sites"/>
にあるように、<varname>PATCH*</varname>
変数に対してもまったく同じように働きます。</para>
<example xml:id="ports-master-sites-n-example-detailed-use-patch-sites">
<title><varname>PATCH_SITES</varname> と合わせた
<literal>MASTER_SITES:n</literal> の簡単な使用法</title>
<programlisting>PATCH_SITES= http://site1/ http://site2/:test
PATCHFILES= patch1:test</programlisting>
</example>
</listitem>
</orderedlist>
</sect3>
<sect3>
<title>ports
について何が変更され、何が変わらないのでしょうか?</title>
<orderedlist numeration="lowerroman">
<listitem>
<para>現在のすべての ports はそのまま変わりません。
<literal>MASTER_SITES:n</literal>
機能のコードは、<xref linkend="porting-master-sites-n-group-semantics"/>
で述べた文法に従う
<literal>:n</literal>
のような形式が後ろについた要素がある場合だけ動作します。</para>
</listitem>
<listitem xml:id="porting-master-sites-n-what-changes-in-port-targets">
<para>port を make する際のターゲットにも変更はありません。
<buildtarget>checksum</buildtarget>,
<buildtarget>makesum</buildtarget>,
<buildtarget>patch</buildtarget>,
<buildtarget>configure</buildtarget>,
<buildtarget>build</buildtarget> 等です。
もちろん、<buildtarget>do-fetch</buildtarget>,
<buildtarget>fetch-list</buildtarget>,
<buildtarget>master-sites</buildtarget> それから
<buildtarget>patch-sites</buildtarget>
は例外です。</para>
<itemizedlist>
<listitem>
<para><buildtarget>do-fetch</buildtarget>
は、新しくグループ分けの接尾辞のついた
<varname>DISTFILES</varname>
<varname>PATCHFILES</varname>
を設定します。それぞれが、対応する
<varname>MASTER_SITES</varname>
<varname>PATCH_SITES</varname>
を利用し、さらに対応する
<varname>MASTER_SITE_SUBDIR</varname>
<varname>PATCH_SITE_SUBDIR</varname>
を利用します。<xref linkend="ports-master-sites-n-example-detailed-use-complete-example-master-sites"/>
をご覧ください。</para>
</listitem>
<listitem>
<para><buildtarget>fetch-list</buildtarget>
は、<buildtarget>do-fetch</buildtarget>
と同じようにグループを利用するということを除いて、以前の
<buildtarget>fetch-list</buildtarget>
のように動作します。</para>
</listitem>
<listitem>
<para><buildtarget>master-sites</buildtarget> および
<buildtarget>patch-sites</buildtarget> は、
(古いバージョンと互換性がなくなり)
<literal>DEFAULT</literal>
グループの要素を返すだけになっています。
実際は、それぞれ
<buildtarget>master-sites-default</buildtarget> および
<buildtarget>patch-sites-default</buildtarget>
というターゲットを実行します。</para>
<para>さらに、
<buildtarget>MASTER_SITES</buildtarget>
<buildtarget>PATCH_SITES</buildtarget>
を直接確認するよりも、
<buildtarget>master-sites-all</buildtarget> または
<buildtarget>patch-sites-all</buildtarget>
のどちらかのターゲットを使う方がよいです。
また、将来のバージョンでも直接確認ができるかどうかは保証されていません。
これら新規 port ターゲットについては、<xref linkend="porting-master-sites-n-new-port-targets-master-sites-all"/>
の項をご確認ください。</para>
</listitem>
</itemizedlist>
</listitem>
<listitem>
<para>新規の port ターゲット</para>
<orderedlist>
<listitem>
<para><varname>MASTER_SITES</varname> および
<varname>PATCH_SITES</varname>
のそれぞれについて、
グループ <replaceable>n</replaceable> の要素を表示する
<buildtarget>master-sites-<replaceable>n</replaceable></buildtarget>
および
<buildtarget>patch-sites-<replaceable>n</replaceable></buildtarget>
ターゲットがあります。たとえば、
<buildtarget>master-sites-DEFAULT</buildtarget> および
<buildtarget>patch-sites-DEFAULT</buildtarget>
のいずれも <literal>DEFAULT</literal>
グループの要素を返し、
<buildtarget>master-sites-test</buildtarget> および
<buildtarget>patch-sites-test</buildtarget>
<literal>test</literal>
グループの要素を返します。</para>
</listitem>
<listitem xml:id="porting-master-sites-n-new-port-targets-master-sites-all">
<para>以前の
<buildtarget>master-sites</buildtarget> および
<buildtarget>patch-sites</buildtarget>
が行っていた作業を行う
<buildtarget>master-sites-all</buildtarget> および
<buildtarget>patch-sites-all</buildtarget>
という新たなターゲットがあります。
これらのターゲットは、
すべてのグループの要素をすべてが同じグループに属しているかのように返します。
ただし、
<buildtarget>master-sites-all</buildtarget> および
<buildtarget>patch-sites-all</buildtarget>
のそれぞれについて、
<varname>DISTFILES</varname>
<varname>PATCHFILES</varname>
で定義されているグループと同じ数だけ
<varname>MASTER_SITE_BACKUP</varname>
<varname>MASTER_SITE_OVERRIDE</varname>
を表示します。</para>
</listitem>
</orderedlist>
</listitem>
</orderedlist>
</sect3>
</sect2>
<sect2>
<title><varname>DIST_SUBDIR</varname></title>
<para><filename>/usr/ports/distfiles</filename>
ディレクトリ内をあまり散らかさないようにしてください。
たくさんのファイルを取ってくる port
や、他の port と名前の衝突が起きる恐れのあるファイル
(<filename>Makefile</filename> など)
がある場合には、
<varname>DIST_SUBDIR</varname> に port の名前
(<literal>${PORTNAME}</literal>
<literal>${PKGNAMEPREFIX}${PORTNAME}</literal>
を使うといいでしょう)
を入れてください。すると <varname>DISTDIR</varname>
がデフォルトの
<filename>/usr/ports/distfiles</filename> から
<filename>/usr/ports/distfiles/DIST_SUBDIR</filename>
に変更され、
取ってきたファイルはすべてそのサブディレクトリの中に置かれるようになります。</para>
<para>また、
ファイルを取ってくるときにバックアップサイトとして使われる
<filename>ftp.FreeBSD.org</filename>
のディレクトリ名にもこの変数の値が使われます
(<varname>Makefile</varname> の中で
<varname>DISTDIR</varname> を明示的に指定した場合、
ローカルのファイルを置くところは変わりますが、
このサイトのディレクトリ名は変わりません。
必ず <varname>DIST_SUBDIR</varname>
を使うようにしてください)。</para>
<note>
<para>この変数は <filename>Makefile</filename>
中で明示的に指定された
<varname>MASTER_SITES</varname>
には影響しません。</para>
</note>
</sect2>
</sect1>
<sect1 xml:id="makefile-maintainer">
<title><varname>MAINTAINER</varname></title>
<para>あなたのメールアドレスをここに入れてください。
お願いします。
<!-- smiley --><emphasis remap="tt">:-)</emphasis></para>
<para><varname>MAINTAINER</varname>
の値は、コメント部のない単一のアドレスしか受け付けられません。
<literal>user@hostname.domain</literal>
という形式を利用してください。この項目には、
あなたの本名などの説明用のテキストは一切いれないでください。
(そうしても、ただ <filename>bsd.port.mk</filename>
が混乱するだけです)。そういう情報は
<filename>pkg-descr</filename> に書いてください。</para>
<para>保守担当者 (maintainer) の責任に関する詳細説明は、
<link xlink:href="../developers-handbook/policies.html#POLICIES-MAINTAINER">
Makefile 中の MAINTAINER</link>
セクションを参照してください。</para>
<para>Port のメンテナがユーザからの更新要求に
(主な公休日を除いて) 2 週間返答しなかったら、
保守担当者の持ち時間が切れたとみなして、
保守担当者の明示的な了承なしに更新して構いません。
保守担当者が 3 ヶ月以内に返答しない場合は、
その保守担当者は無断で不在にしているとみなして、
問題となっている port の保守担当者を入れ替えても構いません。
例外となるは、&a.portmgr; または &a.security-officer;
が保守しているものです。このグループが保守している port
に対しては許可を得ずにコミットしてはいけません。</para>
<para>&a.portmgr; は、何か理由があれば、
誰かを保守担当から外したり、別の方を担当者にする権利を持ちます。
&a.security-officer; は、セキュリティ上の理由で、
保守担当者の権限を剥奪したり担当者を変更する権利を持ちます。</para>
</sect1>
<sect1 xml:id="makefile-comment">
<title><varname>COMMENT</varname></title>
<para>その port の 1 行の説明です。
コメントにはパッケージ名 (やソフトウェアのバージョン)
<emphasis>入れないでください</emphasis>
コメントは大文字で始め、最後にピリオドは付けないでください。
たとえば、こんな具合です。</para>
<programlisting>COMMENT= A cat chasing a mouse all over the screen</programlisting>
<para><filename>Makefile</filename> 中で、
COMMENT 変数は MAINTAINER 変数の直後においてください。</para>
<para>COMMENT 行は、port
の 1 行の要約としてユーザに示されるので、
70 文字未満に抑えるようにしてください。</para>
</sect1>
<sect1 xml:id="makefile-depend">
<title>依存関係</title>
<para>多くの port は他の port に依存しています。
必要なものすべてがユーザのマシン上に存在することを
保証するために使用可能な、7 つの変数が用意されています。
よくあるケースのためにあらかじめ設定された依存変数に加え、
いくつかの依存関係の制御のための変数があります。</para>
<sect2>
<title><varname>LIB_DEPENDS</varname></title>
<para>その port が必要とする共有ライブラリを、この変数で指定します。
(訳注: libc 等、標準のライブラリは指定する必要がありません。)
これは <replaceable>lib</replaceable>:<replaceable>dir</replaceable><optional>:target</optional> という
組のリストです。
<replaceable>lib</replaceable> が共有ライブラリの名前、
<replaceable>dir</replaceable>
そのライブラリが見つからない場合に
インストールされる port のディレクトリ、
<replaceable>target</replaceable>
そのディレクトリで呼ばれるターゲットです。
たとえば、
<programlisting>LIB_DEPENDS= jpeg.9:${PORTSDIR}/graphics/jpeg:install</programlisting>
と指定されていた場合、まずメジャーバージョンが 9 の jpeg
共有ライブラリがインストールされているかどうかを確認します。
インストールされていない場合には、ports ツリーの
<filename>graphics/jpeg</filename> サブディレクトリに移動し、
<replaceable>target</replaceable>
のコンパイルとインストールを行ないます。
<replaceable>target</replaceable> の部分は、
それが <varname>DEPENDS_TARGET</varname>
(デフォルトでは <literal>install</literal>) と
等しいときには省略することができます。</para>
<note>
<para>先頭の <replaceable>lib</replaceable> の部分は
<command>ldconfig -r | grep -wF</command> への引数になります。
この変数には正規表現を入れないようにしてください。
</para>
</note>
<para>
この依存関係のチェックは、
<buildtarget>extract</buildtarget> ターゲットと
<buildtarget>install</buildtarget> ターゲットの中で、2 回行なわれます。
(訳注: これは、その port
をビルドするマシンとインストールされるマシンが違う場合、
どちらのマシンでもそのライブラリが利用できることを確認するためです)。
同様に、依存するライブラリの名前は package 中にも書き込まれていて、
&man.pkg.add.1;
実行時にそのライブラリがユーザのシステムに存在していなければ、
自動的にインストールされます。</para>
</sect2>
<sect2>
<title><varname>RUN_DEPENDS</varname></title>
<para>この port の実行時に必要となるプログラム、
またはファイルがあるときにはこの変数で指定します。これは
<replaceable>path</replaceable>:<replaceable>dir</replaceable><optional>:target</optional>
という組のリストです。
<replaceable>path</replaceable> がファイルまたはプログラムの名前、
<replaceable>dir</replaceable>
が それが見つからない場合にインストールされる port のディレクトリ、
<replaceable>target</replaceable>
が そのディレクトリで呼ばれるターゲットです。
<replaceable>path</replaceable> の最初の文字がスラッシュ
(<literal>/</literal>) の場合にはファイルかディレクトリとみなし、
存在するかどうか
<command>test -e</command> を使ってチェックします。
そうでない場合には実行可能ファイルであると考えて、
そのプログラムがユーザのサーチパス上にあるかどうか
<command>which -s</command> を使って確認します。</para>
<para>たとえば Makefile に以下のように書いてあるとします。</para>
<programlisting>RUN_DEPENDS= ${LOCALBASE}/etc/innd:${PORTSDIR}/news/inn \
wish8.0:${PORTSDIR}/x11-toolkits/tk80</programlisting>
<para>まず、<filename>/usr/local/etc/innd</filename>
というファイルかディレクトリが存在するか確認します。
存在しない場合には、ports ツリーの
<filename>news/inn</filename> というサブディレクトリで
ビルドとインストールを行ないます。
さらに、<command>wish8.0</command>
というプログラムがユーザのサーチパス中にあるかどうか探します。
ない場合には同じく ports ツリーの
<filename>x11-toolkits/tk80</filename>
というサブディレクトリでコンパイルとインストールを行ないます。</para>
<note>
<para>この例で、<command>innd</command> は実際にはプログラムです。
このように、プログラムであっても一般ユーザのサーチパスに
含まれているとは考えにくいところに置かれているものの場合には、
絶対パスで指定してください。</para>
</note>
<para>この依存関係は <buildtarget>install</buildtarget>
ターゲット中でチェックされます。
また、&man.pkg.add.1; によるインストールの際に、その package
が依存するものがユーザのシステムに存在しない場合には自動的に追加インストールできるように、
依存するものの名前も package 中に記録されます。
<replaceable>target</replaceable> の部分が
<varname>DEPENDS_TARGET</varname> と同じ場合には、
<replaceable>target</replaceable> の部分を省略することができます。
</para>
</sect2>
<sect2>
<title><varname>BUILD_DEPENDS</varname></title>
<para>この port のビルド時に必要となるプログラム、
またはファイルがあるときにはこの変数で指定します。
<varname>RUN_DEPENDS</varname> と同様に、これは
<replaceable>path</replaceable>:<replaceable>dir</replaceable><optional>:target</optional>
という組のリストです。たとえば、
<programlisting>BUILD_DEPENDS=unzip:${PORTSDIR}/archivers/unzip</programlisting>
と指定されていた場合、まず <command>unzip</command>
という名前のプログラムがインストールされているかどうかを確認します。
インストールされていない場合には ports ツリーの
<filename>archivers/unzip</filename> サブディレクトリに移動し、
ビルドとインストールを行ないます。</para>
<note>
<para>ここで言う<quote>ビルド</quote>とは、
ファイルの展開からコンパイルまでのすべての処理を意味します。
この依存関係は、<buildtarget>extract</buildtarget>
ターゲットの中でチェックされます。
<replaceable>target</replaceable> の部分は、
<varname>DEPENDS_TARGET</varname>
と同じ場合には省略することができます。</para>
</note>
</sect2>
<sect2>
<title><varname>FETCH_DEPENDS</varname></title>
<para>この port を取ってくるのに必要となるプログラム、
またはファイルがあるときにはこの変数で指定します。
上の二つと同様に、これは
<replaceable>path</replaceable>:<replaceable>dir</replaceable><optional>:target</optional>
という組のリストです。たとえば、
<programlisting>FETCH_DEPENDS=ncftp2:${PORTSDIR}/net/ncftp2</programlisting>
と指定されていれば、<command>ncftp2</command>
という名前のプログラムを探します。
見つからない場合には、ports ツリーの
<filename>net/ncftp2</filename>
サブディレクトリでビルドとインストールを行ないます。</para>
<para>この依存関係は <buildtarget>fetch</buildtarget>
ターゲット中でチェックされます。
<replaceable>target</replaceable> の部分は、
<varname>DEPENDS_TARGET</varname>
と同じ場合には省略することができます。</para>
</sect2>
<sect2>
<title><varname>EXTRACT_DEPENDS</varname></title>
<para>この変数には、この port
の展開に必要な実行ファイルや、他のファイルを指定します。
前の変数と同じく、これは
<replaceable>path</replaceable>:<replaceable>dir</replaceable><optional>:target</optional>
のタプルの一覧です。たとえば、<programlisting>EXTRACT_DEPENDS=
unzip:${PORTSDIR}/archivers/unzip</programlisting>
は、<command>unzip</command>
という実行形式のファイルがあるかどうか確認し、
見つからなければ、ports ツリーの
<filename>archivers/unzip</filename>
サブディレクトリに降りてビルドおよびインストールを行います。</para>
<para>依存関係は <buildtarget>extract</buildtarget>
ターゲットにおいて確認されます。
<replaceable>target</replaceable> 部分が
<varname>DEPENDS_TARGET</varname>
と同じなら、省いて構いません。</para>
<note>
<para>この変数は、展開が働いておらず
(デフォルトでは <command>gzip</command> を仮定しています)、
<xref linkend="use-vars"/> で説明されている
<varname>USE_ZIP</varname><varname>USE_BZIP2</varname>
を使っても動かない場合にだけ使ってください。</para>
</note>
</sect2>
<sect2>
<title><varname>PATCH_DEPENDS</varname></title>
<para>この変数は、この port
がパッチを当てる際に必要とする実行ファイルや他のファイルを指定します。
前の変数と同じく、これは
<replaceable>path</replaceable>:<replaceable>dir</replaceable><optional>:target</optional>
のタプルの一覧です。たとえば、<programlisting> PATCH_DEPENDS=
${NONEXISTENT}:${PORTSDIR}/java/jfc:extract
</programlisting> は、ports ツリーの
<filename>java/jfc</filename> サブディレクトリに移動して、
ビルドおよびインストールを行います。</para>
<para>依存関係は、<buildtarget>patch</buildtarget>
ターゲットにおいて確認されます。<replaceable>target</replaceable>
部分が <varname>DEPENDS_TARGET</varname>
と同じなら省略して構いません。</para>
</sect2>
<sect2>
<title><varname>DEPENDS</varname></title>
<para>上記のいずれにもあてはまらないような依存関係がある場合、
または他の port がインストールされているだけではなく
ソースが展開されている必要がある場合には、この変数を使います。
これは上記の四つと違い、特に<quote>確認</quote>するものが
ありませんので、
<replaceable>dir</replaceable><optional>:target</optional>
という形式のリストになります。
<replaceable>target</replaceable> の部分は
<varname>DEPENDS_TARGET</varname>
と同じ場合には省略することができます。</para>
</sect2>
<sect2 xml:id="use-vars">
<title><varname>USE_<replaceable>*</replaceable></varname></title>
<para>多くの ports に共通の依存関係をカプセル化するために、
いくつもの変数が存在しています。</para>
<table frame="none">
<title><varname>USE_<replaceable>*</replaceable></varname>
変数</title>
<tgroup cols="2">
<thead>
<row>
<entry>変数</entry>
<entry>意味</entry>
</row>
</thead>
<tbody>
<row>
<entry><varname>USE_BZIP2</varname></entry>
<entry>その port の tarball は <command>bzip2</command>
で圧縮されています。</entry>
</row>
<row>
<entry><varname>USE_ZIP</varname></entry>
<entry>その port の tarball は <command>zip</command>
で圧縮されています。</entry>
</row>
<row>
<entry><varname>USE_GMAKE</varname></entry>
<entry>その port をビルドするのに <command>gmake</command>
が必要です。</entry>
</row>
<row>
<entry><varname>USE_PERL5</varname></entry>
<entry>その port をビルドしてインストールするのに
<literal>perl 5</literal> が必要です。
<literal>perl</literal>
に関連して設定可能な他の変数については
<xref linkend="using-perl"/> をご覧ください。</entry>
</row>
<row>
<entry><varname>USE_X_PREFIX</varname></entry>
<entry>その port は <varname>PREFIX</varname> ではなく
<varname>X11BASE</varname> にインストールされます。
X11 に関連して設定可能な他の変数については、
<xref linkend="using-x11"/> をご覧ください。</entry>
</row>
<row>
<entry><varname>USE_AUTOMAKE</varname></entry>
<entry>その port のビルドに GNU <command>automake</command>
が使われます。<command>automake</command>
に関わる他に設定可能な変数については、
<xref linkend="using-automake"/> をご覧ください。</entry>
</row>
<row>
<entry><varname>USE_AUTOCONF</varname></entry>
<entry>その port のビルドに GNU <command>autoconf</command>
が使われます。<command>autoconf</command>
に関わる他に設定可能な変数については、
<xref linkend="using-automake"/> をご覧ください。</entry>
</row>
<row>
<entry><varname>USE_LIBTOOL</varname></entry>
<entry>その port のビルドに GNU <command>libtool</command>
が使われます。<command>libtool</command>
に関わる他に設定可能な変数については、
<xref linkend="using-automake"/> をご覧ください。</entry>
</row>
<row>
<entry><varname>GMAKE</varname></entry>
<entry><command>gmake</command>
<envar>PATH</envar> に入っていない場合のフルパス</entry>
</row>
<row>
<entry><varname>USE_BISON</varname></entry>
<entry>その port のビルドに <command>bison</command>
が使われます。</entry>
</row>
<row>
<entry><varname>USE_SDL</varname></entry>
<entry>その port のビルドや実行に
<literal>SDL</literal> が使われます。
<varname>USE_SDL</varname> の使い方について、詳しくは
<xref linkend="using-sdl"/> をご覧ください。</entry>
</row>
<row>
<entry><varname>NO_INSTALL_MANPAGES</varname></entry>
<entry><buildtarget>install.man</buildtarget>
ターゲットを使いません。</entry>
</row>
</tbody>
</tgroup>
</table>
<para>その ports が X Window System を必要とするのであれば、
<literal>USE_XLIB=yes</literal> を定義してください
(これは <varname>USE_IMAKE</varname>
が定義されていれば自動的に定義されます)。
BSD <command>make</command> ではなく
GNU <command>make</command> を必要とする場合には
<literal>USE_GMAKE=yes</literal> を、
GNU autoconf を実行する必要がある場合には
<literal>USE_AUTOCONF=yes</literal> を、
最新の qt toolkit を使用する場合には
<literal>USE_QT=yes</literal> を、
<literal>perl</literal> 言語のバージョン 5 を必要とする場合には
<literal>USE_PERL5=yes</literal> を定義してください
(特に最後のものは重要です。
FreeBSD のバージョンにより、基本システムに
<literal>perl5</literal>
が含まれていたり、いなかったりします)。</para>
</sect2>
<sect2>
<title>依存関係に関する注意</title>
<para>上で述べたように、依存する ports
が必要になったときに呼ばれるデフォルトのターゲットは
<buildtarget>DEPENDS_TARGET</buildtarget>
で、そのデフォルトは <literal>install</literal> です。
これはユーザが使用する変数であり、
port の <filename>Makefile</filename> で定義するものではありません。
もし、その port が特別な方法で依存関係を扱う必要がある場合には、
<varname>DEPENDS_TARGET</varname> を再定義するのではなく
<varname>*_DEPENDS</varname> 変数の
<literal>:target</literal> 部分を使用してください。</para>
<para><command>make clean</command> と入力したときには、
その port が依存する port も自動的に clean されます。
そうならないようにしたい場合には、
環境変数 <varname>NOCLEANDEPENDS</varname>
を設定してください。KDE, GNOME や Mozilla
のように、再ビルドするのに時間がかかる port
に依存している場合は特に望ましいかもしれません。</para>
<para>無条件に他の port に依存させるには、
<varname>BUILD_DEPENDS</varname>
<varname>RUN_DEPENDS</varname> の最初のフィールドに
<varname>${NONEXISTENT}</varname> という変数を指定してください。
これは、他の port のソースが必要なときのみ使用してください。
ターゲットも指定することで、
コンパイルの時間を節約できる場合もあります。
たとえば
<programlisting>BUILD_DEPENDS= ${NONEXISTENT}:${PORTSDIR}/graphics/jpeg:extract</programlisting>
とすると、常に <literal>jpeg</literal> port
のディレクトリに行ってソースの展開を行ないます。</para>
<para>あなたがやりたいことが他の方法ではできない場合以外には
<varname>DEPENDS</varname> を使わないでください。
これは常に他の port の作成を行ない (さらにデフォルトでは
インストールも行ない)、package まで作成します。
この動作が本当に所望のものでしたら、
それを <literal>BUILD_DEPENDS</literal>
<literal>RUN_DEPENDS</literal> に書くべきでしょう
&mdash; 少なくとも意図を明確にすることができます。</para>
</sect2>
<sect2>
<title>オプション選択可能な依存ライブラリ</title>
<para>巨大なアプリケーションの中には、
複数のコンフィギュレーションでビルドすることができるものがあります。
つまり、いくつもの外部ライブラリやアプリケーションの中の、
あるものが利用可能な場合に、
それを拡張機能として使用するように設定することができるということです。
それらのライブラリやアプリケーションを、
必ずしも すべてのユーザが必要としているわけではありませんので、ports
システムではどのコンフィギュレーションがビルドされるべきかを
port 作者が決めるために使えるフックを用意しています。
これらを適切にサポートすることにより、ユーザをハッピーにしたり、
port 1 つ分のコストで 2 つまたはそれ以上の
port を提供するのと同様の効率化を行なうことが可能です。</para>
<para>これらのフックのうちで最も簡単に使えるものは
<varname>WITHOUT_X11</varname> でしょう。
その port が X Window System のサポートありと、
サポートなしの設定でビルドできるのであれば、
通常は X Window System サポートありでビルドするべきでしょう。
ビルド時に <varname>WITHOUT_X11</varname> が定義されていれば、
その時は X Window System サポートなしのバージョンが
ビルドされるべきです。</para>
<para>GNOME 環境の様々なパーツも、そのようなノブ (フック)
を持っていますが、それらは幾分使いにくいものです。
<filename>Makefile</filename> 中で その目的に使用される変数は
<varname>WANT_*</varname><varname>HAVE_*</varname> になります。
そのアプリケーションが、
以下に示されている依存ライブラリの一つについて、
サポートあり、なしの両方でビルドできる場合、
<filename>Makefile</filename> には <varname>WANT_PKG</varname>
をセットする必要があります。
そして、ビルド時に <varname>HAVE_PKG</varname> が定義されていれば
<varname>PKG</varname> を使うバージョンがビルドされることになります。</para>
<para>現在、このような形でサポートされている
<varname>WANT_*</varname> 変数は、
<varname>WANT_GLIB</varname>, <varname>WANT_GTK</varname>,
<varname>WANT_ESOUND</varname>, <varname>WANT_IMLIB</varname>,
そして <varname>WANT_GNOME</varname> です。</para>
</sect2>
<sect2>
<title>致命的な依存の循環</title>
<important>
<para>Ports ツリーに循環する依存性を持ち込まないでください!</para>
</important>
<para>Ports の構築技術は循環依存性を許容していません。
循環依存させてしまうと、たちまちどこかの誰かがインストールしている
FreeBSD を駄目にしてしまい、その数はまたたく間に増えて行きます。
この問題は見付けるのが非常に難しいです。
問題がありそうな場合は、その変更を行う前に
<command>cd /usr/ports; make index</command>
を実行するようにしてください。
この処理は古いマシンではかなり遅いかもしれませんが、
(あなたも含めて)
多くの人がその処理を行って嘆くことにならずに済ませられるでしょう。</para>
</sect2>
</sect1>
<sect1 xml:id="makefile-wrkdir">
<title>作業ディレクトリの指定</title>
<para>それぞれの port は作業ディレクトリに展開されるので、
作業ディレクトリは書き込み可能でなければなりません。
Ports システムは、デフォルトでは
<varname>DISTFILES</varname>
<literal>${DISTNAME}</literal>
というディレクトリに展開されると想定します。
つまり、次のように設定していたら、</para>
<programlisting>PORTNAME= foo
PORTVERSION= 1.0</programlisting>
<para>その port の配布ファイルの内容は、最上位のディレクトリが
<filename>foo-1.0</filename> で、
残りのファイルはそのディレクトリの下に置かれているということです。</para>
<para>そうでない場合に上書きできる変数がたくさんあります。</para>
<sect2>
<title><varname>WRKSRC</varname></title>
<para>この変数は、
アプリケーションの配布ファイルが展開された時に作成されるディレクトリの名称を示します。
前の例で、(<filename>foo-1.0</filename> ではなく)
<filename>foo</filename> というディレクトリに展開されるなら、</para>
<programlisting>WRKSRC= ${WRKDIR}/foo</programlisting>
<para>または、</para>
<programlisting>WRKSRC= ${WRKDIR}/${PORTNAME}</programlisting>
<para>と書いてください。</para>
</sect2>
<sect2>
<title><varname>NO_WRKSUBDIR</varname></title>
<para>その port がサブディレクトリに展開しないのであれば、
それを示すために <varname>NO_WRKSUBDIR</varname>
を設定してください。</para>
<programlisting>NO_WRKSUBDIR= yes</programlisting>
</sect2>
</sect1>
<sect1 xml:id="conflicts">
<title><varname>CONFLICTS</varname></title>
<para>あなたが作成している package が他の packageと
(ファイルの衝突や実行時の非互換性により)
共存できないのであれば、<varname>CONFLICTS</varname>
変数にその package の名称を挙げてください。
<literal>*</literal><literal>?</literal>
のようなシェルの補完が利用できます。package 名は
<filename>/var/db/pkg</filename>
にあるのと同じ形式で並べてください。</para>
</sect1>
<sect1 xml:id="makefile-build">
<title>ビルドのメカニズム</title>
<para>そのソフトウェアがビルドの際に GNU <command>make</command>
を使う場合には、<literal>USE_GMAKE=yes</literal> をセットしてください。
<command>configure</command> を使う場合には、
<literal>HAS_CONFIGURE=yes</literal> をセットしてください。
GNU <command>configure</command> を使う場合には、
<literal>GNU_CONFIGURE=yes</literal> をセットしてください (これにより
<literal>HAS_CONFIGURE</literal> もセットされます)。
<command>configure</command> に追加の引数を渡したい場合には、
追加部分を <varname>CONFIGURE_ARGS</varname> に指定してください。
(デフォルトの引数リストは、GNU <command>configure</command> では
<literal>--prefix=&dollar;{PREFIX}</literal> に、
GNU でない <command>configure</command> では空リストになります。)
GNU <command>autoconf</command> を使う場合には、
<literal>USE_AUTOCONF=yes</literal> をセットしてください。
これにより <varname>GNU_CONFIGURE</varname> もセットされ、
<command>configure</command> を実行する前に
<command>autoconf</command> が実行されます。</para>
<note>
<para>もしそのパッケージが GNU <command>configure</command>
を使っていて、作成された実行形式のファイルが
<filename>i386-portbld-freebsd4.7-</filename><replaceable>appname</replaceable>
のような<quote>奇妙な</quote>名称だった場合は、さらに
<varname>CONFIGURE_TARGET</varname>
を上書きして、新しいバージョンの <command>autoconf</command>
で生成されたスクリプトが要求する方法でターゲットを指定する必要があります。
<filename>Makefile</filename>
<literal>GNU_CONFIGURE=yes</literal>
行のすぐ後に次の行を追加してください。</para>
<para>
<literal>CONFIGURE_TARGET=--build=${MACHINE_ARCH}-portbld-freebsd${OSREL}</literal>
</para>
</note>
<para>そのソフトウェアが X Window System のアプリケーションなどで、
<command>imake</command> を使って <filename>Imakefile</filename> から
<filename>Makefile</filename> を作成する場合には、
<literal>USE_IMAKE=yes</literal> を指定してください。
そうするとコンフィグレーションステージで自動的に
<command>xmkmf -a</command> が実行されます。
もし <option>-a</option> フラグが問題を引き起こすなら、
さらに <literal>XMKMF=xmkmf</literal> をセットしてください。
もし、その port が <command>imake</command> を使用するけれども
<buildtarget>install.man</buildtarget> ターゲットを持たない場合には、
<literal>NO_INSTALL_MANPAGES=yes</literal> をセットしてください。
ついでに、そのソフトウェアの作者を探し出して八つ裂きにするといいでしょう。
<!-- smiley --><emphasis>(-_-#)</emphasis></para>
<para>そのソフトウェアの元々の <filename>Makefile</filename>
<buildtarget>all</buildtarget>
以外のものをメインのターゲットとしている場合には、それを
<varname>ALL_TARGET</varname> に指定してください。
<buildtarget>install</buildtarget>
<varname>INSTALL_TARGET</varname> も同様です。</para>
</sect1>
</chapter>
<chapter xml:id="special">
<title>特別な配慮</title>
<para>port を作成する場合、
考慮しなくてはいけないことが他にもいくつかあります。
このセクションでは、それらのうちでも特によくあることについて説明します。</para>
<sect1 xml:id="porting-shlibs">
<title>共有ライブラリ</title>
<para>その port が共有ライブラリのインストールを行なう場合、
make 変数 <varname>INSTALLS_SHLIB</varname> を定義してください。
これにより、<filename>bsd.port.mk</filename>
<buildtarget>post-install</buildtarget>
ターゲットの実行時に新しいライブラリがインストールされたディレクトリ
(通常は <filename>PREFIX/lib</filename>) に
<literal>&dollar;{LDCONFIG} -m</literal> を実行し、
共有ライブラリキャッシュへの登録が行なわれるようになります。
また、この変数が定義されている場合、共有ライブラリを
インストールしたユーザが それをすぐに使い始められるように、
また、削除の際には そのライブラリが まだ存在していると
システムに誤認されないように、
適切な <literal>@exec /sbin/ldconfig -m</literal>
<literal>@unexec /sbin/ldconfig -R</literal> のペアが
<filename>pkg-plist</filename> ファイルに
指定されているように扱われます。</para>
<para>必要であれば、
共有ライブラリがインストールされるディレクトリのリストを格納する
make 変数 <varname>LDCONFIG_DIRS</varname> を定義することにより、
新しいライブラリがインストールされるデフォルトの位置を上書きすることも可能です。
例えば、その port が共有ライブラリを
<filename>PREFIX/lib/foo</filename>
<filename>PREFIX/lib/bar</filename>
インストールする場合、<filename>Makefile</filename>
で以下の記述を使用することができます:</para>
<programlisting>INSTALLS_SHLIB= yes
LDCONFIG_DIRS= %%PREFIX%%/lib/foo %%PREFIX%%/lib/bar</programlisting>
<para><filename>pkg-plist</filename> の他の部分と同様に、
<varname>LDCONFIG_DIRS</varname> の内容も &man.sed.1;
による処理が行なわれるため、ここでも <varname>PLIST_SUB</varname>
に指定した置換が行なわれることに注意してください。
<varname>PREFIX</varname> には <literal>%%PREFIX%%</literal> を、
<varname>LOCALBASE</varname> には <literal>%%LOCALBASE%%</literal>,
<varname>X11BASE</varname> には <literal>%%X11BASE%%</literal>
を使用することを推奨します。</para>
</sect1>
<sect1 xml:id="porting-restrictions">
<title>配布制限がある ports</title>
<para>ライセンスにはさまざまなものがあり、なかには、
アプリケーションをパッケージ化するやり方、営利目的で販売できるか、
といったことに制限をかけているものがあります。</para>
<important>
<para>port 作成者として、あなたには、使用許諾条件をよく読み、
FTP/HTTP または CD-ROM
で再配布してはいけないソースコードやコンパイルされたバイナリを配布してしまい、
その責任が FreeBSD プロジェクトにかかってくることのないよう注意する義務があります。
疑わしい場合には &a.ports; で聞いてみてください。</para>
</important>
<para>そのような場合、次の節で説明されている変数が設定できます。</para>
<note>
<para><varname>RESTRICTED</varname>
は、それだけを設定すれば済むように、暗黙のうちに
<varname>NO_CDROM</varname><varname>NO_PACKAGE</varname>
を設定します。それに対して、
<varname>NO_PACKAGE</varname><varname>NO_CDROM</varname>
は独立で、同時に設定可能です。</para>
</note>
<sect2>
<title><varname>NO_PACKAGE</varname></title>
<para>この変数が設定されていたら、
このアプリケーションのバイナリパッケージを作成してはいけないということです。
ただし、この port の <varname>DISTFILES</varname>
は自由に配布できます。</para>
<para>また、<varname>NO_PACKAGE</varname>
は、バイナリパッケージが汎用的ではなく、
いつもアプリケーションをソースコードからコンパイルすべき場合にも利用すべきです。
たとえば、アプリケーションにサイト特有の設定情報がコンパイル時にハードコードされるような場合には、
<varname>NO_PACKAGE</varname> を設定してください。</para>
<para><varname>NO_PACKAGE</varname> には、
パッケージを作成すべきではない理由を述べた文字列を設定すべきです。</para>
</sect2>
<sect2>
<title><varname>NO_CDROM</varname></title>
<para>この変数は、バイナリパッケージの作成は許可されていますが、
その package や port の <varname>DISTFILES</varname>
を販売用の CD-ROM (や DVD-ROM)
に載せるのは許されていないことを表します。なんにせよ、
バイナリパッケージと port の <varname>DISTFILES</varname>
は、FTP/HTTP で入手できます。</para>
<para><varname>NO_CDROM</varname> には、その port が何故 CD-ROM
で再配布できないか説明する文字列を設定するべきです。
これはたとえば、その port のライセンスが<quote>非商用</quote>
利用に限っている場合に使うべきです。</para>
</sect2>
<sect2>
<title><varname>RESTRICTED</varname></title>
<para>アプリケーションのライセンスが、FTP/HTTP
で、そのアプリケーションの <varname>DISTFILES</varname>
をミラーすることや、
バイナリパッケージを配布することを禁じていたら、
この変数を設定してください。</para>
<para><varname>RESTRICTED</varname> には、その port
が何故再配布できないか説明する文字列を設定するべきです。
典型的な場合としては、その port
がプロプライエタリなソフトウェアを含んでいて、
<varname>DISTFILES</varname>
を、おそらくソフトウェアに関する登録を行ったり、
<acronym>EULA</acronym> を承諾した後で、
手動でダウンロードしなければならないことを表します。</para>
</sect2>
<sect2>
<title><varname>RESTRICTED_FILES</varname></title>
<para><varname>RESTRICTED</varname><varname>NO_CDROM</varname>
が設定されている時は、この変数はデフォルトで
<literal>${DISTFILES} ${PATCHFILES}</literal>
になります。それ以外は空です。
一部の配布ファイルだけに制限がかかっていたら、
この変数にそのファイルのリストを設定してください。</para>
<para>port committer は、設定した配布ファイル毎に
<filename>/usr/ports/LEGAL</filename>
に制限の内容を説明する項目を追加すべきことに注意してください。</para>
</sect2>
</sect1>
<sect1 xml:id="using-perl">
<title><literal>perl</literal> の利用</title>
<table frame="none">
<title><literal>perl</literal> を使用する ports 用の変数</title>
<tgroup cols="2">
<thead>
<row>
<entry>変数</entry>
<entry>意味</entry>
</row>
</thead>
<tbody>
<row>
<entry><varname>USE_PERL5</varname></entry>
<entry>その port のビルドと実行に <literal>perl 5</literal>
を使用することを示します。</entry>
</row>
<row>
<entry><varname>USE_PERL5_BUILD</varname></entry>
<entry>その port をビルドするのに <literal>perl 5</literal>
を使用することを示します。</entry>
</row>
<row>
<entry><varname>USE_PERL5_RUN</varname></entry>
<entry>その port を実行するのに <literal>perl 5</literal>
を使用することを示します。</entry>
</row>
<row>
<entry><varname>PERL</varname></entry>
<entry>システムまたは port からインストールされた
<literal>perl 5</literal>
の完全なパスからバージョン番号を省いたもの。
スクリプトの
<quote><literal>#!</literal></quote>
行を置き換える必要があれば使ってください。</entry>
</row>
<row>
<entry><varname>PERL_CONFIGURE</varname></entry>
<entry>Perl の MakeMaker
を使ってコンフィグレーションを行います。暗黙のうちに
<varname>USE_PERL5</varname> を設定します。</entry>
</row>
</tbody>
</tgroup>
<tgroup cols="2">
<thead>
<row>
<entry>読み取り専用変数</entry>
<entry>意味</entry>
</row>
</thead>
<tbody>
<row>
<entry><varname>PERL_VERSION</varname></entry>
<entry>インストールされている <literal>perl</literal>
の完全なバージョン
(たとえば <literal>5.00503</literal>)。</entry>
</row>
<row>
<entry><varname>PERL_VER</varname></entry>
<entry>インストールされている <literal>perl</literal>
のバージョンの短縮形
(たとえば <literal>5.005</literal>)。</entry>
</row>
<row>
<entry><varname>PERL_LEVEL</varname></entry>
<entry>インストールされている <literal>perl</literal>
<literal>MNNNPP</literal> 形式の整数で表されるバージョン
(たとえば <literal>500503</literal>)。</entry>
</row>
<row>
<entry><varname>PERL_ARCH</varname></entry>
<entry><literal>perl</literal>
がアーキテクチャ依存のライブラリをインストールする場所。
デフォルトは <literal>${ARCH}-freebsd</literal></entry>
</row>
<row>
<entry><varname>PERL_PORT</varname></entry>
<entry>インストールされている <literal>perl</literal>
の port の名称 (例えば <literal>perl5</literal>)。</entry>
</row>
<row>
<entry><varname>SITE_PERL</varname></entry>
<entry>サイト独自の <literal>perl</literal>
パッケージの入るディレクトリ名。
この値は PLIST_SUB に追加されます。</entry>
</row>
</tbody>
</tgroup>
</table>
</sect1>
<sect1 xml:id="using-x11">
<title>X11 の利用</title>
<table frame="none">
<title>X を利用する ports 用の変数</title>
<tgroup cols="2">
<tbody>
<row>
<entry><varname>USE_X_PREFIX</varname></entry>
<entry>その port は <varname>PREFIX</varname> ではなく
<varname>X11BASE</varname> にインストールされます。</entry>
</row>
<row>
<entry><varname>USE_XLIB</varname></entry>
<entry>その port は X ライブラリを使用します。</entry>
</row>
<row>
<entry><varname>USE_MOTIF</varname></entry>
<entry>その port は Motif ツールキットを使用します。
<varname>USE_XPM</varname> が自動的に設定されます。</entry>
</row>
<row>
<entry><varname>USE_IMAKE</varname></entry>
<entry>その port は <command>imake</command>
を使用します。<varname>USE_X_PREFIX</varname>
が自動的に設定されます。</entry>
</row>
<row>
<entry><varname>XMKMF</varname></entry>
<entry><command>xmkmf</command><envar>PATH</envar>
にない場合にパスを設定してください。
デフォルトは <literal>xmkmf -a</literal> になります。</entry>
</row>
</tbody>
</tgroup>
</table>
</sect1>
<sect1 xml:id="using-automake">
<title><command>automake</command>, <command>autoconf</command>
および <command>libtool</command> の利用</title>
<table frame="none">
<title>automake, autoconf または libtool
を使用する ports 用の変数</title>
<tgroup cols="2">
<thead>
<row>
<entry>変数</entry>
<entry>意味</entry>
</row>
</thead>
<tbody>
<row>
<entry><varname>USE_AUTOMAKE</varname></entry>
<entry>その port は <command>automake</command> を使用します。
<varname>USE_AUTOCONF</varname>
<literal>USE_AUTOMAKE_VER?=14</literal>
が自動的に設定されます。</entry>
</row>
<row>
<entry><varname>AUTOMAKE</varname></entry>
<entry><command>automake</command><envar>PATH</envar>
に含まれない場合のフルパス。</entry>
</row>
<row>
<entry><varname>USE_AUTOMAKE_VER</varname></entry>
<entry>その port は <command>automake</command>
を使用します。この変数の有効な値は
<literal>14</literal><literal>15</literal>
で、<varname>AUTOMAKE_DIR</varname> および
<varname>ACLOCAL_DIR</varname>
変数が適切な値に設定されます。</entry>
</row>
<row>
<entry><varname>AUTOMAKE_ARGS</varname></entry>
<entry><varname>USE_AUTOMAKE_VER</varname>
が設定されていた場合に <varname>AUTOMAKE</varname>
に渡す 1 つまたはそれ以上のコマンドライン引数</entry>
</row>
<row>
<entry><varname>AUTOMAKE_ENV</varname></entry>
<entry><varname>AUTOMAKE</varname>
を実行する前に設定する 1 つまたはそれ以上の環境変数 (とその値)</entry>
</row>
<row>
<entry><varname>ACLOCAL</varname></entry>
<entry>GNU <command>aclocal</command><envar>PATH</envar>
にない場合にパスを設定してください。デフォルトは
<varname>USE_AUTOMAKE_VER</varname>
変数に応じて設定されます。</entry>
</row>
<row>
<entry><varname>ACLOCAL_DIR</varname></entry>
<entry>GNU <command>aclocal</command>
の共有ディレクトリのパスを設定してください。
デフォルトは <varname>USE_AUTOMAKE_VER</varname>
変数に応じて設定されます。</entry>
</row>
<row>
<entry><varname>AUTOMAKE_DIR</varname></entry>
<entry>GNU <command>automake</command>
の共有ディレクトリのパスを設定してください。
デフォルトは <varname>USE_AUTOMAKE_VER</varname>
変数に応じて設定されます。</entry>
</row>
<row>
<entry><varname>USE_AUTOCONF_VER</varname></entry>
<entry>その port が <command>autoconf</command>
を使用することを指定します。デフォルト値は 213 です。</entry>
</row>
<row>
<entry><varname>USE_AUTOCONF</varname></entry>
<entry>その port が <command>autoconf</command>
を使用することを指定します。<literal>GNU_CONFIGURE</literal>
および <literal>USE_AUTOCONF_VER?=213</literal>
を自動的に設定します。</entry>
</row>
<row>
<entry><varname>AUTOCONF</varname></entry>
<entry>GNU <command>autoconf</command><envar>PATH</envar>
にない場合にパスを設定してください。デフォルトは
<varname>USE_AUTOCONF_VER</varname>
変数の値に応じて設定されます。</entry>
</row>
<row>
<entry><varname>AUTOCONF_ARGS</varname></entry>
<entry><command>autoconf</command>
に渡すコマンドライン引数</entry>
</row>
<row>
<entry><varname>AUTOCONF_ENV</varname></entry>
<entry>この変数で指定された
<literal>変数=値</literal>
の組を <command>autoconf</command>
を実行する前に環境変数として設定してください。</entry>
</row>
<row>
<entry><varname>AUTOHEADER</varname></entry>
<entry>GNU <command>autoheader</command><envar>PATH</envar>
にない場合にパスを設定してください。デフォルトは
<varname>USE_AUTOCONF_VER</varname>
の値に応じて設定されます。</entry>
</row>
<row>
<entry><varname>AUTORECONF</varname></entry>
<entry>GNU <command>autoreconf</command><envar>PATH</envar>
にない場合にパスを設定してください。デフォルトは
<varname>USE_AUTOCONF_VER</varname>
に応じて設定されます。</entry>
</row>
<row>
<entry><varname>AUTOSCAN</varname></entry>
<entry>GNU <command>autoscan</command><envar>PATH</envar>
にない場合にパスを設定してください。デフォルトは
<varname>USE_AUTOCONF_VER</varname>
に応じて設定されます。</entry>
</row>
<row>
<entry><varname>AUTOIFNAMES</varname></entry>
<entry>GNU <command>autoifnames</command><envar>PATH</envar>
にない場合にパスを設定してください。デフォルトは
<varname>USE_AUTOCONF_VER</varname>
に応じて設定されます。</entry>
</row>
<row>
<entry><varname>USE_LIBTOOL</varname></entry>
<entry>その port は <command>libtool</command>
を使用します。<varname>GNU_CONFIGURE</varname>
を自動的に設定します。</entry>
</row>
<row>
<entry><varname>LIBTOOL</varname></entry>
<entry><command>libtool</command><envar>PATH</envar>
にない場合にパスを設定してください。</entry>
</row>
<row>
<entry><varname>LIBTOOLFILES</varname></entry>
<entry><command>libtool</command> 用のパッチファイル。
デフォルトは <varname>USE_AUTOCONF</varname>
が設定されていれば <literal>aclocal.m4</literal>
それ以外は <literal>configure</literal> です。</entry>
</row>
<row>
<entry><varname>LIBTOOLFLAGS</varname></entry>
<entry><command>ltconfig</command> に追加で渡すフラグ。
デフォルトは <literal>--disable-ltlibs</literal></entry>
</row>
</tbody>
</tgroup>
</table>
</sect1>
<sect1 xml:id="using-gnome">
<title>GNOME の利用</title>
<para>FreeBSD/GNOME プロジェクトは、ある特定の port
が使っている GNOME コンポーネントを特定するために
独自の変数群を使っています。
FreeBSD/GNOME プロジェクトのページに
<link xlink:href="http://www.FreeBSD.org/gnome/docs/porting.html">その変数のわかりやすい一覧</link>
があります。</para>
</sect1>
<sect1 xml:id="using-kde">
<title>KDE の利用</title>
<table frame="none">
<title>KDE を利用する ports 用の変数</title>
<tgroup cols="2">
<tbody>
<row>
<entry><varname>USE_QT_VER</varname></entry>
<entry>その port は Qt ツールキットを使用します。
設定できる値は、
<literal>1</literal>, <literal>2</literal> および
<literal>3</literal> で、それぞれ使用する Qt
のメジャーバージョンを示します。
これは、<varname>MOC</varname><varname>QTCPPFLAGS</varname>
をデフォルトの適切な値に設定します。</entry>
</row>
<row>
<entry><varname>USE_KDELIBS_VER</varname></entry>
<entry>その port は KDE ライブラリを使用します。
設定できる値は、
<literal>1</literal>, <literal>2</literal> および
<literal>3</literal> で、それぞれ使用する KDE
のメジャーバージョンを示します。
暗黙で <varname>USE_QT_VER</varname>
に適切なバージョンを設定します。</entry>
</row>
<row>
<entry><varname>USE_KDEBASE_VER</varname></entry>
<entry>その port は KDE base を使用します。
設定できる値は、
<literal>1</literal>, <literal>2</literal> および
<literal>3</literal> で、それぞれ使用する KDE
のメジャーバージョンを示します。
暗黙で <varname>USE_KDELIBS_VER</varname>
に適切なバージョンを設定します。</entry>
</row>
<row>
<entry><varname>MOC</varname></entry>
<entry><command>moc</command> へのパスを設定してください。
デフォルトでは、<varname>USE_QT_VER</varname>
の値に応じて設定されます。</entry>
</row>
<row>
<entry><varname>QTCPPFLAGS</varname></entry>
<entry>Qt のコードを処理する際の <varname>CPPFLAGS</varname>
を設定してください。デフォルトでは
<varname>USE_QT_VER</varname> の値に応じて設定されます。</entry>
</row>
</tbody>
</tgroup>
</table>
</sect1>
<sect1 xml:id="using-bison">
<title>Bison の利用</title>
<para>この節はまだ書かれていません。</para>
</sect1>
<sect1 xml:id="using-java">
<title>Java の利用</title>
<para>あなたが作成している port の構築、実行、
または配布ファイルの展開に Java&trade; 開発キット (JDK)
が必要なら、<varname>USE_JAVA</varname>
を定義してください。</para>
<para>Ports Collection には、さまざまなベンダの JDK
のいろいろなバージョンがあります。
あなたが作成している port
がその中のいずれかのバージョンを使わなければならないなら、
どれを使うか指定できます。最新のバージョンは、
<package>java/jdk14</package> です。</para>
<table frame="none">
<title>Java を利用する ports で定義すべき変数</title>
<tgroup cols="2">
<thead>
<row>
<entry>変数</entry>
<entry>意味</entry>
</row>
</thead>
<tbody>
<row>
<entry><varname>USE_JAVA</varname></entry>
<entry>この後の変数を有効にするには、
この変数を定義しなければなりません。</entry>
</row>
<row>
<entry><varname>JAVA_VERSION</varname></entry>
<entry>スペースで区切られた、適合する Java
のバージョン一覧。<literal>"+"</literal>
を使ってバージョンの範囲を指定することもできます
(使える値は、
<literal>1.1[+] 1.2[+] 1.3[+] 1.4[+]</literal>)
です)。</entry>
</row>
<row>
<entry><varname>JAVA_OS</varname></entry>
<entry>スペースで区切られた、その port に適合する JDK
port の OS 一覧。(使える値は、
<literal>native linux</literal>) です。</entry>
</row>
<row>
<entry><varname>JAVA_VENDOR</varname></entry>
<entry>スペースで区切られた、その port に適合する JDK
port のベンダの一覧。(使える値は、
<literal>freebsd bsdjava sun ibm blackdown</literal>)
です。</entry>
</row>
<row>
<entry><varname>JAVA_BUILD</varname></entry>
<entry>この変数が設定されていると、選択した JDK を、その
port の構築依存性に追加します。</entry>
</row>
<row>
<entry><varname>JAVA_RUN</varname></entry>
<entry>この変数が設定されていると、選択した JDK を、その
port の実行依存性に追加します。</entry>
</row>
<row>
<entry><varname>JAVA_EXTRACT</varname></entry>
<entry>この変数が設定されていると、選択した JDK を、その
port の展開依存性に追加します。</entry>
</row>
<row>
<entry><varname>USE_JIKES</varname></entry>
<entry>その port の構築に <command>jikes</command>
バイトコードコンパイラを使うべきかどうかを示します。
この変数に何の値も設定されていない時は、port は
<command>jikes</command> が使えたら構築に利用します。
<command>jikes</command> の利用を明示的に禁止したり、
強制したりすることも可能です (<literal>'no'</literal>
<literal>'yes'</literal> を設定してください)。
後者の場合は、<package>devel/jikes</package>
が port の構築依存性に追加されます。</entry>
</row>
</tbody>
</tgroup>
</table>
<para>以下は、<varname>USE_JAVA</varname>
を設定した port で行われる設定の一覧です。</para>
<table frame="none">
<title>Java を利用する ports で設定される変数</title>
<tgroup cols="2">
<thead>
<row>
<entry>変数</entry>
<entry></entry>
</row>
</thead>
<tbody>
<row>
<entry><varname>JAVA_PORT</varname></entry>
<entry>JDK port の名称 (例:
<literal>'java/jdk14'</literal>)。</entry>
</row>
<row>
<entry><varname>JAVA_PORT_VERSION</varname></entry>
<entry>JDK の完全なバージョン (例:
<literal>'1.4.2'</literal>)。最初の数字
2 つだけしか必要でなければ、
<varname>${JAVA_PORT_VERSION:C/^([0-9])\.([0-9])(.*)$/\1.\2/}</varname>
を使ってください。</entry>
</row>
<row>
<entry><varname>JAVA_PORT_OS</varname></entry>
<entry>JDK port が利用する OS (例:
<literal>'linux'</literal>)。</entry>
</row>
<row>
<entry><varname>JAVA_PORT_VENDOR</varname></entry>
<entry>JDK port のベンダ (例:
<literal>'sun'</literal>)。</entry>
</row>
<row>
<entry><varname>JAVA_PORT_OS_DESCRIPTION</varname></entry>
<entry>JDK port が利用する OS の説明 (例:
<literal>'Linux'</literal>)。</entry>
</row>
<row>
<entry><varname>JAVA_PORT_VENDOR_DESCRIPTION</varname></entry>
<entry>JDK port のベンダの説明 (例:
<literal>'FreeBSD Foundation'</literal>)。</entry>
</row>
<row>
<entry><varname>JAVA_HOME</varname></entry>
<entry>JDK がインストールされているディレクトリのパス
(例: <filename>'/usr/local/jdk1.3.1'</filename>)。</entry>
</row>
<row>
<entry><varname>JAVAC</varname></entry>
<entry>使用する Java コンパイラのパス (例:
<filename>'/usr/local/jdk1.1.8/bin/javac'</filename>
または
<filename>'/usr/local/bin/jikes'</filename>)。</entry>
</row>
<row>
<entry><varname>JAR</varname></entry>
<entry>使用する <command>jar</command> ツールのパス (例:
<filename>'/usr/local/jdk1.2.2/bin/jar'</filename>
または
<filename>'/usr/local/bin/fastjar'</filename>)。</entry>
</row>
<row>
<entry><varname>APPLETVIEWER</varname></entry>
<entry><command>appletviewer</command>
ユーティリティへのパス (例:
<filename>'/usr/local/linux-jdk1.2.2/bin/appletviewer'</filename>)。</entry>
</row>
<row>
<entry><varname>JAVA</varname></entry>
<entry><command>java</command> 実行ファイルへのパス。
Java プログラムの実行にはこれを使ってください (例:
<filename>'/usr/local/jdk1.3.1/bin/java'</filename>)。</entry>
</row>
<row>
<entry><varname>JAVADOC</varname></entry>
<entry><command>javadoc</command>
ユーティリティプログラムへのパス。</entry>
</row>
<row>
<entry><varname>JAVAH</varname></entry>
<entry><command>javah</command>
プログラムへのパス。</entry>
</row>
<row>
<entry><varname>JAVAP</varname></entry>
<entry><command>javap</command>
プログラムへのパス。</entry>
</row>
<row>
<entry><varname>JAVA_KEYTOOL</varname></entry>
<entry><command>keytool</command>
ユーティリティプログラムへのパス。
この変数は、JDK が Java 1.2
以上の場合のみ利用可能です。</entry>
</row>
<row>
<entry><varname>JAVA_N2A</varname></entry>
<entry><command>native2ascii</command>
ツールへのパス。</entry>
</row>
<row>
<entry><varname>JAVA_POLICYTOOL</varname></entry>
<entry><command>policytool</command>
プログラムへのパス。この変数は、JDK が Java 1.2
以上の場合のみ利用可能です。</entry>
</row>
<row>
<entry><varname>JAVA_SERIALVER</varname></entry>
<entry><command>serialver</command>
ユーティリティプログラムへのパス。</entry>
</row>
<row>
<entry><varname>RMIC</varname></entry>
<entry>RMI スタブ/スケルトンジェネレータ
<command>rmic</command> へのパス。</entry>
</row>
<row>
<entry><varname>RMIREGISTRY</varname></entry>
<entry>RMI レジストリプログラム
<command>rmiregistry</command> へのパス。</entry>
</row>
<row>
<entry><varname>RMID</varname></entry>
<entry>RMI デーモンプログラム <command>rmid</command>
へのパス。この変数は、JDK が Java 1.2
以上の場合のみ利用可能です。</entry>
</row>
<row>
<entry><varname>JAVA_CLASSES</varname></entry>
<entry>JDK クラスファイルが入っているアーカイブへのパス。
JDK 1.2 以降では、これは
<filename>${JAVA_HOME}/jre/lib/rt.jar</filename> です。
それより前の JDK は、
<filename>${JAVA_HOME}/lib/classes.zip</filename>
を使います。</entry>
</row>
</tbody>
</tgroup>
</table>
<para>Port のデバッグ情報を得るのに、
<literal>java-debug</literal> make ターゲットが使えます。
これは、前述の変数の多くについて値を表示します。</para>
</sect1>
<sect1 xml:id="using-python">
<title>Python の利用</title>
<para>この節はまだ書かれていません。</para>
</sect1>
<sect1 xml:id="using-emacs">
<title>Emacs の利用</title>
<para>この節はまだ書かれていません。</para>
</sect1>
<sect1 xml:id="using-ruby">
<title>Ruby の利用</title>
<para>この節はまだ書かれていません。</para>
</sect1>
<sect1 xml:id="using-sdl">
<title>SDL の利用</title>
<para><varname>USE_SDL</varname> 変数は、
<package>devel/sdl12</package>
<package>x11-toolkits/sdl_gui</package>
など、SDL ベースの ports
への依存を自動設定するのに使われます。</para>
<para>今のところ、次の SDL ライブラリが認識されます。</para>
<itemizedlist>
<listitem>
<para>sdl: <package>devel/sdl12</package></para>
</listitem>
<listitem>
<para>gfx: <package>graphics/sdl_gfx</package></para>
</listitem>
<listitem>
<para>gui: <package>x11-toolkits/sdl_gui</package></para>
</listitem>
<listitem>
<para>image: <package>graphics/sdl_image</package></para>
</listitem>
<listitem>
<para>ldbad: <package>devel/sdl_ldbad</package></para>
</listitem>
<listitem>
<para>mixer: <package>audio/sdl_mixer</package></para>
</listitem>
<listitem>
<para>mm: <package>devel/sdlmm</package></para>
</listitem>
<listitem>
<para>net: <package>net/sdl_net</package></para>
</listitem>
<listitem>
<para>sound: <package>audio/sdl_sound</package></para>
</listitem>
<listitem>
<para>ttf: <package>graphics/sdl_ttf</package></para>
</listitem>
</itemizedlist>
<para>したがって、ある port が
<package>net/sdl_net</package>
<package>audio/sdl_mixer</package>
に依存していたら、構文は次のようになります。</para>
<programlisting>USE_SDL= net mixer</programlisting>
<para><package>net/sdl_net</package>
<package>audio/sdl_mixer</package>
が必要とする <package>devel/sdl12</package>
の依存も自動的に追加されます。</para>
<para><varname>USE_SDL</varname>
を使うと、以下のことが自動的に行われます。</para>
<itemizedlist>
<listitem>
<para><varname>BUILD_DEPENDS</varname>
<application>sdl11-config</application>
への依存を追加します。</para>
</listitem>
<listitem>
<para><varname>CONFIGURE_ENV</varname>
<varname>SDL_CONFIG</varname> 変数を追加します。</para>
</listitem>
<listitem>
<para><varname>LIB_DEPENDS</varname>
に選択したライブラリへの依存を追加します。</para>
</listitem>
</itemizedlist>
<para>SDL ライブラリが利用できるかどうか調べるためには、
<varname>WANT_SDL</varname> 変数を使ってください。</para>
<programlisting>WANT_SDL=yes
.include &lt;bsd.port.pre.mk&gt;
.if ${HAVE_SDL:Mmixer}!=""
USE_SDL+= mixer
.endif
.include &lt;bsd.port.post.mk&gt;</programlisting>
</sect1>
</chapter>
<!--
<chapter>
<title>ELF 対応</title>
<para>FreeBSD は 3.0-RELEASE で ELF に移行しましたので、
共有ライブラリを作成するたくさんの port を
ELF 対応にする必要があります。
3.0 システムは ELF としても a.out としても動作しますし、
わたしたちは非公式ではありますが、
できるだけ長い間 2.2
システムのサポートをしたいと思っていますので状況は複雑です。
以下は a.out のみに対応している port
をどのように a.out と ELF 両方に対応させるかのガイドラインです。</para>
<para>このリストの一部は移行時にしかあてはまらないものもありますが、
古い port をアップグレードしたい場合に参考になるようにしばらくのあいだは残しておきます。</para>
<sect1>
<title>a.out ライブラリの退避</title>
<para>すべての a.out ライブラリは
<filename>/usr/local/lib</filename> から
<filename>aout</filename> サブディレクトリに移動しなくはなりません
(もし移動しないと、ELF ports
がそれらをあっさり上書きしてしまいます)。
3.0-CURRENT の <filename>src/Makefile</filename> にある
<maketarget>move-aout-libs</maketarget> ターゲット
(<maketarget>aout-to-elf</maketarget> から呼ばれます)
がその移動をしてくれます。
a.out ライブラリを移動するだけなので、
ELF と a.out の両方のライブラリが標準的なディレクトリにあるシステムでは、
このターゲットを実行しても安全です。</para>
</sect1>
<sect1>
<title>フォーマット</title>
<para>ports ツリーは、そのマシンの (訳注: オブジェクト) フォーマットで
package を作成します。
つまり、2.2 のマシンでは a.out で作成され、
3.0 のマシンでは <command>`objformat`</command> の結果によって
a.out か ELF で作成されるということです。
また、いったん a.out ライブラリをサブディレクトリに移動すると
a.out ライブラリの作成はサポート外となります。
(つまり、自分が何をやっているのかを理解していれば、移動後にも
うまく作成できる可能性もあるけれど、自力でやらなければならない
ということです。)</para>
<note>
<para>もし port が a.out でしか動作しないのなら、
<makevar>BROKEN_ELF</makevar>
に原因を説明する文字列を設定してください。
この変数が設定された port は、ELF
システム上でのビルドの際スキップされます。</para>
</note>
</sect1>
<sect1>
<title>PORTOBJFORMAT</title>
<para><filename>bsd.port.mk</filename> において
<makevar>PORTOBJFORMAT</makevar> は
<literal>aout</literal> か
<literal>elf</literal> に設定され、環境変数
<envar>CONFIGURE_ENV</envar>,
<envar>SCRIPTS_ENV</envar>,
<envar>MAKE_ENV</envar> の中で export されます
(2.2-STABLE
では常に <literal>aout</literal> になります)。
また、
<literal>PORTOBJFORMAT=${PORTOBJFORMAT}</literal> として
<maketarget>PLIST_SUB</maketarget> に渡されます
(以下にある
<literal>ldconfig</literal>
に関するコメントを参照してください)。</para>
<para>この変数は、以下のようにして
<filename>bsd.port.mk</filename> 中で設定されます。</para>
<programlisting>PORTOBJFORMAT!= test -x /usr/bin/objformat &amp;&amp; /usr/bin/objformat || echo aout</programlisting>
<para>この変数を使って、port の make
の過程で何をすべきかを決定すべきですが、
もし port の <filename>configure</filename> スクリプトが元々
ELF システムを自動的に検出するのであれば、
<makevar>PORTOBJFORMAT</makevar>
を参照する必要はありません。</para>
</sect1>
<sect1>
<title>共有ライブラリの作成</title>
<para>以下は、a.out と ELF
での共有ライブラリの扱いの違いです。</para>
<itemizedlist>
<listitem>
<para>共有ライブラリのバージョン</para>
<para>ELF の共有ライブラリは
<filename>libfoo.so.<replaceable>M</replaceable></filename>
という名前になっていなければなりません。
ここで <replaceable>M</replaceable>
は単一のバージョン番号を表します。
一方 a.out のライブラリは
<filename>libfoo.so.<replaceable>M</replaceable>.<replaceable>N</replaceable></filename>
という名前で、
<replaceable>M</replaceable> はメジャーバージョン番号、
<replaceable>N</replaceable>
はマイナーバージョン番号になっている必要があります。
これらを混同しないでください。
<filename>libfoo.so.<replaceable>N</replaceable>.<replaceable>M</replaceable></filename>
という名の ELF 共有ライブラリや
<filename>libfoo.so.<replaceable>N</replaceable></filename>
という名の a.out 共有ライブラリ
(あるいはシンボリックリンク)
は<emphasis>絶対にインストールしないでください</emphasis>。</para>
</listitem>
<listitem>
<para>リンカコマンドライン</para>
<para>直接 <command>ld</command> を使用せずに
<command>cc -shared</command> を使用してください。
たった一つの違いは、ELF には、
<option>-Wl,-<replaceable>soname,libfoo.so.M</replaceable></option>
コマンドラインにを加える必要があることです。</para>
< ! - - kuriyama - strange Japanese representation - - >
</listitem>
</itemizedlist>
<para>ELF のリンカを満足させるためには、
<filename>libfoo.so</filename> から
<filename>libfoo.so.<replaceable>N</replaceable></filename>
へのシンボリックリンクを作る必要があります。
これは <filename>pkg-plist</filename> にも加えなくてはいけませんし、
a.out の場合でも害にはならないので
(一部の port
ではダイナミックリンクローディングのために必要でもあります)、
<makevar>PORTOBJFORMAT</makevar>
の設定を気にせずに、ただ単純にリンクを作成してください。</para>
</sect1>
<sect1>
<title><makevar>LIB_DEPENDS</makevar></title>
<para>すべての port の <filename>Makefile</filename> を編集して
<makevar>LIB_DEPENDS</makevar>
からマイナー番号を除去する必要があり、
正規表現のサポートも除去する必要があります
(たとえば、
<literal>foo\\.1\\.\\(33|40\\)</literal> から
<literal>foo.2</literal>).
マッチングは <command>grep -wF</command>
を使って行なわれます。</para>
</sect1>
<sect1>
<title><filename>pkg-plist</filename></title>
<para><filename>pkg-plist</filename> は
a.out のマイナー番号が 0 であれば短い
(ELFの) 共有ライブラリの名前を含み、
そうでなければ長い (a.out の) 名前を含んでいる必要があります。
<makevar>PORTOBJFORMAT</makevar> が
<literal>aout</literal> であれば、
<filename>bsd.port.mk</filename> は自動的に
<literal>.0</literal> を短い共有ライブラリの名前の行に付け加え、
<makevar>PORTOBJFORMAT</makevar> が <literal>elf</literal>
であれば、
マイナー番号を長い共有ライブラリの名前から削除します。</para>
<para>ELF システムで二つのバージョン番号を持つ共有ライブラリをインストールしたり、
a.out システムで一つのバージョン番号しか持たない共有ライブラリをインストールするのが避けられない場合
(たとえば他のオペレーティングシステム用の互換ライブラリをインストールする port など)、
<makevar>NO_FILTER_SHLIBS</makevar>
変数を定義すれば前のセクションで説明されている
<filename>pkg-plist</filename>
編集の機能が停止されます。</para>
</sect1>
<sect1>
<title><literal>ldconfig</literal></title>
< ! - - kuriyama - Eng. why literal? - - >
<para><filename>Makefile</filename> 中の
<literal>ldconfig</literal>
の行は以下のようになります。</para>
<programlisting>${SETENV} OBJFORMAT=${PORTOBJFORMAT} ${LDCONFIG} -m ....</programlisting>
<para>また <filename>pkg-plist</filename> 中では、</para>
<programlisting>@exec /usr/bin/env OBJFORMAT=%%PORTOBJFORMAT%% /sbin/ldconfig -m ...
@unexec /usr/bin/env OBJFORMAT=%%PORTOBJFORMAT%% /sbin/ldconfig -R</programlisting>
<para>となります。これは、
システムのデフォルトフォーマットではなく package のフォーマットに応じて、
正しい
<command>ldconfig</command>
が呼ばれることを保証するためのものです。</para>
</sect1>
</chapter>
-->
<chapter xml:id="porting-masterdir">
<title><varname>MASTERDIR</varname></title>
<para>その port の変数 (たとえば解像度とか紙のサイズなど) を
変えたりした、少しだけ違うバージョンを作成する必要があるときには、
ユーザが分りやすいように package ごとに別々のサブディレクトリを作成し、
できるだけ port 間でファイルを共有するようにしてください。
ほとんどの場合、うまく変数を使えば、一つを除くすべてのディレクトリには
とても短い <filename>Makefile</filename> を置くだけで済みます。
その短い <filename>Makefile</filename> では、
<varname>MASTERDIR</varname> を使って、
残りのファイルがあるディレクトリを指定できます。
また、<link linkend="porting-pkgname"><varname>PKGNAMESUFFIX</varname></link>
一部に変数に使って、package が別々の名前を持つようにしてください。</para>
<para>具体的な例を示すのが一番わかりやすいでしょう。
これは <filename>japanese/xdvi300/Makefile</filename> の一部です。</para>
<programlisting>PORTNAME= xdvi
PORTVERSION= 17
PKGNAMEPREFIX= ja-
PKGNAMESUFFIX= ${RESOLUTION}
:
# default
RESOLUTION?= 300
.if ${RESOLUTION} != 118 &amp;&amp; ${RESOLUTION} != 240 &amp;&amp; \
${RESOLUTION} != 300 &amp;&amp; ${RESOLUTION} != 400
@${ECHO} "Error: invalid value for RESOLUTION: \"${RESOLUTION}\""
@${ECHO} "Possible values are: 118, 240, 300 (default) and 400."
@${FALSE}
.endif</programlisting>
<para><package>japanese/xdvi300</package> には
<filename>Makefile</filename> の他に通常のパッチや、
package ファイル等が置かれています。
このディレクトリで <command>make</command> を実行すると、
デフォルトの解像度 (300) を使って、
普通に port のビルドを行ないます。</para>
<para>他の解像度に関していうと、
<filename>xdvi118/Makefile</filename>
必要なのは<emphasis>これだけ</emphasis>です:</para>
<programlisting>RESOLUTION= 118
MASTERDIR= ${.CURDIR}/../xdvi300
.include "${MASTERDIR}/Makefile"</programlisting>
<para>(<filename>xdvi240/Makefile</filename>
<filename>xdvi400/Makefile</filename> も同様のものになります)。
<filename>bsd.port.mk</filename> は、
<varname>MASTERDIR</varname> の定義から
<varname>FILESDIR</varname><varname>SCRIPTDIR</varname> 等の
通常のサブディレクトリが <filename>xdvi300</filename>
以下に存在することを理解します。
<literal>RESOLUTION=118</literal> の行が、
<filename>xdvi300/Makefile</filename>
<literal>RESOLUTION=300</literal> の行を上書きし、
port は解像度を 118 として作成されます。</para>
</chapter>
<chapter xml:id="shared">
<title>共有ライブラリのバージョン</title>
<para>まず<link xlink:href="../developers-handbook/policies-shlib.html">
共有ライブラリのバージョンについての指針</link>を読んで、
一般的に共有ライブラリのバージョンをどうすれば良いかを理解してください。
ソフトウェアの作者は自分がしていることを理解していると、
盲目的に信じていてはいけません。多くの場合は理解していないのです。
細部にわたって注意深く考慮することは大変重要です。なぜなら我々は、
互換性がないかもしれない大量のソフトウェアを共存させようとする特殊な状況にあるからです。
むかし、不注意な port
の導入が共有ライブラリに関する重大な問題を引き起してしまったことがあります
(なぜ <filename>jpeg-6b</filename> の共有ライブラリのバージョン番号が
9 なのか、今まで不思議に思ったことはありませんか?)。
もし疑問があれば、&a.ports; にメールを送ってください。
ほとんどの時間は正しい共有ライブラリのバージョンを決めることと、
それを実現するためのパッチを作成することに終始します。</para>
<!--
<para>しかしながら、
同じソフトウェアの違ったバージョンのソフトウェアが既にツリーにある場合には、
状況は非常に複雑です。< ! - - kuriyama - strange translation? - - >
つまり FreeBSD ではユーザがリンカにどのバージョンの共有ライブラリを使用するかを指定できないからです
(リンカは常にもっとも高いバージョンを選びます)。
これは、もし <filename>libfoo.so.3.2</filename> と
<filename>libfoo.so.4.0</filename>
がシステムに存在するときに、リンカに特別なアプリケーションだけ
<filename>libfoo.so.3.2</filename>
をリンクするよう指示する方法がないことを意味します。
これはコンパイル時のリンクという意味では完全に見劣りします。
この場合の唯一の解決方法は、
共有ファイルの名前の<emphasis>ベース</emphasis>部分を変えることです。
たとえば
<filename>libfoo.so.4.0</filename> を
<filename>libfoo4.so.1.0</filename> へ変えることによって、
バージョン 3.2 とバージョン 4.0 共に他の
port からリンクされることができるようになります。</para>
-->
</chapter>
<chapter xml:id="porting-manpages">
<title>マニュアルページ</title>
<para><varname>MAN[1-9LN]</varname> 変数に指定したマニュアルは
自動的に <filename>pkg-plist</filename> に追加されます
(つまり、マニュアルを <filename>pkg-plist</filename>
に加えては<emphasis>いけません</emphasis>&mdash; <link linkend="porting-plist">pkg-plist の生成</link>を参照してください)。
また、<filename>/etc/make.conf</filename> 中の
<varname>NOMANCOMPRESS</varname> の設定に従って、インストール時に
マニュアルを自動的に圧縮したり復元したりします。</para>
<para>その port が、シンボリックリンクやハードリンクを用いて、
複数のファイル名を持つマニュアルをインストールする場合には、
それらを識別するために <varname>MLINKS</varname>
変数を使用しなければなりません。
port によってインストールされたリンクは、
意図したファイルをきちんと指しているかどうか確認するため、
<filename>bsd.port.mk</filename> によって削除されたり、
再作成されたりします。
MLINKS に指定されたマニュアルも、
<filename>pkg-plist</filename> に含めてはいけません。</para>
<para>マニュアルをインストール時に圧縮するかどうかを指定するには、
<varname>MANCOMPRESSED</varname> 変数を使用します。
この変数は <literal>yes</literal>, <literal>no</literal>
そして <literal>maybe</literal> の三つの値をとることができます、
<literal>yes</literal>
はマニュアルが既に圧縮されてインストールされていること、
<literal>no</literal> は圧縮されていないこと、
<literal>maybe</literal> は既にそのソフトウェアが
<varname>NOMANCOMPRESS</varname> の値に従っていて、
<filename>bsd.port.mk</filename>
は特別なにもする必要がないことを意味します。</para>
<para><varname>USE_IMAKE</varname> がセットされていて、
<varname>NO_INSTALL_MANPAGES</varname> がセットされていなければ、
<varname>MANCOMPRESSED</varname> は自動的に <literal>yes</literal>
に設定されます。それ以外の場合には、<varname>MANCOMPRESSED</varname>
<literal>no</literal> に設定されます。
その port にとって、デフォルトの設定が適切でない場合以外には、
明示的に設定する必要はありません。</para>
<para><varname>PREFIX</varname>
以外のディレクトリの下にマニュアルを置くような port
では、そのディレクトリを <varname>MANPREFIX</varname>
で指定することができます。
さらに、いくつかの <literal>perl</literal> モジュールの ports のように、
特定のセクションのマニュアルだけを非標準の場所にインストールする場合、
個々のマニュアルのパスを
<varname>MAN<replaceable>sect</replaceable>PREFIX</varname>
(ここで <replaceable>sect</replaceable><literal>1-9</literal>,
<literal>L</literal>, または <literal>N</literal> のいずれか)
により指定することができます。</para>
<para>マニュアルが言語特有のサブディレクトリに置かれる場合には、
その言語名を <varname>MANLANG</varname> に設定してください。
この変数のデフォルト値は <literal>""</literal>
になっています (つまり、英語のみ)。</para>
<para>これは、全部をまとめた例です。</para>
<programlisting>MAN1= foo.1
MAN3= bar.3
MAN4= baz.4
MLINKS= foo.1 alt-name.8
MANLANG= "" ja
MAN3PREFIX= ${PREFIX}/share/foobar
MANCOMPRESSED= yes</programlisting>
<para>これは、この port により以下の
6 個のファイルがインストールされることを表しています。</para>
<programlisting>${PREFIX}/man/man1/foo.1.gz
${PREFIX}/man/ja/man1/foo.1.gz
${PREFIX}/share/foobar/man/man3/bar.3.gz
${PREFIX}/share/foobar/man/ja/man3/bar.3.gz
${PREFIX}/man/man4/baz.4.gz
${PREFIX}/man/ja/man4/baz.4.gz</programlisting>
<para>さらに
<filename>${PREFIX}/man/man8/alt-name.8.gz</filename>
がこの port によってインストールされるかどうかわかりませんが、
それとは無関係に foo(1) と alt-name(8)
のマニュアルページを指すシンボリックリンクが作成されます。</para>
</chapter>
<chapter xml:id="porting-motif">
<title>Motif を必要とする port</title>
<para>コンパイルに Motif ライブラリを必要とするアプリケーションがいくつかあります
(Motif 自体は有料のものがいくつかの会社から手に入りますし、
<package>x11-toolkits/lesstif</package>
には多くのアプリケーションを動作させることが可能な無料の互換ライブラリもあります)。
Motif は広く使われているツールキットですし、
有料のもののライセンスでもライブラリを静的にリンクした実行形式の再配布が認められている場合が多いので、
Motif を必要とするソフトウェアを簡単に
(port からコンパイルする人々のために) 動的にでも、
(package を配布する人々のために) 静的にでもリンクできるような仕組みが用意されています。</para>
<sect1 xml:id="motif-use">
<title><varname>USE_MOTIF</varname></title>
<para>Motif が無いとコンパイルできない port
<filename>Makefile</filename> では、この変数を指定してください。
これにより、Motif を持っていない人がこの
port をコンパイルしようとするのを未然に防ぎます。</para>
</sect1>
<sect1 xml:id="motif-lib">
<title><varname>MOTIFLIB</varname></title>
<para>この変数は <filename>bsd.port.mk</filename> によって適当な
Motif ライブラリの指定に置き換えられます。Port のソースの
<filename>Makefile</filename><filename>Imakefile</filename>
で Motif ライブラリを参照しているところを、
この変数を参照するようにパッチを適用してください。</para>
<para>代表的な例としては以下の二つがあげられます:</para>
<orderedlist>
<listitem>
<para>Makefile か Imakefile の中で Motif ライブラリが
<option>-lXm</option> として使われている場合には、
かわりに
<varname>MOTIFLIB</varname>
と書いてください。</para>
</listitem>
<listitem>
<para>Imakefile の中で <literal>XmClientLibs</literal>
が使われている場合には、それを
<literal>&dollar;{MOTIFLIB} &dollar;{XTOOLLIB} &dollar;{XLIB}</literal>
と書きかえてください。</para>
</listitem>
</orderedlist>
<para>なお <varname>MOTIFLIB</varname> は通常、
<literal>-L/usr/X11R6/lib -lXm</literal>
<literal>/usr/X11R6/lib/libXm.a</literal>
に置き換えられます。
したがって前に <option>-L</option>
<option>-l</option> をつける必要はありません。</para>
</sect1>
</chapter>
<chapter xml:id="x11-fonts">
<title>X11 のフォント</title>
<para>もし、あなたの port が X Window System
のフォントをインストールするのであれば、
それらを
<filename>X11BASE/lib/X11/fonts/local</filename>
に置くようにしてください。このディレクトリは
<application>XFree86 3.3.3</application> で新設されたものです。
このディレクトリが存在しなければ作成して、ユーザに
<application>XFree86</application>
3.3.3 かそれより新しいものに更新するか、
少なくともこのディレクトリを <filename>/etc/XF86Config</filename>
のフォントパスに加えるように促すメッセージを出力するようにしてください。
</para>
</chapter>
<chapter xml:id="porting-info">
<title>Info ファイル</title>
<para>あなたが作成している package で GNU info
ファイルをインストールする必要があれば、それを
<varname>INFO</varname> 変数に (後ろの <literal>.info</literal>
なしで) 書いてください。package 登録の前に一時的に生成された
<filename>pkg-plist</filename> に、
適切なインストールおよびアンインストールコードが自動的に追加されます。</para>
</chapter>
<chapter xml:id="pkg-files">
<title><filename>pkg-*</filename> ファイル</title>
<para><filename>pkg-*</filename> ファイルには、
まだ取り上げていない何かと重宝なトリックがいくつかあります。</para>
<sect1 xml:id="porting-message">
<title><filename>pkg-message</filename></title>
<para>もしインストールする人にメッセージを表示する必要がある場合には、
そのメッセージを
<filename>pkg-message</filename> に置くことができます。
この機能は &man.pkg.add.1;
の後の追加のインストール手続きを表示するときなどに重宝します。</para>
<note>
<para>
<filename>pkg-message</filename> ファイルは
<filename>pkg-plist</filename> に加える必要はありません。
また、もしユーザが package ではなく
port を使用している場合には自動的には表示されませんので、
明示的に <buildtarget>post-install</buildtarget>
で表示するようにするべきでしょう。</para>
</note>
</sect1>
<sect1 xml:id="pkg-install">
<title><filename>pkg-install</filename></title>
<para>バイナリパッケージが &man.pkg.add.1;
でインストールされるときに実行する必要のあるコマンドがあれば、
<filename>pkg-install</filename>
スクリプトを使って実行することができます。
このスクリプトは自動的に package に加えられ、
&man.pkg.add.1; によって 2 回実行されます。
1 回目は
<literal>&dollar;{SH} pkg-install &dollar;{PKGNAME} PRE-INSTALL</literal>
として、2 回目には
<literal>&dollar;{SH} pkg-install &dollar;{PKGNAME} POST-INSTALL</literal>
として実行されます。
どちらのモードで実行されているかは
<literal>&dollar;2</literal> を調べることによってわかります。
環境変数 <envar>PKG_PREFIX</envar> には
package がインストールされるディレクトリが設定されます。
詳細は &man.pkg.add.1; を見てください。</para>
<note>
<para>
port を <command>make install</command>
でインストールするときにはこのスクリプトは自動的に実行されません。
もし実行される必要があるならば port の Makefile
から明示的に呼ぶ必要があります。
</para>
</note>
</sect1>
<sect1 xml:id="pkg-deinstall">
<title><filename>pkg-deinstall</filename></title>
<para>このスクリプトは package が削除される際に実行されます。</para>
<para>このスクリプトは、&man.pkg.delete.1; から
2 回実行されます。1 回目は
<literal>&dollar;{SH} pkg-install &dollar;{PKGNAME} DEINSTALL</literal>
と、2 回目は
<literal>&dollar;{SH} pkg-install &dollar;{PKGNAME} POST-DEINSTALL</literal>
という形で実行されます。 </para>
</sect1>
<sect1 xml:id="pkg-req">
<title><filename>pkg-req</filename></title>
<para>(訳注: 実行されるマシンの状態に応じて) その port
をインストールするべきか、そうでないかを判断する必要があるときには、
<quote>要件 (requirements)</quote> スクリプト
<filename>pkg-req</filename> を作ることができます。
インストールや削除を実行すべきかどうか判断するために、
このスクリプトがインストールや削除を実行する際に自動的に実行されます。</para>
<para>このスクリプトはインストール時には &man.pkg.add.1; により
<literal>pkg-req &dollar;{PKGNAME} INSTALL</literal> として実行され、
削除時には &man.pkg.delete.1; により
<literal>pkg-req &dollar;{PKGNAME} DEINSTALL</literal> として
実行されます。</para>
</sect1>
<sect1 xml:id="porting-plist">
<title>make の変数にあわせた
<filename>pkg-plist</filename> の変更</title>
<para>いくつかの port、特に <literal>p5-</literal> ports
などは、configure のオプション
(あるいは、<literal>p5-</literal>
の場合は <literal>perl</literal> のバージョン) によって
<filename>pkg-plist</filename> を変える必要があります。
これを容易に実現するために
<filename>pkg-plist</filename> 中の
<literal>%%OSREL%%</literal>,
<literal>%%PERL_VER%%</literal>,
<literal>%%PERL_VERSION%%</literal>
は適切に置き換えられるようになっています。
<literal>%%OSREL%%</literal>
の値はオペレーティングシステムの数字で表されたリビジョンです
(たとえば <literal>4.9</literal>)。
<literal>%%PERL_VERSION%%</literal><command>perl</command>
のバージョン番号全体
(たとえば <literal>5.00502</literal>)
で、<literal>%%PERL_VER%%</literal><command>perl</command>
のバージョン番号からパッチレベルを引いたものです
(たとえば <literal>5.005</literal>)。</para>
<para>他の置き換えが必要であれば、<varname>PLIST_SUB</varname>
変数に
<literal>VAR=VALUE</literal>
という形式のペアのリストを設定することによって、
<filename>pkg-plist</filename> 中の
<literal>%%VAR%%</literal>
<replaceable>VALUE</replaceable> に置き換えられます。
たとえばバージョンに固有のたくさんのファイルをインストールする場合には、
<filename>Makefile</filename></para>
<!-- kuriyama - Eng ver has unneeded quote above -->
<programlisting>OCTAVE_VERSION= 2.0.13
PLIST_SUB= OCTAVE_VERSION=${OCTAVE_VERSION}</programlisting>
<para>と書いて、<filename>PLIST</filename>
中のバージョン番号が表われるすべてのところに、
<literal>%%OCTAVE_VERSION%%</literal> と書きます。
このようにしておけば、port をアップグレードするときに、
何十行 (時として、何百行) も
<filename>pkg-plist</filename>
を書き替えないですみます。</para>
<para>この書き換えは
(<link linkend="porting-manpages">マニュアル</link>の追加も)
<buildtarget>pre-install</buildtarget>
<buildtarget>do-install</buildtarget> ターゲットの間に
<varname>pkg-plist</varname> を読み
<varname>TMPPLIST</varname>
(デフォルトは
<filename>WRKDIR/.PLIST.mktmp</filename>)
に書き込むことによって行なわれます。
もし、あなたの port が
<varname>PLIST</varname> を実行時に生成するのであれば、
<buildtarget>pre-install</buildtarget>
の間かその前に行なうようにしてください。
また、書きかえられたあとのファイルを編集する必要がある場合には、
<buildtarget>post-install</buildtarget>
<varname>TMPPLIST</varname> を書きかえてください。</para>
</sect1>
<sect1 xml:id="pkg-names">
<title xml:id="porting-pkgfiles"><filename>pkg-*</filename>
ファイルの名前変更</title>
<para><filename>pkg-*</filename>
ファイルの名前はすべて変数を使用して定義されていますので、
必要であれば
<filename>Makefile</filename> 中で変更可能です。
いくつかの ports で一つの
<filename>pkg-*</filename>
ファイルを共有する場合や、
上記のファイルに書き込みをしなければならないときなど特に便利です
(<filename>pkg-*</filename>
サブディレクトリに直接書き込むのが良くない理由については
<link linkend="porting-wrkdir"><varname>WRKDIR</varname>
以外への書きこみ</link> を参照してください)。</para>
<para>以下に変数名と そのデフォルト値のリストを示します。
(<varname>PKGDIR</varname> のデフォルト値は
<varname>${MASTERDIR}</varname> になっています。)</para>
<informaltable frame="none">
<tgroup cols="2">
<thead>
<row>
<entry>変数名</entry>
<entry>デフォルト値</entry>
</row>
</thead>
<tbody>
<row>
<entry><varname>DESCR</varname></entry>
<entry><literal>${PKGDIR}/pkg-descr</literal></entry>
</row>
<row>
<entry><varname>PLIST</varname></entry>
<entry><literal>${PKGDIR}/pkg-plist</literal></entry>
</row>
<row>
<entry><varname>PKGINSTALL</varname></entry>
<entry><literal>${PKGDIR}/pkg-install</literal></entry>
</row>
<row>
<entry><varname>PKGDEINSTALL</varname></entry>
<entry><literal>${PKGDIR}/pkg-deinstall</literal></entry>
</row>
<row>
<entry><varname>PKGREQ</varname></entry>
<entry><literal>${PKGDIR}/pkg-req</literal></entry>
</row>
<row>
<entry><varname>PKGMESSAGE</varname></entry>
<entry><literal>${PKGDIR}/pkg-message</literal></entry>
</row>
</tbody>
</tgroup>
</informaltable>
<para><varname>PKG_ARGS</varname>
を上書きせずにこれらの変数を変更するようにしてください。
<varname>PKG_ARGS</varname>
を変更すると、これらのファイルは port から正しく
<filename>/var/db/pkg</filename>
にインストールされなくなります。</para>
</sect1>
</chapter>
<chapter xml:id="testing">
<title>port のテスト</title>
<sect1 xml:id="testing-portlint">
<title>portlint</title>
<para>送付や commit をする前に
<link linkend="porting-portlint"><command>portlint</command></link>
を使ってチェックしましょう。</para>
</sect1>
<sect1 xml:id="porting-prefix">
<title><varname>PREFIX</varname></title>
<para>なるべく port は <varname>PREFIX</varname>
に対する相対パスにインストールすることができるように心がけてください
(この変数の値は
<varname>USE_X_PREFIX</varname>
<varname>USE_IMAKE</varname> が指定してある時には
<varname>X11BASE</varname>
(デフォルトは <filename>/usr/X11R6</filename>)、
そうでない場合には<varname>LOCALBASE</varname>
(デフォルトは <filename>/usr/local</filename>)
にセットされます)。</para>
<para>サイトによってフリーソフトウェアがインストールされる場所が違いますので、
ソース内で
<filename>/usr/local</filename>
<filename>/usr/X11R6</filename>
を明示的に書かないようにしてください。
X のプログラムで
<command>imake</command> を使うものについては、
<!-- kuriyama - imake is command -->
これは問題にはなりません。
それ以外の場合には port の <filename>scripts/Makefile</filename>
<filename>/usr/local</filename>
(imake を使わない X のプログラムは <filename>/usr/X11R6</filename>)
と書いてあるところを、
<varname>${PREFIX}</varname> に書き換えてください。
この値は port のコンパイルおよび、
インストールの全段階において、自動的に下位のプロセスに渡されます。</para>
<para>そのアプリケーションが <varname>PREFIX</varname>
使用しないで、何かを直接 <filename>/usr/local</filename>
インストールしないことを確認してください。
以下のようにすると、簡単なテストを行なうことができます:</para>
<screen>&prompt.root; <userinput>make clean; make package PREFIX=/var/tmp/port-name</userinput></screen>
<para>この時、もし <varname>PREFIX</varname> の外に
何かがインストールされていた場合、package 生成プロセスは
ファイルが見つからないと文句を言うはずです。</para>
<!-- XXX This paragraph is confusing and poorly indented. -->
<para>ただし、これは そのソフトウェアが内部で決め打ちの参照を
していないかどうか だとか、他の port によってインストールされる
ファイルを参照する際に <varname>LOCALBASE</varname>
正しく使用しているかどうかをテストしているわけではありません。
その port を他の場所にインストールした状態で、
<filename>/var/tmp/port-name</filename>
対するインストールを試みることにより、
そのテストをすることができるでしょう。</para>
<para><varname>USE_X_PREFIX</varname> は本当に必要な時 (つまり
X のライブラリをリンクしたり、<varname>X11BASE</varname> 以下にある
ファイルを参照したりする必要がある時) 以外には
設定しないでください。</para>
<para>変数 <varname>PREFIX</varname> の値は
port の Makefile やユーザの環境で変更することもできます。
しかし、個々の port が Makefile
でこの変数の値を明示的に設定することはなるべくしないでください。</para>
<para>また、他の port によりインストールされるプログラムや
ファイルを指定する場合には、直接的なパス名を使用するのではなく
上で述べた変数を使用してください。
たとえば <command>less</command> のフルパスを
<literal>PAGER</literal> というマクロに入れたい場合は、
<literal>-DPAGER=\"/usr/local/bin/less\"</literal>
というフラグをコンパイラに渡すかわりに
<programlisting>-DPAGER=\"&dollar;{PREFIX}/bin/less\"</programlisting>
(X Window System を使う port の場合には
<programlisting>-DPAGER=\"&dollar;{LOCALBASE}/bin/less\"</programlisting>)
を渡してください。
こうしておけば、システム管理者が <filename>/usr/local</filename>
まるごと どこか他の場所に移していたとしても、その port が
そのまま使える可能性が高くなります。</para>
</sect1>
<sect1 xml:id="testing-freshports">
<title>FreshPorts 正当性テスト</title>
<para><uri xlink:href="http://www.FreshPorts.org/">http://www.FreshPorts.org/</uri>
には、FreeBSD ports へ commit されたものについて、
自動的に正当性テストを行う仕組みがあります。
このサービスに登録すると、あなたが commit したものについて、
正当性テストでエラーが起きると連絡が行きます。</para>
<para>このサービスを利用したい場合、必要なのは FreshPorts
のアカウントだけです。登録したメールアドレスが
<literal>@FreeBSD.org</literal> のものであれば、
ウェブページの右側にサービスを選択するリンクがあるはずです。
FreshPorts にアカウントを持っていても
<literal>@FreeBSD.org</literal>
のメールアドレスを利用していない場合、メールアドレスを
<literal>@FreeBSD.org</literal> に変え、登録したあとで、
メールアドレスをまた変更してください。</para>
</sect1>
</chapter>
<chapter xml:id="port-upgrading">
<title>アップグレード</title>
<para>port のバージョンが原作者からのものに比べて古いことに気がついたら、
まずはあなたの持っている port が私たちの最新のもの
(最新の port は &os; FTP ミラーサイトの <filename>ports/ports-current</filename>
というディレクトリにあります)
であることを確認してください。
また、Ports Collection 全体を最新の状態に保つために
<application>CVSup</application> を利用することもできます。
詳しくは
<link xlink:href="../handbook/synching.html#CVSUP-CONFIG">FreeBSD
ハンドブック</link>をご覧ください。</para>
<para>次に port の
<filename>Makefile</filename>
<varname>MAINTAINER</varname> (保守担当者)
のアドレスが書いてある場合には、その人にメールを出してみましょう。
保守担当者の人がすでにアップグレードの準備をしているかも知れませんし、
(新しいバージョンの安定度に問題があるなど)
あえてアップグレードをしない理由があるのかも知れません。
その人たちと作業を重複させたくはないでしょう。
なお、保守されていない ports は、保守担当者が
<literal>ports@FreeBSD.org</literal>
になっています。その場合は、
そのアドレスにメールを送っても役に立たないでしょう。</para>
<para>保守担当者にアップグレードをしてくれと頼まれた場合、
あるいは、保守担当者が <literal>ports@FreeBSD.org</literal>
の場合は、あなたがアップグレードをしてくださると助かります。
その場合にはアップグレードを作成した後、
変更前と変更後のディレクトリの再帰的 <command>diff</command>
の出力結果を保存してください
(たとえば変更前のディレクトリが
<filename>superedit.bak</filename>
という名前でとってあり、変更後のものが
<filename>superedit</filename>
に入っているなら、
<command>diff -ruN superedit.bak superedit</command>
の結果を保存してください)。
unified または context diff のどちらでも構いませんが
port のコミッターは一般に unified diff の方を好むようです。
<literal>-N</literal> オプションの使い方を覚えておいてください。
これは、新たにファイルが追加されたり、
古いファイルが削除された場合を diff
が正しく扱えるようにする方法です。わたしたちに差分を送る前に、
すべての変更が正しくなされているか出力結果を確認してください。</para>
<para>差分を送る一番良い方法は &man.send-pr.1;
(カテゴリは <literal>ports</literal>)
に diff の出力結果を添えて、わたしたちに送ってもらうのが一番良いです。
commit する際に CVS に明確に記述しなければならないので、
あなたがその port のメンテナになるなら、概要 (synopsis) 行の先頭に
<literal>[maintainer update]</literal>
と記入し、PR の <quote>Class</quote>
<literal>maintainer-update</literal> にしてください。
付け加えたり削除したりしたファイルがあればそれについて書いておいてください。
もし diff の大きさが 20 KB 程度を超えるようであれば、
圧縮したものを uuencode してください。
そうでなければそのまま PR に入れるだけで構いません。</para>
<para>最後に、役に立つ障害報告の書き方について詳しいことは、
障害報告についての記事の
<link xlink:href="../../articles/problem-reports/pr-writing.html">
障害報告の書き方</link>の節を読んでください。</para>
<important>
<para>更新の動機が、セキュリティ上の問題や、
現在 commit されている port に重大な欠陥である場合は、
&a.portmgr; に連絡して、あなたの port
のパッケージをただちに作りなおして再配布するように要求してください。
そうしないと、無防備な &man.pkg.add.1;
のユーザたちが、何週間にもわたって <command>pkg_add -r</command>
で古いバージョンをインストールし続けてしまいます。</para>
</important>
<note>
<para>繰り返しになりますが、既存の ports の変更を送るときには
&man.shar.1; ではなく &man.diff.1; を使用してください!</para>
</note>
</chapter>
<chapter xml:id="porting-dads">
<title>やっていいことといけないこと</title>
<sect1 xml:id="dads-intro">
<title>はじめに</title>
<para>このセクションではソフトウェアを port する上で、
良くある落し穴などについて説明します。
このリストを使ってあなた自身が作成した port のチェックはもとより、
さらに<link xlink:href="http://www.FreeBSD.org/cgi/query-pr-summary.cgi?query">障害報告データベース</link>
にある他の人が提出した port のチェックもできます。
PR データベースにある、
他の人が作成した port のチェックもできます。
あなたがチェックした port についてのコメントを<link xlink:href="../../articles/contributing/contrib-how.html#CONTRIB-GENERAL">
バグ報告と一般的な論評</link>にしたがって送ってください。
PR データベースにある port をチェックすることは、
わたしたちがそれらを commit するのを早めるとともに、
何をしているかをあなたが理解していることも証明します。</para>
<!-- 2000/07/16:hrs strange translation -->
</sect1>
<sect1 xml:id="dads-strip">
<title>バイナリの strip</title>
<para>バイナリは特に必要がなければ、手動で strip しないでください。
すべてのバイナリは strip すべきですが、
<buildtarget>INSTALL_PROGRAM</buildtarget>
マクロがバイナリのインストールと strip を同時に行います
(次節をご覧ください)。</para>
<para>ファイルを strip する必要はあるものの
<varname>INSTALL_PROGRAM</varname> マクロを使いたくない場合は、
<varname>${STRIP_CMD}</varname> でプログラムを strip できます。
これは、多くの場合 <literal>post-install</literal>
ターゲット内で行われます。たとえば</para>
<programlisting>post-install:
${STRIP_CMD} ${PREFIX}/bin/xdl</programlisting>
<para>インストールされた実行形式がすでに strip
されているかどうかは <command>file</command>
コマンドで確認できます。
<quote>not stripped</quote>
と表示されなければ strip されていることを示しています。
さらに、&man.strip.1; はすでに strip されたプログラムは
strip せず、問題なく終了します。</para>
</sect1>
<sect1 xml:id="dads-install">
<title><varname>INSTALL_*</varname> マクロ</title>
<para>あなた自身の <buildtarget>*-install</buildtarget>
ターゲットでファイルの正しいモードとオーナを保証するために、
必ず
<filename>bsd.port.mk</filename>
で提供されているマクロを使用してください。</para>
<itemizedlist>
<listitem>
<para><varname>${INSTALL_PROGRAM}</varname>
は実行可能なバイナリをインストール
(し、その過程で strip 処理)するコマンドです。</para>
</listitem>
<listitem>
<para><varname>${INSTALL_SCRIPT}</varname>
は実行可能なスクリプトをインストールするコマンドです。</para>
</listitem>
<listitem>
<para><varname>${INSTALL_DATA}</varname>
は共有可能なデータをインストールするコマンドです。</para>
</listitem>
<listitem>
<para><varname>${INSTALL_MAN}</varname>
はマニュアルとその他の文書をインストールするコマンドです
(圧縮はしません)。</para>
</listitem>
</itemizedlist>
<para>これらは基本的に <command>install</command>
コマンドに適切なフラグを与えたものです。
それらは distfile の <filename>Makefile</filename>
で、頭に <quote>BSD_</quote> が付けられた
(つまり BSD_INSTALL_PROGRM というような)
形で使うことができます。
どのようにこれらを使用するかは以下の例を見てください。
</para>
</sect1>
<sect1 xml:id="porting-wrkdir">
<title><varname>WRKDIR</varname></title>
<para><varname>WRKDIR</varname>
の外に存在するファイルには何も書き込んではいけません。
port のビルド中に書き込み可能なことが保証されているのは
<varname>WRKDIR</varname> の中だけです
(書き込み不可のツリー上での port ビルドの例については、
<link xlink:href="../handbook/ports-using.html#PORTS-CD">CDROM からの
ports のインストール</link> を参照のこと)。
<filename>pkg-*</filename>
ファイルを変更する必要があるときには、
ファイルを上書きするのではなく
<link linkend="porting-pkgfiles">変数の再定義</link>により
行なうようにしてください。</para>
</sect1>
<sect1 xml:id="porting-wrkdirprefix">
<title><varname>WRKDIRPREFIX</varname></title>
<para><varname>WRKDIRPREFIX</varname>
を尊重していることを確認してください。特に、別の port の
<varname>WRKDIR</varname> を参照しているときには気を付けてください。
正しい場所は、
<filename>WRKDIRPREFIXPORTSDIR/subdir/name/work</filename>
です。
<filename>PORTSDIR/subdir/name/work</filename>
<filename>.CURDIR/../../subdir/name/work</filename>
ではありません。</para>
<para>また、
自分で <varname>WRKDIR</varname> 定義するときには先頭に
<literal>&dollar;{WRKDIRPREFIX}&dollar;{.CURDIR}</literal>
が付いていることを確認してください。</para>
</sect1>
<sect1 xml:id="porting-versions">
<title>OS の種類やバージョンの識別</title>
<para>どのバージョンの Unix で動かすかによって、
変更や条件つきコンパイルが必要なコードに出くわすこともあるでしょう。
そのような変更を行なう場合には、
古い FreeBSD システムへのバックポートや、
CSRG の 4.4BSD, BSD/386, 386BSD, NetBSD, OpenBSD 等、
他の BSD システムへの移植が可能なように、
できるだけ汎用的な変更を行なうことを心がけてください。</para>
<para>4.3BSD/Reno (1990) と、それより新しいバージョンの
BSD コードを区別するには、
<filename>&lt;sys/param.h&gt;</filename> で定義されている
<literal>BSD</literal> マクロを利用するのがよいでしょう。
このファイルがすでにインクルードされていれば良いのですが、
そうでない場合には、その <filename>.c</filename> ファイルの
適当な場所に以下のコードを追加してください。</para>
<programlisting>#if (defined(__unix__) || defined(unix)) &amp;&amp; !defined(USG)
#include &lt;sys/param.h&gt;
#endif</programlisting>
<para>これらの二つのシンボルが定義されているシステムには必ず
<filename>sys/param.h</filename> があるはずです。
もしそうでないシステムを発見したら、
&a.ports; までメールを送ってわたしたちに伝えてください。</para>
<para>あるいは、GNU Autoconf のスタイルを使用することもできます。</para>
<programlisting>#ifdef HAVE_SYS_PARAM_H
#include &lt;sys/param.h&gt;
#endif</programlisting>
<para>この方法を使用するときには、
<filename>Makefile</filename> 中の
<varname>CFLAGS</varname>
<literal>-DHAVE_SYS_PARAM_H</literal>
を加えることを忘れないようにしてください。</para>
<para>いったん <filename>sys/param.h</filename>
がインクルードされると、</para>
<programlisting>#if (defined(BSD) &amp;&amp; (BSD &gt;= 199103))</programlisting>
<para>このようにしてそのコードが 4.3 Net2 コードベース、
またはそれより新しいもの
(例: FreeBSD 1.x, 4.3/Reno, NetBSD 0.9, 386BSD, BSD/386 1.1 とそれ以前)
の上でコンパイルされているかを検出できます。</para>
<programlisting>#if (defined(BSD) &amp;&amp; (BSD &gt;= 199306))</programlisting>
<para>これは、4.4コードベース、またはそれより新しいもの
(例: FreeBSD 2.x, 4.4, NetBSD 1.0, BSD/386 2.0 とそれ以後)
の上でコンパイルされているかどうかを検出するために使用します。</para>
<para>4.4BSD-Lite2 コードベースでは
<literal>BSD</literal> マクロの値は
<literal>199506</literal> になっています。
これは参考程度の意味合いしかありません。
4.4-Lite ベースの FreeBSD と 4.4-Lite2
での変更がマージされたバージョンとを区別するのに使用するべきものではありません。
この目的のためにはかわりに
<literal>__FreeBSD__</literal>
マクロを使用してください。</para>
<para>以下は控え目に使ってください。</para>
<itemizedlist>
<listitem>
<para><literal>__FreeBSD__</literal>
はFreeBSDのすべての版で定義されています。
変更が FreeBSD だけに適用されるとき以外は使用しないでください。
port でよくある
<function>strerror()</function> ではなく
<literal>sys_errlist[]</literal> を使うなどは
FreeBSDでの変更ではなく BSD の流儀です。</para>
</listitem>
<listitem>
<para>FreeBSD 2.xでは <literal>__FreeBSD__</literal>
<literal>2</literal> と定義されています。
それ以前の版では <literal>1</literal> になっています。
その後の版でもメジャー番号に合うように上げています。</para>
</listitem>
<listitem>
<para>もし FreeBSD 1.x システムと FreeBSD 2.x
以降のシステムを区別する必要があれば、
上で述べた <literal>BSD</literal>
マクロを使用するのが大抵の場合において正しい答です。
もし FreeBSD 特有の変更であれば
(<command>ld</command> を使うときの共有ライブラリ用のオプションなど)、
<!-- kuriyama - strange translation -->
<literal>__FreeBSD__</literal>を使い
<literal>#if __FreeBSD__ &gt; 1</literal>
のようにFreeBSD 2.x および、
それ以降のシステムを検出するのはかまいません。
もし 2.0-RELEASE 以降の FreeBSD システムを細かく検出したければ、
以下を使用することができます。</para>
<programlisting>#if __FreeBSD__ &gt;= 2
#include &lt;osreldate.h&gt;
# if __FreeBSD_version &gt;= 199504
/* 2.0.5+ release specific code here */
# endif
#endif</programlisting>
</listitem>
</itemizedlist>
<para>これまで、何百もの port が作られてきましたが、
<literal>__FreeBSD__</literal>
が正しく使われたのは一つか二つの場合だけでしょう。
以前の port が間違ってふさわしくない場所で
そのマクロを使っているからといって、
それをまねする理由はありません。</para>
</sect1>
<sect1 xml:id="freebsd-versions">
<title>__FreeBSD_version の値</title>
<para>以下は、<filename>sys/param.h</filename>
で定義されている <literal>__FreeBSD_version</literal>
の便利な一覧です。</para>
<table frame="none">
<title>__FreeBSD_version values</title>
<tgroup cols="2">
<thead>
<row>
<entry>Release</entry>
<entry><literal>__FreeBSD_version</literal></entry>
</row>
</thead>
<tbody>
<row>
<entry>2.0-RELEASE</entry>
<entry>119411</entry>
</row>
<row>
<entry>2.1-CURRENT</entry>
<entry>199501, 199503</entry>
</row>
<row>
<entry>2.0.5-RELEASE</entry>
<entry>199504</entry>
</row>
<row>
<entry>2.1 以前の 2.2-CURRENT</entry>
<entry>199508</entry>
</row>
<row>
<entry>2.1.0-RELEASE</entry>
<entry>199511</entry>
</row>
<row>
<entry>2.1.5 以前の 2.2-CURRENT</entry>
<entry>199512</entry>
</row>
<row>
<entry>2.1.5-RELEASE</entry>
<entry>199607</entry>
</row>
<row>
<entry>2.1.6 以前の 2.2-CURRENT</entry>
<entry>199608</entry>
</row>
<row>
<entry>2.1.6-RELEASE</entry>
<entry>199612</entry>
</row>
<row>
<entry>2.1.7-RELEASE</entry>
<entry>199612</entry>
</row>
<row>
<entry>2.2-RELEASE</entry>
<entry>220000</entry>
</row>
<row>
<entry>2.2.1-RELEASE</entry>
<entry>220000 (変更なし)</entry>
</row>
<row>
<entry>2.2.1-RELEASE 以降の 2.2-STABLE</entry>
<entry>220000 (変更なし)</entry>
</row>
<row>
<entry>texinfo-3.9 以降の 2.2-STABLE</entry>
<entry>221001</entry>
</row>
<row>
<entry>top 導入以降の 2.2-STABLE</entry>
<entry>221002</entry>
</row>
<row>
<entry>2.2.2-RELEASE</entry>
<entry>222000</entry>
</row>
<row>
<entry>2.2.2-RELEASE 以降の 2.2-STABLE</entry>
<entry>222001</entry>
</row>
<row>
<entry>2.2.5-RELEASE</entry>
<entry>225000</entry>
</row>
<row>
<entry>2.2.5-RELEASE 以降の 2.2-STABLE</entry>
<entry>225001</entry>
</row>
<row>
<entry>ldconfig -R マージ以降の 2.2-STABLE</entry>
<entry>225002</entry>
</row>
<row>
<entry>2.2.6-RELEASE</entry>
<entry>226000</entry>
</row>
<row>
<entry>2.2.7-RELEASE</entry>
<entry>227000</entry>
</row>
<row>
<entry>2.2.7-RELEASE 以降の 2.2-STABLE</entry>
<entry>227001</entry>
</row>
<row>
<entry>&man.semctl.2; 変更以降の 2.2-STABLE</entry>
<entry>227002</entry>
</row>
<row>
<entry>2.2.8-RELEASE</entry>
<entry>228000</entry>
</row>
<row>
<entry>2.2.8-RELEASE 以降の 2.2-STABLE</entry>
<entry>228001</entry>
</row>
<row>
<entry>&man.mount.2; 変更以前の 3.0-CURRENT</entry>
<entry>300000</entry>
</row>
<row>
<entry>&man.mount.2; 変更以降の 3.0-CURRENT</entry>
<entry>300001</entry>
</row>
<row>
<entry>&man.semctl.2; 変更以降の 3.0-CURRENT</entry>
<entry>300002</entry>
</row>
<row>
<entry>ioctl 引数変更以降の 3.0-CURRENT</entry>
<entry>300003</entry>
</row>
<row>
<entry>ELF 化以降の 3.0-CURRENT</entry>
<entry>300004</entry>
</row>
<row>
<entry>3.0-RELEASE</entry>
<entry>300005</entry>
</row>
<row>
<entry>3.0-RELEASE 以降の 3.0-CURRENT</entry>
<entry>300006</entry>
</row>
<row>
<entry>3/4 の分岐以降の 3.0-STABLE</entry>
<entry>300007</entry>
</row>
<row>
<entry>3.1-RELEASE</entry>
<entry>310000</entry>
</row>
<row>
<entry>3.1-RELEASE 以降の 3.1-STABLE</entry>
<entry>310001</entry>
</row>
<row>
<entry>C++ コンストラクタ/デストラクタ順序変更の後の
3.1-STABLE</entry>
<entry>310002</entry>
</row>
<row>
<entry>3.2-RELEASE</entry>
<entry>320000</entry>
</row>
<row>
<entry>3.2-STABLE</entry>
<entry>320001</entry>
</row>
<row>
<entry>バイナリ互換性のない IPFW とソケットの変更後の
3.2-STABLE</entry>
<entry>320002</entry>
</row>
<row>
<entry>3.3-RELEASE</entry>
<entry>330000</entry>
</row>
<row>
<entry>3.3-STABLE</entry>
<entry>330001</entry>
</row>
<row>
<entry>libc に &man.mkstemp.3; が追加された後の 3.3-STABLE</entry>
<entry>330002</entry>
</row>
<row>
<entry>3.4-RELEASE</entry>
<entry>340000</entry>
</row>
<row>
<entry>3.4-STABLE</entry>
<entry>340001</entry>
</row>
<row>
<entry>3.5-RELEASE</entry>
<entry>350000</entry>
</row>
<row>
<entry>3.5-STABLE</entry>
<entry>350001</entry>
</row>
<row>
<entry>3.4 が分岐した後の 4.0-CURRENT</entry>
<entry>400000</entry>
</row>
<row>
<entry>dynamic linker の変更後の 4.0-CURRENT</entry>
<entry>400001</entry>
</row>
<row>
<entry>C++ コンストラクタ/デストラクタ順序変更の後の
4.0-CURRENT</entry>
<entry>400002</entry>
</row>
<row>
<entry>&man.dladdr.3; 機能追加後の 4.0-CURRENT</entry>
<entry>400003</entry>
</row>
<row>
<entry>__deregister_frame_info dynamic linker のバグ修正、
EGCS 1.1.2 導入後の 4.0-CURRENT</entry>
<entry>400004</entry>
</row>
<row>
<entry>&man.suser.9; の API 変更、newbus 化
以降の 4.0-CURRENT</entry>
<entry>400005</entry>
</row>
<row>
<entry>cdevsw 登録方法の変更後の 4.0-CURRENT</entry>
<entry>400006</entry>
</row>
<row>
<entry>ソケットレベルの証明書 (credential) のために
so_cred が追加された後の 4.0-CURRENT</entry>
<entry>400007</entry>
</row>
<row>
<entry>libc_r への poll syscall ラッパー追加後の
4.0-CURRENT</entry>
<entry>400008</entry>
</row>
<row>
<entry>kernel の <literal>dev_t</literal> 型から
<literal>struct spacinfo</literal> ポインタへの
変更後の 4.0-CURRENT</entry>
<entry>400009</entry>
</row>
<row>
<entry>&man.jail.2; のセキュリティホール
修正後の 4.0-CURRENT </entry>
<entry>400010</entry>
</row>
<row>
<entry><literal>sigset_t</literal>
データ型変更後の 4.0-CURRENT</entry>
<entry>400011</entry>
</row>
<row>
<entry>システムコンパイラを gcc 2.95.2 にアップグレードした
後の 4.0-CURRENT</entry>
<entry>400012</entry>
</row>
<row>
<entry>動的組み込み可能な Linux モードの ioctl ハンドラが
追加された後の 4.0-CURRENT</entry>
<entry>400013</entry>
</row>
<row>
<entry>OpenSSL 導入後の 4.0-CURRENT</entry>
<entry>400014</entry>
</row>
<row>
<entry>GCC 2.95.2 の C++ ABI 変更で、
デフォルトを -fvtable-thunks から -fno-vtable-thunks に
変更した後の 4.0-CURRENT</entry>
<entry>400015</entry>
</row>
<row>
<entry>OpenSSH 導入後の 4.0-CURRENT</entry>
<entry>400016</entry>
</row>
<row>
<entry>4.0-RELEASE</entry>
<entry>400017</entry>
</row>
<row>
<entry>4.0-RELEASE 以降の 4.0-STABLE</entry>
<entry>400018</entry>
</row>
<row>
<entry>チェックサム計算タイミングの変更後の 4.0-STABLE</entry>
<entry>400019</entry>
</row>
<row>
<entry>libxpg4 が libc にマージされた後の
4.0-STABLE</entry>
<entry>400020</entry>
</row>
<row>
<entry>Binutils を 2.10.0 にアップグレードし、
ELF バイナリのマーク付け (branding) 方法を変更し、
tcsh をベースシステムに導入した後の
4.0-STABLE</entry>
<entry>400021</entry>
</row>
<row>
<entry>4.1-RELEASE</entry>
<entry>410000</entry>
</row>
<row>
<entry>4.1-RELEASE 以降の 4.1-STABLE</entry>
<entry>410001</entry>
</row>
<row>
<entry>&man.setproctitle.3; が libutil から libc に
移動した後の 4.1-STABLE</entry>
<entry>410002</entry>
</row>
<row>
<entry>4.1.1-RELEASE</entry>
<entry>411000</entry>
</row>
<row>
<entry>4.1.1-RELEASE 以降の 4.1.1-STABLE</entry>
<entry>411001</entry>
</row>
<row>
<entry>4.2-RELEASE</entry>
<entry>420000</entry>
</row>
<row>
<entry>libgcc.a と libgcc_r.a の結合および、関連する
GCC linkage 変更が行なわれた後の 4.2-STABLE</entry>
<entry>420001</entry>
</row>
<row>
<entry>4.3-RELEASE</entry>
<entry>430000</entry>
</row>
<row>
<entry>wint_t 導入後の 4.3-STABLE</entry>
<entry>430001</entry>
</row>
<row>
<entry>PCI パワーステート API マージ後の 4.3-STABLE</entry>
<entry>430002</entry>
</row>
<row>
<entry>4.4-RELEASE</entry>
<entry>440000</entry>
</row>
<row>
<entry>d_thread_t 導入後の 4.4-STABLE</entry>
<entry>440001</entry>
</row>
<row>
<entry>マウント構造変更 (ファイルシステム kld に影響あり)
後の 4.4-STABLE</entry>
<entry>440002</entry>
</row>
<row>
<entry>smbfs のユーザランド部が取り込まれた後の
4.4-STABLE</entry>
<entry>440003</entry>
</row>
<row>
<entry>4.5-RELEASE</entry>
<entry>450000</entry>
</row>
<row>
<entry>usb の構成要素の名称が変更された後の 4.5-STABLE</entry>
<entry>450001</entry>
</row>
<row>
<entry>&man.rc.conf.5;
<literal>sendmail_enable</literal> 変数が
<literal>NONE</literal> という値をとれるようになった後の
4.5-STABLE</entry>
<entry>450004</entry>
</row>
<row>
<entry>package 作成のデフォルトを XFree86 4
に移行した後の 4.5-STABLE</entry>
<entry>450005</entry>
</row>
<row>
<entry>accept filter が修正され、
簡単なサービス妨害攻撃には影響を受けなくなった後の
4.5-STABLE</entry>
<entry>450006</entry>
</row>
<row>
<entry>4.6-RELEASE</entry>
<entry>460000</entry>
</row>
<row>
<entry>&man.sendfile.2;
をドキュメントに適合するよう修正して、
送信されたいかなるヘッダも、
ファイルから送信されたデータの総量に合計しないようにした
4.6-STABLE</entry>
<entry>460001</entry>
</row>
<row>
<entry>4.6.2-RELEASE</entry>
<entry>460002</entry>
</row>
<row>
<entry>4.6-STABLE</entry>
<entry>460100</entry>
</row>
<row>
<entry>`sed -i' を MFC した後の 4.6-STABLE</entry>
<entry>460101</entry>
</row>
<row>
<entry>多くの新たな pkg_install の機能を HEAD から MFC
した後の 4.6-STABLE</entry>
<entry>460102</entry>
</row>
<row>
<entry>4.7-RELEASE</entry>
<entry>470000</entry>
</row>
<row>
<entry>4.7-STABLE</entry>
<entry>470100</entry>
</row>
<row>
<entry>__sF の代わりに __std{in,out,err}p 参照生成を開始。
これは、std{in,out,err} をコンパイル時の定数から、
ランタイムに変更します。</entry>
<entry>470101</entry>
</row>
<row>
<entry>m_aux mbuf を m_tag で置き換える mbuf
の変更を MFC した後の 4.7-STABLE</entry>
<entry>470102</entry>
</row>
<row>
<entry>OpenSSL 0.9.7 導入後の 4.7-STABLE</entry>
<entry>470103</entry>
</row>
<row>
<entry>4.8-RELEASE</entry>
<entry>480000</entry>
</row>
<row>
<entry>4.8-STABLE</entry>
<entry>480100</entry>
</row>
<row>
<entry>&man.realpath.3; がスレッドセーフになった後の
4.8-STABLE</entry>
<entry>480101</entry>
</row>
<row>
<entry>4.8-STABLE における twe の 3ware API の変更</entry>
<entry>480102</entry>
</row>
<row>
<entry>4.9-RELEASE</entry>
<entry>490000</entry>
</row>
<row>
<entry>4.9-STABLE</entry>
<entry>490100</entry>
</row>
<row>
<entry>構造体 kinfo_eproc に e_sid が追加された後の
4.9-STABLE</entry>
<entry>490101</entry>
</row>
<row>
<entry>rtld に libmap 機能を MFC した後の
4.9-STABLE</entry>
<entry>490102</entry>
</row>
<row>
<entry>4.10-RELEASE</entry>
<entry>491000</entry>
</row>
<row>
<entry>5.0-CURRENT</entry>
<entry>500000</entry>
</row>
<row>
<entry>ELF ヘッダフィールドの追加と ELF バイナリのマーク付け
(branding) 方法の変更後の 5.0-CURRENT</entry>
<entry>500001</entry>
</row>
<row>
<entry>kld メタデータ変更後の 5.0-CURRENT</entry>
<entry>500002</entry>
</row>
<row>
<entry>buf/bio 変更後の 5.0-CURRENT</entry>
<entry>500003</entry>
</row>
<row>
<entry>binutils アップグレード後の 5.0-CURRENT</entry>
<entry>500004</entry>
</row>
<row>
<entry>libxpg4 コードの libc へのマージと、
TASKQ インターフェイスの導入後の 5.0-CURRENT</entry>
<entry>500005</entry>
</row>
<row>
<entry>AGP インターフェイス追加後の 5.0-CURRENT</entry>
<entry>500006</entry>
</row>
<row>
<entry>Perl を 5.6.0 にアップグレードした後の
5.0-CURRENT</entry>
<entry>500007</entry>
</row>
<row>
<entry>KAME コードを 2000/07 版のソースに更新した後の
5.0-CURRENT</entry>
<entry>500008</entry>
</row>
<row>
<entry>ether_ifattach() および
ether_ifdetach() 変更後の 5.0-CURRENT</entry>
<entry>500009</entry>
</row>
<row>
<entry>mtree のデフォルトをオリジナルの変種に戻し、
シンボリックリンクをたどる -L オプションを追加した後の
5.0-CURRENT</entry>
<entry>500010</entry>
</row>
<row>
<entry>kqueue API 変更後の 5.0-CURRENT</entry>
<entry>500011</entry>
</row>
<row>
<entry>&man.setproctitle.3; が libutil から libc
へ移動した後の 5.0-CURRENT</entry>
<entry>500012</entry>
</row>
<row>
<entry>最初の SMPng がコミットされた後の
5.0-CURRENT</entry>
<entry>500013</entry>
</row>
<row>
<entry>&lt;sys/select.h&gt;&lt;sys/selinfo.h&gt;
移動した後の 5.0-CURRENT</entry>
<entry>500014</entry>
</row>
<row>
<entry>libgcc.a と libgcc_r.a の結合および関連する
GCC linkage 変更が行なわれた後の 5.0-CURRENT</entry>
<entry>500015</entry>
</row>
<row>
<entry>libc と libc_r の混合リンクを許し、
-pthread オプションを deprecate する
変更後の 5.0-CURRENT</entry>
<entry>500016</entry>
</row>
<row>
<entry>mountd 等が使用する kernel-exported API の
安定化のため、ucred 構造体から xucred 構造体へ
移行した後の 5.0-CURRENT</entry>
<entry>500017</entry>
</row>
<row>
<entry>CPU 依存の最適化を制御するための make 変数
CPUTYPE が追加された後の 5.0-CURRENT</entry>
<entry>500018</entry>
</row>
<row>
<entry>&lt;machine/ioctl_fd.h&gt;
&lt;sys/fdcio.h&gt; に移動した後の 5.0-CURRENT</entry>
<entry>500019</entry>
</row>
<row>
<entry>ロケール名変更の後の 5.0-CURRENT</entry>
<entry>500020</entry>
</row>
<row>
<entry>Bzip2 導入後の 5.0-CURRENT。
また、S/Key が削除されていることも示す。</entry>
<entry>500021</entry>
</row>
<row>
<entry>SSE サポート後の 5.0-CURRENT</entry>
<entry>500022</entry>
</row>
<row>
<entry>KSE マイルストーン 2 以降の 5.0-CURRENT</entry>
<entry>500023</entry>
</row>
<row>
<entry>d_thread_t 導入、および UUCP を ports
に移動した後の 5.0-CURRENT</entry>
<entry>500024</entry>
</row>
<row>
<entry>64 ビットプラットホーム上のデスクリプタおよび
cred 受け渡し ABI 変更後の 5.0-CURRENT</entry>
<entry>500025</entry>
</row>
<row>
<entry>package 作成のデフォルトを XFree86 4
に移行し、libc に新たに strnstr() 関数を追加した後の
5.0-CURRENT</entry>
<entry>500026</entry>
</row>
<row>
<entry>libc に新たに strcasestr() 関数を追加した後の
5.0-CURRENT</entry>
<entry>500027</entry>
</row>
<row>
<entry>smbfs のユーザランド部が取り込まれた後の
5.0-CURRENT</entry>
<entry>500028</entry>
</row>
<row>
<entry>C99 の新しい特定サイズの整数型追加後の
5.0-CURRENT</entry>
<entry>500028 (変更なし)</entry>
</row>
<row>
<entry>&man.sendfile.2; の戻り値が変更された後の
5.0-CURRENT</entry>
<entry>500029</entry>
</row>
<row>
<entry>ファイルフラグにふさわしいサイズの
<literal>fflags_t</literal> が導入された後の
5.0-CURRENT</entry>
<entry>500030</entry>
</row>
<row>
<entry>usb の構成要素の名称が変更された後の 5.0-CURRENT</entry>
<entry>500031</entry>
</row>
<row>
<entry>Perl 5.6.1 導入後の 5.0-CURRENT</entry>
<entry>500032</entry>
</row>
<row>
<entry>&man.rc.conf.5;
<literal>sendmail_enable</literal> 変数が
<literal>NONE</literal> という値をとれるようになった後の
5.0-CURRENT</entry>
<entry>500033</entry>
</row>
<row>
<entry>mtx_init() に 3 番目の引数が加わった後の
5.0-CURRENT</entry>
<entry>500034</entry>
</row>
<row>
<entry>GCC 3.1 が取り込まれた 5.0-CURRENT</entry>
<entry>500035</entry>
</row>
<row>
<entry>/usr/src に Perl がなくなった 5.0-CURRENT</entry>
<entry>500036</entry>
</row>
<row>
<entry>&man.dlfunc.3; 追加後の 5.0-CURRENT</entry>
<entry>500037</entry>
</row>
<row>
<entry>構造体 sockbuf
のメンバの型が一部変更され、順序が変更された後の
5.0-CURRENT</entry>
<entry>500038</entry>
</row>
<row>
<entry>ヘッダで _BSD_FOO_T_ の使用をやめ、
_FOO_T_DECLARED を使うようになった後の 5.0-CURRENT。
また、この変数は &man.bzip2.1;
パッケージに対応したことが確実な目安としても使えます。</entry>
<entry>500039</entry>
</row>
<row>
<entry>ディスクラベルの内部構造の依存性を除く名目で行われた、
ディスク関連の機能へのさまざまな変更を加えた後の
5.0-CURRENT</entry>
<entry>500040</entry>
</row>
<row>
<entry>libc に &man.getopt.long.3; を加えた後の
5.0-CURRENT</entry>
<entry>500041</entry>
</row>
<row>
<entry>Binutils 2.13 にアップグレードした後の
5.0-CURRENT。このアップグレードには、新たな FreeBSD
の emulation, vec および出力形式が含まれている。
</entry>
<entry>500042</entry>
</row>
<row>
<entry>libc に pthread_XXX への弱いスタブを追加し、
libXThrStub.so が obsolete になった後の 5.0-CURRENT。
5.0-RELEASE</entry>
<entry>500043</entry>
</row>
<row>
<entry>RELENG_5_0 が分岐した後の 5.0-CURRENT</entry>
<entry>500100</entry>
</row>
<row>
<entry>&lt;sys/dkstat.h&gt; は空なので include
すべきではない</entry>
<entry>500101</entry>
</row>
<row>
<entry>d_mmap_t インターフェイス変更後の
5.0-CURRENT</entry>
<entry>500102</entry>
</row>
<row>
<entry>taskqueue_swi が Giant ロック無しで実行され、
Giant ロックされて実行される taskqueue_swi_giant
が追加された後の 5.0-CURRENT</entry>
<entry>500103</entry>
</row>
<row>
<entry>cdevsw_add() と cdevsw_remove()
はもう存在しません。
MAJOR_AUTO 割り当て機能が登場しました</entry>
<entry>500104</entry>
</row>
<row>
<entry>cdevsw の新たな初期化方法が導入された後の
5.0-CURRENT</entry>
<entry>500105</entry>
</row>
<row>
<entry>devstat_add_entry() が devstat_new_entry()
に置き換えられました</entry>
<entry>500106</entry>
</row>
<row>
<entry>Devstat のインターフェイス変更。
sys/sys/param.h 1.149 を参照のこと</entry>
<entry>500107</entry>
</row>
<row>
<entry>トークンリングインターフェイスの変更</entry>
<entry>500108</entry>
</row>
<row>
<entry>vm_paddr_t の追加</entry>
<entry>500109</entry>
</row>
<row>
<entry>&man.realpath.3; がスレッドセーフになった後の
5.0-CURRENT</entry>
<entry>500110</entry>
</row>
<row>
<entry>&man.usbhid.3; が NetBSD と同期した後の
5.0-CURRENT</entry>
<entry>500111</entry>
</row>
<row>
<entry>新たな NSS 実装と
POSIX.1 準拠の getpw*_r, getgr*_r
関数が導入後の 5.0-CURRENT</entry>
<entry>500112</entry>
</row>
<row>
<entry>古い rc システムを削除した後の 5.0-CURRENT</entry>
<entry>500113</entry>
</row>
<row>
<entry>5.1-RELEASE</entry>
<entry>501000</entry>
</row>
<row>
<entry>RELENG_5_1 が分岐した後の 5.1-CURRENT</entry>
<entry>501100</entry>
</row>
<row>
<entry>sigtimedwait(2) と sigwaitinfo(2)
の動作を修正した後の 5.1-CURRENT</entry>
<entry>501101</entry>
</row>
<row>
<entry>&man.bus.dma.tag.create.9;
lockfunc と lockfuncarg フィールドを追加した後の
5.1-CURRENT</entry>
<entry>501102</entry>
</row>
<row>
<entry>GCC 3.3.1-pre 20030711 snapshot
導入後の 5.1-CURRENT</entry>
<entry>501103</entry>
</row>
<row>
<entry>5.1-CURRENT における twe の 3ware API の変更</entry>
<entry>501104</entry>
</row>
<row>
<entry>/bin と /sbin がダイナミックリンクされ、
ライブラリを /lib に移動した 5.1-CURRENT</entry>
<entry>501105</entry>
</row>
<row>
<entry>Coda 6.x のカーネルサポートを追加した後の
5.1-CURRENT</entry>
<entry>501106</entry>
</row>
<row>
<entry>16550 UART 定数を
<filename>&lt;dev/sio/sioreg.h&gt;</filename> から
<filename>&lt;dev/ic/ns16550.h&gt;</filename>
に移動した後の 5.1-CURRENT。
また、rtld が 無条件で libmap 機能をサポートした時点。</entry>
<entry>501107</entry>
</row>
<row>
<entry>PFIL_HOOKS API を更新した後の 5.1-CURRENT</entry>
<entry>501108</entry>
</row>
<row>
<entry>kiconv(3) を追加した後の 5.1-CURRENT</entry>
<entry>501109</entry>
</row>
<row>
<entry>cdevsw の open および close
のデフォルトの操作を変更した後の 5.1-CURRENT</entry>
<entry>501110</entry>
</row>
<row>
<entry>cdevsw のレイアウトを変更した後の 5.1-CURRENT</entry>
<entry>501111</entry>
</row>
<row>
<entry>kobj の多重継承を追加した後の 5.1-CURRENT</entry>
<entry>501112</entry>
</row>
<row>
<entry>構造体 ifnet の if_xname が変更された後の
5.1-CURRENT</entry>
<entry>501113</entry>
</row>
<row>
<entry>/bin と /sbin をダイナミックリンクに変更した後の
5.1-CURRENT</entry>
<entry>501114</entry>
</row>
<row>
<entry>5.2-RELEASE</entry>
<entry>502000</entry>
</row>
<row>
<entry>5.2.1-RELEASE</entry>
<entry>502010</entry>
</row>
<row>
<entry>RELENG_5_2 が分岐した後の 5.2-CURRENT</entry>
<entry>502100</entry>
</row>
<row>
<entry>__cxa_atexit/__cxa_finalize 関数が libc
に追加された後の 5.2-CURRENT</entry>
<entry>502101</entry>
</row>
<row>
<entry>デフォルトの pthread ライブラリを
libc_r から libpthread に変更した後の
5.2-CURRENT</entry>
<entry>502102</entry>
</row>
<row>
<entry>デバイスドライバ API の大規模パッチをあてた後の
5.2-CURRENT</entry>
<entry>502103</entry>
</row>
<row>
<entry>getopt_long_only() が追加された後の
5.2-CURRENT</entry>
<entry>502104</entry>
</row>
<row>
<entry>C に対して NULL が ((void *)0)
になり、warning をより多く出すようになった
5.2-CURRENT</entry>
<entry>502105</entry>
</row>
<row>
<entry>pf がビルドおよびインストールされるようになった後の
5.2-CURRENT</entry>
<entry>502106</entry>
</row>
<row>
<entry>sparc64 で time_t を 64 ビットの値に変更した後の
5.2-CURRENT</entry>
<entry>502107</entry>
</row>
<row>
<entry>一部のヘッダで Intel C/C++ に対応し、
execve(2) をより厳密に POSIX に適合させた後の
5.2-CURRENT</entry>
<entry>502108</entry>
</row>
<row>
<entry>bus_alloc_resource_any API 導入後の
5.2-CURRENT</entry>
<entry>502109</entry>
</row>
<row>
<entry>UTF-8 ロケール追加後の 5.2-CURRENT</entry>
<entry>502110</entry>
</row>
<row>
<entry>getvfsent(3) API を削除した後の 5.2-CURRENT</entry>
<entry>502111</entry>
</row>
<row>
<entry>make に .warning 命令を追加した後の
5.2-CURRENT</entry>
<entry>502112</entry>
</row>
</tbody>
</tgroup>
</table>
<note>
<para>(2.2-STABLE は 2.2.5-RELESE 以後、
<quote>2.2.5-STABLE</quote> と呼ばれることがあります。)
見てのとおりこれは年・月というフォーマットになっていましたが、
バージョン 2.2 からより直接的にメジャー/マイナー番号を使うように変更になりました。
並行していくつかのブランチ (枝分かれしたバージョン)
を開発する場合には、
リリースされた日付でそれらのリリースを分類することが不可能だからです
(あなたが今 port
を作成するときに、古い -CURRENT 達について心配する必要はありません。
これは参考のために挙げられているに過ぎないからです)。</para>
</note>
</sect1>
<sect1 xml:id="dads-after-port-mk">
<title><filename>bsd.port.mk</filename> の後に書くこと</title>
<para><literal>.include &lt;bsd.port.mk&gt;</literal>
の行の後には何も書かないようにしてください。
大抵の場合は
<filename>Makefile</filename> の中程のどこかで
<filename>bsd.port.pre.mk</filename> をインクルードして、
最後に <filename>bsd.port.pre.mk</filename>
をインクルードすることによって避けることができます。</para>
<note>
<para><filename>bsd.port.pre.mk</filename>/<filename>bsd.port.post.mk</filename>
のペアか <filename>bsd.port.mk</filename>
だけのどちらかだけをインクルードし、二つを混ぜないでください。</para>
</note>
<para>前者はいくつかの変数の定義だけをして
<filename>Makefile</filename>
でのテストに使用し、後者は残りを定義します。</para>
<para>以下は <filename>bsd.port.pre.mk</filename>
で定義される重要な変数です
(これは、すべてではありません。
完全なリストは <filename>bsd.port.mk</filename> を参照してください)。
</para>
<informaltable frame="none">
<tgroup cols="2">
<thead>
<row>
<entry>変数名</entry>
<entry>解説</entry>
</row>
</thead>
<tbody>
<row>
<entry><varname>ARCH</varname></entry>
<entry><command>uname -m</command>
で返されるアーキテクチャ。(例、<literal>i386</literal>)。
</entry>
</row>
<row>
<entry><varname>OPSYS</varname></entry>
<entry><command>uname -s</command>
で返されるオペレーティングシステム
(例、<literal>FreeBSD</literal>)。</entry>
</row>
<row>
<entry><varname>OSREL</varname></entry>
<entry>オペレーティングシステムのリリースバージョン
(例、<literal>2.1.5</literal>,
<literal>2.2.7</literal>)。</entry>
</row>
<row>
<entry><varname>OSVERSION</varname></entry>
<entry>数字形式のオペレーティングシステムのバージョン、
上記の <link linkend="freebsd-versions"><literal>__FreeBSD_version</literal></link>
と同じです。</entry>
</row>
<row>
<entry><varname>PORTOBJFORMAT</varname></entry>
<entry>システムのオブジェクトフォーマット
(<literal>elf</literal> あるいは <literal>aout</literal>
ただし、<quote>最近の</quote> FreeBSD
のバージョンでは <literal>aout</literal>
は廃止予定になっています)。</entry>
</row>
<row>
<entry><varname>LOCALBASE</varname></entry>
<entry><quote>local</quote> ツリーのベース。
(例、<literal>/usr/local/</literal>)。
</entry>
</row>
<row>
<entry><varname>X11BASE</varname></entry>
<entry><quote>X11</quote> ツリーのベース。
(例、<literal>/usr/X11R6/</literal>)。
</entry>
</row>
<row>
<entry><varname>PREFIX</varname></entry>
<entry>ports のインストール先
(<link linkend="porting-prefix">
<varname>PREFIX</varname>について</link>を参照)。
</entry>
</row>
</tbody>
</tgroup>
</informaltable>
<note>
<para><varname>USE_IMAKE</varname>,
<varname>USE_X_PREFIX</varname> あるいは
<varname>MASTERDIR</varname>
などの変数を定義する必要がある場合には、
<filename>bsd.port.pre.mk</filename>
をインクルード前に定義してください。
他のものは <filename>bsd.port.pre.mk</filename>
の前でも後でもかまいません。</para>
</note>
<para>以下は <filename>bsd.port.pre.mk</filename>
の後に書けるものの例です。</para>
<programlisting># no need to compile lang/perl5 if perl5 is already in system
.if ${OSVERSION} &gt; 300003
BROKEN= perl is in system
.endif
# only one shlib version number for ELF
.if ${PORTOBJFORMAT} == "elf"
TCL_LIB_FILE= ${TCL_LIB}.${SHLIB_MAJOR}
.else
TCL_LIB_FILE= ${TCL_LIB}.${SHLIB_MAJOR}.${SHLIB_MINOR}
.endif
# software already makes link for ELF, but not for a.out
post-install:
.if ${PORTOBJFORMAT} == "aout"
${LN} -sf liblinpack.so.1.0 ${PREFIX}/lib/liblinpack.so
.endif</programlisting>
<para><literal>BROKEN=</literal>
<literal>TCL_LIB_FILE=</literal>
の後にスペースではなくタブを使うことを覚えていましたか?
<!-- smiley -->:-)</para>
</sect1>
<sect1 xml:id="dads-documentation">
<title>付加的な文書のインストール</title>
<para>普通のマニュアルや info
ファイルの他にユーザにとって有用だと思えるような文書がある場合には、
<filename> PREFIX/share/doc</filename>
の下にインストールしてください。
これは前記と同様 <buildtarget>post-install</buildtarget>
ターゲットの中から行なうと良いでしょう。</para>
<para>まず、あなたの port のために新しいディレクトリを作ります。
どの port の文書か簡単にわかるような名前にする必要がありますので、
普通は <varname>PORTNAME</varname> を使うと良いでしょう。
もちろん、ユーザが異なるバージョンのものを同時に使うことが予想される
port の場合には
<varname>PKGNAME</varname> をそのまま使っても構いません。</para>
<para>ユーザが <filename>/etc/make.conf</filename>
でこの部分を禁止するために
<varname>NOPORTDOCS</varname>
という変数をセットしている場合には、
これらの文書がインストールされないようにしてください。
こんな具合です。</para>
<programlisting>post-install:
.if !defined(NOPORTDOCS)
${MKDIR} ${DOCSDIR}
${INSTALL_MAN} ${WRKSRC}/docs/xvdocs.ps ${DOCSDIR}
.endif</programlisting>
<para>ここでは、変数をいくつかと、それを
<filename>Makefile</filename>
で利用した時にどう展開されるかを説明します。</para>
<itemizedlist>
<listitem>
<para><literal>${DATADIR}</literal>
<filename>${PREFIX}/share/${PORTNAME}</filename>
に展開されます。</para>
</listitem>
<listitem>
<para><literal>${DOCSDIR}</literal>
<filename>${PREFIX}/share/doc/${PORTNAME}</filename>
に展開されます。</para>
</listitem>
<listitem>
<para><literal>${EXAMPLESDIR}</literal>
<filename>${PREFIX}/share/examples/${PORTNAME}</filename>
に展開されます。</para>
</listitem>
</itemizedlist>
<para>文書ファイルおよびディレクトリはすべて
<filename>pkg-plist</filename> の中に
<literal>%%PORTDOCS%%</literal> を頭につけて書く必要があります。
たとえば、次のようにしてください。</para>
<programlisting>%%PORTDOCS%%%%DOCSDIR%%/AUTHORS
%%PORTDOCS%%%%DOCSDIR%%/CONTACT
%%PORTDOCS%%@dirrm %%DOCSDIR%%</programlisting>
<para>インストール時に <filename>pkg-message</filename>
ファイルを利用してメッセージを表示することができます。詳細は
<link linkend="porting-message">pkg-message を使う</link>
のセクションを参照してください。</para>
<!-- kuriyama - note below is not exist in Jap ver, but Eng ver has it. why? -->
<note>
<para><filename>pkg-message</filename>
ファイルを <filename>pkg-plist</filename>
に加える必要はありません。</para>
</note>
</sect1>
<sect1 xml:id="dads-subdirs">
<title>ディレクトリ構成</title>
<para>インストール時には <varname>PREFIX</varname>
の正しいサブディレクトリにファイルを置くように心がけてください。
ソフトウェアによっては新しいディレクトリを一つ作って、
ファイルを全部それに入れてしまうものがありますが、
それは良くありません。
また、バイナリ、ヘッダファイルとマニュアル以外のすべてを
<filename>lib</filename> というディレクトリに入れてしまう
port もありますが、これも
BSD 的なファイルシステム構成とはうまく合いません。
これは以下のように分散すべきです。
<filename>etc</filename>
にセットアップ/コンフィグレーションファイル、
<filename>libexec</filename> に内部で使用されるプログラム
(コマンドラインから呼ばれることのないコマンド)、
<filename>sbin</filename> に管理者用のコマンド、
<filename>info</filename> に GNU Info 用の文書、
そして <filename>share</filename>
にアーキテクチャに依存しないファイルが入ります。
詳細については &man.hier.7; を参照してください。
<filename>/usr</filename> の構成方針はほとんどそのまま
<filename>/usr/local</filename> にもあてはまります。
USENET <quote>ニュース</quote>を扱う ports は例外です。
これらはファイルのインストール先として
<filename>PREFIX/news</filename>
を使用します。</para>
</sect1>
<sect1 xml:id="porting-cleaning">
<title>空のディレクトリの削除</title>
<para>ports は削除の際に、
自分自身を消去したあとに
(ディレクトリの)
削除をするようにしてください。
これは大抵の場合 <literal>@dirrm</literal> の行を
ports が作成するすべてのディレクトリについて加えることによって実現できます。
親ディレクトリは子ディレクトリを先に消さないと消せないことに注意してください。</para>
<programlisting> :
lib/X11/oneko/pixmaps/cat.xpm
lib/X11/oneko/sounds/cat.au
:
@dirrm lib/X11/oneko/pixmaps
@dirrm lib/X11/oneko/sounds
@dirrm lib/X11/oneko</programlisting>
<para>といった感じです。</para>
<para>しかし時として、
他の port とディレクトリを共有しているために
<literal>@dirrm</literal> がエラーを返すことがあります。
<command>rmdir</command>
<literal>@unexec</literal>
から呼びだすことによって、
警告(warning)なしで空のディレクトリのみを削除することができます。
</para>
<programlisting>@unexec rmdir %D/share/doc/gimp 2&gt;/dev/null || true</programlisting>
<para>これを使えば、たとえ他の
port がファイルをインストールしていて
<filename>PREFIX/share/doc/gimp</filename>
が空でない場合でもエラーメッセージは表示されませんし、
&man.pkg.delete.1;
が異常終了することもありません。</para>
</sect1>
<sect1 xml:id="dads-uid">
<title>UID</title>
<para>あなたの port が、
インストールされるシステム上に特定のユーザを必要とする場合は
<filename>pkg-install</filename> スクリプトから
<command>pw</command>
コマンドを実行して自動的にそのユーザを追加するようにしてください。
<package>net/cvsup-mirror</package>
の port が参考になるでしょう。</para>
<para>あなたの port がバイナリの
package としてインストールされる場合とコンパイルされる場合の両方で、
同じユーザー/グループ ID を使わなければならないのなら、50 から
999 の間で空いている UID を選んで登録してください。
<package>japanese/Wnn6</package> の port
が参考になるでしょう。</para>
<para>既にシステムや他の port で利用されている
UID を使わないように十分注意してください。</para>
<para>現在の 50 から 999 までの間の UID は以下のとおりです。</para>
<!-- Please keep this list sorted by uid -->
<programlisting>bind:*:53:53:Bind Sandbox:/:/sbin/nologin
majordom:*:54:54:Majordomo Pseudo User:/usr/local/majordomo:/nonexistent
cyrus:*:60:60:the cyrus mail server:/nonexistent:/nonexistent
gnats:*:61:1:GNATS database owner:/usr/local/share/gnats/gnats-db:/bin/sh
proxy:*:62:62:Packet Filter pseudo-user:/nonexistent:/nonexistent
uucp:*:66:66:UUCP pseudo-user:/var/spool/uucppublic:/usr/libexec/uucp/uucico
xten:*:67:67:X-10 daemon:/usr/local/xten:/nonexistent
pop:*:68:6:Post Office Owner (popper):/nonexistent:/sbin/nologin
wnn:*:69:7:Wnn:/nonexistent:/nonexistent
pgsql:*:70:70:PostgreSQL pseudo-user:/usr/local/pgsql:/bin/sh
oracle:*:71:71::0:0:Oracle:/usr/local/oracle7:/sbin/nologin
ircd:*:72:72:IRC daemon:/nonexistent:/nonexistent
ircservices:*:73:73:IRC services:/nonexistent:/nonexistent
ifmail:*:75:66:Ifmail user:/nonexistent:/nonexistent
www:*:80:80:World Wide Web Owner:/nonexistent:/sbin/nologin
alias:*:81:81:QMail user:/var/qmail/alias:/nonexistent
qmaild:*:82:81:QMail user:/var/qmail:/nonexistent
qmaill:*:83:81:QMail user:/var/qmail:/nonexistent
qmailp:*:84:81:QMail user:/var/qmail:/nonexistent
qmailq:*:85:82:QMail user:/var/qmail:/nonexistent
qmailr:*:86:82:QMail user:/var/qmail:/nonexistent
qmails:*:87:82:QMail user:/var/qmail:/nonexistent
mysql:*:88:88:MySQL Daemon:/var/db/mysql:/sbin/nologin
vpopmail:*:89:89:VPop Mail User:/usr/local/vpopmail:/nonexistent
firebird:*:90:90:Firebird Database Administrator:/usr/local/firebird:/bin/sh
mailman:*:91:91:Mailman User:/usr/local/mailman:/sbin/nologin
gdm:*:92:92:GDM Sandbox:/:/sbin/nologin
jabber:*:93:93:Jabber Daemon:/nonexistent:/nonexistent
p4admin:*:94:94:Perforce admin:/usr/local/perforce:/sbin/nologin
interch:*:95:95:Interchange user:/usr/local/interchange:/sbin/nologin
squeuer:*:96:96:SQueuer Owner:/nonexistent:/bin/sh
mud:*:97:97:MUD Owner:/usr/local/share/dgd:/bin/sh
msql:*:98:98:mSQL-2 pseudo-user:/var/db/msqldb:/bin/sh
rscsi:*:99:99:Remote SCSI:/usr/local/rscsi:/usr/local/sbin/rscsi
squid:*:100:100:squid caching-proxy pseudo user:/usr/local/squid:/sbin/nologin
quagga:*:101:101:Quagga route daemon pseudo user:/usr/local/etc/quagga:/sbin/nologin
ganglia:*:102:102:Ganglia User:/nonexistent:/sbin/nologin
sgeadmin:*:103:103:Sun Grid Engine Admin:/nonexistent:/sbin/nologin
slimserv:*:104:104:Slim Devices SlimServer pseudo-user:/nonexistent:/sbin/nologin
fido:*:111:111:Fido System:/usr/local/fido:/bin/sh
postfix:*:125:125:Postfix Mail System:/var/spool/postfix:/sbin/nologin
rbldns:*:153:153:rbldnsd pseudo-user:/nonexistent:/sbin/nologin
sfs:*:171:171:Self-Certifying File System:/nonexistent:/sbin/nologin
agk:*:172:172:AquaGateKeeper:/nonexistent:/nonexistent
ldap:*:389:389:OpenLDAP Server:/nonexistent:/sbin/nologin
drweb:*:426:426:Dr.Web Mail Scanner:/nonexistent:/sbin/nologin
qtss:*:554:554:Darwin Streaming Server:/nonexistent:/sbin/nologin
ircdru:*:555:555:Russian hybrid IRC server:/nonexistent:/bin/sh
bacula:*:910:910:Bacula Daemon:/var/db/bacula:/sbin/nologin</programlisting>
<para>以下は、現在予約されている GID の一覧です。</para>
<!-- Please keep this list sorted by uid -->
<!-- XXX incomplete! -->
<programlisting>bind:*:53:
cyrus:*:60:
proxy:*:62:
authpf:*:63:
uucp:*:66:
dialer:*:68:
network:*:69:
pgsql:*:70:
www:*:80:
qnofiles:*:81:
qmail:*:82:
mailman:*:91:
postfix:*:125:
maildrop:*:126:
rbldns:*:153:
qtss:*:554:
ircdru:*:555:</programlisting>
<para>このリストを最新の状態に保つためにも、
この範囲の UID や GID を予約するような port を作ったり、
既存の port にそのような改変を行なってわたしたちに送るときには
UID の予約に関する注意書きをつけてください。</para>
</sect1>
<sect1 xml:id="dads-rational">
<title>合理的な port</title>
<para><filename>Makefile</filename>
は単純かつ適切であるべきです。もし、
<filename>Makefile</filename> を数行短かくできたり、
もっと読みやすくできるのであればそうしてください。
たとえば、
シェルの <literal>if</literal> 構文を使うかわりに
make の <literal>.if</literal> 構文を使う、
<varname>EXTRACT*</varname> の再定義で代用できるのであれば
<buildtarget>do-extract</buildtarget> を再定義しない、
<literal>CONFIGURE_ARGS += --prefix=&dollar;{PREFIX}</literal>
とするかわりに
<varname>GNU_CONFIGURE</varname> とする、などです。</para>
<para>何かをするのに自分で新しくコードをたくさん書かなければならなくなった場合は、
戻って <filename>bsd.port.mk</filename>
であなたがやろうとしていることが既に実装されていないか見直してください。
読むのは大変ですが、難しく見える問題で
<filename>bsd.port.mk</filename>
が簡単な解決法を提供しているものが数多くあります。</para>
</sect1>
<sect1 xml:id="dads-cc">
<title><varname>CC</varname> および <varname>CXX</varname>
の尊重</title>
<para>Port は <varname>CC</varname> および <varname>CXX</varname>
変数を尊重すべきです。ここで言いたいのは、port
は、既存の値を上書きしてこれらの変数をまるごと設定しなおすべきではなく、
その代わり必要な値を既存の値に追加してゆくべきだということです。
そうすれば、すべての ports
に影響するビルドオプションをグローバルに設定できます。</para>
<para>Port がこれらの変数を尊重しない場合は、
<filename>Makefile</filename>
<literal>NO_PACKAGE=ignores either cc or cxx</literal>
を追加してください。</para>
<para><varname>CC</varname><varname>CXX</varname>
変数を尊重している <filename>Makefile</filename>
の例を次に示します。<varname>?=</varname> に注意してください。</para>
<programlisting>CC ?= gcc</programlisting>
<programlisting>CXX ?= g++</programlisting>
<para>こちらは、<varname>CC</varname> 変数も <varname>CXX</varname>
変数も尊重していない例です。</para>
<programlisting>CC = gcc</programlisting>
<programlisting>CXX = g++</programlisting>
<para>FreeBSD システム上では、<varname>CC</varname> および
<varname>CFLAGS</varname>
変数は、どちらも <filename>/etc/make.conf</filename>
で定義できます。最初の例では、システム全体の定義を保存している
<filename>/etc/make.conf</filename>
で値がすでに設定されてない場合に限って、値を設定します。
2 番目の例では、すでに設定されていた内容を上書きしてしまいます。</para>
</sect1>
<sect1 xml:id="dads-cflags">
<title><varname>CFLAGS</varname> の尊重</title>
<para><varname>CFLAGS</varname> 変数は尊重すべきです。
ここでいいたいのは、port は、
既存の値を上書きしてこの変数をまるごと設定しなおすべきではなく、
その代わり必要な値を既存の値に追加してゆくべきだということです。
そうすれば、すべてての ports
に影響するビルドオプションをグローバルに設定できます。</para>
<para>port がこれを尊重しない場合は、
<literal>NO_PACKAGE=ignores cflags</literal>
<filename>Makefile</filename> に加えてください。</para>
<para><varname>CFLAGS</varname> 変数をきちんと考慮した
<filename>Makefile</filename> の例を以下に示します。
<varname>+=</varname> の部分に注目してください。</para>
<programlisting>CFLAGS += -Wall -Werror</programlisting>
<para>次は <varname>CFLAGS</varname>
変数を考慮しない <filename>Makefile</filename> の例です。</para>
<programlisting>CFLAGS = -Wall -Werror</programlisting>
<para><varname>CFLAGS</varname> 変数は、FreeBSD システムの
<filename>/etc/make.conf</filename> で定義されています。
最初の例では既存の定義を保存しつつ <varname>CFLAGS</varname>
変数にオプションフラグを追加しているのに対し、
二番目の例では既存の定義をすべて無効にしてしまっています。</para>
</sect1>
<sect1 xml:id="dads-config">
<title>コンフィグレーション (設定) ファイル</title>
<para>もしあなたの port が設定ファイルを
<filename>PREFIX/etc</filename>
に置く必要がある場合には、それを単純にインストールしたり、
<filename>pkg-plist</filename>
に加えては<emphasis>いけません</emphasis>
こうしてしまうと &man.pkg.delete.1;
によってユーザが苦労して作ったファイルが消えてしまったり、
新しくインストールする時に上書きされてしまったりします。</para>
<para>かわりに見本となるファイルをサフィックス
(<filename>filename.sample</filename>
が良いでしょう)
を付けてインストールして<link linkend="porting-message">メッセージ</link>を表示し、
ソフトウェアを動かす前にユーザがそのファイルをコピーして編集をしなければならないことを知らせましょう。
</para>
</sect1>
<sect1 xml:id="dads-freedback">
<title>フィードバック</title>
<para>port を作るためにソフトウェアに変更を加えたら、
なるべく原作者にその旨を伝えてパッチ等を送ってください。
これらが次のリリースに取り入れられればアップグレードが楽になります。</para>
</sect1>
<sect1 xml:id="dads-readme">
<title><filename>README.html</filename></title>
<para><filename>README.html</filename>
というファイルを含めてはいけません。
このファイルは、cvs コレクションの一部ではなく、
<command>make readme</command>
コマンドで生成されるファイルです。</para>
</sect1>
<sect1 xml:id="dads-broken">
<title>Port に <varname>BROKEN</varname>, <varname>FORBIDDEN</varname>
などの印をつける</title>
<para>ある port にセキュリティ脆弱性があることが判明したり、
根本的に壊れてしまい修正に何時間もの注意深い作業が必要になったり、
基本的には廃れてしまったものの、
何らかの理由で ports ツリーには残される
(もちろんあとで修正しますよね?)
という日が来るのは避けられません。
ある port が壊れていることを示すために、port の
<filename>Makefile</filename> では 3 つの
<command>make</command> 変数が使えます。以下の
<command>make</command> 変数の値は、
その port が壊れている理由を説明するためにユーザに示されます。
それぞれの make 変数は、ユーザと <filename>Makefile</filename>
を処理する自動化システムに対して根本的に異なる意味を伝えますので、
正しい <command>make</command> 変数をお使いください。</para>
<itemizedlist>
<listitem>
<para><varname>BROKEN</varname>
は、動作しないためインストールすべきでない port
用のものです。これは、ユーザがその port
をインストールしないようにしますが、
<varname>BROKEN</varname> とされた port
<link xlink:href="http://bento.FreeBSD.org/">Bento
クラスタ</link>で引き続きビルドされます。
ユーザには port をインストールしてほしくないけれども
Bento ではビルドしてほしい場合は、port
<varname>BROKEN</varname> にしてください。</para>
</listitem>
<listitem>
<para><varname>FORBIDDEN</varname>
は、セキュリティ脆弱性があったり、その port
をインストールすると
FreeBSD システムの安全性に重大な懸念を生じる
(たとえば、セキュアでないという評判があるプログラムや、
容易に悪用できるサービスを提供するプログラムなど)
port 用のものです。
あるソフトウェアの一部に脆弱性があることが判明し、
修正がリリースされていない場合は
<varname>FORBIDDEN</varname> にすべきです。
理想的には、セキュリティ脆弱性が発見された時は、
脆弱性を抱えた FreeBSD ホストの数を減らすために、
ただちに ports を更新すべきです
(我々は、セキュアであるという評判を得たいのです)。
しかし、脆弱性が公表されてから、
脆弱性を抱えたソフトウェアの新しい版がリリースされるまでに無視できない時間があくことがままあります。
セキュリティ以外の理由で port を
<varname>FORBIDDEN</varname> にしないでください。</para>
</listitem>
<listitem>
<para><varname>IGNORE</varname>
は、どんな理由であれビルドすべきではない port 用です。
ユーザも <link xlink:href="http://bento.FreeBSD.org/">Bento
クラスタ</link> も、どんな状況であれ
<varname>IGNORE</varname> とされた port はビルドしません。
嘘だと思うなら、port のビルドを妨げるのに
<varname>IGNORE</varname> を使ってみてください。</para>
</listitem>
</itemizedlist>
<para>この変数を使うのは、port
が更新できない場合の最後の手段にしてください。
ずっと壊れたままの port は、ports
ツリーから完全に削除すべきです。</para>
</sect1>
<sect1 xml:id="dads-workarounds">
<title>必要な回避策</title>
<para>古いバージョンの &os;
のソフトウェアにあるバグを回避する必要があることがあります。</para>
<itemizedlist>
<listitem>
<para>&man.make.1; は、少なくとも 4.8 と 5.0
を含むいくつかのバージョンで、<varname>OSVERSION</varname>
に基づく比較に関してバグがあります。
これは、<command>make describe</command>
の最中にエラーを起こすことになりやすく
(したがって <command>make index</command> 全体も失敗することに)
なります。回避策は、条件比較を括弧にいれることで、たとえば
<programlisting>if ( ${OSVERSION} &gt; 500023 )</programlisting>
となります。4.9 と 5.2 で port のインストールテストを行っても、
この問題は<emphasis>見つかりません</emphasis></para>
</listitem>
</itemizedlist>
</sect1>
<sect1 xml:id="dads-misc">
<title>その他諸々</title>
<para>ファイル <filename>pkg-descr</filename>
<filename>pkg-plist</filename>
はそれぞれ二重にチェックしてください。
再検討してもっと良い記述があればそれに置きかえてください。</para>
<para>GNU General Public License
(GNU一般公有使用許諾)
のコピーは
(すでにあるので)
コピーしないでください。
お願いします。</para>
<para>法律に関することには十分注意をはらってください。
わたしたちに法律に反するような形でソフトウェアの配布をさせないでください!</para>
</sect1>
<sect1 xml:id="dads-stuck">
<title>困ったら…</title>
<para>わたしたちに質問を送る前に、
既存の port の例と
<filename>bsd.port.mk</filename> をちゃんと読んでください!
<!-- smiley --><emphasis>;)</emphasis></para>
<para>それでもわからないことがあったら一人で悩まないでどんどん質問してください!
<!-- smiley --><emphasis>:-)</emphasis></para>
</sect1>
</chapter>
<chapter xml:id="porting-samplem">
<title><filename>Makefile</filename> のサンプル</title>
<para>これは port の
<filename>Makefile</filename> を作る際のお手本です。
かぎかっこ ([]) 内のコメントは忘れずに取ってください。</para>
<para>変数の順番、段落の間の空行など、
<filename>Makefile</filename>
を作るときはなるべくこの形式に従ってください。
この形式は重要な情報が簡単に見つけられるように設計されています。
<link linkend="porting-portlint">portlint</link> を使って
<filename>Makefile</filename> をチェックすることが推奨されています。</para>
<programlisting>[ヘッダ ... どのような port の Makefile かすぐにわかるようになっています]
# New ports collection makefile for: xdvi
["version required" 行は、PORTVERSION 変数では port のバージョンを
十分に表現できない場合にのみ必要です。]
# Date created: 26 May 1995
[このソフトウェアを最初に FreeBSD に port した人の名前、つまり、
この Makefile の最初の版を書いた人です。この port をアップグレー
ドするとき、この行も変えないでください。]
# Whom: Satoshi Asami &lt;asami@FreeBSD.org&gt;
#
# &dollar;FreeBSD&dollar;
[ ^^^^^^^^^ この部分は、CVS ツリーに入れる時に自動的に RCS の ID 文字列に
置き換えられます。]
#
[port 自体、およびオリジナルのソースを取ってくるところを記述する部分。
最初は必ず PORTNAME と PORTVERSION, そして必要なら PKGNAME,
CATEGORIES, 続いて MASTER_SITES が置かれ、さらに MASTER_SITE_SUBDIR が
置かれることもあります。必要なら PKGNAMEPREFIX と PKGNAMESUFFIX が
それに続き、そして DISTNAME, EXTRACT_SUFX, DISTFILES が、
また、その後に必要に応じて EXTRACT_ONLY が置かれます。]
PORTNAME= xdvi
PORTVERSION= 18.2
CATEGORIES= print
[MASTER_SITE_* マクロを使用しない場合は、
最後のスラッシュを忘れないように ("/")!]
MASTER_SITES= ${MASTER_SITE_XCONTRIB}
MASTER_SITE_SUBDIR= applications
DISTNAME= xdvi-pl18
[ソースファイルが標準の ".tar.gz" 形式でない時にこれを使いましょう]
EXTRACT_SUFX= .tar.Z
[配布パッチセクション -- ない場合もあります]
PATCH_SITES= ftp://ftp.sra.co.jp/pub/X11/japanese/
PATCHFILES= xdvi-18.patch1.gz xdvi-18.patch2.gz
[保守責任者 -- これは *必ず* 必要です。担当者 (あなた) 自身、あるいは
担当者に素早く連絡をとれる人のアドレスを書いてください。どうしてもこ
こに自分のアドレスを書くのがいやな人は "ports@FreeBSD.org" と書いて
もいいです]
MAINTAINER= asami@FreeBSD.org
COMMENT= A DVI Previewer for the X Window System
[依存するport -- ない場合もあります]
RUN_DEPENDS= gs:${PORTSDIR}/print/ghostscript
LIB_DEPENDS= Xpm.5:${PORTSDIR}/graphics/xpm
[ここには標準の bsd.port.mk の変数で、上のどれにもあてはまらないものを
書きます]
[コンフィグレーション、コンパイル、インストールなどの時に質問をする
なら…]
IS_INTERACTIVE=yes
[${DISTNAME} 以外のディレクトリにソースが展開されるなら…]
WRKSRC= ${WRKDIR}/xdvi-new
[配布されているパッチが ${WRKSRC} に対する相対パスで作られてい
い場合にこの変数の指定が必要かも…]
PATCH_DIST_STRIP= -p1
[GNU autoconf によって生成された "configure" スクリプトを走らせたいなら…]
GNU_CONFIGURE= yes
[/usr/bin/makeでなく、GNU make を使わないといけないなら…]
USE_GMAKE= yes
[これが X のアプリケーションで、"xmkmf -a" を走らせたいなら…]
USE_IMAKE= yes
[などなど]
[下の方のルールで使う非標準の変数]
MY_FAVORITE_RESPONSE= "yeah, right"
[そして、特別なターゲット、使用順に]
pre-fetch:
i go fetch something, yeah
post-patch:
i need to do something after patch, great
pre-install:
and then some more stuff before installing, wow
[最後には必ず]
.include &lt;bsd.port.mk&gt;</programlisting>
</chapter>
<chapter xml:id="porting-autoplist">
<title>パッキングリストの自動生成</title>
<para>まず、あなたの port に
<filename>pkg-plist</filename>
がないことを除けば完成していることを確認してください。</para>
<para>次に、あなたの port
をインストールする一時ディレクトリを作成して、
依存するものをすべてインストールしてください。
<replaceable>port-type</replaceable>
X アプリケーションではない port については <literal>local</literal>
XFree86 4 またはそれより前の XFree86
のディレクトリ階層にインストールする ports については、それぞれ
<literal>x11-4</literal> または <literal>x11</literal>
にすべきです。</para>
<screen>&prompt.root; <userinput>mkdir /var/tmp/port-name</userinput>
&prompt.root; <userinput>mtree -U -f /etc/mtree/BSD.port-type.dist -d -e -p /var/tmp/port-name</userinput>
&prompt.root; <userinput>make depends PREFIX=/var/tmp/port-name</userinput></screen>
<para>このディレクトリ構造を新しいファイルに保存してください。</para>
<screen>&prompt.root; <userinput>(cd /var/tmp/port-name &amp;&amp; find -d * -type d) | sort &gt; OLD-DIRS</userinput></screen>
<para>空の <filename>pkg-plist</filename>
ファイルを作成してください。</para>
<screen>&prompt.root; <userinput>touch pkg-plist</userinput></screen>
<para>もしあなたの port が <varname>PREFIX</varname> にちゃんと従うなら、
ここで port をインストールしてパッキングリストを作ることができます。</para>
<screen>&prompt.root; <userinput>make install PREFIX=/var/tmp</userinput>
&prompt.root; <userinput>(cd /var/tmp/port-name &amp;&amp; find -d * \! -type d) | sort &gt; pkg-plist</userinput></screen>
<para>新しく生成されたディレクトリはすべてパッキングリストに追加する必要があります。</para>
<screen>&prompt.root; <userinput>(cd /var/tmp/port-name &amp;&amp; find -d * -type d) | sort | comm -13 OLD-DIRS - | sort -r | sed -e 's#^#@dirrm #' &gt;&gt; pkg-plist</userinput></screen>
<para>最後にパッキングリストを手で整える必要があります;
<emphasis>すべて</emphasis>が自動化されているわけではありません。
マニュアルはパッキングリストに記述するのではなく、
port の <filename>Makefile</filename> 中の
<varname>MAN<replaceable>n</replaceable></varname>
記述しなければなりません。
ユーザ設定ファイルは削除するか
<filename>filename.sample</filename>
としてインストールされなければなりません。
また <filename>info/dir</filename>
ファイルはリストに含めず、
<link linkend="porting-info">info ファイル</link>に記述されているように、
適切な <filename>install-info</filename> 行に追加しなければなりません。
port によってインストールされるライブラリは、
<link linkend="porting-shlibs">共有ライブラリ</link>
のセクションで示したように記載されるべきです。</para>
<para>または、<filename>/usr/ports/Tools/scripts/</filename>
にある <command>plist</command>
スクリプトを使ってパッキングリストを自動的に生成してください。</para>
</chapter>
<chapter xml:id="changes">
<title>この文書と ports システムの変更</title>
<para>もしあなたが、たくさんの ports の保守をしているのであれば、
&a.ports; の内容を読むことを考えてください。
ports のしくみについての重要な変更点はここに アナウンスされます。
最新の変更点については、いつでも、
<link xlink:href="http://www.FreeBSD.org/cgi/cvsweb.cgi/ports/Mk/bsd.port.mk">bsd.port.mk
の CVS ログ</link>で詳細な情報を得ることができます。</para>
<para>port メンテナを補助するほかのリソースとして、
<literal>bento クラスタ</literal>に置かれている
<link xlink:href="http://bento.FreeBSD.org/">
パッケージビルド記録とエラー</link>一覧、また <link xlink:href="http://people.FreeBSD.org/~fenner/portsurvey/">FreeBSD
Ports distfiles 調査</link>があります。</para>
</chapter>
</book>