Linux 内核编译规则的确切含义是什么?

Linux 内核编译规则的确切含义是什么?,linux,makefile,linux-kernel,gnu-make,kernel-module,Linux,Makefile,Linux Kernel,Gnu Make,Kernel Module,内核编译规则-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 或 我想知道KDIR的含义。Linux头文件还是Linux内核源代码? 有人使用SUBDIRS参数,但其他人使用M和src参数。有什么不同吗?来

内核编译规则
-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

我想知道
KDIR
的含义。Linux头文件还是Linux内核源代码? 有人使用
SUBDIRS
参数,但其他人使用
M
src
参数。有什么不同吗?

来自此链接:

$(src)
是指向生成文件所在目录的相对路径。在引用位于src树中的文件时,始终使用
$(src)

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

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

-C dir是在读取makefile之前更改目录的make命令行选项。所有内核make操作都在内核构建目录(可能与内核源目录相同,也可能不同)中启动

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

    $(MAKE) -C $(KDIR) _other parameters_
这里,
$(KDIR)
是一个Makefile变量,应该设置为内核构建目录的路径。(名称
KDIR
并不重要,但它是一个方便的名称,内核makefile本身不会使用它。)

例如,外部模块的Makefile可以设置
KDIR
,如下所示:

KDIR ?= "/lib/modules/$(shell uname -r)/build"
这将
KDIR
设置为当前运行内核的内核构建目录,除非
KDIR
已设置为其他内容。例如,可以在外部环境变量中设置,也可以在
make
命令行上设置:

$ make KDIR=/path/to/some/kernel/build   # sets KDIR to a specified kernel build directory
或:

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

    $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
    $(MAKE) -C $(KDIR) M=$(PWD) modules
$(PWD)
是一个由shell设置的环境变量,可扩展到进程的当前工作目录。对于构建外部内核模块,这应该是包含外部模块源代码及其Makefile的目录

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

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

M=
表单是在内核版本2.6.6中引入的。在内核版本2.6.6之前,必须使用
SUBDIRS=
表单。
SUBDIRS=
表单在内核版本5.0到5.3.x中不受欢迎,在内核版本5.4以后不再受支持

在命令行上指定
M=
的替代方法是设置并导出
KBUILD\u EXTMOD
环境变量:

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

KBUILD_EXTMOD := $(PWD)
export KBUILD_EXTMOD

all:
    $(MAKE) -C $(KDIR) modules
所有这些都会导致在内核子make的Makefile中以某种方式设置
KBUILD\u EXTMOD
。如果设置,它将使用环境中的
KBUILD\u EXTMOD
,否则它将使用命令行中的
M=
SUBDIRS=
设置来设置
KBUILD\u EXTMOD

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

    $(MAKE) -C $(KDIR) M=$(PWD) src=$(PWD) modules
我不知道为什么在那里使用
src=$(PWD)
参数

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

KBUILD_EXTMOD := $(PWD)
export KBUILD_EXTMOD

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