Module Linux树外模块构建问题

Module Linux树外模块构建问题,module,makefile,linux-kernel,Module,Makefile,Linux Kernel,我有这个用于构建内核模块的make文件。然而,每当我运行它时,我都会得到一个错误,即没有规则来生成target.c。c不是源文件。如果我删除If[-dsrc]检查,那么我会得到一个错误,说内核构建系统的递归make调用中不存在src。如果我指定src的完整路径,它会给出相同的输出,表示它找不到它,这真的很奇怪。如果我硬编码src_文件,如果我没有复制和粘贴错误,它就会工作。有人知道发生了什么吗?在makefile中,您希望当前目录是给定makefile中包含的目录。但当您的文件从Kbuild上下

我有这个用于构建内核模块的make文件。然而,每当我运行它时,我都会得到一个错误,即没有规则来生成target.c。c不是源文件。如果我删除If[-dsrc]检查,那么我会得到一个错误,说内核构建系统的递归make调用中不存在src。如果我指定src的完整路径,它会给出相同的输出,表示它找不到它,这真的很奇怪。如果我硬编码src_文件,如果我没有复制和粘贴错误,它就会工作。有人知道发生了什么吗?

在makefile中,您希望当前目录是给定makefile中包含的目录。但当您的文件从Kbuild上下文执行时,这不再是真的:当前目录是包含内核源代码的目录

这就是src_files变量的内容出错的原因:通配符无法在内核源代码中的src/下找到文件。您可以使用特殊的src变量来引用makefile中的目录:

obj-m := $(MODNAME).o
ccflags-y := $(CCFLAGS)
src_files := $(wildcard $(foreach pat,*.c *.cpp *.s,src/$(pat) src/$(MODNAME)/$(pat)))
$(MODNAME)-objs := $(addsuffix .o, $(basename $(src_files)))

all:

    make -C $(KDIR) M=$(shell pwd) modules

clean:

    make -C $(KDIR) M=$(shell pwd) clean
从另一方面看,*-objs变量中枚举的路径应该是相对的,这是Kbuild的要求。因此,您需要从这些绝对路径中删除前缀:

src_files := $(wildcard $(foreach pat,*.c *.cpp *.s,$(src)/src/$(pat) $(src)/src/$(MODNAME)/$(pat)))
然后,您可以使用以下路径创建对象列表:

src_files_rel := $(src_files:$(src)/%=%)

这将解决很多问题,但出于某种原因,我仍然遇到了一个问题。下面是指向我的Makefile和输出的链接。再次注意,如果源文件中有硬代码,它将完全构建。哦,这是src_files_rel assignment中不正确的替换引用用法:正确语法$var:pattern=replacement使用=代替,作为分隔符。答案现在已经确定了。
$(MODNAME)-objs := $(addsuffix .o, $(basename $(src_files_rel)))