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

时间:2017-05-01 11:45:41

标签: makefile openwrt

我想知道如果Makefile中有2个具有相同名称的目标会发生什么:

根据This question,有两个具有相同名称的目标会引发警告。

但是,我不明白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的定义。

通过查看Download中函数include/download.mk的定义:

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会扩展函数,那么它是如何工作的呢?

1 个答案:

答案 0 :(得分:3)

如果在没有配方的情况下指定目标,则只需向目标添加依赖项。您可以根据需要使用其中的许多内容。所以以下内容是有效的:

foo: dep1 dep2

foo: dep3
    recipe1

在这种情况下,如果重建dep1,dep2或dep3,则运行recipe1。但这不是:

foo:
    recipe1

foo:
    recipe2

此时make不知道要运行哪个配方,和/或以哪个顺序,所以Make抱怨。 (请注意,pattern rules可以有多个定义,在这种情况下,make会选择匹配的第一个,但静态规则不允许这样做。