【发布时间】:2012-10-25 08:17:12
【问题描述】:
SUBDIRS = foo bar baz
.PHONY: dirs $(SUBDIRS)
dirs: $(SUBDIRS)
$(SUBDIRS):
@echo $@
@ls $@
谁能帮我理解这个make-file? 如果可能的话,向我解释每条语句(我们为什么需要它?目的是什么?等等)
这个 make-file 究竟是如何工作的?
【问题讨论】:
SUBDIRS = foo bar baz
.PHONY: dirs $(SUBDIRS)
dirs: $(SUBDIRS)
$(SUBDIRS):
@echo $@
@ls $@
谁能帮我理解这个make-file? 如果可能的话,向我解释每条语句(我们为什么需要它?目的是什么?等等)
这个 make-file 究竟是如何工作的?
【问题讨论】:
它的格式错误,所以我只能猜测它之前是什么......嗯,原来是这样:
第一行将列表“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 目录的列表?
all 通常是第一个目标,因此是默认目标。