Linux出树模块构建问题

时间:2016-05-25 05:59:03

标签: module makefile linux-kernel

for(int i=0;i<stateIDs.size();i++){
    state.removeItem(stateIDs.get(i));
}

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

1 个答案:

答案 0 :(得分:3)

在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变量中枚举的路径应该是 relative (这是Kbuild的要求)。所以你需要从这些绝对路径中去掉前缀:

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

然后您可以将这些路径用于创建对象列表:

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