1

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

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

但是当我尝试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 有什么特别之处吗?

4

1 回答 1

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 将保持未设置。

约翰

于 2013-01-22T15:59:47.570 回答