diff --git a/ja/handbook/authors.ent b/ja/handbook/authors.ent
index b72af61c7a..64298905e8 100644
--- a/ja/handbook/authors.ent
+++ b/ja/handbook/authors.ent
@@ -1,356 +1,358 @@
abial@FreeBSD.ORG">
ache@FreeBSD.ORG">
adam@FreeBSD.ORG">
alex@freebsd.org">
amurai@FreeBSD.ORG">
andreas@FreeBSD.ORG">
archie@FreeBSD.ORG">
asami@FreeBSD.ORG">
ats@FreeBSD.ORG">
awebster@pubnix.net">
bde@FreeBSD.ORG">
billf@FreeBSD.ORG">
brandon@FreeBSD.ORG">
brian@FreeBSD.ORG">
cawimm@FreeBSD.ORG">
charnier@FreeBSD.ORG">
chuckr@glue.umd.edu">
chuckr@FreeBSD.ORG">
cracauer@FreeBSD.ORG">
csgr@FreeBSD.ORG">
cwt@FreeBSD.ORG">
danny@FreeBSD.ORG">
darrenr@FreeBSD.ORG">
davidn@blaze.net.au">
dburr@FreeBSD.ORG">
dcs@FreeBSD.ORG">
des@FreeBSD.ORG">
dfr@FreeBSD.ORG">
dg@FreeBSD.ORG">
dick@FreeBSD.ORG">
dillon@FreeBSD.ORG">
dima@FreeBSD.ORG">
dirk@FreeBSD.ORG">
Dirk.vanGulik@jrc.it">
dt@FreeBSD.ORG">
dufault@FreeBSD.ORG">
dwhite@FreeBSD.ORG">
dyson@FreeBSD.ORG">
eivind@FreeBSD.ORG">
ejc@FreeBSD.ORG">
erich@FreeBSD.ORG">
faq@freebsd.org">
fenner@FreeBSD.ORG">
flathill@FreeBSD.ORG">
foxfair@FreeBSD.ORG">
fsmp@FreeBSD.ORG">
gallatin@FreeBSD.ORG">
gclarkii@FreeBSD.ORG">
gena@NetVision.net.il">
ghelmer@cs.iastate.edu">
gibbs@FreeBSD.ORG">
mjacob@FreeBSD.ORG">
gj@FreeBSD.ORG">
gpalmer@FreeBSD.ORG">
graichen@FreeBSD.ORG">
grog@FreeBSD.ORG">
gryphon@healer.com">
guido@FreeBSD.ORG">
hanai@FreeBSD.ORG">
handy@sxt4.physics.montana.edu">
helbig@FreeBSD.ORG">
hm@FreeBSD.ORG">
hoek@FreeBSD.ORG">
hosokawa@FreeBSD.ORG">
hsu@FreeBSD.ORG">
imp@FreeBSD.ORG">
itojun@itojun.org">
+jasone@FreeBSD.ORG">
+
jb@cimlogic.com.au">
jdp@FreeBSD.ORG">
jehamby@lightside.com">
jfieber@FreeBSD.ORG">
james@nexis.net">
jgreco@FreeBSD.ORG">
jhay@FreeBSD.ORG">
jkh@FreeBSD.ORG">
jkoshy@FreeBSD.ORG">
jlemon@FreeBSD.ORG">
john@starfire.MN.ORG">
jlrobin@FreeBSD.ORG">
jmacd@FreeBSD.ORG">
jmb@FreeBSD.ORG">
jmg@FreeBSD.ORG">
jmz@FreeBSD.ORG">
joerg@FreeBSD.ORG">
john@FreeBSD.ORG">
jraynard@freebsd.org">
jseger@freebsd.org">
julian@FreeBSD.ORG">
jvh@FreeBSD.ORG">
karl@FreeBSD.ORG">
kato@FreeBSD.ORG">
kelly@fsl.noaa.gov">
ken@FreeBSD.ORG">
kjc@FreeBSD.ORG">
kris@FreeBSD.ORG">
kuriyama@FreeBSD.ORG">
lars@FreeBSD.ORG">
ljo@FreeBSD.ORG">
luoqi@FreeBSD.ORG">
markm@FreeBSD.ORG">
martin@FreeBSD.ORG">
max@FreeBSD.ORG">
mark@vmunix.com">
mbarkah@FreeBSD.ORG">
mckay@FreeBSD.ORG">
mckusick@FreeBSD.ORG">
md@bsc.no">
mharo@FreeBSD.ORG">
mks@FreeBSD.ORG">
motoyuki@FreeBSD.ORG">
mph@FreeBSD.ORG">
mpp@FreeBSD.ORG">
msmith@FreeBSD.ORG">
nate@FreeBSD.ORG">
nectar@FreeBSD.ORG">
newton@FreeBSD.ORG">
n_hibma@FreeBSD.ORG">
nik@FreeBSD.ORG">
nsayer@FreeBSD.ORG">
nsj@FreeBSD.ORG">
obrien@FreeBSD.ORG">
olah@FreeBSD.ORG">
opsys@open-systems.net">
paul@FreeBSD.ORG">
pb@fasterix.freenix.org">
pds@FreeBSD.ORG">
peter@FreeBSD.ORG">
phk@FreeBSD.ORG">
pjchilds@imforei.apana.org.au">
proven@FreeBSD.ORG">
pst@FreeBSD.ORG">
rgrimes@FreeBSD.ORG">
rhuff@cybercom.net">
ricardag@ag.com.br">
rich@FreeBSD.ORG">
rnordier@FreeBSD.ORG">
roberto@FreeBSD.ORG">
rse@FreeBSD.ORG">
sada@FreeBSD.ORG">
scrappy@FreeBSD.ORG">
se@FreeBSD.ORG">
sef@FreeBSD.ORG">
shige@FreeBSD.ORG">
simokawa@FreeBSD.ORG">
smace@FreeBSD.ORG">
smpatel@FreeBSD.ORG">
sos@FreeBSD.ORG">
stark@FreeBSD.ORG">
stb@FreeBSD.ORG">
steve@FreeBSD.ORG">
swallace@FreeBSD.ORG">
taoka@FreeBSD.ORG">
tedm@FreeBSD.ORG">
tegge@FreeBSD.ORG">
tg@FreeBSD.ORG">
thepish@FreeBSD.ORG">
torstenb@FreeBSD.ORG">
truckman@FreeBSD.ORG">
ugen@FreeBSD.ORG">
uhclem@FreeBSD.ORG">
ulf@FreeBSD.ORG">
vanilla@FreeBSD.ORG">
wes@FreeBSD.ORG">
whiteside@acm.org">
wilko@yedi.iaf.nl">
wlloyd@mpd.ca">
wollman@FreeBSD.ORG">
wosch@FreeBSD.ORG">
wpaul@FreeBSD.ORG">
yokota@FreeBSD.ORG">
diff --git a/ja/handbook/introduction/chapter.sgml b/ja/handbook/introduction/chapter.sgml
index 4d78c6bb1a..6dfae22ce0 100644
--- a/ja/handbook/introduction/chapter.sgml
+++ b/ja/handbook/introduction/chapter.sgml
@@ -1,724 +1,724 @@
はじめに
FreeBSD は, Intel アーキテクチャ (x86) ベースの PC のための
4.4BSD-Lite をベースとしたオペレーティングシステムです. FreeBSD
の概要については, FreeBSD
とはをご覧ください. このプロジェクトの歴史については,
FreeBSD 小史 をご覧ください.
最新のリリースについての記述は, 現在のリリースについてをご覧ください.
FreeBSD プロジェクトへの何らかの貢献 (ソースコード, 機器,
資金の提供など) について興味があれば, FreeBSD への貢献
の章をご覧ください.
FreeBSD とは
原作: 不明.
訳: &a.jp.tomo;.
FreeBSDはIntel社の (SXやDXも含めた) 386や486, Pentium
プロセッサ といった CPU
アーキテクチャに基づくパーソナルコンピュータ用としては
現在求めうる最高水準のオペレーティングシステムです.
AMD社やCyrix社のIntel互換CPUもサポートされています. FreeBSDは,
以前は高価なコンピュータでしか利用できなかった多くの
高度な機能を提供します.
FreeBSDには次のような機能があります:
アプリケーションとユーザとの間で円滑かつ公平に
コンピュータを 共有することを保証する,
優先度を動的に調節する機能を備えた
プリエンプティブマルチタスキング.
多くの人々が1つのFreeBSD
システムをさまざまな目的で同時に 使うことを可能にする
マルチユーザ アクセス. また,
プリンタやテープドライブのようなシステムの周辺機器も
すべてのユーザ間で適切に共有されます.
SLIPやPPP, NFS, NISのサポートを含んだ完全な
TCP/IPネットワーキング. これによって,
FreeBSDマシンが商用サーバと同じように相互に運用でき, NFS
(リモートファイルアクセス)
や電子メールサービスのような極めて 重要な機能を提供します.
また, WWWやftp, ルーティング, ファイアウォール
(セキュリティ) サービスを用いてインターネットと
接続できます.
アプリケーション (あるいはユーザ) がお互いに干渉できない
ようにするメモリ保護機能.
アプリケーションがクラッシュしても, どのような場合でも
他のアプリケーションには影響を与えません.
FreeBSD は 32ビット
のオペレーティングシステムであり,
最初からそのようにこつこつと設計されました.
業界標準であるX Windowシステム
(X11R6) は, 普通のVGAカードやモニタでグラフィカルユーザ
インタフェース (GUI) を提供し,
すべてのソースコードも一緒に提供されます.
SCOやBSDI, NetBSD, Linux, 386BSD用に作られた多くの
プログラムにおけるバイナリ互換性.
何百もの すぐに実行可能な
アプリケーションが FreeBSDの ports や
packages コレクション で利用可能です.
ここに用意されているものは
ネットを探し回る必要がありません
インターネット上で入手可能な,
移植が容易な
何千ものアプリケーションを追加できます. FreeBSD
は最も評判の よい商用の Unix
システムとソースコードレベルで互換性があります. このため,
ほとんどのアプリケーションは, もしあったとしてもほんの
少しの変更でコンパイルすることができます.
デマンドページング 仮想メモリ
とそれに “付随の VM/buffer キャッシュ”の設計は,
多くのメモリを要求する
アプリケーションに対して効率よくメモリを
与えるようにする一方で,
他のユーザに対しても対話的な応答を維持します.
共有ライブラリ
(MS-WindowsのDLLと同等のUnixの 機能) によって,
ディスクスペースとメモリを効果的に使用する
ことができます.
完全な C や
C++, Fortranの
開発ツール. 進んだ研究や開発のための多くの他の言語も
ports や packages コレクションで提供されています.
システム全体の ソースコード
が提供されているので,
要求に合わせて環境を最大限に適合させることができます.
真のオープンシステムが利用できるのですから,
所有権のある解決方法に 締めつけられ,
ベンダのなすがままになる必要はありません.
膨大な量の
オンラインドキュメント.
もう書ききれません!
FreeBSD はカリフォルニア大学バークレイ校のComputer Systems
Research Group (CSRG) による4.4BSD-Liteリリースを基にしており,
BSDシステムの開発の優れた伝統を守り続けています.
CSRGによる素晴らしい活動に加えて,
FreeBSDプロジェクトは何千時間もの時間を注ぎ込んで,
実際の使用の場において最大の性能と信頼性を
発揮するためにシステムのチューニングをおこなっています.
多くの大企業がPCオペレーティングシステムの分野で
実現しようと奮闘しているそのような機能や性能, 信頼性を
FreeBSDは今すぐ提供できます!
あなたの思いつく限りのアプリケーションは, 何でもFreeBSDで
実行できます. ソフトウェア開発から ファクトリオートメーション,
在庫制御から遠く離れた人工衛星の アンテナの方向調整まで;
商用UNIX製品でできることは, FreeBSDでも十分にできるのです!
また, FreeBSDは世界中の研究センターや大学によって開発される
文字通り何千もの高品質で, たいていはほとんど無料で利用できる
アプリケーションによる恩恵を得ることができます.
商用のアプリケーションも提供されており,
日々増え続けています.
FreeBSDのソースコードは広く提供されているので,
システムも特別なアプリケーションやプロジェクトに合わせて,
いくらでもカスタマイズすることができます. これは
有名な商業ベンダから出ているほとんどのオペレーティング
システムでは不可能なことです. 以下に現在FreeBSDを
使っている人々のアプリケーションの例をいくつか上げます:
インターネットサービス:
FreeBSDに組み込まれている 頑強なTCP/IP
ネットワーキング機能は次のようなさまざまなインターネット
サービスの理想的なプラットフォームになります:
FTP サーバ
World Wide Web サーバ
Gopher サーバ
電子メールサーバ
USENET ニュース
電子掲示板システム
さらにいろいろ...
まずは高価ではない386クラスのPCで始めておいて,
仕事の成長に合わせてアップグレードできます.
教育:
あなたは計算機科学または工学の学生ですか?
オペレーティングシステムやコンピュータアーキテクチャ,
ネットワーキングを学習するなら, FreeBSDを手に
経験するのが一番よい方法です. 自由に利用できるCADや数学,
グラフィックデザインのパッケージもいくつもあり,
コンピュータに関心を持った人が 他の人
の成果を 手に入れて利用するのにとても役に立ちます.
研究:
システム全体のソースコードが利用できるため,
FreeBSDはオペレーティングシステムの研究だけでなく,
計算機科学の他の部門においても優れたプラットフォームです.
自由に利用できるFreeBSDの特長は, オープンフォーラムで
議論される特別なライセンスの同意や制限について
心配することなく, 離れたグループでもアイディアや開発の共有に
よる共同研究を可能にします.
ネットワーキング:
新しいルータが必要? ネームサーバ (DNS) は?
内部のネットワークを人々から守る ファイアウォールは?
FreeBSDはすみに眠っている使われていない386や486のPCを簡単に
洗練されたパケットフィルタリング機能を持つ高級なルータに
変えることができます.
X Windowワークステーション:
自由に利用できるXFree86サーバやX Inside社から提供される
優れた商業サーバを使うことによって, 安価なX端末
としてFreeBSDを使うこともできます. X端末とは違ってFreeBSDは
多くのアプリケーションをローカルに走らせることもでき,
中心のサーバの負荷を軽減することも可能です.
FreeBSDは“ディスクレス”でもブート可能であり,
個々のワークステーションを安価で, 容易に管理することさえ
可能にします.
ソフトウェア開発:
基本的なFreeBSDシステムには
有名なGNUのC/C++コンパイラやデバッガ含んだ完全な開発ツールが
ついてきます.
FreeBSDはCDROMまたはanonymous ftpによってソース,
バイナリとも 利用可能です. 詳しくは, FreeBSD の入手方法
を見てください.
FreeBSD 小史
原作: &a.jkh;.
訳: &a.jp.masaki;, &a.jp.hino;.
19 December 1996.
FreeBSD プロジェクトは 1993年の始めに “Unofficial
386BSD Patchkit” の最後の 3人のまとめ役によって, 部分的に
patchkit から派生する形で開始 されました. ここでの
3人のまとめ役というのは, Nate Williams と, Rod Grimes と, 私
(Jordan K. Hubbard) です.
私たちのもともとの目標は, patchkit
という仕組みではもう十分に解 決できなくなってしまった 386BSD
の数多くの問題を修正するための, 386BSD
の暫定的なスナップショットを作成することでした.
こういった経緯を経てい るので,
このプロジェクトの初期の頃の名前が “ 386BSD 0.5 ” や
“386BSD 暫定版 (Interim)”
であったということを覚えている人もいるでしょう.
386BSD は, Bill Jolitz が (訳注: バークレイ Net/2
テープを基に) 作成し たオペレーティングシステムです. 当時の
386BSD は, ほぼ一年にわたって放っ ておかれていた (訳注:
作者がバグの報告を受けても何もしなかった) という
ひどい状況に苦しんでいました.
作者の代わりに問題を修正し続けていた patchkit
は日を追うごとに不快なまでに膨張してしまっていました. このよ
うな状況に対して, このままではいけない,
何か行動を起こさなければ, とい
うことで異議を唱えるものは私たちのなかにはいませんでした.
そして私たち は挑戦することを決断し,
暫定的な“クリーンアップ”スナップショットを作
成することで Bill を手助けしようと決めたのです. しかし,
この計画は唐突 に終了してしまいました. Bill Jolitz が,
このプロジェクトに対する受け
入れ支持を取り下げることを突然決意し,
なおかつこのプロジェクトの代わり
に何をするのかを一切言明しなかったのです.
たとえ Bill が支持してくれないとしても,
われわれの目標には依然としてや
る価値があると決心するのにさしたる時間はかかりませんでした.
そこで David Greenman が考案した名称 “FreeBSD”
を私たちのプロジェクトの名前 に採用し,
新たなスタートを切りました. この時点でのプロジェクトの初期目
標は, すでにこのシステム (訳注: 386BSD + Patchkit)
を使っていた利用者 たちと相談して決められました.
プロジェクトが実現に向けて軌道に乗ってき
たことが明確になった時点で, 私は Walnut Creek CDROM
社に連絡してみまし た. CDROM を使って FreeBSD
を配布することによって, インターネットに容
易に接続できない多くの人々が FreeBSD
を簡単に入手できるようになると考 えたからです. Walnut Creek
CDROM 社は FreeBSD を CD で配布するというア
イデアを採用してくれたばかりか,
作業するためのマシンと高速なインターネッ
ト回線を私たちのプロジェクトに提供してくれました.
当時は海のものとも山
のものともわからなかった私たちのプロジェクトに対して, Walnut
Creek CDROM 社が信じられないほどの信頼を寄せてくれたおかげで,
FreeBSD は短期 間のうちにここまで大きく成長したのです.
CDROM による最初の配布 (そしてネットでの,
ベータ版ではない最初の一般向 け配布) は FreeBSD 1.0 で, 1993年
12月に公開されました. これは カリフォ ルニア大学バークレイ校の
4.3BSD-Lite (“Net/2”) を基とし, 386BSD や Free
Software Foundation からも多くの部分を取り入れたものです. これは
初めて公開したものとしては十分に成功しました. 続けて 1994年
5月に FreeBSD 1.1 を公開し,
非常に大きな成功を収めました.
この時期,
あまり予想していなかった嵐が遠くから接近してきていました. バー
クレイ Net/2 テープの法的な位置づけについて, Novell 社と
カリフォルニア大学バークレイ校との間の長期にわたる
法廷論争において和解が成立したの です. 和解の内容は, Net/2
のかなりの部分が“権利つき (encumbered)”コー
ドであり, それは Novell 社の所有物である,
というバークレイ校側が譲歩し たものでした. なお, Novell
社はこれらの権利を裁判が始まる少し前に AT&T
社から買収していました. 和解における譲歩の見返りにバークレイ
校が得たのは, 4.4BSD-Lite が最終的に発表された時点で,
4.4BSD-Lite は権 利つきではないと公式に宣言されること,
そしてすべての既存の Net/2 の利 用者が 4.4BSD-Lite
の利用へと移行することが強く奨励されること, という Novell
社からの“ありがたき天からの恵み”でした. (訳注:
4.4BSD-Lite は その後 Novell
社のチェックを受けてから公開された.) FreeBSD も Net/2 を利
用していましたから, 1994年の 7月の終わりまでに Net/2 ベースの
FreeBSD の出荷を停止するように言われました. ただし,
このときの合意によって, 私
たちは締め切りまでに一回だけ最後の公開をすることを許されました.
そして それは FreeBSD 1.1.5.1 となりました.
それから FreeBSD プロジェクトは, まっさらでかなり不完全な
4.4BSD-Lite を基に, 文字どおり一から再度作り直すという,
難しくて大変な作業の準備を始めまし た. “Lite”
バージョンは, 部分的には本当に軽くて, 中身がなかったので す.
起動し,
動作できるシステムを実際に作り上げるために必要となるプログ
ラムコードのかなりの部分がバークレイ校 の CSRG (訳注:
BSDを作っている グループ) によって (いろいろな法的要求のせいで)
削除されてしまっていた ということと, 4.4BSD の Intel
アーキテクチャ対応が元々かなり不完全であっ
たということがその理由です. この移行作業は結局 1994年の
- 12月までかかり ました. そして 1995年の 1月に FreeBSD 2.0
- をネットと CDROM を通じて公 開しました. これは,
+ 11月までかかり ました. そしてその時点で FreeBSD 2.0 をネットと
+ CDROM(12月末ごろ)を通じて公 開しました. これは,
かなり粗削りなところが残っていたにもかかわらず, か
なりの成功を収めました. そしてその後に, より信頼性が高く,
そしてインス トールが簡単になった FreeBSD 2.0.5 が 1995年の
6月に公開されました.
私たちは 1996年の 8月に FreeBSD 2.1.5 を公開しました.
この出来が非常に 良く, 特に業務で運用しているサイトや ISP
での人気が高かったので, 私た ちは 2.1-STABLE
開発分流から更に公開をおこなうことにメリットがあると考 えました.
それが FreeBSD 2.1.7.1 で, 2.1-STABLE 開発分流の最後を締めく
くるものとして, 1997年の 2月に公開されました. 2.1-STABLE
開発分流 (RELENG_2_1_0) は現在,
保守のみをおこなう状態になっており, 今後は, セ
キュリティの改善や他の何か重要なバグフィックスのみが
おこなわれるでしょ う.
FreeBSD 2.2 の開発は, RELENG_2_2 開発分流として, 開発の本流
(“-current”) から 1996年 11月に分岐し, そして 1997年
4月に最初の公開 (2.2.1) がおこなわれました. 2.2
開発分流からはさらに 97 年の夏と秋に公 開がおこなわれ, 98 年 7
月の終わりには最新版の 2.2.7 が登場しました. FreeBSD 3.0
の初めての公式なリリースが 1998 年 10 月上旬に登場し, 2.2
開発分流からの最後のリリースである 2.2.8 が 1998 年 11
月に登場しまし た.
1999 年 1 月 20 日には, FreeBSD
の開発ツリーが再び分岐しました. 4.0-current と 3.x-stable
の分流です. 3.x-stable からは 3.1 が 1999 年 2 月 15
- 日にリリースされる予定です.
+ 日にリリースされ, 3.2 は 1999 年 5 月 15日にリリースされました.
長期的な開発プロジェクトは 4.0-current 開発分流で続けられ,
スナップショットの CDROM (もちろん, ネットワーク上でも)
で公開されます.
FreeBSDプロジェクトの目的
原作: &a.jkh;
訳: &a.jp.kiroh;
24 September 1996.
FreeBSD
プロジェクトの目的は, いかなる用途にも使用でき, 何ら制限のない
ソフトウェアを供給することです.
私たちの多くは, コード(そしてプロジェ
クト)に対してかなりの投資をしてきており,
これからも多少の無駄はあって も投資を続けて行くつもりです. ただ,
他の人達にも同じような負担をするよ
うに主張しているわけではありません. FreeBSD
に興味を持っている一人の残 らず全ての人々に,
目的を限定しないでコードを提供すること. これが,
私たちの最初のそして最大の “任務”
であると信じています. そうすれば, コード は可能な限り広く使われ,
最大の恩恵をもたらすことができるでしょう. これ
が, 私たちが熱烈に支持しているフリーソフトウェアの
最も基本的な目的であ ると, 私は信じています.
私たちのソースツリーに含まれるソースのうち,
GNU一般公有使用許諾(GPL)ま
たはGNUライブラリ一般公有使用許諾(GLPL)
に従っているものについては, 多 少制限が科されています. ただし,
ソースコードへのアクセスの保証という,
一般の制限とはいわば逆の制限(訳注1)です.
ただしGPLソフトウェアを商用で
利用する場合, さらに複雑になるのは避けられません.
そのため, それらのソ フトウェアを, より制限の少ない BSD
- 著作権に従ったソフトウェアで置き換え
- る努力を, 可能な限り日々続けています.
+ 著作権に従ったソフトウェアで置き換える事が合理的であるときには,
+ 我々は置き換える努力を行っています.
(訳注1) GPL では, 「ソースコードを実際に受け取るか,
あるいは, 希望しさ えすればそれを入手することが可能であること」
を求めています.
FreeBSDの開発モデル
原作: &a.asami;.
18 October 1996.
訳: &a.asami;.
31 October 1996.
FreeBSD の開発は非常に開かれた, 柔軟性のあるプロセスです.
コントリビュータのリスト
を見ていただければわかる とおり,
FreeBSDは文字通り世界中の何百という人々の努力によって開発され
ています. 新しい開発者はいつでも大歓迎ですので, &a.hackers;
にメールを 送ってください. また,
大勢で議論するよりは一人で静かに開発にふけりた
いという人は私たちのFTPサイト
ftp.freebsd.org
を使ってパッチや開発中のソースを公開してくださっ て結構です.
&a.announce; もありますので, 他のFreeBSDユーザに自分のやっ
ていることを宣伝したい時にはどうぞ使ってください.
あと, FreeBSD プロジェクトとその開発プロセスについて,
どなたにも知って
いていただきたいのは以下のようなことです.
CVSリポジトリ
FreeBSDのソースツリーは
CVS (Concurrent Versions System)
によってメンテナンスされています. CVSはソー
スコード管理用のフリーソフトウェアで,
FreeBSDのリリースにも含まれてい ます. FreeBSD の メインの CVS
リポジトリ
は米国カリフォルニア州のコンコルド市に存在 し,
そこから世界中のたくさんのミラーサイトに
コピーされています. CVSツ リーそのもの,
そしてそのチェックアウトされたバージョンである-currentと-stableはあな
たのマシンにも簡単に取ってくることができます.
これについては
ソースツリーの同期 の章をご覧ください.
ソースツリー管理者
ソースツリー管理者はCVSツリー
への書き込み権限を持っている人,
つまりFreeBSDのソースに変更を加えるこ とができる人です.
(CVSでリポジトリに変更を加えるには &man.cvs.1;
commit というコマンドを使うので,
これらの人々は英語では “committers”
と呼ばれます.) 開発者にコードを送って見てもらうのに一
番いい方法は &man.send-pr.1; コマンドを使うことです. もし,
何か問題があって send-pr
が使えないならcommitters@freebsd.orgにメー
ルを送っていただいても結構です.
FreeBSDコアチーム
FreeBSD
コアチームはFreeBSDプロジェク
トが会社だとすると取締役会にあたるものです.
コアチームとして一番重要 な役割は FreeBSD
プロジェクトが全体としてよい方向に向かっていることを確
認することです.
責任感あふれる開発者を上記のソースツリー管理者として
招くこと, また仕事上の都合などでコアチームを
やめた人たちの後任を見つけ ることもコアチームの役割です.
現在のコアチームのほとんどは最初は単な
る一開発者としてプロジェクトに関わりはじめ,
ずるずるといつのまにか深み
にはまってしまった人です.
コアチームのうち何人かは特定の 担当分野 を持っており,
システムのうち一部に特に重点をおいて
面倒を見ています.
忘れてほしくないのはコアチームのほとんどは FreeBSD
についてはボラ ンティアであり, FreeBSD
プロジェクトからは何ら金銭的な支援を受けていな
いということです. ですから, ここでの “責任”
は “保証されたサポート” ではありません.
そういう意味で,
上記の“取締役会”という例えはあまりよく
ないかもしれません. むしろ,
FreeBSDのために人生を棒に振ってしまった人
の集まりといった方が正しいかも.... ;)
その他のコントリビュータ
最後になりますが,
もっとも重要で多数をしめる開発者はフィードバック
やバグフィクスをどんどん送ってくれるユーザ自身です.
FreeBSDの開発に外 郭から関わっていきたいという人は
&a.hackers; (
メーリングリスト情報 を見てください)
に参加するといいでしょう.
FreeBSD
のソースツリーに入っている何かを書いた人の リスト
は日に日に長くなっています. あ なたも今日,
何か送ることからはじめてみませんか? :-)
もちろんFreeBSD
に貢献するにはコードを書くほかにもいろいろな方法があ
ります. 助けが求められている分野については,
このハンドブックの 貢献の仕方
の節を見てください.
ひとことで言うと, FreeBSD
の開発組織はゆるやかな同心円状になっています.
ともすると中央集権的に見えがちなこの組織は,
FreeBSDのユーザが
きちんと管理されたコードベースを
容易に追いかけられるようにデザインされ ているもので,
貢献したいという人を締め出す意図は全くありません! 私た
ちの目標は安定したオペレーティングシステムと
簡単にインストールして使う ことのできるアプリケーションを提供することであ り,
この方法は結構うまくはたらくのです.
これからFreeBSDの開発にたずさわろうという人に,
私たちが望むことはただ 一つです:
FreeBSDの成功を継続的なものにするために, 現在の開発者と同じ
ような情熱を持って接してください!
現在のリリースについて
FreeBSD は自由に利用でき Intel
i386/i486/Pentium/PentiumPro/Pentium II (とその互換 CPU) の
PCで動作する, 4.4BSD-Lite ベースの全ソー スつきのリリースです.
これはもともとカリフォルニア大学バーク レイ校
CSRGグループのソフトウェアがベースとなっており, NetBSD, OpenBSD,
386BSD, そして Free Software Foundation の
ソフトウェアなどにより拡張されています.
- 95年1月の FreeBSD 2.0 のリリースからみると, FreeBSD は性能,
+ 94年末の FreeBSD 2.0 のリリースからみると, FreeBSD は性能,
機能, 安定性の面で劇的に改善されました.
もっとも大きな変化は仮想メモリシステムに おける改良で,
統合化された VM/file バッファキャッシュを用いる
ことで性能を向上させながらも FreeBSD
のメモリの使用量を減らすことが できたことです. おかげで, 最低
5MB メモリという制約上でも動作する ようになりました.
その他の拡張としては NIS のクライアントとサーバの 完全サポート,
トランザクション TCP のサポート, ダイヤルオンデマンド PPP, 改良
- SCSI サブシステム, ISDN の初期サポート, FDDI や Fast Ethernet
+ SCSI サブシステム, ISDN のサポート, ATM のサポート, FDDI や Fast Ethernet
(100Mbps) などのサポート, Adaptec 2940 (WIDE と narrow)
のサポートの改良と数百件のバグの修正, などがあります.
私たちはたくさんのユーザからのコメントや
提案をまじめに受け取り, 私たちが正しいと考え,
かつ導入の手順が分かりやすいものを提供しようと 努力しています.
この (継続的に進化する) プロセスに対するあなたの意見を
心からお待ちしています.
FreeBSD では基本配布セットに加え, 移植されたソフトウェア集
- として 数百の人気の高いプログラムを提供しています. 98年8月
- 下旬の時点で 1700 以上の ports (移植ソフトウェア) が存在します.
+ として 数百の人気の高いプログラムを提供しています. 99年4月
+ 下旬の時点で 2300 以上の ports (移植ソフトウェア) が存在します.
ports には http (WWW) サーバから, ゲーム, 言語,
エディタまでありとあらゆるものが含まれています.
portsはオリジナル
ソースに対する“差分”という形で表現されており,
- すべての portsを 集めても 26MB程度にしかなりません.
+ すべての portsを 集めても 50MB程度にしかなりません.
こうすることで ports の更新を 容易にし,
portsに必要なディスクスペースを小さくすることができます.
portsをコンパイルするには,
インストールしたいと思っているプログラムの ディレクトリに移動し,
make all と実行してコンパイルが成 功したら,
make install とすると, あとはすべてシステムが
やってくれます. どの portsもオリジナルの配布セットを動的に
CDROM または近くの FTP サーバから取ってくるので, ディスクは
構築したいと思っている portsの分だけを準備しておけば十分です.
ほとんどの portsは, すでにコンパイルされた状態で
“package” として提供されており,
ソースコードからコンパイルしたくない場 合, これを使うと (pkg_add
というコマンドで) 簡単にインストー ルできます.
FreeBSD 2.1 以降のマシンであれば,
/usr/share/doc
ディレクトリにインストールの手順や FreeBSD を利用する上で有用な
ドキュメントがたくさんあります.
これらのローカルにインストールされたドキュメントは, HTML
ブラウザを使って, 以下の URL から 参照することができます.
FreeBSD ハンドブック (英文オリジナル)
file:/usr/share/doc/handbook/handbook.html
FreeBSD に関する FAQ
file:/usr/share/doc/FAQ/FAQ.html
また, http://www.freebsd.org
にはマスタ (かなり頻繁に更新されます) がありますので,
こちらも参照してください.
合衆国の輸出規制のため, FreeBSD のコア配布セットには DES
のコードは 含まれていません. 合衆国国内に限り, DES
を使うプログラムなどが,
コア配布セットに加えるパッケージとして提供されています.
誰でも使えるパッケージは, 別途, 合衆国国外で提供されています.
合衆国国外からも自由に取得可能な DES の配布セットに関する
詳細は, FreeBSD FAQ
にあります.
FreeBSD 上で必要とされるセキュリティがパスワードだけであり,
Sun や DEC
などの別のホストから暗号化されたパスワードをコピーする必要が
ないのであれば, FreeBSD の MD5 ベースのセキュリティで十分です.
この標準のセキュリティモデルは DES
よりも適していると私たちは思って いますし, また,
やっかいな輸出規制にもひっかかることはありません.
あなたが合衆国国外にいるなら (あるいは国内にいても)
一度試してみて ください!
diff --git a/ja/handbook/ports/chapter.sgml b/ja/handbook/ports/chapter.sgml
index 1c343d7c23..02245a926c 100644
--- a/ja/handbook/ports/chapter.sgml
+++ b/ja/handbook/ports/chapter.sgml
@@ -1,5233 +1,5233 @@
アプリケーションのインストール : ports コレクション
原作: &a.jraynard;.
訳: &a.jp.masaki;, &a.jp.saeki;.
11 November 1996.
FreeBSD の ports コレクションを利用すると, 最小限の労力で
非常に幅広くのアプリケーションのコンパイルとインストールがおこなえます.
やってみたことのある方はよくご存知でしょうが,
オープンな規格とは 全くの誇大広告であって,
あるプログラムを異なるバージョンの Unix 上で
動作させることは退屈で手間のかかる仕事です.
求めているプログラムが自分のシステムでうまくコンパイルでき,
正しいところにインストールできて,
完璧に動作するとしたらとてもラッキーです. しかし,
あいにくこれは滅多にないことなのです.
ほとんどのプログラムについて,
あなたは髪を掻きむしることになるでしょうし,
かなりのプログラムでは, 白髪混じりの頭になってしまったり,
あるいは慢性の 脱毛症にすら なってしまうかもしれません...
いくつかのソフトウェアディストリビューションでは,
設定用のスクリプトを
配布することでこの問題を解決しようとしています.
これらのスクリプトの中には非常に精巧なものもありますが,
残念ながら, 中にはこれまで
聞いたこともないようなシステムの名前をしゃあしゃあと
言い放ったうえに, まるでシステムレベルの Unix
プログラミングに関する 最終試験のような,
たくさんの質問をしてくる場合があります. (例えば,
このシステムの gethitlist 関数は fromboz への const
ポインタを 返しますか? それとも const fromboz
へのポインタを返しますか?, このシステムには
Foonix スタイルの, 容認できない例外処理をおこなう
ルーチンがありますか? もしもないとしたら,
それはなぜですか?)
幸いなことに, ports コレクションがあれば,
これらのきつい作業はすべて 完了しています. make
install とタイプするだけで, 動作するプログラムを
入手することができるのです.
なぜ ports コレクションを作ったのか?
FreeBSD の基本システムは,
非常に多くのツールやユーティリティから 構成されています. しかし,
よく使われるプログラムのうち多くのものが,
この基本システムには含まれていません. その理由は:-
ある Lisp ベースのエディタのように,
それがないと生きていけないと 言う人もいれば,
ディスクの無駄だと言う人もいるようなプログラム.
基本システムに組み込むには特殊すぎるプログラム. (CAD
やデータベースなど.)
“時間のある時に,
ちょっと見ておかなければ”というような類の,
それがシステムに含まれていないことが
致命的とは言えないプログラム. (おそらく,
何らかの言語などでしょう.)
FreeBSD
のような真面目なオペレーティングシステムの一部として
供給するには遊びが過ぎるようなプログラム. ;-)
たくさんのプログラムを基本システムに組み込んだとしても,
もっともっと 組み込みたいという要求が出てくるので,
どこかで制限を引かなくてはならないため. (そうしなければ
FreeBSD の配布物は,
とてつもなく膨大になってしまうでしょう.)
すべての人が自分のお気に入りの
プログラムを手作業で移植しなければ ならないとしたら,
(途方もない膨大な作業の繰り返しをさておいたとしても)
それは明らかに不合理な話です. そこで, FreeBSD プロジェクトでは,
標準のツールを使って移植のプロセスを
自動化する巧妙な方法を考え出しました.
なお,
これは単純ながら非常に柔軟なツールを組み合わせることで,
非常に強力な働きをさせるという“Unix
流”の作業の優れた実例です.
ports コレクションはどのように動くのでしょうか?
インターネットでは通常, tarball の形で
プログラムが配布されています. これは, Makefile
とソースコードで構成され, 普通は何らかの説明書 (あいにく,
いつもわかりやすく書かれているとは 限りませんが)
が付属しています. ことによるとコンフィグレーションスクリプトも
含まれているかもしれません.
標準的な手順では, FTP で tarball を入手して,
適当なディレクトリで展開します. 次に説明書を読んで,
必要な変更をおこないます. そして, 設定スクリプトを実行し, 標準の
make
コマンドを使ってソースのコンパイルとインストールを
おこないます.
FreeBSD の ports も tarball の仕組みを利用していますが,
これはユーザが 苦労して作業することを期待したものではなく,
どのようにすれば FreeBSD 上で
そのプログラムが動くようになるかという「ノウハウ」を スケルトン
を使用して収めているものです. スケルトンは, カスタマイズ済みの
Makefile も
提供していますので, ほとんどすべての ports
は同じ手順でインストールすることが できます.
もしあなたが (あなたの
FreeBSD システム または
FTP サイト にある) ports スケルトンを見ていて,
そこに潜んでいる あらゆる種類の先端的な
ロケット工学的なものを見つけられると期待していると,
つまらなそうなファイルやディレクトリがそこにあるだけなのを見て,
がっかりするかもしれません.
(ports を手に入れる方法については, すぐに
FreeBSD ports コレクションの入手方法
の節でお話します.)
“一体どうしたらいいんだ? ここにはソースコードが
ないじゃないか?”
というあなたの叫びが聞こえるようです.
心配いりません. おとなしく読んでいけば, すべてが (たぶん)
明らかに なるでしょう. 試しに ports をインストールして,
何が起きるのかを見てみましょう.
ここではサンプルとして開発者向けの便利なツール,
ElectricFence を選択します.
このスケルトンを選んだ理由は, 他の ports
に比べても素直で理解しやすく 書かれているからです.
自宅で試してみる場合には, root
になる必要があるでしょう.
&prompt.root; cd /usr/ports/devel/ElectricFence
&prompt.root; make install
>> Checksum OK for ElectricFence-2.0.5.tar.gz.
===> Extracting for ElectricFence-2.0.5
===> Patching for ElectricFence-2.0.5
===> Applying FreeBSD patches for ElectricFence-2.0.5
===> Configuring for ElectricFence-2.0.5
===> Building for ElectricFence-2.0.5
[大量のメッセージをコンパイラが出力します...]
===> Installing for ElectricFence-2.0.5
===> Warning: your umask is "0002".
If this is not desired, set it to an appropriate value
and install this port again by ``make reinstall''.
install -c -o bin -g bin -m 444 /usr/ports/devel/ElectricFence/work/ElectricFence-2.0.5/libefence.a /usr/local/lib
install -c -o bin -g bin -m 444 /usr/ports/devel/ElectricFence/work/ElectricFence-2.0.5/libefence.3 /usr/local/man/man3
===> Compressing manual pages for ElectricFence-2.0.5
===> Registering installation for ElectricFence-2.0.5
ここではあなたが混乱しないように, コンパイル時の出力を
すべて取り除いてあります.
もしもあなた自身で実行されたら, 最初にこのような
出力結果が得られるはずです:-
&prompt.root; make install
>> ElectricFence-2.0.5.tar.gz doesn't seem to exist on this system.
>> Attempting to fetch from ftp://ftp.doc.ic.ac.uk/Mirrors/sunsite.unc.edu/pub/Linux/devel/lang/c/.
make プログラムは,
あなたの手元にソースコードがないことを検出し,
処理を続けられるようにソースを FTP でダウンロードしようとします.
この例では, あらかじめ手動でソースコードを用意してあったので,
持ってくる必要はありませんでした.
では, 続けて make
プログラムが何をしているのか見てみましょう.
ソースコード tarball のありかを
確認します. 手元にファイルが存在しなければ, FTP
サイトから入手しようとします.
チェックサム
テストを実行して, その tarball
が事故か何かで途中で切れていたり, ASCII モードで
ダウンロードされていたり,
転送中にニュートリノによって傷められたりして
改変されたりしていないかどうかを確認します.
tarball を一時的な作業用ディレクトリに展開します.
FreeBSD 上でコンパイルしたり, 動作させるのに必要な
すべての パッチ
をソースコードに当てます.
構築のために必要な
コンフィグレーションスクリプトを実行します.
コンフィグレーションスクリプトの
質問には正確に答えてください.
(いよいよ!) ソースコードをコンパイルします.
実行形式のプログラム, マニュアル,
その他のサポートファイルを,
システムのプログラムと混ざってしまわないように
/usr/local 以下に インストールします.
ports はすべて同じ場所にインストールされ,
システムのあちこちにばらまかれることはありません.
インストール結果はデータベースに登録されます.
これにより,
インストールしたプログラムがもしも気に入らなかったときも,
システムから すべての痕跡をきれいに 消去
することができます.
以上のステップが make
の出力と一致しているかどうか確認してください.
今まで確認していなかったのなら,
今からするようにしてください!
FreeBSD ports コレクションの入手
あるプログラムの FreeBSD port
を入手するには二つの方法があります. ひとつは FreeBSD CD-ROM を使う方法で,
もうひとつは インターネット接続
を使う方法です.
CD-ROM からコンパイルする
FreeBSD CD-ROM がドライブに入っており,
/cdrom にマウントされていると仮定すると
(マウントポイントが /cdrom
である必要があります), ただ普通に実行するだけで ports
を構築できるようになり, tarball
をネットワーク経由でダウンロードするのではなく
/cdrom/ports/distfiles/
からさがすようになります (そこにあればの話ですが).
CD-ROM にある port スケルトンを使いたければ, 他に
/etc/make.conf の
変数を以下のようにセットする方法があります:
PORTSDIR= /cdrom/ports
DISTDIR= /tmp/distfiles
WRKDIRPREFIX= /tmp
(任意の十分な空きスペースの場所を /tmp
とおいています).
次に, /cdrom/ports 下の適宜のサブディレクトリに
cd して, 例のごとく
make install とタイプします.
WRKDIRPREFIX は port に
/tmp/cdrom/ports の下でビルドさせようとします;
例えば, games/oneko は
/tmp/cdrom/ports/games/oneko の下で
ビルドされるでしょう.
ライセンスの制限により, いくつかの ports
でオリジナルのソースコードを CD-ROM
に入れることができなかったものがあることに注意してください.
この場合, インターネット経由で
ports をコンパイルする の
節を参照してください.
インターネット経由で ports をコンパイルする
CD-ROM を持っていなかったり, その ports
の最新バージョンを確実に入手したい 場合は, その ports の スケルトン を
ダウンロードする必要があります. ところで, これは落し穴が
たくさんある作業に見えるかもしれませんが,
実際には非常に簡単です.
初めに, あなたの動かしている FreeBSD
がリリースバージョンなら ports ページ
でその FreeBSD 用の “アップグレードキット”
を手にいれてください. このパッケージには, 最新の ports
をコンパイルするのに必要な,
リリース以降に更新されたファイルが含まれています.
FreeBSD の FTP サーバーがその場で tarball
を作成できることを利用してスケルトンを入手すると
非常に便利です. ここでは例として databases ディレクトリにある
gnats プログラムを使って説明します.
(角型かっこの中の文はコメントなので, 実際に実行する場合には,
これをタイプしないでください!):-
&prompt.root; cd /usr/ports
&prompt.root; mkdir databases
&prompt.root; cd databases
&prompt.root; ftp ftp.freebsd.org
[ユーザ名 `ftp' でログインし, パスワードを要求されたら, あなたの電子メール
アドレスを入力してください. バイナリモードを (イメージモードと呼ばれることも
あります) 使うのをお忘れなく!]
> cd /pub/FreeBSD/ports/ports/databases
> get gnats.tar
[gnats スケルトンの tarballs を取得]
> quit
&prompt.root; tar xf gnats.tar
[gnats スケルトンの展開]
&prompt.root; cd gnats
&prompt.root; make install
[gnats の構築とインストール]
さて何が起きるでしょうか? FTP
サイトにいつも通りに接続して, データベースの
サブディレクトリに移動します. get gnats.tar
とコマンドを入力すると, FTP サイトでは gnats ディレクトリを
tarred
にしてくれるのです.
gnats スケルトンを展開したら, gnats ディレクトリへ移動して
ports を構築します. すでに
説明したように, make の過程で
手元にソースコードがないことを検出すると,
ソースコードを取得してから 展開し,
パッチ当てと構築をおこないます.
それでは, 少し冒険をしてみましょう. 一つの ports
スケルトンを 取得するかわりに, たとえば ports
コレクションの中のデータベースの スケルトンをすべて,
サブディレクトリ全体を取得してみましょう.
やり方はほとんど同じです:-
&prompt.root; cd /usr/ports
&prompt.root; ftp ftp.freebsd.org
[ユーザ名 `ftp' でログインし, パスワードを要求されたら, あなたの電子メール
アドレスを入力してください. バイナリモードを (イメージモードと呼ばれることも
あります) 使うのをお忘れなく!]
> cd /pub/FreeBSD/ports/ports
> get databases.tar [データベースディレクトリの tarballs を取得]
> quit
&prompt.root; tar xf databases.tar [すべてのスケルトンを展開]
&prompt.root; cd databases
&prompt.root; make install [データベース ports 全部の構築とインストール]
わずかばかりの簡単なコマンドで, この FreeBSD
マシン上にデータベース
プログラムを一揃い手に入れてしまいました! 一つの ports
スケルトンを取ってきて それを構築する場合との違いは,
すべてのディレクトリを一度に取得して,
全部を一度にコンパイルしたということだけです.
かなり感動的だと思いませんか?
たくさんの ports をインストールする つもりなら,
おそらくすべての ports ディレクトリをダウンロードしておく
価値があるでしょう.
スケルトン
スケルトン (訳注: skeleton とは骸骨のことです) とは,
締め切りを守るため, 食事をするのを忘れるほど仕事にのめり込んだ
ハッカーたちのなれの果ての ことでしょうか? FreeBSD
の屋根裏に潜む, なにか気持ちの悪いものでしょうか? いいえ,
ここでスケルトンの意味するところは, ports の魔術を実現するのに
必要とされるすべてのものを提供する最小の骨組みのことです.
Makefile
スケルトンのもっとも重要な要素は Makefile です. Makefile
は ports を どのようにコンパイルし,
インストールをおこなうかを指示する
いろいろな命令を含んでいます. 以下に ElectricFence の Makefile
を示します:-
# New ports collection makefile for: Electric Fence
# Version required: 2.0.5
# Date created: 13 November 1997
# Whom: jraynard
#
# $Id$
#
DISTNAME= ElectricFence-2.0.5
CATEGORIES= devel
MASTER_SITES= ${MASTER_SITE_SUNSITE}
MASTER_SITE_SUBDIR= devel/lang/c
MAINTAINER= jraynard@freebsd.org
MAN3= libefence.3
do-install:
${INSTALL_DATA} ${WRKSRC}/libefence.a ${PREFIX}/lib
${INSTALL_MAN} ${WRKSRC}/libefence.3 ${PREFIX}/man/man3
.include <bsd.port.mk>
"#" で始まる行は, 人間のためのコメント行です.
(ほとんどの Unix のスクリプトと同じですね.)
DISTNAME は tarball
の名前から拡張子を取ったものです.
CATEGORIES
はこのプログラムの種類を示します. この場合,
開発者向けのユーティリティということになります.
完全なリストはこのハンドブックの カテゴリ
をみてください.
MASTER_SITES はマスタ FTP サイトの URL
です. もしローカルシステムに tarball がない場合には,
ここから取得します. これは信頼できると考えられているサイトで,
通常はそのプログラムを
インターネット上で公式に配布しているサイトです.
(そのソフトウェアがインターネット上で「公式に」
配布されているとしたら)
MAINTAINER は,
例えば新しいバージョンのプログラムが出た場合に, 必要であれば
スケルトンの更新をおこなう保守担当者の
電子メールアドレスです.
次の数行はとりあえず飛ばします.
.include <bsd.port.mk>
この行は, この ports に必要なその他の命令やコマンドは
bsd.port.mk に
入っているということを示しています.
これらはすべての ports で共通のものなので,
それぞれの Makefile に書いておく必要はありません.
そのため単一の標準ファイルに
まとめられているのです.
ここでは Makefile
がどう働くかを詳細に調査するのが目的ではありませんので,
MAN3 で始まる行は, インストールの後に
ElectricFence のマニュアルを 圧縮するために使用される,
と言っておくだけで充分でしょう. これにより,
貴重なディスクスペースが保護されているわけです. オリジナルの
port では install
ターゲットが用意されていないので,
do-install からの 3 行が この ports
によって生成されたファイルを
正しい場所に置くために使用されます.
files ディレクトリ
ports のチェックサム算出には MD5
アルゴリズムを使用しているので, この チェックサム を含んでいる
ファイルは md5 と呼ばれます.
ちょっと混乱するかもしれませんが, このファイルは
files という
名前のディレクトリに置かれています.
このディレクトリは, ports に必要だけれども,
他のどこにも属さない 雑多なファイルも含んでいます.
patches ディレクトリ
このディレクトリには, FreeBSD
ですべてを正常に動作させるのに 必要な パッチ が含まれています.
pkg ディレクトリ
このディレクトリには,
非常に役立つ三つのファイルが含まれています:-
COMMENT —
プログラムについての 1 行の説明.
DESCR — より詳細な説明.
PLIST —
プログラムのインストール時に作成される,
すべてのファイルのリスト.
ports が動かないのですが, どうしたらよいでしょう
おやおや. では, 次の四つのどれかをやってみてください:
自分で修正する. ports
の仕組みに関する技術的な詳細については,
アプリケーションの移殖方法をご覧ください.
苦情をいう. これは電子メールで だけ
にしてください! このようなメールの宛先は &a.ports; です.
なお, 必ず port の名前やバージョン, その port のソースや
distfile(s) を どこから入手したか,
どんなエラーが発生したのかを書いておいてください.
忘れてしまう. これはほとんどの場合最も簡単な方法です.
ports
のプログラムのうち必要不可欠な物はごくわずかです.
FTP サイトからコンパイル済みのパッケージを入手する.
“マスター”パッケージコレクションは FreeBSD の
FTP サイトの
パッケージディレクトリ に置いてありますが,
まずあなたの近くのローカルミラーサイトを確認してください!
ソースからのコンパイルに挑戦するよりも,
パッケージを使うほうが (全体的に見て)
ずっと確実に動作するでしょうし,
より手っ取り早い方法でもあります.
システムにパッケージをインストールするには, &man.pkg.add.1;
を使ってください.
質問と回答集
Q. 私はモデムについての議論を
しているのかと思っていました??!
A.なるほど, あなたはきっとコンピュータの背面についている
シリアルポートのことだと思ってしまったのでしょう.
あるバージョンの Unixから別のバージョンの Unix
へとプログラムを 移殖することを “porting”
というのですが, ここで我たちは “porting” の結果
という意味で “port” を使っています.
(コンピュータに関わる人々の悪しき習慣として,
ひとつの同じ言葉を複数の
まったく違う意味として使うことがあるのです.)
Q. 私は, 標準以外のプログラムのインストールには packages
を使うと 思っていたのですが.
A. そのとおり. 通常は packages
が最も手早くて簡単な方法です.
Q. それではどうして面倒な ports があるのですか?
A. いくつかの理由があります:-
いくつかのソフトウェアのライセンス条件には,
バイナリではなくソースコードでの
配布を求めているものがあります.
バイナリ配布を信用していない人もいます.
少なくともソースコード があれば, ソースコードを読んで,
(理論的には) 潜在的な問題点を自分で
見つけ出すこともできるはずです.
ローカルなパッチを入手した場合,
それを自分で追加するために
ソースコードが必要になります.
プログラムがいかにコンパイルされるべきかについて,
あなたはパッケージを作った人とは
異なる見解を持っているかもしれません.
どんな最適化オプションをつけるべきかとか,
デバッグバージョンを作ってから それを strip
するべきだとか, いや, そうするべきでない, などなど,
確固たる見解を持っている人もいるでしょう.
ソースコードを手元に置いておきたい人たちもいます.
彼らは, 退屈したときに眺めたり, あちこち解析してみたり,
ソースコードを 借用したり (もちろん,
ライセンスが許せばの話ですが) するのです.
あなたがソースコードを持っていなければ,
それはソフトウェアとは 言えませんね! ;-)
Q. パッチとは何ですか?
A. パッチとは,
あるバージョンから他のバージョンへどのように変更するかを
示す, (通常は) 小さなファイルです. “23
行目を削除”, “468 行目の後に これらの 2
行を追加”, または“197
行目をこのように変更”というような 内容を含んでいます.
これは, “diff”
という名前のプログラムで生成されます.
Q. tarball とは一体何ですか?
A. .tar または
.tar.gz という拡張子を持つファイルです.
(.tar.Z のようなバリエーションも
ありますし, DOS のファイルシステム用に
.tgz
と短縮される場合もあります.)
これは基本的に, 一つのファイルに固めた
(.tar) ディレクトリツリーです.
圧縮されている (.gz) 場合もあります.
これは元々 Tape
ARchives (訳注: テープアーカイブ)
(このため tar という名前なのです)
で使われていたものなのですが,
インターネット上でプログラムのソースコードを配布するために
広く使われている方法です.
これらのファイルの中身を見たり,
展開したりすることもできます. FreeBSD
の基本システムに付属する Unix 標準の tar
コマンドを使ってみると 次のようになります:-
&prompt.user; tar tvzf foobar.tar.gz
&prompt.user; tar xzvf foobar.tar.gz
&prompt.user; tar tvf foobar.tar
&prompt.user; tar xvf foobar.tar
Q. チェックサムとは何ですか?
A. これは,
チェックしたいファイル中のすべてのデータを加えて生成した
数値です. 何か文字が書き換わっていたら,
チェックサムが一致しなくなります. そのため,
単純な比較だけで違いを見つけることができるのです.
(実際には, 文字の位置が入れ替わるなどの,
単純な加算ではわからない問題も
見つけることができる複雑な方法で計算されています.)
Q. 私は, CD-ROM から ports
をコンパイルする にしたがって ports
をインストールしていました. kermit
をインストールしようとするまではうまくいっていました:-
&prompt.root; 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 に指示することができます.
&prompt.root; make DISTDIR=/where/you/put/it install
Q. ports では, すべてを /usr/ports
に置いたときだけ動作するのでしょうか?
システムの管理者によると, 私の個人的なファイルは
/u/people/guests/wurzburger
に入れなければならないのですが, これでは
うまくいかないように思います.
A. PORTSDIR 変数と
PREFIX 変数を変更することで,
違うディレクトリを 使用することができます. 例えば,
&prompt.root; make PORTSDIR=/u/people/guests/wurzburger/ports install
とすると, ports は
/u/people/guests/wurzburger/ports
でコンパイルされ, すべて /usr/local
以下にインストールされます.
&prompt.root; make PREFIX=/u/people/guests/wurzburger/local install
この場合, コンパイルは /usr/ports
でおこない,
/u/people/guests/wurzburger/local
にインストールします. もちろん,
以下のように両者を組み合わせることも可能です.
&prompt.root; make PORTSDIR=.../ports PREFIX=.../local install
(省略せずに記述したら,
このページに収めるには長すぎるのですが,
考え方は理解していただけたと思います)
もし ports をインストールするたびに,
これらを毎回タイプするのが 気に入らないのであれば,
(正直に言って, 誰もそう思わないでしょう)
これらを環境変数にセットしてしまうという手があります.
Q. 私は, FreeBSD の CD-ROM を持っていませんが,
私はすべての tarball を 私のシステムに置いておきたいのです.
そうすれば, 私は ports をインストール するたびに,
毎回ダウンロードが終わるのを待たなくてすむでしょう.
これを一度におこなう簡単な方法はありませんか?
A. ports コレクション全体の tarball を持ってくるには,
次のようにしてください.
&prompt.root; cd /usr/ports
&prompt.root; make fetch
ports の下のディレクトリひとつの tarball
を持ってくるには, 次のように してください.
&prompt.root; cd /usr/ports/directory
&prompt.root; make fetch
ports をひとつだけ持ってくる方法は,
きっと既にご存知だと思います.
Q. マスタ FTP サイトから tarball を持ってくるより,
近くにある FreeBSD の
ミラーサイトから持ってきた方が速いはずです. MASTER_SITES
に書かれている サイト以外から持ってくるように ports
に指示する方法はありませんか?
A. もちろんあります. 例えば ftp.FreeBSD.ORG が
MASTER_SITES に書かれている
サイトより近いとしたら, 以下のようにしてください.
&prompt.root; cd /usr/ports/directory
&prompt.root; 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 に付属している バージョン) では,
オプションを
オプションなしで
使うと, バグのあるコードを出力します (ほとんどの ports は
オプションを 使いません).
コンバイラオプションは次のように定義 すべき
です.
&prompt.root; 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
を見つけることができます:
&prompt.user; cd /usr/ports
&prompt.user; make search key=lisp
Q. foo ports
をインストールしたいのですが, それのコンパイルは
すぐに停止して, bar ports
のコンパイルが始まってしまいます. 一体どうして?
A. foo ports が,
bar ports
の提供する何らかの機能を必要としているからです. 例えば
foo が画像を使うとすると,
bar は画像処理に必要な
ライブラリを持っている, などです. または,
bar は foo
をコンパイルするのに必要なツールなのかもしれません.
Q. ports から
grizzle
プログラムをインストールしましたが, まったく
ディスクスペースの浪費です. 削除したいのですが,
すべてのファイルが どこへインストールされたのかわかりません.
何か手がかりはありませんか?
A. 大丈夫, 次のようにしてください.
&prompt.root; pkg_delete grizzle-6.5
Q. ちょっと待ってください.
削除しようとするコマンドのバージョン番号を
知っていなくてはならないのでしょうか? あなたは,
私がバージョン番号を
覚えていることを本気で当てにしているのでしょうか?
A. そんなことはありません.
バージョン番号は次のようにすればわかります.
&prompt.root; 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. はい. インストールが首尾よく終わり,
もうソースコードが必要でないと思うなら,
それらを残しておく理由はないでしょう. 一番よい方法は,
次の通りです.
&prompt.root; cd /usr/ports
&prompt.root; make clean
これは, すべての ports のサブディレクトリを調べ, 各
ports のスケルトン以外の削除をおこないます.
Q. これを試してみたのですが, tarball や ports
で使われたファイルが distfiles
ディレクトリに残っています.
これも削除してしまっても大丈夫ですか?
A. はい. それを使った作業が終わったのであれば,
削除してしまっても大丈夫です.
Q.
私はとてもとてもたくさんのプログラムを楽しみたいのです.
一度にすべての ports
をインストールする方法はありませんか?
A. 次のようにしてください.
&prompt.root; cd /usr/ports
&prompt.root; make install
Q. やってみました. 時間がとてもかかるだろうと思ったので,
そのまま実行を 続けさせて, 私は寝ました.
翌朝コンピュータを見てみると, 三つ半の ports しか
処理が終わっていませんでした.
なにか悪かったのでしょうか?
A. これは ports の中には私たちの決められないこと
(例えば, あなたが A4 の 用紙に印刷したいのか, US
レターサイズの用紙に印刷したいのかなど) について
質問してくるものがあるからです.
それらの質問には手動で答える必要があります.
Q.
私は一日中モニタの前に座って過ごしたりしたくないのですが.
何かよいアイデアはありませんか?
A. では, あなたが寝に / 仕事に /
公園にいく前に以下を実行してください:-
&prompt.root; cd /usr/ports
&prompt.root; make -DBATCH install
これでユーザの入力を要求しないすべての ports
をインストールします. そして, 戻ってきてから,
次のように実行してください.
&prompt.root; cd /usr/ports
&prompt.root; make -DIS_INTERACTIVE install
そして, 残りの作業を実行してください.
Q. 私たちは ports コレクションにある
frobble を使っています. ですが,
私たちの必要に応じて ports を変更したところがあるのです.
自分でパッケージを作って, それを私たちのサイトのまわりに
簡単に配布できるような方法がありますか?
A. もちろんあります.
変更点をパッチにする方法は知っていますよね:-
&prompt.root; cd /usr/ports/somewhere/frobble
&prompt.root; make extract
&prompt.root; cd work/frobble-2.8
[あなたのパッチを当ててください]
&prompt.root; cd ../..
&prompt.root; make package
Q. この ports の技術は本当に賢いですね.
どのようにして動いているのか
私はどうしても知りたいと思います. その秘密は何ですか?
A. 秘密は一切ありません. Makefiles
ディレクトリ にある
bsd.ports.mk と
bsd.ports.subdir.mk
ファイルを見るだけです.
複雑なシェルスクリプトを嫌う読者は,
このリンクを追いかけないほうが よいでしょう.
自分で port を作る
原作: &a.jkh;, &a.gpalmer;, &a.asami;,
&a.obrien; and &a.hoek;. 28 August 1996.
訳: &a.jp.simokawa;, &a.asami;.
10 November 1996.
自分で port を作ることに興味がありますか, すばらしい!
これから, FreeBSD 用のportを作る際の,
いくつかのガイドラインを 説明します.
実際にportをコンパイルするときのほとんどの仕事は
/usr/ports/Mk/bsd.port.mk
というファイルでおこないます.
Portsコレクションについてのさらに細かい内部の働きについては,
そちらの ファイルを参照してください.
これにはコメントが細かく書いてありますので, Makefile
を読むのにあまり慣れていない人でも, 得るものはとても大きいで
しょう.
ここでは, 変更可能な変数の一部についてのみ記述しています.
ほとんどの変数はbsd.port.mk
の始めに記述があります.
また, このファイルは非標準のタブの設定になっています.
Emacs や Vim
はファイルのロード時にこれを認識しますが,
viやexでは,
ファイルをロードしたら :set tabstop=4
のようにして正しい値を設定する
ことができます.
3分porting
この節では, 簡単なportの方法について説明します.
多くの場合これ では不十分ですが,
まあうまくいくかどうか試してみて損はないでしょ う.
まず, 元のtarファイルをDISTDIRに置きます.
デフォルトは/usr/ports/distfilesです.
以下では,
ソフトウェアはそのままコンパイルされるとします. つまり,
FreeBSDのマシンで動かすために, 変更がまったく必要ない
とします.
もしなにか変更が必要な場合には次の節も参照する必要
があります.
Makefile の作成
最小限のMakefile
は次のようなものです:
# New ports collection makefile for: oneko
# Version required: 1.1b
# Date created: 5 December 1994
# Whom: asami
#
# $Id$
#
DISTNAME= oneko-1.1b
CATEGORIES= games
MASTER_SITES= ftp://ftp.cs.columbia.edu/archives/X11R5/contrib/
MAINTAINER= asami@FreeBSD.ORG
MAN1= oneko.1
MANCOMPRESSED= yes
USE_IMAKE= yes
.include <bsd.port.mk>
おわかりになりますでしょうか.
$Id$があ る行の内容については,
気にしないでください. これはこのファイル
がportsツリーに書き込まれるときにCVSによって自動的に書
き込まれます. もっと詳しい例が見たければ, Makefileのお手本
の節をご覧ください.
Package記述ファイルの作成
どのようなportでも, packageにするしないに関わらず, 3つ
の記述ファイルが必要です.
pkgサブディレクトリにある,
COMMENT, DESCR,
それに PLISTです.
COMMENT
これには, そのportについての説明を1行で書きます.
Package の名前, バージョン番号等は
含めないでください. たとえば,
こんな具合です:
A cat chasing a mouse all over the screen.
DESCR
これは, そのソフトウェアについての,
すこし長い説明を記述します. その port
が何をするのかについての数段落程度の
簡潔な解説があれば十分です.
このファイルはマニュアルでもなければ,
使用方法やコンパイル方法についての細かい
説明書でもありません. 特に,
READMEファイル manpage
をコピーしようとしてしている場合には
注意してください. これらは多くの場合,
そのポートの簡潔な説明に なっていなかったり,
扱いにくい形式(manpage の場合,
行を揃えるために空白が調整されます)になっていたりします.
もしこのソフトウエアに公式の WWW のホームページがあれば,
ここに書いて下さい. 自動化ツールが正しく動作するように,
Web サイトのうちの ひとつ には, 前に
WWW: を付け加えてください.
このファイルの最後にあなたの名前を書くことが
推奨されています. たとえば, こんな具合です.
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
PLIST
このファイルには,
このportによってインストールされるファ
イルが列挙されます. このファイルはpackageを作る際のリス
トとして使われるため, `packing list' とも呼ばれます.
ここ に書かれているファイル名は,
インストール時のプレフィックス (普通は
/usr/local か
/usr/X11R6) からの 相対パスです.
MANn
変数を使用する場合(使用することが推奨されています)には,
マニュアルはここに入れないでください.
簡単な例を載せておきましょう:
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
'Packing list'の詳細については, &man.pkg.create.1;
の マニュアルを参照してください.
すべてファイルを列挙しなければなりませんが,
ディレクトリ名は必要ありません. また, ports
がインストール時にディレクトリを作成する場合には,
@dirrm の行を加えて, その port
が削除されるとき,
そのディレクトリも削除されるようにしてください.
このファイルには,
ファイル名をアルファベット順に並べるようにしてください.
port のアップグレートのとき,
楽に確認ができるようになります.
チェックサムファイルの作成
ただ, make makesum
と入力するだけです. bsd.port.mk
にルールがあるので,
自動的にfiles/md5が生成されます.
Portのテスト
そのportが正しく動くことを,
package化を含めて確認してください.
以下の重要なポイントを確認してください.
PLIST にその port
がインストールしないものが含まれていないこと.
PLIST にその port
がインストールする全てのものが含まれていること.
reinstall
ターゲットを使うことによって,
何度でもインストールが可能こと.
deintall の際に 後片付け
をすること.
推奨されるテストの手順
make install
make package
make deinstall
pkg_add `make package-name`
make deinstall
make reinstall
make package
package および
deinstall の段階で,
どんな警告(warning)も出力されないことを確認してください.
ステップ3の後,
新しいディレクトリが全て正しく消去されているかを
確認してください. また,
ステップ4の後にそのソフトウェアを使用してみて, package
からインストールされた場合に正しく動作するかを
確認してください.
portlint でチェック
portlintを使って, あなたの port
が我々のガイドラインそっているかを確認してください.
portlint プログラムは ports
コレクションに含まれています. 特に, Makefile
が正しい形式になっているか, package
の名前が正しいか, をチェックするのに良いでしょう.
Portの送付
まず, やってよいことといけないこと
についての節を読んでください.
さあ, あなたのportに満足したら,
あとはそれをFreeBSDのメイ ンのportsツリーに置いて,
皆に使ってもらうだけです. いまある
work ディレクトリや
pkgname.tgz
パッケージは必要ありませんから, まず消去してください.
あとは, バグレポートの中に shar `find
port_dir` の出力を, &man.send-pr.1;
プログラムを使用して送ってください. &man.send-pr.1;
についての詳細は, バグ報告と一般的な論評
を参照してください.) もし, 圧縮していない状態で,
20KB以上あるようなポートであれば, 圧縮して tar
ファイルにして, バグレポートに入れる前に &man.uuencode.1;
を使用してください. (20KB以下のものでも, tar
ファイルにして送ってもよいですが, あまり歓迎されません).
バクレポートの category は ports, class
は
change-requestを必ず使用してください.
(レポートを confidential (内密)
にしないようにしてください!)
もう一度, オリジナルのソースファイル,
work ディレクトリ, make
package
で作成したパッケージが含まれていないこと
を確認してください.
以前, 新しい port をわれわれの ftp サイト (ftp.freebsd.org)
にアップロードするようにお願いしたことがありますが,
現在このサイトの incoming
ディレクトリは読み出し不可になっており,
いまでは推奨されていません.
沢山の海賊版ソフトウェアがそこに置かれたためです.
私たちは, 何か不明な点があったらあなたに確認したのち,
それをツリーへ置きます. あなたの名前は, FreeBSD
ハンドブックやその他のファイルの “Additional FreeBSD
contributors” のリストにも載るでしょう. う〜ん,
素晴らし い. :)
本格的なport
残念ながら, 移植がそう簡単ではなく,
動かすために多少の変更が 必要な場合も多いでしょう.
この節では, portsコレクション の方法論にのっとって,
そのような場合にどのように変更を施し, 動
くようにしたらよいかを順を追って説明します.
port構築の詳細
まず, あなたがportのディレクトリで
make とタイ
プしてから起こる一連の出来事について,順を追って説明しま
す. ここを読むときには, 他のウィンドウで同時に
bsd.port.mk
も開いておくとよいかもしれません.
しかし,
bsd.port.mkが何をしているのか,
完全に理解 できなくても心配する必要はありません.
そう多くの人が理解して いるわけではないですから... f(^_^;)
まず, fetch
というターゲットが実行されます.
このfetchターゲットは
ローカルディスクのDISTDIRに配布ファ
イルがあるようにするのが役目です. もし,
fetchが必要なファ
イルをDISTDIRに見つけることが
できなけ れば, Makefileに指定されているURL
MASTER_SITES,
そして私たちのFTPサイトで ある
ftp://ftp.freebsd.org/pub/FreeBSD/ports/distfiles/
(ここ には, 私たちが取ってきたファイルを
バックアップとして置いてあ ります) に探しにいきます.
そして, ユーザのサイトがインター ネットに
直接接続されている場合には, FETCH
を使って, その名前のファイルを取っ てきて,
DISTDIRに保存します.
次に実行されるのは
extract ターゲットです.
これは, DISTDIRにある, 配布ファイル
(普通は gzipされたtarファイル) を読み,
ソースを一時的な作業ディレ
クトリWRKDIR (デフォルトは
work) に展開します.
次に, patch
というターゲットが実行されます. まず,
PATCHFILESに定義されている,
すべてのパッ チをあてます.
次にもしPATCHDIR (デフォ ルトは
patches サブディレクトリ)
にパッチが存在す れば,
これらをアルファベット順にあてます.
次に実行されるターゲットは
configureです. これには, い
ろいろな場合があります.
もし存在すれば,
scripts/configure
が実行されます.
もし, HAS_CONFIGURE
あるいは GNU_CONFIGURE
がセットされていれば,
WRKSRC/configure
が実行されます.
もし, USE_IMAKE
がセットされていれば, XMKMF
(デフォルト: xmkmf -a)
が実行されます.
最後に, build
というターゲットが実行されます. これは, その port
の専用の作業ディレクトリ (WRKSRC)
にい き, コンパイルするのが役目です. もし
USE_GMAKE がセットされていれば, GNU
make が使用されます.
さもなければFreeBSDの make
が使用されます.
上記はデフォルトのルールです. さらに,
pre-何とか
や
post-何とか
というターゲット が定義してあった
り,そのような名前のスクリプトが scripts
サブディレクトリに置いてある場合には,
それらはデフォルトの動作の前
後に実行されます.
たとえば, post-extract
というターゲットがMakefile で定義されていて,
pre-build というファイルが,
scripts
サブディレクトリにあるとすると,
post-extractターゲットは,
通常の展開動作のあとに呼 び出され,
pre-build
スクリプトはデフォルトのコンパイ
ルのルールが実行される前に実行されます.
もし動作が簡単であれ ば, Makefile
のターゲットを使用することが推奨されています. な ぜならば,
そのportが何らかのデフォルトではない動作を必要とす
るのかどうかが一箇所にまとめて書いてあった方が他の人に
理解しやす いからです.
デフォルトの動作は bsd.port.mk の
do- 何とか
というターゲットでおこなわれます. たとえば,
portを展開するコマンドは,
do-extract
というターゲットにあります. もし,
デフォルトのターゲットに 不満があれば,
do- something
というターゲッ
トを再定義することによって,
どのようにでも直すことができます.
“メイン”のターゲット (例えば,
extract,
configure等) は,
すべての前段階が実行されていること を確認して,
実際のターゲットやスクリプトを呼び出す以外のこと
はしません.
bsd.port.mkはこれらが変更されることは仮定してい
ませんので, もし, 例えば, 展開の仕方を直したいときには,
do-extract を直し,
絶対にextractには手を
触れないでください.
これで, ユーザが make
と入力したときに何が起こ るのかが理解できたと思います.
では, 完璧なportを手順を追っ て作ってみましょう.
オリジナルのソースの入手
オリジナルのソースを, (普通は)
圧縮されたtarファイルの形 (
foo.tar.gz
あるいは
foo.tar.Z)
で入手して, それを DISTDIR
にコピーします. 可能なかぎり, 広
く使われている主流の
ソースを使用するようにしてください.
もし, ネットワークへの接続のよい FTP/HTTP
サイトを見つけるこ とができなかったり,
頭にくるような非標準的な形式しか持ってい
ないサイトしか見つけられないときには, 自分で管理する確実な
ftp か http サーバ (たとえば,
あなたのホームページ)に置くこと ができます.
MASTER_SITES
に正しく反映されていることを確認してください.
もしも, そのような都合の良く,
安心な置き場所が見つけられない 場合(あなたが FreeBSD の
committer であれば, 自分の
public_html ディレクトリに置けます),
私たちが,
ftp://ftp.FreeBSD.ORG/pub/FreeBSD/ports/distfiles/LOCAL_PORTS/
に置き場所を提供できます.
この場所は, 変数 MASTER_SITE_LOCAL
を使って参照してください.
これについての問い合わせのメールは &a.ports へお願いします.
その port の配布ファイルが特に理由もなく,
しょっちゅう変る場合には,
配布ファイルをあなたのホームページに置いて
MASTER_SITESの最初に入れてください.
こうすることによって, ユーザ利用する場合に
checksum mismatch
エラーが起るのを防ぎ, 我々の ftp
サイトの保守の負担を減らすことができます. もし, master
site がたった一つしかない場合には,
あなたのサイトにバックアップを置いて
MASTER_SITES
の2番目に加えてください.
もし,
あなたのportに必要ないくつかの追加パッチがインター
ネット上で手に入るのならば, それらも取ってきて,
DISTDIR に置きます. もし,
それらがメイン
のソースのtarファイルとは別のサイトにあっても,
心配する必要 はありません.
そのような状況にはちゃんと対応できるようになっ ています.
(以下のPATCHFILESの記述
をご覧ください).
Portの修正
適当なディレクトリにtarファイルを展開して,
FreeBSDの最新の バージョン上で,
正しくコンパイルできるために必要なあらゆる変 更を施します.
最終的に処理は自動化するわけですから, 何をおこなっ
たかを注意深く記録しておきましょう.
あなたのport が完成した暁には, ファイルの削除, 追加,
修正を含むすべての処 理が,
自動化されたスクリプトやパッチファイルで
おこなえるようになっ ていないといけません.
もし, あなたの port
のコンパイルやインストールのために必要
な手作業があまりに多いようならば, Larry Wall の模範的な
Configure
スクリプトでも参考にしたほうがいいかもしれませ ん.
新しいportsコレクションは, 最小のディスクスペースで,
個々のportがエンドユーザにできるだけ“プラグ &
プレ
イ”の状態でmakeできることをめざしています.
あなたが作成し FreeBSD の ports
に寄付されたパッチファイル,
スクリプトおよびその他のファイルは,
明示的に記述されている場合 を除いては,
BSDの標準的な著作権条件によりカバーされていると見な
されます.
パッチをあてる
port
の過程で追加されたり変更されたファイルは再帰的diffで変
更点を取り出すことができます. パッチは適当にまとめて,
patch-xx
という名前のファイルに入れてくだ さい.
xx
はパッチが適用される順番を示します — これらは,
アルファベット順, つまり
aa が 最初, つぎに
ab などとなります. これらのファイル
をPATCHDIRに置いておくと,
自動的に適用さ れるようになっています. すべてのパッチは
WRKSRC (通常は, portのtarファイルが展
開されるところで, makeが実行されるところと同じです)
からの相 対パスになります.
修正やアップグレードを容易にするため, 2つ
以上のパッチが同じファイルを修正するのは避けてください.
(例,
patch-aaとpatch-abが共にWRKSRC/foobar.c
を修正する, など.)
コンフィグレーション
カスタマイズのために追加したいコマンドがあれば,
configure
という名前のスクリプトに入れて
scripts サブディレクトリに置きます.
上で述べたよ うに, pre-configure
あるいは post-configure という
Makefile
のターゲットおよび/あるいはスクリプトで処理す
ることもできます.
ユーザからの入力の扱い
もし, そのportがビルド, コンフィグレーション,
インストー ルの際にユーザからの入力を必要とするならば,
Makefileで
IS_INTERACTIVEをセットしてください.
これによって, 深夜,
自動的にたくさんのportをコンパイルすることが可能にな
ります. 環境変数BATCHがセットされていると
IS_INTERACTIVE
の定義されているportはスキップされ ます (そして,
ユーザがINTERACTIVEという変数をセッ
トすると入力を必要とする port
のみコンパイルされま す).
もし, 適切なデフォルト設定があるのであれば,
PACKAGE_BUILDING
変数をチェックして,それが設 定されて いる場合には,
ユーザ入力のスクリプトを起動しないように してください.
こうすることによって, CD-ROM や ftp に 置く
packageを我々が作成することができます.
Makefileの作成
Makefileの作成は非常に単純です. 繰り返しになりますが,
始める まえに, すでにある例を見てみることをお奨めします.
またこのハ ンドブックにはMakefileのお手本
があります. それを見て, Makefile内の変数の順番や空行を入れると
ころなどの参考にしてください. そうすると他の人々にも読みやすい
ものとなります.
では,
Makefileをデザインするときに問題となるところを順に追っ
て見てみましょう.
オリジナルのソース
ソースはDISTDIRに, 標準的なgzipされた
tarファイルとして置かれていますか? そうであれば, 次のステッ
プに進めます. そうでなければ, 変数
EXTRACT_CMD,
EXTRACT_BEFORE_ARGS,
EXTRACT_AFTER_ARGS,
EXTRACT_SUFX,
DISTFILES
を適当に書き換えないといけません.
どれだけ変更しないといけないかは, あなたのportの
配布ファイルがどの程度標準からかけはなれているかによりま す.
(最もよくある場合は, gzipではなく普通のcompressコマンド
でtarファイルが圧縮されている場合で,
EXTRACT_SUFX=.tar.Z
とするだけです.)
最悪の場合には, 自分で
do-extract ターゲットを作 成して,
デフォルトを上書きすることもできます. しかし, そこま
でする必要があることはめったにないでしょう.
DISTNAME
DISTNAME には port
の名前の基幹部分を入れ ます. デフォルトのルールでは,
配布ファイルのリスト (DISTFILES) は
DISTNAME EXTRACT_SUFX
という名前 になっています. 例えば,
foozolix-1.0.tar.gzの場 合,
通常のtarファイルだと,
DISTNAME=foozolix-1.0 のようになります.
さらにデフォルトのルールでは, tarファイルは
work/DISTNAME
というサブディレクトリ に展開されることを仮定しています,
例えば work/foozolix-1.0/
といった具合いです.
これらの動作はもちろんすべて変更可能です.
デフォルトのルー ルは最も標準的な場合を仮定しているだけです.
まず, port が複 数の配布ファイルを必要とするときには,
単に明示的に DISTFILESを設定してください.
もし, DISTFILES
の一部だけが実際に展開される場合 には,
それらをEXTRACT_ONLY に設定してくだ さい.
この変数が定義されている場合には, 展開時に
DISTFILESに優先して利用されます.
残りのファ イルもDISTDIRに取ってきますが,
展開時に
はなにもせずに後で使うためにそのまま置いておかれます.
PKGNAME
もし, DISTNAME が我々の package
の名前についてのガイドライン
に沿ったものでない場合には, PKGNAME
にもっと良い名前を設定してください.
詳細は上記のガイドラインを参照してください.
CATEGORIES (分類)
完成した package の実体は
/usr/ports/packages/All に置かれます.
また, 1つかそれ以上の
/usr/ports/packages
のサブディレクトリからのシンボリッ クリンクが作られます.
それらのサブディレクトリの名前が
CATEGORIES
という変数によって指定されます. これは,
ユーザがFTPサイトやCD-ROMのpackageの山を渡り歩
くことを容易にするためです. 現在存在する カテゴリを見て, そ
のportに適したもを選んでください.
このリストは, この port が port tree のどこに import
されるかも決定します. 2つ以上のカテゴリを指定した場合には
最初のカテゴリで指定されるサブディレクトリに置かれること
になります. 適切なカテゴリを選ぶ方法については, カテゴリ
の節を参照してください.
もしその port
が本当に現在存在するすべてのものとは異なって いる場合には,
新しいカテゴリ名を作ることもできます. その際には, &a.ports
宛てに新しいカテゴリ名を提案する
メールを送ってください.
カテゴリ名については,
なんのエラーチェックも行なわれません.ミスタイプがあっても
make package はなにも考えずに
新しいディレクトリを作ってしまいますので,
注意してください.
MASTER_SITES
オリジナルの配布ファイルを指し示す FTP または HTTP の
URL のディ レクトリ部分までを
MASTER_SITES に記録しま す. スラッシュ
(/) を最後につけることをお忘れなく.
配布ファイルがシステム上に存在しないときに,
makeマクロは FETCH
でこの変数に指定されたサイトから取っ てきます.
複数の,
できれば異なる大陸のサイトをこのリストに入れておく
ことが推奨されています. これによって, 広域ネットワークにトラ
ブルがあった場合でも成功する可能性が高くなります.
私たちはさら に, 自動的に最も近いマスタサイトを検出して,
そこから取って くるメカニズムの導入を計画しています.
オリジナルのtar ファイルが, X-contrib, GNU, Perl CPAN,
TeX CTAN または Linux Sunsite
などの有名なアーカイブにある場合には,
MASTER_SITE_XCONTRIB,
MASTER_SITE_GNU,
MASTER_SITE_PERL_CPAN,
MASTER_SITE_TEX_CTAN および
MASTER_SITE_SUNSITE を利用することで,
簡単にこれらのサイトを 指定することができます. あとは
MASTER_SITE_SUBDIR にアーカイ
ブ内でのパスを指定するだけです. 以下に例を示します.
MASTER_SITES= ${MASTER_SITE_XCONTRIB}
MASTER_SITE_SUBDIR= applications
ユーザは/etc/make.conf中で
MASTER_SITE_* 変数を設定
することによって, デフォルトの FTP サイトではなく, これらの
有名なアーカイブの
ミラーの中で好みのものを使用することが可能 です.
PATCHFILES
もし,
オリジナルの配布ファイル以外にもFTPかHTTPで手に入る
パッチが必要な場合には, PATCHFILESにファ
イル名を, PATCH_SITESにサイトとディレクト
リの名前を MASTER_SITES
と同様に設定してく ださい.
そのパッチ内のファイル名ががソースツリーの
一番上のディレク トリ (WKRSRC)
からの相対パスになっていな い場合には,
PATCH_DIST_STRIPを指定してく ださい.
例えば, パッチ内のファイル名にすべて余計な
foozolix-1.0/ がついている場合には,
PATCH_DIST_STRIP=-p1としてください.
これらのパッチは圧縮されていても大丈夫です. ファイル名が
.gz か .Z
で終わる場合には自動的に復元
されるようになっています.
もしパッチが, 文書などその他のファイルと一緒に gzip
された tarファイルで配布されている場合には,単純に
PATCHFILES を使うことはできません.
このような場合には, このパッチの tar ファイルの名前と場所を
DISTFILES と
MASTER_SITES に加えます. それから,
pre-patch ターゲットで,
パッチコマンドを走らせるか, パッチファイルを
PATCHDIR ディレクトリに
patch-xx
という名前でコピーするかして,
パッチを適用するようにします.
普通の gzip か compress された tar ファイルであれば,
通常のソースファイルと一緒にその時までに
展開されていますので, 明示的に展開する必要はありません.
もし, 後者の方法を使用する場合には,
すでにそのディレクトリにある なにかを上書きしないように,
注意する必要があります. さらに,
pre-clean
ターゲットにコピーしたパッチファイル
を削除するコマンドを追加するのを忘れないでください.
MAINTAINER
あなたのメールアドレスをここに入れてください.
お願いします. :)
保守担当者(maintainer)の責任についての詳細は, Makefile 中の
MAINTAINER の節をご覧ください.
依存関係
このプログラムが他のportに依存する場合には, 必要なものが
自動的に作られるようにすることができます. そのために, 以下の
5つの変数が用意されています.
よくあるケースのためにあらかじめ設定された依存変数や,
いくつかの依存関係の制御のための変数があります.
LIB_DEPENDS
Port が必要とする非標準の共有ライブラリを
この変数で指定 します. これは
lib:
dir:
target という組のリストで,
うち lib
が共有ライブラリの名前, そして
dir
がそのライブラリが見つからない場合にインストールする port
のあるディレクトリで, target
はそのディレクトリで呼ばれるターゲットです. 例えば,
LIB_DEPENDS= jpeg.9:${PORTSDIR}/graphics/jpeg:install
と指定してあれば,
まずメジャーバージョンが9のjpegライブ
ラリがあるかどうか確認し, ない場合にはportsツリーの中の
graphics/jpeg
というサブディレクトリに移動し, そこ
でコンパイルとインストールを行ないます.
target の 部分は,
DEPENDS_TARGET (デフォルトは
install)
と等しいときには省略できます.
前半の lib 部分は
ldconfig -r | grep -wF
への引数になります.
この変数には正規表現を入れられません.
この依存関係は2度チェックされます. まず
extract ターゲットで, 次に
install でチェックされます.
(これは, その port を作成するマシンとインストールする
マシンが違う場合でも, きちんとそのライブラリが利用できる
ことを確認するためです.) また, 依存するもの名前は package
の中にも含まれますので, ユーザのシステムに存在しなければ,
pkg_add が自動的にインストールします.
RUN_DEPENDS
Port
を使用する際に必要となるファイルまたはプログラムがある
ときにはこの変数で指定します. これは
path:
dir
:target とい う組のリストで,
path
がファイルまたはプログラムの 名前, そして
dir
がそれが見つからない場合に作成する ためのディレクトリ名で
target
はそのディレクトリで呼ばれるターゲットです.
path の最初の文字がスラッ シュ
(/) の場合にはファイルかディレクトリ
とみなし, その存在を test -e
でチェックします; そうでない場合には
実行可能であると仮定し, which -s
を使って そのプログラムがユーザのサーチパス上に
あるかどうか確認します.
例えばMakefileに以下のように書いてあるとします.
RUN_DEPENDS= ${PREFIX}/etc/innd:${PORTSDIR}/news/inn \
wish8.0:${PORTSDIR}/x11-toolkits/tk80
まず, /usr/local/etc/innd
というファイルかディレクトリが存在 するか確認し,
ない場合にはportsツリーの中の
news/inn
というサブディレクトリから作られます. ま た,
wish8.0
というプログラムがユーザのサーチパス中 にあるかどうか探し,
ない場合には同じくportsツリーの
x11-toolkits/tk80
というサブディレクトリから作られます.
この例で, innd
は実際にはプログラムです; この ように,
プログラムであっても標準のサーチパス以外のところに
あるようなものの場合には,
絶対パスで指定してください.
この依存関係はinstall
ステージのはじめでチェック されます. また,
packageを作る際に必要となるportのpackage名 が記録され,
pkg_addを使用すると
ユーザのシステムに存在しない場合には自動的にそちら
のpackageもインストールされるようになります.
target の部分は,
DEPENdS_TARGET
と同じ場合には省略可能です.
BUILD_DEPENDS
Port
のコンパイルに必要なファイルまたはプログラムがある
ときは, この変数で指定してください.
RUN_DEPENDSと同 様に, これは
path:
dir
:target
という組のリストです. 例 えば,
BUILD_DEPENDS= unzip:${PORTSDIR}/archivers/unzip
は
unzip という名前のプログラムを探し,
見つから
ない場合にはarchivers/unzip
サブディレクトリで作 れという意味になります.
ここでは “コンパイル”
と一口にいいましたが, この変数は実際
にはファイルの展開から実際のコンパイル・リンクまで
全部をま とめて面倒を見てくれます. この依存関係は
extract
ステージからチェックされます.
target の部分は
DEPENDS_TARGET
と同じ場合には省略可能です.
FETCH_DEPENDS
この変数は,
portを取ってくるのに必要なファイルまたはプロ
グラムを指定するのに使います. 上の二つと同様に, これは
path:
dir
:target
という組のリストです. 例えば,
FETCH_DEPENDS= ncftp2:${PORTSDIR}/net/ncftp2
としておけば, ncftp2
という名前のプログラムを探 し,
見つからない場合にはnet/ncftp2
サブディレク トリにいってインストールします.
この依存関係は fetch
ステージからチェックされます.
target の部分は
DEPENDS_TARGET
と同じ場合には省略可能です.
DEPENDS
上記の四つのいずれにもあてはまらないような
依存関係がある場 合, または他の port
がインストールされれているだけではなく,
ソースが展開されている必要がある場合にはこの変数
を使います. これは
dir
:target という形式のリスト
になります. 上記の四つと違って特に
“確認”するものがありませんので.
よくある依存関係を表す変数
もし ports が X Window System を必要とするのであれば,
USE_XLIB=yes を定義してください.
(これは USE_IMAKEも意味します) BSD
make の代りに GNU
make を必要とする場合には,
USE_GMAKE=yes を定義. 動作するのに GNU
autoconf を必要とする場合には,
USE_AUTOCONF=yes を定義. 最新の qt
toolkit を使用 する場合には USE_QT=yes
を定義. perl 言語のバージョン5 を必要とする場合には,
USE_PERL5=yes を定義してください.
(特に最後のは重要で, FreeBSD のいくつかの
バージョンでは基本システムに perl5 を含みますが,
他のものは含んでいません.)
依存関係に関する注意
上で述べたように, 依存する ports
が必要になったときに呼ばれるデフォルトのターゲットは
DEPENDS_TARGET で,
そのデフォルトは install です. これは,
ユーザの使用する変数で, port の
Makefile
で定義されるものではありません. もし,
あなたのportが特別な方法で, 依存関係を扱う必要が
ある場合には, DEPENDS_TARGET
を再定義するのではなく, *_DEPENDS
変数の :target
の部分を利用してください.
make clean とタイプしたときには,
依存する port も自動的に clean されます.
もしそうしたくない場合には,
NOCLEANDEPENDS
を環境変数として設定してください.
無条件に他の port に依存させるには, 特別に
nonexistent という文字列を
BUILD_DEPENDS あるいは
RUN_DEPENDS
の最初のフィールドに使用してください. これは, 他の port
のソースが必要なときのみ使用してください. target
も指定することによって,
コンパイルの時間を節約することができます. 例えば,
BUILD_DEPENDS= /nonexistent:${PORTSDIR}/graphics/jpeg:extract
これは, 常に JPEG port の directory
に行きソースの展開を行ないます.
あなたがやりたいことが他の方法ではできない場合以外は,
DEPENDS を使わないでください.
これは常に 他の port
の作成を行い(さらにデフォルトでインストール を行い),
package も作成します. もし本当にこれがあなたの
やりたいことでしたら, 代りにこれを
BUILD_DEPENDS と
RUN_DEPENDS で書くことをお勧めします
— 少なくとも意図が明確になります.
コンパイル時の特別な指定
GNUのmakeを使う場合には,
USE_GMAKE=yes と指定してください. Port に
GNU の configure が含まれ ている場合には,
GNU_CONFIGURE=yes を使います(これは,
HAS_CONFIGURE も意味します).
configure に追加の引数 (デフォルトでは,
GNU の configure では
--prefix=${PREFIX}, GNUでない
configure では空)
を渡したい場合には追加部分を
CONFIGURE_ARGS で指定してください.
そのパッケージが autoconf
を使用する場合には, USE_AUTOCONF=yes
を使います. これは, GNU_CONFIGURE
も意味し, configure の前に
autoconf を実行します.
X Window Systemのアプリケーションなど,
imakeを 使って
Imakefile から
Makefile を作成するportの場合には
USE_IMAKE=yes を指定してください.
コンフィグレー ションステージで自動的にxmkmf
-a が実行されます. も し
フラグが問題をもたらすなら, さらに
XMKMF=xmkmfとしてください.
もし, port が imake
を使用するけれども, install.man
ターゲットがない場合には,
NO_INSTALL_MANPAGES=yes
を指定してください. ついでに, その port
のオリジナルの作者を探し出して八つ裂きにすると
いいでしょう.:>
Portの Makefile が
all 以外のものをメインのター
ゲットとしている場合には, ALL_TARGET でそ
れを指定してください. install と
INSTALL_TARGET も同様です.
もし, port の元の Makefile が
all
以外のターゲットをメインのターゲットとしている場合には,
ALL_TARGET
をそれに合わせて設定してください.
install と
INSTALL_TARGET についても同様です.
NO_INSTALL_MANPAGES
あなたの port がimakeは使うものの
install.man
ターゲットを持っていない場合,
NO_INSTALL_MANPAGES=yes
を指定してください. つい でに,
作者を探し出して八つ裂きにするといいでしょ う. (-_-#)
特別な配慮
Portを作成する場合,
考慮しなくてはいけないことがさらにいくつかあります.
この節では,
それらのうちもっともありがちなものについて説明します.
ldconfig
共有ライブラリをインストールするときには,
共有ライブラリのキャッシュを更新するために port の
Makefile の
post-installtarget
から${LDCONFIG} -m
を走らせてください.
このコマンドの引数は共有ライブラリのインストールしてある
ディレクトリ (通常
PREFIX/lib)
です.
また, pkg/PLIST に @exec
/sbin/ldconfig -m と @unexec
/sbin/ldconfig -R の組を入れて, package
をインストールした場合にも共有ライブラリがすぐ使え,
削除の際にも, システムがまだライブラリが存在すると
誤認しないようにしてください.
この行は共有ライブラリを指定する行のすぐ後に
書くのがよいでしょう:
lib/libtvl80.so.1
@exec /sbin/ldconfig -m %D/lib
@unexec /sbin/ldconfig -R
絶対に引数なしでただ
ldconfig とだけ書いてある行を
Makefile や
pkg/PLIST ファイルに入れないでください.
このコマンドを実行すると, 共有ライブラリのキャッシュが
/usr/lib の内容のみとなり,
ユーザのマシンにさまざまな問題をもたらします (「ぎゃぁ!
このportをインストールしたら xinit
が使えなくなっちゃった!」). この掟を破った者は,
永久に地獄の底で苦しみ続けるように,
閻魔様に頼んでおきます.
ELF 対応
FreeBSD は 3.0-RELEASE で ELF に移行しましたので,
シェアードライブラリを作成するたくさんの port を ELF 対応
にする必要があります. 3.0 システムは ELF としても a.out
としてmも 動作しますし, 我々は非公式ではありますが,
できるだけ長い間 2.2
システムのサポートをしたいと思っていますので, 複雑な状況です.
以下は a.out のみに対応している port をどのように a.out と ELF
両方に対応させるかのガイドライ ンです.
このリストの一部は,
移行時にしかあてはまらないものもありますが, 古い port
をアップグレードしたい場合に参考になるように,
しばらくのあいだは残しておきます.
a.out ライブラリの退避
a.out ライブラリは, /usr/local/lib
から, aout サブディレクトリ
に移動しなくはなりません. (もし移動しないと, ELF ports
がそれらをあっさり上書きして しまいます.) 3.0-CURRENT の
src/Makefile にある
move-aout-libs ターゲット
(aout-to-elf から呼ばれます)
がその移動をしてくれます. a.out
ライブラリを移動するだけなので, ELF と a.out
の両方のライブラリが標準的な ディレクトリにあるシステムでは,
このターゲットを実行しても安全です.
フォーマット
port ツリーは package
をそのマシンのフォーマットで作成します. つまり, 2.2 では
a.out, また 3.0 では `objformat`
の結果によって, a.out か ELF になります. また, いったん
a.out ライブラリをサブディレクトリに移動すると a.out
ライブラリの作成はサポートされません. (つまり,
あなたがにをすれば良いのかを理解しているのならば,
うまく作成できるかもしれませんが,
自力でやらなければならないということです)
もし port が aout でしか動作しないのなら,
BROKEN_ELF
に原因を説明する文字列を設定してください.
この変数が設定された port は, ELF
システム上でのビルドの際スキップされます.
PORTOBJFORMAT
bsd.port.mk において
PORTOBJFORMAT は aout
か elf に設定され, 環境変数
CONFIGURE_ENV, SCRIPTS_ENV,
MAKE_ENV の中で export されます. (2.2-STABLE
では常に aout になります). また,
PORTOBJFORMAT=${PORTOBJFORMAT} として
PLIST_SUB に渡されます. (以下にある
ldconfig
に関するコメントを参照して下さい.)
この変数は, 以下のようにして
bsd.port.mk 中で設定されます.
PORTOBJFORMAT!= test -x /usr/bin/objformat && /usr/bin/objformat || echo aout
この変数を使って, port の make
の過程で何をすべきかを決定すべきですが, もし port の
configure スクリプトが元々, ELF
システムを自動的に検出するのであれば,
PORTOBJFORMAT
を参照する必要はありません.
共有ライブラリの作成
以下は, a.out と ELF
での共有ライブラリの扱いの違いです.
共有ライブラリのバージョン
ELF の共有ライブラリは,
libfoo.so.M
という名前になっていなければなりません. ここで
M は単一の
バージョン番号を表します. 一方 a.out のライブラリは
libfoo.so.M.
N という名前で,
M はメジャーバージョン番号,
N
はマイナーバージョン番号になっている必要があります.
これらを混同しないでください.
libfoo.so.N.
M という名のELF
共有ライブラリや
libfoo.so.N
という名の a.out 共有ライブラリ
(あるいはシンボリックリンク) は
絶対にinstallしないでください.
リンカコマンドライン
直接 ld を使用せずに, cc
-shared を使用してください.
たった一つの違いは, ELF には,
コマンドラインにを加える必要があることです.
ELF のリンカを満足させるためには,
libfoo.so から
libfoo.so.N
へのシンボリックリンクを作る必要があります. これは,
PLIST にも加えなくては いけませんし,
a.out の場合でも害にはならないので (一部の port
ではダイナミックリンクローディングのために
必要でもあります), PORTOBJFORMAT
の設定を気にせずに,
ただ単純にリンクを作成してください.
LIB_DEPENDS
すべての port の Makefile を編集して,
LIB_DEPENDS
からマイナー番号を除去する必要があり,
正規表現のサポートも除去する必要があります. (例えば,
foo\\.1\\.\\(33|40\\) から
foo.2) マッチングは grep
-wF を使って行われます.
PLIST
PLIST は, a.out
のマイナー番号が0であれば, 短い (ELFの)
共有ライブラリの名前を含み, さもなくば長い (a.outの)
名前を含んでいる必要があります.
bsd.port.mk は 自動的に,
PORTOBJFORMAT が aout
であれば, .0 を
短い共有ライブラリの名前の行に付け加え,
PORTOBJFORMAT が elf
であれば, マイナー番号を
長い共有ライブラリの名前から削除します.
ELF システムで 2
つのバージョン番号を持つ共有ライブラリを インストールしたり,
aout システムで 1
つのバージョン番号しか持たない共有ライブラリを
インストールするのが避けられない場合
(例えば他のオペレーティングシステム用の
互換ライブラリをインストールする port など),
NO_FILTER_SHLIBS 変数を定義すれば,
前節で説明されている PLIST
編集の機能が停止されます.
ldconfig
Makefile 中の ldconfig
の行は以下のようになります.
${SETENV} OBJFORMAT=${PORTOBJFORMAT} ${LDCONFIG} -m ....
また PLIST 中では:
@exec /usr/bin/env OBJFORMAT=%%PORTOBJFORMAT%% /sbin/ldconfig -m ...
@unexec /usr/bin/env OBJFORMAT=%%PORTOBJFORMAT%% /sbin/ldconfig -R
となります. これは,
システムのデフォルトフォーマットではなく
パッケージのフォーマットに応じて, 正しい
ldconfig
が呼ばれることを保証するためのものです.
MASTERDIR
もし, あなたの port が 変数(例えば
解像度とか紙のサイズなど)を変えたりした,
ちょっと違うバージョンを作成する必要があるときには,
ユーザが分りやすいように, package
ごとに別々のサブディレクトリを作成し, ただし, できるだけ port
間でファイルを共有するようにしてください. 典型的な例では,
うまく変数を使えば,
とても短いMakefileだけ,
1つ以外のすべてのディレクトリに置くだけで済みます. その短い
Makefile には
MASTERDIR を使って,
残りのファイルがあるディレクトリを指定できます. また PKGNAME
の一部に変数に使って, package
が別々の名前を持つようにしてください.
以下が, とても良い例になるでしょう. これは
japanese/xdvi300/Makefile
の一部です:
PKGNAME= ja-xdvi${RESOLUTION}-17
:
# default
RESOLUTION?= 300
.if ${RESOLUTION} != 118 && ${RESOLUTION} != 240 && \
${RESOLUTION} != 300 && ${RESOLUTION} != 400
@${ECHO} "Error: invalid value for RESOLUTION: \"${RESOLUTION}\""
@${ECHO} "Possible values are: 118, 240, 300 (default) and 400."
@${FALSE}
.endif
japanese/xdvi300 は通常のパッチ,
package ファイルももっています. そこで,
make と入力すると,
デフォルトの解像度(300)を使って, 普通に port
の作成を行います.
他の解像度に関してですが, これが,
xdvi118/Makefile の(コメントを除いた)
すべてです.
RESOLUTION= 118
MASTERDIR= ${.CURDIR}/../xdvi300
.include ${MASTERDIR}/Makefile
(xdvi240/Makefile と
xdvi400/Makefile も同様です).
MASTERDIR が
bsd.port.mk に
PATCHDIR や PKGDIR
などの通常のサブディレクトリが xdvi300
にあることを教えます. RESOLUTION=118
の行が, xdvi300/Makefile の
RESOLUTION=300 の行を無効にし, port
は解像度を118として作成されます.
共有ライブラリのバージョン
まず,
共有ライブラリのバージョンについての指針 を読んで,
共有ライブラリのバージョンを
一般的にどうすれば良いかを理解してください. 盲目的に,
ソフトウエアの作者がちゃんと理解していると
信じててはいけません, 多くの場合違います.
細い点まで考慮することは大変重要なことです,
なぜなら我々は互換性がないかもしれない大量の
ソフトウェアを共存させようとする, 特殊な状況にあるからです.
不注意な port の導入が共有ライブラリに関して,
多大な問題を引き起したことが過去にあります (今まで,
jpeg-6b がなぜ 9.0
といバージョン番号を持っているか不思議に
思ったことはありませんか?). もし, 疑問があれば, &a.ports;
にメールを送ってください. ほとんどの時間は,
正しいシェアードライブラリのバージョンを決めることと,
それを実現するためのパッチを作成することに終始します.
しかしながら, が同じソフトウェアの違ったバージョンの
ソフトウェアが既にツリーにあるばあいには,
状況は非常に複雑です.
つまり, FreeBSD では,
ユーザがリンカにどのバージョンの共有ライブラリを
使用するかを指定できないからです
(リンカは常にもっとも高いバージョンを選びます). これは, もし,
libfoo.so.3.2 と
libfoo.so.4.0
がシステムに存在するときには,
リンカに特別なアプリケーションだけ
libfoo.so.3.2
をリンクするように指示する方法がないことを意味します. これは,
コンパイル時のリンクという意味では完全に見劣りします.
この場合の唯一の解決方法は, 共有ファイルの名前の
ベース 部分を変えることです. 例えば,
libfoo.so.4.0 を
libfoo4.so.1.0 へ変えることによって,
バージョン 3.2 とバージョン 4.0 共に他の port
からリンクされることができるようになります.
マニュアル
MAN[1-9LN] 変数を使用すると,
自動的にすべてのマニュアルを pkg/PLIST
に加えます (つまり, マニュアルを PLIST
に加えては いけません — PLIST の生成
を参照してください). またマニュアルを
/etc/make.conf 中の
NOMANCOMPRESS の設定に応じて,
install時に自動的に圧縮したり伸長したりします.
マニュアルをインストール時に圧縮するかどうかを
指定するには, MANCOMPRESSED
変数を使用します. この変数は, 3つの値をとることができます,
yes, no そして
maybe です. yes
はマニュアルが既に圧縮されて インストールされている,
no はされていない, maybe
はそのソフトウェアがすでに, NOMANCOMPRESS
に合わせており bsd.port.mk
が特別なにもする必要がないことを意味します.
USE_IMAKE がセットされていて,
NO_INSTALL_MANPAGES
がセットされていなければ, MANCOMPRESSED
は自動的に yes に設定され,
それ以外の場合には, no になります.
デフォルトがあなたの port
に合わない場合以外は明示的に設定する必要がありません.
PREFIX 以外のディレクトリの下に
マニュアルを置くような port では MANPREFIX
を指定することができます. さらに,
特定のセクションのマニュアルだけ,
標準ではない場所にインストールする場合, 例えばいくつかの Perl
のモジュールの ports など, には個々のマニュアルのパスを
MANsectPREFIX
(sect は, 1-9,
または, L か N
を表わします) によって指定できます. ができます.
マニュアルが, 言語特有のサブディレクトリに
置かれる場合には, 言語名を MANLANG
に設定してください. この変数のデフォルト値は,
"" になっています (つまり, 英語のみ).
これは, 全部をまとめた例です.
MAN1= foo.1
MAN3= bar.3
MAN4= baz.4
MANLANG= "" ja
MAN3PREFIX= ${PREFIX}/share/foobar
MANCOMPRESSED= yes
以下の6個のファイルがこの port でインストールされます.
${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
-
+
Motifを必要とするport
最近はコンパイルに Motif
を必要とするアプリケーションが増えて きました.
(Motif自体は有料のものがいくつかの会社から手に入りま すし,
多くのアプリケーションがコンパイル可能な無料の互換ライブラリ
が x11-toolkits/lesstifにあります)
Motifはかなり広く使われていますし, 製品のライ
センスではライブラリを静的にリンクした
実行形式は再配布が認めら れている場合が多いので,
Motifを必要とするソフトウェアを簡単に 動的(port
からコンパイルする人々のために)/静的(package を配布
する人々のために)にリンクできるような
しくみが用意されています.
REQUIRES_MOTIF
Motif
がないとコンパイルできないportのMakefileではこの変
数を指定してください. これによって,
Motifを持っていない人が
このportをコンパイルしようとするのを未然に防ぎます.
MOTIFLIB
この変数は bsd.port.mk によって
Motif ライブラリの指 定に置き換えられます.
ソース内のMakefileやImakefileで Motif
ライブラリを指定しているところをこの変数に置き換えるよ
うにパッチをあててください.
代表的な例としては以下の二つがあげられます:
MakefileかImakefileの中でMotifライブラリが
として使われている場合には,
かわりに MOTIFLIB
と書いてください.
Imakefileの中で XmClientLibs
が使われている 場合には, それを
${MOTIFLIB} ${XTOOLLIB}
${XLIB} と書きかえてください.
MOTIFLIB は通常
-L/usr/X11R6/lib -lXm か
/usr/X11R6/lib/libXm.a に置き換えら
れます. したがって前に や
をつけ る必要はありません.
X11 のフォント
もし, あなたの port が X window system
のフォントをインストールするのであれば, それらを
X11BASE/lib/X11/fonts/local
に置くようにしてください. このディレクトリは XFree86 release
3.3.3 で新設されたものです. もし,
それが存在しなければ作成し, ユーザに XFree86 を 3.3.3
かそれより新しいものに更新か, すくなくとも,
このディレクトリを /etc/XF86Config の
font path
に加えるように促すメッセージを出力するようにしてください.
Info ファイル
新しい版の texinfo(2.2.2-RELEASE
およびそれ以降に入っています) には,
install-info というコマンドが含まれており,
dir ファイルに項目を追加したり,
削除したりすることがで きます. もし, あなたの port が info
ドキュメントをインストー ルするのであれば, 以下の指示に従って,
その port および package が正しく, ユーザの
${PREFIX}/info/dir ファイル
を更新するようにしてください. (この節は,
とても長くてすいません, しかし info
ファイルを作りあげるためには, これらは不可欠 です.
正しく行なえば, 美しい
リストができますので, 辛抱してください! :)
まず, これを知っておかなければなりません:
&prompt.user; install-info --help
install-info [OPTION]... [INFO-FILE [DIR-FILE]]
Install INFO-FILE in the Info directory file DIR-FILE.
(訳注: Info ディレクトリの INO-FILE を DIR-FILE にインストールする)
Options:
--delete Delete existing entries in INFO-FILE;
don't insert any new entries.
(訳注: INFO-FILE の中の項目を削除,
新しい項目は一切追加しない.)
:
--entry=TEXT Insert TEXT as an Info directory entry.
(訳注: TEXT を Info ディレクトリの項目として追加する.)
:
--section=SEC Put this file's entries in section SEC of the directory.
(訳注: このファイルの項目を Info ディレクトリの SEC
という節に置く.)
:
このプログラムは, 実際には info
ファイルをインストール しません, 単に
dir
ファイルにエントリーを挿入したり削除し
たりするだけです.
これから, install-info
を使用するように, ports を変換す る7段階の工程を示します.
例として editors/emacsを
使用します.
まず, texinfo のソースを見て,
@dircategory と
@direntry 文がないファイルについて,
それらを追加するパッチを作成します. 以下は,
ここでの例での patchの一部です:
--- ./man/vip.texi.org Fri Jun 16 15:31:11 1995
+++ ./man/vip.texi Tue May 20 01:28:33 1997
@@ -2,6 +2,10 @@
@setfilename ../info/vip
@settitle VIP
+@dircategory The Emacs editor and associated tools
+@direntry
+* VIP: (vip). A VI-emulation for Emacs.
+@end direntry
@iftex
@finalout
:
フォーマットについては見ればわかると思います.
dir
というファイルに必要な項目を書いておいてくれる作者
も多いので, まず自分で書く前にさがしてみてください. また,
関係 する ports も調べて, 節(section)の名前や,
インデントなどが
きちんと合っているかどうかを確認してください
(項目のテキスト は, すべて4つめのタブ・ストップ(tab
stop)から始めることを推 奨します).
1つのファイルに対して1つの info
の項目しか書けないことに注 意してください, これは,
install-info --delete が, そのバグにより,
@direntry セクションに複数の項目を書
いても,
初めの1つの項目しか削除してくれないからです.
texinfo のソースにパッチをあてるかわりに,
dir の項目 を
install-info の
引数((,
) として与えることもできます.
これはあまり良い方法とは 思えません, なぜなら,
同じ情報を3ヶ所(Makefile,
PLIST の
@exec/@unexec:
以下参照) に重複して, 書く必要があるからです.
しかしながら, もし日本語(あるいは, 他のマルチバイト文字)の
info ファイルがあるのならば,
install-info
の特別な引数を使用する必要があるでしょう, なぜならば,
makeinfo がこのような texinfo
ソースファイル を扱えないからです.
(このようなものをどう扱うかの例としては,
japanese/skk の
Makefile と
PLIST を見て ください.)
portのディレクトリに戻って, make clean;
make をして, info ファイルが texinfo
ソースファイルから再び生成さ れることを確認してください.
texinfo ソースファイルのほうが info
ファイルよりも新しいので, make
とタイプすれば, info ファイルは再構築されるはずですが,
多くの Makefile には info
ファイルの正しい依存関係が書かれていません.
emacs の場合, info
ファイルの再構築ため, man
サブディレクトリ に降りていくようにするために, メインの
Makefile.in にパッ
チをあてる必要がありました.
--- ./Makefile.in.org Mon Aug 19 21:12:19 1996
+++ ./Makefile.in Tue Apr 15 00:15:28 1997
@@ -184,7 +184,7 @@
# Subdirectories to make recursively. `lisp' is not included
# because the compiled lisp files are part of the distribution
# and you cannot remake them without installing Emacs first.
-SUBDIR = lib-src src
+SUBDIR = lib-src src man
# The makefiles of the directories in $SUBDIR.
SUBDIR_MAKEFILES = lib-src/Makefile man/Makefile src/Makefile oldXMenu/Makefile lwlib/Makefile
--- ./man/Makefile.in.org Thu Jun 27 15:27:19 1996
+++ ./man/Makefile.in Tue Apr 15 00:29:52 1997
@@ -66,6 +66,7 @@
${srcdir}/gnu1.texi \
${srcdir}/glossary.texi
+all: info
info: $(INFO_TARGETS)
dvi: $(DVI_TARGETS)
man
サブディレクトリでのデフォルトターゲットは,
info で呼ばれるのに対して,
メインの Makefile では,
all で呼びたいので,
2つめのpatchが必要でした. また, info
info ファイルのインストールも削除しました, なぜなら,
同じものが同じ名前で既に
/usr/share/info にあるからです.
(このパッチはここにはありません.)
もし, Makefile に
dir ファイルをインストールす
る個所があれば, 削除します. あなたの port がインストー
ルしてはいけません. また, dir
ファイルを壊してしまうよう
なコマンドの類も削除します.
--- ./Makefile.in.org Mon Aug 19 21:12:19 1996
+++ ./Makefile.in Mon Apr 14 23:38:07 1997
@@ -368,14 +368,8 @@
if [ `(cd ${srcdir}/info && /bin/pwd)` != `(cd ${infodir} && /bin/pwd)` ]; \
then \
(cd ${infodir}; \
- if [ -f dir ]; then \
- if [ ! -f dir.old ]; then mv -f dir dir.old; \
- else mv -f dir dir.bak; fi; \
- fi; \
cd ${srcdir}/info ; \
- (cd $${thisdir}; ${INSTALL_DATA} ${srcdir}/info/dir ${infodir}/dir); \
- (cd $${thisdir}; chmod a+r ${infodir}/dir); \
for f in ccmode* cl* dired-x* ediff* emacs* forms* gnus* info* message* mh-e* sc* vip*; do \
(cd $${thisdir}; \
${INSTALL_DATA} ${srcdir}/info/$$f ${infodir}/$$f; \
chmod a+r ${infodir}/$$f); \
(これは, 既存のportを修正するときのみ必要です.)
pkg/PLIST を見て,
info/dir にパッチをあて
ようとするものすべてを削除します. これらは,
pkg/INSTALL
やその他のファイルにもあるかもしれない ので,
いろいろさがしてみてください.
Index: pkg/PLIST
===================================================================
RCS file: /usr/cvs/ports/editors/emacs/pkg/PLIST,v
retrieving revision 1.15
diff -u -r1.15 PLIST
--- PLIST 1997/03/04 08:04:00 1.15
+++ PLIST 1997/04/15 06:32:12
@@ -15,9 +15,6 @@
man/man1/emacs.1.gz
man/man1/etags.1.gz
man/man1/ctags.1.gz
-@unexec cp %D/info/dir %D/info/dir.bak
-info/dir
-@unexec cp %D/info/dir.bak %D/info/dir
info/cl
info/cl-1
info/cl-2
post-install ターゲットを
Makefile に加えて,
dir
ファイルが存在しなければ作成するようにします. また,
インストールされた info ファイルについては,
install-info
を実行するようします.
Index: Makefile
===================================================================
RCS file: /usr/cvs/ports/editors/emacs/Makefile,v
retrieving revision 1.26
diff -u -r1.26 Makefile
--- Makefile 1996/11/19 13:14:40 1.26
+++ Makefile 1997/05/20 10:25:09 1.28
@@ -20,5 +20,11 @@
post-install:
.for file in emacs-19.34 emacsclient etags ctags b2m
strip ${PREFIX}/bin/${file}
.endfor
+ if [ ! -f ${PREFIX}/info/dir ]; then \
+ ${SED} -ne '1,/Menu:/p' /usr/share/info/dir > ${PREFIX}/info/dir; \
+ fi
+.for info in emacs vip viper forms gnus mh-e cl sc dired-x ediff ccmode
+ install-info ${PREFIX}/info/${info} ${PREFIX}/info/dir
+.endfor
.include <bsd.port.mk>
新しい info ファイルを作成するのに,
/usr/share/info/dir と上のコマンド,
以外は使用しな いでください. 実際のところ, もし port
する人がこれに関して PLIST
に自らまったく手を加える必要がないのであれば, 上
のパッチのはじめの3行を bsd.port.mk
に加えたでしょう.
PLIST を編集して, 同じ働きをする
@exec 文, そ
れにpkg_delete のために
@unexec 文を加えてくださ い.
@unexec を使用して
info/dir を削除する必
要はありません.
Index: pkg/PLIST
===================================================================
RCS file: /usr/cvs/ports/editors/emacs/pkg/PLIST,v
retrieving revision 1.15
diff -u -r1.15 PLIST
--- PLIST 1997/03/04 08:04:00 1.15
+++ PLIST 1997/05/20 10:25:12 1.17
@@ -16,7 +14,15 @@
man/man1/etags.1.gz
man/man1/ctags.1.gz
+@unexec install-info --delete %D/info/emacs %D/info/dir
:
+@unexec install-info --delete %D/info/ccmode %D/info/dir
info/cl
info/cl-1
@@ -87,6 +94,18 @@
info/viper-3
info/viper-4
+@exec [ -f %D/info/dir ] || sed -ne '1,/Menu:/p' /usr/share/info/dir > %D/info/dir
+@exec install-info %D/info/emacs %D/info/dir
:
+@exec install-info %D/info/ccmode %D/info/dir
libexec/emacs/19.34/i386--freebsd/cvtmail
libexec/emacs/19.34/i386--freebsd/digest-doc
@unexec install-info --delete
コマンドは, info ファイル自身より先に置き,
コマンドがファイルを読めるようにし
ておかなければならないことに注意してください. また,
@exec install-info コマンドは info
ファイルおよび dir ファイルを作る
@exec コマンドより後に
おかなければなりません.
テスト
をして出来栄えに感服しましょう :) 各段階の前後に,
dir
ファイルをチェックしましょう.
pkg/ サブディレクトリ
まだ触れていない, いくつかのこつが
pkg/ サブディレクトリにはあり,
時として便利でしょう.
MESSAGE
もし, インストールする人にメッセージを表示する
必要がある場合には, そのメッセージを
pkg/MESSAGE に置けます. この機能は,
pkg_add
の後の追加のインストール手続きを表示するときなどに,
重宝します.
pkg/MESSAGE ファイルは
pkg/PLIST に加える必要はありません.
また, もしユーザが package ではなく port を使用して
いる場合には自動的には表示されませんので, 明示的に
post-install
で表示するようにするべきでしょう.
INSTALL
バイナリパッケージが pkg_add
でインストールされるときに, 実行される必要がある
コマンドがあれば, pkg/INSTALL
スクリプトを使って実行することができます.
このスクリプトは自動的に package に加えられ,
pkg_add によって2度実行されます. はじめは
INSTALL ${PKGNAME} PRE-INSTALL
と実行され, 2度目には, INSTALL ${PKGNAME}
POST-INSTALL と実行されます.
どちらのモードで実行されているかは,
$2 を調べることによってわかります.
環境変数 PKG_PREFIX には package
がインストールされるディレクトリが設定されます. 詳細は
&man.pkg.add.1; を見てください.
port を make install で
インストールするときには,
このスクリプトは自動的に実行されません. もし,
実行される必要があるならば, port の Makefile
から明示的に呼ぶ必要があります.
REQ
port が(インストールされるシステムの状態によって)
インストールされるべきか, されないべきか区別する必要が
あるときには, “要件(requirements)” スクリプト
pkg/REQ を作ることができます. これは,
インストール及びデインストール (package
の削除)の時に自動的に実行され,
それらが処理されるべきかを決定します.
make の変数にあわせた PLIST
の変更
いくつかの port, 特に p5- portsなど, は configure
のオプション (あるいは, p5- ports の場合は perl
のバージョン)によって, PLIST
を変える必要があります. これを容易に実現するために,
PLIST 中の
%%OSREL%%,
%%PERL_VER%%,
%%PERL_VERSION%% は,
適切に置き換えられるようになっています.
%%OSREL%% の値は,
オペレーティングシステムの数字で表されたリビジョンです
(例えば, 2.2.7).
%%PERL_VERSION%% は perl
のバージョン番号全体(例えば, 5.00502 )で,
%%PERL_VER%% はバージョン番号から,
パッチレベルを引いてものです(例えば,
5.005).
他の置き換えが必要であれば, PLIST_SUB
変数に
VAR=VALUE
という形式のペアのリストを設定することによって,
PLIST 中の
%%VAR%% は
VALUE に置き換えられます. 例えば,
バージョンに固有の沢山のファイルを インストールする場合には,
Makefile に
OCTAVE_VERSION= 2.0.13
PLIST_SUB= OCTAVE_VERSION=${OCTAVE_VERSION}
と書いて, PLIST
中のバージョン番号が表われるすべてのところに,
%%OCTAVE_VERSION%% と書きます.
このようにしておけば, port をアップグレードするときに,
何十行(ときとして, 何百行)も PLIST
を書き替えないですみます.
この書き換えは (
マニュアル の追加も)
do-install と
post-install ターゲット のあいだに,
PLIST を読み TMPPLIST
(デフォルトは,
WRKDIR/.PLIST.mktmp )
に書き込むことによって行なわれます. もし, あなたの port が
PLIST を実行時に生成するのであれば,
do-install のあいだか,
その前に行うようにしてください. また,
書きかえられたあとのファイルを編集する必要がある場合には,
post-install で,
TMPPLIST を書きかえてください.
pkg
サブディレクトリにあるファイル名の変更
pkg
サブディレクトリにあるファイルは全て, 変数を
使用して定義されていますので, 必要であれば
Makefile 中で 変更可能です. いくつかの
ports で 一つの pkg
サブディレクトリを共有する場合や, 上記のファイルに書き込む
必要があるときなど, 特に便利です. (pkg
サブディレクトリに直接書き込むのが良くない理由に ついては
WRKDIR
以外への書きこみ を参照してください.)
以下が変数名とそのデフォルト値の表です.
Variable
Default value
COMMENT
${PKGDIR}/DESCR
DESCR
${PKGDIR}/DESCR
PLIST
${PKGDIR}/PLIST
PKGINSTALL
${PKGDIR}/PKGINSTALL
PKGDEINSTALL
${PKGDIR}/PKGDEINSTALL
PKGREQ
${PKGDIR}/REQ
PKGMESSAGE
${PKGDIR}/MESSAGE
PKG_ARGSを上書きせずに,
これらの変数を変更 するようにしてください.
PKG_ARGSを変更すると これらのファイルは
port から正しく /var/db/pkg
にインストールされなくなります.
ライセンス上の問題
ソフトウェアによっては制限の厳しい
ライセンスがついてきたり, 法律的に問題があるかもしれません.
(PKPの公開鍵暗号化, ITAR (暗 号化ソフトウェアの輸出)
などが例としてあげられます). それらを
どう扱えばいいかはライセンスの文面によって
さまざまな場合があり ます.
ソフトウェア移植者として,
あなたにはライセンスをよく読み, FreeBSD プロジェクトが FTP
または CD-ROM で配布してはいけないソフ
トウェアを配布してしまうことのないよう,
注意する義務があります. なにか疑問がある場合には,
&a.ports;に聞いてみてください.
よく見られるケースに対処するために,
二つの変数が用意されてい ます:
ソフトウェアに “有償再配布を禁ずる”
という趣旨のライセン スがついてきた場合には
NO_CDROM
という変数にその理由を記述して ください.
私たちはこれがついているportはCD-ROMリリースに入
れないようにしますが,
オリジナルのソースファイルとpackage
はFTPでは取れるようにしておきます.
もしも, 生成される package
が個々のサイトで独自に構築さ れる必要があったり,
ライセンスによって生成されるバイナリが
配布できない場合には, NO_PACKAGE
変数にその理由を記述してくだ さい. そのような package が
FTP サイトに置かれたり, リリース 時の CD-ROM
へ入らないようにします. ただし, いずれの場合も distfile
は(FTP や CD-ROM に)含まれるようになります.
Portが, 使用者によっては法律上の問題が生じる時
(暗号化ソフ トウェアなど),
または“商用利用を禁ずる”とライセンスに書い
てある場合には
RESTRICTEDという変数にその理由を入れ
てください. この場合には,
ソースファイルやpackageは私たちの
FTPサイトにも置かれません.
GNU一般公有使用許諾書 (GPL) はバージョン1, 2とも
port作成上は何ら問題にはなりません.
もしあなたが,ソースツリー管理者 (committer)
であれば, ソースツリーにこのようなportを入れる際に,
ports/LEGAL
ファイルを書き換えるのを忘れないようにし
てください.
アップグレード
Port
のバージョンが原作者からのものに比べて古いことに気がつ
いたら, まずはあなたの持っているportが私たちの最新のもの
(ミラー サイトの ports/ports-current
というディレクトリにあります)
であることを確認してください.
次に, portの Makefile
にMAINTAINER (保守担当者) の
アドレスが書いてある場合には,
その人にメールを出してみましょう.
保守担当者の人がすでにアップグレードの準備を
しているかもしれま せんし,
(新しいバージョンの安定度に問題があるなど) あえてアッ
プグレードをしない理由があるのかもしれません.
保守担当者にアップグレードをしてくれと頼まれた場合,
あるいは
そもそもportのMakefileに保守担当者が書いてない場合などは, あ
なたがアップグレードをしてくださると助かります.
その場合にはアッ プグレードをしたのち,
変更前と変更後のディレクトリの再帰的diff (unified diff と
context diff のどちらでもいいのですが, port のコミッター達は
unified diff のほうを好むようです) をとって送ってください.
(例えば, 変更前のディレクトリが
superedit.bak という名前でとってあり,
変更後のもの が superedit
に入っているなら, diff -ruN superedit.bak
superedit の結果を送ってください. ) diff
の出力を見て, すべての変更が正しくなされているか確認して
ください. 変更箇所については, &man.send-pr.1; (カテゴリーは,
ports)に diff の出力結果を添えて,
私たちに送ってもらうのが一 番よいです. commit する際に CVS
に明確に記述しなければならない ので,
付け加えたり削除したりしたファイルがあったら, それについ
て書いておいてください. もし diff の大きさが 20 KB 程度を
超えるようであれば, 圧縮したものを uuencode して下さい.
そうでなければそのまま PR に入れるだけでいいです.
繰り返しになりますが, ports の変更を送るときには,
&man.shar.1; ではなく &man.diff.1;
を使用してください.
やっていいことといけないこと
この節では,
ソフトウェアをportする上でよくある落し穴などにつ
いて説明します. このリストを使って, あなた自身が作成した port
のチェックはもとより, PR データベースにある, 他の人が作成した
port のチェックもできます. あなたがチェックした port について
のコメントを バグ報告と一般的な論評
にしたがって, 送ってください. PR データベースにある port を
チェックすることによって, 私達がそれらを commit
するのを早くし,
あなたが何をしているか理解していることも示します.
バイナリのstrip
バイナリは strip してください.
オリジナルのソースがバイナリを strip
してくれる場合は良いですが, そうでない場合には
post-install ターゲットを指定して strip
するようにするとよいでしょう. 例えば,
こんな風になります:
post-install:
strip ${PREFIX}/bin/xdl
インストールされた実行形式がすでに strip
されているかどうかは file
コマンドで確認できます. これが`not
stripped'と言わなければ,
stripされているということです.
INSTALL_* マクロ
あなた自身の *-install
ターゲットでファイルの正しいモードと オーナを保証するために,
必ずbsd.port.mkで提供されて
いるマクロを使用してください.
マクロは以下のようなものがあります.
${INSTALL_PROGRAM}
は実行可能なバイナリを
インストールするコマンドです.
${INSTALL_SCRIPT}
は実行可能なスクリプトを
インストールするコマンドです.
${INSTALL_DATA}
は共有可能なデータを
インストールするコマンドです.
${INSTALL_MAN}
はマニュアルとその他のドキュメ
ントをインストールするコマンドです.
(圧縮はしません)
これらは基本的に install
コマンドに適当なフラグを与え たものです.
どのようにこれらを使用するかは以下の例を見てください.
WRKDIR
WKRDIR
の外のファイルにはなにも書き込まないように してください. WRKDIR は
ports のビルド中に書き込こめる
ことが保証されている唯一の場所です( CDROM から ports
をコンパイルを参照). PKGDIR
にあるファイルを修正する必要がある ときには, 変数の再定義
によって行ない, 上書きはしないでください.
-
+
WRKDIRPREFIX
WRKDIRPREFIX
を尊重していることを確認してください. 特に, 別の port の
WRKDIR を参照している
ときには気を付けてください. 正しい場所は,
WRKDIRPREFIX
PORTSDIR
/subdir/
name/work, です,
PORTSDIR/subdir/
name/work とか
.CURDIR/../../subdir
/name/work
とかではありません.
また, 自分で WRKDIR 定義するときには,
頭に
${WRKDIRPREFIX}${.CURDIR}
が付いている 事を確認してください.
OS や OS のバージョンの区別
Port の過程で, 修正や, どのバージョンの UNIX
で動くかによる条件つきコンパイルなどが
必要なコードに出会うかもしれません.
そのような条件つきコンパイルなどのための
変更をおこなうときには, FreeBSD 1.x システムへの移植や,
CSRGの4.4BSD, BSD/386, 386BSD, NetBSD, OpenBSD
などの他のBSDシステムへの移植が可能なように,
できるだけ普遍的な変更をおこなうことを
心がけてください.
4.3BSD/Reno (1990) およびそれより新しい BSD
版を古いバージョンと区別するには BSD
マクロを利用するのがよいでしょう. これは
<sys/param.h> で定義されています.
このファイルがすでにインクルードされていればよいのですが,
もしそうでない場合には以下のコードを, その
.c
ファイルの適当な場所に加えてください.
#if (defined(__unix__) || defined(unix)) && !defined(USG)
#include <sys/param.h>
#endif
これらの 2
つのシンボルが定義されているすべてのシステムには
sys/param.h があるはずです. もし,
そうでないシステムを発見したら我々にも教えてください.
&a.ports; までメールを送ってください.
あるいは, GNU の Autoconf
のスタイルを使用することもできます,
#ifdef HAVE_SYS_PARAM_H
#include <sys/param.h>
#endif
この方法を使用するときには,
Makefile 中の
CFLAGSに
-DHAVE_SYS_PARAM_H
を加えることを忘れないようにしてください.
いったん sys/param.h
がインクルードされると,
#if (defined(BSD) && (BSD >= 199103))
このようにしてそのコードが 4.3 Net2 コードベース,
またはそれより新しいもの (例: FreeBSD 1.x, 4.3/Reno, NetBSD
0.9, 386BSD, BSD/386 1.1とそれ以前)
の上でコンパイルされているかを検出できます.
#if (defined(BSD) && (BSD >= 199306))
これは, 4.4コードベース, またはそれより新しいもの (例:
FreeBSD 2.x, 4.4, NetBSD 1.0, BSD/386 2.0とそれ以後)
の上でコンパイルされているかどうかを
検出するために使用します.
4.4BSD-Lite2 コードベースでは, BSD
マクロの値は 199506 になっています.
これは参考程度の意味合いしかありません. 4.4-Lite ベースの
FreeBSD と 4.4-Lite2 での変更がマージされたバージョンとを
区別するのに使用するべきものではありません.
この目的のためには, __FreeBSD__
マクロをかわりに使用してください.
以下は控え目に使ってください.
__FreeBSD__
はFreeBSDのすべての版で定義されています. 変更が
FreeBSD
だけに適用されるとき以外は使用しないでください.
Portでよくある, strerror()
ではなく sys_errlist[]
を使うなどは, FreeBSDでの変更ではなく, BSD
の流儀です.
FreeBSD 2.xでは __FreeBSD__ が
2 と定義されています.
それ以前の版では 1 になっています.
その後の版では,
そのメジャー番号に合うように上がっていきます.
もし, FreeBSD 1.x システムと FreeBSD 2.x あるいは
FreeBSD 3.x システムを区別する必要があれば, 上で述べた
BSDマクロを使用するのが,
大抵の場合において正しい答です. もし,
FreeBSD特有の変更であれば (ld
を使うときのシェアードライブラリ用のなオプションなど),
__FreeBSD__を使い #if
__FreeBSD__ > 1 のようにFreeBSD 2.x
および, それ以降のシステムを検出するのはかまいません.
もし,
2.0-RELEASE以降のFreeBSDシステムを細かく検出したけれ ば,
以下を使用することができます.
#if __FreeBSD__ >= 2
#include <osreldate.h>
# if __FreeBSD_version >= 199504
/* 2.0.5+ release specific code here */
# endif
#endif
Release
__FreeBSD_version
2.0-RELEASE
119411
2.1-CURRENT's
199501, 199503
2.0.5-RELEASE
199504
2.1 以前の 2.2-CURRENT
199508
2.1.0-RELEASE
199511
2.1.5 以前の 2.2-CURRENT
199512
2.1.5-RELEASE
199607
2.1.6 以前の 2.2-CURRENT
199608
2.1.6-RELEASE
199612
2.1.7-RELEASE
199612
2.2-RELEASE
220000
2.2.1-RELEASE
220000 (2.2-RELEASE と同じです)
2.2.1-RELEASE 以後の 2.2-STABLE
220000 (これも同じです)
texinfo-3.9 以後の 2.2-STABLE
221001
top 導入以後の 2.2-STABLE
221002
2.2.2-RELEASE
222000
2.2.2-RELEASE 以後の 2.2-STABLE
222001
2.2.5-RELEASE
225000
2.2.5-RELEASE 以後の 2.2-STABLE
225001
ldconfig -R 以後の 2.2-STABLE
225002
2.2.6-RELEASE
226000
2.2.7-RELEASE
227000
2.2.7-RELEASE 以後の 2.2-STABLE
227001
semctl(2) 変更後の 2.2-STABLE
227002
2.2.8-RELEASE
228000
2.2.8-RELEASE 以後の 2.2-STABLE
228001
mount(2) 変更以前の 3.0-CURRENT
300000
mount(2) 変更以後の 3.0-CURRENT
300001
semctl(2) 変更以後の 3.0-CURRENT
300002
ioctl 引数変更後の 3.0-CURRENT
300003
ELF 移行後の 3.0-CURRENT
300004
3.0-RELEASE
300005
3.0-RELEASE 以後の 3.0-CURRENT
300006
3/4 の分岐後の 3.0-STABLE
300007
3.1-RELEASE
310000
3.1-RELEASE 以後の 3.1-STABLE
310001
3/4 の分岐後の 4.0-CURRENT
400000
(2.2-STABLE は, 2.2.5-RELESE 以後,
“2.2.5-STABLE” と呼ばれることがあります.)
見ての通り,
これは年・月というフォーマットになっていましたが,
バージョン 2.2 から,
より直接的にメジャー/マイナー番号を使う
ように変更になりました.
並行していくつかのブランチ(枝分かれし
たバージョン)を開発する場合には,
リリースされた日付でそれらの
リリースを分類することが不可能だからです. (あなたが今 port
を作成するときに, 古い -CURRENT 達について心配
する必要はありません.
これは参考のために挙げられているにすぎま せん.)
これまで, 何百ものportが作られてきましたが,
__FreeBSD__ が正しく使われたのは,
1つか2つの場合だけでしょう.
以前のportが誤った場所でそのマクロを使っているからと いって,
それをまねする理由はありません.
bsd.port.mk の後に書くこと
.include <bsd.port.mk>
の行の後には なにも書かないようにしてください. 大抵の場合は
Makefile の 中程のどこかで,
bsd.port.pre.mk を include して, 最後に
bsd.port.pre.mk を include
することによって避けることができます.
pre.mk/post.mk
のペアか bsd.port.mk
だけのどちらかだけを include してください.
2つを混ぜないでください.
前者は, いくつかの変数の定義だけ をして,
Makefile でのテストに使用し,
後者は残りを定義します.
以下は bsd.port.pre.mk
で定義される重要な変数です. (これは, すべてではありません.
完全なリストは bsd.port.mk
を参照してください.)
変数名
解説
ARCH
uname -m で返される
アーキテクチャ. (例, i386).
OPSYS
uname -s で返される
オペレーティングシステム (例,
FreeBSD).
OSREL
オペレーティングシステムの
リリースバージョン
(例., 2.1.5,
2.2.7).
OSVERSION
数字形式のオペレーティングシステム
のバージョン,
上記の
__FreeBSD_version
と同じです.
PORTOBJFORMAT
システムのオブジェクト
フォーマット (aout あるいは
elf).
LOCALBASE
“local” ツリーのベース.
(例, /usr/local/).
X11BASE
“X11” ツリーのベース.
(例, /usr/X11R6/).
PREFIX
portsのインストール先
(
PREFIXについてを参照).
USE_IMAKE,
USE_X_PREFIX あるいは
MASTERDIR
などの変数を定義する必要がある場合には,
bsd.port.pre.mk を include
する前に定義してください. 他のものは,
bsd.port.pre.mk
の前でも後でもかまいません.
以下は bsd.port.pre.mk
の後に書けるものの例です:
# no need to compile lang/perl5 if perl5 is already in system
.if ${OSVERSION} > 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
付加的ドキュメント
普通のマニュアルや info
ファイルのほかにユーザにとって有用だ
と思えるようなドキュメントがある場合には,
PREFIX/share/doc
の下にインストールしてく ださい. これは前記と同様,
post-installターゲットの
中からするのがいいでしょう.
まず, あなたのportのために新しいディレクトリを作りま す.
どのportのドキュメントか簡単にわかるような名前にする必
要がありますので, 普通は PKGNAME
からバージョ ン番号を除いた部分を使うといいでしょう.
もちろん, ユーザが異
なるバージョンのものを同時に使うことが予想される port の場合
には, PKGNAME
をそのまま使ってかまいません.
ユーザが /etc/make.conf
でこの部分を禁止するために NOPORTDOCS
という変数をセットしている場合には, これらのドキュメントが
インストールされないようにしてください. こんな具合です.
post-install:
.if !defined(NOPORTDOCS)
${MKDIR}${PREFIX}/share/doc/xv
${INSTALL_MAN} ${WRKSRC}/docs/xvdocs.ps ${PREFIX}/share/doc/xv
.endif
これらのファイルを pkg/PLIST
に入れるのを忘れないよ うにしてください.
(packageが/etc/make.conf内の
変数を読む方法は今のところ存在しませんので,
NOPORTDOCS
については気にしないでください.)
インストール時に pkg/MESSAGE
ファイルを利用して, メッセージを表示することができます.
詳細は pkg/MESSAGE を使う
の節を参照してください.
MESSAGE ファイルは
pkg/PLIST に加える必要はありま
せん.
DIST_SUBDIR
/usr/ports/distfiles
ディレクトリ内をあまり散らかさ ないようにしてください.
たくさんのファイルを取ってくるport や,
数は少なくてもほかのportのファイルと混同されるおそれが
あるファイル (Makefile など)
がある場合には, DIST_SUBDIR に port
の名前 (PKGNAME
からバージョン番号を取った部分を 使うといいでしょう)
を入れてください. すると,
DISTDIRがデフォルトの
/usr/ports/distfiles から
/usr/ports/distfiles/DIST_SUBDIR
に変更され,
取ってきたファイルはすべてそのサブディレクトリの中に置か
れるようになります.
また,
ファイルを取ってくるときにバックアップサイトとして使わ れる
ftp.freebsd.org
のディレクトリ名にもこの変数の 値が使われます.
(DISTDIRを明示的に指定し た場合には,
ローカルのファイルを置くところは変わりますが, こ
のサイトのディレクトリ名は変わりませんので, 必ず
DIST_SUBDIRを使うようにしてください.)
この変数はMakefile中で明示的に指定された
MASTER_SITES
には影響しないことに注意して ください.
RCS文字列
RCS
が特別な意味を与えている文字列をパッチ内に入れないように
してください.
ファイルを私たちのソースツリーに入れる時にこれら
の文字列はCVSによって書き換えられてしまい, あとでまたパッチ
を使おうとした時にうまくいかないことがあります. RCS文字列は
ドル記号 ($) で囲まれており,
$Id や $RCS
などで始まり ます.
パッチ作成上の注意
diffの再帰 ()
フラグを使って再帰的なパッ チを作るのは大変結構なのですが,
でき上がったパッチは必ず目で
チェックして余計なゴミが入っていないことを確認してくださ い.
よくあるのはバックアップファイル同士の変更点, あるいは
Imake や GNU configure
を使うソフトウェアの Makefile
の変更点が入っている場合などです. また,
configure.in を編集して,
autoconf を使って
configure を作り直す ときには,
configure の diff は含めずに (それらは,
数千行になることもしばしばです),
USE_AUTOCONF=yes を定義して,
configure.in の diff
をとってください.
ファイルをまるごと消す場合にはパッチを使わずに
post-extract
ターゲットで消す方が簡単です. できあがった 差分に満足したら,
それらをソースのファイルごとに別々の
パッチファイルに分割してください.
PREFIX
なるべく port は PREFIX
に対する相対パス
にインストールすることができるように心がけてください.
(この変数の値は USE_X_PREFIXか
USE_IMAKEが指定してある時には
X11BASE
(デフォルト/usr/X11R6),
そうでない場合にはLOCALBASE
(デフォルト/usr/local)
にセットされます.)
サイトによってフリーソフトウェアが
インストールされる場所が 違いますので, ソース内で
/usr/local や
/usr/X11R6
を明示的に書かないようにしてください. X のプログラムで
imake を使うものについては, これは問題に
はなりません. それ以外の場合には, ソース中のMakefileやスク
リプトで
/usr/local (imakeを使わないXのプログラ
ムは /usr/X11R6) と書いてあるところを
PREFIX に書き換えてください. この値は
portのコンパイル,
およびインストール時に自動的に環境変数として
下位makeに渡されます.
USE_X_PREFIXは本当に必要な時 (つまり,
X のライブラリなどとリンクしたり, X11BASE
以下にある ファイルを参照したりする必要がある時)
以外には設定しないでください.
変数 PREFIX の値は port の Makefile
やユーザの環境で変更することもできます. しかし, 個々の port
が Makefile
でこの変数の値を明示的に設定することはなるべくしない
でください.
また, 他の port
からインストールされるプログラムやファイル
を指定するときには, 上で述べた変数を使用してください.
例えば, less のフルパスを
PAGER というマクロに入れた い場合は,
コンパイラに
-DPAGER=\"/usr/local/bin/less\"
と渡すかわりに
-DPAGER=\"${PREFIX}/bin/less\"
(Xを使うportの時は
-DPAGER=\"${LOCALBASE}/bin/less\" )
を渡し てください. こうしておけば, `/usr/local'
がまるごとどこか他 の場所に移してあるサイトでも,
あなたのportがそのまま使える 可能性が高くなります.
ディレクトリ構成
インストール時には PREFIX
の正しいサブディ
レクトリにファイルを置くように心がけてください. ソフトウェア
によっては新しいディレクトリを
一つ作ってファイルを全部それに 入れてしまうものがありますが,
それはよくありません. また, バ イナリ,
ヘッダファイルとマニュアル以外のすべてを
lib
というディレクトリに入れてしまうportもあります が,
これもBSD的なファイルシステム構成からいうと正しくありま
せん. これは以下のように分散すべきです.
etc にセッ
トアップ/コンフィグレーションファイル,
libexec に 内部で使用されるプログラム
(コマンドラインから呼ばれることの ないコマンド),
sbin に管理者用のコマンド,
info に GNU Info 用のドキュメント,
そして share
にアーキテクチャに依存しないファイルが入り ます.
詳細については man &man.hier.7; を見てくださ い.
/usrの構成方針はほとんどそのまま
/usr/localにもあてはまります. USENET
“ニュース”を 扱う ports は例外です. これらは,
ファイルのインストール先として
PREFIX/news
を使用します.
空のディレクトリの除去
ports は デインストール(削除) の際には,
自分自身を消去したあとに, (ディレクトリの)
除去をするようにしてください. これは, 大抵の場合
@dirrm の行を ports
が作成するすべてのディレクトリについて
加えることによって実現できます. 親ディレクトリは,
子ディレクトリを先に消さないと
消せないことに気をつけて下さい.
:
lib/X11/oneko/pixmaps/cat.xpm
lib/X11/oneko/sounds/cat.au
:
@dirrm lib/X11/oneko/pixmals
@dirrm lib/X11/oneko/sounds
@dirrm lib/X11/oneko
といった感じです.
しかし, ときとして, 他の port
をディレクトリを共有しているために @dirrm
がエラーを返すことがあります. rmdir を
@unexec から呼びだすことによって,
警告(warning)なしで
空のディレクトリのみを削除することができます:
@unexec rmdir %D/share/doc/gimp 2>/dev/null || true
これを使えば, たとえ, 他の port がファイルを
インストールしていて,
PREFIX/share/doc/gimp
が空でない場合でも エラーメッセージは表示されませんし,
pkg_delete
が異常終了することもありません.
UID
もしあなたの
portがインストールされるシステム上に特定のユー
ザを必要とする場合は, pkg/INSTALL
スクリプトから pw
コマンドを実行して自動的にそのユーザを追加するよ
うにしてください. net/cvsup-mirror の
portが参考になるでしょう.
もしあなたの port が, バイナリのパッケージとしてとして
インストールされるときにも,
コンパイルされたときと同じユーザー/グループ ID
を使わなければならないのなら, 50 から 99 の間で空いている
UID を選んで登録してください.
japanese/Wnn の port
が参考になるでしょう.
既にシステムや他の portで利用されている
UIDを使わないように 十分注意してください. 現在の 50から
99までの間の UIDは以下の とおりです.
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
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:/nonexistent
wnn:*:69:7:Wnn:/nonexistent:/nonexistent
ifmail:*:70:66:Ifmail user:/nonexistent:/nonexistent
pgsql:*:70:70:PostgreSQL pseudo-user:/usr/local/pgsql:/bin/sh
ircd:*:72:72:IRCd hybrid:/nonexistent:/nonexistent
alias:*:81:81:QMail user:/var/qmail/alias:/nonexistent
qmaill:*:83:81:QMail user:/var/qmail:/nonexistent
qmaild:*:82:81:QMail user:/var/qmail:/nonexistent
qmailq:*:85:82:QMail user:/var/qmail:/nonexistent
qmails:*:87:82:QMail user:/var/qmail:/nonexistent
qmailp:*:84:81:QMail user:/var/qmail:/nonexistent
qmailr:*:86:82:QMail user:/var/qmail:/nonexistent
msql:*:87:87:mSQL-2 pseudo-user:/var/db/msqldb:/bin/sh
このリストを最新の状態に保つためにも,
この範囲の UID や GID を予約するような port を作ったり,
既存の port にそのような改変を行って我々に送るときには,
UID の予約に関する注意書きをつけてください.
合理的な port
Makefile
は単純かつ適切であるべきです. もし,
Makefile を数行短かくできたり,
もっと読みやすくできるのであれば, そうしてください. 例えば,
shell の if 構文を使う代りに, make の
.if 構文を使う,
EXTRACT* の再定義で代用できるのであれば,
do-extract を再定義しない,
CONFIGURE_ARGS +=
--prefix=${PREFIX} とするかわりに,
GNU_CONFIGURE とする, などです.
CFLAGS の尊重
CFLAGS 変数は尊重すべきです. その
port がこれを無視するのであれば,
NO_PACKAGE=ignores cflags を
Makefile に加えてください.
コンフィグレーション(設定)ファイル
もしあなたの port が設定ファイルを
PREFIX/etc
に置く必要がある場合には, それを単純にインストールしたり,
pkg/PLIST
に加えてはいけません. こうしてしまうと,
pkg_delete が
ユーザが苦労して作ったファイルを消してしまったり, 新しく
インストールすると上書きされてしまったりします.
代りに, 見本となるファイルを suffix (
filename.sample が良いでしょう)
を付けて インストールして,
message を表示して, ソフトウエアを動かす前に,
ユーザがそのファイル
をコピーして編集をしなければならないことを知らせましょう.
Portlint
送付や commit をする前に portlint
を使ってチェックしましょう.
フィードバック
Portを作るためにソフトウェアに変更を加えたら,
なるべく原作者にその旨を伝えてパッチ等を送ってください.
これらが次のリリースに取り入れられれば,
アップグレードが楽になります.
その他諸々
pkg/DESCR,
pkg/COMMENT,
pkg/PLIST などのファイルは,
それぞれ2重にチェックしてください.
再検討してもっと良い記述があれば,
それに置きかえてください.
GNU General Public License
(GNU一般公有使用許諾)のコピーは
(すでにあるので)コピーしないでください,
おねがいします.
法律に関することには, 十分注意をはらってください.
私達に法律に反するような形でソフトフェアの配布をさせない
でください!
困ったら....
私たちに質問を送る前に,
既存のportの例とbsd.port.mkを
ちゃんと読んでください! ;)
それでもわからないことがあったら,
一人で悩まないでどんどん 質問してください! :)
Makefile のお手本
これはportの Makefile
を作る際のお手本です. かぎかっこ
([])内のコメントは忘れずに取ってください.
変数の順番, 段落の間の空行など,
Makefile を作るときはなるべくこ
の形式にしたがってください.
この形式は重要な情報が簡単に見つけられるように
設計されています. portlint を使って
Makefile をチェックすることが
推奨されています.
[ヘッダ -- どのようなportのMakefileかすぐにわかるようになっています]
# New ports collection makefile for: xdvi
# Version required: pl18 ["1.5alpha" みたいなのでも結構です]
[この Makefile の最初の版が作成された日付です. この port をアップグ
レードするときには変えないでください.]
# Date created: 26 May 1995
[このソフトウェアを最初に FreeBSD に port した人の名前, つまり,
この Makefile の最初の版を書いた人です. この port をアップグレー
ドするとき, この行も変えないでください.]
# Whom: Satoshi Asami <asami@FreeBSD.ORG>
#
# $Id$
[ ^^^^ この部分は, CVS ツリーに入れる時に自動的に RCS の ID 文字列に
置き換えられます.]
#
[Port自体, およびオリジナルのソースを取ってくるところを記述する部分.
最初は必ずDISTNAME, そして必要ならPKGNAME, CATEGORIES, 続いて
MASTER_SITESがおかれ, さらに MASTER_SITE_SUBDIR がおかれることもあり
ます. そのあと, EXTRACT_SUFX か DISTFILES を指定することも可能です]
DISTNAME= xdvi
PKGNAME= xdvi-pl18
CATEGORIES= print
[MASTER_SITE_* マクロを使用しない場合は,
最後のスラッシュを忘れないように ("/")!]
MASTER_SITES= ${MASTER_SITE_XCONTRIB}
MASTER_SITE_SUBDIR= applications
[ソースファイルが標準の ".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
[依存する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 <bsd.port.mk>
Packageの名前
Package の名前は以下のルールにしたがってつけてください. こ
れは package のディレクトリを見やすくするためで, 無秩序な名前
がたくさん並んでいるとユーザが使いづらくなるのでは
という心配か らです.
(FTPサイトなどにはたくさんpackageがありますからね.)
Packageの名前は以下のようにしてください.
言語-名前-オプション
バージョン.番号
DISTNAME
が上記の形式になっていない場合に は,
PKGNAME をそのようにしてください.
FreeBSD
はユーザの慣れ親しんだ言語のサポートに力を入れて います.
特定の言語のためのportのpackage名には
言語- に ISO-639
で定義されている言語名の略称を入れ てください. 例えば,
日本語なら ja, ロシア語なら
ru, ベト ナム語なら
vi, 中国語なら zh,
韓国語ならば ko, ドイツ 語なら
de, といった具合です.
名前
の部分は原則的にはすべて英小文字 を使います.
例外はたくさんのプログラムが入っている巨大なport の場合で,
XFree86 (ほんとにあるんですよ) やImageMagickな
どがこれにあたります. そうでない場合には,
名前の大文字を小文 字に (少なくとも最初の一字だけは)
変えてください. もし, 大文字であることが重要な場合(例えば,
1文字の名前, R とか
V)には,
あなたの裁量で大文字を使うのも良いでしょう. Perl 5
のモジュールでは, 頭に p5- を付け,
2重コロン (::) のセパレータをハイフン(
- ) に置きかえるしきたりになっています.
例えば, Data::Dumper は
p5-Data-Dumper になります. また, その
ソフトウェアの名前として通常使われるものに番号, ハイフン,
あ るいは下線が入っている場合には,
それらを使うことも構いません (kinput2
など).
コンパイル時に環境変数や make
の引数などで
ハードコードされたデフォルト
を変えてコンパイルできる場合,
-compiled.specifics
にそのコンパイル時のデフォルトを入れてください
(ハイフンはあってもなくてもかまいません). 用紙のサイズ,
あるいはフォントの解像度などがこれにあたります.
バージョン番号は数字とアルファベットからなり, ピリオド
(.) で区切ります.
アルファベットは二文字以上続けてはいけませ ん.
ただ一つの例外は「パッチレベル」を意味する
pl で, それ 以外にバージョン番号が
まったくついていない場合にのみ使うことがで きます.
では, DISTNAMEを正しい
PKGNAMEに直す例を見てみましょう:
DISTNAME
PKGNAME
理由
mule-2.2.2.
mule-2.2.2
まったく問題なし
XFree86-3.1.2
XFree86-3.1.2
同上
EmiClock-1.0.2
emiclock-1.0.2
プログラム一つだけの時は小文字のみ
gmod1.4
gmod-1.4
`<名前>' のあとにハイフンが必要
xmris.4.0.2
xmris-4.0.2
同上
rdist-1.3alpha
rdist-1.3a
alphaのような文字列は使えない
es-0.9-beta1
es-0.9b1
同上
v3.3beta021.src
tiff-3.3
なんなんでしょう ;)
tvtwm
tvtwm-pl11
バージョン番号は必ず必要
piewm
piewm-1.0
同上
xvgr-2.10pl1
xvgr-2.10.1
pl
が使えるのは他にバージョン番号がない場合のみ
gawk-2.15.6
ja-gawk-2.15.6
日本語バージョン
psutils-1.13
psutils-letter-1.13
コンパイル時に用紙のサイズを指定
pkfonts
pkfonts300-1.0
300dpiフォント用のpackage
オリジナルのソースにまったくバージョン情報が見当たらず,
また原作
者が新しいバージョンをリリースする可能性が低いときには,
バージョ ン番号として 1.0
を使えばいいでしょう (上記のpiewmの例がこ れにあたります).
そうでない場合には, 原作者に聞くか, 日付
(
年.月
.日)
を使うなどしてください.
カテゴリ
すでに御存知のように, ports はいくつかのカテゴリに
分類されています. これを有効に利用するためには, port を
行う人々とユーザが, そろぞれのカテゴリが何であるか,
どのようにしてカテゴリに分類するかを理解する必要が
あります.
現在のカテゴリのリスト
まず, これが現在の port のカテゴリーのリストです.
アスタリスク(*) が付いているものは,
バーチャル(virtual) カテゴリです --
これらには対応するサブディレクトリが port
ツリーにはありません.
バーチャルカテゴリでないものは,
そのサブディレクトリ内の pkg/COMMENT
に1行の記述があります (例,
archivers/pkg/COMMENT).
Category
Description
afterstep*
Ports to support AfterStep window manager
archivers
Archiving tools.
astro
Astronomical ports.
audio
Sound support.
benchmarks
Benchmarking utilities.
biology
Biology-related software.
cad
Computer aided design tools.
chinese
Chinese language support.
comms
Communication software. Mostly software to talk to
your serial port.
converters
Character code converters.
databases
Databases.
deskutils
Things that used to be on the desktop before
computers were invented.
devel
Development utilities. Do not put libraries here just
because they are libraries—unless they truly don't
belong to anywhere else, they shouldn't be in this
category.
editors
General editors. Specialized editors go in the
section for those tools (e.g., a mathematical-formula
editor will go in math).
elisp
Emacs-lisp ports.
emulators
Emulators for other operating systems. Terminal
emulators do not belong
here—X-based ones should go to
x11 and text-based ones to either
comms or misc,
depending on the exact functionality.
games
Games.
german
German language support.
graphics
Graphics utilities.
japanese
Japanese language support.
kde*
Ports that form the K Desktop Environment
(kde).
korean
Korean language support.
lang
Programming languages.
mail
Mail software.
math
Numerical computation software and other utilities
for mathematics.
mbone
MBone applications.
misc
Miscellaneous utilities—basically things that
doesn't belong to anywhere else. This is the only category
that should not appear with any other non-virtual
category. If you have misc with
something else in your CATEGORIES line,
that means you can safely delete misc
and just put the port in that other subdirectory!
net
Miscellaneous networking software.
news
USENET news software.
offix*
Ports from the OffiX suite.
palm
Software support for the 3Com Palm(tm) series.
perl5*
Ports that require perl version 5 to run.
plan9*
Various programs from Plan9.
print
Printing software. Desktop publishing tools
(previewers, etc.) belong here too.
python*
Software written in python.
russian
Russian language support.
security
Security utilities.
shells
Command line shells.
sysutils
System utilities.
tcl75*
Ports that use tcl version 7.5 to run.
tcl76*
Ports that use tcl version 7.6 to run.
tcl80*
Ports that use tcl version 8.0 to run.
tcl81*
Ports that use tcl version 8.1 to run.
textproc
Text processing utilities. It does not include
desktop publishing tools, which go to print/.
tk41*
Ports that use tk version 4.1 to run.
tk42*
Ports that use tk version 4.2 to run.
tk80*
Ports that use tk version 8.0 to run.
tk81*
Ports that use tk version 8.1 to run.
vietnamese
Vietnamese language support.
windowmaker*
Ports to support the WindowMaker window
manager
www
Software related to the World Wide Web. HTML language
support belong here too.
x11
The X window system and friends. This category is
only for software that directly support the window system.
Do not put regular X applications here. If your port is
an X application, define USE_XLIB
(implied by USE_IMAKE) and put it in
appropriate categories. Also, many of them go into other
x11-* categories (see below).
x11-clocks
X11 clocks.
x11-fm
X11 file managers.
x11-fonts
X11 fonts and font utilities.
x11-toolkits
X11 toolkits.
x11-wm
X11 window managers.
適切なカテゴリの選択
多くのカテゴリに重なるので, どれを '第一'
カテゴリにするかを決めなければならないことが
たびたびあるでしょう. これを
うまく決めるルールがいくつかあります.
以下はその優先順のリストで, 優先度の高いものから
低いものの順に書いてあります.
言語特有のカテゴリがまず最初です. 例えば日本語の
X11 のフォントをインストールする port の場合,
CATEGORIES 行は japanese
x11-fonts となるでしょう.
より特徴的なカテゴリが, 一般的なカテゴリより
優先されます. 例えば, HTML エディタの場合は www
editors となり, 逆順にはしないでください.
また, port が mail,
mbone, news,
security, www
のいづれかに属するとには, net
は必要ありません.
x11 を第2カテゴリにするのは,
第1カテゴリが自然言語の場合のみにしてください. 特に X
のアプリケーションには x11
を指定しないでください.
もし, あなたの port が他のどのカテゴリにも
属しないばあいには, misc
にしてください.
もし, あなたがカテゴリについて自信が持てない場合には,
そのことを send-pr するときに
書き加えてください. そうすれば import するまえに
それについて議論できます. (もしあなたが commiter であれば,
そのことを &a.ports に送って, 先に議論
するようにしてください — 新しい port
が間違ったカテゴリに import されて,
すぐ移動されることが多いので.)
このドキュメントと ports システムの変更
もしあなたが, たくさんの ports の保守を
しているのであれば, &a.ports メーリングリストの内容を
フォロウすることを考えてください. Ports
のしくみについての重要な変更点はここに アナウンスされます.
最新の変更点については, いつでも, the bsd.port.mk CVS log で詳細な情報を得ることができます.
やっとおしまい!
いやはや, 長い文章ですみません.
ここまで読んでくださった方に は感謝, 感謝でございます. (_ _)
さあ, portの作り方がわかったところで,
世界中のソフトウェア をport化しましょう.
FreeBSDプロジェクトに貢献するには, それ
がもっとも簡単な方法です! :)
diff --git a/ja/handbook/printing/chapter.sgml b/ja/handbook/printing/chapter.sgml
index 791d4d4e90..783f48f7db 100644
--- a/ja/handbook/printing/chapter.sgml
+++ b/ja/handbook/printing/chapter.sgml
@@ -1,5407 +1,5407 @@
プリンタの利用
著者 &a.kelly;
30 September 1995
訳者 &a.jp.kimura;.
3 September 1996
FreeBSD でプリンタを使用するためには, バークレイラインプリンタ
スプーリングシステム (LPDスプーリングシステムとしても知られて
います) が機能するようにプリンタをセットアップする必要がありま す.
本節では, LPDスプーリングシステム (大抵の場合, 単にLPDと呼 ばれる)
について紹介します.
もし, LPDや他のプリンタスプーリングシステムについて既に詳しい
知識をお持ちの方は, 「
スプーリングシステムのセットアップ」から読み始めて
も結構です.
スプーラは何をするか
LPDはあるホストのプリンタに関する制御の一切をおこないます.
こ こで言う制御としては, 次のことが挙げられます.
ホストに接続されたプリンタ, あるいはネットワーク
上の他ホストに接続されたプリンタに対するアクセスを制御しま
す.
ファイルをプリントする要求に対して許可を与えます.
この要求は特に ジョブ
と呼ばれています.
各々のプリンタの キュー
を管理することにより,
複数のユーザがあるプリンタに対して同時にアクセスすることを
防ぎます.
ヘッダページ
(バナー または
バースト ページとしても知られています)
をプリントすることができます. これにより,
プリントアウトの山の中から自分がプリントしたジョ
ブを見つけ易くなります.
シリアルポートに接続したプリンタ用に通信パラ
メータを管理します.
ネットワーク経由で他のホスト上の, 別のLPDスプーラにジョ
ブを送ることができます.
様々なプリンタ言語やプリンタの能力に応じてジョブの
形式を整えるため,
特別なフィルタを起動することができます.
プリンタの使用に対して
課金をおこなうことができます.
設定ファイルを通して, また, 特別なフィルタプログラムを供給
することにより, 多種多様なプリンタ機器に対して, 上述の機能の
全部または一部をLPDシステムにおこなわせることができます.
どうしてスプーラを使うべきなのか
あなたのシステムを利用するのがあなた一人だけだとしたら, ア
クセス制御もヘッダページも
プリンタ利用に対する課金も必要ないのに,
なぜわざわざスプーラに煩わされなければならないのか疑問に思うか
もしれません.
プリンタに対する直接アクセスを許可することもできるので すが,
とにかくスプーラを使用するべきです. その理由は,
LPDはジョブをバックグラウンドで処理します. データが
プリンタに送信されるまで待つ必要はありません.
LPDではジョブをフィルタを通してプリントすることが簡
単にできます. これにより, 印刷物のヘッダに時刻や日付を入れ
たり, 特別なファイル形式 (TeX の DVI ファイルなど) をプリン
タが処理できる形式に変更することができます. これらの作業を
手動でおこなう必要がなくなります.
プリント処理をおこなうフリーのまたは商用のプログラムの
ほとんどは, システムのスプーラとやりとりするように作られて
います. スプーリングシステムをセットアップすることで, 今後
加えるかもしれない, あるいは, 既に持っている別のソフトウエ
アをより簡単にサポートすることができるでしょう.
スプーリングシステムのセットアップ
LPDスプーリングシステムを用いてプリンタを使用するためには,
プリンタ機器とLPD用ソフトウェアの両方を準備する必要があります.
本ドキュメントでは次の2段階のレベルに分けて説明をします.
プリンタを接続する方法, プリンタにどの
ように通信するかをLPDに指示する方法や, プレインテキスト
をプリンタで印字する方法については, 「
プリンタの簡単な設定」をご覧ください.
様々な形式のファイルを印字する方法, ヘッダページを
印字する方法, ネットワーク経由でプリンタに印字する方法,
プリンタを制御する方法, プリンタの使用に対する課金をおこなう
方法については「
プリンタ設定上級編」をご覧ください.
プリンタ設定導入編
この節では, プリンタ機器やプリンタを使用するためのLPD用ソフ
トウェアを設定する方法について述べます. この節の概要は次の通り
です.
「
プリンタ機器の設定」では,
プリンタをコンピュータに接
続するためのヒントがいくつか書かれています.
「
ソフトウェアの設定」では, LPDのスプーラ設定ファイル
/etc/printcap
の設定方法について書かれています.
データをプリンタに送るためにシリアルまたは
パラレルインタフェー スではなく,
ネットワークプロトコルを使用する場合は, 「
ネットワークにおけるデータストリームの
インタフェースを持つプリンタ」をご覧くださ い.
この節のタイトルは“プリンタ設定導入編”ですが,
実際の設定は かなり複雑です. プリンタをコンピュータに接続し,
LPDスプーラを 起動させることは一番困難な作業です.
ヘッダページを出力させたり, 課金したりするオプションの設定は,
一度プリンタがうまく動くよう になれば, とても簡単です.
プリンタ機器の設定
この節では, プリンタにPCを接続するための様々な方法について
説明しています. ここでは, ポートやケーブルの種類, FreeBSDが
プリンタとの通信に必要なカーネルコンフィグレーションについて
も言及しています.
もし, プリンタが既に接続されていて,
他のオペレーティングシステ
ム上でプリンタからの印字に成功している場合は, 「
ソフトウェアの設定」まで読み飛
ばすことが多分できるでしょう.
ポートとケーブル
最近のPC用のプリンタほとんどには次のインタフェースの一つ
もしくは両方がついています.
シリアルインタフェースでは,
プリンタにデータを
送信するためにコンピュータにあるシリアルポートが使用され
ます. シリアルインタフェースはコンピュータ業界で共通し
て使用されています. そのケーブルは容易に手に入り, また,
簡単に自作することもできます.
シリアルインタフェースには,
特別なケーブルが必要なことがときどきあり, また, 何か複
雑な通信方式選択の設定が必要になることがあります.
パラレルインタフェースでは,
プリンタにデータを
送信するためにコンピュータにあるパラレルポートを使用しま
す. パラレルインタフェースはPC業界では共通して使われてい
ます. ケーブルの入手は容易ですが, 自作するのはシリアルよ
りも難しいです. パラレルインタフェースには通常,
通信方式の選 択はなく, このため,
設定が極めて単純になっています.
パラレルインタフェースは
“セントロニクス”インタフェー
スとして知られています. これは, プリンタ用のコネクタタ
イプとして採用された後に名付けられました.
シリアルインタフェースはパラレルインタフェースより
も普通はデータの伝送速度が遅くなります.
パラレルインタフェースで は, 通常,
(コンピュータからプリンタへの) 単方向通信のみをおこな
うのに対して,
シリアルインタフェースは双方向通信をおこないます.
最近のパラレルポートの多くはプリンタ側からデータを受けとる
こともできますが, コンピュータ側にデータを送り返すことが必
要となるプリンタはほとんどありません. さらに, FreeBSDでは
双方向のパラレル通信をまだサポートしていません.
通常, プリンタで双方向通信が必要となるのは, プリンタが
PostScript 言語に対応しているときだけです. PostScript プリ
ンタは非常に冗長に動作させることができます. 事実, PostScript
によるジョブでは, プログラムを本当にプリンタ に送信します.
このことは, 印字作業を必ずしもする必要がない ことを意味し,
また, プログラムの結果をコンピュータに直接返
されるかもしれません. PostScript プリンタでは, 双方向
通信を使って, PostScript プログラムのエ
ラーや紙づまりといった問題をコンピュータに報告します. ユー
ザはそれらの情報を知りたいと思うかもしれません. さらに,
PostScript プリンタで課金作業をもっとも効率よくおこなうため
には双方向通信が必要となります. この方法では, まず, プ
リンタの現在のページカウント (起動してから今まで何枚の紙を
印字したか) の情報を得ます. 次に, ユーザのジョブをおこない,
終 了後, 再びページカウントを得ます. この2数を差によって, 課
金対象となる紙の枚数を知ることができます.
それでは,
どちらのインタフェースを使うべきなのでしょうか.
双方向通信が必要なら, シリアルポートを使ってくださ
い.
FreeBSDではパラレルポート上での双方向通信はまだサポー
トされていません.
双方向通信の必要がなく, パラレルかシリアルかの選
択ができる場合はパラレルインタフェースを使うのが好ましい
です. これにより, シリアルポートを他の周辺機器 (端末やモ
デムのなど) のために残しておくことができます. また, パラ
レルインタフェースの方がほとんどの場合高速であり, 設定も
より簡単になっています.
結局のところは
動いてくれるものを使えばよいのです.
パラレルポート
プリンタをパラレルインタフェースを使って接続する場合は,
セントロニクスケーブルでプリンタと
コンピュータをつないでくださ い. 詳しい説明はプリンタ,
コンピュータ, あるいは両方に付属す
る説明書に書かれているはずです.
その際,
どのパラレルポートを使用したかを覚えておいてください.
FreeBSDでは最初のポートは /dev/lpt0,
2番目は /dev/lpt1 であ り,
3番目以降も同様に続きます.
シリアルポート
シリアルインタフェースを使ってプリンタを使う場合は, 適切
なシリアルケーブルでプリンタ
とコンピュータを接続してください. 詳しい説明はプリンタ,
コンピュータ, あるいは両方に付属する説
明書に書かれているはずです.
“適切なシリアルケーブル”
がよくわからないときは, 次のどれか
を試してみてください.
モデム用ケーブルでは,
それぞれのピンは他方の
コネクタの対応するピンと線でつながっています. このタイプ
のケーブルは, “DTE-DCE”
間ケーブルとしても知られています. (訳注:
日本ではストレートケーブルという名前で売られています)
ヌルモデム用ケーブルでは,
あるピンは対応するピ ント接続していますが, あるピン
(例えば, データ送信用とデー タ受信用のピン)
が交差して接続したり, いくつかのピンは内部
で短絡していたりします. このタイプのケーブルは,
“DTE-DTE” 間ケーブルと呼ばれています.
(訳注:日本ではクロスケーブル
という名前で売られています)
A シリアルプリンタ用ケーブルは,
ある特定のプ リンタで必要とされ,
ヌルモデムケーブルと似ていますが, 内
部で短絡させる代わりに, ある信号を他方側に送るために使用
しています.
この他に,
プリンタ用の通信パラメータを設定する必要がありま す. 通常,
プリンタのフロントパネルやDIPスイッチによって制 御します.
コンピュータとプリンタの双方で設定できる最高の通 信速度[bps]
(ビット/秒.
ボーレートと示されているときも ある)
を選んでください. そして, データビット (7または8), パリ ティ
(偶/奇/なし), ストップビット (1または2) を選んでください.
そして, フローコントロールの有無 (制御なし, または
XON/XOFF(“イン・バンド” または
“ソフトウェア”フローコ ントロールとも呼ばれる))
を選びます. 以下に続くソフトウェア の設定のために,
ここでの設定を覚えておいてください.
ソフトウェアの設定
本節では FreeBSD の LPD
スプーリングシステムで印字をおこなうために
必要となるソフトウェアの設定について説明しています.
本節の概要は次のようになります.
プリンタで使用するポートのために, 必要があれば, カー
ネルの書き変えをおこないます. 「カーネルの変更」で,
このためにしなくてはなら ないことを説明しています.
パラレルポートを使用している場合は, パラレルポートの
ための通信モードの設定します. 詳細は, 「
パラレルポートの通信モードを設定する
」で説明しています.
オペレーティングシステムからプリンタにデータが送ら
れているかをテストします. 「
プリンタとの通信状況を調べる」で, どのように
テストするかの提案をいくつかおこなっています.
ファイル/etc/printcapを変更し,
LPDの設定を おこないます. 「/etc/printcap
ファイル」で, どのように変更するかを
説明しています.
カーネルの変更
オペレーティングシステムのカーネルの
コンパイルをおこなうこと によって,
指定されたのデバイスが機能するようになります. シリ アル,
または, パラレルインタフェースをプリンタで使用する場合,
必要なデバイスがこの指定の中に含まれていなくてはなりません.
したがって,
必要なデバイスがカーネルに組み込まれていない場合, 追
加のシリアル, または, パラレルポートをサポートするために,
カー ネルの再コンパイルが必要となるかもしれません.
シリアルポートが現在使用しているカーネルで
サポートされている かどうかを調べるためには,
次のように入力します.
&prompt.root; dmesg | grep sioN
ここで, N
はシリアルポートの番号を示し, この番号は0から 始まります.
次のような出力があった場合, カーネルはそのポー
トをサポートしています.
sio2 at 0x3e8-0x3ef irq 5 on isa
sio2: type 16550A
パラレルポートが現在使用しているカーネルで
サポートされている かどうかを調べるためには,
次のように入力します.
&prompt.root; dmesg | grep lptN
ここで, N
はパラレルポートの番号を示し, この番号は0から 始まります.
次のような出力があった場合, カーネルはそのポー
トをサポートしています.
lpt0 at 0x378-0x37f on isa
上記の出力が得られない場合, プリンタを使うため,
オペレーティ ングシステムにパラレル, または,
シリアルポートを認識し, 使用 できるようにするためには
カーネルを変更する必要があります.
シリアルポートをサポートさせるには, 「
FreeBSDカーネルのコンフィグレーション」の節をご覧く
ださい. パラレルポートをサポートさせる場合も, その節と,
あ わせて,
この節に続く節もご覧ください.
ポート用エントリを /dev
に追加する
カーネルがシリアル, または, パラレルポートを通じての通
信をサポートしていたとしても, システム上で動いているプログ
ラムがデータの送受信をおこなうための
ソフトウェアインタフェース がさらに必要になります.
そのインタフェースは, /dev
ディレクトリにあるエントリに相当します.
/dev
エントリにポートを加えるために
&man.su.1; コマンドで root になります. suコマンド
でパスワードを聞かれたら, ルート用のパスワードを入力し
ます.
/dev
ディレクトリに移動します.
&prompt.root; cd /dev
次のように入力します.
&prompt.root; ./MAKEDEV port
ここで, port は,
作成するポート名です. 1番目 のパラレルポートのときは
lpt0 に, 2番目のときは
lpt1 になり, 以降同様になります.
1番目のシリア ルポートのときは,
ttyd0 に, 2番目のときは
ttyd1 になり,
これも以降同様となります.
次を入力し, デバイスのエントリができたか確認し
ます.
&prompt.root; ls -l port
パラレルポートの通信モードを設定する
パラレルインタフェースを使用している場合, FreeBSDでは,
割り込み駆動型にするか,
プリンタとの通信の状況をカーネルに監
視させるかのいずれかを選択できます.
GENERIC
カーネルでは割り込み駆動方式が,
デフォルトになっています. この方式では,
オペレーティングシ
ステムはプリンタがデータを受け付けられるかどうかを調べ
るために, IRQ ラインを一つ使用します.
監視方式では,
オペレーティングシステムにプ
リンタがもっとデータを受け付けられるかどうかを繰り返し
尋ねるように指示します. そして, 受け付けるという応答を
受けたとき,
カーネルはさらなるデータを送信します.
割り込み駆動方式は, いくらか高速になりますが, 貴重な
IRQ ラインを一つ消費します.
うまく機能するものをお使いください.
通信モードを設定するためには2つの方法があります.
1つはカー
ネルを変更することで, もう一つは
&man.lptcontrol.8; プログラムを使用する方法です.
カーネルを設定することによって,
通信モードを変更する.
カーネルコンフィグレーションファイルを変更しま す.
lpt0
のエントリを探すか追加してください. 2番目
のパラレルポートを設定するときは, 代わりに
lpt1 を使います. 以下,
3番目のポートは lpt2 となってい
きます.
イベント駆動方式にする場合は,
irq 指 定を追加します.
device lpt0 at isa? port? tty irq N vector lptintr
ここで, N
はパラレルポート用の IRQ 番号で す.
監視方式を使用する場合は,
irq を追加 してはいけません.
device lpt0 at isa? port? tty vector lptintr
ファイルをセーブし, config プログラムを起動 し,
カーネルの構築, インストールをおこないます. そして, リ
ブートしてください. 詳細は, 「
FreeBSDカーネルのコンフィグレーション」を参照
してください.
&man.lptcontrol.8;
で通信モードを設定する場合
lptN
をイベント駆動方式に設定する場合は,
次のように入力します.
&prompt.root; lptcontrol -i -u N
lptN
を監視方式に設定する場合は, 次のように入力します.
&prompt.root; lptcontrol -p -u N
これらのコマンドを /etc/rc.local
ファイルに追加
しておくと, システムをブートする度に通信モードを設定する
ことができます. 詳細については,
&man.lptcontrol.8; をご覧ください.
プリンタとの通信状況を調べる
スプーリングシステムの設定に進む前に, オペレーティング
システムがプリンタにデータを送ることに成功しているかどうか
を確かめるべきでしょう. これにより, 印字がうまくいかないと
き, プリンタとの通信が問題なのか, スプーリングシステムが問
題なのかを分けて調べることがかなり容易になります.
プリンタをテストするためには,
プリンタに何かのテキストを送
信してみます. 送信した文字をすぐに印字してくれるプリンタに
は, &man.lptest.1; コマンドを使うと有用です. このコマンドは印
字可能な96文字のASCII文字すべてを96行生成します.
PostScript (または他の言語に対応した) プリンタの場合
は, もっと巧妙なテストが必要になります. 次のような, 簡単な
PostScript プログラムを使えば十分でしょう.
%!PS
100 100 moveto 300 300 lineto stroke
310 310 moveto
/Helvetica findfont 12 scalefont setfont
(Is this thing working?) show
showpage
このドキュメントでプリンタ用言語を参照するとき は,
PostScript のような言語を仮定しており, Hewlett Packard
の PCL は考慮していません. PCL は非常に機能的なの
ですが,
プレインテキストにエスケープシーケンスを混ぜること
ができます. PostScript ではプレインテキストを直接印字
することはできません.
このような種類のプリンタ言語に対して は,
特別な対応をおこなわなければなりません.
パラレルポートのプリンタとの接続を調べる
この節では, FreeBSDがパラレルポートに接続されたプリ
ンタと通信できているかどうかを調べる方法について説明し
ています.
パラレルポートのプリンタをテストするために
&man.su.1; コマンドで root になります.
プリンタにデータを送ります.
プリンタがプレインテキストを印字できる場合,
&man.lptest.1; コマンドを使います.
次のように入力してください.
&prompt.root; lptest > /dev/lptN
ここで, N
はパラレルポートの番号で, 番号は
0から始まります.
プリンタが PostScript か他のプリンタ
言語を使用している場合, そのプリンタに簡単なプロ
グラムを送信してください. 次のように入力します.
&prompt.root; cat > /dev/lptN
そして, 一行一行,
プログラムを慎重に入力して
下さい. RETUREN または ENTER キーを入力してしま
うと, その行は編集できなくなります. プログラムの
入力が終わったら, CONTROL+Dか, あなたが設定して
いるファイル終了のキーを押してください.
もしくは, プログラムを入力したファイルがある
場合は, 次のように入力してください.
&prompt.root; cat file > /dev/lptN
ここで, file
はプログラムが格納されていて,
プリンタに送信するファイルの名前です.
これで何かがプリントされることでしょう.
印字されたテキ
ストがおかしくても心配しなくても構いません. それについ
ては, 後で修正します.
シリアルポートのプリンタとの接続を調べる
この節では, FreeBSDがシリアルポートに接続されたプリ
ンタと通信できているかどうかを調べる方法について述べられ
ています.
シリアルポートのプリンタをテストするために
&man.su.1; コマンドで root になります.
/etc/remote
ファイルを編集します. 次の エントリを加えてください.
printer:dv=/dev/port:br#bps-rate:pa=parity
ここで, port
シリアルポート (ttyd0,
ttyd1 など) のデバイスエントリで,
bps-rateは
プリンタとの通信の転送速度[bit/秒],
parityはプリ
ンタとの通信で必要とされるパリティ
(even, odd,
none,
zeroのいずれか) を表わしていま
す.
次の例は,
プリンタをシリアルケーブルでパリティなし, 転送速度
19200bpsで第3番目のシリアルポートに接続した場
合です.
printer:dv=/dev/ttyd2:br#19200:pa=none
&man.tip.1; コマンドでプリンタと接続します. 次のよ
うに入力してください.
&prompt.root; tip printer
これがうまくいかなかった場合は,
/etc/remoteを 編集して,
/dev/ttydN
の代わりに
/dev/cuaaN
を試してみてください.
プリンタにデータを送ります.
プリンタがプレインテキストを印字できる場合,
&man.lptest.1; コマンドを使います.
次のように入力してください.
~$lptest
プリンタが PostScript か他のプリンタ
言語を使用している場合, そのプリンタに簡単なプロ
グラムを入力します. 一行一行,
プログラムを慎
重に入力してください.
バックスペースキーや他の編 集用のキーは,
プリンタの制御コードに割り当てられ
ているかもしれません. プログラムが終了したことを
プリンタに伝えるための特別なファイル終了キーを入
力する必要があるかもしれません. PostScript
プリンタの場合, CONTROL+Dを入力します.
もしくは, プログラムを入力したファイルがある
場合は, 次のように入力してください.
~>file
ここで, file
はプログラムが格納されている
ファイル名です.
&man.tip.1; コマンドでファイルを送
信した後は, ファイル終了を表わすキーを入力する必要
があります.
これで何かがプリントされることでしょう.
印字されたテキ
ストがおかしくても心配しなくても構いません. それについ
ては, 後で修正します.
スプーラに許可を与える:
/etc/printcap ファイル
ここまでで, プリンタはコンピュータに接続され, (必要なら)
プリンタと通信できるようにカーネルを変更し, 簡単なデータをプ
リンタに送信することができているはずです. これで, LPDにプリ
ンタへのアクセスを
制御させる設定をおこなう準備が整いました.
LPDの設定は /etc/printcap
を編集することでおこないます.
LPDスプーリングシステムはスプーラが使われる毎にこのファイル
を参照します. そのため, ファイルを更新するとすぐにその変更が
反映されます.
&man.printcap.5; ファイルの書式は簡単です.
/etc/printcap
の編集はお好みのテキストエディタをお
使いください. このファイルの書式は,
/usr/share/misc/termcap や
/etc/remote
といった他のケイパビリティファイルと一致しています.
この書式
のついての詳細な情報については
&man.cgetent.3; をご覧ください.
スプーラの単純な設定法は,
次のステップでおこないます.
プリンタに名前 (と簡単な別名2〜3個) を付け, それを
/etc/printcap ファイルに記述します.
これについ ては, 「
プリンタに名前を付ける」
を参照してください.
sh の項目を追加することで,
ヘッダページの出 力を禁止します (デフォルトは許可).
これについては, 「
ヘッダページの印字を禁止する」
を参照してください.
スプール用のディレクトリを作成し, その位置を
sd 項目で指定します. これについては,
「
スプーリングディレクトリの作成」
を参照してください.
プリンタを使用するために /dev
エントリを 設定し, /etc/printcap の
lp 項目でそのエ ントリを指定します.
これについては, 「
プリンタデバイスの特定」 を参照してください.
プリンタをシリアルポートに接続した場合は,
fs, fc,
xs, xc
の項目を設定する必要があります. こちらについては,
「
スプーラのための通信パラメータの設定」
を参照してください.
プレインテキスト用の入力フィルタのインストールを
おこないます. 「
テキストフィルタのインストール」
を参照してください.
&man.lpr.1; コマンドで何かを印字することで設定のテス
トをおこないます.
印字してみよう と
トラブルシューティング を参照してください.
PostScript プリンタのような, プリンタ言語を
使用しているプリンタには, プレインテキストを直接印字させる
ことができません. 上にアウトラインを示し, 以下の節で説明す
る簡単な設定方法の説明では, そのようなプリンタを設置してい
る場合は, プリンタが認識できるファイルだけを印字の対象とし
ているという仮定をしています.
多くの場合,
利用者はシステムに設置されているプリンタすべてでプ
レインテキストが印字できることを期待しています. 印字作業を
おこなうためにLPDのインタフェースを利用するプログラムでも,
通 常, そのような仮定を置きます.
プリンタ言語を使用するプリン タを設置しており,
そのプリンタ言語で記述されたジョブと,
これに加えて,
プレインテキストのジョブも印字できるよ うにしたいならば,
上で示した簡単な設定方法に加えて, さら
なる設定をおこなうことを強くお勧めします. すなわち,
原始的なプ レインテキストから PostScript (もしくは,
他のプリンタ 言語)
に変換するプログラムをインストールしてください. 「
プレインテキストのジョブを PostScript
プリンタで印字する」
で, そ れをどのようにおこなえばよいのかが
説明されています.
日本語を印字したい場合は, プリンタ言語を使用し
ていない「日本語プリンタ」についても,
プリンタ固有のエスケー プシーケンスを送る必要があります.
また, 漢字コードをプリン
タが設定しているものに変換したりする必要があり, 各プリンタ
毎に, 日本語用のフィルタが必要になります.
プリンタに名前を付ける
最初の (簡単な) ステップで, プリンタの名前を考えます.
プ リンタには別名をいくつか付けることもできるので,
機能的な名前
でも風変わりな名前でもどちらを選んでもまったく
問題はありません.
少なくとも1つのプリンタには,
/etc/printcap の中 で,
lp という別名を持たせるべきでしょう.
この名前は デフォルトのプリンタ名になっています.
ユーザが環境変数 PRINTER を設定しておらず,
かつ, LPDコマンドのコマンドラインでプリ
ンタの名前が指定されていない場合, lp
がデフォルトのプリ ンタ名となり,
そのプリンタに出力されます.
それから, これは共通の慣習ですが,
プリンタの最後の別名には,
メーカーやモデル名を含むプリンタの完全な名称をつけることに
なっています.
名前と別名のいくつかを決めたら,
/etc/printcap ファ イルに設定します.
プリンタ名は一番左のカラムから書き始めま す.
別名はそれぞれ縦棒によって区切られ, 最後の別名の後ろに
コロンを置きます.
次の例では, 2台のプリンタ (Diablo 630 ラインプリンタと
Panasonic KX-P4455 PostScript レーザライタプリンタ) が定義
されている /etc/printcap
のスケルトンを記しています.
#
# /etc/printcap for host rose
#
rattan|line|diablo|lp|Diablo 630 Line Printer:
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:
この例では, 最初のプリンタに rattan
という名前と別名 として, line,
diablo, lp そして
Diablo 630 Line Printer
が付けられています. 別名とし て lp
があるので, このプリンタはデフォルトのプリンタとなっ
ています. 2番目は bamboo と名付けられ,
別名として, ps と
PS, S,
panasonic, Panasonic KX-P4455
PostScript v51.4 が付けられていま す.
スプーリングディレクトリの作成
スプーラの簡単な設定の次のステップでは,
スプーリン
グディレクトリを作成します.
プリンタに送られるジョブ は,
その印字が終了するまでこのディレクトリに置かれます. また,
他のたくさんのスプーラもこのディレクトリにファイ
ルを置きます.
様々な事情によりスプーリングディレクトリは, 通常, 慣例
として /var/spool の下に置きます.
また, スプーリングディレクトリの内容はバックアップをす
る必要はありません.
&man.mkdir.1; によってディレクトリを
作るだけでスプーリングディレクトリの復旧は完了します.
スプーリングディレクトリの名前は, これも慣例ですが, 次
のようにプリンタの名前と同じにします.
&prompt.root; mkdir /var/spool/printer-name
しかしながら, ネットワーク上に使用可能なプリンタがたく
さんあるならば, LPDで印字するための専用のディレクトリに
スプーリングディレクトリを置きたいと思うかもしれません.
例に出てきたプリンタ rattan と
bamboo につい て, この方式を採用すると,
次のようになります.
&prompt.root; mkdir /var/spool/lpd
&prompt.root; mkdir /var/spool/lpd/rattan
&prompt.root; mkdir /var/spool/lpd/bamboo
各ユーザが印字するジョブのプライバシを守りた
いと考えているならば, スプーリングディレクトリを保護し
て, これを誰からでもアクセスできないようにしたいと思う
かもしれません. スプーリングディレクトリは, deamon ユー
ザと daemon グループに所有され, 読み込み, 書き込み, 検
索可能であり, 他からはアクセスできないようにするべきで
す. 例題のプリンタに対して, 次のようにすることにしましょ
う.
&prompt.root; chown daemon.daemon /var/spool/lpd/rattan
&prompt.root; chown daemon.daemon /var/spool/lpd/bamboo
&prompt.root; chmod 770 /var/spool/lpd/rattan
&prompt.root; chmod 770 /var/spool/lpd/bamboo
最後に, /etc/printcap ファイルで,
これらのディ レクトリの位置を LPD に伝える必要があります.
スプーリ ングディレクトリのパス名は sd
項目で指定します.
#
# /etc/printcap for host rose - added spooling directories
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
:sh:sd=/var/spool/lpd/rattan:
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:sh:sd=/var/spool/lpd/bamboo:
プリンタ名が最初のカラムから始まっており, そのプリンタ
に関して記述される他のエントリは TAB で字下げされてい
ること, 各行がバックスラッシュで終わっていることに注意
してください.
sd
によりスプーリングディレクトリが指定されていな い場合,
スプーリングシステムは /var/spool/lpd
デフォルト値として使用します.
プリンタデバイスの特定
「ポート用エントリを /dev
に追加する」では, FreeBSD でプリン
タとの通信に使用される /dev
ディレクトリ内の エントリを特定します. そして, LPD
にその情報を伝えま す. 印字するジョブを受け取ると,
スプーリングシステムは,
(プリンタにデータを渡す義務がある) フィルタプログラムに
代わって指定されたデバイスをオープンします.
/etc/printcap ファイルで
lp 項目を使って
/dev エントリを記入します.
ここでの例では, rattan
は1番目のシリアルポートに, bamboo
は6番目のシリアルポートに接続されているこ とにしましょう.
このとき, /etc/printcap には
次のようになります.
#
# /etc/printcap for host rose - identified what devices to use
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
:sh:sd=/var/spool/lpd/rattan:\
:lp=/dev/lpt0:
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:sh:sd=/var/spool/lpd/bamboo:\
:lp=/dev/ttyd5:
/etc/printcap でプリンタの
lp 項目が指定 されていない場合は, LPD
はデフォルトとして /dev/lp
を使用します. /dev/lp は, 現在の
FreeBSD には存在していません.
設置したプリンタがパラレルポートに
接続されている場合は,
「
テキストフィルタのインストール」
まで読み飛ばしてください.
そうでない場合は, 次節の説明に続いてください.
スプーラのための通信パラメータの設定
シリアルポートにプリンタを接続した場合, プリンタにデー
タを送信するフィルタプログラムに代わり, 通信速度やパリ
ティ, その他のシリアル通信パラメータを設定することがで
きます. このことによる利点は,
/etc/printcap
を編集するだけで, 様々な
通信パラメータを試してみることができます. フィルタプロ
グラムを再コンパイルする必要はありません.
スプーリングシステムで, シリアル通信の設定が異
なっているかもしれない複数のプリンタに同じフィルタプロ
グラムを使うことが可能になります.
次の /etc/printcap の項目で,
lp で指定
されたデバイスのシリアル通信
パラメータを制御できます.
br#bps-rate
デバイスの通信速度を
bps-rate に設定します.
ここ で, bps-rate は 50,
75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400,
4800, 9600, 19200, 38400[bit/秒]
のいずれかです.
fc#clear-bits
デバイスをオープンした後で,
sgttyb 構造体の
clear-bits
フラグビットをクリアします.
fs#set-bits
sgttyb 構造体の
clear-bits
フラグビットをセッ トします.
xc#clear-bits
デバイスをオープンした後で, ローカルモードビット
clear-bits
をクリアします.
xs#set-bits
ローカルモードビット
set-bits
をセットします.
fc, fs,
xc, そして xs
のビットに関 する詳しい情報については,
/usr/include/sys/ioctl_compat.h
を参照してく ださい.
項目 lp で指定されたデバイスを LPD
がオープンする とき, LPD は sgttyb
構造体のフラグビットを読み出 します. そして, 項目
fc の全ビットをクリアします. 次に,
項目 fs のビットをセットし,
その結果を設定 します.
ローカルモードビットに関しても同様におこなわれます.
例題のプリンタで6番目のシリアルポートに接続されたプリ
ンタの設定を追加してみましょう. 通信速度は38400bpsに設
定します. フラグビットとして, TANDEM, ANYP, LITOUT,
FLUSHO, PASS8 をセットします. ローカルモードビットでは,
LITOUT と PASS8 フラグをセットします.
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:sh:sd=/var/spool/lpd/bamboo:\
:lp=/dev/ttyd5:fs#0x82000c1:xs#0x820:
テキストフィルタのインストール
ここまでで,
プリンタにジョブを送るために使うテキストフィ ルタを LPD
に設定する準備が整いました. テキストフィ
ルタとは,
入力フィルタとしても知られていますが,
印字するジョブがあるときに LPD が起動するプログラムで す.
LPD がプリンタのためにテキストフィルタを起動する とき, LPD
はフィルタの標準入力からプリントするジョブ を入力し,
フィルタの標準出力に項目 lp で指定され
たプリンタデバイスを接続します. フィルタは, 標準入力か
らジョブを読み込み, プリンタのための必要な変換をおこなった
後, その結果を標準出力に出力する, これにより印字がなさ
れることを期待されています. テキストフィルタについての
更に詳しい情報については, 「
フィルタはどのように機能しているか」
をご覧ください.
ここでの簡単なプリンタ設定では,
プリンタにジョブを送るため, /bin/cat
を実行するだけの簡単なシェルスクリプ トで間に合います.
FreeBSD に標準で付属している lpf
というフィルタでは, バックスペース文字を使っ
た下線引きの動作をおこなう文字ストリームをうまく扱うことが
できないプリンタのための代替処理をおこなってくれます.
もちろん,
他のどんなフィルタプログラムを使っても構いません.
フィルタ lpf については, 「テキストフィルタ
lpf」で詳しく説明します.
最初に, 簡単なテキストフィルタであるシェルスクリプト
/usr/local/libexec/if-simple
を作ってみましょ う.
次のテキストをお好みのテキストエディタでファイルに
書き込んでください.
#!/bin/sh
#
# if-simple - Simple text input filter for lpd
# Installed in /usr/local/libexec/if-simple
#
# Simply copies stdin to stdout. Ignores all filter arguments.
/bin/cat && exit 0
exit 2
そして, このファイルを実行可能にします.
&prompt.root; chmod 555 /usr/local/libexec/if-simple
LPD
にこのテキストフィルタを使うことを設定するためには,
/etc/printcap に
if 項目を使って指定しま す. これまでの
/etc/printcap の例のプリンタ 2台に,
このフィルタを加えてみましょう.
#
# /etc/printcap for host rose - added text filter
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
:sh:sd=/var/spool/lpd/rattan:\
:lp=/dev/lpt0:\
:if=/usr/local/libexec/if-simple:
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:sh:sd=/var/spool/lpd/bamboo:\
:lp=/dev/ttyd5:fs#0x82000e1:xs#0x820:\
:if=/usr/local/libexec/if-simple:
印字してみよう
簡単な LPD 設定も終わりにたどり着きました. 残念ながら,
設定はこれでおしまいというわけではありません. なぜなら,
さらに, 設定をテストし, すべての問題点を解決しなくては
ならないからです. 設定をテストするために, 何かを印字し
てみましょう. LPD システムで印字をするためには,
&man.lpr.1; コマンドを使います. このコマンドは, 印字する
ためのジョブを投入する働きをします.
&man.lpr.1; コマンドを
「
プリンタとの通信状況を調べる」で紹介した,
あるテスト用のテキストを生成してくれる
&man.lptest.1; プログラムと一緒に使うこともできます.
簡単な LPD
設定をテストするために:
次のように入力してください.
&prompt.root; lptest 20 5 | lpr -Pprinter-name
ここで, printer-name
は /etc/printcap
で指定したプリンタ名 (もしくはその別名) です. デフォルト
のプリンタを使用する場合は,
引数を付けないで
&man.lpr.1; を打ち込んでください. もう一度述べますが, ポス
トスクリプトを期待しているプリンタをテストするならば,
&man.lptest.1; を使う代わりに PostScript で書かれたプ
ログラムをプリンタに送ってください. プログラムを送るた
めには, プログラムをファイルに格納して, lpr
file
と打ち込みます.
PostScript プリンタの場合, 送信したプログラムによ
る結果が得られるでしょう.
&man.lptest.1; を使った場合は,
以下のような結果が見られるでしょう.
!"#$%&'()*+,-./01234
"#$%&'()*+,-./012345
#$%&'()*+,-./0123456
$%&'()*+,-./01234567
%&'()*+,-./012345678
更にプリンタをテストしたい場合は, (言語ベースのプリン
タのための) もっと大きなプログラムを送信するか, 引数を
変えて
&man.lptest.1; を実行します. 例えば, lptest
80 60 で それぞれ80文字の行を60
行生成します.
プリンタがうまく動かなかった場合は, 次の節, 「
トラブルシューティング」をご覧ください.
トラブルシューティング
&man.lptest.1; を使った簡単なテストをおこなった結果,
正しい出
力を得られずに, 以下に示すような出力が得られるかもしれ
ません.
しばらくしたら出力される, または,
紙の全体が出て こない
プリンタは上で示されたような印字を
おこなったのですが, しばら くして止まってしまい,
動かなくなってしまいました. 印字
された結果をプリンタから取り出すためには,
プリンタにある PRINT REMAINING ボタン, また は, FORM
FEED ボタンを押す必要があるようです.
この場合は,
おそらくジョブはプリントをする前に更にデー
タが送られてこないか待ち続けているのでしょう.
この問題を解決するためには, プリンタに FORM FEED
文字 (あるいは特定の必要な文字コード) を
送るテキストフィルタを使ってください.
プリンタ内部に残っ
たデータをプリンタにすぐに印字させるには, 普通は,
これ で十分です.
次のジョブが前のジョブの最終ページの中央の
どこかから印字を開始させないためにも,
紙の途中で印字の
ジョブが終了したかどうかを確認するのは有益です.
シェルスクリプト
/usr/local/libexec/if-simple
を次のように変更して, プリンタへジョブを送信した後に
FROM FEED 文字を印字させるようにします.
#!/bin/sh
#
# if-simple - Simple text input filter for lpd
# Installed in /usr/local/libexec/if-simple
#
# Simply copies stdin to stdout. Ignores all filter arguments.
# Writes a form feed character (\f) after printing job.
/bin/cat && printf "\f" && exit 0
exit 2
“階段効果”が現れた
次のような印字結果が得られた.
!"#$%&'()*+,-./01234
- "#$%&'()*+,-./012345
- #$%&'()*+,-./0123456
+ "#$%&'()*+,-./012345
+ #$%&'()*+,-./0123456
あなたは「階段効果」
の新たなる犠牲者になってしま いました. この原因は,
改行を表わすべき文字がなんであるか
の解釈が混乱していることにあります. UNIX
スタイルのオ ペレーティングシステムでは, 改行文字は
ASCII コード10 の line feed (LF)
の1文字が使われています. MS-DOS や OS/2などは ASCII
コード10の LF と, ASCII コード
13の文字 (carriage return または CR)
をペアで使います. (訳注:Machintosh では CR
のみで表現されています). 大抵のプリンタでは,
改行を表わすために MS-DOS の慣習にしたが
います.
FreeBSD で印字する場合, 印字したテキストは LF
文字だけ が使われていました. プリンタでは LF
文字を見つけると, 紙を1行分送り出しました. しかし,
次の文字を印字するた
めの紙の水平方向の位置は維持されました. すなわち, CR
文字が意味することは,
次の文字を印字する位置を紙の左端
に動かすことです.
FreeBSD
がプリンタに動作をして欲しいと思っている動作を
以下に示します.
プリンタが CR を受け取ったとき
CR 動作 (復帰) をおこなう
プリンタが LF を受け取ったとき
CR + LF 動作 (復帰, 改行) をおこなう
このように動作させるための方法が
いくつかあります.
これらの文字の解釈を変えるために, プリンタ
の設定スイッチかコントロールパネルを操作する方
法. どのようにして設定をするかはプリンタのマニュ
アルを参照してください.
FreeBSD 以外のオペレーティン
グシステムを切り替えて使う場合, CR と LF 文字
の解釈をそのオペレーティングシステムで使われて
いるようにプリンタを
再設定する必要がある
かもしれません. 以下に示す解決方法のいずれかを
選ぶのがよいかもしれませんね.
自動的に LF を CR+LF に変換してくれる
FreeBSD 用のシリアルドライバを入手する方法. も
ちろん, このドライバはプリンタ専用に接続される
シリアルポート
のみで動作します. この機能
を許可するためには,
/etc/printcap ファ
イルで対象プリンタの fs
項目で CRMOD ビッ トをセットします.
LF
文字の扱いを一時的に変更するためのエ
スケープコードをプリンタに送る方法.
プリンタ
がサポートしているかもしれないエスケープコード
については, プリンタのマニュアルを参照してくだ
さい. 適切なエスケープコードが見つかったら, 最
初にそのコードを送り, 次にプリントジョブを送信
するようにテキストフィルタを変更してください.
次に, Hewlett Packard 社の PCL
エスケープコー
ドに対応しているプリンタのためのテキストフィル
タの例を示します. このフィルタでは, プリンタ に
LF 文字を LF と CR の2文字として扱わせます.
その後に, プリンタにジョブを送ります. 最後に,
ジョブの最終ページの紙を排出するため, FROM FEED
文字を送ります. このフィルタは Hewlett Packard
社のほとんどすべてのプリンタで機能するは
ずです.
#!/bin/sh
#
# hpif - Simple text input filter for lpd for HP-PCL based printers
# Installed in /usr/local/libexec/hpif
#
# Simply copies stdin to stdout. Ignores all filter arguments.
# Tells printer to treat LF as CR+LF. Writes a form feed character
# after printing job.
printf "\033&k2G" && cat && printf "\f" && exit 0
exit 2
ホスト orchid にある
/etc/printcap の
例を以下に示します. ここには, 一番目のパラレル
ポートにプリンタ (Hewlett Packard LaserJet 3Si)
が一台接続されており, そのプリンタ名は
teak です.
#
# /etc/printcap for host orchid
#
teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
:lp=/dev/lpt0:sh:sd=/var/spool/lpd/teak:mx#0:\
:if=/usr/local/libexec/hpif:
訳注: LF を CR+LF
に置き換える cat コマンド
を作る方法も当然考えられます. そして, このコマ
ンドと, if-simple の cat の部分
を置き換えればよいわけです. 具体的にどのように
するかは, 読者への練習問題としましょう.
各行が重ね書きされてしまった
プリンタは紙送りをまったくしませんでした.
テキストすべての行
がある行の上で重ねて印字されてしまいました.
この問題は,
階段現象とは“正反対”な問題で, ほとんどま
れにしか起こりません. FreeBSDでは行末として扱われる
LF 文字が, 紙の左端に印字位置を復帰しますが,
紙送りはしな い CR 文字として扱われています.
プリンタの設定スイッチかコントロールパネルを
使って, LF と CR
の文字を次のような解釈をするようにしてください.
プリンタが受け取ったとき
プリンタがおこなう
CR
CR 動作 (復帰)
LF
CR + LF (復帰, 改行)
訳注: LF を CR+LF
に置き換える cat コマンドを作る方法
も当然考えられます. そして, このコマンドと,
if-simple の cat
の部分を置き換えればよいわけ です.
具体的にどのようにするかは, 読者への練習問題とし
ましょう.
プリンタが文字を紛失してしまう
印字しているのですが,
各行の2〜3文字が印字されません.
プリンタを動かせば動かすほど,
もっとたくさんの文字が紛 失されていき,
この問題は更に悪くなっていくかもしれませ
んでした.
この問題は,
シリアルポートを通してコンピュータから送ら
れてくるデータの速度に,
プリンタがついていけないことに 起因します
(この問題は, パラレルポートに接続されたプリ
ンタでは発生することはありません).
この問題を克服する 方法が2つあります.
プリンタが XON/XOFF のフロー制御をサポート
している場合は, 項目 fs で
TANDEM ビット をセットして, FreeBSD
にこの機能を使用させて ください.
プリンタがキャリアフロー制御をサポートして
いる場合は, 項目 fs で MDMBUF
ビットをセッ トして下さい. それから,
プリンタとコンピュータ
を接続しているシリアルケーブルがキャリアフロー
制御用に正しく配線されたものかどうかを確認して
ください.
プリンタがフロー制御をまったく
サポートしていな い場合は, 項目
fs の NLDELAY と TBDELAY,
CRDELAY, VTDELAY, BSDELA のいくつかのビッ
トを組み合わせて使い, プリンタへ送るデータの流
れに適当な遅延を加えてください.
プリンタは意味不明な
文字列を印字した
プリンタはランダムなゴミのように
見えるものを印字しまし たが,
意図したテキストは印字してくれませんでした.
この問題は, 通常,
シリアルポートに接続したプリンタでの
通信パラメータの誤りからくる前項とは別の症状です.
br 項目の通信速度と
fs と fc
項目のパリ ティビットの設定を共に調べてみてください.
また, プリン タでの設定が
/etc/printcap
ファイルで設定した
内容と一致しているかどうかも確認してください.
訳注: simple-if
のような単純なフィルタだけの状態で, 日
本語を含むテキストを印字しようとした場合にも,
シリアル ポート, パラレルポートの使用に関係なく,
このような症状 は見られます. 日本語プリンタの場合,
漢字コードそのもの
を送信しただけでその漢字を印字してくれるものは,
少なく とも訳者は見たことがありません.
漢字を印字するための制御
コードを別途送信するフィルタが必要となります.
また, そ のようなフィルタを使用していても,
そのフィルタが想定し
てる漢字コードと異なった文書を
プリントしようとしたとき もこのような症状は出ます.
もちろん, これはプリンタ用の
言語を持たないプリンタの話で, PostScript プリンタ
などにプレインテキストを送信しても, 日本語対応,
非対応 に関らず, 意味不明な文字列が印字される
(もしくは, 何も 印字されない) ことでしょう.
何も起きない
もしプリンタが何の動作もしないのであれば,
ハード的な問 題ではなく, 多分 FreeBSD
の中に問題があります.
/etc/printcap ファイルで,
デバッグしているプ リンタのエントリに
(lf 項目で) ログファイルを取るよ
うに設定を追加してください. 例えば, プリンタ
rattan 用のエントリの項目
lf は次のようになります.
rattan|line|diablo|lp|Diablo 630 Line Printer:\
:sh:sd=/var/spool/lpd/rattan:\
:lp=/dev/lpt0:\
:if=/usr/local/libexec/if-simple:\
:lf=/var/log/rattan.log
次に, もう一度印字をおこなってみます. そして,
発生したと思
われるエラーメッセージを見るためにログファイル
(上記の 例では,
/var/log/rattan.log)
を調べます. そこ で見られたメッセージを元に,
問題を解決してみてください.
項目 lf
が指定されていない場合, LPD はデフォルト
のログファイルとして
/dev/console を使います.
プリンタを使う
この節では, FreeBSD で設定したプリンタを使う方法について説明
します. ここでは, ユーザレベルでのコマンドを概説します.
&man.lpr.1;
印字をおこないます.
&man.lpq.1;
プリンタキューを調べます.
&man.lprm.1;
プリンタキューにあるジョブを削除します.
管理者用コマンド &man.lpc.8; もありますが,
これは 「プリンタを管理する」
に記
します. このコマンドは, プリンタやそのキューの制御のために用い
られます.
&man.lpr.1;, &man.lprm.1;, そして &man.lpq.1; の 3
コマンドは,
オプションをとり, これによって,
/etc/printcap のように操作の対象となる
プリンタやキュー
を指定します. これによって, 様々なプリンタに対してジョブを送る
, 取り消す, 調査することができます.
が使われなかった場
合は, これらのコマンドは
PRINTER 環境変数で指定されたプリンタ
を使用します.
そして, PRINTER 環境変数がなかった場合は, これ
らのコマンドはデフォルトのプリンタ
lp を使います.
以下では, デフォルトプリンタ
という用語が意味するプリンタ は, PRINTER
環境変数で指定されたプリンタ, もしくは, PRINTER
環境変数がない場合は, lp
という名前のプリンタです.
印字する
ファイルを印字するためには,
次のように入力してください.
&prompt.user; lpr filename ...
これにより,
入力されたファイルのそれぞれをデフォルトのプリンタ
から印字します. ファイル名が与えられなかった場合,
&man.lpr.1;
は標準入力から印字するデータを読み込みます. 例えば, 次のコマン
ドにより, ある重要なシステムファイルが印字されます.
&prompt.user; lpr /etc/host.conf /etc/hosts.equiv
印字させるプリンタを選択するためには,
次のように入力します.
&prompt.user; lpr -P printer-name filename ...
次の例では, プリンタ rattan に,
カレントディレクトリにあ
るファイルの詳細なリストを印字しています.
&prompt.user; ls -l | lpr -P rattan
上記の &man.lpr.1; コマンドではファイル名の指定がないので,
lpr は標準入力から印字するデータ,
この場合, ls -l
コマンドの出力, を読み込みます.
&man.lpr.1; コマンドでは,
出力の整形を制御したり, ファイル変換を
適用したり, 複数部数のコピーを作成したり, などといた様々な幅広
いオプションを受け付けることもできます.
詳細については,
「
その他の印字オプション」をご
覧ください.
ジョブの処理状況を調べる
&man.lpr.1; コマンドを使って印字をする場合, プリントしようと
するデータは “プリントジョブ”
と呼ばれる箱に一緒に置かれ, こ
れが LPD スプーリングシステムに送られます. プリンタにはそれぞ
れ, ジョブ用のキューがあり,
送られてきたジョブはあなたや他のユー
ザからの別のジョブと一緒にそのキューで並んで,
処理される順番を
待ちます.
プリンタは到着順にこれらのジョブの印字をおこないます.
デフォルトプリンタのキューの状態を表示するには,
&man.lpq.1; と入
力します. プリンタを指定するときは,
オプションを使い
ます. 例えば, 次のコマンド
&prompt.user; lpq -P bamboo
は, プリンタ bamboo
のキューの状態を表示します. この lpq
コマンドの出力結果の例を次に示します.
bamboo is ready and printing
Rank Owner Job Files Total Size
active kelly 9 /etc/host.conf, /etc/hosts.equiv 88 bytes
2nd kelly 10 (standard input) 1635 bytes
3rd mary 11 ... 78519 bytes
この例では, bamboo
のキューに3つのジョブがあることが分か ります.
最初のジョブはユーザ kelly からのものであり, “ジョ
ブ番号”9が割り当てられています.
プリンタのすべてのジョブには一意
なジョブ番号が付けられています. ほとんどの場合, このジョブ番号
は無視することができますが, ジョブをキャンセルするときにはこの
番号が必要になります. このことの詳細については, 「ジョブの削除
」をご覧ください.
ジョブ番号9のジョブは2つのファイルを処理します. すなわち,
&man.lpr.1;
のコマンドラインに複数のファイル名が与えられたときは,
1つのジョブとして扱われるのです. このジョブは, 現在, アクティ
ブジョブ (“Rank”
の欄の active という後に注目) になってい
ます. これは, プリンタからそのジョブが現在印字されているはずで
あることを意味しています. 2番目のジョブでは,
&man.lpr.1; コマン
ドに標準入力からデータが与えられています.
3番目のジョブはユー
- ザ mary から与えられました.
+ ザ mary から与えられました.
このジョブのサイズはとても大きくなっ
ています. 彼女がプリントしようとしたファイルのパス名はここで表
示させるには長すぎるため,
&man.lpq.1; コマンドはドットを3つだけ
表示しています.
&man.lpq.1; からの
出力で一番最初の行もまた有益な情報を与えていま
す. この行から, プリンタが現在何をしているか (あるいは, 少なく
とも LPD がプリンタが
していると思っていること) が分かります.
&man.lpq.1; コマンドは
オプションもサポートしています. こ
れにより,
詳しい情報が表示されます. lpq -l の実行例を次
に示します.
waiting for bamboo to become ready (offline ?)
kelly: 1st [job 009rose]
/etc/host.conf 73 bytes
/etc/hosts.equiv 15 bytes
kelly: 2nd [job 010rose]
(standard input) 1635 bytes
mary: 3rd [job 011rose]
/home/orchid/mary/research/venus/alpha-regio/mapping 78519 bytes
ジョブの削除
印字するようジョブを
送った後で印字を中断したくなったときは,
&man.lprm.1; コマンドで,
キューの中からそのジョブを削除することが
できます. 大抵の場合, アクティブジョブでさえも
&man.lprm.1; を使っ
て削除することができますが,
そのジョブの一部またはすべてが印字さ
れてしまうかもしれません.
デフォルトプリンタへのジョブを削除するためには, 最初に,
&man.lpq.1; を使ってそのジョブ番号を調べます.
すなわち, それから,
次のように入力して, ジョブを削除します.
&prompt.user; lprm job-number
特定のプリンタへのジョブを削除するときは,
オプション
を使ってそのプリンタを指定します.
例えば, プリンタ bamboo
のキューからジョブ番号
10のジョブを削除するには次のようにします.
&prompt.user; lprm -P bamboo 10
&man.lprm.1; コマンドには略記法がいくつかあります.
lprm -
あなたが (デフォルトプリンタへ)
送ったジョブをすべて削除し ます.
lprm user
ユーザ user が
(デフォルトプリンタへ) 送ったジョブ をすべて削除します.
他のユーザのジョブを削除できるのはスー パユーザだけです.
あなたは, あなた自身のジョブしか削
除することはできません.
lprm
ジョブ番号もユーザ名もシンボル
も指定されない
ときは, &man.lprm.1; は現在のアクティブジョブを, そのジョ
ブを送ったのがあなた自身であるときに限り, デフォルトプ
リンタから削除します. ただし, スーパユーザは任意のア
クティブジョブを削除することができます.
上記の略記法をデフォルトプリンタではなく
特定のプリンタに対して おこなうときは,
オプションでそのプリンタを指定するだけよ いのです. 例えば,
プリンタ rattan のキューへあなたが送っ
たジョブをすべて削除するためには次のようにします.
&prompt.user; lprm -P rattan -
ネットワーク環境で作業をしている場合, あるホストか
ら送られたプリンタジョブは, これを送ったホストで
&man.lprm.1; を
使った場合に限って,
これを削除することができます. 他のホストで
同じプリンタを使えたとしても,
このジョブを削除することはできま
せん.
次の例では, 他ホストからジョブを削除することを試みていま
す.
&prompt.user; lpr -P rattan myfile
&prompt.user; rlogin orchid
&prompt.user; lpq -P rattan
Rank Owner Job Files Total Size
active seeyan 12 ... 49123 bytes
2nd kelly 13 myfile 12 bytes
&prompt.user; lprm -P rattan 13
rose: Permission denied
&prompt.user; logout
&prompt.user; lprm -P rattan 13
dfA013rose dequeued
cfA013rose dequeued
その他の印字オプション
&man.lpr.1; コマンドには, テキストの整形や,
図や他のファイル形
式の変換, 複数部コピーの生成, ジョブの扱いなどをを制御すること
ができます.
この節では, これに関するオプションについて記してい
ます.
整形と変換に関するオプション
以下の &man.lpr.1; 用のオプションはジョブにおける
ファイルの
整形の制御に関するものです.
このオプションは, ジョブにプレイン
テキストが含まれない場合や
&man.pr.1; ユーティリティを使ってプレイ
ンテキストを整形する場合に用いてください.
次の例では, プリンタ
bamboo に (TeX 組版システムによる)
DVI ファイル
fish-report.dvi を印字しています.
&prompt.user; lpr -P bamboo -d fish-report.dvi
このオプションは,
ジョブに含まれるすべてのファイルに対して適用さ れます.
したがって, 1つのジョブに (例えば) DVI ファイルと ditroff
ファイルを混在させることはできません. その代わりに,
ファイルを 形式毎に別々のジョブに分け,
それぞれのジョブでその形式用の変換
オプションを使って印字してください.
と
を除くすべてのオプションを使用 するためには,
出力先プリンタ用の変換フィルタが必要です. 例えば,
オプションを使用するには, DVI
用の変換フィルタが必要 です. 詳細については, 「
変換フィルタ」で説明しています.
cifplot ファイルを印字します.
DVI ファイルを印字します.
FORTRAN プログラムを印字します.
plot のデータを印字します.
出力に対して, number
カラム分の字下げをおこないます.
number が省略されると,
8カラム分字下げされます.
このオプションはある変換フィルタと一緒の指定されたとき
のみに機能します.
と数字の間に空白を入れてはいけません.
制御文字を含む文字通りの
テキストデータを印字します.
ditroff (device independent troff) データ
を印字します.
-p
印字する前に &man.pr.1;
によってプレインテキストを整形し
ます. 詳細については &man.pr.1; をご覧ください.
&man.pr.1; コマンドにより生成されるヘッダを,
ファイル名の
代わりに title とする.
このオプションは,
と一緒に使ったときのみ機能する.
troff データを印字します.
ラスタのデータを印字します.
次の例では, &man.ls.1; の
マニュアルを美しく整形したものをデフォ
ルトプリンタで印字しています.
&prompt.user; zcat /usr/share/man/man1/ls.1.gz | troff -t -man | lpr -t
&man.zcat.1; コマンドで
&man.ls.1; のマニュアルのソースファイルの圧
縮を復元し, これを
&man.troff.1; コマンドに渡しています. これによ
り, ソースファイルが整形され, GNU troff の形式となります. そ
の結果は &man.lpr.1; に渡され,
LPD スプーラへジョブの要求が発せ
られます. &man.lpr.1; には
オプションが使われているため,
スプーラにて, GNU troff の形式からジョブを印字したときにデフォ
ルトプリントが解釈できる形式へと変換されます.
ジョブに関するオプション
以下のオプションは, &man.lpr.1; によって, そのジョブを特殊
な扱いにするよう LPD に指示するためのものである.
-# copies
ジョブに含まれるファイルのそれぞれを
1部だけ印字するの ではなく,
copies
部のコピーを生成させるものです. 管理者によっては,
プリンタの消耗を避け, コピー機による
複製を奨励するためにこのオプションの使用が禁止されてい
るかもしれません. これに関しては, 「
複数部のコピーの印字を制限する
」をご覧ください.
次の例では, デフォルトプリンタで
parser.c を3 部コピーし, 次に,
parser.h を3部コピーしています.
&prompt.user; lpr -#3 parser.c parser.h
-m
印字ジョブが完了した後で, メールを送ります.
このオプショ ンを付けると, LPD
システムはジョブの扱いが終了したと きに,
あなたのアカウントにメールを送ります. メールのメッ
セージには, ジョブが正常終了したのか, あるいは, 何か異
常があり, (しばしば)
その異常が何であったのかが書かれて います.
-s
印字ファイルをスプールディレクトリにコピーせず,
代わりに,
シンボリックリンクを作成するよう指示します.
印字させるジョブのサイズが大きいとき, このオプショ
ンを使うと便利かもしれません. このオプションにより,
スプー ルディレクトリの容量が節約されます (それに,
巨大なジョ
ブのお陰でスプールディレクトリのあるファイルシステムの
空き容量がなくなってしまうかもしれません). さらに,
LPD
がいちいちすべてのデータをコピーする必要がなくなりま
すので, 時間の節約にもなります.
ただし, 欠点もあります. LPD
はオリジナルのファイルを 直接参照するので,
印字が終了するまでそのファイルを変更
したり削除することができません.
リモートのプリンタで印字している場合, LPD は,
結局のところ, ローカルホストからリモートホストにファ
イルをコピーする必要があります. したがって,
オプ
ションはローカルのスプーリングディレクトリの
空き容量を 節約するだけで,
リモート側では節約されません. それに も関わらず,
このオプションはそれでも有用です.
-r
ジョブに含まれるファイルを,
スプーリングディレクトリに
ファイルをコピーした後に削除します. もしくは,
オプションと一緒に使われた場合は,
印字終了後に削除され ます.
このオプションの使用には十分注意して下さい.
ヘッダページ用オプション
以下のオプションにより,
ジョブのヘッダページに通常印字さ
れるテキストを
&man.lpr.1; に調整させることができます. 対象のプリ
ンタからヘッダページが出力されない場合は,
これらのオプションは
何の効力も持ちません.
ヘッダページの設定に関する情報については,
「
ヘッダページ」を参照してください.
-C text
ヘッダページに印字されるホスト名を
text に置き換 えます. なお,
ホスト名の場所には, 通常, ジョブの要求が
あったホストの名前が印字されます.
-J text
ヘッダページに印字されるジョブ名を
text に置き換 えます.
ジョブ名の場所には, 通常, ジョブの最初のファイ ル名,
または, 標準入力からデータが印字されたときは
stdinが印字されます.
-h
ヘッダページを出力を禁止します.
サイトによっ ては,
そのヘッダページの生成方法により, このオプション
の効果が現れないかもしれません. 詳細は, 「
ヘッダページ」をご覧ください.
プリンタを管理する
プリンタの管理者として, プリンタの設置, 設定,
そして, それ
らのテストをおこなう必要がありました.
&man.lpc.8; コマンドにより,
これまでとは別な管理方法がプリンタと対話的におこなわれます.
&man.lpc.8; により, 次のことが可能となります.
プリンタの起動, 停止をおこなう.
キューへの入力の許可, 禁止をおこなう.
それぞれのキューにあるジョブの順番を変更する.
最初に用語に関する注意をしておきます.
プリンタが停止してい るとは,
キューの中にあるどのジョブも印字されることがない状態
を言います. この状態においても,
ユーザはまだジョブの要求をおこなう ことができますが,
これらのジョブはキューの中で,
プリンタがスタートする状態になるまで,
あるいは, キューの内容が削除され
るまで待たされることになります.
キューが禁止状態にあるとは, (root
以外の) すべてのユーザが
プリンタにジョブを要求することができない状態のことを言います.
キューが許可状態にある場合は,
ジョブの入力が許可されます.
キューが禁止状態にある場合でも,
プリンタをスタートす
る状態にすることは可能です. この場合は,
キューが空になるまで,
キュー内のジョブの印字が続けられます.
一般的に,
&man.lpc.8; コマンドを使用するには root の権限を持って
いる必要があります. 一般のユーザも
&man.lpc.8; コマンドを使うこと
はできますが, プリンタの状態を取得することとハングしたプリンタ
を再スタートすることだけに使用が制限されています.
以下に,
&man.lpc.8; コマンドに関する説明の要約を述べます. ほとん
どのコマンドでは, 操作対象となるプリンタを指定するため
printer-name 引数を与えます.
printer-name の代わり
に all が与えられると, 操作は
/etc/printcap 内に
ある全プリンタに対しておこなわれることになります.
abort printer-name
現在のジョブをキャンセルし, プリンタを停止させます.
キュー が許可状態にある場合は,
ユーザはまだジョブを入力する ことができます.
clean printer-name
プリンタのスプーリングディレクトリから,
ジョブの古いファ イルを削除します. 状況によって,
とりわけ, 印字途中でエ ラーが発生していたり,
管理操作が頻発していた場合には,
ジョブで作られたファイルを LPDが完全に削除しないことが
あります. このコマンドでは, スプーリングディレクトリに
入っていないファイルを見つけ出し,
それを削除しています.
disable printer-name
キューに新しいジョブを入れることを禁止します.
プリンタ がスタート状態にあるときは,
キューに残っているジョブの 印字は続けられます. ただし,
キューが禁止状態にあったと しても, スーパーユーザ (root)
は常にジョブを入力するこ とができます.
このコマンドは,
新しいプリンタやフィルタを設置している
間に使用すると有用です. すなわち, キューを禁止状態にし
ておくと, root によるジョブのみが入力されます. そして,
その他のユーザは, テストが完了し,
enable コマン
ドでキューが再度許可状態になるまで, ジョブの入力はでき
なくなります.
down printer-name
message
プリンタをダウンさせます. これは,
disable をおこなっ
た後で, stop をおこなった場合と
等価になります.
message は, ユーザが
&man.lpq.1; コマンドでプリンタ
のキューの状態を調べたり, lpc status
でプリンタの
状態を調べたときに, プリンタの状況として表示されるメッ
セージです.
enable printer-name
プリンタのキューを許可状態にします.
ユーザはジョブの入 力ができるようになりますが,
プリンタがスタートの状態に なるまでは,
プリンタからは何も印字されません.
help command-name
command-name
コマンドのヘルプメッセージを表示しま
す. command-name
が指定されなかった場合は, 利用
できるコマンドの要約が表示されます.
restart printer-name
プリンタをスタートさせます. 通常のユーザは, LPD があ
る異常な状況でハングしたときに限り, このコマンドを使用
することができます. しかし, stop
または down コマンドにより,
停止状態にあるプリンタをスター トさせることはできません.
restart コマンドは,
abort の後に start
をおこなったことと同じになり ます.
start printer-name
プリンタをスタートさせます.
プリンタのキューにあるジョ
ブを印字することでしょう.
stop printer-name
プリンタを停止します. プリンタは,
現在のジョブを終了さ せ, そして,
キューにあるその他のジョブは印字しません.
プリンタが停止状態にあったとしても, まだ, 許可状態にあ
るキューに対して, ジョブを送ることができます.
topq printer-name
job-or-username
printer-name
のキューに対して, ジョブ番号
job のジョブ, または, ユーザ
username から送
られたジョブを置き換えて, キューの先頭に持ってきます.
このコマンドに関しては,
printer-name の代わりに
all
を使用することはできません.
up printer-name
プリンタをアップ状態にします. これの反対のコマンドが
down です. start
の次に enable をおこなっ
たことと等しくなります.
コマンドラインから上記のコマンドを入力すると,
&man.lpc.8; はこれ
を受け付けます. コマンドが入力されなかった場合は,
&man.lpc.8; は
対話モードに入り,
exit, quit,
または, ファイル終端
文字が入力されるまでコマンドの入力ができます.
プリンタ設定上級編
この節では, 特殊な形式のファイルを印字するためのフィルタ,
ヘッ ダページ, ネットワーク越しのプリンタへの印字, そして,
プリンタ 使用の制限や課金について説明しています.
フィルタ
LPD では, ネットワークプロトコル, キュー, アクセス制御, そ
して, 印字のためのその他の側面について扱いますが,
実際の 作業のほとんどは
フィルタ によっておこなわれています.
フィルタ は, プリンタと通信し,
プリンタのデバイス依存性や特殊な要求を扱 うプログラムです.
簡単なプリンタ設定では, プレインテキストのた
めのフィルタをインストールしました. このプレインテキストフィル
タは, ほとんどのプリンタで機能する極めて単純なものでした.
(「
テキストフィルタのインストール」を参照)
しかしながら, 形式変換やプリンタ課金, 特定のプリンタの癖,
など をうまく利用するためには,
フィルタがどのように機能するかという
ことを理解しておくべきです. これらの側面を扱うためには, 最終的
には, フィルタの責任であるからです. そして, これは悪い情報です
が, ほとんどの場合において,
あなた自身がフィルタを供給す
る必要があるということです. また都合のよいことには,
たくさんのフィルタが 一般的に利用できるということです.
もしフィルタがなかったとし ても, 普通は,
フィルタを作るのは簡単です.
FreeBSD にも, プレインテキストを印字させることができる
/usr/libexec/lpr/lpf
というフィルタが1つ付いています.
(このフィルタはファイルに含まれるバックスペースやタブを扱いま
す. また, 課金をすることもできますが, できることはこれだけしか
ありません.) いくつかのフィルタとフィルタの構成要素が FreeBSD
の ポート集にもあります.
この節で述べることは次の通りです.
「
フィルタはどのように機能しているか」では,
印字の過程におけ るフィルタの役割を概説します.
この節を読むことで, LPD がフィルタを使うときに,
“見えないところで”何が起こっている
かが理解できるでしょう. このことを知っておくと, プリン
タそれぞれに様々なフィルタをインストールしたときに遭遇
するかもしれない問題を予期したり, デバッグするときに役
立つでしょう.
LPD では, すべてのプリンタからデフォルトでプレインテ
キストを印字できることを期待しています. このことは, プ
レインテキストを直接印字できない PostScript (また
は他の言語用の) プリンタでは問題を引き起こします. 「
プレインテキストのジョブを PostScript
プリンタで印字する」 で,
この問題を克服する方法について述べます. PostScript
プリンタをお持ちの方は, この節をお読みになること
をお薦めします.
PostScript は様々なプログラムのための有名な出
力形式です. ある人たちは (著者自身を含めて) PostScript
のコードさえも直接書いてしまいます. しかし, PostScript
プリンタは高価です. 「非 PostScript プリンタで
PostScript をシミュレートする」では, PostScript
データを非 PostScript
プリンタに受けつけさせ, 印字させるために,
どのようにしてプリンタ用のテキストフィルタをさらに変更
すればよいのか, ということについて述べます. PostScript
プリンタを持っていない方は, この節をお読みになる
ことをお薦めします.
「
変換フィルタ」では, 図形や組版データといっ
た特定のファイル形式を, プリンタが理解できる形式へ変換
する作業を自動的におこなわせる方法について述べます. この節
を読むと, troff のデータを印字するには lpr
-t, または, TeX DVI を印字するには
lpr -d, ラスタイ
メージデータを印字するには lpr -v,
などといったよ
うにユーザが入力することができるようにプリンタの設定を
おこなうことができます. この節もお読みになることをお薦めし
ます.
「出力フィルタ」
では, あまり使われない LPD の機能のすべて, すなわち,
出力フィルタに関することが記述されています. ヘッダページ
(「
ヘッダページ」参照) を印字させていない場合は,
多分, この節は飛ばしても構わないでしょう.
「テキストフィルタ
lpf」では, lpf
についての説明が, ほぼ完全におこなわれています. これは
FreeBSD に付属するラ インプリンタ (または,
ラインプリンタのように動作するレー ザプリンタ) のための,
単純なテキストフィルタです. プレ
インテキストを印字したことに対して課金をおこなう方法が至急
必要な場合, もしくは, バックスペース文字を印字しようと
すると煙を発するプリンタを持っている場合は, 絶対に
lpf を検討するべきです.
フィルタはどのように機能しているか
既に言及したように, フィルタとは, プリンタにデータを送る
際に, デバイスに依存した部分を取り扱うために LPD
によって起動 される実行プログラムです.
LPD がジョブ中のファイルを印字しようとするとき, LPD
はフィル タプログラムを起動します. このとき,
フィルタの標準入力を印字す るファイルに,
標準出力をプリンタに, そして, 標準エラー出力をエ
ラーログファイル (/etc/printcap 内の
lf 項目で指 定されたファイル, または,
指定されていない場合は, デフォルトと して
/dev/console) にセットします.
LPD が起動するフィルタと, その引数が何であるかは,
/etc/printcap
ファイルの内容と, ジョブの起動時に
ユーザが指定した
&man.lpr.1; コマンドの引数に依存しています. 例え
ば, ユーザが lpr -t と入力した場合は,
LPD は出力先のプリ
ンタ用の tf 項目で指定されている troff
用のフィルタを起動
させるでしょう.
ユーザがプレインテキストの印字を指示したときは,
if で指定されたフィルタが
起動されるでしょう (このことはほ
とんどの場合にあてはまります.
詳細については, 「
出力フィルタ」をご覧ください).
/etc/printcap
で指定可能なフィルタは次の3種類がありま す.
テキストフィルタ
(LPD のドキュメントでは紛ら
わしいことに
入力フィルタと呼んでいますが) は一般の
テキストの印字を扱います. これはデフォルトのフィルタと
考えてください. LPD では, すべてのプリンタに対して, デフォ
ルトでプレインテキストが印字できることを期待しています.
さらに, バックスペースやタブを正しく扱い, また, 他の特
殊な文字が入力されてもプリンタに混乱を来さないようにす
るのはテキストフィルタの仕事であると考えています.
プリンタの使用に対して課金をしなくてはならない環境にあ
るときは, テキストフィルタが印字したページ数を数える作
業もしなくてはなりません. この作業は, 通常, 印字した行
数を数え, これをプリンタが1ページ当たりに印字できる行
数と比較することでおこなわれます.
テキストフィルタは, 次のような引数を付けて起動されます.
filter-name
-c
-wwidth
-llength
-iindent
-n login
-h host
acct-file
ここで,
lpr -l
によってジョブが入力されたときに与
えられます.
width
/etc/printcap
で指定された pw (page width)
項目の値が与えられます. デフォル トは,
132です.
length
pl (page length)
項目で指定された値が与え られます.
デフォルトは66です.
indent
lpr -i
によって与えられた字下げの量で, デ
フォルトは0です.
login
ファイルを印字したユーザのアカウント名が
与えら れます.
host
ジョブが入力されたホスト名が
与えられます.
acct-file
af
項目で指定されている課金データファイル
の名前が与えられます.
変換フィルタは,
特定のファイル形式をプリンタ
が紙に印字できるようなものに変換します. 例えば, プリン
タで ditroff 組版データを直接印字することはできません.
しかし, ditroff データをプリンタが消化し, 印字するこ
とができる形式へ変換するために, ditroff ファイル用フィ
ルタをインストールすることができます.
「
変換フィルタ」
で, これらに関するすべてについて説明します.
プリンタの課金をする必要がある場合は, 変換フィルタでも
印字ページを数える作業が必要となります.
変換フィルタは次の引数をとって起動されます.
filter-name
-xpixel-width
-ypixel-height
-n login
-h host
acct-file
ここで, pixel-width は,
px 項目で指定され
た値 (デフォルトは0),
pixel-height は,
py 項
目で指定された値 (デフォルトは0) です.
出力フィルタは,
テキストフィルタが指定されて
おらず, かつ, ヘッダページの出力が許可されている場合に
のみ使われます.
「
出力フィルタ」で, これらのことについて説明し
ます. アウトプットフィルタに対する引数は次の2つだけです.
filter-name
-wwidth
-llength
ここで, と は,
テキストフィルタの場合
と同じです.
フィルタは, 次に示すの終了状態をもってプログラムを
exit するべきです.
exit 0
フィルタがファイルを正常に印字した場合.
exit 1
フィルタはファイルの印字に失敗したが, LPD
に再度ファ イルの印字を試みて欲しい場合.
この終了状態で終了した場 合, LPD
はフィルタを再スタートします.
exit 2
フィルタはファイルの印字に失敗し, かつ, LPD
に再出力 を試みて欲しくない場合. この場合, LPD
はそのファイル を放棄します.
FreeBSD に付属するテキストフィルタ
/usr/libexec/lpr/lpf は, FROM FEED
文字が送られたと
きやプリンタ使用に対する課金をどのようにするかを
決定するために, ページ幅やページ長の引数を利用します. また,
課金用のエントリを 作成するため, ログイン名, ホスト名,
課金ファイル名の引数を利用 します.
もし, フィルタの購入を検討しているならば, LPD
と互換性がある かどうかを確認してください. もしそうならば,
上述の引数リストをサ ポートしていなければなりません.
一般向けの使用のためにフィルタ
を作成する計画をしている場合は,
同じ引数リストと終了コードをサ ポートしてください.
プレインテキストのジョブを PostScript プリン
タで印字する
コンピュータと PostScript (または, 他の言語に対応し た)
プリンタをあなたしか使用しない場合は, プリンタにプレ
インテキストを絶対に送らない, そして,
プリンタにプレインテキス
トを送りたがっている様々なプログラムの機能を決して
使わないこと にしてください. そうすれば,
この節に書かれたことに心を煩わせる必
要はまったくなくなります.
しかし, PostScript
とプレインテキストの両方のジョブをプリン
タへ送りたいと思っている場合は,
プリンタ設定についての要求が増 えるでしょう.
両者をプリンタへ送信するためには, 到着
したジョブがプレインテキストであるか PostScript であるかを
検出するテキストフィルタが必要です. PostScript のジョブは
すべて %!
で始まらなければならないことになっています
(他のプリンタ言語に関しては,
プリンタのドキュメントをご覧くだ さい).
ジョブの最初の2文字がこれならば, PostScript である
ことが分かります. したがって,
ジョブのそれ以降の部分をプリンタに直 接送ることができます
(訳注:PostScript では, %
以降はコメントとして扱われるので, 最初の %! の行を 読み捨てても問題はない).
最初の2文字が %! でない場
合は, フィルタはテキストを PostScript に変換し, その結果を
使って印字をおこないます.
この作業をどうやってやればよいのでしょうか.
シリアルポートにプリンタを接続した場合は,
lprps をインス
トールすることをお勧めします. lprps は
PostScript 用のフィルタで,
プリンタとの双方向通信をおこないます. このフィルタでは,
プリンタか らの冗長な情報を得ることで,
プリンタの状況を示すファイルが更新 されていきます.
したがって, ユーザや管理者は
(トナー残量少や
紙詰まりといった)
プリンタの状況を正確に知ることができます. しかし,
もっと重要なことは, psif
と呼ばれるプログラムが 含まれているということです.
このプログラムは, 入力されたジョブ
がプレインテキストかどうかを検出し, これを PostScript に変
換するために, textps
(lprps に付属する別のプログラ ム)
を呼び出します. そして, このジョブをプリンタに送るために,
lprps が使われます.
lprps は FreeBSD
のポート集に含まれています (「
ポートコレクション」を参照してください).
もちろん,自分自身でプログラムを取ってきて, コンパイルし,
インストールす ることもできます. lprps
をインストールした後は, lprps
の一部である psif
プログラムのパス名を指定する だけです. ポート集から
lprps をインストールしたときは,
/etc/printcap の中のシリアル接続した
PostScript プリンタのエントリに対して, 次を使ってください.
:if=/usr/local/libexec/psif:
LPD
にプリンタをリード・ライトモードでオープンさせるために,
rw 項目も指定すべきです.
パラレルポートに接続したプリンタの場合 (すなわち,
lprps が
必要としているプリンタとの双方向通信ができない),
テキストフィ
ルタとして次のシェルスクリプトを使うことができます.
#!/bin/sh
#
# psif - Print PostScript or plain text on a PostScript printer
# Script version; NOT the version that comes with lprps
# Installed in /usr/local/libexec/psif
#
read first_line
first_two_chars=`expr "$first_line" : '\(..\)'`
if [ "$first_two_chars" = "%!" ]; then
#
# PostScript job, print it.
#
echo "$first_line" && cat && printf "\004" && exit 0
exit 2
else
#
# Plain text, convert it, then print it.
#
( echo "$first_line"; cat ) | /usr/local/bin/textps && printf "\004" && exit 0
exit 2
fi
上記のスクリプトにおいて, textps
はプレインテキストから PostScript
へ変換するために別にインストールしたプログラム です.
テキストから PostScript へ変換するのには, お好みのどんなプロ
グラムでも使うことができます. FreeBSD の ポート集 (「ポートコレクション」
を参照してください) には, a2ps
と呼ばれるテキストから PostScript に変換するプログラムが
入っています.
訳注: 上記スクリプトでは,
先頭の行を読み込むために read を使っていますが,
困ったことに, read は読み込んだ文字列の先頭
の空白文字を取り除いてしまいます. 従って,
これらの空白文字は印 字されないことになり,
印字結果がファイルのイメージと異なる場合 が出てきます.
この事情は csh を利用した場合でも変わりません. 仮に,
先頭の空白文字を除去しない read コマンドを作ったとしても,
「echo $first_line」の $first_line
変数の内容をシェルが展開す る際に $first_line
の先頭の空白文字が失われるため, 問題の解決 にはなりません.
残念ながら, 訳者はこの問題をシェルプログラムだ
けで解決する方法をしりません. perl か C
言語の力を借りないと解 決できないと思います.
非 PostScript プリンタで PostScript
をシミュレートする
PostScript
は質の高い組版と印字をおこなうための事実
上の標準です. しかしながら, PostScript は,
高価な標 準です. ありがたいことに,
Alladin Enterprises から
Ghostscript と呼ばれる,
PostScript 互換の動作をするフリー
のプログラムが出されていて, FreeBSDで動きます. Ghostscript
はほとんどの PostScript ファイルを読むことができ, これらの
各ページをたくさんのブランドの非 PostScript プリンタを含む
様々なデバイス用に変換することができます. Ghostscript をイン
ストールし,
プリンタ用の特別なテキストフィルタを使うことによっ て, 非
PostScript プリンタをあたかも本物の PostScript
プリンタであるかのように動作させることができます.
Ghostscript はポート集に入っていますので,
そこからインストール することができます. また,
自分でソースプログラムを持ってきて, コンパイルし, インストー
ルすることもできます. この作業はとても簡単にできます.
PostScript プリンタをシミュレートさせる場合は,
テキストフィ ルタに PostScript
ファイルを印字しようとしているかどうかを 検出させます.
PostScript ファイルでない場合は, フィルタは
そのファイルを直接プリンタに送ります
(訳注:テキストファイルを直 接印字できない場合は, もちろん,
変換フィルタを通す必要がありま す). PostScript の場合は,
まず, Ghostscript を使い, ファ
イルをそのプリンタが理解できる形式へ変換します.
次の例のスクリプトは, Hewlett Packard DeskJet 500
プリンタ用 のテキストフィルタです.
他のプリンタで用いるときは,
引数を gs (Ghostscript)
コマンドに変えてくだ さい. (gs -h
と入力すると, 現在インストールされている Ghostscript
でサポートされているデバイスのリストが得られます).
#!/bin/sh
#
# ifhp - Print Ghostscript-simulated PostScript on a DeskJet 500
# Installed in /usr/local/libexec/hpif
#
# Treat LF as CR+LF:
#
printf "\033&k2G" || exit 2
#
# Read first two characters of the file
#
read first_line
first_two_chars=`expr "$first_line" : '\(..\)'`
if [ "$first_two_chars" = "%!" ]; then
#
# It is PostScript; use Ghostscript to scan-convert and print it
#
/usr/local/bin/gs -dSAFER -dNOPAUSE -q -sDEVICE=djet500 -sOutputFile=- - \
&& exit 0
else
#
# Plain text or HP/PCL, so just print it directly; print a form
# at the end to eject the last page.
#
echo "$first_line" && cat && printf "\f" && exit 0
fi
exit 2
最後に, if 項目を通して, LPD
にこのフィルタを教えてやる 必要があります.
:if=/usr/local/libexec/hpif:
これでおしまいです. lpr plain.text
とか lpr whatever.ps
と入力してみましょう. どちらも正常に印字されるは
ずです.
訳注: 日本語を印字する場合は,
日本語対応の Ghostscript が必要で す. 日本語対応版の
Ghostscript もポート集に入っているはずです.
変換フィルタ
「プリンタ設定導入編」
に書かれた簡単な設定が完了したら, 最初に, やってみたいと思
うことは, 多分(プレイン ASCII テキストに加えて)
好みのファイル形式
のための変換フィルタをインストールすることでしょう.
なぜ, 変換フィルタをインストールするのか?
変換フィルタによって, 様々な種類のファイルを印字するこ
とが簡単になります. 例えば, TeX
組版システムでたくさんの仕事 をしたと仮定しましょう.
そして, PostScript プリンタが接続 されているとします.
すると, TeX で DVI ファイルを作成する度に, DVI
ファイルを印字するために, これを PostScript ファイルに
変換する必要があります.
このコマンドは次のようになるでしょう.
&prompt.user; dvips seaweed-analysis.dvi
&prompt.user; lpr seaweed-analysis.ps
DVI ファイル用の変換フィルタがインストールしてあると,
LPD に 変換を肩代わりさせることで毎回毎回
おこなわなければならなかった面倒
な変換作業を省くことができます. つまり, DVI を生成したら,
次のような1回のコマンド入力だけで, これが印字されます.
&prompt.user; lpr -d seaweed-analysis.dvi
LPD に DVI ファイルの変換をさせるためには,
オプション を指定します.
変換オプションのリストは「
整形と変換に関するオプション」
に載せてあります.
変化のオプションのそれぞれをプリンタに
サポートさせるためには,
変換フィルタをインストールし,
そのパス名を /etc/printcap
の中で指定しなくてはなりません. 変換フィ ルタは,
プレインテキストを印字する代わりに, フィルタはファイル
をプリンタが理解できる形式に変換するところを除けば,
「プリンタ の簡単な設定」で説明したテキストファイル
(「
テキストフィルタのインストール」 を見て下さい)
に似ています.
どの変換フィルタをインストールすべきか?
使いたいと思う変換フィルタをインストールすべきです.
DVI のデータを頻繁に印字するならば, DVI 変換フィルタ
をインストールするのが適切でしょう. 印字しなくてはなら
ない troff を大量に抱えている場合は, 多分, troff フィ
ルタが欲しくなるはずです.
次の表は, LPD で動作するフィルタと,
/etc/printcap
ファイルでのエントリする項目, そして,
lpr
コマンドで呼び出す方法をまとめたもの です.
ファイル形式
/etc/printcap項目
lpr オプション
cifplot
cf
DVI
df
plot
gf
ditroff
nf
FORTRAN text
rf
troff
tf
raster
vf
プレインテキスト
if
なし, , または
先の例のように, lpr -d
を使うためには, 出力先の プリンタの
/etc/printcap 内のエントリで,
df
項目が必要であることが分かります.
反論はあるかも知れませんが, FORTRAN テキストや plot
のような形式は, 多分, 廃れ てていくでしょう.
あなたのサイトで, 自前のフィルタをイ ンストールするだけで,
プリントオプションのいくつか, あ るいは,
全部に新しい意味を与えることができます. 例えば,
Prinerleaf ファイル (Interleaf デスクトップパブリッシン
グプログラムによるファイル) を直接印字したいとします.
そして, Printerleaf 用の変換フィルタを
gf 項目で
指定したパスにインストールすれば, lpr
-g の意味 は“Printerleaf
ファイルを印字する”意味だとユーザに教
えることができます.
変換フィルタのインストール
変換フィルタは FreeBSD
の基本システムのインストールとは別
にインストールするプログラムなので, 変換フィルタは, 多 分,
/usr/local ディレクトリの下に置くべ
きです. フィルタは LPD だけが実行する特別なプログラム,
すなわち, 一般ユーザが実行する必要すらない
プログラムなので, /usr/local/libexec
ディレ クトリに置くのが普通です.
変換フィルタを使用可能にするためには,
/etc/printcap
の目的のプリンタの適切な項目に
フィルタがあるパス名を指定します.
DVI 変換フィルタをプリンタ bamboo
のエントリに加 えてみましょう. プリンタ
bamboo の df 項目を
新たに加えた/etc/printcap
ファイルの例を以下 に再掲します.
#
# /etc/printcap for host rose - added df filter for bamboo
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
:sh:sd=/var/spool/lpd/rattan:\
:lp=/dev/lpt0:\
:if=/usr/local/libexec/if-simple:
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:sh:sd=/var/spool/lpd/bamboo:\
:lp=/dev/ttyd5:fs#0x82000e1:xs#0x820:rw:\
:if=/usr/local/libexec/psif:\
:df=/usr/local/libexec/psdf:
DVI フィルタは
/usr/local/libexec/psdf という
名前のシェルスクリプトです. このスクリプトは次のように
なっています.
#!bin/sh
#
# psdf - DVI to PostScript printer filter
# Installed in /usr/local/libexec/psdf
#
# Invoked by lpd when user runs lpr -d
#
exec /usr/local/bin/dvips -f | /usr/local/libexec/lprps "$@"
このスクリプトでは, dvips
をフィルタモード (引数 ) で,
標準入力上で起動しています. 標準入力は印字 するジョブです.
それから, PostScript プリンタ用フィ ルタ
lprps (これについては「
プレインテキストのジョブを PostScript
プリンタで印字する」 を参照してください) を LPD
に与えられた引数を付けて起動 します.
lprps
はこれらの引数を印字されたページ分
の課金をおこなうために使われます.
変換フィルタのその他の例
変換フィルタのインストールには決まったステップがないの
で, その代わりに, 例をもっと挙げることにします. これを,
自分でフィルタを作る際のガイドにしてください. 適当な例が
あったら, それをそのまま使ってください.
次のスクリプト例は, Hewlett Packard LaserJet III-Si の
ための, raster (ええと・・実は, GIF ファイル) 用の変
換フィルタです.
#!/bin/sh
#
# hpvf - Convert GIF files into HP/PCL, then print
# Installed in /usr/local/libexec/hpvf
PATH=/usr/X11R6/bin:$PATH; export PATH
giftopnm | ppmtopgm | pgmtopbm | pbmtolj -resolution 300 \
&& exit 0 \
|| exit 2
ここでは, GIF ファイルから PNM (portable anymap) 形式
に変換し, 次に PGM (portable graymap) 形式に変換してか ら,
LaserJet/PCL-互換データに変換しています.
上記のフィルタを使うプリンタのためのエントリを付け加え
た /etc/printcap
ファイルは次のようになります.
#
# /etc/printcap for host orchid
#
teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
:lp=/dev/lpt0:sh:sd=/var/spool/lpd/teak:mx#0:\
:if=/usr/local/libexec/hpif:\
:vf=/usr/local/libexec/hpvf:
次のスクリプトは, PostScript プリンタ
bamboo のための groff 組版システムの
troff データのための変換 フィルタです.
#!/bin/sh
#
# pstf - Convert groff's troff data into PS, then print.
# Installed in /usr/local/libexec/pstf
#
exec grops | /usr/local/libexec/lprps "$@"
上記のスクリプトではプリンタとの通信をおこなうため,
lprps をまた利用しています.
プリンタがパラレルポー トに接続されている場合は, 代わりに,
次のスクリプトを使 うかもしれません.
#!/bin/sh
#
# pstf - Convert groff's troff data into PS, then print.
# Installed in /usr/local/libexec/pstf
#
exec grops
これで完成しました. 次に, フィルタを使用可能にするため
に /etc/printcap
に加える必要があるエントリを 示します.
:tf=/usr/local/libexec/pstf:
次の例をみたら, FORTRAN のベテランは赤面するかもしれ
ません. この FORTRAN テキストフィルタは, プレインテキ
ストを直接印字できるすべてのプリンタで利用できます. この
フィルタをプリンタ teak
にインストールすることに しましょう.
#!/bin/sh
#
# hprf - FORTRAN text filter for LaserJet 3si:
# Installed in /usr/local/libexec/hprf
#
printf "\033&k2G" && fpr && printf "\f" && exit 0
exit 2
そして, このフィルタを使用可能にするため, 以下の行を
/etc/printcap のプリンタ
teak のエントリ に加えます.
:rf=/usr/local/libexec/hprf:
これが最後の, そして, 若干複雑な例です. 前に紹介した
LaserJet プリンタ teak に, DVI
フィルタを加える ことにしましょう. 最初に,
簡単な部分をおこないます. すなわ ち, DVI フィルタの位置を
/etc/printcap に書 き加えます.
:df=/usr/local/libexec/hpdf:
さて, 難しい部分であるフィルタの作成をおこないます.
このた めに, DVI から LaserJet/PCL
への変換プログラムが必要 です. FreeBSD のポート集 (「ポートコレクション」
を参照してください) には, それがあ ります.
dvi2xx というのがそのパッケージの名前で
す. これをインストールすると, 必要なプログラム
dvilj2p が使えます. このプログラムは
DVI を LaserJet IIp, LaserJet III, そして LaserJet 2000
の互 換コードへ変換してくれます.
dvilj2p はフィルタ
hpdf を極めて複雑にしてい ます.
なぜなら, dvilj2p
は標準入力からデータを読 み込むことができないからです.
このプログラムを働かせる ためには, ファイル名が必要です.
もっと悪いことに, ファ イル名は .dvi
で終わっている必要があり, 標準入力 の代わりに,
/dev/fd/0 を使うのは問題がありま す.
この問題は, (.dvi で終わる)
一時的なファイル名 から/dev/fd/0 に
(シンボリックな) リンクを張る
ことで回避することができます. これで,
dvilj2p に 強制的に標準入力からデータを
読み込ませることができます.
もう1つの問題は, 一時的なリンクを張るために
/tmp ディ
レクトリを使うことができないという事実です. シンボリッ
クリンクはユーザ, グループが bin
であるユーザに所 有されています. フィルタはユーザ
daemon として起 動します. そして,
/tmp ディレクトリはスティッ
キービットが立っています. フィルタはリンクを作ることが
できます. しかし, リンクは別のユーザに所有されているた め,
作業が終了したとき, このリンクを削除することができ
ません.
その代わりに, シンボリックリンクは現在の作業ディレクト
リ, すなわち, スプーリングディレクトリ
(/etc/printcap の
sd 項目で指定する) に作 ることにします.
フィルタが作業するにはここの場所は完璧 な場所で, なぜなら,
特に, スプーリングディレクトリのディ スクの空き容量は
(ときどき) /tmp ディレクトリ
よりもたくさんあるからです.
以下に示すのが最後のフィルタです.
#!/bin/sh
#
# hpdf - Print DVI data on HP/PCL printer
# Installed in /usr/local/libexec/hpdf
PATH=/usr/local/bin:$PATH; export PATH
#
# Define a function to clean up our temporary files. These exist
# in the current directory, which will be the spooling directory
# for the printer.
#
cleanup() {
rm -f hpdf$$.dvi
}
#
# Define a function to handle fatal errors: print the given message
# and exit 2. Exiting with 2 tells LPD to do not try to reprint the
# job.
#
fatal() {
echo "$@" 1>&2
cleanup
exit 2
}
#
# If user removes the job, LPD will send SIGINT, so trap SIGINT
# (and a few other signals) to clean up after ourselves.
#
trap cleanup 1 2 15
#
# Make sure we are not colliding with any existing files.
#
cleanup
#
# Link the DVI input file to standard input (the file to print).
#
ln -s /dev/fd/0 hpdf$$.dvi || fatal "Cannot symlink /dev/fd/0"
#
# Make LF = CR+LF
#
printf "\033&k2G" || fatal "Cannot initialize printer"
#
# Convert and print. Return value from dvilj2p does not seem to be
# reliable, so we ignore it.
#
dvilj2p -M1 -q -e- dfhp$$.dvi
#
# Clean up and exit
#
cleanup
exit 0
自動変換: その他の変換フィルタ
ここまでに述べてきたフィルタによって, 印字環境の能率が
上がったことと思います. しかし, これはどのフィルタを使
うかを ( &man.lpr.1; のコマンドライン上で) ユーザが指定しな
くてはならないという代価を支払って実現されています. コ
ンピュータの事情にあまり詳しくないユーザにとって, フィ
ルタのオプションを指定させられるということはいらいらさ
せられるものになるでしょう. 更に悪いことに, 間違ったフィ
ルタオプションを指定されると, 間違った形式のファイルが
そのフィルタに適用されることになり, その結果, 何百枚も
の紙を掃き出すことになるかもしれません.
そのような結果になるならば, 変換フィルタをインストール
するよりもむしろ, テキストフィルタ (これがデフォルトフィ
ルタなので) に印字するよう要求されたファイルの形式を検
出させ, 自動的に, 適切な変換フィルタを起動するようにし
たいと思うかもしれません. ここでは file
コマンド のようなツールを役立たせることができます.
もちろん, いくつかの
ファイル形式の違いを見分けることは難しい ことでしょう.
そして, もちろん, それらのファイルに対し ては,
変換フィルタを提供するだけで済ますこともできるの
です.
FreeBSD のポート集には, apsfilter
と呼ばれる自 動変換をおこなうテキストフィルタがあります.
このフィルタは プレインテキスト, PostScript, DVI
ファイルを検 出し, 適当な変換をおこなった後,
データを印字することができ ます.
出力フィルタ
LPD スプーリングシステムでは,
ここまでにまだ取り上げていな いフィルタ形式,
出力フィルタをサポートしています. 出力 フィルタは,
テキストフィルタのように, プレインテキスト
のみを印字するために意図されたものですが, 非常に簡単化
されています. テキストフィルタを用いずに, 出力フィルタ
を使っている場合は, 次のようになります.
LPD はジョブ中の各ファイルに一度ではなく, ジョブ
全体に対して一度だけ出力フィルタを起動します.
LPD は出力フィルタに対し, ジョブ中のファイルの先
頭や末尾を特定するための対策を一切
おこなっていません.
LPD はユーザのログイン名やホスト名をフィルタに渡
しません. したがって, 課金の処理をおこなうことは考えてい
ません. 実際, 出力フィルタには, 以下2つの引数しか与え
られません.
filter-name
-wwidth
-llength
ここで, width
は対象となるプリンタの pw 項 目,
length は
pl 項目に指定された数です.
出力フィルタの簡便さに誘惑されてはいけません. もし, ジョ
ブ中のそれぞれのファイルに別のページ番号を付加しようと
しても,
出力フィルタはうまく動作しないでしょう.
そのような動作を期待しているならば, (入力フィルタとし
ても知られている) テキストフィルタを使ってください. 詳
しくは, 「
テキストフィルタのインストール」をご覧ください.
さらに, 出力 フィルタは, 実のところ,
もっと複雑になっています. まず,
特殊なフラグ文字を検出するために, フィルタに送ら
れてくるバイトストリームを検査する必要があります. また, LPD
に代わって, 自分自身にシグナルを送らなければなりま
せん.
しかしながら, ヘッダページの印字をおこないたい場合,
また,
エスケープシーケンスやヘッダページを印字できるようにす
るその他の初期化文字列を送信する必要がある場合, 出力ファ
イルが必要です.
1台のプリンタに対し, LPD では出力フィルタとテキスト,
または, 他のフィルタを両方使うことができます. このよう
な場合, LPD はヘッダページ (「
ヘッダページ」 を参照してください)
だけを印字させるために, 出 力フィルタを起動させます.
それから LPD では, アウトプッ トフィルタに2バイトの文字
(ASCII 031 の次に ASCII 001) を送ることで,
出力フィルタが自力で停止することを
期待しています. 2バイト (031, 001) が出力フィルタに送られ
たとき, 出力フィルタは自分自身にシグナル SIGSTOP を送
ることによって停止するべきです. LPD がその他のフィル
タの起動を完了したとき, LPD は出力フィルタにシグナル
SIGCONT を送ることで, 出力フィルタを再起動させます.
出力フィルタがあり,
テキストフィルタがない場合, LPD
はプレインテキストのジョブをおこなう際に, 出力フィル
タを使います. 前述したように, 出力フィルタでは, ジョブ
中の各ファイルの並びの間に FROM FEED 文字や紙を排出す
る他の文字を入れることはしません. この動作は多分, あな
たが求めているものとは
異なっているでしょう. ほと
んどすべての場合において, テキストフィルタが必要とされる
はずです.
プログラム lpf は,
テキストフィルタの項で既に紹介 しましたが,
出力フィルタとしても動作させることができま す. もし,
簡便で極悪な出力フィルタが必要で, かつ, バイ
トストリームを検査したりシグナルを送るコードを書きたく
ないときには, lpf をお試しください.
あるいは, プ リントが要求する初期化コードを送るために,
lpf を
シェルスクリプトに包んで使うこともできます.
テキストフィルタ lpf
プログラム /usr/libexec/lpr/lpf は,
FreeBSD の バイナリ配布に付属しているテキストフィルタ
(入力フィル タ) で, 出力を字下げしたり (lpr
-i でジョブが入力さ れたとき),
文字を未処理のままプリンタに送ったり (lpr
-l でジョブが入力されたとき), ジョブ中のバッ
クスペースやタブの印字位置を調節したり, 印字したページ
に対して課金したりすることができます. また, このフィル
タは出力フィルタとしても動作させることができます.
lpf
は多くの印字環境において使用することに適して います.
このフィルタには, プリンタに初期化文字列を送る
機能はありませんが, 必要とされる初期化をおこない, それから
lpf
を実行させるためのシェルスクリプトを作成する
のはたやすいことです.
lpf に対して,
印字ページへの課金を正確におこなわせる ためには,
/etc/printcap ファイルの中の
pw と pl
の項目に正確な値を入れておく必要が あります. これらの値は,
どのくらいの量のテキストがペー ジにフィットするか, また,
ユーザのジョブが何ページある のかを調べるために使われます.
プリンタの課金についての 詳しい情報については, 「
プリンタの利用に対する課金」をご覧ください.
リモートプリンタからの出力
FreeBSD では, ネットワーク越しの印字, すなわち, ジョブをリ
モートプリンタに送ることをサポートしています. リモートプリンタ
からの出力をするには, 一般に, 次の2つを参照してください.
リモートホストに接続されたプリンタにアクセスする方 法.
プリンタがあるホストのシリアル, または, パラレルイ
ンタフェースに接続されている場合, ネットワーク上の他の
ホストからこのプリンタにアクセスできるように LPD を設
定します. 「リモートホストに
接続されたプリンタ」
でどのよう にするかを説明します.
ネットワークに直接接続されているプリンタにアクセ
スする方法. プリンタに, 旧来のシリアル, または, パラレ
ルインタフェースに加えて (もしくは, これらに代わって) ネッ
トワーク用のインタフェースがある場合. そのようなプリン
タは次のように動作するでしょう.
そのプリンタが LPD のプロトコルを理解でき, リモー
トホストからのジョブを
キューに入れることさえできる場合. この場合,
プリンタは, LPD が起動している一般のホスト
のように振る舞います. そのようなプリンタを設定するため
に, 「
リモートホストに接続されたプリンタ」
と同様の手 順をおこなってください.
そのプリンタが, データストリームによるネットワー
ク接続をサポートしている場合. この場合, ネットワーク上
の1つのホストとしてプリンタを“接続”します.
このホス トは, ジョブをスプーリングする責任を負い,
スプーリング されたジョブはプリンタに送られます.
そのようなプリンタ
をインストールするためのいくつかの提案が「
ネットワークにおけるデータストリームの
インタフェースを持つプリンタ」にあります.
リモートホストに接続されたプリンタ
LPD スプーリングシステムでは LPD (または LPD 互換のシス
テム)
が起動している他のホストへジョブを送る機能が始めからサポー
トされています. この機能により,
あるホストに接続されたプリンタ へ,
他のホストからアクセスできるようになります. また, LPD プ
ロトコルを理解するネットワークインタフェースを持った
プリンタに 対しても, この機能は働きます.
リモートプリンタへの出力を許可するためには, 最初に,
あるホスト (これを,
プリンタホストと呼びます)
にプリンタを接続します. そして, 「 プリンタ設定導入編」
に書かれた簡単なプリンタの設定をおこなってください.
必要ならば, 「プリンタ設定上級編」
にあ る, 更に進んだ設定をおこなってください. そして,
そのプリンタをテス トしてうまく動作することを確認し, LPD
に許可した機能がうまく働 くかどうかを見てください. さらに
ローカルホスト が
プリンタホスト の LPD サービスの使用を
許可されているか確認して 下さい (「
リモートホストからのプリンタの利用を制限する
」参照).
LPD
互換のネットワークインタフェースを持つプリンタを使用してい
る場合は, そのプリンタ自身が以下で説明する
プリンタホスト になります. そして,
プリンタ名とは, そのプリンタに設定し
た名前のことを指します. これについては, プリンタ, および
(また は),
プリンタのネットワークインタフェースに付属するドキュメン
トを参照してください.
次に,
そのプリンタにアクセスしたいと思っている他ホストにおいて,
そのホストの /etc/printcap
ファイルに次にあげるエント リを作ります.
名前のエントリ. どんな名前でもよいのですが, 簡単
のため, 多分, プリンタホストで設定されたプリンタ名や別
名と同じものを使いたいと思うでしょう.
lp
項目で指定されるデバイスは明示的に空にす る
(:lp=: とする).
スプーリングディレクトリを作成し,
sd 項目で その位置を指定する. LPD
では, プリンタホストにジョブ を送信するまでの間,
このディレクトリにジョブを格納しま す.
rm
項目でプリンタホストの名前を指定します.
rp 項目で
プリンタホスト に接続したプリン
タ名を指定します.
これで終わりです.
変換フィルタやページの大きさやその他の事項を
/etc/printcap
に加える必要はありません.
次に,
リモートホストに接続されたプリンタで印字するための設定例
を示します. ホスト rose には2台のプリンタ
bamboo と rattan
が接続されています. これらのプリンタをホスト orchid
のユーザが使えるようにしましょう. 最初に
orchid の
/etc/printcap を示します
(このファイルは, 「
ヘッダページの出力を許可する」
で参照することができます). このファイルには, 既に, プリンタ
teak 用のエントリがありました. 以下では,
これに,
ホスト rose
にある2台のプリンタ用のエントリが加えられ ています.
#
# /etc/printcap for host orchid - added (remote) printers on rose
#
#
# teak is local; it is connected directly to orchid:
#
teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
:lp=/dev/lpt0:sd=/var/spool/lpd/teak:mx#0:\
:if=/usr/local/libexec/ifhp:\
:vf=/usr/local/libexec/vfhp:\
:of=/usr/local/libexec/ofhp:
#
# rattan is connected to rose; send jobs for rattan to rose:
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
:lp=:rm=rose:rp=rattan:sd=/var/spool/lpd/rattan:
#
# bamboo is connected to rose as well:
#
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:lp=:rm=rose:rp=bamboo:sd=/var/spool/lpd/bamboo:
orchid
で必要となる作業はスプーリングディレクトリを
作ることだけです.
&prompt.root; mkdir -p /var/spool/lpd/rattan /var/spool/lpd/bamboo
&prompt.root; chmod 770 /var/spool/lpd/rattan /var/spool/lpd/bamboo
&prompt.root; chown daemon.daemon /var/spool/lpd/rattan /var/spool/lpd/bamboo
これで, orchid のユーザが
rattan と bamboo で印字す
ることができるようになりました.
例えば, orchid のユーザが次の
ように入力したとします.
&prompt.user; lpr -P bamboo -d sushi-review.dvi
すると, orchid の LPD システムは, ジョブをスプーリングディレ
クトリ /var/spool/lpd/bamboo
にコピーし, これが DVI
ファイルを印字するジョブであることを記録します.
ホスト rose の
bamboo
用のスプーリングディレクトリに十分な容量が確保でき
次第, 両者の LPD は, ジョブのファイルを rose に転送します. こ
のファイルは, そのすべてが印字されるまで, rose
のキューに留まり
ます. (bamboo は PostScript プリンタなので) DVI から PostScript
への変換は rose でおこなわれます.
ネットワークにおけるデータストリームのインタ
フェースを持つプリンタ
プリンタのネットワークインタフェースカードは, 2種類に分
類することができます. 1つはスプーラをエミュレートするもの
(高価) で, もう 1
つはシリアルやパラレルポートを使うようにプリンタにデー
タを送ることができるだけのもの (安価) です. この節では,
後者の使 い方を説明します. 前者のプリンタは, 前節「
リモートホストに接続されたプリンタ」
の方法が適用できます.
/etc/printcap ファイルでは,
シリアルかパラレルのイン タフェースのどちらを使うのか,
そして, (シリアルインタフェース を使う場合)
そのボーレートはいくらであるか, フロー制御は使うのか,
タブのための遅延を加えるのか,
改行文字を変換するかなどの指定を おこなうことができます.
しかし, TCP/IP や他のネットワークポートか
らデータを受け取るプリンタを接続するための
指定をおこなうことはでき ません.
ネットワーク接続されたプリンタにデータを送るためには,
テキスト フィルタと変換フィルタから呼び出すことができる
通信プログラムを 開発する必要があります. 以下に,
そのようなプログラムの例を示し ます. スクリプト
netprint では, 標準入力から印字データを
すべて受け取り,
ネットワーク接続されたプリンタにこれを送ります.
netprint
の最初の引数でプリンタのホスト名を, 2番目の引数
で接続するポート番号を指定します.
このプログラムでは単方向通信 (FreeBSD からプリンタ)
のみをサポートしていることに注意してくだ さい.
ネットワークプリンタの多くは双方向通信をサポートしていま
すので, その恩恵 (プリンタの状態を得たり,
課金をおこなうなど) にあず かりたいと思われるかもしれません.
#!/usr/bin/perl
#
# netprint - Text filter for printer attached to network
# Installed in /usr/local/libexec/netprint
#
$#ARGV eq 1 || die "Usage: $0 <printer-hostname> <port-number>";
$printer_host = $ARGV[0];
$printer_port = $ARGV[1];
require 'sys/socket.ph';
($ignore, $ignore, $protocol) = getprotobyname('tcp');
($ignore, $ignore, $ignore, $ignore, $address)
= gethostbyname($printer_host);
$sockaddr = pack('S n a4 x8', &AF_INET, $printer_port, $address);
socket(PRINTER, &PF_INET, &SOCK_STREAM, $protocol)
|| die "Can't create TCP/IP stream socket: $!";
connect(PRINTER, $sockaddr) || die "Can't contact $printer_host: $!";
while (<STDIN>) { print PRINTER; }
exit 0;
このスクリプトは,
様々なフィルタが利用することができます. 仮に, Diablo 750-N
ラインプリンタを持っており, これがネットワークに
接続されているとしましょう.
プリンタはポート番号5100にて印字す るデータを受け取ります.
プリンタのホスト名は scrivener としま す. このとき,
このプリンタのテキストフィルタは次のようになりま す.
#!/bin/sh
#
# diablo-if-net - Text filter for Diablo printer `scrivener' listening
# on port 5100. Installed in /usr/local/libexec/diablo-if-net
#
exec /usr/libexec/lpr/lpf "$@" | /usr/local/libexec/netprint scrivener 5100
プリンタの利用に制約を与える
本節では, プリンタの利用に制約を与えるための情報を記して
います. LPD システムでは, プリンタ (ローカル, リモートのいずれ
に接続されていても) にアクセスできる人を制限する機能, 複数部の
コピーの印字の可否を制御する機能, ジョブのサイズの最大値やプリ
ンタキューに入るジョブの最大個数を制御する
機能を提供しています.
複数部のコピーの印字を制限する
LPD
システムではユーザが複数部のコピーの印字を簡単におこなう
機能を提供しています. ユーザが, (例えば) lpr
-#5 コマ ンドを使ってジョブを印字すると,
ジョブのそれぞれのファイルのコ ピーを5部得ることができます.
これがよい機能であると思うかどう
かは人それぞれでしょう.
複数部のコピーの印字によってプリンタが
必要以上に消耗してしまう
と感じるならば, /etc/printcap
ファイルに sc 項
目を加えてください. これにより,
&man.lpr.1; の オプションの使用
が禁止されます. このオプションが指定されているにも関らず,
オプションを使うと,
次のようなメッセージが表示され,
このオプションの利用できない旨を伝えます.
lpr: multiple copies are not allowed
リモートホストからプリンタをアクセスできる
設定にしている場合 (この 設定については, 「
リモートホストに接続されたプリンタ」
をご覧ください), その リモートホストの
/etc/printcap にも同じように
sc
項目を追加する必要があることに注意してください.
そうしないと, ユーザは別なホストから複数部のコピーの
印字することができてしま います.
例を使って説明しましょう. 次に示す
/etc/printcap ファ イルは, ホスト
rose のものです. プリンタ
rattan は極めて 頑丈なので,
複数部のコピーの印字は許可されています. しかし, レー
ザプリンタの bamboo
はもう少しデリケートで, このプリンタ
から複数部のコピーを印字することを sc
項目を追加すること で禁止しています.
#
# /etc/printcap for host rose - restrict multiple copies on bamboo
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
:sh:sd=/var/spool/lpd/rattan:\
:lp=/dev/lpt0:\
:if=/usr/local/libexec/if-simple:
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:sh:sd=/var/spool/lpd/bamboo:sc:\
:lp=/dev/ttyd5:fs#0x82000e1:xs#0x820:rw:\
:if=/usr/local/libexec/psif:\
:df=/usr/local/libexec/psdf:
さらに, orchid の /etc/printcap
にも sc 項目を
追加する必要があります (orchid
でこの編集をおこなっているときに, つ いでに, プリンタ
teak でも複数部のコピーの印字を禁止する
ことにしましょう).
#
# /etc/printcap for host orchid - no multiple copies for local
# printer teak or remote printer bamboo
teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
:lp=/dev/lpt0:sd=/var/spool/lpd/teak:mx#0:sc:\
:if=/usr/local/libexec/ifhp:\
:vf=/usr/local/libexec/vfhp:\
:of=/usr/local/libexec/ofhp:
rattan|line|diablo|lp|Diablo 630 Line Printer:\
:lp=:rm=rose:rp=rattan:sd=/var/spool/lpd/rattan:
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:lp=:rm=rose:rp=bamboo:sd=/var/spool/lpd/bamboo:sc:
sc 項目を指定することにより,
lpr -# の使用を防
ぐことができます. しかし, この状態では
&man.lpr.1; を複数回起動し
たり, 1回のジョブで次のように同じファイルを
複数個指定すること
を防ぐまでには至っていません.
&prompt.user; lpr forsale.sign forsale.sign forsale.sign forsale.sign forsale.sign
このような悪用を防ぐ方法は
(その指示を無視することも含めて) たく さんあります.
各自で調べてみてください.
プリンタを使用できる人を限定する
それぞれのプリンタを使用できる人を限定するには, UNIX の
グループ権限のメカニズムを利用し, さらに,
/etc/printcap で rg
項目を指定することでおこないます.
あるプリンタにアクセスさせてもよいと思うユーザすべてを
UNIXのある グループに入れてください. そして,
そのグループ名を rg で 指定します.
このとき, そのグループに含まれないユーザ
(root も含む) が
rg
の指定がされたプリンタを使用すると, 次のようなメッセー
ジが表示され, プリンタの使用はできません.
lpr: Not a member of the restricted group
sc (suppress multiple copies :
複数部のコピーの印字を禁止
する) を指定するときと同様に, rg
が指定されたプリンタがリ
モートホストからもアクセスでき
(この設定については,
「
リモートホストに接続されたプリンタ」
をご覧ください), かつ, そ
のホストでもプリンタを使用できる人を限定するのが
妥当であると思
う場合は, そのホストの
/etc/printcap にも
rg 指
定をおこなう必要があります.
例えば, プリンタ rattan
は誰でも利用できるが, bamboo はグループ
artists に属している人のみが利用で
きるようにしてみましょう. 以下に, もうお馴染みとなったホスト
rose の /etc/printcap
を示します.
#
# /etc/printcap for host rose - restricted group for bamboo
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
:sh:sd=/var/spool/lpd/rattan:\
:lp=/dev/lpt0:\
:if=/usr/local/libexec/if-simple:
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:sh:sd=/var/spool/lpd/bamboo:sc:rg=artists:\
:lp=/dev/ttyd5:fs#0x82000e1:xs#0x820:rw:\
:if=/usr/local/libexec/psif:\
:df=/usr/local/libexec/psdf:
これ以外の /etc/printcap ファイル
(ホスト orchid のもの)
はそのままにしておくことにします. もちろん,
orchid のユーザは 全員
bamboo を利用することができます. これは,
orchid に
は特定のユーザのみにしかアクセスさせておらず,
そのユーザにはプ
リンタを利用させたいと思っているからなのかもしれませんし,
そう でないかもしれません.
1台のプリンタを複数グループのユーザに利用させること
はできません.
入力可能なジョブのサイズを制限する
たくさんのユーザからプリンタが利用される場合には, 多分,
ユーザが印字要求を出すことができるファイルのサイズに
上限値を置 く必要が生じるでしょう. 結局のところ,
スプーリングディレクトリ
が置かれているファイルシステムの空き容量がその
上限値になる訳で すが,
あるユーザがこれを独占的に使用すること避けるために, 他ユー
ザからのジョブ用の空き容量を確保する必要もあります.
LPD では, mx
項目を指定することにより, ジョブ中の個々のファ
イルのサイズの上限値を制限する機能を提供しています.
指定される ファイルサイズの単位は BUFSIZ ブロックで, 1
BUFSIZ ブロックは 1024バイトを表わします. この mx 項目の値として0が指定される と,
ファイルサイズの制限はなくなります.
この制限はジョブ中の各
ファイルに対して適用されるものであり,
ジョブ全体のサイズ
を制限するものではありません.
ところで,
プリンタに設定された上限値を超えるファイルサイズのファ
イルが入力された場合でも, LPD はこれを拒否しません. その代わ
りに, このファイルは,
その先頭から上限値のファイルサイズまでし
かキューに入れられません. そして, その部分までが印字され,
残り の部分は捨てられます.
これが正しい動作といえるのかどうかは議
論の余地があるところです.
それでは, 設定例に登場しているプリンタ
rattan と bamboo
の印字可能なファイルサイズに制限を加えてみましょう. artists
グループの人達が作る PostScript ファイルのサイズは
巨大になる傾向があるので, 上限値を5Mバイトとします.
それから,
プレインテキスト用のラインプリンタは無制限とします.
#
# /etc/printcap for host rose
#
#
# No limit on job size:
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
:sh:sd=/var/spool/lpd/rattan:\
:lp=/dev/lpt0:\
:if=/usr/local/libexec/if-simple:
#
# Limit of five megabytes:
#
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:sh:sd=/var/spool/lpd/bamboo:sc:rg=artists:mx#5000:\
:lp=/dev/ttyd5:fs#0x82000e1:xs#0x820:rw:\
:if=/usr/local/libexec/psif:\
:df=/usr/local/libexec/psdf:
この場合もそうですが, この制限はローカル (ホスト rose)
のユーザ のみに適用されます.
リモートホストからプリンタを利用できるよう
に設定している場合は,
そのリモートホストのユーザはこの制限を受 けません.
これらのユーザにも制限を加える場合は, リモートホスト の
/etc/printcap の mx
を指定する必要があります.
リモートホストから印字するための詳しい情報については,
「
リモートホストに接続されたプリンタ」
を参照してください.
リモートホストに接続されたプリンタへのジョブの
サイズを制限する 特別な方法は他にもあります. これについては,
「
リモートホストからのプリンタの利用を制限する」
を参照してください.
リモートホストからのプリンタの利用を制限する
LPD スプーリングシステムでは, リモートホストから要求され
たジョブの印字を制限するための方法がいくつか
提供されています.
ホストの制限
ローカルの LPD
が印字要求を受け付けるリモートホストは, ファイル
/etc/hosts.equiv と
/etc/hosts.lpd
によって制御することができます. LPD では,
あるホストから印字の要求がきたとき, このホス
トの名前がこれら2つのファイルのどちらかに含まれている
かどうかを調べます. これが含まれていない場合は, LPD
はこの要求を拒否します.
これらのファイルの形式は単純です.
各行にホストの名前を
1つずつ書いていきます. ファイル
/etc/hosts.equiv の方は
&man.ruserok.3; プロトコル
でも利用され, &man.rsh.1; や &man.rcp.1;
といったプログラム
の動作に影響するので注意が必要です.
/etc/hosts.equiv
の記述は慎重におこないましょう.
例として, 以下にホスト rose の
/etc/hosts.lpd を示します.
orchid
violet
madrigal.fishbaum.de
この例では, rose はホスト
orchid, violet,
そして madrigal.fishbaum.de
からの要求を受け付けることになり ます.
その他のホストが rose の LPD
にアクセスしようと しても, LPD はこれを拒否します
(訳注:拒否されるのは, そのホストが
/etc/hosts.equiv にも含まれてい
ない場合です).
サイズの制限
スプーリングディレクトリがある
ファイルシステムに残して
おく必要がある空き容量の大きさを制御することが
できます.
ローカルプリンタ用のスプーリングディレクトリに
minfree
という名前のファイルを作成します. そして,
そのファイルの中にリモートホストからのジョブの要求を受
け付けるために必要な空き容量のディスクブロックサイズ
(1 ディスクブロック=512バイト) を記します.
これで,
リモートホストのユーザにファイルシステムを満杯
にされないことが保証されます. この機能を使うと, ローカ
ルホストのユーザに対してある種の優先権を与えることもで
きます. ローカルホストのユーザは,
minfree ファイ
ルで指定された値よりもディスクの空き容量が下回った後で
もずっと,
ジョブをキューに入れることができるのです.
例えば, プリンタ bamboo 用の
minfree を作っ てみましょう.
このプリンタのスプーリングディレクトリを 調べるために,
/etc/printcap を調べてみましょ
う. 以下に, bamboo
のエントリ部分を示します.
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:sh:sd=/var/spool/lpd/bamboo:sc:rg=artists:mx#5000:\
:lp=/dev/ttyd5:fs#0x82000e1:xs#0x820:rw:mx#5000:\
:if=/usr/local/libexec/psif:\
:df=/usr/local/libexec/psdf:
スプーリングディレクトリは
sd で指定されます. LPD
がリモートホストからのジョブを受け付けるために必要
なファイルシステムの空き容量を3Mバイト
(=6144ディスクブ ロック) にすることにしましょう.
&prompt.root; echo 6144 > /var/spool/lpd/bamboo/minfree
利用ユーザの制限
/etc/printcap の
rs 項目を指定することで,
ローカルプリンタを利用できるリモートホストのユーザを制
限することができます. ローカルホストに接続されたプリン
タ用のエントリに rs
項目が指定されている場合, LPD
は印字を要求したユーザのアカウントと同じログイン名
がローカルホストに登録されている/em/場合に限り/, その
ジョブが受け付けられます. そうでないユーザからのジョブ
は LPD は拒否します.
この機能は, (例えば)
複数の部署がネットワークを共有して おり,
この内のあるユーザが部署の境界を越えて活動してい
る場合には特に有用です. そのようなユーザに対して, シス
テムのアカウントを与えるだけで, これらのユーザは自分が
所属する部署のシステムからそのシステムに接続されている
プリンタを使用することができます. これらのユーザにはむ
しろ, プリンタの使用だけを認め,
その他のコンピュー タ資源を利用させたくないときは,
それらのユーザにはホー ムディレクトリを与えず,
ログインシェルはシェルとしては 何の役にも立たない
/usr/bin/false などを指定 して,
これらのユーザのアカウントはプリンタ用の“形式的
な”ものとします.
プリンタの利用に対する課金
という訳で, 印字するためには料金をとることが必要です. 取ら
ない理由などありましょうか. 紙やインクにはお金がかかります. そ
して, プリンタの維持費もかかります. プリンタには可動部分が搭載
されており, これらの部分は壊れやすいという傾向があります. プリ
ンタや, その利用形態, 維持費について調査をし, 1ページ (1フィー
ト, 1メートルなど) 当たりにかかるコストを調べておいてください.
これに基づき, プリンタの利用に対する課金を, 実際に, どのように
始めればよいのでしょうか.
さて, 残念ながら, この部分に関しては LPD
スプーリングシステム はほとんど役に立ちません.
課金は使用しているプリンタの種類, 印
字するもののファイルの形式,
プリンタの利用に対する課金での
あなた自身の要求に大きく左右されます.
課金システムを実現するためには, プリンタのテキストフィルタ
(プ レインテキストのジョブに対して課金するため) と変換フィルタ
(その 他のファイル形式に対して課金するため) を変更して,
印字したペー ジを数えたり,
プリンタに印字したページ数を取得するための要求を
送る必要があります. ただし, 出力フィルタのみを利用している場合
は, 課金をおこなうことができません. フィルタに関しては,
「
フィルタ」をご覧く ださい.
一般に, 課金方式には次の2つがあります.
定期的に課金する方法
はよく利用される方法です. この理由は, 恐らく,
比較的簡単に実現できるからです. 誰
かがジョブを印字する度に, フィルタはそのユーザ名, ホス
ト名, 印字したページ数を課金データファイルに記録します.
毎月, 毎学期, 毎年, あるいは, お好みの時期に, 様々なプ
リンタの課金用ファイルを集め, それぞれのユーザが印字し
たページ数を合計し, その分の課金をおこないます. 次回の課金
時期のためのデータを0にして課金を再開するために, この
処理をおこなった後, すべてのログファイルを削除し,
利用毎に課金する方法
はあまり利用されていません. これは,
実現するのが比較的難しいからです. この方式では,
プリンタを使用したらすぐに, フィルタがユーザにその利用
に対する課金をおこないます. ディスククオータのように, 課金
作業は瞬時におこなわれます. この方式では, ユーザのアカウン
トが赤字になる場合に, ユーザが印字をおこなうことを拒否する
ことができます. また, ユーザに“プリンタ版
quota”を 調べたり,
調整したりする方法を提供したいと思うかもしれ ません.
これを実現するためには, ユーザとその quota を
追跡するために, あるデータベース用のコードが必要となり
ます.
LPD スプーリングシステムでは, 両方式を簡単にですがサポー
トしています. これは, (ほとんどの場合で) 印字作業をフィ
ルタがおこなっていたように, 課金作業もこのためのコードも用
意することで実現されています. しかし, 明るい面もありま す.
それは, 課金方式に関して, 非常に大きな柔軟性が与え
られたということです. 例えば, 「定期的に課金する方法」 か,
「利用毎に課金する方法」のどちらかを選びまず, そし て,
どんな情報 (ユーザ名, ホスト名, ジョブのタイプ, 印
字された頁数, 使用した紙の大きさ, 印字をするために要した
時間など) をログに記録するかを決めます. 以上のことをおこな
うには, 上記の情報を保持するために, フィルタを変更しな
くてはなりません.
手軽なプリンタ課金方法
FreeBSD には, 「定期的に課金する方法」による課金をすぐに
設定できるように, 2個のプログラムを添付しています. そ
の内の1つはテキストフィルタ lpf で,
これについて
は, 「
テキストフィルタ lpf」をご覧ください. もう1つは,
&man.pac.8; で,
これはプリンタの課金データファイルからのエントリを集め,
これを合計するプログラムです.
「
フィルタはどのように機能しているか」で述べたように,
LPD では テキストフィルタや変換フィルタを起動しますが,
そのコマ
ンドラインで使用している課金データファイルの名前が指定
されます. 両フィルタはこの引数を使って, どの課金データ
ファイルのエントリに書き込めばよいのかを知ることができ ます.
このファイルの名前は /etc/printcap 中の
af 項目によって指定されます.
このファイルが絶対パ スで指定されない場合は,
スプーリングディレクトリからの
相対パスとして扱われます.
LPD は, 紙のページの幅と行数 (pw と
pl 項目で 指定される) を引数として
lpf を起動します. lpf
では, 何ページ印字したかを決定するためにこれ
らの引数を使用します. ファイルをプリンタに送った後, 課
金情報を課金データファイルに書き込みます. このファイル
は次のようになります.
2.00 rose:andy
3.00 rose:kelly
3.00 orchid:mary
5.00 orchid:mary
2.00 orchid:zhang
課金データファイルはプリンタ毎に分けて作るべきです. こ
れは, lpf
にはデータファイルをロックする機構が組
み込まれていないためです. したがって, lpf
が2つ起動 されたとき,
同じファイルに同時に書き込みをおこなった場合,
お互いのエントリが破壊されてしまうかもしれません. 課金
用ファイルを各プリンタ毎に確実に分けるには,
/etc/printcap 中の
af=acct 項目を使いま す.
プリンタの利用に対してユーザに課金する準備ができたら,
スプーリングディレクトリに移動した後,
&man.pac.8; と入力
してください. 次のような, ドル中心主義の課金リストが表
示されます(訳注:ドル中心主義という表現は, 表示がドルで
出ることへの著者の皮肉でしょう. セントがあるので小数点
以下が表示されますが, この機能も日本では邪魔ですね).
Login pages/feet runs price
orchid:kelly 5.00 1 $ 0.10
orchid:mary 31.00 3 $ 0.62
orchid:zhang 9.00 1 $ 0.18
rose:andy 2.00 1 $ 0.04
rose:kelly 177.00 104 $ 3.54
rose:mary 87.00 32 $ 1.74
rose:root 26.00 12 $ 0.52
total 337.00 154 $ 6.74
&man.pac.8; が受け付ける引数には
次のようなものがあります.
プリンタ printer
の利用に対する課金リストを作成し ます.
このオプションは, /etc/printcap
の af
が絶対パスで指定されていた場合に限り, 動作しま
す.
ユーザ名のアルファベット順ではなく,
課金額の低い順にリ ストを並べます.
課金データファイルにあるホスト名を無視します.
このオプショ ンを使用すると, ホスト
alpha のユーザ
smith とホスト
gamma のユーザ
smith は同一人物として扱われます.
この オプションが指定されない場合は,
両者は別なユーザとして 扱います.
/etc/printcap の
pc 項目で指定された値, または,
デフォルトの値 (2セント) に代わり, 紙1ページ, ま たは,
1フィート当たりの価格を指定します.
price として,
浮動小数点数を指定することができます.
リストの並べる順番を逆順にします.
課金リストを作成し,
課金データファイルを削除します.
name …
ユーザ names
に対する課金情報のみを表示します.
&man.pac.8; が生成するデフォルトのリストには,
各ホストのユーザ別
に印字ページ数が表示されます.
(ユーザがサイト内のすべてのホスト
を使用できるため) ホスト名の情報が意味を持たない場合,
pac -m
を実行してください. 次のようなリストが得られます.
Login pages/feet runs price
andy 2.00 1 $ 0.04
kelly 182.00 105 $ 3.64
mary 118.00 35 $ 2.36
root 26.00 12 $ 0.52
zhang 9.00 1 $ 0.18
total 337.00 154 $ 6.74
課金額を決めるために,
&man.pac.8; は /etc/printcap ファ
イルの pc
項目で指定された値 (デフォルト値は200, すなわち1
ページ当たり2セント)
を使います. この項目で, 印字物に課金したい
と思う1ページ当たり,
または, 1フィート当たりの価格を100分の1セ
ント単位で指定します.
&man.pac.8; を オプション付きで起動
すると, この値を置き換えることができます.
この オプショ
ンで指定する額の単位は,
100分の1セント単位ではなく, ドル単位で
す. 例えば, 次の指定では,
1ページ当たりの単価が1ドル50セントに
なります.
&prompt.root; pac -p1.50
このオプションを使うと,
実際の課金額を集計することができます.
最後に, pac -s
を起動すると, 課金情報は課金データ累計ファ
イルに保存されます.
このファイルの名前は, プリンタの課金データ
ファイルの後ろに
_sum を付けたものとなります. そして, 課
金データファイルは削除されます. 次に
&man.pac.8; が起動されると,
その時点までの累計金額を得るために,
課金データ累計ファイルが読
み込まれ, 通常の課金データファイルからの情報に
加算されます.
印字されたページ数をどのように数えるか?
課金を, リモートホストからの印字でさえも,
正確におこなうため には,
ジョブで使用された紙が何ページであるかを特定でき
る必要があります. このことは, プリンタ利用に対する課金
をおこなう上の根本的な問題です.
プレインテキストのジョブの場合, 問題を解決するのはさほ
ど難しくはありません. ジョブが何行であったかを数え, プ
リンタがサポートしている紙1ページに印字できる最大の行
数と比較すればよいのです. 重ね打ちするために利用される
ファイル中のバックスペース文字や, 物理的に複数の行に渡
る長い論理行に対する取り扱いを
忘れずにおこなってください.
(「テキストフィ,ルタ
lpf」で紹介した) テキストフィルタ
lpf では, 課金をおこなうときに,
これらの取り扱いをおこなってくれます. 課
金をおこなうために必要なテキストフィルタを作成している方は,
lpf
のソースコードが参考になるでしょう.
これに対して, 他のファイル形式の処理はどのようにすれば
よいのでしょうか.
まず, DVI から LaserJet, または, DVI から PostScript
への変換の場合, フィルタが dvilj や
dvips の 出力メッセージを解析することで,
何ページ分の変換がおこなわ れたかを知ることができます.
他のファイル形式とその変換 プログラムに関しても,
同様のことができるかもしれません.
しかし, この方式には問題点があります. それは, 変換され
たページがすべて印字されるとは限らないということです. 例
えば, プリンタが紙詰まりを起こしたり, トナー切れになっ たり,
はたまた, 爆発したりするかもしれません. そのよう
な状況により印字が途中で中止されたとしても, この方式で は,
ユーザは全ページ分の料金を課されてしまうのです.
それでは, どのような対策をたてることができるのでしょう
か.
正確な
課金をおこなうための唯一の確実な方法は,
何 ページ印字したのかを知らせることができるプリンタを入手
し, これをシリアルポートかネットワークに接続することで す.
ほとんどすべての PostScript プリンタではこの概念
がサポートされています. 他のプリンタも同様です (Imagen
レーザプリンタをネットワーク接続するなど). それぞれの
プリンタのフィルタを, ジョブを印字した後で印字ページ数
を得るように, 変更してください. そして, 課金情報はここ
で得られた値のみに
基づいて記録してください. 行数 を数えたり,
エラーが生じやすいファイルの調査は必要とさ れません.
もちろん, 気前よく印字料
金をすべて無料にすることもできます.
標準スプーラの代替品
このマニュアルを最初から通読されている方ならば, ここまでで,
FreeBSD 付属の LPD スプーリングシステムに関して知っておくべき
ことすべてを学ばれたことと思います. 多分, このシステムに
あるたくさんの欠点について認識できたことでしょう. すると,
“(FreeBSD 上で動作する)
スプーリングシステムには他にどのような
ものがあるのか”という疑問が自然と湧いてきます.
残念ながら, 著者は代替のスプーラを 2つ
だけしか探し出すこと ができませんでした. そして,
それぞれはほとんど同一のものです. 以下に,
両システムの紹介をおこないます.
PLP (Portable Line Printer スプーリングシステム)
PLP は Patrick Powell によって開発されたソフトウエアを
ベースにされており, インタネット規模のグループの開発者
によって管理されていました. このソフトの主要サイトは「
ftp://ftp.iona.ie/pub/plp」です.
「
web page」にもあります.
PLP は BSD LPD スプーラと極めて似ていますが, 以下のも
のを含むホストの機能が自慢です.
ネットワークサポートの強化. ネットワーク接続され
るプリンタのサポートや NIS で管理可能な printcap ファ
イル, NFS マウントされるスプーリングディレクトリの機
能が組み込まれています.
洗練されたなキュー管理. 1つのキューで複数のプリン
タに対応可能. キュー間でジョブを転送したり, キューのリ
ダイレクトができます.
リモートプリンタの制御機能
ジョブの優先順位付け
拡張性のあるセキュリティとアクセスオプション
LPRng
LPRng は, その称するところの意味は“LPR: the Next
Generation”ですが, PLP を完全に書き換えたものになっ
ています. Patrick Powell と Justin Mason (PLP の主要
なの管理者) の共同で LPRng が作成されました. LPRng の
主要サイトは「
ftp://dickory.sdsu.edu/pub/LPRng」です.
謝辞
このドキュメントの開発の手助けをして頂いた以下の方々に感謝の
意を表わしたいと思います.
Daniel Eischen deischen@iworks.interworks.org
精読するためのあり余るほどの HP 用フィルタを提供してく
れたことに.
&a.jehamby;
提供して頂いた Ghostscript から HP
へのフィルタに.
私の妻, Mary Kelly urquhart@argyre.colorado.edu
彼女と一緒にいるよりもずっと長い時間を FreeBSD のため
に費やすことを許してくれたことに.
diff --git a/ja_JP.eucJP/books/handbook/authors.ent b/ja_JP.eucJP/books/handbook/authors.ent
index b72af61c7a..64298905e8 100644
--- a/ja_JP.eucJP/books/handbook/authors.ent
+++ b/ja_JP.eucJP/books/handbook/authors.ent
@@ -1,356 +1,358 @@
abial@FreeBSD.ORG">
ache@FreeBSD.ORG">
adam@FreeBSD.ORG">
alex@freebsd.org">
amurai@FreeBSD.ORG">
andreas@FreeBSD.ORG">
archie@FreeBSD.ORG">
asami@FreeBSD.ORG">
ats@FreeBSD.ORG">
awebster@pubnix.net">
bde@FreeBSD.ORG">
billf@FreeBSD.ORG">
brandon@FreeBSD.ORG">
brian@FreeBSD.ORG">
cawimm@FreeBSD.ORG">
charnier@FreeBSD.ORG">
chuckr@glue.umd.edu">
chuckr@FreeBSD.ORG">
cracauer@FreeBSD.ORG">
csgr@FreeBSD.ORG">
cwt@FreeBSD.ORG">
danny@FreeBSD.ORG">
darrenr@FreeBSD.ORG">
davidn@blaze.net.au">
dburr@FreeBSD.ORG">
dcs@FreeBSD.ORG">
des@FreeBSD.ORG">
dfr@FreeBSD.ORG">
dg@FreeBSD.ORG">
dick@FreeBSD.ORG">
dillon@FreeBSD.ORG">
dima@FreeBSD.ORG">
dirk@FreeBSD.ORG">
Dirk.vanGulik@jrc.it">
dt@FreeBSD.ORG">
dufault@FreeBSD.ORG">
dwhite@FreeBSD.ORG">
dyson@FreeBSD.ORG">
eivind@FreeBSD.ORG">
ejc@FreeBSD.ORG">
erich@FreeBSD.ORG">
faq@freebsd.org">
fenner@FreeBSD.ORG">
flathill@FreeBSD.ORG">
foxfair@FreeBSD.ORG">
fsmp@FreeBSD.ORG">
gallatin@FreeBSD.ORG">
gclarkii@FreeBSD.ORG">
gena@NetVision.net.il">
ghelmer@cs.iastate.edu">
gibbs@FreeBSD.ORG">
mjacob@FreeBSD.ORG">
gj@FreeBSD.ORG">
gpalmer@FreeBSD.ORG">
graichen@FreeBSD.ORG">
grog@FreeBSD.ORG">
gryphon@healer.com">
guido@FreeBSD.ORG">
hanai@FreeBSD.ORG">
handy@sxt4.physics.montana.edu">
helbig@FreeBSD.ORG">
hm@FreeBSD.ORG">
hoek@FreeBSD.ORG">
hosokawa@FreeBSD.ORG">
hsu@FreeBSD.ORG">
imp@FreeBSD.ORG">
itojun@itojun.org">
+jasone@FreeBSD.ORG">
+
jb@cimlogic.com.au">
jdp@FreeBSD.ORG">
jehamby@lightside.com">
jfieber@FreeBSD.ORG">
james@nexis.net">
jgreco@FreeBSD.ORG">
jhay@FreeBSD.ORG">
jkh@FreeBSD.ORG">
jkoshy@FreeBSD.ORG">
jlemon@FreeBSD.ORG">
john@starfire.MN.ORG">
jlrobin@FreeBSD.ORG">
jmacd@FreeBSD.ORG">
jmb@FreeBSD.ORG">
jmg@FreeBSD.ORG">
jmz@FreeBSD.ORG">
joerg@FreeBSD.ORG">
john@FreeBSD.ORG">
jraynard@freebsd.org">
jseger@freebsd.org">
julian@FreeBSD.ORG">
jvh@FreeBSD.ORG">
karl@FreeBSD.ORG">
kato@FreeBSD.ORG">
kelly@fsl.noaa.gov">
ken@FreeBSD.ORG">
kjc@FreeBSD.ORG">
kris@FreeBSD.ORG">
kuriyama@FreeBSD.ORG">
lars@FreeBSD.ORG">
ljo@FreeBSD.ORG">
luoqi@FreeBSD.ORG">
markm@FreeBSD.ORG">
martin@FreeBSD.ORG">
max@FreeBSD.ORG">
mark@vmunix.com">
mbarkah@FreeBSD.ORG">
mckay@FreeBSD.ORG">
mckusick@FreeBSD.ORG">
md@bsc.no">
mharo@FreeBSD.ORG">
mks@FreeBSD.ORG">
motoyuki@FreeBSD.ORG">
mph@FreeBSD.ORG">
mpp@FreeBSD.ORG">
msmith@FreeBSD.ORG">
nate@FreeBSD.ORG">
nectar@FreeBSD.ORG">
newton@FreeBSD.ORG">
n_hibma@FreeBSD.ORG">
nik@FreeBSD.ORG">
nsayer@FreeBSD.ORG">
nsj@FreeBSD.ORG">
obrien@FreeBSD.ORG">
olah@FreeBSD.ORG">
opsys@open-systems.net">
paul@FreeBSD.ORG">
pb@fasterix.freenix.org">
pds@FreeBSD.ORG">
peter@FreeBSD.ORG">
phk@FreeBSD.ORG">
pjchilds@imforei.apana.org.au">
proven@FreeBSD.ORG">
pst@FreeBSD.ORG">
rgrimes@FreeBSD.ORG">
rhuff@cybercom.net">
ricardag@ag.com.br">
rich@FreeBSD.ORG">
rnordier@FreeBSD.ORG">
roberto@FreeBSD.ORG">
rse@FreeBSD.ORG">
sada@FreeBSD.ORG">
scrappy@FreeBSD.ORG">
se@FreeBSD.ORG">
sef@FreeBSD.ORG">
shige@FreeBSD.ORG">
simokawa@FreeBSD.ORG">
smace@FreeBSD.ORG">
smpatel@FreeBSD.ORG">
sos@FreeBSD.ORG">
stark@FreeBSD.ORG">
stb@FreeBSD.ORG">
steve@FreeBSD.ORG">
swallace@FreeBSD.ORG">
taoka@FreeBSD.ORG">
tedm@FreeBSD.ORG">
tegge@FreeBSD.ORG">
tg@FreeBSD.ORG">
thepish@FreeBSD.ORG">
torstenb@FreeBSD.ORG">
truckman@FreeBSD.ORG">
ugen@FreeBSD.ORG">
uhclem@FreeBSD.ORG">
ulf@FreeBSD.ORG">
vanilla@FreeBSD.ORG">
wes@FreeBSD.ORG">
whiteside@acm.org">
wilko@yedi.iaf.nl">
wlloyd@mpd.ca">
wollman@FreeBSD.ORG">
wosch@FreeBSD.ORG">
wpaul@FreeBSD.ORG">
yokota@FreeBSD.ORG">
diff --git a/ja_JP.eucJP/books/handbook/introduction/chapter.sgml b/ja_JP.eucJP/books/handbook/introduction/chapter.sgml
index 4d78c6bb1a..6dfae22ce0 100644
--- a/ja_JP.eucJP/books/handbook/introduction/chapter.sgml
+++ b/ja_JP.eucJP/books/handbook/introduction/chapter.sgml
@@ -1,724 +1,724 @@
はじめに
FreeBSD は, Intel アーキテクチャ (x86) ベースの PC のための
4.4BSD-Lite をベースとしたオペレーティングシステムです. FreeBSD
の概要については, FreeBSD
とはをご覧ください. このプロジェクトの歴史については,
FreeBSD 小史 をご覧ください.
最新のリリースについての記述は, 現在のリリースについてをご覧ください.
FreeBSD プロジェクトへの何らかの貢献 (ソースコード, 機器,
資金の提供など) について興味があれば, FreeBSD への貢献
の章をご覧ください.
FreeBSD とは
原作: 不明.
訳: &a.jp.tomo;.
FreeBSDはIntel社の (SXやDXも含めた) 386や486, Pentium
プロセッサ といった CPU
アーキテクチャに基づくパーソナルコンピュータ用としては
現在求めうる最高水準のオペレーティングシステムです.
AMD社やCyrix社のIntel互換CPUもサポートされています. FreeBSDは,
以前は高価なコンピュータでしか利用できなかった多くの
高度な機能を提供します.
FreeBSDには次のような機能があります:
アプリケーションとユーザとの間で円滑かつ公平に
コンピュータを 共有することを保証する,
優先度を動的に調節する機能を備えた
プリエンプティブマルチタスキング.
多くの人々が1つのFreeBSD
システムをさまざまな目的で同時に 使うことを可能にする
マルチユーザ アクセス. また,
プリンタやテープドライブのようなシステムの周辺機器も
すべてのユーザ間で適切に共有されます.
SLIPやPPP, NFS, NISのサポートを含んだ完全な
TCP/IPネットワーキング. これによって,
FreeBSDマシンが商用サーバと同じように相互に運用でき, NFS
(リモートファイルアクセス)
や電子メールサービスのような極めて 重要な機能を提供します.
また, WWWやftp, ルーティング, ファイアウォール
(セキュリティ) サービスを用いてインターネットと
接続できます.
アプリケーション (あるいはユーザ) がお互いに干渉できない
ようにするメモリ保護機能.
アプリケーションがクラッシュしても, どのような場合でも
他のアプリケーションには影響を与えません.
FreeBSD は 32ビット
のオペレーティングシステムであり,
最初からそのようにこつこつと設計されました.
業界標準であるX Windowシステム
(X11R6) は, 普通のVGAカードやモニタでグラフィカルユーザ
インタフェース (GUI) を提供し,
すべてのソースコードも一緒に提供されます.
SCOやBSDI, NetBSD, Linux, 386BSD用に作られた多くの
プログラムにおけるバイナリ互換性.
何百もの すぐに実行可能な
アプリケーションが FreeBSDの ports や
packages コレクション で利用可能です.
ここに用意されているものは
ネットを探し回る必要がありません
インターネット上で入手可能な,
移植が容易な
何千ものアプリケーションを追加できます. FreeBSD
は最も評判の よい商用の Unix
システムとソースコードレベルで互換性があります. このため,
ほとんどのアプリケーションは, もしあったとしてもほんの
少しの変更でコンパイルすることができます.
デマンドページング 仮想メモリ
とそれに “付随の VM/buffer キャッシュ”の設計は,
多くのメモリを要求する
アプリケーションに対して効率よくメモリを
与えるようにする一方で,
他のユーザに対しても対話的な応答を維持します.
共有ライブラリ
(MS-WindowsのDLLと同等のUnixの 機能) によって,
ディスクスペースとメモリを効果的に使用する
ことができます.
完全な C や
C++, Fortranの
開発ツール. 進んだ研究や開発のための多くの他の言語も
ports や packages コレクションで提供されています.
システム全体の ソースコード
が提供されているので,
要求に合わせて環境を最大限に適合させることができます.
真のオープンシステムが利用できるのですから,
所有権のある解決方法に 締めつけられ,
ベンダのなすがままになる必要はありません.
膨大な量の
オンラインドキュメント.
もう書ききれません!
FreeBSD はカリフォルニア大学バークレイ校のComputer Systems
Research Group (CSRG) による4.4BSD-Liteリリースを基にしており,
BSDシステムの開発の優れた伝統を守り続けています.
CSRGによる素晴らしい活動に加えて,
FreeBSDプロジェクトは何千時間もの時間を注ぎ込んで,
実際の使用の場において最大の性能と信頼性を
発揮するためにシステムのチューニングをおこなっています.
多くの大企業がPCオペレーティングシステムの分野で
実現しようと奮闘しているそのような機能や性能, 信頼性を
FreeBSDは今すぐ提供できます!
あなたの思いつく限りのアプリケーションは, 何でもFreeBSDで
実行できます. ソフトウェア開発から ファクトリオートメーション,
在庫制御から遠く離れた人工衛星の アンテナの方向調整まで;
商用UNIX製品でできることは, FreeBSDでも十分にできるのです!
また, FreeBSDは世界中の研究センターや大学によって開発される
文字通り何千もの高品質で, たいていはほとんど無料で利用できる
アプリケーションによる恩恵を得ることができます.
商用のアプリケーションも提供されており,
日々増え続けています.
FreeBSDのソースコードは広く提供されているので,
システムも特別なアプリケーションやプロジェクトに合わせて,
いくらでもカスタマイズすることができます. これは
有名な商業ベンダから出ているほとんどのオペレーティング
システムでは不可能なことです. 以下に現在FreeBSDを
使っている人々のアプリケーションの例をいくつか上げます:
インターネットサービス:
FreeBSDに組み込まれている 頑強なTCP/IP
ネットワーキング機能は次のようなさまざまなインターネット
サービスの理想的なプラットフォームになります:
FTP サーバ
World Wide Web サーバ
Gopher サーバ
電子メールサーバ
USENET ニュース
電子掲示板システム
さらにいろいろ...
まずは高価ではない386クラスのPCで始めておいて,
仕事の成長に合わせてアップグレードできます.
教育:
あなたは計算機科学または工学の学生ですか?
オペレーティングシステムやコンピュータアーキテクチャ,
ネットワーキングを学習するなら, FreeBSDを手に
経験するのが一番よい方法です. 自由に利用できるCADや数学,
グラフィックデザインのパッケージもいくつもあり,
コンピュータに関心を持った人が 他の人
の成果を 手に入れて利用するのにとても役に立ちます.
研究:
システム全体のソースコードが利用できるため,
FreeBSDはオペレーティングシステムの研究だけでなく,
計算機科学の他の部門においても優れたプラットフォームです.
自由に利用できるFreeBSDの特長は, オープンフォーラムで
議論される特別なライセンスの同意や制限について
心配することなく, 離れたグループでもアイディアや開発の共有に
よる共同研究を可能にします.
ネットワーキング:
新しいルータが必要? ネームサーバ (DNS) は?
内部のネットワークを人々から守る ファイアウォールは?
FreeBSDはすみに眠っている使われていない386や486のPCを簡単に
洗練されたパケットフィルタリング機能を持つ高級なルータに
変えることができます.
X Windowワークステーション:
自由に利用できるXFree86サーバやX Inside社から提供される
優れた商業サーバを使うことによって, 安価なX端末
としてFreeBSDを使うこともできます. X端末とは違ってFreeBSDは
多くのアプリケーションをローカルに走らせることもでき,
中心のサーバの負荷を軽減することも可能です.
FreeBSDは“ディスクレス”でもブート可能であり,
個々のワークステーションを安価で, 容易に管理することさえ
可能にします.
ソフトウェア開発:
基本的なFreeBSDシステムには
有名なGNUのC/C++コンパイラやデバッガ含んだ完全な開発ツールが
ついてきます.
FreeBSDはCDROMまたはanonymous ftpによってソース,
バイナリとも 利用可能です. 詳しくは, FreeBSD の入手方法
を見てください.
FreeBSD 小史
原作: &a.jkh;.
訳: &a.jp.masaki;, &a.jp.hino;.
19 December 1996.
FreeBSD プロジェクトは 1993年の始めに “Unofficial
386BSD Patchkit” の最後の 3人のまとめ役によって, 部分的に
patchkit から派生する形で開始 されました. ここでの
3人のまとめ役というのは, Nate Williams と, Rod Grimes と, 私
(Jordan K. Hubbard) です.
私たちのもともとの目標は, patchkit
という仕組みではもう十分に解 決できなくなってしまった 386BSD
の数多くの問題を修正するための, 386BSD
の暫定的なスナップショットを作成することでした.
こういった経緯を経てい るので,
このプロジェクトの初期の頃の名前が “ 386BSD 0.5 ” や
“386BSD 暫定版 (Interim)”
であったということを覚えている人もいるでしょう.
386BSD は, Bill Jolitz が (訳注: バークレイ Net/2
テープを基に) 作成し たオペレーティングシステムです. 当時の
386BSD は, ほぼ一年にわたって放っ ておかれていた (訳注:
作者がバグの報告を受けても何もしなかった) という
ひどい状況に苦しんでいました.
作者の代わりに問題を修正し続けていた patchkit
は日を追うごとに不快なまでに膨張してしまっていました. このよ
うな状況に対して, このままではいけない,
何か行動を起こさなければ, とい
うことで異議を唱えるものは私たちのなかにはいませんでした.
そして私たち は挑戦することを決断し,
暫定的な“クリーンアップ”スナップショットを作
成することで Bill を手助けしようと決めたのです. しかし,
この計画は唐突 に終了してしまいました. Bill Jolitz が,
このプロジェクトに対する受け
入れ支持を取り下げることを突然決意し,
なおかつこのプロジェクトの代わり
に何をするのかを一切言明しなかったのです.
たとえ Bill が支持してくれないとしても,
われわれの目標には依然としてや
る価値があると決心するのにさしたる時間はかかりませんでした.
そこで David Greenman が考案した名称 “FreeBSD”
を私たちのプロジェクトの名前 に採用し,
新たなスタートを切りました. この時点でのプロジェクトの初期目
標は, すでにこのシステム (訳注: 386BSD + Patchkit)
を使っていた利用者 たちと相談して決められました.
プロジェクトが実現に向けて軌道に乗ってき
たことが明確になった時点で, 私は Walnut Creek CDROM
社に連絡してみまし た. CDROM を使って FreeBSD
を配布することによって, インターネットに容
易に接続できない多くの人々が FreeBSD
を簡単に入手できるようになると考 えたからです. Walnut Creek
CDROM 社は FreeBSD を CD で配布するというア
イデアを採用してくれたばかりか,
作業するためのマシンと高速なインターネッ
ト回線を私たちのプロジェクトに提供してくれました.
当時は海のものとも山
のものともわからなかった私たちのプロジェクトに対して, Walnut
Creek CDROM 社が信じられないほどの信頼を寄せてくれたおかげで,
FreeBSD は短期 間のうちにここまで大きく成長したのです.
CDROM による最初の配布 (そしてネットでの,
ベータ版ではない最初の一般向 け配布) は FreeBSD 1.0 で, 1993年
12月に公開されました. これは カリフォ ルニア大学バークレイ校の
4.3BSD-Lite (“Net/2”) を基とし, 386BSD や Free
Software Foundation からも多くの部分を取り入れたものです. これは
初めて公開したものとしては十分に成功しました. 続けて 1994年
5月に FreeBSD 1.1 を公開し,
非常に大きな成功を収めました.
この時期,
あまり予想していなかった嵐が遠くから接近してきていました. バー
クレイ Net/2 テープの法的な位置づけについて, Novell 社と
カリフォルニア大学バークレイ校との間の長期にわたる
法廷論争において和解が成立したの です. 和解の内容は, Net/2
のかなりの部分が“権利つき (encumbered)”コー
ドであり, それは Novell 社の所有物である,
というバークレイ校側が譲歩し たものでした. なお, Novell
社はこれらの権利を裁判が始まる少し前に AT&T
社から買収していました. 和解における譲歩の見返りにバークレイ
校が得たのは, 4.4BSD-Lite が最終的に発表された時点で,
4.4BSD-Lite は権 利つきではないと公式に宣言されること,
そしてすべての既存の Net/2 の利 用者が 4.4BSD-Lite
の利用へと移行することが強く奨励されること, という Novell
社からの“ありがたき天からの恵み”でした. (訳注:
4.4BSD-Lite は その後 Novell
社のチェックを受けてから公開された.) FreeBSD も Net/2 を利
用していましたから, 1994年の 7月の終わりまでに Net/2 ベースの
FreeBSD の出荷を停止するように言われました. ただし,
このときの合意によって, 私
たちは締め切りまでに一回だけ最後の公開をすることを許されました.
そして それは FreeBSD 1.1.5.1 となりました.
それから FreeBSD プロジェクトは, まっさらでかなり不完全な
4.4BSD-Lite を基に, 文字どおり一から再度作り直すという,
難しくて大変な作業の準備を始めまし た. “Lite”
バージョンは, 部分的には本当に軽くて, 中身がなかったので す.
起動し,
動作できるシステムを実際に作り上げるために必要となるプログ
ラムコードのかなりの部分がバークレイ校 の CSRG (訳注:
BSDを作っている グループ) によって (いろいろな法的要求のせいで)
削除されてしまっていた ということと, 4.4BSD の Intel
アーキテクチャ対応が元々かなり不完全であっ
たということがその理由です. この移行作業は結局 1994年の
- 12月までかかり ました. そして 1995年の 1月に FreeBSD 2.0
- をネットと CDROM を通じて公 開しました. これは,
+ 11月までかかり ました. そしてその時点で FreeBSD 2.0 をネットと
+ CDROM(12月末ごろ)を通じて公 開しました. これは,
かなり粗削りなところが残っていたにもかかわらず, か
なりの成功を収めました. そしてその後に, より信頼性が高く,
そしてインス トールが簡単になった FreeBSD 2.0.5 が 1995年の
6月に公開されました.
私たちは 1996年の 8月に FreeBSD 2.1.5 を公開しました.
この出来が非常に 良く, 特に業務で運用しているサイトや ISP
での人気が高かったので, 私た ちは 2.1-STABLE
開発分流から更に公開をおこなうことにメリットがあると考 えました.
それが FreeBSD 2.1.7.1 で, 2.1-STABLE 開発分流の最後を締めく
くるものとして, 1997年の 2月に公開されました. 2.1-STABLE
開発分流 (RELENG_2_1_0) は現在,
保守のみをおこなう状態になっており, 今後は, セ
キュリティの改善や他の何か重要なバグフィックスのみが
おこなわれるでしょ う.
FreeBSD 2.2 の開発は, RELENG_2_2 開発分流として, 開発の本流
(“-current”) から 1996年 11月に分岐し, そして 1997年
4月に最初の公開 (2.2.1) がおこなわれました. 2.2
開発分流からはさらに 97 年の夏と秋に公 開がおこなわれ, 98 年 7
月の終わりには最新版の 2.2.7 が登場しました. FreeBSD 3.0
の初めての公式なリリースが 1998 年 10 月上旬に登場し, 2.2
開発分流からの最後のリリースである 2.2.8 が 1998 年 11
月に登場しまし た.
1999 年 1 月 20 日には, FreeBSD
の開発ツリーが再び分岐しました. 4.0-current と 3.x-stable
の分流です. 3.x-stable からは 3.1 が 1999 年 2 月 15
- 日にリリースされる予定です.
+ 日にリリースされ, 3.2 は 1999 年 5 月 15日にリリースされました.
長期的な開発プロジェクトは 4.0-current 開発分流で続けられ,
スナップショットの CDROM (もちろん, ネットワーク上でも)
で公開されます.
FreeBSDプロジェクトの目的
原作: &a.jkh;
訳: &a.jp.kiroh;
24 September 1996.
FreeBSD
プロジェクトの目的は, いかなる用途にも使用でき, 何ら制限のない
ソフトウェアを供給することです.
私たちの多くは, コード(そしてプロジェ
クト)に対してかなりの投資をしてきており,
これからも多少の無駄はあって も投資を続けて行くつもりです. ただ,
他の人達にも同じような負担をするよ
うに主張しているわけではありません. FreeBSD
に興味を持っている一人の残 らず全ての人々に,
目的を限定しないでコードを提供すること. これが,
私たちの最初のそして最大の “任務”
であると信じています. そうすれば, コード は可能な限り広く使われ,
最大の恩恵をもたらすことができるでしょう. これ
が, 私たちが熱烈に支持しているフリーソフトウェアの
最も基本的な目的であ ると, 私は信じています.
私たちのソースツリーに含まれるソースのうち,
GNU一般公有使用許諾(GPL)ま
たはGNUライブラリ一般公有使用許諾(GLPL)
に従っているものについては, 多 少制限が科されています. ただし,
ソースコードへのアクセスの保証という,
一般の制限とはいわば逆の制限(訳注1)です.
ただしGPLソフトウェアを商用で
利用する場合, さらに複雑になるのは避けられません.
そのため, それらのソ フトウェアを, より制限の少ない BSD
- 著作権に従ったソフトウェアで置き換え
- る努力を, 可能な限り日々続けています.
+ 著作権に従ったソフトウェアで置き換える事が合理的であるときには,
+ 我々は置き換える努力を行っています.
(訳注1) GPL では, 「ソースコードを実際に受け取るか,
あるいは, 希望しさ えすればそれを入手することが可能であること」
を求めています.
FreeBSDの開発モデル
原作: &a.asami;.
18 October 1996.
訳: &a.asami;.
31 October 1996.
FreeBSD の開発は非常に開かれた, 柔軟性のあるプロセスです.
コントリビュータのリスト
を見ていただければわかる とおり,
FreeBSDは文字通り世界中の何百という人々の努力によって開発され
ています. 新しい開発者はいつでも大歓迎ですので, &a.hackers;
にメールを 送ってください. また,
大勢で議論するよりは一人で静かに開発にふけりた
いという人は私たちのFTPサイト
ftp.freebsd.org
を使ってパッチや開発中のソースを公開してくださっ て結構です.
&a.announce; もありますので, 他のFreeBSDユーザに自分のやっ
ていることを宣伝したい時にはどうぞ使ってください.
あと, FreeBSD プロジェクトとその開発プロセスについて,
どなたにも知って
いていただきたいのは以下のようなことです.
CVSリポジトリ
FreeBSDのソースツリーは
CVS (Concurrent Versions System)
によってメンテナンスされています. CVSはソー
スコード管理用のフリーソフトウェアで,
FreeBSDのリリースにも含まれてい ます. FreeBSD の メインの CVS
リポジトリ
は米国カリフォルニア州のコンコルド市に存在 し,
そこから世界中のたくさんのミラーサイトに
コピーされています. CVSツ リーそのもの,
そしてそのチェックアウトされたバージョンである-currentと-stableはあな
たのマシンにも簡単に取ってくることができます.
これについては
ソースツリーの同期 の章をご覧ください.
ソースツリー管理者
ソースツリー管理者はCVSツリー
への書き込み権限を持っている人,
つまりFreeBSDのソースに変更を加えるこ とができる人です.
(CVSでリポジトリに変更を加えるには &man.cvs.1;
commit というコマンドを使うので,
これらの人々は英語では “committers”
と呼ばれます.) 開発者にコードを送って見てもらうのに一
番いい方法は &man.send-pr.1; コマンドを使うことです. もし,
何か問題があって send-pr
が使えないならcommitters@freebsd.orgにメー
ルを送っていただいても結構です.
FreeBSDコアチーム
FreeBSD
コアチームはFreeBSDプロジェク
トが会社だとすると取締役会にあたるものです.
コアチームとして一番重要 な役割は FreeBSD
プロジェクトが全体としてよい方向に向かっていることを確
認することです.
責任感あふれる開発者を上記のソースツリー管理者として
招くこと, また仕事上の都合などでコアチームを
やめた人たちの後任を見つけ ることもコアチームの役割です.
現在のコアチームのほとんどは最初は単な
る一開発者としてプロジェクトに関わりはじめ,
ずるずるといつのまにか深み
にはまってしまった人です.
コアチームのうち何人かは特定の 担当分野 を持っており,
システムのうち一部に特に重点をおいて
面倒を見ています.
忘れてほしくないのはコアチームのほとんどは FreeBSD
についてはボラ ンティアであり, FreeBSD
プロジェクトからは何ら金銭的な支援を受けていな
いということです. ですから, ここでの “責任”
は “保証されたサポート” ではありません.
そういう意味で,
上記の“取締役会”という例えはあまりよく
ないかもしれません. むしろ,
FreeBSDのために人生を棒に振ってしまった人
の集まりといった方が正しいかも.... ;)
その他のコントリビュータ
最後になりますが,
もっとも重要で多数をしめる開発者はフィードバック
やバグフィクスをどんどん送ってくれるユーザ自身です.
FreeBSDの開発に外 郭から関わっていきたいという人は
&a.hackers; (
メーリングリスト情報 を見てください)
に参加するといいでしょう.
FreeBSD
のソースツリーに入っている何かを書いた人の リスト
は日に日に長くなっています. あ なたも今日,
何か送ることからはじめてみませんか? :-)
もちろんFreeBSD
に貢献するにはコードを書くほかにもいろいろな方法があ
ります. 助けが求められている分野については,
このハンドブックの 貢献の仕方
の節を見てください.
ひとことで言うと, FreeBSD
の開発組織はゆるやかな同心円状になっています.
ともすると中央集権的に見えがちなこの組織は,
FreeBSDのユーザが
きちんと管理されたコードベースを
容易に追いかけられるようにデザインされ ているもので,
貢献したいという人を締め出す意図は全くありません! 私た
ちの目標は安定したオペレーティングシステムと
簡単にインストールして使う ことのできるアプリケーションを提供することであ り,
この方法は結構うまくはたらくのです.
これからFreeBSDの開発にたずさわろうという人に,
私たちが望むことはただ 一つです:
FreeBSDの成功を継続的なものにするために, 現在の開発者と同じ
ような情熱を持って接してください!
現在のリリースについて
FreeBSD は自由に利用でき Intel
i386/i486/Pentium/PentiumPro/Pentium II (とその互換 CPU) の
PCで動作する, 4.4BSD-Lite ベースの全ソー スつきのリリースです.
これはもともとカリフォルニア大学バーク レイ校
CSRGグループのソフトウェアがベースとなっており, NetBSD, OpenBSD,
386BSD, そして Free Software Foundation の
ソフトウェアなどにより拡張されています.
- 95年1月の FreeBSD 2.0 のリリースからみると, FreeBSD は性能,
+ 94年末の FreeBSD 2.0 のリリースからみると, FreeBSD は性能,
機能, 安定性の面で劇的に改善されました.
もっとも大きな変化は仮想メモリシステムに おける改良で,
統合化された VM/file バッファキャッシュを用いる
ことで性能を向上させながらも FreeBSD
のメモリの使用量を減らすことが できたことです. おかげで, 最低
5MB メモリという制約上でも動作する ようになりました.
その他の拡張としては NIS のクライアントとサーバの 完全サポート,
トランザクション TCP のサポート, ダイヤルオンデマンド PPP, 改良
- SCSI サブシステム, ISDN の初期サポート, FDDI や Fast Ethernet
+ SCSI サブシステム, ISDN のサポート, ATM のサポート, FDDI や Fast Ethernet
(100Mbps) などのサポート, Adaptec 2940 (WIDE と narrow)
のサポートの改良と数百件のバグの修正, などがあります.
私たちはたくさんのユーザからのコメントや
提案をまじめに受け取り, 私たちが正しいと考え,
かつ導入の手順が分かりやすいものを提供しようと 努力しています.
この (継続的に進化する) プロセスに対するあなたの意見を
心からお待ちしています.
FreeBSD では基本配布セットに加え, 移植されたソフトウェア集
- として 数百の人気の高いプログラムを提供しています. 98年8月
- 下旬の時点で 1700 以上の ports (移植ソフトウェア) が存在します.
+ として 数百の人気の高いプログラムを提供しています. 99年4月
+ 下旬の時点で 2300 以上の ports (移植ソフトウェア) が存在します.
ports には http (WWW) サーバから, ゲーム, 言語,
エディタまでありとあらゆるものが含まれています.
portsはオリジナル
ソースに対する“差分”という形で表現されており,
- すべての portsを 集めても 26MB程度にしかなりません.
+ すべての portsを 集めても 50MB程度にしかなりません.
こうすることで ports の更新を 容易にし,
portsに必要なディスクスペースを小さくすることができます.
portsをコンパイルするには,
インストールしたいと思っているプログラムの ディレクトリに移動し,
make all と実行してコンパイルが成 功したら,
make install とすると, あとはすべてシステムが
やってくれます. どの portsもオリジナルの配布セットを動的に
CDROM または近くの FTP サーバから取ってくるので, ディスクは
構築したいと思っている portsの分だけを準備しておけば十分です.
ほとんどの portsは, すでにコンパイルされた状態で
“package” として提供されており,
ソースコードからコンパイルしたくない場 合, これを使うと (pkg_add
というコマンドで) 簡単にインストー ルできます.
FreeBSD 2.1 以降のマシンであれば,
/usr/share/doc
ディレクトリにインストールの手順や FreeBSD を利用する上で有用な
ドキュメントがたくさんあります.
これらのローカルにインストールされたドキュメントは, HTML
ブラウザを使って, 以下の URL から 参照することができます.
FreeBSD ハンドブック (英文オリジナル)
file:/usr/share/doc/handbook/handbook.html
FreeBSD に関する FAQ
file:/usr/share/doc/FAQ/FAQ.html
また, http://www.freebsd.org
にはマスタ (かなり頻繁に更新されます) がありますので,
こちらも参照してください.
合衆国の輸出規制のため, FreeBSD のコア配布セットには DES
のコードは 含まれていません. 合衆国国内に限り, DES
を使うプログラムなどが,
コア配布セットに加えるパッケージとして提供されています.
誰でも使えるパッケージは, 別途, 合衆国国外で提供されています.
合衆国国外からも自由に取得可能な DES の配布セットに関する
詳細は, FreeBSD FAQ
にあります.
FreeBSD 上で必要とされるセキュリティがパスワードだけであり,
Sun や DEC
などの別のホストから暗号化されたパスワードをコピーする必要が
ないのであれば, FreeBSD の MD5 ベースのセキュリティで十分です.
この標準のセキュリティモデルは DES
よりも適していると私たちは思って いますし, また,
やっかいな輸出規制にもひっかかることはありません.
あなたが合衆国国外にいるなら (あるいは国内にいても)
一度試してみて ください!
diff --git a/ja_JP.eucJP/books/handbook/ports/chapter.sgml b/ja_JP.eucJP/books/handbook/ports/chapter.sgml
index 1c343d7c23..02245a926c 100644
--- a/ja_JP.eucJP/books/handbook/ports/chapter.sgml
+++ b/ja_JP.eucJP/books/handbook/ports/chapter.sgml
@@ -1,5233 +1,5233 @@
アプリケーションのインストール : ports コレクション
原作: &a.jraynard;.
訳: &a.jp.masaki;, &a.jp.saeki;.
11 November 1996.
FreeBSD の ports コレクションを利用すると, 最小限の労力で
非常に幅広くのアプリケーションのコンパイルとインストールがおこなえます.
やってみたことのある方はよくご存知でしょうが,
オープンな規格とは 全くの誇大広告であって,
あるプログラムを異なるバージョンの Unix 上で
動作させることは退屈で手間のかかる仕事です.
求めているプログラムが自分のシステムでうまくコンパイルでき,
正しいところにインストールできて,
完璧に動作するとしたらとてもラッキーです. しかし,
あいにくこれは滅多にないことなのです.
ほとんどのプログラムについて,
あなたは髪を掻きむしることになるでしょうし,
かなりのプログラムでは, 白髪混じりの頭になってしまったり,
あるいは慢性の 脱毛症にすら なってしまうかもしれません...
いくつかのソフトウェアディストリビューションでは,
設定用のスクリプトを
配布することでこの問題を解決しようとしています.
これらのスクリプトの中には非常に精巧なものもありますが,
残念ながら, 中にはこれまで
聞いたこともないようなシステムの名前をしゃあしゃあと
言い放ったうえに, まるでシステムレベルの Unix
プログラミングに関する 最終試験のような,
たくさんの質問をしてくる場合があります. (例えば,
このシステムの gethitlist 関数は fromboz への const
ポインタを 返しますか? それとも const fromboz
へのポインタを返しますか?, このシステムには
Foonix スタイルの, 容認できない例外処理をおこなう
ルーチンがありますか? もしもないとしたら,
それはなぜですか?)
幸いなことに, ports コレクションがあれば,
これらのきつい作業はすべて 完了しています. make
install とタイプするだけで, 動作するプログラムを
入手することができるのです.
なぜ ports コレクションを作ったのか?
FreeBSD の基本システムは,
非常に多くのツールやユーティリティから 構成されています. しかし,
よく使われるプログラムのうち多くのものが,
この基本システムには含まれていません. その理由は:-
ある Lisp ベースのエディタのように,
それがないと生きていけないと 言う人もいれば,
ディスクの無駄だと言う人もいるようなプログラム.
基本システムに組み込むには特殊すぎるプログラム. (CAD
やデータベースなど.)
“時間のある時に,
ちょっと見ておかなければ”というような類の,
それがシステムに含まれていないことが
致命的とは言えないプログラム. (おそらく,
何らかの言語などでしょう.)
FreeBSD
のような真面目なオペレーティングシステムの一部として
供給するには遊びが過ぎるようなプログラム. ;-)
たくさんのプログラムを基本システムに組み込んだとしても,
もっともっと 組み込みたいという要求が出てくるので,
どこかで制限を引かなくてはならないため. (そうしなければ
FreeBSD の配布物は,
とてつもなく膨大になってしまうでしょう.)
すべての人が自分のお気に入りの
プログラムを手作業で移植しなければ ならないとしたら,
(途方もない膨大な作業の繰り返しをさておいたとしても)
それは明らかに不合理な話です. そこで, FreeBSD プロジェクトでは,
標準のツールを使って移植のプロセスを
自動化する巧妙な方法を考え出しました.
なお,
これは単純ながら非常に柔軟なツールを組み合わせることで,
非常に強力な働きをさせるという“Unix
流”の作業の優れた実例です.
ports コレクションはどのように動くのでしょうか?
インターネットでは通常, tarball の形で
プログラムが配布されています. これは, Makefile
とソースコードで構成され, 普通は何らかの説明書 (あいにく,
いつもわかりやすく書かれているとは 限りませんが)
が付属しています. ことによるとコンフィグレーションスクリプトも
含まれているかもしれません.
標準的な手順では, FTP で tarball を入手して,
適当なディレクトリで展開します. 次に説明書を読んで,
必要な変更をおこないます. そして, 設定スクリプトを実行し, 標準の
make
コマンドを使ってソースのコンパイルとインストールを
おこないます.
FreeBSD の ports も tarball の仕組みを利用していますが,
これはユーザが 苦労して作業することを期待したものではなく,
どのようにすれば FreeBSD 上で
そのプログラムが動くようになるかという「ノウハウ」を スケルトン
を使用して収めているものです. スケルトンは, カスタマイズ済みの
Makefile も
提供していますので, ほとんどすべての ports
は同じ手順でインストールすることが できます.
もしあなたが (あなたの
FreeBSD システム または
FTP サイト にある) ports スケルトンを見ていて,
そこに潜んでいる あらゆる種類の先端的な
ロケット工学的なものを見つけられると期待していると,
つまらなそうなファイルやディレクトリがそこにあるだけなのを見て,
がっかりするかもしれません.
(ports を手に入れる方法については, すぐに
FreeBSD ports コレクションの入手方法
の節でお話します.)
“一体どうしたらいいんだ? ここにはソースコードが
ないじゃないか?”
というあなたの叫びが聞こえるようです.
心配いりません. おとなしく読んでいけば, すべてが (たぶん)
明らかに なるでしょう. 試しに ports をインストールして,
何が起きるのかを見てみましょう.
ここではサンプルとして開発者向けの便利なツール,
ElectricFence を選択します.
このスケルトンを選んだ理由は, 他の ports
に比べても素直で理解しやすく 書かれているからです.
自宅で試してみる場合には, root
になる必要があるでしょう.
&prompt.root; cd /usr/ports/devel/ElectricFence
&prompt.root; make install
>> Checksum OK for ElectricFence-2.0.5.tar.gz.
===> Extracting for ElectricFence-2.0.5
===> Patching for ElectricFence-2.0.5
===> Applying FreeBSD patches for ElectricFence-2.0.5
===> Configuring for ElectricFence-2.0.5
===> Building for ElectricFence-2.0.5
[大量のメッセージをコンパイラが出力します...]
===> Installing for ElectricFence-2.0.5
===> Warning: your umask is "0002".
If this is not desired, set it to an appropriate value
and install this port again by ``make reinstall''.
install -c -o bin -g bin -m 444 /usr/ports/devel/ElectricFence/work/ElectricFence-2.0.5/libefence.a /usr/local/lib
install -c -o bin -g bin -m 444 /usr/ports/devel/ElectricFence/work/ElectricFence-2.0.5/libefence.3 /usr/local/man/man3
===> Compressing manual pages for ElectricFence-2.0.5
===> Registering installation for ElectricFence-2.0.5
ここではあなたが混乱しないように, コンパイル時の出力を
すべて取り除いてあります.
もしもあなた自身で実行されたら, 最初にこのような
出力結果が得られるはずです:-
&prompt.root; make install
>> ElectricFence-2.0.5.tar.gz doesn't seem to exist on this system.
>> Attempting to fetch from ftp://ftp.doc.ic.ac.uk/Mirrors/sunsite.unc.edu/pub/Linux/devel/lang/c/.
make プログラムは,
あなたの手元にソースコードがないことを検出し,
処理を続けられるようにソースを FTP でダウンロードしようとします.
この例では, あらかじめ手動でソースコードを用意してあったので,
持ってくる必要はありませんでした.
では, 続けて make
プログラムが何をしているのか見てみましょう.
ソースコード tarball のありかを
確認します. 手元にファイルが存在しなければ, FTP
サイトから入手しようとします.
チェックサム
テストを実行して, その tarball
が事故か何かで途中で切れていたり, ASCII モードで
ダウンロードされていたり,
転送中にニュートリノによって傷められたりして
改変されたりしていないかどうかを確認します.
tarball を一時的な作業用ディレクトリに展開します.
FreeBSD 上でコンパイルしたり, 動作させるのに必要な
すべての パッチ
をソースコードに当てます.
構築のために必要な
コンフィグレーションスクリプトを実行します.
コンフィグレーションスクリプトの
質問には正確に答えてください.
(いよいよ!) ソースコードをコンパイルします.
実行形式のプログラム, マニュアル,
その他のサポートファイルを,
システムのプログラムと混ざってしまわないように
/usr/local 以下に インストールします.
ports はすべて同じ場所にインストールされ,
システムのあちこちにばらまかれることはありません.
インストール結果はデータベースに登録されます.
これにより,
インストールしたプログラムがもしも気に入らなかったときも,
システムから すべての痕跡をきれいに 消去
することができます.
以上のステップが make
の出力と一致しているかどうか確認してください.
今まで確認していなかったのなら,
今からするようにしてください!
FreeBSD ports コレクションの入手
あるプログラムの FreeBSD port
を入手するには二つの方法があります. ひとつは FreeBSD CD-ROM を使う方法で,
もうひとつは インターネット接続
を使う方法です.
CD-ROM からコンパイルする
FreeBSD CD-ROM がドライブに入っており,
/cdrom にマウントされていると仮定すると
(マウントポイントが /cdrom
である必要があります), ただ普通に実行するだけで ports
を構築できるようになり, tarball
をネットワーク経由でダウンロードするのではなく
/cdrom/ports/distfiles/
からさがすようになります (そこにあればの話ですが).
CD-ROM にある port スケルトンを使いたければ, 他に
/etc/make.conf の
変数を以下のようにセットする方法があります:
PORTSDIR= /cdrom/ports
DISTDIR= /tmp/distfiles
WRKDIRPREFIX= /tmp
(任意の十分な空きスペースの場所を /tmp
とおいています).
次に, /cdrom/ports 下の適宜のサブディレクトリに
cd して, 例のごとく
make install とタイプします.
WRKDIRPREFIX は port に
/tmp/cdrom/ports の下でビルドさせようとします;
例えば, games/oneko は
/tmp/cdrom/ports/games/oneko の下で
ビルドされるでしょう.
ライセンスの制限により, いくつかの ports
でオリジナルのソースコードを CD-ROM
に入れることができなかったものがあることに注意してください.
この場合, インターネット経由で
ports をコンパイルする の
節を参照してください.
インターネット経由で ports をコンパイルする
CD-ROM を持っていなかったり, その ports
の最新バージョンを確実に入手したい 場合は, その ports の スケルトン を
ダウンロードする必要があります. ところで, これは落し穴が
たくさんある作業に見えるかもしれませんが,
実際には非常に簡単です.
初めに, あなたの動かしている FreeBSD
がリリースバージョンなら ports ページ
でその FreeBSD 用の “アップグレードキット”
を手にいれてください. このパッケージには, 最新の ports
をコンパイルするのに必要な,
リリース以降に更新されたファイルが含まれています.
FreeBSD の FTP サーバーがその場で tarball
を作成できることを利用してスケルトンを入手すると
非常に便利です. ここでは例として databases ディレクトリにある
gnats プログラムを使って説明します.
(角型かっこの中の文はコメントなので, 実際に実行する場合には,
これをタイプしないでください!):-
&prompt.root; cd /usr/ports
&prompt.root; mkdir databases
&prompt.root; cd databases
&prompt.root; ftp ftp.freebsd.org
[ユーザ名 `ftp' でログインし, パスワードを要求されたら, あなたの電子メール
アドレスを入力してください. バイナリモードを (イメージモードと呼ばれることも
あります) 使うのをお忘れなく!]
> cd /pub/FreeBSD/ports/ports/databases
> get gnats.tar
[gnats スケルトンの tarballs を取得]
> quit
&prompt.root; tar xf gnats.tar
[gnats スケルトンの展開]
&prompt.root; cd gnats
&prompt.root; make install
[gnats の構築とインストール]
さて何が起きるでしょうか? FTP
サイトにいつも通りに接続して, データベースの
サブディレクトリに移動します. get gnats.tar
とコマンドを入力すると, FTP サイトでは gnats ディレクトリを
tarred
にしてくれるのです.
gnats スケルトンを展開したら, gnats ディレクトリへ移動して
ports を構築します. すでに
説明したように, make の過程で
手元にソースコードがないことを検出すると,
ソースコードを取得してから 展開し,
パッチ当てと構築をおこないます.
それでは, 少し冒険をしてみましょう. 一つの ports
スケルトンを 取得するかわりに, たとえば ports
コレクションの中のデータベースの スケルトンをすべて,
サブディレクトリ全体を取得してみましょう.
やり方はほとんど同じです:-
&prompt.root; cd /usr/ports
&prompt.root; ftp ftp.freebsd.org
[ユーザ名 `ftp' でログインし, パスワードを要求されたら, あなたの電子メール
アドレスを入力してください. バイナリモードを (イメージモードと呼ばれることも
あります) 使うのをお忘れなく!]
> cd /pub/FreeBSD/ports/ports
> get databases.tar [データベースディレクトリの tarballs を取得]
> quit
&prompt.root; tar xf databases.tar [すべてのスケルトンを展開]
&prompt.root; cd databases
&prompt.root; make install [データベース ports 全部の構築とインストール]
わずかばかりの簡単なコマンドで, この FreeBSD
マシン上にデータベース
プログラムを一揃い手に入れてしまいました! 一つの ports
スケルトンを取ってきて それを構築する場合との違いは,
すべてのディレクトリを一度に取得して,
全部を一度にコンパイルしたということだけです.
かなり感動的だと思いませんか?
たくさんの ports をインストールする つもりなら,
おそらくすべての ports ディレクトリをダウンロードしておく
価値があるでしょう.
スケルトン
スケルトン (訳注: skeleton とは骸骨のことです) とは,
締め切りを守るため, 食事をするのを忘れるほど仕事にのめり込んだ
ハッカーたちのなれの果ての ことでしょうか? FreeBSD
の屋根裏に潜む, なにか気持ちの悪いものでしょうか? いいえ,
ここでスケルトンの意味するところは, ports の魔術を実現するのに
必要とされるすべてのものを提供する最小の骨組みのことです.
Makefile
スケルトンのもっとも重要な要素は Makefile です. Makefile
は ports を どのようにコンパイルし,
インストールをおこなうかを指示する
いろいろな命令を含んでいます. 以下に ElectricFence の Makefile
を示します:-
# New ports collection makefile for: Electric Fence
# Version required: 2.0.5
# Date created: 13 November 1997
# Whom: jraynard
#
# $Id$
#
DISTNAME= ElectricFence-2.0.5
CATEGORIES= devel
MASTER_SITES= ${MASTER_SITE_SUNSITE}
MASTER_SITE_SUBDIR= devel/lang/c
MAINTAINER= jraynard@freebsd.org
MAN3= libefence.3
do-install:
${INSTALL_DATA} ${WRKSRC}/libefence.a ${PREFIX}/lib
${INSTALL_MAN} ${WRKSRC}/libefence.3 ${PREFIX}/man/man3
.include <bsd.port.mk>
"#" で始まる行は, 人間のためのコメント行です.
(ほとんどの Unix のスクリプトと同じですね.)
DISTNAME は tarball
の名前から拡張子を取ったものです.
CATEGORIES
はこのプログラムの種類を示します. この場合,
開発者向けのユーティリティということになります.
完全なリストはこのハンドブックの カテゴリ
をみてください.
MASTER_SITES はマスタ FTP サイトの URL
です. もしローカルシステムに tarball がない場合には,
ここから取得します. これは信頼できると考えられているサイトで,
通常はそのプログラムを
インターネット上で公式に配布しているサイトです.
(そのソフトウェアがインターネット上で「公式に」
配布されているとしたら)
MAINTAINER は,
例えば新しいバージョンのプログラムが出た場合に, 必要であれば
スケルトンの更新をおこなう保守担当者の
電子メールアドレスです.
次の数行はとりあえず飛ばします.
.include <bsd.port.mk>
この行は, この ports に必要なその他の命令やコマンドは
bsd.port.mk に
入っているということを示しています.
これらはすべての ports で共通のものなので,
それぞれの Makefile に書いておく必要はありません.
そのため単一の標準ファイルに
まとめられているのです.
ここでは Makefile
がどう働くかを詳細に調査するのが目的ではありませんので,
MAN3 で始まる行は, インストールの後に
ElectricFence のマニュアルを 圧縮するために使用される,
と言っておくだけで充分でしょう. これにより,
貴重なディスクスペースが保護されているわけです. オリジナルの
port では install
ターゲットが用意されていないので,
do-install からの 3 行が この ports
によって生成されたファイルを
正しい場所に置くために使用されます.
files ディレクトリ
ports のチェックサム算出には MD5
アルゴリズムを使用しているので, この チェックサム を含んでいる
ファイルは md5 と呼ばれます.
ちょっと混乱するかもしれませんが, このファイルは
files という
名前のディレクトリに置かれています.
このディレクトリは, ports に必要だけれども,
他のどこにも属さない 雑多なファイルも含んでいます.
patches ディレクトリ
このディレクトリには, FreeBSD
ですべてを正常に動作させるのに 必要な パッチ が含まれています.
pkg ディレクトリ
このディレクトリには,
非常に役立つ三つのファイルが含まれています:-
COMMENT —
プログラムについての 1 行の説明.
DESCR — より詳細な説明.
PLIST —
プログラムのインストール時に作成される,
すべてのファイルのリスト.
ports が動かないのですが, どうしたらよいでしょう
おやおや. では, 次の四つのどれかをやってみてください:
自分で修正する. ports
の仕組みに関する技術的な詳細については,
アプリケーションの移殖方法をご覧ください.
苦情をいう. これは電子メールで だけ
にしてください! このようなメールの宛先は &a.ports; です.
なお, 必ず port の名前やバージョン, その port のソースや
distfile(s) を どこから入手したか,
どんなエラーが発生したのかを書いておいてください.
忘れてしまう. これはほとんどの場合最も簡単な方法です.
ports
のプログラムのうち必要不可欠な物はごくわずかです.
FTP サイトからコンパイル済みのパッケージを入手する.
“マスター”パッケージコレクションは FreeBSD の
FTP サイトの
パッケージディレクトリ に置いてありますが,
まずあなたの近くのローカルミラーサイトを確認してください!
ソースからのコンパイルに挑戦するよりも,
パッケージを使うほうが (全体的に見て)
ずっと確実に動作するでしょうし,
より手っ取り早い方法でもあります.
システムにパッケージをインストールするには, &man.pkg.add.1;
を使ってください.
質問と回答集
Q. 私はモデムについての議論を
しているのかと思っていました??!
A.なるほど, あなたはきっとコンピュータの背面についている
シリアルポートのことだと思ってしまったのでしょう.
あるバージョンの Unixから別のバージョンの Unix
へとプログラムを 移殖することを “porting”
というのですが, ここで我たちは “porting” の結果
という意味で “port” を使っています.
(コンピュータに関わる人々の悪しき習慣として,
ひとつの同じ言葉を複数の
まったく違う意味として使うことがあるのです.)
Q. 私は, 標準以外のプログラムのインストールには packages
を使うと 思っていたのですが.
A. そのとおり. 通常は packages
が最も手早くて簡単な方法です.
Q. それではどうして面倒な ports があるのですか?
A. いくつかの理由があります:-
いくつかのソフトウェアのライセンス条件には,
バイナリではなくソースコードでの
配布を求めているものがあります.
バイナリ配布を信用していない人もいます.
少なくともソースコード があれば, ソースコードを読んで,
(理論的には) 潜在的な問題点を自分で
見つけ出すこともできるはずです.
ローカルなパッチを入手した場合,
それを自分で追加するために
ソースコードが必要になります.
プログラムがいかにコンパイルされるべきかについて,
あなたはパッケージを作った人とは
異なる見解を持っているかもしれません.
どんな最適化オプションをつけるべきかとか,
デバッグバージョンを作ってから それを strip
するべきだとか, いや, そうするべきでない, などなど,
確固たる見解を持っている人もいるでしょう.
ソースコードを手元に置いておきたい人たちもいます.
彼らは, 退屈したときに眺めたり, あちこち解析してみたり,
ソースコードを 借用したり (もちろん,
ライセンスが許せばの話ですが) するのです.
あなたがソースコードを持っていなければ,
それはソフトウェアとは 言えませんね! ;-)
Q. パッチとは何ですか?
A. パッチとは,
あるバージョンから他のバージョンへどのように変更するかを
示す, (通常は) 小さなファイルです. “23
行目を削除”, “468 行目の後に これらの 2
行を追加”, または“197
行目をこのように変更”というような 内容を含んでいます.
これは, “diff”
という名前のプログラムで生成されます.
Q. tarball とは一体何ですか?
A. .tar または
.tar.gz という拡張子を持つファイルです.
(.tar.Z のようなバリエーションも
ありますし, DOS のファイルシステム用に
.tgz
と短縮される場合もあります.)
これは基本的に, 一つのファイルに固めた
(.tar) ディレクトリツリーです.
圧縮されている (.gz) 場合もあります.
これは元々 Tape
ARchives (訳注: テープアーカイブ)
(このため tar という名前なのです)
で使われていたものなのですが,
インターネット上でプログラムのソースコードを配布するために
広く使われている方法です.
これらのファイルの中身を見たり,
展開したりすることもできます. FreeBSD
の基本システムに付属する Unix 標準の tar
コマンドを使ってみると 次のようになります:-
&prompt.user; tar tvzf foobar.tar.gz
&prompt.user; tar xzvf foobar.tar.gz
&prompt.user; tar tvf foobar.tar
&prompt.user; tar xvf foobar.tar
Q. チェックサムとは何ですか?
A. これは,
チェックしたいファイル中のすべてのデータを加えて生成した
数値です. 何か文字が書き換わっていたら,
チェックサムが一致しなくなります. そのため,
単純な比較だけで違いを見つけることができるのです.
(実際には, 文字の位置が入れ替わるなどの,
単純な加算ではわからない問題も
見つけることができる複雑な方法で計算されています.)
Q. 私は, CD-ROM から ports
をコンパイルする にしたがって ports
をインストールしていました. kermit
をインストールしようとするまではうまくいっていました:-
&prompt.root; 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 に指示することができます.
&prompt.root; make DISTDIR=/where/you/put/it install
Q. ports では, すべてを /usr/ports
に置いたときだけ動作するのでしょうか?
システムの管理者によると, 私の個人的なファイルは
/u/people/guests/wurzburger
に入れなければならないのですが, これでは
うまくいかないように思います.
A. PORTSDIR 変数と
PREFIX 変数を変更することで,
違うディレクトリを 使用することができます. 例えば,
&prompt.root; make PORTSDIR=/u/people/guests/wurzburger/ports install
とすると, ports は
/u/people/guests/wurzburger/ports
でコンパイルされ, すべて /usr/local
以下にインストールされます.
&prompt.root; make PREFIX=/u/people/guests/wurzburger/local install
この場合, コンパイルは /usr/ports
でおこない,
/u/people/guests/wurzburger/local
にインストールします. もちろん,
以下のように両者を組み合わせることも可能です.
&prompt.root; make PORTSDIR=.../ports PREFIX=.../local install
(省略せずに記述したら,
このページに収めるには長すぎるのですが,
考え方は理解していただけたと思います)
もし ports をインストールするたびに,
これらを毎回タイプするのが 気に入らないのであれば,
(正直に言って, 誰もそう思わないでしょう)
これらを環境変数にセットしてしまうという手があります.
Q. 私は, FreeBSD の CD-ROM を持っていませんが,
私はすべての tarball を 私のシステムに置いておきたいのです.
そうすれば, 私は ports をインストール するたびに,
毎回ダウンロードが終わるのを待たなくてすむでしょう.
これを一度におこなう簡単な方法はありませんか?
A. ports コレクション全体の tarball を持ってくるには,
次のようにしてください.
&prompt.root; cd /usr/ports
&prompt.root; make fetch
ports の下のディレクトリひとつの tarball
を持ってくるには, 次のように してください.
&prompt.root; cd /usr/ports/directory
&prompt.root; make fetch
ports をひとつだけ持ってくる方法は,
きっと既にご存知だと思います.
Q. マスタ FTP サイトから tarball を持ってくるより,
近くにある FreeBSD の
ミラーサイトから持ってきた方が速いはずです. MASTER_SITES
に書かれている サイト以外から持ってくるように ports
に指示する方法はありませんか?
A. もちろんあります. 例えば ftp.FreeBSD.ORG が
MASTER_SITES に書かれている
サイトより近いとしたら, 以下のようにしてください.
&prompt.root; cd /usr/ports/directory
&prompt.root; 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 に付属している バージョン) では,
オプションを
オプションなしで
使うと, バグのあるコードを出力します (ほとんどの ports は
オプションを 使いません).
コンバイラオプションは次のように定義 すべき
です.
&prompt.root; 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
を見つけることができます:
&prompt.user; cd /usr/ports
&prompt.user; make search key=lisp
Q. foo ports
をインストールしたいのですが, それのコンパイルは
すぐに停止して, bar ports
のコンパイルが始まってしまいます. 一体どうして?
A. foo ports が,
bar ports
の提供する何らかの機能を必要としているからです. 例えば
foo が画像を使うとすると,
bar は画像処理に必要な
ライブラリを持っている, などです. または,
bar は foo
をコンパイルするのに必要なツールなのかもしれません.
Q. ports から
grizzle
プログラムをインストールしましたが, まったく
ディスクスペースの浪費です. 削除したいのですが,
すべてのファイルが どこへインストールされたのかわかりません.
何か手がかりはありませんか?
A. 大丈夫, 次のようにしてください.
&prompt.root; pkg_delete grizzle-6.5
Q. ちょっと待ってください.
削除しようとするコマンドのバージョン番号を
知っていなくてはならないのでしょうか? あなたは,
私がバージョン番号を
覚えていることを本気で当てにしているのでしょうか?
A. そんなことはありません.
バージョン番号は次のようにすればわかります.
&prompt.root; 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. はい. インストールが首尾よく終わり,
もうソースコードが必要でないと思うなら,
それらを残しておく理由はないでしょう. 一番よい方法は,
次の通りです.
&prompt.root; cd /usr/ports
&prompt.root; make clean
これは, すべての ports のサブディレクトリを調べ, 各
ports のスケルトン以外の削除をおこないます.
Q. これを試してみたのですが, tarball や ports
で使われたファイルが distfiles
ディレクトリに残っています.
これも削除してしまっても大丈夫ですか?
A. はい. それを使った作業が終わったのであれば,
削除してしまっても大丈夫です.
Q.
私はとてもとてもたくさんのプログラムを楽しみたいのです.
一度にすべての ports
をインストールする方法はありませんか?
A. 次のようにしてください.
&prompt.root; cd /usr/ports
&prompt.root; make install
Q. やってみました. 時間がとてもかかるだろうと思ったので,
そのまま実行を 続けさせて, 私は寝ました.
翌朝コンピュータを見てみると, 三つ半の ports しか
処理が終わっていませんでした.
なにか悪かったのでしょうか?
A. これは ports の中には私たちの決められないこと
(例えば, あなたが A4 の 用紙に印刷したいのか, US
レターサイズの用紙に印刷したいのかなど) について
質問してくるものがあるからです.
それらの質問には手動で答える必要があります.
Q.
私は一日中モニタの前に座って過ごしたりしたくないのですが.
何かよいアイデアはありませんか?
A. では, あなたが寝に / 仕事に /
公園にいく前に以下を実行してください:-
&prompt.root; cd /usr/ports
&prompt.root; make -DBATCH install
これでユーザの入力を要求しないすべての ports
をインストールします. そして, 戻ってきてから,
次のように実行してください.
&prompt.root; cd /usr/ports
&prompt.root; make -DIS_INTERACTIVE install
そして, 残りの作業を実行してください.
Q. 私たちは ports コレクションにある
frobble を使っています. ですが,
私たちの必要に応じて ports を変更したところがあるのです.
自分でパッケージを作って, それを私たちのサイトのまわりに
簡単に配布できるような方法がありますか?
A. もちろんあります.
変更点をパッチにする方法は知っていますよね:-
&prompt.root; cd /usr/ports/somewhere/frobble
&prompt.root; make extract
&prompt.root; cd work/frobble-2.8
[あなたのパッチを当ててください]
&prompt.root; cd ../..
&prompt.root; make package
Q. この ports の技術は本当に賢いですね.
どのようにして動いているのか
私はどうしても知りたいと思います. その秘密は何ですか?
A. 秘密は一切ありません. Makefiles
ディレクトリ にある
bsd.ports.mk と
bsd.ports.subdir.mk
ファイルを見るだけです.
複雑なシェルスクリプトを嫌う読者は,
このリンクを追いかけないほうが よいでしょう.
自分で port を作る
原作: &a.jkh;, &a.gpalmer;, &a.asami;,
&a.obrien; and &a.hoek;. 28 August 1996.
訳: &a.jp.simokawa;, &a.asami;.
10 November 1996.
自分で port を作ることに興味がありますか, すばらしい!
これから, FreeBSD 用のportを作る際の,
いくつかのガイドラインを 説明します.
実際にportをコンパイルするときのほとんどの仕事は
/usr/ports/Mk/bsd.port.mk
というファイルでおこないます.
Portsコレクションについてのさらに細かい内部の働きについては,
そちらの ファイルを参照してください.
これにはコメントが細かく書いてありますので, Makefile
を読むのにあまり慣れていない人でも, 得るものはとても大きいで
しょう.
ここでは, 変更可能な変数の一部についてのみ記述しています.
ほとんどの変数はbsd.port.mk
の始めに記述があります.
また, このファイルは非標準のタブの設定になっています.
Emacs や Vim
はファイルのロード時にこれを認識しますが,
viやexでは,
ファイルをロードしたら :set tabstop=4
のようにして正しい値を設定する
ことができます.
3分porting
この節では, 簡単なportの方法について説明します.
多くの場合これ では不十分ですが,
まあうまくいくかどうか試してみて損はないでしょ う.
まず, 元のtarファイルをDISTDIRに置きます.
デフォルトは/usr/ports/distfilesです.
以下では,
ソフトウェアはそのままコンパイルされるとします. つまり,
FreeBSDのマシンで動かすために, 変更がまったく必要ない
とします.
もしなにか変更が必要な場合には次の節も参照する必要
があります.
Makefile の作成
最小限のMakefile
は次のようなものです:
# New ports collection makefile for: oneko
# Version required: 1.1b
# Date created: 5 December 1994
# Whom: asami
#
# $Id$
#
DISTNAME= oneko-1.1b
CATEGORIES= games
MASTER_SITES= ftp://ftp.cs.columbia.edu/archives/X11R5/contrib/
MAINTAINER= asami@FreeBSD.ORG
MAN1= oneko.1
MANCOMPRESSED= yes
USE_IMAKE= yes
.include <bsd.port.mk>
おわかりになりますでしょうか.
$Id$があ る行の内容については,
気にしないでください. これはこのファイル
がportsツリーに書き込まれるときにCVSによって自動的に書
き込まれます. もっと詳しい例が見たければ, Makefileのお手本
の節をご覧ください.
Package記述ファイルの作成
どのようなportでも, packageにするしないに関わらず, 3つ
の記述ファイルが必要です.
pkgサブディレクトリにある,
COMMENT, DESCR,
それに PLISTです.
COMMENT
これには, そのportについての説明を1行で書きます.
Package の名前, バージョン番号等は
含めないでください. たとえば,
こんな具合です:
A cat chasing a mouse all over the screen.
DESCR
これは, そのソフトウェアについての,
すこし長い説明を記述します. その port
が何をするのかについての数段落程度の
簡潔な解説があれば十分です.
このファイルはマニュアルでもなければ,
使用方法やコンパイル方法についての細かい
説明書でもありません. 特に,
READMEファイル manpage
をコピーしようとしてしている場合には
注意してください. これらは多くの場合,
そのポートの簡潔な説明に なっていなかったり,
扱いにくい形式(manpage の場合,
行を揃えるために空白が調整されます)になっていたりします.
もしこのソフトウエアに公式の WWW のホームページがあれば,
ここに書いて下さい. 自動化ツールが正しく動作するように,
Web サイトのうちの ひとつ には, 前に
WWW: を付け加えてください.
このファイルの最後にあなたの名前を書くことが
推奨されています. たとえば, こんな具合です.
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
PLIST
このファイルには,
このportによってインストールされるファ
イルが列挙されます. このファイルはpackageを作る際のリス
トとして使われるため, `packing list' とも呼ばれます.
ここ に書かれているファイル名は,
インストール時のプレフィックス (普通は
/usr/local か
/usr/X11R6) からの 相対パスです.
MANn
変数を使用する場合(使用することが推奨されています)には,
マニュアルはここに入れないでください.
簡単な例を載せておきましょう:
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
'Packing list'の詳細については, &man.pkg.create.1;
の マニュアルを参照してください.
すべてファイルを列挙しなければなりませんが,
ディレクトリ名は必要ありません. また, ports
がインストール時にディレクトリを作成する場合には,
@dirrm の行を加えて, その port
が削除されるとき,
そのディレクトリも削除されるようにしてください.
このファイルには,
ファイル名をアルファベット順に並べるようにしてください.
port のアップグレートのとき,
楽に確認ができるようになります.
チェックサムファイルの作成
ただ, make makesum
と入力するだけです. bsd.port.mk
にルールがあるので,
自動的にfiles/md5が生成されます.
Portのテスト
そのportが正しく動くことを,
package化を含めて確認してください.
以下の重要なポイントを確認してください.
PLIST にその port
がインストールしないものが含まれていないこと.
PLIST にその port
がインストールする全てのものが含まれていること.
reinstall
ターゲットを使うことによって,
何度でもインストールが可能こと.
deintall の際に 後片付け
をすること.
推奨されるテストの手順
make install
make package
make deinstall
pkg_add `make package-name`
make deinstall
make reinstall
make package
package および
deinstall の段階で,
どんな警告(warning)も出力されないことを確認してください.
ステップ3の後,
新しいディレクトリが全て正しく消去されているかを
確認してください. また,
ステップ4の後にそのソフトウェアを使用してみて, package
からインストールされた場合に正しく動作するかを
確認してください.
portlint でチェック
portlintを使って, あなたの port
が我々のガイドラインそっているかを確認してください.
portlint プログラムは ports
コレクションに含まれています. 特に, Makefile
が正しい形式になっているか, package
の名前が正しいか, をチェックするのに良いでしょう.
Portの送付
まず, やってよいことといけないこと
についての節を読んでください.
さあ, あなたのportに満足したら,
あとはそれをFreeBSDのメイ ンのportsツリーに置いて,
皆に使ってもらうだけです. いまある
work ディレクトリや
pkgname.tgz
パッケージは必要ありませんから, まず消去してください.
あとは, バグレポートの中に shar `find
port_dir` の出力を, &man.send-pr.1;
プログラムを使用して送ってください. &man.send-pr.1;
についての詳細は, バグ報告と一般的な論評
を参照してください.) もし, 圧縮していない状態で,
20KB以上あるようなポートであれば, 圧縮して tar
ファイルにして, バグレポートに入れる前に &man.uuencode.1;
を使用してください. (20KB以下のものでも, tar
ファイルにして送ってもよいですが, あまり歓迎されません).
バクレポートの category は ports, class
は
change-requestを必ず使用してください.
(レポートを confidential (内密)
にしないようにしてください!)
もう一度, オリジナルのソースファイル,
work ディレクトリ, make
package
で作成したパッケージが含まれていないこと
を確認してください.
以前, 新しい port をわれわれの ftp サイト (ftp.freebsd.org)
にアップロードするようにお願いしたことがありますが,
現在このサイトの incoming
ディレクトリは読み出し不可になっており,
いまでは推奨されていません.
沢山の海賊版ソフトウェアがそこに置かれたためです.
私たちは, 何か不明な点があったらあなたに確認したのち,
それをツリーへ置きます. あなたの名前は, FreeBSD
ハンドブックやその他のファイルの “Additional FreeBSD
contributors” のリストにも載るでしょう. う〜ん,
素晴らし い. :)
本格的なport
残念ながら, 移植がそう簡単ではなく,
動かすために多少の変更が 必要な場合も多いでしょう.
この節では, portsコレクション の方法論にのっとって,
そのような場合にどのように変更を施し, 動
くようにしたらよいかを順を追って説明します.
port構築の詳細
まず, あなたがportのディレクトリで
make とタイ
プしてから起こる一連の出来事について,順を追って説明しま
す. ここを読むときには, 他のウィンドウで同時に
bsd.port.mk
も開いておくとよいかもしれません.
しかし,
bsd.port.mkが何をしているのか,
完全に理解 できなくても心配する必要はありません.
そう多くの人が理解して いるわけではないですから... f(^_^;)
まず, fetch
というターゲットが実行されます.
このfetchターゲットは
ローカルディスクのDISTDIRに配布ファ
イルがあるようにするのが役目です. もし,
fetchが必要なファ
イルをDISTDIRに見つけることが
できなけ れば, Makefileに指定されているURL
MASTER_SITES,
そして私たちのFTPサイトで ある
ftp://ftp.freebsd.org/pub/FreeBSD/ports/distfiles/
(ここ には, 私たちが取ってきたファイルを
バックアップとして置いてあ ります) に探しにいきます.
そして, ユーザのサイトがインター ネットに
直接接続されている場合には, FETCH
を使って, その名前のファイルを取っ てきて,
DISTDIRに保存します.
次に実行されるのは
extract ターゲットです.
これは, DISTDIRにある, 配布ファイル
(普通は gzipされたtarファイル) を読み,
ソースを一時的な作業ディレ
クトリWRKDIR (デフォルトは
work) に展開します.
次に, patch
というターゲットが実行されます. まず,
PATCHFILESに定義されている,
すべてのパッ チをあてます.
次にもしPATCHDIR (デフォ ルトは
patches サブディレクトリ)
にパッチが存在す れば,
これらをアルファベット順にあてます.
次に実行されるターゲットは
configureです. これには, い
ろいろな場合があります.
もし存在すれば,
scripts/configure
が実行されます.
もし, HAS_CONFIGURE
あるいは GNU_CONFIGURE
がセットされていれば,
WRKSRC/configure
が実行されます.
もし, USE_IMAKE
がセットされていれば, XMKMF
(デフォルト: xmkmf -a)
が実行されます.
最後に, build
というターゲットが実行されます. これは, その port
の専用の作業ディレクトリ (WRKSRC)
にい き, コンパイルするのが役目です. もし
USE_GMAKE がセットされていれば, GNU
make が使用されます.
さもなければFreeBSDの make
が使用されます.
上記はデフォルトのルールです. さらに,
pre-何とか
や
post-何とか
というターゲット が定義してあった
り,そのような名前のスクリプトが scripts
サブディレクトリに置いてある場合には,
それらはデフォルトの動作の前
後に実行されます.
たとえば, post-extract
というターゲットがMakefile で定義されていて,
pre-build というファイルが,
scripts
サブディレクトリにあるとすると,
post-extractターゲットは,
通常の展開動作のあとに呼 び出され,
pre-build
スクリプトはデフォルトのコンパイ
ルのルールが実行される前に実行されます.
もし動作が簡単であれ ば, Makefile
のターゲットを使用することが推奨されています. な ぜならば,
そのportが何らかのデフォルトではない動作を必要とす
るのかどうかが一箇所にまとめて書いてあった方が他の人に
理解しやす いからです.
デフォルトの動作は bsd.port.mk の
do- 何とか
というターゲットでおこなわれます. たとえば,
portを展開するコマンドは,
do-extract
というターゲットにあります. もし,
デフォルトのターゲットに 不満があれば,
do- something
というターゲッ
トを再定義することによって,
どのようにでも直すことができます.
“メイン”のターゲット (例えば,
extract,
configure等) は,
すべての前段階が実行されていること を確認して,
実際のターゲットやスクリプトを呼び出す以外のこと
はしません.
bsd.port.mkはこれらが変更されることは仮定してい
ませんので, もし, 例えば, 展開の仕方を直したいときには,
do-extract を直し,
絶対にextractには手を
触れないでください.
これで, ユーザが make
と入力したときに何が起こ るのかが理解できたと思います.
では, 完璧なportを手順を追っ て作ってみましょう.
オリジナルのソースの入手
オリジナルのソースを, (普通は)
圧縮されたtarファイルの形 (
foo.tar.gz
あるいは
foo.tar.Z)
で入手して, それを DISTDIR
にコピーします. 可能なかぎり, 広
く使われている主流の
ソースを使用するようにしてください.
もし, ネットワークへの接続のよい FTP/HTTP
サイトを見つけるこ とができなかったり,
頭にくるような非標準的な形式しか持ってい
ないサイトしか見つけられないときには, 自分で管理する確実な
ftp か http サーバ (たとえば,
あなたのホームページ)に置くこと ができます.
MASTER_SITES
に正しく反映されていることを確認してください.
もしも, そのような都合の良く,
安心な置き場所が見つけられない 場合(あなたが FreeBSD の
committer であれば, 自分の
public_html ディレクトリに置けます),
私たちが,
ftp://ftp.FreeBSD.ORG/pub/FreeBSD/ports/distfiles/LOCAL_PORTS/
に置き場所を提供できます.
この場所は, 変数 MASTER_SITE_LOCAL
を使って参照してください.
これについての問い合わせのメールは &a.ports へお願いします.
その port の配布ファイルが特に理由もなく,
しょっちゅう変る場合には,
配布ファイルをあなたのホームページに置いて
MASTER_SITESの最初に入れてください.
こうすることによって, ユーザ利用する場合に
checksum mismatch
エラーが起るのを防ぎ, 我々の ftp
サイトの保守の負担を減らすことができます. もし, master
site がたった一つしかない場合には,
あなたのサイトにバックアップを置いて
MASTER_SITES
の2番目に加えてください.
もし,
あなたのportに必要ないくつかの追加パッチがインター
ネット上で手に入るのならば, それらも取ってきて,
DISTDIR に置きます. もし,
それらがメイン
のソースのtarファイルとは別のサイトにあっても,
心配する必要 はありません.
そのような状況にはちゃんと対応できるようになっ ています.
(以下のPATCHFILESの記述
をご覧ください).
Portの修正
適当なディレクトリにtarファイルを展開して,
FreeBSDの最新の バージョン上で,
正しくコンパイルできるために必要なあらゆる変 更を施します.
最終的に処理は自動化するわけですから, 何をおこなっ
たかを注意深く記録しておきましょう.
あなたのport が完成した暁には, ファイルの削除, 追加,
修正を含むすべての処 理が,
自動化されたスクリプトやパッチファイルで
おこなえるようになっ ていないといけません.
もし, あなたの port
のコンパイルやインストールのために必要
な手作業があまりに多いようならば, Larry Wall の模範的な
Configure
スクリプトでも参考にしたほうがいいかもしれませ ん.
新しいportsコレクションは, 最小のディスクスペースで,
個々のportがエンドユーザにできるだけ“プラグ &
プレ
イ”の状態でmakeできることをめざしています.
あなたが作成し FreeBSD の ports
に寄付されたパッチファイル,
スクリプトおよびその他のファイルは,
明示的に記述されている場合 を除いては,
BSDの標準的な著作権条件によりカバーされていると見な
されます.
パッチをあてる
port
の過程で追加されたり変更されたファイルは再帰的diffで変
更点を取り出すことができます. パッチは適当にまとめて,
patch-xx
という名前のファイルに入れてくだ さい.
xx
はパッチが適用される順番を示します — これらは,
アルファベット順, つまり
aa が 最初, つぎに
ab などとなります. これらのファイル
をPATCHDIRに置いておくと,
自動的に適用さ れるようになっています. すべてのパッチは
WRKSRC (通常は, portのtarファイルが展
開されるところで, makeが実行されるところと同じです)
からの相 対パスになります.
修正やアップグレードを容易にするため, 2つ
以上のパッチが同じファイルを修正するのは避けてください.
(例,
patch-aaとpatch-abが共にWRKSRC/foobar.c
を修正する, など.)
コンフィグレーション
カスタマイズのために追加したいコマンドがあれば,
configure
という名前のスクリプトに入れて
scripts サブディレクトリに置きます.
上で述べたよ うに, pre-configure
あるいは post-configure という
Makefile
のターゲットおよび/あるいはスクリプトで処理す
ることもできます.
ユーザからの入力の扱い
もし, そのportがビルド, コンフィグレーション,
インストー ルの際にユーザからの入力を必要とするならば,
Makefileで
IS_INTERACTIVEをセットしてください.
これによって, 深夜,
自動的にたくさんのportをコンパイルすることが可能にな
ります. 環境変数BATCHがセットされていると
IS_INTERACTIVE
の定義されているportはスキップされ ます (そして,
ユーザがINTERACTIVEという変数をセッ
トすると入力を必要とする port
のみコンパイルされま す).
もし, 適切なデフォルト設定があるのであれば,
PACKAGE_BUILDING
変数をチェックして,それが設 定されて いる場合には,
ユーザ入力のスクリプトを起動しないように してください.
こうすることによって, CD-ROM や ftp に 置く
packageを我々が作成することができます.
Makefileの作成
Makefileの作成は非常に単純です. 繰り返しになりますが,
始める まえに, すでにある例を見てみることをお奨めします.
またこのハ ンドブックにはMakefileのお手本
があります. それを見て, Makefile内の変数の順番や空行を入れると
ころなどの参考にしてください. そうすると他の人々にも読みやすい
ものとなります.
では,
Makefileをデザインするときに問題となるところを順に追っ
て見てみましょう.
オリジナルのソース
ソースはDISTDIRに, 標準的なgzipされた
tarファイルとして置かれていますか? そうであれば, 次のステッ
プに進めます. そうでなければ, 変数
EXTRACT_CMD,
EXTRACT_BEFORE_ARGS,
EXTRACT_AFTER_ARGS,
EXTRACT_SUFX,
DISTFILES
を適当に書き換えないといけません.
どれだけ変更しないといけないかは, あなたのportの
配布ファイルがどの程度標準からかけはなれているかによりま す.
(最もよくある場合は, gzipではなく普通のcompressコマンド
でtarファイルが圧縮されている場合で,
EXTRACT_SUFX=.tar.Z
とするだけです.)
最悪の場合には, 自分で
do-extract ターゲットを作 成して,
デフォルトを上書きすることもできます. しかし, そこま
でする必要があることはめったにないでしょう.
DISTNAME
DISTNAME には port
の名前の基幹部分を入れ ます. デフォルトのルールでは,
配布ファイルのリスト (DISTFILES) は
DISTNAME EXTRACT_SUFX
という名前 になっています. 例えば,
foozolix-1.0.tar.gzの場 合,
通常のtarファイルだと,
DISTNAME=foozolix-1.0 のようになります.
さらにデフォルトのルールでは, tarファイルは
work/DISTNAME
というサブディレクトリ に展開されることを仮定しています,
例えば work/foozolix-1.0/
といった具合いです.
これらの動作はもちろんすべて変更可能です.
デフォルトのルー ルは最も標準的な場合を仮定しているだけです.
まず, port が複 数の配布ファイルを必要とするときには,
単に明示的に DISTFILESを設定してください.
もし, DISTFILES
の一部だけが実際に展開される場合 には,
それらをEXTRACT_ONLY に設定してくだ さい.
この変数が定義されている場合には, 展開時に
DISTFILESに優先して利用されます.
残りのファ イルもDISTDIRに取ってきますが,
展開時に
はなにもせずに後で使うためにそのまま置いておかれます.
PKGNAME
もし, DISTNAME が我々の package
の名前についてのガイドライン
に沿ったものでない場合には, PKGNAME
にもっと良い名前を設定してください.
詳細は上記のガイドラインを参照してください.
CATEGORIES (分類)
完成した package の実体は
/usr/ports/packages/All に置かれます.
また, 1つかそれ以上の
/usr/ports/packages
のサブディレクトリからのシンボリッ クリンクが作られます.
それらのサブディレクトリの名前が
CATEGORIES
という変数によって指定されます. これは,
ユーザがFTPサイトやCD-ROMのpackageの山を渡り歩
くことを容易にするためです. 現在存在する カテゴリを見て, そ
のportに適したもを選んでください.
このリストは, この port が port tree のどこに import
されるかも決定します. 2つ以上のカテゴリを指定した場合には
最初のカテゴリで指定されるサブディレクトリに置かれること
になります. 適切なカテゴリを選ぶ方法については, カテゴリ
の節を参照してください.
もしその port
が本当に現在存在するすべてのものとは異なって いる場合には,
新しいカテゴリ名を作ることもできます. その際には, &a.ports
宛てに新しいカテゴリ名を提案する
メールを送ってください.
カテゴリ名については,
なんのエラーチェックも行なわれません.ミスタイプがあっても
make package はなにも考えずに
新しいディレクトリを作ってしまいますので,
注意してください.
MASTER_SITES
オリジナルの配布ファイルを指し示す FTP または HTTP の
URL のディ レクトリ部分までを
MASTER_SITES に記録しま す. スラッシュ
(/) を最後につけることをお忘れなく.
配布ファイルがシステム上に存在しないときに,
makeマクロは FETCH
でこの変数に指定されたサイトから取っ てきます.
複数の,
できれば異なる大陸のサイトをこのリストに入れておく
ことが推奨されています. これによって, 広域ネットワークにトラ
ブルがあった場合でも成功する可能性が高くなります.
私たちはさら に, 自動的に最も近いマスタサイトを検出して,
そこから取って くるメカニズムの導入を計画しています.
オリジナルのtar ファイルが, X-contrib, GNU, Perl CPAN,
TeX CTAN または Linux Sunsite
などの有名なアーカイブにある場合には,
MASTER_SITE_XCONTRIB,
MASTER_SITE_GNU,
MASTER_SITE_PERL_CPAN,
MASTER_SITE_TEX_CTAN および
MASTER_SITE_SUNSITE を利用することで,
簡単にこれらのサイトを 指定することができます. あとは
MASTER_SITE_SUBDIR にアーカイ
ブ内でのパスを指定するだけです. 以下に例を示します.
MASTER_SITES= ${MASTER_SITE_XCONTRIB}
MASTER_SITE_SUBDIR= applications
ユーザは/etc/make.conf中で
MASTER_SITE_* 変数を設定
することによって, デフォルトの FTP サイトではなく, これらの
有名なアーカイブの
ミラーの中で好みのものを使用することが可能 です.
PATCHFILES
もし,
オリジナルの配布ファイル以外にもFTPかHTTPで手に入る
パッチが必要な場合には, PATCHFILESにファ
イル名を, PATCH_SITESにサイトとディレクト
リの名前を MASTER_SITES
と同様に設定してく ださい.
そのパッチ内のファイル名ががソースツリーの
一番上のディレク トリ (WKRSRC)
からの相対パスになっていな い場合には,
PATCH_DIST_STRIPを指定してく ださい.
例えば, パッチ内のファイル名にすべて余計な
foozolix-1.0/ がついている場合には,
PATCH_DIST_STRIP=-p1としてください.
これらのパッチは圧縮されていても大丈夫です. ファイル名が
.gz か .Z
で終わる場合には自動的に復元
されるようになっています.
もしパッチが, 文書などその他のファイルと一緒に gzip
された tarファイルで配布されている場合には,単純に
PATCHFILES を使うことはできません.
このような場合には, このパッチの tar ファイルの名前と場所を
DISTFILES と
MASTER_SITES に加えます. それから,
pre-patch ターゲットで,
パッチコマンドを走らせるか, パッチファイルを
PATCHDIR ディレクトリに
patch-xx
という名前でコピーするかして,
パッチを適用するようにします.
普通の gzip か compress された tar ファイルであれば,
通常のソースファイルと一緒にその時までに
展開されていますので, 明示的に展開する必要はありません.
もし, 後者の方法を使用する場合には,
すでにそのディレクトリにある なにかを上書きしないように,
注意する必要があります. さらに,
pre-clean
ターゲットにコピーしたパッチファイル
を削除するコマンドを追加するのを忘れないでください.
MAINTAINER
あなたのメールアドレスをここに入れてください.
お願いします. :)
保守担当者(maintainer)の責任についての詳細は, Makefile 中の
MAINTAINER の節をご覧ください.
依存関係
このプログラムが他のportに依存する場合には, 必要なものが
自動的に作られるようにすることができます. そのために, 以下の
5つの変数が用意されています.
よくあるケースのためにあらかじめ設定された依存変数や,
いくつかの依存関係の制御のための変数があります.
LIB_DEPENDS
Port が必要とする非標準の共有ライブラリを
この変数で指定 します. これは
lib:
dir:
target という組のリストで,
うち lib
が共有ライブラリの名前, そして
dir
がそのライブラリが見つからない場合にインストールする port
のあるディレクトリで, target
はそのディレクトリで呼ばれるターゲットです. 例えば,
LIB_DEPENDS= jpeg.9:${PORTSDIR}/graphics/jpeg:install
と指定してあれば,
まずメジャーバージョンが9のjpegライブ
ラリがあるかどうか確認し, ない場合にはportsツリーの中の
graphics/jpeg
というサブディレクトリに移動し, そこ
でコンパイルとインストールを行ないます.
target の 部分は,
DEPENDS_TARGET (デフォルトは
install)
と等しいときには省略できます.
前半の lib 部分は
ldconfig -r | grep -wF
への引数になります.
この変数には正規表現を入れられません.
この依存関係は2度チェックされます. まず
extract ターゲットで, 次に
install でチェックされます.
(これは, その port を作成するマシンとインストールする
マシンが違う場合でも, きちんとそのライブラリが利用できる
ことを確認するためです.) また, 依存するもの名前は package
の中にも含まれますので, ユーザのシステムに存在しなければ,
pkg_add が自動的にインストールします.
RUN_DEPENDS
Port
を使用する際に必要となるファイルまたはプログラムがある
ときにはこの変数で指定します. これは
path:
dir
:target とい う組のリストで,
path
がファイルまたはプログラムの 名前, そして
dir
がそれが見つからない場合に作成する ためのディレクトリ名で
target
はそのディレクトリで呼ばれるターゲットです.
path の最初の文字がスラッ シュ
(/) の場合にはファイルかディレクトリ
とみなし, その存在を test -e
でチェックします; そうでない場合には
実行可能であると仮定し, which -s
を使って そのプログラムがユーザのサーチパス上に
あるかどうか確認します.
例えばMakefileに以下のように書いてあるとします.
RUN_DEPENDS= ${PREFIX}/etc/innd:${PORTSDIR}/news/inn \
wish8.0:${PORTSDIR}/x11-toolkits/tk80
まず, /usr/local/etc/innd
というファイルかディレクトリが存在 するか確認し,
ない場合にはportsツリーの中の
news/inn
というサブディレクトリから作られます. ま た,
wish8.0
というプログラムがユーザのサーチパス中 にあるかどうか探し,
ない場合には同じくportsツリーの
x11-toolkits/tk80
というサブディレクトリから作られます.
この例で, innd
は実際にはプログラムです; この ように,
プログラムであっても標準のサーチパス以外のところに
あるようなものの場合には,
絶対パスで指定してください.
この依存関係はinstall
ステージのはじめでチェック されます. また,
packageを作る際に必要となるportのpackage名 が記録され,
pkg_addを使用すると
ユーザのシステムに存在しない場合には自動的にそちら
のpackageもインストールされるようになります.
target の部分は,
DEPENdS_TARGET
と同じ場合には省略可能です.
BUILD_DEPENDS
Port
のコンパイルに必要なファイルまたはプログラムがある
ときは, この変数で指定してください.
RUN_DEPENDSと同 様に, これは
path:
dir
:target
という組のリストです. 例 えば,
BUILD_DEPENDS= unzip:${PORTSDIR}/archivers/unzip
は
unzip という名前のプログラムを探し,
見つから
ない場合にはarchivers/unzip
サブディレクトリで作 れという意味になります.
ここでは “コンパイル”
と一口にいいましたが, この変数は実際
にはファイルの展開から実際のコンパイル・リンクまで
全部をま とめて面倒を見てくれます. この依存関係は
extract
ステージからチェックされます.
target の部分は
DEPENDS_TARGET
と同じ場合には省略可能です.
FETCH_DEPENDS
この変数は,
portを取ってくるのに必要なファイルまたはプロ
グラムを指定するのに使います. 上の二つと同様に, これは
path:
dir
:target
という組のリストです. 例えば,
FETCH_DEPENDS= ncftp2:${PORTSDIR}/net/ncftp2
としておけば, ncftp2
という名前のプログラムを探 し,
見つからない場合にはnet/ncftp2
サブディレク トリにいってインストールします.
この依存関係は fetch
ステージからチェックされます.
target の部分は
DEPENDS_TARGET
と同じ場合には省略可能です.
DEPENDS
上記の四つのいずれにもあてはまらないような
依存関係がある場 合, または他の port
がインストールされれているだけではなく,
ソースが展開されている必要がある場合にはこの変数
を使います. これは
dir
:target という形式のリスト
になります. 上記の四つと違って特に
“確認”するものがありませんので.
よくある依存関係を表す変数
もし ports が X Window System を必要とするのであれば,
USE_XLIB=yes を定義してください.
(これは USE_IMAKEも意味します) BSD
make の代りに GNU
make を必要とする場合には,
USE_GMAKE=yes を定義. 動作するのに GNU
autoconf を必要とする場合には,
USE_AUTOCONF=yes を定義. 最新の qt
toolkit を使用 する場合には USE_QT=yes
を定義. perl 言語のバージョン5 を必要とする場合には,
USE_PERL5=yes を定義してください.
(特に最後のは重要で, FreeBSD のいくつかの
バージョンでは基本システムに perl5 を含みますが,
他のものは含んでいません.)
依存関係に関する注意
上で述べたように, 依存する ports
が必要になったときに呼ばれるデフォルトのターゲットは
DEPENDS_TARGET で,
そのデフォルトは install です. これは,
ユーザの使用する変数で, port の
Makefile
で定義されるものではありません. もし,
あなたのportが特別な方法で, 依存関係を扱う必要が
ある場合には, DEPENDS_TARGET
を再定義するのではなく, *_DEPENDS
変数の :target
の部分を利用してください.
make clean とタイプしたときには,
依存する port も自動的に clean されます.
もしそうしたくない場合には,
NOCLEANDEPENDS
を環境変数として設定してください.
無条件に他の port に依存させるには, 特別に
nonexistent という文字列を
BUILD_DEPENDS あるいは
RUN_DEPENDS
の最初のフィールドに使用してください. これは, 他の port
のソースが必要なときのみ使用してください. target
も指定することによって,
コンパイルの時間を節約することができます. 例えば,
BUILD_DEPENDS= /nonexistent:${PORTSDIR}/graphics/jpeg:extract
これは, 常に JPEG port の directory
に行きソースの展開を行ないます.
あなたがやりたいことが他の方法ではできない場合以外は,
DEPENDS を使わないでください.
これは常に 他の port
の作成を行い(さらにデフォルトでインストール を行い),
package も作成します. もし本当にこれがあなたの
やりたいことでしたら, 代りにこれを
BUILD_DEPENDS と
RUN_DEPENDS で書くことをお勧めします
— 少なくとも意図が明確になります.
コンパイル時の特別な指定
GNUのmakeを使う場合には,
USE_GMAKE=yes と指定してください. Port に
GNU の configure が含まれ ている場合には,
GNU_CONFIGURE=yes を使います(これは,
HAS_CONFIGURE も意味します).
configure に追加の引数 (デフォルトでは,
GNU の configure では
--prefix=${PREFIX}, GNUでない
configure では空)
を渡したい場合には追加部分を
CONFIGURE_ARGS で指定してください.
そのパッケージが autoconf
を使用する場合には, USE_AUTOCONF=yes
を使います. これは, GNU_CONFIGURE
も意味し, configure の前に
autoconf を実行します.
X Window Systemのアプリケーションなど,
imakeを 使って
Imakefile から
Makefile を作成するportの場合には
USE_IMAKE=yes を指定してください.
コンフィグレー ションステージで自動的にxmkmf
-a が実行されます. も し
フラグが問題をもたらすなら, さらに
XMKMF=xmkmfとしてください.
もし, port が imake
を使用するけれども, install.man
ターゲットがない場合には,
NO_INSTALL_MANPAGES=yes
を指定してください. ついでに, その port
のオリジナルの作者を探し出して八つ裂きにすると
いいでしょう.:>
Portの Makefile が
all 以外のものをメインのター
ゲットとしている場合には, ALL_TARGET でそ
れを指定してください. install と
INSTALL_TARGET も同様です.
もし, port の元の Makefile が
all
以外のターゲットをメインのターゲットとしている場合には,
ALL_TARGET
をそれに合わせて設定してください.
install と
INSTALL_TARGET についても同様です.
NO_INSTALL_MANPAGES
あなたの port がimakeは使うものの
install.man
ターゲットを持っていない場合,
NO_INSTALL_MANPAGES=yes
を指定してください. つい でに,
作者を探し出して八つ裂きにするといいでしょ う. (-_-#)
特別な配慮
Portを作成する場合,
考慮しなくてはいけないことがさらにいくつかあります.
この節では,
それらのうちもっともありがちなものについて説明します.
ldconfig
共有ライブラリをインストールするときには,
共有ライブラリのキャッシュを更新するために port の
Makefile の
post-installtarget
から${LDCONFIG} -m
を走らせてください.
このコマンドの引数は共有ライブラリのインストールしてある
ディレクトリ (通常
PREFIX/lib)
です.
また, pkg/PLIST に @exec
/sbin/ldconfig -m と @unexec
/sbin/ldconfig -R の組を入れて, package
をインストールした場合にも共有ライブラリがすぐ使え,
削除の際にも, システムがまだライブラリが存在すると
誤認しないようにしてください.
この行は共有ライブラリを指定する行のすぐ後に
書くのがよいでしょう:
lib/libtvl80.so.1
@exec /sbin/ldconfig -m %D/lib
@unexec /sbin/ldconfig -R
絶対に引数なしでただ
ldconfig とだけ書いてある行を
Makefile や
pkg/PLIST ファイルに入れないでください.
このコマンドを実行すると, 共有ライブラリのキャッシュが
/usr/lib の内容のみとなり,
ユーザのマシンにさまざまな問題をもたらします (「ぎゃぁ!
このportをインストールしたら xinit
が使えなくなっちゃった!」). この掟を破った者は,
永久に地獄の底で苦しみ続けるように,
閻魔様に頼んでおきます.
ELF 対応
FreeBSD は 3.0-RELEASE で ELF に移行しましたので,
シェアードライブラリを作成するたくさんの port を ELF 対応
にする必要があります. 3.0 システムは ELF としても a.out
としてmも 動作しますし, 我々は非公式ではありますが,
できるだけ長い間 2.2
システムのサポートをしたいと思っていますので, 複雑な状況です.
以下は a.out のみに対応している port をどのように a.out と ELF
両方に対応させるかのガイドライ ンです.
このリストの一部は,
移行時にしかあてはまらないものもありますが, 古い port
をアップグレードしたい場合に参考になるように,
しばらくのあいだは残しておきます.
a.out ライブラリの退避
a.out ライブラリは, /usr/local/lib
から, aout サブディレクトリ
に移動しなくはなりません. (もし移動しないと, ELF ports
がそれらをあっさり上書きして しまいます.) 3.0-CURRENT の
src/Makefile にある
move-aout-libs ターゲット
(aout-to-elf から呼ばれます)
がその移動をしてくれます. a.out
ライブラリを移動するだけなので, ELF と a.out
の両方のライブラリが標準的な ディレクトリにあるシステムでは,
このターゲットを実行しても安全です.
フォーマット
port ツリーは package
をそのマシンのフォーマットで作成します. つまり, 2.2 では
a.out, また 3.0 では `objformat`
の結果によって, a.out か ELF になります. また, いったん
a.out ライブラリをサブディレクトリに移動すると a.out
ライブラリの作成はサポートされません. (つまり,
あなたがにをすれば良いのかを理解しているのならば,
うまく作成できるかもしれませんが,
自力でやらなければならないということです)
もし port が aout でしか動作しないのなら,
BROKEN_ELF
に原因を説明する文字列を設定してください.
この変数が設定された port は, ELF
システム上でのビルドの際スキップされます.
PORTOBJFORMAT
bsd.port.mk において
PORTOBJFORMAT は aout
か elf に設定され, 環境変数
CONFIGURE_ENV, SCRIPTS_ENV,
MAKE_ENV の中で export されます. (2.2-STABLE
では常に aout になります). また,
PORTOBJFORMAT=${PORTOBJFORMAT} として
PLIST_SUB に渡されます. (以下にある
ldconfig
に関するコメントを参照して下さい.)
この変数は, 以下のようにして
bsd.port.mk 中で設定されます.
PORTOBJFORMAT!= test -x /usr/bin/objformat && /usr/bin/objformat || echo aout
この変数を使って, port の make
の過程で何をすべきかを決定すべきですが, もし port の
configure スクリプトが元々, ELF
システムを自動的に検出するのであれば,
PORTOBJFORMAT
を参照する必要はありません.
共有ライブラリの作成
以下は, a.out と ELF
での共有ライブラリの扱いの違いです.
共有ライブラリのバージョン
ELF の共有ライブラリは,
libfoo.so.M
という名前になっていなければなりません. ここで
M は単一の
バージョン番号を表します. 一方 a.out のライブラリは
libfoo.so.M.
N という名前で,
M はメジャーバージョン番号,
N
はマイナーバージョン番号になっている必要があります.
これらを混同しないでください.
libfoo.so.N.
M という名のELF
共有ライブラリや
libfoo.so.N
という名の a.out 共有ライブラリ
(あるいはシンボリックリンク) は
絶対にinstallしないでください.
リンカコマンドライン
直接 ld を使用せずに, cc
-shared を使用してください.
たった一つの違いは, ELF には,
コマンドラインにを加える必要があることです.
ELF のリンカを満足させるためには,
libfoo.so から
libfoo.so.N
へのシンボリックリンクを作る必要があります. これは,
PLIST にも加えなくては いけませんし,
a.out の場合でも害にはならないので (一部の port
ではダイナミックリンクローディングのために
必要でもあります), PORTOBJFORMAT
の設定を気にせずに,
ただ単純にリンクを作成してください.
LIB_DEPENDS
すべての port の Makefile を編集して,
LIB_DEPENDS
からマイナー番号を除去する必要があり,
正規表現のサポートも除去する必要があります. (例えば,
foo\\.1\\.\\(33|40\\) から
foo.2) マッチングは grep
-wF を使って行われます.
PLIST
PLIST は, a.out
のマイナー番号が0であれば, 短い (ELFの)
共有ライブラリの名前を含み, さもなくば長い (a.outの)
名前を含んでいる必要があります.
bsd.port.mk は 自動的に,
PORTOBJFORMAT が aout
であれば, .0 を
短い共有ライブラリの名前の行に付け加え,
PORTOBJFORMAT が elf
であれば, マイナー番号を
長い共有ライブラリの名前から削除します.
ELF システムで 2
つのバージョン番号を持つ共有ライブラリを インストールしたり,
aout システムで 1
つのバージョン番号しか持たない共有ライブラリを
インストールするのが避けられない場合
(例えば他のオペレーティングシステム用の
互換ライブラリをインストールする port など),
NO_FILTER_SHLIBS 変数を定義すれば,
前節で説明されている PLIST
編集の機能が停止されます.
ldconfig
Makefile 中の ldconfig
の行は以下のようになります.
${SETENV} OBJFORMAT=${PORTOBJFORMAT} ${LDCONFIG} -m ....
また PLIST 中では:
@exec /usr/bin/env OBJFORMAT=%%PORTOBJFORMAT%% /sbin/ldconfig -m ...
@unexec /usr/bin/env OBJFORMAT=%%PORTOBJFORMAT%% /sbin/ldconfig -R
となります. これは,
システムのデフォルトフォーマットではなく
パッケージのフォーマットに応じて, 正しい
ldconfig
が呼ばれることを保証するためのものです.
MASTERDIR
もし, あなたの port が 変数(例えば
解像度とか紙のサイズなど)を変えたりした,
ちょっと違うバージョンを作成する必要があるときには,
ユーザが分りやすいように, package
ごとに別々のサブディレクトリを作成し, ただし, できるだけ port
間でファイルを共有するようにしてください. 典型的な例では,
うまく変数を使えば,
とても短いMakefileだけ,
1つ以外のすべてのディレクトリに置くだけで済みます. その短い
Makefile には
MASTERDIR を使って,
残りのファイルがあるディレクトリを指定できます. また PKGNAME
の一部に変数に使って, package
が別々の名前を持つようにしてください.
以下が, とても良い例になるでしょう. これは
japanese/xdvi300/Makefile
の一部です:
PKGNAME= ja-xdvi${RESOLUTION}-17
:
# default
RESOLUTION?= 300
.if ${RESOLUTION} != 118 && ${RESOLUTION} != 240 && \
${RESOLUTION} != 300 && ${RESOLUTION} != 400
@${ECHO} "Error: invalid value for RESOLUTION: \"${RESOLUTION}\""
@${ECHO} "Possible values are: 118, 240, 300 (default) and 400."
@${FALSE}
.endif
japanese/xdvi300 は通常のパッチ,
package ファイルももっています. そこで,
make と入力すると,
デフォルトの解像度(300)を使って, 普通に port
の作成を行います.
他の解像度に関してですが, これが,
xdvi118/Makefile の(コメントを除いた)
すべてです.
RESOLUTION= 118
MASTERDIR= ${.CURDIR}/../xdvi300
.include ${MASTERDIR}/Makefile
(xdvi240/Makefile と
xdvi400/Makefile も同様です).
MASTERDIR が
bsd.port.mk に
PATCHDIR や PKGDIR
などの通常のサブディレクトリが xdvi300
にあることを教えます. RESOLUTION=118
の行が, xdvi300/Makefile の
RESOLUTION=300 の行を無効にし, port
は解像度を118として作成されます.
共有ライブラリのバージョン
まず,
共有ライブラリのバージョンについての指針 を読んで,
共有ライブラリのバージョンを
一般的にどうすれば良いかを理解してください. 盲目的に,
ソフトウエアの作者がちゃんと理解していると
信じててはいけません, 多くの場合違います.
細い点まで考慮することは大変重要なことです,
なぜなら我々は互換性がないかもしれない大量の
ソフトウェアを共存させようとする, 特殊な状況にあるからです.
不注意な port の導入が共有ライブラリに関して,
多大な問題を引き起したことが過去にあります (今まで,
jpeg-6b がなぜ 9.0
といバージョン番号を持っているか不思議に
思ったことはありませんか?). もし, 疑問があれば, &a.ports;
にメールを送ってください. ほとんどの時間は,
正しいシェアードライブラリのバージョンを決めることと,
それを実現するためのパッチを作成することに終始します.
しかしながら, が同じソフトウェアの違ったバージョンの
ソフトウェアが既にツリーにあるばあいには,
状況は非常に複雑です.
つまり, FreeBSD では,
ユーザがリンカにどのバージョンの共有ライブラリを
使用するかを指定できないからです
(リンカは常にもっとも高いバージョンを選びます). これは, もし,
libfoo.so.3.2 と
libfoo.so.4.0
がシステムに存在するときには,
リンカに特別なアプリケーションだけ
libfoo.so.3.2
をリンクするように指示する方法がないことを意味します. これは,
コンパイル時のリンクという意味では完全に見劣りします.
この場合の唯一の解決方法は, 共有ファイルの名前の
ベース 部分を変えることです. 例えば,
libfoo.so.4.0 を
libfoo4.so.1.0 へ変えることによって,
バージョン 3.2 とバージョン 4.0 共に他の port
からリンクされることができるようになります.
マニュアル
MAN[1-9LN] 変数を使用すると,
自動的にすべてのマニュアルを pkg/PLIST
に加えます (つまり, マニュアルを PLIST
に加えては いけません — PLIST の生成
を参照してください). またマニュアルを
/etc/make.conf 中の
NOMANCOMPRESS の設定に応じて,
install時に自動的に圧縮したり伸長したりします.
マニュアルをインストール時に圧縮するかどうかを
指定するには, MANCOMPRESSED
変数を使用します. この変数は, 3つの値をとることができます,
yes, no そして
maybe です. yes
はマニュアルが既に圧縮されて インストールされている,
no はされていない, maybe
はそのソフトウェアがすでに, NOMANCOMPRESS
に合わせており bsd.port.mk
が特別なにもする必要がないことを意味します.
USE_IMAKE がセットされていて,
NO_INSTALL_MANPAGES
がセットされていなければ, MANCOMPRESSED
は自動的に yes に設定され,
それ以外の場合には, no になります.
デフォルトがあなたの port
に合わない場合以外は明示的に設定する必要がありません.
PREFIX 以外のディレクトリの下に
マニュアルを置くような port では MANPREFIX
を指定することができます. さらに,
特定のセクションのマニュアルだけ,
標準ではない場所にインストールする場合, 例えばいくつかの Perl
のモジュールの ports など, には個々のマニュアルのパスを
MANsectPREFIX
(sect は, 1-9,
または, L か N
を表わします) によって指定できます. ができます.
マニュアルが, 言語特有のサブディレクトリに
置かれる場合には, 言語名を MANLANG
に設定してください. この変数のデフォルト値は,
"" になっています (つまり, 英語のみ).
これは, 全部をまとめた例です.
MAN1= foo.1
MAN3= bar.3
MAN4= baz.4
MANLANG= "" ja
MAN3PREFIX= ${PREFIX}/share/foobar
MANCOMPRESSED= yes
以下の6個のファイルがこの port でインストールされます.
${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
-
+
Motifを必要とするport
最近はコンパイルに Motif
を必要とするアプリケーションが増えて きました.
(Motif自体は有料のものがいくつかの会社から手に入りま すし,
多くのアプリケーションがコンパイル可能な無料の互換ライブラリ
が x11-toolkits/lesstifにあります)
Motifはかなり広く使われていますし, 製品のライ
センスではライブラリを静的にリンクした
実行形式は再配布が認めら れている場合が多いので,
Motifを必要とするソフトウェアを簡単に 動的(port
からコンパイルする人々のために)/静的(package を配布
する人々のために)にリンクできるような
しくみが用意されています.
REQUIRES_MOTIF
Motif
がないとコンパイルできないportのMakefileではこの変
数を指定してください. これによって,
Motifを持っていない人が
このportをコンパイルしようとするのを未然に防ぎます.
MOTIFLIB
この変数は bsd.port.mk によって
Motif ライブラリの指 定に置き換えられます.
ソース内のMakefileやImakefileで Motif
ライブラリを指定しているところをこの変数に置き換えるよ
うにパッチをあててください.
代表的な例としては以下の二つがあげられます:
MakefileかImakefileの中でMotifライブラリが
として使われている場合には,
かわりに MOTIFLIB
と書いてください.
Imakefileの中で XmClientLibs
が使われている 場合には, それを
${MOTIFLIB} ${XTOOLLIB}
${XLIB} と書きかえてください.
MOTIFLIB は通常
-L/usr/X11R6/lib -lXm か
/usr/X11R6/lib/libXm.a に置き換えら
れます. したがって前に や
をつけ る必要はありません.
X11 のフォント
もし, あなたの port が X window system
のフォントをインストールするのであれば, それらを
X11BASE/lib/X11/fonts/local
に置くようにしてください. このディレクトリは XFree86 release
3.3.3 で新設されたものです. もし,
それが存在しなければ作成し, ユーザに XFree86 を 3.3.3
かそれより新しいものに更新か, すくなくとも,
このディレクトリを /etc/XF86Config の
font path
に加えるように促すメッセージを出力するようにしてください.
Info ファイル
新しい版の texinfo(2.2.2-RELEASE
およびそれ以降に入っています) には,
install-info というコマンドが含まれており,
dir ファイルに項目を追加したり,
削除したりすることがで きます. もし, あなたの port が info
ドキュメントをインストー ルするのであれば, 以下の指示に従って,
その port および package が正しく, ユーザの
${PREFIX}/info/dir ファイル
を更新するようにしてください. (この節は,
とても長くてすいません, しかし info
ファイルを作りあげるためには, これらは不可欠 です.
正しく行なえば, 美しい
リストができますので, 辛抱してください! :)
まず, これを知っておかなければなりません:
&prompt.user; install-info --help
install-info [OPTION]... [INFO-FILE [DIR-FILE]]
Install INFO-FILE in the Info directory file DIR-FILE.
(訳注: Info ディレクトリの INO-FILE を DIR-FILE にインストールする)
Options:
--delete Delete existing entries in INFO-FILE;
don't insert any new entries.
(訳注: INFO-FILE の中の項目を削除,
新しい項目は一切追加しない.)
:
--entry=TEXT Insert TEXT as an Info directory entry.
(訳注: TEXT を Info ディレクトリの項目として追加する.)
:
--section=SEC Put this file's entries in section SEC of the directory.
(訳注: このファイルの項目を Info ディレクトリの SEC
という節に置く.)
:
このプログラムは, 実際には info
ファイルをインストール しません, 単に
dir
ファイルにエントリーを挿入したり削除し
たりするだけです.
これから, install-info
を使用するように, ports を変換す る7段階の工程を示します.
例として editors/emacsを
使用します.
まず, texinfo のソースを見て,
@dircategory と
@direntry 文がないファイルについて,
それらを追加するパッチを作成します. 以下は,
ここでの例での patchの一部です:
--- ./man/vip.texi.org Fri Jun 16 15:31:11 1995
+++ ./man/vip.texi Tue May 20 01:28:33 1997
@@ -2,6 +2,10 @@
@setfilename ../info/vip
@settitle VIP
+@dircategory The Emacs editor and associated tools
+@direntry
+* VIP: (vip). A VI-emulation for Emacs.
+@end direntry
@iftex
@finalout
:
フォーマットについては見ればわかると思います.
dir
というファイルに必要な項目を書いておいてくれる作者
も多いので, まず自分で書く前にさがしてみてください. また,
関係 する ports も調べて, 節(section)の名前や,
インデントなどが
きちんと合っているかどうかを確認してください
(項目のテキスト は, すべて4つめのタブ・ストップ(tab
stop)から始めることを推 奨します).
1つのファイルに対して1つの info
の項目しか書けないことに注 意してください, これは,
install-info --delete が, そのバグにより,
@direntry セクションに複数の項目を書
いても,
初めの1つの項目しか削除してくれないからです.
texinfo のソースにパッチをあてるかわりに,
dir の項目 を
install-info の
引数((,
) として与えることもできます.
これはあまり良い方法とは 思えません, なぜなら,
同じ情報を3ヶ所(Makefile,
PLIST の
@exec/@unexec:
以下参照) に重複して, 書く必要があるからです.
しかしながら, もし日本語(あるいは, 他のマルチバイト文字)の
info ファイルがあるのならば,
install-info
の特別な引数を使用する必要があるでしょう, なぜならば,
makeinfo がこのような texinfo
ソースファイル を扱えないからです.
(このようなものをどう扱うかの例としては,
japanese/skk の
Makefile と
PLIST を見て ください.)
portのディレクトリに戻って, make clean;
make をして, info ファイルが texinfo
ソースファイルから再び生成さ れることを確認してください.
texinfo ソースファイルのほうが info
ファイルよりも新しいので, make
とタイプすれば, info ファイルは再構築されるはずですが,
多くの Makefile には info
ファイルの正しい依存関係が書かれていません.
emacs の場合, info
ファイルの再構築ため, man
サブディレクトリ に降りていくようにするために, メインの
Makefile.in にパッ
チをあてる必要がありました.
--- ./Makefile.in.org Mon Aug 19 21:12:19 1996
+++ ./Makefile.in Tue Apr 15 00:15:28 1997
@@ -184,7 +184,7 @@
# Subdirectories to make recursively. `lisp' is not included
# because the compiled lisp files are part of the distribution
# and you cannot remake them without installing Emacs first.
-SUBDIR = lib-src src
+SUBDIR = lib-src src man
# The makefiles of the directories in $SUBDIR.
SUBDIR_MAKEFILES = lib-src/Makefile man/Makefile src/Makefile oldXMenu/Makefile lwlib/Makefile
--- ./man/Makefile.in.org Thu Jun 27 15:27:19 1996
+++ ./man/Makefile.in Tue Apr 15 00:29:52 1997
@@ -66,6 +66,7 @@
${srcdir}/gnu1.texi \
${srcdir}/glossary.texi
+all: info
info: $(INFO_TARGETS)
dvi: $(DVI_TARGETS)
man
サブディレクトリでのデフォルトターゲットは,
info で呼ばれるのに対して,
メインの Makefile では,
all で呼びたいので,
2つめのpatchが必要でした. また, info
info ファイルのインストールも削除しました, なぜなら,
同じものが同じ名前で既に
/usr/share/info にあるからです.
(このパッチはここにはありません.)
もし, Makefile に
dir ファイルをインストールす
る個所があれば, 削除します. あなたの port がインストー
ルしてはいけません. また, dir
ファイルを壊してしまうよう
なコマンドの類も削除します.
--- ./Makefile.in.org Mon Aug 19 21:12:19 1996
+++ ./Makefile.in Mon Apr 14 23:38:07 1997
@@ -368,14 +368,8 @@
if [ `(cd ${srcdir}/info && /bin/pwd)` != `(cd ${infodir} && /bin/pwd)` ]; \
then \
(cd ${infodir}; \
- if [ -f dir ]; then \
- if [ ! -f dir.old ]; then mv -f dir dir.old; \
- else mv -f dir dir.bak; fi; \
- fi; \
cd ${srcdir}/info ; \
- (cd $${thisdir}; ${INSTALL_DATA} ${srcdir}/info/dir ${infodir}/dir); \
- (cd $${thisdir}; chmod a+r ${infodir}/dir); \
for f in ccmode* cl* dired-x* ediff* emacs* forms* gnus* info* message* mh-e* sc* vip*; do \
(cd $${thisdir}; \
${INSTALL_DATA} ${srcdir}/info/$$f ${infodir}/$$f; \
chmod a+r ${infodir}/$$f); \
(これは, 既存のportを修正するときのみ必要です.)
pkg/PLIST を見て,
info/dir にパッチをあて
ようとするものすべてを削除します. これらは,
pkg/INSTALL
やその他のファイルにもあるかもしれない ので,
いろいろさがしてみてください.
Index: pkg/PLIST
===================================================================
RCS file: /usr/cvs/ports/editors/emacs/pkg/PLIST,v
retrieving revision 1.15
diff -u -r1.15 PLIST
--- PLIST 1997/03/04 08:04:00 1.15
+++ PLIST 1997/04/15 06:32:12
@@ -15,9 +15,6 @@
man/man1/emacs.1.gz
man/man1/etags.1.gz
man/man1/ctags.1.gz
-@unexec cp %D/info/dir %D/info/dir.bak
-info/dir
-@unexec cp %D/info/dir.bak %D/info/dir
info/cl
info/cl-1
info/cl-2
post-install ターゲットを
Makefile に加えて,
dir
ファイルが存在しなければ作成するようにします. また,
インストールされた info ファイルについては,
install-info
を実行するようします.
Index: Makefile
===================================================================
RCS file: /usr/cvs/ports/editors/emacs/Makefile,v
retrieving revision 1.26
diff -u -r1.26 Makefile
--- Makefile 1996/11/19 13:14:40 1.26
+++ Makefile 1997/05/20 10:25:09 1.28
@@ -20,5 +20,11 @@
post-install:
.for file in emacs-19.34 emacsclient etags ctags b2m
strip ${PREFIX}/bin/${file}
.endfor
+ if [ ! -f ${PREFIX}/info/dir ]; then \
+ ${SED} -ne '1,/Menu:/p' /usr/share/info/dir > ${PREFIX}/info/dir; \
+ fi
+.for info in emacs vip viper forms gnus mh-e cl sc dired-x ediff ccmode
+ install-info ${PREFIX}/info/${info} ${PREFIX}/info/dir
+.endfor
.include <bsd.port.mk>
新しい info ファイルを作成するのに,
/usr/share/info/dir と上のコマンド,
以外は使用しな いでください. 実際のところ, もし port
する人がこれに関して PLIST
に自らまったく手を加える必要がないのであれば, 上
のパッチのはじめの3行を bsd.port.mk
に加えたでしょう.
PLIST を編集して, 同じ働きをする
@exec 文, そ
れにpkg_delete のために
@unexec 文を加えてくださ い.
@unexec を使用して
info/dir を削除する必
要はありません.
Index: pkg/PLIST
===================================================================
RCS file: /usr/cvs/ports/editors/emacs/pkg/PLIST,v
retrieving revision 1.15
diff -u -r1.15 PLIST
--- PLIST 1997/03/04 08:04:00 1.15
+++ PLIST 1997/05/20 10:25:12 1.17
@@ -16,7 +14,15 @@
man/man1/etags.1.gz
man/man1/ctags.1.gz
+@unexec install-info --delete %D/info/emacs %D/info/dir
:
+@unexec install-info --delete %D/info/ccmode %D/info/dir
info/cl
info/cl-1
@@ -87,6 +94,18 @@
info/viper-3
info/viper-4
+@exec [ -f %D/info/dir ] || sed -ne '1,/Menu:/p' /usr/share/info/dir > %D/info/dir
+@exec install-info %D/info/emacs %D/info/dir
:
+@exec install-info %D/info/ccmode %D/info/dir
libexec/emacs/19.34/i386--freebsd/cvtmail
libexec/emacs/19.34/i386--freebsd/digest-doc
@unexec install-info --delete
コマンドは, info ファイル自身より先に置き,
コマンドがファイルを読めるようにし
ておかなければならないことに注意してください. また,
@exec install-info コマンドは info
ファイルおよび dir ファイルを作る
@exec コマンドより後に
おかなければなりません.
テスト
をして出来栄えに感服しましょう :) 各段階の前後に,
dir
ファイルをチェックしましょう.
pkg/ サブディレクトリ
まだ触れていない, いくつかのこつが
pkg/ サブディレクトリにはあり,
時として便利でしょう.
MESSAGE
もし, インストールする人にメッセージを表示する
必要がある場合には, そのメッセージを
pkg/MESSAGE に置けます. この機能は,
pkg_add
の後の追加のインストール手続きを表示するときなどに,
重宝します.
pkg/MESSAGE ファイルは
pkg/PLIST に加える必要はありません.
また, もしユーザが package ではなく port を使用して
いる場合には自動的には表示されませんので, 明示的に
post-install
で表示するようにするべきでしょう.
INSTALL
バイナリパッケージが pkg_add
でインストールされるときに, 実行される必要がある
コマンドがあれば, pkg/INSTALL
スクリプトを使って実行することができます.
このスクリプトは自動的に package に加えられ,
pkg_add によって2度実行されます. はじめは
INSTALL ${PKGNAME} PRE-INSTALL
と実行され, 2度目には, INSTALL ${PKGNAME}
POST-INSTALL と実行されます.
どちらのモードで実行されているかは,
$2 を調べることによってわかります.
環境変数 PKG_PREFIX には package
がインストールされるディレクトリが設定されます. 詳細は
&man.pkg.add.1; を見てください.
port を make install で
インストールするときには,
このスクリプトは自動的に実行されません. もし,
実行される必要があるならば, port の Makefile
から明示的に呼ぶ必要があります.
REQ
port が(インストールされるシステムの状態によって)
インストールされるべきか, されないべきか区別する必要が
あるときには, “要件(requirements)” スクリプト
pkg/REQ を作ることができます. これは,
インストール及びデインストール (package
の削除)の時に自動的に実行され,
それらが処理されるべきかを決定します.
make の変数にあわせた PLIST
の変更
いくつかの port, 特に p5- portsなど, は configure
のオプション (あるいは, p5- ports の場合は perl
のバージョン)によって, PLIST
を変える必要があります. これを容易に実現するために,
PLIST 中の
%%OSREL%%,
%%PERL_VER%%,
%%PERL_VERSION%% は,
適切に置き換えられるようになっています.
%%OSREL%% の値は,
オペレーティングシステムの数字で表されたリビジョンです
(例えば, 2.2.7).
%%PERL_VERSION%% は perl
のバージョン番号全体(例えば, 5.00502 )で,
%%PERL_VER%% はバージョン番号から,
パッチレベルを引いてものです(例えば,
5.005).
他の置き換えが必要であれば, PLIST_SUB
変数に
VAR=VALUE
という形式のペアのリストを設定することによって,
PLIST 中の
%%VAR%% は
VALUE に置き換えられます. 例えば,
バージョンに固有の沢山のファイルを インストールする場合には,
Makefile に
OCTAVE_VERSION= 2.0.13
PLIST_SUB= OCTAVE_VERSION=${OCTAVE_VERSION}
と書いて, PLIST
中のバージョン番号が表われるすべてのところに,
%%OCTAVE_VERSION%% と書きます.
このようにしておけば, port をアップグレードするときに,
何十行(ときとして, 何百行)も PLIST
を書き替えないですみます.
この書き換えは (
マニュアル の追加も)
do-install と
post-install ターゲット のあいだに,
PLIST を読み TMPPLIST
(デフォルトは,
WRKDIR/.PLIST.mktmp )
に書き込むことによって行なわれます. もし, あなたの port が
PLIST を実行時に生成するのであれば,
do-install のあいだか,
その前に行うようにしてください. また,
書きかえられたあとのファイルを編集する必要がある場合には,
post-install で,
TMPPLIST を書きかえてください.
pkg
サブディレクトリにあるファイル名の変更
pkg
サブディレクトリにあるファイルは全て, 変数を
使用して定義されていますので, 必要であれば
Makefile 中で 変更可能です. いくつかの
ports で 一つの pkg
サブディレクトリを共有する場合や, 上記のファイルに書き込む
必要があるときなど, 特に便利です. (pkg
サブディレクトリに直接書き込むのが良くない理由に ついては
WRKDIR
以外への書きこみ を参照してください.)
以下が変数名とそのデフォルト値の表です.
Variable
Default value
COMMENT
${PKGDIR}/DESCR
DESCR
${PKGDIR}/DESCR
PLIST
${PKGDIR}/PLIST
PKGINSTALL
${PKGDIR}/PKGINSTALL
PKGDEINSTALL
${PKGDIR}/PKGDEINSTALL
PKGREQ
${PKGDIR}/REQ
PKGMESSAGE
${PKGDIR}/MESSAGE
PKG_ARGSを上書きせずに,
これらの変数を変更 するようにしてください.
PKG_ARGSを変更すると これらのファイルは
port から正しく /var/db/pkg
にインストールされなくなります.
ライセンス上の問題
ソフトウェアによっては制限の厳しい
ライセンスがついてきたり, 法律的に問題があるかもしれません.
(PKPの公開鍵暗号化, ITAR (暗 号化ソフトウェアの輸出)
などが例としてあげられます). それらを
どう扱えばいいかはライセンスの文面によって
さまざまな場合があり ます.
ソフトウェア移植者として,
あなたにはライセンスをよく読み, FreeBSD プロジェクトが FTP
または CD-ROM で配布してはいけないソフ
トウェアを配布してしまうことのないよう,
注意する義務があります. なにか疑問がある場合には,
&a.ports;に聞いてみてください.
よく見られるケースに対処するために,
二つの変数が用意されてい ます:
ソフトウェアに “有償再配布を禁ずる”
という趣旨のライセン スがついてきた場合には
NO_CDROM
という変数にその理由を記述して ください.
私たちはこれがついているportはCD-ROMリリースに入
れないようにしますが,
オリジナルのソースファイルとpackage
はFTPでは取れるようにしておきます.
もしも, 生成される package
が個々のサイトで独自に構築さ れる必要があったり,
ライセンスによって生成されるバイナリが
配布できない場合には, NO_PACKAGE
変数にその理由を記述してくだ さい. そのような package が
FTP サイトに置かれたり, リリース 時の CD-ROM
へ入らないようにします. ただし, いずれの場合も distfile
は(FTP や CD-ROM に)含まれるようになります.
Portが, 使用者によっては法律上の問題が生じる時
(暗号化ソフ トウェアなど),
または“商用利用を禁ずる”とライセンスに書い
てある場合には
RESTRICTEDという変数にその理由を入れ
てください. この場合には,
ソースファイルやpackageは私たちの
FTPサイトにも置かれません.
GNU一般公有使用許諾書 (GPL) はバージョン1, 2とも
port作成上は何ら問題にはなりません.
もしあなたが,ソースツリー管理者 (committer)
であれば, ソースツリーにこのようなportを入れる際に,
ports/LEGAL
ファイルを書き換えるのを忘れないようにし
てください.
アップグレード
Port
のバージョンが原作者からのものに比べて古いことに気がつ
いたら, まずはあなたの持っているportが私たちの最新のもの
(ミラー サイトの ports/ports-current
というディレクトリにあります)
であることを確認してください.
次に, portの Makefile
にMAINTAINER (保守担当者) の
アドレスが書いてある場合には,
その人にメールを出してみましょう.
保守担当者の人がすでにアップグレードの準備を
しているかもしれま せんし,
(新しいバージョンの安定度に問題があるなど) あえてアッ
プグレードをしない理由があるのかもしれません.
保守担当者にアップグレードをしてくれと頼まれた場合,
あるいは
そもそもportのMakefileに保守担当者が書いてない場合などは, あ
なたがアップグレードをしてくださると助かります.
その場合にはアッ プグレードをしたのち,
変更前と変更後のディレクトリの再帰的diff (unified diff と
context diff のどちらでもいいのですが, port のコミッター達は
unified diff のほうを好むようです) をとって送ってください.
(例えば, 変更前のディレクトリが
superedit.bak という名前でとってあり,
変更後のもの が superedit
に入っているなら, diff -ruN superedit.bak
superedit の結果を送ってください. ) diff
の出力を見て, すべての変更が正しくなされているか確認して
ください. 変更箇所については, &man.send-pr.1; (カテゴリーは,
ports)に diff の出力結果を添えて,
私たちに送ってもらうのが一 番よいです. commit する際に CVS
に明確に記述しなければならない ので,
付け加えたり削除したりしたファイルがあったら, それについ
て書いておいてください. もし diff の大きさが 20 KB 程度を
超えるようであれば, 圧縮したものを uuencode して下さい.
そうでなければそのまま PR に入れるだけでいいです.
繰り返しになりますが, ports の変更を送るときには,
&man.shar.1; ではなく &man.diff.1;
を使用してください.
やっていいことといけないこと
この節では,
ソフトウェアをportする上でよくある落し穴などにつ
いて説明します. このリストを使って, あなた自身が作成した port
のチェックはもとより, PR データベースにある, 他の人が作成した
port のチェックもできます. あなたがチェックした port について
のコメントを バグ報告と一般的な論評
にしたがって, 送ってください. PR データベースにある port を
チェックすることによって, 私達がそれらを commit
するのを早くし,
あなたが何をしているか理解していることも示します.
バイナリのstrip
バイナリは strip してください.
オリジナルのソースがバイナリを strip
してくれる場合は良いですが, そうでない場合には
post-install ターゲットを指定して strip
するようにするとよいでしょう. 例えば,
こんな風になります:
post-install:
strip ${PREFIX}/bin/xdl
インストールされた実行形式がすでに strip
されているかどうかは file
コマンドで確認できます. これが`not
stripped'と言わなければ,
stripされているということです.
INSTALL_* マクロ
あなた自身の *-install
ターゲットでファイルの正しいモードと オーナを保証するために,
必ずbsd.port.mkで提供されて
いるマクロを使用してください.
マクロは以下のようなものがあります.
${INSTALL_PROGRAM}
は実行可能なバイナリを
インストールするコマンドです.
${INSTALL_SCRIPT}
は実行可能なスクリプトを
インストールするコマンドです.
${INSTALL_DATA}
は共有可能なデータを
インストールするコマンドです.
${INSTALL_MAN}
はマニュアルとその他のドキュメ
ントをインストールするコマンドです.
(圧縮はしません)
これらは基本的に install
コマンドに適当なフラグを与え たものです.
どのようにこれらを使用するかは以下の例を見てください.
WRKDIR
WKRDIR
の外のファイルにはなにも書き込まないように してください. WRKDIR は
ports のビルド中に書き込こめる
ことが保証されている唯一の場所です( CDROM から ports
をコンパイルを参照). PKGDIR
にあるファイルを修正する必要がある ときには, 変数の再定義
によって行ない, 上書きはしないでください.
-
+
WRKDIRPREFIX
WRKDIRPREFIX
を尊重していることを確認してください. 特に, 別の port の
WRKDIR を参照している
ときには気を付けてください. 正しい場所は,
WRKDIRPREFIX
PORTSDIR
/subdir/
name/work, です,
PORTSDIR/subdir/
name/work とか
.CURDIR/../../subdir
/name/work
とかではありません.
また, 自分で WRKDIR 定義するときには,
頭に
${WRKDIRPREFIX}${.CURDIR}
が付いている 事を確認してください.
OS や OS のバージョンの区別
Port の過程で, 修正や, どのバージョンの UNIX
で動くかによる条件つきコンパイルなどが
必要なコードに出会うかもしれません.
そのような条件つきコンパイルなどのための
変更をおこなうときには, FreeBSD 1.x システムへの移植や,
CSRGの4.4BSD, BSD/386, 386BSD, NetBSD, OpenBSD
などの他のBSDシステムへの移植が可能なように,
できるだけ普遍的な変更をおこなうことを
心がけてください.
4.3BSD/Reno (1990) およびそれより新しい BSD
版を古いバージョンと区別するには BSD
マクロを利用するのがよいでしょう. これは
<sys/param.h> で定義されています.
このファイルがすでにインクルードされていればよいのですが,
もしそうでない場合には以下のコードを, その
.c
ファイルの適当な場所に加えてください.
#if (defined(__unix__) || defined(unix)) && !defined(USG)
#include <sys/param.h>
#endif
これらの 2
つのシンボルが定義されているすべてのシステムには
sys/param.h があるはずです. もし,
そうでないシステムを発見したら我々にも教えてください.
&a.ports; までメールを送ってください.
あるいは, GNU の Autoconf
のスタイルを使用することもできます,
#ifdef HAVE_SYS_PARAM_H
#include <sys/param.h>
#endif
この方法を使用するときには,
Makefile 中の
CFLAGSに
-DHAVE_SYS_PARAM_H
を加えることを忘れないようにしてください.
いったん sys/param.h
がインクルードされると,
#if (defined(BSD) && (BSD >= 199103))
このようにしてそのコードが 4.3 Net2 コードベース,
またはそれより新しいもの (例: FreeBSD 1.x, 4.3/Reno, NetBSD
0.9, 386BSD, BSD/386 1.1とそれ以前)
の上でコンパイルされているかを検出できます.
#if (defined(BSD) && (BSD >= 199306))
これは, 4.4コードベース, またはそれより新しいもの (例:
FreeBSD 2.x, 4.4, NetBSD 1.0, BSD/386 2.0とそれ以後)
の上でコンパイルされているかどうかを
検出するために使用します.
4.4BSD-Lite2 コードベースでは, BSD
マクロの値は 199506 になっています.
これは参考程度の意味合いしかありません. 4.4-Lite ベースの
FreeBSD と 4.4-Lite2 での変更がマージされたバージョンとを
区別するのに使用するべきものではありません.
この目的のためには, __FreeBSD__
マクロをかわりに使用してください.
以下は控え目に使ってください.
__FreeBSD__
はFreeBSDのすべての版で定義されています. 変更が
FreeBSD
だけに適用されるとき以外は使用しないでください.
Portでよくある, strerror()
ではなく sys_errlist[]
を使うなどは, FreeBSDでの変更ではなく, BSD
の流儀です.
FreeBSD 2.xでは __FreeBSD__ が
2 と定義されています.
それ以前の版では 1 になっています.
その後の版では,
そのメジャー番号に合うように上がっていきます.
もし, FreeBSD 1.x システムと FreeBSD 2.x あるいは
FreeBSD 3.x システムを区別する必要があれば, 上で述べた
BSDマクロを使用するのが,
大抵の場合において正しい答です. もし,
FreeBSD特有の変更であれば (ld
を使うときのシェアードライブラリ用のなオプションなど),
__FreeBSD__を使い #if
__FreeBSD__ > 1 のようにFreeBSD 2.x
および, それ以降のシステムを検出するのはかまいません.
もし,
2.0-RELEASE以降のFreeBSDシステムを細かく検出したけれ ば,
以下を使用することができます.
#if __FreeBSD__ >= 2
#include <osreldate.h>
# if __FreeBSD_version >= 199504
/* 2.0.5+ release specific code here */
# endif
#endif
Release
__FreeBSD_version
2.0-RELEASE
119411
2.1-CURRENT's
199501, 199503
2.0.5-RELEASE
199504
2.1 以前の 2.2-CURRENT
199508
2.1.0-RELEASE
199511
2.1.5 以前の 2.2-CURRENT
199512
2.1.5-RELEASE
199607
2.1.6 以前の 2.2-CURRENT
199608
2.1.6-RELEASE
199612
2.1.7-RELEASE
199612
2.2-RELEASE
220000
2.2.1-RELEASE
220000 (2.2-RELEASE と同じです)
2.2.1-RELEASE 以後の 2.2-STABLE
220000 (これも同じです)
texinfo-3.9 以後の 2.2-STABLE
221001
top 導入以後の 2.2-STABLE
221002
2.2.2-RELEASE
222000
2.2.2-RELEASE 以後の 2.2-STABLE
222001
2.2.5-RELEASE
225000
2.2.5-RELEASE 以後の 2.2-STABLE
225001
ldconfig -R 以後の 2.2-STABLE
225002
2.2.6-RELEASE
226000
2.2.7-RELEASE
227000
2.2.7-RELEASE 以後の 2.2-STABLE
227001
semctl(2) 変更後の 2.2-STABLE
227002
2.2.8-RELEASE
228000
2.2.8-RELEASE 以後の 2.2-STABLE
228001
mount(2) 変更以前の 3.0-CURRENT
300000
mount(2) 変更以後の 3.0-CURRENT
300001
semctl(2) 変更以後の 3.0-CURRENT
300002
ioctl 引数変更後の 3.0-CURRENT
300003
ELF 移行後の 3.0-CURRENT
300004
3.0-RELEASE
300005
3.0-RELEASE 以後の 3.0-CURRENT
300006
3/4 の分岐後の 3.0-STABLE
300007
3.1-RELEASE
310000
3.1-RELEASE 以後の 3.1-STABLE
310001
3/4 の分岐後の 4.0-CURRENT
400000
(2.2-STABLE は, 2.2.5-RELESE 以後,
“2.2.5-STABLE” と呼ばれることがあります.)
見ての通り,
これは年・月というフォーマットになっていましたが,
バージョン 2.2 から,
より直接的にメジャー/マイナー番号を使う
ように変更になりました.
並行していくつかのブランチ(枝分かれし
たバージョン)を開発する場合には,
リリースされた日付でそれらの
リリースを分類することが不可能だからです. (あなたが今 port
を作成するときに, 古い -CURRENT 達について心配
する必要はありません.
これは参考のために挙げられているにすぎま せん.)
これまで, 何百ものportが作られてきましたが,
__FreeBSD__ が正しく使われたのは,
1つか2つの場合だけでしょう.
以前のportが誤った場所でそのマクロを使っているからと いって,
それをまねする理由はありません.
bsd.port.mk の後に書くこと
.include <bsd.port.mk>
の行の後には なにも書かないようにしてください. 大抵の場合は
Makefile の 中程のどこかで,
bsd.port.pre.mk を include して, 最後に
bsd.port.pre.mk を include
することによって避けることができます.
pre.mk/post.mk
のペアか bsd.port.mk
だけのどちらかだけを include してください.
2つを混ぜないでください.
前者は, いくつかの変数の定義だけ をして,
Makefile でのテストに使用し,
後者は残りを定義します.
以下は bsd.port.pre.mk
で定義される重要な変数です. (これは, すべてではありません.
完全なリストは bsd.port.mk
を参照してください.)
変数名
解説
ARCH
uname -m で返される
アーキテクチャ. (例, i386).
OPSYS
uname -s で返される
オペレーティングシステム (例,
FreeBSD).
OSREL
オペレーティングシステムの
リリースバージョン
(例., 2.1.5,
2.2.7).
OSVERSION
数字形式のオペレーティングシステム
のバージョン,
上記の
__FreeBSD_version
と同じです.
PORTOBJFORMAT
システムのオブジェクト
フォーマット (aout あるいは
elf).
LOCALBASE
“local” ツリーのベース.
(例, /usr/local/).
X11BASE
“X11” ツリーのベース.
(例, /usr/X11R6/).
PREFIX
portsのインストール先
(
PREFIXについてを参照).
USE_IMAKE,
USE_X_PREFIX あるいは
MASTERDIR
などの変数を定義する必要がある場合には,
bsd.port.pre.mk を include
する前に定義してください. 他のものは,
bsd.port.pre.mk
の前でも後でもかまいません.
以下は bsd.port.pre.mk
の後に書けるものの例です:
# no need to compile lang/perl5 if perl5 is already in system
.if ${OSVERSION} > 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
付加的ドキュメント
普通のマニュアルや info
ファイルのほかにユーザにとって有用だ
と思えるようなドキュメントがある場合には,
PREFIX/share/doc
の下にインストールしてく ださい. これは前記と同様,
post-installターゲットの
中からするのがいいでしょう.
まず, あなたのportのために新しいディレクトリを作りま す.
どのportのドキュメントか簡単にわかるような名前にする必
要がありますので, 普通は PKGNAME
からバージョ ン番号を除いた部分を使うといいでしょう.
もちろん, ユーザが異
なるバージョンのものを同時に使うことが予想される port の場合
には, PKGNAME
をそのまま使ってかまいません.
ユーザが /etc/make.conf
でこの部分を禁止するために NOPORTDOCS
という変数をセットしている場合には, これらのドキュメントが
インストールされないようにしてください. こんな具合です.
post-install:
.if !defined(NOPORTDOCS)
${MKDIR}${PREFIX}/share/doc/xv
${INSTALL_MAN} ${WRKSRC}/docs/xvdocs.ps ${PREFIX}/share/doc/xv
.endif
これらのファイルを pkg/PLIST
に入れるのを忘れないよ うにしてください.
(packageが/etc/make.conf内の
変数を読む方法は今のところ存在しませんので,
NOPORTDOCS
については気にしないでください.)
インストール時に pkg/MESSAGE
ファイルを利用して, メッセージを表示することができます.
詳細は pkg/MESSAGE を使う
の節を参照してください.
MESSAGE ファイルは
pkg/PLIST に加える必要はありま
せん.
DIST_SUBDIR
/usr/ports/distfiles
ディレクトリ内をあまり散らかさ ないようにしてください.
たくさんのファイルを取ってくるport や,
数は少なくてもほかのportのファイルと混同されるおそれが
あるファイル (Makefile など)
がある場合には, DIST_SUBDIR に port
の名前 (PKGNAME
からバージョン番号を取った部分を 使うといいでしょう)
を入れてください. すると,
DISTDIRがデフォルトの
/usr/ports/distfiles から
/usr/ports/distfiles/DIST_SUBDIR
に変更され,
取ってきたファイルはすべてそのサブディレクトリの中に置か
れるようになります.
また,
ファイルを取ってくるときにバックアップサイトとして使わ れる
ftp.freebsd.org
のディレクトリ名にもこの変数の 値が使われます.
(DISTDIRを明示的に指定し た場合には,
ローカルのファイルを置くところは変わりますが, こ
のサイトのディレクトリ名は変わりませんので, 必ず
DIST_SUBDIRを使うようにしてください.)
この変数はMakefile中で明示的に指定された
MASTER_SITES
には影響しないことに注意して ください.
RCS文字列
RCS
が特別な意味を与えている文字列をパッチ内に入れないように
してください.
ファイルを私たちのソースツリーに入れる時にこれら
の文字列はCVSによって書き換えられてしまい, あとでまたパッチ
を使おうとした時にうまくいかないことがあります. RCS文字列は
ドル記号 ($) で囲まれており,
$Id や $RCS
などで始まり ます.
パッチ作成上の注意
diffの再帰 ()
フラグを使って再帰的なパッ チを作るのは大変結構なのですが,
でき上がったパッチは必ず目で
チェックして余計なゴミが入っていないことを確認してくださ い.
よくあるのはバックアップファイル同士の変更点, あるいは
Imake や GNU configure
を使うソフトウェアの Makefile
の変更点が入っている場合などです. また,
configure.in を編集して,
autoconf を使って
configure を作り直す ときには,
configure の diff は含めずに (それらは,
数千行になることもしばしばです),
USE_AUTOCONF=yes を定義して,
configure.in の diff
をとってください.
ファイルをまるごと消す場合にはパッチを使わずに
post-extract
ターゲットで消す方が簡単です. できあがった 差分に満足したら,
それらをソースのファイルごとに別々の
パッチファイルに分割してください.
PREFIX
なるべく port は PREFIX
に対する相対パス
にインストールすることができるように心がけてください.
(この変数の値は USE_X_PREFIXか
USE_IMAKEが指定してある時には
X11BASE
(デフォルト/usr/X11R6),
そうでない場合にはLOCALBASE
(デフォルト/usr/local)
にセットされます.)
サイトによってフリーソフトウェアが
インストールされる場所が 違いますので, ソース内で
/usr/local や
/usr/X11R6
を明示的に書かないようにしてください. X のプログラムで
imake を使うものについては, これは問題に
はなりません. それ以外の場合には, ソース中のMakefileやスク
リプトで
/usr/local (imakeを使わないXのプログラ
ムは /usr/X11R6) と書いてあるところを
PREFIX に書き換えてください. この値は
portのコンパイル,
およびインストール時に自動的に環境変数として
下位makeに渡されます.
USE_X_PREFIXは本当に必要な時 (つまり,
X のライブラリなどとリンクしたり, X11BASE
以下にある ファイルを参照したりする必要がある時)
以外には設定しないでください.
変数 PREFIX の値は port の Makefile
やユーザの環境で変更することもできます. しかし, 個々の port
が Makefile
でこの変数の値を明示的に設定することはなるべくしない
でください.
また, 他の port
からインストールされるプログラムやファイル
を指定するときには, 上で述べた変数を使用してください.
例えば, less のフルパスを
PAGER というマクロに入れた い場合は,
コンパイラに
-DPAGER=\"/usr/local/bin/less\"
と渡すかわりに
-DPAGER=\"${PREFIX}/bin/less\"
(Xを使うportの時は
-DPAGER=\"${LOCALBASE}/bin/less\" )
を渡し てください. こうしておけば, `/usr/local'
がまるごとどこか他 の場所に移してあるサイトでも,
あなたのportがそのまま使える 可能性が高くなります.
ディレクトリ構成
インストール時には PREFIX
の正しいサブディ
レクトリにファイルを置くように心がけてください. ソフトウェア
によっては新しいディレクトリを
一つ作ってファイルを全部それに 入れてしまうものがありますが,
それはよくありません. また, バ イナリ,
ヘッダファイルとマニュアル以外のすべてを
lib
というディレクトリに入れてしまうportもあります が,
これもBSD的なファイルシステム構成からいうと正しくありま
せん. これは以下のように分散すべきです.
etc にセッ
トアップ/コンフィグレーションファイル,
libexec に 内部で使用されるプログラム
(コマンドラインから呼ばれることの ないコマンド),
sbin に管理者用のコマンド,
info に GNU Info 用のドキュメント,
そして share
にアーキテクチャに依存しないファイルが入り ます.
詳細については man &man.hier.7; を見てくださ い.
/usrの構成方針はほとんどそのまま
/usr/localにもあてはまります. USENET
“ニュース”を 扱う ports は例外です. これらは,
ファイルのインストール先として
PREFIX/news
を使用します.
空のディレクトリの除去
ports は デインストール(削除) の際には,
自分自身を消去したあとに, (ディレクトリの)
除去をするようにしてください. これは, 大抵の場合
@dirrm の行を ports
が作成するすべてのディレクトリについて
加えることによって実現できます. 親ディレクトリは,
子ディレクトリを先に消さないと
消せないことに気をつけて下さい.
:
lib/X11/oneko/pixmaps/cat.xpm
lib/X11/oneko/sounds/cat.au
:
@dirrm lib/X11/oneko/pixmals
@dirrm lib/X11/oneko/sounds
@dirrm lib/X11/oneko
といった感じです.
しかし, ときとして, 他の port
をディレクトリを共有しているために @dirrm
がエラーを返すことがあります. rmdir を
@unexec から呼びだすことによって,
警告(warning)なしで
空のディレクトリのみを削除することができます:
@unexec rmdir %D/share/doc/gimp 2>/dev/null || true
これを使えば, たとえ, 他の port がファイルを
インストールしていて,
PREFIX/share/doc/gimp
が空でない場合でも エラーメッセージは表示されませんし,
pkg_delete
が異常終了することもありません.
UID
もしあなたの
portがインストールされるシステム上に特定のユー
ザを必要とする場合は, pkg/INSTALL
スクリプトから pw
コマンドを実行して自動的にそのユーザを追加するよ
うにしてください. net/cvsup-mirror の
portが参考になるでしょう.
もしあなたの port が, バイナリのパッケージとしてとして
インストールされるときにも,
コンパイルされたときと同じユーザー/グループ ID
を使わなければならないのなら, 50 から 99 の間で空いている
UID を選んで登録してください.
japanese/Wnn の port
が参考になるでしょう.
既にシステムや他の portで利用されている
UIDを使わないように 十分注意してください. 現在の 50から
99までの間の UIDは以下の とおりです.
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
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:/nonexistent
wnn:*:69:7:Wnn:/nonexistent:/nonexistent
ifmail:*:70:66:Ifmail user:/nonexistent:/nonexistent
pgsql:*:70:70:PostgreSQL pseudo-user:/usr/local/pgsql:/bin/sh
ircd:*:72:72:IRCd hybrid:/nonexistent:/nonexistent
alias:*:81:81:QMail user:/var/qmail/alias:/nonexistent
qmaill:*:83:81:QMail user:/var/qmail:/nonexistent
qmaild:*:82:81:QMail user:/var/qmail:/nonexistent
qmailq:*:85:82:QMail user:/var/qmail:/nonexistent
qmails:*:87:82:QMail user:/var/qmail:/nonexistent
qmailp:*:84:81:QMail user:/var/qmail:/nonexistent
qmailr:*:86:82:QMail user:/var/qmail:/nonexistent
msql:*:87:87:mSQL-2 pseudo-user:/var/db/msqldb:/bin/sh
このリストを最新の状態に保つためにも,
この範囲の UID や GID を予約するような port を作ったり,
既存の port にそのような改変を行って我々に送るときには,
UID の予約に関する注意書きをつけてください.
合理的な port
Makefile
は単純かつ適切であるべきです. もし,
Makefile を数行短かくできたり,
もっと読みやすくできるのであれば, そうしてください. 例えば,
shell の if 構文を使う代りに, make の
.if 構文を使う,
EXTRACT* の再定義で代用できるのであれば,
do-extract を再定義しない,
CONFIGURE_ARGS +=
--prefix=${PREFIX} とするかわりに,
GNU_CONFIGURE とする, などです.
CFLAGS の尊重
CFLAGS 変数は尊重すべきです. その
port がこれを無視するのであれば,
NO_PACKAGE=ignores cflags を
Makefile に加えてください.
コンフィグレーション(設定)ファイル
もしあなたの port が設定ファイルを
PREFIX/etc
に置く必要がある場合には, それを単純にインストールしたり,
pkg/PLIST
に加えてはいけません. こうしてしまうと,
pkg_delete が
ユーザが苦労して作ったファイルを消してしまったり, 新しく
インストールすると上書きされてしまったりします.
代りに, 見本となるファイルを suffix (
filename.sample が良いでしょう)
を付けて インストールして,
message を表示して, ソフトウエアを動かす前に,
ユーザがそのファイル
をコピーして編集をしなければならないことを知らせましょう.
Portlint
送付や commit をする前に portlint
を使ってチェックしましょう.
フィードバック
Portを作るためにソフトウェアに変更を加えたら,
なるべく原作者にその旨を伝えてパッチ等を送ってください.
これらが次のリリースに取り入れられれば,
アップグレードが楽になります.
その他諸々
pkg/DESCR,
pkg/COMMENT,
pkg/PLIST などのファイルは,
それぞれ2重にチェックしてください.
再検討してもっと良い記述があれば,
それに置きかえてください.
GNU General Public License
(GNU一般公有使用許諾)のコピーは
(すでにあるので)コピーしないでください,
おねがいします.
法律に関することには, 十分注意をはらってください.
私達に法律に反するような形でソフトフェアの配布をさせない
でください!
困ったら....
私たちに質問を送る前に,
既存のportの例とbsd.port.mkを
ちゃんと読んでください! ;)
それでもわからないことがあったら,
一人で悩まないでどんどん 質問してください! :)
Makefile のお手本
これはportの Makefile
を作る際のお手本です. かぎかっこ
([])内のコメントは忘れずに取ってください.
変数の順番, 段落の間の空行など,
Makefile を作るときはなるべくこ
の形式にしたがってください.
この形式は重要な情報が簡単に見つけられるように
設計されています. portlint を使って
Makefile をチェックすることが
推奨されています.
[ヘッダ -- どのようなportのMakefileかすぐにわかるようになっています]
# New ports collection makefile for: xdvi
# Version required: pl18 ["1.5alpha" みたいなのでも結構です]
[この Makefile の最初の版が作成された日付です. この port をアップグ
レードするときには変えないでください.]
# Date created: 26 May 1995
[このソフトウェアを最初に FreeBSD に port した人の名前, つまり,
この Makefile の最初の版を書いた人です. この port をアップグレー
ドするとき, この行も変えないでください.]
# Whom: Satoshi Asami <asami@FreeBSD.ORG>
#
# $Id$
[ ^^^^ この部分は, CVS ツリーに入れる時に自動的に RCS の ID 文字列に
置き換えられます.]
#
[Port自体, およびオリジナルのソースを取ってくるところを記述する部分.
最初は必ずDISTNAME, そして必要ならPKGNAME, CATEGORIES, 続いて
MASTER_SITESがおかれ, さらに MASTER_SITE_SUBDIR がおかれることもあり
ます. そのあと, EXTRACT_SUFX か DISTFILES を指定することも可能です]
DISTNAME= xdvi
PKGNAME= xdvi-pl18
CATEGORIES= print
[MASTER_SITE_* マクロを使用しない場合は,
最後のスラッシュを忘れないように ("/")!]
MASTER_SITES= ${MASTER_SITE_XCONTRIB}
MASTER_SITE_SUBDIR= applications
[ソースファイルが標準の ".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
[依存する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 <bsd.port.mk>
Packageの名前
Package の名前は以下のルールにしたがってつけてください. こ
れは package のディレクトリを見やすくするためで, 無秩序な名前
がたくさん並んでいるとユーザが使いづらくなるのでは
という心配か らです.
(FTPサイトなどにはたくさんpackageがありますからね.)
Packageの名前は以下のようにしてください.
言語-名前-オプション
バージョン.番号
DISTNAME
が上記の形式になっていない場合に は,
PKGNAME をそのようにしてください.
FreeBSD
はユーザの慣れ親しんだ言語のサポートに力を入れて います.
特定の言語のためのportのpackage名には
言語- に ISO-639
で定義されている言語名の略称を入れ てください. 例えば,
日本語なら ja, ロシア語なら
ru, ベト ナム語なら
vi, 中国語なら zh,
韓国語ならば ko, ドイツ 語なら
de, といった具合です.
名前
の部分は原則的にはすべて英小文字 を使います.
例外はたくさんのプログラムが入っている巨大なport の場合で,
XFree86 (ほんとにあるんですよ) やImageMagickな
どがこれにあたります. そうでない場合には,
名前の大文字を小文 字に (少なくとも最初の一字だけは)
変えてください. もし, 大文字であることが重要な場合(例えば,
1文字の名前, R とか
V)には,
あなたの裁量で大文字を使うのも良いでしょう. Perl 5
のモジュールでは, 頭に p5- を付け,
2重コロン (::) のセパレータをハイフン(
- ) に置きかえるしきたりになっています.
例えば, Data::Dumper は
p5-Data-Dumper になります. また, その
ソフトウェアの名前として通常使われるものに番号, ハイフン,
あ るいは下線が入っている場合には,
それらを使うことも構いません (kinput2
など).
コンパイル時に環境変数や make
の引数などで
ハードコードされたデフォルト
を変えてコンパイルできる場合,
-compiled.specifics
にそのコンパイル時のデフォルトを入れてください
(ハイフンはあってもなくてもかまいません). 用紙のサイズ,
あるいはフォントの解像度などがこれにあたります.
バージョン番号は数字とアルファベットからなり, ピリオド
(.) で区切ります.
アルファベットは二文字以上続けてはいけませ ん.
ただ一つの例外は「パッチレベル」を意味する
pl で, それ 以外にバージョン番号が
まったくついていない場合にのみ使うことがで きます.
では, DISTNAMEを正しい
PKGNAMEに直す例を見てみましょう:
DISTNAME
PKGNAME
理由
mule-2.2.2.
mule-2.2.2
まったく問題なし
XFree86-3.1.2
XFree86-3.1.2
同上
EmiClock-1.0.2
emiclock-1.0.2
プログラム一つだけの時は小文字のみ
gmod1.4
gmod-1.4
`<名前>' のあとにハイフンが必要
xmris.4.0.2
xmris-4.0.2
同上
rdist-1.3alpha
rdist-1.3a
alphaのような文字列は使えない
es-0.9-beta1
es-0.9b1
同上
v3.3beta021.src
tiff-3.3
なんなんでしょう ;)
tvtwm
tvtwm-pl11
バージョン番号は必ず必要
piewm
piewm-1.0
同上
xvgr-2.10pl1
xvgr-2.10.1
pl
が使えるのは他にバージョン番号がない場合のみ
gawk-2.15.6
ja-gawk-2.15.6
日本語バージョン
psutils-1.13
psutils-letter-1.13
コンパイル時に用紙のサイズを指定
pkfonts
pkfonts300-1.0
300dpiフォント用のpackage
オリジナルのソースにまったくバージョン情報が見当たらず,
また原作
者が新しいバージョンをリリースする可能性が低いときには,
バージョ ン番号として 1.0
を使えばいいでしょう (上記のpiewmの例がこ れにあたります).
そうでない場合には, 原作者に聞くか, 日付
(
年.月
.日)
を使うなどしてください.
カテゴリ
すでに御存知のように, ports はいくつかのカテゴリに
分類されています. これを有効に利用するためには, port を
行う人々とユーザが, そろぞれのカテゴリが何であるか,
どのようにしてカテゴリに分類するかを理解する必要が
あります.
現在のカテゴリのリスト
まず, これが現在の port のカテゴリーのリストです.
アスタリスク(*) が付いているものは,
バーチャル(virtual) カテゴリです --
これらには対応するサブディレクトリが port
ツリーにはありません.
バーチャルカテゴリでないものは,
そのサブディレクトリ内の pkg/COMMENT
に1行の記述があります (例,
archivers/pkg/COMMENT).
Category
Description
afterstep*
Ports to support AfterStep window manager
archivers
Archiving tools.
astro
Astronomical ports.
audio
Sound support.
benchmarks
Benchmarking utilities.
biology
Biology-related software.
cad
Computer aided design tools.
chinese
Chinese language support.
comms
Communication software. Mostly software to talk to
your serial port.
converters
Character code converters.
databases
Databases.
deskutils
Things that used to be on the desktop before
computers were invented.
devel
Development utilities. Do not put libraries here just
because they are libraries—unless they truly don't
belong to anywhere else, they shouldn't be in this
category.
editors
General editors. Specialized editors go in the
section for those tools (e.g., a mathematical-formula
editor will go in math).
elisp
Emacs-lisp ports.
emulators
Emulators for other operating systems. Terminal
emulators do not belong
here—X-based ones should go to
x11 and text-based ones to either
comms or misc,
depending on the exact functionality.
games
Games.
german
German language support.
graphics
Graphics utilities.
japanese
Japanese language support.
kde*
Ports that form the K Desktop Environment
(kde).
korean
Korean language support.
lang
Programming languages.
mail
Mail software.
math
Numerical computation software and other utilities
for mathematics.
mbone
MBone applications.
misc
Miscellaneous utilities—basically things that
doesn't belong to anywhere else. This is the only category
that should not appear with any other non-virtual
category. If you have misc with
something else in your CATEGORIES line,
that means you can safely delete misc
and just put the port in that other subdirectory!
net
Miscellaneous networking software.
news
USENET news software.
offix*
Ports from the OffiX suite.
palm
Software support for the 3Com Palm(tm) series.
perl5*
Ports that require perl version 5 to run.
plan9*
Various programs from Plan9.
print
Printing software. Desktop publishing tools
(previewers, etc.) belong here too.
python*
Software written in python.
russian
Russian language support.
security
Security utilities.
shells
Command line shells.
sysutils
System utilities.
tcl75*
Ports that use tcl version 7.5 to run.
tcl76*
Ports that use tcl version 7.6 to run.
tcl80*
Ports that use tcl version 8.0 to run.
tcl81*
Ports that use tcl version 8.1 to run.
textproc
Text processing utilities. It does not include
desktop publishing tools, which go to print/.
tk41*
Ports that use tk version 4.1 to run.
tk42*
Ports that use tk version 4.2 to run.
tk80*
Ports that use tk version 8.0 to run.
tk81*
Ports that use tk version 8.1 to run.
vietnamese
Vietnamese language support.
windowmaker*
Ports to support the WindowMaker window
manager
www
Software related to the World Wide Web. HTML language
support belong here too.
x11
The X window system and friends. This category is
only for software that directly support the window system.
Do not put regular X applications here. If your port is
an X application, define USE_XLIB
(implied by USE_IMAKE) and put it in
appropriate categories. Also, many of them go into other
x11-* categories (see below).
x11-clocks
X11 clocks.
x11-fm
X11 file managers.
x11-fonts
X11 fonts and font utilities.
x11-toolkits
X11 toolkits.
x11-wm
X11 window managers.
適切なカテゴリの選択
多くのカテゴリに重なるので, どれを '第一'
カテゴリにするかを決めなければならないことが
たびたびあるでしょう. これを
うまく決めるルールがいくつかあります.
以下はその優先順のリストで, 優先度の高いものから
低いものの順に書いてあります.
言語特有のカテゴリがまず最初です. 例えば日本語の
X11 のフォントをインストールする port の場合,
CATEGORIES 行は japanese
x11-fonts となるでしょう.
より特徴的なカテゴリが, 一般的なカテゴリより
優先されます. 例えば, HTML エディタの場合は www
editors となり, 逆順にはしないでください.
また, port が mail,
mbone, news,
security, www
のいづれかに属するとには, net
は必要ありません.
x11 を第2カテゴリにするのは,
第1カテゴリが自然言語の場合のみにしてください. 特に X
のアプリケーションには x11
を指定しないでください.
もし, あなたの port が他のどのカテゴリにも
属しないばあいには, misc
にしてください.
もし, あなたがカテゴリについて自信が持てない場合には,
そのことを send-pr するときに
書き加えてください. そうすれば import するまえに
それについて議論できます. (もしあなたが commiter であれば,
そのことを &a.ports に送って, 先に議論
するようにしてください — 新しい port
が間違ったカテゴリに import されて,
すぐ移動されることが多いので.)
このドキュメントと ports システムの変更
もしあなたが, たくさんの ports の保守を
しているのであれば, &a.ports メーリングリストの内容を
フォロウすることを考えてください. Ports
のしくみについての重要な変更点はここに アナウンスされます.
最新の変更点については, いつでも, the bsd.port.mk CVS log で詳細な情報を得ることができます.
やっとおしまい!
いやはや, 長い文章ですみません.
ここまで読んでくださった方に は感謝, 感謝でございます. (_ _)
さあ, portの作り方がわかったところで,
世界中のソフトウェア をport化しましょう.
FreeBSDプロジェクトに貢献するには, それ
がもっとも簡単な方法です! :)
diff --git a/ja_JP.eucJP/books/handbook/printing/chapter.sgml b/ja_JP.eucJP/books/handbook/printing/chapter.sgml
index 791d4d4e90..783f48f7db 100644
--- a/ja_JP.eucJP/books/handbook/printing/chapter.sgml
+++ b/ja_JP.eucJP/books/handbook/printing/chapter.sgml
@@ -1,5407 +1,5407 @@
プリンタの利用
著者 &a.kelly;
30 September 1995
訳者 &a.jp.kimura;.
3 September 1996
FreeBSD でプリンタを使用するためには, バークレイラインプリンタ
スプーリングシステム (LPDスプーリングシステムとしても知られて
います) が機能するようにプリンタをセットアップする必要がありま す.
本節では, LPDスプーリングシステム (大抵の場合, 単にLPDと呼 ばれる)
について紹介します.
もし, LPDや他のプリンタスプーリングシステムについて既に詳しい
知識をお持ちの方は, 「
スプーリングシステムのセットアップ」から読み始めて
も結構です.
スプーラは何をするか
LPDはあるホストのプリンタに関する制御の一切をおこないます.
こ こで言う制御としては, 次のことが挙げられます.
ホストに接続されたプリンタ, あるいはネットワーク
上の他ホストに接続されたプリンタに対するアクセスを制御しま
す.
ファイルをプリントする要求に対して許可を与えます.
この要求は特に ジョブ
と呼ばれています.
各々のプリンタの キュー
を管理することにより,
複数のユーザがあるプリンタに対して同時にアクセスすることを
防ぎます.
ヘッダページ
(バナー または
バースト ページとしても知られています)
をプリントすることができます. これにより,
プリントアウトの山の中から自分がプリントしたジョ
ブを見つけ易くなります.
シリアルポートに接続したプリンタ用に通信パラ
メータを管理します.
ネットワーク経由で他のホスト上の, 別のLPDスプーラにジョ
ブを送ることができます.
様々なプリンタ言語やプリンタの能力に応じてジョブの
形式を整えるため,
特別なフィルタを起動することができます.
プリンタの使用に対して
課金をおこなうことができます.
設定ファイルを通して, また, 特別なフィルタプログラムを供給
することにより, 多種多様なプリンタ機器に対して, 上述の機能の
全部または一部をLPDシステムにおこなわせることができます.
どうしてスプーラを使うべきなのか
あなたのシステムを利用するのがあなた一人だけだとしたら, ア
クセス制御もヘッダページも
プリンタ利用に対する課金も必要ないのに,
なぜわざわざスプーラに煩わされなければならないのか疑問に思うか
もしれません.
プリンタに対する直接アクセスを許可することもできるので すが,
とにかくスプーラを使用するべきです. その理由は,
LPDはジョブをバックグラウンドで処理します. データが
プリンタに送信されるまで待つ必要はありません.
LPDではジョブをフィルタを通してプリントすることが簡
単にできます. これにより, 印刷物のヘッダに時刻や日付を入れ
たり, 特別なファイル形式 (TeX の DVI ファイルなど) をプリン
タが処理できる形式に変更することができます. これらの作業を
手動でおこなう必要がなくなります.
プリント処理をおこなうフリーのまたは商用のプログラムの
ほとんどは, システムのスプーラとやりとりするように作られて
います. スプーリングシステムをセットアップすることで, 今後
加えるかもしれない, あるいは, 既に持っている別のソフトウエ
アをより簡単にサポートすることができるでしょう.
スプーリングシステムのセットアップ
LPDスプーリングシステムを用いてプリンタを使用するためには,
プリンタ機器とLPD用ソフトウェアの両方を準備する必要があります.
本ドキュメントでは次の2段階のレベルに分けて説明をします.
プリンタを接続する方法, プリンタにどの
ように通信するかをLPDに指示する方法や, プレインテキスト
をプリンタで印字する方法については, 「
プリンタの簡単な設定」をご覧ください.
様々な形式のファイルを印字する方法, ヘッダページを
印字する方法, ネットワーク経由でプリンタに印字する方法,
プリンタを制御する方法, プリンタの使用に対する課金をおこなう
方法については「
プリンタ設定上級編」をご覧ください.
プリンタ設定導入編
この節では, プリンタ機器やプリンタを使用するためのLPD用ソフ
トウェアを設定する方法について述べます. この節の概要は次の通り
です.
「
プリンタ機器の設定」では,
プリンタをコンピュータに接
続するためのヒントがいくつか書かれています.
「
ソフトウェアの設定」では, LPDのスプーラ設定ファイル
/etc/printcap
の設定方法について書かれています.
データをプリンタに送るためにシリアルまたは
パラレルインタフェー スではなく,
ネットワークプロトコルを使用する場合は, 「
ネットワークにおけるデータストリームの
インタフェースを持つプリンタ」をご覧くださ い.
この節のタイトルは“プリンタ設定導入編”ですが,
実際の設定は かなり複雑です. プリンタをコンピュータに接続し,
LPDスプーラを 起動させることは一番困難な作業です.
ヘッダページを出力させたり, 課金したりするオプションの設定は,
一度プリンタがうまく動くよう になれば, とても簡単です.
プリンタ機器の設定
この節では, プリンタにPCを接続するための様々な方法について
説明しています. ここでは, ポートやケーブルの種類, FreeBSDが
プリンタとの通信に必要なカーネルコンフィグレーションについて
も言及しています.
もし, プリンタが既に接続されていて,
他のオペレーティングシステ
ム上でプリンタからの印字に成功している場合は, 「
ソフトウェアの設定」まで読み飛
ばすことが多分できるでしょう.
ポートとケーブル
最近のPC用のプリンタほとんどには次のインタフェースの一つ
もしくは両方がついています.
シリアルインタフェースでは,
プリンタにデータを
送信するためにコンピュータにあるシリアルポートが使用され
ます. シリアルインタフェースはコンピュータ業界で共通し
て使用されています. そのケーブルは容易に手に入り, また,
簡単に自作することもできます.
シリアルインタフェースには,
特別なケーブルが必要なことがときどきあり, また, 何か複
雑な通信方式選択の設定が必要になることがあります.
パラレルインタフェースでは,
プリンタにデータを
送信するためにコンピュータにあるパラレルポートを使用しま
す. パラレルインタフェースはPC業界では共通して使われてい
ます. ケーブルの入手は容易ですが, 自作するのはシリアルよ
りも難しいです. パラレルインタフェースには通常,
通信方式の選 択はなく, このため,
設定が極めて単純になっています.
パラレルインタフェースは
“セントロニクス”インタフェー
スとして知られています. これは, プリンタ用のコネクタタ
イプとして採用された後に名付けられました.
シリアルインタフェースはパラレルインタフェースより
も普通はデータの伝送速度が遅くなります.
パラレルインタフェースで は, 通常,
(コンピュータからプリンタへの) 単方向通信のみをおこな
うのに対して,
シリアルインタフェースは双方向通信をおこないます.
最近のパラレルポートの多くはプリンタ側からデータを受けとる
こともできますが, コンピュータ側にデータを送り返すことが必
要となるプリンタはほとんどありません. さらに, FreeBSDでは
双方向のパラレル通信をまだサポートしていません.
通常, プリンタで双方向通信が必要となるのは, プリンタが
PostScript 言語に対応しているときだけです. PostScript プリ
ンタは非常に冗長に動作させることができます. 事実, PostScript
によるジョブでは, プログラムを本当にプリンタ に送信します.
このことは, 印字作業を必ずしもする必要がない ことを意味し,
また, プログラムの結果をコンピュータに直接返
されるかもしれません. PostScript プリンタでは, 双方向
通信を使って, PostScript プログラムのエ
ラーや紙づまりといった問題をコンピュータに報告します. ユー
ザはそれらの情報を知りたいと思うかもしれません. さらに,
PostScript プリンタで課金作業をもっとも効率よくおこなうため
には双方向通信が必要となります. この方法では, まず, プ
リンタの現在のページカウント (起動してから今まで何枚の紙を
印字したか) の情報を得ます. 次に, ユーザのジョブをおこない,
終 了後, 再びページカウントを得ます. この2数を差によって, 課
金対象となる紙の枚数を知ることができます.
それでは,
どちらのインタフェースを使うべきなのでしょうか.
双方向通信が必要なら, シリアルポートを使ってくださ
い.
FreeBSDではパラレルポート上での双方向通信はまだサポー
トされていません.
双方向通信の必要がなく, パラレルかシリアルかの選
択ができる場合はパラレルインタフェースを使うのが好ましい
です. これにより, シリアルポートを他の周辺機器 (端末やモ
デムのなど) のために残しておくことができます. また, パラ
レルインタフェースの方がほとんどの場合高速であり, 設定も
より簡単になっています.
結局のところは
動いてくれるものを使えばよいのです.
パラレルポート
プリンタをパラレルインタフェースを使って接続する場合は,
セントロニクスケーブルでプリンタと
コンピュータをつないでくださ い. 詳しい説明はプリンタ,
コンピュータ, あるいは両方に付属す
る説明書に書かれているはずです.
その際,
どのパラレルポートを使用したかを覚えておいてください.
FreeBSDでは最初のポートは /dev/lpt0,
2番目は /dev/lpt1 であ り,
3番目以降も同様に続きます.
シリアルポート
シリアルインタフェースを使ってプリンタを使う場合は, 適切
なシリアルケーブルでプリンタ
とコンピュータを接続してください. 詳しい説明はプリンタ,
コンピュータ, あるいは両方に付属する説
明書に書かれているはずです.
“適切なシリアルケーブル”
がよくわからないときは, 次のどれか
を試してみてください.
モデム用ケーブルでは,
それぞれのピンは他方の
コネクタの対応するピンと線でつながっています. このタイプ
のケーブルは, “DTE-DCE”
間ケーブルとしても知られています. (訳注:
日本ではストレートケーブルという名前で売られています)
ヌルモデム用ケーブルでは,
あるピンは対応するピ ント接続していますが, あるピン
(例えば, データ送信用とデー タ受信用のピン)
が交差して接続したり, いくつかのピンは内部
で短絡していたりします. このタイプのケーブルは,
“DTE-DTE” 間ケーブルと呼ばれています.
(訳注:日本ではクロスケーブル
という名前で売られています)
A シリアルプリンタ用ケーブルは,
ある特定のプ リンタで必要とされ,
ヌルモデムケーブルと似ていますが, 内
部で短絡させる代わりに, ある信号を他方側に送るために使用
しています.
この他に,
プリンタ用の通信パラメータを設定する必要がありま す. 通常,
プリンタのフロントパネルやDIPスイッチによって制 御します.
コンピュータとプリンタの双方で設定できる最高の通 信速度[bps]
(ビット/秒.
ボーレートと示されているときも ある)
を選んでください. そして, データビット (7または8), パリ ティ
(偶/奇/なし), ストップビット (1または2) を選んでください.
そして, フローコントロールの有無 (制御なし, または
XON/XOFF(“イン・バンド” または
“ソフトウェア”フローコ ントロールとも呼ばれる))
を選びます. 以下に続くソフトウェア の設定のために,
ここでの設定を覚えておいてください.
ソフトウェアの設定
本節では FreeBSD の LPD
スプーリングシステムで印字をおこなうために
必要となるソフトウェアの設定について説明しています.
本節の概要は次のようになります.
プリンタで使用するポートのために, 必要があれば, カー
ネルの書き変えをおこないます. 「カーネルの変更」で,
このためにしなくてはなら ないことを説明しています.
パラレルポートを使用している場合は, パラレルポートの
ための通信モードの設定します. 詳細は, 「
パラレルポートの通信モードを設定する
」で説明しています.
オペレーティングシステムからプリンタにデータが送ら
れているかをテストします. 「
プリンタとの通信状況を調べる」で, どのように
テストするかの提案をいくつかおこなっています.
ファイル/etc/printcapを変更し,
LPDの設定を おこないます. 「/etc/printcap
ファイル」で, どのように変更するかを
説明しています.
カーネルの変更
オペレーティングシステムのカーネルの
コンパイルをおこなうこと によって,
指定されたのデバイスが機能するようになります. シリ アル,
または, パラレルインタフェースをプリンタで使用する場合,
必要なデバイスがこの指定の中に含まれていなくてはなりません.
したがって,
必要なデバイスがカーネルに組み込まれていない場合, 追
加のシリアル, または, パラレルポートをサポートするために,
カー ネルの再コンパイルが必要となるかもしれません.
シリアルポートが現在使用しているカーネルで
サポートされている かどうかを調べるためには,
次のように入力します.
&prompt.root; dmesg | grep sioN
ここで, N
はシリアルポートの番号を示し, この番号は0から 始まります.
次のような出力があった場合, カーネルはそのポー
トをサポートしています.
sio2 at 0x3e8-0x3ef irq 5 on isa
sio2: type 16550A
パラレルポートが現在使用しているカーネルで
サポートされている かどうかを調べるためには,
次のように入力します.
&prompt.root; dmesg | grep lptN
ここで, N
はパラレルポートの番号を示し, この番号は0から 始まります.
次のような出力があった場合, カーネルはそのポー
トをサポートしています.
lpt0 at 0x378-0x37f on isa
上記の出力が得られない場合, プリンタを使うため,
オペレーティ ングシステムにパラレル, または,
シリアルポートを認識し, 使用 できるようにするためには
カーネルを変更する必要があります.
シリアルポートをサポートさせるには, 「
FreeBSDカーネルのコンフィグレーション」の節をご覧く
ださい. パラレルポートをサポートさせる場合も, その節と,
あ わせて,
この節に続く節もご覧ください.
ポート用エントリを /dev
に追加する
カーネルがシリアル, または, パラレルポートを通じての通
信をサポートしていたとしても, システム上で動いているプログ
ラムがデータの送受信をおこなうための
ソフトウェアインタフェース がさらに必要になります.
そのインタフェースは, /dev
ディレクトリにあるエントリに相当します.
/dev
エントリにポートを加えるために
&man.su.1; コマンドで root になります. suコマンド
でパスワードを聞かれたら, ルート用のパスワードを入力し
ます.
/dev
ディレクトリに移動します.
&prompt.root; cd /dev
次のように入力します.
&prompt.root; ./MAKEDEV port
ここで, port は,
作成するポート名です. 1番目 のパラレルポートのときは
lpt0 に, 2番目のときは
lpt1 になり, 以降同様になります.
1番目のシリア ルポートのときは,
ttyd0 に, 2番目のときは
ttyd1 になり,
これも以降同様となります.
次を入力し, デバイスのエントリができたか確認し
ます.
&prompt.root; ls -l port
パラレルポートの通信モードを設定する
パラレルインタフェースを使用している場合, FreeBSDでは,
割り込み駆動型にするか,
プリンタとの通信の状況をカーネルに監
視させるかのいずれかを選択できます.
GENERIC
カーネルでは割り込み駆動方式が,
デフォルトになっています. この方式では,
オペレーティングシ
ステムはプリンタがデータを受け付けられるかどうかを調べ
るために, IRQ ラインを一つ使用します.
監視方式では,
オペレーティングシステムにプ
リンタがもっとデータを受け付けられるかどうかを繰り返し
尋ねるように指示します. そして, 受け付けるという応答を
受けたとき,
カーネルはさらなるデータを送信します.
割り込み駆動方式は, いくらか高速になりますが, 貴重な
IRQ ラインを一つ消費します.
うまく機能するものをお使いください.
通信モードを設定するためには2つの方法があります.
1つはカー
ネルを変更することで, もう一つは
&man.lptcontrol.8; プログラムを使用する方法です.
カーネルを設定することによって,
通信モードを変更する.
カーネルコンフィグレーションファイルを変更しま す.
lpt0
のエントリを探すか追加してください. 2番目
のパラレルポートを設定するときは, 代わりに
lpt1 を使います. 以下,
3番目のポートは lpt2 となってい
きます.
イベント駆動方式にする場合は,
irq 指 定を追加します.
device lpt0 at isa? port? tty irq N vector lptintr
ここで, N
はパラレルポート用の IRQ 番号で す.
監視方式を使用する場合は,
irq を追加 してはいけません.
device lpt0 at isa? port? tty vector lptintr
ファイルをセーブし, config プログラムを起動 し,
カーネルの構築, インストールをおこないます. そして, リ
ブートしてください. 詳細は, 「
FreeBSDカーネルのコンフィグレーション」を参照
してください.
&man.lptcontrol.8;
で通信モードを設定する場合
lptN
をイベント駆動方式に設定する場合は,
次のように入力します.
&prompt.root; lptcontrol -i -u N
lptN
を監視方式に設定する場合は, 次のように入力します.
&prompt.root; lptcontrol -p -u N
これらのコマンドを /etc/rc.local
ファイルに追加
しておくと, システムをブートする度に通信モードを設定する
ことができます. 詳細については,
&man.lptcontrol.8; をご覧ください.
プリンタとの通信状況を調べる
スプーリングシステムの設定に進む前に, オペレーティング
システムがプリンタにデータを送ることに成功しているかどうか
を確かめるべきでしょう. これにより, 印字がうまくいかないと
き, プリンタとの通信が問題なのか, スプーリングシステムが問
題なのかを分けて調べることがかなり容易になります.
プリンタをテストするためには,
プリンタに何かのテキストを送
信してみます. 送信した文字をすぐに印字してくれるプリンタに
は, &man.lptest.1; コマンドを使うと有用です. このコマンドは印
字可能な96文字のASCII文字すべてを96行生成します.
PostScript (または他の言語に対応した) プリンタの場合
は, もっと巧妙なテストが必要になります. 次のような, 簡単な
PostScript プログラムを使えば十分でしょう.
%!PS
100 100 moveto 300 300 lineto stroke
310 310 moveto
/Helvetica findfont 12 scalefont setfont
(Is this thing working?) show
showpage
このドキュメントでプリンタ用言語を参照するとき は,
PostScript のような言語を仮定しており, Hewlett Packard
の PCL は考慮していません. PCL は非常に機能的なの
ですが,
プレインテキストにエスケープシーケンスを混ぜること
ができます. PostScript ではプレインテキストを直接印字
することはできません.
このような種類のプリンタ言語に対して は,
特別な対応をおこなわなければなりません.
パラレルポートのプリンタとの接続を調べる
この節では, FreeBSDがパラレルポートに接続されたプリ
ンタと通信できているかどうかを調べる方法について説明し
ています.
パラレルポートのプリンタをテストするために
&man.su.1; コマンドで root になります.
プリンタにデータを送ります.
プリンタがプレインテキストを印字できる場合,
&man.lptest.1; コマンドを使います.
次のように入力してください.
&prompt.root; lptest > /dev/lptN
ここで, N
はパラレルポートの番号で, 番号は
0から始まります.
プリンタが PostScript か他のプリンタ
言語を使用している場合, そのプリンタに簡単なプロ
グラムを送信してください. 次のように入力します.
&prompt.root; cat > /dev/lptN
そして, 一行一行,
プログラムを慎重に入力して
下さい. RETUREN または ENTER キーを入力してしま
うと, その行は編集できなくなります. プログラムの
入力が終わったら, CONTROL+Dか, あなたが設定して
いるファイル終了のキーを押してください.
もしくは, プログラムを入力したファイルがある
場合は, 次のように入力してください.
&prompt.root; cat file > /dev/lptN
ここで, file
はプログラムが格納されていて,
プリンタに送信するファイルの名前です.
これで何かがプリントされることでしょう.
印字されたテキ
ストがおかしくても心配しなくても構いません. それについ
ては, 後で修正します.
シリアルポートのプリンタとの接続を調べる
この節では, FreeBSDがシリアルポートに接続されたプリ
ンタと通信できているかどうかを調べる方法について述べられ
ています.
シリアルポートのプリンタをテストするために
&man.su.1; コマンドで root になります.
/etc/remote
ファイルを編集します. 次の エントリを加えてください.
printer:dv=/dev/port:br#bps-rate:pa=parity
ここで, port
シリアルポート (ttyd0,
ttyd1 など) のデバイスエントリで,
bps-rateは
プリンタとの通信の転送速度[bit/秒],
parityはプリ
ンタとの通信で必要とされるパリティ
(even, odd,
none,
zeroのいずれか) を表わしていま
す.
次の例は,
プリンタをシリアルケーブルでパリティなし, 転送速度
19200bpsで第3番目のシリアルポートに接続した場
合です.
printer:dv=/dev/ttyd2:br#19200:pa=none
&man.tip.1; コマンドでプリンタと接続します. 次のよ
うに入力してください.
&prompt.root; tip printer
これがうまくいかなかった場合は,
/etc/remoteを 編集して,
/dev/ttydN
の代わりに
/dev/cuaaN
を試してみてください.
プリンタにデータを送ります.
プリンタがプレインテキストを印字できる場合,
&man.lptest.1; コマンドを使います.
次のように入力してください.
~$lptest
プリンタが PostScript か他のプリンタ
言語を使用している場合, そのプリンタに簡単なプロ
グラムを入力します. 一行一行,
プログラムを慎
重に入力してください.
バックスペースキーや他の編 集用のキーは,
プリンタの制御コードに割り当てられ
ているかもしれません. プログラムが終了したことを
プリンタに伝えるための特別なファイル終了キーを入
力する必要があるかもしれません. PostScript
プリンタの場合, CONTROL+Dを入力します.
もしくは, プログラムを入力したファイルがある
場合は, 次のように入力してください.
~>file
ここで, file
はプログラムが格納されている
ファイル名です.
&man.tip.1; コマンドでファイルを送
信した後は, ファイル終了を表わすキーを入力する必要
があります.
これで何かがプリントされることでしょう.
印字されたテキ
ストがおかしくても心配しなくても構いません. それについ
ては, 後で修正します.
スプーラに許可を与える:
/etc/printcap ファイル
ここまでで, プリンタはコンピュータに接続され, (必要なら)
プリンタと通信できるようにカーネルを変更し, 簡単なデータをプ
リンタに送信することができているはずです. これで, LPDにプリ
ンタへのアクセスを
制御させる設定をおこなう準備が整いました.
LPDの設定は /etc/printcap
を編集することでおこないます.
LPDスプーリングシステムはスプーラが使われる毎にこのファイル
を参照します. そのため, ファイルを更新するとすぐにその変更が
反映されます.
&man.printcap.5; ファイルの書式は簡単です.
/etc/printcap
の編集はお好みのテキストエディタをお
使いください. このファイルの書式は,
/usr/share/misc/termcap や
/etc/remote
といった他のケイパビリティファイルと一致しています.
この書式
のついての詳細な情報については
&man.cgetent.3; をご覧ください.
スプーラの単純な設定法は,
次のステップでおこないます.
プリンタに名前 (と簡単な別名2〜3個) を付け, それを
/etc/printcap ファイルに記述します.
これについ ては, 「
プリンタに名前を付ける」
を参照してください.
sh の項目を追加することで,
ヘッダページの出 力を禁止します (デフォルトは許可).
これについては, 「
ヘッダページの印字を禁止する」
を参照してください.
スプール用のディレクトリを作成し, その位置を
sd 項目で指定します. これについては,
「
スプーリングディレクトリの作成」
を参照してください.
プリンタを使用するために /dev
エントリを 設定し, /etc/printcap の
lp 項目でそのエ ントリを指定します.
これについては, 「
プリンタデバイスの特定」 を参照してください.
プリンタをシリアルポートに接続した場合は,
fs, fc,
xs, xc
の項目を設定する必要があります. こちらについては,
「
スプーラのための通信パラメータの設定」
を参照してください.
プレインテキスト用の入力フィルタのインストールを
おこないます. 「
テキストフィルタのインストール」
を参照してください.
&man.lpr.1; コマンドで何かを印字することで設定のテス
トをおこないます.
印字してみよう と
トラブルシューティング を参照してください.
PostScript プリンタのような, プリンタ言語を
使用しているプリンタには, プレインテキストを直接印字させる
ことができません. 上にアウトラインを示し, 以下の節で説明す
る簡単な設定方法の説明では, そのようなプリンタを設置してい
る場合は, プリンタが認識できるファイルだけを印字の対象とし
ているという仮定をしています.
多くの場合,
利用者はシステムに設置されているプリンタすべてでプ
レインテキストが印字できることを期待しています. 印字作業を
おこなうためにLPDのインタフェースを利用するプログラムでも,
通 常, そのような仮定を置きます.
プリンタ言語を使用するプリン タを設置しており,
そのプリンタ言語で記述されたジョブと,
これに加えて,
プレインテキストのジョブも印字できるよ うにしたいならば,
上で示した簡単な設定方法に加えて, さら
なる設定をおこなうことを強くお勧めします. すなわち,
原始的なプ レインテキストから PostScript (もしくは,
他のプリンタ 言語)
に変換するプログラムをインストールしてください. 「
プレインテキストのジョブを PostScript
プリンタで印字する」
で, そ れをどのようにおこなえばよいのかが
説明されています.
日本語を印字したい場合は, プリンタ言語を使用し
ていない「日本語プリンタ」についても,
プリンタ固有のエスケー プシーケンスを送る必要があります.
また, 漢字コードをプリン
タが設定しているものに変換したりする必要があり, 各プリンタ
毎に, 日本語用のフィルタが必要になります.
プリンタに名前を付ける
最初の (簡単な) ステップで, プリンタの名前を考えます.
プ リンタには別名をいくつか付けることもできるので,
機能的な名前
でも風変わりな名前でもどちらを選んでもまったく
問題はありません.
少なくとも1つのプリンタには,
/etc/printcap の中 で,
lp という別名を持たせるべきでしょう.
この名前は デフォルトのプリンタ名になっています.
ユーザが環境変数 PRINTER を設定しておらず,
かつ, LPDコマンドのコマンドラインでプリ
ンタの名前が指定されていない場合, lp
がデフォルトのプリ ンタ名となり,
そのプリンタに出力されます.
それから, これは共通の慣習ですが,
プリンタの最後の別名には,
メーカーやモデル名を含むプリンタの完全な名称をつけることに
なっています.
名前と別名のいくつかを決めたら,
/etc/printcap ファ イルに設定します.
プリンタ名は一番左のカラムから書き始めま す.
別名はそれぞれ縦棒によって区切られ, 最後の別名の後ろに
コロンを置きます.
次の例では, 2台のプリンタ (Diablo 630 ラインプリンタと
Panasonic KX-P4455 PostScript レーザライタプリンタ) が定義
されている /etc/printcap
のスケルトンを記しています.
#
# /etc/printcap for host rose
#
rattan|line|diablo|lp|Diablo 630 Line Printer:
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:
この例では, 最初のプリンタに rattan
という名前と別名 として, line,
diablo, lp そして
Diablo 630 Line Printer
が付けられています. 別名とし て lp
があるので, このプリンタはデフォルトのプリンタとなっ
ています. 2番目は bamboo と名付けられ,
別名として, ps と
PS, S,
panasonic, Panasonic KX-P4455
PostScript v51.4 が付けられていま す.
スプーリングディレクトリの作成
スプーラの簡単な設定の次のステップでは,
スプーリン
グディレクトリを作成します.
プリンタに送られるジョブ は,
その印字が終了するまでこのディレクトリに置かれます. また,
他のたくさんのスプーラもこのディレクトリにファイ
ルを置きます.
様々な事情によりスプーリングディレクトリは, 通常, 慣例
として /var/spool の下に置きます.
また, スプーリングディレクトリの内容はバックアップをす
る必要はありません.
&man.mkdir.1; によってディレクトリを
作るだけでスプーリングディレクトリの復旧は完了します.
スプーリングディレクトリの名前は, これも慣例ですが, 次
のようにプリンタの名前と同じにします.
&prompt.root; mkdir /var/spool/printer-name
しかしながら, ネットワーク上に使用可能なプリンタがたく
さんあるならば, LPDで印字するための専用のディレクトリに
スプーリングディレクトリを置きたいと思うかもしれません.
例に出てきたプリンタ rattan と
bamboo につい て, この方式を採用すると,
次のようになります.
&prompt.root; mkdir /var/spool/lpd
&prompt.root; mkdir /var/spool/lpd/rattan
&prompt.root; mkdir /var/spool/lpd/bamboo
各ユーザが印字するジョブのプライバシを守りた
いと考えているならば, スプーリングディレクトリを保護し
て, これを誰からでもアクセスできないようにしたいと思う
かもしれません. スプーリングディレクトリは, deamon ユー
ザと daemon グループに所有され, 読み込み, 書き込み, 検
索可能であり, 他からはアクセスできないようにするべきで
す. 例題のプリンタに対して, 次のようにすることにしましょ
う.
&prompt.root; chown daemon.daemon /var/spool/lpd/rattan
&prompt.root; chown daemon.daemon /var/spool/lpd/bamboo
&prompt.root; chmod 770 /var/spool/lpd/rattan
&prompt.root; chmod 770 /var/spool/lpd/bamboo
最後に, /etc/printcap ファイルで,
これらのディ レクトリの位置を LPD に伝える必要があります.
スプーリ ングディレクトリのパス名は sd
項目で指定します.
#
# /etc/printcap for host rose - added spooling directories
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
:sh:sd=/var/spool/lpd/rattan:
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:sh:sd=/var/spool/lpd/bamboo:
プリンタ名が最初のカラムから始まっており, そのプリンタ
に関して記述される他のエントリは TAB で字下げされてい
ること, 各行がバックスラッシュで終わっていることに注意
してください.
sd
によりスプーリングディレクトリが指定されていな い場合,
スプーリングシステムは /var/spool/lpd
デフォルト値として使用します.
プリンタデバイスの特定
「ポート用エントリを /dev
に追加する」では, FreeBSD でプリン
タとの通信に使用される /dev
ディレクトリ内の エントリを特定します. そして, LPD
にその情報を伝えま す. 印字するジョブを受け取ると,
スプーリングシステムは,
(プリンタにデータを渡す義務がある) フィルタプログラムに
代わって指定されたデバイスをオープンします.
/etc/printcap ファイルで
lp 項目を使って
/dev エントリを記入します.
ここでの例では, rattan
は1番目のシリアルポートに, bamboo
は6番目のシリアルポートに接続されているこ とにしましょう.
このとき, /etc/printcap には
次のようになります.
#
# /etc/printcap for host rose - identified what devices to use
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
:sh:sd=/var/spool/lpd/rattan:\
:lp=/dev/lpt0:
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:sh:sd=/var/spool/lpd/bamboo:\
:lp=/dev/ttyd5:
/etc/printcap でプリンタの
lp 項目が指定 されていない場合は, LPD
はデフォルトとして /dev/lp
を使用します. /dev/lp は, 現在の
FreeBSD には存在していません.
設置したプリンタがパラレルポートに
接続されている場合は,
「
テキストフィルタのインストール」
まで読み飛ばしてください.
そうでない場合は, 次節の説明に続いてください.
スプーラのための通信パラメータの設定
シリアルポートにプリンタを接続した場合, プリンタにデー
タを送信するフィルタプログラムに代わり, 通信速度やパリ
ティ, その他のシリアル通信パラメータを設定することがで
きます. このことによる利点は,
/etc/printcap
を編集するだけで, 様々な
通信パラメータを試してみることができます. フィルタプロ
グラムを再コンパイルする必要はありません.
スプーリングシステムで, シリアル通信の設定が異
なっているかもしれない複数のプリンタに同じフィルタプロ
グラムを使うことが可能になります.
次の /etc/printcap の項目で,
lp で指定
されたデバイスのシリアル通信
パラメータを制御できます.
br#bps-rate
デバイスの通信速度を
bps-rate に設定します.
ここ で, bps-rate は 50,
75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400,
4800, 9600, 19200, 38400[bit/秒]
のいずれかです.
fc#clear-bits
デバイスをオープンした後で,
sgttyb 構造体の
clear-bits
フラグビットをクリアします.
fs#set-bits
sgttyb 構造体の
clear-bits
フラグビットをセッ トします.
xc#clear-bits
デバイスをオープンした後で, ローカルモードビット
clear-bits
をクリアします.
xs#set-bits
ローカルモードビット
set-bits
をセットします.
fc, fs,
xc, そして xs
のビットに関 する詳しい情報については,
/usr/include/sys/ioctl_compat.h
を参照してく ださい.
項目 lp で指定されたデバイスを LPD
がオープンする とき, LPD は sgttyb
構造体のフラグビットを読み出 します. そして, 項目
fc の全ビットをクリアします. 次に,
項目 fs のビットをセットし,
その結果を設定 します.
ローカルモードビットに関しても同様におこなわれます.
例題のプリンタで6番目のシリアルポートに接続されたプリ
ンタの設定を追加してみましょう. 通信速度は38400bpsに設
定します. フラグビットとして, TANDEM, ANYP, LITOUT,
FLUSHO, PASS8 をセットします. ローカルモードビットでは,
LITOUT と PASS8 フラグをセットします.
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:sh:sd=/var/spool/lpd/bamboo:\
:lp=/dev/ttyd5:fs#0x82000c1:xs#0x820:
テキストフィルタのインストール
ここまでで,
プリンタにジョブを送るために使うテキストフィ ルタを LPD
に設定する準備が整いました. テキストフィ
ルタとは,
入力フィルタとしても知られていますが,
印字するジョブがあるときに LPD が起動するプログラムで す.
LPD がプリンタのためにテキストフィルタを起動する とき, LPD
はフィルタの標準入力からプリントするジョブ を入力し,
フィルタの標準出力に項目 lp で指定され
たプリンタデバイスを接続します. フィルタは, 標準入力か
らジョブを読み込み, プリンタのための必要な変換をおこなった
後, その結果を標準出力に出力する, これにより印字がなさ
れることを期待されています. テキストフィルタについての
更に詳しい情報については, 「
フィルタはどのように機能しているか」
をご覧ください.
ここでの簡単なプリンタ設定では,
プリンタにジョブを送るため, /bin/cat
を実行するだけの簡単なシェルスクリプ トで間に合います.
FreeBSD に標準で付属している lpf
というフィルタでは, バックスペース文字を使っ
た下線引きの動作をおこなう文字ストリームをうまく扱うことが
できないプリンタのための代替処理をおこなってくれます.
もちろん,
他のどんなフィルタプログラムを使っても構いません.
フィルタ lpf については, 「テキストフィルタ
lpf」で詳しく説明します.
最初に, 簡単なテキストフィルタであるシェルスクリプト
/usr/local/libexec/if-simple
を作ってみましょ う.
次のテキストをお好みのテキストエディタでファイルに
書き込んでください.
#!/bin/sh
#
# if-simple - Simple text input filter for lpd
# Installed in /usr/local/libexec/if-simple
#
# Simply copies stdin to stdout. Ignores all filter arguments.
/bin/cat && exit 0
exit 2
そして, このファイルを実行可能にします.
&prompt.root; chmod 555 /usr/local/libexec/if-simple
LPD
にこのテキストフィルタを使うことを設定するためには,
/etc/printcap に
if 項目を使って指定しま す. これまでの
/etc/printcap の例のプリンタ 2台に,
このフィルタを加えてみましょう.
#
# /etc/printcap for host rose - added text filter
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
:sh:sd=/var/spool/lpd/rattan:\
:lp=/dev/lpt0:\
:if=/usr/local/libexec/if-simple:
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:sh:sd=/var/spool/lpd/bamboo:\
:lp=/dev/ttyd5:fs#0x82000e1:xs#0x820:\
:if=/usr/local/libexec/if-simple:
印字してみよう
簡単な LPD 設定も終わりにたどり着きました. 残念ながら,
設定はこれでおしまいというわけではありません. なぜなら,
さらに, 設定をテストし, すべての問題点を解決しなくては
ならないからです. 設定をテストするために, 何かを印字し
てみましょう. LPD システムで印字をするためには,
&man.lpr.1; コマンドを使います. このコマンドは, 印字する
ためのジョブを投入する働きをします.
&man.lpr.1; コマンドを
「
プリンタとの通信状況を調べる」で紹介した,
あるテスト用のテキストを生成してくれる
&man.lptest.1; プログラムと一緒に使うこともできます.
簡単な LPD
設定をテストするために:
次のように入力してください.
&prompt.root; lptest 20 5 | lpr -Pprinter-name
ここで, printer-name
は /etc/printcap
で指定したプリンタ名 (もしくはその別名) です. デフォルト
のプリンタを使用する場合は,
引数を付けないで
&man.lpr.1; を打ち込んでください. もう一度述べますが, ポス
トスクリプトを期待しているプリンタをテストするならば,
&man.lptest.1; を使う代わりに PostScript で書かれたプ
ログラムをプリンタに送ってください. プログラムを送るた
めには, プログラムをファイルに格納して, lpr
file
と打ち込みます.
PostScript プリンタの場合, 送信したプログラムによ
る結果が得られるでしょう.
&man.lptest.1; を使った場合は,
以下のような結果が見られるでしょう.
!"#$%&'()*+,-./01234
"#$%&'()*+,-./012345
#$%&'()*+,-./0123456
$%&'()*+,-./01234567
%&'()*+,-./012345678
更にプリンタをテストしたい場合は, (言語ベースのプリン
タのための) もっと大きなプログラムを送信するか, 引数を
変えて
&man.lptest.1; を実行します. 例えば, lptest
80 60 で それぞれ80文字の行を60
行生成します.
プリンタがうまく動かなかった場合は, 次の節, 「
トラブルシューティング」をご覧ください.
トラブルシューティング
&man.lptest.1; を使った簡単なテストをおこなった結果,
正しい出
力を得られずに, 以下に示すような出力が得られるかもしれ
ません.
しばらくしたら出力される, または,
紙の全体が出て こない
プリンタは上で示されたような印字を
おこなったのですが, しばら くして止まってしまい,
動かなくなってしまいました. 印字
された結果をプリンタから取り出すためには,
プリンタにある PRINT REMAINING ボタン, また は, FORM
FEED ボタンを押す必要があるようです.
この場合は,
おそらくジョブはプリントをする前に更にデー
タが送られてこないか待ち続けているのでしょう.
この問題を解決するためには, プリンタに FORM FEED
文字 (あるいは特定の必要な文字コード) を
送るテキストフィルタを使ってください.
プリンタ内部に残っ
たデータをプリンタにすぐに印字させるには, 普通は,
これ で十分です.
次のジョブが前のジョブの最終ページの中央の
どこかから印字を開始させないためにも,
紙の途中で印字の
ジョブが終了したかどうかを確認するのは有益です.
シェルスクリプト
/usr/local/libexec/if-simple
を次のように変更して, プリンタへジョブを送信した後に
FROM FEED 文字を印字させるようにします.
#!/bin/sh
#
# if-simple - Simple text input filter for lpd
# Installed in /usr/local/libexec/if-simple
#
# Simply copies stdin to stdout. Ignores all filter arguments.
# Writes a form feed character (\f) after printing job.
/bin/cat && printf "\f" && exit 0
exit 2
“階段効果”が現れた
次のような印字結果が得られた.
!"#$%&'()*+,-./01234
- "#$%&'()*+,-./012345
- #$%&'()*+,-./0123456
+ "#$%&'()*+,-./012345
+ #$%&'()*+,-./0123456
あなたは「階段効果」
の新たなる犠牲者になってしま いました. この原因は,
改行を表わすべき文字がなんであるか
の解釈が混乱していることにあります. UNIX
スタイルのオ ペレーティングシステムでは, 改行文字は
ASCII コード10 の line feed (LF)
の1文字が使われています. MS-DOS や OS/2などは ASCII
コード10の LF と, ASCII コード
13の文字 (carriage return または CR)
をペアで使います. (訳注:Machintosh では CR
のみで表現されています). 大抵のプリンタでは,
改行を表わすために MS-DOS の慣習にしたが
います.
FreeBSD で印字する場合, 印字したテキストは LF
文字だけ が使われていました. プリンタでは LF
文字を見つけると, 紙を1行分送り出しました. しかし,
次の文字を印字するた
めの紙の水平方向の位置は維持されました. すなわち, CR
文字が意味することは,
次の文字を印字する位置を紙の左端
に動かすことです.
FreeBSD
がプリンタに動作をして欲しいと思っている動作を
以下に示します.
プリンタが CR を受け取ったとき
CR 動作 (復帰) をおこなう
プリンタが LF を受け取ったとき
CR + LF 動作 (復帰, 改行) をおこなう
このように動作させるための方法が
いくつかあります.
これらの文字の解釈を変えるために, プリンタ
の設定スイッチかコントロールパネルを操作する方
法. どのようにして設定をするかはプリンタのマニュ
アルを参照してください.
FreeBSD 以外のオペレーティン
グシステムを切り替えて使う場合, CR と LF 文字
の解釈をそのオペレーティングシステムで使われて
いるようにプリンタを
再設定する必要がある
かもしれません. 以下に示す解決方法のいずれかを
選ぶのがよいかもしれませんね.
自動的に LF を CR+LF に変換してくれる
FreeBSD 用のシリアルドライバを入手する方法. も
ちろん, このドライバはプリンタ専用に接続される
シリアルポート
のみで動作します. この機能
を許可するためには,
/etc/printcap ファ
イルで対象プリンタの fs
項目で CRMOD ビッ トをセットします.
LF
文字の扱いを一時的に変更するためのエ
スケープコードをプリンタに送る方法.
プリンタ
がサポートしているかもしれないエスケープコード
については, プリンタのマニュアルを参照してくだ
さい. 適切なエスケープコードが見つかったら, 最
初にそのコードを送り, 次にプリントジョブを送信
するようにテキストフィルタを変更してください.
次に, Hewlett Packard 社の PCL
エスケープコー
ドに対応しているプリンタのためのテキストフィル
タの例を示します. このフィルタでは, プリンタ に
LF 文字を LF と CR の2文字として扱わせます.
その後に, プリンタにジョブを送ります. 最後に,
ジョブの最終ページの紙を排出するため, FROM FEED
文字を送ります. このフィルタは Hewlett Packard
社のほとんどすべてのプリンタで機能するは
ずです.
#!/bin/sh
#
# hpif - Simple text input filter for lpd for HP-PCL based printers
# Installed in /usr/local/libexec/hpif
#
# Simply copies stdin to stdout. Ignores all filter arguments.
# Tells printer to treat LF as CR+LF. Writes a form feed character
# after printing job.
printf "\033&k2G" && cat && printf "\f" && exit 0
exit 2
ホスト orchid にある
/etc/printcap の
例を以下に示します. ここには, 一番目のパラレル
ポートにプリンタ (Hewlett Packard LaserJet 3Si)
が一台接続されており, そのプリンタ名は
teak です.
#
# /etc/printcap for host orchid
#
teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
:lp=/dev/lpt0:sh:sd=/var/spool/lpd/teak:mx#0:\
:if=/usr/local/libexec/hpif:
訳注: LF を CR+LF
に置き換える cat コマンド
を作る方法も当然考えられます. そして, このコマ
ンドと, if-simple の cat の部分
を置き換えればよいわけです. 具体的にどのように
するかは, 読者への練習問題としましょう.
各行が重ね書きされてしまった
プリンタは紙送りをまったくしませんでした.
テキストすべての行
がある行の上で重ねて印字されてしまいました.
この問題は,
階段現象とは“正反対”な問題で, ほとんどま
れにしか起こりません. FreeBSDでは行末として扱われる
LF 文字が, 紙の左端に印字位置を復帰しますが,
紙送りはしな い CR 文字として扱われています.
プリンタの設定スイッチかコントロールパネルを
使って, LF と CR
の文字を次のような解釈をするようにしてください.
プリンタが受け取ったとき
プリンタがおこなう
CR
CR 動作 (復帰)
LF
CR + LF (復帰, 改行)
訳注: LF を CR+LF
に置き換える cat コマンドを作る方法
も当然考えられます. そして, このコマンドと,
if-simple の cat
の部分を置き換えればよいわけ です.
具体的にどのようにするかは, 読者への練習問題とし
ましょう.
プリンタが文字を紛失してしまう
印字しているのですが,
各行の2〜3文字が印字されません.
プリンタを動かせば動かすほど,
もっとたくさんの文字が紛 失されていき,
この問題は更に悪くなっていくかもしれませ
んでした.
この問題は,
シリアルポートを通してコンピュータから送ら
れてくるデータの速度に,
プリンタがついていけないことに 起因します
(この問題は, パラレルポートに接続されたプリ
ンタでは発生することはありません).
この問題を克服する 方法が2つあります.
プリンタが XON/XOFF のフロー制御をサポート
している場合は, 項目 fs で
TANDEM ビット をセットして, FreeBSD
にこの機能を使用させて ください.
プリンタがキャリアフロー制御をサポートして
いる場合は, 項目 fs で MDMBUF
ビットをセッ トして下さい. それから,
プリンタとコンピュータ
を接続しているシリアルケーブルがキャリアフロー
制御用に正しく配線されたものかどうかを確認して
ください.
プリンタがフロー制御をまったく
サポートしていな い場合は, 項目
fs の NLDELAY と TBDELAY,
CRDELAY, VTDELAY, BSDELA のいくつかのビッ
トを組み合わせて使い, プリンタへ送るデータの流
れに適当な遅延を加えてください.
プリンタは意味不明な
文字列を印字した
プリンタはランダムなゴミのように
見えるものを印字しまし たが,
意図したテキストは印字してくれませんでした.
この問題は, 通常,
シリアルポートに接続したプリンタでの
通信パラメータの誤りからくる前項とは別の症状です.
br 項目の通信速度と
fs と fc
項目のパリ ティビットの設定を共に調べてみてください.
また, プリン タでの設定が
/etc/printcap
ファイルで設定した
内容と一致しているかどうかも確認してください.
訳注: simple-if
のような単純なフィルタだけの状態で, 日
本語を含むテキストを印字しようとした場合にも,
シリアル ポート, パラレルポートの使用に関係なく,
このような症状 は見られます. 日本語プリンタの場合,
漢字コードそのもの
を送信しただけでその漢字を印字してくれるものは,
少なく とも訳者は見たことがありません.
漢字を印字するための制御
コードを別途送信するフィルタが必要となります.
また, そ のようなフィルタを使用していても,
そのフィルタが想定し
てる漢字コードと異なった文書を
プリントしようとしたとき もこのような症状は出ます.
もちろん, これはプリンタ用の
言語を持たないプリンタの話で, PostScript プリンタ
などにプレインテキストを送信しても, 日本語対応,
非対応 に関らず, 意味不明な文字列が印字される
(もしくは, 何も 印字されない) ことでしょう.
何も起きない
もしプリンタが何の動作もしないのであれば,
ハード的な問 題ではなく, 多分 FreeBSD
の中に問題があります.
/etc/printcap ファイルで,
デバッグしているプ リンタのエントリに
(lf 項目で) ログファイルを取るよ
うに設定を追加してください. 例えば, プリンタ
rattan 用のエントリの項目
lf は次のようになります.
rattan|line|diablo|lp|Diablo 630 Line Printer:\
:sh:sd=/var/spool/lpd/rattan:\
:lp=/dev/lpt0:\
:if=/usr/local/libexec/if-simple:\
:lf=/var/log/rattan.log
次に, もう一度印字をおこなってみます. そして,
発生したと思
われるエラーメッセージを見るためにログファイル
(上記の 例では,
/var/log/rattan.log)
を調べます. そこ で見られたメッセージを元に,
問題を解決してみてください.
項目 lf
が指定されていない場合, LPD はデフォルト
のログファイルとして
/dev/console を使います.
プリンタを使う
この節では, FreeBSD で設定したプリンタを使う方法について説明
します. ここでは, ユーザレベルでのコマンドを概説します.
&man.lpr.1;
印字をおこないます.
&man.lpq.1;
プリンタキューを調べます.
&man.lprm.1;
プリンタキューにあるジョブを削除します.
管理者用コマンド &man.lpc.8; もありますが,
これは 「プリンタを管理する」
に記
します. このコマンドは, プリンタやそのキューの制御のために用い
られます.
&man.lpr.1;, &man.lprm.1;, そして &man.lpq.1; の 3
コマンドは,
オプションをとり, これによって,
/etc/printcap のように操作の対象となる
プリンタやキュー
を指定します. これによって, 様々なプリンタに対してジョブを送る
, 取り消す, 調査することができます.
が使われなかった場
合は, これらのコマンドは
PRINTER 環境変数で指定されたプリンタ
を使用します.
そして, PRINTER 環境変数がなかった場合は, これ
らのコマンドはデフォルトのプリンタ
lp を使います.
以下では, デフォルトプリンタ
という用語が意味するプリンタ は, PRINTER
環境変数で指定されたプリンタ, もしくは, PRINTER
環境変数がない場合は, lp
という名前のプリンタです.
印字する
ファイルを印字するためには,
次のように入力してください.
&prompt.user; lpr filename ...
これにより,
入力されたファイルのそれぞれをデフォルトのプリンタ
から印字します. ファイル名が与えられなかった場合,
&man.lpr.1;
は標準入力から印字するデータを読み込みます. 例えば, 次のコマン
ドにより, ある重要なシステムファイルが印字されます.
&prompt.user; lpr /etc/host.conf /etc/hosts.equiv
印字させるプリンタを選択するためには,
次のように入力します.
&prompt.user; lpr -P printer-name filename ...
次の例では, プリンタ rattan に,
カレントディレクトリにあ
るファイルの詳細なリストを印字しています.
&prompt.user; ls -l | lpr -P rattan
上記の &man.lpr.1; コマンドではファイル名の指定がないので,
lpr は標準入力から印字するデータ,
この場合, ls -l
コマンドの出力, を読み込みます.
&man.lpr.1; コマンドでは,
出力の整形を制御したり, ファイル変換を
適用したり, 複数部数のコピーを作成したり, などといた様々な幅広
いオプションを受け付けることもできます.
詳細については,
「
その他の印字オプション」をご
覧ください.
ジョブの処理状況を調べる
&man.lpr.1; コマンドを使って印字をする場合, プリントしようと
するデータは “プリントジョブ”
と呼ばれる箱に一緒に置かれ, こ
れが LPD スプーリングシステムに送られます. プリンタにはそれぞ
れ, ジョブ用のキューがあり,
送られてきたジョブはあなたや他のユー
ザからの別のジョブと一緒にそのキューで並んで,
処理される順番を
待ちます.
プリンタは到着順にこれらのジョブの印字をおこないます.
デフォルトプリンタのキューの状態を表示するには,
&man.lpq.1; と入
力します. プリンタを指定するときは,
オプションを使い
ます. 例えば, 次のコマンド
&prompt.user; lpq -P bamboo
は, プリンタ bamboo
のキューの状態を表示します. この lpq
コマンドの出力結果の例を次に示します.
bamboo is ready and printing
Rank Owner Job Files Total Size
active kelly 9 /etc/host.conf, /etc/hosts.equiv 88 bytes
2nd kelly 10 (standard input) 1635 bytes
3rd mary 11 ... 78519 bytes
この例では, bamboo
のキューに3つのジョブがあることが分か ります.
最初のジョブはユーザ kelly からのものであり, “ジョ
ブ番号”9が割り当てられています.
プリンタのすべてのジョブには一意
なジョブ番号が付けられています. ほとんどの場合, このジョブ番号
は無視することができますが, ジョブをキャンセルするときにはこの
番号が必要になります. このことの詳細については, 「ジョブの削除
」をご覧ください.
ジョブ番号9のジョブは2つのファイルを処理します. すなわち,
&man.lpr.1;
のコマンドラインに複数のファイル名が与えられたときは,
1つのジョブとして扱われるのです. このジョブは, 現在, アクティ
ブジョブ (“Rank”
の欄の active という後に注目) になってい
ます. これは, プリンタからそのジョブが現在印字されているはずで
あることを意味しています. 2番目のジョブでは,
&man.lpr.1; コマン
ドに標準入力からデータが与えられています.
3番目のジョブはユー
- ザ mary から与えられました.
+ ザ mary から与えられました.
このジョブのサイズはとても大きくなっ
ています. 彼女がプリントしようとしたファイルのパス名はここで表
示させるには長すぎるため,
&man.lpq.1; コマンドはドットを3つだけ
表示しています.
&man.lpq.1; からの
出力で一番最初の行もまた有益な情報を与えていま
す. この行から, プリンタが現在何をしているか (あるいは, 少なく
とも LPD がプリンタが
していると思っていること) が分かります.
&man.lpq.1; コマンドは
オプションもサポートしています. こ
れにより,
詳しい情報が表示されます. lpq -l の実行例を次
に示します.
waiting for bamboo to become ready (offline ?)
kelly: 1st [job 009rose]
/etc/host.conf 73 bytes
/etc/hosts.equiv 15 bytes
kelly: 2nd [job 010rose]
(standard input) 1635 bytes
mary: 3rd [job 011rose]
/home/orchid/mary/research/venus/alpha-regio/mapping 78519 bytes
ジョブの削除
印字するようジョブを
送った後で印字を中断したくなったときは,
&man.lprm.1; コマンドで,
キューの中からそのジョブを削除することが
できます. 大抵の場合, アクティブジョブでさえも
&man.lprm.1; を使っ
て削除することができますが,
そのジョブの一部またはすべてが印字さ
れてしまうかもしれません.
デフォルトプリンタへのジョブを削除するためには, 最初に,
&man.lpq.1; を使ってそのジョブ番号を調べます.
すなわち, それから,
次のように入力して, ジョブを削除します.
&prompt.user; lprm job-number
特定のプリンタへのジョブを削除するときは,
オプション
を使ってそのプリンタを指定します.
例えば, プリンタ bamboo
のキューからジョブ番号
10のジョブを削除するには次のようにします.
&prompt.user; lprm -P bamboo 10
&man.lprm.1; コマンドには略記法がいくつかあります.
lprm -
あなたが (デフォルトプリンタへ)
送ったジョブをすべて削除し ます.
lprm user
ユーザ user が
(デフォルトプリンタへ) 送ったジョブ をすべて削除します.
他のユーザのジョブを削除できるのはスー パユーザだけです.
あなたは, あなた自身のジョブしか削
除することはできません.
lprm
ジョブ番号もユーザ名もシンボル
も指定されない
ときは, &man.lprm.1; は現在のアクティブジョブを, そのジョ
ブを送ったのがあなた自身であるときに限り, デフォルトプ
リンタから削除します. ただし, スーパユーザは任意のア
クティブジョブを削除することができます.
上記の略記法をデフォルトプリンタではなく
特定のプリンタに対して おこなうときは,
オプションでそのプリンタを指定するだけよ いのです. 例えば,
プリンタ rattan のキューへあなたが送っ
たジョブをすべて削除するためには次のようにします.
&prompt.user; lprm -P rattan -
ネットワーク環境で作業をしている場合, あるホストか
ら送られたプリンタジョブは, これを送ったホストで
&man.lprm.1; を
使った場合に限って,
これを削除することができます. 他のホストで
同じプリンタを使えたとしても,
このジョブを削除することはできま
せん.
次の例では, 他ホストからジョブを削除することを試みていま
す.
&prompt.user; lpr -P rattan myfile
&prompt.user; rlogin orchid
&prompt.user; lpq -P rattan
Rank Owner Job Files Total Size
active seeyan 12 ... 49123 bytes
2nd kelly 13 myfile 12 bytes
&prompt.user; lprm -P rattan 13
rose: Permission denied
&prompt.user; logout
&prompt.user; lprm -P rattan 13
dfA013rose dequeued
cfA013rose dequeued
その他の印字オプション
&man.lpr.1; コマンドには, テキストの整形や,
図や他のファイル形
式の変換, 複数部コピーの生成, ジョブの扱いなどをを制御すること
ができます.
この節では, これに関するオプションについて記してい
ます.
整形と変換に関するオプション
以下の &man.lpr.1; 用のオプションはジョブにおける
ファイルの
整形の制御に関するものです.
このオプションは, ジョブにプレイン
テキストが含まれない場合や
&man.pr.1; ユーティリティを使ってプレイ
ンテキストを整形する場合に用いてください.
次の例では, プリンタ
bamboo に (TeX 組版システムによる)
DVI ファイル
fish-report.dvi を印字しています.
&prompt.user; lpr -P bamboo -d fish-report.dvi
このオプションは,
ジョブに含まれるすべてのファイルに対して適用さ れます.
したがって, 1つのジョブに (例えば) DVI ファイルと ditroff
ファイルを混在させることはできません. その代わりに,
ファイルを 形式毎に別々のジョブに分け,
それぞれのジョブでその形式用の変換
オプションを使って印字してください.
と
を除くすべてのオプションを使用 するためには,
出力先プリンタ用の変換フィルタが必要です. 例えば,
オプションを使用するには, DVI
用の変換フィルタが必要 です. 詳細については, 「
変換フィルタ」で説明しています.
cifplot ファイルを印字します.
DVI ファイルを印字します.
FORTRAN プログラムを印字します.
plot のデータを印字します.
出力に対して, number
カラム分の字下げをおこないます.
number が省略されると,
8カラム分字下げされます.
このオプションはある変換フィルタと一緒の指定されたとき
のみに機能します.
と数字の間に空白を入れてはいけません.
制御文字を含む文字通りの
テキストデータを印字します.
ditroff (device independent troff) データ
を印字します.
-p
印字する前に &man.pr.1;
によってプレインテキストを整形し
ます. 詳細については &man.pr.1; をご覧ください.
&man.pr.1; コマンドにより生成されるヘッダを,
ファイル名の
代わりに title とする.
このオプションは,
と一緒に使ったときのみ機能する.
troff データを印字します.
ラスタのデータを印字します.
次の例では, &man.ls.1; の
マニュアルを美しく整形したものをデフォ
ルトプリンタで印字しています.
&prompt.user; zcat /usr/share/man/man1/ls.1.gz | troff -t -man | lpr -t
&man.zcat.1; コマンドで
&man.ls.1; のマニュアルのソースファイルの圧
縮を復元し, これを
&man.troff.1; コマンドに渡しています. これによ
り, ソースファイルが整形され, GNU troff の形式となります. そ
の結果は &man.lpr.1; に渡され,
LPD スプーラへジョブの要求が発せ
られます. &man.lpr.1; には
オプションが使われているため,
スプーラにて, GNU troff の形式からジョブを印字したときにデフォ
ルトプリントが解釈できる形式へと変換されます.
ジョブに関するオプション
以下のオプションは, &man.lpr.1; によって, そのジョブを特殊
な扱いにするよう LPD に指示するためのものである.
-# copies
ジョブに含まれるファイルのそれぞれを
1部だけ印字するの ではなく,
copies
部のコピーを生成させるものです. 管理者によっては,
プリンタの消耗を避け, コピー機による
複製を奨励するためにこのオプションの使用が禁止されてい
るかもしれません. これに関しては, 「
複数部のコピーの印字を制限する
」をご覧ください.
次の例では, デフォルトプリンタで
parser.c を3 部コピーし, 次に,
parser.h を3部コピーしています.
&prompt.user; lpr -#3 parser.c parser.h
-m
印字ジョブが完了した後で, メールを送ります.
このオプショ ンを付けると, LPD
システムはジョブの扱いが終了したと きに,
あなたのアカウントにメールを送ります. メールのメッ
セージには, ジョブが正常終了したのか, あるいは, 何か異
常があり, (しばしば)
その異常が何であったのかが書かれて います.
-s
印字ファイルをスプールディレクトリにコピーせず,
代わりに,
シンボリックリンクを作成するよう指示します.
印字させるジョブのサイズが大きいとき, このオプショ
ンを使うと便利かもしれません. このオプションにより,
スプー ルディレクトリの容量が節約されます (それに,
巨大なジョ
ブのお陰でスプールディレクトリのあるファイルシステムの
空き容量がなくなってしまうかもしれません). さらに,
LPD
がいちいちすべてのデータをコピーする必要がなくなりま
すので, 時間の節約にもなります.
ただし, 欠点もあります. LPD
はオリジナルのファイルを 直接参照するので,
印字が終了するまでそのファイルを変更
したり削除することができません.
リモートのプリンタで印字している場合, LPD は,
結局のところ, ローカルホストからリモートホストにファ
イルをコピーする必要があります. したがって,
オプ
ションはローカルのスプーリングディレクトリの
空き容量を 節約するだけで,
リモート側では節約されません. それに も関わらず,
このオプションはそれでも有用です.
-r
ジョブに含まれるファイルを,
スプーリングディレクトリに
ファイルをコピーした後に削除します. もしくは,
オプションと一緒に使われた場合は,
印字終了後に削除され ます.
このオプションの使用には十分注意して下さい.
ヘッダページ用オプション
以下のオプションにより,
ジョブのヘッダページに通常印字さ
れるテキストを
&man.lpr.1; に調整させることができます. 対象のプリ
ンタからヘッダページが出力されない場合は,
これらのオプションは
何の効力も持ちません.
ヘッダページの設定に関する情報については,
「
ヘッダページ」を参照してください.
-C text
ヘッダページに印字されるホスト名を
text に置き換 えます. なお,
ホスト名の場所には, 通常, ジョブの要求が
あったホストの名前が印字されます.
-J text
ヘッダページに印字されるジョブ名を
text に置き換 えます.
ジョブ名の場所には, 通常, ジョブの最初のファイ ル名,
または, 標準入力からデータが印字されたときは
stdinが印字されます.
-h
ヘッダページを出力を禁止します.
サイトによっ ては,
そのヘッダページの生成方法により, このオプション
の効果が現れないかもしれません. 詳細は, 「
ヘッダページ」をご覧ください.
プリンタを管理する
プリンタの管理者として, プリンタの設置, 設定,
そして, それ
らのテストをおこなう必要がありました.
&man.lpc.8; コマンドにより,
これまでとは別な管理方法がプリンタと対話的におこなわれます.
&man.lpc.8; により, 次のことが可能となります.
プリンタの起動, 停止をおこなう.
キューへの入力の許可, 禁止をおこなう.
それぞれのキューにあるジョブの順番を変更する.
最初に用語に関する注意をしておきます.
プリンタが停止してい るとは,
キューの中にあるどのジョブも印字されることがない状態
を言います. この状態においても,
ユーザはまだジョブの要求をおこなう ことができますが,
これらのジョブはキューの中で,
プリンタがスタートする状態になるまで,
あるいは, キューの内容が削除され
るまで待たされることになります.
キューが禁止状態にあるとは, (root
以外の) すべてのユーザが
プリンタにジョブを要求することができない状態のことを言います.
キューが許可状態にある場合は,
ジョブの入力が許可されます.
キューが禁止状態にある場合でも,
プリンタをスタートす
る状態にすることは可能です. この場合は,
キューが空になるまで,
キュー内のジョブの印字が続けられます.
一般的に,
&man.lpc.8; コマンドを使用するには root の権限を持って
いる必要があります. 一般のユーザも
&man.lpc.8; コマンドを使うこと
はできますが, プリンタの状態を取得することとハングしたプリンタ
を再スタートすることだけに使用が制限されています.
以下に,
&man.lpc.8; コマンドに関する説明の要約を述べます. ほとん
どのコマンドでは, 操作対象となるプリンタを指定するため
printer-name 引数を与えます.
printer-name の代わり
に all が与えられると, 操作は
/etc/printcap 内に
ある全プリンタに対しておこなわれることになります.
abort printer-name
現在のジョブをキャンセルし, プリンタを停止させます.
キュー が許可状態にある場合は,
ユーザはまだジョブを入力する ことができます.
clean printer-name
プリンタのスプーリングディレクトリから,
ジョブの古いファ イルを削除します. 状況によって,
とりわけ, 印字途中でエ ラーが発生していたり,
管理操作が頻発していた場合には,
ジョブで作られたファイルを LPDが完全に削除しないことが
あります. このコマンドでは, スプーリングディレクトリに
入っていないファイルを見つけ出し,
それを削除しています.
disable printer-name
キューに新しいジョブを入れることを禁止します.
プリンタ がスタート状態にあるときは,
キューに残っているジョブの 印字は続けられます. ただし,
キューが禁止状態にあったと しても, スーパーユーザ (root)
は常にジョブを入力するこ とができます.
このコマンドは,
新しいプリンタやフィルタを設置している
間に使用すると有用です. すなわち, キューを禁止状態にし
ておくと, root によるジョブのみが入力されます. そして,
その他のユーザは, テストが完了し,
enable コマン
ドでキューが再度許可状態になるまで, ジョブの入力はでき
なくなります.
down printer-name
message
プリンタをダウンさせます. これは,
disable をおこなっ
た後で, stop をおこなった場合と
等価になります.
message は, ユーザが
&man.lpq.1; コマンドでプリンタ
のキューの状態を調べたり, lpc status
でプリンタの
状態を調べたときに, プリンタの状況として表示されるメッ
セージです.
enable printer-name
プリンタのキューを許可状態にします.
ユーザはジョブの入 力ができるようになりますが,
プリンタがスタートの状態に なるまでは,
プリンタからは何も印字されません.
help command-name
command-name
コマンドのヘルプメッセージを表示しま
す. command-name
が指定されなかった場合は, 利用
できるコマンドの要約が表示されます.
restart printer-name
プリンタをスタートさせます. 通常のユーザは, LPD があ
る異常な状況でハングしたときに限り, このコマンドを使用
することができます. しかし, stop
または down コマンドにより,
停止状態にあるプリンタをスター トさせることはできません.
restart コマンドは,
abort の後に start
をおこなったことと同じになり ます.
start printer-name
プリンタをスタートさせます.
プリンタのキューにあるジョ
ブを印字することでしょう.
stop printer-name
プリンタを停止します. プリンタは,
現在のジョブを終了さ せ, そして,
キューにあるその他のジョブは印字しません.
プリンタが停止状態にあったとしても, まだ, 許可状態にあ
るキューに対して, ジョブを送ることができます.
topq printer-name
job-or-username
printer-name
のキューに対して, ジョブ番号
job のジョブ, または, ユーザ
username から送
られたジョブを置き換えて, キューの先頭に持ってきます.
このコマンドに関しては,
printer-name の代わりに
all
を使用することはできません.
up printer-name
プリンタをアップ状態にします. これの反対のコマンドが
down です. start
の次に enable をおこなっ
たことと等しくなります.
コマンドラインから上記のコマンドを入力すると,
&man.lpc.8; はこれ
を受け付けます. コマンドが入力されなかった場合は,
&man.lpc.8; は
対話モードに入り,
exit, quit,
または, ファイル終端
文字が入力されるまでコマンドの入力ができます.
プリンタ設定上級編
この節では, 特殊な形式のファイルを印字するためのフィルタ,
ヘッ ダページ, ネットワーク越しのプリンタへの印字, そして,
プリンタ 使用の制限や課金について説明しています.
フィルタ
LPD では, ネットワークプロトコル, キュー, アクセス制御, そ
して, 印字のためのその他の側面について扱いますが,
実際の 作業のほとんどは
フィルタ によっておこなわれています.
フィルタ は, プリンタと通信し,
プリンタのデバイス依存性や特殊な要求を扱 うプログラムです.
簡単なプリンタ設定では, プレインテキストのた
めのフィルタをインストールしました. このプレインテキストフィル
タは, ほとんどのプリンタで機能する極めて単純なものでした.
(「
テキストフィルタのインストール」を参照)
しかしながら, 形式変換やプリンタ課金, 特定のプリンタの癖,
など をうまく利用するためには,
フィルタがどのように機能するかという
ことを理解しておくべきです. これらの側面を扱うためには, 最終的
には, フィルタの責任であるからです. そして, これは悪い情報です
が, ほとんどの場合において,
あなた自身がフィルタを供給す
る必要があるということです. また都合のよいことには,
たくさんのフィルタが 一般的に利用できるということです.
もしフィルタがなかったとし ても, 普通は,
フィルタを作るのは簡単です.
FreeBSD にも, プレインテキストを印字させることができる
/usr/libexec/lpr/lpf
というフィルタが1つ付いています.
(このフィルタはファイルに含まれるバックスペースやタブを扱いま
す. また, 課金をすることもできますが, できることはこれだけしか
ありません.) いくつかのフィルタとフィルタの構成要素が FreeBSD
の ポート集にもあります.
この節で述べることは次の通りです.
「
フィルタはどのように機能しているか」では,
印字の過程におけ るフィルタの役割を概説します.
この節を読むことで, LPD がフィルタを使うときに,
“見えないところで”何が起こっている
かが理解できるでしょう. このことを知っておくと, プリン
タそれぞれに様々なフィルタをインストールしたときに遭遇
するかもしれない問題を予期したり, デバッグするときに役
立つでしょう.
LPD では, すべてのプリンタからデフォルトでプレインテ
キストを印字できることを期待しています. このことは, プ
レインテキストを直接印字できない PostScript (また
は他の言語用の) プリンタでは問題を引き起こします. 「
プレインテキストのジョブを PostScript
プリンタで印字する」 で,
この問題を克服する方法について述べます. PostScript
プリンタをお持ちの方は, この節をお読みになること
をお薦めします.
PostScript は様々なプログラムのための有名な出
力形式です. ある人たちは (著者自身を含めて) PostScript
のコードさえも直接書いてしまいます. しかし, PostScript
プリンタは高価です. 「非 PostScript プリンタで
PostScript をシミュレートする」では, PostScript
データを非 PostScript
プリンタに受けつけさせ, 印字させるために,
どのようにしてプリンタ用のテキストフィルタをさらに変更
すればよいのか, ということについて述べます. PostScript
プリンタを持っていない方は, この節をお読みになる
ことをお薦めします.
「
変換フィルタ」では, 図形や組版データといっ
た特定のファイル形式を, プリンタが理解できる形式へ変換
する作業を自動的におこなわせる方法について述べます. この節
を読むと, troff のデータを印字するには lpr
-t, または, TeX DVI を印字するには
lpr -d, ラスタイ
メージデータを印字するには lpr -v,
などといったよ
うにユーザが入力することができるようにプリンタの設定を
おこなうことができます. この節もお読みになることをお薦めし
ます.
「出力フィルタ」
では, あまり使われない LPD の機能のすべて, すなわち,
出力フィルタに関することが記述されています. ヘッダページ
(「
ヘッダページ」参照) を印字させていない場合は,
多分, この節は飛ばしても構わないでしょう.
「テキストフィルタ
lpf」では, lpf
についての説明が, ほぼ完全におこなわれています. これは
FreeBSD に付属するラ インプリンタ (または,
ラインプリンタのように動作するレー ザプリンタ) のための,
単純なテキストフィルタです. プレ
インテキストを印字したことに対して課金をおこなう方法が至急
必要な場合, もしくは, バックスペース文字を印字しようと
すると煙を発するプリンタを持っている場合は, 絶対に
lpf を検討するべきです.
フィルタはどのように機能しているか
既に言及したように, フィルタとは, プリンタにデータを送る
際に, デバイスに依存した部分を取り扱うために LPD
によって起動 される実行プログラムです.
LPD がジョブ中のファイルを印字しようとするとき, LPD
はフィル タプログラムを起動します. このとき,
フィルタの標準入力を印字す るファイルに,
標準出力をプリンタに, そして, 標準エラー出力をエ
ラーログファイル (/etc/printcap 内の
lf 項目で指 定されたファイル, または,
指定されていない場合は, デフォルトと して
/dev/console) にセットします.
LPD が起動するフィルタと, その引数が何であるかは,
/etc/printcap
ファイルの内容と, ジョブの起動時に
ユーザが指定した
&man.lpr.1; コマンドの引数に依存しています. 例え
ば, ユーザが lpr -t と入力した場合は,
LPD は出力先のプリ
ンタ用の tf 項目で指定されている troff
用のフィルタを起動
させるでしょう.
ユーザがプレインテキストの印字を指示したときは,
if で指定されたフィルタが
起動されるでしょう (このことはほ
とんどの場合にあてはまります.
詳細については, 「
出力フィルタ」をご覧ください).
/etc/printcap
で指定可能なフィルタは次の3種類がありま す.
テキストフィルタ
(LPD のドキュメントでは紛ら
わしいことに
入力フィルタと呼んでいますが) は一般の
テキストの印字を扱います. これはデフォルトのフィルタと
考えてください. LPD では, すべてのプリンタに対して, デフォ
ルトでプレインテキストが印字できることを期待しています.
さらに, バックスペースやタブを正しく扱い, また, 他の特
殊な文字が入力されてもプリンタに混乱を来さないようにす
るのはテキストフィルタの仕事であると考えています.
プリンタの使用に対して課金をしなくてはならない環境にあ
るときは, テキストフィルタが印字したページ数を数える作
業もしなくてはなりません. この作業は, 通常, 印字した行
数を数え, これをプリンタが1ページ当たりに印字できる行
数と比較することでおこなわれます.
テキストフィルタは, 次のような引数を付けて起動されます.
filter-name
-c
-wwidth
-llength
-iindent
-n login
-h host
acct-file
ここで,
lpr -l
によってジョブが入力されたときに与
えられます.
width
/etc/printcap
で指定された pw (page width)
項目の値が与えられます. デフォル トは,
132です.
length
pl (page length)
項目で指定された値が与え られます.
デフォルトは66です.
indent
lpr -i
によって与えられた字下げの量で, デ
フォルトは0です.
login
ファイルを印字したユーザのアカウント名が
与えら れます.
host
ジョブが入力されたホスト名が
与えられます.
acct-file
af
項目で指定されている課金データファイル
の名前が与えられます.
変換フィルタは,
特定のファイル形式をプリンタ
が紙に印字できるようなものに変換します. 例えば, プリン
タで ditroff 組版データを直接印字することはできません.
しかし, ditroff データをプリンタが消化し, 印字するこ
とができる形式へ変換するために, ditroff ファイル用フィ
ルタをインストールすることができます.
「
変換フィルタ」
で, これらに関するすべてについて説明します.
プリンタの課金をする必要がある場合は, 変換フィルタでも
印字ページを数える作業が必要となります.
変換フィルタは次の引数をとって起動されます.
filter-name
-xpixel-width
-ypixel-height
-n login
-h host
acct-file
ここで, pixel-width は,
px 項目で指定され
た値 (デフォルトは0),
pixel-height は,
py 項
目で指定された値 (デフォルトは0) です.
出力フィルタは,
テキストフィルタが指定されて
おらず, かつ, ヘッダページの出力が許可されている場合に
のみ使われます.
「
出力フィルタ」で, これらのことについて説明し
ます. アウトプットフィルタに対する引数は次の2つだけです.
filter-name
-wwidth
-llength
ここで, と は,
テキストフィルタの場合
と同じです.
フィルタは, 次に示すの終了状態をもってプログラムを
exit するべきです.
exit 0
フィルタがファイルを正常に印字した場合.
exit 1
フィルタはファイルの印字に失敗したが, LPD
に再度ファ イルの印字を試みて欲しい場合.
この終了状態で終了した場 合, LPD
はフィルタを再スタートします.
exit 2
フィルタはファイルの印字に失敗し, かつ, LPD
に再出力 を試みて欲しくない場合. この場合, LPD
はそのファイル を放棄します.
FreeBSD に付属するテキストフィルタ
/usr/libexec/lpr/lpf は, FROM FEED
文字が送られたと
きやプリンタ使用に対する課金をどのようにするかを
決定するために, ページ幅やページ長の引数を利用します. また,
課金用のエントリを 作成するため, ログイン名, ホスト名,
課金ファイル名の引数を利用 します.
もし, フィルタの購入を検討しているならば, LPD
と互換性がある かどうかを確認してください. もしそうならば,
上述の引数リストをサ ポートしていなければなりません.
一般向けの使用のためにフィルタ
を作成する計画をしている場合は,
同じ引数リストと終了コードをサ ポートしてください.
プレインテキストのジョブを PostScript プリン
タで印字する
コンピュータと PostScript (または, 他の言語に対応し た)
プリンタをあなたしか使用しない場合は, プリンタにプレ
インテキストを絶対に送らない, そして,
プリンタにプレインテキス
トを送りたがっている様々なプログラムの機能を決して
使わないこと にしてください. そうすれば,
この節に書かれたことに心を煩わせる必
要はまったくなくなります.
しかし, PostScript
とプレインテキストの両方のジョブをプリン
タへ送りたいと思っている場合は,
プリンタ設定についての要求が増 えるでしょう.
両者をプリンタへ送信するためには, 到着
したジョブがプレインテキストであるか PostScript であるかを
検出するテキストフィルタが必要です. PostScript のジョブは
すべて %!
で始まらなければならないことになっています
(他のプリンタ言語に関しては,
プリンタのドキュメントをご覧くだ さい).
ジョブの最初の2文字がこれならば, PostScript である
ことが分かります. したがって,
ジョブのそれ以降の部分をプリンタに直 接送ることができます
(訳注:PostScript では, %
以降はコメントとして扱われるので, 最初の %! の行を 読み捨てても問題はない).
最初の2文字が %! でない場
合は, フィルタはテキストを PostScript に変換し, その結果を
使って印字をおこないます.
この作業をどうやってやればよいのでしょうか.
シリアルポートにプリンタを接続した場合は,
lprps をインス
トールすることをお勧めします. lprps は
PostScript 用のフィルタで,
プリンタとの双方向通信をおこないます. このフィルタでは,
プリンタか らの冗長な情報を得ることで,
プリンタの状況を示すファイルが更新 されていきます.
したがって, ユーザや管理者は
(トナー残量少や
紙詰まりといった)
プリンタの状況を正確に知ることができます. しかし,
もっと重要なことは, psif
と呼ばれるプログラムが 含まれているということです.
このプログラムは, 入力されたジョブ
がプレインテキストかどうかを検出し, これを PostScript に変
換するために, textps
(lprps に付属する別のプログラ ム)
を呼び出します. そして, このジョブをプリンタに送るために,
lprps が使われます.
lprps は FreeBSD
のポート集に含まれています (「
ポートコレクション」を参照してください).
もちろん,自分自身でプログラムを取ってきて, コンパイルし,
インストールす ることもできます. lprps
をインストールした後は, lprps
の一部である psif
プログラムのパス名を指定する だけです. ポート集から
lprps をインストールしたときは,
/etc/printcap の中のシリアル接続した
PostScript プリンタのエントリに対して, 次を使ってください.
:if=/usr/local/libexec/psif:
LPD
にプリンタをリード・ライトモードでオープンさせるために,
rw 項目も指定すべきです.
パラレルポートに接続したプリンタの場合 (すなわち,
lprps が
必要としているプリンタとの双方向通信ができない),
テキストフィ
ルタとして次のシェルスクリプトを使うことができます.
#!/bin/sh
#
# psif - Print PostScript or plain text on a PostScript printer
# Script version; NOT the version that comes with lprps
# Installed in /usr/local/libexec/psif
#
read first_line
first_two_chars=`expr "$first_line" : '\(..\)'`
if [ "$first_two_chars" = "%!" ]; then
#
# PostScript job, print it.
#
echo "$first_line" && cat && printf "\004" && exit 0
exit 2
else
#
# Plain text, convert it, then print it.
#
( echo "$first_line"; cat ) | /usr/local/bin/textps && printf "\004" && exit 0
exit 2
fi
上記のスクリプトにおいて, textps
はプレインテキストから PostScript
へ変換するために別にインストールしたプログラム です.
テキストから PostScript へ変換するのには, お好みのどんなプロ
グラムでも使うことができます. FreeBSD の ポート集 (「ポートコレクション」
を参照してください) には, a2ps
と呼ばれるテキストから PostScript に変換するプログラムが
入っています.
訳注: 上記スクリプトでは,
先頭の行を読み込むために read を使っていますが,
困ったことに, read は読み込んだ文字列の先頭
の空白文字を取り除いてしまいます. 従って,
これらの空白文字は印 字されないことになり,
印字結果がファイルのイメージと異なる場合 が出てきます.
この事情は csh を利用した場合でも変わりません. 仮に,
先頭の空白文字を除去しない read コマンドを作ったとしても,
「echo $first_line」の $first_line
変数の内容をシェルが展開す る際に $first_line
の先頭の空白文字が失われるため, 問題の解決 にはなりません.
残念ながら, 訳者はこの問題をシェルプログラムだ
けで解決する方法をしりません. perl か C
言語の力を借りないと解 決できないと思います.
非 PostScript プリンタで PostScript
をシミュレートする
PostScript
は質の高い組版と印字をおこなうための事実
上の標準です. しかしながら, PostScript は,
高価な標 準です. ありがたいことに,
Alladin Enterprises から
Ghostscript と呼ばれる,
PostScript 互換の動作をするフリー
のプログラムが出されていて, FreeBSDで動きます. Ghostscript
はほとんどの PostScript ファイルを読むことができ, これらの
各ページをたくさんのブランドの非 PostScript プリンタを含む
様々なデバイス用に変換することができます. Ghostscript をイン
ストールし,
プリンタ用の特別なテキストフィルタを使うことによっ て, 非
PostScript プリンタをあたかも本物の PostScript
プリンタであるかのように動作させることができます.
Ghostscript はポート集に入っていますので,
そこからインストール することができます. また,
自分でソースプログラムを持ってきて, コンパイルし, インストー
ルすることもできます. この作業はとても簡単にできます.
PostScript プリンタをシミュレートさせる場合は,
テキストフィ ルタに PostScript
ファイルを印字しようとしているかどうかを 検出させます.
PostScript ファイルでない場合は, フィルタは
そのファイルを直接プリンタに送ります
(訳注:テキストファイルを直 接印字できない場合は, もちろん,
変換フィルタを通す必要がありま す). PostScript の場合は,
まず, Ghostscript を使い, ファ
イルをそのプリンタが理解できる形式へ変換します.
次の例のスクリプトは, Hewlett Packard DeskJet 500
プリンタ用 のテキストフィルタです.
他のプリンタで用いるときは,
引数を gs (Ghostscript)
コマンドに変えてくだ さい. (gs -h
と入力すると, 現在インストールされている Ghostscript
でサポートされているデバイスのリストが得られます).
#!/bin/sh
#
# ifhp - Print Ghostscript-simulated PostScript on a DeskJet 500
# Installed in /usr/local/libexec/hpif
#
# Treat LF as CR+LF:
#
printf "\033&k2G" || exit 2
#
# Read first two characters of the file
#
read first_line
first_two_chars=`expr "$first_line" : '\(..\)'`
if [ "$first_two_chars" = "%!" ]; then
#
# It is PostScript; use Ghostscript to scan-convert and print it
#
/usr/local/bin/gs -dSAFER -dNOPAUSE -q -sDEVICE=djet500 -sOutputFile=- - \
&& exit 0
else
#
# Plain text or HP/PCL, so just print it directly; print a form
# at the end to eject the last page.
#
echo "$first_line" && cat && printf "\f" && exit 0
fi
exit 2
最後に, if 項目を通して, LPD
にこのフィルタを教えてやる 必要があります.
:if=/usr/local/libexec/hpif:
これでおしまいです. lpr plain.text
とか lpr whatever.ps
と入力してみましょう. どちらも正常に印字されるは
ずです.
訳注: 日本語を印字する場合は,
日本語対応の Ghostscript が必要で す. 日本語対応版の
Ghostscript もポート集に入っているはずです.
変換フィルタ
「プリンタ設定導入編」
に書かれた簡単な設定が完了したら, 最初に, やってみたいと思
うことは, 多分(プレイン ASCII テキストに加えて)
好みのファイル形式
のための変換フィルタをインストールすることでしょう.
なぜ, 変換フィルタをインストールするのか?
変換フィルタによって, 様々な種類のファイルを印字するこ
とが簡単になります. 例えば, TeX
組版システムでたくさんの仕事 をしたと仮定しましょう.
そして, PostScript プリンタが接続 されているとします.
すると, TeX で DVI ファイルを作成する度に, DVI
ファイルを印字するために, これを PostScript ファイルに
変換する必要があります.
このコマンドは次のようになるでしょう.
&prompt.user; dvips seaweed-analysis.dvi
&prompt.user; lpr seaweed-analysis.ps
DVI ファイル用の変換フィルタがインストールしてあると,
LPD に 変換を肩代わりさせることで毎回毎回
おこなわなければならなかった面倒
な変換作業を省くことができます. つまり, DVI を生成したら,
次のような1回のコマンド入力だけで, これが印字されます.
&prompt.user; lpr -d seaweed-analysis.dvi
LPD に DVI ファイルの変換をさせるためには,
オプション を指定します.
変換オプションのリストは「
整形と変換に関するオプション」
に載せてあります.
変化のオプションのそれぞれをプリンタに
サポートさせるためには,
変換フィルタをインストールし,
そのパス名を /etc/printcap
の中で指定しなくてはなりません. 変換フィ ルタは,
プレインテキストを印字する代わりに, フィルタはファイル
をプリンタが理解できる形式に変換するところを除けば,
「プリンタ の簡単な設定」で説明したテキストファイル
(「
テキストフィルタのインストール」 を見て下さい)
に似ています.
どの変換フィルタをインストールすべきか?
使いたいと思う変換フィルタをインストールすべきです.
DVI のデータを頻繁に印字するならば, DVI 変換フィルタ
をインストールするのが適切でしょう. 印字しなくてはなら
ない troff を大量に抱えている場合は, 多分, troff フィ
ルタが欲しくなるはずです.
次の表は, LPD で動作するフィルタと,
/etc/printcap
ファイルでのエントリする項目, そして,
lpr
コマンドで呼び出す方法をまとめたもの です.
ファイル形式
/etc/printcap項目
lpr オプション
cifplot
cf
DVI
df
plot
gf
ditroff
nf
FORTRAN text
rf
troff
tf
raster
vf
プレインテキスト
if
なし, , または
先の例のように, lpr -d
を使うためには, 出力先の プリンタの
/etc/printcap 内のエントリで,
df
項目が必要であることが分かります.
反論はあるかも知れませんが, FORTRAN テキストや plot
のような形式は, 多分, 廃れ てていくでしょう.
あなたのサイトで, 自前のフィルタをイ ンストールするだけで,
プリントオプションのいくつか, あ るいは,
全部に新しい意味を与えることができます. 例えば,
Prinerleaf ファイル (Interleaf デスクトップパブリッシン
グプログラムによるファイル) を直接印字したいとします.
そして, Printerleaf 用の変換フィルタを
gf 項目で
指定したパスにインストールすれば, lpr
-g の意味 は“Printerleaf
ファイルを印字する”意味だとユーザに教
えることができます.
変換フィルタのインストール
変換フィルタは FreeBSD
の基本システムのインストールとは別
にインストールするプログラムなので, 変換フィルタは, 多 分,
/usr/local ディレクトリの下に置くべ
きです. フィルタは LPD だけが実行する特別なプログラム,
すなわち, 一般ユーザが実行する必要すらない
プログラムなので, /usr/local/libexec
ディレ クトリに置くのが普通です.
変換フィルタを使用可能にするためには,
/etc/printcap
の目的のプリンタの適切な項目に
フィルタがあるパス名を指定します.
DVI 変換フィルタをプリンタ bamboo
のエントリに加 えてみましょう. プリンタ
bamboo の df 項目を
新たに加えた/etc/printcap
ファイルの例を以下 に再掲します.
#
# /etc/printcap for host rose - added df filter for bamboo
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
:sh:sd=/var/spool/lpd/rattan:\
:lp=/dev/lpt0:\
:if=/usr/local/libexec/if-simple:
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:sh:sd=/var/spool/lpd/bamboo:\
:lp=/dev/ttyd5:fs#0x82000e1:xs#0x820:rw:\
:if=/usr/local/libexec/psif:\
:df=/usr/local/libexec/psdf:
DVI フィルタは
/usr/local/libexec/psdf という
名前のシェルスクリプトです. このスクリプトは次のように
なっています.
#!bin/sh
#
# psdf - DVI to PostScript printer filter
# Installed in /usr/local/libexec/psdf
#
# Invoked by lpd when user runs lpr -d
#
exec /usr/local/bin/dvips -f | /usr/local/libexec/lprps "$@"
このスクリプトでは, dvips
をフィルタモード (引数 ) で,
標準入力上で起動しています. 標準入力は印字 するジョブです.
それから, PostScript プリンタ用フィ ルタ
lprps (これについては「
プレインテキストのジョブを PostScript
プリンタで印字する」 を参照してください) を LPD
に与えられた引数を付けて起動 します.
lprps
はこれらの引数を印字されたページ分
の課金をおこなうために使われます.
変換フィルタのその他の例
変換フィルタのインストールには決まったステップがないの
で, その代わりに, 例をもっと挙げることにします. これを,
自分でフィルタを作る際のガイドにしてください. 適当な例が
あったら, それをそのまま使ってください.
次のスクリプト例は, Hewlett Packard LaserJet III-Si の
ための, raster (ええと・・実は, GIF ファイル) 用の変
換フィルタです.
#!/bin/sh
#
# hpvf - Convert GIF files into HP/PCL, then print
# Installed in /usr/local/libexec/hpvf
PATH=/usr/X11R6/bin:$PATH; export PATH
giftopnm | ppmtopgm | pgmtopbm | pbmtolj -resolution 300 \
&& exit 0 \
|| exit 2
ここでは, GIF ファイルから PNM (portable anymap) 形式
に変換し, 次に PGM (portable graymap) 形式に変換してか ら,
LaserJet/PCL-互換データに変換しています.
上記のフィルタを使うプリンタのためのエントリを付け加え
た /etc/printcap
ファイルは次のようになります.
#
# /etc/printcap for host orchid
#
teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
:lp=/dev/lpt0:sh:sd=/var/spool/lpd/teak:mx#0:\
:if=/usr/local/libexec/hpif:\
:vf=/usr/local/libexec/hpvf:
次のスクリプトは, PostScript プリンタ
bamboo のための groff 組版システムの
troff データのための変換 フィルタです.
#!/bin/sh
#
# pstf - Convert groff's troff data into PS, then print.
# Installed in /usr/local/libexec/pstf
#
exec grops | /usr/local/libexec/lprps "$@"
上記のスクリプトではプリンタとの通信をおこなうため,
lprps をまた利用しています.
プリンタがパラレルポー トに接続されている場合は, 代わりに,
次のスクリプトを使 うかもしれません.
#!/bin/sh
#
# pstf - Convert groff's troff data into PS, then print.
# Installed in /usr/local/libexec/pstf
#
exec grops
これで完成しました. 次に, フィルタを使用可能にするため
に /etc/printcap
に加える必要があるエントリを 示します.
:tf=/usr/local/libexec/pstf:
次の例をみたら, FORTRAN のベテランは赤面するかもしれ
ません. この FORTRAN テキストフィルタは, プレインテキ
ストを直接印字できるすべてのプリンタで利用できます. この
フィルタをプリンタ teak
にインストールすることに しましょう.
#!/bin/sh
#
# hprf - FORTRAN text filter for LaserJet 3si:
# Installed in /usr/local/libexec/hprf
#
printf "\033&k2G" && fpr && printf "\f" && exit 0
exit 2
そして, このフィルタを使用可能にするため, 以下の行を
/etc/printcap のプリンタ
teak のエントリ に加えます.
:rf=/usr/local/libexec/hprf:
これが最後の, そして, 若干複雑な例です. 前に紹介した
LaserJet プリンタ teak に, DVI
フィルタを加える ことにしましょう. 最初に,
簡単な部分をおこないます. すなわ ち, DVI フィルタの位置を
/etc/printcap に書 き加えます.
:df=/usr/local/libexec/hpdf:
さて, 難しい部分であるフィルタの作成をおこないます.
このた めに, DVI から LaserJet/PCL
への変換プログラムが必要 です. FreeBSD のポート集 (「ポートコレクション」
を参照してください) には, それがあ ります.
dvi2xx というのがそのパッケージの名前で
す. これをインストールすると, 必要なプログラム
dvilj2p が使えます. このプログラムは
DVI を LaserJet IIp, LaserJet III, そして LaserJet 2000
の互 換コードへ変換してくれます.
dvilj2p はフィルタ
hpdf を極めて複雑にしてい ます.
なぜなら, dvilj2p
は標準入力からデータを読 み込むことができないからです.
このプログラムを働かせる ためには, ファイル名が必要です.
もっと悪いことに, ファ イル名は .dvi
で終わっている必要があり, 標準入力 の代わりに,
/dev/fd/0 を使うのは問題がありま す.
この問題は, (.dvi で終わる)
一時的なファイル名 から/dev/fd/0 に
(シンボリックな) リンクを張る
ことで回避することができます. これで,
dvilj2p に 強制的に標準入力からデータを
読み込ませることができます.
もう1つの問題は, 一時的なリンクを張るために
/tmp ディ
レクトリを使うことができないという事実です. シンボリッ
クリンクはユーザ, グループが bin
であるユーザに所 有されています. フィルタはユーザ
daemon として起 動します. そして,
/tmp ディレクトリはスティッ
キービットが立っています. フィルタはリンクを作ることが
できます. しかし, リンクは別のユーザに所有されているた め,
作業が終了したとき, このリンクを削除することができ
ません.
その代わりに, シンボリックリンクは現在の作業ディレクト
リ, すなわち, スプーリングディレクトリ
(/etc/printcap の
sd 項目で指定する) に作 ることにします.
フィルタが作業するにはここの場所は完璧 な場所で, なぜなら,
特に, スプーリングディレクトリのディ スクの空き容量は
(ときどき) /tmp ディレクトリ
よりもたくさんあるからです.
以下に示すのが最後のフィルタです.
#!/bin/sh
#
# hpdf - Print DVI data on HP/PCL printer
# Installed in /usr/local/libexec/hpdf
PATH=/usr/local/bin:$PATH; export PATH
#
# Define a function to clean up our temporary files. These exist
# in the current directory, which will be the spooling directory
# for the printer.
#
cleanup() {
rm -f hpdf$$.dvi
}
#
# Define a function to handle fatal errors: print the given message
# and exit 2. Exiting with 2 tells LPD to do not try to reprint the
# job.
#
fatal() {
echo "$@" 1>&2
cleanup
exit 2
}
#
# If user removes the job, LPD will send SIGINT, so trap SIGINT
# (and a few other signals) to clean up after ourselves.
#
trap cleanup 1 2 15
#
# Make sure we are not colliding with any existing files.
#
cleanup
#
# Link the DVI input file to standard input (the file to print).
#
ln -s /dev/fd/0 hpdf$$.dvi || fatal "Cannot symlink /dev/fd/0"
#
# Make LF = CR+LF
#
printf "\033&k2G" || fatal "Cannot initialize printer"
#
# Convert and print. Return value from dvilj2p does not seem to be
# reliable, so we ignore it.
#
dvilj2p -M1 -q -e- dfhp$$.dvi
#
# Clean up and exit
#
cleanup
exit 0
自動変換: その他の変換フィルタ
ここまでに述べてきたフィルタによって, 印字環境の能率が
上がったことと思います. しかし, これはどのフィルタを使
うかを ( &man.lpr.1; のコマンドライン上で) ユーザが指定しな
くてはならないという代価を支払って実現されています. コ
ンピュータの事情にあまり詳しくないユーザにとって, フィ
ルタのオプションを指定させられるということはいらいらさ
せられるものになるでしょう. 更に悪いことに, 間違ったフィ
ルタオプションを指定されると, 間違った形式のファイルが
そのフィルタに適用されることになり, その結果, 何百枚も
の紙を掃き出すことになるかもしれません.
そのような結果になるならば, 変換フィルタをインストール
するよりもむしろ, テキストフィルタ (これがデフォルトフィ
ルタなので) に印字するよう要求されたファイルの形式を検
出させ, 自動的に, 適切な変換フィルタを起動するようにし
たいと思うかもしれません. ここでは file
コマンド のようなツールを役立たせることができます.
もちろん, いくつかの
ファイル形式の違いを見分けることは難しい ことでしょう.
そして, もちろん, それらのファイルに対し ては,
変換フィルタを提供するだけで済ますこともできるの
です.
FreeBSD のポート集には, apsfilter
と呼ばれる自 動変換をおこなうテキストフィルタがあります.
このフィルタは プレインテキスト, PostScript, DVI
ファイルを検 出し, 適当な変換をおこなった後,
データを印字することができ ます.
出力フィルタ
LPD スプーリングシステムでは,
ここまでにまだ取り上げていな いフィルタ形式,
出力フィルタをサポートしています. 出力 フィルタは,
テキストフィルタのように, プレインテキスト
のみを印字するために意図されたものですが, 非常に簡単化
されています. テキストフィルタを用いずに, 出力フィルタ
を使っている場合は, 次のようになります.
LPD はジョブ中の各ファイルに一度ではなく, ジョブ
全体に対して一度だけ出力フィルタを起動します.
LPD は出力フィルタに対し, ジョブ中のファイルの先
頭や末尾を特定するための対策を一切
おこなっていません.
LPD はユーザのログイン名やホスト名をフィルタに渡
しません. したがって, 課金の処理をおこなうことは考えてい
ません. 実際, 出力フィルタには, 以下2つの引数しか与え
られません.
filter-name
-wwidth
-llength
ここで, width
は対象となるプリンタの pw 項 目,
length は
pl 項目に指定された数です.
出力フィルタの簡便さに誘惑されてはいけません. もし, ジョ
ブ中のそれぞれのファイルに別のページ番号を付加しようと
しても,
出力フィルタはうまく動作しないでしょう.
そのような動作を期待しているならば, (入力フィルタとし
ても知られている) テキストフィルタを使ってください. 詳
しくは, 「
テキストフィルタのインストール」をご覧ください.
さらに, 出力 フィルタは, 実のところ,
もっと複雑になっています. まず,
特殊なフラグ文字を検出するために, フィルタに送ら
れてくるバイトストリームを検査する必要があります. また, LPD
に代わって, 自分自身にシグナルを送らなければなりま
せん.
しかしながら, ヘッダページの印字をおこないたい場合,
また,
エスケープシーケンスやヘッダページを印字できるようにす
るその他の初期化文字列を送信する必要がある場合, 出力ファ
イルが必要です.
1台のプリンタに対し, LPD では出力フィルタとテキスト,
または, 他のフィルタを両方使うことができます. このよう
な場合, LPD はヘッダページ (「
ヘッダページ」 を参照してください)
だけを印字させるために, 出 力フィルタを起動させます.
それから LPD では, アウトプッ トフィルタに2バイトの文字
(ASCII 031 の次に ASCII 001) を送ることで,
出力フィルタが自力で停止することを
期待しています. 2バイト (031, 001) が出力フィルタに送られ
たとき, 出力フィルタは自分自身にシグナル SIGSTOP を送
ることによって停止するべきです. LPD がその他のフィル
タの起動を完了したとき, LPD は出力フィルタにシグナル
SIGCONT を送ることで, 出力フィルタを再起動させます.
出力フィルタがあり,
テキストフィルタがない場合, LPD
はプレインテキストのジョブをおこなう際に, 出力フィル
タを使います. 前述したように, 出力フィルタでは, ジョブ
中の各ファイルの並びの間に FROM FEED 文字や紙を排出す
る他の文字を入れることはしません. この動作は多分, あな
たが求めているものとは
異なっているでしょう. ほと
んどすべての場合において, テキストフィルタが必要とされる
はずです.
プログラム lpf は,
テキストフィルタの項で既に紹介 しましたが,
出力フィルタとしても動作させることができま す. もし,
簡便で極悪な出力フィルタが必要で, かつ, バイ
トストリームを検査したりシグナルを送るコードを書きたく
ないときには, lpf をお試しください.
あるいは, プ リントが要求する初期化コードを送るために,
lpf を
シェルスクリプトに包んで使うこともできます.
テキストフィルタ lpf
プログラム /usr/libexec/lpr/lpf は,
FreeBSD の バイナリ配布に付属しているテキストフィルタ
(入力フィル タ) で, 出力を字下げしたり (lpr
-i でジョブが入力さ れたとき),
文字を未処理のままプリンタに送ったり (lpr
-l でジョブが入力されたとき), ジョブ中のバッ
クスペースやタブの印字位置を調節したり, 印字したページ
に対して課金したりすることができます. また, このフィル
タは出力フィルタとしても動作させることができます.
lpf
は多くの印字環境において使用することに適して います.
このフィルタには, プリンタに初期化文字列を送る
機能はありませんが, 必要とされる初期化をおこない, それから
lpf
を実行させるためのシェルスクリプトを作成する
のはたやすいことです.
lpf に対して,
印字ページへの課金を正確におこなわせる ためには,
/etc/printcap ファイルの中の
pw と pl
の項目に正確な値を入れておく必要が あります. これらの値は,
どのくらいの量のテキストがペー ジにフィットするか, また,
ユーザのジョブが何ページある のかを調べるために使われます.
プリンタの課金についての 詳しい情報については, 「
プリンタの利用に対する課金」をご覧ください.
リモートプリンタからの出力
FreeBSD では, ネットワーク越しの印字, すなわち, ジョブをリ
モートプリンタに送ることをサポートしています. リモートプリンタ
からの出力をするには, 一般に, 次の2つを参照してください.
リモートホストに接続されたプリンタにアクセスする方 法.
プリンタがあるホストのシリアル, または, パラレルイ
ンタフェースに接続されている場合, ネットワーク上の他の
ホストからこのプリンタにアクセスできるように LPD を設
定します. 「リモートホストに
接続されたプリンタ」
でどのよう にするかを説明します.
ネットワークに直接接続されているプリンタにアクセ
スする方法. プリンタに, 旧来のシリアル, または, パラレ
ルインタフェースに加えて (もしくは, これらに代わって) ネッ
トワーク用のインタフェースがある場合. そのようなプリン
タは次のように動作するでしょう.
そのプリンタが LPD のプロトコルを理解でき, リモー
トホストからのジョブを
キューに入れることさえできる場合. この場合,
プリンタは, LPD が起動している一般のホスト
のように振る舞います. そのようなプリンタを設定するため
に, 「
リモートホストに接続されたプリンタ」
と同様の手 順をおこなってください.
そのプリンタが, データストリームによるネットワー
ク接続をサポートしている場合. この場合, ネットワーク上
の1つのホストとしてプリンタを“接続”します.
このホス トは, ジョブをスプーリングする責任を負い,
スプーリング されたジョブはプリンタに送られます.
そのようなプリンタ
をインストールするためのいくつかの提案が「
ネットワークにおけるデータストリームの
インタフェースを持つプリンタ」にあります.
リモートホストに接続されたプリンタ
LPD スプーリングシステムでは LPD (または LPD 互換のシス
テム)
が起動している他のホストへジョブを送る機能が始めからサポー
トされています. この機能により,
あるホストに接続されたプリンタ へ,
他のホストからアクセスできるようになります. また, LPD プ
ロトコルを理解するネットワークインタフェースを持った
プリンタに 対しても, この機能は働きます.
リモートプリンタへの出力を許可するためには, 最初に,
あるホスト (これを,
プリンタホストと呼びます)
にプリンタを接続します. そして, 「 プリンタ設定導入編」
に書かれた簡単なプリンタの設定をおこなってください.
必要ならば, 「プリンタ設定上級編」
にあ る, 更に進んだ設定をおこなってください. そして,
そのプリンタをテス トしてうまく動作することを確認し, LPD
に許可した機能がうまく働 くかどうかを見てください. さらに
ローカルホスト が
プリンタホスト の LPD サービスの使用を
許可されているか確認して 下さい (「
リモートホストからのプリンタの利用を制限する
」参照).
LPD
互換のネットワークインタフェースを持つプリンタを使用してい
る場合は, そのプリンタ自身が以下で説明する
プリンタホスト になります. そして,
プリンタ名とは, そのプリンタに設定し
た名前のことを指します. これについては, プリンタ, および
(また は),
プリンタのネットワークインタフェースに付属するドキュメン
トを参照してください.
次に,
そのプリンタにアクセスしたいと思っている他ホストにおいて,
そのホストの /etc/printcap
ファイルに次にあげるエント リを作ります.
名前のエントリ. どんな名前でもよいのですが, 簡単
のため, 多分, プリンタホストで設定されたプリンタ名や別
名と同じものを使いたいと思うでしょう.
lp
項目で指定されるデバイスは明示的に空にす る
(:lp=: とする).
スプーリングディレクトリを作成し,
sd 項目で その位置を指定する. LPD
では, プリンタホストにジョブ を送信するまでの間,
このディレクトリにジョブを格納しま す.
rm
項目でプリンタホストの名前を指定します.
rp 項目で
プリンタホスト に接続したプリン
タ名を指定します.
これで終わりです.
変換フィルタやページの大きさやその他の事項を
/etc/printcap
に加える必要はありません.
次に,
リモートホストに接続されたプリンタで印字するための設定例
を示します. ホスト rose には2台のプリンタ
bamboo と rattan
が接続されています. これらのプリンタをホスト orchid
のユーザが使えるようにしましょう. 最初に
orchid の
/etc/printcap を示します
(このファイルは, 「
ヘッダページの出力を許可する」
で参照することができます). このファイルには, 既に, プリンタ
teak 用のエントリがありました. 以下では,
これに,
ホスト rose
にある2台のプリンタ用のエントリが加えられ ています.
#
# /etc/printcap for host orchid - added (remote) printers on rose
#
#
# teak is local; it is connected directly to orchid:
#
teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
:lp=/dev/lpt0:sd=/var/spool/lpd/teak:mx#0:\
:if=/usr/local/libexec/ifhp:\
:vf=/usr/local/libexec/vfhp:\
:of=/usr/local/libexec/ofhp:
#
# rattan is connected to rose; send jobs for rattan to rose:
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
:lp=:rm=rose:rp=rattan:sd=/var/spool/lpd/rattan:
#
# bamboo is connected to rose as well:
#
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:lp=:rm=rose:rp=bamboo:sd=/var/spool/lpd/bamboo:
orchid
で必要となる作業はスプーリングディレクトリを
作ることだけです.
&prompt.root; mkdir -p /var/spool/lpd/rattan /var/spool/lpd/bamboo
&prompt.root; chmod 770 /var/spool/lpd/rattan /var/spool/lpd/bamboo
&prompt.root; chown daemon.daemon /var/spool/lpd/rattan /var/spool/lpd/bamboo
これで, orchid のユーザが
rattan と bamboo で印字す
ることができるようになりました.
例えば, orchid のユーザが次の
ように入力したとします.
&prompt.user; lpr -P bamboo -d sushi-review.dvi
すると, orchid の LPD システムは, ジョブをスプーリングディレ
クトリ /var/spool/lpd/bamboo
にコピーし, これが DVI
ファイルを印字するジョブであることを記録します.
ホスト rose の
bamboo
用のスプーリングディレクトリに十分な容量が確保でき
次第, 両者の LPD は, ジョブのファイルを rose に転送します. こ
のファイルは, そのすべてが印字されるまで, rose
のキューに留まり
ます. (bamboo は PostScript プリンタなので) DVI から PostScript
への変換は rose でおこなわれます.
ネットワークにおけるデータストリームのインタ
フェースを持つプリンタ
プリンタのネットワークインタフェースカードは, 2種類に分
類することができます. 1つはスプーラをエミュレートするもの
(高価) で, もう 1
つはシリアルやパラレルポートを使うようにプリンタにデー
タを送ることができるだけのもの (安価) です. この節では,
後者の使 い方を説明します. 前者のプリンタは, 前節「
リモートホストに接続されたプリンタ」
の方法が適用できます.
/etc/printcap ファイルでは,
シリアルかパラレルのイン タフェースのどちらを使うのか,
そして, (シリアルインタフェース を使う場合)
そのボーレートはいくらであるか, フロー制御は使うのか,
タブのための遅延を加えるのか,
改行文字を変換するかなどの指定を おこなうことができます.
しかし, TCP/IP や他のネットワークポートか
らデータを受け取るプリンタを接続するための
指定をおこなうことはでき ません.
ネットワーク接続されたプリンタにデータを送るためには,
テキスト フィルタと変換フィルタから呼び出すことができる
通信プログラムを 開発する必要があります. 以下に,
そのようなプログラムの例を示し ます. スクリプト
netprint では, 標準入力から印字データを
すべて受け取り,
ネットワーク接続されたプリンタにこれを送ります.
netprint
の最初の引数でプリンタのホスト名を, 2番目の引数
で接続するポート番号を指定します.
このプログラムでは単方向通信 (FreeBSD からプリンタ)
のみをサポートしていることに注意してくだ さい.
ネットワークプリンタの多くは双方向通信をサポートしていま
すので, その恩恵 (プリンタの状態を得たり,
課金をおこなうなど) にあず かりたいと思われるかもしれません.
#!/usr/bin/perl
#
# netprint - Text filter for printer attached to network
# Installed in /usr/local/libexec/netprint
#
$#ARGV eq 1 || die "Usage: $0 <printer-hostname> <port-number>";
$printer_host = $ARGV[0];
$printer_port = $ARGV[1];
require 'sys/socket.ph';
($ignore, $ignore, $protocol) = getprotobyname('tcp');
($ignore, $ignore, $ignore, $ignore, $address)
= gethostbyname($printer_host);
$sockaddr = pack('S n a4 x8', &AF_INET, $printer_port, $address);
socket(PRINTER, &PF_INET, &SOCK_STREAM, $protocol)
|| die "Can't create TCP/IP stream socket: $!";
connect(PRINTER, $sockaddr) || die "Can't contact $printer_host: $!";
while (<STDIN>) { print PRINTER; }
exit 0;
このスクリプトは,
様々なフィルタが利用することができます. 仮に, Diablo 750-N
ラインプリンタを持っており, これがネットワークに
接続されているとしましょう.
プリンタはポート番号5100にて印字す るデータを受け取ります.
プリンタのホスト名は scrivener としま す. このとき,
このプリンタのテキストフィルタは次のようになりま す.
#!/bin/sh
#
# diablo-if-net - Text filter for Diablo printer `scrivener' listening
# on port 5100. Installed in /usr/local/libexec/diablo-if-net
#
exec /usr/libexec/lpr/lpf "$@" | /usr/local/libexec/netprint scrivener 5100
プリンタの利用に制約を与える
本節では, プリンタの利用に制約を与えるための情報を記して
います. LPD システムでは, プリンタ (ローカル, リモートのいずれ
に接続されていても) にアクセスできる人を制限する機能, 複数部の
コピーの印字の可否を制御する機能, ジョブのサイズの最大値やプリ
ンタキューに入るジョブの最大個数を制御する
機能を提供しています.
複数部のコピーの印字を制限する
LPD
システムではユーザが複数部のコピーの印字を簡単におこなう
機能を提供しています. ユーザが, (例えば) lpr
-#5 コマ ンドを使ってジョブを印字すると,
ジョブのそれぞれのファイルのコ ピーを5部得ることができます.
これがよい機能であると思うかどう
かは人それぞれでしょう.
複数部のコピーの印字によってプリンタが
必要以上に消耗してしまう
と感じるならば, /etc/printcap
ファイルに sc 項
目を加えてください. これにより,
&man.lpr.1; の オプションの使用
が禁止されます. このオプションが指定されているにも関らず,
オプションを使うと,
次のようなメッセージが表示され,
このオプションの利用できない旨を伝えます.
lpr: multiple copies are not allowed
リモートホストからプリンタをアクセスできる
設定にしている場合 (この 設定については, 「
リモートホストに接続されたプリンタ」
をご覧ください), その リモートホストの
/etc/printcap にも同じように
sc
項目を追加する必要があることに注意してください.
そうしないと, ユーザは別なホストから複数部のコピーの
印字することができてしま います.
例を使って説明しましょう. 次に示す
/etc/printcap ファ イルは, ホスト
rose のものです. プリンタ
rattan は極めて 頑丈なので,
複数部のコピーの印字は許可されています. しかし, レー
ザプリンタの bamboo
はもう少しデリケートで, このプリンタ
から複数部のコピーを印字することを sc
項目を追加すること で禁止しています.
#
# /etc/printcap for host rose - restrict multiple copies on bamboo
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
:sh:sd=/var/spool/lpd/rattan:\
:lp=/dev/lpt0:\
:if=/usr/local/libexec/if-simple:
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:sh:sd=/var/spool/lpd/bamboo:sc:\
:lp=/dev/ttyd5:fs#0x82000e1:xs#0x820:rw:\
:if=/usr/local/libexec/psif:\
:df=/usr/local/libexec/psdf:
さらに, orchid の /etc/printcap
にも sc 項目を
追加する必要があります (orchid
でこの編集をおこなっているときに, つ いでに, プリンタ
teak でも複数部のコピーの印字を禁止する
ことにしましょう).
#
# /etc/printcap for host orchid - no multiple copies for local
# printer teak or remote printer bamboo
teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
:lp=/dev/lpt0:sd=/var/spool/lpd/teak:mx#0:sc:\
:if=/usr/local/libexec/ifhp:\
:vf=/usr/local/libexec/vfhp:\
:of=/usr/local/libexec/ofhp:
rattan|line|diablo|lp|Diablo 630 Line Printer:\
:lp=:rm=rose:rp=rattan:sd=/var/spool/lpd/rattan:
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:lp=:rm=rose:rp=bamboo:sd=/var/spool/lpd/bamboo:sc:
sc 項目を指定することにより,
lpr -# の使用を防
ぐことができます. しかし, この状態では
&man.lpr.1; を複数回起動し
たり, 1回のジョブで次のように同じファイルを
複数個指定すること
を防ぐまでには至っていません.
&prompt.user; lpr forsale.sign forsale.sign forsale.sign forsale.sign forsale.sign
このような悪用を防ぐ方法は
(その指示を無視することも含めて) たく さんあります.
各自で調べてみてください.
プリンタを使用できる人を限定する
それぞれのプリンタを使用できる人を限定するには, UNIX の
グループ権限のメカニズムを利用し, さらに,
/etc/printcap で rg
項目を指定することでおこないます.
あるプリンタにアクセスさせてもよいと思うユーザすべてを
UNIXのある グループに入れてください. そして,
そのグループ名を rg で 指定します.
このとき, そのグループに含まれないユーザ
(root も含む) が
rg
の指定がされたプリンタを使用すると, 次のようなメッセー
ジが表示され, プリンタの使用はできません.
lpr: Not a member of the restricted group
sc (suppress multiple copies :
複数部のコピーの印字を禁止
する) を指定するときと同様に, rg
が指定されたプリンタがリ
モートホストからもアクセスでき
(この設定については,
「
リモートホストに接続されたプリンタ」
をご覧ください), かつ, そ
のホストでもプリンタを使用できる人を限定するのが
妥当であると思
う場合は, そのホストの
/etc/printcap にも
rg 指
定をおこなう必要があります.
例えば, プリンタ rattan
は誰でも利用できるが, bamboo はグループ
artists に属している人のみが利用で
きるようにしてみましょう. 以下に, もうお馴染みとなったホスト
rose の /etc/printcap
を示します.
#
# /etc/printcap for host rose - restricted group for bamboo
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
:sh:sd=/var/spool/lpd/rattan:\
:lp=/dev/lpt0:\
:if=/usr/local/libexec/if-simple:
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:sh:sd=/var/spool/lpd/bamboo:sc:rg=artists:\
:lp=/dev/ttyd5:fs#0x82000e1:xs#0x820:rw:\
:if=/usr/local/libexec/psif:\
:df=/usr/local/libexec/psdf:
これ以外の /etc/printcap ファイル
(ホスト orchid のもの)
はそのままにしておくことにします. もちろん,
orchid のユーザは 全員
bamboo を利用することができます. これは,
orchid に
は特定のユーザのみにしかアクセスさせておらず,
そのユーザにはプ
リンタを利用させたいと思っているからなのかもしれませんし,
そう でないかもしれません.
1台のプリンタを複数グループのユーザに利用させること
はできません.
入力可能なジョブのサイズを制限する
たくさんのユーザからプリンタが利用される場合には, 多分,
ユーザが印字要求を出すことができるファイルのサイズに
上限値を置 く必要が生じるでしょう. 結局のところ,
スプーリングディレクトリ
が置かれているファイルシステムの空き容量がその
上限値になる訳で すが,
あるユーザがこれを独占的に使用すること避けるために, 他ユー
ザからのジョブ用の空き容量を確保する必要もあります.
LPD では, mx
項目を指定することにより, ジョブ中の個々のファ
イルのサイズの上限値を制限する機能を提供しています.
指定される ファイルサイズの単位は BUFSIZ ブロックで, 1
BUFSIZ ブロックは 1024バイトを表わします. この mx 項目の値として0が指定される と,
ファイルサイズの制限はなくなります.
この制限はジョブ中の各
ファイルに対して適用されるものであり,
ジョブ全体のサイズ
を制限するものではありません.
ところで,
プリンタに設定された上限値を超えるファイルサイズのファ
イルが入力された場合でも, LPD はこれを拒否しません. その代わ
りに, このファイルは,
その先頭から上限値のファイルサイズまでし
かキューに入れられません. そして, その部分までが印字され,
残り の部分は捨てられます.
これが正しい動作といえるのかどうかは議
論の余地があるところです.
それでは, 設定例に登場しているプリンタ
rattan と bamboo
の印字可能なファイルサイズに制限を加えてみましょう. artists
グループの人達が作る PostScript ファイルのサイズは
巨大になる傾向があるので, 上限値を5Mバイトとします.
それから,
プレインテキスト用のラインプリンタは無制限とします.
#
# /etc/printcap for host rose
#
#
# No limit on job size:
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
:sh:sd=/var/spool/lpd/rattan:\
:lp=/dev/lpt0:\
:if=/usr/local/libexec/if-simple:
#
# Limit of five megabytes:
#
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:sh:sd=/var/spool/lpd/bamboo:sc:rg=artists:mx#5000:\
:lp=/dev/ttyd5:fs#0x82000e1:xs#0x820:rw:\
:if=/usr/local/libexec/psif:\
:df=/usr/local/libexec/psdf:
この場合もそうですが, この制限はローカル (ホスト rose)
のユーザ のみに適用されます.
リモートホストからプリンタを利用できるよう
に設定している場合は,
そのリモートホストのユーザはこの制限を受 けません.
これらのユーザにも制限を加える場合は, リモートホスト の
/etc/printcap の mx
を指定する必要があります.
リモートホストから印字するための詳しい情報については,
「
リモートホストに接続されたプリンタ」
を参照してください.
リモートホストに接続されたプリンタへのジョブの
サイズを制限する 特別な方法は他にもあります. これについては,
「
リモートホストからのプリンタの利用を制限する」
を参照してください.
リモートホストからのプリンタの利用を制限する
LPD スプーリングシステムでは, リモートホストから要求され
たジョブの印字を制限するための方法がいくつか
提供されています.
ホストの制限
ローカルの LPD
が印字要求を受け付けるリモートホストは, ファイル
/etc/hosts.equiv と
/etc/hosts.lpd
によって制御することができます. LPD では,
あるホストから印字の要求がきたとき, このホス
トの名前がこれら2つのファイルのどちらかに含まれている
かどうかを調べます. これが含まれていない場合は, LPD
はこの要求を拒否します.
これらのファイルの形式は単純です.
各行にホストの名前を
1つずつ書いていきます. ファイル
/etc/hosts.equiv の方は
&man.ruserok.3; プロトコル
でも利用され, &man.rsh.1; や &man.rcp.1;
といったプログラム
の動作に影響するので注意が必要です.
/etc/hosts.equiv
の記述は慎重におこないましょう.
例として, 以下にホスト rose の
/etc/hosts.lpd を示します.
orchid
violet
madrigal.fishbaum.de
この例では, rose はホスト
orchid, violet,
そして madrigal.fishbaum.de
からの要求を受け付けることになり ます.
その他のホストが rose の LPD
にアクセスしようと しても, LPD はこれを拒否します
(訳注:拒否されるのは, そのホストが
/etc/hosts.equiv にも含まれてい
ない場合です).
サイズの制限
スプーリングディレクトリがある
ファイルシステムに残して
おく必要がある空き容量の大きさを制御することが
できます.
ローカルプリンタ用のスプーリングディレクトリに
minfree
という名前のファイルを作成します. そして,
そのファイルの中にリモートホストからのジョブの要求を受
け付けるために必要な空き容量のディスクブロックサイズ
(1 ディスクブロック=512バイト) を記します.
これで,
リモートホストのユーザにファイルシステムを満杯
にされないことが保証されます. この機能を使うと, ローカ
ルホストのユーザに対してある種の優先権を与えることもで
きます. ローカルホストのユーザは,
minfree ファイ
ルで指定された値よりもディスクの空き容量が下回った後で
もずっと,
ジョブをキューに入れることができるのです.
例えば, プリンタ bamboo 用の
minfree を作っ てみましょう.
このプリンタのスプーリングディレクトリを 調べるために,
/etc/printcap を調べてみましょ
う. 以下に, bamboo
のエントリ部分を示します.
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:sh:sd=/var/spool/lpd/bamboo:sc:rg=artists:mx#5000:\
:lp=/dev/ttyd5:fs#0x82000e1:xs#0x820:rw:mx#5000:\
:if=/usr/local/libexec/psif:\
:df=/usr/local/libexec/psdf:
スプーリングディレクトリは
sd で指定されます. LPD
がリモートホストからのジョブを受け付けるために必要
なファイルシステムの空き容量を3Mバイト
(=6144ディスクブ ロック) にすることにしましょう.
&prompt.root; echo 6144 > /var/spool/lpd/bamboo/minfree
利用ユーザの制限
/etc/printcap の
rs 項目を指定することで,
ローカルプリンタを利用できるリモートホストのユーザを制
限することができます. ローカルホストに接続されたプリン
タ用のエントリに rs
項目が指定されている場合, LPD
は印字を要求したユーザのアカウントと同じログイン名
がローカルホストに登録されている/em/場合に限り/, その
ジョブが受け付けられます. そうでないユーザからのジョブ
は LPD は拒否します.
この機能は, (例えば)
複数の部署がネットワークを共有して おり,
この内のあるユーザが部署の境界を越えて活動してい
る場合には特に有用です. そのようなユーザに対して, シス
テムのアカウントを与えるだけで, これらのユーザは自分が
所属する部署のシステムからそのシステムに接続されている
プリンタを使用することができます. これらのユーザにはむ
しろ, プリンタの使用だけを認め,
その他のコンピュー タ資源を利用させたくないときは,
それらのユーザにはホー ムディレクトリを与えず,
ログインシェルはシェルとしては 何の役にも立たない
/usr/bin/false などを指定 して,
これらのユーザのアカウントはプリンタ用の“形式的
な”ものとします.
プリンタの利用に対する課金
という訳で, 印字するためには料金をとることが必要です. 取ら
ない理由などありましょうか. 紙やインクにはお金がかかります. そ
して, プリンタの維持費もかかります. プリンタには可動部分が搭載
されており, これらの部分は壊れやすいという傾向があります. プリ
ンタや, その利用形態, 維持費について調査をし, 1ページ (1フィー
ト, 1メートルなど) 当たりにかかるコストを調べておいてください.
これに基づき, プリンタの利用に対する課金を, 実際に, どのように
始めればよいのでしょうか.
さて, 残念ながら, この部分に関しては LPD
スプーリングシステム はほとんど役に立ちません.
課金は使用しているプリンタの種類, 印
字するもののファイルの形式,
プリンタの利用に対する課金での
あなた自身の要求に大きく左右されます.
課金システムを実現するためには, プリンタのテキストフィルタ
(プ レインテキストのジョブに対して課金するため) と変換フィルタ
(その 他のファイル形式に対して課金するため) を変更して,
印字したペー ジを数えたり,
プリンタに印字したページ数を取得するための要求を
送る必要があります. ただし, 出力フィルタのみを利用している場合
は, 課金をおこなうことができません. フィルタに関しては,
「
フィルタ」をご覧く ださい.
一般に, 課金方式には次の2つがあります.
定期的に課金する方法
はよく利用される方法です. この理由は, 恐らく,
比較的簡単に実現できるからです. 誰
かがジョブを印字する度に, フィルタはそのユーザ名, ホス
ト名, 印字したページ数を課金データファイルに記録します.
毎月, 毎学期, 毎年, あるいは, お好みの時期に, 様々なプ
リンタの課金用ファイルを集め, それぞれのユーザが印字し
たページ数を合計し, その分の課金をおこないます. 次回の課金
時期のためのデータを0にして課金を再開するために, この
処理をおこなった後, すべてのログファイルを削除し,
利用毎に課金する方法
はあまり利用されていません. これは,
実現するのが比較的難しいからです. この方式では,
プリンタを使用したらすぐに, フィルタがユーザにその利用
に対する課金をおこないます. ディスククオータのように, 課金
作業は瞬時におこなわれます. この方式では, ユーザのアカウン
トが赤字になる場合に, ユーザが印字をおこなうことを拒否する
ことができます. また, ユーザに“プリンタ版
quota”を 調べたり,
調整したりする方法を提供したいと思うかもしれ ません.
これを実現するためには, ユーザとその quota を
追跡するために, あるデータベース用のコードが必要となり
ます.
LPD スプーリングシステムでは, 両方式を簡単にですがサポー
トしています. これは, (ほとんどの場合で) 印字作業をフィ
ルタがおこなっていたように, 課金作業もこのためのコードも用
意することで実現されています. しかし, 明るい面もありま す.
それは, 課金方式に関して, 非常に大きな柔軟性が与え
られたということです. 例えば, 「定期的に課金する方法」 か,
「利用毎に課金する方法」のどちらかを選びまず, そし て,
どんな情報 (ユーザ名, ホスト名, ジョブのタイプ, 印
字された頁数, 使用した紙の大きさ, 印字をするために要した
時間など) をログに記録するかを決めます. 以上のことをおこな
うには, 上記の情報を保持するために, フィルタを変更しな
くてはなりません.
手軽なプリンタ課金方法
FreeBSD には, 「定期的に課金する方法」による課金をすぐに
設定できるように, 2個のプログラムを添付しています. そ
の内の1つはテキストフィルタ lpf で,
これについて
は, 「
テキストフィルタ lpf」をご覧ください. もう1つは,
&man.pac.8; で,
これはプリンタの課金データファイルからのエントリを集め,
これを合計するプログラムです.
「
フィルタはどのように機能しているか」で述べたように,
LPD では テキストフィルタや変換フィルタを起動しますが,
そのコマ
ンドラインで使用している課金データファイルの名前が指定
されます. 両フィルタはこの引数を使って, どの課金データ
ファイルのエントリに書き込めばよいのかを知ることができ ます.
このファイルの名前は /etc/printcap 中の
af 項目によって指定されます.
このファイルが絶対パ スで指定されない場合は,
スプーリングディレクトリからの
相対パスとして扱われます.
LPD は, 紙のページの幅と行数 (pw と
pl 項目で 指定される) を引数として
lpf を起動します. lpf
では, 何ページ印字したかを決定するためにこれ
らの引数を使用します. ファイルをプリンタに送った後, 課
金情報を課金データファイルに書き込みます. このファイル
は次のようになります.
2.00 rose:andy
3.00 rose:kelly
3.00 orchid:mary
5.00 orchid:mary
2.00 orchid:zhang
課金データファイルはプリンタ毎に分けて作るべきです. こ
れは, lpf
にはデータファイルをロックする機構が組
み込まれていないためです. したがって, lpf
が2つ起動 されたとき,
同じファイルに同時に書き込みをおこなった場合,
お互いのエントリが破壊されてしまうかもしれません. 課金
用ファイルを各プリンタ毎に確実に分けるには,
/etc/printcap 中の
af=acct 項目を使いま す.
プリンタの利用に対してユーザに課金する準備ができたら,
スプーリングディレクトリに移動した後,
&man.pac.8; と入力
してください. 次のような, ドル中心主義の課金リストが表
示されます(訳注:ドル中心主義という表現は, 表示がドルで
出ることへの著者の皮肉でしょう. セントがあるので小数点
以下が表示されますが, この機能も日本では邪魔ですね).
Login pages/feet runs price
orchid:kelly 5.00 1 $ 0.10
orchid:mary 31.00 3 $ 0.62
orchid:zhang 9.00 1 $ 0.18
rose:andy 2.00 1 $ 0.04
rose:kelly 177.00 104 $ 3.54
rose:mary 87.00 32 $ 1.74
rose:root 26.00 12 $ 0.52
total 337.00 154 $ 6.74
&man.pac.8; が受け付ける引数には
次のようなものがあります.
プリンタ printer
の利用に対する課金リストを作成し ます.
このオプションは, /etc/printcap
の af
が絶対パスで指定されていた場合に限り, 動作しま
す.
ユーザ名のアルファベット順ではなく,
課金額の低い順にリ ストを並べます.
課金データファイルにあるホスト名を無視します.
このオプショ ンを使用すると, ホスト
alpha のユーザ
smith とホスト
gamma のユーザ
smith は同一人物として扱われます.
この オプションが指定されない場合は,
両者は別なユーザとして 扱います.
/etc/printcap の
pc 項目で指定された値, または,
デフォルトの値 (2セント) に代わり, 紙1ページ, ま たは,
1フィート当たりの価格を指定します.
price として,
浮動小数点数を指定することができます.
リストの並べる順番を逆順にします.
課金リストを作成し,
課金データファイルを削除します.
name …
ユーザ names
に対する課金情報のみを表示します.
&man.pac.8; が生成するデフォルトのリストには,
各ホストのユーザ別
に印字ページ数が表示されます.
(ユーザがサイト内のすべてのホスト
を使用できるため) ホスト名の情報が意味を持たない場合,
pac -m
を実行してください. 次のようなリストが得られます.
Login pages/feet runs price
andy 2.00 1 $ 0.04
kelly 182.00 105 $ 3.64
mary 118.00 35 $ 2.36
root 26.00 12 $ 0.52
zhang 9.00 1 $ 0.18
total 337.00 154 $ 6.74
課金額を決めるために,
&man.pac.8; は /etc/printcap ファ
イルの pc
項目で指定された値 (デフォルト値は200, すなわち1
ページ当たり2セント)
を使います. この項目で, 印字物に課金したい
と思う1ページ当たり,
または, 1フィート当たりの価格を100分の1セ
ント単位で指定します.
&man.pac.8; を オプション付きで起動
すると, この値を置き換えることができます.
この オプショ
ンで指定する額の単位は,
100分の1セント単位ではなく, ドル単位で
す. 例えば, 次の指定では,
1ページ当たりの単価が1ドル50セントに
なります.
&prompt.root; pac -p1.50
このオプションを使うと,
実際の課金額を集計することができます.
最後に, pac -s
を起動すると, 課金情報は課金データ累計ファ
イルに保存されます.
このファイルの名前は, プリンタの課金データ
ファイルの後ろに
_sum を付けたものとなります. そして, 課
金データファイルは削除されます. 次に
&man.pac.8; が起動されると,
その時点までの累計金額を得るために,
課金データ累計ファイルが読
み込まれ, 通常の課金データファイルからの情報に
加算されます.
印字されたページ数をどのように数えるか?
課金を, リモートホストからの印字でさえも,
正確におこなうため には,
ジョブで使用された紙が何ページであるかを特定でき
る必要があります. このことは, プリンタ利用に対する課金
をおこなう上の根本的な問題です.
プレインテキストのジョブの場合, 問題を解決するのはさほ
ど難しくはありません. ジョブが何行であったかを数え, プ
リンタがサポートしている紙1ページに印字できる最大の行
数と比較すればよいのです. 重ね打ちするために利用される
ファイル中のバックスペース文字や, 物理的に複数の行に渡
る長い論理行に対する取り扱いを
忘れずにおこなってください.
(「テキストフィ,ルタ
lpf」で紹介した) テキストフィルタ
lpf では, 課金をおこなうときに,
これらの取り扱いをおこなってくれます. 課
金をおこなうために必要なテキストフィルタを作成している方は,
lpf
のソースコードが参考になるでしょう.
これに対して, 他のファイル形式の処理はどのようにすれば
よいのでしょうか.
まず, DVI から LaserJet, または, DVI から PostScript
への変換の場合, フィルタが dvilj や
dvips の 出力メッセージを解析することで,
何ページ分の変換がおこなわ れたかを知ることができます.
他のファイル形式とその変換 プログラムに関しても,
同様のことができるかもしれません.
しかし, この方式には問題点があります. それは, 変換され
たページがすべて印字されるとは限らないということです. 例
えば, プリンタが紙詰まりを起こしたり, トナー切れになっ たり,
はたまた, 爆発したりするかもしれません. そのよう
な状況により印字が途中で中止されたとしても, この方式で は,
ユーザは全ページ分の料金を課されてしまうのです.
それでは, どのような対策をたてることができるのでしょう
か.
正確な
課金をおこなうための唯一の確実な方法は,
何 ページ印字したのかを知らせることができるプリンタを入手
し, これをシリアルポートかネットワークに接続することで す.
ほとんどすべての PostScript プリンタではこの概念
がサポートされています. 他のプリンタも同様です (Imagen
レーザプリンタをネットワーク接続するなど). それぞれの
プリンタのフィルタを, ジョブを印字した後で印字ページ数
を得るように, 変更してください. そして, 課金情報はここ
で得られた値のみに
基づいて記録してください. 行数 を数えたり,
エラーが生じやすいファイルの調査は必要とさ れません.
もちろん, 気前よく印字料
金をすべて無料にすることもできます.
標準スプーラの代替品
このマニュアルを最初から通読されている方ならば, ここまでで,
FreeBSD 付属の LPD スプーリングシステムに関して知っておくべき
ことすべてを学ばれたことと思います. 多分, このシステムに
あるたくさんの欠点について認識できたことでしょう. すると,
“(FreeBSD 上で動作する)
スプーリングシステムには他にどのような
ものがあるのか”という疑問が自然と湧いてきます.
残念ながら, 著者は代替のスプーラを 2つ
だけしか探し出すこと ができませんでした. そして,
それぞれはほとんど同一のものです. 以下に,
両システムの紹介をおこないます.
PLP (Portable Line Printer スプーリングシステム)
PLP は Patrick Powell によって開発されたソフトウエアを
ベースにされており, インタネット規模のグループの開発者
によって管理されていました. このソフトの主要サイトは「
ftp://ftp.iona.ie/pub/plp」です.
「
web page」にもあります.
PLP は BSD LPD スプーラと極めて似ていますが, 以下のも
のを含むホストの機能が自慢です.
ネットワークサポートの強化. ネットワーク接続され
るプリンタのサポートや NIS で管理可能な printcap ファ
イル, NFS マウントされるスプーリングディレクトリの機
能が組み込まれています.
洗練されたなキュー管理. 1つのキューで複数のプリン
タに対応可能. キュー間でジョブを転送したり, キューのリ
ダイレクトができます.
リモートプリンタの制御機能
ジョブの優先順位付け
拡張性のあるセキュリティとアクセスオプション
LPRng
LPRng は, その称するところの意味は“LPR: the Next
Generation”ですが, PLP を完全に書き換えたものになっ
ています. Patrick Powell と Justin Mason (PLP の主要
なの管理者) の共同で LPRng が作成されました. LPRng の
主要サイトは「
ftp://dickory.sdsu.edu/pub/LPRng」です.
謝辞
このドキュメントの開発の手助けをして頂いた以下の方々に感謝の
意を表わしたいと思います.
Daniel Eischen deischen@iworks.interworks.org
精読するためのあり余るほどの HP 用フィルタを提供してく
れたことに.
&a.jehamby;
提供して頂いた Ghostscript から HP
へのフィルタに.
私の妻, Mary Kelly urquhart@argyre.colorado.edu
彼女と一緒にいるよりもずっと長い時間を FreeBSD のため
に費やすことを許してくれたことに.
diff --git a/ja_JP.eucJP/books/porter-handbook/book.sgml b/ja_JP.eucJP/books/porter-handbook/book.sgml
index f27bce571b..174077de86 100644
--- a/ja_JP.eucJP/books/porter-handbook/book.sgml
+++ b/ja_JP.eucJP/books/porter-handbook/book.sgml
@@ -1,5233 +1,5233 @@
アプリケーションのインストール : ports コレクション
原作: &a.jraynard;.
訳: &a.jp.masaki;, &a.jp.saeki;.
11 November 1996.
FreeBSD の ports コレクションを利用すると, 最小限の労力で
非常に幅広くのアプリケーションのコンパイルとインストールがおこなえます.
やってみたことのある方はよくご存知でしょうが,
オープンな規格とは 全くの誇大広告であって,
あるプログラムを異なるバージョンの Unix 上で
動作させることは退屈で手間のかかる仕事です.
求めているプログラムが自分のシステムでうまくコンパイルでき,
正しいところにインストールできて,
完璧に動作するとしたらとてもラッキーです. しかし,
あいにくこれは滅多にないことなのです.
ほとんどのプログラムについて,
あなたは髪を掻きむしることになるでしょうし,
かなりのプログラムでは, 白髪混じりの頭になってしまったり,
あるいは慢性の 脱毛症にすら なってしまうかもしれません...
いくつかのソフトウェアディストリビューションでは,
設定用のスクリプトを
配布することでこの問題を解決しようとしています.
これらのスクリプトの中には非常に精巧なものもありますが,
残念ながら, 中にはこれまで
聞いたこともないようなシステムの名前をしゃあしゃあと
言い放ったうえに, まるでシステムレベルの Unix
プログラミングに関する 最終試験のような,
たくさんの質問をしてくる場合があります. (例えば,
このシステムの gethitlist 関数は fromboz への const
ポインタを 返しますか? それとも const fromboz
へのポインタを返しますか?, このシステムには
Foonix スタイルの, 容認できない例外処理をおこなう
ルーチンがありますか? もしもないとしたら,
それはなぜですか?)
幸いなことに, ports コレクションがあれば,
これらのきつい作業はすべて 完了しています. make
install とタイプするだけで, 動作するプログラムを
入手することができるのです.
なぜ ports コレクションを作ったのか?
FreeBSD の基本システムは,
非常に多くのツールやユーティリティから 構成されています. しかし,
よく使われるプログラムのうち多くのものが,
この基本システムには含まれていません. その理由は:-
ある Lisp ベースのエディタのように,
それがないと生きていけないと 言う人もいれば,
ディスクの無駄だと言う人もいるようなプログラム.
基本システムに組み込むには特殊すぎるプログラム. (CAD
やデータベースなど.)
“時間のある時に,
ちょっと見ておかなければ”というような類の,
それがシステムに含まれていないことが
致命的とは言えないプログラム. (おそらく,
何らかの言語などでしょう.)
FreeBSD
のような真面目なオペレーティングシステムの一部として
供給するには遊びが過ぎるようなプログラム. ;-)
たくさんのプログラムを基本システムに組み込んだとしても,
もっともっと 組み込みたいという要求が出てくるので,
どこかで制限を引かなくてはならないため. (そうしなければ
FreeBSD の配布物は,
とてつもなく膨大になってしまうでしょう.)
すべての人が自分のお気に入りの
プログラムを手作業で移植しなければ ならないとしたら,
(途方もない膨大な作業の繰り返しをさておいたとしても)
それは明らかに不合理な話です. そこで, FreeBSD プロジェクトでは,
標準のツールを使って移植のプロセスを
自動化する巧妙な方法を考え出しました.
なお,
これは単純ながら非常に柔軟なツールを組み合わせることで,
非常に強力な働きをさせるという“Unix
流”の作業の優れた実例です.
ports コレクションはどのように動くのでしょうか?
インターネットでは通常, tarball の形で
プログラムが配布されています. これは, Makefile
とソースコードで構成され, 普通は何らかの説明書 (あいにく,
いつもわかりやすく書かれているとは 限りませんが)
が付属しています. ことによるとコンフィグレーションスクリプトも
含まれているかもしれません.
標準的な手順では, FTP で tarball を入手して,
適当なディレクトリで展開します. 次に説明書を読んで,
必要な変更をおこないます. そして, 設定スクリプトを実行し, 標準の
make
コマンドを使ってソースのコンパイルとインストールを
おこないます.
FreeBSD の ports も tarball の仕組みを利用していますが,
これはユーザが 苦労して作業することを期待したものではなく,
どのようにすれば FreeBSD 上で
そのプログラムが動くようになるかという「ノウハウ」を スケルトン
を使用して収めているものです. スケルトンは, カスタマイズ済みの
Makefile も
提供していますので, ほとんどすべての ports
は同じ手順でインストールすることが できます.
もしあなたが (あなたの
FreeBSD システム または
FTP サイト にある) ports スケルトンを見ていて,
そこに潜んでいる あらゆる種類の先端的な
ロケット工学的なものを見つけられると期待していると,
つまらなそうなファイルやディレクトリがそこにあるだけなのを見て,
がっかりするかもしれません.
(ports を手に入れる方法については, すぐに
FreeBSD ports コレクションの入手方法
の節でお話します.)
“一体どうしたらいいんだ? ここにはソースコードが
ないじゃないか?”
というあなたの叫びが聞こえるようです.
心配いりません. おとなしく読んでいけば, すべてが (たぶん)
明らかに なるでしょう. 試しに ports をインストールして,
何が起きるのかを見てみましょう.
ここではサンプルとして開発者向けの便利なツール,
ElectricFence を選択します.
このスケルトンを選んだ理由は, 他の ports
に比べても素直で理解しやすく 書かれているからです.
自宅で試してみる場合には, root
になる必要があるでしょう.
&prompt.root; cd /usr/ports/devel/ElectricFence
&prompt.root; make install
>> Checksum OK for ElectricFence-2.0.5.tar.gz.
===> Extracting for ElectricFence-2.0.5
===> Patching for ElectricFence-2.0.5
===> Applying FreeBSD patches for ElectricFence-2.0.5
===> Configuring for ElectricFence-2.0.5
===> Building for ElectricFence-2.0.5
[大量のメッセージをコンパイラが出力します...]
===> Installing for ElectricFence-2.0.5
===> Warning: your umask is "0002".
If this is not desired, set it to an appropriate value
and install this port again by ``make reinstall''.
install -c -o bin -g bin -m 444 /usr/ports/devel/ElectricFence/work/ElectricFence-2.0.5/libefence.a /usr/local/lib
install -c -o bin -g bin -m 444 /usr/ports/devel/ElectricFence/work/ElectricFence-2.0.5/libefence.3 /usr/local/man/man3
===> Compressing manual pages for ElectricFence-2.0.5
===> Registering installation for ElectricFence-2.0.5
ここではあなたが混乱しないように, コンパイル時の出力を
すべて取り除いてあります.
もしもあなた自身で実行されたら, 最初にこのような
出力結果が得られるはずです:-
&prompt.root; make install
>> ElectricFence-2.0.5.tar.gz doesn't seem to exist on this system.
>> Attempting to fetch from ftp://ftp.doc.ic.ac.uk/Mirrors/sunsite.unc.edu/pub/Linux/devel/lang/c/.
make プログラムは,
あなたの手元にソースコードがないことを検出し,
処理を続けられるようにソースを FTP でダウンロードしようとします.
この例では, あらかじめ手動でソースコードを用意してあったので,
持ってくる必要はありませんでした.
では, 続けて make
プログラムが何をしているのか見てみましょう.
ソースコード tarball のありかを
確認します. 手元にファイルが存在しなければ, FTP
サイトから入手しようとします.
チェックサム
テストを実行して, その tarball
が事故か何かで途中で切れていたり, ASCII モードで
ダウンロードされていたり,
転送中にニュートリノによって傷められたりして
改変されたりしていないかどうかを確認します.
tarball を一時的な作業用ディレクトリに展開します.
FreeBSD 上でコンパイルしたり, 動作させるのに必要な
すべての パッチ
をソースコードに当てます.
構築のために必要な
コンフィグレーションスクリプトを実行します.
コンフィグレーションスクリプトの
質問には正確に答えてください.
(いよいよ!) ソースコードをコンパイルします.
実行形式のプログラム, マニュアル,
その他のサポートファイルを,
システムのプログラムと混ざってしまわないように
/usr/local 以下に インストールします.
ports はすべて同じ場所にインストールされ,
システムのあちこちにばらまかれることはありません.
インストール結果はデータベースに登録されます.
これにより,
インストールしたプログラムがもしも気に入らなかったときも,
システムから すべての痕跡をきれいに 消去
することができます.
以上のステップが make
の出力と一致しているかどうか確認してください.
今まで確認していなかったのなら,
今からするようにしてください!
FreeBSD ports コレクションの入手
あるプログラムの FreeBSD port
を入手するには二つの方法があります. ひとつは FreeBSD CD-ROM を使う方法で,
もうひとつは インターネット接続
を使う方法です.
CD-ROM からコンパイルする
FreeBSD CD-ROM がドライブに入っており,
/cdrom にマウントされていると仮定すると
(マウントポイントが /cdrom
である必要があります), ただ普通に実行するだけで ports
を構築できるようになり, tarball
をネットワーク経由でダウンロードするのではなく
/cdrom/ports/distfiles/
からさがすようになります (そこにあればの話ですが).
CD-ROM にある port スケルトンを使いたければ, 他に
/etc/make.conf の
変数を以下のようにセットする方法があります:
PORTSDIR= /cdrom/ports
DISTDIR= /tmp/distfiles
WRKDIRPREFIX= /tmp
(任意の十分な空きスペースの場所を /tmp
とおいています).
次に, /cdrom/ports 下の適宜のサブディレクトリに
cd して, 例のごとく
make install とタイプします.
WRKDIRPREFIX は port に
/tmp/cdrom/ports の下でビルドさせようとします;
例えば, games/oneko は
/tmp/cdrom/ports/games/oneko の下で
ビルドされるでしょう.
ライセンスの制限により, いくつかの ports
でオリジナルのソースコードを CD-ROM
に入れることができなかったものがあることに注意してください.
この場合, インターネット経由で
ports をコンパイルする の
節を参照してください.
インターネット経由で ports をコンパイルする
CD-ROM を持っていなかったり, その ports
の最新バージョンを確実に入手したい 場合は, その ports の スケルトン を
ダウンロードする必要があります. ところで, これは落し穴が
たくさんある作業に見えるかもしれませんが,
実際には非常に簡単です.
初めに, あなたの動かしている FreeBSD
がリリースバージョンなら ports ページ
でその FreeBSD 用の “アップグレードキット”
を手にいれてください. このパッケージには, 最新の ports
をコンパイルするのに必要な,
リリース以降に更新されたファイルが含まれています.
FreeBSD の FTP サーバーがその場で tarball
を作成できることを利用してスケルトンを入手すると
非常に便利です. ここでは例として databases ディレクトリにある
gnats プログラムを使って説明します.
(角型かっこの中の文はコメントなので, 実際に実行する場合には,
これをタイプしないでください!):-
&prompt.root; cd /usr/ports
&prompt.root; mkdir databases
&prompt.root; cd databases
&prompt.root; ftp ftp.freebsd.org
[ユーザ名 `ftp' でログインし, パスワードを要求されたら, あなたの電子メール
アドレスを入力してください. バイナリモードを (イメージモードと呼ばれることも
あります) 使うのをお忘れなく!]
> cd /pub/FreeBSD/ports/ports/databases
> get gnats.tar
[gnats スケルトンの tarballs を取得]
> quit
&prompt.root; tar xf gnats.tar
[gnats スケルトンの展開]
&prompt.root; cd gnats
&prompt.root; make install
[gnats の構築とインストール]
さて何が起きるでしょうか? FTP
サイトにいつも通りに接続して, データベースの
サブディレクトリに移動します. get gnats.tar
とコマンドを入力すると, FTP サイトでは gnats ディレクトリを
tarred
にしてくれるのです.
gnats スケルトンを展開したら, gnats ディレクトリへ移動して
ports を構築します. すでに
説明したように, make の過程で
手元にソースコードがないことを検出すると,
ソースコードを取得してから 展開し,
パッチ当てと構築をおこないます.
それでは, 少し冒険をしてみましょう. 一つの ports
スケルトンを 取得するかわりに, たとえば ports
コレクションの中のデータベースの スケルトンをすべて,
サブディレクトリ全体を取得してみましょう.
やり方はほとんど同じです:-
&prompt.root; cd /usr/ports
&prompt.root; ftp ftp.freebsd.org
[ユーザ名 `ftp' でログインし, パスワードを要求されたら, あなたの電子メール
アドレスを入力してください. バイナリモードを (イメージモードと呼ばれることも
あります) 使うのをお忘れなく!]
> cd /pub/FreeBSD/ports/ports
> get databases.tar [データベースディレクトリの tarballs を取得]
> quit
&prompt.root; tar xf databases.tar [すべてのスケルトンを展開]
&prompt.root; cd databases
&prompt.root; make install [データベース ports 全部の構築とインストール]
わずかばかりの簡単なコマンドで, この FreeBSD
マシン上にデータベース
プログラムを一揃い手に入れてしまいました! 一つの ports
スケルトンを取ってきて それを構築する場合との違いは,
すべてのディレクトリを一度に取得して,
全部を一度にコンパイルしたということだけです.
かなり感動的だと思いませんか?
たくさんの ports をインストールする つもりなら,
おそらくすべての ports ディレクトリをダウンロードしておく
価値があるでしょう.
スケルトン
スケルトン (訳注: skeleton とは骸骨のことです) とは,
締め切りを守るため, 食事をするのを忘れるほど仕事にのめり込んだ
ハッカーたちのなれの果ての ことでしょうか? FreeBSD
の屋根裏に潜む, なにか気持ちの悪いものでしょうか? いいえ,
ここでスケルトンの意味するところは, ports の魔術を実現するのに
必要とされるすべてのものを提供する最小の骨組みのことです.
Makefile
スケルトンのもっとも重要な要素は Makefile です. Makefile
は ports を どのようにコンパイルし,
インストールをおこなうかを指示する
いろいろな命令を含んでいます. 以下に ElectricFence の Makefile
を示します:-
# New ports collection makefile for: Electric Fence
# Version required: 2.0.5
# Date created: 13 November 1997
# Whom: jraynard
#
# $Id$
#
DISTNAME= ElectricFence-2.0.5
CATEGORIES= devel
MASTER_SITES= ${MASTER_SITE_SUNSITE}
MASTER_SITE_SUBDIR= devel/lang/c
MAINTAINER= jraynard@freebsd.org
MAN3= libefence.3
do-install:
${INSTALL_DATA} ${WRKSRC}/libefence.a ${PREFIX}/lib
${INSTALL_MAN} ${WRKSRC}/libefence.3 ${PREFIX}/man/man3
.include <bsd.port.mk>
"#" で始まる行は, 人間のためのコメント行です.
(ほとんどの Unix のスクリプトと同じですね.)
DISTNAME は tarball
の名前から拡張子を取ったものです.
CATEGORIES
はこのプログラムの種類を示します. この場合,
開発者向けのユーティリティということになります.
完全なリストはこのハンドブックの カテゴリ
をみてください.
MASTER_SITES はマスタ FTP サイトの URL
です. もしローカルシステムに tarball がない場合には,
ここから取得します. これは信頼できると考えられているサイトで,
通常はそのプログラムを
インターネット上で公式に配布しているサイトです.
(そのソフトウェアがインターネット上で「公式に」
配布されているとしたら)
MAINTAINER は,
例えば新しいバージョンのプログラムが出た場合に, 必要であれば
スケルトンの更新をおこなう保守担当者の
電子メールアドレスです.
次の数行はとりあえず飛ばします.
.include <bsd.port.mk>
この行は, この ports に必要なその他の命令やコマンドは
bsd.port.mk に
入っているということを示しています.
これらはすべての ports で共通のものなので,
それぞれの Makefile に書いておく必要はありません.
そのため単一の標準ファイルに
まとめられているのです.
ここでは Makefile
がどう働くかを詳細に調査するのが目的ではありませんので,
MAN3 で始まる行は, インストールの後に
ElectricFence のマニュアルを 圧縮するために使用される,
と言っておくだけで充分でしょう. これにより,
貴重なディスクスペースが保護されているわけです. オリジナルの
port では install
ターゲットが用意されていないので,
do-install からの 3 行が この ports
によって生成されたファイルを
正しい場所に置くために使用されます.
files ディレクトリ
ports のチェックサム算出には MD5
アルゴリズムを使用しているので, この チェックサム を含んでいる
ファイルは md5 と呼ばれます.
ちょっと混乱するかもしれませんが, このファイルは
files という
名前のディレクトリに置かれています.
このディレクトリは, ports に必要だけれども,
他のどこにも属さない 雑多なファイルも含んでいます.
patches ディレクトリ
このディレクトリには, FreeBSD
ですべてを正常に動作させるのに 必要な パッチ が含まれています.
pkg ディレクトリ
このディレクトリには,
非常に役立つ三つのファイルが含まれています:-
COMMENT —
プログラムについての 1 行の説明.
DESCR — より詳細な説明.
PLIST —
プログラムのインストール時に作成される,
すべてのファイルのリスト.
ports が動かないのですが, どうしたらよいでしょう
おやおや. では, 次の四つのどれかをやってみてください:
自分で修正する. ports
の仕組みに関する技術的な詳細については,
アプリケーションの移殖方法をご覧ください.
苦情をいう. これは電子メールで だけ
にしてください! このようなメールの宛先は &a.ports; です.
なお, 必ず port の名前やバージョン, その port のソースや
distfile(s) を どこから入手したか,
どんなエラーが発生したのかを書いておいてください.
忘れてしまう. これはほとんどの場合最も簡単な方法です.
ports
のプログラムのうち必要不可欠な物はごくわずかです.
FTP サイトからコンパイル済みのパッケージを入手する.
“マスター”パッケージコレクションは FreeBSD の
FTP サイトの
パッケージディレクトリ に置いてありますが,
まずあなたの近くのローカルミラーサイトを確認してください!
ソースからのコンパイルに挑戦するよりも,
パッケージを使うほうが (全体的に見て)
ずっと確実に動作するでしょうし,
より手っ取り早い方法でもあります.
システムにパッケージをインストールするには, &man.pkg.add.1;
を使ってください.
質問と回答集
Q. 私はモデムについての議論を
しているのかと思っていました??!
A.なるほど, あなたはきっとコンピュータの背面についている
シリアルポートのことだと思ってしまったのでしょう.
あるバージョンの Unixから別のバージョンの Unix
へとプログラムを 移殖することを “porting”
というのですが, ここで我たちは “porting” の結果
という意味で “port” を使っています.
(コンピュータに関わる人々の悪しき習慣として,
ひとつの同じ言葉を複数の
まったく違う意味として使うことがあるのです.)
Q. 私は, 標準以外のプログラムのインストールには packages
を使うと 思っていたのですが.
A. そのとおり. 通常は packages
が最も手早くて簡単な方法です.
Q. それではどうして面倒な ports があるのですか?
A. いくつかの理由があります:-
いくつかのソフトウェアのライセンス条件には,
バイナリではなくソースコードでの
配布を求めているものがあります.
バイナリ配布を信用していない人もいます.
少なくともソースコード があれば, ソースコードを読んで,
(理論的には) 潜在的な問題点を自分で
見つけ出すこともできるはずです.
ローカルなパッチを入手した場合,
それを自分で追加するために
ソースコードが必要になります.
プログラムがいかにコンパイルされるべきかについて,
あなたはパッケージを作った人とは
異なる見解を持っているかもしれません.
どんな最適化オプションをつけるべきかとか,
デバッグバージョンを作ってから それを strip
するべきだとか, いや, そうするべきでない, などなど,
確固たる見解を持っている人もいるでしょう.
ソースコードを手元に置いておきたい人たちもいます.
彼らは, 退屈したときに眺めたり, あちこち解析してみたり,
ソースコードを 借用したり (もちろん,
ライセンスが許せばの話ですが) するのです.
あなたがソースコードを持っていなければ,
それはソフトウェアとは 言えませんね! ;-)
Q. パッチとは何ですか?
A. パッチとは,
あるバージョンから他のバージョンへどのように変更するかを
示す, (通常は) 小さなファイルです. “23
行目を削除”, “468 行目の後に これらの 2
行を追加”, または“197
行目をこのように変更”というような 内容を含んでいます.
これは, “diff”
という名前のプログラムで生成されます.
Q. tarball とは一体何ですか?
A. .tar または
.tar.gz という拡張子を持つファイルです.
(.tar.Z のようなバリエーションも
ありますし, DOS のファイルシステム用に
.tgz
と短縮される場合もあります.)
これは基本的に, 一つのファイルに固めた
(.tar) ディレクトリツリーです.
圧縮されている (.gz) 場合もあります.
これは元々 Tape
ARchives (訳注: テープアーカイブ)
(このため tar という名前なのです)
で使われていたものなのですが,
インターネット上でプログラムのソースコードを配布するために
広く使われている方法です.
これらのファイルの中身を見たり,
展開したりすることもできます. FreeBSD
の基本システムに付属する Unix 標準の tar
コマンドを使ってみると 次のようになります:-
&prompt.user; tar tvzf foobar.tar.gz
&prompt.user; tar xzvf foobar.tar.gz
&prompt.user; tar tvf foobar.tar
&prompt.user; tar xvf foobar.tar
Q. チェックサムとは何ですか?
A. これは,
チェックしたいファイル中のすべてのデータを加えて生成した
数値です. 何か文字が書き換わっていたら,
チェックサムが一致しなくなります. そのため,
単純な比較だけで違いを見つけることができるのです.
(実際には, 文字の位置が入れ替わるなどの,
単純な加算ではわからない問題も
見つけることができる複雑な方法で計算されています.)
Q. 私は, CD-ROM から ports
をコンパイルする にしたがって ports
をインストールしていました. kermit
をインストールしようとするまではうまくいっていました:-
&prompt.root; 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 に指示することができます.
&prompt.root; make DISTDIR=/where/you/put/it install
Q. ports では, すべてを /usr/ports
に置いたときだけ動作するのでしょうか?
システムの管理者によると, 私の個人的なファイルは
/u/people/guests/wurzburger
に入れなければならないのですが, これでは
うまくいかないように思います.
A. PORTSDIR 変数と
PREFIX 変数を変更することで,
違うディレクトリを 使用することができます. 例えば,
&prompt.root; make PORTSDIR=/u/people/guests/wurzburger/ports install
とすると, ports は
/u/people/guests/wurzburger/ports
でコンパイルされ, すべて /usr/local
以下にインストールされます.
&prompt.root; make PREFIX=/u/people/guests/wurzburger/local install
この場合, コンパイルは /usr/ports
でおこない,
/u/people/guests/wurzburger/local
にインストールします. もちろん,
以下のように両者を組み合わせることも可能です.
&prompt.root; make PORTSDIR=.../ports PREFIX=.../local install
(省略せずに記述したら,
このページに収めるには長すぎるのですが,
考え方は理解していただけたと思います)
もし ports をインストールするたびに,
これらを毎回タイプするのが 気に入らないのであれば,
(正直に言って, 誰もそう思わないでしょう)
これらを環境変数にセットしてしまうという手があります.
Q. 私は, FreeBSD の CD-ROM を持っていませんが,
私はすべての tarball を 私のシステムに置いておきたいのです.
そうすれば, 私は ports をインストール するたびに,
毎回ダウンロードが終わるのを待たなくてすむでしょう.
これを一度におこなう簡単な方法はありませんか?
A. ports コレクション全体の tarball を持ってくるには,
次のようにしてください.
&prompt.root; cd /usr/ports
&prompt.root; make fetch
ports の下のディレクトリひとつの tarball
を持ってくるには, 次のように してください.
&prompt.root; cd /usr/ports/directory
&prompt.root; make fetch
ports をひとつだけ持ってくる方法は,
きっと既にご存知だと思います.
Q. マスタ FTP サイトから tarball を持ってくるより,
近くにある FreeBSD の
ミラーサイトから持ってきた方が速いはずです. MASTER_SITES
に書かれている サイト以外から持ってくるように ports
に指示する方法はありませんか?
A. もちろんあります. 例えば ftp.FreeBSD.ORG が
MASTER_SITES に書かれている
サイトより近いとしたら, 以下のようにしてください.
&prompt.root; cd /usr/ports/directory
&prompt.root; 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 に付属している バージョン) では,
オプションを
オプションなしで
使うと, バグのあるコードを出力します (ほとんどの ports は
オプションを 使いません).
コンバイラオプションは次のように定義 すべき
です.
&prompt.root; 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
を見つけることができます:
&prompt.user; cd /usr/ports
&prompt.user; make search key=lisp
Q. foo ports
をインストールしたいのですが, それのコンパイルは
すぐに停止して, bar ports
のコンパイルが始まってしまいます. 一体どうして?
A. foo ports が,
bar ports
の提供する何らかの機能を必要としているからです. 例えば
foo が画像を使うとすると,
bar は画像処理に必要な
ライブラリを持っている, などです. または,
bar は foo
をコンパイルするのに必要なツールなのかもしれません.
Q. ports から
grizzle
プログラムをインストールしましたが, まったく
ディスクスペースの浪費です. 削除したいのですが,
すべてのファイルが どこへインストールされたのかわかりません.
何か手がかりはありませんか?
A. 大丈夫, 次のようにしてください.
&prompt.root; pkg_delete grizzle-6.5
Q. ちょっと待ってください.
削除しようとするコマンドのバージョン番号を
知っていなくてはならないのでしょうか? あなたは,
私がバージョン番号を
覚えていることを本気で当てにしているのでしょうか?
A. そんなことはありません.
バージョン番号は次のようにすればわかります.
&prompt.root; 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. はい. インストールが首尾よく終わり,
もうソースコードが必要でないと思うなら,
それらを残しておく理由はないでしょう. 一番よい方法は,
次の通りです.
&prompt.root; cd /usr/ports
&prompt.root; make clean
これは, すべての ports のサブディレクトリを調べ, 各
ports のスケルトン以外の削除をおこないます.
Q. これを試してみたのですが, tarball や ports
で使われたファイルが distfiles
ディレクトリに残っています.
これも削除してしまっても大丈夫ですか?
A. はい. それを使った作業が終わったのであれば,
削除してしまっても大丈夫です.
Q.
私はとてもとてもたくさんのプログラムを楽しみたいのです.
一度にすべての ports
をインストールする方法はありませんか?
A. 次のようにしてください.
&prompt.root; cd /usr/ports
&prompt.root; make install
Q. やってみました. 時間がとてもかかるだろうと思ったので,
そのまま実行を 続けさせて, 私は寝ました.
翌朝コンピュータを見てみると, 三つ半の ports しか
処理が終わっていませんでした.
なにか悪かったのでしょうか?
A. これは ports の中には私たちの決められないこと
(例えば, あなたが A4 の 用紙に印刷したいのか, US
レターサイズの用紙に印刷したいのかなど) について
質問してくるものがあるからです.
それらの質問には手動で答える必要があります.
Q.
私は一日中モニタの前に座って過ごしたりしたくないのですが.
何かよいアイデアはありませんか?
A. では, あなたが寝に / 仕事に /
公園にいく前に以下を実行してください:-
&prompt.root; cd /usr/ports
&prompt.root; make -DBATCH install
これでユーザの入力を要求しないすべての ports
をインストールします. そして, 戻ってきてから,
次のように実行してください.
&prompt.root; cd /usr/ports
&prompt.root; make -DIS_INTERACTIVE install
そして, 残りの作業を実行してください.
Q. 私たちは ports コレクションにある
frobble を使っています. ですが,
私たちの必要に応じて ports を変更したところがあるのです.
自分でパッケージを作って, それを私たちのサイトのまわりに
簡単に配布できるような方法がありますか?
A. もちろんあります.
変更点をパッチにする方法は知っていますよね:-
&prompt.root; cd /usr/ports/somewhere/frobble
&prompt.root; make extract
&prompt.root; cd work/frobble-2.8
[あなたのパッチを当ててください]
&prompt.root; cd ../..
&prompt.root; make package
Q. この ports の技術は本当に賢いですね.
どのようにして動いているのか
私はどうしても知りたいと思います. その秘密は何ですか?
A. 秘密は一切ありません. Makefiles
ディレクトリ にある
bsd.ports.mk と
bsd.ports.subdir.mk
ファイルを見るだけです.
複雑なシェルスクリプトを嫌う読者は,
このリンクを追いかけないほうが よいでしょう.
自分で port を作る
原作: &a.jkh;, &a.gpalmer;, &a.asami;,
&a.obrien; and &a.hoek;. 28 August 1996.
訳: &a.jp.simokawa;, &a.asami;.
10 November 1996.
自分で port を作ることに興味がありますか, すばらしい!
これから, FreeBSD 用のportを作る際の,
いくつかのガイドラインを 説明します.
実際にportをコンパイルするときのほとんどの仕事は
/usr/ports/Mk/bsd.port.mk
というファイルでおこないます.
Portsコレクションについてのさらに細かい内部の働きについては,
そちらの ファイルを参照してください.
これにはコメントが細かく書いてありますので, Makefile
を読むのにあまり慣れていない人でも, 得るものはとても大きいで
しょう.
ここでは, 変更可能な変数の一部についてのみ記述しています.
ほとんどの変数はbsd.port.mk
の始めに記述があります.
また, このファイルは非標準のタブの設定になっています.
Emacs や Vim
はファイルのロード時にこれを認識しますが,
viやexでは,
ファイルをロードしたら :set tabstop=4
のようにして正しい値を設定する
ことができます.
3分porting
この節では, 簡単なportの方法について説明します.
多くの場合これ では不十分ですが,
まあうまくいくかどうか試してみて損はないでしょ う.
まず, 元のtarファイルをDISTDIRに置きます.
デフォルトは/usr/ports/distfilesです.
以下では,
ソフトウェアはそのままコンパイルされるとします. つまり,
FreeBSDのマシンで動かすために, 変更がまったく必要ない
とします.
もしなにか変更が必要な場合には次の節も参照する必要
があります.
Makefile の作成
最小限のMakefile
は次のようなものです:
# New ports collection makefile for: oneko
# Version required: 1.1b
# Date created: 5 December 1994
# Whom: asami
#
# $Id$
#
DISTNAME= oneko-1.1b
CATEGORIES= games
MASTER_SITES= ftp://ftp.cs.columbia.edu/archives/X11R5/contrib/
MAINTAINER= asami@FreeBSD.ORG
MAN1= oneko.1
MANCOMPRESSED= yes
USE_IMAKE= yes
.include <bsd.port.mk>
おわかりになりますでしょうか.
$Id$があ る行の内容については,
気にしないでください. これはこのファイル
がportsツリーに書き込まれるときにCVSによって自動的に書
き込まれます. もっと詳しい例が見たければ, Makefileのお手本
の節をご覧ください.
Package記述ファイルの作成
どのようなportでも, packageにするしないに関わらず, 3つ
の記述ファイルが必要です.
pkgサブディレクトリにある,
COMMENT, DESCR,
それに PLISTです.
COMMENT
これには, そのportについての説明を1行で書きます.
Package の名前, バージョン番号等は
含めないでください. たとえば,
こんな具合です:
A cat chasing a mouse all over the screen.
DESCR
これは, そのソフトウェアについての,
すこし長い説明を記述します. その port
が何をするのかについての数段落程度の
簡潔な解説があれば十分です.
このファイルはマニュアルでもなければ,
使用方法やコンパイル方法についての細かい
説明書でもありません. 特に,
READMEファイル manpage
をコピーしようとしてしている場合には
注意してください. これらは多くの場合,
そのポートの簡潔な説明に なっていなかったり,
扱いにくい形式(manpage の場合,
行を揃えるために空白が調整されます)になっていたりします.
もしこのソフトウエアに公式の WWW のホームページがあれば,
ここに書いて下さい. 自動化ツールが正しく動作するように,
Web サイトのうちの ひとつ には, 前に
WWW: を付け加えてください.
このファイルの最後にあなたの名前を書くことが
推奨されています. たとえば, こんな具合です.
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
PLIST
このファイルには,
このportによってインストールされるファ
イルが列挙されます. このファイルはpackageを作る際のリス
トとして使われるため, `packing list' とも呼ばれます.
ここ に書かれているファイル名は,
インストール時のプレフィックス (普通は
/usr/local か
/usr/X11R6) からの 相対パスです.
MANn
変数を使用する場合(使用することが推奨されています)には,
マニュアルはここに入れないでください.
簡単な例を載せておきましょう:
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
'Packing list'の詳細については, &man.pkg.create.1;
の マニュアルを参照してください.
すべてファイルを列挙しなければなりませんが,
ディレクトリ名は必要ありません. また, ports
がインストール時にディレクトリを作成する場合には,
@dirrm の行を加えて, その port
が削除されるとき,
そのディレクトリも削除されるようにしてください.
このファイルには,
ファイル名をアルファベット順に並べるようにしてください.
port のアップグレートのとき,
楽に確認ができるようになります.
チェックサムファイルの作成
ただ, make makesum
と入力するだけです. bsd.port.mk
にルールがあるので,
自動的にfiles/md5が生成されます.
Portのテスト
そのportが正しく動くことを,
package化を含めて確認してください.
以下の重要なポイントを確認してください.
PLIST にその port
がインストールしないものが含まれていないこと.
PLIST にその port
がインストールする全てのものが含まれていること.
reinstall
ターゲットを使うことによって,
何度でもインストールが可能こと.
deintall の際に 後片付け
をすること.
推奨されるテストの手順
make install
make package
make deinstall
pkg_add `make package-name`
make deinstall
make reinstall
make package
package および
deinstall の段階で,
どんな警告(warning)も出力されないことを確認してください.
ステップ3の後,
新しいディレクトリが全て正しく消去されているかを
確認してください. また,
ステップ4の後にそのソフトウェアを使用してみて, package
からインストールされた場合に正しく動作するかを
確認してください.
portlint でチェック
portlintを使って, あなたの port
が我々のガイドラインそっているかを確認してください.
portlint プログラムは ports
コレクションに含まれています. 特に, Makefile
が正しい形式になっているか, package
の名前が正しいか, をチェックするのに良いでしょう.
Portの送付
まず, やってよいことといけないこと
についての節を読んでください.
さあ, あなたのportに満足したら,
あとはそれをFreeBSDのメイ ンのportsツリーに置いて,
皆に使ってもらうだけです. いまある
work ディレクトリや
pkgname.tgz
パッケージは必要ありませんから, まず消去してください.
あとは, バグレポートの中に shar `find
port_dir` の出力を, &man.send-pr.1;
プログラムを使用して送ってください. &man.send-pr.1;
についての詳細は, バグ報告と一般的な論評
を参照してください.) もし, 圧縮していない状態で,
20KB以上あるようなポートであれば, 圧縮して tar
ファイルにして, バグレポートに入れる前に &man.uuencode.1;
を使用してください. (20KB以下のものでも, tar
ファイルにして送ってもよいですが, あまり歓迎されません).
バクレポートの category は ports, class
は
change-requestを必ず使用してください.
(レポートを confidential (内密)
にしないようにしてください!)
もう一度, オリジナルのソースファイル,
work ディレクトリ, make
package
で作成したパッケージが含まれていないこと
を確認してください.
以前, 新しい port をわれわれの ftp サイト (ftp.freebsd.org)
にアップロードするようにお願いしたことがありますが,
現在このサイトの incoming
ディレクトリは読み出し不可になっており,
いまでは推奨されていません.
沢山の海賊版ソフトウェアがそこに置かれたためです.
私たちは, 何か不明な点があったらあなたに確認したのち,
それをツリーへ置きます. あなたの名前は, FreeBSD
ハンドブックやその他のファイルの “Additional FreeBSD
contributors” のリストにも載るでしょう. う〜ん,
素晴らし い. :)
本格的なport
残念ながら, 移植がそう簡単ではなく,
動かすために多少の変更が 必要な場合も多いでしょう.
この節では, portsコレクション の方法論にのっとって,
そのような場合にどのように変更を施し, 動
くようにしたらよいかを順を追って説明します.
port構築の詳細
まず, あなたがportのディレクトリで
make とタイ
プしてから起こる一連の出来事について,順を追って説明しま
す. ここを読むときには, 他のウィンドウで同時に
bsd.port.mk
も開いておくとよいかもしれません.
しかし,
bsd.port.mkが何をしているのか,
完全に理解 できなくても心配する必要はありません.
そう多くの人が理解して いるわけではないですから... f(^_^;)
まず, fetch
というターゲットが実行されます.
このfetchターゲットは
ローカルディスクのDISTDIRに配布ファ
イルがあるようにするのが役目です. もし,
fetchが必要なファ
イルをDISTDIRに見つけることが
できなけ れば, Makefileに指定されているURL
MASTER_SITES,
そして私たちのFTPサイトで ある
ftp://ftp.freebsd.org/pub/FreeBSD/ports/distfiles/
(ここ には, 私たちが取ってきたファイルを
バックアップとして置いてあ ります) に探しにいきます.
そして, ユーザのサイトがインター ネットに
直接接続されている場合には, FETCH
を使って, その名前のファイルを取っ てきて,
DISTDIRに保存します.
次に実行されるのは
extract ターゲットです.
これは, DISTDIRにある, 配布ファイル
(普通は gzipされたtarファイル) を読み,
ソースを一時的な作業ディレ
クトリWRKDIR (デフォルトは
work) に展開します.
次に, patch
というターゲットが実行されます. まず,
PATCHFILESに定義されている,
すべてのパッ チをあてます.
次にもしPATCHDIR (デフォ ルトは
patches サブディレクトリ)
にパッチが存在す れば,
これらをアルファベット順にあてます.
次に実行されるターゲットは
configureです. これには, い
ろいろな場合があります.
もし存在すれば,
scripts/configure
が実行されます.
もし, HAS_CONFIGURE
あるいは GNU_CONFIGURE
がセットされていれば,
WRKSRC/configure
が実行されます.
もし, USE_IMAKE
がセットされていれば, XMKMF
(デフォルト: xmkmf -a)
が実行されます.
最後に, build
というターゲットが実行されます. これは, その port
の専用の作業ディレクトリ (WRKSRC)
にい き, コンパイルするのが役目です. もし
USE_GMAKE がセットされていれば, GNU
make が使用されます.
さもなければFreeBSDの make
が使用されます.
上記はデフォルトのルールです. さらに,
pre-何とか
や
post-何とか
というターゲット が定義してあった
り,そのような名前のスクリプトが scripts
サブディレクトリに置いてある場合には,
それらはデフォルトの動作の前
後に実行されます.
たとえば, post-extract
というターゲットがMakefile で定義されていて,
pre-build というファイルが,
scripts
サブディレクトリにあるとすると,
post-extractターゲットは,
通常の展開動作のあとに呼 び出され,
pre-build
スクリプトはデフォルトのコンパイ
ルのルールが実行される前に実行されます.
もし動作が簡単であれ ば, Makefile
のターゲットを使用することが推奨されています. な ぜならば,
そのportが何らかのデフォルトではない動作を必要とす
るのかどうかが一箇所にまとめて書いてあった方が他の人に
理解しやす いからです.
デフォルトの動作は bsd.port.mk の
do- 何とか
というターゲットでおこなわれます. たとえば,
portを展開するコマンドは,
do-extract
というターゲットにあります. もし,
デフォルトのターゲットに 不満があれば,
do- something
というターゲッ
トを再定義することによって,
どのようにでも直すことができます.
“メイン”のターゲット (例えば,
extract,
configure等) は,
すべての前段階が実行されていること を確認して,
実際のターゲットやスクリプトを呼び出す以外のこと
はしません.
bsd.port.mkはこれらが変更されることは仮定してい
ませんので, もし, 例えば, 展開の仕方を直したいときには,
do-extract を直し,
絶対にextractには手を
触れないでください.
これで, ユーザが make
と入力したときに何が起こ るのかが理解できたと思います.
では, 完璧なportを手順を追っ て作ってみましょう.
オリジナルのソースの入手
オリジナルのソースを, (普通は)
圧縮されたtarファイルの形 (
foo.tar.gz
あるいは
foo.tar.Z)
で入手して, それを DISTDIR
にコピーします. 可能なかぎり, 広
く使われている主流の
ソースを使用するようにしてください.
もし, ネットワークへの接続のよい FTP/HTTP
サイトを見つけるこ とができなかったり,
頭にくるような非標準的な形式しか持ってい
ないサイトしか見つけられないときには, 自分で管理する確実な
ftp か http サーバ (たとえば,
あなたのホームページ)に置くこと ができます.
MASTER_SITES
に正しく反映されていることを確認してください.
もしも, そのような都合の良く,
安心な置き場所が見つけられない 場合(あなたが FreeBSD の
committer であれば, 自分の
public_html ディレクトリに置けます),
私たちが,
ftp://ftp.FreeBSD.ORG/pub/FreeBSD/ports/distfiles/LOCAL_PORTS/
に置き場所を提供できます.
この場所は, 変数 MASTER_SITE_LOCAL
を使って参照してください.
これについての問い合わせのメールは &a.ports へお願いします.
その port の配布ファイルが特に理由もなく,
しょっちゅう変る場合には,
配布ファイルをあなたのホームページに置いて
MASTER_SITESの最初に入れてください.
こうすることによって, ユーザ利用する場合に
checksum mismatch
エラーが起るのを防ぎ, 我々の ftp
サイトの保守の負担を減らすことができます. もし, master
site がたった一つしかない場合には,
あなたのサイトにバックアップを置いて
MASTER_SITES
の2番目に加えてください.
もし,
あなたのportに必要ないくつかの追加パッチがインター
ネット上で手に入るのならば, それらも取ってきて,
DISTDIR に置きます. もし,
それらがメイン
のソースのtarファイルとは別のサイトにあっても,
心配する必要 はありません.
そのような状況にはちゃんと対応できるようになっ ています.
(以下のPATCHFILESの記述
をご覧ください).
Portの修正
適当なディレクトリにtarファイルを展開して,
FreeBSDの最新の バージョン上で,
正しくコンパイルできるために必要なあらゆる変 更を施します.
最終的に処理は自動化するわけですから, 何をおこなっ
たかを注意深く記録しておきましょう.
あなたのport が完成した暁には, ファイルの削除, 追加,
修正を含むすべての処 理が,
自動化されたスクリプトやパッチファイルで
おこなえるようになっ ていないといけません.
もし, あなたの port
のコンパイルやインストールのために必要
な手作業があまりに多いようならば, Larry Wall の模範的な
Configure
スクリプトでも参考にしたほうがいいかもしれませ ん.
新しいportsコレクションは, 最小のディスクスペースで,
個々のportがエンドユーザにできるだけ“プラグ &
プレ
イ”の状態でmakeできることをめざしています.
あなたが作成し FreeBSD の ports
に寄付されたパッチファイル,
スクリプトおよびその他のファイルは,
明示的に記述されている場合 を除いては,
BSDの標準的な著作権条件によりカバーされていると見な
されます.
パッチをあてる
port
の過程で追加されたり変更されたファイルは再帰的diffで変
更点を取り出すことができます. パッチは適当にまとめて,
patch-xx
という名前のファイルに入れてくだ さい.
xx
はパッチが適用される順番を示します — これらは,
アルファベット順, つまり
aa が 最初, つぎに
ab などとなります. これらのファイル
をPATCHDIRに置いておくと,
自動的に適用さ れるようになっています. すべてのパッチは
WRKSRC (通常は, portのtarファイルが展
開されるところで, makeが実行されるところと同じです)
からの相 対パスになります.
修正やアップグレードを容易にするため, 2つ
以上のパッチが同じファイルを修正するのは避けてください.
(例,
patch-aaとpatch-abが共にWRKSRC/foobar.c
を修正する, など.)
コンフィグレーション
カスタマイズのために追加したいコマンドがあれば,
configure
という名前のスクリプトに入れて
scripts サブディレクトリに置きます.
上で述べたよ うに, pre-configure
あるいは post-configure という
Makefile
のターゲットおよび/あるいはスクリプトで処理す
ることもできます.
ユーザからの入力の扱い
もし, そのportがビルド, コンフィグレーション,
インストー ルの際にユーザからの入力を必要とするならば,
Makefileで
IS_INTERACTIVEをセットしてください.
これによって, 深夜,
自動的にたくさんのportをコンパイルすることが可能にな
ります. 環境変数BATCHがセットされていると
IS_INTERACTIVE
の定義されているportはスキップされ ます (そして,
ユーザがINTERACTIVEという変数をセッ
トすると入力を必要とする port
のみコンパイルされま す).
もし, 適切なデフォルト設定があるのであれば,
PACKAGE_BUILDING
変数をチェックして,それが設 定されて いる場合には,
ユーザ入力のスクリプトを起動しないように してください.
こうすることによって, CD-ROM や ftp に 置く
packageを我々が作成することができます.
Makefileの作成
Makefileの作成は非常に単純です. 繰り返しになりますが,
始める まえに, すでにある例を見てみることをお奨めします.
またこのハ ンドブックにはMakefileのお手本
があります. それを見て, Makefile内の変数の順番や空行を入れると
ころなどの参考にしてください. そうすると他の人々にも読みやすい
ものとなります.
では,
Makefileをデザインするときに問題となるところを順に追っ
て見てみましょう.
オリジナルのソース
ソースはDISTDIRに, 標準的なgzipされた
tarファイルとして置かれていますか? そうであれば, 次のステッ
プに進めます. そうでなければ, 変数
EXTRACT_CMD,
EXTRACT_BEFORE_ARGS,
EXTRACT_AFTER_ARGS,
EXTRACT_SUFX,
DISTFILES
を適当に書き換えないといけません.
どれだけ変更しないといけないかは, あなたのportの
配布ファイルがどの程度標準からかけはなれているかによりま す.
(最もよくある場合は, gzipではなく普通のcompressコマンド
でtarファイルが圧縮されている場合で,
EXTRACT_SUFX=.tar.Z
とするだけです.)
最悪の場合には, 自分で
do-extract ターゲットを作 成して,
デフォルトを上書きすることもできます. しかし, そこま
でする必要があることはめったにないでしょう.
DISTNAME
DISTNAME には port
の名前の基幹部分を入れ ます. デフォルトのルールでは,
配布ファイルのリスト (DISTFILES) は
DISTNAME EXTRACT_SUFX
という名前 になっています. 例えば,
foozolix-1.0.tar.gzの場 合,
通常のtarファイルだと,
DISTNAME=foozolix-1.0 のようになります.
さらにデフォルトのルールでは, tarファイルは
work/DISTNAME
というサブディレクトリ に展開されることを仮定しています,
例えば work/foozolix-1.0/
といった具合いです.
これらの動作はもちろんすべて変更可能です.
デフォルトのルー ルは最も標準的な場合を仮定しているだけです.
まず, port が複 数の配布ファイルを必要とするときには,
単に明示的に DISTFILESを設定してください.
もし, DISTFILES
の一部だけが実際に展開される場合 には,
それらをEXTRACT_ONLY に設定してくだ さい.
この変数が定義されている場合には, 展開時に
DISTFILESに優先して利用されます.
残りのファ イルもDISTDIRに取ってきますが,
展開時に
はなにもせずに後で使うためにそのまま置いておかれます.
PKGNAME
もし, DISTNAME が我々の package
の名前についてのガイドライン
に沿ったものでない場合には, PKGNAME
にもっと良い名前を設定してください.
詳細は上記のガイドラインを参照してください.
CATEGORIES (分類)
完成した package の実体は
/usr/ports/packages/All に置かれます.
また, 1つかそれ以上の
/usr/ports/packages
のサブディレクトリからのシンボリッ クリンクが作られます.
それらのサブディレクトリの名前が
CATEGORIES
という変数によって指定されます. これは,
ユーザがFTPサイトやCD-ROMのpackageの山を渡り歩
くことを容易にするためです. 現在存在する カテゴリを見て, そ
のportに適したもを選んでください.
このリストは, この port が port tree のどこに import
されるかも決定します. 2つ以上のカテゴリを指定した場合には
最初のカテゴリで指定されるサブディレクトリに置かれること
になります. 適切なカテゴリを選ぶ方法については, カテゴリ
の節を参照してください.
もしその port
が本当に現在存在するすべてのものとは異なって いる場合には,
新しいカテゴリ名を作ることもできます. その際には, &a.ports
宛てに新しいカテゴリ名を提案する
メールを送ってください.
カテゴリ名については,
なんのエラーチェックも行なわれません.ミスタイプがあっても
make package はなにも考えずに
新しいディレクトリを作ってしまいますので,
注意してください.
MASTER_SITES
オリジナルの配布ファイルを指し示す FTP または HTTP の
URL のディ レクトリ部分までを
MASTER_SITES に記録しま す. スラッシュ
(/) を最後につけることをお忘れなく.
配布ファイルがシステム上に存在しないときに,
makeマクロは FETCH
でこの変数に指定されたサイトから取っ てきます.
複数の,
できれば異なる大陸のサイトをこのリストに入れておく
ことが推奨されています. これによって, 広域ネットワークにトラ
ブルがあった場合でも成功する可能性が高くなります.
私たちはさら に, 自動的に最も近いマスタサイトを検出して,
そこから取って くるメカニズムの導入を計画しています.
オリジナルのtar ファイルが, X-contrib, GNU, Perl CPAN,
TeX CTAN または Linux Sunsite
などの有名なアーカイブにある場合には,
MASTER_SITE_XCONTRIB,
MASTER_SITE_GNU,
MASTER_SITE_PERL_CPAN,
MASTER_SITE_TEX_CTAN および
MASTER_SITE_SUNSITE を利用することで,
簡単にこれらのサイトを 指定することができます. あとは
MASTER_SITE_SUBDIR にアーカイ
ブ内でのパスを指定するだけです. 以下に例を示します.
MASTER_SITES= ${MASTER_SITE_XCONTRIB}
MASTER_SITE_SUBDIR= applications
ユーザは/etc/make.conf中で
MASTER_SITE_* 変数を設定
することによって, デフォルトの FTP サイトではなく, これらの
有名なアーカイブの
ミラーの中で好みのものを使用することが可能 です.
PATCHFILES
もし,
オリジナルの配布ファイル以外にもFTPかHTTPで手に入る
パッチが必要な場合には, PATCHFILESにファ
イル名を, PATCH_SITESにサイトとディレクト
リの名前を MASTER_SITES
と同様に設定してく ださい.
そのパッチ内のファイル名ががソースツリーの
一番上のディレク トリ (WKRSRC)
からの相対パスになっていな い場合には,
PATCH_DIST_STRIPを指定してく ださい.
例えば, パッチ内のファイル名にすべて余計な
foozolix-1.0/ がついている場合には,
PATCH_DIST_STRIP=-p1としてください.
これらのパッチは圧縮されていても大丈夫です. ファイル名が
.gz か .Z
で終わる場合には自動的に復元
されるようになっています.
もしパッチが, 文書などその他のファイルと一緒に gzip
された tarファイルで配布されている場合には,単純に
PATCHFILES を使うことはできません.
このような場合には, このパッチの tar ファイルの名前と場所を
DISTFILES と
MASTER_SITES に加えます. それから,
pre-patch ターゲットで,
パッチコマンドを走らせるか, パッチファイルを
PATCHDIR ディレクトリに
patch-xx
という名前でコピーするかして,
パッチを適用するようにします.
普通の gzip か compress された tar ファイルであれば,
通常のソースファイルと一緒にその時までに
展開されていますので, 明示的に展開する必要はありません.
もし, 後者の方法を使用する場合には,
すでにそのディレクトリにある なにかを上書きしないように,
注意する必要があります. さらに,
pre-clean
ターゲットにコピーしたパッチファイル
を削除するコマンドを追加するのを忘れないでください.
MAINTAINER
あなたのメールアドレスをここに入れてください.
お願いします. :)
保守担当者(maintainer)の責任についての詳細は, Makefile 中の
MAINTAINER の節をご覧ください.
依存関係
このプログラムが他のportに依存する場合には, 必要なものが
自動的に作られるようにすることができます. そのために, 以下の
5つの変数が用意されています.
よくあるケースのためにあらかじめ設定された依存変数や,
いくつかの依存関係の制御のための変数があります.
LIB_DEPENDS
Port が必要とする非標準の共有ライブラリを
この変数で指定 します. これは
lib:
dir:
target という組のリストで,
うち lib
が共有ライブラリの名前, そして
dir
がそのライブラリが見つからない場合にインストールする port
のあるディレクトリで, target
はそのディレクトリで呼ばれるターゲットです. 例えば,
LIB_DEPENDS= jpeg.9:${PORTSDIR}/graphics/jpeg:install
と指定してあれば,
まずメジャーバージョンが9のjpegライブ
ラリがあるかどうか確認し, ない場合にはportsツリーの中の
graphics/jpeg
というサブディレクトリに移動し, そこ
でコンパイルとインストールを行ないます.
target の 部分は,
DEPENDS_TARGET (デフォルトは
install)
と等しいときには省略できます.
前半の lib 部分は
ldconfig -r | grep -wF
への引数になります.
この変数には正規表現を入れられません.
この依存関係は2度チェックされます. まず
extract ターゲットで, 次に
install でチェックされます.
(これは, その port を作成するマシンとインストールする
マシンが違う場合でも, きちんとそのライブラリが利用できる
ことを確認するためです.) また, 依存するもの名前は package
の中にも含まれますので, ユーザのシステムに存在しなければ,
pkg_add が自動的にインストールします.
RUN_DEPENDS
Port
を使用する際に必要となるファイルまたはプログラムがある
ときにはこの変数で指定します. これは
path:
dir
:target とい う組のリストで,
path
がファイルまたはプログラムの 名前, そして
dir
がそれが見つからない場合に作成する ためのディレクトリ名で
target
はそのディレクトリで呼ばれるターゲットです.
path の最初の文字がスラッ シュ
(/) の場合にはファイルかディレクトリ
とみなし, その存在を test -e
でチェックします; そうでない場合には
実行可能であると仮定し, which -s
を使って そのプログラムがユーザのサーチパス上に
あるかどうか確認します.
例えばMakefileに以下のように書いてあるとします.
RUN_DEPENDS= ${PREFIX}/etc/innd:${PORTSDIR}/news/inn \
wish8.0:${PORTSDIR}/x11-toolkits/tk80
まず, /usr/local/etc/innd
というファイルかディレクトリが存在 するか確認し,
ない場合にはportsツリーの中の
news/inn
というサブディレクトリから作られます. ま た,
wish8.0
というプログラムがユーザのサーチパス中 にあるかどうか探し,
ない場合には同じくportsツリーの
x11-toolkits/tk80
というサブディレクトリから作られます.
この例で, innd
は実際にはプログラムです; この ように,
プログラムであっても標準のサーチパス以外のところに
あるようなものの場合には,
絶対パスで指定してください.
この依存関係はinstall
ステージのはじめでチェック されます. また,
packageを作る際に必要となるportのpackage名 が記録され,
pkg_addを使用すると
ユーザのシステムに存在しない場合には自動的にそちら
のpackageもインストールされるようになります.
target の部分は,
DEPENdS_TARGET
と同じ場合には省略可能です.
BUILD_DEPENDS
Port
のコンパイルに必要なファイルまたはプログラムがある
ときは, この変数で指定してください.
RUN_DEPENDSと同 様に, これは
path:
dir
:target
という組のリストです. 例 えば,
BUILD_DEPENDS= unzip:${PORTSDIR}/archivers/unzip
は
unzip という名前のプログラムを探し,
見つから
ない場合にはarchivers/unzip
サブディレクトリで作 れという意味になります.
ここでは “コンパイル”
と一口にいいましたが, この変数は実際
にはファイルの展開から実際のコンパイル・リンクまで
全部をま とめて面倒を見てくれます. この依存関係は
extract
ステージからチェックされます.
target の部分は
DEPENDS_TARGET
と同じ場合には省略可能です.
FETCH_DEPENDS
この変数は,
portを取ってくるのに必要なファイルまたはプロ
グラムを指定するのに使います. 上の二つと同様に, これは
path:
dir
:target
という組のリストです. 例えば,
FETCH_DEPENDS= ncftp2:${PORTSDIR}/net/ncftp2
としておけば, ncftp2
という名前のプログラムを探 し,
見つからない場合にはnet/ncftp2
サブディレク トリにいってインストールします.
この依存関係は fetch
ステージからチェックされます.
target の部分は
DEPENDS_TARGET
と同じ場合には省略可能です.
DEPENDS
上記の四つのいずれにもあてはまらないような
依存関係がある場 合, または他の port
がインストールされれているだけではなく,
ソースが展開されている必要がある場合にはこの変数
を使います. これは
dir
:target という形式のリスト
になります. 上記の四つと違って特に
“確認”するものがありませんので.
よくある依存関係を表す変数
もし ports が X Window System を必要とするのであれば,
USE_XLIB=yes を定義してください.
(これは USE_IMAKEも意味します) BSD
make の代りに GNU
make を必要とする場合には,
USE_GMAKE=yes を定義. 動作するのに GNU
autoconf を必要とする場合には,
USE_AUTOCONF=yes を定義. 最新の qt
toolkit を使用 する場合には USE_QT=yes
を定義. perl 言語のバージョン5 を必要とする場合には,
USE_PERL5=yes を定義してください.
(特に最後のは重要で, FreeBSD のいくつかの
バージョンでは基本システムに perl5 を含みますが,
他のものは含んでいません.)
依存関係に関する注意
上で述べたように, 依存する ports
が必要になったときに呼ばれるデフォルトのターゲットは
DEPENDS_TARGET で,
そのデフォルトは install です. これは,
ユーザの使用する変数で, port の
Makefile
で定義されるものではありません. もし,
あなたのportが特別な方法で, 依存関係を扱う必要が
ある場合には, DEPENDS_TARGET
を再定義するのではなく, *_DEPENDS
変数の :target
の部分を利用してください.
make clean とタイプしたときには,
依存する port も自動的に clean されます.
もしそうしたくない場合には,
NOCLEANDEPENDS
を環境変数として設定してください.
無条件に他の port に依存させるには, 特別に
nonexistent という文字列を
BUILD_DEPENDS あるいは
RUN_DEPENDS
の最初のフィールドに使用してください. これは, 他の port
のソースが必要なときのみ使用してください. target
も指定することによって,
コンパイルの時間を節約することができます. 例えば,
BUILD_DEPENDS= /nonexistent:${PORTSDIR}/graphics/jpeg:extract
これは, 常に JPEG port の directory
に行きソースの展開を行ないます.
あなたがやりたいことが他の方法ではできない場合以外は,
DEPENDS を使わないでください.
これは常に 他の port
の作成を行い(さらにデフォルトでインストール を行い),
package も作成します. もし本当にこれがあなたの
やりたいことでしたら, 代りにこれを
BUILD_DEPENDS と
RUN_DEPENDS で書くことをお勧めします
— 少なくとも意図が明確になります.
コンパイル時の特別な指定
GNUのmakeを使う場合には,
USE_GMAKE=yes と指定してください. Port に
GNU の configure が含まれ ている場合には,
GNU_CONFIGURE=yes を使います(これは,
HAS_CONFIGURE も意味します).
configure に追加の引数 (デフォルトでは,
GNU の configure では
--prefix=${PREFIX}, GNUでない
configure では空)
を渡したい場合には追加部分を
CONFIGURE_ARGS で指定してください.
そのパッケージが autoconf
を使用する場合には, USE_AUTOCONF=yes
を使います. これは, GNU_CONFIGURE
も意味し, configure の前に
autoconf を実行します.
X Window Systemのアプリケーションなど,
imakeを 使って
Imakefile から
Makefile を作成するportの場合には
USE_IMAKE=yes を指定してください.
コンフィグレー ションステージで自動的にxmkmf
-a が実行されます. も し
フラグが問題をもたらすなら, さらに
XMKMF=xmkmfとしてください.
もし, port が imake
を使用するけれども, install.man
ターゲットがない場合には,
NO_INSTALL_MANPAGES=yes
を指定してください. ついでに, その port
のオリジナルの作者を探し出して八つ裂きにすると
いいでしょう.:>
Portの Makefile が
all 以外のものをメインのター
ゲットとしている場合には, ALL_TARGET でそ
れを指定してください. install と
INSTALL_TARGET も同様です.
もし, port の元の Makefile が
all
以外のターゲットをメインのターゲットとしている場合には,
ALL_TARGET
をそれに合わせて設定してください.
install と
INSTALL_TARGET についても同様です.
NO_INSTALL_MANPAGES
あなたの port がimakeは使うものの
install.man
ターゲットを持っていない場合,
NO_INSTALL_MANPAGES=yes
を指定してください. つい でに,
作者を探し出して八つ裂きにするといいでしょ う. (-_-#)
特別な配慮
Portを作成する場合,
考慮しなくてはいけないことがさらにいくつかあります.
この節では,
それらのうちもっともありがちなものについて説明します.
ldconfig
共有ライブラリをインストールするときには,
共有ライブラリのキャッシュを更新するために port の
Makefile の
post-installtarget
から${LDCONFIG} -m
を走らせてください.
このコマンドの引数は共有ライブラリのインストールしてある
ディレクトリ (通常
PREFIX/lib)
です.
また, pkg/PLIST に @exec
/sbin/ldconfig -m と @unexec
/sbin/ldconfig -R の組を入れて, package
をインストールした場合にも共有ライブラリがすぐ使え,
削除の際にも, システムがまだライブラリが存在すると
誤認しないようにしてください.
この行は共有ライブラリを指定する行のすぐ後に
書くのがよいでしょう:
lib/libtvl80.so.1
@exec /sbin/ldconfig -m %D/lib
@unexec /sbin/ldconfig -R
絶対に引数なしでただ
ldconfig とだけ書いてある行を
Makefile や
pkg/PLIST ファイルに入れないでください.
このコマンドを実行すると, 共有ライブラリのキャッシュが
/usr/lib の内容のみとなり,
ユーザのマシンにさまざまな問題をもたらします (「ぎゃぁ!
このportをインストールしたら xinit
が使えなくなっちゃった!」). この掟を破った者は,
永久に地獄の底で苦しみ続けるように,
閻魔様に頼んでおきます.
ELF 対応
FreeBSD は 3.0-RELEASE で ELF に移行しましたので,
シェアードライブラリを作成するたくさんの port を ELF 対応
にする必要があります. 3.0 システムは ELF としても a.out
としてmも 動作しますし, 我々は非公式ではありますが,
できるだけ長い間 2.2
システムのサポートをしたいと思っていますので, 複雑な状況です.
以下は a.out のみに対応している port をどのように a.out と ELF
両方に対応させるかのガイドライ ンです.
このリストの一部は,
移行時にしかあてはまらないものもありますが, 古い port
をアップグレードしたい場合に参考になるように,
しばらくのあいだは残しておきます.
a.out ライブラリの退避
a.out ライブラリは, /usr/local/lib
から, aout サブディレクトリ
に移動しなくはなりません. (もし移動しないと, ELF ports
がそれらをあっさり上書きして しまいます.) 3.0-CURRENT の
src/Makefile にある
move-aout-libs ターゲット
(aout-to-elf から呼ばれます)
がその移動をしてくれます. a.out
ライブラリを移動するだけなので, ELF と a.out
の両方のライブラリが標準的な ディレクトリにあるシステムでは,
このターゲットを実行しても安全です.
フォーマット
port ツリーは package
をそのマシンのフォーマットで作成します. つまり, 2.2 では
a.out, また 3.0 では `objformat`
の結果によって, a.out か ELF になります. また, いったん
a.out ライブラリをサブディレクトリに移動すると a.out
ライブラリの作成はサポートされません. (つまり,
あなたがにをすれば良いのかを理解しているのならば,
うまく作成できるかもしれませんが,
自力でやらなければならないということです)
もし port が aout でしか動作しないのなら,
BROKEN_ELF
に原因を説明する文字列を設定してください.
この変数が設定された port は, ELF
システム上でのビルドの際スキップされます.
PORTOBJFORMAT
bsd.port.mk において
PORTOBJFORMAT は aout
か elf に設定され, 環境変数
CONFIGURE_ENV, SCRIPTS_ENV,
MAKE_ENV の中で export されます. (2.2-STABLE
では常に aout になります). また,
PORTOBJFORMAT=${PORTOBJFORMAT} として
PLIST_SUB に渡されます. (以下にある
ldconfig
に関するコメントを参照して下さい.)
この変数は, 以下のようにして
bsd.port.mk 中で設定されます.
PORTOBJFORMAT!= test -x /usr/bin/objformat && /usr/bin/objformat || echo aout
この変数を使って, port の make
の過程で何をすべきかを決定すべきですが, もし port の
configure スクリプトが元々, ELF
システムを自動的に検出するのであれば,
PORTOBJFORMAT
を参照する必要はありません.
共有ライブラリの作成
以下は, a.out と ELF
での共有ライブラリの扱いの違いです.
共有ライブラリのバージョン
ELF の共有ライブラリは,
libfoo.so.M
という名前になっていなければなりません. ここで
M は単一の
バージョン番号を表します. 一方 a.out のライブラリは
libfoo.so.M.
N という名前で,
M はメジャーバージョン番号,
N
はマイナーバージョン番号になっている必要があります.
これらを混同しないでください.
libfoo.so.N.
M という名のELF
共有ライブラリや
libfoo.so.N
という名の a.out 共有ライブラリ
(あるいはシンボリックリンク) は
絶対にinstallしないでください.
リンカコマンドライン
直接 ld を使用せずに, cc
-shared を使用してください.
たった一つの違いは, ELF には,
コマンドラインにを加える必要があることです.
ELF のリンカを満足させるためには,
libfoo.so から
libfoo.so.N
へのシンボリックリンクを作る必要があります. これは,
PLIST にも加えなくては いけませんし,
a.out の場合でも害にはならないので (一部の port
ではダイナミックリンクローディングのために
必要でもあります), PORTOBJFORMAT
の設定を気にせずに,
ただ単純にリンクを作成してください.
LIB_DEPENDS
すべての port の Makefile を編集して,
LIB_DEPENDS
からマイナー番号を除去する必要があり,
正規表現のサポートも除去する必要があります. (例えば,
foo\\.1\\.\\(33|40\\) から
foo.2) マッチングは grep
-wF を使って行われます.
PLIST
PLIST は, a.out
のマイナー番号が0であれば, 短い (ELFの)
共有ライブラリの名前を含み, さもなくば長い (a.outの)
名前を含んでいる必要があります.
bsd.port.mk は 自動的に,
PORTOBJFORMAT が aout
であれば, .0 を
短い共有ライブラリの名前の行に付け加え,
PORTOBJFORMAT が elf
であれば, マイナー番号を
長い共有ライブラリの名前から削除します.
ELF システムで 2
つのバージョン番号を持つ共有ライブラリを インストールしたり,
aout システムで 1
つのバージョン番号しか持たない共有ライブラリを
インストールするのが避けられない場合
(例えば他のオペレーティングシステム用の
互換ライブラリをインストールする port など),
NO_FILTER_SHLIBS 変数を定義すれば,
前節で説明されている PLIST
編集の機能が停止されます.
ldconfig
Makefile 中の ldconfig
の行は以下のようになります.
${SETENV} OBJFORMAT=${PORTOBJFORMAT} ${LDCONFIG} -m ....
また PLIST 中では:
@exec /usr/bin/env OBJFORMAT=%%PORTOBJFORMAT%% /sbin/ldconfig -m ...
@unexec /usr/bin/env OBJFORMAT=%%PORTOBJFORMAT%% /sbin/ldconfig -R
となります. これは,
システムのデフォルトフォーマットではなく
パッケージのフォーマットに応じて, 正しい
ldconfig
が呼ばれることを保証するためのものです.
MASTERDIR
もし, あなたの port が 変数(例えば
解像度とか紙のサイズなど)を変えたりした,
ちょっと違うバージョンを作成する必要があるときには,
ユーザが分りやすいように, package
ごとに別々のサブディレクトリを作成し, ただし, できるだけ port
間でファイルを共有するようにしてください. 典型的な例では,
うまく変数を使えば,
とても短いMakefileだけ,
1つ以外のすべてのディレクトリに置くだけで済みます. その短い
Makefile には
MASTERDIR を使って,
残りのファイルがあるディレクトリを指定できます. また PKGNAME
の一部に変数に使って, package
が別々の名前を持つようにしてください.
以下が, とても良い例になるでしょう. これは
japanese/xdvi300/Makefile
の一部です:
PKGNAME= ja-xdvi${RESOLUTION}-17
:
# default
RESOLUTION?= 300
.if ${RESOLUTION} != 118 && ${RESOLUTION} != 240 && \
${RESOLUTION} != 300 && ${RESOLUTION} != 400
@${ECHO} "Error: invalid value for RESOLUTION: \"${RESOLUTION}\""
@${ECHO} "Possible values are: 118, 240, 300 (default) and 400."
@${FALSE}
.endif
japanese/xdvi300 は通常のパッチ,
package ファイルももっています. そこで,
make と入力すると,
デフォルトの解像度(300)を使って, 普通に port
の作成を行います.
他の解像度に関してですが, これが,
xdvi118/Makefile の(コメントを除いた)
すべてです.
RESOLUTION= 118
MASTERDIR= ${.CURDIR}/../xdvi300
.include ${MASTERDIR}/Makefile
(xdvi240/Makefile と
xdvi400/Makefile も同様です).
MASTERDIR が
bsd.port.mk に
PATCHDIR や PKGDIR
などの通常のサブディレクトリが xdvi300
にあることを教えます. RESOLUTION=118
の行が, xdvi300/Makefile の
RESOLUTION=300 の行を無効にし, port
は解像度を118として作成されます.
共有ライブラリのバージョン
まず,
共有ライブラリのバージョンについての指針 を読んで,
共有ライブラリのバージョンを
一般的にどうすれば良いかを理解してください. 盲目的に,
ソフトウエアの作者がちゃんと理解していると
信じててはいけません, 多くの場合違います.
細い点まで考慮することは大変重要なことです,
なぜなら我々は互換性がないかもしれない大量の
ソフトウェアを共存させようとする, 特殊な状況にあるからです.
不注意な port の導入が共有ライブラリに関して,
多大な問題を引き起したことが過去にあります (今まで,
jpeg-6b がなぜ 9.0
といバージョン番号を持っているか不思議に
思ったことはありませんか?). もし, 疑問があれば, &a.ports;
にメールを送ってください. ほとんどの時間は,
正しいシェアードライブラリのバージョンを決めることと,
それを実現するためのパッチを作成することに終始します.
しかしながら, が同じソフトウェアの違ったバージョンの
ソフトウェアが既にツリーにあるばあいには,
状況は非常に複雑です.
つまり, FreeBSD では,
ユーザがリンカにどのバージョンの共有ライブラリを
使用するかを指定できないからです
(リンカは常にもっとも高いバージョンを選びます). これは, もし,
libfoo.so.3.2 と
libfoo.so.4.0
がシステムに存在するときには,
リンカに特別なアプリケーションだけ
libfoo.so.3.2
をリンクするように指示する方法がないことを意味します. これは,
コンパイル時のリンクという意味では完全に見劣りします.
この場合の唯一の解決方法は, 共有ファイルの名前の
ベース 部分を変えることです. 例えば,
libfoo.so.4.0 を
libfoo4.so.1.0 へ変えることによって,
バージョン 3.2 とバージョン 4.0 共に他の port
からリンクされることができるようになります.
マニュアル
MAN[1-9LN] 変数を使用すると,
自動的にすべてのマニュアルを pkg/PLIST
に加えます (つまり, マニュアルを PLIST
に加えては いけません — PLIST の生成
を参照してください). またマニュアルを
/etc/make.conf 中の
NOMANCOMPRESS の設定に応じて,
install時に自動的に圧縮したり伸長したりします.
マニュアルをインストール時に圧縮するかどうかを
指定するには, MANCOMPRESSED
変数を使用します. この変数は, 3つの値をとることができます,
yes, no そして
maybe です. yes
はマニュアルが既に圧縮されて インストールされている,
no はされていない, maybe
はそのソフトウェアがすでに, NOMANCOMPRESS
に合わせており bsd.port.mk
が特別なにもする必要がないことを意味します.
USE_IMAKE がセットされていて,
NO_INSTALL_MANPAGES
がセットされていなければ, MANCOMPRESSED
は自動的に yes に設定され,
それ以外の場合には, no になります.
デフォルトがあなたの port
に合わない場合以外は明示的に設定する必要がありません.
PREFIX 以外のディレクトリの下に
マニュアルを置くような port では MANPREFIX
を指定することができます. さらに,
特定のセクションのマニュアルだけ,
標準ではない場所にインストールする場合, 例えばいくつかの Perl
のモジュールの ports など, には個々のマニュアルのパスを
MANsectPREFIX
(sect は, 1-9,
または, L か N
を表わします) によって指定できます. ができます.
マニュアルが, 言語特有のサブディレクトリに
置かれる場合には, 言語名を MANLANG
に設定してください. この変数のデフォルト値は,
"" になっています (つまり, 英語のみ).
これは, 全部をまとめた例です.
MAN1= foo.1
MAN3= bar.3
MAN4= baz.4
MANLANG= "" ja
MAN3PREFIX= ${PREFIX}/share/foobar
MANCOMPRESSED= yes
以下の6個のファイルがこの port でインストールされます.
${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
-
+
Motifを必要とするport
最近はコンパイルに Motif
を必要とするアプリケーションが増えて きました.
(Motif自体は有料のものがいくつかの会社から手に入りま すし,
多くのアプリケーションがコンパイル可能な無料の互換ライブラリ
が x11-toolkits/lesstifにあります)
Motifはかなり広く使われていますし, 製品のライ
センスではライブラリを静的にリンクした
実行形式は再配布が認めら れている場合が多いので,
Motifを必要とするソフトウェアを簡単に 動的(port
からコンパイルする人々のために)/静的(package を配布
する人々のために)にリンクできるような
しくみが用意されています.
REQUIRES_MOTIF
Motif
がないとコンパイルできないportのMakefileではこの変
数を指定してください. これによって,
Motifを持っていない人が
このportをコンパイルしようとするのを未然に防ぎます.
MOTIFLIB
この変数は bsd.port.mk によって
Motif ライブラリの指 定に置き換えられます.
ソース内のMakefileやImakefileで Motif
ライブラリを指定しているところをこの変数に置き換えるよ
うにパッチをあててください.
代表的な例としては以下の二つがあげられます:
MakefileかImakefileの中でMotifライブラリが
として使われている場合には,
かわりに MOTIFLIB
と書いてください.
Imakefileの中で XmClientLibs
が使われている 場合には, それを
${MOTIFLIB} ${XTOOLLIB}
${XLIB} と書きかえてください.
MOTIFLIB は通常
-L/usr/X11R6/lib -lXm か
/usr/X11R6/lib/libXm.a に置き換えら
れます. したがって前に や
をつけ る必要はありません.
X11 のフォント
もし, あなたの port が X window system
のフォントをインストールするのであれば, それらを
X11BASE/lib/X11/fonts/local
に置くようにしてください. このディレクトリは XFree86 release
3.3.3 で新設されたものです. もし,
それが存在しなければ作成し, ユーザに XFree86 を 3.3.3
かそれより新しいものに更新か, すくなくとも,
このディレクトリを /etc/XF86Config の
font path
に加えるように促すメッセージを出力するようにしてください.
Info ファイル
新しい版の texinfo(2.2.2-RELEASE
およびそれ以降に入っています) には,
install-info というコマンドが含まれており,
dir ファイルに項目を追加したり,
削除したりすることがで きます. もし, あなたの port が info
ドキュメントをインストー ルするのであれば, 以下の指示に従って,
その port および package が正しく, ユーザの
${PREFIX}/info/dir ファイル
を更新するようにしてください. (この節は,
とても長くてすいません, しかし info
ファイルを作りあげるためには, これらは不可欠 です.
正しく行なえば, 美しい
リストができますので, 辛抱してください! :)
まず, これを知っておかなければなりません:
&prompt.user; install-info --help
install-info [OPTION]... [INFO-FILE [DIR-FILE]]
Install INFO-FILE in the Info directory file DIR-FILE.
(訳注: Info ディレクトリの INO-FILE を DIR-FILE にインストールする)
Options:
--delete Delete existing entries in INFO-FILE;
don't insert any new entries.
(訳注: INFO-FILE の中の項目を削除,
新しい項目は一切追加しない.)
:
--entry=TEXT Insert TEXT as an Info directory entry.
(訳注: TEXT を Info ディレクトリの項目として追加する.)
:
--section=SEC Put this file's entries in section SEC of the directory.
(訳注: このファイルの項目を Info ディレクトリの SEC
という節に置く.)
:
このプログラムは, 実際には info
ファイルをインストール しません, 単に
dir
ファイルにエントリーを挿入したり削除し
たりするだけです.
これから, install-info
を使用するように, ports を変換す る7段階の工程を示します.
例として editors/emacsを
使用します.
まず, texinfo のソースを見て,
@dircategory と
@direntry 文がないファイルについて,
それらを追加するパッチを作成します. 以下は,
ここでの例での patchの一部です:
--- ./man/vip.texi.org Fri Jun 16 15:31:11 1995
+++ ./man/vip.texi Tue May 20 01:28:33 1997
@@ -2,6 +2,10 @@
@setfilename ../info/vip
@settitle VIP
+@dircategory The Emacs editor and associated tools
+@direntry
+* VIP: (vip). A VI-emulation for Emacs.
+@end direntry
@iftex
@finalout
:
フォーマットについては見ればわかると思います.
dir
というファイルに必要な項目を書いておいてくれる作者
も多いので, まず自分で書く前にさがしてみてください. また,
関係 する ports も調べて, 節(section)の名前や,
インデントなどが
きちんと合っているかどうかを確認してください
(項目のテキスト は, すべて4つめのタブ・ストップ(tab
stop)から始めることを推 奨します).
1つのファイルに対して1つの info
の項目しか書けないことに注 意してください, これは,
install-info --delete が, そのバグにより,
@direntry セクションに複数の項目を書
いても,
初めの1つの項目しか削除してくれないからです.
texinfo のソースにパッチをあてるかわりに,
dir の項目 を
install-info の
引数((,
) として与えることもできます.
これはあまり良い方法とは 思えません, なぜなら,
同じ情報を3ヶ所(Makefile,
PLIST の
@exec/@unexec:
以下参照) に重複して, 書く必要があるからです.
しかしながら, もし日本語(あるいは, 他のマルチバイト文字)の
info ファイルがあるのならば,
install-info
の特別な引数を使用する必要があるでしょう, なぜならば,
makeinfo がこのような texinfo
ソースファイル を扱えないからです.
(このようなものをどう扱うかの例としては,
japanese/skk の
Makefile と
PLIST を見て ください.)
portのディレクトリに戻って, make clean;
make をして, info ファイルが texinfo
ソースファイルから再び生成さ れることを確認してください.
texinfo ソースファイルのほうが info
ファイルよりも新しいので, make
とタイプすれば, info ファイルは再構築されるはずですが,
多くの Makefile には info
ファイルの正しい依存関係が書かれていません.
emacs の場合, info
ファイルの再構築ため, man
サブディレクトリ に降りていくようにするために, メインの
Makefile.in にパッ
チをあてる必要がありました.
--- ./Makefile.in.org Mon Aug 19 21:12:19 1996
+++ ./Makefile.in Tue Apr 15 00:15:28 1997
@@ -184,7 +184,7 @@
# Subdirectories to make recursively. `lisp' is not included
# because the compiled lisp files are part of the distribution
# and you cannot remake them without installing Emacs first.
-SUBDIR = lib-src src
+SUBDIR = lib-src src man
# The makefiles of the directories in $SUBDIR.
SUBDIR_MAKEFILES = lib-src/Makefile man/Makefile src/Makefile oldXMenu/Makefile lwlib/Makefile
--- ./man/Makefile.in.org Thu Jun 27 15:27:19 1996
+++ ./man/Makefile.in Tue Apr 15 00:29:52 1997
@@ -66,6 +66,7 @@
${srcdir}/gnu1.texi \
${srcdir}/glossary.texi
+all: info
info: $(INFO_TARGETS)
dvi: $(DVI_TARGETS)
man
サブディレクトリでのデフォルトターゲットは,
info で呼ばれるのに対して,
メインの Makefile では,
all で呼びたいので,
2つめのpatchが必要でした. また, info
info ファイルのインストールも削除しました, なぜなら,
同じものが同じ名前で既に
/usr/share/info にあるからです.
(このパッチはここにはありません.)
もし, Makefile に
dir ファイルをインストールす
る個所があれば, 削除します. あなたの port がインストー
ルしてはいけません. また, dir
ファイルを壊してしまうよう
なコマンドの類も削除します.
--- ./Makefile.in.org Mon Aug 19 21:12:19 1996
+++ ./Makefile.in Mon Apr 14 23:38:07 1997
@@ -368,14 +368,8 @@
if [ `(cd ${srcdir}/info && /bin/pwd)` != `(cd ${infodir} && /bin/pwd)` ]; \
then \
(cd ${infodir}; \
- if [ -f dir ]; then \
- if [ ! -f dir.old ]; then mv -f dir dir.old; \
- else mv -f dir dir.bak; fi; \
- fi; \
cd ${srcdir}/info ; \
- (cd $${thisdir}; ${INSTALL_DATA} ${srcdir}/info/dir ${infodir}/dir); \
- (cd $${thisdir}; chmod a+r ${infodir}/dir); \
for f in ccmode* cl* dired-x* ediff* emacs* forms* gnus* info* message* mh-e* sc* vip*; do \
(cd $${thisdir}; \
${INSTALL_DATA} ${srcdir}/info/$$f ${infodir}/$$f; \
chmod a+r ${infodir}/$$f); \
(これは, 既存のportを修正するときのみ必要です.)
pkg/PLIST を見て,
info/dir にパッチをあて
ようとするものすべてを削除します. これらは,
pkg/INSTALL
やその他のファイルにもあるかもしれない ので,
いろいろさがしてみてください.
Index: pkg/PLIST
===================================================================
RCS file: /usr/cvs/ports/editors/emacs/pkg/PLIST,v
retrieving revision 1.15
diff -u -r1.15 PLIST
--- PLIST 1997/03/04 08:04:00 1.15
+++ PLIST 1997/04/15 06:32:12
@@ -15,9 +15,6 @@
man/man1/emacs.1.gz
man/man1/etags.1.gz
man/man1/ctags.1.gz
-@unexec cp %D/info/dir %D/info/dir.bak
-info/dir
-@unexec cp %D/info/dir.bak %D/info/dir
info/cl
info/cl-1
info/cl-2
post-install ターゲットを
Makefile に加えて,
dir
ファイルが存在しなければ作成するようにします. また,
インストールされた info ファイルについては,
install-info
を実行するようします.
Index: Makefile
===================================================================
RCS file: /usr/cvs/ports/editors/emacs/Makefile,v
retrieving revision 1.26
diff -u -r1.26 Makefile
--- Makefile 1996/11/19 13:14:40 1.26
+++ Makefile 1997/05/20 10:25:09 1.28
@@ -20,5 +20,11 @@
post-install:
.for file in emacs-19.34 emacsclient etags ctags b2m
strip ${PREFIX}/bin/${file}
.endfor
+ if [ ! -f ${PREFIX}/info/dir ]; then \
+ ${SED} -ne '1,/Menu:/p' /usr/share/info/dir > ${PREFIX}/info/dir; \
+ fi
+.for info in emacs vip viper forms gnus mh-e cl sc dired-x ediff ccmode
+ install-info ${PREFIX}/info/${info} ${PREFIX}/info/dir
+.endfor
.include <bsd.port.mk>
新しい info ファイルを作成するのに,
/usr/share/info/dir と上のコマンド,
以外は使用しな いでください. 実際のところ, もし port
する人がこれに関して PLIST
に自らまったく手を加える必要がないのであれば, 上
のパッチのはじめの3行を bsd.port.mk
に加えたでしょう.
PLIST を編集して, 同じ働きをする
@exec 文, そ
れにpkg_delete のために
@unexec 文を加えてくださ い.
@unexec を使用して
info/dir を削除する必
要はありません.
Index: pkg/PLIST
===================================================================
RCS file: /usr/cvs/ports/editors/emacs/pkg/PLIST,v
retrieving revision 1.15
diff -u -r1.15 PLIST
--- PLIST 1997/03/04 08:04:00 1.15
+++ PLIST 1997/05/20 10:25:12 1.17
@@ -16,7 +14,15 @@
man/man1/etags.1.gz
man/man1/ctags.1.gz
+@unexec install-info --delete %D/info/emacs %D/info/dir
:
+@unexec install-info --delete %D/info/ccmode %D/info/dir
info/cl
info/cl-1
@@ -87,6 +94,18 @@
info/viper-3
info/viper-4
+@exec [ -f %D/info/dir ] || sed -ne '1,/Menu:/p' /usr/share/info/dir > %D/info/dir
+@exec install-info %D/info/emacs %D/info/dir
:
+@exec install-info %D/info/ccmode %D/info/dir
libexec/emacs/19.34/i386--freebsd/cvtmail
libexec/emacs/19.34/i386--freebsd/digest-doc
@unexec install-info --delete
コマンドは, info ファイル自身より先に置き,
コマンドがファイルを読めるようにし
ておかなければならないことに注意してください. また,
@exec install-info コマンドは info
ファイルおよび dir ファイルを作る
@exec コマンドより後に
おかなければなりません.
テスト
をして出来栄えに感服しましょう :) 各段階の前後に,
dir
ファイルをチェックしましょう.
pkg/ サブディレクトリ
まだ触れていない, いくつかのこつが
pkg/ サブディレクトリにはあり,
時として便利でしょう.
MESSAGE
もし, インストールする人にメッセージを表示する
必要がある場合には, そのメッセージを
pkg/MESSAGE に置けます. この機能は,
pkg_add
の後の追加のインストール手続きを表示するときなどに,
重宝します.
pkg/MESSAGE ファイルは
pkg/PLIST に加える必要はありません.
また, もしユーザが package ではなく port を使用して
いる場合には自動的には表示されませんので, 明示的に
post-install
で表示するようにするべきでしょう.
INSTALL
バイナリパッケージが pkg_add
でインストールされるときに, 実行される必要がある
コマンドがあれば, pkg/INSTALL
スクリプトを使って実行することができます.
このスクリプトは自動的に package に加えられ,
pkg_add によって2度実行されます. はじめは
INSTALL ${PKGNAME} PRE-INSTALL
と実行され, 2度目には, INSTALL ${PKGNAME}
POST-INSTALL と実行されます.
どちらのモードで実行されているかは,
$2 を調べることによってわかります.
環境変数 PKG_PREFIX には package
がインストールされるディレクトリが設定されます. 詳細は
&man.pkg.add.1; を見てください.
port を make install で
インストールするときには,
このスクリプトは自動的に実行されません. もし,
実行される必要があるならば, port の Makefile
から明示的に呼ぶ必要があります.
REQ
port が(インストールされるシステムの状態によって)
インストールされるべきか, されないべきか区別する必要が
あるときには, “要件(requirements)” スクリプト
pkg/REQ を作ることができます. これは,
インストール及びデインストール (package
の削除)の時に自動的に実行され,
それらが処理されるべきかを決定します.
make の変数にあわせた PLIST
の変更
いくつかの port, 特に p5- portsなど, は configure
のオプション (あるいは, p5- ports の場合は perl
のバージョン)によって, PLIST
を変える必要があります. これを容易に実現するために,
PLIST 中の
%%OSREL%%,
%%PERL_VER%%,
%%PERL_VERSION%% は,
適切に置き換えられるようになっています.
%%OSREL%% の値は,
オペレーティングシステムの数字で表されたリビジョンです
(例えば, 2.2.7).
%%PERL_VERSION%% は perl
のバージョン番号全体(例えば, 5.00502 )で,
%%PERL_VER%% はバージョン番号から,
パッチレベルを引いてものです(例えば,
5.005).
他の置き換えが必要であれば, PLIST_SUB
変数に
VAR=VALUE
という形式のペアのリストを設定することによって,
PLIST 中の
%%VAR%% は
VALUE に置き換えられます. 例えば,
バージョンに固有の沢山のファイルを インストールする場合には,
Makefile に
OCTAVE_VERSION= 2.0.13
PLIST_SUB= OCTAVE_VERSION=${OCTAVE_VERSION}
と書いて, PLIST
中のバージョン番号が表われるすべてのところに,
%%OCTAVE_VERSION%% と書きます.
このようにしておけば, port をアップグレードするときに,
何十行(ときとして, 何百行)も PLIST
を書き替えないですみます.
この書き換えは (
マニュアル の追加も)
do-install と
post-install ターゲット のあいだに,
PLIST を読み TMPPLIST
(デフォルトは,
WRKDIR/.PLIST.mktmp )
に書き込むことによって行なわれます. もし, あなたの port が
PLIST を実行時に生成するのであれば,
do-install のあいだか,
その前に行うようにしてください. また,
書きかえられたあとのファイルを編集する必要がある場合には,
post-install で,
TMPPLIST を書きかえてください.
pkg
サブディレクトリにあるファイル名の変更
pkg
サブディレクトリにあるファイルは全て, 変数を
使用して定義されていますので, 必要であれば
Makefile 中で 変更可能です. いくつかの
ports で 一つの pkg
サブディレクトリを共有する場合や, 上記のファイルに書き込む
必要があるときなど, 特に便利です. (pkg
サブディレクトリに直接書き込むのが良くない理由に ついては
WRKDIR
以外への書きこみ を参照してください.)
以下が変数名とそのデフォルト値の表です.
Variable
Default value
COMMENT
${PKGDIR}/DESCR
DESCR
${PKGDIR}/DESCR
PLIST
${PKGDIR}/PLIST
PKGINSTALL
${PKGDIR}/PKGINSTALL
PKGDEINSTALL
${PKGDIR}/PKGDEINSTALL
PKGREQ
${PKGDIR}/REQ
PKGMESSAGE
${PKGDIR}/MESSAGE
PKG_ARGSを上書きせずに,
これらの変数を変更 するようにしてください.
PKG_ARGSを変更すると これらのファイルは
port から正しく /var/db/pkg
にインストールされなくなります.
ライセンス上の問題
ソフトウェアによっては制限の厳しい
ライセンスがついてきたり, 法律的に問題があるかもしれません.
(PKPの公開鍵暗号化, ITAR (暗 号化ソフトウェアの輸出)
などが例としてあげられます). それらを
どう扱えばいいかはライセンスの文面によって
さまざまな場合があり ます.
ソフトウェア移植者として,
あなたにはライセンスをよく読み, FreeBSD プロジェクトが FTP
または CD-ROM で配布してはいけないソフ
トウェアを配布してしまうことのないよう,
注意する義務があります. なにか疑問がある場合には,
&a.ports;に聞いてみてください.
よく見られるケースに対処するために,
二つの変数が用意されてい ます:
ソフトウェアに “有償再配布を禁ずる”
という趣旨のライセン スがついてきた場合には
NO_CDROM
という変数にその理由を記述して ください.
私たちはこれがついているportはCD-ROMリリースに入
れないようにしますが,
オリジナルのソースファイルとpackage
はFTPでは取れるようにしておきます.
もしも, 生成される package
が個々のサイトで独自に構築さ れる必要があったり,
ライセンスによって生成されるバイナリが
配布できない場合には, NO_PACKAGE
変数にその理由を記述してくだ さい. そのような package が
FTP サイトに置かれたり, リリース 時の CD-ROM
へ入らないようにします. ただし, いずれの場合も distfile
は(FTP や CD-ROM に)含まれるようになります.
Portが, 使用者によっては法律上の問題が生じる時
(暗号化ソフ トウェアなど),
または“商用利用を禁ずる”とライセンスに書い
てある場合には
RESTRICTEDという変数にその理由を入れ
てください. この場合には,
ソースファイルやpackageは私たちの
FTPサイトにも置かれません.
GNU一般公有使用許諾書 (GPL) はバージョン1, 2とも
port作成上は何ら問題にはなりません.
もしあなたが,ソースツリー管理者 (committer)
であれば, ソースツリーにこのようなportを入れる際に,
ports/LEGAL
ファイルを書き換えるのを忘れないようにし
てください.
アップグレード
Port
のバージョンが原作者からのものに比べて古いことに気がつ
いたら, まずはあなたの持っているportが私たちの最新のもの
(ミラー サイトの ports/ports-current
というディレクトリにあります)
であることを確認してください.
次に, portの Makefile
にMAINTAINER (保守担当者) の
アドレスが書いてある場合には,
その人にメールを出してみましょう.
保守担当者の人がすでにアップグレードの準備を
しているかもしれま せんし,
(新しいバージョンの安定度に問題があるなど) あえてアッ
プグレードをしない理由があるのかもしれません.
保守担当者にアップグレードをしてくれと頼まれた場合,
あるいは
そもそもportのMakefileに保守担当者が書いてない場合などは, あ
なたがアップグレードをしてくださると助かります.
その場合にはアッ プグレードをしたのち,
変更前と変更後のディレクトリの再帰的diff (unified diff と
context diff のどちらでもいいのですが, port のコミッター達は
unified diff のほうを好むようです) をとって送ってください.
(例えば, 変更前のディレクトリが
superedit.bak という名前でとってあり,
変更後のもの が superedit
に入っているなら, diff -ruN superedit.bak
superedit の結果を送ってください. ) diff
の出力を見て, すべての変更が正しくなされているか確認して
ください. 変更箇所については, &man.send-pr.1; (カテゴリーは,
ports)に diff の出力結果を添えて,
私たちに送ってもらうのが一 番よいです. commit する際に CVS
に明確に記述しなければならない ので,
付け加えたり削除したりしたファイルがあったら, それについ
て書いておいてください. もし diff の大きさが 20 KB 程度を
超えるようであれば, 圧縮したものを uuencode して下さい.
そうでなければそのまま PR に入れるだけでいいです.
繰り返しになりますが, ports の変更を送るときには,
&man.shar.1; ではなく &man.diff.1;
を使用してください.
やっていいことといけないこと
この節では,
ソフトウェアをportする上でよくある落し穴などにつ
いて説明します. このリストを使って, あなた自身が作成した port
のチェックはもとより, PR データベースにある, 他の人が作成した
port のチェックもできます. あなたがチェックした port について
のコメントを バグ報告と一般的な論評
にしたがって, 送ってください. PR データベースにある port を
チェックすることによって, 私達がそれらを commit
するのを早くし,
あなたが何をしているか理解していることも示します.
バイナリのstrip
バイナリは strip してください.
オリジナルのソースがバイナリを strip
してくれる場合は良いですが, そうでない場合には
post-install ターゲットを指定して strip
するようにするとよいでしょう. 例えば,
こんな風になります:
post-install:
strip ${PREFIX}/bin/xdl
インストールされた実行形式がすでに strip
されているかどうかは file
コマンドで確認できます. これが`not
stripped'と言わなければ,
stripされているということです.
INSTALL_* マクロ
あなた自身の *-install
ターゲットでファイルの正しいモードと オーナを保証するために,
必ずbsd.port.mkで提供されて
いるマクロを使用してください.
マクロは以下のようなものがあります.
${INSTALL_PROGRAM}
は実行可能なバイナリを
インストールするコマンドです.
${INSTALL_SCRIPT}
は実行可能なスクリプトを
インストールするコマンドです.
${INSTALL_DATA}
は共有可能なデータを
インストールするコマンドです.
${INSTALL_MAN}
はマニュアルとその他のドキュメ
ントをインストールするコマンドです.
(圧縮はしません)
これらは基本的に install
コマンドに適当なフラグを与え たものです.
どのようにこれらを使用するかは以下の例を見てください.
WRKDIR
WKRDIR
の外のファイルにはなにも書き込まないように してください. WRKDIR は
ports のビルド中に書き込こめる
ことが保証されている唯一の場所です( CDROM から ports
をコンパイルを参照). PKGDIR
にあるファイルを修正する必要がある ときには, 変数の再定義
によって行ない, 上書きはしないでください.
-
+
WRKDIRPREFIX
WRKDIRPREFIX
を尊重していることを確認してください. 特に, 別の port の
WRKDIR を参照している
ときには気を付けてください. 正しい場所は,
WRKDIRPREFIX
PORTSDIR
/subdir/
name/work, です,
PORTSDIR/subdir/
name/work とか
.CURDIR/../../subdir
/name/work
とかではありません.
また, 自分で WRKDIR 定義するときには,
頭に
${WRKDIRPREFIX}${.CURDIR}
が付いている 事を確認してください.
OS や OS のバージョンの区別
Port の過程で, 修正や, どのバージョンの UNIX
で動くかによる条件つきコンパイルなどが
必要なコードに出会うかもしれません.
そのような条件つきコンパイルなどのための
変更をおこなうときには, FreeBSD 1.x システムへの移植や,
CSRGの4.4BSD, BSD/386, 386BSD, NetBSD, OpenBSD
などの他のBSDシステムへの移植が可能なように,
できるだけ普遍的な変更をおこなうことを
心がけてください.
4.3BSD/Reno (1990) およびそれより新しい BSD
版を古いバージョンと区別するには BSD
マクロを利用するのがよいでしょう. これは
<sys/param.h> で定義されています.
このファイルがすでにインクルードされていればよいのですが,
もしそうでない場合には以下のコードを, その
.c
ファイルの適当な場所に加えてください.
#if (defined(__unix__) || defined(unix)) && !defined(USG)
#include <sys/param.h>
#endif
これらの 2
つのシンボルが定義されているすべてのシステムには
sys/param.h があるはずです. もし,
そうでないシステムを発見したら我々にも教えてください.
&a.ports; までメールを送ってください.
あるいは, GNU の Autoconf
のスタイルを使用することもできます,
#ifdef HAVE_SYS_PARAM_H
#include <sys/param.h>
#endif
この方法を使用するときには,
Makefile 中の
CFLAGSに
-DHAVE_SYS_PARAM_H
を加えることを忘れないようにしてください.
いったん sys/param.h
がインクルードされると,
#if (defined(BSD) && (BSD >= 199103))
このようにしてそのコードが 4.3 Net2 コードベース,
またはそれより新しいもの (例: FreeBSD 1.x, 4.3/Reno, NetBSD
0.9, 386BSD, BSD/386 1.1とそれ以前)
の上でコンパイルされているかを検出できます.
#if (defined(BSD) && (BSD >= 199306))
これは, 4.4コードベース, またはそれより新しいもの (例:
FreeBSD 2.x, 4.4, NetBSD 1.0, BSD/386 2.0とそれ以後)
の上でコンパイルされているかどうかを
検出するために使用します.
4.4BSD-Lite2 コードベースでは, BSD
マクロの値は 199506 になっています.
これは参考程度の意味合いしかありません. 4.4-Lite ベースの
FreeBSD と 4.4-Lite2 での変更がマージされたバージョンとを
区別するのに使用するべきものではありません.
この目的のためには, __FreeBSD__
マクロをかわりに使用してください.
以下は控え目に使ってください.
__FreeBSD__
はFreeBSDのすべての版で定義されています. 変更が
FreeBSD
だけに適用されるとき以外は使用しないでください.
Portでよくある, strerror()
ではなく sys_errlist[]
を使うなどは, FreeBSDでの変更ではなく, BSD
の流儀です.
FreeBSD 2.xでは __FreeBSD__ が
2 と定義されています.
それ以前の版では 1 になっています.
その後の版では,
そのメジャー番号に合うように上がっていきます.
もし, FreeBSD 1.x システムと FreeBSD 2.x あるいは
FreeBSD 3.x システムを区別する必要があれば, 上で述べた
BSDマクロを使用するのが,
大抵の場合において正しい答です. もし,
FreeBSD特有の変更であれば (ld
を使うときのシェアードライブラリ用のなオプションなど),
__FreeBSD__を使い #if
__FreeBSD__ > 1 のようにFreeBSD 2.x
および, それ以降のシステムを検出するのはかまいません.
もし,
2.0-RELEASE以降のFreeBSDシステムを細かく検出したけれ ば,
以下を使用することができます.
#if __FreeBSD__ >= 2
#include <osreldate.h>
# if __FreeBSD_version >= 199504
/* 2.0.5+ release specific code here */
# endif
#endif
Release
__FreeBSD_version
2.0-RELEASE
119411
2.1-CURRENT's
199501, 199503
2.0.5-RELEASE
199504
2.1 以前の 2.2-CURRENT
199508
2.1.0-RELEASE
199511
2.1.5 以前の 2.2-CURRENT
199512
2.1.5-RELEASE
199607
2.1.6 以前の 2.2-CURRENT
199608
2.1.6-RELEASE
199612
2.1.7-RELEASE
199612
2.2-RELEASE
220000
2.2.1-RELEASE
220000 (2.2-RELEASE と同じです)
2.2.1-RELEASE 以後の 2.2-STABLE
220000 (これも同じです)
texinfo-3.9 以後の 2.2-STABLE
221001
top 導入以後の 2.2-STABLE
221002
2.2.2-RELEASE
222000
2.2.2-RELEASE 以後の 2.2-STABLE
222001
2.2.5-RELEASE
225000
2.2.5-RELEASE 以後の 2.2-STABLE
225001
ldconfig -R 以後の 2.2-STABLE
225002
2.2.6-RELEASE
226000
2.2.7-RELEASE
227000
2.2.7-RELEASE 以後の 2.2-STABLE
227001
semctl(2) 変更後の 2.2-STABLE
227002
2.2.8-RELEASE
228000
2.2.8-RELEASE 以後の 2.2-STABLE
228001
mount(2) 変更以前の 3.0-CURRENT
300000
mount(2) 変更以後の 3.0-CURRENT
300001
semctl(2) 変更以後の 3.0-CURRENT
300002
ioctl 引数変更後の 3.0-CURRENT
300003
ELF 移行後の 3.0-CURRENT
300004
3.0-RELEASE
300005
3.0-RELEASE 以後の 3.0-CURRENT
300006
3/4 の分岐後の 3.0-STABLE
300007
3.1-RELEASE
310000
3.1-RELEASE 以後の 3.1-STABLE
310001
3/4 の分岐後の 4.0-CURRENT
400000
(2.2-STABLE は, 2.2.5-RELESE 以後,
“2.2.5-STABLE” と呼ばれることがあります.)
見ての通り,
これは年・月というフォーマットになっていましたが,
バージョン 2.2 から,
より直接的にメジャー/マイナー番号を使う
ように変更になりました.
並行していくつかのブランチ(枝分かれし
たバージョン)を開発する場合には,
リリースされた日付でそれらの
リリースを分類することが不可能だからです. (あなたが今 port
を作成するときに, 古い -CURRENT 達について心配
する必要はありません.
これは参考のために挙げられているにすぎま せん.)
これまで, 何百ものportが作られてきましたが,
__FreeBSD__ が正しく使われたのは,
1つか2つの場合だけでしょう.
以前のportが誤った場所でそのマクロを使っているからと いって,
それをまねする理由はありません.
bsd.port.mk の後に書くこと
.include <bsd.port.mk>
の行の後には なにも書かないようにしてください. 大抵の場合は
Makefile の 中程のどこかで,
bsd.port.pre.mk を include して, 最後に
bsd.port.pre.mk を include
することによって避けることができます.
pre.mk/post.mk
のペアか bsd.port.mk
だけのどちらかだけを include してください.
2つを混ぜないでください.
前者は, いくつかの変数の定義だけ をして,
Makefile でのテストに使用し,
後者は残りを定義します.
以下は bsd.port.pre.mk
で定義される重要な変数です. (これは, すべてではありません.
完全なリストは bsd.port.mk
を参照してください.)
変数名
解説
ARCH
uname -m で返される
アーキテクチャ. (例, i386).
OPSYS
uname -s で返される
オペレーティングシステム (例,
FreeBSD).
OSREL
オペレーティングシステムの
リリースバージョン
(例., 2.1.5,
2.2.7).
OSVERSION
数字形式のオペレーティングシステム
のバージョン,
上記の
__FreeBSD_version
と同じです.
PORTOBJFORMAT
システムのオブジェクト
フォーマット (aout あるいは
elf).
LOCALBASE
“local” ツリーのベース.
(例, /usr/local/).
X11BASE
“X11” ツリーのベース.
(例, /usr/X11R6/).
PREFIX
portsのインストール先
(
PREFIXについてを参照).
USE_IMAKE,
USE_X_PREFIX あるいは
MASTERDIR
などの変数を定義する必要がある場合には,
bsd.port.pre.mk を include
する前に定義してください. 他のものは,
bsd.port.pre.mk
の前でも後でもかまいません.
以下は bsd.port.pre.mk
の後に書けるものの例です:
# no need to compile lang/perl5 if perl5 is already in system
.if ${OSVERSION} > 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
付加的ドキュメント
普通のマニュアルや info
ファイルのほかにユーザにとって有用だ
と思えるようなドキュメントがある場合には,
PREFIX/share/doc
の下にインストールしてく ださい. これは前記と同様,
post-installターゲットの
中からするのがいいでしょう.
まず, あなたのportのために新しいディレクトリを作りま す.
どのportのドキュメントか簡単にわかるような名前にする必
要がありますので, 普通は PKGNAME
からバージョ ン番号を除いた部分を使うといいでしょう.
もちろん, ユーザが異
なるバージョンのものを同時に使うことが予想される port の場合
には, PKGNAME
をそのまま使ってかまいません.
ユーザが /etc/make.conf
でこの部分を禁止するために NOPORTDOCS
という変数をセットしている場合には, これらのドキュメントが
インストールされないようにしてください. こんな具合です.
post-install:
.if !defined(NOPORTDOCS)
${MKDIR}${PREFIX}/share/doc/xv
${INSTALL_MAN} ${WRKSRC}/docs/xvdocs.ps ${PREFIX}/share/doc/xv
.endif
これらのファイルを pkg/PLIST
に入れるのを忘れないよ うにしてください.
(packageが/etc/make.conf内の
変数を読む方法は今のところ存在しませんので,
NOPORTDOCS
については気にしないでください.)
インストール時に pkg/MESSAGE
ファイルを利用して, メッセージを表示することができます.
詳細は pkg/MESSAGE を使う
の節を参照してください.
MESSAGE ファイルは
pkg/PLIST に加える必要はありま
せん.
DIST_SUBDIR
/usr/ports/distfiles
ディレクトリ内をあまり散らかさ ないようにしてください.
たくさんのファイルを取ってくるport や,
数は少なくてもほかのportのファイルと混同されるおそれが
あるファイル (Makefile など)
がある場合には, DIST_SUBDIR に port
の名前 (PKGNAME
からバージョン番号を取った部分を 使うといいでしょう)
を入れてください. すると,
DISTDIRがデフォルトの
/usr/ports/distfiles から
/usr/ports/distfiles/DIST_SUBDIR
に変更され,
取ってきたファイルはすべてそのサブディレクトリの中に置か
れるようになります.
また,
ファイルを取ってくるときにバックアップサイトとして使わ れる
ftp.freebsd.org
のディレクトリ名にもこの変数の 値が使われます.
(DISTDIRを明示的に指定し た場合には,
ローカルのファイルを置くところは変わりますが, こ
のサイトのディレクトリ名は変わりませんので, 必ず
DIST_SUBDIRを使うようにしてください.)
この変数はMakefile中で明示的に指定された
MASTER_SITES
には影響しないことに注意して ください.
RCS文字列
RCS
が特別な意味を与えている文字列をパッチ内に入れないように
してください.
ファイルを私たちのソースツリーに入れる時にこれら
の文字列はCVSによって書き換えられてしまい, あとでまたパッチ
を使おうとした時にうまくいかないことがあります. RCS文字列は
ドル記号 ($) で囲まれており,
$Id や $RCS
などで始まり ます.
パッチ作成上の注意
diffの再帰 ()
フラグを使って再帰的なパッ チを作るのは大変結構なのですが,
でき上がったパッチは必ず目で
チェックして余計なゴミが入っていないことを確認してくださ い.
よくあるのはバックアップファイル同士の変更点, あるいは
Imake や GNU configure
を使うソフトウェアの Makefile
の変更点が入っている場合などです. また,
configure.in を編集して,
autoconf を使って
configure を作り直す ときには,
configure の diff は含めずに (それらは,
数千行になることもしばしばです),
USE_AUTOCONF=yes を定義して,
configure.in の diff
をとってください.
ファイルをまるごと消す場合にはパッチを使わずに
post-extract
ターゲットで消す方が簡単です. できあがった 差分に満足したら,
それらをソースのファイルごとに別々の
パッチファイルに分割してください.
PREFIX
なるべく port は PREFIX
に対する相対パス
にインストールすることができるように心がけてください.
(この変数の値は USE_X_PREFIXか
USE_IMAKEが指定してある時には
X11BASE
(デフォルト/usr/X11R6),
そうでない場合にはLOCALBASE
(デフォルト/usr/local)
にセットされます.)
サイトによってフリーソフトウェアが
インストールされる場所が 違いますので, ソース内で
/usr/local や
/usr/X11R6
を明示的に書かないようにしてください. X のプログラムで
imake を使うものについては, これは問題に
はなりません. それ以外の場合には, ソース中のMakefileやスク
リプトで
/usr/local (imakeを使わないXのプログラ
ムは /usr/X11R6) と書いてあるところを
PREFIX に書き換えてください. この値は
portのコンパイル,
およびインストール時に自動的に環境変数として
下位makeに渡されます.
USE_X_PREFIXは本当に必要な時 (つまり,
X のライブラリなどとリンクしたり, X11BASE
以下にある ファイルを参照したりする必要がある時)
以外には設定しないでください.
変数 PREFIX の値は port の Makefile
やユーザの環境で変更することもできます. しかし, 個々の port
が Makefile
でこの変数の値を明示的に設定することはなるべくしない
でください.
また, 他の port
からインストールされるプログラムやファイル
を指定するときには, 上で述べた変数を使用してください.
例えば, less のフルパスを
PAGER というマクロに入れた い場合は,
コンパイラに
-DPAGER=\"/usr/local/bin/less\"
と渡すかわりに
-DPAGER=\"${PREFIX}/bin/less\"
(Xを使うportの時は
-DPAGER=\"${LOCALBASE}/bin/less\" )
を渡し てください. こうしておけば, `/usr/local'
がまるごとどこか他 の場所に移してあるサイトでも,
あなたのportがそのまま使える 可能性が高くなります.
ディレクトリ構成
インストール時には PREFIX
の正しいサブディ
レクトリにファイルを置くように心がけてください. ソフトウェア
によっては新しいディレクトリを
一つ作ってファイルを全部それに 入れてしまうものがありますが,
それはよくありません. また, バ イナリ,
ヘッダファイルとマニュアル以外のすべてを
lib
というディレクトリに入れてしまうportもあります が,
これもBSD的なファイルシステム構成からいうと正しくありま
せん. これは以下のように分散すべきです.
etc にセッ
トアップ/コンフィグレーションファイル,
libexec に 内部で使用されるプログラム
(コマンドラインから呼ばれることの ないコマンド),
sbin に管理者用のコマンド,
info に GNU Info 用のドキュメント,
そして share
にアーキテクチャに依存しないファイルが入り ます.
詳細については man &man.hier.7; を見てくださ い.
/usrの構成方針はほとんどそのまま
/usr/localにもあてはまります. USENET
“ニュース”を 扱う ports は例外です. これらは,
ファイルのインストール先として
PREFIX/news
を使用します.
空のディレクトリの除去
ports は デインストール(削除) の際には,
自分自身を消去したあとに, (ディレクトリの)
除去をするようにしてください. これは, 大抵の場合
@dirrm の行を ports
が作成するすべてのディレクトリについて
加えることによって実現できます. 親ディレクトリは,
子ディレクトリを先に消さないと
消せないことに気をつけて下さい.
:
lib/X11/oneko/pixmaps/cat.xpm
lib/X11/oneko/sounds/cat.au
:
@dirrm lib/X11/oneko/pixmals
@dirrm lib/X11/oneko/sounds
@dirrm lib/X11/oneko
といった感じです.
しかし, ときとして, 他の port
をディレクトリを共有しているために @dirrm
がエラーを返すことがあります. rmdir を
@unexec から呼びだすことによって,
警告(warning)なしで
空のディレクトリのみを削除することができます:
@unexec rmdir %D/share/doc/gimp 2>/dev/null || true
これを使えば, たとえ, 他の port がファイルを
インストールしていて,
PREFIX/share/doc/gimp
が空でない場合でも エラーメッセージは表示されませんし,
pkg_delete
が異常終了することもありません.
UID
もしあなたの
portがインストールされるシステム上に特定のユー
ザを必要とする場合は, pkg/INSTALL
スクリプトから pw
コマンドを実行して自動的にそのユーザを追加するよ
うにしてください. net/cvsup-mirror の
portが参考になるでしょう.
もしあなたの port が, バイナリのパッケージとしてとして
インストールされるときにも,
コンパイルされたときと同じユーザー/グループ ID
を使わなければならないのなら, 50 から 99 の間で空いている
UID を選んで登録してください.
japanese/Wnn の port
が参考になるでしょう.
既にシステムや他の portで利用されている
UIDを使わないように 十分注意してください. 現在の 50から
99までの間の UIDは以下の とおりです.
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
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:/nonexistent
wnn:*:69:7:Wnn:/nonexistent:/nonexistent
ifmail:*:70:66:Ifmail user:/nonexistent:/nonexistent
pgsql:*:70:70:PostgreSQL pseudo-user:/usr/local/pgsql:/bin/sh
ircd:*:72:72:IRCd hybrid:/nonexistent:/nonexistent
alias:*:81:81:QMail user:/var/qmail/alias:/nonexistent
qmaill:*:83:81:QMail user:/var/qmail:/nonexistent
qmaild:*:82:81:QMail user:/var/qmail:/nonexistent
qmailq:*:85:82:QMail user:/var/qmail:/nonexistent
qmails:*:87:82:QMail user:/var/qmail:/nonexistent
qmailp:*:84:81:QMail user:/var/qmail:/nonexistent
qmailr:*:86:82:QMail user:/var/qmail:/nonexistent
msql:*:87:87:mSQL-2 pseudo-user:/var/db/msqldb:/bin/sh
このリストを最新の状態に保つためにも,
この範囲の UID や GID を予約するような port を作ったり,
既存の port にそのような改変を行って我々に送るときには,
UID の予約に関する注意書きをつけてください.
合理的な port
Makefile
は単純かつ適切であるべきです. もし,
Makefile を数行短かくできたり,
もっと読みやすくできるのであれば, そうしてください. 例えば,
shell の if 構文を使う代りに, make の
.if 構文を使う,
EXTRACT* の再定義で代用できるのであれば,
do-extract を再定義しない,
CONFIGURE_ARGS +=
--prefix=${PREFIX} とするかわりに,
GNU_CONFIGURE とする, などです.
CFLAGS の尊重
CFLAGS 変数は尊重すべきです. その
port がこれを無視するのであれば,
NO_PACKAGE=ignores cflags を
Makefile に加えてください.
コンフィグレーション(設定)ファイル
もしあなたの port が設定ファイルを
PREFIX/etc
に置く必要がある場合には, それを単純にインストールしたり,
pkg/PLIST
に加えてはいけません. こうしてしまうと,
pkg_delete が
ユーザが苦労して作ったファイルを消してしまったり, 新しく
インストールすると上書きされてしまったりします.
代りに, 見本となるファイルを suffix (
filename.sample が良いでしょう)
を付けて インストールして,
message を表示して, ソフトウエアを動かす前に,
ユーザがそのファイル
をコピーして編集をしなければならないことを知らせましょう.
Portlint
送付や commit をする前に portlint
を使ってチェックしましょう.
フィードバック
Portを作るためにソフトウェアに変更を加えたら,
なるべく原作者にその旨を伝えてパッチ等を送ってください.
これらが次のリリースに取り入れられれば,
アップグレードが楽になります.
その他諸々
pkg/DESCR,
pkg/COMMENT,
pkg/PLIST などのファイルは,
それぞれ2重にチェックしてください.
再検討してもっと良い記述があれば,
それに置きかえてください.
GNU General Public License
(GNU一般公有使用許諾)のコピーは
(すでにあるので)コピーしないでください,
おねがいします.
法律に関することには, 十分注意をはらってください.
私達に法律に反するような形でソフトフェアの配布をさせない
でください!
困ったら....
私たちに質問を送る前に,
既存のportの例とbsd.port.mkを
ちゃんと読んでください! ;)
それでもわからないことがあったら,
一人で悩まないでどんどん 質問してください! :)
Makefile のお手本
これはportの Makefile
を作る際のお手本です. かぎかっこ
([])内のコメントは忘れずに取ってください.
変数の順番, 段落の間の空行など,
Makefile を作るときはなるべくこ
の形式にしたがってください.
この形式は重要な情報が簡単に見つけられるように
設計されています. portlint を使って
Makefile をチェックすることが
推奨されています.
[ヘッダ -- どのようなportのMakefileかすぐにわかるようになっています]
# New ports collection makefile for: xdvi
# Version required: pl18 ["1.5alpha" みたいなのでも結構です]
[この Makefile の最初の版が作成された日付です. この port をアップグ
レードするときには変えないでください.]
# Date created: 26 May 1995
[このソフトウェアを最初に FreeBSD に port した人の名前, つまり,
この Makefile の最初の版を書いた人です. この port をアップグレー
ドするとき, この行も変えないでください.]
# Whom: Satoshi Asami <asami@FreeBSD.ORG>
#
# $Id$
[ ^^^^ この部分は, CVS ツリーに入れる時に自動的に RCS の ID 文字列に
置き換えられます.]
#
[Port自体, およびオリジナルのソースを取ってくるところを記述する部分.
最初は必ずDISTNAME, そして必要ならPKGNAME, CATEGORIES, 続いて
MASTER_SITESがおかれ, さらに MASTER_SITE_SUBDIR がおかれることもあり
ます. そのあと, EXTRACT_SUFX か DISTFILES を指定することも可能です]
DISTNAME= xdvi
PKGNAME= xdvi-pl18
CATEGORIES= print
[MASTER_SITE_* マクロを使用しない場合は,
最後のスラッシュを忘れないように ("/")!]
MASTER_SITES= ${MASTER_SITE_XCONTRIB}
MASTER_SITE_SUBDIR= applications
[ソースファイルが標準の ".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
[依存する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 <bsd.port.mk>
Packageの名前
Package の名前は以下のルールにしたがってつけてください. こ
れは package のディレクトリを見やすくするためで, 無秩序な名前
がたくさん並んでいるとユーザが使いづらくなるのでは
という心配か らです.
(FTPサイトなどにはたくさんpackageがありますからね.)
Packageの名前は以下のようにしてください.
言語-名前-オプション
バージョン.番号
DISTNAME
が上記の形式になっていない場合に は,
PKGNAME をそのようにしてください.
FreeBSD
はユーザの慣れ親しんだ言語のサポートに力を入れて います.
特定の言語のためのportのpackage名には
言語- に ISO-639
で定義されている言語名の略称を入れ てください. 例えば,
日本語なら ja, ロシア語なら
ru, ベト ナム語なら
vi, 中国語なら zh,
韓国語ならば ko, ドイツ 語なら
de, といった具合です.
名前
の部分は原則的にはすべて英小文字 を使います.
例外はたくさんのプログラムが入っている巨大なport の場合で,
XFree86 (ほんとにあるんですよ) やImageMagickな
どがこれにあたります. そうでない場合には,
名前の大文字を小文 字に (少なくとも最初の一字だけは)
変えてください. もし, 大文字であることが重要な場合(例えば,
1文字の名前, R とか
V)には,
あなたの裁量で大文字を使うのも良いでしょう. Perl 5
のモジュールでは, 頭に p5- を付け,
2重コロン (::) のセパレータをハイフン(
- ) に置きかえるしきたりになっています.
例えば, Data::Dumper は
p5-Data-Dumper になります. また, その
ソフトウェアの名前として通常使われるものに番号, ハイフン,
あ るいは下線が入っている場合には,
それらを使うことも構いません (kinput2
など).
コンパイル時に環境変数や make
の引数などで
ハードコードされたデフォルト
を変えてコンパイルできる場合,
-compiled.specifics
にそのコンパイル時のデフォルトを入れてください
(ハイフンはあってもなくてもかまいません). 用紙のサイズ,
あるいはフォントの解像度などがこれにあたります.
バージョン番号は数字とアルファベットからなり, ピリオド
(.) で区切ります.
アルファベットは二文字以上続けてはいけませ ん.
ただ一つの例外は「パッチレベル」を意味する
pl で, それ 以外にバージョン番号が
まったくついていない場合にのみ使うことがで きます.
では, DISTNAMEを正しい
PKGNAMEに直す例を見てみましょう:
DISTNAME
PKGNAME
理由
mule-2.2.2.
mule-2.2.2
まったく問題なし
XFree86-3.1.2
XFree86-3.1.2
同上
EmiClock-1.0.2
emiclock-1.0.2
プログラム一つだけの時は小文字のみ
gmod1.4
gmod-1.4
`<名前>' のあとにハイフンが必要
xmris.4.0.2
xmris-4.0.2
同上
rdist-1.3alpha
rdist-1.3a
alphaのような文字列は使えない
es-0.9-beta1
es-0.9b1
同上
v3.3beta021.src
tiff-3.3
なんなんでしょう ;)
tvtwm
tvtwm-pl11
バージョン番号は必ず必要
piewm
piewm-1.0
同上
xvgr-2.10pl1
xvgr-2.10.1
pl
が使えるのは他にバージョン番号がない場合のみ
gawk-2.15.6
ja-gawk-2.15.6
日本語バージョン
psutils-1.13
psutils-letter-1.13
コンパイル時に用紙のサイズを指定
pkfonts
pkfonts300-1.0
300dpiフォント用のpackage
オリジナルのソースにまったくバージョン情報が見当たらず,
また原作
者が新しいバージョンをリリースする可能性が低いときには,
バージョ ン番号として 1.0
を使えばいいでしょう (上記のpiewmの例がこ れにあたります).
そうでない場合には, 原作者に聞くか, 日付
(
年.月
.日)
を使うなどしてください.
カテゴリ
すでに御存知のように, ports はいくつかのカテゴリに
分類されています. これを有効に利用するためには, port を
行う人々とユーザが, そろぞれのカテゴリが何であるか,
どのようにしてカテゴリに分類するかを理解する必要が
あります.
現在のカテゴリのリスト
まず, これが現在の port のカテゴリーのリストです.
アスタリスク(*) が付いているものは,
バーチャル(virtual) カテゴリです --
これらには対応するサブディレクトリが port
ツリーにはありません.
バーチャルカテゴリでないものは,
そのサブディレクトリ内の pkg/COMMENT
に1行の記述があります (例,
archivers/pkg/COMMENT).
Category
Description
afterstep*
Ports to support AfterStep window manager
archivers
Archiving tools.
astro
Astronomical ports.
audio
Sound support.
benchmarks
Benchmarking utilities.
biology
Biology-related software.
cad
Computer aided design tools.
chinese
Chinese language support.
comms
Communication software. Mostly software to talk to
your serial port.
converters
Character code converters.
databases
Databases.
deskutils
Things that used to be on the desktop before
computers were invented.
devel
Development utilities. Do not put libraries here just
because they are libraries—unless they truly don't
belong to anywhere else, they shouldn't be in this
category.
editors
General editors. Specialized editors go in the
section for those tools (e.g., a mathematical-formula
editor will go in math).
elisp
Emacs-lisp ports.
emulators
Emulators for other operating systems. Terminal
emulators do not belong
here—X-based ones should go to
x11 and text-based ones to either
comms or misc,
depending on the exact functionality.
games
Games.
german
German language support.
graphics
Graphics utilities.
japanese
Japanese language support.
kde*
Ports that form the K Desktop Environment
(kde).
korean
Korean language support.
lang
Programming languages.
mail
Mail software.
math
Numerical computation software and other utilities
for mathematics.
mbone
MBone applications.
misc
Miscellaneous utilities—basically things that
doesn't belong to anywhere else. This is the only category
that should not appear with any other non-virtual
category. If you have misc with
something else in your CATEGORIES line,
that means you can safely delete misc
and just put the port in that other subdirectory!
net
Miscellaneous networking software.
news
USENET news software.
offix*
Ports from the OffiX suite.
palm
Software support for the 3Com Palm(tm) series.
perl5*
Ports that require perl version 5 to run.
plan9*
Various programs from Plan9.
print
Printing software. Desktop publishing tools
(previewers, etc.) belong here too.
python*
Software written in python.
russian
Russian language support.
security
Security utilities.
shells
Command line shells.
sysutils
System utilities.
tcl75*
Ports that use tcl version 7.5 to run.
tcl76*
Ports that use tcl version 7.6 to run.
tcl80*
Ports that use tcl version 8.0 to run.
tcl81*
Ports that use tcl version 8.1 to run.
textproc
Text processing utilities. It does not include
desktop publishing tools, which go to print/.
tk41*
Ports that use tk version 4.1 to run.
tk42*
Ports that use tk version 4.2 to run.
tk80*
Ports that use tk version 8.0 to run.
tk81*
Ports that use tk version 8.1 to run.
vietnamese
Vietnamese language support.
windowmaker*
Ports to support the WindowMaker window
manager
www
Software related to the World Wide Web. HTML language
support belong here too.
x11
The X window system and friends. This category is
only for software that directly support the window system.
Do not put regular X applications here. If your port is
an X application, define USE_XLIB
(implied by USE_IMAKE) and put it in
appropriate categories. Also, many of them go into other
x11-* categories (see below).
x11-clocks
X11 clocks.
x11-fm
X11 file managers.
x11-fonts
X11 fonts and font utilities.
x11-toolkits
X11 toolkits.
x11-wm
X11 window managers.
適切なカテゴリの選択
多くのカテゴリに重なるので, どれを '第一'
カテゴリにするかを決めなければならないことが
たびたびあるでしょう. これを
うまく決めるルールがいくつかあります.
以下はその優先順のリストで, 優先度の高いものから
低いものの順に書いてあります.
言語特有のカテゴリがまず最初です. 例えば日本語の
X11 のフォントをインストールする port の場合,
CATEGORIES 行は japanese
x11-fonts となるでしょう.
より特徴的なカテゴリが, 一般的なカテゴリより
優先されます. 例えば, HTML エディタの場合は www
editors となり, 逆順にはしないでください.
また, port が mail,
mbone, news,
security, www
のいづれかに属するとには, net
は必要ありません.
x11 を第2カテゴリにするのは,
第1カテゴリが自然言語の場合のみにしてください. 特に X
のアプリケーションには x11
を指定しないでください.
もし, あなたの port が他のどのカテゴリにも
属しないばあいには, misc
にしてください.
もし, あなたがカテゴリについて自信が持てない場合には,
そのことを send-pr するときに
書き加えてください. そうすれば import するまえに
それについて議論できます. (もしあなたが commiter であれば,
そのことを &a.ports に送って, 先に議論
するようにしてください — 新しい port
が間違ったカテゴリに import されて,
すぐ移動されることが多いので.)
このドキュメントと ports システムの変更
もしあなたが, たくさんの ports の保守を
しているのであれば, &a.ports メーリングリストの内容を
フォロウすることを考えてください. Ports
のしくみについての重要な変更点はここに アナウンスされます.
最新の変更点については, いつでも, the bsd.port.mk CVS log で詳細な情報を得ることができます.
やっとおしまい!
いやはや, 長い文章ですみません.
ここまで読んでくださった方に は感謝, 感謝でございます. (_ _)
さあ, portの作り方がわかったところで,
世界中のソフトウェア をport化しましょう.
FreeBSDプロジェクトに貢献するには, それ
がもっとも簡単な方法です! :)
diff --git a/ja_JP.eucJP/books/porters-handbook/book.sgml b/ja_JP.eucJP/books/porters-handbook/book.sgml
index f27bce571b..174077de86 100644
--- a/ja_JP.eucJP/books/porters-handbook/book.sgml
+++ b/ja_JP.eucJP/books/porters-handbook/book.sgml
@@ -1,5233 +1,5233 @@
アプリケーションのインストール : ports コレクション
原作: &a.jraynard;.
訳: &a.jp.masaki;, &a.jp.saeki;.
11 November 1996.
FreeBSD の ports コレクションを利用すると, 最小限の労力で
非常に幅広くのアプリケーションのコンパイルとインストールがおこなえます.
やってみたことのある方はよくご存知でしょうが,
オープンな規格とは 全くの誇大広告であって,
あるプログラムを異なるバージョンの Unix 上で
動作させることは退屈で手間のかかる仕事です.
求めているプログラムが自分のシステムでうまくコンパイルでき,
正しいところにインストールできて,
完璧に動作するとしたらとてもラッキーです. しかし,
あいにくこれは滅多にないことなのです.
ほとんどのプログラムについて,
あなたは髪を掻きむしることになるでしょうし,
かなりのプログラムでは, 白髪混じりの頭になってしまったり,
あるいは慢性の 脱毛症にすら なってしまうかもしれません...
いくつかのソフトウェアディストリビューションでは,
設定用のスクリプトを
配布することでこの問題を解決しようとしています.
これらのスクリプトの中には非常に精巧なものもありますが,
残念ながら, 中にはこれまで
聞いたこともないようなシステムの名前をしゃあしゃあと
言い放ったうえに, まるでシステムレベルの Unix
プログラミングに関する 最終試験のような,
たくさんの質問をしてくる場合があります. (例えば,
このシステムの gethitlist 関数は fromboz への const
ポインタを 返しますか? それとも const fromboz
へのポインタを返しますか?, このシステムには
Foonix スタイルの, 容認できない例外処理をおこなう
ルーチンがありますか? もしもないとしたら,
それはなぜですか?)
幸いなことに, ports コレクションがあれば,
これらのきつい作業はすべて 完了しています. make
install とタイプするだけで, 動作するプログラムを
入手することができるのです.
なぜ ports コレクションを作ったのか?
FreeBSD の基本システムは,
非常に多くのツールやユーティリティから 構成されています. しかし,
よく使われるプログラムのうち多くのものが,
この基本システムには含まれていません. その理由は:-
ある Lisp ベースのエディタのように,
それがないと生きていけないと 言う人もいれば,
ディスクの無駄だと言う人もいるようなプログラム.
基本システムに組み込むには特殊すぎるプログラム. (CAD
やデータベースなど.)
“時間のある時に,
ちょっと見ておかなければ”というような類の,
それがシステムに含まれていないことが
致命的とは言えないプログラム. (おそらく,
何らかの言語などでしょう.)
FreeBSD
のような真面目なオペレーティングシステムの一部として
供給するには遊びが過ぎるようなプログラム. ;-)
たくさんのプログラムを基本システムに組み込んだとしても,
もっともっと 組み込みたいという要求が出てくるので,
どこかで制限を引かなくてはならないため. (そうしなければ
FreeBSD の配布物は,
とてつもなく膨大になってしまうでしょう.)
すべての人が自分のお気に入りの
プログラムを手作業で移植しなければ ならないとしたら,
(途方もない膨大な作業の繰り返しをさておいたとしても)
それは明らかに不合理な話です. そこで, FreeBSD プロジェクトでは,
標準のツールを使って移植のプロセスを
自動化する巧妙な方法を考え出しました.
なお,
これは単純ながら非常に柔軟なツールを組み合わせることで,
非常に強力な働きをさせるという“Unix
流”の作業の優れた実例です.
ports コレクションはどのように動くのでしょうか?
インターネットでは通常, tarball の形で
プログラムが配布されています. これは, Makefile
とソースコードで構成され, 普通は何らかの説明書 (あいにく,
いつもわかりやすく書かれているとは 限りませんが)
が付属しています. ことによるとコンフィグレーションスクリプトも
含まれているかもしれません.
標準的な手順では, FTP で tarball を入手して,
適当なディレクトリで展開します. 次に説明書を読んで,
必要な変更をおこないます. そして, 設定スクリプトを実行し, 標準の
make
コマンドを使ってソースのコンパイルとインストールを
おこないます.
FreeBSD の ports も tarball の仕組みを利用していますが,
これはユーザが 苦労して作業することを期待したものではなく,
どのようにすれば FreeBSD 上で
そのプログラムが動くようになるかという「ノウハウ」を スケルトン
を使用して収めているものです. スケルトンは, カスタマイズ済みの
Makefile も
提供していますので, ほとんどすべての ports
は同じ手順でインストールすることが できます.
もしあなたが (あなたの
FreeBSD システム または
FTP サイト にある) ports スケルトンを見ていて,
そこに潜んでいる あらゆる種類の先端的な
ロケット工学的なものを見つけられると期待していると,
つまらなそうなファイルやディレクトリがそこにあるだけなのを見て,
がっかりするかもしれません.
(ports を手に入れる方法については, すぐに
FreeBSD ports コレクションの入手方法
の節でお話します.)
“一体どうしたらいいんだ? ここにはソースコードが
ないじゃないか?”
というあなたの叫びが聞こえるようです.
心配いりません. おとなしく読んでいけば, すべてが (たぶん)
明らかに なるでしょう. 試しに ports をインストールして,
何が起きるのかを見てみましょう.
ここではサンプルとして開発者向けの便利なツール,
ElectricFence を選択します.
このスケルトンを選んだ理由は, 他の ports
に比べても素直で理解しやすく 書かれているからです.
自宅で試してみる場合には, root
になる必要があるでしょう.
&prompt.root; cd /usr/ports/devel/ElectricFence
&prompt.root; make install
>> Checksum OK for ElectricFence-2.0.5.tar.gz.
===> Extracting for ElectricFence-2.0.5
===> Patching for ElectricFence-2.0.5
===> Applying FreeBSD patches for ElectricFence-2.0.5
===> Configuring for ElectricFence-2.0.5
===> Building for ElectricFence-2.0.5
[大量のメッセージをコンパイラが出力します...]
===> Installing for ElectricFence-2.0.5
===> Warning: your umask is "0002".
If this is not desired, set it to an appropriate value
and install this port again by ``make reinstall''.
install -c -o bin -g bin -m 444 /usr/ports/devel/ElectricFence/work/ElectricFence-2.0.5/libefence.a /usr/local/lib
install -c -o bin -g bin -m 444 /usr/ports/devel/ElectricFence/work/ElectricFence-2.0.5/libefence.3 /usr/local/man/man3
===> Compressing manual pages for ElectricFence-2.0.5
===> Registering installation for ElectricFence-2.0.5
ここではあなたが混乱しないように, コンパイル時の出力を
すべて取り除いてあります.
もしもあなた自身で実行されたら, 最初にこのような
出力結果が得られるはずです:-
&prompt.root; make install
>> ElectricFence-2.0.5.tar.gz doesn't seem to exist on this system.
>> Attempting to fetch from ftp://ftp.doc.ic.ac.uk/Mirrors/sunsite.unc.edu/pub/Linux/devel/lang/c/.
make プログラムは,
あなたの手元にソースコードがないことを検出し,
処理を続けられるようにソースを FTP でダウンロードしようとします.
この例では, あらかじめ手動でソースコードを用意してあったので,
持ってくる必要はありませんでした.
では, 続けて make
プログラムが何をしているのか見てみましょう.
ソースコード tarball のありかを
確認します. 手元にファイルが存在しなければ, FTP
サイトから入手しようとします.
チェックサム
テストを実行して, その tarball
が事故か何かで途中で切れていたり, ASCII モードで
ダウンロードされていたり,
転送中にニュートリノによって傷められたりして
改変されたりしていないかどうかを確認します.
tarball を一時的な作業用ディレクトリに展開します.
FreeBSD 上でコンパイルしたり, 動作させるのに必要な
すべての パッチ
をソースコードに当てます.
構築のために必要な
コンフィグレーションスクリプトを実行します.
コンフィグレーションスクリプトの
質問には正確に答えてください.
(いよいよ!) ソースコードをコンパイルします.
実行形式のプログラム, マニュアル,
その他のサポートファイルを,
システムのプログラムと混ざってしまわないように
/usr/local 以下に インストールします.
ports はすべて同じ場所にインストールされ,
システムのあちこちにばらまかれることはありません.
インストール結果はデータベースに登録されます.
これにより,
インストールしたプログラムがもしも気に入らなかったときも,
システムから すべての痕跡をきれいに 消去
することができます.
以上のステップが make
の出力と一致しているかどうか確認してください.
今まで確認していなかったのなら,
今からするようにしてください!
FreeBSD ports コレクションの入手
あるプログラムの FreeBSD port
を入手するには二つの方法があります. ひとつは FreeBSD CD-ROM を使う方法で,
もうひとつは インターネット接続
を使う方法です.
CD-ROM からコンパイルする
FreeBSD CD-ROM がドライブに入っており,
/cdrom にマウントされていると仮定すると
(マウントポイントが /cdrom
である必要があります), ただ普通に実行するだけで ports
を構築できるようになり, tarball
をネットワーク経由でダウンロードするのではなく
/cdrom/ports/distfiles/
からさがすようになります (そこにあればの話ですが).
CD-ROM にある port スケルトンを使いたければ, 他に
/etc/make.conf の
変数を以下のようにセットする方法があります:
PORTSDIR= /cdrom/ports
DISTDIR= /tmp/distfiles
WRKDIRPREFIX= /tmp
(任意の十分な空きスペースの場所を /tmp
とおいています).
次に, /cdrom/ports 下の適宜のサブディレクトリに
cd して, 例のごとく
make install とタイプします.
WRKDIRPREFIX は port に
/tmp/cdrom/ports の下でビルドさせようとします;
例えば, games/oneko は
/tmp/cdrom/ports/games/oneko の下で
ビルドされるでしょう.
ライセンスの制限により, いくつかの ports
でオリジナルのソースコードを CD-ROM
に入れることができなかったものがあることに注意してください.
この場合, インターネット経由で
ports をコンパイルする の
節を参照してください.
インターネット経由で ports をコンパイルする
CD-ROM を持っていなかったり, その ports
の最新バージョンを確実に入手したい 場合は, その ports の スケルトン を
ダウンロードする必要があります. ところで, これは落し穴が
たくさんある作業に見えるかもしれませんが,
実際には非常に簡単です.
初めに, あなたの動かしている FreeBSD
がリリースバージョンなら ports ページ
でその FreeBSD 用の “アップグレードキット”
を手にいれてください. このパッケージには, 最新の ports
をコンパイルするのに必要な,
リリース以降に更新されたファイルが含まれています.
FreeBSD の FTP サーバーがその場で tarball
を作成できることを利用してスケルトンを入手すると
非常に便利です. ここでは例として databases ディレクトリにある
gnats プログラムを使って説明します.
(角型かっこの中の文はコメントなので, 実際に実行する場合には,
これをタイプしないでください!):-
&prompt.root; cd /usr/ports
&prompt.root; mkdir databases
&prompt.root; cd databases
&prompt.root; ftp ftp.freebsd.org
[ユーザ名 `ftp' でログインし, パスワードを要求されたら, あなたの電子メール
アドレスを入力してください. バイナリモードを (イメージモードと呼ばれることも
あります) 使うのをお忘れなく!]
> cd /pub/FreeBSD/ports/ports/databases
> get gnats.tar
[gnats スケルトンの tarballs を取得]
> quit
&prompt.root; tar xf gnats.tar
[gnats スケルトンの展開]
&prompt.root; cd gnats
&prompt.root; make install
[gnats の構築とインストール]
さて何が起きるでしょうか? FTP
サイトにいつも通りに接続して, データベースの
サブディレクトリに移動します. get gnats.tar
とコマンドを入力すると, FTP サイトでは gnats ディレクトリを
tarred
にしてくれるのです.
gnats スケルトンを展開したら, gnats ディレクトリへ移動して
ports を構築します. すでに
説明したように, make の過程で
手元にソースコードがないことを検出すると,
ソースコードを取得してから 展開し,
パッチ当てと構築をおこないます.
それでは, 少し冒険をしてみましょう. 一つの ports
スケルトンを 取得するかわりに, たとえば ports
コレクションの中のデータベースの スケルトンをすべて,
サブディレクトリ全体を取得してみましょう.
やり方はほとんど同じです:-
&prompt.root; cd /usr/ports
&prompt.root; ftp ftp.freebsd.org
[ユーザ名 `ftp' でログインし, パスワードを要求されたら, あなたの電子メール
アドレスを入力してください. バイナリモードを (イメージモードと呼ばれることも
あります) 使うのをお忘れなく!]
> cd /pub/FreeBSD/ports/ports
> get databases.tar [データベースディレクトリの tarballs を取得]
> quit
&prompt.root; tar xf databases.tar [すべてのスケルトンを展開]
&prompt.root; cd databases
&prompt.root; make install [データベース ports 全部の構築とインストール]
わずかばかりの簡単なコマンドで, この FreeBSD
マシン上にデータベース
プログラムを一揃い手に入れてしまいました! 一つの ports
スケルトンを取ってきて それを構築する場合との違いは,
すべてのディレクトリを一度に取得して,
全部を一度にコンパイルしたということだけです.
かなり感動的だと思いませんか?
たくさんの ports をインストールする つもりなら,
おそらくすべての ports ディレクトリをダウンロードしておく
価値があるでしょう.
スケルトン
スケルトン (訳注: skeleton とは骸骨のことです) とは,
締め切りを守るため, 食事をするのを忘れるほど仕事にのめり込んだ
ハッカーたちのなれの果ての ことでしょうか? FreeBSD
の屋根裏に潜む, なにか気持ちの悪いものでしょうか? いいえ,
ここでスケルトンの意味するところは, ports の魔術を実現するのに
必要とされるすべてのものを提供する最小の骨組みのことです.
Makefile
スケルトンのもっとも重要な要素は Makefile です. Makefile
は ports を どのようにコンパイルし,
インストールをおこなうかを指示する
いろいろな命令を含んでいます. 以下に ElectricFence の Makefile
を示します:-
# New ports collection makefile for: Electric Fence
# Version required: 2.0.5
# Date created: 13 November 1997
# Whom: jraynard
#
# $Id$
#
DISTNAME= ElectricFence-2.0.5
CATEGORIES= devel
MASTER_SITES= ${MASTER_SITE_SUNSITE}
MASTER_SITE_SUBDIR= devel/lang/c
MAINTAINER= jraynard@freebsd.org
MAN3= libefence.3
do-install:
${INSTALL_DATA} ${WRKSRC}/libefence.a ${PREFIX}/lib
${INSTALL_MAN} ${WRKSRC}/libefence.3 ${PREFIX}/man/man3
.include <bsd.port.mk>
"#" で始まる行は, 人間のためのコメント行です.
(ほとんどの Unix のスクリプトと同じですね.)
DISTNAME は tarball
の名前から拡張子を取ったものです.
CATEGORIES
はこのプログラムの種類を示します. この場合,
開発者向けのユーティリティということになります.
完全なリストはこのハンドブックの カテゴリ
をみてください.
MASTER_SITES はマスタ FTP サイトの URL
です. もしローカルシステムに tarball がない場合には,
ここから取得します. これは信頼できると考えられているサイトで,
通常はそのプログラムを
インターネット上で公式に配布しているサイトです.
(そのソフトウェアがインターネット上で「公式に」
配布されているとしたら)
MAINTAINER は,
例えば新しいバージョンのプログラムが出た場合に, 必要であれば
スケルトンの更新をおこなう保守担当者の
電子メールアドレスです.
次の数行はとりあえず飛ばします.
.include <bsd.port.mk>
この行は, この ports に必要なその他の命令やコマンドは
bsd.port.mk に
入っているということを示しています.
これらはすべての ports で共通のものなので,
それぞれの Makefile に書いておく必要はありません.
そのため単一の標準ファイルに
まとめられているのです.
ここでは Makefile
がどう働くかを詳細に調査するのが目的ではありませんので,
MAN3 で始まる行は, インストールの後に
ElectricFence のマニュアルを 圧縮するために使用される,
と言っておくだけで充分でしょう. これにより,
貴重なディスクスペースが保護されているわけです. オリジナルの
port では install
ターゲットが用意されていないので,
do-install からの 3 行が この ports
によって生成されたファイルを
正しい場所に置くために使用されます.
files ディレクトリ
ports のチェックサム算出には MD5
アルゴリズムを使用しているので, この チェックサム を含んでいる
ファイルは md5 と呼ばれます.
ちょっと混乱するかもしれませんが, このファイルは
files という
名前のディレクトリに置かれています.
このディレクトリは, ports に必要だけれども,
他のどこにも属さない 雑多なファイルも含んでいます.
patches ディレクトリ
このディレクトリには, FreeBSD
ですべてを正常に動作させるのに 必要な パッチ が含まれています.
pkg ディレクトリ
このディレクトリには,
非常に役立つ三つのファイルが含まれています:-
COMMENT —
プログラムについての 1 行の説明.
DESCR — より詳細な説明.
PLIST —
プログラムのインストール時に作成される,
すべてのファイルのリスト.
ports が動かないのですが, どうしたらよいでしょう
おやおや. では, 次の四つのどれかをやってみてください:
自分で修正する. ports
の仕組みに関する技術的な詳細については,
アプリケーションの移殖方法をご覧ください.
苦情をいう. これは電子メールで だけ
にしてください! このようなメールの宛先は &a.ports; です.
なお, 必ず port の名前やバージョン, その port のソースや
distfile(s) を どこから入手したか,
どんなエラーが発生したのかを書いておいてください.
忘れてしまう. これはほとんどの場合最も簡単な方法です.
ports
のプログラムのうち必要不可欠な物はごくわずかです.
FTP サイトからコンパイル済みのパッケージを入手する.
“マスター”パッケージコレクションは FreeBSD の
FTP サイトの
パッケージディレクトリ に置いてありますが,
まずあなたの近くのローカルミラーサイトを確認してください!
ソースからのコンパイルに挑戦するよりも,
パッケージを使うほうが (全体的に見て)
ずっと確実に動作するでしょうし,
より手っ取り早い方法でもあります.
システムにパッケージをインストールするには, &man.pkg.add.1;
を使ってください.
質問と回答集
Q. 私はモデムについての議論を
しているのかと思っていました??!
A.なるほど, あなたはきっとコンピュータの背面についている
シリアルポートのことだと思ってしまったのでしょう.
あるバージョンの Unixから別のバージョンの Unix
へとプログラムを 移殖することを “porting”
というのですが, ここで我たちは “porting” の結果
という意味で “port” を使っています.
(コンピュータに関わる人々の悪しき習慣として,
ひとつの同じ言葉を複数の
まったく違う意味として使うことがあるのです.)
Q. 私は, 標準以外のプログラムのインストールには packages
を使うと 思っていたのですが.
A. そのとおり. 通常は packages
が最も手早くて簡単な方法です.
Q. それではどうして面倒な ports があるのですか?
A. いくつかの理由があります:-
いくつかのソフトウェアのライセンス条件には,
バイナリではなくソースコードでの
配布を求めているものがあります.
バイナリ配布を信用していない人もいます.
少なくともソースコード があれば, ソースコードを読んで,
(理論的には) 潜在的な問題点を自分で
見つけ出すこともできるはずです.
ローカルなパッチを入手した場合,
それを自分で追加するために
ソースコードが必要になります.
プログラムがいかにコンパイルされるべきかについて,
あなたはパッケージを作った人とは
異なる見解を持っているかもしれません.
どんな最適化オプションをつけるべきかとか,
デバッグバージョンを作ってから それを strip
するべきだとか, いや, そうするべきでない, などなど,
確固たる見解を持っている人もいるでしょう.
ソースコードを手元に置いておきたい人たちもいます.
彼らは, 退屈したときに眺めたり, あちこち解析してみたり,
ソースコードを 借用したり (もちろん,
ライセンスが許せばの話ですが) するのです.
あなたがソースコードを持っていなければ,
それはソフトウェアとは 言えませんね! ;-)
Q. パッチとは何ですか?
A. パッチとは,
あるバージョンから他のバージョンへどのように変更するかを
示す, (通常は) 小さなファイルです. “23
行目を削除”, “468 行目の後に これらの 2
行を追加”, または“197
行目をこのように変更”というような 内容を含んでいます.
これは, “diff”
という名前のプログラムで生成されます.
Q. tarball とは一体何ですか?
A. .tar または
.tar.gz という拡張子を持つファイルです.
(.tar.Z のようなバリエーションも
ありますし, DOS のファイルシステム用に
.tgz
と短縮される場合もあります.)
これは基本的に, 一つのファイルに固めた
(.tar) ディレクトリツリーです.
圧縮されている (.gz) 場合もあります.
これは元々 Tape
ARchives (訳注: テープアーカイブ)
(このため tar という名前なのです)
で使われていたものなのですが,
インターネット上でプログラムのソースコードを配布するために
広く使われている方法です.
これらのファイルの中身を見たり,
展開したりすることもできます. FreeBSD
の基本システムに付属する Unix 標準の tar
コマンドを使ってみると 次のようになります:-
&prompt.user; tar tvzf foobar.tar.gz
&prompt.user; tar xzvf foobar.tar.gz
&prompt.user; tar tvf foobar.tar
&prompt.user; tar xvf foobar.tar
Q. チェックサムとは何ですか?
A. これは,
チェックしたいファイル中のすべてのデータを加えて生成した
数値です. 何か文字が書き換わっていたら,
チェックサムが一致しなくなります. そのため,
単純な比較だけで違いを見つけることができるのです.
(実際には, 文字の位置が入れ替わるなどの,
単純な加算ではわからない問題も
見つけることができる複雑な方法で計算されています.)
Q. 私は, CD-ROM から ports
をコンパイルする にしたがって ports
をインストールしていました. kermit
をインストールしようとするまではうまくいっていました:-
&prompt.root; 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 に指示することができます.
&prompt.root; make DISTDIR=/where/you/put/it install
Q. ports では, すべてを /usr/ports
に置いたときだけ動作するのでしょうか?
システムの管理者によると, 私の個人的なファイルは
/u/people/guests/wurzburger
に入れなければならないのですが, これでは
うまくいかないように思います.
A. PORTSDIR 変数と
PREFIX 変数を変更することで,
違うディレクトリを 使用することができます. 例えば,
&prompt.root; make PORTSDIR=/u/people/guests/wurzburger/ports install
とすると, ports は
/u/people/guests/wurzburger/ports
でコンパイルされ, すべて /usr/local
以下にインストールされます.
&prompt.root; make PREFIX=/u/people/guests/wurzburger/local install
この場合, コンパイルは /usr/ports
でおこない,
/u/people/guests/wurzburger/local
にインストールします. もちろん,
以下のように両者を組み合わせることも可能です.
&prompt.root; make PORTSDIR=.../ports PREFIX=.../local install
(省略せずに記述したら,
このページに収めるには長すぎるのですが,
考え方は理解していただけたと思います)
もし ports をインストールするたびに,
これらを毎回タイプするのが 気に入らないのであれば,
(正直に言って, 誰もそう思わないでしょう)
これらを環境変数にセットしてしまうという手があります.
Q. 私は, FreeBSD の CD-ROM を持っていませんが,
私はすべての tarball を 私のシステムに置いておきたいのです.
そうすれば, 私は ports をインストール するたびに,
毎回ダウンロードが終わるのを待たなくてすむでしょう.
これを一度におこなう簡単な方法はありませんか?
A. ports コレクション全体の tarball を持ってくるには,
次のようにしてください.
&prompt.root; cd /usr/ports
&prompt.root; make fetch
ports の下のディレクトリひとつの tarball
を持ってくるには, 次のように してください.
&prompt.root; cd /usr/ports/directory
&prompt.root; make fetch
ports をひとつだけ持ってくる方法は,
きっと既にご存知だと思います.
Q. マスタ FTP サイトから tarball を持ってくるより,
近くにある FreeBSD の
ミラーサイトから持ってきた方が速いはずです. MASTER_SITES
に書かれている サイト以外から持ってくるように ports
に指示する方法はありませんか?
A. もちろんあります. 例えば ftp.FreeBSD.ORG が
MASTER_SITES に書かれている
サイトより近いとしたら, 以下のようにしてください.
&prompt.root; cd /usr/ports/directory
&prompt.root; 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 に付属している バージョン) では,
オプションを
オプションなしで
使うと, バグのあるコードを出力します (ほとんどの ports は
オプションを 使いません).
コンバイラオプションは次のように定義 すべき
です.
&prompt.root; 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
を見つけることができます:
&prompt.user; cd /usr/ports
&prompt.user; make search key=lisp
Q. foo ports
をインストールしたいのですが, それのコンパイルは
すぐに停止して, bar ports
のコンパイルが始まってしまいます. 一体どうして?
A. foo ports が,
bar ports
の提供する何らかの機能を必要としているからです. 例えば
foo が画像を使うとすると,
bar は画像処理に必要な
ライブラリを持っている, などです. または,
bar は foo
をコンパイルするのに必要なツールなのかもしれません.
Q. ports から
grizzle
プログラムをインストールしましたが, まったく
ディスクスペースの浪費です. 削除したいのですが,
すべてのファイルが どこへインストールされたのかわかりません.
何か手がかりはありませんか?
A. 大丈夫, 次のようにしてください.
&prompt.root; pkg_delete grizzle-6.5
Q. ちょっと待ってください.
削除しようとするコマンドのバージョン番号を
知っていなくてはならないのでしょうか? あなたは,
私がバージョン番号を
覚えていることを本気で当てにしているのでしょうか?
A. そんなことはありません.
バージョン番号は次のようにすればわかります.
&prompt.root; 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. はい. インストールが首尾よく終わり,
もうソースコードが必要でないと思うなら,
それらを残しておく理由はないでしょう. 一番よい方法は,
次の通りです.
&prompt.root; cd /usr/ports
&prompt.root; make clean
これは, すべての ports のサブディレクトリを調べ, 各
ports のスケルトン以外の削除をおこないます.
Q. これを試してみたのですが, tarball や ports
で使われたファイルが distfiles
ディレクトリに残っています.
これも削除してしまっても大丈夫ですか?
A. はい. それを使った作業が終わったのであれば,
削除してしまっても大丈夫です.
Q.
私はとてもとてもたくさんのプログラムを楽しみたいのです.
一度にすべての ports
をインストールする方法はありませんか?
A. 次のようにしてください.
&prompt.root; cd /usr/ports
&prompt.root; make install
Q. やってみました. 時間がとてもかかるだろうと思ったので,
そのまま実行を 続けさせて, 私は寝ました.
翌朝コンピュータを見てみると, 三つ半の ports しか
処理が終わっていませんでした.
なにか悪かったのでしょうか?
A. これは ports の中には私たちの決められないこと
(例えば, あなたが A4 の 用紙に印刷したいのか, US
レターサイズの用紙に印刷したいのかなど) について
質問してくるものがあるからです.
それらの質問には手動で答える必要があります.
Q.
私は一日中モニタの前に座って過ごしたりしたくないのですが.
何かよいアイデアはありませんか?
A. では, あなたが寝に / 仕事に /
公園にいく前に以下を実行してください:-
&prompt.root; cd /usr/ports
&prompt.root; make -DBATCH install
これでユーザの入力を要求しないすべての ports
をインストールします. そして, 戻ってきてから,
次のように実行してください.
&prompt.root; cd /usr/ports
&prompt.root; make -DIS_INTERACTIVE install
そして, 残りの作業を実行してください.
Q. 私たちは ports コレクションにある
frobble を使っています. ですが,
私たちの必要に応じて ports を変更したところがあるのです.
自分でパッケージを作って, それを私たちのサイトのまわりに
簡単に配布できるような方法がありますか?
A. もちろんあります.
変更点をパッチにする方法は知っていますよね:-
&prompt.root; cd /usr/ports/somewhere/frobble
&prompt.root; make extract
&prompt.root; cd work/frobble-2.8
[あなたのパッチを当ててください]
&prompt.root; cd ../..
&prompt.root; make package
Q. この ports の技術は本当に賢いですね.
どのようにして動いているのか
私はどうしても知りたいと思います. その秘密は何ですか?
A. 秘密は一切ありません. Makefiles
ディレクトリ にある
bsd.ports.mk と
bsd.ports.subdir.mk
ファイルを見るだけです.
複雑なシェルスクリプトを嫌う読者は,
このリンクを追いかけないほうが よいでしょう.
自分で port を作る
原作: &a.jkh;, &a.gpalmer;, &a.asami;,
&a.obrien; and &a.hoek;. 28 August 1996.
訳: &a.jp.simokawa;, &a.asami;.
10 November 1996.
自分で port を作ることに興味がありますか, すばらしい!
これから, FreeBSD 用のportを作る際の,
いくつかのガイドラインを 説明します.
実際にportをコンパイルするときのほとんどの仕事は
/usr/ports/Mk/bsd.port.mk
というファイルでおこないます.
Portsコレクションについてのさらに細かい内部の働きについては,
そちらの ファイルを参照してください.
これにはコメントが細かく書いてありますので, Makefile
を読むのにあまり慣れていない人でも, 得るものはとても大きいで
しょう.
ここでは, 変更可能な変数の一部についてのみ記述しています.
ほとんどの変数はbsd.port.mk
の始めに記述があります.
また, このファイルは非標準のタブの設定になっています.
Emacs や Vim
はファイルのロード時にこれを認識しますが,
viやexでは,
ファイルをロードしたら :set tabstop=4
のようにして正しい値を設定する
ことができます.
3分porting
この節では, 簡単なportの方法について説明します.
多くの場合これ では不十分ですが,
まあうまくいくかどうか試してみて損はないでしょ う.
まず, 元のtarファイルをDISTDIRに置きます.
デフォルトは/usr/ports/distfilesです.
以下では,
ソフトウェアはそのままコンパイルされるとします. つまり,
FreeBSDのマシンで動かすために, 変更がまったく必要ない
とします.
もしなにか変更が必要な場合には次の節も参照する必要
があります.
Makefile の作成
最小限のMakefile
は次のようなものです:
# New ports collection makefile for: oneko
# Version required: 1.1b
# Date created: 5 December 1994
# Whom: asami
#
# $Id$
#
DISTNAME= oneko-1.1b
CATEGORIES= games
MASTER_SITES= ftp://ftp.cs.columbia.edu/archives/X11R5/contrib/
MAINTAINER= asami@FreeBSD.ORG
MAN1= oneko.1
MANCOMPRESSED= yes
USE_IMAKE= yes
.include <bsd.port.mk>
おわかりになりますでしょうか.
$Id$があ る行の内容については,
気にしないでください. これはこのファイル
がportsツリーに書き込まれるときにCVSによって自動的に書
き込まれます. もっと詳しい例が見たければ, Makefileのお手本
の節をご覧ください.
Package記述ファイルの作成
どのようなportでも, packageにするしないに関わらず, 3つ
の記述ファイルが必要です.
pkgサブディレクトリにある,
COMMENT, DESCR,
それに PLISTです.
COMMENT
これには, そのportについての説明を1行で書きます.
Package の名前, バージョン番号等は
含めないでください. たとえば,
こんな具合です:
A cat chasing a mouse all over the screen.
DESCR
これは, そのソフトウェアについての,
すこし長い説明を記述します. その port
が何をするのかについての数段落程度の
簡潔な解説があれば十分です.
このファイルはマニュアルでもなければ,
使用方法やコンパイル方法についての細かい
説明書でもありません. 特に,
READMEファイル manpage
をコピーしようとしてしている場合には
注意してください. これらは多くの場合,
そのポートの簡潔な説明に なっていなかったり,
扱いにくい形式(manpage の場合,
行を揃えるために空白が調整されます)になっていたりします.
もしこのソフトウエアに公式の WWW のホームページがあれば,
ここに書いて下さい. 自動化ツールが正しく動作するように,
Web サイトのうちの ひとつ には, 前に
WWW: を付け加えてください.
このファイルの最後にあなたの名前を書くことが
推奨されています. たとえば, こんな具合です.
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
PLIST
このファイルには,
このportによってインストールされるファ
イルが列挙されます. このファイルはpackageを作る際のリス
トとして使われるため, `packing list' とも呼ばれます.
ここ に書かれているファイル名は,
インストール時のプレフィックス (普通は
/usr/local か
/usr/X11R6) からの 相対パスです.
MANn
変数を使用する場合(使用することが推奨されています)には,
マニュアルはここに入れないでください.
簡単な例を載せておきましょう:
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
'Packing list'の詳細については, &man.pkg.create.1;
の マニュアルを参照してください.
すべてファイルを列挙しなければなりませんが,
ディレクトリ名は必要ありません. また, ports
がインストール時にディレクトリを作成する場合には,
@dirrm の行を加えて, その port
が削除されるとき,
そのディレクトリも削除されるようにしてください.
このファイルには,
ファイル名をアルファベット順に並べるようにしてください.
port のアップグレートのとき,
楽に確認ができるようになります.
チェックサムファイルの作成
ただ, make makesum
と入力するだけです. bsd.port.mk
にルールがあるので,
自動的にfiles/md5が生成されます.
Portのテスト
そのportが正しく動くことを,
package化を含めて確認してください.
以下の重要なポイントを確認してください.
PLIST にその port
がインストールしないものが含まれていないこと.
PLIST にその port
がインストールする全てのものが含まれていること.
reinstall
ターゲットを使うことによって,
何度でもインストールが可能こと.
deintall の際に 後片付け
をすること.
推奨されるテストの手順
make install
make package
make deinstall
pkg_add `make package-name`
make deinstall
make reinstall
make package
package および
deinstall の段階で,
どんな警告(warning)も出力されないことを確認してください.
ステップ3の後,
新しいディレクトリが全て正しく消去されているかを
確認してください. また,
ステップ4の後にそのソフトウェアを使用してみて, package
からインストールされた場合に正しく動作するかを
確認してください.
portlint でチェック
portlintを使って, あなたの port
が我々のガイドラインそっているかを確認してください.
portlint プログラムは ports
コレクションに含まれています. 特に, Makefile
が正しい形式になっているか, package
の名前が正しいか, をチェックするのに良いでしょう.
Portの送付
まず, やってよいことといけないこと
についての節を読んでください.
さあ, あなたのportに満足したら,
あとはそれをFreeBSDのメイ ンのportsツリーに置いて,
皆に使ってもらうだけです. いまある
work ディレクトリや
pkgname.tgz
パッケージは必要ありませんから, まず消去してください.
あとは, バグレポートの中に shar `find
port_dir` の出力を, &man.send-pr.1;
プログラムを使用して送ってください. &man.send-pr.1;
についての詳細は, バグ報告と一般的な論評
を参照してください.) もし, 圧縮していない状態で,
20KB以上あるようなポートであれば, 圧縮して tar
ファイルにして, バグレポートに入れる前に &man.uuencode.1;
を使用してください. (20KB以下のものでも, tar
ファイルにして送ってもよいですが, あまり歓迎されません).
バクレポートの category は ports, class
は
change-requestを必ず使用してください.
(レポートを confidential (内密)
にしないようにしてください!)
もう一度, オリジナルのソースファイル,
work ディレクトリ, make
package
で作成したパッケージが含まれていないこと
を確認してください.
以前, 新しい port をわれわれの ftp サイト (ftp.freebsd.org)
にアップロードするようにお願いしたことがありますが,
現在このサイトの incoming
ディレクトリは読み出し不可になっており,
いまでは推奨されていません.
沢山の海賊版ソフトウェアがそこに置かれたためです.
私たちは, 何か不明な点があったらあなたに確認したのち,
それをツリーへ置きます. あなたの名前は, FreeBSD
ハンドブックやその他のファイルの “Additional FreeBSD
contributors” のリストにも載るでしょう. う〜ん,
素晴らし い. :)
本格的なport
残念ながら, 移植がそう簡単ではなく,
動かすために多少の変更が 必要な場合も多いでしょう.
この節では, portsコレクション の方法論にのっとって,
そのような場合にどのように変更を施し, 動
くようにしたらよいかを順を追って説明します.
port構築の詳細
まず, あなたがportのディレクトリで
make とタイ
プしてから起こる一連の出来事について,順を追って説明しま
す. ここを読むときには, 他のウィンドウで同時に
bsd.port.mk
も開いておくとよいかもしれません.
しかし,
bsd.port.mkが何をしているのか,
完全に理解 できなくても心配する必要はありません.
そう多くの人が理解して いるわけではないですから... f(^_^;)
まず, fetch
というターゲットが実行されます.
このfetchターゲットは
ローカルディスクのDISTDIRに配布ファ
イルがあるようにするのが役目です. もし,
fetchが必要なファ
イルをDISTDIRに見つけることが
できなけ れば, Makefileに指定されているURL
MASTER_SITES,
そして私たちのFTPサイトで ある
ftp://ftp.freebsd.org/pub/FreeBSD/ports/distfiles/
(ここ には, 私たちが取ってきたファイルを
バックアップとして置いてあ ります) に探しにいきます.
そして, ユーザのサイトがインター ネットに
直接接続されている場合には, FETCH
を使って, その名前のファイルを取っ てきて,
DISTDIRに保存します.
次に実行されるのは
extract ターゲットです.
これは, DISTDIRにある, 配布ファイル
(普通は gzipされたtarファイル) を読み,
ソースを一時的な作業ディレ
クトリWRKDIR (デフォルトは
work) に展開します.
次に, patch
というターゲットが実行されます. まず,
PATCHFILESに定義されている,
すべてのパッ チをあてます.
次にもしPATCHDIR (デフォ ルトは
patches サブディレクトリ)
にパッチが存在す れば,
これらをアルファベット順にあてます.
次に実行されるターゲットは
configureです. これには, い
ろいろな場合があります.
もし存在すれば,
scripts/configure
が実行されます.
もし, HAS_CONFIGURE
あるいは GNU_CONFIGURE
がセットされていれば,
WRKSRC/configure
が実行されます.
もし, USE_IMAKE
がセットされていれば, XMKMF
(デフォルト: xmkmf -a)
が実行されます.
最後に, build
というターゲットが実行されます. これは, その port
の専用の作業ディレクトリ (WRKSRC)
にい き, コンパイルするのが役目です. もし
USE_GMAKE がセットされていれば, GNU
make が使用されます.
さもなければFreeBSDの make
が使用されます.
上記はデフォルトのルールです. さらに,
pre-何とか
や
post-何とか
というターゲット が定義してあった
り,そのような名前のスクリプトが scripts
サブディレクトリに置いてある場合には,
それらはデフォルトの動作の前
後に実行されます.
たとえば, post-extract
というターゲットがMakefile で定義されていて,
pre-build というファイルが,
scripts
サブディレクトリにあるとすると,
post-extractターゲットは,
通常の展開動作のあとに呼 び出され,
pre-build
スクリプトはデフォルトのコンパイ
ルのルールが実行される前に実行されます.
もし動作が簡単であれ ば, Makefile
のターゲットを使用することが推奨されています. な ぜならば,
そのportが何らかのデフォルトではない動作を必要とす
るのかどうかが一箇所にまとめて書いてあった方が他の人に
理解しやす いからです.
デフォルトの動作は bsd.port.mk の
do- 何とか
というターゲットでおこなわれます. たとえば,
portを展開するコマンドは,
do-extract
というターゲットにあります. もし,
デフォルトのターゲットに 不満があれば,
do- something
というターゲッ
トを再定義することによって,
どのようにでも直すことができます.
“メイン”のターゲット (例えば,
extract,
configure等) は,
すべての前段階が実行されていること を確認して,
実際のターゲットやスクリプトを呼び出す以外のこと
はしません.
bsd.port.mkはこれらが変更されることは仮定してい
ませんので, もし, 例えば, 展開の仕方を直したいときには,
do-extract を直し,
絶対にextractには手を
触れないでください.
これで, ユーザが make
と入力したときに何が起こ るのかが理解できたと思います.
では, 完璧なportを手順を追っ て作ってみましょう.
オリジナルのソースの入手
オリジナルのソースを, (普通は)
圧縮されたtarファイルの形 (
foo.tar.gz
あるいは
foo.tar.Z)
で入手して, それを DISTDIR
にコピーします. 可能なかぎり, 広
く使われている主流の
ソースを使用するようにしてください.
もし, ネットワークへの接続のよい FTP/HTTP
サイトを見つけるこ とができなかったり,
頭にくるような非標準的な形式しか持ってい
ないサイトしか見つけられないときには, 自分で管理する確実な
ftp か http サーバ (たとえば,
あなたのホームページ)に置くこと ができます.
MASTER_SITES
に正しく反映されていることを確認してください.
もしも, そのような都合の良く,
安心な置き場所が見つけられない 場合(あなたが FreeBSD の
committer であれば, 自分の
public_html ディレクトリに置けます),
私たちが,
ftp://ftp.FreeBSD.ORG/pub/FreeBSD/ports/distfiles/LOCAL_PORTS/
に置き場所を提供できます.
この場所は, 変数 MASTER_SITE_LOCAL
を使って参照してください.
これについての問い合わせのメールは &a.ports へお願いします.
その port の配布ファイルが特に理由もなく,
しょっちゅう変る場合には,
配布ファイルをあなたのホームページに置いて
MASTER_SITESの最初に入れてください.
こうすることによって, ユーザ利用する場合に
checksum mismatch
エラーが起るのを防ぎ, 我々の ftp
サイトの保守の負担を減らすことができます. もし, master
site がたった一つしかない場合には,
あなたのサイトにバックアップを置いて
MASTER_SITES
の2番目に加えてください.
もし,
あなたのportに必要ないくつかの追加パッチがインター
ネット上で手に入るのならば, それらも取ってきて,
DISTDIR に置きます. もし,
それらがメイン
のソースのtarファイルとは別のサイトにあっても,
心配する必要 はありません.
そのような状況にはちゃんと対応できるようになっ ています.
(以下のPATCHFILESの記述
をご覧ください).
Portの修正
適当なディレクトリにtarファイルを展開して,
FreeBSDの最新の バージョン上で,
正しくコンパイルできるために必要なあらゆる変 更を施します.
最終的に処理は自動化するわけですから, 何をおこなっ
たかを注意深く記録しておきましょう.
あなたのport が完成した暁には, ファイルの削除, 追加,
修正を含むすべての処 理が,
自動化されたスクリプトやパッチファイルで
おこなえるようになっ ていないといけません.
もし, あなたの port
のコンパイルやインストールのために必要
な手作業があまりに多いようならば, Larry Wall の模範的な
Configure
スクリプトでも参考にしたほうがいいかもしれませ ん.
新しいportsコレクションは, 最小のディスクスペースで,
個々のportがエンドユーザにできるだけ“プラグ &
プレ
イ”の状態でmakeできることをめざしています.
あなたが作成し FreeBSD の ports
に寄付されたパッチファイル,
スクリプトおよびその他のファイルは,
明示的に記述されている場合 を除いては,
BSDの標準的な著作権条件によりカバーされていると見な
されます.
パッチをあてる
port
の過程で追加されたり変更されたファイルは再帰的diffで変
更点を取り出すことができます. パッチは適当にまとめて,
patch-xx
という名前のファイルに入れてくだ さい.
xx
はパッチが適用される順番を示します — これらは,
アルファベット順, つまり
aa が 最初, つぎに
ab などとなります. これらのファイル
をPATCHDIRに置いておくと,
自動的に適用さ れるようになっています. すべてのパッチは
WRKSRC (通常は, portのtarファイルが展
開されるところで, makeが実行されるところと同じです)
からの相 対パスになります.
修正やアップグレードを容易にするため, 2つ
以上のパッチが同じファイルを修正するのは避けてください.
(例,
patch-aaとpatch-abが共にWRKSRC/foobar.c
を修正する, など.)
コンフィグレーション
カスタマイズのために追加したいコマンドがあれば,
configure
という名前のスクリプトに入れて
scripts サブディレクトリに置きます.
上で述べたよ うに, pre-configure
あるいは post-configure という
Makefile
のターゲットおよび/あるいはスクリプトで処理す
ることもできます.
ユーザからの入力の扱い
もし, そのportがビルド, コンフィグレーション,
インストー ルの際にユーザからの入力を必要とするならば,
Makefileで
IS_INTERACTIVEをセットしてください.
これによって, 深夜,
自動的にたくさんのportをコンパイルすることが可能にな
ります. 環境変数BATCHがセットされていると
IS_INTERACTIVE
の定義されているportはスキップされ ます (そして,
ユーザがINTERACTIVEという変数をセッ
トすると入力を必要とする port
のみコンパイルされま す).
もし, 適切なデフォルト設定があるのであれば,
PACKAGE_BUILDING
変数をチェックして,それが設 定されて いる場合には,
ユーザ入力のスクリプトを起動しないように してください.
こうすることによって, CD-ROM や ftp に 置く
packageを我々が作成することができます.
Makefileの作成
Makefileの作成は非常に単純です. 繰り返しになりますが,
始める まえに, すでにある例を見てみることをお奨めします.
またこのハ ンドブックにはMakefileのお手本
があります. それを見て, Makefile内の変数の順番や空行を入れると
ころなどの参考にしてください. そうすると他の人々にも読みやすい
ものとなります.
では,
Makefileをデザインするときに問題となるところを順に追っ
て見てみましょう.
オリジナルのソース
ソースはDISTDIRに, 標準的なgzipされた
tarファイルとして置かれていますか? そうであれば, 次のステッ
プに進めます. そうでなければ, 変数
EXTRACT_CMD,
EXTRACT_BEFORE_ARGS,
EXTRACT_AFTER_ARGS,
EXTRACT_SUFX,
DISTFILES
を適当に書き換えないといけません.
どれだけ変更しないといけないかは, あなたのportの
配布ファイルがどの程度標準からかけはなれているかによりま す.
(最もよくある場合は, gzipではなく普通のcompressコマンド
でtarファイルが圧縮されている場合で,
EXTRACT_SUFX=.tar.Z
とするだけです.)
最悪の場合には, 自分で
do-extract ターゲットを作 成して,
デフォルトを上書きすることもできます. しかし, そこま
でする必要があることはめったにないでしょう.
DISTNAME
DISTNAME には port
の名前の基幹部分を入れ ます. デフォルトのルールでは,
配布ファイルのリスト (DISTFILES) は
DISTNAME EXTRACT_SUFX
という名前 になっています. 例えば,
foozolix-1.0.tar.gzの場 合,
通常のtarファイルだと,
DISTNAME=foozolix-1.0 のようになります.
さらにデフォルトのルールでは, tarファイルは
work/DISTNAME
というサブディレクトリ に展開されることを仮定しています,
例えば work/foozolix-1.0/
といった具合いです.
これらの動作はもちろんすべて変更可能です.
デフォルトのルー ルは最も標準的な場合を仮定しているだけです.
まず, port が複 数の配布ファイルを必要とするときには,
単に明示的に DISTFILESを設定してください.
もし, DISTFILES
の一部だけが実際に展開される場合 には,
それらをEXTRACT_ONLY に設定してくだ さい.
この変数が定義されている場合には, 展開時に
DISTFILESに優先して利用されます.
残りのファ イルもDISTDIRに取ってきますが,
展開時に
はなにもせずに後で使うためにそのまま置いておかれます.
PKGNAME
もし, DISTNAME が我々の package
の名前についてのガイドライン
に沿ったものでない場合には, PKGNAME
にもっと良い名前を設定してください.
詳細は上記のガイドラインを参照してください.
CATEGORIES (分類)
完成した package の実体は
/usr/ports/packages/All に置かれます.
また, 1つかそれ以上の
/usr/ports/packages
のサブディレクトリからのシンボリッ クリンクが作られます.
それらのサブディレクトリの名前が
CATEGORIES
という変数によって指定されます. これは,
ユーザがFTPサイトやCD-ROMのpackageの山を渡り歩
くことを容易にするためです. 現在存在する カテゴリを見て, そ
のportに適したもを選んでください.
このリストは, この port が port tree のどこに import
されるかも決定します. 2つ以上のカテゴリを指定した場合には
最初のカテゴリで指定されるサブディレクトリに置かれること
になります. 適切なカテゴリを選ぶ方法については, カテゴリ
の節を参照してください.
もしその port
が本当に現在存在するすべてのものとは異なって いる場合には,
新しいカテゴリ名を作ることもできます. その際には, &a.ports
宛てに新しいカテゴリ名を提案する
メールを送ってください.
カテゴリ名については,
なんのエラーチェックも行なわれません.ミスタイプがあっても
make package はなにも考えずに
新しいディレクトリを作ってしまいますので,
注意してください.
MASTER_SITES
オリジナルの配布ファイルを指し示す FTP または HTTP の
URL のディ レクトリ部分までを
MASTER_SITES に記録しま す. スラッシュ
(/) を最後につけることをお忘れなく.
配布ファイルがシステム上に存在しないときに,
makeマクロは FETCH
でこの変数に指定されたサイトから取っ てきます.
複数の,
できれば異なる大陸のサイトをこのリストに入れておく
ことが推奨されています. これによって, 広域ネットワークにトラ
ブルがあった場合でも成功する可能性が高くなります.
私たちはさら に, 自動的に最も近いマスタサイトを検出して,
そこから取って くるメカニズムの導入を計画しています.
オリジナルのtar ファイルが, X-contrib, GNU, Perl CPAN,
TeX CTAN または Linux Sunsite
などの有名なアーカイブにある場合には,
MASTER_SITE_XCONTRIB,
MASTER_SITE_GNU,
MASTER_SITE_PERL_CPAN,
MASTER_SITE_TEX_CTAN および
MASTER_SITE_SUNSITE を利用することで,
簡単にこれらのサイトを 指定することができます. あとは
MASTER_SITE_SUBDIR にアーカイ
ブ内でのパスを指定するだけです. 以下に例を示します.
MASTER_SITES= ${MASTER_SITE_XCONTRIB}
MASTER_SITE_SUBDIR= applications
ユーザは/etc/make.conf中で
MASTER_SITE_* 変数を設定
することによって, デフォルトの FTP サイトではなく, これらの
有名なアーカイブの
ミラーの中で好みのものを使用することが可能 です.
PATCHFILES
もし,
オリジナルの配布ファイル以外にもFTPかHTTPで手に入る
パッチが必要な場合には, PATCHFILESにファ
イル名を, PATCH_SITESにサイトとディレクト
リの名前を MASTER_SITES
と同様に設定してく ださい.
そのパッチ内のファイル名ががソースツリーの
一番上のディレク トリ (WKRSRC)
からの相対パスになっていな い場合には,
PATCH_DIST_STRIPを指定してく ださい.
例えば, パッチ内のファイル名にすべて余計な
foozolix-1.0/ がついている場合には,
PATCH_DIST_STRIP=-p1としてください.
これらのパッチは圧縮されていても大丈夫です. ファイル名が
.gz か .Z
で終わる場合には自動的に復元
されるようになっています.
もしパッチが, 文書などその他のファイルと一緒に gzip
された tarファイルで配布されている場合には,単純に
PATCHFILES を使うことはできません.
このような場合には, このパッチの tar ファイルの名前と場所を
DISTFILES と
MASTER_SITES に加えます. それから,
pre-patch ターゲットで,
パッチコマンドを走らせるか, パッチファイルを
PATCHDIR ディレクトリに
patch-xx
という名前でコピーするかして,
パッチを適用するようにします.
普通の gzip か compress された tar ファイルであれば,
通常のソースファイルと一緒にその時までに
展開されていますので, 明示的に展開する必要はありません.
もし, 後者の方法を使用する場合には,
すでにそのディレクトリにある なにかを上書きしないように,
注意する必要があります. さらに,
pre-clean
ターゲットにコピーしたパッチファイル
を削除するコマンドを追加するのを忘れないでください.
MAINTAINER
あなたのメールアドレスをここに入れてください.
お願いします. :)
保守担当者(maintainer)の責任についての詳細は, Makefile 中の
MAINTAINER の節をご覧ください.
依存関係
このプログラムが他のportに依存する場合には, 必要なものが
自動的に作られるようにすることができます. そのために, 以下の
5つの変数が用意されています.
よくあるケースのためにあらかじめ設定された依存変数や,
いくつかの依存関係の制御のための変数があります.
LIB_DEPENDS
Port が必要とする非標準の共有ライブラリを
この変数で指定 します. これは
lib:
dir:
target という組のリストで,
うち lib
が共有ライブラリの名前, そして
dir
がそのライブラリが見つからない場合にインストールする port
のあるディレクトリで, target
はそのディレクトリで呼ばれるターゲットです. 例えば,
LIB_DEPENDS= jpeg.9:${PORTSDIR}/graphics/jpeg:install
と指定してあれば,
まずメジャーバージョンが9のjpegライブ
ラリがあるかどうか確認し, ない場合にはportsツリーの中の
graphics/jpeg
というサブディレクトリに移動し, そこ
でコンパイルとインストールを行ないます.
target の 部分は,
DEPENDS_TARGET (デフォルトは
install)
と等しいときには省略できます.
前半の lib 部分は
ldconfig -r | grep -wF
への引数になります.
この変数には正規表現を入れられません.
この依存関係は2度チェックされます. まず
extract ターゲットで, 次に
install でチェックされます.
(これは, その port を作成するマシンとインストールする
マシンが違う場合でも, きちんとそのライブラリが利用できる
ことを確認するためです.) また, 依存するもの名前は package
の中にも含まれますので, ユーザのシステムに存在しなければ,
pkg_add が自動的にインストールします.
RUN_DEPENDS
Port
を使用する際に必要となるファイルまたはプログラムがある
ときにはこの変数で指定します. これは
path:
dir
:target とい う組のリストで,
path
がファイルまたはプログラムの 名前, そして
dir
がそれが見つからない場合に作成する ためのディレクトリ名で
target
はそのディレクトリで呼ばれるターゲットです.
path の最初の文字がスラッ シュ
(/) の場合にはファイルかディレクトリ
とみなし, その存在を test -e
でチェックします; そうでない場合には
実行可能であると仮定し, which -s
を使って そのプログラムがユーザのサーチパス上に
あるかどうか確認します.
例えばMakefileに以下のように書いてあるとします.
RUN_DEPENDS= ${PREFIX}/etc/innd:${PORTSDIR}/news/inn \
wish8.0:${PORTSDIR}/x11-toolkits/tk80
まず, /usr/local/etc/innd
というファイルかディレクトリが存在 するか確認し,
ない場合にはportsツリーの中の
news/inn
というサブディレクトリから作られます. ま た,
wish8.0
というプログラムがユーザのサーチパス中 にあるかどうか探し,
ない場合には同じくportsツリーの
x11-toolkits/tk80
というサブディレクトリから作られます.
この例で, innd
は実際にはプログラムです; この ように,
プログラムであっても標準のサーチパス以外のところに
あるようなものの場合には,
絶対パスで指定してください.
この依存関係はinstall
ステージのはじめでチェック されます. また,
packageを作る際に必要となるportのpackage名 が記録され,
pkg_addを使用すると
ユーザのシステムに存在しない場合には自動的にそちら
のpackageもインストールされるようになります.
target の部分は,
DEPENdS_TARGET
と同じ場合には省略可能です.
BUILD_DEPENDS
Port
のコンパイルに必要なファイルまたはプログラムがある
ときは, この変数で指定してください.
RUN_DEPENDSと同 様に, これは
path:
dir
:target
という組のリストです. 例 えば,
BUILD_DEPENDS= unzip:${PORTSDIR}/archivers/unzip
は
unzip という名前のプログラムを探し,
見つから
ない場合にはarchivers/unzip
サブディレクトリで作 れという意味になります.
ここでは “コンパイル”
と一口にいいましたが, この変数は実際
にはファイルの展開から実際のコンパイル・リンクまで
全部をま とめて面倒を見てくれます. この依存関係は
extract
ステージからチェックされます.
target の部分は
DEPENDS_TARGET
と同じ場合には省略可能です.
FETCH_DEPENDS
この変数は,
portを取ってくるのに必要なファイルまたはプロ
グラムを指定するのに使います. 上の二つと同様に, これは
path:
dir
:target
という組のリストです. 例えば,
FETCH_DEPENDS= ncftp2:${PORTSDIR}/net/ncftp2
としておけば, ncftp2
という名前のプログラムを探 し,
見つからない場合にはnet/ncftp2
サブディレク トリにいってインストールします.
この依存関係は fetch
ステージからチェックされます.
target の部分は
DEPENDS_TARGET
と同じ場合には省略可能です.
DEPENDS
上記の四つのいずれにもあてはまらないような
依存関係がある場 合, または他の port
がインストールされれているだけではなく,
ソースが展開されている必要がある場合にはこの変数
を使います. これは
dir
:target という形式のリスト
になります. 上記の四つと違って特に
“確認”するものがありませんので.
よくある依存関係を表す変数
もし ports が X Window System を必要とするのであれば,
USE_XLIB=yes を定義してください.
(これは USE_IMAKEも意味します) BSD
make の代りに GNU
make を必要とする場合には,
USE_GMAKE=yes を定義. 動作するのに GNU
autoconf を必要とする場合には,
USE_AUTOCONF=yes を定義. 最新の qt
toolkit を使用 する場合には USE_QT=yes
を定義. perl 言語のバージョン5 を必要とする場合には,
USE_PERL5=yes を定義してください.
(特に最後のは重要で, FreeBSD のいくつかの
バージョンでは基本システムに perl5 を含みますが,
他のものは含んでいません.)
依存関係に関する注意
上で述べたように, 依存する ports
が必要になったときに呼ばれるデフォルトのターゲットは
DEPENDS_TARGET で,
そのデフォルトは install です. これは,
ユーザの使用する変数で, port の
Makefile
で定義されるものではありません. もし,
あなたのportが特別な方法で, 依存関係を扱う必要が
ある場合には, DEPENDS_TARGET
を再定義するのではなく, *_DEPENDS
変数の :target
の部分を利用してください.
make clean とタイプしたときには,
依存する port も自動的に clean されます.
もしそうしたくない場合には,
NOCLEANDEPENDS
を環境変数として設定してください.
無条件に他の port に依存させるには, 特別に
nonexistent という文字列を
BUILD_DEPENDS あるいは
RUN_DEPENDS
の最初のフィールドに使用してください. これは, 他の port
のソースが必要なときのみ使用してください. target
も指定することによって,
コンパイルの時間を節約することができます. 例えば,
BUILD_DEPENDS= /nonexistent:${PORTSDIR}/graphics/jpeg:extract
これは, 常に JPEG port の directory
に行きソースの展開を行ないます.
あなたがやりたいことが他の方法ではできない場合以外は,
DEPENDS を使わないでください.
これは常に 他の port
の作成を行い(さらにデフォルトでインストール を行い),
package も作成します. もし本当にこれがあなたの
やりたいことでしたら, 代りにこれを
BUILD_DEPENDS と
RUN_DEPENDS で書くことをお勧めします
— 少なくとも意図が明確になります.
コンパイル時の特別な指定
GNUのmakeを使う場合には,
USE_GMAKE=yes と指定してください. Port に
GNU の configure が含まれ ている場合には,
GNU_CONFIGURE=yes を使います(これは,
HAS_CONFIGURE も意味します).
configure に追加の引数 (デフォルトでは,
GNU の configure では
--prefix=${PREFIX}, GNUでない
configure では空)
を渡したい場合には追加部分を
CONFIGURE_ARGS で指定してください.
そのパッケージが autoconf
を使用する場合には, USE_AUTOCONF=yes
を使います. これは, GNU_CONFIGURE
も意味し, configure の前に
autoconf を実行します.
X Window Systemのアプリケーションなど,
imakeを 使って
Imakefile から
Makefile を作成するportの場合には
USE_IMAKE=yes を指定してください.
コンフィグレー ションステージで自動的にxmkmf
-a が実行されます. も し
フラグが問題をもたらすなら, さらに
XMKMF=xmkmfとしてください.
もし, port が imake
を使用するけれども, install.man
ターゲットがない場合には,
NO_INSTALL_MANPAGES=yes
を指定してください. ついでに, その port
のオリジナルの作者を探し出して八つ裂きにすると
いいでしょう.:>
Portの Makefile が
all 以外のものをメインのター
ゲットとしている場合には, ALL_TARGET でそ
れを指定してください. install と
INSTALL_TARGET も同様です.
もし, port の元の Makefile が
all
以外のターゲットをメインのターゲットとしている場合には,
ALL_TARGET
をそれに合わせて設定してください.
install と
INSTALL_TARGET についても同様です.
NO_INSTALL_MANPAGES
あなたの port がimakeは使うものの
install.man
ターゲットを持っていない場合,
NO_INSTALL_MANPAGES=yes
を指定してください. つい でに,
作者を探し出して八つ裂きにするといいでしょ う. (-_-#)
特別な配慮
Portを作成する場合,
考慮しなくてはいけないことがさらにいくつかあります.
この節では,
それらのうちもっともありがちなものについて説明します.
ldconfig
共有ライブラリをインストールするときには,
共有ライブラリのキャッシュを更新するために port の
Makefile の
post-installtarget
から${LDCONFIG} -m
を走らせてください.
このコマンドの引数は共有ライブラリのインストールしてある
ディレクトリ (通常
PREFIX/lib)
です.
また, pkg/PLIST に @exec
/sbin/ldconfig -m と @unexec
/sbin/ldconfig -R の組を入れて, package
をインストールした場合にも共有ライブラリがすぐ使え,
削除の際にも, システムがまだライブラリが存在すると
誤認しないようにしてください.
この行は共有ライブラリを指定する行のすぐ後に
書くのがよいでしょう:
lib/libtvl80.so.1
@exec /sbin/ldconfig -m %D/lib
@unexec /sbin/ldconfig -R
絶対に引数なしでただ
ldconfig とだけ書いてある行を
Makefile や
pkg/PLIST ファイルに入れないでください.
このコマンドを実行すると, 共有ライブラリのキャッシュが
/usr/lib の内容のみとなり,
ユーザのマシンにさまざまな問題をもたらします (「ぎゃぁ!
このportをインストールしたら xinit
が使えなくなっちゃった!」). この掟を破った者は,
永久に地獄の底で苦しみ続けるように,
閻魔様に頼んでおきます.
ELF 対応
FreeBSD は 3.0-RELEASE で ELF に移行しましたので,
シェアードライブラリを作成するたくさんの port を ELF 対応
にする必要があります. 3.0 システムは ELF としても a.out
としてmも 動作しますし, 我々は非公式ではありますが,
できるだけ長い間 2.2
システムのサポートをしたいと思っていますので, 複雑な状況です.
以下は a.out のみに対応している port をどのように a.out と ELF
両方に対応させるかのガイドライ ンです.
このリストの一部は,
移行時にしかあてはまらないものもありますが, 古い port
をアップグレードしたい場合に参考になるように,
しばらくのあいだは残しておきます.
a.out ライブラリの退避
a.out ライブラリは, /usr/local/lib
から, aout サブディレクトリ
に移動しなくはなりません. (もし移動しないと, ELF ports
がそれらをあっさり上書きして しまいます.) 3.0-CURRENT の
src/Makefile にある
move-aout-libs ターゲット
(aout-to-elf から呼ばれます)
がその移動をしてくれます. a.out
ライブラリを移動するだけなので, ELF と a.out
の両方のライブラリが標準的な ディレクトリにあるシステムでは,
このターゲットを実行しても安全です.
フォーマット
port ツリーは package
をそのマシンのフォーマットで作成します. つまり, 2.2 では
a.out, また 3.0 では `objformat`
の結果によって, a.out か ELF になります. また, いったん
a.out ライブラリをサブディレクトリに移動すると a.out
ライブラリの作成はサポートされません. (つまり,
あなたがにをすれば良いのかを理解しているのならば,
うまく作成できるかもしれませんが,
自力でやらなければならないということです)
もし port が aout でしか動作しないのなら,
BROKEN_ELF
に原因を説明する文字列を設定してください.
この変数が設定された port は, ELF
システム上でのビルドの際スキップされます.
PORTOBJFORMAT
bsd.port.mk において
PORTOBJFORMAT は aout
か elf に設定され, 環境変数
CONFIGURE_ENV, SCRIPTS_ENV,
MAKE_ENV の中で export されます. (2.2-STABLE
では常に aout になります). また,
PORTOBJFORMAT=${PORTOBJFORMAT} として
PLIST_SUB に渡されます. (以下にある
ldconfig
に関するコメントを参照して下さい.)
この変数は, 以下のようにして
bsd.port.mk 中で設定されます.
PORTOBJFORMAT!= test -x /usr/bin/objformat && /usr/bin/objformat || echo aout
この変数を使って, port の make
の過程で何をすべきかを決定すべきですが, もし port の
configure スクリプトが元々, ELF
システムを自動的に検出するのであれば,
PORTOBJFORMAT
を参照する必要はありません.
共有ライブラリの作成
以下は, a.out と ELF
での共有ライブラリの扱いの違いです.
共有ライブラリのバージョン
ELF の共有ライブラリは,
libfoo.so.M
という名前になっていなければなりません. ここで
M は単一の
バージョン番号を表します. 一方 a.out のライブラリは
libfoo.so.M.
N という名前で,
M はメジャーバージョン番号,
N
はマイナーバージョン番号になっている必要があります.
これらを混同しないでください.
libfoo.so.N.
M という名のELF
共有ライブラリや
libfoo.so.N
という名の a.out 共有ライブラリ
(あるいはシンボリックリンク) は
絶対にinstallしないでください.
リンカコマンドライン
直接 ld を使用せずに, cc
-shared を使用してください.
たった一つの違いは, ELF には,
コマンドラインにを加える必要があることです.
ELF のリンカを満足させるためには,
libfoo.so から
libfoo.so.N
へのシンボリックリンクを作る必要があります. これは,
PLIST にも加えなくては いけませんし,
a.out の場合でも害にはならないので (一部の port
ではダイナミックリンクローディングのために
必要でもあります), PORTOBJFORMAT
の設定を気にせずに,
ただ単純にリンクを作成してください.
LIB_DEPENDS
すべての port の Makefile を編集して,
LIB_DEPENDS
からマイナー番号を除去する必要があり,
正規表現のサポートも除去する必要があります. (例えば,
foo\\.1\\.\\(33|40\\) から
foo.2) マッチングは grep
-wF を使って行われます.
PLIST
PLIST は, a.out
のマイナー番号が0であれば, 短い (ELFの)
共有ライブラリの名前を含み, さもなくば長い (a.outの)
名前を含んでいる必要があります.
bsd.port.mk は 自動的に,
PORTOBJFORMAT が aout
であれば, .0 を
短い共有ライブラリの名前の行に付け加え,
PORTOBJFORMAT が elf
であれば, マイナー番号を
長い共有ライブラリの名前から削除します.
ELF システムで 2
つのバージョン番号を持つ共有ライブラリを インストールしたり,
aout システムで 1
つのバージョン番号しか持たない共有ライブラリを
インストールするのが避けられない場合
(例えば他のオペレーティングシステム用の
互換ライブラリをインストールする port など),
NO_FILTER_SHLIBS 変数を定義すれば,
前節で説明されている PLIST
編集の機能が停止されます.
ldconfig
Makefile 中の ldconfig
の行は以下のようになります.
${SETENV} OBJFORMAT=${PORTOBJFORMAT} ${LDCONFIG} -m ....
また PLIST 中では:
@exec /usr/bin/env OBJFORMAT=%%PORTOBJFORMAT%% /sbin/ldconfig -m ...
@unexec /usr/bin/env OBJFORMAT=%%PORTOBJFORMAT%% /sbin/ldconfig -R
となります. これは,
システムのデフォルトフォーマットではなく
パッケージのフォーマットに応じて, 正しい
ldconfig
が呼ばれることを保証するためのものです.
MASTERDIR
もし, あなたの port が 変数(例えば
解像度とか紙のサイズなど)を変えたりした,
ちょっと違うバージョンを作成する必要があるときには,
ユーザが分りやすいように, package
ごとに別々のサブディレクトリを作成し, ただし, できるだけ port
間でファイルを共有するようにしてください. 典型的な例では,
うまく変数を使えば,
とても短いMakefileだけ,
1つ以外のすべてのディレクトリに置くだけで済みます. その短い
Makefile には
MASTERDIR を使って,
残りのファイルがあるディレクトリを指定できます. また PKGNAME
の一部に変数に使って, package
が別々の名前を持つようにしてください.
以下が, とても良い例になるでしょう. これは
japanese/xdvi300/Makefile
の一部です:
PKGNAME= ja-xdvi${RESOLUTION}-17
:
# default
RESOLUTION?= 300
.if ${RESOLUTION} != 118 && ${RESOLUTION} != 240 && \
${RESOLUTION} != 300 && ${RESOLUTION} != 400
@${ECHO} "Error: invalid value for RESOLUTION: \"${RESOLUTION}\""
@${ECHO} "Possible values are: 118, 240, 300 (default) and 400."
@${FALSE}
.endif
japanese/xdvi300 は通常のパッチ,
package ファイルももっています. そこで,
make と入力すると,
デフォルトの解像度(300)を使って, 普通に port
の作成を行います.
他の解像度に関してですが, これが,
xdvi118/Makefile の(コメントを除いた)
すべてです.
RESOLUTION= 118
MASTERDIR= ${.CURDIR}/../xdvi300
.include ${MASTERDIR}/Makefile
(xdvi240/Makefile と
xdvi400/Makefile も同様です).
MASTERDIR が
bsd.port.mk に
PATCHDIR や PKGDIR
などの通常のサブディレクトリが xdvi300
にあることを教えます. RESOLUTION=118
の行が, xdvi300/Makefile の
RESOLUTION=300 の行を無効にし, port
は解像度を118として作成されます.
共有ライブラリのバージョン
まず,
共有ライブラリのバージョンについての指針 を読んで,
共有ライブラリのバージョンを
一般的にどうすれば良いかを理解してください. 盲目的に,
ソフトウエアの作者がちゃんと理解していると
信じててはいけません, 多くの場合違います.
細い点まで考慮することは大変重要なことです,
なぜなら我々は互換性がないかもしれない大量の
ソフトウェアを共存させようとする, 特殊な状況にあるからです.
不注意な port の導入が共有ライブラリに関して,
多大な問題を引き起したことが過去にあります (今まで,
jpeg-6b がなぜ 9.0
といバージョン番号を持っているか不思議に
思ったことはありませんか?). もし, 疑問があれば, &a.ports;
にメールを送ってください. ほとんどの時間は,
正しいシェアードライブラリのバージョンを決めることと,
それを実現するためのパッチを作成することに終始します.
しかしながら, が同じソフトウェアの違ったバージョンの
ソフトウェアが既にツリーにあるばあいには,
状況は非常に複雑です.
つまり, FreeBSD では,
ユーザがリンカにどのバージョンの共有ライブラリを
使用するかを指定できないからです
(リンカは常にもっとも高いバージョンを選びます). これは, もし,
libfoo.so.3.2 と
libfoo.so.4.0
がシステムに存在するときには,
リンカに特別なアプリケーションだけ
libfoo.so.3.2
をリンクするように指示する方法がないことを意味します. これは,
コンパイル時のリンクという意味では完全に見劣りします.
この場合の唯一の解決方法は, 共有ファイルの名前の
ベース 部分を変えることです. 例えば,
libfoo.so.4.0 を
libfoo4.so.1.0 へ変えることによって,
バージョン 3.2 とバージョン 4.0 共に他の port
からリンクされることができるようになります.
マニュアル
MAN[1-9LN] 変数を使用すると,
自動的にすべてのマニュアルを pkg/PLIST
に加えます (つまり, マニュアルを PLIST
に加えては いけません — PLIST の生成
を参照してください). またマニュアルを
/etc/make.conf 中の
NOMANCOMPRESS の設定に応じて,
install時に自動的に圧縮したり伸長したりします.
マニュアルをインストール時に圧縮するかどうかを
指定するには, MANCOMPRESSED
変数を使用します. この変数は, 3つの値をとることができます,
yes, no そして
maybe です. yes
はマニュアルが既に圧縮されて インストールされている,
no はされていない, maybe
はそのソフトウェアがすでに, NOMANCOMPRESS
に合わせており bsd.port.mk
が特別なにもする必要がないことを意味します.
USE_IMAKE がセットされていて,
NO_INSTALL_MANPAGES
がセットされていなければ, MANCOMPRESSED
は自動的に yes に設定され,
それ以外の場合には, no になります.
デフォルトがあなたの port
に合わない場合以外は明示的に設定する必要がありません.
PREFIX 以外のディレクトリの下に
マニュアルを置くような port では MANPREFIX
を指定することができます. さらに,
特定のセクションのマニュアルだけ,
標準ではない場所にインストールする場合, 例えばいくつかの Perl
のモジュールの ports など, には個々のマニュアルのパスを
MANsectPREFIX
(sect は, 1-9,
または, L か N
を表わします) によって指定できます. ができます.
マニュアルが, 言語特有のサブディレクトリに
置かれる場合には, 言語名を MANLANG
に設定してください. この変数のデフォルト値は,
"" になっています (つまり, 英語のみ).
これは, 全部をまとめた例です.
MAN1= foo.1
MAN3= bar.3
MAN4= baz.4
MANLANG= "" ja
MAN3PREFIX= ${PREFIX}/share/foobar
MANCOMPRESSED= yes
以下の6個のファイルがこの port でインストールされます.
${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
-
+
Motifを必要とするport
最近はコンパイルに Motif
を必要とするアプリケーションが増えて きました.
(Motif自体は有料のものがいくつかの会社から手に入りま すし,
多くのアプリケーションがコンパイル可能な無料の互換ライブラリ
が x11-toolkits/lesstifにあります)
Motifはかなり広く使われていますし, 製品のライ
センスではライブラリを静的にリンクした
実行形式は再配布が認めら れている場合が多いので,
Motifを必要とするソフトウェアを簡単に 動的(port
からコンパイルする人々のために)/静的(package を配布
する人々のために)にリンクできるような
しくみが用意されています.
REQUIRES_MOTIF
Motif
がないとコンパイルできないportのMakefileではこの変
数を指定してください. これによって,
Motifを持っていない人が
このportをコンパイルしようとするのを未然に防ぎます.
MOTIFLIB
この変数は bsd.port.mk によって
Motif ライブラリの指 定に置き換えられます.
ソース内のMakefileやImakefileで Motif
ライブラリを指定しているところをこの変数に置き換えるよ
うにパッチをあててください.
代表的な例としては以下の二つがあげられます:
MakefileかImakefileの中でMotifライブラリが
として使われている場合には,
かわりに MOTIFLIB
と書いてください.
Imakefileの中で XmClientLibs
が使われている 場合には, それを
${MOTIFLIB} ${XTOOLLIB}
${XLIB} と書きかえてください.
MOTIFLIB は通常
-L/usr/X11R6/lib -lXm か
/usr/X11R6/lib/libXm.a に置き換えら
れます. したがって前に や
をつけ る必要はありません.
X11 のフォント
もし, あなたの port が X window system
のフォントをインストールするのであれば, それらを
X11BASE/lib/X11/fonts/local
に置くようにしてください. このディレクトリは XFree86 release
3.3.3 で新設されたものです. もし,
それが存在しなければ作成し, ユーザに XFree86 を 3.3.3
かそれより新しいものに更新か, すくなくとも,
このディレクトリを /etc/XF86Config の
font path
に加えるように促すメッセージを出力するようにしてください.
Info ファイル
新しい版の texinfo(2.2.2-RELEASE
およびそれ以降に入っています) には,
install-info というコマンドが含まれており,
dir ファイルに項目を追加したり,
削除したりすることがで きます. もし, あなたの port が info
ドキュメントをインストー ルするのであれば, 以下の指示に従って,
その port および package が正しく, ユーザの
${PREFIX}/info/dir ファイル
を更新するようにしてください. (この節は,
とても長くてすいません, しかし info
ファイルを作りあげるためには, これらは不可欠 です.
正しく行なえば, 美しい
リストができますので, 辛抱してください! :)
まず, これを知っておかなければなりません:
&prompt.user; install-info --help
install-info [OPTION]... [INFO-FILE [DIR-FILE]]
Install INFO-FILE in the Info directory file DIR-FILE.
(訳注: Info ディレクトリの INO-FILE を DIR-FILE にインストールする)
Options:
--delete Delete existing entries in INFO-FILE;
don't insert any new entries.
(訳注: INFO-FILE の中の項目を削除,
新しい項目は一切追加しない.)
:
--entry=TEXT Insert TEXT as an Info directory entry.
(訳注: TEXT を Info ディレクトリの項目として追加する.)
:
--section=SEC Put this file's entries in section SEC of the directory.
(訳注: このファイルの項目を Info ディレクトリの SEC
という節に置く.)
:
このプログラムは, 実際には info
ファイルをインストール しません, 単に
dir
ファイルにエントリーを挿入したり削除し
たりするだけです.
これから, install-info
を使用するように, ports を変換す る7段階の工程を示します.
例として editors/emacsを
使用します.
まず, texinfo のソースを見て,
@dircategory と
@direntry 文がないファイルについて,
それらを追加するパッチを作成します. 以下は,
ここでの例での patchの一部です:
--- ./man/vip.texi.org Fri Jun 16 15:31:11 1995
+++ ./man/vip.texi Tue May 20 01:28:33 1997
@@ -2,6 +2,10 @@
@setfilename ../info/vip
@settitle VIP
+@dircategory The Emacs editor and associated tools
+@direntry
+* VIP: (vip). A VI-emulation for Emacs.
+@end direntry
@iftex
@finalout
:
フォーマットについては見ればわかると思います.
dir
というファイルに必要な項目を書いておいてくれる作者
も多いので, まず自分で書く前にさがしてみてください. また,
関係 する ports も調べて, 節(section)の名前や,
インデントなどが
きちんと合っているかどうかを確認してください
(項目のテキスト は, すべて4つめのタブ・ストップ(tab
stop)から始めることを推 奨します).
1つのファイルに対して1つの info
の項目しか書けないことに注 意してください, これは,
install-info --delete が, そのバグにより,
@direntry セクションに複数の項目を書
いても,
初めの1つの項目しか削除してくれないからです.
texinfo のソースにパッチをあてるかわりに,
dir の項目 を
install-info の
引数((,
) として与えることもできます.
これはあまり良い方法とは 思えません, なぜなら,
同じ情報を3ヶ所(Makefile,
PLIST の
@exec/@unexec:
以下参照) に重複して, 書く必要があるからです.
しかしながら, もし日本語(あるいは, 他のマルチバイト文字)の
info ファイルがあるのならば,
install-info
の特別な引数を使用する必要があるでしょう, なぜならば,
makeinfo がこのような texinfo
ソースファイル を扱えないからです.
(このようなものをどう扱うかの例としては,
japanese/skk の
Makefile と
PLIST を見て ください.)
portのディレクトリに戻って, make clean;
make をして, info ファイルが texinfo
ソースファイルから再び生成さ れることを確認してください.
texinfo ソースファイルのほうが info
ファイルよりも新しいので, make
とタイプすれば, info ファイルは再構築されるはずですが,
多くの Makefile には info
ファイルの正しい依存関係が書かれていません.
emacs の場合, info
ファイルの再構築ため, man
サブディレクトリ に降りていくようにするために, メインの
Makefile.in にパッ
チをあてる必要がありました.
--- ./Makefile.in.org Mon Aug 19 21:12:19 1996
+++ ./Makefile.in Tue Apr 15 00:15:28 1997
@@ -184,7 +184,7 @@
# Subdirectories to make recursively. `lisp' is not included
# because the compiled lisp files are part of the distribution
# and you cannot remake them without installing Emacs first.
-SUBDIR = lib-src src
+SUBDIR = lib-src src man
# The makefiles of the directories in $SUBDIR.
SUBDIR_MAKEFILES = lib-src/Makefile man/Makefile src/Makefile oldXMenu/Makefile lwlib/Makefile
--- ./man/Makefile.in.org Thu Jun 27 15:27:19 1996
+++ ./man/Makefile.in Tue Apr 15 00:29:52 1997
@@ -66,6 +66,7 @@
${srcdir}/gnu1.texi \
${srcdir}/glossary.texi
+all: info
info: $(INFO_TARGETS)
dvi: $(DVI_TARGETS)
man
サブディレクトリでのデフォルトターゲットは,
info で呼ばれるのに対して,
メインの Makefile では,
all で呼びたいので,
2つめのpatchが必要でした. また, info
info ファイルのインストールも削除しました, なぜなら,
同じものが同じ名前で既に
/usr/share/info にあるからです.
(このパッチはここにはありません.)
もし, Makefile に
dir ファイルをインストールす
る個所があれば, 削除します. あなたの port がインストー
ルしてはいけません. また, dir
ファイルを壊してしまうよう
なコマンドの類も削除します.
--- ./Makefile.in.org Mon Aug 19 21:12:19 1996
+++ ./Makefile.in Mon Apr 14 23:38:07 1997
@@ -368,14 +368,8 @@
if [ `(cd ${srcdir}/info && /bin/pwd)` != `(cd ${infodir} && /bin/pwd)` ]; \
then \
(cd ${infodir}; \
- if [ -f dir ]; then \
- if [ ! -f dir.old ]; then mv -f dir dir.old; \
- else mv -f dir dir.bak; fi; \
- fi; \
cd ${srcdir}/info ; \
- (cd $${thisdir}; ${INSTALL_DATA} ${srcdir}/info/dir ${infodir}/dir); \
- (cd $${thisdir}; chmod a+r ${infodir}/dir); \
for f in ccmode* cl* dired-x* ediff* emacs* forms* gnus* info* message* mh-e* sc* vip*; do \
(cd $${thisdir}; \
${INSTALL_DATA} ${srcdir}/info/$$f ${infodir}/$$f; \
chmod a+r ${infodir}/$$f); \
(これは, 既存のportを修正するときのみ必要です.)
pkg/PLIST を見て,
info/dir にパッチをあて
ようとするものすべてを削除します. これらは,
pkg/INSTALL
やその他のファイルにもあるかもしれない ので,
いろいろさがしてみてください.
Index: pkg/PLIST
===================================================================
RCS file: /usr/cvs/ports/editors/emacs/pkg/PLIST,v
retrieving revision 1.15
diff -u -r1.15 PLIST
--- PLIST 1997/03/04 08:04:00 1.15
+++ PLIST 1997/04/15 06:32:12
@@ -15,9 +15,6 @@
man/man1/emacs.1.gz
man/man1/etags.1.gz
man/man1/ctags.1.gz
-@unexec cp %D/info/dir %D/info/dir.bak
-info/dir
-@unexec cp %D/info/dir.bak %D/info/dir
info/cl
info/cl-1
info/cl-2
post-install ターゲットを
Makefile に加えて,
dir
ファイルが存在しなければ作成するようにします. また,
インストールされた info ファイルについては,
install-info
を実行するようします.
Index: Makefile
===================================================================
RCS file: /usr/cvs/ports/editors/emacs/Makefile,v
retrieving revision 1.26
diff -u -r1.26 Makefile
--- Makefile 1996/11/19 13:14:40 1.26
+++ Makefile 1997/05/20 10:25:09 1.28
@@ -20,5 +20,11 @@
post-install:
.for file in emacs-19.34 emacsclient etags ctags b2m
strip ${PREFIX}/bin/${file}
.endfor
+ if [ ! -f ${PREFIX}/info/dir ]; then \
+ ${SED} -ne '1,/Menu:/p' /usr/share/info/dir > ${PREFIX}/info/dir; \
+ fi
+.for info in emacs vip viper forms gnus mh-e cl sc dired-x ediff ccmode
+ install-info ${PREFIX}/info/${info} ${PREFIX}/info/dir
+.endfor
.include <bsd.port.mk>
新しい info ファイルを作成するのに,
/usr/share/info/dir と上のコマンド,
以外は使用しな いでください. 実際のところ, もし port
する人がこれに関して PLIST
に自らまったく手を加える必要がないのであれば, 上
のパッチのはじめの3行を bsd.port.mk
に加えたでしょう.
PLIST を編集して, 同じ働きをする
@exec 文, そ
れにpkg_delete のために
@unexec 文を加えてくださ い.
@unexec を使用して
info/dir を削除する必
要はありません.
Index: pkg/PLIST
===================================================================
RCS file: /usr/cvs/ports/editors/emacs/pkg/PLIST,v
retrieving revision 1.15
diff -u -r1.15 PLIST
--- PLIST 1997/03/04 08:04:00 1.15
+++ PLIST 1997/05/20 10:25:12 1.17
@@ -16,7 +14,15 @@
man/man1/etags.1.gz
man/man1/ctags.1.gz
+@unexec install-info --delete %D/info/emacs %D/info/dir
:
+@unexec install-info --delete %D/info/ccmode %D/info/dir
info/cl
info/cl-1
@@ -87,6 +94,18 @@
info/viper-3
info/viper-4
+@exec [ -f %D/info/dir ] || sed -ne '1,/Menu:/p' /usr/share/info/dir > %D/info/dir
+@exec install-info %D/info/emacs %D/info/dir
:
+@exec install-info %D/info/ccmode %D/info/dir
libexec/emacs/19.34/i386--freebsd/cvtmail
libexec/emacs/19.34/i386--freebsd/digest-doc
@unexec install-info --delete
コマンドは, info ファイル自身より先に置き,
コマンドがファイルを読めるようにし
ておかなければならないことに注意してください. また,
@exec install-info コマンドは info
ファイルおよび dir ファイルを作る
@exec コマンドより後に
おかなければなりません.
テスト
をして出来栄えに感服しましょう :) 各段階の前後に,
dir
ファイルをチェックしましょう.
pkg/ サブディレクトリ
まだ触れていない, いくつかのこつが
pkg/ サブディレクトリにはあり,
時として便利でしょう.
MESSAGE
もし, インストールする人にメッセージを表示する
必要がある場合には, そのメッセージを
pkg/MESSAGE に置けます. この機能は,
pkg_add
の後の追加のインストール手続きを表示するときなどに,
重宝します.
pkg/MESSAGE ファイルは
pkg/PLIST に加える必要はありません.
また, もしユーザが package ではなく port を使用して
いる場合には自動的には表示されませんので, 明示的に
post-install
で表示するようにするべきでしょう.
INSTALL
バイナリパッケージが pkg_add
でインストールされるときに, 実行される必要がある
コマンドがあれば, pkg/INSTALL
スクリプトを使って実行することができます.
このスクリプトは自動的に package に加えられ,
pkg_add によって2度実行されます. はじめは
INSTALL ${PKGNAME} PRE-INSTALL
と実行され, 2度目には, INSTALL ${PKGNAME}
POST-INSTALL と実行されます.
どちらのモードで実行されているかは,
$2 を調べることによってわかります.
環境変数 PKG_PREFIX には package
がインストールされるディレクトリが設定されます. 詳細は
&man.pkg.add.1; を見てください.
port を make install で
インストールするときには,
このスクリプトは自動的に実行されません. もし,
実行される必要があるならば, port の Makefile
から明示的に呼ぶ必要があります.
REQ
port が(インストールされるシステムの状態によって)
インストールされるべきか, されないべきか区別する必要が
あるときには, “要件(requirements)” スクリプト
pkg/REQ を作ることができます. これは,
インストール及びデインストール (package
の削除)の時に自動的に実行され,
それらが処理されるべきかを決定します.
make の変数にあわせた PLIST
の変更
いくつかの port, 特に p5- portsなど, は configure
のオプション (あるいは, p5- ports の場合は perl
のバージョン)によって, PLIST
を変える必要があります. これを容易に実現するために,
PLIST 中の
%%OSREL%%,
%%PERL_VER%%,
%%PERL_VERSION%% は,
適切に置き換えられるようになっています.
%%OSREL%% の値は,
オペレーティングシステムの数字で表されたリビジョンです
(例えば, 2.2.7).
%%PERL_VERSION%% は perl
のバージョン番号全体(例えば, 5.00502 )で,
%%PERL_VER%% はバージョン番号から,
パッチレベルを引いてものです(例えば,
5.005).
他の置き換えが必要であれば, PLIST_SUB
変数に
VAR=VALUE
という形式のペアのリストを設定することによって,
PLIST 中の
%%VAR%% は
VALUE に置き換えられます. 例えば,
バージョンに固有の沢山のファイルを インストールする場合には,
Makefile に
OCTAVE_VERSION= 2.0.13
PLIST_SUB= OCTAVE_VERSION=${OCTAVE_VERSION}
と書いて, PLIST
中のバージョン番号が表われるすべてのところに,
%%OCTAVE_VERSION%% と書きます.
このようにしておけば, port をアップグレードするときに,
何十行(ときとして, 何百行)も PLIST
を書き替えないですみます.
この書き換えは (
マニュアル の追加も)
do-install と
post-install ターゲット のあいだに,
PLIST を読み TMPPLIST
(デフォルトは,
WRKDIR/.PLIST.mktmp )
に書き込むことによって行なわれます. もし, あなたの port が
PLIST を実行時に生成するのであれば,
do-install のあいだか,
その前に行うようにしてください. また,
書きかえられたあとのファイルを編集する必要がある場合には,
post-install で,
TMPPLIST を書きかえてください.
pkg
サブディレクトリにあるファイル名の変更
pkg
サブディレクトリにあるファイルは全て, 変数を
使用して定義されていますので, 必要であれば
Makefile 中で 変更可能です. いくつかの
ports で 一つの pkg
サブディレクトリを共有する場合や, 上記のファイルに書き込む
必要があるときなど, 特に便利です. (pkg
サブディレクトリに直接書き込むのが良くない理由に ついては
WRKDIR
以外への書きこみ を参照してください.)
以下が変数名とそのデフォルト値の表です.
Variable
Default value
COMMENT
${PKGDIR}/DESCR
DESCR
${PKGDIR}/DESCR
PLIST
${PKGDIR}/PLIST
PKGINSTALL
${PKGDIR}/PKGINSTALL
PKGDEINSTALL
${PKGDIR}/PKGDEINSTALL
PKGREQ
${PKGDIR}/REQ
PKGMESSAGE
${PKGDIR}/MESSAGE
PKG_ARGSを上書きせずに,
これらの変数を変更 するようにしてください.
PKG_ARGSを変更すると これらのファイルは
port から正しく /var/db/pkg
にインストールされなくなります.
ライセンス上の問題
ソフトウェアによっては制限の厳しい
ライセンスがついてきたり, 法律的に問題があるかもしれません.
(PKPの公開鍵暗号化, ITAR (暗 号化ソフトウェアの輸出)
などが例としてあげられます). それらを
どう扱えばいいかはライセンスの文面によって
さまざまな場合があり ます.
ソフトウェア移植者として,
あなたにはライセンスをよく読み, FreeBSD プロジェクトが FTP
または CD-ROM で配布してはいけないソフ
トウェアを配布してしまうことのないよう,
注意する義務があります. なにか疑問がある場合には,
&a.ports;に聞いてみてください.
よく見られるケースに対処するために,
二つの変数が用意されてい ます:
ソフトウェアに “有償再配布を禁ずる”
という趣旨のライセン スがついてきた場合には
NO_CDROM
という変数にその理由を記述して ください.
私たちはこれがついているportはCD-ROMリリースに入
れないようにしますが,
オリジナルのソースファイルとpackage
はFTPでは取れるようにしておきます.
もしも, 生成される package
が個々のサイトで独自に構築さ れる必要があったり,
ライセンスによって生成されるバイナリが
配布できない場合には, NO_PACKAGE
変数にその理由を記述してくだ さい. そのような package が
FTP サイトに置かれたり, リリース 時の CD-ROM
へ入らないようにします. ただし, いずれの場合も distfile
は(FTP や CD-ROM に)含まれるようになります.
Portが, 使用者によっては法律上の問題が生じる時
(暗号化ソフ トウェアなど),
または“商用利用を禁ずる”とライセンスに書い
てある場合には
RESTRICTEDという変数にその理由を入れ
てください. この場合には,
ソースファイルやpackageは私たちの
FTPサイトにも置かれません.
GNU一般公有使用許諾書 (GPL) はバージョン1, 2とも
port作成上は何ら問題にはなりません.
もしあなたが,ソースツリー管理者 (committer)
であれば, ソースツリーにこのようなportを入れる際に,
ports/LEGAL
ファイルを書き換えるのを忘れないようにし
てください.
アップグレード
Port
のバージョンが原作者からのものに比べて古いことに気がつ
いたら, まずはあなたの持っているportが私たちの最新のもの
(ミラー サイトの ports/ports-current
というディレクトリにあります)
であることを確認してください.
次に, portの Makefile
にMAINTAINER (保守担当者) の
アドレスが書いてある場合には,
その人にメールを出してみましょう.
保守担当者の人がすでにアップグレードの準備を
しているかもしれま せんし,
(新しいバージョンの安定度に問題があるなど) あえてアッ
プグレードをしない理由があるのかもしれません.
保守担当者にアップグレードをしてくれと頼まれた場合,
あるいは
そもそもportのMakefileに保守担当者が書いてない場合などは, あ
なたがアップグレードをしてくださると助かります.
その場合にはアッ プグレードをしたのち,
変更前と変更後のディレクトリの再帰的diff (unified diff と
context diff のどちらでもいいのですが, port のコミッター達は
unified diff のほうを好むようです) をとって送ってください.
(例えば, 変更前のディレクトリが
superedit.bak という名前でとってあり,
変更後のもの が superedit
に入っているなら, diff -ruN superedit.bak
superedit の結果を送ってください. ) diff
の出力を見て, すべての変更が正しくなされているか確認して
ください. 変更箇所については, &man.send-pr.1; (カテゴリーは,
ports)に diff の出力結果を添えて,
私たちに送ってもらうのが一 番よいです. commit する際に CVS
に明確に記述しなければならない ので,
付け加えたり削除したりしたファイルがあったら, それについ
て書いておいてください. もし diff の大きさが 20 KB 程度を
超えるようであれば, 圧縮したものを uuencode して下さい.
そうでなければそのまま PR に入れるだけでいいです.
繰り返しになりますが, ports の変更を送るときには,
&man.shar.1; ではなく &man.diff.1;
を使用してください.
やっていいことといけないこと
この節では,
ソフトウェアをportする上でよくある落し穴などにつ
いて説明します. このリストを使って, あなた自身が作成した port
のチェックはもとより, PR データベースにある, 他の人が作成した
port のチェックもできます. あなたがチェックした port について
のコメントを バグ報告と一般的な論評
にしたがって, 送ってください. PR データベースにある port を
チェックすることによって, 私達がそれらを commit
するのを早くし,
あなたが何をしているか理解していることも示します.
バイナリのstrip
バイナリは strip してください.
オリジナルのソースがバイナリを strip
してくれる場合は良いですが, そうでない場合には
post-install ターゲットを指定して strip
するようにするとよいでしょう. 例えば,
こんな風になります:
post-install:
strip ${PREFIX}/bin/xdl
インストールされた実行形式がすでに strip
されているかどうかは file
コマンドで確認できます. これが`not
stripped'と言わなければ,
stripされているということです.
INSTALL_* マクロ
あなた自身の *-install
ターゲットでファイルの正しいモードと オーナを保証するために,
必ずbsd.port.mkで提供されて
いるマクロを使用してください.
マクロは以下のようなものがあります.
${INSTALL_PROGRAM}
は実行可能なバイナリを
インストールするコマンドです.
${INSTALL_SCRIPT}
は実行可能なスクリプトを
インストールするコマンドです.
${INSTALL_DATA}
は共有可能なデータを
インストールするコマンドです.
${INSTALL_MAN}
はマニュアルとその他のドキュメ
ントをインストールするコマンドです.
(圧縮はしません)
これらは基本的に install
コマンドに適当なフラグを与え たものです.
どのようにこれらを使用するかは以下の例を見てください.
WRKDIR
WKRDIR
の外のファイルにはなにも書き込まないように してください. WRKDIR は
ports のビルド中に書き込こめる
ことが保証されている唯一の場所です( CDROM から ports
をコンパイルを参照). PKGDIR
にあるファイルを修正する必要がある ときには, 変数の再定義
によって行ない, 上書きはしないでください.
-
+
WRKDIRPREFIX
WRKDIRPREFIX
を尊重していることを確認してください. 特に, 別の port の
WRKDIR を参照している
ときには気を付けてください. 正しい場所は,
WRKDIRPREFIX
PORTSDIR
/subdir/
name/work, です,
PORTSDIR/subdir/
name/work とか
.CURDIR/../../subdir
/name/work
とかではありません.
また, 自分で WRKDIR 定義するときには,
頭に
${WRKDIRPREFIX}${.CURDIR}
が付いている 事を確認してください.
OS や OS のバージョンの区別
Port の過程で, 修正や, どのバージョンの UNIX
で動くかによる条件つきコンパイルなどが
必要なコードに出会うかもしれません.
そのような条件つきコンパイルなどのための
変更をおこなうときには, FreeBSD 1.x システムへの移植や,
CSRGの4.4BSD, BSD/386, 386BSD, NetBSD, OpenBSD
などの他のBSDシステムへの移植が可能なように,
できるだけ普遍的な変更をおこなうことを
心がけてください.
4.3BSD/Reno (1990) およびそれより新しい BSD
版を古いバージョンと区別するには BSD
マクロを利用するのがよいでしょう. これは
<sys/param.h> で定義されています.
このファイルがすでにインクルードされていればよいのですが,
もしそうでない場合には以下のコードを, その
.c
ファイルの適当な場所に加えてください.
#if (defined(__unix__) || defined(unix)) && !defined(USG)
#include <sys/param.h>
#endif
これらの 2
つのシンボルが定義されているすべてのシステムには
sys/param.h があるはずです. もし,
そうでないシステムを発見したら我々にも教えてください.
&a.ports; までメールを送ってください.
あるいは, GNU の Autoconf
のスタイルを使用することもできます,
#ifdef HAVE_SYS_PARAM_H
#include <sys/param.h>
#endif
この方法を使用するときには,
Makefile 中の
CFLAGSに
-DHAVE_SYS_PARAM_H
を加えることを忘れないようにしてください.
いったん sys/param.h
がインクルードされると,
#if (defined(BSD) && (BSD >= 199103))
このようにしてそのコードが 4.3 Net2 コードベース,
またはそれより新しいもの (例: FreeBSD 1.x, 4.3/Reno, NetBSD
0.9, 386BSD, BSD/386 1.1とそれ以前)
の上でコンパイルされているかを検出できます.
#if (defined(BSD) && (BSD >= 199306))
これは, 4.4コードベース, またはそれより新しいもの (例:
FreeBSD 2.x, 4.4, NetBSD 1.0, BSD/386 2.0とそれ以後)
の上でコンパイルされているかどうかを
検出するために使用します.
4.4BSD-Lite2 コードベースでは, BSD
マクロの値は 199506 になっています.
これは参考程度の意味合いしかありません. 4.4-Lite ベースの
FreeBSD と 4.4-Lite2 での変更がマージされたバージョンとを
区別するのに使用するべきものではありません.
この目的のためには, __FreeBSD__
マクロをかわりに使用してください.
以下は控え目に使ってください.
__FreeBSD__
はFreeBSDのすべての版で定義されています. 変更が
FreeBSD
だけに適用されるとき以外は使用しないでください.
Portでよくある, strerror()
ではなく sys_errlist[]
を使うなどは, FreeBSDでの変更ではなく, BSD
の流儀です.
FreeBSD 2.xでは __FreeBSD__ が
2 と定義されています.
それ以前の版では 1 になっています.
その後の版では,
そのメジャー番号に合うように上がっていきます.
もし, FreeBSD 1.x システムと FreeBSD 2.x あるいは
FreeBSD 3.x システムを区別する必要があれば, 上で述べた
BSDマクロを使用するのが,
大抵の場合において正しい答です. もし,
FreeBSD特有の変更であれば (ld
を使うときのシェアードライブラリ用のなオプションなど),
__FreeBSD__を使い #if
__FreeBSD__ > 1 のようにFreeBSD 2.x
および, それ以降のシステムを検出するのはかまいません.
もし,
2.0-RELEASE以降のFreeBSDシステムを細かく検出したけれ ば,
以下を使用することができます.
#if __FreeBSD__ >= 2
#include <osreldate.h>
# if __FreeBSD_version >= 199504
/* 2.0.5+ release specific code here */
# endif
#endif
Release
__FreeBSD_version
2.0-RELEASE
119411
2.1-CURRENT's
199501, 199503
2.0.5-RELEASE
199504
2.1 以前の 2.2-CURRENT
199508
2.1.0-RELEASE
199511
2.1.5 以前の 2.2-CURRENT
199512
2.1.5-RELEASE
199607
2.1.6 以前の 2.2-CURRENT
199608
2.1.6-RELEASE
199612
2.1.7-RELEASE
199612
2.2-RELEASE
220000
2.2.1-RELEASE
220000 (2.2-RELEASE と同じです)
2.2.1-RELEASE 以後の 2.2-STABLE
220000 (これも同じです)
texinfo-3.9 以後の 2.2-STABLE
221001
top 導入以後の 2.2-STABLE
221002
2.2.2-RELEASE
222000
2.2.2-RELEASE 以後の 2.2-STABLE
222001
2.2.5-RELEASE
225000
2.2.5-RELEASE 以後の 2.2-STABLE
225001
ldconfig -R 以後の 2.2-STABLE
225002
2.2.6-RELEASE
226000
2.2.7-RELEASE
227000
2.2.7-RELEASE 以後の 2.2-STABLE
227001
semctl(2) 変更後の 2.2-STABLE
227002
2.2.8-RELEASE
228000
2.2.8-RELEASE 以後の 2.2-STABLE
228001
mount(2) 変更以前の 3.0-CURRENT
300000
mount(2) 変更以後の 3.0-CURRENT
300001
semctl(2) 変更以後の 3.0-CURRENT
300002
ioctl 引数変更後の 3.0-CURRENT
300003
ELF 移行後の 3.0-CURRENT
300004
3.0-RELEASE
300005
3.0-RELEASE 以後の 3.0-CURRENT
300006
3/4 の分岐後の 3.0-STABLE
300007
3.1-RELEASE
310000
3.1-RELEASE 以後の 3.1-STABLE
310001
3/4 の分岐後の 4.0-CURRENT
400000
(2.2-STABLE は, 2.2.5-RELESE 以後,
“2.2.5-STABLE” と呼ばれることがあります.)
見ての通り,
これは年・月というフォーマットになっていましたが,
バージョン 2.2 から,
より直接的にメジャー/マイナー番号を使う
ように変更になりました.
並行していくつかのブランチ(枝分かれし
たバージョン)を開発する場合には,
リリースされた日付でそれらの
リリースを分類することが不可能だからです. (あなたが今 port
を作成するときに, 古い -CURRENT 達について心配
する必要はありません.
これは参考のために挙げられているにすぎま せん.)
これまで, 何百ものportが作られてきましたが,
__FreeBSD__ が正しく使われたのは,
1つか2つの場合だけでしょう.
以前のportが誤った場所でそのマクロを使っているからと いって,
それをまねする理由はありません.
bsd.port.mk の後に書くこと
.include <bsd.port.mk>
の行の後には なにも書かないようにしてください. 大抵の場合は
Makefile の 中程のどこかで,
bsd.port.pre.mk を include して, 最後に
bsd.port.pre.mk を include
することによって避けることができます.
pre.mk/post.mk
のペアか bsd.port.mk
だけのどちらかだけを include してください.
2つを混ぜないでください.
前者は, いくつかの変数の定義だけ をして,
Makefile でのテストに使用し,
後者は残りを定義します.
以下は bsd.port.pre.mk
で定義される重要な変数です. (これは, すべてではありません.
完全なリストは bsd.port.mk
を参照してください.)
変数名
解説
ARCH
uname -m で返される
アーキテクチャ. (例, i386).
OPSYS
uname -s で返される
オペレーティングシステム (例,
FreeBSD).
OSREL
オペレーティングシステムの
リリースバージョン
(例., 2.1.5,
2.2.7).
OSVERSION
数字形式のオペレーティングシステム
のバージョン,
上記の
__FreeBSD_version
と同じです.
PORTOBJFORMAT
システムのオブジェクト
フォーマット (aout あるいは
elf).
LOCALBASE
“local” ツリーのベース.
(例, /usr/local/).
X11BASE
“X11” ツリーのベース.
(例, /usr/X11R6/).
PREFIX
portsのインストール先
(
PREFIXについてを参照).
USE_IMAKE,
USE_X_PREFIX あるいは
MASTERDIR
などの変数を定義する必要がある場合には,
bsd.port.pre.mk を include
する前に定義してください. 他のものは,
bsd.port.pre.mk
の前でも後でもかまいません.
以下は bsd.port.pre.mk
の後に書けるものの例です:
# no need to compile lang/perl5 if perl5 is already in system
.if ${OSVERSION} > 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
付加的ドキュメント
普通のマニュアルや info
ファイルのほかにユーザにとって有用だ
と思えるようなドキュメントがある場合には,
PREFIX/share/doc
の下にインストールしてく ださい. これは前記と同様,
post-installターゲットの
中からするのがいいでしょう.
まず, あなたのportのために新しいディレクトリを作りま す.
どのportのドキュメントか簡単にわかるような名前にする必
要がありますので, 普通は PKGNAME
からバージョ ン番号を除いた部分を使うといいでしょう.
もちろん, ユーザが異
なるバージョンのものを同時に使うことが予想される port の場合
には, PKGNAME
をそのまま使ってかまいません.
ユーザが /etc/make.conf
でこの部分を禁止するために NOPORTDOCS
という変数をセットしている場合には, これらのドキュメントが
インストールされないようにしてください. こんな具合です.
post-install:
.if !defined(NOPORTDOCS)
${MKDIR}${PREFIX}/share/doc/xv
${INSTALL_MAN} ${WRKSRC}/docs/xvdocs.ps ${PREFIX}/share/doc/xv
.endif
これらのファイルを pkg/PLIST
に入れるのを忘れないよ うにしてください.
(packageが/etc/make.conf内の
変数を読む方法は今のところ存在しませんので,
NOPORTDOCS
については気にしないでください.)
インストール時に pkg/MESSAGE
ファイルを利用して, メッセージを表示することができます.
詳細は pkg/MESSAGE を使う
の節を参照してください.
MESSAGE ファイルは
pkg/PLIST に加える必要はありま
せん.
DIST_SUBDIR
/usr/ports/distfiles
ディレクトリ内をあまり散らかさ ないようにしてください.
たくさんのファイルを取ってくるport や,
数は少なくてもほかのportのファイルと混同されるおそれが
あるファイル (Makefile など)
がある場合には, DIST_SUBDIR に port
の名前 (PKGNAME
からバージョン番号を取った部分を 使うといいでしょう)
を入れてください. すると,
DISTDIRがデフォルトの
/usr/ports/distfiles から
/usr/ports/distfiles/DIST_SUBDIR
に変更され,
取ってきたファイルはすべてそのサブディレクトリの中に置か
れるようになります.
また,
ファイルを取ってくるときにバックアップサイトとして使わ れる
ftp.freebsd.org
のディレクトリ名にもこの変数の 値が使われます.
(DISTDIRを明示的に指定し た場合には,
ローカルのファイルを置くところは変わりますが, こ
のサイトのディレクトリ名は変わりませんので, 必ず
DIST_SUBDIRを使うようにしてください.)
この変数はMakefile中で明示的に指定された
MASTER_SITES
には影響しないことに注意して ください.
RCS文字列
RCS
が特別な意味を与えている文字列をパッチ内に入れないように
してください.
ファイルを私たちのソースツリーに入れる時にこれら
の文字列はCVSによって書き換えられてしまい, あとでまたパッチ
を使おうとした時にうまくいかないことがあります. RCS文字列は
ドル記号 ($) で囲まれており,
$Id や $RCS
などで始まり ます.
パッチ作成上の注意
diffの再帰 ()
フラグを使って再帰的なパッ チを作るのは大変結構なのですが,
でき上がったパッチは必ず目で
チェックして余計なゴミが入っていないことを確認してくださ い.
よくあるのはバックアップファイル同士の変更点, あるいは
Imake や GNU configure
を使うソフトウェアの Makefile
の変更点が入っている場合などです. また,
configure.in を編集して,
autoconf を使って
configure を作り直す ときには,
configure の diff は含めずに (それらは,
数千行になることもしばしばです),
USE_AUTOCONF=yes を定義して,
configure.in の diff
をとってください.
ファイルをまるごと消す場合にはパッチを使わずに
post-extract
ターゲットで消す方が簡単です. できあがった 差分に満足したら,
それらをソースのファイルごとに別々の
パッチファイルに分割してください.
PREFIX
なるべく port は PREFIX
に対する相対パス
にインストールすることができるように心がけてください.
(この変数の値は USE_X_PREFIXか
USE_IMAKEが指定してある時には
X11BASE
(デフォルト/usr/X11R6),
そうでない場合にはLOCALBASE
(デフォルト/usr/local)
にセットされます.)
サイトによってフリーソフトウェアが
インストールされる場所が 違いますので, ソース内で
/usr/local や
/usr/X11R6
を明示的に書かないようにしてください. X のプログラムで
imake を使うものについては, これは問題に
はなりません. それ以外の場合には, ソース中のMakefileやスク
リプトで
/usr/local (imakeを使わないXのプログラ
ムは /usr/X11R6) と書いてあるところを
PREFIX に書き換えてください. この値は
portのコンパイル,
およびインストール時に自動的に環境変数として
下位makeに渡されます.
USE_X_PREFIXは本当に必要な時 (つまり,
X のライブラリなどとリンクしたり, X11BASE
以下にある ファイルを参照したりする必要がある時)
以外には設定しないでください.
変数 PREFIX の値は port の Makefile
やユーザの環境で変更することもできます. しかし, 個々の port
が Makefile
でこの変数の値を明示的に設定することはなるべくしない
でください.
また, 他の port
からインストールされるプログラムやファイル
を指定するときには, 上で述べた変数を使用してください.
例えば, less のフルパスを
PAGER というマクロに入れた い場合は,
コンパイラに
-DPAGER=\"/usr/local/bin/less\"
と渡すかわりに
-DPAGER=\"${PREFIX}/bin/less\"
(Xを使うportの時は
-DPAGER=\"${LOCALBASE}/bin/less\" )
を渡し てください. こうしておけば, `/usr/local'
がまるごとどこか他 の場所に移してあるサイトでも,
あなたのportがそのまま使える 可能性が高くなります.
ディレクトリ構成
インストール時には PREFIX
の正しいサブディ
レクトリにファイルを置くように心がけてください. ソフトウェア
によっては新しいディレクトリを
一つ作ってファイルを全部それに 入れてしまうものがありますが,
それはよくありません. また, バ イナリ,
ヘッダファイルとマニュアル以外のすべてを
lib
というディレクトリに入れてしまうportもあります が,
これもBSD的なファイルシステム構成からいうと正しくありま
せん. これは以下のように分散すべきです.
etc にセッ
トアップ/コンフィグレーションファイル,
libexec に 内部で使用されるプログラム
(コマンドラインから呼ばれることの ないコマンド),
sbin に管理者用のコマンド,
info に GNU Info 用のドキュメント,
そして share
にアーキテクチャに依存しないファイルが入り ます.
詳細については man &man.hier.7; を見てくださ い.
/usrの構成方針はほとんどそのまま
/usr/localにもあてはまります. USENET
“ニュース”を 扱う ports は例外です. これらは,
ファイルのインストール先として
PREFIX/news
を使用します.
空のディレクトリの除去
ports は デインストール(削除) の際には,
自分自身を消去したあとに, (ディレクトリの)
除去をするようにしてください. これは, 大抵の場合
@dirrm の行を ports
が作成するすべてのディレクトリについて
加えることによって実現できます. 親ディレクトリは,
子ディレクトリを先に消さないと
消せないことに気をつけて下さい.
:
lib/X11/oneko/pixmaps/cat.xpm
lib/X11/oneko/sounds/cat.au
:
@dirrm lib/X11/oneko/pixmals
@dirrm lib/X11/oneko/sounds
@dirrm lib/X11/oneko
といった感じです.
しかし, ときとして, 他の port
をディレクトリを共有しているために @dirrm
がエラーを返すことがあります. rmdir を
@unexec から呼びだすことによって,
警告(warning)なしで
空のディレクトリのみを削除することができます:
@unexec rmdir %D/share/doc/gimp 2>/dev/null || true
これを使えば, たとえ, 他の port がファイルを
インストールしていて,
PREFIX/share/doc/gimp
が空でない場合でも エラーメッセージは表示されませんし,
pkg_delete
が異常終了することもありません.
UID
もしあなたの
portがインストールされるシステム上に特定のユー
ザを必要とする場合は, pkg/INSTALL
スクリプトから pw
コマンドを実行して自動的にそのユーザを追加するよ
うにしてください. net/cvsup-mirror の
portが参考になるでしょう.
もしあなたの port が, バイナリのパッケージとしてとして
インストールされるときにも,
コンパイルされたときと同じユーザー/グループ ID
を使わなければならないのなら, 50 から 99 の間で空いている
UID を選んで登録してください.
japanese/Wnn の port
が参考になるでしょう.
既にシステムや他の portで利用されている
UIDを使わないように 十分注意してください. 現在の 50から
99までの間の UIDは以下の とおりです.
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
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:/nonexistent
wnn:*:69:7:Wnn:/nonexistent:/nonexistent
ifmail:*:70:66:Ifmail user:/nonexistent:/nonexistent
pgsql:*:70:70:PostgreSQL pseudo-user:/usr/local/pgsql:/bin/sh
ircd:*:72:72:IRCd hybrid:/nonexistent:/nonexistent
alias:*:81:81:QMail user:/var/qmail/alias:/nonexistent
qmaill:*:83:81:QMail user:/var/qmail:/nonexistent
qmaild:*:82:81:QMail user:/var/qmail:/nonexistent
qmailq:*:85:82:QMail user:/var/qmail:/nonexistent
qmails:*:87:82:QMail user:/var/qmail:/nonexistent
qmailp:*:84:81:QMail user:/var/qmail:/nonexistent
qmailr:*:86:82:QMail user:/var/qmail:/nonexistent
msql:*:87:87:mSQL-2 pseudo-user:/var/db/msqldb:/bin/sh
このリストを最新の状態に保つためにも,
この範囲の UID や GID を予約するような port を作ったり,
既存の port にそのような改変を行って我々に送るときには,
UID の予約に関する注意書きをつけてください.
合理的な port
Makefile
は単純かつ適切であるべきです. もし,
Makefile を数行短かくできたり,
もっと読みやすくできるのであれば, そうしてください. 例えば,
shell の if 構文を使う代りに, make の
.if 構文を使う,
EXTRACT* の再定義で代用できるのであれば,
do-extract を再定義しない,
CONFIGURE_ARGS +=
--prefix=${PREFIX} とするかわりに,
GNU_CONFIGURE とする, などです.
CFLAGS の尊重
CFLAGS 変数は尊重すべきです. その
port がこれを無視するのであれば,
NO_PACKAGE=ignores cflags を
Makefile に加えてください.
コンフィグレーション(設定)ファイル
もしあなたの port が設定ファイルを
PREFIX/etc
に置く必要がある場合には, それを単純にインストールしたり,
pkg/PLIST
に加えてはいけません. こうしてしまうと,
pkg_delete が
ユーザが苦労して作ったファイルを消してしまったり, 新しく
インストールすると上書きされてしまったりします.
代りに, 見本となるファイルを suffix (
filename.sample が良いでしょう)
を付けて インストールして,
message を表示して, ソフトウエアを動かす前に,
ユーザがそのファイル
をコピーして編集をしなければならないことを知らせましょう.
Portlint
送付や commit をする前に portlint
を使ってチェックしましょう.
フィードバック
Portを作るためにソフトウェアに変更を加えたら,
なるべく原作者にその旨を伝えてパッチ等を送ってください.
これらが次のリリースに取り入れられれば,
アップグレードが楽になります.
その他諸々
pkg/DESCR,
pkg/COMMENT,
pkg/PLIST などのファイルは,
それぞれ2重にチェックしてください.
再検討してもっと良い記述があれば,
それに置きかえてください.
GNU General Public License
(GNU一般公有使用許諾)のコピーは
(すでにあるので)コピーしないでください,
おねがいします.
法律に関することには, 十分注意をはらってください.
私達に法律に反するような形でソフトフェアの配布をさせない
でください!
困ったら....
私たちに質問を送る前に,
既存のportの例とbsd.port.mkを
ちゃんと読んでください! ;)
それでもわからないことがあったら,
一人で悩まないでどんどん 質問してください! :)
Makefile のお手本
これはportの Makefile
を作る際のお手本です. かぎかっこ
([])内のコメントは忘れずに取ってください.
変数の順番, 段落の間の空行など,
Makefile を作るときはなるべくこ
の形式にしたがってください.
この形式は重要な情報が簡単に見つけられるように
設計されています. portlint を使って
Makefile をチェックすることが
推奨されています.
[ヘッダ -- どのようなportのMakefileかすぐにわかるようになっています]
# New ports collection makefile for: xdvi
# Version required: pl18 ["1.5alpha" みたいなのでも結構です]
[この Makefile の最初の版が作成された日付です. この port をアップグ
レードするときには変えないでください.]
# Date created: 26 May 1995
[このソフトウェアを最初に FreeBSD に port した人の名前, つまり,
この Makefile の最初の版を書いた人です. この port をアップグレー
ドするとき, この行も変えないでください.]
# Whom: Satoshi Asami <asami@FreeBSD.ORG>
#
# $Id$
[ ^^^^ この部分は, CVS ツリーに入れる時に自動的に RCS の ID 文字列に
置き換えられます.]
#
[Port自体, およびオリジナルのソースを取ってくるところを記述する部分.
最初は必ずDISTNAME, そして必要ならPKGNAME, CATEGORIES, 続いて
MASTER_SITESがおかれ, さらに MASTER_SITE_SUBDIR がおかれることもあり
ます. そのあと, EXTRACT_SUFX か DISTFILES を指定することも可能です]
DISTNAME= xdvi
PKGNAME= xdvi-pl18
CATEGORIES= print
[MASTER_SITE_* マクロを使用しない場合は,
最後のスラッシュを忘れないように ("/")!]
MASTER_SITES= ${MASTER_SITE_XCONTRIB}
MASTER_SITE_SUBDIR= applications
[ソースファイルが標準の ".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
[依存する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 <bsd.port.mk>
Packageの名前
Package の名前は以下のルールにしたがってつけてください. こ
れは package のディレクトリを見やすくするためで, 無秩序な名前
がたくさん並んでいるとユーザが使いづらくなるのでは
という心配か らです.
(FTPサイトなどにはたくさんpackageがありますからね.)
Packageの名前は以下のようにしてください.
言語-名前-オプション
バージョン.番号
DISTNAME
が上記の形式になっていない場合に は,
PKGNAME をそのようにしてください.
FreeBSD
はユーザの慣れ親しんだ言語のサポートに力を入れて います.
特定の言語のためのportのpackage名には
言語- に ISO-639
で定義されている言語名の略称を入れ てください. 例えば,
日本語なら ja, ロシア語なら
ru, ベト ナム語なら
vi, 中国語なら zh,
韓国語ならば ko, ドイツ 語なら
de, といった具合です.
名前
の部分は原則的にはすべて英小文字 を使います.
例外はたくさんのプログラムが入っている巨大なport の場合で,
XFree86 (ほんとにあるんですよ) やImageMagickな
どがこれにあたります. そうでない場合には,
名前の大文字を小文 字に (少なくとも最初の一字だけは)
変えてください. もし, 大文字であることが重要な場合(例えば,
1文字の名前, R とか
V)には,
あなたの裁量で大文字を使うのも良いでしょう. Perl 5
のモジュールでは, 頭に p5- を付け,
2重コロン (::) のセパレータをハイフン(
- ) に置きかえるしきたりになっています.
例えば, Data::Dumper は
p5-Data-Dumper になります. また, その
ソフトウェアの名前として通常使われるものに番号, ハイフン,
あ るいは下線が入っている場合には,
それらを使うことも構いません (kinput2
など).
コンパイル時に環境変数や make
の引数などで
ハードコードされたデフォルト
を変えてコンパイルできる場合,
-compiled.specifics
にそのコンパイル時のデフォルトを入れてください
(ハイフンはあってもなくてもかまいません). 用紙のサイズ,
あるいはフォントの解像度などがこれにあたります.
バージョン番号は数字とアルファベットからなり, ピリオド
(.) で区切ります.
アルファベットは二文字以上続けてはいけませ ん.
ただ一つの例外は「パッチレベル」を意味する
pl で, それ 以外にバージョン番号が
まったくついていない場合にのみ使うことがで きます.
では, DISTNAMEを正しい
PKGNAMEに直す例を見てみましょう:
DISTNAME
PKGNAME
理由
mule-2.2.2.
mule-2.2.2
まったく問題なし
XFree86-3.1.2
XFree86-3.1.2
同上
EmiClock-1.0.2
emiclock-1.0.2
プログラム一つだけの時は小文字のみ
gmod1.4
gmod-1.4
`<名前>' のあとにハイフンが必要
xmris.4.0.2
xmris-4.0.2
同上
rdist-1.3alpha
rdist-1.3a
alphaのような文字列は使えない
es-0.9-beta1
es-0.9b1
同上
v3.3beta021.src
tiff-3.3
なんなんでしょう ;)
tvtwm
tvtwm-pl11
バージョン番号は必ず必要
piewm
piewm-1.0
同上
xvgr-2.10pl1
xvgr-2.10.1
pl
が使えるのは他にバージョン番号がない場合のみ
gawk-2.15.6
ja-gawk-2.15.6
日本語バージョン
psutils-1.13
psutils-letter-1.13
コンパイル時に用紙のサイズを指定
pkfonts
pkfonts300-1.0
300dpiフォント用のpackage
オリジナルのソースにまったくバージョン情報が見当たらず,
また原作
者が新しいバージョンをリリースする可能性が低いときには,
バージョ ン番号として 1.0
を使えばいいでしょう (上記のpiewmの例がこ れにあたります).
そうでない場合には, 原作者に聞くか, 日付
(
年.月
.日)
を使うなどしてください.
カテゴリ
すでに御存知のように, ports はいくつかのカテゴリに
分類されています. これを有効に利用するためには, port を
行う人々とユーザが, そろぞれのカテゴリが何であるか,
どのようにしてカテゴリに分類するかを理解する必要が
あります.
現在のカテゴリのリスト
まず, これが現在の port のカテゴリーのリストです.
アスタリスク(*) が付いているものは,
バーチャル(virtual) カテゴリです --
これらには対応するサブディレクトリが port
ツリーにはありません.
バーチャルカテゴリでないものは,
そのサブディレクトリ内の pkg/COMMENT
に1行の記述があります (例,
archivers/pkg/COMMENT).
Category
Description
afterstep*
Ports to support AfterStep window manager
archivers
Archiving tools.
astro
Astronomical ports.
audio
Sound support.
benchmarks
Benchmarking utilities.
biology
Biology-related software.
cad
Computer aided design tools.
chinese
Chinese language support.
comms
Communication software. Mostly software to talk to
your serial port.
converters
Character code converters.
databases
Databases.
deskutils
Things that used to be on the desktop before
computers were invented.
devel
Development utilities. Do not put libraries here just
because they are libraries—unless they truly don't
belong to anywhere else, they shouldn't be in this
category.
editors
General editors. Specialized editors go in the
section for those tools (e.g., a mathematical-formula
editor will go in math).
elisp
Emacs-lisp ports.
emulators
Emulators for other operating systems. Terminal
emulators do not belong
here—X-based ones should go to
x11 and text-based ones to either
comms or misc,
depending on the exact functionality.
games
Games.
german
German language support.
graphics
Graphics utilities.
japanese
Japanese language support.
kde*
Ports that form the K Desktop Environment
(kde).
korean
Korean language support.
lang
Programming languages.
mail
Mail software.
math
Numerical computation software and other utilities
for mathematics.
mbone
MBone applications.
misc
Miscellaneous utilities—basically things that
doesn't belong to anywhere else. This is the only category
that should not appear with any other non-virtual
category. If you have misc with
something else in your CATEGORIES line,
that means you can safely delete misc
and just put the port in that other subdirectory!
net
Miscellaneous networking software.
news
USENET news software.
offix*
Ports from the OffiX suite.
palm
Software support for the 3Com Palm(tm) series.
perl5*
Ports that require perl version 5 to run.
plan9*
Various programs from Plan9.
print
Printing software. Desktop publishing tools
(previewers, etc.) belong here too.
python*
Software written in python.
russian
Russian language support.
security
Security utilities.
shells
Command line shells.
sysutils
System utilities.
tcl75*
Ports that use tcl version 7.5 to run.
tcl76*
Ports that use tcl version 7.6 to run.
tcl80*
Ports that use tcl version 8.0 to run.
tcl81*
Ports that use tcl version 8.1 to run.
textproc
Text processing utilities. It does not include
desktop publishing tools, which go to print/.
tk41*
Ports that use tk version 4.1 to run.
tk42*
Ports that use tk version 4.2 to run.
tk80*
Ports that use tk version 8.0 to run.
tk81*
Ports that use tk version 8.1 to run.
vietnamese
Vietnamese language support.
windowmaker*
Ports to support the WindowMaker window
manager
www
Software related to the World Wide Web. HTML language
support belong here too.
x11
The X window system and friends. This category is
only for software that directly support the window system.
Do not put regular X applications here. If your port is
an X application, define USE_XLIB
(implied by USE_IMAKE) and put it in
appropriate categories. Also, many of them go into other
x11-* categories (see below).
x11-clocks
X11 clocks.
x11-fm
X11 file managers.
x11-fonts
X11 fonts and font utilities.
x11-toolkits
X11 toolkits.
x11-wm
X11 window managers.
適切なカテゴリの選択
多くのカテゴリに重なるので, どれを '第一'
カテゴリにするかを決めなければならないことが
たびたびあるでしょう. これを
うまく決めるルールがいくつかあります.
以下はその優先順のリストで, 優先度の高いものから
低いものの順に書いてあります.
言語特有のカテゴリがまず最初です. 例えば日本語の
X11 のフォントをインストールする port の場合,
CATEGORIES 行は japanese
x11-fonts となるでしょう.
より特徴的なカテゴリが, 一般的なカテゴリより
優先されます. 例えば, HTML エディタの場合は www
editors となり, 逆順にはしないでください.
また, port が mail,
mbone, news,
security, www
のいづれかに属するとには, net
は必要ありません.
x11 を第2カテゴリにするのは,
第1カテゴリが自然言語の場合のみにしてください. 特に X
のアプリケーションには x11
を指定しないでください.
もし, あなたの port が他のどのカテゴリにも
属しないばあいには, misc
にしてください.
もし, あなたがカテゴリについて自信が持てない場合には,
そのことを send-pr するときに
書き加えてください. そうすれば import するまえに
それについて議論できます. (もしあなたが commiter であれば,
そのことを &a.ports に送って, 先に議論
するようにしてください — 新しい port
が間違ったカテゴリに import されて,
すぐ移動されることが多いので.)
このドキュメントと ports システムの変更
もしあなたが, たくさんの ports の保守を
しているのであれば, &a.ports メーリングリストの内容を
フォロウすることを考えてください. Ports
のしくみについての重要な変更点はここに アナウンスされます.
最新の変更点については, いつでも, the bsd.port.mk CVS log で詳細な情報を得ることができます.
やっとおしまい!
いやはや, 長い文章ですみません.
ここまで読んでくださった方に は感謝, 感謝でございます. (_ _)
さあ, portの作り方がわかったところで,
世界中のソフトウェア をport化しましょう.
FreeBSDプロジェクトに貢献するには, それ
がもっとも簡単な方法です! :)
diff --git a/ja_JP.eucJP/share/sgml/authors.ent b/ja_JP.eucJP/share/sgml/authors.ent
index b72af61c7a..64298905e8 100644
--- a/ja_JP.eucJP/share/sgml/authors.ent
+++ b/ja_JP.eucJP/share/sgml/authors.ent
@@ -1,356 +1,358 @@
abial@FreeBSD.ORG">
ache@FreeBSD.ORG">
adam@FreeBSD.ORG">
alex@freebsd.org">
amurai@FreeBSD.ORG">
andreas@FreeBSD.ORG">
archie@FreeBSD.ORG">
asami@FreeBSD.ORG">
ats@FreeBSD.ORG">
awebster@pubnix.net">
bde@FreeBSD.ORG">
billf@FreeBSD.ORG">
brandon@FreeBSD.ORG">
brian@FreeBSD.ORG">
cawimm@FreeBSD.ORG">
charnier@FreeBSD.ORG">
chuckr@glue.umd.edu">
chuckr@FreeBSD.ORG">
cracauer@FreeBSD.ORG">
csgr@FreeBSD.ORG">
cwt@FreeBSD.ORG">
danny@FreeBSD.ORG">
darrenr@FreeBSD.ORG">
davidn@blaze.net.au">
dburr@FreeBSD.ORG">
dcs@FreeBSD.ORG">
des@FreeBSD.ORG">
dfr@FreeBSD.ORG">
dg@FreeBSD.ORG">
dick@FreeBSD.ORG">
dillon@FreeBSD.ORG">
dima@FreeBSD.ORG">
dirk@FreeBSD.ORG">
Dirk.vanGulik@jrc.it">
dt@FreeBSD.ORG">
dufault@FreeBSD.ORG">
dwhite@FreeBSD.ORG">
dyson@FreeBSD.ORG">
eivind@FreeBSD.ORG">
ejc@FreeBSD.ORG">
erich@FreeBSD.ORG">
faq@freebsd.org">
fenner@FreeBSD.ORG">
flathill@FreeBSD.ORG">
foxfair@FreeBSD.ORG">
fsmp@FreeBSD.ORG">
gallatin@FreeBSD.ORG">
gclarkii@FreeBSD.ORG">
gena@NetVision.net.il">
ghelmer@cs.iastate.edu">
gibbs@FreeBSD.ORG">
mjacob@FreeBSD.ORG">
gj@FreeBSD.ORG">
gpalmer@FreeBSD.ORG">
graichen@FreeBSD.ORG">
grog@FreeBSD.ORG">
gryphon@healer.com">
guido@FreeBSD.ORG">
hanai@FreeBSD.ORG">
handy@sxt4.physics.montana.edu">
helbig@FreeBSD.ORG">
hm@FreeBSD.ORG">
hoek@FreeBSD.ORG">
hosokawa@FreeBSD.ORG">
hsu@FreeBSD.ORG">
imp@FreeBSD.ORG">
itojun@itojun.org">
+jasone@FreeBSD.ORG">
+
jb@cimlogic.com.au">
jdp@FreeBSD.ORG">
jehamby@lightside.com">
jfieber@FreeBSD.ORG">
james@nexis.net">
jgreco@FreeBSD.ORG">
jhay@FreeBSD.ORG">
jkh@FreeBSD.ORG">
jkoshy@FreeBSD.ORG">
jlemon@FreeBSD.ORG">
john@starfire.MN.ORG">
jlrobin@FreeBSD.ORG">
jmacd@FreeBSD.ORG">
jmb@FreeBSD.ORG">
jmg@FreeBSD.ORG">
jmz@FreeBSD.ORG">
joerg@FreeBSD.ORG">
john@FreeBSD.ORG">
jraynard@freebsd.org">
jseger@freebsd.org">
julian@FreeBSD.ORG">
jvh@FreeBSD.ORG">
karl@FreeBSD.ORG">
kato@FreeBSD.ORG">
kelly@fsl.noaa.gov">
ken@FreeBSD.ORG">
kjc@FreeBSD.ORG">
kris@FreeBSD.ORG">
kuriyama@FreeBSD.ORG">
lars@FreeBSD.ORG">
ljo@FreeBSD.ORG">
luoqi@FreeBSD.ORG">
markm@FreeBSD.ORG">
martin@FreeBSD.ORG">
max@FreeBSD.ORG">
mark@vmunix.com">
mbarkah@FreeBSD.ORG">
mckay@FreeBSD.ORG">
mckusick@FreeBSD.ORG">
md@bsc.no">
mharo@FreeBSD.ORG">
mks@FreeBSD.ORG">
motoyuki@FreeBSD.ORG">
mph@FreeBSD.ORG">
mpp@FreeBSD.ORG">
msmith@FreeBSD.ORG">
nate@FreeBSD.ORG">
nectar@FreeBSD.ORG">
newton@FreeBSD.ORG">
n_hibma@FreeBSD.ORG">
nik@FreeBSD.ORG">
nsayer@FreeBSD.ORG">
nsj@FreeBSD.ORG">
obrien@FreeBSD.ORG">
olah@FreeBSD.ORG">
opsys@open-systems.net">
paul@FreeBSD.ORG">
pb@fasterix.freenix.org">
pds@FreeBSD.ORG">
peter@FreeBSD.ORG">
phk@FreeBSD.ORG">
pjchilds@imforei.apana.org.au">
proven@FreeBSD.ORG">
pst@FreeBSD.ORG">
rgrimes@FreeBSD.ORG">
rhuff@cybercom.net">
ricardag@ag.com.br">
rich@FreeBSD.ORG">
rnordier@FreeBSD.ORG">
roberto@FreeBSD.ORG">
rse@FreeBSD.ORG">
sada@FreeBSD.ORG">
scrappy@FreeBSD.ORG">
se@FreeBSD.ORG">
sef@FreeBSD.ORG">
shige@FreeBSD.ORG">
simokawa@FreeBSD.ORG">
smace@FreeBSD.ORG">
smpatel@FreeBSD.ORG">
sos@FreeBSD.ORG">
stark@FreeBSD.ORG">
stb@FreeBSD.ORG">
steve@FreeBSD.ORG">
swallace@FreeBSD.ORG">
taoka@FreeBSD.ORG">
tedm@FreeBSD.ORG">
tegge@FreeBSD.ORG">
tg@FreeBSD.ORG">
thepish@FreeBSD.ORG">
torstenb@FreeBSD.ORG">
truckman@FreeBSD.ORG">
ugen@FreeBSD.ORG">
uhclem@FreeBSD.ORG">
ulf@FreeBSD.ORG">
vanilla@FreeBSD.ORG">
wes@FreeBSD.ORG">
whiteside@acm.org">
wilko@yedi.iaf.nl">
wlloyd@mpd.ca">
wollman@FreeBSD.ORG">
wosch@FreeBSD.ORG">
wpaul@FreeBSD.ORG">
yokota@FreeBSD.ORG">