<!--
     The FreeBSD Documentation Project
     The FreeBSD Japanese Documentation Project

     Original revision: 1.113
     $FreeBSD$
-->

<chapter id="ports">
  <title>アプリケーションのインストール: Ports Collection</title>

  <para><emphasis>改訂: &a.jim;,
      1999 年 11 月 22 日.</emphasis></para>

  <para><emphasis>原作: さまざまな人々</emphasis></para>

  <sect1>
    <title>この章では</title>

    <para>FreeBSD Ports Collection を利用することで,
      非常に幅広いアプリケーションのコンパイルとインストールを
      最小限の労力で行なうことができます.</para>

    <para>それは普通<link linkend="ports-skeleton">スケルトン</link>と呼ばれる,
      アプリケーションを FreeBSD
      上でコンパイルしインストールするために必要となる最小限のファイルのセットで構成されてます.
    </para>

    <para>やってみたことのある方はよくご存知でしょうが,
      オープンな規格とは全くの誇大広告であって,
      あるプログラムを異なるバージョンの Unix 上で動作させることは退屈で手間のかかる仕事です.
      求めているプログラムが自分のシステムでうまくコンパイルでき,
      正しいところにインストールできて完璧に動作するとしたらとてもラッキーなのですが,
      あいにくこれは滅多にないことなのです.
      ほとんどのプログラムについてあなたは髪を掻きむしることになるでしょうし,
      かなりのプログラムでは, 白髪混じりの頭になってしまったり,
      あるいは慢性の脱毛症にすらなってしまうかもしれません...</para>
    <!-- 2000/07/16:hrs - strange translation -->

    <para>Ports Collection の基本的なアイディアは,
      適切に動作させるために必要な複雑な手順のすべてを取り除き,
      インストールを簡単で楽な作業にすることにあります.
      Ports Collection を利用すれば, 大変な作業は必要ありません.
      Ports Collection に含まれる ports は,
      単に <command>make install</command>
      と入力するだけでインストールできるのです.</para>
  </sect1>

  <sect1 id="ports-using">
    <title>Ports Collection の利用</title>

    <para>このセクションでは, Ports Collection
      を利用してシステムにプログラムをインストールしたり,
      システムから削除したりする基本的な手順について説明します.</para>

    <sect2 id="ports-skeleton">
      <title>ports のインストール</title>

      <para>一番最初に知らなければならないのは,
        Ports Collection は <quote>スケルトン</quote>
        と呼ばれるもので構成されているという事実です.
        port スケルトンは簡単に言うと, アプリケーションを FreeBSD
        上でコンパイルしインストールするために必要となる最小限のファイルのセットのことです.
        それぞれの port スケルトンには, 次のファイルが含まれています.
      </para>

      <itemizedlist>
	<listitem>
	  <para><filename>Makefile</filename>.
	    <filename>Makefile</filename>
            にはアプリケーションのコンパイル方法やシステムのどこにインストールするかを指定する,
            さまざまな命令文が含まれています.</para>
	</listitem>

	<listitem>
	  <para><filename>distinfo</filename> ファイル.
            このファイルには, その port を構築するために
            ダウンロードする必要があるファイルのファイル名と,
            そのファイルがダウンロードによって壊れていないか
            チェックするためのチェックサム情報が含まれています.</para>
	</listitem>

	<listitem>
	  <para><filename>files</filename> ディレクトリ.
            このディレクトリには FreeBSD
            システム上でプログラムをコンパイルし,
            インストールするための修正パッチが含まれています.
            修正パッチ (patch) とは基本的に,
            個々のファイルに対する変更点を表した小さなファイル群のことです.
            ファイルはプレインテキスト形式で,
            <quote>10 行目を削除</quote> や
            <quote>26 行目を ... に変更</quote> などと書かれています.
            修正パッチは, <quote>diff(差分)</quote> とも呼ばれます.
            これは, 修正パッチが <application>diff</application>
            プログラムで作成されるからです.</para>

	  <para>このディレクトリには, その port の構築に必要な
            その他のファイルが入る場合もあります.</para>
	</listitem>

        <listitem>
          <para><filename>pkg-comment</filename> ファイル.
            これにはプログラムの一行説明文が含まれています.</para>
        </listitem>

        <listitem>
          <para><filename>pkg-descr</filename> ファイル.
            これにはプログラムの, 複数行にわたる詳しい説明文が含まれます.</para>
        </listitem>

        <listitem>
          <para><filename>pkg-plist</filename> ファイル.
            これは, その port によってインストールされる全ファイルのリストです.
            これにはプログラムを削除する際に,
            どのファイルを削除すれば良いのかを ports
            システムに伝える役割もあります.</para>
        </listitem>
      </itemizedlist>

      <para>さて, Ports Collection が何を目的として使われるものなのか,
        それ理解するための基礎的な知識はこれで十分です.
        最初の port をインストールする準備ができました.
        port のインストールには二つの方法があります.
      </para>
      <!-- 2000/07/16:hrs - strange translation -->

      <para>実際の作業に入る前に,
        インストールする port を選ぶ必要があります.
        選ぶ方法はいくつかありますが, 最も簡単なのは
        <ulink url="http://www.freebsd.org/ports/">FreeBSD ウェブサイトの
          ports リスト</ulink>を利用することでしょう.
        そこにリストされている ports や,
        サイトの検索機能を使って閲覧することができます.
        各々の port には説明文が含まれていますので,
        インストールを決める前にその port
        に関する説明を読むこともできます.
      </para>
        
      <para>もう一つの方法は, <command>whereis</command>
        コマンドを使うことです.
        <command>whereis</command> コマンドを使うには,
        プロンプトから単に
        <quote><command>whereis &lt;インストールしたいプログラム名&gt;</command></quote>
        と入力します.
        もし, あなたのシステム上でプログラムが見つかれば,
        それがどこにあるのかが次のように表示されます.
      </para>

      <screen>&prompt.root; <userinput>whereis xchat</userinput>
