Q. 私はモデムについての議論を しているのかと思っていました??!
A.なるほど, あなたはきっとコンピュータの背面についている シリアルポートのことだと思ってしまったのでしょう. あるバージョンの Unixから別のバージョンの Unix へとプログラムを 移殖することを ``porting'' というのですが, ここで我たちは ``porting'' の結果 という意味で ``port'' を使っています. (コンピュータに関わる人々の悪しき習慣として, ひとつの同じ言葉を複数の まったく違う意味として使うことがあるのです.)
Q. 私は, 標準以外のプログラムのインストールには packages を使うと 思っていたのですが.
A. そのとおり. 通常は packages が最も手早くて簡単な方法です.
Q. それではどうして面倒な ports があるのですか?
A. いくつかの理由があります:-
いくつかのソフトウェアのライセンス条件には, バイナリではなくソースコードでの 配布を求めているものがあります.
バイナリ配布を信用していない人もいます. 少なくともソースコード があれば, ソースコードを読んで, (理論的には) 潜在的な問題点を自分で 見つけ出すこともできるはずです.
ローカルなパッチを入手した場合, それを自分で追加するために ソースコードが必要になります.
プログラムがいかにコンパイルされるべきかについて, あなたはパッケージを作った人とは 異なる見解を持っているかもしれません. どんな最適化オプションをつけるべきかとか, デバッグバージョンを作ってから それを strip するべきだとか, いや, そうするべきでない, などなど, 確固たる見解を持っている人もいるでしょう.
ソースコードを手元に置いておきたい人たちもいます. 彼らは, 退屈したときに眺めたり, あちこち解析してみたり, ソースコードを 借用したり (もちろん, ライセンスが許せばの話ですが) するのです.
あなたがソースコードを持っていなければ, それはソフトウェアとは 言えませんね! ;-)
A. パッチとは, あるバージョンから他のバージョンへどのように変更するかを 示す, (通常は) 小さなファイルです. ``23 行目を削除'', ``468 行目の後に これらの 2 行を追加'', または``197 行目をこのように変更''というような 内容を含んでいます. これは, ``diff'' という名前のプログラムで生成されます.
A. .tar または .tar.gz という拡張子を持つファイルです. (.tar.Z のようなバリエーションも ありますし, DOS のファイルシステム用に .tgz と短縮される場合もあります.)
これは基本的に, 一つのファイルに固めた (.tar) ディレクトリツリーです. 圧縮されている (.gz) 場合もあります. これは元々 Tape ARchives (訳注: テープアーカイブ) (このため tar という名前なのです) で使われていたものなのですが, インターネット上でプログラムのソースコードを配布するために 広く使われている方法です.
これらのファイルの中身を見たり, 展開したりすることもできます. FreeBSD の基本システムに付属する Unix 標準の tar コマンドを使ってみると 次のようになります:-
% tar tvzf foobar.tar.gz % tar xzvf foobar.tar.gz % tar tvf foobar.tar % tar xvf foobar.tar
A. これは, チェックしたいファイル中のすべてのデータを加えて生成した 数値です. 何か文字が書き換わっていたら, チェックサムが一致しなくなります. そのため, 単純な比較だけで違いを見つけることができるのです. (実際には, 文字の位置が入れ替わるなどの, 単純な加算ではわからない問題も 見つけることができる複雑な方法で計算されています.)
Q. 私は, CD-ROM から ports をコンパイルする にしたがって ports をインストールしていました. kermit をインストールしようとするまではうまくいっていました:-
# make install >> cku190.tar.gz doesn't seem to exist on this system. >> Attempting to fetch from ftp://kermit.columbia.edu/kermit/archives/.
なぜ cku190.tar.gz が見つからないのでしょうか? 不良品の CD-ROM を買ってしまったのでしょうか?
A. Kermit の権利を持つチームは, 私たちの CDROM に kermit の tarball を 入れることを許可しませんでした. 申し分けありませんが, 手動でファイルを 入手してください. このようなエラーメッセージが出たのは, あなたがそのときインターネットに 接続していなかったためです. あらかじめ上記のサイトのいずれかからファイルを ダウンロードしておけば, プロセスを再開することができます. (ダウンロードの際には, あなたに最も近いサイトを選ぶようにしてください. そうすれば, 時間とインターネットの帯域の節約になります)
Q. kermit の tarball を入手しましたが, /usr/ports/distfiles に ファイルを置こうとすると, 書き込み権がないというエラーがでます.
A. ports のしくみは /usr/ports/distfiles から tarball を探します. しかし, これは read-only の CD-ROM へのシンボリックリンクなので, ここにファイルを置くことはできません. 次のようにすれば, 他の場所を探すよう ports に指示することができます.
# make DISTDIR=/where/you/put/it install
Q. ports では, すべてを /usr/ports に置いたときだけ動作するのでしょうか? システムの管理者によると, 私の個人的なファイルは /u/people/guests/wurzburger に入れなければならないのですが, これでは うまくいかないように思います.
A. PORTSDIR 変数と PREFIX 変数を変更することで, 違うディレクトリを 使用することができます. 例えば,
# make PORTSDIR=/u/people/guests/wurzburger/ports install
とすると, ports は /u/people/guests/wurzburger/ports でコンパイルされ, すべて /usr/local 以下にインストールされます.
# make PREFIX=/u/people/guests/wurzburger/local install
この場合, コンパイルは /usr/ports でおこない, /u/people/guests/wurzburger/local にインストールします. もちろん, 以下のように両者を組み合わせることも可能です.
# make PORTSDIR=.../ports PREFIX=.../local install
(省略せずに記述したら, このページに収めるには長すぎるのですが, 考え方は理解していただけたと思います)
もし ports をインストールするたびに, これらを毎回タイプするのが 気に入らないのであれば, (正直に言って, 誰もそう思わないでしょう) これらを環境変数にセットしてしまうという手があります.
Q. 私は, FreeBSD の CD-ROM を持っていませんが, 私はすべての tarball を 私のシステムに置いておきたいのです. そうすれば, 私は ports をインストール するたびに, 毎回ダウンロードが終わるのを待たなくてすむでしょう. これを一度におこなう簡単な方法はありませんか?
A. ports コレクション全体の tarball を持ってくるには, 次のようにしてください.
# cd /usr/ports # make fetch
ports の下のディレクトリひとつの tarball を持ってくるには, 次のように してください.
# cd /usr/ports/directory # make fetch
ports をひとつだけ持ってくる方法は, きっと既にご存知だと思います.
Q. マスタ FTP サイトから tarball を持ってくるより, 近くにある FreeBSD の ミラーサイトから持ってきた方が速いはずです. MASTER_SITES に書かれている サイト以外から持ってくるように ports に指示する方法はありませんか?
A. もちろんあります. 例えば ftp.FreeBSD.ORG が MASTER_SITES に書かれている サイトより近いとしたら, 以下のようにしてください.
# cd /usr/ports/directory # make MASTER_SITE_OVERRIDE=ftp://ftp.FreeBSD.ORG/pub/FreeBSD/ports/distfiles/ fetch
Q. ダウンロードをする前に, どんなファイルが必要なのか知りたいのですが.
A. make fetch-list とすると, ports に必要なファイルの一覧を表示できます.
Q. ports のコンパイルを途中で止める方法はありますか? 私はインストールをする前に いろいろとソースコードを解析したいのですが, 毎回 control-C を打たなければならないのが少し面倒です.
A. make extract を実行すると, ファイル転送とソースコードの展開まで おこなったところで停止します.
Q. 自分で ports を作ろうとしています. 私の作ったパッチが 正しく処理できることを確認できるように, コンパイルを止めたいのです. パッチのための make extract のようなものはありませんか?
A. あります. make patch があなたのお望みのものです. おそらく PATCH_DEBUG オプションも同様に お役に立つことでしょう. ところで, あなたの努力に感謝いたします!!
Q. あるコンパイルオプションはバグの 原因になるという話を聞きました. 本当なのでしょうか? どうやったら正しい設定で ports をコンパイルできますか?
A. 本当です. gcc の バージョン 2.6.3 (FreeBSDの 2.1.0 と 2.1.5 に付属している バージョン) では, -O2 オプションを -fno-strength-reduce オプションなしで 使うと, バグのあるコードを出力します (ほとんどの ports は -O2 オプションを 使いません). コンバイラオプションは次のように定義 すべき です.
# make CFLAGS='-O2 -fno-strength-reduce' install
これを /etc/make.conf に書いておくこともできますが, 残念なことに すべての ports がこの指定を尊重してくれる 訳ではありません. もっとも確実なのは make configure を実行し, ソースディレクトリの Makefile を見て手で修整することですが, ソースが 多くのサブディレクトリにわかれていて, 各々に Makefile がある場合は 大変な仕事になります.
Q. ports がたくさんありすぎて, 私の欲しいものがなかなか見つけられません. どんな ports が使えるのか, リストはどこかにありませんか?
A. /usr/ports の中にある INDEX ファイルを見てみましょう. あるキーワードで ports コレクションを検索したければ, それも可能です. たとえば, 以下のようにすればプログラミング言語 LISP に関連した ports を見つけることができます:
% cd /usr/ports % make search key=lisp
Q. foo ports をインストールしたいのですが, それのコンパイルは すぐに停止して, bar ports のコンパイルが始まってしまいます. 一体どうして?
A. foo ports が, bar ports の提供する何らかの機能を必要としているからです. 例えば foo が画像を使うとすると, bar は画像処理に必要な ライブラリを持っている, などです. または, bar は foo をコンパイルするのに必要なツールなのかもしれません.
Q. ports から grizzle プログラムをインストールしましたが, まったく ディスクスペースの浪費です. 削除したいのですが, すべてのファイルが どこへインストールされたのかわかりません. 何か手がかりはありませんか?
A. 大丈夫, 次のようにしてください.
# pkg_delete grizzle-6.5
Q. ちょっと待ってください. 削除しようとするコマンドのバージョン番号を 知っていなくてはならないのでしょうか? あなたは, 私がバージョン番号を 覚えていることを本気で当てにしているのでしょうか?
A. そんなことはありません. バージョン番号は次のようにすればわかります.
# pkg_info -a | grep grizzle Information for grizzle-6.5: grizzle-6.5 - the combined piano tutorial, LOGO interpreter and shoot 'em up arcade game.
Q. ディスク容量のことなのですが, ports のディレクトリは非常に膨大な容量を 使うように見えます. 残しておいた方がよいのでしょうか? 削除してしまっても よいのでしょうか?
A. はい. インストールが首尾よく終わり, もうソースコードが必要でないと思うなら, それらを残しておく理由はないでしょう. 一番よい方法は, 次の通りです.
# cd /usr/ports # make clean
これは, すべての ports のサブディレクトリを調べ, 各 ports のスケルトン以外の削除をおこないます.
Q. これを試してみたのですが, tarball や ports で使われたファイルが distfiles ディレクトリに残っています. これも削除してしまっても大丈夫ですか?
A. はい. それを使った作業が終わったのであれば, 削除してしまっても大丈夫です.
Q. 私はとてもとてもたくさんのプログラムを楽しみたいのです. 一度にすべての ports をインストールする方法はありませんか?
A. 次のようにしてください.
# cd /usr/ports # make install
Q. やってみました. 時間がとてもかかるだろうと思ったので, そのまま実行を 続けさせて, 私は寝ました. 翌朝コンピュータを見てみると, 三つ半の ports しか 処理が終わっていませんでした. なにか悪かったのでしょうか?
A. これは ports の中には私たちの決められないこと (例えば, あなたが A4 の 用紙に印刷したいのか, US レターサイズの用紙に印刷したいのかなど) について 質問してくるものがあるからです. それらの質問には手動で答える必要があります.
Q. 私は一日中モニタの前に座って過ごしたりしたくないのですが. 何かよいアイデアはありませんか?
A. では, あなたが寝に / 仕事に / 公園にいく前に以下を実行してください:-
# cd /usr/ports # make -DBATCH install
これでユーザの入力を要求しないすべての ports をインストールします. そして, 戻ってきてから, 次のように実行してください.
# cd /usr/ports # make -DIS_INTERACTIVE install
そして, 残りの作業を実行してください.
Q. 私たちは ports コレクションにある frobble を使っています. ですが, 私たちの必要に応じて ports を変更したところがあるのです. 自分でパッケージを作って, それを私たちのサイトのまわりに 簡単に配布できるような方法がありますか?
A. もちろんあります. 変更点をパッチにする方法は知っていますよね:-
# cd /usr/ports/somewhere/frobble # make extract # cd work/frobble-2.8 [あなたのパッチを当ててください] # cd ../.. # make package
Q. この ports の技術は本当に賢いですね. どのようにして動いているのか 私はどうしても知りたいと思います. その秘密は何ですか?
A. 秘密は一切ありません. Makefiles ディレクトリ にある bsd.ports.mk と bsd.ports.subdir.mk ファイルを見るだけです.
Note: 複雑なシェルスクリプトを嫌う読者は, このリンクを追いかけないほうが よいでしょう.