在 Android Makefile中inherit-product函数和include都是执行某个文件。
include 使用:
include device/mediatek/mt2712/device.mk
inherit-product 函数
使用方法:
$(call inherit-product, device/mediatek/mt2712/device.mk)
或者
$(call inherit-product-if-exists, device/mediatek/mt2712/device.mk)
inherit-product-if-exists先判断文件是否存在。
inherit-product 函数的定义位于 build/core/product.mk 文件中,如下:
#
# $(1): product to inherit
#
# Does three things:
# 1. Inherits all of the variables from $1.
# 2. Records the inheritance in the .INHERITS_FROM variable
# 3. Records that we've visited this node, in ALL_PRODUCTS
#
define inherit-product
$(if $(findstring ../,$(1)),\
$(eval np := $(call normalize-paths,$(1))),\
$(eval np := $(strip $(1))))\
$(foreach v,$(_product_var_list), \
$(eval $(v) := $($(v)) $(INHERIT_TAG)$(np))) \
$(eval inherit_var := \
PRODUCTS.$(strip $(word 1,$(_include_stack))).INHERITS_FROM) \
$(eval $(inherit_var) := $(sort $($(inherit_var)) $(np))) \
$(eval inherit_var:=) \
$(eval ALL_PRODUCTS := $(sort $(ALL_PRODUCTS) $(word 1,$(_include_stack))))
endef
#
# Do inherit-product only if $(1) exists
#
define inherit-product-if-exists
$(if $(wildcard $(1)),$(call inherit-product,$(1)),)
endef
从注释中可以看到,inherit-product 函数除了会执行通过其参数传入的 Makefile 文件之外,还会额外做 3 件事:
1、继承通过参数传入的 Makefile 文件中的所有变量;
2、在 .INHERITS_FROM 变量中记录下这些继承关系;
3、在 ALL_PRODUCTS 变量中标识出当前操作的 Makefile 文件已经被访问过了(以免重复访问)。
而 include 则只会执行 Makefile 文件,不会进行上方所述的 3 个操作。