我想知道如果 Makefile 中有 2 个具有相同名称的目标会发生什么:
根据This question,有 2 个具有相同名称的目标会引发警告。
但是,我不明白 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)
)
Run Code Online (Sandbox Code Playgroud)
注意这里Download第 3 行中的函数调用和download第 6 行中目标的定义。
由于具有看看函数的定义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)
Run Code Online (Sandbox Code Playgroud)
我看到download目标被重新定义。我所知道的是使用call会扩展功能,那么这如何工作?
如果在没有配方的情况下指定目标,则只是向目标添加依赖项。您可以根据需要使用任意数量的这些。所以以下是有效的:
foo: dep1 dep2
foo: dep3
recipe1
Run Code Online (Sandbox Code Playgroud)
在这种情况下,如果重新构建了 dep1、dep2 或 dep3,则运行 recipe1。但这不是:
foo:
recipe1
foo:
recipe2
Run Code Online (Sandbox Code Playgroud)
此时 make 不知道要运行哪个配方,和/或以哪个顺序运行,所以 Make 抱怨。(请注意,您可以对模式规则有多个定义,在这种情况下,make 会选择第一个匹配的定义,但静态规则不允许这样做)