xchat: /usr/ports/irc/xchat
&prompt.root;</screen>

      <para>この表示は, xchat (irc クライアントの一つ) が
        <filename>/usr/ports/irc/xchat</filename>
        というディレクトリに見つかったことを示しています.
      </para>

      <para>また, Ports Collection の持つ検索機能を利用して
        port を検索する方法もあります.
        この検索機能を利用するには, カレントディレクトリが
        <filename>/usr/ports</filename> である必要があります.
        そのディレクトリに移動したら, 
        <command>make search key=プログラム名</command>
        と入力してください.
        <quote>プログラム名</quote>の部分には検索したいプログラム名を入れます.
        たとえば, xchat を探したい場合には次のようにします.</para>

      <screen>&prompt.root; <userinput>cd /usr/ports</userinput>
&prompt.root; <userinput>make search key=xchat</userinput>
Port:   xchat-1.3.8
Path:   /usr/ports/irc/xchat
Info:   An X11 IRC client using the GTK+ toolkit, and optionally, GNOME
Maint:  jim@FreeBSD.org
Index:  irc
B-deps: XFree86-3.3.5 bzip2-0.9.5d gettext-0.10.35 giflib-4.1.0 glib-1.2.6 gmake-3.77 gtk-1.2.6
		imlib-1.9.8 jpeg-6b png-1.0.3 tiff-3.5.1
R-deps: XFree86-3.3.5 gettext-0.10.35 giflib-4.1.0 glib-1.2.6 gtk-1.2.6 imlib-1.9.8 jpeg-6b
		png-1.0.3 tiff-3.5.1</screen>

      <para>出力のうち特に注意して見なければならないのは
        <quote>Path</quote> という行です.
        この行は xchat がどこにあるかを示しています.
        出力される他の情報は port
        をインストールする際には直接必要となるものではありませんので,
        ここでは触れないでおきます.</para>

      <note>
        <para>ports をインストールするには,
          <username>root</username> ユーザにならなければなりません.</para>
      </note>

      <para>インストールしたい port が見つかったら,
        実際のインストールに移ることができます.</para>

      <sect3 id="ports-cd">
        <title>CD-ROM からのコンパイル</title>

        <para>タイトルから想像できると思いますが,
          このセクションで説明する内容は, FreeBSD の
          CDROM セットを持っていることを前提としています.
          もし CDROM セットを持っていなければ,
          <ulink url="http://www.freebsdmall.com/">FreeBSD Mall</ulink>
          で注文することができます.</para>

        <para>FreeBSD CDROM がドライブに挿入されていて,
          <filename>/cdrom</filename>
          (マウントポイントは<emphasis>必ず</emphasis>
          <filename>/cdrom</filename>でないといけません)
          にマウントされていれば, port をインストールすることができます.
          まず, カレントディレクトリをインストールしたい port
          のあるディレクトリに変更してください.</para>

        <screen>&prompt.root; <userinput>cd /usr/ports/irc/xchat</userinput></screen>

        <para>xchat ディレクトリに移動すると,
          port スケルトンがあるのが確認できると思います.
          次に行なうのは, port のコンパイル
          (構築, ビルド(build)とも呼ばれます)
          です.
          これは, プロンプトから単に
          <command>make</command> と入力するだけで行なえます.
          そうすると, 次のような出力が現われるはずです.</para>

        <screen>&prompt.root; <userinput>make</userinput>
&gt;&gt; xchat-1.3.8.tar.bz2 doesn't seem to exist on this system.
&gt;&gt; Attempting to fetch from file:/cdrom/ports/distfiles/.
===&gt;  Extracting for xchat-1.3.8
&gt;&gt; Checksum OK for xchat-1.3.8.tar.bz2.
===&gt;   xchat-1.3.8 depends on executable: bzip2 - found
===&gt;   xchat-1.3.8 depends on executable: gmake - found
===&gt;   xchat-1.3.8 depends on shared library: gtk12.2 - found
===&gt;   xchat-1.3.8 depends on shared library: Imlib.5 - found
===&gt;   xchat-1.3.8 depends on shared library: X11.6 - found
===&gt;  Patching for xchat-1.3.8
===&gt;  Applying FreeBSD patches for xchat-1.3.8
===&gt;  Configuring for xchat-1.3.8
...
[configure output snipped]
...
===&gt;  Building for xchat-1.3.8
...
[compilation snipped]
...
&prompt.root;</screen>

        <para>コンパイルが終了してプロンプトに戻ることを確認してください.
          次に port をインストールを行ないます.
          port をインストールするのに必要なのは,
          <command>make</command> コマンドに一つの単語,
          <command>install</command> を指定することだけです.</para>

        <screen>&prompt.root; <userinput>make install</userinput>
