为什么linux内核的Makefile中的变量不起作用?

时间:2013-01-17 03:26:01

标签: linux makefile kernel

内核Makefile在任何目标的make进程之外初始化KBUILD_OUTPUT之类的变量。代码是这样的:

ifeq ("$(origin O)", "command line")
  KBUILD_OUTPUT := $(O)
endif

但是当我尝试在目标的make过程中输出KBUILD_OUTPUT时,例如目标help,我发现它没有被定义。我修改的代码是这样的:

help:
    @echo 'KBUILD_OUTPUT: ${KBUILD_OUTPUT}'

当我执行make O=../build help时,KBUILD_OUTPUT变量为空。我想知道它什么时候会启动?

非常感谢。

更新

然而,当我用这个写一个Makefile:

ifeq ("$(origin O)", "command line")
  KBUILD_OUTPUT := $(O)
endif

help:
    @echo 'KBUILD_OUTPUT: ${KBUILD_OUTPUT}'

然后我运行make O=../build help,我会看到KBUILD_OUTPUT: ../build

内核的Makefile有什么特别之处吗?

1 个答案:

答案 0 :(得分:2)

内核制作过程比大多数制作过程要复杂一些。主内核makefile将递归调用自身(也就是说,它调用make将自己指定为makefile,但是给出不同的目标集)。因此,主内核Makefile的大部分都有它们周围的条件,一些部分意味着在首次调用Make时执行,而另一些部分意味着在makefile被调用为它自己的子元素时执行。您引用的代码实际上是:

ifeq ($(KBUILD_SRC),)

# OK, Make called in directory where kernel src resides
# Do we want to locate output files in a separate directory?
ifeq ("$(origin O)", "command line")
  KBUILD_OUTPUT := $(O)
endif

当您创建帮助目标时,Makefile将仅运行该规则,因此不会递归调用自身,因此,KBUILD_SRC将不会被设置,因此KBUILD_OUTPUT将保持未设置状态。

约翰