summaryrefslogtreecommitdiffstats
path: root/core/product.mk
diff options
context:
space:
mode:
Diffstat (limited to 'core/product.mk')
-rw-r--r--core/product.mk157
1 files changed, 157 insertions, 0 deletions
diff --git a/core/product.mk b/core/product.mk
new file mode 100644
index 0000000..0d943cc
--- /dev/null
+++ b/core/product.mk
@@ -0,0 +1,157 @@
+#
+# Copyright (C) 2007 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+#
+# Functions for including AndroidProducts.mk files
+#
+
+#
+# Returns the list of all AndroidProducts.mk files.
+# $(call ) isn't necessary.
+#
+define _find-android-products-files
+$(foreach vendor,$(wildcard vendor/*), \
+ $(if $(wildcard $(vendor)/AndroidProducts.mk), \
+ $(vendor)/AndroidProducts.mk \
+ , \
+ $(wildcard $(vendor)/*/AndroidProducts.mk) \
+ ) \
+ ) \
+ $(wildcard $(SRC_TARGET_DIR)/product/AndroidProducts.mk)
+endef
+
+#
+# Returns the sorted concatenation of all PRODUCT_MAKEFILES
+# variables set in all AndroidProducts.mk files.
+# $(call ) isn't necessary.
+#
+define get-all-product-makefiles
+$(sort \
+ $(foreach f,$(_find-android-products-files), \
+ $(eval PRODUCT_MAKEFILES :=) \
+ $(eval LOCAL_DIR := $(patsubst %/,%,$(dir $(f)))) \
+ $(eval include $(f)) \
+ $(PRODUCT_MAKEFILES) \
+ ) \
+ $(eval PRODUCT_MAKEFILES :=) \
+ $(eval LOCAL_DIR :=) \
+ )
+endef
+
+#
+# Functions for including product makefiles
+#
+
+_product_var_list := \
+ PRODUCT_NAME \
+ PRODUCT_MODEL \
+ PRODUCT_LOCALES \
+ PRODUCT_PACKAGES \
+ PRODUCT_DEVICE \
+ PRODUCT_MANUFACTURER \
+ PRODUCT_BRAND \
+ PRODUCT_PROPERTY_OVERRIDES \
+ PRODUCT_COPY_FILES \
+ PRODUCT_OTA_PUBLIC_KEYS
+
+define dump-product
+$(info ==== $(1) ====)\
+$(foreach v,$(_product_var_list),\
+$(info PRODUCTS.$(1).$(v) := $(PRODUCTS.$(1).$(v))))\
+$(info --------)
+endef
+
+define dump-products
+$(foreach p,$(PRODUCTS),$(call dump-product,$(p)))
+endef
+
+#
+# $(1): product to inherit
+#
+define inherit-product
+ $(foreach v,$(_product_var_list), \
+ $(eval $(v) := $($(v)) $(INHERIT_TAG)$(strip $(1))))
+endef
+
+#
+# $(1): product makefile list
+#
+#TODO: check to make sure that products have all the necessary vars defined
+define import-products
+$(call import-nodes,PRODUCTS,$(1),$(_product_var_list))
+endef
+
+
+#
+# Does various consistency checks on all of the known products.
+# Takes no parameters, so $(call ) is not necessary.
+#
+define check-all-products
+$(if ,, \
+ $(eval _cap_names :=) \
+ $(foreach p,$(PRODUCTS), \
+ $(eval pn := $(strip $(PRODUCTS.$(p).PRODUCT_NAME))) \
+ $(if $(pn),,$(error $(p): PRODUCT_NAME must be defined.)) \
+ $(if $(filter $(pn),$(_cap_names)), \
+ $(error $(p): PRODUCT_NAME must be unique; "$(pn)" already used by $(strip \
+ $(foreach \
+ pp,$(PRODUCTS),
+ $(if $(filter $(pn),$(PRODUCTS.$(pp).PRODUCT_NAME)), \
+ $(pp) \
+ ))) \
+ ) \
+ ) \
+ $(eval _cap_names += $(pn)) \
+ $(if $(call is-c-identifier,$(pn)),, \
+ $(error $(p): PRODUCT_NAME must be a valid C identifier, not "$(pn)") \
+ ) \
+ $(eval pb := $(strip $(PRODUCTS.$(p).PRODUCT_BRAND))) \
+ $(if $(pb),,$(error $(p): PRODUCT_BRAND must be defined.)) \
+ $(foreach cf,$(strip $(PRODUCTS.$(p).PRODUCT_COPY_FILES)), \
+ $(if $(filter 2,$(words $(subst :,$(space),$(cf)))),, \
+ $(error $(p): malformed COPY_FILE "$(cf)") \
+ ) \
+ ) \
+ ) \
+)
+endef
+
+
+#
+# Returns the product makefile path for the product with the provided name
+#
+# $(1): short product name like "generic"
+#
+define _resolve-short-product-name
+ $(eval pn := $(strip $(1)))
+ $(eval p := \
+ $(foreach p,$(PRODUCTS), \
+ $(if $(filter $(pn),$(PRODUCTS.$(p).PRODUCT_NAME)), \
+ $(p) \
+ )) \
+ )
+ $(eval p := $(sort $(p)))
+ $(if $(filter 1,$(words $(p))), \
+ $(p), \
+ $(if $(filter 0,$(words $(p))), \
+ $(error No matches for product "$(pn)"), \
+ $(error Product "$(pn)" ambiguous: matches $(p)) \
+ ) \
+ )
+endef
+define resolve-short-product-name
+$(strip $(call _resolve-short-product-name,$(1)))
+endef