make -C ~/kernel-2.6 M=`pwd` modules
在上面的行中,M ='pwd'是什么意思?
我无法理解这个解释:
M =选项会导致makefile在尝试构build模块目标之前移回到模块源目录中。
你能更清楚一点吗?
M
不是make
的选项。 注意它缺少连字符。 M
是分配给执行make
的变量。 如果make
执行一个Makefile
脚本,这个脚本可以读取变量M
并使用它的内容。
在你提供的示例中, make
将在~/kernel-2.6
读取Makefile
,并将当前工作目录分配给变量M
通常,这将允许make
在处理Makefile
后返回到当前目录。
阅读make
的手册:
-C dir, --directory=dir Change to directory dir before reading the makefiles or doing anything else.
您的调用将目录更改为~/kernel
并有效地调用make
,即从该目录读取Makefile
。 使用M
变量,makefile知道你的实际项目文件在哪里,可以改回到那个位置。
关键是你不写自己的makefile,而是使用单一的,一劳永逸的版本。
我有类似的测验
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
这里make是在我的项目目录中调用的。 -C
是make option:
-C dir,–directory = dir在读取makefile或执行其他任何操作之前,切换到目录dir。 如果指定了多个-C选项,则每个选项都相对于前一个选项进行解释:-C / -C等同于-C / etc。 这通常与make的递归调用一起使用。
M
不是做出选择,而是传递给它的论点。 由于-C
改变目录,我们知道make会读取该目录中的make文件。 通过检查该目录中的make文件,我已经发现了如何处理M
:
从-C
指向的目录中的make文件(名为Makefile)(它是内核构建目录):
# Use make M=dir to specify directory of external module to build # Old syntax make ... SUBDIRS=$PWD is still supported # Setting the environment variable KBUILD_EXTMOD takes precedence ifdef SUBDIRS KBUILD_EXTMOD ?= $(SUBDIRS) endif
Linux设备驱动程序的说明,第3版,Jonathan Corbet等:
该命令首先将其目录更改为-C选项提供的目录(即,内核源目录)。 在那里它找到了内核的顶层makefile。 M =选项会导致makefile在尝试构建模块目标之前移回到模块源目录中。
构建外部模块的命令是:
$ make -C <path_to_kernel_src> M=$PWD
由于命令中给出的“M =”选项,kbuild系统知道正在建立一个外部模块。
针对正在运行的内核使用:
$ make -C /lib/modules/`uname -r`/build M=$PWD
其他答案大多是正确的,但我想告诉你的方式来学习它。
M
不是一个选项 M
是Makefile
一个变量 make -C
Makefile
的目录下的Makefile
。 阅读Makefile:有几点意见:
# Use make M=dir to specify directory of external module to build # Old syntax make ... SUBDIRS=$PWD is still supported # Setting the environment variable KBUILD_EXTMOD take precedence ifdef SUBDIRS KBUILD_EXTMOD ?= $(SUBDIRS) endif ifeq ("$(origin M)", "command line") KBUILD_EXTMOD := $(M) endif
您可以搜索KBUILD_EXTMOD
:
VPATH := $(srctree)$(if $(KBUILD_EXTMOD),:$(KBUILD_EXTMOD)) module-dirs := $(addprefix _module_,$(KBUILD_EXTMOD))
这就是内核的Makefile
可以构建你的树外源代码。
在一个Unix shell中,在命令中写入foobar
意味着“运行foobar
命令并在这里替换它的输出”。
因此,在make
命令中包含M=`pwd`
意味着“运行pwd
命令来打印当前工作目录,并将M
变量设置为该值”。