【发布时间】:2012-02-03 10:37:23
【问题描述】:
我有一个与其他内核模块通信的主内核模块。我已经像这样(从概念上)构建了模块:
main module/
|
\drivers/
|
|\driver1
|\driver2
\driver3
由于这些是内核模块,我需要像这样编译它们:
make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules
但是,由于可以从以前的目录调用驱动程序的 Makefile,所以我需要在调用另一个 make(linux 的 make)之前执行 $(shell pwd)。所以 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_DIR 和MAIN_MODULE_HOME 是用:= 声明的,我不明白事情是如何变得一团糟的。
(如果有人可以更好地表达问题标题,请这样做!)
【问题讨论】:
标签: linux variables makefile kbuild