【问题标题】:M option in make command, Makefilemake 命令中的 M 选项,Makefile
【发布时间】: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


    【解决方案1】:

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

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

    【讨论】:

    • 我不明白 M= 选项
    • make 构建内核时,在它尝试构建modules 目标之前,它将更改为M 变量中命名的目录。
    【解决方案2】:

    阅读make的手册:

    -C dir, --directory=dir
                Change to directory dir before reading the makefiles or doing anything else.
    

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

    关键是您不编写自己的 makefile,而是使用一个单一的、一次性的版本。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

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

      我有类似的测验

      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 在尝试构建之前移回您的模块源目录 模块目标。

      【讨论】:

        【解决方案5】:

        构建外部模块的命令是:

            $ make -C <path_to_kernel_src> M=$PWD
        

        由于命令中给出的“M=”选项,kbuild 系统知道正在构建外部模块。

        要针对正在运行的内核进行构建,请使用:

            $ make -C /lib/modules/`uname -r`/build M=$PWD
        

        【讨论】:

          【解决方案6】:

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

          1. M 不是一个选项
          2. MMakefile 中的一个变量
          3. 所以我们应该读取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 可以构建您的树外源代码的方式。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-03-19
            • 1970-01-01
            • 1970-01-01
            • 2023-04-03
            • 2021-02-08
            • 2021-04-25
            • 1970-01-01
            相关资源
            最近更新 更多