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