makefile – Eudyptula挑战和内核路径
我决定拿
Eudyptula Challenge.
在我提交了第一个任务之后,建立一个简单的“Hello World!”模块,我收到以下答案.
要求是:
我正在做的是检查环境变量KERNELRELEASE是否设置.如果是我构建模块 $(KERNELRELEASE)/build 如果不是反对的话 /lib/modules/$(shell uname -r)/build 我不明白为什么这不符合这项任务的要求. 解决方法
根据
Eudyptula challenge规则,禁止给你直接的解决方案,所以我将尝试描述答案的元素,所以你可以自己解决问题.基本上,我下面写的所有内容都在
Documentation/kbuild/modules.txt文件(特别是
section 3.1 – Shared Makefile)中有所描述,所以我不认为这是违规的规则.下面只是解释上述文档中描述的内容.
KERNELRELEASE变量 你所错误的是认为$(KERNELRELEASE)旨在保持内核的路径.什么$(KERNELRELEASE)变量实际上意味着 – 你可以在Documentation/kbuild/makefiles.txt找到它:
事情是,你的Makefile将被执行2次:从你的make命令和内核Makefile.而$(KERNELRELEASE)可以帮助你解决: >如果未定义此变量,则您的Makefile从您的make命令运行;在此步骤中,您将执行内核的Makefile(使用-C param提供内核目录).对于内核的Makefile(从Makefile的内部)运行make后,您的Makefile将被第二次执行(见下一个项目). -C参数 您真正需要做的是在Makefile中定义一些自定义变量,该变量将保存内核目录路径.你可以称它为KDIR为例.如您所知,您的内核源位于此路径:/ lib / modules / $(shell uname -r)/ build.接下来,您可以在执行内核的Makefile时向-C param(参见man 1 make)提供此变量. 接下来,您必须使您可以从Makefile外部传递此变量.为此,可以使用conditional variable assignment operator: KDIR ?= /lib/modules/$(shell uname -r)/build 这样,如果您将KDIR变量传递给您的Makefile,如下所示: $make KDIR=bla-bla-bla KDIR变量将具有您传递的值.否则它将包含默认值,它是/ lib / modules / $(shell uname -r)/ build. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |