16.6. OS の種類やバージョンの識別
戻る | 第16章 やっていいことといけないこと | 次へ

## 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.5. `WRKDIRPREFIX` | ホーム | 16.7. __FreeBSD_version の値

本文書、および他の文書は ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/ からダウンロードできます。

FreeBSD に関する質問がある場合には、 ドキュメント を読んだ上で <questions@FreeBSD.org> まで (英語で) 連絡してください。
本文書に関する質問については、 <doc@FreeBSD.org> まで電子メールを (英語で) 送ってください。