===&gt;  Installing for xchat-1.3.8
===&gt;   xchat-1.3.8 depends on shared library: gtk12.2 - found
===&gt;   xchat-1.3.8 depends on shared library: Imlib.5 - found
===&gt;   xchat-1.3.8 depends on shared library: X11.6 - found
...
[install routines snipped]
...
===&gt;   Generating temporary packing list
===&gt;   Installing xchat docs in /usr/X11R6/share/doc/xchat
===&gt;   Registering installation for xchat-1.3.8
&prompt.root;</screen>

        <para>プロンプトに戻ったら,
          インストールしたプログラムは実行できるようになっています.</para>

        <note>
          <para><command>make</command>, <command>make install</command>
            と二つに分けられた手順の代わりに,
            最初から <command>make install</command> と実行することで,
            手順の二番目の操作を省くことができます.</para>
        </note>

        <note>
          <para>port には CDROM
            への収録を許可しないライセンス条項を持つものがあることに
            注意してください.
            これにはダウンロード前に登録を必要としたり,
            再配布が禁止されているなどというさまざまな理由があります.
            CDROM に含まれていない port をインストールしたい場合には,
            ネットワークに接続する必要があります
            (<link linkend="ports-inet">次のセクション</link>をご覧ください).</para>
        </note>
      </sect3>

      <sect3 id="ports-inet">
        <title>インターネット経由での ports のコンパイル</title>

        <para>前セクションと同じように, このセクションでは,
          インターネットへの接続が可能であることを前提としています.
          もしインターネット接続が不可能な場合は, 
          <link linkend="ports-cd">CDROM
            からのインストール</link>が必要になるでしょう.</para>

        <para>インターネット経由で port をインストールする方法は,
          CDROM からインストールする場合と完全に同じです.
          唯一異なる部分はプログラムのソースコードを CDROM からではなく,
          インターネット経由でダウンロードするということです.</para>

        <para>次のように, 必要な手順は同じです.</para>

        <screen>&prompt.root; <userinput>make install</userinput>
&gt;&gt; xchat-1.3.8.tar.bz2 doesn't seem to exist on this system.
&gt;&gt; Attempting to fetch from http://xchat.org/files/v1.3/.
Receiving xchat-1.3.8.tar.bz2 (305543 bytes): 100%
305543 bytes transferred in 2.9 seconds  (102.81 Kbytes/s)
===&gt;  Extracting for xchat-1.3.8
&gt;&gt; Checksum OK for xchat-1.3.8.tar.bz2.
===&gt;   xchat-1.3.8 depends on executable: bzip2 - found
===&gt;   xchat-1.3.8 depends on executable: gmake - found
===&gt;   xchat-1.3.8 depends on shared library: gtk12.2 - found
===&gt;   xchat-1.3.8 depends on shared library: Imlib.5 - found
===&gt;   xchat-1.3.8 depends on shared library: X11.6 - found
===&gt;  Patching for xchat-1.3.8
===&gt;  Applying FreeBSD patches for xchat-1.3.8
===&gt;  Configuring for xchat-1.3.8
...
[configure output snipped]
...
===&gt;  Building for xchat-1.3.8
...
[compilation snipped]
...
===&gt;  Installing for xchat-1.3.8
===&gt;   xchat-1.3.8 depends on shared library: gtk12.2 - found
===&gt;   xchat-1.3.8 depends on shared library: Imlib.5 - found
===&gt;   xchat-1.3.8 depends on shared library: X11.6 - found
...
[install routines snipped]
...
===&gt;   Generating temporary packing list
===&gt;   Installing xchat docs in /usr/X11R6/share/doc/xchat
===&gt;   Registering installation for xchat-1.3.8
&prompt.root;</screen>

        <para>ご覧のとおり,
          出力の違いはシステムがどこから port
          を入手したか示す行だけです.</para>

        <para>以上が, システムに ports
          をインストールするために必要な操作です.
          次のセクションでは, システムにインストールされている port
          を削除する方法について学びます.</para>
      </sect3>
    </sect2>

    <sect2 id="ports-removing">
      <title>インストールされた ports の削除</title>

      <para>ports のインストール方法について知ればおそらく,
        インストールの後になって, それが間違っていたことに気付いた時などに備えて
        それらを削除する方法はどうすれば良いのか疑問に感じることでしょう.
        ここでは, その削除の方法について扱います.</para>
      <!-- 2000/07/16:hrs - why "decide"? -->

      <para>さて, 前の例 (例のまま何も変更していない人は xchat)
        を削除してみましょう.  ports のインストールと同じように,
        まず最初にやらなければならないのは port のディレクトリに移動することです.
        port のディレクトリは <filename>/usr/ports/irc/xchat</filename> でしたね.
        ディレクトリを移動したら, xchat を削除するのに必要な準備は終わりです.
        削除するには, <command>make deinstall</command> コマンド
        (わかりやすいですよね?) を実行します.</para>

      <screen>&prompt.root; <userinput>cd /usr/ports/irc/xchat</userinput>
