4

他のカーネルモジュールと通信するメインカーネルモジュールがあります。私はこのようにモジュールを構成しました(概念的に):

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を呼び出す前に、私はechoed$(CURRENT_DIR)$(MAIN_MODULE_HOME)変数に意味があります。

EXTRA_CFLAGSそれがすぐに評価されないことは知っていますが、CURRENT_DIRMAIN_MODULE_HOME宣言されているので、:=物事がどのように台無しになっているのかわかりません。

(誰かが質問のタイトルをよりよく表現できるなら、してください!)

4

2 に答える 2

8

EXTRA_CFLAGS を渡して次のようにする必要があります。

$(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(CURRENT_DIR) \
           EXTRA_CFLAGS="$(EXTRA_CFLAGS)" modules

アップデート:

driver1/Makefile の内容は 2 回読み込まれますmake。1 回目は driver1 ディレクトリ内で実行するとき、2 回目は Kbuild システムによって読み込まれます。

まず、 のCURRENT_DIR := $(shell pwd)ようなものに評価されます/home/users/.../main module/drivers/driver1。次に、Kbuild は次のCURRENT_DIR := $(shell pwd)ように評価されます。/usr/src/linux-headers-2.6.32-33-generic/

LDD3、ch2、p24に記載されているその状況

コツは、makefile を次のように書くことです。

# If KERNELRELEASE is defined, we've been invoked from the
# kernel build system and can use its language.
ifneq ($(KERNELRELEASE),)
    obj-m := hello.o
# Otherwise we were called directly from the command
# line; invoke the kernel build system.
else
    KERNELDIR ?= /lib/modules/$(shell uname -r)/build
    PWD  := $(shell pwd)
default:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
#endif
于 2012-01-05T16:09:37.623 に答える
0

の再帰的なフレーバーが原因である可能性が最も高く、サブメイクでEXTRA_CFLAGS実際に展開され、そこから参照されるアクセスがありませんMAIN_MODULE_HOME

まず、エクスポートしてみてくださいMAIN_MODULE_HOME:

export MAIN_MODULE_HOME

また、それを使用する前にフラット化 を試みましEXTRA_CFLAGSた (ただし、これが Kbuild の適切なプラクティスであるかどうかはわかりません)。

EXTRA_CFLAGS := $(EXTRA_CFLAGS)
于 2012-01-05T16:04:45.233 に答える