Home | History | Annotate | Download | only in core
      1 # Put some miscellaneous rules here
      2 
      3 # Pick a reasonable string to use to identify files.
      4 ifneq "" "$(filter eng.%,$(BUILD_NUMBER))"
      5   # BUILD_NUMBER has a timestamp in it, which means that
      6   # it will change every time.  Pick a stable value.
      7   FILE_NAME_TAG := eng.$(USER)
      8 else
      9   FILE_NAME_TAG := $(BUILD_NUMBER)
     10 endif
     11 
     12 is_tests_build := $(filter tests,$(MAKECMDGOALS))
     13 
     14 # -----------------------------------------------------------------
     15 # Define rules to copy PRODUCT_COPY_FILES defined by the product.
     16 # PRODUCT_COPY_FILES contains words like <source file>:<dest file>.
     17 # <dest file> is relative to $(PRODUCT_OUT), so it should look like,
     18 # e.g., "system/etc/file.xml".
     19 # The filter part means "only eval the copy-one-file rule if this
     20 # src:dest pair is the first one to match the same dest"
     21 #$(1): the src:dest pair
     22 define check-product-copy-files
     23 $(if $(filter %.apk, $(1)),$(error \
     24     Prebuilt apk found in PRODUCT_COPY_FILES: $(1), use BUILD_PREBUILT instead!))
     25 endef
     26 unique_product_copy_files_destinations :=
     27 $(foreach cf,$(PRODUCT_COPY_FILES), \
     28     $(eval _src := $(call word-colon,1,$(cf))) \
     29     $(eval _dest := $(call word-colon,2,$(cf))) \
     30     $(call check-product-copy-files,$(cf)) \
     31     $(if $(filter $(unique_product_copy_files_destinations),$(_dest)), \
     32         $(info PRODUCT_COPY_FILES $(cf) ignored.), \
     33         $(eval _fulldest := $(call append-path,$(PRODUCT_OUT),$(_dest))) \
     34         $(if $(filter %.xml,$(_dest)),\
     35             $(eval $(call copy-xml-file-checked,$(_src),$(_fulldest))),\
     36             $(eval $(call copy-one-file,$(_src),$(_fulldest)))) \
     37         $(eval ALL_DEFAULT_INSTALLED_MODULES += $(_fulldest)) \
     38         $(eval unique_product_copy_files_destinations += $(_dest))))
     39 unique_product_copy_files_destinations :=
     40 
     41 # -----------------------------------------------------------------
     42 # docs/index.html
     43 ifeq (,$(TARGET_BUILD_APPS))
     44 gen := $(OUT_DOCS)/index.html
     45 ALL_DOCS += $(gen)
     46 $(gen): frameworks/base/docs/docs-redirect-index.html
     47 	@mkdir -p $(dir $@)
     48 	@cp -f $< $@
     49 endif
     50 
     51 # -----------------------------------------------------------------
     52 # default.prop
     53 INSTALLED_DEFAULT_PROP_TARGET := $(TARGET_ROOT_OUT)/default.prop
     54 ALL_DEFAULT_INSTALLED_MODULES += $(INSTALLED_DEFAULT_PROP_TARGET)
     55 ADDITIONAL_DEFAULT_PROPERTIES := \
     56     $(call collapse-pairs, $(ADDITIONAL_DEFAULT_PROPERTIES))
     57 ADDITIONAL_DEFAULT_PROPERTIES += \
     58     $(call collapse-pairs, $(PRODUCT_DEFAULT_PROPERTY_OVERRIDES))
     59 ADDITIONAL_DEFAULT_PROPERTIES := $(call uniq-pairs-by-first-component, \
     60     $(ADDITIONAL_DEFAULT_PROPERTIES),=)
     61 
     62 $(INSTALLED_DEFAULT_PROP_TARGET):
     63 	@echo Target buildinfo: $@
     64 	@mkdir -p $(dir $@)
     65 	$(hide) echo "#" > $@; \
     66 	        echo "# ADDITIONAL_DEFAULT_PROPERTIES" >> $@; \
     67 	        echo "#" >> $@;
     68 	$(hide) $(foreach line,$(ADDITIONAL_DEFAULT_PROPERTIES), \
     69 		echo "$(line)" >> $@;)
     70 	build/tools/post_process_props.py $@
     71 
     72 # -----------------------------------------------------------------
     73 # build.prop
     74 INSTALLED_BUILD_PROP_TARGET := $(TARGET_OUT)/build.prop
     75 ALL_DEFAULT_INSTALLED_MODULES += $(INSTALLED_BUILD_PROP_TARGET)
     76 ADDITIONAL_BUILD_PROPERTIES := \
     77     $(call collapse-pairs, $(ADDITIONAL_BUILD_PROPERTIES))
     78 ADDITIONAL_BUILD_PROPERTIES := $(call uniq-pairs-by-first-component, \
     79     $(ADDITIONAL_BUILD_PROPERTIES),=)
     80 
     81 # A list of arbitrary tags describing the build configuration.
     82 # Force ":=" so we can use +=
     83 BUILD_VERSION_TAGS := $(BUILD_VERSION_TAGS)
     84 ifeq ($(TARGET_BUILD_TYPE),debug)
     85   BUILD_VERSION_TAGS += debug
     86 endif
     87 # The "test-keys" tag marks builds signed with the old test keys,
     88 # which are available in the SDK.  "dev-keys" marks builds signed with
     89 # non-default dev keys (usually private keys from a vendor directory).
     90 # Both of these tags will be removed and replaced with "release-keys"
     91 # when the target-files is signed in a post-build step.
     92 ifeq ($(DEFAULT_SYSTEM_DEV_CERTIFICATE),build/target/product/security/testkey)
     93 BUILD_VERSION_TAGS += test-keys
     94 else
     95 BUILD_VERSION_TAGS += dev-keys
     96 endif
     97 BUILD_VERSION_TAGS := $(subst $(space),$(comma),$(sort $(BUILD_VERSION_TAGS)))
     98 
     99 # A human-readable string that descibes this build in detail.
    100 build_desc := $(TARGET_PRODUCT)-$(TARGET_BUILD_VARIANT) $(PLATFORM_VERSION) $(BUILD_ID) $(BUILD_NUMBER) $(BUILD_VERSION_TAGS)
    101 $(INSTALLED_BUILD_PROP_TARGET): PRIVATE_BUILD_DESC := $(build_desc)
    102 
    103 # The string used to uniquely identify this build;  used by the OTA server.
    104 ifeq (,$(strip $(BUILD_FINGERPRINT)))
    105   BUILD_FINGERPRINT := $(PRODUCT_BRAND)/$(TARGET_PRODUCT)/$(TARGET_DEVICE):$(PLATFORM_VERSION)/$(BUILD_ID)/$(BUILD_NUMBER):$(TARGET_BUILD_VARIANT)/$(BUILD_VERSION_TAGS)
    106 endif
    107 ifneq ($(words $(BUILD_FINGERPRINT)),1)
    108   $(error BUILD_FINGERPRINT cannot contain spaces: "$(BUILD_FINGERPRINT)")
    109 endif
    110 
    111 # Display parameters shown under Settings -> About Phone
    112 ifeq ($(TARGET_BUILD_VARIANT),user)
    113   # User builds should show:
    114   # release build number or branch.buld_number non-release builds
    115 
    116   # Dev. branches should have DISPLAY_BUILD_NUMBER set
    117   ifeq "true" "$(DISPLAY_BUILD_NUMBER)"
    118     BUILD_DISPLAY_ID := $(BUILD_ID).$(BUILD_NUMBER)
    119   else
    120     BUILD_DISPLAY_ID := $(BUILD_ID)
    121   endif
    122 else
    123   # Non-user builds should show detailed build information
    124   BUILD_DISPLAY_ID := $(build_desc)
    125 endif
    126 
    127 # Whether there is default locale set in PRODUCT_PROPERTY_OVERRIDES
    128 product_property_override_locale_language := $(strip \
    129     $(patsubst ro.product.locale.language=%,%,\
    130     $(filter ro.product.locale.language=%,$(PRODUCT_PROPERTY_OVERRIDES))))
    131 product_property_overrides_locale_region := $(strip \
    132     $(patsubst ro.product.locale.region=%,%,\
    133     $(filter ro.product.locale.region=%,$(PRODUCT_PROPERTY_OVERRIDES))))
    134 
    135 # Selects the first locale in the list given as the argument,
    136 # and splits it into language and region, which each may be
    137 # empty.
    138 define default-locale
    139 $(subst _, , $(firstword $(1)))
    140 endef
    141 
    142 # Selects the first locale in the list given as the argument
    143 # and returns the language (or the region), if it's not set in PRODUCT_PROPERTY_OVERRIDES;
    144 # Return empty string if it's already set in PRODUCT_PROPERTY_OVERRIDES.
    145 define default-locale-language
    146 $(if $(product_property_override_locale_language),,$(word 1, $(call default-locale, $(1))))
    147 endef
    148 define default-locale-region
    149 $(if $(product_property_overrides_locale_region),,$(word 2, $(call default-locale, $(1))))
    150 endef
    151 
    152 BUILDINFO_SH := build/tools/buildinfo.sh
    153 $(INSTALLED_BUILD_PROP_TARGET): $(BUILDINFO_SH) $(INTERNAL_BUILD_ID_MAKEFILE) $(BUILD_SYSTEM)/version_defaults.mk $(wildcard $(TARGET_DEVICE_DIR)/system.prop)
    154 	@echo Target buildinfo: $@
    155 	@mkdir -p $(dir $@)
    156 	$(hide) TARGET_BUILD_TYPE="$(TARGET_BUILD_VARIANT)" \
    157 			TARGET_DEVICE="$(TARGET_DEVICE)" \
    158 			PRODUCT_NAME="$(TARGET_PRODUCT)" \
    159 			PRODUCT_BRAND="$(PRODUCT_BRAND)" \
    160 			PRODUCT_DEFAULT_LANGUAGE="$(call default-locale-language,$(PRODUCT_LOCALES))" \
    161 			PRODUCT_DEFAULT_REGION="$(call default-locale-region,$(PRODUCT_LOCALES))" \
    162 			PRODUCT_DEFAULT_WIFI_CHANNELS="$(PRODUCT_DEFAULT_WIFI_CHANNELS)" \
    163 			PRODUCT_MODEL="$(PRODUCT_MODEL)" \
    164 			PRODUCT_MANUFACTURER="$(PRODUCT_MANUFACTURER)" \
    165 			PRIVATE_BUILD_DESC="$(PRIVATE_BUILD_DESC)" \
    166 			BUILD_ID="$(BUILD_ID)" \
    167 			BUILD_DISPLAY_ID="$(BUILD_DISPLAY_ID)" \
    168 			BUILD_NUMBER="$(BUILD_NUMBER)" \
    169 			PLATFORM_VERSION="$(PLATFORM_VERSION)" \
    170 			PLATFORM_SDK_VERSION="$(PLATFORM_SDK_VERSION)" \
    171 			PLATFORM_VERSION_CODENAME="$(PLATFORM_VERSION_CODENAME)" \
    172 			BUILD_VERSION_TAGS="$(BUILD_VERSION_TAGS)" \
    173 			TARGET_BOOTLOADER_BOARD_NAME="$(TARGET_BOOTLOADER_BOARD_NAME)" \
    174 			BUILD_FINGERPRINT="$(BUILD_FINGERPRINT)" \
    175 			TARGET_BOARD_PLATFORM="$(TARGET_BOARD_PLATFORM)" \
    176 			TARGET_CPU_ABI="$(TARGET_CPU_ABI)" \
    177 			TARGET_CPU_ABI2="$(TARGET_CPU_ABI2)" \
    178 			TARGET_AAPT_CHARACTERISTICS="$(TARGET_AAPT_CHARACTERISTICS)" \
    179 	        bash $(BUILDINFO_SH) > $@
    180 	$(hide) if [ -f $(TARGET_DEVICE_DIR)/system.prop ]; then \
    181 	          cat $(TARGET_DEVICE_DIR)/system.prop >> $@; \
    182 	        fi
    183 	$(if $(ADDITIONAL_BUILD_PROPERTIES), \
    184 		$(hide) echo >> $@; \
    185 		        echo "#" >> $@; \
    186 		        echo "# ADDITIONAL_BUILD_PROPERTIES" >> $@; \
    187 		        echo "#" >> $@; )
    188 	$(hide) $(foreach line,$(ADDITIONAL_BUILD_PROPERTIES), \
    189 		echo "$(line)" >> $@;)
    190 	$(hide) build/tools/post_process_props.py $@
    191 
    192 build_desc :=
    193 
    194 # -----------------------------------------------------------------
    195 # sdk-build.prop
    196 #
    197 # There are certain things in build.prop that we don't want to
    198 # ship with the sdk; remove them.
    199 
    200 # This must be a list of entire property keys followed by
    201 # "=" characters, without any internal spaces.
    202 sdk_build_prop_remove := \
    203 	ro.build.user= \
    204 	ro.build.host= \
    205 	ro.product.brand= \
    206 	ro.product.manufacturer= \
    207 	ro.product.device=
    208 # TODO: Remove this soon-to-be obsolete property
    209 sdk_build_prop_remove += ro.build.product=
    210 INSTALLED_SDK_BUILD_PROP_TARGET := $(PRODUCT_OUT)/sdk/sdk-build.prop
    211 $(INSTALLED_SDK_BUILD_PROP_TARGET): $(INSTALLED_BUILD_PROP_TARGET)
    212 	@echo SDK buildinfo: $@
    213 	@mkdir -p $(dir $@)
    214 	$(hide) grep -v "$(subst $(space),\|,$(strip \
    215 				$(sdk_build_prop_remove)))" $< > $@.tmp
    216 	$(hide) for x in $(sdk_build_prop_remove); do \
    217 				echo "$$x"generic >> $@.tmp; done
    218 	$(hide) mv $@.tmp $@
    219 
    220 # -----------------------------------------------------------------
    221 # package stats
    222 PACKAGE_STATS_FILE := $(PRODUCT_OUT)/package-stats.txt
    223 PACKAGES_TO_STAT := \
    224     $(sort $(filter $(TARGET_OUT)/% $(TARGET_OUT_DATA)/%, \
    225 	$(filter %.jar %.apk, $(ALL_DEFAULT_INSTALLED_MODULES))))
    226 $(PACKAGE_STATS_FILE): $(PACKAGES_TO_STAT)
    227 	@echo Package stats: $@
    228 	@mkdir -p $(dir $@)
    229 	$(hide) rm -f $@
    230 	$(hide) build/tools/dump-package-stats $^ > $@
    231 
    232 .PHONY: package-stats
    233 package-stats: $(PACKAGE_STATS_FILE)
    234 
    235 # -----------------------------------------------------------------
    236 # Cert-to-package mapping.  Used by the post-build signing tools.
    237 name := $(TARGET_PRODUCT)
    238 ifeq ($(TARGET_BUILD_TYPE),debug)
    239   name := $(name)_debug
    240 endif
    241 name := $(name)-apkcerts-$(FILE_NAME_TAG)
    242 intermediates := \
    243 	$(call intermediates-dir-for,PACKAGING,apkcerts)
    244 APKCERTS_FILE := $(intermediates)/$(name).txt
    245 # We don't need to really build all the modules.
    246 # TODO: rebuild APKCERTS_FILE if any app change its cert.
    247 $(APKCERTS_FILE):
    248 	@echo APK certs list: $@
    249 	@mkdir -p $(dir $@)
    250 	@rm -f $@
    251 	$(hide) $(foreach p,$(PACKAGES),\
    252           $(if $(PACKAGES.$(p).EXTERNAL_KEY),\
    253 	    echo 'name="$(p).apk" certificate="EXTERNAL" \
    254 	         private_key=""' >> $@;,\
    255 	    echo 'name="$(p).apk" certificate="$(PACKAGES.$(p).CERTIFICATE)" \
    256 	         private_key="$(PACKAGES.$(p).PRIVATE_KEY)"' >> $@;))
    257 	# In case $(PACKAGES) is empty.
    258 	$(hide) touch $@
    259 
    260 .PHONY: apkcerts-list
    261 apkcerts-list: $(APKCERTS_FILE)
    262 
    263 ifneq (,$(TARGET_BUILD_APPS))
    264   $(call dist-for-goals, apps_only, $(APKCERTS_FILE):apkcerts.txt)
    265 endif
    266 
    267 # -----------------------------------------------------------------
    268 # module info file
    269 ifdef CREATE_MODULE_INFO_FILE
    270   MODULE_INFO_FILE := $(PRODUCT_OUT)/module-info.txt
    271   $(info Generating $(MODULE_INFO_FILE)...)
    272   $(shell rm -f $(MODULE_INFO_FILE))
    273   $(foreach m,$(ALL_MODULES), \
    274     $(shell echo "NAME=\"$(m)\"" \
    275 	"PATH=\"$(strip $(ALL_MODULES.$(m).PATH))\"" \
    276 	"TAGS=\"$(strip $(filter-out _%,$(ALL_MODULES.$(m).TAGS)))\"" \
    277 	"BUILT=\"$(strip $(ALL_MODULES.$(m).BUILT))\"" \
    278 	"INSTALLED=\"$(strip $(ALL_MODULES.$(m).INSTALLED))\"" >> $(MODULE_INFO_FILE)))
    279 endif
    280 
    281 # -----------------------------------------------------------------
    282 
    283 # The dev key is used to sign this package, and as the key required
    284 # for future OTA packages installed by this system.  Actual product
    285 # deliverables will be re-signed by hand.  We expect this file to
    286 # exist with the suffixes ".x509.pem" and ".pk8".
    287 DEFAULT_KEY_CERT_PAIR := $(DEFAULT_SYSTEM_DEV_CERTIFICATE)
    288 
    289 
    290 # Rules that need to be present for the all targets, even
    291 # if they don't do anything.
    292 .PHONY: systemimage
    293 systemimage:
    294 
    295 # -----------------------------------------------------------------
    296 
    297 .PHONY: event-log-tags
    298 
    299 # Produce an event logs tag file for everything we know about, in order
    300 # to properly allocate numbers.  Then produce a file that's filtered
    301 # for what's going to be installed.
    302 
    303 all_event_log_tags_file := $(TARGET_OUT_COMMON_INTERMEDIATES)/all-event-log-tags.txt
    304 
    305 event_log_tags_file := $(TARGET_OUT)/etc/event-log-tags
    306 
    307 # Include tags from all packages that we know about
    308 all_event_log_tags_src := \
    309     $(sort $(foreach m, $(ALL_MODULES), $(ALL_MODULES.$(m).EVENT_LOG_TAGS)))
    310 
    311 # PDK builds will already have a full list of tags that needs to get merged
    312 # in with the ones from source
    313 pdk_fusion_log_tags_file := $(patsubst $(PRODUCT_OUT)/%,$(_pdk_fusion_intermediates)/%,$(filter $(event_log_tags_file),$(ALL_PDK_FUSION_FILES)))
    314 
    315 $(all_event_log_tags_file): PRIVATE_SRC_FILES := $(all_event_log_tags_src) $(pdk_fusion_log_tags_file)
    316 $(all_event_log_tags_file): $(all_event_log_tags_src) $(pdk_fusion_log_tags_file)
    317 	$(hide) mkdir -p $(dir $@)
    318 	$(hide) build/tools/merge-event-log-tags.py -o $@ $(PRIVATE_SRC_FILES)
    319 
    320 # Include tags from all packages included in this product, plus all
    321 # tags that are part of the system (ie, not in a vendor/ or device/
    322 # directory).
    323 event_log_tags_src := \
    324     $(sort $(foreach m,\
    325       $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_PACKAGES) \
    326       $(call module-names-for-tag-list,user), \
    327       $(ALL_MODULES.$(m).EVENT_LOG_TAGS)) \
    328       $(filter-out vendor/% device/% out/%,$(all_event_log_tags_src)))
    329 
    330 $(event_log_tags_file): PRIVATE_SRC_FILES := $(event_log_tags_src) $(pdk_fusion_log_tags_file)
    331 $(event_log_tags_file): PRIVATE_MERGED_FILE := $(all_event_log_tags_file)
    332 $(event_log_tags_file): $(event_log_tags_src) $(all_event_log_tags_file) $(pdk_fusion_log_tags_file)
    333 	$(hide) mkdir -p $(dir $@)
    334 	$(hide) build/tools/merge-event-log-tags.py -o $@ -m $(PRIVATE_MERGED_FILE) $(PRIVATE_SRC_FILES)
    335 
    336 event-log-tags: $(event_log_tags_file)
    337 
    338 ALL_DEFAULT_INSTALLED_MODULES += $(event_log_tags_file)
    339 
    340 
    341 # #################################################################
    342 # Targets for boot/OS images
    343 # #################################################################
    344 
    345 # -----------------------------------------------------------------
    346 # the ramdisk
    347 INTERNAL_RAMDISK_FILES := $(filter $(TARGET_ROOT_OUT)/%, \
    348 	$(ALL_PREBUILT) \
    349 	$(ALL_COPIED_HEADERS) \
    350 	$(ALL_GENERATED_SOURCES) \
    351 	$(ALL_DEFAULT_INSTALLED_MODULES))
    352 
    353 BUILT_RAMDISK_TARGET := $(PRODUCT_OUT)/ramdisk.img
    354 
    355 ifeq ($(HAVE_SELINUX),true)
    356 SELINUX_DEPENDS := sepolicy file_contexts seapp_contexts
    357 endif
    358 
    359 # We just build this directly to the install location.
    360 INSTALLED_RAMDISK_TARGET := $(BUILT_RAMDISK_TARGET)
    361 $(INSTALLED_RAMDISK_TARGET): $(MKBOOTFS) $(INTERNAL_RAMDISK_FILES) $(SELINUX_DEPENDS) | $(MINIGZIP)
    362 	$(call pretty,"Target ram disk: $@")
    363 	$(hide) $(MKBOOTFS) $(TARGET_ROOT_OUT) | $(MINIGZIP) > $@
    364 
    365 
    366 ifneq ($(strip $(TARGET_NO_KERNEL)),true)
    367 
    368 # -----------------------------------------------------------------
    369 # the boot image, which is a collection of other images.
    370 INTERNAL_BOOTIMAGE_ARGS := \
    371 	$(addprefix --second ,$(INSTALLED_2NDBOOTLOADER_TARGET)) \
    372 	--kernel $(INSTALLED_KERNEL_TARGET) \
    373 	--ramdisk $(INSTALLED_RAMDISK_TARGET)
    374 
    375 INTERNAL_BOOTIMAGE_FILES := $(filter-out --%,$(INTERNAL_BOOTIMAGE_ARGS))
    376 
    377 BOARD_KERNEL_CMDLINE := $(strip $(BOARD_KERNEL_CMDLINE))
    378 ifdef BOARD_KERNEL_CMDLINE
    379   INTERNAL_BOOTIMAGE_ARGS += --cmdline "$(BOARD_KERNEL_CMDLINE)"
    380 endif
    381 
    382 BOARD_KERNEL_BASE := $(strip $(BOARD_KERNEL_BASE))
    383 ifdef BOARD_KERNEL_BASE
    384   INTERNAL_BOOTIMAGE_ARGS += --base $(BOARD_KERNEL_BASE)
    385 endif
    386 
    387 BOARD_KERNEL_PAGESIZE := $(strip $(BOARD_KERNEL_PAGESIZE))
    388 ifdef BOARD_KERNEL_PAGESIZE
    389   INTERNAL_BOOTIMAGE_ARGS += --pagesize $(BOARD_KERNEL_PAGESIZE)
    390 endif
    391 
    392 INSTALLED_BOOTIMAGE_TARGET := $(PRODUCT_OUT)/boot.img
    393 
    394 ifeq ($(TARGET_BOOTIMAGE_USE_EXT2),true)
    395 tmp_dir_for_image := $(call intermediates-dir-for,EXECUTABLES,boot_img)/bootimg
    396 INTERNAL_BOOTIMAGE_ARGS += --tmpdir $(tmp_dir_for_image)
    397 INTERNAL_BOOTIMAGE_ARGS += --genext2fs $(MKEXT2IMG)
    398 $(INSTALLED_BOOTIMAGE_TARGET): $(MKEXT2IMG) $(INTERNAL_BOOTIMAGE_FILES)
    399 	$(call pretty,"Target boot image: $@")
    400 	$(hide) $(MKEXT2BOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) --output $@
    401 
    402 else # TARGET_BOOTIMAGE_USE_EXT2 != true
    403 
    404 $(INSTALLED_BOOTIMAGE_TARGET): $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_FILES)
    405 	$(call pretty,"Target boot image: $@")
    406 	$(hide) $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) --output $@
    407 	$(hide) $(call assert-max-image-size,$@,$(BOARD_BOOTIMAGE_PARTITION_SIZE),raw)
    408 endif # TARGET_BOOTIMAGE_USE_EXT2
    409 
    410 else	# TARGET_NO_KERNEL
    411 # HACK: The top-level targets depend on the bootimage.  Not all targets
    412 # can produce a bootimage, though, and emulator targets need the ramdisk
    413 # instead.  Fake it out by calling the ramdisk the bootimage.
    414 # TODO: make the emulator use bootimages, and make mkbootimg accept
    415 #       kernel-less inputs.
    416 INSTALLED_BOOTIMAGE_TARGET := $(INSTALLED_RAMDISK_TARGET)
    417 endif
    418 
    419 # -----------------------------------------------------------------
    420 # NOTICE files
    421 #
    422 # We are required to publish the licenses for all code under BSD, GPL and
    423 # Apache licenses (and possibly other more exotic ones as well). We err on the
    424 # side of caution, so the licenses for other third-party code are included here
    425 # too.
    426 #
    427 # This needs to be before the systemimage rules, because it adds to
    428 # ALL_DEFAULT_INSTALLED_MODULES, which those use to pick which files
    429 # go into the systemimage.
    430 
    431 .PHONY: notice_files
    432 
    433 # Create the rule to combine the files into text and html forms
    434 # $(1) - Plain text output file
    435 # $(2) - HTML output file
    436 # $(3) - File title
    437 # $(4) - Directory to use.  Notice files are all $(4)/src.  Other
    438 #		 directories in there will be used for scratch
    439 # $(5) - Dependencies for the output files
    440 #
    441 # The algorithm here is that we go collect a hash for each of the notice
    442 # files and write the names of the files that match that hash.  Then
    443 # to generate the real files, we go print out all of the files and their
    444 # hashes.
    445 #
    446 # These rules are fairly complex, so they depend on this makefile so if
    447 # it changes, they'll run again.
    448 #
    449 # TODO: We could clean this up so that we just record the locations of the
    450 # original notice files instead of making rules to copy them somwehere.
    451 # Then we could traverse that without quite as much bash drama.
    452 define combine-notice-files
    453 $(1) $(2): PRIVATE_MESSAGE := $(3)
    454 $(1) $(2): PRIVATE_DIR := $(4)
    455 $(1) : $(2)
    456 $(2) : $(5) $(BUILD_SYSTEM)/Makefile build/tools/generate-notice-files.py
    457 	build/tools/generate-notice-files.py $(1) $(2) $$(PRIVATE_MESSAGE) $$(PRIVATE_DIR)/src
    458 notice_files: $(1) $(2)
    459 endef
    460 
    461 # TODO These intermediate NOTICE.txt/NOTICE.html files should go into
    462 # TARGET_OUT_NOTICE_FILES now that the notice files are gathered from
    463 # the src subdirectory.
    464 
    465 target_notice_file_txt := $(TARGET_OUT_INTERMEDIATES)/NOTICE.txt
    466 target_notice_file_html := $(TARGET_OUT_INTERMEDIATES)/NOTICE.html
    467 target_notice_file_html_gz := $(TARGET_OUT_INTERMEDIATES)/NOTICE.html.gz
    468 tools_notice_file_txt := $(HOST_OUT_INTERMEDIATES)/NOTICE.txt
    469 tools_notice_file_html := $(HOST_OUT_INTERMEDIATES)/NOTICE.html
    470 
    471 kernel_notice_file := $(TARGET_OUT_NOTICE_FILES)/src/kernel.txt
    472 pdk_fusion_notice_files := $(filter $(TARGET_OUT_NOTICE_FILES)/%, $(ALL_PDK_FUSION_FILES))
    473 
    474 $(eval $(call combine-notice-files, \
    475 			$(target_notice_file_txt), \
    476 			$(target_notice_file_html), \
    477 			"Notices for files contained in the filesystem images in this directory:", \
    478 			$(TARGET_OUT_NOTICE_FILES), \
    479 			$(ALL_DEFAULT_INSTALLED_MODULES) $(kernel_notice_file) $(pdk_fusion_notice_files)))
    480 
    481 $(eval $(call combine-notice-files, \
    482 			$(tools_notice_file_txt), \
    483 			$(tools_notice_file_html), \
    484 			"Notices for files contained in the tools directory:", \
    485 			$(HOST_OUT_NOTICE_FILES), \
    486 			$(ALL_DEFAULT_INSTALLED_MODULES)))
    487 
    488 # Install the html file at /system/etc/NOTICE.html.gz.
    489 # This is not ideal, but this is very late in the game, after a lot of
    490 # the module processing has already been done -- in fact, we used the
    491 # fact that all that has been done to get the list of modules that we
    492 # need notice files for.
    493 $(target_notice_file_html_gz): $(target_notice_file_html) | $(MINIGZIP)
    494 	$(hide) $(MINIGZIP) -9 < $< > $@
    495 installed_notice_html_gz := $(TARGET_OUT)/etc/NOTICE.html.gz
    496 $(installed_notice_html_gz): $(target_notice_file_html_gz) | $(ACP)
    497 	$(copy-file-to-target)
    498 
    499 # if we've been run my mm, mmm, etc, don't reinstall this every time
    500 ifeq ($(ONE_SHOT_MAKEFILE),)
    501 ALL_DEFAULT_INSTALLED_MODULES += $(installed_notice_html_gz)
    502 endif
    503 
    504 # The kernel isn't really a module, so to get its module file in there, we
    505 # make the target NOTICE files depend on this particular file too, which will
    506 # then be in the right directory for the find in combine-notice-files to work.
    507 $(kernel_notice_file): \
    508 	    prebuilts/qemu-kernel/arm/LINUX_KERNEL_COPYING \
    509 	    | $(ACP)
    510 	@echo Copying: $@
    511 	$(hide) mkdir -p $(dir $@)
    512 	$(hide) $(ACP) $< $@
    513 
    514 
    515 # -----------------------------------------------------------------
    516 # Build a keystore with the authorized keys in it, used to verify the
    517 # authenticity of downloaded OTA packages.
    518 #
    519 # This rule adds to ALL_DEFAULT_INSTALLED_MODULES, so it needs to come
    520 # before the rules that use that variable to build the image.
    521 ALL_DEFAULT_INSTALLED_MODULES += $(TARGET_OUT_ETC)/security/otacerts.zip
    522 $(TARGET_OUT_ETC)/security/otacerts.zip: KEY_CERT_PAIR := $(DEFAULT_KEY_CERT_PAIR)
    523 $(TARGET_OUT_ETC)/security/otacerts.zip: $(addsuffix .x509.pem,$(DEFAULT_KEY_CERT_PAIR))
    524 	$(hide) rm -f $@
    525 	$(hide) mkdir -p $(dir $@)
    526 	$(hide) zip -qj $@ $<
    527 
    528 .PHONY: otacerts
    529 otacerts: $(TARGET_OUT_ETC)/security/otacerts.zip
    530 
    531 
    532 # #################################################################
    533 # Targets for user images
    534 # #################################################################
    535 
    536 INTERNAL_USERIMAGES_EXT_VARIANT :=
    537 ifeq ($(TARGET_USERIMAGES_USE_EXT2),true)
    538 INTERNAL_USERIMAGES_USE_EXT := true
    539 INTERNAL_USERIMAGES_EXT_VARIANT := ext2
    540 else
    541 ifeq ($(TARGET_USERIMAGES_USE_EXT3),true)
    542 INTERNAL_USERIMAGES_USE_EXT := true
    543 INTERNAL_USERIMAGES_EXT_VARIANT := ext3
    544 else
    545 ifeq ($(TARGET_USERIMAGES_USE_EXT4),true)
    546 INTERNAL_USERIMAGES_USE_EXT := true
    547 INTERNAL_USERIMAGES_EXT_VARIANT := ext4
    548 endif
    549 endif
    550 endif
    551 
    552 ifneq (true,$(TARGET_USERIMAGES_SPARSE_EXT_DISABLED))
    553   INTERNAL_USERIMAGES_SPARSE_EXT_FLAG := -s
    554 endif
    555 
    556 ifeq ($(INTERNAL_USERIMAGES_USE_EXT),true)
    557 INTERNAL_USERIMAGES_DEPS := $(MKEXTUSERIMG) $(MAKE_EXT4FS)
    558 else
    559 INTERNAL_USERIMAGES_DEPS := $(MKYAFFS2)
    560 endif
    561 INTERNAL_USERIMAGES_BINARY_PATHS := $(sort $(dir $(INTERNAL_USERIMAGES_DEPS)))
    562 
    563 # $(1): the path of the output dictionary file
    564 define generate-userimage-prop-dictionary
    565 $(if $(INTERNAL_USERIMAGES_EXT_VARIANT),$(hide) echo "fs_type=$(INTERNAL_USERIMAGES_EXT_VARIANT)" >> $(1))
    566 $(if $(BOARD_SYSTEMIMAGE_PARTITION_SIZE),$(hide) echo "system_size=$(BOARD_SYSTEMIMAGE_PARTITION_SIZE)" >> $(1))
    567 $(if $(BOARD_USERDATAIMAGE_PARTITION_SIZE),$(hide) echo "userdata_size=$(BOARD_USERDATAIMAGE_PARTITION_SIZE)" >> $(1))
    568 $(if $(BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE),$(hide) echo "cache_fs_type=$(BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE)" >> $(1))
    569 $(if $(BOARD_CACHEIMAGE_PARTITION_SIZE),$(hide) echo "cache_size=$(BOARD_CACHEIMAGE_PARTITION_SIZE)" >> $(1))
    570 $(if $(INTERNAL_USERIMAGES_SPARSE_EXT_FLAG),$(hide) echo "extfs_sparse_flag=$(INTERNAL_USERIMAGES_SPARSE_EXT_FLAG)" >> $(1))
    571 $(if $(mkyaffs2_extra_flags),$(hide) echo "mkyaffs2_extra_flags=$(mkyaffs2_extra_flags)" >> $(1))
    572 $(if $(filter true, $(strip $(HAVE_SELINUX))), echo "selinux_fc=$(TARGET_ROOT_OUT)/file_contexts" >> $(1))
    573 endef
    574 
    575 # -----------------------------------------------------------------
    576 # Recovery image
    577 
    578 # If neither TARGET_NO_KERNEL nor TARGET_NO_RECOVERY are true
    579 ifeq (,$(filter true, $(TARGET_NO_KERNEL) $(TARGET_NO_RECOVERY) $(BUILD_TINY_ANDROID)))
    580 
    581 INSTALLED_RECOVERYIMAGE_TARGET := $(PRODUCT_OUT)/recovery.img
    582 
    583 recovery_initrc := $(call include-path-for, recovery)/etc/init.rc
    584 recovery_kernel := $(INSTALLED_KERNEL_TARGET) # same as a non-recovery system
    585 recovery_ramdisk := $(PRODUCT_OUT)/ramdisk-recovery.img
    586 recovery_build_prop := $(INSTALLED_BUILD_PROP_TARGET)
    587 recovery_binary := $(call intermediates-dir-for,EXECUTABLES,recovery)/recovery
    588 recovery_resources_common := $(call include-path-for, recovery)/res
    589 recovery_resources_private := $(strip $(wildcard $(TARGET_DEVICE_DIR)/recovery/res))
    590 recovery_resource_deps := $(shell find $(recovery_resources_common) \
    591   $(recovery_resources_private) -type f)
    592 recovery_fstab := $(strip $(wildcard $(TARGET_DEVICE_DIR)/recovery.fstab))
    593 
    594 ifeq ($(recovery_resources_private),)
    595   $(info No private recovery resources for TARGET_DEVICE $(TARGET_DEVICE))
    596 endif
    597 
    598 ifeq ($(recovery_fstab),)
    599   $(info No recovery.fstab for TARGET_DEVICE $(TARGET_DEVICE))
    600 endif
    601 
    602 INTERNAL_RECOVERYIMAGE_ARGS := \
    603 	$(addprefix --second ,$(INSTALLED_2NDBOOTLOADER_TARGET)) \
    604 	--kernel $(recovery_kernel) \
    605 	--ramdisk $(recovery_ramdisk)
    606 
    607 # Assumes this has already been stripped
    608 ifdef BOARD_KERNEL_CMDLINE
    609   INTERNAL_RECOVERYIMAGE_ARGS += --cmdline "$(BOARD_KERNEL_CMDLINE)"
    610 endif
    611 ifdef BOARD_KERNEL_BASE
    612   INTERNAL_RECOVERYIMAGE_ARGS += --base $(BOARD_KERNEL_BASE)
    613 endif
    614 BOARD_KERNEL_PAGESIZE := $(strip $(BOARD_KERNEL_PAGESIZE))
    615 ifdef BOARD_KERNEL_PAGESIZE
    616   INTERNAL_RECOVERYIMAGE_ARGS += --pagesize $(BOARD_KERNEL_PAGESIZE)
    617 endif
    618 
    619 # Keys authorized to sign OTA packages this build will accept.  The
    620 # build always uses dev-keys for this; release packaging tools will
    621 # substitute other keys for this one.
    622 OTA_PUBLIC_KEYS := $(DEFAULT_SYSTEM_DEV_CERTIFICATE).x509.pem
    623 
    624 # Generate a file containing the keys that will be read by the
    625 # recovery binary.
    626 RECOVERY_INSTALL_OTA_KEYS := \
    627 	$(call intermediates-dir-for,PACKAGING,ota_keys)/keys
    628 DUMPKEY_JAR := $(HOST_OUT_JAVA_LIBRARIES)/dumpkey.jar
    629 $(RECOVERY_INSTALL_OTA_KEYS): PRIVATE_OTA_PUBLIC_KEYS := $(OTA_PUBLIC_KEYS)
    630 $(RECOVERY_INSTALL_OTA_KEYS): extra_keys := $(patsubst %,%.x509.pem,$(PRODUCT_EXTRA_RECOVERY_KEYS))
    631 $(RECOVERY_INSTALL_OTA_KEYS): $(OTA_PUBLIC_KEYS) $(DUMPKEY_JAR) $(extra_keys)
    632 	@echo "DumpPublicKey: $@ <= $(PRIVATE_OTA_PUBLIC_KEYS) $(extra_keys)"
    633 	@rm -rf $@
    634 	@mkdir -p $(dir $@)
    635 	java -jar $(DUMPKEY_JAR) $(PRIVATE_OTA_PUBLIC_KEYS) $(extra_keys) > $@
    636 
    637 $(INSTALLED_RECOVERYIMAGE_TARGET): $(MKBOOTFS) $(MKBOOTIMG) $(MINIGZIP) \
    638 		$(INSTALLED_RAMDISK_TARGET) \
    639 		$(INSTALLED_BOOTIMAGE_TARGET) \
    640 		$(recovery_binary) \
    641 		$(recovery_initrc) $(recovery_kernel) \
    642 		$(INSTALLED_2NDBOOTLOADER_TARGET) \
    643 		$(recovery_build_prop) $(recovery_resource_deps) \
    644 		$(recovery_fstab) \
    645 		$(RECOVERY_INSTALL_OTA_KEYS)
    646 	@echo ----- Making recovery image ------
    647 	rm -rf $(TARGET_RECOVERY_OUT)
    648 	mkdir -p $(TARGET_RECOVERY_OUT)
    649 	mkdir -p $(TARGET_RECOVERY_ROOT_OUT)
    650 	mkdir -p $(TARGET_RECOVERY_ROOT_OUT)/etc
    651 	mkdir -p $(TARGET_RECOVERY_ROOT_OUT)/tmp
    652 	echo Copying baseline ramdisk...
    653 	cp -R $(TARGET_ROOT_OUT) $(TARGET_RECOVERY_OUT)
    654 	rm $(TARGET_RECOVERY_ROOT_OUT)/init*.rc
    655 	echo Modifying ramdisk contents...
    656 	cp -f $(recovery_initrc) $(TARGET_RECOVERY_ROOT_OUT)/
    657 	cp -f $(recovery_binary) $(TARGET_RECOVERY_ROOT_OUT)/sbin/
    658 	cp -rf $(recovery_resources_common) $(TARGET_RECOVERY_ROOT_OUT)/
    659 	$(foreach item,$(recovery_resources_private), \
    660 	  cp -rf $(item) $(TARGET_RECOVERY_ROOT_OUT)/)
    661 	$(foreach item,$(recovery_fstab), \
    662 	  cp -f $(item) $(TARGET_RECOVERY_ROOT_OUT)/etc/recovery.fstab)
    663 	cp $(RECOVERY_INSTALL_OTA_KEYS) $(TARGET_RECOVERY_ROOT_OUT)/res/keys
    664 	cat $(INSTALLED_DEFAULT_PROP_TARGET) $(recovery_build_prop) \
    665 	        > $(TARGET_RECOVERY_ROOT_OUT)/default.prop
    666 	$(MKBOOTFS) $(TARGET_RECOVERY_ROOT_OUT) | $(MINIGZIP) > $(recovery_ramdisk)
    667 	$(MKBOOTIMG) $(INTERNAL_RECOVERYIMAGE_ARGS) --output $@
    668 	@echo ----- Made recovery image -------- $@
    669 	$(hide) $(call assert-max-image-size,$@,$(BOARD_RECOVERYIMAGE_PARTITION_SIZE),raw)
    670 
    671 else
    672 INSTALLED_RECOVERYIMAGE_TARGET :=
    673 endif
    674 
    675 .PHONY: recoveryimage
    676 recoveryimage: $(INSTALLED_RECOVERYIMAGE_TARGET)
    677 
    678 ifneq ($(BOARD_NAND_PAGE_SIZE),)
    679 mkyaffs2_extra_flags := -c $(BOARD_NAND_PAGE_SIZE)
    680 else
    681 mkyaffs2_extra_flags :=
    682 BOARD_NAND_PAGE_SIZE := 2048
    683 endif
    684 
    685 ifneq ($(BOARD_NAND_SPARE_SIZE),)
    686 mkyaffs2_extra_flags += -s $(BOARD_NAND_SPARE_SIZE)
    687 else
    688 BOARD_NAND_SPARE_SIZE := 64
    689 endif
    690 
    691 # -----------------------------------------------------------------
    692 # system image
    693 #
    694 
    695 INTERNAL_SYSTEMIMAGE_FILES := $(filter $(TARGET_OUT)/%, \
    696     $(ALL_PREBUILT) \
    697     $(ALL_COPIED_HEADERS) \
    698     $(ALL_GENERATED_SOURCES) \
    699     $(ALL_DEFAULT_INSTALLED_MODULES)\
    700     $(ALL_PDK_FUSION_FILES))
    701 
    702 ifdef is_tests_build
    703 # We don't want to install tests modules to the system partition
    704 # when building "tests", because now "tests" may be built in a user, userdebug
    705 # or eng build variant and we don't want to pollute the system partition.
    706 # INTERNAL_SYSTEMIMAGE_FILES += $(filter $(TARGET_OUT)/%, \
    707 #    $(tests_MODULES))
    708 endif
    709 
    710 FULL_SYSTEMIMAGE_DEPS := $(INTERNAL_SYSTEMIMAGE_FILES) $(INTERNAL_USERIMAGES_DEPS) $(SELINUX_DEPENDS)
    711 # -----------------------------------------------------------------
    712 # installed file list
    713 # Depending on anything that $(BUILT_SYSTEMIMAGE) depends on.
    714 # We put installed-files.txt ahead of image itself in the dependency graph
    715 # so that we can get the size stat even if the build fails due to too large
    716 # system image.
    717 INSTALLED_FILES_FILE := $(PRODUCT_OUT)/installed-files.txt
    718 $(INSTALLED_FILES_FILE): $(FULL_SYSTEMIMAGE_DEPS)
    719 	@echo Installed file list: $@
    720 	@mkdir -p $(dir $@)
    721 	@rm -f $@
    722 	$(hide) build/tools/fileslist.py $(TARGET_OUT) > $@
    723 
    724 .PHONY: installed-file-list
    725 installed-file-list: $(INSTALLED_FILES_FILE)
    726 ifneq ($(filter sdk win_sdk,$(MAKECMDGOALS)),)
    727 $(call dist-for-goals, sdk win_sdk, $(INSTALLED_FILES_FILE))
    728 endif
    729 ifneq ($(filter sdk_addon,$(MAKECMDGOALS)),)
    730 $(call dist-for-goals, sdk_addon, $(INSTALLED_FILES_FILE))
    731 endif
    732 
    733 systemimage_intermediates := \
    734     $(call intermediates-dir-for,PACKAGING,systemimage)
    735 BUILT_SYSTEMIMAGE := $(systemimage_intermediates)/system.img
    736 
    737 # $(1): output file
    738 define build-systemimage-target
    739   @echo "Target system fs image: $(1)"
    740   @mkdir -p $(dir $(1)) $(systemimage_intermediates) && rm -rf $(systemimage_intermediates)/system_image_info.txt
    741   $(call generate-userimage-prop-dictionary, $(systemimage_intermediates)/system_image_info.txt)
    742   $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH \
    743       ./build/tools/releasetools/build_image.py \
    744       $(TARGET_OUT) $(systemimage_intermediates)/system_image_info.txt $(1)
    745 endef
    746 
    747 $(BUILT_SYSTEMIMAGE): $(FULL_SYSTEMIMAGE_DEPS) $(INSTALLED_FILES_FILE)
    748 	$(call build-systemimage-target,$@)
    749 
    750 INSTALLED_SYSTEMIMAGE := $(PRODUCT_OUT)/system.img
    751 SYSTEMIMAGE_SOURCE_DIR := $(TARGET_OUT)
    752 
    753 # The system partition needs room for the recovery image as well.  We
    754 # now store the recovery image as a binary patch using the boot image
    755 # as the source (since they are very similar).  Generate the patch so
    756 # we can see how big it's going to be, and include that in the system
    757 # image size check calculation.
    758 ifneq ($(INSTALLED_RECOVERYIMAGE_TARGET),)
    759 intermediates := $(call intermediates-dir-for,PACKAGING,recovery_patch)
    760 RECOVERY_FROM_BOOT_PATCH := $(intermediates)/recovery_from_boot.p
    761 $(RECOVERY_FROM_BOOT_PATCH): $(INSTALLED_RECOVERYIMAGE_TARGET) \
    762                              $(INSTALLED_BOOTIMAGE_TARGET) \
    763 			     $(HOST_OUT_EXECUTABLES)/imgdiff \
    764 	                     $(HOST_OUT_EXECUTABLES)/bsdiff
    765 	@echo "Construct recovery from boot"
    766 	mkdir -p $(dir $@)
    767 	PATH=$(HOST_OUT_EXECUTABLES):$$PATH $(HOST_OUT_EXECUTABLES)/imgdiff $(INSTALLED_BOOTIMAGE_TARGET) $(INSTALLED_RECOVERYIMAGE_TARGET) $@
    768 endif
    769 
    770 
    771 $(INSTALLED_SYSTEMIMAGE): $(BUILT_SYSTEMIMAGE) $(RECOVERY_FROM_BOOT_PATCH) | $(ACP)
    772 	@echo "Install system fs image: $@"
    773 	$(copy-file-to-target)
    774 	$(hide) $(call assert-max-image-size,$@ $(RECOVERY_FROM_BOOT_PATCH),$(BOARD_SYSTEMIMAGE_PARTITION_SIZE),yaffs)
    775 
    776 systemimage: $(INSTALLED_SYSTEMIMAGE)
    777 
    778 .PHONY: systemimage-nodeps snod
    779 systemimage-nodeps snod: $(filter-out systemimage-nodeps snod,$(MAKECMDGOALS)) \
    780 	            | $(INTERNAL_USERIMAGES_DEPS)
    781 	@echo "make $@: ignoring dependencies"
    782 	$(call build-systemimage-target,$(INSTALLED_SYSTEMIMAGE))
    783 	$(hide) $(call assert-max-image-size,$(INSTALLED_SYSTEMIMAGE),$(BOARD_SYSTEMIMAGE_PARTITION_SIZE),yaffs)
    784 
    785 ifneq (,$(filter systemimage-nodeps snod, $(MAKECMDGOALS)))
    786 ifeq (true,$(WITH_DEXPREOPT))
    787 $(warning Warning: with dexpreopt enabled, you may need a full rebuild.)
    788 endif
    789 endif
    790 
    791 #######
    792 ## system tarball
    793 define build-systemtarball-target
    794     $(call pretty,"Target system fs tarball: $(INSTALLED_SYSTEMTARBALL_TARGET)")
    795     $(MKTARBALL) $(FS_GET_STATS) \
    796 		$(PRODUCT_OUT) system $(PRIVATE_SYSTEM_TAR) \
    797 		$(INSTALLED_SYSTEMTARBALL_TARGET)
    798 endef
    799 
    800 ifndef SYSTEM_TARBALL_FORMAT
    801     SYSTEM_TARBALL_FORMAT := bz2
    802 endif
    803 
    804 system_tar := $(PRODUCT_OUT)/system.tar
    805 INSTALLED_SYSTEMTARBALL_TARGET := $(system_tar).$(SYSTEM_TARBALL_FORMAT)
    806 $(INSTALLED_SYSTEMTARBALL_TARGET): PRIVATE_SYSTEM_TAR := $(system_tar)
    807 $(INSTALLED_SYSTEMTARBALL_TARGET): $(FS_GET_STATS) $(INTERNAL_SYSTEMIMAGE_FILES)
    808 	$(build-systemtarball-target)
    809 
    810 .PHONY: systemtarball-nodeps
    811 systemtarball-nodeps: $(FS_GET_STATS) \
    812                       $(filter-out systemtarball-nodeps stnod,$(MAKECMDGOALS))
    813 	$(build-systemtarball-target)
    814 
    815 .PHONY: stnod
    816 stnod: systemtarball-nodeps
    817 
    818 # For platform-java goal, add platform as well
    819 ifneq (,$(filter platform-java, $(MAKECMDGOALS)))
    820 PLATFORM_ZIP_ADD_JAVA := true
    821 endif
    822 
    823 #######
    824 ## platform.zip: system, plus other files to be used in PDK fusion build,
    825 ## in a zip file
    826 INSTALLED_PLATFORM_ZIP := $(PRODUCT_OUT)/platform.zip
    827 $(INSTALLED_PLATFORM_ZIP) : $(INTERNAL_SYSTEMIMAGE_FILES)
    828 	$(call pretty,"Platform zip package: $(INSTALLED_PLATFORM_ZIP)")
    829 	$(hide) rm -f $@
    830 	$(hide) cd $(dir $@) && zip -qry $(notdir $@) \
    831 		$(TARGET_COPY_OUT_SYSTEM) \
    832 		$(patsubst $(PRODUCT_OUT)/%, %, $(TARGET_OUT_NOTICE_FILES))
    833 ifeq (true,$(PLATFORM_ZIP_ADD_JAVA))
    834 	$(hide) cd $(OUT_DIR) && zip -qry $(patsubst $(OUT_DIR)/%,%,$@) $(PDK_PLATFORM_JAVA_ZIP_CONTENTS)
    835 endif
    836 
    837 
    838 .PHONY: platform
    839 platform: $(INSTALLED_PLATFORM_ZIP)
    840 
    841 .PHONY: platform-java
    842 platform-java: platform
    843 
    844 # Dist the platform.zip
    845 ifneq (,$(filter platform platform-java, $(MAKECMDGOALS)))
    846 $(call dist-for-goals, platform platform-java, $(INSTALLED_PLATFORM_ZIP))
    847 endif
    848 
    849 #######
    850 ## boot tarball
    851 define build-boottarball-target
    852     $(hide) echo "Target boot fs tarball: $(INSTALLED_BOOTTARBALL_TARGET)"
    853     $(hide) mkdir -p $(PRODUCT_OUT)/boot
    854     $(hide) cp -f $(INTERNAL_BOOTIMAGE_FILES) $(PRODUCT_OUT)/boot/.
    855     $(hide) echo $(BOARD_KERNEL_CMDLINE) > $(PRODUCT_OUT)/boot/cmdline
    856     $(hide) $(MKTARBALL) $(FS_GET_STATS) \
    857                  $(PRODUCT_OUT) boot $(PRIVATE_BOOT_TAR) \
    858                  $(INSTALLED_BOOTTARBALL_TARGET)
    859 endef
    860 
    861 ifndef BOOT_TARBALL_FORMAT
    862     BOOT_TARBALL_FORMAT := bz2
    863 endif
    864 
    865 boot_tar := $(PRODUCT_OUT)/boot.tar
    866 INSTALLED_BOOTTARBALL_TARGET := $(boot_tar).$(BOOT_TARBALL_FORMAT)
    867 $(INSTALLED_BOOTTARBALL_TARGET): PRIVATE_BOOT_TAR := $(boot_tar)
    868 $(INSTALLED_BOOTTARBALL_TARGET): $(FS_GET_STATS) $(INTERNAL_BOOTIMAGE_FILES)
    869 	$(build-boottarball-target)
    870 
    871 .PHONY: boottarball-nodeps btnod
    872 boottarball-nodeps btnod: $(FS_GET_STATS) \
    873                       $(filter-out boottarball-nodeps btnod,$(MAKECMDGOALS))
    874 	$(build-boottarball-target)
    875 
    876 
    877 # -----------------------------------------------------------------
    878 # data partition image
    879 INTERNAL_USERDATAIMAGE_FILES := \
    880     $(filter $(TARGET_OUT_DATA)/%,$(ALL_DEFAULT_INSTALLED_MODULES))
    881 
    882 # If we build "tests" at the same time, make sure $(tests_MODULES) get covered.
    883 ifdef is_tests_build
    884 INTERNAL_USERDATAIMAGE_FILES += \
    885     $(filter $(TARGET_OUT_DATA)/%,$(tests_MODULES))
    886 endif
    887 
    888 userdataimage_intermediates := \
    889     $(call intermediates-dir-for,PACKAGING,userdata)
    890 BUILT_USERDATAIMAGE_TARGET := $(PRODUCT_OUT)/userdata.img
    891 
    892 define build-userdataimage-target
    893   $(call pretty,"Target userdata fs image: $(INSTALLED_USERDATAIMAGE_TARGET)")
    894   @mkdir -p $(TARGET_OUT_DATA)
    895   @mkdir -p $(userdataimage_intermediates) && rm -rf $(userdataimage_intermediates)/userdata_image_info.txt
    896   $(call generate-userimage-prop-dictionary, $(userdataimage_intermediates)/userdata_image_info.txt)
    897   $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH \
    898       ./build/tools/releasetools/build_image.py \
    899       $(TARGET_OUT_DATA) $(userdataimage_intermediates)/userdata_image_info.txt $(INSTALLED_USERDATAIMAGE_TARGET)
    900   $(hide) $(call assert-max-image-size,$(INSTALLED_USERDATAIMAGE_TARGET),$(BOARD_USERDATAIMAGE_PARTITION_SIZE),yaffs)
    901 endef
    902 
    903 # We just build this directly to the install location.
    904 INSTALLED_USERDATAIMAGE_TARGET := $(BUILT_USERDATAIMAGE_TARGET)
    905 $(INSTALLED_USERDATAIMAGE_TARGET): $(INTERNAL_USERIMAGES_DEPS) \
    906                                    $(INTERNAL_USERDATAIMAGE_FILES)
    907 	$(build-userdataimage-target)
    908 
    909 .PHONY: userdataimage-nodeps
    910 userdataimage-nodeps: | $(INTERNAL_USERIMAGES_DEPS)
    911 	$(build-userdataimage-target)
    912 
    913 #######
    914 ## data partition tarball
    915 define build-userdatatarball-target
    916     $(call pretty,"Target userdata fs tarball: " \
    917                   "$(INSTALLED_USERDATATARBALL_TARGET)")
    918     $(MKTARBALL) $(FS_GET_STATS) \
    919 		$(PRODUCT_OUT) data $(PRIVATE_USERDATA_TAR) \
    920 		$(INSTALLED_USERDATATARBALL_TARGET)
    921 endef
    922 
    923 userdata_tar := $(PRODUCT_OUT)/userdata.tar
    924 INSTALLED_USERDATATARBALL_TARGET := $(userdata_tar).bz2
    925 $(INSTALLED_USERDATATARBALL_TARGET): PRIVATE_USERDATA_TAR := $(userdata_tar)
    926 $(INSTALLED_USERDATATARBALL_TARGET): $(FS_GET_STATS) $(INTERNAL_USERDATAIMAGE_FILES)
    927 	$(build-userdatatarball-target)
    928 
    929 .PHONY: userdatatarball-nodeps
    930 userdatatarball-nodeps: $(FS_GET_STATS)
    931 	$(build-userdatatarball-target)
    932 
    933 
    934 # -----------------------------------------------------------------
    935 # cache partition image
    936 ifdef BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE
    937 INTERNAL_CACHEIMAGE_FILES := \
    938     $(filter $(TARGET_OUT_CACHE)/%,$(ALL_DEFAULT_INSTALLED_MODULES))
    939 
    940 cacheimage_intermediates := \
    941     $(call intermediates-dir-for,PACKAGING,cache)
    942 BUILT_CACHEIMAGE_TARGET := $(PRODUCT_OUT)/cache.img
    943 
    944 define build-cacheimage-target
    945   $(call pretty,"Target cache fs image: $(INSTALLED_CACHEIMAGE_TARGET)")
    946   @mkdir -p $(TARGET_OUT_CACHE)
    947   @mkdir -p $(cacheimage_intermediates) && rm -rf $(cacheimage_intermediates)/cache_image_info.txt
    948   $(call generate-userimage-prop-dictionary, $(cacheimage_intermediates)/cache_image_info.txt)
    949   $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH \
    950       ./build/tools/releasetools/build_image.py \
    951       $(TARGET_OUT_CACHE) $(cacheimage_intermediates)/cache_image_info.txt $(INSTALLED_CACHEIMAGE_TARGET)
    952   $(hide) $(call assert-max-image-size,$(INSTALLED_CACHEIMAGE_TARGET),$(BOARD_CACHEIMAGE_PARTITION_SIZE),yaffs)
    953 endef
    954 
    955 # We just build this directly to the install location.
    956 INSTALLED_CACHEIMAGE_TARGET := $(BUILT_CACHEIMAGE_TARGET)
    957 $(INSTALLED_CACHEIMAGE_TARGET): $(INTERNAL_USERIMAGES_DEPS) $(INTERNAL_CACHEIMAGE_FILES)
    958 	$(build-cacheimage-target)
    959 
    960 .PHONY: cacheimage-nodeps
    961 cacheimage-nodeps: | $(INTERNAL_USERIMAGES_DEPS)
    962 	$(build-cacheimage-target)
    963 
    964 endif # BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE
    965 
    966 # -----------------------------------------------------------------
    967 # bring in the installer image generation defines if necessary
    968 ifeq ($(TARGET_USE_DISKINSTALLER),true)
    969 include bootable/diskinstaller/config.mk
    970 endif
    971 
    972 # -----------------------------------------------------------------
    973 # host tools needed to build dist and OTA packages
    974 
    975 DISTTOOLS :=  $(HOST_OUT_EXECUTABLES)/minigzip \
    976 	  $(HOST_OUT_EXECUTABLES)/mkbootfs \
    977 	  $(HOST_OUT_EXECUTABLES)/mkbootimg \
    978 	  $(HOST_OUT_EXECUTABLES)/fs_config \
    979 	  $(HOST_OUT_EXECUTABLES)/mkyaffs2image \
    980 	  $(HOST_OUT_EXECUTABLES)/zipalign \
    981 	  $(HOST_OUT_EXECUTABLES)/bsdiff \
    982 	  $(HOST_OUT_EXECUTABLES)/imgdiff \
    983 	  $(HOST_OUT_JAVA_LIBRARIES)/dumpkey.jar \
    984 	  $(HOST_OUT_JAVA_LIBRARIES)/signapk.jar \
    985 	  $(HOST_OUT_EXECUTABLES)/mkuserimg.sh \
    986 	  $(HOST_OUT_EXECUTABLES)/make_ext4fs
    987 
    988 OTATOOLS := $(DISTTOOLS) \
    989 	  $(HOST_OUT_EXECUTABLES)/aapt
    990 
    991 .PHONY: otatools
    992 otatools: $(OTATOOLS)
    993 
    994 # -----------------------------------------------------------------
    995 # A zip of the directories that map to the target filesystem.
    996 # This zip can be used to create an OTA package or filesystem image
    997 # as a post-build step.
    998 #
    999 name := $(TARGET_PRODUCT)
   1000 ifeq ($(TARGET_BUILD_TYPE),debug)
   1001   name := $(name)_debug
   1002 endif
   1003 name := $(name)-target_files-$(FILE_NAME_TAG)
   1004 
   1005 intermediates := $(call intermediates-dir-for,PACKAGING,target_files)
   1006 BUILT_TARGET_FILES_PACKAGE := $(intermediates)/$(name).zip
   1007 $(BUILT_TARGET_FILES_PACKAGE): intermediates := $(intermediates)
   1008 $(BUILT_TARGET_FILES_PACKAGE): \
   1009 		zip_root := $(intermediates)/$(name)
   1010 
   1011 # $(1): Directory to copy
   1012 # $(2): Location to copy it to
   1013 # The "ls -A" is to prevent "acp s/* d" from failing if s is empty.
   1014 define package_files-copy-root
   1015   if [ -d "$(strip $(1))" -a "$$(ls -A $(1))" ]; then \
   1016     mkdir -p $(2) && \
   1017     $(ACP) -rd $(strip $(1))/* $(2); \
   1018   fi
   1019 endef
   1020 
   1021 built_ota_tools := \
   1022 	$(call intermediates-dir-for,EXECUTABLES,applypatch)/applypatch \
   1023 	$(call intermediates-dir-for,EXECUTABLES,applypatch_static)/applypatch_static \
   1024 	$(call intermediates-dir-for,EXECUTABLES,check_prereq)/check_prereq \
   1025 	$(call intermediates-dir-for,EXECUTABLES,sqlite3)/sqlite3 \
   1026 	$(call intermediates-dir-for,EXECUTABLES,updater)/updater
   1027 $(BUILT_TARGET_FILES_PACKAGE): PRIVATE_OTA_TOOLS := $(built_ota_tools)
   1028 
   1029 $(BUILT_TARGET_FILES_PACKAGE): PRIVATE_RECOVERY_API_VERSION := $(RECOVERY_API_VERSION)
   1030 
   1031 ifeq ($(TARGET_RELEASETOOLS_EXTENSIONS),)
   1032 # default to common dir for device vendor
   1033 $(BUILT_TARGET_FILES_PACKAGE): tool_extensions := $(TARGET_DEVICE_DIR)/../common
   1034 else
   1035 $(BUILT_TARGET_FILES_PACKAGE): tool_extensions := $(TARGET_RELEASETOOLS_EXTENSIONS)
   1036 endif
   1037 
   1038 # Depending on the various images guarantees that the underlying
   1039 # directories are up-to-date.
   1040 $(BUILT_TARGET_FILES_PACKAGE): \
   1041 		$(INSTALLED_BOOTIMAGE_TARGET) \
   1042 		$(INSTALLED_RADIOIMAGE_TARGET) \
   1043 		$(INSTALLED_RECOVERYIMAGE_TARGET) \
   1044 		$(INSTALLED_SYSTEMIMAGE) \
   1045 		$(INSTALLED_USERDATAIMAGE_TARGET) \
   1046 		$(INSTALLED_CACHEIMAGE_TARGET) \
   1047 		$(INSTALLED_ANDROID_INFO_TXT_TARGET) \
   1048 		$(built_ota_tools) \
   1049 		$(APKCERTS_FILE) \
   1050 		$(HOST_OUT_EXECUTABLES)/fs_config \
   1051 		| $(ACP)
   1052 	@echo "Package target files: $@"
   1053 	$(hide) rm -rf $@ $(zip_root)
   1054 	$(hide) mkdir -p $(dir $@) $(zip_root)
   1055 	@# Components of the recovery image
   1056 	$(hide) mkdir -p $(zip_root)/RECOVERY
   1057 	$(hide) $(call package_files-copy-root, \
   1058 		$(TARGET_RECOVERY_ROOT_OUT),$(zip_root)/RECOVERY/RAMDISK)
   1059 ifdef INSTALLED_KERNEL_TARGET
   1060 	$(hide) $(ACP) $(INSTALLED_KERNEL_TARGET) $(zip_root)/RECOVERY/kernel
   1061 endif
   1062 ifdef INSTALLED_2NDBOOTLOADER_TARGET
   1063 	$(hide) $(ACP) \
   1064 		$(INSTALLED_2NDBOOTLOADER_TARGET) $(zip_root)/RECOVERY/second
   1065 endif
   1066 ifdef BOARD_KERNEL_CMDLINE
   1067 	$(hide) echo "$(BOARD_KERNEL_CMDLINE)" > $(zip_root)/RECOVERY/cmdline
   1068 endif
   1069 ifdef BOARD_KERNEL_BASE
   1070 	$(hide) echo "$(BOARD_KERNEL_BASE)" > $(zip_root)/RECOVERY/base
   1071 endif
   1072 ifdef BOARD_KERNEL_PAGESIZE
   1073 	$(hide) echo "$(BOARD_KERNEL_PAGESIZE)" > $(zip_root)/RECOVERY/pagesize
   1074 endif
   1075 	@# Components of the boot image
   1076 	$(hide) mkdir -p $(zip_root)/BOOT
   1077 	$(hide) $(call package_files-copy-root, \
   1078 		$(TARGET_ROOT_OUT),$(zip_root)/BOOT/RAMDISK)
   1079 ifdef INSTALLED_KERNEL_TARGET
   1080 	$(hide) $(ACP) $(INSTALLED_KERNEL_TARGET) $(zip_root)/BOOT/kernel
   1081 endif
   1082 ifdef INSTALLED_2NDBOOTLOADER_TARGET
   1083 	$(hide) $(ACP) \
   1084 		$(INSTALLED_2NDBOOTLOADER_TARGET) $(zip_root)/BOOT/second
   1085 endif
   1086 ifdef BOARD_KERNEL_CMDLINE
   1087 	$(hide) echo "$(BOARD_KERNEL_CMDLINE)" > $(zip_root)/BOOT/cmdline
   1088 endif
   1089 ifdef BOARD_KERNEL_BASE
   1090 	$(hide) echo "$(BOARD_KERNEL_BASE)" > $(zip_root)/BOOT/base
   1091 endif
   1092 ifdef BOARD_KERNEL_PAGESIZE
   1093 	$(hide) echo "$(BOARD_KERNEL_PAGESIZE)" > $(zip_root)/BOOT/pagesize
   1094 endif
   1095 	$(hide) $(foreach t,$(INSTALLED_RADIOIMAGE_TARGET),\
   1096 	            mkdir -p $(zip_root)/RADIO; \
   1097 	            $(ACP) $(t) $(zip_root)/RADIO/$(notdir $(t));)
   1098 	@# Contents of the system image
   1099 	$(hide) $(call package_files-copy-root, \
   1100 		$(SYSTEMIMAGE_SOURCE_DIR),$(zip_root)/SYSTEM)
   1101 	@# Contents of the data image
   1102 	$(hide) $(call package_files-copy-root, \
   1103 		$(TARGET_OUT_DATA),$(zip_root)/DATA)
   1104 	@# Extra contents of the OTA package
   1105 	$(hide) mkdir -p $(zip_root)/OTA/bin
   1106 	$(hide) $(ACP) $(INSTALLED_ANDROID_INFO_TXT_TARGET) $(zip_root)/OTA/
   1107 	$(hide) $(ACP) $(PRIVATE_OTA_TOOLS) $(zip_root)/OTA/bin/
   1108 	@# Files that do not end up in any images, but are necessary to
   1109 	@# build them.
   1110 	$(hide) mkdir -p $(zip_root)/META
   1111 	$(hide) $(ACP) $(APKCERTS_FILE) $(zip_root)/META/apkcerts.txt
   1112 	$(hide)	echo "$(PRODUCT_OTA_PUBLIC_KEYS)" > $(zip_root)/META/otakeys.txt
   1113 	$(hide) echo "recovery_api_version=$(PRIVATE_RECOVERY_API_VERSION)" > $(zip_root)/META/misc_info.txt
   1114 ifdef BOARD_FLASH_BLOCK_SIZE
   1115 	$(hide) echo "blocksize=$(BOARD_FLASH_BLOCK_SIZE)" >> $(zip_root)/META/misc_info.txt
   1116 endif
   1117 ifdef BOARD_BOOTIMAGE_PARTITION_SIZE
   1118 	$(hide) echo "boot_size=$(BOARD_BOOTIMAGE_PARTITION_SIZE)" >> $(zip_root)/META/misc_info.txt
   1119 endif
   1120 ifdef BOARD_RECOVERYIMAGE_PARTITION_SIZE
   1121 	$(hide) echo "recovery_size=$(BOARD_RECOVERYIMAGE_PARTITION_SIZE)" >> $(zip_root)/META/misc_info.txt
   1122 endif
   1123 	$(hide) echo "tool_extensions=$(tool_extensions)" >> $(zip_root)/META/misc_info.txt
   1124 	$(hide) echo "default_system_dev_certificate=$(DEFAULT_SYSTEM_DEV_CERTIFICATE)" >> $(zip_root)/META/misc_info.txt
   1125 ifdef PRODUCT_EXTRA_RECOVERY_KEYS
   1126 	$(hide) echo "extra_recovery_keys=$(PRODUCT_EXTRA_RECOVERY_KEYS)" >> $(zip_root)/META/misc_info.txt
   1127 endif
   1128 	$(call generate-userimage-prop-dictionary, $(zip_root)/META/misc_info.txt)
   1129 	@# Zip everything up, preserving symlinks
   1130 	$(hide) (cd $(zip_root) && zip -qry ../$(notdir $@) .)
   1131 	@# Run fs_config on all the system, boot ramdisk, and recovery ramdisk files in the zip, and save the output
   1132 	$(hide) zipinfo -1 $@ | awk 'BEGIN { FS="SYSTEM/" } /^SYSTEM\// {print "system/" $$2}' | $(HOST_OUT_EXECUTABLES)/fs_config > $(zip_root)/META/filesystem_config.txt
   1133 	$(hide) zipinfo -1 $@ | awk 'BEGIN { FS="BOOT/RAMDISK/" } /^BOOT\/RAMDISK\// {print $$2}' | $(HOST_OUT_EXECUTABLES)/fs_config > $(zip_root)/META/boot_filesystem_config.txt
   1134 	$(hide) zipinfo -1 $@ | awk 'BEGIN { FS="RECOVERY/RAMDISK/" } /^RECOVERY\/RAMDISK\// {print $$2}' | $(HOST_OUT_EXECUTABLES)/fs_config > $(zip_root)/META/recovery_filesystem_config.txt
   1135 	$(hide) (cd $(zip_root) && zip -q ../$(notdir $@) META/*filesystem_config.txt)
   1136 
   1137 
   1138 target-files-package: $(BUILT_TARGET_FILES_PACKAGE)
   1139 
   1140 
   1141 ifneq ($(TARGET_PRODUCT),sdk)
   1142 ifeq ($(filter generic%,$(TARGET_DEVICE)),)
   1143 ifneq ($(TARGET_NO_KERNEL),true)
   1144 ifneq ($(recovery_fstab),)
   1145 
   1146 # -----------------------------------------------------------------
   1147 # OTA update package
   1148 
   1149 name := $(TARGET_PRODUCT)
   1150 ifeq ($(TARGET_BUILD_TYPE),debug)
   1151   name := $(name)_debug
   1152 endif
   1153 name := $(name)-ota-$(FILE_NAME_TAG)
   1154 
   1155 INTERNAL_OTA_PACKAGE_TARGET := $(PRODUCT_OUT)/$(name).zip
   1156 
   1157 $(INTERNAL_OTA_PACKAGE_TARGET): KEY_CERT_PAIR := $(DEFAULT_KEY_CERT_PAIR)
   1158 
   1159 $(INTERNAL_OTA_PACKAGE_TARGET): $(BUILT_TARGET_FILES_PACKAGE) $(DISTTOOLS) $(SELINUX_DEPENDS)
   1160 	@echo "Package OTA: $@"
   1161 	$(hide) ./build/tools/releasetools/ota_from_target_files -v \
   1162 	   -p $(HOST_OUT) \
   1163 	   -k $(KEY_CERT_PAIR) \
   1164 	   $(BUILT_TARGET_FILES_PACKAGE) $@
   1165 
   1166 .PHONY: otapackage
   1167 otapackage: $(INTERNAL_OTA_PACKAGE_TARGET)
   1168 
   1169 # -----------------------------------------------------------------
   1170 # The update package
   1171 
   1172 name := $(TARGET_PRODUCT)
   1173 ifeq ($(TARGET_BUILD_TYPE),debug)
   1174   name := $(name)_debug
   1175 endif
   1176 name := $(name)-img-$(FILE_NAME_TAG)
   1177 
   1178 INTERNAL_UPDATE_PACKAGE_TARGET := $(PRODUCT_OUT)/$(name).zip
   1179 
   1180 ifeq ($(TARGET_RELEASETOOLS_EXTENSIONS),)
   1181 # default to common dir for device vendor
   1182 $(INTERNAL_UPDATE_PACKAGE_TARGET): extensions := $(TARGET_DEVICE_DIR)/../common
   1183 else
   1184 $(INTERNAL_UPDATE_PACKAGE_TARGET): extensions := $(TARGET_RELEASETOOLS_EXTENSIONS)
   1185 endif
   1186 
   1187 $(INTERNAL_UPDATE_PACKAGE_TARGET): $(BUILT_TARGET_FILES_PACKAGE) $(DISTTOOLS) $(SELINUX_DEPENDS)
   1188 	@echo "Package: $@"
   1189 	$(hide) ./build/tools/releasetools/img_from_target_files -v \
   1190 	   -s $(extensions) \
   1191 	   -p $(HOST_OUT) \
   1192 	   $(BUILT_TARGET_FILES_PACKAGE) $@
   1193 
   1194 .PHONY: updatepackage
   1195 updatepackage: $(INTERNAL_UPDATE_PACKAGE_TARGET)
   1196 
   1197 endif    # recovery_fstab is defined
   1198 endif    # TARGET_NO_KERNEL != true
   1199 endif    # TARGET_DEVICE != generic*
   1200 endif    # TARGET_PRODUCT != sdk
   1201 
   1202 # -----------------------------------------------------------------
   1203 # A zip of the tests that are built when running "make tests".
   1204 # This is very similar to BUILT_TARGET_FILES_PACKAGE, but we
   1205 # only grab DATA, and it's called "*-tests-*.zip".
   1206 #
   1207 name := $(TARGET_PRODUCT)
   1208 ifeq ($(TARGET_BUILD_TYPE),debug)
   1209   name := $(name)_debug
   1210 endif
   1211 name := $(name)-tests-$(FILE_NAME_TAG)
   1212 
   1213 intermediates := $(call intermediates-dir-for,PACKAGING,tests_zip)
   1214 BUILT_TESTS_ZIP_PACKAGE := $(intermediates)/$(name).zip
   1215 $(BUILT_TESTS_ZIP_PACKAGE): intermediates := $(intermediates)
   1216 $(BUILT_TESTS_ZIP_PACKAGE): zip_root := $(intermediates)/$(name)
   1217 
   1218 # Depending on the images guarantees that the underlying
   1219 # directories are up-to-date.
   1220 $(BUILT_TESTS_ZIP_PACKAGE): \
   1221     $(INSTALLED_USERDATAIMAGE_TARGET) \
   1222     | $(ACP)
   1223 	@echo "Package test files: $@"
   1224 	$(hide) rm -rf $@ $(zip_root)
   1225 	$(hide) mkdir -p $(dir $@) $(zip_root)
   1226 	@# Contents of the data image
   1227 	$(hide) $(call package_files-copy-root, \
   1228 		$(TARGET_OUT_DATA),$(zip_root)/DATA)
   1229 	$(hide) (cd $(zip_root) && zip -qry ../$(notdir $@) .)
   1230 
   1231 .PHONY: tests-zip-package
   1232 tests-zip-package: $(BUILT_TESTS_ZIP_PACKAGE)
   1233 
   1234 # Target needed by tests build
   1235 .PHONY: tests-build-target
   1236 tests-build-target: $(BUILT_TESTS_ZIP_PACKAGE)
   1237 
   1238 ifneq (,$(filter $(MAKECMDGOALS),tests-build-target))
   1239   $(call dist-for-goals, tests-build-target, \
   1240           $(BUILT_TESTS_ZIP_PACKAGE))
   1241 endif
   1242 
   1243 .PHONY: tests
   1244 tests: $(BUILT_TESTS_ZIP_PACKAGE)
   1245 ifneq (,$(filter tests, $(MAKECMDGOALS)))
   1246 $(call dist-for-goals, tests, $(BUILT_TESTS_ZIP_PACKAGE))
   1247 endif
   1248 
   1249 # -----------------------------------------------------------------
   1250 # A zip of the symbols directory.  Keep the full paths to make it
   1251 # more obvious where these files came from.
   1252 #
   1253 name := $(TARGET_PRODUCT)
   1254 ifeq ($(TARGET_BUILD_TYPE),debug)
   1255   name := $(name)_debug
   1256 endif
   1257 name := $(name)-symbols-$(FILE_NAME_TAG)
   1258 
   1259 SYMBOLS_ZIP := $(PRODUCT_OUT)/$(name).zip
   1260 $(SYMBOLS_ZIP): $(INSTALLED_SYSTEMIMAGE) $(INSTALLED_BOOTIMAGE_TARGET)
   1261 	@echo "Package symbols: $@"
   1262 	$(hide) rm -rf $@
   1263 	$(hide) mkdir -p $(dir $@)
   1264 	$(hide) zip -qr $@ $(TARGET_OUT_UNSTRIPPED)
   1265 
   1266 # -----------------------------------------------------------------
   1267 # A zip of the Android Apps. Not keeping full path so that we don't
   1268 # include product names when distributing
   1269 #
   1270 name := $(TARGET_PRODUCT)
   1271 ifeq ($(TARGET_BUILD_TYPE),debug)
   1272   name := $(name)_debug
   1273 endif
   1274 name := $(name)-apps-$(FILE_NAME_TAG)
   1275 
   1276 APPS_ZIP := $(PRODUCT_OUT)/$(name).zip
   1277 $(APPS_ZIP): $(INSTALLED_SYSTEMIMAGE)
   1278 	@echo "Package apps: $@"
   1279 	$(hide) rm -rf $@
   1280 	$(hide) mkdir -p $(dir $@)
   1281 	$(hide) zip -qj $@ $(TARGET_OUT_APPS)/*
   1282 
   1283 
   1284 #------------------------------------------------------------------
   1285 # A zip of emma code coverage meta files. Generated for fully emma
   1286 # instrumented build.
   1287 #
   1288 EMMA_META_ZIP := $(PRODUCT_OUT)/emma_meta.zip
   1289 $(EMMA_META_ZIP): $(INSTALLED_SYSTEMIMAGE)
   1290 	@echo "Collecting Emma coverage meta files."
   1291 	$(hide) find $(TARGET_COMMON_OUT_ROOT) -name "coverage.em" | \
   1292 		zip -@ -q $@
   1293 
   1294 # -----------------------------------------------------------------
   1295 # dalvik something
   1296 .PHONY: dalvikfiles
   1297 dalvikfiles: $(INTERNAL_DALVIK_MODULES)
   1298 
   1299 # -----------------------------------------------------------------
   1300 # The emulator package
   1301 
   1302 INTERNAL_EMULATOR_PACKAGE_FILES += \
   1303         $(HOST_OUT_EXECUTABLES)/emulator$(HOST_EXECUTABLE_SUFFIX) \
   1304         prebuilts/qemu-kernel/$(TARGET_ARCH)/kernel-qemu \
   1305         $(INSTALLED_RAMDISK_TARGET) \
   1306 		$(INSTALLED_SYSTEMIMAGE) \
   1307 		$(INSTALLED_USERDATAIMAGE_TARGET)
   1308 
   1309 name := $(TARGET_PRODUCT)-emulator-$(FILE_NAME_TAG)
   1310 
   1311 INTERNAL_EMULATOR_PACKAGE_TARGET := $(PRODUCT_OUT)/$(name).zip
   1312 
   1313 $(INTERNAL_EMULATOR_PACKAGE_TARGET): $(INTERNAL_EMULATOR_PACKAGE_FILES)
   1314 	@echo "Package: $@"
   1315 	$(hide) zip -qj $@ $(INTERNAL_EMULATOR_PACKAGE_FILES)
   1316 
   1317 # -----------------------------------------------------------------
   1318 # Old PDK stuffs, retired
   1319 # The pdk package (Platform Development Kit)
   1320 
   1321 #ifneq (,$(filter pdk,$(MAKECMDGOALS)))
   1322 #  include development/pdk/Pdk.mk
   1323 #endif
   1324 
   1325 
   1326 # -----------------------------------------------------------------
   1327 # The SDK
   1328 
   1329 # The SDK includes host-specific components, so it belongs under HOST_OUT.
   1330 sdk_dir := $(HOST_OUT)/sdk
   1331 
   1332 # Build a name that looks like:
   1333 #
   1334 #     linux-x86   --> android-sdk_12345_linux-x86
   1335 #     darwin-x86  --> android-sdk_12345_mac-x86
   1336 #     windows-x86 --> android-sdk_12345_windows
   1337 #
   1338 sdk_name := android-sdk_$(FILE_NAME_TAG)
   1339 ifeq ($(HOST_OS),darwin)
   1340   INTERNAL_SDK_HOST_OS_NAME := mac
   1341 else
   1342   INTERNAL_SDK_HOST_OS_NAME := $(HOST_OS)
   1343 endif
   1344 ifneq ($(HOST_OS),windows)
   1345   INTERNAL_SDK_HOST_OS_NAME := $(INTERNAL_SDK_HOST_OS_NAME)-$(HOST_ARCH)
   1346 endif
   1347 sdk_name := $(sdk_name)_$(INTERNAL_SDK_HOST_OS_NAME)
   1348 
   1349 sdk_dep_file := $(sdk_dir)/sdk_deps.mk
   1350 
   1351 ATREE_FILES :=
   1352 -include $(sdk_dep_file)
   1353 
   1354 # if we don't have a real list, then use "everything"
   1355 ifeq ($(strip $(ATREE_FILES)),)
   1356 ATREE_FILES := \
   1357 	$(ALL_PREBUILT) \
   1358 	$(ALL_COPIED_HEADERS) \
   1359 	$(ALL_GENERATED_SOURCES) \
   1360 	$(ALL_DEFAULT_INSTALLED_MODULES) \
   1361 	$(INSTALLED_RAMDISK_TARGET) \
   1362 	$(ALL_DOCS) \
   1363 	$(ALL_SDK_FILES)
   1364 endif
   1365 
   1366 atree_dir := development/build
   1367 
   1368 # sdk/build/tools.atree contains the generic rules, while
   1369 #
   1370 # sdk/build/tools.$(TARGET_ARCH).atree contains target-specific rules
   1371 # the latter is optional.
   1372 #
   1373 sdk_tools_atree_files := sdk/build/tools.atree
   1374 ifneq (,$(strip $(wildcard sdk/build/tools.$(TARGET_ARCH).atree)))
   1375   sdk_tools_atree_files += sdk/build/tools.$(TARGET_ARCH).atree
   1376 endif
   1377 ifneq (,$(strip $(wildcard sdk/build/tools.$(HOST_OS).atree)))
   1378   sdk_tools_atree_files += sdk/build/tools.$(HOST_OS).atree
   1379 endif
   1380 ifneq (,$(strip $(wildcard sdk/build/tools.$(HOST_OS)-$(HOST_ARCH).atree)))
   1381   sdk_tools_atree_files += sdk/build/tools.$(HOST_OS)-$(HOST_ARCH).atree
   1382 endif
   1383 
   1384 sdk_atree_files := \
   1385 	$(atree_dir)/sdk.exclude.atree \
   1386 	$(atree_dir)/sdk.atree \
   1387 	$(atree_dir)/sdk-$(HOST_OS)-$(HOST_ARCH).atree \
   1388 	$(sdk_tools_atree_files)
   1389 
   1390 # development/build/sdk-android-<abi>.atree is used to differentiate
   1391 # between architecture models (e.g. ARMv5TE versus ARMv7) when copying
   1392 # files like the kernel image. We use TARGET_CPU_ABI because we don't
   1393 # have a better way to distinguish between CPU models.
   1394 ifneq (,$(strip $(wildcard $(atree_dir)/sdk-android-$(TARGET_CPU_ABI).atree)))
   1395   sdk_atree_files += $(atree_dir)/sdk-android-$(TARGET_CPU_ABI).atree
   1396 endif
   1397 
   1398 deps := \
   1399 	$(target_notice_file_txt) \
   1400 	$(tools_notice_file_txt) \
   1401 	$(OUT_DOCS)/offline-sdk-timestamp \
   1402 	$(SYMBOLS_ZIP) \
   1403 	$(INSTALLED_SYSTEMIMAGE) \
   1404 	$(INSTALLED_USERDATAIMAGE_TARGET) \
   1405 	$(INSTALLED_RAMDISK_TARGET) \
   1406 	$(INSTALLED_SDK_BUILD_PROP_TARGET) \
   1407 	$(INSTALLED_BUILD_PROP_TARGET) \
   1408 	$(ATREE_FILES) \
   1409 	$(atree_dir)/sdk.atree \
   1410 	$(sdk_tools_atree_files) \
   1411 	$(HOST_OUT_EXECUTABLES)/atree \
   1412     $(HOST_OUT_EXECUTABLES)/line_endings
   1413 
   1414 INTERNAL_SDK_TARGET := $(sdk_dir)/$(sdk_name).zip
   1415 $(INTERNAL_SDK_TARGET): PRIVATE_NAME := $(sdk_name)
   1416 $(INTERNAL_SDK_TARGET): PRIVATE_DIR := $(sdk_dir)/$(sdk_name)
   1417 $(INTERNAL_SDK_TARGET): PRIVATE_DEP_FILE := $(sdk_dep_file)
   1418 $(INTERNAL_SDK_TARGET): PRIVATE_INPUT_FILES := $(sdk_atree_files)
   1419 
   1420 # Set SDK_GNU_ERROR to non-empty to fail when a GNU target is built.
   1421 #
   1422 #SDK_GNU_ERROR := true
   1423 
   1424 $(INTERNAL_SDK_TARGET): $(deps)
   1425 	@echo "Package SDK: $@"
   1426 	$(hide) rm -rf $(PRIVATE_DIR) $@
   1427 	$(hide) for f in $(target_gnu_MODULES); do \
   1428 	  if [ -f $$f ]; then \
   1429 	    echo SDK: $(if $(SDK_GNU_ERROR),ERROR:,warning:) \
   1430 	        including GNU target $$f >&2; \
   1431 	    FAIL=$(SDK_GNU_ERROR); \
   1432 	  fi; \
   1433 	done; \
   1434 	if [ $$FAIL ]; then exit 1; fi
   1435 	$(hide) ( \
   1436 		$(HOST_OUT_EXECUTABLES)/atree \
   1437 		$(addprefix -f ,$(PRIVATE_INPUT_FILES)) \
   1438 			-m $(PRIVATE_DEP_FILE) \
   1439 			-I . \
   1440 			-I $(PRODUCT_OUT) \
   1441 			-I $(HOST_OUT) \
   1442 			-I $(TARGET_COMMON_OUT_ROOT) \
   1443 			-v "PLATFORM_NAME=android-$(PLATFORM_VERSION)" \
   1444 			-v "OUT_DIR=$(OUT_DIR)" \
   1445 			-v "HOST_OUT=$(HOST_OUT)" \
   1446 			-v "TARGET_ARCH=$(TARGET_ARCH)" \
   1447 			-v "TARGET_CPU_ABI=$(TARGET_CPU_ABI)" \
   1448 			-v "DLL_EXTENSION=$(HOST_SHLIB_SUFFIX)" \
   1449 			-o $(PRIVATE_DIR) && \
   1450 		cp -f $(target_notice_file_txt) \
   1451 				$(PRIVATE_DIR)/system-images/android-$(PLATFORM_VERSION)/$(TARGET_CPU_ABI)/NOTICE.txt && \
   1452 		cp -f $(tools_notice_file_txt) $(PRIVATE_DIR)/tools/NOTICE.txt && \
   1453 		cp -f $(tools_notice_file_txt) $(PRIVATE_DIR)/platform-tools/NOTICE.txt && \
   1454 		HOST_OUT_EXECUTABLES=$(HOST_OUT_EXECUTABLES) HOST_OS=$(HOST_OS) \
   1455 			development/build/tools/sdk_clean.sh $(PRIVATE_DIR) && \
   1456 		chmod -R ug+rwX $(PRIVATE_DIR) && \
   1457 		cd $(dir $@) && zip -rq $(notdir $@) $(PRIVATE_NAME) \
   1458 	) || ( rm -rf $(PRIVATE_DIR) $@ && exit 44 )
   1459 
   1460 
   1461 # Is a Windows SDK requested? If so, we need some definitions from here
   1462 # in order to find the Linux SDK used to create the Windows one.
   1463 MAIN_SDK_NAME := $(sdk_name)
   1464 MAIN_SDK_DIR  := $(sdk_dir)
   1465 MAIN_SDK_ZIP  := $(INTERNAL_SDK_TARGET)
   1466 ifneq ($(filter win_sdk,$(MAKECMDGOALS)),)
   1467 include $(TOPDIR)development/build/tools/windows_sdk.mk
   1468 endif
   1469 
   1470 # -----------------------------------------------------------------
   1471 # Findbugs
   1472 INTERNAL_FINDBUGS_XML_TARGET := $(PRODUCT_OUT)/findbugs.xml
   1473 INTERNAL_FINDBUGS_HTML_TARGET := $(PRODUCT_OUT)/findbugs.html
   1474 $(INTERNAL_FINDBUGS_XML_TARGET): $(ALL_FINDBUGS_FILES)
   1475 	@echo UnionBugs: $@
   1476 	$(hide) prebuilt/common/findbugs/bin/unionBugs $(ALL_FINDBUGS_FILES) \
   1477 	> $@
   1478 $(INTERNAL_FINDBUGS_HTML_TARGET): $(INTERNAL_FINDBUGS_XML_TARGET)
   1479 	@echo ConvertXmlToText: $@
   1480 	$(hide) prebuilt/common/findbugs/bin/convertXmlToText -html:fancy.xsl \
   1481 	$(INTERNAL_FINDBUGS_XML_TARGET)	> $@
   1482 
   1483 # -----------------------------------------------------------------
   1484 # Findbugs
   1485 
   1486 # -----------------------------------------------------------------
   1487 # These are some additional build tasks that need to be run.
   1488 include $(sort $(wildcard $(BUILD_SYSTEM)/tasks/*.mk))
   1489 -include $(sort $(wildcard vendor/*/build/tasks/*.mk))
   1490 
   1491 # -----------------------------------------------------------------
   1492 # Create SDK repository packages. Must be done after tasks/* since
   1493 # we need the addon rules defined.
   1494 ifneq ($(sdk_repo_goal),)
   1495 include $(TOPDIR)development/build/tools/sdk_repo.mk
   1496 endif
   1497