AOSP makefile中`call inherit-product`和`include`的区别是什么?

17

我正在查看Android开源项目的Makefile,并且看到似乎有两种不同的方法来包含另一个Makefile。例如,master/build/target/product/aosp_arm64.mk文件中有以下这些行:

PRODUCT_COPY_FILES += frameworks/native/data/etc/android.hardware.ethernet.xml:system/etc/permissions/android.hardware.ethernet.xml

$(call inherit-product, $(SRC_TARGET_DIR)/product/core_64_bit.mk)
$(call inherit-product, $(SRC_TARGET_DIR)/product/aosp_base_telephony.mk)
$(call inherit-product, $(SRC_TARGET_DIR)/board/generic_arm64/device.mk)

include $(SRC_TARGET_DIR)/product/emulator.mk

PRODUCT_NAME := aosp_arm64
PRODUCT_DEVICE := generic_arm64
PRODUCT_BRAND := Android
PRODUCT_MODEL := AOSP on ARM arm64 Emulator

$(call inherit-product ...)include ... 之间的区别是什么?


$(call inherit-product, $(SRC_TARGET_DIR)/product/core_64_bit.mk) 不是包含另一个makefile的方法。它是调用用户定义的make函数(https://www.gnu.org/software/make/manual/html_node/Call-Function.html)`inherit-product`,并带有参数`$(SRC_TARGET_DIR)/product/core_64_bit.mk`。要了解该函数的作用,您需要搜索其定义。 - Mike Kinghan
2个回答

13

include 只是包含文件而已。而 inherit-product 除了包含文件之外,还有三个附加功能,具体请参考下面链接中的文件:

  1. 继承 $1 中的所有变量。
  2. 在 .INHERITS_FROM 变量中记录继承关系。
  3. 在 ALL_PRODUCTS 中记录访问该节点的信息。

详见该文件第 113 行:core/product.mk


也许只需要直接链接到提到的行:https://android.googlesource.com/platform/build/+/157a5e1/core/product.mk#113 - tellob

5
假设你在 A.mk 中有 PRODUCT_VAR := a,在 B.mk 中有 PRODUCT_VAR := b
如果在 A.mk 中包含 B.mk,最后会得到 PRODUCT_VAR := b
但是如果在 A.mk 中使用 inherit-product 来继承 B.mk,你最终会得到 PRODUCT_VAR := a b
inherit-product 会确保不会重复包含一个 Makefile,因为它会 "记录我们已经访问过该节点,在 ALL_PRODUCTS 中"。

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