【发布时间】:2013-12-16 14:02:02
【问题描述】:
make -C ~/kernel-2.6 M=`pwd` modules
上面一行中的M='pwd'是什么意思?
我无法理解解释:
M= 选项使 makefile 移回您的模块源 尝试构建模块目标之前的目录。
你能说得更清楚吗?
【问题讨论】:
标签: c linux makefile linux-kernel linux-device-driver
make -C ~/kernel-2.6 M=`pwd` modules
上面一行中的M='pwd'是什么意思?
我无法理解解释:
M= 选项使 makefile 移回您的模块源 尝试构建模块目标之前的目录。
你能说得更清楚吗?
【问题讨论】:
标签: c linux makefile linux-kernel linux-device-driver
在 Unix shell 中,在命令中间写入 `foobar` 意味着“运行命令 foobar 并在此处替换其输出。”
因此在make 命令中包含M=`pwd` 意味着“运行pwd 命令以打印当前工作目录,并将M 变量设置为该值。”
【讨论】:
make 构建内核时,在它尝试构建modules 目标之前,它将更改为M 变量中命名的目录。
阅读make的手册:
-C dir, --directory=dir
Change to directory dir before reading the makefiles or doing anything else.
您的调用将目录更改为~/kernel 并有效地调用make,即从该目录读取Makefile。使用 M 变量,makefile 知道您的实际项目文件在哪里,并且可以更改回该位置。
关键是您不编写自己的 makefile,而是使用一个单一的、一次性的版本。
【讨论】:
M 不是make 的选项。请注意,它缺少连字符。 M 是分配给make 执行的变量。如果make 执行Makefile 脚本,则该脚本可以读取变量M 并使用其内容。
在您提供的示例中,make 将读取~/kernel-2.6 中的Makefile,并将您当前的工作目录分配给变量M。通常,这将允许make 在处理完Makefile 后返回到您的当前目录。
【讨论】:
我有类似的测验
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
这里 make 在我的项目目录中被调用。 -C 是 make 选项:
-C 目录,--目录=目录 在读取 makefile 或执行任何其他操作之前更改到目录 dir。如果 指定了多个 -C 选项,每个选项都相对于前一个进行解释 一:-C / -C etc等价于-C /etc。这通常与递归一起使用 make 的调用。
M 不是 make 选项,而是传递给它的参数。由于-C 更改了make 目录,我们知道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 Device Drivers,第 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:cmets 很少:
# 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 可以构建您的树外源代码的方式。
【讨论】: