内核编译规则的确切含义是什么? [重复]

问题描述 投票:0回答:2
内核编译规则-C xxx M=xxx的确切含义是什么?

我已经多次看到编译规则:

$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules $(MAKE) -C $(KDIR) M=$(PWD) src=$(PWD) modules

例如KDIR等于

/lib/modules/$(shell uname -r)/build

/usr/src/kernel-headers

我想知道KDIR的含义。 Linux标头或Linux内核源代码?有人使用SUBDIRS参数,但其他人使用Msrc参数。有什么区别吗?
linux makefile linux-kernel gnu-make kernel-module
2个回答
1
投票

-C dirmake命令行选项,用于在读取makefile之前更改目录。所有内核make操作都从kernel build目录开始(该目录可能与kernel source目录不同)。

外部(树外)内核模块的Makefile具有在内核构建目录中运行子make的规则:

$(MAKE) -C $(KDIR) _other parameters_

这里,$(KDIR)是一个Makefile变量,应将其设置为

kernel build

目录的路径。 (名称KDIR并不重要,但它是一个方便的名称,否则内核Makefile本身不会使用它。)例如,外部模块的Makefile可以如下设置KDIR

KDIR ?= "/lib/modules/$(shell uname -r)/build"

将当前正在运行的内核的KDIR设置为

kernel build

目录,除非KDIR已被设置为其他名称。例如,可以在外部环境变量中设置它,也可以在make命令行上设置它:$ make KDIR=/path/to/some/kernel/build # sets KDIR to a specified kernel build directory
或:

$ make # lets KDIR be set to the default in the Makefile

在内核版本2.6.6和5.3.x之间,这两个基本上做了相同的事情:

$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules $(MAKE) -C $(KDIR) M=$(PWD) modules

$(PWD)是由外壳程序设置的环境变量,它会扩展到进程的当前工作目录。对于构建外部内核模块,该目录应该是包含外部模块的源代码及其Makefile的目录。

这些SUBDIRS=$(PWD)M=$(PWD)选项告诉内核子make的Makefile在指定目录(包含外部模块的Makefile和源的目录)中运行子make。

可能最好使用$(CURDIR)而不是$(PWD),因为CURDIR是由'make'本身设置为当前工作目录的。

M=格式是在内核版本2.6.6中引入的。在内核版本2.6.6之前,必须改为使用SUBDIRS=形式。对于内核版本5.0至5.3.x,SUBDIRS=格式已弃用,内核版本5.4及更高版本不再支持此格式。

在命令行上指定M=的另一种方法是设置和导出KBUILD_EXTMOD环境变量:

KDIR ?= "/lib/modules/$(shell uname -r)/build" KBUILD_EXTMOD := $(PWD) export KBUILD_EXTMOD all: $(MAKE) -C $(KDIR) modules

所有这些导致KBUILD_EXTMOD在内核子Make的Makefile中以某种方式设置。如果已设置,它将使用环境中的KBUILD_EXTMOD,否则将使用命令行中的M=SUBDIRS=设置来设置KBUILD_EXTMOD

您的一个示例显示了以下形式:

$(MAKE) -C $(KDIR) M=$(PWD) src=$(PWD) modules

我不知道为什么在这里使用src=$(PWD)参数。

0
投票
从此链接:https://www.kernel.org/doc/html/latest/kbuild/makefiles.html

$(src)是指向

Makefile所在目录的相对路径。引用位于src树中的文件时,请始终使用$(src)

并且根据我作为内核编译器的经验:

M代表“模块”,您可能想将其添加到内核中的各个模块。您也可以单独编译这些模块并添加到内核中。

© www.soinside.com 2019 - 2024. All rights reserved.