&prompt.root; <userinput>make deinstall</userinput>
===&gt;  Deinstalling for xchat-1.3.8
&prompt.root;</screen>

      <para>極めて簡単な作業です.
        これでうまく xchat をシステムから削除することができました.
        もう一度再インストールしたい場合には,
        <filename>/usr/ports/irc/xchat</filename> から        
        <command>make reinstall</command>
        を実行することで行なうことができます.
      </para>
    </sect2>
  </sect1>

  <sect1 id="ports-trouble">
    <title>トラブルシューティング</title>

    <para>このセクションでは, Ports Collection
      について良く質問される質問と,
      いくつかの基本的なトラブルシューティングテクニック,
      そして <link linkend="ports-broken">port
        がうまく動かない</link>場合にできることについて扱います.</para>

    <sect2 id="ports-questions">
      <title>質問と回答集</title>
      
      <qandaset>
        <qandaentry>
          <question>
            <para>私はモデムについての議論を
              しているのかと思っていました??!</para>
          </question>
          
          <answer>
            <para>なるほど.
              あなたはきっと,
              コンピュータの背面についているシリアルポートのことだと思ってしまったのでしょう.
              あるバージョンの Unix から,
              別のバージョンの Unix へとプログラムを移殖することを
              <quote>porting</quote> というのですが,
              ここでわたしたちは <quote>porting</quote>
              の結果という意味で <quote>port</quote> を使っています.</para>
          </answer>
        </qandaentry>
        
        <qandaentry>
          <question>
            <para>わたしは, 標準に含まれないプログラムのインストールには
              packages を使うものだと思っていたのですが.</para>
          </question>
          
          <answer>
            <para>そのとおり.
              通常は packages が最も手早くて簡単な方法です.</para>
          </answer>
        </qandaentry>
        
        <qandaentry>
          <question>
            <para>それでは, どうして面倒な ports があるのですか?</para>
          </question>
          
          <answer>
            <para>いくつかの理由があります.</para>
            
            <orderedlist>
              <listitem>
                <para>ライセンス条項に,
                  バイナリではなくソースコードでの配布を求めているソフトウェアがあるためです.</para>
              </listitem>
              
              <listitem>
                <para>バイナリ配布を信用していない人もいます.
                  ソースコードがあれば少なくとも,
                  ソースコードを読んで, (理論的には)
                  潜在的な問題点を自分で見つけ出すこともできるはずです.</para>
              </listitem>

              <listitem>
                <para>ローカルなパッチを入手した場合,
                  それを自分で追加するためにソースコードが必要になります.</para>
              </listitem>
              
              <listitem>
                <para>プログラムがいかにコンパイルされるべきかについて,
                  あなたはパッケージを作った人とは異なる見解を持っているかもしれません.
                  どんな最適化オプションをつけるべきかとか,
                  デバッグバージョンを作ってから それを strip
                  するべきだとか, いや, そうするべきでない, などなど,
                  確固たる見解を持っている人もいるでしょう.</para>
              </listitem>

	      <listitem>
                <para>package は通常, 非常に保守的な設定で構築されています.
                  もし port に特定のプロセッサ用のコードを使うコンパイルオプションがあったり,
                  特定の拡張ボードを有効化するオプションがあれば,
                  package を作成している人でなくとも,
                  あなた自身が port を使ってそれらを有効にし,
                  設定の異なるたくさんの package を作成することができます.</para>

                <para>これの例外は, 用紙のサイズです.
                  異なる用紙のサイズに対応している package の場合,
                  用紙サイズ毎に複数の package が提供されることがあります.</para>
	      </listitem>

              <listitem>
                <para>ソースコードを手元に置いておきたい人たちもいます.
                  彼らは, 退屈したときに眺めたり, あちこち解析してみたり,
                  ソースコードを 借用したり (もちろん,
                  ライセンスが許せばの話ですが) するのです.</para>
              </listitem>
              
              <listitem>
                <para>あなたがソースコードを持っていなければ,
                  それはソフトウェアとは 言えませんね!
                  <!-- smiley -->;-)</para>
              </listitem>
            </orderedlist>
          </answer>
        </qandaentry>

        <qandaentry>
          <question>
            <para id="ports-patch">パッチ(patch)とは何ですか?</para>
          </question>
          
          <answer>
            <para>パッチとは,
              あるバージョンから他のバージョンへどのように変更するかを
              示す, (通常は) 小さなファイルです.
              <quote>23 行目を削除</quote>,
              <quote>468 行目の後にこれらの 2 行を追加</quote>,
              または <quote>197
                行目をこのように変更</quote>というような内容を含んでいます.
              これは, <quote>diff</quote>
              という名前のプログラムで生成されます.</para>
          </answer>
        </qandaentry>
        
        <qandaentry>
          <question>
            <para id="ports-tarball">tarball とは一体何ですか?</para>
          </question>
          
          <answer>
            <para><filename>.tar</filename> または
              <filename>.tar.gz</filename> という拡張子を持つファイルです
              (<filename>.tar.Z</filename>
              のようなバリエーションもありますし,
              DOS のファイルシステム用に
              <filename>.tgz</filename>
              と短縮される場合もあります).</para>

            <para>これは基本的にファイルを一つにまとめた
              (<filename>.tar</filename>) ディレクトリツリーです.
              圧縮されている (<filename>.gz</filename>) 場合もあります.
              元々 <emphasis>T</emphasis>ape
              <emphasis>AR</emphasis>chives (訳注: テープアーカイブ)
              (このため <command>tar</command> という名前なのです)
              で使われていたものなのですが,
              インターネット上でプログラムのソースコードを配布するために
              広く使われている方法です.</para>
            
            <para>これらのファイルの中身を見たり,
              展開したりすることもできます.  FreeBSD
              の基本システムに付属する Unix 標準の tar
              コマンドを使ってみると 次のようになります.</para>

	  <screen>&prompt.user; <userinput>tar tvzf foobar.tar.gz</userinput>
