【问题标题】:.PHONY in linux kernel MakefileLinux内核Makefile中的.PHONY
【发布时间】:2021-03-13 15:59:09
【问题描述】:

我从Linux内核学习Makefile。在文件/scripts/Makefile.build中,它以

PHONY := __build
__build:
#Init all relevant variables
obj-y :=
obj-m :=
lib-y :=
...

在第二行,__build 没有依赖关系。在文件的后半部分,__build 有这样的依赖关系:

__build: $(if $(KBUILD_BUILTIN),$(builtin-target) $(lib-target) $(extra-y)) \
     $(if $(KBUILD_MODULES),$(obj-m) $(modorder-target)) \
     $(subdir-ym) $(always)
    @:

看起来毫无意义的第二行是什么意思?固定格式?

【问题讨论】:

  • make 规则中,target: prerequisites 行之后的制表符缩进行(总是一个逻辑行,可能在您的示例中使用行继续)是 命令行当需要构建目标时,将其传递给 shell 以执行。命令行开头的@ 表示不回显它,而在“标准”(Bourne-family 和 POSIX)shell 中,: 是一个不执行任何操作的特殊命令。因此这条规则说不做任何事情来构建目标__build

标签: linux makefile gnu-make


【解决方案1】:

一种可能性是 make 总是构建它在 makefile 中找到的第一个显式目标,除非您在命令行上请求不同的目标。

__build 目标的这条语句放在makefile 的顶部可能是为了确保如果您在没有其他参数的情况下运行make,它将尝试构建__build 目标,而不管什么其他目标可能在下面__build 的“真实”定义之前定义。

【讨论】: