• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#
2# Copyright (C) 2019 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# This file includes BoardConfig.mk for the device being built,
19# and checks the variable defined therein.
20# ###############################################################
21
22_board_strip_readonly_list :=
23_board_strip_readonly_list += BOARD_BOOTLOADER_IN_UPDATE_PACKAGE
24_board_strip_readonly_list += BOARD_EGL_CFG
25_board_strip_readonly_list += BOARD_HAVE_BLUETOOTH
26_board_strip_readonly_list += BOARD_INSTALLER_CMDLINE
27_board_strip_readonly_list += BOARD_KERNEL_CMDLINE
28_board_strip_readonly_list += BOARD_BOOT_HEADER_VERSION
29_board_strip_readonly_list += BOARD_BOOTCONFIG
30_board_strip_readonly_list += BOARD_BOOTCONFIG_FILE
31_board_strip_readonly_list += BOARD_KERNEL_BASE
32_board_strip_readonly_list += BOARD_USES_GENERIC_AUDIO
33_board_strip_readonly_list += BOARD_USES_RECOVERY_AS_BOOT
34_board_strip_readonly_list += BOARD_VENDOR_USE_AKMD
35_board_strip_readonly_list += BOARD_WPA_SUPPLICANT_DRIVER
36_board_strip_readonly_list += BOARD_WLAN_DEVICE
37_board_strip_readonly_list += TARGET_BOARD_PLATFORM
38_board_strip_readonly_list += TARGET_BOARD_PLATFORM_GPU
39_board_strip_readonly_list += TARGET_BOOTLOADER_BOARD_NAME
40_board_strip_readonly_list += TARGET_FS_CONFIG_GEN
41_board_strip_readonly_list += TARGET_NO_BOOTLOADER
42_board_strip_readonly_list += TARGET_NO_KERNEL
43_board_strip_readonly_list += TARGET_NO_RECOVERY
44_board_strip_readonly_list += TARGET_NO_RADIOIMAGE
45_board_strip_readonly_list += TARGET_HARDWARE_3D
46_board_strip_readonly_list += WITH_DEXPREOPT
47
48# Arch variables
49_board_strip_readonly_list += TARGET_ARCH
50_board_strip_readonly_list += TARGET_ARCH_VARIANT
51_board_strip_readonly_list += TARGET_CPU_ABI
52_board_strip_readonly_list += TARGET_CPU_ABI2
53_board_strip_readonly_list += TARGET_CPU_VARIANT
54_board_strip_readonly_list += TARGET_CPU_VARIANT_RUNTIME
55_board_strip_readonly_list += TARGET_2ND_ARCH
56_board_strip_readonly_list += TARGET_2ND_ARCH_VARIANT
57_board_strip_readonly_list += TARGET_2ND_CPU_ABI
58_board_strip_readonly_list += TARGET_2ND_CPU_ABI2
59_board_strip_readonly_list += TARGET_2ND_CPU_VARIANT
60_board_strip_readonly_list += TARGET_2ND_CPU_VARIANT_RUNTIME
61# TARGET_ARCH_SUITE is an alternative arch configuration to TARGET_ARCH (and related variables),
62# that can be used for soong-only builds to build for several architectures at once.
63# Allowed values currently are "ndk" and "mainline_sdk".
64_board_strip_readonly_list += TARGET_ARCH_SUITE
65
66# File system variables
67_board_strip_readonly_list += BOARD_FLASH_BLOCK_SIZE
68_board_strip_readonly_list += BOARD_BOOTIMAGE_PARTITION_SIZE
69_board_strip_readonly_list += BOARD_INIT_BOOT_IMAGE_PARTITION_SIZE
70_board_strip_readonly_list += BOARD_RECOVERYIMAGE_PARTITION_SIZE
71_board_strip_readonly_list += BOARD_SYSTEMIMAGE_PARTITION_SIZE
72_board_strip_readonly_list += BOARD_SYSTEMIMAGE_FILE_SYSTEM_TYPE
73_board_strip_readonly_list += BOARD_USERDATAIMAGE_FILE_SYSTEM_TYPE
74_board_strip_readonly_list += BOARD_USERDATAIMAGE_PARTITION_SIZE
75_board_strip_readonly_list += BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE
76_board_strip_readonly_list += BOARD_CACHEIMAGE_PARTITION_SIZE
77_board_strip_readonly_list += BOARD_VENDORIMAGE_PARTITION_SIZE
78_board_strip_readonly_list += BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE
79_board_strip_readonly_list += BOARD_PRODUCTIMAGE_PARTITION_SIZE
80_board_strip_readonly_list += BOARD_PRODUCTIMAGE_FILE_SYSTEM_TYPE
81_board_strip_readonly_list += BOARD_SYSTEM_EXTIMAGE_PARTITION_SIZE
82_board_strip_readonly_list += BOARD_SYSTEM_EXTIMAGE_FILE_SYSTEM_TYPE
83_board_strip_readonly_list += BOARD_ODMIMAGE_PARTITION_SIZE
84_board_strip_readonly_list += BOARD_ODMIMAGE_FILE_SYSTEM_TYPE
85_board_strip_readonly_list += BOARD_VENDOR_DLKMIMAGE_PARTITION_SIZE
86_board_strip_readonly_list += BOARD_VENDOR_DLKMIMAGE_FILE_SYSTEM_TYPE
87_board_strip_readonly_list += BOARD_ODM_DLKMIMAGE_PARTITION_SIZE
88_board_strip_readonly_list += BOARD_ODM_DLKMIMAGE_FILE_SYSTEM_TYPE
89_board_strip_readonly_list += BOARD_SYSTEM_DLKMIMAGE_PARTITION_SIZE
90_board_strip_readonly_list += BOARD_SYSTEM_DLKMIMAGE_FILE_SYSTEM_TYPE
91_board_strip_readonly_list += BOARD_PVMFWIMAGE_PARTITION_SIZE
92
93# Logical partitions related variables.
94_board_strip_readonly_list += BOARD_SYSTEMIMAGE_PARTITION_RESERVED_SIZE
95_board_strip_readonly_list += BOARD_VENDORIMAGE_PARTITION_RESERVED_SIZE
96_board_strip_readonly_list += BOARD_ODMIMAGE_PARTITION_RESERVED_SIZE
97_board_strip_readonly_list += BOARD_VENDOR_DLKMIMAGE_PARTITION_RESERVED_SIZE
98_board_strip_readonly_list += BOARD_ODM_DLKMIMAGE_PARTITION_RESERVED_SIZE
99_board_strip_readonly_list += BOARD_SYSTEM_DLKMIMAGE_PARTITION_RESERVED_SIZE
100_board_strip_readonly_list += BOARD_PRODUCTIMAGE_PARTITION_RESERVED_SIZE
101_board_strip_readonly_list += BOARD_SYSTEM_EXTIMAGE_PARTITION_RESERVED_SIZE
102_board_strip_readonly_list += BOARD_SUPER_PARTITION_SIZE
103_board_strip_readonly_list += BOARD_SUPER_PARTITION_GROUPS
104
105# Kernel related variables
106_board_strip_readonly_list += BOARD_KERNEL_BINARIES
107_board_strip_readonly_list += BOARD_KERNEL_MODULE_INTERFACE_VERSIONS
108
109# Variables related to generic kernel image (GKI) and generic boot image
110# - BOARD_USES_GENERIC_KERNEL_IMAGE is the global variable that defines if the
111#   board uses GKI and generic boot image.
112#   Update mechanism of the boot image is not enforced by this variable.
113# - BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE controls whether the recovery image
114#   contains a kernel or not.
115# - BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT controls whether ramdisk
116#   recovery resources are built to vendor_boot.
117# - BOARD_INCLUDE_RECOVERY_RAMDISK_IN_VENDOR_BOOT controls whether recovery
118#   resources are built as a standalone recovery ramdisk in vendor_boot.
119# - BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT controls whether GSI AVB keys are
120#   built to vendor_boot.
121# - BOARD_COPY_BOOT_IMAGE_TO_TARGET_FILES controls whether boot images in $OUT are added
122#   to target files package directly.
123_board_strip_readonly_list += BOARD_USES_GENERIC_KERNEL_IMAGE
124_board_strip_readonly_list += BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE
125_board_strip_readonly_list += BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT
126_board_strip_readonly_list += BOARD_INCLUDE_RECOVERY_RAMDISK_IN_VENDOR_BOOT
127_board_strip_readonly_list += BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT
128_board_strip_readonly_list += BOARD_COPY_BOOT_IMAGE_TO_TARGET_FILES
129
130# Prebuilt image variables
131_board_strip_readonly_list += BOARD_PREBUILT_INIT_BOOT_IMAGE
132
133# Defines the list of logical vendor ramdisk names to build or include in vendor_boot.
134_board_strip_readonly_list += BOARD_VENDOR_RAMDISK_FRAGMENTS
135
136# These are all variables used to build $(INSTALLED_MISC_INFO_TARGET)
137# in build/make/core/Makefile. Their values get used in command line
138# arguments, so they have to be stripped to make the ninja files stable.
139_board_strip_list :=
140_board_strip_list += BOARD_DTBOIMG_PARTITION_SIZE
141_board_strip_list += BOARD_AVB_DTBO_KEY_PATH
142_board_strip_list += BOARD_AVB_DTBO_ALGORITHM
143_board_strip_list += BOARD_AVB_DTBO_ROLLBACK_INDEX_LOCATION
144_board_strip_list += BOARD_AVB_PVMFW_KEY_PATH
145_board_strip_list += BOARD_AVB_PVMFW_ALGORITHM
146_board_strip_list += BOARD_AVB_PVMFW_ROLLBACK_INDEX_LOCATION
147_board_strip_list += BOARD_PARTIAL_OTA_UPDATE_PARTITIONS_LIST
148_board_strip_list += BOARD_AVB_VBMETA_VENDOR_ROLLBACK_INDEX_LOCATION
149_board_strip_list += BOARD_AVB_VBMETA_VENDOR_ALGORITHM
150_board_strip_list += BOARD_AVB_VBMETA_VENDOR_KEY_PATH
151_board_strip_list += BOARD_AVB_VBMETA_VENDOR
152_board_strip_list += BOARD_AVB_VBMETA_SYSTEM_ROLLBACK_INDEX_LOCATION
153_board_strip_list += BOARD_AVB_VBMETA_SYSTEM_ALGORITHM
154_board_strip_list += BOARD_AVB_VBMETA_SYSTEM_KEY_PATH
155_board_strip_list += BOARD_AVB_VBMETA_SYSTEM
156_board_strip_list += BOARD_AVB_RECOVERY_KEY_PATH
157_board_strip_list += BOARD_AVB_RECOVERY_ALGORITHM
158_board_strip_list += BOARD_AVB_RECOVERY_ROLLBACK_INDEX_LOCATION
159_board_strip_list += BOARD_AVB_VENDOR_BOOT_KEY_PATH
160_board_strip_list += BOARD_AVB_VENDOR_BOOT_ALGORITHM
161_board_strip_list += BOARD_AVB_VENDOR_BOOT_ROLLBACK_INDEX_LOCATION
162_board_strip_list += BOARD_AVB_VENDOR_KERNEL_BOOT_KEY_PATH
163_board_strip_list += BOARD_AVB_VENDOR_KERNEL_BOOT_ALGORITHM
164_board_strip_list += BOARD_AVB_VENDOR_KERNEL_BOOT_ROLLBACK_INDEX_LOCATION
165_board_strip_list += BOARD_MKBOOTIMG_ARGS
166_board_strip_list += BOARD_VENDOR_BOOTIMAGE_PARTITION_SIZE
167_board_strip_list += BOARD_VENDOR_KERNEL_BOOTIMAGE_PARTITION_SIZE
168_board_strip_list += ODM_MANIFEST_SKUS
169
170
171_build_broken_var_list := \
172  BUILD_BROKEN_CLANG_PROPERTY \
173  BUILD_BROKEN_CLANG_ASFLAGS \
174  BUILD_BROKEN_CLANG_CFLAGS \
175  BUILD_BROKEN_DEPFILE \
176  BUILD_BROKEN_DUP_RULES \
177  BUILD_BROKEN_DUP_SYSPROP \
178  BUILD_BROKEN_ELF_PREBUILT_PRODUCT_COPY_FILES \
179  BUILD_BROKEN_ENFORCE_SYSPROP_OWNER \
180  BUILD_BROKEN_INPUT_DIR_MODULES \
181  BUILD_BROKEN_MISSING_REQUIRED_MODULES \
182  BUILD_BROKEN_OUTSIDE_INCLUDE_DIRS \
183  BUILD_BROKEN_PREBUILT_ELF_FILES \
184  BUILD_BROKEN_TREBLE_SYSPROP_NEVERALLOW \
185  BUILD_BROKEN_USES_NETWORK \
186  BUILD_BROKEN_VENDOR_PROPERTY_NAMESPACE \
187  BUILD_BROKEN_VINTF_PRODUCT_COPY_FILES \
188  BUILD_BROKEN_INCORRECT_PARTITION_IMAGES \
189  BUILD_BROKEN_GENRULE_SANDBOXING \
190  BUILD_BROKEN_DONT_CHECK_SYSTEMSDK \
191
192_build_broken_var_list += \
193  $(foreach m,$(AVAILABLE_BUILD_MODULE_TYPES) \
194              $(DEFAULT_WARNING_BUILD_MODULE_TYPES) \
195              $(DEFAULT_ERROR_BUILD_MODULE_TYPES), \
196    BUILD_BROKEN_USES_$(m))
197
198_board_true_false_vars := $(_build_broken_var_list)
199_board_strip_readonly_list += $(_build_broken_var_list) \
200  BUILD_BROKEN_NINJA_USES_ENV_VARS
201
202# Conditional to building on linux, as dex2oat currently does not work on darwin.
203ifeq ($(HOST_OS),linux)
204  WITH_DEXPREOPT ?= true
205endif
206
207# ###############################################################
208# Broken build defaults
209# ###############################################################
210$(foreach v,$(_build_broken_var_list),$(eval $(v) :=))
211BUILD_BROKEN_NINJA_USES_ENV_VARS :=
212
213# Boards may be defined under $(SRC_TARGET_DIR)/board/$(TARGET_DEVICE)
214# or under vendor/*/$(TARGET_DEVICE).  Search in both places, but
215# make sure only one exists.
216# Real boards should always be associated with an OEM vendor.
217ifdef TARGET_DEVICE_DIR
218  ifneq ($(origin TARGET_DEVICE_DIR),command line)
219    $(error TARGET_DEVICE_DIR may not be set manually)
220  endif
221  board_config_mk := $(TARGET_DEVICE_DIR)/BoardConfig.mk
222else
223  board_config_mk := \
224    $(strip $(sort $(wildcard \
225      $(SRC_TARGET_DIR)/board/$(TARGET_DEVICE)/BoardConfig.mk \
226      device/generic/goldfish/board/$(TARGET_DEVICE)/BoardConfig.mk \
227      device/google/cuttlefish/board/$(TARGET_DEVICE)/BoardConfig.mk \
228      vendor/google/products/cuttlefish/pixel_watch/board/$(TARGET_DEVICE)/BoardConfig.mk \
229      $(shell test -d device && find -L device -maxdepth 4 -path '*/$(TARGET_DEVICE)/BoardConfig.mk') \
230      $(shell test -d vendor && find -L vendor -maxdepth 4 -path '*/$(TARGET_DEVICE)/BoardConfig.mk') \
231    )))
232  ifeq ($(board_config_mk),)
233    $(error No config file found for TARGET_DEVICE $(TARGET_DEVICE))
234  endif
235  ifneq ($(words $(board_config_mk)),1)
236    $(error Multiple board config files for TARGET_DEVICE $(TARGET_DEVICE): $(board_config_mk))
237  endif
238  TARGET_DEVICE_DIR := $(patsubst %/,%,$(dir $(board_config_mk)))
239  .KATI_READONLY := TARGET_DEVICE_DIR
240endif
241
242$(call dump-phase-start,BOARD,,,, build/make/core/board_config.mk)
243ifndef RBC_PRODUCT_CONFIG
244include $(board_config_mk)
245else
246  $(shell mkdir -p $(OUT_DIR)/rbc)
247  $(call dump-variables-rbc, $(OUT_DIR)/rbc/make_vars_pre_board_config.mk)
248
249  $(shell $(OUT_DIR)/mk2rbc \
250    --mode=write -r --outdir $(OUT_DIR)/rbc \
251    --boardlauncher=$(OUT_DIR)/rbc/boardlauncher.rbc \
252    --input_variables=$(OUT_DIR)/rbc/make_vars_pre_board_config.mk \
253    --makefile_list=$(OUT_DIR)/.module_paths/configuration.list \
254    $(board_config_mk))
255  ifneq ($(.SHELLSTATUS),0)
256    $(error board configuration converter failed: $(.SHELLSTATUS))
257  endif
258
259  $(shell build/soong/scripts/update_out $(OUT_DIR)/rbc/rbc_board_config_results.mk \
260    $(OUT_DIR)/rbcrun --mode=rbc $(OUT_DIR)/rbc/boardlauncher.rbc)
261  ifneq ($(.SHELLSTATUS),0)
262    $(error board configuration runner failed: $(.SHELLSTATUS))
263  endif
264
265  include $(OUT_DIR)/rbc/rbc_board_config_results.mk
266endif
267$(call dump-phase-end, build/make/core/board_config.mk)
268
269ifneq (,$(and $(TARGET_ARCH),$(TARGET_ARCH_SUITE)))
270  $(error $(board_config_mk) erroneously sets both TARGET_ARCH and TARGET_ARCH_SUITE)
271endif
272ifeq ($(TARGET_ARCH)$(TARGET_ARCH_SUITE),)
273  $(error Target architectures not defined by board config: $(board_config_mk))
274endif
275ifeq ($(TARGET_CPU_ABI)$(TARGET_ARCH_SUITE),)
276  $(error TARGET_CPU_ABI not defined by board config: $(board_config_mk))
277endif
278
279ifneq ($(MALLOC_IMPL),)
280  $(warning *** Unsupported option MALLOC_IMPL defined by board config: $(board_config_mk).)
281  $(error Use `MALLOC_LOW_MEMORY := true` to use low-memory allocator config)
282endif
283board_config_mk :=
284
285# Clean up and verify BoardConfig variables
286$(foreach var,$(_board_strip_readonly_list),$(eval $(var) := $$(strip $$($(var)))))
287$(foreach var,$(_board_strip_list),$(eval $(var) := $$(strip $$($(var)))))
288$(foreach var,$(_board_true_false_vars), \
289  $(if $(filter-out true false,$($(var))), \
290    $(error Valid values of $(var) are "true", "false", and "". Not "$($(var))")))
291
292include $(BUILD_SYSTEM)/board_config_wifi.mk
293-include external/wpa_supplicant_8/board_config_wpa_supplicant.mk
294
295# Set up soong config for "soong_config_value_variable".
296-include hardware/interfaces/configstore/1.1/default/surfaceflinger.mk
297-include vendor/google/build/soong/soong_config_namespace/camera.mk
298
299# Default *_CPU_VARIANT_RUNTIME to CPU_VARIANT if unspecified.
300TARGET_CPU_VARIANT_RUNTIME := $(or $(TARGET_CPU_VARIANT_RUNTIME),$(TARGET_CPU_VARIANT))
301TARGET_2ND_CPU_VARIANT_RUNTIME := $(or $(TARGET_2ND_CPU_VARIANT_RUNTIME),$(TARGET_2ND_CPU_VARIANT))
302
303ifdef TARGET_ARCH
304  # The combo makefiles check and set defaults for various CPU configuration
305  combo_target := TARGET_
306  combo_2nd_arch_prefix :=
307  include $(BUILD_SYSTEM)/combo/select.mk
308endif
309
310ifdef TARGET_2ND_ARCH
311  combo_2nd_arch_prefix := $(TARGET_2ND_ARCH_VAR_PREFIX)
312  include $(BUILD_SYSTEM)/combo/select.mk
313endif
314
315.KATI_READONLY := $(_board_strip_readonly_list)
316
317INTERNAL_KERNEL_CMDLINE := $(BOARD_KERNEL_CMDLINE)
318ifneq (,$(BOARD_BOOTCONFIG)$(BOARD_BOOTCONFIG_FILE))
319  INTERNAL_KERNEL_CMDLINE += bootconfig
320  INTERNAL_BOOTCONFIG := $(BOARD_BOOTCONFIG)
321  INTERNAL_BOOTCONFIG_FILE := $(BOARD_BOOTCONFIG_FILE)
322endif
323
324ifneq ($(filter %64,$(TARGET_ARCH)),)
325  TARGET_IS_64_BIT := true
326endif
327
328ifeq (,$(filter true,$(TARGET_SUPPORTS_32_BIT_APPS) $(TARGET_SUPPORTS_64_BIT_APPS)))
329  TARGET_SUPPORTS_32_BIT_APPS := true
330endif
331
332# Quick check to warn about likely cryptic errors later in the build.
333ifeq ($(TARGET_IS_64_BIT),true)
334  ifeq (,$(filter true false,$(TARGET_SUPPORTS_64_BIT_APPS)))
335    $(error Building a 32-bit-app-only product on a 64-bit device. \
336      If this is intentional, set TARGET_SUPPORTS_64_BIT_APPS := false)
337  endif
338endif
339
340# "ro.product.cpu.abilist32" and "ro.product.cpu.abilist64" are
341# comma separated lists of the 32 and 64 bit ABIs (in order of
342# preference) that the target supports. If TARGET_CPU_ABI_LIST_{32,64}_BIT
343# are defined by the board config, we use them. Else, we construct
344# these lists based on whether TARGET_IS_64_BIT is set.
345#
346# Note that this assumes that the 2ND_CPU_ABI for a 64 bit target
347# is always 32 bits. If this isn't the case, these variables should
348# be overriden in the board configuration.
349#
350# Similarly, TARGET_NATIVE_BRIDGE_2ND_ABI for a 64 bit target is always
351# 32 bits. Note that all CPU_ABIs are preferred over all NATIVE_BRIDGE_ABIs.
352_target_native_bridge_abi_list_32_bit :=
353_target_native_bridge_abi_list_64_bit :=
354
355ifeq (,$(TARGET_CPU_ABI_LIST_64_BIT))
356  ifeq (true|true,$(TARGET_IS_64_BIT)|$(TARGET_SUPPORTS_64_BIT_APPS))
357    TARGET_CPU_ABI_LIST_64_BIT := $(TARGET_CPU_ABI) $(TARGET_CPU_ABI2)
358    _target_native_bridge_abi_list_64_bit := $(TARGET_NATIVE_BRIDGE_ABI)
359  endif
360endif
361
362# "arm64-v8a-hwasan", the ABI for libraries compiled with HWASAN, is supported
363# in all builds with SANITIZE_TARGET=hwaddress.
364ifneq ($(filter hwaddress,$(SANITIZE_TARGET)),)
365  ifneq ($(filter arm64-v8a,$(TARGET_CPU_ABI_LIST_64_BIT)),)
366    TARGET_CPU_ABI_LIST_64_BIT := arm64-v8a-hwasan $(TARGET_CPU_ABI_LIST_64_BIT)
367  endif
368endif
369
370ifeq (,$(TARGET_CPU_ABI_LIST_32_BIT))
371  ifneq (true,$(TARGET_IS_64_BIT))
372    TARGET_CPU_ABI_LIST_32_BIT := $(TARGET_CPU_ABI) $(TARGET_CPU_ABI2)
373    _target_native_bridge_abi_list_32_bit := $(TARGET_NATIVE_BRIDGE_ABI)
374  else
375    ifeq (true,$(TARGET_SUPPORTS_32_BIT_APPS))
376      # For a 64 bit target, assume that the 2ND_CPU_ABI
377      # is a 32 bit ABI.
378      TARGET_CPU_ABI_LIST_32_BIT := $(TARGET_2ND_CPU_ABI) $(TARGET_2ND_CPU_ABI2)
379      _target_native_bridge_abi_list_32_bit := $(TARGET_NATIVE_BRIDGE_2ND_ABI)
380    endif
381  endif
382endif
383
384# "ro.product.cpu.abilist" is a comma separated list of ABIs (in order
385# of preference) that the target supports. If a TARGET_CPU_ABI_LIST
386# is specified by the board configuration, we use that. If not, we
387# build a list out of the TARGET_CPU_ABIs specified by the config.
388# Add NATIVE_BRIDGE_ABIs at the end to keep order of preference.
389ifeq (,$(TARGET_CPU_ABI_LIST))
390  TARGET_CPU_ABI_LIST := $(TARGET_CPU_ABI_LIST_64_BIT) $(TARGET_CPU_ABI_LIST_32_BIT) \
391                         $(_target_native_bridge_abi_list_64_bit) $(_target_native_bridge_abi_list_32_bit)
392endif
393
394# Add NATIVE_BRIDGE_ABIs at the end of 32 and 64 bit CPU_ABIs to keep order of preference.
395TARGET_CPU_ABI_LIST_32_BIT += $(_target_native_bridge_abi_list_32_bit)
396TARGET_CPU_ABI_LIST_64_BIT += $(_target_native_bridge_abi_list_64_bit)
397
398# Strip whitespace from the ABI list string.
399TARGET_CPU_ABI_LIST := $(subst $(space),$(comma),$(strip $(TARGET_CPU_ABI_LIST)))
400TARGET_CPU_ABI_LIST_32_BIT := $(subst $(space),$(comma),$(strip $(TARGET_CPU_ABI_LIST_32_BIT)))
401TARGET_CPU_ABI_LIST_64_BIT := $(subst $(space),$(comma),$(strip $(TARGET_CPU_ABI_LIST_64_BIT)))
402
403# Check if config about image building is valid or not.
404define check_image_config
405  $(eval _uc_name := $(call to-upper,$(1))) \
406  $(eval _lc_name := $(call to-lower,$(1))) \
407  $(if $(filter $(_lc_name),$(TARGET_COPY_OUT_$(_uc_name))), \
408    $(if $(BOARD_USES_$(_uc_name)IMAGE),, \
409      $(error If TARGET_COPY_OUT_$(_uc_name) is '$(_lc_name)', either BOARD_PREBUILT_$(_uc_name)IMAGE or BOARD_$(_uc_name)IMAGE_FILE_SYSTEM_TYPE must be set)), \
410  $(if $(BOARD_USES_$(_uc_name)IMAGE), \
411    $(error TARGET_COPY_OUT_$(_uc_name) must be set to '$(_lc_name)' to use a $(_lc_name) image))) \
412  $(eval _uc_name :=) \
413  $(eval _lc_name :=)
414endef
415
416###########################################
417# Configure whether we're building the system image
418BUILDING_SYSTEM_IMAGE := true
419ifeq ($(PRODUCT_BUILD_SYSTEM_IMAGE),)
420  ifndef PRODUCT_USE_DYNAMIC_PARTITION_SIZE
421    ifndef BOARD_SYSTEMIMAGE_PARTITION_SIZE
422      BUILDING_SYSTEM_IMAGE :=
423    endif
424  endif
425else ifeq ($(PRODUCT_BUILD_SYSTEM_IMAGE),false)
426  BUILDING_SYSTEM_IMAGE :=
427endif
428.KATI_READONLY := BUILDING_SYSTEM_IMAGE
429
430# Are we building a system_other image
431BUILDING_SYSTEM_OTHER_IMAGE :=
432ifeq ($(PRODUCT_BUILD_SYSTEM_OTHER_IMAGE),)
433  ifdef BUILDING_SYSTEM_IMAGE
434    ifeq ($(BOARD_USES_SYSTEM_OTHER_ODEX),true)
435      BUILDING_SYSTEM_OTHER_IMAGE := true
436    endif
437  endif
438else ifeq ($(PRODUCT_BUILD_SYSTEM_OTHER_IMAGE),true)
439  BUILDING_SYSTEM_OTHER_IMAGE := true
440  ifndef BUILDING_SYSTEM_IMAGE
441    $(error PRODUCT_BUILD_SYSTEM_OTHER_IMAGE = true requires building the system image)
442  endif
443endif
444.KATI_READONLY := BUILDING_SYSTEM_OTHER_IMAGE
445
446# Are we building a cache image
447BUILDING_CACHE_IMAGE :=
448ifeq ($(PRODUCT_BUILD_CACHE_IMAGE),)
449  ifdef BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE
450    BUILDING_CACHE_IMAGE := true
451  endif
452else ifeq ($(PRODUCT_BUILD_CACHE_IMAGE),true)
453  BUILDING_CACHE_IMAGE := true
454  ifndef BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE
455    $(error PRODUCT_BUILD_CACHE_IMAGE set to true, but BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE not defined)
456  endif
457endif
458.KATI_READONLY := BUILDING_CACHE_IMAGE
459
460# Are we building a boot image
461BUILDING_BOOT_IMAGE :=
462ifeq ($(PRODUCT_BUILD_BOOT_IMAGE),)
463  ifeq ($(BOARD_USES_RECOVERY_AS_BOOT),true)
464    BUILDING_BOOT_IMAGE :=
465  else ifdef BOARD_PREBUILT_BOOTIMAGE
466    BUILDING_BOOT_IMAGE :=
467  else ifdef BOARD_BOOTIMAGE_PARTITION_SIZE
468    BUILDING_BOOT_IMAGE := true
469  else ifneq (,$(foreach kernel,$(BOARD_KERNEL_BINARIES),$(BOARD_$(call to-upper,$(kernel))_BOOTIMAGE_PARTITION_SIZE)))
470    BUILDING_BOOT_IMAGE := true
471  endif
472else ifeq ($(PRODUCT_BUILD_BOOT_IMAGE),true)
473  ifeq ($(BOARD_USES_RECOVERY_AS_BOOT),true)
474    $(warning *** PRODUCT_BUILD_BOOT_IMAGE is true, but so is BOARD_USES_RECOVERY_AS_BOOT.)
475    $(warning *** Skipping building boot image.)
476    BUILDING_BOOT_IMAGE :=
477  else
478    BUILDING_BOOT_IMAGE := true
479  endif
480endif
481.KATI_READONLY := BUILDING_BOOT_IMAGE
482
483# Are we building an init boot image
484BUILDING_INIT_BOOT_IMAGE :=
485ifeq ($(PRODUCT_BUILD_INIT_BOOT_IMAGE),)
486  ifeq ($(BOARD_USES_RECOVERY_AS_BOOT),true)
487    BUILDING_INIT_BOOT_IMAGE :=
488  else ifdef BOARD_PREBUILT_INIT_BOOT_IMAGE
489    BUILDING_INIT_BOOT_IMAGE :=
490  else ifdef BOARD_INIT_BOOT_IMAGE_PARTITION_SIZE
491    BUILDING_INIT_BOOT_IMAGE := true
492  endif
493else ifeq ($(PRODUCT_BUILD_INIT_BOOT_IMAGE),true)
494  ifeq ($(BOARD_USES_RECOVERY_AS_BOOT),true)
495    $(error PRODUCT_BUILD_INIT_BOOT_IMAGE is true, but so is BOARD_USES_RECOVERY_AS_BOOT. Use only one option.)
496  else
497    BUILDING_INIT_BOOT_IMAGE := true
498  endif
499endif
500.KATI_READONLY := BUILDING_INIT_BOOT_IMAGE
501
502# Are we building a recovery image
503BUILDING_RECOVERY_IMAGE :=
504ifeq ($(PRODUCT_BUILD_RECOVERY_IMAGE),)
505  ifeq ($(BOARD_USES_RECOVERY_AS_BOOT),true)
506    BUILDING_RECOVERY_IMAGE := true
507  else ifeq ($(BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT),true)
508    # Set to true to build recovery resources for vendor_boot
509    BUILDING_RECOVERY_IMAGE := true
510  else ifdef BOARD_RECOVERYIMAGE_PARTITION_SIZE
511    ifeq (,$(filter true, $(TARGET_NO_KERNEL) $(TARGET_NO_RECOVERY)))
512      BUILDING_RECOVERY_IMAGE := true
513    endif
514  endif
515else ifeq ($(PRODUCT_BUILD_RECOVERY_IMAGE),true)
516  BUILDING_RECOVERY_IMAGE := true
517endif
518.KATI_READONLY := BUILDING_RECOVERY_IMAGE
519
520# Are we building a vendor boot image
521BUILDING_VENDOR_BOOT_IMAGE :=
522ifdef BOARD_BOOT_HEADER_VERSION
523  ifneq ($(call math_gt_or_eq,$(BOARD_BOOT_HEADER_VERSION),3),)
524    ifeq ($(PRODUCT_BUILD_VENDOR_BOOT_IMAGE),)
525      BUILDING_VENDOR_BOOT_IMAGE := true
526    else ifeq ($(PRODUCT_BUILD_VENDOR_BOOT_IMAGE),true)
527      BUILDING_VENDOR_BOOT_IMAGE := true
528    endif
529  endif
530endif
531.KATI_READONLY := BUILDING_VENDOR_BOOT_IMAGE
532
533# Are we building a vendor kernel boot image
534BUILDING_VENDOR_KERNEL_BOOT_IMAGE :=
535ifeq ($(PRODUCT_BUILD_VENDOR_KERNEL_BOOT_IMAGE),true)
536  ifneq ($(BUILDING_VENDOR_BOOT_IMAGE),true)
537    $(error BUILDING_VENDOR_BOOT_IMAGE is required, but BUILDING_VENDOR_BOOT_IMAGE is not true)
538  endif
539  ifndef BOARD_VENDOR_KERNEL_BOOTIMAGE_PARTITION_SIZE
540    $(error BOARD_VENDOR_KERNEL_BOOTIMAGE_PARTITION_SIZE is required when PRODUCT_BUILD_VENDOR_KERNEL_BOOT_IMAGE is true)
541  endif
542  BUILDING_VENDOR_KERNEL_BOOT_IMAGE := true
543else ifeq ($(PRODUCT_BUILD_VENDOR_KERNEL),)
544  ifdef BOARD_VENDOR_KERNEL_BOOTIMAGE_PARTITION_SIZE
545    ifeq ($(BUILDING_VENDOR_BOOT_IMAGE),true)
546      BUILDING_VENDOR_KERNEL_BOOT_IMAGE := true
547    endif
548  endif
549endif # end of PRODUCT_BUILD_VENDOR_KERNEL_BOOT_IMAGE
550.KATI_READONLY := BUILDING_VENDOR_KERNEL_BOOT_IMAGE
551
552# Are we building a ramdisk image
553BUILDING_RAMDISK_IMAGE := true
554ifeq ($(PRODUCT_BUILD_RAMDISK_IMAGE),)
555  # TODO: Be smarter about this. This probably only needs to happen when one of the follow is true:
556  #  BUILDING_BOOT_IMAGE
557  #  BUILDING_RECOVERY_IMAGE
558else ifeq ($(PRODUCT_BUILD_RAMDISK_IMAGE),false)
559  BUILDING_RAMDISK_IMAGE :=
560endif
561.KATI_READONLY := BUILDING_RAMDISK_IMAGE
562
563# Are we building a debug vendor_boot image
564BUILDING_DEBUG_VENDOR_BOOT_IMAGE :=
565# Can't build vendor_boot-debug.img if we're not building a ramdisk.
566ifndef BUILDING_RAMDISK_IMAGE
567  ifeq ($(PRODUCT_BUILD_DEBUG_VENDOR_BOOT_IMAGE),true)
568    $(warning PRODUCT_BUILD_DEBUG_VENDOR_BOOT_IMAGE is true, but we're not building a ramdisk image. \
569      Skip building the debug vendor_boot image.)
570  endif
571# Can't build vendor_boot-debug.img if we're not building a vendor_boot.img.
572else ifndef BUILDING_VENDOR_BOOT_IMAGE
573  ifeq ($(PRODUCT_BUILD_DEBUG_VENDOR_BOOT_IMAGE),true)
574    $(warning PRODUCT_BUILD_DEBUG_VENDOR_BOOT_IMAGE is true, but we're not building a vendor_boot image. \
575      Skip building the debug vendor_boot image.)
576  endif
577else
578  ifeq ($(PRODUCT_BUILD_DEBUG_VENDOR_BOOT_IMAGE),)
579    BUILDING_DEBUG_VENDOR_BOOT_IMAGE := true
580  else ifeq ($(PRODUCT_BUILD_DEBUG_VENDOR_BOOT_IMAGE),true)
581    BUILDING_DEBUG_VENDOR_BOOT_IMAGE := true
582  endif
583endif
584.KATI_READONLY := BUILDING_DEBUG_VENDOR_BOOT_IMAGE
585
586_has_boot_img_artifact :=
587ifneq ($(strip $(TARGET_NO_KERNEL)),true)
588  ifdef BUILDING_BOOT_IMAGE
589    _has_boot_img_artifact := true
590  endif
591  # BUILDING_RECOVERY_IMAGE && BOARD_USES_RECOVERY_AS_BOOT implies that
592  # recovery is being built with the file name *boot.img*, which still counts
593  # as "building boot.img".
594  ifdef BUILDING_RECOVERY_IMAGE
595    ifeq ($(BOARD_USES_RECOVERY_AS_BOOT),true)
596      _has_boot_img_artifact := true
597    endif
598  endif
599endif
600
601# Are we building a debug boot image
602BUILDING_DEBUG_BOOT_IMAGE :=
603# Can't build boot-debug.img if we're not building a ramdisk.
604ifndef BUILDING_RAMDISK_IMAGE
605  ifeq ($(PRODUCT_BUILD_DEBUG_BOOT_IMAGE),true)
606    $(warning PRODUCT_BUILD_DEBUG_BOOT_IMAGE is true, but we're not building a ramdisk image. \
607      Skip building the debug boot image.)
608  endif
609# Can't build boot-debug.img if we're not building a boot.img.
610else ifndef _has_boot_img_artifact
611  ifeq ($(PRODUCT_BUILD_DEBUG_BOOT_IMAGE),true)
612    $(warning PRODUCT_BUILD_DEBUG_BOOT_IMAGE is true, but we're not building a boot image. \
613      Skip building the debug boot image.)
614  endif
615else ifdef BUILDING_INIT_BOOT_IMAGE
616  ifeq ($(PRODUCT_BUILD_DEBUG_BOOT_IMAGE),true)
617    $(warning PRODUCT_BUILD_DEBUG_BOOT_IMAGE is true, but we don't have a ramdisk in the boot image. \
618      Skip building the debug boot image.)
619  endif
620else
621  ifeq ($(PRODUCT_BUILD_DEBUG_BOOT_IMAGE),)
622    BUILDING_DEBUG_BOOT_IMAGE := true
623    # Don't build boot-debug.img if we're already building vendor_boot-debug.img.
624    ifdef BUILDING_DEBUG_VENDOR_BOOT_IMAGE
625      BUILDING_DEBUG_BOOT_IMAGE :=
626    endif
627  else ifeq ($(PRODUCT_BUILD_DEBUG_BOOT_IMAGE),true)
628    BUILDING_DEBUG_BOOT_IMAGE := true
629  endif
630endif
631.KATI_READONLY := BUILDING_DEBUG_BOOT_IMAGE
632_has_boot_img_artifact :=
633
634# Are we building a userdata image
635BUILDING_USERDATA_IMAGE :=
636ifeq ($(PRODUCT_BUILD_USERDATA_IMAGE),)
637  ifdef BOARD_USERDATAIMAGE_PARTITION_SIZE
638    BUILDING_USERDATA_IMAGE := true
639  endif
640else ifeq ($(PRODUCT_BUILD_USERDATA_IMAGE),true)
641  BUILDING_USERDATA_IMAGE := true
642endif
643.KATI_READONLY := BUILDING_USERDATA_IMAGE
644
645# Are we building a vbmeta image
646BUILDING_VBMETA_IMAGE := true
647ifeq ($(PRODUCT_BUILD_VBMETA_IMAGE),false)
648  BUILDING_VBMETA_IMAGE :=
649endif
650.KATI_READONLY := BUILDING_VBMETA_IMAGE
651
652# Are we building a super_empty image
653BUILDING_SUPER_EMPTY_IMAGE :=
654ifeq ($(PRODUCT_BUILD_SUPER_EMPTY_IMAGE),)
655  ifeq (true,$(PRODUCT_USE_DYNAMIC_PARTITIONS))
656    ifneq ($(BOARD_SUPER_PARTITION_SIZE),)
657      BUILDING_SUPER_EMPTY_IMAGE := true
658    endif
659  endif
660else ifeq ($(PRODUCT_BUILD_SUPER_EMPTY_IMAGE),true)
661  ifneq (true,$(PRODUCT_USE_DYNAMIC_PARTITIONS))
662    $(error PRODUCT_BUILD_SUPER_EMPTY_IMAGE set to true, but PRODUCT_USE_DYNAMIC_PARTITIONS is not true)
663  endif
664  ifeq ($(BOARD_SUPER_PARTITION_SIZE),)
665    $(error PRODUCT_BUILD_SUPER_EMPTY_IMAGE set to true, but BOARD_SUPER_PARTITION_SIZE is not defined)
666  endif
667  BUILDING_SUPER_EMPTY_IMAGE := true
668endif
669.KATI_READONLY := BUILDING_SUPER_EMPTY_IMAGE
670
671###########################################
672# Now we can substitute with the real value of TARGET_COPY_OUT_VENDOR
673ifeq ($(TARGET_COPY_OUT_VENDOR),$(_vendor_path_placeholder))
674  TARGET_COPY_OUT_VENDOR := system/vendor
675else ifeq ($(filter vendor system/vendor,$(TARGET_COPY_OUT_VENDOR)),)
676  $(error TARGET_COPY_OUT_VENDOR must be either 'vendor' or 'system/vendor', seeing '$(TARGET_COPY_OUT_VENDOR)'.)
677endif
678PRODUCT_COPY_FILES := $(subst $(_vendor_path_placeholder),$(TARGET_COPY_OUT_VENDOR),$(PRODUCT_COPY_FILES))
679
680BOARD_USES_VENDORIMAGE :=
681ifdef BOARD_PREBUILT_VENDORIMAGE
682  BOARD_USES_VENDORIMAGE := true
683endif
684ifdef BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE
685  BOARD_USES_VENDORIMAGE := true
686endif
687# TODO(b/137169253): For now, some AOSP targets build with prebuilt vendor image.
688# But target's BOARD_PREBUILT_VENDORIMAGE is not filled.
689ifeq ($(TARGET_COPY_OUT_VENDOR),vendor)
690  BOARD_USES_VENDORIMAGE := true
691else ifdef BOARD_USES_VENDORIMAGE
692  $(error TARGET_COPY_OUT_VENDOR must be set to 'vendor' to use a vendor image)
693endif
694.KATI_READONLY := BOARD_USES_VENDORIMAGE
695
696BUILDING_VENDOR_IMAGE :=
697ifeq ($(PRODUCT_BUILD_VENDOR_IMAGE),)
698  ifdef BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE
699    BUILDING_VENDOR_IMAGE := true
700  endif
701else ifeq ($(PRODUCT_BUILD_VENDOR_IMAGE),true)
702  BUILDING_VENDOR_IMAGE := true
703  ifndef BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE
704    $(error PRODUCT_BUILD_VENDOR_IMAGE set to true, but BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE not defined)
705  endif
706endif
707ifdef BOARD_PREBUILT_VENDORIMAGE
708  BUILDING_VENDOR_IMAGE :=
709endif
710.KATI_READONLY := BUILDING_VENDOR_IMAGE
711
712###########################################
713# Now we can substitute with the real value of TARGET_COPY_OUT_PRODUCT
714ifeq ($(TARGET_COPY_OUT_PRODUCT),$(_product_path_placeholder))
715TARGET_COPY_OUT_PRODUCT := system/product
716else ifeq ($(filter product system/product,$(TARGET_COPY_OUT_PRODUCT)),)
717$(error TARGET_COPY_OUT_PRODUCT must be either 'product' or 'system/product', seeing '$(TARGET_COPY_OUT_PRODUCT)'.)
718endif
719PRODUCT_COPY_FILES := $(subst $(_product_path_placeholder),$(TARGET_COPY_OUT_PRODUCT),$(PRODUCT_COPY_FILES))
720
721BOARD_USES_PRODUCTIMAGE :=
722ifdef BOARD_PREBUILT_PRODUCTIMAGE
723  BOARD_USES_PRODUCTIMAGE := true
724endif
725ifdef BOARD_PRODUCTIMAGE_FILE_SYSTEM_TYPE
726  BOARD_USES_PRODUCTIMAGE := true
727endif
728$(call check_image_config,product)
729.KATI_READONLY := BOARD_USES_PRODUCTIMAGE
730
731BUILDING_PRODUCT_IMAGE :=
732ifeq ($(PRODUCT_BUILD_PRODUCT_IMAGE),)
733  ifdef BOARD_PRODUCTIMAGE_FILE_SYSTEM_TYPE
734    BUILDING_PRODUCT_IMAGE := true
735  endif
736else ifeq ($(PRODUCT_BUILD_PRODUCT_IMAGE),true)
737  BUILDING_PRODUCT_IMAGE := true
738  ifndef BOARD_PRODUCTIMAGE_FILE_SYSTEM_TYPE
739    $(error PRODUCT_BUILD_PRODUCT_IMAGE set to true, but BOARD_PRODUCTIMAGE_FILE_SYSTEM_TYPE not defined)
740  endif
741endif
742ifdef BOARD_PREBUILT_PRODUCTIMAGE
743  BUILDING_PRODUCT_IMAGE :=
744endif
745.KATI_READONLY := BUILDING_PRODUCT_IMAGE
746
747###########################################
748# TODO(b/135957588) TARGET_COPY_OUT_PRODUCT_SERVICES will be set to
749# TARGET_COPY_OUT_PRODUCT as a workaround.
750TARGET_COPY_OUT_PRODUCT_SERVICES := $(TARGET_COPY_OUT_PRODUCT)
751
752###########################################
753# Now we can substitute with the real value of TARGET_COPY_OUT_SYSTEM_EXT
754ifeq ($(TARGET_COPY_OUT_SYSTEM_EXT),$(_system_ext_path_placeholder))
755TARGET_COPY_OUT_SYSTEM_EXT := system/system_ext
756else ifeq ($(filter system_ext system/system_ext,$(TARGET_COPY_OUT_SYSTEM_EXT)),)
757$(error TARGET_COPY_OUT_SYSTEM_EXT must be either 'system_ext' or 'system/system_ext', seeing '$(TARGET_COPY_OUT_SYSTEM_EXT)'.)
758endif
759PRODUCT_COPY_FILES := $(subst $(_system_ext_path_placeholder),$(TARGET_COPY_OUT_SYSTEM_EXT),$(PRODUCT_COPY_FILES))
760
761BOARD_USES_SYSTEM_EXTIMAGE :=
762ifdef BOARD_PREBUILT_SYSTEM_EXTIMAGE
763  BOARD_USES_SYSTEM_EXTIMAGE := true
764endif
765ifdef BOARD_SYSTEM_EXTIMAGE_FILE_SYSTEM_TYPE
766  BOARD_USES_SYSTEM_EXTIMAGE := true
767endif
768$(call check_image_config,system_ext)
769.KATI_READONLY := BOARD_USES_SYSTEM_EXTIMAGE
770
771BUILDING_SYSTEM_EXT_IMAGE :=
772ifeq ($(PRODUCT_BUILD_SYSTEM_EXT_IMAGE),)
773  ifdef BOARD_SYSTEM_EXTIMAGE_FILE_SYSTEM_TYPE
774    BUILDING_SYSTEM_EXT_IMAGE := true
775  endif
776else ifeq ($(PRODUCT_BUILD_SYSTEM_EXT_IMAGE),true)
777  BUILDING_SYSTEM_EXT_IMAGE := true
778  ifndef BOARD_SYSTEM_EXTIMAGE_FILE_SYSTEM_TYPE
779    $(error PRODUCT_BUILD_SYSTEM_EXT_IMAGE set to true, but BOARD_SYSTEM_EXTIMAGE_FILE_SYSTEM_TYPE not defined)
780  endif
781endif
782ifdef BOARD_PREBUILT_SYSTEM_EXTIMAGE
783  BUILDING_SYSTEM_EXT_IMAGE :=
784endif
785.KATI_READONLY := BUILDING_SYSTEM_EXT_IMAGE
786
787###########################################
788# Now we can substitute with the real value of TARGET_COPY_OUT_VENDOR_DLKM
789ifeq ($(TARGET_COPY_OUT_VENDOR_DLKM),$(_vendor_dlkm_path_placeholder))
790  TARGET_COPY_OUT_VENDOR_DLKM := $(TARGET_COPY_OUT_VENDOR)/vendor_dlkm
791else ifeq ($(filter vendor_dlkm system/vendor/vendor_dlkm vendor/vendor_dlkm,$(TARGET_COPY_OUT_VENDOR_DLKM)),)
792  $(error TARGET_COPY_OUT_VENDOR_DLKM must be either 'vendor_dlkm', 'system/vendor/vendor_dlkm' or 'vendor/vendor_dlkm', seeing '$(TARGET_COPY_OUT_VENDOR_DLKM)'.)
793endif
794PRODUCT_COPY_FILES := $(subst $(_vendor_dlkm_path_placeholder),$(TARGET_COPY_OUT_VENDOR_DLKM),$(PRODUCT_COPY_FILES))
795
796BOARD_USES_VENDOR_DLKMIMAGE :=
797ifdef BOARD_PREBUILT_VENDOR_DLKMIMAGE
798  BOARD_USES_VENDOR_DLKMIMAGE := true
799endif
800ifdef BOARD_VENDOR_DLKMIMAGE_FILE_SYSTEM_TYPE
801  BOARD_USES_VENDOR_DLKMIMAGE := true
802endif
803$(call check_image_config,vendor_dlkm)
804
805BUILDING_VENDOR_DLKM_IMAGE :=
806ifeq ($(PRODUCT_BUILD_VENDOR_DLKM_IMAGE),)
807  ifdef BOARD_VENDOR_DLKMIMAGE_FILE_SYSTEM_TYPE
808    BUILDING_VENDOR_DLKM_IMAGE := true
809  endif
810else ifeq ($(PRODUCT_BUILD_VENDOR_DLKM_IMAGE),true)
811  BUILDING_VENDOR_DLKM_IMAGE := true
812  ifndef BOARD_VENDOR_DLKMIMAGE_FILE_SYSTEM_TYPE
813    $(error PRODUCT_BUILD_VENDOR_DLKM_IMAGE set to true, but BOARD_VENDOR_DLKMIMAGE_FILE_SYSTEM_TYPE not defined)
814  endif
815endif
816ifdef BOARD_PREBUILT_VENDOR_DLKMIMAGE
817  BUILDING_VENDOR_DLKM_IMAGE :=
818endif
819.KATI_READONLY := BUILDING_VENDOR_DLKM_IMAGE
820
821###########################################
822# Now we can substitute with the real value of TARGET_COPY_OUT_ODM
823ifeq ($(TARGET_COPY_OUT_ODM),$(_odm_path_placeholder))
824  TARGET_COPY_OUT_ODM := $(TARGET_COPY_OUT_VENDOR)/odm
825else ifeq ($(filter odm system/vendor/odm vendor/odm,$(TARGET_COPY_OUT_ODM)),)
826  $(error TARGET_COPY_OUT_ODM must be either 'odm', 'system/vendor/odm' or 'vendor/odm', seeing '$(TARGET_COPY_OUT_ODM)'.)
827endif
828PRODUCT_COPY_FILES := $(subst $(_odm_path_placeholder),$(TARGET_COPY_OUT_ODM),$(PRODUCT_COPY_FILES))
829
830BOARD_USES_ODMIMAGE :=
831ifdef BOARD_PREBUILT_ODMIMAGE
832  BOARD_USES_ODMIMAGE := true
833endif
834ifdef BOARD_ODMIMAGE_FILE_SYSTEM_TYPE
835  BOARD_USES_ODMIMAGE := true
836endif
837$(call check_image_config,odm)
838
839BUILDING_ODM_IMAGE :=
840ifeq ($(PRODUCT_BUILD_ODM_IMAGE),)
841  ifdef BOARD_ODMIMAGE_FILE_SYSTEM_TYPE
842    BUILDING_ODM_IMAGE := true
843  endif
844else ifeq ($(PRODUCT_BUILD_ODM_IMAGE),true)
845  BUILDING_ODM_IMAGE := true
846  ifndef BOARD_ODMIMAGE_FILE_SYSTEM_TYPE
847    $(error PRODUCT_BUILD_ODM_IMAGE set to true, but BOARD_ODMIMAGE_FILE_SYSTEM_TYPE not defined)
848  endif
849endif
850ifdef BOARD_PREBUILT_ODMIMAGE
851  BUILDING_ODM_IMAGE :=
852endif
853.KATI_READONLY := BUILDING_ODM_IMAGE
854
855
856###########################################
857# Now we can substitute with the real value of TARGET_COPY_OUT_ODM_DLKM
858ifeq ($(TARGET_COPY_OUT_ODM_DLKM),$(_odm_dlkm_path_placeholder))
859  TARGET_COPY_OUT_ODM_DLKM := $(TARGET_COPY_OUT_VENDOR)/odm_dlkm
860else ifeq ($(filter odm_dlkm system/vendor/odm_dlkm vendor/odm_dlkm,$(TARGET_COPY_OUT_ODM_DLKM)),)
861  $(error TARGET_COPY_OUT_ODM_DLKM must be either 'odm_dlkm', 'system/vendor/odm_dlkm' or 'vendor/odm_dlkm', seeing '$(TARGET_COPY_OUT_ODM_DLKM)'.)
862endif
863PRODUCT_COPY_FILES := $(subst $(_odm_dlkm_path_placeholder),$(TARGET_COPY_OUT_ODM_DLKM),$(PRODUCT_COPY_FILES))
864
865BOARD_USES_ODM_DLKMIMAGE :=
866ifdef BOARD_PREBUILT_ODM_DLKMIMAGE
867  BOARD_USES_ODM_DLKMIMAGE := true
868endif
869ifdef BOARD_ODM_DLKMIMAGE_FILE_SYSTEM_TYPE
870  BOARD_USES_ODM_DLKMIMAGE := true
871endif
872$(call check_image_config,odm_dlkm)
873
874BUILDING_ODM_DLKM_IMAGE :=
875ifeq ($(PRODUCT_BUILD_ODM_DLKM_IMAGE),)
876  ifdef BOARD_ODM_DLKMIMAGE_FILE_SYSTEM_TYPE
877    BUILDING_ODM_DLKM_IMAGE := true
878  endif
879else ifeq ($(PRODUCT_BUILD_ODM_DLKM_IMAGE),true)
880  BUILDING_ODM_DLKM_IMAGE := true
881  ifndef BOARD_ODM_DLKMIMAGE_FILE_SYSTEM_TYPE
882    $(error PRODUCT_BUILD_ODM_DLKM_IMAGE set to true, but BOARD_ODM_DLKMIMAGE_FILE_SYSTEM_TYPE not defined)
883  endif
884endif
885ifdef BOARD_PREBUILT_ODM_DLKMIMAGE
886  BUILDING_ODM_DLKM_IMAGE :=
887endif
888.KATI_READONLY := BUILDING_ODM_DLKM_IMAGE
889
890###########################################
891# Now we can substitute with the real value of TARGET_COPY_OUT_SYSTEM_DLKM
892ifeq ($(TARGET_COPY_OUT_SYSTEM_DLKM),$(_system_dlkm_path_placeholder))
893  TARGET_COPY_OUT_SYSTEM_DLKM := $(TARGET_COPY_OUT_SYSTEM)/system_dlkm
894else ifeq ($(filter system_dlkm system/system_dlkm,$(TARGET_COPY_OUT_SYSTEM_DLKM)),)
895  $(error TARGET_COPY_OUT_SYSTEM_DLKM must be either 'system_dlkm' or 'system/system_dlkm', seeing '$(TARGET_COPY_OUT_ODM_DLKM)'.)
896endif
897PRODUCT_COPY_FILES := $(subst $(_system_dlkm_path_placeholder),$(TARGET_COPY_OUT_SYSTEM_DLKM),$(PRODUCT_COPY_FILES))
898
899BOARD_USES_SYSTEM_DLKMIMAGE :=
900ifdef BOARD_PREBUILT_SYSTEM_DLKMIMAGE
901  BOARD_USES_SYSTEM_DLKMIMAGE := true
902endif
903ifdef BOARD_SYSTEM_DLKMIMAGE_FILE_SYSTEM_TYPE
904  BOARD_USES_SYSTEM_DLKMIMAGE := true
905endif
906$(call check_image_config,system_dlkm)
907
908BUILDING_SYSTEM_DLKM_IMAGE :=
909ifeq ($(PRODUCT_BUILD_SYSTEM_DLKM_IMAGE),)
910  ifdef BOARD_SYSTEM_DLKMIMAGE_FILE_SYSTEM_TYPE
911    BUILDING_SYSTEM_DLKM_IMAGE := true
912  endif
913else ifeq ($(PRODUCT_BUILD_SYSTEM_DLKM_IMAGE),true)
914  BUILDING_SYSTEM_DLKM_IMAGE := true
915  ifndef BOARD_SYSTEM_DLKMIMAGE_FILE_SYSTEM_TYPE
916    $(error PRODUCT_BUILD_SYSTEM_DLKM_IMAGE set to true, but BOARD_SYSTEM_DLKMIMAGE_FILE_SYSTEM_TYPE not defined)
917  endif
918endif
919ifdef BOARD_PREBUILT_SYSTEM_DLKMIMAGE
920  BUILDING_SYSTEM_DLKM_IMAGE :=
921endif
922.KATI_READONLY := BUILDING_SYSTEM_DLKM_IMAGE
923
924BOARD_USES_PVMFWIMAGE :=
925ifeq ($(PRODUCT_BUILD_PVMFW_IMAGE),true)
926  BOARD_USES_PVMFWIMAGE := true
927endif
928.KATI_READONLY := BOARD_USES_PVMFWIMAGE
929
930BOARD_USES_DESKTOP_RECOVERY_IMAGE :=
931ifeq ($(PRODUCT_BUILD_DESKTOP_RECOVERY_IMAGE),true)
932  BOARD_USES_DESKTOP_RECOVERY_IMAGE := true
933endif
934.KATI_READONLY := BOARD_USES_DESKTOP_RECOVERY_IMAGE
935
936BOARD_USES_DESKTOP_UPDATE_IMAGE :=
937ifeq ($(PRODUCT_BUILD_DESKTOP_UPDATE_IMAGE),true)
938  BOARD_USES_DESKTOP_UPDATE_IMAGE := true
939endif
940.KATI_READONLY := BOARD_USES_DESKTOP_UPDATE_IMAGE
941
942###########################################
943# Ensure consistency among TARGET_RECOVERY_UPDATER_LIBS, AB_OTA_UPDATER, and PRODUCT_OTA_FORCE_NON_AB_PACKAGE.
944TARGET_RECOVERY_UPDATER_LIBS ?=
945ifeq ($(AB_OTA_UPDATER),)
946AB_OTA_UPDATER := true
947endif
948.KATI_READONLY := TARGET_RECOVERY_UPDATER_LIBS AB_OTA_UPDATER
949
950# Ensure that if PRODUCT_OTA_FORCE_NON_AB_PACKAGE == true, then AB_OTA_UPDATER must be true
951ifeq ($(PRODUCT_OTA_FORCE_NON_AB_PACKAGE),true)
952  ifneq ($(AB_OTA_UPDATER),true)
953    $(error AB_OTA_UPDATER must be set to true when PRODUCT_OTA_FORCE_NON_AB_PACKAGE is true)
954  endif
955endif
956
957# In some configurations, A/B and non-A/B may coexist. Check TARGET_OTA_ALLOW_NON_AB
958# to see if non-A/B is supported.
959TARGET_OTA_ALLOW_NON_AB := false
960ifneq ($(AB_OTA_UPDATER),true)
961  TARGET_OTA_ALLOW_NON_AB := true
962else ifeq ($(PRODUCT_OTA_FORCE_NON_AB_PACKAGE),true)
963  TARGET_OTA_ALLOW_NON_AB := true
964endif
965.KATI_READONLY := TARGET_OTA_ALLOW_NON_AB
966
967ifneq ($(TARGET_OTA_ALLOW_NON_AB),true)
968  ifneq ($(strip $(TARGET_RECOVERY_UPDATER_LIBS)),)
969    $(error Do not use TARGET_RECOVERY_UPDATER_LIBS when using TARGET_OTA_ALLOW_NON_AB)
970  endif
971endif
972
973# For Non A/B full OTA, disable brotli compression.
974ifeq ($(TARGET_OTA_ALLOW_NON_AB),true)
975  BOARD_NON_AB_OTA_DISABLE_COMPRESSION := true
976endif
977
978# Quick check for building generic OTA packages. Currently it only supports A/B OTAs.
979ifeq ($(PRODUCT_BUILD_GENERIC_OTA_PACKAGE),true)
980  ifneq ($(AB_OTA_UPDATER),true)
981    $(error PRODUCT_BUILD_GENERIC_OTA_PACKAGE with 'AB_OTA_UPDATER != true' is not supported)
982  endif
983endif
984
985ifdef BOARD_PREBUILT_DTBIMAGE_DIR
986  ifneq ($(BOARD_INCLUDE_DTB_IN_BOOTIMG),true)
987    $(error BOARD_PREBUILT_DTBIMAGE_DIR with 'BOARD_INCLUDE_DTB_IN_BOOTIMG != true' is not supported)
988  endif
989endif
990
991# Check BOARD_VNDK_VERSION
992define check_vndk_version
993  $(eval vndk_path := prebuilts/vndk/v$(1)) \
994  $(if $(wildcard $(vndk_path)/*/Android.bp),,$(error VNDK version $(1) not found))
995endef
996
997TARGET_VENDOR_TEST_SUFFIX := /vendor
998
999ifeq (,$(TARGET_BUILD_UNBUNDLED))
1000ifdef PRODUCT_EXTRA_VNDK_VERSIONS
1001  $(foreach v,$(PRODUCT_EXTRA_VNDK_VERSIONS),$(call check_vndk_version,$(v)))
1002endif
1003endif
1004
1005# Ensure that BOARD_SYSTEMSDK_VERSIONS are all within PLATFORM_SYSTEMSDK_VERSIONS
1006_unsupported_systemsdk_versions := $(filter-out $(PLATFORM_SYSTEMSDK_VERSIONS),$(BOARD_SYSTEMSDK_VERSIONS))
1007ifneq (,$(_unsupported_systemsdk_versions))
1008  $(error System SDK versions '$(_unsupported_systemsdk_versions)' in BOARD_SYSTEMSDK_VERSIONS are not supported.\
1009          Supported versions are $(PLATFORM_SYSTEMSDK_VERSIONS))
1010endif
1011
1012###########################################
1013# BOARD_API_LEVEL for vendor API surface
1014ifdef RELEASE_BOARD_API_LEVEL
1015  ifdef BOARD_API_LEVEL
1016    $(error BOARD_API_LEVEL must not be set manually. The build system automatically sets this value.)
1017  endif
1018  BOARD_API_LEVEL := $(RELEASE_BOARD_API_LEVEL)
1019  .KATI_READONLY := BOARD_API_LEVEL
1020endif
1021
1022###########################################
1023# Handle BUILD_BROKEN_USES_BUILD_*
1024
1025$(foreach m,$(DEFAULT_WARNING_BUILD_MODULE_TYPES),\
1026  $(if $(filter false,$(BUILD_BROKEN_USES_$(m))),\
1027    $(KATI_obsolete_var $(m),Please convert to Soong),\
1028    $(KATI_deprecated_var $(m),Please convert to Soong)))
1029
1030$(if $(filter true,$(BUILD_BROKEN_USES_BUILD_COPY_HEADERS)),\
1031  $(KATI_deprecated_var BUILD_COPY_HEADERS,See $(CHANGES_URL)\#copy_headers),\
1032  $(KATI_obsolete_var BUILD_COPY_HEADERS,See $(CHANGES_URL)\#copy_headers))
1033
1034$(foreach m,$(filter-out BUILD_COPY_HEADERS,$(DEFAULT_ERROR_BUILD_MODULE_TYPES)),\
1035  $(if $(filter true,$(BUILD_BROKEN_USES_$(m))),\
1036    $(KATI_deprecated_var $(m),Please convert to Soong),\
1037    $(KATI_obsolete_var $(m),Please convert to Soong)))
1038
1039ifndef BUILDING_RECOVERY_IMAGE
1040  ifeq (true,$(BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE))
1041    $(error Should not set BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE if not building recovery image)
1042  endif
1043endif
1044
1045ifndef BUILDING_VENDOR_BOOT_IMAGE
1046  ifeq (true,$(BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT))
1047    $(error Should not set BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT if not building vendor_boot image)
1048  endif
1049  ifdef BOARD_VENDOR_RAMDISK_FRAGMENTS
1050    $(error Should not set BOARD_VENDOR_RAMDISK_FRAGMENTS if not building vendor_boot image)
1051  endif
1052else # BUILDING_VENDOR_BOOT_IMAGE
1053  ifneq (,$(call math_lt,$(BOARD_BOOT_HEADER_VERSION),4))
1054    ifdef BOARD_VENDOR_RAMDISK_FRAGMENTS
1055      $(error Should not set BOARD_VENDOR_RAMDISK_FRAGMENTS if \
1056        BOARD_BOOT_HEADER_VERSION is less than 4)
1057    endif
1058    ifeq (true,$(BOARD_INCLUDE_RECOVERY_RAMDISK_IN_VENDOR_BOOT))
1059      $(error Should not set BOARD_INCLUDE_RECOVERY_RAMDISK_IN_VENDOR_BOOT if \
1060        BOARD_BOOT_HEADER_VERSION is less than 4)
1061    endif
1062  endif
1063endif # BUILDING_VENDOR_BOOT_IMAGE
1064
1065ifneq ($(words $(BOARD_VENDOR_RAMDISK_FRAGMENTS)),$(words $(sort $(BOARD_VENDOR_RAMDISK_FRAGMENTS))))
1066  $(error BOARD_VENDOR_RAMDISK_FRAGMENTS has duplicate entries: $(BOARD_VENDOR_RAMDISK_FRAGMENTS))
1067endif
1068
1069ifeq (true,$(BOARD_INCLUDE_RECOVERY_RAMDISK_IN_VENDOR_BOOT))
1070  ifneq (true,$(BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT))
1071    $(error Should not set BOARD_INCLUDE_RECOVERY_RAMDISK_IN_VENDOR_BOOT if \
1072      BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT is not set)
1073  endif
1074endif
1075
1076# If BOARD_USES_GENERIC_KERNEL_IMAGE is set, BOARD_USES_RECOVERY_AS_BOOT must not be set.
1077# Devices without a dedicated recovery partition uses BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT to
1078# build recovery into vendor_boot.
1079ifeq (true,$(BOARD_USES_GENERIC_KERNEL_IMAGE))
1080  ifeq (true,$(BOARD_USES_RECOVERY_AS_BOOT))
1081    $(error BOARD_USES_RECOVERY_AS_BOOT cannot be true if BOARD_USES_GENERIC_KERNEL_IMAGE is true. \
1082      Use BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT instead)
1083  endif
1084endif
1085
1086ifeq (true,$(BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT))
1087  ifeq (true,$(BOARD_USES_RECOVERY_AS_BOOT))
1088    $(error BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT and BOARD_USES_RECOVERY_AS_BOOT cannot be \
1089      both true. Recovery resources should be installed to either boot or vendor_boot, but not both)
1090  endif
1091endif
1092