カーネルオプションの使い方は基本的には
FreeBSDカーネルのコンフィグレーション
の章に書いてあります.
そこには「伝統的な形式」と「新しい形式」のオプションの説明があります.
すべてのカーネルのオプションを新しい形式のものに置き換え, コンフィグファイル
を修正して config(8)
を実行した後にカーネルのコンパイルディレクトリで
make depend
を実行すれば, ビルドプロセスが自動的に変更された
オプションを検出し, 必要なファイルだけを再コンパイルするようにすることが
最終的な目的です. config(8)
を実行するたびに古いコンパイルディレクトリ
を消してしまう現在のやりかたは, やがておこなわれなくなるでしょう.
基本的に, カーネルオプションはカーネルのコンパイルプロセスの
C プリプロセッサのマクロの定義にすぎません. 実際に選択的に make できる
ようにするためには, 対応する部分のカーネルソース (またはカーネルの
.h
ファイル) がオプションを使えるようにあらかじめ書かれていなければ
なりません. つまりデフォルト値をコンフィグファイルのオプションで置き換え
られるようになっていなければなりません. これは普通は次のようになっています.
#ifndef THIS_OPTION #define THIS_OPTION (some_default_value) #endif /* THIS_OPTION */
この場合, 管理者がコンフィグファイルのオプションに別の値を記述すれば, デフォルトの設定を打ち消して新しい値に置き換えられます. 当然, 新しい値はプリプロセッサによってソースコード中で置き換えられるため, デフォルトの値が使われていた場所において C の式として有効な値でなければ なりません.
また, 単に特定のコードを有効にするか無効にするかを設定するための 値を持たないオプションも作ることができます.
#ifdef THAT_OPTION [あなたのコードが入ります] #endif
コンフィグファイルに THAT_OPTION
と記述するだけで (値の有無
にかかわらず) 対応する部分のコードが組み込まれます.
C 言語にくわしい人であれば「コンフィグオプション」とされているもの
は少なくとも一つの #ifdef
で参照されているということはすぐに理解
できるでしょう. ところで, ごく一部の人たちは次のようなものを試して
みようとするかもしれません.
options notyet,notdef
このようにコンフィグファイルをしておくと, カーネルのコンパイルは うまく行きません. :-)
(訳注: たとえば MATH_EMULATE のように 有効/無効のためのパラメタを 持たないオプションの場合, 無効とするためのパラメタをつけて, オプション で「無効とする」と明示することはできないという意味です)
明らかに, 任意のオプション名がカーネルソースツリー全体でどのように
使われているかを追いかけることは非常に難しいことです. このことが
新しい形式 のオプションの機構を採り入れる理由の背景です.
ここではそれぞれのオプションはカーネルコンパイルディレクトリにある別々の
.h
ファイルとなり, opt_foo.h
という名前に
されます. この方法では, 通常の Makefile の依存関係が適用され,
make
プログラムはオプションが変更された時に再コンパイルが必要な
ものを見つけることができます.
古い形式のオプションの機構は, 局部的なオプションや実験的なオプション
のような一時的に利用されると考えられるオプションにおいては有効です.
つまり #ifdef
をカーネルのソースに追加するのは簡単であり,
それがそのままカーネルコンフィグオプションになります.
この場合, 管理者はオプションの利用において
依存関係を把握しておく責任があります (また, 手動でカーネルの一部分を
強制的に再コンパイルする必要があるかもしれません). サポートされている
オプションのすべてについて一つでも変更があると, config(8)
は
サポートされていないオプションがコンフィグファイルの中にあるという警告
を出しますが, カーネルの Makefile 内にはそれを含めます.