我想知道如果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
会扩展函数,那么它是如何工作的呢?
答案 0 :(得分:3)
如果在没有配方的情况下指定目标,则只需向目标添加依赖项。您可以根据需要使用其中的许多内容。所以以下内容是有效的:
foo: dep1 dep2
foo: dep3
recipe1
在这种情况下,如果重建dep1,dep2或dep3,则运行recipe1。但这不是:
foo:
recipe1
foo:
recipe2
此时make不知道要运行哪个配方,和/或以哪个顺序,所以Make抱怨。 (请注意,pattern rules可以有多个定义,在这种情况下,make会选择匹配的第一个,但静态规则不允许这样做。