どのバージョンの 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 が間違ってふさわしくない場所で そのマクロを使っているからといって、 それをまねする理由はありません。