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

时间:2016-03-30 22:44:15

标签: 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

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

2 个答案:

答案 0 :(得分:4)

include只包含该文件。 inherit-product会做到这一点以及下面链接中提到的另外三件事:

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

    有关详细信息core/product.mk

    ,请参阅此文件中的第113行

答案 1 :(得分:0)

假设您在A.mk中有PRODUCT_VAR := a,在B.mk中有PRODUCT_VAR := b

如果将B.mk包含在A.mk中,则最终将得到PRODUCT_VAR := b

但是如果您在A.mk中inherit-product B.mk,您将获得PRODUCT_VAR := a b

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