post-install: ${STRIP_CMD} ${PREFIX}/bin/xdl
第16章 やっていいことといけないこと
This translation may be out of date. To help with the translations please access the FreeBSD translations instance.
目次
16.1. はじめに
このセクションではソフトウェアを port する上で、 良くある落し穴などについて説明します。 このリストを使ってあなた自身が作成した port のチェックはもとより、 さらに障害報告データベース にある他の人が提出した port のチェックもできます。 PR データベースにある、 他の人が作成した port のチェックもできます。 あなたがチェックした port についてのコメントをバグ報告と一般的な論評にしたがって送ってください。 PR データベースにある port をチェックすることは、 わたしたちがそれらを commit するのを早めるとともに、 何をしているかをあなたが理解していることも証明します。
16.2. バイナリの strip
バイナリは特に必要がなければ、手動で strip しないでください。 すべてのバイナリは strip すべきですが、 INSTALL_PROGRAM
マクロがバイナリのインストールと strip を同時に行います (次節をご覧ください)。
ファイルを strip する必要はあるものの INSTALL_PROGRAM
マクロを使いたくない場合は、 ${STRIP_CMD}
でプログラムを strip できます。 これは、多くの場合 post-install
ターゲット内で行われます。たとえば
インストールされた実行形式がすでに strip されているかどうかは file
コマンドで確認できます。 "not stripped" と表示されなければ strip されていることを示しています。 さらに、strip(1) はすでに strip されたプログラムは strip せず、問題なく終了します。
16.3. INSTALL_*
マクロ
あなた自身の *-install
ターゲットでファイルの正しいモードとオーナを保証するために、 必ず bsd.port.mk で提供されているマクロを使用してください。
${INSTALL_PROGRAM}
は実行可能なバイナリをインストール (し、その過程で strip 処理)するコマンドです。${INSTALL_SCRIPT}
は実行可能なスクリプトをインストールするコマンドです。${INSTALL_DATA}
は共有可能なデータをインストールするコマンドです。${INSTALL_MAN}
はマニュアルとその他の文書をインストールするコマンドです (圧縮はしません)。
これらは基本的に install
コマンドに適切なフラグを与えたものです。 それらは distfile の Makefile で、頭に "BSD_" が付けられた (つまり BSD_INSTALL_PROGRM というような) 形で使うことができます。 どのようにこれらを使用するかは以下の例を見てください。
16.4. WRKDIR
WRKDIR
の外に存在するファイルには何も書き込んではいけません。 port のビルド中に書き込み可能なことが保証されているのは WRKDIR
の中だけです (書き込み不可のツリー上での port ビルドの例については、 CDROM からの ports のインストール を参照のこと)。 pkg-* ファイルを変更する必要があるときには、 ファイルを上書きするのではなく 変数の再定義により 行なうようにしてください。
16.5. WRKDIRPREFIX
WRKDIRPREFIX
を尊重していることを確認してください。特に、別の port の WRKDIR
を参照しているときには気を付けてください。 正しい場所は、 WRKDIRPREFIXPORTSDIR/subdir/name/work です。 PORTSDIR/subdir/name/work や .CURDIR/../../subdir/name/work ではありません。
また、 自分で WRKDIR
定義するときには先頭に ${WRKDIRPREFIX}${.CURDIR}
が付いていることを確認してください。
16.6. OS の種類やバージョンの識別
どのバージョンの Unix で動かすかによって、 変更や条件つきコンパイルが必要なコードに出くわすこともあるでしょう。 そのような変更を行なう場合には、 古い FreeBSD システムへのバックポートや、 CSRG の 4.4BSD, BSD/386, 386BSD, NetBSD, OpenBSD 等、 他の BSD システムへの移植が可能なように、 できるだけ汎用的な変更を行なうことを心がけてください。
4.3BSD/Reno (1990) と、それより新しいバージョンの BSD コードを区別するには、 <sys/param.h> で定義されている BSD
マクロを利用するのがよいでしょう。 このファイルがすでにインクルードされていれば良いのですが、 そうでない場合には、その .c ファイルの 適当な場所に以下のコードを追加してください。
#if (defined(__unix__) || defined(unix)) && !defined(USG) #include <sys/param.h> #endif
これらの二つのシンボルが定義されているシステムには必ず sys/param.h があるはずです。 もしそうでないシステムを発見したら、 FreeBSD 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 以降のシステムを区別する必要があれば、 上で述べた
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
これまで、何百もの port が作られてきましたが、 {freebsd} が正しく使われたのは一つか二つの場合だけでしょう。 以前の port が間違ってふさわしくない場所で そのマクロを使っているからといって、 それをまねする理由はありません。
16.7. __FreeBSD_version の値
以下は、sys/param.h で定義されている __FreeBSD_version
の便利な一覧です。
Release | __FreeBSD_version |
---|---|
2.0-RELEASE | 119411 |
2.1-CURRENT | 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.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 |
C++ コンストラクタ/デストラクタ順序変更の後の 3.1-STABLE | 310002 |
3.2-RELEASE | 320000 |
3.2-STABLE | 320001 |
バイナリ互換性のない IPFW とソケットの変更後の 3.2-STABLE | 320002 |
3.3-RELEASE | 330000 |
3.3-STABLE | 330001 |
libc に mkstemp(3) が追加された後の 3.3-STABLE | 330002 |
3.4-RELEASE | 340000 |
3.4-STABLE | 340001 |
3.5-RELEASE | 350000 |
3.5-STABLE | 350001 |
3.4 が分岐した後の 4.0-CURRENT | 400000 |
dynamic linker の変更後の 4.0-CURRENT | 400001 |
C++ コンストラクタ/デストラクタ順序変更の後の 4.0-CURRENT | 400002 |
dladdr(3) 機能追加後の 4.0-CURRENT | 400003 |
__deregister_frame_info dynamic linker のバグ修正、 EGCS 1.1.2 導入後の 4.0-CURRENT | 400004 |
suser(9) の API 変更、newbus 化 以降の 4.0-CURRENT | 400005 |
cdevsw 登録方法の変更後の 4.0-CURRENT | 400006 |
ソケットレベルの証明書 (credential) のために so_cred が追加された後の 4.0-CURRENT | 400007 |
libc_r への poll syscall ラッパー追加後の 4.0-CURRENT | 400008 |
kernel の | 400009 |
jail(2) のセキュリティホール 修正後の 4.0-CURRENT | 400010 |
| 400011 |
システムコンパイラを gcc 2.95.2 にアップグレードした 後の 4.0-CURRENT | 400012 |
動的組み込み可能な Linux モードの ioctl ハンドラが 追加された後の 4.0-CURRENT | 400013 |
OpenSSL 導入後の 4.0-CURRENT | 400014 |
GCC 2.95.2 の C++ ABI 変更で、 デフォルトを -fvtable-thunks から -fno-vtable-thunks に 変更した後の 4.0-CURRENT | 400015 |
OpenSSH 導入後の 4.0-CURRENT | 400016 |
4.0-RELEASE | 400017 |
4.0-RELEASE 以降の 4.0-STABLE | 400018 |
チェックサム計算タイミングの変更後の 4.0-STABLE | 400019 |
libxpg4 が libc にマージされた後の 4.0-STABLE | 400020 |
Binutils を 2.10.0 にアップグレードし、 ELF バイナリのマーク付け (branding) 方法を変更し、 tcsh をベースシステムに導入した後の 4.0-STABLE | 400021 |
4.1-RELEASE | 410000 |
4.1-RELEASE 以降の 4.1-STABLE | 410001 |
setproctitle(3) が libutil から libc に 移動した後の 4.1-STABLE | 410002 |
4.1.1-RELEASE | 411000 |
4.1.1-RELEASE 以降の 4.1.1-STABLE | 411001 |
4.2-RELEASE | 420000 |
libgcc.a と libgcc_r.a の結合および、関連する GCC linkage 変更が行なわれた後の 4.2-STABLE | 420001 |
4.3-RELEASE | 430000 |
wint_t 導入後の 4.3-STABLE | 430001 |
PCI パワーステート API マージ後の 4.3-STABLE | 430002 |
4.4-RELEASE | 440000 |
d_thread_t 導入後の 4.4-STABLE | 440001 |
マウント構造変更 (ファイルシステム kld に影響あり) 後の 4.4-STABLE | 440002 |
smbfs のユーザランド部が取り込まれた後の 4.4-STABLE | 440003 |
4.5-RELEASE | 450000 |
usb の構成要素の名称が変更された後の 4.5-STABLE | 450001 |
rc.conf(5) の | 450004 |
package 作成のデフォルトを XFree86 4 に移行した後の 4.5-STABLE | 450005 |
accept filter が修正され、 簡単なサービス妨害攻撃には影響を受けなくなった後の 4.5-STABLE | 450006 |
4.6-RELEASE | 460000 |
sendfile(2) をドキュメントに適合するよう修正して、 送信されたいかなるヘッダも、 ファイルから送信されたデータの総量に合計しないようにした 4.6-STABLE | 460001 |
4.6.2-RELEASE | 460002 |
4.6-STABLE | 460100 |
| 460101 |
多くの新たな pkg_install の機能を HEAD から MFC した後の 4.6-STABLE | 460102 |
4.7-RELEASE | 470000 |
4.7-STABLE | 470100 |
sF の代わりに std{in,out,err}p 参照生成を開始。 これは、std{in,out,err} をコンパイル時の定数から、 ランタイムに変更します。 | 470101 |
m_aux mbuf を m_tag で置き換える mbuf の変更を MFC した後の 4.7-STABLE | 470102 |
OpenSSL 0.9.7 導入後の 4.7-STABLE | 470103 |
4.8-RELEASE | 480000 |
4.8-STABLE | 480100 |
realpath(3) がスレッドセーフになった後の 4.8-STABLE | 480101 |
4.8-STABLE における twe の 3ware API の変更 | 480102 |
4.9-RELEASE | 490000 |
4.9-STABLE | 490100 |
構造体 kinfo_eproc に e_sid が追加された後の 4.9-STABLE | 490101 |
rtld に libmap 機能を MFC した後の 4.9-STABLE | 490102 |
4.10-RELEASE | 491000 |
5.0-CURRENT | 500000 |
ELF ヘッダフィールドの追加と ELF バイナリのマーク付け (branding) 方法の変更後の 5.0-CURRENT | 500001 |
kld メタデータ変更後の 5.0-CURRENT | 500002 |
buf/bio 変更後の 5.0-CURRENT | 500003 |
binutils アップグレード後の 5.0-CURRENT | 500004 |
libxpg4 コードの libc へのマージと、 TASKQ インターフェイスの導入後の 5.0-CURRENT | 500005 |
AGP インターフェイス追加後の 5.0-CURRENT | 500006 |
Perl を 5.6.0 にアップグレードした後の 5.0-CURRENT | 500007 |
KAME コードを 2000/07 版のソースに更新した後の 5.0-CURRENT | 500008 |
ether_ifattach() および ether_ifdetach() 変更後の 5.0-CURRENT | 500009 |
mtree のデフォルトをオリジナルの変種に戻し、 シンボリックリンクをたどる -L オプションを追加した後の 5.0-CURRENT | 500010 |
kqueue API 変更後の 5.0-CURRENT | 500011 |
setproctitle(3) が libutil から libc へ移動した後の 5.0-CURRENT | 500012 |
最初の SMPng がコミットされた後の 5.0-CURRENT | 500013 |
<sys/select.h> が <sys/selinfo.h> に 移動した後の 5.0-CURRENT | 500014 |
libgcc.a と libgcc_r.a の結合および関連する GCC linkage 変更が行なわれた後の 5.0-CURRENT | 500015 |
libc と libc_r の混合リンクを許し、 -pthread オプションを deprecate する 変更後の 5.0-CURRENT | 500016 |
mountd 等が使用する kernel-exported API の 安定化のため、ucred 構造体から xucred 構造体へ 移行した後の 5.0-CURRENT | 500017 |
CPU 依存の最適化を制御するための make 変数 CPUTYPE が追加された後の 5.0-CURRENT | 500018 |
<machine/ioctl_fd.h> が <sys/fdcio.h> に移動した後の 5.0-CURRENT | 500019 |
ロケール名変更の後の 5.0-CURRENT | 500020 |
Bzip2 導入後の 5.0-CURRENT。 また、S/Key が削除されていることも示す。 | 500021 |
SSE サポート後の 5.0-CURRENT | 500022 |
KSE マイルストーン 2 以降の 5.0-CURRENT | 500023 |
d_thread_t 導入、および UUCP を ports に移動した後の 5.0-CURRENT | 500024 |
64 ビットプラットホーム上のデスクリプタおよび cred 受け渡し ABI 変更後の 5.0-CURRENT | 500025 |
package 作成のデフォルトを XFree86 4 に移行し、libc に新たに strnstr() 関数を追加した後の 5.0-CURRENT | 500026 |
libc に新たに strcasestr() 関数を追加した後の 5.0-CURRENT | 500027 |
smbfs のユーザランド部が取り込まれた後の 5.0-CURRENT | 500028 |
C99 の新しい特定サイズの整数型追加後の 5.0-CURRENT | 500028 (変更なし) |
sendfile(2) の戻り値が変更された後の 5.0-CURRENT | 500029 |
ファイルフラグにふさわしいサイズの | 500030 |
usb の構成要素の名称が変更された後の 5.0-CURRENT | 500031 |
Perl 5.6.1 導入後の 5.0-CURRENT | 500032 |
rc.conf(5) の | 500033 |
mtx_init() に 3 番目の引数が加わった後の 5.0-CURRENT | 500034 |
GCC 3.1 が取り込まれた 5.0-CURRENT | 500035 |
/usr/src に Perl がなくなった 5.0-CURRENT | 500036 |
dlfunc(3) 追加後の 5.0-CURRENT | 500037 |
構造体 sockbuf のメンバの型が一部変更され、順序が変更された後の 5.0-CURRENT | 500038 |
ヘッダで BSD_FOO_T の使用をやめ、 _FOO_T_DECLARED を使うようになった後の 5.0-CURRENT。 また、この変数は bzip2(1) パッケージに対応したことが確実な目安としても使えます。 | 500039 |
ディスクラベルの内部構造の依存性を除く名目で行われた、 ディスク関連の機能へのさまざまな変更を加えた後の 5.0-CURRENT | 500040 |
libc に getopt_long(3) を加えた後の 5.0-CURRENT | 500041 |
Binutils 2.13 にアップグレードした後の 5.0-CURRENT。このアップグレードには、新たな FreeBSD の emulation, vec および出力形式が含まれている。 | 500042 |
libc に pthread_XXX への弱いスタブを追加し、 libXThrStub.so が obsolete になった後の 5.0-CURRENT。 5.0-RELEASE | 500043 |
RELENG_5_0 が分岐した後の 5.0-CURRENT | 500100 |
<sys/dkstat.h> は空なので include すべきではない | 500101 |
d_mmap_t インターフェイス変更後の 5.0-CURRENT | 500102 |
taskqueue_swi が Giant ロック無しで実行され、 Giant ロックされて実行される taskqueue_swi_giant が追加された後の 5.0-CURRENT | 500103 |
cdevsw_add() と cdevsw_remove() はもう存在しません。 MAJOR_AUTO 割り当て機能が登場しました | 500104 |
cdevsw の新たな初期化方法が導入された後の 5.0-CURRENT | 500105 |
devstat_add_entry() が devstat_new_entry() に置き換えられました | 500106 |
Devstat のインターフェイス変更。 sys/sys/param.h 1.149 を参照のこと | 500107 |
トークンリングインターフェイスの変更 | 500108 |
vm_paddr_t の追加 | 500109 |
realpath(3) がスレッドセーフになった後の 5.0-CURRENT | 500110 |
usbhid(3) が NetBSD と同期した後の 5.0-CURRENT | 500111 |
新たな NSS 実装と POSIX.1 準拠の getpw*_r, getgr*_r 関数が導入後の 5.0-CURRENT | 500112 |
古い rc システムを削除した後の 5.0-CURRENT | 500113 |
5.1-RELEASE | 501000 |
RELENG_5_1 が分岐した後の 5.1-CURRENT | 501100 |
sigtimedwait(2) と sigwaitinfo(2) の動作を修正した後の 5.1-CURRENT | 501101 |
bus_dma_tag_create(9) に lockfunc と lockfuncarg フィールドを追加した後の 5.1-CURRENT | 501102 |
GCC 3.3.1-pre 20030711 snapshot 導入後の 5.1-CURRENT | 501103 |
5.1-CURRENT における twe の 3ware API の変更 | 501104 |
/bin と /sbin がダイナミックリンクされ、 ライブラリを /lib に移動した 5.1-CURRENT | 501105 |
Coda 6.x のカーネルサポートを追加した後の 5.1-CURRENT | 501106 |
16550 UART 定数を <dev/sio/sioreg.h> から <dev/ic/ns16550.h> に移動した後の 5.1-CURRENT。 また、rtld が 無条件で libmap 機能をサポートした時点。 | 501107 |
PFIL_HOOKS API を更新した後の 5.1-CURRENT | 501108 |
kiconv(3) を追加した後の 5.1-CURRENT | 501109 |
cdevsw の open および close のデフォルトの操作を変更した後の 5.1-CURRENT | 501110 |
cdevsw のレイアウトを変更した後の 5.1-CURRENT | 501111 |
kobj の多重継承を追加した後の 5.1-CURRENT | 501112 |
構造体 ifnet の if_xname が変更された後の 5.1-CURRENT | 501113 |
/bin と /sbin をダイナミックリンクに変更した後の 5.1-CURRENT | 501114 |
5.2-RELEASE | 502000 |
5.2.1-RELEASE | 502010 |
RELENG_5_2 が分岐した後の 5.2-CURRENT | 502100 |
cxa_atexit/cxa_finalize 関数が libc に追加された後の 5.2-CURRENT | 502101 |
デフォルトの pthread ライブラリを libc_r から libpthread に変更した後の 5.2-CURRENT | 502102 |
デバイスドライバ API の大規模パッチをあてた後の 5.2-CURRENT | 502103 |
getopt_long_only() が追加された後の 5.2-CURRENT | 502104 |
C に対して NULL が ((void *)0) になり、warning をより多く出すようになった 5.2-CURRENT | 502105 |
pf がビルドおよびインストールされるようになった後の 5.2-CURRENT | 502106 |
sparc64 で time_t を 64 ビットの値に変更した後の 5.2-CURRENT | 502107 |
一部のヘッダで Intel C/C++ に対応し、 execve(2) をより厳密に POSIX に適合させた後の 5.2-CURRENT | 502108 |
bus_alloc_resource_any API 導入後の 5.2-CURRENT | 502109 |
UTF-8 ロケール追加後の 5.2-CURRENT | 502110 |
getvfsent(3) API を削除した後の 5.2-CURRENT | 502111 |
make に .warning 命令を追加した後の 5.2-CURRENT | 502112 |
(2.2-STABLE は 2.2.5-RELESE 以後、 "2.2.5-STABLE" と呼ばれることがあります。) 見てのとおりこれは年・月というフォーマットになっていましたが、 バージョン 2.2 からより直接的にメジャー/マイナー番号を使うように変更になりました。 並行していくつかのブランチ (枝分かれしたバージョン) を開発する場合には、 リリースされた日付でそれらのリリースを分類することが不可能だからです (あなたが今 port を作成するときに、古い -CURRENT 達について心配する必要はありません。 これは参考のために挙げられているに過ぎないからです)。 |
16.8. bsd.port.mk の後に書くこと
.include <bsd.port.mk>
の行の後には何も書かないようにしてください。 大抵の場合は Makefile の中程のどこかで bsd.port.pre.mk をインクルードして、 最後に bsd.port.pre.mk をインクルードすることによって避けることができます。
bsd.port.pre.mk/bsd.port.post.mk のペアか bsd.port.mk だけのどちらかだけをインクルードし、二つを混ぜないでください。 |
前者はいくつかの変数の定義だけをして Makefile でのテストに使用し、後者は残りを定義します。
以下は bsd.port.pre.mk で定義される重要な変数です (これは、すべてではありません。 完全なリストは bsd.port.mk を参照してください)。
変数名 | 解説 |
---|---|
|
|
|
|
| オペレーティングシステムのリリースバージョン (例、 |
| 数字形式のオペレーティングシステムのバージョン、 上記の |
| システムのオブジェクトフォーマット ( |
| "local" ツリーのベース。 (例、 |
| "X11" ツリーのベース。 (例、 |
| ports のインストール先 ( |
|
以下は 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
BROKEN=
と TCL_LIB_FILE=
の後にスペースではなくタブを使うことを覚えていましたか? :-)
16.9. 付加的な文書のインストール
普通のマニュアルや info ファイルの他にユーザにとって有用だと思えるような文書がある場合には、 PREFIX/shared/doc の下にインストールしてください。 これは前記と同様 post-install
ターゲットの中から行なうと良いでしょう。
まず、あなたの port のために新しいディレクトリを作ります。 どの port の文書か簡単にわかるような名前にする必要がありますので、 普通は PORTNAME
を使うと良いでしょう。 もちろん、ユーザが異なるバージョンのものを同時に使うことが予想される port の場合には PKGNAME
をそのまま使っても構いません。
ユーザが /etc/make.conf でこの部分を禁止するために NOPORTDOCS
という変数をセットしている場合には、 これらの文書がインストールされないようにしてください。 こんな具合です。
post-install: .if !defined(NOPORTDOCS) ${MKDIR} ${DOCSDIR} ${INSTALL_MAN} ${WRKSRC}/docs/xvdocs.ps ${DOCSDIR} .endif
ここでは、変数をいくつかと、それを Makefile で利用した時にどう展開されるかを説明します。
${DATADIR}
は ${PREFIX}/shared/${PORTNAME} に展開されます。${DOCSDIR}
は ${PREFIX}/shared/doc/${PORTNAME} に展開されます。${EXAMPLESDIR}
は ${PREFIX}/shared/examples/${PORTNAME} に展開されます。
文書ファイルおよびディレクトリはすべて pkg-plist の中に %%PORTDOCS%%
を頭につけて書く必要があります。 たとえば、次のようにしてください。
%%PORTDOCS%%%%DOCSDIR%%/AUTHORS %%PORTDOCS%%%%DOCSDIR%%/CONTACT %%PORTDOCS%%@dirrm %%DOCSDIR%%
インストール時に pkg-message ファイルを利用してメッセージを表示することができます。詳細は pkg-message を使う のセクションを参照してください。
pkg-message ファイルを pkg-plist に加える必要はありません。 |
16.10. ディレクトリ構成
インストール時には PREFIX
の正しいサブディレクトリにファイルを置くように心がけてください。 ソフトウェアによっては新しいディレクトリを一つ作って、 ファイルを全部それに入れてしまうものがありますが、 それは良くありません。 また、バイナリ、ヘッダファイルとマニュアル以外のすべてを lib というディレクトリに入れてしまう port もありますが、これも BSD 的なファイルシステム構成とはうまく合いません。 これは以下のように分散すべきです。 etc にセットアップ/コンフィグレーションファイル、 libexec に内部で使用されるプログラム (コマンドラインから呼ばれることのないコマンド)、 sbin に管理者用のコマンド、 info に GNU Info 用の文書、 そして share にアーキテクチャに依存しないファイルが入ります。 詳細については hier(7) を参照してください。 /usr の構成方針はほとんどそのまま /usr/local にもあてはまります。 USENET "ニュース"を扱う ports は例外です。 これらはファイルのインストール先として PREFIX/news を使用します。
16.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/shared/doc/gimp 2>/dev/null || true
これを使えば、たとえ他の port がファイルをインストールしていて PREFIX/shared/doc/gimp が空でない場合でもエラーメッセージは表示されませんし、 pkg_delete(1) が異常終了することもありません。
16.12. UID
あなたの port が、 インストールされるシステム上に特定のユーザを必要とする場合は pkg-install スクリプトから pw
コマンドを実行して自動的にそのユーザを追加するようにしてください。 net/cvsup-mirror の port が参考になるでしょう。
あなたの port がバイナリの package としてインストールされる場合とコンパイルされる場合の両方で、 同じユーザー/グループ ID を使わなければならないのなら、50 から 999 の間で空いている UID を選んで登録してください。 japanese/Wnn6 の port が参考になるでしょう。
既にシステムや他の port で利用されている UID を使わないように十分注意してください。
現在の 50 から 999 までの間の UID は以下のとおりです。
bind:*:53:53:Bind Sandbox:/:/sbin/nologin 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/shared/gnats/gnats-db:/bin/sh proxy:*:62:62:Packet Filter pseudo-user:/nonexistent:/nonexistent 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:/sbin/nologin wnn:*:69:7:Wnn:/nonexistent:/nonexistent pgsql:*:70:70:PostgreSQL pseudo-user:/usr/local/pgsql:/bin/sh oracle:*:71:71::0:0:Oracle:/usr/local/oracle7:/sbin/nologin ircd:*:72:72:IRC daemon:/nonexistent:/nonexistent ircservices:*:73:73:IRC services:/nonexistent:/nonexistent ifmail:*:75:66:Ifmail user:/nonexistent:/nonexistent www:*:80:80:World Wide Web Owner:/nonexistent:/sbin/nologin alias:*:81:81:QMail user:/var/qmail/alias:/nonexistent qmaild:*:82:81:QMail user:/var/qmail:/nonexistent qmaill:*:83:81:QMail user:/var/qmail:/nonexistent qmailp:*:84:81:QMail user:/var/qmail:/nonexistent qmailq:*:85:82:QMail user:/var/qmail:/nonexistent qmailr:*:86:82:QMail user:/var/qmail:/nonexistent qmails:*:87:82:QMail user:/var/qmail:/nonexistent mysql:*:88:88:MySQL Daemon:/var/db/mysql:/sbin/nologin vpopmail:*:89:89:VPop Mail User:/usr/local/vpopmail:/nonexistent firebird:*:90:90:Firebird Database Administrator:/usr/local/firebird:/bin/sh mailman:*:91:91:Mailman User:/usr/local/mailman:/sbin/nologin gdm:*:92:92:GDM Sandbox:/:/sbin/nologin jabber:*:93:93:Jabber Daemon:/nonexistent:/nonexistent p4admin:*:94:94:Perforce admin:/usr/local/perforce:/sbin/nologin interch:*:95:95:Interchange user:/usr/local/interchange:/sbin/nologin squeuer:*:96:96:SQueuer Owner:/nonexistent:/bin/sh mud:*:97:97:MUD Owner:/usr/local/shared/dgd:/bin/sh msql:*:98:98:mSQL-2 pseudo-user:/var/db/msqldb:/bin/sh rscsi:*:99:99:Remote SCSI:/usr/local/rscsi:/usr/local/sbin/rscsi squid:*:100:100:squid caching-proxy pseudo user:/usr/local/squid:/sbin/nologin quagga:*:101:101:Quagga route daemon pseudo user:/usr/local/etc/quagga:/sbin/nologin ganglia:*:102:102:Ganglia User:/nonexistent:/sbin/nologin sgeadmin:*:103:103:Sun Grid Engine Admin:/nonexistent:/sbin/nologin slimserv:*:104:104:Slim Devices SlimServer pseudo-user:/nonexistent:/sbin/nologin fido:*:111:111:Fido System:/usr/local/fido:/bin/sh postfix:*:125:125:Postfix Mail System:/var/spool/postfix:/sbin/nologin rbldns:*:153:153:rbldnsd pseudo-user:/nonexistent:/sbin/nologin sfs:*:171:171:Self-Certifying File System:/nonexistent:/sbin/nologin agk:*:172:172:AquaGateKeeper:/nonexistent:/nonexistent ldap:*:389:389:OpenLDAP Server:/nonexistent:/sbin/nologin drweb:*:426:426:Dr.Web Mail Scanner:/nonexistent:/sbin/nologin qtss:*:554:554:Darwin Streaming Server:/nonexistent:/sbin/nologin ircdru:*:555:555:Russian hybrid IRC server:/nonexistent:/bin/sh bacula:*:910:910:Bacula Daemon:/var/db/bacula:/sbin/nologin
以下は、現在予約されている GID の一覧です。
bind:*:53: cyrus:*:60: proxy:*:62: authpf:*:63: uucp:*:66: dialer:*:68: network:*:69: pgsql:*:70: www:*:80: qnofiles:*:81: qmail:*:82: mailman:*:91: postfix:*:125: maildrop:*:126: rbldns:*:153: qtss:*:554: ircdru:*:555:
このリストを最新の状態に保つためにも、 この範囲の UID や GID を予約するような port を作ったり、 既存の port にそのような改変を行なってわたしたちに送るときには UID の予約に関する注意書きをつけてください。
16.13. 合理的な port
Makefile は単純かつ適切であるべきです。もし、 Makefile を数行短かくできたり、 もっと読みやすくできるのであればそうしてください。 たとえば、 シェルの if
構文を使うかわりに make の .if
構文を使う、 EXTRACT*
の再定義で代用できるのであれば do-extract
を再定義しない、 CONFIGURE_ARGS += --prefix=${PREFIX}
とするかわりに GNU_CONFIGURE
とする、などです。
何かをするのに自分で新しくコードをたくさん書かなければならなくなった場合は、 戻って bsd.port.mk であなたがやろうとしていることが既に実装されていないか見直してください。 読むのは大変ですが、難しく見える問題で bsd.port.mk が簡単な解決法を提供しているものが数多くあります。
16.14. CC
および CXX
の尊重
Port は CC
および CXX
変数を尊重すべきです。ここで言いたいのは、port は、既存の値を上書きしてこれらの変数をまるごと設定しなおすべきではなく、 その代わり必要な値を既存の値に追加してゆくべきだということです。 そうすれば、すべての ports に影響するビルドオプションをグローバルに設定できます。
Port がこれらの変数を尊重しない場合は、 Makefile に NO_PACKAGE=ignores either cc or cxx
を追加してください。
CC
と CXX
変数を尊重している Makefile の例を次に示します。?=
に注意してください。
CC ?= gcc
CXX ?= g++
こちらは、CC
変数も CXX
変数も尊重していない例です。
CC = gcc
CXX = g++
FreeBSD システム上では、CC
および CFLAGS
変数は、どちらも /etc/make.conf で定義できます。最初の例では、システム全体の定義を保存している /etc/make.conf で値がすでに設定されてない場合に限って、値を設定します。 2 番目の例では、すでに設定されていた内容を上書きしてしまいます。
16.15. CFLAGS
の尊重
CFLAGS
変数は尊重すべきです。 ここでいいたいのは、port は、 既存の値を上書きしてこの変数をまるごと設定しなおすべきではなく、 その代わり必要な値を既存の値に追加してゆくべきだということです。 そうすれば、すべてての ports に影響するビルドオプションをグローバルに設定できます。
port がこれを尊重しない場合は、 NO_PACKAGE=ignores cflags
を Makefile に加えてください。
CFLAGS
変数をきちんと考慮した Makefile の例を以下に示します。 +=
の部分に注目してください。
CFLAGS += -Wall -Werror
次は CFLAGS
変数を考慮しない Makefile の例です。
CFLAGS = -Wall -Werror
CFLAGS
変数は、FreeBSD システムの /etc/make.conf で定義されています。 最初の例では既存の定義を保存しつつ CFLAGS
変数にオプションフラグを追加しているのに対し、 二番目の例では既存の定義をすべて無効にしてしまっています。
16.16. コンフィグレーション (設定) ファイル
もしあなたの port が設定ファイルを PREFIX/etc に置く必要がある場合には、それを単純にインストールしたり、 pkg-plist に加えてはいけません。 こうしてしまうと pkg_delete(1) によってユーザが苦労して作ったファイルが消えてしまったり、 新しくインストールする時に上書きされてしまったりします。
かわりに見本となるファイルをサフィックス (filename.sample が良いでしょう) を付けてインストールしてメッセージを表示し、 ソフトウェアを動かす前にユーザがそのファイルをコピーして編集をしなければならないことを知らせましょう。
16.17. フィードバック
port を作るためにソフトウェアに変更を加えたら、 なるべく原作者にその旨を伝えてパッチ等を送ってください。 これらが次のリリースに取り入れられればアップグレードが楽になります。
16.18. README.html
README.html というファイルを含めてはいけません。 このファイルは、cvs コレクションの一部ではなく、 make readme
コマンドで生成されるファイルです。
16.19. Port に BROKEN
, FORBIDDEN
などの印をつける
ある port にセキュリティ脆弱性があることが判明したり、 根本的に壊れてしまい修正に何時間もの注意深い作業が必要になったり、 基本的には廃れてしまったものの、 何らかの理由で ports ツリーには残される (もちろんあとで修正しますよね?) という日が来るのは避けられません。 ある port が壊れていることを示すために、port の Makefile では 3 つの make
変数が使えます。以下の make
変数の値は、 その port が壊れている理由を説明するためにユーザに示されます。 それぞれの make 変数は、ユーザと Makefile を処理する自動化システムに対して根本的に異なる意味を伝えますので、 正しい make
変数をお使いください。
BROKEN
は、動作しないためインストールすべきでない port 用のものです。これは、ユーザがその port をインストールしないようにしますが、BROKEN
とされた port は Bento クラスタで引き続きビルドされます。 ユーザには port をインストールしてほしくないけれども Bento ではビルドしてほしい場合は、port をBROKEN
にしてください。FORBIDDEN
は、セキュリティ脆弱性があったり、その port をインストールすると FreeBSD システムの安全性に重大な懸念を生じる (たとえば、セキュアでないという評判があるプログラムや、 容易に悪用できるサービスを提供するプログラムなど) port 用のものです。 あるソフトウェアの一部に脆弱性があることが判明し、 修正がリリースされていない場合はFORBIDDEN
にすべきです。 理想的には、セキュリティ脆弱性が発見された時は、 脆弱性を抱えた FreeBSD ホストの数を減らすために、 ただちに ports を更新すべきです (我々は、セキュアであるという評判を得たいのです)。 しかし、脆弱性が公表されてから、 脆弱性を抱えたソフトウェアの新しい版がリリースされるまでに無視できない時間があくことがままあります。 セキュリティ以外の理由で port をFORBIDDEN
にしないでください。IGNORE
は、どんな理由であれビルドすべきではない port 用です。 ユーザも Bento クラスタ も、どんな状況であれIGNORE
とされた port はビルドしません。 嘘だと思うなら、port のビルドを妨げるのにIGNORE
を使ってみてください。
この変数を使うのは、port が更新できない場合の最後の手段にしてください。 ずっと壊れたままの port は、ports ツリーから完全に削除すべきです。
16.20. 必要な回避策
古いバージョンの FreeBSD のソフトウェアにあるバグを回避する必要があることがあります。
make(1) は、少なくとも 4.8 と 5.0 を含むいくつかのバージョンで、
OSVERSION
に基づく比較に関してバグがあります。 これは、make describe
の最中にエラーを起こすことになりやすく (したがってmake index
全体も失敗することに) なります。回避策は、条件比較を括弧にいれることで、たとえばif ( ${OSVERSION} > 500023 )
となります。4.9 と 5.2 で port のインストールテストを行っても、 この問題は見つかりません。
最終更新日: 2024年3月9日 by Danilo G. Baio