LinuxカーネルのメイクファイルはKbuildフレームワークを使用します。これらはGNU makeによって解釈されますが、Kbuildは固有の使用規則を持つ多数のマクロセットで構成されているため、一般的なmakefileのガイドラインは適用されません。Kbuildの良い点は、タスクの複雑さを考慮して、ほとんど定型文を必要としないことです。
Kbuildは、カーネルソースのに記載されていますDocumentation/kbuild
。モジュールライターとして、特に読む必要がありますmodules.txt
(少なくとも他のものをざっと読んでください)。
変数を使用$(shell pwd)
すると展開されるため、現在実行していることは機能しませんEXTRA_CFLAGS
。makefileはモジュールのディレクトリからではなくカーネルソースツリーから実行されるため(これはKbuildの多くの非自明な側面の1つです)、間違ったディレクトリを選択しています。
ツリー外モジュールでインクルードディレクトリを指定する公式のイディオムは、§5.3にありmodules.txt
ます。src
変数は、あなたのモジュールのトップレベルのディレクトリに設定されています。したがって:
EXTRA_CFLAGS := -I$(src)/src/inc
この宣言Kbuild
は、モジュールツリーのルートで呼び出されるファイルにある必要があることに注意してください。(src
ディレクトリをモジュールツリーのルートと見なすことができます。その場合は、Kbuild
そこに置き、上記の値をで置き換えます-I$(src)/inc
)。それらをに入れることも可能ですMakefile
が、この定義は(カーネルモジュールの構築時にのみ適用されるものであれば)条件付きディレクティブ内にある必要がありますifeq ($(KERNELRELEASE),)
。§4.1を参照してくださいmodules.txt
。
Kbuild
まだファイルをお持ちでなく、そのファイルに切り替えたい場合は、§4.1をお読みくださいmodules.txt
。別個のKbuild
ファイルを持つことは、わずかに明確です。を呼び出す規則以外は、メインメイクファイルにカーネルに適用されるものを置かないでくださいmake -C $(KERNELDIR) M=$(pwd)
。では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