makefile – Eudyptula挑战和内核路径

前端之家收集整理的这篇文章主要介绍了makefile – Eudyptula挑战和内核路径前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我决定拿 Eudyptula Challenge.
在我提交了第一个任务之后,建立一个简单的“Hello World!”模块,我收到以下答案.

Please read the requirements for the Makefile and allow the module to be
built against any kernel source tree on the filesystem,not just those
kernels that happened to be installed in /lib/ at some point in time.

要求是:

The Makefile should be able to build the kernel module against the
source of the currently-running kernel as well as being able to accept
an arbitrary kernel sources directory from an environment variable.

我正在做的是检查环境变量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找到它:

KERNELRELEASE

$(KERNELRELEASE) is a single string such as "2.4.0-pre4",suitable
for constructing installation directory names or showing in
version strings. Some arch Makefiles use it for this purpose.

事情是,你的Makefile将被执行2次:从你的make命令和内核Makefile.而$(KERNELRELEASE)可以帮助你解决

>如果未定义此变量,则您的Makefile从您的make命令运行;在此步骤中,您将执行内核的Makefile(使用-C param提供内核目录).对于内核的Makefile(从Makefile的内部)运行make后,您的Makefile将被第二次执行(见下一个项目).
>如果定义了这个变量,你的Makefile是从内核的Makefile执行的(它定义了这个变量,然后再调用你的Makefile).在这一步,您可以使用内核构建系统功能,如obj-m.

-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.

猜你在找的C&C++相关文章