これが、なぜ一方を他方を使用することを選択するのかについての私の現在の理解です。確認または修正していただけますか?
#ifdef
周囲のコードB内のオプションのコードA(GPUサポートなどのボーナス機能を含む)の場合、モジュールB全体をトライステートとして宣言できたとしても、ifdef
はコンパイル時に評価されます。私がここで見逃している他の要因はありますか?私が行方不明になっているのを見ることができた要因は
その他の説明、メモ、リンク、および考えをいただければ幸いです。ありがとう!
https://www.linuxjournal.com/content/kbuild-linux-kernel-build-system からの引用
カーネル内のすべてをモジュールとしてコンパイルできるわけではありません。
多くの機能は非常に煩わしいため、コンパイル時にカーネルがそれらをサポートするかどうかを決定する必要があります。たとえば、実行中のカーネルに対称型マルチプロセッシング(SMP)またはカーネルプリエンプションのサポートを追加することはできません。したがって、ブール構成シンボルを使用することは、これらの種類の機能にとって意味があります。
モジュールとしてコンパイルできるほとんどの機能は、コンパイル時にカーネルに追加することもできます。これがトライステートシンボルが存在する理由です。機能の組み込み(y)をモジュールとしてコンパイルするか(m)、まったくコンパイルしないか(n)を決定するためです。
これは明らかだと思います。選択肢が2つしかない場合はブール値を使用し、選択肢が3つある場合はトライステートを使用します。他のすべては意味がありません。