gpt4 book ai didi

linux - 不能在内核模块 makefile 中使用通配符

转载 作者:太空宇宙 更新时间:2023-11-04 09:44:21 24 4
gpt4 key购买 nike

我非常熟悉 Makefile 和内核模块,但最近我在我的 Makefile 中遇到了一个没有任何意义的问题 -- 关于使用通配符。为了演示这一点,我从头开始编译一个 hello world 内核模块。目录结构是这样的:

hello_mod/
|
--- hello.c
|
--- Makefile

这是实际的 makefile :

CFILES := $(wildcard hello.c*)
#CFILES := hello.c
OBJS := $(CFILES:.c=.o)

KSRC := /lib/modules/$(shell uname -r)/build

obj-m += hello_world.o
hello_world-y := $(OBJS)

all:
@echo $(CFILES)
$(MAKE) -C $(KSRC) M=$$PWD modules

clean:
$(MAKE) -C $(KSRC) M=$$PWD clean

.PHONY: clean

问题是即使注释的 $(CFILES) 和未注释的 $(CFILES) 完全相同,使用第一个 $(CFILES) 时构建失败并出现以下错误:

*** No rule to make target `/home/test/hello_mod/hello_world.c', needed by
/home/test/hello_mod/hello_world.o'. Stop.

如果使用注释的 $(CFILES),它会完美地工作。

如果有人想对此进行测试,我将包含 hello.c 的 hello world 源代码:

#include <linux/kernel.h>
#include <linux/module.h>

static int mod_init()
{
printk("Hello\n");
return 0;
}

static void mod_exit()
{
printk("Bye world\n");
}

module_init(mod_init);
module_exit(mod_exit);

有谁知道为什么会这样?我需要在 makefile 中使用通配符。任何帮助将不胜感激。

最佳答案

这里有两种情况发生。第一个实际上只依赖于 KSRC 变量和递归 make 调用。第二个 make 只需要 CFILESOBJSobj-mhello_world-y 变量,不需要'利用 all: 目标。因此,您的调试显示 CFILES 已针对第一个 Make 正确设置,但未在其中使用,并且未在第二个 Make 中显示它。

您是从不同的目录进行通配符扩展,而没有选择正确的文件。对 CFILES 试试这个:

CFILES := $(notdir $(wildcard $M/hello.c*))

关于linux - 不能在内核模块 makefile 中使用通配符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18041772/

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