gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:25:02 25 4
gpt4 key购买 nike

内核 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有什么特别之处吗?

最佳答案

内核制作过程比大多数制作过程要复杂一些。主内核 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 将保持未设置状态。

约翰

关于linux - 为什么 linux 内核的 Makefile 中的变量不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14371764/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com