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

Table of Contents
22.1. そもそもカーネル オプションって何?
22.2. ではどのようにして追加するのでしょう?

原作: Jörg Wunsch

訳: 内川 喜章 , 1996 年 12 月 29 日.

Note: この章をお読みになる前に FreeBSD カーネルのコンフィグレーション の章の内容を 理解しておいてください.

22.1. そもそもカーネル オプションって何?

カーネルオプションの使い方は基本的には 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 内にはそれを含めます.