-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
参数,但其他人使用M
和src
参数。有什么区别吗?
-C dir是make命令行选项,用于在读取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)
参数。
$(src)
是指向
Makefile所在目录的相对路径。引用位于src树中的文件时,请始终使用$(src)
。
M
代表“模块”,您可能想将其添加到内核中的各个模块。您也可以单独编译这些模块并添加到内核中。