&prompt.user; <userinput>tar xzvf foobar.tar.gz</userinput>
&prompt.user; <userinput>tar tvf foobar.tar</userinput>
&prompt.user; <userinput>tar xvf foobar.tar</userinput></screen>
          </answer>
        </qandaentry>

        <qandaentry>
          <question>
            <para id="ports-checksum">チェックサムとは何ですか?</para>
          </question>

          <answer>
            <para>これは,
              チェックしたいファイル中のすべてのデータを加えて生成した
              数値です.  何か文字が書き換わっていたら,
              チェックサムが一致しなくなります.  そのため,
              単純な比較だけで違いを見つけることができるのです.</para>
          </answer>
        </qandaentry>
        
        <qandaentry>
          <question>
            <para>今まで「CD-ROM からの ports のコンパイル」にあるようにして
              ports をインストールできていたのですが,
              kermit のインストールをしようとするとうまくいきません.</para>

            <screen>&prompt.root; <userinput>make install</userinput>
&gt;&gt; cku190.tar.gz doesn't seem to exist on this system.
&gt;&gt; Attempting to fetch from ftp://kermit.columbia.edu/kermit/archives/.</screen>

            <para>なぜ cku190.tar.gz が見つからないのでしょうか?
              不良品の CDROM を買ってしまったのでしょうか?</para>
          </question>

          <answer>
            <para><link linkend="ports-cd">CD-ROM からの ports
                のコンパイル</link> のセクションで説明されているとおり,
              ports の一部にライセンス上の制限から CDROM
              には収録できない種類のものが存在します.
              kermit はその一例です.
              kermit のライセンス条件は tarball を CDROM
              に収録することを禁じているため,
              申し訳ありませんが手動で tarball を取得してください.</para>

            <para>質問にあるようなエラーメッセージが表示されるのは,
              あなたがそのときにインターネットへ接続していなかったことによります.
              一度 MASTER_SITES のいずれかから (Makefile の中に書いてあります)
              ダウンロードしておけば, プロセスを再開することができます.</para>
          </answer>
        </qandaentry>

        <qandaentry>
          <question>
            <para>kermit の tarball を入手しましたが,
              <filename>/usr/ports/distfiles</filename> に
              ファイルを置こうとすると,
              書き込み権がないというエラーがでます.</para>
          </question>
          
          <answer>
            <para>ports は
              <filename>/usr/ports/distfiles</filename> から tarball
              を探します.  しかし, これは読み出し専用の CDROM
              へのシンボリックリンクなので,
              ここにファイルを置くことはできません.
              次のようにすれば他の場所を探すよう ports
              に指示することができます.</para>

            <screen>&prompt.root; <userinput>make DISTDIR=<replaceable>/where/you/put/it</replaceable> install</userinput></screen>
          </answer>
        </qandaentry>

        <qandaentry>
          <question>
            <para>ports は, すべてを <filename>/usr/ports</filename>
              に置いたときだけ動作するのでしょうか?
              システムの管理者によると, 私の個人的なファイルは
              <filename>/u/people/guests/wurzburger</filename>
              に入れなければならないのですが,
              これではうまくいかないように思います.</para>
          </question>
          
          <answer>
            <para><makevar>PORTSDIR</makevar> 変数と
              <makevar>PREFIX</makevar> 変数を変更することで,
              違うディレクトリを 使用することができます.
              たとえば,</para>

            <screen>&prompt.root; <userinput>make PORTSDIR=/u/people/guests/wurzburger/ports install</userinput></screen>

            <para>とすると, ports は
              <filename>/u/people/guests/wurzburger/ports</filename>
              でコンパイルされ,  すべて <filename>/usr/local</filename>
              以下にインストールされます.</para>

            <screen>&prompt.root; <userinput>make PREFIX=/u/people/guests/wurzburger/local install</userinput></screen>

            <para>この場合, コンパイルは <filename>/usr/ports</filename>
              でおこない,
              <filename>/u/people/guests/wurzburger/local</filename>
              にインストールします. </para>

            <para>もちろん,</para>
            
            <screen>&prompt.root; <userinput>make PORTSDIR=../ports PREFIX=../local install</userinput></screen>
            
            <para>とすれば両者を組み合わせることが可能です
              (省略せずに記述したらこのページに収めるには長すぎるのですが,
              考え方は理解していただけたと思います).</para>

            <para>(X Window System に含まれる) &man.imake.1; を使用する
              ports の場合は <makevar>PREFIX</makevar> が機能せず,
              <filename>/usr/X11R6</filename> の下へインストールしようとします.
              また, Perl 関連の ports も同様に <makevar>PREFIX</makevar> を無視して
              Perl ツリーにインストールします.
              これらの ports で <makevar>PREFIX</makevar>
              がきちんと参照されるように変更するのは, ほとんど不可能です.</para>

            <para>もし ports をインストールするたびにこれらを毎回タイプするのが気に入らないのであれば,
              これらを環境変数にセットしてしまうという手があります.
              どのようにすれば良いかについては,
              あなたの使っているシェルのマニュアルページを参照してください.</para>
          </answer>
        </qandaentry>
        
        <qandaentry>
          <question>
            <para>わたしは FreeBSD の CDROM を持っていませんが,
              すべての tarball を システムに置いておきたいのです.
              そうすれば ports
              をインストール するたびに毎回ダウンロードが終わるのを待たなくてすむでしょう.
              これを一度におこなう簡単な方法はありませんか?</para>
          </question>

          <answer>
            <para>Ports Collection 全体の tarball を持ってくるには,
              次のようにします.</para>

            <screen>&prompt.root; <userinput>cd /usr/ports</userinput>
