make命令中的M选项,Makefile

时间:2013-11-30 14:49:06

标签: c linux makefile linux-kernel linux-device-driver

make -C ~/kernel-2.6 M=`pwd` modules

上面一行中M ='pwd'的含义是什么?

我无法理解这个解释:

  

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

你能说得更清楚吗?

6 个答案:

答案 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)

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

  1. M不是一个选项
  2. MMakefile
  3. 中的变量
  4. 所以我们应该阅读Makefile更改为的目录中的make -C
  5. 阅读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>