2

関数 func_a を含むソース ファイル ac があるとします。いくつかの機能定義に基づいて func_a を呼び出し、理想的には同じ機能定義に基づいて ac をモジュールに含めたいと考えています。

したがって、常に存在するモジュールソース(main.cなど)には、次のようなものがあります

#ifdef FEATURE_A
func_a();
#endif

そして、モジュールのkbuildでは次のようになります

obj-$(CONFIG_SAMPLE) += sample.o sample-objs := main.o utils.o

FEATURE_A が定義されている場合のみ、サンプル モジュールに ac を含めます。

???

ただし、一方がプリプロセッサ ディレクティブであり、もう一方がコンパイラ/リンカー/ビルド ディレクティブであるため、これは意味をなさない場合があります。プリプロセッサ ディレクティブが kbuild によって定義されたフラグを使用する別の方法の方が理にかなっているのではないでしょうか? これを達成する方法はありますか?

ありがとう。

4

2 に答える 2

2

NFS モジュールに条件付きで sysctl サポートがどのように含まれているかを指摘して、あなたの質問に答えます (他にも例があると思いますが、これは私がよく知っているものです)。

カーネル構成システムは、構成オプションを C プリプロセッサ マクロとして公開するファイル「include/linux/autoconf.h」を維持します。したがって、上記のファイルは、sysctl サポートを構成したかどうかによって、コンパイル方法が異なります。

sysctl サポートが有効になっている場合:ヘッダー "include/linux/nfs_fs.h" はマクロをチェックCONFIG_SYSCTLし、C 関数を宣言しますnfs_register_sysctl()。この関数は「fs/nfs/super.c」で呼び出されます。Makefile (nfs-y += sysctl.o参照) は、ビルド システムに、ファイル "fs/nfs/sysctl.c" をモジュールにコンパイルするように指示します。このモジュールは、関数 を定義しますnfs_register_sysctl()

sysctl サポートが無効になっている場合:ヘッダー "include/linux/nfs_fs.h" はマクロをチェックCONFIG_SYSCTLし、プリプロセッサ マクロが であると宣言nfs_register_sysctl()します0。このマクロは、「fs/nfs/super.c」で使用され、一部の (デッド) エラー処理コードをバイパスします。Makefile (nfs-n += sysctl.o参照) は、「fs/nfs/sysctl.c」をコンパイルまたはリンクしません。

于 2012-07-06T07:12:57.117 に答える
1

3.7 コンパイルフラグを読んでください。

私が理解しているように、コンパイル中に渡された Kconfig オプションと前処理されたマクロの間にはゆるい関係があります。コンパイル時に使用するプリプロセッサ フラグを定義するのは、カーネル開発者次第です。

たとえば、net/rds/Makefile次のようになります。

ccflags-$(CONFIG_RDS_DEBUG)    :=      -DDEBUG

DEBUGここで、カーネルが Kconfig オプションで構成されている場合、プリプロセッサ フラグが渡されますCONFIG_RDS_DEBUG

于 2012-07-05T21:08:10.183 に答える