make命令中的M选项,Makefile

use*_*069 20 c linux makefile linux-device-driver linux-kernel

make -C ~/kernel-2.6 M=`pwd` modules
Run Code Online (Sandbox Code Playgroud)

M ='pwd'在上面的行中是什么意思?

我无法理解这个解释:

在尝试构建模块目标之前,M =选项会使makefile移回模块源目录.

你能说得更清楚吗?

小智 18

M不是一个选择make.注意它缺少连字符.M是分配给执行的变量make.如果make执行Makefile脚本,则此脚本可以读取变量M并使用其内容.

在您提供的示例中,make将读Makefile~/kernel-2.6并将您当前的工作目录分配给变量M.通常,这将允许make在处理后返回到当前目录Makefile.

  • 不是“处理 Makefile 后”(无论如何都会发生,只需退出),而是“在使用内核 Makefile 时查找源代码”。它是模块构建中从“那里”返回到“这里”的指针。 (2认同)

4pi*_*ie0 17

我有类似的测验

make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
Run Code Online (Sandbox Code Playgroud)

这里的make在我的项目目录中调用.-C是选项:

-C dir, - directory = dir在读取makefile或执行其他操作之前,切换到目录dir.如果指定了多个-C选项,则每个选项都相对于前一个选项进行解释:-C/-C等等于-C/etc.这通常与make的递归调用一起使用.

M不是选项,而是传递给它的参数.由于-C更改了目录,我们知道make将读取该目录中的make文件.通过检查该目录中的make文件,我发现了它将要执行的操作M:

从make文件(名为Makefile)指向的目录-C(btw是内核构建目录):

# 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
Run Code Online (Sandbox Code Playgroud)

来自Linux设备驱动程序的解释,第3版,Jonathan Corbet等:

此命令首先将其目录更改为随-C选项提供的目录(即您的内核源目录).在那里它找到了内核的顶级makefile.在尝试构建模块目标之前,M =选项会使makefile移回模块源目录.


Ker*_* SB 11

阅读手册make:

-C dir, --directory=dir
            Change to directory dir before reading the makefiles or doing anything else.
Run Code Online (Sandbox Code Playgroud)

您的调用将目录更改为~/kernelmake在那里有效地调用,即Makefile从该目录中读取.使用该M变量,makefile知道您的实际项目文件的位置,并可以更改回该位置.

关键是你没有编写自己的makefile,而是使用一个一次性的版本.


小智 5

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

  1. M 不是一个选择
  2. M 是一个变量 Makefile
  3. 所以我们应该读取更改到Makefile的目录中的make -C

阅读 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
Run Code Online (Sandbox Code Playgroud)

您可以搜索KBUILD_EXTMOD

VPATH       := $(srctree)$(if $(KBUILD_EXTMOD),:$(KBUILD_EXTMOD))
module-dirs := $(addprefix _module_,$(KBUILD_EXTMOD))
Run Code Online (Sandbox Code Playgroud)

这就是内核如何Makefile构建您的树外源。


Tim*_*rce 1

在 Unix shell 中,`foobar`在命令中间写入意味着“运行该命令foobar并在此处替换其输出”。

因此,包含M=`pwd`make命令中意味着“运行pwd命令来打印当前工作目录,并将M变量设置为该值”。

  • 我不明白 M= 选项 (3认同)
  • 当“make”构建内核时,在尝试构建“modules”目标之前,它将更改为“M”变量中指定的目录。 (2认同)