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