· 7 years ago · Nov 17, 2018, 06:22 AM
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
7# Pick a reasonable string to use to identify files.
8ifneq (,$(filter eng.%,$(BUILD_NUMBER)))
9 # BUILD_NUMBER has a timestamp in it, which means that
10 # it will change every time. Pick a stable value.
11 FILE_NAME_TAG := eng.$(USER)
12else
13 FILE_NAME_TAG := $(BUILD_NUMBER)
14endif
15
16# -----------------------------------------------------------------
17# Define rules to copy PRODUCT_COPY_FILES defined by the product.
18# PRODUCT_COPY_FILES contains words like <source file>:<dest file>[:<owner>].
19# <dest file> is relative to $(PRODUCT_OUT), so it should look like,
20# e.g., "system/etc/file.xml".
21# The filter part means "only eval the copy-one-file rule if this
22# src:dest pair is the first one to match the same dest"
23#$(1): the src:dest pair
24define check-product-copy-files
25$(if $(filter %.apk, $(call word-colon, 2, $(1))),$(error \
26 Prebuilt apk found in PRODUCT_COPY_FILES: $(1), use BUILD_PREBUILT instead!))
27endef
28# filter out the duplicate <source file>:<dest file> pairs.
29unique_product_copy_files_pairs :=
30$(foreach cf,$(PRODUCT_COPY_FILES), \
31 $(if $(filter $(unique_product_copy_files_pairs),$(cf)),,\
32 $(eval unique_product_copy_files_pairs += $(cf))))
33unique_product_copy_files_destinations :=
34$(foreach cf,$(unique_product_copy_files_pairs), \
35 $(eval _src := $(call word-colon,1,$(cf))) \
36 $(eval _dest := $(call word-colon,2,$(cf))) \
37 $(call check-product-copy-files,$(cf)) \
38 $(if $(filter $(unique_product_copy_files_destinations),$(_dest)), \
39 $(info PRODUCT_COPY_FILES $(cf) ignored.), \
40 $(eval _fulldest := $(call append-path,$(PRODUCT_OUT),$(_dest))) \
41 $(if $(filter %.xml,$(_dest)),\
42 $(eval $(call copy-xml-file-checked,$(_src),$(_fulldest))),\
43 $(eval $(call copy-one-file,$(_src),$(_fulldest)))) \
44 $(eval ALL_DEFAULT_INSTALLED_MODULES += $(_fulldest)) \
45 $(eval unique_product_copy_files_destinations += $(_dest))))
46unique_product_copy_files_pairs :=
47unique_product_copy_files_destinations :=
48
49# -----------------------------------------------------------------
50# Define rules to copy headers defined in copy_headers.mk
51# If more than one makefile declared a header, print a warning,
52# then copy the last one defined. This matches the previous make
53# behavior.
54$(foreach dest,$(ALL_COPIED_HEADERS), \
55 $(eval _srcs := $(ALL_COPIED_HEADERS.$(dest).SRC)) \
56 $(eval _src := $(word $(words $(_srcs)),$(_srcs))) \
57 $(if $(call streq,$(_src),$(_srcs)),, \
58 $(warning Duplicate header copy: $(dest)) \
59 $(warning Defined in: $(ALL_COPIED_HEADERS.$(dest).MAKEFILE))) \
60 $(eval $(call copy-one-header,$(_src),$(dest))))
61all_copied_headers: $(ALL_COPIED_HEADERS)
62
63# -----------------------------------------------------------------
64# docs/index.html
65ifeq (,$(TARGET_BUILD_APPS))
66gen := $(OUT_DOCS)/index.html
67ALL_DOCS += $(gen)
68$(gen): frameworks/base/docs/docs-redirect-index.html
69 @mkdir -p $(dir $@)
70 @cp -f $< $@
71endif
72
73# -----------------------------------------------------------------
74# property_overrides_split_enabled
75property_overrides_split_enabled :=
76ifeq ($(BOARD_PROPERTY_OVERRIDES_SPLIT_ENABLED), true)
77 property_overrides_split_enabled := true
78endif
79
80# -----------------------------------------------------------------
81# prop.default
82ifdef property_overrides_split_enabled
83INSTALLED_DEFAULT_PROP_TARGET := $(TARGET_OUT)/etc/prop.default
84INSTALLED_DEFAULT_PROP_OLD_TARGET := $(TARGET_ROOT_OUT)/default.prop
85ALL_DEFAULT_INSTALLED_MODULES += $(INSTALLED_DEFAULT_PROP_OLD_TARGET)
86$(INSTALLED_DEFAULT_PROP_OLD_TARGET): $(INSTALLED_DEFAULT_PROP_TARGET)
87else
88# legacy path
89INSTALLED_DEFAULT_PROP_TARGET := $(TARGET_ROOT_OUT)/default.prop
90endif
91ALL_DEFAULT_INSTALLED_MODULES += $(INSTALLED_DEFAULT_PROP_TARGET)
92FINAL_DEFAULT_PROPERTIES := \
93 $(call collapse-pairs, $(ADDITIONAL_DEFAULT_PROPERTIES)) \
94 $(call collapse-pairs, $(PRODUCT_SYSTEM_DEFAULT_PROPERTIES))
95ifndef property_overrides_split_enabled
96 FINAL_DEFAULT_PROPERTIES += \
97 $(call collapse-pairs, $(PRODUCT_DEFAULT_PROPERTY_OVERRIDES))
98endif
99FINAL_DEFAULT_PROPERTIES := $(call uniq-pairs-by-first-component, \
100 $(FINAL_DEFAULT_PROPERTIES),=)
101
102intermediate_system_build_prop := $(call intermediates-dir-for,ETC,system_build_prop)/build.prop
103
104$(INSTALLED_DEFAULT_PROP_TARGET): $(intermediate_system_build_prop)
105 @echo Target buildinfo: $@
106 @mkdir -p $(dir $@)
107 @rm -f $@
108 $(hide) echo "#" > $@; \
109 echo "# ADDITIONAL_DEFAULT_PROPERTIES" >> $@; \
110 echo "#" >> $@;
111 $(hide) $(foreach line,$(FINAL_DEFAULT_PROPERTIES), \
112 echo "$(line)" >> $@;)
113 $(hide) echo "#" >> $@; \
114 echo "# BOOTIMAGE_BUILD_PROPERTIES" >> $@; \
115 echo "#" >> $@;
116 $(hide) echo ro.bootimage.build.date=`$(DATE_FROM_FILE)`>>$@
117 $(hide) echo ro.bootimage.build.date.utc=`$(DATE_FROM_FILE) +%s`>>$@
118 $(hide) echo ro.bootimage.build.fingerprint="$(BUILD_FINGERPRINT_FROM_FILE)">>$@
119 $(hide) build/tools/post_process_props.py $@
120ifdef property_overrides_split_enabled
121 $(hide) mkdir -p $(TARGET_ROOT_OUT)
122 $(hide) ln -sf system/etc/prop.default $(INSTALLED_DEFAULT_PROP_OLD_TARGET)
123endif
124
125# -----------------------------------------------------------------
126# vendor default.prop
127INSTALLED_VENDOR_DEFAULT_PROP_TARGET :=
128ifdef property_overrides_split_enabled
129INSTALLED_VENDOR_DEFAULT_PROP_TARGET := $(TARGET_OUT_VENDOR)/default.prop
130ALL_DEFAULT_INSTALLED_MODULES += $(INSTALLED_VENDOR_DEFAULT_PROP_TARGET)
131
132FINAL_VENDOR_DEFAULT_PROPERTIES += \
133 $(call collapse-pairs, $(PRODUCT_DEFAULT_PROPERTY_OVERRIDES))
134FINAL_VENDOR_DEFAULT_PROPERTIES := $(call uniq-pairs-by-first-component, \
135 $(FINAL_VENDOR_DEFAULT_PROPERTIES),=)
136
137$(INSTALLED_VENDOR_DEFAULT_PROP_TARGET): $(INSTALLED_DEFAULT_PROP_TARGET)
138 @echo Target buildinfo: $@
139 @mkdir -p $(dir $@)
140 $(hide) echo "#" > $@; \
141 echo "# ADDITIONAL VENDOR DEFAULT PROPERTIES" >> $@; \
142 echo "#" >> $@;
143 $(hide) $(foreach line,$(FINAL_VENDOR_DEFAULT_PROPERTIES), \
144 echo "$(line)" >> $@;)
145 $(hide) build/tools/post_process_props.py $@
146
147endif # property_overrides_split_enabled
148
149# -----------------------------------------------------------------
150# build.prop
151INSTALLED_BUILD_PROP_TARGET := $(TARGET_OUT)/build.prop
152ALL_DEFAULT_INSTALLED_MODULES += $(INSTALLED_BUILD_PROP_TARGET)
153FINAL_BUILD_PROPERTIES := \
154 $(call collapse-pairs, $(ADDITIONAL_BUILD_PROPERTIES))
155FINAL_BUILD_PROPERTIES := $(call uniq-pairs-by-first-component, \
156 $(FINAL_BUILD_PROPERTIES),=)
157
158# A list of arbitrary tags describing the build configuration.
159# Force ":=" so we can use +=
160BUILD_VERSION_TAGS := $(BUILD_VERSION_TAGS)
161ifeq ($(TARGET_BUILD_TYPE),debug)
162 BUILD_VERSION_TAGS += debug
163endif
164# The "test-keys" tag marks builds signed with the old test keys,
165# which are available in the SDK. "dev-keys" marks builds signed with
166# non-default dev keys (usually private keys from a vendor directory).
167# Both of these tags will be removed and replaced with "release-keys"
168# when the target-files is signed in a post-build step.
169ifeq ($(DEFAULT_SYSTEM_DEV_CERTIFICATE),build/target/product/security/testkey)
170BUILD_KEYS := test-keys
171else
172BUILD_KEYS := dev-keys
173endif
174BUILD_VERSION_TAGS += $(BUILD_KEYS)
175BUILD_VERSION_TAGS := $(subst $(space),$(comma),$(sort $(BUILD_VERSION_TAGS)))
176
177# A human-readable string that descibes this build in detail.
178build_desc := $(TARGET_PRODUCT)-$(TARGET_BUILD_VARIANT) $(PLATFORM_VERSION) $(BUILD_ID) $(BUILD_NUMBER_FROM_FILE) $(BUILD_VERSION_TAGS)
179$(intermediate_system_build_prop): PRIVATE_BUILD_DESC := $(build_desc)
180
181# The string used to uniquely identify the combined build and product; used by the OTA server.
182ifeq (,$(strip $(BUILD_FINGERPRINT)))
183 ifneq ($(filter eng.%,$(BUILD_NUMBER)),)
184 # Trim down BUILD_FINGERPRINT: the default BUILD_NUMBER makes it easily exceed
185 # the Android system property length limit (PROPERTY_VALUE_MAX=92).
186 BF_BUILD_NUMBER := $(shell echo $${USER:0:6})$(shell $(DATE) +%m%d%H%M)
187 else
188 BF_BUILD_NUMBER := $(BUILD_NUMBER)
189 endif
190 BUILD_FINGERPRINT := $(PRODUCT_BRAND)/$(TARGET_PRODUCT)/$(TARGET_DEVICE):$(PLATFORM_VERSION)/$(BUILD_ID)/$(BF_BUILD_NUMBER):$(TARGET_BUILD_VARIANT)/$(BUILD_VERSION_TAGS)
191endif
192ifneq ($(words $(BUILD_FINGERPRINT)),1)
193 $(error BUILD_FINGERPRINT cannot contain spaces: "$(BUILD_FINGERPRINT)")
194endif
195
196$(shell mkdir -p $(PRODUCT_OUT) && echo $(BUILD_FINGERPRINT) > $(PRODUCT_OUT)/build_fingerprint.txt)
197BUILD_FINGERPRINT_FROM_FILE := $$(cat $(PRODUCT_OUT)/build_fingerprint.txt)
198
199# The string used to uniquely identify the system build; used by the OTA server.
200# This purposefully excludes any product-specific variables.
201ifeq (,$(strip $(BUILD_THUMBPRINT)))
202 BUILD_THUMBPRINT := $(PLATFORM_VERSION)/$(BUILD_ID)/$(BUILD_NUMBER):$(TARGET_BUILD_VARIANT)/$(BUILD_VERSION_TAGS)
203endif
204ifneq ($(words $(BUILD_THUMBPRINT)),1)
205 $(error BUILD_THUMBPRINT cannot contain spaces: "$(BUILD_THUMBPRINT)")
206endif
207
208KNOWN_OEM_THUMBPRINT_PROPERTIES := \
209 ro.product.brand \
210 ro.product.name \
211 ro.product.device
212OEM_THUMBPRINT_PROPERTIES := $(filter $(KNOWN_OEM_THUMBPRINT_PROPERTIES),\
213 $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_OEM_PROPERTIES))
214
215# Display parameters shown under Settings -> About Phone
216ifeq ($(TARGET_BUILD_VARIANT),user)
217 # User builds should show:
218 # release build number or branch.buld_number non-release builds
219
220 # Dev. branches should have DISPLAY_BUILD_NUMBER set
221 ifeq (true,$(DISPLAY_BUILD_NUMBER))
222 BUILD_DISPLAY_ID := $(BUILD_ID).$(BUILD_NUMBER_FROM_FILE) $(BUILD_KEYS)
223 else
224 BUILD_DISPLAY_ID := $(BUILD_ID) $(BUILD_KEYS)
225 endif
226else
227 # Non-user builds should show detailed build information
228 BUILD_DISPLAY_ID := $(build_desc)
229endif
230
231# Accepts a whitespace separated list of product locales such as
232# (en_US en_AU en_GB...) and returns the first locale in the list with
233# underscores replaced with hyphens. In the example above, this will
234# return "en-US".
235define get-default-product-locale
236$(strip $(subst _,-, $(firstword $(1))))
237endef
238
239BUILDINFO_SH := build/tools/buildinfo.sh
240VENDOR_BUILDINFO_SH := build/tools/vendor_buildinfo.sh
241
242# TARGET_BUILD_FLAVOR and ro.build.flavor are used only by the test
243# harness to distinguish builds. Only add _asan for a sanitized build
244# if it isn't already a part of the flavor (via a dedicated lunch
245# config for example).
246TARGET_BUILD_FLAVOR := $(TARGET_PRODUCT)-$(TARGET_BUILD_VARIANT)
247ifdef SANITIZE_TARGET
248ifeq (,$(findstring _asan,$(TARGET_BUILD_FLAVOR)))
249TARGET_BUILD_FLAVOR := $(TARGET_BUILD_FLAVOR)_asan
250endif
251endif
252
253ifdef TARGET_SYSTEM_PROP
254system_prop_file := $(TARGET_SYSTEM_PROP)
255else
256system_prop_file := $(wildcard $(TARGET_DEVICE_DIR)/system.prop)
257endif
258$(intermediate_system_build_prop): $(BUILDINFO_SH) $(INTERNAL_BUILD_ID_MAKEFILE) $(BUILD_SYSTEM)/version_defaults.mk $(system_prop_file) $(INSTALLED_ANDROID_INFO_TXT_TARGET)
259 @echo Target buildinfo: $@
260 @mkdir -p $(dir $@)
261 $(hide) echo > $@
262ifneq ($(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_OEM_PROPERTIES),)
263 $(hide) echo "#" >> $@; \
264 echo "# PRODUCT_OEM_PROPERTIES" >> $@; \
265 echo "#" >> $@;
266 $(hide) $(foreach prop,$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_OEM_PROPERTIES), \
267 echo "import /oem/oem.prop $(prop)" >> $@;)
268endif
269 $(hide) TARGET_BUILD_TYPE="$(TARGET_BUILD_VARIANT)" \
270 TARGET_BUILD_FLAVOR="$(TARGET_BUILD_FLAVOR)" \
271 TARGET_DEVICE="$(TARGET_DEVICE)" \
272 LINEAGE_DEVICE="$(TARGET_DEVICE)" \
273 PRODUCT_NAME="$(TARGET_PRODUCT)" \
274 PRODUCT_BRAND="$(PRODUCT_BRAND)" \
275 PRODUCT_DEFAULT_LOCALE="$(call get-default-product-locale,$(PRODUCT_LOCALES))" \
276 PRODUCT_DEFAULT_WIFI_CHANNELS="$(PRODUCT_DEFAULT_WIFI_CHANNELS)" \
277 PRODUCT_MODEL="$(PRODUCT_MODEL)" \
278 PRODUCT_MANUFACTURER="$(PRODUCT_MANUFACTURER)" \
279 PRIVATE_BUILD_DESC="$(PRIVATE_BUILD_DESC)" \
280 BUILD_ID="$(BUILD_ID)" \
281 BUILD_DISPLAY_ID="$(BUILD_DISPLAY_ID)" \
282 DATE="$(DATE_FROM_FILE)" \
283 BUILD_NUMBER="$(BUILD_NUMBER_FROM_FILE)" \
284 BOARD_BUILD_SYSTEM_ROOT_IMAGE="$(BOARD_BUILD_SYSTEM_ROOT_IMAGE)" \
285 AB_OTA_UPDATER="$(AB_OTA_UPDATER)" \
286 PLATFORM_VERSION="$(PLATFORM_VERSION)" \
287 PLATFORM_SECURITY_PATCH="$(PLATFORM_SECURITY_PATCH)" \
288 PLATFORM_BASE_OS="$(PLATFORM_BASE_OS)" \
289 PLATFORM_SDK_VERSION="$(PLATFORM_SDK_VERSION)" \
290 PLATFORM_PREVIEW_SDK_VERSION="$(PLATFORM_PREVIEW_SDK_VERSION)" \
291 PLATFORM_VERSION_CODENAME="$(PLATFORM_VERSION_CODENAME)" \
292 PLATFORM_VERSION_ALL_CODENAMES="$(PLATFORM_VERSION_ALL_CODENAMES)" \
293 BUILD_VERSION_TAGS="$(BUILD_VERSION_TAGS)" \
294 BUILD_FINGERPRINT="$(BUILD_FINGERPRINT_FROM_FILE)" \
295 $(if $(OEM_THUMBPRINT_PROPERTIES),BUILD_THUMBPRINT="$(BUILD_THUMBPRINT)") \
296 TARGET_CPU_ABI_LIST="$(TARGET_CPU_ABI_LIST)" \
297 TARGET_CPU_ABI_LIST_32_BIT="$(TARGET_CPU_ABI_LIST_32_BIT)" \
298 TARGET_CPU_ABI_LIST_64_BIT="$(TARGET_CPU_ABI_LIST_64_BIT)" \
299 TARGET_CPU_ABI="$(TARGET_CPU_ABI)" \
300 TARGET_CPU_ABI2="$(TARGET_CPU_ABI2)" \
301 TARGET_AAPT_CHARACTERISTICS="$(TARGET_AAPT_CHARACTERISTICS)" \
302 $(PRODUCT_BUILD_PROP_OVERRIDES) \
303 bash $(BUILDINFO_SH) >> $@
304ifeq ($(TARGET_COPY_OUT_VENDOR),system)
305 $(hide) TARGET_DEVICE="$(TARGET_DEVICE)" \
306 PRODUCT_NAME="$(TARGET_PRODUCT)" \
307 PRODUCT_BRAND="$(PRODUCT_BRAND)" \
308 PRODUCT_MODEL="$(PRODUCT_MODEL)" \
309 PRODUCT_MANUFACTURER="$(PRODUCT_MANUFACTURER)" \
310 TARGET_BOOTLOADER_BOARD_NAME="$(TARGET_BOOTLOADER_BOARD_NAME)" \
311 TARGET_BOARD_PLATFORM="$(TARGET_BOARD_PLATFORM)" \
312 bash $(VENDOR_BUILDINFO_SH) >> $@
313endif
314 $(hide) $(foreach file,$(system_prop_file), \
315 if [ -f "$(file)" ]; then \
316 echo "#" >> $@; \
317 echo Target buildinfo from: "$(file)"; \
318 echo "# from $(file)" >> $@; \
319 echo "#" >> $@; \
320 cat $(file) >> $@; \
321 fi;)
322 $(if $(FINAL_BUILD_PROPERTIES), \
323 $(hide) echo >> $@; \
324 echo "#" >> $@; \
325 echo "# ADDITIONAL_BUILD_PROPERTIES" >> $@; \
326 echo "#" >> $@; )
327 $(hide) $(foreach line,$(FINAL_BUILD_PROPERTIES), \
328 echo "$(line)" >> $@;)
329 $(hide) cat $(INSTALLED_ANDROID_INFO_TXT_TARGET) | grep 'require version-' | sed -e 's/require version-/ro.build.expect./g' >> $@
330 $(hide) build/tools/post_process_props.py $@ $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SYSTEM_PROPERTY_BLACKLIST)
331
332build_desc :=
333
334ifeq (,$(filter true, $(TARGET_NO_KERNEL) $(TARGET_NO_RECOVERY)))
335INSTALLED_RECOVERYIMAGE_TARGET := $(PRODUCT_OUT)/recovery.img
336else
337INSTALLED_RECOVERYIMAGE_TARGET :=
338endif
339
340$(INSTALLED_BUILD_PROP_TARGET): $(intermediate_system_build_prop) $(INSTALLED_RECOVERYIMAGE_TARGET)
341 @echo "Target build info: $@"
342 $(hide) grep -v 'ro.product.first_api_level' $(intermediate_system_build_prop) > $@
343ifdef INSTALLED_RECOVERYIMAGE_TARGET
344 $(hide) echo ro.expect.recovery_id=`cat $(RECOVERYIMAGE_ID_FILE)` >> $@
345endif
346
347# -----------------------------------------------------------------
348# vendor build.prop
349#
350# Prevent overwriting build.prop in system
351ifneq ($(TARGET_COPY_OUT_VENDOR),system)
352# For verifying that the vendor build is what we think it is
353INSTALLED_VENDOR_BUILD_PROP_TARGET := $(TARGET_OUT_VENDOR)/build.prop
354ALL_DEFAULT_INSTALLED_MODULES += $(INSTALLED_VENDOR_BUILD_PROP_TARGET)
355
356ifdef property_overrides_split_enabled
357FINAL_VENDOR_BUILD_PROPERTIES += \
358 $(call collapse-pairs, $(PRODUCT_PROPERTY_OVERRIDES))
359FINAL_VENDOR_BUILD_PROPERTIES := $(call uniq-pairs-by-first-component, \
360 $(FINAL_VENDOR_BUILD_PROPERTIES),=)
361endif # property_overrides_split_enabled
362
363ifdef TARGET_VENDOR_PROP
364vendor_prop_file := $(TARGET_VENDOR_PROP)
365else
366vendor_prop_file := $(wildcard $(TARGET_DEVICE_DIR)/vendor.prop)
367endif
368$(INSTALLED_VENDOR_BUILD_PROP_TARGET): $(VENDOR_BUILDINFO_SH) $(intermediate_system_build_prop)
369 @echo Target vendor buildinfo: $@
370 @mkdir -p $(dir $@)
371 $(hide) echo > $@
372 $(hide) grep 'ro.product.first_api_level' $(intermediate_system_build_prop) >> $@ || true
373 $(hide) echo ro.vendor.build.date=`$(DATE_FROM_FILE)`>>$@
374 $(hide) echo ro.vendor.build.date.utc=`$(DATE_FROM_FILE) +%s`>>$@
375 $(hide) echo ro.vendor.build.fingerprint="$(BUILD_FINGERPRINT_FROM_FILE)">>$@
376 $(hide) TARGET_DEVICE="$(TARGET_DEVICE)" \
377 PRODUCT_NAME="$(TARGET_PRODUCT)" \
378 PRODUCT_BRAND="$(PRODUCT_BRAND)" \
379 PRODUCT_MODEL="$(PRODUCT_MODEL)" \
380 PRODUCT_MANUFACTURER="$(PRODUCT_MANUFACTURER)" \
381 TARGET_BOOTLOADER_BOARD_NAME="$(TARGET_BOOTLOADER_BOARD_NAME)" \
382 TARGET_BOARD_PLATFORM="$(TARGET_BOARD_PLATFORM)" \
383 bash $(VENDOR_BUILDINFO_SH) >> $@
384ifdef property_overrides_split_enabled
385 $(hide) $(foreach file,$(vendor_prop_file), \
386 if [ -f "$(file)" ]; then \
387 echo "#" >> $@; \
388 echo Target buildinfo from: "$(file)"; \
389 echo "# from $(file)" >> $@; \
390 echo "#" >> $@; \
391 cat $(file) >> $@; \
392 fi;)
393 $(hide) echo "#" >> $@; \
394 echo "# ADDITIONAL VENDOR BUILD PROPERTIES" >> $@; \
395 echo "#" >> $@;
396 $(hide) $(foreach line,$(FINAL_VENDOR_BUILD_PROPERTIES), \
397 echo "$(line)" >> $@;)
398 $(hide) build/tools/post_process_props.py $@
399endif # property_overrides_split_enabled
400endif # TARGET_COPY_OUT_VENDOR=system
401
402# ----------------------------------------------------------------
403
404# -----------------------------------------------------------------
405# sdk-build.prop
406#
407# There are certain things in build.prop that we don't want to
408# ship with the sdk; remove them.
409
410# This must be a list of entire property keys followed by
411# "=" characters, without any internal spaces.
412sdk_build_prop_remove := \
413 ro.build.user= \
414 ro.build.host= \
415 ro.product.brand= \
416 ro.product.manufacturer= \
417 ro.product.device=
418# TODO: Remove this soon-to-be obsolete property
419sdk_build_prop_remove += ro.build.product=
420INSTALLED_SDK_BUILD_PROP_TARGET := $(PRODUCT_OUT)/sdk/sdk-build.prop
421$(INSTALLED_SDK_BUILD_PROP_TARGET): $(INSTALLED_BUILD_PROP_TARGET)
422 @echo SDK buildinfo: $@
423 @mkdir -p $(dir $@)
424 $(hide) grep -v "$(subst $(space),\|,$(strip \
425 $(sdk_build_prop_remove)))" $< > $@.tmp
426 $(hide) for x in $(sdk_build_prop_remove); do \
427 echo "$$x"generic >> $@.tmp; done
428 $(hide) mv $@.tmp $@
429
430# -----------------------------------------------------------------
431# package stats
432PACKAGE_STATS_FILE := $(PRODUCT_OUT)/package-stats.txt
433PACKAGES_TO_STAT := \
434 $(sort $(filter $(TARGET_OUT)/% $(TARGET_OUT_DATA)/%, \
435 $(filter %.jar %.apk, $(ALL_DEFAULT_INSTALLED_MODULES))))
436$(PACKAGE_STATS_FILE): $(PACKAGES_TO_STAT)
437 @echo Package stats: $@
438 @mkdir -p $(dir $@)
439 $(hide) rm -f $@
440ifeq ($(PACKAGES_TO_STAT),)
441# Create empty package stats file if target builds no jar(s) or apk(s).
442 $(hide) touch $@
443else
444 $(hide) build/tools/dump-package-stats $^ > $@
445endif
446
447.PHONY: package-stats
448package-stats: $(PACKAGE_STATS_FILE)
449
450# -----------------------------------------------------------------
451# Cert-to-package mapping. Used by the post-build signing tools.
452# Use a macro to add newline to each echo command
453define _apkcerts_write_line
454$(hide) echo -n 'name="$(1).apk" certificate="$2" private_key="$3"' >> $5
455$(if $(4), $(hide) echo -n ' compressed="$4"' >> $5)
456$(hide) echo '' >> $5
457
458endef
459
460name := $(TARGET_PRODUCT)
461ifeq ($(TARGET_BUILD_TYPE),debug)
462 name := $(name)_debug
463endif
464name := $(name)-apkcerts-$(FILE_NAME_TAG)
465intermediates := \
466 $(call intermediates-dir-for,PACKAGING,apkcerts)
467APKCERTS_FILE := $(intermediates)/$(name).txt
468# We don't need to really build all the modules.
469# TODO: rebuild APKCERTS_FILE if any app change its cert.
470$(APKCERTS_FILE):
471 @echo APK certs list: $@
472 @mkdir -p $(dir $@)
473 @rm -f $@
474 $(foreach p,$(PACKAGES),\
475 $(if $(PACKAGES.$(p).EXTERNAL_KEY),\
476 $(call _apkcerts_write_line,$(p),"EXTERNAL","",$(PACKAGES.$(p).COMPRESSED),$@),\
477 $(call _apkcerts_write_line,$(p),$(PACKAGES.$(p).CERTIFICATE),$(PACKAGES.$(p).PRIVATE_KEY),$(PACKAGES.$(p).COMPRESSED),$@)))
478 # In case value of PACKAGES is empty.
479 $(hide) touch $@
480
481.PHONY: apkcerts-list
482apkcerts-list: $(APKCERTS_FILE)
483
484ifneq (,$(TARGET_BUILD_APPS))
485 $(call dist-for-goals, apps_only, $(APKCERTS_FILE):apkcerts.txt)
486endif
487
488# -----------------------------------------------------------------
489# build system stats
490BUILD_SYSTEM_STATS := $(PRODUCT_OUT)/build_system_stats.txt
491$(BUILD_SYSTEM_STATS):
492 @rm -f $@
493 @$(foreach s,$(STATS.MODULE_TYPE),echo "modules_type_make,$(s),$(words $(STATS.MODULE_TYPE.$(s)))" >>$@;)
494 @$(foreach s,$(STATS.SOONG_MODULE_TYPE),echo "modules_type_soong,$(s),$(STATS.SOONG_MODULE_TYPE.$(s))" >>$@;)
495$(call dist-for-goals,droidcore,$(BUILD_SYSTEM_STATS))
496
497# -----------------------------------------------------------------
498# Modules ready to be converted to Soong, ordered by how many
499# modules depend on them.
500SOONG_CONV := $(sort $(SOONG_CONV))
501SOONG_CONV_DATA := $(call intermediates-dir-for,PACKAGING,soong_conversion)/soong_conv_data
502$(SOONG_CONV_DATA):
503 @rm -f $@
504 @$(foreach s,$(SOONG_CONV),echo "$(s),$(sort $(SOONG_CONV.$(s).PROBLEMS)),$(sort $(filter-out $(SOONG_ALREADY_CONV),$(SOONG_CONV.$(s).DEPS)))" >>$@;)
505
506SOONG_TO_CONVERT_SCRIPT := build/tools/soong_to_convert.py
507SOONG_TO_CONVERT := $(PRODUCT_OUT)/soong_to_convert.txt
508$(SOONG_TO_CONVERT): $(SOONG_CONV_DATA) $(SOONG_TO_CONVERT_SCRIPT)
509 @rm -f $@
510 $(hide) $(SOONG_TO_CONVERT_SCRIPT) $< >$@
511$(call dist-for-goals,droidcore,$(SOONG_TO_CONVERT))
512
513# -----------------------------------------------------------------
514# The dev key is used to sign this package, and as the key required
515# for future OTA packages installed by this system. Actual product
516# deliverables will be re-signed by hand. We expect this file to
517# exist with the suffixes ".x509.pem" and ".pk8".
518DEFAULT_KEY_CERT_PAIR := $(DEFAULT_SYSTEM_DEV_CERTIFICATE)
519
520
521# Rules that need to be present for the all targets, even
522# if they don't do anything.
523.PHONY: systemimage
524systemimage:
525
526# -----------------------------------------------------------------
527
528.PHONY: event-log-tags
529
530# Produce an event logs tag file for everything we know about, in order
531# to properly allocate numbers. Then produce a file that's filtered
532# for what's going to be installed.
533
534all_event_log_tags_file := $(TARGET_OUT_COMMON_INTERMEDIATES)/all-event-log-tags.txt
535
536event_log_tags_file := $(TARGET_OUT)/etc/event-log-tags
537
538# Include tags from all packages that we know about
539all_event_log_tags_src := \
540 $(sort $(foreach m, $(ALL_MODULES), $(ALL_MODULES.$(m).EVENT_LOG_TAGS)))
541
542# PDK builds will already have a full list of tags that needs to get merged
543# in with the ones from source
544pdk_fusion_log_tags_file := $(patsubst $(PRODUCT_OUT)/%,$(_pdk_fusion_intermediates)/%,$(filter $(event_log_tags_file),$(ALL_PDK_FUSION_FILES)))
545
546$(all_event_log_tags_file): PRIVATE_SRC_FILES := $(all_event_log_tags_src) $(pdk_fusion_log_tags_file)
547$(all_event_log_tags_file): $(all_event_log_tags_src) $(pdk_fusion_log_tags_file) $(MERGETAGS) build/tools/event_log_tags.py
548 $(hide) mkdir -p $(dir $@)
549 $(hide) $(MERGETAGS) -o $@ $(PRIVATE_SRC_FILES)
550
551# Include tags from all packages included in this product, plus all
552# tags that are part of the system (ie, not in a vendor/ or device/
553# directory).
554event_log_tags_src := \
555 $(sort $(foreach m,\
556 $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_PACKAGES) \
557 $(call module-names-for-tag-list,user), \
558 $(ALL_MODULES.$(m).EVENT_LOG_TAGS)) \
559 $(filter-out vendor/% device/% out/%,$(all_event_log_tags_src)))
560
561$(event_log_tags_file): PRIVATE_SRC_FILES := $(event_log_tags_src) $(pdk_fusion_log_tags_file)
562$(event_log_tags_file): PRIVATE_MERGED_FILE := $(all_event_log_tags_file)
563$(event_log_tags_file): $(event_log_tags_src) $(all_event_log_tags_file) $(pdk_fusion_log_tags_file) $(MERGETAGS) build/tools/event_log_tags.py
564 $(hide) mkdir -p $(dir $@)
565 $(hide) $(MERGETAGS) -o $@ -m $(PRIVATE_MERGED_FILE) $(PRIVATE_SRC_FILES)
566
567event-log-tags: $(event_log_tags_file)
568
569ALL_DEFAULT_INSTALLED_MODULES += $(event_log_tags_file)
570
571
572# #################################################################
573# Targets for boot/OS images
574# #################################################################
575ifneq ($(strip $(TARGET_NO_BOOTLOADER)),true)
576 INSTALLED_BOOTLOADER_MODULE := $(PRODUCT_OUT)/bootloader
577 ifeq ($(strip $(TARGET_BOOTLOADER_IS_2ND)),true)
578 INSTALLED_2NDBOOTLOADER_TARGET := $(PRODUCT_OUT)/2ndbootloader
579 else
580 INSTALLED_2NDBOOTLOADER_TARGET :=
581 endif
582else
583 INSTALLED_BOOTLOADER_MODULE :=
584 INSTALLED_2NDBOOTLOADER_TARGET :=
585endif # TARGET_NO_BOOTLOADER
586ifneq ($(strip $(TARGET_NO_KERNEL)),true)
587 INSTALLED_KERNEL_TARGET := $(PRODUCT_OUT)/kernel
588else
589 INSTALLED_KERNEL_TARGET :=
590endif
591
592# -----------------------------------------------------------------
593# the ramdisk
594BOOT_RAMDISK_COMPRESSOR := $(MINIGZIP)
595RECOVERY_RAMDISK_COMPRESSOR := $(MINIGZIP)
596ifneq ($(LZMA_RAMDISK_TARGETS),)
597 ifneq (,$(findstring boot,$(LZMA_RAMDISK_TARGETS)))
598 BOOT_RAMDISK_COMPRESSOR := lzma -f -c
599 endif
600 ifneq (,$(findstring recovery,$(LZMA_RAMDISK_TARGETS)))
601 RECOVERY_RAMDISK_COMPRESSOR := lzma -f -c
602 TARGET_NOT_USE_GZIP_RECOVERY_RAMDISK := true
603 endif
604endif
605
606INTERNAL_RAMDISK_FILES := $(filter $(TARGET_ROOT_OUT)/%, \
607 $(ALL_GENERATED_SOURCES) \
608 $(ALL_DEFAULT_INSTALLED_MODULES))
609
610BUILT_RAMDISK_TARGET := $(PRODUCT_OUT)/ramdisk.img
611
612# We just build this directly to the install location.
613INSTALLED_RAMDISK_TARGET := $(BUILT_RAMDISK_TARGET)
614$(INSTALLED_RAMDISK_TARGET): $(MKBOOTFS) $(INTERNAL_RAMDISK_FILES) | $(MINIGZIP)
615 $(call pretty,"Target ram disk: $@")
616 $(hide) $(MKBOOTFS) -d $(TARGET_OUT) $(TARGET_ROOT_OUT) | $(BOOT_RAMDISK_COMPRESSOR) > $@
617
618.PHONY: ramdisk-nodeps
619ramdisk-nodeps: $(MKBOOTFS) | $(MINIGZIP)
620 @echo "make $@: ignoring dependencies"
621 $(hide) $(MKBOOTFS) -d $(TARGET_OUT) $(TARGET_ROOT_OUT) | $(BOOT_RAMDISK_COMPRESSOR) > $(INSTALLED_RAMDISK_TARGET)
622
623ifneq ($(strip $(TARGET_NO_KERNEL)),true)
624
625# -----------------------------------------------------------------
626# the boot image, which is a collection of other images.
627INTERNAL_BOOTIMAGE_ARGS := \
628 $(addprefix --second ,$(INSTALLED_2NDBOOTLOADER_TARGET)) \
629 --kernel $(INSTALLED_KERNEL_TARGET)
630
631ifneq ($(BOARD_BUILD_SYSTEM_ROOT_IMAGE),true)
632INTERNAL_BOOTIMAGE_ARGS += --ramdisk $(INSTALLED_RAMDISK_TARGET)
633endif
634
635INTERNAL_BOOTIMAGE_FILES := $(filter-out --%,$(INTERNAL_BOOTIMAGE_ARGS))
636
637ifdef BOARD_KERNEL_BASE
638 INTERNAL_BOOTIMAGE_ARGS += --base $(BOARD_KERNEL_BASE)
639endif
640
641ifdef BOARD_KERNEL_PAGESIZE
642 INTERNAL_BOOTIMAGE_ARGS += --pagesize $(BOARD_KERNEL_PAGESIZE)
643endif
644
645ifeq ($(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VERITY),true)
646ifeq ($(BOARD_BUILD_SYSTEM_ROOT_IMAGE),true)
647VERITY_KEYID := veritykeyid=id:`openssl x509 -in $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VERITY_SIGNING_KEY).x509.pem -text \
648 | grep keyid | sed 's/://g' | tr -d '[:space:]' | tr '[:upper:]' '[:lower:]' | sed 's/keyid//g'`
649endif
650endif
651
652INTERNAL_KERNEL_CMDLINE := $(strip $(BOARD_KERNEL_CMDLINE) buildvariant=$(TARGET_BUILD_VARIANT) $(VERITY_KEYID))
653ifdef INTERNAL_KERNEL_CMDLINE
654INTERNAL_BOOTIMAGE_ARGS += --cmdline "$(INTERNAL_KERNEL_CMDLINE)"
655endif
656
657INTERNAL_MKBOOTIMG_VERSION_ARGS := \
658 --os_version $(PLATFORM_VERSION) \
659 --os_patch_level $(PLATFORM_SECURITY_PATCH)
660
661INSTALLED_DTIMAGE_TARGET := $(PRODUCT_OUT)/dt.img
662
663ifeq ($(strip $(BOARD_KERNEL_SEPARATED_DT)),true)
664 INTERNAL_BOOTIMAGE_ARGS += --dt $(INSTALLED_DTIMAGE_TARGET)
665 BOOTIMAGE_EXTRA_DEPS := $(INSTALLED_DTIMAGE_TARGET)
666endif
667
668INSTALLED_BOOTIMAGE_TARGET := $(PRODUCT_OUT)/boot.img
669
670# BOARD_USES_RECOVERY_AS_BOOT = true must have BOARD_BUILD_SYSTEM_ROOT_IMAGE = true.
671ifeq ($(BOARD_USES_RECOVERY_AS_BOOT),true)
672ifneq ($(BOARD_BUILD_SYSTEM_ROOT_IMAGE),true)
673 $(error BOARD_BUILD_SYSTEM_ROOT_IMAGE must be enabled for BOARD_USES_RECOVERY_AS_BOOT.)
674endif
675endif
676
677# We build recovery as boot image if BOARD_USES_RECOVERY_AS_BOOT is true.
678ifneq ($(BOARD_USES_RECOVERY_AS_BOOT),true)
679ifeq ($(TARGET_BOOTIMAGE_USE_EXT2),true)
680$(error TARGET_BOOTIMAGE_USE_EXT2 is not supported anymore)
681
682else ifndef BOARD_CUSTOM_BOOTIMG_MK
683ifeq (true,$(BOARD_AVB_ENABLE)) # TARGET_BOOTIMAGE_USE_EXT2 != true
684
685$(INSTALLED_BOOTIMAGE_TARGET): $(MKBOOTIMG) $(AVBTOOL) $(INTERNAL_BOOTIMAGE_FILES) $(BOARD_AVB_BOOT_KEY_PATH)
686 $(call pretty,"Target boot image: $@")
687 $(hide) $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) $(INTERNAL_MKBOOTIMG_VERSION_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $@
688 $(hide) $(call assert-max-image-size,$@,$(BOARD_BOOTIMAGE_PARTITION_SIZE))
689 $(hide) $(AVBTOOL) add_hash_footer \
690 --image $@ \
691 --partition_size $(BOARD_BOOTIMAGE_PARTITION_SIZE) \
692 --partition_name boot $(INTERNAL_AVB_BOOT_SIGNING_ARGS) \
693 $(BOARD_AVB_BOOT_ADD_HASH_FOOTER_ARGS)
694
695.PHONY: bootimage-nodeps
696bootimage-nodeps: $(MKBOOTIMG) $(AVBTOOL) $(BOARD_AVB_BOOT_KEY_PATH)
697 @echo "make $@: ignoring dependencies"
698 $(hide) $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) $(INTERNAL_MKBOOTIMG_VERSION_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $(INSTALLED_BOOTIMAGE_TARGET)
699 $(hide) $(call assert-max-image-size,$(INSTALLED_BOOTIMAGE_TARGET),$(BOARD_BOOTIMAGE_PARTITION_SIZE))
700 $(hide) $(AVBTOOL) add_hash_footer \
701 --image $@ \
702 --partition_size $(BOARD_BOOTIMAGE_PARTITION_SIZE) \
703 --partition_name boot $(INTERNAL_AVB_BOOT_SIGNING_ARGS) \
704 $(BOARD_AVB_BOOT_ADD_HASH_FOOTER_ARGS)
705
706else ifeq (true,$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_BOOT_SIGNER)) # BOARD_AVB_ENABLE != true
707
708$(INSTALLED_BOOTIMAGE_TARGET): $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_FILES) $(BOOT_SIGNER)
709 $(call pretty,"Target boot image: $@")
710 $(hide) $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) $(INTERNAL_MKBOOTIMG_VERSION_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $@
711 $(BOOT_SIGNER) /boot $@ $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VERITY_SIGNING_KEY).pk8 $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VERITY_SIGNING_KEY).x509.pem $@
712 $(hide) $(call assert-max-image-size,$@,$(BOARD_BOOTIMAGE_PARTITION_SIZE))
713
714.PHONY: bootimage-nodeps
715bootimage-nodeps: $(MKBOOTIMG) $(BOOT_SIGNER)
716 @echo "make $@: ignoring dependencies"
717 $(hide) $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) $(INTERNAL_MKBOOTIMG_VERSION_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $(INSTALLED_BOOTIMAGE_TARGET)
718 $(BOOT_SIGNER) /boot $(INSTALLED_BOOTIMAGE_TARGET) $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VERITY_SIGNING_KEY).pk8 $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VERITY_SIGNING_KEY).x509.pem $(INSTALLED_BOOTIMAGE_TARGET)
719 $(hide) $(call assert-max-image-size,$(INSTALLED_BOOTIMAGE_TARGET),$(BOARD_BOOTIMAGE_PARTITION_SIZE))
720
721else ifeq (true,$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VBOOT)) # PRODUCT_SUPPORTS_BOOT_SIGNER != true
722
723$(INSTALLED_BOOTIMAGE_TARGET): $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_FILES) $(VBOOT_SIGNER) $(FUTILITY) $(BOOTIMAGE_EXTRA_DEPS)
724 $(call pretty,"Target boot image: $@")
725 $(hide) $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) $(INTERNAL_MKBOOTIMG_VERSION_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $@.unsigned
726 $(VBOOT_SIGNER) $(FUTILITY) $@.unsigned $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VBOOT_SIGNING_KEY).vbpubk $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VBOOT_SIGNING_KEY).vbprivk $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VBOOT_SIGNING_SUBKEY).vbprivk $@.keyblock $@
727 $(hide) $(call assert-max-image-size,$@,$(BOARD_BOOTIMAGE_PARTITION_SIZE))
728
729.PHONY: bootimage-nodeps
730bootimage-nodeps: $(MKBOOTIMG) $(VBOOT_SIGNER) $(FUTILITY)
731 @echo "make $@: ignoring dependencies"
732 $(hide) $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) $(INTERNAL_MKBOOTIMG_VERSION_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $(INSTALLED_BOOTIMAGE_TARGET).unsigned
733 $(VBOOT_SIGNER) $(FUTILITY) $(INSTALLED_BOOTIMAGE_TARGET).unsigned $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VBOOT_SIGNING_KEY).vbpubk $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VBOOT_SIGNING_KEY).vbprivk $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VBOOT_SIGNING_SUBKEY).vbprivk $(INSTALLED_BOOTIMAGE_TARGET).keyblock $(INSTALLED_BOOTIMAGE_TARGET)
734 $(hide) $(call assert-max-image-size,$(INSTALLED_BOOTIMAGE_TARGET),$(BOARD_BOOTIMAGE_PARTITION_SIZE))
735
736else # PRODUCT_SUPPORTS_VBOOT != true
737
738$(INSTALLED_BOOTIMAGE_TARGET): $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_FILES) $(BOOTIMAGE_EXTRA_DEPS)
739 $(call pretty,"Target boot image: $@")
740 $(hide) $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) $(INTERNAL_MKBOOTIMG_VERSION_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $@
741 $(hide) $(call assert-max-image-size,$@,$(BOARD_BOOTIMAGE_PARTITION_SIZE))
742
743.PHONY: bootimage-nodeps
744bootimage-nodeps: $(MKBOOTIMG)
745 @echo "make $@: ignoring dependencies"
746 $(hide) $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) $(INTERNAL_MKBOOTIMG_VERSION_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $(INSTALLED_BOOTIMAGE_TARGET)
747 $(hide) $(call assert-max-image-size,$(INSTALLED_BOOTIMAGE_TARGET),$(BOARD_BOOTIMAGE_PARTITION_SIZE))
748
749endif # PRODUCT_SUPPORTS_VBOOT
750endif # TARGET_BOOTIMAGE_USE_EXT2 / BOARD_CUSTOM_BOOTIMG_MK
751endif # BOARD_USES_RECOVERY_AS_BOOT
752
753else # TARGET_NO_KERNEL
754INTERNAL_KERNEL_CMDLINE := $(strip $(BOARD_KERNEL_CMDLINE))
755# HACK: The top-level targets depend on the bootimage. Not all targets
756# can produce a bootimage, though, and emulator targets need the ramdisk
757# instead. Fake it out by calling the ramdisk the bootimage.
758# TODO: make the emulator use bootimages, and make mkbootimg accept
759# kernel-less inputs.
760INSTALLED_BOOTIMAGE_TARGET := $(INSTALLED_RAMDISK_TARGET)
761endif
762
763# -----------------------------------------------------------------
764# NOTICE files
765#
766# We are required to publish the licenses for all code under BSD, GPL and
767# Apache licenses (and possibly other more exotic ones as well). We err on the
768# side of caution, so the licenses for other third-party code are included here
769# too.
770#
771# This needs to be before the systemimage rules, because it adds to
772# ALL_DEFAULT_INSTALLED_MODULES, which those use to pick which files
773# go into the systemimage.
774
775.PHONY: notice_files
776
777# Create the rule to combine the files into text and html/xml forms
778# $(1) - xml_excluded_vendor|xml_vendor|html
779# $(2) - Plain text output file
780# $(3) - HTML/XML output file
781# $(4) - File title
782# $(5) - Directory to use. Notice files are all $(4)/src. Other
783# directories in there will be used for scratch
784# $(6) - Dependencies for the output files
785#
786# The algorithm here is that we go collect a hash for each of the notice
787# files and write the names of the files that match that hash. Then
788# to generate the real files, we go print out all of the files and their
789# hashes.
790#
791# These rules are fairly complex, so they depend on this makefile so if
792# it changes, they'll run again.
793#
794# TODO: We could clean this up so that we just record the locations of the
795# original notice files instead of making rules to copy them somwehere.
796# Then we could traverse that without quite as much bash drama.
797define combine-notice-files
798$(2) $(3): PRIVATE_MESSAGE := $(4)
799$(2) $(3): PRIVATE_DIR := $(5)
800$(2) : $(3)
801$(3) : $(6) $(BUILD_SYSTEM)/Makefile build/tools/generate-notice-files.py
802 build/tools/generate-notice-files.py --text-output $(2) \
803 $(if $(filter $(1),xml_excluded_vendor),-e vendor --xml-output, \
804 $(if $(filter $(1),xml_vendor),-i vendor --xml-output, \
805 --html-output)) $(3) \
806 -t $$(PRIVATE_MESSAGE) -s $$(PRIVATE_DIR)/src
807notice_files: $(2) $(3)
808endef
809
810# TODO These intermediate NOTICE.txt/NOTICE.html files should go into
811# TARGET_OUT_NOTICE_FILES now that the notice files are gathered from
812# the src subdirectory.
813
814target_notice_file_txt := $(TARGET_OUT_INTERMEDIATES)/NOTICE.txt
815target_notice_file_html_or_xml := $(TARGET_OUT_INTERMEDIATES)/NOTICE.html
816target_notice_file_html_or_xml_gz := $(TARGET_OUT_INTERMEDIATES)/NOTICE.html.gz
817installed_notice_html_or_xml_gz := $(TARGET_OUT)/etc/NOTICE.html.gz
818tools_notice_file_txt := $(HOST_OUT_INTERMEDIATES)/NOTICE.txt
819tools_notice_file_html := $(HOST_OUT_INTERMEDIATES)/NOTICE.html
820
821ifeq ($(PRODUCT_FULL_TREBLE),true)
822target_notice_file_html_or_xml := $(TARGET_OUT_INTERMEDIATES)/NOTICE.xml
823target_notice_file_html_or_xml_gz := $(TARGET_OUT_INTERMEDIATES)/NOTICE.xml.gz
824installed_notice_html_or_xml_gz := $(TARGET_OUT)/etc/NOTICE.xml.gz
825
826target_vendor_notice_file_txt := $(TARGET_OUT_INTERMEDIATES)/NOTICE_VENDOR.txt
827target_vendor_notice_file_xml := $(TARGET_OUT_INTERMEDIATES)/NOTICE_VENDOR.xml
828target_vendor_notice_file_xml_gz := $(TARGET_OUT_INTERMEDIATES)/NOTICE_VENDOR.xml.gz
829installed_vendor_notice_xml_gz := $(TARGET_OUT_VENDOR)/etc/NOTICE.xml.gz
830endif
831
832ifndef TARGET_BUILD_APPS
833kernel_notice_file := $(TARGET_OUT_NOTICE_FILES)/src/kernel.txt
834winpthreads_notice_file := $(TARGET_OUT_NOTICE_FILES)/src/winpthreads.txt
835pdk_fusion_notice_files := $(filter $(TARGET_OUT_NOTICE_FILES)/%, $(ALL_PDK_FUSION_FILES))
836
837ifdef target_vendor_notice_file_xml_gz
838$(eval $(call combine-notice-files, xml_excluded_vendor, \
839 $(target_notice_file_txt), \
840 $(target_notice_file_html_or_xml), \
841 "Notices for files contained in the filesystem images in this directory:", \
842 $(TARGET_OUT_NOTICE_FILES), \
843 $(ALL_DEFAULT_INSTALLED_MODULES) $(kernel_notice_file) $(pdk_fusion_notice_files)))
844$(eval $(call combine-notice-files, xml_vendor, \
845 $(target_vendor_notice_file_txt), \
846 $(target_vendor_notice_file_xml), \
847 "Notices for files contained in the vendor filesystem image in this directory:", \
848 $(TARGET_OUT_NOTICE_FILES), \
849 $(target_notice_file_html_or_xml)))
850else
851$(eval $(call combine-notice-files, html, \
852 $(target_notice_file_txt), \
853 $(target_notice_file_html_or_xml), \
854 "Notices for files contained in the filesystem images in this directory:", \
855 $(TARGET_OUT_NOTICE_FILES), \
856 $(ALL_DEFAULT_INSTALLED_MODULES) $(kernel_notice_file) $(pdk_fusion_notice_files)))
857endif
858
859$(eval $(call combine-notice-files, html, \
860 $(tools_notice_file_txt), \
861 $(tools_notice_file_html), \
862 "Notices for files contained in the tools directory:", \
863 $(HOST_OUT_NOTICE_FILES), \
864 $(ALL_DEFAULT_INSTALLED_MODULES) \
865 $(winpthreads_notice_file)))
866
867# Install the html file at /system/etc/NOTICE.html.gz.
868# This is not ideal, but this is very late in the game, after a lot of
869# the module processing has already been done -- in fact, we used the
870# fact that all that has been done to get the list of modules that we
871# need notice files for.
872$(target_notice_file_html_or_xml_gz): $(target_notice_file_html_or_xml) | $(MINIGZIP)
873 $(hide) $(MINIGZIP) -9 < $< > $@
874$(installed_notice_html_or_xml_gz): $(target_notice_file_html_or_xml_gz)
875 $(copy-file-to-target)
876
877ifdef target_vendor_notice_file_xml_gz
878# Install the vendor html file at /vendor/etc/NOTICE.xml.gz.
879$(target_vendor_notice_file_xml_gz): $(target_vendor_notice_file_xml) | $(MINIGZIP)
880 $(hide) $(MINIGZIP) -9 < $< > $@
881$(installed_vendor_notice_xml_gz): $(target_vendor_notice_file_xml_gz)
882 $(copy-file-to-target)
883endif
884
885# if we've been run my mm, mmm, etc, don't reinstall this every time
886ifeq ($(ONE_SHOT_MAKEFILE),)
887 ALL_DEFAULT_INSTALLED_MODULES += $(installed_notice_html_or_xml_gz)
888 ifdef target_vendor_notice_file_xml_gz
889 ALL_DEFAULT_INSTALLED_MODULES += $(installed_vendor_notice_xml_gz)
890 endif
891endif
892endif # TARGET_BUILD_APPS
893
894# The kernel isn't really a module, so to get its module file in there, we
895# make the target NOTICE files depend on this particular file too, which will
896# then be in the right directory for the find in combine-notice-files to work.
897$(kernel_notice_file): \
898 $(BUILD_SYSTEM)/LINUX_KERNEL_COPYING \
899 | $(ACP)
900 @echo Copying: $@
901 $(hide) mkdir -p $(dir $@)
902 $(hide) $(ACP) $< $@
903
904$(winpthreads_notice_file): \
905 $(BUILD_SYSTEM)/WINPTHREADS_COPYING \
906 | $(ACP)
907 @echo Copying: $@
908 $(hide) mkdir -p $(dir $@)
909 $(hide) $(ACP) $< $@
910
911# -----------------------------------------------------------------
912# Build a keystore with the authorized keys in it, used to verify the
913# authenticity of downloaded OTA packages.
914#
915# This rule adds to ALL_DEFAULT_INSTALLED_MODULES, so it needs to come
916# before the rules that use that variable to build the image.
917ALL_DEFAULT_INSTALLED_MODULES += $(TARGET_OUT_ETC)/security/otacerts.zip
918$(TARGET_OUT_ETC)/security/otacerts.zip: KEY_CERT_PAIR := $(DEFAULT_KEY_CERT_PAIR)
919$(TARGET_OUT_ETC)/security/otacerts.zip: $(addsuffix .x509.pem,$(DEFAULT_KEY_CERT_PAIR)) | $(ZIPTIME)
920 $(hide) rm -f $@
921 $(hide) mkdir -p $(dir $@)
922 $(hide) zip -qjX $@ $<
923 $(remove-timestamps-from-package)
924
925# Carry the public key for update_engine if it's a non-IoT target that
926# uses the AB updater. We use the same key as otacerts but in RSA public key
927# format.
928ifeq ($(AB_OTA_UPDATER),true)
929ifneq ($(PRODUCT_IOT),true)
930ALL_DEFAULT_INSTALLED_MODULES += $(TARGET_OUT_ETC)/update_engine/update-payload-key.pub.pem
931$(TARGET_OUT_ETC)/update_engine/update-payload-key.pub.pem: $(addsuffix .x509.pem,$(DEFAULT_KEY_CERT_PAIR))
932 $(hide) rm -f $@
933 $(hide) mkdir -p $(dir $@)
934 $(hide) openssl x509 -pubkey -noout -in $< > $@
935
936ALL_DEFAULT_INSTALLED_MODULES += $(TARGET_RECOVERY_ROOT_OUT)/etc/update_engine/update-payload-key.pub.pem
937$(TARGET_RECOVERY_ROOT_OUT)/etc/update_engine/update-payload-key.pub.pem: $(TARGET_OUT_ETC)/update_engine/update-payload-key.pub.pem
938 $(hide) cp -f $< $@
939endif
940endif
941
942.PHONY: otacerts
943otacerts: $(TARGET_OUT_ETC)/security/otacerts.zip
944
945
946# #################################################################
947# Targets for user images
948# #################################################################
949
950INTERNAL_USERIMAGES_EXT_VARIANT :=
951ifeq ($(TARGET_USERIMAGES_USE_EXT2),true)
952INTERNAL_USERIMAGES_USE_EXT := true
953INTERNAL_USERIMAGES_EXT_VARIANT := ext2
954else
955ifeq ($(TARGET_USERIMAGES_USE_EXT3),true)
956INTERNAL_USERIMAGES_USE_EXT := true
957INTERNAL_USERIMAGES_EXT_VARIANT := ext3
958else
959ifeq ($(TARGET_USERIMAGES_USE_EXT4),true)
960INTERNAL_USERIMAGES_USE_EXT := true
961INTERNAL_USERIMAGES_EXT_VARIANT := ext4
962endif
963endif
964endif
965
966# These options tell the recovery updater/installer how to mount the partitions writebale.
967# <fstype>=<fstype_opts>[|<fstype_opts>]...
968# fstype_opts := <opt>[,<opt>]...
969# opt := <name>[=<value>]
970# The following worked on Nexus devices with Kernel 3.1, 3.4, 3.10
971DEFAULT_TARGET_RECOVERY_FSTYPE_MOUNT_OPTIONS := ext4=max_batch_time=0,commit=1,data=ordered,barrier=1,errors=panic,nodelalloc
972
973ifneq (true,$(TARGET_USERIMAGES_SPARSE_EXT_DISABLED))
974 INTERNAL_USERIMAGES_SPARSE_EXT_FLAG := -s
975endif
976
977ifeq ($(INTERNAL_USERIMAGES_USE_EXT),true)
978INTERNAL_USERIMAGES_DEPS := $(SIMG2IMG)
979INTERNAL_USERIMAGES_DEPS += $(MKEXTUSERIMG) $(MAKE_EXT4FS) $(E2FSCK)
980ifeq ($(TARGET_USERIMAGES_USE_F2FS),true)
981INTERNAL_USERIMAGES_DEPS += $(MKF2FSUSERIMG) $(MAKE_F2FS)
982endif
983endif
984
985ifeq ($(BOARD_AVB_ENABLE),true)
986INTERNAL_USERIMAGES_DEPS += $(AVBTOOL)
987endif
988
989ifneq (true,$(TARGET_USERIMAGES_SPARSE_SQUASHFS_DISABLED))
990 INTERNAL_USERIMAGES_SPARSE_SQUASHFS_FLAG := -s
991endif
992ifneq ($(filter $(BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE) $(BOARD_SYSTEMIMAGE_FILE_SYSTEM_TYPE),squashfs),)
993INTERNAL_USERIMAGES_DEPS += $(MAKE_SQUASHFS) $(MKSQUASHFSUSERIMG) $(IMG2SIMG)
994endif
995
996INTERNAL_USERIMAGES_BINARY_PATHS := $(sort $(dir $(INTERNAL_USERIMAGES_DEPS)))
997
998ifeq (true,$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VERITY))
999INTERNAL_USERIMAGES_DEPS += $(BUILD_VERITY_TREE) $(APPEND2SIMG) $(VERITY_SIGNER)
1000ifeq (true,$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VERITY_FEC))
1001INTERNAL_USERIMAGES_DEPS += $(FEC)
1002endif
1003endif
1004
1005SELINUX_FC := $(call intermediates-dir-for,ETC,file_contexts.bin)/file_contexts.bin
1006INTERNAL_USERIMAGES_DEPS += $(SELINUX_FC)
1007
1008INTERNAL_USERIMAGES_DEPS += $(BLK_ALLOC_TO_BASE_FS)
1009
1010ifeq ($(INTERNAL_USERIMAGES_USE_EXT),true)
1011INTERNAL_USERIMAGES_DEPS += $(MKE2FS_CONF)
1012endif
1013
1014# $(1): the path of the output dictionary file
1015# $(2): additional "key=value" pairs to append to the dictionary file.
1016define generate-userimage-prop-dictionary
1017$(hide) echo "ext_mkuserimg=$(notdir $(MKEXTUSERIMG))" >> $(1)
1018$(if $(INTERNAL_USERIMAGES_EXT_VARIANT),$(hide) echo "fs_type=$(INTERNAL_USERIMAGES_EXT_VARIANT)" >> $(1))
1019$(if $(BOARD_SYSTEMIMAGE_PARTITION_SIZE),$(hide) echo "system_size=$(BOARD_SYSTEMIMAGE_PARTITION_SIZE)" >> $(1))
1020$(if $(BOARD_SYSTEMIMAGE_FILE_SYSTEM_TYPE),$(hide) echo "system_fs_type=$(BOARD_SYSTEMIMAGE_FILE_SYSTEM_TYPE)" >> $(1))
1021$(if $(BOARD_SYSTEMIMAGE_EXTFS_INODE_COUNT),$(hide) echo "system_extfs_inode_count=$(BOARD_SYSTEMIMAGE_EXTFS_INODE_COUNT)" >> $(1))
1022$(if $(BOARD_SYSTEMIMAGE_JOURNAL_SIZE),$(hide) echo "system_journal_size=$(BOARD_SYSTEMIMAGE_JOURNAL_SIZE)" >> $(1))
1023$(if $(BOARD_HAS_EXT4_RESERVED_BLOCKS),$(hide) echo "has_ext4_reserved_blocks=$(BOARD_HAS_EXT4_RESERVED_BLOCKS)" >> $(1))
1024$(if $(BOARD_SYSTEMIMAGE_SQUASHFS_COMPRESSOR),$(hide) echo "system_squashfs_compressor=$(BOARD_SYSTEMIMAGE_SQUASHFS_COMPRESSOR)" >> $(1))
1025$(if $(BOARD_SYSTEMIMAGE_SQUASHFS_COMPRESSOR_OPT),$(hide) echo "system_squashfs_compressor_opt=$(BOARD_SYSTEMIMAGE_SQUASHFS_COMPRESSOR_OPT)" >> $(1))
1026$(if $(BOARD_SYSTEMIMAGE_SQUASHFS_BLOCK_SIZE),$(hide) echo "system_squashfs_block_size=$(BOARD_SYSTEMIMAGE_SQUASHFS_BLOCK_SIZE)" >> $(1))
1027$(if $(BOARD_SYSTEMIMAGE_SQUASHFS_DISABLE_4K_ALIGN),$(hide) echo "system_squashfs_disable_4k_align=$(BOARD_SYSTEMIMAGE_SQUASHFS_DISABLE_4K_ALIGN)" >> $(1))
1028$(if $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SYSTEM_BASE_FS_PATH),$(hide) echo "system_base_fs_file=$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SYSTEM_BASE_FS_PATH)" >> $(1))
1029$(if $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SYSTEM_HEADROOM),$(hide) echo "system_headroom=$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SYSTEM_HEADROOM)" >> $(1))
1030$(if $(BOARD_USERDATAIMAGE_FILE_SYSTEM_TYPE),$(hide) echo "userdata_fs_type=$(BOARD_USERDATAIMAGE_FILE_SYSTEM_TYPE)" >> $(1))
1031$(if $(BOARD_USERDATAIMAGE_PARTITION_SIZE),$(hide) echo "userdata_size=$(BOARD_USERDATAIMAGE_PARTITION_SIZE)" >> $(1))
1032$(if $(BOARD_FLASH_LOGICAL_BLOCK_SIZE), $(hide) echo "flash_logical_block_size=$(BOARD_FLASH_LOGICAL_BLOCK_SIZE)" >> $(1))
1033$(if $(BOARD_FLASH_ERASE_BLOCK_SIZE), $(hide) echo "flash_erase_block_size=$(BOARD_FLASH_ERASE_BLOCK_SIZE)" >> $(1))
1034$(if $(BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE),$(hide) echo "cache_fs_type=$(BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE)" >> $(1))
1035$(if $(BOARD_CACHEIMAGE_PARTITION_SIZE),$(hide) echo "cache_size=$(BOARD_CACHEIMAGE_PARTITION_SIZE)" >> $(1))
1036$(if $(BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE),$(hide) echo "vendor_fs_type=$(BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE)" >> $(1))
1037$(if $(BOARD_VENDORIMAGE_EXTFS_INODE_COUNT),$(hide) echo "vendor_extfs_inode_count=$(BOARD_VENDORIMAGE_EXTFS_INODE_COUNT)" >> $(1))
1038$(if $(BOARD_VENDORIMAGE_PARTITION_SIZE),$(hide) echo "vendor_size=$(BOARD_VENDORIMAGE_PARTITION_SIZE)" >> $(1))
1039$(if $(BOARD_VENDORIMAGE_JOURNAL_SIZE),$(hide) echo "vendor_journal_size=$(BOARD_VENDORIMAGE_JOURNAL_SIZE)" >> $(1))
1040$(if $(BOARD_VENDORIMAGE_SQUASHFS_COMPRESSOR),$(hide) echo "vendor_squashfs_compressor=$(BOARD_VENDORIMAGE_SQUASHFS_COMPRESSOR)" >> $(1))
1041$(if $(BOARD_VENDORIMAGE_SQUASHFS_COMPRESSOR_OPT),$(hide) echo "vendor_squashfs_compressor_opt=$(BOARD_VENDORIMAGE_SQUASHFS_COMPRESSOR_OPT)" >> $(1))
1042$(if $(BOARD_VENDORIMAGE_SQUASHFS_BLOCK_SIZE),$(hide) echo "vendor_squashfs_block_size=$(BOARD_VENDORIMAGE_SQUASHFS_BLOCK_SIZE)" >> $(1))
1043$(if $(BOARD_VENDORIMAGE_SQUASHFS_DISABLE_4K_ALIGN),$(hide) echo "vendor_squashfs_disable_4k_align=$(BOARD_VENDORIMAGE_SQUASHFS_DISABLE_4K_ALIGN)" >> $(1))
1044$(if $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VENDOR_BASE_FS_PATH),$(hide) echo "vendor_base_fs_file=$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VENDOR_BASE_FS_PATH)" >> $(1))
1045$(if $(BOARD_OEMIMAGE_PARTITION_SIZE),$(hide) echo "oem_size=$(BOARD_OEMIMAGE_PARTITION_SIZE)" >> $(1))
1046$(if $(BOARD_OEMIMAGE_JOURNAL_SIZE),$(hide) echo "oem_journal_size=$(BOARD_OEMIMAGE_JOURNAL_SIZE)" >> $(1))
1047$(if $(BOARD_OEMIMAGE_EXTFS_INODE_COUNT),$(hide) echo "oem_extfs_inode_count=$(BOARD_OEMIMAGE_EXTFS_INODE_COUNT)" >> $(1))
1048$(if $(INTERNAL_USERIMAGES_SPARSE_EXT_FLAG),$(hide) echo "extfs_sparse_flag=$(INTERNAL_USERIMAGES_SPARSE_EXT_FLAG)" >> $(1))
1049$(if $(INTERNAL_USERIMAGES_SPARSE_SQUASHFS_FLAG),$(hide) echo "squashfs_sparse_flag=$(INTERNAL_USERIMAGES_SPARSE_SQUASHFS_FLAG)" >> $(1))
1050$(hide) echo "selinux_fc=$(SELINUX_FC)" >> $(1)
1051$(if $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_BOOT_SIGNER),$(hide) echo "boot_signer=$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_BOOT_SIGNER)" >> $(1))
1052$(if $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VERITY),$(hide) echo "verity=$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VERITY)" >> $(1))
1053$(if $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VERITY),$(hide) echo "verity_key=$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VERITY_SIGNING_KEY)" >> $(1))
1054$(if $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VERITY),$(hide) echo "verity_signer_cmd=$(notdir $(VERITY_SIGNER))" >> $(1))
1055$(if $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VERITY_FEC),$(hide) echo "verity_fec=$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VERITY_FEC)" >> $(1))
1056$(if $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SYSTEM_VERITY_PARTITION),$(hide) echo "system_verity_block_device=$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SYSTEM_VERITY_PARTITION)" >> $(1))
1057$(if $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VENDOR_VERITY_PARTITION),$(hide) echo "vendor_verity_block_device=$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VENDOR_VERITY_PARTITION)" >> $(1))
1058$(if $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VBOOT),$(hide) echo "vboot=$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VBOOT)" >> $(1))
1059$(if $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VBOOT),$(hide) echo "vboot_key=$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VBOOT_SIGNING_KEY)" >> $(1))
1060$(if $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VBOOT),$(hide) echo "vboot_subkey=$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VBOOT_SIGNING_SUBKEY)" >> $(1))
1061$(if $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VBOOT),$(hide) echo "futility=$(notdir $(FUTILITY))" >> $(1))
1062$(if $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VBOOT),$(hide) echo "vboot_signer_cmd=$(VBOOT_SIGNER)" >> $(1))
1063$(if $(BOARD_AVB_ENABLE),$(hide) echo "avb_avbtool=$(notdir $(AVBTOOL))" >> $(1))
1064$(if $(BOARD_AVB_ENABLE),$(hide) echo "avb_system_hashtree_enable=$(BOARD_AVB_ENABLE)" >> $(1))
1065$(if $(BOARD_AVB_ENABLE),$(hide) echo "avb_system_add_hashtree_footer_args=$(BOARD_AVB_SYSTEM_ADD_HASHTREE_FOOTER_ARGS)" >> $(1))
1066$(if $(BOARD_AVB_ENABLE),\
1067 $(if $(BOARD_AVB_SYSTEM_KEY_PATH),\
1068 $(hide) echo "avb_system_key_path=$(BOARD_AVB_SYSTEM_KEY_PATH)" >> $(1)
1069 $(hide) echo "avb_system_algorithm=$(BOARD_AVB_SYSTEM_ALGORITHM)" >> $(1)
1070 $(hide) echo "avb_system_rollback_index_location=$(BOARD_AVB_SYSTEM_ROLLBACK_INDEX_LOCATION)" >> $(1)))
1071$(if $(BOARD_AVB_ENABLE),$(hide) echo "avb_vendor_hashtree_enable=$(BOARD_AVB_ENABLE)" >> $(1))
1072$(if $(BOARD_AVB_ENABLE),$(hide) echo "avb_vendor_add_hashtree_footer_args=$(BOARD_AVB_VENDOR_ADD_HASHTREE_FOOTER_ARGS)" >> $(1))
1073$(if $(BOARD_AVB_ENABLE),\
1074 $(if $(BOARD_AVB_VENDOR_KEY_PATH),\
1075 $(hide) echo "avb_vendor_key_path=$(BOARD_AVB_VENDOR_KEY_PATH)" >> $(1)
1076 $(hide) echo "avb_vendor_algorithm=$(BOARD_AVB_VENDOR_ALGORITHM)" >> $(1)
1077 $(hide) echo "avb_vendor_rollback_index_location=$(BOARD_AVB_VENDOR_ROLLBACK_INDEX_LOCATION)" >> $(1)))
1078$(if $(filter true,$(BOARD_USES_RECOVERY_AS_BOOT)),\
1079 $(hide) echo "recovery_as_boot=true" >> $(1))
1080$(if $(filter true,$(BOARD_BUILD_SYSTEM_ROOT_IMAGE)),\
1081 $(hide) echo "system_root_image=true" >> $(1);\
1082 echo "ramdisk_dir=$(TARGET_ROOT_OUT)" >> $(1))
1083$(if $(2),$(hide) $(foreach kv,$(2),echo "$(kv)" >> $(1);))
1084endef
1085
1086# -----------------------------------------------------------------
1087# Recovery image
1088
1089# Recovery image exists if we are building recovery, or building recovery as boot.
1090ifneq (,$(INSTALLED_RECOVERYIMAGE_TARGET)$(filter true,$(BOARD_USES_RECOVERY_AS_BOOT)))
1091
1092INTERNAL_RECOVERYIMAGE_FILES := $(filter $(TARGET_RECOVERY_OUT)/%, \
1093 $(ALL_DEFAULT_INSTALLED_MODULES))
1094
1095recovery_initrc := $(call project-path-for,recovery)/etc/init.rc
1096recovery_sepolicy := \
1097 $(TARGET_RECOVERY_ROOT_OUT)/sepolicy \
1098 $(TARGET_RECOVERY_ROOT_OUT)/plat_file_contexts \
1099 $(TARGET_RECOVERY_ROOT_OUT)/nonplat_file_contexts \
1100 $(TARGET_RECOVERY_ROOT_OUT)/plat_property_contexts \
1101 $(TARGET_RECOVERY_ROOT_OUT)/nonplat_property_contexts
1102# Passed into rsync from non-recovery root to recovery root, to avoid overwriting recovery-specific
1103# SELinux files
1104IGNORE_RECOVERY_SEPOLICY := $(patsubst $(TARGET_RECOVERY_OUT)/%,--exclude=/%,$(recovery_sepolicy))
1105
1106recovery_kernel := $(INSTALLED_KERNEL_TARGET) # same as a non-recovery system
1107recovery_ramdisk := $(PRODUCT_OUT)/ramdisk-recovery.img
1108recovery_uncompressed_ramdisk := $(PRODUCT_OUT)/ramdisk-recovery.cpio
1109recovery_build_props := $(intermediate_system_build_prop)
1110ifdef property_overrides_split_enabled
1111recovery_build_props += $(INSTALLED_VENDOR_BUILD_PROP_TARGET)
1112endif
1113recovery_resources_common := $(call project-path-for,recovery)/res
1114
1115# Set recovery_density to the density bucket of the device.
1116recovery_density := unknown
1117ifneq (,$(TARGET_RECOVERY_DENSITY))
1118recovery_density := $(filter %dpi,$(TARGET_RECOVERY_DENSITY))
1119else
1120ifneq (,$(PRODUCT_AAPT_PREF_CONFIG))
1121# If PRODUCT_AAPT_PREF_CONFIG includes a dpi bucket, then use that value.
1122recovery_density := $(filter %dpi,$(PRODUCT_AAPT_PREF_CONFIG))
1123else
1124# Otherwise, use the default medium density.
1125recovery_densities := mdpi
1126endif
1127endif
1128
1129ifneq (,$(wildcard $(recovery_resources_common)-$(recovery_density)))
1130recovery_resources_common := $(recovery_resources_common)-$(recovery_density)
1131else
1132recovery_resources_common := $(recovery_resources_common)-xhdpi
1133endif
1134
1135# Select the 18x32 font on high-density devices (xhdpi and up); and
1136# the 12x22 font on other devices. Note that the font selected here
1137# can be overridden for a particular device by putting a font.png in
1138# its private recovery resources.
1139
1140ifneq (,$(filter xxxhdpi 560dpi xxhdpi 400dpi xhdpi,$(recovery_density)))
1141recovery_font := $(call project-path-for,recovery)/fonts/18x32.png
1142else
1143recovery_font := $(call project-path-for,recovery)/fonts/12x22.png
1144endif
1145
1146ifneq ($(TARGET_RECOVERY_DEVICE_DIRS),)
1147recovery_root_private := $(strip \
1148 $(foreach d,$(TARGET_RECOVERY_DEVICE_DIRS), $(wildcard $(d)/recovery/root)))
1149else
1150recovery_root_private := $(strip $(wildcard $(TARGET_DEVICE_DIR)/recovery/root))
1151endif
1152ifneq ($(recovery_root_private),)
1153recovery_root_deps := $(shell find $(recovery_root_private) -type f)
1154endif
1155
1156ifndef TARGET_PRIVATE_RES_DIRS
1157TARGET_PRIVATE_RES_DIRS := $(wildcard $(TARGET_DEVICE_DIR)/recovery/res)
1158endif
1159recovery_resource_deps := $(shell find $(recovery_resources_common) \
1160 $(TARGET_PRIVATE_RES_DIRS) -type f)
1161ifdef TARGET_RECOVERY_FSTAB
1162recovery_fstab := $(TARGET_RECOVERY_FSTAB)
1163else
1164recovery_fstab := $(strip $(wildcard $(TARGET_DEVICE_DIR)/recovery.fstab))
1165endif
1166ifdef TARGET_RECOVERY_WIPE
1167recovery_wipe := $(TARGET_RECOVERY_WIPE)
1168else
1169recovery_wipe :=
1170endif
1171
1172# Prior to A/B update, we used to have:
1173# boot.img + recovery-from-boot.p + recovery-resource.dat = recovery.img.
1174# recovery-resource.dat is needed only if we carry a patch of the boot and
1175# recovery images and invoke install-recovery.sh on the first boot post an
1176# OTA update.
1177#
1178# We no longer need that if one of the following conditions holds:
1179# a) We carry a full copy of the recovery image
1180# (BOARD_USES_FULL_RECOVERY_IMAGE = true);
1181# b) We build a single image that contains boot and recovery both
1182# (BOARD_USES_RECOVERY_AS_BOOT = true).
1183
1184ifeq (,$(filter true, $(BOARD_USES_FULL_RECOVERY_IMAGE) $(BOARD_USES_RECOVERY_AS_BOOT) $(TARGET_NOT_USE_GZIP_RECOVERY_RAMDISK)))
1185# Named '.dat' so we don't attempt to use imgdiff for patching it.
1186RECOVERY_RESOURCE_ZIP := $(TARGET_OUT)/etc/recovery-resource.dat
1187else
1188RECOVERY_RESOURCE_ZIP :=
1189endif
1190
1191ifeq ($(recovery_fstab),)
1192 $(info No recovery.fstab for TARGET_DEVICE $(TARGET_DEVICE))
1193endif
1194
1195INTERNAL_RECOVERYIMAGE_ARGS := \
1196 $(addprefix --second ,$(INSTALLED_2NDBOOTLOADER_TARGET)) \
1197 --kernel $(recovery_kernel) \
1198 --ramdisk $(recovery_ramdisk)
1199
1200# Assumes this has already been stripped
1201ifdef INTERNAL_KERNEL_CMDLINE
1202 INTERNAL_RECOVERYIMAGE_ARGS += --cmdline "$(INTERNAL_KERNEL_CMDLINE)"
1203endif
1204ifdef BOARD_KERNEL_BASE
1205 INTERNAL_RECOVERYIMAGE_ARGS += --base $(BOARD_KERNEL_BASE)
1206endif
1207ifdef BOARD_KERNEL_PAGESIZE
1208 INTERNAL_RECOVERYIMAGE_ARGS += --pagesize $(BOARD_KERNEL_PAGESIZE)
1209endif
1210ifeq ($(strip $(BOARD_KERNEL_SEPARATED_DT)),true)
1211 INTERNAL_RECOVERYIMAGE_ARGS += --dt $(INSTALLED_DTIMAGE_TARGET)
1212 RECOVERYIMAGE_EXTRA_DEPS := $(INSTALLED_DTIMAGE_TARGET)
1213endif
1214
1215# Keys authorized to sign OTA packages this build will accept. The
1216# build always uses dev-keys for this; release packaging tools will
1217# substitute other keys for this one.
1218OTA_PUBLIC_KEYS := $(DEFAULT_SYSTEM_DEV_CERTIFICATE).x509.pem
1219
1220# Generate a file containing the keys that will be read by the
1221# recovery binary.
1222RECOVERY_INSTALL_OTA_KEYS := \
1223 $(call intermediates-dir-for,PACKAGING,ota_keys)/keys
1224DUMPKEY_JAR := $(HOST_OUT_JAVA_LIBRARIES)/dumpkey.jar
1225$(RECOVERY_INSTALL_OTA_KEYS): PRIVATE_OTA_PUBLIC_KEYS := $(OTA_PUBLIC_KEYS)
1226$(RECOVERY_INSTALL_OTA_KEYS): extra_keys := $(patsubst %,%.x509.pem,$(PRODUCT_EXTRA_RECOVERY_KEYS))
1227$(RECOVERY_INSTALL_OTA_KEYS): $(OTA_PUBLIC_KEYS) $(DUMPKEY_JAR) $(extra_keys)
1228 @echo "DumpPublicKey: $@ <= $(PRIVATE_OTA_PUBLIC_KEYS) $(extra_keys)"
1229 @rm -rf $@
1230 @mkdir -p $(dir $@)
1231 $(JAVA) -jar $(DUMPKEY_JAR) $(PRIVATE_OTA_PUBLIC_KEYS) $(extra_keys) > $@
1232
1233RECOVERYIMAGE_ID_FILE := $(PRODUCT_OUT)/recovery.id
1234
1235# $(1): modules list
1236# $(2): output dir
1237# $(3): mount point
1238# $(4): staging dir
1239# Depmod requires a well-formed kernel version so 0.0 is used as a placeholder.
1240define build-image-kernel-modules
1241 $(hide) rm -rf $(2)/lib/modules
1242 $(hide) mkdir -p $(2)/lib/modules
1243 $(hide) cp $(1) $(2)/lib/modules/
1244 $(hide) rm -rf $(4)
1245 $(hide) mkdir -p $(4)/lib/modules/0.0/$(3)lib/modules
1246 $(hide) cp $(1) $(4)/lib/modules/0.0/$(3)lib/modules
1247 $(hide) $(DEPMOD) -b $(4) 0.0
1248 $(hide) sed -e 's/\(.*modules.*\):/\/\1:/g' -e 's/ \([^ ]*modules[^ ]*\)/ \/\1/g' $(4)/lib/modules/0.0/modules.dep > $(2)/lib/modules/modules.dep
1249 $(hide) cp $(4)/lib/modules/0.0/modules.alias $(2)/lib/modules
1250endef
1251
1252define build-recoveryramdisk
1253 $(hide) mkdir -p $(TARGET_RECOVERY_OUT)
1254 $(hide) mkdir -p $(TARGET_RECOVERY_ROOT_OUT)/etc $(TARGET_RECOVERY_ROOT_OUT)/sdcard $(TARGET_RECOVERY_ROOT_OUT)/tmp
1255 @echo Copying baseline ramdisk...
1256 # Use rsync because "cp -Rf" fails to overwrite broken symlinks on Mac.
1257 $(hide) rsync -a --exclude=etc --exclude=sdcard --exclude=vendor $(IGNORE_RECOVERY_SEPOLICY) $(IGNORE_CACHE_LINK) $(TARGET_ROOT_OUT) $(TARGET_RECOVERY_OUT)
1258 # Copy adbd from system/bin to recovery/root/sbin
1259 $(hide) cp -f $(TARGET_OUT_EXECUTABLES)/adbd $(TARGET_RECOVERY_ROOT_OUT)/sbin/adbd
1260 @echo Modifying ramdisk contents...
1261 $(if $(BOARD_RECOVERY_KERNEL_MODULES), \
1262 $(call build-image-kernel-modules,$(BOARD_RECOVERY_KERNEL_MODULES),$(TARGET_RECOVERY_ROOT_OUT),,$(call intermediates-dir-for,PACKAGING,depmod_recovery)))
1263 $(hide) rm -f $(TARGET_RECOVERY_ROOT_OUT)/init*.rc
1264 $(hide) cp -f $(recovery_initrc) $(TARGET_RECOVERY_ROOT_OUT)/
1265 $(hide) cp $(TARGET_ROOT_OUT)/init.recovery.*.rc $(TARGET_RECOVERY_ROOT_OUT)/ || true # Ignore error when the src file doesn't exist.
1266 $(hide) mkdir -p $(TARGET_RECOVERY_ROOT_OUT)/res
1267 $(hide) rm -rf $(TARGET_RECOVERY_ROOT_OUT)/res/*
1268 $(hide) cp -rf $(recovery_resources_common)/* $(TARGET_RECOVERY_ROOT_OUT)/res
1269 $(hide) cp -f $(recovery_font) $(TARGET_RECOVERY_ROOT_OUT)/res/images/font.png
1270 $(hide) $(foreach item,$(recovery_root_private), \
1271 cp -rf $(item) $(TARGET_RECOVERY_OUT)/;)
1272 $(hide) $(foreach item,$(TARGET_PRIVATE_RES_DIRS), \
1273 cp -rf $(item) $(TARGET_RECOVERY_ROOT_OUT)/$(newline);)
1274 $(hide) $(foreach item,$(recovery_fstab), \
1275 cp -f $(item) $(TARGET_RECOVERY_ROOT_OUT)/etc/recovery.fstab;)
1276 $(if $(strip $(recovery_wipe)), \
1277 $(hide) cp -f $(recovery_wipe) $(TARGET_RECOVERY_ROOT_OUT)/etc/recovery.wipe)
1278 $(hide) cp $(RECOVERY_INSTALL_OTA_KEYS) $(TARGET_RECOVERY_ROOT_OUT)/res/keys
1279 $(hide) cat $(INSTALLED_DEFAULT_PROP_TARGET) \
1280 > $(TARGET_RECOVERY_ROOT_OUT)/prop.default
1281 $(if $(INSTALLED_VENDOR_DEFAULT_PROP_TARGET), \
1282 $(hide) cat $(INSTALLED_VENDOR_DEFAULT_PROP_TARGET) \
1283 >> $(TARGET_RECOVERY_ROOT_OUT)/prop.default)
1284 $(hide) cat $(recovery_build_props) \
1285 >> $(TARGET_RECOVERY_ROOT_OUT)/prop.default
1286 # Never allow persist.sys.usb.config to be set to none in recovery
1287 $(hide) sed -i 's/persist.sys.usb.config=none/persist.sys.usb.config=adb/g' $(TARGET_RECOVERY_ROOT_OUT)/prop.default
1288 $(hide) ln -sf prop.default $(TARGET_RECOVERY_ROOT_OUT)/default.prop
1289 $(BOARD_RECOVERY_IMAGE_PREPARE)
1290 $(if $(filter true,$(BOARD_BUILD_SYSTEM_ROOT_IMAGE)), \
1291 $(hide) mkdir -p $(TARGET_RECOVERY_ROOT_OUT)/system_root; \
1292 rm -rf $(TARGET_RECOVERY_ROOT_OUT)/system; \
1293 ln -sf /system_root/system $(TARGET_RECOVERY_ROOT_OUT)/system) # Mount the system_root_image to /system_root and symlink /system.
1294endef
1295
1296RECOVERYIMAGE_ID_FILE := $(PRODUCT_OUT)/recovery.id
1297# $(1): output file
1298define build-recoveryimage-target
1299 $(if $(filter true,$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VBOOT)), \
1300 $(hide) $(MKBOOTIMG) $(INTERNAL_RECOVERYIMAGE_ARGS) $(INTERNAL_MKBOOTIMG_VERSION_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $(1).unsigned, \
1301 $(hide) $(MKBOOTIMG) $(INTERNAL_RECOVERYIMAGE_ARGS) $(INTERNAL_MKBOOTIMG_VERSION_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $(1) --id > $(RECOVERYIMAGE_ID_FILE))
1302 $(if $(filter true,$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_BOOT_SIGNER)),\
1303 $(if $(filter true,$(BOARD_USES_RECOVERY_AS_BOOT)),\
1304 $(BOOT_SIGNER) /boot $(1) $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VERITY_SIGNING_KEY).pk8 $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VERITY_SIGNING_KEY).x509.pem $(1),\
1305 $(BOOT_SIGNER) /recovery $(1) $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VERITY_SIGNING_KEY).pk8 $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VERITY_SIGNING_KEY).x509.pem $(1)\
1306 )\
1307 )
1308 $(if $(filter true,$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VBOOT)), \
1309 $(VBOOT_SIGNER) $(FUTILITY) $(1).unsigned $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VBOOT_SIGNING_KEY).vbpubk $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VBOOT_SIGNING_KEY).vbprivk $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VBOOT_SIGNING_SUBKEY).vbprivk $(1).keyblock $(1))
1310 $(if $(and $(filter true,$(BOARD_USES_RECOVERY_AS_BOOT)),$(filter true,$(BOARD_AVB_ENABLE))), \
1311 $(hide) $(AVBTOOL) add_hash_footer \
1312 --image $(1) \
1313 --partition_size $(BOARD_BOOTIMAGE_PARTITION_SIZE) \
1314 --partition_name boot $(INTERNAL_AVB_BOOT_SIGNING_ARGS) \
1315 $(BOARD_AVB_BOOT_ADD_HASH_FOOTER_ARGS))
1316 $(if $(filter true,$(BOARD_USES_RECOVERY_AS_BOOT)), \
1317 $(hide) $(call assert-max-image-size,$(1),$(BOARD_BOOTIMAGE_PARTITION_SIZE)), \
1318 $(hide) $(call assert-max-image-size,$(1),$(BOARD_RECOVERYIMAGE_PARTITION_SIZE)))
1319 @echo ----- Made recovery image: $(1) --------
1320endef
1321
1322ADBD := $(TARGET_OUT_EXECUTABLES)/adbd
1323
1324ifeq ($(BOARD_USES_RECOVERY_AS_BOOT),true)
1325ifeq (true,$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_BOOT_SIGNER))
1326$(INSTALLED_BOOTIMAGE_TARGET) : $(BOOT_SIGNER)
1327endif
1328ifeq (true,$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VBOOT))
1329$(INSTALLED_BOOTIMAGE_TARGET) : $(VBOOT_SIGNER)
1330endif
1331ifeq (true,$(BOARD_AVB_ENABLE))
1332$(INSTALLED_BOOTIMAGE_TARGET) : $(AVBTOOL) $(BOARD_AVB_BOOT_KEY_PATH)
1333endif
1334$(INSTALLED_BOOTIMAGE_TARGET): $(MKBOOTFS) $(MKBOOTIMG) $(MINIGZIP) $(ADBD) \
1335 $(INSTALLED_RAMDISK_TARGET) \
1336 $(INTERNAL_RECOVERYIMAGE_FILES) \
1337 $(recovery_initrc) $(recovery_sepolicy) $(recovery_kernel) \
1338 $(INSTALLED_2NDBOOTLOADER_TARGET) \
1339 $(recovery_build_props) $(recovery_resource_deps) \
1340 $(recovery_fstab) \
1341 $(RECOVERY_INSTALL_OTA_KEYS) \
1342 $(INSTALLED_VENDOR_DEFAULT_PROP_TARGET) \
1343 $(BOARD_RECOVERY_KERNEL_MODULES) \
1344 $(DEPMOD)
1345 $(call pretty,"Target boot image from recovery: $@")
1346 $(call build-recoveryramdisk)
1347 $(hide) $(MKBOOTFS) -d $(TARGET_OUT) $(TARGET_RECOVERY_ROOT_OUT) | $(RECOVERY_RAMDISK_COMPRESSOR) > $(recovery_ramdisk)
1348 $(call build-recoveryimage-target, $@)
1349endif
1350
1351$(recovery_uncompressed_ramdisk): $(MKBOOTFS) $(ADBD) \
1352 $(INSTALLED_RAMDISK_TARGET) \
1353 $(INSTALLED_BOOTIMAGE_TARGET) \
1354 $(INTERNAL_RECOVERYIMAGE_FILES) \
1355 $(recovery_initrc) $(recovery_sepolicy) \
1356 $(INSTALLED_2NDBOOTLOADER_TARGET) \
1357 $(recovery_build_props) $(recovery_resource_deps) $(recovery_root_deps) \
1358 $(recovery_fstab) \
1359 $(RECOVERY_INSTALL_OTA_KEYS) \
1360 $(INSTALLED_VENDOR_DEFAULT_PROP_TARGET) \
1361 $(BOARD_RECOVERY_KERNEL_MODULES) \
1362 $(DEPMOD)
1363 $(call build-recoveryramdisk)
1364 @echo ----- Making uncompressed recovery ramdisk ------
1365 $(hide) $(MKBOOTFS) $(TARGET_RECOVERY_ROOT_OUT) > $@
1366
1367$(recovery_ramdisk): $(MINIGZIP) \
1368 $(recovery_uncompressed_ramdisk)
1369 @echo ----- Making compressed recovery ramdisk ------
1370 $(hide) $(RECOVERY_RAMDISK_COMPRESSOR) < $(recovery_uncompressed_ramdisk) > $@
1371
1372ifndef BOARD_CUSTOM_BOOTIMG_MK
1373$(INSTALLED_RECOVERYIMAGE_TARGET): $(MKBOOTIMG) $(recovery_ramdisk) $(recovery_kernel) \
1374 $(RECOVERYIMAGE_EXTRA_DEPS)
1375 @echo ----- Making recovery image ------
1376 $(call build-recoveryimage-target, $@)
1377endif # BOARD_CUSTOM_BOOTIMG_MK
1378
1379ifdef RECOVERY_RESOURCE_ZIP
1380$(RECOVERY_RESOURCE_ZIP): $(INSTALLED_RECOVERYIMAGE_TARGET) | $(ZIPTIME)
1381 $(hide) mkdir -p $(dir $@)
1382 $(hide) find $(TARGET_RECOVERY_ROOT_OUT)/res -type f | sort | zip -0qrjX $@ -@
1383 $(remove-timestamps-from-package)
1384endif
1385
1386.PHONY: recoveryimage-nodeps
1387recoveryimage-nodeps:
1388 @echo "make $@: ignoring dependencies"
1389 $(call build-recoveryramdisk)
1390 $(hide) $(MKBOOTFS) -d $(TARGET_OUT) $(TARGET_RECOVERY_ROOT_OUT) | $(RECOVERY_RAMDISK_COMPRESSOR) > $(recovery_ramdisk)
1391 $(call build-recoveryimage-target, $(INSTALLED_RECOVERYIMAGE_TARGET))
1392
1393else # INSTALLED_RECOVERYIMAGE_TARGET not defined
1394RECOVERY_RESOURCE_ZIP :=
1395endif
1396
1397.PHONY: recoveryimage
1398recoveryimage: $(INSTALLED_RECOVERYIMAGE_TARGET) $(RECOVERY_RESOURCE_ZIP)
1399
1400ifeq ($(BOARD_NAND_PAGE_SIZE),)
1401BOARD_NAND_PAGE_SIZE := 2048
1402endif
1403
1404ifeq ($(BOARD_NAND_SPARE_SIZE),)
1405BOARD_NAND_SPARE_SIZE := 64
1406endif
1407
1408ifdef BOARD_CUSTOM_BOOTIMG_MK
1409include $(BOARD_CUSTOM_BOOTIMG_MK)
1410endif
1411
1412
1413# -----------------------------------------------------------------
1414# system image
1415#
1416# Remove overridden packages from $(ALL_PDK_FUSION_FILES)
1417PDK_FUSION_SYSIMG_FILES := \
1418 $(filter-out $(foreach p,$(overridden_packages),$(p) %/$(p).apk), \
1419 $(ALL_PDK_FUSION_FILES))
1420
1421INTERNAL_SYSTEMIMAGE_FILES := $(filter $(TARGET_OUT)/%, \
1422 $(ALL_GENERATED_SOURCES) \
1423 $(ALL_DEFAULT_INSTALLED_MODULES) \
1424 $(PDK_FUSION_SYSIMG_FILES) \
1425 $(RECOVERY_RESOURCE_ZIP))
1426
1427FULL_SYSTEMIMAGE_DEPS := $(INTERNAL_SYSTEMIMAGE_FILES) $(INTERNAL_USERIMAGES_DEPS)
1428
1429ifeq ($(BOARD_BUILD_SYSTEM_ROOT_IMAGE),true)
1430 FULL_SYSTEMIMAGE_DEPS += $(INSTALLED_KERNEL_TARGET)
1431endif
1432
1433# ASAN libraries in the system image - add dependency.
1434ASAN_IN_SYSTEM_INSTALLED := $(TARGET_OUT)/asan.tar.bz2
1435ifneq (,$(SANITIZE_TARGET))
1436 ifeq (true,$(SANITIZE_TARGET_SYSTEM))
1437 FULL_SYSTEMIMAGE_DEPS += $(ASAN_IN_SYSTEM_INSTALLED)
1438 endif
1439endif
1440
1441# -----------------------------------------------------------------
1442# installed file list
1443# Depending on anything that $(BUILT_SYSTEMIMAGE) depends on.
1444# We put installed-files.txt ahead of image itself in the dependency graph
1445# so that we can get the size stat even if the build fails due to too large
1446# system image.
1447INSTALLED_FILES_FILE := $(PRODUCT_OUT)/installed-files.txt
1448$(INSTALLED_FILES_FILE): $(FULL_SYSTEMIMAGE_DEPS) $(FILESLIST)
1449 @echo Installed file list: $@
1450 @mkdir -p $(dir $@)
1451 @rm -f $@
1452 $(hide) $(FILESLIST) $(TARGET_OUT) > $(@:.txt=.json)
1453 $(hide) build/tools/fileslist_util.py -c $(@:.txt=.json) > $@
1454
1455.PHONY: installed-file-list
1456installed-file-list: $(INSTALLED_FILES_FILE)
1457
1458$(call dist-for-goals, sdk win_sdk sdk_addon, $(INSTALLED_FILES_FILE))
1459
1460systemimage_intermediates := \
1461 $(call intermediates-dir-for,PACKAGING,systemimage)
1462BUILT_SYSTEMIMAGE := $(systemimage_intermediates)/system.img
1463
1464# Create symlink /system/vendor to /vendor if necessary.
1465ifdef BOARD_USES_VENDORIMAGE
1466define create-system-vendor-symlink
1467$(hide) if [ -d $(TARGET_OUT)/vendor ] && [ ! -h $(TARGET_OUT)/vendor ]; then \
1468 echo 'Non-symlink $(TARGET_OUT)/vendor detected!' 1>&2; \
1469 echo 'You cannot install files to $(TARGET_OUT)/vendor while building a separate vendor.img!' 1>&2; \
1470 exit 1; \
1471fi
1472$(hide) ln -sf /vendor $(TARGET_OUT)/vendor
1473endef
1474else
1475define create-system-vendor-symlink
1476endef
1477endif
1478
1479# Only Create symlink /system/vendor to /vendor if necessary.
1480ifdef BOARD_NEEDS_VENDORIMAGE_SYMLINK
1481define create-system-vendor-symlink
1482$(hide) if [ -d $(TARGET_OUT)/vendor ] && [ ! -h $(TARGET_OUT)/vendor ]; then \
1483 echo 'Non-symlink $(TARGET_OUT)/vendor detected!' 1>&2; \
1484 echo 'You cannot install files to $(TARGET_OUT)/vendor while building a separate vendor.img!' 1>&2; \
1485 exit 1; \
1486fi
1487$(hide) ln -sf /vendor $(TARGET_OUT)/vendor
1488endef
1489endif
1490
1491# $(1): output file
1492define build-systemimage-target
1493 @echo "Target system fs image: $(1)"
1494 $(call create-system-vendor-symlink)
1495 @mkdir -p $(dir $(1)) $(systemimage_intermediates) && rm -rf $(systemimage_intermediates)/system_image_info.txt
1496 $(call generate-userimage-prop-dictionary, $(systemimage_intermediates)/system_image_info.txt, \
1497 skip_fsck=true)
1498 $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH \
1499 ./build/tools/releasetools/build_image.py \
1500 $(TARGET_OUT) $(systemimage_intermediates)/system_image_info.txt $(1) $(TARGET_OUT) \
1501 || ( echo "Out of space? the tree size of $(TARGET_OUT) is (MB): " 1>&2 ;\
1502 du -sm $(TARGET_OUT) 1>&2;\
1503 if [ "$(INTERNAL_USERIMAGES_EXT_VARIANT)" == "ext4" ]; then \
1504 maxsize=$(BOARD_SYSTEMIMAGE_PARTITION_SIZE); \
1505 if [ "$(BOARD_HAS_EXT4_RESERVED_BLOCKS)" == "true" ]; then \
1506 maxsize=$$((maxsize - 4096 * 4096)); \
1507 fi; \
1508 echo "The max is $$(( maxsize / 1048576 )) MB." 1>&2 ;\
1509 else \
1510 echo "The max is $$(( $(BOARD_SYSTEMIMAGE_PARTITION_SIZE) / 1048576 )) MB." 1>&2 ;\
1511 fi; \
1512 mkdir -p $(DIST_DIR); cp $(INSTALLED_FILES_FILE) $(DIST_DIR)/installed-files-rescued.txt; \
1513 exit 1 )
1514endef
1515
1516$(BUILT_SYSTEMIMAGE): $(FULL_SYSTEMIMAGE_DEPS) $(INSTALLED_FILES_FILE) $(BUILD_IMAGE_SRCS)
1517 $(call build-systemimage-target,$@)
1518
1519ifndef I_WANT_A_QUAIL_STAR
1520ifneq ($(WITHOUT_CHECK_API),true)
1521$(BUILT_SYSTEMIMAGE): checkapi
1522endif
1523endif
1524
1525INSTALLED_SYSTEMIMAGE := $(PRODUCT_OUT)/system.img
1526SYSTEMIMAGE_SOURCE_DIR := $(TARGET_OUT)
1527
1528# The system partition needs room for the recovery image as well. We
1529# now store the recovery image as a binary patch using the boot image
1530# as the source (since they are very similar). Generate the patch so
1531# we can see how big it's going to be, and include that in the system
1532# image size check calculation.
1533ifneq ($(INSTALLED_RECOVERYIMAGE_TARGET),)
1534ifneq ($(BOARD_USES_FULL_RECOVERY_IMAGE),true)
1535intermediates := $(call intermediates-dir-for,PACKAGING,recovery_patch)
1536RECOVERY_FROM_BOOT_PATCH := $(intermediates)/recovery_from_boot.p
1537$(RECOVERY_FROM_BOOT_PATCH): $(INSTALLED_RECOVERYIMAGE_TARGET) \
1538 $(INSTALLED_BOOTIMAGE_TARGET) \
1539 $(HOST_OUT_EXECUTABLES)/imgdiff \
1540 $(HOST_OUT_EXECUTABLES)/bsdiff
1541 @echo "Construct recovery from boot"
1542 mkdir -p $(dir $@)
1543ifeq ($(TARGET_NOT_USE_GZIP_RECOVERY_RAMDISK),true)
1544 PATH=$(HOST_OUT_EXECUTABLES):$$PATH $(HOST_OUT_EXECUTABLES)/bsdiff $(INSTALLED_BOOTIMAGE_TARGET) $(INSTALLED_RECOVERYIMAGE_TARGET) $@
1545else
1546 PATH=$(HOST_OUT_EXECUTABLES):$$PATH $(HOST_OUT_EXECUTABLES)/imgdiff $(INSTALLED_BOOTIMAGE_TARGET) $(INSTALLED_RECOVERYIMAGE_TARGET) $@
1547endif
1548else # $(BOARD_USES_FULL_RECOVERY_IMAGE) == true
1549RECOVERY_FROM_BOOT_PATCH := $(INSTALLED_RECOVERYIMAGE_TARGET)
1550endif
1551endif
1552
1553
1554$(INSTALLED_SYSTEMIMAGE): $(BUILT_SYSTEMIMAGE) $(RECOVERY_FROM_BOOT_PATCH)
1555 @echo "Install system fs image: $@"
1556 $(copy-file-to-target)
1557 $(hide) $(call assert-max-image-size,$@ $(RECOVERY_FROM_BOOT_PATCH),$(BOARD_SYSTEMIMAGE_PARTITION_SIZE))
1558
1559systemimage: $(INSTALLED_SYSTEMIMAGE)
1560
1561.PHONY: systemimage-nodeps snod
1562systemimage-nodeps snod: $(filter-out systemimage-nodeps snod,$(MAKECMDGOALS)) \
1563 | $(INTERNAL_USERIMAGES_DEPS)
1564 @echo "make $@: ignoring dependencies"
1565 $(call build-systemimage-target,$(INSTALLED_SYSTEMIMAGE))
1566 $(hide) $(call assert-max-image-size,$(INSTALLED_SYSTEMIMAGE),$(BOARD_SYSTEMIMAGE_PARTITION_SIZE))
1567
1568ifneq (,$(filter systemimage-nodeps snod, $(MAKECMDGOALS)))
1569ifeq (true,$(WITH_DEXPREOPT))
1570$(warning Warning: with dexpreopt enabled, you may need a full rebuild.)
1571endif
1572endif
1573
1574.PHONY: sync
1575sync: $(INTERNAL_SYSTEMIMAGE_FILES)
1576
1577#######
1578## system tarball
1579define build-systemtarball-target
1580 $(call pretty,"Target system fs tarball: $(INSTALLED_SYSTEMTARBALL_TARGET)")
1581 $(call create-system-vendor-symlink)
1582 $(MKTARBALL) $(FS_GET_STATS) \
1583 $(PRODUCT_OUT) system $(PRIVATE_SYSTEM_TAR) \
1584 $(INSTALLED_SYSTEMTARBALL_TARGET) $(TARGET_OUT)
1585endef
1586
1587ifndef SYSTEM_TARBALL_FORMAT
1588 SYSTEM_TARBALL_FORMAT := bz2
1589endif
1590
1591system_tar := $(PRODUCT_OUT)/system.tar
1592INSTALLED_SYSTEMTARBALL_TARGET := $(system_tar).$(SYSTEM_TARBALL_FORMAT)
1593$(INSTALLED_SYSTEMTARBALL_TARGET): PRIVATE_SYSTEM_TAR := $(system_tar)
1594$(INSTALLED_SYSTEMTARBALL_TARGET): $(FS_GET_STATS) $(INTERNAL_SYSTEMIMAGE_FILES)
1595 $(build-systemtarball-target)
1596
1597.PHONY: systemtarball-nodeps
1598systemtarball-nodeps: $(FS_GET_STATS) \
1599 $(filter-out systemtarball-nodeps stnod,$(MAKECMDGOALS))
1600 $(build-systemtarball-target)
1601
1602.PHONY: stnod
1603stnod: systemtarball-nodeps
1604
1605# -----------------------------------------------------------------
1606## platform.zip: system, plus other files to be used in PDK fusion build,
1607## in a zip file
1608##
1609## PDK_PLATFORM_ZIP_PRODUCT_BINARIES is used to store specified files to platform.zip.
1610## The variable will be typically set from BoardConfig.mk.
1611## Files under out dir will be rejected to prevent possible conflicts with other rules.
1612pdk_odex_javalibs := $(strip $(foreach m,$(DEXPREOPT.MODULES.JAVA_LIBRARIES),\
1613 $(if $(filter $(DEXPREOPT.$(m).INSTALLED),$(ALL_DEFAULT_INSTALLED_MODULES)),$(m))))
1614pdk_odex_apps := $(strip $(foreach m,$(DEXPREOPT.MODULES.APPS),\
1615 $(if $(filter $(DEXPREOPT.$(m).INSTALLED),$(ALL_DEFAULT_INSTALLED_MODULES)),$(m))))
1616pdk_classes_dex := $(strip \
1617 $(foreach m,$(pdk_odex_javalibs),$(call intermediates-dir-for,JAVA_LIBRARIES,$(m),,COMMON)/javalib.jar) \
1618 $(foreach m,$(pdk_odex_apps),$(call intermediates-dir-for,APPS,$(m))/package.dex.apk))
1619
1620pdk_odex_config_mk := $(PRODUCT_OUT)/pdk_dexpreopt_config.mk
1621$(pdk_odex_config_mk): PRIVATE_JAVA_LIBRARIES := $(pdk_odex_javalibs)
1622$(pdk_odex_config_mk): PRIVATE_APPS := $(pdk_odex_apps)
1623$(pdk_odex_config_mk) :
1624 @echo "PDK odex config makefile: $@"
1625 $(hide) mkdir -p $(dir $@)
1626 $(hide) echo "# Auto-generated. Do not modify." > $@
1627 $(hide) echo "PDK.DEXPREOPT.JAVA_LIBRARIES:=$(PRIVATE_JAVA_LIBRARIES)" >> $@
1628 $(hide) echo "PDK.DEXPREOPT.APPS:=$(PRIVATE_APPS)" >> $@
1629 $(foreach m,$(PRIVATE_JAVA_LIBRARIES),\
1630 $(hide) echo "PDK.DEXPREOPT.$(m).SRC:=$(patsubst $(OUT_DIR)/%,%,$(call intermediates-dir-for,JAVA_LIBRARIES,$(m),,COMMON)/javalib.jar)" >> $@$(newline)\
1631 $(hide) echo "PDK.DEXPREOPT.$(m).DEX_PREOPT:=$(DEXPREOPT.$(m).DEX_PREOPT)" >> $@$(newline)\
1632 $(hide) echo "PDK.DEXPREOPT.$(m).MULTILIB:=$(DEXPREOPT.$(m).MULTILIB)" >> $@$(newline)\
1633 $(hide) echo "PDK.DEXPREOPT.$(m).DEX_PREOPT_FLAGS:=$(DEXPREOPT.$(m).DEX_PREOPT_FLAGS)" >> $@$(newline)\
1634 )
1635 $(foreach m,$(PRIVATE_APPS),\
1636 $(hide) echo "PDK.DEXPREOPT.$(m).SRC:=$(patsubst $(OUT_DIR)/%,%,$(call intermediates-dir-for,APPS,$(m))/package.dex.apk)" >> $@$(newline)\
1637 $(hide) echo "PDK.DEXPREOPT.$(m).DEX_PREOPT:=$(DEXPREOPT.$(m).DEX_PREOPT)" >> $@$(newline)\
1638 $(hide) echo "PDK.DEXPREOPT.$(m).MULTILIB:=$(DEXPREOPT.$(m).MULTILIB)" >> $@$(newline)\
1639 $(hide) echo "PDK.DEXPREOPT.$(m).DEX_PREOPT_FLAGS:=$(DEXPREOPT.$(m).DEX_PREOPT_FLAGS)" >> $@$(newline)\
1640 $(hide) echo "PDK.DEXPREOPT.$(m).PRIVILEGED_MODULE:=$(DEXPREOPT.$(m).PRIVILEGED_MODULE)" >> $@$(newline)\
1641 $(hide) echo "PDK.DEXPREOPT.$(m).VENDOR_MODULE:=$(DEXPREOPT.$(m).VENDOR_MODULE)" >> $@$(newline)\
1642 $(hide) echo "PDK.DEXPREOPT.$(m).TARGET_ARCH:=$(DEXPREOPT.$(m).TARGET_ARCH)" >> $@$(newline)\
1643 $(hide) echo "PDK.DEXPREOPT.$(m).STRIPPED_SRC:=$(patsubst $(PRODUCT_OUT)/%,%,$(DEXPREOPT.$(m).INSTALLED_STRIPPED))" >> $@$(newline)\
1644 )
1645
1646PDK_PLATFORM_ZIP_PRODUCT_BINARIES := $(filter-out $(OUT_DIR)/%,$(PDK_PLATFORM_ZIP_PRODUCT_BINARIES))
1647INSTALLED_PLATFORM_ZIP := $(PRODUCT_OUT)/platform.zip
1648
1649$(INSTALLED_PLATFORM_ZIP): PRIVATE_DEX_FILES := $(pdk_classes_dex)
1650$(INSTALLED_PLATFORM_ZIP): PRIVATE_ODEX_CONFIG := $(pdk_odex_config_mk)
1651$(INSTALLED_PLATFORM_ZIP) : $(INTERNAL_SYSTEMIMAGE_FILES) $(pdk_odex_config_mk)
1652 $(call pretty,"Platform zip package: $(INSTALLED_PLATFORM_ZIP)")
1653 $(hide) rm -f $@
1654 $(hide) cd $(dir $@) && zip -qryX $(notdir $@) \
1655 $(TARGET_COPY_OUT_SYSTEM) \
1656 $(patsubst $(PRODUCT_OUT)/%, %, $(TARGET_OUT_NOTICE_FILES)) \
1657 $(addprefix symbols/,$(PDK_SYMBOL_FILES_LIST))
1658ifdef BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE
1659 $(hide) cd $(dir $@) && zip -qryX $(notdir $@) \
1660 $(TARGET_COPY_OUT_VENDOR)
1661endif
1662ifneq ($(PDK_PLATFORM_JAVA_ZIP_CONTENTS),)
1663 $(hide) cd $(OUT_DIR) && zip -qryX $(patsubst $(OUT_DIR)/%,%,$@) $(PDK_PLATFORM_JAVA_ZIP_CONTENTS)
1664endif
1665ifneq ($(PDK_PLATFORM_ZIP_PRODUCT_BINARIES),)
1666 $(hide) zip -qryX $@ $(PDK_PLATFORM_ZIP_PRODUCT_BINARIES)
1667endif
1668 @# Add dex-preopt files and config.
1669 $(if $(PRIVATE_DEX_FILES),$(hide) cd $(OUT_DIR) && zip -qryX $(patsubst $(OUT_DIR)/%,%,$@ $(PRIVATE_DEX_FILES)))
1670 $(hide) zip -qryXj $@ $(PRIVATE_ODEX_CONFIG)
1671
1672.PHONY: platform
1673platform: $(INSTALLED_PLATFORM_ZIP)
1674
1675.PHONY: platform-java
1676platform-java: platform
1677
1678# Dist the platform.zip
1679ifneq (,$(filter platform platform-java, $(MAKECMDGOALS)))
1680$(call dist-for-goals, platform platform-java, $(INSTALLED_PLATFORM_ZIP))
1681endif
1682
1683# -----------------------------------------------------------------
1684## boot tarball
1685define build-boottarball-target
1686 $(hide) echo "Target boot fs tarball: $(INSTALLED_BOOTTARBALL_TARGET)"
1687 $(hide) mkdir -p $(PRODUCT_OUT)/boot
1688 $(hide) cp -f $(INTERNAL_BOOTIMAGE_FILES) $(PRODUCT_OUT)/boot/.
1689 $(hide) echo $(INTERNAL_KERNEL_CMDLINE) > $(PRODUCT_OUT)/boot/cmdline
1690 $(hide) $(MKTARBALL) $(FS_GET_STATS) \
1691 $(PRODUCT_OUT) boot $(PRIVATE_BOOT_TAR) \
1692 $(INSTALLED_BOOTTARBALL_TARGET) $(TARGET_OUT)
1693endef
1694
1695ifndef BOOT_TARBALL_FORMAT
1696 BOOT_TARBALL_FORMAT := bz2
1697endif
1698
1699boot_tar := $(PRODUCT_OUT)/boot.tar
1700INSTALLED_BOOTTARBALL_TARGET := $(boot_tar).$(BOOT_TARBALL_FORMAT)
1701$(INSTALLED_BOOTTARBALL_TARGET): PRIVATE_BOOT_TAR := $(boot_tar)
1702$(INSTALLED_BOOTTARBALL_TARGET): $(FS_GET_STATS) $(INTERNAL_BOOTIMAGE_FILES)
1703 $(build-boottarball-target)
1704
1705.PHONY: boottarball-nodeps btnod
1706boottarball-nodeps btnod: $(FS_GET_STATS) \
1707 $(filter-out boottarball-nodeps btnod,$(MAKECMDGOALS))
1708 $(build-boottarball-target)
1709
1710
1711# -----------------------------------------------------------------
1712# data partition image
1713INTERNAL_USERDATAIMAGE_FILES := \
1714 $(filter $(TARGET_OUT_DATA)/%,$(ALL_DEFAULT_INSTALLED_MODULES))
1715
1716# Don't build userdata.img if it's extfs but no partition size
1717skip_userdata.img :=
1718ifdef INTERNAL_USERIMAGES_EXT_VARIANT
1719ifndef BOARD_USERDATAIMAGE_PARTITION_SIZE
1720skip_userdata.img := true
1721endif
1722endif
1723
1724ifneq ($(skip_userdata.img),true)
1725userdataimage_intermediates := \
1726 $(call intermediates-dir-for,PACKAGING,userdata)
1727BUILT_USERDATAIMAGE_TARGET := $(PRODUCT_OUT)/userdata.img
1728
1729define build-userdataimage-target
1730 $(call pretty,"Target userdata fs image: $(INSTALLED_USERDATAIMAGE_TARGET)")
1731 @mkdir -p $(TARGET_OUT_DATA)
1732 @mkdir -p $(userdataimage_intermediates) && rm -rf $(userdataimage_intermediates)/userdata_image_info.txt
1733 $(call generate-userimage-prop-dictionary, $(userdataimage_intermediates)/userdata_image_info.txt, skip_fsck=true)
1734 $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH \
1735 ./build/tools/releasetools/build_image.py \
1736 $(TARGET_OUT_DATA) $(userdataimage_intermediates)/userdata_image_info.txt $(INSTALLED_USERDATAIMAGE_TARGET) $(TARGET_OUT)
1737 $(hide) $(call assert-max-image-size,$(INSTALLED_USERDATAIMAGE_TARGET),$(BOARD_USERDATAIMAGE_PARTITION_SIZE))
1738endef
1739
1740# We just build this directly to the install location.
1741INSTALLED_USERDATAIMAGE_TARGET := $(BUILT_USERDATAIMAGE_TARGET)
1742INSTALLED_USERDATAIMAGE_TARGET_DEPS := \
1743 $(INTERNAL_USERIMAGES_DEPS) \
1744 $(INTERNAL_USERDATAIMAGE_FILES) \
1745 $(BUILD_IMAGE_SRCS)
1746$(INSTALLED_USERDATAIMAGE_TARGET): $(INSTALLED_USERDATAIMAGE_TARGET_DEPS)
1747 $(build-userdataimage-target)
1748
1749.PHONY: userdataimage-nodeps
1750userdataimage-nodeps: | $(INTERNAL_USERIMAGES_DEPS)
1751 $(build-userdataimage-target)
1752
1753endif # not skip_userdata.img
1754skip_userdata.img :=
1755
1756# ASAN libraries in the system image - build rule.
1757ASAN_OUT_DIRS_FOR_SYSTEM_INSTALL := $(sort $(patsubst $(PRODUCT_OUT)/%,%,\
1758 $(TARGET_OUT_SHARED_LIBRARIES) \
1759 $(2ND_TARGET_OUT_SHARED_LIBRARIES) \
1760 $(TARGET_OUT_VENDOR_SHARED_LIBRARIES) \
1761 $(2ND_TARGET_OUT_VENDOR_SHARED_LIBRARIES)))
1762# Extra options: Enforce the system user for the files to avoid having to change ownership.
1763ASAN_SYSTEM_INSTALL_OPTIONS := --owner=1000 --group=1000
1764# Note: experimentally, it seems not worth it to try to get "best" compression. We don't save
1765# enough space.
1766$(ASAN_IN_SYSTEM_INSTALLED): $(INSTALLED_USERDATAIMAGE_TARGET_DEPS)
1767 tar cfj $(ASAN_IN_SYSTEM_INSTALLED) $(ASAN_SYSTEM_INSTALL_OPTIONS) -C $(TARGET_OUT_DATA)/.. $(ASAN_OUT_DIRS_FOR_SYSTEM_INSTALL) >/dev/null
1768
1769#######
1770## data partition tarball
1771define build-userdatatarball-target
1772 $(call pretty,"Target userdata fs tarball: " \
1773 "$(INSTALLED_USERDATATARBALL_TARGET)")
1774 $(MKTARBALL) $(FS_GET_STATS) \
1775 $(PRODUCT_OUT) data $(PRIVATE_USERDATA_TAR) \
1776 $(INSTALLED_USERDATATARBALL_TARGET) $(TARGET_OUT)
1777endef
1778
1779userdata_tar := $(PRODUCT_OUT)/userdata.tar
1780INSTALLED_USERDATATARBALL_TARGET := $(userdata_tar).bz2
1781$(INSTALLED_USERDATATARBALL_TARGET): PRIVATE_USERDATA_TAR := $(userdata_tar)
1782$(INSTALLED_USERDATATARBALL_TARGET): $(FS_GET_STATS) $(INTERNAL_USERDATAIMAGE_FILES)
1783 $(build-userdatatarball-target)
1784
1785$(call dist-for-goals,userdatatarball,$(INSTALLED_USERDATATARBALL_TARGET))
1786
1787.PHONY: userdatatarball-nodeps
1788userdatatarball-nodeps: $(FS_GET_STATS)
1789 $(build-userdatatarball-target)
1790
1791
1792# -----------------------------------------------------------------
1793# partition table image
1794ifdef BOARD_BPT_INPUT_FILES
1795
1796BUILT_BPTIMAGE_TARGET := $(PRODUCT_OUT)/partition-table.img
1797BUILT_BPTJSON_TARGET := $(PRODUCT_OUT)/partition-table.bpt
1798
1799INTERNAL_BVBTOOL_MAKE_TABLE_ARGS := \
1800 --output_gpt $(BUILT_BPTIMAGE_TARGET) \
1801 --output_json $(BUILT_BPTJSON_TARGET) \
1802 $(foreach file, $(BOARD_BPT_INPUT_FILES), --input $(file))
1803
1804ifdef BOARD_BPT_DISK_SIZE
1805INTERNAL_BVBTOOL_MAKE_TABLE_ARGS += --disk_size $(BOARD_BPT_DISK_SIZE)
1806endif
1807
1808define build-bptimage-target
1809 $(call pretty,"Target partition table image: $(INSTALLED_BPTIMAGE_TARGET)")
1810 $(hide) $(BPTTOOL) make_table $(INTERNAL_BVBTOOL_MAKE_TABLE_ARGS) $(BOARD_BPT_MAKE_TABLE_ARGS)
1811endef
1812
1813INSTALLED_BPTIMAGE_TARGET := $(BUILT_BPTIMAGE_TARGET)
1814$(BUILT_BPTJSON_TARGET): $(INSTALLED_BPTIMAGE_TARGET)
1815 $(hide) touch -c $(BUILT_BPTJSON_TARGET)
1816
1817$(INSTALLED_BPTIMAGE_TARGET): $(BPTTOOL) $(BOARD_BPT_INPUT_FILES)
1818 $(build-bptimage-target)
1819
1820.PHONY: bptimage-nodeps
1821bptimage-nodeps:
1822 $(build-bptimage-target)
1823
1824endif # BOARD_BPT_INPUT_FILES
1825
1826# -----------------------------------------------------------------
1827# cache partition image
1828ifdef BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE
1829INTERNAL_CACHEIMAGE_FILES := \
1830 $(filter $(TARGET_OUT_CACHE)/%,$(ALL_DEFAULT_INSTALLED_MODULES))
1831
1832cacheimage_intermediates := \
1833 $(call intermediates-dir-for,PACKAGING,cache)
1834BUILT_CACHEIMAGE_TARGET := $(PRODUCT_OUT)/cache.img
1835
1836define build-cacheimage-target
1837 $(call pretty,"Target cache fs image: $(INSTALLED_CACHEIMAGE_TARGET)")
1838 @mkdir -p $(TARGET_OUT_CACHE)
1839 @mkdir -p $(cacheimage_intermediates) && rm -rf $(cacheimage_intermediates)/cache_image_info.txt
1840 $(call generate-userimage-prop-dictionary, $(cacheimage_intermediates)/cache_image_info.txt, skip_fsck=true)
1841 $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH \
1842 ./build/tools/releasetools/build_image.py \
1843 $(TARGET_OUT_CACHE) $(cacheimage_intermediates)/cache_image_info.txt $(INSTALLED_CACHEIMAGE_TARGET) $(TARGET_OUT)
1844 $(hide) $(call assert-max-image-size,$(INSTALLED_CACHEIMAGE_TARGET),$(BOARD_CACHEIMAGE_PARTITION_SIZE))
1845endef
1846
1847# We just build this directly to the install location.
1848INSTALLED_CACHEIMAGE_TARGET := $(BUILT_CACHEIMAGE_TARGET)
1849$(INSTALLED_CACHEIMAGE_TARGET): $(INTERNAL_USERIMAGES_DEPS) $(INTERNAL_CACHEIMAGE_FILES) $(BUILD_IMAGE_SRCS)
1850 $(build-cacheimage-target)
1851
1852.PHONY: cacheimage-nodeps
1853cacheimage-nodeps: | $(INTERNAL_USERIMAGES_DEPS)
1854 $(build-cacheimage-target)
1855
1856else # BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE
1857# we need to ignore the broken cache link when doing the rsync
1858IGNORE_CACHE_LINK := --exclude=cache
1859endif # BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE
1860
1861# -----------------------------------------------------------------
1862# system_other partition image
1863ifeq ($(BOARD_USES_SYSTEM_OTHER_ODEX),true)
1864BOARD_USES_SYSTEM_OTHER := true
1865
1866# Marker file to identify that odex files are installed
1867INSTALLED_SYSTEM_OTHER_ODEX_MARKER := $(TARGET_OUT_SYSTEM_OTHER)/system-other-odex-marker
1868ALL_DEFAULT_INSTALLED_MODULES += $(INSTALLED_SYSTEM_OTHER_ODEX_MARKER)
1869$(INSTALLED_SYSTEM_OTHER_ODEX_MARKER):
1870 $(hide) touch $@
1871endif
1872
1873ifdef BOARD_USES_SYSTEM_OTHER
1874INTERNAL_SYSTEMOTHERIMAGE_FILES := \
1875 $(filter $(TARGET_OUT_SYSTEM_OTHER)/%,\
1876 $(ALL_DEFAULT_INSTALLED_MODULES)\
1877 $(ALL_PDK_FUSION_FILES))
1878
1879INSTALLED_FILES_FILE_SYSTEMOTHER := $(PRODUCT_OUT)/installed-files-system-other.txt
1880$(INSTALLED_FILES_FILE_SYSTEMOTHER) : $(INTERNAL_SYSTEMOTHERIMAGE_FILES) $(FILESLIST)
1881 @echo Installed file list: $@
1882 @mkdir -p $(dir $@)
1883 @rm -f $@
1884 $(hide) $(FILESLIST) $(TARGET_OUT_SYSTEM_OTHER) > $(@:.txt=.json)
1885 $(hide) build/tools/fileslist_util.py -c $(@:.txt=.json) > $@
1886
1887systemotherimage_intermediates := \
1888 $(call intermediates-dir-for,PACKAGING,system_other)
1889BUILT_SYSTEMOTHERIMAGE_TARGET := $(PRODUCT_OUT)/system_other.img
1890
1891# Note that we assert the size is SYSTEMIMAGE_PARTITION_SIZE since this is the 'b' system image.
1892define build-systemotherimage-target
1893 $(call pretty,"Target system_other fs image: $(INSTALLED_SYSTEMOTHERIMAGE_TARGET)")
1894 @mkdir -p $(TARGET_OUT_SYSTEM_OTHER)
1895 @mkdir -p $(systemotherimage_intermediates) && rm -rf $(systemotherimage_intermediates)/system_other_image_info.txt
1896 $(call generate-userimage-prop-dictionary, $(systemotherimage_intermediates)/system_other_image_info.txt, skip_fsck=true)
1897 $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH \
1898 ./build/tools/releasetools/build_image.py \
1899 $(TARGET_OUT_SYSTEM_OTHER) $(systemotherimage_intermediates)/system_other_image_info.txt $(INSTALLED_SYSTEMOTHERIMAGE_TARGET) $(TARGET_OUT)
1900 $(hide) $(call assert-max-image-size,$(INSTALLED_SYSTEMOTHERIMAGE_TARGET),$(BOARD_SYSTEMIMAGE_PARTITION_SIZE))
1901endef
1902
1903# We just build this directly to the install location.
1904INSTALLED_SYSTEMOTHERIMAGE_TARGET := $(BUILT_SYSTEMOTHERIMAGE_TARGET)
1905$(INSTALLED_SYSTEMOTHERIMAGE_TARGET): $(INTERNAL_USERIMAGES_DEPS) $(INTERNAL_SYSTEMOTHERIMAGE_FILES) $(INSTALLED_FILES_FILE_SYSTEMOTHER)
1906 $(build-systemotherimage-target)
1907
1908.PHONY: systemotherimage-nodeps
1909systemotherimage-nodeps: | $(INTERNAL_USERIMAGES_DEPS)
1910 $(build-systemotherimage-target)
1911
1912endif # BOARD_USES_SYSTEM_OTHER
1913
1914
1915# -----------------------------------------------------------------
1916# vendor partition image
1917ifdef BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE
1918INTERNAL_VENDORIMAGE_FILES := \
1919 $(filter $(TARGET_OUT_VENDOR)/%,\
1920 $(ALL_DEFAULT_INSTALLED_MODULES)\
1921 $(ALL_PDK_FUSION_FILES))
1922
1923# platform.zip depends on $(INTERNAL_VENDORIMAGE_FILES).
1924$(INSTALLED_PLATFORM_ZIP) : $(INTERNAL_VENDORIMAGE_FILES)
1925
1926INSTALLED_FILES_FILE_VENDOR := $(PRODUCT_OUT)/installed-files-vendor.txt
1927$(INSTALLED_FILES_FILE_VENDOR) : $(INTERNAL_VENDORIMAGE_FILES) $(FILESLIST)
1928 @echo Installed file list: $@
1929 @mkdir -p $(dir $@)
1930 @rm -f $@
1931 $(hide) $(FILESLIST) $(TARGET_OUT_VENDOR) > $(@:.txt=.json)
1932 $(hide) build/tools/fileslist_util.py -c $(@:.txt=.json) > $@
1933
1934vendorimage_intermediates := \
1935 $(call intermediates-dir-for,PACKAGING,vendor)
1936BUILT_VENDORIMAGE_TARGET := $(PRODUCT_OUT)/vendor.img
1937define build-vendorimage-target
1938 $(call pretty,"Target vendor fs image: $(INSTALLED_VENDORIMAGE_TARGET)")
1939 @mkdir -p $(TARGET_OUT_VENDOR)
1940 @mkdir -p $(vendorimage_intermediates) && rm -rf $(vendorimage_intermediates)/vendor_image_info.txt
1941 $(call generate-userimage-prop-dictionary, $(vendorimage_intermediates)/vendor_image_info.txt, skip_fsck=true)
1942 $(if $(BOARD_VENDOR_KERNEL_MODULES), \
1943 $(call build-image-kernel-modules,$(BOARD_VENDOR_KERNEL_MODULES),$(TARGET_OUT_VENDOR),vendor/,$(call intermediates-dir-for,PACKAGING,depmod_vendor)))
1944 $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH \
1945 ./build/tools/releasetools/build_image.py \
1946 $(TARGET_OUT_VENDOR) $(vendorimage_intermediates)/vendor_image_info.txt $(INSTALLED_VENDORIMAGE_TARGET) $(TARGET_OUT)
1947 $(hide) $(call assert-max-image-size,$(INSTALLED_VENDORIMAGE_TARGET),$(BOARD_VENDORIMAGE_PARTITION_SIZE))
1948endef
1949
1950# We just build this directly to the install location.
1951INSTALLED_VENDORIMAGE_TARGET := $(BUILT_VENDORIMAGE_TARGET)
1952$(INSTALLED_VENDORIMAGE_TARGET): $(INTERNAL_USERIMAGES_DEPS) $(INTERNAL_VENDORIMAGE_FILES) $(INSTALLED_FILES_FILE_VENDOR) $(BUILD_IMAGE_SRCS) $(DEPMOD) $(BOARD_VENDOR_KERNEL_MODULES) $(INSTALLED_KERNEL_TARGET)
1953 $(build-vendorimage-target)
1954
1955.PHONY: vendorimage-nodeps vnod
1956vendorimage-nodeps vnod: | $(INTERNAL_USERIMAGES_DEPS) $(DEPMOD)
1957 $(build-vendorimage-target)
1958
1959sync: $(INTERNAL_VENDORIMAGE_FILES)
1960
1961else ifdef BOARD_PREBUILT_VENDORIMAGE
1962INSTALLED_VENDORIMAGE_TARGET := $(PRODUCT_OUT)/vendor.img
1963$(eval $(call copy-one-file,$(BOARD_PREBUILT_VENDORIMAGE),$(INSTALLED_VENDORIMAGE_TARGET)))
1964endif
1965
1966# -----------------------------------------------------------------
1967# dtbo image
1968ifdef BOARD_PREBUILT_DTBOIMAGE
1969INSTALLED_DTBOIMAGE_TARGET := $(PRODUCT_OUT)/dtbo.img
1970
1971ifeq ($(BOARD_AVB_ENABLE),true)
1972$(INSTALLED_DTBOIMAGE_TARGET): $(BOARD_PREBUILT_DTBOIMAGE) $(AVBTOOL) $(BOARD_AVB_DTBO_KEY_PATH)
1973 cp $(BOARD_PREBUILT_DTBOIMAGE) $@
1974 $(AVBTOOL) add_hash_footer \
1975 --image $@ \
1976 --partition_size $(BOARD_DTBOIMG_PARTITION_SIZE) \
1977 --partition_name dtbo $(INTERNAL_AVB_DTBO_SIGNING_ARGS) \
1978 $(BOARD_AVB_DTBO_ADD_HASH_FOOTER_ARGS)
1979else
1980$(INSTALLED_DTBOIMAGE_TARGET): $(BOARD_PREBUILT_DTBOIMAGE)
1981 cp $(BOARD_PREBUILT_DTBOIMAGE) $@
1982endif
1983
1984endif
1985
1986ifdef TARGET_NEEDS_DTBOIMAGE
1987INSTALLED_DTBOIMAGE_TARGET := $(PRODUCT_OUT)/dtbo.img
1988else ifdef BOARD_KERNEL_SEPARATED_DTBO
1989INSTALLED_DTBOIMAGE_TARGET := $(PRODUCT_OUT)/dtbo.img
1990endif
1991
1992# Convert to lower case without requiring a shell, which isn't cacheable.
1993to-lower = $(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,\
1994$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,\
1995$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,\
1996$(subst X,x,$(subst Y,y,$(subst Z,z,$1))))))))))))))))))))))))))
1997# Convert to upper case without requiring a shell, which isn't cacheable.
1998to-upper=$(subst a,A,$(subst b,B,$(subst c,C,$(subst d,D,$(subst e,E,$(subst f,F,$(subst g,G,\
1999$(subst h,H,$(subst i,I,$(subst j,J,$(subst k,K,$(subst l,L,$(subst m,M,$(subst n,N,$(subst o,O,\
2000$(subst p,P,$(subst q,Q,$(subst r,R,$(subst s,S,$(subst t,T,$(subst u,U,$(subst v,V,$(subst w,W,\
2001$(subst x,X,$(subst y,Y,$(subst z,Z,$1))))))))))))))))))))))))))
2002
2003# -----------------------------------------------------------------
2004# vbmeta image
2005ifeq ($(BOARD_AVB_ENABLE),true)
2006
2007BUILT_VBMETAIMAGE_TARGET := $(PRODUCT_OUT)/vbmeta.img
2008AVB_CHAIN_KEY_DIR := $(TARGET_OUT_INTERMEDIATES)/avb_chain_keys
2009
2010ifdef BOARD_AVB_KEY_PATH
2011$(if $(BOARD_AVB_ALGORITHM),,$(error BOARD_AVB_ALGORITHM is not defined))
2012else
2013# If key path isn't specified, use the 4096-bit test key.
2014BOARD_AVB_ALGORITHM := SHA256_RSA4096
2015BOARD_AVB_KEY_PATH := external/avb/test/data/testkey_rsa4096.pem
2016endif
2017
2018INTERNAL_AVB_SIGNING_ARGS := \
2019 --algorithm $(BOARD_AVB_ALGORITHM) --key $(BOARD_AVB_KEY_PATH)
2020
2021BOOT_FOOTER_ARGS := BOARD_AVB_BOOT_ADD_HASH_FOOTER_ARGS
2022DTBO_FOOTER_ARGS := BOARD_AVB_DTBO_ADD_HASH_FOOTER_ARGS
2023SYSTEM_FOOTER_ARGS := BOARD_AVB_SYSTEM_ADD_HASHTREE_FOOTER_ARGS
2024VENDOR_FOOTER_ARGS := BOARD_AVB_VENDOR_ADD_HASHTREE_FOOTER_ARGS
2025
2026# Check and set required build variables for a chain partition.
2027# $(1): the partition to enable AVB chain, e.g., BOOT or SYSTEM.
2028define check-and-set-avb-chain-args
2029$(eval PART := $(1))
2030$(eval part=$(call to-lower,$(PART)))
2031
2032$(eval _key_path := BOARD_AVB_$(PART)_KEY_PATH)
2033$(eval _signing_algorithm := BOARD_AVB_$(PART)_ALGORITHM)
2034$(eval _rollback_index := BOARD_AVB_$(PART)_ROLLBACK_INDEX)
2035$(eval _rollback_index_location := BOARD_AVB_$(PART)_ROLLBACK_INDEX_LOCATION)
2036$(if $($(_key_path)),,$(error $(_key_path) is not defined))
2037$(if $($(_signing_algorithm)),,$(error $(_signing_algorithm) is not defined))
2038$(if $($(_rollback_index)),,$(error $(_rollback_index) is not defined))
2039$(if $($(_rollback_index_location)),,$(error $(_rollback_index_location) is not defined))
2040
2041# Set INTERNAL_AVB_(PART)_SIGNING_ARGS
2042$(eval _signing_args := INTERNAL_AVB_$(PART)_SIGNING_ARGS)
2043$(eval $(_signing_args) := \
2044 --algorithm $($(_signing_algorithm)) --key $($(_key_path)))
2045
2046$(eval INTERNAL_AVB_MAKE_VBMETA_IMAGE_ARGS += \
2047 --chain_partition $(part):$($(_rollback_index_location)):$(AVB_CHAIN_KEY_DIR)/$(part).avbpubkey)
2048
2049# Set rollback_index via footer args
2050$(eval _footer_args := $(PART)_FOOTER_ARGS)
2051$(eval $($(_footer_args)) += --rollback_index $($(_rollback_index)))
2052endef
2053
2054ifdef BOARD_AVB_BOOT_KEY_PATH
2055$(eval $(call check-and-set-avb-chain-args,BOOT))
2056else
2057INTERNAL_AVB_MAKE_VBMETA_IMAGE_ARGS += \
2058 --include_descriptors_from_image $(INSTALLED_BOOTIMAGE_TARGET)
2059endif
2060
2061ifdef BOARD_AVB_SYSTEM_KEY_PATH
2062$(eval $(call check-and-set-avb-chain-args,SYSTEM))
2063else
2064INTERNAL_AVB_MAKE_VBMETA_IMAGE_ARGS += \
2065 --include_descriptors_from_image $(INSTALLED_SYSTEMIMAGE)
2066endif
2067
2068ifdef INSTALLED_VENDORIMAGE_TARGET
2069ifdef BOARD_AVB_VENDOR_KEY_PATH
2070$(eval $(call check-and-set-avb-chain-args,VENDOR))
2071else
2072INTERNAL_AVB_MAKE_VBMETA_IMAGE_ARGS += \
2073 --include_descriptors_from_image $(INSTALLED_VENDORIMAGE_TARGET)
2074endif
2075endif
2076
2077ifdef INSTALLED_DTBOIMAGE_TARGET
2078ifdef BOARD_AVB_DTBO_KEY_PATH
2079$(eval $(call check-and-set-avb-chain-args,DTBO))
2080else
2081INTERNAL_AVB_MAKE_VBMETA_IMAGE_ARGS += \
2082 --include_descriptors_from_image $(INSTALLED_DTBOIMAGE_TARGET)
2083endif
2084endif
2085
2086BOARD_AVB_MAKE_VBMETA_IMAGE_ARGS += --padding_size 4096
2087
2088# Add kernel cmdline descriptor for kernel to mount system.img as root with
2089# dm-verity. This works when system.img is either chained or not-chained:
2090# - chained: The --setup_as_rootfs_from_kernel option will add dm-verity kernel
2091# cmdline descriptor to system.img
2092# - not-chained: The --include_descriptors_from_image option for make_vbmeta_image
2093# will include the kernel cmdline descriptor from system.img into vbmeta.img
2094ifeq ($(BOARD_BUILD_SYSTEM_ROOT_IMAGE),true)
2095BOARD_AVB_SYSTEM_ADD_HASHTREE_FOOTER_ARGS += --setup_as_rootfs_from_kernel
2096endif
2097
2098ifdef BOARD_AVB_ROLLBACK_INDEX
2099BOARD_AVB_MAKE_VBMETA_IMAGE_ARGS += --rollback_index $(BOARD_AVB_ROLLBACK_INDEX)
2100endif
2101
2102ifndef BOARD_BOOTIMAGE_PARTITION_SIZE
2103 $(error BOARD_BOOTIMAGE_PARTITION_SIZE must be set for BOARD_AVB_ENABLE)
2104endif
2105
2106ifndef BOARD_SYSTEMIMAGE_PARTITION_SIZE
2107 $(error BOARD_SYSTEMIMAGE_PARTITION_SIZE must be set for BOARD_AVB_ENABLE)
2108endif
2109
2110# $(1): the directory to extract public keys to
2111define extract-avb-chain-public-keys
2112 $(if $(BOARD_AVB_BOOT_KEY_PATH),\
2113 $(hide) $(AVBTOOL) extract_public_key --key $(BOARD_AVB_BOOT_KEY_PATH) \
2114 --output $(1)/boot.avbpubkey)
2115 $(if $(BOARD_AVB_SYSTEM_KEY_PATH),\
2116 $(hide) $(AVBTOOL) extract_public_key --key $(BOARD_AVB_SYSTEM_KEY_PATH) \
2117 --output $(1)/system.avbpubkey)
2118 $(if $(BOARD_AVB_VENDOR_KEY_PATH),\
2119 $(hide) $(AVBTOOL) extract_public_key --key $(BOARD_AVB_VENDOR_KEY_PATH) \
2120 --output $(1)/vendor.avbpubkey)
2121 $(if $(BOARD_AVB_DTBO_KEY_PATH),\
2122 $(hide) $(AVBTOOL) extract_public_key --key $(BOARD_AVB_DTBO_KEY_PATH) \
2123 --output $(1)/dtbo.avbpubkey)
2124endef
2125
2126define build-vbmetaimage-target
2127 $(call pretty,"Target vbmeta image: $(INSTALLED_VBMETAIMAGE_TARGET)")
2128 $(hide) mkdir -p $(AVB_CHAIN_KEY_DIR)
2129 $(call extract-avb-chain-public-keys, $(AVB_CHAIN_KEY_DIR))
2130 $(hide) $(AVBTOOL) make_vbmeta_image \
2131 $(INTERNAL_AVB_MAKE_VBMETA_IMAGE_ARGS) \
2132 $(INTERNAL_AVB_SIGNING_ARGS) \
2133 $(BOARD_AVB_MAKE_VBMETA_IMAGE_ARGS) \
2134 --output $@
2135 $(hide) rm -rf $(AVB_CHAIN_KEY_DIR)
2136endef
2137
2138INSTALLED_VBMETAIMAGE_TARGET := $(BUILT_VBMETAIMAGE_TARGET)
2139$(INSTALLED_VBMETAIMAGE_TARGET): $(AVBTOOL) $(INSTALLED_BOOTIMAGE_TARGET) $(INSTALLED_SYSTEMIMAGE) $(INSTALLED_VENDORIMAGE_TARGET) $(INSTALLED_DTBOIMAGE_TARGET) $(BOARD_AVB_KEY_PATH)
2140 $(build-vbmetaimage-target)
2141
2142.PHONY: vbmetaimage-nodeps
2143vbmetaimage-nodeps:
2144 $(build-vbmetaimage-target)
2145
2146else ifeq (true,$(BOARD_BUILD_DISABLED_VBMETAIMAGE))
2147BUILT_DISABLED_VBMETAIMAGE := $(PRODUCT_OUT)/vbmeta.img
2148
2149INSTALLED_VBMETAIMAGE_TARGET := $(BUILT_DISABLED_VBMETAIMAGE)
2150$(INSTALLED_VBMETAIMAGE_TARGET): $(AVBTOOL)
2151 $(hide) $(AVBTOOL) make_vbmeta_image \
2152 --flag 2 --padding_size 4096 --output $@
2153
2154else ifdef BOARD_PREBUILT_VBMETAIMAGE
2155INSTALLED_VBMETAIMAGE_TARGET := $(PRODUCT_OUT)/vbmeta.img
2156$(eval $(call copy-one-file,$(BOARD_PREBUILT_VBMETAIMAGE),$(INSTALLED_VBMETAIMAGE_TARGET)))
2157
2158endif # BOARD_AVB_ENABLE
2159
2160# -----------------------------------------------------------------
2161# bring in the installer image generation defines if necessary
2162ifeq ($(TARGET_USE_DISKINSTALLER),true)
2163include bootable/diskinstaller/config.mk
2164endif
2165
2166# -----------------------------------------------------------------
2167# host tools needed to build dist and OTA packages
2168
2169build_ota_package := true
2170ifeq ($(TARGET_SKIP_OTA_PACKAGE),true)
2171build_ota_package := false
2172endif
2173ifneq ($(strip $(SANITIZE_TARGET)),)
2174build_ota_package := false
2175endif
2176ifeq ($(TARGET_PRODUCT),sdk)
2177build_ota_package := false
2178endif
2179ifneq ($(filter generic%,$(TARGET_DEVICE)),)
2180build_ota_package := false
2181endif
2182ifeq ($(TARGET_NO_KERNEL),true)
2183build_ota_package := false
2184endif
2185ifeq ($(recovery_fstab),)
2186build_ota_package := false
2187endif
2188ifeq ($(TARGET_BUILD_PDK),true)
2189build_ota_package := false
2190endif
2191ifeq ($(TARGET_FORCE_OTA_PACKAGE),true)
2192build_ota_package := true
2193endif
2194
2195ifeq ($(build_ota_package),true)
2196OTATOOLS := $(HOST_OUT_EXECUTABLES)/minigzip \
2197 $(HOST_OUT_EXECUTABLES)/aapt \
2198 $(HOST_OUT_EXECUTABLES)/adb \
2199 $(HOST_OUT_EXECUTABLES)/mkbootfs \
2200 $(HOST_OUT_EXECUTABLES)/mkbootimg \
2201 $(HOST_OUT_EXECUTABLES)/fs_config \
2202 $(HOST_OUT_EXECUTABLES)/zipalign \
2203 $(HOST_OUT_EXECUTABLES)/bsdiff \
2204 $(HOST_OUT_EXECUTABLES)/imgdiff \
2205 $(HOST_OUT_JAVA_LIBRARIES)/dumpkey.jar \
2206 $(HOST_OUT_JAVA_LIBRARIES)/signapk.jar \
2207 $(HOST_OUT_JAVA_LIBRARIES)/BootSignature.jar \
2208 $(HOST_OUT_JAVA_LIBRARIES)/VeritySigner.jar \
2209 $(HOST_OUT_EXECUTABLES)/make_ext4fs \
2210 $(HOST_OUT_EXECUTABLES)/mkuserimg.sh \
2211 $(HOST_OUT_EXECUTABLES)/mke2fs \
2212 $(HOST_OUT_EXECUTABLES)/mkuserimg_mke2fs.sh \
2213 $(HOST_OUT_EXECUTABLES)/e2fsdroid \
2214 $(HOST_OUT_EXECUTABLES)/mksquashfsimage.sh \
2215 $(HOST_OUT_EXECUTABLES)/mksquashfs \
2216 $(HOST_OUT_EXECUTABLES)/mkf2fsuserimg.sh \
2217 $(HOST_OUT_EXECUTABLES)/make_f2fs \
2218 $(HOST_OUT_EXECUTABLES)/sload_f2fs \
2219 $(HOST_OUT_EXECUTABLES)/simg2img \
2220 $(HOST_OUT_EXECUTABLES)/e2fsck \
2221 $(HOST_OUT_EXECUTABLES)/build_verity_tree \
2222 $(HOST_OUT_EXECUTABLES)/verity_signer \
2223 $(HOST_OUT_EXECUTABLES)/verity_verifier \
2224 $(HOST_OUT_EXECUTABLES)/append2simg \
2225 $(HOST_OUT_EXECUTABLES)/img2simg \
2226 $(HOST_OUT_EXECUTABLES)/boot_signer \
2227 $(HOST_OUT_EXECUTABLES)/fec \
2228 $(HOST_OUT_EXECUTABLES)/brillo_update_payload \
2229 $(HOST_OUT_EXECUTABLES)/lib/shflags/shflags \
2230 $(HOST_OUT_EXECUTABLES)/delta_generator \
2231 $(AVBTOOL) \
2232 $(BLK_ALLOC_TO_BASE_FS) \
2233 $(BRO)
2234
2235ifeq (true,$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VBOOT))
2236OTATOOLS += \
2237 $(FUTILITY) \
2238 $(VBOOT_SIGNER)
2239endif
2240
2241# Shared libraries.
2242OTATOOLS += \
2243 $(HOST_LIBRARY_PATH)/libc++$(HOST_SHLIB_SUFFIX) \
2244 $(HOST_LIBRARY_PATH)/liblog$(HOST_SHLIB_SUFFIX) \
2245 $(HOST_LIBRARY_PATH)/libcutils$(HOST_SHLIB_SUFFIX) \
2246 $(HOST_LIBRARY_PATH)/libselinux$(HOST_SHLIB_SUFFIX) \
2247 $(HOST_LIBRARY_PATH)/libcrypto-host$(HOST_SHLIB_SUFFIX) \
2248 $(HOST_LIBRARY_PATH)/libext2fs-host$(HOST_SHLIB_SUFFIX) \
2249 $(HOST_LIBRARY_PATH)/libext2_blkid-host$(HOST_SHLIB_SUFFIX) \
2250 $(HOST_LIBRARY_PATH)/libext2_com_err-host$(HOST_SHLIB_SUFFIX) \
2251 $(HOST_LIBRARY_PATH)/libext2_e2p-host$(HOST_SHLIB_SUFFIX) \
2252 $(HOST_LIBRARY_PATH)/libext2_misc$(HOST_SHLIB_SUFFIX) \
2253 $(HOST_LIBRARY_PATH)/libext2_profile-host$(HOST_SHLIB_SUFFIX) \
2254 $(HOST_LIBRARY_PATH)/libext2_quota-host$(HOST_SHLIB_SUFFIX) \
2255 $(HOST_LIBRARY_PATH)/libext2_uuid-host$(HOST_SHLIB_SUFFIX) \
2256 $(HOST_LIBRARY_PATH)/libconscrypt_openjdk_jni$(HOST_SHLIB_SUFFIX) \
2257 $(HOST_LIBRARY_PATH)/libbrillo$(HOST_SHLIB_SUFFIX) \
2258 $(HOST_LIBRARY_PATH)/libbrillo-stream$(HOST_SHLIB_SUFFIX) \
2259 $(HOST_LIBRARY_PATH)/libchrome$(HOST_SHLIB_SUFFIX) \
2260 $(HOST_LIBRARY_PATH)/libcurl-host$(HOST_SHLIB_SUFFIX) \
2261 $(HOST_LIBRARY_PATH)/libevent-host$(HOST_SHLIB_SUFFIX) \
2262 $(HOST_LIBRARY_PATH)/libprotobuf-cpp-lite$(HOST_SHLIB_SUFFIX) \
2263 $(HOST_LIBRARY_PATH)/libssl-host$(HOST_SHLIB_SUFFIX) \
2264 $(HOST_LIBRARY_PATH)/libz-host$(HOST_SHLIB_SUFFIX) \
2265 $(HOST_LIBRARY_PATH)/libsparse-host$(HOST_SHLIB_SUFFIX) \
2266 $(HOST_LIBRARY_PATH)/libbase$(HOST_SHLIB_SUFFIX) \
2267 $(HOST_LIBRARY_PATH)/libpcre2$(HOST_SHLIB_SUFFIX) \
2268 $(HOST_LIBRARY_PATH)/libbrotli$(HOST_SHLIB_SUFFIX)
2269
2270
2271.PHONY: otatools
2272otatools: $(OTATOOLS)
2273
2274BUILT_OTATOOLS_PACKAGE := $(PRODUCT_OUT)/otatools.zip
2275$(BUILT_OTATOOLS_PACKAGE): zip_root := $(call intermediates-dir-for,PACKAGING,otatools)/otatools
2276
2277OTATOOLS_DEPS := \
2278 system/extras/verity/build_verity_metadata.py \
2279 system/extras/ext4_utils/mke2fs.conf \
2280 external/avb/test/data/testkey_rsa4096.pem \
2281 $(shell find build/target/product/security -type f -name \*.x509.pem -o -name \*.pk8 -o \
2282 -name verity_key | sort) \
2283 $(shell find device vendor -type f -name \*.pk8 -o -name verifiedboot\* -o \
2284 -name \*.x509.pem -o -name oem\*.prop | sort)
2285
2286OTATOOLS_RELEASETOOLS := \
2287 $(shell find build/tools/releasetools -name \*.pyc -prune -o -type f | sort)
2288
2289ifeq (true,$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VBOOT))
2290OTATOOLS_DEPS += \
2291 $(shell find external/vboot_reference/tests/devkeys -type f | sort)
2292endif
2293
2294$(BUILT_OTATOOLS_PACKAGE): $(OTATOOLS) $(OTATOOLS_DEPS) $(OTATOOLS_RELEASETOOLS) | $(ACP)
2295 @echo "Package OTA tools: $@"
2296 $(hide) rm -rf $@ $(zip_root)
2297 $(hide) mkdir -p $(dir $@) $(zip_root)/bin $(zip_root)/framework $(zip_root)/releasetools $(zip_root)/vendor/lineage/build/tools
2298 $(call copy-files-with-structure,$(OTATOOLS),$(HOST_OUT)/,$(zip_root))
2299 $(hide) $(ACP) -r -d -p build/tools/releasetools/* $(zip_root)/releasetools
2300 $(hide) $(ACP) -p vendor/lineage/build/tools/getb64key.py $(zip_root)/vendor/lineage/build/tools/
2301 $(hide) rm -rf $@ $(zip_root)/releasetools/*.pyc
2302 $(hide) (cd $(zip_root) && zip -qryX $(abspath $@) *)
2303 $(hide) echo $(OTATOOLS_DEPS) | xargs zip -qryX $(abspath $@)>/dev/null || true
2304
2305.PHONY: otatools-package
2306otatools-package: $(BUILT_OTATOOLS_PACKAGE)
2307
2308endif # build_ota_package
2309
2310# -----------------------------------------------------------------
2311# A zip of the directories that map to the target filesystem.
2312# This zip can be used to create an OTA package or filesystem image
2313# as a post-build step.
2314#
2315name := $(TARGET_PRODUCT)
2316ifeq ($(TARGET_BUILD_TYPE),debug)
2317 name := $(name)_debug
2318endif
2319name := $(name)-target_files-$(FILE_NAME_TAG)
2320
2321intermediates := $(call intermediates-dir-for,PACKAGING,target_files)
2322BUILT_TARGET_FILES_PACKAGE := $(intermediates)/$(name).zip
2323$(BUILT_TARGET_FILES_PACKAGE): intermediates := $(intermediates)
2324$(BUILT_TARGET_FILES_PACKAGE): \
2325 zip_root := $(intermediates)/$(name)
2326
2327# $(1): Directory to copy
2328# $(2): Location to copy it to
2329# The "ls -A" is to prevent "acp s/* d" from failing if s is empty.
2330define package_files-copy-root
2331 if [ -d "$(strip $(1))" -a "$$(ls -A $(1))" ]; then \
2332 mkdir -p $(2) && \
2333 $(ACP) -rd $(strip $(1))/* $(2); \
2334 fi
2335endef
2336
2337built_ota_tools :=
2338
2339# We can't build static executables when SANITIZE_TARGET=address
2340ifeq ($(strip $(SANITIZE_TARGET)),)
2341built_ota_tools += \
2342 $(call intermediates-dir-for,EXECUTABLES,updater,,,$(TARGET_PREFER_32_BIT))/updater
2343endif
2344
2345$(BUILT_TARGET_FILES_PACKAGE): PRIVATE_OTA_TOOLS := $(built_ota_tools)
2346
2347$(BUILT_TARGET_FILES_PACKAGE): PRIVATE_RECOVERY_API_VERSION := $(RECOVERY_API_VERSION)
2348$(BUILT_TARGET_FILES_PACKAGE): PRIVATE_RECOVERY_FSTAB_VERSION := $(RECOVERY_FSTAB_VERSION)
2349
2350ifeq ($(TARGET_RELEASETOOLS_EXTENSIONS),)
2351# default to common dir for device vendor
2352tool_extensions := $(TARGET_DEVICE_DIR)/../common
2353else
2354tool_extensions := $(TARGET_RELEASETOOLS_EXTENSIONS)
2355endif
2356tool_extension := $(wildcard $(tool_extensions)/releasetools.py)
2357$(BUILT_TARGET_FILES_PACKAGE): PRIVATE_TOOL_EXTENSIONS := $(tool_extensions)
2358$(BUILT_TARGET_FILES_PACKAGE): PRIVATE_TOOL_EXTENSION := $(tool_extension)
2359
2360ifeq ($(AB_OTA_UPDATER),true)
2361# Build zlib fingerprint if using the AB Updater.
2362updater_dep := $(TARGET_OUT_COMMON_GEN)/zlib_fingerprint
2363updater_dep += system/update_engine/update_engine.conf
2364else
2365# Build OTA tools if not using the AB Updater.
2366updater_dep := $(built_ota_tools)
2367endif
2368$(BUILT_TARGET_FILES_PACKAGE): $(updater_dep)
2369
2370# If we are using recovery as boot, output recovery files to BOOT/.
2371ifeq ($(BOARD_USES_RECOVERY_AS_BOOT),true)
2372$(BUILT_TARGET_FILES_PACKAGE): PRIVATE_RECOVERY_OUT := BOOT
2373else
2374$(BUILT_TARGET_FILES_PACKAGE): PRIVATE_RECOVERY_OUT := RECOVERY
2375endif
2376
2377ifeq ($(AB_OTA_UPDATER),true)
2378 ifdef BRILLO_VENDOR_PARTITIONS
2379 $(BUILT_TARGET_FILES_PACKAGE): $(foreach p,$(BRILLO_VENDOR_PARTITIONS),\
2380 $(call word-colon,1,$(p))/$(call word-colon,2,$(p)))
2381 endif
2382 ifdef OSRELEASED_DIRECTORY
2383 $(BUILT_TARGET_FILES_PACKAGE): $(TARGET_OUT_OEM)/$(OSRELEASED_DIRECTORY)/product_id
2384 $(BUILT_TARGET_FILES_PACKAGE): $(TARGET_OUT_OEM)/$(OSRELEASED_DIRECTORY)/product_version
2385 $(BUILT_TARGET_FILES_PACKAGE): $(TARGET_OUT_ETC)/$(OSRELEASED_DIRECTORY)/system_version
2386 endif
2387endif
2388
2389# Run fs_config while creating the target files package
2390# $1: root directory
2391# $2: add prefix
2392define fs_config
2393(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)
2394endef
2395
2396# Depending on the various images guarantees that the underlying
2397# directories are up-to-date.
2398$(BUILT_TARGET_FILES_PACKAGE): \
2399 $(INSTALLED_BOOTIMAGE_TARGET) \
2400 $(INSTALLED_RADIOIMAGE_TARGET) \
2401 $(INSTALLED_RECOVERYIMAGE_TARGET) \
2402 $(FULL_SYSTEMIMAGE_DEPS) \
2403 $(INSTALLED_USERDATAIMAGE_TARGET) \
2404 $(INSTALLED_CACHEIMAGE_TARGET) \
2405 $(INSTALLED_VENDORIMAGE_TARGET) \
2406 $(INSTALLED_VBMETAIMAGE_TARGET) \
2407 $(INSTALLED_DTBOIMAGE_TARGET) \
2408 $(INTERNAL_SYSTEMOTHERIMAGE_FILES) \
2409 $(INSTALLED_ANDROID_INFO_TXT_TARGET) \
2410 $(INSTALLED_KERNEL_TARGET) \
2411 $(INSTALLED_2NDBOOTLOADER_TARGET) \
2412 $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SYSTEM_BASE_FS_PATH) \
2413 $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VENDOR_BASE_FS_PATH) \
2414 $(SELINUX_FC) \
2415 $(APKCERTS_FILE) \
2416 $(SOONG_ZIP) \
2417 $(HOST_OUT_EXECUTABLES)/fs_config \
2418 $(HOST_OUT_EXECUTABLES)/imgdiff \
2419 $(HOST_OUT_EXECUTABLES)/bsdiff \
2420 $(BUILD_IMAGE_SRCS) \
2421 $(INSTALLED_VENDOR_MANIFEST) \
2422 $(INSTALLED_VENDOR_MATRIX) \
2423 | $(ACP)
2424 @echo "Package target files: $@"
2425 $(call create-system-vendor-symlink)
2426 $(hide) rm -rf $@ $@.list $(zip_root)
2427 $(hide) mkdir -p $(dir $@) $(zip_root)
2428ifneq (,$(INSTALLED_RECOVERYIMAGE_TARGET)$(filter true,$(BOARD_USES_RECOVERY_AS_BOOT)))
2429 @# Components of the recovery image
2430 $(hide) mkdir -p $(zip_root)/$(PRIVATE_RECOVERY_OUT)
2431 $(hide) $(call package_files-copy-root, \
2432 $(TARGET_RECOVERY_ROOT_OUT),$(zip_root)/$(PRIVATE_RECOVERY_OUT)/RAMDISK)
2433 @# OTA install helpers
2434 $(hide) $(call package_files-copy-root, $(OUT)/install, $(zip_root)/INSTALL)
2435ifdef INSTALLED_KERNEL_TARGET
2436 $(hide) cp $(INSTALLED_KERNEL_TARGET) $(zip_root)/$(PRIVATE_RECOVERY_OUT)/kernel
2437endif
2438ifdef INSTALLED_2NDBOOTLOADER_TARGET
2439 $(hide) cp $(INSTALLED_2NDBOOTLOADER_TARGET) $(zip_root)/$(PRIVATE_RECOVERY_OUT)/second
2440endif
2441ifdef INTERNAL_KERNEL_CMDLINE
2442 $(hide) echo "$(INTERNAL_KERNEL_CMDLINE)" > $(zip_root)/$(PRIVATE_RECOVERY_OUT)/cmdline
2443endif
2444ifdef BOARD_KERNEL_BASE
2445 $(hide) echo "$(BOARD_KERNEL_BASE)" > $(zip_root)/$(PRIVATE_RECOVERY_OUT)/base
2446endif
2447ifdef BOARD_KERNEL_PAGESIZE
2448 $(hide) echo "$(BOARD_KERNEL_PAGESIZE)" > $(zip_root)/$(PRIVATE_RECOVERY_OUT)/pagesize
2449endif
2450ifdef BOARD_KERNEL_TAGS_ADDR
2451 $(hide) echo "$(BOARD_KERNEL_TAGS_ADDR)" > $(zip_root)/$(PRIVATE_RECOVERY_OUT)/tagsaddr
2452endif
2453ifdef BOARD_RAMDISK_OFFSET
2454 $(hide) echo "$(BOARD_RAMDISK_OFFSET)" > $(zip_root)/$(PRIVATE_RECOVERY_OUT)/ramdisk_offset
2455endif
2456ifeq ($(strip $(BOARD_KERNEL_SEPARATED_DT)),true)
2457 $(hide) $(ACP) $(INSTALLED_DTIMAGE_TARGET) $(zip_root)/$(PRIVATE_RECOVERY_OUT)/dt
2458endif
2459endif # INSTALLED_RECOVERYIMAGE_TARGET defined or BOARD_USES_RECOVERY_AS_BOOT is true
2460 @# Components of the boot image
2461 $(hide) mkdir -p $(zip_root)/BOOT
2462ifeq ($(BOARD_BUILD_SYSTEM_ROOT_IMAGE),true)
2463 $(hide) mkdir -p $(zip_root)/ROOT
2464 $(hide) $(call package_files-copy-root, \
2465 $(TARGET_ROOT_OUT),$(zip_root)/ROOT)
2466else
2467 $(hide) $(call package_files-copy-root, \
2468 $(TARGET_ROOT_OUT),$(zip_root)/BOOT/RAMDISK)
2469endif
2470 @# If we are using recovery as boot, this is already done when processing recovery.
2471ifneq ($(BOARD_USES_RECOVERY_AS_BOOT),true)
2472ifdef INSTALLED_KERNEL_TARGET
2473 $(hide) cp $(INSTALLED_KERNEL_TARGET) $(zip_root)/BOOT/kernel
2474endif
2475ifdef INSTALLED_2NDBOOTLOADER_TARGET
2476 $(hide) cp $(INSTALLED_2NDBOOTLOADER_TARGET) $(zip_root)/BOOT/second
2477endif
2478ifdef INTERNAL_KERNEL_CMDLINE
2479 $(hide) echo "$(INTERNAL_KERNEL_CMDLINE)" > $(zip_root)/BOOT/cmdline
2480endif
2481ifdef BOARD_KERNEL_BASE
2482 $(hide) echo "$(BOARD_KERNEL_BASE)" > $(zip_root)/BOOT/base
2483endif
2484ifdef BOARD_KERNEL_PAGESIZE
2485 $(hide) echo "$(BOARD_KERNEL_PAGESIZE)" > $(zip_root)/BOOT/pagesize
2486endif
2487ifdef BOARD_KERNEL_TAGS_ADDR
2488 $(hide) echo "$(BOARD_KERNEL_TAGS_ADDR)" > $(zip_root)/BOOT/tagsaddr
2489endif
2490ifdef BOARD_RAMDISK_OFFSET
2491 $(hide) echo "$(BOARD_RAMDISK_OFFSET)" > $(zip_root)/BOOT/ramdisk_offset
2492endif
2493
2494ifeq ($(strip $(BOARD_KERNEL_SEPARATED_DT)),true)
2495 $(hide) $(ACP) $(INSTALLED_DTIMAGE_TARGET) $(zip_root)/BOOT/dt
2496endif
2497endif # BOARD_USES_RECOVERY_AS_BOOT
2498 $(hide) $(foreach t,$(INSTALLED_RADIOIMAGE_TARGET),\
2499 mkdir -p $(zip_root)/RADIO; \
2500 cp $(t) $(zip_root)/RADIO/$(notdir $(t));)
2501 @# Contents of the system image
2502 $(hide) $(call package_files-copy-root, \
2503 $(SYSTEMIMAGE_SOURCE_DIR),$(zip_root)/SYSTEM)
2504 @# Contents of the data image
2505 $(hide) $(call package_files-copy-root, \
2506 $(TARGET_OUT_DATA),$(zip_root)/DATA)
2507ifdef BOARD_CUSTOM_BOOTIMG
2508 @# Prebuilt boot images
2509 $(hide) mkdir -p $(zip_root)/BOOTABLE_IMAGES
2510 $(hide) $(ACP) $(INSTALLED_BOOTIMAGE_TARGET) $(zip_root)/BOOTABLE_IMAGES/
2511 $(hide) $(ACP) $(INSTALLED_RECOVERYIMAGE_TARGET) $(zip_root)/BOOTABLE_IMAGES/
2512endif
2513ifdef BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE
2514 @# Contents of the vendor image
2515 $(hide) $(call package_files-copy-root, \
2516 $(TARGET_OUT_VENDOR),$(zip_root)/VENDOR)
2517endif
2518ifdef INSTALLED_SYSTEMOTHERIMAGE_TARGET
2519 @# Contents of the system_other image
2520 $(hide) $(call package_files-copy-root, \
2521 $(TARGET_OUT_SYSTEM_OTHER),$(zip_root)/SYSTEM_OTHER)
2522endif
2523 @# Extra contents of the OTA package
2524 $(hide) mkdir -p $(zip_root)/OTA
2525 $(hide) cp $(INSTALLED_ANDROID_INFO_TXT_TARGET) $(zip_root)/OTA/
2526ifneq ($(AB_OTA_UPDATER),true)
2527ifneq ($(built_ota_tools),)
2528 $(hide) mkdir -p $(zip_root)/OTA/bin
2529 $(hide) cp $(PRIVATE_OTA_TOOLS) $(zip_root)/OTA/bin/
2530endif
2531endif
2532 @# Files that do not end up in any images, but are necessary to
2533 @# build them.
2534 $(hide) mkdir -p $(zip_root)/META
2535 $(hide) cp $(APKCERTS_FILE) $(zip_root)/META/apkcerts.txt
2536ifneq ($(tool_extension),)
2537 $(hide) cp $(PRIVATE_TOOL_EXTENSION) $(zip_root)/META/
2538endif
2539 $(hide) echo "$(PRODUCT_OTA_PUBLIC_KEYS)" > $(zip_root)/META/otakeys.txt
2540 $(hide) cp $(SELINUX_FC) $(zip_root)/META/file_contexts.bin
2541 $(hide) echo "recovery_api_version=$(PRIVATE_RECOVERY_API_VERSION)" > $(zip_root)/META/misc_info.txt
2542 $(hide) echo "fstab_version=$(PRIVATE_RECOVERY_FSTAB_VERSION)" >> $(zip_root)/META/misc_info.txt
2543ifdef BOARD_FLASH_BLOCK_SIZE
2544 $(hide) echo "blocksize=$(BOARD_FLASH_BLOCK_SIZE)" >> $(zip_root)/META/misc_info.txt
2545endif
2546ifdef BOARD_BOOTIMAGE_PARTITION_SIZE
2547 $(hide) echo "boot_size=$(BOARD_BOOTIMAGE_PARTITION_SIZE)" >> $(zip_root)/META/misc_info.txt
2548endif
2549ifeq ($(BOARD_USES_RECOVERY_AS_BOOT),)
2550 $(hide) echo "recovery_as_boot=$(BOARD_USES_RECOVERY_AS_BOOT)" >> $(zip_root)/META/misc_info.txt
2551endif
2552ifeq ($(INSTALLED_RECOVERYIMAGE_TARGET),)
2553 $(hide) echo "no_recovery=true" >> $(zip_root)/META/misc_info.txt
2554endif
2555ifdef BOARD_RECOVERYIMAGE_PARTITION_SIZE
2556 $(hide) echo "recovery_size=$(BOARD_RECOVERYIMAGE_PARTITION_SIZE)" >> $(zip_root)/META/misc_info.txt
2557endif
2558ifdef BOARD_HAS_EXT4_RESERVED_BLOCKS
2559 $(hide) echo "has_ext4_reserved_blocks=$(BOARD_HAS_EXT4_RESERVED_BLOCKS)" >> $(zip_root)/META/misc_info.txt
2560endif
2561ifdef TARGET_RECOVERY_FSTYPE_MOUNT_OPTIONS
2562 @# TARGET_RECOVERY_FSTYPE_MOUNT_OPTIONS can be empty to indicate that nothing but defaults should be used.
2563 $(hide) echo "recovery_mount_options=$(TARGET_RECOVERY_FSTYPE_MOUNT_OPTIONS)" >> $(zip_root)/META/misc_info.txt
2564else
2565 $(hide) echo "recovery_mount_options=$(DEFAULT_TARGET_RECOVERY_FSTYPE_MOUNT_OPTIONS)" >> $(zip_root)/META/misc_info.txt
2566endif
2567 $(hide) echo "tool_extensions=$(PRIVATE_TOOL_EXTENSIONS)" >> $(zip_root)/META/misc_info.txt
2568 $(hide) echo "default_system_dev_certificate=$(DEFAULT_SYSTEM_DEV_CERTIFICATE)" >> $(zip_root)/META/misc_info.txt
2569ifdef PRODUCT_EXTRA_RECOVERY_KEYS
2570 $(hide) echo "extra_recovery_keys=$(PRODUCT_EXTRA_RECOVERY_KEYS)" >> $(zip_root)/META/misc_info.txt
2571endif
2572 $(hide) echo 'mkbootimg_args=$(BOARD_MKBOOTIMG_ARGS)' >> $(zip_root)/META/misc_info.txt
2573 $(hide) echo 'mkbootimg_version_args=$(INTERNAL_MKBOOTIMG_VERSION_ARGS)' >> $(zip_root)/META/misc_info.txt
2574 $(hide) echo "use_set_metadata=1" >> $(zip_root)/META/misc_info.txt
2575 $(hide) echo "multistage_support=1" >> $(zip_root)/META/misc_info.txt
2576 $(hide) echo "blockimgdiff_versions=3,4" >> $(zip_root)/META/misc_info.txt
2577ifneq ($(OEM_THUMBPRINT_PROPERTIES),)
2578 # OTA scripts are only interested in fingerprint related properties
2579 $(hide) echo "oem_fingerprint_properties=$(OEM_THUMBPRINT_PROPERTIES)" >> $(zip_root)/META/misc_info.txt
2580endif
2581ifneq ($(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SYSTEM_BASE_FS_PATH),)
2582 $(hide) cp $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SYSTEM_BASE_FS_PATH) \
2583 $(zip_root)/META/$(notdir $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SYSTEM_BASE_FS_PATH))
2584endif
2585ifneq ($(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VENDOR_BASE_FS_PATH),)
2586 $(hide) cp $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VENDOR_BASE_FS_PATH) \
2587 $(zip_root)/META/$(notdir $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VENDOR_BASE_FS_PATH))
2588endif
2589ifneq ($(strip $(SANITIZE_TARGET)),)
2590 # We need to create userdata.img with real data because the instrumented libraries are in userdata.img.
2591 $(hide) echo "userdata_img_with_data=true" >> $(zip_root)/META/misc_info.txt
2592endif
2593ifeq ($(BOARD_USES_FULL_RECOVERY_IMAGE),true)
2594 $(hide) echo "full_recovery_image=true" >> $(zip_root)/META/misc_info.txt
2595endif
2596ifeq ($(TARGET_NOT_USE_GZIP_RECOVERY_RAMDISK),true)
2597 $(hide) echo "no_gzip_recovery_ramdisk=true" >> $(zip_root)/META/misc_info.txt
2598endif
2599ifeq ($(BOARD_AVB_ENABLE),true)
2600 $(hide) echo "avb_enable=true" >> $(zip_root)/META/misc_info.txt
2601 $(hide) echo "avb_vbmeta_key_path=$(BOARD_AVB_KEY_PATH)" >> $(zip_root)/META/misc_info.txt
2602 $(hide) echo "avb_vbmeta_algorithm=$(BOARD_AVB_ALGORITHM)" >> $(zip_root)/META/misc_info.txt
2603 $(hide) echo "avb_vbmeta_args=$(BOARD_AVB_MAKE_VBMETA_IMAGE_ARGS)" >> $(zip_root)/META/misc_info.txt
2604 $(hide) echo "avb_boot_add_hash_footer_args=$(BOARD_AVB_BOOT_ADD_HASH_FOOTER_ARGS)" >> $(zip_root)/META/misc_info.txt
2605ifdef BOARD_AVB_BOOT_KEY_PATH
2606 $(hide) echo "avb_boot_key_path=$(BOARD_AVB_BOOT_KEY_PATH)" >> $(zip_root)/META/misc_info.txt
2607 $(hide) echo "avb_boot_algorithm=$(BOARD_AVB_BOOT_ALGORITHM)" >> $(zip_root)/META/misc_info.txt
2608 $(hide) echo "avb_boot_rollback_index_location=$(BOARD_AVB_BOOT_ROLLBACK_INDEX_LOCATION)" >> $(zip_root)/META/misc_info.txt
2609endif # BOARD_AVB_BOOT_KEY_PATH
2610endif # BOARD_AVB_ENABLE
2611ifeq ($(BOARD_BUILD_DISABLED_VBMETAIMAGE),true)
2612 $(hide) echo "avb_disabled_vbmeta=true" >> $(zip_root)/META/misc_info.txt
2613endif # BOARD_BUILD_DISABLED_VBMETAIMAGE
2614ifdef BOARD_BPT_INPUT_FILES
2615 $(hide) echo "board_bpt_enable=true" >> $(zip_root)/META/misc_info.txt
2616 $(hide) echo "board_bpt_make_table_args=$(BOARD_BPT_MAKE_TABLE_ARGS)" >> $(zip_root)/META/misc_info.txt
2617 $(hide) echo "board_bpt_input_files=$(BOARD_BPT_INPUT_FILES)" >> $(zip_root)/META/misc_info.txt
2618endif
2619ifdef BOARD_BPT_DISK_SIZE
2620 $(hide) echo "board_bpt_disk_size=$(BOARD_BPT_DISK_SIZE)" >> $(zip_root)/META/misc_info.txt
2621endif
2622 $(call generate-userimage-prop-dictionary, $(zip_root)/META/misc_info.txt)
2623ifneq ($(INSTALLED_RECOVERYIMAGE_TARGET),)
2624ifeq ($(TARGET_RELEASETOOL_MAKE_RECOVERY_PATCH_SCRIPT),)
2625 $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH MKBOOTIMG=$(MKBOOTIMG) \
2626 ./build/tools/releasetools/make_recovery_patch $(zip_root) $(zip_root)
2627else
2628 $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH MKBOOTIMG=$(MKBOOTIMG) \
2629 $(TARGET_RELEASETOOL_MAKE_RECOVERY_PATCH_SCRIPT) $(zip_root) $(zip_root)
2630endif
2631endif
2632ifeq ($(AB_OTA_UPDATER),true)
2633 @# When using the A/B updater, include the updater config files in the zip.
2634 $(hide) cp $(TOPDIR)system/update_engine/update_engine.conf $(zip_root)/META/update_engine_config.txt
2635 $(hide) cp $(TARGET_OUT_COMMON_GEN)/zlib_fingerprint $(zip_root)/META/zlib_fingerprint.txt
2636 $(hide) for part in $(AB_OTA_PARTITIONS); do \
2637 echo "$${part}" >> $(zip_root)/META/ab_partitions.txt; \
2638 done
2639 $(hide) for conf in $(AB_OTA_POSTINSTALL_CONFIG); do \
2640 echo "$${conf}" >> $(zip_root)/META/postinstall_config.txt; \
2641 done
2642 @# Include the build type in META/misc_info.txt so the server can easily differentiate production builds.
2643 $(hide) echo "build_type=$(TARGET_BUILD_VARIANT)" >> $(zip_root)/META/misc_info.txt
2644 $(hide) echo "ab_update=true" >> $(zip_root)/META/misc_info.txt
2645ifdef BRILLO_VENDOR_PARTITIONS
2646 $(hide) mkdir -p $(zip_root)/VENDOR_IMAGES
2647 $(hide) for f in $(BRILLO_VENDOR_PARTITIONS); do \
2648 pair1="$$(echo $$f | awk -F':' '{print $$1}')"; \
2649 pair2="$$(echo $$f | awk -F':' '{print $$2}')"; \
2650 src=$${pair1}/$${pair2}; \
2651 dest=$(zip_root)/VENDOR_IMAGES/$${pair2}; \
2652 mkdir -p $$(dirname "$${dest}"); \
2653 cp $${src} $${dest}; \
2654 done;
2655endif
2656ifdef OSRELEASED_DIRECTORY
2657 $(hide) cp $(TARGET_OUT_OEM)/$(OSRELEASED_DIRECTORY)/product_id $(zip_root)/META/product_id.txt
2658 $(hide) cp $(TARGET_OUT_OEM)/$(OSRELEASED_DIRECTORY)/product_version $(zip_root)/META/product_version.txt
2659 $(hide) cp $(TARGET_OUT_ETC)/$(OSRELEASED_DIRECTORY)/system_version $(zip_root)/META/system_version.txt
2660endif
2661endif
2662ifeq ($(BREAKPAD_GENERATE_SYMBOLS),true)
2663 @# If breakpad symbols have been generated, add them to the zip.
2664 $(hide) $(ACP) -r $(TARGET_OUT_BREAKPAD) $(zip_root)/BREAKPAD
2665endif
2666 $(hide) echo "ota_override_device=$(OTA_SCRIPT_OVERRIDE_DEVICE)" >> $(zip_root)/META/misc_info.txt
2667# BOARD_BUILD_DISABLED_VBMETAIMAGE is used to build a special vbmeta.img
2668# that disables AVB verification. The content is fixed and we can just copy
2669# it to $(zip_root)/IMAGES without passing some info into misc_info.txt for
2670# regeneration.
2671ifeq (true,$(BOARD_BUILD_DISABLED_VBMETAIMAGE))
2672 $(hide) mkdir -p $(zip_root)/IMAGES
2673 $(hide) cp $(INSTALLED_VBMETAIMAGE_TARGET) $(zip_root)/IMAGES/
2674endif
2675ifdef BOARD_PREBUILT_VBMETAIMAGE
2676 $(hide) mkdir -p $(zip_root)/IMAGES
2677 $(hide) cp $(INSTALLED_VBMETAIMAGE_TARGET) $(zip_root)/IMAGES/
2678endif
2679ifdef BOARD_PREBUILT_VENDORIMAGE
2680 $(hide) mkdir -p $(zip_root)/IMAGES
2681 $(hide) cp $(INSTALLED_VENDORIMAGE_TARGET) $(zip_root)/IMAGES/
2682endif
2683ifdef INSTALLED_DTBOIMAGE_TARGET
2684 $(hide) mkdir -p $(zip_root)/PREBUILT_IMAGES
2685 $(hide) cp $(INSTALLED_DTBOIMAGE_TARGET) $(zip_root)/PREBUILT_IMAGES/
2686 $(hide) echo "has_dtbo=true" >> $(zip_root)/META/misc_info.txt
2687ifeq ($(BOARD_AVB_ENABLE),true)
2688 $(hide) echo "dtbo_size=$(BOARD_DTBOIMG_PARTITION_SIZE)" >> $(zip_root)/META/misc_info.txt
2689 $(hide) echo "avb_dtbo_add_hash_footer_args=$(BOARD_AVB_DTBO_ADD_HASH_FOOTER_ARGS)" >> $(zip_root)/META/misc_info.txt
2690ifdef BOARD_AVB_DTBO_KEY_PATH
2691 $(hide) echo "avb_dtbo_key_path=$(BOARD_AVB_DTBO_KEY_PATH)" >> $(zip_root)/META/misc_info.txt
2692 $(hide) echo "avb_dtbo_algorithm=$(BOARD_AVB_DTBO_ALGORITHM)" >> $(zip_root)/META/misc_info.txt
2693 $(hide) echo "avb_dtbo_rollback_index_location=$(BOARD_AVB_DTBO_ROLLBACK_INDEX_LOCATION)" \
2694 >> $(zip_root)/META/misc_info.txt
2695endif # BOARD_AVB_DTBO_KEY_PATH
2696endif # BOARD_AVB_ENABLE
2697endif # INSTALLED_DTBOIMAGE_TARGET
2698 @# The radio images in BOARD_PACK_RADIOIMAGES will be additionally copied from RADIO/ into
2699 @# IMAGES/, which then will be added into <product>-img.zip. Such images must be listed in
2700 @# INSTALLED_RADIOIMAGE_TARGET.
2701 $(hide) $(foreach part,$(BOARD_PACK_RADIOIMAGES), \
2702 echo $(part) >> $(zip_root)/META/pack_radioimages.txt;)
2703ifdef PRODUCT_DEFAULT_DEV_CERTIFICATE
2704 $(hide) vendor/lineage/build/tools/getb64key.py $(PRODUCT_DEFAULT_DEV_CERTIFICATE).x509.pem > $(zip_root)/META/releasekey.txt
2705else
2706 $(hide) vendor/lineage/build/tools/getb64key.py $(DEFAULT_SYSTEM_DEV_CERTIFICATE).x509.pem > $(zip_root)/META/releasekey.txt
2707endif
2708 @# Run fs_config on all the system, vendor, boot ramdisk,
2709 @# and recovery ramdisk files in the zip, and save the output
2710 $(hide) $(call fs_config,$(zip_root)/SYSTEM,system/) > $(zip_root)/META/filesystem_config.txt
2711ifdef BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE
2712 $(hide) $(call fs_config,$(zip_root)/VENDOR,vendor/) > $(zip_root)/META/vendor_filesystem_config.txt
2713endif
2714ifeq ($(BOARD_BUILD_SYSTEM_ROOT_IMAGE),true)
2715 $(hide) $(call fs_config,$(zip_root)/ROOT,) > $(zip_root)/META/root_filesystem_config.txt
2716endif
2717 $(hide) $(call fs_config,$(zip_root)/BOOT/RAMDISK,) > $(zip_root)/META/boot_filesystem_config.txt
2718ifneq ($(INSTALLED_RECOVERYIMAGE_TARGET),)
2719 $(hide) $(call fs_config,$(zip_root)/RECOVERY/RAMDISK,) > $(zip_root)/META/recovery_filesystem_config.txt
2720endif
2721ifdef INSTALLED_SYSTEMOTHERIMAGE_TARGET
2722 $(hide) $(call fs_config,$(zip_root)/SYSTEM_OTHER,system/) > $(zip_root)/META/system_other_filesystem_config.txt
2723endif
2724
2725ifeq ($(PRODUCT_FULL_TREBLE),true)
2726 @# Metadata for compatibility verification.
2727 $(hide) cp $(BUILT_SYSTEM_MANIFEST) $(zip_root)/META/system_manifest.xml
2728 $(hide) cp $(BUILT_SYSTEM_COMPATIBILITY_MATRIX) $(zip_root)/META/system_matrix.xml
2729ifdef BUILT_VENDOR_MANIFEST
2730 $(hide) cp $(BUILT_VENDOR_MANIFEST) $(zip_root)/META/vendor_manifest.xml
2731endif
2732ifdef BUILT_VENDOR_MATRIX
2733 $(hide) cp $(BUILT_VENDOR_MATRIX) $(zip_root)/META/vendor_matrix.xml
2734endif
2735endif
2736
2737 $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH MKBOOTIMG=$(MKBOOTIMG) \
2738 ./build/tools/releasetools/add_img_to_target_files -a -v -p $(HOST_OUT) $(zip_root)
2739 @# Zip everything up, preserving symlinks and placing META/ files first to
2740 @# help early validation of the .zip file while uploading it.
2741 $(hide) find $(zip_root)/META | sort >$@.list
2742 $(hide) find $(zip_root) -path $(zip_root)/META -prune -o -print | sort >>$@.list
2743 $(hide) $(SOONG_ZIP) -d -o $@ -C $(zip_root) -l $@.list
2744
2745.PHONY: target-files-package
2746target-files-package: $(BUILT_TARGET_FILES_PACKAGE)
2747
2748ifneq ($(filter $(MAKECMDGOALS),target-files-package),)
2749$(call dist-for-goals, target-files-package, $(BUILT_TARGET_FILES_PACKAGE))
2750endif
2751
2752# -----------------------------------------------------------------
2753# NDK Sysroot Package
2754NDK_SYSROOT_TARGET := $(PRODUCT_OUT)/ndk_sysroot.tar.bz2
2755$(NDK_SYSROOT_TARGET): ndk
2756 @echo Package NDK sysroot...
2757 $(hide) tar cjf $@ -C $(SOONG_OUT_DIR) ndk
2758
2759$(call dist-for-goals,sdk,$(NDK_SYSROOT_TARGET))
2760
2761ifeq ($(build_ota_package),true)
2762# -----------------------------------------------------------------
2763# OTA update package
2764
2765name := $(TARGET_PRODUCT)
2766ifeq ($(TARGET_BUILD_TYPE),debug)
2767 name := $(name)_debug
2768endif
2769name := $(name)-ota-$(FILE_NAME_TAG)
2770
2771INTERNAL_OTA_PACKAGE_TARGET := $(PRODUCT_OUT)/$(name).zip
2772
2773$(INTERNAL_OTA_PACKAGE_TARGET): KEY_CERT_PAIR := $(DEFAULT_KEY_CERT_PAIR)
2774
2775ifeq ($(AB_OTA_UPDATER),true)
2776$(INTERNAL_OTA_PACKAGE_TARGET): $(BRILLO_UPDATE_PAYLOAD)
2777else
2778$(INTERNAL_OTA_PACKAGE_TARGET): $(BRO)
2779endif
2780
2781ifeq ($(TARGET_OTA_ASSERT_DEVICE),)
2782 OTA_SCRIPT_OVERRIDE_DEVICE := auto
2783else
2784 OTA_SCRIPT_OVERRIDE_DEVICE := $(TARGET_OTA_ASSERT_DEVICE)
2785endif
2786
2787ifeq ($(WITH_GMS),true)
2788 $(INTERNAL_OTA_PACKAGE_TARGET): backuptool := false
2789else
2790ifneq ($(LINEAGE_BUILD),)
2791 $(INTERNAL_OTA_PACKAGE_TARGET): backuptool := true
2792else
2793 $(INTERNAL_OTA_PACKAGE_TARGET): backuptool := false
2794endif
2795endif
2796
2797$(INTERNAL_OTA_PACKAGE_TARGET): $(BUILT_TARGET_FILES_PACKAGE) \
2798 build/tools/releasetools/ota_from_target_files
2799 @echo "Package OTA: $@"
2800 $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH MKBOOTIMG=$(MKBOOTIMG) \
2801 ./build/tools/releasetools/ota_from_target_files -v \
2802 --block \
2803 --extracted_input_target_files $(patsubst %.zip,%,$(BUILT_TARGET_FILES_PACKAGE)) \
2804 -p $(HOST_OUT) \
2805 -k $(KEY_CERT_PAIR) \
2806 --backup=$(backuptool) \
2807 $(if $(OEM_OTA_CONFIG), -o $(OEM_OTA_CONFIG)) \
2808 $(BUILT_TARGET_FILES_PACKAGE) $@
2809
2810.PHONY: otapackage
2811otapackage: $(INTERNAL_OTA_PACKAGE_TARGET)
2812
2813endif # build_ota_package
2814
2815# -----------------------------------------------------------------
2816# The update package
2817
2818name := $(TARGET_PRODUCT)
2819ifeq ($(TARGET_BUILD_TYPE),debug)
2820 name := $(name)_debug
2821endif
2822name := $(name)-img-$(FILE_NAME_TAG)
2823
2824INTERNAL_UPDATE_PACKAGE_TARGET := $(PRODUCT_OUT)/$(name).zip
2825
2826$(INTERNAL_UPDATE_PACKAGE_TARGET): $(BUILT_TARGET_FILES_PACKAGE) $(ZIP2ZIP)
2827 @echo "Package: $@"
2828 $(hide) $(ZIP2ZIP) -i $(BUILT_TARGET_FILES_PACKAGE) -o $@ \
2829 OTA/android-info.txt:android-info.txt "IMAGES/*.img:."
2830
2831.PHONY: updatepackage
2832updatepackage: $(INTERNAL_UPDATE_PACKAGE_TARGET)
2833
2834# -----------------------------------------------------------------
2835# A zip of the symbols directory. Keep the full paths to make it
2836# more obvious where these files came from.
2837#
2838name := $(TARGET_PRODUCT)
2839ifeq ($(TARGET_BUILD_TYPE),debug)
2840 name := $(name)_debug
2841endif
2842name := $(name)-symbols-$(FILE_NAME_TAG)
2843
2844SYMBOLS_ZIP := $(PRODUCT_OUT)/$(name).zip
2845# For apps_only build we'll establish the dependency later in build/core/main.mk.
2846ifndef TARGET_BUILD_APPS
2847$(SYMBOLS_ZIP): $(INSTALLED_SYSTEMIMAGE) \
2848 $(INSTALLED_BOOTIMAGE_TARGET) \
2849 $(INSTALLED_USERDATAIMAGE_TARGET) \
2850 $(INSTALLED_VENDORIMAGE_TARGET) \
2851 $(updater_dep)
2852endif
2853$(SYMBOLS_ZIP): PRIVATE_LIST_FILE := $(call intermediates-dir-for,PACKAGING,symbols)/filelist
2854$(SYMBOLS_ZIP): $(SOONG_ZIP)
2855 @echo "Package symbols: $@"
2856 $(hide) rm -rf $@ $(PRIVATE_LIST_FILE)
2857 $(hide) mkdir -p $(dir $@) $(TARGET_OUT_UNSTRIPPED) $(dir $(PRIVATE_LIST_FILE))
2858 $(hide) find $(TARGET_OUT_UNSTRIPPED) | sort >$(PRIVATE_LIST_FILE)
2859 $(hide) $(SOONG_ZIP) -d -o $@ -C $(OUT_DIR)/.. -l $(PRIVATE_LIST_FILE)
2860# -----------------------------------------------------------------
2861# A zip of the coverage directory.
2862#
2863name := $(TARGET_PRODUCT)
2864ifeq ($(TARGET_BUILD_TYPE),debug)
2865name := $(name)_debug
2866endif
2867name := $(name)-coverage-$(FILE_NAME_TAG)
2868COVERAGE_ZIP := $(PRODUCT_OUT)/$(name).zip
2869ifndef TARGET_BUILD_APPS
2870$(COVERAGE_ZIP): $(INSTALLED_SYSTEMIMAGE) \
2871 $(INSTALLED_BOOTIMAGE_TARGET) \
2872 $(INSTALLED_USERDATAIMAGE_TARGET) \
2873 $(INSTALLED_VENDORIMAGE_TARGET)
2874endif
2875$(COVERAGE_ZIP): PRIVATE_LIST_FILE := $(call intermediates-dir-for,PACKAGING,coverage)/filelist
2876$(COVERAGE_ZIP): $(SOONG_ZIP)
2877 @echo "Package coverage: $@"
2878 $(hide) rm -rf $@ $(PRIVATE_LIST_FILE)
2879 $(hide) mkdir -p $(dir $@) $(TARGET_OUT_COVERAGE) $(dir $(PRIVATE_LIST_FILE))
2880 $(hide) find $(TARGET_OUT_COVERAGE) | sort >$(PRIVATE_LIST_FILE)
2881 $(hide) $(SOONG_ZIP) -d -o $@ -C $(TARGET_OUT_COVERAGE) -l $(PRIVATE_LIST_FILE)
2882
2883# -----------------------------------------------------------------
2884# A zip of the Android Apps. Not keeping full path so that we don't
2885# include product names when distributing
2886#
2887name := $(TARGET_PRODUCT)
2888ifeq ($(TARGET_BUILD_TYPE),debug)
2889 name := $(name)_debug
2890endif
2891name := $(name)-apps-$(FILE_NAME_TAG)
2892
2893APPS_ZIP := $(PRODUCT_OUT)/$(name).zip
2894$(APPS_ZIP): $(INSTALLED_SYSTEMIMAGE)
2895 @echo "Package apps: $@"
2896 $(hide) rm -rf $@
2897 $(hide) mkdir -p $(dir $@)
2898 $(hide) apps_to_zip=`find $(TARGET_OUT_APPS) $(TARGET_OUT_APPS_PRIVILEGED) -mindepth 2 -maxdepth 3 -name "*.apk"`; \
2899 if [ -z "$$apps_to_zip" ]; then \
2900 echo "No apps to zip up. Generating empty apps archive." ; \
2901 a=$$(mktemp /tmp/XXXXXXX) && touch $$a && zip $@ $$a && zip -d $@ $$a; \
2902 else \
2903 zip -qjX $@ $$apps_to_zip; \
2904 fi
2905
2906ifeq (true,$(EMMA_INSTRUMENT))
2907 #------------------------------------------------------------------
2908 # An archive of classes for use in generating code-coverage reports
2909 # These are the uninstrumented versions of any classes that were
2910 # to be instrumented.
2911 # Any dependencies are set up later in build/core/main.mk.
2912
2913 ifeq ($(ANDROID_COMPILE_WITH_JACK),false)
2914 JACOCO_REPORT_CLASSES_ALL := $(PRODUCT_OUT)/jacoco-report-classes-all.jar
2915$(JACOCO_REPORT_CLASSES_ALL) :
2916 @echo "Collecting uninstrumented classes"
2917 $(hide) find $(TARGET_COMMON_OUT_ROOT) $(HOST_COMMON_OUT_ROOT) -name "jacoco-report-classes.jar" | \
2918 zip -@ -0 -q -X $@
2919# Meaning of these options:
2920# -@ scan stdin for file paths to add to the zip
2921# -0 don't do any compression
2922# -q supress most output
2923# -X skip storing extended file attributes
2924
2925 else
2926 EMMA_META_ZIP := $(PRODUCT_OUT)/emma_meta.zip
2927$(EMMA_META_ZIP) :
2928 @echo "Collecting Emma coverage meta files."
2929 $(hide) find $(TARGET_COMMON_OUT_ROOT) $(HOST_COMMON_OUT_ROOT) -name "coverage.em" | \
2930 zip -@ -qX $@
2931endif
2932
2933endif # EMMA_INSTRUMENT=true
2934
2935
2936#------------------------------------------------------------------
2937# A zip of Proguard obfuscation dictionary files.
2938# Only for apps_only build.
2939#
2940ifdef TARGET_BUILD_APPS
2941PROGUARD_DICT_ZIP := $(PRODUCT_OUT)/$(TARGET_PRODUCT)-proguard-dict-$(FILE_NAME_TAG).zip
2942# the dependency will be set up later in build/core/main.mk.
2943$(PROGUARD_DICT_ZIP) :
2944 @echo "Packaging Proguard obfuscation dictionary files."
2945 $(hide) dict_files=`find $(TARGET_OUT_COMMON_INTERMEDIATES)/APPS -name proguard_dictionary -o -name jack_dictionary`; \
2946 if [ -n "$$dict_files" ]; then \
2947 unobfuscated_jars=$${dict_files//proguard_dictionary/classes.jar}; \
2948 zip -qX $@ $$dict_files $$unobfuscated_jars; \
2949 else \
2950 touch $(dir $@)/zipdummy; \
2951 (cd $(dir $@) && zip -q $(notdir $@) zipdummy); \
2952 zip -qd $@ zipdummy; \
2953 rm $(dir $@)/zipdummy; \
2954 fi
2955
2956endif # TARGET_BUILD_APPS
2957
2958# -----------------------------------------------------------------
2959# dalvik something
2960.PHONY: dalvikfiles
2961dalvikfiles: $(INTERNAL_DALVIK_MODULES)
2962
2963ifeq ($(BUILD_QEMU_IMAGES),true)
2964INSTALLED_QEMU_SYSTEMIMAGE := $(PRODUCT_OUT)/system-qemu.img
2965MK_QEMU_IMAGE_SH := device/generic/goldfish/tools/mk_qemu_image.sh
2966SGDISK_HOST := $(HOST_OUT_EXECUTABLES)/sgdisk
2967$(INSTALLED_QEMU_SYSTEMIMAGE): $(INSTALLED_SYSTEMIMAGE) $(MK_QEMU_IMAGE_SH) $(SGDISK_HOST)
2968 @echo Create system-qemu.img
2969 (export SGDISK=$(SGDISK_HOST); $(MK_QEMU_IMAGE_SH) ${PRODUCT_OUT}/system.img)
2970
2971systemimage: $(INSTALLED_QEMU_SYSTEMIMAGE)
2972droidcore: $(INSTALLED_QEMU_SYSTEMIMAGE)
2973ifeq ($(BOARD_USES_VENDORIMAGE),true)
2974INSTALLED_QEMU_VENDORIMAGE := $(PRODUCT_OUT)/vendor-qemu.img
2975$(INSTALLED_QEMU_VENDORIMAGE): $(INSTALLED_VENDORIMAGE_TARGET) $(MK_QEMU_IMAGE_SH) $(SGDISK_HOST)
2976 @echo Create vendor-qemu.img
2977 (export SGDISK=$(SGDISK_HOST); $(MK_QEMU_IMAGE_SH) ${PRODUCT_OUT}/vendor.img)
2978
2979vendorimage: $(INSTALLED_QEMU_VENDORIMAGE)
2980droidcore: $(INSTALLED_QEMU_VENDORIMAGE)
2981endif
2982endif
2983# -----------------------------------------------------------------
2984# The emulator package
2985ifeq ($(BUILD_EMULATOR),true)
2986INTERNAL_EMULATOR_PACKAGE_FILES += \
2987 $(HOST_OUT_EXECUTABLES)/emulator$(HOST_EXECUTABLE_SUFFIX) \
2988 prebuilts/qemu-kernel/$(TARGET_ARCH)/kernel-qemu \
2989 $(INSTALLED_RAMDISK_TARGET) \
2990 $(INSTALLED_SYSTEMIMAGE) \
2991 $(INSTALLED_USERDATAIMAGE_TARGET)
2992
2993name := $(TARGET_PRODUCT)-emulator-$(FILE_NAME_TAG)
2994
2995INTERNAL_EMULATOR_PACKAGE_TARGET := $(PRODUCT_OUT)/$(name).zip
2996
2997$(INTERNAL_EMULATOR_PACKAGE_TARGET): $(INTERNAL_EMULATOR_PACKAGE_FILES)
2998 @echo "Package: $@"
2999 $(hide) zip -qjX $@ $(INTERNAL_EMULATOR_PACKAGE_FILES)
3000
3001endif
3002# -----------------------------------------------------------------
3003# Old PDK stuffs, retired
3004# The pdk package (Platform Development Kit)
3005
3006#ifneq (,$(filter pdk,$(MAKECMDGOALS)))
3007# include development/pdk/Pdk.mk
3008#endif
3009
3010
3011# -----------------------------------------------------------------
3012# The SDK
3013
3014# The SDK includes host-specific components, so it belongs under HOST_OUT.
3015sdk_dir := $(HOST_OUT)/sdk/$(TARGET_PRODUCT)
3016
3017# Build a name that looks like:
3018#
3019# linux-x86 --> android-sdk_12345_linux-x86
3020# darwin-x86 --> android-sdk_12345_mac-x86
3021# windows-x86 --> android-sdk_12345_windows
3022#
3023sdk_name := android-sdk_$(FILE_NAME_TAG)
3024ifeq ($(HOST_OS),darwin)
3025 INTERNAL_SDK_HOST_OS_NAME := mac
3026else
3027 INTERNAL_SDK_HOST_OS_NAME := $(HOST_OS)
3028endif
3029ifneq ($(HOST_OS),windows)
3030 INTERNAL_SDK_HOST_OS_NAME := $(INTERNAL_SDK_HOST_OS_NAME)-$(SDK_HOST_ARCH)
3031endif
3032sdk_name := $(sdk_name)_$(INTERNAL_SDK_HOST_OS_NAME)
3033
3034sdk_dep_file := $(sdk_dir)/sdk_deps.mk
3035
3036ATREE_FILES :=
3037-include $(sdk_dep_file)
3038
3039# if we don't have a real list, then use "everything"
3040ifeq ($(strip $(ATREE_FILES)),)
3041ATREE_FILES := \
3042 $(ALL_DEFAULT_INSTALLED_MODULES) \
3043 $(INSTALLED_RAMDISK_TARGET) \
3044 $(ALL_DOCS) \
3045 $(ALL_SDK_FILES)
3046endif
3047
3048atree_dir := development/build
3049
3050
3051sdk_atree_files := \
3052 $(atree_dir)/sdk.exclude.atree \
3053 $(atree_dir)/sdk-$(HOST_OS)-$(SDK_HOST_ARCH).atree
3054
3055# development/build/sdk-android-<abi>.atree is used to differentiate
3056# between architecture models (e.g. ARMv5TE versus ARMv7) when copying
3057# files like the kernel image. We use TARGET_CPU_ABI because we don't
3058# have a better way to distinguish between CPU models.
3059ifneq (,$(strip $(wildcard $(atree_dir)/sdk-android-$(TARGET_CPU_ABI).atree)))
3060 sdk_atree_files += $(atree_dir)/sdk-android-$(TARGET_CPU_ABI).atree
3061endif
3062
3063ifneq ($(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SDK_ATREE_FILES),)
3064sdk_atree_files += $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SDK_ATREE_FILES)
3065else
3066sdk_atree_files += $(atree_dir)/sdk.atree
3067endif
3068
3069include $(BUILD_SYSTEM)/sdk_font.mk
3070
3071deps := \
3072 $(target_notice_file_txt) \
3073 $(tools_notice_file_txt) \
3074 $(OUT_DOCS)/offline-sdk-timestamp \
3075 $(SYMBOLS_ZIP) \
3076 $(COVERAGE_ZIP) \
3077 $(INSTALLED_SYSTEMIMAGE) \
3078 $(INSTALLED_QEMU_SYSTEMIMAGE) \
3079 $(INSTALLED_QEMU_VENDORIMAGE) \
3080 $(INSTALLED_USERDATAIMAGE_TARGET) \
3081 $(INSTALLED_RAMDISK_TARGET) \
3082 $(INSTALLED_SDK_BUILD_PROP_TARGET) \
3083 $(INSTALLED_BUILD_PROP_TARGET) \
3084 $(ATREE_FILES) \
3085 $(sdk_atree_files) \
3086 $(HOST_OUT_EXECUTABLES)/atree \
3087 $(HOST_OUT_EXECUTABLES)/line_endings \
3088 $(SDK_FONT_DEPS)
3089
3090INTERNAL_SDK_TARGET := $(sdk_dir)/$(sdk_name).zip
3091$(INTERNAL_SDK_TARGET): PRIVATE_NAME := $(sdk_name)
3092$(INTERNAL_SDK_TARGET): PRIVATE_DIR := $(sdk_dir)/$(sdk_name)
3093$(INTERNAL_SDK_TARGET): PRIVATE_DEP_FILE := $(sdk_dep_file)
3094$(INTERNAL_SDK_TARGET): PRIVATE_INPUT_FILES := $(sdk_atree_files)
3095
3096# Set SDK_GNU_ERROR to non-empty to fail when a GNU target is built.
3097#
3098#SDK_GNU_ERROR := true
3099
3100$(INTERNAL_SDK_TARGET): $(deps)
3101 @echo "Package SDK: $@"
3102 $(hide) rm -rf $(PRIVATE_DIR) $@
3103 $(hide) for f in $(target_gnu_MODULES); do \
3104 if [ -f $$f ]; then \
3105 echo SDK: $(if $(SDK_GNU_ERROR),ERROR:,warning:) \
3106 including GNU target $$f >&2; \
3107 FAIL=$(SDK_GNU_ERROR); \
3108 fi; \
3109 done; \
3110 if [ $$FAIL ]; then exit 1; fi
3111 $(hide) echo $(notdir $(SDK_FONT_DEPS)) | tr " " "\n" > $(SDK_FONT_TEMP)/fontsInSdk.txt
3112 $(hide) ( \
3113 ATREE_STRIP="strip -x" \
3114 $(HOST_OUT_EXECUTABLES)/atree \
3115 $(addprefix -f ,$(PRIVATE_INPUT_FILES)) \
3116 -m $(PRIVATE_DEP_FILE) \
3117 -I . \
3118 -I $(PRODUCT_OUT) \
3119 -I $(HOST_OUT) \
3120 -I $(TARGET_COMMON_OUT_ROOT) \
3121 -v "PLATFORM_NAME=android-$(PLATFORM_VERSION)" \
3122 -v "OUT_DIR=$(OUT_DIR)" \
3123 -v "HOST_OUT=$(HOST_OUT)" \
3124 -v "TARGET_ARCH=$(TARGET_ARCH)" \
3125 -v "TARGET_CPU_ABI=$(TARGET_CPU_ABI)" \
3126 -v "DLL_EXTENSION=$(HOST_SHLIB_SUFFIX)" \
3127 -v "FONT_OUT=$(SDK_FONT_TEMP)" \
3128 -v "JACK_SDKTOOL_VERSION=$(JACK_SDKTOOL_VERSION)" \
3129 -o $(PRIVATE_DIR) && \
3130 cp -f $(target_notice_file_txt) \
3131 $(PRIVATE_DIR)/system-images/android-$(PLATFORM_VERSION)/$(TARGET_CPU_ABI)/NOTICE.txt && \
3132 cp -f $(tools_notice_file_txt) $(PRIVATE_DIR)/platform-tools/NOTICE.txt && \
3133 HOST_OUT_EXECUTABLES=$(HOST_OUT_EXECUTABLES) HOST_OS=$(HOST_OS) \
3134 development/build/tools/sdk_clean.sh $(PRIVATE_DIR) && \
3135 chmod -R ug+rwX $(PRIVATE_DIR) && \
3136 cd $(dir $@) && zip -rqX $(notdir $@) $(PRIVATE_NAME) \
3137 ) || ( rm -rf $(PRIVATE_DIR) $@ && exit 44 )
3138
3139
3140# Is a Windows SDK requested? If so, we need some definitions from here
3141# in order to find the Linux SDK used to create the Windows one.
3142MAIN_SDK_NAME := $(sdk_name)
3143MAIN_SDK_DIR := $(sdk_dir)
3144MAIN_SDK_ZIP := $(INTERNAL_SDK_TARGET)
3145ifneq ($(filter win_sdk winsdk-tools,$(MAKECMDGOALS)),)
3146include $(TOPDIR)development/build/tools/windows_sdk.mk
3147endif
3148
3149# -----------------------------------------------------------------
3150# Findbugs
3151INTERNAL_FINDBUGS_XML_TARGET := $(PRODUCT_OUT)/findbugs.xml
3152INTERNAL_FINDBUGS_HTML_TARGET := $(PRODUCT_OUT)/findbugs.html
3153$(INTERNAL_FINDBUGS_XML_TARGET): $(ALL_FINDBUGS_FILES)
3154 @echo UnionBugs: $@
3155 $(hide) $(FINDBUGS_DIR)/unionBugs $(ALL_FINDBUGS_FILES) \
3156 > $@
3157$(INTERNAL_FINDBUGS_HTML_TARGET): $(INTERNAL_FINDBUGS_XML_TARGET)
3158 @echo ConvertXmlToText: $@
3159 $(hide) $(FINDBUGS_DIR)/convertXmlToText -html:fancy.xsl \
3160 $(INTERNAL_FINDBUGS_XML_TARGET) > $@
3161
3162# -----------------------------------------------------------------
3163# Findbugs
3164
3165# -----------------------------------------------------------------
3166# These are some additional build tasks that need to be run.
3167ifneq ($(dont_bother),true)
3168include $(sort $(wildcard $(BUILD_SYSTEM)/tasks/*.mk))
3169-include $(sort $(wildcard vendor/*/build/tasks/*.mk))
3170-include $(sort $(wildcard device/*/build/tasks/*.mk))
3171-include $(sort $(wildcard product/*/build/tasks/*.mk))
3172# Also the project-specific tasks
3173-include $(sort $(wildcard vendor/*/*/build/tasks/*.mk))
3174-include $(sort $(wildcard device/*/*/build/tasks/*.mk))
3175-include $(sort $(wildcard product/*/*/build/tasks/*.mk))
3176# Also add test specifc tasks
3177include $(sort $(wildcard platform_testing/build/tasks/*.mk))
3178include $(sort $(wildcard test/vts/tools/build/tasks/*.mk))
3179endif
3180
3181include $(BUILD_SYSTEM)/product-graph.mk
3182
3183# -----------------------------------------------------------------
3184# Create SDK repository packages. Must be done after tasks/* since
3185# we need the addon rules defined.
3186ifneq ($(sdk_repo_goal),)
3187include $(TOPDIR)development/build/tools/sdk_repo.mk
3188endif