• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# This is included by the top-level Makefile.
2# It sets up standard variables based on the
3# current configuration and platform, which
4# are not specific to what is being built.
5
6ifndef KATI
7$(warning Directly using config.mk from make is no longer supported.)
8$(warning )
9$(warning If you are just attempting to build, you probably need to re-source envsetup.sh:)
10$(warning )
11$(warning $$ source build/envsetup.sh)
12$(warning )
13$(warning If you are attempting to emulate get_build_var, use one of the following:)
14$(warning $$ build/soong/soong_ui.bash --dumpvar-mode)
15$(warning $$ build/soong/soong_ui.bash --dumpvars-mode)
16$(warning )
17$(error done)
18endif
19
20BUILD_SYSTEM :=$= build/make/core
21BUILD_SYSTEM_COMMON :=$= build/make/common
22
23include $(BUILD_SYSTEM_COMMON)/core.mk
24
25# -----------------------------------------------------------------
26# Rules and functions to help copy important files to DIST_DIR
27# when requested. This must be included once only, and must be included before
28# soong_config (as soong_config calls make_vars-$(TARGET).mk, and soong may
29# propagate calls to dist-for-goals there).
30include $(BUILD_SYSTEM)/distdir.mk
31
32# Mark variables that should be coming as environment variables from soong_ui
33# as readonly
34.KATI_READONLY := OUT_DIR TMPDIR BUILD_DATETIME_FILE
35ifdef CALLED_FROM_SETUP
36  .KATI_READONLY := CALLED_FROM_SETUP
37endif
38ifdef KATI_PACKAGE_MK_DIR
39  .KATI_READONLY := KATI_PACKAGE_MK_DIR
40endif
41
42# Mark variables deprecated/obsolete
43CHANGES_URL := https://android.googlesource.com/platform/build/+/master/Changes.md
44.KATI_READONLY := CHANGES_URL
45$(KATI_obsolete_var PATH,Do not use PATH directly. See $(CHANGES_URL)#PATH)
46$(KATI_obsolete_var PYTHONPATH,Do not use PYTHONPATH directly. See $(CHANGES_URL)#PYTHONPATH)
47$(KATI_obsolete_var OUT,Use OUT_DIR instead. See $(CHANGES_URL)#OUT)
48$(KATI_obsolete_var ANDROID_HOST_OUT,Use HOST_OUT instead. See $(CHANGES_URL)#ANDROID_HOST_OUT)
49$(KATI_obsolete_var ANDROID_PRODUCT_OUT,Use PRODUCT_OUT instead. See $(CHANGES_URL)#ANDROID_PRODUCT_OUT)
50$(KATI_obsolete_var ANDROID_HOST_OUT_TESTCASES,Use HOST_OUT_TESTCASES instead. See $(CHANGES_URL)#ANDROID_HOST_OUT_TESTCASES)
51$(KATI_obsolete_var ANDROID_TARGET_OUT_TESTCASES,Use TARGET_OUT_TESTCASES instead. See $(CHANGES_URL)#ANDROID_TARGET_OUT_TESTCASES)
52$(KATI_obsolete_var ANDROID_BUILD_TOP,Use '.' instead. See $(CHANGES_URL)#ANDROID_BUILD_TOP)
53$(KATI_obsolete_var \
54  ANDROID_TOOLCHAIN \
55  ANDROID_TOOLCHAIN_2ND_ARCH \
56  ANDROID_DEV_SCRIPTS \
57  ANDROID_EMULATOR_PREBUILTS \
58  ANDROID_PRE_BUILD_PATHS \
59  ,See $(CHANGES_URL)#other_envsetup_variables)
60$(KATI_obsolete_var PRODUCT_COMPATIBILITY_MATRIX_LEVEL_OVERRIDE,Set FCM Version in device manifest instead. See $(CHANGES_URL)#PRODUCT_COMPATIBILITY_MATRIX_LEVEL_OVERRIDE)
61$(KATI_obsolete_var USE_CLANG_PLATFORM_BUILD,Clang is the only supported Android compiler. See $(CHANGES_URL)#USE_CLANG_PLATFORM_BUILD)
62$(KATI_obsolete_var BUILD_DROIDDOC,Droiddoc is only supported in Soong. See details on build/soong/java/droiddoc.go)
63$(KATI_obsolete_var BUILD_APIDIFF,Apidiff is only supported in Soong. See details on build/soong/java/droiddoc.go)
64$(KATI_obsolete_var \
65  DEFAULT_GCC_CPP_STD_VERSION \
66  HOST_GLOBAL_CFLAGS 2ND_HOST_GLOBAL_CFLAGS \
67  HOST_GLOBAL_CONLYFLAGS 2ND_HOST_GLOBAL_CONLYFLAGS \
68  HOST_GLOBAL_CPPFLAGS 2ND_HOST_GLOBAL_CPPFLAGS \
69  HOST_GLOBAL_LDFLAGS 2ND_HOST_GLOBAL_LDFLAGS \
70  HOST_GLOBAL_LLDFLAGS 2ND_HOST_GLOBAL_LLDFLAGS \
71  HOST_CLANG_SUPPORTED 2ND_HOST_CLANG_SUPPORTED \
72  HOST_CC 2ND_HOST_CC \
73  HOST_CXX 2ND_HOST_CXX \
74  HOST_CROSS_GLOBAL_CFLAGS 2ND_HOST_CROSS_GLOBAL_CFLAGS \
75  HOST_CROSS_GLOBAL_CONLYFLAGS 2ND_HOST_CROSS_GLOBAL_CONLYFLAGS \
76  HOST_CROSS_GLOBAL_CPPFLAGS 2ND_HOST_CROSS_GLOBAL_CPPFLAGS \
77  HOST_CROSS_GLOBAL_LDFLAGS 2ND_HOST_CROSS_GLOBAL_LDFLAGS \
78  HOST_CROSS_GLOBAL_LLDFLAGS 2ND_HOST_CROSS_GLOBAL_LLDFLAGS \
79  HOST_CROSS_CLANG_SUPPORTED 2ND_HOST_CROSS_CLANG_SUPPORTED \
80  HOST_CROSS_CC 2ND_HOST_CROSS_CC \
81  HOST_CROSS_CXX 2ND_HOST_CROSS_CXX \
82  TARGET_GLOBAL_CFLAGS 2ND_TARGET_GLOBAL_CFLAGS \
83  TARGET_GLOBAL_CONLYFLAGS 2ND_TARGET_GLOBAL_CONLYFLAGS \
84  TARGET_GLOBAL_CPPFLAGS 2ND_TARGET_GLOBAL_CPPFLAGS \
85  TARGET_GLOBAL_LDFLAGS 2ND_TARGET_GLOBAL_LDFLAGS \
86  TARGET_GLOBAL_LLDFLAGS 2ND_TARGET_GLOBAL_LLDFLAGS \
87  TARGET_CLANG_SUPPORTED 2ND_TARGET_CLANG_SUPPORTED \
88  TARGET_CC 2ND_TARGET_CC \
89  TARGET_CXX 2ND_TARGET_CXX \
90  TARGET_TOOLCHAIN_ROOT 2ND_TARGET_TOOLCHAIN_ROOT \
91  HOST_TOOLCHAIN_ROOT 2ND_HOST_TOOLCHAIN_ROOT \
92  HOST_CROSS_TOOLCHAIN_ROOT 2ND_HOST_CROSS_TOOLCHAIN_ROOT \
93  HOST_TOOLS_PREFIX 2ND_HOST_TOOLS_PREFIX \
94  HOST_CROSS_TOOLS_PREFIX 2ND_HOST_CROSS_TOOLS_PREFIX \
95  HOST_GCC_VERSION 2ND_HOST_GCC_VERSION \
96  HOST_CROSS_GCC_VERSION 2ND_HOST_CROSS_GCC_VERSION \
97  TARGET_NDK_GCC_VERSION 2ND_TARGET_NDK_GCC_VERSION \
98  GLOBAL_CFLAGS_NO_OVERRIDE GLOBAL_CPPFLAGS_NO_OVERRIDE \
99  ,GCC support has been removed. Use Clang instead)
100$(KATI_obsolete_var DIST_DIR dist_goal,Use dist-for-goals instead. See $(CHANGES_URL)#dist)
101$(KATI_obsolete_var TARGET_ANDROID_FILESYSTEM_CONFIG_H,Use TARGET_FS_CONFIG_GEN instead)
102$(KATI_deprecated_var USER,Use BUILD_USERNAME instead. See $(CHANGES_URL)#USER)
103$(KATI_obsolete_var TARGET_ROOT_OUT_SBIN,/sbin has been removed, use /system/bin instead)
104$(KATI_obsolete_var TARGET_ROOT_OUT_SBIN_UNSTRIPPED,/sbin has been removed, use /system/bin instead)
105$(KATI_obsolete_var BUILD_BROKEN_PHONY_TARGETS)
106$(KATI_obsolete_var BUILD_BROKEN_DUP_COPY_HEADERS)
107$(KATI_obsolete_var BUILD_BROKEN_ENG_DEBUG_TAGS)
108$(KATI_obsolete_export It is a global setting. See $(CHANGES_URL)#export_keyword)
109$(KATI_obsolete_var BUILD_BROKEN_ANDROIDMK_EXPORTS)
110$(KATI_obsolete_var PRODUCT_STATIC_BOOT_CONTROL_HAL,Use shared library module instead. See $(CHANGES_URL)#PRODUCT_STATIC_BOOT_CONTROL_HAL)
111$(KATI_obsolete_var \
112  ARCH_ARM_HAVE_ARMV7A \
113  ARCH_DSP_REV \
114  ARCH_HAVE_ALIGNED_DOUBLES \
115  ARCH_MIPS_HAS_DSP \
116  ARCH_MIPS_HAS_FPU \
117  ARCH_MIPS_REV6 \
118  ARCH_X86_HAVE_AES_NI \
119  ARCH_X86_HAVE_AVX \
120  ARCH_X86_HAVE_AVX2 \
121  ARCH_X86_HAVE_AVX512 \
122  ARCH_X86_HAVE_MOVBE \
123  ARCH_X86_HAVE_POPCNT \
124  ARCH_X86_HAVE_SSE4 \
125  ARCH_X86_HAVE_SSE4_2 \
126  ARCH_X86_HAVE_SSSE3 \
127)
128$(KATI_obsolete_var PRODUCT_IOT)
129$(KATI_obsolete_var MD5SUM)
130$(KATI_obsolete_var BOARD_HAL_STATIC_LIBRARIES, See $(CHANGES_URL)#BOARD_HAL_STATIC_LIBRARIES)
131$(KATI_obsolete_var LOCAL_HAL_STATIC_LIBRARIES, See $(CHANGES_URL)#BOARD_HAL_STATIC_LIBRARIES)
132$(KATI_obsolete_var \
133  TARGET_AUX_OS_VARIANT_LIST \
134  LOCAL_AUX_ARCH \
135  LOCAL_AUX_CPU \
136  LOCAL_AUX_OS \
137  LOCAL_AUX_OS_VARIANT \
138  LOCAL_AUX_SUBARCH \
139  LOCAL_AUX_TOOLCHAIN \
140  LOCAL_CUSTOM_BUILD_STEP_INPUT \
141  LOCAL_CUSTOM_BUILD_STEP_OUTPUT \
142  LOCAL_IS_AUX_MODULE \
143  ,AUX support has been removed)
144$(KATI_obsolete_var HOST_OUT_TEST_CONFIG TARGET_OUT_TEST_CONFIG LOCAL_TEST_CONFIG_OPTIONS)
145$(KATI_obsolete_var \
146  TARGET_PROJECT_INCLUDES \
147  2ND_TARGET_PROJECT_INCLUDES \
148  TARGET_PROJECT_SYSTEM_INCLUDES \
149  2ND_TARGET_PROJECT_SYSTEM_INCLUDES \
150  ,Project include variables have been removed)
151$(KATI_obsolete_var TARGET_PREFER_32_BIT TARGET_PREFER_32_BIT_APPS TARGET_PREFER_32_BIT_EXECUTABLES)
152$(KATI_obsolete_var PRODUCT_ARTIFACT_SYSTEM_CERTIFICATE_REQUIREMENT_WHITELIST,Use PRODUCT_ARTIFACT_SYSTEM_CERTIFICATE_REQUIREMENT_ALLOW_LIST)
153$(KATI_obsolete_var PRODUCT_ARTIFACT_PATH_REQUIREMENT_WHITELIST,Use PRODUCT_ARTIFACT_PATH_REQUIREMENT_ALLOWED_LIST)
154$(KATI_obsolete_var COVERAGE_PATHS,Use NATIVE_COVERAGE_PATHS instead)
155$(KATI_obsolete_var COVERAGE_EXCLUDE_PATHS,Use NATIVE_COVERAGE_EXCLUDE_PATHS instead)
156$(KATI_obsolete_var BOARD_VNDK_RUNTIME_DISABLE,VNDK-Lite is no longer supported)
157$(KATI_obsolete_var LOCAL_SANITIZE_BLACKLIST,Use LOCAL_SANITIZE_BLOCKLIST instead)
158$(KATI_obsolete_var BOARD_PLAT_PUBLIC_SEPOLICY_DIR,Use SYSTEM_EXT_PUBLIC_SEPOLICY_DIRS instead)
159$(KATI_obsolete_var BOARD_PLAT_PRIVATE_SEPOLICY_DIR,Use SYSTEM_EXT_PRIVATE_SEPOLICY_DIRS instead)
160$(KATI_obsolete_var TARGET_NO_VENDOR_BOOT,Use PRODUCT_BUILD_VENDOR_BOOT_IMAGE instead)
161$(KATI_obsolete_var PRODUCT_CHECK_ELF_FILES,Use BUILD_BROKEN_PREBUILT_ELF_FILES instead)
162$(KATI_obsolete_var ALL_GENERATED_SOURCES,ALL_GENERATED_SOURCES is no longer used)
163$(KATI_obsolete_var ALL_ORIGINAL_DYNAMIC_BINARIES,ALL_ORIGINAL_DYNAMIC_BINARIES is no longer used)
164$(KATI_obsolete_var PRODUCT_SUPPORTS_VERITY,VB 1.0 and related variables are no longer supported)
165$(KATI_obsolete_var PRODUCT_SUPPORTS_VERITY_FEC,VB 1.0 and related variables are no longer supported)
166$(KATI_obsolete_var PRODUCT_SUPPORTS_BOOT_SIGNER,VB 1.0 and related variables are no longer supported)
167$(KATI_obsolete_var PRODUCT_VERITY_SIGNING_KEY,VB 1.0 and related variables are no longer supported)
168$(KATI_obsolete_var BOARD_PREBUILT_PVMFWIMAGE,pvmfw.bin is now built in AOSP and custom versions are no longer supported)
169$(KATI_obsolete_var BUILDING_PVMFW_IMAGE,BUILDING_PVMFW_IMAGE is no longer used)
170$(KATI_obsolete_var BOARD_BUILD_SYSTEM_ROOT_IMAGE)
171
172# Used to force goals to build.  Only use for conditionally defined goals.
173.PHONY: FORCE
174FORCE:
175
176ORIGINAL_MAKECMDGOALS := $(MAKECMDGOALS)
177
178UNAME := $(shell uname -sm)
179
180SRC_TARGET_DIR := $(TOPDIR)build/make/target
181
182# Some specific paths to tools
183SRC_DROIDDOC_DIR := $(TOPDIR)build/make/tools/droiddoc
184
185# Mark some inputs as readonly
186ifdef TARGET_DEVICE_DIR
187  .KATI_READONLY := TARGET_DEVICE_DIR
188endif
189
190ONE_SHOT_MAKEFILE :=
191.KATI_READONLY := ONE_SHOT_MAKEFILE
192
193# Set up efficient math functions which are used in make.
194# Here since this file is included by envsetup as well as during build.
195include $(BUILD_SYSTEM_COMMON)/math.mk
196
197include $(BUILD_SYSTEM_COMMON)/strings.mk
198
199include $(BUILD_SYSTEM_COMMON)/json.mk
200
201# Various mappings to avoid hard-coding paths all over the place
202include $(BUILD_SYSTEM)/pathmap.mk
203
204# Allow projects to define their own globally-available variables
205include $(BUILD_SYSTEM)/project_definitions.mk
206
207# ###############################################################
208# Build system internal files
209# ###############################################################
210
211BUILD_COMBOS :=$= $(BUILD_SYSTEM)/combo
212
213CLEAR_VARS :=$= $(BUILD_SYSTEM)/clear_vars.mk
214
215BUILD_HOST_STATIC_LIBRARY :=$= $(BUILD_SYSTEM)/host_static_library.mk
216BUILD_HOST_SHARED_LIBRARY :=$= $(BUILD_SYSTEM)/host_shared_library.mk
217BUILD_STATIC_LIBRARY :=$= $(BUILD_SYSTEM)/static_library.mk
218BUILD_HEADER_LIBRARY :=$= $(BUILD_SYSTEM)/header_library.mk
219BUILD_SHARED_LIBRARY :=$= $(BUILD_SYSTEM)/shared_library.mk
220BUILD_EXECUTABLE :=$= $(BUILD_SYSTEM)/executable.mk
221BUILD_HOST_EXECUTABLE :=$= $(BUILD_SYSTEM)/host_executable.mk
222BUILD_PACKAGE :=$= $(BUILD_SYSTEM)/package.mk
223BUILD_PHONY_PACKAGE :=$= $(BUILD_SYSTEM)/phony_package.mk
224BUILD_RRO_PACKAGE :=$= $(BUILD_SYSTEM)/build_rro_package.mk
225BUILD_HOST_PREBUILT :=$= $(BUILD_SYSTEM)/host_prebuilt.mk
226BUILD_PREBUILT :=$= $(BUILD_SYSTEM)/prebuilt.mk
227BUILD_MULTI_PREBUILT :=$= $(BUILD_SYSTEM)/multi_prebuilt.mk
228BUILD_JAVA_LIBRARY :=$= $(BUILD_SYSTEM)/java_library.mk
229BUILD_STATIC_JAVA_LIBRARY :=$= $(BUILD_SYSTEM)/static_java_library.mk
230BUILD_HOST_JAVA_LIBRARY :=$= $(BUILD_SYSTEM)/host_java_library.mk
231BUILD_COPY_HEADERS :=$= $(BUILD_SYSTEM)/copy_headers.mk
232BUILD_NATIVE_TEST :=$= $(BUILD_SYSTEM)/native_test.mk
233BUILD_FUZZ_TEST :=$= $(BUILD_SYSTEM)/fuzz_test.mk
234
235BUILD_NOTICE_FILE :=$= $(BUILD_SYSTEM)/notice_files.mk
236BUILD_SBOM_GEN :=$= $(BUILD_SYSTEM)/sbom.mk
237
238include $(BUILD_SYSTEM)/deprecation.mk
239
240# ###############################################################
241# Parse out any modifier targets.
242# ###############################################################
243
244hide := @
245
246################################################################
247# Tools needed in product configuration makefiles.
248################################################################
249NORMALIZE_PATH := build/make/tools/normalize_path.py
250
251# $(1): the paths to be normalized
252define normalize-paths
253$(if $(1),$(shell $(NORMALIZE_PATH) $(1)))
254endef
255
256# ###############################################################
257# Set common values
258# ###############################################################
259
260# Initialize SOONG_CONFIG_NAMESPACES so that it isn't recursive.
261SOONG_CONFIG_NAMESPACES :=
262
263# TODO(asmundak): remove add_soong_config_namespace, add_soong_config_var,
264# and add_soong_config_var_value once all their usages are replaced with
265# soong_config_set/soong_config_append.
266
267# The add_soong_config_namespace function adds a namespace and initializes it
268# to be empty.
269# $1 is the namespace.
270# Ex: $(call add_soong_config_namespace,acme)
271
272define add_soong_config_namespace
273$(eval SOONG_CONFIG_NAMESPACES += $1) \
274$(eval SOONG_CONFIG_$(strip $1) :=)
275endef
276
277# The add_soong_config_var function adds a a list of soong config variables to
278# SOONG_CONFIG_*. The variables and their values are then available to a
279# soong_config_module_type in an Android.bp file.
280# $1 is the namespace. $2 is the list of variables.
281# Ex: $(call add_soong_config_var,acme,COOL_FEATURE_A COOL_FEATURE_B)
282define add_soong_config_var
283$(eval SOONG_CONFIG_$(strip $1) += $2) \
284$(foreach v,$(strip $2),$(eval SOONG_CONFIG_$(strip $1)_$v := $($v)))
285endef
286
287# The add_soong_config_var_value function defines a make variable and also adds
288# the variable to SOONG_CONFIG_*.
289# $1 is the namespace. $2 is the variable name. $3 is the variable value.
290# Ex: $(call add_soong_config_var_value,acme,COOL_FEATURE,true)
291
292define add_soong_config_var_value
293$(eval $2 := $3) \
294$(call add_soong_config_var,$1,$2)
295endef
296
297# Soong config namespace variables manipulation.
298#
299# internal utility to define a namespace and a variable in it.
300define soong_config_define_internal
301$(if $(filter $1,$(SOONG_CONFIG_NAMESPACES)),,$(eval SOONG_CONFIG_NAMESPACES:=$(SOONG_CONFIG_NAMESPACES) $1)) \
302$(if $(filter $2,$(SOONG_CONFIG_$(strip $1))),,$(eval SOONG_CONFIG_$(strip $1):=$(SOONG_CONFIG_$(strip $1)) $2))
303endef
304
305# soong_config_set defines the variable in the given Soong config namespace
306# and sets its value. If the namespace does not exist, it will be defined.
307# $1 is the namespace. $2 is the variable name. $3 is the variable value.
308# Ex: $(call soong_config_set,acme,COOL_FEATURE,true)
309define soong_config_set
310$(call soong_config_define_internal,$1,$2) \
311$(eval SOONG_CONFIG_$(strip $1)_$(strip $2):=$3)
312endef
313
314# soong_config_append appends to the value of the variable in the given Soong
315# config namespace. If the variable does not exist, it will be defined. If the
316# namespace does not  exist, it will be defined.
317# $1 is the namespace, $2 is the variable name, $3 is the value
318define soong_config_append
319$(call soong_config_define_internal,$1,$2) \
320$(eval SOONG_CONFIG_$(strip $1)_$(strip $2):=$(SOONG_CONFIG_$(strip $1)_$(strip $2)) $3)
321endef
322
323# soong_config_append gets to the value of the variable in the given Soong
324# config namespace. If the namespace or variables does not exist, an
325# empty string will be returned.
326# $1 is the namespace, $2 is the variable name
327define soong_config_get
328$(SOONG_CONFIG_$(strip $1)_$(strip $2))
329endef
330
331# Set the extensions used for various packages
332COMMON_PACKAGE_SUFFIX := .zip
333COMMON_JAVA_PACKAGE_SUFFIX := .jar
334COMMON_ANDROID_PACKAGE_SUFFIX := .apk
335
336ifdef TMPDIR
337JAVA_TMPDIR_ARG := -Djava.io.tmpdir=$(TMPDIR)
338else
339JAVA_TMPDIR_ARG :=
340endif
341
342# ###############################################################
343# Include sub-configuration files
344# ###############################################################
345
346# ---------------------------------------------------------------
347# Try to include buildspec.mk, which will try to set stuff up.
348# If this file doesn't exist, the environment variables will
349# be used, and if that doesn't work, then the default is an
350# arm build
351ifndef ANDROID_BUILDSPEC
352ANDROID_BUILDSPEC := $(TOPDIR)buildspec.mk
353endif
354-include $(ANDROID_BUILDSPEC)
355
356# ---------------------------------------------------------------
357# Define most of the global variables.  These are the ones that
358# are specific to the user's build configuration.
359include $(BUILD_SYSTEM)/envsetup.mk
360
361# Returns true if it is a low memory device, otherwise it returns false.
362define is-low-mem-device
363$(if $(findstring ro.config.low_ram=true,$(PRODUCT_PROPERTY_OVERRIDES)),true,\
364$(if $(findstring ro.config.low_ram=true,$(PRODUCT_DEFAULT_PROPERTY_OVERRIDES)),true,\
365$(if $(findstring ro.config.low_ram=true,$(PRODUCT_COMPATIBLE_PROPERTY_OVERRIDE)),true,\
366$(if $(findstring ro.config.low_ram=true,$(PRODUCT_COMPATIBLE_PROPERTY)),true,\
367$(if $(findstring ro.config.low_ram=true,$(PRODUCT_SYSTEM_DEFAULT_PROPERTIES)),true,\
368$(if $(findstring ro.config.low_ram=true,$(PRODUCT_SYSTEM_EXT_PROPERTIES)),true,\
369$(if $(findstring ro.config.low_ram=true,$(PRODUCT_PRODUCT_PROPERTIES)),true,\
370$(if $(findstring ro.config.low_ram=true,$(PRODUCT_VENDOR_PROPERTIES)),true,\
371$(if $(findstring ro.config.low_ram=true,$(PRODUCT_ODM_PROPERTIES)),true,false)))))))))
372endef
373
374# Get the board API level.
375board_api_level := $(PLATFORM_SDK_VERSION)
376ifdef BOARD_API_LEVEL
377  board_api_level := $(BOARD_API_LEVEL)
378else ifdef BOARD_SHIPPING_API_LEVEL
379  # Vendors with GRF must define BOARD_SHIPPING_API_LEVEL for the vendor API level.
380  board_api_level := $(BOARD_SHIPPING_API_LEVEL)
381endif
382
383# Calculate the VSR vendor API level.
384vsr_vendor_api_level := $(board_api_level)
385
386ifdef PRODUCT_SHIPPING_API_LEVEL
387  vsr_vendor_api_level := $(call math_min,$(PRODUCT_SHIPPING_API_LEVEL),$(board_api_level))
388endif
389
390# Set TARGET_MAX_PAGE_SIZE_SUPPORTED.
391ifdef PRODUCT_MAX_PAGE_SIZE_SUPPORTED
392  TARGET_MAX_PAGE_SIZE_SUPPORTED := $(PRODUCT_MAX_PAGE_SIZE_SUPPORTED)
393else ifeq ($(strip $(call is-low-mem-device)),true)
394  # Low memory device will have 4096 binary alignment.
395  TARGET_MAX_PAGE_SIZE_SUPPORTED := 4096
396else
397  # The default binary alignment for userspace is 4096.
398  TARGET_MAX_PAGE_SIZE_SUPPORTED := 4096
399  # When VSR vendor API level >= 34, binary alignment will be 65536.
400  ifeq ($(call math_gt_or_eq,$(vsr_vendor_api_level),34),true)
401      TARGET_MAX_PAGE_SIZE_SUPPORTED := 65536
402  endif
403endif
404.KATI_READONLY := TARGET_MAX_PAGE_SIZE_SUPPORTED
405
406# Pruned directory options used when using findleaves.py
407# See envsetup.mk for a description of SCAN_EXCLUDE_DIRS
408FIND_LEAVES_EXCLUDES := $(addprefix --prune=, $(SCAN_EXCLUDE_DIRS) .repo .git)
409
410# The build system exposes several variables for where to find the kernel
411# headers:
412#   TARGET_DEVICE_KERNEL_HEADERS is automatically created for the current
413#       device being built. It is set as $(TARGET_DEVICE_DIR)/kernel-headers,
414#       e.g. device/samsung/tuna/kernel-headers. This directory is not
415#       explicitly set by anyone, the build system always adds this subdir.
416#
417#   TARGET_BOARD_KERNEL_HEADERS is specified by the BoardConfig.mk file
418#       to allow other directories to be included. This is useful if there's
419#       some common place where a few headers are being kept for a group
420#       of devices. For example, device/<vendor>/common/kernel-headers could
421#       contain some headers for several of <vendor>'s devices.
422#
423#   TARGET_PRODUCT_KERNEL_HEADERS is generated by the product inheritance
424#       graph. This allows architecture products to provide headers for the
425#       devices using that architecture. For example,
426#       hardware/ti/omap4xxx/omap4.mk will specify
427#       PRODUCT_VENDOR_KERNEL_HEADERS variable that specify where the omap4
428#       specific headers are, e.g. hardware/ti/omap4xxx/kernel-headers.
429#       The build system then combines all the values specified by all the
430#       PRODUCT_VENDOR_KERNEL_HEADERS directives in the product inheritance
431#       tree and then exports a TARGET_PRODUCT_KERNEL_HEADERS variable.
432#
433# The layout of subdirs in any of the kernel-headers dir should mirror the
434# layout of the kernel include/ directory. For example,
435#     device/samsung/tuna/kernel-headers/linux/,
436#     hardware/ti/omap4xxx/kernel-headers/media/,
437#     etc.
438#
439# NOTE: These directories MUST contain post-processed headers using the
440# bionic/libc/kernel/tools/clean_header.py tool. Additionally, the original
441# kernel headers must also be checked in, but in a different subdirectory. By
442# convention, the originals should be checked into original-kernel-headers
443# directory of the same parent dir. For example,
444#     device/samsung/tuna/kernel-headers            <----- post-processed
445#     device/samsung/tuna/original-kernel-headers   <----- originals
446#
447TARGET_DEVICE_KERNEL_HEADERS := $(strip $(wildcard $(TARGET_DEVICE_DIR)/kernel-headers))
448
449define validate-kernel-headers
450$(if $(firstword $(foreach hdr_dir,$(1),\
451         $(filter-out kernel-headers,$(notdir $(hdr_dir))))),\
452     $(error Kernel header dirs must be end in kernel-headers: $(1)))
453endef
454# also allow the board config to provide additional directories since
455# there could be device/oem/base_hw and device/oem/derived_hw
456# that both are valid devices but derived_hw needs to use kernel headers
457# from base_hw.
458TARGET_BOARD_KERNEL_HEADERS := $(strip $(wildcard $(TARGET_BOARD_KERNEL_HEADERS)))
459TARGET_BOARD_KERNEL_HEADERS := $(patsubst %/,%,$(TARGET_BOARD_KERNEL_HEADERS))
460$(call validate-kernel-headers,$(TARGET_BOARD_KERNEL_HEADERS))
461
462# then add product-inherited includes, to allow for
463# hardware/sivendor/chip/chip.mk to include their own headers
464TARGET_PRODUCT_KERNEL_HEADERS := $(strip $(wildcard $(PRODUCT_VENDOR_KERNEL_HEADERS)))
465TARGET_PRODUCT_KERNEL_HEADERS := $(patsubst %/,%,$(TARGET_PRODUCT_KERNEL_HEADERS))
466$(call validate-kernel-headers,$(TARGET_PRODUCT_KERNEL_HEADERS))
467.KATI_READONLY := TARGET_DEVICE_KERNEL_HEADERS TARGET_BOARD_KERNEL_HEADERS TARGET_PRODUCT_KERNEL_HEADERS
468
469# Commands to generate .toc file common to ELF .so files.
470define _gen_toc_command_for_elf
471$(hide) ($($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)READELF) -d $(1) | grep SONAME || echo "No SONAME for $1") > $(2)
472$(hide) $($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)READELF) --dyn-syms $(1) | awk '{$$2=""; $$3=""; print}' >> $(2)
473endef
474
475# Commands to generate .toc file from Darwin dynamic library.
476define _gen_toc_command_for_macho
477$(hide) $(HOST_OTOOL) -l $(1) | grep LC_ID_DYLIB -A 5 > $(2)
478$(hide) $(HOST_NM) -gP $(1) | cut -f1-2 -d" " | (grep -v U$$ >> $(2) || true)
479endef
480
481# Pick a Java compiler.
482include $(BUILD_SYSTEM)/combo/javac.mk
483
484ifeq ($(CALLED_FROM_SETUP),true)
485include $(BUILD_SYSTEM)/ccache.mk
486include $(BUILD_SYSTEM)/goma.mk
487include $(BUILD_SYSTEM)/rbe.mk
488endif
489
490# GCC version selection
491TARGET_GCC_VERSION := 4.9
492ifdef TARGET_2ND_ARCH
4932ND_TARGET_GCC_VERSION := 4.9
494endif
495
496# Normalize WITH_STATIC_ANALYZER
497ifeq ($(strip $(WITH_STATIC_ANALYZER)),0)
498  WITH_STATIC_ANALYZER :=
499endif
500
501# Unset WITH_TIDY_ONLY if global WITH_TIDY_ONLY is not true nor 1.
502ifeq (,$(filter 1 true,$(WITH_TIDY_ONLY)))
503  WITH_TIDY_ONLY :=
504endif
505
506# ---------------------------------------------------------------
507# Check that the configuration is current.  We check that
508# BUILD_ENV_SEQUENCE_NUMBER is current against this value.
509# Don't fail if we're called from envsetup, so they have a
510# chance to update their environment.
511
512ifeq (,$(strip $(CALLED_FROM_SETUP)))
513ifneq (,$(strip $(BUILD_ENV_SEQUENCE_NUMBER)))
514ifneq ($(BUILD_ENV_SEQUENCE_NUMBER),$(CORRECT_BUILD_ENV_SEQUENCE_NUMBER))
515$(warning BUILD_ENV_SEQUENCE_NUMBER is set incorrectly.)
516$(info *** If you use envsetup/lunch/choosecombo:)
517$(info ***   - Re-execute envsetup (". envsetup.sh"))
518$(info ***   - Re-run lunch or choosecombo)
519$(info *** If you use buildspec.mk:)
520$(info ***   - Look at buildspec.mk.default to see what has changed)
521$(info ***   - Update BUILD_ENV_SEQUENCE_NUMBER to "$(CORRECT_BUILD_ENV_SEQUENCE_NUMBER)")
522$(error bailing..)
523endif
524endif
525endif
526
527# ---------------------------------------------------------------
528# Whether we can expect a full build graph
529ALLOW_MISSING_DEPENDENCIES := $(filter true,$(ALLOW_MISSING_DEPENDENCIES))
530ifneq ($(TARGET_BUILD_APPS),)
531ALLOW_MISSING_DEPENDENCIES := true
532endif
533ifeq ($(TARGET_BUILD_UNBUNDLED_IMAGE),true)
534ALLOW_MISSING_DEPENDENCIES := true
535endif
536ifneq ($(filter true,$(SOONG_ALLOW_MISSING_DEPENDENCIES)),)
537ALLOW_MISSING_DEPENDENCIES := true
538endif
539# Mac builds default to ALLOW_MISSING_DEPENDENCIES, at least until the host
540# tools aren't enabled by default for Mac.
541ifeq ($(HOST_OS),darwin)
542  ALLOW_MISSING_DEPENDENCIES := true
543endif
544.KATI_READONLY := ALLOW_MISSING_DEPENDENCIES
545
546TARGET_BUILD_USE_PREBUILT_SDKS :=
547DISABLE_PREOPT :=
548DISABLE_PREOPT_BOOT_IMAGES :=
549ifneq (,$(TARGET_BUILD_APPS)$(TARGET_BUILD_UNBUNDLED_IMAGE))
550  DISABLE_PREOPT := true
551  DISABLE_PREOPT_BOOT_IMAGES := true
552endif
553ifeq (true,$(TARGET_BUILD_UNBUNDLED))
554  ifneq (true,$(UNBUNDLED_BUILD_SDKS_FROM_SOURCE))
555    TARGET_BUILD_USE_PREBUILT_SDKS := true
556  endif
557endif
558
559.KATI_READONLY := \
560  TARGET_BUILD_USE_PREBUILT_SDKS \
561  DISABLE_PREOPT \
562  DISABLE_PREOPT_BOOT_IMAGES \
563
564prebuilt_sdk_tools := prebuilts/sdk/tools
565prebuilt_sdk_tools_bin := $(prebuilt_sdk_tools)/$(HOST_OS)/bin
566
567prebuilt_build_tools := prebuilts/build-tools
568prebuilt_build_tools_wrappers := prebuilts/build-tools/common/bin
569prebuilt_build_tools_jars := prebuilts/build-tools/common/framework
570prebuilt_build_tools_bin_noasan := $(prebuilt_build_tools)/$(HOST_PREBUILT_TAG)/bin
571ifeq ($(filter address,$(SANITIZE_HOST)),)
572prebuilt_build_tools_bin := $(prebuilt_build_tools_bin_noasan)
573else
574prebuilt_build_tools_bin := $(prebuilt_build_tools)/$(HOST_PREBUILT_TAG)/asan/bin
575endif
576
577USE_PREBUILT_SDK_TOOLS_IN_PLACE := true
578
579# Work around for b/68406220
580# This should match the soong version.
581USE_D8 := true
582.KATI_READONLY := USE_D8
583
584#
585# Tools that are prebuilts for TARGET_BUILD_USE_PREBUILT_SDKS
586#
587ifeq (,$(TARGET_BUILD_USE_PREBUILT_SDKS))
588  AAPT := $(HOST_OUT_EXECUTABLES)/aapt
589else # TARGET_BUILD_USE_PREBUILT_SDKS
590  AAPT := $(prebuilt_sdk_tools_bin)/aapt
591endif # TARGET_BUILD_USE_PREBUILT_SDKS
592
593ifeq (,$(TARGET_BUILD_USE_PREBUILT_SDKS))
594  # Use RenderScript prebuilts for unbundled builds
595  LLVM_RS_CC := $(HOST_OUT_EXECUTABLES)/llvm-rs-cc
596  BCC_COMPAT := $(HOST_OUT_EXECUTABLES)/bcc_compat
597else
598  LLVM_RS_CC := $(prebuilt_sdk_tools_bin)/llvm-rs-cc
599  BCC_COMPAT := $(prebuilt_sdk_tools_bin)/bcc_compat
600endif
601
602prebuilt_sdk_tools :=
603prebuilt_sdk_tools_bin :=
604
605ACP := $(prebuilt_build_tools_bin)/acp
606CKATI := $(prebuilt_build_tools_bin)/ckati
607DEPMOD := $(HOST_OUT_EXECUTABLES)/depmod
608FILESLIST := $(HOST_OUT_EXECUTABLES)/fileslist
609FILESLIST_UTIL :=$= build/make/tools/fileslist_util.py
610HOST_INIT_VERIFIER := $(HOST_OUT_EXECUTABLES)/host_init_verifier
611XMLLINT := $(HOST_OUT_EXECUTABLES)/xmllint
612
613# SOONG_ZIP is exported by Soong, but needs to be defined early for
614# $OUT/dexpreopt.global.  It will be verified against the Soong version.
615SOONG_ZIP := $(HOST_OUT_EXECUTABLES)/soong_zip
616
617# ---------------------------------------------------------------
618# Generic tools.
619
620# These dependencies are now handled via dependencies on prebuilt_build_tool
621BISON_DATA :=$=
622
623YASM := prebuilts/misc/$(BUILD_OS)-$(HOST_PREBUILT_ARCH)/yasm/yasm
624
625DOXYGEN:= doxygen
626ifeq ($(HOST_OS),linux)
627BREAKPAD_DUMP_SYMS := $(HOST_OUT_EXECUTABLES)/dump_syms
628else
629# For non-supported hosts, do not generate breakpad symbols.
630BREAKPAD_GENERATE_SYMBOLS := false
631endif
632PROTOC := $(HOST_OUT_EXECUTABLES)/aprotoc$(HOST_EXECUTABLE_SUFFIX)
633NANOPB_SRCS := $(HOST_OUT_EXECUTABLES)/protoc-gen-nanopb
634MKBOOTFS := $(HOST_OUT_EXECUTABLES)/mkbootfs$(HOST_EXECUTABLE_SUFFIX)
635MINIGZIP := $(HOST_OUT_EXECUTABLES)/minigzip$(HOST_EXECUTABLE_SUFFIX)
636LZ4 := $(HOST_OUT_EXECUTABLES)/lz4$(HOST_EXECUTABLE_SUFFIX)
637GENERATE_GKI_CERTIFICATE := $(HOST_OUT_EXECUTABLES)/generate_gki_certificate$(HOST_EXECUTABLE_SUFFIX)
638ifeq (,$(strip $(BOARD_CUSTOM_MKBOOTIMG)))
639MKBOOTIMG := $(HOST_OUT_EXECUTABLES)/mkbootimg$(HOST_EXECUTABLE_SUFFIX)
640else
641MKBOOTIMG := $(BOARD_CUSTOM_MKBOOTIMG)
642endif
643ifeq (,$(strip $(BOARD_CUSTOM_BPTTOOL)))
644BPTTOOL := $(HOST_OUT_EXECUTABLES)/bpttool$(HOST_EXECUTABLE_SUFFIX)
645else
646BPTTOOL := $(BOARD_CUSTOM_BPTTOOL)
647endif
648ifeq (,$(strip $(BOARD_CUSTOM_AVBTOOL)))
649AVBTOOL := $(HOST_OUT_EXECUTABLES)/avbtool$(HOST_EXECUTABLE_SUFFIX)
650else
651AVBTOOL := $(BOARD_CUSTOM_AVBTOOL)
652endif
653APICHECK := $(HOST_OUT_JAVA_LIBRARIES)/metalava$(COMMON_JAVA_PACKAGE_SUFFIX)
654FS_GET_STATS := $(HOST_OUT_EXECUTABLES)/fs_get_stats$(HOST_EXECUTABLE_SUFFIX)
655MKEXTUSERIMG := $(HOST_OUT_EXECUTABLES)/mkuserimg_mke2fs
656MKE2FS_CONF := system/extras/ext4_utils/mke2fs.conf
657MKEROFS := $(HOST_OUT_EXECUTABLES)/mkfs.erofs
658MKSQUASHFSUSERIMG := $(HOST_OUT_EXECUTABLES)/mksquashfsimage
659MKF2FSUSERIMG := $(HOST_OUT_EXECUTABLES)/mkf2fsuserimg
660SIMG2IMG := $(HOST_OUT_EXECUTABLES)/simg2img$(HOST_EXECUTABLE_SUFFIX)
661E2FSCK := $(HOST_OUT_EXECUTABLES)/e2fsck$(HOST_EXECUTABLE_SUFFIX)
662TUNE2FS := $(HOST_OUT_EXECUTABLES)/tune2fs$(HOST_EXECUTABLE_SUFFIX)
663JARJAR := $(HOST_OUT_JAVA_LIBRARIES)/jarjar.jar
664DATA_BINDING_COMPILER := $(HOST_OUT_JAVA_LIBRARIES)/databinding-compiler.jar
665FAT16COPY := build/make/tools/fat16copy.py
666CHECK_ELF_FILE := $(HOST_OUT_EXECUTABLES)/check_elf_file$(HOST_EXECUTABLE_SUFFIX)
667LPMAKE := $(HOST_OUT_EXECUTABLES)/lpmake$(HOST_EXECUTABLE_SUFFIX)
668ADD_IMG_TO_TARGET_FILES := $(HOST_OUT_EXECUTABLES)/add_img_to_target_files$(HOST_EXECUTABLE_SUFFIX)
669BUILD_IMAGE := $(HOST_OUT_EXECUTABLES)/build_image$(HOST_EXECUTABLE_SUFFIX)
670ifeq (,$(strip $(BOARD_CUSTOM_BUILD_SUPER_IMAGE)))
671BUILD_SUPER_IMAGE := $(HOST_OUT_EXECUTABLES)/build_super_image$(HOST_EXECUTABLE_SUFFIX)
672else
673BUILD_SUPER_IMAGE := $(BOARD_CUSTOM_BUILD_SUPER_IMAGE)
674endif
675IMG_FROM_TARGET_FILES := $(HOST_OUT_EXECUTABLES)/img_from_target_files$(HOST_EXECUTABLE_SUFFIX)
676MAKE_RECOVERY_PATCH := $(HOST_OUT_EXECUTABLES)/make_recovery_patch$(HOST_EXECUTABLE_SUFFIX)
677OTA_FROM_TARGET_FILES := $(HOST_OUT_EXECUTABLES)/ota_from_target_files$(HOST_EXECUTABLE_SUFFIX)
678SPARSE_IMG := $(HOST_OUT_EXECUTABLES)/sparse_img$(HOST_EXECUTABLE_SUFFIX)
679CHECK_PARTITION_SIZES := $(HOST_OUT_EXECUTABLES)/check_partition_sizes$(HOST_EXECUTABLE_SUFFIX)
680SYMBOLS_MAP := $(HOST_OUT_EXECUTABLES)/symbols_map
681
682PROGUARD_HOME := external/proguard
683PROGUARD := $(PROGUARD_HOME)/bin/proguard.sh
684PROGUARD_DEPS := $(PROGUARD) $(PROGUARD_HOME)/lib/proguard.jar
685JAVATAGS := build/make/tools/java-event-log-tags.py
686MERGETAGS := build/make/tools/merge-event-log-tags.py
687APPEND2SIMG := $(HOST_OUT_EXECUTABLES)/append2simg
688VERITY_SIGNER := $(HOST_OUT_EXECUTABLES)/verity_signer
689BUILD_VERITY_METADATA := $(HOST_OUT_EXECUTABLES)/build_verity_metadata
690BUILD_VERITY_TREE := $(HOST_OUT_EXECUTABLES)/build_verity_tree
691FUTILITY := $(HOST_OUT_EXECUTABLES)/futility-host
692VBOOT_SIGNER := $(HOST_OUT_EXECUTABLES)/vboot_signer
693
694DEXDUMP := $(HOST_OUT_EXECUTABLES)/dexdump$(BUILD_EXECUTABLE_SUFFIX)
695PROFMAN := $(HOST_OUT_EXECUTABLES)/profman
696
697GEN_SBOM := $(HOST_OUT_EXECUTABLES)/generate-sbom
698
699FINDBUGS_DIR := external/owasp/sanitizer/tools/findbugs/bin
700FINDBUGS := $(FINDBUGS_DIR)/findbugs
701
702JETIFIER := prebuilts/sdk/tools/jetifier/jetifier-standalone/bin/jetifier-standalone
703
704EXTRACT_KERNEL := build/make/tools/extract_kernel.py
705
706# Path to tools.jar
707HOST_JDK_TOOLS_JAR := $(ANDROID_JAVA8_HOME)/lib/tools.jar
708
709APICHECK_COMMAND := $(JAVA) -Xmx4g -jar $(APICHECK) --no-banner
710
711# Boolean variable determining if the allow list for compatible properties is enabled
712PRODUCT_COMPATIBLE_PROPERTY := true
713ifeq ($(PRODUCT_COMPATIBLE_PROPERTY_OVERRIDE),false)
714  $(error PRODUCT_COMPATIBLE_PROPERTY_OVERRIDE is obsolete)
715endif
716
717.KATI_READONLY := \
718    PRODUCT_COMPATIBLE_PROPERTY
719
720# Boolean variable determining if Treble is fully enabled
721PRODUCT_FULL_TREBLE := false
722ifneq ($(PRODUCT_FULL_TREBLE_OVERRIDE),)
723  PRODUCT_FULL_TREBLE := $(PRODUCT_FULL_TREBLE_OVERRIDE)
724else ifeq ($(PRODUCT_SHIPPING_API_LEVEL),)
725  #$(warning no product shipping level defined)
726else ifneq ($(call math_gt_or_eq,$(PRODUCT_SHIPPING_API_LEVEL),26),)
727  PRODUCT_FULL_TREBLE := true
728endif
729
730# TODO(b/69865032): Make PRODUCT_NOTICE_SPLIT the default behavior and remove
731#    references to it here and below.
732ifdef PRODUCT_NOTICE_SPLIT_OVERRIDE
733   $(error PRODUCT_NOTICE_SPLIT_OVERRIDE cannot be set.)
734endif
735
736requirements := \
737    PRODUCT_TREBLE_LINKER_NAMESPACES \
738    PRODUCT_SEPOLICY_SPLIT \
739    PRODUCT_ENFORCE_VINTF_MANIFEST \
740    PRODUCT_NOTICE_SPLIT
741
742# If it is overriden, then the requirement override is taken, otherwise it's
743# PRODUCT_FULL_TREBLE
744$(foreach req,$(requirements),$(eval \
745    $(req) := $(if $($(req)_OVERRIDE),$($(req)_OVERRIDE),$(PRODUCT_FULL_TREBLE))))
746# If the requirement is false for any reason, then it's not PRODUCT_FULL_TREBLE
747$(foreach req,$(requirements),$(eval \
748    PRODUCT_FULL_TREBLE := $(if $(filter false,$($(req))),false,$(PRODUCT_FULL_TREBLE))))
749
750PRODUCT_FULL_TREBLE_OVERRIDE ?=
751$(foreach req,$(requirements),$(eval $(req)_OVERRIDE ?=))
752
753ifneq ($(PRODUCT_SEPOLICY_SPLIT),true)
754# WARNING: DO NOT CHANGE: if you are downstream of AOSP, and you change this, without
755# letting upstream know it's important to you, we may do cleanup which breaks this
756# significantly. Please let us know if you are changing this.
757# TODO(b/257176017) - unsplit sepolicy is no longer supported
758PRODUCT_SEPOLICY_SPLIT := true
759endif
760
761# TODO(b/114488870): disallow PRODUCT_FULL_TREBLE_OVERRIDE from being used.
762.KATI_READONLY := \
763    PRODUCT_FULL_TREBLE_OVERRIDE \
764    $(foreach req,$(requirements),$(req)_OVERRIDE) \
765    $(requirements) \
766    PRODUCT_FULL_TREBLE \
767
768$(KATI_obsolete_var $(foreach req,$(requirements),$(req)_OVERRIDE) \
769    ,This should be referenced without the _OVERRIDE suffix.)
770
771requirements :=
772
773# BOARD_PROPERTY_OVERRIDES_SPLIT_ENABLED can be true only if early-mount of
774# partitions is supported. But the early-mount must be supported for full
775# treble products, and so BOARD_PROPERTY_OVERRIDES_SPLIT_ENABLED should be set
776# by default for full treble products.
777ifeq ($(PRODUCT_FULL_TREBLE),true)
778  BOARD_PROPERTY_OVERRIDES_SPLIT_ENABLED ?= true
779endif
780
781# Starting in Android U, non-VNDK devices not supported
782# WARNING: DO NOT CHANGE: if you are downstream of AOSP, and you change this, without
783# letting upstream know it's important to you, we may do cleanup which breaks this
784# significantly. Please let us know if you are changing this.
785ifndef BOARD_VNDK_VERSION
786# READ WARNING - DO NOT CHANGE
787BOARD_VNDK_VERSION := current
788# READ WARNING - DO NOT CHANGE
789endif
790
791ifdef PRODUCT_PRODUCT_VNDK_VERSION
792  ifndef BOARD_VNDK_VERSION
793    # VNDK for product partition is not available unless BOARD_VNDK_VERSION
794    # defined.
795    $(error PRODUCT_PRODUCT_VNDK_VERSION cannot be defined without defining BOARD_VNDK_VERSION)
796  endif
797endif
798
799# Set BOARD_SYSTEMSDK_VERSIONS to the latest SystemSDK version starting from P-launching
800# devices if unset.
801ifndef BOARD_SYSTEMSDK_VERSIONS
802  ifdef PRODUCT_SHIPPING_API_LEVEL
803  ifneq ($(call math_gt_or_eq,$(PRODUCT_SHIPPING_API_LEVEL),28),)
804    ifeq (REL,$(PLATFORM_VERSION_CODENAME))
805      BOARD_SYSTEMSDK_VERSIONS := $(PLATFORM_SDK_VERSION)
806    else
807      BOARD_SYSTEMSDK_VERSIONS := $(PLATFORM_VERSION_CODENAME)
808    endif
809  endif
810  endif
811endif
812
813ifndef BOARD_CURRENT_API_LEVEL_FOR_VENDOR_MODULES
814  BOARD_CURRENT_API_LEVEL_FOR_VENDOR_MODULES := current
815else
816  ifdef PRODUCT_SHIPPING_API_LEVEL
817    ifneq ($(call math_lt,$(BOARD_CURRENT_API_LEVEL_FOR_VENDOR_MODULES),$(PRODUCT_SHIPPING_API_LEVEL)),)
818      $(error BOARD_CURRENT_API_LEVEL_FOR_VENDOR_MODULES ($(BOARD_CURRENT_API_LEVEL_FOR_VENDOR_MODULES)) must be greater than or equal to PRODUCT_SHIPPING_API_LEVEL ($(PRODUCT_SHIPPING_API_LEVEL)))
819    endif
820  endif
821endif
822.KATI_READONLY := BOARD_CURRENT_API_LEVEL_FOR_VENDOR_MODULES
823
824ifdef PRODUCT_SHIPPING_API_LEVEL
825  board_api_level := $(firstword $(BOARD_API_LEVEL) $(BOARD_SHIPPING_API_LEVEL))
826  ifneq (,$(board_api_level))
827    min_systemsdk_version := $(call math_min,$(board_api_level),$(PRODUCT_SHIPPING_API_LEVEL))
828  else
829    min_systemsdk_version := $(PRODUCT_SHIPPING_API_LEVEL)
830  endif
831  ifneq ($(call numbers_less_than,$(min_systemsdk_version),$(BOARD_SYSTEMSDK_VERSIONS)),)
832    $(error BOARD_SYSTEMSDK_VERSIONS ($(BOARD_SYSTEMSDK_VERSIONS)) must all be greater than or equal to BOARD_API_LEVEL, BOARD_SHIPPING_API_LEVEL or PRODUCT_SHIPPING_API_LEVEL ($(min_systemsdk_version)))
833  endif
834  ifneq ($(call math_gt_or_eq,$(PRODUCT_SHIPPING_API_LEVEL),28),)
835    ifneq ($(TARGET_IS_64_BIT), true)
836      ifneq ($(TARGET_USES_64_BIT_BINDER), true)
837        $(error When PRODUCT_SHIPPING_API_LEVEL >= 28, TARGET_USES_64_BIT_BINDER must be true)
838      endif
839    endif
840  endif
841  ifneq ($(call math_gt_or_eq,$(PRODUCT_SHIPPING_API_LEVEL),29),)
842    ifneq ($(BOARD_OTA_FRAMEWORK_VBMETA_VERSION_OVERRIDE),)
843      $(error When PRODUCT_SHIPPING_API_LEVEL >= 29, BOARD_OTA_FRAMEWORK_VBMETA_VERSION_OVERRIDE cannot be set)
844    endif
845  endif
846endif
847
848# The default key if not set as LOCAL_CERTIFICATE
849ifdef PRODUCT_DEFAULT_DEV_CERTIFICATE
850  DEFAULT_SYSTEM_DEV_CERTIFICATE := $(PRODUCT_DEFAULT_DEV_CERTIFICATE)
851else
852  DEFAULT_SYSTEM_DEV_CERTIFICATE := build/make/target/product/security/testkey
853endif
854.KATI_READONLY := DEFAULT_SYSTEM_DEV_CERTIFICATE
855
856# Certificate for the NetworkStack sepolicy context
857ifdef PRODUCT_MAINLINE_SEPOLICY_DEV_CERTIFICATES
858  MAINLINE_SEPOLICY_DEV_CERTIFICATES := $(PRODUCT_MAINLINE_SEPOLICY_DEV_CERTIFICATES)
859else
860  MAINLINE_SEPOLICY_DEV_CERTIFICATES := $(dir $(DEFAULT_SYSTEM_DEV_CERTIFICATE))
861endif
862.KATI_READONLY := MAINLINE_SEPOLICY_DEV_CERTIFICATES
863
864BUILD_NUMBER_FROM_FILE := $$(cat $(SOONG_OUT_DIR)/build_number.txt)
865BUILD_DATETIME_FROM_FILE := $$(cat $(BUILD_DATETIME_FILE))
866
867# SEPolicy versions
868
869# PLATFORM_SEPOLICY_VERSION is a number of the form "NN.m" with "NN" mapping to
870# PLATFORM_SDK_VERSION and "m" as a minor number which allows for SELinux
871# changes independent of PLATFORM_SDK_VERSION.  This value will be set to
872# 10000.0 to represent tip-of-tree development that is inherently unstable and
873# thus designed not to work with any shipping vendor policy.  This is similar in
874# spirit to how DEFAULT_APP_TARGET_SDK is set.
875# The minor version ('m' component) must be updated every time a platform release
876# is made which breaks compatibility with the previous platform sepolicy version,
877# not just on every increase in PLATFORM_SDK_VERSION.  The minor version should
878# be reset to 0 on every bump of the PLATFORM_SDK_VERSION.
879sepolicy_major_vers := 34
880sepolicy_minor_vers := 0
881
882ifneq ($(sepolicy_major_vers), $(PLATFORM_SDK_VERSION))
883$(error sepolicy_major_version does not match PLATFORM_SDK_VERSION, please update.)
884endif
885
886TOT_SEPOLICY_VERSION := 10000.0
887ifneq (REL,$(PLATFORM_VERSION_CODENAME))
888    PLATFORM_SEPOLICY_VERSION := $(TOT_SEPOLICY_VERSION)
889else
890    PLATFORM_SEPOLICY_VERSION := $(join $(addsuffix .,$(sepolicy_major_vers)), $(sepolicy_minor_vers))
891endif
892sepolicy_major_vers :=
893sepolicy_minor_vers :=
894
895# BOARD_SEPOLICY_VERS must take the format "NN.m" and contain the sepolicy
896# version identifier corresponding to the sepolicy on which the non-platform
897# policy is to be based. If unspecified, this will build against the current
898# public platform policy in tree
899ifndef BOARD_SEPOLICY_VERS
900# The default platform policy version.
901BOARD_SEPOLICY_VERS := $(PLATFORM_SEPOLICY_VERSION)
902endif
903
904ifeq ($(BOARD_SEPOLICY_VERS),$(PLATFORM_SEPOLICY_VERSION))
905IS_TARGET_MIXED_SEPOLICY :=
906else
907IS_TARGET_MIXED_SEPOLICY := true
908endif
909
910.KATI_READONLY := IS_TARGET_MIXED_SEPOLICY
911
912# A list of SEPolicy versions, besides PLATFORM_SEPOLICY_VERSION, that the framework supports.
913PLATFORM_SEPOLICY_COMPAT_VERSIONS := \
914    29.0 \
915    30.0 \
916    31.0 \
917    32.0 \
918    33.0 \
919
920.KATI_READONLY := \
921    PLATFORM_SEPOLICY_COMPAT_VERSIONS \
922    PLATFORM_SEPOLICY_VERSION \
923    TOT_SEPOLICY_VERSION \
924
925ifeq ($(PRODUCT_RETROFIT_DYNAMIC_PARTITIONS),true)
926  ifneq ($(PRODUCT_USE_DYNAMIC_PARTITIONS),true)
927    $(error PRODUCT_USE_DYNAMIC_PARTITIONS must be true when PRODUCT_RETROFIT_DYNAMIC_PARTITIONS \
928        is set)
929  endif
930  ifdef PRODUCT_SHIPPING_API_LEVEL
931    ifeq (true,$(call math_gt_or_eq,$(PRODUCT_SHIPPING_API_LEVEL),29))
932      $(error Devices with shipping API level $(PRODUCT_SHIPPING_API_LEVEL) must not set \
933          PRODUCT_RETROFIT_DYNAMIC_PARTITIONS)
934    endif
935  endif
936endif
937
938ifeq ($(PRODUCT_USE_DYNAMIC_PARTITIONS),true)
939    ifneq ($(PRODUCT_USE_DYNAMIC_PARTITION_SIZE),true)
940        $(error PRODUCT_USE_DYNAMIC_PARTITION_SIZE must be true for devices with dynamic partitions)
941    endif
942endif
943
944ifeq ($(PRODUCT_BUILD_SUPER_PARTITION),true)
945    ifneq ($(PRODUCT_USE_DYNAMIC_PARTITIONS),true)
946        $(error Can only build super partition for devices with dynamic partitions)
947    endif
948endif
949
950
951ifeq ($(PRODUCT_USE_DYNAMIC_PARTITION_SIZE),true)
952
953ifneq ($(BOARD_SYSTEMIMAGE_PARTITION_SIZE),)
954ifneq ($(BOARD_SYSTEMIMAGE_PARTITION_RESERVED_SIZE),)
955$(error Should not define BOARD_SYSTEMIMAGE_PARTITION_SIZE and \
956    BOARD_SYSTEMIMAGE_PARTITION_RESERVED_SIZE together)
957endif
958endif
959
960ifneq ($(BOARD_VENDORIMAGE_PARTITION_SIZE),)
961ifneq ($(BOARD_VENDORIMAGE_PARTITION_RESERVED_SIZE),)
962$(error Should not define BOARD_VENDORIMAGE_PARTITION_SIZE and \
963    BOARD_VENDORIMAGE_PARTITION_RESERVED_SIZE together)
964endif
965endif
966
967ifneq ($(BOARD_ODMIMAGE_PARTITION_SIZE),)
968ifneq ($(BOARD_ODMIMAGE_PARTITION_RESERVED_SIZE),)
969$(error Should not define BOARD_ODMIMAGE_PARTITION_SIZE and \
970    BOARD_ODMIMAGE_PARTITION_RESERVED_SIZE together)
971endif
972endif
973
974ifneq ($(BOARD_VENDOR_DLKMIMAGE_PARTITION_SIZE),)
975ifneq ($(BOARD_VENDOR_DLKMIMAGE_PARTITION_RESERVED_SIZE),)
976$(error Should not define BOARD_VENDOR_DLKMIMAGE_PARTITION_SIZE and \
977    BOARD_VENDOR_DLKMIMAGE_PARTITION_RESERVED_SIZE together)
978endif
979endif
980
981ifneq ($(BOARD_ODM_DLKMIMAGE_PARTITION_SIZE),)
982ifneq ($(BOARD_ODM_DLKMIMAGE_PARTITION_RESERVED_SIZE),)
983$(error Should not define BOARD_ODM_DLKMIMAGE_PARTITION_SIZE and \
984    BOARD_ODM_DLKMIMAGE_PARTITION_RESERVED_SIZE together)
985endif
986endif
987
988ifneq ($(BOARD_SYSTEM_DLKMIMAGE_PARTITION_SIZE),)
989ifneq ($(BOARD_SYSTEM_DLKMIMAGE_PARTITION_RESERVED_SIZE),)
990$(error Should not define BOARD_SYSTEM_DLKMIMAGE_PARTITION_SIZE and \
991    BOARD_SYSTEM_DLKMIMAGE_PARTITION_RESERVED_SIZE together)
992endif
993endif
994
995ifneq ($(BOARD_PRODUCTIMAGE_PARTITION_SIZE),)
996ifneq ($(BOARD_PRODUCTIMAGE_PARTITION_RESERVED_SIZE),)
997$(error Should not define BOARD_PRODUCTIMAGE_PARTITION_SIZE and \
998    BOARD_PRODUCTIMAGE_PARTITION_RESERVED_SIZE together)
999endif
1000endif
1001
1002ifneq ($(BOARD_SYSTEM_EXTIMAGE_PARTITION_SIZE),)
1003ifneq ($(BOARD_SYSTEM_EXTIMAGE_PARTITION_RESERVED_SIZE),)
1004$(error Should not define BOARD_SYSTEM_EXTIMAGE_PARTITION_SIZE and \
1005    BOARD_SYSTEM_EXTIMAGE_PARTITION_RESERVED_SIZE together)
1006endif
1007endif
1008
1009endif # PRODUCT_USE_DYNAMIC_PARTITION_SIZE
1010
1011ifeq ($(PRODUCT_USE_DYNAMIC_PARTITIONS),true)
1012
1013# BOARD_SUPER_PARTITION_GROUPS defines a list of "updatable groups". Each updatable group is a
1014# group of partitions that share the same pool of free spaces.
1015# For each group in BOARD_SUPER_PARTITION_GROUPS, a BOARD_{GROUP}_SIZE and
1016# BOARD_{GROUP}_PARTITION_PARTITION_LIST may be defined.
1017#     - BOARD_{GROUP}_SIZE: The maximum sum of sizes of all partitions in the group.
1018#       Must not be empty.
1019#     - BOARD_{GROUP}_PARTITION_PARTITION_LIST: the list of partitions that belongs to this group.
1020#       If empty, no partitions belong to this group, and the sum of sizes is effectively 0.
1021$(foreach group,$(call to-upper,$(BOARD_SUPER_PARTITION_GROUPS)), \
1022    $(eval BOARD_$(group)_SIZE := $(strip $(BOARD_$(group)_SIZE))) \
1023    $(if $(BOARD_$(group)_SIZE),,$(error BOARD_$(group)_SIZE must not be empty)) \
1024    $(eval .KATI_READONLY := BOARD_$(group)_SIZE) \
1025    $(eval BOARD_$(group)_PARTITION_LIST ?=) \
1026    $(eval .KATI_READONLY := BOARD_$(group)_PARTITION_LIST) \
1027)
1028
1029# Define BOARD_SUPER_PARTITION_PARTITION_LIST, the sum of all BOARD_*_PARTITION_LIST
1030ifdef BOARD_SUPER_PARTITION_PARTITION_LIST
1031$(error BOARD_SUPER_PARTITION_PARTITION_LIST should not be defined, but computed from \
1032    BOARD_SUPER_PARTITION_GROUPS and BOARD_*_PARTITION_LIST)
1033endif
1034BOARD_SUPER_PARTITION_PARTITION_LIST := \
1035    $(foreach group,$(call to-upper,$(BOARD_SUPER_PARTITION_GROUPS)),$(BOARD_$(group)_PARTITION_LIST))
1036.KATI_READONLY := BOARD_SUPER_PARTITION_PARTITION_LIST
1037
1038ifneq ($(BOARD_SUPER_PARTITION_SIZE),)
1039ifeq ($(PRODUCT_RETROFIT_DYNAMIC_PARTITIONS),true)
1040
1041# The metadata device must be specified manually for retrofitting.
1042ifeq ($(BOARD_SUPER_PARTITION_METADATA_DEVICE),)
1043$(error Must specify BOARD_SUPER_PARTITION_METADATA_DEVICE if PRODUCT_RETROFIT_DYNAMIC_PARTITIONS=true.)
1044endif
1045
1046# The super partition block device list must be specified manually for retrofitting.
1047ifeq ($(BOARD_SUPER_PARTITION_BLOCK_DEVICES),)
1048$(error Must specify BOARD_SUPER_PARTITION_BLOCK_DEVICES if PRODUCT_RETROFIT_DYNAMIC_PARTITIONS=true.)
1049endif
1050
1051# The metadata device must be included in the super partition block device list.
1052ifeq (,$(filter $(BOARD_SUPER_PARTITION_METADATA_DEVICE),$(BOARD_SUPER_PARTITION_BLOCK_DEVICES)))
1053$(error BOARD_SUPER_PARTITION_METADATA_DEVICE is not listed in BOARD_SUPER_PARTITION_BLOCK_DEVICES.)
1054endif
1055
1056# The metadata device must be supplied to init via the kernel command-line.
1057INTERNAL_KERNEL_CMDLINE += androidboot.super_partition=$(BOARD_SUPER_PARTITION_METADATA_DEVICE)
1058
1059BOARD_BUILD_RETROFIT_DYNAMIC_PARTITIONS_OTA_PACKAGE := true
1060
1061# If "vendor" is listed as one of the dynamic partitions but without its image available (e.g. an
1062# AOSP target built without vendor image), don't build the retrofit full OTA package. Because we
1063# won't be able to build meaningful super_* images for retrofitting purpose.
1064ifneq (,$(filter vendor,$(BOARD_SUPER_PARTITION_PARTITION_LIST)))
1065ifndef BUILDING_VENDOR_IMAGE
1066ifndef BOARD_PREBUILT_VENDORIMAGE
1067BOARD_BUILD_RETROFIT_DYNAMIC_PARTITIONS_OTA_PACKAGE :=
1068endif # BOARD_PREBUILT_VENDORIMAGE
1069endif # BUILDING_VENDOR_IMAGE
1070endif # BOARD_SUPER_PARTITION_PARTITION_LIST
1071
1072else # PRODUCT_RETROFIT_DYNAMIC_PARTITIONS
1073
1074# For normal devices, we populate BOARD_SUPER_PARTITION_BLOCK_DEVICES so the
1075# build can handle both cases consistently.
1076ifeq ($(BOARD_SUPER_PARTITION_METADATA_DEVICE),)
1077BOARD_SUPER_PARTITION_METADATA_DEVICE := super
1078endif
1079
1080ifeq ($(BOARD_SUPER_PARTITION_BLOCK_DEVICES),)
1081BOARD_SUPER_PARTITION_BLOCK_DEVICES := $(BOARD_SUPER_PARTITION_METADATA_DEVICE)
1082endif
1083
1084# If only one super block device, default to super partition size.
1085ifeq ($(word 2,$(BOARD_SUPER_PARTITION_BLOCK_DEVICES)),)
1086BOARD_SUPER_PARTITION_$(call to-upper,$(strip $(BOARD_SUPER_PARTITION_BLOCK_DEVICES)))_DEVICE_SIZE ?= \
1087    $(BOARD_SUPER_PARTITION_SIZE)
1088endif
1089
1090ifneq ($(BOARD_SUPER_PARTITION_METADATA_DEVICE),super)
1091INTERNAL_KERNEL_CMDLINE += androidboot.super_partition=$(BOARD_SUPER_PARTITION_METADATA_DEVICE)
1092endif
1093BOARD_BUILD_RETROFIT_DYNAMIC_PARTITIONS_OTA_PACKAGE :=
1094
1095endif # PRODUCT_RETROFIT_DYNAMIC_PARTITIONS
1096endif # BOARD_SUPER_PARTITION_SIZE
1097BOARD_SUPER_PARTITION_BLOCK_DEVICES ?=
1098.KATI_READONLY := BOARD_SUPER_PARTITION_BLOCK_DEVICES
1099BOARD_SUPER_PARTITION_METADATA_DEVICE ?=
1100.KATI_READONLY := BOARD_SUPER_PARTITION_METADATA_DEVICE
1101BOARD_BUILD_RETROFIT_DYNAMIC_PARTITIONS_OTA_PACKAGE ?=
1102.KATI_READONLY := BOARD_BUILD_RETROFIT_DYNAMIC_PARTITIONS_OTA_PACKAGE
1103
1104$(foreach device,$(call to-upper,$(BOARD_SUPER_PARTITION_BLOCK_DEVICES)), \
1105    $(eval BOARD_SUPER_PARTITION_$(device)_DEVICE_SIZE := $(strip $(BOARD_SUPER_PARTITION_$(device)_DEVICE_SIZE))) \
1106    $(if $(BOARD_SUPER_PARTITION_$(device)_DEVICE_SIZE),, \
1107        $(error BOARD_SUPER_PARTITION_$(device)_DEVICE_SIZE must not be empty)) \
1108    $(eval .KATI_READONLY := BOARD_SUPER_PARTITION_$(device)_DEVICE_SIZE))
1109
1110endif # PRODUCT_USE_DYNAMIC_PARTITIONS
1111
1112# By default, we build the hidden API csv files from source. You can use
1113# prebuilt hiddenapi files by setting BOARD_PREBUILT_HIDDENAPI_DIR to the name
1114# of a directory containing both prebuilt hiddenapi-flags.csv and
1115# hiddenapi-index.csv.
1116BOARD_PREBUILT_HIDDENAPI_DIR ?=
1117.KATI_READONLY := BOARD_PREBUILT_HIDDENAPI_DIR
1118
1119# ###############################################################
1120# Set up final options.
1121# ###############################################################
1122
1123# We run gcc/clang with PWD=/proc/self/cwd to remove the $TOP
1124# from the debug output. That way two builds in two different
1125# directories will create the same output.
1126# /proc doesn't exist on Darwin.
1127ifeq ($(HOST_OS),linux)
1128RELATIVE_PWD := PWD=/proc/self/cwd
1129else
1130RELATIVE_PWD :=
1131endif
1132
1133# Flags for DEX2OAT
1134first_non_empty_of_three = $(if $(1),$(1),$(if $(2),$(2),$(3)))
1135DEX2OAT_TARGET_ARCH := $(TARGET_ARCH)
1136DEX2OAT_TARGET_CPU_VARIANT := $(call first_non_empty_of_three,$(TARGET_CPU_VARIANT),$(TARGET_ARCH_VARIANT),default)
1137DEX2OAT_TARGET_CPU_VARIANT_RUNTIME := $(call first_non_empty_of_three,$(TARGET_CPU_VARIANT_RUNTIME),$(TARGET_ARCH_VARIANT),default)
1138DEX2OAT_TARGET_INSTRUCTION_SET_FEATURES := default
1139
1140ifdef TARGET_2ND_ARCH
1141$(TARGET_2ND_ARCH_VAR_PREFIX)DEX2OAT_TARGET_ARCH := $(TARGET_2ND_ARCH)
1142$(TARGET_2ND_ARCH_VAR_PREFIX)DEX2OAT_TARGET_CPU_VARIANT := $(call first_non_empty_of_three,$(TARGET_2ND_CPU_VARIANT),$(TARGET_2ND_ARCH_VARIANT),default)
1143$(TARGET_2ND_ARCH_VAR_PREFIX)DEX2OAT_TARGET_CPU_VARIANT_RUNTIME := $(call first_non_empty_of_three,$(TARGET_2ND_CPU_VARIANT_RUNTIME),$(TARGET_2ND_ARCH_VARIANT),default)
1144$(TARGET_2ND_ARCH_VAR_PREFIX)DEX2OAT_TARGET_INSTRUCTION_SET_FEATURES := default
1145endif
1146
1147# ###############################################################
1148# Collect a list of the SDK versions that we could compile against
1149# For use with the LOCAL_SDK_VERSION variable for include $(BUILD_PACKAGE)
1150# ###############################################################
1151
1152HISTORICAL_SDK_VERSIONS_ROOT := $(TOPDIR)prebuilts/sdk
1153HISTORICAL_NDK_VERSIONS_ROOT := $(TOPDIR)prebuilts/ndk
1154
1155# The path where app can reference the support library resources.
1156ifdef TARGET_BUILD_USE_PREBUILT_SDKS
1157SUPPORT_LIBRARY_ROOT := $(HISTORICAL_SDK_VERSIONS_ROOT)/current/support
1158else
1159SUPPORT_LIBRARY_ROOT := frameworks/support
1160endif
1161
1162get-sdk-version = $(if $(findstring _,$(1)),$(subst core_,,$(subst system_,,$(subst test_,,$(1)))),$(1))
1163get-sdk-api = $(if $(findstring _,$(1)),$(patsubst %_$(call get-sdk-version,$(1)),%,$(1)),public)
1164get-prebuilt-sdk-dir = $(HISTORICAL_SDK_VERSIONS_ROOT)/$(call get-sdk-version,$(1))/$(call get-sdk-api,$(1))
1165
1166# Resolve LOCAL_SDK_VERSION to prebuilt module name, e.g.:
1167# 23 -> sdk_public_23_android
1168# system_current -> sdk_system_current_android
1169# $(1): An sdk version (LOCAL_SDK_VERSION)
1170# $(2): optional library name (default: android)
1171define resolve-prebuilt-sdk-module
1172$(if $(findstring _,$(1)),\
1173  sdk_$(1)_$(or $(2),android),\
1174  sdk_public_$(1)_$(or $(2),android))
1175endef
1176
1177# Resolve LOCAL_SDK_VERSION to prebuilt android.jar
1178# $(1): LOCAL_SDK_VERSION
1179resolve-prebuilt-sdk-jar-path = $(call get-prebuilt-sdk-dir,$(1))/android.jar
1180
1181# Resolve LOCAL_SDK_VERSION to prebuilt framework.aidl
1182# $(1): An sdk version (LOCAL_SDK_VERSION)
1183resolve-prebuilt-sdk-aidl-path = $(call get-prebuilt-sdk-dir,$(call get-sdk-version,$(1)))/framework.aidl
1184
1185# Historical SDK version N is stored in $(HISTORICAL_SDK_VERSIONS_ROOT)/N.
1186# The 'current' version is whatever this source tree is.
1187#
1188# sgrax     is the opposite of xargs.  It takes the list of args and puts them
1189#           on each line for sort to process.
1190# sort -g   is a numeric sort, so 1 2 3 10 instead of 1 10 2 3.
1191
1192# Numerically sort a list of numbers
1193# $(1): the list of numbers to be sorted
1194define numerically_sort
1195$(shell function sgrax() { \
1196    while [ -n "$$1" ] ; do echo $$1 ; shift ; done \
1197    } ; \
1198    ( sgrax $(1) | sort -g ) )
1199endef
1200
1201# This produces a list like "current/core current/public current/system 4/public"
1202TARGET_AVAILABLE_SDK_VERSIONS := $(wildcard $(HISTORICAL_SDK_VERSIONS_ROOT)/*/*/android.jar)
1203TARGET_AVAILABLE_SDK_VERSIONS := $(patsubst $(HISTORICAL_SDK_VERSIONS_ROOT)/%/android.jar,%,$(TARGET_AVAILABLE_SDK_VERSIONS))
1204# Strips and reorganizes the "public", "core", "system" and "test" subdirs.
1205TARGET_AVAILABLE_SDK_VERSIONS := $(subst /public,,$(TARGET_AVAILABLE_SDK_VERSIONS))
1206TARGET_AVAILABLE_SDK_VERSIONS := $(patsubst %/core,core_%,$(TARGET_AVAILABLE_SDK_VERSIONS))
1207TARGET_AVAILABLE_SDK_VERSIONS := $(patsubst %/system,system_%,$(TARGET_AVAILABLE_SDK_VERSIONS))
1208TARGET_AVAILABLE_SDK_VERSIONS := $(patsubst %/test,test_%,$(TARGET_AVAILABLE_SDK_VERSIONS))
1209# module-lib and system-server are not supported in Make.
1210TARGET_AVAILABLE_SDK_VERSIONS := $(filter-out %/module-lib %/system-server,$(TARGET_AVAILABLE_SDK_VERSIONS))
1211TARGET_AVAIALBLE_SDK_VERSIONS := $(call numerically_sort,$(TARGET_AVAILABLE_SDK_VERSIONS))
1212
1213TARGET_SDK_VERSIONS_WITHOUT_JAVA_18_SUPPORT := $(call numbers_less_than,24,$(TARGET_AVAILABLE_SDK_VERSIONS))
1214TARGET_SDK_VERSIONS_WITHOUT_JAVA_19_SUPPORT := $(call numbers_less_than,30,$(TARGET_AVAILABLE_SDK_VERSIONS))
1215
1216# Missing optional uses-libraries so that the platform doesn't create build rules that depend on
1217# them.
1218INTERNAL_PLATFORM_MISSING_USES_LIBRARIES := \
1219  com.google.android.ble \
1220  com.google.android.media.effects \
1221  com.google.android.wearable \
1222
1223# This is the standard way to name a directory containing prebuilt target
1224# objects. E.g., prebuilt/$(TARGET_PREBUILT_TAG)/libc.so
1225TARGET_PREBUILT_TAG := android-$(TARGET_ARCH)
1226ifdef TARGET_2ND_ARCH
1227TARGET_2ND_PREBUILT_TAG := android-$(TARGET_2ND_ARCH)
1228endif
1229
1230# Set up RS prebuilt variables for compatibility library
1231
1232RS_PREBUILT_CLCORE := prebuilts/sdk/renderscript/lib/$(TARGET_ARCH)/librsrt_$(TARGET_ARCH).bc
1233RS_PREBUILT_COMPILER_RT := prebuilts/sdk/renderscript/lib/$(TARGET_ARCH)/libcompiler_rt.a
1234
1235# API Level lists for Renderscript Compat lib.
1236RSCOMPAT_32BIT_ONLY_API_LEVELS := 8 9 10 11 12 13 14 15 16 17 18 19 20
1237RSCOMPAT_NO_USAGEIO_API_LEVELS := 8 9 10 11 12 13
1238
1239# Add BUILD_NUMBER to apps default version name if it's unbundled build.
1240ifdef TARGET_BUILD_APPS
1241TARGET_BUILD_WITH_APPS_VERSION_NAME := true
1242endif
1243
1244ifdef TARGET_BUILD_WITH_APPS_VERSION_NAME
1245APPS_DEFAULT_VERSION_NAME := $(PLATFORM_VERSION)-$(BUILD_NUMBER_FROM_FILE)
1246else
1247APPS_DEFAULT_VERSION_NAME := $(PLATFORM_VERSION)
1248endif
1249
1250# ANDROID_WARNING_ALLOWED_PROJECTS is generated by build/soong.
1251define find_warning_allowed_projects
1252    $(filter $(ANDROID_WARNING_ALLOWED_PROJECTS),$(1)/)
1253endef
1254
1255GOMA_POOL :=
1256RBE_POOL :=
1257GOMA_OR_RBE_POOL :=
1258# When goma or RBE are enabled, kati will be passed --default_pool=local_pool to put
1259# most rules into the local pool.  Explicitly set the pool to "none" for rules that
1260# should be run outside the local pool, i.e. with -j500.
1261ifneq (,$(filter-out false,$(USE_GOMA)))
1262  GOMA_POOL := none
1263  GOMA_OR_RBE_POOL := none
1264else ifneq (,$(filter-out false,$(USE_RBE)))
1265  RBE_POOL := none
1266  GOMA_OR_RBE_POOL := none
1267endif
1268.KATI_READONLY := GOMA_POOL RBE_POOL GOMA_OR_RBE_POOL
1269
1270JAVAC_NINJA_POOL :=
1271R8_NINJA_POOL :=
1272D8_NINJA_POOL :=
1273
1274ifneq ($(filter-out false,$(USE_RBE)),)
1275  ifdef RBE_JAVAC
1276    JAVAC_NINJA_POOL := $(RBE_POOL)
1277  endif
1278  ifdef RBE_R8
1279    R8_NINJA_POOL := $(RBE_POOL)
1280  endif
1281  ifdef RBE_D8
1282    D8_NINJA_POOL := $(RBE_POOL)
1283  endif
1284endif
1285
1286.KATI_READONLY := JAVAC_NINJA_POOL R8_NINJA_POOL D8_NINJA_POOL
1287
1288# These goals don't need to collect and include Android.mks/CleanSpec.mks
1289# in the source tree.
1290dont_bother_goals := out product-graph
1291
1292# Make ANDROID Soong config variables visible to Android.mk files, for
1293# consistency with those defined in BoardConfig.mk files.
1294include $(BUILD_SYSTEM)/android_soong_config_vars.mk
1295
1296ifeq ($(CALLED_FROM_SETUP),true)
1297include $(BUILD_SYSTEM)/ninja_config.mk
1298include $(BUILD_SYSTEM)/soong_config.mk
1299endif
1300
1301-include external/linux-kselftest/android/kselftest_test_list.mk
1302-include external/ltp/android/ltp_package_list.mk
1303DEFAULT_DATA_OUT_MODULES := ltp $(ltp_packages) $(kselftest_modules)
1304.KATI_READONLY := DEFAULT_DATA_OUT_MODULES
1305
1306include $(BUILD_SYSTEM)/dumpvar.mk
1307