どのバージョンの Unix で動かすかによって, 変更や 条件つきコンパイルが必要なコードに出くわすこともあるでしょう. そのような変更を行なう場合には, FreeBSD 1.x システムへのバックポートや, 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, あるいは 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 | 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.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 の dev_t 型から struct spacinfo ポインタへの 変更後の 4.0-CURRENT | 400009 |
jail(2) のセキュリティホール 修正後の 4.0-CURRENT | 400010 |
sigset_t の データ型変更後の 4.0-CURRENT | 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 |
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 |
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 | 500021 |
SSE サポート後の 5.0-CURRENT | 500022 |
Note: (2.2-STABLE は 2.2.5-RELESE 以後, ``2.2.5-STABLE'' と呼ばれることがあります.) 見てのとおりこれは年・月というフォーマットになっていましたが, バージョン 2.2 からより直接的にメジャー/マイナー番号を使うように変更になりました. 並行していくつかのブランチ (枝分かれしたバージョン) を開発する場合には, リリースされた日付でそれらのリリースを分類することが不可能だからです (あなたが今 port を作成するときに, 古い -CURRENT 達について心配する必要はありません. これは参考のために挙げられているに過ぎないからです).
これまで, 何百もの port が作られてきましたが, __FreeBSD__ が正しく使われたのは一つか二つの場合だけでしょう. 以前の port が誤った場所でそのマクロを使っているからといって, それをまねする理由はありません.