Home | History | Annotate | Download | only in core
      1 #
      2 # Copyright (C) 2007 The Android Open Source Project
      3 #
      4 # Licensed under the Apache License, Version 2.0 (the "License");
      5 # you may not use this file except in compliance with the License.
      6 # You may obtain a copy of the License at
      7 #
      8 #      http://www.apache.org/licenses/LICENSE-2.0
      9 #
     10 # Unless required by applicable law or agreed to in writing, software
     11 # distributed under the License is distributed on an "AS IS" BASIS,
     12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13 # See the License for the specific language governing permissions and
     14 # limitations under the License.
     15 #
     16 
     17 #
     18 # Functions for including AndroidProducts.mk files
     19 #
     20 
     21 #
     22 # Returns the list of all AndroidProducts.mk files.
     23 # $(call ) isn't necessary.
     24 #
     25 define _find-android-products-files
     26 $(shell test -d device && find device -maxdepth 6 -name AndroidProducts.mk) \
     27   $(shell test -d vendor && find vendor -maxdepth 6 -name AndroidProducts.mk) \
     28   $(SRC_TARGET_DIR)/product/AndroidProducts.mk
     29 endef
     30 
     31 #
     32 # Returns the sorted concatenation of PRODUCT_MAKEFILES
     33 # variables set in the given AndroidProducts.mk files.
     34 # $(1): the list of AndroidProducts.mk files.
     35 #
     36 define get-product-makefiles
     37 $(sort \
     38   $(foreach f,$(1), \
     39     $(eval PRODUCT_MAKEFILES :=) \
     40     $(eval LOCAL_DIR := $(patsubst %/,%,$(dir $(f)))) \
     41     $(eval include $(f)) \
     42     $(PRODUCT_MAKEFILES) \
     43    ) \
     44   $(eval PRODUCT_MAKEFILES :=) \
     45   $(eval LOCAL_DIR :=) \
     46  )
     47 endef
     48 
     49 #
     50 # Returns the sorted concatenation of all PRODUCT_MAKEFILES
     51 # variables set in all AndroidProducts.mk files.
     52 # $(call ) isn't necessary.
     53 #
     54 define get-all-product-makefiles
     55 $(call get-product-makefiles,$(_find-android-products-files))
     56 endef
     57 
     58 #
     59 # Functions for including product makefiles
     60 #
     61 
     62 _product_var_list := \
     63     PRODUCT_NAME \
     64     PRODUCT_MODEL \
     65     PRODUCT_LOCALES \
     66     PRODUCT_PACKAGES \
     67     PRODUCT_DEVICE \
     68     PRODUCT_MANUFACTURER \
     69     PRODUCT_BRAND \
     70     PRODUCT_PROPERTY_OVERRIDES \
     71     PRODUCT_CHARACTERISTICS \
     72     PRODUCT_COPY_FILES \
     73     PRODUCT_OTA_PUBLIC_KEYS \
     74     PRODUCT_PACKAGE_OVERLAYS \
     75     DEVICE_PACKAGE_OVERLAYS \
     76     PRODUCT_CONTRIBUTORS_FILE \
     77     PRODUCT_TAGS \
     78     PRODUCT_SDK_ADDON_NAME \
     79     PRODUCT_SDK_ADDON_COPY_FILES \
     80     PRODUCT_SDK_ADDON_COPY_MODULES \
     81     PRODUCT_SDK_ADDON_DOC_MODULE \
     82     PRODUCT_DEFAULT_WIFI_CHANNELS
     83 
     84 define dump-product
     85 $(info ==== $(1) ====)\
     86 $(foreach v,$(_product_var_list),\
     87 $(info PRODUCTS.$(1).$(v) := $(PRODUCTS.$(1).$(v))))\
     88 $(info --------)
     89 endef
     90 
     91 define dump-products
     92 $(foreach p,$(PRODUCTS),$(call dump-product,$(p)))
     93 endef
     94 
     95 #
     96 # $(1): product to inherit
     97 #
     98 # Does three things:
     99 #  1. Inherits all of the variables from $1.
    100 #  2. Records the inheritance in the .INHERITS_FROM variable
    101 #  3. Records that we've visited this node, in ALL_PRODUCTS
    102 #
    103 define inherit-product
    104   $(foreach v,$(_product_var_list), \
    105       $(eval $(v) := $($(v)) $(INHERIT_TAG)$(strip $(1)))) \
    106   $(eval inherit_var := \
    107       PRODUCTS.$(strip $(word 1,$(_include_stack))).INHERITS_FROM) \
    108   $(eval $(inherit_var) := $(sort $($(inherit_var)) $(strip $(1)))) \
    109   $(eval inherit_var:=) \
    110   $(eval ALL_PRODUCTS := $(sort $(ALL_PRODUCTS) $(word 1,$(_include_stack))))
    111 endef
    112 
    113 
    114 #
    115 # Do inherit-product only if $(1) exists
    116 #
    117 define inherit-product-if-exists
    118   $(if $(wildcard $(1)),$(call inherit-product,$(1)),)
    119 endef
    120 
    121 #
    122 # $(1): product makefile list
    123 #
    124 #TODO: check to make sure that products have all the necessary vars defined
    125 define import-products
    126 $(call import-nodes,PRODUCTS,$(1),$(_product_var_list))
    127 endef
    128 
    129 
    130 #
    131 # Does various consistency checks on all of the known products.
    132 # Takes no parameters, so $(call ) is not necessary.
    133 #
    134 define check-all-products
    135 $(if ,, \
    136   $(eval _cap_names :=) \
    137   $(foreach p,$(PRODUCTS), \
    138     $(eval pn := $(strip $(PRODUCTS.$(p).PRODUCT_NAME))) \
    139     $(if $(pn),,$(error $(p): PRODUCT_NAME must be defined.)) \
    140     $(if $(filter $(pn),$(_cap_names)), \
    141       $(error $(p): PRODUCT_NAME must be unique; "$(pn)" already used by $(strip \
    142           $(foreach \
    143             pp,$(PRODUCTS),
    144               $(if $(filter $(pn),$(PRODUCTS.$(pp).PRODUCT_NAME)), \
    145                 $(pp) \
    146                ))) \
    147        ) \
    148      ) \
    149     $(eval _cap_names += $(pn)) \
    150     $(if $(call is-c-identifier,$(pn)),, \
    151       $(error $(p): PRODUCT_NAME must be a valid C identifier, not "$(pn)") \
    152      ) \
    153     $(eval pb := $(strip $(PRODUCTS.$(p).PRODUCT_BRAND))) \
    154     $(if $(pb),,$(error $(p): PRODUCT_BRAND must be defined.)) \
    155     $(foreach cf,$(strip $(PRODUCTS.$(p).PRODUCT_COPY_FILES)), \
    156       $(if $(filter 2,$(words $(subst :,$(space),$(cf)))),, \
    157         $(error $(p): malformed COPY_FILE "$(cf)") \
    158        ) \
    159      ) \
    160    ) \
    161 )
    162 endef
    163 
    164 
    165 #
    166 # Returns the product makefile path for the product with the provided name
    167 #
    168 # $(1): short product name like "generic"
    169 #
    170 define _resolve-short-product-name
    171   $(eval pn := $(strip $(1)))
    172   $(eval p := \
    173       $(foreach p,$(PRODUCTS), \
    174           $(if $(filter $(pn),$(PRODUCTS.$(p).PRODUCT_NAME)), \
    175             $(p) \
    176        )) \
    177    )
    178   $(eval p := $(sort $(p)))
    179   $(if $(filter 1,$(words $(p))), \
    180     $(p), \
    181     $(if $(filter 0,$(words $(p))), \
    182       $(error No matches for product "$(pn)"), \
    183       $(error Product "$(pn)" ambiguous: matches $(p)) \
    184     ) \
    185   )
    186 endef
    187 define resolve-short-product-name
    188 $(strip $(call _resolve-short-product-name,$(1)))
    189 endef
    190