内核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有什么特别之处吗?
答案 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将保持未设置状态。
约翰