AOSP makefile中`call inherit-product`和`include`之间的区别?

Wei*_*ena 7 gnu-make android-source

我正在浏览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
Run Code Online (Sandbox Code Playgroud)

$(call inherit-product ...)线和include ...线之间有什么区别?

Oll*_*lle 6

include仅包含文件。inherit-product这样做,还有另外三件事要在下面的链接中提交:

  1. 从$ 1继承所有变量。
  2. 在.INHERITS_FROM变量中记录继承
  3. 我们在ALL_PRODUCTS中访问此节点的记录

请参阅此文件中的第113行以获取详细信息core / product.mk


小智 5

假设您PRODUCT_VAR := a在 A.mk 和PRODUCT_VAR := bB.mk 中都有。

如果你把B.mk包含在A.mk中,你就会得到PRODUCT_VAR := b最后的结果。

但如果你inherit-product在 A.mk 中 B.mk,你会得到PRODUCT_VAR := a b.

inherit-product确保您不会两次包含 makefile,因为它Records that we've visited this node, in ALL_PRODUCTS