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の portspackages コレクション で利用可能です. ここに用意されているものは ネットを探し回る必要がありません インターネット上で入手可能な, 移植が容易な 何千ものアプリケーションを追加できます. FreeBSD は最も評判の よい商用の Unix システムとソースコードレベルで互換性があります. このため, ほとんどのアプリケーションは, もしあったとしてもほんの 少しの変更でコンパイルすることができます. デマンドページング 仮想メモリ とそれに “付随の VM/buffer キャッシュ”の設計は, 多くのメモリを要求する アプリケーションに対して効率よくメモリを 与えるようにする一方で, 他のユーザに対しても対話的な応答を維持します. 共有ライブラリ (MS-WindowsのDLLと同等のUnixの 機能) によって, ディスクスペースとメモリを効果的に使用する ことができます. 完全な CC++, 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 の魔術を実現するのに 必要とされるすべてのものを提供する最小の骨組みのことです. <filename>Makefile</filename> スケルトンのもっとも重要な要素は 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 のスクリプトと同じですね.) DISTNAMEtarball の名前から拡張子を取ったものです. 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 によって生成されたファイルを 正しい場所に置くために使用されます. <filename>files</filename> ディレクトリ ports のチェックサム算出には MD5 アルゴリズムを使用しているので, この チェックサム を含んでいる ファイルは md5 と呼ばれます. ちょっと混乱するかもしれませんが, このファイルは files という 名前のディレクトリに置かれています. このディレクトリは, ports に必要だけれども, 他のどこにも属さない 雑多なファイルも含んでいます. <filename>patches</filename> ディレクトリ このディレクトリには, FreeBSD ですべてを正常に動作させるのに 必要な パッチ が含まれています. <filename>pkg</filename> ディレクトリ このディレクトリには, 非常に役立つ三つのファイルが含まれています:- 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.ORGMASTER_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 は画像処理に必要な ライブラリを持っている, などです. または, barfoo をコンパイルするのに必要なツールなのかもしれません. 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.mkbsd.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 の始めに記述があります. また, このファイルは非標準のタブの設定になっています. EmacsVim はファイルのロード時にこれを認識しますが, viexでは, ファイルをロードしたら :set tabstop=4 のようにして正しい値を設定する ことができます. 3分porting この節では, 簡単なportの方法について説明します. 多くの場合これ では不十分ですが, まあうまくいくかどうか試してみて損はないでしょ う. まず, 元のtarファイルをDISTDIRに置きます. デフォルトは/usr/ports/distfilesです. 以下では, ソフトウェアはそのままコンパイルされるとします. つまり, FreeBSDのマシンで動かすために, 変更がまったく必要ない とします. もしなにか変更が必要な場合には次の節も参照する必要 があります. <filename>Makefile</filename> の作成 最小限の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です. <filename>COMMENT</filename> これには, そのportについての説明を1行で書きます. Package の名前, バージョン番号等は 含めないでください. たとえば, こんな具合です: A cat chasing a mouse all over the screen. <filename>DESCR</filename> これは, そのソフトウェアについての, すこし長い説明を記述します. その 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 <filename>PLIST</filename> このファイルには, この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 からインストールされた場合に正しく動作するかを 確認してください. <command>portlint</command> でチェック 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.mkdo- 何とか というターゲットでおこなわれます. たとえば, 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 ターゲットを作 成して, デフォルトを上書きすることもできます. しかし, そこま でする必要があることはめったにないでしょう. <makevar>DISTNAME</makevar> 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に取ってきますが, 展開時に はなにもせずに後で使うためにそのまま置いておかれます. <makevar>PKGNAME</makevar> もし, DISTNAME が我々の package の名前についてのガイドライン に沿ったものでない場合には, PKGNAME にもっと良い名前を設定してください. 詳細は上記のガイドラインを参照してください. <makevar>CATEGORIES</makevar> (分類) 完成した 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 はなにも考えずに 新しいディレクトリを作ってしまいますので, 注意してください. <makevar>MASTER_SITES</makevar> オリジナルの配布ファイルを指し示す 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 サイトではなく, これらの 有名なアーカイブの ミラーの中で好みのものを使用することが可能 です. <makevar>PATCHFILES</makevar> もし, オリジナルの配布ファイル以外にもFTPかHTTPで手に入る パッチが必要な場合には, PATCHFILESにファ イル名を, PATCH_SITESにサイトとディレクト リの名前を MASTER_SITES と同様に設定してく ださい. そのパッチ内のファイル名ががソースツリーの 一番上のディレク トリ (WKRSRC) からの相対パスになっていな い場合には, PATCH_DIST_STRIPを指定してく ださい. 例えば, パッチ内のファイル名にすべて余計な foozolix-1.0/ がついている場合には, PATCH_DIST_STRIP=-p1としてください. これらのパッチは圧縮されていても大丈夫です. ファイル名が .gz.Z で終わる場合には自動的に復元 されるようになっています. もしパッチが, 文書などその他のファイルと一緒に gzip された tarファイルで配布されている場合には,単純に PATCHFILES を使うことはできません. このような場合には, このパッチの tar ファイルの名前と場所を DISTFILESMASTER_SITES に加えます. それから, pre-patch ターゲットで, パッチコマンドを走らせるか, パッチファイルを PATCHDIR ディレクトリに patch-xx という名前でコピーするかして, パッチを適用するようにします. 普通の gzip か compress された tar ファイルであれば, 通常のソースファイルと一緒にその時までに 展開されていますので, 明示的に展開する必要はありません. もし, 後者の方法を使用する場合には, すでにそのディレクトリにある なにかを上書きしないように, 注意する必要があります. さらに, pre-clean ターゲットにコピーしたパッチファイル を削除するコマンドを追加するのを忘れないでください. <makevar>MAINTAINER</makevar> あなたのメールアドレスをここに入れてください. お願いします. :) 保守担当者(maintainer)の責任についての詳細は, Makefile 中の MAINTAINER の節をご覧ください. 依存関係 このプログラムが他のportに依存する場合には, 必要なものが 自動的に作られるようにすることができます. そのために, 以下の 5つの変数が用意されています. よくあるケースのためにあらかじめ設定された依存変数や, いくつかの依存関係の制御のための変数があります. <makevar>LIB_DEPENDS</makevar> 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 が自動的にインストールします. <makevar>RUN_DEPENDS</makevar> 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 と同じ場合には省略可能です. <makevar>BUILD_DEPENDS</makevar> Port のコンパイルに必要なファイルまたはプログラムがある ときは, この変数で指定してください. RUN_DEPENDSと同 様に, これは path: dir :target という組のリストです. 例 えば, BUILD_DEPENDS= unzip:${PORTSDIR}/archivers/unzipunzip という名前のプログラムを探し, 見つから ない場合にはarchivers/unzip サブディレクトリで作 れという意味になります. ここでは “コンパイル” と一口にいいましたが, この変数は実際 にはファイルの展開から実際のコンパイル・リンクまで 全部をま とめて面倒を見てくれます. この依存関係は extract ステージからチェックされます. target の部分は DEPENDS_TARGET と同じ場合には省略可能です. <makevar>FETCH_DEPENDS</makevar> この変数は, portを取ってくるのに必要なファイルまたはプロ グラムを指定するのに使います. 上の二つと同様に, これは path: dir :target という組のリストです. 例えば, FETCH_DEPENDS= ncftp2:${PORTSDIR}/net/ncftp2 としておけば, ncftp2 という名前のプログラムを探 し, 見つからない場合にはnet/ncftp2 サブディレク トリにいってインストールします. この依存関係は fetch ステージからチェックされます. target の部分は DEPENDS_TARGET と同じ場合には省略可能です. <makevar>DEPENDS</makevar> 上記の四つのいずれにもあてはまらないような 依存関係がある場 合, または他の 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_DEPENDSRUN_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の Makefileall 以外のものをメインのター ゲットとしている場合には, ALL_TARGET でそ れを指定してください. installINSTALL_TARGET も同様です. もし, port の元の Makefile が all 以外のターゲットをメインのターゲットとしている場合には, ALL_TARGET をそれに合わせて設定してください. installINSTALL_TARGET についても同様です. <makevar>NO_INSTALL_MANPAGES</makevar> あなたの port がimakeは使うものの install.man ターゲットを持っていない場合, NO_INSTALL_MANPAGES=yes を指定してください. つい でに, 作者を探し出して八つ裂きにするといいでしょ う. (-_-#) 特別な配慮 Portを作成する場合, 考慮しなくてはいけないことがさらにいくつかあります. この節では, それらのうちもっともありがちなものについて説明します. ldconfig 共有ライブラリをインストールするときには, 共有ライブラリのキャッシュを更新するために port の Makefilepost-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 とだけ書いてある行を Makefilepkg/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 において PORTOBJFORMATaoutelf に設定され, 環境変数 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 の設定を気にせずに, ただ単純にリンクを作成してください. <makevar>LIB_DEPENDS</makevar> すべての port の Makefile を編集して, LIB_DEPENDS からマイナー番号を除去する必要があり, 正規表現のサポートも除去する必要があります. (例えば, foo\\.1\\.\\(33|40\\) から foo.2) マッチングは grep -wF を使って行われます. <filename>PLIST</filename> PLIST は, a.out のマイナー番号が0であれば, 短い (ELFの) 共有ライブラリの名前を含み, さもなくば長い (a.outの) 名前を含んでいる必要があります. bsd.port.mk は 自動的に, PORTOBJFORMATaout であれば, .0 を 短い共有ライブラリの名前の行に付け加え, PORTOBJFORMATelf であれば, マイナー番号を 長い共有ライブラリの名前から削除します. ELF システムで 2 つのバージョン番号を持つ共有ライブラリを インストールしたり, aout システムで 1 つのバージョン番号しか持たない共有ライブラリを インストールするのが避けられない場合 (例えば他のオペレーティングシステム用の 互換ライブラリをインストールする port など), NO_FILTER_SHLIBS 変数を定義すれば, 前節で説明されている PLIST 編集の機能が停止されます. <literal>ldconfig</literal> 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 が呼ばれることを保証するためのものです. <makevar>MASTERDIR</makevar> もし, あなたの 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/Makefilexdvi400/Makefile も同様です). MASTERDIRbsd.port.mkPATCHDIRPKGDIR などの通常のサブディレクトリが xdvi300 にあることを教えます. RESOLUTION=118 の行が, xdvi300/MakefileRESOLUTION=300 の行を無効にし, port は解像度を118として作成されます. 共有ライブラリのバージョン まず, 共有ライブラリのバージョンについての指針 を読んで, 共有ライブラリのバージョンを 一般的にどうすれば良いかを理解してください. 盲目的に, ソフトウエアの作者がちゃんと理解していると 信じててはいけません, 多くの場合違います. 細い点まで考慮することは大変重要なことです, なぜなら我々は互換性がないかもしれない大量の ソフトウェアを共存させようとする, 特殊な状況にあるからです. 不注意な port の導入が共有ライブラリに関して, 多大な問題を引き起したことが過去にあります (今まで, jpeg-6b がなぜ 9.0 といバージョン番号を持っているか不思議に 思ったことはありませんか?). もし, 疑問があれば, &a.ports; にメールを送ってください. ほとんどの時間は, 正しいシェアードライブラリのバージョンを決めることと, それを実現するためのパッチを作成することに終始します. しかしながら, が同じソフトウェアの違ったバージョンの ソフトウェアが既にツリーにあるばあいには, 状況は非常に複雑です. つまり, FreeBSD では, ユーザがリンカにどのバージョンの共有ライブラリを 使用するかを指定できないからです (リンカは常にもっとも高いバージョンを選びます). これは, もし, libfoo.so.3.2libfoo.so.4.0 がシステムに存在するときには, リンカに特別なアプリケーションだけ libfoo.so.3.2 をリンクするように指示する方法がないことを意味します. これは, コンパイル時のリンクという意味では完全に見劣りします. この場合の唯一の解決方法は, 共有ファイルの名前の ベース 部分を変えることです. 例えば, libfoo.so.4.0libfoo4.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, または, LN を表わします) によって指定できます. ができます. マニュアルが, 言語特有のサブディレクトリに 置かれる場合には, 言語名を 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 を配布 する人々のために)にリンクできるような しくみが用意されています. <makevar>REQUIRES_MOTIF</makevar> Motif がないとコンパイルできないportのMakefileではこの変 数を指定してください. これによって, Motifを持っていない人が このportをコンパイルしようとするのを未然に防ぎます. <makevar>MOTIFLIB</makevar> この変数は 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/skkMakefilePLIST を見て ください.) 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 にあるからです. (このパッチはここにはありません.) もし, Makefiledir ファイルをインストールす る個所があれば, 削除します. あなたの 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 ファイルをチェックしましょう. <filename>pkg/</filename> サブディレクトリ まだ触れていない, いくつかのこつが pkg/ サブディレクトリにはあり, 時として便利でしょう. <filename>MESSAGE</filename> もし, インストールする人にメッセージを表示する 必要がある場合には, そのメッセージを pkg/MESSAGE に置けます. この機能は, pkg_add の後の追加のインストール手続きを表示するときなどに, 重宝します. pkg/MESSAGE ファイルは pkg/PLIST に加える必要はありません. また, もしユーザが package ではなく port を使用して いる場合には自動的には表示されませんので, 明示的に post-install で表示するようにするべきでしょう. <filename>INSTALL</filename> バイナリパッケージが 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 から明示的に呼ぶ必要があります. <filename>REQ</filename> port が(インストールされるシステムの状態によって) インストールされるべきか, されないべきか区別する必要が あるときには, “要件(requirements)” スクリプト pkg/REQ を作ることができます. これは, インストール及びデインストール (package の削除)の時に自動的に実行され, それらが処理されるべきかを決定します. make の変数にあわせた <filename>PLIST</filename> の変更 いくつかの 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-installpost-install ターゲット のあいだに, PLIST を読み TMPPLIST (デフォルトは, WRKDIR/.PLIST.mktmp ) に書き込むことによって行なわれます. もし, あなたの port が PLIST を実行時に生成するのであれば, do-install のあいだか, その前に行うようにしてください. また, 書きかえられたあとのファイルを編集する必要がある場合には, post-install で, TMPPLIST を書きかえてください. <filename>pkg</filename> サブディレクトリにあるファイル名の変更 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の MakefileMAINTAINER (保守担当者) の アドレスが書いてある場合には, その人にメールを出してみましょう. 保守担当者の人がすでにアップグレードの準備を しているかもしれま せんし, (新しいバージョンの安定度に問題があるなど) あえてアッ プグレードをしない理由があるのかもしれません. 保守担当者にアップグレードをしてくれと頼まれた場合, あるいは そもそも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されているということです. <makevar>INSTALL_*</makevar> マクロ あなた自身の *-install ターゲットでファイルの正しいモードと オーナを保証するために, 必ずbsd.port.mkで提供されて いるマクロを使用してください. マクロは以下のようなものがあります. ${INSTALL_PROGRAM} は実行可能なバイナリを インストールするコマンドです. ${INSTALL_SCRIPT} は実行可能なスクリプトを インストールするコマンドです. ${INSTALL_DATA} は共有可能なデータを インストールするコマンドです. ${INSTALL_MAN} はマニュアルとその他のドキュメ ントをインストールするコマンドです. (圧縮はしません) これらは基本的に install コマンドに適当なフラグを与え たものです. どのようにこれらを使用するかは以下の例を見てください. <makevar>WRKDIR</makevar> WKRDIR の外のファイルにはなにも書き込まないように してください. WRKDIR は ports のビルド中に書き込こめる ことが保証されている唯一の場所です( CDROM から ports をコンパイルを参照). PKGDIR にあるファイルを修正する必要がある ときには, 変数の再定義 によって行ない, 上書きはしないでください. - + <makevar>WRKDIRPREFIX</makevar> 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が誤った場所でそのマクロを使っているからと いって, それをまねする理由はありません. <filename>bsd.port.mk</filename> の後に書くこと .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 に加える必要はありま せん. <makevar>DIST_SUBDIR</makevar> /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 ターゲットで消す方が簡単です. できあがった 差分に満足したら, それらをソースのファイルごとに別々の パッチファイルに分割してください. <makevar>PREFIX</makevar> なるべく port は PREFIX に対する相対パス にインストールすることができるように心がけてください. (この変数の値は USE_X_PREFIXUSE_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 とする, などです. <makevar>CFLAGS</makevar> の尊重 CFLAGS 変数は尊重すべきです. その port がこれを無視するのであれば, NO_PACKAGE=ignores cflagsMakefile に加えてください. コンフィグレーション(設定)ファイル もしあなたの 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を ちゃんと読んでください! ;) それでもわからないことがあったら, 一人で悩まないでどんどん 質問してください! :) <filename>Makefile</filename> のお手本 これは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::Dumperp5-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カーネルのコンフィグレーション」の節をご覧く ださい. パラレルポートをサポートさせる場合も, その節と, あ わせて, この節に続く節もご覧ください. ポート用エントリを <filename>/dev</filename> に追加する カーネルがシリアル, または, パラレルポートを通じての通 信をサポートしていたとしても, システム上で動いているプログ ラムがデータの送受信をおこなうための ソフトウェアインタフェース がさらに必要になります. そのインタフェースは, /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; コマンドでファイルを送 信した後は, ファイル終了を表わすキーを入力する必要 があります. これで何かがプリントされることでしょう. 印字されたテキ ストがおかしくても心配しなくても構いません. それについ ては, 後で修正します. スプーラに許可を与える: <filename>/etc/printcap</filename> ファイル ここまでで, プリンタはコンピュータに接続され, (必要なら) プリンタと通信できるようにカーネルを変更し, 簡単なデータをプ リンタに送信することができているはずです. これで, 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/printcaplp 項目でそのエ ントリを指定します. これについては, 「 プリンタデバイスの特定」 を参照してください. プリンタをシリアルポートに接続した場合は, 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 と名付けられ, 別名として, psPS, S, panasonic, Panasonic KX-P4455 PostScript v51.4 が付けられていま す. ヘッダページの印字を禁止する LPDスプーリングシステムでは, デフォルトでジョブ毎にヘッ ダページを印字します. ヘッダページにはジョブを要求したユー ザ名, ジョブが送られたホスト名, そして, ジョブの名前が素晴 らしい大きな文字で印字されています. 残念なことに, この余分 なテキストすべてが, 簡単なプリンタ設定法のデバッグの際に紛れ 込んできてしまいます. このため, ヘッダページの出力を禁止し ておきます. ヘッダページの出力を禁止するには, /etc/printcap にあるプリンタのエントリに sh の項目を追加します. 次 に, sh を加えた /etc/printcap の例を示します. # # /etc/printcap for host rose - no header pages anywhere # rattan|line|diablo|lp|Diablo 630 Line Printer:\ :sh: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh: この書式を正しく使うための注意をしておきます. 最初の行は左 端のカラムから始まります. それに続く行は TAB ひとつ分だけ 字下げします. 最後の行以外のすべての行は, 行末にバックスラッ シュを記述します. スプーリングディレクトリの作成 スプーラの簡単な設定の次のステップでは, スプーリン グディレクトリを作成します. プリンタに送られるジョブ は, その印字が終了するまでこのディレクトリに置かれます. また, 他のたくさんのスプーラもこのディレクトリにファイ ルを置きます. 様々な事情によりスプーリングディレクトリは, 通常, 慣例 として /var/spool の下に置きます. また, スプーリングディレクトリの内容はバックアップをす る必要はありません. &man.mkdir.1; によってディレクトリを 作るだけでスプーリングディレクトリの復旧は完了します. スプーリングディレクトリの名前は, これも慣例ですが, 次 のようにプリンタの名前と同じにします. &prompt.root; mkdir /var/spool/printer-name しかしながら, ネットワーク上に使用可能なプリンタがたく さんあるならば, LPDで印字するための専用のディレクトリに スプーリングディレクトリを置きたいと思うかもしれません. 例に出てきたプリンタ rattanbamboo につい て, この方式を採用すると, 次のようになります. &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/printcapif 項目を使って指定しま す. これまでの /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 項目の通信速度と fsfc 項目のパリ ティビットの設定を共に調べてみてください. また, プリン タでの設定が /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 のエントリに加 えてみましょう. プリンタ bamboodf 項目を 新たに加えた/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/printcapsd 項目で指定する) に作 ることにします. フィルタが作業するにはここの場所は完璧 な場所で, なぜなら, 特に, スプーリングディレクトリのディ スクの空き容量は (ときどき) /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 項 目, lengthpl 項目に指定された数です. 出力フィルタの簡便さに誘惑されてはいけません. もし, ジョ ブ中のそれぞれのファイルに別のページ番号を付加しようと しても, 出力フィルタはうまく動作しないでしょう. そのような動作を期待しているならば, (入力フィルタとし ても知られている) テキストフィルタを使ってください. 詳 しくは, 「 テキストフィルタのインストール」をご覧ください. さらに, 出力 フィルタは, 実のところ, もっと複雑になっています. まず, 特殊なフラグ文字を検出するために, フィルタに送ら れてくるバイトストリームを検査する必要があります. また, LPD に代わって, 自分自身にシグナルを送らなければなりま せん. しかしながら, ヘッダページの印字をおこないたい場合, また, エスケープシーケンスやヘッダページを印字できるようにす るその他の初期化文字列を送信する必要がある場合, 出力ファ イルが必要です. 1台のプリンタに対し, LPD では出力フィルタとテキスト, または, 他のフィルタを両方使うことができます. このよう な場合, LPD はヘッダページ (「 ヘッダページ」 を参照してください) だけを印字させるために, 出 力フィルタを起動させます. それから LPD では, アウトプッ トフィルタに2バイトの文字 (ASCII 031 の次に ASCII 001) を送ることで, 出力フィルタが自力で停止することを 期待しています. 2バイト (031, 001) が出力フィルタに送られ たとき, 出力フィルタは自分自身にシグナル SIGSTOP を送 ることによって停止するべきです. LPD がその他のフィル タの起動を完了したとき, LPD は出力フィルタにシグナル SIGCONT を送ることで, 出力フィルタを再起動させます. 出力フィルタがあり, テキストフィルタがない場合, LPD はプレインテキストのジョブをおこなう際に, 出力フィル タを使います. 前述したように, 出力フィルタでは, ジョブ 中の各ファイルの並びの間に FROM FEED 文字や紙を排出す る他の文字を入れることはしません. この動作は多分, あな たが求めているものとは 異なっているでしょう. ほと んどすべての場合において, テキストフィルタが必要とされる はずです. プログラム lpf は, テキストフィルタの項で既に紹介 しましたが, 出力フィルタとしても動作させることができま す. もし, 簡便で極悪な出力フィルタが必要で, かつ, バイ トストリームを検査したりシグナルを送るコードを書きたく ないときには, lpf をお試しください. あるいは, プ リントが要求する初期化コードを送るために, lpf を シェルスクリプトに包んで使うこともできます. テキストフィルタ <command>lpf</command> プログラム /usr/libexec/lpr/lpf は, FreeBSD の バイナリ配布に付属しているテキストフィルタ (入力フィル タ) で, 出力を字下げしたり (lpr -i でジョブが入力さ れたとき), 文字を未処理のままプリンタに送ったり (lpr -l でジョブが入力されたとき), ジョブ中のバッ クスペースやタブの印字位置を調節したり, 印字したページ に対して課金したりすることができます. また, このフィル タは出力フィルタとしても動作させることができます. lpf は多くの印字環境において使用することに適して います. このフィルタには, プリンタに初期化文字列を送る 機能はありませんが, 必要とされる初期化をおこない, それから lpf を実行させるためのシェルスクリプトを作成する のはたやすいことです. lpf に対して, 印字ページへの課金を正確におこなわせる ためには, /etc/printcap ファイルの中の pwpl の項目に正確な値を入れておく必要が あります. これらの値は, どのくらいの量のテキストがペー ジにフィットするか, また, ユーザのジョブが何ページある のかを調べるために使われます. プリンタの課金についての 詳しい情報については, 「 プリンタの利用に対する課金」をご覧ください. ヘッダページ あなたが管理するシステムのユーザが たくさんおり, ユー ザ全員が様々なプリンタを使用する場合, 多分, 必要悪である ヘッダページ を印字させることを検討したいと思うかもしれま せん. ヘッダページは, バナー とか バーストページ としても知ら れていますが, 出力されたジョブが誰によるものなのかを特定させる 働きがあります. 印字結果の山の中において, ユーザのジョブによっ て印字された本物のドキュメント部分よりも際立たせるために, ヘッ ダページは, 通常, 多分, 縁が装飾されている大きな太文字で印字さ れます. ヘッダページにより, ユーザは自分が出したジョブがどこに あるのかをすばやく見つけることができます. ヘッダページの欠点は, 明らかに, すべてのジョブに対して, 紙が1枚余分に印字されるという ことです. この紙の有効期間は短く, 2〜3 分も続きません. 最終的に, これらの紙は再利用紙入れの中か くずの山に入れられることでしょう. (ヘッダページはジョブ中の各ファイル毎に印字されるのではなく, ジョブ毎に印字されるということに注意してください. したがって, 紙の 消費はそれほどひどくはないかもしれません). もし, プリンタがプレインテキストを直接印字できるならば, LPD システムは印字物に対して自動的にヘッダページを付けることが できます. PostScript プリンタを使っている場合は, ヘッダペー ジを生成する外部プログラムが必要になります. これについては, 「PostScript プリンタでのヘッダページ」をご覧ください. ヘッダページの印字を許可する プリンタ設定導入編 」 では, /etc/printcap ファイルの sh (``suppress header'' : “ヘッダを供給しない” という意味) を指定して, ヘッダペー ジの印字を止めていました. プリンタでのヘッダページの印字を許可 するには, sh 項目を取り除くだけよい訳です. とても簡単そうに見えるけど, 本当かな? それは本当です. プリンタに初期化文字列を送るための出力フィ ルタを用意しなくてはならないかもしれません. 次に, Hewlett Packard PCL 互換プリンタの例を挙げます. #!/bin/sh # # hpof - Output filter for Hewlett Packard PCL-compatible printers # Installed in /usr/local/libexec/hpof printf "\033&k2G" || exit 2 exec /usr/libexec/lpr/lpf of 項目に出力フィルタのパス名を指定してください. 詳細につ いては, 「出力フィルタ」 をご覧ください. 次に, 以前紹介したプリンタ teak のための /etc/printcap ファイルの例を示します. ここでは, ヘッ ダページの印字を許可し, 上記の出力フィルタを追加しました. # # /etc/printcap for host orchid # teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\ :lp=/dev/lpt0:sd=/var/spool/lpd/teak:mx#0:\ :if=/usr/local/libexec/hpif:\ :vf=/usr/local/libexec/hpvf:\ :of=/usr/local/libexec/hpof: さて, ユーザが teak からジョブを印字させたとき, それぞれ のジョブ毎にヘッダページが印字されます. もし, ユーザが印字物を 探すのに時間を費やしたいと思うなら, lpr -h によってジョ ブを入力することで, ヘッダページの印字を止めることができます. これ以外の &man.lpr.1; のオプションについては, 「 ヘッダページ用オプション」 をご覧ください. LPD では, ヘッダページの最後に, FROM FEED 文字が印 字されます. プリンタに紙排出をさせるために, 別な文字, もしくは, 別な文字列が利用されている場合は, /etc/printcap 中の ff 項目で指定することができます. ヘッダページを制御する ヘッダページの印字が許可されていると, LPD は 長いヘッ ダを作ります. これには, 紙全面に大きな文字でユーザ名, ホスト 名, ジョブ名が書かれています. 次に, このヘッダページの例を示 します (kelly が ジョブ名 outline を rose というホストから印字 された場合). k ll ll k l l k l l k k eeee l l y y k k e e l l y y k k eeeeee l l y y kk k e l l y y k k e e l l y yy k k eeee lll lll yyy y y y y yyyy ll t l i t l oooo u u ttttt l ii n nnn eeee o o u u t l i nn n e e o o u u t l i n n eeeeee o o u u t l i n n e o o u uu t t l i n n e e oooo uuu u tt lll iii n n eeee r rrr oooo ssss eeee rr r o o s s e e r o o ss eeeeee r o o ss e r o o s s e e r oooo ssss eeee Job: outline Date: Sun Sep 17 11:04:58 1995 LPD はこのテキストの終わりに FROM FEED 文字を加えます ので, ジョブは新しいページから開始されます (ただし, /etc/printcap で出力先のプリンタのエントリに sf (suppress form feeds) が指定されているときはこ の限りではありません). お望みならば, LPD に短いヘッダページを出力させる こともできます. この場合は, /etc/printcap ファ イルの中で sb (short banner) を指定してください. ヘッダページは次のようになります. rose:kelly Job: outline Date: Sun Sep 17 11:07:51 1995 デフォルトでは, LPD はヘッダページを最初に印字し, 次 にジョブの印字をおこないます. この順番を逆にするときは, /etc/printcaphl (header last) を指定 してください. ヘッダページに対する課金 LPD に備わっているヘッダページ出力機能を使うと, 入力され たジョブに対して課金をおこなうことができても, ヘッダページは無 料で提供しなくてはならない, という特有のやり方を強要されます. なぜでしょうか. 出力フィルタは単なる外部プログラムなので, 課金をするための制御 をおこなうとすれば, それはヘッダページを印字するときですが, 出力フィ ルタには, ユーザ名とホスト名 の情報や課金情報を格納するファ イルがどれな のかということが知らされません. それゆえ, 出力ファイルには, 誰 にプリンタ利用の課金をおこなえばよいのかが分からないのです. テキス トフィルタやその他の変換フィルタ (これらのフィルタはユーザやホ ストの情報が知らされます) が出力ページの枚数に“1ページ分水増し する”だけでは十分ではありません. なぜなら, ユーザは lpr -h に よってヘッダページの出力を止めることができるからです. やみくも に1ページを水増しすると, 印字されてもいないヘッダページに対する 料金をとることになります. 基本的に, lpr -h は環境に優し い心を持つユーザに好まれるオプションですが, これを使うように奨 励することもできません. 各々のフィルタに独自のヘッダページを生成させる (その結果, ヘッ ダページに課金することができる) という方法でも十分であると はいえません. この場合, LPD はフィルタに の情報を送 りませんので, lpr -h によってヘッダページを印字しないオ プションを選択したとしても, 依然としてヘッダページは印字され, その分の課金がおこなわれてしまいます. では, どのような選択肢があるのでしょうか. ヘッダページへの課金に関しては, 次のことができます. LPD のやり方を受け入れ, ヘッダページは無料とする. LPDng や PLP といった LPD の代替品をインストール する. LPD と入れ替えが可能な他のスプーリングソフトウェ アに関しては, 「 標準スプーラの代替品」をご覧ください. スマートな 出力フィルタを作成する. 通常, 出力 フィルタはプリンタを初期化するか, 単純な文字列変換をす る程度の働きしかしません. (テキスト (入力) フィルタがな い場合) 出力フィルタはヘッダページとプレインテキストの 印字をおこなうのに適しています. プレインテキストを印字するためのテキストフィルタがない 場合, LPD はヘッダページを印字するためだけの目的で出 力フィルタを起動します. そして, LPD が生成するヘッダ ページのテキストを解析することにより, 出力フィルタはヘッ ダページに課金するために必要なユーザ名とホスト名を取得 することができます. この方式の唯一の問題点は, 出力フィ ルタは課金情報を格納するデータファイルの名前を知ることが できないということです (af 項目で指定されたファイ ル名は出力ファイルに渡されません). しかし, 既知の 名前の課金データファイルを使うのならば, その名前を出 力フィルタのプログラム中に埋め込むことができます. 解析の手順を簡単にするためには, /etc/printcapsh 項目 (短いヘッダを指 定) を使うとよいでしょう. そしてまた, ここまでの方法は少なからぬトラブルを生じさ せるかもしれません. そうなれば, もちろんユーザはヘッダペー ジを無料で 提供してくれる気前のよいシステム管理者に感謝することで しょう. PostScript プリンタでのヘッダページ これまでに述べたように, LPD ではプレインテキストのヘッ ダページをたくさんのプリンタに合うように生成することが できます. 残念ながら, PostScript プリンタは, プレインテキストを直接 印字することができません. ですから, LPD のヘッダページ機能は まったく役に立たない, あるいはほとんどの場合で役に立ちません. ヘッダページを出力するための自明な方法の1つに, すべての変換フィ ルタとテキストフィルタにヘッダページを生成させる 方法があります. フィルタは, 適切なヘッダページを生成するために, ユーザ名とホス ト名の引数を使うべきです. この方法の欠点は, いつでも, lpr -h によってジョブが入力された場合でさえも, ヘッダページが印字 されるということです. この方法で試してみましょう. 次のスクリプトは, 3つの引数 (ユーザ のログイン名, ホスト名, ジョブ名) をとり, 簡単な PostScript 用 のヘッダページを生成します. #!/bin/sh # # make-ps-header - make a PostScript header page on stdout # Installed in /usr/local/libexec/make-ps-header # # # These are PostScript units (72 to the inch). Modify for A4 or # whatever size paper you are using: # page_width=612 page_height=792 border=72 # # Check arguments # if [ $# -ne 3 ]; then echo "Usage: `basename $0` <user> <host> <job>" 1>&2 exit 1 fi # # Save these, mostly for readability in the PostScript, below. # user=$1 host=$2 job=$3 date=`date` # # Send the PostScript code to stdout. # exec cat <<EOF %!PS % % Make sure we do not interfere with user's job that will follow % save % % Make a thick, unpleasant border around the edge of the paper. % $border $border moveto $page_width $border 2 mul sub 0 rlineto 0 $page_height $border 2 mul sub rlineto currentscreen 3 -1 roll pop 100 3 1 roll setscreen $border 2 mul $page_width sub 0 rlineto closepath 0.8 setgray 10 setlinewidth stroke 0 setgray % % Display user's login name, nice and large and prominent % /Helvetica-Bold findfont 64 scalefont setfont $page_width ($user) stringwidth pop sub 2 div $page_height 200 sub moveto ($user) show % % Now show the boring particulars % /Helvetica findfont 14 scalefont setfont /y 200 def [ (Job:) (Host:) (Date:) ] { 200 y moveto show /y y 18 sub def } forall /Helvetica-Bold findfont 14 scalefont setfont /y 200 def [ ($job) ($host) ($date) ] { 270 y moveto show /y y 18 sub def } forall % % That is it % restore showpage EOF そして, 変換フィルタやテキストフィルタがそれぞれ, 最初にこのス クリプトを起動することで, ヘッダページが出力され, それから, ユー ザのジョブの印字をおこないます. 次に, このドキュメントの始めのほう で紹介した DVI 変換フィルタを, ヘッダページを印字するように変 更したものを示します. #!/bin/sh # # psdf - DVI to PostScript printer filter # Installed in /usr/local/libexec/psdf # # Invoked by lpd when user runs lpr -d # orig_args="$@" fail() { echo "$@" 1>&2 exit 2 } while getopts "x:y:n:h:" option; do case $option in x|y) ;; # Ignore n) login=$OPTARG ;; h) host=$OPTARG ;; *) echo "LPD started `basename $0` wrong." 1>&2 exit 2 ;; esac done [ "$login" ] || fail "No login name" [ "$host" ] || fail "No host name" ( /usr/local/libexec/make-ps-header $login $host "DVI File" /usr/local/bin/dvips -f ) | eval /usr/local/libexec/lprps $orig_args このフィルタがユーザ名やホスト名を決定するために 引数リストをど のように解析しなくてはならないかという点に注意してください. こ の解析方法は他の変換フィルタに対しても同様です. しかしながら, テキストフィルタについては, 引数の設定が少し異なっています (こ れについては, 「 フィルタはどのように機能しているか」 をご覧ください). 前述の通り, 上記の手法は, 極めて単純なのにも関らず, lpr で“ヘッダページを印字しない”オプション ( オプション) が 使えなくなっています. ユーザが森林資源を (あるいは, ヘッダペー ジが課金されているならば, その僅かな金額を), 節約したいと望んでい る場合でも, すべてのフィルタがすべてのジョブ毎にヘッダページを印字 することになっているので, 節約することはできません. ジョブ毎に印字されるヘッダページを ユーザが抑制できるようにする ためには, 「 ヘッダページに対する課金」で紹介したトリックを 使う必要があります. すな わち, LPD が生成するヘッダページの解析をおこない, PostScript 版のヘッダページを出力させる出力フィルタを作るのです. この場 合, ユーザが lpr -h でジョブを入力すると, LPD はヘッダペー ジを生成しなくなり, また, 出力フィルタも起動されません. そうで ないならば, 作成した出力フィルタが LPD からのテキストを読み込 み, ヘッダページを印字する適当な PostScript のコードがプリ ンタに送られるでしょう. PostScript プリンタがシリアルポートに接続されている場合, 出力フィルタとして lprps を, 上記の動作をおこなうものとして psof を使うことができます. ただし, psof はヘッダペー ジに対して課金をおこないませんので注意してください. リモートプリンタからの出力 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台のプリンタ bamboorattan が接続されています. これらのプリンタをホスト 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 のユーザが rattanbamboo で印字す ることができるようになりました. 例えば, 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/printcaprg 項目を指定することでおこないます. あるプリンタにアクセスさせてもよいと思うユーザすべてを 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 はこれを拒否しません. その代わ りに, このファイルは, その先頭から上限値のファイルサイズまでし かキューに入れられません. そして, その部分までが印字され, 残り の部分は捨てられます. これが正しい動作といえるのかどうかは議 論の余地があるところです. それでは, 設定例に登場しているプリンタ rattanbamboo の印字可能なファイルサイズに制限を加えてみましょう. 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/printcapmx を指定する必要があります. リモートホストから印字するための詳しい情報については, 「 リモートホストに接続されたプリンタ」 を参照してください. リモートホストに接続されたプリンタへのジョブの サイズを制限する 特別な方法は他にもあります. これについては, 「 リモートホストからのプリンタの利用を制限する」 を参照してください. リモートホストからのプリンタの利用を制限する 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/printcaprs 項目を指定することで, ローカルプリンタを利用できるリモートホストのユーザを制 限することができます. ローカルホストに接続されたプリン タ用のエントリに 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 は, 紙のページの幅と行数 (pwpl 項目で 指定される) を引数として 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/printcapaf が絶対パスで指定されていた場合に限り, 動作しま す. ユーザ名のアルファベット順ではなく, 課金額の低い順にリ ストを並べます. 課金データファイルにあるホスト名を無視します. このオプショ ンを使用すると, ホスト alpha のユーザ smith とホスト gamma のユーザ smith は同一人物として扱われます. この オプションが指定されない場合は, 両者は別なユーザとして 扱います. /etc/printcappc 項目で指定された値, または, デフォルトの値 (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 への変換の場合, フィルタが dviljdvips の 出力メッセージを解析することで, 何ページ分の変換がおこなわ れたかを知ることができます. 他のファイル形式とその変換 プログラムに関しても, 同様のことができるかもしれません. しかし, この方式には問題点があります. それは, 変換され たページがすべて印字されるとは限らないということです. 例 えば, プリンタが紙詰まりを起こしたり, トナー切れになっ たり, はたまた, 爆発したりするかもしれません. そのよう な状況により印字が途中で中止されたとしても, この方式で は, ユーザは全ページ分の料金を課されてしまうのです. それでは, どのような対策をたてることができるのでしょう か. 正確な 課金をおこなうための唯一の確実な方法は, 何 ページ印字したのかを知らせることができるプリンタを入手 し, これをシリアルポートかネットワークに接続することで す. ほとんどすべての 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の portspackages コレクション で利用可能です. ここに用意されているものは ネットを探し回る必要がありません インターネット上で入手可能な, 移植が容易な 何千ものアプリケーションを追加できます. FreeBSD は最も評判の よい商用の Unix システムとソースコードレベルで互換性があります. このため, ほとんどのアプリケーションは, もしあったとしてもほんの 少しの変更でコンパイルすることができます. デマンドページング 仮想メモリ とそれに “付随の VM/buffer キャッシュ”の設計は, 多くのメモリを要求する アプリケーションに対して効率よくメモリを 与えるようにする一方で, 他のユーザに対しても対話的な応答を維持します. 共有ライブラリ (MS-WindowsのDLLと同等のUnixの 機能) によって, ディスクスペースとメモリを効果的に使用する ことができます. 完全な CC++, 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 の魔術を実現するのに 必要とされるすべてのものを提供する最小の骨組みのことです. <filename>Makefile</filename> スケルトンのもっとも重要な要素は 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 のスクリプトと同じですね.) DISTNAMEtarball の名前から拡張子を取ったものです. 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 によって生成されたファイルを 正しい場所に置くために使用されます. <filename>files</filename> ディレクトリ ports のチェックサム算出には MD5 アルゴリズムを使用しているので, この チェックサム を含んでいる ファイルは md5 と呼ばれます. ちょっと混乱するかもしれませんが, このファイルは files という 名前のディレクトリに置かれています. このディレクトリは, ports に必要だけれども, 他のどこにも属さない 雑多なファイルも含んでいます. <filename>patches</filename> ディレクトリ このディレクトリには, FreeBSD ですべてを正常に動作させるのに 必要な パッチ が含まれています. <filename>pkg</filename> ディレクトリ このディレクトリには, 非常に役立つ三つのファイルが含まれています:- 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.ORGMASTER_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 は画像処理に必要な ライブラリを持っている, などです. または, barfoo をコンパイルするのに必要なツールなのかもしれません. 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.mkbsd.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 の始めに記述があります. また, このファイルは非標準のタブの設定になっています. EmacsVim はファイルのロード時にこれを認識しますが, viexでは, ファイルをロードしたら :set tabstop=4 のようにして正しい値を設定する ことができます. 3分porting この節では, 簡単なportの方法について説明します. 多くの場合これ では不十分ですが, まあうまくいくかどうか試してみて損はないでしょ う. まず, 元のtarファイルをDISTDIRに置きます. デフォルトは/usr/ports/distfilesです. 以下では, ソフトウェアはそのままコンパイルされるとします. つまり, FreeBSDのマシンで動かすために, 変更がまったく必要ない とします. もしなにか変更が必要な場合には次の節も参照する必要 があります. <filename>Makefile</filename> の作成 最小限の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です. <filename>COMMENT</filename> これには, そのportについての説明を1行で書きます. Package の名前, バージョン番号等は 含めないでください. たとえば, こんな具合です: A cat chasing a mouse all over the screen. <filename>DESCR</filename> これは, そのソフトウェアについての, すこし長い説明を記述します. その 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 <filename>PLIST</filename> このファイルには, この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 からインストールされた場合に正しく動作するかを 確認してください. <command>portlint</command> でチェック 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.mkdo- 何とか というターゲットでおこなわれます. たとえば, 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 ターゲットを作 成して, デフォルトを上書きすることもできます. しかし, そこま でする必要があることはめったにないでしょう. <makevar>DISTNAME</makevar> 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に取ってきますが, 展開時に はなにもせずに後で使うためにそのまま置いておかれます. <makevar>PKGNAME</makevar> もし, DISTNAME が我々の package の名前についてのガイドライン に沿ったものでない場合には, PKGNAME にもっと良い名前を設定してください. 詳細は上記のガイドラインを参照してください. <makevar>CATEGORIES</makevar> (分類) 完成した 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 はなにも考えずに 新しいディレクトリを作ってしまいますので, 注意してください. <makevar>MASTER_SITES</makevar> オリジナルの配布ファイルを指し示す 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 サイトではなく, これらの 有名なアーカイブの ミラーの中で好みのものを使用することが可能 です. <makevar>PATCHFILES</makevar> もし, オリジナルの配布ファイル以外にもFTPかHTTPで手に入る パッチが必要な場合には, PATCHFILESにファ イル名を, PATCH_SITESにサイトとディレクト リの名前を MASTER_SITES と同様に設定してく ださい. そのパッチ内のファイル名ががソースツリーの 一番上のディレク トリ (WKRSRC) からの相対パスになっていな い場合には, PATCH_DIST_STRIPを指定してく ださい. 例えば, パッチ内のファイル名にすべて余計な foozolix-1.0/ がついている場合には, PATCH_DIST_STRIP=-p1としてください. これらのパッチは圧縮されていても大丈夫です. ファイル名が .gz.Z で終わる場合には自動的に復元 されるようになっています. もしパッチが, 文書などその他のファイルと一緒に gzip された tarファイルで配布されている場合には,単純に PATCHFILES を使うことはできません. このような場合には, このパッチの tar ファイルの名前と場所を DISTFILESMASTER_SITES に加えます. それから, pre-patch ターゲットで, パッチコマンドを走らせるか, パッチファイルを PATCHDIR ディレクトリに patch-xx という名前でコピーするかして, パッチを適用するようにします. 普通の gzip か compress された tar ファイルであれば, 通常のソースファイルと一緒にその時までに 展開されていますので, 明示的に展開する必要はありません. もし, 後者の方法を使用する場合には, すでにそのディレクトリにある なにかを上書きしないように, 注意する必要があります. さらに, pre-clean ターゲットにコピーしたパッチファイル を削除するコマンドを追加するのを忘れないでください. <makevar>MAINTAINER</makevar> あなたのメールアドレスをここに入れてください. お願いします. :) 保守担当者(maintainer)の責任についての詳細は, Makefile 中の MAINTAINER の節をご覧ください. 依存関係 このプログラムが他のportに依存する場合には, 必要なものが 自動的に作られるようにすることができます. そのために, 以下の 5つの変数が用意されています. よくあるケースのためにあらかじめ設定された依存変数や, いくつかの依存関係の制御のための変数があります. <makevar>LIB_DEPENDS</makevar> 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 が自動的にインストールします. <makevar>RUN_DEPENDS</makevar> 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 と同じ場合には省略可能です. <makevar>BUILD_DEPENDS</makevar> Port のコンパイルに必要なファイルまたはプログラムがある ときは, この変数で指定してください. RUN_DEPENDSと同 様に, これは path: dir :target という組のリストです. 例 えば, BUILD_DEPENDS= unzip:${PORTSDIR}/archivers/unzipunzip という名前のプログラムを探し, 見つから ない場合にはarchivers/unzip サブディレクトリで作 れという意味になります. ここでは “コンパイル” と一口にいいましたが, この変数は実際 にはファイルの展開から実際のコンパイル・リンクまで 全部をま とめて面倒を見てくれます. この依存関係は extract ステージからチェックされます. target の部分は DEPENDS_TARGET と同じ場合には省略可能です. <makevar>FETCH_DEPENDS</makevar> この変数は, portを取ってくるのに必要なファイルまたはプロ グラムを指定するのに使います. 上の二つと同様に, これは path: dir :target という組のリストです. 例えば, FETCH_DEPENDS= ncftp2:${PORTSDIR}/net/ncftp2 としておけば, ncftp2 という名前のプログラムを探 し, 見つからない場合にはnet/ncftp2 サブディレク トリにいってインストールします. この依存関係は fetch ステージからチェックされます. target の部分は DEPENDS_TARGET と同じ場合には省略可能です. <makevar>DEPENDS</makevar> 上記の四つのいずれにもあてはまらないような 依存関係がある場 合, または他の 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_DEPENDSRUN_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の Makefileall 以外のものをメインのター ゲットとしている場合には, ALL_TARGET でそ れを指定してください. installINSTALL_TARGET も同様です. もし, port の元の Makefile が all 以外のターゲットをメインのターゲットとしている場合には, ALL_TARGET をそれに合わせて設定してください. installINSTALL_TARGET についても同様です. <makevar>NO_INSTALL_MANPAGES</makevar> あなたの port がimakeは使うものの install.man ターゲットを持っていない場合, NO_INSTALL_MANPAGES=yes を指定してください. つい でに, 作者を探し出して八つ裂きにするといいでしょ う. (-_-#) 特別な配慮 Portを作成する場合, 考慮しなくてはいけないことがさらにいくつかあります. この節では, それらのうちもっともありがちなものについて説明します. ldconfig 共有ライブラリをインストールするときには, 共有ライブラリのキャッシュを更新するために port の Makefilepost-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 とだけ書いてある行を Makefilepkg/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 において PORTOBJFORMATaoutelf に設定され, 環境変数 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 の設定を気にせずに, ただ単純にリンクを作成してください. <makevar>LIB_DEPENDS</makevar> すべての port の Makefile を編集して, LIB_DEPENDS からマイナー番号を除去する必要があり, 正規表現のサポートも除去する必要があります. (例えば, foo\\.1\\.\\(33|40\\) から foo.2) マッチングは grep -wF を使って行われます. <filename>PLIST</filename> PLIST は, a.out のマイナー番号が0であれば, 短い (ELFの) 共有ライブラリの名前を含み, さもなくば長い (a.outの) 名前を含んでいる必要があります. bsd.port.mk は 自動的に, PORTOBJFORMATaout であれば, .0 を 短い共有ライブラリの名前の行に付け加え, PORTOBJFORMATelf であれば, マイナー番号を 長い共有ライブラリの名前から削除します. ELF システムで 2 つのバージョン番号を持つ共有ライブラリを インストールしたり, aout システムで 1 つのバージョン番号しか持たない共有ライブラリを インストールするのが避けられない場合 (例えば他のオペレーティングシステム用の 互換ライブラリをインストールする port など), NO_FILTER_SHLIBS 変数を定義すれば, 前節で説明されている PLIST 編集の機能が停止されます. <literal>ldconfig</literal> 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 が呼ばれることを保証するためのものです. <makevar>MASTERDIR</makevar> もし, あなたの 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/Makefilexdvi400/Makefile も同様です). MASTERDIRbsd.port.mkPATCHDIRPKGDIR などの通常のサブディレクトリが xdvi300 にあることを教えます. RESOLUTION=118 の行が, xdvi300/MakefileRESOLUTION=300 の行を無効にし, port は解像度を118として作成されます. 共有ライブラリのバージョン まず, 共有ライブラリのバージョンについての指針 を読んで, 共有ライブラリのバージョンを 一般的にどうすれば良いかを理解してください. 盲目的に, ソフトウエアの作者がちゃんと理解していると 信じててはいけません, 多くの場合違います. 細い点まで考慮することは大変重要なことです, なぜなら我々は互換性がないかもしれない大量の ソフトウェアを共存させようとする, 特殊な状況にあるからです. 不注意な port の導入が共有ライブラリに関して, 多大な問題を引き起したことが過去にあります (今まで, jpeg-6b がなぜ 9.0 といバージョン番号を持っているか不思議に 思ったことはありませんか?). もし, 疑問があれば, &a.ports; にメールを送ってください. ほとんどの時間は, 正しいシェアードライブラリのバージョンを決めることと, それを実現するためのパッチを作成することに終始します. しかしながら, が同じソフトウェアの違ったバージョンの ソフトウェアが既にツリーにあるばあいには, 状況は非常に複雑です. つまり, FreeBSD では, ユーザがリンカにどのバージョンの共有ライブラリを 使用するかを指定できないからです (リンカは常にもっとも高いバージョンを選びます). これは, もし, libfoo.so.3.2libfoo.so.4.0 がシステムに存在するときには, リンカに特別なアプリケーションだけ libfoo.so.3.2 をリンクするように指示する方法がないことを意味します. これは, コンパイル時のリンクという意味では完全に見劣りします. この場合の唯一の解決方法は, 共有ファイルの名前の ベース 部分を変えることです. 例えば, libfoo.so.4.0libfoo4.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, または, LN を表わします) によって指定できます. ができます. マニュアルが, 言語特有のサブディレクトリに 置かれる場合には, 言語名を 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 を配布 する人々のために)にリンクできるような しくみが用意されています. <makevar>REQUIRES_MOTIF</makevar> Motif がないとコンパイルできないportのMakefileではこの変 数を指定してください. これによって, Motifを持っていない人が このportをコンパイルしようとするのを未然に防ぎます. <makevar>MOTIFLIB</makevar> この変数は 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/skkMakefilePLIST を見て ください.) 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 にあるからです. (このパッチはここにはありません.) もし, Makefiledir ファイルをインストールす る個所があれば, 削除します. あなたの 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 ファイルをチェックしましょう. <filename>pkg/</filename> サブディレクトリ まだ触れていない, いくつかのこつが pkg/ サブディレクトリにはあり, 時として便利でしょう. <filename>MESSAGE</filename> もし, インストールする人にメッセージを表示する 必要がある場合には, そのメッセージを pkg/MESSAGE に置けます. この機能は, pkg_add の後の追加のインストール手続きを表示するときなどに, 重宝します. pkg/MESSAGE ファイルは pkg/PLIST に加える必要はありません. また, もしユーザが package ではなく port を使用して いる場合には自動的には表示されませんので, 明示的に post-install で表示するようにするべきでしょう. <filename>INSTALL</filename> バイナリパッケージが 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 から明示的に呼ぶ必要があります. <filename>REQ</filename> port が(インストールされるシステムの状態によって) インストールされるべきか, されないべきか区別する必要が あるときには, “要件(requirements)” スクリプト pkg/REQ を作ることができます. これは, インストール及びデインストール (package の削除)の時に自動的に実行され, それらが処理されるべきかを決定します. make の変数にあわせた <filename>PLIST</filename> の変更 いくつかの 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-installpost-install ターゲット のあいだに, PLIST を読み TMPPLIST (デフォルトは, WRKDIR/.PLIST.mktmp ) に書き込むことによって行なわれます. もし, あなたの port が PLIST を実行時に生成するのであれば, do-install のあいだか, その前に行うようにしてください. また, 書きかえられたあとのファイルを編集する必要がある場合には, post-install で, TMPPLIST を書きかえてください. <filename>pkg</filename> サブディレクトリにあるファイル名の変更 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の MakefileMAINTAINER (保守担当者) の アドレスが書いてある場合には, その人にメールを出してみましょう. 保守担当者の人がすでにアップグレードの準備を しているかもしれま せんし, (新しいバージョンの安定度に問題があるなど) あえてアッ プグレードをしない理由があるのかもしれません. 保守担当者にアップグレードをしてくれと頼まれた場合, あるいは そもそも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されているということです. <makevar>INSTALL_*</makevar> マクロ あなた自身の *-install ターゲットでファイルの正しいモードと オーナを保証するために, 必ずbsd.port.mkで提供されて いるマクロを使用してください. マクロは以下のようなものがあります. ${INSTALL_PROGRAM} は実行可能なバイナリを インストールするコマンドです. ${INSTALL_SCRIPT} は実行可能なスクリプトを インストールするコマンドです. ${INSTALL_DATA} は共有可能なデータを インストールするコマンドです. ${INSTALL_MAN} はマニュアルとその他のドキュメ ントをインストールするコマンドです. (圧縮はしません) これらは基本的に install コマンドに適当なフラグを与え たものです. どのようにこれらを使用するかは以下の例を見てください. <makevar>WRKDIR</makevar> WKRDIR の外のファイルにはなにも書き込まないように してください. WRKDIR は ports のビルド中に書き込こめる ことが保証されている唯一の場所です( CDROM から ports をコンパイルを参照). PKGDIR にあるファイルを修正する必要がある ときには, 変数の再定義 によって行ない, 上書きはしないでください. - + <makevar>WRKDIRPREFIX</makevar> 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が誤った場所でそのマクロを使っているからと いって, それをまねする理由はありません. <filename>bsd.port.mk</filename> の後に書くこと .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 に加える必要はありま せん. <makevar>DIST_SUBDIR</makevar> /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 ターゲットで消す方が簡単です. できあがった 差分に満足したら, それらをソースのファイルごとに別々の パッチファイルに分割してください. <makevar>PREFIX</makevar> なるべく port は PREFIX に対する相対パス にインストールすることができるように心がけてください. (この変数の値は USE_X_PREFIXUSE_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 とする, などです. <makevar>CFLAGS</makevar> の尊重 CFLAGS 変数は尊重すべきです. その port がこれを無視するのであれば, NO_PACKAGE=ignores cflagsMakefile に加えてください. コンフィグレーション(設定)ファイル もしあなたの 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を ちゃんと読んでください! ;) それでもわからないことがあったら, 一人で悩まないでどんどん 質問してください! :) <filename>Makefile</filename> のお手本 これは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::Dumperp5-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カーネルのコンフィグレーション」の節をご覧く ださい. パラレルポートをサポートさせる場合も, その節と, あ わせて, この節に続く節もご覧ください. ポート用エントリを <filename>/dev</filename> に追加する カーネルがシリアル, または, パラレルポートを通じての通 信をサポートしていたとしても, システム上で動いているプログ ラムがデータの送受信をおこなうための ソフトウェアインタフェース がさらに必要になります. そのインタフェースは, /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; コマンドでファイルを送 信した後は, ファイル終了を表わすキーを入力する必要 があります. これで何かがプリントされることでしょう. 印字されたテキ ストがおかしくても心配しなくても構いません. それについ ては, 後で修正します. スプーラに許可を与える: <filename>/etc/printcap</filename> ファイル ここまでで, プリンタはコンピュータに接続され, (必要なら) プリンタと通信できるようにカーネルを変更し, 簡単なデータをプ リンタに送信することができているはずです. これで, 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/printcaplp 項目でそのエ ントリを指定します. これについては, 「 プリンタデバイスの特定」 を参照してください. プリンタをシリアルポートに接続した場合は, 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 と名付けられ, 別名として, psPS, S, panasonic, Panasonic KX-P4455 PostScript v51.4 が付けられていま す. ヘッダページの印字を禁止する LPDスプーリングシステムでは, デフォルトでジョブ毎にヘッ ダページを印字します. ヘッダページにはジョブを要求したユー ザ名, ジョブが送られたホスト名, そして, ジョブの名前が素晴 らしい大きな文字で印字されています. 残念なことに, この余分 なテキストすべてが, 簡単なプリンタ設定法のデバッグの際に紛れ 込んできてしまいます. このため, ヘッダページの出力を禁止し ておきます. ヘッダページの出力を禁止するには, /etc/printcap にあるプリンタのエントリに sh の項目を追加します. 次 に, sh を加えた /etc/printcap の例を示します. # # /etc/printcap for host rose - no header pages anywhere # rattan|line|diablo|lp|Diablo 630 Line Printer:\ :sh: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh: この書式を正しく使うための注意をしておきます. 最初の行は左 端のカラムから始まります. それに続く行は TAB ひとつ分だけ 字下げします. 最後の行以外のすべての行は, 行末にバックスラッ シュを記述します. スプーリングディレクトリの作成 スプーラの簡単な設定の次のステップでは, スプーリン グディレクトリを作成します. プリンタに送られるジョブ は, その印字が終了するまでこのディレクトリに置かれます. また, 他のたくさんのスプーラもこのディレクトリにファイ ルを置きます. 様々な事情によりスプーリングディレクトリは, 通常, 慣例 として /var/spool の下に置きます. また, スプーリングディレクトリの内容はバックアップをす る必要はありません. &man.mkdir.1; によってディレクトリを 作るだけでスプーリングディレクトリの復旧は完了します. スプーリングディレクトリの名前は, これも慣例ですが, 次 のようにプリンタの名前と同じにします. &prompt.root; mkdir /var/spool/printer-name しかしながら, ネットワーク上に使用可能なプリンタがたく さんあるならば, LPDで印字するための専用のディレクトリに スプーリングディレクトリを置きたいと思うかもしれません. 例に出てきたプリンタ rattanbamboo につい て, この方式を採用すると, 次のようになります. &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/printcapif 項目を使って指定しま す. これまでの /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 項目の通信速度と fsfc 項目のパリ ティビットの設定を共に調べてみてください. また, プリン タでの設定が /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 のエントリに加 えてみましょう. プリンタ bamboodf 項目を 新たに加えた/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/printcapsd 項目で指定する) に作 ることにします. フィルタが作業するにはここの場所は完璧 な場所で, なぜなら, 特に, スプーリングディレクトリのディ スクの空き容量は (ときどき) /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 項 目, lengthpl 項目に指定された数です. 出力フィルタの簡便さに誘惑されてはいけません. もし, ジョ ブ中のそれぞれのファイルに別のページ番号を付加しようと しても, 出力フィルタはうまく動作しないでしょう. そのような動作を期待しているならば, (入力フィルタとし ても知られている) テキストフィルタを使ってください. 詳 しくは, 「 テキストフィルタのインストール」をご覧ください. さらに, 出力 フィルタは, 実のところ, もっと複雑になっています. まず, 特殊なフラグ文字を検出するために, フィルタに送ら れてくるバイトストリームを検査する必要があります. また, LPD に代わって, 自分自身にシグナルを送らなければなりま せん. しかしながら, ヘッダページの印字をおこないたい場合, また, エスケープシーケンスやヘッダページを印字できるようにす るその他の初期化文字列を送信する必要がある場合, 出力ファ イルが必要です. 1台のプリンタに対し, LPD では出力フィルタとテキスト, または, 他のフィルタを両方使うことができます. このよう な場合, LPD はヘッダページ (「 ヘッダページ」 を参照してください) だけを印字させるために, 出 力フィルタを起動させます. それから LPD では, アウトプッ トフィルタに2バイトの文字 (ASCII 031 の次に ASCII 001) を送ることで, 出力フィルタが自力で停止することを 期待しています. 2バイト (031, 001) が出力フィルタに送られ たとき, 出力フィルタは自分自身にシグナル SIGSTOP を送 ることによって停止するべきです. LPD がその他のフィル タの起動を完了したとき, LPD は出力フィルタにシグナル SIGCONT を送ることで, 出力フィルタを再起動させます. 出力フィルタがあり, テキストフィルタがない場合, LPD はプレインテキストのジョブをおこなう際に, 出力フィル タを使います. 前述したように, 出力フィルタでは, ジョブ 中の各ファイルの並びの間に FROM FEED 文字や紙を排出す る他の文字を入れることはしません. この動作は多分, あな たが求めているものとは 異なっているでしょう. ほと んどすべての場合において, テキストフィルタが必要とされる はずです. プログラム lpf は, テキストフィルタの項で既に紹介 しましたが, 出力フィルタとしても動作させることができま す. もし, 簡便で極悪な出力フィルタが必要で, かつ, バイ トストリームを検査したりシグナルを送るコードを書きたく ないときには, lpf をお試しください. あるいは, プ リントが要求する初期化コードを送るために, lpf を シェルスクリプトに包んで使うこともできます. テキストフィルタ <command>lpf</command> プログラム /usr/libexec/lpr/lpf は, FreeBSD の バイナリ配布に付属しているテキストフィルタ (入力フィル タ) で, 出力を字下げしたり (lpr -i でジョブが入力さ れたとき), 文字を未処理のままプリンタに送ったり (lpr -l でジョブが入力されたとき), ジョブ中のバッ クスペースやタブの印字位置を調節したり, 印字したページ に対して課金したりすることができます. また, このフィル タは出力フィルタとしても動作させることができます. lpf は多くの印字環境において使用することに適して います. このフィルタには, プリンタに初期化文字列を送る 機能はありませんが, 必要とされる初期化をおこない, それから lpf を実行させるためのシェルスクリプトを作成する のはたやすいことです. lpf に対して, 印字ページへの課金を正確におこなわせる ためには, /etc/printcap ファイルの中の pwpl の項目に正確な値を入れておく必要が あります. これらの値は, どのくらいの量のテキストがペー ジにフィットするか, また, ユーザのジョブが何ページある のかを調べるために使われます. プリンタの課金についての 詳しい情報については, 「 プリンタの利用に対する課金」をご覧ください. ヘッダページ あなたが管理するシステムのユーザが たくさんおり, ユー ザ全員が様々なプリンタを使用する場合, 多分, 必要悪である ヘッダページ を印字させることを検討したいと思うかもしれま せん. ヘッダページは, バナー とか バーストページ としても知ら れていますが, 出力されたジョブが誰によるものなのかを特定させる 働きがあります. 印字結果の山の中において, ユーザのジョブによっ て印字された本物のドキュメント部分よりも際立たせるために, ヘッ ダページは, 通常, 多分, 縁が装飾されている大きな太文字で印字さ れます. ヘッダページにより, ユーザは自分が出したジョブがどこに あるのかをすばやく見つけることができます. ヘッダページの欠点は, 明らかに, すべてのジョブに対して, 紙が1枚余分に印字されるという ことです. この紙の有効期間は短く, 2〜3 分も続きません. 最終的に, これらの紙は再利用紙入れの中か くずの山に入れられることでしょう. (ヘッダページはジョブ中の各ファイル毎に印字されるのではなく, ジョブ毎に印字されるということに注意してください. したがって, 紙の 消費はそれほどひどくはないかもしれません). もし, プリンタがプレインテキストを直接印字できるならば, LPD システムは印字物に対して自動的にヘッダページを付けることが できます. PostScript プリンタを使っている場合は, ヘッダペー ジを生成する外部プログラムが必要になります. これについては, 「PostScript プリンタでのヘッダページ」をご覧ください. ヘッダページの印字を許可する プリンタ設定導入編 」 では, /etc/printcap ファイルの sh (``suppress header'' : “ヘッダを供給しない” という意味) を指定して, ヘッダペー ジの印字を止めていました. プリンタでのヘッダページの印字を許可 するには, sh 項目を取り除くだけよい訳です. とても簡単そうに見えるけど, 本当かな? それは本当です. プリンタに初期化文字列を送るための出力フィ ルタを用意しなくてはならないかもしれません. 次に, Hewlett Packard PCL 互換プリンタの例を挙げます. #!/bin/sh # # hpof - Output filter for Hewlett Packard PCL-compatible printers # Installed in /usr/local/libexec/hpof printf "\033&k2G" || exit 2 exec /usr/libexec/lpr/lpf of 項目に出力フィルタのパス名を指定してください. 詳細につ いては, 「出力フィルタ」 をご覧ください. 次に, 以前紹介したプリンタ teak のための /etc/printcap ファイルの例を示します. ここでは, ヘッ ダページの印字を許可し, 上記の出力フィルタを追加しました. # # /etc/printcap for host orchid # teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\ :lp=/dev/lpt0:sd=/var/spool/lpd/teak:mx#0:\ :if=/usr/local/libexec/hpif:\ :vf=/usr/local/libexec/hpvf:\ :of=/usr/local/libexec/hpof: さて, ユーザが teak からジョブを印字させたとき, それぞれ のジョブ毎にヘッダページが印字されます. もし, ユーザが印字物を 探すのに時間を費やしたいと思うなら, lpr -h によってジョ ブを入力することで, ヘッダページの印字を止めることができます. これ以外の &man.lpr.1; のオプションについては, 「 ヘッダページ用オプション」 をご覧ください. LPD では, ヘッダページの最後に, FROM FEED 文字が印 字されます. プリンタに紙排出をさせるために, 別な文字, もしくは, 別な文字列が利用されている場合は, /etc/printcap 中の ff 項目で指定することができます. ヘッダページを制御する ヘッダページの印字が許可されていると, LPD は 長いヘッ ダを作ります. これには, 紙全面に大きな文字でユーザ名, ホスト 名, ジョブ名が書かれています. 次に, このヘッダページの例を示 します (kelly が ジョブ名 outline を rose というホストから印字 された場合). k ll ll k l l k l l k k eeee l l y y k k e e l l y y k k eeeeee l l y y kk k e l l y y k k e e l l y yy k k eeee lll lll yyy y y y y yyyy ll t l i t l oooo u u ttttt l ii n nnn eeee o o u u t l i nn n e e o o u u t l i n n eeeeee o o u u t l i n n e o o u uu t t l i n n e e oooo uuu u tt lll iii n n eeee r rrr oooo ssss eeee rr r o o s s e e r o o ss eeeeee r o o ss e r o o s s e e r oooo ssss eeee Job: outline Date: Sun Sep 17 11:04:58 1995 LPD はこのテキストの終わりに FROM FEED 文字を加えます ので, ジョブは新しいページから開始されます (ただし, /etc/printcap で出力先のプリンタのエントリに sf (suppress form feeds) が指定されているときはこ の限りではありません). お望みならば, LPD に短いヘッダページを出力させる こともできます. この場合は, /etc/printcap ファ イルの中で sb (short banner) を指定してください. ヘッダページは次のようになります. rose:kelly Job: outline Date: Sun Sep 17 11:07:51 1995 デフォルトでは, LPD はヘッダページを最初に印字し, 次 にジョブの印字をおこないます. この順番を逆にするときは, /etc/printcaphl (header last) を指定 してください. ヘッダページに対する課金 LPD に備わっているヘッダページ出力機能を使うと, 入力され たジョブに対して課金をおこなうことができても, ヘッダページは無 料で提供しなくてはならない, という特有のやり方を強要されます. なぜでしょうか. 出力フィルタは単なる外部プログラムなので, 課金をするための制御 をおこなうとすれば, それはヘッダページを印字するときですが, 出力フィ ルタには, ユーザ名とホスト名 の情報や課金情報を格納するファ イルがどれな のかということが知らされません. それゆえ, 出力ファイルには, 誰 にプリンタ利用の課金をおこなえばよいのかが分からないのです. テキス トフィルタやその他の変換フィルタ (これらのフィルタはユーザやホ ストの情報が知らされます) が出力ページの枚数に“1ページ分水増し する”だけでは十分ではありません. なぜなら, ユーザは lpr -h に よってヘッダページの出力を止めることができるからです. やみくも に1ページを水増しすると, 印字されてもいないヘッダページに対する 料金をとることになります. 基本的に, lpr -h は環境に優し い心を持つユーザに好まれるオプションですが, これを使うように奨 励することもできません. 各々のフィルタに独自のヘッダページを生成させる (その結果, ヘッ ダページに課金することができる) という方法でも十分であると はいえません. この場合, LPD はフィルタに の情報を送 りませんので, lpr -h によってヘッダページを印字しないオ プションを選択したとしても, 依然としてヘッダページは印字され, その分の課金がおこなわれてしまいます. では, どのような選択肢があるのでしょうか. ヘッダページへの課金に関しては, 次のことができます. LPD のやり方を受け入れ, ヘッダページは無料とする. LPDng や PLP といった LPD の代替品をインストール する. LPD と入れ替えが可能な他のスプーリングソフトウェ アに関しては, 「 標準スプーラの代替品」をご覧ください. スマートな 出力フィルタを作成する. 通常, 出力 フィルタはプリンタを初期化するか, 単純な文字列変換をす る程度の働きしかしません. (テキスト (入力) フィルタがな い場合) 出力フィルタはヘッダページとプレインテキストの 印字をおこなうのに適しています. プレインテキストを印字するためのテキストフィルタがない 場合, LPD はヘッダページを印字するためだけの目的で出 力フィルタを起動します. そして, LPD が生成するヘッダ ページのテキストを解析することにより, 出力フィルタはヘッ ダページに課金するために必要なユーザ名とホスト名を取得 することができます. この方式の唯一の問題点は, 出力フィ ルタは課金情報を格納するデータファイルの名前を知ることが できないということです (af 項目で指定されたファイ ル名は出力ファイルに渡されません). しかし, 既知の 名前の課金データファイルを使うのならば, その名前を出 力フィルタのプログラム中に埋め込むことができます. 解析の手順を簡単にするためには, /etc/printcapsh 項目 (短いヘッダを指 定) を使うとよいでしょう. そしてまた, ここまでの方法は少なからぬトラブルを生じさ せるかもしれません. そうなれば, もちろんユーザはヘッダペー ジを無料で 提供してくれる気前のよいシステム管理者に感謝することで しょう. PostScript プリンタでのヘッダページ これまでに述べたように, LPD ではプレインテキストのヘッ ダページをたくさんのプリンタに合うように生成することが できます. 残念ながら, PostScript プリンタは, プレインテキストを直接 印字することができません. ですから, LPD のヘッダページ機能は まったく役に立たない, あるいはほとんどの場合で役に立ちません. ヘッダページを出力するための自明な方法の1つに, すべての変換フィ ルタとテキストフィルタにヘッダページを生成させる 方法があります. フィルタは, 適切なヘッダページを生成するために, ユーザ名とホス ト名の引数を使うべきです. この方法の欠点は, いつでも, lpr -h によってジョブが入力された場合でさえも, ヘッダページが印字 されるということです. この方法で試してみましょう. 次のスクリプトは, 3つの引数 (ユーザ のログイン名, ホスト名, ジョブ名) をとり, 簡単な PostScript 用 のヘッダページを生成します. #!/bin/sh # # make-ps-header - make a PostScript header page on stdout # Installed in /usr/local/libexec/make-ps-header # # # These are PostScript units (72 to the inch). Modify for A4 or # whatever size paper you are using: # page_width=612 page_height=792 border=72 # # Check arguments # if [ $# -ne 3 ]; then echo "Usage: `basename $0` <user> <host> <job>" 1>&2 exit 1 fi # # Save these, mostly for readability in the PostScript, below. # user=$1 host=$2 job=$3 date=`date` # # Send the PostScript code to stdout. # exec cat <<EOF %!PS % % Make sure we do not interfere with user's job that will follow % save % % Make a thick, unpleasant border around the edge of the paper. % $border $border moveto $page_width $border 2 mul sub 0 rlineto 0 $page_height $border 2 mul sub rlineto currentscreen 3 -1 roll pop 100 3 1 roll setscreen $border 2 mul $page_width sub 0 rlineto closepath 0.8 setgray 10 setlinewidth stroke 0 setgray % % Display user's login name, nice and large and prominent % /Helvetica-Bold findfont 64 scalefont setfont $page_width ($user) stringwidth pop sub 2 div $page_height 200 sub moveto ($user) show % % Now show the boring particulars % /Helvetica findfont 14 scalefont setfont /y 200 def [ (Job:) (Host:) (Date:) ] { 200 y moveto show /y y 18 sub def } forall /Helvetica-Bold findfont 14 scalefont setfont /y 200 def [ ($job) ($host) ($date) ] { 270 y moveto show /y y 18 sub def } forall % % That is it % restore showpage EOF そして, 変換フィルタやテキストフィルタがそれぞれ, 最初にこのス クリプトを起動することで, ヘッダページが出力され, それから, ユー ザのジョブの印字をおこないます. 次に, このドキュメントの始めのほう で紹介した DVI 変換フィルタを, ヘッダページを印字するように変 更したものを示します. #!/bin/sh # # psdf - DVI to PostScript printer filter # Installed in /usr/local/libexec/psdf # # Invoked by lpd when user runs lpr -d # orig_args="$@" fail() { echo "$@" 1>&2 exit 2 } while getopts "x:y:n:h:" option; do case $option in x|y) ;; # Ignore n) login=$OPTARG ;; h) host=$OPTARG ;; *) echo "LPD started `basename $0` wrong." 1>&2 exit 2 ;; esac done [ "$login" ] || fail "No login name" [ "$host" ] || fail "No host name" ( /usr/local/libexec/make-ps-header $login $host "DVI File" /usr/local/bin/dvips -f ) | eval /usr/local/libexec/lprps $orig_args このフィルタがユーザ名やホスト名を決定するために 引数リストをど のように解析しなくてはならないかという点に注意してください. こ の解析方法は他の変換フィルタに対しても同様です. しかしながら, テキストフィルタについては, 引数の設定が少し異なっています (こ れについては, 「 フィルタはどのように機能しているか」 をご覧ください). 前述の通り, 上記の手法は, 極めて単純なのにも関らず, lpr で“ヘッダページを印字しない”オプション ( オプション) が 使えなくなっています. ユーザが森林資源を (あるいは, ヘッダペー ジが課金されているならば, その僅かな金額を), 節約したいと望んでい る場合でも, すべてのフィルタがすべてのジョブ毎にヘッダページを印字 することになっているので, 節約することはできません. ジョブ毎に印字されるヘッダページを ユーザが抑制できるようにする ためには, 「 ヘッダページに対する課金」で紹介したトリックを 使う必要があります. すな わち, LPD が生成するヘッダページの解析をおこない, PostScript 版のヘッダページを出力させる出力フィルタを作るのです. この場 合, ユーザが lpr -h でジョブを入力すると, LPD はヘッダペー ジを生成しなくなり, また, 出力フィルタも起動されません. そうで ないならば, 作成した出力フィルタが LPD からのテキストを読み込 み, ヘッダページを印字する適当な PostScript のコードがプリ ンタに送られるでしょう. PostScript プリンタがシリアルポートに接続されている場合, 出力フィルタとして lprps を, 上記の動作をおこなうものとして psof を使うことができます. ただし, psof はヘッダペー ジに対して課金をおこないませんので注意してください. リモートプリンタからの出力 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台のプリンタ bamboorattan が接続されています. これらのプリンタをホスト 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 のユーザが rattanbamboo で印字す ることができるようになりました. 例えば, 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/printcaprg 項目を指定することでおこないます. あるプリンタにアクセスさせてもよいと思うユーザすべてを 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 はこれを拒否しません. その代わ りに, このファイルは, その先頭から上限値のファイルサイズまでし かキューに入れられません. そして, その部分までが印字され, 残り の部分は捨てられます. これが正しい動作といえるのかどうかは議 論の余地があるところです. それでは, 設定例に登場しているプリンタ rattanbamboo の印字可能なファイルサイズに制限を加えてみましょう. 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/printcapmx を指定する必要があります. リモートホストから印字するための詳しい情報については, 「 リモートホストに接続されたプリンタ」 を参照してください. リモートホストに接続されたプリンタへのジョブの サイズを制限する 特別な方法は他にもあります. これについては, 「 リモートホストからのプリンタの利用を制限する」 を参照してください. リモートホストからのプリンタの利用を制限する 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/printcaprs 項目を指定することで, ローカルプリンタを利用できるリモートホストのユーザを制 限することができます. ローカルホストに接続されたプリン タ用のエントリに 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 は, 紙のページの幅と行数 (pwpl 項目で 指定される) を引数として 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/printcapaf が絶対パスで指定されていた場合に限り, 動作しま す. ユーザ名のアルファベット順ではなく, 課金額の低い順にリ ストを並べます. 課金データファイルにあるホスト名を無視します. このオプショ ンを使用すると, ホスト alpha のユーザ smith とホスト gamma のユーザ smith は同一人物として扱われます. この オプションが指定されない場合は, 両者は別なユーザとして 扱います. /etc/printcappc 項目で指定された値, または, デフォルトの値 (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 への変換の場合, フィルタが dviljdvips の 出力メッセージを解析することで, 何ページ分の変換がおこなわ れたかを知ることができます. 他のファイル形式とその変換 プログラムに関しても, 同様のことができるかもしれません. しかし, この方式には問題点があります. それは, 変換され たページがすべて印字されるとは限らないということです. 例 えば, プリンタが紙詰まりを起こしたり, トナー切れになっ たり, はたまた, 爆発したりするかもしれません. そのよう な状況により印字が途中で中止されたとしても, この方式で は, ユーザは全ページ分の料金を課されてしまうのです. それでは, どのような対策をたてることができるのでしょう か. 正確な 課金をおこなうための唯一の確実な方法は, 何 ページ印字したのかを知らせることができるプリンタを入手 し, これをシリアルポートかネットワークに接続することで す. ほとんどすべての 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 の魔術を実現するのに 必要とされるすべてのものを提供する最小の骨組みのことです. <filename>Makefile</filename> スケルトンのもっとも重要な要素は 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 のスクリプトと同じですね.) DISTNAMEtarball の名前から拡張子を取ったものです. 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 によって生成されたファイルを 正しい場所に置くために使用されます. <filename>files</filename> ディレクトリ ports のチェックサム算出には MD5 アルゴリズムを使用しているので, この チェックサム を含んでいる ファイルは md5 と呼ばれます. ちょっと混乱するかもしれませんが, このファイルは files という 名前のディレクトリに置かれています. このディレクトリは, ports に必要だけれども, 他のどこにも属さない 雑多なファイルも含んでいます. <filename>patches</filename> ディレクトリ このディレクトリには, FreeBSD ですべてを正常に動作させるのに 必要な パッチ が含まれています. <filename>pkg</filename> ディレクトリ このディレクトリには, 非常に役立つ三つのファイルが含まれています:- 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.ORGMASTER_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 は画像処理に必要な ライブラリを持っている, などです. または, barfoo をコンパイルするのに必要なツールなのかもしれません. 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.mkbsd.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 の始めに記述があります. また, このファイルは非標準のタブの設定になっています. EmacsVim はファイルのロード時にこれを認識しますが, viexでは, ファイルをロードしたら :set tabstop=4 のようにして正しい値を設定する ことができます. 3分porting この節では, 簡単なportの方法について説明します. 多くの場合これ では不十分ですが, まあうまくいくかどうか試してみて損はないでしょ う. まず, 元のtarファイルをDISTDIRに置きます. デフォルトは/usr/ports/distfilesです. 以下では, ソフトウェアはそのままコンパイルされるとします. つまり, FreeBSDのマシンで動かすために, 変更がまったく必要ない とします. もしなにか変更が必要な場合には次の節も参照する必要 があります. <filename>Makefile</filename> の作成 最小限の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です. <filename>COMMENT</filename> これには, そのportについての説明を1行で書きます. Package の名前, バージョン番号等は 含めないでください. たとえば, こんな具合です: A cat chasing a mouse all over the screen. <filename>DESCR</filename> これは, そのソフトウェアについての, すこし長い説明を記述します. その 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 <filename>PLIST</filename> このファイルには, この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 からインストールされた場合に正しく動作するかを 確認してください. <command>portlint</command> でチェック 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.mkdo- 何とか というターゲットでおこなわれます. たとえば, 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 ターゲットを作 成して, デフォルトを上書きすることもできます. しかし, そこま でする必要があることはめったにないでしょう. <makevar>DISTNAME</makevar> 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に取ってきますが, 展開時に はなにもせずに後で使うためにそのまま置いておかれます. <makevar>PKGNAME</makevar> もし, DISTNAME が我々の package の名前についてのガイドライン に沿ったものでない場合には, PKGNAME にもっと良い名前を設定してください. 詳細は上記のガイドラインを参照してください. <makevar>CATEGORIES</makevar> (分類) 完成した 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 はなにも考えずに 新しいディレクトリを作ってしまいますので, 注意してください. <makevar>MASTER_SITES</makevar> オリジナルの配布ファイルを指し示す 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 サイトではなく, これらの 有名なアーカイブの ミラーの中で好みのものを使用することが可能 です. <makevar>PATCHFILES</makevar> もし, オリジナルの配布ファイル以外にもFTPかHTTPで手に入る パッチが必要な場合には, PATCHFILESにファ イル名を, PATCH_SITESにサイトとディレクト リの名前を MASTER_SITES と同様に設定してく ださい. そのパッチ内のファイル名ががソースツリーの 一番上のディレク トリ (WKRSRC) からの相対パスになっていな い場合には, PATCH_DIST_STRIPを指定してく ださい. 例えば, パッチ内のファイル名にすべて余計な foozolix-1.0/ がついている場合には, PATCH_DIST_STRIP=-p1としてください. これらのパッチは圧縮されていても大丈夫です. ファイル名が .gz.Z で終わる場合には自動的に復元 されるようになっています. もしパッチが, 文書などその他のファイルと一緒に gzip された tarファイルで配布されている場合には,単純に PATCHFILES を使うことはできません. このような場合には, このパッチの tar ファイルの名前と場所を DISTFILESMASTER_SITES に加えます. それから, pre-patch ターゲットで, パッチコマンドを走らせるか, パッチファイルを PATCHDIR ディレクトリに patch-xx という名前でコピーするかして, パッチを適用するようにします. 普通の gzip か compress された tar ファイルであれば, 通常のソースファイルと一緒にその時までに 展開されていますので, 明示的に展開する必要はありません. もし, 後者の方法を使用する場合には, すでにそのディレクトリにある なにかを上書きしないように, 注意する必要があります. さらに, pre-clean ターゲットにコピーしたパッチファイル を削除するコマンドを追加するのを忘れないでください. <makevar>MAINTAINER</makevar> あなたのメールアドレスをここに入れてください. お願いします. :) 保守担当者(maintainer)の責任についての詳細は, Makefile 中の MAINTAINER の節をご覧ください. 依存関係 このプログラムが他のportに依存する場合には, 必要なものが 自動的に作られるようにすることができます. そのために, 以下の 5つの変数が用意されています. よくあるケースのためにあらかじめ設定された依存変数や, いくつかの依存関係の制御のための変数があります. <makevar>LIB_DEPENDS</makevar> 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 が自動的にインストールします. <makevar>RUN_DEPENDS</makevar> 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 と同じ場合には省略可能です. <makevar>BUILD_DEPENDS</makevar> Port のコンパイルに必要なファイルまたはプログラムがある ときは, この変数で指定してください. RUN_DEPENDSと同 様に, これは path: dir :target という組のリストです. 例 えば, BUILD_DEPENDS= unzip:${PORTSDIR}/archivers/unzipunzip という名前のプログラムを探し, 見つから ない場合にはarchivers/unzip サブディレクトリで作 れという意味になります. ここでは “コンパイル” と一口にいいましたが, この変数は実際 にはファイルの展開から実際のコンパイル・リンクまで 全部をま とめて面倒を見てくれます. この依存関係は extract ステージからチェックされます. target の部分は DEPENDS_TARGET と同じ場合には省略可能です. <makevar>FETCH_DEPENDS</makevar> この変数は, portを取ってくるのに必要なファイルまたはプロ グラムを指定するのに使います. 上の二つと同様に, これは path: dir :target という組のリストです. 例えば, FETCH_DEPENDS= ncftp2:${PORTSDIR}/net/ncftp2 としておけば, ncftp2 という名前のプログラムを探 し, 見つからない場合にはnet/ncftp2 サブディレク トリにいってインストールします. この依存関係は fetch ステージからチェックされます. target の部分は DEPENDS_TARGET と同じ場合には省略可能です. <makevar>DEPENDS</makevar> 上記の四つのいずれにもあてはまらないような 依存関係がある場 合, または他の 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_DEPENDSRUN_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の Makefileall 以外のものをメインのター ゲットとしている場合には, ALL_TARGET でそ れを指定してください. installINSTALL_TARGET も同様です. もし, port の元の Makefile が all 以外のターゲットをメインのターゲットとしている場合には, ALL_TARGET をそれに合わせて設定してください. installINSTALL_TARGET についても同様です. <makevar>NO_INSTALL_MANPAGES</makevar> あなたの port がimakeは使うものの install.man ターゲットを持っていない場合, NO_INSTALL_MANPAGES=yes を指定してください. つい でに, 作者を探し出して八つ裂きにするといいでしょ う. (-_-#) 特別な配慮 Portを作成する場合, 考慮しなくてはいけないことがさらにいくつかあります. この節では, それらのうちもっともありがちなものについて説明します. ldconfig 共有ライブラリをインストールするときには, 共有ライブラリのキャッシュを更新するために port の Makefilepost-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 とだけ書いてある行を Makefilepkg/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 において PORTOBJFORMATaoutelf に設定され, 環境変数 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 の設定を気にせずに, ただ単純にリンクを作成してください. <makevar>LIB_DEPENDS</makevar> すべての port の Makefile を編集して, LIB_DEPENDS からマイナー番号を除去する必要があり, 正規表現のサポートも除去する必要があります. (例えば, foo\\.1\\.\\(33|40\\) から foo.2) マッチングは grep -wF を使って行われます. <filename>PLIST</filename> PLIST は, a.out のマイナー番号が0であれば, 短い (ELFの) 共有ライブラリの名前を含み, さもなくば長い (a.outの) 名前を含んでいる必要があります. bsd.port.mk は 自動的に, PORTOBJFORMATaout であれば, .0 を 短い共有ライブラリの名前の行に付け加え, PORTOBJFORMATelf であれば, マイナー番号を 長い共有ライブラリの名前から削除します. ELF システムで 2 つのバージョン番号を持つ共有ライブラリを インストールしたり, aout システムで 1 つのバージョン番号しか持たない共有ライブラリを インストールするのが避けられない場合 (例えば他のオペレーティングシステム用の 互換ライブラリをインストールする port など), NO_FILTER_SHLIBS 変数を定義すれば, 前節で説明されている PLIST 編集の機能が停止されます. <literal>ldconfig</literal> 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 が呼ばれることを保証するためのものです. <makevar>MASTERDIR</makevar> もし, あなたの 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/Makefilexdvi400/Makefile も同様です). MASTERDIRbsd.port.mkPATCHDIRPKGDIR などの通常のサブディレクトリが xdvi300 にあることを教えます. RESOLUTION=118 の行が, xdvi300/MakefileRESOLUTION=300 の行を無効にし, port は解像度を118として作成されます. 共有ライブラリのバージョン まず, 共有ライブラリのバージョンについての指針 を読んで, 共有ライブラリのバージョンを 一般的にどうすれば良いかを理解してください. 盲目的に, ソフトウエアの作者がちゃんと理解していると 信じててはいけません, 多くの場合違います. 細い点まで考慮することは大変重要なことです, なぜなら我々は互換性がないかもしれない大量の ソフトウェアを共存させようとする, 特殊な状況にあるからです. 不注意な port の導入が共有ライブラリに関して, 多大な問題を引き起したことが過去にあります (今まで, jpeg-6b がなぜ 9.0 といバージョン番号を持っているか不思議に 思ったことはありませんか?). もし, 疑問があれば, &a.ports; にメールを送ってください. ほとんどの時間は, 正しいシェアードライブラリのバージョンを決めることと, それを実現するためのパッチを作成することに終始します. しかしながら, が同じソフトウェアの違ったバージョンの ソフトウェアが既にツリーにあるばあいには, 状況は非常に複雑です. つまり, FreeBSD では, ユーザがリンカにどのバージョンの共有ライブラリを 使用するかを指定できないからです (リンカは常にもっとも高いバージョンを選びます). これは, もし, libfoo.so.3.2libfoo.so.4.0 がシステムに存在するときには, リンカに特別なアプリケーションだけ libfoo.so.3.2 をリンクするように指示する方法がないことを意味します. これは, コンパイル時のリンクという意味では完全に見劣りします. この場合の唯一の解決方法は, 共有ファイルの名前の ベース 部分を変えることです. 例えば, libfoo.so.4.0libfoo4.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, または, LN を表わします) によって指定できます. ができます. マニュアルが, 言語特有のサブディレクトリに 置かれる場合には, 言語名を 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 を配布 する人々のために)にリンクできるような しくみが用意されています. <makevar>REQUIRES_MOTIF</makevar> Motif がないとコンパイルできないportのMakefileではこの変 数を指定してください. これによって, Motifを持っていない人が このportをコンパイルしようとするのを未然に防ぎます. <makevar>MOTIFLIB</makevar> この変数は 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/skkMakefilePLIST を見て ください.) 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 にあるからです. (このパッチはここにはありません.) もし, Makefiledir ファイルをインストールす る個所があれば, 削除します. あなたの 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 ファイルをチェックしましょう. <filename>pkg/</filename> サブディレクトリ まだ触れていない, いくつかのこつが pkg/ サブディレクトリにはあり, 時として便利でしょう. <filename>MESSAGE</filename> もし, インストールする人にメッセージを表示する 必要がある場合には, そのメッセージを pkg/MESSAGE に置けます. この機能は, pkg_add の後の追加のインストール手続きを表示するときなどに, 重宝します. pkg/MESSAGE ファイルは pkg/PLIST に加える必要はありません. また, もしユーザが package ではなく port を使用して いる場合には自動的には表示されませんので, 明示的に post-install で表示するようにするべきでしょう. <filename>INSTALL</filename> バイナリパッケージが 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 から明示的に呼ぶ必要があります. <filename>REQ</filename> port が(インストールされるシステムの状態によって) インストールされるべきか, されないべきか区別する必要が あるときには, “要件(requirements)” スクリプト pkg/REQ を作ることができます. これは, インストール及びデインストール (package の削除)の時に自動的に実行され, それらが処理されるべきかを決定します. make の変数にあわせた <filename>PLIST</filename> の変更 いくつかの 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-installpost-install ターゲット のあいだに, PLIST を読み TMPPLIST (デフォルトは, WRKDIR/.PLIST.mktmp ) に書き込むことによって行なわれます. もし, あなたの port が PLIST を実行時に生成するのであれば, do-install のあいだか, その前に行うようにしてください. また, 書きかえられたあとのファイルを編集する必要がある場合には, post-install で, TMPPLIST を書きかえてください. <filename>pkg</filename> サブディレクトリにあるファイル名の変更 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の MakefileMAINTAINER (保守担当者) の アドレスが書いてある場合には, その人にメールを出してみましょう. 保守担当者の人がすでにアップグレードの準備を しているかもしれま せんし, (新しいバージョンの安定度に問題があるなど) あえてアッ プグレードをしない理由があるのかもしれません. 保守担当者にアップグレードをしてくれと頼まれた場合, あるいは そもそも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されているということです. <makevar>INSTALL_*</makevar> マクロ あなた自身の *-install ターゲットでファイルの正しいモードと オーナを保証するために, 必ずbsd.port.mkで提供されて いるマクロを使用してください. マクロは以下のようなものがあります. ${INSTALL_PROGRAM} は実行可能なバイナリを インストールするコマンドです. ${INSTALL_SCRIPT} は実行可能なスクリプトを インストールするコマンドです. ${INSTALL_DATA} は共有可能なデータを インストールするコマンドです. ${INSTALL_MAN} はマニュアルとその他のドキュメ ントをインストールするコマンドです. (圧縮はしません) これらは基本的に install コマンドに適当なフラグを与え たものです. どのようにこれらを使用するかは以下の例を見てください. <makevar>WRKDIR</makevar> WKRDIR の外のファイルにはなにも書き込まないように してください. WRKDIR は ports のビルド中に書き込こめる ことが保証されている唯一の場所です( CDROM から ports をコンパイルを参照). PKGDIR にあるファイルを修正する必要がある ときには, 変数の再定義 によって行ない, 上書きはしないでください. - + <makevar>WRKDIRPREFIX</makevar> 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が誤った場所でそのマクロを使っているからと いって, それをまねする理由はありません. <filename>bsd.port.mk</filename> の後に書くこと .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 に加える必要はありま せん. <makevar>DIST_SUBDIR</makevar> /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 ターゲットで消す方が簡単です. できあがった 差分に満足したら, それらをソースのファイルごとに別々の パッチファイルに分割してください. <makevar>PREFIX</makevar> なるべく port は PREFIX に対する相対パス にインストールすることができるように心がけてください. (この変数の値は USE_X_PREFIXUSE_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 とする, などです. <makevar>CFLAGS</makevar> の尊重 CFLAGS 変数は尊重すべきです. その port がこれを無視するのであれば, NO_PACKAGE=ignores cflagsMakefile に加えてください. コンフィグレーション(設定)ファイル もしあなたの 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を ちゃんと読んでください! ;) それでもわからないことがあったら, 一人で悩まないでどんどん 質問してください! :) <filename>Makefile</filename> のお手本 これは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::Dumperp5-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 の魔術を実現するのに 必要とされるすべてのものを提供する最小の骨組みのことです. <filename>Makefile</filename> スケルトンのもっとも重要な要素は 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 のスクリプトと同じですね.) DISTNAMEtarball の名前から拡張子を取ったものです. 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 によって生成されたファイルを 正しい場所に置くために使用されます. <filename>files</filename> ディレクトリ ports のチェックサム算出には MD5 アルゴリズムを使用しているので, この チェックサム を含んでいる ファイルは md5 と呼ばれます. ちょっと混乱するかもしれませんが, このファイルは files という 名前のディレクトリに置かれています. このディレクトリは, ports に必要だけれども, 他のどこにも属さない 雑多なファイルも含んでいます. <filename>patches</filename> ディレクトリ このディレクトリには, FreeBSD ですべてを正常に動作させるのに 必要な パッチ が含まれています. <filename>pkg</filename> ディレクトリ このディレクトリには, 非常に役立つ三つのファイルが含まれています:- 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.ORGMASTER_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 は画像処理に必要な ライブラリを持っている, などです. または, barfoo をコンパイルするのに必要なツールなのかもしれません. 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.mkbsd.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 の始めに記述があります. また, このファイルは非標準のタブの設定になっています. EmacsVim はファイルのロード時にこれを認識しますが, viexでは, ファイルをロードしたら :set tabstop=4 のようにして正しい値を設定する ことができます. 3分porting この節では, 簡単なportの方法について説明します. 多くの場合これ では不十分ですが, まあうまくいくかどうか試してみて損はないでしょ う. まず, 元のtarファイルをDISTDIRに置きます. デフォルトは/usr/ports/distfilesです. 以下では, ソフトウェアはそのままコンパイルされるとします. つまり, FreeBSDのマシンで動かすために, 変更がまったく必要ない とします. もしなにか変更が必要な場合には次の節も参照する必要 があります. <filename>Makefile</filename> の作成 最小限の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です. <filename>COMMENT</filename> これには, そのportについての説明を1行で書きます. Package の名前, バージョン番号等は 含めないでください. たとえば, こんな具合です: A cat chasing a mouse all over the screen. <filename>DESCR</filename> これは, そのソフトウェアについての, すこし長い説明を記述します. その 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 <filename>PLIST</filename> このファイルには, この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 からインストールされた場合に正しく動作するかを 確認してください. <command>portlint</command> でチェック 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.mkdo- 何とか というターゲットでおこなわれます. たとえば, 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 ターゲットを作 成して, デフォルトを上書きすることもできます. しかし, そこま でする必要があることはめったにないでしょう. <makevar>DISTNAME</makevar> 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に取ってきますが, 展開時に はなにもせずに後で使うためにそのまま置いておかれます. <makevar>PKGNAME</makevar> もし, DISTNAME が我々の package の名前についてのガイドライン に沿ったものでない場合には, PKGNAME にもっと良い名前を設定してください. 詳細は上記のガイドラインを参照してください. <makevar>CATEGORIES</makevar> (分類) 完成した 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 はなにも考えずに 新しいディレクトリを作ってしまいますので, 注意してください. <makevar>MASTER_SITES</makevar> オリジナルの配布ファイルを指し示す 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 サイトではなく, これらの 有名なアーカイブの ミラーの中で好みのものを使用することが可能 です. <makevar>PATCHFILES</makevar> もし, オリジナルの配布ファイル以外にもFTPかHTTPで手に入る パッチが必要な場合には, PATCHFILESにファ イル名を, PATCH_SITESにサイトとディレクト リの名前を MASTER_SITES と同様に設定してく ださい. そのパッチ内のファイル名ががソースツリーの 一番上のディレク トリ (WKRSRC) からの相対パスになっていな い場合には, PATCH_DIST_STRIPを指定してく ださい. 例えば, パッチ内のファイル名にすべて余計な foozolix-1.0/ がついている場合には, PATCH_DIST_STRIP=-p1としてください. これらのパッチは圧縮されていても大丈夫です. ファイル名が .gz.Z で終わる場合には自動的に復元 されるようになっています. もしパッチが, 文書などその他のファイルと一緒に gzip された tarファイルで配布されている場合には,単純に PATCHFILES を使うことはできません. このような場合には, このパッチの tar ファイルの名前と場所を DISTFILESMASTER_SITES に加えます. それから, pre-patch ターゲットで, パッチコマンドを走らせるか, パッチファイルを PATCHDIR ディレクトリに patch-xx という名前でコピーするかして, パッチを適用するようにします. 普通の gzip か compress された tar ファイルであれば, 通常のソースファイルと一緒にその時までに 展開されていますので, 明示的に展開する必要はありません. もし, 後者の方法を使用する場合には, すでにそのディレクトリにある なにかを上書きしないように, 注意する必要があります. さらに, pre-clean ターゲットにコピーしたパッチファイル を削除するコマンドを追加するのを忘れないでください. <makevar>MAINTAINER</makevar> あなたのメールアドレスをここに入れてください. お願いします. :) 保守担当者(maintainer)の責任についての詳細は, Makefile 中の MAINTAINER の節をご覧ください. 依存関係 このプログラムが他のportに依存する場合には, 必要なものが 自動的に作られるようにすることができます. そのために, 以下の 5つの変数が用意されています. よくあるケースのためにあらかじめ設定された依存変数や, いくつかの依存関係の制御のための変数があります. <makevar>LIB_DEPENDS</makevar> 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 が自動的にインストールします. <makevar>RUN_DEPENDS</makevar> 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 と同じ場合には省略可能です. <makevar>BUILD_DEPENDS</makevar> Port のコンパイルに必要なファイルまたはプログラムがある ときは, この変数で指定してください. RUN_DEPENDSと同 様に, これは path: dir :target という組のリストです. 例 えば, BUILD_DEPENDS= unzip:${PORTSDIR}/archivers/unzipunzip という名前のプログラムを探し, 見つから ない場合にはarchivers/unzip サブディレクトリで作 れという意味になります. ここでは “コンパイル” と一口にいいましたが, この変数は実際 にはファイルの展開から実際のコンパイル・リンクまで 全部をま とめて面倒を見てくれます. この依存関係は extract ステージからチェックされます. target の部分は DEPENDS_TARGET と同じ場合には省略可能です. <makevar>FETCH_DEPENDS</makevar> この変数は, portを取ってくるのに必要なファイルまたはプロ グラムを指定するのに使います. 上の二つと同様に, これは path: dir :target という組のリストです. 例えば, FETCH_DEPENDS= ncftp2:${PORTSDIR}/net/ncftp2 としておけば, ncftp2 という名前のプログラムを探 し, 見つからない場合にはnet/ncftp2 サブディレク トリにいってインストールします. この依存関係は fetch ステージからチェックされます. target の部分は DEPENDS_TARGET と同じ場合には省略可能です. <makevar>DEPENDS</makevar> 上記の四つのいずれにもあてはまらないような 依存関係がある場 合, または他の 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_DEPENDSRUN_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の Makefileall 以外のものをメインのター ゲットとしている場合には, ALL_TARGET でそ れを指定してください. installINSTALL_TARGET も同様です. もし, port の元の Makefile が all 以外のターゲットをメインのターゲットとしている場合には, ALL_TARGET をそれに合わせて設定してください. installINSTALL_TARGET についても同様です. <makevar>NO_INSTALL_MANPAGES</makevar> あなたの port がimakeは使うものの install.man ターゲットを持っていない場合, NO_INSTALL_MANPAGES=yes を指定してください. つい でに, 作者を探し出して八つ裂きにするといいでしょ う. (-_-#) 特別な配慮 Portを作成する場合, 考慮しなくてはいけないことがさらにいくつかあります. この節では, それらのうちもっともありがちなものについて説明します. ldconfig 共有ライブラリをインストールするときには, 共有ライブラリのキャッシュを更新するために port の Makefilepost-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 とだけ書いてある行を Makefilepkg/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 において PORTOBJFORMATaoutelf に設定され, 環境変数 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 の設定を気にせずに, ただ単純にリンクを作成してください. <makevar>LIB_DEPENDS</makevar> すべての port の Makefile を編集して, LIB_DEPENDS からマイナー番号を除去する必要があり, 正規表現のサポートも除去する必要があります. (例えば, foo\\.1\\.\\(33|40\\) から foo.2) マッチングは grep -wF を使って行われます. <filename>PLIST</filename> PLIST は, a.out のマイナー番号が0であれば, 短い (ELFの) 共有ライブラリの名前を含み, さもなくば長い (a.outの) 名前を含んでいる必要があります. bsd.port.mk は 自動的に, PORTOBJFORMATaout であれば, .0 を 短い共有ライブラリの名前の行に付け加え, PORTOBJFORMATelf であれば, マイナー番号を 長い共有ライブラリの名前から削除します. ELF システムで 2 つのバージョン番号を持つ共有ライブラリを インストールしたり, aout システムで 1 つのバージョン番号しか持たない共有ライブラリを インストールするのが避けられない場合 (例えば他のオペレーティングシステム用の 互換ライブラリをインストールする port など), NO_FILTER_SHLIBS 変数を定義すれば, 前節で説明されている PLIST 編集の機能が停止されます. <literal>ldconfig</literal> 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 が呼ばれることを保証するためのものです. <makevar>MASTERDIR</makevar> もし, あなたの 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/Makefilexdvi400/Makefile も同様です). MASTERDIRbsd.port.mkPATCHDIRPKGDIR などの通常のサブディレクトリが xdvi300 にあることを教えます. RESOLUTION=118 の行が, xdvi300/MakefileRESOLUTION=300 の行を無効にし, port は解像度を118として作成されます. 共有ライブラリのバージョン まず, 共有ライブラリのバージョンについての指針 を読んで, 共有ライブラリのバージョンを 一般的にどうすれば良いかを理解してください. 盲目的に, ソフトウエアの作者がちゃんと理解していると 信じててはいけません, 多くの場合違います. 細い点まで考慮することは大変重要なことです, なぜなら我々は互換性がないかもしれない大量の ソフトウェアを共存させようとする, 特殊な状況にあるからです. 不注意な port の導入が共有ライブラリに関して, 多大な問題を引き起したことが過去にあります (今まで, jpeg-6b がなぜ 9.0 といバージョン番号を持っているか不思議に 思ったことはありませんか?). もし, 疑問があれば, &a.ports; にメールを送ってください. ほとんどの時間は, 正しいシェアードライブラリのバージョンを決めることと, それを実現するためのパッチを作成することに終始します. しかしながら, が同じソフトウェアの違ったバージョンの ソフトウェアが既にツリーにあるばあいには, 状況は非常に複雑です. つまり, FreeBSD では, ユーザがリンカにどのバージョンの共有ライブラリを 使用するかを指定できないからです (リンカは常にもっとも高いバージョンを選びます). これは, もし, libfoo.so.3.2libfoo.so.4.0 がシステムに存在するときには, リンカに特別なアプリケーションだけ libfoo.so.3.2 をリンクするように指示する方法がないことを意味します. これは, コンパイル時のリンクという意味では完全に見劣りします. この場合の唯一の解決方法は, 共有ファイルの名前の ベース 部分を変えることです. 例えば, libfoo.so.4.0libfoo4.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, または, LN を表わします) によって指定できます. ができます. マニュアルが, 言語特有のサブディレクトリに 置かれる場合には, 言語名を 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 を配布 する人々のために)にリンクできるような しくみが用意されています. <makevar>REQUIRES_MOTIF</makevar> Motif がないとコンパイルできないportのMakefileではこの変 数を指定してください. これによって, Motifを持っていない人が このportをコンパイルしようとするのを未然に防ぎます. <makevar>MOTIFLIB</makevar> この変数は 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/skkMakefilePLIST を見て ください.) 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 にあるからです. (このパッチはここにはありません.) もし, Makefiledir ファイルをインストールす る個所があれば, 削除します. あなたの 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 ファイルをチェックしましょう. <filename>pkg/</filename> サブディレクトリ まだ触れていない, いくつかのこつが pkg/ サブディレクトリにはあり, 時として便利でしょう. <filename>MESSAGE</filename> もし, インストールする人にメッセージを表示する 必要がある場合には, そのメッセージを pkg/MESSAGE に置けます. この機能は, pkg_add の後の追加のインストール手続きを表示するときなどに, 重宝します. pkg/MESSAGE ファイルは pkg/PLIST に加える必要はありません. また, もしユーザが package ではなく port を使用して いる場合には自動的には表示されませんので, 明示的に post-install で表示するようにするべきでしょう. <filename>INSTALL</filename> バイナリパッケージが 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 から明示的に呼ぶ必要があります. <filename>REQ</filename> port が(インストールされるシステムの状態によって) インストールされるべきか, されないべきか区別する必要が あるときには, “要件(requirements)” スクリプト pkg/REQ を作ることができます. これは, インストール及びデインストール (package の削除)の時に自動的に実行され, それらが処理されるべきかを決定します. make の変数にあわせた <filename>PLIST</filename> の変更 いくつかの 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-installpost-install ターゲット のあいだに, PLIST を読み TMPPLIST (デフォルトは, WRKDIR/.PLIST.mktmp ) に書き込むことによって行なわれます. もし, あなたの port が PLIST を実行時に生成するのであれば, do-install のあいだか, その前に行うようにしてください. また, 書きかえられたあとのファイルを編集する必要がある場合には, post-install で, TMPPLIST を書きかえてください. <filename>pkg</filename> サブディレクトリにあるファイル名の変更 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の MakefileMAINTAINER (保守担当者) の アドレスが書いてある場合には, その人にメールを出してみましょう. 保守担当者の人がすでにアップグレードの準備を しているかもしれま せんし, (新しいバージョンの安定度に問題があるなど) あえてアッ プグレードをしない理由があるのかもしれません. 保守担当者にアップグレードをしてくれと頼まれた場合, あるいは そもそも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されているということです. <makevar>INSTALL_*</makevar> マクロ あなた自身の *-install ターゲットでファイルの正しいモードと オーナを保証するために, 必ずbsd.port.mkで提供されて いるマクロを使用してください. マクロは以下のようなものがあります. ${INSTALL_PROGRAM} は実行可能なバイナリを インストールするコマンドです. ${INSTALL_SCRIPT} は実行可能なスクリプトを インストールするコマンドです. ${INSTALL_DATA} は共有可能なデータを インストールするコマンドです. ${INSTALL_MAN} はマニュアルとその他のドキュメ ントをインストールするコマンドです. (圧縮はしません) これらは基本的に install コマンドに適当なフラグを与え たものです. どのようにこれらを使用するかは以下の例を見てください. <makevar>WRKDIR</makevar> WKRDIR の外のファイルにはなにも書き込まないように してください. WRKDIR は ports のビルド中に書き込こめる ことが保証されている唯一の場所です( CDROM から ports をコンパイルを参照). PKGDIR にあるファイルを修正する必要がある ときには, 変数の再定義 によって行ない, 上書きはしないでください. - + <makevar>WRKDIRPREFIX</makevar> 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が誤った場所でそのマクロを使っているからと いって, それをまねする理由はありません. <filename>bsd.port.mk</filename> の後に書くこと .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 に加える必要はありま せん. <makevar>DIST_SUBDIR</makevar> /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 ターゲットで消す方が簡単です. できあがった 差分に満足したら, それらをソースのファイルごとに別々の パッチファイルに分割してください. <makevar>PREFIX</makevar> なるべく port は PREFIX に対する相対パス にインストールすることができるように心がけてください. (この変数の値は USE_X_PREFIXUSE_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 とする, などです. <makevar>CFLAGS</makevar> の尊重 CFLAGS 変数は尊重すべきです. その port がこれを無視するのであれば, NO_PACKAGE=ignores cflagsMakefile に加えてください. コンフィグレーション(設定)ファイル もしあなたの 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を ちゃんと読んでください! ;) それでもわからないことがあったら, 一人で悩まないでどんどん 質問してください! :) <filename>Makefile</filename> のお手本 これは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::Dumperp5-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">