2

我正在尝试修改 AOSP 构建系统以在“make dist”之后运行脚本

我有代码可以做我想做的事......但我并不真正理解它,并且希望得到解释和正在发生的事情。我正在查看的文件是:

https://android.googlesource.com/platform/build.git/+/master/core/distdir.mk

.PHONY: dist
dist: ;

dist_goal := $(strip $(filter dist,$(MAKECMDGOALS)))
MAKECMDGOALS := $(strip $(filter-out dist,$(MAKECMDGOALS)))
ifeq (,$(strip $(filter-out $(INTERNAL_MODIFIER_TARGETS),$(MAKECMDGOALS))))
# The commandline was something like "make dist" or "make dist showcommands".
# Add a dependency on a real target.
dist: $(DEFAULT_GOAL)
endif

令我困惑的部分是 dist 有两个定义:但没有警告。如果我对第二个 dist: 目标有一个配方,它将生成有关重新定义 dist 的警告。第二个目标的意义何在?

4

1 回答 1

2
dist: ;

只是说,“更新dist目标,什么都不做”。如果没有这个,如果第二部分不存在,Make 将不知道如何制作dist。(事实上​​,这里的“空配方”;并不是真正需要的——它只在特定情况下需要,这不是其中之一——没有它,你仍然会在这里“无所事事”)

如果存在第二部分:

dist: $(DEFAULT_GOAL)

这意味着,“更新dist目标,更新$(DEFAULT_GOAL)

如果这两个部分都存在,我们更新$(DEFAULT_GOAL),然后什么也不做。

通常,您可以为具有配方的目标制定一个明确的规则(这里,配方只是;),然后您可以有其他没有配方的规则,它们只是建立额外的依赖关系,因为它们被记录了。执行哪个配方并且 Make 是满意的没有歧义。

于 2013-10-22T02:07:08.813 回答