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 # PRODUCT_MAKEFILES is set up in AndroidProducts.mks.
     20 # Format of PRODUCT_MAKEFILES:
     21 # <product_name>:<path_to_the_product_makefile>
     22 # If the <product_name> is the same as the base file name (without dir
     23 # and the .mk suffix) of the product makefile, "<product_name>:" can be
     24 # omitted.
     25 
     26 #
     27 # Returns the list of all AndroidProducts.mk files.
     28 # $(call ) isn't necessary.
     29 #
     30 define _find-android-products-files
     31 $(file <$(OUT_DIR)/.module_paths/AndroidProducts.mk.list) \
     32   $(SRC_TARGET_DIR)/product/AndroidProducts.mk
     33 endef
     34 
     35 #
     36 # For entries returned by get-product-makefiles, decode an entry to a short
     37 # product name. These either may be in the form of <name>:path/to/file.mk or
     38 # path/to/<name>.mk
     39 # $(1): The entry to decode
     40 #
     41 # Returns two words:
     42 #   <name> <file>
     43 #
     44 define _decode-product-name
     45 $(strip \
     46   $(eval _cpm_words := $(subst :,$(space),$(1))) \
     47   $(if $(word 2,$(_cpm_words)), \
     48     $(wordlist 1,2,$(_cpm_words)), \
     49     $(basename $(notdir $(1))) $(1)))
     50 endef
     51 
     52 #
     53 # Validates the new common lunch choices -- ensures that they're in an
     54 # appropriate form, and are paired with definitions of their products.
     55 # $(1): The new list of COMMON_LUNCH_CHOICES
     56 # $(2): The new list of PRODUCT_MAKEFILES
     57 #
     58 define _validate-common-lunch-choices
     59 $(strip $(foreach choice,$(1),\
     60   $(eval _parts := $(subst -,$(space),$(choice))) \
     61   $(if $(call math_lt,$(words $(_parts)),2), \
     62     $(error $(LOCAL_DIR): $(choice): Invalid lunch choice)) \
     63   $(if $(call math_gt_or_eq,$(words $(_parts)),4), \
     64     $(error $(LOCAL_DIR): $(choice): Invalid lunch choice)) \
     65   $(if $(filter-out eng userdebug user,$(word 2,$(_parts))), \
     66     $(error $(LOCAL_DIR): $(choice): Invalid variant: $(word 2,$(_parts)))) \
     67   $(if $(filter-out $(foreach p,$(2),$(call _decode-product-name,$(p))),$(word 1,$(_parts))), \
     68     $(error $(LOCAL_DIR): $(word 1,$(_parts)): Product not defined in this file)) \
     69   ))
     70 endef
     71 
     72 #
     73 # Returns the sorted concatenation of PRODUCT_MAKEFILES
     74 # variables set in the given AndroidProducts.mk files.
     75 # $(1): the list of AndroidProducts.mk files.
     76 #
     77 # As a side-effect, COMMON_LUNCH_CHOICES will be set to a
     78 # union of all of the COMMON_LUNCH_CHOICES definitions within
     79 # each AndroidProducts.mk file.
     80 #
     81 define get-product-makefiles
     82 $(sort \
     83   $(eval _COMMON_LUNCH_CHOICES :=) \
     84   $(foreach f,$(1), \
     85     $(eval PRODUCT_MAKEFILES :=) \
     86     $(eval COMMON_LUNCH_CHOICES :=) \
     87     $(eval LOCAL_DIR := $(patsubst %/,%,$(dir $(f)))) \
     88     $(eval include $(f)) \
     89     $(call _validate-common-lunch-choices,$(COMMON_LUNCH_CHOICES),$(PRODUCT_MAKEFILES)) \
     90     $(eval _COMMON_LUNCH_CHOICES += $(COMMON_LUNCH_CHOICES)) \
     91     $(PRODUCT_MAKEFILES) \
     92    ) \
     93   $(eval PRODUCT_MAKEFILES :=) \
     94   $(eval LOCAL_DIR :=) \
     95   $(eval COMMON_LUNCH_CHOICES := $(sort $(_COMMON_LUNCH_CHOICES))) \
     96   $(eval _COMMON_LUNCH_CHOICES :=) \
     97  )
     98 endef
     99 
    100 #
    101 # Returns the sorted concatenation of all PRODUCT_MAKEFILES
    102 # variables set in all AndroidProducts.mk files.
    103 # $(call ) isn't necessary.
    104 #
    105 define get-all-product-makefiles
    106 $(call get-product-makefiles,$(_find-android-products-files))
    107 endef
    108 
    109 _product_var_list :=
    110 _product_var_list += PRODUCT_NAME
    111 _product_var_list += PRODUCT_MODEL
    112 
    113 # The resoure configuration options to use for this product.
    114 _product_var_list += PRODUCT_LOCALES
    115 _product_var_list += PRODUCT_AAPT_CONFIG
    116 _product_var_list += PRODUCT_AAPT_PREF_CONFIG
    117 _product_var_list += PRODUCT_AAPT_PREBUILT_DPI
    118 _product_var_list += PRODUCT_HOST_PACKAGES
    119 _product_var_list += PRODUCT_PACKAGES
    120 _product_var_list += PRODUCT_PACKAGES_DEBUG
    121 _product_var_list += PRODUCT_PACKAGES_DEBUG_ASAN
    122 _product_var_list += PRODUCT_PACKAGES_ENG
    123 _product_var_list += PRODUCT_PACKAGES_TESTS
    124 
    125 # The device that this product maps to.
    126 _product_var_list += PRODUCT_DEVICE
    127 _product_var_list += PRODUCT_MANUFACTURER
    128 _product_var_list += PRODUCT_BRAND
    129 
    130 # These PRODUCT_SYSTEM_* flags, if defined, are used in place of the
    131 # corresponding PRODUCT_* flags for the sysprops on /system.
    132 _product_var_list += \
    133     PRODUCT_SYSTEM_NAME \
    134     PRODUCT_SYSTEM_MODEL \
    135     PRODUCT_SYSTEM_DEVICE \
    136     PRODUCT_SYSTEM_BRAND \
    137     PRODUCT_SYSTEM_MANUFACTURER \
    138 
    139 # A list of property assignments, like "key = value", with zero or more
    140 # whitespace characters on either side of the '='.
    141 _product_var_list += PRODUCT_PROPERTY_OVERRIDES
    142 
    143 # A list of property assignments, like "key = value", with zero or more
    144 # whitespace characters on either side of the '='.
    145 # used for adding properties to default.prop
    146 _product_var_list += PRODUCT_DEFAULT_PROPERTY_OVERRIDES
    147 
    148 # A list of property assignments, like "key = value", with zero or more
    149 # whitespace characters on either side of the '='.
    150 # used for adding properties to build.prop of product partition
    151 _product_var_list += PRODUCT_PRODUCT_PROPERTIES
    152 
    153 # A list of property assignments, like "key = value", with zero or more
    154 # whitespace characters on either side of the '='.
    155 # used for adding properties to build.prop of product partition
    156 _product_var_list += PRODUCT_PRODUCT_SERVICES_PROPERTIES
    157 _product_var_list += PRODUCT_ODM_PROPERTIES
    158 _product_var_list += PRODUCT_CHARACTERISTICS
    159 
    160 # A list of words like <source path>:<destination path>[:<owner>].
    161 # The file at the source path should be copied to the destination path
    162 # when building  this product.  <destination path> is relative to
    163 # $(PRODUCT_OUT), so it should look like, e.g., "system/etc/file.xml".
    164 # The rules for these copy steps are defined in build/make/core/Makefile.
    165 # The optional :<owner> is used to indicate the owner of a vendor file.
    166 _product_var_list += PRODUCT_COPY_FILES
    167 
    168 # The OTA key(s) specified by the product config, if any.  The names
    169 # of these keys are stored in the target-files zip so that post-build
    170 # signing tools can substitute them for the test key embedded by
    171 # default.
    172 _product_var_list += PRODUCT_OTA_PUBLIC_KEYS
    173 _product_var_list += PRODUCT_EXTRA_RECOVERY_KEYS
    174 
    175 # Should we use the default resources or add any product specific overlays
    176 _product_var_list += PRODUCT_PACKAGE_OVERLAYS
    177 _product_var_list += DEVICE_PACKAGE_OVERLAYS
    178 
    179 # Resource overlay list which must be excluded from enforcing RRO.
    180 _product_var_list += PRODUCT_ENFORCE_RRO_EXCLUDED_OVERLAYS
    181 
    182 # Package list to apply enforcing RRO.
    183 _product_var_list += PRODUCT_ENFORCE_RRO_TARGETS
    184 
    185 _product_var_list += PRODUCT_SDK_ATREE_FILES
    186 _product_var_list += PRODUCT_SDK_ADDON_NAME
    187 _product_var_list += PRODUCT_SDK_ADDON_COPY_FILES
    188 _product_var_list += PRODUCT_SDK_ADDON_COPY_MODULES
    189 _product_var_list += PRODUCT_SDK_ADDON_DOC_MODULES
    190 _product_var_list += PRODUCT_SDK_ADDON_SYS_IMG_SOURCE_PROP
    191 
    192 # which Soong namespaces to export to Make
    193 _product_var_list += PRODUCT_SOONG_NAMESPACES
    194 
    195 _product_var_list += PRODUCT_DEFAULT_WIFI_CHANNELS
    196 _product_var_list += PRODUCT_DEFAULT_DEV_CERTIFICATE
    197 _product_var_list += PRODUCT_RESTRICT_VENDOR_FILES
    198 
    199 # The list of product-specific kernel header dirs
    200 _product_var_list += PRODUCT_VENDOR_KERNEL_HEADERS
    201 
    202 # A list of module names of BOOTCLASSPATH (jar files)
    203 _product_var_list += PRODUCT_BOOT_JARS
    204 _product_var_list += PRODUCT_SUPPORTS_BOOT_SIGNER
    205 _product_var_list += PRODUCT_SUPPORTS_VBOOT
    206 _product_var_list += PRODUCT_SUPPORTS_VERITY
    207 _product_var_list += PRODUCT_SUPPORTS_VERITY_FEC
    208 _product_var_list += PRODUCT_OEM_PROPERTIES
    209 
    210 # A list of property assignments, like "key = value", with zero or more
    211 # whitespace characters on either side of the '='.
    212 # used for adding properties to default.prop of system partition
    213 _product_var_list += PRODUCT_SYSTEM_DEFAULT_PROPERTIES
    214 
    215 _product_var_list += PRODUCT_SYSTEM_PROPERTY_BLACKLIST
    216 _product_var_list += PRODUCT_VENDOR_PROPERTY_BLACKLIST
    217 _product_var_list += PRODUCT_SYSTEM_SERVER_APPS
    218 _product_var_list += PRODUCT_SYSTEM_SERVER_JARS
    219 
    220 # All of the apps that we force preopt, this overrides WITH_DEXPREOPT.
    221 _product_var_list += PRODUCT_ALWAYS_PREOPT_EXTRACTED_APK
    222 _product_var_list += PRODUCT_DEXPREOPT_SPEED_APPS
    223 _product_var_list += PRODUCT_LOADED_BY_PRIVILEGED_MODULES
    224 _product_var_list += PRODUCT_VBOOT_SIGNING_KEY
    225 _product_var_list += PRODUCT_VBOOT_SIGNING_SUBKEY
    226 _product_var_list += PRODUCT_VERITY_SIGNING_KEY
    227 _product_var_list += PRODUCT_SYSTEM_VERITY_PARTITION
    228 _product_var_list += PRODUCT_VENDOR_VERITY_PARTITION
    229 _product_var_list += PRODUCT_PRODUCT_VERITY_PARTITION
    230 _product_var_list += PRODUCT_PRODUCT_SERVICES_VERITY_PARTITION
    231 _product_var_list += PRODUCT_ODM_VERITY_PARTITION
    232 _product_var_list += PRODUCT_SYSTEM_SERVER_DEBUG_INFO
    233 _product_var_list += PRODUCT_OTHER_JAVA_DEBUG_INFO
    234 
    235 # Per-module dex-preopt configs.
    236 _product_var_list += PRODUCT_DEX_PREOPT_MODULE_CONFIGS
    237 _product_var_list += PRODUCT_DEX_PREOPT_DEFAULT_COMPILER_FILTER
    238 _product_var_list += PRODUCT_DEX_PREOPT_DEFAULT_FLAGS
    239 _product_var_list += PRODUCT_DEX_PREOPT_BOOT_FLAGS
    240 _product_var_list += PRODUCT_DEX_PREOPT_PROFILE_DIR
    241 _product_var_list += PRODUCT_DEX_PREOPT_GENERATE_DM_FILES
    242 _product_var_list += PRODUCT_DEX_PREOPT_NEVER_ALLOW_STRIPPING
    243 _product_var_list += PRODUCT_DEX_PREOPT_RESOLVE_STARTUP_STRINGS
    244 
    245 # Boot image options.
    246 _product_var_list += \
    247     PRODUCT_USE_PROFILE_FOR_BOOT_IMAGE \
    248     PRODUCT_DEX_PREOPT_BOOT_IMAGE_PROFILE_LOCATION \
    249     PRODUCT_USES_ART \
    250 
    251 _product_var_list += PRODUCT_SYSTEM_SERVER_COMPILER_FILTER
    252 # Per-module sanitizer configs
    253 _product_var_list += PRODUCT_SANITIZER_MODULE_CONFIGS
    254 _product_var_list += PRODUCT_SYSTEM_BASE_FS_PATH
    255 _product_var_list += PRODUCT_VENDOR_BASE_FS_PATH
    256 _product_var_list += PRODUCT_PRODUCT_BASE_FS_PATH
    257 _product_var_list += PRODUCT_PRODUCT_SERVICES_BASE_FS_PATH
    258 _product_var_list += PRODUCT_ODM_BASE_FS_PATH
    259 _product_var_list += PRODUCT_SHIPPING_API_LEVEL
    260 _product_var_list += VENDOR_PRODUCT_RESTRICT_VENDOR_FILES
    261 _product_var_list += VENDOR_EXCEPTION_MODULES
    262 _product_var_list += VENDOR_EXCEPTION_PATHS
    263 
    264 # Whether the product wants to ship libartd. For rules and meaning, see art/Android.mk.
    265 _product_var_list += PRODUCT_ART_TARGET_INCLUDE_DEBUG_BUILD
    266 
    267 # Make this art variable visible to soong_config.mk.
    268 _product_var_list += PRODUCT_ART_USE_READ_BARRIER
    269 
    270 # Whether the product is an Android Things variant.
    271 _product_var_list += PRODUCT_IOT
    272 
    273 # Add reserved headroom to a system image.
    274 _product_var_list += PRODUCT_SYSTEM_HEADROOM
    275 
    276 # Whether to save disk space by minimizing java debug info
    277 _product_var_list += PRODUCT_MINIMIZE_JAVA_DEBUG_INFO
    278 
    279 # Whether any paths are excluded from sanitization when SANITIZE_TARGET=integer_overflow
    280 _product_var_list += PRODUCT_INTEGER_OVERFLOW_EXCLUDE_PATHS
    281 
    282 _product_var_list += PRODUCT_ADB_KEYS
    283 
    284 # Whether any paths should have CFI enabled for components
    285 _product_var_list += PRODUCT_CFI_INCLUDE_PATHS
    286 
    287 # Whether any paths are excluded from sanitization when SANITIZE_TARGET=cfi
    288 _product_var_list += PRODUCT_CFI_EXCLUDE_PATHS
    289 
    290 # Whether the Scudo hardened allocator is disabled platform-wide
    291 _product_var_list += PRODUCT_DISABLE_SCUDO
    292 
    293 # A flag to override PRODUCT_COMPATIBLE_PROPERTY
    294 _product_var_list += PRODUCT_COMPATIBLE_PROPERTY_OVERRIDE
    295 
    296 # Whether the whitelist of actionable compatible properties should be disabled or not
    297 _product_var_list += PRODUCT_ACTIONABLE_COMPATIBLE_PROPERTY_DISABLE
    298 _product_var_list += PRODUCT_ENFORCE_ARTIFACT_PATH_REQUIREMENTS
    299 _product_var_list += PRODUCT_ENFORCE_ARTIFACT_SYSTEM_CERTIFICATE_REQUIREMENT
    300 _product_var_list += PRODUCT_ARTIFACT_SYSTEM_CERTIFICATE_REQUIREMENT_WHITELIST
    301 _product_var_list += PRODUCT_ARTIFACT_PATH_REQUIREMENT_HINT
    302 _product_var_list += PRODUCT_ARTIFACT_PATH_REQUIREMENT_WHITELIST
    303 
    304 # List of modules that should be forcefully unmarked from being LOCAL_PRODUCT_MODULE, and hence
    305 # installed on /system directory by default.
    306 _product_var_list += PRODUCT_FORCE_PRODUCT_MODULES_TO_SYSTEM_PARTITION
    307 
    308 # When this is true, dynamic partitions is retrofitted on a device that has
    309 # already been launched without dynamic partitions. Otherwise, the device
    310 # is launched with dynamic partitions.
    311 # This flag implies PRODUCT_USE_DYNAMIC_PARTITIONS.
    312 _product_var_list += PRODUCT_RETROFIT_DYNAMIC_PARTITIONS
    313 
    314 # Other dynamic partition feature flags.PRODUCT_USE_DYNAMIC_PARTITION_SIZE and
    315 # PRODUCT_BUILD_SUPER_PARTITION default to the value of PRODUCT_USE_DYNAMIC_PARTITIONS.
    316 _product_var_list += \
    317     PRODUCT_USE_DYNAMIC_PARTITIONS \
    318     PRODUCT_USE_DYNAMIC_PARTITION_SIZE \
    319     PRODUCT_BUILD_SUPER_PARTITION \
    320 
    321 # If set, kernel configuration requirements are present in OTA package (and will be enforced
    322 # during OTA). Otherwise, kernel configuration requirements are enforced in VTS.
    323 # Devices that checks the running kernel (instead of the kernel in OTA package) should not
    324 # set this variable to prevent OTA failures.
    325 _product_var_list += PRODUCT_OTA_ENFORCE_VINTF_KERNEL_REQUIREMENTS
    326 
    327 # Whether any paths are excluded from being set XOM when ENABLE_XOM=true
    328 _product_var_list += PRODUCT_XOM_EXCLUDE_PATHS
    329 _product_var_list += PRODUCT_MANIFEST_PACKAGE_NAME_OVERRIDES
    330 _product_var_list += PRODUCT_PACKAGE_NAME_OVERRIDES
    331 _product_var_list += PRODUCT_CERTIFICATE_OVERRIDES
    332 _product_var_list += PRODUCT_BUILD_SYSTEM_IMAGE
    333 _product_var_list += PRODUCT_BUILD_SYSTEM_OTHER_IMAGE
    334 _product_var_list += PRODUCT_BUILD_VENDOR_IMAGE
    335 _product_var_list += PRODUCT_BUILD_PRODUCT_IMAGE
    336 _product_var_list += PRODUCT_BUILD_PRODUCT_SERVICES_IMAGE
    337 _product_var_list += PRODUCT_BUILD_ODM_IMAGE
    338 _product_var_list += PRODUCT_BUILD_CACHE_IMAGE
    339 _product_var_list += PRODUCT_BUILD_RAMDISK_IMAGE
    340 _product_var_list += PRODUCT_BUILD_USERDATA_IMAGE
    341 _product_var_list += PRODUCT_UPDATABLE_BOOT_MODULES
    342 _product_var_list += PRODUCT_UPDATABLE_BOOT_LOCATIONS
    343 
    344 # Whether the product would like to check prebuilt ELF files.
    345 _product_var_list += PRODUCT_CHECK_ELF_FILES
    346 .KATI_READONLY := _product_var_list
    347 
    348 define dump-product
    349 $(warning ==== $(1) ====)\
    350 $(foreach v,$(_product_var_list),\
    351 $(warning PRODUCTS.$(1).$(v) := $(PRODUCTS.$(1).$(v))))\
    352 $(warning --------)
    353 endef
    354 
    355 define dump-products
    356 $(foreach p,$(PRODUCTS),$(call dump-product,$(p)))
    357 endef
    358 
    359 #
    360 # Functions for including product makefiles
    361 #
    362 
    363 #
    364 # $(1): product to inherit
    365 #
    366 # To be called from product makefiles, and is later evaluated during the import-nodes
    367 # call below. It does three things:
    368 #  1. Inherits all of the variables from $1.
    369 #  2. Records the inheritance in the .INHERITS_FROM variable
    370 #  3. Records the calling makefile in PARENT_PRODUCT_FILES
    371 #
    372 # (2) and (3) can be used together to reconstruct the include hierarchy
    373 # See e.g. product-graph.mk for an example of this.
    374 #
    375 define inherit-product
    376   $(if $(findstring ../,$(1)),\
    377     $(eval np := $(call normalize-paths,$(1))),\
    378     $(eval np := $(strip $(1))))\
    379   $(foreach v,$(_product_var_list), \
    380       $(eval $(v) := $($(v)) $(INHERIT_TAG)$(np))) \
    381   $(eval current_mk := $(strip $(word 1,$(_include_stack)))) \
    382   $(eval inherit_var := PRODUCTS.$(current_mk).INHERITS_FROM) \
    383   $(eval $(inherit_var) := $(sort $($(inherit_var)) $(np))) \
    384   $(eval PARENT_PRODUCT_FILES := $(sort $(PARENT_PRODUCT_FILES) $(current_mk)))
    385 endef
    386 
    387 # Specifies a number of path prefixes, relative to PRODUCT_OUT, where the
    388 # product makefile hierarchy rooted in the current node places its artifacts.
    389 # Creating artifacts outside the specified paths will cause a build-time error.
    390 define require-artifacts-in-path
    391   $(eval current_mk := $(strip $(word 1,$(_include_stack)))) \
    392   $(eval PRODUCTS.$(current_mk).ARTIFACT_PATH_REQUIREMENTS := $(strip $(1))) \
    393   $(eval PRODUCTS.$(current_mk).ARTIFACT_PATH_WHITELIST := $(strip $(2))) \
    394   $(eval ARTIFACT_PATH_REQUIREMENT_PRODUCTS := \
    395     $(sort $(ARTIFACT_PATH_REQUIREMENT_PRODUCTS) $(current_mk)))
    396 endef
    397 
    398 # Makes including non-existant modules in PRODUCT_PACKAGES an error.
    399 # $(1): whitelist of non-existant modules to allow.
    400 define enforce-product-packages-exist
    401   $(eval current_mk := $(strip $(word 1,$(_include_stack)))) \
    402   $(eval PRODUCTS.$(current_mk).PRODUCT_ENFORCE_PACKAGES_EXIST := true) \
    403   $(eval PRODUCTS.$(current_mk).PRODUCT_ENFORCE_PACKAGES_EXIST_WHITELIST := $(1)) \
    404   $(eval .KATI_READONLY := PRODUCTS.$(current_mk).PRODUCT_ENFORCE_PACKAGES_EXIST) \
    405   $(eval .KATI_READONLY := PRODUCTS.$(current_mk).PRODUCT_ENFORCE_PACKAGES_EXIST_WHITELIST)
    406 endef
    407 
    408 #
    409 # Do inherit-product only if $(1) exists
    410 #
    411 define inherit-product-if-exists
    412   $(if $(wildcard $(1)),$(call inherit-product,$(1)),)
    413 endef
    414 
    415 #
    416 # $(1): product makefile list
    417 #
    418 #TODO: check to make sure that products have all the necessary vars defined
    419 define import-products
    420 $(call import-nodes,PRODUCTS,$(1),$(_product_var_list))
    421 endef
    422 
    423 
    424 #
    425 # Does various consistency checks on all of the known products.
    426 # Takes no parameters, so $(call ) is not necessary.
    427 #
    428 define check-all-products
    429 $(if ,, \
    430   $(eval _cap_names :=) \
    431   $(foreach p,$(PRODUCTS), \
    432     $(eval pn := $(strip $(PRODUCTS.$(p).PRODUCT_NAME))) \
    433     $(if $(pn),,$(error $(p): PRODUCT_NAME must be defined.)) \
    434     $(if $(filter $(pn),$(_cap_names)), \
    435       $(error $(p): PRODUCT_NAME must be unique; "$(pn)" already used by $(strip \
    436           $(foreach \
    437             pp,$(PRODUCTS),
    438               $(if $(filter $(pn),$(PRODUCTS.$(pp).PRODUCT_NAME)), \
    439                 $(pp) \
    440                ))) \
    441        ) \
    442      ) \
    443     $(eval _cap_names += $(pn)) \
    444     $(if $(call is-c-identifier,$(pn)),, \
    445       $(error $(p): PRODUCT_NAME must be a valid C identifier, not "$(pn)") \
    446      ) \
    447     $(eval pb := $(strip $(PRODUCTS.$(p).PRODUCT_BRAND))) \
    448     $(if $(pb),,$(error $(p): PRODUCT_BRAND must be defined.)) \
    449     $(foreach cf,$(strip $(PRODUCTS.$(p).PRODUCT_COPY_FILES)), \
    450       $(if $(filter 2 3,$(words $(subst :,$(space),$(cf)))),, \
    451         $(error $(p): malformed COPY_FILE "$(cf)") \
    452        ) \
    453      ) \
    454    ) \
    455 )
    456 endef
    457 
    458 
    459 #
    460 # Returns the product makefile path for the product with the provided name
    461 #
    462 # $(1): short product name like "generic"
    463 #
    464 define _resolve-short-product-name
    465   $(eval pn := $(strip $(1)))
    466   $(eval p := \
    467       $(foreach p,$(PRODUCTS), \
    468           $(if $(filter $(pn),$(PRODUCTS.$(p).PRODUCT_NAME)), \
    469             $(p) \
    470        )) \
    471    )
    472   $(eval p := $(sort $(p)))
    473   $(if $(filter 1,$(words $(p))), \
    474     $(p), \
    475     $(if $(filter 0,$(words $(p))), \
    476       $(error No matches for product "$(pn)"), \
    477       $(error Product "$(pn)" ambiguous: matches $(p)) \
    478     ) \
    479   )
    480 endef
    481 define resolve-short-product-name
    482 $(strip $(call _resolve-short-product-name,$(1)))
    483 endef
    484 
    485 # BoardConfig variables that are also inherited in product mks. Should ideally
    486 # be cleaned up to not be product variables.
    487 _readonly_late_variables := \
    488   DEVICE_PACKAGE_OVERLAYS \
    489   WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY \
    490 
    491 # Modified internally in the build system
    492 _readonly_late_variables += \
    493   PRODUCT_COPY_FILES \
    494   PRODUCT_DEX_PREOPT_NEVER_ALLOW_STRIPPING \
    495   PRODUCT_DEX_PREOPT_BOOT_FLAGS \
    496 
    497 _readonly_early_variables := $(filter-out $(_readonly_late_variables),$(_product_var_list))
    498 
    499 #
    500 # Mark the variables in _product_stash_var_list as readonly
    501 #
    502 define readonly-variables
    503 $(foreach v,$(1), \
    504   $(eval $(v) ?=) \
    505   $(eval .KATI_READONLY := $(v)) \
    506  )
    507 endef
    508 define readonly-product-vars
    509 $(call readonly-variables,$(_readonly_early_variables))
    510 endef
    511 
    512 define readonly-final-product-vars
    513 $(call readonly-variables,$(_readonly_late_variables))
    514 endef
    515 
    516 #
    517 # Strip the variables in _product_strip_var_list
    518 #
    519 define strip-product-vars
    520 $(foreach v,$(_product_var_list), \
    521   $(eval $(v) := $(strip $(PRODUCTS.$(INTERNAL_PRODUCT).$(v)))) \
    522 )
    523 endef
    524 
    525 define add-to-product-copy-files-if-exists
    526 $(if $(wildcard $(word 1,$(subst :, ,$(1)))),$(1))
    527 endef
    528 
    529 # whitespace placeholder when we record module's dex-preopt config.
    530 _PDPMC_SP_PLACE_HOLDER := |@SP@|
    531 # Set up dex-preopt config for a module.
    532 # $(1) list of module names
    533 # $(2) the modules' dex-preopt config
    534 define add-product-dex-preopt-module-config
    535 $(eval _c := $(subst $(space),$(_PDPMC_SP_PLACE_HOLDER),$(strip $(2))))\
    536 $(eval PRODUCT_DEX_PREOPT_MODULE_CONFIGS += \
    537   $(foreach m,$(1),$(m)=$(_c)))
    538 endef
    539 
    540 # whitespace placeholder when we record module's sanitizer config.
    541 _PSMC_SP_PLACE_HOLDER := |@SP@|
    542 # Set up sanitizer config for a module.
    543 # $(1) list of module names
    544 # $(2) the modules' sanitizer config
    545 define add-product-sanitizer-module-config
    546 $(eval _c := $(subst $(space),$(_PSMC_SP_PLACE_HOLDER),$(strip $(2))))\
    547 $(eval PRODUCT_SANITIZER_MODULE_CONFIGS += \
    548   $(foreach m,$(1),$(m)=$(_c)))
    549 endef
    550