make命令中的M选项,Makefile

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 

其他答案大多是正确的,但我想告诉你的方式来学习它。

  1. M不是一个选项
  2. MMakefile一个变量
  3. 所以我们应该读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变量设置为该值”。