在Makefile中有相同名称的两个目标

5
我想知道如果Makefile中有两个同名目标会发生什么情况:
根据这个问题的回答,有两个同名目标会产生警告。
然而,我不明白openwrt中的这个Makefile是如何工作的:
include/package.mk文件中:
define Build/DefaultTargets
$(if $(QUILT),$(Build/Quilt))
$(if $(USE_SOURCE_DIR)$(USE_GIT_TREE),,$(if $(strip $(PKG_SOURCE_URL)),$(call Download,default)))
$(call Build/Autoclean)

download:
    $(foreach hook,$(Hooks/Download),
    $(call $(hook))$(sep)
)

请注意第3行对Download函数的调用以及第6行对目标download的定义。
通过查看include/download.mkDownload函数的定义:
define Download
  $(eval $(Download/Defaults))
  $(eval $(Download/$(1)))
  $(foreach FIELD,URL FILE $(Validate/$(call dl_method,$(URL),$(PROTO))),
  ifeq ($($(FIELD)),)
    $$(error Download/$(1) is missing the $(FIELD) field.)
  endif
)

$(foreach dep,$(DOWNLOAD_RDEP),
$(dep): $(DL_DIR)/$(FILE)
)
download: $(DL_DIR)/$(FILE)

我看到 download 目标被重新定义了。 我知道使用 call 会扩展函数,那么这个怎么能行?

https://www.gnu.org/software/make/manual/html_node/Multiple-Rules.html#Multiple-Rules - user657267
1个回答

11
如果指定目标而没有配方,那么它只是将依赖项添加到目标中。您可以随意添加任意数量的这些依赖项。因此,以下内容是有效的:
foo: dep1 dep2

foo: dep3
    recipe1

如果 dep1、dep2 或 dep3 重新构建,则运行 recipe1。但这并不是:

foo:
    recipe1

foo:
    recipe2

此时Make无法确定要运行哪个配方,或以何种顺序运行,因此Make会抱怨。(请注意,您可以为模式规则定义多个定义,此时Make会选择第一个匹配的规则,但静态规则不允许这样做)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接