&prompt.root; <userinput>make fetch</userinput></screen>

            <para>ports の下の一つのディレクトリの tarball
              を持ってくるには, 次のようにします.</para>

            <screen>&prompt.root; <userinput>cd /usr/ports/<replaceable>directory</replaceable></userinput>
&prompt.root; <userinput>make fetch</userinput></screen>

            <para>ports を一つだけ持ってくる方法は,
              きっとすでにご存知だと思います.</para>
          </answer>
        </qandaentry>

        <qandaentry>
          <question>
            <para>近くにある FreeBSD のミラーサイトから
              tarball を持ってくる方がおそらく速いはずです.
              MASTER_SITES に書かれているサイト以外から持ってくるように
              ports に指示する方法はありませんか?</para>
          </question>
          
          <answer>
            <para>もちろんあります. たとえば
              <hostid role="fqdn">ftp.FreeBSD.org</hostid> が
              <makevar>MASTER_SITES</makevar> に書かれている
              サイトより近いとしたら, 以下のようにしてください.</para>

            <screen>&prompt.root; <userinput>cd /usr/ports/<replaceable>directory</replaceable></userinput>
&prompt.root; <userinput>make MASTER_SITE_OVERRIDE=ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/distfiles/ fetch</userinput></screen>
          </answer>
        </qandaentry>
        
        <qandaentry>
          <question>
            <para><command>make</command> がダウンロードしようとする前に,
              どんなファイルが必要とするか知りたいのですが.</para>
          </question>
          
          <answer>
            <para><command>make fetch-list</command> とすると, ports
              に必要なファイルの一覧を表示できます.</para>
          </answer>
        </qandaentry>
        
        <qandaentry>
          <question>
            <para>ports のコンパイルを途中で止める方法はありますか?
              私はインストールをする前に
              いろいろとソースコードを解析したいのですが,  毎回 control-C
              を打たなければならないのが少し面倒です.</para>
          </question>
          
          <answer>
            <para><command>make extract</command> を実行すると,
              ファイル転送とソースコードの展開まで行なったところで停止します.</para>
          </answer>
        </qandaentry>
        
        <qandaentry>
          <question>
            <para>自分で ports を作ろうとしています.
              わたしの作ったパッチが正しく処理できることを確認できるように,
              コンパイルを止めたいのです.
              パッチのための <command>make extract</command>
              のようなものはありませんか?</para>
          </question>
          
          <answer>
            <para>あります. <command>make patch</command>
              があなたの望むものです.
              おそらく
              <makevar>PATCH_DEBUG</makevar>
              オプションも同様に役に立つことでしょう.
              あなたの努力に感謝いたします!!</para>
          </answer>
        </qandaentry>

        <qandaentry>
          <question>
            <para>あるコンパイルオプションはバグの原因になるという話を聞きました.
              本当なのでしょうか?
              どうやったら正しい設定で ports
              をコンパイルできますか?</para>
          </question>

          <answer>
            <para>本当です.
              <command>gcc</command> の バージョン 2.6.3
              (FreeBSDの 2.1.0 と 2.1.5 に付属している バージョン) では,
              <option>-O2</option> オプションを
              <option>-fno-strength-reduce</option> オプションなしで
              使うと, バグのあるコードを出力します (ほとんどの ports は
              <option>-O2</option> オプションを使いません).
              コンバイルオプションは次のように定義<emphasis>すべき</emphasis>です.</para>

            <screen>&prompt.root; <userinput>make CFLAGS='-O2 -fno-strength-reduce' install</userinput></screen>

            <para>これを <filename>/etc/make.conf</filename>
              に書いておくこともできますが,
              残念なことにすべての ports
              がこの指定を尊重してくれるわけではありません.
              もっとも確実なのは <command>make configure</command>
              を実行し,  ソースディレクトリの <filename>Makefile</filename>
              を見て, 手で修正することですが,
              ソースが多くのサブディレクトリに分かれていて,
              各々に <filename>Makefile</filename>
              がある場合は大変な仕事になります.</para>

	    <para>FreeBSD の標準コンパイルオプションは非常に保守的ですので,
              変更していなければ問題となることはないでしょう.</para>
          </answer>
        </qandaentry>

        <qandaentry>
          <question>
            <para>ports がたくさんありすぎて,
              わたしの欲しいものがなかなか見つけられません.
              どんな ports が使えるのか, リストはどこかにありませんか?</para>
          </question>

          <answer>
            <para><filename>/usr/ports</filename> の中にある
              <filename>INDEX</filename> ファイルを見てみましょう.
              また, あるキーワードで ports コレクションを検索することも可能です.
              たとえば以下のようにすれば, プログラミング言語 LISP に関連した
              ports を探すことができます.</para>

              <screen>&prompt.user; <userinput>cd /usr/ports</userinput>
