• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Put some miscellaneous rules here
2
3# HACK: clear LOCAL_PATH from including last build target before calling
4# intermedites-dir-for
5LOCAL_PATH := $(BUILD_SYSTEM)
6
7SYSTEM_NOTICE_DEPS :=
8VENDOR_NOTICE_DEPS :=
9UNMOUNTED_NOTICE_DEPS :=
10UNMOUNTED_NOTICE_VENDOR_DEPS :=
11ODM_NOTICE_DEPS :=
12OEM_NOTICE_DEPS :=
13PRODUCT_NOTICE_DEPS :=
14SYSTEM_EXT_NOTICE_DEPS :=
15VENDOR_DLKM_NOTICE_DEPS :=
16ODM_DLKM_NOTICE_DEPS :=
17SYSTEM_DLKM_NOTICE_DEPS :=
18
19# -----------------------------------------------------------------
20# Define rules to copy PRODUCT_COPY_FILES defined by the product.
21# PRODUCT_COPY_FILES contains words like <source file>:<dest file>[:<owner>].
22# <dest file> is relative to $(PRODUCT_OUT), so it should look like,
23# e.g., "system/etc/file.xml".
24# The filter part means "only eval the copy-one-file rule if this
25# src:dest pair is the first one to match the same dest"
26#$(1): the src:dest pair
27#$(2): the dest
28define check-product-copy-files
29$(if $(filter-out $(TARGET_COPY_OUT_SYSTEM_OTHER)/%,$(2)), \
30  $(if $(filter %.apk, $(2)),$(error \
31     Prebuilt apk found in PRODUCT_COPY_FILES: $(1), use BUILD_PREBUILT instead!))) \
32$(if $(filter true,$(BUILD_BROKEN_VINTF_PRODUCT_COPY_FILES)),, \
33  $(if $(filter $(TARGET_COPY_OUT_SYSTEM)/etc/vintf/% \
34                $(TARGET_COPY_OUT_SYSTEM)/manifest.xml \
35                $(TARGET_COPY_OUT_SYSTEM)/compatibility_matrix.xml,$(2)), \
36    $(error VINTF metadata found in PRODUCT_COPY_FILES: $(1), use vintf_fragments instead!)) \
37  $(if $(filter $(TARGET_COPY_OUT_PRODUCT)/etc/vintf/%,$(2)), \
38    $(error VINTF metadata found in PRODUCT_COPY_FILES: $(1), \
39      use PRODUCT_MANIFEST_FILES / DEVICE_PRODUCT_COMPATIBILITY_MATRIX_FILE / vintf_compatibility_matrix / vintf_fragments instead!)) \
40  $(if $(filter $(TARGET_COPY_OUT_SYSTEM_EXT)/etc/vintf/%,$(2)), \
41    $(error VINTF metadata found in PRODUCT_COPY_FILES: $(1), \
42      use vintf_compatibility_matrix / vintf_fragments instead!)) \
43  $(if $(filter $(TARGET_COPY_OUT_VENDOR)/etc/vintf/% \
44                $(TARGET_COPY_OUT_VENDOR)/manifest.xml \
45                $(TARGET_COPY_OUT_VENDOR)/compatibility_matrix.xml,$(2)), \
46    $(error VINTF metadata found in PRODUCT_COPY_FILES: $(1), \
47      use DEVICE_MANIFEST_FILE / DEVICE_MATRIX_FILE / vintf_compatibility_matrix / vintf_fragments instead!)) \
48  $(if $(filter $(TARGET_COPY_OUT_ODM)/etc/vintf/% \
49                $(TARGET_COPY_OUT_ODM)/etc/manifest%,$(2)), \
50    $(error VINTF metadata found in PRODUCT_COPY_FILES: $(1), \
51      use ODM_MANIFEST_FILES / vintf_fragments instead!)) \
52)
53endef
54
55# Phony target to check PRODUCT_COPY_FILES copy pairs don't contain ELF files
56.PHONY: check-elf-prebuilt-product-copy-files
57check-elf-prebuilt-product-copy-files:
58
59check_elf_prebuilt_product_copy_files := true
60ifneq (,$(filter true,$(BUILD_BROKEN_ELF_PREBUILT_PRODUCT_COPY_FILES)))
61check_elf_prebuilt_product_copy_files :=
62endif
63check_elf_prebuilt_product_copy_files_hint := \
64    found ELF prebuilt in PRODUCT_COPY_FILES, use cc_prebuilt_binary / cc_prebuilt_library_shared instead.
65
66# filter out the duplicate <source file>:<dest file> pairs.
67unique_product_copy_files_pairs :=
68$(foreach cf,$(PRODUCT_COPY_FILES), \
69    $(if $(filter $(unique_product_copy_files_pairs),$(cf)),,\
70        $(eval unique_product_copy_files_pairs += $(cf))))
71unique_product_copy_files_destinations :=
72product_copy_files_ignored :=
73$(foreach cf,$(unique_product_copy_files_pairs), \
74    $(eval _src := $(call word-colon,1,$(cf))) \
75    $(eval _dest := $(call word-colon,2,$(cf))) \
76    $(call check-product-copy-files,$(cf),$(_dest)) \
77    $(if $(filter $(unique_product_copy_files_destinations),$(_dest)), \
78        $(eval product_copy_files_ignored += $(cf)), \
79        $(eval _fulldest := $(call append-path,$(PRODUCT_OUT),$(_dest))) \
80        $(if $(filter %.xml,$(_dest)),\
81            $(eval $(call copy-xml-file-checked,$(_src),$(_fulldest))),\
82            $(if $(and $(filter %.jar,$(_dest)),$(filter $(basename $(notdir $(_dest))),$(PRODUCT_LOADED_BY_PRIVILEGED_MODULES))),\
83                $(eval $(call copy-and-uncompress-dexs,$(_src),$(_fulldest))), \
84                $(if $(filter init%rc,$(notdir $(_dest)))$(filter %/etc/init,$(dir $(_dest))),\
85                    $(eval $(call copy-init-script-file-checked,$(_src),$(_fulldest))),\
86                    $(if $(and $(filter true,$(check_elf_prebuilt_product_copy_files)), \
87                               $(filter bin lib lib64,$(subst /,$(space),$(_dest)))), \
88                        $(eval $(call copy-non-elf-file-checked,$(_src),$(_fulldest),$(check_elf_prebuilt_product_copy_files_hint))), \
89                        $(eval $(call copy-one-file,$(_src),$(_fulldest))))))) \
90        $(eval unique_product_copy_files_destinations += $(_dest))))
91
92# Dump a list of overriden (and ignored PRODUCT_COPY_FILES entries)
93pcf_ignored_file := $(PRODUCT_OUT)/product_copy_files_ignored.txt
94$(pcf_ignored_file): PRIVATE_IGNORED := $(sort $(product_copy_files_ignored))
95$(pcf_ignored_file):
96	echo "$(PRIVATE_IGNORED)" | tr " " "\n" >$@
97
98$(call declare-0p-target,$(pcf_ignored_file))
99
100$(call dist-for-goals,droidcore-unbundled,$(pcf_ignored_file):logs/$(notdir $(pcf_ignored_file)))
101
102pcf_ignored_file :=
103product_copy_files_ignored :=
104unique_product_copy_files_pairs :=
105unique_product_copy_files_destinations :=
106
107# -----------------------------------------------------------------
108# Returns the max allowed size for an image suitable for hash verification
109# (e.g., boot.img, recovery.img, etc).
110# The value 69632 derives from MAX_VBMETA_SIZE + MAX_FOOTER_SIZE in $(AVBTOOL).
111# $(1): partition size to flash the image
112define get-hash-image-max-size
113$(if $(1), \
114  $(if $(filter true,$(BOARD_AVB_ENABLE)), \
115    $(eval _hash_meta_size := 69632), \
116    $(eval _hash_meta_size := 0)) \
117  $(1)-$(_hash_meta_size))
118endef
119
120# -----------------------------------------------------------------
121# Define rules to copy headers defined in copy_headers.mk
122# If more than one makefile declared a header, print a warning,
123# then copy the last one defined. This matches the previous make
124# behavior.
125has_dup_copy_headers :=
126$(foreach dest,$(ALL_COPIED_HEADERS), \
127    $(eval _srcs := $(ALL_COPIED_HEADERS.$(dest).SRC)) \
128    $(eval _src := $(lastword $(_srcs))) \
129    $(if $(call streq,$(_src),$(_srcs)),, \
130        $(warning Duplicate header copy: $(dest)) \
131        $(warning _ Using $(_src)) \
132        $(warning __ from $(lastword $(ALL_COPIED_HEADERS.$(dest).MAKEFILE))) \
133        $(eval _makefiles := $$(wordlist 1,$(call int_subtract,$(words $(ALL_COPIED_HEADERS.$(dest).MAKEFILE)),1),$$(ALL_COPIED_HEADERS.$$(dest).MAKEFILE))) \
134        $(foreach src,$(wordlist 1,$(call int_subtract,$(words $(_srcs)),1),$(_srcs)), \
135            $(warning _ Ignoring $(src)) \
136            $(warning __ from $(firstword $(_makefiles))) \
137            $(eval _makefiles := $$(wordlist 2,9999,$$(_makefiles)))) \
138        $(eval has_dup_copy_headers := true)) \
139    $(eval $(call copy-one-header,$(_src),$(dest))))
140all_copied_headers: $(ALL_COPIED_HEADERS)
141
142ifdef has_dup_copy_headers
143  has_dup_copy_headers :=
144  $(error duplicate header copies are no longer allowed. For more information about headers, see: https://android.googlesource.com/platform/build/soong/+/master/docs/best_practices.md#headers)
145endif
146
147$(file >$(PRODUCT_OUT)/.copied_headers_list,$(TARGET_OUT_HEADERS) $(ALL_COPIED_HEADERS))
148
149# -----------------------------------------------------------------
150# docs/index.html
151ifeq (,$(TARGET_BUILD_UNBUNDLED))
152gen := $(OUT_DOCS)/index.html
153ALL_DOCS += $(gen)
154$(gen): frameworks/base/docs/docs-redirect-index.html
155	@mkdir -p $(dir $@)
156	@cp -f $< $@
157endif
158
159ndk_doxygen_out := $(OUT_NDK_DOCS)
160ndk_headers := $(SOONG_OUT_DIR)/ndk/sysroot/usr/include
161ndk_docs_src_dir := frameworks/native/docs
162ndk_doxyfile := $(ndk_docs_src_dir)/Doxyfile
163ifneq ($(wildcard $(ndk_docs_src_dir)),)
164ndk_docs_srcs := $(addprefix $(ndk_docs_src_dir)/,\
165    $(call find-files-in-subdirs,$(ndk_docs_src_dir),"*",.))
166$(ndk_doxygen_out)/index.html: $(ndk_docs_srcs) $(SOONG_OUT_DIR)/ndk.timestamp
167	@mkdir -p $(ndk_doxygen_out)
168	@echo "Generating NDK docs to $(ndk_doxygen_out)"
169	@( cat $(ndk_doxyfile); \
170	    echo "INPUT=$(ndk_headers)"; \
171	    echo "HTML_OUTPUT=$(ndk_doxygen_out)" \
172	) | doxygen -
173
174$(call declare-1p-target,$(ndk_doxygen_out)/index.html,)
175
176# Note: Not a part of the docs target because we don't have doxygen available.
177# You can run this target locally if you have doxygen installed.
178ndk-docs: $(ndk_doxygen_out)/index.html
179.PHONY: ndk-docs
180endif
181
182ifeq ($(HOST_OS),linux)
183$(call dist-for-goals,sdk,$(API_FINGERPRINT))
184$(call dist-for-goals,droidcore,$(API_FINGERPRINT))
185endif
186
187INSTALLED_RECOVERYIMAGE_TARGET :=
188# Build recovery image if
189# BUILDING_RECOVERY_IMAGE && !BOARD_USES_RECOVERY_AS_BOOT && !BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT.
190# If BOARD_USES_RECOVERY_AS_BOOT is true, leave empty because INSTALLED_BOOTIMAGE_TARGET is built
191#   with recovery resources.
192# If BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT is true, leave empty to build recovery resources
193#   but not the final recovery image.
194ifdef BUILDING_RECOVERY_IMAGE
195ifneq ($(BOARD_USES_RECOVERY_AS_BOOT),true)
196ifneq ($(BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT),true)
197INSTALLED_RECOVERYIMAGE_TARGET := $(PRODUCT_OUT)/recovery.img
198endif
199endif
200endif
201
202include $(BUILD_SYSTEM)/sysprop.mk
203
204# ----------------------------------------------------------------
205
206# -----------------------------------------------------------------
207# sdk-build.prop
208#
209# There are certain things in build.prop that we don't want to
210# ship with the sdk; remove them.
211
212# This must be a list of entire property keys followed by
213# "=" characters, without any internal spaces.
214sdk_build_prop_remove := \
215	ro.build.user= \
216	ro.build.host= \
217	ro.product.brand= \
218	ro.product.manufacturer= \
219	ro.product.device=
220# TODO: Remove this soon-to-be obsolete property
221sdk_build_prop_remove += ro.build.product=
222INSTALLED_SDK_BUILD_PROP_TARGET := $(PRODUCT_OUT)/sdk/sdk-build.prop
223$(INSTALLED_SDK_BUILD_PROP_TARGET): $(INSTALLED_BUILD_PROP_TARGET)
224	@echo SDK buildinfo: $@
225	@mkdir -p $(dir $@)
226	$(hide) grep -v "$(subst $(space),\|,$(strip \
227	            $(sdk_build_prop_remove)))" $< > $@.tmp
228	$(hide) for x in $(strip $(sdk_build_prop_remove)); do \
229	            echo "$$x"generic >> $@.tmp; done
230	$(hide) mv $@.tmp $@
231
232$(call declare-0p-target,$(INSTALLED_SDK_BUILD_PROP_TARGET))
233
234# -----------------------------------------------------------------
235# declare recovery ramdisk files
236ifeq ($(BUILDING_RECOVERY_IMAGE),true)
237INTERNAL_RECOVERY_RAMDISK_FILES_TIMESTAMP := $(call intermediates-dir-for,PACKAGING,recovery)/ramdisk_files-timestamp
238endif
239
240# -----------------------------------------------------------------
241# Declare vendor ramdisk fragments
242INTERNAL_VENDOR_RAMDISK_FRAGMENTS :=
243
244ifeq (true,$(BOARD_INCLUDE_RECOVERY_RAMDISK_IN_VENDOR_BOOT))
245  ifneq (,$(filter recovery,$(BOARD_VENDOR_RAMDISK_FRAGMENTS)))
246    $(error BOARD_VENDOR_RAMDISK_FRAGMENTS must not contain "recovery" if \
247      BOARD_INCLUDE_RECOVERY_RAMDISK_IN_VENDOR_BOOT is set)
248  endif
249  INTERNAL_VENDOR_RAMDISK_FRAGMENTS += recovery
250  VENDOR_RAMDISK_FRAGMENT.recovery.STAGING_DIR := $(TARGET_RECOVERY_ROOT_OUT)
251  VENDOR_RAMDISK_FRAGMENT.recovery.FILES := $(INTERNAL_RECOVERY_RAMDISK_FILES_TIMESTAMP)
252  BOARD_VENDOR_RAMDISK_FRAGMENT.recovery.MKBOOTIMG_ARGS += --ramdisk_type RECOVERY
253  .KATI_READONLY := VENDOR_RAMDISK_FRAGMENT.recovery.STAGING_DIR
254endif
255
256# Validation check and assign default --ramdisk_type.
257$(foreach vendor_ramdisk_fragment,$(BOARD_VENDOR_RAMDISK_FRAGMENTS), \
258  $(if $(and $(BOARD_VENDOR_RAMDISK_FRAGMENT.$(vendor_ramdisk_fragment).KERNEL_MODULE_DIRS), \
259             $(BOARD_VENDOR_RAMDISK_FRAGMENT.$(vendor_ramdisk_fragment).PREBUILT)), \
260    $(error Must not specify KERNEL_MODULE_DIRS for prebuilt vendor ramdisk fragment "$(vendor_ramdisk_fragment)": $(BOARD_VENDOR_RAMDISK_FRAGMENT.$(vendor_ramdisk_fragment).KERNEL_MODULE_DIRS))) \
261  $(eval VENDOR_RAMDISK_FRAGMENT.$(vendor_ramdisk_fragment).STAGING_DIR := $(call intermediates-dir-for,PACKAGING,vendor_ramdisk_fragment-stage-$(vendor_ramdisk_fragment))) \
262  $(eval VENDOR_RAMDISK_FRAGMENT.$(vendor_ramdisk_fragment).FILES :=) \
263  $(if $(BOARD_VENDOR_RAMDISK_FRAGMENT.$(vendor_ramdisk_fragment).KERNEL_MODULE_DIRS), \
264    $(if $(filter --ramdisk_type,$(BOARD_VENDOR_RAMDISK_FRAGMENT.$(vendor_ramdisk_fragment).MKBOOTIMG_ARGS)),, \
265      $(eval BOARD_VENDOR_RAMDISK_FRAGMENT.$(vendor_ramdisk_fragment).MKBOOTIMG_ARGS += --ramdisk_type DLKM))) \
266)
267
268# Create the "kernel module directory" to "vendor ramdisk fragment" inverse mapping.
269$(foreach vendor_ramdisk_fragment,$(BOARD_VENDOR_RAMDISK_FRAGMENTS), \
270  $(foreach kmd,$(BOARD_VENDOR_RAMDISK_FRAGMENT.$(vendor_ramdisk_fragment).KERNEL_MODULE_DIRS), \
271    $(eval kmd_vrf := KERNEL_MODULE_DIR_VENDOR_RAMDISK_FRAGMENT_$(kmd)) \
272    $(if $($(kmd_vrf)),$(error Kernel module directory "$(kmd)" belongs to multiple vendor ramdisk fragments: "$($(kmd_vrf))" "$(vendor_ramdisk_fragment)", each kernel module directory should belong to exactly one or none vendor ramdisk fragment)) \
273    $(eval $(kmd_vrf) := $(vendor_ramdisk_fragment)) \
274  ) \
275)
276INTERNAL_VENDOR_RAMDISK_FRAGMENTS += $(BOARD_VENDOR_RAMDISK_FRAGMENTS)
277
278# Strip the list in case of any whitespace.
279INTERNAL_VENDOR_RAMDISK_FRAGMENTS := \
280  $(strip $(INTERNAL_VENDOR_RAMDISK_FRAGMENTS))
281
282# Assign --ramdisk_name for each vendor ramdisk fragment.
283$(foreach vendor_ramdisk_fragment,$(INTERNAL_VENDOR_RAMDISK_FRAGMENTS), \
284  $(if $(filter --ramdisk_name,$(BOARD_VENDOR_RAMDISK_FRAGMENT.$(vendor_ramdisk_fragment).MKBOOTIMG_ARGS)), \
285    $(error Must not specify --ramdisk_name for vendor ramdisk fragment: $(vendor_ramdisk_fragment))) \
286  $(eval BOARD_VENDOR_RAMDISK_FRAGMENT.$(vendor_ramdisk_fragment).MKBOOTIMG_ARGS += --ramdisk_name $(vendor_ramdisk_fragment)) \
287  $(eval .KATI_READONLY := BOARD_VENDOR_RAMDISK_FRAGMENT.$(vendor_ramdisk_fragment).MKBOOTIMG_ARGS) \
288)
289
290# -----------------------------------------------------------------
291# kernel modules
292
293# Depmod requires a well-formed kernel version so 0.0 is used as a placeholder.
294DEPMOD_STAGING_SUBDIR :=$= lib/modules/0.0
295
296define copy-and-strip-kernel-module
297$(2): $(1)
298	$(LLVM_STRIP) -o $(2) --strip-debug $(1)
299endef
300
301# $(1): modules list
302# $(2): output dir
303# $(3): mount point
304# $(4): staging dir
305# $(5): module load list
306# $(6): module load list filename
307# $(7): module archive
308# $(8): staging dir for stripped modules
309# $(9): module directory name
310# $(10): extra modules that might be dependency of modules in this partition, but should not be copied to output dir
311# $(11): mount point for extra modules
312# Returns a list of src:dest pairs to install the modules using copy-many-files.
313define build-image-kernel-modules
314  $(if $(9), \
315    $(eval _dir := $(9)/), \
316    $(eval _dir :=)) \
317  $(foreach module,$(1), \
318    $(eval _src := $(module)) \
319    $(if $(8), \
320      $(eval _src := $(8)/$(notdir $(module))) \
321      $(eval $(call copy-and-strip-kernel-module,$(module),$(_src)))) \
322    $(_src):$(2)/lib/modules/$(_dir)$(notdir $(module))) \
323  $(eval $(call build-image-kernel-modules-depmod,$(1),$(3),$(4),$(5),$(6),$(7),$(2),$(9),$(10),$(11))) \
324  $(4)/$(DEPMOD_STAGING_SUBDIR)/modules.dep:$(2)/lib/modules/$(_dir)modules.dep \
325  $(4)/$(DEPMOD_STAGING_SUBDIR)/modules.alias:$(2)/lib/modules/$(_dir)modules.alias \
326  $(4)/$(DEPMOD_STAGING_SUBDIR)/modules.softdep:$(2)/lib/modules/$(_dir)modules.softdep \
327  $(4)/$(DEPMOD_STAGING_SUBDIR)/$(6):$(2)/lib/modules/$(_dir)$(6)
328endef
329
330# $(1): modules list
331# $(2): mount point
332# $(3): staging dir
333# $(4): module load list
334# $(5): module load list filename
335# $(6): module archive
336# $(7): output dir
337# $(8): module directory name
338# $(9): extra modules which should not be copied to output dir, but might be dependency of modules in this partition
339# $(10): mount point for extra modules
340# TODO(b/144844424): If a module archive is being used, this step (which
341# generates obj/PACKAGING/.../modules.dep) also unzips the module archive into
342# the output directory. This should be moved to a module with a
343# LOCAL_POST_INSTALL_CMD so that if modules.dep is removed from the output dir,
344# the archive modules are restored along with modules.dep.
345define build-image-kernel-modules-depmod
346$(3)/$(DEPMOD_STAGING_SUBDIR)/modules.dep: .KATI_IMPLICIT_OUTPUTS := $(3)/$(DEPMOD_STAGING_SUBDIR)/modules.alias $(3)/$(DEPMOD_STAGING_SUBDIR)/modules.softdep $(3)/$(DEPMOD_STAGING_SUBDIR)/$(5)
347$(3)/$(DEPMOD_STAGING_SUBDIR)/modules.dep: $(DEPMOD)
348$(3)/$(DEPMOD_STAGING_SUBDIR)/modules.dep: PRIVATE_MODULES := $(strip $(1))
349$(3)/$(DEPMOD_STAGING_SUBDIR)/modules.dep: PRIVATE_EXTRA_MODULES := $(strip $(9))
350$(3)/$(DEPMOD_STAGING_SUBDIR)/modules.dep: PRIVATE_MOUNT_POINT := $(2)
351$(3)/$(DEPMOD_STAGING_SUBDIR)/modules.dep: PRIVATE_EXTRA_MOUNT_POINT := $(10)
352$(3)/$(DEPMOD_STAGING_SUBDIR)/modules.dep: PRIVATE_MODULE_DIR := $(3)/$(DEPMOD_STAGING_SUBDIR)/$(2)/lib/modules/$(8)
353$(3)/$(DEPMOD_STAGING_SUBDIR)/modules.dep: PRIVATE_EXTRA_MODULE_DIR := $(3)/$(DEPMOD_STAGING_SUBDIR)/$(10)/lib/modules/$(8)
354$(3)/$(DEPMOD_STAGING_SUBDIR)/modules.dep: PRIVATE_STAGING_DIR := $(3)
355$(3)/$(DEPMOD_STAGING_SUBDIR)/modules.dep: PRIVATE_LOAD_MODULES := $(strip $(4))
356$(3)/$(DEPMOD_STAGING_SUBDIR)/modules.dep: PRIVATE_LOAD_FILE := $(3)/$(DEPMOD_STAGING_SUBDIR)/$(5)
357$(3)/$(DEPMOD_STAGING_SUBDIR)/modules.dep: PRIVATE_MODULE_ARCHIVE := $(6)
358$(3)/$(DEPMOD_STAGING_SUBDIR)/modules.dep: PRIVATE_OUTPUT_DIR := $(7)
359$(3)/$(DEPMOD_STAGING_SUBDIR)/modules.dep: $(1) $(6)
360	@echo depmod $$(PRIVATE_STAGING_DIR)
361	rm -rf $$(PRIVATE_STAGING_DIR)
362	mkdir -p $$(PRIVATE_MODULE_DIR)
363	$(if $(6),\
364	  unzip -qoDD -d $$(PRIVATE_MODULE_DIR) $$(PRIVATE_MODULE_ARCHIVE); \
365	  mkdir -p $$(PRIVATE_OUTPUT_DIR)/lib; \
366	  cp -r  $(3)/$(DEPMOD_STAGING_SUBDIR)/$(2)/lib/modules $$(PRIVATE_OUTPUT_DIR)/lib/; \
367	  find $$(PRIVATE_MODULE_DIR) -type f -name *.ko | xargs basename -a > $$(PRIVATE_LOAD_FILE); \
368	)
369	$(if $(1),\
370	  cp $$(PRIVATE_MODULES) $$(PRIVATE_MODULE_DIR)/; \
371	  for MODULE in $$(PRIVATE_LOAD_MODULES); do \
372	    basename $$$$MODULE >> $$(PRIVATE_LOAD_FILE); \
373	  done; \
374	)
375	# The ln -sf + find -delete sequence is to remove any modules in
376	# PRIVATE_EXTRA_MODULES which have same basename as MODULES in PRIVATE_MODULES
377	# Basically, it computes a set difference. When there is a duplicate module
378	# present in both directories, we want modules in PRIVATE_MODULES to take
379	# precedence. Since depmod does not provide any guarantee about ordering of
380	# dependency resolution, we achieve this by maually removing any duplicate
381	# modules with lower priority.
382	$(if $(9),\
383	  mkdir -p $$(PRIVATE_EXTRA_MODULE_DIR); \
384	  find $$(PRIVATE_EXTRA_MODULE_DIR) -maxdepth 1 -type f -name "*.ko" -delete; \
385	  cp $$(PRIVATE_EXTRA_MODULES) $$(PRIVATE_EXTRA_MODULE_DIR); \
386	  ln -sf $$(PRIVATE_MODULE_DIR)/*.ko $$(PRIVATE_EXTRA_MODULE_DIR); \
387	  find $$(PRIVATE_EXTRA_MODULE_DIR) -type l -delete; \
388	)
389	$(DEPMOD) -b $$(PRIVATE_STAGING_DIR) 0.0
390	# Turn paths in modules.dep into absolute paths
391	sed -i.tmp -e 's|\([^: ]*lib/modules/[^: ]*\)|/\1|g' $$(PRIVATE_STAGING_DIR)/$$(DEPMOD_STAGING_SUBDIR)/modules.dep
392	touch $$(PRIVATE_LOAD_FILE)
393endef
394
395# $(1): staging dir
396# $(2): modules list
397# $(3): module load list
398# $(4): module load list filename
399# $(5): output dir
400define module-load-list-copy-paths
401  $(eval $(call build-image-module-load-list,$(1),$(2),$(3),$(4))) \
402  $(1)/$(DEPMOD_STAGING_SUBDIR)/$(4):$(5)/lib/modules/$(4)
403endef
404
405# $(1): staging dir
406# $(2): modules list
407# $(3): module load list
408# $(4): module load list filename
409define build-image-module-load-list
410$(1)/$(DEPMOD_STAGING_SUBDIR)/$(4): PRIVATE_LOAD_MODULES := $(3)
411$(1)/$(DEPMOD_STAGING_SUBDIR)/$(4): $(2)
412	@echo load-list $$(@)
413	@echo '$$(strip $$(notdir $$(PRIVATE_LOAD_MODULES)))' | tr ' ' '\n' > $$(@)
414endef
415
416# $(1): source options file
417# $(2): destination pathname
418# Returns a build rule that checks the syntax of and installs a kernel modules
419# options file. Strip and squeeze any extra space and blank lines.
420# For use via $(eval).
421define build-image-kernel-modules-options-file
422$(2): $(1)
423	@echo "libmodprobe options $$(@)"
424	$(hide) mkdir -p "$$(dir $$@)"
425	$(hide) rm -f "$$@"
426	$(hide) awk <"$$<" >"$$@" \
427	  '/^#/ { print; next } \
428	   NF == 0 { next } \
429	   NF < 2 || $$$$1 != "options" \
430	     { print "Invalid options line " FNR ": " $$$$0 >"/dev/stderr"; \
431	       exit_status = 1; next } \
432	   { $$$$1 = $$$$1; print } \
433	   END { exit exit_status }'
434endef
435
436# $(1): source blocklist file
437# $(2): destination pathname
438# Returns a build rule that checks the syntax of and installs a kernel modules
439# blocklist file. Strip and squeeze any extra space and blank lines.
440# For use via $(eval).
441define build-image-kernel-modules-blocklist-file
442$(2): $(1)
443	@echo "libmodprobe blocklist $$(@)"
444	$(hide) mkdir -p "$$(dir $$@)"
445	$(hide) rm -f "$$@"
446	$(hide) awk <"$$<" >"$$@" \
447	  '/^#/ { print; next } \
448	   NF == 0 { next } \
449	   NF != 2 || $$$$1 != "blocklist" \
450	     { print "Invalid blocklist line " FNR ": " $$$$0 >"/dev/stderr"; \
451	       exit_status = 1; next } \
452	   { $$$$1 = $$$$1; print } \
453	   END { exit exit_status }'
454endef
455
456# $(1): image name
457# $(2): build output directory (TARGET_OUT_VENDOR, TARGET_RECOVERY_ROOT_OUT, etc)
458# $(3): mount point
459# $(4): module load filename
460# $(5): stripped staging directory
461# $(6): kernel module directory name (top is an out of band value for no directory)
462# $(7): list of extra modules that might be dependency of modules in this partition
463# $(8): mount point for extra modules. e.g. system
464
465define build-image-kernel-modules-dir
466$(if $(filter top,$(6)),\
467  $(eval _kver :=)$(eval _sep :=),\
468  $(eval _kver := $(6))$(eval _sep :=_))\
469$(if $(5),\
470  $(eval _stripped_staging_dir := $(5)$(_sep)$(_kver)),\
471  $(eval _stripped_staging_dir :=))\
472$(if $(strip $(BOARD_$(1)_KERNEL_MODULES$(_sep)$(_kver))$(BOARD_$(1)_KERNEL_MODULES_ARCHIVE$(_sep)$(_kver))),\
473  $(if $(BOARD_$(1)_KERNEL_MODULES_LOAD$(_sep)$(_kver)),,\
474    $(eval BOARD_$(1)_KERNEL_MODULES_LOAD$(_sep)$(_kver) := $(BOARD_$(1)_KERNEL_MODULES$(_sep)$(_kver)))) \
475  $(if $(filter false,$(BOARD_$(1)_KERNEL_MODULES_LOAD$(_sep)$(_kver))),\
476    $(eval BOARD_$(1)_KERNEL_MODULES_LOAD$(_sep)$(_kver) :=),) \
477  $(eval _files := $(call build-image-kernel-modules,$(BOARD_$(1)_KERNEL_MODULES$(_sep)$(_kver)),$(2),$(3),$(call intermediates-dir-for,PACKAGING,depmod_$(1)$(_sep)$(_kver)),$(BOARD_$(1)_KERNEL_MODULES_LOAD$(_sep)$(_kver)),$(4),$(BOARD_$(1)_KERNEL_MODULES_ARCHIVE$(_sep)$(_kver)),$(_stripped_staging_dir),$(_kver),$(7),$(8))) \
478  $(call copy-many-files,$(_files)) \
479  $(eval _modules := $(BOARD_$(1)_KERNEL_MODULES$(_sep)$(_kver)) ANDROID-GEN ANDROID-GEN ANDROID-GEN ANDROID-GEN) \
480  $(eval KERNEL_MODULE_COPY_FILES += $(join $(addsuffix :,$(_modules)),$(_files)))) \
481$(if $(_kver), \
482  $(eval _dir := $(_kver)/), \
483  $(eval _dir :=)) \
484$(if $(BOARD_$(1)_KERNEL_MODULES_OPTIONS_FILE$(_sep)$(_kver)), \
485  $(eval $(call build-image-kernel-modules-options-file, \
486    $(BOARD_$(1)_KERNEL_MODULES_OPTIONS_FILE$(_sep)$(_kver)), \
487    $(2)/lib/modules/$(_dir)modules.options)) \
488  $(2)/lib/modules/$(_dir)modules.options) \
489$(if $(BOARD_$(1)_KERNEL_MODULES_BLOCKLIST_FILE$(_sep)$(_kver)), \
490  $(eval $(call build-image-kernel-modules-blocklist-file, \
491    $(BOARD_$(1)_KERNEL_MODULES_BLOCKLIST_FILE$(_sep)$(_kver)), \
492    $(2)/lib/modules/$(_dir)modules.blocklist)) \
493  $(eval ALL_KERNEL_MODULES_BLOCKLIST += $(2)/lib/modules/$(_dir)modules.blocklist) \
494  $(2)/lib/modules/$(_dir)modules.blocklist)
495endef
496
497# $(1): kernel module directory name (top is an out of band value for no directory)
498define build-recovery-as-boot-load
499$(if $(filter top,$(1)),\
500  $(eval _kver :=)$(eval _sep :=),\
501  $(eval _kver := $(1))$(eval _sep :=_))\
502  $(if $(BOARD_GENERIC_RAMDISK_KERNEL_MODULES_LOAD$(_sep)$(_kver)),\
503    $(call copy-many-files,$(call module-load-list-copy-paths,$(call intermediates-dir-for,PACKAGING,ramdisk_module_list$(_sep)$(_kver)),$(BOARD_GENERIC_RAMDISK_KERNEL_MODULES$(_sep)$(_kver)),$(BOARD_GENERIC_RAMDISK_KERNEL_MODULES_LOAD$(_sep)$(_kver)),modules.load,$(TARGET_RECOVERY_ROOT_OUT))))
504endef
505
506# $(1): kernel module directory name (top is an out of band value for no directory)
507define build-vendor-ramdisk-recovery-load
508$(if $(filter top,$(1)),\
509  $(eval _kver :=)$(eval _sep :=),\
510  $(eval _kver := $(1))$(eval _sep :=_))\
511  $(if $(BOARD_VENDOR_RAMDISK_RECOVERY_KERNEL_MODULES_LOAD$(_sep)$(_kver)),\
512    $(call copy-many-files,$(call module-load-list-copy-paths,$(call intermediates-dir-for,PACKAGING,vendor_ramdisk_recovery_module_list$(_sep)$(_kver)),$(BOARD_VENDOR_RAMDISK_KERNEL_MODULES$(_sep)$(_kver)),$(BOARD_VENDOR_RAMDISK_RECOVERY_KERNEL_MODULES_LOAD$(_sep)$(_kver)),modules.load.recovery,$(TARGET_VENDOR_RAMDISK_OUT))))
513endef
514
515# $(1): kernel module directory name (top is an out of band value for no directory)
516define build-vendor-kernel-ramdisk-recovery-load
517$(if $(filter top,$(1)),\
518  $(eval _kver :=)$(eval _sep :=),\
519  $(eval _kver := $(1))$(eval _sep :=_))\
520  $(if $(BOARD_VENDOR_KERNEL_RAMDISK_RECOVERY_KERNEL_MODULES_LOAD$(_sep)$(_kver)),\
521    $(call copy-many-files,$(call module-load-list-copy-paths,$(call intermediates-dir-for,PACKAGING,vendor_kernel_ramdisk_recovery_module_list$(_sep)$(_kver)),$(BOARD_VENDOR_KERNEL_RAMDISK_KERNEL_MODULES$(_sep)$(_kver)),$(BOARD_VENDOR_KERNEL_RAMDISK_RECOVERY_KERNEL_MODULES_LOAD$(_sep)$(_kver)),modules.load.recovery,$(TARGET_VENDOR_KERNEL_RAMDISK_OUT))))
522endef
523
524# $(1): kernel module directory name (top is an out of band value for no directory)
525define build-vendor-charger-load
526$(if $(filter top,$(1)),\
527  $(eval _kver :=)$(eval _sep :=),\
528  $(eval _kver := $(1))$(eval _sep :=_))\
529  $(if $(BOARD_VENDOR_CHARGER_KERNEL_MODULES_LOAD$(_sep)$(_kver)),\
530    $(call copy-many-files,$(call module-load-list-copy-paths,$(call intermediates-dir-for,PACKAGING,vendor_charger_module_list$(_sep)$(_kver)),$(BOARD_VENDOR_CHARGER_KERNEL_MODULES$(_sep)$(_kver)),$(BOARD_VENDOR_CHARGER_KERNEL_MODULES_LOAD$(_sep)$(_kver)),modules.load.charger,$(TARGET_OUT_VENDOR))))
531endef
532
533ifneq ($(BUILDING_VENDOR_BOOT_IMAGE),true)
534  # If there is no vendor boot partition, store vendor ramdisk kernel modules in the
535  # boot ramdisk.
536  BOARD_GENERIC_RAMDISK_KERNEL_MODULES += $(BOARD_VENDOR_RAMDISK_KERNEL_MODULES)
537  BOARD_GENERIC_RAMDISK_KERNEL_MODULES_LOAD += $(BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD)
538endif
539
540ifeq ($(BOARD_GENERIC_RAMDISK_KERNEL_MODULES_LOAD),)
541  BOARD_GENERIC_RAMDISK_KERNEL_MODULES_LOAD := $(BOARD_GENERIC_RAMDISK_KERNEL_MODULES)
542endif
543
544ifneq ($(strip $(BOARD_GENERIC_RAMDISK_KERNEL_MODULES)),)
545  ifeq ($(BOARD_USES_RECOVERY_AS_BOOT), true)
546    BOARD_RECOVERY_KERNEL_MODULES += $(BOARD_GENERIC_RAMDISK_KERNEL_MODULES)
547  endif
548endif
549
550ifneq ($(BOARD_DO_NOT_STRIP_RECOVERY_MODULES),true)
551	RECOVERY_STRIPPED_MODULE_STAGING_DIR := $(call intermediates-dir-for,PACKAGING,depmod_recovery_stripped)
552else
553	RECOVERY_STRIPPED_MODULE_STAGING_DIR :=
554endif
555
556ifneq ($(BOARD_DO_NOT_STRIP_VENDOR_MODULES),true)
557	VENDOR_STRIPPED_MODULE_STAGING_DIR := $(call intermediates-dir-for,PACKAGING,depmod_vendor_stripped)
558else
559	VENDOR_STRIPPED_MODULE_STAGING_DIR :=
560endif
561
562ifneq ($(BOARD_DO_NOT_STRIP_VENDOR_RAMDISK_MODULES),true)
563  VENDOR_RAMDISK_STRIPPED_MODULE_STAGING_DIR := $(call intermediates-dir-for,PACKAGING,depmod_vendor_ramdisk_stripped)
564else
565  VENDOR_RAMDISK_STRIPPED_MODULE_STAGING_DIR :=
566endif
567
568ifneq ($(BOARD_DO_NOT_STRIP_VENDOR_KERNEL_RAMDISK_MODULES),true)
569  VENDOR_KERNEL_RAMDISK_STRIPPED_MODULE_STAGING_DIR := $(call intermediates-dir-for,PACKAGING,depmod_vendor_kernel_ramdisk_stripped)
570else
571  VENDOR_KERNEL_RAMDISK_STRIPPED_MODULE_STAGING_DIR :=
572endif
573
574BOARD_KERNEL_MODULE_DIRS += top
575
576# Default to not generating modules.dep for kernel modules on system
577# side. We should only load these modules if they are depended by vendor
578# side modules.
579ifeq ($(BOARD_SYSTEM_KERNEL_MODULES_LOAD),)
580  BOARD_SYSTEM_KERNEL_MODULES_LOAD := false
581endif
582
583$(foreach kmd,$(BOARD_KERNEL_MODULE_DIRS), \
584  $(eval ALL_DEFAULT_INSTALLED_MODULES += $(call build-image-kernel-modules-dir,RECOVERY,$(TARGET_RECOVERY_ROOT_OUT),,modules.load.recovery,$(RECOVERY_STRIPPED_MODULE_STAGING_DIR),$(kmd))) \
585  $(eval vendor_ramdisk_fragment := $(KERNEL_MODULE_DIR_VENDOR_RAMDISK_FRAGMENT_$(kmd))) \
586  $(if $(vendor_ramdisk_fragment), \
587    $(eval output_dir := $(VENDOR_RAMDISK_FRAGMENT.$(vendor_ramdisk_fragment).STAGING_DIR)) \
588    $(eval result_var := VENDOR_RAMDISK_FRAGMENT.$(vendor_ramdisk_fragment).FILES) \
589    $(eval ### else ###), \
590    $(eval output_dir := $(TARGET_VENDOR_RAMDISK_OUT)) \
591    $(eval result_var := ALL_DEFAULT_INSTALLED_MODULES)) \
592  $(eval $(result_var) += $(call build-image-kernel-modules-dir,VENDOR_RAMDISK,$(output_dir),,modules.load,$(VENDOR_RAMDISK_STRIPPED_MODULE_STAGING_DIR),$(kmd))) \
593  $(eval ALL_DEFAULT_INSTALLED_MODULES += $(call build-image-kernel-modules-dir,VENDOR_KERNEL_RAMDISK,$(TARGET_VENDOR_KERNEL_RAMDISK_OUT),,modules.load,$(VENDOR_KERNEL_RAMDISK_STRIPPED_MODULE_STAGING_DIR),$(kmd))) \
594  $(eval ALL_DEFAULT_INSTALLED_MODULES += $(call build-vendor-ramdisk-recovery-load,$(kmd))) \
595  $(eval ALL_DEFAULT_INSTALLED_MODULES += $(call build-vendor-kernel-ramdisk-recovery-load,$(kmd))) \
596  $(eval ALL_DEFAULT_INSTALLED_MODULES += $(call build-image-kernel-modules-dir,VENDOR,$(if $(filter true,$(BOARD_USES_VENDOR_DLKMIMAGE)),$(TARGET_OUT_VENDOR_DLKM),$(TARGET_OUT_VENDOR)),vendor,modules.load,$(VENDOR_STRIPPED_MODULE_STAGING_DIR),$(kmd),$(BOARD_SYSTEM_KERNEL_MODULES),system)) \
597  $(eval ALL_DEFAULT_INSTALLED_MODULES += $(call build-vendor-charger-load,$(kmd))) \
598  $(eval ALL_DEFAULT_INSTALLED_MODULES += $(call build-image-kernel-modules-dir,ODM,$(if $(filter true,$(BOARD_USES_ODM_DLKMIMAGE)),$(TARGET_OUT_ODM_DLKM),$(TARGET_OUT_ODM)),odm,modules.load,,$(kmd))) \
599  $(eval ALL_DEFAULT_INSTALLED_MODULES += $(call build-image-kernel-modules-dir,SYSTEM,$(if $(filter true,$(BOARD_USES_SYSTEM_DLKMIMAGE)),$(TARGET_OUT_SYSTEM_DLKM),$(TARGET_OUT_SYSTEM)),system,modules.load,,$(kmd))) \
600  $(if $(filter true,$(BOARD_USES_RECOVERY_AS_BOOT)),\
601    $(eval ALL_DEFAULT_INSTALLED_MODULES += $(call build-recovery-as-boot-load,$(kmd))),\
602    $(eval ALL_DEFAULT_INSTALLED_MODULES += $(call build-image-kernel-modules-dir,GENERIC_RAMDISK,$(TARGET_RAMDISK_OUT),,modules.load,,$(kmd)))))
603
604ifeq ($(BOARD_SYSTEM_KERNEL_MODULES),)
605ifneq ($(BOARD_SYSTEM_DLKM_SRC),)
606ifneq ($(wildcard $(BOARD_SYSTEM_DLKM_SRC)/*),)
607  SYSTEM_KERNEL_MODULES := $(shell find $(BOARD_SYSTEM_DLKM_SRC) -type f)
608  SRC_SYSTEM_KERNEL_MODULES := $(SYSTEM_KERNEL_MODULES)
609  DST_SYSTEM_KERNEL_MODULES := $(patsubst $(BOARD_SYSTEM_DLKM_SRC)/%,:$(TARGET_OUT_SYSTEM_DLKM)/%,$(SRC_SYSTEM_KERNEL_MODULES))
610  SYSTEM_KERNEL_MODULE_COPY_PAIRS := $(join $(SRC_SYSTEM_KERNEL_MODULES),$(DST_SYSTEM_KERNEL_MODULES))
611  ALL_DEFAULT_INSTALLED_MODULES += $(call copy-many-files,$(SYSTEM_KERNEL_MODULE_COPY_PAIRS))
612endif
613endif
614endif
615
616
617# -----------------------------------------------------------------
618# Cert-to-package mapping.  Used by the post-build signing tools.
619# Use a macro to add newline to each echo command
620# $1 stem name of the package
621# $2 certificate
622# $3 private key
623# $4 compressed
624# $5 partition tag
625# $6 output file
626define _apkcerts_write_line
627$(hide) echo -n 'name="$(1).apk" certificate="$2" private_key="$3"' >> $6
628$(if $(4), $(hide) echo -n ' compressed="$4"' >> $6)
629$(if $(5), $(hide) echo -n ' partition="$5"' >> $6)
630$(hide) echo '' >> $6
631
632endef
633
634# -----------------------------------------------------------------
635# Merge an individual apkcerts output into the final apkcerts.txt output.
636# Use a macro to make it compatible with _apkcerts_write_line
637# $1 apkcerts file to be merged
638# $2 output file
639define _apkcerts_merge
640$(hide) cat $1 >> $2
641
642endef
643
644name := $(TARGET_PRODUCT)
645ifeq ($(TARGET_BUILD_TYPE),debug)
646  name := $(name)_debug
647endif
648name := $(name)-apkcerts-$(FILE_NAME_TAG)
649intermediates := \
650	$(call intermediates-dir-for,PACKAGING,apkcerts)
651APKCERTS_FILE := $(intermediates)/$(name).txt
652all_apkcerts_files := $(sort $(foreach p,$(PACKAGES),$(PACKAGES.$(p).APKCERTS_FILE)))
653$(APKCERTS_FILE): $(all_apkcerts_files)
654# We don't need to really build all the modules.
655# TODO: rebuild APKCERTS_FILE if any app change its cert.
656$(APKCERTS_FILE):
657	@echo APK certs list: $@
658	@mkdir -p $(dir $@)
659	@rm -f $@
660	$(foreach p,$(sort $(PACKAGES)),\
661	  $(if $(PACKAGES.$(p).APKCERTS_FILE),\
662	    $(call _apkcerts_merge,$(PACKAGES.$(p).APKCERTS_FILE), $@),\
663	    $(if $(PACKAGES.$(p).EXTERNAL_KEY),\
664	      $(call _apkcerts_write_line,$(PACKAGES.$(p).STEM),EXTERNAL,,$(PACKAGES.$(p).COMPRESSED),$(PACKAGES.$(p).PARTITION),$@),\
665	      $(call _apkcerts_write_line,$(PACKAGES.$(p).STEM),$(PACKAGES.$(p).CERTIFICATE),$(PACKAGES.$(p).PRIVATE_KEY),$(PACKAGES.$(p).COMPRESSED),$(PACKAGES.$(p).PARTITION),$@))))
666	$(if $(filter true,$(PRODUCT_FSVERITY_GENERATE_METADATA)),\
667	  $(call _apkcerts_write_line,BuildManifest,$(FSVERITY_APK_KEY_PATH).x509.pem,$(FSVERITY_APK_KEY_PATH).pk8,,system,$@) \
668	  $(if $(filter true,$(BUILDING_SYSTEM_EXT_IMAGE)),\
669            $(call _apkcerts_write_line,BuildManifestSystemExt,$(FSVERITY_APK_KEY_PATH).x509.pem,$(FSVERITY_APK_KEY_PATH).pk8,,system_ext,$@)))
670	# In case value of PACKAGES is empty.
671	$(hide) touch $@
672
673$(call declare-0p-target,$(APKCERTS_FILE))
674
675.PHONY: apkcerts-list
676apkcerts-list: $(APKCERTS_FILE)
677
678ifneq (,$(TARGET_BUILD_APPS))
679  $(call dist-for-goals, apps_only, $(APKCERTS_FILE):apkcerts.txt)
680  $(call dist-for-goals, apps_only, $(SOONG_APEX_KEYS_FILE):apexkeys.txt)
681endif
682
683
684# -----------------------------------------------------------------
685# build system stats
686BUILD_SYSTEM_STATS := $(PRODUCT_OUT)/build_system_stats.txt
687$(BUILD_SYSTEM_STATS):
688	@rm -f $@
689	@$(foreach s,$(STATS.MODULE_TYPE),echo "modules_type_make,$(s),$(words $(STATS.MODULE_TYPE.$(s)))" >>$@;)
690	@$(foreach s,$(STATS.SOONG_MODULE_TYPE),echo "modules_type_soong,$(s),$(STATS.SOONG_MODULE_TYPE.$(s))" >>$@;)
691$(call declare-1p-target,$(BUILD_SYSTEM_STATS),build)
692$(call dist-for-goals,droidcore-unbundled,$(BUILD_SYSTEM_STATS))
693
694# -----------------------------------------------------------------
695# build /product/etc/security/avb/system_other.avbpubkey if needed
696ifdef BUILDING_SYSTEM_OTHER_IMAGE
697ifeq ($(BOARD_AVB_ENABLE),true)
698INSTALLED_PRODUCT_SYSTEM_OTHER_AVBKEY_TARGET := $(TARGET_OUT_PRODUCT_ETC)/security/avb/system_other.avbpubkey
699ALL_DEFAULT_INSTALLED_MODULES += $(INSTALLED_PRODUCT_SYSTEM_OTHER_AVBKEY_TARGET)
700endif # BOARD_AVB_ENABLE
701endif # BUILDING_SYSTEM_OTHER_IMAGE
702
703# -----------------------------------------------------------------
704# Modules ready to be converted to Soong, ordered by how many
705# modules depend on them.
706SOONG_CONV := $(sort $(SOONG_CONV))
707SOONG_CONV_DATA := $(call intermediates-dir-for,PACKAGING,soong_conversion)/soong_conv_data
708$(SOONG_CONV_DATA):
709	@rm -f $@
710	@$(foreach s,$(SOONG_CONV),echo "$(s),$(SOONG_CONV.$(s).TYPE),$(sort $(SOONG_CONV.$(s).PROBLEMS)),$(sort $(filter-out $(SOONG_ALREADY_CONV),$(SOONG_CONV.$(s).DEPS))),$(sort $(SOONG_CONV.$(s).MAKEFILES)),$(sort $(SOONG_CONV.$(s).INSTALLED))" >>$@;)
711
712$(call declare-1p-target,$(SOONG_CONV_DATA),build)
713
714SOONG_TO_CONVERT_SCRIPT := build/make/tools/soong_to_convert.py
715SOONG_TO_CONVERT := $(PRODUCT_OUT)/soong_to_convert.txt
716$(SOONG_TO_CONVERT): $(SOONG_CONV_DATA) $(SOONG_TO_CONVERT_SCRIPT)
717	@rm -f $@
718	$(hide) $(SOONG_TO_CONVERT_SCRIPT) $< >$@
719$(call declare-1p-target,$(SOONG_TO_CONVERT),build)
720$(call dist-for-goals,droidcore-unbundled,$(SOONG_TO_CONVERT))
721
722$(PRODUCT_OUT)/product_packages.txt:
723	@rm -f $@
724	echo "" > $@
725	$(foreach x,$(PRODUCT_PACKAGES),echo $(x) >> $@$(newline))
726
727MK2BP_CATALOG_SCRIPT := build/make/tools/mk2bp_catalog.py
728PRODUCT_PACKAGES_TXT := $(PRODUCT_OUT)/product_packages.txt
729MK2BP_REMAINING_HTML := $(PRODUCT_OUT)/mk2bp_remaining.html
730$(MK2BP_REMAINING_HTML): PRIVATE_CODE_SEARCH_BASE_URL := "https://cs.android.com/android/platform/superproject/+/master:"
731$(MK2BP_REMAINING_HTML): $(SOONG_CONV_DATA) $(MK2BP_CATALOG_SCRIPT) $(PRODUCT_PACKAGES_TXT)
732	@rm -f $@
733	$(hide) $(MK2BP_CATALOG_SCRIPT) \
734		--device=$(TARGET_DEVICE) \
735		--product-packages=$(PRODUCT_PACKAGES_TXT) \
736		--title="Remaining Android.mk files for $(TARGET_DEVICE)-$(TARGET_BUILD_VARIANT)" \
737		--codesearch=$(PRIVATE_CODE_SEARCH_BASE_URL) \
738		--out-dir="$(OUT_DIR)" \
739		--mode=html \
740		> $@
741$(call declare-1p-target,$(MK2BP_REMAINING_HTML),build)
742$(call dist-for-goals,droidcore-unbundled,$(MK2BP_REMAINING_HTML))
743
744MK2BP_REMAINING_CSV := $(PRODUCT_OUT)/mk2bp_remaining.csv
745$(MK2BP_REMAINING_CSV): $(SOONG_CONV_DATA) $(MK2BP_CATALOG_SCRIPT) $(PRODUCT_PACKAGES_TXT)
746	@rm -f $@
747	$(hide) $(MK2BP_CATALOG_SCRIPT) \
748		--device=$(TARGET_DEVICE) \
749		--product-packages=$(PRODUCT_PACKAGES_TXT) \
750		--out-dir="$(OUT_DIR)" \
751		--mode=csv \
752		> $@
753$(call declare-1p-target,$(MK2BP_REMAINING_CSV))
754$(call dist-for-goals,droidcore-unbundled,$(MK2BP_REMAINING_CSV))
755
756# -----------------------------------------------------------------
757# Modules use -Wno-error, or added default -Wall -Werror
758WALL_WERROR := $(PRODUCT_OUT)/wall_werror.txt
759$(WALL_WERROR):
760	@rm -f $@
761	echo "# Modules using -Wno-error" >> $@
762	for m in $(sort $(SOONG_MODULES_USING_WNO_ERROR) $(MODULES_USING_WNO_ERROR)); do echo $$m >> $@; done
763	echo "# Modules that allow warnings" >> $@
764	for m in $(sort $(SOONG_MODULES_WARNINGS_ALLOWED) $(MODULES_WARNINGS_ALLOWED)); do echo $$m >> $@; done
765
766$(call declare-0p-target,$(WALL_WERROR))
767
768$(call dist-for-goals,droidcore-unbundled,$(WALL_WERROR))
769
770# -----------------------------------------------------------------
771# Modules missing profile files
772PGO_PROFILE_MISSING := $(PRODUCT_OUT)/pgo_profile_file_missing.txt
773$(PGO_PROFILE_MISSING):
774	@rm -f $@
775	echo "# Modules missing PGO profile files" >> $@
776	for m in $(SOONG_MODULES_MISSING_PGO_PROFILE_FILE); do echo $$m >> $@; done
777
778$(call declare-0p-target,$(PGO_PROFILE_MISSING))
779
780$(call dist-for-goals,droidcore,$(PGO_PROFILE_MISSING))
781
782CERTIFICATE_VIOLATION_MODULES_FILENAME := $(PRODUCT_OUT)/certificate_violation_modules.txt
783$(CERTIFICATE_VIOLATION_MODULES_FILENAME):
784	rm -f $@
785	$(foreach m,$(sort $(CERTIFICATE_VIOLATION_MODULES)), echo $(m) >> $@;)
786$(call declare-0p-target,$(CERTIFICATE_VIOLATION_MODULES_FILENAME))
787$(call dist-for-goals,droidcore,$(CERTIFICATE_VIOLATION_MODULES_FILENAME))
788
789# -----------------------------------------------------------------
790# The dev key is used to sign this package, and as the key required
791# for future OTA packages installed by this system.  Actual product
792# deliverables will be re-signed by hand.  We expect this file to
793# exist with the suffixes ".x509.pem" and ".pk8".
794DEFAULT_KEY_CERT_PAIR := $(strip $(DEFAULT_SYSTEM_DEV_CERTIFICATE))
795
796
797# Rules that need to be present for the all targets, even
798# if they don't do anything.
799.PHONY: systemimage
800systemimage:
801
802# -----------------------------------------------------------------
803
804.PHONY: event-log-tags
805
806# Produce an event logs tag file for everything we know about, in order
807# to properly allocate numbers.  Then produce a file that's filtered
808# for what's going to be installed.
809
810all_event_log_tags_file := $(TARGET_OUT_COMMON_INTERMEDIATES)/all-event-log-tags.txt
811
812event_log_tags_file := $(TARGET_OUT)/etc/event-log-tags
813
814# Include tags from all packages that we know about
815all_event_log_tags_src := \
816    $(sort $(foreach m, $(ALL_MODULES), $(ALL_MODULES.$(m).EVENT_LOG_TAGS)))
817
818$(all_event_log_tags_file): PRIVATE_SRC_FILES := $(all_event_log_tags_src)
819$(all_event_log_tags_file): $(all_event_log_tags_src) $(MERGETAGS) build/make/tools/event_log_tags.py
820	$(hide) mkdir -p $(dir $@)
821	$(hide) $(MERGETAGS) -o $@ $(PRIVATE_SRC_FILES)
822
823$(call declare-0p-target,$(all_event_log_tags_file))
824
825# Include tags from all packages included in this product, plus all
826# tags that are part of the system (ie, not in a vendor/ or device/
827# directory).
828event_log_tags_src := \
829    $(sort $(foreach m,\
830      $(call resolve-bitness-for-modules,TARGET,$(PRODUCT_PACKAGES)) \
831      $(call module-names-for-tag-list,user), \
832      $(ALL_MODULES.$(m).EVENT_LOG_TAGS)) \
833      $(filter-out vendor/% device/% out/%,$(all_event_log_tags_src)))
834
835$(event_log_tags_file): PRIVATE_SRC_FILES := $(event_log_tags_src)
836$(event_log_tags_file): PRIVATE_MERGED_FILE := $(all_event_log_tags_file)
837$(event_log_tags_file): $(event_log_tags_src) $(all_event_log_tags_file) $(MERGETAGS) build/make/tools/event_log_tags.py
838	$(hide) mkdir -p $(dir $@)
839	$(hide) $(MERGETAGS) -o $@ -m $(PRIVATE_MERGED_FILE) $(PRIVATE_SRC_FILES)
840
841$(eval $(call declare-0p-target,$(event_log_tags_file)))
842
843event-log-tags: $(event_log_tags_file)
844
845ALL_DEFAULT_INSTALLED_MODULES += $(event_log_tags_file)
846
847# Initialize INSTALLED_FILES_OUTSIDE_IMAGES with the list of all device files,
848# files installed in images will be filtered out later.
849INSTALLED_FILES_OUTSIDE_IMAGES := $(filter-out \
850  $(PRODUCT_OUT)/apex/% \
851  $(PRODUCT_OUT)/fake_packages/% \
852  $(PRODUCT_OUT)/testcases/%, \
853  $(filter $(PRODUCT_OUT)/%,$(ALL_DEFAULT_INSTALLED_MODULES)))
854
855# #################################################################
856# Targets for boot/OS images
857# #################################################################
858ifneq ($(strip $(TARGET_NO_BOOTLOADER)),true)
859  INSTALLED_BOOTLOADER_MODULE := $(PRODUCT_OUT)/bootloader
860  ifdef BOARD_PREBUILT_BOOTLOADER
861    $(eval $(call copy-one-file,$(BOARD_PREBUILT_BOOTLOADER),$(INSTALLED_BOOTLOADER_MODULE)))
862    $(call dist-for-goals,dist_files,$(INSTALLED_BOOTLOADER_MODULE))
863  endif # BOARD_PREBUILT_BOOTLOADER
864  ifeq ($(strip $(TARGET_BOOTLOADER_IS_2ND)),true)
865    INSTALLED_2NDBOOTLOADER_TARGET := $(PRODUCT_OUT)/2ndbootloader
866  else
867    INSTALLED_2NDBOOTLOADER_TARGET :=
868  endif
869else
870  INSTALLED_BOOTLOADER_MODULE :=
871  INSTALLED_2NDBOOTLOADER_TARGET :=
872endif # TARGET_NO_BOOTLOADER
873ifneq ($(strip $(TARGET_NO_KERNEL)),true)
874  ifneq ($(strip $(BOARD_KERNEL_BINARIES)),)
875    INSTALLED_KERNEL_TARGET := $(foreach k,$(BOARD_KERNEL_BINARIES), \
876      $(PRODUCT_OUT)/$(k))
877  else
878    INSTALLED_KERNEL_TARGET := $(PRODUCT_OUT)/kernel
879  endif
880else
881  INSTALLED_KERNEL_TARGET :=
882endif
883
884# -----------------------------------------------------------------
885# the root dir
886INSTALLED_FILES_OUTSIDE_IMAGES := $(filter-out $(TARGET_ROOT_OUT)/%, $(INSTALLED_FILES_OUTSIDE_IMAGES))
887INTERNAL_ROOT_FILES := $(filter $(TARGET_ROOT_OUT)/%, \
888	$(ALL_DEFAULT_INSTALLED_MODULES))
889
890
891INSTALLED_FILES_FILE_ROOT := $(PRODUCT_OUT)/installed-files-root.txt
892INSTALLED_FILES_JSON_ROOT := $(INSTALLED_FILES_FILE_ROOT:.txt=.json)
893$(INSTALLED_FILES_FILE_ROOT): .KATI_IMPLICIT_OUTPUTS := $(INSTALLED_FILES_JSON_ROOT)
894$(INSTALLED_FILES_FILE_ROOT) : $(INTERNAL_ROOT_FILES) $(FILESLIST) $(FILESLIST_UTIL)
895	@echo Installed file list: $@
896	mkdir -p $(TARGET_ROOT_OUT)
897	mkdir -p $(dir $@)
898	rm -f $@
899	$(FILESLIST) $(TARGET_ROOT_OUT) > $(@:.txt=.json)
900	$(FILESLIST_UTIL) -c $(@:.txt=.json) > $@
901
902$(call declare-0p-target,$(INSTALLED_FILES_FILE_ROOT))
903$(call declare-0p-target,$(INSTALLED_FILES_JSON_ROOT))
904
905#------------------------------------------------------------------
906# dtb
907ifdef BOARD_INCLUDE_DTB_IN_BOOTIMG
908INSTALLED_DTBIMAGE_TARGET := $(PRODUCT_OUT)/dtb.img
909ifdef BOARD_PREBUILT_DTBIMAGE_DIR
910$(INSTALLED_DTBIMAGE_TARGET) : $(sort $(wildcard $(BOARD_PREBUILT_DTBIMAGE_DIR)/*.dtb))
911	cat $^ > $@
912endif
913endif
914
915# -----------------------------------------------------------------
916# the ramdisk
917INSTALLED_FILES_OUTSIDE_IMAGES := $(filter-out $(TARGET_RAMDISK_OUT)/%, $(INSTALLED_FILES_OUTSIDE_IMAGES))
918ifdef BUILDING_RAMDISK_IMAGE
919INTERNAL_RAMDISK_FILES := $(filter $(TARGET_RAMDISK_OUT)/%, \
920	$(ALL_DEFAULT_INSTALLED_MODULES))
921
922INSTALLED_FILES_FILE_RAMDISK := $(PRODUCT_OUT)/installed-files-ramdisk.txt
923INSTALLED_FILES_JSON_RAMDISK := $(INSTALLED_FILES_FILE_RAMDISK:.txt=.json)
924$(INSTALLED_FILES_FILE_RAMDISK): .KATI_IMPLICIT_OUTPUTS := $(INSTALLED_FILES_JSON_RAMDISK)
925$(INSTALLED_FILES_FILE_RAMDISK) : $(INTERNAL_RAMDISK_FILES) $(FILESLIST) $(FILESLIST_UTIL)
926	@echo Installed file list: $@
927	mkdir -p $(TARGET_RAMDISK_OUT)
928	mkdir -p $(dir $@)
929	rm -f $@
930	$(FILESLIST) $(TARGET_RAMDISK_OUT) > $(@:.txt=.json)
931	$(FILESLIST_UTIL) -c $(@:.txt=.json) > $@
932
933$(eval $(call declare-0p-target,$(INSTALLED_FILES_FILE_RAMDISK)))
934$(eval $(call declare-0p-target,$(INSTALLED_FILES_JSON_RAMDISK)))
935
936BUILT_RAMDISK_TARGET := $(PRODUCT_OUT)/ramdisk.img
937
938ifeq ($(BOARD_RAMDISK_USE_LZ4),true)
939# -l enables the legacy format used by the Linux kernel
940COMPRESSION_COMMAND_DEPS := $(LZ4)
941COMPRESSION_COMMAND := $(LZ4) -l -12 --favor-decSpeed
942RAMDISK_EXT := .lz4
943else
944COMPRESSION_COMMAND_DEPS := $(MINIGZIP)
945COMPRESSION_COMMAND := $(MINIGZIP)
946RAMDISK_EXT := .gz
947endif
948
949# This file contains /dev nodes description added to the generic ramdisk
950RAMDISK_NODE_LIST := $(PRODUCT_OUT)/ramdisk_node_list
951
952# We just build this directly to the install location.
953INSTALLED_RAMDISK_TARGET := $(BUILT_RAMDISK_TARGET)
954$(INSTALLED_RAMDISK_TARGET): PRIVATE_DIRS := debug_ramdisk dev metadata mnt proc second_stage_resources sys
955$(INSTALLED_RAMDISK_TARGET): $(MKBOOTFS) $(RAMDISK_NODE_LIST) $(INTERNAL_RAMDISK_FILES) $(INSTALLED_FILES_FILE_RAMDISK) | $(COMPRESSION_COMMAND_DEPS)
956	$(call pretty,"Target ramdisk: $@")
957	$(hide) mkdir -p $(addprefix $(TARGET_RAMDISK_OUT)/,$(PRIVATE_DIRS))
958ifeq (true,$(BOARD_USES_GENERIC_KERNEL_IMAGE))
959	$(hide) mkdir -p $(addprefix $(TARGET_RAMDISK_OUT)/first_stage_ramdisk/,$(PRIVATE_DIRS))
960endif
961	$(hide) $(MKBOOTFS) -n $(RAMDISK_NODE_LIST) -d $(TARGET_OUT) $(TARGET_RAMDISK_OUT) | $(COMPRESSION_COMMAND) > $@
962
963$(call declare-1p-container,$(INSTALLED_RAMDISK_TARGET),)
964$(call declare-container-license-deps,$(INSTALLED_RAMDISK_TARGET),$(INTERNAL_RAMDISK_FILE),$(PRODUCT_OUT)/:/)
965
966UNMOUNTED_NOTICE_VENDOR_DEPS += $(INSTALLED_RAMDISK_TARGET)
967
968.PHONY: ramdisk-nodeps
969ramdisk-nodeps: $(MKBOOTFS) | $(COMPRESSION_COMMAND_DEPS)
970	@echo "make $@: ignoring dependencies"
971	$(hide) $(MKBOOTFS) -d $(TARGET_OUT) $(TARGET_RAMDISK_OUT) | $(COMPRESSION_COMMAND) > $(INSTALLED_RAMDISK_TARGET)
972
973endif # BUILDING_RAMDISK_IMAGE
974
975# -----------------------------------------------------------------
976# the boot image, which is a collection of other images.
977
978# This is defined here since we may be building recovery as boot
979# below and only want to define this once
980ifneq ($(strip $(BOARD_KERNEL_BINARIES)),)
981  BUILT_BOOTIMAGE_TARGET := $(foreach k,$(subst kernel,boot,$(BOARD_KERNEL_BINARIES)), $(PRODUCT_OUT)/$(k).img)
982else
983  BUILT_BOOTIMAGE_TARGET := $(PRODUCT_OUT)/boot.img
984endif
985
986INTERNAL_PREBUILT_BOOTIMAGE :=
987
988my_installed_prebuilt_gki_apex := $(strip $(foreach package,$(PRODUCT_PACKAGES),$(if $(ALL_MODULES.$(package).EXTRACTED_BOOT_IMAGE),$(package))))
989ifdef my_installed_prebuilt_gki_apex
990  ifneq (1,$(words $(my_installed_prebuilt_gki_apex))) # len(my_installed_prebuilt_gki_apex) > 1
991    $(error More than one prebuilt GKI APEXes are installed: $(my_installed_prebuilt_gki_apex))
992  endif # len(my_installed_prebuilt_gki_apex) > 1
993
994  ifdef BOARD_PREBUILT_BOOTIMAGE
995    $(error Must not define BOARD_PREBUILT_BOOTIMAGE because a prebuilt GKI APEX is installed: $(my_installed_prebuilt_gki_apex))
996  endif # BOARD_PREBUILT_BOOTIMAGE defined
997
998  my_apex_extracted_boot_image := $(ALL_MODULES.$(my_installed_prebuilt_gki_apex).EXTRACTED_BOOT_IMAGE)
999  INSTALLED_BOOTIMAGE_TARGET := $(PRODUCT_OUT)/boot.img
1000  $(eval $(call copy-one-file,$(my_apex_extracted_boot_image),$(INSTALLED_BOOTIMAGE_TARGET)))
1001  $(call declare-container-license-metadata,$(INSTALLED_BOOTIMAGE_TARGET),SPDX-license-identifier-GPL-2.0-only SPDX-license-identifier-Apache-2.0,restricted notice,$(BUILD_SYSTEM)/LINUX_KERNEL_COPYING build/soong/licenses/LICENSE,"Boot Image",boot)
1002
1003  INTERNAL_PREBUILT_BOOTIMAGE := $(my_apex_extracted_boot_image)
1004
1005else # my_installed_prebuilt_gki_apex not defined
1006
1007# $1: boot image target
1008# returns the kernel used to make the bootimage
1009define bootimage-to-kernel
1010  $(if $(BOARD_KERNEL_BINARIES),\
1011    $(PRODUCT_OUT)/$(subst .img,,$(subst boot,kernel,$(notdir $(1)))),\
1012    $(INSTALLED_KERNEL_TARGET))
1013endef
1014
1015ifdef BOARD_BOOTIMAGE_PARTITION_SIZE
1016  BOARD_KERNEL_BOOTIMAGE_PARTITION_SIZE := $(BOARD_BOOTIMAGE_PARTITION_SIZE)
1017endif
1018
1019# $1: boot image file name
1020# $2: boot image variant (boot, boot-debug, boot-test-harness)
1021define get-bootimage-partition-size
1022$(BOARD_$(call to-upper,$(subst .img,,$(subst $(2),kernel,$(notdir $(1)))))_BOOTIMAGE_PARTITION_SIZE)
1023endef
1024
1025# $1: partition size
1026define get-partition-size-argument
1027  $(if $(1),--partition_size $(1),--dynamic_partition_size)
1028endef
1029
1030ifndef BOARD_PREBUILT_BOOTIMAGE
1031
1032ifneq ($(strip $(TARGET_NO_KERNEL)),true)
1033INTERNAL_BOOTIMAGE_ARGS := \
1034	$(addprefix --second ,$(INSTALLED_2NDBOOTLOADER_TARGET))
1035
1036# TODO(b/229701033): clean up BOARD_BUILD_GKI_BOOT_IMAGE_WITHOUT_RAMDISK.
1037ifneq ($(BOARD_BUILD_GKI_BOOT_IMAGE_WITHOUT_RAMDISK),true)
1038  ifneq ($(BUILDING_INIT_BOOT_IMAGE),true)
1039    INTERNAL_BOOTIMAGE_ARGS += --ramdisk $(INSTALLED_RAMDISK_TARGET)
1040  endif
1041endif
1042
1043ifndef BUILDING_VENDOR_BOOT_IMAGE
1044ifdef BOARD_INCLUDE_DTB_IN_BOOTIMG
1045  INTERNAL_BOOTIMAGE_ARGS += --dtb $(INSTALLED_DTBIMAGE_TARGET)
1046endif
1047endif
1048
1049INTERNAL_BOOTIMAGE_FILES := $(filter-out --%,$(INTERNAL_BOOTIMAGE_ARGS))
1050
1051# kernel cmdline/base/pagesize in boot.
1052# - If using GKI, use GENERIC_KERNEL_CMDLINE. Remove kernel base and pagesize because they are
1053#   device-specific.
1054# - If not using GKI:
1055#   - If building vendor_boot, INTERNAL_KERNEL_CMDLINE, base and pagesize goes in vendor_boot.
1056#   - Otherwise, put them in boot.
1057ifeq (true,$(BOARD_USES_GENERIC_KERNEL_IMAGE))
1058  ifdef GENERIC_KERNEL_CMDLINE
1059    INTERNAL_BOOTIMAGE_ARGS += --cmdline "$(GENERIC_KERNEL_CMDLINE)"
1060  endif
1061else ifndef BUILDING_VENDOR_BOOT_IMAGE # && BOARD_USES_GENERIC_KERNEL_IMAGE != true
1062  ifdef INTERNAL_KERNEL_CMDLINE
1063    INTERNAL_BOOTIMAGE_ARGS += --cmdline "$(INTERNAL_KERNEL_CMDLINE)"
1064  endif
1065  ifdef BOARD_KERNEL_BASE
1066    INTERNAL_BOOTIMAGE_ARGS += --base $(BOARD_KERNEL_BASE)
1067  endif
1068  ifdef BOARD_KERNEL_PAGESIZE
1069    INTERNAL_BOOTIMAGE_ARGS += --pagesize $(BOARD_KERNEL_PAGESIZE)
1070  endif
1071endif # BUILDING_VENDOR_BOOT_IMAGE == "" && BOARD_USES_GENERIC_KERNEL_IMAGE != true
1072
1073ifdef BOARD_GKI_SIGNING_KEY_PATH
1074  # GKI boot images will not set system version & SPL value in the header.
1075  # They can be set by the device manufacturer in the AVB properties instead.
1076  INTERNAL_MKBOOTIMG_VERSION_ARGS :=
1077else
1078  INTERNAL_MKBOOTIMG_VERSION_ARGS := \
1079    --os_version $(PLATFORM_VERSION_LAST_STABLE) \
1080    --os_patch_level $(PLATFORM_SECURITY_PATCH)
1081endif # BOARD_GKI_SIGNING_KEY_PATH
1082
1083# $(1): image target to certify
1084# $(2): out certificate target
1085# $(3): image name
1086# $(4): additional AVB arguments
1087define generate_generic_boot_image_certificate
1088  rm -rf "$(2)"
1089  mkdir -p "$(dir $(2))"
1090  $(GENERATE_GKI_CERTIFICATE) $(INTERNAL_GKI_CERTIFICATE_ARGS) \
1091    --additional_avb_args "$(4)" \
1092    --name "$(3)" --output "$(2)" "$(1)"
1093endef
1094
1095INTERNAL_GKI_CERTIFICATE_ARGS :=
1096INTERNAL_GKI_CERTIFICATE_DEPS :=
1097ifdef BOARD_GKI_SIGNING_KEY_PATH
1098  ifndef BOARD_GKI_SIGNING_ALGORITHM
1099    $(error BOARD_GKI_SIGNING_ALGORITHM should be defined with BOARD_GKI_SIGNING_KEY_PATH)
1100  endif
1101
1102  INTERNAL_GKI_CERTIFICATE_ARGS := \
1103    --key "$(BOARD_GKI_SIGNING_KEY_PATH)" \
1104    --algorithm "$(BOARD_GKI_SIGNING_ALGORITHM)" \
1105    --avbtool "$(AVBTOOL)"
1106
1107  # Quote and pass BOARD_GKI_SIGNING_SIGNATURE_ARGS as a single string argument.
1108  ifdef BOARD_GKI_SIGNING_SIGNATURE_ARGS
1109    INTERNAL_GKI_CERTIFICATE_ARGS += --additional_avb_args "$(BOARD_GKI_SIGNING_SIGNATURE_ARGS)"
1110  endif
1111
1112  INTERNAL_GKI_CERTIFICATE_DEPS := \
1113    $(GENERATE_GKI_CERTIFICATE) \
1114    $(BOARD_GKI_SIGNING_KEY_PATH) \
1115    $(AVBTOOL)
1116
1117endif
1118
1119# Define these only if we are building boot
1120ifdef BUILDING_BOOT_IMAGE
1121INSTALLED_BOOTIMAGE_TARGET := $(BUILT_BOOTIMAGE_TARGET)
1122
1123ifeq ($(TARGET_BOOTIMAGE_USE_EXT2),true)
1124$(error TARGET_BOOTIMAGE_USE_EXT2 is not supported anymore)
1125endif # TARGET_BOOTIMAGE_USE_EXT2
1126
1127$(foreach b,$(INSTALLED_BOOTIMAGE_TARGET), $(eval $(call add-dependency,$(b),$(call bootimage-to-kernel,$(b)))))
1128
1129ifeq (true,$(BOARD_AVB_ENABLE))
1130
1131# $1: boot image target
1132define build_boot_board_avb_enabled
1133  $(eval kernel := $(call bootimage-to-kernel,$(1)))
1134  $(MKBOOTIMG) --kernel $(kernel) $(INTERNAL_BOOTIMAGE_ARGS) $(INTERNAL_MKBOOTIMG_VERSION_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $(1)
1135  $(if $(BOARD_GKI_SIGNING_KEY_PATH), \
1136    $(eval boot_signature := $(call intermediates-dir-for,PACKAGING,generic_boot)/$(notdir $(1)).boot_signature) \
1137    $(eval kernel_signature := $(call intermediates-dir-for,PACKAGING,generic_kernel)/$(notdir $(kernel)).boot_signature) \
1138    $(call generate_generic_boot_image_certificate,$(1),$(boot_signature),boot,$(BOARD_AVB_BOOT_ADD_HASH_FOOTER_ARGS)) $(newline) \
1139    $(call generate_generic_boot_image_certificate,$(kernel),$(kernel_signature),generic_kernel,$(BOARD_AVB_BOOT_ADD_HASH_FOOTER_ARGS)) $(newline) \
1140    cat $(kernel_signature) >> $(boot_signature) $(newline) \
1141    $(call assert-max-image-size,$(boot_signature),16 << 10) $(newline) \
1142    truncate -s $$(( 16 << 10 )) $(boot_signature) $(newline) \
1143    cat "$(boot_signature)" >> $(1))
1144  $(call assert-max-image-size,$(1),$(call get-hash-image-max-size,$(call get-bootimage-partition-size,$(1),boot)))
1145  $(AVBTOOL) add_hash_footer \
1146          --image $(1) \
1147          $(call get-partition-size-argument,$(call get-bootimage-partition-size,$(1),boot)) \
1148          --partition_name boot $(INTERNAL_AVB_BOOT_SIGNING_ARGS) \
1149          $(BOARD_AVB_BOOT_ADD_HASH_FOOTER_ARGS)
1150endef
1151
1152$(INSTALLED_BOOTIMAGE_TARGET): $(MKBOOTIMG) $(AVBTOOL) $(INTERNAL_BOOTIMAGE_FILES) $(BOARD_AVB_BOOT_KEY_PATH) $(INTERNAL_GKI_CERTIFICATE_DEPS)
1153	$(call pretty,"Target boot image: $@")
1154	$(call build_boot_board_avb_enabled,$@)
1155
1156$(call declare-container-license-metadata,$(INSTALLED_BOOTIMAGE_TARGET),SPDX-license-identifier-GPL-2.0-only SPDX-license-identifier-Apache-2.0,restricted notice,$(BUILD_SYSTEM)/LINUX_KERNEL_COPYING build/soong/licenses/LICENSE,"Boot Image",boot)
1157$(call declare-container-license-deps,$(INSTALLED_BOOTIMAGE_TARGET),$(INTERNAL_BOOTIMAGE_FILES) $(INTERNAL_GKI_CERTIFICATE_DEPS),$(PRODUCT_OUT)/:/)
1158
1159UNMOUNTED_NOTICE_VENDOR_DEPS += $(INSTALLED_BOOTIMAGE_TARGET)
1160
1161.PHONY: bootimage-nodeps
1162bootimage-nodeps: $(MKBOOTIMG) $(AVBTOOL) $(BOARD_AVB_BOOT_KEY_PATH) $(INTERNAL_GKI_CERTIFICATE_DEPS)
1163	@echo "make $@: ignoring dependencies"
1164	$(foreach b,$(INSTALLED_BOOTIMAGE_TARGET),$(call build_boot_board_avb_enabled,$(b)))
1165
1166else ifeq (true,$(PRODUCT_SUPPORTS_VBOOT)) # BOARD_AVB_ENABLE != true
1167
1168# $1: boot image target
1169define build_boot_supports_vboot
1170  $(MKBOOTIMG) --kernel $(call bootimage-to-kernel,$(1)) $(INTERNAL_BOOTIMAGE_ARGS) $(INTERNAL_MKBOOTIMG_VERSION_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $(1).unsigned
1171  $(VBOOT_SIGNER) $(FUTILITY) $(1).unsigned $(PRODUCT_VBOOT_SIGNING_KEY).vbpubk $(PRODUCT_VBOOT_SIGNING_KEY).vbprivk $(PRODUCT_VBOOT_SIGNING_SUBKEY).vbprivk $(1).keyblock $(1)
1172  $(call assert-max-image-size,$(1),$(call get-bootimage-partition-size,$(1),boot))
1173endef
1174
1175$(INSTALLED_BOOTIMAGE_TARGET): $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_FILES) $(VBOOT_SIGNER) $(FUTILITY)
1176	$(call pretty,"Target boot image: $@")
1177	$(call build_boot_supports_vboot,$@)
1178
1179$(call declare-container-license-metadata,$(INSTALLED_BOOTIMAGE_TARGET),SPDX-license-identifier-GPL-2.0-only SPDX-license-identifier-Apache-2.0,restricted notice,$(BUILD_SYSTEM)/LINUX_KERNEL_COPYING build/soong/licenses/LICENSE,"Boot Image",boot)
1180$(call declare-container-license-deps,$(INSTALLED_BOOTIMAGE_TARGET),$(INTERNAL_BOOTIMAGE_FILES),$(PRODUCT_OUT)/:/)
1181
1182UNMOUNTED_NOTICE_VENDOR_DEPS += $(INSTALLED_BOOTIMAGE_TARGET)
1183
1184.PHONY: bootimage-nodeps
1185bootimage-nodeps: $(MKBOOTIMG) $(VBOOT_SIGNER) $(FUTILITY)
1186	@echo "make $@: ignoring dependencies"
1187	$(foreach b,$(INSTALLED_BOOTIMAGE_TARGET),$(call build_boot_supports_vboot,$(b)))
1188
1189else # PRODUCT_SUPPORTS_VBOOT != true
1190
1191# $1: boot image target
1192define build_boot_novboot
1193  $(MKBOOTIMG) --kernel $(call bootimage-to-kernel,$(1)) $(INTERNAL_BOOTIMAGE_ARGS) $(INTERNAL_MKBOOTIMG_VERSION_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $(1)
1194  $(call assert-max-image-size,$1,$(call get-bootimage-partition-size,$(1),boot))
1195endef
1196
1197$(INSTALLED_BOOTIMAGE_TARGET): $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_FILES)
1198	$(call pretty,"Target boot image: $@")
1199	$(call build_boot_novboot,$@)
1200
1201$(call declare-container-license-metadata,$(INSTALLED_BOOTIMAGE_TARGET),SPDX-license-identifier-GPL-2.0-only SPDX-license-identifier-Apache-2.0,restricted notice,$(BUILD_SYSTEM)/LINUX_KERNEL_COPYING build/soong/licenses/LICENSE,"Boot Image",boot)
1202$(call declare-container-license-deps,$(INSTALLED_BOOTIMAGE_TARGET),$(INTERNAL_BOOTIMAGE_FILES),$(PRODUCT_OUT)/:/)
1203
1204UNMOUNTED_NOTICE_VENDOR_DEPS += $(INSTALLED_BOOTIMAGE_TARGET)
1205
1206.PHONY: bootimage-nodeps
1207bootimage-nodeps: $(MKBOOTIMG)
1208	@echo "make $@: ignoring dependencies"
1209	$(foreach b,$(INSTALLED_BOOTIMAGE_TARGET),$(call build_boot_novboot,$(b)))
1210
1211endif # BOARD_AVB_ENABLE
1212endif # BUILDING_BOOT_IMAGE
1213
1214else # TARGET_NO_KERNEL == "true"
1215INSTALLED_BOOTIMAGE_TARGET :=
1216endif # TARGET_NO_KERNEL
1217
1218else # BOARD_PREBUILT_BOOTIMAGE defined
1219INTERNAL_PREBUILT_BOOTIMAGE := $(BOARD_PREBUILT_BOOTIMAGE)
1220INSTALLED_BOOTIMAGE_TARGET := $(PRODUCT_OUT)/boot.img
1221
1222ifeq ($(BOARD_AVB_ENABLE),true)
1223$(INSTALLED_BOOTIMAGE_TARGET): $(INTERNAL_PREBUILT_BOOTIMAGE) $(AVBTOOL) $(BOARD_AVB_BOOT_KEY_PATH)
1224	cp $(INTERNAL_PREBUILT_BOOTIMAGE) $@
1225	chmod +w $@
1226	$(AVBTOOL) add_hash_footer \
1227	    --image $@ \
1228	    $(call get-partition-size-argument,$(BOARD_BOOTIMAGE_PARTITION_SIZE)) \
1229	    --partition_name boot $(INTERNAL_AVB_BOOT_SIGNING_ARGS) \
1230	    $(BOARD_AVB_BOOT_ADD_HASH_FOOTER_ARGS)
1231
1232$(call declare-container-license-metadata,$(INSTALLED_BOOTIMAGE_TARGET),SPDX-license-identifier-GPL-2.0-only SPDX-license-identifier-Apache-2.0,restricted notice,$(BUILD_SYSTEM)/LINUX_KERNEL_COPYING build/soong/licenses/LICENSE,"Boot Image",bool)
1233$(call declare-container-license-deps,$(INSTALLED_BOOTIMAGE_TARGET),$(INTERNAL_PREBUILT_BOOTIMAGE),$(PRODUCT_OUT)/:/)
1234
1235UNMOUNTED_NOTICE_VENDOR_DEPS += $(INSTALLED_BOOTIMAGE_TARGET)
1236else
1237$(INSTALLED_BOOTIMAGE_TARGET): $(INTERNAL_PREBUILT_BOOTIMAGE)
1238	cp $(INTERNAL_PREBUILT_BOOTIMAGE) $@
1239endif # BOARD_AVB_ENABLE
1240
1241endif # BOARD_PREBUILT_BOOTIMAGE
1242
1243endif # my_installed_prebuilt_gki_apex not defined
1244
1245my_apex_extracted_boot_image :=
1246my_installed_prebuilt_gki_apex :=
1247
1248# -----------------------------------------------------------------
1249#  init boot image
1250ifeq ($(BUILDING_INIT_BOOT_IMAGE),true)
1251
1252INSTALLED_INIT_BOOT_IMAGE_TARGET := $(PRODUCT_OUT)/init_boot.img
1253$(INSTALLED_INIT_BOOT_IMAGE_TARGET): $(MKBOOTIMG) $(INSTALLED_RAMDISK_TARGET)
1254
1255INTERNAL_INIT_BOOT_IMAGE_ARGS := --ramdisk $(INSTALLED_RAMDISK_TARGET)
1256
1257ifdef BOARD_KERNEL_PAGESIZE
1258  INTERNAL_INIT_BOOT_IMAGE_ARGS += --pagesize $(BOARD_KERNEL_PAGESIZE)
1259endif
1260
1261ifeq ($(BOARD_AVB_ENABLE),true)
1262$(INSTALLED_INIT_BOOT_IMAGE_TARGET): $(AVBTOOL) $(BOARD_AVB_INIT_BOOT_KEY_PATH)
1263	$(call pretty,"Target init_boot image: $@")
1264	$(MKBOOTIMG) $(INTERNAL_INIT_BOOT_IMAGE_ARGS) $(INTERNAL_MKBOOTIMG_VERSION_ARGS) $(BOARD_MKBOOTIMG_INIT_ARGS) --output "$@"
1265	$(call assert-max-image-size,$@,$(BOARD_INIT_BOOT_IMAGE_PARTITION_SIZE))
1266	$(AVBTOOL) add_hash_footer \
1267           --image $@ \
1268	   $(call get-partition-size-argument,$(BOARD_INIT_BOOT_IMAGE_PARTITION_SIZE)) \
1269	   --partition_name init_boot $(INTERNAL_AVB_INIT_BOOT_SIGNING_ARGS) \
1270	   $(BOARD_AVB_INIT_BOOT_ADD_HASH_FOOTER_ARGS)
1271
1272$(call declare-1p-container,$(INSTALLED_INIT_BOOT_IMAGE_TARGET),)
1273$(call declare-container-license-deps,$(INSTALLED_INIT_BOOT_IMAGE_TARGET),$(INTERNAL_GENERIC_RAMDISK_BOOT_SIGNATURE),$(PRODUCT_OUT)/:/)
1274else
1275$(INSTALLED_INIT_BOOT_IMAGE_TARGET):
1276	$(call pretty,"Target init_boot image: $@")
1277	$(MKBOOTIMG) $(INTERNAL_INIT_BOOT_IMAGE_ARGS) $(INTERNAL_MKBOOTIMG_VERSION_ARGS) $(BOARD_MKBOOTIMG_INIT_ARGS) --output $@
1278	$(call assert-max-image-size,$@,$(BOARD_INIT_BOOT_IMAGE_PARTITION_SIZE))
1279
1280$(call declare-1p-target,$(INSTALLED_INIT_BOOT_IMAGE_TARGET),)
1281endif
1282
1283UNMOUNTED_NOTICE_VENDOR_DEPS+= $(INSTALLED_INIT_BOOT_IMAGE_TARGET)
1284
1285else # BUILDING_INIT_BOOT_IMAGE is not true
1286
1287ifdef BOARD_PREBUILT_INIT_BOOT_IMAGE
1288INTERNAL_PREBUILT_INIT_BOOT_IMAGE := $(BOARD_PREBUILT_INIT_BOOT_IMAGE)
1289INSTALLED_INIT_BOOT_IMAGE_TARGET := $(PRODUCT_OUT)/init_boot.img
1290
1291ifeq ($(BOARD_AVB_ENABLE),true)
1292$(INSTALLED_INIT_BOOT_IMAGE_TARGET): $(INTERNAL_PREBUILT_INIT_BOOT_IMAGE) $(AVBTOOL) $(BOARD_AVB_INIT_BOOT_KEY_PATH)
1293	cp $(INTERNAL_PREBUILT_INIT_BOOT_IMAGE) $@
1294	chmod +w $@
1295	$(AVBTOOL) add_hash_footer \
1296	    --image $@ \
1297	    $(call get-partition-size-argument,$(BOARD_INIT_BOOT_IMAGE_PARTITION_SIZE)) \
1298	    --partition_name init_boot $(INTERNAL_AVB_INIT_BOOT_SIGNING_ARGS) \
1299	    $(BOARD_AVB_INIT_BOOT_ADD_HASH_FOOTER_ARGS)
1300
1301$(call declare-1p-container,$(INSTALLED_INIT_BOOT_IMAGE_TARGET),)
1302$(call declare-container-license-deps,$(INSTALLED_INIT_BOOT_IMAGE_TARGET),$(INTERNAL_PREBUILT_INIT_BOOT_IMAGE),$(PRODUCT_OUT)/:/)
1303else
1304$(INSTALLED_INIT_BOOT_IMAGE_TARGET): $(INTERNAL_PREBUILT_INIT_BOOT_IMAGE)
1305	cp $(INTERNAL_PREBUILT_INIT_BOOT_IMAGE) $@
1306
1307$(call declare-1p-target,$(INSTALLED_INIT_BOOT_IMAGE_TARGET),)
1308endif # BOARD_AVB_ENABLE
1309
1310UNMOUNTED_NOTICE_VENDOR_DEPS+= $(INSTALLED_INIT_BOOT_IMAGE_TARGET)
1311
1312else # BOARD_PREBUILT_INIT_BOOT_IMAGE not defined
1313INSTALLED_INIT_BOOT_IMAGE_TARGET :=
1314endif # BOARD_PREBUILT_INIT_BOOT_IMAGE
1315
1316endif # BUILDING_INIT_BOOT_IMAGE is not true
1317
1318# -----------------------------------------------------------------
1319# vendor boot image
1320INSTALLED_FILES_OUTSIDE_IMAGES := $(filter-out $(TARGET_VENDOR_RAMDISK_OUT)/%, $(INSTALLED_FILES_OUTSIDE_IMAGES))
1321ifeq ($(BUILDING_VENDOR_BOOT_IMAGE),true)
1322
1323INTERNAL_VENDOR_RAMDISK_FILES := $(filter $(TARGET_VENDOR_RAMDISK_OUT)/%, \
1324    $(ALL_DEFAULT_INSTALLED_MODULES))
1325
1326INTERNAL_VENDOR_RAMDISK_TARGET := $(call intermediates-dir-for,PACKAGING,vendor_boot)/vendor_ramdisk.cpio$(RAMDISK_EXT)
1327
1328# Exclude recovery files in the default vendor ramdisk if including a standalone
1329# recovery ramdisk in vendor_boot.
1330ifeq (true,$(BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT))
1331ifneq (true,$(BOARD_INCLUDE_RECOVERY_RAMDISK_IN_VENDOR_BOOT))
1332$(INTERNAL_VENDOR_RAMDISK_TARGET): $(INTERNAL_RECOVERY_RAMDISK_FILES_TIMESTAMP)
1333$(INTERNAL_VENDOR_RAMDISK_TARGET): PRIVATE_ADDITIONAL_DIR := $(TARGET_RECOVERY_ROOT_OUT)
1334endif
1335endif
1336
1337$(INTERNAL_VENDOR_RAMDISK_TARGET): $(MKBOOTFS) $(INTERNAL_VENDOR_RAMDISK_FILES) | $(COMPRESSION_COMMAND_DEPS)
1338	$(MKBOOTFS) -d $(TARGET_OUT) $(TARGET_VENDOR_RAMDISK_OUT) $(PRIVATE_ADDITIONAL_DIR) | $(COMPRESSION_COMMAND) > $@
1339
1340INSTALLED_VENDOR_RAMDISK_TARGET := $(PRODUCT_OUT)/vendor_ramdisk.img
1341$(INSTALLED_VENDOR_RAMDISK_TARGET): $(INTERNAL_VENDOR_RAMDISK_TARGET)
1342	@echo "Target vendor ramdisk: $@"
1343	$(copy-file-to-target)
1344
1345$(call declare-1p-container,$(INSTALLED_VENDOR_RAMDISK_TARGET),)
1346$(call declare-container-license-deps,$(INSTALLED_VENDOR_RAMDISK_TARGET),$(INTERNAL_VENDOR_RAMDISK_TARGET),$(PRODUCT_OUT)/:/)
1347
1348VENDOR_NOTICE_DEPS += $(INSTALLED_VENDOR_RAMDISK_TARGET)
1349
1350INSTALLED_FILES_FILE_VENDOR_RAMDISK := $(PRODUCT_OUT)/installed-files-vendor-ramdisk.txt
1351INSTALLED_FILES_JSON_VENDOR_RAMDISK := $(INSTALLED_FILES_FILE_VENDOR_RAMDISK:.txt=.json)
1352$(INSTALLED_FILES_FILE_VENDOR_RAMDISK): .KATI_IMPLICIT_OUTPUTS := $(INSTALLED_FILES_JSON_VENDOR_RAMDISK)
1353$(INSTALLED_FILES_FILE_VENDOR_RAMDISK): $(INTERNAL_VENDOR_RAMDISK_TARGET)
1354$(INSTALLED_FILES_FILE_VENDOR_RAMDISK): $(INTERNAL_VENDOR_RAMDISK_FILES) $(FILESLIST) $(FILESLIST_UTIL)
1355	@echo Installed file list: $@
1356	mkdir -p $(dir $@)
1357	rm -f $@
1358	$(FILESLIST) $(TARGET_VENDOR_RAMDISK_OUT) > $(@:.txt=.json)
1359	$(FILESLIST_UTIL) -c $(@:.txt=.json) > $@
1360
1361$(eval $(call declare-0p-target,$(INSTALLED_FILES_FILE_VENDOR_RAMDISK)))
1362$(eval $(call declare-0p-target,$(INSTALLED_FILES_JSON_VENDOR_RAMDISK)))
1363
1364ifdef BOARD_INCLUDE_DTB_IN_BOOTIMG
1365  ifneq ($(BUILDING_VENDOR_KERNEL_BOOT_IMAGE),true)
1366    # If we have vendor_kernel_boot partition, we migrate dtb image to that image
1367    # and allow dtb in vendor_boot to be empty.
1368    INTERNAL_VENDOR_BOOTIMAGE_ARGS += --dtb $(INSTALLED_DTBIMAGE_TARGET)
1369  endif
1370endif
1371ifdef BOARD_KERNEL_BASE
1372  INTERNAL_VENDOR_BOOTIMAGE_ARGS += --base $(BOARD_KERNEL_BASE)
1373endif
1374ifdef BOARD_KERNEL_PAGESIZE
1375  INTERNAL_VENDOR_BOOTIMAGE_ARGS += --pagesize $(BOARD_KERNEL_PAGESIZE)
1376endif
1377ifdef INTERNAL_KERNEL_CMDLINE
1378  INTERNAL_VENDOR_BOOTIMAGE_ARGS += --vendor_cmdline "$(INTERNAL_KERNEL_CMDLINE)"
1379endif
1380
1381ifdef INTERNAL_BOOTCONFIG
1382  INTERNAL_VENDOR_BOOTCONFIG_TARGET := $(PRODUCT_OUT)/vendor-bootconfig.img
1383  $(INTERNAL_VENDOR_BOOTCONFIG_TARGET):
1384	rm -f $@
1385	$(foreach param,$(INTERNAL_BOOTCONFIG), \
1386	 printf "%s\n" $(param) >> $@;)
1387  INTERNAL_VENDOR_BOOTIMAGE_ARGS += --vendor_bootconfig $(INTERNAL_VENDOR_BOOTCONFIG_TARGET)
1388endif
1389
1390# $(1): Build target name
1391# $(2): Staging dir to be compressed
1392# $(3): Build dependencies
1393define build-vendor-ramdisk-fragment-target
1394$(1): $(3) $(MKBOOTFS) | $(COMPRESSION_COMMAND_DEPS)
1395	$(MKBOOTFS) -d $(TARGET_OUT) $(2) | $(COMPRESSION_COMMAND) > $$@
1396endef
1397
1398# $(1): Ramdisk name
1399define build-vendor-ramdisk-fragment
1400$(strip \
1401  $(eval build_target := $(call intermediates-dir-for,PACKAGING,vendor_ramdisk_fragments)/$(1).cpio$(RAMDISK_EXT)) \
1402  $(eval $(call build-vendor-ramdisk-fragment-target,$(build_target),$(VENDOR_RAMDISK_FRAGMENT.$(1).STAGING_DIR),$(VENDOR_RAMDISK_FRAGMENT.$(1).FILES))) \
1403  $(build_target) \
1404)
1405endef
1406
1407# $(1): Ramdisk name
1408# $(2): Prebuilt file path
1409define build-prebuilt-vendor-ramdisk-fragment
1410$(strip \
1411  $(eval build_target := $(call intermediates-dir-for,PACKAGING,prebuilt_vendor_ramdisk_fragments)/$(1)) \
1412  $(eval $(call copy-one-file,$(2),$(build_target))) \
1413  $(build_target) \
1414)
1415endef
1416
1417INTERNAL_VENDOR_RAMDISK_FRAGMENT_TARGETS :=
1418INTERNAL_VENDOR_RAMDISK_FRAGMENT_ARGS :=
1419
1420$(foreach vendor_ramdisk_fragment,$(INTERNAL_VENDOR_RAMDISK_FRAGMENTS), \
1421  $(eval prebuilt_vendor_ramdisk_fragment_file := $(BOARD_VENDOR_RAMDISK_FRAGMENT.$(vendor_ramdisk_fragment).PREBUILT)) \
1422  $(if $(prebuilt_vendor_ramdisk_fragment_file), \
1423    $(eval vendor_ramdisk_fragment_target := $(call build-prebuilt-vendor-ramdisk-fragment,$(vendor_ramdisk_fragment),$(prebuilt_vendor_ramdisk_fragment_file))) \
1424    $(eval ### else ###), \
1425    $(eval vendor_ramdisk_fragment_target := $(call build-vendor-ramdisk-fragment,$(vendor_ramdisk_fragment)))) \
1426  $(eval INTERNAL_VENDOR_RAMDISK_FRAGMENT_TARGETS += $(vendor_ramdisk_fragment_target)) \
1427  $(eval INTERNAL_VENDOR_RAMDISK_FRAGMENT_ARGS += $(BOARD_VENDOR_RAMDISK_FRAGMENT.$(vendor_ramdisk_fragment).MKBOOTIMG_ARGS) --vendor_ramdisk_fragment $(vendor_ramdisk_fragment_target)) \
1428)
1429
1430INSTALLED_VENDOR_BOOTIMAGE_TARGET := $(PRODUCT_OUT)/vendor_boot.img
1431$(INSTALLED_VENDOR_BOOTIMAGE_TARGET): $(MKBOOTIMG) $(INTERNAL_VENDOR_RAMDISK_TARGET) $(INSTALLED_DTBIMAGE_TARGET)
1432$(INSTALLED_VENDOR_BOOTIMAGE_TARGET): $(INTERNAL_VENDOR_RAMDISK_FRAGMENT_TARGETS) $(INTERNAL_VENDOR_BOOTCONFIG_TARGET)
1433ifeq ($(BOARD_AVB_ENABLE),true)
1434$(INSTALLED_VENDOR_BOOTIMAGE_TARGET): $(AVBTOOL) $(BOARD_AVB_VENDOR_BOOTIMAGE_KEY_PATH)
1435	$(call pretty,"Target vendor_boot image: $@")
1436	$(MKBOOTIMG) $(INTERNAL_VENDOR_BOOTIMAGE_ARGS) $(BOARD_MKBOOTIMG_ARGS) --vendor_ramdisk $(INTERNAL_VENDOR_RAMDISK_TARGET) $(INTERNAL_VENDOR_RAMDISK_FRAGMENT_ARGS) --vendor_boot $@
1437	$(call assert-max-image-size,$@,$(BOARD_VENDOR_BOOTIMAGE_PARTITION_SIZE))
1438	$(AVBTOOL) add_hash_footer \
1439           --image $@ \
1440	   $(call get-partition-size-argument,$(BOARD_VENDOR_BOOTIMAGE_PARTITION_SIZE)) \
1441	   --partition_name vendor_boot $(INTERNAL_AVB_VENDOR_BOOT_SIGNING_ARGS) \
1442	   $(BOARD_AVB_VENDOR_BOOT_ADD_HASH_FOOTER_ARGS)
1443else
1444$(INSTALLED_VENDOR_BOOTIMAGE_TARGET):
1445	$(call pretty,"Target vendor_boot image: $@")
1446	$(MKBOOTIMG) $(INTERNAL_VENDOR_BOOTIMAGE_ARGS) $(BOARD_MKBOOTIMG_ARGS) --vendor_ramdisk $(INTERNAL_VENDOR_RAMDISK_TARGET) $(INTERNAL_VENDOR_RAMDISK_FRAGMENT_ARGS) --vendor_boot $@
1447	$(call assert-max-image-size,$@,$(BOARD_VENDOR_BOOTIMAGE_PARTITION_SIZE))
1448endif
1449
1450$(call declare-1p-container,$(INSTALLED_VENDOR_BOOTIMAGE_TARGET),)
1451$(call declare-container-license-deps,$(INSTALLED_VENDOR_BOOTIMAGE_TARGET),$(INTERNAL_VENDOR_RAMDISK_TARGET) $(INSTALLED_DTB_IMAGE_TARGET) $(INTERNAL_VENDOR_RAMDISK_FRAGMENT_TARGETS) $(INTERNAL_VENDOR_BOOTCONDIG_TARGET),$(PRODUCT_OUT)/:/)
1452VENDOR_NOTICE_DEPS += $(INSTALLED_VENDOR_BOOTIMAGE_TARGET)
1453endif # BUILDING_VENDOR_BOOT_IMAGE
1454
1455# -----------------------------------------------------------------
1456# vendor kernel boot image
1457ifeq ($(BUILDING_VENDOR_KERNEL_BOOT_IMAGE),true)
1458
1459INTERNAL_VENDOR_KERNEL_RAMDISK_FILES := $(filter $(TARGET_VENDOR_KERNEL_RAMDISK_OUT)/%, \
1460    $(ALL_DEFAULT_INSTALLED_MODULES))
1461
1462INTERNAL_VENDOR_KERNEL_RAMDISK_TARGET := $(call intermediates-dir-for,PACKAGING,vendor_kernel_boot)/vendor_kernel_ramdisk.cpio$(RAMDISK_EXT)
1463
1464$(INTERNAL_VENDOR_KERNEL_RAMDISK_TARGET): $(MKBOOTFS) $(INTERNAL_VENDOR_KERNEL_RAMDISK_FILES) | $(COMPRESSION_COMMAND_DEPS)
1465	$(MKBOOTFS) -d $(TARGET_OUT) $(TARGET_VENDOR_KERNEL_RAMDISK_OUT) | $(COMPRESSION_COMMAND) > $@
1466
1467INSTALLED_VENDOR_KERNEL_RAMDISK_TARGET := $(PRODUCT_OUT)/vendor_kernel_ramdisk.img
1468$(INSTALLED_VENDOR_KERNEL_RAMDISK_TARGET): $(INTERNAL_VENDOR_KERNEL_RAMDISK_TARGET)
1469	@echo "Target vendor kernel ramdisk: $@"
1470	$(copy-file-to-target)
1471
1472INSTALLED_FILES_FILE_VENDOR_KERNEL_RAMDISK := $(PRODUCT_OUT)/installed-files-vendor-kernel-ramdisk.txt
1473INSTALLED_FILES_JSON_VENDOR_KERNEL_RAMDISK := $(INSTALLED_FILES_FILE_VENDOR_KERNEL_RAMDISK:.txt=.json)
1474$(INSTALLED_FILES_FILE_VENDOR_KERNEL_RAMDISK): .KATI_IMPLICIT_OUTPUTS := $(INSTALLED_FILES_JSON_VENDOR_KERNEL_RAMDISK)
1475$(INSTALLED_FILES_FILE_VENDOR_KERNEL_RAMDISK): $(INTERNAL_VENDOR_KERNEL_RAMDISK_TARGET)
1476$(INSTALLED_FILES_FILE_VENDOR_KERNEL_RAMDISK): $(INTERNAL_VENDOR_KERNEL_RAMDISK_FILES) $(FILESLIST) $(FILESLIST_UTIL)
1477	@echo Installed file list: $@
1478	mkdir -p $(dir $@)
1479	rm -f $@
1480	$(FILESLIST) $(TARGET_VENDOR_KERNEL_RAMDISK_OUT) > $(@:.txt=.json)
1481	$(FILESLIST_UTIL) -c $(@:.txt=.json) > $@
1482
1483$(call declare-0p-target,$(INSTALLED_FILES_FILE_VENDOR_KERNEL_RAMDISK))
1484$(call declare-0p-target,$(INSTALLED_FILES_JSON_VENDOR_KERNEL_RAMDISK))
1485
1486INTERNAL_VENDOR_KERNEL_BOOTIMAGE_ARGS := --vendor_ramdisk $(INTERNAL_VENDOR_KERNEL_RAMDISK_TARGET)
1487INSTALLED_VENDOR_KERNEL_BOOTIMAGE_TARGET := $(PRODUCT_OUT)/vendor_kernel_boot.img
1488$(INSTALLED_VENDOR_KERNEL_BOOTIMAGE_TARGET): $(MKBOOTIMG) $(INTERNAL_VENDOR_KERNEL_RAMDISK_TARGET)
1489
1490ifdef BOARD_INCLUDE_DTB_IN_BOOTIMG
1491  INTERNAL_VENDOR_KERNEL_BOOTIMAGE_ARGS += --dtb $(INSTALLED_DTBIMAGE_TARGET)
1492  $(INSTALLED_VENDOR_KERNEL_BOOTIMAGE_TARGET): $(INSTALLED_DTBIMAGE_TARGET)
1493endif
1494ifdef BOARD_KERNEL_PAGESIZE
1495  INTERNAL_VENDOR_KERNEL_BOOTIMAGE_ARGS += --pagesize $(BOARD_KERNEL_PAGESIZE)
1496endif
1497
1498
1499ifeq ($(BOARD_AVB_ENABLE),true)
1500$(INSTALLED_VENDOR_KERNEL_BOOTIMAGE_TARGET): $(AVBTOOL) $(BOARD_AVB_VENDOR_KERNEL_BOOTIMAGE_KEY_PATH)
1501	$(call pretty,"Target vendor_kernel_boot image: $@")
1502	$(MKBOOTIMG) $(INTERNAL_VENDOR_KERNEL_BOOTIMAGE_ARGS) $(BOARD_MKBOOTIMG_ARGS) --vendor_boot $@
1503	$(call assert-max-image-size,$@,$(BOARD_VENDOR_KERNEL_BOOTIMAGE_PARTITION_SIZE))
1504	$(AVBTOOL) add_hash_footer \
1505	    --image $@ \
1506	   $(call get-partition-size-argument,$(BOARD_VENDOR_KERNEL_BOOTIMAGE_PARTITION_SIZE)) \
1507	   --partition_name vendor_kernel_boot $(INTERNAL_AVB_VENDOR_KERNEL_BOOT_SIGNING_ARGS) \
1508	   $(BOARD_AVB_VENDOR_KERNEL_BOOT_ADD_HASH_FOOTER_ARGS)
1509else
1510$(INSTALLED_VENDOR_KERNEL_BOOTIMAGE_TARGET):
1511	$(call pretty,"Target vendor_kernel_boot image: $@")
1512	$(MKBOOTIMG) $(INTERNAL_VENDOR_KERNEL_BOOTIMAGE_ARGS) $(BOARD_MKBOOTIMG_ARGS) --vendor_boot $@
1513	$(call assert-max-image-size,$@,$(BOARD_VENDOR_KERNEL_BOOTIMAGE_PARTITION_SIZE))
1514endif
1515$(call declare-1p-container,$(INSTALLED_VENDOR_KERNEL_BOOTIMAGE_TARGET),)
1516ifdef BOARD_INCLUDE_DTB_IN_BOOTIMG
1517$(call declare-container-license-deps,$(INSTALLED_VENDOR_KERNEL_BOOTIMAGE_TARGET),\
1518    $(INTERNAL_VENDOR_KERNEL_RAMDISK_TARGET) $(INSTALLED_DTBIMAGE_TARGET),\
1519    $(INSTALLED_VENDOR_KERNEL_BOOTIMAGE_TARGET):)
1520else
1521$(call declare-container-license-deps,$(INSTALLED_VENDOR_KERNEL_BOOTIMAGE_TARGET),$(INTERNAL_VENDOR_KERNEL_RAMDISK_TARGET),$(INSTALLED_VENDOR_KERNEL_BOOTIMAGE_TARGET):)
1522endif
1523endif # BUILDING_VENDOR_KERNEL_BOOT_IMAGE
1524
1525# -----------------------------------------------------------------
1526# NOTICE files
1527#
1528# We are required to publish the licenses for all code under BSD, GPL and
1529# Apache licenses (and possibly other more exotic ones as well). We err on the
1530# side of caution, so the licenses for other third-party code are included here
1531# too.
1532#
1533# This needs to be before the systemimage rules, because it adds to
1534# ALL_DEFAULT_INSTALLED_MODULES, which those use to pick which files
1535# go into the systemimage.
1536
1537.PHONY: notice_files
1538
1539# Convert license metadata into xml notice file.
1540# $(1) - Output target notice filename
1541# $(2) - Product name
1542# $(3) - File title
1543# $(4) - License metadata file roots
1544# $(5) - Prefixes to strip
1545#
1546define xml-notice-rule
1547$(1): PRIVATE_PRODUCT := $(2)
1548$(1): PRIVATE_MESSAGE := $(3)
1549$(1): PRIVATE_DEPS := $(call corresponding-license-metadata,$(4))
1550$(1): $(call corresponding-license-metadata,$(4)) $(XMLNOTICE) $(BUILD_SYSTEM)/Makefile
1551	OUT_DIR=$(OUT_DIR) $(XMLNOTICE) -o $$@ -product=$$(PRIVATE_PRODUCT) -title=$$(PRIVATE_MESSAGE) $(foreach prefix, $(5), -strip_prefix=$(prefix)) $$(PRIVATE_DEPS)
1552
1553notice_files: $(1)
1554endef
1555
1556# Convert license metadata into text notice file.
1557# $(1) - Output target notice filename
1558# $(2) - Product name
1559# $(3) - File title
1560# $(4) - License metadata file roots
1561# $(5) - Prefixes to strip
1562#
1563define text-notice-rule
1564$(1): PRIVATE_PRODUCT := $(2)
1565$(1): PRIVATE_MESSAGE := $(3)
1566$(1): $(call corresponding-license-metadata,$(4)) $(TEXTNOTICE) $(BUILD_SYSTEM)/Makefile
1567	OUT_DIR=$(OUT_DIR) $(TEXTNOTICE) -o $$@ -product=$$(PRIVATE_PRODUCT) -title=$$(PRIVATE_MESSAGE) $(foreach prefix, $(5), -strip_prefix=$(prefix)) $(call corresponding-license-metadata,$(4))
1568
1569notice_files: $(1)
1570endef
1571
1572# Conversion license metadata into html notice file.
1573# $(1) - Output target notice filename
1574# $(2) - Product name
1575# $(3) - File title
1576# $(4) - License metadata file roots
1577# $(5) - Prefixes to strip
1578#
1579define html-notice-rule
1580$(1): PRIVATE_PRODUCT := $(2)
1581$(1): PRIVATE_MESSAGE := $(3)
1582$(1): $(call corresponding-license-metadata,$(4)) $(HTMLNOTICE) $(BUILD_SYSTEM)/Makefile
1583	OUT_DIR=$(OUT_DIR) $(HTMLNOTICE) -o $$@ -product=$$(PRIVATE_PRODUCT) -title=$$(PRIVATE_MESSAGE) $(foreach prefix, $(5), -strip_prefix=$(prefix)) $(call corresponding-license-metadata,$(4))
1584
1585notice_files: $(1)
1586endef
1587
1588$(KATI_obsolete_var combine-notice-files, To create notice files use xml-notice-rule, html-notice-rule, or text-notice-rule.)
1589
1590# Notice file logic isn't relevant for TARGET_BUILD_APPS
1591ifndef TARGET_BUILD_APPS
1592
1593# TODO These intermediate NOTICE.txt/NOTICE.html files should go into
1594# TARGET_OUT_NOTICE_FILES now that the notice files are gathered from
1595# the src subdirectory.
1596kernel_notice_file := $(TARGET_OUT_NOTICE_FILES)/src/kernel.txt
1597
1598# Some targets get included under $(PRODUCT_OUT) for debug symbols or other
1599# reasons--not to be flashed onto any device. Targets under these directories
1600# need no associated notice file on the device UI.
1601exclude_target_dirs := apex
1602
1603# TODO(b/69865032): Make PRODUCT_NOTICE_SPLIT the default behavior.
1604ifneq ($(PRODUCT_NOTICE_SPLIT),true)
1605#target_notice_file_html := $(TARGET_OUT_INTERMEDIATES)/NOTICE.html
1606target_notice_file_html_gz := $(TARGET_OUT_INTERMEDIATES)/NOTICE.html.gz
1607installed_notice_html_or_xml_gz := $(TARGET_OUT)/etc/NOTICE.html.gz
1608
1609$(call declare-0p-target,$(target_notice_file_html_gz))
1610$(call declare-0p-target,$(installed_notice_html_or_xml_gz))
1611else
1612# target_notice_file_xml := $(TARGET_OUT_INTERMEDIATES)/NOTICE.xml
1613target_notice_file_xml_gz := $(TARGET_OUT_INTERMEDIATES)/NOTICE.xml.gz
1614installed_notice_html_or_xml_gz := $(TARGET_OUT)/etc/NOTICE.xml.gz
1615
1616target_vendor_notice_file_txt := $(TARGET_OUT_INTERMEDIATES)/NOTICE_VENDOR.txt
1617target_vendor_notice_file_xml_gz := $(TARGET_OUT_INTERMEDIATES)/NOTICE_VENDOR.xml.gz
1618installed_vendor_notice_xml_gz := $(TARGET_OUT_VENDOR)/etc/NOTICE.xml.gz
1619
1620target_product_notice_file_txt := $(TARGET_OUT_INTERMEDIATES)/NOTICE_PRODUCT.txt
1621target_product_notice_file_xml_gz := $(TARGET_OUT_INTERMEDIATES)/NOTICE_PRODUCT.xml.gz
1622installed_product_notice_xml_gz := $(TARGET_OUT_PRODUCT)/etc/NOTICE.xml.gz
1623
1624target_system_ext_notice_file_txt := $(TARGET_OUT_INTERMEDIATES)/NOTICE_SYSTEM_EXT.txt
1625target_system_ext_notice_file_xml_gz := $(TARGET_OUT_INTERMEDIATES)/NOTICE_SYSTEM_EXT.xml.gz
1626installed_system_ext_notice_xml_gz := $(TARGET_OUT_SYSTEM_EXT)/etc/NOTICE.xml.gz
1627
1628target_odm_notice_file_txt := $(TARGET_OUT_INTERMEDIATES)/NOTICE_ODM.txt
1629target_odm_notice_file_xml_gz := $(TARGET_OUT_INTERMEDIATES)/NOTICE_ODM.xml.gz
1630installed_odm_notice_xml_gz := $(TARGET_OUT_ODM)/etc/NOTICE.xml.gz
1631
1632target_vendor_dlkm_notice_file_txt := $(TARGET_OUT_INTERMEDIATES)/NOTICE_VENDOR_DLKM.txt
1633target_vendor_dlkm_notice_file_xml_gz := $(TARGET_OUT_INTERMEDIATES)/NOTICE_VENDOR_DLKM.xml.gz
1634installed_vendor_dlkm_notice_xml_gz := $(TARGET_OUT_VENDOR_DLKM)/etc/NOTICE.xml.gz
1635
1636target_odm_dlkm_notice_file_txt := $(TARGET_OUT_INTERMEDIATES)/NOTICE_ODM_DLKM.txt
1637target_odm_dlkm_notice_file_xml_gz := $(TARGET_OUT_INTERMEDIATES)/NOTICE_ODM_DLKM.xml.gz
1638installed_odm_dlkm_notice_xml_gz := $(TARGET_OUT_ODM_DLKM)/etc/NOTICE.xml.gz
1639
1640target_system_dlkm_notice_file_txt := $(TARGET_OUT_INTERMEDIATES)/NOTICE_SYSTEM_DLKM.txt
1641target_system_dlkm_notice_file_xml_gz := $(TARGET_OUT_INTERMEDIATES)/NOTICE_SYSTEM_DLKM.xml.gz
1642installed_system_dlkm_notice_xml_gz := $(TARGET_OUT_SYSTEM_DLKM)/etc/NOTICE.xml.gz
1643
1644ALL_INSTALLED_NOTICE_FILES := \
1645  $(installed_notice_html_or_xml_gz) \
1646  $(installed_vendor_notice_xml_gz) \
1647  $(installed_product_notice_xml_gz) \
1648  $(installed_system_ext_notice_xml_gz) \
1649  $(installed_odm_notice_xml_gz) \
1650  $(installed_vendor_dlkm_notice_xml_gz) \
1651  $(installed_odm_dlkm_notice_xml_gz) \
1652  $(installed_system_dlkm_notice_xml_gz) \
1653
1654# $1 installed file path, e.g. out/target/product/vsoc_x86_64/system_ext/etc/NOTICE.xml.gz
1655define is-notice-file
1656$(if $(findstring $1,$(ALL_INSTALLED_NOTICE_FILES)),Y)
1657endef
1658
1659# Notice files are copied to TARGET_OUT_NOTICE_FILES as a side-effect of their module
1660# being built. A notice xml file must depend on all modules that could potentially
1661# install a license file relevant to it.
1662license_modules := $(ALL_DEFAULT_INSTALLED_MODULES) $(kernel_notice_file)
1663# Only files copied to a system image need system image notices.
1664license_modules := $(filter $(PRODUCT_OUT)/%,$(license_modules))
1665# Phonys/fakes don't have notice files (though their deps might)
1666license_modules := $(filter-out $(TARGET_OUT_FAKE)/%,$(license_modules))
1667# testcases are not relevant to the system image.
1668license_modules := $(filter-out $(TARGET_OUT_TESTCASES)/%,$(license_modules))
1669# filesystem images: system, vendor, product, system_ext, odm, vendor_dlkm, and odm_dlkm
1670license_modules_system := $(filter $(TARGET_OUT)/%,$(license_modules))
1671# system_other is relevant to system partition.
1672license_modules_system += $(filter $(TARGET_OUT_SYSTEM_OTHER)/%,$(license_modules))
1673license_modules_vendor := $(filter $(TARGET_OUT_VENDOR)/%,$(license_modules))
1674license_modules_product := $(filter $(TARGET_OUT_PRODUCT)/%,$(license_modules))
1675license_modules_system_ext := $(filter $(TARGET_OUT_SYSTEM_EXT)/%,$(license_modules))
1676license_modules_odm := $(filter $(TARGET_OUT_ODM)/%,$(license_modules))
1677license_modules_vendor_dlkm := $(filter $(TARGET_OUT_VENDOR_DLKM)/%,$(license_modules))
1678license_modules_odm_dlkm := $(filter $(TARGET_OUT_ODM_DLKM)/%,$(license_modules))
1679license_modules_odm_dlkm := $(filter $(TARGET_OUT_SYSTEM_DLKM)/%,$(license_modules))
1680license_modules_agg := $(license_modules_system) \
1681                       $(license_modules_vendor) \
1682                       $(license_modules_product) \
1683                       $(license_modules_system_ext) \
1684                       $(license_modules_odm) \
1685                       $(license_modules_vendor_dlkm) \
1686                       $(license_modules_odm_dlkm) \
1687                       $(license_modules_system_dlkm)
1688# targets used for debug symbols only and do not get copied to the device
1689license_modules_symbols_only := $(filter $(PRODUCT_OUT)/apex/%,$(license_modules))
1690
1691license_modules_rest := $(filter-out $(license_modules_agg),$(license_modules))
1692license_modules_rest := $(filter-out $(license_modules_symbols_only),$(license_modules_rest))
1693
1694# Identify the other targets we expect to have notices for:
1695# targets copied to the device but are not readable by the UI (e.g. must boot
1696# into a different partition to read or don't have an associated /etc
1697# directory) must have their notices built somewhere readable.
1698license_modules_rehomed := $(filter-out $(PRODUCT_OUT)/%/%,$(license_modules_rest))  # files in root have no /etc
1699license_modules_rehomed += $(filter $(PRODUCT_OUT)/recovery/%,$(license_modules_rest))
1700license_modules_rehomed += $(filter $(PRODUCT_OUT)/root/%,$(license_modules_rest))
1701license_modules_rehomed += $(filter $(PRODUCT_OUT)/data/%,$(license_modules_rest))
1702license_modules_rehomed += $(filter $(PRODUCT_OUT)/ramdisk/%,$(license_modules_rest))
1703license_modules_rehomed += $(filter $(PRODUCT_OUT)/debug_ramdisk/%,$(license_modules_rest))
1704license_modules_rehomed += $(filter $(PRODUCT_OUT)/vendor_ramdisk/%,$(license_modules_rest))
1705license_modules_rehomed += $(filter $(PRODUCT_OUT)/persist/%,$(license_modules_rest))
1706license_modules_rehomed += $(filter $(PRODUCT_OUT)/persist.img,$(license_modules_rest))
1707license_modules_rehomed += $(filter $(PRODUCT_OUT)/system_other/%,$(license_modules_rest))
1708license_modules_rehomed += $(filter $(PRODUCT_OUT)/kernel%,$(license_modules_rest))
1709license_modules_rehomed += $(filter $(PRODUCT_OUT)/%.img,$(license_modules_rest))
1710license_modules_rehomed += $(filter $(PRODUCT_OUT)/%.bin,$(license_modules_rest))
1711
1712# after removing targets in system images, targets reported in system images, and
1713# targets used for debug symbols that do not need notices, nothing must remain.
1714license_modules_rest := $(filter-out $(license_modules_rehomed),$(license_modules_rest))
1715$(call maybe-print-list-and-error, $(license_modules_rest), \
1716        "Targets added under $(PRODUCT_OUT)/ unaccounted for notice handling.")
1717
1718# If we are building in a configuration that includes a prebuilt vendor.img, we can't
1719# update its notice file, so include those notices in the system partition instead
1720ifdef BOARD_PREBUILT_VENDORIMAGE
1721license_modules_system += $(license_modules_rehomed)
1722system_xml_directories := xml_excluded_vendor_product_odm_vendor_dlkm_odm_dlkm
1723system_notice_file_message := "Notices for files contained in all filesystem images except vendor/system_ext/product/odm/vendor_dlkm/odm_dlkm in this directory:"
1724else
1725license_modules_vendor += $(license_modules_rehomed)
1726system_xml_directories := xml_system
1727system_notice_file_message := "Notices for files contained in the system filesystem image in this directory:"
1728endif
1729
1730endif # PRODUCT_NOTICE_SPLIT
1731
1732ALL_DEFAULT_INSTALLED_MODULES += $(installed_notice_html_or_xml_gz)
1733
1734need_vendor_notice:=false
1735ifeq ($(BUILDING_VENDOR_BOOT_IMAGE),true)
1736   need_vendor_notice:=true
1737endif
1738
1739ifdef BUILDING_DEBUG_VENDOR_BOOT_IMAGE
1740   need_vendor_notice:=true
1741endif
1742
1743ifdef BUILDING_VENDOR_IMAGE
1744   need_vendor_notice:=true
1745endif
1746
1747ifeq (true,$(need_vendor_notice))
1748ifneq (,$(installed_vendor_notice_xml_gz))
1749ALL_DEFAULT_INSTALLED_MODULES += $(installed_vendor_notice_xml_gz)
1750endif
1751endif
1752
1753need_vendor_notice:=
1754
1755ifdef BUILDING_ODM_IMAGE
1756ifneq (,$(installed_odm_notice_xml_gz))
1757ALL_DEFAULT_INSTALLED_MODULES += $(installed_odm_notice_xml_gz)
1758endif
1759endif
1760
1761ifdef BUILDING_PRODUCT_IMAGE
1762ifneq (,$(installed_product_notice_xml_gz))
1763ALL_DEFAULT_INSTALLED_MODULES += $(installed_product_notice_xml_gz)
1764endif
1765endif
1766
1767ifdef BUILDING_SYSTEM_EXT_IMAGE
1768ifneq (,$(installed_system_ext_notice_xml_gz))
1769ALL_DEFAULT_INSTALLED_MODULES += $(installed_system_ext_notice_xml_gz)
1770endif
1771endif
1772
1773ifdef BUILDING_VENDOR_DLKM_IMAGE
1774ifneq (,$(installed_vendor_dlkm_notice_xml_gz)
1775ALL_DEFAULT_INSTALLED_MODULES += $(installed_vendor_dlkm_notice_xml_gz)
1776endif
1777endif
1778
1779ifdef BUILDING_ODM_DLKM_IMAGE
1780ifneq (,$(installed_odm_dlkm_notice_xml_gz))
1781ALL_DEFAULT_INSTALLED_MODULES += $(installed_odm_dlkm_notice_xml_gz)
1782endif
1783endif
1784
1785ifdef BUILDING_SYSTEM_DLKM_IMAGE
1786ifneq (,$(installed_system_dlkm_notice_xml_gz))
1787ALL_DEFAULT_INSTALLED_MODULES += $(installed_system_dlkm_notice_xml_gz)
1788endif
1789endif
1790
1791endif  # TARGET_BUILD_APPS
1792
1793# Presently none of the prebuilts etc. comply with policy to have a license text. Fake one here.
1794$(eval $(call copy-one-file,$(BUILD_SYSTEM)/LINUX_KERNEL_COPYING,$(kernel_notice_file)))
1795
1796ifneq (,$(strip $(INSTALLED_KERNEL_TARGET)))
1797$(call declare-license-metadata,$(INSTALLED_KERNEL_TARGET),SPDX-license-identifier-GPL-2.0-only,restricted,$(BUILD_SYSTEM)/LINUX_KERNEL_COPYING,"Kernel",kernel)
1798endif
1799
1800# No matter where it gets copied from, a copied linux kernel is licensed under "GPL 2.0 only"
1801$(eval $(call declare-copy-files-license-metadata,,:kernel,SPDX-license-identifier-GPL-2.0-only,restricted,$(BUILD_SYSTEM)/LINUX_KERNEL_COPYING,kernel))
1802
1803
1804# #################################################################
1805# Targets for user images
1806# #################################################################
1807
1808# These options tell the recovery updater/installer how to mount the partitions writebale.
1809# <fstype>=<fstype_opts>[|<fstype_opts>]...
1810# fstype_opts := <opt>[,<opt>]...
1811#         opt := <name>[=<value>]
1812# The following worked on Nexus devices with Kernel 3.1, 3.4, 3.10
1813DEFAULT_TARGET_RECOVERY_FSTYPE_MOUNT_OPTIONS := ext4=max_batch_time=0,commit=1,data=ordered,barrier=1,errors=panic,nodelalloc
1814
1815INTERNAL_USERIMAGES_DEPS := \
1816    $(BUILD_IMAGE) \
1817    $(MKE2FS_CONF) \
1818    $(MKEXTUSERIMG)
1819
1820$(call declare-1p-target,$(MKE2FS_CONF),system/extras)
1821
1822ifeq ($(TARGET_USERIMAGES_USE_F2FS),true)
1823INTERNAL_USERIMAGES_DEPS += $(MKF2FSUSERIMG)
1824endif
1825
1826ifneq ($(filter \
1827    $(BOARD_PRODUCTIMAGE_FILE_SYSTEM_TYPE) \
1828    $(BOARD_SYSTEM_EXTIMAGE_FILE_SYSTEM_TYPE) \
1829    $(BOARD_ODMIMAGE_FILE_SYSTEM_TYPE) \
1830    $(BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE) \
1831    $(BOARD_SYSTEMIMAGE_FILE_SYSTEM_TYPE) \
1832    $(BOARD_VENDOR_DLKMIMAGE_FILE_SYSTEM_TYPE) \
1833    $(BOARD_ODM_DLKMIMAGE_FILE_SYSTEM_TYPE) \
1834    $(BOARD_SYSTEM_DLKMIMAGE_FILE_SYSTEM_TYPE) \
1835  ,erofs),)
1836INTERNAL_USERIMAGES_DEPS += $(MKEROFS)
1837ifeq ($(BOARD_EROFS_USE_LEGACY_COMPRESSION),true)
1838BOARD_EROFS_COMPRESSOR ?= "lz4"
1839else
1840BOARD_EROFS_COMPRESSOR ?= "lz4hc,9"
1841endif
1842endif
1843
1844ifneq ($(filter \
1845    $(BOARD_PRODUCTIMAGE_FILE_SYSTEM_TYPE) \
1846    $(BOARD_SYSTEM_EXTIMAGE_FILE_SYSTEM_TYPE) \
1847    $(BOARD_ODMIMAGE_FILE_SYSTEM_TYPE) \
1848    $(BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE) \
1849    $(BOARD_SYSTEMIMAGE_FILE_SYSTEM_TYPE) \
1850    $(BOARD_VENDOR_DLKMIMAGE_FILE_SYSTEM_TYPE) \
1851    $(BOARD_ODM_DLKMIMAGE_FILE_SYSTEM_TYPE) \
1852    $(BOARD_SYSTEM_DLKMIMAGE_FILE_SYSTEM_TYPE) \
1853  ,squashfs),)
1854INTERNAL_USERIMAGES_DEPS += $(MKSQUASHFSUSERIMG)
1855endif
1856
1857ifeq ($(BOARD_AVB_ENABLE),true)
1858INTERNAL_USERIMAGES_DEPS += $(AVBTOOL)
1859endif
1860
1861# Get a colon-separated list of search paths.
1862INTERNAL_USERIMAGES_BINARY_PATHS := $(subst $(space),:,$(sort $(dir $(INTERNAL_USERIMAGES_DEPS))))
1863
1864# Collects file_contexts files from modules to be installed
1865$(call merge-fc-files, \
1866  $(sort $(foreach m,$(product_MODULES),$(ALL_MODULES.$(m).FILE_CONTEXTS))),\
1867  $(call intermediates-dir-for,ETC,file_contexts.bin)/file_contexts.modules.tmp)
1868
1869SELINUX_FC := $(call intermediates-dir-for,ETC,file_contexts.bin)/file_contexts.bin
1870
1871INTERNAL_USERIMAGES_DEPS += $(SELINUX_FC)
1872
1873# $(1) the partition name (eg system)
1874# $(2) the image prop file
1875define add-common-flags-to-image-props
1876$(eval _var := $(call to-upper,$(1)))
1877$(hide) echo "$(1)_selinux_fc=$(SELINUX_FC)" >> $(2)
1878$(hide) echo "building_$(1)_image=$(BUILDING_$(_var)_IMAGE)" >> $(2)
1879endef
1880
1881# $(1) the partition name (eg system)
1882# $(2) the image prop file
1883define add-common-ro-flags-to-image-props
1884$(eval _var := $(call to-upper,$(1)))
1885$(if $(BOARD_$(_var)IMAGE_EROFS_COMPRESSOR),$(hide) echo "$(1)_erofs_compressor=$(BOARD_$(_var)IMAGE_EROFS_COMPRESSOR)" >> $(2))
1886$(if $(BOARD_$(_var)IMAGE_EROFS_COMPRESS_HINTS),$(hide) echo "$(1)_erofs_compress_hints=$(BOARD_$(_var)IMAGE_EROFS_COMPRESS_HINTS)" >> $(2))
1887$(if $(BOARD_$(_var)IMAGE_EROFS_PCLUSTER_SIZE),$(hide) echo "$(1)_erofs_pcluster_size=$(BOARD_$(_var)IMAGE_EROFS_PCLUSTER_SIZE)" >> $(2))
1888$(if $(BOARD_$(_var)IMAGE_EXTFS_INODE_COUNT),$(hide) echo "$(1)_extfs_inode_count=$(BOARD_$(_var)IMAGE_EXTFS_INODE_COUNT)" >> $(2))
1889$(if $(BOARD_$(_var)IMAGE_EXTFS_RSV_PCT),$(hide) echo "$(1)_extfs_rsv_pct=$(BOARD_$(_var)IMAGE_EXTFS_RSV_PCT)" >> $(2))
1890$(if $(BOARD_$(_var)IMAGE_F2FS_SLOAD_COMPRESS_FLAGS),$(hide) echo "$(1)_f2fs_sldc_flags=$(BOARD_$(_var)IMAGE_F2FS_SLOAD_COMPRESS_FLAGS)" >> $(2))
1891$(if $(BOARD_$(_var)IMAGE_FILE_SYSTEM_COMPRESS),$(hide) echo "$(1)_f2fs_compress=$(BOARD_$(_var)IMAGE_FILE_SYSTEM_COMPRESS)" >> $(2))
1892$(if $(BOARD_$(_var)IMAGE_FILE_SYSTEM_TYPE),$(hide) echo "$(1)_fs_type=$(BOARD_$(_var)IMAGE_FILE_SYSTEM_TYPE)" >> $(2))
1893$(if $(BOARD_$(_var)IMAGE_JOURNAL_SIZE),$(hide) echo "$(1)_journal_size=$(BOARD_$(_var)IMAGE_JOURNAL_SIZE)" >> $(2))
1894$(if $(BOARD_$(_var)IMAGE_PARTITION_RESERVED_SIZE),$(hide) echo "$(1)_reserved_size=$(BOARD_$(_var)IMAGE_PARTITION_RESERVED_SIZE)" >> $(2))
1895$(if $(BOARD_$(_var)IMAGE_PARTITION_SIZE),$(hide) echo "$(1)_size=$(BOARD_$(_var)IMAGE_PARTITION_SIZE)" >> $(2))
1896$(if $(BOARD_$(_var)IMAGE_SQUASHFS_BLOCK_SIZE),$(hide) echo "$(1)_squashfs_block_size=$(BOARD_$(_var)IMAGE_SQUASHFS_BLOCK_SIZE)" >> $(2))
1897$(if $(BOARD_$(_var)IMAGE_SQUASHFS_COMPRESSOR),$(hide) echo "$(1)_squashfs_compressor=$(BOARD_$(_var)IMAGE_SQUASHFS_COMPRESSOR)" >> $(2))
1898$(if $(BOARD_$(_var)IMAGE_SQUASHFS_COMPRESSOR_OPT),$(hide) echo "$(1)_squashfs_compressor_opt=$(BOARD_$(_var)IMAGE_SQUASHFS_COMPRESSOR_OPT)" >> $(2))
1899$(if $(BOARD_$(_var)IMAGE_SQUASHFS_DISABLE_4K_ALIGN),$(hide) echo "$(1)_squashfs_disable_4k_align=$(BOARD_$(_var)IMAGE_SQUASHFS_DISABLE_4K_ALIGN)" >> $(2))
1900$(if $(PRODUCT_$(_var)_BASE_FS_PATH),$(hide) echo "$(1)_base_fs_file=$(PRODUCT_$(_var)_BASE_FS_PATH)" >> $(2))
1901$(eval _size := $(BOARD_$(_var)IMAGE_PARTITION_SIZE))
1902$(eval _reserved := $(BOARD_$(_var)IMAGE_PARTITION_RESERVED_SIZE))
1903$(eval _headroom := $(PRODUCT_$(_var)_HEADROOM))
1904$(if $(or $(_size), $(_reserved), $(_headroom)),,
1905    $(hide) echo "$(1)_disable_sparse=true" >> $(2))
1906$(call add-common-flags-to-image-props,$(1),$(2))
1907endef
1908
1909# $(1): the path of the output dictionary file
1910# $(2): a subset of "system vendor cache userdata product system_ext oem odm vendor_dlkm odm_dlkm system_dlkm"
1911# $(3): additional "key=value" pairs to append to the dictionary file.
1912define generate-image-prop-dictionary
1913$(if $(filter $(2),system),\
1914    $(if $(INTERNAL_SYSTEM_OTHER_PARTITION_SIZE),$(hide) echo "system_other_size=$(INTERNAL_SYSTEM_OTHER_PARTITION_SIZE)" >> $(1))
1915    $(if $(PRODUCT_SYSTEM_HEADROOM),$(hide) echo "system_headroom=$(PRODUCT_SYSTEM_HEADROOM)" >> $(1))
1916    $(call add-common-ro-flags-to-image-props,system,$(1))
1917)
1918$(if $(filter $(2),system_other),\
1919    $(hide) echo "building_system_other_image=$(BUILDING_SYSTEM_OTHER_IMAGE)" >> $(1)
1920    $(if $(INTERNAL_SYSTEM_OTHER_PARTITION_SIZE),,
1921        $(hide) echo "system_other_disable_sparse=true" >> $(1))
1922)
1923$(if $(filter $(2),userdata),\
1924    $(if $(BOARD_USERDATAIMAGE_FILE_SYSTEM_TYPE),$(hide) echo "userdata_fs_type=$(BOARD_USERDATAIMAGE_FILE_SYSTEM_TYPE)" >> $(1))
1925    $(if $(BOARD_USERDATAIMAGE_PARTITION_SIZE),$(hide) echo "userdata_size=$(BOARD_USERDATAIMAGE_PARTITION_SIZE)" >> $(1))
1926    $(if $(PRODUCT_FS_CASEFOLD),$(hide) echo "needs_casefold=$(PRODUCT_FS_CASEFOLD)" >> $(1))
1927    $(if $(PRODUCT_QUOTA_PROJID),$(hide) echo "needs_projid=$(PRODUCT_QUOTA_PROJID)" >> $(1))
1928    $(if $(PRODUCT_FS_COMPRESSION),$(hide) echo "needs_compress=$(PRODUCT_FS_COMPRESSION)" >> $(1))
1929    $(call add-common-flags-to-image-props,userdata,$(1))
1930)
1931$(if $(filter $(2),cache),\
1932    $(if $(BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE),$(hide) echo "cache_fs_type=$(BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE)" >> $(1))
1933    $(if $(BOARD_CACHEIMAGE_PARTITION_SIZE),$(hide) echo "cache_size=$(BOARD_CACHEIMAGE_PARTITION_SIZE)" >> $(1))
1934    $(call add-common-flags-to-image-props,cache,$(1))
1935)
1936$(if $(filter $(2),vendor),\
1937    $(call add-common-ro-flags-to-image-props,vendor,$(1))
1938)
1939$(if $(filter $(2),product),\
1940    $(call add-common-ro-flags-to-image-props,product,$(1))
1941)
1942$(if $(filter $(2),system_ext),\
1943    $(call add-common-ro-flags-to-image-props,system_ext,$(1))
1944)
1945$(if $(filter $(2),odm),\
1946    $(call add-common-ro-flags-to-image-props,odm,$(1))
1947)
1948$(if $(filter $(2),vendor_dlkm),\
1949    $(call add-common-ro-flags-to-image-props,vendor_dlkm,$(1))
1950)
1951$(if $(filter $(2),odm_dlkm),\
1952    $(call add-common-ro-flags-to-image-props,odm_dlkm,$(1))
1953)
1954$(if $(filter $(2),system_dlkm),\
1955    $(call add-common-ro-flags-to-image-props,system_dlkm,$(1))
1956)
1957$(if $(filter $(2),oem),\
1958    $(if $(BOARD_OEMIMAGE_PARTITION_SIZE),$(hide) echo "oem_size=$(BOARD_OEMIMAGE_PARTITION_SIZE)" >> $(1))
1959    $(if $(BOARD_OEMIMAGE_JOURNAL_SIZE),$(hide) echo "oem_journal_size=$(BOARD_OEMIMAGE_JOURNAL_SIZE)" >> $(1))
1960    $(if $(BOARD_OEMIMAGE_EXTFS_INODE_COUNT),$(hide) echo "oem_extfs_inode_count=$(BOARD_OEMIMAGE_EXTFS_INODE_COUNT)" >> $(1))
1961    $(if $(BOARD_OEMIMAGE_EXTFS_RSV_PCT),$(hide) echo "oem_extfs_rsv_pct=$(BOARD_OEMIMAGE_EXTFS_RSV_PCT)" >> $(1))
1962    $(call add-common-flags-to-image-props,oem,$(1))
1963)
1964$(hide) echo "ext_mkuserimg=$(notdir $(MKEXTUSERIMG))" >> $(1)
1965
1966$(if $(filter true,$(TARGET_USERIMAGES_USE_EXT2)),$(hide) echo "fs_type=ext2" >> $(1),
1967  $(if $(filter true,$(TARGET_USERIMAGES_USE_EXT3)),$(hide) echo "fs_type=ext3" >> $(1),
1968    $(if $(filter true,$(TARGET_USERIMAGES_USE_EXT4)),$(hide) echo "fs_type=ext4" >> $(1))))
1969
1970$(if $(filter true,$(TARGET_USERIMAGES_SPARSE_EXT_DISABLED)),,$(hide) echo "extfs_sparse_flag=-s" >> $(1))
1971$(if $(filter true,$(TARGET_USERIMAGES_SPARSE_EROFS_DISABLED)),,$(hide) echo "erofs_sparse_flag=-s" >> $(1))
1972$(if $(filter true,$(TARGET_USERIMAGES_SPARSE_SQUASHFS_DISABLED)),,$(hide) echo "squashfs_sparse_flag=-s" >> $(1))
1973$(if $(filter true,$(TARGET_USERIMAGES_SPARSE_F2FS_DISABLED)),,$(hide) echo "f2fs_sparse_flag=-S" >> $(1))
1974$(if $(BOARD_EROFS_COMPRESSOR),$(hide) echo "erofs_default_compressor=$(BOARD_EROFS_COMPRESSOR)" >> $(1))
1975$(if $(BOARD_EROFS_COMPRESS_HINTS),$(hide) echo "erofs_default_compress_hints=$(BOARD_EROFS_COMPRESS_HINTS)" >> $(1))
1976$(if $(BOARD_EROFS_PCLUSTER_SIZE),$(hide) echo "erofs_pcluster_size=$(BOARD_EROFS_PCLUSTER_SIZE)" >> $(1))
1977$(if $(BOARD_EROFS_SHARE_DUP_BLOCKS),$(hide) echo "erofs_share_dup_blocks=$(BOARD_EROFS_SHARE_DUP_BLOCKS)" >> $(1))
1978$(if $(BOARD_EROFS_USE_LEGACY_COMPRESSION),$(hide) echo "erofs_use_legacy_compression=$(BOARD_EROFS_USE_LEGACY_COMPRESSION)" >> $(1))
1979$(if $(BOARD_EXT4_SHARE_DUP_BLOCKS),$(hide) echo "ext4_share_dup_blocks=$(BOARD_EXT4_SHARE_DUP_BLOCKS)" >> $(1))
1980$(if $(BOARD_FLASH_LOGICAL_BLOCK_SIZE), $(hide) echo "flash_logical_block_size=$(BOARD_FLASH_LOGICAL_BLOCK_SIZE)" >> $(1))
1981$(if $(BOARD_FLASH_ERASE_BLOCK_SIZE), $(hide) echo "flash_erase_block_size=$(BOARD_FLASH_ERASE_BLOCK_SIZE)" >> $(1))
1982$(if $(filter eng, $(TARGET_BUILD_VARIANT)),$(hide) echo "verity_disable=true" >> $(1))
1983$(if $(PRODUCT_SYSTEM_VERITY_PARTITION),$(hide) echo "system_verity_block_device=$(PRODUCT_SYSTEM_VERITY_PARTITION)" >> $(1))
1984$(if $(PRODUCT_VENDOR_VERITY_PARTITION),$(hide) echo "vendor_verity_block_device=$(PRODUCT_VENDOR_VERITY_PARTITION)" >> $(1))
1985$(if $(PRODUCT_PRODUCT_VERITY_PARTITION),$(hide) echo "product_verity_block_device=$(PRODUCT_PRODUCT_VERITY_PARTITION)" >> $(1))
1986$(if $(PRODUCT_SYSTEM_EXT_VERITY_PARTITION),$(hide) echo "system_ext_verity_block_device=$(PRODUCT_SYSTEM_EXT_VERITY_PARTITION)" >> $(1))
1987$(if $(PRODUCT_VENDOR_DLKM_VERITY_PARTITION),$(hide) echo "vendor_dlkm_verity_block_device=$(PRODUCT_VENDOR_DLKM_VERITY_PARTITION)" >> $(1))
1988$(if $(PRODUCT_ODM_DLKM_VERITY_PARTITION),$(hide) echo "odm_dlkm_verity_block_device=$(PRODUCT_ODM_DLKM_VERITY_PARTITION)" >> $(1))
1989$(if $(PRODUCT_SYSTEM_DLKM_VERITY_PARTITION),$(hide) echo "system_dlkm_verity_block_device=$(PRODUCT_SYSTEM_DLKM_VERITY_PARTITION)" >> $(1))
1990$(if $(PRODUCT_SUPPORTS_VBOOT),$(hide) echo "vboot=$(PRODUCT_SUPPORTS_VBOOT)" >> $(1))
1991$(if $(PRODUCT_SUPPORTS_VBOOT),$(hide) echo "vboot_key=$(PRODUCT_VBOOT_SIGNING_KEY)" >> $(1))
1992$(if $(PRODUCT_SUPPORTS_VBOOT),$(hide) echo "vboot_subkey=$(PRODUCT_VBOOT_SIGNING_SUBKEY)" >> $(1))
1993$(if $(PRODUCT_SUPPORTS_VBOOT),$(hide) echo "futility=$(notdir $(FUTILITY))" >> $(1))
1994$(if $(PRODUCT_SUPPORTS_VBOOT),$(hide) echo "vboot_signer_cmd=$(VBOOT_SIGNER)" >> $(1))
1995$(if $(BOARD_AVB_ENABLE),$(hide) echo "avb_avbtool=$(notdir $(AVBTOOL))" >> $(1))
1996$(if $(BOARD_AVB_ENABLE),$(hide) echo "avb_system_hashtree_enable=$(BOARD_AVB_ENABLE)" >> $(1))
1997$(if $(BOARD_AVB_ENABLE),$(hide) echo "avb_system_add_hashtree_footer_args=$(BOARD_AVB_SYSTEM_ADD_HASHTREE_FOOTER_ARGS)" >> $(1))
1998$(if $(BOARD_AVB_ENABLE),\
1999    $(if $(BOARD_AVB_SYSTEM_KEY_PATH),\
2000        $(hide) echo "avb_system_key_path=$(BOARD_AVB_SYSTEM_KEY_PATH)" >> $(1)
2001        $(hide) echo "avb_system_algorithm=$(BOARD_AVB_SYSTEM_ALGORITHM)" >> $(1)
2002        $(hide) echo "avb_system_rollback_index_location=$(BOARD_AVB_SYSTEM_ROLLBACK_INDEX_LOCATION)" >> $(1)))
2003$(if $(BOARD_AVB_ENABLE),$(hide) echo "avb_system_other_hashtree_enable=$(BOARD_AVB_ENABLE)" >> $(1))
2004$(if $(BOARD_AVB_ENABLE),$(hide) echo "avb_system_other_add_hashtree_footer_args=$(BOARD_AVB_SYSTEM_OTHER_ADD_HASHTREE_FOOTER_ARGS)" >> $(1))
2005$(if $(BOARD_AVB_ENABLE),\
2006    $(if $(BOARD_AVB_SYSTEM_OTHER_KEY_PATH),\
2007        $(hide) echo "avb_system_other_key_path=$(BOARD_AVB_SYSTEM_OTHER_KEY_PATH)" >> $(1)
2008        $(hide) echo "avb_system_other_algorithm=$(BOARD_AVB_SYSTEM_OTHER_ALGORITHM)" >> $(1)))
2009$(if $(BOARD_AVB_ENABLE),$(hide) echo "avb_vendor_hashtree_enable=$(BOARD_AVB_ENABLE)" >> $(1))
2010$(if $(BOARD_AVB_ENABLE),$(hide) echo "avb_vendor_add_hashtree_footer_args=$(BOARD_AVB_VENDOR_ADD_HASHTREE_FOOTER_ARGS)" >> $(1))
2011$(if $(BOARD_AVB_ENABLE),\
2012    $(if $(BOARD_AVB_VENDOR_KEY_PATH),\
2013        $(hide) echo "avb_vendor_key_path=$(BOARD_AVB_VENDOR_KEY_PATH)" >> $(1)
2014        $(hide) echo "avb_vendor_algorithm=$(BOARD_AVB_VENDOR_ALGORITHM)" >> $(1)
2015        $(hide) echo "avb_vendor_rollback_index_location=$(BOARD_AVB_VENDOR_ROLLBACK_INDEX_LOCATION)" >> $(1)))
2016$(if $(BOARD_AVB_ENABLE),$(hide) echo "avb_product_hashtree_enable=$(BOARD_AVB_ENABLE)" >> $(1))
2017$(if $(BOARD_AVB_ENABLE),$(hide) echo "avb_product_add_hashtree_footer_args=$(BOARD_AVB_PRODUCT_ADD_HASHTREE_FOOTER_ARGS)" >> $(1))
2018$(if $(BOARD_AVB_ENABLE),\
2019    $(if $(BOARD_AVB_PRODUCT_KEY_PATH),\
2020        $(hide) echo "avb_product_key_path=$(BOARD_AVB_PRODUCT_KEY_PATH)" >> $(1)
2021        $(hide) echo "avb_product_algorithm=$(BOARD_AVB_PRODUCT_ALGORITHM)" >> $(1)
2022        $(hide) echo "avb_product_rollback_index_location=$(BOARD_AVB_PRODUCT_ROLLBACK_INDEX_LOCATION)" >> $(1)))
2023$(if $(BOARD_AVB_ENABLE),$(hide) echo "avb_system_ext_hashtree_enable=$(BOARD_AVB_ENABLE)" >> $(1))
2024$(if $(BOARD_AVB_ENABLE),\
2025    $(hide) echo "avb_system_ext_add_hashtree_footer_args=$(BOARD_AVB_SYSTEM_EXT_ADD_HASHTREE_FOOTER_ARGS)" >> $(1))
2026$(if $(BOARD_AVB_ENABLE),\
2027    $(if $(BOARD_AVB_SYSTEM_EXT_KEY_PATH),\
2028        $(hide) echo "avb_system_ext_key_path=$(BOARD_AVB_SYSTEM_EXT_KEY_PATH)" >> $(1)
2029        $(hide) echo "avb_system_ext_algorithm=$(BOARD_AVB_SYSTEM_EXT_ALGORITHM)" >> $(1)
2030        $(hide) echo "avb_system_ext_rollback_index_location=$(BOARD_AVB_SYSTEM_EXT_ROLLBACK_INDEX_LOCATION)" >> $(1)))
2031$(if $(BOARD_AVB_ENABLE),$(hide) echo "avb_odm_hashtree_enable=$(BOARD_AVB_ENABLE)" >> $(1))
2032$(if $(BOARD_AVB_ENABLE),$(hide) echo "avb_odm_add_hashtree_footer_args=$(BOARD_AVB_ODM_ADD_HASHTREE_FOOTER_ARGS)" >> $(1))
2033$(if $(BOARD_AVB_ENABLE),\
2034    $(if $(BOARD_AVB_ODM_KEY_PATH),\
2035        $(hide) echo "avb_odm_key_path=$(BOARD_AVB_ODM_KEY_PATH)" >> $(1)
2036        $(hide) echo "avb_odm_algorithm=$(BOARD_AVB_ODM_ALGORITHM)" >> $(1)
2037        $(hide) echo "avb_odm_rollback_index_location=$(BOARD_AVB_ODM_ROLLBACK_INDEX_LOCATION)" >> $(1)))
2038$(if $(BOARD_AVB_ENABLE),$(hide) echo "avb_vendor_dlkm_hashtree_enable=$(BOARD_AVB_ENABLE)" >> $(1))
2039$(if $(BOARD_AVB_ENABLE),\
2040    $(hide) echo "avb_vendor_dlkm_add_hashtree_footer_args=$(BOARD_AVB_VENDOR_DLKM_ADD_HASHTREE_FOOTER_ARGS)" >> $(1))
2041$(if $(BOARD_AVB_ENABLE),\
2042    $(if $(BOARD_AVB_VENDOR_DLKM_KEY_PATH),\
2043        $(hide) echo "avb_vendor_dlkm_key_path=$(BOARD_AVB_VENDOR_DLKM_KEY_PATH)" >> $(1)
2044        $(hide) echo "avb_vendor_dlkm_algorithm=$(BOARD_AVB_VENDOR_DLKM_ALGORITHM)" >> $(1)
2045        $(hide) echo "avb_vendor_dlkm_rollback_index_location=$(BOARD_AVB_VENDOR_DLKM_ROLLBACK_INDEX_LOCATION)" >> $(1)))
2046$(if $(BOARD_AVB_ENABLE),$(hide) echo "avb_odm_dlkm_hashtree_enable=$(BOARD_AVB_ENABLE)" >> $(1))
2047$(if $(BOARD_AVB_ENABLE),\
2048    $(hide) echo "avb_odm_dlkm_add_hashtree_footer_args=$(BOARD_AVB_ODM_DLKM_ADD_HASHTREE_FOOTER_ARGS)" >> $(1))
2049$(if $(BOARD_AVB_ENABLE),\
2050    $(if $(BOARD_AVB_ODM_DLKM_KEY_PATH),\
2051        $(hide) echo "avb_odm_dlkm_key_path=$(BOARD_AVB_ODM_DLKM_KEY_PATH)" >> $(1)
2052        $(hide) echo "avb_odm_dlkm_algorithm=$(BOARD_AVB_ODM_DLKM_ALGORITHM)" >> $(1)
2053        $(hide) echo "avb_odm_dlkm_rollback_index_location=$(BOARD_AVB_ODM_DLKM_ROLLBACK_INDEX_LOCATION)" >> $(1)))
2054$(if $(BOARD_AVB_ENABLE),$(hide) echo "avb_system_dlkm_hashtree_enable=$(BOARD_AVB_ENABLE)" >> $(1))
2055$(if $(BOARD_AVB_ENABLE),\
2056    $(hide) echo "avb_system_dlkm_add_hashtree_footer_args=$(BOARD_AVB_SYSTEM_DLKM_ADD_HASHTREE_FOOTER_ARGS)" >> $(1))
2057$(if $(BOARD_AVB_ENABLE),\
2058    $(if $(BOARD_AVB_SYSTEM_DLKM_KEY_PATH),\
2059        $(hide) echo "avb_system_dlkm_key_path=$(BOARD_AVB_SYSTEM_DLKM_KEY_PATH)" >> $(1)
2060        $(hide) echo "avb_system_dlkm_algorithm=$(BOARD_AVB_SYSTEM_DLKM_ALGORITHM)" >> $(1)
2061        $(hide) echo "avb_system_dlkm_rollback_index_location=$(BOARD_SYSTEM_SYSTEM_DLKM_ROLLBACK_INDEX_LOCATION)" >> $(1)))
2062$(if $(filter true,$(BOARD_USES_RECOVERY_AS_BOOT)),\
2063    $(hide) echo "recovery_as_boot=true" >> $(1))
2064$(if $(filter true,$(BOARD_BUILD_GKI_BOOT_IMAGE_WITHOUT_RAMDISK)),\
2065    $(hide) echo "gki_boot_image_without_ramdisk=true" >> $(1))
2066$(hide) echo "root_dir=$(TARGET_ROOT_OUT)" >> $(1)
2067$(if $(filter true,$(PRODUCT_USE_DYNAMIC_PARTITION_SIZE)),\
2068    $(hide) echo "use_dynamic_partition_size=true" >> $(1))
2069$(if $(3),$(hide) $(foreach kv,$(3),echo "$(kv)" >> $(1);))
2070endef
2071
2072# $(1): the path of the output dictionary file
2073# $(2): additional "key=value" pairs to append to the dictionary file.
2074PROP_DICTIONARY_IMAGES := oem
2075ifdef BUILDING_CACHE_IMAGE
2076  PROP_DICTIONARY_IMAGES += cache
2077endif
2078ifdef BUILDING_SYSTEM_IMAGE
2079  PROP_DICTIONARY_IMAGES += system
2080endif
2081ifdef BUILDING_SYSTEM_OTHER_IMAGE
2082  PROP_DICTIONARY_IMAGES += system_other
2083endif
2084ifdef BUILDING_USERDATA_IMAGE
2085  PROP_DICTIONARY_IMAGES += userdata
2086endif
2087ifdef BUILDING_VENDOR_IMAGE
2088  PROP_DICTIONARY_IMAGES += vendor
2089endif
2090ifdef BUILDING_PRODUCT_IMAGE
2091  PROP_DICTIONARY_IMAGES += product
2092endif
2093ifdef BUILDING_SYSTEM_EXT_IMAGE
2094  PROP_DICTIONARY_IMAGES += system_ext
2095endif
2096ifdef BUILDING_ODM_IMAGE
2097  PROP_DICTIONARY_IMAGES += odm
2098endif
2099ifdef BUILDING_VENDOR_DLKM_IMAGE
2100  PROP_DICTIONARY_IMAGES += vendor_dlkm
2101endif
2102ifdef BUILDING_ODM_DLKM_IMAGE
2103  PROP_DICTIONARY_IMAGES += odm_dlkm
2104endif
2105ifdef BUILDING_SYSTEM_DLKM_IMAGE
2106  PROP_DICTIONARY_IMAGES += system_dlkm
2107endif
2108define generate-userimage-prop-dictionary
2109  $(call generate-image-prop-dictionary,$(1),$(PROP_DICTIONARY_IMAGES),$(2))
2110endef
2111
2112# $(1): the path of the input dictionary file, where each line has the format key=value
2113# $(2): the key to look up
2114define read-image-prop-dictionary
2115$$(grep '$(2)=' $(1) | cut -f2- -d'=')
2116endef
2117
2118# -----------------------------------------------------------------
2119# Recovery image
2120
2121# Recovery image exists if we are building recovery, or building recovery as boot.
2122INSTALLED_FILES_OUTSIDE_IMAGES := $(filter-out $(TARGET_RECOVERY_OUT)/%, $(INSTALLED_FILES_OUTSIDE_IMAGES))
2123ifdef BUILDING_RECOVERY_IMAGE
2124
2125INTERNAL_RECOVERYIMAGE_FILES := $(filter $(TARGET_RECOVERY_OUT)/%, \
2126    $(ALL_DEFAULT_INSTALLED_MODULES))
2127
2128INSTALLED_FILES_FILE_RECOVERY := $(PRODUCT_OUT)/installed-files-recovery.txt
2129INSTALLED_FILES_JSON_RECOVERY := $(INSTALLED_FILES_FILE_RECOVERY:.txt=.json)
2130
2131ifeq ($(BOARD_USES_RECOVERY_AS_BOOT),true)
2132INSTALLED_BOOTIMAGE_TARGET := $(BUILT_BOOTIMAGE_TARGET)
2133endif
2134
2135# TODO(b/30414428): Can't depend on INTERNAL_RECOVERYIMAGE_FILES alone like other
2136# INSTALLED_FILES_FILE_* rules. Because currently there're cp/rsync/rm commands in
2137# build-recoveryimage-target, which would touch the files under TARGET_RECOVERY_OUT and race with
2138# the call to FILELIST.
2139$(INSTALLED_FILES_FILE_RECOVERY): $(INTERNAL_RECOVERY_RAMDISK_FILES_TIMESTAMP)
2140
2141$(INSTALLED_FILES_FILE_RECOVERY): .KATI_IMPLICIT_OUTPUTS := $(INSTALLED_FILES_JSON_RECOVERY)
2142$(INSTALLED_FILES_FILE_RECOVERY): $(INTERNAL_RECOVERYIMAGE_FILES) $(FILESLIST) $(FILESLIST_UTIL)
2143	@echo Installed file list: $@
2144	mkdir -p $(dir $@)
2145	rm -f $@
2146	$(FILESLIST) $(TARGET_RECOVERY_ROOT_OUT) > $(@:.txt=.json)
2147	$(FILESLIST_UTIL) -c $(@:.txt=.json) > $@
2148
2149$(eval $(call declare-0p-target,$(INSTALLED_FILES_FILE_RECOVERY)))
2150$(eval $(call declare-0p-target,$(INSTALLED_FILES_JSON_RECOVERY)))
2151
2152recovery_sepolicy := \
2153    $(TARGET_RECOVERY_ROOT_OUT)/sepolicy \
2154    $(TARGET_RECOVERY_ROOT_OUT)/plat_file_contexts \
2155    $(TARGET_RECOVERY_ROOT_OUT)/plat_service_contexts \
2156    $(TARGET_RECOVERY_ROOT_OUT)/plat_property_contexts \
2157    $(TARGET_RECOVERY_ROOT_OUT)/system_ext_file_contexts \
2158    $(TARGET_RECOVERY_ROOT_OUT)/system_ext_service_contexts \
2159    $(TARGET_RECOVERY_ROOT_OUT)/system_ext_property_contexts \
2160    $(TARGET_RECOVERY_ROOT_OUT)/vendor_file_contexts \
2161    $(TARGET_RECOVERY_ROOT_OUT)/vendor_service_contexts \
2162    $(TARGET_RECOVERY_ROOT_OUT)/vendor_property_contexts \
2163    $(TARGET_RECOVERY_ROOT_OUT)/odm_file_contexts \
2164    $(TARGET_RECOVERY_ROOT_OUT)/odm_property_contexts \
2165    $(TARGET_RECOVERY_ROOT_OUT)/product_file_contexts \
2166    $(TARGET_RECOVERY_ROOT_OUT)/product_service_contexts \
2167    $(TARGET_RECOVERY_ROOT_OUT)/product_property_contexts
2168
2169# Passed into rsync from non-recovery root to recovery root, to avoid overwriting recovery-specific
2170# SELinux files
2171IGNORE_RECOVERY_SEPOLICY := $(patsubst $(TARGET_RECOVERY_OUT)/%,--exclude=/%,$(recovery_sepolicy))
2172
2173# if building multiple boot images from multiple kernels, use the first kernel listed
2174# for the recovery image
2175recovery_kernel := $(firstword $(INSTALLED_KERNEL_TARGET))
2176recovery_ramdisk := $(PRODUCT_OUT)/ramdisk-recovery.img
2177recovery_resources_common := bootable/recovery/res
2178
2179# Set recovery_density to a density bucket based on TARGET_SCREEN_DENSITY, PRODUCT_AAPT_PREF_CONFIG,
2180# or mdpi, in order of preference. We support both specific buckets (e.g. xdpi) and numbers,
2181# which get remapped to a bucket.
2182recovery_density := $(or $(TARGET_SCREEN_DENSITY),$(PRODUCT_AAPT_PREF_CONFIG),mdpi)
2183ifeq (,$(filter xxxhdpi xxhdpi xhdpi hdpi mdpi,$(recovery_density)))
2184recovery_density_value := $(patsubst %dpi,%,$(recovery_density))
2185# We roughly use the medium point between the primary densities to split buckets.
2186# ------160------240------320----------480------------640------
2187#       mdpi     hdpi    xhdpi        xxhdpi        xxxhdpi
2188recovery_density := $(strip \
2189  $(or $(if $(filter $(shell echo $$(($(recovery_density_value) >= 560))),1),xxxhdpi),\
2190       $(if $(filter $(shell echo $$(($(recovery_density_value) >= 400))),1),xxhdpi),\
2191       $(if $(filter $(shell echo $$(($(recovery_density_value) >= 280))),1),xhdpi),\
2192       $(if $(filter $(shell echo $$(($(recovery_density_value) >= 200))),1),hdpi,mdpi)))
2193endif
2194
2195ifneq (,$(wildcard $(recovery_resources_common)-$(recovery_density)))
2196recovery_resources_common := $(recovery_resources_common)-$(recovery_density)
2197else
2198recovery_resources_common := $(recovery_resources_common)-xhdpi
2199endif
2200
2201# Select the 18x32 font on high-density devices (xhdpi and up); and the 12x22 font on other devices.
2202# Note that the font selected here can be overridden for a particular device by putting a font.png
2203# in its private recovery resources.
2204ifneq (,$(filter xxxhdpi xxhdpi xhdpi,$(recovery_density)))
2205recovery_font := bootable/recovery/fonts/18x32.png
2206else
2207recovery_font := bootable/recovery/fonts/12x22.png
2208endif
2209
2210
2211# We will only generate the recovery background text images if the variable
2212# TARGET_RECOVERY_UI_SCREEN_WIDTH is defined. For devices with xxxhdpi and xxhdpi, we set the
2213# variable to the commonly used values here, if it hasn't been intialized elsewhere. While for
2214# devices with lower density, they must have TARGET_RECOVERY_UI_SCREEN_WIDTH defined in their
2215# BoardConfig in order to use this feature.
2216ifeq ($(recovery_density),xxxhdpi)
2217TARGET_RECOVERY_UI_SCREEN_WIDTH ?= 1440
2218else ifeq ($(recovery_density),xxhdpi)
2219TARGET_RECOVERY_UI_SCREEN_WIDTH ?= 1080
2220endif
2221
2222ifneq ($(TARGET_RECOVERY_UI_SCREEN_WIDTH),)
2223# Subtracts the margin width and menu indent from the screen width; it's safe to be conservative.
2224ifeq ($(TARGET_RECOVERY_UI_MARGIN_WIDTH),)
2225  recovery_image_width := $$(($(TARGET_RECOVERY_UI_SCREEN_WIDTH) - 10))
2226else
2227  recovery_image_width := $$(($(TARGET_RECOVERY_UI_SCREEN_WIDTH) - $(TARGET_RECOVERY_UI_MARGIN_WIDTH) - 10))
2228endif
2229
2230
2231RECOVERY_INSTALLING_TEXT_FILE := $(call intermediates-dir-for,ETC,recovery_text_res)/installing_text.png
2232RECOVERY_INSTALLING_SECURITY_TEXT_FILE := $(dir $(RECOVERY_INSTALLING_TEXT_FILE))/installing_security_text.png
2233RECOVERY_ERASING_TEXT_FILE := $(dir $(RECOVERY_INSTALLING_TEXT_FILE))/erasing_text.png
2234RECOVERY_ERROR_TEXT_FILE := $(dir $(RECOVERY_INSTALLING_TEXT_FILE))/error_text.png
2235RECOVERY_NO_COMMAND_TEXT_FILE := $(dir $(RECOVERY_INSTALLING_TEXT_FILE))/no_command_text.png
2236
2237RECOVERY_CANCEL_WIPE_DATA_TEXT_FILE := $(dir $(RECOVERY_INSTALLING_TEXT_FILE))/cancel_wipe_data_text.png
2238RECOVERY_FACTORY_DATA_RESET_TEXT_FILE := $(dir $(RECOVERY_INSTALLING_TEXT_FILE))/factory_data_reset_text.png
2239RECOVERY_TRY_AGAIN_TEXT_FILE := $(dir $(RECOVERY_INSTALLING_TEXT_FILE))/try_again_text.png
2240RECOVERY_WIPE_DATA_CONFIRMATION_TEXT_FILE := $(dir $(RECOVERY_INSTALLING_TEXT_FILE))/wipe_data_confirmation_text.png
2241RECOVERY_WIPE_DATA_MENU_HEADER_TEXT_FILE := $(dir $(RECOVERY_INSTALLING_TEXT_FILE))/wipe_data_menu_header_text.png
2242
2243generated_recovery_text_files := \
2244  $(RECOVERY_INSTALLING_TEXT_FILE) \
2245  $(RECOVERY_INSTALLING_SECURITY_TEXT_FILE) \
2246  $(RECOVERY_ERASING_TEXT_FILE) \
2247  $(RECOVERY_ERROR_TEXT_FILE) \
2248  $(RECOVERY_NO_COMMAND_TEXT_FILE) \
2249  $(RECOVERY_CANCEL_WIPE_DATA_TEXT_FILE) \
2250  $(RECOVERY_FACTORY_DATA_RESET_TEXT_FILE) \
2251  $(RECOVERY_TRY_AGAIN_TEXT_FILE) \
2252  $(RECOVERY_WIPE_DATA_CONFIRMATION_TEXT_FILE) \
2253  $(RECOVERY_WIPE_DATA_MENU_HEADER_TEXT_FILE)
2254
2255resource_dir := bootable/recovery/tools/recovery_l10n/res/
2256resource_dir_deps := $(sort $(shell find $(resource_dir) -name *.xml -not -name .*))
2257image_generator_jar := $(HOST_OUT_JAVA_LIBRARIES)/RecoveryImageGenerator.jar
2258zopflipng := $(HOST_OUT_EXECUTABLES)/zopflipng
2259$(RECOVERY_INSTALLING_TEXT_FILE): PRIVATE_SOURCE_FONTS := $(recovery_noto-fonts_dep) $(recovery_roboto-fonts_dep)
2260$(RECOVERY_INSTALLING_TEXT_FILE): PRIVATE_RECOVERY_FONT_FILES_DIR := $(call intermediates-dir-for,ETC,recovery_font_files)
2261$(RECOVERY_INSTALLING_TEXT_FILE): PRIVATE_RESOURCE_DIR := $(resource_dir)
2262$(RECOVERY_INSTALLING_TEXT_FILE): PRIVATE_IMAGE_GENERATOR_JAR := $(image_generator_jar)
2263$(RECOVERY_INSTALLING_TEXT_FILE): PRIVATE_ZOPFLIPNG := $(zopflipng)
2264$(RECOVERY_INSTALLING_TEXT_FILE): PRIVATE_RECOVERY_IMAGE_WIDTH := $(recovery_image_width)
2265$(RECOVERY_INSTALLING_TEXT_FILE): PRIVATE_RECOVERY_BACKGROUND_TEXT_LIST := \
2266  recovery_installing \
2267  recovery_installing_security \
2268  recovery_erasing \
2269  recovery_error \
2270  recovery_no_command
2271$(RECOVERY_INSTALLING_TEXT_FILE): PRIVATE_RECOVERY_WIPE_DATA_TEXT_LIST := \
2272  recovery_cancel_wipe_data \
2273  recovery_factory_data_reset \
2274  recovery_try_again \
2275  recovery_wipe_data_menu_header \
2276  recovery_wipe_data_confirmation
2277$(RECOVERY_INSTALLING_TEXT_FILE): .KATI_IMPLICIT_OUTPUTS := $(filter-out $(RECOVERY_INSTALLING_TEXT_FILE),$(generated_recovery_text_files))
2278$(RECOVERY_INSTALLING_TEXT_FILE): $(image_generator_jar) $(resource_dir_deps) $(recovery_noto-fonts_dep) $(recovery_roboto-fonts_dep) $(zopflipng)
2279	# Prepares the font directory.
2280	@rm -rf $(PRIVATE_RECOVERY_FONT_FILES_DIR)
2281	@mkdir -p $(PRIVATE_RECOVERY_FONT_FILES_DIR)
2282	$(foreach filename,$(PRIVATE_SOURCE_FONTS), cp $(filename) $(PRIVATE_RECOVERY_FONT_FILES_DIR) &&) true
2283	@rm -rf $(dir $@)
2284	@mkdir -p $(dir $@)
2285	$(foreach text_name,$(PRIVATE_RECOVERY_BACKGROUND_TEXT_LIST) $(PRIVATE_RECOVERY_WIPE_DATA_TEXT_LIST), \
2286	  $(eval output_file := $(dir $@)/$(patsubst recovery_%,%_text.png,$(text_name))) \
2287	  $(eval center_alignment := $(if $(filter $(text_name),$(PRIVATE_RECOVERY_BACKGROUND_TEXT_LIST)), --center_alignment)) \
2288	  java -jar $(PRIVATE_IMAGE_GENERATOR_JAR) \
2289	    --image_width $(PRIVATE_RECOVERY_IMAGE_WIDTH) \
2290	    --text_name $(text_name) \
2291	    --font_dir $(PRIVATE_RECOVERY_FONT_FILES_DIR) \
2292	    --resource_dir $(PRIVATE_RESOURCE_DIR) \
2293	    --output_file $(output_file) $(center_alignment) && \
2294	  $(PRIVATE_ZOPFLIPNG) -y --iterations=1 --filters=0 $(output_file) $(output_file) > /dev/null &&) true
2295else
2296RECOVERY_INSTALLING_TEXT_FILE :=
2297RECOVERY_INSTALLING_SECURITY_TEXT_FILE :=
2298RECOVERY_ERASING_TEXT_FILE :=
2299RECOVERY_ERROR_TEXT_FILE :=
2300RECOVERY_NO_COMMAND_TEXT_FILE :=
2301RECOVERY_CANCEL_WIPE_DATA_TEXT_FILE :=
2302RECOVERY_FACTORY_DATA_RESET_TEXT_FILE :=
2303RECOVERY_TRY_AGAIN_TEXT_FILE :=
2304RECOVERY_WIPE_DATA_CONFIRMATION_TEXT_FILE :=
2305RECOVERY_WIPE_DATA_MENU_HEADER_TEXT_FILE :=
2306endif # TARGET_RECOVERY_UI_SCREEN_WIDTH
2307
2308ifndef TARGET_PRIVATE_RES_DIRS
2309TARGET_PRIVATE_RES_DIRS := $(wildcard $(TARGET_DEVICE_DIR)/recovery/res)
2310endif
2311recovery_resource_deps := $(shell find $(recovery_resources_common) \
2312  $(TARGET_PRIVATE_RES_DIRS) -type f)
2313recovery_resource_deps += $(generated_recovery_text_files)
2314
2315
2316ifdef TARGET_RECOVERY_FSTAB
2317recovery_fstab := $(TARGET_RECOVERY_FSTAB)
2318else ifdef TARGET_RECOVERY_FSTAB_GENRULE
2319# Specifies a soong genrule module that generates an fstab.
2320recovery_fstab := $(call intermediates-dir-for,ETC,$(TARGET_RECOVERY_FSTAB_GENRULE))/$(TARGET_RECOVERY_FSTAB_GENRULE)
2321else
2322recovery_fstab := $(strip $(wildcard $(TARGET_DEVICE_DIR)/recovery.fstab))
2323endif
2324ifdef TARGET_RECOVERY_WIPE
2325recovery_wipe := $(TARGET_RECOVERY_WIPE)
2326else
2327recovery_wipe :=
2328endif
2329
2330# Traditionally with non-A/B OTA we have:
2331#   boot.img + recovery-from-boot.p + recovery-resource.dat = recovery.img.
2332# recovery-resource.dat is needed only if we carry an imgdiff patch of the boot and recovery images
2333# and invoke install-recovery.sh on the first boot post an OTA update.
2334#
2335# We no longer need that if one of the following conditions holds:
2336#   a) We carry a full copy of the recovery image - no patching needed
2337#      (BOARD_USES_FULL_RECOVERY_IMAGE = true);
2338#   b) We build a single image that contains boot and recovery both - no recovery image to install
2339#      (BOARD_USES_RECOVERY_AS_BOOT = true);
2340#   c) We include the recovery DTBO image within recovery - not needing the resource file as we
2341#      do bsdiff because boot and recovery will contain different number of entries
2342#      (BOARD_INCLUDE_RECOVERY_DTBO = true).
2343#   d) We include the recovery ACPIO image within recovery - not needing the resource file as we
2344#      do bsdiff because boot and recovery will contain different number of entries
2345#      (BOARD_INCLUDE_RECOVERY_ACPIO = true).
2346#   e) We build a single image that contains vendor_boot and recovery both - no recovery image to
2347#      install
2348#      (BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT = true).
2349
2350ifeq (,$(filter true, $(BOARD_USES_FULL_RECOVERY_IMAGE) $(BOARD_USES_RECOVERY_AS_BOOT) \
2351  $(BOARD_INCLUDE_RECOVERY_DTBO) $(BOARD_INCLUDE_RECOVERY_ACPIO) \
2352  $(BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT)))
2353# Named '.dat' so we don't attempt to use imgdiff for patching it.
2354RECOVERY_RESOURCE_ZIP := $(TARGET_OUT_VENDOR)/etc/recovery-resource.dat
2355ALL_DEFAULT_INSTALLED_MODULES += $(RECOVERY_RESOURCE_ZIP)
2356else
2357RECOVERY_RESOURCE_ZIP :=
2358endif
2359
2360INSTALLED_RECOVERY_BUILD_PROP_TARGET := $(TARGET_RECOVERY_ROOT_OUT)/prop.default
2361
2362$(INSTALLED_RECOVERY_BUILD_PROP_TARGET): PRIVATE_RECOVERY_UI_PROPERTIES := \
2363    TARGET_RECOVERY_UI_ANIMATION_FPS:animation_fps \
2364    TARGET_RECOVERY_UI_MARGIN_HEIGHT:margin_height \
2365    TARGET_RECOVERY_UI_MARGIN_WIDTH:margin_width \
2366    TARGET_RECOVERY_UI_MENU_UNUSABLE_ROWS:menu_unusable_rows \
2367    TARGET_RECOVERY_UI_PROGRESS_BAR_BASELINE:progress_bar_baseline \
2368    TARGET_RECOVERY_UI_TOUCH_LOW_THRESHOLD:touch_low_threshold \
2369    TARGET_RECOVERY_UI_TOUCH_HIGH_THRESHOLD:touch_high_threshold \
2370    TARGET_RECOVERY_UI_VR_STEREO_OFFSET:vr_stereo_offset
2371
2372# Parses the given list of build variables and writes their values as build properties if defined.
2373# For example, if a target defines `TARGET_RECOVERY_UI_MARGIN_HEIGHT := 100`,
2374# `ro.recovery.ui.margin_height=100` will be appended to the given output file.
2375# $(1): Map from the build variable names to property names
2376# $(2): Output file
2377define append-recovery-ui-properties
2378echo "#" >> $(2)
2379echo "# RECOVERY UI BUILD PROPERTIES" >> $(2)
2380echo "#" >> $(2)
2381$(foreach prop,$(1), \
2382    $(eval _varname := $(call word-colon,1,$(prop))) \
2383    $(eval _propname := $(call word-colon,2,$(prop))) \
2384    $(eval _value := $($(_varname))) \
2385    $(if $(_value), \
2386        echo ro.recovery.ui.$(_propname)=$(_value) >> $(2) &&)) true
2387endef
2388
2389$(INSTALLED_RECOVERY_BUILD_PROP_TARGET): \
2390	    $(INSTALLED_BUILD_PROP_TARGET) \
2391	    $(INSTALLED_VENDOR_BUILD_PROP_TARGET) \
2392	    $(INSTALLED_ODM_BUILD_PROP_TARGET) \
2393	    $(INSTALLED_PRODUCT_BUILD_PROP_TARGET) \
2394	    $(INSTALLED_SYSTEM_EXT_BUILD_PROP_TARGET)
2395	@echo "Target recovery buildinfo: $@"
2396	$(hide) mkdir -p $(dir $@)
2397	$(hide) rm -f $@
2398	$(hide) cat $(INSTALLED_BUILD_PROP_TARGET) >> $@
2399	$(hide) cat $(INSTALLED_VENDOR_BUILD_PROP_TARGET) >> $@
2400	$(hide) cat $(INSTALLED_ODM_BUILD_PROP_TARGET) >> $@
2401	$(hide) cat $(INSTALLED_PRODUCT_BUILD_PROP_TARGET) >> $@
2402	$(hide) cat $(INSTALLED_SYSTEM_EXT_BUILD_PROP_TARGET) >> $@
2403	$(call append-recovery-ui-properties,$(PRIVATE_RECOVERY_UI_PROPERTIES),$@)
2404
2405$(call declare-1p-target,$(INSTALLED_RECOVERY_BUILD_PROP_TARGET),build)
2406$(call declare-license-deps,$(INSTALLED_RECOVERY_BUILD_PROP_TARGET),\
2407    $(INSTALLED_BUILD_PROP_TARGET) $(INSTALLED_VENDOR_BUILD_PROP_TARGET) $(INSTALLED_ODM_BUILD_PROP_TARGET) \
2408    $(INSTALLED_PRODUCT_BUILD_PROP_TARGET) $(INSTALLED_SYSTEM_EXT_BUILD_PROP_TARGET))
2409
2410# Only install boot/etc/build.prop to recovery image on recovery_as_boot.
2411# On device with dedicated recovery partition, the file should come from the boot
2412# ramdisk.
2413ifeq (true,$(BOARD_USES_RECOVERY_AS_BOOT))
2414INSTALLED_RECOVERY_RAMDISK_BUILD_PROP_TARGET := $(TARGET_RECOVERY_ROOT_OUT)/$(RAMDISK_BUILD_PROP_REL_PATH)
2415$(INSTALLED_RECOVERY_RAMDISK_BUILD_PROP_TARGET): $(INSTALLED_RAMDISK_BUILD_PROP_TARGET)
2416	$(copy-file-to-target)
2417
2418$(call declare-1p-target,$(INSTALLED_RECOVERY_RAMDISK_BUILD_PROP_TARGET),build)
2419$(call declare-license-deps,$(INSTALLED_RECOVERY_RAMDISK_BUILD_PROP_TARGET),$(INSTALLED_RAMDISK_BUILD_PROP_TARGET))
2420endif
2421
2422INTERNAL_RECOVERYIMAGE_ARGS := --ramdisk $(recovery_ramdisk)
2423
2424ifneq (truetrue,$(strip $(BUILDING_VENDOR_BOOT_IMAGE))$(strip $(BOARD_USES_RECOVERY_AS_BOOT)))
2425INTERNAL_RECOVERYIMAGE_ARGS += $(addprefix --second ,$(INSTALLED_2NDBOOTLOADER_TARGET))
2426# Assumes this has already been stripped
2427ifneq (true,$(BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE))
2428ifdef INTERNAL_KERNEL_CMDLINE
2429  INTERNAL_RECOVERYIMAGE_ARGS += --cmdline "$(INTERNAL_KERNEL_CMDLINE)"
2430endif # INTERNAL_KERNEL_CMDLINE != ""
2431endif # BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE != true
2432ifdef BOARD_KERNEL_BASE
2433  INTERNAL_RECOVERYIMAGE_ARGS += --base $(BOARD_KERNEL_BASE)
2434endif
2435ifdef BOARD_KERNEL_PAGESIZE
2436  INTERNAL_RECOVERYIMAGE_ARGS += --pagesize $(BOARD_KERNEL_PAGESIZE)
2437endif
2438ifdef BOARD_INCLUDE_RECOVERY_DTBO
2439ifdef BOARD_PREBUILT_RECOVERY_DTBOIMAGE
2440  INTERNAL_RECOVERYIMAGE_ARGS += --recovery_dtbo $(BOARD_PREBUILT_RECOVERY_DTBOIMAGE)
2441else
2442  INTERNAL_RECOVERYIMAGE_ARGS += --recovery_dtbo $(BOARD_PREBUILT_DTBOIMAGE)
2443endif
2444endif # BOARD_INCLUDE_RECOVERY_DTBO
2445ifdef BOARD_INCLUDE_RECOVERY_ACPIO
2446  INTERNAL_RECOVERYIMAGE_ARGS += --recovery_acpio $(BOARD_RECOVERY_ACPIO)
2447endif
2448ifdef BOARD_INCLUDE_DTB_IN_BOOTIMG
2449  INTERNAL_RECOVERYIMAGE_ARGS += --dtb $(INSTALLED_DTBIMAGE_TARGET)
2450endif
2451endif # (BUILDING_VENDOR_BOOT_IMAGE and BOARD_USES_RECOVERY_AS_BOOT)
2452ifndef BOARD_RECOVERY_MKBOOTIMG_ARGS
2453  BOARD_RECOVERY_MKBOOTIMG_ARGS := $(BOARD_MKBOOTIMG_ARGS)
2454endif
2455
2456$(INTERNAL_RECOVERY_RAMDISK_FILES_TIMESTAMP): $(MKBOOTFS) $(COMPRESSION_COMMAND_DEPS) \
2457	    $(INTERNAL_ROOT_FILES) \
2458	    $(INSTALLED_RAMDISK_TARGET) \
2459	    $(INTERNAL_RECOVERYIMAGE_FILES) \
2460	    $(recovery_sepolicy) \
2461	    $(INSTALLED_2NDBOOTLOADER_TARGET) \
2462	    $(INSTALLED_RECOVERY_BUILD_PROP_TARGET) \
2463	    $(INSTALLED_RECOVERY_RAMDISK_BUILD_PROP_TARGET) \
2464	    $(recovery_resource_deps) \
2465	    $(recovery_fstab)
2466	# Making recovery image
2467	mkdir -p $(TARGET_RECOVERY_OUT)
2468	mkdir -p $(TARGET_RECOVERY_ROOT_OUT)/sdcard $(TARGET_RECOVERY_ROOT_OUT)/tmp
2469	# Copying baseline ramdisk...
2470	# Use rsync because "cp -Rf" fails to overwrite broken symlinks on Mac.
2471	rsync -a --exclude=sdcard $(IGNORE_RECOVERY_SEPOLICY) $(IGNORE_CACHE_LINK) $(TARGET_ROOT_OUT) $(TARGET_RECOVERY_OUT)
2472	# Modifying ramdisk contents...
2473	ln -sf /system/bin/init $(TARGET_RECOVERY_ROOT_OUT)/init
2474	# Removes $(TARGET_RECOVERY_ROOT_OUT)/init*.rc EXCEPT init.recovery*.rc.
2475	find $(TARGET_RECOVERY_ROOT_OUT) -maxdepth 1 -name 'init*.rc' -type f -not -name "init.recovery.*.rc" | xargs rm -f
2476	cp $(TARGET_ROOT_OUT)/init.recovery.*.rc $(TARGET_RECOVERY_ROOT_OUT)/ 2> /dev/null || true # Ignore error when the src file doesn't exist.
2477	mkdir -p $(TARGET_RECOVERY_ROOT_OUT)/res
2478	rm -rf $(TARGET_RECOVERY_ROOT_OUT)/res/*
2479	cp -rf $(recovery_resources_common)/* $(TARGET_RECOVERY_ROOT_OUT)/res
2480	$(foreach recovery_text_file,$(generated_recovery_text_files), \
2481	  cp -rf $(recovery_text_file) $(TARGET_RECOVERY_ROOT_OUT)/res/images/ &&) true
2482	cp -f $(recovery_font) $(TARGET_RECOVERY_ROOT_OUT)/res/images/font.png
2483	$(foreach item,$(TARGET_PRIVATE_RES_DIRS), \
2484	  cp -rf $(item) $(TARGET_RECOVERY_ROOT_OUT)/$(newline))
2485	$(foreach item,$(recovery_fstab), \
2486	  cp -f $(item) $(TARGET_RECOVERY_ROOT_OUT)/system/etc/recovery.fstab)
2487	$(if $(strip $(recovery_wipe)), \
2488	  cp -f $(recovery_wipe) $(TARGET_RECOVERY_ROOT_OUT)/system/etc/recovery.wipe)
2489	ln -sf prop.default $(TARGET_RECOVERY_ROOT_OUT)/default.prop
2490	$(BOARD_RECOVERY_IMAGE_PREPARE)
2491	$(hide) touch $@
2492
2493$(recovery_ramdisk): $(INTERNAL_RECOVERY_RAMDISK_FILES_TIMESTAMP)
2494	$(MKBOOTFS) -d $(TARGET_OUT) $(TARGET_RECOVERY_ROOT_OUT) | $(COMPRESSION_COMMAND) > $(recovery_ramdisk)
2495
2496# $(1): output file
2497# $(2): optional kernel file
2498define build-recoveryimage-target
2499  $(if $(filter true,$(PRODUCT_SUPPORTS_VBOOT)), \
2500    $(MKBOOTIMG) $(if $(strip $(2)),--kernel $(strip $(2))) $(INTERNAL_RECOVERYIMAGE_ARGS) \
2501                 $(INTERNAL_MKBOOTIMG_VERSION_ARGS) $(BOARD_RECOVERY_MKBOOTIMG_ARGS) \
2502                 --output $(1).unsigned, \
2503    $(MKBOOTIMG) $(if $(strip $(2)),--kernel $(strip $(2))) $(INTERNAL_RECOVERYIMAGE_ARGS) \
2504                 $(INTERNAL_MKBOOTIMG_VERSION_ARGS) \
2505                 $(BOARD_RECOVERY_MKBOOTIMG_ARGS) --output $(1))
2506  $(if $(filter true,$(PRODUCT_SUPPORTS_VBOOT)), \
2507    $(VBOOT_SIGNER) $(FUTILITY) $(1).unsigned $(PRODUCT_VBOOT_SIGNING_KEY).vbpubk $(PRODUCT_VBOOT_SIGNING_KEY).vbprivk $(PRODUCT_VBOOT_SIGNING_SUBKEY).vbprivk $(1).keyblock $(1))
2508  $(if $(filter true,$(BOARD_USES_RECOVERY_AS_BOOT)), \
2509    $(call assert-max-image-size,$(1),$(call get-hash-image-max-size,$(call get-bootimage-partition-size,$(1),boot))), \
2510    $(call assert-max-image-size,$(1),$(call get-hash-image-max-size,$(BOARD_RECOVERYIMAGE_PARTITION_SIZE))))
2511  $(if $(filter true,$(BOARD_AVB_ENABLE)), \
2512    $(if $(filter true,$(BOARD_USES_RECOVERY_AS_BOOT)), \
2513      $(AVBTOOL) add_hash_footer --image $(1) $(call get-partition-size-argument,$(call get-bootimage-partition-size,$(1),boot)) --partition_name boot $(INTERNAL_AVB_BOOT_SIGNING_ARGS) $(BOARD_AVB_BOOT_ADD_HASH_FOOTER_ARGS),\
2514      $(AVBTOOL) add_hash_footer --image $(1) $(call get-partition-size-argument,$(BOARD_RECOVERYIMAGE_PARTITION_SIZE)) --partition_name recovery $(INTERNAL_AVB_RECOVERY_SIGNING_ARGS) $(BOARD_AVB_RECOVERY_ADD_HASH_FOOTER_ARGS)))
2515endef
2516
2517recoveryimage-deps := $(MKBOOTIMG) $(recovery_ramdisk) $(recovery_kernel)
2518ifeq (true,$(PRODUCT_SUPPORTS_VBOOT))
2519  recoveryimage-deps += $(VBOOT_SIGNER)
2520endif
2521ifeq (true,$(BOARD_AVB_ENABLE))
2522  recoveryimage-deps += $(AVBTOOL) $(BOARD_AVB_BOOT_KEY_PATH)
2523endif
2524ifdef BOARD_INCLUDE_RECOVERY_DTBO
2525  ifdef BOARD_PREBUILT_RECOVERY_DTBOIMAGE
2526    recoveryimage-deps += $(BOARD_PREBUILT_RECOVERY_DTBOIMAGE)
2527  else
2528    recoveryimage-deps += $(BOARD_PREBUILT_DTBOIMAGE)
2529  endif
2530endif
2531ifdef BOARD_INCLUDE_RECOVERY_ACPIO
2532  recoveryimage-deps += $(BOARD_RECOVERY_ACPIO)
2533endif
2534ifdef BOARD_INCLUDE_DTB_IN_BOOTIMG
2535  recoveryimage-deps += $(INSTALLED_DTBIMAGE_TARGET)
2536endif
2537
2538ifeq ($(BOARD_USES_RECOVERY_AS_BOOT),true)
2539$(foreach b,$(INSTALLED_BOOTIMAGE_TARGET), $(eval $(call add-dependency,$(b),$(call bootimage-to-kernel,$(b)))))
2540$(INSTALLED_BOOTIMAGE_TARGET): $(recoveryimage-deps)
2541	$(call pretty,"Target boot image from recovery: $@")
2542	$(call build-recoveryimage-target, $@, $(PRODUCT_OUT)/$(subst .img,,$(subst boot,kernel,$(notdir $@))))
2543
2544$(call declare-container-license-metadata,$(INSTALLED_BOOTIMAGE_TARGET),SPDX-license-identifier-GPL-2.0-only SPDX-license-identifier-Apache-2.0,restricted notice,$(BUILD_SYSTEM)/LINUX_KERNEL_COPYING build/soong/licenses/LICENSE,"Boot Image",bool)
2545$(call declare-container-license-deps,$(INSTALLED_BOOTIMAGE_TARGET),$(recoveryimage-deps),$(PRODUCT_OUT)/:/)
2546
2547UNMOUNTED_NOTICE_VENDOR_DEPS+= $(INSTALLED_BOOTIMAGE_TARGET)
2548endif # BOARD_USES_RECOVERY_AS_BOOT
2549
2550$(INSTALLED_RECOVERYIMAGE_TARGET): $(recoveryimage-deps)
2551	$(call build-recoveryimage-target, $@, \
2552	  $(if $(filter true, $(BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE)),, $(recovery_kernel)))
2553
2554ifdef RECOVERY_RESOURCE_ZIP
2555$(RECOVERY_RESOURCE_ZIP): $(INSTALLED_RECOVERYIMAGE_TARGET) | $(ZIPTIME)
2556	$(hide) mkdir -p $(dir $@)
2557	$(hide) find $(TARGET_RECOVERY_ROOT_OUT)/res -type f | sort | zip -0qrjX $@ -@
2558	$(remove-timestamps-from-package)
2559endif
2560
2561
2562$(call declare-1p-container,$(INSTALLED_RECOVERYIMAGE_TARGET),)
2563$(call declare-container-license-deps,$(INSTALLED_RECOVERYIMAGE_TARGET),$(recoveryimage-deps),$(PRODUCT_OUT)/:/)
2564
2565UNMOUNTED_NOTICE_VENDOR_DEPS+= $(INSTALLED_RECOVERYIMAGE_TARGET)
2566
2567.PHONY: recoveryimage-nodeps
2568recoveryimage-nodeps:
2569	@echo "make $@: ignoring dependencies"
2570	$(call build-recoveryimage-target, $(INSTALLED_RECOVERYIMAGE_TARGET), \
2571	  $(if $(filter true, $(BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE)),, $(recovery_kernel)))
2572
2573else # BUILDING_RECOVERY_IMAGE
2574RECOVERY_RESOURCE_ZIP :=
2575endif # BUILDING_RECOVERY_IMAGE
2576
2577.PHONY: recoveryimage
2578recoveryimage: $(INSTALLED_RECOVERYIMAGE_TARGET) $(RECOVERY_RESOURCE_ZIP)
2579
2580ifneq ($(BOARD_NAND_PAGE_SIZE),)
2581$(error MTD device is no longer supported and thus BOARD_NAND_PAGE_SIZE is deprecated.)
2582endif
2583
2584ifneq ($(BOARD_NAND_SPARE_SIZE),)
2585$(error MTD device is no longer supported and thus BOARD_NAND_SPARE_SIZE is deprecated.)
2586endif
2587
2588
2589# -----------------------------------------------------------------
2590# Build debug ramdisk and debug boot image.
2591INSTALLED_FILES_OUTSIDE_IMAGES := $(filter-out $(TARGET_DEBUG_RAMDISK_OUT)/%, $(INSTALLED_FILES_OUTSIDE_IMAGES))
2592ifneq ($(BUILDING_DEBUG_BOOT_IMAGE)$(BUILDING_DEBUG_VENDOR_BOOT_IMAGE),)
2593
2594INTERNAL_DEBUG_RAMDISK_FILES := $(filter $(TARGET_DEBUG_RAMDISK_OUT)/%, \
2595    $(ALL_DEFAULT_INSTALLED_MODULES))
2596
2597# Directories to be picked into the debug ramdisk.
2598# As these directories are all merged into one single cpio archive, the order
2599# matters. If there are multiple files with the same pathname, then the last one
2600# wins.
2601#
2602# ramdisk-debug.img will merge the content from either ramdisk.img or
2603# ramdisk-recovery.img, depending on whether BOARD_USES_RECOVERY_AS_BOOT
2604# is set or not.
2605ifeq ($(BOARD_USES_RECOVERY_AS_BOOT),true)
2606  INTERNAL_DEBUG_RAMDISK_SRC_DIRS := $(TARGET_RECOVERY_ROOT_OUT)
2607  INTERNAL_DEBUG_RAMDISK_SRC_RAMDISK_TARGET := $(recovery_ramdisk)
2608else  # BOARD_USES_RECOVERY_AS_BOOT == true
2609  INTERNAL_DEBUG_RAMDISK_SRC_DIRS := $(TARGET_RAMDISK_OUT)
2610  INTERNAL_DEBUG_RAMDISK_SRC_RAMDISK_TARGET := $(INSTALLED_RAMDISK_TARGET)
2611endif # BOARD_USES_RECOVERY_AS_BOOT != true
2612
2613INTERNAL_DEBUG_RAMDISK_SRC_DIRS += $(TARGET_DEBUG_RAMDISK_OUT)
2614INTERNAL_DEBUG_RAMDISK_SRC_DEPS := $(INTERNAL_DEBUG_RAMDISK_SRC_RAMDISK_TARGET) $(INTERNAL_DEBUG_RAMDISK_FILES)
2615
2616# INSTALLED_FILES_FILE_DEBUG_RAMDISK would ensure TARGET_DEBUG_RAMDISK_OUT is created.
2617INSTALLED_FILES_FILE_DEBUG_RAMDISK := $(PRODUCT_OUT)/installed-files-ramdisk-debug.txt
2618INSTALLED_FILES_JSON_DEBUG_RAMDISK := $(INSTALLED_FILES_FILE_DEBUG_RAMDISK:.txt=.json)
2619$(INSTALLED_FILES_FILE_DEBUG_RAMDISK): .KATI_IMPLICIT_OUTPUTS := $(INSTALLED_FILES_JSON_DEBUG_RAMDISK)
2620$(INSTALLED_FILES_FILE_DEBUG_RAMDISK): $(INTERNAL_DEBUG_RAMDISK_SRC_DEPS)
2621$(INSTALLED_FILES_FILE_DEBUG_RAMDISK): $(FILESLIST) $(FILESLIST_UTIL)
2622	@echo "Installed file list: $@"
2623	$(hide) rm -f $@
2624	$(hide) mkdir -p $(dir $@) $(TARGET_DEBUG_RAMDISK_OUT)
2625	touch $(TARGET_DEBUG_RAMDISK_OUT)/force_debuggable
2626	$(FILESLIST) $(INTERNAL_DEBUG_RAMDISK_SRC_DIRS) > $(@:.txt=.json)
2627	$(FILESLIST_UTIL) -c $(@:.txt=.json) > $@
2628
2629$(eval $(call declare-0p-target,$(INSTALLED_FILES_FILE_DEBUG_RAMDISK)))
2630$(eval $(call declare-0p-target,$(INSTALLED_FILES_JSON_DEBUG_RAMDISK)))
2631
2632ifdef BUILDING_DEBUG_BOOT_IMAGE
2633
2634# -----------------------------------------------------------------
2635# the debug ramdisk, which is the original ramdisk plus additional
2636# files: force_debuggable, adb_debug.prop and userdebug sepolicy.
2637# When /force_debuggable is present, /init will load userdebug sepolicy
2638# and property files to allow adb root, if the device is unlocked.
2639INSTALLED_DEBUG_RAMDISK_TARGET := $(PRODUCT_OUT)/ramdisk-debug.img
2640
2641$(INSTALLED_DEBUG_RAMDISK_TARGET): $(INSTALLED_FILES_FILE_DEBUG_RAMDISK)
2642$(INSTALLED_DEBUG_RAMDISK_TARGET): $(MKBOOTFS) | $(COMPRESSION_COMMAND_DEPS)
2643	@echo "Target debug ramdisk: $@"
2644	$(hide) rm -f $@
2645	$(hide) mkdir -p $(dir $@)
2646	$(MKBOOTFS) -d $(TARGET_OUT) $(INTERNAL_DEBUG_RAMDISK_SRC_DIRS) | $(COMPRESSION_COMMAND) > $@
2647
2648$(call declare-1p-container,$(INSTALLED_DEBUG_RAMDISK_TARGET),)
2649$(call declare-container-license-deps,$(INSTALLED_DEBUG_RAMDISK_TARGET),$(INSTALLED_RAMDISK_TARGET),$(PRODUCT_OUT)/:/)
2650
2651UNMOUNTED_NOTICE_VENDOR_DEPS+= $(INSTALLED_DEBUG_RAMDISK_TARGET)
2652
2653.PHONY: ramdisk_debug-nodeps
2654ramdisk_debug-nodeps: $(MKBOOTFS) | $(COMPRESSION_COMMAND_DEPS)
2655	@echo "make $@: ignoring dependencies"
2656	$(hide) rm -f $(INSTALLED_DEBUG_RAMDISK_TARGET)
2657	$(hide) mkdir -p $(dir $(INSTALLED_DEBUG_RAMDISK_TARGET)) $(INTERNAL_DEBUG_RAMDISK_SRC_DIRS)
2658	$(MKBOOTFS) -d $(TARGET_OUT) $(INTERNAL_DEBUG_RAMDISK_SRC_DIRS) | $(COMPRESSION_COMMAND) > $(INSTALLED_DEBUG_RAMDISK_TARGET)
2659
2660# -----------------------------------------------------------------
2661# the boot-debug.img, which is the kernel plus ramdisk-debug.img
2662#
2663# Note: it's intentional to skip signing for boot-debug.img, because it
2664# can only be used if the device is unlocked with verification error.
2665ifneq ($(strip $(BOARD_KERNEL_BINARIES)),)
2666  INSTALLED_DEBUG_BOOTIMAGE_TARGET := $(foreach k,$(subst kernel,boot-debug,$(BOARD_KERNEL_BINARIES)), \
2667         $(PRODUCT_OUT)/$(k).img)
2668else
2669  INSTALLED_DEBUG_BOOTIMAGE_TARGET := $(PRODUCT_OUT)/boot-debug.img
2670endif
2671
2672# Replace ramdisk.img in $(MKBOOTIMG) ARGS with ramdisk-debug.img to build boot-debug.img
2673$(INSTALLED_DEBUG_BOOTIMAGE_TARGET): $(INSTALLED_DEBUG_RAMDISK_TARGET)
2674ifeq ($(BOARD_USES_RECOVERY_AS_BOOT),true)
2675  INTERNAL_DEBUG_BOOTIMAGE_ARGS := $(subst $(INTERNAL_DEBUG_RAMDISK_SRC_RAMDISK_TARGET),$(INSTALLED_DEBUG_RAMDISK_TARGET),$(INTERNAL_RECOVERYIMAGE_ARGS))
2676else
2677  INTERNAL_DEBUG_BOOTIMAGE_ARGS := $(subst $(INTERNAL_DEBUG_RAMDISK_SRC_RAMDISK_TARGET),$(INSTALLED_DEBUG_RAMDISK_TARGET),$(INTERNAL_BOOTIMAGE_ARGS))
2678endif
2679
2680# If boot.img is chained but boot-debug.img is not signed, libavb in bootloader
2681# will fail to find valid AVB metadata from the end of /boot, thus stop booting.
2682# Using a test key to sign boot-debug.img to continue booting with the mismatched
2683# public key, if the device is unlocked.
2684ifneq ($(BOARD_AVB_BOOT_KEY_PATH),)
2685$(INSTALLED_DEBUG_BOOTIMAGE_TARGET): $(AVBTOOL) $(BOARD_AVB_BOOT_TEST_KEY_PATH)
2686endif
2687
2688BOARD_AVB_BOOT_TEST_KEY_PATH := external/avb/test/data/testkey_rsa2048.pem
2689INTERNAL_AVB_BOOT_TEST_SIGNING_ARGS := --algorithm SHA256_RSA2048 --key $(BOARD_AVB_BOOT_TEST_KEY_PATH)
2690# $(1): the bootimage to sign
2691# $(2): boot image variant (boot, boot-debug, boot-test-harness)
2692define test-key-sign-bootimage
2693$(call assert-max-image-size,$(1),$(call get-hash-image-max-size,$(call get-bootimage-partition-size,$(1),$(2))))
2694$(AVBTOOL) add_hash_footer \
2695  --image $(1) \
2696  $(call get-partition-size-argument,$(call get-bootimage-partition-size,$(1),$(2)))\
2697  --partition_name boot $(INTERNAL_AVB_BOOT_TEST_SIGNING_ARGS) \
2698  $(BOARD_AVB_BOOT_ADD_HASH_FOOTER_ARGS)
2699$(call assert-max-image-size,$(1),$(call get-bootimage-partition-size,$(1),$(2)))
2700endef
2701
2702# $(1): output file
2703define build-debug-bootimage-target
2704  $(MKBOOTIMG) --kernel $(PRODUCT_OUT)/$(subst .img,,$(subst boot-debug,kernel,$(notdir $(1)))) \
2705    $(INTERNAL_DEBUG_BOOTIMAGE_ARGS) $(INTERNAL_MKBOOTIMG_VERSION_ARGS) \
2706    $(BOARD_MKBOOTIMG_ARGS) --output $1
2707  $(if $(BOARD_AVB_BOOT_KEY_PATH),$(call test-key-sign-bootimage,$1,boot-debug))
2708endef
2709
2710# Depends on original boot.img and ramdisk-debug.img, to build the new boot-debug.img
2711$(INSTALLED_DEBUG_BOOTIMAGE_TARGET): $(MKBOOTIMG) $(INSTALLED_BOOTIMAGE_TARGET) $(AVBTOOL)
2712	$(call pretty,"Target boot debug image: $@")
2713	$(call build-debug-bootimage-target, $@)
2714
2715$(call declare-container-license-metadata,$(INSTALLED_DEBUG_BOOTIMAGE_TARGET),SPDX-license-identifier-GPL-2.0-only SPDX-license-identifier-Apache-2.0,restricted notice,$(BUILD_SYSTEM)/LINUX_KERNEL_COPYING build/soong/licenses/LICENSE,"Boot Image",boot)
2716$(call declare-container-license-deps,$(INSTALLED_DEBUG_BOOTIMAGE_TARGET),$(INSTALLED_BOOTIMAGE_TARGET),$(PRODUCT_OUT)/:/)
2717
2718UNMOUNTED_NOTICE_VENDOR_DEPS+= $(INSTALLED_DEBUG_BOOTIMAGE_TARGET)
2719
2720.PHONY: bootimage_debug-nodeps
2721bootimage_debug-nodeps: $(MKBOOTIMG) $(AVBTOOL)
2722	echo "make $@: ignoring dependencies"
2723	$(foreach b,$(INSTALLED_DEBUG_BOOTIMAGE_TARGET),$(call build-debug-bootimage-target,$b))
2724
2725endif # BUILDING_DEBUG_BOOT_IMAGE
2726
2727# -----------------------------------------------------------------
2728# vendor debug ramdisk
2729# Combines vendor ramdisk files and debug ramdisk files to build the vendor debug ramdisk.
2730INSTALLED_FILES_OUTSIDE_IMAGES := $(filter-out $(TARGET_VENDOR_DEBUG_RAMDISK_OUT)/%, $(INSTALLED_FILES_OUTSIDE_IMAGES))
2731ifdef BUILDING_DEBUG_VENDOR_BOOT_IMAGE
2732
2733INTERNAL_VENDOR_DEBUG_RAMDISK_FILES := $(filter $(TARGET_VENDOR_DEBUG_RAMDISK_OUT)/%, \
2734    $(ALL_DEFAULT_INSTALLED_MODULES))
2735
2736# The debug vendor ramdisk combines vendor ramdisk and debug ramdisk.
2737INTERNAL_DEBUG_VENDOR_RAMDISK_SRC_DIRS := $(TARGET_VENDOR_RAMDISK_OUT)
2738INTERNAL_DEBUG_VENDOR_RAMDISK_SRC_DEPS := $(INTERNAL_VENDOR_RAMDISK_TARGET)
2739
2740# Exclude recovery files in the default vendor ramdisk if including a standalone
2741# recovery ramdisk in vendor_boot.
2742ifeq (true,$(BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT))
2743  ifneq (true,$(BOARD_INCLUDE_RECOVERY_RAMDISK_IN_VENDOR_BOOT))
2744    INTERNAL_DEBUG_VENDOR_RAMDISK_SRC_DIRS += $(TARGET_RECOVERY_ROOT_OUT)
2745    INTERNAL_DEBUG_VENDOR_RAMDISK_SRC_DEPS += $(INTERNAL_RECOVERY_RAMDISK_FILES_TIMESTAMP)
2746  endif # BOARD_INCLUDE_RECOVERY_RAMDISK_IN_VENDOR_BOOT != true
2747endif # BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT == true
2748
2749INTERNAL_DEBUG_VENDOR_RAMDISK_SRC_DIRS += $(TARGET_VENDOR_DEBUG_RAMDISK_OUT) $(TARGET_DEBUG_RAMDISK_OUT)
2750INTERNAL_DEBUG_VENDOR_RAMDISK_SRC_DEPS += $(INTERNAL_VENDOR_DEBUG_RAMDISK_FILES) $(INSTALLED_FILES_FILE_DEBUG_RAMDISK)
2751
2752# INSTALLED_FILES_FILE_VENDOR_DEBUG_RAMDISK would ensure TARGET_VENDOR_DEBUG_RAMDISK_OUT is created.
2753INSTALLED_FILES_FILE_VENDOR_DEBUG_RAMDISK := $(PRODUCT_OUT)/installed-files-vendor-ramdisk-debug.txt
2754INSTALLED_FILES_JSON_VENDOR_DEBUG_RAMDISK := $(INSTALLED_FILES_FILE_VENDOR_DEBUG_RAMDISK:.txt=.json)
2755$(INSTALLED_FILES_FILE_VENDOR_DEBUG_RAMDISK): .KATI_IMPLICIT_OUTPUTS := $(INSTALLED_FILES_JSON_VENDOR_DEBUG_RAMDISK)
2756$(INSTALLED_FILES_FILE_VENDOR_DEBUG_RAMDISK): $(INTERNAL_DEBUG_VENDOR_RAMDISK_SRC_DEPS)
2757$(INSTALLED_FILES_FILE_VENDOR_DEBUG_RAMDISK): $(FILESLIST) $(FILESLIST_UTIL)
2758	@echo "Installed file list: $@"
2759	$(hide) rm -f $@
2760	$(hide) mkdir -p $(dir $@) $(TARGET_VENDOR_DEBUG_RAMDISK_OUT)
2761	$(FILESLIST) $(INTERNAL_DEBUG_VENDOR_RAMDISK_SRC_DIRS) > $(@:.txt=.json)
2762	$(FILESLIST_UTIL) -c $(@:.txt=.json) > $@
2763
2764$(call declare-0p-target,$(INSTALLED_FILES_FILE_VENDOR_DEBUG_RAMDISK))
2765$(call declare-0p-target,$(INSTALLED_FILES_JSON_VENDOR_DEBUG_RAMDISK))
2766
2767INTERNAL_VENDOR_DEBUG_RAMDISK_TARGET := $(call intermediates-dir-for,PACKAGING,vendor_boot-debug)/vendor_ramdisk-debug.cpio$(RAMDISK_EXT)
2768
2769$(INTERNAL_VENDOR_DEBUG_RAMDISK_TARGET): $(INSTALLED_FILES_FILE_VENDOR_DEBUG_RAMDISK)
2770$(INTERNAL_VENDOR_DEBUG_RAMDISK_TARGET): $(MKBOOTFS) | $(COMPRESSION_COMMAND_DEPS)
2771	$(hide) rm -f $@
2772	$(hide) mkdir -p $(dir $@)
2773	$(MKBOOTFS) -d $(TARGET_OUT) $(INTERNAL_DEBUG_VENDOR_RAMDISK_SRC_DIRS) | $(COMPRESSION_COMMAND) > $@
2774
2775INSTALLED_VENDOR_DEBUG_RAMDISK_TARGET := $(PRODUCT_OUT)/vendor_ramdisk-debug.img
2776$(INSTALLED_VENDOR_DEBUG_RAMDISK_TARGET): $(INTERNAL_VENDOR_DEBUG_RAMDISK_TARGET)
2777	@echo "Target debug vendor ramdisk: $@"
2778	$(copy-file-to-target)
2779
2780$(call declare-1p-container,$(INSTALLED_VENDOR_DEBUG_RAMDISK_TARGET),)
2781$(call declare-container-license-deps,$(INSTALLED_VENDOR_DEBUG_RAMDISK_TARGET),$(INTERNAL_VENDOR_DEBUG_RAMDISK_TARGET),$(PRODUCT_OUT)/:/)
2782
2783VENDOR_NOTICE_DEPS += $(INSTALLED_VENDOR_DEBUG_RAMDISK_TARGET)
2784
2785# -----------------------------------------------------------------
2786# vendor_boot-debug.img.
2787INSTALLED_VENDOR_DEBUG_BOOTIMAGE_TARGET := $(PRODUCT_OUT)/vendor_boot-debug.img
2788
2789# The util to sign vendor_boot-debug.img with a test key.
2790BOARD_AVB_VENDOR_BOOT_TEST_KEY_PATH := external/avb/test/data/testkey_rsa2048.pem
2791INTERNAL_AVB_VENDOR_BOOT_TEST_SIGNING_ARGS := --algorithm SHA256_RSA2048 --key $(BOARD_AVB_VENDOR_BOOT_TEST_KEY_PATH)
2792# $(1): the vendor bootimage to sign
2793define test-key-sign-vendor-bootimage
2794$(call assert-max-image-size,$(1),$(call get-hash-image-max-size,$(BOARD_VENDOR_BOOTIMAGE_PARTITION_SIZE)))
2795$(AVBTOOL) add_hash_footer \
2796  --image $(1) \
2797  $(call get-partition-size-argument,$(BOARD_VENDOR_BOOTIMAGE_PARTITION_SIZE)) \
2798  --partition_name vendor_boot $(INTERNAL_AVB_VENDOR_BOOT_TEST_SIGNING_ARGS) \
2799  $(BOARD_AVB_VENDOR_BOOT_ADD_HASH_FOOTER_ARGS)
2800$(call assert-max-image-size,$(1),$(BOARD_VENDOR_BOOTIMAGE_PARTITION_SIZE))
2801endef
2802
2803ifneq ($(BOARD_AVB_VENDOR_BOOT_KEY_PATH),)
2804$(INSTALLED_VENDOR_DEBUG_BOOTIMAGE_TARGET): $(AVBTOOL) $(BOARD_AVB_VENDOR_BOOT_TEST_KEY_PATH)
2805endif
2806
2807# Depends on vendor_boot.img and vendor-ramdisk-debug.cpio.gz to build the new vendor_boot-debug.img
2808$(INSTALLED_VENDOR_DEBUG_BOOTIMAGE_TARGET): $(MKBOOTIMG) $(INSTALLED_VENDOR_BOOTIMAGE_TARGET) $(INTERNAL_VENDOR_DEBUG_RAMDISK_TARGET)
2809$(INSTALLED_VENDOR_DEBUG_BOOTIMAGE_TARGET): $(INTERNAL_VENDOR_RAMDISK_FRAGMENT_TARGETS)
2810	$(call pretty,"Target vendor_boot debug image: $@")
2811	$(MKBOOTIMG) $(INTERNAL_VENDOR_BOOTIMAGE_ARGS) $(BOARD_MKBOOTIMG_ARGS) --vendor_ramdisk $(INTERNAL_VENDOR_DEBUG_RAMDISK_TARGET) $(INTERNAL_VENDOR_RAMDISK_FRAGMENT_ARGS) --vendor_boot $@
2812	$(call assert-max-image-size,$@,$(BOARD_VENDOR_BOOTIMAGE_PARTITION_SIZE))
2813	$(if $(BOARD_AVB_VENDOR_BOOT_KEY_PATH),$(call test-key-sign-vendor-bootimage,$@))
2814
2815$(call declare-1p-container,$(INSTALLED_VENDOR_DEBUG_BOOTIMAGE_TARGET),)
2816$(call declare-container-license-deps,$(INSTALLED_VENDOR_DEBUG_BOOTIMAGE_TARGET),$(INTERNAL_VENDOR_DEBUG_RAMDISK_TARGET),$(PRODUCT_OUT)/:/)
2817
2818VENDOR_NOTICE_DEPS += $(INSTALLED_VENDOR_DEBUG_BOOTIMAGE_TARGET)
2819
2820endif # BUILDING_DEBUG_VENDOR_BOOT_IMAGE
2821
2822# Appends a few test harness specific properties into the adb_debug.prop.
2823ADDITIONAL_TEST_HARNESS_PROPERTIES := ro.audio.silent=1
2824ADDITIONAL_TEST_HARNESS_PROPERTIES += ro.test_harness=1
2825
2826INTERNAL_DEBUG_RAMDISK_ADB_DEBUG_PROP_TARGET := $(strip $(filter $(TARGET_DEBUG_RAMDISK_OUT)/adb_debug.prop,$(INTERNAL_DEBUG_RAMDISK_FILES)))
2827INTERNAL_TEST_HARNESS_RAMDISK_ADB_DEBUG_PROP_TARGET := $(TARGET_TEST_HARNESS_RAMDISK_OUT)/adb_debug.prop
2828$(INTERNAL_TEST_HARNESS_RAMDISK_ADB_DEBUG_PROP_TARGET): $(INTERNAL_DEBUG_RAMDISK_ADB_DEBUG_PROP_TARGET)
2829	$(hide) rm -f $@
2830	$(hide) mkdir -p $(dir $@)
2831ifdef INTERNAL_DEBUG_RAMDISK_ADB_DEBUG_PROP_TARGET
2832	$(hide) cp $(INTERNAL_DEBUG_RAMDISK_ADB_DEBUG_PROP_TARGET) $@
2833endif
2834	$(hide) echo "" >> $@
2835	$(hide) echo "#" >> $@
2836	$(hide) echo "# ADDITIONAL TEST HARNESS PROPERTIES" >> $@
2837	$(hide) echo "#" >> $@
2838	$(hide) $(foreach line,$(ADDITIONAL_TEST_HARNESS_PROPERTIES), \
2839	          echo "$(line)" >> $@;)
2840
2841$(call declare-1p-target,$(INTERNAL_TEST_HARNESS_RAMDISK_ADB_DEBUG_PROP_TARGET))
2842
2843INSTALLED_FILES_OUTSIDE_IMAGES := $(filter-out $(TARGET_TEST_HARNESS_RAMDISK_OUT)/%, $(INSTALLED_FILES_OUTSIDE_IMAGES))
2844INTERNAL_TEST_HARNESS_RAMDISK_FILES := $(filter $(TARGET_TEST_HARNESS_RAMDISK_OUT)/%, \
2845    $(INTERNAL_TEST_HARNESS_RAMDISK_ADB_DEBUG_PROP_TARGET) \
2846    $(ALL_DEFAULT_INSTALLED_MODULES))
2847
2848# The order is important here. The test harness ramdisk staging directory has to
2849# come last so that it can override the adb_debug.prop in the debug ramdisk
2850# staging directory.
2851INTERNAL_TEST_HARNESS_RAMDISK_SRC_DIRS := $(INTERNAL_DEBUG_RAMDISK_SRC_DIRS) $(TARGET_TEST_HARNESS_RAMDISK_OUT)
2852INTERNAL_TEST_HARNESS_RAMDISK_SRC_DEPS := $(INSTALLED_FILES_FILE_DEBUG_RAMDISK) $(INTERNAL_TEST_HARNESS_RAMDISK_FILES)
2853
2854ifdef BUILDING_DEBUG_BOOT_IMAGE
2855
2856# -----------------------------------------------------------------
2857# The test harness ramdisk, which is based off debug_ramdisk, plus a
2858# few additional test-harness-specific properties in adb_debug.prop.
2859INSTALLED_TEST_HARNESS_RAMDISK_TARGET := $(PRODUCT_OUT)/ramdisk-test-harness.img
2860
2861$(INSTALLED_TEST_HARNESS_RAMDISK_TARGET): $(INTERNAL_TEST_HARNESS_RAMDISK_SRC_DEPS)
2862$(INSTALLED_TEST_HARNESS_RAMDISK_TARGET): $(MKBOOTFS) | $(COMPRESSION_COMMAND_DEPS)
2863	@echo "Target test harness ramdisk: $@"
2864	$(hide) rm -f $@
2865	$(hide) mkdir -p $(dir $@)
2866	$(MKBOOTFS) -d $(TARGET_OUT) $(INTERNAL_TEST_HARNESS_RAMDISK_SRC_DIRS) | $(COMPRESSION_COMMAND) > $@
2867
2868$(call declare-1p-container,$(INSTALLED_TEST_HARNESS_RAMDISK_TARGET),)
2869$(call declare-container-license-deps,$(INSTALLED_TEST_HARNESS_RAMDISK_TARGET),$(INTERNAL_TEST_HARNESS_RAMDISK_SRC_DEPS),$(PRODUCT_OUT)/:/)
2870
2871UNMOUNTED_NOTICE_VENDOR_DEPS+= $(INSTALLED_TEST_HARNESS_RAMDISK_TARGET)
2872
2873.PHONY: ramdisk_test_harness-nodeps
2874ramdisk_test_harness-nodeps: $(MKBOOTFS) | $(COMPRESSION_COMMAND_DEPS)
2875	@echo "make $@: ignoring dependencies"
2876	$(hide) rm -f $(INSTALLED_TEST_HARNESS_RAMDISK_TARGET)
2877	$(hide) mkdir -p $(dir $(INSTALLED_TEST_HARNESS_RAMDISK_TARGET)) $(INTERNAL_TEST_HARNESS_RAMDISK_SRC_DIRS)
2878	$(MKBOOTFS) -d $(TARGET_OUT) $(INTERNAL_TEST_HARNESS_RAMDISK_SRC_DIRS) | $(COMPRESSION_COMMAND) > $(INSTALLED_TEST_HARNESS_RAMDISK_TARGET)
2879
2880# -----------------------------------------------------------------
2881# the boot-test-harness.img, which is the kernel plus ramdisk-test-harness.img
2882#
2883# Note: it's intentional to skip signing for boot-test-harness.img, because it
2884# can only be used if the device is unlocked with verification error.
2885ifneq ($(strip $(BOARD_KERNEL_BINARIES)),)
2886  INSTALLED_TEST_HARNESS_BOOTIMAGE_TARGET := $(foreach k,$(subst kernel,boot-test-harness,$(BOARD_KERNEL_BINARIES)), \
2887    $(PRODUCT_OUT)/$(k).img)
2888else
2889  INSTALLED_TEST_HARNESS_BOOTIMAGE_TARGET := $(PRODUCT_OUT)/boot-test-harness.img
2890endif
2891
2892# Replace ramdisk-debug.img in $(MKBOOTIMG) ARGS with ramdisk-test-harness.img to build boot-test-harness.img
2893$(INSTALLED_TEST_HARNESS_BOOTIMAGE_TARGET): $(INSTALLED_TEST_HARNESS_RAMDISK_TARGET)
2894INTERNAL_TEST_HARNESS_BOOTIMAGE_ARGS := $(subst $(INSTALLED_DEBUG_RAMDISK_TARGET),$(INSTALLED_TEST_HARNESS_RAMDISK_TARGET),$(INTERNAL_DEBUG_BOOTIMAGE_ARGS))
2895
2896# If boot.img is chained but boot-test-harness.img is not signed, libavb in bootloader
2897# will fail to find valid AVB metadata from the end of /boot, thus stop booting.
2898# Using a test key to sign boot-test-harness.img to continue booting with the mismatched
2899# public key, if the device is unlocked.
2900ifneq ($(BOARD_AVB_BOOT_KEY_PATH),)
2901$(INSTALLED_TEST_HARNESS_BOOTIMAGE_TARGET): $(AVBTOOL) $(BOARD_AVB_BOOT_TEST_KEY_PATH)
2902endif
2903
2904# $(1): output file
2905define build-boot-test-harness-target
2906  $(MKBOOTIMG) --kernel $(PRODUCT_OUT)/$(subst .img,,$(subst boot-test-harness,kernel,$(notdir $(1)))) \
2907    $(INTERNAL_TEST_HARNESS_BOOTIMAGE_ARGS) $(INTERNAL_MKBOOTIMG_VERSION_ARGS) \
2908    $(BOARD_MKBOOTIMG_ARGS) --output $@
2909  $(if $(BOARD_AVB_BOOT_KEY_PATH),$(call test-key-sign-bootimage,$@,boot-test-harness))
2910endef
2911
2912# Build the new boot-test-harness.img, based on boot-debug.img and ramdisk-test-harness.img.
2913$(INSTALLED_TEST_HARNESS_BOOTIMAGE_TARGET): $(MKBOOTIMG) $(INSTALLED_DEBUG_BOOTIMAGE_TARGET) $(AVBTOOL)
2914	$(call pretty,"Target boot test harness image: $@")
2915	$(call build-boot-test-harness-target,$@)
2916
2917$(call declare-1p-container,$(INSTALLED_TEST_HARNESS_BOOTIMAGE_TARGET),)
2918$(call declare-container-license-deps,$(INSTALLED_TEST_HARNESS_BOOTIMAGE_TARGET),$(INSTALLED_DEBUG_BOOTIMAGE_TARGET),$(PRODUCT_OUT)/:/)
2919
2920UNMOUNTED_NOTICE_VENDOR_DEPS+= $(INSTALLED_TEST_HARNESS_BOOTIMAGE_TARGET)
2921
2922.PHONY: bootimage_test_harness-nodeps
2923bootimage_test_harness-nodeps: $(MKBOOTIMG) $(AVBTOOL)
2924	echo "make $@: ignoring dependencies"
2925	$(foreach b,$(INSTALLED_TEST_HARNESS_BOOTIMAGE_TARGET),$(call build-boot-test-harness-target,$b))
2926
2927endif # BUILDING_DEBUG_BOOT_IMAGE
2928
2929# -----------------------------------------------------------------
2930# vendor test harness ramdisk, which is a vendor ramdisk combined with
2931# a test harness ramdisk.
2932ifdef BUILDING_DEBUG_VENDOR_BOOT_IMAGE
2933
2934INTERNAL_VENDOR_TEST_HARNESS_RAMDISK_TARGET := $(call intermediates-dir-for,PACKAGING,vendor_boot-test-harness)/vendor_ramdisk-test-harness.cpio$(RAMDISK_EXT)
2935
2936# The order is important here. The test harness ramdisk staging directory has to
2937# come last so that it can override the adb_debug.prop in the debug ramdisk
2938# staging directory.
2939INTERNAL_TEST_HARNESS_VENDOR_RAMDISK_SRC_DIRS := $(INTERNAL_DEBUG_VENDOR_RAMDISK_SRC_DIRS) $(TARGET_TEST_HARNESS_RAMDISK_OUT)
2940INTERNAL_TEST_HARNESS_VENDOR_RAMDISK_SRC_DEPS := $(INSTALLED_FILES_FILE_VENDOR_DEBUG_RAMDISK) $(INTERNAL_TEST_HARNESS_RAMDISK_FILES)
2941
2942$(INTERNAL_VENDOR_TEST_HARNESS_RAMDISK_TARGET): $(INTERNAL_TEST_HARNESS_VENDOR_RAMDISK_SRC_DEPS)
2943$(INTERNAL_VENDOR_TEST_HARNESS_RAMDISK_TARGET): $(MKBOOTFS) | $(COMPRESSION_COMMAND_DEPS)
2944	$(hide) rm -f $@
2945	$(hide) mkdir -p $(dir $@)
2946	$(MKBOOTFS) -d $(TARGET_OUT) $(INTERNAL_TEST_HARNESS_VENDOR_RAMDISK_SRC_DIRS) | $(COMPRESSION_COMMAND) > $@
2947
2948INSTALLED_VENDOR_TEST_HARNESS_RAMDISK_TARGET := $(PRODUCT_OUT)/vendor_ramdisk-test-harness.img
2949$(INSTALLED_VENDOR_TEST_HARNESS_RAMDISK_TARGET): $(INTERNAL_VENDOR_TEST_HARNESS_RAMDISK_TARGET)
2950	@echo "Target test harness vendor ramdisk: $@"
2951	$(copy-file-to-target)
2952
2953$(call declare-1p-container,$(INSTALLED_VENDOR_TEST_HARNESS_RAMDISK_TARGET),)
2954$(call declare-container-license-deps,$(INSTALLED_VENDOR_TEST_HARNESS_RAMDISK_TARGET),$(INTERNAL_VENDOR_TEST_HARNESS_RAMDISK_TARGET),$(PRODUCT_OUT)/:/)
2955
2956VENDOR_NOTICE_DEPS += $(INSTALLED_VENDOR_TEST_HARNESS_RAMDISK_TARGET)
2957
2958# -----------------------------------------------------------------
2959# vendor_boot-test-harness.img.
2960INSTALLED_VENDOR_TEST_HARNESS_BOOTIMAGE_TARGET := $(PRODUCT_OUT)/vendor_boot-test-harness.img
2961
2962ifneq ($(BOARD_AVB_VENDOR_BOOT_KEY_PATH),)
2963$(INSTALLED_VENDOR_TEST_HARNESS_BOOTIMAGE_TARGET): $(AVBTOOL) $(BOARD_AVB_VENDOR_BOOT_TEST_KEY_PATH)
2964endif
2965
2966# Depends on vendor_boot.img and vendor_ramdisk-test-harness.cpio$(RAMDISK_EXT) to build the new vendor_boot-test-harness.img
2967$(INSTALLED_VENDOR_TEST_HARNESS_BOOTIMAGE_TARGET): $(MKBOOTIMG) $(INSTALLED_VENDOR_BOOTIMAGE_TARGET)
2968$(INSTALLED_VENDOR_TEST_HARNESS_BOOTIMAGE_TARGET): $(INTERNAL_VENDOR_TEST_HARNESS_RAMDISK_TARGET)
2969$(INSTALLED_VENDOR_TEST_HARNESS_BOOTIMAGE_TARGET): $(INTERNAL_VENDOR_RAMDISK_FRAGMENT_TARGETS)
2970	$(call pretty,"Target vendor_boot test harness image: $@")
2971	$(MKBOOTIMG) $(INTERNAL_VENDOR_BOOTIMAGE_ARGS) $(BOARD_MKBOOTIMG_ARGS) --vendor_ramdisk $(INTERNAL_VENDOR_TEST_HARNESS_RAMDISK_TARGET) $(INTERNAL_VENDOR_RAMDISK_FRAGMENT_ARGS) --vendor_boot $@
2972	$(call assert-max-image-size,$@,$(BOARD_VENDOR_BOOTIMAGE_PARTITION_SIZE))
2973	$(if $(BOARD_AVB_VENDOR_BOOT_KEY_PATH),$(call test-key-sign-vendor-bootimage,$@))
2974
2975$(call declare-1p-container,$(INSTALLED_VENDOR_TEST_HARNESS_BOOTIMAGE_TARGET),)
2976$(call declare-container-license-deps,$(INSTALLED_VENDOR_TEST_HARNESS_BOOTIMAGE_TARGET),$(INTERNAL_VENDOR_TEST_HARNESS_RAMDISK_TARGET),$(PRODUCT_OUT)/:/)
2977
2978VENDOR_NOTICE_DEPS += $(INSTALLED_VENDOR_TEST_HARNESS_BOOTIMAGE_TARGET)
2979
2980endif # BUILDING_DEBUG_VENDOR_BOOT_IMAGE
2981
2982endif # BUILDING_DEBUG_BOOT_IMAGE || BUILDING_DEBUG_VENDOR_BOOT_IMAGE
2983
2984PARTITION_COMPAT_SYMLINKS :=
2985# Creates a compatibility symlink between two partitions, e.g. /system/vendor to /vendor
2986# $1: from location (e.g $(TARGET_OUT)/vendor)
2987# $2: destination location (e.g. /vendor)
2988# $3: partition image name (e.g. vendor.img)
2989define create-partition-compat-symlink
2990$(eval \
2991$1:
2992	@echo Symlink $(patsubst $(PRODUCT_OUT)/%,%,$1) to $2
2993	mkdir -p $(dir $1)
2994	if [ -d $1 ] && [ ! -h $1 ]; then \
2995	  echo 'Non-symlink $1 detected!' 1>&2; \
2996	  echo 'You cannot install files to $1 while building a separate $3!' 1>&2; \
2997	  exit 1; \
2998	fi
2999	ln -sfn $2 $1
3000$1: .KATI_SYMLINK_OUTPUTS := $1
3001)
3002$(eval PARTITION_COMPAT_SYMLINKS += $1)
3003$1
3004endef
3005
3006
3007# FSVerity metadata generation
3008# Generate fsverity metadata files (.fsv_meta) and build manifest
3009# (<partition>/etc/security/fsverity/BuildManifest<suffix>.apk) BEFORE filtering systemimage,
3010# vendorimage, odmimage, productimage files below.
3011ifeq ($(PRODUCT_FSVERITY_GENERATE_METADATA),true)
3012
3013fsverity-metadata-targets-patterns := \
3014  $(TARGET_OUT)/framework/% \
3015  $(TARGET_OUT)/etc/boot-image.prof \
3016  $(TARGET_OUT)/etc/dirty-image-objects \
3017  $(TARGET_OUT)/etc/preloaded-classes \
3018  $(TARGET_OUT)/etc/classpaths/%.pb \
3019
3020ifdef BUILDING_SYSTEM_EXT_IMAGE
3021fsverity-metadata-targets-patterns += $(TARGET_OUT_SYSTEM_EXT)/framework/%
3022endif
3023
3024# Generate fsv_meta
3025fsverity-metadata-targets := $(sort $(filter \
3026  $(fsverity-metadata-targets-patterns), \
3027  $(ALL_DEFAULT_INSTALLED_MODULES)))
3028
3029define fsverity-generate-metadata
3030$(call declare-0p-target,$(1).fsv_meta)
3031
3032$(1).fsv_meta: PRIVATE_SRC := $(1)
3033$(1).fsv_meta: PRIVATE_FSVERITY := $(HOST_OUT_EXECUTABLES)/fsverity
3034$(1).fsv_meta: $(HOST_OUT_EXECUTABLES)/fsverity_metadata_generator $(HOST_OUT_EXECUTABLES)/fsverity $(1)
3035	$$< --fsverity-path $$(PRIVATE_FSVERITY) --signature none \
3036	    --hash-alg sha256 --output $$@ $$(PRIVATE_SRC)
3037endef
3038
3039$(foreach f,$(fsverity-metadata-targets),$(eval $(call fsverity-generate-metadata,$(f))))
3040ALL_DEFAULT_INSTALLED_MODULES += $(addsuffix .fsv_meta,$(fsverity-metadata-targets))
3041
3042FSVERITY_APK_KEY_PATH := $(DEFAULT_SYSTEM_DEV_CERTIFICATE)
3043FSVERITY_APK_MANIFEST_TEMPLATE_PATH := system/security/fsverity/AndroidManifest.xml
3044
3045# Generate and install BuildManifest<suffix>.apk for the given partition
3046# $(1): path of the output APK
3047# $(2): partition name
3048define fsverity-generate-and-install-manifest-apk
3049fsverity-metadata-targets-$(2) := $(filter $(PRODUCT_OUT)/$(2)/%,\
3050      $(fsverity-metadata-targets))
3051$(1): PRIVATE_FSVERITY := $(HOST_OUT_EXECUTABLES)/fsverity
3052$(1): PRIVATE_AAPT2 := $(HOST_OUT_EXECUTABLES)/aapt2
3053$(1): PRIVATE_MIN_SDK_VERSION := $(DEFAULT_APP_TARGET_SDK)
3054$(1): PRIVATE_VERSION_CODE := $(PLATFORM_SDK_VERSION)
3055$(1): PRIVATE_VERSION_NAME := $(APPS_DEFAULT_VERSION_NAME)
3056$(1): PRIVATE_APKSIGNER := $(HOST_OUT_EXECUTABLES)/apksigner
3057$(1): PRIVATE_MANIFEST := $(FSVERITY_APK_MANIFEST_TEMPLATE_PATH)
3058$(1): PRIVATE_FRAMEWORK_RES := $(call intermediates-dir-for,APPS,framework-res,,COMMON)/package-export.apk
3059$(1): PRIVATE_KEY := $(FSVERITY_APK_KEY_PATH)
3060$(1): PRIVATE_INPUTS := $$(fsverity-metadata-targets-$(2))
3061$(1): PRIVATE_ASSETS := $(call intermediates-dir-for,ETC,build_manifest-$(2))/assets
3062$(1): $(HOST_OUT_EXECUTABLES)/fsverity_manifest_generator \
3063    $(HOST_OUT_EXECUTABLES)/fsverity $(HOST_OUT_EXECUTABLES)/aapt2 \
3064    $(HOST_OUT_EXECUTABLES)/apksigner $(FSVERITY_APK_MANIFEST_TEMPLATE_PATH) \
3065    $(FSVERITY_APK_KEY_PATH).x509.pem $(FSVERITY_APK_KEY_PATH).pk8 \
3066    $(call intermediates-dir-for,APPS,framework-res,,COMMON)/package-export.apk \
3067    $$(fsverity-metadata-targets-$(2))
3068	rm -rf $$(PRIVATE_ASSETS)
3069	mkdir -p $$(PRIVATE_ASSETS)
3070	$$< --fsverity-path $$(PRIVATE_FSVERITY) \
3071	    --base-dir $$(PRODUCT_OUT) \
3072	    --output $$(PRIVATE_ASSETS)/build_manifest.pb \
3073	    $$(PRIVATE_INPUTS)
3074	$$(PRIVATE_AAPT2) link -o $$@ \
3075	    -A $$(PRIVATE_ASSETS) \
3076	    -I $$(PRIVATE_FRAMEWORK_RES) \
3077	    --min-sdk-version $$(PRIVATE_MIN_SDK_VERSION) \
3078	    --version-code $$(PRIVATE_VERSION_CODE) \
3079	    --version-name $$(PRIVATE_VERSION_NAME) \
3080	    --manifest $$(PRIVATE_MANIFEST) \
3081            --rename-manifest-package com.android.security.fsverity_metadata.$(2)
3082	$$(PRIVATE_APKSIGNER) sign --in $$@ \
3083	    --cert $$(PRIVATE_KEY).x509.pem \
3084	    --key $$(PRIVATE_KEY).pk8
3085
3086$(1).idsig: $(1)
3087
3088ALL_DEFAULT_INSTALLED_MODULES += $(1) $(1).idsig
3089
3090endef  # fsverity-generate-and-install-manifest-apk
3091
3092$(eval $(call fsverity-generate-and-install-manifest-apk, \
3093  $(TARGET_OUT)/etc/security/fsverity/BuildManifest.apk,system))
3094ALL_FSVERITY_BUILD_MANIFEST_APK += $(TARGET_OUT)/etc/security/fsverity/BuildManifest.apk $(TARGET_OUT)/etc/security/fsverity/BuildManifest.apk.idsig
3095ifdef BUILDING_SYSTEM_EXT_IMAGE
3096  $(eval $(call fsverity-generate-and-install-manifest-apk, \
3097    $(TARGET_OUT_SYSTEM_EXT)/etc/security/fsverity/BuildManifestSystemExt.apk,system_ext))
3098  ALL_FSVERITY_BUILD_MANIFEST_APK += $(TARGET_OUT_SYSTEM_EXT)/etc/security/fsverity/BuildManifestSystemExt.apk $(TARGET_OUT_SYSTEM_EXT)/etc/security/fsverity/BuildManifestSystemExt.apk.idsig
3099endif
3100
3101endif  # PRODUCT_FSVERITY_GENERATE_METADATA
3102
3103
3104# -----------------------------------------------------------------
3105# system image
3106
3107INSTALLED_FILES_OUTSIDE_IMAGES := $(filter-out $(TARGET_OUT)/%, $(INSTALLED_FILES_OUTSIDE_IMAGES))
3108INTERNAL_SYSTEMIMAGE_FILES := $(sort $(filter $(TARGET_OUT)/%, \
3109    $(ALL_DEFAULT_INSTALLED_MODULES)))
3110
3111# Create symlink /system/vendor to /vendor if necessary.
3112ifdef BOARD_USES_VENDORIMAGE
3113  _vendor_symlink := $(call create-partition-compat-symlink,$(TARGET_OUT)/vendor,/vendor,vendor.img)
3114  INTERNAL_SYSTEMIMAGE_FILES += $(_vendor_symlink)
3115  ALL_DEFAULT_INSTALLED_MODULES += $(_vendor_symlink)
3116endif
3117
3118# Create symlink /system/product to /product if necessary.
3119ifdef BOARD_USES_PRODUCTIMAGE
3120  _product_symlink := $(call create-partition-compat-symlink,$(TARGET_OUT)/product,/product,product.img)
3121  INTERNAL_SYSTEMIMAGE_FILES += $(_product_symlink)
3122  ALL_DEFAULT_INSTALLED_MODULES += $(_product_symlink)
3123endif
3124
3125# Create symlink /system/system_ext to /system_ext if necessary.
3126ifdef BOARD_USES_SYSTEM_EXTIMAGE
3127  _systemext_symlink := $(call create-partition-compat-symlink,$(TARGET_OUT)/system_ext,/system_ext,system_ext.img)
3128  INTERNAL_SYSTEMIMAGE_FILES += $(_systemext_symlink)
3129  ALL_DEFAULT_INSTALLED_MODULES += $(_systemext_symlink)
3130endif
3131
3132# -----------------------------------------------------------------
3133# system_dlkm partition image
3134
3135# Create symlinks for system_dlkm on devices with a system_dlkm partition:
3136# /system/lib/modules -> /system_dlkm/lib/modules
3137#
3138# On devices with a system_dlkm partition,
3139# - /system/lib/modules is a symlink to a directory that stores system DLKMs.
3140# - The system_dlkm partition is mounted at /system_dlkm at runtime.
3141ifdef BOARD_USES_SYSTEM_DLKMIMAGE
3142  _system_dlkm_lib_modules_symlink := $(call create-partition-compat-symlink,$(TARGET_OUT)/lib/modules,/system_dlkm/lib/modules,system_dlkm.img)
3143  INTERNAL_SYSTEMIMAGE_FILES += $(_system_dlkm_lib_modules_symlink)
3144  ALL_DEFAULT_INSTALLED_MODULES += $(_system_dlkm_lib_modules_symlink)
3145endif
3146
3147FULL_SYSTEMIMAGE_DEPS := $(INTERNAL_SYSTEMIMAGE_FILES) $(INTERNAL_USERIMAGES_DEPS)
3148
3149# ASAN libraries in the system image - add dependency.
3150ASAN_IN_SYSTEM_INSTALLED := $(TARGET_OUT)/asan.tar.bz2
3151ifneq (,$(filter address, $(SANITIZE_TARGET)))
3152  ifeq (true,$(SANITIZE_TARGET_SYSTEM))
3153    FULL_SYSTEMIMAGE_DEPS += $(ASAN_IN_SYSTEM_INSTALLED)
3154  endif
3155endif
3156
3157FULL_SYSTEMIMAGE_DEPS += $(INTERNAL_ROOT_FILES) $(INSTALLED_FILES_FILE_ROOT)
3158
3159# -----------------------------------------------------------------
3160ifdef BUILDING_SYSTEM_IMAGE
3161
3162# Install system linker configuration
3163# Collect all available stub libraries installed in system and install with predefined linker configuration
3164# Also append LLNDK libraries in the APEX as required libs
3165SYSTEM_LINKER_CONFIG := $(TARGET_OUT)/etc/linker.config.pb
3166SYSTEM_LINKER_CONFIG_SOURCE := $(call intermediates-dir-for,ETC,system_linker_config)/system_linker_config
3167$(SYSTEM_LINKER_CONFIG): PRIVATE_SYSTEM_LINKER_CONFIG_SOURCE := $(SYSTEM_LINKER_CONFIG_SOURCE)
3168$(SYSTEM_LINKER_CONFIG): $(INTERNAL_SYSTEMIMAGE_FILES) $(SYSTEM_LINKER_CONFIG_SOURCE) | conv_linker_config
3169	@echo Creating linker config: $@
3170	@mkdir -p $(dir $@)
3171	@rm -f $@
3172	$(HOST_OUT_EXECUTABLES)/conv_linker_config systemprovide --source $(PRIVATE_SYSTEM_LINKER_CONFIG_SOURCE) \
3173		--output $@ --value "$(STUB_LIBRARIES)" --system "$(TARGET_OUT)"
3174	$(HOST_OUT_EXECUTABLES)/conv_linker_config append --source $@ --output $@ --key requireLibs \
3175		--value "$(foreach lib,$(LLNDK_MOVED_TO_APEX_LIBRARIES), $(lib).so)"
3176
3177$(call declare-1p-target,$(SYSTEM_LINKER_CONFIG),)
3178$(call declare-license-deps,$(SYSTEM_LINKER_CONFIG),$(INTERNAL_SYSTEMIMAGE_FILES) $(SYSTEM_LINKER_CONFIG_SOURCE))
3179
3180FULL_SYSTEMIMAGE_DEPS += $(SYSTEM_LINKER_CONFIG)
3181ALL_DEFAULT_INSTALLED_MODULES += $(SYSTEM_LINKER_CONFIG)
3182
3183# installed file list
3184# Depending on anything that $(BUILT_SYSTEMIMAGE) depends on.
3185# We put installed-files.txt ahead of image itself in the dependency graph
3186# so that we can get the size stat even if the build fails due to too large
3187# system image.
3188INSTALLED_FILES_FILE := $(PRODUCT_OUT)/installed-files.txt
3189INSTALLED_FILES_JSON := $(INSTALLED_FILES_FILE:.txt=.json)
3190$(INSTALLED_FILES_FILE): .KATI_IMPLICIT_OUTPUTS := $(INSTALLED_FILES_JSON)
3191$(INSTALLED_FILES_FILE): $(FULL_SYSTEMIMAGE_DEPS) $(FILESLIST) $(FILESLIST_UTIL)
3192	@echo Installed file list: $@
3193	mkdir -p $(dir $@)
3194	rm -f $@
3195	$(FILESLIST) $(TARGET_OUT) > $(@:.txt=.json)
3196	$(FILESLIST_UTIL) -c $(@:.txt=.json) > $@
3197
3198$(eval $(call declare-0p-target,$(INSTALLED_FILES_FILE)))
3199$(eval $(call declare-0p-target,$(INSTALLED_FILES_JSON)))
3200
3201.PHONY: installed-file-list
3202installed-file-list: $(INSTALLED_FILES_FILE)
3203
3204systemimage_intermediates := \
3205    $(call intermediates-dir-for,PACKAGING,systemimage)
3206BUILT_SYSTEMIMAGE := $(systemimage_intermediates)/system.img
3207
3208# $(1): output file
3209define build-systemimage-target
3210  @echo "Target system fs image: $(1)"
3211  @mkdir -p $(dir $(1)) $(systemimage_intermediates) && rm -rf $(systemimage_intermediates)/system_image_info.txt
3212  $(call generate-image-prop-dictionary, $(systemimage_intermediates)/system_image_info.txt,system, \
3213      skip_fsck=true)
3214  PATH=$(INTERNAL_USERIMAGES_BINARY_PATHS):$$PATH \
3215      $(BUILD_IMAGE) \
3216          $(TARGET_OUT) $(systemimage_intermediates)/system_image_info.txt $(1) $(TARGET_OUT) \
3217          || ( mkdir -p $${DIST_DIR}; \
3218               cp $(INSTALLED_FILES_FILE) $${DIST_DIR}/installed-files-rescued.txt; \
3219               exit 1 )
3220endef
3221
3222ifeq ($(BOARD_AVB_ENABLE),true)
3223$(BUILT_SYSTEMIMAGE): $(BOARD_AVB_SYSTEM_KEY_PATH)
3224endif
3225$(BUILT_SYSTEMIMAGE): $(FULL_SYSTEMIMAGE_DEPS) $(INSTALLED_FILES_FILE)
3226	$(call build-systemimage-target,$@)
3227
3228$(call declare-1p-container,$(BUILT_SYSTEMIMAGE),system/extras)
3229$(call declare-container-license-deps,$(BUILT_SYSTEMIMAGE),$(FULL_SYSTEMIMAGE_DEPS),$(PRODUCT_OUT)/:/)
3230
3231INSTALLED_SYSTEMIMAGE_TARGET := $(PRODUCT_OUT)/system.img
3232SYSTEMIMAGE_SOURCE_DIR := $(TARGET_OUT)
3233
3234# INSTALLED_SYSTEMIMAGE_TARGET used to be named INSTALLED_SYSTEMIMAGE. Create an alias for backward
3235# compatibility, in case device-specific Makefiles still refer to the old name.
3236INSTALLED_SYSTEMIMAGE := $(INSTALLED_SYSTEMIMAGE_TARGET)
3237
3238# The system partition needs room for the recovery image as well.  We
3239# now store the recovery image as a binary patch using the boot image
3240# as the source (since they are very similar).  Generate the patch so
3241# we can see how big it's going to be, and include that in the system
3242# image size check calculation.
3243ifneq ($(INSTALLED_BOOTIMAGE_TARGET),)
3244ifneq ($(INSTALLED_RECOVERYIMAGE_TARGET),)
3245ifneq ($(BOARD_USES_FULL_RECOVERY_IMAGE),true)
3246ifneq (,$(filter true,$(BOARD_INCLUDE_RECOVERY_DTBO) $(BOARD_INCLUDE_RECOVERY_ACPIO)))
3247diff_tool := $(HOST_OUT_EXECUTABLES)/bsdiff
3248else
3249diff_tool := $(HOST_OUT_EXECUTABLES)/imgdiff
3250endif
3251intermediates := $(call intermediates-dir-for,PACKAGING,recovery_patch)
3252RECOVERY_FROM_BOOT_PATCH := $(intermediates)/recovery_from_boot.p
3253$(RECOVERY_FROM_BOOT_PATCH): PRIVATE_DIFF_TOOL := $(diff_tool)
3254$(RECOVERY_FROM_BOOT_PATCH): \
3255	    $(INSTALLED_RECOVERYIMAGE_TARGET) \
3256	    $(firstword $(INSTALLED_BOOTIMAGE_TARGET)) \
3257	    $(diff_tool)
3258	@echo "Construct recovery from boot"
3259	mkdir -p $(dir $@)
3260	$(PRIVATE_DIFF_TOOL) $(firstword $(INSTALLED_BOOTIMAGE_TARGET)) $(INSTALLED_RECOVERYIMAGE_TARGET) $@
3261else # $(BOARD_USES_FULL_RECOVERY_IMAGE) == true
3262RECOVERY_FROM_BOOT_PATCH := $(INSTALLED_RECOVERYIMAGE_TARGET)
3263endif # BOARD_USES_FULL_RECOVERY_IMAGE
3264endif # INSTALLED_RECOVERYIMAGE_TARGET
3265endif # INSTALLED_BOOTIMAGE_TARGET
3266
3267$(INSTALLED_SYSTEMIMAGE_TARGET): $(BUILT_SYSTEMIMAGE)
3268	@echo "Install system fs image: $@"
3269	$(copy-file-to-target)
3270	$(hide) $(call assert-max-image-size,$@,$(BOARD_SYSTEMIMAGE_PARTITION_SIZE))
3271
3272$(call declare-1p-container,$(INSTALLED_SYSTEMIMAGE_TARGET),)
3273$(call declare-container-license-deps,$(INSTALLED_SYSTEMIMAGE_TARGET),$(BUILT_SYSTEMIMAGE),$(BUILT_SYSTEMIMAGE):/)
3274
3275systemimage: $(INSTALLED_SYSTEMIMAGE_TARGET)
3276
3277SYSTEM_NOTICE_DEPS += $(INSTALLED_SYSTEMIMAGE_TARGET)
3278
3279.PHONY: systemimage-nodeps snod
3280systemimage-nodeps snod: $(filter-out systemimage-nodeps snod,$(MAKECMDGOALS)) \
3281	            | $(INTERNAL_USERIMAGES_DEPS)
3282	@echo "make $@: ignoring dependencies"
3283	$(call build-systemimage-target,$(INSTALLED_SYSTEMIMAGE_TARGET))
3284	$(hide) $(call assert-max-image-size,$(INSTALLED_SYSTEMIMAGE_TARGET),$(BOARD_SYSTEMIMAGE_PARTITION_SIZE))
3285ifeq (true,$(WITH_DEXPREOPT))
3286	$(warning Warning: with dexpreopt enabled, you may need a full rebuild.)
3287endif
3288
3289endif # BUILDING_SYSTEM_IMAGE
3290
3291.PHONY: sync syncsys
3292sync syncsys: $(INTERNAL_SYSTEMIMAGE_FILES)
3293
3294# -----------------------------------------------------------------
3295# Old PDK fusion targets
3296.PHONY: platform
3297platform:
3298	echo "Warning: 'platform' is obsolete"
3299
3300.PHONY: platform-java
3301platform-java:
3302	echo "Warning: 'platform-java' is obsolete"
3303
3304# -----------------------------------------------------------------
3305# data partition image
3306INSTALLED_FILES_OUTSIDE_IMAGES := $(filter-out $(TARGET_OUT_DATA)/%, $(INSTALLED_FILES_OUTSIDE_IMAGES))
3307INTERNAL_USERDATAIMAGE_FILES := \
3308    $(filter $(TARGET_OUT_DATA)/%,$(ALL_DEFAULT_INSTALLED_MODULES))
3309
3310ifdef BUILDING_USERDATA_IMAGE
3311userdataimage_intermediates := \
3312    $(call intermediates-dir-for,PACKAGING,userdata)
3313BUILT_USERDATAIMAGE_TARGET := $(PRODUCT_OUT)/userdata.img
3314
3315define build-userdataimage-target
3316  $(call pretty,"Target userdata fs image: $(INSTALLED_USERDATAIMAGE_TARGET)")
3317  @mkdir -p $(TARGET_OUT_DATA)
3318  @mkdir -p $(userdataimage_intermediates) && rm -rf $(userdataimage_intermediates)/userdata_image_info.txt
3319  $(call generate-image-prop-dictionary, $(userdataimage_intermediates)/userdata_image_info.txt,userdata,skip_fsck=true)
3320  PATH=$(INTERNAL_USERIMAGES_BINARY_PATHS):$$PATH \
3321      $(BUILD_IMAGE) \
3322          $(TARGET_OUT_DATA) $(userdataimage_intermediates)/userdata_image_info.txt \
3323          $(INSTALLED_USERDATAIMAGE_TARGET) $(TARGET_OUT)
3324  $(call assert-max-image-size,$(INSTALLED_USERDATAIMAGE_TARGET),$(BOARD_USERDATAIMAGE_PARTITION_SIZE))
3325endef
3326
3327# We just build this directly to the install location.
3328INSTALLED_USERDATAIMAGE_TARGET := $(BUILT_USERDATAIMAGE_TARGET)
3329INSTALLED_USERDATAIMAGE_TARGET_DEPS := \
3330    $(INTERNAL_USERIMAGES_DEPS) \
3331    $(INTERNAL_USERDATAIMAGE_FILES)
3332$(INSTALLED_USERDATAIMAGE_TARGET): $(INSTALLED_USERDATAIMAGE_TARGET_DEPS)
3333	$(build-userdataimage-target)
3334
3335$(call declare-1p-container,$(INSTALLED_USERDATAIMAGE_TARGET),)
3336$(call declare-container-license-deps,$(INSTALLED_USERDATAIMAGE_TARGET),$(INSTALLED_USERDATAIMAGE_TARGET_DEPS),$(PRODUCT_OUT)/:/)
3337
3338UNMOUNTED_NOTICE_VENDOR_DEPS+= $(INSTALLED_USERDATAIMAGE_TARGET)
3339
3340.PHONY: userdataimage-nodeps
3341userdataimage-nodeps: | $(INTERNAL_USERIMAGES_DEPS)
3342	$(build-userdataimage-target)
3343
3344endif # BUILDING_USERDATA_IMAGE
3345
3346# ASAN libraries in the system image - build rule.
3347ASAN_OUT_DIRS_FOR_SYSTEM_INSTALL := $(sort $(patsubst $(PRODUCT_OUT)/%,%,\
3348  $(TARGET_OUT_SHARED_LIBRARIES) \
3349  $(2ND_TARGET_OUT_SHARED_LIBRARIES) \
3350  $(TARGET_OUT_VENDOR_SHARED_LIBRARIES) \
3351  $(2ND_TARGET_OUT_VENDOR_SHARED_LIBRARIES)))
3352# Extra options: Enforce the system user for the files to avoid having to change ownership.
3353ASAN_SYSTEM_INSTALL_OPTIONS := --owner=1000 --group=1000
3354# Note: experimentally, it seems not worth it to try to get "best" compression. We don't save
3355#       enough space.
3356$(ASAN_IN_SYSTEM_INSTALLED): $(INSTALLED_USERDATAIMAGE_TARGET_DEPS)
3357	tar cfj $(ASAN_IN_SYSTEM_INSTALLED) $(ASAN_SYSTEM_INSTALL_OPTIONS) -C $(TARGET_OUT_DATA)/.. $(ASAN_OUT_DIRS_FOR_SYSTEM_INSTALL) >/dev/null
3358
3359# -----------------------------------------------------------------
3360# partition table image
3361ifdef BOARD_BPT_INPUT_FILES
3362
3363BUILT_BPTIMAGE_TARGET := $(PRODUCT_OUT)/partition-table.img
3364BUILT_BPTJSON_TARGET := $(PRODUCT_OUT)/partition-table.bpt
3365
3366INTERNAL_BVBTOOL_MAKE_TABLE_ARGS := \
3367	--output_gpt $(BUILT_BPTIMAGE_TARGET) \
3368	--output_json $(BUILT_BPTJSON_TARGET) \
3369	$(foreach file, $(BOARD_BPT_INPUT_FILES), --input $(file))
3370
3371ifdef BOARD_BPT_DISK_SIZE
3372INTERNAL_BVBTOOL_MAKE_TABLE_ARGS += --disk_size $(BOARD_BPT_DISK_SIZE)
3373endif
3374
3375define build-bptimage-target
3376  $(call pretty,"Target partition table image: $(INSTALLED_BPTIMAGE_TARGET)")
3377  $(hide) $(BPTTOOL) make_table $(INTERNAL_BVBTOOL_MAKE_TABLE_ARGS) $(BOARD_BPT_MAKE_TABLE_ARGS)
3378endef
3379
3380INSTALLED_BPTIMAGE_TARGET := $(BUILT_BPTIMAGE_TARGET)
3381$(BUILT_BPTJSON_TARGET): $(INSTALLED_BPTIMAGE_TARGET)
3382	$(hide) touch -c $(BUILT_BPTJSON_TARGET)
3383
3384$(INSTALLED_BPTIMAGE_TARGET): $(BPTTOOL) $(BOARD_BPT_INPUT_FILES)
3385	$(build-bptimage-target)
3386
3387$(call declare-1p-container,$(INSTALLED_BPTIMAGE_TARGET),)
3388$(call declare-container-license-deps,$(INSTALLED_BPTIMAGE_TARGET),$(BOARD_BPT_INPUT_FILES),$(PRODUCT_OUT)/:/)
3389
3390UNMOUNTED_NOTICE_VENDOR_DEPS+= $(INSTALLED_BPTIMAGE_TARGET)
3391
3392.PHONY: bptimage-nodeps
3393bptimage-nodeps:
3394	$(build-bptimage-target)
3395
3396endif # BOARD_BPT_INPUT_FILES
3397
3398# -----------------------------------------------------------------
3399# cache partition image
3400INSTALLED_FILES_OUTSIDE_IMAGES := $(filter-out $(TARGET_OUT_CACHE)/%, $(INSTALLED_FILES_OUTSIDE_IMAGES))
3401ifdef BUILDING_CACHE_IMAGE
3402INTERNAL_CACHEIMAGE_FILES := \
3403    $(filter $(TARGET_OUT_CACHE)/%,$(ALL_DEFAULT_INSTALLED_MODULES))
3404
3405cacheimage_intermediates := \
3406    $(call intermediates-dir-for,PACKAGING,cache)
3407BUILT_CACHEIMAGE_TARGET := $(PRODUCT_OUT)/cache.img
3408
3409define build-cacheimage-target
3410  $(call pretty,"Target cache fs image: $(INSTALLED_CACHEIMAGE_TARGET)")
3411  @mkdir -p $(TARGET_OUT_CACHE)
3412  @mkdir -p $(cacheimage_intermediates) && rm -rf $(cacheimage_intermediates)/cache_image_info.txt
3413  $(call generate-image-prop-dictionary, $(cacheimage_intermediates)/cache_image_info.txt,cache,skip_fsck=true)
3414  PATH=$(INTERNAL_USERIMAGES_BINARY_PATHS):$$PATH \
3415      $(BUILD_IMAGE) \
3416          $(TARGET_OUT_CACHE) $(cacheimage_intermediates)/cache_image_info.txt \
3417          $(INSTALLED_CACHEIMAGE_TARGET) $(TARGET_OUT)
3418  $(call assert-max-image-size,$(INSTALLED_CACHEIMAGE_TARGET),$(BOARD_CACHEIMAGE_PARTITION_SIZE))
3419endef
3420
3421# We just build this directly to the install location.
3422INSTALLED_CACHEIMAGE_TARGET := $(BUILT_CACHEIMAGE_TARGET)
3423$(INSTALLED_CACHEIMAGE_TARGET): $(INTERNAL_USERIMAGES_DEPS) $(INTERNAL_CACHEIMAGE_FILES)
3424	$(build-cacheimage-target)
3425
3426$(call declare-1p-container,$(INSTALLED_CACHEIMAGE_TARGET),)
3427$(call declare-container-license-deps,$(INSTALLED_CACHEIMAGE_TARGET),$(INTERNAL_USERIMAGES_DEPS) $(INTERNAL_CACHEIMAGE_FILES),$(PRODUCT_OUT)/:/)
3428
3429UNMOUNTED_NOTICE_VENDOR_DEPS+= $(INSTALLED_CACHEIMAGE_TARGET)
3430
3431.PHONY: cacheimage-nodeps
3432cacheimage-nodeps: | $(INTERNAL_USERIMAGES_DEPS)
3433	$(build-cacheimage-target)
3434
3435else # BUILDING_CACHE_IMAGE
3436# we need to ignore the broken cache link when doing the rsync
3437IGNORE_CACHE_LINK := --exclude=cache
3438endif # BUILDING_CACHE_IMAGE
3439
3440# -----------------------------------------------------------------
3441# system_other partition image
3442INSTALLED_FILES_OUTSIDE_IMAGES := $(filter-out $(TARGET_OUT_SYSTEM_OTHER)/%, $(INSTALLED_FILES_OUTSIDE_IMAGES))
3443ifdef BUILDING_SYSTEM_OTHER_IMAGE
3444ifeq ($(BOARD_USES_SYSTEM_OTHER_ODEX),true)
3445# Marker file to identify that odex files are installed
3446INSTALLED_SYSTEM_OTHER_ODEX_MARKER := $(TARGET_OUT_SYSTEM_OTHER)/system-other-odex-marker
3447ALL_DEFAULT_INSTALLED_MODULES += $(INSTALLED_SYSTEM_OTHER_ODEX_MARKER)
3448$(INSTALLED_SYSTEM_OTHER_ODEX_MARKER):
3449	$(hide) touch $@
3450
3451$(call declare-0p-target,$(INSTALLED_SYSTEM_OTHER_ODEX_MARKER))
3452endif
3453
3454INTERNAL_SYSTEMOTHERIMAGE_FILES := \
3455    $(filter $(TARGET_OUT_SYSTEM_OTHER)/%,\
3456      $(ALL_DEFAULT_INSTALLED_MODULES))
3457
3458# system_other dex files are installed as a side-effect of installing system image files
3459INTERNAL_SYSTEMOTHERIMAGE_FILES += $(INTERNAL_SYSTEMIMAGE_FILES)
3460
3461INSTALLED_FILES_FILE_SYSTEMOTHER := $(PRODUCT_OUT)/installed-files-system-other.txt
3462INSTALLED_FILES_JSON_SYSTEMOTHER := $(INSTALLED_FILES_FILE_SYSTEMOTHER:.txt=.json)
3463$(INSTALLED_FILES_FILE_SYSTEMOTHER): .KATI_IMPLICIT_OUTPUTS := $(INSTALLED_FILES_JSON_SYSTEMOTHER)
3464$(INSTALLED_FILES_FILE_SYSTEMOTHER) : $(INTERNAL_SYSTEMOTHERIMAGE_FILES) $(FILESLIST) $(FILESLIST_UTIL)
3465	@echo Installed file list: $@
3466	mkdir -p $(dir $@)
3467	rm -f $@
3468	$(FILESLIST) $(TARGET_OUT_SYSTEM_OTHER) > $(@:.txt=.json)
3469	$(FILESLIST_UTIL) -c $(@:.txt=.json) > $@
3470
3471$(eval $(call declare-0p-target,$(INSTALLED_FILES_FILE_SYSTEMOTHER)))
3472$(eval $(call declare-0p-target,$(INSTALLED_FILES_JSON_SYSTEMOTHER)))
3473
3474# Determines partition size for system_other.img.
3475ifeq ($(PRODUCT_RETROFIT_DYNAMIC_PARTITIONS),true)
3476ifneq ($(filter system,$(BOARD_SUPER_PARTITION_BLOCK_DEVICES)),)
3477INTERNAL_SYSTEM_OTHER_PARTITION_SIZE := $(BOARD_SUPER_PARTITION_SYSTEM_DEVICE_SIZE)
3478endif
3479endif
3480
3481ifndef INTERNAL_SYSTEM_OTHER_PARTITION_SIZE
3482INTERNAL_SYSTEM_OTHER_PARTITION_SIZE:= $(BOARD_SYSTEMIMAGE_PARTITION_SIZE)
3483endif
3484
3485systemotherimage_intermediates := \
3486    $(call intermediates-dir-for,PACKAGING,system_other)
3487BUILT_SYSTEMOTHERIMAGE_TARGET := $(PRODUCT_OUT)/system_other.img
3488
3489# Note that we assert the size is SYSTEMIMAGE_PARTITION_SIZE since this is the 'b' system image.
3490define build-systemotherimage-target
3491  $(call pretty,"Target system_other fs image: $(INSTALLED_SYSTEMOTHERIMAGE_TARGET)")
3492  @mkdir -p $(TARGET_OUT_SYSTEM_OTHER)
3493  @mkdir -p $(systemotherimage_intermediates) && rm -rf $(systemotherimage_intermediates)/system_other_image_info.txt
3494  $(call generate-image-prop-dictionary, $(systemotherimage_intermediates)/system_other_image_info.txt,system,skip_fsck=true)
3495  PATH=$(INTERNAL_USERIMAGES_BINARY_PATHS):$$PATH \
3496      $(BUILD_IMAGE) \
3497          $(TARGET_OUT_SYSTEM_OTHER) $(systemotherimage_intermediates)/system_other_image_info.txt \
3498          $(INSTALLED_SYSTEMOTHERIMAGE_TARGET) $(TARGET_OUT)
3499  $(call assert-max-image-size,$(INSTALLED_SYSTEMOTHERIMAGE_TARGET),$(BOARD_SYSTEMIMAGE_PARTITION_SIZE))
3500endef
3501
3502# We just build this directly to the install location.
3503INSTALLED_SYSTEMOTHERIMAGE_TARGET := $(BUILT_SYSTEMOTHERIMAGE_TARGET)
3504ifneq (true,$(SANITIZE_LITE))
3505# Only create system_other when not building the second stage of a SANITIZE_LITE build.
3506$(INSTALLED_SYSTEMOTHERIMAGE_TARGET): $(INTERNAL_USERIMAGES_DEPS) $(INTERNAL_SYSTEMOTHERIMAGE_FILES) $(INSTALLED_FILES_FILE_SYSTEMOTHER)
3507	$(build-systemotherimage-target)
3508
3509$(call declare-1p-container,$(INSTALLED_SYSTEMOTHERIMAGE_TARGET),)
3510$(call declare-container-license-deps,$(INSTALLED_SYSTEMOTHERIMAGE_TARGET),$(INTERNAL_USERIMAGES_DEPS) $(INTERNAL_SYSTEMOTHERIMAGE_FILES),$(PRODUCT_OUT)/:/)
3511
3512UNMOUNTED_NOTICE_DEPS += $(INSTALLED_SYSTEMOTHERIMAGE_TARGET)
3513endif
3514
3515.PHONY: systemotherimage-nodeps
3516systemotherimage-nodeps: | $(INTERNAL_USERIMAGES_DEPS)
3517	$(build-systemotherimage-target)
3518
3519endif # BUILDING_SYSTEM_OTHER_IMAGE
3520
3521
3522# -----------------------------------------------------------------
3523# vendor partition image
3524INSTALLED_FILES_OUTSIDE_IMAGES := $(filter-out $(TARGET_OUT_VENDOR)/%, $(INSTALLED_FILES_OUTSIDE_IMAGES))
3525ifdef BUILDING_VENDOR_IMAGE
3526INTERNAL_VENDORIMAGE_FILES := \
3527    $(filter $(TARGET_OUT_VENDOR)/%,\
3528      $(ALL_DEFAULT_INSTALLED_MODULES))
3529
3530
3531# Create symlink /vendor/odm to /odm if necessary.
3532ifdef BOARD_USES_ODMIMAGE
3533  _odm_symlink := $(call create-partition-compat-symlink,$(TARGET_OUT_VENDOR)/odm,/odm,odm.img)
3534  INTERNAL_VENDORIMAGE_FILES += $(_odm_symlink)
3535  ALL_DEFAULT_INSTALLED_MODULES += $(_odm_symlink)
3536endif
3537
3538# Create symlinks for vendor_dlkm on devices with a vendor_dlkm partition:
3539# /vendor/lib/modules -> /vendor_dlkm/lib/modules
3540#
3541# On devices with a vendor_dlkm partition,
3542# - /vendor/lib/modules is a symlink to a directory that stores vendor DLKMs.
3543# - /vendor_dlkm/{etc,...} store other vendor_dlkm files directly. The vendor_dlkm partition is
3544#   mounted at /vendor_dlkm at runtime and the symlinks created in system/core/rootdir/Android.mk
3545#   are hidden.
3546# On devices without a vendor_dlkm partition,
3547# - /vendor/lib/modules stores vendor DLKMs directly.
3548# - /vendor_dlkm/{etc,...} are symlinks to directories that store other vendor_dlkm files.
3549#   See system/core/rootdir/Android.mk for a list of created symlinks.
3550# The vendor DLKMs and other vendor_dlkm files must not be accessed using other paths because they
3551# are not guaranteed to exist on all devices.
3552ifdef BOARD_USES_VENDOR_DLKMIMAGE
3553  _vendor_dlkm_lib_modules_symlink := $(call create-partition-compat-symlink,$(TARGET_OUT_VENDOR)/lib/modules,/vendor_dlkm/lib/modules,vendor_dlkm.img)
3554  INTERNAL_VENDORIMAGE_FILES += $(_vendor_dlkm_lib_modules_symlink)
3555  ALL_DEFAULT_INSTALLED_MODULES += $(_vendor_dlkm_lib_modules_symlink)
3556endif
3557
3558# Install vendor/etc/linker.config.pb with PRODUCT_VENDOR_LINKER_CONFIG_FRAGMENTS and STUB_LIBRARIES
3559vendor_linker_config_file := $(TARGET_OUT_VENDOR)/etc/linker.config.pb
3560$(vendor_linker_config_file): private_linker_config_fragments := $(PRODUCT_VENDOR_LINKER_CONFIG_FRAGMENTS)
3561$(vendor_linker_config_file): $(INTERNAL_VENDORIMAGE_FILES) $(PRODUCT_VENDOR_LINKER_CONFIG_FRAGMENTS) | $(HOST_OUT_EXECUTABLES)/conv_linker_config
3562	@echo Creating linker config: $@
3563	@mkdir -p $(dir $@)
3564	@rm -f $@
3565	$(HOST_OUT_EXECUTABLES)/conv_linker_config proto \
3566		--source $(call normalize-path-list,$(private_linker_config_fragments)) \
3567		--output $@
3568	$(HOST_OUT_EXECUTABLES)/conv_linker_config systemprovide --source $@ \
3569		--output $@ --value "$(STUB_LIBRARIES)" --system "$(TARGET_OUT_VENDOR)"
3570$(call define declare-0p-target,$(vendor_linker_config_file),)
3571INTERNAL_VENDORIMAGE_FILES += $(vendor_linker_config_file)
3572ALL_DEFAULT_INSTALLED_MODULES += $(vendor_linker_config_file)
3573
3574INSTALLED_FILES_FILE_VENDOR := $(PRODUCT_OUT)/installed-files-vendor.txt
3575INSTALLED_FILES_JSON_VENDOR := $(INSTALLED_FILES_FILE_VENDOR:.txt=.json)
3576$(INSTALLED_FILES_FILE_VENDOR): .KATI_IMPLICIT_OUTPUTS := $(INSTALLED_FILES_JSON_VENDOR)
3577$(INSTALLED_FILES_FILE_VENDOR) : $(INTERNAL_VENDORIMAGE_FILES) $(FILESLIST) $(FILESLIST_UTIL)
3578	@echo Installed file list: $@
3579	mkdir -p $(dir $@)
3580	rm -f $@
3581	$(FILESLIST) $(TARGET_OUT_VENDOR) > $(@:.txt=.json)
3582	$(FILESLIST_UTIL) -c $(@:.txt=.json) > $@
3583
3584$(call declare-0p-target,$(INSTALLED_FILES_FILE_VENDOR))
3585$(call declare-0p-target,$(INSTALLED_FILES_JSON_VENDOR))
3586
3587vendorimage_intermediates := \
3588    $(call intermediates-dir-for,PACKAGING,vendor)
3589BUILT_VENDORIMAGE_TARGET := $(PRODUCT_OUT)/vendor.img
3590define build-vendorimage-target
3591  $(call pretty,"Target vendor fs image: $(INSTALLED_VENDORIMAGE_TARGET)")
3592  @mkdir -p $(TARGET_OUT_VENDOR)
3593  @mkdir -p $(vendorimage_intermediates) && rm -rf $(vendorimage_intermediates)/vendor_image_info.txt
3594  $(call generate-image-prop-dictionary, $(vendorimage_intermediates)/vendor_image_info.txt,vendor,skip_fsck=true)
3595  PATH=$(INTERNAL_USERIMAGES_BINARY_PATHS):$$PATH \
3596      $(BUILD_IMAGE) \
3597          $(TARGET_OUT_VENDOR) $(vendorimage_intermediates)/vendor_image_info.txt \
3598          $(INSTALLED_VENDORIMAGE_TARGET) $(TARGET_OUT)
3599  $(call assert-max-image-size,$(INSTALLED_VENDORIMAGE_TARGET) $(RECOVERY_FROM_BOOT_PATCH),$(BOARD_VENDORIMAGE_PARTITION_SIZE))
3600endef
3601
3602# We just build this directly to the install location.
3603INSTALLED_VENDORIMAGE_TARGET := $(BUILT_VENDORIMAGE_TARGET)
3604$(INSTALLED_VENDORIMAGE_TARGET): \
3605    $(INTERNAL_USERIMAGES_DEPS) \
3606    $(INTERNAL_VENDORIMAGE_FILES) \
3607    $(INSTALLED_FILES_FILE_VENDOR) \
3608    $(RECOVERY_FROM_BOOT_PATCH)
3609	$(build-vendorimage-target)
3610
3611VENDOR_NOTICE_DEPS += $(INSTALLED_VENDORIMAGE_TARGET)
3612
3613$(call declare-container-license-metadata,$(INSTALLED_VENDORIMAGE_TARGET),legacy_proprietary,proprietary,,"Vendor Image",vendor)
3614$(call declare-container-license-deps,$(INSTALLED_VENDORIMAGE_TARGET),$(INTERNAL_USERIMAGES_DEPS) $(INTERNAL_VENDORIMAGE_FILES) $(RECOVERY_FROM_BOOT_PATH),$(PRODUCT_OUT)/:/)
3615
3616.PHONY: vendorimage-nodeps vnod
3617vendorimage-nodeps vnod: | $(INTERNAL_USERIMAGES_DEPS)
3618	$(build-vendorimage-target)
3619
3620sync: $(INTERNAL_VENDORIMAGE_FILES)
3621
3622else ifdef BOARD_PREBUILT_VENDORIMAGE
3623INSTALLED_VENDORIMAGE_TARGET := $(PRODUCT_OUT)/vendor.img
3624$(eval $(call copy-one-file,$(BOARD_PREBUILT_VENDORIMAGE),$(INSTALLED_VENDORIMAGE_TARGET)))
3625$(if $(strip $(ALL_TARGETS.$(INSTALLED_VENDORIMAGE_TARGET).META_LIC)),,\
3626    $(if $(strip $(ALL_TARGETS.$(BOARD_PREBUILT_VENDORIMAGE).META_LIC)),\
3627        $(call declare-copy-target-license-metadata,$(INSTALLED_VENDORIMAGE_TARGET),$(BOARD_PREBUILT_VENDORIMAGE)),\
3628        $(call declare-license-metadata,$(INSTALLED_VENDORIMAGE_TARGET),legacy_proprietary,proprietary,,"Vendor Image",vendor)))
3629endif
3630
3631# -----------------------------------------------------------------
3632# product partition image
3633INSTALLED_FILES_OUTSIDE_IMAGES := $(filter-out $(TARGET_OUT_PRODUCT)/%, $(INSTALLED_FILES_OUTSIDE_IMAGES))
3634ifdef BUILDING_PRODUCT_IMAGE
3635INTERNAL_PRODUCTIMAGE_FILES := \
3636    $(filter $(TARGET_OUT_PRODUCT)/%,\
3637      $(ALL_DEFAULT_INSTALLED_MODULES))
3638
3639INSTALLED_FILES_FILE_PRODUCT := $(PRODUCT_OUT)/installed-files-product.txt
3640INSTALLED_FILES_JSON_PRODUCT := $(INSTALLED_FILES_FILE_PRODUCT:.txt=.json)
3641$(INSTALLED_FILES_FILE_PRODUCT): .KATI_IMPLICIT_OUTPUTS := $(INSTALLED_FILES_JSON_PRODUCT)
3642$(INSTALLED_FILES_FILE_PRODUCT) : $(INTERNAL_PRODUCTIMAGE_FILES) $(FILESLIST) $(FILESLIST_UTIL)
3643	@echo Installed file list: $@
3644	mkdir -p $(dir $@)
3645	rm -f $@
3646	$(FILESLIST) $(TARGET_OUT_PRODUCT) > $(@:.txt=.json)
3647	$(FILESLIST_UTIL) -c $(@:.txt=.json) > $@
3648
3649$(call declare-0p-target,$(INSTALLED_FILES_FILE_PRODUCT))
3650$(call declare-0p-target,$(INSTALLED_FILES_JSON_PRODUCT))
3651
3652productimage_intermediates := \
3653    $(call intermediates-dir-for,PACKAGING,product)
3654BUILT_PRODUCTIMAGE_TARGET := $(PRODUCT_OUT)/product.img
3655define build-productimage-target
3656  $(call pretty,"Target product fs image: $(INSTALLED_PRODUCTIMAGE_TARGET)")
3657  @mkdir -p $(TARGET_OUT_PRODUCT)
3658  @mkdir -p $(productimage_intermediates) && rm -rf $(productimage_intermediates)/product_image_info.txt
3659  $(call generate-image-prop-dictionary, $(productimage_intermediates)/product_image_info.txt,product,skip_fsck=true)
3660  PATH=$(INTERNAL_USERIMAGES_BINARY_PATHS):$$PATH \
3661      $(BUILD_IMAGE) \
3662          $(TARGET_OUT_PRODUCT) $(productimage_intermediates)/product_image_info.txt \
3663          $(INSTALLED_PRODUCTIMAGE_TARGET) $(TARGET_OUT)
3664  $(call assert-max-image-size,$(INSTALLED_PRODUCTIMAGE_TARGET),$(BOARD_PRODUCTIMAGE_PARTITION_SIZE))
3665endef
3666
3667# We just build this directly to the install location.
3668INSTALLED_PRODUCTIMAGE_TARGET := $(BUILT_PRODUCTIMAGE_TARGET)
3669$(INSTALLED_PRODUCTIMAGE_TARGET): \
3670    $(INTERNAL_USERIMAGES_DEPS) \
3671    $(INTERNAL_PRODUCTIMAGE_FILES) \
3672    $(INSTALLED_FILES_FILE_PRODUCT)
3673	$(build-productimage-target)
3674
3675PRODUCT_NOTICE_DEPS += $(INSTALLED_PRODUCTIMAGE_TARGET)
3676
3677$(call declare-1p-container,$(INSTALLED_PRODUCTIMAGE_TARGET),)
3678$(call declare-container-license-deps,$(INSTALLED_PRODUCTIMAGE_TARGET),$(INTERNAL_USERIMAGES_DEPS) $(INTERNAL_PRODUCTIMAGE_FILES) $(INSTALLED_FILES_FILE_PRODUCT),$(PRODUCT_OUT)/:/)
3679
3680.PHONY: productimage-nodeps pnod
3681productimage-nodeps pnod: | $(INTERNAL_USERIMAGES_DEPS)
3682	$(build-productimage-target)
3683
3684sync: $(INTERNAL_PRODUCTIMAGE_FILES)
3685
3686else ifdef BOARD_PREBUILT_PRODUCTIMAGE
3687INSTALLED_PRODUCTIMAGE_TARGET := $(PRODUCT_OUT)/product.img
3688$(eval $(call copy-one-file,$(BOARD_PREBUILT_PRODUCTIMAGE),$(INSTALLED_PRODUCTIMAGE_TARGET)))
3689endif
3690
3691# -----------------------------------------------------------------
3692# system_ext partition image
3693INSTALLED_FILES_OUTSIDE_IMAGES := $(filter-out $(TARGET_OUT_SYSTEM_EXT)/%, $(INSTALLED_FILES_OUTSIDE_IMAGES))
3694ifdef BUILDING_SYSTEM_EXT_IMAGE
3695INTERNAL_SYSTEM_EXTIMAGE_FILES := \
3696    $(filter $(TARGET_OUT_SYSTEM_EXT)/%,\
3697      $(ALL_DEFAULT_INSTALLED_MODULES))
3698
3699INSTALLED_FILES_FILE_SYSTEM_EXT := $(PRODUCT_OUT)/installed-files-system_ext.txt
3700INSTALLED_FILES_JSON_SYSTEM_EXT := $(INSTALLED_FILES_FILE_SYSTEM_EXT:.txt=.json)
3701$(INSTALLED_FILES_FILE_SYSTEM_EXT): .KATI_IMPLICIT_OUTPUTS := $(INSTALLED_FILES_JSON_SYSTEM_EXT)
3702$(INSTALLED_FILES_FILE_SYSTEM_EXT) : $(INTERNAL_SYSTEM_EXTIMAGE_FILES) $(FILESLIST) $(FILESLIST_UTIL)
3703	@echo Installed file list: $@
3704	mkdir -p $(dir $@)
3705	rm -f $@
3706	$(FILESLIST) $(TARGET_OUT_SYSTEM_EXT) > $(@:.txt=.json)
3707	$(FILESLIST_UTIL) -c $(@:.txt=.json) > $@
3708
3709$(call declare-0p-target,$(INSTALLED_FILES_FILE_SYSTEM_EXT))
3710$(call declare-0p-target,$(INSTALLED_FILES_JSON_SYSTEM_EXT))
3711
3712system_extimage_intermediates := \
3713    $(call intermediates-dir-for,PACKAGING,system_ext)
3714BUILT_SYSTEM_EXTIMAGE_TARGET := $(PRODUCT_OUT)/system_ext.img
3715define build-system_extimage-target
3716  $(call pretty,"Target system_ext fs image: $(INSTALLED_SYSTEM_EXTIMAGE_TARGET)")
3717  @mkdir -p $(TARGET_OUT_SYSTEM_EXT)
3718  @mkdir -p $(system_extimage_intermediates) && rm -rf $(system_extimage_intermediates)/system_ext_image_info.txt
3719  $(call generate-image-prop-dictionary, $(system_extimage_intermediates)/system_ext_image_info.txt,system_ext, skip_fsck=true)
3720  PATH=$(INTERNAL_USERIMAGES_BINARY_PATHS):$$PATH \
3721      $(BUILD_IMAGE) \
3722          $(TARGET_OUT_SYSTEM_EXT) \
3723          $(system_extimage_intermediates)/system_ext_image_info.txt \
3724          $(INSTALLED_SYSTEM_EXTIMAGE_TARGET) \
3725          $(TARGET_OUT)
3726  $(call assert-max-image-size,$(INSTALLED_PRODUCT_SERVICESIMAGE_TARGET),$(BOARD_PRODUCT_SERVICESIMAGE_PARTITION_SIZE))
3727endef
3728
3729# We just build this directly to the install location.
3730INSTALLED_SYSTEM_EXTIMAGE_TARGET := $(BUILT_SYSTEM_EXTIMAGE_TARGET)
3731$(INSTALLED_SYSTEM_EXTIMAGE_TARGET): \
3732    $(INTERNAL_USERIMAGES_DEPS) \
3733    $(INTERNAL_SYSTEM_EXTIMAGE_FILES) \
3734    $(INSTALLED_FILES_FILE_SYSTEM_EXT)
3735	$(build-system_extimage-target)
3736
3737SYSTEM_EXT_NOTICE_DEPS += $(INSTALLED_SYSTEM_EXTIMAGE_TARGET)
3738
3739$(call declare-1p-container,$(INSTALLED_SYSTEM_EXTIMAGE_TARGET),)
3740$(call declare-container-license-deps,$(INSTALLED_SYSTEM_EXTIMAGE_TARGET),$(INTERNAL_USERIMAGES_DEPS) $(INTERNAL_SYSTEM_EXTIMAGE_FILES) $(INSTALLED_FILES_FILE_SYSTEM_EXT),$(PRODUCT_OUT)/:/)
3741
3742.PHONY: systemextimage-nodeps senod
3743systemextimage-nodeps senod: | $(INTERNAL_USERIMAGES_DEPS)
3744	$(build-system_extimage-target)
3745
3746sync: $(INTERNAL_SYSTEM_EXTIMAGE_FILES)
3747
3748else ifdef BOARD_PREBUILT_SYSTEM_EXTIMAGE
3749INSTALLED_SYSTEM_EXTIMAGE_TARGET := $(PRODUCT_OUT)/system_ext.img
3750$(eval $(call copy-one-file,$(BOARD_PREBUILT_SYSTEM_EXTIMAGE),$(INSTALLED_SYSTEM_EXTIMAGE_TARGET)))
3751endif
3752
3753# -----------------------------------------------------------------
3754# odm partition image
3755INSTALLED_FILES_OUTSIDE_IMAGES := $(filter-out $(TARGET_OUT_ODM)/%, $(INSTALLED_FILES_OUTSIDE_IMAGES))
3756ifdef BUILDING_ODM_IMAGE
3757INTERNAL_ODMIMAGE_FILES := \
3758    $(filter $(TARGET_OUT_ODM)/%,\
3759      $(ALL_DEFAULT_INSTALLED_MODULES))
3760
3761# Create symlinks for odm_dlkm on devices with a odm_dlkm partition:
3762# /odm/lib/modules -> /odm_dlkm/lib/modules
3763#
3764# On devices with a odm_dlkm partition,
3765# - /odm/lib/modules is a symlink to a directory that stores odm DLKMs.
3766# - /odm_dlkm/{etc,...} store other odm_dlkm files directly. The odm_dlkm partition is
3767#   mounted at /odm_dlkm at runtime and the symlinks created in system/core/rootdir/Android.mk
3768#   are hidden.
3769# On devices without a odm_dlkm partition,
3770# - /odm/lib/modules stores odm DLKMs directly.
3771# - /odm_dlkm/{etc,...} are symlinks to directories that store other odm_dlkm files.
3772#   See system/core/rootdir/Android.mk for a list of created symlinks.
3773# The odm DLKMs and other odm_dlkm files must not be accessed using other paths because they
3774# are not guaranteed to exist on all devices.
3775ifdef BOARD_USES_ODM_DLKMIMAGE
3776  _odm_dlkm_lib_modules_symlink := $(call create-partition-compat-symlink,$(TARGET_OUT_ODM)/lib/modules,/odm_dlkm/lib/modules,odm_dlkm.img)
3777  INTERNAL_ODMIMAGE_FILES += $(_odm_dlkm_lib_modules_symlink)
3778  ALL_DEFAULT_INSTALLED_MODULES += $(_odm_dlkm_lib_modules_symlink)
3779endif
3780
3781INSTALLED_FILES_FILE_ODM := $(PRODUCT_OUT)/installed-files-odm.txt
3782INSTALLED_FILES_JSON_ODM := $(INSTALLED_FILES_FILE_ODM:.txt=.json)
3783$(INSTALLED_FILES_FILE_ODM): .KATI_IMPLICIT_OUTPUTS := $(INSTALLED_FILES_JSON_ODM)
3784$(INSTALLED_FILES_FILE_ODM) : $(INTERNAL_ODMIMAGE_FILES) $(FILESLIST) $(FILESLIST_UTIL)
3785	@echo Installed file list: $@
3786	mkdir -p $(dir $@)
3787	rm -f $@
3788	$(FILESLIST) $(TARGET_OUT_ODM) > $(@:.txt=.json)
3789	$(FILESLIST_UTIL) -c $(@:.txt=.json) > $@
3790
3791$(call declare-0p-target,$(INSTALLED_FILES_FILE_ODM))
3792$(call declare-0p-target,$(INSTALLED_FILES_JSON_ODM))
3793
3794odmimage_intermediates := \
3795    $(call intermediates-dir-for,PACKAGING,odm)
3796BUILT_ODMIMAGE_TARGET := $(PRODUCT_OUT)/odm.img
3797define build-odmimage-target
3798  $(call pretty,"Target odm fs image: $(INSTALLED_ODMIMAGE_TARGET)")
3799  @mkdir -p $(TARGET_OUT_ODM)
3800  @mkdir -p $(odmimage_intermediates) && rm -rf $(odmimage_intermediates)/odm_image_info.txt
3801  $(call generate-image-prop-dictionary, $(odmimage_intermediates)/odm_image_info.txt, odm, \
3802	  skip_fsck=true)
3803  PATH=$(INTERNAL_USERIMAGES_BINARY_PATHS):$$PATH \
3804      $(BUILD_IMAGE) \
3805          $(TARGET_OUT_ODM) $(odmimage_intermediates)/odm_image_info.txt \
3806          $(INSTALLED_ODMIMAGE_TARGET) $(TARGET_OUT)
3807  $(call assert-max-image-size,$(INSTALLED_ODMIMAGE_TARGET),$(BOARD_ODMIMAGE_PARTITION_SIZE))
3808endef
3809
3810# We just build this directly to the install location.
3811INSTALLED_ODMIMAGE_TARGET := $(BUILT_ODMIMAGE_TARGET)
3812$(INSTALLED_ODMIMAGE_TARGET): \
3813    $(INTERNAL_USERIMAGES_DEPS) \
3814    $(INTERNAL_ODMIMAGE_FILES) \
3815    $(INSTALLED_FILES_FILE_ODM)
3816	$(build-odmimage-target)
3817
3818ODM_NOTICE_DEPS += $(INSTALLED_ODMIMAGE_TARGET)
3819
3820$(call declare-1p-container,$(INSTALLED_ODMIMAGE_TARGET),)
3821$(call declare-container-license-deps,$(INSTALLED_ODMIMAGE_TARGET),$(INTERNAL_USERIMAGES_DEPS) $(INTERNAL_ODMIMAGE_FILES) $(INSTALLED_FILES_FILE_ODM),$(PRODUCT_OUT)/:/)
3822
3823.PHONY: odmimage-nodeps onod
3824odmimage-nodeps onod: | $(INTERNAL_USERIMAGES_DEPS)
3825	$(build-odmimage-target)
3826
3827sync: $(INTERNAL_ODMIMAGE_FILES)
3828
3829else ifdef BOARD_PREBUILT_ODMIMAGE
3830INSTALLED_ODMIMAGE_TARGET := $(PRODUCT_OUT)/odm.img
3831$(eval $(call copy-one-file,$(BOARD_PREBUILT_ODMIMAGE),$(INSTALLED_ODMIMAGE_TARGET)))
3832endif
3833
3834# -----------------------------------------------------------------
3835# vendor_dlkm partition image
3836INSTALLED_FILES_OUTSIDE_IMAGES := $(filter-out $(TARGET_OUT_VENDOR_DLKM)/%, $(INSTALLED_FILES_OUTSIDE_IMAGES))
3837ifdef BUILDING_VENDOR_DLKM_IMAGE
3838INTERNAL_VENDOR_DLKMIMAGE_FILES := \
3839    $(filter $(TARGET_OUT_VENDOR_DLKM)/%,\
3840      $(ALL_DEFAULT_INSTALLED_MODULES))
3841
3842INSTALLED_FILES_FILE_VENDOR_DLKM := $(PRODUCT_OUT)/installed-files-vendor_dlkm.txt
3843INSTALLED_FILES_JSON_VENDOR_DLKM := $(INSTALLED_FILES_FILE_VENDOR_DLKM:.txt=.json)
3844$(INSTALLED_FILES_FILE_VENDOR_DLKM): .KATI_IMPLICIT_OUTPUTS := $(INSTALLED_FILES_JSON_VENDOR_DLKM)
3845$(INSTALLED_FILES_FILE_VENDOR_DLKM) : $(INTERNAL_VENDOR_DLKMIMAGE_FILES) $(FILESLIST) $(FILESLIST_UTIL)
3846	@echo Installed file list: $@
3847	mkdir -p $(dir $@)
3848	rm -f $@
3849	$(FILESLIST) $(TARGET_OUT_VENDOR_DLKM) > $(@:.txt=.json)
3850	$(FILESLIST_UTIL) -c $(@:.txt=.json) > $@
3851
3852$(call declare-0p-target,$(INSTALLED_FILES_FILE_VENDOR_DLKM))
3853$(call declare-0p-target,$(INSTALLED_FILES_JSON_VENDOR_DLKM))
3854
3855vendor_dlkmimage_intermediates := \
3856    $(call intermediates-dir-for,PACKAGING,vendor_dlkm)
3857BUILT_VENDOR_DLKMIMAGE_TARGET := $(PRODUCT_OUT)/vendor_dlkm.img
3858define build-vendor_dlkmimage-target
3859  $(call pretty,"Target vendor_dlkm fs image: $(INSTALLED_VENDOR_DLKMIMAGE_TARGET)")
3860  @mkdir -p $(TARGET_OUT_VENDOR_DLKM)
3861  @mkdir -p $(vendor_dlkmimage_intermediates) && rm -rf $(vendor_dlkmimage_intermediates)/vendor_dlkm_image_info.txt
3862  $(call generate-image-prop-dictionary, $(vendor_dlkmimage_intermediates)/vendor_dlkm_image_info.txt, \
3863	  vendor_dlkm, skip_fsck=true)
3864  PATH=$(INTERNAL_USERIMAGES_BINARY_PATHS):$$PATH \
3865      $(BUILD_IMAGE) \
3866          $(TARGET_OUT_VENDOR_DLKM) $(vendor_dlkmimage_intermediates)/vendor_dlkm_image_info.txt \
3867          $(INSTALLED_VENDOR_DLKMIMAGE_TARGET) $(TARGET_OUT)
3868  $(call assert-max-image-size,$(INSTALLED_VENDOR_DLKMIMAGE_TARGET),$(BOARD_VENDOR_DLKMIMAGE_PARTITION_SIZE))
3869endef
3870
3871# We just build this directly to the install location.
3872INSTALLED_VENDOR_DLKMIMAGE_TARGET := $(BUILT_VENDOR_DLKMIMAGE_TARGET)
3873$(INSTALLED_VENDOR_DLKMIMAGE_TARGET): \
3874    $(INTERNAL_USERIMAGES_DEPS) \
3875    $(INTERNAL_VENDOR_DLKMIMAGE_FILES) \
3876    $(INSTALLED_FILES_FILE_VENDOR_DLKM)
3877	$(build-vendor_dlkmimage-target)
3878
3879VENDOR_DLKM_NOTICE_DEPS += $(INSTALLED_VENDOR_DLKMIMAGE_TARGET)
3880
3881$(call declare-1p-container,$(INSTALLED_VENDOR_DLKMIMAGE_TARGET),)
3882$(call declare-container-license-deps,$(INSTALLED_VENDOR_DLKMIMAGE_TARGET),$(INTERNAL_USERIMAGES_DEPS) $(INTERNAL_VENDOR_DLKMIMAGE_FILES) $(INSTALLED_FILES_FILE_VENDOR_DLKM),$(PRODUCT_OUT)/:/)
3883
3884.PHONY: vendor_dlkmimage-nodeps vdnod
3885vendor_dlkmimage-nodeps vdnod: | $(INTERNAL_USERIMAGES_DEPS)
3886	$(build-vendor_dlkmimage-target)
3887
3888sync: $(INTERNAL_VENDOR_DLKMIMAGE_FILES)
3889
3890else ifdef BOARD_PREBUILT_VENDOR_DLKMIMAGE
3891INSTALLED_VENDOR_DLKMIMAGE_TARGET := $(PRODUCT_OUT)/vendor_dlkm.img
3892$(eval $(call copy-one-file,$(BOARD_PREBUILT_VENDOR_DLKMIMAGE),$(INSTALLED_VENDOR_DLKMIMAGE_TARGET)))
3893endif
3894
3895# -----------------------------------------------------------------
3896# odm_dlkm partition image
3897INSTALLED_FILES_OUTSIDE_IMAGES := $(filter-out $(TARGET_OUT_ODM_DLKM)/%, $(INSTALLED_FILES_OUTSIDE_IMAGES))
3898ifdef BUILDING_ODM_DLKM_IMAGE
3899INTERNAL_ODM_DLKMIMAGE_FILES := \
3900    $(filter $(TARGET_OUT_ODM_DLKM)/%,\
3901      $(ALL_DEFAULT_INSTALLED_MODULES))
3902
3903INSTALLED_FILES_FILE_ODM_DLKM := $(PRODUCT_OUT)/installed-files-odm_dlkm.txt
3904INSTALLED_FILES_JSON_ODM_DLKM := $(INSTALLED_FILES_FILE_ODM_DLKM:.txt=.json)
3905$(INSTALLED_FILES_FILE_ODM_DLKM): .KATI_IMPLICIT_OUTPUTS := $(INSTALLED_FILES_JSON_ODM_DLKM)
3906$(INSTALLED_FILES_FILE_ODM_DLKM) : $(INTERNAL_ODM_DLKMIMAGE_FILES) $(FILESLIST) $(FILESLIST_UTIL)
3907	@echo Installed file list: $@
3908	mkdir -p $(dir $@)
3909	rm -f $@
3910	$(FILESLIST) $(TARGET_OUT_ODM_DLKM) > $(@:.txt=.json)
3911	$(FILESLIST_UTIL) -c $(@:.txt=.json) > $@
3912
3913$(call declare-0p-target,$(INSTALLED_FILES_FILE_ODM_DLKM))
3914$(call declare-0p-target,$(INSTALLED_FILES_JSON_ODM_DLKM))
3915
3916odm_dlkmimage_intermediates := \
3917    $(call intermediates-dir-for,PACKAGING,odm_dlkm)
3918BUILT_ODM_DLKMIMAGE_TARGET := $(PRODUCT_OUT)/odm_dlkm.img
3919define build-odm_dlkmimage-target
3920  $(call pretty,"Target odm_dlkm fs image: $(INSTALLED_ODM_DLKMIMAGE_TARGET)")
3921  @mkdir -p $(TARGET_OUT_ODM_DLKM)
3922  @mkdir -p $(odm_dlkmimage_intermediates) && rm -rf $(odm_dlkmimage_intermediates)/odm_dlkm_image_info.txt
3923  $(call generate-image-prop-dictionary, $(odm_dlkmimage_intermediates)/odm_dlkm_image_info.txt, \
3924	  odm_dlkm, skip_fsck=true)
3925  PATH=$(INTERNAL_USERIMAGES_BINARY_PATHS):$$PATH \
3926      $(BUILD_IMAGE) \
3927          $(TARGET_OUT_ODM_DLKM) $(odm_dlkmimage_intermediates)/odm_dlkm_image_info.txt \
3928          $(INSTALLED_ODM_DLKMIMAGE_TARGET) $(TARGET_OUT)
3929  $(call assert-max-image-size,$(INSTALLED_ODM_DLKMIMAGE_TARGET),$(BOARD_ODM_DLKMIMAGE_PARTITION_SIZE))
3930endef
3931
3932# We just build this directly to the install location.
3933INSTALLED_ODM_DLKMIMAGE_TARGET := $(BUILT_ODM_DLKMIMAGE_TARGET)
3934$(INSTALLED_ODM_DLKMIMAGE_TARGET): \
3935    $(INTERNAL_USERIMAGES_DEPS) \
3936    $(INTERNAL_ODM_DLKMIMAGE_FILES) \
3937    $(INSTALLED_FILES_FILE_ODM_DLKM)
3938	$(build-odm_dlkmimage-target)
3939
3940ODM_DLKM_NOTICE_DEPS += $(INSTALLED_ODM_DLKMIMAGE_TARGET)
3941
3942$(call declare-1p-container,$(INSTALLED_ODM_DLKMIMAGE_TARGET),)
3943$(call declare-container-license-deps,$(INSTALLED_ODM_DLKMIMAGE_TARGET),$(INTERNAL_USERIMAGES_DEPS) $(INTERNAL_ODM_DLKMIMAGE_FILES) $(INSTALLED_FILES_FILE_ODM_DLKM),$(PRODUCT_OUT)/:/)
3944
3945.PHONY: odm_dlkmimage-nodeps odnod
3946odm_dlkmimage-nodeps odnod: | $(INTERNAL_USERIMAGES_DEPS)
3947	$(build-odm_dlkmimage-target)
3948
3949sync: $(INTERNAL_ODM_DLKMIMAGE_FILES)
3950
3951else ifdef BOARD_PREBUILT_ODM_DLKMIMAGE
3952INSTALLED_ODM_DLKMIMAGE_TARGET := $(PRODUCT_OUT)/odm_dlkm.img
3953$(eval $(call copy-one-file,$(BOARD_PREBUILT_ODM_DLKMIMAGE),$(INSTALLED_ODM_DLKMIMAGE_TARGET)))
3954endif
3955
3956# -----------------------------------------------------------------
3957# system_dlkm partition image
3958
3959INSTALLED_FILES_OUTSIDE_IMAGES := $(filter-out $(TARGET_OUT_SYSTEM_DLKM)/%, $(INSTALLED_FILES_OUTSIDE_IMAGES))
3960ifdef BUILDING_SYSTEM_DLKM_IMAGE
3961
3962INTERNAL_SYSTEM_DLKMIMAGE_FILES := \
3963    $(filter $(TARGET_OUT_SYSTEM_DLKM)/%,\
3964      $(ALL_DEFAULT_INSTALLED_MODULES))
3965
3966INSTALLED_FILES_FILE_SYSTEM_DLKM := $(PRODUCT_OUT)/installed-files-system_dlkm.txt
3967INSTALLED_FILES_JSON_SYSTEM_DLKM := $(INSTALLED_FILES_FILE_SYSTEM_DLKM:.txt=.json)
3968$(INSTALLED_FILES_FILE_SYSTEM_DLKM): .KATI_IMPLICIT_OUTPUTS := $(INSTALLED_FILES_JSON_SYSTEM_DLKM)
3969$(INSTALLED_FILES_FILE_SYSTEM_DLKM): $(INTERNAL_SYSTEM_DLKMIMAGE_FILES) $(FILESLIST) $(FILESLIST_UTIL)
3970	@echo Installed file list: $@
3971	mkdir -p $(dir $@)
3972	rm -f $@
3973	$(FILESLIST) $(TARGET_OUT_SYSTEM_DLKM) > $(@:.txt=.json)
3974	$(FILESLIST_UTIL) -c $(@:.txt=.json) > $@
3975
3976$(call declare-0p-target,$(INSTALLED_FILES_FILE_SYSTEM_DLKM))
3977$(call declare-0p-target,$(INSTALLED_FILES_JSON_SYSTEM_DLKM))
3978
3979system_dlkmimage_intermediates := \
3980    $(call intermediates-dir-for,PACKAGING,system_dlkm)
3981BUILT_SYSTEM_DLKMIMAGE_TARGET := $(PRODUCT_OUT)/system_dlkm.img
3982define build-system_dlkmimage-target
3983  $(call pretty,"Target system_dlkm fs image: $(INSTALLED_SYSTEM_DLKMIMAGE_TARGET)")
3984  @mkdir -p $(TARGET_OUT_SYSTEM_DLKM)
3985  @mkdir -p $(system_dlkmimage_intermediates) && rm -rf $(system_dlkmimage_intermediates)/system_dlkm_image_info.txt
3986  $(call generate-image-prop-dictionary, $(system_dlkmimage_intermediates)/system_dlkm_image_info.txt, \
3987	  system_dlkm, skip_fsck=true)
3988  PATH=$(INTERNAL_USERIMAGES_BINARY_PATHS):$$PATH \
3989      $(BUILD_IMAGE) \
3990          $(TARGET_OUT_SYSTEM_DLKM) $(system_dlkmimage_intermediates)/system_dlkm_image_info.txt \
3991          $(INSTALLED_SYSTEM_DLKMIMAGE_TARGET) $(TARGET_OUT)
3992  $(call assert-max-image-size,$(INSTALLED_SYSTEM_DLKMIMAGE_TARGET),$(BOARD_SYSTEM_DLKMIMAGE_PARTITION_SIZE))
3993endef
3994
3995# We just build this directly to the install location.
3996INSTALLED_SYSTEM_DLKMIMAGE_TARGET := $(BUILT_SYSTEM_DLKMIMAGE_TARGET)
3997$(INSTALLED_SYSTEM_DLKMIMAGE_TARGET): \
3998    $(INTERNAL_USERIMAGES_DEPS) \
3999    $(INTERNAL_SYSTEM_DLKMIMAGE_FILES) \
4000    $(INSTALLED_FILES_FILE_SYSTEM_DLKM)
4001	$(build-system_dlkmimage-target)
4002
4003SYSTEM_DLKM_NOTICE_DEPS += $(INSTALLED_SYSTEM_DLKMIMAGE_TARGET)
4004
4005$(call declare-1p-container,$(INSTALLED_SYSTEM_DLKMIMAGE_TARGET),)
4006$(call declare-container-license-deps,$(INSTALLED_SYSTEM_DLKMIMAGE_TARGET),$(INTERNAL_USERIMAGES_DEPS) $(INTERNAL_SYSTEM_DLKMIMAGE_FILES) $(INSTALLED_FILES_FILE_SYSTEM_DLKM),$(PRODUCT_OUT)/:/)
4007
4008.PHONY: system_dlkmimage-nodeps sdnod
4009system_dlkmimage-nodeps sdnod: | $(INTERNAL_USERIMAGES_DEPS)
4010	$(build-system_dlkmimage-target)
4011
4012sync: $(INTERNAL_SYSTEM_DLKMIMAGE_FILES)
4013
4014else ifdef BOARD_PREBUILT_SYSTEM_DLKMIMAGE
4015INSTALLED_SYSTEM_DLKMIMAGE_TARGET := $(PRODUCT_OUT)/system_dlkm.img
4016$(eval $(call copy-one-file,$(BOARD_PREBUILT_SYSTEM_DLKMIMAGE),$(INSTALLED_SYSTEM_DLKMIMAGE_TARGET)))
4017endif
4018
4019# -----------------------------------------------------------------
4020# dtbo image
4021ifdef BOARD_PREBUILT_DTBOIMAGE
4022INSTALLED_DTBOIMAGE_TARGET := $(PRODUCT_OUT)/dtbo.img
4023
4024ifeq ($(BOARD_AVB_ENABLE),true)
4025$(INSTALLED_DTBOIMAGE_TARGET): $(BOARD_PREBUILT_DTBOIMAGE) $(AVBTOOL) $(BOARD_AVB_DTBO_KEY_PATH)
4026	cp $(BOARD_PREBUILT_DTBOIMAGE) $@
4027	chmod +w $@
4028	$(AVBTOOL) add_hash_footer \
4029	    --image $@ \
4030	    $(call get-partition-size-argument,$(BOARD_DTBOIMG_PARTITION_SIZE)) \
4031	    --partition_name dtbo $(INTERNAL_AVB_DTBO_SIGNING_ARGS) \
4032	    $(BOARD_AVB_DTBO_ADD_HASH_FOOTER_ARGS)
4033
4034$(call declare-1p-container,$(INSTALLED_DTBOIMAGE_TARGET),)
4035$(call declare-container-license-deps,$(INSTALLED_DTBOIMAGE_TARGET),$(BOARD_PREBUILT_DTBOIMAGE),$(PRODUCT_OUT)/:/)
4036
4037UNMOUNTED_NOTICE_VENDOR_DEPS+= $(INSTALLED_DTBOIMAGE_TARGET)
4038else
4039$(INSTALLED_DTBOIMAGE_TARGET): $(BOARD_PREBUILT_DTBOIMAGE)
4040	cp $(BOARD_PREBUILT_DTBOIMAGE) $@
4041endif
4042
4043endif # BOARD_PREBUILT_DTBOIMAGE
4044
4045# -----------------------------------------------------------------
4046# Protected VM firmware image
4047ifeq ($(BOARD_USES_PVMFWIMAGE),true)
4048
4049.PHONY: pvmfwimage
4050pvmfwimage: $(INSTALLED_PVMFWIMAGE_TARGET)
4051
4052INSTALLED_PVMFWIMAGE_TARGET := $(PRODUCT_OUT)/pvmfw.img
4053INSTALLED_PVMFW_EMBEDDED_AVBKEY_TARGET := $(PRODUCT_OUT)/pvmfw_embedded.avbpubkey
4054INSTALLED_PVMFW_BINARY_TARGET := $(call module-installed-files,pvmfw_bin)
4055INTERNAL_PVMFWIMAGE_FILES := $(call module-target-built-files,pvmfw_img)
4056INTERNAL_PVMFW_EMBEDDED_AVBKEY := $(call module-target-built-files,pvmfw_embedded_key)
4057INTERNAL_PVMFW_SYMBOL := $(TARGET_OUT_EXECUTABLES_UNSTRIPPED)/pvmfw
4058
4059$(call declare-1p-container,$(INSTALLED_PVMFWIMAGE_TARGET),)
4060$(call declare-container-license-deps,$(INSTALLED_PVMFWIMAGE_TARGET),$(INTERNAL_PVMFWIMAGE_FILES),$(PRODUCT_OUT)/:/)
4061
4062UNMOUNTED_NOTICE_VENDOR_DEPS += $(INSTALLED_PVMFWIMAGE_TARGET)
4063
4064# Place the unstripped pvmfw image to the symbols directory
4065$(INTERNAL_PVMFWIMAGE_FILES): |$(INTERNAL_PVMFW_SYMBOL)
4066
4067$(eval $(call copy-one-file,$(INTERNAL_PVMFWIMAGE_FILES),$(INSTALLED_PVMFWIMAGE_TARGET)))
4068
4069$(INSTALLED_PVMFWIMAGE_TARGET): $(INSTALLED_PVMFW_EMBEDDED_AVBKEY_TARGET)
4070
4071$(eval $(call copy-one-file,$(INTERNAL_PVMFW_EMBEDDED_AVBKEY),$(INSTALLED_PVMFW_EMBEDDED_AVBKEY_TARGET)))
4072
4073endif # BOARD_USES_PVMFWIMAGE
4074
4075# Returns a list of image targets corresponding to the given list of partitions. For example, it
4076# returns "$(INSTALLED_PRODUCTIMAGE_TARGET)" for "product", or "$(INSTALLED_SYSTEMIMAGE_TARGET)
4077# $(INSTALLED_VENDORIMAGE_TARGET)" for "system vendor".
4078# (1): list of partitions like "system", "vendor" or "system product system_ext".
4079define images-for-partitions
4080$(strip $(foreach item,$(1),\
4081  $(if $(filter $(item),system_other),$(INSTALLED_SYSTEMOTHERIMAGE_TARGET),\
4082    $(if $(filter $(item),init_boot),$(INSTALLED_INIT_BOOT_IMAGE_TARGET),\
4083      $(INSTALLED_$(call to-upper,$(item))IMAGE_TARGET)))))
4084endef
4085
4086# -----------------------------------------------------------------
4087# custom images
4088INSTALLED_CUSTOMIMAGES_TARGET :=
4089
4090ifneq ($(strip $(BOARD_CUSTOMIMAGES_PARTITION_LIST)),)
4091INTERNAL_AVB_CUSTOMIMAGES_SIGNING_ARGS :=
4092
4093# Sign custom image.
4094# $(1): the prebuilt custom image.
4095# $(2): the mount point of the prebuilt custom image.
4096# $(3): the signed custom image target.
4097define sign_custom_image
4098$(3): $(1) $(INTERNAL_USERIMAGES_DEPS)
4099	@echo Target custom image: $(3)
4100	mkdir -p $(dir $(3))
4101	cp $(1) $(3)
4102ifeq ($(BOARD_AVB_ENABLE),true)
4103	PATH=$(INTERNAL_USERIMAGES_BINARY_PATHS):$$$$PATH \
4104          $(AVBTOOL) add_hashtree_footer \
4105          --image $(3) \
4106          --key $(BOARD_AVB_$(call to-upper,$(2))_KEY_PATH) \
4107          --algorithm $(BOARD_AVB_$(call to-upper,$(2))_ALGORITHM) \
4108          $(call get-partition-size-argument,$(BOARD_AVB_$(call to-upper,$(2))_PARTITION_SIZE)) \
4109          --partition_name $(2) \
4110          $(INTERNAL_AVB_CUSTOMIMAGES_SIGNING_ARGS) \
4111          $(BOARD_AVB_$(call to-upper,$(2))_ADD_HASHTREE_FOOTER_ARGS)
4112endif
4113INSTALLED_CUSTOMIMAGES_TARGET += $(3)
4114endef
4115
4116$(foreach partition,$(BOARD_CUSTOMIMAGES_PARTITION_LIST), \
4117  $(foreach image,$(BOARD_AVB_$(call to-upper,$(partition))_IMAGE_LIST), \
4118     $(eval $(call sign_custom_image,$(image),$(partition),$(PRODUCT_OUT)/$(notdir $(image))))))
4119endif
4120
4121# -----------------------------------------------------------------
4122# vbmeta image
4123ifeq ($(BOARD_AVB_ENABLE),true)
4124
4125BUILT_VBMETAIMAGE_TARGET := $(PRODUCT_OUT)/vbmeta.img
4126AVB_CHAIN_KEY_DIR := $(TARGET_OUT_INTERMEDIATES)/avb_chain_keys
4127
4128ifdef BOARD_AVB_KEY_PATH
4129$(if $(BOARD_AVB_ALGORITHM),,$(error BOARD_AVB_ALGORITHM is not defined))
4130else
4131# If key path isn't specified, use the 4096-bit test key.
4132BOARD_AVB_ALGORITHM := SHA256_RSA4096
4133BOARD_AVB_KEY_PATH := external/avb/test/data/testkey_rsa4096.pem
4134endif
4135
4136# AVB signing for system_other.img.
4137ifdef BUILDING_SYSTEM_OTHER_IMAGE
4138ifdef BOARD_AVB_SYSTEM_OTHER_KEY_PATH
4139$(if $(BOARD_AVB_SYSTEM_OTHER_ALGORITHM),,$(error BOARD_AVB_SYSTEM_OTHER_ALGORITHM is not defined))
4140else
4141# If key path isn't specified, use the same key as BOARD_AVB_KEY_PATH.
4142BOARD_AVB_SYSTEM_OTHER_KEY_PATH := $(BOARD_AVB_KEY_PATH)
4143BOARD_AVB_SYSTEM_OTHER_ALGORITHM := $(BOARD_AVB_ALGORITHM)
4144endif
4145
4146$(INSTALLED_PRODUCT_SYSTEM_OTHER_AVBKEY_TARGET): $(AVBTOOL) $(BOARD_AVB_SYSTEM_OTHER_KEY_PATH)
4147	@echo Extracting system_other avb key: $@
4148	@rm -f $@
4149	@mkdir -p $(dir $@)
4150	$(AVBTOOL) extract_public_key --key $(BOARD_AVB_SYSTEM_OTHER_KEY_PATH) --output $@
4151
4152$(eval $(call declare-0p-target,$(INSTALLED_PRODUCT_SYSTEM_OTHER_AVBKEY_TARGET),))
4153
4154ifndef BOARD_AVB_SYSTEM_OTHER_ROLLBACK_INDEX
4155BOARD_AVB_SYSTEM_OTHER_ROLLBACK_INDEX := $(PLATFORM_SECURITY_PATCH_TIMESTAMP)
4156endif
4157
4158BOARD_AVB_SYSTEM_OTHER_ADD_HASHTREE_FOOTER_ARGS += --rollback_index $(BOARD_AVB_SYSTEM_OTHER_ROLLBACK_INDEX)
4159endif # end of AVB for BUILDING_SYSTEM_OTHER_IMAGE
4160
4161INTERNAL_AVB_PARTITIONS_IN_CHAINED_VBMETA_IMAGES := \
4162    $(BOARD_AVB_VBMETA_SYSTEM) \
4163    $(BOARD_AVB_VBMETA_VENDOR) \
4164    $(foreach partition,$(BOARD_AVB_VBMETA_CUSTOM_PARTITIONS),$(BOARD_AVB_VBMETA_$(call to-upper,$(partition))))
4165
4166# Not allowing the same partition to appear in multiple groups.
4167ifneq ($(words $(sort $(INTERNAL_AVB_PARTITIONS_IN_CHAINED_VBMETA_IMAGES))),$(words $(INTERNAL_AVB_PARTITIONS_IN_CHAINED_VBMETA_IMAGES)))
4168  $(error BOARD_AVB_VBMETA_SYSTEM and BOARD_AVB_VBMETA_VENDOR cannot have duplicates)
4169endif
4170
4171# When building a standalone recovery image for non-A/B devices, recovery image must be self-signed
4172# to be verified independently, and cannot be chained into vbmeta.img. See the link below for
4173# details.
4174ifeq ($(TARGET_OTA_ALLOW_NON_AB),true)
4175ifneq ($(INSTALLED_RECOVERYIMAGE_TARGET),)
4176$(if $(BOARD_AVB_RECOVERY_KEY_PATH),,\
4177    $(error BOARD_AVB_RECOVERY_KEY_PATH must be defined for if non-A/B is supported. \
4178            See https://android.googlesource.com/platform/external/avb/+/master/README.md#booting-into-recovery))
4179endif
4180endif
4181
4182# Appends os version as a AVB property descriptor.
4183SYSTEM_OS_VERSION ?= $(PLATFORM_VERSION_LAST_STABLE)
4184BOARD_AVB_SYSTEM_ADD_HASHTREE_FOOTER_ARGS += \
4185    --prop com.android.build.system.os_version:$(SYSTEM_OS_VERSION)
4186
4187PRODUCT_OS_VERSION ?= $(PLATFORM_VERSION_LAST_STABLE)
4188BOARD_AVB_PRODUCT_ADD_HASHTREE_FOOTER_ARGS += \
4189    --prop com.android.build.product.os_version:$(PRODUCT_OS_VERSION)
4190
4191SYSTEM_EXT_OS_VERSION ?= $(PLATFORM_VERSION_LAST_STABLE)
4192BOARD_AVB_SYSTEM_EXT_ADD_HASHTREE_FOOTER_ARGS += \
4193    --prop com.android.build.system_ext.os_version:$(SYSTEM_EXT_OS_VERSION)
4194
4195INIT_BOOT_OS_VERSION ?= $(PLATFORM_VERSION_LAST_STABLE)
4196BOARD_AVB_INIT_BOOT_ADD_HASH_FOOTER_ARGS += \
4197    --prop com.android.build.init_boot.os_version:$(INIT_BOOT_OS_VERSION)
4198
4199BOOT_OS_VERSION ?= $(PLATFORM_VERSION_LAST_STABLE)
4200BOARD_AVB_BOOT_ADD_HASH_FOOTER_ARGS += \
4201    --prop com.android.build.boot.os_version:$(BOOT_OS_VERSION)
4202
4203VENDOR_OS_VERSION ?= $(PLATFORM_VERSION_LAST_STABLE)
4204BOARD_AVB_VENDOR_ADD_HASHTREE_FOOTER_ARGS += \
4205    --prop com.android.build.vendor.os_version:$(VENDOR_OS_VERSION)
4206
4207ODM_OS_VERSION ?= $(PLATFORM_VERSION_LAST_STABLE)
4208BOARD_AVB_ODM_ADD_HASHTREE_FOOTER_ARGS += \
4209    --prop com.android.build.odm.os_version:$(ODM_OS_VERSION)
4210
4211VENDOR_DLKM_OS_VERSION ?= $(PLATFORM_VERSION_LAST_STABLE)
4212BOARD_AVB_VENDOR_DLKM_ADD_HASHTREE_FOOTER_ARGS += \
4213    --prop com.android.build.vendor_dlkm.os_version:$(VENDOR_DLKM_OS_VERSION)
4214
4215ODM_DLKM_OS_VERSION ?= $(PLATFORM_VERSION_LAST_STABLE)
4216BOARD_AVB_ODM_DLKM_ADD_HASHTREE_FOOTER_ARGS += \
4217    --prop com.android.build.odm_dlkm.os_version:$(ODM_DLKM_OS_VERSION)
4218
4219SYSTEM_DLKM_OS_VERSION ?= $(PLATFORM_VERSION_LAST_STABLE)
4220BOARD_AVB_SYSTEM_DLKM_ADD_HASHTREE_FOOTER_ARGS += \
4221    --prop com.android.build.system_dlkm.os_version:$(SYSTEM_DLKM_OS_VERSION)
4222
4223# Appends fingerprint and security patch level as a AVB property descriptor.
4224BOARD_AVB_SYSTEM_ADD_HASHTREE_FOOTER_ARGS += \
4225    --prop com.android.build.system.fingerprint:$(BUILD_FINGERPRINT_FROM_FILE) \
4226    --prop com.android.build.system.security_patch:$(PLATFORM_SECURITY_PATCH)
4227
4228BOARD_AVB_PRODUCT_ADD_HASHTREE_FOOTER_ARGS += \
4229    --prop com.android.build.product.fingerprint:$(BUILD_FINGERPRINT_FROM_FILE) \
4230    --prop com.android.build.product.security_patch:$(PLATFORM_SECURITY_PATCH)
4231
4232BOARD_AVB_SYSTEM_EXT_ADD_HASHTREE_FOOTER_ARGS += \
4233    --prop com.android.build.system_ext.fingerprint:$(BUILD_FINGERPRINT_FROM_FILE) \
4234    --prop com.android.build.system_ext.security_patch:$(PLATFORM_SECURITY_PATCH)
4235
4236BOARD_AVB_BOOT_ADD_HASH_FOOTER_ARGS += \
4237    --prop com.android.build.boot.fingerprint:$(BUILD_FINGERPRINT_FROM_FILE)
4238
4239BOARD_AVB_INIT_BOOT_ADD_HASH_FOOTER_ARGS += \
4240    --prop com.android.build.init_boot.fingerprint:$(BUILD_FINGERPRINT_FROM_FILE)
4241
4242BOARD_AVB_VENDOR_BOOT_ADD_HASH_FOOTER_ARGS += \
4243    --prop com.android.build.vendor_boot.fingerprint:$(BUILD_FINGERPRINT_FROM_FILE) \
4244
4245BOARD_AVB_VENDOR_KERNEL_BOOT_ADD_HASH_FOOTER_ARGS += \
4246    --prop com.android.build.vendor_kernel_boot.fingerprint:$(BUILD_FINGERPRINT_FROM_FILE) \
4247
4248BOARD_AVB_RECOVERY_ADD_HASH_FOOTER_ARGS += \
4249    --prop com.android.build.recovery.fingerprint:$(BUILD_FINGERPRINT_FROM_FILE)
4250
4251BOARD_AVB_VENDOR_ADD_HASHTREE_FOOTER_ARGS += \
4252    --prop com.android.build.vendor.fingerprint:$(BUILD_FINGERPRINT_FROM_FILE)
4253
4254BOARD_AVB_ODM_ADD_HASHTREE_FOOTER_ARGS += \
4255    --prop com.android.build.odm.fingerprint:$(BUILD_FINGERPRINT_FROM_FILE)
4256
4257BOARD_AVB_VENDOR_DLKM_ADD_HASHTREE_FOOTER_ARGS += \
4258    --prop com.android.build.vendor_dlkm.fingerprint:$(BUILD_FINGERPRINT_FROM_FILE)
4259
4260BOARD_AVB_ODM_DLKM_ADD_HASHTREE_FOOTER_ARGS += \
4261    --prop com.android.build.odm_dlkm.fingerprint:$(BUILD_FINGERPRINT_FROM_FILE)
4262
4263BOARD_AVB_SYSTEM_DLKM_ADD_HASHTREE_FOOTER_ARGS += \
4264    --prop com.android.build.system_dlkm.fingerprint:$(BUILD_FINGERPRINT_FROM_FILE)
4265
4266BOARD_AVB_DTBO_ADD_HASH_FOOTER_ARGS += \
4267    --prop com.android.build.dtbo.fingerprint:$(BUILD_FINGERPRINT_FROM_FILE)
4268
4269BOARD_AVB_PVMFW_ADD_HASH_FOOTER_ARGS += \
4270    --prop com.android.build.pvmfw.fingerprint:$(BUILD_FINGERPRINT_FROM_FILE)
4271
4272# The following vendor- and odm-specific images needs explicit SPL set per board.
4273# TODO(b/210875415) Is this security_patch property used? Should it be removed from
4274# boot.img when there is no platform ramdisk included in it?
4275ifdef BOOT_SECURITY_PATCH
4276BOARD_AVB_BOOT_ADD_HASH_FOOTER_ARGS += \
4277    --prop com.android.build.boot.security_patch:$(BOOT_SECURITY_PATCH)
4278endif
4279
4280ifdef INIT_BOOT_SECURITY_PATCH
4281BOARD_AVB_INIT_BOOT_ADD_HASH_FOOTER_ARGS += \
4282    --prop com.android.build.init_boot.security_patch:$(INIT_BOOT_SECURITY_PATCH)
4283else ifdef BOOT_SECURITY_PATCH
4284BOARD_AVB_INIT_BOOT_ADD_HASH_FOOTER_ARGS += \
4285    --prop com.android.build.init_boot.security_patch:$(BOOT_SECURITY_PATCH)
4286endif
4287
4288ifdef VENDOR_SECURITY_PATCH
4289BOARD_AVB_VENDOR_ADD_HASHTREE_FOOTER_ARGS += \
4290    --prop com.android.build.vendor.security_patch:$(VENDOR_SECURITY_PATCH)
4291endif
4292
4293ifdef ODM_SECURITY_PATCH
4294BOARD_AVB_ODM_ADD_HASHTREE_FOOTER_ARGS += \
4295    --prop com.android.build.odm.security_patch:$(ODM_SECURITY_PATCH)
4296endif
4297
4298ifdef VENDOR_DLKM_SECURITY_PATCH
4299BOARD_AVB_VENDOR_DLKM_ADD_HASHTREE_FOOTER_ARGS += \
4300    --prop com.android.build.vendor_dlkm.security_patch:$(VENDOR_DLKM_SECURITY_PATCH)
4301endif
4302
4303ifdef ODM_DLKM_SECURITY_PATCH
4304BOARD_AVB_ODM_DLKM_ADD_HASHTREE_FOOTER_ARGS += \
4305    --prop com.android.build.odm_dlkm.security_patch:$(ODM_DLKM_SECURITY_PATCH)
4306endif
4307
4308ifdef SYSTEM_DLKM_SECURITY_PATCH
4309BOARD_AVB_SYSTEM_DLKM_ADD_HASHTREE_FOOTER_ARGS += \
4310    --prop com.android.build.system_dlkm.security_patch:$(SYSTEM_DLKM_SECURITY_PATCH)
4311endif
4312
4313ifdef PVMFW_SECURITY_PATCH
4314BOARD_AVB_PVMFW_ADD_HASH_FOOTER_ARGS += \
4315    --prop com.android.build.pvmfw.security_patch:$(PVMFW_SECURITY_PATCH)
4316endif
4317
4318BOOT_FOOTER_ARGS := BOARD_AVB_BOOT_ADD_HASH_FOOTER_ARGS
4319INIT_BOOT_FOOTER_ARGS := BOARD_AVB_INIT_BOOT_ADD_HASH_FOOTER_ARGS
4320VENDOR_BOOT_FOOTER_ARGS := BOARD_AVB_VENDOR_BOOT_ADD_HASH_FOOTER_ARGS
4321VENDOR_KERNEL_BOOT_FOOTER_ARGS := BOARD_AVB_VENDOR_KERNEL_BOOT_ADD_HASH_FOOTER_ARGS
4322DTBO_FOOTER_ARGS := BOARD_AVB_DTBO_ADD_HASH_FOOTER_ARGS
4323PVMFW_FOOTER_ARGS := BOARD_AVB_PVMFW_ADD_HASH_FOOTER_ARGS
4324SYSTEM_FOOTER_ARGS := BOARD_AVB_SYSTEM_ADD_HASHTREE_FOOTER_ARGS
4325VENDOR_FOOTER_ARGS := BOARD_AVB_VENDOR_ADD_HASHTREE_FOOTER_ARGS
4326RECOVERY_FOOTER_ARGS := BOARD_AVB_RECOVERY_ADD_HASH_FOOTER_ARGS
4327PRODUCT_FOOTER_ARGS := BOARD_AVB_PRODUCT_ADD_HASHTREE_FOOTER_ARGS
4328SYSTEM_EXT_FOOTER_ARGS := BOARD_AVB_SYSTEM_EXT_ADD_HASHTREE_FOOTER_ARGS
4329ODM_FOOTER_ARGS := BOARD_AVB_ODM_ADD_HASHTREE_FOOTER_ARGS
4330VENDOR_DLKM_FOOTER_ARGS := BOARD_AVB_VENDOR_DLKM_ADD_HASHTREE_FOOTER_ARGS
4331ODM_DLKM_FOOTER_ARGS := BOARD_AVB_ODM_DLKM_ADD_HASHTREE_FOOTER_ARGS
4332SYSTEM_DLKM_FOOTER_ARGS := BOARD_AVB_SYSTEM_DLKM_ADD_HASHTREE_FOOTER_ARGS
4333
4334# Helper function that checks and sets required build variables for an AVB chained partition.
4335# $(1): the partition to enable AVB chain, e.g., boot or system or vbmeta_system.
4336define _check-and-set-avb-chain-args
4337$(eval part := $(1))
4338$(eval PART=$(call to-upper,$(part)))
4339
4340$(eval _key_path := BOARD_AVB_$(PART)_KEY_PATH)
4341$(eval _signing_algorithm := BOARD_AVB_$(PART)_ALGORITHM)
4342$(eval _rollback_index := BOARD_AVB_$(PART)_ROLLBACK_INDEX)
4343$(eval _rollback_index_location := BOARD_AVB_$(PART)_ROLLBACK_INDEX_LOCATION)
4344$(if $($(_key_path)),,$(error $(_key_path) is not defined))
4345$(if $($(_signing_algorithm)),,$(error $(_signing_algorithm) is not defined))
4346$(if $($(_rollback_index)),,$(error $(_rollback_index) is not defined))
4347$(if $($(_rollback_index_location)),,$(error $(_rollback_index_location) is not defined))
4348
4349# Set INTERNAL_AVB_(PART)_SIGNING_ARGS
4350$(eval _signing_args := INTERNAL_AVB_$(PART)_SIGNING_ARGS)
4351$(eval $(_signing_args) := \
4352    --algorithm $($(_signing_algorithm)) --key $($(_key_path)))
4353
4354# The recovery partition in non-A/B devices should be verified separately. Skip adding the chain
4355# partition descriptor for recovery partition into vbmeta.img.
4356$(if $(or $(filter-out true,$(TARGET_OTA_ALLOW_NON_AB)),$(filter-out recovery,$(part))),\
4357    $(eval INTERNAL_AVB_MAKE_VBMETA_IMAGE_ARGS += \
4358        --chain_partition $(part):$($(_rollback_index_location)):$(AVB_CHAIN_KEY_DIR)/$(part).avbpubkey))
4359
4360# Set rollback_index via footer args for non-chained vbmeta image. Chained vbmeta image will pick up
4361# the index via a separate flag (e.g. BOARD_AVB_VBMETA_SYSTEM_ROLLBACK_INDEX).
4362$(if $(filter $(part),$(part:vbmeta_%=%)),\
4363    $(eval _footer_args := $(PART)_FOOTER_ARGS) \
4364    $(eval $($(_footer_args)) += --rollback_index $($(_rollback_index))))
4365endef
4366
4367# Checks and sets the required build variables for an AVB partition. The partition will be
4368# configured as a chained partition, if BOARD_AVB_<partition>_KEY_PATH is defined. Otherwise the
4369# image descriptor will be included into vbmeta.img, unless it has been already added to any chained
4370# VBMeta image.
4371# Multiple boot images can be generated based on BOARD_KERNEL_BINARIES
4372# but vbmeta would capture the image descriptor of only the first boot
4373# image specified in BUILT_BOOTIMAGE_TARGET.
4374# $(1): Partition name, e.g. boot or system.
4375define check-and-set-avb-args
4376$(eval _in_chained_vbmeta := $(filter $(1),$(INTERNAL_AVB_PARTITIONS_IN_CHAINED_VBMETA_IMAGES)))
4377$(if $(BOARD_AVB_$(call to-upper,$(1))_KEY_PATH),\
4378    $(if $(_in_chained_vbmeta),\
4379        $(error Chaining partition "$(1)" in chained VBMeta image is not supported)) \
4380    $(call _check-and-set-avb-chain-args,$(1)),\
4381    $(if $(_in_chained_vbmeta),,\
4382        $(if $(filter boot,$(1)),\
4383            $(eval INTERNAL_AVB_MAKE_VBMETA_IMAGE_ARGS += \
4384                --include_descriptors_from_image $(firstword $(call images-for-partitions,$(1)))),\
4385            $(eval INTERNAL_AVB_MAKE_VBMETA_IMAGE_ARGS += \
4386                --include_descriptors_from_image $(call images-for-partitions,$(1))))))
4387endef
4388
4389# Checks and sets build variables for a custom chained partition to include it into vbmeta.img.
4390# $(1): the custom partition to enable AVB chain.
4391define check-and-set-custom-avb-chain-args
4392$(eval part := $(1))
4393$(eval PART=$(call to-upper,$(part)))
4394$(eval _rollback_index_location := BOARD_AVB_$(PART)_ROLLBACK_INDEX_LOCATION)
4395$(if $($(_rollback_index_location)),,$(error $(_rollback_index_location) is not defined))
4396
4397INTERNAL_AVB_MAKE_VBMETA_IMAGE_ARGS += \
4398    --chain_partition $(part):$($(_rollback_index_location)):$(AVB_CHAIN_KEY_DIR)/$(part).avbpubkey
4399endef
4400
4401ifdef INSTALLED_BOOTIMAGE_TARGET
4402$(eval $(call check-and-set-avb-args,boot))
4403endif
4404
4405ifdef INSTALLED_INIT_BOOT_IMAGE_TARGET
4406$(eval $(call check-and-set-avb-args,init_boot))
4407endif
4408
4409ifdef INSTALLED_VENDOR_BOOTIMAGE_TARGET
4410$(eval $(call check-and-set-avb-args,vendor_boot))
4411endif
4412
4413ifdef INSTALLED_VENDOR_KERNEL_BOOTIMAGE_TARGET
4414$(eval $(call check-and-set-avb-args,vendor_kernel_boot))
4415endif
4416
4417ifdef INSTALLED_SYSTEMIMAGE_TARGET
4418$(eval $(call check-and-set-avb-args,system))
4419endif
4420
4421ifdef INSTALLED_VENDORIMAGE_TARGET
4422$(eval $(call check-and-set-avb-args,vendor))
4423endif
4424
4425ifdef INSTALLED_PRODUCTIMAGE_TARGET
4426$(eval $(call check-and-set-avb-args,product))
4427endif
4428
4429ifdef INSTALLED_SYSTEM_EXTIMAGE_TARGET
4430$(eval $(call check-and-set-avb-args,system_ext))
4431endif
4432
4433ifdef INSTALLED_ODMIMAGE_TARGET
4434$(eval $(call check-and-set-avb-args,odm))
4435endif
4436
4437ifdef INSTALLED_VENDOR_DLKMIMAGE_TARGET
4438$(eval $(call check-and-set-avb-args,vendor_dlkm))
4439endif
4440
4441ifdef INSTALLED_ODM_DLKMIMAGE_TARGET
4442$(eval $(call check-and-set-avb-args,odm_dlkm))
4443endif
4444
4445ifdef INSTALLED_SYSTEM_DLKMIMAGE_TARGET
4446$(eval $(call check-and-set-avb-args,system_dlkm))
4447endif
4448
4449ifdef INSTALLED_DTBOIMAGE_TARGET
4450$(eval $(call check-and-set-avb-args,dtbo))
4451endif
4452
4453ifdef INSTALLED_PVMFWIMAGE_TARGET
4454$(eval $(call check-and-set-avb-args,pvmfw))
4455endif
4456
4457ifdef INSTALLED_RECOVERYIMAGE_TARGET
4458$(eval $(call check-and-set-avb-args,recovery))
4459endif
4460
4461# Not using INSTALLED_VBMETA_SYSTEMIMAGE_TARGET as it won't be set yet.
4462ifdef BOARD_AVB_VBMETA_SYSTEM
4463$(eval $(call check-and-set-avb-args,vbmeta_system))
4464endif
4465
4466ifdef BOARD_AVB_VBMETA_VENDOR
4467$(eval $(call check-and-set-avb-args,vbmeta_vendor))
4468endif
4469
4470ifdef BOARD_AVB_VBMETA_CUSTOM_PARTITIONS
4471$(foreach partition,$(BOARD_AVB_VBMETA_CUSTOM_PARTITIONS),$(eval $(call check-and-set-avb-args,vbmeta_$(partition))))
4472$(foreach partition,$(BOARD_AVB_VBMETA_CUSTOM_PARTITIONS),$(eval BOARD_AVB_MAKE_VBMETA_$(call to-upper,$(partition))_IMAGE_ARGS += --padding_size 4096))
4473endif
4474
4475ifneq ($(strip $(BOARD_CUSTOMIMAGES_PARTITION_LIST)),)
4476$(foreach partition,$(BOARD_CUSTOMIMAGES_PARTITION_LIST), \
4477    $(eval $(call check-and-set-custom-avb-chain-args,$(partition))))
4478endif
4479
4480BOARD_AVB_MAKE_VBMETA_IMAGE_ARGS += --padding_size 4096
4481BOARD_AVB_MAKE_VBMETA_SYSTEM_IMAGE_ARGS += --padding_size 4096
4482BOARD_AVB_MAKE_VBMETA_VENDOR_IMAGE_ARGS += --padding_size 4096
4483
4484ifeq (eng,$(filter eng, $(TARGET_BUILD_VARIANT)))
4485# We only need the flag in top-level vbmeta.img.
4486BOARD_AVB_MAKE_VBMETA_IMAGE_ARGS += --set_hashtree_disabled_flag
4487endif
4488
4489ifdef BOARD_AVB_ROLLBACK_INDEX
4490BOARD_AVB_MAKE_VBMETA_IMAGE_ARGS += --rollback_index $(BOARD_AVB_ROLLBACK_INDEX)
4491endif
4492
4493ifdef BOARD_AVB_VBMETA_SYSTEM_ROLLBACK_INDEX
4494BOARD_AVB_MAKE_VBMETA_SYSTEM_IMAGE_ARGS += \
4495    --rollback_index $(BOARD_AVB_VBMETA_SYSTEM_ROLLBACK_INDEX)
4496endif
4497
4498ifdef BOARD_AVB_VBMETA_VENDOR_ROLLBACK_INDEX
4499BOARD_AVB_MAKE_VBMETA_VENDOR_IMAGE_ARGS += \
4500    --rollback_index $(BOARD_AVB_VBMETA_VENDOR_ROLLBACK_INDEX)
4501endif
4502
4503ifdef BOARD_AVB_VBMETA_CUSTOM_PARTITIONS
4504  $(foreach partition,$(call to-upper,$(BOARD_AVB_VBMETA_CUSTOM_PARTITIONS)), \
4505      $(if $(BOARD_AVB_VBMETA_$(partition)_ROLLBACK_INDEX),$(eval \
4506        BOARD_AVB_MAKE_VBMETA_$(partition)_IMAGE_ARGS += \
4507          --rollback_index $(BOARD_AVB_VBMETA_$(partition)_ROLLBACK_INDEX))))
4508endif
4509
4510# $(1): the directory to extract public keys to
4511define extract-avb-chain-public-keys
4512  $(if $(BOARD_AVB_BOOT_KEY_PATH),\
4513    $(hide) $(AVBTOOL) extract_public_key --key $(BOARD_AVB_BOOT_KEY_PATH) \
4514      --output $(1)/boot.avbpubkey)
4515  $(if $(BOARD_AVB_INIT_BOOT_KEY_PATH),\
4516    $(hide) $(AVBTOOL) extract_public_key --key $(BOARD_AVB_INIT_BOOT_KEY_PATH) \
4517      --output $(1)/init_boot.avbpubkey)
4518  $(if $(BOARD_AVB_VENDOR_BOOT_KEY_PATH),\
4519    $(AVBTOOL) extract_public_key --key $(BOARD_AVB_VENDOR_BOOT_KEY_PATH) \
4520      --output $(1)/vendor_boot.avbpubkey)
4521  $(if $(BOARD_AVB_VENDOR_KERNEL_BOOT_KEY_PATH),\
4522    $(AVBTOOL) extract_public_key --key $(BOARD_AVB_VENDOR_KERNEL_BOOT_KEY_PATH) \
4523      --output $(1)/vendor_kernel_boot.avbpubkey)
4524  $(if $(BOARD_AVB_SYSTEM_KEY_PATH),\
4525    $(hide) $(AVBTOOL) extract_public_key --key $(BOARD_AVB_SYSTEM_KEY_PATH) \
4526      --output $(1)/system.avbpubkey)
4527  $(if $(BOARD_AVB_VENDOR_KEY_PATH),\
4528    $(hide) $(AVBTOOL) extract_public_key --key $(BOARD_AVB_VENDOR_KEY_PATH) \
4529      --output $(1)/vendor.avbpubkey)
4530  $(if $(BOARD_AVB_PRODUCT_KEY_PATH),\
4531    $(hide) $(AVBTOOL) extract_public_key --key $(BOARD_AVB_PRODUCT_KEY_PATH) \
4532      --output $(1)/product.avbpubkey)
4533  $(if $(BOARD_AVB_SYSTEM_EXT_KEY_PATH),\
4534    $(hide) $(AVBTOOL) extract_public_key --key $(BOARD_AVB_SYSTEM_EXT_KEY_PATH) \
4535      --output $(1)/system_ext.avbpubkey)
4536  $(if $(BOARD_AVB_ODM_KEY_PATH),\
4537    $(hide) $(AVBTOOL) extract_public_key --key $(BOARD_AVB_ODM_KEY_PATH) \
4538      --output $(1)/odm.avbpubkey)
4539  $(if $(BOARD_AVB_VENDOR_DLKM_KEY_PATH),\
4540    $(hide) $(AVBTOOL) extract_public_key --key $(BOARD_AVB_VENDOR_DLKM_KEY_PATH) \
4541      --output $(1)/vendor_dlkm.avbpubkey)
4542  $(if $(BOARD_AVB_ODM_DLKM_KEY_PATH),\
4543    $(hide) $(AVBTOOL) extract_public_key --key $(BOARD_AVB_ODM_DLKM_KEY_PATH) \
4544      --output $(1)/odm_dlkm.avbpubkey)
4545  $(if $(BOARD_AVB_SYSTEM_DLKM_KEY_PATH),\
4546    $(hide) $(AVBTOOL) extract_public_key --key $(BOARD_AVB_SYSTEM_DLKM_KEY_PATH) \
4547      --output $(1)/system_dlkm.avbpubkey)
4548  $(if $(BOARD_AVB_DTBO_KEY_PATH),\
4549    $(hide) $(AVBTOOL) extract_public_key --key $(BOARD_AVB_DTBO_KEY_PATH) \
4550      --output $(1)/dtbo.avbpubkey)
4551  $(if $(BOARD_AVB_PVMFW_KEY_PATH),\
4552    $(hide) $(AVBTOOL) extract_public_key --key $(BOARD_AVB_PVMFW_KEY_PATH) \
4553      --output $(1)/pvmfw.avbpubkey)
4554  $(if $(BOARD_AVB_RECOVERY_KEY_PATH),\
4555    $(hide) $(AVBTOOL) extract_public_key --key $(BOARD_AVB_RECOVERY_KEY_PATH) \
4556      --output $(1)/recovery.avbpubkey)
4557  $(if $(BOARD_AVB_VBMETA_SYSTEM_KEY_PATH),\
4558    $(hide) $(AVBTOOL) extract_public_key --key $(BOARD_AVB_VBMETA_SYSTEM_KEY_PATH) \
4559        --output $(1)/vbmeta_system.avbpubkey)
4560  $(if $(BOARD_AVB_VBMETA_VENDOR_KEY_PATH),\
4561    $(hide) $(AVBTOOL) extract_public_key --key $(BOARD_AVB_VBMETA_VENDOR_KEY_PATH) \
4562        --output $(1)/vbmeta_vendor.avbpubkey)
4563  $(if $(BOARD_CUSTOMIMAGES_PARTITION_LIST),\
4564    $(hide) $(foreach partition,$(BOARD_CUSTOMIMAGES_PARTITION_LIST), \
4565        $(AVBTOOL) extract_public_key --key $(BOARD_AVB_$(call to-upper,$(partition))_KEY_PATH) \
4566            --output $(1)/$(partition).avbpubkey;)) \
4567  $(if $(BOARD_AVB_VBMETA_CUSTOM_PARTITIONS),\
4568    $(hide) $(foreach partition,$(BOARD_AVB_VBMETA_CUSTOM_PARTITIONS), \
4569        $(AVBTOOL) extract_public_key --key $(BOARD_AVB_VBMETA_$(call to-upper,$(partition))_KEY_PATH) \
4570            --output $(1)/vbmeta_$(partition).avbpubkey;))
4571endef
4572
4573# Builds a chained VBMeta image. This VBMeta image will contain the descriptors for the partitions
4574# specified in BOARD_AVB_VBMETA_<NAME>. The built VBMeta image will be included into the top-level
4575# vbmeta image as a chained partition. For example, if a target defines `BOARD_AVB_VBMETA_SYSTEM
4576# := system system_ext`, `vbmeta_system.img` will be created that includes the descriptors for
4577# `system.img` and `system_ext.img`. `vbmeta_system.img` itself will be included into
4578# `vbmeta.img` as a chained partition.
4579# $(1): VBMeta image name, such as "vbmeta_system", "vbmeta_vendor" etc.
4580# $(2): Output filename.
4581define build-chained-vbmeta-image
4582	$(call pretty,"Target chained vbmeta image: $@")
4583	$(hide) $(AVBTOOL) make_vbmeta_image \
4584	    $(INTERNAL_AVB_$(call to-upper,$(1))_SIGNING_ARGS) \
4585	    $(BOARD_AVB_MAKE_$(call to-upper,$(1))_IMAGE_ARGS) \
4586	    $(foreach image,$(BOARD_AVB_$(call to-upper,$(1))), \
4587	        --include_descriptors_from_image $(call images-for-partitions,$(image))) \
4588	    --output $@
4589endef
4590
4591ifdef BUILDING_SYSTEM_IMAGE
4592ifdef BOARD_AVB_VBMETA_SYSTEM
4593INSTALLED_VBMETA_SYSTEMIMAGE_TARGET := $(PRODUCT_OUT)/vbmeta_system.img
4594$(INSTALLED_VBMETA_SYSTEMIMAGE_TARGET): \
4595	    $(AVBTOOL) \
4596	    $(call images-for-partitions,$(BOARD_AVB_VBMETA_SYSTEM)) \
4597	    $(BOARD_AVB_VBMETA_SYSTEM_KEY_PATH)
4598	$(call build-chained-vbmeta-image,vbmeta_system)
4599
4600$(call declare-1p-container,$(INSTALLED_VBMETA_SYSTEMIMAGE_TARGET),)
4601
4602SYSTEM_NOTICE_DEPS += $(INSTALLED_VBMETA_SYSTEMIMAGE_TARGET)
4603endif
4604endif # BUILDING_SYSTEM_IMAGE
4605
4606ifdef BOARD_AVB_VBMETA_VENDOR
4607INSTALLED_VBMETA_VENDORIMAGE_TARGET := $(PRODUCT_OUT)/vbmeta_vendor.img
4608$(INSTALLED_VBMETA_VENDORIMAGE_TARGET): \
4609	    $(AVBTOOL) \
4610	    $(call images-for-partitions,$(BOARD_AVB_VBMETA_VENDOR)) \
4611	    $(BOARD_AVB_VBMETA_VENDOR_KEY_PATH)
4612	$(call build-chained-vbmeta-image,vbmeta_vendor)
4613
4614$(call declare-1p-container,$(INSTALLED_VBMETA_VENDORIMAGE_TARGET),)
4615
4616UNMOUNTED_NOTICE_VENDOR_DEPS += $(INSTALLED_VBMETA_VENDORIMAGE_TARGET)
4617endif
4618
4619ifdef BOARD_AVB_VBMETA_CUSTOM_PARTITIONS
4620define declare-custom-vbmeta-target
4621INSTALLED_VBMETA_$(call to-upper,$(1))IMAGE_TARGET := $(PRODUCT_OUT)/vbmeta_$(call to-lower,$(1)).img
4622$$(INSTALLED_VBMETA_$(call to-upper,$(1))IMAGE_TARGET): \
4623	    $(AVBTOOL) \
4624	    $(call images-for-partitions,$(BOARD_AVB_VBMETA_$(call to-upper,$(1)))) \
4625	    $(BOARD_AVB_VBMETA_$(call to-upper,$(1))_KEY_PATH)
4626	$$(call build-chained-vbmeta-image,vbmeta_$(call to-lower,$(1)))
4627
4628$(call declare-1p-container,$(INSTALLED_VBMETA_$(call to-upper,$(1))IMAGE_TARGET),)
4629
4630UNMOUNTED_NOTICE_VENDOR_DEPS += $(INSTALLED_VBMETA_$(call to-upper,$(1))IMAGE_TARGET)
4631endef
4632
4633$(foreach partition,\
4634          $(call to-upper,$(BOARD_AVB_VBMETA_CUSTOM_PARTITIONS)),\
4635          $(eval $(call declare-custom-vbmeta-target,$(partition))))
4636endif
4637
4638define build-vbmetaimage-target
4639  $(call pretty,"Target vbmeta image: $(INSTALLED_VBMETAIMAGE_TARGET)")
4640  $(hide) mkdir -p $(AVB_CHAIN_KEY_DIR)
4641  $(call extract-avb-chain-public-keys, $(AVB_CHAIN_KEY_DIR))
4642  $(hide) $(AVBTOOL) make_vbmeta_image \
4643    $(INTERNAL_AVB_MAKE_VBMETA_IMAGE_ARGS) \
4644    $(PRIVATE_AVB_VBMETA_SIGNING_ARGS) \
4645    $(BOARD_AVB_MAKE_VBMETA_IMAGE_ARGS) \
4646    --output $@
4647  $(hide) rm -rf $(AVB_CHAIN_KEY_DIR)
4648endef
4649
4650ifdef BUILDING_VBMETA_IMAGE
4651INSTALLED_VBMETAIMAGE_TARGET := $(BUILT_VBMETAIMAGE_TARGET)
4652$(INSTALLED_VBMETAIMAGE_TARGET): PRIVATE_AVB_VBMETA_SIGNING_ARGS := \
4653    --algorithm $(BOARD_AVB_ALGORITHM) --key $(BOARD_AVB_KEY_PATH)
4654
4655
4656$(INSTALLED_VBMETAIMAGE_TARGET): \
4657	    $(AVBTOOL) \
4658	    $(INSTALLED_BOOTIMAGE_TARGET) \
4659	    $(INSTALLED_INIT_BOOT_IMAGE_TARGET) \
4660	    $(INSTALLED_VENDOR_BOOTIMAGE_TARGET) \
4661	    $(INSTALLED_VENDOR_KERNEL_BOOTIMAGE_TARGET) \
4662	    $(INSTALLED_SYSTEMIMAGE_TARGET) \
4663	    $(INSTALLED_VENDORIMAGE_TARGET) \
4664	    $(INSTALLED_PRODUCTIMAGE_TARGET) \
4665	    $(INSTALLED_SYSTEM_EXTIMAGE_TARGET) \
4666	    $(INSTALLED_ODMIMAGE_TARGET) \
4667	    $(INSTALLED_VENDOR_DLKMIMAGE_TARGET) \
4668	    $(INSTALLED_ODM_DLKMIMAGE_TARGET) \
4669	    $(INSTALLED_SYSTEM_DLKMIMAGE_TARGET) \
4670	    $(INSTALLED_DTBOIMAGE_TARGET) \
4671	    $(INSTALLED_PVMFWIMAGE_TARGET) \
4672	    $(INSTALLED_CUSTOMIMAGES_TARGET) \
4673	    $(INSTALLED_RECOVERYIMAGE_TARGET) \
4674	    $(INSTALLED_VBMETA_SYSTEMIMAGE_TARGET) \
4675	    $(INSTALLED_VBMETA_VENDORIMAGE_TARGET) \
4676      $(foreach partition,$(call to-upper,$(BOARD_AVB_VBMETA_CUSTOM_PARTITIONS)),$(INSTALLED_VBMETA_$(partition)IMAGE_TARGET)) \
4677	    $(BOARD_AVB_VBMETA_SYSTEM_KEY_PATH) \
4678	    $(BOARD_AVB_VBMETA_VENDOR_KEY_PATH) \
4679      $(foreach partition,$(call to-upper,$(BOARD_AVB_VBMETA_CUSTOM_PARTITIONS)),$(BOARD_AVB_VBMETA_$(partition)_KEY_PATH)) \
4680	    $(BOARD_AVB_KEY_PATH)
4681	$(build-vbmetaimage-target)
4682
4683$(call declare-1p-container,$(INSTALLED_VBMETAIMAGE_TARGET),)
4684
4685UNMOUNTED_NOTICE_DEPS += $(INSTALLED_VBMETAIMAGE_TARGET)
4686
4687.PHONY: vbmetaimage-nodeps
4688vbmetaimage-nodeps: PRIVATE_AVB_VBMETA_SIGNING_ARGS := \
4689    --algorithm $(BOARD_AVB_ALGORITHM) --key $(BOARD_AVB_KEY_PATH)
4690vbmetaimage-nodeps:
4691	$(build-vbmetaimage-target)
4692endif # BUILDING_VBMETA_IMAGE
4693
4694endif # BOARD_AVB_ENABLE
4695
4696# List of files from all images
4697INTERNAL_ALLIMAGES_FILES := \
4698    $(FULL_SYSTEMIMAGE_DEPS) \
4699    $(INTERNAL_RAMDISK_FILES) \
4700    $(INTERNAL_USERDATAIMAGE_FILES) \
4701    $(INTERNAL_VENDORIMAGE_FILES) \
4702    $(INTERNAL_PRODUCTIMAGE_FILES) \
4703    $(INTERNAL_SYSTEM_EXTIMAGE_FILES) \
4704    $(INTERNAL_ODMIMAGE_FILES) \
4705    $(INTERNAL_VENDOR_DLKMIMAGE_FILES) \
4706    $(INTERNAL_ODM_DLKMIMAGE_FILES) \
4707    $(INTERNAL_SYSTEM_DLKMIMAGE_FILES) \
4708    $(INTERNAL_PVMFWIMAGE_FILES) \
4709
4710# -----------------------------------------------------------------
4711# Check VINTF of build
4712
4713# Note: vendor_dlkm, odm_dlkm, and system_dlkm does not have VINTF files.
4714ifeq (,$(TARGET_BUILD_UNBUNDLED))
4715
4716intermediates := $(call intermediates-dir-for,PACKAGING,check_vintf_all)
4717check_vintf_all_deps :=
4718
4719APEX_OUT := $(PRODUCT_OUT)/apex
4720# -----------------------------------------------------------------
4721# Create apex-info-file.xml
4722
4723apex_dirs := \
4724  $(TARGET_OUT)/apex/% \
4725  $(TARGET_OUT_SYSTEM_EXT)/apex/% \
4726  $(TARGET_OUT_VENDOR)/apex/% \
4727  $(TARGET_OUT_ODM)/apex/% \
4728  $(TARGET_OUT_PRODUCT)/apex/% \
4729
4730apex_files := $(sort $(filter $(apex_dirs), $(INTERNAL_ALLIMAGES_FILES)))
4731APEX_INFO_FILE := $(APEX_OUT)/apex-info-list.xml
4732
4733# dump_apex_info scans $(PRODUCT_OUT)/apex and writes apex-info-list.xml there.
4734# This relies on the fact that rules for .apex files install the contents in $(PRODUCT_OUT)/apex.
4735$(APEX_INFO_FILE): $(HOST_OUT_EXECUTABLES)/dump_apex_info $(apex_files)
4736	@echo "Creating apex-info-file in $(PRODUCT_OUT) "
4737	$< --root_dir $(PRODUCT_OUT)
4738
4739apex_files :=
4740apex_dirs :=
4741
4742# The build system only writes VINTF metadata to */etc/vintf paths. Legacy paths aren't needed here
4743# because they are only used for prebuilt images.
4744# APEX files in /vendor/apex can have VINTF fragments as well.
4745check_vintf_common_srcs_patterns := \
4746  $(TARGET_OUT)/etc/vintf/% \
4747  $(TARGET_OUT_VENDOR)/etc/vintf/% \
4748  $(TARGET_OUT_ODM)/etc/vintf/% \
4749  $(TARGET_OUT_PRODUCT)/etc/vintf/% \
4750  $(TARGET_OUT_SYSTEM_EXT)/etc/vintf/% \
4751  $(TARGET_OUT_VENDOR)/apex/% \
4752
4753check_vintf_common_srcs := $(sort $(filter $(check_vintf_common_srcs_patterns),$(INTERNAL_ALLIMAGES_FILES)))
4754check_vintf_common_srcs_patterns :=
4755
4756check_vintf_has_system :=
4757check_vintf_has_vendor :=
4758
4759ifneq (,$(filter EMPTY_ODM_SKU_PLACEHOLDER,$(ODM_MANIFEST_SKUS)))
4760$(error EMPTY_ODM_SKU_PLACEHOLDER is an internal variable and cannot be used for ODM_MANIFEST_SKUS)
4761endif
4762ifneq (,$(filter EMPTY_VENDOR_SKU_PLACEHOLDER,$(DEVICE_MANIFEST_SKUS)))
4763$(error EMPTY_VENDOR_SKU_PLACEHOLDER is an internal variable and cannot be used for DEIVCE_MANIFEST_SKUS)
4764endif
4765
4766# -- Check system manifest / matrix including fragments (excluding other framework manifests / matrices, e.g. product);
4767check_vintf_system_deps := $(filter $(TARGET_OUT)/etc/vintf/%, $(check_vintf_common_srcs))
4768ifneq ($(check_vintf_system_deps),)
4769check_vintf_has_system := true
4770
4771check_vintf_system_log := $(intermediates)/check_vintf_system.log
4772check_vintf_all_deps += $(check_vintf_system_log)
4773$(check_vintf_system_log): $(HOST_OUT_EXECUTABLES)/checkvintf $(check_vintf_system_deps)
4774	@( $< --check-one --dirmap /system:$(TARGET_OUT) > $@ 2>&1 ) || ( cat $@ && exit 1 )
4775$(call declare-1p-target,$(check_vintf_system_log))
4776check_vintf_system_log :=
4777
4778# -- Check framework manifest against frozen manifests for GSI targets. They need to be compatible.
4779ifneq (true, $(BUILDING_VENDOR_IMAGE))
4780    vintffm_log := $(intermediates)/vintffm.log
4781endif
4782check_vintf_all_deps += $(vintffm_log)
4783$(vintffm_log): $(HOST_OUT_EXECUTABLES)/vintffm $(check_vintf_system_deps)
4784	@( $< --check --dirmap /system:$(TARGET_OUT) \
4785	  $(VINTF_FRAMEWORK_MANIFEST_FROZEN_DIR) > $@ 2>&1 ) || ( cat $@ && exit 1 )
4786
4787$(call declare-1p-target,$(vintffm_log))
4788
4789endif # check_vintf_system_deps
4790check_vintf_system_deps :=
4791
4792# -- Check vendor manifest / matrix including fragments (excluding other device manifests / matrices)
4793check_vintf_vendor_deps := $(filter $(TARGET_OUT_VENDOR)/etc/vintf/%, $(check_vintf_common_srcs))
4794check_vintf_vendor_deps += $(filter $(TARGET_OUT_VENDOR)/apex/%, $(check_vintf_common_srcs))
4795ifneq ($(strip $(check_vintf_vendor_deps)),)
4796check_vintf_has_vendor := true
4797check_vintf_vendor_log := $(intermediates)/check_vintf_vendor.log
4798check_vintf_all_deps += $(check_vintf_vendor_log)
4799# Check vendor SKU=(empty) case when:
4800# - DEVICE_MANIFEST_FILE is not empty; OR
4801# - DEVICE_MANIFEST_FILE is empty AND DEVICE_MANIFEST_SKUS is empty (only vendor manifest fragments are used)
4802$(check_vintf_vendor_log): PRIVATE_VENDOR_SKUS := \
4803  $(if $(DEVICE_MANIFEST_FILE),EMPTY_VENDOR_SKU_PLACEHOLDER,\
4804    $(if $(DEVICE_MANIFEST_SKUS),,EMPTY_VENDOR_SKU_PLACEHOLDER)) \
4805  $(DEVICE_MANIFEST_SKUS)
4806$(check_vintf_vendor_log): $(HOST_OUT_EXECUTABLES)/checkvintf $(check_vintf_vendor_deps) $(APEX_INFO_FILE)
4807	$(foreach vendor_sku,$(PRIVATE_VENDOR_SKUS), \
4808	  ( $< --check-one --dirmap /vendor:$(TARGET_OUT_VENDOR) --dirmap /apex:$(APEX_OUT) \
4809	       --property ro.boot.product.vendor.sku=$(filter-out EMPTY_VENDOR_SKU_PLACEHOLDER,$(vendor_sku)) \
4810	       > $@ 2>&1 ) || ( cat $@ && exit 1 ); )
4811$(call declare-1p-target,$(check_vintf_vendor_log))
4812check_vintf_vendor_log :=
4813endif # check_vintf_vendor_deps
4814check_vintf_vendor_deps :=
4815
4816# -- Kernel version and configurations.
4817ifeq ($(PRODUCT_OTA_ENFORCE_VINTF_KERNEL_REQUIREMENTS),true)
4818
4819BUILT_KERNEL_CONFIGS_FILE := $(intermediates)/kernel_configs.txt
4820BUILT_KERNEL_VERSION_FILE := $(intermediates)/kernel_version.txt
4821
4822my_board_extracted_kernel :=
4823
4824# BOARD_KERNEL_CONFIG_FILE and BOARD_KERNEL_VERSION can be used to override the values extracted
4825# from INSTALLED_KERNEL_TARGET.
4826ifdef BOARD_KERNEL_CONFIG_FILE
4827ifdef BOARD_KERNEL_VERSION
4828$(BUILT_KERNEL_CONFIGS_FILE): $(BOARD_KERNEL_CONFIG_FILE)
4829	cp $< $@
4830$(BUILT_KERNEL_VERSION_FILE):
4831	echo $(BOARD_KERNEL_VERSION) > $@
4832
4833$(call declare-license-metadata,$(BUILT_KERNEL_CONFIGS_FILE),SPDX-license-identifier-GPL-2.0-only,restricted,$(BUILD_SYSTEM)/LINUX_KERNEL_COPYING,"Kernel",kernel)
4834$(call declare-license-metadata,$(BUILT_KERNEL_VERSION_FILE),SPDX-license-identifier-GPL-2.0-only,restricted,$(BUILD_SYSTEM)/LINUX_KERNEL_COPYING,"Kernel",kernel)
4835
4836my_board_extracted_kernel := true
4837endif # BOARD_KERNEL_VERSION
4838endif # BOARD_KERNEL_CONFIG_FILE
4839
4840ifneq ($(my_board_extracted_kernel),true)
4841# Tools for decompression that is not in PATH.
4842# Check $(EXTRACT_KERNEL) for decompression algorithms supported by the script.
4843# Algorithms that are in the script but not in this list will be found in PATH.
4844my_decompress_tools := \
4845    lz4:$(HOST_OUT_EXECUTABLES)/lz4 \
4846
4847endif # my_board_extracted_kernel
4848
4849ifneq ($(my_board_extracted_kernel),true)
4850ifdef INSTALLED_KERNEL_TARGET
4851$(BUILT_KERNEL_CONFIGS_FILE): .KATI_IMPLICIT_OUTPUTS := $(BUILT_KERNEL_VERSION_FILE)
4852$(BUILT_KERNEL_CONFIGS_FILE): PRIVATE_DECOMPRESS_TOOLS := $(my_decompress_tools)
4853$(BUILT_KERNEL_CONFIGS_FILE): $(foreach pair,$(my_decompress_tools),$(call word-colon,2,$(pair)))
4854$(BUILT_KERNEL_CONFIGS_FILE): $(EXTRACT_KERNEL) $(firstword $(INSTALLED_KERNEL_TARGET))
4855	$< --tools $(PRIVATE_DECOMPRESS_TOOLS) --input $(firstword $(INSTALLED_KERNEL_TARGET)) \
4856	  --output-configs $@ \
4857	  --output-release $(BUILT_KERNEL_VERSION_FILE)
4858
4859$(call declare-license-metadata,$(BUILT_KERNEL_CONFIGS_FILE),SPDX-license-identifier-GPL-2.0-only,restricted,$(BUILD_SYSTEM)/LINUX_KERNEL_COPYING,"Kernel",kernel)
4860
4861my_board_extracted_kernel := true
4862endif # INSTALLED_KERNEL_TARGET
4863endif # my_board_extracted_kernel
4864
4865ifneq ($(my_board_extracted_kernel),true)
4866ifdef INSTALLED_BOOTIMAGE_TARGET
4867$(BUILT_KERNEL_CONFIGS_FILE): .KATI_IMPLICIT_OUTPUTS := $(BUILT_KERNEL_VERSION_FILE)
4868$(BUILT_KERNEL_CONFIGS_FILE): PRIVATE_DECOMPRESS_TOOLS := $(my_decompress_tools)
4869$(BUILT_KERNEL_CONFIGS_FILE): $(foreach pair,$(my_decompress_tools),$(call word-colon,2,$(pair)))
4870$(BUILT_KERNEL_CONFIGS_FILE): PRIVATE_UNPACKED_BOOTIMG := $(intermediates)/unpacked_bootimage
4871$(BUILT_KERNEL_CONFIGS_FILE): \
4872        $(HOST_OUT_EXECUTABLES)/unpack_bootimg \
4873        $(EXTRACT_KERNEL) \
4874        $(INSTALLED_BOOTIMAGE_TARGET)
4875	$(HOST_OUT_EXECUTABLES)/unpack_bootimg --boot_img $(INSTALLED_BOOTIMAGE_TARGET) --out $(PRIVATE_UNPACKED_BOOTIMG)
4876	$(EXTRACT_KERNEL) --tools $(PRIVATE_DECOMPRESS_TOOLS) --input $(PRIVATE_UNPACKED_BOOTIMG)/kernel \
4877	  --output-configs $@ \
4878	  --output-release $(BUILT_KERNEL_VERSION_FILE)
4879
4880$(call declare-license-metadata,$(BUILT_KERNEL_CONFIGS_FILE),SPDX-license-identifier-GPL-2.0-only,restricted,$(BUILD_SYSTEM)/LINUX_KERNEL_COPYING,"Kernel",kernel)
4881
4882my_board_extracted_kernel := true
4883endif # INSTALLED_BOOTIMAGE_TARGET
4884endif # my_board_extracted_kernel
4885
4886ifeq ($(my_board_extracted_kernel),true)
4887$(call dist-for-goals, droid_targets, $(BUILT_KERNEL_VERSION_FILE))
4888else
4889$(warning Neither INSTALLED_KERNEL_TARGET nor INSTALLED_BOOTIMAGE_TARGET is defined when \
4890    PRODUCT_OTA_ENFORCE_VINTF_KERNEL_REQUIREMENTS  is true. Information about the updated kernel \
4891    cannot be built into OTA update package. You can fix this by: \
4892    (1) setting TARGET_NO_KERNEL to false and installing the built kernel to $(PRODUCT_OUT)/kernel,\
4893        so that kernel information will be extracted from the built kernel; or \
4894    (2) Add a prebuilt boot image and specify it in BOARD_PREBUILT_BOOTIMAGE; or \
4895    (3) extracting kernel configuration and defining BOARD_KERNEL_CONFIG_FILE and \
4896        BOARD_KERNEL_VERSION manually; or \
4897    (4) unsetting PRODUCT_OTA_ENFORCE_VINTF_KERNEL_REQUIREMENTS manually.)
4898# Clear their values to indicate that these two files does not exist.
4899BUILT_KERNEL_CONFIGS_FILE :=
4900BUILT_KERNEL_VERSION_FILE :=
4901endif
4902
4903my_decompress_tools :=
4904my_board_extracted_kernel :=
4905
4906endif # PRODUCT_OTA_ENFORCE_VINTF_KERNEL_REQUIREMENTS
4907
4908# -- Check VINTF compatibility of build.
4909# Skip partial builds; only check full builds. Only check if:
4910# - PRODUCT_ENFORCE_VINTF_MANIFEST is true
4911# - system / vendor VINTF metadata exists
4912# - Building product / system_ext / odm images if board has product / system_ext / odm images
4913ifeq ($(PRODUCT_ENFORCE_VINTF_MANIFEST),true)
4914ifeq ($(check_vintf_has_system),true)
4915ifeq ($(check_vintf_has_vendor),true)
4916ifeq ($(filter true,$(BUILDING_ODM_IMAGE)),$(filter true,$(BOARD_USES_ODMIMAGE)))
4917ifeq ($(filter true,$(BUILDING_PRODUCT_IMAGE)),$(filter true,$(BOARD_USES_PRODUCTIMAGE)))
4918ifeq ($(filter true,$(BUILDING_SYSTEM_EXT_IMAGE)),$(filter true,$(BOARD_USES_SYSTEM_EXTIMAGE)))
4919
4920check_vintf_compatible_log := $(intermediates)/check_vintf_compatible.log
4921check_vintf_all_deps += $(check_vintf_compatible_log)
4922
4923check_vintf_compatible_args :=
4924check_vintf_compatible_deps := $(check_vintf_common_srcs) $(APEX_INFO_FILE)
4925
4926ifeq ($(PRODUCT_OTA_ENFORCE_VINTF_KERNEL_REQUIREMENTS),true)
4927ifneq (,$(BUILT_KERNEL_VERSION_FILE)$(BUILT_KERNEL_CONFIGS_FILE))
4928check_vintf_compatible_args += --kernel $(BUILT_KERNEL_VERSION_FILE):$(BUILT_KERNEL_CONFIGS_FILE)
4929check_vintf_compatible_deps += $(BUILT_KERNEL_CONFIGS_FILE) $(BUILT_KERNEL_VERSION_FILE)
4930endif # BUILT_KERNEL_VERSION_FILE != "" || BUILT_KERNEL_CONFIGS_FILE != ""
4931endif # PRODUCT_OTA_ENFORCE_VINTF_KERNEL_REQUIREMENTS
4932
4933check_vintf_compatible_args += \
4934  --dirmap /system:$(TARGET_OUT) \
4935  --dirmap /vendor:$(TARGET_OUT_VENDOR) \
4936  --dirmap /odm:$(TARGET_OUT_ODM) \
4937  --dirmap /product:$(TARGET_OUT_PRODUCT) \
4938  --dirmap /system_ext:$(TARGET_OUT_SYSTEM_EXT) \
4939  --dirmap /apex:$(APEX_OUT) \
4940
4941ifdef PRODUCT_SHIPPING_API_LEVEL
4942check_vintf_compatible_args += --property ro.product.first_api_level=$(PRODUCT_SHIPPING_API_LEVEL)
4943endif # PRODUCT_SHIPPING_API_LEVEL
4944
4945$(check_vintf_compatible_log): PRIVATE_CHECK_VINTF_ARGS := $(check_vintf_compatible_args)
4946$(check_vintf_compatible_log): PRIVATE_CHECK_VINTF_DEPS := $(check_vintf_compatible_deps)
4947# Check ODM SKU=(empty) case when:
4948# - ODM_MANIFEST_FILES is not empty; OR
4949# - ODM_MANIFEST_FILES is empty AND ODM_MANIFEST_SKUS is empty (only ODM manifest fragments are used)
4950$(check_vintf_compatible_log): PRIVATE_ODM_SKUS := \
4951  $(if $(ODM_MANIFEST_FILES),EMPTY_ODM_SKU_PLACEHOLDER,\
4952    $(if $(ODM_MANIFEST_SKUS),,EMPTY_ODM_SKU_PLACEHOLDER)) \
4953  $(ODM_MANIFEST_SKUS)
4954# Check vendor SKU=(empty) case when:
4955# - DEVICE_MANIFEST_FILE is not empty; OR
4956# - DEVICE_MANIFEST_FILE is empty AND DEVICE_MANIFEST_SKUS is empty (only vendor manifest fragments are used)
4957$(check_vintf_compatible_log): PRIVATE_VENDOR_SKUS := \
4958  $(if $(DEVICE_MANIFEST_FILE),EMPTY_VENDOR_SKU_PLACEHOLDER,\
4959    $(if $(DEVICE_MANIFEST_SKUS),,EMPTY_VENDOR_SKU_PLACEHOLDER)) \
4960  $(DEVICE_MANIFEST_SKUS)
4961$(check_vintf_compatible_log): $(HOST_OUT_EXECUTABLES)/checkvintf $(check_vintf_compatible_deps)
4962	@echo "PRODUCT_OTA_ENFORCE_VINTF_KERNEL_REQUIREMENTS=$(PRODUCT_OTA_ENFORCE_VINTF_KERNEL_REQUIREMENTS)" > $@
4963	@echo -n -e 'Deps: \n  ' >> $@
4964	@sed 's/ /\n  /g' <<< "$(PRIVATE_CHECK_VINTF_DEPS)" >> $@
4965	@echo -n -e 'Args: \n  ' >> $@
4966	@cat <<< "$(PRIVATE_CHECK_VINTF_ARGS)" >> $@
4967	$(foreach odm_sku,$(PRIVATE_ODM_SKUS), $(foreach vendor_sku,$(PRIVATE_VENDOR_SKUS), \
4968	  echo "For ODM SKU = $(odm_sku), vendor SKU = $(vendor_sku)" >> $@; \
4969	  ( $< --check-compat $(PRIVATE_CHECK_VINTF_ARGS) \
4970	       --property ro.boot.product.hardware.sku=$(filter-out EMPTY_ODM_SKU_PLACEHOLDER,$(odm_sku)) \
4971	       --property ro.boot.product.vendor.sku=$(filter-out EMPTY_VENDOR_SKU_PLACEHOLDER,$(vendor_sku)) \
4972	       >> $@ 2>&1 ) || (cat $@ && exit 1); ))
4973
4974$(call declare-1p-target,$(check_vintf_compatible_log))
4975
4976check_vintf_compatible_log :=
4977check_vintf_compatible_args :=
4978check_vintf_compatible_deps :=
4979
4980endif # BUILDING_SYSTEM_EXT_IMAGE equals BOARD_USES_SYSTEM_EXTIMAGE
4981endif # BUILDING_PRODUCT_IMAGE equals BOARD_USES_PRODUCTIMAGE
4982endif # BUILDING_ODM_IMAGE equals BOARD_USES_ODMIMAGE
4983endif # check_vintf_has_vendor
4984endif # check_vintf_has_system
4985endif # PRODUCT_ENFORCE_VINTF_MANIFEST
4986
4987# Add all logs of VINTF checks to dist builds
4988droid_targets: $(check_vintf_all_deps)
4989$(call dist-for-goals, droid_targets, $(check_vintf_all_deps))
4990
4991# Helper alias to check all VINTF of current build.
4992.PHONY: check-vintf-all
4993check-vintf-all: $(check_vintf_all_deps)
4994	$(foreach file,$^,echo "$(file)"; cat "$(file)"; echo;)
4995
4996check_vintf_has_vendor :=
4997check_vintf_has_system :=
4998check_vintf_common_srcs :=
4999check_vintf_all_deps :=
5000intermediates :=
5001endif # !TARGET_BUILD_UNBUNDLED
5002
5003# -----------------------------------------------------------------
5004# Check image sizes <= size of super partition
5005
5006ifeq (,$(TARGET_BUILD_UNBUNDLED))
5007
5008ifeq (true,$(PRODUCT_BUILD_SUPER_PARTITION))
5009
5010PARTITIONS_AND_OTHER_IN_SUPER := $(BOARD_SUPER_PARTITION_PARTITION_LIST)
5011
5012# Add the system other image to the misc_info. Because factory ota may install system_other to the super partition.
5013ifdef BUILDING_SYSTEM_OTHER_IMAGE
5014PARTITIONS_AND_OTHER_IN_SUPER += system_other
5015endif # BUILDING_SYSTEM_OTHER_IMAGE
5016
5017# $(1): misc_info.txt
5018# #(2): optional log file
5019define check-all-partition-sizes-target
5020  mkdir -p $(dir $(1))
5021  rm -f $(1)
5022  $(call dump-super-image-info, $(1))
5023  $(foreach partition,$(PARTITIONS_AND_OTHER_IN_SUPER), \
5024    echo "$(partition)_image="$(call images-for-partitions,$(partition)) >> $(1);)
5025  $(CHECK_PARTITION_SIZES) $(if $(2),--logfile $(2),-v) $(1)
5026endef
5027
5028check_all_partition_sizes_log := $(call intermediates-dir-for,PACKAGING,check-all-partition-sizes)/check_all_partition_sizes.log
5029droid_targets: $(check_all_partition_sizes_log)
5030$(call dist-for-goals, droid_targets, $(check_all_partition_sizes_log))
5031
5032$(check_all_partition_sizes_log): \
5033    $(CHECK_PARTITION_SIZES) \
5034    $(call images-for-partitions,$(PARTITIONS_AND_OTHER_IN_SUPER))
5035	$(call check-all-partition-sizes-target, \
5036	  $(call intermediates-dir-for,PACKAGING,check-all-partition-sizes)/misc_info.txt, \
5037	  $@)
5038
5039$(call declare-1p-target,$(check_all_partition_sizes_log))
5040
5041.PHONY: check-all-partition-sizes
5042check-all-partition-sizes: $(check_all_partition_sizes_log)
5043
5044.PHONY: check-all-partition-sizes-nodeps
5045check-all-partition-sizes-nodeps:
5046	$(call check-all-partition-sizes-target, \
5047	  $(call intermediates-dir-for,PACKAGING,check-all-partition-sizes-nodeps)/misc_info.txt)
5048
5049endif # PRODUCT_BUILD_SUPER_PARTITION
5050
5051endif # !TARGET_BUILD_UNBUNDLED
5052
5053# -----------------------------------------------------------------
5054# bring in the installer image generation defines if necessary
5055ifeq ($(TARGET_USE_DISKINSTALLER),true)
5056include bootable/diskinstaller/config.mk
5057endif
5058
5059# -----------------------------------------------------------------
5060# host tools needed to build dist and OTA packages
5061
5062ifeq ($(BUILD_OS),darwin)
5063  build_ota_package := false
5064  build_otatools_package := false
5065else
5066  # Set build_ota_package, and allow opt-out below.
5067  build_ota_package := true
5068  ifeq ($(TARGET_SKIP_OTA_PACKAGE),true)
5069    build_ota_package := false
5070  endif
5071  ifneq (,$(filter address, $(SANITIZE_TARGET)))
5072    build_ota_package := false
5073  endif
5074  ifeq ($(TARGET_PRODUCT),sdk)
5075    build_ota_package := false
5076  endif
5077  # A target without a kernel may be one of the following:
5078  # - A generic target. In this case, the OTA package usually isn't built.
5079  #   PRODUCT_BUILD_GENERIC_OTA_PACKAGE may be set to true to force OTA package
5080  #   generation.
5081  # - A real device target, with TARGET_NO_KERNEL set to true and
5082  #   BOARD_PREBUILT_BOOTIMAGE set. In this case, it is valid to generate
5083  #   an OTA package.
5084  ifneq ($(PRODUCT_BUILD_GENERIC_OTA_PACKAGE),true)
5085    ifneq ($(filter generic%,$(TARGET_DEVICE)),)
5086      build_ota_package := false
5087    endif
5088    ifeq ($(INSTALLED_BOOTIMAGE_TARGET),)
5089      ifeq ($(TARGET_NO_KERNEL),true)
5090        build_ota_package := false
5091      endif
5092    endif # INSTALLED_BOOTIMAGE_TARGET == ""
5093    ifeq ($(recovery_fstab),)
5094      build_ota_package := false
5095    endif
5096  endif # PRODUCT_BUILD_GENERIC_OTA_PACKAGE
5097
5098  # Set build_otatools_package, and allow opt-out below.
5099  build_otatools_package := true
5100  ifeq ($(TARGET_SKIP_OTATOOLS_PACKAGE),true)
5101    build_otatools_package := false
5102  endif
5103endif
5104
5105ifeq ($(build_otatools_package),true)
5106
5107INTERNAL_OTATOOLS_MODULES := \
5108  aapt2 \
5109  add_img_to_target_files \
5110  apksigner \
5111  append2simg \
5112  avbtool \
5113  blk_alloc_to_base_fs \
5114  boot_signer \
5115  brillo_update_payload \
5116  brotli \
5117  bsdiff \
5118  build_image \
5119  build_super_image \
5120  build_verity_metadata \
5121  build_verity_tree \
5122  care_map_generator \
5123  check_ota_package_signature \
5124  check_target_files_signatures \
5125  check_target_files_vintf \
5126  checkvintf \
5127  create_brick_ota \
5128  delta_generator \
5129  e2fsck \
5130  e2fsdroid \
5131  fc_sort \
5132  fec \
5133  fsck.erofs \
5134  fsck.f2fs \
5135  fs_config \
5136  generate_gki_certificate \
5137  generate_verity_key \
5138  host_init_verifier \
5139  img2simg \
5140  img_from_target_files \
5141  imgdiff \
5142  initrd_bootconfig \
5143  libconscrypt_openjdk_jni \
5144  lpmake \
5145  lpunpack \
5146  lz4 \
5147  make_f2fs \
5148  make_f2fs_casefold \
5149  merge_ota \
5150  merge_target_files \
5151  minigzip \
5152  mk_combined_img \
5153  mkbootfs \
5154  mkbootimg \
5155  mke2fs \
5156  mke2fs.conf \
5157  mkfs.erofs \
5158  mkf2fsuserimg \
5159  mksquashfs \
5160  mksquashfsimage \
5161  mkuserimg_mke2fs \
5162  ota_extractor \
5163  ota_from_target_files \
5164  repack_bootimg \
5165  secilc \
5166  sefcontext_compile \
5167  sgdisk \
5168  shflags \
5169  sign_apex \
5170  sign_target_files_apks \
5171  sign_virt_apex \
5172  signapk \
5173  simg2img \
5174  sload_f2fs \
5175  toybox \
5176  tune2fs \
5177  unpack_bootimg \
5178  update_host_simulator \
5179  validate_target_files \
5180  verity_signer \
5181  verity_verifier \
5182  zipalign \
5183  zucchini \
5184  zip2zip \
5185
5186
5187# Additional tools to unpack and repack the apex file.
5188INTERNAL_OTATOOLS_MODULES += \
5189  apexer \
5190  apex_compression_tool \
5191  blkid_static \
5192  deapexer \
5193  debugfs_static \
5194  dump_apex_info \
5195  fsck.erofs \
5196  make_erofs \
5197  merge_zips \
5198  resize2fs \
5199  soong_zip \
5200
5201ifeq (true,$(PRODUCT_SUPPORTS_VBOOT))
5202INTERNAL_OTATOOLS_MODULES += \
5203  futility-host \
5204  vboot_signer
5205endif
5206
5207INTERNAL_OTATOOLS_FILES := \
5208  $(filter $(HOST_OUT)/%,$(call module-installed-files,$(INTERNAL_OTATOOLS_MODULES)))
5209
5210.PHONY: otatools
5211otatools: $(INTERNAL_OTATOOLS_FILES)
5212
5213# For each module, recursively resolve its host shared library dependencies. Then we have a full
5214# list of modules whose installed files need to be packed.
5215INTERNAL_OTATOOLS_MODULES_WITH_DEPS := \
5216  $(sort $(INTERNAL_OTATOOLS_MODULES) \
5217      $(foreach m,$(INTERNAL_OTATOOLS_MODULES),$(call get-all-shared-libs-deps,$(m))))
5218
5219INTERNAL_OTATOOLS_PACKAGE_FILES := \
5220  $(filter $(HOST_OUT)/%,$(call module-installed-files,$(INTERNAL_OTATOOLS_MODULES_WITH_DEPS)))
5221
5222INTERNAL_OTATOOLS_PACKAGE_FILES += \
5223  $(sort $(shell find build/make/target/product/security -type f -name "*.x509.pem" -o \
5224      -name "*.pk8"))
5225
5226ifneq (,$(wildcard packages/modules))
5227INTERNAL_OTATOOLS_PACKAGE_FILES += \
5228  $(sort $(shell find packages/modules -type f -name "*.x509.pem" -o -name "*.pk8" -o -name \
5229      "key.pem"))
5230endif
5231
5232ifneq (,$(wildcard device))
5233INTERNAL_OTATOOLS_PACKAGE_FILES += \
5234  $(sort $(shell find device $(wildcard vendor) -type f -name "*.pk8" -o -name "verifiedboot*" -o \
5235      -name "*.pem" -o -name "oem*.prop" -o -name "*.avbpubkey"))
5236endif
5237ifneq (,$(wildcard external/avb))
5238INTERNAL_OTATOOLS_PACKAGE_FILES += \
5239  $(sort $(shell find external/avb/test/data -type f -name "testkey_*.pem" -o \
5240      -name "atx_metadata.bin"))
5241endif
5242ifeq (true,$(PRODUCT_SUPPORTS_VBOOT))
5243INTERNAL_OTATOOLS_PACKAGE_FILES += \
5244  $(sort $(shell find external/vboot_reference/tests/devkeys -type f))
5245endif
5246
5247INTERNAL_OTATOOLS_RELEASETOOLS := \
5248  $(shell find build/make/tools/releasetools -name "*.pyc" -prune -o \
5249      \( -type f -o -type l \) -print | sort)
5250
5251BUILT_OTATOOLS_PACKAGE := $(PRODUCT_OUT)/otatools.zip
5252$(BUILT_OTATOOLS_PACKAGE): PRIVATE_ZIP_ROOT := $(call intermediates-dir-for,PACKAGING,otatools)/otatools
5253$(BUILT_OTATOOLS_PACKAGE): PRIVATE_OTATOOLS_PACKAGE_FILES := $(INTERNAL_OTATOOLS_PACKAGE_FILES)
5254$(BUILT_OTATOOLS_PACKAGE): PRIVATE_OTATOOLS_RELEASETOOLS := $(INTERNAL_OTATOOLS_RELEASETOOLS)
5255$(BUILT_OTATOOLS_PACKAGE): $(INTERNAL_OTATOOLS_PACKAGE_FILES) $(INTERNAL_OTATOOLS_RELEASETOOLS)
5256$(BUILT_OTATOOLS_PACKAGE): $(SOONG_ZIP) $(ZIP2ZIP)
5257	@echo "Package OTA tools: $@"
5258	rm -rf $@ $(PRIVATE_ZIP_ROOT)
5259	mkdir -p $(dir $@)
5260	$(call copy-files-with-structure,$(PRIVATE_OTATOOLS_PACKAGE_FILES),$(HOST_OUT)/,$(PRIVATE_ZIP_ROOT))
5261	$(call copy-files-with-structure,$(PRIVATE_OTATOOLS_RELEASETOOLS),build/make/tools/,$(PRIVATE_ZIP_ROOT))
5262	cp $(SOONG_ZIP) $(ZIP2ZIP) $(MERGE_ZIPS) $(PRIVATE_ZIP_ROOT)/bin/
5263	$(SOONG_ZIP) -o $@ -C $(PRIVATE_ZIP_ROOT) -D $(PRIVATE_ZIP_ROOT)
5264
5265$(call declare-1p-container,$(BUILT_OTATOOLS_PACKAGE),build)
5266$(call declare-container-license-deps,$(INTERNAL_OTATOOLS_PACKAGE_FILES) $(INTERNAL_OTATOOLS_RELEASETOOLS),$(BUILT_OTATOOLS_PACKAGE):)
5267
5268.PHONY: otatools-package
5269otatools-package: $(BUILT_OTATOOLS_PACKAGE)
5270
5271$(call dist-for-goals, otatools-package, \
5272  $(BUILT_OTATOOLS_PACKAGE) \
5273)
5274
5275endif # build_otatools_package
5276
5277# -----------------------------------------------------------------
5278#  misc_info.txt
5279
5280INSTALLED_MISC_INFO_TARGET := $(PRODUCT_OUT)/misc_info.txt
5281
5282ifeq ($(TARGET_RELEASETOOLS_EXTENSIONS),)
5283# default to common dir for device vendor
5284tool_extensions := $(TARGET_DEVICE_DIR)/../common
5285else
5286tool_extensions := $(TARGET_RELEASETOOLS_EXTENSIONS)
5287endif
5288.KATI_READONLY := tool_extensions
5289
5290# $1: boot image file name
5291define misc_boot_size
5292$(subst .img,_size,$(1))=$(BOARD_KERNEL$(call to-upper,$(subst boot,,$(subst .img,,$(1))))_BOOTIMAGE_PARTITION_SIZE)
5293endef
5294
5295$(INSTALLED_MISC_INFO_TARGET):
5296	rm -f $@
5297	$(call pretty,"Target misc_info.txt: $@")
5298	$(hide) echo "recovery_api_version=$(RECOVERY_API_VERSION)" >> $@
5299	$(hide) echo "fstab_version=$(RECOVERY_FSTAB_VERSION)" >> $@
5300ifdef BOARD_FLASH_BLOCK_SIZE
5301	$(hide) echo "blocksize=$(BOARD_FLASH_BLOCK_SIZE)" >> $@
5302endif
5303ifneq ($(strip $(BOARD_BOOTIMAGE_PARTITION_SIZE))$(strip $(BOARD_KERNEL_BINARIES)),)
5304	$(foreach b,$(INSTALLED_BOOTIMAGE_TARGET),\
5305		echo "$(call misc_boot_size,$(notdir $(b)))" >> $@;)
5306endif
5307ifeq ($(INSTALLED_BOOTIMAGE_TARGET),)
5308	$(hide) echo "no_boot=true" >> $@
5309else
5310	echo "boot_images=$(foreach b,$(INSTALLED_BOOTIMAGE_TARGET),$(notdir $(b)))" >> $@
5311endif
5312ifneq ($(INSTALLED_INIT_BOOT_IMAGE_TARGET),)
5313	$(hide) echo "init_boot=true" >> $@
5314	$(hide) echo "init_boot_size=$(BOARD_INIT_BOOT_IMAGE_PARTITION_SIZE)" >> $@
5315endif
5316ifeq ($(BOARD_RAMDISK_USE_LZ4),true)
5317	echo "lz4_ramdisks=true" >> $@
5318endif
5319ifneq ($(INSTALLED_VENDOR_BOOTIMAGE_TARGET),)
5320	echo "vendor_boot=true" >> $@
5321	echo "vendor_boot_size=$(BOARD_VENDOR_BOOTIMAGE_PARTITION_SIZE)" >> $@
5322endif
5323ifneq ($(INSTALLED_VENDOR_KERNEL_BOOTIMAGE_TARGET),)
5324	echo "vendor_kernel_boot=true" >> $@
5325	echo "vendor_kernel_boot_size=$(BOARD_VENDOR_KERNEL_BOOTIMAGE_PARTITION_SIZE)" >> $@
5326endif
5327ifeq ($(INSTALLED_RECOVERYIMAGE_TARGET),)
5328	$(hide) echo "no_recovery=true" >> $@
5329endif
5330ifdef BOARD_INCLUDE_RECOVERY_DTBO
5331	$(hide) echo "include_recovery_dtbo=true" >> $@
5332endif
5333ifdef BOARD_INCLUDE_RECOVERY_ACPIO
5334	$(hide) echo "include_recovery_acpio=true" >> $@
5335endif
5336ifdef BOARD_RECOVERYIMAGE_PARTITION_SIZE
5337	$(hide) echo "recovery_size=$(BOARD_RECOVERYIMAGE_PARTITION_SIZE)" >> $@
5338endif
5339ifdef TARGET_RECOVERY_FSTYPE_MOUNT_OPTIONS
5340	@# TARGET_RECOVERY_FSTYPE_MOUNT_OPTIONS can be empty to indicate that nothing but defaults should be used.
5341	$(hide) echo "recovery_mount_options=$(TARGET_RECOVERY_FSTYPE_MOUNT_OPTIONS)" >> $@
5342else
5343	$(hide) echo "recovery_mount_options=$(DEFAULT_TARGET_RECOVERY_FSTYPE_MOUNT_OPTIONS)" >> $@
5344endif
5345	$(hide) echo "tool_extensions=$(tool_extensions)" >> $@
5346	$(hide) echo "default_system_dev_certificate=$(DEFAULT_SYSTEM_DEV_CERTIFICATE)" >> $@
5347ifdef PRODUCT_EXTRA_OTA_KEYS
5348	$(hide) echo "extra_ota_keys=$(PRODUCT_EXTRA_OTA_KEYS)" >> $@
5349endif
5350ifdef PRODUCT_EXTRA_RECOVERY_KEYS
5351	$(hide) echo "extra_recovery_keys=$(PRODUCT_EXTRA_RECOVERY_KEYS)" >> $@
5352endif
5353	$(hide) echo 'mkbootimg_args=$(BOARD_MKBOOTIMG_ARGS)' >> $@
5354	$(hide) echo 'recovery_mkbootimg_args=$(BOARD_RECOVERY_MKBOOTIMG_ARGS)' >> $@
5355	$(hide) echo 'mkbootimg_version_args=$(INTERNAL_MKBOOTIMG_VERSION_ARGS)' >> $@
5356	$(hide) echo 'mkbootimg_init_args=$(BOARD_MKBOOTIMG_INIT_ARGS)' >> $@
5357ifdef BOARD_GKI_SIGNING_KEY_PATH
5358	$(hide) echo 'gki_signing_key_path=$(BOARD_GKI_SIGNING_KEY_PATH)' >> $@
5359	$(hide) echo 'gki_signing_algorithm=$(BOARD_GKI_SIGNING_ALGORITHM)' >> $@
5360	$(hide) echo 'gki_signing_signature_args=$(BOARD_GKI_SIGNING_SIGNATURE_ARGS)' >> $@
5361endif
5362	$(hide) echo "multistage_support=1" >> $@
5363	$(hide) echo "blockimgdiff_versions=3,4" >> $@
5364ifeq ($(PRODUCT_BUILD_GENERIC_OTA_PACKAGE),true)
5365	$(hide) echo "build_generic_ota_package=true" >> $@
5366endif
5367ifneq ($(OEM_THUMBPRINT_PROPERTIES),)
5368	# OTA scripts are only interested in fingerprint related properties
5369	$(hide) echo "oem_fingerprint_properties=$(OEM_THUMBPRINT_PROPERTIES)" >> $@
5370endif
5371ifneq (,$(filter address, $(SANITIZE_TARGET)))
5372	# We need to create userdata.img with real data because the instrumented libraries are in userdata.img.
5373	$(hide) echo "userdata_img_with_data=true" >> $@
5374endif
5375ifeq ($(BOARD_USES_FULL_RECOVERY_IMAGE),true)
5376	$(hide) echo "full_recovery_image=true" >> $@
5377endif
5378ifdef BOARD_USES_VENDORIMAGE
5379	$(hide) echo "board_uses_vendorimage=true" >> $@
5380endif
5381ifeq ($(BOARD_AVB_ENABLE),true)
5382ifeq ($(BUILDING_VBMETA_IMAGE),true)
5383	$(hide) echo "avb_building_vbmeta_image=true" >> $@
5384endif # BUILDING_VBMETA_IMAGE
5385	$(hide) echo "avb_enable=true" >> $@
5386	$(hide) echo "avb_vbmeta_key_path=$(BOARD_AVB_KEY_PATH)" >> $@
5387	$(hide) echo "avb_vbmeta_algorithm=$(BOARD_AVB_ALGORITHM)" >> $@
5388	$(hide) echo "avb_vbmeta_args=$(BOARD_AVB_MAKE_VBMETA_IMAGE_ARGS)" >> $@
5389	$(hide) echo "avb_boot_add_hash_footer_args=$(BOARD_AVB_BOOT_ADD_HASH_FOOTER_ARGS)" >> $@
5390ifdef BOARD_AVB_BOOT_KEY_PATH
5391	$(hide) echo "avb_boot_key_path=$(BOARD_AVB_BOOT_KEY_PATH)" >> $@
5392	$(hide) echo "avb_boot_algorithm=$(BOARD_AVB_BOOT_ALGORITHM)" >> $@
5393	$(hide) echo "avb_boot_rollback_index_location=$(BOARD_AVB_BOOT_ROLLBACK_INDEX_LOCATION)" >> $@
5394endif # BOARD_AVB_BOOT_KEY_PATH
5395	$(hide) echo "avb_init_boot_add_hash_footer_args=$(BOARD_AVB_INIT_BOOT_ADD_HASH_FOOTER_ARGS)" >> $@
5396ifdef BOARD_AVB_INIT_BOOT_KEY_PATH
5397	$(hide) echo "avb_init_boot_key_path=$(BOARD_AVB_INIT_BOOT_KEY_PATH)" >> $@
5398	$(hide) echo "avb_init_boot_algorithm=$(BOARD_AVB_INIT_BOOT_ALGORITHM)" >> $@
5399	$(hide) echo "avb_init_boot_rollback_index_location=$(BOARD_AVB_INIT_BOOT_ROLLBACK_INDEX_LOCATION)" >> $@
5400endif # BOARD_AVB_INIT_BOOT_KEY_PATH
5401	echo "avb_vendor_boot_add_hash_footer_args=$(BOARD_AVB_VENDOR_BOOT_ADD_HASH_FOOTER_ARGS)" >> $@
5402ifdef BOARD_AVB_VENDOR_BOOT_KEY_PATH
5403	echo "avb_vendor_boot_key_path=$(BOARD_AVB_VENDOR_BOOT_KEY_PATH)" >> $@
5404	echo "avb_vendor_boot_algorithm=$(BOARD_AVB_VENDOR_BOOT_ALGORITHM)" >> $@
5405	echo "avb_vendor_boot_rollback_index_location=$(BOARD_AVB_VENDOR_BOOT_ROLLBACK_INDEX_LOCATION)" >> $@
5406endif # BOARD_AVB_VENDOR_BOOT_KEY_PATH
5407	echo "avb_vendor_kernel_boot_add_hash_footer_args=$(BOARD_AVB_VENDOR_KERNEL_BOOT_ADD_HASH_FOOTER_ARGS)" >> $@
5408ifdef BOARD_AVB_VENDOR_KERNEL_BOOT_KEY_PATH
5409	echo "avb_vendor_kernel_boot_key_path=$(BOARD_AVB_VENDOR_KERNEL_BOOT_KEY_PATH)" >> $@
5410	echo "avb_vendor_kernel_boot_algorithm=$(BOARD_AVB_VENDOR_KERNEL_BOOT_ALGORITHM)" >> $@
5411	echo "avb_vendor_kernel_boot_rollback_index_location=$(BOARD_AVB_VENDOR_KERNEL_BOOT_ROLLBACK_INDEX_LOCATION)" >> $@
5412endif # BOARD_AVB_VENDOR_KERNEL_BOOT_KEY_PATH
5413	$(hide) echo "avb_recovery_add_hash_footer_args=$(BOARD_AVB_RECOVERY_ADD_HASH_FOOTER_ARGS)" >> $@
5414ifdef BOARD_AVB_RECOVERY_KEY_PATH
5415	$(hide) echo "avb_recovery_key_path=$(BOARD_AVB_RECOVERY_KEY_PATH)" >> $@
5416	$(hide) echo "avb_recovery_algorithm=$(BOARD_AVB_RECOVERY_ALGORITHM)" >> $@
5417	$(hide) echo "avb_recovery_rollback_index_location=$(BOARD_AVB_RECOVERY_ROLLBACK_INDEX_LOCATION)" >> $@
5418endif # BOARD_AVB_RECOVERY_KEY_PATH
5419ifneq (,$(strip $(BOARD_CUSTOMIMAGES_PARTITION_LIST)))
5420	$(hide) echo "avb_custom_images_partition_list=$(BOARD_CUSTOMIMAGES_PARTITION_LIST)" >> $@
5421	$(hide) $(foreach partition,$(BOARD_CUSTOMIMAGES_PARTITION_LIST), \
5422	    echo "avb_$(partition)_key_path=$(BOARD_AVB_$(call to-upper,$(partition))_KEY_PATH)"  >> $@; \
5423	    echo "avb_$(partition)_algorithm=$(BOARD_AVB_$(call to-upper,$(partition))_ALGORITHM)"  >> $@; \
5424	    echo "avb_$(partition)_add_hashtree_footer_args=$(BOARD_AVB_$(call to-upper,$(partition))_ADD_HASHTREE_FOOTER_ARGS)"  >> $@; \
5425	    echo "avb_$(partition)_rollback_index_location=$(BOARD_AVB_$(call to-upper,$(partition))_ROLLBACK_INDEX_LOCATION)"  >> $@; \
5426	    echo "avb_$(partition)_partition_size=$(BOARD_AVB_$(call to-upper,$(partition))_PARTITION_SIZE)"  >> $@; \
5427	    echo "avb_$(partition)_image_list=$(foreach image,$(BOARD_AVB_$(call to-upper,$(partition))_IMAGE_LIST),$(notdir $(image)))" >> $@;)
5428endif # BOARD_CUSTOMIMAGES_PARTITION_LIST
5429ifneq (,$(strip $(BOARD_AVB_VBMETA_SYSTEM)))
5430	$(hide) echo "avb_vbmeta_system=$(BOARD_AVB_VBMETA_SYSTEM)" >> $@
5431	$(hide) echo "avb_vbmeta_system_args=$(BOARD_AVB_MAKE_VBMETA_SYSTEM_IMAGE_ARGS)" >> $@
5432	$(hide) echo "avb_vbmeta_system_key_path=$(BOARD_AVB_VBMETA_SYSTEM_KEY_PATH)" >> $@
5433	$(hide) echo "avb_vbmeta_system_algorithm=$(BOARD_AVB_VBMETA_SYSTEM_ALGORITHM)" >> $@
5434	$(hide) echo "avb_vbmeta_system_rollback_index_location=$(BOARD_AVB_VBMETA_SYSTEM_ROLLBACK_INDEX_LOCATION)" >> $@
5435endif # BOARD_AVB_VBMETA_SYSTEM
5436ifneq (,$(strip $(BOARD_AVB_VBMETA_VENDOR)))
5437	$(hide) echo "avb_vbmeta_vendor=$(BOARD_AVB_VBMETA_VENDOR)" >> $@
5438	$(hide) echo "avb_vbmeta_vendor_args=$(BOARD_AVB_MAKE_VBMETA_VENDOR_IMAGE_ARGS)" >> $@
5439	$(hide) echo "avb_vbmeta_vendor_key_path=$(BOARD_AVB_VBMETA_VENDOR_KEY_PATH)" >> $@
5440	$(hide) echo "avb_vbmeta_vendor_algorithm=$(BOARD_AVB_VBMETA_VENDOR_ALGORITHM)" >> $@
5441	$(hide) echo "avb_vbmeta_vendor_rollback_index_location=$(BOARD_AVB_VBMETA_VENDOR_ROLLBACK_INDEX_LOCATION)" >> $@
5442endif # BOARD_AVB_VBMETA_VENDOR_KEY_PATH
5443ifneq (,$(strip $(BOARD_AVB_VBMETA_CUSTOM_PARTITIONS)))
5444	$(hide) echo "avb_custom_vbmeta_images_partition_list=$(BOARD_AVB_VBMETA_CUSTOM_PARTITIONS)" >> $@
5445	$(hide) $(foreach partition,$(BOARD_AVB_VBMETA_CUSTOM_PARTITIONS),\
5446	echo "avb_vbmeta_$(partition)=$(BOARD_AVB_VBMETA_$(call to-upper,$(partition)))" >> $@ ;\
5447	echo "avb_vbmeta_$(partition)_args=$(BOARD_AVB_MAKE_VBMETA_$(call to-upper,$(partition))_IMAGE_ARGS)" >> $@ ;\
5448	echo "avb_vbmeta_$(partition)_key_path=$(BOARD_AVB_VBMETA_$(call to-upper,$(partition))_KEY_PATH)" >> $@ ;\
5449	echo "avb_vbmeta_$(partition)_algorithm=$(BOARD_AVB_VBMETA_$(call to-upper,$(partition))_ALGORITHM)" >> $@ ;\
5450	echo "avb_vbmeta_$(partition)_rollback_index_location=$(BOARD_AVB_VBMETA_$(call to-upper,$(partition))_ROLLBACK_INDEX_LOCATION)" >> $@ ;)
5451endif # BOARD_AVB_VBMETA_CUSTOM_PARTITIONS
5452endif # BOARD_AVB_ENABLE
5453ifdef BOARD_BPT_INPUT_FILES
5454	$(hide) echo "board_bpt_enable=true" >> $@
5455	$(hide) echo "board_bpt_make_table_args=$(BOARD_BPT_MAKE_TABLE_ARGS)" >> $@
5456	$(hide) echo "board_bpt_input_files=$(BOARD_BPT_INPUT_FILES)" >> $@
5457endif
5458ifdef BOARD_BPT_DISK_SIZE
5459	$(hide) echo "board_bpt_disk_size=$(BOARD_BPT_DISK_SIZE)" >> $@
5460endif
5461	$(call generate-userimage-prop-dictionary, $@)
5462ifeq ($(AB_OTA_UPDATER),true)
5463	@# Include the build type in META/misc_info.txt so the server can easily differentiate production builds.
5464	$(hide) echo "build_type=$(TARGET_BUILD_VARIANT)" >> $@
5465	$(hide) echo "ab_update=true" >> $@
5466endif
5467ifeq ($(TARGET_OTA_ALLOW_NON_AB),true)
5468	$(hide) echo "allow_non_ab=true" >> $@
5469endif
5470ifdef BOARD_PREBUILT_DTBOIMAGE
5471	$(hide) echo "has_dtbo=true" >> $@
5472ifeq ($(BOARD_AVB_ENABLE),true)
5473	$(hide) echo "dtbo_size=$(BOARD_DTBOIMG_PARTITION_SIZE)" >> $@
5474	$(hide) echo "avb_dtbo_add_hash_footer_args=$(BOARD_AVB_DTBO_ADD_HASH_FOOTER_ARGS)" >> $@
5475ifdef BOARD_AVB_DTBO_KEY_PATH
5476	$(hide) echo "avb_dtbo_key_path=$(BOARD_AVB_DTBO_KEY_PATH)" >> $@
5477	$(hide) echo "avb_dtbo_algorithm=$(BOARD_AVB_DTBO_ALGORITHM)" >> $@
5478	$(hide) echo "avb_dtbo_rollback_index_location=$(BOARD_AVB_DTBO_ROLLBACK_INDEX_LOCATION)" >> $@
5479endif # BOARD_AVB_DTBO_KEY_PATH
5480endif # BOARD_AVB_ENABLE
5481endif # BOARD_PREBUILT_DTBOIMAGE
5482ifeq ($(BOARD_USES_PVMFWIMAGE),true)
5483	$(hide) echo "has_pvmfw=true" >> $@
5484ifeq ($(BOARD_AVB_ENABLE),true)
5485	$(hide) echo "pvmfw_size=$(BOARD_PVMFWIMAGE_PARTITION_SIZE)" >> $@
5486	$(hide) echo "avb_pvmfw_add_hash_footer_args=$(BOARD_AVB_PVMFW_ADD_HASH_FOOTER_ARGS)" >> $@
5487ifdef BOARD_AVB_PVMFW_KEY_PATH
5488	$(hide) echo "avb_pvmfw_key_path=$(BOARD_AVB_PVMFW_KEY_PATH)" >> $@
5489	$(hide) echo "avb_pvmfw_algorithm=$(BOARD_AVB_PVMFW_ALGORITHM)" >> $@
5490	$(hide) echo "avb_pvmfw_rollback_index_location=$(BOARD_AVB_PVMFW_ROLLBACK_INDEX_LOCATION)" >> $@
5491endif # BOARD_AVB_PVMFW_KEY_PATH
5492endif # BOARD_AVB_ENABLE
5493endif # BOARD_USES_PVMFWIMAGE
5494	$(call dump-dynamic-partitions-info,$@)
5495	@# VINTF checks
5496ifeq ($(PRODUCT_ENFORCE_VINTF_MANIFEST),true)
5497	$(hide) echo "vintf_enforce=true" >> $@
5498endif
5499ifdef ODM_MANIFEST_SKUS
5500	$(hide) echo "vintf_odm_manifest_skus=$(ODM_MANIFEST_SKUS)" >> $@
5501endif
5502ifdef ODM_MANIFEST_FILES
5503	$(hide) echo "vintf_include_empty_odm_sku=true" >> $@
5504endif
5505ifdef DEVICE_MANIFEST_SKUS
5506	$(hide) echo "vintf_vendor_manifest_skus=$(DEVICE_MANIFEST_SKUS)" >> $@
5507endif
5508ifdef DEVICE_MANIFEST_FILE
5509	$(hide) echo "vintf_include_empty_vendor_sku=true" >> $@
5510endif
5511ifeq ($(BOARD_BOOTLOADER_IN_UPDATE_PACKAGE),true)
5512	$(hide) echo "bootloader_in_update_package=true" >> $@
5513endif
5514ifeq ($(BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE),true)
5515	$(hide) echo "exclude_kernel_from_recovery_image=true" >> $@
5516endif
5517ifneq ($(BOARD_PARTIAL_OTA_UPDATE_PARTITIONS_LIST),)
5518	$(hide) echo "partial_ota_update_partitions_list=$(BOARD_PARTIAL_OTA_UPDATE_PARTITIONS_LIST)" >> $@
5519endif
5520ifeq ($(BUILDING_WITH_VSDK),true)
5521	$(hide) echo "building_with_vsdk=true" >> $@
5522endif
5523ifeq ($(TARGET_FLATTEN_APEX),false)
5524	$(hide) echo "target_flatten_apex=false" >> $@
5525endif
5526
5527$(call declare-0p-target,$(INSTALLED_MISC_INFO_TARGET))
5528
5529.PHONY: misc_info
5530misc_info: $(INSTALLED_MISC_INFO_TARGET)
5531
5532droidcore-unbundled: $(INSTALLED_MISC_INFO_TARGET)
5533
5534# -----------------------------------------------------------------
5535# A zip of the directories that map to the target filesystem.
5536# This zip can be used to create an OTA package or filesystem image
5537# as a post-build step.
5538#
5539name := $(TARGET_PRODUCT)
5540ifeq ($(TARGET_BUILD_TYPE),debug)
5541  name := $(name)_debug
5542endif
5543name := $(name)-target_files-$(FILE_NAME_TAG)
5544
5545intermediates := $(call intermediates-dir-for,PACKAGING,target_files)
5546BUILT_TARGET_FILES_PACKAGE := $(intermediates)/$(name).zip
5547$(BUILT_TARGET_FILES_PACKAGE): intermediates := $(intermediates)
5548$(BUILT_TARGET_FILES_PACKAGE): \
5549	    zip_root := $(intermediates)/$(name)
5550
5551# $(1): Directory to copy
5552# $(2): Location to copy it to
5553# The "ls -A" is to prevent "acp s/* d" from failing if s is empty.
5554define package_files-copy-root
5555  if [ -d "$(strip $(1))" -a "$$(ls -A $(1))" ]; then \
5556    mkdir -p $(2) && \
5557    $(ACP) -rd $(strip $(1))/* $(2); \
5558  fi
5559endef
5560
5561built_ota_tools :=
5562
5563# We can't build static executables when SANITIZE_TARGET=address
5564ifeq (,$(filter address, $(SANITIZE_TARGET)))
5565built_ota_tools += \
5566    $(call intermediates-dir-for,EXECUTABLES,updater)/updater
5567endif
5568
5569$(BUILT_TARGET_FILES_PACKAGE): PRIVATE_OTA_TOOLS := $(built_ota_tools)
5570
5571tool_extension := $(wildcard $(tool_extensions)/releasetools.py)
5572$(BUILT_TARGET_FILES_PACKAGE): PRIVATE_TOOL_EXTENSION := $(tool_extension)
5573
5574updater_dep :=
5575ifeq ($(AB_OTA_UPDATER),true)
5576updater_dep += system/update_engine/update_engine.conf
5577$(call declare-1p-target,system/update_engine/update_engine.conf,system/update_engine)
5578updater_dep += external/zucchini/version_info.h
5579$(call declare-license-metadata,external/zucchini/version_info.h,legacy_notice,notice,external/zucchini/LICENSE,external/zucchini)
5580updater_dep += $(HOST_OUT_SHARED_LIBRARIES)/liblz4.so
5581endif
5582
5583# Build OTA tools if non-A/B is allowed
5584ifeq ($(TARGET_OTA_ALLOW_NON_AB),true)
5585updater_dep += $(built_ota_tools)
5586endif
5587
5588$(BUILT_TARGET_FILES_PACKAGE): $(updater_dep)
5589
5590# If we are using recovery as boot, output recovery files to BOOT/.
5591# If we are moving recovery resources to vendor_boot, output recovery files to VENDOR_BOOT/.
5592ifeq ($(BOARD_USES_RECOVERY_AS_BOOT),true)
5593$(BUILT_TARGET_FILES_PACKAGE): PRIVATE_RECOVERY_OUT := BOOT
5594else ifeq ($(BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT),true)
5595$(BUILT_TARGET_FILES_PACKAGE): PRIVATE_RECOVERY_OUT := VENDOR_BOOT
5596else
5597$(BUILT_TARGET_FILES_PACKAGE): PRIVATE_RECOVERY_OUT := RECOVERY
5598endif
5599
5600ifeq ($(AB_OTA_UPDATER),true)
5601  ifdef OSRELEASED_DIRECTORY
5602    $(BUILT_TARGET_FILES_PACKAGE): $(TARGET_OUT_OEM)/$(OSRELEASED_DIRECTORY)/product_id
5603    $(BUILT_TARGET_FILES_PACKAGE): $(TARGET_OUT_OEM)/$(OSRELEASED_DIRECTORY)/product_version
5604    $(BUILT_TARGET_FILES_PACKAGE): $(TARGET_OUT_ETC)/$(OSRELEASED_DIRECTORY)/system_version
5605  endif
5606
5607  # Not checking in board_config.mk, since AB_OTA_PARTITIONS may be updated in Android.mk (e.g. to
5608  # additionally include radio or bootloader partitions).
5609  ifeq ($(AB_OTA_PARTITIONS),)
5610    $(error AB_OTA_PARTITIONS must be defined when using AB_OTA_UPDATER)
5611  endif
5612endif
5613
5614ifneq ($(AB_OTA_PARTITIONS),)
5615  ifneq ($(AB_OTA_UPDATER),true)
5616    $(error AB_OTA_UPDATER must be true when defining AB_OTA_PARTITIONS)
5617  endif
5618endif
5619
5620# Run fs_config while creating the target files package
5621# $1: root directory
5622# $2: add prefix
5623define fs_config
5624(cd $(1); find . -type d | sed 's,$$,/,'; find . \! -type d) | cut -c 3- | sort | sed 's,^,$(2),' | $(HOST_OUT_EXECUTABLES)/fs_config -C -D $(TARGET_OUT) -S $(SELINUX_FC) -R "$(2)"
5625endef
5626
5627define filter-out-missing-vendor
5628$(if $(INSTALLED_VENDORIMAGE_TARGET),$(1),$(filter-out vendor,$(1)))
5629endef
5630define filter-out-missing-vendor_dlkm
5631$(if $(INSTALLED_VENDOR_DLKMIMAGE_TARGET),$(1),$(filter-out vendor_dlkm,$(1)))
5632endef
5633define filter-out-missing-odm
5634$(if $(INSTALLED_ODMIMAGE_TARGET),$(1),$(filter-out odm,$(1)))
5635endef
5636define filter-out-missing-odm_dlkm
5637$(if $(INSTALLED_ODM_DLKMIMAGE_TARGET),$(1),$(filter-out odm_dlkm,$(1)))
5638endef
5639define filter-out-missing-system_dlkm
5640$(if $(INSTALLED_SYSTEM_DLKMIMAGE_TARGET),$(1),$(filter-out system_dlkm,$(1)))
5641endef
5642# Filter out vendor,vendor_dlkm,odm,odm_dlkm,system_dlkm from the list for AOSP targets.
5643# $(1): list
5644define filter-out-missing-partitions
5645$(call filter-out-missing-vendor,\
5646  $(call filter-out-missing-vendor_dlkm,\
5647    $(call filter-out-missing-odm,\
5648      $(call filter-out-missing-odm_dlkm,\
5649        $(call filter-out-missing-system_dlkm,$(1))))))
5650endef
5651
5652# Information related to dynamic partitions and virtual A/B. This information
5653# is needed for building the super image (see dump-super-image-info) and
5654# building OTA packages.
5655# $(1): file
5656define dump-dynamic-partitions-info
5657  $(if $(filter true,$(PRODUCT_USE_DYNAMIC_PARTITIONS)), \
5658    echo "use_dynamic_partitions=true" >> $(1))
5659  $(if $(filter true,$(PRODUCT_RETROFIT_DYNAMIC_PARTITIONS)), \
5660    echo "dynamic_partition_retrofit=true" >> $(1))
5661  echo "lpmake=$(notdir $(LPMAKE))" >> $(1)
5662  $(if $(filter true,$(PRODUCT_BUILD_SUPER_PARTITION)), $(if $(BOARD_SUPER_PARTITION_SIZE), \
5663    echo "build_super_partition=true" >> $(1)))
5664  $(if $(BUILDING_SUPER_EMPTY_IMAGE), \
5665    echo "build_super_empty_partition=true" >> $(1))
5666  $(if $(filter true,$(BOARD_BUILD_RETROFIT_DYNAMIC_PARTITIONS_OTA_PACKAGE)), \
5667    echo "build_retrofit_dynamic_partitions_ota_package=true" >> $(1))
5668  echo "super_metadata_device=$(BOARD_SUPER_PARTITION_METADATA_DEVICE)" >> $(1)
5669  $(if $(BOARD_SUPER_PARTITION_BLOCK_DEVICES), \
5670    echo "super_block_devices=$(BOARD_SUPER_PARTITION_BLOCK_DEVICES)" >> $(1))
5671  $(foreach device,$(BOARD_SUPER_PARTITION_BLOCK_DEVICES), \
5672    echo "super_$(device)_device_size=$(BOARD_SUPER_PARTITION_$(call to-upper,$(device))_DEVICE_SIZE)" >> $(1);)
5673  $(if $(BOARD_SUPER_PARTITION_PARTITION_LIST), \
5674    echo "dynamic_partition_list=$(call filter-out-missing-partitions,$(BOARD_SUPER_PARTITION_PARTITION_LIST))" >> $(1))
5675  $(if $(BOARD_SUPER_PARTITION_GROUPS),
5676    echo "super_partition_groups=$(BOARD_SUPER_PARTITION_GROUPS)" >> $(1))
5677  $(foreach group,$(BOARD_SUPER_PARTITION_GROUPS), \
5678    echo "super_$(group)_group_size=$(BOARD_$(call to-upper,$(group))_SIZE)" >> $(1); \
5679    $(if $(BOARD_$(call to-upper,$(group))_PARTITION_LIST), \
5680      echo "super_$(group)_partition_list=$(call filter-out-missing-partitions,$(BOARD_$(call to-upper,$(group))_PARTITION_LIST))" >> $(1);))
5681  $(if $(filter true,$(TARGET_USERIMAGES_SPARSE_EXT_DISABLED)), \
5682    echo "build_non_sparse_super_partition=true" >> $(1))
5683  $(if $(filter true,$(TARGET_USERIMAGES_SPARSE_F2FS_DISABLED)), \
5684    echo "build_non_sparse_super_partition=true" >> $(1))
5685  $(if $(filter true,$(BOARD_SUPER_IMAGE_IN_UPDATE_PACKAGE)), \
5686    echo "super_image_in_update_package=true" >> $(1))
5687  $(if $(BOARD_SUPER_PARTITION_SIZE), \
5688    echo "super_partition_size=$(BOARD_SUPER_PARTITION_SIZE)" >> $(1))
5689  $(if $(BOARD_SUPER_PARTITION_ALIGNMENT), \
5690    echo "super_partition_alignment=$(BOARD_SUPER_PARTITION_ALIGNMENT)" >> $(1))
5691  $(if $(BOARD_SUPER_PARTITION_WARN_LIMIT), \
5692    echo "super_partition_warn_limit=$(BOARD_SUPER_PARTITION_WARN_LIMIT)" >> $(1))
5693  $(if $(BOARD_SUPER_PARTITION_ERROR_LIMIT), \
5694    echo "super_partition_error_limit=$(BOARD_SUPER_PARTITION_ERROR_LIMIT)" >> $(1))
5695  $(if $(filter true,$(PRODUCT_VIRTUAL_AB_OTA)), \
5696    echo "virtual_ab=true" >> $(1))
5697  $(if $(filter true,$(PRODUCT_VIRTUAL_AB_COMPRESSION)), \
5698    echo "virtual_ab_compression=true" >> $(1))
5699# This value controls the compression algorithm used for VABC
5700# valid options are defined in system/core/fs_mgr/libsnapshot/cow_writer.cpp
5701# e.g. "none", "gz", "brotli"
5702  $(if $(PRODUCT_VIRTUAL_AB_COMPRESSION_METHOD), \
5703    echo "virtual_ab_compression_method=$(PRODUCT_VIRTUAL_AB_COMPRESSION_METHOD)" >> $(1))
5704  $(if $(filter true,$(PRODUCT_VIRTUAL_AB_OTA_RETROFIT)), \
5705    echo "virtual_ab_retrofit=true" >> $(1))
5706endef
5707
5708# By conditionally including the dependency of the target files package on the
5709# full system image deps, we speed up builds that do not build the system
5710# image.
5711ifdef BUILDING_SYSTEM_IMAGE
5712  $(BUILT_TARGET_FILES_PACKAGE): $(FULL_SYSTEMIMAGE_DEPS)
5713else
5714  # releasetools may need the system build.prop even when building a
5715  # system-image-less product.
5716  $(BUILT_TARGET_FILES_PACKAGE): $(INSTALLED_BUILD_PROP_TARGET)
5717endif
5718
5719ifdef BUILDING_USERDATA_IMAGE
5720  $(BUILT_TARGET_FILES_PACKAGE): $(INTERNAL_USERDATAIMAGE_FILES)
5721endif
5722
5723ifdef BUILDING_SYSTEM_OTHER_IMAGE
5724  $(BUILT_TARGET_FILES_PACKAGE): $(INTERNAL_SYSTEMOTHERIMAGE_FILES)
5725endif
5726
5727ifdef BUILDING_VENDOR_BOOT_IMAGE
5728  $(BUILT_TARGET_FILES_PACKAGE): $(INTERNAL_VENDOR_RAMDISK_FILES)
5729  $(BUILT_TARGET_FILES_PACKAGE): $(INTERNAL_VENDOR_RAMDISK_FRAGMENT_TARGETS)
5730  $(BUILT_TARGET_FILES_PACKAGE): $(INTERNAL_VENDOR_BOOTCONFIG_TARGET)
5731  # The vendor ramdisk may be built from the recovery ramdisk.
5732  ifeq (true,$(BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT))
5733    $(BUILT_TARGET_FILES_PACKAGE): $(INTERNAL_RECOVERY_RAMDISK_FILES_TIMESTAMP)
5734  endif
5735endif
5736
5737ifdef BUILDING_RECOVERY_IMAGE
5738  # TODO(b/30414428): Can't depend on INTERNAL_RECOVERYIMAGE_FILES alone like other
5739  # BUILT_TARGET_FILES_PACKAGE dependencies because currently there're cp/rsync/rm
5740  # commands in build-recoveryimage-target, which would touch the files under
5741  # TARGET_RECOVERY_OUT and race with packaging target-files.zip.
5742  ifeq ($(BOARD_USES_RECOVERY_AS_BOOT),true)
5743    $(BUILT_TARGET_FILES_PACKAGE): $(INSTALLED_BOOTIMAGE_TARGET)
5744  else
5745    $(BUILT_TARGET_FILES_PACKAGE): $(INSTALLED_RECOVERYIMAGE_TARGET)
5746  endif
5747  $(BUILT_TARGET_FILES_PACKAGE): $(INTERNAL_RECOVERYIMAGE_FILES)
5748endif
5749
5750# Conditionally depend on the image files if the image is being built so the
5751# target-files.zip rule doesn't wait on the image creation rule, or the image
5752# if it is coming from a prebuilt.
5753
5754ifdef BUILDING_VENDOR_IMAGE
5755  $(BUILT_TARGET_FILES_PACKAGE): $(INTERNAL_VENDORIMAGE_FILES)
5756else ifdef BOARD_PREBUILT_VENDORIMAGE
5757  $(BUILT_TARGET_FILES_PACKAGE): $(INSTALLED_VENDORIMAGE_TARGET)
5758endif
5759
5760ifdef BUILDING_PRODUCT_IMAGE
5761  $(BUILT_TARGET_FILES_PACKAGE): $(INTERNAL_PRODUCTIMAGE_FILES)
5762else ifdef BOARD_PREBUILT_PRODUCTIMAGE
5763  $(BUILT_TARGET_FILES_PACKAGE): $(INSTALLED_PRODUCTIMAGE_TARGET)
5764endif
5765
5766ifdef BUILDING_SYSTEM_EXT_IMAGE
5767  $(BUILT_TARGET_FILES_PACKAGE): $(INTERNAL_SYSTEM_EXTIMAGE_FILES)
5768else ifdef BOARD_PREBUILT_SYSTEM_EXTIMAGE
5769  $(BUILT_TARGET_FILES_PACKAGE): $(INSTALLED_SYSTEM_EXTIMAGE_TARGET)
5770endif
5771
5772ifneq (,$(BUILDING_BOOT_IMAGE)$(BUILDING_INIT_BOOT_IMAGE))
5773  $(BUILT_TARGET_FILES_PACKAGE): $(INTERNAL_RAMDISK_FILES)
5774endif  # BUILDING_BOOT_IMAGE != "" || BUILDING_INIT_BOOT_IMAGE != ""
5775
5776ifneq (,$(INTERNAL_PREBUILT_BOOTIMAGE) $(filter true,$(BOARD_COPY_BOOT_IMAGE_TO_TARGET_FILES)))
5777  $(BUILT_TARGET_FILES_PACKAGE): $(INSTALLED_BOOTIMAGE_TARGET)
5778endif
5779
5780ifdef BUILDING_ODM_IMAGE
5781  $(BUILT_TARGET_FILES_PACKAGE): $(INTERNAL_ODMIMAGE_FILES)
5782else ifdef BOARD_PREBUILT_ODMIMAGE
5783  $(BUILT_TARGET_FILES_PACKAGE): $(INSTALLED_ODMIMAGE_TARGET)
5784endif
5785
5786ifdef BUILDING_VENDOR_DLKM_IMAGE
5787  $(BUILT_TARGET_FILES_PACKAGE): $(INTERNAL_VENDOR_DLKMIMAGE_FILES)
5788else ifdef BOARD_PREBUILT_VENDOR_DLKMIMAGE
5789  $(BUILT_TARGET_FILES_PACKAGE): $(INSTALLED_VENDOR_DLKMIMAGE_TARGET)
5790endif
5791
5792ifdef BUILDING_ODM_DLKM_IMAGE
5793  $(BUILT_TARGET_FILES_PACKAGE): $(INTERNAL_ODM_DLKMIMAGE_FILES)
5794else ifdef BOARD_PREBUILT_ODM_DLKMIMAGE
5795  $(BUILT_TARGET_FILES_PACKAGE): $(INSTALLED_ODM_DLKMIMAGE_TARGET)
5796endif
5797
5798ifdef BUILDING_SYSTEM_DLKM_IMAGE
5799  $(BUILT_TARGET_FILES_PACKAGE): $(INTERNAL_SYSTEM_DLKMIMAGE_FILES)
5800else ifdef BOARD_PREBUILT_SYSTEM_DLKMIMAGE
5801  $(BUILT_TARGET_FILES_PACKAGE): $(INSTALLED_SYSTEM_DLKMIMAGE_TARGET)
5802endif
5803
5804ifeq ($(BUILD_QEMU_IMAGES),true)
5805  MK_VBMETA_BOOT_KERNEL_CMDLINE_SH := device/generic/goldfish/tools/mk_vbmeta_boot_params.sh
5806  $(BUILT_TARGET_FILES_PACKAGE): $(MK_VBMETA_BOOT_KERNEL_CMDLINE_SH)
5807endif
5808
5809ifdef BOARD_PREBUILT_BOOTLOADER
5810$(BUILT_TARGET_FILES_PACKAGE): $(INSTALLED_BOOTLOADER_MODULE)
5811droidcore-unbundled: $(INSTALLED_BOOTLOADER_MODULE)
5812endif
5813
5814# Depending on the various images guarantees that the underlying
5815# directories are up-to-date.
5816$(BUILT_TARGET_FILES_PACKAGE): \
5817	    $(INSTALLED_RADIOIMAGE_TARGET) \
5818	    $(INSTALLED_RECOVERYIMAGE_TARGET) \
5819	    $(INSTALLED_CACHEIMAGE_TARGET) \
5820	    $(INSTALLED_DTBOIMAGE_TARGET) \
5821	    $(INSTALLED_PVMFWIMAGE_TARGET) \
5822	    $(INSTALLED_PVMFW_BINARY_TARGET) \
5823	    $(INSTALLED_PVMFW_EMBEDDED_AVBKEY_TARGET) \
5824	    $(INSTALLED_CUSTOMIMAGES_TARGET) \
5825	    $(INSTALLED_ANDROID_INFO_TXT_TARGET) \
5826	    $(INSTALLED_KERNEL_TARGET) \
5827	    $(INSTALLED_RAMDISK_TARGET) \
5828	    $(INSTALLED_DTBIMAGE_TARGET) \
5829	    $(INSTALLED_2NDBOOTLOADER_TARGET) \
5830	    $(BOARD_PREBUILT_DTBOIMAGE) \
5831	    $(BOARD_PREBUILT_RECOVERY_DTBOIMAGE) \
5832	    $(BOARD_RECOVERY_ACPIO) \
5833	    $(PRODUCT_SYSTEM_BASE_FS_PATH) \
5834	    $(PRODUCT_VENDOR_BASE_FS_PATH) \
5835	    $(PRODUCT_PRODUCT_BASE_FS_PATH) \
5836	    $(PRODUCT_SYSTEM_EXT_BASE_FS_PATH) \
5837	    $(PRODUCT_ODM_BASE_FS_PATH) \
5838	    $(PRODUCT_VENDOR_DLKM_BASE_FS_PATH) \
5839	    $(PRODUCT_ODM_DLKM_BASE_FS_PATH) \
5840	    $(PRODUCT_SYSTEM_DLKM_BASE_FS_PATH) \
5841	    $(LPMAKE) \
5842	    $(SELINUX_FC) \
5843	    $(INSTALLED_MISC_INFO_TARGET) \
5844	    $(APKCERTS_FILE) \
5845	    $(SOONG_APEX_KEYS_FILE) \
5846	    $(SOONG_ZIP) \
5847	    $(HOST_OUT_EXECUTABLES)/fs_config \
5848	    $(ADD_IMG_TO_TARGET_FILES) \
5849	    $(MAKE_RECOVERY_PATCH) \
5850	    $(BUILT_KERNEL_CONFIGS_FILE) \
5851	    $(BUILT_KERNEL_VERSION_FILE) \
5852	    | $(ACP)
5853	@echo "Package target files: $@"
5854	$(hide) rm -rf $@ $@.list $(zip_root)
5855	$(hide) mkdir -p $(dir $@) $(zip_root)
5856ifneq (,$(INSTALLED_RECOVERYIMAGE_TARGET)$(filter true,$(BOARD_USES_RECOVERY_AS_BOOT))$(filter true,$(BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT)))
5857	@# Components of the recovery image
5858	$(hide) mkdir -p $(zip_root)/$(PRIVATE_RECOVERY_OUT)
5859# Exclude recovery files in the default vendor ramdisk if including a standalone
5860# recovery ramdisk in vendor_boot.
5861ifneq (true,$(BOARD_INCLUDE_RECOVERY_RAMDISK_IN_VENDOR_BOOT))
5862	$(hide) $(call package_files-copy-root, \
5863	    $(TARGET_RECOVERY_ROOT_OUT),$(zip_root)/$(PRIVATE_RECOVERY_OUT)/RAMDISK)
5864endif
5865ifdef INSTALLED_KERNEL_TARGET
5866ifneq (,$(filter true,$(BOARD_USES_RECOVERY_AS_BOOT)))
5867	cp $(INSTALLED_KERNEL_TARGET) $(zip_root)/$(PRIVATE_RECOVERY_OUT)/
5868else ifneq (true,$(BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE))
5869	cp $(firstword $(INSTALLED_KERNEL_TARGET)) $(zip_root)/$(PRIVATE_RECOVERY_OUT)/kernel
5870endif
5871endif
5872ifneq (truetrue,$(strip $(BUILDING_VENDOR_BOOT_IMAGE))$(strip $(BOARD_USES_RECOVERY_AS_BOOT)))
5873ifdef INSTALLED_2NDBOOTLOADER_TARGET
5874	cp $(INSTALLED_2NDBOOTLOADER_TARGET) $(zip_root)/$(PRIVATE_RECOVERY_OUT)/second
5875endif
5876ifdef BOARD_INCLUDE_RECOVERY_DTBO
5877ifdef BOARD_PREBUILT_RECOVERY_DTBOIMAGE
5878	cp $(BOARD_PREBUILT_RECOVERY_DTBOIMAGE) $(zip_root)/$(PRIVATE_RECOVERY_OUT)/recovery_dtbo
5879else
5880	cp $(BOARD_PREBUILT_DTBOIMAGE) $(zip_root)/$(PRIVATE_RECOVERY_OUT)/recovery_dtbo
5881endif
5882endif # BOARD_INCLUDE_RECOVERY_DTBO
5883ifdef BOARD_INCLUDE_RECOVERY_ACPIO
5884	cp $(BOARD_RECOVERY_ACPIO) $(zip_root)/$(PRIVATE_RECOVERY_OUT)/recovery_acpio
5885endif
5886ifdef INSTALLED_DTBIMAGE_TARGET
5887	cp $(INSTALLED_DTBIMAGE_TARGET) $(zip_root)/$(PRIVATE_RECOVERY_OUT)/dtb
5888endif
5889ifneq (true,$(BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE))
5890ifdef INTERNAL_KERNEL_CMDLINE
5891	echo "$(INTERNAL_KERNEL_CMDLINE)" > $(zip_root)/$(PRIVATE_RECOVERY_OUT)/cmdline
5892endif # INTERNAL_KERNEL_CMDLINE != ""
5893endif # BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE != true
5894ifdef BOARD_KERNEL_BASE
5895	echo "$(BOARD_KERNEL_BASE)" > $(zip_root)/$(PRIVATE_RECOVERY_OUT)/base
5896endif
5897ifdef BOARD_KERNEL_PAGESIZE
5898	echo "$(BOARD_KERNEL_PAGESIZE)" > $(zip_root)/$(PRIVATE_RECOVERY_OUT)/pagesize
5899endif
5900endif # not (BUILDING_VENDOR_BOOT_IMAGE and BOARD_USES_RECOVERY_AS_BOOT)
5901endif # INSTALLED_RECOVERYIMAGE_TARGET defined or BOARD_USES_RECOVERY_AS_BOOT is true
5902	@# Components of the boot image
5903	$(hide) mkdir -p $(zip_root)/BOOT
5904	$(hide) mkdir -p $(zip_root)/ROOT
5905	$(hide) $(call package_files-copy-root, \
5906	    $(TARGET_ROOT_OUT),$(zip_root)/ROOT)
5907	@# If we are using recovery as boot, this is already done when processing recovery.
5908ifneq ($(BOARD_USES_RECOVERY_AS_BOOT),true)
5909	$(hide) $(call package_files-copy-root, \
5910	    $(TARGET_RAMDISK_OUT),$(zip_root)/BOOT/RAMDISK)
5911ifdef INSTALLED_KERNEL_TARGET
5912	$(hide) cp $(INSTALLED_KERNEL_TARGET) $(zip_root)/BOOT/
5913endif
5914ifeq (true,$(BOARD_USES_GENERIC_KERNEL_IMAGE))
5915	echo "$(GENERIC_KERNEL_CMDLINE)" > $(zip_root)/BOOT/cmdline
5916else ifndef INSTALLED_VENDOR_BOOTIMAGE_TARGET # && BOARD_USES_GENERIC_KERNEL_IMAGE != true
5917	echo "$(INTERNAL_KERNEL_CMDLINE)" > $(zip_root)/BOOT/cmdline
5918ifdef INSTALLED_2NDBOOTLOADER_TARGET
5919	cp $(INSTALLED_2NDBOOTLOADER_TARGET) $(zip_root)/BOOT/second
5920endif
5921ifdef INSTALLED_DTBIMAGE_TARGET
5922	cp $(INSTALLED_DTBIMAGE_TARGET) $(zip_root)/BOOT/dtb
5923endif
5924ifdef BOARD_KERNEL_BASE
5925	echo "$(BOARD_KERNEL_BASE)" > $(zip_root)/BOOT/base
5926endif
5927ifdef BOARD_KERNEL_PAGESIZE
5928	echo "$(BOARD_KERNEL_PAGESIZE)" > $(zip_root)/BOOT/pagesize
5929endif
5930endif # INSTALLED_VENDOR_BOOTIMAGE_TARGET == "" && BOARD_USES_GENERIC_KERNEL_IMAGE != true
5931endif # BOARD_USES_RECOVERY_AS_BOOT not true
5932	$(hide) $(foreach t,$(INSTALLED_RADIOIMAGE_TARGET),\
5933	            mkdir -p $(zip_root)/RADIO; \
5934	            cp $(t) $(zip_root)/RADIO/$(notdir $(t));)
5935ifdef INSTALLED_VENDOR_BOOTIMAGE_TARGET
5936	mkdir -p $(zip_root)/VENDOR_BOOT
5937	$(call package_files-copy-root, \
5938	    $(TARGET_VENDOR_RAMDISK_OUT),$(zip_root)/VENDOR_BOOT/RAMDISK)
5939ifdef INSTALLED_DTBIMAGE_TARGET
5940ifneq ($(BUILDING_VENDOR_KERNEL_BOOT_IMAGE),true)
5941	cp $(INSTALLED_DTBIMAGE_TARGET) $(zip_root)/VENDOR_BOOT/dtb
5942endif
5943endif # end of INSTALLED_DTBIMAGE_TARGET
5944ifdef INTERNAL_VENDOR_BOOTCONFIG_TARGET
5945	cp $(INTERNAL_VENDOR_BOOTCONFIG_TARGET) $(zip_root)/VENDOR_BOOT/vendor_bootconfig
5946endif
5947ifdef BOARD_KERNEL_BASE
5948	echo "$(BOARD_KERNEL_BASE)" > $(zip_root)/VENDOR_BOOT/base
5949endif
5950ifdef BOARD_KERNEL_PAGESIZE
5951	echo "$(BOARD_KERNEL_PAGESIZE)" > $(zip_root)/VENDOR_BOOT/pagesize
5952endif
5953	echo "$(INTERNAL_KERNEL_CMDLINE)" > $(zip_root)/VENDOR_BOOT/vendor_cmdline
5954ifdef INTERNAL_VENDOR_RAMDISK_FRAGMENTS
5955	echo "$(INTERNAL_VENDOR_RAMDISK_FRAGMENTS)" > "$(zip_root)/VENDOR_BOOT/vendor_ramdisk_fragments"
5956	$(foreach vendor_ramdisk_fragment,$(INTERNAL_VENDOR_RAMDISK_FRAGMENTS), \
5957	  mkdir -p $(zip_root)/VENDOR_BOOT/RAMDISK_FRAGMENTS/$(vendor_ramdisk_fragment); \
5958	  echo "$(BOARD_VENDOR_RAMDISK_FRAGMENT.$(vendor_ramdisk_fragment).MKBOOTIMG_ARGS)" > "$(zip_root)/VENDOR_BOOT/RAMDISK_FRAGMENTS/$(vendor_ramdisk_fragment)/mkbootimg_args"; \
5959	  $(eval prebuilt_ramdisk := $(BOARD_VENDOR_RAMDISK_FRAGMENT.$(vendor_ramdisk_fragment).PREBUILT)) \
5960	  $(if $(prebuilt_ramdisk), \
5961	    cp "$(prebuilt_ramdisk)" "$(zip_root)/VENDOR_BOOT/RAMDISK_FRAGMENTS/$(vendor_ramdisk_fragment)/prebuilt_ramdisk";, \
5962	    $(call package_files-copy-root, \
5963	      $(VENDOR_RAMDISK_FRAGMENT.$(vendor_ramdisk_fragment).STAGING_DIR), \
5964	      $(zip_root)/VENDOR_BOOT/RAMDISK_FRAGMENTS/$(vendor_ramdisk_fragment)/RAMDISK); \
5965	  ))
5966endif # INTERNAL_VENDOR_RAMDISK_FRAGMENTS != ""
5967endif # INSTALLED_VENDOR_BOOTIMAGE_TARGET
5968ifdef INSTALLED_VENDOR_KERNEL_BOOTIMAGE_TARGET
5969	mkdir -p $(zip_root)/VENDOR_KERNEL_BOOT
5970	$(call package_files-copy-root, \
5971	    $(TARGET_VENDOR_KERNEL_RAMDISK_OUT),$(zip_root)/VENDOR_KERNEL_BOOT/RAMDISK)
5972ifdef INSTALLED_DTBIMAGE_TARGET
5973	cp $(INSTALLED_DTBIMAGE_TARGET) $(zip_root)/VENDOR_KERNEL_BOOT/dtb
5974endif
5975ifdef BOARD_KERNEL_PAGESIZE
5976	echo "$(BOARD_KERNEL_PAGESIZE)" > $(zip_root)/VENDOR_KERNEL_BOOT/pagesize
5977endif
5978endif # INSTALLED_VENDOR_BOOTIMAGE_TARGET
5979ifdef BUILDING_SYSTEM_IMAGE
5980	@# Contents of the system image
5981	$(hide) $(call package_files-copy-root, \
5982	    $(SYSTEMIMAGE_SOURCE_DIR),$(zip_root)/SYSTEM)
5983else ifdef INSTALLED_BUILD_PROP_TARGET
5984	@# Copy the system build.prop even if not building a system image
5985	@# because add_img_to_target_files may need it to build other partition
5986	@# images.
5987	$(hide) mkdir -p "$(zip_root)/SYSTEM"
5988	$(hide) cp "$(INSTALLED_BUILD_PROP_TARGET)" "$(patsubst $(TARGET_OUT)/%,$(zip_root)/SYSTEM/%,$(INSTALLED_BUILD_PROP_TARGET))"
5989endif
5990ifdef BUILDING_USERDATA_IMAGE
5991	@# Contents of the data image
5992	$(hide) $(call package_files-copy-root, \
5993	    $(TARGET_OUT_DATA),$(zip_root)/DATA)
5994endif
5995ifdef BUILDING_VENDOR_IMAGE
5996	@# Contents of the vendor image
5997	$(hide) $(call package_files-copy-root, \
5998	    $(TARGET_OUT_VENDOR),$(zip_root)/VENDOR)
5999endif
6000ifdef BUILDING_PRODUCT_IMAGE
6001	@# Contents of the product image
6002	$(hide) $(call package_files-copy-root, \
6003	    $(TARGET_OUT_PRODUCT),$(zip_root)/PRODUCT)
6004endif
6005ifdef BUILDING_SYSTEM_EXT_IMAGE
6006	@# Contents of the system_ext image
6007	$(hide) $(call package_files-copy-root, \
6008	    $(TARGET_OUT_SYSTEM_EXT),$(zip_root)/SYSTEM_EXT)
6009endif
6010ifdef BUILDING_ODM_IMAGE
6011	@# Contents of the odm image
6012	$(hide) $(call package_files-copy-root, \
6013	    $(TARGET_OUT_ODM),$(zip_root)/ODM)
6014endif
6015ifdef BUILDING_VENDOR_DLKM_IMAGE
6016	@# Contents of the vendor_dlkm image
6017	$(hide) $(call package_files-copy-root, \
6018	    $(TARGET_OUT_VENDOR_DLKM),$(zip_root)/VENDOR_DLKM)
6019endif
6020ifdef BUILDING_ODM_DLKM_IMAGE
6021	@# Contents of the odm_dlkm image
6022	$(hide) $(call package_files-copy-root, \
6023	    $(TARGET_OUT_ODM_DLKM),$(zip_root)/ODM_DLKM)
6024endif
6025ifdef BUILDING_SYSTEM_DLKM_IMAGE
6026	@# Contents of the system_dlkm image
6027	$(hide) $(call package_files-copy-root, \
6028	    $(TARGET_OUT_SYSTEM_DLKM),$(zip_root)/SYSTEM_DLKM)
6029endif
6030ifdef BUILDING_SYSTEM_OTHER_IMAGE
6031	@# Contents of the system_other image
6032	$(hide) $(call package_files-copy-root, \
6033	    $(TARGET_OUT_SYSTEM_OTHER),$(zip_root)/SYSTEM_OTHER)
6034endif
6035	@# Extra contents of the OTA package
6036	$(hide) mkdir -p $(zip_root)/OTA
6037	$(hide) cp $(INSTALLED_ANDROID_INFO_TXT_TARGET) $(zip_root)/OTA/
6038ifdef BUILDING_RAMDISK_IMAGE
6039ifeq (true,$(BOARD_IMG_USE_RAMDISK))
6040	@# Contents of the ramdisk image
6041	$(hide) mkdir -p $(zip_root)/IMAGES
6042	$(hide) cp $(INSTALLED_RAMDISK_TARGET) $(zip_root)/IMAGES/
6043endif
6044endif
6045ifeq ($(TARGET_OTA_ALLOW_NON_AB),true)
6046ifneq ($(built_ota_tools),)
6047	$(hide) mkdir -p $(zip_root)/OTA/bin
6048	$(hide) cp $(PRIVATE_OTA_TOOLS) $(zip_root)/OTA/bin/
6049endif
6050endif
6051	@# Files that do not end up in any images, but are necessary to
6052	@# build them.
6053	$(hide) mkdir -p $(zip_root)/META
6054	$(hide) cp $(APKCERTS_FILE) $(zip_root)/META/apkcerts.txt
6055	$(hide) cp $(SOONG_APEX_KEYS_FILE) $(zip_root)/META/apexkeys.txt
6056ifneq ($(tool_extension),)
6057	$(hide) cp $(PRIVATE_TOOL_EXTENSION) $(zip_root)/META/
6058endif
6059	$(hide) echo "$(PRODUCT_OTA_PUBLIC_KEYS)" > $(zip_root)/META/otakeys.txt
6060	$(hide) cp $(SELINUX_FC) $(zip_root)/META/file_contexts.bin
6061	$(hide) cp $(INSTALLED_MISC_INFO_TARGET) $(zip_root)/META/misc_info.txt
6062ifneq ($(PRODUCT_SYSTEM_BASE_FS_PATH),)
6063	$(hide) cp $(PRODUCT_SYSTEM_BASE_FS_PATH) \
6064	  $(zip_root)/META/$(notdir $(PRODUCT_SYSTEM_BASE_FS_PATH))
6065endif
6066ifneq ($(PRODUCT_VENDOR_BASE_FS_PATH),)
6067	$(hide) cp $(PRODUCT_VENDOR_BASE_FS_PATH) \
6068	  $(zip_root)/META/$(notdir $(PRODUCT_VENDOR_BASE_FS_PATH))
6069endif
6070ifneq ($(PRODUCT_PRODUCT_BASE_FS_PATH),)
6071	$(hide) cp $(PRODUCT_PRODUCT_BASE_FS_PATH) \
6072	  $(zip_root)/META/$(notdir $(PRODUCT_PRODUCT_BASE_FS_PATH))
6073endif
6074ifneq ($(PRODUCT_SYSTEM_EXT_BASE_FS_PATH),)
6075	$(hide) cp $(PRODUCT_SYSTEM_EXT_BASE_FS_PATH) \
6076	  $(zip_root)/META/$(notdir $(PRODUCT_SYSTEM_EXT_BASE_FS_PATH))
6077endif
6078ifneq ($(PRODUCT_ODM_BASE_FS_PATH),)
6079	$(hide) cp $(PRODUCT_ODM_BASE_FS_PATH) \
6080	  $(zip_root)/META/$(notdir $(PRODUCT_ODM_BASE_FS_PATH))
6081endif
6082ifneq ($(PRODUCT_VENDOR_DLKM_BASE_FS_PATH),)
6083	$(hide) cp $(PRODUCT_VENDOR_DLKM_BASE_FS_PATH) \
6084	  $(zip_root)/META/$(notdir $(PRODUCT_VENDOR_DLKM_BASE_FS_PATH))
6085endif
6086ifneq ($(PRODUCT_ODM_DLKM_BASE_FS_PATH),)
6087	$(hide) cp $(PRODUCT_ODM_DLKM_BASE_FS_PATH) \
6088	  $(zip_root)/META/$(notdir $(PRODUCT_ODM_DLKM_BASE_FS_PATH))
6089endif
6090ifneq ($(PRODUCT_SYSTEM_DLKM_BASE_FS_PATH),)
6091	$(hide) cp $(PRODUCT_SYSTEM_DLKM_BASE_FS_PATH) \
6092	  $(zip_root)/META/$(notdir $(PRODUCT_SYSTEM_DLKM_BASE_FS_PATH))
6093endif
6094ifeq ($(TARGET_OTA_ALLOW_NON_AB),true)
6095ifneq ($(INSTALLED_RECOVERYIMAGE_TARGET),)
6096	$(hide) PATH=$(INTERNAL_USERIMAGES_BINARY_PATHS):$$PATH MKBOOTIMG=$(MKBOOTIMG) \
6097	    $(MAKE_RECOVERY_PATCH) $(zip_root) $(zip_root)
6098endif
6099endif
6100ifeq ($(AB_OTA_UPDATER),true)
6101	@# When using the A/B updater, include the updater config files in the zip.
6102	$(hide) cp $(TOPDIR)system/update_engine/update_engine.conf $(zip_root)/META/update_engine_config.txt
6103	$(hide) cp $(TOPDIR)external/zucchini/version_info.h $(zip_root)/META/zucchini_config.txt
6104	$(hide) cp $(HOST_OUT_SHARED_LIBRARIES)/liblz4.so $(zip_root)/META/liblz4.so
6105	$(hide) for part in $(sort $(AB_OTA_PARTITIONS)); do \
6106	  echo "$${part}" >> $(zip_root)/META/ab_partitions.txt; \
6107	done
6108	$(hide) for conf in $(strip $(AB_OTA_POSTINSTALL_CONFIG)); do \
6109	  echo "$${conf}" >> $(zip_root)/META/postinstall_config.txt; \
6110	done
6111ifdef OSRELEASED_DIRECTORY
6112	$(hide) cp $(TARGET_OUT_OEM)/$(OSRELEASED_DIRECTORY)/product_id $(zip_root)/META/product_id.txt
6113	$(hide) cp $(TARGET_OUT_OEM)/$(OSRELEASED_DIRECTORY)/product_version $(zip_root)/META/product_version.txt
6114	$(hide) cp $(TARGET_OUT_ETC)/$(OSRELEASED_DIRECTORY)/system_version $(zip_root)/META/system_version.txt
6115endif
6116endif
6117ifeq ($(BREAKPAD_GENERATE_SYMBOLS),true)
6118	@# If breakpad symbols have been generated, add them to the zip.
6119	$(hide) cp -R $(TARGET_OUT_BREAKPAD) $(zip_root)/BREAKPAD
6120endif
6121ifdef BOARD_PREBUILT_VENDORIMAGE
6122	$(hide) mkdir -p $(zip_root)/IMAGES
6123	$(hide) cp $(INSTALLED_VENDORIMAGE_TARGET) $(zip_root)/IMAGES/
6124endif
6125ifdef BOARD_PREBUILT_PRODUCTIMAGE
6126	$(hide) mkdir -p $(zip_root)/IMAGES
6127	$(hide) cp $(INSTALLED_PRODUCTIMAGE_TARGET) $(zip_root)/IMAGES/
6128endif
6129ifdef BOARD_PREBUILT_SYSTEM_EXTIMAGE
6130	$(hide) mkdir -p $(zip_root)/IMAGES
6131	$(hide) cp $(INSTALLED_SYSTEM_EXTIMAGE_TARGET) $(zip_root)/IMAGES/
6132endif
6133ifdef BOARD_PREBUILT_INIT_BOOT_IMAGE
6134	$(hide) mkdir -p $(zip_root)/PREBUILT_IMAGES
6135	$(hide) cp $(INSTALLED_INIT_BOOT_IMAGE_TARGET) $(zip_root)/PREBUILT_IMAGES/
6136endif
6137
6138ifndef BOARD_PREBUILT_BOOTIMAGE
6139ifneq (,$(strip $(INTERNAL_PREBUILT_BOOTIMAGE) $(filter true,$(BOARD_COPY_BOOT_IMAGE_TO_TARGET_FILES))))
6140ifdef INSTALLED_BOOTIMAGE_TARGET
6141	$(hide) mkdir -p $(zip_root)/IMAGES
6142	$(hide) cp $(INSTALLED_BOOTIMAGE_TARGET) $(zip_root)/IMAGES/
6143endif # INSTALLED_BOOTIMAGE_TARGET
6144endif # INTERNAL_PREBUILT_BOOTIMAGE != "" || BOARD_COPY_BOOT_IMAGE_TO_TARGET_FILES == true
6145else # BOARD_PREBUILT_BOOTIMAGE is defined
6146	$(hide) mkdir -p $(zip_root)/PREBUILT_IMAGES
6147	$(hide) cp $(INSTALLED_BOOTIMAGE_TARGET) $(zip_root)/PREBUILT_IMAGES/
6148endif # BOARD_PREBUILT_BOOTIMAGE
6149ifdef BOARD_PREBUILT_ODMIMAGE
6150	$(hide) mkdir -p $(zip_root)/IMAGES
6151	$(hide) cp $(INSTALLED_ODMIMAGE_TARGET) $(zip_root)/IMAGES/
6152endif
6153ifdef BOARD_PREBUILT_VENDOR_DLKMIMAGE
6154	$(hide) mkdir -p $(zip_root)/IMAGES
6155	$(hide) cp $(INSTALLED_VENDOR_DLKMIMAGE_TARGET) $(zip_root)/IMAGES/
6156endif
6157ifdef BOARD_PREBUILT_ODM_DLKMIMAGE
6158	$(hide) mkdir -p $(zip_root)/IMAGES
6159	$(hide) cp $(INSTALLED_ODM_DLKMIMAGE_TARGET) $(zip_root)/IMAGES/
6160endif
6161ifdef BOARD_PREBUILT_SYSTEM_DLKMIMAGE
6162	$(hide) mkdir -p $(zip_root)/IMAGES
6163	$(hide) cp $(INSTALLED_SYSTEM_DLKMIMAGE_TARGET) $(zip_root)/IMAGES/
6164endif
6165ifdef BOARD_PREBUILT_DTBOIMAGE
6166	$(hide) mkdir -p $(zip_root)/PREBUILT_IMAGES
6167	$(hide) cp $(INSTALLED_DTBOIMAGE_TARGET) $(zip_root)/PREBUILT_IMAGES/
6168endif # BOARD_PREBUILT_DTBOIMAGE
6169ifeq ($(BOARD_USES_PVMFWIMAGE),true)
6170	$(hide) mkdir -p $(zip_root)/PREBUILT_IMAGES
6171	$(hide) cp $(INSTALLED_PVMFWIMAGE_TARGET) $(zip_root)/PREBUILT_IMAGES/
6172	$(hide) cp $(INSTALLED_PVMFW_EMBEDDED_AVBKEY_TARGET) $(zip_root)/PREBUILT_IMAGES/
6173	$(hide) mkdir -p $(zip_root)/PVMFW
6174	$(hide) cp $(INSTALLED_PVMFW_BINARY_TARGET) $(zip_root)/PVMFW/
6175endif
6176ifdef BOARD_PREBUILT_BOOTLOADER
6177	$(hide) mkdir -p $(zip_root)/IMAGES
6178	$(hide) cp $(INSTALLED_BOOTLOADER_MODULE) $(zip_root)/IMAGES/
6179endif
6180ifneq ($(strip $(BOARD_CUSTOMIMAGES_PARTITION_LIST)),)
6181	$(hide) mkdir -p $(zip_root)/PREBUILT_IMAGES
6182	$(hide) $(foreach partition,$(BOARD_CUSTOMIMAGES_PARTITION_LIST), \
6183	    $(foreach image,$(BOARD_AVB_$(call to-upper,$(partition))_IMAGE_LIST),cp $(image) $(zip_root)/PREBUILT_IMAGES/;))
6184endif # BOARD_CUSTOMIMAGES_PARTITION_LIST
6185	@# The radio images in BOARD_PACK_RADIOIMAGES will be additionally copied from RADIO/ into
6186	@# IMAGES/, which then will be added into <product>-img.zip. Such images must be listed in
6187	@# INSTALLED_RADIOIMAGE_TARGET.
6188	$(hide) $(foreach part,$(BOARD_PACK_RADIOIMAGES), \
6189	    echo $(part) >> $(zip_root)/META/pack_radioimages.txt;)
6190	@# Run fs_config on all the system, vendor, boot ramdisk,
6191	@# and recovery ramdisk files in the zip, and save the output
6192ifdef BUILDING_SYSTEM_IMAGE
6193	$(hide) $(call fs_config,$(zip_root)/SYSTEM,system/) > $(zip_root)/META/filesystem_config.txt
6194endif
6195ifdef BUILDING_VENDOR_IMAGE
6196	$(hide) $(call fs_config,$(zip_root)/VENDOR,vendor/) > $(zip_root)/META/vendor_filesystem_config.txt
6197endif
6198ifdef BUILDING_PRODUCT_IMAGE
6199	$(hide) $(call fs_config,$(zip_root)/PRODUCT,product/) > $(zip_root)/META/product_filesystem_config.txt
6200endif
6201ifdef BUILDING_SYSTEM_EXT_IMAGE
6202	$(hide) $(call fs_config,$(zip_root)/SYSTEM_EXT,system_ext/) > $(zip_root)/META/system_ext_filesystem_config.txt
6203endif
6204ifdef BUILDING_ODM_IMAGE
6205	$(hide) $(call fs_config,$(zip_root)/ODM,odm/) > $(zip_root)/META/odm_filesystem_config.txt
6206endif
6207ifdef BUILDING_VENDOR_DLKM_IMAGE
6208	$(hide) $(call fs_config,$(zip_root)/VENDOR_DLKM,vendor_dlkm/) > $(zip_root)/META/vendor_dlkm_filesystem_config.txt
6209endif
6210ifdef BUILDING_ODM_DLKM_IMAGE
6211	$(hide) $(call fs_config,$(zip_root)/ODM_DLKM,odm_dlkm/) > $(zip_root)/META/odm_dlkm_filesystem_config.txt
6212endif
6213ifdef BUILDING_SYSTEM_DLKM_IMAGE
6214	$(hide) $(call fs_config,$(zip_root)/SYSTEM_DLKM,system_dlkm/) > $(zip_root)/META/system_dlkm_filesystem_config.txt
6215endif
6216	@# ROOT always contains the files for the root under normal boot.
6217	$(hide) $(call fs_config,$(zip_root)/ROOT,) > $(zip_root)/META/root_filesystem_config.txt
6218	@# BOOT/RAMDISK contains the first stage and recovery ramdisk.
6219	$(hide) $(call fs_config,$(zip_root)/BOOT/RAMDISK,) > $(zip_root)/META/boot_filesystem_config.txt
6220ifdef BUILDING_INIT_BOOT_IMAGE
6221	$(hide) $(call package_files-copy-root, $(TARGET_RAMDISK_OUT),$(zip_root)/INIT_BOOT/RAMDISK)
6222	$(hide) $(call fs_config,$(zip_root)/INIT_BOOT/RAMDISK,) > $(zip_root)/META/init_boot_filesystem_config.txt
6223	$(hide) cp $(RAMDISK_NODE_LIST) $(zip_root)/META/ramdisk_node_list
6224ifdef BOARD_KERNEL_PAGESIZE
6225	$(hide) echo "$(BOARD_KERNEL_PAGESIZE)" > $(zip_root)/INIT_BOOT/pagesize
6226endif # BOARD_KERNEL_PAGESIZE
6227endif # BUILDING_INIT_BOOT_IMAGE
6228ifneq ($(INSTALLED_VENDOR_BOOTIMAGE_TARGET),)
6229	$(call fs_config,$(zip_root)/VENDOR_BOOT/RAMDISK,) > $(zip_root)/META/vendor_boot_filesystem_config.txt
6230endif
6231ifneq ($(INSTALLED_RECOVERYIMAGE_TARGET),)
6232	$(hide) $(call fs_config,$(zip_root)/RECOVERY/RAMDISK,) > $(zip_root)/META/recovery_filesystem_config.txt
6233endif
6234ifdef BUILDING_SYSTEM_OTHER_IMAGE
6235	$(hide) $(call fs_config,$(zip_root)/SYSTEM_OTHER,system/) > $(zip_root)/META/system_other_filesystem_config.txt
6236endif
6237	@# Metadata for compatibility verification.
6238ifdef BUILT_KERNEL_CONFIGS_FILE
6239	$(hide) cp $(BUILT_KERNEL_CONFIGS_FILE) $(zip_root)/META/kernel_configs.txt
6240endif
6241ifdef BUILT_KERNEL_VERSION_FILE
6242	$(hide) cp $(BUILT_KERNEL_VERSION_FILE) $(zip_root)/META/kernel_version.txt
6243endif
6244	rm -rf $(zip_root)/META/dynamic_partitions_info.txt
6245ifeq (true,$(PRODUCT_USE_DYNAMIC_PARTITIONS))
6246	$(call dump-dynamic-partitions-info, $(zip_root)/META/dynamic_partitions_info.txt)
6247endif
6248	PATH=$(INTERNAL_USERIMAGES_BINARY_PATHS):$$PATH MKBOOTIMG=$(MKBOOTIMG) \
6249	    $(ADD_IMG_TO_TARGET_FILES) -a -v -p $(HOST_OUT) $(zip_root)
6250ifeq ($(BUILD_QEMU_IMAGES),true)
6251	$(hide) AVBTOOL=$(AVBTOOL) $(MK_VBMETA_BOOT_KERNEL_CMDLINE_SH) $(zip_root)/IMAGES/vbmeta.img \
6252	    $(zip_root)/IMAGES/system.img $(zip_root)/IMAGES/VerifiedBootParams.textproto
6253endif
6254	@# Zip everything up, preserving symlinks and placing META/ files first to
6255	@# help early validation of the .zip file while uploading it.
6256	$(hide) find $(zip_root)/META | sort >$@.list
6257	$(hide) find $(zip_root) -path $(zip_root)/META -prune -o -print | sort >>$@.list
6258	$(hide) $(SOONG_ZIP) -d -o $@ -C $(zip_root) -r $@.list
6259
6260.PHONY: target-files-package
6261target-files-package: $(BUILT_TARGET_FILES_PACKAGE)
6262
6263$(call declare-1p-container,$(BUILT_TARGET_FILES_PACKAGE),)
6264$(call declare-container-license-deps,$(BUILT_TARGET_FILES_PACKAGE), $(INSTALLED_RADIOIMAGE_TARGET) \
6265            $(INSTALLED_RECOVERYIMAGE_TARGET) \
6266            $(INSTALLED_CACHEIMAGE_TARGET) \
6267            $(INSTALLED_DTBOIMAGE_TARGET) \
6268            $(INSTALLED_PVMFWIMAGE_TARGET) \
6269            $(INSTALLED_PVMFW_EMBEDDED_AVBKEY_TARGET) \
6270            $(INSTALLED_CUSTOMIMAGES_TARGET) \
6271            $(INSTALLED_ANDROID_INFO_TXT_TARGET) \
6272            $(INSTALLED_KERNEL_TARGET) \
6273            $(INSTALLED_RAMDISK_TARGET) \
6274            $(INSTALLED_DTBIMAGE_TARGET) \
6275            $(INSTALLED_2NDBOOTLOADER_TARGET) \
6276            $(BOARD_PREBUILT_DTBOIMAGE) \
6277            $(BOARD_PREBUILT_RECOVERY_DTBOIMAGE) \
6278            $(BOARD_RECOVERY_ACPIO) \
6279            $(PRODUCT_SYSTEM_BASE_FS_PATH) \
6280            $(PRODUCT_VENDOR_BASE_FS_PATH) \
6281            $(PRODUCT_PRODUCT_BASE_FS_PATH) \
6282            $(PRODUCT_SYSTEM_EXT_BASE_FS_PATH) \
6283            $(PRODUCT_ODM_BASE_FS_PATH) \
6284            $(PRODUCT_VENDOR_DLKM_BASE_FS_PATH) \
6285            $(PRODUCT_ODM_DLKM_BASE_FS_PATH) \
6286            $(PRODUCT_SYSTEM_DLKM_BASE_FS_PATH) \
6287            $(LPMAKE) \
6288            $(SELINUX_FC) \
6289            $(INSTALLED_MISC_INFO_TARGET) \
6290            $(APKCERTS_FILE) \
6291            $(SOONG_APEX_KEYS_FILE) \
6292            $(HOST_OUT_EXECUTABLES)/fs_config \
6293            $(ADD_IMG_TO_TARGET_FILES) \
6294            $(MAKE_RECOVERY_PATCH) \
6295            $(BUILT_KERNEL_CONFIGS_FILE) \
6296            $(BUILT_KERNEL_VERSION_FILE),$(BUILT_TARGET_FILES_PACKAGE):)
6297
6298$(call dist-for-goals, target-files-package, $(BUILT_TARGET_FILES_PACKAGE))
6299
6300# -----------------------------------------------------------------
6301# NDK Sysroot Package
6302NDK_SYSROOT_TARGET := $(PRODUCT_OUT)/ndk_sysroot.tar.bz2
6303.PHONY: ndk_sysroot
6304ndk_sysroot: $(NDK_SYSROOT_TARGET)
6305$(NDK_SYSROOT_TARGET): $(SOONG_OUT_DIR)/ndk.timestamp
6306	@echo Package NDK sysroot...
6307	$(hide) tar cjf $@ -C $(SOONG_OUT_DIR) ndk
6308
6309ifeq ($(HOST_OS),linux)
6310$(call dist-for-goals,sdk ndk_sysroot,$(NDK_SYSROOT_TARGET))
6311endif
6312
6313ifeq ($(build_ota_package),true)
6314# -----------------------------------------------------------------
6315# OTA update package
6316
6317# $(1): output file
6318# $(2): additional args
6319define build-ota-package-target
6320PATH=$(INTERNAL_USERIMAGES_BINARY_PATHS):$(dir $(ZIP2ZIP)):$$PATH \
6321    $(OTA_FROM_TARGET_FILES) \
6322        --verbose \
6323        --extracted_input_target_files $(patsubst %.zip,%,$(BUILT_TARGET_FILES_PACKAGE)) \
6324        --path $(HOST_OUT) \
6325        $(if $(OEM_OTA_CONFIG), --oem_settings $(OEM_OTA_CONFIG)) \
6326        $(2) \
6327        $(BUILT_TARGET_FILES_PACKAGE) $(1)
6328endef
6329
6330product_name := $(TARGET_PRODUCT)
6331ifeq ($(TARGET_BUILD_TYPE),debug)
6332  product_name := $(product_name)_debug
6333endif
6334name := $(product_name)-ota-$(FILE_NAME_TAG)
6335
6336INTERNAL_OTA_PACKAGE_TARGET := $(PRODUCT_OUT)/$(name).zip
6337INTERNAL_OTA_METADATA := $(PRODUCT_OUT)/ota_metadata
6338
6339$(call declare-0p-target,$(INTERNAL_OTA_METADATA))
6340
6341$(INTERNAL_OTA_PACKAGE_TARGET): KEY_CERT_PAIR := $(DEFAULT_KEY_CERT_PAIR)
6342$(INTERNAL_OTA_PACKAGE_TARGET): .KATI_IMPLICIT_OUTPUTS := $(INTERNAL_OTA_METADATA)
6343$(INTERNAL_OTA_PACKAGE_TARGET): $(BUILT_TARGET_FILES_PACKAGE) $(OTA_FROM_TARGET_FILES) $(INTERNAL_OTATOOLS_FILES)
6344	@echo "Package OTA: $@"
6345	$(call build-ota-package-target,$@,-k $(KEY_CERT_PAIR) --output_metadata_path $(INTERNAL_OTA_METADATA))
6346
6347$(call declare-1p-container,$(INTERNAL_OTA_PACKAGE_TARGET),)
6348$(call declare-container-license-deps,$(INTERNAL_OTA_PACKAGE_TARGET),$(BUILT_TARGET_FILES_PACKAGE) $(OTA_FROM_TARGET_FILES) $(INTERNAL_OTATOOLS_FILES),$(PRODUCT_OUT)/:/)
6349
6350.PHONY: otapackage
6351otapackage: $(INTERNAL_OTA_PACKAGE_TARGET)
6352
6353ifeq ($(BOARD_BUILD_RETROFIT_DYNAMIC_PARTITIONS_OTA_PACKAGE),true)
6354name := $(product_name)-ota-retrofit-$(FILE_NAME_TAG)
6355
6356INTERNAL_OTA_RETROFIT_DYNAMIC_PARTITIONS_PACKAGE_TARGET := $(PRODUCT_OUT)/$(name).zip
6357$(INTERNAL_OTA_RETROFIT_DYNAMIC_PARTITIONS_PACKAGE_TARGET): KEY_CERT_PAIR := $(DEFAULT_KEY_CERT_PAIR)
6358$(INTERNAL_OTA_RETROFIT_DYNAMIC_PARTITIONS_PACKAGE_TARGET): \
6359    $(BUILT_TARGET_FILES_PACKAGE) \
6360    $(OTA_FROM_TARGET_FILES) \
6361    $(INTERNAL_OTATOOLS_FILES)
6362	@echo "Package OTA (retrofit dynamic partitions): $@"
6363	$(call build-ota-package-target,$@,-k $(KEY_CERT_PAIR) --retrofit_dynamic_partitions)
6364
6365$(call declare-1p-container,$(INTERNAL_OTA_RETROFIT_DYNAMIC_PARTITIONS_PACKAGE_TARGET),)
6366$(call declare-container-license-deps,$(INTERNAL_OTA_RETROFIT_DYNAMIC_PARTITIONS_PACKAGE_TARGET),$(BUILT_TARGET_FILES_PACKAGE) $(OTA_FROM_TARGET_FILES) $(INTERNAL_OTATOOLS_FILES),$(PRODUCT_OUT)/:/)
6367
6368.PHONY: otardppackage
6369
6370otapackage otardppackage: $(INTERNAL_OTA_RETROFIT_DYNAMIC_PARTITIONS_PACKAGE_TARGET)
6371
6372endif # BOARD_BUILD_RETROFIT_DYNAMIC_PARTITIONS_OTA_PACKAGE
6373
6374ifneq ($(BOARD_PARTIAL_OTA_UPDATE_PARTITIONS_LIST),)
6375name := $(product_name)-partial-ota-$(FILE_NAME_TAG)
6376
6377INTERNAL_OTA_PARTIAL_PACKAGE_TARGET := $(PRODUCT_OUT)/$(name).zip
6378$(INTERNAL_OTA_PARTIAL_PACKAGE_TARGET): KEY_CERT_PAIR := $(DEFAULT_KEY_CERT_PAIR)
6379$(INTERNAL_OTA_PARTIAL_PACKAGE_TARGET): $(BUILT_TARGET_FILES_PACKAGE) $(OTA_FROM_TARGET_FILES) $(INTERNAL_OTATOOLS_FILES)
6380	@echo "Package partial OTA: $@"
6381	$(call build-ota-package-target,$@,-k $(KEY_CERT_PAIR) --partial "$(BOARD_PARTIAL_OTA_UPDATE_PARTITIONS_LIST)")
6382
6383$(call declare-1p-container,$(INTERNAL_OTA_PARTIAL_PACKAGE_TARGET),)
6384$(call declare-container-license-deps,$(INTERNAL_OTA_PARTIAL_PACKAGE_TARGET),$(BUILT_TARGET_FILES_PACKAGE) $(OTA_FROM_TARGET_FILES) $(INTERNAL_OTATOOLS_FILES),$(PRODUCT_OUT)/:/)
6385
6386
6387.PHONY: partialotapackage
6388partialotapackage: $(INTERNAL_OTA_PARTIAL_PACKAGE_TARGET)
6389
6390endif # BOARD_PARTIAL_OTA_UPDATE_PARTITIONS_LIST
6391
6392endif    # build_ota_package
6393
6394# -----------------------------------------------------------------
6395# A zip of the appcompat directory containing logs
6396APPCOMPAT_ZIP := $(PRODUCT_OUT)/appcompat.zip
6397# For apps_only build we'll establish the dependency later in build/make/core/main.mk.
6398ifeq (,$(TARGET_BUILD_UNBUNDLED))
6399$(APPCOMPAT_ZIP): $(FULL_SYSTEMIMAGE_DEPS) \
6400	    $(INTERNAL_RAMDISK_FILES) \
6401	    $(INTERNAL_USERDATAIMAGE_FILES) \
6402	    $(INTERNAL_VENDORIMAGE_FILES) \
6403	    $(INTERNAL_PRODUCTIMAGE_FILES) \
6404	    $(INTERNAL_SYSTEM_EXTIMAGE_FILES)
6405endif
6406$(APPCOMPAT_ZIP): PRIVATE_LIST_FILE := $(call intermediates-dir-for,PACKAGING,appcompat)/filelist
6407$(APPCOMPAT_ZIP): $(SOONG_ZIP)
6408	@echo "appcompat logs: $@"
6409	$(hide) rm -rf $@ $(PRIVATE_LIST_FILE)
6410	$(hide) mkdir -p $(dir $@) $(PRODUCT_OUT)/appcompat $(dir $(PRIVATE_LIST_FILE))
6411	$(hide) find $(PRODUCT_OUT)/appcompat | sort >$(PRIVATE_LIST_FILE)
6412	$(hide) $(SOONG_ZIP) -d -o $@ -C $(PRODUCT_OUT)/appcompat -l $(PRIVATE_LIST_FILE)
6413
6414# The mac build doesn't build dex2oat, so create the zip file only if the build OS is linux.
6415ifeq ($(BUILD_OS),linux)
6416ifneq ($(DEX2OAT),)
6417dexpreopt_tools_deps := $(DEXPREOPT_GEN_DEPS) $(DEXPREOPT_GEN)
6418dexpreopt_tools_deps += $(HOST_OUT_EXECUTABLES)/dexdump
6419dexpreopt_tools_deps += $(HOST_OUT_EXECUTABLES)/oatdump
6420DEXPREOPT_TOOLS_ZIP := $(PRODUCT_OUT)/dexpreopt_tools.zip
6421$(DEXPREOPT_TOOLS_ZIP): $(dexpreopt_tools_deps)
6422$(DEXPREOPT_TOOLS_ZIP): PRIVATE_DEXPREOPT_TOOLS_DEPS := $(dexpreopt_tools_deps)
6423$(DEXPREOPT_TOOLS_ZIP): $(SOONG_ZIP)
6424	$(hide) mkdir -p $(dir $@)
6425	$(hide) $(SOONG_ZIP) -d -o $@ -j $(addprefix -f ,$(PRIVATE_DEXPREOPT_TOOLS_DEPS)) -f $$(realpath $(DEX2OAT))
6426$(call declare-1p-target,$(DEXPREOPT_TOOLS_ZIP),)
6427endif # DEX2OAT is set
6428endif # BUILD_OS == linux
6429
6430DEXPREOPT_CONFIG_ZIP := $(PRODUCT_OUT)/dexpreopt_config.zip
6431
6432$(DEXPREOPT_CONFIG_ZIP): $(INSTALLED_SYSTEMIMAGE_TARGET) \
6433    $(INSTALLED_VENDORIMAGE_TARGET) \
6434    $(INSTALLED_ODMIMAGE_TARGET) \
6435    $(INSTALLED_PRODUCTIMAGE_TARGET) \
6436
6437ifeq (,$(TARGET_BUILD_UNBUNDLED))
6438$(DEXPREOPT_CONFIG_ZIP): $(DEX_PREOPT_CONFIG_FOR_MAKE) \
6439	  $(DEX_PREOPT_SOONG_CONFIG_FOR_MAKE) \
6440
6441endif
6442
6443$(DEXPREOPT_CONFIG_ZIP): $(SOONG_ZIP)
6444	$(hide) mkdir -p $(dir $@) $(PRODUCT_OUT)/dexpreopt_config
6445
6446ifeq (,$(TARGET_BUILD_UNBUNDLED))
6447ifneq (,$(DEX_PREOPT_CONFIG_FOR_MAKE))
6448	$(hide) cp $(DEX_PREOPT_CONFIG_FOR_MAKE) $(PRODUCT_OUT)/dexpreopt_config
6449endif
6450ifneq (,$(DEX_PREOPT_SOONG_CONFIG_FOR_MAKE))
6451	$(hide) cp $(DEX_PREOPT_SOONG_CONFIG_FOR_MAKE) $(PRODUCT_OUT)/dexpreopt_config
6452endif
6453endif #!TARGET_BUILD_UNBUNDLED
6454	$(hide) $(SOONG_ZIP) -d -o $@ -C $(PRODUCT_OUT)/dexpreopt_config -D $(PRODUCT_OUT)/dexpreopt_config
6455
6456.PHONY: dexpreopt_config_zip
6457dexpreopt_config_zip: $(DEXPREOPT_CONFIG_ZIP)
6458
6459$(call declare-1p-target,$(DEXPREOPT_CONFIG_ZIP),)
6460
6461# -----------------------------------------------------------------
6462# A zip of the symbols directory.  Keep the full paths to make it
6463# more obvious where these files came from.
6464# Also produces a textproto containing mappings from elf IDs to symbols
6465# filename, which will allow finding the appropriate symbols to deobfuscate
6466# a stack trace frame.
6467#
6468
6469name := $(TARGET_PRODUCT)
6470ifeq ($(TARGET_BUILD_TYPE),debug)
6471  name := $(name)_debug
6472endif
6473
6474# The path to the zip file containing binaries with symbols.
6475SYMBOLS_ZIP := $(PRODUCT_OUT)/$(name)-symbols-$(FILE_NAME_TAG).zip
6476# The path to a file containing mappings from elf IDs to filenames.
6477SYMBOLS_MAPPING := $(PRODUCT_OUT)/$(name)-symbols-mapping-$(FILE_NAME_TAG).textproto
6478.KATI_READONLY := SYMBOLS_ZIP SYMBOLS_MAPPING
6479# For apps_only build we'll establish the dependency later in build/make/core/main.mk.
6480ifeq (,$(TARGET_BUILD_UNBUNDLED))
6481$(SYMBOLS_ZIP): $(INTERNAL_ALLIMAGES_FILES) $(updater_dep)
6482endif
6483$(SYMBOLS_ZIP): PRIVATE_LIST_FILE := $(call intermediates-dir-for,PACKAGING,symbols)/filelist
6484$(SYMBOLS_ZIP): PRIVATE_MAPPING_PACKAGING_DIR := $(call intermediates-dir-for,PACKAGING,elf_symbol_mapping)
6485$(SYMBOLS_ZIP): $(SOONG_ZIP) $(SYMBOLS_MAP)
6486	@echo "Package symbols: $@"
6487	$(hide) rm -rf $@ $(PRIVATE_LIST_FILE)
6488	$(hide) mkdir -p $(TARGET_OUT_UNSTRIPPED) $(dir $(PRIVATE_LIST_FILE)) $(PRIVATE_MAPPING_PACKAGING_DIR)
6489	# Find all of the files in the symbols directory and zip them into the symbols zip.
6490	$(hide) find -L $(TARGET_OUT_UNSTRIPPED) -type f | sort >$(PRIVATE_LIST_FILE)
6491	$(hide) $(SOONG_ZIP) --ignore_missing_files -d -o $@ -C $(OUT_DIR)/.. -l $(PRIVATE_LIST_FILE)
6492	# Find all of the files in the symbols mapping directory and merge them into the symbols mapping textproto.
6493	$(hide) find -L $(PRIVATE_MAPPING_PACKAGING_DIR) -type f | sort >$(PRIVATE_LIST_FILE)
6494	$(hide) $(SYMBOLS_MAP) -merge $(SYMBOLS_MAPPING) -ignore_missing_files @$(PRIVATE_LIST_FILE)
6495$(SYMBOLS_ZIP): .KATI_IMPLICIT_OUTPUTS := $(SYMBOLS_MAPPING)
6496
6497$(call declare-1p-container,$(SYMBOLS_ZIP),)
6498ifeq (,$(TARGET_BUILD_UNBUNDLED))
6499$(call declare-container-license-deps,$(SYMBOLS_ZIP),$(INTERNAL_ALLIMAGES_FILES) $(updater_dep),$(PRODUCT_OUT)/:/)
6500endif
6501
6502# -----------------------------------------------------------------
6503# A zip of the coverage directory.
6504#
6505name := gcov-report-files-all
6506ifeq ($(TARGET_BUILD_TYPE),debug)
6507name := $(name)_debug
6508endif
6509COVERAGE_ZIP := $(PRODUCT_OUT)/$(name).zip
6510ifeq (,$(TARGET_BUILD_UNBUNDLED))
6511$(COVERAGE_ZIP): $(INTERNAL_ALLIMAGES_FILES)
6512endif
6513$(COVERAGE_ZIP): PRIVATE_LIST_FILE := $(call intermediates-dir-for,PACKAGING,coverage)/filelist
6514$(COVERAGE_ZIP): $(SOONG_ZIP)
6515	@echo "Package coverage: $@"
6516	$(hide) rm -rf $@ $(PRIVATE_LIST_FILE)
6517	$(hide) mkdir -p $(dir $@) $(TARGET_OUT_COVERAGE) $(dir $(PRIVATE_LIST_FILE))
6518	$(hide) find $(TARGET_OUT_COVERAGE) | sort >$(PRIVATE_LIST_FILE)
6519	$(hide) $(SOONG_ZIP) -d -o $@ -C $(TARGET_OUT_COVERAGE) -l $(PRIVATE_LIST_FILE)
6520
6521$(call declare-1p-container,$(COVERAGE_ZIP),)
6522ifeq (,$(TARGET_BUILD_UNBUNDLED))
6523$(call declare-container-license-deps,$(COVERAGE_ZIP),$(INTERNAL_ALLIMAGE_FILES),$(PRODUCT_OUT)/:/)
6524endif
6525
6526SYSTEM_NOTICE_DEPS += $(COVERAGE_ZIP)
6527
6528#------------------------------------------------------------------
6529# Export the LLVM profile data tool and dependencies for Clang coverage processing
6530#
6531ifeq (true,$(CLANG_COVERAGE))
6532  LLVM_PROFDATA := $(LLVM_PREBUILTS_BASE)/linux-x86/$(LLVM_PREBUILTS_VERSION)/bin/llvm-profdata
6533  LLVM_COV := $(LLVM_PREBUILTS_BASE)/linux-x86/$(LLVM_PREBUILTS_VERSION)/bin/llvm-cov
6534  LIBCXX := $(LLVM_PREBUILTS_BASE)/linux-x86/$(LLVM_PREBUILTS_VERSION)/lib/x86_64-unknown-linux-gnu/libc++.so.1
6535  # Use llvm-profdata.zip for backwards compatibility with tradefed code.
6536  LLVM_COVERAGE_TOOLS_ZIP := $(PRODUCT_OUT)/llvm-profdata.zip
6537
6538  $(LLVM_COVERAGE_TOOLS_ZIP): $(SOONG_ZIP)
6539	$(hide) $(SOONG_ZIP) -d -o $@ -C $(LLVM_PREBUILTS_BASE)/linux-x86/$(LLVM_PREBUILTS_VERSION) -f $(LLVM_PROFDATA) -f $(LIBCXX) -f $(LLVM_COV)
6540
6541  $(call dist-for-goals,droidcore-unbundled apps_only,$(LLVM_COVERAGE_TOOLS_ZIP))
6542endif
6543
6544# -----------------------------------------------------------------
6545# A zip of the Android Apps. Not keeping full path so that we don't
6546# include product names when distributing
6547#
6548name := $(TARGET_PRODUCT)
6549ifeq ($(TARGET_BUILD_TYPE),debug)
6550  name := $(name)_debug
6551endif
6552name := $(name)-apps-$(FILE_NAME_TAG)
6553
6554APPS_ZIP := $(PRODUCT_OUT)/$(name).zip
6555$(APPS_ZIP): $(FULL_SYSTEMIMAGE_DEPS)
6556	@echo "Package apps: $@"
6557	$(hide) rm -rf $@
6558	$(hide) mkdir -p $(dir $@)
6559	$(hide) apps_to_zip=`find $(TARGET_OUT_APPS) $(TARGET_OUT_APPS_PRIVILEGED) -mindepth 2 -maxdepth 3 -name "*.apk"`; \
6560	if [ -z "$$apps_to_zip" ]; then \
6561	    echo "No apps to zip up. Generating empty apps archive." ; \
6562	    a=$$(mktemp /tmp/XXXXXXX) && touch $$a && zip $@ $$a && zip -d $@ $$a; \
6563	else \
6564	    zip -qjX $@ $$apps_to_zip; \
6565	fi
6566
6567ifeq (true,$(EMMA_INSTRUMENT))
6568#------------------------------------------------------------------
6569# An archive of classes for use in generating code-coverage reports
6570# These are the uninstrumented versions of any classes that were
6571# to be instrumented.
6572# Any dependencies are set up later in build/make/core/main.mk.
6573
6574JACOCO_REPORT_CLASSES_ALL := $(PRODUCT_OUT)/jacoco-report-classes-all.jar
6575$(JACOCO_REPORT_CLASSES_ALL): PRIVATE_TARGET_JACOCO_DIR := $(call intermediates-dir-for,PACKAGING,jacoco)
6576$(JACOCO_REPORT_CLASSES_ALL): PRIVATE_HOST_JACOCO_DIR := $(call intermediates-dir-for,PACKAGING,jacoco,HOST)
6577$(JACOCO_REPORT_CLASSES_ALL): PRIVATE_TARGET_PROGUARD_USAGE_DIR := $(call intermediates-dir-for,PACKAGING,proguard_usage)
6578$(JACOCO_REPORT_CLASSES_ALL): PRIVATE_HOST_PROGUARD_USAGE_DIR := $(call intermediates-dir-for,PACKAGING,proguard_usage,HOST)
6579$(JACOCO_REPORT_CLASSES_ALL) :
6580	@echo "Collecting uninstrumented classes"
6581	mkdir -p $(PRIVATE_TARGET_JACOCO_DIR) $(PRIVATE_HOST_JACOCO_DIR) $(PRIVATE_TARGET_PROGUARD_USAGE_DIR) $(PRIVATE_HOST_PROGUARD_USAGE_DIR)
6582	$(SOONG_ZIP) -o $@ -L 0 \
6583	  -C $(PRIVATE_TARGET_JACOCO_DIR) -P out/target/common/obj -D $(PRIVATE_TARGET_JACOCO_DIR) \
6584	  -C $(PRIVATE_HOST_JACOCO_DIR) -P out/target/common/obj -D $(PRIVATE_HOST_JACOCO_DIR) \
6585	  -C $(PRIVATE_TARGET_PROGUARD_USAGE_DIR) -P out/target/common/obj -D $(PRIVATE_TARGET_PROGUARD_USAGE_DIR) \
6586	  -C $(PRIVATE_HOST_PROGUARD_USAGE_DIR) -P out/target/common/obj -D $(PRIVATE_HOST_PROGUARD_USAGE_DIR)
6587
6588ifeq (,$(TARGET_BUILD_UNBUNDLED))
6589  $(JACOCO_REPORT_CLASSES_ALL): $(INTERNAL_ALLIMAGES_FILES)
6590endif
6591
6592# This is not ideal, but it is difficult to correctly figure out the actual jacoco report
6593# jars we need to add here as dependencies, so we add the device-tests as a dependency when
6594# the env variable is set and this should guarantee thaat all the jacoco report jars are ready
6595# when we package the final report jar here.
6596ifeq ($(JACOCO_PACKAGING_INCLUDE_DEVICE_TESTS),true)
6597  $(JACOCO_REPORT_CLASSES_ALL): $(COMPATIBILITY.device-tests.FILES)
6598endif
6599endif # EMMA_INSTRUMENT=true
6600
6601
6602#------------------------------------------------------------------
6603# A zip of Proguard obfuscation dictionary files.
6604# Also produces a textproto containing mappings from the hashes of the
6605# dictionary contents (which are also stored in the dex files on the
6606# devices) to the filename of the proguard dictionary, which will allow
6607# finding the appropriate dictionary to deobfuscate a stack trace frame.
6608#
6609
6610# The path to the zip file containing proguard dictionaries.
6611PROGUARD_DICT_ZIP := $(PRODUCT_OUT)/$(TARGET_PRODUCT)-proguard-dict-$(FILE_NAME_TAG).zip
6612# The path to the zip file containing mappings from dictionary hashes to filenames.
6613PROGUARD_DICT_MAPPING := $(PRODUCT_OUT)/$(TARGET_PRODUCT)-proguard-dict-mapping-$(FILE_NAME_TAG).textproto
6614.KATI_READONLY := PROGUARD_DICT_ZIP PROGUARD_DICT_MAPPING
6615# For apps_only build we'll establish the dependency later in build/make/core/main.mk.
6616ifeq (,$(TARGET_BUILD_UNBUNDLED))
6617$(PROGUARD_DICT_ZIP): $(INTERNAL_ALLIMAGES_FILES) $(updater_dep)
6618endif
6619$(PROGUARD_DICT_ZIP): PRIVATE_PACKAGING_DIR := $(call intermediates-dir-for,PACKAGING,proguard_dictionary)
6620$(PROGUARD_DICT_ZIP): PRIVATE_MAPPING_PACKAGING_DIR := $(call intermediates-dir-for,PACKAGING,proguard_dictionary_mapping)
6621$(PROGUARD_DICT_ZIP): PRIVATE_LIST_FILE := $(call intermediates-dir-for,PACKAGING,proguard_dictionary_filelist)/filelist
6622$(PROGUARD_DICT_ZIP): $(SOONG_ZIP) $(SYMBOLS_MAP)
6623	@echo "Packaging Proguard obfuscation dictionary files."
6624	rm -rf $@ $(PRIVATE_LIST_FILE)
6625	mkdir -p $(PRIVATE_PACKAGING_DIR) $(PRIVATE_MAPPING_PACKAGING_DIR) $(dir $(PRIVATE_LIST_FILE))
6626	# Zip all of the files in the proguard dictionary directory.
6627	$(SOONG_ZIP) --ignore_missing_files -d -o $@ -C $(PRIVATE_PACKAGING_DIR) -D $(PRIVATE_PACKAGING_DIR)
6628	# Find all of the files in the proguard dictionary mapping directory and merge them into the mapping textproto.
6629	# Strip the PRIVATE_PACKAGING_DIR off the filenames to match soong_zip's -C argument.
6630	$(hide) find -L $(PRIVATE_MAPPING_PACKAGING_DIR) -type f | sort >$(PRIVATE_LIST_FILE)
6631	$(SYMBOLS_MAP) -merge $(PROGUARD_DICT_MAPPING) -strip_prefix $(PRIVATE_PACKAGING_DIR)/ -ignore_missing_files @$(PRIVATE_LIST_FILE)
6632$(PROGUARD_DICT_ZIP): .KATI_IMPLICIT_OUTPUTS := $(PROGUARD_DICT_MAPPING)
6633
6634$(call declare-1p-container,$(PROGUARD_DICT_ZIP),)
6635ifeq (,$(TARGET_BUILD_UNBUNDLED))
6636$(call declare-container-license-deps,$(PROGUARD_DICT_ZIP),$(INTERNAL_ALLIMAGES_FILES) $(updater_dep),$(PRODUCT_OUT)/:/)
6637endif
6638
6639#------------------------------------------------------------------
6640# A zip of Proguard usage files.
6641#
6642PROGUARD_USAGE_ZIP := $(PRODUCT_OUT)/$(TARGET_PRODUCT)-proguard-usage-$(FILE_NAME_TAG).zip
6643# For apps_only build we'll establish the dependency later in build/make/core/main.mk.
6644ifeq (,$(TARGET_BUILD_UNBUNDLED))
6645$(PROGUARD_USAGE_ZIP): \
6646    $(INSTALLED_SYSTEMIMAGE_TARGET) \
6647    $(INSTALLED_RAMDISK_TARGET) \
6648    $(INSTALLED_BOOTIMAGE_TARGET) \
6649    $(INSTALLED_INIT_BOOT_IMAGE_TARGET) \
6650    $(INSTALLED_USERDATAIMAGE_TARGET) \
6651    $(INSTALLED_VENDORIMAGE_TARGET) \
6652    $(INSTALLED_PRODUCTIMAGE_TARGET) \
6653    $(INSTALLED_SYSTEM_EXTIMAGE_TARGET) \
6654    $(INSTALLED_ODMIMAGE_TARGET) \
6655    $(INSTALLED_VENDOR_DLKMIMAGE_TARGET) \
6656    $(INSTALLED_ODM_DLKMIMAGE_TARGET) \
6657    $(INSTALLED_SYSTEM_DLKMIMAGE_TARGET) \
6658    $(updater_dep)
6659endif
6660$(PROGUARD_USAGE_ZIP): PRIVATE_LIST_FILE := $(call intermediates-dir-for,PACKAGING,proguard_usage.zip)/filelist
6661$(PROGUARD_USAGE_ZIP): PRIVATE_PACKAGING_DIR := $(call intermediates-dir-for,PACKAGING,proguard_usage)
6662$(PROGUARD_USAGE_ZIP): $(MERGE_ZIPS)
6663	@echo "Packaging Proguard usage files."
6664	mkdir -p $(dir $@) $(PRIVATE_PACKAGING_DIR) $(dir $(PRIVATE_LIST_FILE))
6665	find $(PRIVATE_PACKAGING_DIR) -name proguard_usage.zip > $(PRIVATE_LIST_FILE)
6666	$(MERGE_ZIPS) $@ @$(PRIVATE_LIST_FILE)
6667
6668$(call declare-1p-container,$(PROGUARD_USAGE_ZIP),)
6669ifeq (,$(TARGET_BUILD_UNBUNDLED))
6670$(call declare-container-license-deps,$(PROGUARD_USAGE_ZIP),$(INSTALLED_SYSTEMIMAGE_TARGET) \
6671    $(INSTALLED_RAMDISK_TARGET) \
6672    $(INSTALLED_BOOTIMAGE_TARGET) \
6673    $(INSTALLED_INIT_BOOT_IMAGE_TARGET) \
6674    $(INSTALLED_USERDATAIMAGE_TARGET) \
6675    $(INSTALLED_VENDORIMAGE_TARGET) \
6676    $(INSTALLED_PRODUCTIMAGE_TARGET) \
6677    $(INSTALLED_SYSTEM_EXTIMAGE_TARGET) \
6678    $(INSTALLED_ODMIMAGE_TARGET) \
6679    $(INSTALLED_VENDOR_DLKMIMAGE_TARGET) \
6680    $(INSTALLED_ODM_DLKMIMAGE_TARGET) \
6681    $(INSTALLED_SYSTEM_DLKMIMAGE_TARGET) \
6682    $(updater_dep),$(PROGUARD_USAGE_ZIP):/)
6683endif
6684
6685ifeq (true,$(PRODUCT_USE_DYNAMIC_PARTITIONS))
6686
6687# Dump variables used by build_super_image.py (for building super.img and super_empty.img).
6688# $(1): output file
6689define dump-super-image-info
6690  $(call dump-dynamic-partitions-info,$(1))
6691  $(if $(filter true,$(AB_OTA_UPDATER)), \
6692    echo "ab_update=true" >> $(1))
6693endef
6694
6695endif # PRODUCT_USE_DYNAMIC_PARTITIONS
6696
6697# -----------------------------------------------------------------
6698# super partition image (dist)
6699
6700ifeq (true,$(PRODUCT_BUILD_SUPER_PARTITION))
6701
6702# BOARD_SUPER_PARTITION_SIZE must be defined to build super image.
6703ifneq ($(BOARD_SUPER_PARTITION_SIZE),)
6704
6705ifneq (true,$(PRODUCT_RETROFIT_DYNAMIC_PARTITIONS))
6706
6707# For real devices and for dist builds, build super image from target files to an intermediate directory.
6708INTERNAL_SUPERIMAGE_DIST_TARGET := $(call intermediates-dir-for,PACKAGING,super.img)/super.img
6709$(INTERNAL_SUPERIMAGE_DIST_TARGET): extracted_input_target_files := $(patsubst %.zip,%,$(BUILT_TARGET_FILES_PACKAGE))
6710$(INTERNAL_SUPERIMAGE_DIST_TARGET): $(LPMAKE) $(BUILT_TARGET_FILES_PACKAGE) $(BUILD_SUPER_IMAGE)
6711	$(call pretty,"Target super fs image from target files: $@")
6712	PATH=$(dir $(LPMAKE)):$$PATH \
6713	    $(BUILD_SUPER_IMAGE) -v $(extracted_input_target_files) $@
6714
6715# Skip packing it in dist package because it is in update package.
6716ifneq (true,$(BOARD_SUPER_IMAGE_IN_UPDATE_PACKAGE))
6717$(call dist-for-goals,dist_files,$(INTERNAL_SUPERIMAGE_DIST_TARGET))
6718endif
6719
6720.PHONY: superimage_dist
6721superimage_dist: $(INTERNAL_SUPERIMAGE_DIST_TARGET)
6722
6723endif # PRODUCT_RETROFIT_DYNAMIC_PARTITIONS != "true"
6724endif # BOARD_SUPER_PARTITION_SIZE != ""
6725endif # PRODUCT_BUILD_SUPER_PARTITION == "true"
6726
6727# -----------------------------------------------------------------
6728# super partition image for development
6729
6730ifeq (true,$(PRODUCT_BUILD_SUPER_PARTITION))
6731ifneq ($(BOARD_SUPER_PARTITION_SIZE),)
6732ifneq (true,$(PRODUCT_RETROFIT_DYNAMIC_PARTITIONS))
6733
6734# Build super.img by using $(INSTALLED_*IMAGE_TARGET) to $(1)
6735# $(1): built image path
6736# $(2): misc_info.txt path; its contents should match expectation of build_super_image.py
6737define build-superimage-target
6738  mkdir -p $(dir $(2))
6739  rm -rf $(2)
6740  $(call dump-super-image-info,$(2))
6741  $(foreach p,$(BOARD_SUPER_PARTITION_PARTITION_LIST), \
6742    echo "$(p)_image=$(INSTALLED_$(call to-upper,$(p))IMAGE_TARGET)" >> $(2);)
6743  $(if $(BUILDING_SYSTEM_OTHER_IMAGE), $(if $(filter system,$(BOARD_SUPER_PARTITION_PARTITION_LIST)), \
6744    echo "system_other_image=$(INSTALLED_SYSTEMOTHERIMAGE_TARGET)" >> $(2);))
6745  mkdir -p $(dir $(1))
6746  PATH=$(dir $(LPMAKE)):$$PATH \
6747    $(BUILD_SUPER_IMAGE) -v $(2) $(1)
6748endef
6749
6750INSTALLED_SUPERIMAGE_TARGET := $(PRODUCT_OUT)/super.img
6751INSTALLED_SUPERIMAGE_DEPENDENCIES := $(LPMAKE) $(BUILD_SUPER_IMAGE) \
6752    $(foreach p, $(BOARD_SUPER_PARTITION_PARTITION_LIST), $(INSTALLED_$(call to-upper,$(p))IMAGE_TARGET))
6753
6754ifdef BUILDING_SYSTEM_OTHER_IMAGE
6755ifneq ($(filter system,$(BOARD_SUPER_PARTITION_PARTITION_LIST)),)
6756INSTALLED_SUPERIMAGE_DEPENDENCIES += $(INSTALLED_SYSTEMOTHERIMAGE_TARGET)
6757endif
6758endif
6759
6760$(INSTALLED_SUPERIMAGE_TARGET): $(INSTALLED_SUPERIMAGE_DEPENDENCIES)
6761	$(call pretty,"Target super fs image for debug: $@")
6762	$(call build-superimage-target,$(INSTALLED_SUPERIMAGE_TARGET),\
6763          $(call intermediates-dir-for,PACKAGING,superimage_debug)/misc_info.txt)
6764
6765# For devices that uses super image directly, the superimage target points to the file in $(PRODUCT_OUT).
6766.PHONY: superimage
6767superimage: $(INSTALLED_SUPERIMAGE_TARGET)
6768
6769# If BOARD_BUILD_SUPER_IMAGE_BY_DEFAULT is set, super.img is built from images in the
6770# $(PRODUCT_OUT) directory, and is built to $(PRODUCT_OUT)/super.img. Also, it will
6771# be built for non-dist builds. This is useful for devices that uses super.img directly, e.g.
6772# virtual devices.
6773ifeq (true,$(BOARD_BUILD_SUPER_IMAGE_BY_DEFAULT))
6774droidcore-unbundled: $(INSTALLED_SUPERIMAGE_TARGET)
6775
6776$(call dist-for-goals,dist_files,$(INSTALLED_MISC_INFO_TARGET):super_misc_info.txt)
6777endif # BOARD_BUILD_SUPER_IMAGE_BY_DEFAULT
6778
6779# Build $(PRODUCT_OUT)/super.img without dependencies.
6780.PHONY: superimage-nodeps supernod
6781superimage-nodeps supernod: intermediates :=
6782superimage-nodeps supernod: | $(INSTALLED_SUPERIMAGE_DEPENDENCIES)
6783	$(call pretty,"make $(INSTALLED_SUPERIMAGE_TARGET): ignoring dependencies")
6784	$(call build-superimage-target,$(INSTALLED_SUPERIMAGE_TARGET),\
6785	  $(call intermediates-dir-for,PACKAGING,superimage-nodeps)/misc_info.txt)
6786
6787endif # PRODUCT_RETROFIT_DYNAMIC_PARTITIONS != "true"
6788endif # BOARD_SUPER_PARTITION_SIZE != ""
6789endif # PRODUCT_BUILD_SUPER_PARTITION == "true"
6790
6791# -----------------------------------------------------------------
6792# super empty image
6793ifdef BUILDING_SUPER_EMPTY_IMAGE
6794
6795INSTALLED_SUPERIMAGE_EMPTY_TARGET := $(PRODUCT_OUT)/super_empty.img
6796$(INSTALLED_SUPERIMAGE_EMPTY_TARGET): intermediates := $(call intermediates-dir-for,PACKAGING,super_empty)
6797$(INSTALLED_SUPERIMAGE_EMPTY_TARGET): $(LPMAKE) $(BUILD_SUPER_IMAGE)
6798	$(call pretty,"Target empty super fs image: $@")
6799	mkdir -p $(intermediates)
6800	rm -rf $(intermediates)/misc_info.txt
6801	$(call dump-super-image-info,$(intermediates)/misc_info.txt)
6802	PATH=$(dir $(LPMAKE)):$$PATH \
6803	    $(BUILD_SUPER_IMAGE) -v $(intermediates)/misc_info.txt $@
6804
6805$(call dist-for-goals,dist_files,$(INSTALLED_SUPERIMAGE_EMPTY_TARGET))
6806
6807$(call declare-0p-target,$(INSTALLED_SUPERIMAGE_EMPTY_TARGET))
6808
6809endif # BUILDING_SUPER_EMPTY_IMAGE
6810
6811
6812# -----------------------------------------------------------------
6813# The update package
6814
6815name := $(TARGET_PRODUCT)
6816ifeq ($(TARGET_BUILD_TYPE),debug)
6817  name := $(name)_debug
6818endif
6819name := $(name)-img-$(FILE_NAME_TAG)
6820
6821INTERNAL_UPDATE_PACKAGE_TARGET := $(PRODUCT_OUT)/$(name).zip
6822
6823$(INTERNAL_UPDATE_PACKAGE_TARGET): $(BUILT_TARGET_FILES_PACKAGE) $(IMG_FROM_TARGET_FILES)
6824	$(call pretty,"Package: $@")
6825	PATH=$(INTERNAL_USERIMAGES_BINARY_PATHS):$(dir $(ZIP2ZIP)):$$PATH \
6826	    $(IMG_FROM_TARGET_FILES) \
6827	        --additional IMAGES/VerifiedBootParams.textproto:VerifiedBootParams.textproto \
6828	        $(BUILT_TARGET_FILES_PACKAGE) $@
6829
6830$(call declare-1p-container,$(INTERNAL_UPDATE_PACKAGE_TARGET),)
6831$(call declare-container-license-deps,$(INTERNAL_UPDATE_PACKAGE_TARGET),$(BUILT_TARGET_FILES_PACKAGE) $(IMG_FROM_TARGET_FILES),$(PRODUCT_OUT)/:/)
6832
6833.PHONY: updatepackage
6834updatepackage: $(INTERNAL_UPDATE_PACKAGE_TARGET)
6835$(call dist-for-goals,updatepackage,$(INTERNAL_UPDATE_PACKAGE_TARGET))
6836
6837
6838# -----------------------------------------------------------------
6839# dalvik something
6840.PHONY: dalvikfiles
6841dalvikfiles: $(INTERNAL_DALVIK_MODULES)
6842
6843ifeq ($(BUILD_QEMU_IMAGES),true)
6844MK_QEMU_IMAGE_SH := device/generic/goldfish/tools/mk_qemu_image.sh
6845MK_COMBINE_QEMU_IMAGE := $(HOST_OUT_EXECUTABLES)/mk_combined_img
6846SGDISK_HOST := $(HOST_OUT_EXECUTABLES)/sgdisk
6847
6848ifdef INSTALLED_SYSTEMIMAGE_TARGET
6849INSTALLED_QEMU_SYSTEMIMAGE := $(PRODUCT_OUT)/system-qemu.img
6850INSTALLED_SYSTEM_QEMU_CONFIG := $(PRODUCT_OUT)/system-qemu-config.txt
6851$(INSTALLED_SYSTEM_QEMU_CONFIG): $(INSTALLED_SUPERIMAGE_TARGET) $(INSTALLED_VBMETAIMAGE_TARGET)
6852	@echo "$(PRODUCT_OUT)/vbmeta.img vbmeta 1" > $@
6853	@echo "$(INSTALLED_SUPERIMAGE_TARGET) super 2" >> $@
6854$(INSTALLED_QEMU_SYSTEMIMAGE): $(INSTALLED_VBMETAIMAGE_TARGET) $(MK_COMBINE_QEMU_IMAGE) $(SGDISK_HOST) $(SIMG2IMG) \
6855    $(INSTALLED_SUPERIMAGE_TARGET) $(INSTALLED_SYSTEM_QEMU_CONFIG)
6856	@echo Create system-qemu.img now
6857	(export SGDISK=$(SGDISK_HOST) SIMG2IMG=$(SIMG2IMG); \
6858     $(MK_COMBINE_QEMU_IMAGE) -i $(INSTALLED_SYSTEM_QEMU_CONFIG) -o $@)
6859
6860systemimage: $(INSTALLED_QEMU_SYSTEMIMAGE)
6861droidcore-unbundled: $(INSTALLED_QEMU_SYSTEMIMAGE)
6862endif
6863ifdef INSTALLED_VENDORIMAGE_TARGET
6864INSTALLED_QEMU_VENDORIMAGE := $(PRODUCT_OUT)/vendor-qemu.img
6865$(INSTALLED_QEMU_VENDORIMAGE): $(INSTALLED_VENDORIMAGE_TARGET) $(MK_QEMU_IMAGE_SH) $(SGDISK_HOST) $(SIMG2IMG)
6866	@echo Create vendor-qemu.img
6867	(export SGDISK=$(SGDISK_HOST) SIMG2IMG=$(SIMG2IMG); $(MK_QEMU_IMAGE_SH) $(INSTALLED_VENDORIMAGE_TARGET))
6868
6869vendorimage: $(INSTALLED_QEMU_VENDORIMAGE)
6870droidcore-unbundled: $(INSTALLED_QEMU_VENDORIMAGE)
6871endif
6872
6873ifdef INSTALLED_RAMDISK_TARGET
6874ifdef INSTALLED_VENDOR_BOOTIMAGE_TARGET
6875ifdef INTERNAL_VENDOR_RAMDISK_TARGET
6876INSTALLED_QEMU_RAMDISKIMAGE := $(PRODUCT_OUT)/ramdisk-qemu.img
6877$(INSTALLED_QEMU_RAMDISKIMAGE): $(INTERNAL_VENDOR_RAMDISK_TARGET) $(INSTALLED_RAMDISK_TARGET)
6878	@echo Create ramdisk-qemu.img
6879	(cat $(INSTALLED_RAMDISK_TARGET) $(INTERNAL_VENDOR_RAMDISK_TARGET) > $(INSTALLED_QEMU_RAMDISKIMAGE))
6880
6881droidcore-unbundled: $(INSTALLED_QEMU_RAMDISKIMAGE)
6882endif
6883endif
6884endif
6885
6886ifdef INSTALLED_PRODUCTIMAGE_TARGET
6887INSTALLED_QEMU_PRODUCTIMAGE := $(PRODUCT_OUT)/product-qemu.img
6888$(INSTALLED_QEMU_PRODUCTIMAGE): $(INSTALLED_PRODUCTIMAGE_TARGET) $(MK_QEMU_IMAGE_SH) $(SGDISK_HOST) $(SIMG2IMG)
6889	@echo Create product-qemu.img
6890	(export SGDISK=$(SGDISK_HOST) SIMG2IMG=$(SIMG2IMG); $(MK_QEMU_IMAGE_SH) $(INSTALLED_PRODUCTIMAGE_TARGET))
6891
6892productimage: $(INSTALLED_QEMU_PRODUCTIMAGE)
6893droidcore-unbundled: $(INSTALLED_QEMU_PRODUCTIMAGE)
6894endif
6895ifdef INSTALLED_SYSTEM_EXTIMAGE_TARGET
6896INSTALLED_QEMU_SYSTEM_EXTIMAGE := $(PRODUCT_OUT)/system_ext-qemu.img
6897$(INSTALLED_QEMU_SYSTEM_EXTIMAGE): $(INSTALLED_SYSTEM_EXTIMAGE_TARGET) $(MK_QEMU_IMAGE_SH) $(SGDISK_HOST) $(SIMG2IMG)
6898	@echo Create system_ext-qemu.img
6899	(export SGDISK=$(SGDISK_HOST) SIMG2IMG=$(SIMG2IMG); $(MK_QEMU_IMAGE_SH) $(INSTALLED_SYSTEM_EXTIMAGE_TARGET))
6900
6901systemextimage: $(INSTALLED_QEMU_SYSTEM_EXTIMAGE)
6902droidcore-unbundled: $(INSTALLED_QEMU_SYSTEM_EXTIMAGE)
6903endif
6904ifdef INSTALLED_ODMIMAGE_TARGET
6905INSTALLED_QEMU_ODMIMAGE := $(PRODUCT_OUT)/odm-qemu.img
6906$(INSTALLED_QEMU_ODMIMAGE): $(INSTALLED_ODMIMAGE_TARGET) $(MK_QEMU_IMAGE_SH) $(SGDISK_HOST)
6907	@echo Create odm-qemu.img
6908	(export SGDISK=$(SGDISK_HOST); $(MK_QEMU_IMAGE_SH) $(INSTALLED_ODMIMAGE_TARGET))
6909
6910odmimage: $(INSTALLED_QEMU_ODMIMAGE)
6911droidcore-unbundled: $(INSTALLED_QEMU_ODMIMAGE)
6912endif
6913
6914ifdef INSTALLED_VENDOR_DLKMIMAGE_TARGET
6915INSTALLED_QEMU_VENDOR_DLKMIMAGE := $(PRODUCT_OUT)/vendor_dlkm-qemu.img
6916$(INSTALLED_QEMU_VENDOR_DLKMIMAGE): $(INSTALLED_VENDOR_DLKMIMAGE_TARGET) $(MK_QEMU_IMAGE_SH) $(SGDISK_HOST)
6917	@echo Create vendor_dlkm-qemu.img
6918	(export SGDISK=$(SGDISK_HOST); $(MK_QEMU_IMAGE_SH) $(INSTALLED_VENDOR_DLKMIMAGE_TARGET))
6919
6920vendor_dlkmimage: $(INSTALLED_QEMU_VENDOR_DLKMIMAGE)
6921droidcore-unbundled: $(INSTALLED_QEMU_VENDOR_DLKMIMAGE)
6922endif
6923
6924ifdef INSTALLED_ODM_DLKMIMAGE_TARGET
6925INSTALLED_QEMU_ODM_DLKMIMAGE := $(PRODUCT_OUT)/odm_dlkm-qemu.img
6926$(INSTALLED_QEMU_ODM_DLKMIMAGE): $(INSTALLED_ODM_DLKMIMAGE_TARGET) $(MK_QEMU_IMAGE_SH) $(SGDISK_HOST)
6927	@echo Create odm_dlkm-qemu.img
6928	(export SGDISK=$(SGDISK_HOST); $(MK_QEMU_IMAGE_SH) $(INSTALLED_ODM_DLKMIMAGE_TARGET))
6929
6930odm_dlkmimage: $(INSTALLED_QEMU_ODM_DLKMIMAGE)
6931droidcore-unbundled: $(INSTALLED_QEMU_ODM_DLKMIMAGE)
6932endif
6933
6934ifdef INSTALLED_SYSTEM_DLKMIMAGE_TARGET
6935INSTALLED_QEMU_SYSTEM_DLKMIMAGE := $(PRODUCT_OUT)/system_dlkm-qemu.img
6936$(INSTALLED_QEMU_SYSTEM_DLKMIMAGE): $(INSTALLED_SYSTEM_DLKMIMAGE_TARGET) $(MK_QEMU_IMAGE_SH) $(SGDISK_HOST)
6937	@echo Create system_dlkm-qemu.img
6938	(export SGDISK=$(SGDISK_HOST); $(MK_QEMU_IMAGE_SH) $(INSTALLED_SYSTEM_DLKMIMAGE_TARGET))
6939
6940system_dlkmimage: $(INSTALLED_QEMU_SYSTEM_DLKMIMAGE)
6941droidcore-unbundled: $(INSTALLED_QEMU_SYSTEM_DLKMIMAGE)
6942endif
6943
6944QEMU_VERIFIED_BOOT_PARAMS := $(PRODUCT_OUT)/VerifiedBootParams.textproto
6945$(QEMU_VERIFIED_BOOT_PARAMS): $(INSTALLED_VBMETAIMAGE_TARGET) $(INSTALLED_SYSTEMIMAGE_TARGET) \
6946    $(MK_VBMETA_BOOT_KERNEL_CMDLINE_SH) $(AVBTOOL)
6947	@echo Creating $@
6948	(export AVBTOOL=$(AVBTOOL); $(MK_VBMETA_BOOT_KERNEL_CMDLINE_SH) $(INSTALLED_VBMETAIMAGE_TARGET) \
6949    $(INSTALLED_SYSTEMIMAGE_TARGET) $(QEMU_VERIFIED_BOOT_PARAMS))
6950
6951systemimage: $(QEMU_VERIFIED_BOOT_PARAMS)
6952droidcore-unbundled: $(QEMU_VERIFIED_BOOT_PARAMS)
6953
6954endif
6955# -----------------------------------------------------------------
6956# The emulator package
6957ifeq ($(BUILD_EMULATOR),true)
6958INTERNAL_EMULATOR_PACKAGE_FILES += \
6959        $(HOST_OUT_EXECUTABLES)/emulator$(HOST_EXECUTABLE_SUFFIX) \
6960        $(INSTALLED_RAMDISK_TARGET) \
6961        $(INSTALLED_SYSTEMIMAGE_TARGET) \
6962        $(INSTALLED_USERDATAIMAGE_TARGET)
6963
6964name := $(TARGET_PRODUCT)-emulator-$(FILE_NAME_TAG)
6965
6966INTERNAL_EMULATOR_PACKAGE_TARGET := $(PRODUCT_OUT)/$(name).zip
6967
6968$(INTERNAL_EMULATOR_PACKAGE_TARGET): $(INTERNAL_EMULATOR_PACKAGE_FILES)
6969	@echo "Package: $@"
6970	$(hide) zip -qjX $@ $(INTERNAL_EMULATOR_PACKAGE_FILES)
6971
6972endif
6973
6974
6975# -----------------------------------------------------------------
6976# The SDK
6977
6978ifneq ($(filter sdk,$(MAKECMDGOALS)),)
6979
6980# The SDK includes host-specific components, so it belongs under HOST_OUT.
6981sdk_dir := $(HOST_OUT)/sdk/$(TARGET_PRODUCT)
6982
6983# Build a name that looks like:
6984#
6985#     linux-x86   --> android-sdk_12345_linux-x86
6986#     darwin-x86  --> android-sdk_12345_mac-x86
6987#     windows-x86 --> android-sdk_12345_windows
6988#
6989ifneq ($(HOST_OS),linux)
6990  $(error Building the monolithic SDK is only supported on Linux)
6991endif
6992sdk_name := android-sdk_$(FILE_NAME_TAG)
6993INTERNAL_SDK_HOST_OS_NAME := linux-$(SDK_HOST_ARCH)
6994sdk_name := $(sdk_name)_$(INTERNAL_SDK_HOST_OS_NAME)
6995
6996sdk_dep_file := $(sdk_dir)/sdk_deps.mk
6997
6998ATREE_FILES :=
6999-include $(sdk_dep_file)
7000
7001# if we don't have a real list, then use "everything"
7002ifeq ($(strip $(ATREE_FILES)),)
7003ATREE_FILES := \
7004	$(ALL_DOCS) \
7005	$(ALL_SDK_FILES)
7006endif
7007
7008atree_dir := development/build
7009
7010
7011sdk_atree_files := $(atree_dir)/sdk.exclude.atree
7012
7013# development/build/sdk-android-<abi>.atree is used to differentiate
7014# between architecture models (e.g. ARMv5TE versus ARMv7) when copying
7015# files like the kernel image. We use TARGET_CPU_ABI because we don't
7016# have a better way to distinguish between CPU models.
7017ifneq (,$(strip $(wildcard $(atree_dir)/sdk-android-$(TARGET_CPU_ABI).atree)))
7018  sdk_atree_files += $(atree_dir)/sdk-android-$(TARGET_CPU_ABI).atree
7019endif
7020
7021ifneq ($(PRODUCT_SDK_ATREE_FILES),)
7022sdk_atree_files += $(PRODUCT_SDK_ATREE_FILES)
7023else
7024sdk_atree_files += $(atree_dir)/sdk.atree
7025endif
7026
7027deps := \
7028	$(OUT_DOCS)/offline-sdk-timestamp \
7029	$(SDK_METADATA_FILES) \
7030  $(INSTALLED_SDK_BUILD_PROP_TARGET) \
7031	$(ATREE_FILES) \
7032	$(sdk_atree_files) \
7033	$(HOST_OUT_EXECUTABLES)/atree \
7034	$(HOST_OUT_EXECUTABLES)/line_endings
7035
7036# The name of the subdir within the platforms dir of the sdk. One of:
7037# - android-<SDK_INT> (stable base dessert SDKs)
7038# - android-<CODENAME> (stable extension SDKs)
7039# - android-<SDK_INT>-ext<EXT_INT> (codename SDKs)
7040sdk_platform_dir_name := $(strip \
7041  $(if $(filter REL,$(PLATFORM_VERSION_CODENAME)), \
7042    $(if $(filter $(PLATFORM_SDK_EXTENSION_VERSION),$(PLATFORM_BASE_SDK_EXTENSION_VERSION)), \
7043      android-$(PLATFORM_SDK_VERSION), \
7044      android-$(PLATFORM_SDK_VERSION)-ext$(PLATFORM_SDK_EXTENSION_VERSION) \
7045    ), \
7046    android-$(PLATFORM_VERSION_CODENAME) \
7047  ) \
7048)
7049
7050INTERNAL_SDK_TARGET := $(sdk_dir)/$(sdk_name).zip
7051$(INTERNAL_SDK_TARGET): PRIVATE_NAME := $(sdk_name)
7052$(INTERNAL_SDK_TARGET): PRIVATE_DIR := $(sdk_dir)/$(sdk_name)
7053$(INTERNAL_SDK_TARGET): PRIVATE_DEP_FILE := $(sdk_dep_file)
7054$(INTERNAL_SDK_TARGET): PRIVATE_INPUT_FILES := $(sdk_atree_files)
7055$(INTERNAL_SDK_TARGET): PRIVATE_PLATFORM_NAME := $(sdk_platform_dir_name)
7056# Set SDK_GNU_ERROR to non-empty to fail when a GNU target is built.
7057#
7058#SDK_GNU_ERROR := true
7059
7060$(INTERNAL_SDK_TARGET): $(deps)
7061	@echo "Package SDK: $@"
7062	$(hide) rm -rf $(PRIVATE_DIR) $@
7063	$(hide) for f in $(strip $(target_gnu_MODULES)); do \
7064	  if [ -f $$f ]; then \
7065	    echo SDK: $(if $(SDK_GNU_ERROR),ERROR:,warning:) \
7066	        including GNU target $$f >&2; \
7067	    FAIL=$(SDK_GNU_ERROR); \
7068	  fi; \
7069	done; \
7070	if [ $$FAIL ]; then exit 1; fi
7071	$(hide) ( \
7072	    ATREE_STRIP="$(HOST_STRIP) -x" \
7073	    $(HOST_OUT_EXECUTABLES)/atree \
7074	    $(addprefix -f ,$(PRIVATE_INPUT_FILES)) \
7075	        -m $(PRIVATE_DEP_FILE) \
7076	        -I . \
7077	        -I $(PRODUCT_OUT) \
7078	        -I $(HOST_OUT) \
7079	        -I $(TARGET_COMMON_OUT_ROOT) \
7080	        -v "PLATFORM_NAME=$(PRIVATE_PLATFORM_NAME)" \
7081	        -v "OUT_DIR=$(OUT_DIR)" \
7082	        -v "HOST_OUT=$(HOST_OUT)" \
7083	        -v "TARGET_ARCH=$(TARGET_ARCH)" \
7084	        -v "TARGET_CPU_ABI=$(TARGET_CPU_ABI)" \
7085	        -v "DLL_EXTENSION=$(HOST_SHLIB_SUFFIX)" \
7086	        -o $(PRIVATE_DIR) && \
7087	    HOST_OUT_EXECUTABLES=$(HOST_OUT_EXECUTABLES) HOST_OS=$(HOST_OS) \
7088	        development/build/tools/sdk_clean.sh $(PRIVATE_DIR) && \
7089	    chmod -R ug+rwX $(PRIVATE_DIR) && \
7090	    cd $(dir $@) && zip -rqX $(notdir $@) $(PRIVATE_NAME) \
7091	) || ( rm -rf $(PRIVATE_DIR) $@ && exit 44 )
7092
7093MAIN_SDK_DIR  := $(sdk_dir)
7094MAIN_SDK_ZIP  := $(INTERNAL_SDK_TARGET)
7095
7096endif # sdk in MAKECMDGOALS
7097
7098# -----------------------------------------------------------------
7099# Findbugs
7100INTERNAL_FINDBUGS_XML_TARGET := $(PRODUCT_OUT)/findbugs.xml
7101INTERNAL_FINDBUGS_HTML_TARGET := $(PRODUCT_OUT)/findbugs.html
7102$(INTERNAL_FINDBUGS_XML_TARGET): $(ALL_FINDBUGS_FILES)
7103	@echo UnionBugs: $@
7104	$(hide) $(FINDBUGS_DIR)/unionBugs $(ALL_FINDBUGS_FILES) \
7105	> $@
7106$(INTERNAL_FINDBUGS_HTML_TARGET): $(INTERNAL_FINDBUGS_XML_TARGET)
7107	@echo ConvertXmlToText: $@
7108	$(hide) $(FINDBUGS_DIR)/convertXmlToText -html:fancy.xsl \
7109	$(INTERNAL_FINDBUGS_XML_TARGET) > $@
7110
7111# -----------------------------------------------------------------
7112# Findbugs
7113
7114# -----------------------------------------------------------------
7115# These are some additional build tasks that need to be run.
7116ifneq ($(dont_bother),true)
7117include $(sort $(wildcard $(BUILD_SYSTEM)/tasks/*.mk))
7118-include $(sort $(wildcard vendor/*/build/tasks/*.mk))
7119-include $(sort $(wildcard device/*/build/tasks/*.mk))
7120-include $(sort $(wildcard product/*/build/tasks/*.mk))
7121# Also the project-specific tasks
7122-include $(sort $(wildcard vendor/*/*/build/tasks/*.mk))
7123-include $(sort $(wildcard device/*/*/build/tasks/*.mk))
7124-include $(sort $(wildcard product/*/*/build/tasks/*.mk))
7125# Also add test specifc tasks
7126include $(sort $(wildcard platform_testing/build/tasks/*.mk))
7127include $(sort $(wildcard test/vts/tools/build/tasks/*.mk))
7128endif
7129
7130include $(BUILD_SYSTEM)/product-graph.mk
7131
7132# -----------------------------------------------------------------
7133# Create SDK repository packages. Must be done after tasks/* since
7134# we need the addon rules defined.
7135ifneq ($(sdk_repo_goal),)
7136include $(TOPDIR)development/build/tools/sdk_repo.mk
7137endif
7138
7139# -----------------------------------------------------------------
7140# Soong generates the list of all shared libraries that are depended on by fuzz
7141# targets. It saves this list as a source:destination pair to
7142# FUZZ_TARGET_SHARED_DEPS_INSTALL_PAIRS, where the source is the path to the
7143# build of the unstripped shared library, and the destination is the
7144# /data/fuzz/$ARCH/lib (for device) or /fuzz/$ARCH/lib (for host) directory
7145# where fuzz target shared libraries are to be "reinstalled". The
7146# copy-many-files below generates the rules to copy the unstripped shared
7147# libraries to the device or host "reinstallation" directory. These rules are
7148# depended on by each module in soong_cc_prebuilt.mk, where the module will have
7149# a dependency on each shared library that it needs to be "reinstalled".
7150FUZZ_SHARED_DEPS := $(call copy-many-files,$(strip $(FUZZ_TARGET_SHARED_DEPS_INSTALL_PAIRS)))
7151
7152# -----------------------------------------------------------------
7153# The rule to build all fuzz targets for C++ and Rust, and package them.
7154# Note: The packages are created in Soong, and in a perfect world,
7155# we'd be able to create the phony rule there. But, if we want to
7156# have dist goals for the fuzz target, we need to have the PHONY
7157# target defined in make. MakeVarsContext.DistForGoal doesn't take
7158# into account that a PHONY rule create by Soong won't be available
7159# during make, and such will fail with `writing to readonly
7160# directory`, because kati will see 'haiku' as being a file, not a
7161# phony target.
7162.PHONY: haiku
7163haiku: $(SOONG_FUZZ_PACKAGING_ARCH_MODULES) $(ALL_FUZZ_TARGETS)
7164$(call dist-for-goals,haiku,$(SOONG_FUZZ_PACKAGING_ARCH_MODULES))
7165$(call dist-for-goals,haiku,$(PRODUCT_OUT)/module-info.json)
7166.PHONY: haiku-java
7167haiku-java: $(SOONG_JAVA_FUZZ_PACKAGING_ARCH_MODULES) $(ALL_JAVA_FUZZ_TARGETS)
7168$(call dist-for-goals,haiku-java,$(SOONG_JAVA_FUZZ_PACKAGING_ARCH_MODULES))
7169.PHONY: haiku-rust
7170haiku-rust: $(SOONG_RUST_FUZZ_PACKAGING_ARCH_MODULES) $(ALL_RUST_FUZZ_TARGETS)
7171$(call dist-for-goals,haiku-rust,$(SOONG_RUST_FUZZ_PACKAGING_ARCH_MODULES))
7172$(call dist-for-goals,haiku-rust,$(PRODUCT_OUT)/module-info.json)
7173
7174# -----------------------------------------------------------------
7175# Extract platform fonts used in Layoutlib
7176include $(BUILD_SYSTEM)/layoutlib_fonts.mk
7177
7178
7179# -----------------------------------------------------------------
7180# OS Licensing
7181
7182include $(BUILD_SYSTEM)/os_licensing.mk
7183
7184# When appending new code to this file, please insert above OS Licensing
7185