diff --git a/CleanSpec.mk b/CleanSpec.mk index 6e7c9b0d321..b3cb1aac4d9 100644 --- a/CleanSpec.mk +++ b/CleanSpec.mk @@ -309,6 +309,13 @@ $(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/build.prop) $(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/app/*) $(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/APPS/*) +# 5.1.1! +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/build.prop) +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/app/*) +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/APPS/*) + +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/build.prop) + # ************************************************ # NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST # ************************************************ diff --git a/core/Makefile b/core/Makefile index 15c7f02a6e3..2119c94abf8 100644 --- a/core/Makefile +++ b/core/Makefile @@ -1,5 +1,17 @@ # Put some miscellaneous rules here +# Build system colors + +ifneq ($(BUILD_WITH_COLORS),0) + CL_RED="\033[31m" + CL_GRN="\033[32m" + CL_YLW="\033[33m" + CL_BLU="\033[34m" + CL_MAG="\033[35m" + CL_CYN="\033[36m" + CL_RST="\033[0m" +endif + # HACK: clear LOCAL_PATH from including last build target before calling # intermedites-dir-for LOCAL_PATH := $(BUILD_SYSTEM) @@ -34,7 +46,6 @@ unique_product_copy_files_destinations := $(foreach cf,$(unique_product_copy_files_pairs), \ $(eval _src := $(call word-colon,1,$(cf))) \ $(eval _dest := $(call word-colon,2,$(cf))) \ - $(call check-product-copy-files,$(cf)) \ $(if $(filter $(unique_product_copy_files_destinations),$(_dest)), \ $(info PRODUCT_COPY_FILES $(cf) ignored.), \ $(eval _fulldest := $(call append-path,$(PRODUCT_OUT),$(_dest))) \ @@ -105,8 +116,22 @@ endif BUILD_VERSION_TAGS += $(BUILD_KEYS) BUILD_VERSION_TAGS := $(subst $(space),$(comma),$(sort $(BUILD_VERSION_TAGS))) +# If the final fingerprint should be different than what was used by the build system, +# we can allow that too. +ifeq ($(TARGET_VENDOR_PRODUCT_NAME),) +TARGET_VENDOR_PRODUCT_NAME := $(TARGET_PRODUCT) +endif + +ifeq ($(TARGET_VENDOR_DEVICE_NAME),) +TARGET_VENDOR_DEVICE_NAME := $(TARGET_DEVICE) +endif + +ifeq ($(TARGET_VENDOR_RELEASE_BUILD_ID),) +TARGET_VENDOR_RELEASE_BUILD_ID := $(BUILD_NUMBER) +endif + # A human-readable string that descibes this build in detail. -build_desc := $(TARGET_PRODUCT)-$(TARGET_BUILD_VARIANT) $(PLATFORM_VERSION) $(BUILD_ID) $(BUILD_NUMBER) $(BUILD_VERSION_TAGS) +build_desc := $(TARGET_VENDOR_PRODUCT_NAME)-$(TARGET_BUILD_VARIANT) $(PLATFORM_VERSION) $(BUILD_ID) $(TARGET_VENDOR_RELEASE_BUILD_ID) $(BUILD_VERSION_TAGS) $(INSTALLED_BUILD_PROP_TARGET): PRIVATE_BUILD_DESC := $(build_desc) # The string used to uniquely identify the combined build and product; used by the OTA server. @@ -118,7 +143,7 @@ ifeq (,$(strip $(BUILD_FINGERPRINT))) else BF_BUILD_NUMBER := $(BUILD_NUMBER) endif - BUILD_FINGERPRINT := $(PRODUCT_BRAND)/$(TARGET_PRODUCT)/$(TARGET_DEVICE):$(PLATFORM_VERSION)/$(BUILD_ID)/$(BF_BUILD_NUMBER):$(TARGET_BUILD_VARIANT)/$(BUILD_VERSION_TAGS) + BUILD_FINGERPRINT := $(PRODUCT_BRAND)/$(TARGET_VENDOR_PRODUCT_NAME)/$(TARGET_VENDOR_DEVICE_NAME):$(PLATFORM_VERSION)/$(BUILD_ID)/$(TARGET_VENDOR_RELEASE_BUILD_ID):$(TARGET_BUILD_VARIANT)/$(BUILD_VERSION_TAGS) endif ifneq ($(words $(BUILD_FINGERPRINT)),1) $(error BUILD_FINGERPRINT cannot contain spaces: "$(BUILD_FINGERPRINT)") @@ -201,8 +226,9 @@ ifneq ($(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_OEM_PROPERTIES),) endif $(hide) TARGET_BUILD_TYPE="$(TARGET_BUILD_VARIANT)" \ TARGET_BUILD_FLAVOR="$(TARGET_PRODUCT)-$(TARGET_BUILD_VARIANT)" \ - TARGET_DEVICE="$(TARGET_DEVICE)" \ - PRODUCT_NAME="$(TARGET_PRODUCT)" \ + TARGET_DEVICE="$(TARGET_VENDOR_DEVICE_NAME)" \ + CM_DEVICE="$(TARGET_DEVICE)" \ + PRODUCT_NAME="$(TARGET_VENDOR_PRODUCT_NAME)" \ PRODUCT_BRAND="$(PRODUCT_BRAND)" \ PRODUCT_DEFAULT_LANGUAGE="$(call default-locale-language,$(PRODUCT_LOCALES))" \ PRODUCT_DEFAULT_REGION="$(call default-locale-region,$(PRODUCT_LOCALES))" \ @@ -214,6 +240,8 @@ endif BUILD_DISPLAY_ID="$(BUILD_DISPLAY_ID)" \ BUILD_NUMBER="$(BUILD_NUMBER)" \ PLATFORM_VERSION="$(PLATFORM_VERSION)" \ + PLATFORM_SECURITY_PATCH="$(PLATFORM_SECURITY_PATCH)" \ + PLATFORM_BASE_OS="$(PLATFORM_BASE_OS)" \ PLATFORM_SDK_VERSION="$(PLATFORM_SDK_VERSION)" \ PLATFORM_VERSION_CODENAME="$(PLATFORM_VERSION_CODENAME)" \ PLATFORM_VERSION_ALL_CODENAMES="$(PLATFORM_VERSION_ALL_CODENAMES)" \ @@ -228,6 +256,8 @@ endif TARGET_CPU_ABI="$(TARGET_CPU_ABI)" \ TARGET_CPU_ABI2="$(TARGET_CPU_ABI2)" \ TARGET_AAPT_CHARACTERISTICS="$(TARGET_AAPT_CHARACTERISTICS)" \ + TARGET_UNIFIED_DEVICE="$(TARGET_UNIFIED_DEVICE)" \ + $(PRODUCT_BUILD_PROP_OVERRIDES) \ bash $(BUILDINFO_SH) >> $@ $(hide) $(foreach file,$(system_prop_file), \ if [ -f "$(file)" ]; then \ @@ -244,7 +274,7 @@ endif echo "#" >> $@; ) $(hide) $(foreach line,$(ADDITIONAL_BUILD_PROPERTIES), \ echo "$(line)" >> $@;) - $(hide) build/tools/post_process_props.py $@ $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SYSTEM_PROPERTY_BLACKLIST) + $(hide) build/tools/post_process_props.py $@ "$(PRODUCT_PROPERTY_UBER_OVERRIDES)" $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SYSTEM_PROPERTY_BLACKLIST) build_desc := @@ -367,6 +397,9 @@ endif # exist with the suffixes ".x509.pem" and ".pk8". DEFAULT_KEY_CERT_PAIR := $(DEFAULT_SYSTEM_DEV_CERTIFICATE) +ifneq ($(OTA_PACKAGE_SIGNING_KEY),) + DEFAULT_KEY_CERT_PAIR := $(OTA_PACKAGE_SIGNING_KEY) +endif # Rules that need to be present for the all targets, even # if they don't do anything. @@ -418,7 +451,6 @@ event-log-tags: $(event_log_tags_file) ALL_DEFAULT_INSTALLED_MODULES += $(event_log_tags_file) - # ################################################################# # Targets for boot/OS images # ################################################################# @@ -447,23 +479,82 @@ INTERNAL_RAMDISK_FILES := $(filter $(TARGET_ROOT_OUT)/%, \ $(ALL_GENERATED_SOURCES) \ $(ALL_DEFAULT_INSTALLED_MODULES)) -BUILT_RAMDISK_TARGET := $(PRODUCT_OUT)/ramdisk.img +# Default ramdisk comes now from Ubuntu +INTERNAL_UBUNTURAMDISK_FILES := \ + $(filter $(TARGET_OUT_UBUNTU_RAMDISK)/%,$(ALL_DEFAULT_INSTALLED_MODULES)) + +BUILT_RAMDISK_TARGET := $(PRODUCT_OUT)/ramdisk-ubuntu.img +BUILT_RAMDISK_TARGET_ANDROID := $(PRODUCT_OUT)/ramdisk-android.img # We just build this directly to the install location. -INSTALLED_RAMDISK_TARGET := $(BUILT_RAMDISK_TARGET) -$(INSTALLED_RAMDISK_TARGET): $(MKBOOTFS) $(INTERNAL_RAMDISK_FILES) | $(MINIGZIP) - $(call pretty,"Target ram disk: $@") +INSTALLED_RAMDISK_TARGET_ANDROID := $(BUILT_RAMDISK_TARGET_ANDROID) +$(INSTALLED_RAMDISK_TARGET_ANDROID): $(MKBOOTFS) $(INTERNAL_RAMDISK_FILES) | $(MINIGZIP) + $(call pretty,"Target Android ram disk: $@") $(hide) $(MKBOOTFS) $(TARGET_ROOT_OUT) | $(MINIGZIP) > $@ +BOOT_ANDROID_RAMDISK_IMG := $(TARGET_OUT)/boot/android-ramdisk.img + +$(BOOT_ANDROID_RAMDISK_IMG): $(INSTALLED_RAMDISK_TARGET_ANDROID) + $(hide) mkdir -p $(dir $@) + $(hide) $(ACP) $(INSTALLED_RAMDISK_TARGET_ANDROID) $@ + +# Download the Ubuntu Touch ramdisk from the archive +TARGET_UBUNTU_INITRD_PKG ?= ubuntu-touch-generic-initrd +TARGET_UBUNTU_INITRD_SERIES ?= vivid +TARGET_UBUNTU_INITRD_TEAM ?= ubports-developers +TARGET_UBUNTU_INITRD_PPA ?= overlay + +TARGET_OUT_UBUNTU_INITRD_PKG := $(TARGET_OUT_UBUNTU)/$(TARGET_UBUNTU_INITRD_PKG) +TARGET_UBUNTU_INITRD_LP_IMG := $(TARGET_OUT_UBUNTU_INITRD_PKG)/usr/lib/ubuntu-touch-generic-initrd/initrd.img-touch +TARGET_UBUNTU_INITRD_REPO := $(PWD)/ubuntu/ubuntu_prebuilt_initrd/initrd.img-touch +INSTALLED_RAMDISK_TARGET := $(BUILT_RAMDISK_TARGET) +ifeq ($(TARGET_ARCH),x86) +TARGET_UBUNTU_ARCH := i386 +else +TARGET_UBUNTU_ARCH := armhf +endif + +.PHONY: $(INSTALLED_RAMDISK_TARGET) +$(INSTALLED_RAMDISK_TARGET): $(MKBOOTFS) $(INTERNAL_UBUNTURAMDISK_FILES) | $(MINIGZIP) + $(call pretty,"Target Ubuntu Touch ram disk: $@") + $(hide) rm -rf $(TARGET_OUT_UBUNTU_INITRD) + $(hide) mkdir -p $(TARGET_OUT_UBUNTU_INITRD) $(TARGET_OUT_UBUNTU_INITRD_PKG) +ifdef BOARD_USE_LOCAL_INITRD + $(call pretty,"Using local initrd repo:$(TARGET_UBUNTU_INITRD_REPO)") + $(hide) $(ACP) $(TARGET_UBUNTU_INITRD_REPO) $@ +else + $(call pretty,"Downloading upstream initrd: $(TARGET_UBUNTU_INITRD_PKG) -o $(TARGET_OUT_UBUNTU_INITRD_PKG) -a $(TARGET_UBUNTU_ARCH)$(if $(TARGET_UBUNTU_INITRD_TEAM), -t $(TARGET_UBUNTU_INITRD_TEAM))$(if $(TARGET_UBUNTU_INITRD_PPA), -p $(TARGET_UBUNTU_INITRD_PPA)) $(TARGET_UBUNTU_INITRD_SERIES)") + $(hide) rm -rf $(TARGET_OUT_UBUNTU_INITRD_PKG) + $(hide) mkdir -p $(TARGET_OUT_UBUNTU_INITRD_PKG) + $(hide) $(PULL_LP_BIN) $(TARGET_UBUNTU_INITRD_PKG) -o $(TARGET_OUT_UBUNTU_INITRD_PKG) -a $(TARGET_UBUNTU_ARCH)$(if $(TARGET_UBUNTU_INITRD_TEAM), -t $(TARGET_UBUNTU_INITRD_TEAM))$(if $(TARGET_UBUNTU_INITRD_PPA), -p $(TARGET_UBUNTU_INITRD_PPA)) $(TARGET_UBUNTU_INITRD_SERIES) + $(hide) dpkg-deb -x $(TARGET_OUT_UBUNTU_INITRD_PKG)/$(TARGET_UBUNTU_INITRD_PKG)*.deb $(TARGET_OUT_UBUNTU_INITRD_PKG) + $(hide) $(ACP) $(TARGET_UBUNTU_INITRD_LP_IMG) $@ +endif + $(hide) cd $(TARGET_OUT_UBUNTU_INITRD) && $(MINIGZIP) -c -d $@ | cpio -id +ifdef BOARD_OVERLAY_INITRD + $(hide) if [ -d $(TARGET_OUT_UBUNTU_RAMDISK) ]; then cp -r $(TARGET_OUT_UBUNTU_RAMDISK)/* $(TARGET_OUT_UBUNTU_INITRD); fi + $(call pretty,"Repacking ubuntu ramdisk to: $@") + $(hide) cd $(TARGET_OUT_UBUNTU_INITRD) && find . | cpio -o -H newc | $(MINIGZIP) > $@ +endif + .PHONY: ramdisk-nodeps ramdisk-nodeps: $(MKBOOTFS) | $(MINIGZIP) @echo "make $@: ignoring dependencies" - $(hide) $(MKBOOTFS) $(TARGET_ROOT_OUT) | $(MINIGZIP) > $(INSTALLED_RAMDISK_TARGET) + $(call pretty,"Target Android ram disk: $@") + $(hide) $(MKBOOTFS) $(TARGET_ROOT_OUT) | $(MINIGZIP) > $(INSTALLED_RAMDISK_TARGET_ANDROID) + $(hide) $(ACP) $(INSTALLED_RAMDISK_TARGET_ANDROID) $(BOOT_ANDROID_RAMDISK_IMG) ifneq ($(strip $(TARGET_NO_KERNEL)),true) # ----------------------------------------------------------------- # the boot image, which is a collection of other images. +INTERNAL_BOOTIMAGE_ARGS_ANDROID := \ + $(addprefix --second ,$(INSTALLED_2NDBOOTLOADER_TARGET)) \ + --kernel $(INSTALLED_KERNEL_TARGET) \ + --ramdisk $(INSTALLED_RAMDISK_TARGET_ANDROID) + +INTERNAL_BOOTIMAGE_FILES_ANDROID := $(filter-out --%,$(INTERNAL_BOOTIMAGE_ARGS_ANDROID)) + INTERNAL_BOOTIMAGE_ARGS := \ $(addprefix --second ,$(INSTALLED_2NDBOOTLOADER_TARGET)) \ --kernel $(INSTALLED_KERNEL_TARGET) \ @@ -473,68 +564,105 @@ INTERNAL_BOOTIMAGE_FILES := $(filter-out --%,$(INTERNAL_BOOTIMAGE_ARGS)) BOARD_KERNEL_CMDLINE := $(strip $(BOARD_KERNEL_CMDLINE)) ifdef BOARD_KERNEL_CMDLINE - INTERNAL_BOOTIMAGE_ARGS += --cmdline "$(BOARD_KERNEL_CMDLINE)" + INTERNAL_BOOTIMAGE_ARGS_COMMON += --cmdline "$(BOARD_KERNEL_CMDLINE)" endif BOARD_KERNEL_BASE := $(strip $(BOARD_KERNEL_BASE)) ifdef BOARD_KERNEL_BASE - INTERNAL_BOOTIMAGE_ARGS += --base $(BOARD_KERNEL_BASE) + INTERNAL_BOOTIMAGE_ARGS_COMMON += --base $(BOARD_KERNEL_BASE) endif BOARD_KERNEL_PAGESIZE := $(strip $(BOARD_KERNEL_PAGESIZE)) ifdef BOARD_KERNEL_PAGESIZE - INTERNAL_BOOTIMAGE_ARGS += --pagesize $(BOARD_KERNEL_PAGESIZE) + INTERNAL_BOOTIMAGE_ARGS_COMMON += --pagesize $(BOARD_KERNEL_PAGESIZE) endif +INSTALLED_DTIMAGE_TARGET := $(PRODUCT_OUT)/dt.img + +ifeq ($(strip $(BOARD_KERNEL_SEPARATED_DT)),true) + INTERNAL_BOOTIMAGE_ARGS += --dt $(INSTALLED_DTIMAGE_TARGET) + BOOTIMAGE_EXTRA_DEPS := $(INSTALLED_DTIMAGE_TARGET) +endif + +INSTALLED_BOOTIMAGE_TARGET_ANDROID := $(PRODUCT_OUT)/android-boot.img + INSTALLED_BOOTIMAGE_TARGET := $(PRODUCT_OUT)/boot.img ifeq ($(TARGET_BOOTIMAGE_USE_EXT2),true) tmp_dir_for_image := $(call intermediates-dir-for,EXECUTABLES,boot_img)/bootimg -INTERNAL_BOOTIMAGE_ARGS += --tmpdir $(tmp_dir_for_image) -INTERNAL_BOOTIMAGE_ARGS += --genext2fs $(MKEXT2IMG) +INTERNAL_BOOTIMAGE_ARGS_COMMON += --tmpdir $(tmp_dir_for_image) +INTERNAL_BOOTIMAGE_ARGS_COMMON += --genext2fs $(MKEXT2IMG) +INTERNAL_BOOTIMAGE_ARGS += $(INTERNAL_BOOTIMAGE_ARGS_COMMON) +INTERNAL_BOOTIMAGE_ARGS_ANDROID += $(INTERNAL_BOOTIMAGE_ARGS_COMMON) -ifeq ($(TARGET_BOOTIMAGE_USE_EXTLINUX),true) -INTERNAL_BOOTIMAGE_ARGS += --extlinuxconf $(TARGET_BOOTIMAGE_EXTLINUX_CONFIG) -endif +$(INSTALLED_BOOTIMAGE_TARGET_ANDROID): $(MKEXT2IMG) $(INTERNAL_BOOTIMAGE_FILES_ANDROID) + $(call pretty,"Target boot image for Android: $@") + $(hide) $(MKEXT2BOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS_ANDROID) --output $@ $(INSTALLED_BOOTIMAGE_TARGET): $(MKEXT2IMG) $(INTERNAL_BOOTIMAGE_FILES) - $(call pretty,"Target boot image: $@") + $(call pretty,"Target boot image for Ubuntu Touch: $@") $(hide) $(MKEXT2BOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) --output $@ + @echo -e ${CL_CYN}"Made boot image: $@"${CL_RST} .PHONY: bootimage-nodeps bootimage-nodeps: $(MKEXT2IMG) @echo "make $@: ignoring dependencies" + $(call pretty,"Repacking ubuntu ramdisk to: $(INSTALLED_RAMDISK_TARGET)") + $(hide) cd $(TARGET_OUT_UBUNTU_INITRD) && find . | cpio -o -H newc | $(MINIGZIP) > $(INSTALLED_RAMDISK_TARGET) $(hide) $(MKEXT2BOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) --output $(INSTALLED_BOOTIMAGE_TARGET) -else ifeq (true,$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VERITY)) # TARGET_BOOTIMAGE_USE_EXT2 != true +else ifndef BOARD_CUSTOM_BOOTIMG_MK -$(INSTALLED_BOOTIMAGE_TARGET): $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_FILES) $(BOOT_SIGNER) - $(call pretty,"Target boot image: $@") + ifeq (true,$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VERITY)) # TARGET_BOOTIMAGE_USE_EXT2 != true + +$(INSTALLED_BOOTIMAGE_TARGET_ANDROID): $(MKEXT2IMG) $(INTERNAL_BOOTIMAGE_FILES_ANDROID) + $(call pretty,"Target boot image for Android: $@") + $(hide) $(MKEXT2BOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS_ANDROID) --output $@ + +$(INSTALLED_BOOTIMAGE_TARGET): $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_FILES) $(BOOT_SIGNER) $(BOOTIMAGE_EXTRA_DEPS) + $(call pretty,"Target boot image for Ubuntu Touch: $@") $(hide) $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $@ - $(BOOT_SIGNER) /boot $@ $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VERITY_SIGNING_KEY).pk8 $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VERITY_SIGNING_KEY).x509.pem $@ + $(BOOT_SIGNER) /boot $@ $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VERITY_SIGNING_KEY) $@ $(hide) $(call assert-max-image-size,$@,$(BOARD_BOOTIMAGE_PARTITION_SIZE)) .PHONY: bootimage-nodeps bootimage-nodeps: $(MKBOOTIMG) $(BOOT_SIGNER) @echo "make $@: ignoring dependencies" + $(call pretty,"Repacking ubuntu ramdisk to: $(INSTALLED_RAMDISK_TARGET)") + $(hide) cd $(TARGET_OUT_UBUNTU_INITRD) && find . | cpio -o -H newc | $(MINIGZIP) >$(INSTALLED_RAMDISK_TARGET) $(hide) $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $(INSTALLED_BOOTIMAGE_TARGET) $(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) $(hide) $(call assert-max-image-size,$(INSTALLED_BOOTIMAGE_TARGET),$(BOARD_BOOTIMAGE_PARTITION_SIZE)) -else # PRODUCT_SUPPORTS_VERITY != true + else # PRODUCT_SUPPORTS_VERITY != true +INTERNAL_BOOTIMAGE_ARGS += $(INTERNAL_BOOTIMAGE_ARGS_COMMON) +INTERNAL_BOOTIMAGE_ARGS_ANDROID += $(INTERNAL_BOOTIMAGE_ARGS_COMMON) -$(INSTALLED_BOOTIMAGE_TARGET): $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_FILES) - $(call pretty,"Target boot image: $@") +$(INSTALLED_BOOTIMAGE_TARGET_ANDROID): $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_FILES_ANDROID) + $(call pretty,"Target boot image for Android: $@") + $(hide) $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS_ANDROID) $(BOARD_MKBOOTIMG_ARGS) --output $@ + $(hide) $(call assert-max-image-size,$@,$(BOARD_BOOTIMAGE_PARTITION_SIZE),raw) + +$(INSTALLED_BOOTIMAGE_TARGET): $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_FILES) $(BOOTIMAGE_EXTRA_DEPS) + $(call pretty,"Target boot image for Ubuntu Touch: $@") $(hide) $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $@ $(hide) $(call assert-max-image-size,$@,$(BOARD_BOOTIMAGE_PARTITION_SIZE)) + @echo -e ${CL_CYN}"Made boot image: $@"${CL_RST} .PHONY: bootimage-nodeps bootimage-nodeps: $(MKBOOTIMG) @echo "make $@: ignoring dependencies" + $(call pretty,"Repacking ubuntu ramdisk to: $(INSTALLED_RAMDISK_TARGET)") + $(hide) cd $(TARGET_OUT_UBUNTU_INITRD) && find . | cpio -o -H newc | $(MINIGZIP) > $(INSTALLED_RAMDISK_TARGET) $(hide) $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $(INSTALLED_BOOTIMAGE_TARGET) $(hide) $(call assert-max-image-size,$(INSTALLED_BOOTIMAGE_TARGET),$(BOARD_BOOTIMAGE_PARTITION_SIZE)) + @echo -e ${CL_INS}"Made boot image: $@"${CL_RST} -endif # TARGET_BOOTIMAGE_USE_EXT2 + endif # PRODUCT_SUPPORTS_VERITY +else + INTERNAL_BOOTIMAGE_ARGS += $(INTERNAL_BOOTIMAGE_ARGS_COMMON) + INTERNAL_BOOTIMAGE_ARGS_ANDROID += $(INTERNAL_BOOTIMAGE_ARGS_COMMON) +endif # TARGET_BOOTIMAGE_USE_EXT2 / BOARD_CUSTOM_BOOTIMG_MK else # TARGET_NO_KERNEL # HACK: The top-level targets depend on the bootimage. Not all targets @@ -543,8 +671,10 @@ else # TARGET_NO_KERNEL # TODO: make the emulator use bootimages, and make mkbootimg accept # kernel-less inputs. INSTALLED_BOOTIMAGE_TARGET := $(INSTALLED_RAMDISK_TARGET) +INSTALLED_BOOTIMAGE_TARGET_ANDROID := $(INSTALLED_RAMDISK_TARGET_ANDROID) endif + # ----------------------------------------------------------------- # NOTICE files # @@ -638,7 +768,7 @@ endif # TARGET_BUILD_APPS $(kernel_notice_file): \ prebuilts/qemu-kernel/arm/LINUX_KERNEL_COPYING \ | $(ACP) - @echo Copying: $@ + @echo -e ${CL_CYN}"Copying:"${CL_RST}" $@" $(hide) mkdir -p $(dir $@) $(hide) $(ACP) $< $@ @@ -679,6 +809,12 @@ INTERNAL_USERIMAGES_EXT_VARIANT := ext4 endif endif endif +ifeq ($(TARGET_USERIMAGES_USE_F2FS),true) +INTERNAL_USERIMAGES_USE_F2FS := true +ifeq ($(INTERNAL_USERIMAGES_EXT_VARIANT),) +INTERNAL_USERIMAGES_EXT_VARIANT := f2fs +endif +endif # These options tell the recovery updater/installer how to mount the partitions writebale. # =[|]... @@ -691,15 +827,22 @@ ifneq (true,$(TARGET_USERIMAGES_SPARSE_EXT_DISABLED)) INTERNAL_USERIMAGES_SPARSE_EXT_FLAG := -s endif +ifneq ($(TARGET_TRANSPARENT_COMPRESSION_METHOD),) + INTERNAL_TRANSPARENT_COMPRESSION_METHOD := $(TARGET_TRANSPARENT_COMPRESSION_METHOD) +endif + +INTERNAL_USERIMAGES_DEPS := ifeq ($(INTERNAL_USERIMAGES_USE_EXT),true) -INTERNAL_USERIMAGES_DEPS := $(SIMG2IMG) INTERNAL_USERIMAGES_DEPS += $(MKEXTUSERIMG) $(MAKE_EXT4FS) $(E2FSCK) -ifeq ($(TARGET_USERIMAGES_USE_F2FS),true) +endif +INTERNAL_USERIMAGES_DEPS += $(MKEXTUBUNTUIMG) +ifeq ($(INTERNAL_USERIMAGES_USE_F2FS),true) INTERNAL_USERIMAGES_DEPS += $(MKF2FSUSERIMG) $(MAKE_F2FS) endif -else +ifeq ($(INTERNAL_USERIMAGES_DEPS),) INTERNAL_USERIMAGES_DEPS := $(MKYAFFS2) endif +INTERNAL_USERIMAGES_DEPS += $(SIMG2IMG) INTERNAL_USERIMAGES_BINARY_PATHS := $(sort $(dir $(INTERNAL_USERIMAGES_DEPS))) @@ -714,20 +857,31 @@ INTERNAL_USERIMAGES_DEPS += $(SELINUX_FC) # $(2): additional "key=value" pairs to append to the dictionary file. define generate-userimage-prop-dictionary $(if $(INTERNAL_USERIMAGES_EXT_VARIANT),$(hide) echo "fs_type=$(INTERNAL_USERIMAGES_EXT_VARIANT)" >> $(1)) -$(if $(BOARD_SYSTEMIMAGE_PARTITION_SIZE),$(hide) echo "system_size=$(BOARD_SYSTEMIMAGE_PARTITION_SIZE)" >> $(1)) +$(if $(BOARD_SYSTEMIMAGE_FILE_SYSTEM_TYPE),$(hide) echo "system_fs_type=$(BOARD_SYSTEMIMAGE_FILE_SYSTEM_TYPE)" >> $(1)) +# Use actual size of the system to create directly right size of the system, with spare 10M. Avoid using du -b since it's not support on BSD +$(hide) echo "system_size=$$(du -sk $(TARGET_OUT) | awk '{print $$1*1024+$(if $(BOARD_SYSTEMIMAGE_PARTITION_PADDING),$(BOARD_SYSTEMIMAGE_PARTITION_PADDING),10485760)}')" >> $(1) $(if $(BOARD_SYSTEMIMAGE_JOURNAL_SIZE),$(hide) echo "system_journal_size=$(BOARD_SYSTEMIMAGE_JOURNAL_SIZE)" >> $(1)) $(if $(BOARD_USERDATAIMAGE_FILE_SYSTEM_TYPE),$(hide) echo "userdata_fs_type=$(BOARD_USERDATAIMAGE_FILE_SYSTEM_TYPE)" >> $(1)) $(if $(BOARD_USERDATAIMAGE_PARTITION_SIZE),$(hide) echo "userdata_size=$(BOARD_USERDATAIMAGE_PARTITION_SIZE)" >> $(1)) +$(if $(BOARD_USERDATAEXTRAIMAGE_PARTITION_SIZE),$(hide) echo "userdataextra_size=$(BOARD_USERDATAEXTRAIMAGE_PARTITION_SIZE)" >> $(1)) +$(if $(BOARD_USERDATAEXTRAIMAGE_PARTITION_NAME),$(hide) echo "userdataextra_name=$(BOARD_USERDATAEXTRAIMAGE_PARTITION_NAME)" >> $(1)) $(if $(BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE),$(hide) echo "cache_fs_type=$(BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE)" >> $(1)) $(if $(BOARD_CACHEIMAGE_PARTITION_SIZE),$(hide) echo "cache_size=$(BOARD_CACHEIMAGE_PARTITION_SIZE)" >> $(1)) +# if we don't have dedicated Ubuntu rootfs partition, use system instead +$(if $(BOARD_UBUNTUROOTFSIMAGE_PARTITION_SIZE),$(hide) echo "ubuntu_rootfs_size=$(BOARD_UBUNTUROOTFSIMAGE_PARTITION_SIZE)" >> $(1), + $(hide) echo "ubuntu_rootfs_size=$(BOARD_SYSTEMIMAGE_PARTITION_SIZE)" >> $(1)) +$(if $(BOARD_UBUNTUCUSTOMIMAGE_PARTITION_SIZE),$(hide) echo "ubuntu_custom_size=$(BOARD_UBUNTUCUSTOMIMAGE_PARTITION_SIZE)" >> $(1)) $(if $(BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE),$(hide) echo "vendor_fs_type=$(BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE)" >> $(1)) $(if $(BOARD_VENDORIMAGE_PARTITION_SIZE),$(hide) echo "vendor_size=$(BOARD_VENDORIMAGE_PARTITION_SIZE)" >> $(1)) $(if $(BOARD_VENDORIMAGE_JOURNAL_SIZE),$(hide) echo "vendor_journal_size=$(BOARD_VENDORIMAGE_JOURNAL_SIZE)" >> $(1)) $(if $(BOARD_OEMIMAGE_PARTITION_SIZE),$(hide) echo "oem_size=$(BOARD_OEMIMAGE_PARTITION_SIZE)" >> $(1)) $(if $(BOARD_OEMIMAGE_JOURNAL_SIZE),$(hide) echo "oem_journal_size=$(BOARD_OEMIMAGE_JOURNAL_SIZE)" >> $(1)) $(if $(INTERNAL_USERIMAGES_SPARSE_EXT_FLAG),$(hide) echo "extfs_sparse_flag=$(INTERNAL_USERIMAGES_SPARSE_EXT_FLAG)" >> $(1)) +$(if $(INTERNAL_TRANSPARENT_COMPRESSION_METHOD),$(hide) echo "transparent_compression_method=$(INTERNAL_TRANSPARENT_COMPRESSION_METHOD)" >> $(1)) $(if $(mkyaffs2_extra_flags),$(hide) echo "mkyaffs2_extra_flags=$(mkyaffs2_extra_flags)" >> $(1)) $(hide) echo "selinux_fc=$(SELINUX_FC)" >> $(1) +$(hide) echo "ubuntu_rootfs_content=$(TARGET_OUT_UBUNTU_ROOTFS).content" >> $(1) +$(hide) echo "ubuntu_custom_content=$(TARGET_OUT_UBUNTU_CUSTOM).content" >> $(1) $(if $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VERITY),$(hide) echo "verity=$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VERITY)" >> $(1)) $(if $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VERITY),$(hide) echo "verity_key=$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VERITY_SIGNING_KEY)" >> $(1)) $(if $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VERITY),$(hide) echo "verity_signer_cmd=$(VERITY_SIGNER)" >> $(1)) @@ -744,23 +898,32 @@ ifeq (,$(filter true, $(TARGET_NO_KERNEL) $(TARGET_NO_RECOVERY))) INSTALLED_RECOVERYIMAGE_TARGET := $(PRODUCT_OUT)/recovery.img -recovery_initrc := $(call include-path-for, recovery)/etc/init.rc +recovery_initrc := $(call project-path-for,recovery)/etc/init.rc recovery_sepolicy := $(call intermediates-dir-for,ETC,sepolicy.recovery)/sepolicy.recovery recovery_kernel := $(INSTALLED_KERNEL_TARGET) # same as a non-recovery system recovery_ramdisk := $(PRODUCT_OUT)/ramdisk-recovery.img +recovery_uncompressed_ramdisk := $(PRODUCT_OUT)/ramdisk-recovery.cpio recovery_build_prop := $(INSTALLED_BUILD_PROP_TARGET) recovery_binary := $(call intermediates-dir-for,EXECUTABLES,recovery)/recovery -recovery_resources_common := $(call include-path-for, recovery)/res +recovery_resources_common := $(call project-path-for,recovery)/res # Set recovery_density to the density bucket of the device. recovery_density := unknown +ifneq (,$(TARGET_RECOVERY_DENSITY)) +recovery_density := $(filter %dpi,$(TARGET_RECOVERY_DENSITY)) +else ifneq (,$(PRODUCT_AAPT_PREF_CONFIG)) +ifeq ($(PRODUCT_AAPT_PREF_CONFIG),560dpi) +recovery_density := xxxhdpi +else # If PRODUCT_AAPT_PREF_CONFIG includes a dpi bucket, then use that value. recovery_density := $(filter %dpi,$(PRODUCT_AAPT_PREF_CONFIG)) +endif else # Otherwise, use the default medium density. recovery_densities := mdpi endif +endif ifneq (,$(wildcard $(recovery_resources_common)-$(recovery_density))) recovery_resources_common := $(recovery_resources_common)-$(recovery_density) @@ -773,10 +936,20 @@ endif # can be overridden for a particular device by putting a font.png in # its private recovery resources. -ifneq (,$(filter xxxhdpi xxhdpi xhdpi,$(recovery_density))) -recovery_font := $(call include-path-for, recovery)/fonts/18x32.png +ifneq (,$(filter 560dpi xxxhdpi xxhdpi xhdpi,$(recovery_density))) +recovery_font := $(call project-path-for,recovery)/fonts/18x32.png else -recovery_font := $(call include-path-for, recovery)/fonts/12x22.png +recovery_font := $(call project-path-for,recovery)/fonts/12x22.png +endif + +ifneq ($(TARGET_RECOVERY_DEVICE_DIRS),) +recovery_root_private := $(strip \ + $(foreach d,$(TARGET_RECOVERY_DEVICE_DIRS), $(wildcard $(d)/recovery/root))) +else +recovery_root_private := $(strip $(wildcard $(TARGET_DEVICE_DIR)/recovery/root)) +endif +ifneq ($(recovery_root_private),) +recovery_root_deps := $(shell find $(recovery_root_private) -type f) endif recovery_resources_private := $(strip $(wildcard $(TARGET_DEVICE_DIR)/recovery/res)) @@ -805,6 +978,11 @@ INTERNAL_RECOVERYIMAGE_ARGS := \ # Assumes this has already been stripped ifdef BOARD_KERNEL_CMDLINE + ifdef BUILD_ENFORCE_SELINUX + ifneq (,$(filter androidboot.selinux=permissive androidboot.selinux=disabled, $(BOARD_KERNEL_CMDLINE))) + $(error "Trying to apply non-default selinux settings. Aborting") + endif + endif INTERNAL_RECOVERYIMAGE_ARGS += --cmdline "$(BOARD_KERNEL_CMDLINE)" endif ifdef BOARD_KERNEL_BASE @@ -814,65 +992,87 @@ BOARD_KERNEL_PAGESIZE := $(strip $(BOARD_KERNEL_PAGESIZE)) ifdef BOARD_KERNEL_PAGESIZE INTERNAL_RECOVERYIMAGE_ARGS += --pagesize $(BOARD_KERNEL_PAGESIZE) endif +ifeq ($(strip $(BOARD_KERNEL_SEPARATED_DT)),true) + INTERNAL_RECOVERYIMAGE_ARGS += --dt $(INSTALLED_DTIMAGE_TARGET) + RECOVERYIMAGE_EXTRA_DEPS := $(INSTALLED_DTIMAGE_TARGET) +endif # Keys authorized to sign OTA packages this build will accept. The # build always uses dev-keys for this; release packaging tools will # substitute other keys for this one. OTA_PUBLIC_KEYS := $(DEFAULT_SYSTEM_DEV_CERTIFICATE).x509.pem +ifneq ($(OTA_PACKAGE_SIGNING_KEY),) + OTA_PUBLIC_KEYS := $(OTA_PACKAGE_SIGNING_KEY).x509.pem + PRODUCT_EXTRA_RECOVERY_KEYS := $(DEFAULT_SYSTEM_DEV_CERTIFICATE) +else + PRODUCT_EXTRA_RECOVERY_KEYS += \ + build/target/product/security/cm \ + build/target/product/security/cm-devkey +endif + # Generate a file containing the keys that will be read by the # recovery binary. -RECOVERY_INSTALL_OTA_KEYS := \ - $(call intermediates-dir-for,PACKAGING,ota_keys)/keys -DUMPKEY_JAR := $(HOST_OUT_JAVA_LIBRARIES)/dumpkey.jar -$(RECOVERY_INSTALL_OTA_KEYS): PRIVATE_OTA_PUBLIC_KEYS := $(OTA_PUBLIC_KEYS) -$(RECOVERY_INSTALL_OTA_KEYS): extra_keys := $(patsubst %,%.x509.pem,$(PRODUCT_EXTRA_RECOVERY_KEYS)) -$(RECOVERY_INSTALL_OTA_KEYS): $(OTA_PUBLIC_KEYS) $(DUMPKEY_JAR) $(extra_keys) - @echo "DumpPublicKey: $@ <= $(PRIVATE_OTA_PUBLIC_KEYS) $(extra_keys)" - @rm -rf $@ - @mkdir -p $(dir $@) - java -jar $(DUMPKEY_JAR) $(PRIVATE_OTA_PUBLIC_KEYS) $(extra_keys) > $@ - -$(INSTALLED_RECOVERYIMAGE_TARGET): $(MKBOOTFS) $(MKBOOTIMG) $(MINIGZIP) \ +#RECOVERY_INSTALL_OTA_KEYS := \ +# $(call intermediates-dir-for,PACKAGING,ota_keys)/keys +#DUMPKEY_JAR := $(HOST_OUT_JAVA_LIBRARIES)/dumpkey.jar +#$(RECOVERY_INSTALL_OTA_KEYS): PRIVATE_OTA_PUBLIC_KEYS := $(OTA_PUBLIC_KEYS) +#$(RECOVERY_INSTALL_OTA_KEYS): extra_keys := $(patsubst %,%.x509.pem,$(PRODUCT_EXTRA_RECOVERY_KEYS)) +#$(RECOVERY_INSTALL_OTA_KEYS): $(OTA_PUBLIC_KEYS) $(DUMPKEY_JAR) $(extra_keys) +# @echo "DumpPublicKey: $@ <= $(PRIVATE_OTA_PUBLIC_KEYS) $(extra_keys)" +# @rm -rf $@ +# @mkdir -p $(dir $@) +# java -jar $(DUMPKEY_JAR) $(PRIVATE_OTA_PUBLIC_KEYS) $(extra_keys) > $@ + +$(recovery_ramdisk): $(MKBOOTFS) $(MINIGZIP) $(RECOVERYIMAGE_EXTRA_DEPS) \ $(INSTALLED_RAMDISK_TARGET) \ + $(INSTALLED_RAMDISK_TARGET_ANDROID) \ $(INSTALLED_BOOTIMAGE_TARGET) \ $(recovery_binary) \ - $(recovery_initrc) $(recovery_sepolicy) $(recovery_kernel) \ + $(recovery_initrc) \ $(INSTALLED_2NDBOOTLOADER_TARGET) \ - $(recovery_build_prop) $(recovery_resource_deps) \ - $(recovery_fstab) \ - $(RECOVERY_INSTALL_OTA_KEYS) - @echo ----- Making recovery image ------ - $(hide) rm -rf $(TARGET_RECOVERY_OUT) + $(recovery_build_prop) $(recovery_resource_deps) $(recovery_root_deps) \ + $(recovery_fstab) + @echo -e ${CL_CYN}"----- Making recovery image ------"${CL_RST} $(hide) mkdir -p $(TARGET_RECOVERY_OUT) $(hide) mkdir -p $(TARGET_RECOVERY_ROOT_OUT)/etc $(TARGET_RECOVERY_ROOT_OUT)/tmp - @echo Copying baseline ramdisk... - $(hide) cp -R $(TARGET_ROOT_OUT) $(TARGET_RECOVERY_OUT) - @echo Modifying ramdisk contents... + @echo -e ${CL_CYN}"Copying baseline ramdisk..."${CL_RST} + $(hide) (cd $(PRODUCT_OUT) && tar -cf - $(TARGET_COPY_OUT_ROOT) | (cd $(TARGET_RECOVERY_OUT) && tar -xf -)) + @echo -e ${CL_CYN}"Modifying ramdisk contents..."${CL_RST} $(hide) rm -f $(TARGET_RECOVERY_ROOT_OUT)/init*.rc $(hide) cp -f $(recovery_initrc) $(TARGET_RECOVERY_ROOT_OUT)/ $(hide) rm -f $(TARGET_RECOVERY_ROOT_OUT)/sepolicy - $(hide) cp -f $(recovery_sepolicy) $(TARGET_RECOVERY_ROOT_OUT)/sepolicy $(hide) -cp $(TARGET_ROOT_OUT)/init.recovery.*.rc $(TARGET_RECOVERY_ROOT_OUT)/ $(hide) cp -f $(recovery_binary) $(TARGET_RECOVERY_ROOT_OUT)/sbin/ $(hide) mkdir -p $(TARGET_RECOVERY_ROOT_OUT)/res $(hide) rm -rf $(TARGET_RECOVERY_ROOT_OUT)/res/* $(hide) cp -rf $(recovery_resources_common)/* $(TARGET_RECOVERY_ROOT_OUT)/res $(hide) cp -f $(recovery_font) $(TARGET_RECOVERY_ROOT_OUT)/res/images/font.png + $(hide) $(foreach item,$(recovery_root_private), \ + cp -rf $(item) $(TARGET_RECOVERY_OUT)/;) $(hide) $(foreach item,$(recovery_resources_private), \ - cp -rf $(item) $(TARGET_RECOVERY_ROOT_OUT)/) + cp -rf $(item) $(TARGET_RECOVERY_ROOT_OUT)/;) $(hide) $(foreach item,$(recovery_fstab), \ - cp -f $(item) $(TARGET_RECOVERY_ROOT_OUT)/etc/recovery.fstab) - $(hide) cp $(RECOVERY_INSTALL_OTA_KEYS) $(TARGET_RECOVERY_ROOT_OUT)/res/keys + cp -f $(item) $(TARGET_RECOVERY_ROOT_OUT)/etc/recovery.fstab;) $(hide) cat $(INSTALLED_DEFAULT_PROP_TARGET) $(recovery_build_prop) \ > $(TARGET_RECOVERY_ROOT_OUT)/default.prop $(hide) $(MKBOOTFS) $(TARGET_RECOVERY_ROOT_OUT) | $(MINIGZIP) > $(recovery_ramdisk) + +$(recovery_uncompressed_ramdisk): $(MINIGZIP) $(recovery_ramdisk) + @echo -e ${CL_CYN}"----- Making uncompressed recovery ramdisk ------"${CL_RST} + $(MKBOOTFS) $(TARGET_RECOVERY_ROOT_OUT) > $@ + +ifndef BOARD_CUSTOM_BOOTIMG_MK +$(INSTALLED_RECOVERYIMAGE_TARGET): $(MKBOOTIMG) $(recovery_ramdisk) \ + $(recovery_kernel) $(hide) $(MKBOOTIMG) $(INTERNAL_RECOVERYIMAGE_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $@ ifeq (true,$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VERITY)) $(BOOT_SIGNER) /recovery $@ $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VERITY_SIGNING_KEY).pk8 $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VERITY_SIGNING_KEY).x509.pem $@ endif $(hide) $(call assert-max-image-size,$@,$(BOARD_RECOVERYIMAGE_PARTITION_SIZE)) - @echo ----- Made recovery image: $@ -------- + @echo -e ${CL_CYN}"Made recovery image: $@"${CL_RST} + +endif # BOARD_CUSTOM_BOOTIMG_MK $(RECOVERY_RESOURCE_ZIP): $(INSTALLED_RECOVERYIMAGE_TARGET) $(hide) mkdir -p $(dir $@) @@ -886,6 +1086,14 @@ endif .PHONY: recoveryimage recoveryimage: $(INSTALLED_RECOVERYIMAGE_TARGET) $(RECOVERY_RESOURCE_ZIP) +INSTALLED_RECOVERYZIP_TARGET := $(PRODUCT_OUT)/utilities/update.zip +$(INSTALLED_RECOVERYZIP_TARGET): $(INSTALLED_RECOVERYIMAGE_TARGET) $(TARGET_OUT)/bin/updater + @echo ----- Making recovery zip ----- + ./build/tools/device/mkrecoveryzip.sh $(PRODUCT_OUT) $(HOST_OUT_JAVA_LIBRARIES)/signapk.jar + +.PHONY: recoveryzip +recoveryzip: $(INSTALLED_RECOVERYZIP_TARGET) + ifneq ($(BOARD_NAND_PAGE_SIZE),) mkyaffs2_extra_flags := -c $(BOARD_NAND_PAGE_SIZE) else @@ -899,6 +1107,11 @@ else BOARD_NAND_SPARE_SIZE := 64 endif +ifdef BOARD_CUSTOM_BOOTIMG_MK +include $(BOARD_CUSTOM_BOOTIMG_MK) +endif + + # ----------------------------------------------------------------- # system image # @@ -913,7 +1126,8 @@ INTERNAL_SYSTEMIMAGE_FILES := $(filter $(TARGET_OUT)/%, \ $(ALL_GENERATED_SOURCES) \ $(ALL_DEFAULT_INSTALLED_MODULES) \ $(PDK_FUSION_SYSIMG_FILES) \ - $(RECOVERY_RESOURCE_ZIP)) + $(RECOVERY_RESOURCE_ZIP) \ + $(BOOT_ANDROID_RAMDISK_IMG)) FULL_SYSTEMIMAGE_DEPS := $(INTERNAL_SYSTEMIMAGE_FILES) $(INTERNAL_USERIMAGES_DEPS) # ----------------------------------------------------------------- @@ -983,19 +1197,26 @@ SYSTEMIMAGE_SOURCE_DIR := $(TARGET_OUT) # image size check calculation. ifneq ($(INSTALLED_RECOVERYIMAGE_TARGET),) intermediates := $(call intermediates-dir-for,PACKAGING,recovery_patch) +ifndef BOARD_CANT_BUILD_RECOVERY_FROM_BOOT_PATCH RECOVERY_FROM_BOOT_PATCH := $(intermediates)/recovery_from_boot.p +else +RECOVERY_FROM_BOOT_PATCH := +endif $(RECOVERY_FROM_BOOT_PATCH): $(INSTALLED_RECOVERYIMAGE_TARGET) \ $(INSTALLED_BOOTIMAGE_TARGET) \ - $(HOST_OUT_EXECUTABLES)/imgdiff \ - $(HOST_OUT_EXECUTABLES)/bsdiff - @echo "Construct recovery from boot" + $(HOST_OUT_EXECUTABLES)/imgdiff + @echo -e ${CL_CYN}"Construct recovery from boot"${CL_RST} mkdir -p $(dir $@) +ifeq ($(TARGET_NOT_USE_GZIP_RECOVERY_RAMDISK),true) + PATH=$(HOST_OUT_EXECUTABLES):$$PATH $(HOST_OUT_EXECUTABLES)/bsdiff $(INSTALLED_BOOTIMAGE_TARGET) $(INSTALLED_RECOVERYIMAGE_TARGET) $@ +else PATH=$(HOST_OUT_EXECUTABLES):$$PATH $(HOST_OUT_EXECUTABLES)/imgdiff $(INSTALLED_BOOTIMAGE_TARGET) $(INSTALLED_RECOVERYIMAGE_TARGET) $@ endif +endif $(INSTALLED_SYSTEMIMAGE): $(BUILT_SYSTEMIMAGE) $(RECOVERY_FROM_BOOT_PATCH) | $(ACP) - @echo "Install system fs image: $@" + @echo -e ${CL_CYN}"Install system fs image: $@"${CL_RST} $(copy-file-to-target) $(hide) $(call assert-max-image-size,$@ $(RECOVERY_FROM_BOOT_PATCH),$(BOARD_SYSTEMIMAGE_PARTITION_SIZE)) @@ -1170,6 +1391,131 @@ $(INSTALLED_USERDATATARBALL_TARGET): $(FS_GET_STATS) $(INTERNAL_USERDATAIMAGE_FI userdatatarball-nodeps: $(FS_GET_STATS) $(build-userdatatarball-target) +# ----------------------------------------------------------------- +# Ubuntu Rootfs Image - Start +INTERNAL_UBUNTUROOTFSIMAGE_FILES := \ + $(filter $(TARGET_OUT_UBUNTU_ROOTFS)/%,$(ALL_DEFAULT_INSTALLED_MODULES)) + +ubuntu_rootfs_image_intermediates := \ + $(call intermediates-dir-for,PACKAGING,ubunturootfs) +BUILT_UBUNTU_ROOTFS_IMAGE_TARGET := $(PRODUCT_OUT)/ubunturootfs.img + +define build-ubunturootfs-image-target + $(call pretty,"Target Ubuntu rootfs fs image: $(INSTALLED_UBUNTU_ROOTFS_IMAGE_TARGET)") + @mkdir -p $(TARGET_OUT_UBUNTU_ROOTFS) + @mkdir -p $(ubuntu_rootfs_image_intermediates) && rm -rf $(ubuntu_rootfs_image_intermediates)/ubuntu_rootfs_image_info.txt + $(call generate-userimage-prop-dictionary, $(ubuntu_rootfs_image_intermediates)/ubuntu_rootfs_image_info.txt, skip_fsck=true) + $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH \ + ./build/tools/releasetools/build_image.py \ + $(TARGET_OUT_UBUNTU_ROOTFS) $(ubuntu_rootfs_image_intermediates)/ubuntu_rootfs_image_info.txt $(INSTALLED_UBUNTU_ROOTFS_IMAGE_TARGET) + $(hide) $(call assert-max-image-size,$(INSTALLED_UBUNTU_ROOTFS_IMAGE_TARGET),$(BOARD_UBUNTUIMAGE_PARTITION_SIZE),yaffs) + $(if $(BOARD_UBUNTUROOTFSIMAGE_PARTITION_SIZE),, + $(hide) mv $(INSTALLED_UBUNTU_ROOTFS_IMAGE_TARGET) $(PRODUCT_OUT)/system.img) +endef + +# We just build this directly to the install location. +ROOTFS_PACKAGES := $(ubuntu_rootfs_image_intermediates)/ubuntu_rootfs_image_content +INSTALLED_UBUNTU_ROOTFS_IMAGE_TARGET := $(BUILT_UBUNTU_ROOTFS_IMAGE_TARGET) +$(INSTALLED_UBUNTU_ROOTFS_IMAGE_TARGET): $(INTERNAL_USERIMAGES_DEPS) \ + $(INTERNAL_UBUNTUROOTFSIMAGE_FILES) $(INSTALL_DEVICE_PACKAGE_TARGET) + +UBUNTU_PREPARE_PACKAGES := ubuntu/prebuilts/prepare-ubuntu-packages-for-build +UBUNTU_UNPACK_ROOTFS := ubuntu/prebuilts/unpack_rootfs.sh +.PHONY: ubunturootfsimage +ubunturootfsimage: $(INSTALLED_UBUNTU_ROOTFS_IMAGE_TARGET) + @mkdir -p $(TARGET_OUT_UBUNTU_ROOTFS) + @mkdir -p $(ubuntu_rootfs_image_intermediates) + $(hide) if [ -z "$$UBUNTU_ROOTFS_PACKAGES" ]; then \ + ROOTFS_PACKAGES=$(ROOTFS_PACKAGES) $(SHELL) $(UBUNTU_PREPARE_PACKAGES); \ + else \ + echo "export UBUNTU_ROOTFS_PACKAGES=\"$$UBUNTU_ROOTFS_PACKAGES\"" > $(ROOTFS_PACKAGES);\ + fi + @echo "Unpacking Ubuntu rootfs packages..." + $(hide) $(SHELL) $(UBUNTU_UNPACK_ROOTFS) $(TARGET_OUT_UBUNTU_ROOTFS) $(ROOTFS_PACKAGES) + $(hide) if [ -d $(devicepackage_intermediates)/system ]; then\ + cp -r $(devicepackage_intermediates)/system/. $(TARGET_OUT_UBUNTU_ROOTFS);\ + else \ + cp $(BUILT_SYSTEMIMAGE) $(TARGET_OUT_UBUNTU_ROOTFS)/var/lib/lxc/android/;\ + fi + $(build-ubunturootfs-image-target) + +.PHONY: ubunturootfsimage-nodeps +ubunturootfsimage-nodeps: | $(INTERNAL_USERIMAGES_DEPS) + $(build-ubunturootfs-image-target) + +# Ubuntu Rootfs Image - End + +# ----------------------------------------------------------------- +# Ubuntu Custom Image - Start +INTERNAL_UBUNTUCUSTOMIMAGE_FILES := \ + $(filter $(TARGET_OUT_UBUNTU_CUSTOM)/%,$(ALL_DEFAULT_INSTALLED_MODULES)) + +ubuntu_custom_image_intermediates := \ + $(call intermediates-dir-for,PACKAGING,ubuntucustom) +BUILT_UBUNTU_CUSTOM_IMAGE_TARGET := $(PRODUCT_OUT)/ubuntucustom$(UBUNTU_CUSTOM_TAG).img + +define build-ubuntucustom-image-target + $(call pretty,"Target Ubuntu custom fs image: $(INSTALLED_UBUNTU_CUSTOM_IMAGE_TARGET)") + @mkdir -p $(TARGET_OUT_UBUNTU_CUSTOM) + @mkdir -p $(ubuntu_custom_image_intermediates) && rm -rf $(ubuntu_custom_image_intermediates)/ubuntu_custom_image_info.txt + $(call generate-userimage-prop-dictionary, $(ubuntu_custom_image_intermediates)/ubuntu_custom_image_info.txt, skip_fsck=true) + $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH \ + ./build/tools/releasetools/build_image.py \ + $(TARGET_OUT_UBUNTU_CUSTOM) $(ubuntu_custom_image_intermediates)/ubuntu_custom_image_info.txt $(INSTALLED_UBUNTU_CUSTOM_IMAGE_TARGET) + $(hide) $(call assert-max-image-size,$(INSTALLED_UBUNTU_CUSTOM_IMAGE_TARGET),$(BOARD_UCUSTOMIMAGE_PARTITION_SIZE),yaffs) +endef + +# We just build this directly to the install location. +INSTALLED_UBUNTU_CUSTOM_IMAGE_TARGET := $(BUILT_UBUNTU_CUSTOM_IMAGE_TARGET) +$(INSTALLED_UBUNTU_CUSTOM_IMAGE_TARGET): $(INTERNAL_USERIMAGES_DEPS) \ + $(INTERNAL_UBUNTUCUSTOMIMAGE_FILES) + $(build-ubuntucustom-image-target) + +.PHONY: ubuntucustomimage-nodeps +ubuntucustomimage-nodeps: | $(INTERNAL_USERIMAGES_DEPS) + $(build-ubuntucustom-image-target) + +# Ubuntu Custom Image - End + +# Ubuntu device package - Start +# Default ramdisk comes now from Ubuntu +INTERNAL_DEVICE_PACKAGE_FILES := \ + $(filter $(PRODUCT_OUT)/pre-update.sh,$(ALL_DEFAULT_INSTALLED_MODULES)) \ + $(filter $(PRODUCT_OUT)/post-update.sh,$(ALL_DEFAULT_INSTALLED_MODULES)) + +INSTALL_DEVICE_PACKAGE_TARGET := $(PRODUCT_OUT)/device.tar.xz +BUILT_UBUNTU_DEVICE_PACKAGE_TOOL := build/tools/releasetools/device_package_from_target_files.sh +devicepackage_intermediates := \ + $(call intermediates-dir-for,PACKAGING,devicepackage) + +define build-ubuntu-device-package-target + $(call pretty,"Creating Target Ubuntu device package: $(INSTALL_DEVICE_PACKAGE_TARGET)") + $(hide) PWD="$(PWD)" \ + PRODUCT_OUT="$(PRODUCT_OUT)" \ + BUILT_SYSTEMIMAGE="$(BUILT_SYSTEMIMAGE)" \ + PACKAGING_INTERMEDIATES="$(devicepackage_intermediates)" \ + DEVICE_PACKAGE_TARGET="$(INSTALL_DEVICE_PACKAGE_TARGET)" \ + RAW_PARTITIONS="$(INSTALLED_BOOTIMAGE_TARGET):boot.img \ + $(INSTALLED_RECOVERYIMAGE_TARGET):recovery.img" \ + DEVICE_BUILD_ID="true" \ + IGNORE_BLOBS="ubunturootfs.img ubuntucustom.img system.img cache.img userdata.img boot.img recovery.img" \ + DEVICE_PACKAGE_OVERLAY=$(DEVICE_PACKAGE_OVERLAY) \ + KEYPATH=$(KEYPATH) \ + $(SHELL) $(BUILT_UBUNTU_DEVICE_PACKAGE_TOOL) + $(call pretty,"Target device package for Ubuntu: $@") +endef + +$(INSTALL_DEVICE_PACKAGE_TARGET): $(INTERNAL_USERIMAGES_DEPS) \ + $(INSTALLED_SYSTEMIMAGE) \ + $(INSTALLED_BOOTIMAGE_TARGET) \ + $(INSTALLED_RECOVERYIMAGE_TARGET) \ + $(INTERNAL_DEVICE_PACKAGE_FILES) + $(build-ubuntu-device-package-target) + +.PHONY: devicepackage-nodeps +devicepackage-nodeps: | $(INTERNAL_USERIMAGES_DEPS) + $(build-ubuntu-device-package-target) +# Ubuntu device package - End # ----------------------------------------------------------------- # cache partition image @@ -1251,16 +1597,17 @@ endif # host tools needed to build dist and OTA packages DISTTOOLS := $(HOST_OUT_EXECUTABLES)/minigzip \ + $(HOST_OUT_EXECUTABLES)/adb \ $(HOST_OUT_EXECUTABLES)/mkbootfs \ $(HOST_OUT_EXECUTABLES)/mkbootimg \ + $(HOST_OUT_EXECUTABLES)/unpackbootimg \ $(HOST_OUT_EXECUTABLES)/fs_config \ $(HOST_OUT_EXECUTABLES)/mkyaffs2image \ $(HOST_OUT_EXECUTABLES)/zipalign \ - $(HOST_OUT_EXECUTABLES)/bsdiff \ $(HOST_OUT_EXECUTABLES)/imgdiff \ $(HOST_OUT_JAVA_LIBRARIES)/dumpkey.jar \ - $(HOST_OUT_JAVA_LIBRARIES)/signapk.jar \ $(HOST_OUT_EXECUTABLES)/mkuserimg.sh \ + $(HOST_OUT_EXECUTABLES)/mkubuntuimg.sh \ $(HOST_OUT_EXECUTABLES)/make_ext4fs \ $(HOST_OUT_EXECUTABLES)/simg2img \ $(HOST_OUT_EXECUTABLES)/e2fsck \ @@ -1269,6 +1616,11 @@ DISTTOOLS := $(HOST_OUT_EXECUTABLES)/minigzip \ $(HOST_OUT_EXECUTABLES)/append2simg \ $(HOST_OUT_EXECUTABLES)/boot_signer +ifneq (,$(filter linux darwin,$(HOST_OS))) + DISTTOOLS += $(HOST_OUT_EXECUTABLES)/mkf2fsuserimg.sh \ + $(HOST_OUT_EXECUTABLES)/make_f2fs +endif + OTATOOLS := $(DISTTOOLS) \ $(HOST_OUT_EXECUTABLES)/aapt @@ -1306,8 +1658,12 @@ built_ota_tools := \ $(call intermediates-dir-for,EXECUTABLES,applypatch)/applypatch \ $(call intermediates-dir-for,EXECUTABLES,applypatch_static)/applypatch_static \ $(call intermediates-dir-for,EXECUTABLES,check_prereq)/check_prereq \ - $(call intermediates-dir-for,EXECUTABLES,sqlite3)/sqlite3 \ - $(call intermediates-dir-for,EXECUTABLES,updater)/updater + $(call intermediates-dir-for,EXECUTABLES,sqlite3)/sqlite3 +ifeq ($(TARGET_ARCH),arm64) + built_ota_tools += $(call intermediates-dir-for,EXECUTABLES,updater,,,32)/updater +else + built_ota_tools += $(call intermediates-dir-for,EXECUTABLES,updater)/updater +endif $(BUILT_TARGET_FILES_PACKAGE): PRIVATE_OTA_TOOLS := $(built_ota_tools) $(BUILT_TARGET_FILES_PACKAGE): PRIVATE_RECOVERY_API_VERSION := $(RECOVERY_API_VERSION) @@ -1320,29 +1676,49 @@ else $(BUILT_TARGET_FILES_PACKAGE): tool_extensions := $(TARGET_RELEASETOOLS_EXTENSIONS) endif +ifeq ($(BOARD_USES_UBOOT_MULTIIMAGE),true) + + ZIP_SAVE_UBOOTIMG_ARGS := -A ARM -O Linux -T multi -C none -n Image + + BOARD_UBOOT_ENTRY := $(strip $(BOARD_UBOOT_ENTRY)) + ifdef BOARD_UBOOT_ENTRY + ZIP_SAVE_UBOOTIMG_ARGS += -e $(BOARD_UBOOT_ENTRY) + endif + BOARD_UBOOT_LOAD := $(strip $(BOARD_UBOOT_LOAD)) + ifdef BOARD_UBOOT_LOAD + ZIP_SAVE_UBOOTIMG_ARGS += -a $(BOARD_UBOOT_LOAD) + endif + +endif + # Depending on the various images guarantees that the underlying # directories are up-to-date. +include $(BUILD_SYSTEM)/tasks/oem_image.mk $(BUILT_TARGET_FILES_PACKAGE): \ $(INSTALLED_BOOTIMAGE_TARGET) \ + $(INSTALLED_BOOTIMAGE_TARGET_ANDROID) \ $(INSTALLED_RADIOIMAGE_TARGET) \ $(INSTALLED_RECOVERYIMAGE_TARGET) \ $(INSTALLED_SYSTEMIMAGE) \ $(INSTALLED_USERDATAIMAGE_TARGET) \ $(INSTALLED_CACHEIMAGE_TARGET) \ $(INSTALLED_VENDORIMAGE_TARGET) \ + $(INSTALLED_OEMIMAGE_TARGET) \ $(INSTALLED_ANDROID_INFO_TXT_TARGET) \ $(SELINUX_FC) \ $(built_ota_tools) \ $(APKCERTS_FILE) \ $(HOST_OUT_EXECUTABLES)/fs_config \ | $(ACP) - @echo "Package target files: $@" + @echo -e ${CL_YLW}"Package target files:"${CL_RST}" $@" $(hide) rm -rf $@ $(zip_root) $(hide) mkdir -p $(dir $@) $(zip_root) @# Components of the recovery image $(hide) mkdir -p $(zip_root)/RECOVERY $(hide) $(call package_files-copy-root, \ $(TARGET_RECOVERY_ROOT_OUT),$(zip_root)/RECOVERY/RAMDISK) + @# OTA install helpers + $(hide) $(call package_files-copy-root, $(OUT)/install, $(zip_root)/INSTALL) ifdef INSTALLED_KERNEL_TARGET $(hide) $(ACP) $(INSTALLED_KERNEL_TARGET) $(zip_root)/RECOVERY/kernel endif @@ -1350,6 +1726,9 @@ ifdef INSTALLED_2NDBOOTLOADER_TARGET $(hide) $(ACP) \ $(INSTALLED_2NDBOOTLOADER_TARGET) $(zip_root)/RECOVERY/second endif +ifdef BOARD_KERNEL_TAGS_OFFSET + $(hide) echo "$(BOARD_KERNEL_TAGS_OFFSET)" > $(zip_root)/RECOVERY/tags_offset +endif ifdef BOARD_KERNEL_CMDLINE $(hide) echo "$(BOARD_KERNEL_CMDLINE)" > $(zip_root)/RECOVERY/cmdline endif @@ -1358,11 +1737,20 @@ ifdef BOARD_KERNEL_BASE endif ifdef BOARD_KERNEL_PAGESIZE $(hide) echo "$(BOARD_KERNEL_PAGESIZE)" > $(zip_root)/RECOVERY/pagesize +endif +ifdef BOARD_KERNEL_TAGS_ADDR + $(hide) echo "$(BOARD_KERNEL_TAGS_ADDR)" > $(zip_root)/RECOVERY/tagsaddr +endif +ifdef BOARD_RAMDISK_OFFSET + $(hide) echo "$(BOARD_RAMDISK_OFFSET)" > $(zip_root)/RECOVERY/ramdisk_offset +endif +ifeq ($(strip $(BOARD_KERNEL_SEPARATED_DT)),true) + $(hide) $(ACP) $(INSTALLED_DTIMAGE_TARGET) $(zip_root)/RECOVERY/dt endif @# Components of the boot image $(hide) mkdir -p $(zip_root)/BOOT $(hide) $(call package_files-copy-root, \ - $(TARGET_ROOT_OUT),$(zip_root)/BOOT/RAMDISK) + $(TARGET_UBUNTU_ROOT_OUT),$(zip_root)/BOOT/RAMDISK) ifdef INSTALLED_KERNEL_TARGET $(hide) $(ACP) $(INSTALLED_KERNEL_TARGET) $(zip_root)/BOOT/kernel endif @@ -1370,6 +1758,10 @@ ifdef INSTALLED_2NDBOOTLOADER_TARGET $(hide) $(ACP) \ $(INSTALLED_2NDBOOTLOADER_TARGET) $(zip_root)/BOOT/second endif + +ifdef BOARD_KERNEL_TAGS_OFFSET + $(hide) echo "$(BOARD_KERNEL_TAGS_OFFSET)" > $(zip_root)/BOOT/tags_offset +endif ifdef BOARD_KERNEL_CMDLINE $(hide) echo "$(BOARD_KERNEL_CMDLINE)" > $(zip_root)/BOOT/cmdline endif @@ -1378,20 +1770,47 @@ ifdef BOARD_KERNEL_BASE endif ifdef BOARD_KERNEL_PAGESIZE $(hide) echo "$(BOARD_KERNEL_PAGESIZE)" > $(zip_root)/BOOT/pagesize +endif +ifdef BOARD_KERNEL_TAGS_ADDR + $(hide) echo "$(BOARD_KERNEL_TAGS_ADDR)" > $(zip_root)/BOOT/tagsaddr +endif +ifdef BOARD_RAMDISK_OFFSET + $(hide) echo "$(BOARD_RAMDISK_OFFSET)" > $(zip_root)/BOOT/ramdisk_offset +endif + +ifeq ($(strip $(BOARD_KERNEL_SEPARATED_DT)),true) + $(hide) $(ACP) $(INSTALLED_DTIMAGE_TARGET) $(zip_root)/BOOT/dt +endif +ifdef ZIP_SAVE_UBOOTIMG_ARGS + $(hide) echo "$(ZIP_SAVE_UBOOTIMG_ARGS)" > $(zip_root)/BOOT/ubootargs endif $(hide) $(foreach t,$(INSTALLED_RADIOIMAGE_TARGET),\ mkdir -p $(zip_root)/RADIO; \ $(ACP) $(t) $(zip_root)/RADIO/$(notdir $(t));) + $(hide) $(foreach fi,$(PRODUCT_FACTORYIMAGE_FILES),\ + mkdir -p $(zip_root)/FACTORY; \ + $(ACP) $(fi) $(zip_root)/FACTORY/$(notdir $(fi));) @# Contents of the system image $(hide) $(call package_files-copy-root, \ $(SYSTEMIMAGE_SOURCE_DIR),$(zip_root)/SYSTEM) @# Contents of the data image $(hide) $(call package_files-copy-root, \ $(TARGET_OUT_DATA),$(zip_root)/DATA) +ifdef BOARD_CUSTOM_BOOTIMG + @# Prebuilt boot images + $(hide) mkdir -p $(zip_root)/BOOTABLE_IMAGES + $(hide) $(ACP) $(INSTALLED_BOOTIMAGE_TARGET) $(zip_root)/BOOTABLE_IMAGES/ + $(hide) $(ACP) $(INSTALLED_RECOVERYIMAGE_TARGET) $(zip_root)/BOOTABLE_IMAGES/ +endif ifdef BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE @# Contents of the vendor image $(hide) $(call package_files-copy-root, \ $(TARGET_OUT_VENDOR),$(zip_root)/VENDOR) +endif +ifdef BOARD_OEMIMAGE_FILE_SYSTEM_TYPE + @# Contents of the oem image + $(call package_files-copy-root, \ + $(TARGET_OUT_OEM),$(zip_root)/OEM) endif @# Extra contents of the OTA package $(hide) mkdir -p $(zip_root)/OTA/bin @@ -1429,13 +1848,28 @@ endif $(hide) echo "use_set_metadata=1" >> $(zip_root)/META/misc_info.txt $(hide) echo "multistage_support=1" >> $(zip_root)/META/misc_info.txt $(hide) echo "update_rename_support=1" >> $(zip_root)/META/misc_info.txt - $(hide) echo "blockimgdiff_versions=1,2" >> $(zip_root)/META/misc_info.txt + $(hide) echo "blockimgdiff_versions=1,2,3" >> $(zip_root)/META/misc_info.txt ifneq ($(OEM_THUMBPRINT_PROPERTIES),) # OTA scripts are only interested in fingerprint related properties $(hide) echo "oem_fingerprint_properties=$(OEM_THUMBPRINT_PROPERTIES)" >> $(zip_root)/META/misc_info.txt +endif +ifdef BUILD_NO + $(hide) echo "build_number=$(BUILD_NO)" >> $(zip_root)/META/misc_info.txt +endif +ifdef TARGET_RELEASETOOL_FACTORY_FROM_TARGET_SCRIPT + $(hide) echo "factory_from_target_script=$(TARGET_RELEASETOOL_FACTORY_FROM_TARGET_SCRIPT)" >> $(zip_root)/META/misc_info.txt endif $(call generate-userimage-prop-dictionary, $(zip_root)/META/misc_info.txt) +ifeq ($(TARGET_RELEASETOOL_MAKE_RECOVERY_PATCH_SCRIPT),) $(hide) ./build/tools/releasetools/make_recovery_patch $(zip_root) $(zip_root) +else + $(hide) $(TARGET_RELEASETOOL_MAKE_RECOVERY_PATCH_SCRIPT) $(zip_root) $(zip_root) +endif +ifdef PRODUCT_DEFAULT_DEV_CERTIFICATE + $(hide) build/tools/getb64key.py $(PRODUCT_DEFAULT_DEV_CERTIFICATE).x509.pem > $(zip_root)/META/releasekey.txt +else + $(hide) build/tools/getb64key.py $(DEFAULT_SYSTEM_DEV_CERTIFICATE).x509.pem > $(zip_root)/META/releasekey.txt +endif @# Zip everything up, preserving symlinks $(hide) (cd $(zip_root) && zip -qry ../$(notdir $@) .) @# Run fs_config on all the system, vendor, boot ramdisk, @@ -1472,18 +1906,87 @@ INTERNAL_OTA_PACKAGE_TARGET := $(PRODUCT_OUT)/$(name).zip $(INTERNAL_OTA_PACKAGE_TARGET): KEY_CERT_PAIR := $(DEFAULT_KEY_CERT_PAIR) +ifeq ($(TARGET_RELEASETOOL_OTA_FROM_TARGET_SCRIPT),) + OTA_FROM_TARGET_SCRIPT := ./build/tools/releasetools/ota_from_target_files +else + OTA_FROM_TARGET_SCRIPT := $(TARGET_RELEASETOOL_OTA_FROM_TARGET_SCRIPT) +endif + +ifeq ($(WITH_GMS),true) + $(INTERNAL_OTA_PACKAGE_TARGET): backuptool := false +else +ifneq ($(CM_BUILD),) + $(INTERNAL_OTA_PACKAGE_TARGET): backuptool := true +else + $(INTERNAL_OTA_PACKAGE_TARGET): backuptool := false +endif +endif + +ifeq ($(TARGET_OTA_ASSERT_DEVICE),) + $(INTERNAL_OTA_PACKAGE_TARGET): override_device := auto +else + $(INTERNAL_OTA_PACKAGE_TARGET): override_device := $(TARGET_OTA_ASSERT_DEVICE) +endif + +ifneq ($(TARGET_UNIFIED_DEVICE),) + $(INTERNAL_OTA_PACKAGE_TARGET): override_prop := --override_prop=true + ifeq ($(TARGET_OTA_ASSERT_DEVICE),) + $(INTERNAL_OTA_PACKAGE_TARGET): override_device := $(TARGET_DEVICE) + endif +endif + $(INTERNAL_OTA_PACKAGE_TARGET): $(BUILT_TARGET_FILES_PACKAGE) $(DISTTOOLS) - @echo "Package OTA: $@" + @echo "$(OTA_FROM_TARGET_SCRIPT)" > $(PRODUCT_OUT)/ota_script_path + @echo "$(override_device)" > $(PRODUCT_OUT)/ota_override_device + @echo -e ${CL_YLW}"Package OTA:"${CL_RST}" $@" $(hide) MKBOOTIMG=$(MKBOOTIMG) \ - ./build/tools/releasetools/ota_from_target_files -v \ + $(OTA_FROM_TARGET_SCRIPT) -v \ --block \ + $(if $(WITH_LZMA_OTA), -z) \ -p $(HOST_OUT) \ -k $(KEY_CERT_PAIR) \ + --backup=$(backuptool) \ + --override_device=$(override_device) $(override_prop) \ $(if $(OEM_OTA_CONFIG), -o $(OEM_OTA_CONFIG)) \ $(BUILT_TARGET_FILES_PACKAGE) $@ -.PHONY: otapackage +CM_TARGET_PACKAGE := $(PRODUCT_OUT)/cm-$(CM_VERSION).zip + +.PHONY: otapackage bacon otapackage: $(INTERNAL_OTA_PACKAGE_TARGET) +bacon: otapackage + $(hide) ln -f $(INTERNAL_OTA_PACKAGE_TARGET) $(CM_TARGET_PACKAGE) + $(hide) $(MD5SUM) $(CM_TARGET_PACKAGE) > $(CM_TARGET_PACKAGE).md5sum + @echo -e ${CL_CYN}"Package Complete: $(CM_TARGET_PACKAGE)"${CL_RST} + +# ----------------------------------------------------------------- +# The factory package + +name := $(TARGET_PRODUCT)-factory-$(FILE_NAME_TAG) + +INTERNAL_FACTORY_PACKAGE_TARGET := $(PRODUCT_OUT)/$(name).zip + +ifeq ($(TARGET_RELEASETOOLS_EXTENSIONS),) +# default to common dir for device vendor +$(INTERNAL_FACTORY_PACKAGE_TARGET): extensions := $(TARGET_DEVICE_DIR)/../common +else +$(INTERNAL_FACTORY_PACKAGE_TARGET): extensions := $(TARGET_RELEASETOOLS_EXTENSIONS) +endif + +$(INTERNAL_FACTORY_PACKAGE_TARGET): $(BUILT_TARGET_FILES_PACKAGE) $(DISTTOOLS) + @echo -e ${CL_YLW}"Package:"${CL_RST}" $@" + if [ -z $(TARGET_RELEASETOOL_FACTORY_FROM_TARGET_SCRIPT) ]; then \ + echo "Error: Factory script is not defined by target"; \ + exit 1; \ + fi + MKBOOTIMG=$(BOARD_CUSTOM_BOOTIMG_MK) \ + $(TARGET_RELEASETOOL_FACTORY_FROM_TARGET_SCRIPT) -v \ + -s $(extensions) \ + -p $(HOST_OUT) \ + $(BUILT_TARGET_FILES_PACKAGE) $@ + +.PHONY: factorypackage +factorypackage: $(INTERNAL_FACTORY_PACKAGE_TARGET) endif # recovery_fstab is defined endif # TARGET_NO_KERNEL != true @@ -1501,10 +2004,16 @@ name := $(name)-img-$(FILE_NAME_TAG) INTERNAL_UPDATE_PACKAGE_TARGET := $(PRODUCT_OUT)/$(name).zip +ifeq ($(TARGET_RELEASETOOL_IMG_FROM_TARGET_SCRIPT),) + IMG_FROM_TARGET_SCRIPT := ./build/tools/releasetools/img_from_target_files +else + IMG_FROM_TARGET_SCRIPT := $(TARGET_RELEASETOOL_IMG_FROM_TARGET_SCRIPT) +endif + $(INTERNAL_UPDATE_PACKAGE_TARGET): $(BUILT_TARGET_FILES_PACKAGE) $(DISTTOOLS) - @echo "Package: $@" + @echo -e ${CL_YLW}"Package:"${CL_RST}" $@" $(hide) MKBOOTIMG=$(MKBOOTIMG) \ - ./build/tools/releasetools/img_from_target_files -v \ + $(IMG_FROM_TARGET_SCRIPT) -v \ -p $(HOST_OUT) \ $(BUILT_TARGET_FILES_PACKAGE) $@ @@ -1544,7 +2053,7 @@ name := $(name)-apps-$(FILE_NAME_TAG) APPS_ZIP := $(PRODUCT_OUT)/$(name).zip $(APPS_ZIP): $(INSTALLED_SYSTEMIMAGE) - @echo "Package apps: $@" + @echo -e ${CL_YLW}"Package apps:"${CL_RST}" $@" $(hide) rm -rf $@ $(hide) mkdir -p $(dir $@) $(hide) zip -qj $@ $(TARGET_OUT_APPS)/*/*.apk $(TARGET_OUT_APPS_PRIVILEGED)/*/*.apk @@ -1598,6 +2107,7 @@ INTERNAL_EMULATOR_PACKAGE_FILES += \ $(HOST_OUT_EXECUTABLES)/emulator$(HOST_EXECUTABLE_SUFFIX) \ prebuilts/qemu-kernel/$(TARGET_ARCH)/kernel-qemu \ $(INSTALLED_RAMDISK_TARGET) \ + $(INSTALLED_RAMDISK_TARGET_ANDROID) \ $(INSTALLED_SYSTEMIMAGE) \ $(INSTALLED_USERDATAIMAGE_TARGET) @@ -1606,7 +2116,7 @@ name := $(TARGET_PRODUCT)-emulator-$(FILE_NAME_TAG) INTERNAL_EMULATOR_PACKAGE_TARGET := $(PRODUCT_OUT)/$(name).zip $(INTERNAL_EMULATOR_PACKAGE_TARGET): $(INTERNAL_EMULATOR_PACKAGE_FILES) - @echo "Package: $@" + @echo -e ${CL_YLW}"Package:"${CL_RST}" $@" $(hide) zip -qj $@ $(INTERNAL_EMULATOR_PACKAGE_FILES) endif @@ -1654,6 +2164,7 @@ ATREE_FILES := \ $(ALL_COPIED_HEADERS) \ $(ALL_DEFAULT_INSTALLED_MODULES) \ $(INSTALLED_RAMDISK_TARGET) \ + $(INSTALLED_RAMDISK_TARGET_ANDROID) \ $(ALL_DOCS) \ $(ALL_SDK_FILES) endif @@ -1689,6 +2200,7 @@ deps := \ $(INSTALLED_SYSTEMIMAGE) \ $(INSTALLED_USERDATAIMAGE_TARGET) \ $(INSTALLED_RAMDISK_TARGET) \ + $(INSTALLED_RAMDISK_TARGET_ANDROID) \ $(INSTALLED_SDK_BUILD_PROP_TARGET) \ $(INSTALLED_BUILD_PROP_TARGET) \ $(ATREE_FILES) \ diff --git a/core/apicheck_msg_current.txt b/core/apicheck_msg_current.txt index 440e7f8862e..99fd547e971 100644 --- a/core/apicheck_msg_current.txt +++ b/core/apicheck_msg_current.txt @@ -9,6 +9,77 @@ To make these errors go away, you have two choices: 2) You can update current.txt by executing the following command: make update-api + ^^^^^^^^^^^^^^^^^^ + CONGRATS YOU EARNED A QUAIL STAR! + + M + MM + MMM + M.MM + MM M + 7M MM + MMMMM MMMMM + MMMMM .MMMMM + MMMM MMMM + MM M + MM M .M + M+M MMMM + .M++MM .MM + MM+++MM MM + 8NNNNN MM+++++MM + NNNN $Z8. MM+++++MM MM + MM $Z8M7IMNN+++++MM MM + .$$$D ~NNMNN+++++MM MMMM + INNNNM NMNM++++++M M M + NNO:NI=MM+++++++MM MM MM + 8M$MMMMMD?+++++++MM .MMMMMMMMMMMMMMM MMMMN MMMMM + M$$NMMMMMM$++++++++MMMMMMM=+++++++++++++MM MMMMM MMMMM + M77$IMMMMMN.,+++++++++++++++++++++++++++MM .MMMMM MMMMM + .??I8,?M777OM.?+++++++++++++++++++++++++MM MM MM + O==?M7MM$MMI7$.~M+++++++++++++++++++++++MM .M M + NMMM+~M??MMMMMMMMMMMI$$++++++++++++++++++++MM MMMM + MMMM++++MM~=+I$OMMMOO?7M$Z$$$+++++++++++++++++MM MM + NMMM++++++++~~MO~7$OM8O8OMZZ$Z$M$$M++++++++++++++MM7MMM MM + MMMM++++++++++++==D~M~:8N88MMOMMZDM$$Z$$M+++++++++++MM77777MMM +MMM+++++++++++++++~MM~~M $O,NM88MOMMZ$$MM$$$+++++++++MM777777777MMMM + MMM++++++++++++M~M~IMMMO888NMOMMOZM$ZZDZ$$+++++++MM7777777777777OMMZ + MMM+++++++++++~~M~~MDOOMMO8NOOOOZZ$$Z.Z$$M++++MM77777777777777777MMM + MMM++++++++M.Z, D+ 8O88M8D,OOMDZZ$D.$$$N+++M7MMMMMD77777777777777MMM + .MM+++++++MM:.D:ZMMM8888OOOOOOZZ$ND$$$M++MM777777MMMM7777777777777MMD + MMM+++++~M.$.M~,~7M8?MON MOOZZ$$N$$$M++MD777777777MMMM77777777777MMM + MM=+++=ZMZ.MM MMZOOOO88OOZM$M.$$$$+++M7777777777777MMMM7777777777MM + MMM++MM~,,$M.+~M$OOMOOMZMI$$$$$$$++MM7777777777777777MMM777777777MM + MM++++=. ~$$.$.M~M$MZOM7MMZ$$$$$$++MMMMMMD7777777777777MMMI7777777MMM + .M++++++MM+OMI$7M??N+OZM8MMMD$$M$$++M77777MMMMN77777777777MMM7777777MMM + M++++++++M+=?+++++++++++MNMZN$$N$$+MM777777777MMMM7777777777MMM777777MM, + M+++++M=?7$$M+++++++++++++++$NO$$$$+M7777777777777MMMM777777777MMM77777MM + M++~M$M$M+++++M++MMM++++++++++M=$$D$MMMMMMMM7777777777MMM$7777777MMM77777MM + M+M$$$M+++++++++MM MMMMM+++++++M$Z$$M MMMMMI7777777MMMM7777777MM77777MM + M++7NMIN++Z++NMM MMMMM+++N$M$M MMMM7777777MMM777777MM$777MM + M=++8+++++++MM MMMMMZ$M$M MMMM777777MMM77777MMZ777MM + MM++++++++MM MM$ MMM77777MMM77777MM7777MM + MM++++++MM MMMM7777MMM7777MM777MM + MM++++MMM .MMM7777MM7777MM77$M + MM+++MM M MMM777MMN777MM77MM + NM+MM M MMM77MMM77NMM7MM + MM MM MMM77MMM77MM77M + .MMM MMM7MMM7IMM7MM + MM M MMM7MMM7MM7MM + M MM MM7MMN7MMMM + MMMM MMMM MMMMMIMMMM + MMMM. MMMMM MMMMMMMMM + MMMMM MMMMM MMMMMMMM + MM MM OMMMMMM + M MM MMMMMM + MM M MMMMM + MMM MMM + MM MM + M + + + NO. NO. STOP BEING LAZY. SERIOUSLY. + DO NOT DO THIS in CM. THIS IS A LIE. IT WILL BREAK THINGS. + To submit the revised current.txt to the main Android repository, you will need approval. ****************************** diff --git a/core/base_rules.mk b/core/base_rules.mk index 8c25897e56d..eea1007a50e 100644 --- a/core/base_rules.mk +++ b/core/base_rules.mk @@ -181,7 +181,7 @@ ifneq (true,$(LOCAL_UNINSTALLABLE_MODULE)) # Apk and its attachments reside in its own subdir. ifeq ($(LOCAL_MODULE_CLASS),APPS) # framework-res.apk doesn't like the additional layer. - ifneq ($(LOCAL_NO_STANDARD_LIBRARIES),true) + ifeq ($(filter true,$(LOCAL_NO_STANDARD_LIBRARIES) $(LOCAL_IGNORE_SUBDIR)),) my_module_path := $(my_module_path)/$(LOCAL_MODULE) endif endif @@ -485,7 +485,7 @@ $(cleantarget) : PRIVATE_CLEAN_FILES := \ $(LOCAL_INSTALLED_MODULE) \ $(intermediates) $(cleantarget):: - @echo "Clean: $(PRIVATE_MODULE)" + @echo -e ${CL_GRN}"Clean:"${CL_RST}" $(PRIVATE_MODULE)" $(hide) rm -rf $(PRIVATE_CLEAN_FILES) ########################################################### @@ -547,12 +547,12 @@ ifndef LOCAL_UNINSTALLABLE_MODULE $(LOCAL_INSTALLED_MODULE): PRIVATE_POST_INSTALL_CMD := $(LOCAL_POST_INSTALL_CMD) ifneq ($(LOCAL_ACP_UNAVAILABLE),true) $(LOCAL_INSTALLED_MODULE): $(LOCAL_BUILT_MODULE) | $(ACP) - @echo "Install: $@" + @echo -e ${CL_CYN}"Install: $@"${CL_RST} $(copy-file-to-new-target) $(PRIVATE_POST_INSTALL_CMD) else $(LOCAL_INSTALLED_MODULE): $(LOCAL_BUILT_MODULE) - @echo "Install: $@" + @echo -e ${CL_CYN}"Install: $@"${CL_RST} $(copy-file-to-target-with-cp) endif diff --git a/core/binary.mk b/core/binary.mk index 1e313ffe42c..553de5551fc 100644 --- a/core/binary.mk +++ b/core/binary.mk @@ -178,9 +178,9 @@ ifeq ($(strip $($(LOCAL_2ND_ARCH_VAR_PREFIX)WITHOUT_$(my_prefix)CLANG)),true) endif # Add in libcompiler_rt for all regular device builds -ifeq (,$(LOCAL_SDK_VERSION)$(LOCAL_IS_HOST_MODULE)$(WITHOUT_LIBCOMPILER_RT)) - my_static_libraries += $(COMPILER_RT_CONFIG_EXTRA_STATIC_LIBRARIES) -endif +#ifeq (,$(LOCAL_SDK_VERSION)$(LOCAL_IS_HOST_MODULE)$(WITHOUT_LIBCOMPILER_RT)) +# my_static_libraries += $(COMPILER_RT_CONFIG_EXTRA_STATIC_LIBRARIES) +#endif my_compiler_dependencies := @@ -329,7 +329,6 @@ ifneq ($(LOCAL_NO_SYNTAX_CHECK),true) endif endif $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_CXX := $(my_cxx) -$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_CLANG := $(my_clang) # TODO: support a mix of standard extensions so that this isn't necessary LOCAL_CPP_EXTENSION := $(strip $(LOCAL_CPP_EXTENSION)) @@ -787,7 +786,7 @@ import_includes_deps := $(strip \ $(foreach l, $(my_static_libraries) $(my_whole_static_libraries), \ $(call intermediates-dir-for,STATIC_LIBRARIES,$(l),$(LOCAL_IS_HOST_MODULE),,$(LOCAL_2ND_ARCH_VAR_PREFIX))/export_includes)) $(import_includes) : $(import_includes_deps) - @echo Import includes file: $@ + @echo -e ${CL_CYN}Import includes file:${CL_RST} $@ $(hide) mkdir -p $(dir $@) && rm -f $@ ifdef import_includes_deps $(hide) for f in $^; do \ @@ -818,6 +817,11 @@ normal_objects := \ all_objects := $(normal_objects) $(gen_o_objects) +## Allow a device's own headers to take precedence over global ones +ifneq ($(TARGET_SPECIFIC_HEADER_PATH),) +my_c_includes := $(TOPDIR)$(TARGET_SPECIFIC_HEADER_PATH) $(my_c_includes) +endif + my_c_includes += $(TOPDIR)$(LOCAL_PATH) $(intermediates) $(generated_sources_dir) ifndef LOCAL_SDK_VERSION @@ -982,7 +986,7 @@ export_includes := $(intermediates)/export_includes $(export_includes): PRIVATE_EXPORT_C_INCLUDE_DIRS := $(LOCAL_EXPORT_C_INCLUDE_DIRS) # Make sure .pb.h are already generated before any dependent source files get compiled. $(export_includes) : $(LOCAL_MODULE_MAKEFILE) $(proto_generated_headers) - @echo Export includes file: $< -- $@ + @echo -e ${CL_CYN}Export includes file:${CL_RST} $< -- $@ $(hide) mkdir -p $(dir $@) && rm -f $@ ifdef LOCAL_EXPORT_C_INCLUDE_DIRS $(hide) for d in $(PRIVATE_EXPORT_C_INCLUDE_DIRS); do \ diff --git a/core/build_id.mk b/core/build_id.mk index 00a691f85bd..e59666c110b 100644 --- a/core/build_id.mk +++ b/core/build_id.mk @@ -18,4 +18,4 @@ # (like "CRB01"). It must be a single word, and is # capitalized by convention. -export BUILD_ID=LMP +export BUILD_ID=LMY48W diff --git a/core/checktree b/core/checktree index b0b9cfab6d2..287268328b2 100755 --- a/core/checktree +++ b/core/checktree @@ -1,4 +1,4 @@ -#!/usr/bin/python -E +#!/usr/bin/env python -E import sys, os, re diff --git a/core/clang/arm.mk b/core/clang/arm.mk index 22c73977a66..1b25b9e127d 100644 --- a/core/clang/arm.mk +++ b/core/clang/arm.mk @@ -27,6 +27,6 @@ CLANG_CONFIG_arm_UNKNOWN_CFLAGS := \ define subst-clang-incompatible-arm-flags $(subst -march=armv5te,-march=armv5t,\ $(subst -march=armv5e,-march=armv5,\ - $(subst -mcpu=cortex-a15,-march=armv7-a,\ + $(subst -mfpu=neon-vfpv4,-mfpu=neon,\ $(1)))) endef diff --git a/core/clang/config.mk b/core/clang/config.mk index 5b2aea50d80..9c1179717b9 100644 --- a/core/clang/config.mk +++ b/core/clang/config.mk @@ -42,6 +42,11 @@ CLANG_CONFIG_EXTRA_CFLAGS += \ CLANG_CONFIG_EXTRA_CFLAGS += \ -Werror=int-conversion +# Workaround for ccache with clang. +# See http://petereisentraut.blogspot.com/2011/05/ccache-and-clang.html. +CLANG_CONFIG_EXTRA_CFLAGS += \ + -Wno-unused-command-line-argument + CLANG_CONFIG_UNKNOWN_CFLAGS := \ -funswitch-loops \ -fno-tree-sra \ diff --git a/core/cleanbuild.mk b/core/cleanbuild.mk index cf980d8e024..8d199934d12 100644 --- a/core/cleanbuild.mk +++ b/core/cleanbuild.mk @@ -194,6 +194,7 @@ installclean_files := \ $(PRODUCT_OUT)/*.xlb \ $(PRODUCT_OUT)/*.zip \ $(PRODUCT_OUT)/kernel \ + $(PRODUCT_OUT)/*.zip.md5sum \ $(PRODUCT_OUT)/data \ $(PRODUCT_OUT)/skin \ $(PRODUCT_OUT)/obj/APPS \ @@ -232,13 +233,13 @@ endif dataclean: FILES := $(dataclean_files) dataclean: $(hide) rm -rf $(FILES) - @echo "Deleted emulator userdata images." + @echo -e ${CL_GRN}"Deleted emulator userdata images."${CL_RST} .PHONY: installclean installclean: FILES := $(installclean_files) installclean: dataclean $(hide) rm -rf $(FILES) - @echo "Deleted images and staging directories." + @echo -e ${CL_GRN}"Deleted images and staging directories."${CL_RST} ifeq "$(force_installclean)" "true" $(info *** Forcing "make installclean"...) diff --git a/core/clear_vars.mk b/core/clear_vars.mk index bf81ebf12df..b2891ed271e 100644 --- a/core/clear_vars.mk +++ b/core/clear_vars.mk @@ -249,6 +249,9 @@ LOCAL_MODULE_STEM_64:= LOCAL_CLANG_32:= LOCAL_CLANG_64:= +# Include any vendor specific clear_vars.mk file +-include $(TOPDIR)vendor/*/build/core/clear_vars.mk + # Trim MAKEFILE_LIST so that $(call my-dir) doesn't need to # iterate over thousands of entries every time. # Leave the current makefile to make sure we don't break anything diff --git a/core/combo/HOST_darwin-x86.mk b/core/combo/HOST_darwin-x86.mk index ec379936f5c..ac54a3c4445 100644 --- a/core/combo/HOST_darwin-x86.mk +++ b/core/combo/HOST_darwin-x86.mk @@ -37,11 +37,14 @@ $(combo_2nd_arch_prefix)HOST_TOOLCHAIN_PREFIX := $($(combo_2nd_arch_prefix)HOST_ ifneq (,$(strip $(wildcard $($(combo_2nd_arch_prefix)HOST_TOOLCHAIN_PREFIX)-gcc))) $(combo_2nd_arch_prefix)HOST_CC := $($(combo_2nd_arch_prefix)HOST_TOOLCHAIN_PREFIX)-gcc $(combo_2nd_arch_prefix)HOST_CXX := $($(combo_2nd_arch_prefix)HOST_TOOLCHAIN_PREFIX)-g++ -ifneq ($(filter 10.8 10.9, $(mac_sdk_version)),) -# Mac SDK 10.8+ no longer has stdarg.h, etc -host_toolchain_header := $($(combo_2nd_arch_prefix)HOST_TOOLCHAIN_ROOT)/lib/gcc/i686-apple-darwin$(gcc_darwin_version)/4.2.1/include + +ifeq ($(mac_sdk_version), $(filter $(mac_sdk_version), 10.8 10.9 10.10)) +# Mac SDK 10.8 and later does not have stdarg.h, etc +host_toolchain_header := $(HOST_TOOLCHAIN_ROOT)/lib/gcc/i686-apple-darwin$(gcc_darwin_version)/4.2.1/include $(combo_2nd_arch_prefix)HOST_GLOBAL_CFLAGS += -isystem $(host_toolchain_header) -endif +$(combo_2nd_arch_prefix)HOST_GLOBAL_CPPFLAGS += -isystem $(mac_sdk_root)/usr/include/c++/4.2.1 +endif # $(mac_sdk_version) + else $(combo_2nd_arch_prefix)HOST_CC := gcc $(combo_2nd_arch_prefix)HOST_CXX := g++ @@ -66,7 +69,7 @@ $(combo_2nd_arch_prefix)HOST_JNILIB_SUFFIX := .jnilib $(combo_2nd_arch_prefix)HOST_GLOBAL_CFLAGS += \ -include $(call select-android-config-h,darwin-x86) -ifneq ($(filter 10.7 10.7.% 10.8 10.8.%, $(build_mac_version)),) +ifneq ($(filter 10.7 10.7.% 10.8 10.8.% 10.9 10.9.% 10.10 10.10.%, $(build_mac_version)),) $(combo_2nd_arch_prefix)HOST_RUN_RANLIB_AFTER_COPYING := false else $(combo_2nd_arch_prefix)HOST_RUN_RANLIB_AFTER_COPYING := true @@ -116,5 +119,10 @@ endef # $(1): The file to check define get-file-size -stat -f "%z" $(1) +GSTAT=$(which gstat) ; \ +if [ ! -z "$GSTAT" ]; then \ +gstat -c "%s" $(1) ; \ +else \ +stat -f "%z" $(1) ; \ +fi endef diff --git a/core/combo/HOST_darwin-x86_64.mk b/core/combo/HOST_darwin-x86_64.mk index a776a699781..88c2b5bacff 100644 --- a/core/combo/HOST_darwin-x86_64.mk +++ b/core/combo/HOST_darwin-x86_64.mk @@ -37,11 +37,14 @@ HOST_TOOLCHAIN_PREFIX := $(HOST_TOOLCHAIN_ROOT)/bin/i686-apple-darwin$(gcc_darwi ifneq (,$(strip $(wildcard $(HOST_TOOLCHAIN_PREFIX)-gcc))) HOST_CC := $(HOST_TOOLCHAIN_PREFIX)-gcc HOST_CXX := $(HOST_TOOLCHAIN_PREFIX)-g++ -ifneq ($(filter 10.8 10.9, $(mac_sdk_version)),) -# Mac SDK 10.8+ no longer has stdarg.h, etc + +ifeq ($(mac_sdk_version), $(filter $(mac_sdk_version), 10.8 10.9 10.10)) +# Mac SDK 10.8 and later does not have stdarg.h, etc host_toolchain_header := $(HOST_TOOLCHAIN_ROOT)/lib/gcc/i686-apple-darwin$(gcc_darwin_version)/4.2.1/include HOST_GLOBAL_CFLAGS += -isystem $(host_toolchain_header) -endif +HOST_GLOBAL_CPPFLAGS += -isystem $(mac_sdk_root)/usr/include/c++/4.2.1 +endif # $(mac_sdk_version) + else HOST_CC := gcc HOST_CXX := g++ @@ -65,7 +68,7 @@ HOST_JNILIB_SUFFIX := .jnilib HOST_GLOBAL_CFLAGS += \ -include $(call select-android-config-h,darwin-x86) -ifneq ($(filter 10.7 10.7.% 10.8 10.8.%, $(build_mac_version)),) +ifneq ($(filter 10.7 10.7.% 10.8 10.8.% 10.9 10.9.% 10.10 10.10.%, $(build_mac_version)),) HOST_RUN_RANLIB_AFTER_COPYING := false else HOST_RUN_RANLIB_AFTER_COPYING := true diff --git a/core/combo/HOST_linux-x86.mk b/core/combo/HOST_linux-x86.mk index 3ca7443e763..59ba71db550 100644 --- a/core/combo/HOST_linux-x86.mk +++ b/core/combo/HOST_linux-x86.mk @@ -18,12 +18,12 @@ # Included by combo/select.mk ifeq ($(strip $($(combo_2nd_arch_prefix)HOST_TOOLCHAIN_PREFIX)),) -$(combo_2nd_arch_prefix)HOST_TOOLCHAIN_PREFIX := prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.11-4.6/bin/x86_64-linux- +$(combo_2nd_arch_prefix)HOST_TOOLCHAIN_PREFIX := /usr/bin endif # Don't do anything if the toolchain is not there ifneq (,$(strip $(wildcard $($(combo_2nd_arch_prefix)HOST_TOOLCHAIN_PREFIX)gcc))) -$(combo_2nd_arch_prefix)HOST_CC := $($(combo_2nd_arch_prefix)HOST_TOOLCHAIN_PREFIX)gcc -$(combo_2nd_arch_prefix)HOST_CXX := $($(combo_2nd_arch_prefix)HOST_TOOLCHAIN_PREFIX)g++ +HOST_CC := $(HOST_TOOLCHAIN_PREFIX)/gcc-4.8 +HOST_CXX := $(HOST_TOOLCHAIN_PREFIX)/g++-4.8 $(combo_2nd_arch_prefix)HOST_AR := $($(combo_2nd_arch_prefix)HOST_TOOLCHAIN_PREFIX)ar endif # $($(combo_2nd_arch_prefix)HOST_TOOLCHAIN_PREFIX)gcc exists diff --git a/core/combo/TARGET_linux-arm.mk b/core/combo/TARGET_linux-arm.mk index df81cd52a31..3cc1898a026 100644 --- a/core/combo/TARGET_linux-arm.mk +++ b/core/combo/TARGET_linux-arm.mk @@ -53,9 +53,14 @@ include $(BUILD_SYSTEM)/combo/fdo.mk # You can set TARGET_TOOLS_PREFIX to get gcc from somewhere else ifeq ($(strip $($(combo_2nd_arch_prefix)TARGET_TOOLS_PREFIX)),) +ifneq (,$(wildcard /usr/bin/arm-linux-androideabi-*)) +$(combo_2nd_arch_prefix)TARGET_TOOLCHAIN_ROOT := /usr/bin +$(combo_2nd_arch_prefix)TARGET_TOOLS_PREFIX := $($(combo_2nd_arch_prefix)TARGET_TOOLCHAIN_ROOT)/arm-linux-androideabi- +else $(combo_2nd_arch_prefix)TARGET_TOOLCHAIN_ROOT := prebuilts/gcc/$(HOST_PREBUILT_TAG)/arm/arm-linux-androideabi-$($(combo_2nd_arch_prefix)TARGET_GCC_VERSION) $(combo_2nd_arch_prefix)TARGET_TOOLS_PREFIX := $($(combo_2nd_arch_prefix)TARGET_TOOLCHAIN_ROOT)/bin/arm-linux-androideabi- endif +endif $(combo_2nd_arch_prefix)TARGET_CC := $($(combo_2nd_arch_prefix)TARGET_TOOLS_PREFIX)gcc$(HOST_EXECUTABLE_SUFFIX) $(combo_2nd_arch_prefix)TARGET_CXX := $($(combo_2nd_arch_prefix)TARGET_TOOLS_PREFIX)g++$(HOST_EXECUTABLE_SUFFIX) @@ -196,7 +201,8 @@ define $(combo_2nd_arch_prefix)transform-o-to-shared-lib-inner $(hide) $(PRIVATE_CXX) \ -nostdlib -Wl,-soname,$(notdir $@) \ -Wl,--gc-sections \ - $(if $(filter true,$(PRIVATE_CLANG)),-shared,-Wl,-shared) \ + -Wl,-shared,-Bsymbolic \ + -shared \ $(PRIVATE_TARGET_GLOBAL_LD_DIRS) \ $(if $(filter true,$(PRIVATE_NO_CRT)),,$(PRIVATE_TARGET_CRTBEGIN_SO_O)) \ $(PRIVATE_ALL_OBJECTS) \ diff --git a/core/combo/TARGET_linux-arm64.mk b/core/combo/TARGET_linux-arm64.mk index 07d398449cf..df6c1272a43 100644 --- a/core/combo/TARGET_linux-arm64.mk +++ b/core/combo/TARGET_linux-arm64.mk @@ -162,7 +162,8 @@ define transform-o-to-shared-lib-inner $(hide) $(PRIVATE_CXX) \ -nostdlib -Wl,-soname,$(notdir $@) \ -Wl,--gc-sections \ - $(if $(filter true,$(PRIVATE_CLANG)),-shared,-Wl,-shared) \ + -Wl,-shared,-Bsymbolic \ + -shared \ $(PRIVATE_TARGET_GLOBAL_LD_DIRS) \ $(if $(filter true,$(PRIVATE_NO_CRT)),,$(PRIVATE_TARGET_CRTBEGIN_SO_O)) \ $(PRIVATE_ALL_OBJECTS) \ diff --git a/core/combo/TARGET_linux-mips.mk b/core/combo/TARGET_linux-mips.mk index 995e63c2371..6e69e920fba 100644 --- a/core/combo/TARGET_linux-mips.mk +++ b/core/combo/TARGET_linux-mips.mk @@ -168,7 +168,8 @@ define $(combo_2nd_arch_prefix)transform-o-to-shared-lib-inner $(hide) $(PRIVATE_CXX) \ -nostdlib -Wl,-soname,$(notdir $@) \ -Wl,--gc-sections \ - $(if $(filter true,$(PRIVATE_CLANG)),-shared,-Wl,-shared) \ + -Wl,-shared,-Bsymbolic \ + -shared \ $(PRIVATE_TARGET_GLOBAL_LD_DIRS) \ $(if $(filter true,$(PRIVATE_NO_CRT)),,$(PRIVATE_TARGET_CRTBEGIN_SO_O)) \ $(PRIVATE_ALL_OBJECTS) \ diff --git a/core/combo/TARGET_linux-mips64.mk b/core/combo/TARGET_linux-mips64.mk index 4511b477913..1296ad9c516 100644 --- a/core/combo/TARGET_linux-mips64.mk +++ b/core/combo/TARGET_linux-mips64.mk @@ -172,7 +172,8 @@ define transform-o-to-shared-lib-inner $(hide) $(PRIVATE_CXX) \ -nostdlib -Wl,-soname,$(notdir $@) \ -Wl,--gc-sections \ - $(if $(filter true,$(PRIVATE_CLANG)),-shared,-Wl,-shared) \ + -shared \ + -Wl,-shared,-Bsymbolic \ $(PRIVATE_TARGET_GLOBAL_LD_DIRS) \ $(if $(filter true,$(PRIVATE_NO_CRT)),,$(PRIVATE_TARGET_CRTBEGIN_SO_O)) \ $(PRIVATE_ALL_OBJECTS) \ diff --git a/core/combo/TARGET_linux-x86.mk b/core/combo/TARGET_linux-x86.mk index 0af39488baa..ac560759756 100644 --- a/core/combo/TARGET_linux-x86.mk +++ b/core/combo/TARGET_linux-x86.mk @@ -45,9 +45,15 @@ include $(BUILD_SYSTEM)/combo/fdo.mk # You can set TARGET_TOOLS_PREFIX to get gcc from somewhere else ifeq ($(strip $($(combo_2nd_arch_prefix)TARGET_TOOLS_PREFIX)),) +ifneq (,$(wildcard /usr/bin/x86_64-linux-android-*)) +$(combo_2nd_arch_prefix)TARGET_TOOLCHAIN_ROOT := /usr/bin +$(combo_2nd_arch_prefix)TARGET_TOOLS_PREFIX := $($(combo_2nd_arch_prefix)TARGET_TOOLCHAIN_ROOT)/x86_64-linux-android- +else $(combo_2nd_arch_prefix)TARGET_TOOLCHAIN_ROOT := prebuilts/gcc/$(HOST_PREBUILT_TAG)/x86/x86_64-linux-android-$($(combo_2nd_arch_prefix)TARGET_GCC_VERSION) $(combo_2nd_arch_prefix)TARGET_TOOLS_PREFIX := $($(combo_2nd_arch_prefix)TARGET_TOOLCHAIN_ROOT)/bin/x86_64-linux-android- endif +endif + $(combo_2nd_arch_prefix)TARGET_CC := $($(combo_2nd_arch_prefix)TARGET_TOOLS_PREFIX)gcc$(HOST_EXECUTABLE_SUFFIX) $(combo_2nd_arch_prefix)TARGET_CXX := $($(combo_2nd_arch_prefix)TARGET_TOOLS_PREFIX)g++$(HOST_EXECUTABLE_SUFFIX) @@ -89,12 +95,14 @@ $(combo_2nd_arch_prefix)TARGET_GLOBAL_CFLAGS += \ -fstrict-aliasing \ -funswitch-loops \ -funwind-tables \ - -fstack-protector \ -m32 \ -no-canonical-prefixes \ -fno-canonical-system-headers \ -include $(android_config_h) \ -I $(dir $(android_config_h)) +# FIXME: This needs to be added back once the android toolchain provided by the +# gcc-i686-linux-android package gets fixed (LP: #1302799) +# -fstack-protector \ $(combo_2nd_arch_prefix)TARGET_GLOBAL_CFLAGS += $(arch_variant_cflags) @@ -149,7 +157,7 @@ define $(combo_2nd_arch_prefix)transform-o-to-shared-lib-inner $(hide) $(PRIVATE_CXX) \ $(PRIVATE_TARGET_GLOBAL_LDFLAGS) \ -nostdlib -Wl,-soname,$(notdir $@) \ - $(if $(filter true,$(PRIVATE_CLANG)),-shared,-Wl,-shared) \ + -shared -Bsymbolic \ $(PRIVATE_TARGET_GLOBAL_LD_DIRS) \ $(if $(filter true,$(PRIVATE_NO_CRT)),,$(PRIVATE_TARGET_CRTBEGIN_SO_O)) \ $(PRIVATE_ALL_OBJECTS) \ @@ -199,6 +207,7 @@ define $(combo_2nd_arch_prefix)transform-o-to-static-executable-inner $(hide) $(PRIVATE_CXX) \ $(PRIVATE_TARGET_GLOBAL_LDFLAGS) \ -nostdlib -Bstatic \ + -Wl,-Bsymbolic \ -o $@ \ $(PRIVATE_TARGET_GLOBAL_LD_DIRS) \ $(if $(filter true,$(PRIVATE_NO_CRT)),,$(PRIVATE_TARGET_CRTBEGIN_STATIC_O)) \ diff --git a/core/combo/TARGET_linux-x86_64.mk b/core/combo/TARGET_linux-x86_64.mk index 33d6a56b0f5..82b1f77260a 100644 --- a/core/combo/TARGET_linux-x86_64.mk +++ b/core/combo/TARGET_linux-x86_64.mk @@ -154,7 +154,7 @@ define transform-o-to-shared-lib-inner $(hide) $(PRIVATE_CXX) \ $(PRIVATE_TARGET_GLOBAL_LDFLAGS) \ -nostdlib -Wl,-soname,$(notdir $@) \ - $(if $(filter true,$(PRIVATE_CLANG)),-shared,-Wl,-shared) \ + -shared -Bsymbolic \ $(PRIVATE_TARGET_GLOBAL_LD_DIRS) \ $(if $(filter true,$(PRIVATE_NO_CRT)),,$(PRIVATE_TARGET_CRTBEGIN_SO_O)) \ $(PRIVATE_ALL_OBJECTS) \ diff --git a/core/combo/arch/arm/armv7-a-neon.mk b/core/combo/arch/arm/armv7-a-neon.mk index c6603db4042..c6c38e2a1ac 100644 --- a/core/combo/arch/arm/armv7-a-neon.mk +++ b/core/combo/arch/arm/armv7-a-neon.mk @@ -6,23 +6,44 @@ ARCH_ARM_HAVE_VFP := true ARCH_ARM_HAVE_VFP_D32 := true ARCH_ARM_HAVE_NEON := true -ifneq (,$(filter cortex-a15 krait denver,$(TARGET_$(combo_2nd_arch_prefix)CPU_VARIANT))) - arch_variant_cflags := -mcpu=cortex-a15 +ifneq (,$(filter cortex-a15 denver krait,$(TARGET_$(combo_2nd_arch_prefix)CPU_VARIANT))) + arch_variant_cflags := -mcpu=cortex-a15 -mfpu=neon-vfpv4 + + # Fake an ARM compiler flag as these processors support LPAE which GCC/clang + # don't advertise. + arch_variant_cflags += -D__ARM_FEATURE_LPAE=1 + arch_variant_ldflags := \ + -Wl,--no-fix-cortex-a8 +else +ifeq ($(strip $(TARGET_$(combo_2nd_arch_prefix)CPU_VARIANT)),cortex-a9) + arch_variant_cflags := -mcpu=cortex-a9 -mfpu=neon + arch_variant_ldflags := \ + -Wl,--no-fix-cortex-a8 else -ifeq ($(strip $(TARGET_$(combo_2nd_arch_prefix)CPU_VARIANT)),cortex-a8) - arch_variant_cflags := -mcpu=cortex-a8 +ifneq (,$(filter cortex-a8 scorpion,$(TARGET_$(combo_2nd_arch_prefix)CPU_VARIANT))) + arch_variant_cflags := -mcpu=cortex-a8 -mfpu=neon + arch_variant_ldflags := \ + -Wl,--fix-cortex-a8 else ifeq ($(strip $(TARGET_$(combo_2nd_arch_prefix)CPU_VARIANT)),cortex-a7) - arch_variant_cflags := -mcpu=cortex-a7 + arch_variant_cflags := -mcpu=cortex-a7 -mfpu=neon-vfpv4 + arch_variant_ldflags := \ + -Wl,--no-fix-cortex-a8 +else +ifeq ($(strip $(TARGET_$(combo_2nd_arch_prefix)CPU_VARIANT)),cortex-a5) + arch_variant_cflags := -mcpu=cortex-a7 -mfpu=neon-vfpv4 + arch_variant_ldflags := \ + -Wl,--no-fix-cortex-a8 else - arch_variant_cflags := -march=armv7-a + arch_variant_cflags := -march=armv7-a -mfpu=neon + # Generic ARM might be a Cortex A8 -- better safe than sorry + arch_variant_ldflags := \ + -Wl,--fix-cortex-a8 +endif +endif endif endif endif arch_variant_cflags += \ - -mfloat-abi=softfp \ - -mfpu=neon - -arch_variant_ldflags := \ - -Wl,--fix-cortex-a8 + -mfloat-abi=softfp diff --git a/core/combo/arch/arm64/armv8-a.mk b/core/combo/arch/arm64/armv8-a.mk index edc0497eeb4..642fe91ff7d 100644 --- a/core/combo/arch/arm64/armv8-a.mk +++ b/core/combo/arch/arm64/armv8-a.mk @@ -1 +1,13 @@ arch_variant_cflags := + +# If the chip uses a53 cores, enable the errata workarounds +ifneq ($(filter $(TARGET_CPU_VARIANT) $(TARGET_2ND_CPU_VARIANT),cortex-a53),) + TARGET_CPU_CORTEX_A53 ?= true +endif + +# Leave the flag so devices that need the workaround but don't fit in +# the check above can still enable it. +ifeq ($(TARGET_CPU_CORTEX_A53),true) +arch_variant_ldflags := -Wl,--fix-cortex-a53-843419 \ + -Wl,--fix-cortex-a53-835769 +endif diff --git a/core/combo/include/arch/linux-arm64/AndroidConfig.h b/core/combo/include/arch/linux-arm64/AndroidConfig.h index bcbda8f87fc..bbea22dd3e7 100644 --- a/core/combo/include/arch/linux-arm64/AndroidConfig.h +++ b/core/combo/include/arch/linux-arm64/AndroidConfig.h @@ -337,4 +337,11 @@ */ #define HAVE_GNU_QSORT_R 0 +/* + * Define CONFIG_64BIT based on __LP64__ + */ +#ifdef __LP64__ +#define CONFIG_64BIT +#endif + #endif /* _ANDROID_CONFIG_H */ diff --git a/core/combo/mac_version.mk b/core/combo/mac_version.mk index 6defba79ea3..d18e4c59060 100644 --- a/core/combo/mac_version.mk +++ b/core/combo/mac_version.mk @@ -9,17 +9,19 @@ ifndef build_mac_version build_mac_version := $(shell sw_vers -productVersion) -mac_sdk_versions_supported := 10.6 10.7 10.8 10.9 +# Caution: Do not add 10.10 to this list until the prebuilts/darwin-x86 toolchains are updated. +# In the meantime, setting mac_sdk_version to 10.9 works on Yosemite (verified on 10.10.1). +mac_sdk_versions_supported := 10.6 10.7 10.8 10.9 ifneq ($(strip $(MAC_SDK_VERSION)),) mac_sdk_version := $(MAC_SDK_VERSION) ifeq ($(filter $(mac_sdk_version),$(mac_sdk_versions_supported)),) $(warning ****************************************************************) -$(warning * MAC_SDK_VERSION $(MAC_SDK_VERSION) isn't one of the supported $(mac_sdk_versions_supported)) +$(warning * MAC_SDK_VERSION $(MAC_SDK_VERSION) isn\'t one of the supported $(mac_sdk_versions_supported)) $(warning ****************************************************************) $(error Stop.) endif else -mac_sdk_versions_installed := $(shell xcodebuild -showsdks | grep macosx | sort | sed -e "s/.*macosx//g") +mac_sdk_versions_installed := $(shell xcodebuild -showsdks 2> /dev/null | grep macosx | sort | sed -e "s/.*macosx//g") mac_sdk_version := $(firstword $(filter $(mac_sdk_versions_installed), $(mac_sdk_versions_supported))) ifeq ($(mac_sdk_version),) mac_sdk_version := $(firstword $(mac_sdk_versions_supported)) @@ -27,6 +29,18 @@ endif endif mac_sdk_path := $(shell xcode-select -print-path) + +ifeq ($(strip "$(mac_sdk_path)"), "/Library/Developer/CommandLineTools") +# Accept any modern version of Apple Command Line Tools +mac_sdk_root := / + +# Override mac_sdk_version with build_mac_version (aka the version of the OSX host), but assume the latest +# supported mac_sdk_version if the build_mac_version is not recognized. +mac_sdk_version := $(shell echo $(build_mac_version) | cut -d '.' -f 1,2) +ifeq ($(filter $(mac_sdk_version),$(mac_sdk_versions_supported)),) +mac_sdk_version := $(lastword $(mac_sdk_versions_supported)) +endif +else # try /Applications/Xcode*.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.?.sdk # or /Volume/Xcode/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.?.sdk mac_sdk_root := $(mac_sdk_path)/Platforms/MacOSX.platform/Developer/SDKs/MacOSX$(mac_sdk_version).sdk @@ -40,6 +54,7 @@ $(warning * Can not find SDK $(mac_sdk_version) at $(mac_sdk_root)) $(warning *****************************************************) $(error Stop.) endif +endif # $(mac_sdk_path) ifeq ($(mac_sdk_version),10.6) gcc_darwin_version := 10 diff --git a/core/combo/select.mk b/core/combo/select.mk index d495c6ff1dd..ec10dd2fe14 100644 --- a/core/combo/select.mk +++ b/core/combo/select.mk @@ -80,7 +80,9 @@ ifneq ($(USE_CCACHE),) # We don't really use system headers much so the rootdir is # fine; ensures these paths are relative for all Android trees # on a workstation. - export CCACHE_BASEDIR := / + ifeq ($(CCACHE_BASEDIR),) + export CCACHE_BASEDIR := $(ANDROID_BUILD_TOP) + endif # Workaround for ccache with clang. # See http://petereisentraut.blogspot.com/2011/09/ccache-and-clang-part-2.html @@ -102,7 +104,13 @@ ifneq ($(USE_CCACHE),) ifndef CXX_WRAPPER CXX_WRAPPER := $(ccache) endif + ifeq ($(ANDROID_CCACHE_DIR), $(CCACHE_DIR)) + ifneq ($(ANDROID_CCACHE_SIZE),) + ACCSIZE_RESULT := $(shell $(ccache) -M$(ANDROID_CCACHE_SIZE)) + endif + endif ccache = + ACCSIZE_RESULT = endif endif diff --git a/core/config.mk b/core/config.mk index bfa5610ddb1..7d1a61b10ac 100644 --- a/core/config.mk +++ b/core/config.mk @@ -40,7 +40,6 @@ SRC_HEADERS := \ $(TOPDIR)system/core/include \ $(TOPDIR)hardware/libhardware/include \ $(TOPDIR)hardware/libhardware_legacy/include \ - $(TOPDIR)hardware/ril/include \ $(TOPDIR)libnativehelper/include \ $(TOPDIR)frameworks/native/include \ $(TOPDIR)frameworks/native/opengl/include \ @@ -150,6 +149,11 @@ endif # are specific to the user's build configuration. include $(BUILD_SYSTEM)/envsetup.mk +# General entries for project pathmap. Any entries listed here should +# be device and hardware independent. +$(call project-set-path-variant,recovery,RECOVERY_VARIANT,bootable/recovery) + +-include vendor/extra/BoardConfigExtra.mk # The build system exposes several variables for where to find the kernel # headers: # TARGET_DEVICE_KERNEL_HEADERS is automatically created for the current @@ -365,8 +369,11 @@ endif # --------------------------------------------------------------- # Generic tools. - -LEX := prebuilts/misc/$(BUILD_OS)-$(HOST_PREBUILT_ARCH)/flex/flex-2.5.39 +ifeq ($(USE_HOST_LEX),yes) + LEX := flex +else + LEX := prebuilts/misc/$(BUILD_OS)-$(HOST_PREBUILT_ARCH)/flex/flex-2.5.39 +endif # The default PKGDATADIR built in the prebuilt bison is a relative path # external/bison/data. # To run bison from elsewhere you need to set up enviromental variable @@ -391,10 +398,12 @@ MKBOOTIMG := $(BOARD_CUSTOM_MKBOOTIMG) endif MKYAFFS2 := $(HOST_OUT_EXECUTABLES)/mkyaffs2image$(HOST_EXECUTABLE_SUFFIX) APICHECK := $(HOST_OUT_EXECUTABLES)/apicheck$(HOST_EXECUTABLE_SUFFIX) +MKIMAGE := $(HOST_OUT_EXECUTABLES)/mkimage$(HOST_EXECUTABLE_SUFFIX) FS_GET_STATS := $(HOST_OUT_EXECUTABLES)/fs_get_stats$(HOST_EXECUTABLE_SUFFIX) MKEXT2IMG := $(HOST_OUT_EXECUTABLES)/genext2fs$(HOST_EXECUTABLE_SUFFIX) MAKE_EXT4FS := $(HOST_OUT_EXECUTABLES)/make_ext4fs$(HOST_EXECUTABLE_SUFFIX) MKEXTUSERIMG := $(HOST_OUT_EXECUTABLES)/mkuserimg.sh +MKEXTUBUNTUIMG := $(HOST_OUT_EXECUTABLES)/mkubuntuimg.sh MAKE_F2FS := $(HOST_OUT_EXECUTABLES)/make_f2fs$(HOST_EXECUTABLE_SUFFIX) MKF2FSUSERIMG := $(HOST_OUT_EXECUTABLES)/mkf2fsuserimg.sh MKEXT2BOOTIMG := external/genext2fs/mkbootimg_ext2.sh @@ -409,7 +418,7 @@ JAVATAGS := build/tools/java-event-log-tags.py LLVM_RS_CC := $(HOST_OUT_EXECUTABLES)/llvm-rs-cc$(HOST_EXECUTABLE_SUFFIX) BCC_COMPAT := $(HOST_OUT_EXECUTABLES)/bcc_compat$(HOST_EXECUTABLE_SUFFIX) LINT := prebuilts/sdk/tools/lint -RMTYPEDEFS := $(HOST_OUT_EXECUTABLES)/rmtypedefs +PULL_LP_BIN := build/tools/pull-lp-bin.py APPEND2SIMG := $(HOST_OUT_EXECUTABLES)/append2simg VERITY_SIGNER := $(HOST_OUT_EXECUTABLES)/verity_signer BUILD_VERITY_TREE := $(HOST_OUT_EXECUTABLES)/build_verity_tree @@ -437,29 +446,29 @@ else COLUMN:= column endif -ifeq ($(HOST_OS),darwin) -ifeq ($(LEGACY_USE_JAVA6),) -HOST_JDK_TOOLS_JAR:= $(shell $(BUILD_SYSTEM)/find-jdk-tools-jar.sh) -else +#ifeq ($(HOST_OS),darwin) +#ifeq ($(LEGACY_USE_JAVA6),) +#HOST_JDK_TOOLS_JAR:= $(shell $(BUILD_SYSTEM)/find-jdk-tools-jar.sh) +#else # Deliberately set to blank for Java 6 installations on MacOS. These # versions allegedly use a non-standard directory structure. -HOST_JDK_TOOLS_JAR := -endif -else -HOST_JDK_TOOLS_JAR:= $(shell $(BUILD_SYSTEM)/find-jdk-tools-jar.sh) -endif - -ifneq ($(HOST_JDK_TOOLS_JAR),) -ifeq ($(wildcard $(HOST_JDK_TOOLS_JAR)),) -$(error Error: could not find jdk tools.jar, please check if your JDK was installed correctly) -endif -endif +#HOST_JDK_TOOLS_JAR := +#endif +#else +#HOST_JDK_TOOLS_JAR:= $(shell $(BUILD_SYSTEM)/find-jdk-tools-jar.sh) +#endif + +#ifneq ($(HOST_JDK_TOOLS_JAR),) +#ifeq ($(wildcard $(HOST_JDK_TOOLS_JAR)),) +#$(error Error: could not find jdk tools.jar, please check if your JDK was installed correctly) +#endif +#endif # Is the host JDK 64-bit version? -HOST_JDK_IS_64BIT_VERSION := -ifneq ($(filter 64-Bit, $(shell java -version 2>&1)),) -HOST_JDK_IS_64BIT_VERSION := true -endif +#HOST_JDK_IS_64BIT_VERSION := +#ifneq ($(filter 64-Bit, $(shell java -version 2>&1)),) +#HOST_JDK_IS_64BIT_VERSION := true +#endif # It's called md5 on Mac OS and md5sum on Linux ifeq ($(HOST_OS),darwin) @@ -468,6 +477,18 @@ else MD5SUM:=md5sum endif +# In-place sed is done different in linux than OS X +ifeq ($(HOST_OS),darwin) +GSED:=$(shell which gsed) +ifeq ($(GSED),) +SED_INPLACE:=sed -i '' +else +SED_INPLACE:=gsed -i +endif +else +SED_INPLACE:=sed -i +endif + APICHECK_CLASSPATH := $(HOST_JDK_TOOLS_JAR) APICHECK_CLASSPATH := $(APICHECK_CLASSPATH):$(HOST_OUT_JAVA_LIBRARIES)/doclava$(COMMON_JAVA_PACKAGE_SUFFIX) APICHECK_CLASSPATH := $(APICHECK_CLASSPATH):$(HOST_OUT_JAVA_LIBRARIES)/jsilver$(COMMON_JAVA_PACKAGE_SUFFIX) @@ -480,10 +501,12 @@ else DEFAULT_SYSTEM_DEV_CERTIFICATE := build/target/product/security/testkey endif +# Rules for QCOM targets +include $(BUILD_SYSTEM)/qcom_target.mk + # ############################################################### # Set up final options. # ############################################################### - HOST_GLOBAL_CFLAGS += $(COMMON_GLOBAL_CFLAGS) HOST_RELEASE_CFLAGS += $(COMMON_RELEASE_CFLAGS) @@ -500,7 +523,8 @@ HOST_GLOBAL_LD_DIRS += -L$(HOST_OUT_INTERMEDIATE_LIBRARIES) TARGET_GLOBAL_LD_DIRS += -L$(TARGET_OUT_INTERMEDIATE_LIBRARIES) HOST_PROJECT_INCLUDES:= $(SRC_HEADERS) $(SRC_HOST_HEADERS) $(HOST_OUT_HEADERS) -TARGET_PROJECT_INCLUDES:= $(SRC_HEADERS) $(TARGET_OUT_HEADERS) \ +TARGET_PROJECT_INCLUDES:= $(SRC_HEADERS) $(TOPDIR)$(call project-path-for,ril)/include \ + $(TARGET_OUT_HEADERS) \ $(TARGET_DEVICE_KERNEL_HEADERS) $(TARGET_BOARD_KERNEL_HEADERS) \ $(TARGET_PRODUCT_KERNEL_HEADERS) @@ -551,16 +575,24 @@ TARGET_CPU_SMP ?= true DEX2OAT_TARGET_ARCH := $(TARGET_ARCH) DEX2OAT_TARGET_CPU_VARIANT := $(TARGET_CPU_VARIANT) DEX2OAT_TARGET_INSTRUCTION_SET_FEATURES := default -ifneq (,$(filter $(DEX2OAT_TARGET_CPU_VARIANT),cortex-a7 cortex-a15 krait denver)) +ifneq (,$(filter $(DEX2OAT_TARGET_CPU_VARIANT),cortex-a7 cortex-a15 krait denver generic cortex-a53)) DEX2OAT_TARGET_INSTRUCTION_SET_FEATURES := div + ifneq (,$(filter $(DEX2OAT_TARGET_CPU_VARIANT),cortex-a53)) + DEX2OAT_TARGET_INSTRUCTION_SET_FEATURES += needfix_835769 + DEX2OAT_TARGET_INSTRUCTION_SET_FEATURES := $(subst $(space),$(comma),$(strip $(DEX2OAT_TARGET_INSTRUCTION_SET_FEATURES))) + endif endif ifdef TARGET_2ND_ARCH $(TARGET_2ND_ARCH_VAR_PREFIX)DEX2OAT_TARGET_ARCH := $(TARGET_2ND_ARCH) $(TARGET_2ND_ARCH_VAR_PREFIX)DEX2OAT_TARGET_CPU_VARIANT := $(TARGET_2ND_CPU_VARIANT) $(TARGET_2ND_ARCH_VAR_PREFIX)DEX2OAT_TARGET_INSTRUCTION_SET_FEATURES := default -ifneq (,$(filter $($(TARGET_2ND_ARCH_VAR_PREFIX)DEX2OAT_TARGET_CPU_VARIANT),cortex-a7 cortex-a15 krait denver)) +ifneq (,$(filter $($(TARGET_2ND_ARCH_VAR_PREFIX)DEX2OAT_TARGET_CPU_VARIANT),cortex-a7 cortex-a15 krait denver cortex-a53)) $(TARGET_2ND_ARCH_VAR_PREFIX)DEX2OAT_TARGET_INSTRUCTION_SET_FEATURES := div + ifneq (,$(filter $($(TARGET_2ND_ARCH_VAR_PREFIX)DEX2OAT_TARGET_CPU_VARIANT),cortex-a53)) + DEX2OAT_TARGET_INSTRUCTION_SET_FEATURES += needfix_835769 + DEX2OAT_TARGET_INSTRUCTION_SET_FEATURES := $(subst $(space),$(comma),$(strip $(DEX2OAT_TARGET_INSTRUCTION_SET_FEATURES))) + endif endif endif @@ -616,4 +648,28 @@ RS_PREBUILT_CLCORE := prebuilts/sdk/renderscript/lib/$(TARGET_ARCH)/librsrt_$(TA RS_PREBUILT_LIBPATH := -L prebuilts/ndk/8/platforms/android-9/arch-$(TARGET_ARCH)/usr/lib RS_PREBUILT_COMPILER_RT := prebuilts/sdk/renderscript/lib/$(TARGET_ARCH)/libcompiler_rt.a +# We might want to skip items listed in PRODUCT_COPY_FILES based on +# various target flags. This is useful for replacing a binary module with one +# built from source. This should be a list of destination files under $OUT +# +TARGET_COPY_FILES_OVERRIDES := \ + $(addprefix %:, $(strip $(TARGET_COPY_FILES_OVERRIDES))) + +ifneq ($(TARGET_COPY_FILES_OVERRIDES),) + PRODUCT_COPY_FILES := $(filter-out $(TARGET_COPY_FILES_OVERRIDES), $(PRODUCT_COPY_FILES)) +endif + +ifneq ($(CM_BUILD),) +## We need to be sure the global selinux policies are included +## last, to avoid accidental resetting by device configs +$(eval include vendor/cm/sepolicy/sepolicy.mk) + +# Include any vendor specific config.mk file +-include $(TOPDIR)vendor/*/build/core/config.mk + +# Include any vendor specific apicheck.mk file +-include $(TOPDIR)vendor/*/build/core/apicheck.mk + +endif + include $(BUILD_SYSTEM)/dumpvar.mk diff --git a/core/definitions.mk b/core/definitions.mk index 38aa72066f5..9085b24d54f 100644 --- a/core/definitions.mk +++ b/core/definitions.mk @@ -355,6 +355,10 @@ define find-other-java-files $(call find-subdir-files,$(1) -name "*.java" -and -not -name ".*") endef +define find-other-aidl-files + $(call find-subdir-files,$(1) -name "*.aidl" -and -not -name ".*") +endef + define find-other-html-files $(call find-subdir-files,$(1) -name "*.html" -and -not -name ".*") endef @@ -971,7 +975,7 @@ endef define transform-cpp-to-o @mkdir -p $(dir $@) -@echo "target $(PRIVATE_ARM_MODE) C++: $(PRIVATE_MODULE) <= $<" +@echo -e ${CL_GRN}"target $(PRIVATE_ARM_MODE) C++:"${CL_RST}" $(PRIVATE_MODULE) <= $<" $(hide) $(PRIVATE_CXX) \ $(addprefix -I , $(PRIVATE_C_INCLUDES)) \ $(shell cat $(PRIVATE_IMPORT_INCLUDES)) \ @@ -1020,12 +1024,12 @@ $(hide) $(PRIVATE_CC) \ endef define transform-c-to-o-no-deps -@echo "target $(PRIVATE_ARM_MODE) C: $(PRIVATE_MODULE) <= $<" +@echo -e ${CL_GRN}"target $(PRIVATE_ARM_MODE) C:"${CL_RST}" $(PRIVATE_MODULE) <= $<" $(call transform-c-or-s-to-o-no-deps, $(PRIVATE_CFLAGS) $(PRIVATE_CONLYFLAGS) $(PRIVATE_DEBUG_CFLAGS)) endef define transform-s-to-o-no-deps -@echo "target asm: $(PRIVATE_MODULE) <= $<" +@echo -e ${CL_GRN}"target asm:"${CL_RST}" $(PRIVATE_MODULE) <= $<" $(call transform-c-or-s-to-o-no-deps, $(PRIVATE_ASFLAGS)) endef @@ -1056,7 +1060,7 @@ endef ########################################################### define transform-m-to-o-no-deps -@echo "target ObjC: $(PRIVATE_MODULE) <= $<" +@echo -e ${CL_GRN}"target ObjC:"${CL_RST}" $(PRIVATE_MODULE) <= $<" $(call transform-c-or-s-to-o-no-deps, $(PRIVATE_CFLAGS) $(PRIVATE_DEBUG_CFLAGS)) endef @@ -1071,7 +1075,7 @@ endef define transform-host-cpp-to-o @mkdir -p $(dir $@) -@echo "host C++: $(PRIVATE_MODULE) <= $<" +@echo -e ${CL_YLW}"host C++:"${CL_RST}" $(PRIVATE_MODULE) <= $<" $(hide) $(PRIVATE_CXX) \ $(addprefix -I , $(PRIVATE_C_INCLUDES)) \ $(shell cat $(PRIVATE_IMPORT_INCLUDES)) \ @@ -1117,12 +1121,12 @@ $(hide) $(PRIVATE_CC) \ endef define transform-host-c-to-o-no-deps -@echo "host C: $(PRIVATE_MODULE) <= $<" +@echo -e ${CL_YLW}"host C:"${CL_RST}" $(PRIVATE_MODULE) <= $<" $(call transform-host-c-or-s-to-o-no-deps, $(PRIVATE_CFLAGS) $(PRIVATE_CONLYFLAGS) $(PRIVATE_DEBUG_CFLAGS)) endef define transform-host-s-to-o-no-deps -@echo "host asm: $(PRIVATE_MODULE) <= $<" +@echo -e ${CL_YLW}"host asm:"${CL_RST}" $(PRIVATE_MODULE) <= $<" $(call transform-host-c-or-s-to-o-no-deps, $(PRIVATE_ASFLAGS)) endef @@ -1141,7 +1145,7 @@ endef ########################################################### define transform-host-m-to-o-no-deps -@echo "host ObjC: $(PRIVATE_MODULE) <= $<" +@echo -e ${CL_YLW}"host ObjC:"${CL_RST}" $(PRIVATE_MODULE) <= $<" $(call transform-host-c-or-s-to-o-no-deps, $(PRIVATE_CFLAGS) $(PRIVATE_DEBUG_CFLAGS)) endef @@ -1176,7 +1180,7 @@ endef # $(1): the full path of the source static library. define _extract-and-include-single-target-whole-static-lib -@echo "preparing StaticLib: $(PRIVATE_MODULE) [including $(1)]" +@echo -e ${CL_YLW}"preparing StaticLib:"${CL_RST}" $(PRIVATE_MODULE) [including $(1)]" $(hide) ldir=$(PRIVATE_INTERMEDIATES_DIR)/WHOLE/$(basename $(notdir $(1)))_objs;\ rm -rf $$ldir; \ mkdir -p $$ldir; \ @@ -1190,8 +1194,16 @@ $(hide) ldir=$(PRIVATE_INTERMEDIATES_DIR)/WHOLE/$(basename $(notdir $(1)))_objs; endef +# $(1): the full path of the source static library. +define extract-and-include-whole-static-libs-first +$(if $(strip $(1)), +@echo "preparing StaticLib: $(PRIVATE_MODULE) [including $(strip $(1))]" +$(hide) cp $(1) $@) +endef + define extract-and-include-target-whole-static-libs -$(foreach lib,$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES), \ +$(call extract-and-include-whole-static-libs-first, $(firstword $(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES))) +$(foreach lib,$(wordlist 2,999,$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES)), \ $(call _extract-and-include-single-target-whole-static-lib, $(lib))) endef @@ -1201,7 +1213,7 @@ define transform-o-to-static-lib @mkdir -p $(dir $@) @rm -f $@ $(extract-and-include-target-whole-static-libs) -@echo "target StaticLib: $(PRIVATE_MODULE) ($@)" +@echo -e ${CL_GRN}"target StaticLib:"${CL_RST}" $(PRIVATE_MODULE) ($@)" $(call split-long-arguments,$($(PRIVATE_2ND_ARCH_VAR_PREFIX)TARGET_AR) \ $($(PRIVATE_2ND_ARCH_VAR_PREFIX)TARGET_GLOBAL_ARFLAGS) \ $(PRIVATE_ARFLAGS) $@,$(filter %.o, $^)) @@ -1213,7 +1225,7 @@ endef # $(1): the full path of the source static library. define _extract-and-include-single-host-whole-static-lib -@echo "preparing StaticLib: $(PRIVATE_MODULE) [including $(1)]" +@echo -e ${CL_YLW}"preparing StaticLib:"${CL_RST}" $(PRIVATE_MODULE) [including $(1)]" $(hide) ldir=$(PRIVATE_INTERMEDIATES_DIR)/WHOLE/$(basename $(notdir $(1)))_objs;\ rm -rf $$ldir; \ mkdir -p $$ldir; \ @@ -1228,7 +1240,8 @@ $(hide) ldir=$(PRIVATE_INTERMEDIATES_DIR)/WHOLE/$(basename $(notdir $(1)))_objs; endef define extract-and-include-host-whole-static-libs -$(foreach lib,$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES), \ +$(call extract-and-include-whole-static-libs-first, $(firstword $(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES))) +$(foreach lib,$(wordlist 2,999,$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES)), \ $(call _extract-and-include-single-host-whole-static-lib, $(lib))) endef @@ -1238,7 +1251,7 @@ define transform-host-o-to-static-lib @mkdir -p $(dir $@) @rm -f $@ $(extract-and-include-host-whole-static-libs) -@echo "host StaticLib: $(PRIVATE_MODULE) ($@)" +@echo -e ${CL_YLW}"host StaticLib:"${CL_RST}" $(PRIVATE_MODULE) ($@)" $(call split-long-arguments,$($(PRIVATE_2ND_ARCH_VAR_PREFIX)HOST_AR) \ $($(PRIVATE_2ND_ARCH_VAR_PREFIX)HOST_GLOBAL_ARFLAGS) \ $(PRIVATE_ARFLAGS) $@,$(filter %.o, $^)) @@ -1277,13 +1290,13 @@ endif define transform-host-o-to-shared-lib @mkdir -p $(dir $@) -@echo "host SharedLib: $(PRIVATE_MODULE) ($@)" +@echo -e ${CL_YLW}"host SharedLib:"${CL_RST}" $(PRIVATE_MODULE) ($@)" $(transform-host-o-to-shared-lib-inner) endef define transform-host-o-to-package @mkdir -p $(dir $@) -@echo "host Package: $(PRIVATE_MODULE) ($@)" +@echo -e ${CL_YLW}"host Package:"${CL_RST}" $(PRIVATE_MODULE) ($@)" $(transform-host-o-to-shared-lib-inner) endef @@ -1309,7 +1322,7 @@ $(hide) $(PRIVATE_CXX) \ $(PRIVATE_TARGET_GLOBAL_LDFLAGS) \ -Wl,-rpath-link=$(PRIVATE_TARGET_OUT_INTERMEDIATE_LIBRARIES) \ -Wl,-rpath,\$$ORIGIN/../lib \ - -Wl,-shared -Wl,-soname,$(notdir $@) \ + -shared -Wl,-soname,$(notdir $@) \ $(PRIVATE_LDFLAGS) \ $(PRIVATE_TARGET_GLOBAL_LD_DIRS) \ $(PRIVATE_ALL_OBJECTS) \ @@ -1327,7 +1340,7 @@ endif define transform-o-to-shared-lib @mkdir -p $(dir $@) -@echo "target SharedLib: $(PRIVATE_MODULE) ($@)" +@echo -e ${CL_GRN}"target SharedLib:"${CL_RST}" $(PRIVATE_MODULE) ($@)" $($(PRIVATE_2ND_ARCH_VAR_PREFIX)transform-o-to-shared-lib-inner) endef @@ -1343,13 +1356,13 @@ endif define transform-to-stripped @mkdir -p $(dir $@) -@echo "target Strip: $(PRIVATE_MODULE) ($@)" +@echo -e ${CL_GRN}"target Strip:"${CL_RST}" $(PRIVATE_MODULE) ($@)" $(hide) $(PRIVATE_STRIP) --strip-all $< -o $@ $(TARGET_STRIP_EXTRA) endef define transform-to-stripped-keep-symbols @mkdir -p $(dir $@) -@echo "target Strip (keep symbols): $(PRIVATE_MODULE) ($@)" +@echo -e ${CL_GRN}"target Strip (keep symbols):"${CL_RST}" $(PRIVATE_MODULE) ($@)" $(hide) $(PRIVATE_OBJCOPY) \ `$(PRIVATE_READELF) -S $< | awk '/.debug_/ {print "-R " $$2}' | xargs` \ $(TARGET_STRIP_KEEP_SYMBOLS_EXTRA) $< $@ @@ -1383,7 +1396,7 @@ endif define transform-o-to-executable @mkdir -p $(dir $@) -@echo "target Executable: $(PRIVATE_MODULE) ($@)" +@echo -e ${CL_GRN}"target Executable:"${CL_RST}" $(PRIVATE_MODULE) ($@)" $($(PRIVATE_2ND_ARCH_VAR_PREFIX)transform-o-to-executable-inner) endef @@ -1402,7 +1415,7 @@ endif define transform-o-to-static-executable @mkdir -p $(dir $@) -@echo "target StaticExecutable: $(PRIVATE_MODULE) ($@)" +@echo -e ${CL_GRN}"target StaticExecutable:"${CL_RST}" $(PRIVATE_MODULE) ($@)" $($(PRIVATE_2ND_ARCH_VAR_PREFIX)transform-o-to-static-executable-inner) endef @@ -1446,7 +1459,7 @@ endif define transform-host-o-to-executable @mkdir -p $(dir $@) -@echo "host Executable: $(PRIVATE_MODULE) ($@)" +@echo -e ${CL_YLW}"host Executable:"${CL_RST}" $(PRIVATE_MODULE) ($@)" $(transform-host-o-to-executable-inner) endef @@ -1587,7 +1600,13 @@ $(hide) if [ -s $(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list-uniq ] ; the -extdirs "" -d $(PRIVATE_CLASS_INTERMEDIATES_DIR) \ $(PRIVATE_JAVACFLAGS) \ \@$(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list-uniq \ - || ( rm -rf $(PRIVATE_CLASS_INTERMEDIATES_DIR) ; exit 41 ) \ + 2>$(PRIVATE_CLASS_INTERMEDIATES_DIR)/stderr \ + && ( [ -s $(PRIVATE_CLASS_INTERMEDIATES_DIR)/stderr ] && \ + echo -e ${CL_YLW}"`cat $(PRIVATE_CLASS_INTERMEDIATES_DIR)/stderr`"${CL_RST} 1>&2; \ + rm -f $(PRIVATE_CLASS_INTERMEDIATES_DIR)/stderr ) \ + || ( [ -s $(PRIVATE_CLASS_INTERMEDIATES_DIR)/stderr ] && \ + echo -e ${CL_RED}"`cat $(PRIVATE_CLASS_INTERMEDIATES_DIR)/stderr`"${CL_RST} 1>&2; \ + rm -rf $(PRIVATE_CLASS_INTERMEDIATES_DIR); exit 41 ) \ fi $(if $(PRIVATE_JAVA_LAYERS_FILE), $(hide) build/tools/java-layers.py \ $(PRIVATE_JAVA_LAYERS_FILE) \@$(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list-uniq,) @@ -1615,7 +1634,7 @@ $(if $(PRIVATE_JAR_MANIFEST), \ endef define transform-java-to-classes.jar -@echo "target Java: $(PRIVATE_MODULE) ($(PRIVATE_CLASS_INTERMEDIATES_DIR))" +@echo -e ${CL_GRN}"target Java:"${CL_RST}" $(PRIVATE_MODULE) ($(PRIVATE_CLASS_INTERMEDIATES_DIR))" $(call compile-java,$(TARGET_JAVAC),$(PRIVATE_BOOTCLASSPATH)) endef @@ -1635,7 +1654,7 @@ $(hide) if [ -e $(PRIVATE_CLASS_INTERMEDIATES_DIR)/stamp ] ; then \ fi $(hide) tr ' ' '\n' < $(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list \ | sort -u > $(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list-uniq -@echo "(Incremental) build source files:" +@echo -e ${CL_YLW}"(Incremental) build source files:"${CL_RST}"" @cat $(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list-uniq $(hide) if [ -s $(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list-uniq ] ; then \ $(1) -encoding UTF-8 \ @@ -1648,7 +1667,13 @@ $(hide) if [ -s $(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list-uniq ] ; the -extdirs "" -d $(PRIVATE_CLASS_INTERMEDIATES_DIR) \ $(PRIVATE_JAVACFLAGS) \ \@$(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list-uniq \ - || ( exit 41 ) \ + 2>$(PRIVATE_CLASS_INTERMEDIATES_DIR)/stderr \ + && ( [ -s $(PRIVATE_CLASS_INTERMEDIATES_DIR)/stderr ] && \ + echo -e ${CL_YLW}"`cat $(PRIVATE_CLASS_INTERMEDIATES_DIR)/stderr`"${CL_RST} 1>&2; \ + rm -f $(PRIVATE_CLASS_INTERMEDIATES_DIR)/stderr ) \ + || ( [ -s $(PRIVATE_CLASS_INTERMEDIATES_DIR)/stderr ] && \ + echo -e ${CL_RED}"`cat $(PRIVATE_CLASS_INTERMEDIATES_DIR)/stderr`"${CL_RST} 1>&2; \ + rm -f $(PRIVATE_CLASS_INTERMEDIATES_DIR)/srderr; exit 41 ) \ fi $(hide) rm -f $(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list $(hide) rm -f $(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list-uniq @@ -1676,7 +1701,7 @@ $(hide) mv $(PRIVATE_CLASS_INTERMEDIATES_DIR)/newstamp $(PRIVATE_CLASS_INTERMEDI endef define transform-java-to-classes.jar -@echo "target Java: $(PRIVATE_MODULE) ($(PRIVATE_CLASS_INTERMEDIATES_DIR))" +@echo -e ${CL_GRN}"target Java:"${CL_RST}" $(PRIVATE_MODULE) ($(PRIVATE_CLASS_INTERMEDIATES_DIR))" $(call compile-java,$(TARGET_JAVAC),$(PRIVATE_BOOTCLASSPATH)) endef endif # ENABLE_INCREMENTALJAVAC @@ -1691,11 +1716,11 @@ endef # only core.jar and framework.jar need a heap this big. # Avoid the memory arguments on Windows, dx fails to load for some reason with them. define transform-classes.jar-to-dex -@echo "target Dex: $(PRIVATE_MODULE)" +@echo -e ${CL_GRN}"target Dex:"${CL_RST}" $(PRIVATE_MODULE)" @mkdir -p $(dir $@) $(hide) rm -f $(dir $@)classes*.dex $(hide) $(DX) \ - $(if $(findstring windows,$(HOST_OS)),,-JXms16M -JXmx2048M) \ + $(if $(findstring windows,$(HOST_OS)),,-JXms16M -JXmx$(if $(call streq,$(HOST_BITS),32),1024,2048)M) \ --dex --output=$(dir $@) \ $(incremental_dex) \ $(if $(NO_OPTIMIZE_DX), \ @@ -1829,7 +1854,7 @@ endef # Note: we intentionally don't clean PRIVATE_CLASS_INTERMEDIATES_DIR # in transform-java-to-classes for the sake of vm-tests. define transform-host-java-to-package -@echo "host Java: $(PRIVATE_MODULE) ($(PRIVATE_CLASS_INTERMEDIATES_DIR))" +@echo -e ${CL_YLW}"host Java:"${CL_RST}" $(PRIVATE_MODULE) ($(PRIVATE_CLASS_INTERMEDIATES_DIR))" $(call compile-java,$(HOST_JAVAC),$(PRIVATE_BOOTCLASSPATH)) $(if $(PRIVATE_EXTRA_JAR_ARGS), $(call add-java-resources-to-package)) endef @@ -1843,7 +1868,7 @@ endef # $(2): destination header define copy-one-header $(2): $(1) - @echo "Header: $$@" + @echo -e ${CL_YLW}"Header:"${CL_RST}" $$@" $$(copy-file-to-new-target-with-cp) endef @@ -1852,7 +1877,7 @@ endef # $(2): destination file define copy-one-file $(2): $(1) | $(ACP) - @echo "Copy: $$@" + @echo -e ${CL_YLW}"Copy:"${CL_RST}" $$@" $$(copy-file-to-target) endef @@ -1873,7 +1898,7 @@ endef # $(2): destination file, must end with .xml. define copy-xml-file-checked $(2): $(1) | $(ACP) - @echo "Copy xml: $$@" + @echo -e ${CL_YLW}"Copy xml:"${CL_RST}" $$@" $(hide) xmllint $$< >/dev/null # Don't print the xml file to stdout. $$(copy-file-to-target) endef @@ -1931,19 +1956,19 @@ endef # Copy a prebuilt file to a target location. define transform-prebuilt-to-target -@echo "$(if $(PRIVATE_IS_HOST_MODULE),host,target) Prebuilt: $(PRIVATE_MODULE) ($@)" +@echo -e ${CL_CYN}"$(if $(PRIVATE_IS_HOST_MODULE),host,target) Prebuilt:"${CL_RST}" $(PRIVATE_MODULE) ($@)" $(copy-file-to-target) endef # Copy a prebuilt file to a target location, using zipalign on it. define transform-prebuilt-to-target-with-zipalign -@echo "$(if $(PRIVATE_IS_HOST_MODULE),host,target) Prebuilt APK: $(PRIVATE_MODULE) ($@)" +@echo -e ${CL_CYN}"$(if $(PRIVATE_IS_HOST_MODULE),host,target) Prebuilt APK:"${CL_RST}" $(PRIVATE_MODULE) ($@)" $(copy-file-to-target-with-zipalign) endef # Copy a prebuilt file to a target location, stripping "# comment" comments. define transform-prebuilt-to-target-strip-comments -@echo "$(if $(PRIVATE_IS_HOST_MODULE),host,target) Prebuilt: $(PRIVATE_MODULE) ($@)" +@echo -e ${CL_CYN}"$(if $(PRIVATE_IS_HOST_MODULE),host,target) Prebuilt:"${CL_RST}" $(PRIVATE_MODULE) ($@)" $(copy-file-to-target-strip-comments) endef @@ -1977,8 +2002,9 @@ endif ########################################################### ## Commands to call Proguard ########################################################### +@echo -e ${CL_CYN}"Copying:"${CL_RST}" $@" +@echo -e ${CL_GRN}"Proguard:"${CL_RST}" $@" define transform-jar-to-proguard -@echo Proguard: $@ $(hide) $(PROGUARD) -injars $< -outjars $@ $(PRIVATE_PROGUARD_FLAGS) \ $(addprefix -injars , $(PRIVATE_EXTRA_INPUT_JAR)) endef @@ -1988,7 +2014,7 @@ endef ########################################################### define transform-generated-source -@echo "target Generated: $(PRIVATE_MODULE) <= $<" +@echo -e ${CL_GRN}"target Generated:"${CL_RST}" $(PRIVATE_MODULE) <= $<" @mkdir -p $(dir $@) $(hide) $(PRIVATE_CUSTOM_TOOL) endef @@ -2211,6 +2237,7 @@ include $(BUILD_SYSTEM)/distdir.mk # Include any vendor specific definitions.mk file -include $(TOPDIR)vendor/*/build/core/definitions.mk +-include $(TOPDIR)device/*/build/core/definitions.mk # broken: # $(foreach file,$^,$(if $(findstring,.a,$(suffix $file)),-l$(file),$(file))) diff --git a/core/dex_preopt_libart.mk b/core/dex_preopt_libart.mk index cfbf2218f81..6f7d14d3b5c 100644 --- a/core/dex_preopt_libart.mk +++ b/core/dex_preopt_libart.mk @@ -58,6 +58,13 @@ define get-odex-file-path $(dir $(2))$(1)/$(basename $(notdir $(2))).odex endef +# Returns the path to the .odex.gz file +# $(1): the arch name. +# $(2): the full path (including file name) of the corresponding .jar or .apk. +define get-odex-comp-path +$(dir $(2))$(1)/$(basename $(notdir $(2))).odex.gz +endef + # Returns the path to the image file (such as "/system/framework//boot.art" # $(1): the arch name (such as "arm") # $(2): the image location (such as "/system/framework/boot.art") diff --git a/core/dex_preopt_odex_install.mk b/core/dex_preopt_odex_install.mk index cb38261abe5..61095539ae5 100644 --- a/core/dex_preopt_odex_install.mk +++ b/core/dex_preopt_odex_install.mk @@ -46,6 +46,7 @@ endif built_odex := installed_odex := +compressed_odex := built_installed_odex := ifdef LOCAL_DEX_PREOPT dexpreopt_boot_jar_module := $(filter $(DEXPREOPT_BOOT_JARS_MODULES),$(LOCAL_MODULE)) @@ -108,8 +109,10 @@ endif # Compile apps with position-independent code if WITH_DEXPREOPT_PIC=true ifeq (true,$(WITH_DEXPREOPT_PIC)) +ifeq (false,$(WITH_DEXPREOPT_COMP)) LOCAL_DEX_PREOPT_FLAGS += --compile-pic endif +endif $(built_odex): PRIVATE_DEX_PREOPT_FLAGS := $(LOCAL_DEX_PREOPT_FLAGS) @@ -118,15 +121,24 @@ $(built_odex): PRIVATE_DEX_PREOPT_FLAGS := $(LOCAL_DEX_PREOPT_FLAGS) $(installed_odex) : $(dir $(LOCAL_INSTALLED_MODULE))%$(notdir $(word 1,$(installed_odex))) \ : $(dir $(LOCAL_BUILT_MODULE))%$(notdir $(word 1,$(built_odex))) \ | $(ACP) - @echo "Install: $@" + @echo -e ${CL_CYN}"Install: $@"${CL_RST} $(copy-file-to-target) + +# Ugly syntax - See the definition get-odex-comp-path. +$(compressed_odex) : $(dir $(LOCAL_INSTALLED_MODULE))%$(notdir $(word 1,$(compressed_odex))) \ + : $(dir $(LOCAL_BUILT_MODULE))%$(notdir $(word 1,$(built_odex))) \ + | $(MINIGZIP) + $(hide) mkdir -p $(dir $@) + $(MINIGZIP) -9 < $< > $@ endif -# Add the installed_odex to the list of installed files for this module. +# Add the installed_odex and compressed_odex to the list of installed files for this module. +ALL_MODULES.$(my_register_name).INSTALLED += $(compressed_odex) ALL_MODULES.$(my_register_name).INSTALLED += $(installed_odex) ALL_MODULES.$(my_register_name).BUILT_INSTALLED += $(built_installed_odex) # Make sure to install the .odex when you run "make " +$(my_register_name): $(compressed_odex) $(my_register_name): $(installed_odex) endif # LOCAL_DEX_PREOPT diff --git a/core/distdir.mk b/core/distdir.mk index 51ec46efeff..829951e8d79 100644 --- a/core/distdir.mk +++ b/core/distdir.mk @@ -37,7 +37,7 @@ ifdef dist_goal define copy-one-dist-file $(3): $(2) $(2): $(1) - @echo "Dist: $$@" + @echo -e ${CL_YLW}"Dist:"${CL_RST}" $$@" $$(copy-file-to-new-target-with-cp) endef diff --git a/core/droiddoc.mk b/core/droiddoc.mk index d3e61d57c5b..2f95eb2c0bb 100644 --- a/core/droiddoc.mk +++ b/core/droiddoc.mk @@ -155,7 +155,7 @@ endif $(full_target): PRIVATE_LOCAL_PATH := $(LOCAL_PATH) $(full_target): $(full_src_files) $(droiddoc_templates) $(droiddoc) $(html_dir_files) $(full_java_lib_deps) $(LOCAL_ADDITIONAL_DEPENDENCIES) - @echo Docs droiddoc: $(PRIVATE_OUT_DIR) + @echo -e ${CL_YLW}"Docs droiddoc:"${CL_RST}" $(PRIVATE_OUT_DIR)" $(hide) mkdir -p $(dir $@) $(call prepare-doc-source-list,$(PRIVATE_SRC_LIST_FILE),$(PRIVATE_JAVA_FILES), \ $(PRIVATE_SOURCE_INTERMEDIATES_DIR) $(PRIVATE_ADDITIONAL_JAVA_DIR)) @@ -190,7 +190,7 @@ else ## ## $(full_target): $(full_src_files) $(full_java_lib_deps) - @echo Docs javadoc: $(PRIVATE_OUT_DIR) + @echo -e ${CL_YLW}"Docs javadoc:"${CL_RST}" $(PRIVATE_OUT_DIR)" @mkdir -p $(dir $@) $(call prepare-doc-source-list,$(PRIVATE_SRC_LIST_FILE),$(PRIVATE_JAVA_FILES), \ $(PRIVATE_SOURCE_INTERMEDIATES_DIR) $(PRIVATE_ADDITIONAL_JAVA_DIR)) @@ -230,7 +230,7 @@ ifeq ($(strip $(LOCAL_UNINSTALLABLE_MODULE)),) out_zip := $(OUT_DOCS)/$(LOCAL_MODULE)-docs.zip $(out_zip): PRIVATE_DOCS_DIR := $(out_dir) $(out_zip): $(full_target) - @echo Package docs: $@ + @echo -e ${CL_YLW}"Package docs:"${CL_RST}" $@" @rm -f $@ @mkdir -p $(dir $@) $(hide) ( F=$$(pwd)/$@ ; cd $(PRIVATE_DOCS_DIR) && zip -rq $$F * ) diff --git a/core/dumpvar.mk b/core/dumpvar.mk index 510bc7d0829..555da1d4d91 100644 --- a/core/dumpvar.mk +++ b/core/dumpvar.mk @@ -67,6 +67,7 @@ HOST_OS_EXTRA:=$(shell python -c "import platform; print(platform.platform())") $(info ============================================) $(info PLATFORM_VERSION_CODENAME=$(PLATFORM_VERSION_CODENAME)) $(info PLATFORM_VERSION=$(PLATFORM_VERSION)) +$(info CM_VERSION=$(CM_VERSION)) $(info TARGET_PRODUCT=$(TARGET_PRODUCT)) $(info TARGET_BUILD_VARIANT=$(TARGET_BUILD_VARIANT)) $(info TARGET_BUILD_TYPE=$(TARGET_BUILD_TYPE)) @@ -83,5 +84,11 @@ $(info HOST_OS_EXTRA=$(HOST_OS_EXTRA)) $(info HOST_BUILD_TYPE=$(HOST_BUILD_TYPE)) $(info BUILD_ID=$(BUILD_ID)) $(info OUT_DIR=$(OUT_DIR)) +ifneq (,$(filter true, $(CYNGN_TARGET) $(EXTERNAL_CLEAN_TARGET))) +ifeq ($(CYNGN_TARGET), true) +$(info CYNGN_TARGET=$(CYNGN_TARGET)) +endif +$(info CYNGN_FEATURES=$(CYNGN_FEATURES)) +endif $(info ============================================) endif diff --git a/core/dynamic_binary.mk b/core/dynamic_binary.mk index 08fb176008f..aefaea64dd3 100644 --- a/core/dynamic_binary.mk +++ b/core/dynamic_binary.mk @@ -55,7 +55,7 @@ compress_output := $(intermediates)/COMPRESSED-$(my_built_module_stem) #TODO: define a rule to build TARGET_SYMBOL_FILTER_FILE, and # make it depend on ALL_ORIGINAL_DYNAMIC_BINARIES. $(compress_output): $(compress_input) $(TARGET_SYMBOL_FILTER_FILE) | $(ACP) - @echo "target Compress Symbols: $(PRIVATE_MODULE) ($@)" + @echo -e ${CL_GRN}"target Compress Symbols:"${CL_RST}" $(PRIVATE_MODULE) ($@)" $(copy-file-to-target) else # Skip this step. @@ -73,7 +73,7 @@ endif symbolic_input := $(compress_output) symbolic_output := $(my_unstripped_path)/$(my_installed_module_stem) $(symbolic_output) : $(symbolic_input) | $(ACP) - @echo "target Symbolic: $(PRIVATE_MODULE) ($@)" + @echo -e ${CL_GRN}"target Symbolic:"${CL_RST}" $(PRIVATE_MODULE) ($@)" $(copy-file-to-target) @@ -119,11 +119,11 @@ else # use cp(1) instead. ifneq ($(LOCAL_ACP_UNAVAILABLE),true) $(strip_output): $(strip_input) | $(ACP) - @echo "target Unstripped: $(PRIVATE_MODULE) ($@)" + @echo -e ${CL_GRN}"target Unstripped:"${CL_RST}" $(PRIVATE_MODULE) ($@)" $(copy-file-to-target) else $(strip_output): $(strip_input) - @echo "target Unstripped: $(PRIVATE_MODULE) ($@)" + @echo -e ${CL_GRN}"target Unstripped:"${CL_RST}" $(PRIVATE_MODULE) ($@)" $(copy-file-to-target-with-cp) endif endif diff --git a/core/envsetup.mk b/core/envsetup.mk index 124a91b4f2b..7035d1b9f91 100644 --- a/core/envsetup.mk +++ b/core/envsetup.mk @@ -52,6 +52,12 @@ ifneq (,$(findstring CYGWIN,$(UNAME))) HOST_OS := windows endif +# On OS X by default using local initrd and prebuilt kernel +ifeq ($(HOST_OS),darwin) + BOARD_USE_PREBUILT_KERNEL := true + BOARD_USE_LOCAL_INITRD := true +endif + # BUILD_OS is the real host doing the build. BUILD_OS := $(HOST_OS) @@ -122,6 +128,10 @@ TARGET_COPY_OUT_DATA := data TARGET_COPY_OUT_OEM := oem TARGET_COPY_OUT_ROOT := root TARGET_COPY_OUT_RECOVERY := recovery +TARGET_COPY_OUT_UBUNTU_INITRD := initrd +TARGET_COPY_OUT_UBUNTU_RAMDISK := ramdisk +TARGET_COPY_OUT_UBUNTU_CUSTOM := custom +TARGET_COPY_OUT_UBUNTU_ROOTFS := rootfs ########################################### # Define TARGET_COPY_OUT_VENDOR to a placeholder, for at this point # we don't know if the device wants to build a separate vendor.img @@ -199,8 +209,12 @@ endif ifeq (,$(strip $(OUT_DIR))) ifeq (,$(strip $(OUT_DIR_COMMON_BASE))) +ifneq ($(TOPDIR),) OUT_DIR := $(TOPDIR)out else +OUT_DIR := $(CURDIR)/out +endif +else OUT_DIR := $(OUT_DIR_COMMON_BASE)/$(notdir $(PWD)) endif endif @@ -292,6 +306,7 @@ TARGET_OUT_KEYCHARS := $(TARGET_OUT)/usr/keychars TARGET_OUT_ETC := $(TARGET_OUT)/etc TARGET_OUT_NOTICE_FILES := $(TARGET_OUT_INTERMEDIATES)/NOTICE_FILES TARGET_OUT_FAKE := $(PRODUCT_OUT)/fake_packages +TARGET_OUT_UBUNTU := $(PRODUCT_OUT)/ubuntu # Out for TARGET_2ND_ARCH TARGET_2ND_ARCH_VAR_PREFIX := $(HOST_2ND_ARCH_VAR_PREFIX) @@ -370,6 +385,10 @@ TARGET_ROOT_OUT_BIN := $(TARGET_ROOT_OUT)/bin TARGET_ROOT_OUT_SBIN := $(TARGET_ROOT_OUT)/sbin TARGET_ROOT_OUT_ETC := $(TARGET_ROOT_OUT)/etc TARGET_ROOT_OUT_USR := $(TARGET_ROOT_OUT)/usr +TARGET_OUT_UBUNTU_RAMDISK := $(TARGET_OUT_UBUNTU)/$(TARGET_COPY_OUT_UBUNTU_RAMDISK) +TARGET_OUT_UBUNTU_INITRD := $(TARGET_OUT_UBUNTU)/$(TARGET_COPY_OUT_UBUNTU_INITRD) +TARGET_OUT_UBUNTU_ROOTFS := $(TARGET_OUT_UBUNTU)/$(TARGET_COPY_OUT_UBUNTU_ROOTFS) +TARGET_OUT_UBUNTU_CUSTOM := $(TARGET_OUT_UBUNTU)/$(TARGET_COPY_OUT_UBUNTU_CUSTOM) TARGET_RECOVERY_OUT := $(PRODUCT_OUT)/$(TARGET_COPY_OUT_RECOVERY) TARGET_RECOVERY_ROOT_OUT := $(TARGET_RECOVERY_OUT)/root diff --git a/core/generate_extra_images.mk b/core/generate_extra_images.mk new file mode 100644 index 00000000000..319fb1fc4ca --- /dev/null +++ b/core/generate_extra_images.mk @@ -0,0 +1,320 @@ +# This makefile is used to generate extra images for QCOM targets +# persist, device tree & NAND images required for different QCOM targets. + +# These variables are required to make sure that the required +# files/targets are available before generating NAND images. +# This file is included from device/qcom//AndroidBoard.mk +# and gets parsed before build/core/Makefile, which has these +# variables defined. build/core/Makefile will overwrite these +# variables again. +INSTALLED_BOOTIMAGE_TARGET := $(PRODUCT_OUT)/boot.img +INSTALLED_RAMDISK_TARGET := $(PRODUCT_OUT)/ramdisk.img +INSTALLED_SYSTEMIMAGE := $(PRODUCT_OUT)/system.img +INSTALLED_USERDATAIMAGE_TARGET := $(PRODUCT_OUT)/userdata.img +INSTALLED_RECOVERYIMAGE_TARGET := $(PRODUCT_OUT)/recovery.img +recovery_ramdisk := $(PRODUCT_OUT)/ramdisk-recovery.img + +#---------------------------------------------------------------------- +# Generate secure boot & recovery image +#---------------------------------------------------------------------- +ifeq ($(TARGET_BOOTIMG_SIGNED),true) +INSTALLED_SEC_BOOTIMAGE_TARGET := $(PRODUCT_OUT)/boot.img.secure +INSTALLED_SEC_RECOVERYIMAGE_TARGET := $(PRODUCT_OUT)/recovery.img.secure + +ifneq ($(BUILD_TINY_ANDROID),true) +intermediates := $(call intermediates-dir-for,PACKAGING,recovery_patch) +RECOVERY_FROM_BOOT_PATCH := $(intermediates)/recovery_from_boot.p +endif + +ifndef TARGET_SHA_TYPE + TARGET_SHA_TYPE := sha256 +endif + +define build-sec-image + $(hide) mv -f $(1) $(1).nonsecure + $(hide) openssl dgst -$(TARGET_SHA_TYPE) -binary $(1).nonsecure > $(1).$(TARGET_SHA_TYPE) + $(hide) openssl rsautl -sign -in $(1).$(TARGET_SHA_TYPE) -inkey $(PRODUCT_PRIVATE_KEY) -out $(1).sig + $(hide) dd if=/dev/zero of=$(1).sig.padded bs=$(BOARD_KERNEL_PAGESIZE) count=1 + $(hide) dd if=$(1).sig of=$(1).sig.padded conv=notrunc + $(hide) cat $(1).nonsecure $(1).sig.padded > $(1).secure + $(hide) rm -rf $(1).$(TARGET_SHA_TYPE) $(1).sig $(1).sig.padded + $(hide) mv -f $(1).secure $(1) +endef + +$(INSTALLED_SEC_BOOTIMAGE_TARGET): $(INSTALLED_BOOTIMAGE_TARGET) $(RECOVERY_FROM_BOOT_PATCH) + $(hide) $(call build-sec-image,$(INSTALLED_BOOTIMAGE_TARGET)) + +ALL_DEFAULT_INSTALLED_MODULES += $(INSTALLED_SEC_BOOTIMAGE_TARGET) +ALL_MODULES.$(LOCAL_MODULE).INSTALLED += $(INSTALLED_SEC_BOOTIMAGE_TARGET) + +$(INSTALLED_SEC_RECOVERYIMAGE_TARGET): $(INSTALLED_RECOVERYIMAGE_TARGET) $(RECOVERY_FROM_BOOT_PATCH) + $(hide) $(call build-sec-image,$(INSTALLED_RECOVERYIMAGE_TARGET)) + +ifneq ($(BUILD_TINY_ANDROID),true) +ALL_DEFAULT_INSTALLED_MODULES += $(INSTALLED_SEC_RECOVERYIMAGE_TARGET) +ALL_MODULES.$(LOCAL_MODULE).INSTALLED += $(INSTALLED_SEC_RECOVERYIMAGE_TARGET) +endif # !BUILD_TINY_ANDROID +endif # TARGET_BOOTIMG_SIGNED + +#---------------------------------------------------------------------- +# Generate persist image (persist.img) +#---------------------------------------------------------------------- +TARGET_OUT_PERSIST := $(PRODUCT_OUT)/persist + +INTERNAL_PERSISTIMAGE_FILES := \ + $(filter $(TARGET_OUT_PERSIST)/%,$(ALL_DEFAULT_INSTALLED_MODULES)) + +INSTALLED_PERSISTIMAGE_TARGET := $(PRODUCT_OUT)/persist.img + +define build-persistimage-target + $(call pretty,"Target persist fs image: $(INSTALLED_PERSISTIMAGE_TARGET)") + @mkdir -p $(TARGET_OUT_PERSIST) + $(hide) $(MKEXTUSERIMG) -s $(TARGET_OUT_PERSIST) $@ ext4 persist $(BOARD_PERSISTIMAGE_PARTITION_SIZE) + $(hide) chmod a+r $@ + $(hide) $(call assert-max-image-size,$@,$(BOARD_PERSISTIMAGE_PARTITION_SIZE),yaffs) +endef + +$(INSTALLED_PERSISTIMAGE_TARGET): $(MKEXTUSERIMG) $(MAKE_EXT4FS) $(INTERNAL_PERSISTIMAGE_FILES) + $(build-persistimage-target) + +ALL_DEFAULT_INSTALLED_MODULES += $(INSTALLED_PERSISTIMAGE_TARGET) +ALL_MODULES.$(LOCAL_MODULE).INSTALLED += $(INSTALLED_PERSISTIMAGE_TARGET) + +#---------------------------------------------------------------------- +# Generate 1GB userdata image for 8930 +#---------------------------------------------------------------------- +ifeq ($(call is-board-platform-in-list,msm8960),true) + +1G_USER_OUT := $(PRODUCT_OUT)/1g_user_image +BOARD_1G_USERDATAIMAGE_PARTITION_SIZE := 5368709120 +INSTALLED_1G_USERDATAIMAGE_TARGET := $(1G_USER_OUT)/userdata.img + +define build-1g-userdataimage-target + $(call pretty,"Target 1G userdata fs image: $(INSTALLED_1G_USERDATAIMAGE_TARGET)") + @mkdir -p $(1G_USER_OUT) + $(hide) $(MKEXTUSERIMG) -s $(TARGET_OUT_DATA) $@ ext4 data $(BOARD_1G_USERDATAIMAGE_PARTITION_SIZE) + $(hide) chmod a+r $@ + $(hide) $(call assert-max-image-size,$@,$(BOARD_1G_USERDATAIMAGE_PARTITION_SIZE),yaffs) +endef + +$(INSTALLED_1G_USERDATAIMAGE_TARGET): $(INSTALLED_USERDATAIMAGE_TARGET) + $(build-1g-userdataimage-target) + +ALL_DEFAULT_INSTALLED_MODULES += $(INSTALLED_1G_USERDATAIMAGE_TARGET) +ALL_MODULES.$(LOCAL_MODULE).INSTALLED += $(INSTALLED_1G_USERDATAIMAGE_TARGET) + +endif + + +#---------------------------------------------------------------------- +# Generate extra userdata images (for variants with multiple mmc sizes) +#---------------------------------------------------------------------- +ifneq ($(BOARD_USERDATAEXTRAIMAGE_PARTITION_SIZE),) + +ifndef BOARD_USERDATAEXTRAIMAGE_PARTITION_NAME + BOARD_USERDATAEXTRAIMAGE_PARTITION_NAME := extra +endif + +BUILT_USERDATAEXTRAIMAGE_TARGET := $(PRODUCT_OUT)/userdata_$(BOARD_USERDATAEXTRAIMAGE_PARTITION_NAME).img + +define build-userdataextraimage-target + $(call pretty,"Target EXTRA userdata fs image: $(INSTALLED_USERDATAEXTRAIMAGE_TARGET)") + @mkdir -p $(TARGET_OUT_DATA) + $(hide) $(MKEXTUSERIMG) -s $(TARGET_OUT_DATA) $@ ext4 data $(BOARD_USERDATAEXTRAIMAGE_PARTITION_SIZE) + $(hide) chmod a+r $@ + $(hide) $(call assert-max-image-size,$@,$(BOARD_USERDATAEXTRAIMAGE_PARTITION_SIZE),yaffs) +endef + +INSTALLED_USERDATAEXTRAIMAGE_TARGET := $(BUILT_USERDATAEXTRAIMAGE_TARGET) +$(INSTALLED_USERDATAEXTRAIMAGE_TARGET): $(INSTALLED_USERDATAIMAGE_TARGET) + $(build-userdataextraimage-target) + +ALL_DEFAULT_INSTALLED_MODULES += $(INSTALLED_USERDATAEXTRAIMAGE_TARGET) +ALL_MODULES.$(LOCAL_MODULE).INSTALLED += $(INSTALLED_USERDATAEXTRAIMAGE_TARGET) + +endif + + +#---------------------------------------------------------------------- +# Generate NAND images +#---------------------------------------------------------------------- +ifeq ($(call is-board-platform-in-list,msm7x27a msm7x30),true) + +2K_NAND_OUT := $(PRODUCT_OUT)/2k_nand_images +4K_NAND_OUT := $(PRODUCT_OUT)/4k_nand_images +BCHECC_OUT := $(PRODUCT_OUT)/bchecc_images + +INSTALLED_2K_BOOTIMAGE_TARGET := $(2K_NAND_OUT)/boot.img +INSTALLED_2K_SYSTEMIMAGE_TARGET := $(2K_NAND_OUT)/system.img +INSTALLED_2K_USERDATAIMAGE_TARGET := $(2K_NAND_OUT)/userdata.img +INSTALLED_2K_PERSISTIMAGE_TARGET := $(2K_NAND_OUT)/persist.img +INSTALLED_2K_RECOVERYIMAGE_TARGET := $(2K_NAND_OUT)/recovery.img + +INSTALLED_4K_BOOTIMAGE_TARGET := $(4K_NAND_OUT)/boot.img +INSTALLED_4K_SYSTEMIMAGE_TARGET := $(4K_NAND_OUT)/system.img +INSTALLED_4K_USERDATAIMAGE_TARGET := $(4K_NAND_OUT)/userdata.img +INSTALLED_4K_PERSISTIMAGE_TARGET := $(4K_NAND_OUT)/persist.img +INSTALLED_4K_RECOVERYIMAGE_TARGET := $(4K_NAND_OUT)/recovery.img + +INSTALLED_BCHECC_BOOTIMAGE_TARGET := $(BCHECC_OUT)/boot.img +INSTALLED_BCHECC_SYSTEMIMAGE_TARGET := $(BCHECC_OUT)/system.img +INSTALLED_BCHECC_USERDATAIMAGE_TARGET := $(BCHECC_OUT)/userdata.img +INSTALLED_BCHECC_PERSISTIMAGE_TARGET := $(BCHECC_OUT)/persist.img +INSTALLED_BCHECC_RECOVERYIMAGE_TARGET := $(BCHECC_OUT)/recovery.img + +recovery_nand_fstab := $(TARGET_DEVICE_DIR)/recovery_nand.fstab + +NAND_BOOTIMAGE_ARGS := \ + --kernel $(INSTALLED_KERNEL_TARGET) \ + --ramdisk $(INSTALLED_RAMDISK_TARGET) \ + --cmdline "$(BOARD_KERNEL_CMDLINE)" \ + --base $(BOARD_KERNEL_BASE) + +NAND_RECOVERYIMAGE_ARGS := \ + --kernel $(INSTALLED_KERNEL_TARGET) \ + --ramdisk $(recovery_ramdisk) \ + --cmdline "$(BOARD_KERNEL_CMDLINE)" \ + --base $(BOARD_KERNEL_BASE) + +INTERNAL_4K_BOOTIMAGE_ARGS := $(NAND_BOOTIMAGE_ARGS) +INTERNAL_4K_BOOTIMAGE_ARGS += --pagesize $(BOARD_KERNEL_PAGESIZE) + +INTERNAL_2K_BOOTIMAGE_ARGS := $(NAND_BOOTIMAGE_ARGS) +INTERNAL_2K_BOOTIMAGE_ARGS += --pagesize $(BOARD_KERNEL_2KPAGESIZE) + +INTERNAL_4K_MKYAFFS2_FLAGS := -c $(BOARD_KERNEL_PAGESIZE) +INTERNAL_4K_MKYAFFS2_FLAGS += -s $(BOARD_KERNEL_SPARESIZE) + +INTERNAL_2K_MKYAFFS2_FLAGS := -c $(BOARD_KERNEL_2KPAGESIZE) +INTERNAL_2K_MKYAFFS2_FLAGS += -s $(BOARD_KERNEL_2KSPARESIZE) + +INTERNAL_BCHECC_MKYAFFS2_FLAGS := -c $(BOARD_KERNEL_PAGESIZE) +INTERNAL_BCHECC_MKYAFFS2_FLAGS += -s $(BOARD_KERNEL_BCHECC_SPARESIZE) + +INTERNAL_4K_RECOVERYIMAGE_ARGS := $(NAND_RECOVERYIMAGE_ARGS) +INTERNAL_4K_RECOVERYIMAGE_ARGS += --pagesize $(BOARD_KERNEL_PAGESIZE) + +INTERNAL_2K_RECOVERYIMAGE_ARGS := $(NAND_RECOVERYIMAGE_ARGS) +INTERNAL_2K_RECOVERYIMAGE_ARGS += --pagesize $(BOARD_KERNEL_2KPAGESIZE) + +# Generate boot image for NAND +ifeq ($(TARGET_BOOTIMG_SIGNED),true) + +ifndef TARGET_SHA_TYPE + TARGET_SHA_TYPE := sha256 +endif + +define build-nand-bootimage + @echo "target NAND boot image: $(3)" + $(hide) mkdir -p $(1) + $(hide) $(MKBOOTIMG) $(2) --output $(3).nonsecure + $(hide) openssl dgst -$(TARGET_SHA_TYPE) -binary $(3).nonsecure > $(3).$(TARGET_SHA_TYPE) + $(hide) openssl rsautl -sign -in $(3).$(TARGET_SHA_TYPE) -inkey $(PRODUCT_PRIVATE_KEY) -out $(3).sig + $(hide) dd if=/dev/zero of=$(3).sig.padded bs=$(BOARD_KERNEL_PAGESIZE) count=1 + $(hide) dd if=$(3).sig of=$(3).sig.padded conv=notrunc + $(hide) cat $(3).nonsecure $(3).sig.padded > $(3) + $(hide) rm -rf $(3).$(TARGET_SHA_TYPE) $(3).sig $(3).sig.padded +endef +else +define build-nand-bootimage + @echo "target NAND boot image: $(3)" + $(hide) mkdir -p $(1) + $(hide) $(MKBOOTIMG) $(2) --output $(3) +endef + $(hide) $(call assert-max-image-size,$@,$(BOARD_BOOTIMAGE_PARTITION_SIZE),raw) +endif + +# Generate system image for NAND +define build-nand-systemimage + @echo "target NAND system image: $(3)" + $(hide) mkdir -p $(1) + $(hide) $(MKYAFFS2) -f $(2) $(TARGET_OUT) $(3) + $(hide) chmod a+r $(3) + $(hide) $(call assert-max-image-size,$@,$(BOARD_SYSTEMIMAGE_PARTITION_SIZE),yaffs) +endef + +# Generate userdata image for NAND +define build-nand-userdataimage + @echo "target NAND userdata image: $(3)" + $(hide) mkdir -p $(1) + $(hide) $(MKYAFFS2) -f $(2) $(TARGET_OUT_DATA) $(3) + $(hide) chmod a+r $(3) + $(hide) $(call assert-max-image-size,$@,$(BOARD_USERDATAIMAGE_PARTITION_SIZE),yaffs) +endef + +# Generate persist image for NAND +define build-nand-persistimage + @echo "target NAND persist image: $(3)" + $(hide) mkdir -p $(1) + $(hide) $(MKYAFFS2) -f $(2) $(TARGET_OUT_PERSIST) $(3) + $(hide) chmod a+r $(3) + $(hide) $(call assert-max-image-size,$@,$(BOARD_PERSISTIMAGE_PARTITION_SIZE),yaffs) +endef + +$(INSTALLED_4K_BOOTIMAGE_TARGET): $(MKBOOTIMG) $(INSTALLED_BOOTIMAGE_TARGET) + $(hide) $(call build-nand-bootimage,$(4K_NAND_OUT),$(INTERNAL_4K_BOOTIMAGE_ARGS),$(INSTALLED_4K_BOOTIMAGE_TARGET)) +ifeq ($(call is-board-platform,msm7x27a),true) + $(hide) $(call build-nand-bootimage,$(2K_NAND_OUT),$(INTERNAL_2K_BOOTIMAGE_ARGS),$(INSTALLED_2K_BOOTIMAGE_TARGET)) + $(hide) $(call build-nand-bootimage,$(BCHECC_OUT),$(INTERNAL_4K_BOOTIMAGE_ARGS),$(INSTALLED_BCHECC_BOOTIMAGE_TARGET)) +endif # is-board-platform + +$(INSTALLED_4K_SYSTEMIMAGE_TARGET): $(MKYAFFS2) $(INSTALLED_SYSTEMIMAGE) + $(hide) $(call build-nand-systemimage,$(4K_NAND_OUT),$(INTERNAL_4K_MKYAFFS2_FLAGS),$(INSTALLED_4K_SYSTEMIMAGE_TARGET)) +ifeq ($(call is-board-platform,msm7x27a),true) + $(hide) $(call build-nand-systemimage,$(2K_NAND_OUT),$(INTERNAL_2K_MKYAFFS2_FLAGS),$(INSTALLED_2K_SYSTEMIMAGE_TARGET)) + $(hide) $(call build-nand-systemimage,$(BCHECC_OUT),$(INTERNAL_BCHECC_MKYAFFS2_FLAGS),$(INSTALLED_BCHECC_SYSTEMIMAGE_TARGET)) +endif # is-board-platform + +$(INSTALLED_4K_USERDATAIMAGE_TARGET): $(MKYAFFS2) $(INSTALLED_USERDATAIMAGE_TARGET) + $(hide) $(call build-nand-userdataimage,$(4K_NAND_OUT),$(INTERNAL_4K_MKYAFFS2_FLAGS),$(INSTALLED_4K_USERDATAIMAGE_TARGET)) +ifeq ($(call is-board-platform,msm7x27a),true) + $(hide) $(call build-nand-userdataimage,$(2K_NAND_OUT),$(INTERNAL_2K_MKYAFFS2_FLAGS),$(INSTALLED_2K_USERDATAIMAGE_TARGET)) + $(hide) $(call build-nand-userdataimage,$(BCHECC_OUT),$(INTERNAL_BCHECC_MKYAFFS2_FLAGS),$(INSTALLED_BCHECC_USERDATAIMAGE_TARGET)) +endif # is-board-platform + +$(INSTALLED_4K_PERSISTIMAGE_TARGET): $(MKYAFFS2) $(INSTALLED_PERSISTIMAGE_TARGET) + $(hide) $(call build-nand-persistimage,$(4K_NAND_OUT),$(INTERNAL_4K_MKYAFFS2_FLAGS),$(INSTALLED_4K_PERSISTIMAGE_TARGET)) +ifeq ($(call is-board-platform,msm7x27a),true) + $(hide) $(call build-nand-persistimage,$(2K_NAND_OUT),$(INTERNAL_2K_MKYAFFS2_FLAGS),$(INSTALLED_2K_PERSISTIMAGE_TARGET)) + $(hide) $(call build-nand-persistimage,$(BCHECC_OUT),$(INTERNAL_BCHECC_MKYAFFS2_FLAGS),$(INSTALLED_BCHECC_PERSISTIMAGE_TARGET)) +endif # is-board-platform + +$(INSTALLED_4K_RECOVERYIMAGE_TARGET): $(MKBOOTIMG) $(INSTALLED_RECOVERYIMAGE_TARGET) $(recovery_nand_fstab) + $(hide) cp -f $(recovery_nand_fstab) $(TARGET_RECOVERY_ROOT_OUT)/etc + $(MKBOOTFS) $(TARGET_RECOVERY_ROOT_OUT) | $(MINIGZIP) > $(recovery_ramdisk) + $(hide) $(call build-nand-bootimage,$(4K_NAND_OUT),$(INTERNAL_4K_RECOVERYIMAGE_ARGS),$(INSTALLED_4K_RECOVERYIMAGE_TARGET)) +ifeq ($(call is-board-platform,msm7x27a),true) + $(hide) $(call build-nand-bootimage,$(2K_NAND_OUT),$(INTERNAL_2K_RECOVERYIMAGE_ARGS),$(INSTALLED_2K_RECOVERYIMAGE_TARGET)) + $(hide) $(call build-nand-bootimage,$(BCHECC_OUT),$(INTERNAL_4K_RECOVERYIMAGE_ARGS),$(INSTALLED_BCHECC_RECOVERYIMAGE_TARGET)) +endif # is-board-platform + +ALL_DEFAULT_INSTALLED_MODULES += \ + $(INSTALLED_4K_BOOTIMAGE_TARGET) \ + $(INSTALLED_4K_SYSTEMIMAGE_TARGET) \ + $(INSTALLED_4K_USERDATAIMAGE_TARGET) \ + $(INSTALLED_4K_PERSISTIMAGE_TARGET) + +ALL_MODULES.$(LOCAL_MODULE).INSTALLED += \ + $(INSTALLED_4K_BOOTIMAGE_TARGET) \ + $(INSTALLED_4K_SYSTEMIMAGE_TARGET) \ + $(INSTALLED_4K_USERDATAIMAGE_TARGET) \ + $(INSTALLED_4K_PERSISTIMAGE_TARGET) + +ifneq ($(BUILD_TINY_ANDROID),true) +ALL_DEFAULT_INSTALLED_MODULES += $(INSTALLED_4K_RECOVERYIMAGE_TARGET) +ALL_MODULES.$(LOCAL_MODULE).INSTALLED += $(INSTALLED_4K_RECOVERYIMAGE_TARGET) +endif # !BUILD_TINY_ANDROID + +endif # is-board-platform-in-list + +.PHONY: aboot +aboot: $(INSTALLED_BOOTLOADER_MODULE) + +.PHONY: kernel +kernel: $(INSTALLED_BOOTIMAGE_TARGET) $(INSTALLED_SEC_BOOTIMAGE_TARGET) $(INSTALLED_4K_BOOTIMAGE_TARGET) + +.PHONY: recoveryimage +recoveryimage: $(INSTALLED_RECOVERYIMAGE_TARGET) $(INSTALLED_SEC_RECOVERYIMAGE_TARGET) $(INSTALLED_4K_RECOVERYIMAGE_TARGET) + +.PHONY: persistimage +persistimage: $(INSTALLED_PERSISTIMAGE_TARGET) $(INSTALLED_4K_PERSISTIMAGE_TARGET) diff --git a/core/host_java_library.mk b/core/host_java_library.mk index 7e0e4372ec6..be4517076a2 100644 --- a/core/host_java_library.mk +++ b/core/host_java_library.mk @@ -59,7 +59,7 @@ $(full_classes_emma_jar) : $(full_classes_compiled_jar) | $(EMMA_JAR) $(transform-classes.jar-to-emma) $(LOCAL_BUILT_MODULE) : $(full_classes_emma_jar) - @echo Copying: $@ + @echo -e ${CL_YLW}"Copying:"${CL_RST}" $@" $(hide) $(ACP) -fp $< $@ else # LOCAL_EMMA_INSTRUMENT @@ -68,7 +68,6 @@ full_classes_compiled_jar := $(LOCAL_BUILT_MODULE) endif # LOCAL_EMMA_INSTRUMENT $(full_classes_compiled_jar): PRIVATE_JAVAC_DEBUG_FLAGS := -g - # The layers file allows you to enforce a layering between java packages. # Run build/tools/java-layers.py for more details. layers_file := $(addprefix $(LOCAL_PATH)/, $(LOCAL_JAVA_LAYERS_FILE)) diff --git a/core/java.mk b/core/java.mk deleted file mode 100644 index a969254677a..00000000000 --- a/core/java.mk +++ /dev/null @@ -1,521 +0,0 @@ -# Requires: -# LOCAL_MODULE_SUFFIX -# LOCAL_MODULE_CLASS -# all_res_assets - -ifeq ($(TARGET_BUILD_PDK),true) -ifeq ($(TARGET_BUILD_PDK_JAVA_PLATFORM),) -# LOCAL_SDK not defined or set to current -ifeq ($(filter-out current,$(LOCAL_SDK_VERSION)),) -LOCAL_SDK_VERSION := $(PDK_BUILD_SDK_VERSION) -endif -endif # !PDK_JAVA -endif #PDK - -LOCAL_NO_STANDARD_LIBRARIES:=$(strip $(LOCAL_NO_STANDARD_LIBRARIES)) -LOCAL_SDK_VERSION:=$(strip $(LOCAL_SDK_VERSION)) - -ifneq ($(LOCAL_SDK_VERSION),) - ifeq ($(LOCAL_NO_STANDARD_LIBRARIES),true) - $(error $(LOCAL_PATH): Must not define both LOCAL_NO_STANDARD_LIBRARIES and LOCAL_SDK_VERSION) - else - ifeq ($(strip $(filter $(LOCAL_SDK_VERSION),$(TARGET_AVAILABLE_SDK_VERSIONS))),) - $(error $(LOCAL_PATH): Invalid LOCAL_SDK_VERSION '$(LOCAL_SDK_VERSION)' \ - Choices are: $(TARGET_AVAILABLE_SDK_VERSIONS)) - else - ifeq ($(LOCAL_SDK_VERSION)$(TARGET_BUILD_APPS),current) - # Use android_stubs_current if LOCAL_SDK_VERSION is current and no TARGET_BUILD_APPS. - LOCAL_JAVA_LIBRARIES := android_stubs_current $(LOCAL_JAVA_LIBRARIES) - else ifeq ($(LOCAL_SDK_VERSION)$(TARGET_BUILD_APPS),system_current) - LOCAL_JAVA_LIBRARIES := android_system_stubs_current $(LOCAL_JAVA_LIBRARIES) - else - LOCAL_JAVA_LIBRARIES := sdk_v$(LOCAL_SDK_VERSION) $(LOCAL_JAVA_LIBRARIES) - endif - endif - endif -else - ifneq ($(LOCAL_NO_STANDARD_LIBRARIES),true) - LOCAL_JAVA_LIBRARIES := $(TARGET_DEFAULT_JAVA_LIBRARIES) $(LOCAL_JAVA_LIBRARIES) - endif -endif - -proto_sources := $(filter %.proto,$(LOCAL_SRC_FILES)) -ifneq ($(proto_sources),) -ifeq ($(LOCAL_PROTOC_OPTIMIZE_TYPE),micro) - LOCAL_STATIC_JAVA_LIBRARIES += libprotobuf-java-2.3.0-micro -else - ifeq ($(LOCAL_PROTOC_OPTIMIZE_TYPE),nano) - LOCAL_STATIC_JAVA_LIBRARIES += libprotobuf-java-2.3.0-nano - else - LOCAL_STATIC_JAVA_LIBRARIES += libprotobuf-java-2.3.0-lite - endif -endif -endif - -# LOCAL_STATIC_JAVA_AAR_LIBRARIES are special LOCAL_STATIC_JAVA_LIBRARIES -LOCAL_STATIC_JAVA_LIBRARIES := $(strip $(LOCAL_STATIC_JAVA_LIBRARIES) $(LOCAL_STATIC_JAVA_AAR_LIBRARIES)) - -LOCAL_JAVA_LIBRARIES := $(sort $(LOCAL_JAVA_LIBRARIES)) - -LOCAL_BUILT_MODULE_STEM := $(strip $(LOCAL_BUILT_MODULE_STEM)) -ifeq ($(LOCAL_BUILT_MODULE_STEM),) -$(error $(LOCAL_PATH): Target java template must define LOCAL_BUILT_MODULE_STEM) -endif -ifneq ($(filter classes-compiled.jar classes.jar,$(LOCAL_BUILT_MODULE_STEM)),) -$(error LOCAL_BUILT_MODULE_STEM may not be "$(LOCAL_BUILT_MODULE_STEM)") -endif - - -############################################################################## -# Define the intermediate targets before including base_rules so they get -# the correct environment. -############################################################################## - -intermediates := $(call local-intermediates-dir) -intermediates.COMMON := $(call local-intermediates-dir,COMMON) - -# Choose leaf name for the compiled jar file. -ifeq ($(LOCAL_EMMA_INSTRUMENT),true) -full_classes_compiled_jar_leaf := classes-no-debug-var.jar -built_dex_intermediate_leaf := no-local -else -full_classes_compiled_jar_leaf := classes-full-debug.jar -built_dex_intermediate_leaf := with-local -endif - -ifeq ($(LOCAL_PROGUARD_ENABLED),disabled) -LOCAL_PROGUARD_ENABLED := -endif - -ifdef LOCAL_PROGUARD_ENABLED -proguard_jar_leaf := proguard.classes.jar -else -proguard_jar_leaf := noproguard.classes.jar -endif - -full_classes_compiled_jar := $(intermediates.COMMON)/$(full_classes_compiled_jar_leaf) -jarjar_leaf := classes-jarjar.jar -full_classes_jarjar_jar := $(intermediates.COMMON)/$(jarjar_leaf) -emma_intermediates_dir := $(intermediates.COMMON)/emma_out -# emma is hardcoded to use the leaf name of its input for the output file -- -# only the output directory can be changed -full_classes_emma_jar := $(emma_intermediates_dir)/lib/$(jarjar_leaf) -full_classes_proguard_jar := $(intermediates.COMMON)/$(proguard_jar_leaf) -built_dex_intermediate := $(intermediates.COMMON)/$(built_dex_intermediate_leaf)/classes.dex -full_classes_stubs_jar := $(intermediates.COMMON)/stubs.jar - -ifeq ($(LOCAL_MODULE_CLASS)$(LOCAL_SRC_FILES)$(LOCAL_STATIC_JAVA_LIBRARIES)$(LOCAL_SOURCE_FILES_ALL_GENERATED),APPS) -# If this is an apk without any Java code (e.g. framework-res), we should skip compiling Java. -full_classes_jar := -built_dex := -else -full_classes_jar := $(intermediates.COMMON)/classes.jar -built_dex := $(intermediates.COMMON)/classes.dex -endif - -LOCAL_INTERMEDIATE_TARGETS += \ - $(full_classes_compiled_jar) \ - $(full_classes_jarjar_jar) \ - $(full_classes_emma_jar) \ - $(full_classes_jar) \ - $(full_classes_proguard_jar) \ - $(built_dex_intermediate) \ - $(built_dex) \ - $(full_classes_stubs_jar) - - -LOCAL_INTERMEDIATE_SOURCE_DIR := $(intermediates.COMMON)/src - -############################################################### -## .rs files: RenderScript sources to .java files and .bc files -## .fs files: Filterscript sources to .java files and .bc files -############################################################### -renderscript_sources := $(filter %.rs %.fs,$(LOCAL_SRC_FILES)) -# Because names of the java files from RenderScript are unknown until the -# .rs file(s) are compiled, we have to depend on a timestamp file. -RenderScript_file_stamp := -rs_compatibility_jni_libs := -ifneq ($(renderscript_sources),) -renderscript_sources_fullpath := $(addprefix $(LOCAL_PATH)/, $(renderscript_sources)) -RenderScript_file_stamp := $(LOCAL_INTERMEDIATE_SOURCE_DIR)/RenderScript.stamp -renderscript_intermediate.COMMON := $(LOCAL_INTERMEDIATE_SOURCE_DIR)/renderscript - -renderscript_target_api := - -ifneq (,$(LOCAL_RENDERSCRIPT_TARGET_API)) -renderscript_target_api := $(LOCAL_RENDERSCRIPT_TARGET_API) -else -ifneq (,$(LOCAL_SDK_VERSION)) -# Set target-api for LOCAL_SDK_VERSIONs other than current. -ifneq (,$(filter-out current system_current, $(LOCAL_SDK_VERSION))) -renderscript_target_api := $(LOCAL_SDK_VERSION) -endif -endif # LOCAL_SDK_VERSION is set -endif # LOCAL_RENDERSCRIPT_TARGET_API is set - -ifeq ($(LOCAL_RENDERSCRIPT_CC),) -LOCAL_RENDERSCRIPT_CC := $(LLVM_RS_CC) -endif - -# Turn on all warnings and warnings as errors for RS compiles. -# This can be disabled with LOCAL_RENDERSCRIPT_FLAGS := -Wno-error -renderscript_flags := -Wall -Werror -renderscript_flags += $(LOCAL_RENDERSCRIPT_FLAGS) - -# prepend the RenderScript system include path -ifneq ($(filter-out current system_current,$(LOCAL_SDK_VERSION))$(if $(TARGET_BUILD_APPS),$(filter current system_current,$(LOCAL_SDK_VERSION))),) -# if a numeric LOCAL_SDK_VERSION, or current LOCAL_SDK_VERSION with TARGET_BUILD_APPS -LOCAL_RENDERSCRIPT_INCLUDES := \ - $(HISTORICAL_SDK_VERSIONS_ROOT)/renderscript/clang-include \ - $(HISTORICAL_SDK_VERSIONS_ROOT)/renderscript/include \ - $(LOCAL_RENDERSCRIPT_INCLUDES) -else -LOCAL_RENDERSCRIPT_INCLUDES := \ - $(TOPDIR)external/clang/lib/Headers \ - $(TOPDIR)frameworks/rs/scriptc \ - $(LOCAL_RENDERSCRIPT_INCLUDES) -endif - -ifneq ($(LOCAL_RENDERSCRIPT_INCLUDES_OVERRIDE),) -LOCAL_RENDERSCRIPT_INCLUDES := $(LOCAL_RENDERSCRIPT_INCLUDES_OVERRIDE) -endif - -$(RenderScript_file_stamp): PRIVATE_RS_INCLUDES := $(LOCAL_RENDERSCRIPT_INCLUDES) -$(RenderScript_file_stamp): PRIVATE_RS_CC := $(LOCAL_RENDERSCRIPT_CC) -$(RenderScript_file_stamp): PRIVATE_RS_FLAGS := $(renderscript_flags) -$(RenderScript_file_stamp): PRIVATE_RS_SOURCE_FILES := $(renderscript_sources_fullpath) -# By putting the generated java files into $(LOCAL_INTERMEDIATE_SOURCE_DIR), they will be -# automatically found by the java compiling function transform-java-to-classes.jar. -$(RenderScript_file_stamp): PRIVATE_RS_OUTPUT_DIR := $(renderscript_intermediate.COMMON) -$(RenderScript_file_stamp): PRIVATE_RS_TARGET_API := $(renderscript_target_api) -$(RenderScript_file_stamp): $(renderscript_sources_fullpath) $(LOCAL_RENDERSCRIPT_CC) - $(transform-renderscripts-to-java-and-bc) - -ifneq ($(LOCAL_RENDERSCRIPT_COMPATIBILITY),) -bc_files := $(patsubst %.fs,%.bc, $(patsubst %.rs,%.bc, $(notdir $(renderscript_sources)))) -rs_generated_bc := $(addprefix \ - $(renderscript_intermediate.COMMON)/res/raw/, $(bc_files)) - -renderscript_intermediate := $(intermediates)/renderscript - -# We don't need the .so files in bundled branches -# Prevent these from showing up on the device -ifneq (,$(TARGET_BUILD_APPS)$(FORCE_BUILD_RS_COMPAT)) - -rs_compatibility_jni_libs := $(addprefix \ - $(renderscript_intermediate)/librs., \ - $(patsubst %.bc,%.so, $(bc_files))) - -$(rs_generated_bc) : $(RenderScript_file_stamp) - -rs_support_lib := $(TARGET_OUT_INTERMEDIATE_LIBRARIES)/libRSSupport.so -rs_jni_lib := $(TARGET_OUT_INTERMEDIATE_LIBRARIES)/librsjni.so -LOCAL_JNI_SHARED_LIBRARIES += libRSSupport librsjni - - - -$(rs_compatibility_jni_libs): $(RenderScript_file_stamp) $(RS_PREBUILT_CLCORE) \ - $(rs_support_lib) $(rs_jni_lib) $(rs_compiler_rt) -$(rs_compatibility_jni_libs): $(BCC_COMPAT) -$(rs_compatibility_jni_libs): PRIVATE_CXX := $(TARGET_CXX) -$(rs_compatibility_jni_libs): $(renderscript_intermediate)/librs.%.so: \ - $(renderscript_intermediate.COMMON)/res/raw/%.bc - $(transform-bc-to-so) - -endif - -endif - -# include the dependency files (.d) generated by llvm-rs-cc. -renderscript_generated_dep_files := $(addprefix $(renderscript_intermediate.COMMON)/, \ - $(patsubst %.fs,%.d, $(patsubst %.rs,%.d, $(notdir $(renderscript_sources))))) --include $(renderscript_generated_dep_files) - -LOCAL_INTERMEDIATE_TARGETS += $(RenderScript_file_stamp) -# Make sure the generated resource will be added to the apk. -LOCAL_RESOURCE_DIR := $(LOCAL_INTERMEDIATE_SOURCE_DIR)/renderscript/res $(LOCAL_RESOURCE_DIR) -endif - -# All of the rules after full_classes_compiled_jar are very unlikely -# to fail except for bugs in their respective tools. If you would -# like to run these rules, add the "all" modifier goal to the make -# command line. -ifdef full_classes_jar -java_alternative_checked_module := $(full_classes_compiled_jar) -else -java_alternative_checked_module := -endif - -# TODO: It looks like the only thing we need from base_rules is -# all_java_sources. See if we can get that by adding a -# common_java.mk, and moving the include of base_rules.mk to -# after all the declarations. - -####################################### -include $(BUILD_SYSTEM)/base_rules.mk -####################################### - -java_alternative_checked_module := - -####################################### -# defines built_odex along with rule to install odex -include $(BUILD_SYSTEM)/dex_preopt_odex_install.mk -####################################### - -# Make sure there's something to build. -ifdef full_classes_jar -ifndef need_compile_java -$(error $(LOCAL_PATH): Target java module does not define any source or resource files) -endif -endif - -# Install the RS compatibility libraries to /system/lib/ if necessary -ifdef rs_compatibility_jni_libs -installed_rs_compatibility_jni_libs := $(addprefix $(TARGET_OUT_SHARED_LIBRARIES)/,\ - $(notdir $(rs_compatibility_jni_libs))) -# Provide a way to skip sources included in multiple projects. -ifdef LOCAL_RENDERSCRIPT_SKIP_INSTALL -skip_install_rs_libs := $(patsubst %.rs,%.so, \ - $(addprefix $(TARGET_OUT_SHARED_LIBRARIES)/librs., \ - $(notdir $(LOCAL_RENDERSCRIPT_SKIP_INSTALL)))) -installed_rs_compatibility_jni_libs := \ - $(filter-out $(skip_install_rs_libs),$(installed_rs_compatibility_jni_libs)) -endif -ifneq (,$(strip $(installed_rs_compatibility_jni_libs))) -$(installed_rs_compatibility_jni_libs) : $(TARGET_OUT_SHARED_LIBRARIES)/lib%.so : \ - $(renderscript_intermediate)/lib%.so - $(hide) mkdir -p $(dir $@) && cp -f $< $@ - -# Install them only if the current module is installed. -$(LOCAL_INSTALLED_MODULE) : $(installed_rs_compatibility_jni_libs) -endif -endif - -# We use intermediates.COMMON because the classes.jar/.dex files will be -# common even if LOCAL_BUILT_MODULE isn't. -# -# Override some target variables that base_rules set up for us. -$(LOCAL_INTERMEDIATE_TARGETS): \ - PRIVATE_CLASS_INTERMEDIATES_DIR := $(intermediates.COMMON)/classes -$(LOCAL_INTERMEDIATE_TARGETS): \ - PRIVATE_SOURCE_INTERMEDIATES_DIR := $(LOCAL_INTERMEDIATE_SOURCE_DIR) - -# Since we're using intermediates.COMMON, make sure that it gets cleaned -# properly. -$(cleantarget): PRIVATE_CLEAN_FILES += $(intermediates.COMMON) - -ifdef full_classes_jar - -# Droiddoc isn't currently able to generate stubs for modules, so we're just -# allowing it to use the classes.jar as the "stubs" that would be use to link -# against, for the cases where someone needs the jar to link against. -# - Use the classes.jar instead of the handful of other intermediates that -# we have, because it's the most processed, but still hasn't had dex run on -# it, so it's closest to what's on the device. -# - This extra copy, with the dependency on LOCAL_BUILT_MODULE allows the -# PRIVATE_ vars to be preserved. -$(full_classes_stubs_jar): PRIVATE_SOURCE_FILE := $(full_classes_jar) -$(full_classes_stubs_jar) : $(LOCAL_BUILT_MODULE) | $(ACP) - @echo Copying $(PRIVATE_SOURCE_FILE) - $(hide) $(ACP) -fp $(PRIVATE_SOURCE_FILE) $@ -ALL_MODULES.$(LOCAL_MODULE).STUBS := $(full_classes_stubs_jar) - -# The layers file allows you to enforce a layering between java packages. -# Run build/tools/java-layers.py for more details. -layers_file := $(addprefix $(LOCAL_PATH)/, $(LOCAL_JAVA_LAYERS_FILE)) -$(full_classes_compiled_jar): PRIVATE_JAVA_LAYERS_FILE := $(layers_file) -$(full_classes_compiled_jar): PRIVATE_WARNINGS_ENABLE := $(LOCAL_WARNINGS_ENABLE) - -ifdef LOCAL_RMTYPEDEFS -$(full_classes_compiled_jar): | $(RMTYPEDEFS) -endif - -# Compile the java files to a .jar file. -# This intentionally depends on java_sources, not all_java_sources. -# Deps for generated source files must be handled separately, -# via deps on the target that generates the sources. -$(full_classes_compiled_jar): PRIVATE_JAVACFLAGS := $(LOCAL_JAVACFLAGS) -$(full_classes_compiled_jar): PRIVATE_JAR_EXCLUDE_FILES := $(LOCAL_JAR_EXCLUDE_FILES) -$(full_classes_compiled_jar): PRIVATE_JAR_PACKAGES := $(LOCAL_JAR_PACKAGES) -$(full_classes_compiled_jar): PRIVATE_JAR_EXCLUDE_PACKAGES := $(LOCAL_JAR_EXCLUDE_PACKAGES) -$(full_classes_compiled_jar): PRIVATE_RMTYPEDEFS := $(LOCAL_RMTYPEDEFS) -$(full_classes_compiled_jar): PRIVATE_DONT_DELETE_JAR_META_INF := $(LOCAL_DONT_DELETE_JAR_META_INF) -$(full_classes_compiled_jar): $(java_sources) $(java_resource_sources) $(full_java_lib_deps) \ - $(jar_manifest_file) $(layers_file) $(RenderScript_file_stamp) \ - $(proto_java_sources_file_stamp) $(LOCAL_ADDITIONAL_DEPENDENCIES) - $(transform-java-to-classes.jar) - -$(full_classes_compiled_jar): PRIVATE_JAVAC_DEBUG_FLAGS := -g - -# Run jarjar if necessary, otherwise just copy the file. -ifneq ($(strip $(LOCAL_JARJAR_RULES)),) -$(full_classes_jarjar_jar): PRIVATE_JARJAR_RULES := $(LOCAL_JARJAR_RULES) -$(full_classes_jarjar_jar): $(full_classes_compiled_jar) $(LOCAL_JARJAR_RULES) | $(JARJAR) - @echo JarJar: $@ - $(hide) java -jar $(JARJAR) process $(PRIVATE_JARJAR_RULES) $< $@ -else -$(full_classes_jarjar_jar): $(full_classes_compiled_jar) | $(ACP) - @echo Copying: $@ - $(hide) $(ACP) -fp $< $@ -endif - -ifeq ($(LOCAL_EMMA_INSTRUMENT),true) -$(full_classes_emma_jar): PRIVATE_EMMA_COVERAGE_FILE := $(intermediates.COMMON)/coverage.em -$(full_classes_emma_jar): PRIVATE_EMMA_INTERMEDIATES_DIR := $(emma_intermediates_dir) -# module level coverage filter can be defined using LOCAL_EMMA_COVERAGE_FILTER -# in Android.mk -ifdef LOCAL_EMMA_COVERAGE_FILTER -$(full_classes_emma_jar): PRIVATE_EMMA_COVERAGE_FILTER := $(LOCAL_EMMA_COVERAGE_FILTER) -else -# by default, avoid applying emma instrumentation onto emma classes itself, -# otherwise there will be exceptions thrown -$(full_classes_emma_jar): PRIVATE_EMMA_COVERAGE_FILTER := *,-emma,-emmarun,-com.vladium.* -endif -# this rule will generate both $(PRIVATE_EMMA_COVERAGE_FILE) and -# $(full_classes_emma_jar) -$(full_classes_emma_jar): $(full_classes_jarjar_jar) | $(EMMA_JAR) - $(transform-classes.jar-to-emma) - -else -$(full_classes_emma_jar): $(full_classes_jarjar_jar) | $(ACP) - @echo Copying: $@ - $(copy-file-to-target) -endif - -# Keep a copy of the jar just before proguard processing. -$(full_classes_jar): $(full_classes_emma_jar) | $(ACP) - @echo Copying: $@ - $(hide) $(ACP) -fp $< $@ - -# Run proguard if necessary, otherwise just copy the file. -ifdef LOCAL_PROGUARD_ENABLED -ifneq ($(filter-out full custom nosystem obfuscation optimization shrinktests,$(LOCAL_PROGUARD_ENABLED)),) - $(warning while processing: $(LOCAL_MODULE)) - $(error invalid value for LOCAL_PROGUARD_ENABLED: $(LOCAL_PROGUARD_ENABLED)) -endif -proguard_dictionary := $(intermediates.COMMON)/proguard_dictionary -proguard_flags := $(addprefix -libraryjars ,$(full_shared_java_libs)) \ - -forceprocessing \ - -printmapping $(proguard_dictionary) - -ifeq ($(filter nosystem,$(LOCAL_PROGUARD_ENABLED)),) -proguard_flags += -include $(BUILD_SYSTEM)/proguard.flags -ifeq ($(LOCAL_EMMA_INSTRUMENT),true) -proguard_flags += -include $(BUILD_SYSTEM)/proguard.emma.flags -endif -# If this is a test package, add proguard keep flags for tests. -ifneq ($(LOCAL_INSTRUMENTATION_FOR)$(filter tests,$(LOCAL_MODULE_TAGS)),) -proguard_flags += -include $(BUILD_SYSTEM)/proguard_tests.flags -ifeq ($(filter shrinktests,$(LOCAL_PROGUARD_ENABLED)),) -proguard_flags += -dontshrink # don't shrink tests by default -endif # shrinktests -endif # test package -ifeq ($(filter obfuscation,$(LOCAL_PROGUARD_ENABLED)),) -# By default no obfuscation -proguard_flags += -dontobfuscate -endif # No obfuscation -ifeq ($(filter optimization,$(LOCAL_PROGUARD_ENABLED)),) -# By default no optimization -proguard_flags += -dontoptimize -endif # No optimization - -ifdef LOCAL_INSTRUMENTATION_FOR -ifeq ($(filter obfuscation,$(LOCAL_PROGUARD_ENABLED)),) -# If no obfuscation, link in the instrmented package's classes.jar as a library. -# link_instr_classes_jar is defined in base_rule.mk -proguard_flags += -libraryjars $(link_instr_classes_jar) -else # obfuscation -# If obfuscation is enabled, the main app must be obfuscated too. -# We need to run obfuscation using the main app's dictionary, -# and treat the main app's class.jar as injars instead of libraryjars. -proguard_flags := -injars $(link_instr_classes_jar) \ - -outjars $(intermediates.COMMON)/proguard.$(LOCAL_INSTRUMENTATION_FOR).jar \ - -include $(link_instr_intermediates_dir.COMMON)/proguard_options \ - -applymapping $(link_instr_intermediates_dir.COMMON)/proguard_dictionary \ - -verbose \ - $(proguard_flags) - -# Sometimes (test + main app) uses different keep rules from the main app - -# apply the main app's dictionary anyway. -proguard_flags += -ignorewarnings - -# Make sure we run Proguard on the main app first -$(full_classes_proguard_jar) : $(link_instr_intermediates_dir.COMMON)/proguard.classes.jar - -endif # no obfuscation -endif # LOCAL_INSTRUMENTATION_FOR -endif # LOCAL_PROGUARD_ENABLED is not nosystem - -proguard_flag_files := $(addprefix $(LOCAL_PATH)/, $(LOCAL_PROGUARD_FLAG_FILES)) -LOCAL_PROGUARD_FLAGS += $(addprefix -include , $(proguard_flag_files)) - -ifdef LOCAL_TEST_MODULE_TO_PROGUARD_WITH -extra_input_jar := $(call intermediates-dir-for,APPS,$(LOCAL_TEST_MODULE_TO_PROGUARD_WITH),,COMMON)/classes.jar -else -extra_input_jar := -endif -$(full_classes_proguard_jar): PRIVATE_EXTRA_INPUT_JAR := $(extra_input_jar) -$(full_classes_proguard_jar): PRIVATE_PROGUARD_FLAGS := $(proguard_flags) $(LOCAL_PROGUARD_FLAGS) -$(full_classes_proguard_jar) : $(full_classes_jar) $(extra_input_jar) $(proguard_flag_files) | $(ACP) $(PROGUARD) - $(call transform-jar-to-proguard) - -else # LOCAL_PROGUARD_ENABLED not defined -$(full_classes_proguard_jar) : $(full_classes_jar) - @echo Copying: $@ - $(hide) $(ACP) -fp $< $@ - -endif # LOCAL_PROGUARD_ENABLED defined - - -# Override PRIVATE_INTERMEDIATES_DIR so that install-dex-debug -# will work even when intermediates != intermediates.COMMON. -$(built_dex_intermediate): PRIVATE_INTERMEDIATES_DIR := $(intermediates.COMMON) -$(built_dex_intermediate): PRIVATE_DX_FLAGS := $(LOCAL_DX_FLAGS) -# If you instrument class files that have local variable debug information in -# them emma does not correctly maintain the local variable table. -# This will cause an error when you try to convert the class files for Android. -# The workaround here is to build different dex file here based on emma switch -# then later copy into classes.dex. When emma is on, dx is run with --no-locals -# option to remove local variable information -ifeq ($(LOCAL_EMMA_INSTRUMENT),true) -$(built_dex_intermediate): PRIVATE_DX_FLAGS += --no-locals -endif -$(built_dex_intermediate): $(full_classes_proguard_jar) $(DX) - $(transform-classes.jar-to-dex) -$(built_dex): $(built_dex_intermediate) | $(ACP) - @echo Copying: $@ - $(hide) mkdir -p $(dir $@) - $(hide) rm -f $(dir $@)/classes*.dex - $(hide) $(ACP) -fp $(dir $<)/classes*.dex $(dir $@) -ifneq ($(GENERATE_DEX_DEBUG),) - $(install-dex-debug) -endif - -findbugs_xml := $(intermediates.COMMON)/findbugs.xml -$(findbugs_xml) : PRIVATE_JAR_FILE := $(full_classes_jar) -$(findbugs_xml) : PRIVATE_AUXCLASSPATH := $(addprefix -auxclasspath ,$(strip \ - $(call normalize-path-list,$(filter %.jar,\ - $(full_java_libs))))) -# We can't depend directly on full_classes_jar because the PRIVATE_ -# vars won't be set up correctly. -$(findbugs_xml) : $(LOCAL_BUILT_MODULE) - @echo Findbugs: $@ - $(hide) $(FINDBUGS) -textui -effort:min -xml:withMessages \ - $(PRIVATE_AUXCLASSPATH) \ - $(PRIVATE_JAR_FILE) \ - > $@ - -ALL_FINDBUGS_FILES += $(findbugs_xml) - -findbugs_html := $(PRODUCT_OUT)/findbugs/$(LOCAL_MODULE).html -$(findbugs_html) : PRIVATE_XML_FILE := $(findbugs_xml) -$(LOCAL_MODULE)-findbugs : $(findbugs_html) -$(findbugs_html) : $(findbugs_xml) - @mkdir -p $(dir $@) - @echo ConvertXmlToText: $@ - $(hide) $(FINDBUGS_DIR)/convertXmlToText -html:fancy.xsl $(PRIVATE_XML_FILE) \ - > $@ - -$(LOCAL_MODULE)-findbugs : $(findbugs_html) - -endif # full_classes_jar is defined diff --git a/core/java_library.mk b/core/java_library.mk index dffc7d90aad..e69de29bb2d 100644 --- a/core/java_library.mk +++ b/core/java_library.mk @@ -1,114 +0,0 @@ -########################################################### -## Standard rules for building a java library. -## -########################################################### - -ifdef LOCAL_IS_HOST_MODULE -$(error $(LOCAL_PATH): Host java libraries must use BUILD_HOST_JAVA_LIBRARY) -endif - -LOCAL_MODULE_SUFFIX := $(COMMON_JAVA_PACKAGE_SUFFIX) -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -ifneq (,$(LOCAL_ASSET_DIR)) -$(error $(LOCAL_PATH): Target java libraries may not set LOCAL_ASSET_DIR) -endif - -ifneq (true,$(LOCAL_IS_STATIC_JAVA_LIBRARY)) -ifneq (,$(LOCAL_RESOURCE_DIR)) -$(error $(LOCAL_PATH): Target java libraries may not set LOCAL_RESOURCE_DIR) -endif -# base_rules.mk looks at this -all_res_assets := -endif - -LOCAL_BUILT_MODULE_STEM := javalib.jar - -intermediates.COMMON := $(call local-intermediates-dir,COMMON) - -# This file will be the one that other modules should depend on. -common_javalib.jar := $(intermediates.COMMON)/$(LOCAL_BUILT_MODULE_STEM) -LOCAL_INTERMEDIATE_TARGETS += $(common_javalib.jar) - -ifeq ($(LOCAL_PROGUARD_ENABLED),disabled) - LOCAL_PROGUARD_ENABLED := -endif - -ifeq (true,$(EMMA_INSTRUMENT)) -ifeq (true,$(LOCAL_EMMA_INSTRUMENT)) -ifeq (true,$(EMMA_INSTRUMENT_STATIC)) -LOCAL_STATIC_JAVA_LIBRARIES += emma -endif # LOCAL_EMMA_INSTRUMENT -endif # EMMA_INSTRUMENT_STATIC -else -LOCAL_EMMA_INSTRUMENT := false -endif # EMMA_INSTRUMENT - -################################# -include $(BUILD_SYSTEM)/java.mk -################################# - -ifeq ($(LOCAL_IS_STATIC_JAVA_LIBRARY),true) -# No dex; all we want are the .class files with resources. -$(common_javalib.jar) : $(java_resource_sources) -ifdef LOCAL_PROGUARD_ENABLED -$(common_javalib.jar) : $(full_classes_proguard_jar) -else -$(common_javalib.jar) : $(full_classes_jar) -endif - @echo "target Static Jar: $(PRIVATE_MODULE) ($@)" - $(copy-file-to-target) -ifneq ($(extra_jar_args),) - $(add-java-resources-to-package) -endif - -$(LOCAL_BUILT_MODULE): $(common_javalib.jar) - $(copy-file-to-target) - -else # !LOCAL_IS_STATIC_JAVA_LIBRARY - -$(common_javalib.jar): PRIVATE_DEX_FILE := $(built_dex) -$(common_javalib.jar) : $(built_dex) $(java_resource_sources) - @echo "target Jar: $(PRIVATE_MODULE) ($@)" - $(create-empty-package) - $(add-dex-to-package) - $(add-carried-java-resources) -ifneq ($(extra_jar_args),) - $(add-java-resources-to-package) -endif - -ifdef LOCAL_DEX_PREOPT -ifneq ($(dexpreopt_boot_jar_module),) # boot jar -# boot jar's rules are defined in dex_preopt.mk -dexpreopted_boot_jar := $(DEXPREOPT_BOOT_JAR_DIR_FULL_PATH)/$(dexpreopt_boot_jar_module)_nodex.jar -$(LOCAL_BUILT_MODULE) : $(dexpreopted_boot_jar) | $(ACP) - $(call copy-file-to-target) - -# For libart boot jars, we don't have .odex files. -ifeq ($(DALVIK_VM_LIB),libdvm.so) -dexpreopted_boot_odex := $(DEXPREOPT_BOOT_JAR_DIR_FULL_PATH)/$(dexpreopt_boot_jar_module).odex -$(built_odex) : $(dexpreopted_boot_odex) | $(ACP) - $(call copy-file-to-target) -endif - -else # ! boot jar -$(built_odex): PRIVATE_MODULE := $(LOCAL_MODULE) -# Use pattern rule - we may have multiple built odex files. -$(built_odex) : $(dir $(LOCAL_BUILT_MODULE))% : $(common_javalib.jar) - @echo "Dexpreopt Jar: $(PRIVATE_MODULE) ($@)" - $(call dexpreopt-one-file,$<,$@) - -$(LOCAL_BUILT_MODULE) : $(common_javalib.jar) | $(ACP) - $(call copy-file-to-target) -ifneq (nostripping,$(LOCAL_DEX_PREOPT)) - $(call dexpreopt-remove-classes.dex,$@) -endif - -endif # ! boot jar - -else # LOCAL_DEX_PREOPT -$(LOCAL_BUILT_MODULE) : $(common_javalib.jar) | $(ACP) - $(call copy-file-to-target) - -endif # LOCAL_DEX_PREOPT -endif # !LOCAL_IS_STATIC_JAVA_LIBRARY diff --git a/core/main.mk b/core/main.mk index 9d6e233d4c0..d706881cb5e 100644 --- a/core/main.mk +++ b/core/main.mk @@ -78,6 +78,9 @@ dont_bother_goals := clean clobber dataclean installclean \ userdataimage-nodeps userdatatarball-nodeps \ cacheimage-nodeps \ vendorimage-nodeps \ + ubunturootfsimage-nodeps \ + ubuntucustomimage-nodeps \ + devicepackage \ ramdisk-nodeps \ bootimage-nodeps @@ -98,10 +101,17 @@ include $(BUILD_SYSTEM)/config.mk # be generated correctly include $(BUILD_SYSTEM)/cleanbuild.mk +# Bring in Qualcomm helper macros +include $(BUILD_SYSTEM)/qcom_utils.mk + +# Bring in Mediatek helper macros too +include $(BUILD_SYSTEM)/mtk_utils.mk + # Include the google-specific config -include vendor/google/build/config.mk VERSION_CHECK_SEQUENCE_NUMBER := 5 + -include $(OUT_DIR)/versions_checked.mk ifneq ($(VERSION_CHECK_SEQUENCE_NUMBER),$(VERSIONS_CHECKED)) @@ -136,87 +146,87 @@ $(warning ************************************************************) $(error Directory names containing spaces not supported) endif -java_version_str := $(shell unset _JAVA_OPTIONS && java -version 2>&1) -javac_version_str := $(shell unset _JAVA_OPTIONS && javac -version 2>&1) +#java_version_str := $(shell unset _JAVA_OPTIONS JAVA_TOOL_OPTIONS && java -version 2>&1) +#javac_version_str := $(shell unset _JAVA_OPTIONS JAVA_TOOL_OPTIONS && javac -version 2>&1) # Check for the correct version of java, should be 1.7 by # default, and 1.6 if LEGACY_USE_JAVA6 is set. -ifeq ($(LEGACY_USE_JAVA6),) -required_version := "1.7.x" -required_javac_version := "1.7" -java_version := $(shell echo '$(java_version_str)' | grep '^java .*[ "]1\.7[\. "$$]') -javac_version := $(shell echo '$(javac_version_str)' | grep '[ "]1\.7[\. "$$]') -else # if LEGACY_USE_JAVA6 -required_version := "1.6.x" -required_javac_version := "1.6" -java_version := $(shell echo '$(java_version_str)' | grep '^java .*[ "]1\.6[\. "$$]') -javac_version := $(shell echo '$(javac_version_str)' | grep '[ "]1\.6[\. "$$]') -endif # if LEGACY_USE_JAVA6 - -ifeq ($(strip $(java_version)),) -$(info ************************************************************) -$(info You are attempting to build with the incorrect version) -$(info of java.) -$(info $(space)) -$(info Your version is: $(java_version_str).) -$(info The required version is: $(required_version)) -$(info $(space)) -$(info Please follow the machine setup instructions at) -$(info $(space)$(space)$(space)$(space)https://source.android.com/source/initializing.html) -$(info ************************************************************) -$(error stop) -endif +#ifeq ($(LEGACY_USE_JAVA6),) +#required_version := "1.7.x" +#required_javac_version := "1.7" +#java_version := $(shell echo '$(java_version_str)' | grep '^java .*[ "]1\.7[\. "$$]') +#javac_version := $(shell echo '$(javac_version_str)' | grep '[ "]1\.7[\. "$$]') +#else # if LEGACY_USE_JAVA6 +#required_version := "1.6.x" +#required_javac_version := "1.6" +#java_version := $(shell echo '$(java_version_str)' | grep '^java .*[ "]1\.6[\. "$$]') +#javac_version := $(shell echo '$(javac_version_str)' | grep '[ "]1\.6[\. "$$]') +#endif # if LEGACY_USE_JAVA6 + +#ifeq ($(strip $(java_version)),) +#$(info ************************************************************) +#$(info You are attempting to build with the incorrect version) +#$(info of java.) +#$(info $(space)) +#$(info Your version is: $(java_version_str).) +#$(info The required version is: $(required_version)) +#$(info $(space)) +#$(info Please follow the machine setup instructions at) +#$(info $(space)$(space)$(space)$(space)https://source.android.com/source/initializing.html) +#$(info ************************************************************) +#$(error stop) +#endif # Check for the current JDK. # # For Java 1.7, we require OpenJDK on linux and Oracle JDK on Mac OS. # For Java 1.6, we require Oracle for all host OSes. -requires_openjdk := false -ifeq ($(LEGACY_USE_JAVA6),) -ifeq ($(HOST_OS), linux) -requires_openjdk := true -endif -endif +#requires_openjdk := false +#ifeq ($(LEGACY_USE_JAVA6),) +#ifeq ($(HOST_OS), linux) +#requires_openjdk := true +#endif +#endif # Check for the current jdk -ifeq ($(requires_openjdk), true) +#ifeq ($(requires_openjdk), true) # The user asked for java7 openjdk, so check that the host # java version is really openjdk -ifeq ($(shell echo '$(java_version_str)' | grep -i openjdk),) -$(info ************************************************************) -$(info You asked for an OpenJDK 7 build but your version is) -$(info $(java_version_str).) -$(info ************************************************************) -$(error stop) -endif # java version is not OpenJdk -else # if requires_openjdk -ifneq ($(shell echo '$(java_version_str)' | grep -i openjdk),) -$(info ************************************************************) -$(info You are attempting to build with an unsupported JDK.) -$(info $(space)) -$(info You use OpenJDK but only Sun/Oracle JDK is supported.) -$(info Please follow the machine setup instructions at) -$(info $(space)$(space)$(space)$(space)https://source.android.com/source/download.html) -$(info ************************************************************) -$(error stop) -endif # java version is not Sun Oracle JDK -endif # if requires_openjdk +#ifeq ($(shell echo '$(java_version_str)' | grep -i openjdk),) +#$(info ************************************************************) +#$(info You asked for an OpenJDK 7 build but your version is) +#$(info $(java_version_str).) +#$(info ************************************************************) +#$(error stop) +#endif # java version is not OpenJdk +#else # if requires_openjdk +#ifneq ($(shell echo '$(java_version_str)' | grep -i openjdk),) +#$(info ************************************************************) +#$(info You are attempting to build with an unsupported JDK.) +#$(info $(space)) +#$(info You use OpenJDK but only Sun/Oracle JDK is supported.) +#$(info Please follow the machine setup instructions at) +#$(info $(space)$(space)$(space)$(space)https://source.android.com/source/download.html) +#$(info ************************************************************) +#$(error stop) +#endif # java version is not Sun Oracle JDK +#endif # if requires_openjdk # Check for the correct version of javac -ifeq ($(strip $(javac_version)),) -$(info ************************************************************) -$(info You are attempting to build with the incorrect version) -$(info of javac.) -$(info $(space)) -$(info Your version is: $(javac_version_str).) -$(info The required version is: $(required_javac_version)) -$(info $(space)) -$(info Please follow the machine setup instructions at) -$(info $(space)$(space)$(space)$(space)https://source.android.com/source/download.html) -$(info ************************************************************) -$(error stop) -endif +#ifeq ($(strip $(javac_version)),) +#$(info ************************************************************) +#$(info You are attempting to build with the incorrect version) +#$(info of javac.) +#$(info $(space)) +#$(info Your version is: $(javac_version_str).) +#$(info The required version is: $(required_javac_version)) +#$(info $(space)) +#$(info Please follow the machine setup instructions at) +#$(info $(space)$(space)$(space)$(space)https://source.android.com/source/download.html) +#$(info ************************************************************) +#$(error stop) +#endif ifndef BUILD_EMULATOR @@ -466,9 +476,169 @@ endif else # !SDK_ONLY # -# Typical build; include any Android.mk files we can find. +# Include select projects needed for Ubuntu Touch only # -subdirs := $(TOP) + +subdirs := \ + abi/cpp \ + bionic \ + bootable/recovery \ + build/libs \ + build/target \ + build/tools/acp \ + build/tools/check_prereq \ + build/tools/fs_config \ + build/tools/zipalign \ + development/tools/emulator/opengl \ + external/aac \ + external/audioflingerglue \ + external/busybox \ + external/bson \ + external/bzip2 \ + external/checkpolicy \ + external/compiler-rt \ + external/connectivity \ + external/curl \ + external/e2fsprogs \ + external/expat \ + external/exfat \ + external/flac \ + external/freetype \ + external/fsck_msdos \ + external/fuse \ + external/gcc-demangle \ + external/genext2fs \ + external/giflib \ + external/gtest \ + external/icu/icu4c \ + external/iproute2 \ + external/iptables \ + external/jemalloc \ + external/jhead \ + external/jpeg \ + external/jsmn \ + external/jsoncpp \ + external/libcxx \ + external/libcxxabi \ + external/liblzf \ + external/libnl \ + external/libgsm \ + external/libpng \ + external/libvpx \ + external/libogg \ + external/libopus \ + external/libselinux \ + external/libsepol \ + external/libunwind \ + external/libxml2 \ + external/lz4 \ + external/lzma \ + external/mdnsresponder \ + external/mksh \ + external/openssl \ + external/pcre \ + external/pigz \ + external/protobuf \ + external/qemu \ + external/scrypt \ + external/sepolicy \ + external/sfntly \ + external/skia \ + external/sonivox \ + external/speex \ + external/sqlite \ + external/stlport \ + external/libtar \ + external/tinycompress \ + external/tinyalsa \ + external/tremolo \ + external/webp \ + external/webrtc \ + external/wpa_supplicant_6 \ + external/wpa_supplicant_8 \ + external/yaffs2 \ + external/zlib \ + external/zopfli \ + frameworks/av/camera \ + frameworks/av/drm \ + frameworks/av/media/common_time \ + frameworks/av/media/libcpustats \ + frameworks/av/media/libaah_rtp \ + frameworks/av/media/libeffects \ + frameworks/av/media/libmedia \ + frameworks/av/media/libmedia_native \ + frameworks/av/media/libmediaplayerservice \ + frameworks/av/media/libnbaio \ + frameworks/av/media/libstagefright \ + frameworks/av/media/mediaserver \ + frameworks/av/services/audioflinger \ + frameworks/av/services/medialog \ + frameworks/av/services/camera/libcameraservice \ + frameworks/base/cmds/bootanimation \ + frameworks/base/cmds/screencap \ + frameworks/base/libs/androidfw \ + frameworks/base/libs/diskusage \ + frameworks/base/libs/input \ + frameworks/native/services/inputflinger \ + frameworks/base/tools/aapt \ + frameworks/native/cmds/installd \ + frameworks/native/cmds/sensorservice \ + frameworks/native/cmds/servicemanager \ + frameworks/native/cmds/surfaceflinger \ + frameworks/native/libs \ + frameworks/native/opengl \ + frameworks/native/services \ + frameworks/opt/emoji \ + hardware \ + prebuilts/tools/linux-x86/sdl \ + sdk/emulator \ + system/core \ + system/vold \ + system/bluetooth \ + system/extras/ext4_utils \ + system/extras/f2fs_utils \ + system/media/audio_utils \ + system/media/camera \ + system/media/audio_route \ + system/netd \ + system/qcom \ + system/su \ + system/security/keystore \ + system/security/softkeymaster + +ifeq ($(TARGET_DEVICE),generic_x86) +subdirs += \ + prebuilts/qemu-kernel/x86/pc-bios +endif + +# device and vendor +subdirs += \ + device/asus \ + device/fairphone \ + device/generic \ + device/lge \ + device/samsung \ + device/oneplus \ + device/qcom/common \ + vendor/oneplus/bacon \ + vendor/oppo/msm8974-common \ + vendor/asus \ + vendor/audience \ + vendor/broadcom \ + vendor/cm \ + vendor/elan \ + vendor/invensense \ + vendor/lge \ + vendor/nvidia \ + vendor/nxp \ + vendor/qcom \ + vendor/samsung \ + vendor/sony \ + vendor/widevine + +# Specific projects for Ubuntu Touch +subdirs += \ + ubuntu FULL_BUILD := true @@ -515,7 +685,7 @@ ifneq ($(dont_bother),true) subdir_makefiles := \ $(shell build/tools/findleaves.py --prune=$(OUT_DIR) --prune=.repo --prune=.git $(subdirs) Android.mk) -$(foreach mk, $(subdir_makefiles), $(info including $(mk) ...)$(eval include $(mk))) +$(foreach mk, $(subdir_makefiles), $(eval include $(mk))) endif # dont_bother @@ -718,15 +888,15 @@ else endif eng_MODULES := $(sort \ - $(call get-tagged-modules,eng) \ + $(call module-installed-files, $(call module-names-for-tag-list,eng)) \ $(call module-installed-files, $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_PACKAGES_ENG)) \ ) debug_MODULES := $(sort \ - $(call get-tagged-modules,debug) \ + $(call module-installed-files, $(call module-names-for-tag-list,debug)) \ $(call module-installed-files, $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_PACKAGES_DEBUG)) \ ) tests_MODULES := $(sort \ - $(call get-tagged-modules,tests) \ + $(call module-installed-files, $(call module-names-for-tag-list,tests)) \ $(call module-installed-files, $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_PACKAGES_TESTS)) \ ) @@ -876,6 +1046,15 @@ cacheimage: $(INSTALLED_CACHEIMAGE_TARGET) .PHONY: vendorimage vendorimage: $(INSTALLED_VENDORIMAGE_TARGET) +.PHONY: ubuntucustomimage +ubuntucustomimage: $(INSTALLED_UBUNTU_CUSTOM_IMAGE_TARGET) + +.PHONY: ubunturootfsimage +ubunturootfsimage: $(INSTALLED_UBUNTU_ROOTFS_IMAGE_TARGET) + +.PHONY: devicepackage +devicepackage: $(INSTALL_DEVICE_PACKAGE_TARGET) + .PHONY: bootimage bootimage: $(INSTALLED_BOOTIMAGE_TARGET) @@ -1039,7 +1218,7 @@ $(foreach module,$(sample_MODULES),$(eval $(call \ sample_ADDITIONAL_INSTALLED := \ $(filter-out $(modules_to_install) $(modules_to_check) $(ALL_PREBUILT),$(sample_MODULES)) samplecode: $(sample_APKS_COLLECTION) - @echo "Collect sample code apks: $^" + @echo -e ${CL_GRN}"Collect sample code apks:"${CL_RST}" $^" # remove apks that are not intended to be installed. rm -f $(sample_ADDITIONAL_INSTALLED) endif # samplecode in $(MAKECMDGOALS) @@ -1050,7 +1229,7 @@ findbugs: $(INTERNAL_FINDBUGS_HTML_TARGET) $(INTERNAL_FINDBUGS_XML_TARGET) .PHONY: clean clean: @rm -rf $(OUT_DIR)/* - @echo "Entire build directory removed." + @echo -e ${CL_GRN}"Entire build directory removed."${CL_RST} .PHONY: clobber clobber: clean @@ -1060,7 +1239,7 @@ clobber: clean #xxx scrape this from ALL_MODULE_NAME_TAGS .PHONY: modules modules: - @echo "Available sub-modules:" + @echo -e ${CL_GRN}"Available sub-modules:"${CL_RST} @echo "$(call module-names-for-tag-list,$(ALL_MODULE_TAGS))" | \ tr -s ' ' '\n' | sort -u | $(COLUMN) diff --git a/core/mtk_utils.mk b/core/mtk_utils.mk new file mode 100755 index 00000000000..48fd6605443 --- /dev/null +++ b/core/mtk_utils.mk @@ -0,0 +1,5 @@ +# Board platforms lists to be used for +# TARGET_BOARD_PLATFORM specific featurization +MTK_BOARD_PLATFORMS := mt6592 +MTK_BOARD_PLATFORMS += mt6582 +MTK_BOARD_PLATFORMS += mt6572 diff --git a/core/notice_files.mk b/core/notice_files.mk index e63cd84b5f9..1e1d9546686 100644 --- a/core/notice_files.mk +++ b/core/notice_files.mk @@ -62,7 +62,7 @@ installed_notice_file := $($(my_prefix)OUT_NOTICE_FILES)/src/$(module_installed_ $(installed_notice_file): PRIVATE_INSTALLED_MODULE := $(module_installed_filename) $(installed_notice_file): $(notice_file) - @echo Notice file: $< -- $@ + @echo -e ${CL_CYN}Notice file:${CL_RST} $< -- $@ $(hide) mkdir -p $(dir $@) $(hide) cat $< > $@ diff --git a/core/package.mk b/core/package.mk index 78b65db107b..8b137891791 100644 --- a/core/package.mk +++ b/core/package.mk @@ -1,76 +1 @@ -# We don't automatically set up rules to build packages for both -# TARGET_ARCH and TARGET_2ND_ARCH. -# To build it for TARGET_2ND_ARCH in a 64bit product, use "LOCAL_MULTILIB := 32". -my_prefix := TARGET_ -include $(BUILD_SYSTEM)/multilib.mk - -ifeq ($(TARGET_SUPPORTS_32_BIT_APPS)|$(TARGET_SUPPORTS_64_BIT_APPS),true|true) - # packages default to building for either architecture, - # the preferred if its supported, otherwise the non-preferred. -else ifeq ($(TARGET_SUPPORTS_64_BIT_APPS),true) - # only 64-bit apps supported - ifeq ($(filter $(my_module_multilib),64 both first),$(my_module_multilib)) - # if my_module_multilib was 64, both, first, or unset, build for 64-bit - my_module_multilib := 64 - else - # otherwise don't build this app - my_module_multilib := none - endif -else - # only 32-bit apps supported - ifeq ($(filter $(my_module_multilib),32 both),$(my_module_multilib)) - # if my_module_multilib was 32, both, or unset, build for 32-bit - my_module_multilib := 32 - else ifeq ($(my_module_multilib),first) - ifndef TARGET_IS_64_BIT - # if my_module_multilib was first and this is a 32-bit build, build for - # 32-bit - my_module_multilib := 32 - else - # if my_module_multilib was first and this is a 64-bit build, don't build - # this app - my_module_multilib := none - endif - else - # my_module_mulitlib was 64 or none, don't build this app - my_module_multilib := none - endif -endif - -LOCAL_NO_2ND_ARCH_MODULE_SUFFIX := true - -# if TARGET_PREFER_32_BIT_APPS is set, try to build 32-bit first -ifdef TARGET_2ND_ARCH -ifeq ($(TARGET_PREFER_32_BIT_APPS),true) -LOCAL_2ND_ARCH_VAR_PREFIX := $(TARGET_2ND_ARCH_VAR_PREFIX) -else -LOCAL_2ND_ARCH_VAR_PREFIX := -endif -endif - -# check if preferred arch is supported -include $(BUILD_SYSTEM)/module_arch_supported.mk -ifeq ($(my_module_arch_supported),true) -# first arch is supported -include $(BUILD_SYSTEM)/package_internal.mk -else ifneq (,$(TARGET_2ND_ARCH)) -# check if the non-preferred arch is the primary or secondary -ifeq ($(TARGET_PREFER_32_BIT_APPS),true) -LOCAL_2ND_ARCH_VAR_PREFIX := -else -LOCAL_2ND_ARCH_VAR_PREFIX := $(TARGET_2ND_ARCH_VAR_PREFIX) -endif - -# check if non-preferred arch is supported -include $(BUILD_SYSTEM)/module_arch_supported.mk -ifeq ($(my_module_arch_supported),true) -# secondary arch is supported -include $(BUILD_SYSTEM)/package_internal.mk -endif -endif # TARGET_2ND_ARCH - -LOCAL_2ND_ARCH_VAR_PREFIX := -LOCAL_NO_2ND_ARCH_MODULE_SUFFIX := - -my_module_arch_supported := diff --git a/core/package_internal.mk b/core/package_internal.mk index a6ad354b421..8b137891791 100644 --- a/core/package_internal.mk +++ b/core/package_internal.mk @@ -1,511 +1 @@ -# -# Copyright (C) 2008 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -########################################################### -## Standard rules for building an application package. -## -## Additional inputs from base_rules.make: -## LOCAL_PACKAGE_NAME: The name of the package; the directory -## will be called this. -## -## MODULE, MODULE_PATH, and MODULE_SUFFIX will -## be set for you. -########################################################### - -# If this makefile is being read from within an inheritance, -# use the new values. -skip_definition:= -ifdef LOCAL_PACKAGE_OVERRIDES - package_overridden := $(call set-inherited-package-variables) - ifeq ($(strip $(package_overridden)),) - skip_definition := true - endif -endif - -ifndef skip_definition - -LOCAL_PACKAGE_NAME := $(strip $(LOCAL_PACKAGE_NAME)) -ifeq ($(LOCAL_PACKAGE_NAME),) -$(error $(LOCAL_PATH): Package modules must define LOCAL_PACKAGE_NAME) -endif - -ifneq ($(strip $(LOCAL_MODULE_SUFFIX)),) -$(error $(LOCAL_PATH): Package modules may not define LOCAL_MODULE_SUFFIX) -endif -LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX) - -ifneq ($(strip $(LOCAL_MODULE)),) -$(error $(LOCAL_PATH): Package modules may not define LOCAL_MODULE) -endif -LOCAL_MODULE := $(LOCAL_PACKAGE_NAME) - -ifneq ($(strip $(LOCAL_MODULE_CLASS)),) -$(error $(LOCAL_PATH): Package modules may not set LOCAL_MODULE_CLASS) -endif -LOCAL_MODULE_CLASS := APPS - -# Package LOCAL_MODULE_TAGS default to optional -LOCAL_MODULE_TAGS := $(strip $(LOCAL_MODULE_TAGS)) -ifeq ($(LOCAL_MODULE_TAGS),) -LOCAL_MODULE_TAGS := optional -endif - -ifeq ($(filter tests, $(LOCAL_MODULE_TAGS)),) -# Force localization check if it's not tagged as tests. -LOCAL_AAPT_FLAGS := $(LOCAL_AAPT_FLAGS) -z -endif - -ifdef LOCAL_PACKAGE_SPLITS -LOCAL_AAPT_FLAGS += $(addprefix --split ,$(LOCAL_PACKAGE_SPLITS)) -endif - -need_compile_asset := -ifeq (,$(LOCAL_ASSET_DIR)) -LOCAL_ASSET_DIR := $(LOCAL_PATH)/assets -else -need_compile_asset := true -endif - -# LOCAL_RESOURCE_DIR may point to resource generated during the build -need_compile_res := -ifeq (,$(LOCAL_RESOURCE_DIR)) - LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res -else - need_compile_res := true -endif - -package_resource_overlays := $(strip \ - $(wildcard $(foreach dir, $(PRODUCT_PACKAGE_OVERLAYS), \ - $(addprefix $(dir)/, $(LOCAL_RESOURCE_DIR)))) \ - $(wildcard $(foreach dir, $(DEVICE_PACKAGE_OVERLAYS), \ - $(addprefix $(dir)/, $(LOCAL_RESOURCE_DIR))))) - -LOCAL_RESOURCE_DIR := $(package_resource_overlays) $(LOCAL_RESOURCE_DIR) - -all_assets := $(strip \ - $(foreach dir, $(LOCAL_ASSET_DIR), \ - $(addprefix $(dir)/, \ - $(patsubst assets/%,%, \ - $(call find-subdir-assets, $(dir)) \ - ) \ - ) \ - )) - -ifneq ($(all_assets),) -need_compile_asset := true -endif - -all_resources := $(strip \ - $(foreach dir, $(LOCAL_RESOURCE_DIR), \ - $(addprefix $(dir)/, \ - $(patsubst res/%,%, \ - $(call find-subdir-assets,$(dir)) \ - ) \ - ) \ - )) - -ifneq ($(all_resources),) - need_compile_res := true -endif - -all_res_assets := $(strip $(all_assets) $(all_resources)) - -intermediates.COMMON := $(call local-intermediates-dir,COMMON) - -# If no assets or resources were found, clear the directory variables so -# we don't try to build them. -ifneq (true,$(need_compile_asset)) -LOCAL_ASSET_DIR:= -endif -ifneq (true,$(need_compile_res)) -LOCAL_RESOURCE_DIR:= -R_file_stamp := -else -# Make sure that R_file_stamp inherits the proper PRIVATE vars. -# If R.stamp moves, be sure to update the framework makefile, -# which has intimate knowledge of its location. -R_file_stamp := $(intermediates.COMMON)/src/R.stamp -LOCAL_INTERMEDIATE_TARGETS += $(R_file_stamp) -endif - -LOCAL_BUILT_MODULE_STEM := package.apk -LOCAL_INSTALLED_MODULE_STEM := $(LOCAL_MODULE).apk - -LOCAL_PROGUARD_ENABLED:=$(strip $(LOCAL_PROGUARD_ENABLED)) -ifndef LOCAL_PROGUARD_ENABLED -ifneq ($(DISABLE_PROGUARD),true) - LOCAL_PROGUARD_ENABLED :=full -endif -endif -ifeq ($(LOCAL_PROGUARD_ENABLED),disabled) - # the package explicitly request to disable proguard. - LOCAL_PROGUARD_ENABLED := -endif -proguard_options_file := -ifneq ($(LOCAL_PROGUARD_ENABLED),custom) -ifeq ($(need_compile_res),true) - proguard_options_file := $(intermediates.COMMON)/proguard_options -endif # need_compile_res -endif # !custom -LOCAL_PROGUARD_FLAGS := $(addprefix -include ,$(proguard_options_file)) $(LOCAL_PROGUARD_FLAGS) - -ifeq (true,$(EMMA_INSTRUMENT)) -ifndef LOCAL_EMMA_INSTRUMENT -# No emma for test apks. -ifeq (,$(filer tests,$(LOCAL_MODULE_TAGS))$(LOCAL_INSTRUMENTATION_FOR)) -LOCAL_EMMA_INSTRUMENT := true -endif # No test apk -endif # LOCAL_EMMA_INSTRUMENT is not set -else -LOCAL_EMMA_INSTRUMENT := false -endif # EMMA_INSTRUMENT is true - -ifeq (true,$(LOCAL_EMMA_INSTRUMENT)) -ifeq (true,$(EMMA_INSTRUMENT_STATIC)) -LOCAL_STATIC_JAVA_LIBRARIES += emma -else -ifdef LOCAL_SDK_VERSION -ifdef TARGET_BUILD_APPS -# In unbundled build merge the emma library into the apk. -LOCAL_STATIC_JAVA_LIBRARIES += emma -else -# If build against the SDK in full build, core.jar is not used, -# we have to use prebiult emma.jar to make Proguard happy; -# Otherwise emma classes are included in core.jar. -LOCAL_PROGUARD_FLAGS += -libraryjars $(EMMA_JAR) -endif # full build -endif # LOCAL_SDK_VERSION -endif # EMMA_INSTRUMENT_STATIC -endif # LOCAL_EMMA_INSTRUMENT - -rs_compatibility_jni_libs := - -include $(BUILD_SYSTEM)/android_manifest.mk - -################################# -include $(BUILD_SYSTEM)/java.mk -################################# - -LOCAL_SDK_RES_VERSION:=$(strip $(LOCAL_SDK_RES_VERSION)) -ifeq ($(LOCAL_SDK_RES_VERSION),) - LOCAL_SDK_RES_VERSION:=$(LOCAL_SDK_VERSION) -endif - -$(LOCAL_INTERMEDIATE_TARGETS): \ - PRIVATE_ANDROID_MANIFEST := $(full_android_manifest) -ifneq (,$(filter-out current system_current, $(LOCAL_SDK_VERSION))) -$(LOCAL_INTERMEDIATE_TARGETS): \ - PRIVATE_DEFAULT_APP_TARGET_SDK := $(LOCAL_SDK_VERSION) -else -$(LOCAL_INTERMEDIATE_TARGETS): \ - PRIVATE_DEFAULT_APP_TARGET_SDK := $(DEFAULT_APP_TARGET_SDK) -endif - -ifeq ($(need_compile_res),true) - -# Since we don't know where the real R.java file is going to end up, -# we need to use another file to stand in its place. We'll just -# copy the generated file to src/R.stamp, which means it will -# have the same contents and timestamp as the actual file. -# -# At the same time, this will copy the R.java file to a central -# 'R' directory to make it easier to add the files to an IDE. -# - -$(R_file_stamp): PRIVATE_RESOURCE_PUBLICS_OUTPUT := \ - $(intermediates.COMMON)/public_resources.xml -$(R_file_stamp): PRIVATE_PROGUARD_OPTIONS_FILE := $(proguard_options_file) -$(R_file_stamp): $(all_res_assets) $(full_android_manifest) $(RenderScript_file_stamp) $(AAPT) | $(ACP) - @echo "target R.java/Manifest.java: $(PRIVATE_MODULE) ($@)" - @rm -f $@ - $(create-resource-java-files) - $(hide) for GENERATED_MANIFEST_FILE in `find $(PRIVATE_SOURCE_INTERMEDIATES_DIR) \ - -name Manifest.java 2> /dev/null`; do \ - dir=`awk '/package/{gsub(/\./,"/",$$2);gsub(/;/,"",$$2);print $$2;exit}' $$GENERATED_MANIFEST_FILE`; \ - mkdir -p $(TARGET_COMMON_OUT_ROOT)/R/$$dir; \ - $(ACP) -fp $$GENERATED_MANIFEST_FILE $(TARGET_COMMON_OUT_ROOT)/R/$$dir; \ - done; - $(hide) for GENERATED_R_FILE in `find $(PRIVATE_SOURCE_INTERMEDIATES_DIR) \ - -name R.java 2> /dev/null`; do \ - dir=`awk '/package/{gsub(/\./,"/",$$2);gsub(/;/,"",$$2);print $$2;exit}' $$GENERATED_R_FILE`; \ - mkdir -p $(TARGET_COMMON_OUT_ROOT)/R/$$dir; \ - $(ACP) -fp $$GENERATED_R_FILE $(TARGET_COMMON_OUT_ROOT)/R/$$dir \ - || exit 31; \ - $(ACP) -fp $$GENERATED_R_FILE $@ || exit 32; \ - done; \ - -$(proguard_options_file): $(R_file_stamp) - -resource_export_package := -ifdef LOCAL_EXPORT_PACKAGE_RESOURCES -# Put this module's resources into a PRODUCT-agnositc package that -# other packages can use to build their own PRODUCT-agnostic R.java (etc.) -# files. -resource_export_package := $(intermediates.COMMON)/package-export.apk -$(R_file_stamp): $(resource_export_package) - -# add-assets-to-package looks at PRODUCT_AAPT_CONFIG, but this target -# can't know anything about PRODUCT. Clear it out just for this target. -$(resource_export_package): PRIVATE_PRODUCT_AAPT_CONFIG := -$(resource_export_package): PRIVATE_PRODUCT_AAPT_PREF_CONFIG := -$(resource_export_package): $(all_res_assets) $(full_android_manifest) $(RenderScript_file_stamp) $(AAPT) - @echo "target Export Resources: $(PRIVATE_MODULE) ($@)" - $(create-empty-package) - $(add-assets-to-package) -endif - -# Other modules should depend on the BUILT module if -# they want to use this module's R.java file. -$(LOCAL_BUILT_MODULE): $(R_file_stamp) - -ifneq ($(full_classes_jar),) -# If full_classes_jar is non-empty, we're building sources. -# If we're building sources, the initial javac step (which -# produces full_classes_compiled_jar) needs to ensure the -# R.java and Manifest.java files have been generated first. -$(full_classes_compiled_jar): $(R_file_stamp) -endif - -endif # need_compile_res - -ifeq ($(LOCAL_NO_STANDARD_LIBRARIES),true) -# We need to explicitly clear this var so that we don't -# inherit the value from whomever caused us to be built. -$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_AAPT_INCLUDES := -else -# Most packages should link against the resources defined by framework-res. -# Even if they don't have their own resources, they may use framework -# resources. -ifneq ($(filter-out current system_current,$(LOCAL_SDK_RES_VERSION))$(if $(TARGET_BUILD_APPS),$(filter current system_current,$(LOCAL_SDK_RES_VERSION))),) -# for released sdk versions, the platform resources were built into android.jar. -framework_res_package_export := \ - $(HISTORICAL_SDK_VERSIONS_ROOT)/$(LOCAL_SDK_RES_VERSION)/android.jar -framework_res_package_export_deps := $(framework_res_package_export) -else # LOCAL_SDK_RES_VERSION -framework_res_package_export := \ - $(call intermediates-dir-for,APPS,framework-res,,COMMON)/package-export.apk -# We can't depend directly on the export.apk file; it won't get its -# PRIVATE_ vars set up correctly if we do. Instead, depend on the -# corresponding R.stamp file, which lists the export.apk as a dependency. -framework_res_package_export_deps := \ - $(dir $(framework_res_package_export))src/R.stamp -endif # LOCAL_SDK_RES_VERSION -all_library_res_package_exports := \ - $(framework_res_package_export) \ - $(foreach lib,$(LOCAL_RES_LIBRARIES),\ - $(call intermediates-dir-for,APPS,$(lib),,COMMON)/package-export.apk) - -all_library_res_package_export_deps := \ - $(framework_res_package_export_deps) \ - $(foreach lib,$(LOCAL_RES_LIBRARIES),\ - $(call intermediates-dir-for,APPS,$(lib),,COMMON)/src/R.stamp) - -$(resource_export_package) $(R_file_stamp) $(LOCAL_BUILT_MODULE): $(all_library_res_package_export_deps) -$(LOCAL_INTERMEDIATE_TARGETS): \ - PRIVATE_AAPT_INCLUDES := $(all_library_res_package_exports) -endif # LOCAL_NO_STANDARD_LIBRARIES - -ifneq ($(full_classes_jar),) -$(LOCAL_BUILT_MODULE): PRIVATE_DEX_FILE := $(built_dex) -$(LOCAL_BUILT_MODULE): $(built_dex) -endif # full_classes_jar - -include $(BUILD_SYSTEM)/install_jni_libs.mk - -# Pick a key to sign the package with. If this package hasn't specified -# an explicit certificate, use the default. -# Secure release builds will have their packages signed after the fact, -# so it's ok for these private keys to be in the clear. -ifeq ($(LOCAL_CERTIFICATE),) - LOCAL_CERTIFICATE := $(DEFAULT_SYSTEM_DEV_CERTIFICATE) -endif - -ifeq ($(LOCAL_CERTIFICATE),EXTERNAL) - # The special value "EXTERNAL" means that we will sign it with the - # default devkey, apply predexopt, but then expect the final .apk - # (after dexopting) to be signed by an outside tool. - LOCAL_CERTIFICATE := $(DEFAULT_SYSTEM_DEV_CERTIFICATE) - PACKAGES.$(LOCAL_PACKAGE_NAME).EXTERNAL_KEY := 1 -endif - -# If this is not an absolute certificate, assign it to a generic one. -ifeq ($(dir $(strip $(LOCAL_CERTIFICATE))),./) - LOCAL_CERTIFICATE := $(dir $(DEFAULT_SYSTEM_DEV_CERTIFICATE))$(LOCAL_CERTIFICATE) -endif -private_key := $(LOCAL_CERTIFICATE).pk8 -certificate := $(LOCAL_CERTIFICATE).x509.pem - -$(LOCAL_BUILT_MODULE): $(private_key) $(certificate) $(SIGNAPK_JAR) -$(LOCAL_BUILT_MODULE): PRIVATE_PRIVATE_KEY := $(private_key) -$(LOCAL_BUILT_MODULE): PRIVATE_CERTIFICATE := $(certificate) - -PACKAGES.$(LOCAL_PACKAGE_NAME).PRIVATE_KEY := $(private_key) -PACKAGES.$(LOCAL_PACKAGE_NAME).CERTIFICATE := $(certificate) - -$(LOCAL_BUILT_MODULE): PRIVATE_ADDITIONAL_CERTIFICATES := $(foreach c,\ - $(LOCAL_ADDITIONAL_CERTIFICATES), $(c).x509.pem $(c).pk8) - -# Define the rule to build the actual package. -$(LOCAL_BUILT_MODULE): $(AAPT) | $(ZIPALIGN) -# PRIVATE_JNI_SHARED_LIBRARIES is a list of :. -$(LOCAL_BUILT_MODULE): PRIVATE_JNI_SHARED_LIBRARIES := $(jni_shared_libraries_with_abis) -# PRIVATE_JNI_SHARED_LIBRARIES_ABI is a list of ABI names. -$(LOCAL_BUILT_MODULE): PRIVATE_JNI_SHARED_LIBRARIES_ABI := $(jni_shared_libraries_abis) -ifneq ($(TARGET_BUILD_APPS),) - # Include all resources for unbundled apps. - LOCAL_AAPT_INCLUDE_ALL_RESOURCES := true -endif -ifeq ($(LOCAL_AAPT_INCLUDE_ALL_RESOURCES),true) - $(LOCAL_BUILT_MODULE): PRIVATE_PRODUCT_AAPT_CONFIG := - $(LOCAL_BUILT_MODULE): PRIVATE_PRODUCT_AAPT_PREF_CONFIG := -else - $(LOCAL_BUILT_MODULE): PRIVATE_PRODUCT_AAPT_CONFIG := $(PRODUCT_AAPT_CONFIG) -ifdef LOCAL_PACKAGE_SPLITS - $(LOCAL_BUILT_MODULE): PRIVATE_PRODUCT_AAPT_PREF_CONFIG := -else - $(LOCAL_BUILT_MODULE): PRIVATE_PRODUCT_AAPT_PREF_CONFIG := $(PRODUCT_AAPT_PREF_CONFIG) -endif -endif -$(LOCAL_BUILT_MODULE): $(all_res_assets) $(jni_shared_libraries) $(full_android_manifest) - @echo "target Package: $(PRIVATE_MODULE) ($@)" - $(create-empty-package) - $(add-assets-to-package) -ifneq ($(jni_shared_libraries),) - $(add-jni-shared-libs-to-package) -endif -ifneq ($(full_classes_jar),) - $(add-dex-to-package) -endif - $(add-carried-java-resources) -ifneq ($(extra_jar_args),) - $(add-java-resources-to-package) -endif - $(sign-package) -ifdef LOCAL_DEX_PREOPT -ifneq (nostripping,$(LOCAL_DEX_PREOPT)) - $(call dexpreopt-remove-classes.dex,$@) -endif -endif - @# Alignment must happen after all other zip operations. - $(align-package) - -############################### -## Build dpi-specific apks, if it's apps_only build. -ifdef TARGET_BUILD_APPS -ifdef LOCAL_DPI_VARIANTS -$(foreach d, $(LOCAL_DPI_VARIANTS), \ - $(eval my_dpi := $(d)) \ - $(eval include $(BUILD_SYSTEM)/dpi_specific_apk.mk)) -endif -endif - -############################### -## Rule to build the odex file -ifdef LOCAL_DEX_PREOPT -$(built_odex): PRIVATE_DEX_FILE := $(built_dex) -# Use pattern rule - we may have multiple built odex files. -$(built_odex) : $(dir $(LOCAL_BUILT_MODULE))% : $(built_dex) - $(hide) mkdir -p $(dir $@) && rm -f $@ - $(add-dex-to-package) - $(hide) mv $@ $@.input - $(call dexpreopt-one-file,$@.input,$@) - $(hide) rm $@.input -endif - -############################### -## APK splits -ifdef LOCAL_PACKAGE_SPLITS -# LOCAL_PACKAGE_SPLITS is a list of resource labels. -# aapt will convert comma inside resource lable to underscore in the file names. -my_split_suffixes := $(subst $(comma),_,$(LOCAL_PACKAGE_SPLITS)) -built_apk_splits := $(foreach s,$(my_split_suffixes),$(built_module_path)/package_$(s).apk) -installed_apk_splits := $(foreach s,$(my_split_suffixes),$(my_module_path)/$(LOCAL_MODULE)_$(s).apk) - -# The splits should have been built in the same command building the base apk. -# This rule just runs signing and zipalign etc. -# Note that we explicily check the existence of the split apk and remove the -# built base apk if the split apk isn't there. -# That way the build system will rerun the aapt after the user changes the splitting parameters. -$(built_apk_splits): PRIVATE_PRIVATE_KEY := $(private_key) -$(built_apk_splits): PRIVATE_CERTIFICATE := $(certificate) -$(built_apk_splits) : $(built_module_path)/%.apk : $(LOCAL_BUILT_MODULE) - $(hide) if [ ! -f $@ ]; then \ - echo 'No $@ generated, check your apk splitting parameters.' 1>&2; \ - rm $<; exit 1; \ - fi - $(sign-package) - $(align-package) - -# Rules to install the splits -$(installed_apk_splits) : $(my_module_path)/$(LOCAL_MODULE)_%.apk : $(built_module_path)/package_%.apk | $(ACP) - @echo "Install: $@" - $(copy-file-to-new-target) - -# Register the additional built and installed files. -ALL_MODULES.$(my_register_name).INSTALLED += $(installed_apk_splits) -ALL_MODULES.$(my_register_name).BUILT_INSTALLED += \ - $(foreach s,$(my_split_suffixes),$(built_module_path)/package_$(s).apk:$(my_module_path)/$(LOCAL_MODULE)_$(s).apk) - -# Make sure to install the splits when you run "make ". -$(my_register_name): $(installed_apk_splits) -endif # LOCAL_PACKAGE_SPLITS - -# Save information about this package -PACKAGES.$(LOCAL_PACKAGE_NAME).OVERRIDES := $(strip $(LOCAL_OVERRIDES_PACKAGES)) -PACKAGES.$(LOCAL_PACKAGE_NAME).RESOURCE_FILES := $(all_resources) -ifdef package_resource_overlays -PACKAGES.$(LOCAL_PACKAGE_NAME).RESOURCE_OVERLAYS := $(package_resource_overlays) -endif - -PACKAGES := $(PACKAGES) $(LOCAL_PACKAGE_NAME) - -# Dist the files that can be bundled in system.img. -# They include the jni shared libraries and the apk with jni libraries stripped. -ifeq ($(LOCAL_DIST_BUNDLED_BINARIES),true) -ifneq ($(filter $(LOCAL_PACKAGE_NAME),$(TARGET_BUILD_APPS)),) -ifneq ($(strip $(jni_shared_libraries)),) -dist_subdir := bundled_$(LOCAL_PACKAGE_NAME) -$(foreach f, $(jni_shared_libraries), \ - $(call dist-for-goals, apps_only, $(f):$(dist_subdir)/$(notdir $(f)))) - -apk_jni_stripped := $(intermediates)/jni_stripped/package.apk -$(apk_jni_stripped): PRIVATE_JNI_SHARED_LIBRARIES := $(notdir $(jni_shared_libraries)) -$(apk_jni_stripped) : $(LOCAL_BUILT_MODULE) | $(ZIPALIGN) - @rm -rf $(dir $@) && mkdir -p $(dir $@) - $(hide) cp $< $@ - $(hide) zip -d $@ $(foreach f,$(PRIVATE_JNI_SHARED_LIBRARIES),\*/$(f)) - $(call align-package) - -$(call dist-for-goals, apps_only, $(apk_jni_stripped):$(dist_subdir)/$(LOCAL_PACKAGE_NAME).apk) - -endif # jni_shared_libraries -endif # apps_only build -endif # LOCAL_DIST_BUNDLED_BINARIES - -# Lint phony targets -.PHONY: lint-$(LOCAL_PACKAGE_NAME) -lint-$(LOCAL_PACKAGE_NAME): PRIVATE_PATH := $(LOCAL_PATH) -lint-$(LOCAL_PACKAGE_NAME): PRIVATE_LINT_FLAGS := $(LOCAL_LINT_FLAGS) -lint-$(LOCAL_PACKAGE_NAME) : - @echo lint $(PRIVATE_PATH) - $(LINT) $(PRIVATE_LINT_FLAGS) $(PRIVATE_PATH) - -lintall : lint-$(LOCAL_PACKAGE_NAME) - -endif # skip_definition - -# Reset internal variables. -all_res_assets := diff --git a/core/pathmap.mk b/core/pathmap.mk index 0820885a6ac..84d2b9d9674 100644 --- a/core/pathmap.mk +++ b/core/pathmap.mk @@ -42,7 +42,6 @@ pathmap_INCL := \ libstdc++:bionic/libstdc++/include \ mkbootimg:system/core/mkbootimg \ opengl-tests-includes:frameworks/native/opengl/tests/include \ - recovery:bootable/recovery \ system-core:system/core/include \ audio-effects:system/media/audio_effects/include \ audio-utils:system/media/audio_utils/include \ @@ -63,6 +62,36 @@ define include-path-for $(foreach n,$(1),$(patsubst $(n):%,%,$(filter $(n):%,$(pathmap_INCL)))) endef +# Enter project path into pathmap +# +# $(1): name +# $(2): path +# +define project-set-path +$(eval pathmap_PROJ += $(1):$(2)) +endef + +# Enter variant project path into pathmap +# +# $(1): name +# $(2): variable to check +# $(3): base path +# +define project-set-path-variant + $(call project-set-path,$(1),$(strip \ + $(if $($(2)), \ + $(3)-$($(2)), \ + $(3)))) +endef + +# Returns the path to the requested module's include directory, +# relative to the root of the source tree. +# +# $(1): a list of modules (or other named entities) to find the projects for +define project-path-for +$(foreach n,$(1),$(patsubst $(n):%,%,$(filter $(n):%,$(pathmap_PROJ)))) +endef + # # Many modules expect to be able to say "#include ", # so make it easy for them to find the correct path. @@ -87,10 +116,10 @@ FRAMEWORKS_BASE_SUBDIRS := \ sax \ telecomm \ telephony \ - phone \ wifi \ keystore \ rs \ + security-bridge \ ) # diff --git a/core/pdk_config.mk b/core/pdk_config.mk index 838754fa821..58364d76157 100644 --- a/core/pdk_config.mk +++ b/core/pdk_config.mk @@ -114,7 +114,7 @@ endif endif $(_pdk_fusion_stamp) : $(PDK_FUSION_PLATFORM_ZIP) - @echo "Unzip $(dir $@) <- $<" + @echo -e ${CL_YLW}"Unzip"${CL_RST}" $(dir $@) <- $<" $(hide) rm -rf $(dir $@) && mkdir -p $(dir $@) $(hide) unzip -qo $< -d $(dir $@) $(call split-long-arguments,-touch,$(_pdk_fusion_files)) diff --git a/core/prebuilt_internal.mk b/core/prebuilt_internal.mk index bc6088fa2b6..93cdae7cbe6 100644 --- a/core/prebuilt_internal.mk +++ b/core/prebuilt_internal.mk @@ -111,132 +111,8 @@ endif endif # LOCAL_STRIP_MODULE not true -ifeq ($(LOCAL_MODULE_CLASS),APPS) -PACKAGES.$(LOCAL_MODULE).OVERRIDES := $(strip $(LOCAL_OVERRIDES_PACKAGES)) - -# Select dpi-specific source -ifdef LOCAL_DPI_VARIANTS -my_dpi := $(firstword $(filter $(LOCAL_DPI_VARIANTS),$(PRODUCT_AAPT_PREF_CONFIG) $(PRODUCT_AAPT_PREBUILT_DPI))) -ifdef my_dpi -ifdef LOCAL_DPI_FILE_STEM -my_prebuilt_dpi_file_stem := $(LOCAL_DPI_FILE_STEM) -else -my_prebuilt_dpi_file_stem := $(LOCAL_MODULE)_%.apk -endif -my_prebuilt_src_file := $(dir $(my_prebuilt_src_file))$(subst %,$(my_dpi),$(my_prebuilt_dpi_file_stem)) -endif # my_dpi -endif # LOCAL_DPI_VARIANTS - -rs_compatibility_jni_libs := -include $(BUILD_SYSTEM)/install_jni_libs.mk - -ifeq ($(LOCAL_CERTIFICATE),EXTERNAL) - # The magic string "EXTERNAL" means this package will be signed with - # the default dev key throughout the build process, but we expect - # the final package to be signed with a different key. - # - # This can be used for packages where we don't have access to the - # keys, but want the package to be predexopt'ed. - LOCAL_CERTIFICATE := $(DEFAULT_SYSTEM_DEV_CERTIFICATE) - PACKAGES.$(LOCAL_MODULE).EXTERNAL_KEY := 1 - - $(built_module) : PRIVATE_PRIVATE_KEY := $(LOCAL_CERTIFICATE).pk8 - $(built_module) : PRIVATE_CERTIFICATE := $(LOCAL_CERTIFICATE).x509.pem -endif -ifeq ($(LOCAL_CERTIFICATE),) - # It is now a build error to add a prebuilt .apk without - # specifying a key for it. - $(error No LOCAL_CERTIFICATE specified for prebuilt "$(my_prebuilt_src_file)") -else ifeq ($(LOCAL_CERTIFICATE),PRESIGNED) - # The magic string "PRESIGNED" means this package is already checked - # signed with its release key. - # - # By setting .CERTIFICATE but not .PRIVATE_KEY, this package will be - # mentioned in apkcerts.txt (with certificate set to "PRESIGNED") - # but the dexpreopt process will not try to re-sign the app. - PACKAGES.$(LOCAL_MODULE).CERTIFICATE := PRESIGNED - PACKAGES := $(PACKAGES) $(LOCAL_MODULE) -else - # If this is not an absolute certificate, assign it to a generic one. - ifeq ($(dir $(strip $(LOCAL_CERTIFICATE))),./) - LOCAL_CERTIFICATE := $(dir $(DEFAULT_SYSTEM_DEV_CERTIFICATE))$(LOCAL_CERTIFICATE) - endif - - PACKAGES.$(LOCAL_MODULE).PRIVATE_KEY := $(LOCAL_CERTIFICATE).pk8 - PACKAGES.$(LOCAL_MODULE).CERTIFICATE := $(LOCAL_CERTIFICATE).x509.pem - PACKAGES := $(PACKAGES) $(LOCAL_MODULE) - - $(built_module) : PRIVATE_PRIVATE_KEY := $(LOCAL_CERTIFICATE).pk8 - $(built_module) : PRIVATE_CERTIFICATE := $(LOCAL_CERTIFICATE).x509.pem -endif - -# Disable dex-preopt of prebuilts to save space, if requested. -ifeq ($(DONT_DEXPREOPT_PREBUILTS),true) -LOCAL_DEX_PREOPT := false -endif - -####################################### -# defines built_odex along with rule to install odex -include $(BUILD_SYSTEM)/dex_preopt_odex_install.mk -####################################### -# Sign and align non-presigned .apks. -$(built_module) : $(my_prebuilt_src_file) | $(ACP) $(ZIPALIGN) $(SIGNAPK_JAR) - $(transform-prebuilt-to-target) -ifdef extracted_jni_libs - $(hide) zip -d $@ 'lib/*.so' # strip embedded JNI libraries. -endif -ifneq ($(LOCAL_CERTIFICATE),PRESIGNED) - $(sign-package) -endif -ifdef LOCAL_DEX_PREOPT -ifneq (nostripping,$(LOCAL_DEX_PREOPT)) - $(call dexpreopt-remove-classes.dex,$@) -endif -endif - $(align-package) - -############################### -## Rule to build the odex file -ifdef LOCAL_DEX_PREOPT -$(built_odex) : $(my_prebuilt_src_file) - $(call dexpreopt-one-file,$<,$@) -endif - -############################### -## Install split apks. -ifdef LOCAL_PACKAGE_SPLITS -# LOCAL_PACKAGE_SPLITS is a list of apks to be installed. -built_apk_splits := $(addprefix $(built_module_path)/,$(notdir $(LOCAL_PACKAGE_SPLITS))) -installed_apk_splits := $(addprefix $(my_module_path)/,$(notdir $(LOCAL_PACKAGE_SPLITS))) - -# Rules to sign and zipalign the split apks. -my_src_dir := $(sort $(dir $(LOCAL_PACKAGE_SPLITS))) -ifneq (1,$(words $(my_src_dir))) -$(error You must put all the split source apks in the same folder: $(LOCAL_PACKAGE_SPLITS)) -endif -my_src_dir := $(LOCAL_PATH)/$(my_src_dir) - -$(built_apk_splits) : PRIVATE_PRIVATE_KEY := $(LOCAL_CERTIFICATE).pk8 -$(built_apk_splits) : PRIVATE_CERTIFICATE := $(LOCAL_CERTIFICATE).x509.pem -$(built_apk_splits) : $(built_module_path)/%.apk : $(my_src_dir)/%.apk | $(ACP) - $(copy-file-to-new-target) - $(sign-package) - $(align-package) - -# Rules to install the split apks. -$(installed_apk_splits) : $(my_module_path)/%.apk : $(built_module_path)/%.apk | $(ACP) - @echo "Install: $@" - $(copy-file-to-new-target) - -# Register the additional built and installed files. -ALL_MODULES.$(my_register_name).INSTALLED += $(installed_apk_splits) -ALL_MODULES.$(my_register_name).BUILT_INSTALLED += \ - $(foreach s,$(LOCAL_PACKAGE_SPLITS),$(built_module_path)/$(notdir $(s)):$(my_module_path)/$(notdir $(s))) - -# Make sure to install the splits when you run "make ". -$(my_register_name): $(installed_apk_splits) +ifeq ($(LOCAL_MODULE_CLASS),APPS_) -endif # LOCAL_PACKAGE_SPLITS else # LOCAL_MODULE_CLASS != APPS ifneq ($(LOCAL_PREBUILT_STRIP_COMMENTS),) diff --git a/core/product.mk b/core/product.mk index f0fc9210291..e391f35d104 100644 --- a/core/product.mk +++ b/core/product.mk @@ -65,6 +65,8 @@ endef # _product_var_list := \ + PRODUCT_BOOTANIMATION \ + PRODUCT_BUILD_PROP_OVERRIDES \ PRODUCT_NAME \ PRODUCT_MODEL \ PRODUCT_LOCALES \ @@ -82,6 +84,7 @@ _product_var_list := \ PRODUCT_DEFAULT_PROPERTY_OVERRIDES \ PRODUCT_CHARACTERISTICS \ PRODUCT_COPY_FILES \ + PRODUCT_COPY_FILES_OVERRIDES \ PRODUCT_OTA_PUBLIC_KEYS \ PRODUCT_EXTRA_RECOVERY_KEYS \ PRODUCT_PACKAGE_OVERLAYS \ @@ -125,24 +128,66 @@ define dump-products $(foreach p,$(PRODUCTS),$(call dump-product,$(p))) endef +# +# Internal function. Appends inherited product variables to an existing one. +# +# $(1): Product variable to operate on +# $(2): Value to append +# +define inherit-product_append-var + $(eval $(1) := $($(1)) $(INHERIT_TAG)$(strip $(2))) +endef + +# +# Internal function. Prepends inherited product variables to an existing one. +# +# $(1): Product variable to operate on +# $(2): Value to prepend +# +define inherit-product_prepend-var + $(eval $(1) := $(INHERIT_TAG)$(strip $(2)) $($(1))) +endef + +# +# Internal function. Tracks visited notes during inheritance resolution. +# +# $(1): Product being inherited +# +define inherit-product_track-node + $(eval inherit_var := \ + PRODUCTS.$(strip $(word 1,$(_include_stack))).INHERITS_FROM) \ + $(eval $(inherit_var) := $(sort $($(inherit_var)) $(strip $(1)))) \ + $(eval inherit_var:=) \ + $(eval ALL_PRODUCTS := $(sort $(ALL_PRODUCTS) $(word 1,$(_include_stack)))) +endef + # # $(1): product to inherit # # Does three things: -# 1. Inherits all of the variables from $1. +# 1. Inherits all of the variables from $1, prioritizing existing settings. # 2. Records the inheritance in the .INHERITS_FROM variable # 3. Records that we've visited this node, in ALL_PRODUCTS # define inherit-product $(foreach v,$(_product_var_list), \ - $(eval $(v) := $($(v)) $(INHERIT_TAG)$(strip $(1)))) \ - $(eval inherit_var := \ - PRODUCTS.$(strip $(word 1,$(_include_stack))).INHERITS_FROM) \ - $(eval $(inherit_var) := $(sort $($(inherit_var)) $(strip $(1)))) \ - $(eval inherit_var:=) \ - $(eval ALL_PRODUCTS := $(sort $(ALL_PRODUCTS) $(word 1,$(_include_stack)))) + $(call inherit-product_append-var,$(v),$(1))) \ + $(call inherit-product_track-node,$(1)) endef +# +# $(1): product to inherit +# +# Does three things: +# 1. Inherits all of the variables from $1, prioritizing inherited settings. +# 2. Records the inheritance in the .INHERITS_FROM variable +# 3. Records that we've visited this node, in ALL_PRODUCTS +# +define prepend-product + $(foreach v,$(_product_var_list), \ + $(call inherit-product_prepend-var,$(v),$(1))) \ + $(call inherit-product_track-node,$(1)) +endef # # Do inherit-product only if $(1) exists @@ -151,6 +196,13 @@ define inherit-product-if-exists $(if $(wildcard $(1)),$(call inherit-product,$(1)),) endef +# +# Do inherit-product-prepend only if $(1) exists +# +define prepend-product-if-exists + $(if $(wildcard $(1)),$(call prepend-product,$(1)),) +endef + # # $(1): product makefile list # @@ -252,12 +304,14 @@ _product_stash_var_list += \ BOARD_USES_GENERIC_AUDIO \ BOARD_KERNEL_CMDLINE \ BOARD_KERNEL_BASE \ + BOARD_USE_PREBUILT_KERNEL \ BOARD_HAVE_BLUETOOTH \ BOARD_VENDOR_USE_AKMD \ BOARD_EGL_CFG \ BOARD_BOOTIMAGE_PARTITION_SIZE \ BOARD_RECOVERYIMAGE_PARTITION_SIZE \ BOARD_SYSTEMIMAGE_PARTITION_SIZE \ + BOARD_SYSTEMIMAGE_PARTITION_PADDING \ BOARD_USERDATAIMAGE_FILE_SYSTEM_TYPE \ BOARD_USERDATAIMAGE_PARTITION_SIZE \ BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE \ diff --git a/core/product_config.mk b/core/product_config.mk index e7fa75ef531..640bb4071f8 100644 --- a/core/product_config.mk +++ b/core/product_config.mk @@ -179,16 +179,22 @@ include $(BUILD_SYSTEM)/node_fns.mk include $(BUILD_SYSTEM)/product.mk include $(BUILD_SYSTEM)/device.mk -ifneq ($(strip $(TARGET_BUILD_APPS)),) -# An unbundled app build needs only the core product makefiles. -all_product_configs := $(call get-product-makefiles,\ - $(SRC_TARGET_DIR)/product/AndroidProducts.mk) +# A CM build needs only the CM product makefiles. +ifneq ($(CM_BUILD),) + all_product_configs := $(shell find device -path "*/$(CM_BUILD)/cm.mk") else -# Read in all of the product definitions specified by the AndroidProducts.mk -# files in the tree. -all_product_configs := $(get-all-product-makefiles) -endif + ifneq ($(strip $(TARGET_BUILD_APPS)),) + # An unbundled app build needs only the core product makefiles. + all_product_configs := $(call get-product-makefiles,\ + $(SRC_TARGET_DIR)/product/AndroidProducts.mk) + else + # Read in all of the product definitions specified by the AndroidProducts.mk + # files in the tree. + all_product_configs := $(get-all-product-makefiles) + endif # TARGET_BUILD_APPS +endif # CM_BUILD +ifeq ($(CM_BUILD),) # Find the product config makefile for the current product. # all_product_configs consists items like: # : @@ -207,12 +213,18 @@ $(foreach f, $(all_product_configs),\ $(eval all_product_makefiles += $(f))\ $(if $(filter $(TARGET_PRODUCT),$(basename $(notdir $(f)))),\ $(eval current_product_makefile += $(f)),))) + _cpm_words := _cpm_word1 := _cpm_word2 := +else + current_product_makefile := $(strip $(all_product_configs)) + all_product_makefiles := $(strip $(all_product_configs)) +endif current_product_makefile := $(strip $(current_product_makefile)) all_product_makefiles := $(strip $(all_product_makefiles)) + ifneq (,$(filter product-graph dump-products, $(MAKECMDGOALS))) # Import all product makefiles. $(call import-products, $(all_product_makefiles)) @@ -269,12 +281,14 @@ product_runtimes := PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_PROPERTY_OVERRIDES += persist.sys.dalvik.vm.lib.2=$(DALVIK_VM_LIB) -ifeq ($(words $(PRODUCT_RUNTIMES)),1) - # If we only have one runtime, we can strip classes.dex by default during dex_preopt - DEX_PREOPT_DEFAULT := true -else +ifeq ($(DEX_PREOPT_DEFAULT),) + ifeq ($(words $(PRODUCT_RUNTIMES)),1) + # If we only have one runtime, we can strip classes.dex by default during dex_preopt + DEX_PREOPT_DEFAULT := true + else # If we have more than one, we leave the classes.dex alone for post-boot analysis - DEX_PREOPT_DEFAULT := nostripping + DEX_PREOPT_DEFAULT := nostripping + endif endif ############################################################################# @@ -361,6 +375,28 @@ endif # The optional : is used to indicate the owner of a vendor file. PRODUCT_COPY_FILES := \ $(strip $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_COPY_FILES)) +_boot_animation := $(strip $(lastword $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_BOOTANIMATION))) +ifneq ($(_boot_animation),) +PRODUCT_COPY_FILES += \ + $(_boot_animation):system/media/bootanimation.zip +endif +_boot_animation := + +# We might want to skip items listed in PRODUCT_COPY_FILES for +# various reasons. This is useful for replacing a binary module with one +# built from source. This should be a list of destination files under $OUT +PRODUCT_COPY_FILES_OVERRIDES := \ + $(addprefix %:, $(strip $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_COPY_FILES_OVERRIDES))) + +ifneq ($(PRODUCT_COPY_FILES_OVERRIDES),) + PRODUCT_COPY_FILES := $(filter-out $(PRODUCT_COPY_FILES_OVERRIDES), $(PRODUCT_COPY_FILES)) +endif + +.PHONY: listcopies +listcopies: + @echo "Copy files: $(PRODUCT_COPY_FILES)" + @echo "Overrides: $(PRODUCT_COPY_FILES_OVERRIDES)" + # A list of property assignments, like "key = value", with zero or more # whitespace characters on either side of the '='. @@ -373,6 +409,9 @@ PRODUCT_PROPERTY_OVERRIDES := \ PRODUCT_DEFAULT_PROPERTY_OVERRIDES := \ $(strip $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_DEFAULT_PROPERTY_OVERRIDES)) +PRODUCT_BUILD_PROP_OVERRIDES := \ + $(strip $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_BUILD_PROP_OVERRIDES)) + # Should we use the default resources or add any product specific overlays PRODUCT_PACKAGE_OVERLAYS := \ $(strip $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_PACKAGE_OVERLAYS)) diff --git a/core/qcom_target.mk b/core/qcom_target.mk new file mode 100644 index 00000000000..8af5c099743 --- /dev/null +++ b/core/qcom_target.mk @@ -0,0 +1,78 @@ +# Target-specific configuration + +# Populate the qcom hardware variants in the project pathmap. +define ril-set-path-variant +$(call project-set-path-variant,ril,TARGET_RIL_VARIANT,hardware/$(1)) +endef + +# Set device-specific HALs into project pathmap +define set-device-specific-path +$(call project-set-path,qcom-$(2),$(strip $(if $(USE_DEVICE_SPECIFIC_$(1)), \ + $(TARGET_DEVICE_DIR)/$(2), $(3)))) +endef + +ifeq ($(BOARD_USES_QCOM_HARDWARE),true) + + qcom_flags := -DQCOM_HARDWARE + + TARGET_ENABLE_QC_AV_ENHANCEMENTS := true + + # Enable DirectTrack for legacy targets + ifneq ($(filter msm7x30 msm8660 msm8960,$(TARGET_BOARD_PLATFORM)),) + ifeq ($(BOARD_USES_LEGACY_ALSA_AUDIO),true) + qcom_flags += -DQCOM_DIRECTTRACK + endif + # Enable legacy graphics functions + qcom_flags += -DQCOM_BSP_LEGACY + endif + + # Enable extra offloading for post-805 targets + ifneq ($(filter msm8992 msm8994,$(TARGET_BOARD_PLATFORM)),) + qcom_flags += -DHAS_EXTRA_FLAC_METADATA + endif + + TARGET_GLOBAL_CFLAGS += $(qcom_flags) + TARGET_GLOBAL_CPPFLAGS += $(qcom_flags) + CLANG_TARGET_GLOBAL_CFLAGS += $(qcom_flags) + CLANG_TARGET_GLOBAL_CPPFLAGS += $(qcom_flags) + + # Multiarch needs these too.. + 2ND_TARGET_GLOBAL_CFLAGS += $(qcom_flags) + 2ND_TARGET_GLOBAL_CPPFLAGS += $(qcom_flags) + 2ND_CLANG_TARGET_GLOBAL_CFLAGS += $(qcom_flags) + 2ND_CLANG_TARGET_GLOBAL_CPPFLAGS += $(qcom_flags) + + ifeq ($(QCOM_HARDWARE_VARIANT),) + ifneq ($(filter msm8610 msm8226 msm8974,$(TARGET_BOARD_PLATFORM)),) + QCOM_HARDWARE_VARIANT := msm8974 + else + ifneq ($(filter msm8909 msm8916,$(TARGET_BOARD_PLATFORM)),) + QCOM_HARDWARE_VARIANT := msm8916 + else + ifneq ($(filter msm8992 msm8994,$(TARGET_BOARD_PLATFORM)),) + QCOM_HARDWARE_VARIANT := msm8994 + else + QCOM_HARDWARE_VARIANT := $(TARGET_BOARD_PLATFORM) + endif + endif + endif + endif + +$(call project-set-path,qcom-audio,hardware/qcom/audio-caf/$(QCOM_HARDWARE_VARIANT)) +$(call set-device-specific-path,CAMERA,camera,hardware/qcom/camera) +$(call project-set-path,qcom-display,hardware/qcom/display-caf/$(QCOM_HARDWARE_VARIANT)) +$(call set-device-specific-path,GPS,gps,hardware/qcom/gps) +$(call project-set-path,qcom-media,hardware/qcom/media-caf/$(QCOM_HARDWARE_VARIANT)) +$(call set-device-specific-path,SENSORS,sensors,hardware/qcom/sensors) +$(call ril-set-path-variant,ril) +$(call set-device-specific-path,LOC_API,loc-api,vendor/qcom/opensource/location) +else +$(call project-set-path,qcom-audio,hardware/qcom/audio/default) +$(call project-set-path,qcom-camera,hardware/qcom/camera) +$(call project-set-path,qcom-display,hardware/qcom/display/$(TARGET_BOARD_PLATFORM)) +$(call project-set-path,qcom-gps,hardware/qcom/gps) +$(call project-set-path,qcom-media,hardware/qcom/media/default) +$(call project-set-path,qcom-sensors,hardware/qcom/sensors) +$(call ril-set-path-variant,ril) +$(call project-set-path,loc-api,vendor/qcom/opensource/location) +endif diff --git a/core/qcom_utils.mk b/core/qcom_utils.mk new file mode 100755 index 00000000000..bb1202c49d7 --- /dev/null +++ b/core/qcom_utils.mk @@ -0,0 +1,225 @@ +# Board platforms lists to be used for +# TARGET_BOARD_PLATFORM specific featurization +QCOM_BOARD_PLATFORMS += msm7x30 +QCOM_BOARD_PLATFORMS += msm8226 +QCOM_BOARD_PLATFORMS += msm8610 +QCOM_BOARD_PLATFORMS += msm8660 +QCOM_BOARD_PLATFORMS += msm8909 +QCOM_BOARD_PLATFORMS += msm8916 +QCOM_BOARD_PLATFORMS += msm8960 +QCOM_BOARD_PLATFORMS += msm8974 +QCOM_BOARD_PLATFORMS += mpq8092 +QCOM_BOARD_PLATFORMS += msm8992 +QCOM_BOARD_PLATFORMS += msm8994 +QCOM_BOARD_PLATFORMS += msm_bronze +QCOM_BOARD_PLATFORMS += apq8084 + +MSM7K_BOARD_PLATFORMS := msm7x30 +MSM7K_BOARD_PLATFORMS += msm7x27 +MSM7K_BOARD_PLATFORMS += msm7x27a +MSM7K_BOARD_PLATFORMS += msm7k + +QSD8K_BOARD_PLATFORMS := qsd8k + + +# vars for use by utils +empty := +space := $(empty) $(empty) +colon := $(empty):$(empty) +underscore := $(empty)_$(empty) + +# $(call match-word,w1,w2) +# checks if w1 == w2 +# How it works +# if (w1-w2 not empty or w2-w1 not empty) then not_match else match +# +# returns true or empty +#$(warning :$(1): :$(2): :$(subst $(1),,$(2)):) \ +#$(warning :$(2): :$(1): :$(subst $(2),,$(1)):) \ +# +define match-word +$(strip \ + $(if $(or $(subst $(1),$(empty),$(2)),$(subst $(2),$(empty),$(1))),,true) \ +) +endef + +# $(call find-word-in-list,w,wlist) +# finds an exact match of word w in word list wlist +# +# How it works +# fill wlist spaces with colon +# wrap w with colon +# search word w in list wl, if found match m, return stripped word w +# +# returns stripped word or empty +define find-word-in-list +$(strip \ + $(eval wl:= $(colon)$(subst $(space),$(colon),$(strip $(2)))$(colon)) \ + $(eval w:= $(colon)$(strip $(1))$(colon)) \ + $(eval m:= $(findstring $(w),$(wl))) \ + $(if $(m),$(1),) \ +) +endef + +# $(call match-word-in-list,w,wlist) +# does an exact match of word w in word list wlist +# How it works +# if the input word is not empty +# return output of an exact match of word w in wordlist wlist +# else +# return empty +# returns true or empty +define match-word-in-list +$(strip \ + $(if $(strip $(1)), \ + $(call match-word,$(call find-word-in-list,$(1),$(2)),$(strip $(1))), \ + ) \ +) +endef + +# $(call match-prefix,p,delim,w/wlist) +# matches prefix p in wlist using delimiter delim +# +# How it works +# trim the words in wlist w +# if find-word-in-list returns not empty +# return true +# else +# return empty +# +define match-prefix +$(strip \ + $(eval w := $(strip $(1)$(strip $(2)))) \ + $(eval text := $(patsubst $(w)%,$(1),$(3))) \ + $(if $(call match-word-in-list,$(1),$(text)),true,) \ +) +endef + +# ---- +# The following utilities are meant for board platform specific +# featurisation + +# $(call get-vendor-board-platforms,v) +# returns list of board platforms for vendor v +define get-vendor-board-platforms +$(if $(call match-word,$(BOARD_USES_$(1)_HARDWARE),true),$($(1)_BOARD_PLATFORMS)) +endef + +# $(call is-board-platform,bp) +# returns true or empty +define is-board-platform +$(call match-word,$(1),$(TARGET_BOARD_PLATFORM)) +endef + +# $(call is-not-board-platform,bp) +# returns true or empty +define is-not-board-platform +$(if $(call match-word,$(1),$(TARGET_BOARD_PLATFORM)),,true) +endef + +# $(call is-board-platform-in-list,bpl) +# returns true or empty +define is-board-platform-in-list +$(call match-word-in-list,$(TARGET_BOARD_PLATFORM),$(1)) +endef + +# $(call is-vendor-board-platform,vendor) +# returns true or empty +define is-vendor-board-platform +$(strip \ + $(call match-word-in-list,$(TARGET_BOARD_PLATFORM),\ + $(call get-vendor-board-platforms,$(1)) \ + ) \ +) +endef + +# $(call is-chipset-in-board-platform,chipset) +# does a prefix match of chipset in TARGET_BOARD_PLATFORM +# uses underscore as a delimiter +# +# returns true or empty +define is-chipset-in-board-platform +$(call match-prefix,$(1),$(underscore),$(TARGET_BOARD_PLATFORM)) +endef + +# $(call is-chipset-prefix-in-board-platform,prefix) +# does a chipset prefix match in TARGET_BOARD_PLATFORM +# assumes '_' and 'a' as the delimiter to the chipset prefix +# +# How it works +# if ($(prefix)_ or $(prefix)a match in board platform) +# return true +# else +# return empty +# +define is-chipset-prefix-in-board-platform +$(strip \ + $(eval delim_a := $(empty)a$(empty)) \ + $(if \ + $(or \ + $(call match-prefix,$(1),$(delim_a),$(TARGET_BOARD_PLATFORM)), \ + $(call match-prefix,$(1),$(underscore),$(TARGET_BOARD_PLATFORM)), \ + ), \ + true, \ + ) \ +) +endef + +#---- +# The following utilities are meant for Android Code Name +# specific featurisation +# +# refer http://source.android.com/source/build-numbers.html +# for code names and associated sdk versions +CUPCAKE_SDK_VERSIONS := 3 +DONUT_SDK_VERSIONS := 4 +ECLAIR_SDK_VERSIONS := 5 6 7 +FROYO_SDK_VERSIONS := 8 +GINGERBREAD_SDK_VERSIONS := 9 10 +HONEYCOMB_SDK_VERSIONS := 11 12 13 +ICECREAM_SANDWICH_SDK_VERSIONS := 14 15 +JELLY_BEAN_SDK_VERSIONS := 16 17 18 + +# $(call is-platform-sdk-version-at-least,version) +# version is a numeric SDK_VERSION defined above +define is-platform-sdk-version-at-least +$(strip \ + $(if $(filter 1,$(shell echo "$$(( $(PLATFORM_SDK_VERSION) >= $(1) ))" )), \ + true, \ + ) \ +) +endef + +# $(call is-android-codename,codename) +# codename is one of cupcake,donut,eclair,froyo,gingerbread,icecream +# please refer the $(codename)_SDK_VERSIONS declared above +define is-android-codename +$(strip \ + $(if \ + $(call match-word-in-list,$(PLATFORM_SDK_VERSION),$($(1)_SDK_VERSIONS)), \ + true, \ + ) \ +) +endef + +# $(call is-android-codename-in-list,cnlist) +# cnlist is combination/list of android codenames +define is-android-codename-in-list +$(strip \ + $(eval acn := $(empty)) \ + $(foreach \ + i,$(1),\ + $(eval acn += \ + $(if \ + $(call \ + match-word-in-list,\ + $(PLATFORM_SDK_VERSION),\ + $($(i)_SDK_VERSIONS)\ + ),\ + true,\ + )\ + )\ + ) \ + $(if $(strip $(acn)),true,) \ +) +endef diff --git a/core/raw_executable.mk b/core/raw_executable.mk index b64173a696a..d43bff030a7 100644 --- a/core/raw_executable.mk +++ b/core/raw_executable.mk @@ -14,7 +14,7 @@ $(all_objects) : PRIVATE_TARGET_GLOBAL_CPPFLAGS := $(LOCAL_BUILT_MODULE): $(all_objects) $(all_libraries) @$(mkdir -p $(dir $@) - @echo "target Linking: $(PRIVATE_MODULE)" + @echo -e ${CL_GRN}"target Linking:"${CL_RST}" $(PRIVATE_MODULE)" $(hide) $(TARGET_LD) \ $(addprefix --script ,$(PRIVATE_LINK_SCRIPT)) \ $(PRIVATE_RAW_EXECUTABLE_LDFLAGS) \ diff --git a/core/setup_one_odex.mk b/core/setup_one_odex.mk index ec8a28a5bd8..7d87e0e2308 100644 --- a/core/setup_one_odex.mk +++ b/core/setup_one_odex.mk @@ -18,7 +18,16 @@ # Input variables: my_2nd_arch_prefix # Output(modified) variables: built_odex, installed_odex, built_installed_odex +my_local_odex_comp := + +ifneq (false,$(WITH_DEXPREOPT_COMP)) +ifneq ($(filter %.apk,$(LOCAL_INSTALLED_MODULE)),) +my_local_odex_comp := true +endif +endif + my_built_odex := $(call get-odex-file-path,$($(my_2nd_arch_prefix)DEX2OAT_TARGET_ARCH),$(LOCAL_BUILT_MODULE)) + ifdef LOCAL_DEX_PREOPT_IMAGE_LOCATION my_dex_preopt_image_location := $(LOCAL_DEX_PREOPT_IMAGE_LOCATION) else @@ -32,8 +41,16 @@ $(my_built_odex) : $($(my_2nd_arch_prefix)DEXPREOPT_ONE_FILE_DEPENDENCY_BUILT_BO $(DEXPREOPT_ONE_FILE_DEPENDENCY_TOOLS) \ $(my_dex_preopt_image_filename) +ifeq (true,$(my_local_odex_comp)) +my_installed_odex := $(call get-odex-comp-path,$($(my_2nd_arch_prefix)DEX2OAT_TARGET_ARCH),$(LOCAL_INSTALLED_MODULE)) +else my_installed_odex := $(call get-odex-file-path,$($(my_2nd_arch_prefix)DEX2OAT_TARGET_ARCH),$(LOCAL_INSTALLED_MODULE)) +endif built_odex += $(my_built_odex) +ifeq (true,$(my_local_odex_comp)) +compressed_odex += $(my_installed_odex) +else installed_odex += $(my_installed_odex) +endif built_installed_odex += $(my_built_odex):$(my_installed_odex) diff --git a/core/static_java_library.mk b/core/static_java_library.mk index 02078e01724..b4457a7ac00 100644 --- a/core/static_java_library.mk +++ b/core/static_java_library.mk @@ -109,7 +109,7 @@ $(R_file_stamp): PRIVATE_MANIFEST_PACKAGE_NAME := $(R_file_stamp): PRIVATE_MANIFEST_INSTRUMENTATION_FOR := $(R_file_stamp) : $(all_resources) $(full_android_manifest) $(AAPT) $(framework_res_package_export_deps) - @echo "target R.java/Manifest.java: $(PRIVATE_MODULE) ($@)" + @echo -e ${CL_YLW}"target R.java/Manifest.java:"${CL_RST}" $(PRIVATE_MODULE) ($@)" $(create-resource-java-files) $(hide) find $(PRIVATE_SOURCE_INTERMEDIATES_DIR) -name R.java | xargs cat > $@ diff --git a/core/tasks/apicheck.mk b/core/tasks/apicheck.mk index 683a075ff38..f3468828ae0 100644 --- a/core/tasks/apicheck.mk +++ b/core/tasks/apicheck.mk @@ -18,7 +18,8 @@ # # skip api check for PDK buid -ifeq (,$(filter true, $(WITHOUT_CHECK_API) $(TARGET_BUILD_PDK))) +#ifeq (,$(filter true, $(WITHOUT_CHECK_API) $(TARGET_BUILD_PDK))) +ifeq (true, false) .PHONY: checkapi @@ -76,9 +77,9 @@ $(eval $(call check-api, \ .PHONY: update-public-api update-public-api: $(INTERNAL_PLATFORM_API_FILE) | $(ACP) - @echo Copying current.txt + @echo -e ${CL_GRN}"Copying current.txt"${CL_RST} $(hide) $(ACP) $(INTERNAL_PLATFORM_API_FILE) frameworks/base/api/current.txt - @echo Copying removed.txt + @echo -e ${CL_GRN}"Copying removed.txt"${CL_RST} $(hide) $(ACP) $(INTERNAL_PLATFORM_REMOVED_API_FILE) frameworks/base/api/removed.txt update-api : update-public-api diff --git a/core/tasks/boot_jars_package_check.mk b/core/tasks/boot_jars_package_check.mk deleted file mode 100644 index 188c267400a..00000000000 --- a/core/tasks/boot_jars_package_check.mk +++ /dev/null @@ -1,46 +0,0 @@ -# Copyright (C) 2014 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# -# Rules to check if classes in the boot jars are from the whitelisted packages. -# - -ifneq ($(SKIP_BOOT_JARS_CHECK),true) -ifneq ($(TARGET_BUILD_PDK),true) -ifdef PRODUCT_BOOT_JARS - -intermediates := $(call intermediates-dir-for, PACKAGING, boot-jars-package-check,,COMMON) -stamp := $(intermediates)/stamp -built_boot_jars := $(foreach j, $(PRODUCT_BOOT_JARS), \ - $(call intermediates-dir-for, JAVA_LIBRARIES, $(j),,COMMON)/classes.jar) -script := build/core/tasks/check_boot_jars/check_boot_jars.py -whitelist_file := build/core/tasks/check_boot_jars/package_whitelist.txt - -$(stamp): PRIVATE_BOOT_JARS := $(built_boot_jars) -$(stamp): PRIVATE_SCRIPT := $(script) -$(stamp): PRIVATE_WHITELIST := $(whitelist_file) -$(stamp) : $(built_boot_jars) $(script) $(whitelist_file) - @echo "Check package name for $(PRIVATE_BOOT_JARS)" - $(hide) $(PRIVATE_SCRIPT) $(PRIVATE_WHITELIST) $(PRIVATE_BOOT_JARS) - $(hide) mkdir -p $(dir $@) && touch $@ - -.PHONY: check-boot-jars -check-boot-jars : $(stamp) - -# Run check-boot-jars by default -droidcore : check-boot-jars - -endif # PRODUCT_BOOT_JARS -endif # TARGET_BUILD_PDK not true -endif # SKIP_BOOT_JARS_CHECK not true diff --git a/core/tasks/check_boot_jars/check_boot_jars.py b/core/tasks/check_boot_jars/check_boot_jars.py deleted file mode 100755 index 89d9ee82706..00000000000 --- a/core/tasks/check_boot_jars/check_boot_jars.py +++ /dev/null @@ -1,83 +0,0 @@ -#!/usr/bin/env python - -""" -Check boot jars. - -Usage: check_boot_jars.py ... -""" -import logging -import os.path -import re -import subprocess -import sys - - -# The compiled whitelist RE. -whitelist_re = None - - -def LoadWhitelist(filename): - """ Load and compile whitelist regular expressions from filename. - """ - lines = [] - with open(filename, 'r') as f: - for line in f: - line = line.strip() - if not line or line.startswith('#'): - continue - lines.append(line) - combined_re = r'^(%s)$' % '|'.join(lines) - global whitelist_re - try: - whitelist_re = re.compile(combined_re) - except re.error: - logging.exception( - 'Cannot compile package whitelist regular expression: %r', - combined_re) - whitelist_re = None - return False - return True - - -def CheckJar(jar): - """Check a jar file. - """ - # Get the list of files inside the jar file. - p = subprocess.Popen(args='jar tf %s' % jar, - stdout=subprocess.PIPE, shell=True) - stdout, _ = p.communicate() - if p.returncode != 0: - return False - items = stdout.split() - for f in items: - if f.endswith('.class'): - package_name = os.path.dirname(f) - package_name = package_name.replace('/', '.') - # Skip class without a package name - if package_name and not whitelist_re.match(package_name): - print >> sys.stderr, ('Error: %s: unknown package name of class file %s' - % (jar, f)) - return False - return True - - -def main(argv): - if len(argv) < 2: - print __doc__ - sys.exit(1) - - if not LoadWhitelist(argv[0]): - sys.exit(1) - - passed = True - for jar in argv[1:]: - if not CheckJar(jar): - passed = False - if not passed: - return 1 - - return 0 - - -if __name__ == '__main__': - main(sys.argv[1:]) diff --git a/core/tasks/check_boot_jars/package_whitelist.txt b/core/tasks/check_boot_jars/package_whitelist.txt deleted file mode 100644 index 4d6261572e4..00000000000 --- a/core/tasks/check_boot_jars/package_whitelist.txt +++ /dev/null @@ -1,214 +0,0 @@ -# Boot jar package name whitelist. -# Each line is interpreted as a regular expression. - -################################################### -# core-libart.jar -java\.awt\.font -java\.beans -java\.io -java\.lang -java\.lang\.annotation -java\.lang\.ref -java\.lang\.reflect -java\.math -java\.net -java\.nio -java\.nio\.channels -java\.nio\.channels\.spi -java\.nio\.charset -java\.nio\.charset\.spi -java\.security -java\.security\.acl -java\.security\.cert -java\.security\.interfaces -java\.security\.spec -java\.sql -java\.text -java\.util -java\.util\.concurrent -java\.util\.concurrent\.atomic -java\.util\.concurrent\.locks -java\.util\.jar -java\.util\.logging -java\.util\.prefs -java\.util\.regex -java\.util\.zip -javax\.crypto -javax\.crypto\.interfaces -javax\.crypto\.spec -javax\.net -javax\.net\.ssl -javax\.security\.auth -javax\.security\.auth\.callback -javax\.security\.auth\.login -javax\.security\.auth\.x500 -javax\.security\.cert -javax\.sql -javax\.xml -javax\.xml\.datatype -javax\.xml\.namespace -javax\.xml\.parsers -javax\.xml\.transform -javax\.xml\.transform\.dom -javax\.xml\.transform\.sax -javax\.xml\.transform\.stream -javax\.xml\.validation -javax\.xml\.xpath -sun\.misc -org\.w3c\.dom -org\.w3c\.dom\.ls -org\.w3c\.dom\.traversal - -# TODO: Move these internal org.apache.harmony classes to libcore.* -org\.apache\.harmony\.crypto\.internal -org\.apache\.harmony\.dalvik -org\.apache\.harmony\.dalvik\.ddmc -org\.apache\.harmony\.luni\.internal\.util -org\.apache\.harmony\.security -org\.apache\.harmony\.security\.asn1 -org\.apache\.harmony\.security\.fortress -org\.apache\.harmony\.security\.pkcs10 -org\.apache\.harmony\.security\.pkcs7 -org\.apache\.harmony\.security\.pkcs8 -org\.apache\.harmony\.security\.provider\.crypto -org\.apache\.harmony\.security\.utils -org\.apache\.harmony\.security\.x501 -org\.apache\.harmony\.security\.x509 -org\.apache\.harmony\.security\.x509\.tsp -org\.apache\.harmony\.xml -org\.apache\.harmony\.xml\.dom -org\.apache\.harmony\.xml\.parsers - -org\.json -org\.xmlpull\.v1 -org\.xmlpull\.v1\.sax2 - -# TODO: jarjar org.kxml2.io to com.android org\.kxml2\.io -org\.kxml2\.io -org\.xml -org\.xml\.sax -org\.xml\.sax\.ext -org\.xml\.sax\.helpers - -dalvik\..* -libcore\..* -android\..* -com\.android\..* - - -################################################### -# core-junit.jar -junit\.extensions -junit\.framework - - -################################################### -# ext.jar -# TODO: jarjar javax.sip to com.android -javax\.sip -javax\.sip\.address -javax\.sip\.header -javax\.sip\.message - -# TODO: jarjar org.apache.commons to com.android -org\.apache\.commons\.codec -org\.apache\.commons\.codec\.binary -org\.apache\.commons\.codec\.language -org\.apache\.commons\.codec\.net -org\.apache\.commons\.logging -org\.apache\.commons\.logging\.impl -org\.apache\.http -org\.apache\.http\.auth -org\.apache\.http\.auth\.params -org\.apache\.http\.client -org\.apache\.http\.client\.entity -org\.apache\.http\.client\.methods -org\.apache\.http\.client\.params -org\.apache\.http\.client\.protocol -org\.apache\.http\.client\.utils -org\.apache\.http\.conn -org\.apache\.http\.conn\.params -org\.apache\.http\.conn\.routing -org\.apache\.http\.conn\.scheme -org\.apache\.http\.conn\.ssl -org\.apache\.http\.conn\.util -org\.apache\.http\.cookie -org\.apache\.http\.cookie\.params -org\.apache\.http\.entity -org\.apache\.http\.impl -org\.apache\.http\.impl\.auth -org\.apache\.http\.impl\.client -org\.apache\.http\.impl\.client -org\.apache\.http\.impl\.conn -org\.apache\.http\.impl\.conn\.tsccm -org\.apache\.http\.impl\.cookie -org\.apache\.http\.impl\.entity -org\.apache\.http\.impl\.io -org\.apache\.http\.impl\.io -org\.apache\.http\.io -org\.apache\.http\.message -org\.apache\.http\.params -org\.apache\.http\.protocol -org\.apache\.http\.util - -# TODO: jarjar gov.nist to com.android -gov\.nist\.core -gov\.nist\.core\.net -gov\.nist\.javax\.sip -gov\.nist\.javax\.sip\.address -gov\.nist\.javax\.sip\.clientauthutils -gov\.nist\.javax\.sip\.header -gov\.nist\.javax\.sip\.header\.extensions -gov\.nist\.javax\.sip\.header\.ims -gov\.nist\.javax\.sip\.message -gov\.nist\.javax\.sip\.parser -gov\.nist\.javax\.sip\.parser\.extensions -gov\.nist\.javax\.sip\.parser\.ims -gov\.nist\.javax\.sip\.stack - -org\.ccil\.cowan\.tagsoup -org\.ccil\.cowan\.tagsoup\.jaxp - -################################################### -# framework.jar -javax\.microedition\.khronos\.opengles -javax\.microedition\.khronos\.egl - -android - - -################################################### -# telephony-common.jar -com\.google\..* - - -################################################### -# apache-xml.jar -org\.apache\.xml\.res -org\.apache\.xml\.utils -org\.apache\.xml\.utils\.res -org\.apache\.xml\.dtm -org\.apache\.xml\.dtm\.ref -org\.apache\.xml\.dtm\.ref\.dom2dtm -org\.apache\.xml\.dtm\.ref\.sax2dtm -org\.apache\.xml\.serializer -org\.apache\.xml\.serializer\.utils -org\.apache\.xml\.serializer\.dom3 -org\.apache\.xpath -org\.apache\.xpath\.operations -org\.apache\.xpath\.domapi -org\.apache\.xpath\.functions -org\.apache\.xpath\.res -org\.apache\.xpath\.axes -org\.apache\.xpath\.objects -org\.apache\.xpath\.patterns -org\.apache\.xpath\.jaxp -org\.apache\.xpath\.compiler -org\.apache\.xalan -org\.apache\.xalan\.res -org\.apache\.xalan\.templates -org\.apache\.xalan\.serialize -org\.apache\.xalan\.extensions -org\.apache\.xalan\.processor -org\.apache\.xalan\.transformer -org\.apache\.xalan\.xslt diff --git a/core/tasks/collect_gpl_sources.mk b/core/tasks/collect_gpl_sources.mk index 30ba62b6091..fc03f48b77e 100644 --- a/core/tasks/collect_gpl_sources.mk +++ b/core/tasks/collect_gpl_sources.mk @@ -17,7 +17,7 @@ gpl_source_tgz := $(call intermediates-dir-for,PACKAGING,gpl_source,HOST,COMMON) # FORCE since we can't know whether any of the sources changed $(gpl_source_tgz): PRIVATE_PATHS := $(sort $(patsubst %/, %, $(dir $(ALL_GPL_MODULE_LICENSE_FILES)))) $(gpl_source_tgz) : $(ALL_GPL_MODULE_LICENSE_FILES) FORCE - @echo Package gpl sources: $@ + @echo -e ${CL_GRN}"Package gpl sources:"${CL_RST}" $@" @rm -rf $(dir $@) && mkdir -p $(dir $@) $(hide) tar cfz $@ --exclude ".git*" $(PRIVATE_PATHS) diff --git a/core/tasks/dt_image.mk b/core/tasks/dt_image.mk new file mode 100644 index 00000000000..dbf6dbf6a70 --- /dev/null +++ b/core/tasks/dt_image.mk @@ -0,0 +1,36 @@ +#---------------------------------------------------------------------- +# Generate device tree image (dt.img) +#---------------------------------------------------------------------- +ifndef BOARD_CUSTOM_BOOTIMG_MK +ifeq ($(strip $(BOARD_KERNEL_SEPARATED_DT)),true) +ifeq ($(strip $(BUILD_TINY_ANDROID)),true) +include device/qcom/common/dtbtool/Android.mk +endif + +ifeq ($(strip $(TARGET_CUSTOM_DTBTOOL)),) +DTBTOOL_NAME := dtbToolCM +else +DTBTOOL_NAME := $(TARGET_CUSTOM_DTBTOOL) +endif + +DTBTOOL := $(HOST_OUT_EXECUTABLES)/$(DTBTOOL_NAME)$(HOST_EXECUTABLE_SUFFIX) + +INSTALLED_DTIMAGE_TARGET := $(PRODUCT_OUT)/dt.img + +possible_dtb_dirs = $(KERNEL_OUT)/arch/$(TARGET_KERNEL_ARCH)/boot/dts/ $(KERNEL_OUT)/arch/arm/boot/ +dtb_dir = $(firstword $(wildcard $(possible_dtb_dirs))) + +define build-dtimage-target + $(call pretty,"Target dt image: $@") + $(hide) $(DTBTOOL) $(BOARD_DTBTOOL_ARGS) -o $@ -s $(BOARD_KERNEL_PAGESIZE) -p $(KERNEL_OUT)/scripts/dtc/ $(dtb_dir) + $(hide) chmod a+r $@ +endef + +$(INSTALLED_DTIMAGE_TARGET): $(DTBTOOL) $(INSTALLED_KERNEL_TARGET) + $(build-dtimage-target) + @echo -e ${CL_CYN}"Made DT image: $@"${CL_RST} + +ALL_DEFAULT_INSTALLED_MODULES += $(INSTALLED_DTIMAGE_TARGET) +ALL_MODULES.$(LOCAL_MODULE).INSTALLED += $(INSTALLED_DTIMAGE_TARGET) +endif +endif diff --git a/core/tasks/kernel.mk b/core/tasks/kernel.mk new file mode 100644 index 00000000000..6e4652e6588 --- /dev/null +++ b/core/tasks/kernel.mk @@ -0,0 +1,304 @@ +# Copyright (C) 2012 The CyanogenMod Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Android makefile to build kernel as a part of Android Build + +TARGET_AUTO_KDIR := $(shell echo $(TARGET_DEVICE_DIR) | sed -e 's/^device/kernel/g') + +## Externally influenced variables +# kernel location - optional, defaults to kernel// +TARGET_KERNEL_SOURCE ?= $(TARGET_AUTO_KDIR) +KERNEL_SRC := $(TARGET_KERNEL_SOURCE) +# kernel configuration - mandatory +KERNEL_DEFCONFIG := $(TARGET_KERNEL_CONFIG) +VARIANT_DEFCONFIG := $(TARGET_KERNEL_VARIANT_CONFIG) +SELINUX_DEFCONFIG := $(TARGET_KERNEL_SELINUX_CONFIG) + +## Internal variables +KERNEL_OUT := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ +KERNEL_CONFIG := $(KERNEL_OUT)/.config + +KERNEL_HEADERS_INSTALL := $(KERNEL_OUT)/usr +KERNEL_MODULES_INSTALL := system +KERNEL_MODULES_OUT := $(TARGET_OUT)/lib/modules + +ifneq ($(TARGET_KERNEL_UBUNTU_PPA_TEAM),) + PULL_LP_BIN_EXTRA_OPTS := -t $(TARGET_KERNEL_UBUNTU_PPA_TEAM) -p $(TARGET_KERNEL_UBUNTU_PPA_NAME) +endif +TARGET_OUT_UBUNTU_KERNEL := $(TARGET_OUT_UBUNTU)/kernel + +ifeq ($(TARGET_ARCH),x86) +TARGET_UBUNTU_ARCH := i386 +else +TARGET_UBUNTU_ARCH := armhf +endif + +ifneq ($(BOARD_KERNEL_IMAGE_NAME),) + TARGET_PREBUILT_INT_KERNEL_TYPE := $(BOARD_KERNEL_IMAGE_NAME) + TARGET_PREBUILT_INT_KERNEL := $(KERNEL_OUT)/arch/$(TARGET_ARCH)/boot/$(TARGET_PREBUILT_INT_KERNEL_TYPE) +else + TARGET_PREBUILT_INT_KERNEL := $(KERNEL_OUT)/arch/$(TARGET_ARCH)/boot/zImage + TARGET_PREBUILT_INT_KERNEL_TYPE := zImage +endif + +## Do be discontinued in a future version. Notify builder about target +## kernel format requirement +ifeq ($(BOARD_KERNEL_IMAGE_NAME),) +ifeq ($(BOARD_USES_UBOOT),true) + $(error "Please set BOARD_KERNEL_IMAGE_NAME to uImage") +else ifeq ($(BOARD_USES_UNCOMPRESSED_BOOT),true) + $(error "Please set BOARD_KERNEL_IMAGE_NAME to Image") +endif +endif + +ifeq ($(TARGET_KERNEL_UBUNTU),true) + ifneq ($(TARGET_PREBUILT_INT_KERNEL_TYPE),zImage) + $(warning ***************************************************************) + $(warning * At the moment only zImage kernel is supported when fetching *) + $(warning * kernel from the Ubuntu archive. Make sure your device does *) + $(warning * not use BOARD_USES_UBOOT or BOARD_USES_UNCOMPRESSED_BOOT *) + $(warning ***************************************************************) + $(error "INCOMPATIBLE KERNEL TYPE") + endif + + ifneq ($(TARGET_KERNEL_UBUNTU_META),) + NEEDS_KERNEL_COPY := true + FETCH_KERNEL_UBUNTU := true + FULL_KERNEL_BUILD := false + KERNEL_BIN := $(TARGET_OUT_UBUNTU_KERNEL)/vmlinuz + else + $(warning ***************************************************************) + $(warning * As the Ubuntu kernel package ABI version in part of the *) + $(warning * package name, a meta package is used to track the latest *) + $(warning * version available in the archive. Please make that the *) + $(warning * required meta package is available and defined by the *) + $(warning * variable TARGET_KERNEL_UBUNTU_META *) + $(warning ***************************************************************) + $(error "MISSING TARGET_KERNEL_UBUNTU_META") + endif +else ifeq "$(wildcard $(KERNEL_SRC) )" "" + ifneq ($(TARGET_PREBUILT_KERNEL),) + HAS_PREBUILT_KERNEL := true + NEEDS_KERNEL_COPY := true + else + $(foreach cf,$(PRODUCT_COPY_FILES), \ + $(eval _src := $(call word-colon,1,$(cf))) \ + $(eval _dest := $(call word-colon,2,$(cf))) \ + $(ifeq kernel,$(_dest), \ + $(eval HAS_PREBUILT_KERNEL := true))) + endif + + ifneq ($(HAS_PREBUILT_KERNEL),) + $(warning ***************************************************************) + $(warning * Using prebuilt kernel binary instead of source *) + $(warning * THIS IS DEPRECATED, AND WILL BE DISCONTINUED *) + $(warning * Please configure your device to download the kernel *) + $(warning * source repository to $(KERNEL_SRC)) + $(warning * See http://wiki.cyanogenmod.org/w/Doc:_integrated_kernel_building) + $(warning * for more information *) + $(warning ***************************************************************) + FULL_KERNEL_BUILD := false + KERNEL_BIN := $(TARGET_PREBUILT_KERNEL) + else + $(warning ***************************************************************) + $(warning * *) + $(warning * No kernel source found, and no fallback prebuilt defined. *) + $(warning * Please make sure your device is properly configured to *) + $(warning * download the kernel repository to $(KERNEL_SRC)) + $(warning * and add the TARGET_KERNEL_CONFIG variable to BoardConfig.mk *) + $(warning * *) + $(warning * As an alternative, define the TARGET_PREBUILT_KERNEL *) + $(warning * variable with the path to the prebuilt binary kernel image *) + $(warning * in your BoardConfig.mk file *) + $(warning * *) + $(warning ***************************************************************) + $(error "NO KERNEL") + endif +else + NEEDS_KERNEL_COPY := true + ifeq ($(TARGET_KERNEL_CONFIG),) + $(warning **********************************************************) + $(warning * Kernel source found, but no configuration was defined *) + $(warning * Please add the TARGET_KERNEL_CONFIG variable to your *) + $(warning * BoardConfig.mk file *) + $(warning **********************************************************) + # $(error "NO KERNEL CONFIG") + else + FULL_KERNEL_BUILD := true + ifneq ($(BOARD_KERNEL_IMAGE_NAME),) + TARGET_PREBUILT_INT_KERNEL_TYPE := $(BOARD_KERNEL_IMAGE_NAME) + else + ifeq ($(TARGET_USES_UNCOMPRESSED_KERNEL),true) + TARGET_PREBUILT_INT_KERNEL_TYPE := Image + else + ifeq ($(KERNEL_ARCH),arm64) + TARGET_PREBUILT_INT_KERNEL_TYPE := Image.gz + else + TARGET_PREBUILT_INT_KERNEL_TYPE := zImage + endif + endif + endif + KERNEL_BIN := $(TARGET_PREBUILT_INT_KERNEL) + endif +endif + +ifeq ($(FETCH_KERNEL_UBUNTU),true) +## Also install the kernel headers if the source is available +$(KERNEL_HEADERS_INSTALL): + if [ -f $(KERNEL_SRC)/Makefile ]; then \ + mkdir -p $(KERNEL_OUT); \ + $(MAKE) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(TARGET_ARCH) $(ARM_CROSS_COMPILE) headers_install; \ + fi + +.PHONY: $(TARGET_OUT_UBUNTU_KERNEL) +$(TARGET_OUT_UBUNTU_KERNEL): + $(hide) rm -rf $(TARGET_OUT_UBUNTU_KERNEL) + $(hide) rm -rf $(KERNEL_MODULES_OUT) + $(hide) mkdir -p $(TARGET_OUT_UBUNTU_KERNEL) + $(hide) mkdir -p $(KERNEL_MODULES_OUT) + $(hide) mkdir -p $(TARGET_OUT)/boot + +.PHONY: $(TARGET_OUT_UBUNTU_KERNEL)/vmlinuz +$(TARGET_OUT_UBUNTU_KERNEL)/vmlinuz: $(TARGET_OUT_UBUNTU_KERNEL) $(KERNEL_HEADERS_INSTALL) + $(hide) $(PULL_LP_BIN) $(PULL_LP_BIN_EXTRA_OPTS) $(TARGET_KERNEL_UBUNTU_META) -o $(TARGET_OUT_UBUNTU_KERNEL) -a $(TARGET_UBUNTU_ARCH) $(TARGET_KERNEL_UBUNTU_SERIES) + $(hide) IFS=", "; for dep in \ + `dpkg-deb -f $(TARGET_OUT_UBUNTU_KERNEL)/$(TARGET_KERNEL_UBUNTU_META)_*.deb Depends`; do \ + if echo $$dep | grep -q "linux-image-"; then \ + kernel_image=$$dep; \ + fi; \ + done; \ + if [ -n "$$kernel_image" ]; then \ + $(PULL_LP_BIN) $(PULL_LP_BIN_EXTRA_OPTS) $$kernel_image -o $(TARGET_OUT_UBUNTU_KERNEL) -a $(TARGET_UBUNTU_ARCH) $(TARGET_KERNEL_UBUNTU_SERIES); \ + dpkg-deb -x $(TARGET_OUT_UBUNTU_KERNEL)/linux-image-[0-9]*.deb $(TARGET_OUT_UBUNTU_KERNEL); \ + kernel_version=$${kernel_image#linux-image-}; \ + cp -v $(TARGET_OUT_UBUNTU_KERNEL)/boot/vmlinuz-$$kernel_version $(TARGET_OUT_UBUNTU_KERNEL)/vmlinuz; \ + cp -a $(TARGET_OUT_UBUNTU_KERNEL)/boot/*-$$kernel_version $(TARGET_OUT)/boot/; \ + cp -a $(TARGET_OUT_UBUNTU_KERNEL)/lib/modules/$$kernel_version $(KERNEL_MODULES_OUT); \ + depmod -a -b $(TARGET_OUT) $$kernel_version; \ + else \ + echo -n "Unable to find a valid linux-image dependency from "; \ + echo "the meta package $(TARGET_KERNEL_UBUNTU_META), aborting."; \ + exit 1; \ + fi; + +else ifeq ($(FULL_KERNEL_BUILD),true) + +define clean-module-folder + mdpath=`find $(KERNEL_MODULES_OUT) -type f -name modules.order`;\ + if [ "$$mdpath" != "" ];then\ + mpath=`dirname $$mdpath`; rm -rf $$mpath;\ + fi +endef + +ifeq ($(TARGET_ARCH),$(filter $(TARGET_ARCH),arm arm64)) + ifneq ($(USE_CCACHE),) + # search executable + ccache = + ifneq ($(strip $(wildcard $(ANDROID_BUILD_TOP)/prebuilts/misc/$(HOST_PREBUILT_EXTRA_TAG)/ccache/ccache)),) + ccache := $(ANDROID_BUILD_TOP)/prebuilts/misc/$(HOST_PREBUILT_EXTRA_TAG)/ccache/ccache + else + ifneq ($(strip $(wildcard $(ANDROID_BUILD_TOP)/prebuilts/misc/$(HOST_PREBUILT_TAG)/ccache/ccache)),) + ccache := $(ANDROID_BUILD_TOP)/prebuilts/misc/$(HOST_PREBUILT_TAG)/ccache/ccache + endif + endif + endif + ifneq ($(TARGET_KERNEL_CUSTOM_TOOLCHAIN),) + ifeq ($(HOST_OS),darwin) + ifeq ($(TARGET_ARCH),arm64) + TARGET_KERNEL_CROSS_COMPILE_PREFIX:=aarch64-linux-android- + TARGET_KERNEL_CROSS_COMPILE_TOOLCHAIN_PATH:=$(ANDROID_BUILD_TOP)/prebuilt/darwin-x86/toolchain/$(TARGET_KERNEL_CUSTOM_TOOLCHAIN)/bin/ + else + TARGET_KERNEL_CROSS_COMPILE_PREFIX:=arm-eabi- + TARGET_KERNEL_CROSS_COMPILE_TOOLCHAIN_PATH:=$(ANDROID_BUILD_TOP)/prebuilt/darwin-x86/toolchain/$(TARGET_KERNEL_CUSTOM_TOOLCHAIN)/bin/ + endif + else + ifeq ($(TARGET_ARCH),arm64) + TARGET_KERNEL_CROSS_COMPILE_PREFIX:=aarch64-linux-android- + TARGET_KERNEL_CROSS_COMPILE_TOOLCHAIN_PATH:=$(ANDROID_BUILD_TOP)/prebuilt/linux-x86/toolchain/$(TARGET_KERNEL_CUSTOM_TOOLCHAIN)/bin/ + else + TARGET_KERNEL_CROSS_COMPILE_PREFIX:=arm-eabi- + TARGET_KERNEL_CROSS_COMPILE_TOOLCHAIN_PATH:=$(ANDROID_BUILD_TOP)/prebuilt/linux-x86/toolchain/$(TARGET_KERNEL_CUSTOM_TOOLCHAIN)/bin/ + endif + endif + else + ifeq ($(TARGET_ARCH),arm64) + ifeq ($(TARGET_KERNEL_CROSS_COMPILE_PREFIX),) + TARGET_KERNEL_CROSS_COMPILE_PREFIX:=aarch64-linux-android- + endif + else + TARGET_KERNEL_CROSS_COMPILE_PREFIX:=arm-eabi- + TARGET_KERNEL_CROSS_COMPILE_TOOLCHAIN_PATH:=$(ARM_EABI_TOOLCHAIN) + endif + endif + ARM_CROSS_COMPILE:=CROSS_COMPILE="$(ccache) $(TARGET_KERNEL_CROSS_COMPILE_TOOLCHAIN_PATH)/$(TARGET_KERNEL_CROSS_COMPILE_PREFIX)" + ccache = +endif + +define mv-modules + mdpath=`find $(KERNEL_MODULES_OUT) -type f -name modules.order`;\ + if [ "$$mdpath" != "" ];then\ + mpath=`dirname $$mdpath`;\ + ko=`find $$mpath/kernel -type f -name *.ko`;\ + for i in $$ko; do $(TARGET_KERNEL_CROSS_COMPILE_TOOLCHAIN_PATH)/$(TARGET_KERNEL_CROSS_COMPILE_PREFIX)strip --strip-unneeded $$i;\ + mv $$i $(KERNEL_MODULES_OUT)/; done;\ + fi +endef + +ifeq ($(HOST_OS),darwin) + MAKE_FLAGS := C_INCLUDE_PATH=$(ANDROID_BUILD_TOP)/external/elfutils/libelf +endif + +ifeq ($(TARGET_KERNEL_MODULES),) + TARGET_KERNEL_MODULES := no-external-modules +endif + +$(KERNEL_OUT): + mkdir -p $(KERNEL_OUT) + mkdir -p $(KERNEL_MODULES_OUT) + +$(KERNEL_CONFIG): $(KERNEL_OUT) + $(MAKE) $(MAKE_FLAGS) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(TARGET_ARCH) $(ARM_CROSS_COMPILE) VARIANT_DEFCONFIG=$(VARIANT_DEFCONFIG) SELINUX_DEFCONFIG=$(SELINUX_DEFCONFIG) $(KERNEL_DEFCONFIG) + +$(KERNEL_OUT)/piggy : $(TARGET_PREBUILT_INT_KERNEL) + $(hide) gunzip -c $(KERNEL_OUT)/arch/$(TARGET_ARCH)/boot/compressed/piggy.gzip > $(KERNEL_OUT)/piggy + +TARGET_KERNEL_BINARIES: $(KERNEL_OUT) $(KERNEL_CONFIG) $(KERNEL_HEADERS_INSTALL) + $(MAKE) $(MAKE_FLAGS) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(TARGET_ARCH) $(ARM_CROSS_COMPILE) $(TARGET_PREBUILT_INT_KERNEL_TYPE) + -$(MAKE) $(MAKE_FLAGS) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(TARGET_ARCH) $(ARM_CROSS_COMPILE) dtbs + -$(MAKE) $(MAKE_FLAGS) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(TARGET_ARCH) $(ARM_CROSS_COMPILE) modules + -$(MAKE) $(MAKE_FLAGS) -C $(KERNEL_SRC) O=$(KERNEL_OUT) INSTALL_MOD_PATH=../../$(KERNEL_MODULES_INSTALL) ARCH=$(TARGET_ARCH) $(ARM_CROSS_COMPILE) modules_install + $(mv-modules) + $(clean-module-folder) + +$(TARGET_KERNEL_MODULES): TARGET_KERNEL_BINARIES + +$(TARGET_PREBUILT_INT_KERNEL): $(TARGET_KERNEL_MODULES) + $(mv-modules) + $(clean-module-folder) + +$(KERNEL_HEADERS_INSTALL): $(KERNEL_OUT) $(KERNEL_CONFIG) + $(MAKE) $(MAKE_FLAGS) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(TARGET_ARCH) $(ARM_CROSS_COMPILE) headers_install + +endif # FULL_KERNEL_BUILD + +## Install it + +ifeq ($(NEEDS_KERNEL_COPY),true) +file := $(INSTALLED_KERNEL_TARGET) +ALL_PREBUILT += $(file) +$(file) : $(KERNEL_BIN) | $(ACP) + $(transform-prebuilt-to-target) + +ALL_PREBUILT += $(INSTALLED_KERNEL_TARGET) +endif diff --git a/core/tasks/oem_image.mk b/core/tasks/oem_image.mk index 26b9aba018a..c68a341bcea 100644 --- a/core/tasks/oem_image.mk +++ b/core/tasks/oem_image.mk @@ -15,7 +15,16 @@ # # We build oem.img only if it's asked for. +skip_oem_image := true ifneq ($(filter $(MAKECMDGOALS),oem_image),) + skip_oem_image := false +endif + +ifneq ($(BOARD_OEMIMAGE_FILE_SYSTEM_TYPE),) + skip_oem_image := false +endif + +ifneq ($(skip_oem_image),true) ifndef BOARD_OEMIMAGE_PARTITION_SIZE $(error BOARD_OEMIMAGE_PARTITION_SIZE is not set.) endif @@ -43,4 +52,4 @@ $(INSTALLED_OEMIMAGE_TARGET) : $(INTERNAL_USERIMAGES_DEPS) $(INTERNAL_OEMIMAGE_F oem_image : $(INSTALLED_OEMIMAGE_TARGET) $(call dist-for-goals, oem_image, $(INSTALLED_OEMIMAGE_TARGET)) -endif # oem_image in $(MAKECMDGOALS) +endif diff --git a/core/tasks/product-graph.mk b/core/tasks/product-graph.mk index fcec27775dc..c209b458c6b 100644 --- a/core/tasks/product-graph.mk +++ b/core/tasks/product-graph.mk @@ -61,7 +61,7 @@ define emit-product-node-props $(hide) echo \"$(1)\" [ \ label=\"$(dir $(1))\\n$(notdir $(1))\\n\\n$(subst $(close_parenthesis),,$(subst $(open_parethesis),,$(PRODUCTS.$(strip $(1)).PRODUCT_MODEL)))\\n$(PRODUCTS.$(strip $(1)).PRODUCT_DEVICE)\" \ $(if $(filter $(1),$(PRIVATE_PRODUCTS_FILTER)), style=\"filled\" fillcolor=\"#FFFDB0\",) \ -fontcolor=\"darkblue\" href=\"products/$(1).html\" \ +colorscheme=\"svg\" fontcolor=\"darkblue\" href=\"products/$(1).html\" \ ] >> $(2) endef @@ -70,7 +70,7 @@ $(products_graph): PRIVATE_PRODUCTS := $(really_all_products) $(products_graph): PRIVATE_PRODUCTS_FILTER := $(products_list) $(products_graph): $(this_makefile) - @echo Product graph DOT: $@ for $(PRIVATE_PRODUCTS_FILTER) + @echo -e ${CL_GRN}"Product graph DOT:"${CL_RST}" $@ for $(PRIVATE_PRODUCTS_FILTER)" $(hide) echo 'digraph {' > $@.in $(hide) echo 'graph [ ratio=.5 ];' >> $@.in $(hide) $(foreach p,$(PRIVATE_PRODUCTS), \ @@ -89,7 +89,7 @@ endef # $(1) product file define transform-product-debug $(OUT_DIR)/products/$(strip $(1)).txt: $(this_makefile) - @echo Product debug info file: $$@ + @echo -e ${CL_GRN}"Product debug info file:"${CL_RST}" $$@" $(hide) rm -f $$@ $(hide) mkdir -p $$(dir $$@) $(hide) echo 'FILE=$(strip $(1))' >> $$@ @@ -105,6 +105,7 @@ $(OUT_DIR)/products/$(strip $(1)).txt: $(this_makefile) $(hide) echo 'PRODUCT_DEFAULT_PROPERTY_OVERRIDES=$$(PRODUCTS.$(strip $(1)).PRODUCT_DEFAULT_PROPERTY_OVERRIDES)' >> $$@ $(hide) echo 'PRODUCT_CHARACTERISTICS=$$(PRODUCTS.$(strip $(1)).PRODUCT_CHARACTERISTICS)' >> $$@ $(hide) echo 'PRODUCT_COPY_FILES=$$(PRODUCTS.$(strip $(1)).PRODUCT_COPY_FILES)' >> $$@ + $(hide) echo 'PRODUCT_COPY_FILES_OVERRIDES=$$(PRODUCTS.$(strip $(1)).PRODUCT_COPY_FILES_OVERRIDES)' >> $$@ $(hide) echo 'PRODUCT_OTA_PUBLIC_KEYS=$$(PRODUCTS.$(strip $(1)).PRODUCT_OTA_PUBLIC_KEYS)' >> $$@ $(hide) echo 'PRODUCT_EXTRA_RECOVERY_KEYS=$$(PRODUCTS.$(strip $(1)).PRODUCT_EXTRA_RECOVERY_KEYS)' >> $$@ $(hide) echo 'PRODUCT_PACKAGE_OVERLAYS=$$(PRODUCTS.$(strip $(1)).PRODUCT_PACKAGE_OVERLAYS)' >> $$@ @@ -124,7 +125,7 @@ $(call product-debug-filename, $(p)): \ $(OUT_DIR)/products/$(strip $(1)).txt \ build/tools/product_debug.py \ $(this_makefile) - @echo Product debug html file: $$@ + @echo -e ${CL_GRN}"Product debug html file:"${CL_RST}" $$@" $(hide) mkdir -p $$(dir $$@) $(hide) cat $$< | build/tools/product_debug.py > $$@ endef @@ -136,11 +137,11 @@ $(foreach p,$(really_all_products), \ ) $(products_pdf): $(products_graph) - @echo Product graph PDF: $@ + @echo -e ${CL_GRN}"Product graph PDF:"${CL_RST}" $@" dot -Tpdf -Nshape=box -o $@ $< $(products_svg): $(products_graph) $(product_debug_files) - @echo Product graph SVG: $@ + @echo -e ${CL_GRN}"Product graph SVG:"${CL_RST}" $@" dot -Tsvg -Nshape=box -o $@ $< product-graph: $(products_pdf) $(products_svg) diff --git a/core/tasks/sdk-addon.mk b/core/tasks/sdk-addon.mk index 5ac9b7d47b0..620c50cd001 100644 --- a/core/tasks/sdk-addon.mk +++ b/core/tasks/sdk-addon.mk @@ -105,7 +105,7 @@ $(full_target): PRIVATE_DOCS_DIRS := $(addprefix $(OUT_DOCS)/, $(doc_modules)) $(full_target): PRIVATE_STAGING_DIR := $(call append-path,$(staging),$(addon_dir_leaf)) $(full_target): $(sdk_addon_deps) | $(ACP) - @echo Packaging SDK Addon: $@ + @echo -e ${CL_GRN}"Packaging SDK Addon:"${CL_RST}" $@" $(hide) mkdir -p $(PRIVATE_STAGING_DIR)/docs $(hide) for d in $(PRIVATE_DOCS_DIRS); do \ $(ACP) -r $$d $(PRIVATE_STAGING_DIR)/docs ;\ diff --git a/core/version_defaults.mk b/core/version_defaults.mk index d87a032386f..b133c5ec12a 100644 --- a/core/version_defaults.mk +++ b/core/version_defaults.mk @@ -24,6 +24,7 @@ # DEFAULT_APP_TARGET_SDK # BUILD_ID # BUILD_NUMBER +# SECURITY_PATCH # # Look for an optional file containing overrides of the defaults, @@ -41,7 +42,7 @@ ifeq "" "$(PLATFORM_VERSION)" # which is the version that we reveal to the end user. # Update this value when the platform version changes (rather # than overriding it somewhere else). Can be an arbitrary string. - PLATFORM_VERSION := 5.1 + PLATFORM_VERSION := 5.1.1 endif ifeq "" "$(PLATFORM_SDK_VERSION)" @@ -80,6 +81,22 @@ ifeq "" "$(DEFAULT_APP_TARGET_SDK)" endif endif +ifeq "" "$(PLATFORM_SECURITY_PATCH)" + # Used to indicate the security patch that has been applied to the device. + # Can be an arbitrary string, but must be a single word. + # + # If there is no $PLATFORM_SECURITY_PATCH set, keep it empty. + PLATFORM_SECURITY_PATCH := 2015-10-01 +endif + +ifeq "" "$(PLATFORM_BASE_OS)" + # Used to indicate the base os applied to the device. + # Can be an arbitrary string, but must be a single word. + # + # If there is no $PLATFORM_BASE_OS set, keep it empty. + PLATFORM_BASE_OS := +endif + ifeq "" "$(BUILD_ID)" # Used to signify special builds. E.g., branches and/or releases, # like "M5-RC7". Can be an arbitrary string, but must be a single diff --git a/envsetup.sh b/envsetup.sh index d80e95c39bb..5de6aaeb787 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -4,11 +4,14 @@ Invoke ". build/envsetup.sh" from your shell to add the following functions to y - lunch: lunch - - tapas: tapas [ ...] [arm|x86|mips|armv5|arm64|x86_64|mips64] [eng|userdebug|user] - croot: Changes directory to the top of the tree. +- cout: Changes directory to out. - m: Makes from the top of the tree. - mm: Builds all of the modules in the current directory, but not their dependencies. - mmm: Builds all of the modules in the supplied directories, but not their dependencies. To limit the modules being built use the syntax: mmm dir/:target1,target2. - mma: Builds all of the modules in the current directory, and their dependencies. +- mmp: Builds all of the modules in the current directory and pushes them to the device. +- mmmp: Builds all of the modules in the supplied directories and pushes them to the device. - mmma: Builds all of the modules in the supplied directories, and their dependencies. - cgrep: Greps on all local C/C++ files. - ggrep: Greps on all local Gradle files. @@ -16,16 +19,26 @@ Invoke ". build/envsetup.sh" from your shell to add the following functions to y - resgrep: Greps on all local res/*.xml files. - sgrep: Greps on all local source files. - godir: Go to the directory containing a file. +- cmremote: Add git remote for CM Gerrit Review +- cmgerrit: A Git wrapper that fetches/pushes patch from/to CM Gerrit Review +- cmrebase: Rebase a Gerrit change and push it again +- aospremote: Add git remote for matching AOSP repository +- cafremote: Add git remote for matching CodeAurora repository. +- mka: Builds using SCHED_BATCH on all processors +- mkap: Builds the module(s) using mka and pushes them to the device. +- cmka: Cleans and builds using mka. +- repolastsync: Prints date and time of last repo sync. +- reposync: Parallel repo sync using ionice and SCHED_BATCH +- repopick: Utility to fetch changes from Gerrit. +- installboot: Installs a boot.img to the connected device. +- installrecovery: Installs a recovery.img to the connected device. Look at the source to view more functions. The complete list is: EOF T=$(gettop) - local A - A="" for i in `cat $T/build/envsetup.sh | sed -n "/^[ \t]*function /s/function \([a-z_]*\).*/\1/p" | sort | uniq`; do - A="$A $i" - done - echo $A + echo "$i" + done | column } # Get the value of a build variable as an absolute path. @@ -60,6 +73,15 @@ function check_product() echo "Couldn't locate the top of the tree. Try setting TOP." >&2 return fi + + if (echo -n $1 | grep -q -e "^cm_") ; then + CM_BUILD=$(echo -n $1 | sed -e 's/^cm_//g') + export BUILD_NUMBER=$((date +%s%N ; echo $CM_BUILD; hostname) | openssl sha1 | sed -e 's/.*=//g; s/ //g' | cut -c1-10) + else + CM_BUILD= + fi + export CM_BUILD + TARGET_PRODUCT=$1 \ TARGET_BUILD_VARIANT= \ TARGET_BUILD_TYPE= \ @@ -206,6 +228,10 @@ function setpaths() unset ANDROID_HOST_OUT export ANDROID_HOST_OUT=$(get_abs_build_var HOST_OUT) + if [ -n "$ANDROID_CCACHE_DIR" ]; then + export CCACHE_DIR=$ANDROID_CCACHE_DIR + fi + # needed for building linux on MacOS # TODO: fix the path #export HOST_EXTRACFLAGS="-I "$T/system/kernel_headers/host_include @@ -228,7 +254,6 @@ function set_stuff_for_environment() setpaths set_sequence_number - export ANDROID_BUILD_TOP=$(gettop) # With this environment variable new GCC can apply colors to warnings/errors export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01' } @@ -245,35 +270,42 @@ function settitle() local product=$TARGET_PRODUCT local variant=$TARGET_BUILD_VARIANT local apps=$TARGET_BUILD_APPS + if [ -z "$PROMPT_COMMAND" ]; then + # No prompts + PROMPT_COMMAND="echo -ne \"\033]0;${USER}@${HOSTNAME}: ${PWD}\007\"" + elif [ -z "$(echo $PROMPT_COMMAND | grep '033]0;')" ]; then + # Prompts exist, but no hardstatus + PROMPT_COMMAND="echo -ne \"\033]0;${USER}@${HOSTNAME}: ${PWD}\007\";${PROMPT_COMMAND}" + fi + if [ ! -z "$ANDROID_PROMPT_PREFIX" ]; then + PROMPT_COMMAND="$(echo $PROMPT_COMMAND | sed -e 's/$ANDROID_PROMPT_PREFIX //g')" + fi + if [ -z "$apps" ]; then - export PROMPT_COMMAND="echo -ne \"\033]0;[${arch}-${product}-${variant}] ${USER}@${HOSTNAME}: ${PWD}\007\"" + ANDROID_PROMPT_PREFIX="[${arch}-${product}-${variant}]" else - export PROMPT_COMMAND="echo -ne \"\033]0;[$arch $apps $variant] ${USER}@${HOSTNAME}: ${PWD}\007\"" + ANDROID_PROMPT_PREFIX="[$arch $apps $variant]" fi + export ANDROID_PROMPT_PREFIX + + # Inject build data into hardstatus + export PROMPT_COMMAND="$(echo $PROMPT_COMMAND | sed -e 's/\\033]0;\(.*\)\\007/\\033]0;$ANDROID_PROMPT_PREFIX \1\\007/g')" fi } -function addcompletions() +function check_bash_version() { - local T dir f - # Keep us from trying to run in something that isn't bash. if [ -z "${BASH_VERSION}" ]; then - return + return 1 fi # Keep us from trying to run in bash that's too old. - if [ ${BASH_VERSINFO[0]} -lt 3 ]; then - return + if [ "${BASH_VERSINFO[0]}" -lt 4 ] ; then + return 2 fi - dir="sdk/bash_completion" - if [ -d ${dir} ]; then - for f in `/bin/ls ${dir}/[a-z]*.bash 2> /dev/null`; do - echo "including $f" - . $f - done - fi + return 0 } function choosetype() @@ -464,23 +496,82 @@ function print_lunch_menu() local uname=$(uname) echo echo "You're building on" $uname + if [ "$(uname)" = "Darwin" ] ; then + echo " (ohai, koush!)" + fi echo - echo "Lunch menu... pick a combo:" + if [ "z${CM_DEVICES_ONLY}" != "z" ]; then + echo "Breakfast menu... pick a combo:" + else + echo "Lunch menu... pick a combo:" + fi local i=1 local choice for choice in ${LUNCH_MENU_CHOICES[@]} do - echo " $i. $choice" + echo " $i. $choice " i=$(($i+1)) - done + done | column + + if [ "z${CM_DEVICES_ONLY}" != "z" ]; then + echo "... and don't forget the bacon!" + fi echo } +function brunch() +{ + breakfast $* + if [ $? -eq 0 ]; then + mka bacon + else + echo "No such item in brunch menu. Try 'breakfast'" + return 1 + fi + return $? +} + +function breakfast() +{ + target=$1 + local variant=$2 + CM_DEVICES_ONLY="true" + unset LUNCH_MENU_CHOICES + add_lunch_combo full-eng + for f in `/bin/ls vendor/cm/vendorsetup.sh 2> /dev/null` + do + echo "including $f" + . $f + done + unset f + + if [ $# -eq 0 ]; then + # No arguments, so let's have the full menu + lunch + else + echo "z$target" | grep -q "-" + if [ $? -eq 0 ]; then + # A buildtype was specified, assume a full device name + lunch $target + else + # This is probably just the CM model name + if [ -z "$variant" ]; then + variant="userdebug" + fi + lunch cm_$target-$variant + fi + fi + return $? +} + +alias bib=breakfast + function lunch() { local answer + LUNCH_MENU_CHOICES=($(for l in ${LUNCH_MENU_CHOICES[@]}; do echo "$l"; done | sort)) if [ "$1" ] ; then answer=$1 @@ -518,6 +609,17 @@ function lunch() local product=$(echo -n $selection | sed -e "s/-.*$//") check_product $product if [ $? -ne 0 ] + then + # if we can't find a product, try to grab it off the CM github + T=$(gettop) + pushd $T > /dev/null + build/tools/roomservice.py $product + popd > /dev/null + check_product $product + else + build/tools/roomservice.py $product true + fi + if [ $? -ne 0 ] then echo echo "** Don't have a product spec for: '$product'" @@ -547,6 +649,8 @@ function lunch() echo + fixup_common_out_dir + set_stuff_for_environment printconfig } @@ -562,7 +666,7 @@ function _lunch() COMPREPLY=( $(compgen -W "${LUNCH_MENU_CHOICES[*]}" -- ${cur}) ) return 0 } -complete -F _lunch lunch +complete -F _lunch lunch 2>/dev/null # Configures the build to build unbundled apps. # Run tapas with one or more app names (from LOCAL_PACKAGE_NAME) @@ -615,6 +719,57 @@ function tapas() printconfig } +function eat() +{ + if [ "$OUT" ] ; then + MODVERSION=$(get_build_var CM_VERSION) + ZIPFILE=cm-$MODVERSION.zip + ZIPPATH=$OUT/$ZIPFILE + if [ ! -f $ZIPPATH ] ; then + echo "Nothing to eat" + return 1 + fi + adb start-server # Prevent unexpected starting server message from adb get-state in the next line + if [ $(adb get-state) != device -a $(adb shell busybox test -e /sbin/recovery 2> /dev/null; echo $?) != 0 ] ; then + echo "No device is online. Waiting for one..." + echo "Please connect USB and/or enable USB debugging" + until [ $(adb get-state) = device -o $(adb shell busybox test -e /sbin/recovery 2> /dev/null; echo $?) = 0 ];do + sleep 1 + done + echo "Device Found.." + fi + if (adb shell getprop ro.cm.device | grep -q "$CM_BUILD"); + then + # if adbd isn't root we can't write to /cache/recovery/ + adb root + sleep 1 + adb wait-for-device + cat << EOF > /tmp/command +--sideload +EOF + if adb push /tmp/command /cache/recovery/ ; then + echo "Rebooting into recovery for sideload installation" + adb reboot recovery + adb wait-for-sideload + adb sideload $ZIPPATH + fi + rm /tmp/command + else + echo "Nothing to eat" + return 1 + fi + return $? + else + echo "The connected device does not appear to be $CM_BUILD, run away!" + fi +} + +function omnom +{ + brunch $* + eat +} + function gettop { local TOPFILE=build/core/envsetup.mk @@ -755,7 +910,12 @@ function mmm() case $DIR in showcommands | snod | dist | incrementaljavac) ARGS="$ARGS $DIR";; GET-INSTALL-PATH) GET_INSTALL_PATH=$DIR;; - *) echo "No Android.mk in $DIR."; return 1;; + *) if [ -d $DIR ]; then + echo "No Android.mk in $DIR."; + else + echo "Couldn't locate the directory $DIR"; + fi + return 1;; esac fi done @@ -830,6 +990,15 @@ function croot() fi } +function cout() +{ + if [ "$OUT" ]; then + cd $OUT + else + echo "Couldn't locate out directory. Try setting OUT." + fi +} + function cproj() { TOPFILE=build/core/envsetup.mk @@ -1300,6 +1469,107 @@ function gdbclient_old() } +function dddclient() +{ + local OUT_ROOT=$(get_abs_build_var PRODUCT_OUT) + local OUT_SYMBOLS=$(get_abs_build_var TARGET_OUT_UNSTRIPPED) + local OUT_SO_SYMBOLS=$(get_abs_build_var TARGET_OUT_SHARED_LIBRARIES_UNSTRIPPED) + local OUT_VENDOR_SO_SYMBOLS=$(get_abs_build_var TARGET_OUT_VENDOR_SHARED_LIBRARIES_UNSTRIPPED) + local OUT_EXE_SYMBOLS=$(get_symbols_directory) + local PREBUILTS=$(get_abs_build_var ANDROID_PREBUILTS) + local ARCH=$(get_build_var TARGET_ARCH) + local GDB + case "$ARCH" in + arm) GDB=arm-linux-androideabi-gdb;; + arm64) GDB=arm-linux-androideabi-gdb; GDB64=aarch64-linux-android-gdb;; + mips|mips64) GDB=mips64el-linux-android-gdb;; + x86) GDB=x86_64-linux-android-gdb;; + x86_64) GDB=x86_64-linux-android-gdb;; + *) echo "Unknown arch $ARCH"; return 1;; + esac + + if [ "$OUT_ROOT" -a "$PREBUILTS" ]; then + local EXE="$1" + if [ "$EXE" ] ; then + EXE=$1 + if [[ $EXE =~ ^[^/].* ]] ; then + EXE="system/bin/"$EXE + fi + else + EXE="app_process" + fi + + local PORT="$2" + if [ "$PORT" ] ; then + PORT=$2 + else + PORT=":5039" + fi + + local PID="$3" + if [ "$PID" ] ; then + if [[ ! "$PID" =~ ^[0-9]+$ ]] ; then + PID=`pid $3` + if [[ ! "$PID" =~ ^[0-9]+$ ]] ; then + # that likely didn't work because of returning multiple processes + # try again, filtering by root processes (don't contain colon) + PID=`adb shell ps | \grep $3 | \grep -v ":" | awk '{print $2}'` + if [[ ! "$PID" =~ ^[0-9]+$ ]] + then + echo "Couldn't resolve '$3' to single PID" + return 1 + else + echo "" + echo "WARNING: multiple processes matching '$3' observed, using root process" + echo "" + fi + fi + fi + adb forward "tcp$PORT" "tcp$PORT" + local USE64BIT="$(is64bit $PID)" + adb shell gdbserver$USE64BIT $PORT --attach $PID & + sleep 2 + else + echo "" + echo "If you haven't done so already, do this first on the device:" + echo " gdbserver $PORT /system/bin/$EXE" + echo " or" + echo " gdbserver $PORT --attach " + echo "" + fi + + OUT_SO_SYMBOLS=$OUT_SO_SYMBOLS$USE64BIT + OUT_VENDOR_SO_SYMBOLS=$OUT_VENDOR_SO_SYMBOLS$USE64BIT + + echo >|"$OUT_ROOT/gdbclient.cmds" "set solib-absolute-prefix $OUT_SYMBOLS" + echo >>"$OUT_ROOT/gdbclient.cmds" "set solib-search-path $OUT_SO_SYMBOLS:$OUT_SO_SYMBOLS/hw:$OUT_SO_SYMBOLS/ssl/engines:$OUT_SO_SYMBOLS/drm:$OUT_SO_SYMBOLS/egl:$OUT_SO_SYMBOLS/soundfx:$OUT_VENDOR_SO_SYMBOLS:$OUT_VENDOR_SO_SYMBOLS/hw:$OUT_VENDOR_SO_SYMBOLS/egl" + echo >>"$OUT_ROOT/gdbclient.cmds" "source $ANDROID_BUILD_TOP/development/scripts/gdb/dalvik.gdb" + echo >>"$OUT_ROOT/gdbclient.cmds" "target remote $PORT" + # Enable special debugging for ART processes. + if [[ $EXE =~ (^|/)(app_process|dalvikvm)(|32|64)$ ]]; then + echo >> "$OUT_ROOT/gdbclient.cmds" "art-on" + fi + echo >>"$OUT_ROOT/gdbclient.cmds" "" + + local WHICH_GDB= + # 64-bit exe found + if [ "$USE64BIT" != "" ] ; then + WHICH_GDB=$ANDROID_TOOLCHAIN/$GDB64 + # 32-bit exe / 32-bit platform + elif [ "$(get_build_var TARGET_2ND_ARCH)" = "" ]; then + WHICH_GDB=$ANDROID_TOOLCHAIN/$GDB + # 32-bit exe / 64-bit platform + else + WHICH_GDB=$ANDROID_TOOLCHAIN_2ND_ARCH/$GDB + fi + + ddd --debugger $WHICH_GDB -x "$OUT_ROOT/gdbclient.cmds" "$OUT_EXE_SYMBOLS/$EXE" + else + echo "Unable to determine build system output dir." + fi +} + + case `uname -s` in Darwin) function sgrep() @@ -1631,6 +1901,653 @@ function godir () { \cd $T/$pathname } +function cmremote() +{ + git remote rm cmremote 2> /dev/null + GERRIT_REMOTE=$(git config --get remote.github.projectname) + if [ -z "$GERRIT_REMOTE" ] + then + echo Unable to set up the git remote, are you under a git repo? + return 0 + fi + CMUSER=$(git config --get review.review.cyanogenmod.org.username) + if [ -z "$CMUSER" ] + then + git remote add cmremote ssh://review.cyanogenmod.org:29418/$GERRIT_REMOTE + else + git remote add cmremote ssh://$CMUSER@review.cyanogenmod.org:29418/$GERRIT_REMOTE + fi + echo You can now push to "cmremote". +} + +function aospremote() +{ + git remote rm aosp 2> /dev/null + if [ ! -d .git ] + then + echo .git directory not found. Please run this from the root directory of the Android repository you wish to set up. + fi + PROJECT=`pwd -P | sed s#$ANDROID_BUILD_TOP/##g` + if (echo $PROJECT | grep -qv "^device") + then + PFX="platform/" + fi + git remote add aosp https://android.googlesource.com/$PFX$PROJECT + echo "Remote 'aosp' created" +} + +function cafremote() +{ + git remote rm caf 2> /dev/null + if [ ! -d .git ] + then + echo .git directory not found. Please run this from the root directory of the Android repository you wish to set up. + fi + PROJECT=`pwd -P | sed s#$ANDROID_BUILD_TOP/##g` + if (echo $PROJECT | grep -qv "^device") + then + PFX="platform/" + fi + git remote add caf git://codeaurora.org/$PFX$PROJECT + echo "Remote 'caf' created" +} + +function installboot() +{ + if [ ! -e "$OUT/recovery/root/etc/recovery.fstab" ]; + then + echo "No recovery.fstab found. Build recovery first." + return 1 + fi + if [ ! -e "$OUT/boot.img" ]; + then + echo "No boot.img found. Run make bootimage first." + return 1 + fi + PARTITION=`grep "^\/boot" $OUT/recovery/root/etc/recovery.fstab | awk {'print $3'}` + if [ -z "$PARTITION" ]; + then + # Try for RECOVERY_FSTAB_VERSION = 2 + PARTITION=`grep "[[:space:]]\/boot[[:space:]]" $OUT/recovery/root/etc/recovery.fstab | awk {'print $1'}` + PARTITION_TYPE=`grep "[[:space:]]\/boot[[:space:]]" $OUT/recovery/root/etc/recovery.fstab | awk {'print $3'}` + if [ -z "$PARTITION" ]; + then + echo "Unable to determine boot partition." + return 1 + fi + fi + adb start-server + adb wait-for-online + adb root + sleep 1 + adb wait-for-online shell mount /system 2>&1 > /dev/null + adb wait-for-online remount + if (adb shell getprop ro.cm.device | grep -q "$CM_BUILD"); + then + adb push $OUT/boot.img /cache/ + for i in $OUT/system/lib/modules/*; + do + adb push $i /system/lib/modules/ + done + adb shell dd if=/cache/boot.img of=$PARTITION + adb shell chmod 644 /system/lib/modules/* + echo "Installation complete." + else + echo "The connected device does not appear to be $CM_BUILD, run away!" + fi +} + +function installrecovery() +{ + if [ ! -e "$OUT/recovery/root/etc/recovery.fstab" ]; + then + echo "No recovery.fstab found. Build recovery first." + return 1 + fi + if [ ! -e "$OUT/recovery.img" ]; + then + echo "No recovery.img found. Run make recoveryimage first." + return 1 + fi + PARTITION=`grep "^\/recovery" $OUT/recovery/root/etc/recovery.fstab | awk {'print $3'}` + if [ -z "$PARTITION" ]; + then + # Try for RECOVERY_FSTAB_VERSION = 2 + PARTITION=`grep "[[:space:]]\/recovery[[:space:]]" $OUT/recovery/root/etc/recovery.fstab | awk {'print $1'}` + PARTITION_TYPE=`grep "[[:space:]]\/recovery[[:space:]]" $OUT/recovery/root/etc/recovery.fstab | awk {'print $3'}` + if [ -z "$PARTITION" ]; + then + echo "Unable to determine recovery partition." + return 1 + fi + fi + adb start-server + adb wait-for-online + adb root + sleep 1 + adb wait-for-online shell mount /system 2>&1 >> /dev/null + adb wait-for-online remount + if (adb shell getprop ro.cm.device | grep -q "$CM_BUILD"); + then + adb push $OUT/recovery.img /cache/ + adb shell dd if=/cache/recovery.img of=$PARTITION + echo "Installation complete." + else + echo "The connected device does not appear to be $CM_BUILD, run away!" + fi +} + +function makerecipe() { + if [ -z "$1" ] + then + echo "No branch name provided." + return 1 + fi + cd android + sed -i s/'default revision=.*'/'default revision="refs\/heads\/'$1'"'/ default.xml + git commit -a -m "$1" + cd .. + + repo forall -c ' + + if [ "$REPO_REMOTE" == "github" ] + then + pwd + cmremote + git push cmremote HEAD:refs/heads/'$1' + fi + ' +} + +function cmgerrit() { + if [ $# -eq 0 ]; then + $FUNCNAME help + return 1 + fi + local user=`git config --get review.review.cyanogenmod.org.username` + local review=`git config --get remote.github.review` + local project=`git config --get remote.github.projectname` + local command=$1 + shift + case $command in + help) + if [ $# -eq 0 ]; then + cat <&2 "Gerrit username not found." + return 1 + fi + local local_branch remote_branch + case $1 in + *:*) + local_branch=${1%:*} + remote_branch=${1##*:} + ;; + *) + local_branch=HEAD + remote_branch=$1 + ;; + esac + shift + git push $@ ssh://$user@$review:29418/$project \ + $local_branch:refs/for/$remote_branch || return 1 + ;; + changes|for) + if [ "$FUNCNAME" = "cmgerrit" ]; then + echo >&2 "'$FUNCNAME $command' is deprecated." + fi + ;; + __cmg_err_no_arg) + if [ $# -lt 2 ]; then + echo >&2 "'$FUNCNAME $command' missing argument." + elif [ $2 -eq 0 ]; then + if [ -n "$3" ]; then + $FUNCNAME help $1 + else + echo >&2 "'$FUNCNAME $1' missing argument." + fi + else + return 1 + fi + ;; + __cmg_err_not_repo) + if [ -z "$review" -o -z "$project" ]; then + echo >&2 "Not currently in any reviewable repository." + else + return 1 + fi + ;; + __cmg_err_not_supported) + $FUNCNAME __cmg_err_no_arg $command $# && return + case $1 in + #TODO: filter more git commands that don't use refname + init|add|rm|mv|status|clone|remote|bisect|config|stash) + echo >&2 "'$FUNCNAME $1' is not supported." + ;; + *) return 1 ;; + esac + ;; + #TODO: other special cases? + *) + $FUNCNAME __cmg_err_not_supported $command && return 1 + $FUNCNAME __cmg_err_no_arg $command $# help && return 1 + $FUNCNAME __cmg_err_not_repo && return 1 + local args="$@" + local change pre_args refs_arg post_args + case "$args" in + *--\ *) + pre_args=${args%%-- *} + post_args="-- ${args#*-- }" + ;; + *) pre_args="$args" ;; + esac + args=($pre_args) + pre_args= + if [ ${#args[@]} -gt 0 ]; then + change=${args[${#args[@]}-1]} + fi + if [ ${#args[@]} -gt 1 ]; then + pre_args=${args[0]} + for ((i=1; i<${#args[@]}-1; i++)); do + pre_args="$pre_args ${args[$i]}" + done + fi + while ((1)); do + case $change in + ""|--) + $FUNCNAME help $command + return 1 + ;; + *@*) + if [ -z "$refs_arg" ]; then + refs_arg="@${change#*@}" + change=${change%%@*} + fi + ;; + *~*) + if [ -z "$refs_arg" ]; then + refs_arg="~${change#*~}" + change=${change%%~*} + fi + ;; + *^*) + if [ -z "$refs_arg" ]; then + refs_arg="^${change#*^}" + change=${change%%^*} + fi + ;; + *:*) + if [ -z "$refs_arg" ]; then + refs_arg=":${change#*:}" + change=${change%%:*} + fi + ;; + *) break ;; + esac + done + $FUNCNAME fetch $change \ + && git $command $pre_args FETCH_HEAD$refs_arg $post_args \ + || return 1 + ;; + esac +} + +function cmrebase() { + local repo=$1 + local refs=$2 + local pwd="$(pwd)" + local dir="$(gettop)/$repo" + + if [ -z $repo ] || [ -z $refs ]; then + echo "CyanogenMod Gerrit Rebase Usage: " + echo " cmrebase " + echo " The patch IDs appear on the Gerrit commands that are offered." + echo " They consist on a series of numbers and slashes, after the text" + echo " refs/changes. For example, the ID in the following command is 26/8126/2" + echo "" + echo " git[...]ges_apps_Camera refs/changes/26/8126/2 && git cherry-pick FETCH_HEAD" + echo "" + return + fi + + if [ ! -d $dir ]; then + echo "Directory $dir doesn't exist in tree." + return + fi + cd $dir + repo=$(cat .git/config | grep git://github.com | awk '{ print $NF }' | sed s#git://github.com/##g) + echo "Starting branch..." + repo start tmprebase . + echo "Bringing it up to date..." + repo sync . + echo "Fetching change..." + git fetch "http://review.cyanogenmod.org/p/$repo" "refs/changes/$refs" && git cherry-pick FETCH_HEAD + if [ "$?" != "0" ]; then + echo "Error cherry-picking. Not uploading!" + return + fi + echo "Uploading..." + repo upload . + echo "Cleaning up..." + repo abandon tmprebase . + cd $pwd +} + +function mka() { + local T=$(gettop) + if [ "$T" ]; then + case `uname -s` in + Darwin) + make -C $T -j `sysctl hw.ncpu|cut -d" " -f2` "$@" + ;; + *) + mk_timer schedtool -B -n 1 -e ionice -n 1 make -C $T -j$(cat /proc/cpuinfo | grep "^processor" | wc -l) "$@" + ;; + esac + + else + echo "Couldn't locate the top of the tree. Try setting TOP." + fi +} + +function cmka() { + if [ ! -z "$1" ]; then + for i in "$@"; do + case $i in + bacon|otapackage|systemimage) + mka installclean + mka $i + ;; + *) + mka clean-$i + mka $i + ;; + esac + done + else + mka clean + mka + fi +} + +function repolastsync() { + RLSPATH="$ANDROID_BUILD_TOP/.repo/.repo_fetchtimes.json" + RLSLOCAL=$(date -d "$(stat -c %z $RLSPATH)" +"%e %b %Y, %T %Z") + RLSUTC=$(date -d "$(stat -c %z $RLSPATH)" -u +"%e %b %Y, %T %Z") + echo "Last repo sync: $RLSLOCAL / $RLSUTC" +} + +function reposync() { + case `uname -s` in + Darwin) + repo sync -j 4 "$@" + ;; + *) + schedtool -B -n 1 -e ionice -n 1 `which repo` sync -j 4 "$@" + ;; + esac +} + +function repodiff() { + if [ -z "$*" ]; then + echo "Usage: repodiff [[ref-to] [--numstat]]" + return + fi + diffopts=$* repo forall -c \ + 'echo "$REPO_PATH ($REPO_REMOTE)"; git diff ${diffopts} 2>/dev/null ;' +} + +# Credit for color strip sed: http://goo.gl/BoIcm +function dopush() +{ + local func=$1 + shift + + adb start-server # Prevent unexpected starting server message from adb get-state in the next line + if [ $(adb get-state) != device -a $(adb shell busybox test -e /sbin/recovery 2> /dev/null; echo $?) != 0 ] ; then + echo "No device is online. Waiting for one..." + echo "Please connect USB and/or enable USB debugging" + until [ $(adb get-state) = device -o $(adb shell busybox test -e /sbin/recovery 2> /dev/null; echo $?) = 0 ];do + sleep 1 + done + echo "Device Found." + fi + + if (adb shell getprop ro.cm.device | grep -q "$CM_BUILD") || [ "$FORCE_PUSH" == "true" ]; + then + # retrieve IP and PORT info if we're using a TCP connection + TCPIPPORT=$(adb devices | egrep '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+:[0-9]+[^0-9]+' \ + | head -1 | awk '{print $1}') + adb root &> /dev/null + sleep 0.3 + if [ -n "$TCPIPPORT" ] + then + # adb root just killed our connection + # so reconnect... + adb connect "$TCPIPPORT" + fi + adb wait-for-device &> /dev/null + sleep 0.3 + adb remount &> /dev/null + + mkdir -p $OUT + ($func $*|tee $OUT/.log;return ${PIPESTATUS[0]}) + ret=$?; + if [ $ret -ne 0 ]; then + rm -f $OUT/.log;return $ret + fi + + # Install: + LOC="$(cat $OUT/.log | sed -r 's/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g' | grep '^Install: ' | cut -d ':' -f 2)" + + # Copy: + LOC="$LOC $(cat $OUT/.log | sed -r 's/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g' | grep '^Copy: ' | cut -d ':' -f 2)" + + # If any files are going to /data, push an octal file permissions reader to device + if [ -n "$(echo $LOC | egrep '(^|\s)/data')" ]; then + CHKPERM="/data/local/tmp/chkfileperm.sh" +( +cat <<'EOF' +#!/system/xbin/sh +FILE=$@ +if [ -e $FILE ]; then + ls -l $FILE | awk '{k=0;for(i=0;i<=8;i++)k+=((substr($1,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf("%0o ",k);print}' | cut -d ' ' -f1 +fi +EOF +) > $OUT/.chkfileperm.sh + echo "Pushing file permissions checker to device" + adb push $OUT/.chkfileperm.sh $CHKPERM + adb shell chmod 755 $CHKPERM + rm -f $OUT/.chkfileperm.sh + fi + + stop_n_start=false + for FILE in $LOC; do + # Make sure file is in $OUT/system or $OUT/data + case $FILE in + $OUT/system/*|$OUT/data/*) + # Get target file name (i.e. /system/bin/adb) + TARGET=$(echo $FILE | sed "s#$OUT##") + ;; + *) continue ;; + esac + + case $TARGET in + /data/*) + # fs_config only sets permissions and se labels for files pushed to /system + if [ -n "$CHKPERM" ]; then + OLDPERM=$(adb shell $CHKPERM $TARGET) + OLDPERM=$(echo $OLDPERM | tr -d '\r' | tr -d '\n') + OLDOWN=$(adb shell ls -al $TARGET | awk '{print $2}') + OLDGRP=$(adb shell ls -al $TARGET | awk '{print $3}') + fi + echo "Pushing: $TARGET" + adb push $FILE $TARGET + if [ -n "$OLDPERM" ]; then + echo "Setting file permissions: $OLDPERM, $OLDOWN":"$OLDGRP" + adb shell chown "$OLDOWN":"$OLDGRP" $TARGET + adb shell chmod "$OLDPERM" $TARGET + else + echo "$TARGET did not exist previously, you should set file permissions manually" + fi + adb shell restorecon "$TARGET" + ;; + /system/priv-app/SystemUI/SystemUI.apk|/system/framework/*) + # Only need to stop services once + if ! $stop_n_start; then + adb shell stop + stop_n_start=true + fi + echo "Pushing: $TARGET" + adb push $FILE $TARGET + ;; + *) + echo "Pushing: $TARGET" + adb push $FILE $TARGET + ;; + esac + done + if [ -n "$CHKPERM" ]; then + adb shell rm $CHKPERM + fi + if $stop_n_start; then + adb shell start + fi + rm -f $OUT/.log + return 0 + else + echo "The connected device does not appear to be $CM_BUILD, run away!" + fi +} + +alias mmp='dopush mm' +alias mmmp='dopush mmm' +alias mkap='dopush mka' +alias cmkap='dopush cmka' + +function repopick() { + T=$(gettop) + $T/build/tools/repopick.py $@ +} + +function fixup_common_out_dir() { + common_out_dir=$(get_build_var OUT_DIR)/target/common + target_device=$(get_build_var TARGET_DEVICE) + if [ ! -z $CM_FIXUP_COMMON_OUT ]; then + if [ -d ${common_out_dir} ] && [ ! -L ${common_out_dir} ]; then + mv ${common_out_dir} ${common_out_dir}-${target_device} + ln -s ${common_out_dir}-${target_device} ${common_out_dir} + else + [ -L ${common_out_dir} ] && rm ${common_out_dir} + mkdir -p ${common_out_dir}-${target_device} + ln -s ${common_out_dir}-${target_device} ${common_out_dir} + fi + else + [ -L ${common_out_dir} ] && rm ${common_out_dir} + mkdir -p ${common_out_dir} + fi +} + # Force JAVA_HOME to point to java 1.7 or java 1.6 if it isn't already set. # # Note that the MacOS path for java 1.7 includes a minor revision number (sigh). @@ -1687,15 +2604,25 @@ function pez { return $retval } +function updatesystemimg() +{ + T=$(gettop) + if [ ! "$T" ]; then + echo "Couldn't locate the top of the tree. Try setting TOP." >&2 + return + fi + ("$T"/build/tools/update-system-img.sh) +} + function get_make_command() { echo command make } -function make() +function mk_timer() { local start_time=$(date +"%s") - $(get_make_command) "$@" + $@ local ret=$? local end_time=$(date +"%s") local tdiff=$(($end_time-$start_time)) @@ -1720,14 +2647,21 @@ function make() return $ret } +function make() +{ + mk_timer $(get_make_command) "$@" +} + if [ "x$SHELL" != "x/bin/bash" ]; then case `ps -o command -p $$` in *bash*) ;; + *zsh*) + ;; *) - echo "WARNING: Only bash is supported, use of other shell would lead to erroneous results" + echo "WARNING: Only bash and zsh are supported, use of other shell may lead to erroneous results" ;; esac fi @@ -1741,4 +2675,17 @@ do done unset f -addcompletions +# Add completions +check_bash_version && { + dirs="sdk/bash_completion vendor/cm/bash_completion" + for dir in $dirs; do + if [ -d ${dir} ]; then + for f in `/bin/ls ${dir}/[a-z]*.bash 2> /dev/null`; do + echo "including $f" + . $f + done + fi + done +} + +export ANDROID_BUILD_TOP=$(gettop) diff --git a/target/board/generic/BoardConfig.mk b/target/board/generic/BoardConfig.mk index 3ae5860809d..664aa134d2b 100644 --- a/target/board/generic/BoardConfig.mk +++ b/target/board/generic/BoardConfig.mk @@ -5,7 +5,7 @@ # The generic product target doesn't have any hardware-specific pieces. TARGET_NO_BOOTLOADER := true -TARGET_NO_KERNEL := true +TARGET_NO_KERNEL := false TARGET_ARCH := arm # Note: we build the platform images for ARMv7-A _without_ NEON. @@ -68,12 +68,12 @@ USE_OPENGL_RENDERER := true VSYNC_EVENT_PHASE_OFFSET_NS := 0 TARGET_USERIMAGES_USE_EXT4 := true -BOARD_SYSTEMIMAGE_PARTITION_SIZE := 576716800 +BOARD_SYSTEMIMAGE_PARTITION_SIZE := 209715200 BOARD_USERDATAIMAGE_PARTITION_SIZE := 576716800 BOARD_CACHEIMAGE_PARTITION_SIZE := 69206016 BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE := ext4 BOARD_FLASH_BLOCK_SIZE := 512 -TARGET_USERIMAGES_SPARSE_EXT_DISABLED := true +#TARGET_USERIMAGES_SPARSE_EXT_DISABLED := true BOARD_SEPOLICY_DIRS += build/target/board/generic/sepolicy BOARD_SEPOLICY_UNION += \ @@ -92,3 +92,7 @@ ifeq ($(TARGET_PRODUCT),sdk) # include an expanded selection of fonts for the SDK. EXTENDED_FONT_FOOTPRINT := true endif + +TARGET_KERNEL_UBUNTU := true +TARGET_KERNEL_UBUNTU_META := linux-image-goldfish +TARGET_KERNEL_UBUNTU_SERIES := vivid diff --git a/target/board/generic/device.mk b/target/board/generic/device.mk index 06a7d8a3e21..26e4fcdb759 100644 --- a/target/board/generic/device.mk +++ b/target/board/generic/device.mk @@ -23,7 +23,6 @@ PRODUCT_PROPERTY_OVERRIDES := \ ro.adb.qemud=1 PRODUCT_COPY_FILES := \ - device/generic/goldfish/data/etc/apns-conf.xml:system/etc/apns-conf.xml \ device/generic/goldfish/camera/media_profiles.xml:system/etc/media_profiles.xml \ frameworks/av/media/libstagefright/data/media_codecs_google_audio.xml:system/etc/media_codecs_google_audio.xml \ frameworks/av/media/libstagefright/data/media_codecs_google_telephony.xml:system/etc/media_codecs_google_telephony.xml \ diff --git a/target/board/generic/recovery.fstab b/target/board/generic/recovery.fstab new file mode 100644 index 00000000000..fd1219a22c7 --- /dev/null +++ b/target/board/generic/recovery.fstab @@ -0,0 +1,7 @@ +# Android fstab file. +# +# The filesystem that contains the filesystem checker binary (typically /system) cannot +# specify MF_CHECK, and must come before any filesystems that do specify MF_CHECK +/dev/block/mtdblock0 /system ext4 ro,barrier=1 wait +/dev/block/mtdblock1 /data ext4 noatime,nosuid,nodev,barrier=1,nomblk_io_submit wait,check +/dev/block/mtdblock2 /cache ext4 noatime,nosuid,nodev,nomblk_io_submit,errors=panic wait,check diff --git a/target/board/generic_mips/BoardConfig.mk b/target/board/generic_mips/BoardConfig.mk index 7cef96865f7..932fb198103 100644 --- a/target/board/generic_mips/BoardConfig.mk +++ b/target/board/generic_mips/BoardConfig.mk @@ -50,12 +50,12 @@ BUILD_EMULATOR_OPENGL := true USE_OPENGL_RENDERER := true TARGET_USERIMAGES_USE_EXT4 := true -BOARD_SYSTEMIMAGE_PARTITION_SIZE := 838860800 +BOARD_SYSTEMIMAGE_PARTITION_SIZE := 209715200 BOARD_USERDATAIMAGE_PARTITION_SIZE := 576716800 BOARD_CACHEIMAGE_PARTITION_SIZE := 69206016 BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE := ext4 BOARD_FLASH_BLOCK_SIZE := 512 -TARGET_USERIMAGES_SPARSE_EXT_DISABLED := true +#TARGET_USERIMAGES_SPARSE_EXT_DISABLED := true BOARD_SEPOLICY_DIRS += build/target/board/generic/sepolicy BOARD_SEPOLICY_UNION += \ diff --git a/target/board/generic_mips/device.mk b/target/board/generic_mips/device.mk index 590f4224d56..0e2f56e3331 100644 --- a/target/board/generic_mips/device.mk +++ b/target/board/generic_mips/device.mk @@ -23,7 +23,6 @@ PRODUCT_PROPERTY_OVERRIDES := \ ro.adb.qemud=1 PRODUCT_COPY_FILES := \ - device/generic/goldfish/data/etc/apns-conf.xml:system/etc/apns-conf.xml \ device/generic/goldfish/camera/media_profiles.xml:system/etc/media_profiles.xml \ frameworks/av/media/libstagefright/data/media_codecs_google_audio.xml:system/etc/media_codecs_google_audio.xml \ frameworks/av/media/libstagefright/data/media_codecs_google_telephony.xml:system/etc/media_codecs_google_telephony.xml \ diff --git a/target/board/generic_x86/BoardConfig.mk b/target/board/generic_x86/BoardConfig.mk index 5d091f515c2..faf3848694e 100644 --- a/target/board/generic_x86/BoardConfig.mk +++ b/target/board/generic_x86/BoardConfig.mk @@ -5,7 +5,7 @@ # The generic product target doesn't have any hardware-specific pieces. TARGET_NO_BOOTLOADER := true -TARGET_NO_KERNEL := true +TARGET_NO_KERNEL := false TARGET_CPU_ABI := x86 TARGET_ARCH := x86 TARGET_ARCH_VARIANT := x86 @@ -35,12 +35,12 @@ BUILD_EMULATOR_OPENGL := true USE_OPENGL_RENDERER := true TARGET_USERIMAGES_USE_EXT4 := true -BOARD_SYSTEMIMAGE_PARTITION_SIZE := 786432000 +BOARD_SYSTEMIMAGE_PARTITION_SIZE := 209715200 BOARD_USERDATAIMAGE_PARTITION_SIZE := 576716800 BOARD_CACHEIMAGE_PARTITION_SIZE := 69206016 BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE := ext4 BOARD_FLASH_BLOCK_SIZE := 512 -TARGET_USERIMAGES_SPARSE_EXT_DISABLED := true +#TARGET_USERIMAGES_SPARSE_EXT_DISABLED := true BOARD_SEPOLICY_DIRS += \ build/target/board/generic/sepolicy \ @@ -58,3 +58,7 @@ BOARD_SEPOLICY_UNION += \ shell.te \ system_server.te \ zygote.te + +TARGET_KERNEL_UBUNTU := true +TARGET_KERNEL_UBUNTU_META := linux-image-goldfish +TARGET_KERNEL_UBUNTU_SERIES := vivid diff --git a/target/board/generic_x86/device.mk b/target/board/generic_x86/device.mk index b5b0fafb0b6..4a27dbf8897 100644 --- a/target/board/generic_x86/device.mk +++ b/target/board/generic_x86/device.mk @@ -23,7 +23,6 @@ PRODUCT_PROPERTY_OVERRIDES := \ ro.adb.qemud=1 PRODUCT_COPY_FILES := \ - device/generic/goldfish/data/etc/apns-conf.xml:system/etc/apns-conf.xml \ device/generic/goldfish/camera/media_profiles.xml:system/etc/media_profiles.xml \ frameworks/av/media/libstagefright/data/media_codecs_google_audio.xml:system/etc/media_codecs_google_audio.xml \ frameworks/av/media/libstagefright/data/media_codecs_google_telephony.xml:system/etc/media_codecs_google_telephony.xml \ diff --git a/target/board/generic_x86/recovery.fstab b/target/board/generic_x86/recovery.fstab new file mode 100644 index 00000000000..fd1219a22c7 --- /dev/null +++ b/target/board/generic_x86/recovery.fstab @@ -0,0 +1,7 @@ +# Android fstab file. +# +# The filesystem that contains the filesystem checker binary (typically /system) cannot +# specify MF_CHECK, and must come before any filesystems that do specify MF_CHECK +/dev/block/mtdblock0 /system ext4 ro,barrier=1 wait +/dev/block/mtdblock1 /data ext4 noatime,nosuid,nodev,barrier=1,nomblk_io_submit wait,check +/dev/block/mtdblock2 /cache ext4 noatime,nosuid,nodev,nomblk_io_submit,errors=panic wait,check diff --git a/target/board/generic_x86_64/device.mk b/target/board/generic_x86_64/device.mk index b5b0fafb0b6..4a27dbf8897 100755 --- a/target/board/generic_x86_64/device.mk +++ b/target/board/generic_x86_64/device.mk @@ -23,7 +23,6 @@ PRODUCT_PROPERTY_OVERRIDES := \ ro.adb.qemud=1 PRODUCT_COPY_FILES := \ - device/generic/goldfish/data/etc/apns-conf.xml:system/etc/apns-conf.xml \ device/generic/goldfish/camera/media_profiles.xml:system/etc/media_profiles.xml \ frameworks/av/media/libstagefright/data/media_codecs_google_audio.xml:system/etc/media_codecs_google_audio.xml \ frameworks/av/media/libstagefright/data/media_codecs_google_telephony.xml:system/etc/media_codecs_google_telephony.xml \ diff --git a/target/product/base.mk b/target/product/base.mk index 0d052b52f10..751677abc03 100644 --- a/target/product/base.mk +++ b/target/product/base.mk @@ -110,6 +110,7 @@ PRODUCT_PACKAGES += \ settings \ svc \ tc \ + tm \ vdc \ vold \ wm diff --git a/target/product/core.mk b/target/product/core.mk index 519dbb8efe1..a87178084c9 100644 --- a/target/product/core.mk +++ b/target/product/core.mk @@ -39,7 +39,6 @@ PRODUCT_PACKAGES += \ InputDevices \ KeyChain \ Keyguard \ - LatinIME \ Launcher2 \ ManagedProvisioning \ PicoTts \ diff --git a/target/product/core_base.mk b/target/product/core_base.mk index 6c294822720..1fcde853230 100644 --- a/target/product/core_base.mk +++ b/target/product/core_base.mk @@ -16,14 +16,9 @@ # Note that components added here will be also shared in PDK. Components # that should not be in PDK should be added in lower level like core.mk. -PRODUCT_PROPERTY_OVERRIDES := \ - ro.config.notification_sound=OnTheHunt.ogg \ - ro.config.alarm_alert=Alarm_Classic.ogg - PRODUCT_PACKAGES += \ ContactsProvider \ DefaultContainerService \ - Home \ TelephonyProvider \ UserDictionaryProvider \ atrace \ @@ -32,6 +27,7 @@ PRODUCT_PACKAGES += \ libaudioutils \ libfilterpack_imageproc \ libgabi++ \ + libinput \ libmdnssd \ libnfc_ndef \ libpowermanager \ @@ -55,10 +51,48 @@ PRODUCT_PACKAGES += \ libstagefright_soft_vorbisdec \ libstagefright_soft_vpxdec \ libstagefright_soft_vpxenc \ + libstagefright_soft_dtsdec \ libvariablespeed \ libwebrtc_audio_preprocessing \ mdnsd \ + recovery_resize2fs \ requestsync \ - wifi-service + libadf \ + libutils \ + libz \ + libpng \ + libsuspend \ + libbatteryservice \ + libbinder \ + libminui \ + healthd + +# for Ubuntu Touch (hybris, platform-api, utils, etc) +PRODUCT_PACKAGES += \ + apns-conf.xml \ + libcamera_compat_layer \ + camera_service \ + libis_compat_layer \ + libmedia_compat_layer \ + libsf_compat_layer \ + libui_compat_layer \ + libubuntu_application_api \ + upstart-property-watcher + +# for testing +PRODUCT_PACKAGES += \ + autopilot-finger.idc \ + direct_camera_test \ + direct_input_test \ + direct_media_test \ + direct_sf_test \ + direct_ubuntu_application_sensors_c_api_for_hybris_test \ + direct_ubuntu_application_sensors_for_hybris_test \ + direct_ubuntu_application_gps_c_api_for_hybris_test + +# Our Android tree has Ubuntu's camera service headers. Set this so that +# video recording with compat layer works. +# Not sure if this is the best place to do it. +CAMERA_SERVICE_WANT_UBUNTU_HEADERS := 1 $(call inherit-product, $(SRC_TARGET_DIR)/product/core_minimal.mk) diff --git a/target/product/core_minimal.mk b/target/product/core_minimal.mk index 4c08cb027b3..89b1cba4be3 100644 --- a/target/product/core_minimal.mk +++ b/target/product/core_minimal.mk @@ -23,6 +23,7 @@ PRODUCT_DEVICE := generic PRODUCT_NAME := core PRODUCT_PACKAGES += \ + aapt \ BackupRestoreConfirmation \ DownloadProvider \ HTMLViewer \ @@ -96,6 +97,8 @@ PRODUCT_BOOT_JARS := \ # The order of PRODUCT_SYSTEM_SERVER_JARS matters. PRODUCT_SYSTEM_SERVER_JARS := \ + org.cyanogenmod.platform \ + org.cyanogenmod.hardware \ services \ ethernet-service \ wifi-service diff --git a/target/product/core_tiny.mk b/target/product/core_tiny.mk index 9637e341321..477bd8fa709 100644 --- a/target/product/core_tiny.mk +++ b/target/product/core_tiny.mk @@ -54,6 +54,7 @@ PRODUCT_PACKAGES += \ ip-up-vpn \ ip6tables \ iptables \ + javax.btobex \ keystore \ keystore.default \ libOpenMAXAL \ diff --git a/target/product/embedded.mk b/target/product/embedded.mk index b60c9488ea3..2daa9046546 100644 --- a/target/product/embedded.mk +++ b/target/product/embedded.mk @@ -72,6 +72,7 @@ PRODUCT_PACKAGES += \ # SELinux packages PRODUCT_PACKAGES += \ + auditd \ sepolicy \ file_contexts \ seapp_contexts \ diff --git a/target/product/full.mk b/target/product/full.mk index b66ae92a532..f682a4ae1a7 100644 --- a/target/product/full.mk +++ b/target/product/full.mk @@ -27,5 +27,5 @@ include $(SRC_TARGET_DIR)/product/emulator.mk # Overrides PRODUCT_NAME := full PRODUCT_DEVICE := generic -PRODUCT_BRAND := Android -PRODUCT_MODEL := AOSP on ARM Emulator +PRODUCT_BRAND := Ubuntu +PRODUCT_MODEL := ARM Emulator diff --git a/target/product/full_base.mk b/target/product/full_base.mk index caace76eb50..f9b850506c0 100644 --- a/target/product/full_base.mk +++ b/target/product/full_base.mk @@ -21,43 +21,27 @@ PRODUCT_PACKAGES := \ libfwdlockengine \ - OpenWnn \ - libWnnEngDic \ - libWnnJpnDic \ - libwnndict \ WAPPushManager -PRODUCT_PACKAGES += \ - Galaxy4 \ - HoloSpiralWallpaper \ - LiveWallpapers \ - LiveWallpapersPicker \ - MagicSmokeWallpapers \ - NoiseField \ - PhaseBeam \ - VisualizationWallpapers \ - PhotoTable - # Additional settings used in all AOSP builds PRODUCT_PROPERTY_OVERRIDES := \ - ro.com.android.dateformat=MM-dd-yyyy \ - ro.config.ringtone=Ring_Synth_04.ogg \ - ro.config.notification_sound=pixiedust.ogg + ro.com.android.dateformat=MM-dd-yyyy # Put en_US first in the list, so make it default. PRODUCT_LOCALES := en_US -# Include drawables for all densities -PRODUCT_AAPT_CONFIG := normal - # Get some sounds $(call inherit-product-if-exists, frameworks/base/data/sounds/AllAudio.mk) # Get the TTS language packs $(call inherit-product-if-exists, external/svox/pico/lang/all_pico_languages.mk) +ifeq ($(TARGET_LOCALES),) # Get a list of languages. $(call inherit-product, $(SRC_TARGET_DIR)/product/locales_full.mk) +else +PRODUCT_LOCALES := $(TARGET_LOCALES) +endif # Get everything else from the parent package $(call inherit-product, $(SRC_TARGET_DIR)/product/generic_no_telephony.mk) diff --git a/target/product/full_base_telephony.mk b/target/product/full_base_telephony.mk index 2fd2ce803ff..7988e9b777d 100644 --- a/target/product/full_base_telephony.mk +++ b/target/product/full_base_telephony.mk @@ -19,16 +19,8 @@ # build quite specifically for the emulator, and might not be # entirely appropriate to inherit from for on-device configurations. -PRODUCT_PACKAGES := \ - VoiceDialer - PRODUCT_PROPERTY_OVERRIDES := \ - keyguard.no_require_sim=true \ - ro.com.android.dataroaming=true - -PRODUCT_COPY_FILES := \ - device/generic/goldfish/data/etc/apns-conf.xml:system/etc/apns-conf.xml \ - frameworks/native/data/etc/handheld_core_hardware.xml:system/etc/permissions/handheld_core_hardware.xml + keyguard.no_require_sim=true $(call inherit-product, $(SRC_TARGET_DIR)/product/aosp_base.mk) $(call inherit-product, $(SRC_TARGET_DIR)/product/telephony.mk) diff --git a/target/product/full_x86.mk b/target/product/full_x86.mk index 4dff7134246..cd01a5039dd 100644 --- a/target/product/full_x86.mk +++ b/target/product/full_x86.mk @@ -40,5 +40,5 @@ PRODUCT_PACKAGES += \ # Overrides PRODUCT_NAME := full_x86 PRODUCT_DEVICE := generic_x86 -PRODUCT_BRAND := Android -PRODUCT_MODEL := AOSP on IA Emulator +PRODUCT_BRAND := Ubuntu +PRODUCT_MODEL := X86 Emulator diff --git a/target/product/generic_no_telephony.mk b/target/product/generic_no_telephony.mk index 7af62ce46ad..a938a5f6cba 100644 --- a/target/product/generic_no_telephony.mk +++ b/target/product/generic_no_telephony.mk @@ -31,16 +31,12 @@ PRODUCT_PACKAGES := \ PRODUCT_PACKAGES += \ clatd \ clatd.conf \ + javax.btobex \ pppd \ screenrecord PRODUCT_PACKAGES += \ - librs_jni \ - libvideoeditor_jni \ - libvideoeditor_core \ - libvideoeditor_osal \ - libvideoeditor_videofilters \ - libvideoeditorplayer \ + librs_jni PRODUCT_PACKAGES += \ audio.primary.default \ diff --git a/target/product/languages_full.mk b/target/product/languages_full.mk index 6d77cde1b78..b4116cade75 100644 --- a/target/product/languages_full.mk +++ b/target/product/languages_full.mk @@ -22,3 +22,6 @@ # These are all the locales that have translations and are displayable # by TextView in this branch. PRODUCT_LOCALES := en_US en_AU en_IN fr_FR it_IT es_ES et_EE de_DE nl_NL cs_CZ pl_PL ja_JP zh_TW zh_CN zh_HK ru_RU ko_KR nb_NO es_US da_DK el_GR tr_TR pt_PT pt_BR rm_CH sv_SE bg_BG ca_ES en_GB fi_FI hi_IN hr_HR hu_HU in_ID iw_IL lt_LT lv_LV ro_RO sk_SK sl_SI sr_RS uk_UA vi_VN tl_PH ar_EG fa_IR th_TH sw_TZ ms_MY af_ZA zu_ZA am_ET hi_IN en_XA ar_XB fr_CA km_KH lo_LA ne_NP si_LK mn_MN hy_AM az_AZ ka_GE my_MM mr_IN ml_IN is_IS mk_MK ky_KG eu_ES gl_ES bn_BD ta_IN kn_IN te_IN uz_UZ ur_PK kk_KZ + +# CyanogenMod +PRODUCT_LOCALES += ast_ES lb_LU ku_IQ diff --git a/target/product/security/cm-devkey.x509.pem b/target/product/security/cm-devkey.x509.pem new file mode 100644 index 00000000000..b7a6ae404b0 --- /dev/null +++ b/target/product/security/cm-devkey.x509.pem @@ -0,0 +1,23 @@ +-----BEGIN CERTIFICATE----- +MIID1TCCAr2gAwIBAgIJANO67t8hIti6MA0GCSqGSIb3DQEBBQUAMIGAMQswCQYD +VQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEX +MBUGA1UECgwOQ3lhbm9nZW4sIEluYy4xGzAZBgNVBAsMElJlbGVhc2UgTWFuYWdl +bWVudDEUMBIGA1UEAwwLRGV2ZWxvcG1lbnQwHhcNMTQwNDI4MjAyODM3WhcNNDEw +OTEzMjAyODM3WjCBgDELMAkGA1UEBhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24x +EDAOBgNVBAcMB1NlYXR0bGUxFzAVBgNVBAoMDkN5YW5vZ2VuLCBJbmMuMRswGQYD +VQQLDBJSZWxlYXNlIE1hbmFnZW1lbnQxFDASBgNVBAMMC0RldmVsb3BtZW50MIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz/V9RvYnr18fraPWNeQEZNeg +Kc0A3QskImQyGY22EGBZ63KUxa6zAfAug0OYSjofVJRaTtdvBXjO/C71XZRh4wun +xhOUAJt8zIJ0lRx8GMC0GHzePEnEVvoiu3zSAPHCNf5lmdhyhccMOtC18J+evPf4 +EVBb3cis+F1m6ZoZKPgSFBR5A9CV5Tai8iiZluGGg15Wt12Rp2vmbmQxiOJZxBs4 +Ps40XR5gjO1q4R3HiGnFyql9qeecwaTUWXAd76lhNiLUr7K8IRs+96i+t5vSKajB +M8O99BtYyBtf8ItMnHSZJxtsMw+TFXNLmMtaQarpsjp0LLGuHb/vsrjgBPvzsQID +AQABo1AwTjAdBgNVHQ4EFgQUTpNgXBqV7j+33bi8B80YLQq6EL8wHwYDVR0jBBgw +FoAUTpNgXBqV7j+33bi8B80YLQq6EL8wDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0B +AQUFAAOCAQEAVlVBNksK+1C3J8uQ9kVemYMozfbboV9c4PLbtVzNSO8vwZ3X5E4T +2zfQPcFsfSMIa51a1tETBcDA6k+72xHZ+xEQJQNrX+o1F1RIIrXp0OKAz/k5cXyk +OS0+nd0EXP/A1EW0m8N/X6E9wpRkIhfqtEsqeCf8GH7O9Ua2qHZ9zkTBpbAVH0oe +ZWorHBdo3GdMJ5vcjFqnDdRs8F0BnZmjS+NrgXRLhLb6ZARS/bkUQyr5TX82dgG6 +vzvKsdKyX34gsKAsjxwLWo7XXgehFfjY+SGjjilJtardr+y/KlHNEw9s9aLe+Xny +Qoa9j9Ut6/KwRaC6lSEQ7HZk6SdzFsdugA== +-----END CERTIFICATE----- diff --git a/target/product/security/cm.x509.pem b/target/product/security/cm.x509.pem new file mode 100644 index 00000000000..5ff19db7213 --- /dev/null +++ b/target/product/security/cm.x509.pem @@ -0,0 +1,21 @@ +-----BEGIN CERTIFICATE----- +MIIDZDCCAkygAwIBAgIEUfbexjANBgkqhkiG9w0BAQUFADB0MQswCQYDVQQGEwJV +UzELMAkGA1UECBMCV0ExEDAOBgNVBAcTB1NlYXR0bGUxFjAUBgNVBAoTDUN5YW5v +Z2VuIEluYy4xFjAUBgNVBAsTDUN5YW5vZ2VuIEluYy4xFjAUBgNVBAMTDUN5YW5v +Z2VuIEluYy4wHhcNMTMwNzI5MjEyOTQyWhcNNDAxMjE0MjEyOTQyWjB0MQswCQYD +VQQGEwJVUzELMAkGA1UECBMCV0ExEDAOBgNVBAcTB1NlYXR0bGUxFjAUBgNVBAoT +DUN5YW5vZ2VuIEluYy4xFjAUBgNVBAsTDUN5YW5vZ2VuIEluYy4xFjAUBgNVBAMT +DUN5YW5vZ2VuIEluYy4wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCP ++K2NPqdZ6UmexXQ8tsc2TkLXYhiuEsifO66qlpwsTTw1522HcbKPVoPRr/JBXqOv +E3K0HuZ/IsYYGsP/wJWWvpaWs+5xC+YkLkittK2uUzTqndpLFiDRAeICKpvDJI57 +Z0DkzVYXBPn+yw+x8ttjT/vWcJ3PEVYuew8MYPUOgKpdZlQtUBeoEBDSL8JPGViq +e6jWOlSAWekhlgb+wb9RoXhu/v2HYzp89GG0sIrAgj7vZCior5XuFmm8eWhqUhTp +TUBv/nNI/ORYt3G8IQyI2pJN1GNPAAv1uA5i4y/deX1x4GCWyN9feiD9fOj2oc3z +Hwf5Frs9BjOb9XMXecbNAgMBAAEwDQYJKoZIhvcNAQEFBQADggEBAGudhFe9VnES +fWynTYO4kWNlMC++yB6qD3pHW6HtBiaANj9wxrLCTFzf+boHNPeZ8HDkW01zAaQK +fd9/fnGmHf4q/QvxrvGbnb3Fqhw+2hknbbMUoAa+Qp+2ouf9oJaNRquZ+rHEHX8g +Rx8wGyvjaWYfQrwyZRgXj/Jrc/NXxQCmSJeexHVNXgQD6aOLHJYrJ+s+U/hwVNiM +5L+psOh89itwt8DGGSLW16HjQKmPPbWbqxgnfRbOlxWrLDq3agcrskYpDP2aGGBA +5STq/bvh9yZkrNYvMGzrXDhcJ44QRS8e1Jw/ZtfFvJD192e7KKVdy7CJWmOckCNK +gl0KCQ3MBx4= +-----END CERTIFICATE----- diff --git a/target/product/telephony.mk b/target/product/telephony.mk index da1497d099c..283875cac52 100644 --- a/target/product/telephony.mk +++ b/target/product/telephony.mk @@ -19,6 +19,7 @@ PRODUCT_PACKAGES := \ Dialer \ + InCallUI \ Mms \ rild diff --git a/tools/apicheck/Android.mk b/tools/apicheck/Android.mk index 1674a17e93d..1505c8d7b52 100644 --- a/tools/apicheck/Android.mk +++ b/tools/apicheck/Android.mk @@ -32,7 +32,7 @@ include $(BUILD_SYSTEM)/base_rules.mk $(LOCAL_BUILT_MODULE): $(HOST_OUT_JAVA_LIBRARIES)/doclava$(COMMON_JAVA_PACKAGE_SUFFIX) $(LOCAL_BUILT_MODULE): $(LOCAL_PATH)/etc/apicheck | $(ACP) - @echo "Copy: $(PRIVATE_MODULE) ($@)" + @echo -e ${CL_CYN}"Copy:"${CL_RST}" $(PRIVATE_MODULE) ($@)" $(copy-file-to-new-target) $(hide) chmod 755 $@ diff --git a/tools/buildinfo.sh b/tools/buildinfo.sh index a80b2db47aa..a54960705be 100755 --- a/tools/buildinfo.sh +++ b/tools/buildinfo.sh @@ -10,6 +10,8 @@ echo "ro.build.version.sdk=$PLATFORM_SDK_VERSION" echo "ro.build.version.codename=$PLATFORM_VERSION_CODENAME" echo "ro.build.version.all_codenames=$PLATFORM_VERSION_ALL_CODENAMES" echo "ro.build.version.release=$PLATFORM_VERSION" +echo "ro.build.version.security_patch=$PLATFORM_SECURITY_PATCH" +echo "ro.build.version.base_os=$PLATFORM_BASE_OS" echo "ro.build.date=`date`" echo "ro.build.date.utc=`date +%s`" echo "ro.build.type=$TARGET_BUILD_TYPE" @@ -17,10 +19,8 @@ echo "ro.build.user=$USER" echo "ro.build.host=`hostname`" echo "ro.build.tags=$BUILD_VERSION_TAGS" echo "ro.build.flavor=$TARGET_BUILD_FLAVOR" -echo "ro.product.model=$PRODUCT_MODEL" echo "ro.product.brand=$PRODUCT_BRAND" echo "ro.product.name=$PRODUCT_NAME" -echo "ro.product.device=$TARGET_DEVICE" echo "ro.product.board=$TARGET_BOOTLOADER_BOARD_NAME" # These values are deprecated, use "ro.product.cpu.abilist" @@ -45,15 +45,20 @@ fi echo "ro.wifi.channels=$PRODUCT_DEFAULT_WIFI_CHANNELS" echo "ro.board.platform=$TARGET_BOARD_PLATFORM" -echo "# ro.build.product is obsolete; use ro.product.device" -echo "ro.build.product=$TARGET_DEVICE" - -echo "# Do not try to parse description, fingerprint, or thumbprint" -echo "ro.build.description=$PRIVATE_BUILD_DESC" -echo "ro.build.fingerprint=$BUILD_FINGERPRINT" -if [ -n "$BUILD_THUMBPRINT" ] ; then - echo "ro.build.thumbprint=$BUILD_THUMBPRINT" +if [ "$TARGET_UNIFIED_DEVICE" == "" ] ; then + echo "# ro.build.product is obsolete; use ro.product.device" + echo "ro.build.product=$TARGET_DEVICE" + echo "ro.product.model=$PRODUCT_MODEL" + echo "ro.product.device=$TARGET_DEVICE" + echo "# Do not try to parse description, fingerprint, or thumbprint" + echo "ro.build.description=$PRIVATE_BUILD_DESC" + echo "ro.build.fingerprint=$BUILD_FINGERPRINT" + if [ -n "$BUILD_THUMBPRINT" ] ; then + echo "ro.build.thumbprint=$BUILD_THUMBPRINT" + fi fi echo "ro.build.characteristics=$TARGET_AAPT_CHARACTERISTICS" +echo "ro.cm.device=$CM_DEVICE" + echo "# end build properties" diff --git a/tools/device/AndroidBoard.mk.template b/tools/device/AndroidBoard.mk.template new file mode 100644 index 00000000000..55a36d52357 --- /dev/null +++ b/tools/device/AndroidBoard.mk.template @@ -0,0 +1,8 @@ +LOCAL_PATH := $(call my-dir) + +include $(CLEAR_VARS) + +ALL_PREBUILT += $(INSTALLED_KERNEL_TARGET) + +# include the non-open-source counterpart to this file +-include vendor/__MANUFACTURER__/__DEVICE__/AndroidBoardVendor.mk diff --git a/tools/device/AndroidProducts.mk.template b/tools/device/AndroidProducts.mk.template new file mode 100644 index 00000000000..f31c5bf7999 --- /dev/null +++ b/tools/device/AndroidProducts.mk.template @@ -0,0 +1,2 @@ +PRODUCT_MAKEFILES := \ + $(LOCAL_DIR)/device___DEVICE__.mk diff --git a/tools/device/BoardConfig.mk.template b/tools/device/BoardConfig.mk.template new file mode 100644 index 00000000000..617673f9807 --- /dev/null +++ b/tools/device/BoardConfig.mk.template @@ -0,0 +1,31 @@ +USE_CAMERA_STUB := true + +# inherit from the proprietary version +-include vendor/__MANUFACTURER__/__DEVICE__/BoardConfigVendor.mk + +TARGET_ARCH := arm +TARGET_NO_BOOTLOADER := true +TARGET_BOARD_PLATFORM := unknown +TARGET_CPU_ABI := armeabi-v7a +TARGET_CPU_ABI2 := armeabi +TARGET_ARCH_VARIANT := armv7-a-neon +TARGET_CPU_VARIANT := cortex-a7 +TARGET_CPU_SMP := true +ARCH_ARM_HAVE_TLS_REGISTER := true + +TARGET_BOOTLOADER_BOARD_NAME := __DEVICE__ + +BOARD_KERNEL_CMDLINE := __CMDLINE__ +BOARD_KERNEL_BASE := 0x__BASE__ +BOARD_KERNEL_PAGESIZE := __PAGE_SIZE__ + +# fix this up by examining /proc/mtd on a running device +BOARD_BOOTIMAGE_PARTITION_SIZE := 0x00380000 +BOARD_RECOVERYIMAGE_PARTITION_SIZE := 0x00480000 +BOARD_SYSTEMIMAGE_PARTITION_SIZE := 0x08c60000 +BOARD_USERDATAIMAGE_PARTITION_SIZE := 0x105c0000 +BOARD_FLASH_BLOCK_SIZE := 131072 + +TARGET_PREBUILT_KERNEL := device/__MANUFACTURER__/__DEVICE__/kernel + +BOARD_HAS_NO_SELECT_BUTTON := true diff --git a/tools/device/cm.mk.template b/tools/device/cm.mk.template new file mode 100644 index 00000000000..e07898a411c --- /dev/null +++ b/tools/device/cm.mk.template @@ -0,0 +1,15 @@ +# Release name +PRODUCT_RELEASE_NAME := __DEVICE__ + +# Inherit some common CM stuff. +$(call inherit-product, vendor/cm/config/common_full_phone.mk) + +# Inherit device configuration +$(call inherit-product, device/__MANUFACTURER__/__DEVICE__/device___DEVICE__.mk) + +## Device identifier. This must come after all inclusions +PRODUCT_DEVICE := __DEVICE__ +PRODUCT_NAME := cm___DEVICE__ +PRODUCT_BRAND := __MANUFACTURER__ +PRODUCT_MODEL := __DEVICE__ +PRODUCT_MANUFACTURER := __MANUFACTURER__ diff --git a/tools/device/device.mk.template b/tools/device/device.mk.template new file mode 100644 index 00000000000..91ffdc951cc --- /dev/null +++ b/tools/device/device.mk.template @@ -0,0 +1,24 @@ +$(call inherit-product, $(SRC_TARGET_DIR)/product/languages_full.mk) + +# The gps config appropriate for this device +$(call inherit-product, device/common/gps/gps_us_supl.mk) + +$(call inherit-product-if-exists, vendor/__MANUFACTURER__/__DEVICE__/__DEVICE__-vendor.mk) + +DEVICE_PACKAGE_OVERLAYS += device/__MANUFACTURER__/__DEVICE__/overlay + + +ifeq ($(TARGET_PREBUILT_KERNEL),) + LOCAL_KERNEL := device/__MANUFACTURER__/__DEVICE__/kernel +else + LOCAL_KERNEL := $(TARGET_PREBUILT_KERNEL) +endif + +PRODUCT_COPY_FILES += \ + $(LOCAL_KERNEL):kernel + +$(call inherit-product, build/target/product/full.mk) + +PRODUCT_BUILD_PROP_OVERRIDES += BUILD_UTC_DATE=0 +PRODUCT_NAME := full___DEVICE__ +PRODUCT_DEVICE := __DEVICE__ diff --git a/tools/device/makerecoveries.sh b/tools/device/makerecoveries.sh new file mode 100644 index 00000000000..f561c81f6c4 --- /dev/null +++ b/tools/device/makerecoveries.sh @@ -0,0 +1,69 @@ +if [ -z "$1" ] +then + echo "Please provide a lunch option." + return +fi + +PRODUCTS=$1 + +for product in $PRODUCTS +do + echo $product +done + +echo $(echo $PRODUCTS | wc -w) Products + +unset PUBLISHED_RECOVERIES + +MCP=$(which mcp) +if [ -z "$MCP" ] +then + NO_UPLOAD=true +fi + +function mcpguard () { + if [ -z $NO_UPLOAD ] + then + mcp $1 $2 + md5sum $1 > $1.md5sum.txt + mcp $1.md5sum.txt $2.md5sum.txt + fi +} + +VERSION=$(cat bootable/recovery/Android.mk | grep RECOVERY_VERSION | grep RECOVERY_NAME | awk '{ print $4 }' | sed s/v//g) +echo Recovery Version: $VERSION + +for lunchoption in $PRODUCTS +do + lunch $lunchoption + if [ -z $NO_CLEAN ] + then + rm -rf $OUT/obj/EXECUTABLES/recovery_intermediates + rm -rf $OUT/recovery* + rm -rf $OUT/root* + fi + DEVICE_NAME=$(echo $TARGET_PRODUCT | sed s/koush_// | sed s/aosp_// | sed s/motorola// | sed s/huawei_// | sed s/htc_// | sed s/_us// | sed s/cyanogen_// | sed s/generic_// | sed s/full_//) + PRODUCT_NAME=$(basename $OUT) + make -j16 recoveryzip + RESULT=$? + if [ $RESULT != "0" ] + then + echo build error! + break + fi + mcpguard $OUT/recovery.img recoveries/recovery-clockwork-$VERSION-$DEVICE_NAME.img + mcpguard $OUT/utilities/update.zip recoveries/recovery-clockwork-$VERSION-$DEVICE_NAME.zip + + if [ -f "ROMManagerManifest/devices.rb" ] + then + pushd ROMManagerManifest + ruby devices.rb $DEVICE_NAME $VERSION $lunchoption + popd + fi +done + +for published_recovery in $PUBLISHED_RECOVERIES +do + echo $published_recovery +done + diff --git a/tools/device/mkrecoveryzip.sh b/tools/device/mkrecoveryzip.sh new file mode 100755 index 00000000000..e6fae3708b5 --- /dev/null +++ b/tools/device/mkrecoveryzip.sh @@ -0,0 +1,97 @@ +#!/bin/bash + +OUT=$1 +SIGNAPK=$2 + +if [ -z "$OUT" -o -z "$SIGNAPK" ] +then + echo "Android build environment not detected." + exit 1 +fi + +ANDROID_ROOT=$(pwd) +OUT=$ANDROID_ROOT/$OUT +SIGNAPK=$ANDROID_ROOT/$SIGNAPK + +pushd . > /dev/null 2> /dev/null + +UTILITIES_DIR=$OUT/utilities +mkdir -p $UTILITIES_DIR +RECOVERY_DIR=$UTILITIES_DIR/recovery +rm -rf $RECOVERY_DIR +mkdir -p $RECOVERY_DIR +cd $RECOVERY_DIR +cp -R $OUT/recovery/root/etc etc +cp -R $OUT/recovery/root/sbin sbin +cp -R $OUT/recovery/root/res res +SCRIPT_DIR=META-INF/com/google/android +mkdir -p $SCRIPT_DIR +cp $OUT/system/bin/updater $SCRIPT_DIR/update-binary + + +UPDATER_SCRIPT=$SCRIPT_DIR/updater-script +rm -f $UPDATER_SCRIPT +touch $UPDATER_SCRIPT +mkdir -p $(dirname $UPDATER_SCRIPT) + +FILES= +SYMLINKS= + +for file in $(find .) +do + +if [ -d $file ] +then + continue +fi + +META_INF=$(echo $file | grep META-INF) +if [ ! -z $META_INF ] +then + continue; +fi + +if [ -h $file ] +then + SYMLINKS=$SYMLINKS' '$file +elif [ -f $file ] +then + FILES=$FILES' '$file +fi +done + + +echo 'ui_print("Replacing stock recovery with ClockworkMod recovery...");' >> $UPDATER_SCRIPT + +echo 'delete("sbin/recovery");' >> $UPDATER_SCRIPT +echo 'package_extract_file("sbin/recovery", "/sbin/recovery");' >> $UPDATER_SCRIPT +echo 'set_perm(0, 0, 0755, "/sbin/recovery");' >> $UPDATER_SCRIPT +echo 'symlink("recovery", "/sbin/busybox");' >> $UPDATER_SCRIPT + +echo 'run_program("/sbin/busybox", "sh", "-c", "busybox rm -f /etc ; busybox mkdir -p /etc;");' >> $UPDATER_SCRIPT + +for file in $FILES +do + echo 'delete("'$(echo $file | sed s!\\./!!g)'");' >> $UPDATER_SCRIPT + echo 'package_extract_file("'$(echo $file | sed s!\\./!!g)'", "'$(echo $file | sed s!\\./!/!g)'");' >> $UPDATER_SCRIPT + if [ -x $file ] + then + echo 'set_perm(0, 0, 0755, "'$(echo $file | sed s!\\./!/!g)'");' >> $UPDATER_SCRIPT + fi +done + +for file in $SYMLINKS +do + echo 'symlink("'$(readlink $file)'", "'$(echo $file | sed s!\\./!/!g)'");' >> $UPDATER_SCRIPT +done + +echo 'set_perm_recursive(0, 2000, 0755, 0755, "/sbin");' >> $UPDATER_SCRIPT +echo 'run_program("/sbin/busybox", "sh", "-c", "/sbin/killrecovery.sh");' >> $UPDATER_SCRIPT +rm -f $UTILITIES_DIR/unsigned.zip +rm -f $UTILITIES_DIR/update.zip +echo zip -ry $UTILITIES_DIR/unsigned.zip . -x $SYMLINKS '*\[*' '*\[\[*' +zip -ry $UTILITIES_DIR/unsigned.zip . -x $SYMLINKS '*\[*' '*\[\[*' +java -jar $SIGNAPK -w $ANDROID_ROOT/build/target/product/security/testkey.x509.pem $ANDROID_ROOT/build/target/product/security/testkey.pk8 $UTILITIES_DIR/unsigned.zip $UTILITIES_DIR/update.zip + +echo Recovery FakeFlash is now available at $OUT/utilities/update.zip +popd > /dev/null 2> /dev/null diff --git a/tools/device/mkvendor.sh b/tools/device/mkvendor.sh new file mode 100755 index 00000000000..778d82d9736 --- /dev/null +++ b/tools/device/mkvendor.sh @@ -0,0 +1,115 @@ +#!/bin/bash + +function usage +{ + echo Usage: + echo " $(basename $0) manufacturer device [boot.img]" + echo " The boot.img argument is the extracted recovery or boot image." + echo " The boot.img argument should not be provided for devices" + echo " that have non standard boot images (ie, Samsung)." + echo + echo Example: + echo " $(basename $0) motorola sholes ~/Downloads/recovery-sholes.img" + exit 0 +} + +MANUFACTURER=$1 +DEVICE=$2 +BOOTIMAGE=$3 + +UNPACKBOOTIMG=$(which unpackbootimg) + +echo Arguments: $@ + +if [ -z "$MANUFACTURER" ] +then + usage +fi + +if [ -z "$DEVICE" ] +then + usage +fi + +ANDROID_TOP=$(dirname $0)/../../../ +pushd $ANDROID_TOP > /dev/null +ANDROID_TOP=$(pwd) +popd > /dev/null + +TEMPLATE_DIR=$(dirname $0) +pushd $TEMPLATE_DIR > /dev/null +TEMPLATE_DIR=$(pwd) +popd > /dev/null + +DEVICE_DIR=$ANDROID_TOP/device/$MANUFACTURER/$DEVICE + +if [ ! -z "$BOOTIMAGE" ] +then + if [ -z "$UNPACKBOOTIMG" ] + then + echo unpackbootimg not found. Is your android build environment set up and have the host tools been built? + exit 0 + fi + + BOOTIMAGEFILE=$(basename $BOOTIMAGE) + + echo Output will be in $DEVICE_DIR + mkdir -p $DEVICE_DIR + + TMPDIR=/tmp/$(whoami)/bootimg + rm -rf $TMPDIR + mkdir -p $TMPDIR + cp $BOOTIMAGE $TMPDIR + pushd $TMPDIR > /dev/null + unpackbootimg -i $BOOTIMAGEFILE > /dev/null + mkdir ramdisk + pushd ramdisk > /dev/null + gunzip -c ../$BOOTIMAGEFILE-ramdisk.gz | cpio -i + popd > /dev/null + BASE=$(cat $TMPDIR/$BOOTIMAGEFILE-base) + CMDLINE=$(cat $TMPDIR/$BOOTIMAGEFILE-cmdline) + PAGESIZE=$(cat $TMPDIR/$BOOTIMAGEFILE-pagesize) + export SEDCMD="s#__CMDLINE__#$CMDLINE#g" + echo $SEDCMD > $TMPDIR/sedcommand + cp $TMPDIR/$BOOTIMAGEFILE-zImage $DEVICE_DIR/kernel + popd > /dev/null +else + mkdir -p $DEVICE_DIR + touch $DEVICE_DIR/kernel + BASE=10000000 + CMDLINE=no_console_suspend + PAGESIZE=00000800 + export SEDCMD="s#__CMDLINE__#$CMDLINE#g" + echo $SEDCMD > $TMPDIR/sedcommand +fi + +for file in $(find $TEMPLATE_DIR -name '*.template') +do + OUTPUT_FILE=$DEVICE_DIR/$(basename $(echo $file | sed s/\\.template//g)) + cat $file | sed s/__DEVICE__/$DEVICE/g | sed s/__MANUFACTURER__/$MANUFACTURER/g | sed -f $TMPDIR/sedcommand | sed s/__BASE__/$BASE/g | sed s/__PAGE_SIZE__/$PAGESIZE/g > $OUTPUT_FILE +done + +if [ ! -z "$TMPDIR" ] +then + RECOVERY_FSTAB=$TMPDIR/ramdisk/etc/recovery.fstab + if [ -f "$RECOVERY_FSTAB" ] + then + cp $RECOVERY_FSTAB $DEVICE_DIR/recovery.fstab + fi +fi + + +mv $DEVICE_DIR/device.mk $DEVICE_DIR/device_$DEVICE.mk + +echo Creating initial git repository. +pushd $DEVICE_DIR +git init +git add . +git commit -a -m "mkvendor.sh: Initial commit of $DEVICE" +popd + +echo Done! +echo Use the following command to set up your build environment: +echo ' 'lunch cm_$DEVICE-eng +echo And use the follwowing command to build a recovery: +echo ' '. build/tools/device/makerecoveries.sh cm_$DEVICE-eng diff --git a/tools/device/recovery.fstab.template b/tools/device/recovery.fstab.template new file mode 100644 index 00000000000..41fb92e8bd3 --- /dev/null +++ b/tools/device/recovery.fstab.template @@ -0,0 +1,10 @@ +# mount point fstype device [device2] + +/boot mtd boot +/cache yaffs2 cache +/data yaffs2 userdata +/misc mtd misc +/recovery mtd recovery +/sdcard vfat /dev/block/mmcblk0p1 /dev/block/mmcblk0 +/system yaffs2 system +/sd-ext ext4 /dev/block/mmcblk0p2 diff --git a/tools/device/system.prop.template b/tools/device/system.prop.template new file mode 100644 index 00000000000..4113929395e --- /dev/null +++ b/tools/device/system.prop.template @@ -0,0 +1,3 @@ +# +# system.prop for __DEVICE__ +# diff --git a/tools/getb64key.py b/tools/getb64key.py new file mode 100755 index 00000000000..a0cd1c3ec34 --- /dev/null +++ b/tools/getb64key.py @@ -0,0 +1,17 @@ +#!/usr/bin/env python + +import base64 +import sys +import os + +pkFile = open(sys.argv[1], 'rb').readlines() +base64Key = "" +inCert = False +for line in pkFile: + if line.startswith("-"): + inCert = not inCert + continue + + base64Key += line.strip() + +print base64.b16encode(base64.b64decode(base64Key)).lower() diff --git a/tools/mkdevicetarball.sh b/tools/mkdevicetarball.sh new file mode 100755 index 00000000000..d29ec20459c --- /dev/null +++ b/tools/mkdevicetarball.sh @@ -0,0 +1,65 @@ +#!/bin/bash +# +# Copyright (C) 2014, Canonical Ltd. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 3 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# See file /usr/share/common-licenses/GPL for more details. +# +# Make a device tarball from the Android build image, to be flashed +# with ubuntu-device-flash (--device-tarball) + +TMPDEVICEDIR=$(mktemp -d) +IMGDIR=${OUT} +DEVICETARBALL=${IMGDIR}/device_${TARGET_PRODUCT}.tar.xz +LXCPATH=${TMPDEVICEDIR}/system/var/lib/lxc/android + +function onExit() { + rm -Rf $TMPDEVICEDIR +} + +trap onExit EXIT + +[ -f $IMGDIR/system.img ] || { + echo $IMGDIR does not seem to contain the required Android img files + exit -1 +} + +mkdir -p ${LXCPATH} + +if file $IMGDIR/system.img | grep ": data" >/dev/null; then + echo "Copying system.img into a proper EXT4 filesystem" + simg2img $IMGDIR/system.img tmp.img >/dev/null + resize2fs -M tmp.img >/dev/null 2>&1 + mv tmp.img $LXCPATH/system.img +else + echo "Copying system.img which is already an EXT4 filesystem" + cp $IMGDIR/system.img /$LXCPATH +fi + +PDIR=${TMPDEVICEDIR}/partitions +mkdir -p $PDIR +cp ${IMGDIR}/boot.img $PDIR +cp ${IMGDIR}/recovery.img $PDIR + +echo "Creating the tarball" + +if which pxz >/dev/null;then + XZ=pxz + echo "Using parallel XZ compression" +else + echo "Using single threaded XZ compression, you may want to install pxz" + XZ=xz +fi + +pushd $TMPDEVICEDIR >/dev/null +tar --use-compress-program=$XZ -cf $DEVICETARBALL $(find . -type f) --owner=0 --group=0 +popd >/dev/null diff --git a/tools/post_process_props.py b/tools/post_process_props.py index 030826deb01..82c92a808c9 100755 --- a/tools/post_process_props.py +++ b/tools/post_process_props.py @@ -14,7 +14,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -import sys +import os, sys # Usage: post_process_props.py file.prop [blacklist_key, ...] # Blacklisted keys are removed from the property file, if present @@ -22,20 +22,27 @@ # See PROP_NAME_MAX and PROP_VALUE_MAX system_properties.h. # The constants in system_properties.h includes the termination NUL, # so we decrease the values by 1 here. -PROP_NAME_MAX = 31 +PROP_NAME_MAX = 32 PROP_VALUE_MAX = 91 # Put the modifications that you need to make into the /system/build.prop into this # function. The prop object has get(name) and put(name,value) methods. -def mangle_build_prop(prop): +def mangle_build_prop(prop, overrides): + if len(overrides) == 0: + return + overridelist = overrides.replace(" ",",").split(",") + for proppair in overridelist: + values = proppair.split("=") + prop.put(values[0], values[1]) + pass # Put the modifications that you need to make into the /default.prop into this # function. The prop object has get(name) and put(name,value) methods. def mangle_default_prop(prop): - # If ro.debuggable is 1, then enable adb on USB by default - # (this is for userdebug builds) - if prop.get("ro.debuggable") == "1": + # If ro.adb.secure is not 1, then enable adb on USB by default + # (this is for eng builds) + if prop.get("ro.adb.secure") != "1": val = prop.get("persist.sys.usb.config") if val == "": val = "adb" @@ -121,6 +128,10 @@ def write(self, f): def main(argv): filename = argv[1] + if (len(argv) > 2): + extraargs = argv[2] + else: + extraargs = "" f = open(filename) lines = f.readlines() f.close() @@ -128,7 +139,7 @@ def main(argv): properties = PropFile(lines) if filename.endswith("/build.prop"): - mangle_build_prop(properties) + mangle_build_prop(properties, extraargs) elif filename.endswith("/default.prop"): mangle_default_prop(properties) else: @@ -139,7 +150,7 @@ def main(argv): sys.exit(1) # Drop any blacklisted keys - for key in argv[2:]: + for key in argv[3:]: properties.delete(key) f = open(filename, 'w+') diff --git a/tools/pull-lp-bin.py b/tools/pull-lp-bin.py new file mode 100755 index 00000000000..2a0d8ca41d7 --- /dev/null +++ b/tools/pull-lp-bin.py @@ -0,0 +1,100 @@ +#!/usr/bin/env python3 +# +# pull-lp-bin -- pull a binary package from Launchpad +# +# Copyright (C) 2013, Canonical Ltd. +# +# Based on the pull-lp-source script (ubuntu-dev-tools) made by: +# - Iain Lane +# - Stefano Rivera +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 3 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# See file /usr/share/common-licenses/GPL for more details. +# +# Author: Ricardo Salveti + +import os +import sys +import urllib.request, urllib.error, urllib.parse +from optparse import OptionParser +from launchpadlib.launchpad import Launchpad + +cachedir = "~/.launchpadlib/cache" + +def main(): + usage = "Usage: %prog [-a|--arch ] [-o|--output ] [-t|--team ] [-p|--ppa ] [release]" + opt_parser = OptionParser(usage) + opt_parser.add_option('-a', '--arch', default='armhf', dest='ubuntu_arch', + help='Architecture for the binary package (default: armhf)') + opt_parser.add_option('-o', '--output', + help='Directory used to output the desired package') + opt_parser.add_option('-t', '--team', + help='Launchpad team that owns the PPA (to be used with --ppa)') + opt_parser.add_option('-p', '--ppa', + help='PPA used to look for the binary package') + (options, args) = opt_parser.parse_args() + if not args: + opt_parser.error("Must specify a package name") + + package = str(args[0]).lower() + + # Login anonymously to LP + lp = Launchpad.login_anonymously('pull-lp-bin', 'production', + cachedir, version="devel") + distro = lp.distributions['ubuntu'] + + if options.ppa and not options.team: + print("To use a PPA you also need to provide a team (from Launchpad)") + return + + if options.ppa: + archive = lp.people[options.team].getPPAByName(name=options.ppa) + else: + archive = lp.distributions['ubuntu'].main_archive + + if len(args) > 1: + release = str(args[1]) + else: + release = distro.current_series_link.split('/')[-1] + + pocket = 'Release' + bin_url = None + bpph = None + + series = distro.getSeries(name_or_version=release) + arch_series = series.getDistroArchSeries(archtag=options.ubuntu_arch) + bpph = archive.getPublishedBinaries(binary_name=package, + distro_arch_series=arch_series, + status="Published", pocket=pocket, + exact_match=True) + + if bpph: + version = bpph[0].binary_package_version + bin_url = bpph[0].binaryFileUrls()[0] + + if bin_url: + print('Downloading %s version %s' % (package, version)) + url = urllib.request.urlopen(bin_url) + data = url.read() + package_name = "%s_%s_%s.deb" % (package, version, options.ubuntu_arch) + if options.output: + target = "%s/%s" % (options.output, package_name) + else: + target = package_name + with open(target, "wb") as package: + package.write(data) + else: + print("Unable to find a published version of package %s (%s) at %s" % ( + package, options.ubuntu_arch, release)) + +if __name__ == '__main__': + main() diff --git a/tools/releasetools/add_img_to_target_files.py b/tools/releasetools/add_img_to_target_files.py index e98e4b67387..db9895dba00 100755 --- a/tools/releasetools/add_img_to_target_files.py +++ b/tools/releasetools/add_img_to_target_files.py @@ -105,6 +105,29 @@ def BuildVendor(input_dir, info_dict, block_list=None): file containing it.""" return CreateImage(input_dir, info_dict, "vendor", block_list=block_list) +def AddOem(output_zip, prefix="IMAGES/"): + """Turn the contents of OEM into a oem image and store in it + output_zip.""" + + prebuilt_path = os.path.join(OPTIONS.input_tmp, prefix, "oem.img") + if os.path.exists(prebuilt_path): + print "oem.img already exists in %s, no need to rebuild..." % (prefix,) + return + + block_list = common.MakeTempFile(prefix="oem-blocklist-", suffix=".map") + imgname = BuildOem(OPTIONS.input_tmp, OPTIONS.info_dict, + block_list=block_list) + with open(imgname, "rb") as f: + common.ZipWriteStr(output_zip, prefix + "oem.img", f.read()) + with open(block_list, "rb") as f: + common.ZipWriteStr(output_zip, prefix + "oem.map", f.read()) + + +def BuildOem(input_dir, info_dict, block_list=None): + """Build the (sparse) oem image and return the name of a temp + file containing it.""" + return CreateImage(input_dir, info_dict, "oem", block_list=block_list) + def CreateImage(input_dir, info_dict, what, block_list=None): print "creating " + what + ".img..." @@ -191,6 +214,53 @@ def AddUserdata(output_zip, prefix="IMAGES/"): os.rmdir(temp_dir) +def AddUserdataExtra(output_zip, prefix="IMAGES/"): + """Create extra userdata image and store it in output_zip.""" + + image_props = build_image.ImagePropFromGlobalDict(OPTIONS.info_dict, + "data_extra") + + # The build system has to explicitly request extra userdata. + if "fs_type" not in image_props: + return + + extra_name = image_props.get("partition_name", "extra") + + prebuilt_path = os.path.join(OPTIONS.input_tmp, prefix, "userdata_%s.img" % extra_name) + if os.path.exists(prebuilt_path): + print "userdata_%s.img already exists in %s, no need to rebuild..." % (extra_name, prefix,) + return + + # We only allow yaffs to have a 0/missing partition_size. + # Extfs, f2fs must have a size. Skip userdata_extra.img if no size. + if (not image_props.get("fs_type", "").startswith("yaffs") and + not image_props.get("partition_size")): + return + + print "creating userdata_%s.img..." % extra_name + + # The name of the directory it is making an image out of matters to + # mkyaffs2image. So we create a temp dir, and within it we create an + # empty dir named "data", and build the image from that. + temp_dir = tempfile.mkdtemp() + user_dir = os.path.join(temp_dir, "data") + os.mkdir(user_dir) + img = tempfile.NamedTemporaryFile() + + fstab = OPTIONS.info_dict["fstab"] + if fstab: + image_props["fs_type" ] = fstab["/data"].fs_type + succ = build_image.BuildImage(user_dir, image_props, img.name) + assert succ, "build userdata_%s.img image failed" % extra_name + + # Disable size check since this fetches original data partition size + #common.CheckSize(img.name, "userdata_extra.img", OPTIONS.info_dict) + output_zip.write(img.name, prefix + "userdata_%s.img" % extra_name) + img.close() + os.rmdir(user_dir) + os.rmdir(temp_dir) + + def AddCache(output_zip, prefix="IMAGES/"): """Create an empty cache image and store it in output_zip.""" @@ -243,6 +313,12 @@ def AddImagesToTargetFiles(filename): except KeyError: has_vendor = False + try: + input_zip.getinfo("OEM/") + has_oem = True + except KeyError: + has_oem = False + OPTIONS.info_dict = common.LoadInfoDict(input_zip) if "selinux_fc" in OPTIONS.info_dict: OPTIONS.info_dict["selinux_fc"] = os.path.join( @@ -290,8 +366,14 @@ def banner(s): AddVendor(output_zip) banner("userdata") AddUserdata(output_zip) + banner("extrauserdata") + AddUserdataExtra(output_zip) banner("cache") AddCache(output_zip) + if has_oem: + banner("oem") + AddOem(output_zip) + output_zip.close() diff --git a/tools/releasetools/blockimgdiff.py b/tools/releasetools/blockimgdiff.py index 8b179d5a320..079523ad998 100644 --- a/tools/releasetools/blockimgdiff.py +++ b/tools/releasetools/blockimgdiff.py @@ -16,6 +16,7 @@ from collections import deque, OrderedDict from hashlib import sha1 +import common import heapq import itertools import multiprocessing @@ -27,6 +28,12 @@ import threading import tempfile +try: + from backports import lzma +except ImportError: + lzma = None + pass + from rangelib import * __all__ = ["EmptyImage", "DataImage", "BlockImageDiff"] @@ -153,6 +160,12 @@ def NetStashChange(self): return (sum(sr.size() for (_, sr) in self.stash_before) - sum(sr.size() for (_, sr) in self.use_stash)) + def ConvertToNew(self): + assert self.style != "new" + self.use_stash = [] + self.style = "new" + self.src_ranges = RangeSet() + def __str__(self): return (str(self.id) + ": <" + str(self.src_ranges) + " " + self.style + " to " + str(self.tgt_ranges) + ">") @@ -190,14 +203,15 @@ def __str__(self): # original image. class BlockImageDiff(object): - def __init__(self, tgt, src=None, threads=None, version=2): + def __init__(self, tgt, src=None, threads=None, version=3, use_lzma=False): if threads is None: threads = multiprocessing.cpu_count() // 2 if threads == 0: threads = 1 self.threads = threads self.version = version + self.use_lzma = use_lzma - assert version in (1, 2) + assert version in (1, 2, 3) self.tgt = tgt if src is None: @@ -238,12 +252,25 @@ def Compute(self, prefix): self.ReverseBackwardEdges() self.ImproveVertexSequence() + # Ensure the runtime stash size is under the limit. + if self.version >= 2 and common.OPTIONS.cache_size is not None: + self.ReviseStashSize() + # Double-check our work. self.AssertSequenceGood() self.ComputePatches(prefix) self.WriteTransfers(prefix) + def HashBlocks(self, source, ranges): + data = source.ReadRangeSet(ranges) + ctx = sha1() + + for p in data: + ctx.update(p) + + return ctx.hexdigest() + def WriteTransfers(self, prefix): out = [] @@ -272,14 +299,24 @@ def WriteTransfers(self, prefix): next_stash_id += 1 stashes[s] = sid stashed_blocks += sr.size() - out.append("stash %d %s\n" % (sid, sr.to_string_raw())) + if self.version == 2: + out.append("stash %d %s\n" % (sid, sr.to_string_raw())) + else: + sh = self.HashBlocks(self.src, sr) + if sh in stashes: + stashes[sh] += 1 + else: + stashes[sh] = 1 + out.append("stash %s %s\n" % (sh, sr.to_string_raw())) if stashed_blocks > max_stashed_blocks: max_stashed_blocks = stashed_blocks + free_string = [] + if self.version == 1: src_string = xf.src_ranges.to_string_raw() - elif self.version == 2: + elif self.version >= 2: # <# blocks> # OR @@ -296,9 +333,24 @@ def WriteTransfers(self, prefix): sid = stashes.pop(s) stashed_blocks -= sr.size() unstashed_src_ranges = unstashed_src_ranges.subtract(sr) + sh = self.HashBlocks(self.src, sr) sr = xf.src_ranges.map_within(sr) mapped_stashes.append(sr) - src_string.append("%d:%s" % (sid, sr.to_string_raw())) + if self.version == 2: + src_string.append("%d:%s" % (sid, sr.to_string_raw())) + # A stash will be used only once. We need to free the stash + # immediately after the use, instead of waiting for the automatic + # clean-up at the end. Because otherwise it may take up extra space + # and lead to OTA failures. + # Bug: 23119955 + free_string.append("free %d\n" % (sid,)) + else: + assert sh in stashes + src_string.append("%s:%s" % (sh, sr.to_string_raw())) + stashes[sh] -= 1 + if stashes[sh] == 0: + free_string.append("free %s\n" % (sh)) + stashes.pop(sh) heapq.heappush(free_stash_ids, sid) if unstashed_src_ranges: @@ -314,7 +366,7 @@ def WriteTransfers(self, prefix): src_string = " ".join(src_string) - # both versions: + # all versions: # zero # new # erase @@ -328,6 +380,11 @@ def WriteTransfers(self, prefix): # bsdiff patchstart patchlen # imgdiff patchstart patchlen # move + # + # version 3: + # bsdiff patchstart patchlen srchash tgthash + # imgdiff patchstart patchlen srchash tgthash + # move hash tgt_size = xf.tgt_ranges.size() @@ -348,6 +405,17 @@ def WriteTransfers(self, prefix): out.append("%s %s %s\n" % ( xf.style, xf.tgt_ranges.to_string_raw(), src_string)) + elif self.version >= 3: + # take into account automatic stashing of overlapping blocks + if xf.src_ranges.overlaps(xf.tgt_ranges): + temp_stash_usage = stashed_blocks + xf.src_ranges.size(); + if temp_stash_usage > max_stashed_blocks: + max_stashed_blocks = temp_stash_usage + + out.append("%s %s %s %s\n" % ( + xf.style, + self.HashBlocks(self.tgt, xf.tgt_ranges), + xf.tgt_ranges.to_string_raw(), src_string)) total += tgt_size elif xf.style in ("bsdiff", "imgdiff"): performs_read = True @@ -361,6 +429,19 @@ def WriteTransfers(self, prefix): out.append("%s %d %d %s %s\n" % ( xf.style, xf.patch_start, xf.patch_len, xf.tgt_ranges.to_string_raw(), src_string)) + elif self.version >= 3: + # take into account automatic stashing of overlapping blocks + if xf.src_ranges.overlaps(xf.tgt_ranges): + temp_stash_usage = stashed_blocks + xf.src_ranges.size(); + if temp_stash_usage > max_stashed_blocks: + max_stashed_blocks = temp_stash_usage + + out.append("%s %d %d %s %s %s %s\n" % ( + xf.style, + xf.patch_start, xf.patch_len, + self.HashBlocks(self.src, xf.src_ranges), + self.HashBlocks(self.tgt, xf.tgt_ranges), + xf.tgt_ranges.to_string_raw(), src_string)) total += tgt_size elif xf.style == "zero": assert xf.tgt_ranges @@ -371,10 +452,23 @@ def WriteTransfers(self, prefix): else: raise ValueError, "unknown transfer style '%s'\n" % (xf.style,) - - # sanity check: abort if we're going to need more than 512 MB if - # stash space - assert max_stashed_blocks * self.tgt.blocksize < (512 << 20) + if free_string: + out.append("".join(free_string)) + + if self.version >= 2 and common.OPTIONS.cache_size is not None: + # Sanity check: abort if we're going to need more stash space than + # the allowed size (cache_size * threshold). There are two purposes + # of having a threshold here. a) Part of the cache may have been + # occupied by some recovery logs. b) It will buy us some time to deal + # with the oversize issue. + cache_size = common.OPTIONS.cache_size + stash_threshold = common.OPTIONS.stash_threshold + max_allowed = cache_size * stash_threshold + assert max_stashed_blocks * self.tgt.blocksize < max_allowed, \ + 'Stash size %d (%d * %d) exceeds the limit %d (%d * %.2f)' % ( + max_stashed_blocks * self.tgt.blocksize, max_stashed_blocks, + self.tgt.blocksize, max_allowed, cache_size, + stash_threshold) all_tgt = RangeSet(data=(0, self.tgt.total_blocks)) if performs_read: @@ -402,14 +496,98 @@ def WriteTransfers(self, prefix): f.write(i) if self.version >= 2: - print("max stashed blocks: %d (%d bytes)\n" % ( - max_stashed_blocks, max_stashed_blocks * self.tgt.blocksize)) + max_stashed_size = max_stashed_blocks * self.tgt.blocksize + OPTIONS = common.OPTIONS + if OPTIONS.cache_size is not None: + max_allowed = OPTIONS.cache_size * OPTIONS.stash_threshold + print("max stashed blocks: %d (%d bytes), " + "limit: %d bytes (%.2f%%)\n" % ( + max_stashed_blocks, max_stashed_size, max_allowed, + max_stashed_size * 100.0 / max_allowed)) + else: + print("max stashed blocks: %d (%d bytes), limit: \n" % ( + max_stashed_blocks, max_stashed_size)) + + def ReviseStashSize(self): + print("Revising stash size...") + stashes = {} + + # Create the map between a stash and its def/use points. For example, for a + # given stash of (idx, sr), stashes[idx] = (sr, def_cmd, use_cmd). + for xf in self.transfers: + # Command xf defines (stores) all the stashes in stash_before. + for idx, sr in xf.stash_before: + stashes[idx] = (sr, xf) + + # Record all the stashes command xf uses. + for idx, _ in xf.use_stash: + stashes[idx] += (xf,) + + # Compute the maximum blocks available for stash based on /cache size and + # the threshold. + cache_size = common.OPTIONS.cache_size + stash_threshold = common.OPTIONS.stash_threshold + max_allowed = cache_size * stash_threshold / self.tgt.blocksize + + stashed_blocks = 0 + + # Now go through all the commands. Compute the required stash size on the + # fly. If a command requires excess stash than available, it deletes the + # stash by replacing the command that uses the stash with a "new" command + # instead. + for xf in self.transfers: + replaced_cmds = [] + + # xf.stash_before generates explicit stash commands. + for idx, sr in xf.stash_before: + if stashed_blocks + sr.size() > max_allowed: + # We cannot stash this one for a later command. Find out the command + # that will use this stash and replace the command with "new". + use_cmd = stashes[idx][2] + replaced_cmds.append(use_cmd) + print(" %s replaced due to an explicit stash of %d blocks." % ( + use_cmd, sr.size())) + else: + stashed_blocks += sr.size() + + # xf.use_stash generates free commands. + for _, sr in xf.use_stash: + stashed_blocks -= sr.size() + + # "move" and "diff" may introduce implicit stashes in BBOTA v3. Prior to + # ComputePatches(), they both have the style of "diff". + if xf.style == "diff" and self.version >= 3: + assert xf.tgt_ranges and xf.src_ranges + if xf.src_ranges.overlaps(xf.tgt_ranges): + if stashed_blocks + xf.src_ranges.size() > max_allowed: + replaced_cmds.append(xf) + print(" %s replaced due to an implicit stash of %d blocks." % ( + xf, xf.src_ranges.size())) + + # Replace the commands in replaced_cmds with "new"s. + for cmd in replaced_cmds: + # It no longer uses any commands in "use_stash". Remove the def points + # for all those stashes. + for idx, sr in cmd.use_stash: + def_cmd = stashes[idx][1] + assert (idx, sr) in def_cmd.stash_before + def_cmd.stash_before.remove((idx, sr)) + + cmd.ConvertToNew() def ComputePatches(self, prefix): print("Reticulating splines...") diff_q = [] patch_num = 0 - with open(prefix + ".new.dat", "wb") as new_f: + + if lzma and self.use_lzma: + open_patch = lzma.open + new_file = ".new.dat.xz" + else: + open_patch = open + new_file = ".new.dat" + + with open_patch(prefix + new_file, "wb") as new_f: for xf in self.transfers: if xf.style == "zero": pass diff --git a/tools/releasetools/build_image.py b/tools/releasetools/build_image.py index 302aa0c7faf..28933ec9025 100755 --- a/tools/releasetools/build_image.py +++ b/tools/releasetools/build_image.py @@ -220,6 +220,7 @@ def BuildImage(in_dir, prop_dict, out_file, build_command = [] fs_type = prop_dict.get("fs_type", "") run_fsck = False + ubuntu_image = (os.path.basename(out_file).startswith("ubuntu")) is_verity_partition = "verity_block_device" in prop_dict verity_supported = prop_dict.get("verity") == "true" @@ -233,12 +234,22 @@ def BuildImage(in_dir, prop_dict, out_file, prop_dict["original_partition_size"] = str(partition_size) if fs_type.startswith("ext"): - build_command = ["mkuserimg.sh"] + if ubuntu_image: + build_command = ["mkubuntuimg.sh"] + else: + build_command = ["mkuserimg.sh"] if "extfs_sparse_flag" in prop_dict: build_command.append(prop_dict["extfs_sparse_flag"]) - run_fsck = True - build_command.extend([in_dir, out_file, fs_type, - prop_dict["mount_point"]]) + #run_fsck = True + if not ubuntu_image and "extfs_inodes" in prop_dict: + build_command.append("-i") + build_command.append(prop_dict["extfs_inodes"]) + if "is_userdataextra" in prop_dict: + build_command.extend([in_dir, out_file, fs_type, + "data"]) + else: + build_command.extend([in_dir, out_file, fs_type, + prop_dict["mount_point"]]) build_command.append(prop_dict["partition_size"]) if "journal_size" in prop_dict: build_command.extend(["-j", prop_dict["journal_size"]]) @@ -248,10 +259,14 @@ def BuildImage(in_dir, prop_dict, out_file, build_command.extend(["-C", fs_config]) if block_list is not None: build_command.extend(["-B", block_list]) + if "transparent_compression_method" in prop_dict: + build_command.extend(["-M", prop_dict["transparent_compression_method"]]) if fc_config is not None: build_command.append(fc_config) - elif "selinux_fc" in prop_dict: + elif not ubuntu_image and "selinux_fc" in prop_dict: build_command.append(prop_dict["selinux_fc"]) + elif ubuntu_image and "fs_content" in prop_dict: + build_command.append(prop_dict["fs_content"]) elif fs_type.startswith("f2fs"): build_command = ["mkf2fsuserimg.sh"] build_command.extend([out_file, prop_dict["partition_size"]]) @@ -312,7 +327,8 @@ def copy_prop(src_p, dest_p): "skip_fsck", "verity", "verity_key", - "verity_signer_cmd" + "verity_signer_cmd", + "transparent_compression_method" ) for p in common_props: copy_prop(p, p) @@ -320,6 +336,7 @@ def copy_prop(src_p, dest_p): d["mount_point"] = mount_point if mount_point == "system": copy_prop("fs_type", "fs_type") + copy_prop("system_fs_type", "fs_type") copy_prop("system_size", "partition_size") copy_prop("system_journal_size", "journal_size") copy_prop("system_verity_block_device", "verity_block_device") @@ -328,6 +345,11 @@ def copy_prop(src_p, dest_p): copy_prop("fs_type", "fs_type") copy_prop("userdata_fs_type", "fs_type") copy_prop("userdata_size", "partition_size") + elif mount_point == "data_extra": + copy_prop("fs_type", "fs_type") + copy_prop("userdataextra_size", "partition_size") + copy_prop("userdataextra_name", "partition_name") + d["is_userdataextra"] = True elif mount_point == "cache": copy_prop("cache_fs_type", "fs_type") copy_prop("cache_size", "partition_size") @@ -340,6 +362,19 @@ def copy_prop(src_p, dest_p): copy_prop("fs_type", "fs_type") copy_prop("oem_size", "partition_size") copy_prop("oem_journal_size", "journal_size") + elif mount_point == "ubuntu-custom": + copy_prop("fs_type", "fs_type") + copy_prop("ubuntu_custom_size", "partition_size") + copy_prop("ubuntu_custom_content", "fs_content") + # Actual mount point for Ubuntu is also custom, correct it + del d["mount_point"] + d["mount_point"] = "custom" + del d["selinux_fc"] + elif mount_point == "/": + copy_prop("fs_type", "fs_type") + copy_prop("ubuntu_rootfs_size", "partition_size") + copy_prop("ubuntu_rootfs_content", "fs_content") + del d["selinux_fc"] return d @@ -371,6 +406,8 @@ def main(argv): image_filename = os.path.basename(out_file) mount_point = "" if image_filename == "system.img": + # don't use sparse option for Android system.img + glob_dict.pop("extfs_sparse_flag", None) mount_point = "system" elif image_filename == "userdata.img": mount_point = "data" @@ -378,6 +415,11 @@ def main(argv): mount_point = "cache" elif image_filename == "vendor.img": mount_point = "vendor" + # Allow Ubuntu custom images to have custom tags + elif image_filename.startswith("ubuntucustom") and image_filename.endswith(".img"): + mount_point = "ubuntu-custom" + elif image_filename == "ubunturootfs.img": + mount_point = "/" elif image_filename == "oem.img": mount_point = "oem" else: diff --git a/tools/releasetools/common.py b/tools/releasetools/common.py old mode 100644 new mode 100755 index 8941f890ff3..60c59e607f8 --- a/tools/releasetools/common.py +++ b/tools/releasetools/common.py @@ -29,6 +29,11 @@ import time import zipfile +try: + from backports import lzma; +except ImportError: + lzma = None + import blockimgdiff from rangelib import * @@ -62,6 +67,10 @@ class Options(object): pass OPTIONS.extras = {} OPTIONS.info_dict = None +# Stash size cannot exceed cache_size * threshold. +OPTIONS.cache_size = None +OPTIONS.stash_threshold = 0.8 + # Values for "certificate" in apkcerts that mean special things. SPECIAL_CERT_STRINGS = ("PRESIGNED", "EXTERNAL") @@ -143,6 +152,8 @@ def read_helper(fn): if "fstab_version" not in d: d["fstab_version"] = "1" + if "device_type" not in d: + d["device_type"] = "MMC" try: data = read_helper("META/imagesizes.txt") for line in data.split("\n"): @@ -166,11 +177,13 @@ def makeint(key): makeint("vendor_size") makeint("userdata_size") makeint("cache_size") + makeint("ubuntu_custom_size") + makeint("ubuntu_rootfs_size") makeint("recovery_size") makeint("boot_size") makeint("fstab_version") - d["fstab"] = LoadRecoveryFSTab(read_helper, d["fstab_version"]) + d["fstab"] = LoadRecoveryFSTab(read_helper, d["fstab_version"], d["device_type"]) d["build.prop"] = LoadBuildProp(read_helper) return d @@ -192,7 +205,7 @@ def LoadDictionaryFromLines(lines): d[name] = value return d -def LoadRecoveryFSTab(read_helper, fstab_version): +def LoadRecoveryFSTab(read_helper, fstab_version, type): class Partition(object): pass @@ -285,66 +298,141 @@ def BuildBootableImage(sourcedir, fs_config_file, info_dict=None): data, or None if sourcedir does not appear to contains files for building the requested image.""" - if (not os.access(os.path.join(sourcedir, "RAMDISK"), os.F_OK) or + if (((not os.access(os.path.join(sourcedir, "RAMDISK"), os.F_OK)) or + not os.access(os.path.join(sourcedir, "ramdisk.img"), os.F_OK)) or not os.access(os.path.join(sourcedir, "kernel"), os.F_OK)): return None if info_dict is None: info_dict = OPTIONS.info_dict - ramdisk_img = tempfile.NamedTemporaryFile() img = tempfile.NamedTemporaryFile() + bootimg_key = os.getenv("PRODUCT_PRIVATE_KEY", None) - if os.access(fs_config_file, os.F_OK): - cmd = ["mkbootfs", "-f", fs_config_file, os.path.join(sourcedir, "RAMDISK")] + # prefer the pre-built ramdisk, otherwise build a new from RAMDISK + if os.access(os.path.join(sourcedir, "ramdisk.img"), os.F_OK): + ramdisk = os.path.join(sourcedir, "ramdisk.img") else: - cmd = ["mkbootfs", os.path.join(sourcedir, "RAMDISK")] - p1 = Run(cmd, stdout=subprocess.PIPE) - p2 = Run(["minigzip"], - stdin=p1.stdout, stdout=ramdisk_img.file.fileno()) - - p2.wait() - p1.wait() - assert p1.returncode == 0, "mkbootfs of %s ramdisk failed" % (targetname,) - assert p2.returncode == 0, "minigzip of %s ramdisk failed" % (targetname,) - - # use MKBOOTIMG from environ, or "mkbootimg" if empty or not set - mkbootimg = os.getenv('MKBOOTIMG') or "mkbootimg" - - cmd = [mkbootimg, "--kernel", os.path.join(sourcedir, "kernel")] - - fn = os.path.join(sourcedir, "second") - if os.access(fn, os.F_OK): - cmd.append("--second") - cmd.append(fn) + ramdisk_img = tempfile.NamedTemporaryFile() + ramdisk = ramdisk_img.name - fn = os.path.join(sourcedir, "cmdline") - if os.access(fn, os.F_OK): - cmd.append("--cmdline") - cmd.append(open(fn).read().rstrip("\n")) - - fn = os.path.join(sourcedir, "base") - if os.access(fn, os.F_OK): - cmd.append("--base") - cmd.append(open(fn).read().rstrip("\n")) - - fn = os.path.join(sourcedir, "pagesize") + if os.access(fs_config_file, os.F_OK): + cmd = ["mkbootfs", "-f", fs_config_file, os.path.join(sourcedir, "RAMDISK")] + else: + cmd = ["mkbootfs", os.path.join(sourcedir, "RAMDISK")] + p1 = Run(cmd, stdout=subprocess.PIPE) + p2 = Run(["minigzip"], + stdin=p1.stdout, stdout=ramdisk_img.file.fileno()) + + p2.wait() + p1.wait() + assert p1.returncode == 0, "mkbootfs of %s ramdisk failed" % (targetname,) + assert p2.returncode == 0, "minigzip of %s ramdisk failed" % (targetname,) + ramdisk_img.close() + + """check if uboot is requested""" + fn = os.path.join(sourcedir, "ubootargs") if os.access(fn, os.F_OK): - cmd.append("--pagesize") - cmd.append(open(fn).read().rstrip("\n")) - - args = info_dict.get("mkbootimg_args", None) - if args and args.strip(): - cmd.extend(shlex.split(args)) - - cmd.extend(["--ramdisk", ramdisk_img.name, - "--output", img.name]) + cmd = ["mkimage"] + for argument in open(fn).read().rstrip("\n").split(" "): + cmd.append(argument) + cmd.append("-d") + cmd.append(os.path.join(sourcedir, "kernel")+":"+ramdisk_img.name) + cmd.append(img.name) + else: + # use MKBOOTIMG from environ, or "mkbootimg" if empty or not set + mkbootimg = os.getenv('MKBOOTIMG') or "mkbootimg" + cmd = [mkbootimg, "--kernel", os.path.join(sourcedir, "kernel")] + + fn = os.path.join(sourcedir, "second") + if os.access(fn, os.F_OK): + cmd.append("--second") + cmd.append(fn) + + fn = os.path.join(sourcedir, "cmdline") + if os.access(fn, os.F_OK): + cmd.append("--cmdline") + cmd.append(open(fn).read().rstrip("\n")) + + fn = os.path.join(sourcedir, "base") + if os.access(fn, os.F_OK): + cmd.append("--base") + cmd.append(open(fn).read().rstrip("\n")) + + fn = os.path.join(sourcedir, "tagsaddr") + if os.access(fn, os.F_OK): + cmd.append("--tags-addr") + cmd.append(open(fn).read().rstrip("\n")) + + fn = os.path.join(sourcedir, "tags_offset") + if os.access(fn, os.F_OK): + cmd.append("--tags_offset") + cmd.append(open(fn).read().rstrip("\n")) + + fn = os.path.join(sourcedir, "ramdisk_offset") + if os.access(fn, os.F_OK): + cmd.append("--ramdisk_offset") + cmd.append(open(fn).read().rstrip("\n")) + + fn = os.path.join(sourcedir, "dt") + if os.access(fn, os.F_OK): + cmd.append("--dt") + cmd.append(fn) + + fn = os.path.join(sourcedir, "pagesize") + if os.access(fn, os.F_OK): + kernel_pagesize=open(fn).read().rstrip("\n") + cmd.append("--pagesize") + cmd.append(kernel_pagesize) + + args = info_dict.get("mkbootimg_args", None) + if args and args.strip(): + cmd.extend(shlex.split(args)) + + cmd.extend(["--ramdisk", ramdisk, + "--output", img.name]) p = Run(cmd, stdout=subprocess.PIPE) p.communicate() assert p.returncode == 0, "mkbootimg of %s image failed" % ( os.path.basename(sourcedir),) + if bootimg_key and os.path.exists(bootimg_key) and kernel_pagesize > 0: + print "Signing bootable image..." + bootimg_key_passwords = {} + bootimg_key_passwords.update(PasswordManager().GetPasswords(bootimg_key.split())) + bootimg_key_password = bootimg_key_passwords[bootimg_key] + if bootimg_key_password is not None: + bootimg_key_password += "\n" + img_sha256 = tempfile.NamedTemporaryFile() + img_sig = tempfile.NamedTemporaryFile() + img_sig_padded = tempfile.NamedTemporaryFile() + img_secure = tempfile.NamedTemporaryFile() + p = Run(["openssl", "dgst", "-sha256", "-binary", "-out", img_sha256.name, img.name], + stdout=subprocess.PIPE) + p.communicate() + assert p.returncode == 0, "signing of bootable image failed" + p = Run(["openssl", "rsautl", "-sign", "-in", img_sha256.name, "-inkey", bootimg_key, "-out", + img_sig.name, "-passin", "stdin"], stdin=subprocess.PIPE, stdout=subprocess.PIPE) + p.communicate(bootimg_key_password) + assert p.returncode == 0, "signing of bootable image failed" + p = Run(["dd", "if=/dev/zero", "of=%s" % img_sig_padded.name, "bs=%s" % kernel_pagesize, + "count=1"], stdout=subprocess.PIPE) + p.communicate() + assert p.returncode == 0, "signing of bootable image failed" + p = Run(["dd", "if=%s" % img_sig.name, "of=%s" % img_sig_padded.name, "conv=notrunc"], + stdout=subprocess.PIPE) + p.communicate() + assert p.returncode == 0, "signing of bootable image failed" + p = Run(["cat", img.name, img_sig_padded.name], stdout=img_secure.file.fileno()) + p.communicate() + assert p.returncode == 0, "signing of bootable image failed" + shutil.copyfile(img_secure.name, img.name) + img_sha256.close() + img_sig.close() + img_sig_padded.close() + img_secure.close() + if info_dict.get("verity_key", None): path = "/" + os.path.basename(sourcedir).lower() cmd = ["boot_signer", path, img.name, info_dict["verity_key"] + ".pk8", info_dict["verity_key"] + ".x509.pem", img.name] @@ -355,7 +443,6 @@ def BuildBootableImage(sourcedir, fs_config_file, info_dict=None): img.seek(os.SEEK_SET, 0) data = img.read() - ramdisk_img.close() img.close() return data @@ -403,6 +490,7 @@ def UnzipTemp(filename, pattern=None): OPTIONS.tempfiles.append(tmp) def unzip_to_dir(filename, dirname): + subprocess.call(["rm", "-rf", dirname + filename, "targetfiles-*"]) cmd = ["unzip", "-o", "-q", filename, "-d", dirname] if pattern is not None: cmd.append(pattern) @@ -530,6 +618,7 @@ def CheckSize(data, target, info_dict): fs_type = None limit = None if info_dict["fstab"]: + if mount_point == "/userdata_extra": mount_point = "/data" if mount_point == "/userdata": mount_point = "/data" p = info_dict["fstab"][mount_point] fs_type = p.fs_type @@ -845,6 +934,11 @@ def FullOTA_InstallEnd(self): used to install the image for the device's baseband processor.""" return self._DoCall("FullOTA_InstallEnd") + def FullOTA_PostValidate(self): + """Called after installing and validating /system; typically this is + used to resize the system partition after a block based installation.""" + return self._DoCall("FullOTA_PostValidate") + def IncrementalOTA_Assertions(self): """Called after emitting the block of assertions at the top of an incremental OTA package. Implementations can add whatever @@ -1024,20 +1118,23 @@ def worker(): class BlockDifference: - def __init__(self, partition, tgt, src=None, check_first_block=False): + def __init__(self, partition, tgt, src=None, check_first_block=False, version=None, use_lzma=False): self.tgt = tgt self.src = src self.partition = partition self.check_first_block = check_first_block + self.use_lzma = use_lzma - version = 1 - if OPTIONS.info_dict: - version = max( - int(i) for i in - OPTIONS.info_dict.get("blockimgdiff_versions", "1").split(",")) + if version is None: + version = 1 + if OPTIONS.info_dict: + version = max( + int(i) for i in + OPTIONS.info_dict.get("blockimgdiff_versions", "1").split(",")) + self.version = version b = blockimgdiff.BlockImageDiff(tgt, src, threads=OPTIONS.worker_threads, - version=version) + version=self.version, use_lzma=use_lzma) tmpdir = tempfile.mkdtemp() OPTIONS.tempfiles.append(tmpdir) self.path = os.path.join(tmpdir, partition) @@ -1056,51 +1153,84 @@ def WriteScript(self, script, output_zip, progress=None): self._WriteUpdate(script, output_zip) def WriteVerifyScript(self, script): + partition = self.partition if not self.src: - script.Print("Image %s will be patched unconditionally." % (self.partition,)) + script.Print("Image %s will be patched unconditionally." % (partition,)) else: + if self.version >= 3: + script.AppendExtra(('if (range_sha1("%s", "%s") == "%s" || ' + 'block_image_verify("%s", ' + 'package_extract_file("%s.transfer.list"), ' + '"%s.new.dat", "%s.patch.dat")) then') % ( + self.device, self.src.care_map.to_string_raw(), + self.src.TotalSha1(), + self.device, partition, partition, partition)) + else: + script.AppendExtra('if range_sha1("%s", "%s") == "%s" then' % + (self.device, self.src.care_map.to_string_raw(), + self.src.TotalSha1())) + script.Print('Verified %s image...' % (partition,)) + script.AppendExtra('else'); + + # When generating incrementals for the system and vendor partitions, + # explicitly check the first block (which contains the superblock) of + # the partition to see if it's what we expect. If this check fails, + # give an explicit log message about the partition having been + # remounted R/W (the most likely explanation) and the need to flash to + # get OTAs working again. if self.check_first_block: self._CheckFirstBlock(script) - script.AppendExtra('if range_sha1("%s", "%s") == "%s" then' % - (self.device, self.src.care_map.to_string_raw(), - self.src.TotalSha1())) - script.Print("Verified %s image..." % (self.partition,)) - script.AppendExtra(('else\n' - ' (range_sha1("%s", "%s") == "%s") ||\n' - ' abort("%s partition has unexpected contents");\n' - 'endif;') % - (self.device, self.tgt.care_map.to_string_raw(), - self.tgt.TotalSha1(), self.partition)) + # Abort the OTA update. Note that the incremental OTA cannot be applied + # even if it may match the checksum of the target partition. + # a) If version < 3, operations like move and erase will make changes + # unconditionally and damage the partition. + # b) If version >= 3, it won't even reach here. + script.AppendExtra(('abort("%s partition has unexpected contents");\n' + 'endif;') % (partition,)) def _WriteUpdate(self, script, output_zip): partition = self.partition + suffix = ".new.dat" + with open(self.path + ".transfer.list", "rb") as f: ZipWriteStr(output_zip, partition + ".transfer.list", f.read()) - with open(self.path + ".new.dat", "rb") as f: - ZipWriteStr(output_zip, partition + ".new.dat", f.read()) + if lzma and self.use_lzma: + suffix += ".xz" + with open(self.path + suffix, "rb") as f: + ZipWriteStr(output_zip, partition + suffix, f.read(), + compression=zipfile.ZIP_STORED) + else: + with open(self.path + suffix, "rb") as f: + ZipWriteStr(output_zip, partition + suffix, f.read()) with open(self.path + ".patch.dat", "rb") as f: ZipWriteStr(output_zip, partition + ".patch.dat", f.read(), compression=zipfile.ZIP_STORED) call = (('block_image_update("%s", ' 'package_extract_file("%s.transfer.list"), ' - '"%s.new.dat", "%s.patch.dat");\n') % - (self.device, partition, partition, partition)) + '"%s%s", "%s.patch.dat");\n') % + (self.device, partition, partition, suffix, partition)) script.AppendExtra(script._WordWrap(call)) + def _HashBlocks(self, source, ranges): + data = source.ReadRangeSet(ranges) + ctx = sha1() + + for p in data: + ctx.update(p) + + return ctx.hexdigest() + def _CheckFirstBlock(self, script): r = RangeSet((0, 1)) - h = sha1() - for data in self.src.ReadRangeSet(r): - h.update(data) - h = h.hexdigest() + srchash = self._HashBlocks(self.src, r); script.AppendExtra(('(range_sha1("%s", "%s") == "%s") || ' 'abort("%s has been remounted R/W; ' 'reflash device to reenable OTA updates");') - % (self.device, r.to_string_raw(), h, self.device)) - + % (self.device, r.to_string_raw(), srchash, + self.device)) DataImage = blockimgdiff.DataImage @@ -1108,7 +1238,10 @@ def _CheckFirstBlock(self, script): # map recovery.fstab's fs_types to mount/format "partition types" PARTITION_TYPES = { "yaffs2": "MTD", "mtd": "MTD", "ext4": "EMMC", "emmc": "EMMC", - "f2fs": "EMMC" } + "f2fs": "EMMC", + "ext2": "EMMC", + "ext3": "EMMC", + "vfat": "EMMC" } def GetTypeAndDevice(mount_point, info): fstab = info["fstab"] @@ -1172,6 +1305,10 @@ def MakeRecoveryPatch(input_dir, output_sink, recovery_img, boot_img, recovery_type, recovery_device = td_pair sh = """#!/system/bin/sh +if [ -f /system/etc/recovery-transform.sh ]; then + exec sh /system/etc/recovery-transform.sh %(recovery_size)d %(recovery_sha1)s %(boot_size)d %(boot_sha1)s +fi + if ! applypatch -c %(recovery_type)s:%(recovery_device)s:%(recovery_size)d:%(recovery_sha1)s; then applypatch %(bonus_args)s %(boot_type)s:%(boot_device)s:%(boot_size)d:%(boot_sha1)s %(recovery_type)s:%(recovery_device)s %(recovery_sha1)s %(recovery_size)d %(boot_sha1)s:/system/recovery-from-boot.p && log -t recovery "Installing new recovery image: succeeded" || log -t recovery "Installing new recovery image: failed" else diff --git a/tools/releasetools/device_package_from_target_files.sh b/tools/releasetools/device_package_from_target_files.sh new file mode 100755 index 00000000000..606976ddabd --- /dev/null +++ b/tools/releasetools/device_package_from_target_files.sh @@ -0,0 +1,151 @@ +#!/bin/bash +# +# Copyright 2014 Canonical Ltd. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# Create Ubuntu device package with all binary blobs needed for factory images +# Script should have defined following global variables +# SOURCE_ROOT: path to the root of the source tree +# PRODUCT_OUT: product outpus relative path to SOURCE_ROOT (out/targer/product//) +# PACKAGING_INTERMEDIATES: relative path to dir to use for intermediate files (out/targer/product//obj/PACKAGING/devicepackage_intermediates) +# DEVICE_PACKAGE_TARGET: collection of pairs of targer update package file relative to SOURCE_ROOT and target name in update package +# eg: out/targer/product//boot.img:boot.img +# IGNORE_BLOBS: blobs not to be included in the device package. eg: system.img cache.img +# DEVICE_BUILD_ID: flag if to include device build ID, "true" if included +# PACKAGE_ANDROID_IMG: if defined as no, then android image will be extracted and included as device/ instead +# KEYPATH: optional path to gpg signign keys +# DEVICE_PACKAGE_OVERLAY: overlay to be added to device package + +echo "Creating Device update package" +DEVICE_PACKAGE_PARTITIONS=$PACKAGING_INTERMEDIATES/partitions +DEVICE_PACKAGE_BLOBS=$PACKAGING_INTERMEDIATES/blobs +PRODUCT_SYSTEM=$PRODUCT_OUT/system +DEVICE_PACKAGE_CONTENT="blobs partitions" +# clean old files +rm -rf $PACKAGING_INTERMEDIATES +mkdir -p $PACKAGING_INTERMEDIATES + +# determing all needed blobs to be included in the package +BLOBS_TO_FLASH=$(grep "file_name" $PRODUCT_OUT/*Android_scatter.txt | awk '{ print $2}' | grep -v "NONE") +HAS_ROOTFS=$(grep "ubunturootfs.img" $PRODUCT_OUT/*Android_scatter.txt) + +# copy all device blobs for update +mkdir -p $DEVICE_PACKAGE_BLOBS +cp $PRODUCT_OUT/*Android_scatter.txt $DEVICE_PACKAGE_BLOBS +for BLOB in $BLOBS_TO_FLASH +do + IGNORE=0 + for name in $IGNORE_BLOBS + do + if [ $name == $BLOB ]; then + IGNORE=1 + fi + done + if [ $IGNORE -eq 0 ]; then + if [ -e $PRODUCT_OUT/$BLOB ]; then + cp $PRODUCT_OUT/$BLOB $DEVICE_PACKAGE_BLOBS + fi + fi +done + +# copy supporting files if presented +if [ -n "$PRE_UPDATE_SCRIPT" -a -f $PRODUCT_OUT/$PRE_UPDATE_SCRIPT ]; then + cp $PRODUCT_OUT/$PRE_UPDATE_SCRIPT $PACKAGING_INTERMEDIATES + DEVICE_PACKAGE_CONTENT="$PRE_UPDATE_SCRIPT $DEVICE_PACKAGE_CONTENT" +fi + +if [ -n "$POST_UPDATE_SCRIPT" -a -f $PRODUCT_OUT/$POST_UPDATE_SCRIPT ]; then + cp $PRODUCT_OUT/$POST_UPDATE_SCRIPT $PACKAGING_INTERMEDIATES + DEVICE_PACKAGE_CONTENT="$POST_UPDATE_SCRIPT $DEVICE_PACKAGE_CONTENT" +fi + +# copy all device raw partitions images to update +mkdir -p $DEVICE_PACKAGE_PARTITIONS +for pair in $RAW_PARTITIONS +do + IFS=':' read src dest <<< $pair + if [ -f "$src" ]; then + echo -e "Including raw partition image $src as $dest" + cp $src $DEVICE_PACKAGE_PARTITIONS/$dest + else + echo -e "Skipping missing partition file $src" + fi + shift +done + +# Optionally generate a build ID based on the date and latest git +# commit +if [ "$DEVICE_BUILD_ID" == "true" ]; then + DEVICE_BUILD="device-build" + pushd .repo/manifests + SERIAL="$(date +%Y%m%d)-$(git describe --tags --dirty --always)" + popd + echo "$DEVICE_BUILD: $SERIAL" + echo $SERIAL >> $PACKAGING_INTERMEDIATES/$DEVICE_BUILD + DEVICE_PACKAGE_CONTENT="$DEVICE_PACKAGE_CONTENT $DEVICE_BUILD" +fi + +if [[ "$PACKAGE_ANDROID_IMG" == "no" ]]; then + # copy content of android system to device folder for packaging + echo "Packaging constent of Android system" + cp -r $PRODUCT_SYSTEM $PACKAGING_INTERMEDIATES/device + DEVICE_PACKAGE_CONTENT="$DEVICE_PACKAGE_CONTENT device" +else + echo "Packaging Android system.img for loop mounting" + # create Android system image + DEVICE_PACKAGE_LXC=$PACKAGING_INTERMEDIATES/system/var/lib/lxc/android + if [ -n "$BUILT_SYSTEMIMAGE" ]; then + mkdir -p $DEVICE_PACKAGE_LXC + cp $BUILT_SYSTEMIMAGE $DEVICE_PACKAGE_LXC + DEVICE_PACKAGE_CONTENT="$DEVICE_PACKAGE_CONTENT system" + fi +fi + +# copy file file_context +cp $PRODUCT_OUT/root/file_contexts $DEVICE_PACKAGE_BLOBS + +# copy overlay files if defined +if [ ! -z $DEVICE_PACKAGE_OVERLAY ]; then + echo "Adding overlay to the device package" + mkdir -p $PACKAGING_INTERMEDIATES/system + cp -r $DEVICE_PACKAGE_OVERLAY/. $PACKAGING_INTERMEDIATES/system/ + if [[ "$PACKAGE_ANDROID_IMG" == "no" ]]; then + DEVICE_PACKAGE_CONTENT="$DEVICE_PACKAGE_CONTENT system" + fi +fi + +# determine packing tool +if which pxz >/dev/null;then + XZ=pxz + echo "Using parallel XZ compression" +else + echo "Using single threaded XZ compression, you may want to install pxz" + XZ=xz +fi + +# if we are on OS X ignore ownership +if [ -z $(uname | grep Darwin) ]; then + TAR_OWNER_OPT=" --owner=0 --group=0 " +fi + +# create device update package +tar -C $PACKAGING_INTERMEDIATES $TAR_OWNER_OPT --use-compress-program=$XZ -cf $DEVICE_PACKAGE_TARGET $DEVICE_PACKAGE_CONTENT + +# Optionally create ASCII armored detached GPG signature for the tarball +# KEYPATH should hold the signing keys. +if [ -d "$KEYPATH" ]; then + echo "Creating GPG signature for the device tarball" + gpg --yes --homedir $KEYPATH -sba $DEVICE_PACKAGE_TARGET +fi diff --git a/tools/releasetools/edify_generator.py b/tools/releasetools/edify_generator.py index e52c2641561..80cf7ce47ed 100644 --- a/tools/releasetools/edify_generator.py +++ b/tools/releasetools/edify_generator.py @@ -116,20 +116,44 @@ def AssertOlderBuild(self, timestamp, timestamp_text): def AssertDevice(self, device): """Assert that the device identifier is the given string.""" - cmd = ('getprop("ro.product.device") == "%s" || ' - 'abort("This package is for \\"%s\\" devices; ' - 'this is a \\"" + getprop("ro.product.device") + "\\".");' - ) % (device, device) + cmd = ('assert(' + + ' || '.join(['getprop("ro.product.device") == "%s" || getprop("ro.build.product") == "%s"' + % (i, i) for i in device.split(",")]) + + ' || abort("This package is for device: %s; ' + + 'this device is " + getprop("ro.product.device") + ".");' + + ');') % device self.script.append(cmd) def AssertSomeBootloader(self, *bootloaders): - """Asert that the bootloader version is one of *bootloaders.""" + """Assert that the bootloader version is one of *bootloaders.""" cmd = ("assert(" + - " ||\0".join(['getprop("ro.bootloader") == "%s"' % (b,) + " || ".join(['getprop("ro.bootloader") == "%s"' % (b,) for b in bootloaders]) + + ' || abort("This package supports bootloader(s): ' + + ", ".join(["%s" % (b,) for b in bootloaders]) + + '; this device has bootloader " + getprop("ro.bootloader") + ".");' + ");") self.script.append(self._WordWrap(cmd)) + def AssertSomeBaseband(self, *basebands): + """Assert that the baseband version is one of *basebands.""" + cmd = ("assert(" + + " || ".join(['getprop("ro.baseband") == "%s"' % (b,) + for b in basebands]) + + ' || abort("This package supports baseband(s): ' + + ", ".join(["%s" % (b,) for b in basebands]) + + '; this device has baseband " + getprop("ro.baseband") + ".");' + + ");") + self.script.append(self._WordWrap(cmd)) + + def RunBackup(self, command): + self.script.append(('run_program("/tmp/install/bin/backuptool.sh", "%s");' % command)) + + def ValidateSignatures(self, command): + self.script.append('package_extract_file("META-INF/org/cyanogenmod/releasekey", "/tmp/releasekey");') + # Exit code 124 == abort. run_program returns raw, so left-shift 8bit + self.script.append('run_program("/tmp/install/bin/otasigcheck.sh") != "31744" || abort("Can\'t install this package on top of incompatible data. Please try another package or run a factory reset");') + def ShowProgress(self, frac, dur): """Update the progress bar, advancing it over 'frac' over the next 'dur' seconds. 'dur' may be zero to advance it via SetProgress @@ -185,6 +209,12 @@ def Mount(self, mount_point, mount_options_by_format=""): p.device, p.mount_point, mount_dict.get(p.fs_type, ""))) self.mounts.add(p.mount_point) + def Unmount(self, mount_point): + """Unmount the partiiton with the given mount_point.""" + if mount_point in self.mounts: + self.mounts.remove(mount_point) + self.script.append('unmount("%s");' % (mount_point,)) + def UnpackPackageDir(self, src, dst): """Unpack a given directory from the OTA package into the given destination directory.""" @@ -239,6 +269,15 @@ def DeleteFiles(self, file_list): cmd = "delete(" + ",\0".join(['"%s"' % (i,) for i in file_list]) + ");" self.script.append(self._WordWrap(cmd)) + def DeleteFilesIfNotMatching(self, file_list): + """Delete the file in file_list if not matching the checksum.""" + if not file_list: + return + for name, sha1 in file_list: + cmd = ('sha1_check(read_file("{name}"), "{sha1}") || ' + 'delete("{name}");'.format(name=name, sha1=sha1)) + self.script.append(self._WordWrap(cmd)) + def RenameFile(self, srcfile, tgtfile): """Moves a file from one location to another.""" if self.info.get("update_rename_support", False): @@ -250,7 +289,7 @@ def SkipNextActionIfTargetExists(self, tgtfile, tgtsha1): """Prepend an action with an apply_patch_check in order to skip the action if the file exists. Used when a patch is later renamed.""" - cmd = ('sha1_check(read_file("%s"), %s) || ' % (tgtfile, tgtsha1)) + cmd = ('sha1_check(read_file("%s"), %s) ||' % (tgtfile, tgtsha1)) self.script.append(self._WordWrap(cmd)) def ApplyPatch(self, srcfile, tgtfile, tgtsize, tgtsha1, *patchpairs): @@ -296,9 +335,10 @@ def SetPermissions(self, fn, uid, gid, mode, selabel, capabilities): if not self.info.get("use_set_metadata", False): self.script.append('set_perm(%d, %d, 0%o, "%s");' % (uid, gid, mode, fn)) else: - if capabilities is None: capabilities = "0x0" - cmd = 'set_metadata("%s", "uid", %d, "gid", %d, "mode", 0%o, ' \ - '"capabilities", %s' % (fn, uid, gid, mode, capabilities) + cmd = 'set_metadata("%s", "uid", %d, "gid", %d, "mode", 0%o' \ + % (fn, uid, gid, mode) + if capabilities is not None: + cmd += ', "capabilities", %s' % ( capabilities ) if selabel is not None: cmd += ', "selabel", "%s"' % ( selabel ) cmd += ');' @@ -310,10 +350,11 @@ def SetPermissionsRecursive(self, fn, uid, gid, dmode, fmode, selabel, capabilit self.script.append('set_perm_recursive(%d, %d, 0%o, 0%o, "%s");' % (uid, gid, dmode, fmode, fn)) else: - if capabilities is None: capabilities = "0x0" cmd = 'set_metadata_recursive("%s", "uid", %d, "gid", %d, ' \ - '"dmode", 0%o, "fmode", 0%o, "capabilities", %s' \ - % (fn, uid, gid, dmode, fmode, capabilities) + '"dmode", 0%o, "fmode", 0%o' \ + % (fn, uid, gid, dmode, fmode) + if capabilities is not None: + cmd += ', "capabilities", "%s"' % ( capabilities ) if selabel is not None: cmd += ', "selabel", "%s"' % ( selabel ) cmd += ');' diff --git a/tools/releasetools/img_from_target_files.py b/tools/releasetools/img_from_target_files.py index 4b88e73b0bb..eef4c974c13 100755 --- a/tools/releasetools/img_from_target_files.py +++ b/tools/releasetools/img_from_target_files.py @@ -54,6 +54,31 @@ def CopyInfo(output_zip): output_zip.write(os.path.join(OPTIONS.input_tmp, "OTA", "android-info.txt"), "android-info.txt") +def AddRadio(output_zip): + """If they exist, add RADIO files to the output.""" + if os.path.isdir(os.path.join(OPTIONS.input_tmp, "RADIO")): + for radio_root, radio_dirs, radio_files in os.walk(os.path.join(OPTIONS.input_tmp, "RADIO")): + for radio_file in radio_files: + output_zip.write(os.path.join(radio_root, radio_file), radio_file) + + # If a filesmap file exists, create a script to flash the radio images based on it + filesmap = os.path.join(OPTIONS.input_tmp, "RADIO/filesmap") + if os.path.isfile(filesmap): + print "creating flash-radio.sh..." + filesmap_data = open(filesmap, "r") + filesmap_regex = re.compile(r'^(\S+)\s\S+\/by-name\/(\S+).*') + tmp_flash_radio = tempfile.NamedTemporaryFile() + tmp_flash_radio.write("#!/bin/sh\n\n") + for filesmap_line in filesmap_data: + filesmap_entry = filesmap_regex.search(filesmap_line) + if filesmap_entry: + tmp_flash_radio.write("fastboot flash %s %s\n" % (filesmap_entry.group(2), filesmap_entry.group(1))) + tmp_flash_radio.flush() + if os.path.getsize(tmp_flash_radio.name) > 0: + output_zip.write(tmp_flash_radio.name, "flash-radio.sh") + else: + print "flash-radio.sh is empty, skipping..." + tmp_flash_radio.close() def main(argv): bootable_only = [False] @@ -79,6 +104,7 @@ def option_handler(o, a): OPTIONS.input_tmp, input_zip = common.UnzipTemp(args[0]) output_zip = zipfile.ZipFile(args[1], "w", compression=zipfile.ZIP_DEFLATED) CopyInfo(output_zip) + AddRadio(output_zip) try: done = False @@ -86,11 +112,13 @@ def option_handler(o, a): if os.path.exists(images_path): # If this is a new target-files, it already contains the images, # and all we have to do is copy them to the output zip. + # Skip oem.img files since they are not needed in fastboot images. images = os.listdir(images_path) if images: for i in images: if bootable_only and i not in ("boot.img", "recovery.img"): continue if not i.endswith(".img"): continue + if i == "oem.img": continue with open(os.path.join(images_path, i), "r") as f: common.ZipWriteStr(output_zip, i, f.read()) done = True @@ -134,6 +162,8 @@ def banner(s): pass # no vendor partition for this device banner("AddUserdata") add_img_to_target_files.AddUserdata(output_zip, prefix="") + banner("AddUserdataExtra") + add_img_to_target_files.AddUserdataExtra(output_zip, prefix="") banner("AddCache") add_img_to_target_files.AddCache(output_zip, prefix="") diff --git a/tools/releasetools/ota_from_target_files b/tools/releasetools/ota_from_target_files index 945f11a0bbd..47cf370301c 100755 --- a/tools/releasetools/ota_from_target_files +++ b/tools/releasetools/ota_from_target_files @@ -70,6 +70,10 @@ Usage: ota_from_target_files [flags] input_target_files output_ota_package file-based OTA if the target_files is older and doesn't support block-based OTAs. + -z Compress the block-based image using LZMA. Results in substantial + space reduction at the cost of longer compress/decompress time. + Requires the "backports.lzma" module to be installed. + -b (--binary) Use the given binary as the update-binary in the output package, instead of the binary in the build's target_files. Use for @@ -79,6 +83,21 @@ Usage: ota_from_target_files [flags] input_target_files output_ota_package Specifies the number of worker-threads that will be used when generating patches for incremental updates (defaults to 3). + --stash_threshold + Specifies the threshold that will be used to compute the maximum + allowed stash size (defaults to 0.8). + + --backup + Enable or disable the execution of backuptool.sh. + Disabled by default. + + --override_device + Override device-specific asserts. Can be a comma-separated list. + + --override_prop + Override build.prop items with custom vendor init. + Enabled when TARGET_UNIFIED_DEVICE is defined in BoardConfig + """ import sys @@ -125,6 +144,10 @@ OPTIONS.block_based = False OPTIONS.updater_binary = None OPTIONS.oem_source = None OPTIONS.fallback_to_full = True +OPTIONS.backuptool = False +OPTIONS.override_device = 'auto' +OPTIONS.override_prop = False +OPTIONS.use_lzma = False def MostPopularKey(d, default): """Given a dict, return the key corresponding to the largest @@ -138,7 +161,7 @@ def MostPopularKey(d, default): def IsSymlink(info): """Return true if the zipfile.ZipInfo object passed in represents a symlink.""" - return (info.external_attr >> 16) == 0120777 + return (info.external_attr >> 16) & 0770000 == 0120000 def IsRegular(info): """Return true if the zipfile.ZipInfo object passed in represents a @@ -385,7 +408,10 @@ def SignOutput(temp_zip_name, output_zip_name): def AppendAssertions(script, info_dict, oem_dict = None): oem_props = info_dict.get("oem_fingerprint_properties") if oem_props is None or len(oem_props) == 0: - device = GetBuildProp("ro.product.device", info_dict) + if OPTIONS.override_device == "auto": + device = GetBuildProp("ro.product.device", info_dict) + else: + device = OPTIONS.override_device script.AssertDevice(device) else: if oem_dict is None: @@ -415,7 +441,6 @@ def GetOemProperty(name, oem_props, oem_dict, info_dict): return oem_dict[name] return GetBuildProp(name, info_dict) - def CalculateFingerprint(oem_props, oem_dict, info_dict): if oem_props is None: return GetBuildProp("ro.build.fingerprint", info_dict) @@ -460,6 +485,15 @@ def GetImage(which, tmpdir, info_dict): return sparse_img.SparseImage(path, mappath) +def CopyInstallTools(output_zip): + install_path = os.path.join(OPTIONS.input_tmp, "INSTALL") + for root, subdirs, files in os.walk(install_path): + for f in files: + install_source = os.path.join(root, f) + install_target = os.path.join("install", os.path.relpath(root, install_path), f) + output_zip.write(install_source, install_target) + + def WriteFullOTAPackage(input_zip, output_zip): # TODO: how to determine this? We don't know what version it will # be installed on top of. For now, we expect the API just won't @@ -475,13 +509,19 @@ def WriteFullOTAPackage(input_zip, output_zip): script.Mount("/oem", recovery_mount_options) oem_dict = common.LoadDictionaryFromLines(open(OPTIONS.oem_source).readlines()) - metadata = {"post-build": CalculateFingerprint( - oem_props, oem_dict, OPTIONS.info_dict), - "pre-device": GetOemProperty("ro.product.device", oem_props, oem_dict, - OPTIONS.info_dict), - "post-timestamp": GetBuildProp("ro.build.date.utc", + + if OPTIONS.override_prop: + metadata = {"post-timestamp": GetBuildProp("ro.build.date.utc", + OPTIONS.info_dict), + } + else: + metadata = {"post-build": CalculateFingerprint( + oem_props, oem_dict, OPTIONS.info_dict), + "pre-device": GetOemProperty("ro.product.device", oem_props, oem_dict, + OPTIONS.info_dict), + "post-timestamp": GetBuildProp("ro.build.date.utc", OPTIONS.info_dict), - } + } device_specific = common.DeviceSpecificParams( input_zip=input_zip, @@ -495,10 +535,10 @@ def WriteFullOTAPackage(input_zip, output_zip): has_recovery_patch = HasRecoveryPatch(input_zip) block_based = OPTIONS.block_based and has_recovery_patch - if not OPTIONS.omit_prereq: - ts = GetBuildProp("ro.build.date.utc", OPTIONS.info_dict) - ts_text = GetBuildProp("ro.build.date", OPTIONS.info_dict) - script.AssertOlderBuild(ts, ts_text) + #if not OPTIONS.omit_prereq: + # ts = GetBuildProp("ro.build.date.utc", OPTIONS.info_dict) + # ts_text = GetBuildProp("ro.build.date", OPTIONS.info_dict) + # script.AssertOlderBuild(ts, ts_text) AppendAssertions(script, OPTIONS.info_dict, oem_dict) device_specific.FullOTA_Assertions() @@ -542,8 +582,19 @@ reboot_now("%(bcb_dev)s", "recovery"); else if get_stage("%(bcb_dev)s") == "3/3" then """ % bcb_dev) + script.AppendExtra("ifelse(is_mounted(\"/system\"), unmount(\"/system\"));") device_specific.FullOTA_InstallBegin() + CopyInstallTools(output_zip) + script.UnpackPackageDir("install", "/tmp/install") + script.SetPermissionsRecursive("/tmp/install", 0, 0, 0755, 0644, None, None) + script.SetPermissionsRecursive("/tmp/install/bin", 0, 0, 0755, 0755, None, None) + + if OPTIONS.backuptool: + script.Mount("/system") + script.RunBackup("backup") + script.Unmount("/system") + system_progress = 0.75 if OPTIONS.wipe_user_data: @@ -551,6 +602,14 @@ else if get_stage("%(bcb_dev)s") == "3/3" then if HasVendorPartition(input_zip): system_progress -= 0.1 + script.AppendExtra("if is_mounted(\"/data\") then") + script.ValidateSignatures("data") + script.AppendExtra("else") + script.Mount("/data") + script.ValidateSignatures("data") + script.Unmount("/data") + script.AppendExtra("endif;") + if "selinux_fc" in OPTIONS.info_dict: WritePolicyConfig(OPTIONS.info_dict["selinux_fc"], output_zip) @@ -566,7 +625,7 @@ else if get_stage("%(bcb_dev)s") == "3/3" then # writes incrementals to do it. system_tgt = GetImage("system", OPTIONS.input_tmp, OPTIONS.info_dict) system_tgt.ResetFileMap() - system_diff = common.BlockDifference("system", system_tgt, src=None) + system_diff = common.BlockDifference("system", system_tgt, src=None, use_lzma=OPTIONS.use_lzma) system_diff.WriteScript(script, output_zip) else: script.FormatPartition("/system") @@ -574,7 +633,6 @@ else if get_stage("%(bcb_dev)s") == "3/3" then if not has_recovery_patch: script.UnpackPackageDir("recovery", "/system") script.UnpackPackageDir("system", "/system") - symlinks = CopyPartitionFiles(system_items, input_zip, output_zip) script.MakeSymlinks(symlinks) @@ -599,7 +657,7 @@ else if get_stage("%(bcb_dev)s") == "3/3" then if block_based: vendor_tgt = GetImage("vendor", OPTIONS.input_tmp, OPTIONS.info_dict) vendor_tgt.ResetFileMap() - vendor_diff = common.BlockDifference("vendor", vendor_tgt) + vendor_diff = common.BlockDifference("vendor", vendor_tgt, use_lzma=OPTIONS.use_lzma) vendor_diff.WriteScript(script, output_zip) else: script.FormatPartition("/vendor") @@ -615,6 +673,16 @@ else if get_stage("%(bcb_dev)s") == "3/3" then common.CheckSize(boot_img.data, "boot.img", OPTIONS.info_dict) common.ZipWriteStr(output_zip, "boot.img", boot_img.data) + device_specific.FullOTA_PostValidate() + + if OPTIONS.backuptool: + script.ShowProgress(0.02, 10) + if block_based: + script.Mount("/system") + script.RunBackup("restore") + if block_based: + script.Unmount("/system") + script.ShowProgress(0.05, 5) script.WriteRawImage("/boot", "boot.img") @@ -645,6 +713,11 @@ endif; script.AddToZip(input_zip, output_zip, input_path=OPTIONS.updater_binary) WriteMetadata(metadata, output_zip) + common.ZipWriteStr(output_zip, "system/build.prop", + ""+input_zip.read("SYSTEM/build.prop")) + + common.ZipWriteStr(output_zip, "META-INF/org/cyanogenmod/releasekey", + ""+input_zip.read("META/releasekey.txt")) def WritePolicyConfig(file_context, output_zip): f = open(file_context, 'r'); @@ -702,17 +775,24 @@ def WriteBlockIncrementalOTAPackage(target_zip, source_zip, output_zip): script = edify_generator.EdifyGenerator(source_version, OPTIONS.target_info_dict) - metadata = {"pre-device": GetBuildProp("ro.product.device", - OPTIONS.source_info_dict), - "post-timestamp": GetBuildProp("ro.build.date.utc", - OPTIONS.target_info_dict), - } + if OPTIONS.override_prop: + metadata = {"post-timestamp": GetBuildProp("ro.build.date.utc", + OPTIONS.target_info_dict), + } + else: + metadata = {"pre-device": GetBuildProp("ro.product.device", + OPTIONS.source_info_dict), + "post-timestamp": GetBuildProp("ro.build.date.utc", + OPTIONS.target_info_dict), + } device_specific = common.DeviceSpecificParams( source_zip=source_zip, source_version=source_version, target_zip=target_zip, + input_zip=target_zip, target_version=target_version, + input_version=target_version, output_zip=output_zip, script=script, metadata=metadata, @@ -740,8 +820,17 @@ def WriteBlockIncrementalOTAPackage(target_zip, source_zip, output_zip): system_src = GetImage("system", OPTIONS.source_tmp, OPTIONS.source_info_dict) system_tgt = GetImage("system", OPTIONS.target_tmp, OPTIONS.target_info_dict) + + blockimgdiff_version = 1 + if OPTIONS.info_dict: + blockimgdiff_version = max( + int(i) for i in + OPTIONS.info_dict.get("blockimgdiff_versions", "1").split(",")) + system_diff = common.BlockDifference("system", system_tgt, system_src, - check_first_block=True) + check_first_block=True, + version=blockimgdiff_version, + use_lzma=OPTIONS.use_lzma) if HasVendorPartition(target_zip): if not HasVendorPartition(source_zip): @@ -749,7 +838,9 @@ def WriteBlockIncrementalOTAPackage(target_zip, source_zip, output_zip): vendor_src = GetImage("vendor", OPTIONS.source_tmp, OPTIONS.source_info_dict) vendor_tgt = GetImage("vendor", OPTIONS.target_tmp, OPTIONS.target_info_dict) vendor_diff = common.BlockDifference("vendor", vendor_tgt, vendor_src, - check_first_block=True) + check_first_block=True, + version=blockimgdiff_version, + use_lzma=OPTIONS.use_lzma) else: vendor_diff = None @@ -810,11 +901,22 @@ else if get_stage("%(bcb_dev)s") != "3/3" then device_specific.IncrementalOTA_VerifyBegin() if oem_props is None: - script.AssertSomeFingerprint(source_fp, target_fp) + # When blockimgdiff version is less than 3 (non-resumable block-based OTA), + # patching on a device that's already on the target build will damage the + # system. Because operations like move don't check the block state, they + # always apply the changes unconditionally. + if blockimgdiff_version <= 2: + script.AssertSomeFingerprint(source_fp) + else: + script.AssertSomeFingerprint(source_fp, target_fp) else: - script.AssertSomeThumbprint( - GetBuildProp("ro.build.thumbprint", OPTIONS.target_info_dict), - GetBuildProp("ro.build.thumbprint", OPTIONS.source_info_dict)) + if blockimgdiff_version <= 2: + script.AssertSomeThumbprint( + GetBuildProp("ro.build.thumbprint", OPTIONS.source_info_dict)) + else: + script.AssertSomeThumbprint( + GetBuildProp("ro.build.thumbprint", OPTIONS.target_info_dict), + GetBuildProp("ro.build.thumbprint", OPTIONS.source_info_dict)) if updating_boot: boot_type, boot_device = common.GetTypeAndDevice("/boot", OPTIONS.info_dict) @@ -986,7 +1088,7 @@ class FileDifference: so_far = 0 for tf, sf, size, patch_sha in self.patch_list: if tf.name != sf.name: - script.SkipNextActionIfTargetExists(tf.name, tf.sha1) + script.SkipNextActionIfTargetExists("/"+tf.name, tf.sha1) script.PatchCheck("/"+sf.name, tf.sha1, sf.sha1) so_far += sf.size return so_far @@ -999,11 +1101,13 @@ class FileDifference: script.FileCheck(tf.name, tf.sha1) def RemoveUnneededFiles(self, script, extras=()): - script.DeleteFiles(["/"+i[0] for i in self.verbatim_targets] + - ["/"+i for i in sorted(self.source_data) - if i not in self.target_data and - i not in self.renames] + - list(extras)) + file_list = ["/" + i[0] for i in self.verbatim_targets] + file_list += ["/" + i for i in self.source_data + if i not in self.target_data and i not in self.renames] + file_list += list(extras) + # Sort the list in descending order, which removes all the files first + # before attempting to remove the folder. (Bug: 22960996) + script.DeleteFiles(sorted(file_list, reverse=True)) def TotalPatchSize(self): return sum(i[1].size for i in self.patch_list) @@ -1016,7 +1120,7 @@ class FileDifference: deferred_patch_list.append(item) continue if (sf.name != tf.name): - script.SkipNextActionIfTargetExists(tf.name, tf.sha1) + script.SkipNextActionIfTargetExists("/"+tf.name, tf.sha1) script.ApplyPatch("/"+sf.name, "-", tf.size, tf.sha1, sf.sha1, "patch/"+sf.name+".p") so_far += tf.size script.SetProgress(so_far / total_patch_size) @@ -1065,17 +1169,24 @@ def WriteIncrementalOTAPackage(target_zip, source_zip, output_zip): script.Mount("/oem", recovery_mount_options) oem_dict = common.LoadDictionaryFromLines(open(OPTIONS.oem_source).readlines()) - metadata = {"pre-device": GetOemProperty("ro.product.device", oem_props, oem_dict, - OPTIONS.source_info_dict), - "post-timestamp": GetBuildProp("ro.build.date.utc", - OPTIONS.target_info_dict), - } + if OPTIONS.override_prop: + metadata = {"post-timestamp": GetBuildProp("ro.build.date.utc", + OPTIONS.target_info_dict), + } + else: + metadata = {"pre-device": GetOemProperty("ro.product.device", oem_props, oem_dict, + OPTIONS.source_info_dict), + "post-timestamp": GetBuildProp("ro.build.date.utc", + OPTIONS.target_info_dict), + } device_specific = common.DeviceSpecificParams( source_zip=source_zip, source_version=source_version, target_zip=target_zip, + input_zip=target_zip, target_version=target_version, + input_version=target_version, output_zip=output_zip, script=script, metadata=metadata, @@ -1089,18 +1200,19 @@ def WriteIncrementalOTAPackage(target_zip, source_zip, output_zip): else: vendor_diff = None - target_fp = CalculateFingerprint(oem_props, oem_dict, OPTIONS.target_info_dict) - source_fp = CalculateFingerprint(oem_props, oem_dict, OPTIONS.source_info_dict) + if not OPTIONS.override_prop: + target_fp = CalculateFingerprint(oem_props, oem_dict, OPTIONS.target_info_dict) + source_fp = CalculateFingerprint(oem_props, oem_dict, OPTIONS.source_info_dict) - if oem_props is None: - script.AssertSomeFingerprint(source_fp, target_fp) - else: - script.AssertSomeThumbprint( - GetBuildProp("ro.build.thumbprint", OPTIONS.target_info_dict), - GetBuildProp("ro.build.thumbprint", OPTIONS.source_info_dict)) + if oem_props is None: + script.AssertSomeFingerprint(source_fp, target_fp) + else: + script.AssertSomeThumbprint( + GetBuildProp("ro.build.thumbprint", OPTIONS.target_info_dict), + GetBuildProp("ro.build.thumbprint", OPTIONS.source_info_dict)) - metadata["pre-build"] = source_fp - metadata["post-build"] = target_fp + metadata["pre-build"] = source_fp + metadata["post-build"] = target_fp source_boot = common.GetBootableImage( "/tmp/boot.img", "boot.img", OPTIONS.source_tmp, "BOOT", @@ -1176,19 +1288,24 @@ else if get_stage("%(bcb_dev)s") != "3/3" then so_far += vendor_diff.EmitVerification(script) if updating_boot: + boot_type, boot_device = common.GetTypeAndDevice("/boot", OPTIONS.info_dict) d = common.Difference(target_boot, source_boot) _, _, d = d.ComputePatch() - print "boot target: %d source: %d diff: %d" % ( - target_boot.size, source_boot.size, len(d)) + if d is None: + include_full_boot = True + common.ZipWriteStr(output_zip, "boot.img", target_boot.data) + else: + include_full_boot = False - common.ZipWriteStr(output_zip, "patch/boot.img.p", d) + print "boot target: %d source: %d diff: %d" % ( + target_boot.size, source_boot.size, len(d)) - boot_type, boot_device = common.GetTypeAndDevice("/boot", OPTIONS.info_dict) + common.ZipWriteStr(output_zip, "patch/boot.img.p", d) - script.PatchCheck("%s:%s:%d:%s:%d:%s" % - (boot_type, boot_device, - source_boot.size, source_boot.sha1, - target_boot.size, target_boot.sha1)) + script.PatchCheck("%s:%s:%d:%s:%d:%s" % + (boot_type, boot_device, + source_boot.size, source_boot.sha1, + target_boot.size, target_boot.sha1)) so_far += source_boot.size size = [] @@ -1237,20 +1354,23 @@ else if not OPTIONS.two_step: if updating_boot: - # Produce the boot image by applying a patch to the current - # contents of the boot partition, and write it back to the - # partition. - script.Print("Patching boot image...") - script.ApplyPatch("%s:%s:%d:%s:%d:%s" - % (boot_type, boot_device, - source_boot.size, source_boot.sha1, - target_boot.size, target_boot.sha1), - "-", - target_boot.size, target_boot.sha1, - source_boot.sha1, "patch/boot.img.p") - so_far += target_boot.size - script.SetProgress(so_far / total_patch_size) - print "boot image changed; including." + if include_full_boot: + print "boot image changed; including full." + script.Print("Installing boot image...") + script.WriteRawImage("/boot", "boot.img") + else: + # Produce the boot image by applying a patch to the current + # contents of the boot partition, and write it back to the + # partition. + print "boot image changed; including patch." + script.Print("Patching boot image...") + script.ApplyPatch("%s:%s:%d:%s:%d:%s" + % (boot_type, boot_device, + source_boot.size, source_boot.sha1, + target_boot.size, target_boot.sha1), + "-", + target_boot.size, target_boot.sha1, + source_boot.sha1, "patch/boot.img.p") else: print "boot image unchanged; skipping." @@ -1306,11 +1426,36 @@ else # Delete all the symlinks in source that aren't in target. This # needs to happen before verbatim files are unpacked, in case a # symlink in the source is replaced by a real file in the target. - to_delete = [] + + # If a symlink in the source will be replaced by a regular file, we cannot + # delete the symlink/file in case the package gets applied again. For such + # a symlink, we prepend a sha1_check() to detect if it has been updated. + # (Bug: 23646151) + replaced_symlinks = dict() + if system_diff: + for i in system_diff.verbatim_targets: + replaced_symlinks["/%s" % (i[0],)] = i[2] + if vendor_diff: + for i in vendor_diff.verbatim_targets: + replaced_symlinks["/%s" % (i[0],)] = i[2] + + if system_diff: + for tf in system_diff.renames.values(): + replaced_symlinks["/%s" % (tf.name,)] = tf.sha1 + if vendor_diff: + for tf in vendor_diff.renames.values(): + replaced_symlinks["/%s" % (tf.name,)] = tf.sha1 + + always_delete = [] + may_delete = [] for dest, link in source_symlinks: if link not in target_symlinks_d: - to_delete.append(link) - script.DeleteFiles(to_delete) + if link in replaced_symlinks: + may_delete.append((link, replaced_symlinks[link])) + else: + always_delete.append(link) + script.DeleteFiles(always_delete) + script.DeleteFilesIfNotMatching(may_delete) if system_diff.verbatim_targets: script.Print("Unpacking new system files...") @@ -1384,7 +1529,6 @@ endif; WriteMetadata(metadata, output_zip) - def main(argv): def option_handler(o, a): @@ -1425,12 +1569,28 @@ def main(argv): OPTIONS.updater_binary = a elif o in ("--no_fallback_to_full",): OPTIONS.fallback_to_full = False + elif o == "--stash_threshold": + try: + OPTIONS.stash_threshold = float(a) + except ValueError: + raise ValueError("Cannot parse value %r for option %r - expecting " + "a float" % (a, o)) + elif o in ("--backup"): + OPTIONS.backuptool = bool(a.lower() == 'true') + elif o in ("--override_device"): + OPTIONS.override_device = a + elif o in ("--override_prop"): + OPTIONS.override_prop = bool(a.lower() == 'true') + elif o in ("-z", "--use_lzma"): + OPTIONS.use_lzma = True + # Import now, and bomb out if backports.lzma isn't installed + from backports import lzma else: return False return True args = common.ParseOptions(argv, __doc__, - extra_opts="b:k:i:d:wne:t:a:2o:", + extra_opts="b:k:i:d:wne:t:a:2o:z", extra_long_opts=["board_config=", "package_key=", "incremental_from=", @@ -1446,7 +1606,11 @@ def main(argv): "oem_settings=", "verify", "no_fallback_to_full", - ], + "stash_threshold=", + "backup=", + "override_device=", + "override_prop=", + "use_lzma"], extra_option_handler=option_handler) if len(args) != 2: @@ -1498,10 +1662,14 @@ def main(argv): if os.path.exists(args[1]): os.unlink(args[1]) output_zip = zipfile.ZipFile(args[1], "w", compression=zipfile.ZIP_DEFLATED) else: - temp_zip_file = tempfile.NamedTemporaryFile() - output_zip = zipfile.ZipFile(temp_zip_file, "w", + output_zip = zipfile.ZipFile(args[1], "w",, compression=zipfile.ZIP_DEFLATED) + cache_size = OPTIONS.info_dict.get("cache_size", None) + if cache_size is None: + print "--- can't determine the cache partition size ---" + OPTIONS.cache_size = cache_size + if OPTIONS.incremental_source is None: WriteFullOTAPackage(input_zip, output_zip) if OPTIONS.package_key is None: @@ -1537,8 +1705,7 @@ def main(argv): output_zip.close() if not OPTIONS.no_signing: - SignOutput(temp_zip_file.name, args[1]) - temp_zip_file.close() + print "done." diff --git a/tools/releasetools/sign_target_files_apks b/tools/releasetools/sign_target_files_apks index 931acb81ae8..9c86686eacf 100755 --- a/tools/releasetools/sign_target_files_apks +++ b/tools/releasetools/sign_target_files_apks @@ -308,7 +308,7 @@ def RewriteProps(data, misc_info): value = "/".join(pieces) elif key == "ro.build.description": pieces = value.split(" ") - assert len(pieces) == 5 + #assert len(pieces) == 5 pieces[-1] = EditTags(pieces[-1]) value = " ".join(pieces) elif key == "ro.build.tags": @@ -375,6 +375,14 @@ def ReplaceOtaKeys(input_tf_zip, output_tf_zip, misc_info): common.ZipWriteStr(output_tf_zip, "RECOVERY/RAMDISK/res/keys", new_recovery_keys) + # Save the base64 key representation in the update for key-change + # validations + p = common.Run(["python", "build/tools/getb64key.py", mapped_keys[0]], + stdout=subprocess.PIPE) + data, _ = p.communicate() + if p.returncode == 0: + common.ZipWriteStr(output_tf_zip, "META/releasekey.txt", data) + # SystemUpdateActivity uses the x509.pem version of the keys, but # put into a zipfile system/etc/security/otacerts.zip. # We DO NOT include the extra_recovery_keys (if any) here. diff --git a/tools/repopick.py b/tools/repopick.py new file mode 100755 index 00000000000..ac8875af262 --- /dev/null +++ b/tools/repopick.py @@ -0,0 +1,355 @@ +#!/usr/bin/env python +# +# Copyright (C) 2013-15 The CyanogenMod Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# +# Run repopick.py -h for a description of this utility. +# + +from __future__ import print_function + +import sys +import json +import os +import subprocess +import re +import argparse +import textwrap +from xml.etree import ElementTree + +try: + # For python3 + import urllib.error + import urllib.request +except ImportError: + # For python2 + import imp + import urllib2 + urllib = imp.new_module('urllib') + urllib.error = urllib2 + urllib.request = urllib2 + + +# Verifies whether pathA is a subdirectory (or the same) as pathB +def is_subdir(a, b): + a = os.path.realpath(a) + '/' + b = os.path.realpath(b) + '/' + return b == a[:len(b)] + + +def fetch_query_via_ssh(remote_url, query): + """Given a remote_url and a query, return the list of changes that fit it + This function is slightly messy - the ssh api does not return data in the same structure as the HTTP REST API + We have to get the data, then transform it to match what we're expecting from the HTTP RESET API""" + if remote_url.count(':') == 2: + (uri, userhost, port) = remote_url.split(':') + userhost = userhost[2:] + elif remote_url.count(':') == 1: + (uri, userhost) = remote_url.split(':') + userhost = userhost[2:] + port = 29418 + else: + raise Exception('Malformed URI: Expecting ssh://[user@]host[:port]') + + + out = subprocess.check_output(['ssh', '-x', '-p{0}'.format(port), userhost, 'gerrit', 'query', '--format=JSON --patch-sets --current-patch-set', query]) + + reviews = [] + for line in out.split('\n'): + try: + data = json.loads(line) + # make our data look like the http rest api data + review = { + 'branch': data['branch'], + 'change_id': data['id'], + 'current_revision': data['currentPatchSet']['revision'], + 'number': int(data['number']), + 'revisions': {patch_set['revision']: { + 'number': int(patch_set['number']), + 'fetch': { + 'ssh': { + 'ref': patch_set['ref'], + 'url': u'ssh://{0}:{1}/{2}'.format(userhost, port, data['project']) + } + } + } for patch_set in data['patchSets']}, + 'subject': data['subject'], + 'project': data['project'], + 'status': data['status'] + } + reviews.append(review) + except: + pass + args.quiet or print('Found {0} reviews'.format(len(reviews))) + return reviews + + +def fetch_query_via_http(remote_url, query): + + """Given a query, fetch the change numbers via http""" + url = '{0}/changes/?q={1}&o=CURRENT_REVISION&o=ALL_REVISIONS'.format(remote_url, query) + data = urllib.request.urlopen(url).read().decode('utf-8') + reviews = json.loads(data[5:]) + + for review in reviews: + review[u'number'] = review.pop('_number') + + return reviews + + +def fetch_query(remote_url, query): + """Wrapper for fetch_query_via_proto functions""" + if remote_url[0:3] == 'ssh': + return fetch_query_via_ssh(remote_url, query) + elif remote_url[0:4] == 'http': + return fetch_query_via_http(remote_url, query.replace(' ', '+')) + else: + raise Exception('Gerrit URL should be in the form http[s]://hostname/ or ssh://[user@]host[:port]') + +if __name__ == '__main__': + # Default to CyanogenMod Gerrit + default_gerrit = 'http://review.cyanogenmod.org' + + parser = argparse.ArgumentParser(formatter_class=argparse.RawDescriptionHelpFormatter, description=textwrap.dedent('''\ + repopick.py is a utility to simplify the process of cherry picking + patches from CyanogenMod's Gerrit instance (or any gerrit instance of your choosing) + + Given a list of change numbers, repopick will cd into the project path + and cherry pick the latest patch available. + + With the --start-branch argument, the user can specify that a branch + should be created before cherry picking. This is useful for + cherry-picking many patches into a common branch which can be easily + abandoned later (good for testing other's changes.) + + The --abandon-first argument, when used in conjunction with the + --start-branch option, will cause repopick to abandon the specified + branch in all repos first before performing any cherry picks.''')) + parser.add_argument('change_number', nargs='*', help='change number to cherry pick. Use {change number}/{patchset number} to get a specific revision.') + parser.add_argument('-i', '--ignore-missing', action='store_true', help='do not error out if a patch applies to a missing directory') + parser.add_argument('-s', '--start-branch', nargs=1, help='start the specified branch before cherry picking') + parser.add_argument('-a', '--abandon-first', action='store_true', help='before cherry picking, abandon the branch specified in --start-branch') + parser.add_argument('-b', '--auto-branch', action='store_true', help='shortcut to "--start-branch auto --abandon-first --ignore-missing"') + parser.add_argument('-q', '--quiet', action='store_true', help='print as little as possible') + parser.add_argument('-v', '--verbose', action='store_true', help='print extra information to aid in debug') + parser.add_argument('-f', '--force', action='store_true', help='force cherry pick even if change is closed') + parser.add_argument('-p', '--pull', action='store_true', help='execute pull instead of cherry-pick') + parser.add_argument('-P', '--path', help='use the specified path for the change') + parser.add_argument('-t', '--topic', help='pick all commits from a specified topic') + parser.add_argument('-Q', '--query', help='pick all commits using the specified query') + parser.add_argument('-g', '--gerrit', default=default_gerrit, help='Gerrit Instance to use. Form proto://[user@]host[:port]') + args = parser.parse_args() + if not args.start_branch and args.abandon_first: + parser.error('if --abandon-first is set, you must also give the branch name with --start-branch') + if args.auto_branch: + args.abandon_first = True + args.ignore_missing = True + if not args.start_branch: + args.start_branch = ['auto'] + if args.quiet and args.verbose: + parser.error('--quiet and --verbose cannot be specified together') + + if (1 << bool(args.change_number) << bool(args.topic) << bool(args.query)) != 2: + parser.error('One (and only one) of change_number, topic, and query are allowed') + + # Change current directory to the top of the tree + if 'ANDROID_BUILD_TOP' in os.environ: + top = os.environ['ANDROID_BUILD_TOP'] + + if not is_subdir(os.getcwd(), top): + sys.stderr.write('ERROR: You must run this tool from within $ANDROID_BUILD_TOP!\n') + sys.exit(1) + os.chdir(os.environ['ANDROID_BUILD_TOP']) + + # Sanity check that we are being run from the top level of the tree + if not os.path.isdir('.repo'): + sys.stderr.write('ERROR: No .repo directory found. Please run this from the top of your tree.\n') + sys.exit(1) + + # If --abandon-first is given, abandon the branch before starting + if args.abandon_first: + # Determine if the branch already exists; skip the abandon if it does not + plist = subprocess.check_output(['repo', 'info']) + needs_abandon = False + for pline in plist: + matchObj = re.match(r'Local Branches.*\[(.*)\]', pline) + if matchObj: + local_branches = re.split('\s*,\s*', matchObj.group(1)) + if any(args.start_branch[0] in s for s in local_branches): + needs_abandon = True + + if needs_abandon: + # Perform the abandon only if the branch already exists + if not args.quiet: + print('Abandoning branch: %s' % args.start_branch[0]) + subprocess.check_output(['repo', 'abandon', args.start_branch[0]]) + if not args.quiet: + print('') + + # Get the master manifest from repo + # - convert project name and revision to a path + project_name_to_data = {} + manifest = subprocess.check_output(['repo', 'manifest']) + xml_root = ElementTree.fromstring(manifest) + projects = xml_root.findall('project') + default_revision = xml_root.findall('default')[0].get('revision').split('/')[-1] + + #dump project data into the a list of dicts with the following data: + #{project: {path, revision}} + + for project in projects: + name = project.get('name') + path = project.get('path') + revision = project.get('revision') + if revision is None: + revision = default_revision + + if not name in project_name_to_data: + project_name_to_data[name] = {} + project_name_to_data[name][revision] = path + + # get data on requested changes + reviews = [] + change_numbers = [] + if args.topic: + reviews = fetch_query(args.gerrit, 'topic:{0}'.format(args.topic)) + change_numbers = sorted([str(r['number']) for r in reviews]) + if args.query: + reviews = fetch_query(args.gerrit, args.query) + change_numbers = sorted([str(r['number']) for r in reviews]) + if args.change_number: + reviews = fetch_query(args.gerrit, ' OR '.join('change:{0}'.format(x.split('/')[0]) for x in args.change_number)) + change_numbers = args.change_number + + # make list of things to actually merge + mergables = [] + + for change in change_numbers: + patchset = None + if '/' in change: + (change, patchset) = change.split('/') + change = int(change) + + review = [x for x in reviews if x['number'] == change][0] + mergables.append({ + 'subject': review['subject'], + 'project': review['project'], + 'branch': review['branch'], + 'change_number': review['number'], + 'status': review['status'], + 'fetch': None + }) + mergables[-1]['fetch'] = review['revisions'][review['current_revision']]['fetch'] + mergables[-1]['id'] = change + if patchset: + try: + mergables[-1]['fetch'] = [x['fetch'] for x in review['revisions'] if x['_number'] == patchset][0] + mergables[-1]['id'] = '{0}/{1}'.format(change, patchset) + except (IndexError, ValueError): + args.quiet or print('ERROR: The patch set {0}/{1} could not be found, using CURRENT_REVISION instead.'.format(change, patchset)) + + for item in mergables: + args.quiet or print('Applying change number {0}...'.format(item['id'])) + # Check if change is open and exit if it's not, unless -f is specified + if (item['status'] != 'OPEN' and item['status'] != 'NEW') and not args.query: + if args.force: + print('!! Force-picking a closed change !!\n') + else: + print('Change status is ' + item['status'] + '. Skipping the cherry pick.\nUse -f to force this pick.') + continue + + # Convert the project name to a project path + # - check that the project path exists + project_path = None + + if item['project'] in project_name_to_data and item['branch'] in project_name_to_data[item['project']]: + project_path = project_name_to_data[item['project']][item['branch']] + elif args.path: + project_path = args.path + elif args.ignore_missing: + print('WARNING: Skipping {0} since there is no project directory for: {1}\n'.format(item['id'], item['project'])) + continue + else: + sys.stderr.write('ERROR: For {0}, could not determine the project path for project {1}\n'.format(item['id'], item['project'])) + sys.exit(1) + + # If --start-branch is given, create the branch (more than once per path is okay; repo ignores gracefully) + if args.start_branch: + subprocess.check_output(['repo', 'start', args.start_branch[0], project_path]) + + # Print out some useful info + if not args.quiet: + print('--> Subject: "{0}"'.format(item['subject'])) + print('--> Project path: {0}'.format(project_path)) + print('--> Change number: {0} (Patch Set {0})'.format(item['id'])) + + if 'anonymous http' in item['fetch']: + method = 'anonymous http' + else: + method = 'ssh' + + # Try fetching from GitHub first if using default gerrit + if args.gerrit == default_gerrit: + if args.verbose: + print('Trying to fetch the change from GitHub') + + if args.pull: + cmd = ['git pull --no-edit github', item['fetch'][method]['ref']] + else: + cmd = ['git fetch github', item['fetch'][method]['ref']] + if args.quiet: + cmd.append('--quiet') + else: + print(cmd) + result = subprocess.call([' '.join(cmd)], cwd=project_path, shell=True) + if result != 0: + print('ERROR: git command failed') + sys.exit(result) + FETCH_HEAD = '{0}/.git/FETCH_HEAD'.format(project_path) + # Check if it worked + if args.gerrit != default_gerrit or os.stat(FETCH_HEAD).st_size == 0: + # If not using the default gerrit or github failed, fetch from gerrit. + if args.verbose: + if args.gerrit == default_gerrit: + print('Fetching from GitHub didn\'t work, trying to fetch the change from Gerrit') + else: + print('Fetching from {0}'.format(args.gerrit)) + + if args.pull: + cmd = ['git pull --no-edit', item['fetch'][method]['url'], item['fetch'][method]['ref']] + else: + cmd = ['git fetch', item['fetch'][method]['url'], item['fetch'][method]['ref']] + if args.quiet: + cmd.append('--quiet') + else: + print(cmd) + result = subprocess.call([' '.join(cmd)], cwd=project_path, shell=True) + if result != 0: + print('ERROR: git command failed') + sys.exit(result) + # Perform the cherry-pick + if not args.pull: + cmd = ['git cherry-pick FETCH_HEAD'] + if args.quiet: + cmd_out = open(os.devnull, 'wb') + else: + cmd_out = None + result = subprocess.call(cmd, cwd=project_path, shell=True, stdout=cmd_out, stderr=cmd_out) + if result != 0: + print('ERROR: git command failed') + sys.exit(result) + if not args.quiet: + print('') diff --git a/tools/roomservice.py b/tools/roomservice.py new file mode 100755 index 00000000000..01a7154e582 --- /dev/null +++ b/tools/roomservice.py @@ -0,0 +1,295 @@ +#!/usr/bin/env python +# Copyright (C) 2012-2013, The CyanogenMod Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import print_function + +import base64 +import json +import netrc +import os +import re +import sys +try: + # For python3 + import urllib.error + import urllib.parse + import urllib.request +except ImportError: + # For python2 + import imp + import urllib2 + import urlparse + urllib = imp.new_module('urllib') + urllib.error = urllib2 + urllib.parse = urlparse + urllib.request = urllib2 + +from xml.etree import ElementTree + +product = sys.argv[1]; + +if len(sys.argv) > 2: + depsonly = sys.argv[2] +else: + depsonly = None + +try: + device = product[product.index("_") + 1:] +except: + device = product + +if not depsonly: + print("Device %s not found. Attempting to retrieve device repository from CyanogenMod Github (http://github.com/CyanogenMod)." % device) + +repositories = [] + +try: + authtuple = netrc.netrc().authenticators("api.github.com") + + if authtuple: + githubauth = base64.encodestring('%s:%s' % (authtuple[0], authtuple[2])).replace('\n', '') + else: + githubauth = None +except: + githubauth = None + +def add_auth(githubreq): + if githubauth: + githubreq.add_header("Authorization","Basic %s" % githubauth) + +if not depsonly: + githubreq = urllib.request.Request("https://api.github.com/search/repositories?q=%s+user:CyanogenMod+in:name+fork:true" % device) + add_auth(githubreq) + try: + result = json.loads(urllib.request.urlopen(githubreq).read().decode()) + except urllib.error.URLError: + print("Failed to search GitHub") + sys.exit() + except ValueError: + print("Failed to parse return data from GitHub") + sys.exit() + for res in result.get('items', []): + repositories.append(res) + +local_manifests = r'.repo/local_manifests' +if not os.path.exists(local_manifests): os.makedirs(local_manifests) + +def exists_in_tree(lm, repository): + for child in lm.getchildren(): + if child.attrib['name'].endswith(repository): + return True + return False + +# in-place prettyprint formatter +def indent(elem, level=0): + i = "\n" + level*" " + if len(elem): + if not elem.text or not elem.text.strip(): + elem.text = i + " " + if not elem.tail or not elem.tail.strip(): + elem.tail = i + for elem in elem: + indent(elem, level+1) + if not elem.tail or not elem.tail.strip(): + elem.tail = i + else: + if level and (not elem.tail or not elem.tail.strip()): + elem.tail = i + +def get_default_revision(): + m = ElementTree.parse(".repo/manifest.xml") + d = m.findall('default')[0] + r = d.get('revision') + return r.replace('refs/heads/', '').replace('refs/tags/', '') + +def get_from_manifest(devicename): + try: + lm = ElementTree.parse(".repo/local_manifests/roomservice.xml") + lm = lm.getroot() + except: + lm = ElementTree.Element("manifest") + + for localpath in lm.findall("project"): + if re.search("android_device_.*_%s$" % device, localpath.get("name")): + return localpath.get("path") + + # Devices originally from AOSP are in the main manifest... + try: + mm = ElementTree.parse(".repo/manifest.xml") + mm = mm.getroot() + except: + mm = ElementTree.Element("manifest") + + for localpath in mm.findall("project"): + if re.search("android_device_.*_%s$" % device, localpath.get("name")): + return localpath.get("path") + + return None + +def is_in_manifest(projectname): + try: + lm = ElementTree.parse(".repo/local_manifests/roomservice.xml") + lm = lm.getroot() + except: + lm = ElementTree.Element("manifest") + + for localpath in lm.findall("project"): + if localpath.get("name") == projectname: + return 1 + + ## Search in main manifest, too + try: + lm = ElementTree.parse(".repo/manifest.xml") + lm = lm.getroot() + except: + lm = ElementTree.Element("manifest") + + for localpath in lm.findall("project"): + if localpath.get("name") == projectname: + return 1 + + return None + +def add_to_manifest(repositories, fallback_branch = None): + try: + lm = ElementTree.parse(".repo/local_manifests/roomservice.xml") + lm = lm.getroot() + except: + lm = ElementTree.Element("manifest") + + for repository in repositories: + repo_name = repository['repository'] + repo_target = repository['target_path'] + if exists_in_tree(lm, repo_name): + print('CyanogenMod/%s already exists' % (repo_name)) + continue + + print('Adding dependency: CyanogenMod/%s -> %s' % (repo_name, repo_target)) + project = ElementTree.Element("project", attrib = { "path": repo_target, + "remote": "github", "name": "CyanogenMod/%s" % repo_name }) + + if 'branch' in repository: + project.set('revision',repository['branch']) + elif fallback_branch: + print("Using fallback branch %s for %s" % (fallback_branch, repo_name)) + project.set('revision', fallback_branch) + else: + print("Using default branch for %s" % repo_name) + + lm.append(project) + + indent(lm, 0) + raw_xml = ElementTree.tostring(lm).decode() + raw_xml = '\n' + raw_xml + + f = open('.repo/local_manifests/roomservice.xml', 'w') + f.write(raw_xml) + f.close() + +def fetch_dependencies(repo_path, fallback_branch = None): + print('Looking for dependencies') + dependencies_path = repo_path + '/cm.dependencies' + syncable_repos = [] + + if os.path.exists(dependencies_path): + dependencies_file = open(dependencies_path, 'r') + dependencies = json.loads(dependencies_file.read()) + fetch_list = [] + + for dependency in dependencies: + if not is_in_manifest("CyanogenMod/%s" % dependency['repository']): + fetch_list.append(dependency) + syncable_repos.append(dependency['target_path']) + + dependencies_file.close() + + if len(fetch_list) > 0: + print('Adding dependencies to manifest') + add_to_manifest(fetch_list, fallback_branch) + else: + print('Dependencies file not found, bailing out.') + + if len(syncable_repos) > 0: + print('Syncing dependencies') + os.system('repo sync --force-sync %s' % ' '.join(syncable_repos)) + + for deprepo in syncable_repos: + fetch_dependencies(deprepo) + +def has_branch(branches, revision): + return revision in [branch['name'] for branch in branches] + +if depsonly: + repo_path = get_from_manifest(device) + if repo_path: + fetch_dependencies(repo_path) + else: + print("Trying dependencies-only mode on a non-existing device tree?") + + sys.exit() + +else: + for repository in repositories: + repo_name = repository['name'] + if repo_name.startswith("android_device_") and repo_name.endswith("_" + device): + print("Found repository: %s" % repository['name']) + + manufacturer = repo_name.replace("android_device_", "").replace("_" + device, "") + + default_revision = get_default_revision() + print("Default revision: %s" % default_revision) + print("Checking branch info") + githubreq = urllib.request.Request(repository['branches_url'].replace('{/branch}', '')) + add_auth(githubreq) + result = json.loads(urllib.request.urlopen(githubreq).read().decode()) + + ## Try tags, too, since that's what releases use + if not has_branch(result, default_revision): + githubreq = urllib.request.Request(repository['tags_url'].replace('{/tag}', '')) + add_auth(githubreq) + result.extend (json.loads(urllib.request.urlopen(githubreq).read().decode())) + + repo_path = "device/%s/%s" % (manufacturer, device) + adding = {'repository':repo_name,'target_path':repo_path} + + fallback_branch = None + if not has_branch(result, default_revision): + if os.getenv('ROOMSERVICE_BRANCHES'): + fallbacks = list(filter(bool, os.getenv('ROOMSERVICE_BRANCHES').split(' '))) + for fallback in fallbacks: + if has_branch(result, fallback): + print("Using fallback branch: %s" % fallback) + fallback_branch = fallback + break + + if not fallback_branch: + print("Default revision %s not found in %s. Bailing." % (default_revision, repo_name)) + print("Branches found:") + for branch in [branch['name'] for branch in result]: + print(branch) + print("Use the ROOMSERVICE_BRANCHES environment variable to specify a list of fallback branches.") + sys.exit() + + add_to_manifest([adding], fallback_branch) + + print("Syncing repository to retrieve project.") + os.system('repo sync --force-sync %s' % repo_path) + print("Repository synced!") + + fetch_dependencies(repo_path, fallback_branch) + print("Done") + sys.exit() + +print("Repository for %s not found in the CyanogenMod Github repository list. If this is in error, you may need to manually add it to your local_manifests/roomservice.xml." % device) diff --git a/tools/update-system-img.sh b/tools/update-system-img.sh new file mode 100755 index 00000000000..6340875dc11 --- /dev/null +++ b/tools/update-system-img.sh @@ -0,0 +1,131 @@ +#!/bin/sh -e +# +# Copyright (C) 2013 Canonical, Ltd. +# +# Licensed under the Apache License, Version 2.0 (the 'License'); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an 'AS IS' BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +MNTPATH="/tmp/update-img" +USYSIMG="/data/ubuntu.img" +SYSTEM="/system" +ANDROID="/var/lib/lxc/android/system.img" +SERIAL=$ANDROID_SERIAL + +do_shell() +{ + adb $ADBOPTS shell "$@" +} + +do_push() +{ + adb $ADBOPTS push $@ +} + +convert_android_img() +{ + simg2img $SYSIMG $SYSRAW + resize2fs -M $SYSRAW >/dev/null +} + +cleanup() +{ + [ -f $SYSRAW ] && rm -f $SYSRAW +} + +print_usage() { + cat << EOF +usage: $(basename $0) [-s SERIAL] + + Update the android system image on a Ubuntu Touch device (from recovery) using the + system image format. + + -s SERIAL Device serial number + -h This message +EOF +} + +trap cleanup 1 2 3 9 15 + +while getopts s:h opt; do + case $opt in + h) + print_usage + exit 0 + ;; + s) + SERIAL="$OPTARG" + ;; + esac +done + +if [ -n "$SERIAL" ]; then + ADBOPTS="-s $SERIAL" +fi + +# Also check if there is a default image in the build output path +shift $((OPTIND - 1)) +SYSIMG=$@ +if [ -z "$SYSIMG" ]; then + if [ -z "$OUT" ]; then + SYSIMG=out/target/product/*/system.img + else + SYSIMG=$OUT/system.img + fi +fi +SYSRAW=${SYSIMG}.raw + +if [ ! -f "$SYSIMG" ]; then + echo "Need a valid Android system image path" + exit 1 +fi + +echo "Pushing android image available at $SYSIMG" + +if ! do_shell "ls /sbin/recovery" | grep -q "^/sbin/recovery"; then + echo "Please make sure the device is attached via USB and in recovery mode" + exit 1 +fi + +echo "Mounting system and data partitions" +do_shell "mount /data" +do_shell "mount /system" + +echo "Checking first for the ubuntu.img bind-mounted solution" +if do_shell "ls $USYSIMG" | grep -q "^$USYSIMG"; then + do_shell "mkdir -p $MNTPATH" + do_shell "mount $USYSIMG $MNTPATH" + ANDROIDIMG="$MNTPATH/$ANDROID" +else + echo "Bind mounted ubuntu image not found, looking for the system partition" + ANDROIDIMG="$SYSTEM/$ANDROID" +fi + +if ! do_shell "ls $ANDROIDIMG" | grep -q "^$ANDROIDIMG"; then + echo "Couldn't find the Android image file ($ANDROIDIMG), aborting" + exit 1 +fi + +echo "Converting android system.img to a valid image format" +convert_android_img + +echo "Copying $SYSRAW to the ubuntu system image" +do_push $SYSRAW $ANDROIDIMG + +if do_shell "ls $MNTPATH" | grep -q "^$MNTPATH"; then + do_shell "umount $MNTPATH" +fi + +do_shell "umount /data" +do_shell "umount /system" + +echo "Rebooting device" +adb $ADBOPTS reboot diff --git a/tools/zipalign/Android.mk b/tools/zipalign/Android-.mk similarity index 100% rename from tools/zipalign/Android.mk rename to tools/zipalign/Android-.mk