カーネルコンフィグレーションの新しいオプションを追加する

原作: &a.joerg;

訳: &a.yoshiaki; . 29 December 1996. の章の内容を 理解しておいてください. そもそもカーネル オプションって何?

カーネルオプションの使い方は基本的には の章に書いてあります. そこには「伝統的な形式」と「新しい形式」のオプションの説明があります. すべてのカーネルのオプションを新しい形式のものに置き換え, コンフィグファイル を修正して 基本的に, カーネルオプションはカーネルのコンパイルプロセスの C プリプロセッサのマクロの定義にすぎません. 実際に選択的に make できる ようにするためには, 対応する部分のカーネルソース (またはカーネルの #ifndef THIS_OPTION #define THIS_OPTION (some_default_value) #endif /* THIS_OPTION */

この場合, 管理者がコンフィグファイルのオプションに別の値を記述すれば, デフォルトの設定を打ち消して新しい値に置き換えられます. 当然, 新しい値はプリプロセッサによってソースコード中で置き換えられるため, デフォルトの値が使われていた場所において C の式として有効な値でなければ なりません.

また, 単に特定のコードを有効にするか無効にするかを設定するための 値を持たないオプションも作ることができます. #ifdef THAT_OPTION [あなたのコードが入ります] #endif

コンフィグファイルに C 言語にくわしい人であれば「コンフィグオプション」とされているもの は少なくとも一つの options notyet,notdef

このようにコンフィグファイルをしておくと, カーネルのコンパイルは うまく行きません. :-)

(訳注: たとえば MATH_EMULATE のように 有効/無効のためのパラメタを 持たないオプションの場合, 無効とするためのパラメタをつけて, オプション で「無効とする」と明示することはできないという意味です)

明らかに, 任意のオプション名がカーネルソースツリー全体でどのように 使われているかを追いかけることは非常に難しいことです. このことが opt_foo.h という名前に されます. この方法では, 通常の Makefile の依存関係が適用され, 古い形式のオプションの機構は, 局部的なオプションや実験的なオプション のような一時的に利用されると考えられるオプションにおいては有効です. つまり ではどのようにして追加するのでしょう?

最初に sys/conf/options (または sys/i386/conf/options.<arch>, たとえば sys/i386/conf/options.i386) を編集し, 新しいオプション を含めるのに最適な opt_foo.h ファイルを選びます.

新しいオプションの必要がなくなったとしたら, これを取り除きます. たとえば, SCSI サブシステムに関するすべてのふるまいについてのオプション の変更は 新しいオプションを加えるのに使えそうな opt_foo.h がない場合は新しい名前を作ってください. 意味のある名前を作り options[.<arch>] ファイル に新しいセクションのコメントをつけてください. 大量のオプションを一つの opt_foo.h にまとめると コンフィグファイルの一つのオプションを変更したときに多くのファイルが 再コンパイルされる原因になります.

新しいオプションに依存するカーネルファイルは最終的には見つけ出 されます. ただし, オプションを作っただけで対応するソースがどこにも ない場合は別です. find /usr/src/sys -name type f | xargs fgrep NEW_OPTION

オプションに対応するソースを見つけるのに上記のコマンドは便利です. 見つけたすべてのファイルで編集, 追加をおこないます. #include "opt_foo.h"

ファイルの先頭の, すべての #ifndef NEW_OPTION #define NEW_OPTION (something) #endif

システムヘッダファイル (たとえば /usr/include/sys/ にある ファイル) をオプションで置き換えることは, ほとんどの場合で失敗します. そうすると, ヘッダファイルを深刻な状態に破壊してしまうので, include しないとオプションの値によって不整合が起きてしまう場合を除き, それらの ファイルに opt_foo.h を include しないでください. そう, 現在このような例がいくつか存在していますが, 必ずしも正しい方法 ではありません.