【问题标题】:Linux out of tree module build issueLinux out of tree 模块构建问题
【发布时间】:2016-05-26 16:53:52
【问题描述】:
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

我有这个用于构建内核模块的 make 文件。但是,每当我运行它时,我都会收到一条错误消息,指出没有规则可以制作目标 .c。 .c 不是源文件。如果我删除“if [-d src]”检查,那么我会收到一条错误消息,指出来自内核构建系统的递归 make 调用中不存在 src。如果我指定 src 的完整路径,它会给出相同的输出,说它找不到它(这真的很奇怪)。如果我硬编码 src_files 它可以工作(如果我没有复制和粘贴错误)。有人知道发生了什么吗?

【问题讨论】:

    标签: module makefile linux-kernel


    【解决方案1】:

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

    这就是为什么src_files 变量的内容会出错:wildcard 在内核源代码中找不到 src/ 下的文件。您可以使用特殊的 src 变量来引用您的 makefile 目录:

    src_files := $(wildcard $(foreach pat,*.c *.cpp *.s,$(src)/src/$(pat) $(src)/src/$(MODNAME)/$(pat)))
    

    另一方面,*-objs 变量中枚举的路径应该是相对(这是 Kbuild 的要求)。所以你需要从这些绝对路径中去掉前缀:

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

    然后你可以使用这些路径来创建对象列表:

    $(MODNAME)-objs := $(addsuffix .o, $(basename $(src_files_rel)))
    

    【讨论】:

    • 这个接缝解决了很多问题,但由于某种原因我仍然遇到问题。下面是我的 Makefile 和输出的链接。请注意,如果源文件中有硬代码,它将完全构建。 drive.google.com/open?id=0B59DI9U-fFzfWjNIMTZGSkJLZjQ
    • 哦,src_files_rel 赋值中的替换引用使用不正确:正确的语法 $(var:pattern=replacement) 使用 = 而不是 , 作为分隔符。现在答案已经确定了。
    猜你喜欢
    • 1970-01-01
    • 2020-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-17
    相关资源
    最近更新 更多