我有一个与其他内核模块通信的主内核模块。我已经构建了这样的模块(概念上):
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)
and$(MAIN_MODULE_HOME)
和变量是有意义的。
我知道这EXTRA_CFLAGS
不会立即被评估,但是因为CURRENT_DIR
和MAIN_MODULE_HOME
被声明,:=
我不明白事情是如何搞砸的。
(如果有人可以更好地表达问题标题,请这样做!)