make -C ~/kernel-2.6 M=`pwd` modules
上面一行中M ='pwd'的含义是什么?
我无法理解这个解释:
M =选项会使makefile移回模块源 在尝试构建模块目标之前的目录。
你能说得更清楚吗?
答案 0 :(得分:16)
M
不是make
的选项。注意它缺少连字符。 M
是分配给make
执行的变量。如果make
执行Makefile
脚本,则此脚本可以读取变量M
并使用其内容。
在您提供的示例中,make
会在Makefile
中阅读~/kernel-2.6
,并将您当前的工作目录分配给变量M
。通常,这将允许make
在处理Makefile
后返回当前目录。
答案 1 :(得分:14)
我有与
类似的测验make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
这里的make在我的项目目录中被调用。 -C
是make选项:
-C dir, - directory = dir 在读取makefile或执行任何其他操作之前,请切换到目录dir。如果 指定了多个-C选项,每个选项都相对于前一个进行解释 一:-C / -C等等于-C /等。这通常与递归一起使用 调用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设备驱动程序的解释,第3版,Jonathan Corbet等人:
此命令首先将其目录更改为随附的目录 -C选项(即您的内核源目录)。它找到了 内核的顶级makefile。 M =选项导致makefile为 在尝试构建之前,请回到模块源目录 模块目标。
答案 2 :(得分:9)
阅读make
的手册:
-C dir, --directory=dir
Change to directory dir before reading the makefiles or doing anything else.
您的调用会将目录更改为~/kernel
并在那里有效地调用make
,即从该目录中读取Makefile
。使用M
变量,makefile知道您的实际项目文件的位置,并可以更改回该位置。
关键是你没有编写自己的makefile,而是使用一个一次性的版本。
答案 3 :(得分:3)
其他答案大多是正确的,但我想告诉你学习它的方法。
M
不是一个选项M
是Makefile
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
您可以搜索KBUILD_EXTMOD
:
VPATH := $(srctree)$(if $(KBUILD_EXTMOD),:$(KBUILD_EXTMOD))
module-dirs := $(addprefix _module_,$(KBUILD_EXTMOD))
内核的Makefile
如何构建您的树外资源。
答案 4 :(得分:1)
构建外部模块的命令是:
$ make -C <path_to_kernel_src> M=$PWD
由于命令中给出“M =”选项,kbuild系统知道正在构建外部模块。
要针对正在运行的内核使用构建:
$ make -C /lib/modules/`uname -r`/build M=$PWD
答案 5 :(得分:0)
在Unix shell中,在命令中间编写`foobar`
意味着“运行命令foobar
并在此处替换其输出。”
因此在M=`pwd`
命令中包含make
意味着“运行pwd
命令以打印当前工作目录,并将M
变量设置为该值。”< / p>