&prompt.user; <userinput>make search key=lisp</userinput></screen>
          </answer>
        </qandaentry>

        <qandaentry>
          <question>
            <para><literal>foo</literal> ports
              をインストールしたいのですが, それのコンパイルは
              すぐに停止して, <literal>bar</literal> ports
              のコンパイルが始まってしまいます. 一体どうして?</para>
          </question>

          <answer>
            <para><literal>foo</literal> ports が,
              <literal>bar</literal> ports
              の提供する何らかの機能を必要としているからです.
              たとえば <literal>foo</literal> が画像を扱うもので
              <literal>bar</literal>
              がその画像処理に必要なライブラリを持っている場合などです.
              もしくは <literal>bar</literal> が
              <literal>foo</literal>
              をコンパイルするのに必要なツールなのかもしれません.</para>
          </answer>
        </qandaentry>
        
        <qandaentry>
          <question>
            <para id="ports-remove">ports から
              <literal>grizzle</literal>
              プログラムをインストールしましたが, まったく
              ディスクスペースの浪費です. 削除したいのですが,
              すべてのファイルがどこへインストールされたのかわかりません.
              何か手がかりはありませんか?</para>
          </question>

          <answer>
            <para>大丈夫, 次のようにしてください.</para>
            
            <screen>&prompt.root; <userinput>pkg_delete grizzle-6.5</userinput></screen>
            
            <para>もしくは, 次のようにします.</para>
            
            <screen>&prompt.root; <userinput>cd <replaceable>/usr/ports/somewhere/grizzle</replaceable></userinput>
&prompt.root; <userinput>make deinstall</userinput></screen>
          </answer>
        </qandaentry>
        
        <qandaentry>
          <question>
            <para>ちょっと待ってください.
              削除しようとするコマンドのバージョン番号を
              知っていなくてはならないのでしょうか?
              あなたは, わたしがバージョン番号を
              覚えていると本気で思っているのですか?</para>
          </question>

          <answer>
            <para>そんなことはありません.
              バージョン番号は次のようにすればわかります.</para>
            
            <screen>&prompt.root; <userinput>pkg_info -a | grep grizzle</userinput>
Information for grizzle-6.5:
grizzle-6.5 - the combined piano tutorial, LOGO interpreter and shoot 'em up arcade game.</screen>
          </answer>
        </qandaentry>

        <qandaentry>
          <question>
            <para>ディスク容量のことなのですが, ports
              のディレクトリは非常に膨大な容量を使うように見えます.
              残しておいた方がよいのでしょうか?
              それとも削除してしまって構わないのでしょうか?</para>
          </question>
          
          <answer>
            <para>はい. インストールが首尾よく終わり,
              もうソースコードが必要でないと思うなら,
              それらを残しておく理由はないでしょう.
              一番良い方法は, 次のとおりです.</para>

            <screen>&prompt.root; <userinput>cd /usr/ports</userinput>
&prompt.root; <userinput>make clean</userinput></screen>

            <para>これはすべての ports のサブディレクトリを調べ,
              各 ports のスケルトン以外の削除をおこないます.</para>
          </answer>
        </qandaentry>
        
        <qandaentry>
          <question>
            <para>これを試してみたのですが, tarball や ports
              で使われたファイルが <filename>distfiles</filename>
              ディレクトリに残っています.
              これも削除してしまっても大丈夫ですか?</para>
          </question>

          <answer>
            <para>はい. それを使った作業が終わったのであれば,
              削除してしまっても大丈夫です.
              手動でファイルを操作するか,
              もしくは <command>make distclean</command>
              を使えば削除することができます.</para>
          </answer>
        </qandaentry>
        
        <qandaentry>
          <question>
            <para>わたしはとてもとてもたくさんのプログラムを楽しみたいのです.
              一度にすべての ports
              をインストールする方法はありませんか?</para>
          </question>
          
          <answer>
            <para>次のようにしてください.</para>
            
            <screen>&prompt.root; <userinput>cd /usr/ports</userinput>
&prompt.root; <userinput>make install</userinput></screen>

	    <para>ports の中には,
              同じ名前でインストールを行なうものがあるということに注意してください.
              二つのグラフィック ports をインストールして,
              それらが両方とも
              <filename>/usr/local/bin/plot</filename>
              をインストールする場合などは明らかに問題となるでしょう.</para>
          </answer>
        </qandaentry>

        <qandaentry>
          <question>
            <para>やってみました.
              時間がとてもかかるだろうと思ったので,
              そのまま実行を 続けさせて, わたしは寝ました.
              翌朝コンピュータを見てみると,
              三つ半の ports しか処理が終わっていませんでした.
              何か悪かったのでしょうか?</para>
          </question>

          <answer>
            <para>ports の中には,
              わたしたちの決められないこと
              (たとえば, あなたが A4 の 用紙に印刷したいのか, US
              レターサイズの用紙に印刷したいのかなど)
              について質問してくるものがあるからです.
              それらの質問には手動で答える必要があります.</para>
          </answer>
        </qandaentry>
        
        <qandaentry>
          <question>
            <para>一日中モニタの前に座って過ごしたりしたくないのですが,
              何か良いアイディアはありませんか?</para>
          </question>
          
          <answer>
            <para>では, あなたが寝に / 仕事に /
              公園にいく前に以下を実行してください.</para>

            <screen>&prompt.root; <userinput>cd /usr/ports</userinput>
