15.5. OS の種類やバージョンの識別

どのバージョンの 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__ マクロを使用してください.

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

Note: (2.2-STABLE は 2.2.5-RELESE 以後, ``2.2.5-STABLE'' と呼ばれることがあります.) 見てのとおりこれは年・月というフォーマットになっていましたが, バージョン 2.2 からより直接的にメジャー/マイナー番号を使うように変更になりました. 並行していくつかのブランチ (枝分かれしたバージョン) を開発する場合には, リリースされた日付でそれらのリリースを分類することが不可能だからです (あなたが今 port を作成するときに, 古い -CURRENT 達について心配する必要はありません. これは参考のために挙げられているに過ぎないからです).

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

FreeBSD ports システムに関する質問は、(英語で) <ports@FreeBSD.org> へ、
この文書の原文に関するお問い合わせは、(英語で) <doc@FreeBSD.org> までお願いします。