【问题标题】:.PHONY in linux makefile.PHONY 在 linux makefile
【发布时间】:2012-10-25 08:17:12
【问题描述】:
SUBDIRS = foo bar baz

.PHONY: dirs $(SUBDIRS)

dirs: $(SUBDIRS)

$(SUBDIRS):

@echo $@

@ls $@

谁能帮我理解这个make-file? 如果可能的话,向我解释每条语句(我们为什么需要它?目的是什么?等等)

这个 make-file 究竟是如何工作的?

【问题讨论】:

    标签: makefile gnu gnu-make


    【解决方案1】:

    它的格式错误,所以我只能猜测它之前是什么......嗯,原来是这样:

    第一行将列表“foo bar baz”分配给名为 SUBDIRS 的变量

    第二行是使所有指定目标“语音”的特殊命令-您可以调用“make dirs”或“make foo”,它会找到具有该名称的目标并执行它,但它不是具有该名称的实际文件(就像通常的非虚假目标一样)

    第三个 - 创建名为 'dirs' 的目标,这取决于 SUBDIRS 变量的值。空格分隔的列表。这个目标没有实际行动

    第四行为 SUBRIDS 变量内容创建规则,没有依赖关系。文本的其余部分是必须执行以“制作”此目标的操作(因此,在您的情况下 - 如果您只调用“make”,它将调用“make dirs”(因为它是第一个目标),这取决于foo、bar 和 baz - 因此将调用这些目标。要执行这些目标中的每一个,make 将调用 echo 和 ls - 所以最终您将获得这三个目录名称和它们的文件列表)

    【讨论】:

    • SUBDIRS = foo bar baz .PHONY: dirs $(SUBDIRS) $(SUBDIRS): echo $@ ls $@ 如果我使用这个 makefile 为什么它只打印 foo 目录的列表?
    • SUBDIRS = foo bar baz .PHONY: $(SUBDIRS) $(SUBDIRS): echo $@ ls $@ 如果我使用这个 makefile 为什么它只打印 foo 目录的列表?
    • 因为 foo 是第一个目标,并且您没有在 makefile 中指定 'all' 目标(IIRS 'make' 等同于 'make all')。删除你的一个 cmets,顺便说一句,它看起来很奇怪。
    • 按照惯例,all 通常是第一个目标,因此是默认目标。