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# 30define _find-android-products-files 31$(file <$(OUT_DIR)/.module_paths/AndroidProducts.mk.list) \ 32 $(SRC_TARGET_DIR)/product/AndroidProducts.mk 33endef 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# 44define _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))) 50endef 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# 58define _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 )) 70endef 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# 81define 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 ) 98endef 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# 105define get-all-product-makefiles 106$(call get-product-makefiles,$(_find-android-products-files)) 107endef 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 348define dump-product 349$(warning ==== $(1) ====)\ 350$(foreach v,$(_product_var_list),\ 351$(warning PRODUCTS.$(1).$(v) := $(PRODUCTS.$(1).$(v))))\ 352$(warning --------) 353endef 354 355define dump-products 356$(foreach p,$(PRODUCTS),$(call dump-product,$(p))) 357endef 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# 375define 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))) 385endef 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. 390define 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))) 396endef 397 398# Makes including non-existant modules in PRODUCT_PACKAGES an error. 399# $(1): whitelist of non-existant modules to allow. 400define 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) 406endef 407 408# 409# Do inherit-product only if $(1) exists 410# 411define inherit-product-if-exists 412 $(if $(wildcard $(1)),$(call inherit-product,$(1)),) 413endef 414 415# 416# $(1): product makefile list 417# 418#TODO: check to make sure that products have all the necessary vars defined 419define import-products 420$(call import-nodes,PRODUCTS,$(1),$(_product_var_list)) 421endef 422 423 424# 425# Does various consistency checks on all of the known products. 426# Takes no parameters, so $(call ) is not necessary. 427# 428define 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) 456endef 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# 464define _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 ) 480endef 481define resolve-short-product-name 482$(strip $(call _resolve-short-product-name,$(1))) 483endef 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# 502define readonly-variables 503$(foreach v,$(1), \ 504 $(eval $(v) ?=) \ 505 $(eval .KATI_READONLY := $(v)) \ 506 ) 507endef 508define readonly-product-vars 509$(call readonly-variables,$(_readonly_early_variables)) 510endef 511 512define readonly-final-product-vars 513$(call readonly-variables,$(_readonly_late_variables)) 514endef 515 516# 517# Strip the variables in _product_strip_var_list 518# 519define strip-product-vars 520$(foreach v,$(_product_var_list), \ 521 $(eval $(v) := $(strip $(PRODUCTS.$(INTERNAL_PRODUCT).$(v)))) \ 522) 523endef 524 525define add-to-product-copy-files-if-exists 526$(if $(wildcard $(word 1,$(subst :, ,$(1)))),$(1)) 527endef 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 534define 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))) 538endef 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 545define 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))) 549endef 550