&prompt.root; <userinput>make -DBATCH install</userinput></screen>

            <para>これでユーザの入力を要求<emphasis>しない</emphasis>すべての ports
              をインストールします.
              そして戻ってきてから次のように実行してください.</para>

            <screen>&prompt.root; <userinput>cd /usr/ports</userinput>
&prompt.root; <userinput>make -DIS_INTERACTIVE install</userinput></screen>

            <para>そして残りの作業を実行してください.</para>
          </answer>
        </qandaentry>
        
        <qandaentry>
          <question>
            <para>わたしたちは Ports Collection にある
              <literal>frobble</literal> を使っています.
              ですが, わたしたちの必要に応じて ports
              を変更したところがあるのです.
              自分で package を作って,
              それをわたしたちのサイトのまわりに簡単に配布できるような方法がありますか?</para>
          </question>

          <answer>
            <para>もちろんあります.
              変更点をパッチにする方法は知っていますよね?</para>

            <screen>&prompt.root; <userinput>cd <replaceable>/usr/ports/somewhere/frobble</replaceable></userinput>
&prompt.root; <userinput>make extract</userinput>
&prompt.root; <userinput>cd work/frobble-2.8</userinput>
[あなたのパッチをあててください]
&prompt.root; <userinput>cd ../..</userinput>
&prompt.root; <userinput>make package</userinput></screen>
          </answer>
        </qandaentry>

        <qandaentry>
          <question>
            <para>この ports の技術は本当に賢いですね.
              わたしはこれがどのようにして動いているのか知りたいのですが,
              その秘密とは何ですか?</para>
          </question>

          <answer>
            <para>秘密なんて一切ありません.
              <ulink url="file://localhost/usr/ports/Mk/">Makefiles
                ディレクトリ</ulink> にある
              <filename>bsd.port.mk</filename> と
              <filename>bsd.port.subdir.mk</filename>
              ファイルを見てください.</para>

            <para>(複雑なシェルスクリプトを嫌う読者は,
              このリンクを追いかけないほうが良いでしょう...)</para>
          </answer>
        </qandaentry>
      </qandaset>
    </sect2>

    <sect2 id="ports-broken">
      <title>たすけて! port がうまく動かない!</title>

      <para>port がうまく動作しない状況に遭遇したら,
        あなたにできることは次のようなことしかありません.</para>

      <orderedlist>
        <listitem>
	  <para>自分で直しましょう!
            <quote><link linkend="porting">port の作り方</link></quote>
            のセクションが参考になるはずです.</para>
	</listitem>

	<listitem>
	  <para>苦情を言いましょう &mdash; <emphasis>ただし電子メールで!</emphasis>
            まず port の保守担当者に電子メールを送ってください.
            <command>make maintainer</command> と入力するか,
            <filename>Makefile</filename> を直接読み,
            保守担当者の電子メールアドレスを調べます.
            メールを送る際には, port 名とバージョン番号
            (<filename>Makefile</filename> の <literal>$FreeBSD:</literal>
            行),
            そしてエラーが出力されるまでの出力ログを忘れずに添付してください.
            保守担当者から返信がなければ, <command>send-pr</command>
            を使ってバグレポートを提出しても構いません.</para>
	</listitem>

	<listitem>
	  <para>その port のことは忘れてしまってください.
            これは最も気楽な方法です
            &mdash;
            <quote>重要</quote>な ports というのは,
            ほんの一握りしかありません.
            また, port が更新された時に問題が解決しているかも知れません.</para>
	</listitem>

	<listitem>
	  <para>近くの FTP サイトから package を入手しましょう.
            <quote>マスタ</quote> package コレクションは,
            <hostid role="fqdn">ftp.FreeBSD.org</hostid> の
            <ulink URL="ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/packages/"
                   >package のディレクトリ</ulink>にありますが,
            まずはあなたの地域のミラーサイトを<emphasis>最初に</emphasis>調べてください.
            ソースからコンパイルすることを試みるより確実ですし,
            時間もかかりません.
            package をシステムにインストールするには, &man.pkg.add.1; を使います.
          </para>
	</listitem>
      </orderedlist>
    </sect2>
  </sect1>

  <sect1 id="porting">
    <title>高度な話題</title>

    <para>以前ここにあった文書は, 探しやすいように
      <ulink url="../porters-handbook/index.html">Porter's Handbook</ulink>
      へ移動しました.
      あなたが ports の作成や提出をしたいと考えているなら, そちらへどうぞ.
    </para>
  </sect1>
</chapter>

<!--
     Local Variables:
     mode: sgml
     sgml-declaration: "../chapter.decl"
     sgml-indent-data: t
     sgml-omittag: nil
     sgml-always-quote-attributes: t
     sgml-parent-document: ("../book.sgml" "part" "chapter")
     End:
-->
