FreeBSD ハンドブック : アプリケーションのインストール : ports コレクション : 自分で port を作る : やってよいことといけないこと
Previous: アップグレード
Next: Makefileのお手本

4.7.8. やってよいことといけないこと

この節では, ソフトウェアをportする上でよくある落し穴などにつ いて説明します. このリストを使って, あなた自身が作成した port のチェックはもとより, PR データベースにある, 他の人が作成した port のチェックもできます. あなたがチェックした port について のコメントを バグ報告と一般的な論評 にしたがって, 送ってください. PR データベースにある port を チェックすることによって, 私達がそれらを commit するのを早くし, あなたが何をしているか理解していることも示します.

4.7.8.1. バイナリのstrip

バイナリはstripしてください. オリジナルのソースがバイナリを stripしてくれる場合は良いですが, そうでない場合には post-installターゲットを指定して strip するようにする とよいでしょう. 例えば, こんな風になります:

 post-install:
	 strip ${PREFIX}/bin/xdl

インストールされた実行形式がすでにstripされているかどうか はfileコマンドで確認できます. これが`not stripped' と言わなければ, stripされているということです.

4.7.8.2. INSTALL_* マクロ

あなた自身の *-install ターゲットでファイルの正しいモードと オーナを保証するために, 必ずbsd.port.mkで提供されて いるマクロを使用してください. マクロは以下のようなものがあります.

これらは基本的にinstallコマンドに適当なフラグを与え たものです. どのようにこれらを使用するかは以下の例を見てください.

4.7.8.3. 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

これらのシンボルが定義されているすべてのシステムには sys/param.h があるはずです. もし, そうでないシステムを発見した ら我々にも教えてください. FreeBSD 移植ソフトウエアメーリングリスト <freebsd-ports@FreeBSD.ORG> までメールを送ってください.

あるいは, 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__ マクロをかわりに使用してくださ い.

以下は控え目に使ってください.

これまで, 何百ものportが作られてきましたが, __FreeBSD__が正しく使われたのは, 1つか2つの場合だけで しょう. 以前のportが誤った場所でそのマクロを使っているからと いって, それをまねする理由はありません.

4.7.8.4. bsd.port.mk の後に書くこと

`.include <bsd.port.mk>' の行の後には なにも書かないようにしてください. 大抵の場合は Makefile の 中程のどこかで, bsd.port.pre.mk を include して, 最後に bsd.port.post.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

4.7.8.5. 付加的ドキュメント

普通のマニュアルやinfoファイルのほかにユーザにとって有用だ と思えるようなドキュメントがある場合には, ${PREFIX}/share/docの下にインストールしてく ださい. これは前記と同様, post-installターゲットの 中からするのがいいでしょう.

まず, あなたのportのために新しいディレクトリを作りま す. どのportのドキュメントか簡単にわかるような名前にする必 要がありますので, 普通は${PKGNAME}からバージョ ン番号を除いた部分を使うといいでしょう. もちろん, ユーザが異 なるバージョンのものを同時に使うことが予想されるportの場合 には, ${PKGNAME}をそのまま使ってかまいません.

