gpt4 book ai didi

linux - Makefile 变量替换显然没有完成,即使 := is used in declaration

转载 作者:IT王子 更新时间:2023-10-29 01:02:11 24 4
gpt4 key购买 nike

我有一个主内核模块,其他内核模块与之通信。我已经构建了这样的模块(概念上):

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_DIRMAIN_MODULE_HOME 是用 := 声明的我不明白事情怎么会变得一团糟。

(如果有人能更好地表达问题标题,请这样做!)

最佳答案

你应该像这样传递 EXTRA_CFLAGS:

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

更新:

driver1/Makefile 的内容被读取两次:第一次 - 当您在 driver1 目录中运行 make 时,第二次 - 由 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

关于linux - Makefile 变量替换显然没有完成,即使 := is used in declaration,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8745301/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com