この節では, ソフトウェアをportする上でよくある落し穴などにつ いて説明します. このリストを使って, あなた自身が作成した port のチェックはもとより, PR データベースにある, 他の人が作成した port のチェックもできます. あなたがチェックした port について のコメントを バグ報告と一般的な論評 にしたがって, 送ってください. PR データベースにある port を チェックすることによって, 私達がそれらを commit するのを早くし, あなたが何をしているか理解していることも示します.
バイナリはstripしてください. オリジナルのソースがバイナリを
stripしてくれる場合は良いですが, そうでない場合には
post-install
ターゲットを指定して strip するようにする
とよいでしょう. 例えば, こんな風になります:
post-install:
strip ${PREFIX}/bin/xdl
インストールされた実行形式がすでにstripされているかどうか
はfile
コマンドで確認できます. これが`not stripped'
と言わなければ, stripされているということです.
あなた自身の *-install ターゲットでファイルの正しいモードと
オーナを保証するために, 必ずbsd.port.mk
で提供されて
いるマクロを使用してください. マクロは以下のようなものがあります.
${INSTALL_PROGRAM}
は実行可能なバイナリを
インストールするコマンドです.${INSTALL_SCRIPT}
は実行可能なスクリプトを
インストールするコマンドです.${INSTALL_DATA}
は共有可能なデータを
インストールするコマンドです.${INSTALL_MAN}
はマニュアルとその他のドキュメ
ントをインストールするコマンドです.(圧縮はしません)これらは基本的にinstall
コマンドに適当なフラグを与え
たものです. どのようにこれらを使用するかは以下の例を見てください.
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__ マクロをかわりに使用してくださ い.
以下は控え目に使ってください.
__FreeBSD__
はFreeBSDのすべての版で定義されてい
ます. 変更がFreeBSDだけに適用されるとき以外は使用しないでく
ださい. Portでよくある, strerror()
ではなく
sys_errlist[]
を使うなどは, FreeBSDでの変更ではなく,
BSDの流儀です.
__FreeBSD__
が2と定義されていま
す. それ以前の版では1になっています. その後の版では,
そのメジャー番号に合うように上がっていきます.
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
__FreeBSD_version
の値は以下の通りです:
2.0-RELEASE: 199411
2.1-current's: 199501, 199503
2.0.5-RELEASE: 199504
2.2-current (2.1以前): 199508
2.1.0-RELEASE: 199511
2.2-current (2.1.5以前): 199512
2.1.5-RELEASE: 199607
2.2-current (2.1.6以前): 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-STABLE (2.2.1-RELEASE 以後): 220000 (これも同じです)
2.2-STABLE (texinfo-3.9 以後): 221001
2.2-STABLE (top 導入以後): 221002
2.2.2-RELEASE: 222000
2.2-STABLE (2.2.2-RELEASE 以後): 222001
2.2.5-RELEASE: 225000
2.2-STABLE (2.2.5-RELEASE 以後): 225001
2.2-STABLE (ldconfig -R 以後): 225002
2.2.6-RELEASE: 226000
2.2.7-RELEASE: 227000
2.2-STABLE (2.2.7-RELEASE 以後): 227001
2.2-STABLE (semctl(2) 変更後): 227002
2.2.8-RELEASE: 228000
2.2-STABLE (2.2.8-RELEASE 以後): 228001
3.0-current (mount(2) 変更以前): 300000
3.0-current (mount(2) 変更後): 300001
3.0-current (semctl(2) 変更後): 300002
3.0-current (ioctl 引数変更後): 300003
3.0-current (ELF(2) 移行後): 300004
3.0-RELEASE: 300005
3.0-current (3.0-RELEASE 以後): 300005
(2.2-STABLEは, 2.2.5-RELESE 以後, "2.2.[5678]-STABLE" と呼ばれ
ることがあります.)
見ての通り, これは年・月というフォーマットになっていましたが,
バージョン 2.2 から, より直接的にメジャー/マイナー番号を使う
ように変更になりました. 並行していくつかのブランチ(枝分かれし
たバージョン)を開発する場合には, リリースされた日付でそれらの
リリースを分類することが不可能だからです.
(あなたが今 port を作成するときに, 古い -current 達について心配
する必要はありません. これは参考のために挙げられているにすぎま
せん.)
これまで, 何百ものportが作られてきましたが,
__FreeBSD__
が正しく使われたのは, 1つか2つの場合だけで
しょう. 以前のportが誤った場所でそのマクロを使っているからと
いって, それをまねする理由はありません.
bsd.port.mk
の後に書くこと`.include <bsd.port.mk>
' の行の後には
なにも書かないようにしてください. 大抵の場合は Makefile の
中程のどこかで, bsd.port.pre.mk
を include して,
最後に bsd.port.post.mk
を include することによって
避けることができます. (pre.mk
/post.mk
のペアか
bsd.port.mk
だけのどちらかだけを include してください.
2つを混ぜないでください.) 前者は, いくつかの変数の定義だけ
をして, Makefile でのテストに使用し, 後者は残りを定義します.
以下は bsd.port.pre.mk
で定義される重要な変数です.
(これは, すべてではありません. 完全なリストは bsd.port.mk
を参照してください.)
`uname -m
' で返される
アーキテクチャ. (例, `i386').
`uname -s
' で返される
オペレーティングシステム (例, `FreeBSD').
オペレーティングシステムの リリースバージョン (例., `2.1.5', `2.2.7').
数字形式のオペレーティングシステム のバージョン, 上記の __FreeBSD_version と同じです.
システムのオブジェクト フォーマット (`aout' あるいは `elf').
'local' ツリーのベース. (例, `/usr/local/').
`X11' ツリーのベース. (例, `/usr/X11R6/').
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} -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 を使う の節を参照してください.
/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が特別な意味を与えている文字列をパッチ内に入れないように
してください. ファイルを私たちのソースツリーに入れる時にこれら
の文字列はCVSによって書き換えられてしまい, あとでまたパッチ
を使おうとした時にうまくいかないことがあります. RCS文字列は
ドル記号 (`$
') で囲まれており,
`$Id
' や `$RCS
' などで始まり
ます.
diff
の再帰 (`-r
') フラグを使って再帰的なパッ
チを作るのは大変結構なのですが, でき上がったパッチは必ず目で
チェックして余計なゴミが入っていないことを確認してくださ
い. よくあるのはバックアップファイル同士の変更点, あるいは
Imake や GNU configure
を使うソフトウェアの Makefile
の変更点が入っている場合などです. また, configure.in
を編集して, autoconf
を使って configure
を作り直す
ときには, configure
の diff は含めずに(
それらは, 数千行になることもしばしばです), USE_AUTOCONF=yes
を定義して, configure.in
の diff をとってください.
ファイルをまるごと消す場合にはパッチを使わずに
post-extract
ターゲットで消す方が簡単です. できあがった
差分に満足したら, それらをソースのファイルごとに別々の
パッチファイルに分割してください.
なるべくportは${PREFIX}
に対する相対パス
にインストールすることができるように心がけてください.
(この変数の値は ${USE_X_PREFIX}
か
${USE_IMAKE}
が指定してある時には
${X11BASE}
(デフォルト/usr/X11R6
),
そうでない場合には${LOCALBASE}
(デフォルト/usr/local
) にセットされます.)
サイトによってフリーソフトウェアがインストールされる場所が
違いますので, ソース内で `/usr/local
' や
`/usr/X11R6
' を明示的に書かないようにしてくださ
い. Xのプログラムでimakeを使うものについては, これは問題に
はなりません. それ以外の場合には, ソース中のMakefileやスク
リプトで `/usr/local
' (imakeを使わないXのプログラ
ムは `/usr/X11R6
') と書いてあるところを
`${PREFIX}
' に書き換えてください. この値は
portのコンパイル, およびインストール時に自動的に環境変数として
下位makeに渡されます.
USE_X_PREFIX
は本当に必要な時(つまり, X のライブラ
リなどとリンクしたり, ${X11BASE}
以下にある
ファイルを参照したりする必要がある時)以外には設定しないでく
ださい.
変数${PREFIX}
の値はportのMakefileやユー
ザの環境で変更することもできます. しかし, 個々のportが
Makefileでこの変数の値を明示的に設定することはなるべくしない
でください.
また, 他のportからインストールされるプログラムやファイル
を指定するときには, 上で述べた変数を使用してください. 例えば,
less
のフルパスをPAGER
というマクロに入れた
い場合は, コンパイラに
-DPAGER=\"/usr/local/bin/less\"と渡すかわりに
-DPAGER=\"${PREFIX}/bin/less\"(Xを使う portの時は
-DPAGER=\"${LOCALBASE}/bin/less\") を渡し てください. こうしておけば, `/usr/local' がまるごとどこか他 の場所に移してあるサイトでも, あなたのportがそのまま使える 可能性が高くなります.
インストール時には${PREFIX}
の正しいサブディ
レクトリにファイルを置くように心がけてください. ソフトウェア
によっては新しいディレクトリを一つ作ってファイルを全部それに
入れてしまうものがありますが, それはよくありません. また, バ
イナリ, ヘッダファイルとマニュアル以外のすべてを
`lib
'というディレクトリに入れてしまうportもあります
が, これもBSD的なファイルシステム構成からいうと正しくありま
せん. これは以下のように分散すべきです. `etc
' にセッ
トアップ/コンフィグレーションファイル, `libexec
' に
内部で使用されるプログラム (コマンドラインから呼ばれることの
ないコマンド), `sbin
' に管理者用のコマンド,
`info
' に GNU Info 用のドキュメント, そして
`share
' にアーキテクチャに依存しないファイルが入り
ます. 詳細については man 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/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
が異常終了
することもありません.
もしあなたの 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 の予約に関する注意書きをつけてください.
Makefile は単純かつ適切であるべきです. もし, Makefile を
数行短かくできたり, もっと読みやすくできるのであれば, そうし
てください. 例えば, shell の `if
' 構文を使う代りに,
make の `.if
' 構文を使う,
${EXTRACT*}
の再定義で代用できるのであれば,
do-extract
を再定義しない, `CONFIGURE_ARGS +=
--prefix=${PREFIX}
' とするかわりに,
$GNU_CONFIGURE
とする, などです.
${CFLAGS}
変数は尊重すべきです. その port
がこれを無視するのであれば, `NO_PACKAGE=ignores
cflags
' を Makefile に加えてください.
もしあなたの port が設定ファイルを
${PREFIX}/etc
に置く必要がある場合には,
それを単純にインストールしたり, pkg/PLIST
に加え
てはいけません. こうしてしまうと, pkg_delete
が
ユーザが苦労して作ったファイルを消してしまったり, 新しく
インストールすると上書きされてしまったりします.
代りに, 見本となるファイルを suffix (
`<filename>.sample
' が良いでしょう) を付けて
インストールして,
message
を表示して, ソフトウエアを動かす前に, ユーザがそのファイル
をコピーして編集をしなければならないことを知らせましょう.
送付や commit をする前に portlint を使ってチェック しましょう.
Portを作るためにソフトウェアに変更を加えたら, なるべく原 作者にその旨を伝えてパッチ等を送ってください. これらが次のリ リースに取り入れられれば, アップグレードが楽になります.
pkg/DESCR
, pkg/COMMENT
,
pkg/PLIST
などのファイルは, それぞれ2重にチェックし
てください. 再検討してもっと良い記述があれば, それに置きかえ
てください.
GNU General Public License(GNU一般公有使用許諾)のコピーは (すでにあるので)コピーしないでください, おねがいします.
法律に関することには, 十分注意をはらってください. 私達に法律に反するような形でソフトフェアの配布をさせない でください!
私たちに質問を送る前に, 既存のportの例とbsd.port.mk
を
ちゃんと読んでください! ;)
それでもわからないことがあったら, 一人で悩まないでどんどん
質問してください! :)