他のカーネルモジュールと通信するメインカーネルモジュールがあります。私はこのようにモジュールを構成しました(概念的に):
main module/
|
\drivers/
|
|\driver1
|\driver2
\driver3
これらはカーネルモジュールなので、次のようにコンパイルする必要があります。
make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules
ただし、ドライバのMakefileは以前のディレクトリから呼び出すことができる$(shell pwd)
ため、他のmake(Linuxのmake)を呼び出す前に行う必要があります。したがって、Makefileは次のようになります。
CURRENT_DIR := $(shell pwd)
.PHONY: all
all:
$(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(CURRENT_DIR) modules
これまでのところ問題はなく、完全に機能します。問題はこれです:私はドライバーがインクルードする必要があるファイルを持っているので、作成するインクルードパスを指定する必要があります。私は最初に試しました
EXTRA_CFLAGS += -I../..
そして、それが機能しない理由をすぐに理解しました(相対パスは現在のディレクトリではなく/ lib / module / ...になります)。だから私はそれを次のように変更しました:
MAIN_MODULE_HOME := $(CURRENT_DIR)/../..
EXTRA_CFLAGS += -I$(MAIN_MODULE_HOME)
奇妙なことに、これは機能しません!私が書いたら
EXTRA_CFLAGS += -Ipath/I/get/from/pwd/../..
手動でコンパイルします!誰かが私が間違っていることを説明できますか?makeを呼び出す前に、私はecho
ed$(CURRENT_DIR)
と$(MAIN_MODULE_HOME)
変数に意味があります。
EXTRA_CFLAGS
それがすぐに評価されないことは知っていますが、CURRENT_DIR
とMAIN_MODULE_HOME
宣言されているので、:=
物事がどのように台無しになっているのかわかりません。
(誰かが質問のタイトルをよりよく表現できるなら、してください!)