FreeBSD port 作成者のためのハンドブック
Prev | Chapter 15. やっていいことといけないこと | Next

# 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__` マクロを使用してください.

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

- `__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 が誤った場所でそのマクロを使っているからといって, それをまねする理由はありません.

Prev | Home | Next
`WRKDIRPREFIX` | Up | `bsd.port.mk` の後に書くこと

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