ユーザが/etc/make.confでこの部分を禁止するために NOPORTDOCSという変数をセットしている場合には, これらのドキュメントがインストールされないようにしてください. こんな具合です.

 post-install:
 .if !defined(NOPORTDOCS)
	 ${MKDIR} -p ${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 を使う の節を参照してください.

4.7.8.6. DIST_SUBDIR

/usr/ports/distfilesディレクトリ内をあまり散らかさ ないようにしてください. たくさんのファイルを取ってくるport や, 数は少なくてもほかのportのファイルと混同されるおそれが あるファイル (`Makefile' など) がある場合には, ${DIST_SUBDIR}にportの名前 (${PKGNAME}からバージョン番号を取った部分を 使うといいでしょう) を入れてください. すると, ${DISTDIR}がデフォルトの /usr/ports/distfilesから /usr/ports/distfiles/${DIST_SUBDIR}に変更さ れ, 取ってきたファイルはすべてそのサブディレクトリの中に置か れるようになります.

また, ファイルを取ってくるときにバックアップサイトとして使わ れるftp.freebsd.orgのディレクトリ名にもこの変数の 値が使われます. (${DISTDIR}を明示的に指定し た場合には, ローカルのファイルを置くところは変わりますが, こ のサイトのディレクトリ名は変わりませんので, 必ず ${DIST_SUBDIR}を使うようにしてください.)

この変数はMakefile中で明示的に指定された ${MASTER_SITES}には影響しないことに注意して ください.

4.7.8.7. RCS文字列

RCSが特別な意味を与えている文字列をパッチ内に入れないように してください. ファイルを私たちのソースツリーに入れる時にこれら の文字列はCVSによって書き換えられてしまい, あとでまたパッチ を使おうとした時にうまくいかないことがあります. RCS文字列は ドル記号 (`$') で囲まれており, `$Id' や `$RCS' などで始まり ます.

4.7.8.8. パッチ作成上の注意

diffの再帰 (`-r') フラグを使って再帰的なパッ チを作るのは大変結構なのですが, でき上がったパッチは必ず目で チェックして余計なゴミが入っていないことを確認してくださ い. よくあるのはバックアップファイル同士の変更点, あるいは Imake や GNU configure を使うソフトウェアの Makefile の変更点が入っている場合などです. また, configure.in を編集して, autoconf を使って configure を作り直す ときには, configure の diff は含めずに( それらは, 数千行になることもしばしばです), USE_AUTOCONF=yes を定義して, configure.in の diff をとってください.

ファイルをまるごと消す場合にはパッチを使わずに post-extractターゲットで消す方が簡単です. できあがった 差分に満足したら, それらをソースのファイルごとに別々の パッチファイルに分割してください.

4.7.8.9. PREFIX

なるべくportは${PREFIX}に対する相対パス にインストールすることができるように心がけてください. (この変数の値は ${USE_X_PREFIX}${USE_IMAKE} が指定してある時には ${X11BASE} (デフォルト/usr/X11R6), そうでない場合には${LOCALBASE} (デフォルト/usr/local) にセットされます.)

サイトによってフリーソフトウェアがインストールされる場所が 違いますので, ソース内で `/usr/local' や `/usr/X11R6' を明示的に書かないようにしてくださ い. Xのプログラムでimakeを使うものについては, これは問題に はなりません. それ以外の場合には, ソース中のMakefileやスク リプトで `/usr/local' (imakeを使わないXのプログラ ムは `/usr/X11R6') と書いてあるところを `${PREFIX}' に書き換えてください. この値は portのコンパイル, およびインストール時に自動的に環境変数として 下位makeに渡されます.

USE_X_PREFIXは本当に必要な時(つまり, X のライブラ リなどとリンクしたり, ${X11BASE} 以下にある ファイルを参照したりする必要がある時)以外には設定しないでく ださい.

変数${PREFIX}の値はportのMakefileやユー ザの環境で変更することもできます. しかし, 個々のportが Makefileでこの変数の値を明示的に設定することはなるべくしない でください.

また, 他のportからインストールされるプログラムやファイル を指定するときには, 上で述べた変数を使用してください. 例えば, lessのフルパスをPAGERというマクロに入れた い場合は, コンパイラに

-DPAGER=\"/usr/local/bin/less\"
と渡すかわりに
-DPAGER=\"${PREFIX}/bin/less\"
(Xを使う portの時は
-DPAGER=\"${LOCALBASE}/bin/less\"
) を渡し てください. こうしておけば, `/usr/local' がまるごとどこか他 の場所に移してあるサイトでも, あなたのportがそのまま使える 可能性が高くなります.

4.7.8.10. ディレクトリ構成

インストール時には${PREFIX}の正しいサブディ レクトリにファイルを置くように心がけてください. ソフトウェア によっては新しいディレクトリを一つ作ってファイルを全部それに 入れてしまうものがありますが, それはよくありません. また, バ イナリ, ヘッダファイルとマニュアル以外のすべてを `lib'というディレクトリに入れてしまうportもあります が, これもBSD的なファイルシステム構成からいうと正しくありま せん. これは以下のように分散すべきです. `etc' にセッ トアップ/コンフィグレーションファイル, `libexec' に 内部で使用されるプログラム (コマンドラインから呼ばれることの ないコマンド), `sbin' に管理者用のコマンド, `info' に GNU Info 用のドキュメント, そして `share' にアーキテクチャに依存しないファイルが入り ます. 詳細については man hier(7) を見てくださ い. /usrの構成方針はほとんどそのまま /usr/localにもあてはまります. USENET ニュースを 扱う ports は例外です. これらは, ファイルのインストール先として ${PREFIX}/news を使用します.

4.7.8.11. 空のディレクトリの除去

ports は デインストール(削除) の際には, 自分自身を消去した あとに, (ディレクトリの)除去をするようにしてください. これは, 大抵の場合 @dirrm の行を ports が作成するすべての ディレクトリについて加えることによって実現できます. 親ディレクトリは, 子ディレクトリを先に消さないと消せないことに 気をつけて下さい.

 :
lib/X11/oneko/pixmaps/cat.xpm
lib/X11/oneko/sounds/cat.au
 :
@dirrm lib/X11/oneko/pixmaps
@dirrm lib/X11/oneko/sounds
@dirrm lib/X11/oneko
といった感じです.

しかし, ときとして, 他の port をディレクトリを共有している ために @dirrm がエラーを返すことがあります. rmdir@unexec から呼びだすことによって, 警告(warning)なしで 空のディレクトリのみを削除することができます:

 :
@unexec rmdir %D/share/doc/gimp 2>/dev/null || true
これを使えば, たとえ, 他の port がファイルをインストールして いて, ${PREFIX}/share/doc/gimp が空でない場合でも エラーメッセージは表示されませんし, pkg_delete が異常終了 することもありません.

4.7.8.12. 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 の予約に関する注意書きをつけてください.

4.7.8.13. 合理的な port

Makefile は単純かつ適切であるべきです. もし, Makefile を 数行短かくできたり, もっと読みやすくできるのであれば, そうし てください. 例えば, shell の `if' 構文を使う代りに, make の `.if' 構文を使う, ${EXTRACT*}の再定義で代用できるのであれば, do-extractを再定義しない, `CONFIGURE_ARGS += --prefix=${PREFIX}' とするかわりに, $GNU_CONFIGURE とする, などです.

4.7.8.14. CFLAGS の尊重

${CFLAGS} 変数は尊重すべきです. その port がこれを無視するのであれば, `NO_PACKAGE=ignores cflags' を Makefile に加えてください.

4.7.8.15. コンフィグレーション(設定)ファイル

もしあなたの port が設定ファイルを ${PREFIX}/etc に置く必要がある場合には, それを単純にインストールしたり, pkg/PLIST に加え てはいけません. こうしてしまうと, pkg_delete が ユーザが苦労して作ったファイルを消してしまったり, 新しく インストールすると上書きされてしまったりします.

代りに, 見本となるファイルを suffix ( `<filename>.sample' が良いでしょう) を付けて インストールして, message を表示して, ソフトウエアを動かす前に, ユーザがそのファイル をコピーして編集をしなければならないことを知らせましょう.

4.7.8.16. Portlint

送付や commit をする前に portlint を使ってチェック しましょう.

4.7.8.17. フィードバック

Portを作るためにソフトウェアに変更を加えたら, なるべく原 作者にその旨を伝えてパッチ等を送ってください. これらが次のリ リースに取り入れられれば, アップグレードが楽になります.

4.7.8.18. その他諸々

pkg/DESCR, pkg/COMMENT, pkg/PLIST などのファイルは, それぞれ2重にチェックし てください. 再検討してもっと良い記述があれば, それに置きかえ てください.

GNU General Public License(GNU一般公有使用許諾)のコピーは (すでにあるので)コピーしないでください, おねがいします.

法律に関することには, 十分注意をはらってください. 私達に法律に反するような形でソフトフェアの配布をさせない でください!

4.7.8.19. 困ったら....

私たちに質問を送る前に, 既存のportの例とbsd.port.mkを ちゃんと読んでください! ;)

それでもわからないことがあったら, 一人で悩まないでどんどん 質問してください! :)


FreeBSD ハンドブック : アプリケーションのインストール : ports コレクション : 自分で port を作る : やってよいことといけないこと
Previous: アップグレード
Next: Makefileのお手本