質問: linuxカーネルモジュールにローカルヘッダーファイルを含める方法 次のようなソースファイルを含むモジュールmymodがあるとします。 src/mod/mymod.c src/inc/mymod.h 次のようにmymod.hを含めようとします_#include <mymod.h> _私のメイクファイルにはextra_cflags= -i$(shell pwd)/../inc/が含まれていますが、カーネルが作成されると、次のエラーが表示されます。 mymod.hが見つかりません その理由は、カーネルモジュールが作成されると、このコマンドがmakefileから実行されるためです(make v1を使用):_make -c <path/to/linux/src> m=<path/to/mymod> modules _他の作品では、私の$(shell pwd)が_<path/to/linux>_に拡張されました。これは私が望むものではありません。 mymodソースツリーの_-i_を指すように_src/inc_パラメータを指定するにはどうすればよいですか?
回答: linuxカーネルmakefileはkbuildフレームワークを使用します。これらはgnu makeによって解釈されますが、kbuildは独特の使用規則を持つ多数のマクロのセットで構成されているため、典型的なmakefileガイドラインは適用されません。タスクの複雑さを考慮します。kbuildはカーネルソースの _documentation/kbuild_ に記載されています。モジュールの作成者は、特に _modules.txt_ を読む必要があります(少なくとも他のユーザーに目を通す必要があります)。_extra_cflags_変数を使用すると$(shell pwd)が展開されるため、現在実行していることが機能しません。 makefileはモジュールのディレクトリ(これはkbuildの多くの非自明な側面の1つです)ではなく、カーネルソースツリーから実行されるため、間違ったディレクトリを取得しています。ツリー外モジュールのインクルードディレクトリを指定する公式のイディオムは_modules.txt_の5.3にあります。 src変数は、モジュールのトップレベルディレクトリに設定されます。したがって:_extra_cflags := -i$(src)/src/inc _この宣言は、モジュールツリーのルートにあるkbuildというファイルにある必要があります。 (srcディレクトリをモジュールツリーのルートと見なすこともできます。その場合は、そこにkbuildを置き、上記の値を-i$(src)/incに置き換えます)。それらをmakefileに入れることも可能ですが、この定義は(カーネルモジュールの構築時にのみ適用されるものであれば)条件付きディレクティブifeq ($(kernelrelease),)内にある必要があります。 _modules.txt_の§4.1を参照してください。kbuildファイルをまだ持っておらず、そのファイルに切り替えたい場合は、_modules.txt_の§4.1をお読みください。個別のkbuildファイルを用意する方が少しわかりやすくなります。 make -c $(kerneldir) m=$(pwd)を呼び出すルール以外に、カーネルに適用されるものをメインのmakefileに記述しないでください。 kbuildでは、最低限必要なのは、構築するモジュールのリスト(多くの場合は1つだけ)と、モジュールに含めるファイルのリスト、および依存関係の宣言です。_extra_cflags := -i$(src)/inc obj-m := mymod.o mymod-y := $(src)/mod/mymod.o $(src)/mod/mymod.o: $(src)/inc/mymod.h _