1. 程式人生 > >Android Makefile中inherit-product函式簡介,以及與include的區別

Android Makefile中inherit-product函式簡介,以及與include的區別

    在 Android Makefile 中時不時會看見 inherit-product 函式的使用,類似下方這樣:

        $(call  inherit-product,  vendor/dolby/ds/dolby-product.mk)

    從引數來看,我們可以猜到這條命令的作用應該是執行了 vendor/dolby/ds/dolby-product.mk 檔案。如果僅僅是這樣,那麼 inherit-product 和 include 的區別又是什麼呢?

    要回答上面的問題,需要看一下 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
    從註釋中可以看到,inherit-product 函式除了會執行通過其引數傳入的 Makefile 檔案之外,還會額外做 3 件事:

    1、繼承通過引數傳入的 Makefile 檔案中的所有變數;

    2、在 .INHERITS_FROM 變數中記錄下這些繼承關係;

    3、在 ALL_PRODUCTS 變數中標識出當前操作的 Makefile 檔案已經被訪問過了(以免重複訪問)。

    而 include 則只會執行 Makefile 檔案,不會進行上方所述的 3 個操作。

【擴充套件閱讀】