diff --git a/.gitignore b/.gitignore index c9b568f7e..f1f4a529f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,5 @@ *.pyc *.swp +blueprint/ +kati/ +soong/ diff --git a/CleanSpec.mk b/CleanSpec.mk index 6e7c9b0d3..a97c71a49 100644 --- a/CleanSpec.mk +++ b/CleanSpec.mk @@ -284,6 +284,9 @@ $(call add-clean-step, rm -rf $(PRODUCT_OUT)/recovery/root/default.prop) $(call add-clean-step, rm -rf $(PRODUCT_OUT)/system) +# Switch host builds to Clang by default +$(call add-clean-step, rm -rf $(OUT_DIR)/host) + # Adding dalvik.vm.dex2oat-filter $(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/build.prop) $(call add-clean-step, rm -rf $(PRODUCT_OUT)/root/default.prop) @@ -304,11 +307,77 @@ $(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/*) +# Move to libc++ as the default STL. +$(call add-clean-step, rm -rf $(OUT_DIR)) + +# dex2oat instruction-set changes +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/build.prop) +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/root/default.prop) +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/recovery/root/default.prop) + +# Make GNU++11 the default standard version. This requires a cleanspec because +# char16_t/char32_t will be real types now instead of typedefs, which means +# an ABI change since the names will mangle differently. +$(call add-clean-step, rm -rf $(OUT_DIR)) + # 5.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/*) +# Remove ro.product.locale.language/country and add ro.product.locale +# instead. +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/build.prop) + +# On to MNC +$(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/*) + +# Adding dalvik.vm.usejit +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/build.prop) +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/root/default.prop) +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/recovery/root/default.prop) + +# Rename dalvik.vm.usejit to debug.dalvik.vm.usejit +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/build.prop) +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/root/default.prop) +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/recovery/root/default.prop) + +# Revert rename dalvik.vm.usejit to debug.dalvik.vm.usejit +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/build.prop) +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/root/default.prop) +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/recovery/root/default.prop) + +# Change from interpret-only to verify-at-runtime. +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/build.prop) +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/root/default.prop) +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/recovery/root/default.prop) + +# New York, New York! +$(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/*) + +# 23 is becoming alive!!! +$(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) + +# Change PLATFORM_VERSION from NYC to N +$(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/*) + +# $(PRODUCT_OUT)/recovery/root/sdcard goes from symlink to folder. +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/recovery/root/sdcard) + +# Add BOARD_USES_SYSTEM_OTHER_ODEX +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/app/*) +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/priv-app/*) + # ************************************************ # NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST # ************************************************ diff --git a/tools/droiddoc/templates-sdk-dyn/assets/GPL-LICENSE.txt b/core/LINUX_KERNEL_COPYING similarity index 79% rename from tools/droiddoc/templates-sdk-dyn/assets/GPL-LICENSE.txt rename to core/LINUX_KERNEL_COPYING index 66a0f18db..ca442d313 100644 --- a/tools/droiddoc/templates-sdk-dyn/assets/GPL-LICENSE.txt +++ b/core/LINUX_KERNEL_COPYING @@ -1,12 +1,28 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 + + NOTE! This copyright does *not* cover user programs that use kernel + services by normal system calls - this is merely considered normal use + of the kernel, and does *not* fall under the heading of "derived work". + Also note that the GPL below is copyrighted by the Free Software + Foundation, but the instance of code that it refers to (the Linux + kernel) is copyrighted by me and others who actually wrote it. + + Also note that the only valid version of the GPL as far as the kernel + is concerned is _this_ particular version of the license (ie v2, not + v2.2 or v3.x or whatever), unless explicitly otherwise stated. + + Linus Torvalds + +---------------------------------------- + + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. - Preamble + Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public @@ -15,7 +31,7 @@ software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to +the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not @@ -55,8 +71,8 @@ patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. - - GNU GENERAL PUBLIC LICENSE + + GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains @@ -110,7 +126,7 @@ above, provided that you also meet all of these conditions: License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) - + These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in @@ -168,7 +184,7 @@ access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. - + 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is @@ -225,7 +241,7 @@ impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. - + 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License @@ -255,7 +271,7 @@ make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. - NO WARRANTY + NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN @@ -275,4 +291,66 @@ OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. \ No newline at end of file +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + 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 2 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. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/core/Makefile b/core/Makefile index 15c7f02a6..6399b730d 100644 --- a/core/Makefile +++ b/core/Makefile @@ -22,7 +22,7 @@ endif # src:dest pair is the first one to match the same dest" #$(1): the src:dest pair define check-product-copy-files -$(if $(filter %.apk, $(call word-colon, 2, $(1))),$(error \ +$(if $(filter %.apk, $(call word-colon, 2, $(1))),$(info \ Prebuilt apk found in PRODUCT_COPY_FILES: $(1), use BUILD_PREBUILT instead!)) endef # filter out the duplicate : pairs. @@ -46,6 +46,20 @@ $(foreach cf,$(unique_product_copy_files_pairs), \ unique_product_copy_files_pairs := unique_product_copy_files_destinations := +# ----------------------------------------------------------------- +# Define rules to copy headers defined in copy_headers.mk +# If more than one makefile declared a header, print a warning, +# then copy the last one defined. This matches the previous make +# behavior. +$(foreach dest,$(ALL_COPIED_HEADERS), \ + $(eval _srcs := $(ALL_COPIED_HEADERS.$(dest).SRC)) \ + $(eval _src := $(word $(words $(_srcs)),$(_srcs))) \ + $(if $(call streq,$(_src),$(_srcs)),, \ + $(warning Duplicate header copy: $(dest)) \ + $(warning Defined in: $(ALL_COPIED_HEADERS.$(dest).MAKEFILE))) \ + $(eval $(call copy-one-header,$(_src),$(dest)))) +all_copied_headers: $(ALL_COPIED_HEADERS) + # ----------------------------------------------------------------- # docs/index.html ifeq (,$(TARGET_BUILD_APPS)) @@ -67,7 +81,9 @@ ADDITIONAL_DEFAULT_PROPERTIES += \ ADDITIONAL_DEFAULT_PROPERTIES := $(call uniq-pairs-by-first-component, \ $(ADDITIONAL_DEFAULT_PROPERTIES),=) -$(INSTALLED_DEFAULT_PROP_TARGET): +intermediate_system_build_prop := $(call intermediates-dir-for,ETC,system_build_prop)/build.prop + +$(INSTALLED_DEFAULT_PROP_TARGET): $(intermediate_system_build_prop) @echo Target buildinfo: $@ @mkdir -p $(dir $@) $(hide) echo "#" > $@; \ @@ -75,7 +91,12 @@ $(INSTALLED_DEFAULT_PROP_TARGET): echo "#" >> $@; $(hide) $(foreach line,$(ADDITIONAL_DEFAULT_PROPERTIES), \ echo "$(line)" >> $@;) - build/tools/post_process_props.py $@ + $(hide) echo "#" >> $@; \ + echo "# BOOTIMAGE_BUILD_PROPERTIES" >> $@; \ + echo "#" >> $@; + $(hide) echo ro.bootimage.build.date=`$(DATE_FROM_FILE)`>>$@ + $(hide) echo ro.bootimage.build.date.utc=`$(DATE_FROM_FILE) +%s`>>$@ + $(hide) build/tools/post_process_props.py $@ # ----------------------------------------------------------------- # build.prop @@ -105,25 +126,45 @@ 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_FROM_FILE) +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) -$(INSTALLED_BUILD_PROP_TARGET): PRIVATE_BUILD_DESC := $(build_desc) +build_desc := $(TARGET_VENDOR_PRODUCT_NAME)-$(TARGET_BUILD_VARIANT) $(PLATFORM_VERSION) $(BUILD_ID) $(TARGET_VENDOR_RELEASE_BUILD_ID) $(BUILD_VERSION_TAGS) +$(intermediate_system_build_prop): PRIVATE_BUILD_DESC := $(build_desc) # The string used to uniquely identify the combined build and product; used by the OTA server. ifeq (,$(strip $(BUILD_FINGERPRINT))) ifneq ($(filter eng.%,$(BUILD_NUMBER)),) # Trim down BUILD_FINGERPRINT: the default BUILD_NUMBER makes it easily exceed # the Android system property length limit (PROPERTY_VALUE_MAX=92). - BF_BUILD_NUMBER := $(USER)$(shell date +%m%d%H%M) + BF_BUILD_NUMBER := $(shell echo $${USER:0:6})$(shell $(DATE) +%m%d%H%M) 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) + ifneq ($(TARGET_VENDOR_RELEASE_BUILD_ID),) + BF_BUILD_NUMBER := $(TARGET_VENDOR_RELEASE_BUILD_ID) + endif + BUILD_FINGERPRINT := $(PRODUCT_BRAND)/$(TARGET_VENDOR_PRODUCT_NAME)/$(TARGET_VENDOR_DEVICE_NAME):$(PLATFORM_VERSION)/$(BUILD_ID)/$(BF_BUILD_NUMBER):$(TARGET_BUILD_VARIANT)/$(BUILD_VERSION_TAGS) endif ifneq ($(words $(BUILD_FINGERPRINT)),1) $(error BUILD_FINGERPRINT cannot contain spaces: "$(BUILD_FINGERPRINT)") endif +$(shell mkdir -p $(PRODUCT_OUT) && echo $(BUILD_FINGERPRINT) > $(PRODUCT_OUT)/build_fingerprint.txt) +BUILD_FINGERPRINT_FROM_FILE := $$(cat $(PRODUCT_OUT)/build_fingerprint.txt) + # The string used to uniquely identify the system build; used by the OTA server. # This purposefully excludes any product-specific variables. ifeq (,$(strip $(BUILD_THUMBPRINT))) @@ -147,7 +188,7 @@ ifeq ($(TARGET_BUILD_VARIANT),user) # Dev. branches should have DISPLAY_BUILD_NUMBER set ifeq "true" "$(DISPLAY_BUILD_NUMBER)" - BUILD_DISPLAY_ID := $(BUILD_ID).$(BUILD_NUMBER) $(BUILD_KEYS) + BUILD_DISPLAY_ID := $(BUILD_ID).$(BUILD_NUMBER_FROM_FILE) $(BUILD_KEYS) else BUILD_DISPLAY_ID := $(BUILD_ID) $(BUILD_KEYS) endif @@ -156,39 +197,28 @@ else BUILD_DISPLAY_ID := $(build_desc) endif -# Whether there is default locale set in PRODUCT_PROPERTY_OVERRIDES -product_property_override_locale_language := $(strip \ - $(patsubst ro.product.locale.language=%,%,\ - $(filter ro.product.locale.language=%,$(PRODUCT_PROPERTY_OVERRIDES)))) -product_property_overrides_locale_region := $(strip \ - $(patsubst ro.product.locale.region=%,%,\ - $(filter ro.product.locale.region=%,$(PRODUCT_PROPERTY_OVERRIDES)))) - -# Selects the first locale in the list given as the argument, -# and splits it into language and region, which each may be -# empty. -define default-locale -$(subst _, , $(firstword $(1))) -endef - -# Selects the first locale in the list given as the argument -# and returns the language (or the region), if it's not set in PRODUCT_PROPERTY_OVERRIDES; -# Return empty string if it's already set in PRODUCT_PROPERTY_OVERRIDES. -define default-locale-language -$(if $(product_property_override_locale_language),,$(word 1, $(call default-locale, $(1)))) -endef -define default-locale-region -$(if $(product_property_overrides_locale_region),,$(word 2, $(call default-locale, $(1)))) +# Accepts a whitespace separated list of product locales such as +# (en_US en_AU en_GB...) and returns the first locale in the list with +# underscores replaced with hyphens. In the example above, this will +# return "en-US". +define get-default-product-locale +$(strip $(subst _,-, $(firstword $(1)))) endef BUILDINFO_SH := build/tools/buildinfo.sh +# TARGET_BUILD_FLAVOR and ro.build.flavor are used only by the test harness to distinguish builds. +TARGET_BUILD_FLAVOR := $(TARGET_PRODUCT)-$(TARGET_BUILD_VARIANT) +ifdef SANITIZE_TARGET +TARGET_BUILD_FLAVOR := $(TARGET_BUILD_FLAVOR)_asan +endif + ifdef TARGET_SYSTEM_PROP system_prop_file := $(TARGET_SYSTEM_PROP) else system_prop_file := $(wildcard $(TARGET_DEVICE_DIR)/system.prop) endif -$(INSTALLED_BUILD_PROP_TARGET): $(BUILDINFO_SH) $(INTERNAL_BUILD_ID_MAKEFILE) $(BUILD_SYSTEM)/version_defaults.mk $(system_prop_file) +$(intermediate_system_build_prop): $(BUILDINFO_SH) $(INTERNAL_BUILD_ID_MAKEFILE) $(BUILD_SYSTEM)/version_defaults.mk $(system_prop_file) $(INSTALLED_ANDROID_INFO_TXT_TARGET) @echo Target buildinfo: $@ @mkdir -p $(dir $@) $(hide) echo > $@ @@ -200,26 +230,32 @@ ifneq ($(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_OEM_PROPERTIES),) echo "import /oem/oem.prop $(prop)" >> $@;) 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_BUILD_FLAVOR="$(TARGET_BUILD_FLAVOR)" \ + 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))" \ + PRODUCT_DEFAULT_LOCALE="$(call get-default-product-locale,$(PRODUCT_LOCALES))" \ PRODUCT_DEFAULT_WIFI_CHANNELS="$(PRODUCT_DEFAULT_WIFI_CHANNELS)" \ PRODUCT_MODEL="$(PRODUCT_MODEL)" \ PRODUCT_MANUFACTURER="$(PRODUCT_MANUFACTURER)" \ PRIVATE_BUILD_DESC="$(PRIVATE_BUILD_DESC)" \ BUILD_ID="$(BUILD_ID)" \ BUILD_DISPLAY_ID="$(BUILD_DISPLAY_ID)" \ - BUILD_NUMBER="$(BUILD_NUMBER)" \ + DATE="$(DATE_FROM_FILE)" \ + BUILD_NUMBER="$(BUILD_NUMBER_FROM_FILE)" \ + BOARD_BUILD_SYSTEM_ROOT_IMAGE="$(BOARD_BUILD_SYSTEM_ROOT_IMAGE)" \ + AB_OTA_UPDATER="$(AB_OTA_UPDATER)" \ PLATFORM_VERSION="$(PLATFORM_VERSION)" \ + PLATFORM_SECURITY_PATCH="$(PLATFORM_SECURITY_PATCH)" \ + PLATFORM_BASE_OS="$(PLATFORM_BASE_OS)" \ PLATFORM_SDK_VERSION="$(PLATFORM_SDK_VERSION)" \ + PLATFORM_PREVIEW_SDK_VERSION="$(PLATFORM_PREVIEW_SDK_VERSION)" \ PLATFORM_VERSION_CODENAME="$(PLATFORM_VERSION_CODENAME)" \ PLATFORM_VERSION_ALL_CODENAMES="$(PLATFORM_VERSION_ALL_CODENAMES)" \ BUILD_VERSION_TAGS="$(BUILD_VERSION_TAGS)" \ TARGET_BOOTLOADER_BOARD_NAME="$(TARGET_BOOTLOADER_BOARD_NAME)" \ - BUILD_FINGERPRINT="$(BUILD_FINGERPRINT)" \ + BUILD_FINGERPRINT="$(BUILD_FINGERPRINT_FROM_FILE)" \ $(if $(OEM_THUMBPRINT_PROPERTIES),BUILD_THUMBPRINT="$(BUILD_THUMBPRINT)") \ TARGET_BOARD_PLATFORM="$(TARGET_BOARD_PLATFORM)" \ TARGET_CPU_ABI_LIST="$(TARGET_CPU_ABI_LIST)" \ @@ -228,6 +264,7 @@ endif TARGET_CPU_ABI="$(TARGET_CPU_ABI)" \ TARGET_CPU_ABI2="$(TARGET_CPU_ABI2)" \ TARGET_AAPT_CHARACTERISTICS="$(TARGET_AAPT_CHARACTERISTICS)" \ + $(PRODUCT_BUILD_PROP_OVERRIDES) \ bash $(BUILDINFO_SH) >> $@ $(hide) $(foreach file,$(system_prop_file), \ if [ -f "$(file)" ]; then \ @@ -244,10 +281,25 @@ 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) cat $(INSTALLED_ANDROID_INFO_TXT_TARGET) | grep 'require version-' | sed -e 's/require version-/ro.build.expect./g' >> $@ + $(hide) build/tools/post_process_props.py $@ "$(PRODUCT_PROPERTY_UBER_OVERRIDES)" $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SYSTEM_PROPERTY_BLACKLIST) build_desc := +ifeq (,$(filter true, $(TARGET_NO_KERNEL) $(TARGET_NO_RECOVERY))) +INSTALLED_RECOVERYIMAGE_TARGET := $(PRODUCT_OUT)/recovery.img +else +INSTALLED_RECOVERYIMAGE_TARGET := +endif + +$(INSTALLED_BUILD_PROP_TARGET): $(intermediate_system_build_prop) $(INSTALLED_RECOVERYIMAGE_TARGET) + @echo "Target build info: $@" + $(hide) cat $(intermediate_system_build_prop) > $@ + $(hide) echo ro.bootimage.build.fingerprint="$(BUILD_FINGERPRINT_FROM_FILE)">>$@ +ifdef INSTALLED_RECOVERYIMAGE_TARGET + $(hide) echo ro.expect.recovery_id=`cat $(RECOVERYIMAGE_ID_FILE)` >> $@ +endif + # ----------------------------------------------------------------- # vendor build.prop # @@ -259,11 +311,13 @@ $(INSTALLED_VENDOR_BUILD_PROP_TARGET): $(INSTALLED_BUILD_PROP_TARGET) @echo Target vendor buildinfo: $@ @mkdir -p $(dir $@) $(hide) echo > $@ - $(hide) echo ro.vendor.build.date=`date`>>$@ - $(hide) echo ro.vendor.build.date.utc=`date +%s`>>$@ - $(hide) echo ro.vendor.build.fingerprint="$(BUILD_FINGERPRINT)">>$@ + $(hide) echo ro.vendor.build.date=`$(DATE_FROM_FILE)`>>$@ + $(hide) echo ro.vendor.build.date.utc=`$(DATE_FROM_FILE) +%s`>>$@ + $(hide) echo ro.vendor.build.fingerprint="$(BUILD_FINGERPRINT_FROM_FILE)">>$@ endif +# ---------------------------------------------------------------- + # ----------------------------------------------------------------- # sdk-build.prop # @@ -300,7 +354,12 @@ $(PACKAGE_STATS_FILE): $(PACKAGES_TO_STAT) @echo Package stats: $@ @mkdir -p $(dir $@) $(hide) rm -f $@ +ifeq ($(PACKAGES_TO_STAT),) +# Create empty package stats file if target builds no jar(s) or apk(s). + $(hide) touch $@ +else $(hide) build/tools/dump-package-stats $^ > $@ +endif .PHONY: package-stats package-stats: $(PACKAGE_STATS_FILE) @@ -345,20 +404,6 @@ ifneq (,$(TARGET_BUILD_APPS)) $(call dist-for-goals, apps_only, $(APKCERTS_FILE):apkcerts.txt) endif -# ----------------------------------------------------------------- -# module info file -ifdef CREATE_MODULE_INFO_FILE - MODULE_INFO_FILE := $(PRODUCT_OUT)/module-info.txt - $(info Generating $(MODULE_INFO_FILE)...) - $(shell rm -f $(MODULE_INFO_FILE)) - $(foreach m,$(ALL_MODULES), \ - $(shell echo "NAME=\"$(m)\"" \ - "PATH=\"$(strip $(ALL_MODULES.$(m).PATH))\"" \ - "TAGS=\"$(strip $(filter-out _%,$(ALL_MODULES.$(m).TAGS)))\"" \ - "BUILT=\"$(strip $(ALL_MODULES.$(m).BUILT))\"" \ - "INSTALLED=\"$(strip $(ALL_MODULES.$(m).INSTALLED))\"" >> $(MODULE_INFO_FILE))) -endif - # ----------------------------------------------------------------- # The dev key is used to sign this package, and as the key required @@ -367,6 +412,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. @@ -441,9 +489,20 @@ endif # ----------------------------------------------------------------- # the ramdisk +BOOT_RAMDISK_COMPRESSOR := $(MINIGZIP) +RECOVERY_RAMDISK_COMPRESSOR := $(MINIGZIP) +ifneq ($(LZMA_RAMDISK_TARGETS),) + ifneq (,$(findstring boot,$(LZMA_RAMDISK_TARGETS))) + BOOT_RAMDISK_COMPRESSOR := lzma -f -c + endif + ifneq (,$(findstring recovery,$(LZMA_RAMDISK_TARGETS))) + RECOVERY_RAMDISK_COMPRESSOR := lzma -f -c + TARGET_NOT_USE_GZIP_RECOVERY_RAMDISK := true + endif +endif + INTERNAL_RAMDISK_FILES := $(filter $(TARGET_ROOT_OUT)/%, \ $(ALL_PREBUILT) \ - $(ALL_COPIED_HEADERS) \ $(ALL_GENERATED_SOURCES) \ $(ALL_DEFAULT_INSTALLED_MODULES)) @@ -453,12 +512,12 @@ BUILT_RAMDISK_TARGET := $(PRODUCT_OUT)/ramdisk.img INSTALLED_RAMDISK_TARGET := $(BUILT_RAMDISK_TARGET) $(INSTALLED_RAMDISK_TARGET): $(MKBOOTFS) $(INTERNAL_RAMDISK_FILES) | $(MINIGZIP) $(call pretty,"Target ram disk: $@") - $(hide) $(MKBOOTFS) $(TARGET_ROOT_OUT) | $(MINIGZIP) > $@ + $(hide) $(MKBOOTFS) -d $(TARGET_OUT) $(TARGET_ROOT_OUT) | $(BOOT_RAMDISK_COMPRESSOR) > $@ .PHONY: ramdisk-nodeps ramdisk-nodeps: $(MKBOOTFS) | $(MINIGZIP) @echo "make $@: ignoring dependencies" - $(hide) $(MKBOOTFS) $(TARGET_ROOT_OUT) | $(MINIGZIP) > $(INSTALLED_RAMDISK_TARGET) + $(hide) $(MKBOOTFS) -d $(TARGET_OUT) $(TARGET_ROOT_OUT) | $(BOOT_RAMDISK_COMPRESSOR) > $(INSTALLED_RAMDISK_TARGET) ifneq ($(strip $(TARGET_NO_KERNEL)),true) @@ -466,16 +525,14 @@ ifneq ($(strip $(TARGET_NO_KERNEL)),true) # the boot image, which is a collection of other images. INTERNAL_BOOTIMAGE_ARGS := \ $(addprefix --second ,$(INSTALLED_2NDBOOTLOADER_TARGET)) \ - --kernel $(INSTALLED_KERNEL_TARGET) \ - --ramdisk $(INSTALLED_RAMDISK_TARGET) + --kernel $(INSTALLED_KERNEL_TARGET) -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)" +ifneq ($(BOARD_BUILD_SYSTEM_ROOT_IMAGE),true) +INTERNAL_BOOTIMAGE_ARGS += --ramdisk $(INSTALLED_RAMDISK_TARGET) endif +INTERNAL_BOOTIMAGE_FILES := $(filter-out --%,$(INTERNAL_BOOTIMAGE_ARGS)) + BOARD_KERNEL_BASE := $(strip $(BOARD_KERNEL_BASE)) ifdef BOARD_KERNEL_BASE INTERNAL_BOOTIMAGE_ARGS += --base $(BOARD_KERNEL_BASE) @@ -486,55 +543,90 @@ ifdef BOARD_KERNEL_PAGESIZE INTERNAL_BOOTIMAGE_ARGS += --pagesize $(BOARD_KERNEL_PAGESIZE) endif -INSTALLED_BOOTIMAGE_TARGET := $(PRODUCT_OUT)/boot.img +ifeq ($(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VERITY),true) +ifeq ($(BOARD_BUILD_SYSTEM_ROOT_IMAGE),true) +VERITY_KEYID := veritykeyid=id:`openssl x509 -in $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VERITY_SIGNING_KEY).x509.pem -text \ + | grep keyid | sed 's/://g' | tr -d '[:space:]' | tr '[:upper:]' '[:lower:]' | sed 's/keyid//g'` +endif +endif -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) +BOARD_KERNEL_CMDLINE := $(strip $(BOARD_KERNEL_CMDLINE) buildvariant=$(TARGET_BUILD_VARIANT) $(VERITY_KEYID)) +ifdef BOARD_KERNEL_CMDLINE +INTERNAL_BOOTIMAGE_ARGS += --cmdline "$(BOARD_KERNEL_CMDLINE)" +endif -ifeq ($(TARGET_BOOTIMAGE_USE_EXTLINUX),true) -INTERNAL_BOOTIMAGE_ARGS += --extlinuxconf $(TARGET_BOOTIMAGE_EXTLINUX_CONFIG) +INTERNAL_MKBOOTIMG_VERSION_ARGS := \ + --os_version $(PLATFORM_VERSION) \ + --os_patch_level $(PLATFORM_SECURITY_PATCH) + +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): $(MKEXT2IMG) $(INTERNAL_BOOTIMAGE_FILES) - $(call pretty,"Target boot image: $@") - $(hide) $(MKEXT2BOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) --output $@ +INSTALLED_BOOTIMAGE_TARGET := $(PRODUCT_OUT)/boot.img -.PHONY: bootimage-nodeps -bootimage-nodeps: $(MKEXT2IMG) - @echo "make $@: ignoring dependencies" - $(hide) $(MKEXT2BOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) --output $(INSTALLED_BOOTIMAGE_TARGET) +# BOARD_USES_RECOVERY_AS_BOOT = true must have BOARD_BUILD_SYSTEM_ROOT_IMAGE = true. +ifeq ($(BOARD_USES_RECOVERY_AS_BOOT),true) +ifneq ($(BOARD_BUILD_SYSTEM_ROOT_IMAGE),true) + $(error BOARD_BUILD_SYSTEM_ROOT_IMAGE must be enabled for BOARD_USES_RECOVERY_AS_BOOT.) +endif +endif -else ifeq (true,$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VERITY)) # TARGET_BOOTIMAGE_USE_EXT2 != true +# We build recovery as boot image if BOARD_USES_RECOVERY_AS_BOOT is true. +ifneq ($(BOARD_USES_RECOVERY_AS_BOOT),true) +ifeq ($(TARGET_BOOTIMAGE_USE_EXT2),true) +$(error TARGET_BOOTIMAGE_USE_EXT2 is not supported anymore) +else ifeq (true,$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_BOOT_SIGNER)) # TARGET_BOOTIMAGE_USE_EXT2 != true -$(INSTALLED_BOOTIMAGE_TARGET): $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_FILES) $(BOOT_SIGNER) +$(INSTALLED_BOOTIMAGE_TARGET): $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_FILES) $(BOOT_SIGNER) $(BOOTIMAGE_EXTRA_DEPS) $(call pretty,"Target boot image: $@") - $(hide) $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $@ + $(hide) $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) $(INTERNAL_MKBOOTIMG_VERSION_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 $@ $(hide) $(call assert-max-image-size,$@,$(BOARD_BOOTIMAGE_PARTITION_SIZE)) .PHONY: bootimage-nodeps bootimage-nodeps: $(MKBOOTIMG) $(BOOT_SIGNER) @echo "make $@: ignoring dependencies" - $(hide) $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $(INSTALLED_BOOTIMAGE_TARGET) + $(hide) $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) $(INTERNAL_MKBOOTIMG_VERSION_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 ifndef BOARD_CUSTOM_BOOTIMG_MK + + ifeq (true,$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VBOOT)) # PRODUCT_SUPPORTS_BOOT_SIGNER != true -$(INSTALLED_BOOTIMAGE_TARGET): $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_FILES) +$(INSTALLED_BOOTIMAGE_TARGET): $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_FILES) $(VBOOT_SIGNER) $(FUTILITY) $(BOOTIMAGE_EXTRA_DEPS) $(call pretty,"Target boot image: $@") - $(hide) $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $@ + $(hide) $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) $(INTERNAL_MKBOOTIMG_VERSION_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $@.unsigned + $(VBOOT_SIGNER) $(FUTILITY) $@.unsigned $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VBOOT_SIGNING_KEY).vbpubk $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VBOOT_SIGNING_KEY).vbprivk $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VBOOT_SIGNING_SUBKEY).vbprivk $@.keyblock $@ + $(hide) $(call assert-max-image-size,$@,$(BOARD_BOOTIMAGE_PARTITION_SIZE)) + +.PHONY: bootimage-nodeps +bootimage-nodeps: $(MKBOOTIMG) $(VBOOT_SIGNER) $(FUTILITY) + @echo "make $@: ignoring dependencies" + $(hide) $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) $(INTERNAL_MKBOOTIMG_VERSION_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $(INSTALLED_BOOTIMAGE_TARGET).unsigned + $(VBOOT_SIGNER) $(FUTILITY) $(INSTALLED_BOOTIMAGE_TARGET).unsigned $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VBOOT_SIGNING_KEY).vbpubk $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VBOOT_SIGNING_KEY).vbprivk $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VBOOT_SIGNING_SUBKEY).vbprivk $(INSTALLED_BOOTIMAGE_TARGET).keyblock $(INSTALLED_BOOTIMAGE_TARGET) + $(hide) $(call assert-max-image-size,$(INSTALLED_BOOTIMAGE_TARGET),$(BOARD_BOOTIMAGE_PARTITION_SIZE)) + + else # PRODUCT_SUPPORTS_VBOOT != true + +$(INSTALLED_BOOTIMAGE_TARGET): $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_FILES) $(BOOTIMAGE_EXTRA_DEPS) + $(call pretty,"Target boot image: $@") + $(hide) $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) $(INTERNAL_MKBOOTIMG_VERSION_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $@ $(hide) $(call assert-max-image-size,$@,$(BOARD_BOOTIMAGE_PARTITION_SIZE)) .PHONY: bootimage-nodeps bootimage-nodeps: $(MKBOOTIMG) @echo "make $@: ignoring dependencies" - $(hide) $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $(INSTALLED_BOOTIMAGE_TARGET) + $(hide) $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) $(INTERNAL_MKBOOTIMG_VERSION_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $(INSTALLED_BOOTIMAGE_TARGET) $(hide) $(call assert-max-image-size,$(INSTALLED_BOOTIMAGE_TARGET),$(BOARD_BOOTIMAGE_PARTITION_SIZE)) -endif # TARGET_BOOTIMAGE_USE_EXT2 + endif # PRODUCT_SUPPORTS_VBOOT +endif # TARGET_BOOTIMAGE_USE_EXT2 / BOARD_CUSTOM_BOOTIMG_MK +endif # BOARD_USES_RECOVERY_AS_BOOT else # TARGET_NO_KERNEL # HACK: The top-level targets depend on the bootimage. Not all targets @@ -636,7 +728,7 @@ endif # TARGET_BUILD_APPS # make the target NOTICE files depend on this particular file too, which will # then be in the right directory for the find in combine-notice-files to work. $(kernel_notice_file): \ - prebuilts/qemu-kernel/arm/LINUX_KERNEL_COPYING \ + $(BUILD_SYSTEM)/LINUX_KERNEL_COPYING \ | $(ACP) @echo Copying: $@ $(hide) mkdir -p $(dir $@) @@ -651,10 +743,28 @@ $(kernel_notice_file): \ # before the rules that use that variable to build the image. ALL_DEFAULT_INSTALLED_MODULES += $(TARGET_OUT_ETC)/security/otacerts.zip $(TARGET_OUT_ETC)/security/otacerts.zip: KEY_CERT_PAIR := $(DEFAULT_KEY_CERT_PAIR) -$(TARGET_OUT_ETC)/security/otacerts.zip: $(addsuffix .x509.pem,$(DEFAULT_KEY_CERT_PAIR)) +$(TARGET_OUT_ETC)/security/otacerts.zip: $(addsuffix .x509.pem,$(DEFAULT_KEY_CERT_PAIR)) | $(ZIPTIME) + $(hide) rm -f $@ + $(hide) mkdir -p $(dir $@) + $(hide) zip -qjX $@ $< + $(remove-timestamps-from-package) + +# Carry the public key for update_engine if it's a non-Brillo target that +# uses the AB updater. We use the same key as otacerts but in RSA public key +# format. +ifeq ($(AB_OTA_UPDATER),true) +ifeq ($(BRILLO),) +ALL_DEFAULT_INSTALLED_MODULES += $(TARGET_OUT_ETC)/update_engine/update-payload-key.pub.pem +$(TARGET_OUT_ETC)/update_engine/update-payload-key.pub.pem: $(addsuffix .x509.pem,$(DEFAULT_KEY_CERT_PAIR)) $(hide) rm -f $@ $(hide) mkdir -p $(dir $@) - $(hide) zip -qj $@ $< + $(hide) openssl x509 -pubkey -noout -in $< > $@ + +ALL_DEFAULT_INSTALLED_MODULES += $(TARGET_RECOVERY_ROOT_OUT)/etc/update_engine/update-payload-key.pub.pem +$(TARGET_RECOVERY_ROOT_OUT)/etc/update_engine/update-payload-key.pub.pem: $(TARGET_OUT_ETC)/update_engine/update-payload-key.pub.pem + $(hide) cp -f $< $@ +endif +endif .PHONY: otacerts otacerts: $(TARGET_OUT_ETC)/security/otacerts.zip @@ -679,6 +789,15 @@ 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 +ifeq ($(TARGET_USERIMAGES_USE_YAFFS),true) +INTERNAL_USERIMAGES_USE_YAFFS := true +endif # These options tell the recovery updater/installer how to mount the partitions writebale. # =[|]... @@ -691,69 +810,118 @@ ifneq (true,$(TARGET_USERIMAGES_SPARSE_EXT_DISABLED)) INTERNAL_USERIMAGES_SPARSE_EXT_FLAG := -s 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 +ifeq ($(INTERNAL_USERIMAGES_USE_F2FS),true) INTERNAL_USERIMAGES_DEPS += $(MKF2FSUSERIMG) $(MAKE_F2FS) endif -else -INTERNAL_USERIMAGES_DEPS := $(MKYAFFS2) +ifeq ($(INTERNAL_USERIMAGES_USE_YAFFS),true) +INTERNAL_USERIMAGES_DEPS += $(MKYAFFS2) +endif + +ifneq (true,$(TARGET_USERIMAGES_SPARSE_SQUASHFS_DISABLED)) + INTERNAL_USERIMAGES_SPARSE_SQUASHFS_FLAG := -s endif +ifneq ($(filter $(BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE) $(BOARD_SYSTEMIMAGE_FILE_SYSTEM_TYPE),squashfs),) +INTERNAL_USERIMAGES_DEPS += $(MAKE_SQUASHFS) $(MKSQUASHFSUSERIMG) $(IMG2SIMG) +endif + +INTERNAL_USERIMAGES_DEPS += $(SIMG2IMG) INTERNAL_USERIMAGES_BINARY_PATHS := $(sort $(dir $(INTERNAL_USERIMAGES_DEPS))) ifeq (true,$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VERITY)) INTERNAL_USERIMAGES_DEPS += $(BUILD_VERITY_TREE) $(APPEND2SIMG) $(VERITY_SIGNER) +ifeq (true,$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VERITY_FEC)) +INTERNAL_USERIMAGES_DEPS += $(FEC) +endif endif -SELINUX_FC := $(TARGET_ROOT_OUT)/file_contexts +SELINUX_FC := $(TARGET_ROOT_OUT)/file_contexts.bin INTERNAL_USERIMAGES_DEPS += $(SELINUX_FC) +INTERNAL_USERIMAGES_DEPS += $(BLK_ALLOC_TO_BASE_FS) + # $(1): the path of the output dictionary file # $(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)) +$(if $(BOARD_SYSTEMIMAGE_EXTFS_INODE_COUNT),$(hide) echo "system_extfs_inode_count=$(BOARD_SYSTEMIMAGE_EXTFS_INODE_COUNT)" >> $(1)) $(if $(BOARD_SYSTEMIMAGE_JOURNAL_SIZE),$(hide) echo "system_journal_size=$(BOARD_SYSTEMIMAGE_JOURNAL_SIZE)" >> $(1)) +$(if $(BOARD_HAS_EXT4_RESERVED_BLOCKS),$(hide) echo "has_ext4_reserved_blocks=$(BOARD_HAS_EXT4_RESERVED_BLOCKS)" >> $(1)) +$(if $(BOARD_SYSTEMIMAGE_SQUASHFS_COMPRESSOR),$(hide) echo "system_squashfs_compressor=$(BOARD_SYSTEMIMAGE_SQUASHFS_COMPRESSOR)" >> $(1)) +$(if $(BOARD_SYSTEMIMAGE_SQUASHFS_COMPRESSOR_OPT),$(hide) echo "system_squashfs_compressor_opt=$(BOARD_SYSTEMIMAGE_SQUASHFS_COMPRESSOR_OPT)" >> $(1)) +$(if $(BOARD_SYSTEMIMAGE_SQUASHFS_BLOCK_SIZE),$(hide) echo "system_squashfs_block_size=$(BOARD_SYSTEMIMAGE_SQUASHFS_BLOCK_SIZE)" >> $(1)) +$(if $(BOARD_SYSTEMIMAGE_SQUASHFS_DISABLE_4K_ALIGN),$(hide) echo "system_squashfs_disable_4k_align=$(BOARD_SYSTEMIMAGE_SQUASHFS_DISABLE_4K_ALIGN)" >> $(1)) +$(if $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SYSTEM_BASE_FS_PATH),$(hide) echo "system_base_fs_file=$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SYSTEM_BASE_FS_PATH)" >> $(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 $(BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE),$(hide) echo "vendor_fs_type=$(BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE)" >> $(1)) +$(if $(BOARD_VENDORIMAGE_EXTFS_INODE_COUNT),$(hide) echo "vendor_extfs_inode_count=$(BOARD_VENDORIMAGE_EXTFS_INODE_COUNT)" >> $(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_VENDORIMAGE_SQUASHFS_COMPRESSOR),$(hide) echo "vendor_squashfs_compressor=$(BOARD_VENDORIMAGE_SQUASHFS_COMPRESSOR)" >> $(1)) +$(if $(BOARD_VENDORIMAGE_SQUASHFS_COMPRESSOR_OPT),$(hide) echo "vendor_squashfs_compressor_opt=$(BOARD_VENDORIMAGE_SQUASHFS_COMPRESSOR_OPT)" >> $(1)) +$(if $(BOARD_VENDORIMAGE_SQUASHFS_BLOCK_SIZE),$(hide) echo "vendor_squashfs_block_size=$(BOARD_VENDORIMAGE_SQUASHFS_BLOCK_SIZE)" >> $(1)) +$(if $(BOARD_VENDORIMAGE_SQUASHFS_DISABLE_4K_ALIGN),$(hide) echo "vendor_squashfs_disable_4k_align=$(BOARD_VENDORIMAGE_SQUASHFS_DISABLE_4K_ALIGN)" >> $(1)) +$(if $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VENDOR_BASE_FS_PATH),$(hide) echo "vendor_base_fs_file=$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VENDOR_BASE_FS_PATH)" >> $(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 $(BOARD_OEMIMAGE_EXTFS_INODE_COUNT),$(hide) echo "oem_extfs_inode_count=$(BOARD_OEMIMAGE_EXTFS_INODE_COUNT)" >> $(1)) $(if $(INTERNAL_USERIMAGES_SPARSE_EXT_FLAG),$(hide) echo "extfs_sparse_flag=$(INTERNAL_USERIMAGES_SPARSE_EXT_FLAG)" >> $(1)) $(if $(mkyaffs2_extra_flags),$(hide) echo "mkyaffs2_extra_flags=$(mkyaffs2_extra_flags)" >> $(1)) +$(if $(INTERNAL_USERIMAGES_SPARSE_SQUASHFS_FLAG),$(hide) echo "squashfs_sparse_flag=$(INTERNAL_USERIMAGES_SPARSE_SQUASHFS_FLAG)" >> $(1)) $(hide) echo "selinux_fc=$(SELINUX_FC)" >> $(1) +$(if $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_BOOT_SIGNER),$(hide) echo "boot_signer=$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_BOOT_SIGNER)" >> $(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)) +$(if $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VERITY),$(hide) echo "verity_signer_cmd=$(notdir $(VERITY_SIGNER))" >> $(1)) +$(if $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VERITY_FEC),$(hide) echo "verity_fec=$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VERITY_FEC)" >> $(1)) $(if $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SYSTEM_VERITY_PARTITION),$(hide) echo "system_verity_block_device=$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SYSTEM_VERITY_PARTITION)" >> $(1)) $(if $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VENDOR_VERITY_PARTITION),$(hide) echo "vendor_verity_block_device=$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VENDOR_VERITY_PARTITION)" >> $(1)) +$(if $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VBOOT),$(hide) echo "vboot=$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VBOOT)" >> $(1)) +$(if $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VBOOT),$(hide) echo "vboot_key=$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VBOOT_SIGNING_KEY)" >> $(1)) +$(if $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VBOOT),$(hide) echo "vboot_subkey=$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VBOOT_SIGNING_SUBKEY)" >> $(1)) +$(if $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VBOOT),$(hide) echo "futility=$(notdir $(FUTILITY))" >> $(1)) +$(if $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VBOOT),$(hide) echo "vboot_signer_cmd=$(VBOOT_SIGNER)" >> $(1)) +$(if $(filter true,$(BOARD_USES_RECOVERY_AS_BOOT)),\ + $(hide) echo "recovery_as_boot=true" >> $(1)) +$(if $(filter true,$(BOARD_BUILD_SYSTEM_ROOT_IMAGE)),\ + $(hide) echo "system_root_image=true" >> $(1);\ + echo "ramdisk_dir=$(TARGET_ROOT_OUT)" >> $(1)) $(if $(2),$(hide) $(foreach kv,$(2),echo "$(kv)" >> $(1);)) endef # ----------------------------------------------------------------- # Recovery image -# If neither TARGET_NO_KERNEL nor TARGET_NO_RECOVERY are true -ifeq (,$(filter true, $(TARGET_NO_KERNEL) $(TARGET_NO_RECOVERY))) +# Recovery image exists if we are building recovery, or building recovery as boot. +ifneq (,$(INSTALLED_RECOVERYIMAGE_TARGET)$(filter true,$(BOARD_USES_RECOVERY_AS_BOOT))) -INSTALLED_RECOVERYIMAGE_TARGET := $(PRODUCT_OUT)/recovery.img +INTERNAL_RECOVERYIMAGE_FILES := $(filter $(TARGET_RECOVERY_OUT)/%, \ + $(ALL_DEFAULT_INSTALLED_MODULES)) -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_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_uncompressed_ramdisk := $(PRODUCT_OUT)/ramdisk-recovery.cpio +recovery_build_prop := $(intermediate_system_build_prop) +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)) # If PRODUCT_AAPT_PREF_CONFIG includes a dpi bucket, then use that value. recovery_density := $(filter %dpi,$(PRODUCT_AAPT_PREF_CONFIG)) @@ -761,6 +929,7 @@ 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) @@ -768,30 +937,65 @@ else recovery_resources_common := $(recovery_resources_common)-xhdpi endif +ifneq (,$(RECOVERY_EXTRA_RESOURCE_DIR)) +recovery_resources_extra := $(strip \ + $(wildcard $(RECOVERY_EXTRA_RESOURCE_DIR)/res-$(recovery_density))) +endif + # Select the 18x32 font on high-density devices (xhdpi and up); and # the 12x22 font on other devices. Note that the font selected here # 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 xxxhdpi 560dpi xxhdpi 400dpi xhdpi,$(recovery_density))) +recovery_font := $(call project-path-for,recovery)/fonts/18x32.png +else +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_font := $(call include-path-for, recovery)/fonts/12x22.png +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)) +ifndef TARGET_PRIVATE_RES_DIRS +TARGET_PRIVATE_RES_DIRS := $(wildcard $(TARGET_DEVICE_DIR)/recovery/res) +endif recovery_resource_deps := $(shell find $(recovery_resources_common) \ - $(recovery_resources_private) -type f) + $(recovery_resources_extra) $(TARGET_PRIVATE_RES_DIRS) -type f) ifdef TARGET_RECOVERY_FSTAB recovery_fstab := $(TARGET_RECOVERY_FSTAB) else recovery_fstab := $(strip $(wildcard $(TARGET_DEVICE_DIR)/recovery.fstab)) endif +ifdef TARGET_RECOVERY_WIPE +recovery_wipe := $(TARGET_RECOVERY_WIPE) +else +recovery_wipe := +endif + +# Prior to A/B update, we used to have: +# boot.img + recovery-from-boot.p + recovery-resource.dat = recovery.img. +# recovery-resource.dat is needed only if we carry a patch of the boot and +# recovery images and invoke install-recovery.sh on the first boot post an +# OTA update. +# +# We no longer need that if one of the following conditions holds: +# a) We carry a full copy of the recovery image +# (BOARD_USES_FULL_RECOVERY_IMAGE = true); +# b) We build a single image that contains boot and recovery both +# (BOARD_USES_RECOVERY_AS_BOOT = true). + +ifeq (,$(filter true, $(BOARD_USES_FULL_RECOVERY_IMAGE) $(BOARD_USES_RECOVERY_AS_BOOT) $(TARGET_NOT_USE_GZIP_RECOVERY_RAMDISK))) # Named '.dat' so we don't attempt to use imgdiff for patching it. RECOVERY_RESOURCE_ZIP := $(TARGET_OUT)/etc/recovery-resource.dat - -ifeq ($(recovery_resources_private),) - $(info No private recovery resources for TARGET_DEVICE $(TARGET_DEVICE)) +else +RECOVERY_RESOURCE_ZIP := endif ifeq ($(recovery_fstab),) @@ -805,6 +1009,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,12 +1023,21 @@ 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) +endif + # Generate a file containing the keys that will be read by the # recovery binary. RECOVERY_INSTALL_OTA_KEYS := \ @@ -833,53 +1051,150 @@ $(RECOVERY_INSTALL_OTA_KEYS): $(OTA_PUBLIC_KEYS) $(DUMPKEY_JAR) $(extra_keys) @mkdir -p $(dir $@) java -jar $(DUMPKEY_JAR) $(PRIVATE_OTA_PUBLIC_KEYS) $(extra_keys) > $@ -$(INSTALLED_RECOVERYIMAGE_TARGET): $(MKBOOTFS) $(MKBOOTIMG) $(MINIGZIP) \ +define build-recoveryramdisk + @echo ----- Making recovery ramdisk ------ + $(hide) mkdir -p $(TARGET_RECOVERY_OUT) + $(hide) mkdir -p $(TARGET_RECOVERY_ROOT_OUT)/etc $(TARGET_RECOVERY_ROOT_OUT)/sdcard $(TARGET_RECOVERY_ROOT_OUT)/tmp + @echo Copying baseline ramdisk... + $(hide) rsync -a --exclude=etc --exclude=sdcard --exclude=vendor $(IGNORE_CACHE_LINK) $(TARGET_ROOT_OUT) $(TARGET_RECOVERY_OUT) # "cp -Rf" fails to overwrite broken symlinks on Mac. + @echo Modifying ramdisk contents... + $(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)/ || true # Ignore error when the src file doesn't exist. + $(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) $(foreach item,$(recovery_resources_extra), \ + cp -rf $(item)/* $(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,$(TARGET_PRIVATE_RES_DIRS), \ + cp -rf $(item) $(TARGET_RECOVERY_ROOT_OUT)/$(newline);) + $(hide) $(foreach item,$(recovery_fstab), \ + cp -f $(item) $(TARGET_RECOVERY_ROOT_OUT)/etc/recovery.fstab;) + $(if $(strip $(recovery_wipe)), \ + $(hide) cp -f $(recovery_wipe) $(TARGET_RECOVERY_ROOT_OUT)/etc/recovery.wipe) + $(hide) cp $(RECOVERY_INSTALL_OTA_KEYS) $(TARGET_RECOVERY_ROOT_OUT)/res/keys + $(hide) cat $(INSTALLED_DEFAULT_PROP_TARGET) $(recovery_build_prop) \ + > $(TARGET_RECOVERY_ROOT_OUT)/default.prop + $(BOARD_RECOVERY_IMAGE_PREPARE) + $(if $(filter true,$(BOARD_BUILD_SYSTEM_ROOT_IMAGE)), \ + $(hide) mkdir -p $(TARGET_RECOVERY_ROOT_OUT)/system_root; \ + rm -rf $(TARGET_RECOVERY_ROOT_OUT)/system; \ + ln -sf /system_root/system $(TARGET_RECOVERY_ROOT_OUT)/system) # Mount the system_root_image to /system_root and symlink /system. +endef + +RECOVERYIMAGE_ID_FILE := $(PRODUCT_OUT)/recovery.id +# $(1): output file +define build-recoveryimage-target + $(if $(filter true,$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VBOOT)), \ + $(hide) $(MKBOOTIMG) $(INTERNAL_RECOVERYIMAGE_ARGS) $(INTERNAL_MKBOOTIMG_VERSION_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $(1).unsigned, \ + $(hide) $(MKBOOTIMG) $(INTERNAL_RECOVERYIMAGE_ARGS) $(INTERNAL_MKBOOTIMG_VERSION_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $(1) --id > $(RECOVERYIMAGE_ID_FILE)) + $(if $(filter true,$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_BOOT_SIGNER)),\ + $(if $(filter true,$(BOARD_USES_RECOVERY_AS_BOOT)),\ + $(BOOT_SIGNER) /boot $(1) $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VERITY_SIGNING_KEY).pk8 $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VERITY_SIGNING_KEY).x509.pem $(1),\ + $(BOOT_SIGNER) /recovery $(1) $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VERITY_SIGNING_KEY).pk8 $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VERITY_SIGNING_KEY).x509.pem $(1)\ + )\ + ) + $(if $(filter true,$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VBOOT)), \ + $(VBOOT_SIGNER) $(FUTILITY) $(1).unsigned $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VBOOT_SIGNING_KEY).vbpubk $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VBOOT_SIGNING_KEY).vbprivk $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VBOOT_SIGNING_SUBKEY).vbprivk $(1).keyblock $(1)) + $(if $(filter true,$(BOARD_USES_RECOVERY_AS_BOOT)), \ + $(hide) $(call assert-max-image-size,$(1),$(BOARD_BOOTIMAGE_PARTITION_SIZE)), \ + $(hide) $(call assert-max-image-size,$(1),$(BOARD_RECOVERYIMAGE_PARTITION_SIZE))) + @echo ----- Made recovery image: $(1) -------- +endef + +ifeq ($(BOARD_USES_RECOVERY_AS_BOOT),true) +ifeq (true,$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_BOOT_SIGNER)) +$(INSTALLED_BOOTIMAGE_TARGET) : $(BOOT_SIGNER) +endif +ifeq (true,$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VBOOT)) +$(INSTALLED_BOOTIMAGE_TARGET) : $(VBOOT_SIGNER) +endif +$(INSTALLED_BOOTIMAGE_TARGET): $(MKBOOTFS) $(MKBOOTIMG) $(MINIGZIP) \ $(INSTALLED_RAMDISK_TARGET) \ - $(INSTALLED_BOOTIMAGE_TARGET) \ - $(recovery_binary) \ + $(INTERNAL_RECOVERYIMAGE_FILES) \ $(recovery_initrc) $(recovery_sepolicy) $(recovery_kernel) \ $(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) - $(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... - $(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_resources_private), \ - 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 - $(hide) cat $(INSTALLED_DEFAULT_PROP_TARGET) $(recovery_build_prop) \ - > $(TARGET_RECOVERY_ROOT_OUT)/default.prop - $(hide) $(MKBOOTFS) $(TARGET_RECOVERY_ROOT_OUT) | $(MINIGZIP) > $(recovery_ramdisk) - $(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 $@ + $(call pretty,"Target boot image from recovery: $@") + $(call build-recoveryramdisk) + $(hide) $(MKBOOTFS) $(TARGET_RECOVERY_ROOT_OUT) > $(recovery_uncompressed_ramdisk) + $(hide) $(RECOVERY_RAMDISK_COMPRESSOR) < $(recovery_uncompressed_ramdisk) > $(recovery_ramdisk) + $(call build-recoveryimage-target, $@) endif - $(hide) $(call assert-max-image-size,$@,$(BOARD_RECOVERYIMAGE_PARTITION_SIZE)) - @echo ----- Made recovery image: $@ -------- -$(RECOVERY_RESOURCE_ZIP): $(INSTALLED_RECOVERYIMAGE_TARGET) - $(hide) mkdir -p $(dir $@) - $(hide) find $(TARGET_RECOVERY_ROOT_OUT)/res -type f | sort | zip -0qrj $@ -@ +$(recovery_uncompressed_ramdisk): $(MKBOOTFS) \ + $(INSTALLED_RAMDISK_TARGET) \ + $(INSTALLED_BOOTIMAGE_TARGET) \ + $(INTERNAL_RECOVERYIMAGE_FILES) \ + $(recovery_initrc) $(recovery_sepolicy) \ + $(INSTALLED_2NDBOOTLOADER_TARGET) \ + $(recovery_build_prop) $(recovery_resource_deps) $(recovery_root_deps) \ + $(recovery_fstab) \ + $(RECOVERY_INSTALL_OTA_KEYS) + $(call build-recoveryramdisk) + @echo "----- Making uncompressed recovery ramdisk ------" + $(hide) $(MKBOOTFS) $(TARGET_RECOVERY_ROOT_OUT) > $@ + +$(recovery_ramdisk): $(MINIGZIP) \ + $(recovery_uncompressed_ramdisk) + @echo "----- Making compressed recovery ramdisk ------" + $(hide) $(RECOVERY_RAMDISK_COMPRESSOR) < $(recovery_uncompressed_ramdisk) > $@ + +ifndef BOARD_CUSTOM_BOOTIMG_MK +$(INSTALLED_RECOVERYIMAGE_TARGET): $(MKBOOTIMG) $(recovery_ramdisk) $(recovery_kernel) \ + $(RECOVERYIMAGE_EXTRA_DEPS) + @echo "----- Making recovery image ------" + $(call build-recoveryimage-target, $@) +endif # BOARD_CUSTOM_BOOTIMG_MK +# The system partition needs room for the recovery image as well. We +# now store the recovery image as a binary patch using the boot image +# as the source (since they are very similar). Generate the patch so +# we can see how big it's going to be, and include that in the system +# 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 -INSTALLED_RECOVERYIMAGE_TARGET := +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" + 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 + +ifdef RECOVERY_RESOURCE_ZIP +$(RECOVERY_RESOURCE_ZIP): $(INSTALLED_RECOVERYIMAGE_TARGET) | $(ZIPTIME) + $(hide) mkdir -p $(dir $@) + $(hide) find $(TARGET_RECOVERY_ROOT_OUT)/res -type f | sort | zip -0qrjX $@ -@ + $(remove-timestamps-from-package) +endif + +.PHONY: recoveryimage-nodeps +recoveryimage-nodeps: + @echo "make $@: ignoring dependencies" + $(call build-recoveryramdisk) + $(hide) $(MKBOOTFS) $(TARGET_RECOVERY_ROOT_OUT) > $(recovery_uncompressed_ramdisk) + $(hide) $(RECOVERY_RAMDISK_COMPRESSOR) < $(recovery_uncompressed_ramdisk) > $(recovery_ramdisk) + $(call build-recoveryimage-target, $(INSTALLED_RECOVERYIMAGE_TARGET)) + +else # INSTALLED_RECOVERYIMAGE_TARGET not defined RECOVERY_RESOURCE_ZIP := endif @@ -899,6 +1214,11 @@ else BOARD_NAND_SPARE_SIZE := 64 endif +ifdef BOARD_CUSTOM_BOOTIMG_MK +include $(BOARD_CUSTOM_BOOTIMG_MK) +endif + + # ----------------------------------------------------------------- # system image # @@ -909,12 +1229,12 @@ PDK_FUSION_SYSIMG_FILES := \ INTERNAL_SYSTEMIMAGE_FILES := $(filter $(TARGET_OUT)/%, \ $(ALL_PREBUILT) \ - $(ALL_COPIED_HEADERS) \ $(ALL_GENERATED_SOURCES) \ $(ALL_DEFAULT_INSTALLED_MODULES) \ $(PDK_FUSION_SYSIMG_FILES) \ $(RECOVERY_RESOURCE_ZIP)) + FULL_SYSTEMIMAGE_DEPS := $(INTERNAL_SYSTEMIMAGE_FILES) $(INTERNAL_USERIMAGES_DEPS) # ----------------------------------------------------------------- # installed file list @@ -927,7 +1247,8 @@ $(INSTALLED_FILES_FILE): $(FULL_SYSTEMIMAGE_DEPS) @echo Installed file list: $@ @mkdir -p $(dir $@) @rm -f $@ - $(hide) build/tools/fileslist.py $(TARGET_OUT) > $@ + $(hide) build/tools/fileslist.py $(TARGET_OUT) > $(@:.txt=.json) + $(hide) build/tools/fileslist_util.py -c $(@:.txt=.json) > $@ .PHONY: installed-file-list installed-file-list: $(INSTALLED_FILES_FILE) @@ -939,7 +1260,7 @@ systemimage_intermediates := \ BUILT_SYSTEMIMAGE := $(systemimage_intermediates)/system.img # Create symlink /system/vendor to /vendor if necessary. -ifdef BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE +ifdef BOARD_USES_VENDORIMAGE define create-system-vendor-symlink $(hide) if [ -d $(TARGET_OUT)/vendor ] && [ ! -h $(TARGET_OUT)/vendor ]; then \ echo 'Non-symlink $(TARGET_OUT)/vendor detected!' 1>&2; \ @@ -953,6 +1274,18 @@ define create-system-vendor-symlink endef endif +# Only Create symlink /system/vendor to /vendor if necessary. +ifdef BOARD_NEEDS_VENDORIMAGE_SYMLINK +define create-system-vendor-symlink +$(hide) if [ -d $(TARGET_OUT)/vendor ] && [ ! -h $(TARGET_OUT)/vendor ]; then \ + echo 'Non-symlink $(TARGET_OUT)/vendor detected!' 1>&2; \ + echo 'You cannot install files to $(TARGET_OUT)/vendor while building a separate vendor.img!' 1>&2; \ + exit 1; \ +fi +$(hide) ln -sf /vendor $(TARGET_OUT)/vendor +endef +endif + # $(1): output file define build-systemimage-target @echo "Target system fs image: $(1)" @@ -962,10 +1295,18 @@ define build-systemimage-target skip_fsck=true) $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH \ ./build/tools/releasetools/build_image.py \ - $(TARGET_OUT) $(systemimage_intermediates)/system_image_info.txt $(1) \ + $(TARGET_OUT) $(systemimage_intermediates)/system_image_info.txt $(1) $(TARGET_OUT) \ || ( echo "Out of space? the tree size of $(TARGET_OUT) is (MB): " 1>&2 ;\ du -sm $(TARGET_OUT) 1>&2;\ - echo "The max is $$(( $(BOARD_SYSTEMIMAGE_PARTITION_SIZE) / 1048576 )) MB." 1>&2 ;\ + if [ "$(INTERNAL_USERIMAGES_EXT_VARIANT)" == "ext4" ]; then \ + maxsize=$(BOARD_SYSTEMIMAGE_PARTITION_SIZE); \ + if [ "$(BOARD_HAS_EXT4_RESERVED_BLOCKS)" == "true" ]; then \ + maxsize=$$((maxsize - 4096 * 4096)); \ + fi; \ + echo "The max is $$(( maxsize / 1048576 )) MB." 1>&2 ;\ + else \ + echo "The max is $$(( $(BOARD_SYSTEMIMAGE_PARTITION_SIZE) / 1048576 )) MB." 1>&2 ;\ + fi; \ mkdir -p $(DIST_DIR); cp $(INSTALLED_FILES_FILE) $(DIST_DIR)/installed-files-rescued.txt; \ exit 1 ) endef @@ -973,26 +1314,17 @@ endef $(BUILT_SYSTEMIMAGE): $(FULL_SYSTEMIMAGE_DEPS) $(INSTALLED_FILES_FILE) $(call build-systemimage-target,$@) -INSTALLED_SYSTEMIMAGE := $(PRODUCT_OUT)/system.img -SYSTEMIMAGE_SOURCE_DIR := $(TARGET_OUT) - -# The system partition needs room for the recovery image as well. We -# now store the recovery image as a binary patch using the boot image -# as the source (since they are very similar). Generate the patch so -# we can see how big it's going to be, and include that in the system -# image size check calculation. -ifneq ($(INSTALLED_RECOVERYIMAGE_TARGET),) -intermediates := $(call intermediates-dir-for,PACKAGING,recovery_patch) -RECOVERY_FROM_BOOT_PATCH := $(intermediates)/recovery_from_boot.p -$(RECOVERY_FROM_BOOT_PATCH): $(INSTALLED_RECOVERYIMAGE_TARGET) \ - $(INSTALLED_BOOTIMAGE_TARGET) \ - $(HOST_OUT_EXECUTABLES)/imgdiff \ - $(HOST_OUT_EXECUTABLES)/bsdiff - @echo "Construct recovery from boot" - mkdir -p $(dir $@) - PATH=$(HOST_OUT_EXECUTABLES):$$PATH $(HOST_OUT_EXECUTABLES)/imgdiff $(INSTALLED_BOOTIMAGE_TARGET) $(INSTALLED_RECOVERYIMAGE_TARGET) $@ +ifndef I_WANT_A_QUAIL_STAR +ifneq ($(WITHOUT_CHECK_API),true) +$(BUILT_SYSTEMIMAGE): checkapi +ifneq ($(TARGET_DISABLE_CMSDK),true) +$(BUILT_SYSTEMIMAGE): checkapi-cm +endif +endif endif +INSTALLED_SYSTEMIMAGE := $(PRODUCT_OUT)/system.img +SYSTEMIMAGE_SOURCE_DIR := $(TARGET_OUT) $(INSTALLED_SYSTEMIMAGE): $(BUILT_SYSTEMIMAGE) $(RECOVERY_FROM_BOOT_PATCH) | $(ACP) @echo "Install system fs image: $@" @@ -1021,7 +1353,7 @@ define build-systemtarball-target $(call create-system-vendor-symlink) $(MKTARBALL) $(FS_GET_STATS) \ $(PRODUCT_OUT) system $(PRIVATE_SYSTEM_TAR) \ - $(INSTALLED_SYSTEMTARBALL_TARGET) + $(INSTALLED_SYSTEMTARBALL_TARGET) $(TARGET_OUT) endef ifndef SYSTEM_TARBALL_FORMAT @@ -1042,32 +1374,72 @@ systemtarball-nodeps: $(FS_GET_STATS) \ .PHONY: stnod stnod: systemtarball-nodeps -####### +# ----------------------------------------------------------------- ## platform.zip: system, plus other files to be used in PDK fusion build, ## in a zip file ## ## PDK_PLATFORM_ZIP_PRODUCT_BINARIES is used to store specified files to platform.zip. ## The variable will be typically set from BoardConfig.mk. ## Files under out dir will be rejected to prevent possible conflicts with other rules. +pdk_odex_javalibs := $(strip $(foreach m,$(DEXPREOPT.MODULES.JAVA_LIBRARIES),\ + $(if $(filter $(DEXPREOPT.$(m).INSTALLED),$(ALL_DEFAULT_INSTALLED_MODULES)),$(m)))) +pdk_odex_apps := $(strip $(foreach m,$(DEXPREOPT.MODULES.APPS),\ + $(if $(filter $(DEXPREOPT.$(m).INSTALLED),$(ALL_DEFAULT_INSTALLED_MODULES)),$(m)))) +pdk_classes_dex := $(strip \ + $(foreach m,$(pdk_odex_javalibs),$(call intermediates-dir-for,JAVA_LIBRARIES,$(m),,COMMON)/javalib.jar) \ + $(foreach m,$(pdk_odex_apps),$(call intermediates-dir-for,APPS,$(m))/package.dex.apk)) + +pdk_odex_config_mk := $(PRODUCT_OUT)/pdk_dexpreopt_config.mk +$(pdk_odex_config_mk): PRIVATE_JAVA_LIBRARIES := $(pdk_odex_javalibs) +$(pdk_odex_config_mk): PRIVATE_APPS := $(pdk_odex_apps) +$(pdk_odex_config_mk) : + @echo "PDK odex config makefile: $@" + $(hide) mkdir -p $(dir $@) + $(hide) echo "# Auto-generated. Do not modify." > $@ + $(hide) echo "PDK.DEXPREOPT.JAVA_LIBRARIES:=$(PRIVATE_JAVA_LIBRARIES)" >> $@ + $(hide) echo "PDK.DEXPREOPT.APPS:=$(PRIVATE_APPS)" >> $@ + $(foreach m,$(PRIVATE_JAVA_LIBRARIES),\ + $(hide) echo "PDK.DEXPREOPT.$(m).SRC:=$(patsubst $(OUT_DIR)/%,%,$(call intermediates-dir-for,JAVA_LIBRARIES,$(m),,COMMON)/javalib.jar)" >> $@$(newline)\ + $(hide) echo "PDK.DEXPREOPT.$(m).DEX_PREOPT:=$(DEXPREOPT.$(m).DEX_PREOPT)" >> $@$(newline)\ + $(hide) echo "PDK.DEXPREOPT.$(m).MULTILIB:=$(DEXPREOPT.$(m).MULTILIB)" >> $@$(newline)\ + $(hide) echo "PDK.DEXPREOPT.$(m).DEX_PREOPT_FLAGS:=$(DEXPREOPT.$(m).DEX_PREOPT_FLAGS)" >> $@$(newline)\ + ) + $(foreach m,$(PRIVATE_APPS),\ + $(hide) echo "PDK.DEXPREOPT.$(m).SRC:=$(patsubst $(OUT_DIR)/%,%,$(call intermediates-dir-for,APPS,$(m))/package.dex.apk)" >> $@$(newline)\ + $(hide) echo "PDK.DEXPREOPT.$(m).DEX_PREOPT:=$(DEXPREOPT.$(m).DEX_PREOPT)" >> $@$(newline)\ + $(hide) echo "PDK.DEXPREOPT.$(m).MULTILIB:=$(DEXPREOPT.$(m).MULTILIB)" >> $@$(newline)\ + $(hide) echo "PDK.DEXPREOPT.$(m).DEX_PREOPT_FLAGS:=$(DEXPREOPT.$(m).DEX_PREOPT_FLAGS)" >> $@$(newline)\ + $(hide) echo "PDK.DEXPREOPT.$(m).PRIVILEGED_MODULE:=$(DEXPREOPT.$(m).PRIVILEGED_MODULE)" >> $@$(newline)\ + $(hide) echo "PDK.DEXPREOPT.$(m).PROPRIETARY_MODULE:=$(DEXPREOPT.$(m).PROPRIETARY_MODULE)" >> $@$(newline)\ + $(hide) echo "PDK.DEXPREOPT.$(m).TARGET_ARCH:=$(DEXPREOPT.$(m).TARGET_ARCH)" >> $@$(newline)\ + $(hide) echo "PDK.DEXPREOPT.$(m).STRIPPED_SRC:=$(patsubst $(PRODUCT_OUT)/%,%,$(DEXPREOPT.$(m).INSTALLED_STRIPPED))" >> $@$(newline)\ + ) + PDK_PLATFORM_ZIP_PRODUCT_BINARIES := $(filter-out $(OUT_DIR)/%,$(PDK_PLATFORM_ZIP_PRODUCT_BINARIES)) INSTALLED_PLATFORM_ZIP := $(PRODUCT_OUT)/platform.zip -$(INSTALLED_PLATFORM_ZIP) : $(INTERNAL_SYSTEMIMAGE_FILES) + +$(INSTALLED_PLATFORM_ZIP): PRIVATE_DEX_FILES := $(pdk_classes_dex) +$(INSTALLED_PLATFORM_ZIP): PRIVATE_ODEX_CONFIG := $(pdk_odex_config_mk) +$(INSTALLED_PLATFORM_ZIP) : $(INTERNAL_SYSTEMIMAGE_FILES) $(pdk_odex_config_mk) $(call pretty,"Platform zip package: $(INSTALLED_PLATFORM_ZIP)") $(hide) rm -f $@ - $(hide) cd $(dir $@) && zip -qry $(notdir $@) \ + $(hide) cd $(dir $@) && zip -qryX $(notdir $@) \ $(TARGET_COPY_OUT_SYSTEM) \ $(patsubst $(PRODUCT_OUT)/%, %, $(TARGET_OUT_NOTICE_FILES)) \ $(addprefix symbols/,$(PDK_SYMBOL_FILES_LIST)) ifdef BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE - $(hide) cd $(dir $@) && zip -qry $(notdir $@) \ + $(hide) cd $(dir $@) && zip -qryX $(notdir $@) \ $(TARGET_COPY_OUT_VENDOR) endif ifneq ($(PDK_PLATFORM_JAVA_ZIP_CONTENTS),) - $(hide) cd $(OUT_DIR) && zip -qry $(patsubst $(OUT_DIR)/%,%,$@) $(PDK_PLATFORM_JAVA_ZIP_CONTENTS) + $(hide) cd $(OUT_DIR) && zip -qryX $(patsubst $(OUT_DIR)/%,%,$@) $(PDK_PLATFORM_JAVA_ZIP_CONTENTS) endif ifneq ($(PDK_PLATFORM_ZIP_PRODUCT_BINARIES),) - $(hide) zip -qry $@ $(PDK_PLATFORM_ZIP_PRODUCT_BINARIES) + $(hide) zip -qryX $@ $(PDK_PLATFORM_ZIP_PRODUCT_BINARIES) endif + @# Add dex-preopt files and config. + $(if $(PRIVATE_DEX_FILES),$(hide) cd $(OUT_DIR) && zip -qryX $(patsubst $(OUT_DIR)/%,%,$@ $(PRIVATE_DEX_FILES))) + $(hide) zip -qryXj $@ $(PRIVATE_ODEX_CONFIG) .PHONY: platform platform: $(INSTALLED_PLATFORM_ZIP) @@ -1080,7 +1452,7 @@ ifneq (,$(filter platform platform-java, $(MAKECMDGOALS))) $(call dist-for-goals, platform platform-java, $(INSTALLED_PLATFORM_ZIP)) endif -####### +# ----------------------------------------------------------------- ## boot tarball define build-boottarball-target $(hide) echo "Target boot fs tarball: $(INSTALLED_BOOTTARBALL_TARGET)" @@ -1089,7 +1461,7 @@ define build-boottarball-target $(hide) echo $(BOARD_KERNEL_CMDLINE) > $(PRODUCT_OUT)/boot/cmdline $(hide) $(MKTARBALL) $(FS_GET_STATS) \ $(PRODUCT_OUT) boot $(PRIVATE_BOOT_TAR) \ - $(INSTALLED_BOOTTARBALL_TARGET) + $(INSTALLED_BOOTTARBALL_TARGET) $(TARGET_OUT) endef ifndef BOOT_TARBALL_FORMAT @@ -1133,7 +1505,7 @@ define build-userdataimage-target $(call generate-userimage-prop-dictionary, $(userdataimage_intermediates)/userdata_image_info.txt, skip_fsck=true) $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH \ ./build/tools/releasetools/build_image.py \ - $(TARGET_OUT_DATA) $(userdataimage_intermediates)/userdata_image_info.txt $(INSTALLED_USERDATAIMAGE_TARGET) + $(TARGET_OUT_DATA) $(userdataimage_intermediates)/userdata_image_info.txt $(INSTALLED_USERDATAIMAGE_TARGET) $(TARGET_OUT) $(hide) $(call assert-max-image-size,$(INSTALLED_USERDATAIMAGE_TARGET),$(BOARD_USERDATAIMAGE_PARTITION_SIZE)) endef @@ -1157,7 +1529,7 @@ define build-userdatatarball-target "$(INSTALLED_USERDATATARBALL_TARGET)") $(MKTARBALL) $(FS_GET_STATS) \ $(PRODUCT_OUT) data $(PRIVATE_USERDATA_TAR) \ - $(INSTALLED_USERDATATARBALL_TARGET) + $(INSTALLED_USERDATATARBALL_TARGET) $(TARGET_OUT) endef userdata_tar := $(PRODUCT_OUT)/userdata.tar @@ -1166,6 +1538,8 @@ $(INSTALLED_USERDATATARBALL_TARGET): PRIVATE_USERDATA_TAR := $(userdata_tar) $(INSTALLED_USERDATATARBALL_TARGET): $(FS_GET_STATS) $(INTERNAL_USERDATAIMAGE_FILES) $(build-userdatatarball-target) +$(call dist-for-goals,userdatatarball,$(INSTALLED_USERDATATARBALL_TARGET)) + .PHONY: userdatatarball-nodeps userdatatarball-nodeps: $(FS_GET_STATS) $(build-userdatatarball-target) @@ -1188,7 +1562,7 @@ define build-cacheimage-target $(call generate-userimage-prop-dictionary, $(cacheimage_intermediates)/cache_image_info.txt, skip_fsck=true) $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH \ ./build/tools/releasetools/build_image.py \ - $(TARGET_OUT_CACHE) $(cacheimage_intermediates)/cache_image_info.txt $(INSTALLED_CACHEIMAGE_TARGET) + $(TARGET_OUT_CACHE) $(cacheimage_intermediates)/cache_image_info.txt $(INSTALLED_CACHEIMAGE_TARGET) $(TARGET_OUT) $(hide) $(call assert-max-image-size,$(INSTALLED_CACHEIMAGE_TARGET),$(BOARD_CACHEIMAGE_PARTITION_SIZE)) endef @@ -1201,9 +1575,65 @@ $(INSTALLED_CACHEIMAGE_TARGET): $(INTERNAL_USERIMAGES_DEPS) $(INTERNAL_CACHEIMAG cacheimage-nodeps: | $(INTERNAL_USERIMAGES_DEPS) $(build-cacheimage-target) +else # BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE +# we need to ignore the broken cache link when doing the rsync +IGNORE_CACHE_LINK := --exclude=cache endif # BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE +# ----------------------------------------------------------------- +# system_other partition image +ifeq ($(BOARD_USES_SYSTEM_OTHER_ODEX),true) +BOARD_USES_SYSTEM_OTHER := true + +# Marker file to identify that odex files are installed +INSTALLED_SYSTEM_OTHER_ODEX_MARKER := $(TARGET_OUT_SYSTEM_OTHER)/system-other-odex-marker +ALL_DEFAULT_INSTALLED_MODULES += $(INSTALLED_SYSTEM_OTHER_ODEX_MARKER) +$(INSTALLED_SYSTEM_OTHER_ODEX_MARKER): + $(hide) touch $@ +endif + +ifdef BOARD_USES_SYSTEM_OTHER +INTERNAL_SYSTEMOTHERIMAGE_FILES := \ + $(filter $(TARGET_OUT_SYSTEM_OTHER)/%,\ + $(ALL_DEFAULT_INSTALLED_MODULES)\ + $(ALL_PDK_FUSION_FILES)) + +INSTALLED_FILES_FILE_SYSTEMOTHER := $(PRODUCT_OUT)/installed-files-system-other.txt +$(INSTALLED_FILES_FILE_SYSTEMOTHER) : $(INTERNAL_SYSTEMOTHERIMAGE_FILES) + @echo Installed file list: $@ + @mkdir -p $(dir $@) + @rm -f $@ + $(hide) build/tools/fileslist.py $(TARGET_OUT_SYSTEM_OTHER) > $@ + +systemotherimage_intermediates := \ + $(call intermediates-dir-for,PACKAGING,system_other) +BUILT_SYSTEMOTHERIMAGE_TARGET := $(PRODUCT_OUT)/system_other.img + +# Note that we assert the size is SYSTEMIMAGE_PARTITION_SIZE since this is the 'b' system image. +define build-systemotherimage-target + $(call pretty,"Target system_other fs image: $(INSTALLED_SYSTEMOTHERIMAGE_TARGET)") + @mkdir -p $(TARGET_OUT_SYSTEM_OTHER) + @mkdir -p $(systemotherimage_intermediates) && rm -rf $(systemotherimage_intermediates)/system_other_image_info.txt + $(call generate-userimage-prop-dictionary, $(systemotherimage_intermediates)/system_other_image_info.txt, skip_fsck=true) + $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH \ + ./build/tools/releasetools/build_image.py \ + $(TARGET_OUT_SYSTEM_OTHER) $(systemotherimage_intermediates)/system_other_image_info.txt $(INSTALLED_SYSTEMOTHERIMAGE_TARGET) $(TARGET_OUT) + $(hide) $(call assert-max-image-size,$(INSTALLED_SYSTEMOTHERIMAGE_TARGET),$(BOARD_SYSTEMIMAGE_PARTITION_SIZE)) +endef + +# We just build this directly to the install location. +INSTALLED_SYSTEMOTHERIMAGE_TARGET := $(BUILT_SYSTEMOTHERIMAGE_TARGET) +$(INSTALLED_SYSTEMOTHERIMAGE_TARGET): $(INTERNAL_USERIMAGES_DEPS) $(INTERNAL_SYSTEMOTHERIMAGE_FILES) $(INSTALLED_FILES_FILE_SYSTEMOTHER) + $(build-systemotherimage-target) + +.PHONY: systemotherimage-nodeps +systemotherimage-nodeps: | $(INTERNAL_USERIMAGES_DEPS) + $(build-systemotherimage-target) + +endif # BOARD_USES_SYSTEM_OTHER + + # ----------------------------------------------------------------- # vendor partition image ifdef BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE @@ -1215,6 +1645,14 @@ INTERNAL_VENDORIMAGE_FILES := \ # platform.zip depends on $(INTERNAL_VENDORIMAGE_FILES). $(INSTALLED_PLATFORM_ZIP) : $(INTERNAL_VENDORIMAGE_FILES) +INSTALLED_FILES_FILE_VENDOR := $(PRODUCT_OUT)/installed-files-vendor.txt +$(INSTALLED_FILES_FILE_VENDOR) : $(INTERNAL_VENDORIMAGE_FILES) + @echo Installed file list: $@ + @mkdir -p $(dir $@) + @rm -f $@ + $(hide) build/tools/fileslist.py $(TARGET_OUT_VENDOR) > $(@:.txt=.json) + $(hide) build/tools/fileslist_util.py -c $(@:.txt=.json) > $@ + vendorimage_intermediates := \ $(call intermediates-dir-for,PACKAGING,vendor) BUILT_VENDORIMAGE_TARGET := $(PRODUCT_OUT)/vendor.img @@ -1226,20 +1664,23 @@ define build-vendorimage-target $(call generate-userimage-prop-dictionary, $(vendorimage_intermediates)/vendor_image_info.txt, skip_fsck=true) $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH \ ./build/tools/releasetools/build_image.py \ - $(TARGET_OUT_VENDOR) $(vendorimage_intermediates)/vendor_image_info.txt $(INSTALLED_VENDORIMAGE_TARGET) + $(TARGET_OUT_VENDOR) $(vendorimage_intermediates)/vendor_image_info.txt $(INSTALLED_VENDORIMAGE_TARGET) $(TARGET_OUT) $(hide) $(call assert-max-image-size,$(INSTALLED_VENDORIMAGE_TARGET),$(BOARD_VENDORIMAGE_PARTITION_SIZE)) endef # We just build this directly to the install location. INSTALLED_VENDORIMAGE_TARGET := $(BUILT_VENDORIMAGE_TARGET) -$(INSTALLED_VENDORIMAGE_TARGET): $(INTERNAL_USERIMAGES_DEPS) $(INTERNAL_VENDORIMAGE_FILES) +$(INSTALLED_VENDORIMAGE_TARGET): $(INTERNAL_USERIMAGES_DEPS) $(INTERNAL_VENDORIMAGE_FILES) $(INSTALLED_FILES_FILE_VENDOR) $(build-vendorimage-target) .PHONY: vendorimage-nodeps vendorimage-nodeps: | $(INTERNAL_USERIMAGES_DEPS) $(build-vendorimage-target) -endif # BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE +else ifdef BOARD_PREBUILT_VENDORIMAGE +INSTALLED_VENDORIMAGE_TARGET := $(PRODUCT_OUT)/vendor.img +$(eval $(call copy-one-file,$(BOARD_PREBUILT_VENDORIMAGE),$(INSTALLED_VENDORIMAGE_TARGET))) +endif # ----------------------------------------------------------------- # bring in the installer image generation defines if necessary @@ -1250,31 +1691,121 @@ endif # ----------------------------------------------------------------- # host tools needed to build dist and OTA packages -DISTTOOLS := $(HOST_OUT_EXECUTABLES)/minigzip \ - $(HOST_OUT_EXECUTABLES)/mkbootfs \ - $(HOST_OUT_EXECUTABLES)/mkbootimg \ - $(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)/make_ext4fs \ - $(HOST_OUT_EXECUTABLES)/simg2img \ - $(HOST_OUT_EXECUTABLES)/e2fsck \ - $(HOST_OUT_EXECUTABLES)/build_verity_tree \ - $(HOST_OUT_EXECUTABLES)/verity_signer \ - $(HOST_OUT_EXECUTABLES)/append2simg \ - $(HOST_OUT_EXECUTABLES)/boot_signer - -OTATOOLS := $(DISTTOOLS) \ - $(HOST_OUT_EXECUTABLES)/aapt +build_ota_package := true +ifeq ($(TARGET_SKIP_OTA_PACKAGE),true) +build_ota_package := false +endif +ifneq ($(strip $(SANITIZE_TARGET)),) +build_ota_package := false +endif +ifeq ($(TARGET_PRODUCT),sdk) +build_ota_package := false +endif +ifneq ($(filter generic%,$(TARGET_DEVICE)),) +build_ota_package := false +endif +ifeq ($(TARGET_NO_KERNEL),true) +build_ota_package := false +endif +ifeq ($(recovery_fstab),) +build_ota_package := false +endif +ifeq ($(TARGET_BUILD_PDK),true) +build_ota_package := false +endif + +ifeq ($(build_ota_package),true) +OTATOOLS := $(HOST_OUT_EXECUTABLES)/minigzip \ + $(HOST_OUT_EXECUTABLES)/aapt \ + $(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_JAVA_LIBRARIES)/BootSignature.jar \ + $(HOST_OUT_EXECUTABLES)/mkuserimg.sh \ + $(HOST_OUT_EXECUTABLES)/make_ext4fs \ + $(HOST_OUT_EXECUTABLES)/mksquashfsimage.sh \ + $(HOST_OUT_EXECUTABLES)/mksquashfs \ + $(HOST_OUT_EXECUTABLES)/mkf2fsuserimg.sh \ + $(HOST_OUT_EXECUTABLES)/make_f2fs \ + $(HOST_OUT_EXECUTABLES)/simg2img \ + $(HOST_OUT_EXECUTABLES)/e2fsck \ + $(HOST_OUT_EXECUTABLES)/build_verity_tree \ + $(HOST_OUT_EXECUTABLES)/verity_signer \ + $(HOST_OUT_EXECUTABLES)/verity_verifier \ + $(HOST_OUT_EXECUTABLES)/append2simg \ + $(HOST_OUT_EXECUTABLES)/img2simg \ + $(HOST_OUT_EXECUTABLES)/boot_signer \ + $(HOST_OUT_EXECUTABLES)/fec \ + $(HOST_OUT_EXECUTABLES)/brillo_update_payload \ + $(HOST_OUT_EXECUTABLES)/lib/shflags/shflags \ + $(HOST_OUT_EXECUTABLES)/delta_generator \ + $(BLK_ALLOC_TO_BASE_FS) \ + $(FUTILITY) \ + $(VBOOT_SIGNER) + +# Shared libraries. +OTATOOLS += \ + $(HOST_LIBRARY_PATH)/libc++$(HOST_SHLIB_SUFFIX) \ + $(HOST_LIBRARY_PATH)/liblog$(HOST_SHLIB_SUFFIX) \ + $(HOST_LIBRARY_PATH)/libcutils$(HOST_SHLIB_SUFFIX) \ + $(HOST_LIBRARY_PATH)/libselinux$(HOST_SHLIB_SUFFIX) \ + $(HOST_LIBRARY_PATH)/libcrypto-host$(HOST_SHLIB_SUFFIX) \ + $(HOST_LIBRARY_PATH)/libdivsufsort$(HOST_SHLIB_SUFFIX) \ + $(HOST_LIBRARY_PATH)/libdivsufsort64$(HOST_SHLIB_SUFFIX) \ + $(HOST_LIBRARY_PATH)/libext2fs-host$(HOST_SHLIB_SUFFIX) \ + $(HOST_LIBRARY_PATH)/libext2_blkid-host$(HOST_SHLIB_SUFFIX) \ + $(HOST_LIBRARY_PATH)/libext2_com_err-host$(HOST_SHLIB_SUFFIX) \ + $(HOST_LIBRARY_PATH)/libext2_e2p-host$(HOST_SHLIB_SUFFIX) \ + $(HOST_LIBRARY_PATH)/libext2_profile-host$(HOST_SHLIB_SUFFIX) \ + $(HOST_LIBRARY_PATH)/libext2_quota-host$(HOST_SHLIB_SUFFIX) \ + $(HOST_LIBRARY_PATH)/libext2_uuid-host$(HOST_SHLIB_SUFFIX) \ + $(HOST_LIBRARY_PATH)/libf2fs_fmt_host_dyn$(HOST_SHLIB_SUFFIX) \ + $(HOST_LIBRARY_PATH)/libconscrypt_openjdk_jni$(HOST_SHLIB_SUFFIX) \ + $(HOST_LIBRARY_PATH)/libbrillo$(HOST_SHLIB_SUFFIX) \ + $(HOST_LIBRARY_PATH)/libbrillo-stream$(HOST_SHLIB_SUFFIX) \ + $(HOST_LIBRARY_PATH)/libbrillo-http$(HOST_SHLIB_SUFFIX) \ + $(HOST_LIBRARY_PATH)/libchrome$(HOST_SHLIB_SUFFIX) \ + $(HOST_LIBRARY_PATH)/libcurl-host$(HOST_SHLIB_SUFFIX) \ + $(HOST_LIBRARY_PATH)/libevent-host$(HOST_SHLIB_SUFFIX) \ + $(HOST_LIBRARY_PATH)/libprotobuf-cpp-lite$(HOST_SHLIB_SUFFIX) \ + $(HOST_LIBRARY_PATH)/libssl-host$(HOST_SHLIB_SUFFIX) \ + $(HOST_LIBRARY_PATH)/libz-host$(HOST_SHLIB_SUFFIX) \ + $(HOST_LIBRARY_PATH)/libbase$(HOST_SHLIB_SUFFIX) .PHONY: otatools otatools: $(OTATOOLS) +BUILT_OTATOOLS_PACKAGE := $(PRODUCT_OUT)/otatools.zip +$(BUILT_OTATOOLS_PACKAGE): zip_root := $(call intermediates-dir-for,PACKAGING,otatools)/otatools + +$(BUILT_OTATOOLS_PACKAGE): $(OTATOOLS) | $(ACP) + @echo "Package OTA tools: $@" + $(hide) rm -rf $@ $(zip_root) + $(hide) mkdir -p $(dir $@) $(zip_root)/bin $(zip_root)/framework $(zip_root)/releasetools $(zip_root)/system/extras/verity $(zip_root)/external/vboot_reference/tests/devkeys $(zip_root)/vendor/cm/build/tools + $(call copy-files-with-structure,$(OTATOOLS),$(HOST_OUT)/,$(zip_root)) + $(hide) $(ACP) $(HOST_OUT_JAVA_LIBRARIES)/VeritySigner.jar $(zip_root)/framework/ + $(hide) $(ACP) -p system/extras/verity/build_verity_metadata.py $(zip_root)/system/extras/verity/ + $(hide) $(ACP) -p -r external/vboot_reference/tests/devkeys/* $(zip_root)/external/vboot_reference/tests/devkeys + $(hide) $(ACP) -r -d -p build/tools/releasetools/* $(zip_root)/releasetools + $(hide) $(ACP) -p vendor/cm/build/tools/getb64key.py $(zip_root)/vendor/cm/build/tools/ + $(hide) rm -rf $@ $(zip_root)/releasetools/*.pyc + $(hide) (cd $(zip_root) && zip -qryX $(abspath $@) *) + $(hide) zip -qryX $(abspath $@) build/target/product/security/ + $(hide) find device vendor -name \*.pk8 -o -name verifiedboot\* -o -name \*.x509.pem -o -name oem\*.prop | xargs zip -qryX $(abspath $@)>/dev/null || true + +.PHONY: otatools-package +otatools-package: $(BUILT_OTATOOLS_PACKAGE) + +endif # build_ota_package + # ----------------------------------------------------------------- # A zip of the directories that map to the target filesystem. # This zip can be used to create an OTA package or filesystem image @@ -1302,12 +1833,14 @@ define package_files-copy-root fi endef -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 +built_ota_tools := + +# We can't build static executables when SANITIZE_TARGET=address +ifeq ($(strip $(SANITIZE_TARGET)),) +built_ota_tools += \ + $(call intermediates-dir-for,EXECUTABLES,updater,,,$(TARGET_PREFER_32_BIT))/updater +endif + $(BUILT_TARGET_FILES_PACKAGE): PRIVATE_OTA_TOOLS := $(built_ota_tools) $(BUILT_TARGET_FILES_PACKAGE): PRIVATE_RECOVERY_API_VERSION := $(RECOVERY_API_VERSION) @@ -1320,8 +1853,36 @@ else $(BUILT_TARGET_FILES_PACKAGE): tool_extensions := $(TARGET_RELEASETOOLS_EXTENSIONS) endif +# Build OTA tools if not using the AB Updater. +ifneq ($(AB_OTA_UPDATER),true) +$(BUILT_TARGET_FILES_PACKAGE): $(built_ota_tools) +endif + +# If we are using recovery as boot, output recovery files to BOOT/. +ifeq ($(BOARD_USES_RECOVERY_AS_BOOT),true) +$(BUILT_TARGET_FILES_PACKAGE): PRIVATE_RECOVERY_OUT := BOOT +else +$(BUILT_TARGET_FILES_PACKAGE): PRIVATE_RECOVERY_OUT := RECOVERY +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_RADIOIMAGE_TARGET) \ @@ -1330,39 +1891,64 @@ $(BUILT_TARGET_FILES_PACKAGE): \ $(INSTALLED_USERDATAIMAGE_TARGET) \ $(INSTALLED_CACHEIMAGE_TARGET) \ $(INSTALLED_VENDORIMAGE_TARGET) \ + $(INSTALLED_SYSTEMOTHERIMAGE_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: $@" $(hide) rm -rf $@ $(zip_root) $(hide) mkdir -p $(dir $@) $(zip_root) +ifneq (,$(INSTALLED_RECOVERYIMAGE_TARGET)$(filter true,$(BOARD_USES_RECOVERY_AS_BOOT))) @# Components of the recovery image - $(hide) mkdir -p $(zip_root)/RECOVERY + $(hide) mkdir -p $(zip_root)/$(PRIVATE_RECOVERY_OUT) $(hide) $(call package_files-copy-root, \ - $(TARGET_RECOVERY_ROOT_OUT),$(zip_root)/RECOVERY/RAMDISK) + $(TARGET_RECOVERY_ROOT_OUT),$(zip_root)/$(PRIVATE_RECOVERY_OUT)/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 + $(hide) $(ACP) $(INSTALLED_KERNEL_TARGET) $(zip_root)/$(PRIVATE_RECOVERY_OUT)/kernel endif ifdef INSTALLED_2NDBOOTLOADER_TARGET $(hide) $(ACP) \ - $(INSTALLED_2NDBOOTLOADER_TARGET) $(zip_root)/RECOVERY/second + $(INSTALLED_2NDBOOTLOADER_TARGET) $(zip_root)/$(PRIVATE_RECOVERY_OUT)/second +endif +ifdef BOARD_KERNEL_TAGS_OFFSET + $(hide) echo "$(BOARD_KERNEL_TAGS_OFFSET)" > $(zip_root)/$(PRIVATE_RECOVERY_OUT)/tags_offset endif ifdef BOARD_KERNEL_CMDLINE - $(hide) echo "$(BOARD_KERNEL_CMDLINE)" > $(zip_root)/RECOVERY/cmdline + $(hide) echo "$(BOARD_KERNEL_CMDLINE)" > $(zip_root)/$(PRIVATE_RECOVERY_OUT)/cmdline endif ifdef BOARD_KERNEL_BASE - $(hide) echo "$(BOARD_KERNEL_BASE)" > $(zip_root)/RECOVERY/base + $(hide) echo "$(BOARD_KERNEL_BASE)" > $(zip_root)/$(PRIVATE_RECOVERY_OUT)/base endif ifdef BOARD_KERNEL_PAGESIZE - $(hide) echo "$(BOARD_KERNEL_PAGESIZE)" > $(zip_root)/RECOVERY/pagesize + $(hide) echo "$(BOARD_KERNEL_PAGESIZE)" > $(zip_root)/$(PRIVATE_RECOVERY_OUT)/pagesize +endif +ifdef BOARD_KERNEL_TAGS_ADDR + $(hide) echo "$(BOARD_KERNEL_TAGS_ADDR)" > $(zip_root)/$(PRIVATE_RECOVERY_OUT)/tagsaddr +endif +ifdef BOARD_RAMDISK_OFFSET + $(hide) echo "$(BOARD_RAMDISK_OFFSET)" > $(zip_root)/$(PRIVATE_RECOVERY_OUT)/ramdisk_offset +endif +ifeq ($(strip $(BOARD_KERNEL_SEPARATED_DT)),true) + $(hide) $(ACP) $(INSTALLED_DTIMAGE_TARGET) $(zip_root)/$(PRIVATE_RECOVERY_OUT)/dt endif +endif # INSTALLED_RECOVERYIMAGE_TARGET defined or BOARD_USES_RECOVERY_AS_BOOT is true @# Components of the boot image $(hide) mkdir -p $(zip_root)/BOOT +ifeq ($(BOARD_BUILD_SYSTEM_ROOT_IMAGE),true) + $(hide) mkdir -p $(zip_root)/ROOT + $(hide) $(call package_files-copy-root, \ + $(TARGET_ROOT_OUT),$(zip_root)/ROOT) +else $(hide) $(call package_files-copy-root, \ $(TARGET_ROOT_OUT),$(zip_root)/BOOT/RAMDISK) +endif + @# If we are using recovery as boot, this is already done when processing recovery. +ifneq ($(BOARD_USES_RECOVERY_AS_BOOT),true) ifdef INSTALLED_KERNEL_TARGET $(hide) $(ACP) $(INSTALLED_KERNEL_TARGET) $(zip_root)/BOOT/kernel endif @@ -1370,6 +1956,9 @@ 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 @@ -1379,30 +1968,69 @@ 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 +endif # BOARD_USES_RECOVERY_AS_BOOT $(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) + @# Prebuilt boot images + $(hide) mkdir -p $(zip_root)/BOOTABLE_IMAGES + $(hide) $(ACP) $(INSTALLED_BOOTIMAGE_TARGET) $(zip_root)/BOOTABLE_IMAGES/ +ifneq ($(BOARD_USES_RECOVERY_AS_BOOT),true) + $(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 INSTALLED_SYSTEMOTHERIMAGE_TARGET + @# Contents of the system_other image + $(hide) $(call package_files-copy-root, \ + $(TARGET_OUT_SYSTEM_OTHER),$(zip_root)/SYSTEM_OTHER) +endif +ifdef BOARD_OEMIMAGE_FILE_SYSTEM_TYPE + @# Contents of the oem image + $(hide) $(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 + $(hide) mkdir -p $(zip_root)/OTA $(hide) $(ACP) $(INSTALLED_ANDROID_INFO_TXT_TARGET) $(zip_root)/OTA/ +ifneq ($(AB_OTA_UPDATER),true) +ifneq ($(built_ota_tools),) + $(hide) mkdir -p $(zip_root)/OTA/bin $(hide) $(ACP) $(PRIVATE_OTA_TOOLS) $(zip_root)/OTA/bin/ +endif +endif @# Files that do not end up in any images, but are necessary to @# build them. $(hide) mkdir -p $(zip_root)/META $(hide) $(ACP) $(APKCERTS_FILE) $(zip_root)/META/apkcerts.txt $(hide) if test -e $(tool_extensions)/releasetools.py; then $(ACP) $(tool_extensions)/releasetools.py $(zip_root)/META/; fi - $(hide) echo "$(PRODUCT_OTA_PUBLIC_KEYS)" > $(zip_root)/META/otakeys.txt + $(hide) echo "$(PRODUCT_OTA_PUBLIC_KEYS)" > $(zip_root)/META/otakeys.txt + $(hide) $(ACP) $(SELINUX_FC) $(zip_root)/META/file_contexts.bin $(hide) echo "recovery_api_version=$(PRIVATE_RECOVERY_API_VERSION)" > $(zip_root)/META/misc_info.txt $(hide) echo "fstab_version=$(PRIVATE_RECOVERY_FSTAB_VERSION)" >> $(zip_root)/META/misc_info.txt ifdef BOARD_FLASH_BLOCK_SIZE @@ -1411,9 +2039,18 @@ endif ifdef BOARD_BOOTIMAGE_PARTITION_SIZE $(hide) echo "boot_size=$(BOARD_BOOTIMAGE_PARTITION_SIZE)" >> $(zip_root)/META/misc_info.txt endif +ifeq ($(BOARD_USES_RECOVERY_AS_BOOT),) + $(hide) echo "recovery_as_boot=$(BOARD_USES_RECOVERY_AS_BOOT)" >> $(zip_root)/META/misc_info.txt +endif +ifeq ($(INSTALLED_RECOVERYIMAGE_TARGET),) + $(hide) echo "no_recovery=true" >> $(zip_root)/META/misc_info.txt +endif ifdef BOARD_RECOVERYIMAGE_PARTITION_SIZE $(hide) echo "recovery_size=$(BOARD_RECOVERYIMAGE_PARTITION_SIZE)" >> $(zip_root)/META/misc_info.txt endif +ifdef BOARD_HAS_EXT4_RESERVED_BLOCKS + $(hide) echo "has_ext4_reserved_blocks=$(BOARD_HAS_EXT4_RESERVED_BLOCKS)" >> $(zip_root)/META/misc_info.txt +endif ifdef TARGET_RECOVERY_FSTYPE_MOUNT_OPTIONS @# TARGET_RECOVERY_FSTYPE_MOUNT_OPTIONS can be empty to indicate that nothing but defaults should be used. $(hide) echo "recovery_mount_options=$(TARGET_RECOVERY_FSTYPE_MOUNT_OPTIONS)" >> $(zip_root)/META/misc_info.txt @@ -1426,26 +2063,105 @@ ifdef PRODUCT_EXTRA_RECOVERY_KEYS $(hide) echo "extra_recovery_keys=$(PRODUCT_EXTRA_RECOVERY_KEYS)" >> $(zip_root)/META/misc_info.txt endif $(hide) echo 'mkbootimg_args=$(BOARD_MKBOOTIMG_ARGS)' >> $(zip_root)/META/misc_info.txt + $(hide) echo 'mkbootimg_version_args=$(INTERNAL_MKBOOTIMG_VERSION_ARGS)' >> $(zip_root)/META/misc_info.txt $(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,4" >> $(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 +ifneq ($(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SYSTEM_BASE_FS_PATH),) + $(hide) $(ACP) $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SYSTEM_BASE_FS_PATH) \ + $(zip_root)/META/$(notdir $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SYSTEM_BASE_FS_PATH)) +endif +ifneq ($(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VENDOR_BASE_FS_PATH),) + $(hide) $(ACP) $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VENDOR_BASE_FS_PATH) \ + $(zip_root)/META/$(notdir $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VENDOR_BASE_FS_PATH)) +endif +ifneq ($(strip $(SANITIZE_TARGET)),) + # We need to create userdata.img with real data because the instrumented libraries are in userdata.img. + $(hide) echo "userdata_img_with_data=true" >> $(zip_root)/META/misc_info.txt +endif +ifeq ($(BOARD_USES_FULL_RECOVERY_IMAGE),true) + $(hide) echo "full_recovery_image=true" >> $(zip_root)/META/misc_info.txt +endif +ifeq ($(TARGET_NOT_USE_GZIP_RECOVERY_RAMDISK),true) + $(hide) echo "no_gzip_recovery_ramdisk=true" >> $(zip_root)/META/misc_info.txt +endif +ifeq ($(TARGET_NO_TWO_STEP_RECOVERY),true) + $(hide) echo "no_two_step_recovery=true" >> $(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) - $(hide) ./build/tools/releasetools/make_recovery_patch $(zip_root) $(zip_root) - @# Zip everything up, preserving symlinks - $(hide) (cd $(zip_root) && zip -qry ../$(notdir $@) .) +ifneq ($(INSTALLED_RECOVERYIMAGE_TARGET),) +ifeq ($(TARGET_RELEASETOOL_MAKE_RECOVERY_PATCH_SCRIPT),) + $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH MKBOOTIMG=$(MKBOOTIMG) \ + ./build/tools/releasetools/make_recovery_patch $(zip_root) $(zip_root) +else + $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH MKBOOTIMG=$(MKBOOTIMG) \ + $(TARGET_RELEASETOOL_MAKE_RECOVERY_PATCH_SCRIPT) $(zip_root) $(zip_root) +endif +endif +ifeq ($(AB_OTA_UPDATER),true) + @# When using the A/B updater, include the updater config files in the zip. + $(hide) $(ACP) $(TOPDIR)system/update_engine/update_engine.conf $(zip_root)/META/update_engine_config.txt + $(hide) for part in $(AB_OTA_PARTITIONS); do \ + echo "$${part}" >> $(zip_root)/META/ab_partitions.txt; \ + done + $(hide) for conf in $(AB_OTA_POSTINSTALL_CONFIG); do \ + echo "$${conf}" >> $(zip_root)/META/postinstall_config.txt; \ + done + @# Include the build type in META/misc_info.txt so the server can easily differentiate production builds. + $(hide) echo "build_type=$(TARGET_BUILD_VARIANT)" >> $(zip_root)/META/misc_info.txt + $(hide) echo "ab_update=true" >> $(zip_root)/META/misc_info.txt +ifdef OSRELEASED_DIRECTORY + $(hide) $(ACP) $(TARGET_OUT_ETC)/$(OSRELEASED_DIRECTORY)/product_id $(zip_root)/META/product_id.txt + $(hide) $(ACP) $(TARGET_OUT_ETC)/$(OSRELEASED_DIRECTORY)/product_version $(zip_root)/META/product_version.txt +endif +endif +ifeq ($(BREAKPAD_GENERATE_SYMBOLS),true) + @# If breakpad symbols have been generated, add them to the zip. + $(hide) $(ACP) -r $(TARGET_OUT_BREAKPAD) $(zip_root)/BREAKPAD +endif +ifdef BOARD_PREBUILT_VENDORIMAGE + $(hide) mkdir -p $(zip_root)/IMAGES + $(hide) cp $(INSTALLED_VENDORIMAGE_TARGET) $(zip_root)/IMAGES/ +endif +ifdef PRODUCT_DEFAULT_DEV_CERTIFICATE + $(hide) vendor/cm/build/tools/getb64key.py $(PRODUCT_DEFAULT_DEV_CERTIFICATE).x509.pem > $(zip_root)/META/releasekey.txt +else + $(hide) vendor/cm/build/tools/getb64key.py $(DEFAULT_SYSTEM_DEV_CERTIFICATE).x509.pem > $(zip_root)/META/releasekey.txt +endif + $(hide) echo "ota_override_device=$(OTA_SCRIPT_OVERRIDE_DEVICE)" >> $(zip_root)/META/misc_info.txt + @# Zip everything up, preserving symlinks and placing META/ files first to + @# help early validation of the .zip file while uploading it. + $(hide) (cd $(zip_root) && \ + zip -qryX ../$(notdir $@) ./META && \ + zip -qryXu ../$(notdir $@) .) @# Run fs_config on all the system, vendor, boot ramdisk, @# and recovery ramdisk files in the zip, and save the output - $(hide) zipinfo -1 $@ | awk 'BEGIN { FS="SYSTEM/" } /^SYSTEM\// {print "system/" $$2}' | $(HOST_OUT_EXECUTABLES)/fs_config -C -S $(SELINUX_FC) > $(zip_root)/META/filesystem_config.txt - $(hide) zipinfo -1 $@ | awk 'BEGIN { FS="VENDOR/" } /^VENDOR\// {print "vendor/" $$2}' | $(HOST_OUT_EXECUTABLES)/fs_config -C -S $(SELINUX_FC) > $(zip_root)/META/vendor_filesystem_config.txt - $(hide) zipinfo -1 $@ | awk 'BEGIN { FS="BOOT/RAMDISK/" } /^BOOT\/RAMDISK\// {print $$2}' | $(HOST_OUT_EXECUTABLES)/fs_config -C -S $(SELINUX_FC) > $(zip_root)/META/boot_filesystem_config.txt - $(hide) zipinfo -1 $@ | awk 'BEGIN { FS="RECOVERY/RAMDISK/" } /^RECOVERY\/RAMDISK\// {print $$2}' | $(HOST_OUT_EXECUTABLES)/fs_config -C -S $(SELINUX_FC) > $(zip_root)/META/recovery_filesystem_config.txt - $(hide) (cd $(zip_root) && zip -q ../$(notdir $@) META/*filesystem_config.txt) - $(hide) ./build/tools/releasetools/add_img_to_target_files -p $(HOST_OUT) $@ + $(hide) zipinfo -1 $@ | awk 'BEGIN { FS="SYSTEM/" } /^SYSTEM\// {print "system/" $$2}' | $(HOST_OUT_EXECUTABLES)/fs_config -C -D $(TARGET_OUT) -S $(SELINUX_FC) > $(zip_root)/META/filesystem_config.txt + $(hide) zipinfo -1 $@ | awk 'BEGIN { FS="VENDOR/" } /^VENDOR\// {print "vendor/" $$2}' | $(HOST_OUT_EXECUTABLES)/fs_config -C -D $(TARGET_OUT) -S $(SELINUX_FC) > $(zip_root)/META/vendor_filesystem_config.txt +ifeq ($(BOARD_BUILD_SYSTEM_ROOT_IMAGE),true) + $(hide) zipinfo -1 $@ | awk 'BEGIN { FS="ROOT/" } /^ROOT\// {print $$2}' | $(HOST_OUT_EXECUTABLES)/fs_config -C -D $(TARGET_OUT) -S $(SELINUX_FC) > $(zip_root)/META/root_filesystem_config.txt +endif + $(hide) zipinfo -1 $@ | awk 'BEGIN { FS="BOOT/RAMDISK/" } /^BOOT\/RAMDISK\// {print $$2}' | $(HOST_OUT_EXECUTABLES)/fs_config -C -D $(TARGET_OUT) -S $(SELINUX_FC) > $(zip_root)/META/boot_filesystem_config.txt +ifneq ($(INSTALLED_RECOVERYIMAGE_TARGET),) + $(hide) zipinfo -1 $@ | awk 'BEGIN { FS="RECOVERY/RAMDISK/" } /^RECOVERY\/RAMDISK\// {print $$2}' | $(HOST_OUT_EXECUTABLES)/fs_config -C -D $(TARGET_OUT) -S $(SELINUX_FC) > $(zip_root)/META/recovery_filesystem_config.txt +endif +ifdef INSTALLED_SYSTEMOTHERIMAGE_TARGET + $(hide) zipinfo -1 $@ | awk 'BEGIN { FS="SYSTEM_OTHER/" } /^SYSTEM_OTHER\// { print "system/" $$2}' | $(HOST_OUT_EXECUTABLES)/fs_config -C -D $(TARGET_OUT) -S $(SELINUX_FC) > $(zip_root)/META/system_other_filesystem_config.txt +endif + $(hide) (cd $(zip_root) && zip -qX ../$(notdir $@) META/*filesystem_config.txt) + $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH MKBOOTIMG=$(MKBOOTIMG) \ + ./build/tools/releasetools/add_img_to_target_files -a -v -p $(HOST_OUT) $@ .PHONY: target-files-package target-files-package: $(BUILT_TARGET_FILES_PACKAGE) @@ -1454,11 +2170,7 @@ ifneq ($(filter $(MAKECMDGOALS),target-files-package),) $(call dist-for-goals, target-files-package, $(BUILT_TARGET_FILES_PACKAGE)) endif -ifneq ($(TARGET_PRODUCT),sdk) -ifeq ($(filter generic%,$(TARGET_DEVICE)),) -ifneq ($(TARGET_NO_KERNEL),true) -ifneq ($(recovery_fstab),) - +ifeq ($(build_ota_package),true) # ----------------------------------------------------------------- # OTA update package @@ -1472,23 +2184,82 @@ INTERNAL_OTA_PACKAGE_TARGET := $(PRODUCT_OUT)/$(name).zip $(INTERNAL_OTA_PACKAGE_TARGET): KEY_CERT_PAIR := $(DEFAULT_KEY_CERT_PAIR) -$(INTERNAL_OTA_PACKAGE_TARGET): $(BUILT_TARGET_FILES_PACKAGE) $(DISTTOOLS) +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),) + OTA_SCRIPT_OVERRIDE_DEVICE := auto +else + OTA_SCRIPT_OVERRIDE_DEVICE := $(TARGET_OTA_ASSERT_DEVICE) +endif + +ifneq ($(BLOCK_BASED_OTA),false) + $(INTERNAL_OTA_PACKAGE_TARGET): block_based := --block +endif + +$(INTERNAL_OTA_PACKAGE_TARGET): $(BUILT_TARGET_FILES_PACKAGE) + @echo "$(OTA_FROM_TARGET_SCRIPT)" > $(PRODUCT_OUT)/ota_script_path @echo "Package OTA: $@" - $(hide) MKBOOTIMG=$(MKBOOTIMG) \ - ./build/tools/releasetools/ota_from_target_files -v \ - --block \ + $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH MKBOOTIMG=$(MKBOOTIMG) \ + $(OTA_FROM_TARGET_SCRIPT) -v \ + $(block_based) \ -p $(HOST_OUT) \ -k $(KEY_CERT_PAIR) \ + --backup=$(backuptool) \ $(if $(OEM_OTA_CONFIG), -o $(OEM_OTA_CONFIG)) \ $(BUILT_TARGET_FILES_PACKAGE) $@ -.PHONY: otapackage +CM_TARGET_PACKAGE := $(PRODUCT_OUT)/aopp-$(LINEAGE_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) | sed "s|$(PRODUCT_OUT)/||" > $(CM_TARGET_PACKAGE).md5sum + @echo "Package Complete: $(CM_TARGET_PACKAGE)" >&2 + +endif # build_ota_package +# ----------------------------------------------------------------- +# The factory package + +name := $(TARGET_PRODUCT)-factory-$(FILE_NAME_TAG) + +INTERNAL_FACTORY_PACKAGE_TARGET := $(PRODUCT_OUT)/$(name).zip -endif # recovery_fstab is defined -endif # TARGET_NO_KERNEL != true -endif # TARGET_DEVICE != generic* -endif # TARGET_PRODUCT != sdk +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 "Package: $@" + 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) # ----------------------------------------------------------------- # The update package @@ -1501,10 +2272,16 @@ name := $(name)-img-$(FILE_NAME_TAG) INTERNAL_UPDATE_PACKAGE_TARGET := $(PRODUCT_OUT)/$(name).zip -$(INTERNAL_UPDATE_PACKAGE_TARGET): $(BUILT_TARGET_FILES_PACKAGE) $(DISTTOOLS) +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) @echo "Package: $@" - $(hide) MKBOOTIMG=$(MKBOOTIMG) \ - ./build/tools/releasetools/img_from_target_files -v \ + $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH MKBOOTIMG=$(MKBOOTIMG) \ + $(IMG_FROM_TARGET_SCRIPT) -v \ -p $(HOST_OUT) \ $(BUILT_TARGET_FILES_PACKAGE) $@ @@ -1530,7 +2307,7 @@ $(SYMBOLS_ZIP): @echo "Package symbols: $@" $(hide) rm -rf $@ $(hide) mkdir -p $(dir $@) $(TARGET_OUT_UNSTRIPPED) - $(hide) zip -qr $@ $(TARGET_OUT_UNSTRIPPED) + $(hide) zip -qrX $@ $(TARGET_OUT_UNSTRIPPED) # ----------------------------------------------------------------- # A zip of the Android Apps. Not keeping full path so that we don't @@ -1547,8 +2324,13 @@ $(APPS_ZIP): $(INSTALLED_SYSTEMIMAGE) @echo "Package apps: $@" $(hide) rm -rf $@ $(hide) mkdir -p $(dir $@) - $(hide) zip -qj $@ $(TARGET_OUT_APPS)/*/*.apk $(TARGET_OUT_APPS_PRIVILEGED)/*/*.apk - + $(hide) apps_to_zip=`find $(TARGET_OUT_APPS) $(TARGET_OUT_APPS_PRIVILEGED) -mindepth 2 -maxdepth 3 -name "*.apk"`; \ + if [ -z "$$apps_to_zip" ]; then \ + echo "No apps to zip up. Generating empty apps archive." ; \ + a=$$(mktemp /tmp/XXXXXXX) && touch $$a && zip $@ $$a && zip -d $@ $$a; \ + else \ + zip -qjX $@ $$apps_to_zip; \ + fi #------------------------------------------------------------------ # A zip of emma code coverage meta files. Generated for fully emma @@ -1560,7 +2342,7 @@ EMMA_META_ZIP := $(PRODUCT_OUT)/emma_meta.zip $(EMMA_META_ZIP) : @echo "Collecting Emma coverage meta files." $(hide) find $(TARGET_COMMON_OUT_ROOT) $(HOST_COMMON_OUT_ROOT) -name "coverage.em" | \ - zip -@ -q $@ + zip -@ -qX $@ endif # EMMA_INSTRUMENT=true @@ -1573,15 +2355,15 @@ PROGUARD_DICT_ZIP := $(PRODUCT_OUT)/$(TARGET_PRODUCT)-proguard-dict-$(FILE_NAME_ # the dependency will be set up later in build/core/main.mk. $(PROGUARD_DICT_ZIP) : @echo "Packaging Proguard obfuscation dictionary files." - $(hide) dict_files=`find $(TARGET_OUT_COMMON_INTERMEDIATES)/APPS -name proguard_dictionary`; \ + $(hide) dict_files=`find $(TARGET_OUT_COMMON_INTERMEDIATES)/APPS -name proguard_dictionary -o -name jack_dictionary`; \ if [ -n "$$dict_files" ]; then \ unobfuscated_jars=$${dict_files//proguard_dictionary/classes.jar}; \ - zip -q $@ $$dict_files $$unobfuscated_jars; \ + zip -qX $@ $$dict_files $$unobfuscated_jars; \ else \ - touch $(dir $@)/dummy; \ - (cd $(dir $@) && zip -q $(notdir $@) dummy); \ - zip -qd $@ dummy; \ - rm $(dir $@)/dummy; \ + touch $(dir $@)/zipdummy; \ + (cd $(dir $@) && zip -q $(notdir $@) zipdummy); \ + zip -qd $@ zipdummy; \ + rm $(dir $@)/zipdummy; \ fi endif # TARGET_BUILD_APPS @@ -1607,7 +2389,7 @@ INTERNAL_EMULATOR_PACKAGE_TARGET := $(PRODUCT_OUT)/$(name).zip $(INTERNAL_EMULATOR_PACKAGE_TARGET): $(INTERNAL_EMULATOR_PACKAGE_FILES) @echo "Package: $@" - $(hide) zip -qj $@ $(INTERNAL_EMULATOR_PACKAGE_FILES) + $(hide) zip -qjX $@ $(INTERNAL_EMULATOR_PACKAGE_FILES) endif # ----------------------------------------------------------------- @@ -1651,7 +2433,6 @@ ATREE_FILES := ifeq ($(strip $(ATREE_FILES)),) ATREE_FILES := \ $(ALL_PREBUILT) \ - $(ALL_COPIED_HEADERS) \ $(ALL_DEFAULT_INSTALLED_MODULES) \ $(INSTALLED_RAMDISK_TARGET) \ $(ALL_DOCS) \ @@ -1735,6 +2516,7 @@ $(INTERNAL_SDK_TARGET): $(deps) -v "TARGET_CPU_ABI=$(TARGET_CPU_ABI)" \ -v "DLL_EXTENSION=$(HOST_SHLIB_SUFFIX)" \ -v "FONT_OUT=$(SDK_FONT_TEMP)" \ + -v "JACK_SDKTOOL_VERSION=$(JACK_SDKTOOL_VERSION)" \ -o $(PRIVATE_DIR) && \ cp -f $(target_notice_file_txt) \ $(PRIVATE_DIR)/system-images/android-$(PLATFORM_VERSION)/$(TARGET_CPU_ABI)/NOTICE.txt && \ @@ -1742,7 +2524,7 @@ $(INTERNAL_SDK_TARGET): $(deps) HOST_OUT_EXECUTABLES=$(HOST_OUT_EXECUTABLES) HOST_OS=$(HOST_OS) \ development/build/tools/sdk_clean.sh $(PRIVATE_DIR) && \ chmod -R ug+rwX $(PRIVATE_DIR) && \ - cd $(dir $@) && zip -rq $(notdir $@) $(PRIVATE_NAME) \ + cd $(dir $@) && zip -rqX $(notdir $@) $(PRIVATE_NAME) \ ) || ( rm -rf $(PRIVATE_DIR) $@ && exit 44 ) @@ -1751,7 +2533,7 @@ $(INTERNAL_SDK_TARGET): $(deps) MAIN_SDK_NAME := $(sdk_name) MAIN_SDK_DIR := $(sdk_dir) MAIN_SDK_ZIP := $(INTERNAL_SDK_TARGET) -ifneq ($(filter win_sdk,$(MAKECMDGOALS)),) +ifneq ($(filter win_sdk winsdk-tools,$(MAKECMDGOALS)),) include $(TOPDIR)development/build/tools/windows_sdk.mk endif @@ -1777,11 +2559,15 @@ ifneq ($(dont_bother),true) include $(sort $(wildcard $(BUILD_SYSTEM)/tasks/*.mk)) -include $(sort $(wildcard vendor/*/build/tasks/*.mk)) -include $(sort $(wildcard device/*/build/tasks/*.mk)) +-include $(sort $(wildcard product/*/build/tasks/*.mk)) # Also the project-specific tasks -include $(sort $(wildcard vendor/*/*/build/tasks/*.mk)) -include $(sort $(wildcard device/*/*/build/tasks/*.mk)) +-include $(sort $(wildcard product/*/*/build/tasks/*.mk)) endif +include $(BUILD_SYSTEM)/product-graph.mk + # ----------------------------------------------------------------- # Create SDK repository packages. Must be done after tasks/* since # we need the addon rules defined. diff --git a/core/aapt2.mk b/core/aapt2.mk new file mode 100644 index 000000000..ccc453576 --- /dev/null +++ b/core/aapt2.mk @@ -0,0 +1,89 @@ +###################################### +# Compile resource with AAPT2 +# Input variables: +# full_android_manifest, +# my_res_resources, my_overlay_resources, +# my_compiled_res_base_dir, my_res_package, +# R_file_stamp, proguard_options_file +# my_generated_res_dirs: Resources generated during the build process and we have to compile them in a single run of aapt2. +# my_generated_res_dirs_deps: the dependency to use for my_generated_res_dirs. +# +# Output variables: +# my_res_resources_flat, my_overlay_resources_flat, +# my_generated_resources_flata +# +###################################### + + +# Compile all the resource files. +my_res_resources_flat := \ + $(foreach r, $(my_res_resources),\ + $(eval o := $(call aapt2-compiled-resource-out-file,$(r),$(my_compiled_res_base_dir)))\ + $(eval $(call aapt2-compile-one-resource-file-rule,$(r),$(o)))\ + $(o)) + +my_overlay_resources_flat := \ + $(foreach r, $(my_overlay_resources),\ + $(eval o := $(call aapt2-compiled-resource-out-file,$(r),$(my_compiled_res_base_dir)))\ + $(eval $(call aapt2-compile-one-resource-file-rule,$(r),$(o)))\ + $(o)) + +my_generated_resources_flata := +# Compile generated resources +ifneq ($(my_generated_res_dirs),) +my_generated_resources_flata := $(my_compiled_res_base_dir)/gen_res.flata +$(my_generated_resources_flata): PRIVATE_SOURCE_RES_DIRS := $(my_generated_res_dirs) +$(my_generated_resources_flata) : $(my_generated_res_dirs_deps) + @echo "AAPT2 compile $@ <- $(PRIVATE_SOURCE_RES_DIRS)" + $(call aapt2-compile-resource-dirs) + +my_generated_resources_flata += $(my_generated_resources_flata) +endif + +$(my_res_resources_flat) $(my_overlay_resources_flat) $(my_generated_resources_flata): \ + PRIVATE_AAPT2_CFLAGS := $(PRODUCT_AAPT2_CFLAGS) + +my_static_library_resources := $(foreach l, $(call reverse-list,$(LOCAL_STATIC_ANDROID_LIBRARIES)),\ + $(call intermediates-dir-for,JAVA_LIBRARIES,$(l),,COMMON)/package-res.apk) +my_shared_library_resources := $(foreach l, $(LOCAL_SHARED_ANDROID_LIBRARIES),\ + $(call intermediates-dir-for,JAVA_LIBRARIES,$(l),,COMMON)/package-res.apk) + +ifneq ($(my_static_library_resources),) +$(my_res_package): PRIVATE_AAPT_FLAGS += --auto-add-overlay +endif + +$(my_res_package): PRIVATE_RES_FLAT := $(my_res_resources_flat) +$(my_res_package): PRIVATE_OVERLAY_FLAT := $(my_static_library_resources) $(my_generated_resources_flata) $(my_overlay_resources_flat) +$(my_res_package): PRIVATE_SHARED_ANDROID_LIBRARIES := $(my_shared_library_resources) +$(my_res_package): PRIVATE_PROGUARD_OPTIONS_FILE := $(proguard_options_file) +$(my_res_package) : $(full_android_manifest) $(my_static_library_resources) $(my_shared_library_resources) +$(my_res_package) : $(my_res_resources_flat) $(my_overlay_resources_flat) \ + $(my_generated_resources_flata) $(my_static_library_resources) \ + $(AAPT2) + @echo "AAPT2 link $@" + $(call aapt2-link) + +ifdef R_file_stamp +$(R_file_stamp) : $(my_res_package) | $(ACP) + @echo "target R.java/Manifest.java: $(PRIVATE_MODULE) ($@)" + @rm -rf $@ && mkdir -p $(dir $@) + $(call find-generated-R.java) +endif + +ifdef proguard_options_file +$(proguard_options_file) : $(my_res_package) +endif + +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) + +$(resource_export_package) : $(my_res_package) | $(ACP) + @echo "target Export Resources: $(PRIVATE_MODULE) $(@)" + $(copy-file-to-new-target) + +endif diff --git a/core/android_manifest.mk b/core/android_manifest.mk index c641b75c8..0093e0208 100644 --- a/core/android_manifest.mk +++ b/core/android_manifest.mk @@ -15,15 +15,19 @@ my_full_libs_manifest_files := $(LOCAL_FULL_LIBS_MANIFEST_FILES) my_full_libs_manifest_deps := $(LOCAL_FULL_LIBS_MANIFEST_FILES) # Set up dependency on aar libraries +LOCAL_STATIC_JAVA_AAR_LIBRARIES := $(strip $(LOCAL_STATIC_JAVA_AAR_LIBRARIES)) ifdef LOCAL_STATIC_JAVA_AAR_LIBRARIES my_full_libs_manifest_deps += $(foreach lib, $(LOCAL_STATIC_JAVA_AAR_LIBRARIES),\ $(call intermediates-dir-for,JAVA_LIBRARIES,$(lib),,COMMON)/aar/classes.jar) my_full_libs_manifest_files += $(foreach lib, $(LOCAL_STATIC_JAVA_AAR_LIBRARIES),\ $(call intermediates-dir-for,JAVA_LIBRARIES,$(lib),,COMMON)/aar/AndroidManifest.xml) +# With aapt2, we'll link in the built resource from the AAR. +ifndef LOCAL_USE_AAPT2 LOCAL_RESOURCE_DIR += $(foreach lib, $(LOCAL_STATIC_JAVA_AAR_LIBRARIES),\ $(call intermediates-dir-for,JAVA_LIBRARIES,$(lib),,COMMON)/aar/res) -endif +endif # LOCAL_USE_AAPT2 +endif # LOCAL_STATIC_JAVA_AAR_LIBRARIES # Set up rules to merge library manifest files ifdef my_full_libs_manifest_files diff --git a/core/apicheck_msg_current.txt b/core/apicheck_msg_current.txt index 440e7f886..df0124bef 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 LineageOS. 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 8c25897e5..d07c7a988 100644 --- a/core/base_rules.mk +++ b/core/base_rules.mk @@ -34,14 +34,37 @@ ifdef LOCAL_IS_HOST_MODULE ifneq ($(LOCAL_IS_HOST_MODULE),true) $(error $(LOCAL_PATH): LOCAL_IS_HOST_MODULE must be "true" or empty, not "$(LOCAL_IS_HOST_MODULE)") endif - my_prefix := HOST_ + ifeq ($(LOCAL_HOST_PREFIX),) + my_prefix := HOST_ + else + my_prefix := $(LOCAL_HOST_PREFIX) + endif my_host := host- else my_prefix := TARGET_ my_host := endif +ifeq ($(my_prefix),HOST_CROSS_) + my_host_cross := true +else + my_host_cross := +endif + my_module_tags := $(LOCAL_MODULE_TAGS) +ifeq ($(my_host_cross),true) + my_module_tags := +endif + +ifdef BUILDING_WITH_NINJA +# Ninja has an implicit dependency on the command being run, and kati will +# regenerate the ninja manifest if any read makefile changes, so there is no +# need to have dependencies on makefiles. +# This won't catch all the cases where LOCAL_ADDITIONAL_DEPENDENCIES contains +# a .mk file, because a few users of LOCAL_ADDITIONAL_DEPENDENCIES don't include +# base_rules.mk, but it will fix the most common ones. +LOCAL_ADDITIONAL_DEPENDENCIES := $(filter-out %.mk,$(LOCAL_ADDITIONAL_DEPENDENCIES)) +endif ########################################################### ## Validate and define fallbacks for input LOCAL_* variables. @@ -87,6 +110,7 @@ endif # file, tag the module as "gnu". Search for "*_GPL*", "*_LGPL*" and "*_MPL*" # so that we can also find files like MODULE_LICENSE_GPL_AND_AFL # +license_files := $(call find-parent-file,$(LOCAL_PATH),MODULE_LICENSE*) gpl_license_file := $(call find-parent-file,$(LOCAL_PATH),MODULE_LICENSE*_GPL* MODULE_LICENSE*_MPL* MODULE_LICENSE*_LGPL*) ifneq ($(gpl_license_file),) my_module_tags += gnu @@ -116,6 +140,8 @@ ifeq ($(my_module_path),) partition_tag := _VENDOR else ifeq (true,$(LOCAL_OEM_MODULE)) partition_tag := _OEM + else ifeq (true,$(LOCAL_ODM_MODULE)) + partition_tag := _ODM else # The definition of should-install-to-system will be different depending # on which goal (e.g., sdk or just droid) is being built. @@ -142,20 +168,23 @@ ifneq ($(strip $(LOCAL_BUILT_MODULE)$(LOCAL_INSTALLED_MODULE)),) endif my_register_name := $(LOCAL_MODULE) +ifeq ($(my_host_cross),true) + my_register_name := host_cross_$(LOCAL_MODULE) +endif ifdef LOCAL_2ND_ARCH_VAR_PREFIX ifndef LOCAL_NO_2ND_ARCH_MODULE_SUFFIX -my_register_name := $(LOCAL_MODULE)$($(my_prefix)2ND_ARCH_MODULE_SUFFIX) +my_register_name := $(my_register_name)$($(my_prefix)2ND_ARCH_MODULE_SUFFIX) endif endif # Make sure that this IS_HOST/CLASS/MODULE combination is unique. module_id := MODULE.$(if \ - $(LOCAL_IS_HOST_MODULE),HOST,TARGET).$(LOCAL_MODULE_CLASS).$(my_register_name) + $(LOCAL_IS_HOST_MODULE),$($(my_prefix)OS),TARGET).$(LOCAL_MODULE_CLASS).$(my_register_name) ifdef $(module_id) $(error $(LOCAL_PATH): $(module_id) already defined by $($(module_id))) endif $(module_id) := $(LOCAL_PATH) -intermediates := $(call local-intermediates-dir,,$(LOCAL_2ND_ARCH_VAR_PREFIX)) +intermediates := $(call local-intermediates-dir,,$(LOCAL_2ND_ARCH_VAR_PREFIX),$(my_host_cross)) intermediates.COMMON := $(call local-intermediates-dir,COMMON) generated_sources_dir := $(call local-generated-sources-dir) @@ -181,7 +210,11 @@ 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 ($(LOCAL_NO_STANDARD_LIBRARIES),true) + # Neither do Runtime Resource Overlay apks, which contain just the overlaid resources. + else ifeq ($(LOCAL_IS_RUNTIME_RESOURCE_OVERLAY),true) + else ifeq ($(LOCAL_IGNORE_SUBDIR),true) + else my_module_path := $(my_module_path)/$(LOCAL_MODULE) endif endif @@ -191,290 +224,41 @@ endif # Assemble the list of targets to create PRIVATE_ variables for. LOCAL_INTERMEDIATE_TARGETS += $(LOCAL_BUILT_MODULE) - ########################################################### -## AIDL: Compile .aidl files to .java +## Create .toc files from shared objects to reduce unnecessary rebuild +# .toc files have the list of external dynamic symbols without their addresses. +# As .KATI_RESTAT is specified to .toc files and commit-change-for-toc is used, +# dependent binaries of a .toc file will be rebuilt only when the content of +# the .toc file is changed. ########################################################### +ifndef LOCAL_IS_HOST_MODULE +# Disable .toc optimization for host modules: we may run the host binaries during the build process +# and the libraries' implementation matters. +ifeq ($(LOCAL_MODULE_CLASS),SHARED_LIBRARIES) +LOCAL_INTERMEDIATE_TARGETS += $(LOCAL_BUILT_MODULE).toc +$(LOCAL_BUILT_MODULE).toc: $(LOCAL_BUILT_MODULE) + $(call $(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)transform-shared-lib-to-toc,$<,$@.tmp) + $(call commit-change-for-toc,$@) -aidl_sources := $(filter %.aidl,$(LOCAL_SRC_FILES)) - -ifneq ($(strip $(aidl_sources)),) - -aidl_java_sources := $(patsubst %.aidl,%.java,$(addprefix $(intermediates.COMMON)/src/, $(aidl_sources))) -aidl_sources := $(addprefix $(TOP_DIR)$(LOCAL_PATH)/, $(aidl_sources)) - -aidl_preprocess_import := -LOCAL_SDK_VERSION:=$(strip $(LOCAL_SDK_VERSION)) -ifdef LOCAL_SDK_VERSION -ifneq ($(filter current system_current, $(LOCAL_SDK_VERSION)$(TARGET_BUILD_APPS)),) - # LOCAL_SDK_VERSION is current and no TARGET_BUILD_APPS - aidl_preprocess_import := $(TARGET_OUT_COMMON_INTERMEDIATES)/framework.aidl -else - aidl_preprocess_import := $(HISTORICAL_SDK_VERSIONS_ROOT)/$(LOCAL_SDK_VERSION)/framework.aidl -endif # not current or system_current -else -# build against the platform. -LOCAL_AIDL_INCLUDES += $(FRAMEWORKS_BASE_JAVA_SRC_DIRS) -endif # LOCAL_SDK_VERSION -$(aidl_java_sources): PRIVATE_AIDL_FLAGS := -b $(addprefix -p,$(aidl_preprocess_import)) -I$(LOCAL_PATH) -I$(LOCAL_PATH)/src $(addprefix -I,$(LOCAL_AIDL_INCLUDES)) - -$(aidl_java_sources): $(intermediates.COMMON)/src/%.java: $(TOPDIR)$(LOCAL_PATH)/%.aidl $(LOCAL_ADDITIONAL_DEPENDENCIES) $(AIDL) $(aidl_preprocess_import) - $(transform-aidl-to-java) --include $(aidl_java_sources:%.java=%.P) - -else -aidl_java_sources := +# Kati adds restat=1 to ninja. GNU make does nothing for this. +.KATI_RESTAT: $(LOCAL_BUILT_MODULE).toc +# Build .toc file when using mm, mma, or make $(my_register_name) +$(my_register_name): $(LOCAL_BUILT_MODULE).toc +endif endif ########################################################### -## logtags: Add .logtags files to global list, emit java source +## logtags: Add .logtags files to global list ########################################################### logtags_sources := $(filter %.logtags,$(LOCAL_SRC_FILES)) ifneq ($(strip $(logtags_sources)),) - event_log_tags := $(addprefix $(LOCAL_PATH)/,$(logtags_sources)) - -# Emit a java source file with constants for the tags, if -# LOCAL_MODULE_CLASS is "APPS" or "JAVA_LIBRARIES". -ifneq ($(filter $(LOCAL_MODULE_CLASS),APPS JAVA_LIBRARIES),) - -logtags_java_sources := $(patsubst %.logtags,%.java,$(addprefix $(intermediates.COMMON)/src/, $(logtags_sources))) -logtags_sources := $(addprefix $(TOP_DIR)$(LOCAL_PATH)/, $(logtags_sources)) - -$(logtags_java_sources): $(intermediates.COMMON)/src/%.java: $(TOPDIR)$(LOCAL_PATH)/%.logtags $(TARGET_OUT_COMMON_INTERMEDIATES)/all-event-log-tags.txt - $(transform-logtags-to-java) - -endif - else -logtags_java_sources := event_log_tags := endif -########################################################### -## .proto files: Compile proto files to .java -########################################################### -proto_sources := $(filter %.proto,$(LOCAL_SRC_FILES)) -# Because names of the .java files compiled from .proto files are unknown until the -# .proto files are compiled, we use a timestamp file as depedency. -proto_java_sources_file_stamp := -ifneq ($(proto_sources),) -proto_sources_fullpath := $(addprefix $(TOP_DIR)$(LOCAL_PATH)/, $(proto_sources)) -# 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. -ifneq ($(LOCAL_INTERMEDIATE_SOURCE_DIR),) -proto_java_intemediate_dir := $(LOCAL_INTERMEDIATE_SOURCE_DIR)/proto -else -# LOCAL_INTERMEDIATE_SOURCE_DIR may be not defined in non-java modules. -proto_java_intemediate_dir := $(intermediates)/proto -endif -proto_java_sources_file_stamp := $(proto_java_intemediate_dir)/Proto.stamp -proto_java_sources_dir := $(proto_java_intemediate_dir)/src - -$(proto_java_sources_file_stamp): PRIVATE_PROTO_INCLUDES := $(TOP) -$(proto_java_sources_file_stamp): PRIVATE_PROTO_SRC_FILES := $(proto_sources_fullpath) -$(proto_java_sources_file_stamp): PRIVATE_PROTO_JAVA_OUTPUT_DIR := $(proto_java_sources_dir) -ifeq ($(LOCAL_PROTOC_OPTIMIZE_TYPE),micro) -$(proto_java_sources_file_stamp): PRIVATE_PROTO_JAVA_OUTPUT_OPTION := --javamicro_out -else - ifeq ($(LOCAL_PROTOC_OPTIMIZE_TYPE),nano) -$(proto_java_sources_file_stamp): PRIVATE_PROTO_JAVA_OUTPUT_OPTION := --javanano_out - else -$(proto_java_sources_file_stamp): PRIVATE_PROTO_JAVA_OUTPUT_OPTION := --java_out - endif -endif -$(proto_java_sources_file_stamp): PRIVATE_PROTOC_FLAGS := $(LOCAL_PROTOC_FLAGS) -$(proto_java_sources_file_stamp): PRIVATE_PROTO_JAVA_OUTPUT_PARAMS := $(LOCAL_PROTO_JAVA_OUTPUT_PARAMS) -$(proto_java_sources_file_stamp) : $(proto_sources_fullpath) $(PROTOC) - $(call transform-proto-to-java) - -#TODO: protoc should output the dependencies introduced by imports. - -LOCAL_INTERMEDIATE_TARGETS += $(proto_java_sources_file_stamp) -endif # proto_sources - - -########################################################### -## Java: Compile .java files to .class -########################################################### -#TODO: pull this into java.make once host and target are combined - -java_sources := $(addprefix $(TOP_DIR)$(LOCAL_PATH)/, $(filter %.java,$(LOCAL_SRC_FILES))) $(aidl_java_sources) $(logtags_java_sources) \ - $(filter %.java,$(LOCAL_GENERATED_SOURCES)) -all_java_sources := $(java_sources) $(addprefix $($(my_prefix)OUT_COMMON_INTERMEDIATES)/, $(filter %.java,$(LOCAL_INTERMEDIATE_SOURCES))) - -## Java resources ######################################### - -# Look for resource files in any specified directories. -# Non-java and non-doc files will be picked up as resources -# and included in the output jar file. -java_resource_file_groups := - -LOCAL_JAVA_RESOURCE_DIRS := $(strip $(LOCAL_JAVA_RESOURCE_DIRS)) -ifneq ($(LOCAL_JAVA_RESOURCE_DIRS),) - # This makes a list of words like - # ::: :: : - # where each of the files is relative to the directory it's grouped with. - # Directories that don't contain any resource files will result in groups - # that end with a colon, and they are stripped out in the next step. - java_resource_file_groups += \ - $(foreach dir,$(LOCAL_JAVA_RESOURCE_DIRS), \ - $(subst $(space),:,$(strip \ - $(TOP_DIR)$(LOCAL_PATH)/$(dir): \ - $(patsubst ./%,%,$(shell cd $(TOP_DIR)$(LOCAL_PATH)/$(dir) && \ - find . \ - -type d -a -name ".svn" -prune -o \ - -type f \ - -a \! -name "*.java" \ - -a \! -name "package.html" \ - -a \! -name "overview.html" \ - -a \! -name ".*.swp" \ - -a \! -name ".DS_Store" \ - -a \! -name "*~" \ - -print \ - )) \ - )) \ - ) - java_resource_file_groups := $(filter-out %:,$(java_resource_file_groups)) -endif # LOCAL_JAVA_RESOURCE_DIRS - -LOCAL_JAVA_RESOURCE_FILES := $(strip $(LOCAL_JAVA_RESOURCE_FILES)) -ifneq ($(LOCAL_JAVA_RESOURCE_FILES),) - java_resource_file_groups += \ - $(foreach f,$(LOCAL_JAVA_RESOURCE_FILES), \ - $(patsubst %/,%,$(dir $(f)))::$(notdir $(f)) \ - ) -endif # LOCAL_JAVA_RESOURCE_FILES - -ifdef java_resource_file_groups - # The full paths to all resources, used for dependencies. - java_resource_sources := \ - $(foreach group,$(java_resource_file_groups), \ - $(addprefix $(word 1,$(subst :,$(space),$(group)))/, \ - $(wordlist 2,9999,$(subst :,$(space),$(group))) \ - ) \ - ) - # The arguments to jar that will include these files in a jar file. - # Quote the file name to handle special characters (such as #) correctly. - extra_jar_args := \ - $(foreach group,$(java_resource_file_groups), \ - $(addprefix -C "$(word 1,$(subst :,$(space),$(group)))" , \ - $(foreach w, $(wordlist 2,9999,$(subst :,$(space),$(group))), "$(w)" ) \ - ) \ - ) - java_resource_file_groups := -else - java_resource_sources := - extra_jar_args := -endif # java_resource_file_groups - -## PRIVATE java vars ###################################### -# LOCAL_SOURCE_FILES_ALL_GENERATED is set only if the module does not have static source files, -# but generated source files in its LOCAL_INTERMEDIATE_SOURCE_DIR. -# You have to set up the dependency in some other way. -need_compile_java := $(strip $(all_java_sources)$(all_res_assets))$(LOCAL_STATIC_JAVA_LIBRARIES)$(filter true,$(LOCAL_SOURCE_FILES_ALL_GENERATED)) -ifdef need_compile_java - -full_static_java_libs := \ - $(foreach lib,$(LOCAL_STATIC_JAVA_LIBRARIES), \ - $(call intermediates-dir-for, \ - JAVA_LIBRARIES,$(lib),$(LOCAL_IS_HOST_MODULE),COMMON)/javalib.jar) - -$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_INSTALL_DIR := $(dir $(LOCAL_INSTALLED_MODULE)) -$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_CLASS_INTERMEDIATES_DIR := $(intermediates)/classes -$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_SOURCE_INTERMEDIATES_DIR := $(intermediates)/src -$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_JAVA_SOURCES := $(all_java_sources) -$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_JAVA_OBJECTS := $(patsubst %.java,%.class,$(LOCAL_SRC_FILES)) -ifeq ($(my_prefix),TARGET_) -ifeq ($(LOCAL_SDK_VERSION),) -$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_BOOTCLASSPATH := -bootclasspath $(call java-lib-files,core-libart) -else -ifeq ($(LOCAL_SDK_VERSION)$(TARGET_BUILD_APPS),current) -# LOCAL_SDK_VERSION is current and no TARGET_BUILD_APPS. -$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_BOOTCLASSPATH := -bootclasspath $(call java-lib-files,android_stubs_current) -else ifeq ($(LOCAL_SDK_VERSION)$(TARGET_BUILD_APPS),system_current) -$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_BOOTCLASSPATH := -bootclasspath $(call java-lib-files,android_system_stubs_current) -else -$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_BOOTCLASSPATH := -bootclasspath $(call java-lib-files,sdk_v$(LOCAL_SDK_VERSION)) -endif # current or system_current -endif # LOCAL_SDK_VERSION -endif # TARGET_ -$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_RESOURCE_DIR := $(LOCAL_RESOURCE_DIR) -$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_ASSET_DIR := $(LOCAL_ASSET_DIR) -$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_STATIC_JAVA_LIBRARIES := $(full_static_java_libs) - -# full_java_libs: The list of files that should be used as the classpath. -# Using this list as a dependency list WILL NOT WORK. -# full_java_lib_deps: Should be specified as a prerequisite of this module -# to guarantee that the files in full_java_libs will -# be up-to-date. -ifdef LOCAL_IS_HOST_MODULE -ifeq ($(USE_CORE_LIB_BOOTCLASSPATH),true) -$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_BOOTCLASSPATH := -bootclasspath $(call java-lib-deps,core-libart-hostdex,$(LOCAL_IS_HOST_MODULE)) - -full_shared_java_libs := $(call java-lib-files,$(LOCAL_JAVA_LIBRARIES),$(LOCAL_IS_HOST_MODULE)) -full_java_lib_deps := $(call java-lib-deps,$(LOCAL_JAVA_LIBRARIES),$(LOCAL_IS_HOST_MODULE)) -else -$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_BOOTCLASSPATH := - -full_shared_java_libs := $(addprefix $(HOST_OUT_JAVA_LIBRARIES)/,\ - $(addsuffix $(COMMON_JAVA_PACKAGE_SUFFIX),$(LOCAL_JAVA_LIBRARIES))) -full_java_lib_deps := $(full_shared_java_libs) -endif # USE_CORE_LIB_BOOTCLASSPATH -else # !LOCAL_IS_HOST_MODULE -full_shared_java_libs := $(call java-lib-files,$(LOCAL_JAVA_LIBRARIES),$(LOCAL_IS_HOST_MODULE)) -full_java_lib_deps := $(call java-lib-deps,$(LOCAL_JAVA_LIBRARIES),$(LOCAL_IS_HOST_MODULE)) -endif # !LOCAL_IS_HOST_MODULE -full_java_libs := $(full_shared_java_libs) $(full_static_java_libs) $(LOCAL_CLASSPATH) -full_java_lib_deps += $(full_static_java_libs) $(LOCAL_CLASSPATH) - -# This is set by packages that are linking to other packages that export -# shared libraries, allowing them to make use of the code in the linked apk. -apk_libraries := $(sort $(LOCAL_APK_LIBRARIES) $(LOCAL_RES_LIBRARIES)) -ifneq ($(apk_libraries),) - link_apk_libraries := \ - $(foreach lib,$(apk_libraries), \ - $(call intermediates-dir-for, \ - APPS,$(lib),,COMMON)/classes.jar) - - # link against the jar with full original names (before proguard processing). - full_shared_java_libs += $(link_apk_libraries) - full_java_libs += $(link_apk_libraries) - full_java_lib_deps += $(link_apk_libraries) -endif - -# This is set by packages that contain instrumentation, allowing them to -# link against the package they are instrumenting. Currently only one such -# package is allowed. -LOCAL_INSTRUMENTATION_FOR := $(strip $(LOCAL_INSTRUMENTATION_FOR)) -ifdef LOCAL_INSTRUMENTATION_FOR - ifneq ($(words $(LOCAL_INSTRUMENTATION_FOR)),1) - $(error \ - $(LOCAL_PATH): Multiple LOCAL_INSTRUMENTATION_FOR members defined) - endif - - link_instr_intermediates_dir.COMMON := $(call intermediates-dir-for, \ - APPS,$(LOCAL_INSTRUMENTATION_FOR),,COMMON) - # link against the jar with full original names (before proguard processing). - link_instr_classes_jar := $(link_instr_intermediates_dir.COMMON)/classes.jar - full_java_libs += $(link_instr_classes_jar) - full_java_lib_deps += $(link_instr_classes_jar) -endif - -endif # need_compile_java - -# We may want to add jar manifest or jar resource files even if there is no java code at all. -$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_EXTRA_JAR_ARGS := $(extra_jar_args) -jar_manifest_file := -ifneq ($(strip $(LOCAL_JAR_MANIFEST)),) -jar_manifest_file := $(LOCAL_PATH)/$(LOCAL_JAR_MANIFEST) -$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_JAR_MANIFEST := $(jar_manifest_file) -else -$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_JAR_MANIFEST := -endif - ########################################################### ## make clean- targets ########################################################### @@ -491,35 +275,12 @@ $(cleantarget):: ########################################################### ## Common definitions for module. ########################################################### - -# aapt doesn't accept multiple --extra-packages flags. -# We have to collapse them into a single --extra-packages flag here. -LOCAL_AAPT_FLAGS := $(strip $(LOCAL_AAPT_FLAGS)) -ifdef LOCAL_AAPT_FLAGS -ifeq ($(filter 0 1,$(words $(filter --extra-packages,$(LOCAL_AAPT_FLAGS)))),) -aapt_flags := $(subst --extra-packages$(space),--extra-packages@,$(LOCAL_AAPT_FLAGS)) -aapt_flags_extra_packages := $(patsubst --extra-packages@%,%,$(filter --extra-packages@%,$(aapt_flags))) -aapt_flags_extra_packages := $(sort $(subst :,$(space),$(aapt_flags_extra_packages))) -LOCAL_AAPT_FLAGS := $(filter-out --extra-packages@%,$(aapt_flags)) \ - --extra-packages $(subst $(space),:,$(aapt_flags_extra_packages)) -aapt_flags_extra_packages := -aapt_flags := -endif -endif - -# Propagate local configuration options to this target. $(LOCAL_INTERMEDIATE_TARGETS) : PRIVATE_PATH:=$(LOCAL_PATH) -$(LOCAL_INTERMEDIATE_TARGETS) : PRIVATE_AAPT_FLAGS:= $(LOCAL_AAPT_FLAGS) $(PRODUCT_AAPT_FLAGS) -$(LOCAL_INTERMEDIATE_TARGETS) : PRIVATE_JAVA_LIBRARIES:= $(LOCAL_JAVA_LIBRARIES) -$(LOCAL_INTERMEDIATE_TARGETS) : PRIVATE_MANIFEST_PACKAGE_NAME:= $(LOCAL_MANIFEST_PACKAGE_NAME) -$(LOCAL_INTERMEDIATE_TARGETS) : PRIVATE_MANIFEST_INSTRUMENTATION_FOR:= $(LOCAL_MANIFEST_INSTRUMENTATION_FOR) - -$(LOCAL_INTERMEDIATE_TARGETS) : PRIVATE_ALL_JAVA_LIBRARIES:= $(full_java_libs) $(LOCAL_INTERMEDIATE_TARGETS) : PRIVATE_IS_HOST_MODULE := $(LOCAL_IS_HOST_MODULE) $(LOCAL_INTERMEDIATE_TARGETS) : PRIVATE_HOST:= $(my_host) +$(LOCAL_INTERMEDIATE_TARGETS) : PRIVATE_PREFIX := $(my_prefix) $(LOCAL_INTERMEDIATE_TARGETS) : PRIVATE_INTERMEDIATES_DIR:= $(intermediates) - $(LOCAL_INTERMEDIATE_TARGETS) : PRIVATE_2ND_ARCH_VAR_PREFIX := $(LOCAL_2ND_ARCH_VAR_PREFIX) # Tell the module and all of its sub-modules who it is. @@ -531,6 +292,15 @@ $(LOCAL_INTERMEDIATE_TARGETS) : PRIVATE_MODULE:= $(my_register_name) .PHONY: $(my_register_name) $(my_register_name): $(LOCAL_BUILT_MODULE) $(LOCAL_INSTALLED_MODULE) +# Set up phony targets that covers all modules under the given paths. +# This allows us to build everything in given paths by running mmma/mma. +my_path_components := $(subst /,$(space),$(LOCAL_PATH)) +my_path_prefix := MODULES-IN +$(foreach c, $(my_path_components),\ + $(eval my_path_prefix := $(my_path_prefix)-$(c))\ + $(eval .PHONY : $(my_path_prefix))\ + $(eval $(my_path_prefix) : $(my_register_name))) + ########################################################### ## Module installation rule ########################################################### @@ -540,7 +310,7 @@ ifneq ($(strip $(HOST_ACP_UNAVAILABLE)),) LOCAL_ACP_UNAVAILABLE := $(strip $(HOST_ACP_UNAVAILABLE)) endif -ifndef LOCAL_UNINSTALLABLE_MODULE +ifneq (true,$(LOCAL_UNINSTALLABLE_MODULE)) # Define a copy rule to install the module. # acp and libraries that it uses can't use acp for # installation; hence, LOCAL_ACP_UNAVAILABLE. @@ -556,36 +326,95 @@ $(LOCAL_INSTALLED_MODULE): $(LOCAL_BUILT_MODULE) $(copy-file-to-target-with-cp) endif -endif # !LOCAL_UNINSTALLABLE_MODULE +# Rule to install the module's companion init.rc. +my_init_rc := $(LOCAL_INIT_RC_$(my_32_64_bit_suffix)) +my_init_rc_src := +my_init_rc_installed := +ifndef my_init_rc +my_init_rc := $(LOCAL_INIT_RC) +# Make sure we don't define the rule twice in multilib module. +LOCAL_INIT_RC := +endif +ifdef my_init_rc +my_init_rc_src := $(LOCAL_PATH)/$(my_init_rc) +my_init_rc_installed := $(TARGET_OUT$(partition_tag)_ETC)/init/$(notdir $(my_init_rc_src)) +$(my_init_rc_installed) : $(my_init_rc_src) | $(ACP) + @echo "Install: $@" + $(copy-file-to-new-target) +$(my_register_name) : $(my_init_rc_installed) +endif # my_init_rc +endif # !LOCAL_UNINSTALLABLE_MODULE ########################################################### ## CHECK_BUILD goals ########################################################### - -ifdef java_alternative_checked_module - LOCAL_CHECKED_MODULE := $(java_alternative_checked_module) -endif - +my_checked_module := # If nobody has defined a more specific module for the # checked modules, use LOCAL_BUILT_MODULE. -ifndef LOCAL_CHECKED_MODULE - LOCAL_CHECKED_MODULE := $(LOCAL_BUILT_MODULE) +ifdef LOCAL_CHECKED_MODULE + my_checked_module := $(LOCAL_CHECKED_MODULE) +else + my_checked_module := $(LOCAL_BUILT_MODULE) endif # If they request that this module not be checked, then don't. # PLEASE DON'T SET THIS. ANY PLACES THAT SET THIS WITHOUT # GOOD REASON WILL HAVE IT REMOVED. ifdef LOCAL_DONT_CHECK_MODULE - LOCAL_CHECKED_MODULE := + my_checked_module := endif # Don't check build target module defined for the 2nd arch ifndef LOCAL_IS_HOST_MODULE ifdef LOCAL_2ND_ARCH_VAR_PREFIX - LOCAL_CHECKED_MODULE := + my_checked_module := endif endif +########################################################### +## Compatibiliy suite files. +########################################################### +ifdef LOCAL_COMPATIBILITY_SUITE +ifneq ($(words $(LOCAL_COMPATIBILITY_SUITE)),1) +$(error $(LOCAL_PATH):$(LOCAL_MODULE) LOCAL_COMPATIBILITY_SUITE can be only one name) +endif + +# The module itself. +my_compat_dist := \ + $(LOCAL_BUILT_MODULE):$(COMPATIBILITY_TESTCASES_OUT_$(LOCAL_COMPATIBILITY_SUITE))/$(my_installed_module_stem) + +# Make sure we only add the files once for multilib modules. +ifndef $(my_prefix)$(LOCAL_MODULE_CLASS)_$(LOCAL_MODULE)_compat_files +$(my_prefix)$(LOCAL_MODULE_CLASS)_$(LOCAL_MODULE)_compat_files := true + +# LOCAL_COMPATIBILITY_SUPPORT_FILES is a list of [:]. +my_compat_dist += $(foreach f, $(LOCAL_COMPATIBILITY_SUPPORT_FILES),\ + $(eval p := $(subst :,$(space),$(f)))\ + $(eval s := $(word 1,$(p)))\ + $(eval d := $(COMPATIBILITY_TESTCASES_OUT_$(LOCAL_COMPATIBILITY_SUITE))/$(or $(word 2,$(p)),$(notdir $(word 1,$(p)))))\ + $(s):$(d)) + +ifneq (,$(wildcard $(LOCAL_PATH)/AndroidTest.xml)) +my_compat_dist += \ + $(LOCAL_PATH)/AndroidTest.xml:$(COMPATIBILITY_TESTCASES_OUT_$(LOCAL_COMPATIBILITY_SUITE))/$(LOCAL_MODULE).config +endif + +ifneq (,$(wildcard $(LOCAL_PATH)/DynamicConfig.xml)) +my_compat_dist += \ + $(LOCAL_PATH)/DynamicConfig.xml:$(COMPATIBILITY_TESTCASES_OUT_$(LOCAL_COMPATIBILITY_SUITE))/$(LOCAL_MODULE).dynamic +endif +endif # $(my_prefix)$(LOCAL_MODULE_CLASS)_$(LOCAL_MODULE)_compat_files + +my_compat_files := $(call copy-many-files, $(my_compat_dist)) + +COMPATIBILITY.$(LOCAL_COMPATIBILITY_SUITE).FILES := \ + $(COMPATIBILITY.$(LOCAL_COMPATIBILITY_SUITE).FILES) \ + $(my_compat_files) + +# Copy over the compatibility files when user runs mm/mmm. +$(my_register_name) : $(my_compat_files) +endif # LOCAL_COMPATIBILITY_SUITE + ########################################################### ## Register with ALL_MODULES ########################################################### @@ -601,14 +430,17 @@ ALL_MODULES.$(my_register_name).PATH := \ ALL_MODULES.$(my_register_name).TAGS := \ $(ALL_MODULES.$(my_register_name).TAGS) $(my_module_tags) ALL_MODULES.$(my_register_name).CHECKED := \ - $(ALL_MODULES.$(my_register_name).CHECKED) $(LOCAL_CHECKED_MODULE) + $(ALL_MODULES.$(my_register_name).CHECKED) $(my_checked_module) ALL_MODULES.$(my_register_name).BUILT := \ $(ALL_MODULES.$(my_register_name).BUILT) $(LOCAL_BUILT_MODULE) ifneq (true,$(LOCAL_UNINSTALLABLE_MODULE)) ALL_MODULES.$(my_register_name).INSTALLED := \ - $(strip $(ALL_MODULES.$(my_register_name).INSTALLED) $(LOCAL_INSTALLED_MODULE)) + $(strip $(ALL_MODULES.$(my_register_name).INSTALLED) \ + $(LOCAL_INSTALLED_MODULE) $(my_init_rc_installed)) ALL_MODULES.$(my_register_name).BUILT_INSTALLED := \ - $(strip $(ALL_MODULES.$(my_register_name).BUILT_INSTALLED) $(LOCAL_BUILT_MODULE):$(LOCAL_INSTALLED_MODULE)) + $(strip $(ALL_MODULES.$(my_register_name).BUILT_INSTALLED) \ + $(LOCAL_BUILT_MODULE):$(LOCAL_INSTALLED_MODULE) \ + $(addprefix $(my_init_rc_src):,$(my_init_rc_installed))) endif ifdef LOCAL_PICKUP_FILES # Files or directories ready to pick up by the build system @@ -616,13 +448,15 @@ ifdef LOCAL_PICKUP_FILES ALL_MODULES.$(my_register_name).PICKUP_FILES := \ $(ALL_MODULES.$(my_register_name).PICKUP_FILES) $(LOCAL_PICKUP_FILES) endif +my_required_modules := $(LOCAL_REQUIRED_MODULES) \ + $(LOCAL_REQUIRED_MODULES_$(TARGET_$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)) +ifdef LOCAL_IS_HOST_MODULE +my_required_modules += $(LOCAL_REQUIRED_MODULES_$($(my_prefix)OS)) +endif ALL_MODULES.$(my_register_name).REQUIRED := \ - $(strip $(ALL_MODULES.$(my_register_name).REQUIRED) $(LOCAL_REQUIRED_MODULES) \ - $(LOCAL_REQUIRED_MODULES_$(TARGET_$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH))) + $(strip $(ALL_MODULES.$(my_register_name).REQUIRED) $(my_required_modules)) ALL_MODULES.$(my_register_name).EVENT_LOG_TAGS := \ $(ALL_MODULES.$(my_register_name).EVENT_LOG_TAGS) $(event_log_tags) -ALL_MODULES.$(my_register_name).INTERMEDIATE_SOURCE_DIR := \ - $(ALL_MODULES.$(my_register_name).INTERMEDIATE_SOURCE_DIR) $(LOCAL_INTERMEDIATE_SOURCE_DIR) ALL_MODULES.$(my_register_name).MAKEFILE := \ $(ALL_MODULES.$(my_register_name).MAKEFILE) $(LOCAL_MODULE_MAKEFILE) ifdef LOCAL_MODULE_OWNER @@ -632,12 +466,25 @@ endif ifdef LOCAL_2ND_ARCH_VAR_PREFIX ALL_MODULES.$(my_register_name).FOR_2ND_ARCH := true endif -ifdef aidl_sources -ALL_MODULES.$(my_register_name).AIDL_FILES := $(aidl_sources) -endif +ALL_MODULES.$(my_register_name).FOR_HOST_CROSS := $(my_host_cross) INSTALLABLE_FILES.$(LOCAL_INSTALLED_MODULE).MODULE := $(my_register_name) +########################################################## +# Track module-level dependencies. +# Use $(LOCAL_MODULE) instead of $(my_register_name) to ignore module's bitness. +ALL_DEPS.MODULES := $(sort $(ALL_DEPS.MODULES) $(LOCAL_MODULE)) +ALL_DEPS.$(LOCAL_MODULE).ALL_DEPS := $(sort \ + $(ALL_MODULES.$(LOCAL_MODULE).ALL_DEPS) \ + $(LOCAL_STATIC_LIBRARIES) \ + $(LOCAL_WHOLE_STATIC_LIBRARIES) \ + $(LOCAL_SHARED_LIBRARIES) \ + $(LOCAL_STATIC_JAVA_LIBRARIES) \ + $(LOCAL_JAVA_LIBRARIES)\ + $(LOCAL_JNI_SHARED_LIBRARIES)) + +ALL_DEPS.$(LOCAL_MODULE).LICENSE := $(sort $(ALL_DEPS.$(LOCAL_MODULE).LICENSE) $(license_files)) + ########################################################### ## Take care of my_module_tags ########################################################### @@ -645,14 +492,6 @@ INSTALLABLE_FILES.$(LOCAL_INSTALLED_MODULE).MODULE := $(my_register_name) # Keep track of all the tags we've seen. ALL_MODULE_TAGS := $(sort $(ALL_MODULE_TAGS) $(my_module_tags)) -# Add this module to the tag list of each specified tag. -# Don't use "+=". If the variable hasn't been set with ":=", -# it will default to recursive expansion. -$(foreach tag,$(my_module_tags),\ - $(eval ALL_MODULE_TAGS.$(tag) := \ - $(ALL_MODULE_TAGS.$(tag)) \ - $(LOCAL_INSTALLED_MODULE))) - # Add this module name to the tag list of each specified tag. $(foreach tag,$(my_module_tags),\ $(eval ALL_MODULE_NAME_TAGS.$(tag) += $(my_register_name))) @@ -675,9 +514,9 @@ h_or_t := target endif ifdef j_or_n -$(j_or_n) $(h_or_t) $(j_or_n)-$(h_or_t) : $(LOCAL_CHECKED_MODULE) +$(j_or_n) $(h_or_t) $(j_or_n)-$(h_or_t) : $(my_checked_module) ifneq (,$(filter $(my_module_tags),tests)) -$(j_or_n)-$(h_or_t)-tests $(j_or_n)-tests $(h_or_t)-tests : $(LOCAL_CHECKED_MODULE) +$(j_or_n)-$(h_or_t)-tests $(j_or_n)-tests $(h_or_t)-tests : $(my_checked_module) endif endif @@ -686,5 +525,3 @@ endif ########################################################### include $(BUILD_NOTICE_FILE) - -#:vi noexpandtab diff --git a/core/binary.mk b/core/binary.mk index 1e313ffe4..069a3dd85 100644 --- a/core/binary.mk +++ b/core/binary.mk @@ -9,6 +9,68 @@ include $(BUILD_SYSTEM)/base_rules.mk ####################################### +################################################## +# Compute the dependency of the shared libraries +################################################## +# On the target, we compile with -nostdlib, so we must add in the +# default system shared libraries, unless they have requested not +# to by supplying a LOCAL_SYSTEM_SHARED_LIBRARIES value. One would +# supply that, for example, when building libc itself. +ifdef LOCAL_IS_HOST_MODULE + ifeq ($(LOCAL_SYSTEM_SHARED_LIBRARIES),none) + my_system_shared_libraries := + else + my_system_shared_libraries := $(LOCAL_SYSTEM_SHARED_LIBRARIES) + endif +else + ifeq ($(LOCAL_SYSTEM_SHARED_LIBRARIES),none) + my_system_shared_libraries := libc libm + else + my_system_shared_libraries := $(LOCAL_SYSTEM_SHARED_LIBRARIES) + endif +endif + +# Many qcom modules don't correctly set a dependency on the kernel headers. Fix it for them, +# but warn the user. +ifneq (,$(findstring $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr/include,$(LOCAL_C_INCLUDES))) + ifeq (,$(findstring $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr,$(LOCAL_ADDITIONAL_DEPENDENCIES))) + $(warning $(LOCAL_MODULE) uses kernel headers, but does not depend on them!) + LOCAL_ADDITIONAL_DEPENDENCIES += $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr + endif +endif + +# The following LOCAL_ variables will be modified in this file. +# Because the same LOCAL_ variables may be used to define modules for both 1st arch and 2nd arch, +# we can't modify them in place. +my_src_files := $(LOCAL_SRC_FILES) +my_src_files_exclude := $(LOCAL_SRC_FILES_EXCLUDE) +my_static_libraries := $(LOCAL_STATIC_LIBRARIES) +my_whole_static_libraries := $(LOCAL_WHOLE_STATIC_LIBRARIES) +my_shared_libraries := $(LOCAL_SHARED_LIBRARIES) +my_cflags := $(LOCAL_CFLAGS) +my_conlyflags := $(LOCAL_CONLYFLAGS) +my_cppflags := $(LOCAL_CPPFLAGS) +my_cflags_no_override := $(GLOBAL_CFLAGS_NO_OVERRIDE) +my_cppflags_no_override := $(GLOBAL_CPPFLAGS_NO_OVERRIDE) +my_ldflags := $(LOCAL_LDFLAGS) +my_ldlibs := $(LOCAL_LDLIBS) +my_asflags := $(LOCAL_ASFLAGS) +my_cc := $(LOCAL_CC) +my_cc_wrapper := $(CC_WRAPPER) +my_cxx := $(LOCAL_CXX) +my_cxx_wrapper := $(CXX_WRAPPER) +my_c_includes := $(LOCAL_C_INCLUDES) +my_generated_sources := $(LOCAL_GENERATED_SOURCES) +my_native_coverage := $(LOCAL_NATIVE_COVERAGE) +my_additional_dependencies := $(LOCAL_MODULE_MAKEFILE_DEP) $(LOCAL_ADDITIONAL_DEPENDENCIES) +my_export_c_include_dirs := $(LOCAL_EXPORT_C_INCLUDE_DIRS) + +ifdef LOCAL_IS_HOST_MODULE +my_allow_undefined_symbols := true +else +my_allow_undefined_symbols := $(strip $(LOCAL_ALLOW_UNDEFINED_SYMBOLS)) +endif + my_ndk_sysroot := my_ndk_sysroot_include := my_ndk_sysroot_lib := @@ -22,12 +84,35 @@ ifdef LOCAL_SDK_VERSION my_ndk_source_root := $(HISTORICAL_NDK_VERSIONS_ROOT)/current/sources my_ndk_sysroot := $(HISTORICAL_NDK_VERSIONS_ROOT)/current/platforms/android-$(LOCAL_SDK_VERSION)/arch-$(TARGET_$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH) my_ndk_sysroot_include := $(my_ndk_sysroot)/usr/include - ifeq (x86_64,$(TARGET_$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)) + + # x86_64 and and mips64 are both multilib toolchains, so their libraries are + # installed in /usr/lib64. Aarch64, on the other hand, is not a multilib + # compiler, so its libraries are in /usr/lib. + # + # Mips32r6 is yet another variation, with libraries installed in libr6. + # + # For the rest, the libraries are installed simply to /usr/lib. + ifneq (,$(filter x86_64 mips64,$(TARGET_$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH))) my_ndk_sysroot_lib := $(my_ndk_sysroot)/usr/lib64 + else ifeq (mips32r6,$(TARGET_$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH_VARIANT)) + my_ndk_sysroot_lib := $(my_ndk_sysroot)/usr/libr6 else my_ndk_sysroot_lib := $(my_ndk_sysroot)/usr/lib endif + # The bionic linker now has support for packed relocations and gnu style + # hashes (which are much faster!), but shipping to older devices requires + # the old style hash. Fortunately, we can build with both and it'll work + # anywhere. + # + # This is not currently supported on MIPS architectures. + ifeq (,$(filter mips mips64,$(TARGET_$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH))) + my_ldflags += -Wl,--hash-style=both + endif + + # We don't want to expose the relocation packer to the NDK just yet. + LOCAL_PACK_MODULE_RELOCATIONS := false + # Set up the NDK stl variant. Starting from NDK-r5 the c++ stl resides in a separate location. # See ndk/docs/CPLUSPLUS-SUPPORT.html my_ndk_stl_include_path := @@ -35,23 +120,28 @@ ifdef LOCAL_SDK_VERSION my_ndk_stl_shared_lib := my_ndk_stl_static_lib := my_ndk_stl_cppflags := + my_cpu_variant := $(TARGET_$(LOCAL_2ND_ARCH_VAR_PREFIX)CPU_ABI) + ifeq (mips32r6,$(TARGET_$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH_VARIANT)) + my_cpu_variant := mips32r6 + endif LOCAL_NDK_STL_VARIANT := $(strip $(LOCAL_NDK_STL_VARIANT)) ifeq (,$(LOCAL_NDK_STL_VARIANT)) LOCAL_NDK_STL_VARIANT := system endif - ifneq (1,$(words $(filter system stlport_static stlport_shared c++_static c++_shared gnustl_static, $(LOCAL_NDK_STL_VARIANT)))) + ifneq (1,$(words $(filter none system stlport_static stlport_shared c++_static c++_shared gnustl_static, $(LOCAL_NDK_STL_VARIANT)))) $(error $(LOCAL_PATH): Unknown LOCAL_NDK_STL_VARIANT $(LOCAL_NDK_STL_VARIANT)) endif ifeq (system,$(LOCAL_NDK_STL_VARIANT)) my_ndk_stl_include_path := $(my_ndk_source_root)/cxx-stl/system/include - # for "system" variant, the shared library exists in the system library and -lstdc++ is added by default. + my_system_shared_libraries += libstdc++ else # LOCAL_NDK_STL_VARIANT is not system ifneq (,$(filter stlport_%, $(LOCAL_NDK_STL_VARIANT))) my_ndk_stl_include_path := $(my_ndk_source_root)/cxx-stl/stlport/stlport + my_system_shared_libraries += libstdc++ ifeq (stlport_static,$(LOCAL_NDK_STL_VARIANT)) - my_ndk_stl_static_lib := $(my_ndk_source_root)/cxx-stl/stlport/libs/$(TARGET_$(LOCAL_2ND_ARCH_VAR_PREFIX)CPU_ABI)/libstlport_static.a + my_ndk_stl_static_lib := $(my_ndk_source_root)/cxx-stl/stlport/libs/$(my_cpu_variant)/libstlport_static.a else - my_ndk_stl_shared_lib_fullpath := $(my_ndk_source_root)/cxx-stl/stlport/libs/$(TARGET_$(LOCAL_2ND_ARCH_VAR_PREFIX)CPU_ABI)/libstlport_shared.so + my_ndk_stl_shared_lib_fullpath := $(my_ndk_source_root)/cxx-stl/stlport/libs/$(my_cpu_variant)/libstlport_shared.so my_ndk_stl_shared_lib := -lstlport_shared endif else # LOCAL_NDK_STL_VARIANT is not stlport_* either @@ -60,63 +150,29 @@ ifdef LOCAL_SDK_VERSION $(my_ndk_source_root)/cxx-stl/llvm-libc++/gabi++/include \ $(my_ndk_source_root)/android/support/include ifeq (c++_static,$(LOCAL_NDK_STL_VARIANT)) - my_ndk_stl_static_lib := $(my_ndk_source_root)/cxx-stl/llvm-libc++/libs/$(TARGET_$(LOCAL_2ND_ARCH_VAR_PREFIX)CPU_ABI)/libc++_static.a + my_ndk_stl_static_lib := $(my_ndk_source_root)/cxx-stl/llvm-libc++/libs/$(my_cpu_variant)/libc++_static.a else - my_ndk_stl_shared_lib_fullpath := $(my_ndk_source_root)/cxx-stl/llvm-libc++/libs/$(TARGET_$(LOCAL_2ND_ARCH_VAR_PREFIX)CPU_ABI)/libc++_shared.so + my_ndk_stl_shared_lib_fullpath := $(my_ndk_source_root)/cxx-stl/llvm-libc++/libs/$(my_cpu_variant)/libc++_shared.so my_ndk_stl_shared_lib := -lc++_shared endif my_ndk_stl_cppflags := -std=c++11 - else - # LOCAL_NDK_STL_VARIANT is gnustl_static - my_ndk_stl_include_path := $(my_ndk_source_root)/cxx-stl/gnu-libstdc++/$($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_NDK_GCC_VERSION)/libs/$(TARGET_$(LOCAL_2ND_ARCH_VAR_PREFIX)CPU_ABI)/include \ + else # LOCAL_NDK_STL_VARIANT is not c++_* either + ifneq (,$(filter gnustl_%, $(LOCAL_NDK_STL_VARIANT))) + my_ndk_stl_include_path := $(my_ndk_source_root)/cxx-stl/gnu-libstdc++/$($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_NDK_GCC_VERSION)/libs/$(my_cpu_variant)/include \ $(my_ndk_source_root)/cxx-stl/gnu-libstdc++/$($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_NDK_GCC_VERSION)/include - my_ndk_stl_static_lib := $(my_ndk_source_root)/cxx-stl/gnu-libstdc++/$($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_NDK_GCC_VERSION)/libs/$(TARGET_$(LOCAL_2ND_ARCH_VAR_PREFIX)CPU_ABI)/libgnustl_static.a + my_ndk_stl_static_lib := $(my_ndk_source_root)/cxx-stl/gnu-libstdc++/$($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_NDK_GCC_VERSION)/libs/$(my_cpu_variant)/libgnustl_static.a + else # LOCAL_NDK_STL_VARIANT must be none + # Do nothing. endif endif endif -endif - -################################################## -# Compute the dependency of the shared libraries -################################################## -# On the target, we compile with -nostdlib, so we must add in the -# default system shared libraries, unless they have requested not -# to by supplying a LOCAL_SYSTEM_SHARED_LIBRARIES value. One would -# supply that, for example, when building libc itself. -ifdef LOCAL_IS_HOST_MODULE - ifeq ($(LOCAL_SYSTEM_SHARED_LIBRARIES),none) - my_system_shared_libraries := - else - my_system_shared_libraries := $(LOCAL_SYSTEM_SHARED_LIBRARIES) - endif -else - ifeq ($(LOCAL_SYSTEM_SHARED_LIBRARIES),none) - my_system_shared_libraries := $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_DEFAULT_SYSTEM_SHARED_LIBRARIES) - else - my_system_shared_libraries := $(LOCAL_SYSTEM_SHARED_LIBRARIES) endif endif -# The following LOCAL_ variables will be modified in this file. -# Because the same LOCAL_ variables may be used to define modules for both 1st arch and 2nd arch, -# we can't modify them in place. -my_src_files := $(LOCAL_SRC_FILES) -my_static_libraries := $(LOCAL_STATIC_LIBRARIES) -my_whole_static_libraries := $(LOCAL_WHOLE_STATIC_LIBRARIES) -my_shared_libraries := $(LOCAL_SHARED_LIBRARIES) -my_cflags := $(LOCAL_CFLAGS) -my_cppflags := $(LOCAL_CPPFLAGS) -my_ldflags := $(LOCAL_LDFLAGS) -my_asflags := $(LOCAL_ASFLAGS) -my_cc := $(LOCAL_CC) -my_cxx := $(LOCAL_CXX) -my_c_includes := $(LOCAL_C_INCLUDES) -my_generated_sources := $(LOCAL_GENERATED_SOURCES) - # MinGW spits out warnings about -fPIC even for -fpie?!) being ignored because # all code is position independent, and then those warnings get promoted to # errors. -ifeq ($(strip $(USE_MINGW)),) +ifneq ($($(my_prefix)OS),windows) ifeq ($(LOCAL_MODULE_CLASS),EXECUTABLES) my_cflags += -fpie else @@ -124,7 +180,21 @@ my_cflags += -fPIC endif endif +ifdef LOCAL_IS_HOST_MODULE +my_src_files += $(LOCAL_SRC_FILES_$($(my_prefix)OS)) $(LOCAL_SRC_FILES_$($(my_prefix)OS)_$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)) +my_static_libraries += $(LOCAL_STATIC_LIBRARIES_$($(my_prefix)OS)) +my_shared_libraries += $(LOCAL_SHARED_LIBRARIES_$($(my_prefix)OS)) +my_cflags += $(LOCAL_CFLAGS_$($(my_prefix)OS)) +my_cppflags += $(LOCAL_CPPFLAGS_$($(my_prefix)OS)) +my_ldflags += $(LOCAL_LDFLAGS_$($(my_prefix)OS)) +my_ldlibs += $(LOCAL_LDLIBS_$($(my_prefix)OS)) +my_asflags += $(LOCAL_ASFLAGS_$($(my_prefix)OS)) +my_c_includes += $(LOCAL_C_INCLUDES_$($(my_prefix)OS)) +my_generated_sources += $(LOCAL_GENERATED_SOURCES_$($(my_prefix)OS)) +endif + my_src_files += $(LOCAL_SRC_FILES_$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)) $(LOCAL_SRC_FILES_$(my_32_64_bit_suffix)) +my_src_files_exclude += $(LOCAL_SRC_FILES_EXCLUDE_$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)) $(LOCAL_SRC_FILES_EXCLUDE_$(my_32_64_bit_suffix)) my_shared_libraries += $(LOCAL_SHARED_LIBRARIES_$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)) $(LOCAL_SHARED_LIBRARIES_$(my_32_64_bit_suffix)) my_cflags += $(LOCAL_CFLAGS_$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)) $(LOCAL_CFLAGS_$(my_32_64_bit_suffix)) my_cppflags += $(LOCAL_CPPFLAGS_$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)) $(LOCAL_CPPFLAGS_$(my_32_64_bit_suffix)) @@ -133,66 +203,141 @@ my_asflags += $(LOCAL_ASFLAGS_$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)) $ my_c_includes += $(LOCAL_C_INCLUDES_$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)) $(LOCAL_C_INCLUDES_$(my_32_64_bit_suffix)) my_generated_sources += $(LOCAL_GENERATED_SOURCES_$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)) $(LOCAL_GENERATED_SOURCES_$(my_32_64_bit_suffix)) -my_clang := $(LOCAL_CLANG) +my_missing_exclude_files := $(filter-out $(my_src_files),$(my_src_files_exclude)) +ifneq ($(my_missing_exclude_files),) +$(warning Files are listed in LOCAL_SRC_FILES_EXCLUDE but not LOCAL_SRC_FILES) +$(error $(my_missing_exclude_files)) +endif +my_src_files := $(filter-out $(my_src_files_exclude),$(my_src_files)) + +my_clang := $(strip $(LOCAL_CLANG)) ifdef LOCAL_CLANG_$(my_32_64_bit_suffix) -my_clang := $(LOCAL_CLANG_$(my_32_64_bit_suffix)) +my_clang := $(strip $(LOCAL_CLANG_$(my_32_64_bit_suffix))) endif ifdef LOCAL_CLANG_$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH) -my_clang := $(LOCAL_CLANG_$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)) +my_clang := $(strip $(LOCAL_CLANG_$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH))) endif -# arch-specific static libraries go first so that generic ones can depend on them -my_static_libraries := $(LOCAL_STATIC_LIBRARIES_$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)) $(LOCAL_STATIC_LIBRARIES_$(my_32_64_bit_suffix)) $(my_static_libraries) -my_whole_static_libraries := $(LOCAL_WHOLE_STATIC_LIBRARIES_$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)) $(LOCAL_WHOLE_STATIC_LIBRARIES_$(my_32_64_bit_suffix)) $(my_whole_static_libraries) +my_sdclang := $(strip $(LOCAL_SDCLANG)) -my_cflags := $(filter-out $($(LOCAL_2ND_ARCH_VAR_PREFIX)$(my_prefix)GLOBAL_UNSUPPORTED_CFLAGS),$(my_cflags)) +# clang is enabled by default for host builds +# enable it unless we've specifically disabled clang above +ifdef LOCAL_IS_HOST_MODULE + ifneq ($($(my_prefix)OS),windows) + ifeq ($(my_clang),) + my_clang := true + endif + endif +# Add option to make gcc the default for device build +else ifeq ($(USE_CLANG_PLATFORM_BUILD),false) + ifeq ($(my_clang),) + my_clang := false + endif +else ifeq ($(my_clang),) + my_clang := true +endif + +my_cpp_std_version := -std=gnu++14 +ifneq ($(my_clang),true) + # GCC uses an invalid C++14 ABI (emits calls to + # __cxa_throw_bad_array_length, which is not a valid C++ RT ABI). + # http://b/25022512 + my_cpp_std_version := -std=gnu++11 +endif -# Replace libstdc++ with libc++ if it's seen -my_libcxx := $(filter libc++, $(my_shared_libraries)) -ifdef my_libcxx -my_system_shared_libraries := $(filter-out libstdc++, $(my_system_shared_libraries)) +ifdef LOCAL_SDK_VERSION + # The NDK handles this itself. + my_cpp_std_version := endif +ifdef LOCAL_IS_HOST_MODULE + ifneq ($(my_clang),true) + # The host GCC doesn't support C++14 (and is deprecated, so likely + # never will). Build these modules with C++11. + my_cpp_std_version := -std=gnu++11 + endif +endif + +my_cppflags := $(my_cpp_std_version) $(my_cppflags) + + +ifeq ($(SDCLANG),true) + ifeq ($(my_sdclang),) + ifeq ($(TARGET_USE_SDCLANG),true) + my_sdclang := true + endif + endif +endif + +# arch-specific static libraries go first so that generic ones can depend on them +my_static_libraries := $(LOCAL_STATIC_LIBRARIES_$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)) $(LOCAL_STATIC_LIBRARIES_$(my_32_64_bit_suffix)) $(my_static_libraries) +my_whole_static_libraries := $(LOCAL_WHOLE_STATIC_LIBRARIES_$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)) $(LOCAL_WHOLE_STATIC_LIBRARIES_$(my_32_64_bit_suffix)) $(my_whole_static_libraries) + +include $(BUILD_SYSTEM)/cxx_stl_setup.mk + # Add static HAL libraries ifdef LOCAL_HAL_STATIC_LIBRARIES $(foreach lib, $(LOCAL_HAL_STATIC_LIBRARIES), \ $(eval b_lib := $(filter $(lib).%,$(BOARD_HAL_STATIC_LIBRARIES)))\ - $(if $(b_lib), $(eval my_static_libraries += $(b_lib)),\ - $(eval my_static_libraries += $(lib).default))) + $(if $(b_lib), $(eval my_static_libraries := $(b_lib) $(my_static_libraries)),\ + $(eval my_static_libraries := $(lib).default $(my_static_libraries)))) b_lib := endif -ifeq ($(strip $(LOCAL_ADDRESS_SANITIZER)),true) - my_clang := true - # Frame pointer based unwinder in ASan requires ARM frame setup. - LOCAL_ARM_MODE := arm - my_cflags += $(ADDRESS_SANITIZER_CONFIG_EXTRA_CFLAGS) - my_ldflags += $(ADDRESS_SANITIZER_CONFIG_EXTRA_LDFLAGS) - my_shared_libraries += $(ADDRESS_SANITIZER_CONFIG_EXTRA_SHARED_LIBRARIES) - my_static_libraries += $(ADDRESS_SANITIZER_CONFIG_EXTRA_STATIC_LIBRARIES) +ifneq ($(strip $(CUSTOM_$(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)LINKER)),) + my_linker := $(CUSTOM_$(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)LINKER) +else + my_linker := $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_LINKER) endif -ifeq ($(strip $($(LOCAL_2ND_ARCH_VAR_PREFIX)WITHOUT_$(my_prefix)CLANG)),true) - my_clang := -endif +include $(BUILD_SYSTEM)/config_sanitizers.mk # Add in libcompiler_rt for all regular device builds -ifeq (,$(LOCAL_SDK_VERSION)$(LOCAL_IS_HOST_MODULE)$(WITHOUT_LIBCOMPILER_RT)) +ifeq (,$(LOCAL_SDK_VERSION)$(WITHOUT_LIBCOMPILER_RT)) my_static_libraries += $(COMPILER_RT_CONFIG_EXTRA_STATIC_LIBRARIES) endif -my_compiler_dependencies := - -################################################################## +#################################################### ## Add FDO flags if FDO is turned on and supported ## Please note that we will do option filtering during FDO build. ## i.e. Os->O2, remove -fno-early-inline and -finline-limit. ################################################################## -ifeq ($(strip $(LOCAL_FDO_SUPPORT)), true) - ifeq ($(strip $(LOCAL_IS_HOST_MODULE)),) - my_cflags += $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_FDO_CFLAGS) - my_ldflags += $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_FDO_LDFLAGS) +my_fdo_build := +ifneq ($(filter true always, $(LOCAL_FDO_SUPPORT)),) + ifeq ($(BUILD_FDO_INSTRUMENT),true) + my_cflags += $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_FDO_INSTRUMENT_CFLAGS) + my_ldflags += $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_FDO_INSTRUMENT_LDFLAGS) + my_fdo_build := true + else ifneq ($(filter true,$(BUILD_FDO_OPTIMIZE))$(filter always,$(LOCAL_FDO_SUPPORT)),) + my_cflags += $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_FDO_OPTIMIZE_CFLAGS) + my_fdo_build := true + endif + # Disable ccache (or other compiler wrapper) except gomacc, unless + # it can handle -fprofile-use properly. + + # ccache supports -fprofile-use as of version 3.2. Parse the version output + # of each wrapper to determine if it's ccache 3.2 or newer. + is_cc_ccache := $(shell if [ "`$(my_cc_wrapper) -V 2>/dev/null | head -1 | cut -d' ' -f1`" = ccache ]; then echo true; fi) + ifeq ($(is_cc_ccache),true) + cc_ccache_version := $(shell $(my_cc_wrapper) -V | head -1 | grep -o '[[:digit:]]\+\.[[:digit:]]\+') + vmajor := $(shell echo $(cc_ccache_version) | cut -d'.' -f1) + vminor := $(shell echo $(cc_ccache_version) | cut -d'.' -f2) + cc_ccache_ge_3_2 = $(shell if [ $(vmajor) -gt 3 -o $(vmajor) -eq 3 -a $(vminor) -ge 2 ]; then echo true; fi) + endif + is_cxx_ccache := $(shell if [ "`$(my_cxx_wrapper) -V 2>/dev/null | head -1 | cut -d' ' -f1`" = ccache ]; then echo true; fi) + ifeq ($(is_cxx_ccache),true) + cxx_ccache_version := $(shell $(my_cxx_wrapper) -V | head -1 | grep -o '[[:digit:]]\+\.[[:digit:]]\+') + vmajor := $(shell echo $(cxx_ccache_version) | cut -d'.' -f1) + vminor := $(shell echo $(cxx_ccache_version) | cut -d'.' -f2) + cxx_ccache_ge_3_2 = $(shell if [ $(vmajor) -gt 3 -o $(vmajor) -eq 3 -a $(vminor) -ge 2 ]; then echo true; fi) + endif + + ifneq ($(cc_ccache_ge_3_2),true) + my_cc_wrapper := $(filter $(GOMA_CC),$(my_cc_wrapper)) + endif + ifneq ($(cxx_ccache_ge_3_2),true) + my_cxx_wrapper := $(filter $(GOMA_CC),$(my_cxx_wrapper)) endif endif @@ -203,30 +348,6 @@ endif my_asflags += -D__ASSEMBLY__ -########################################################## -## Set up installed module dependency -## We cannot compute the full path of the LOCAL_SHARED_LIBRARIES for -## they may cusomize their install path with LOCAL_MODULE_PATH -########################################################## -# Get the list of INSTALLED libraries as module names. -ifdef LOCAL_SDK_VERSION - installed_shared_library_module_names := \ - $(my_shared_libraries) -else - installed_shared_library_module_names := \ - $(my_system_shared_libraries) $(my_shared_libraries) -endif -installed_shared_library_module_names := $(sort $(installed_shared_library_module_names)) - -# The real dependency will be added after all Android.mks are loaded and the install paths -# of the shared libraries are determined. -ifdef LOCAL_INSTALLED_MODULE -ifdef installed_shared_library_module_names -$(LOCAL_2ND_ARCH_VAR_PREFIX)$(my_prefix)DEPENDENCIES_ON_SHARED_LIBRARIES += \ - $(my_register_name):$(LOCAL_INSTALLED_MODULE):$(subst $(space),$(comma),$(installed_shared_library_module_names)) -endif -endif - ########################################################### ## Define PRIVATE_ variables from global vars ########################################################### @@ -243,11 +364,20 @@ endif # LOCAL_SDK_VERSION ifeq ($(my_clang),true) my_target_global_cflags := $($(LOCAL_2ND_ARCH_VAR_PREFIX)CLANG_TARGET_GLOBAL_CFLAGS) +my_target_global_conlyflags := $($(LOCAL_2ND_ARCH_VAR_PREFIX)CLANG_TARGET_GLOBAL_CONLYFLAGS) my_target_global_cppflags += $($(LOCAL_2ND_ARCH_VAR_PREFIX)CLANG_TARGET_GLOBAL_CPPFLAGS) my_target_global_ldflags := $($(LOCAL_2ND_ARCH_VAR_PREFIX)CLANG_TARGET_GLOBAL_LDFLAGS) -my_target_c_includes += $(CLANG_CONFIG_EXTRA_TARGET_C_INCLUDES) + ifeq ($(my_sdclang),true) + ifeq ($(strip $(my_cc)),) + my_cc := $(my_cc_wrapper) $(SDCLANG_PATH)/clang $(SDLLVM_AE_FLAG) -Wno-vectorizer-no-neon + endif + ifeq ($(strip $(my_cxx)),) + my_cxx := $(my_cxx_wrapper) $(SDCLANG_PATH)/clang++ $(SDLLVM_AE_FLAG) -Wno-vectorizer-no-neon + endif + endif else my_target_global_cflags := $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_GLOBAL_CFLAGS) +my_target_global_conlyflags := $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_GLOBAL_CONLYFLAGS) my_target_global_cppflags += $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_GLOBAL_CPPFLAGS) my_target_global_ldflags := $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_GLOBAL_LDFLAGS) endif # my_clang @@ -255,29 +385,60 @@ endif # my_clang $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_TARGET_PROJECT_INCLUDES := $(my_target_project_includes) $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_TARGET_C_INCLUDES := $(my_target_c_includes) $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_TARGET_GLOBAL_CFLAGS := $(my_target_global_cflags) +$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_TARGET_GLOBAL_CONLYFLAGS := $(my_target_global_conlyflags) $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_TARGET_GLOBAL_CPPFLAGS := $(my_target_global_cppflags) $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_TARGET_GLOBAL_LDFLAGS := $(my_target_global_ldflags) else # LOCAL_IS_HOST_MODULE ifeq ($(my_clang),true) -my_host_global_cflags := $($(LOCAL_2ND_ARCH_VAR_PREFIX)CLANG_HOST_GLOBAL_CFLAGS) -my_host_global_cppflags := $($(LOCAL_2ND_ARCH_VAR_PREFIX)CLANG_HOST_GLOBAL_CPPFLAGS) -my_host_global_ldflags := $($(LOCAL_2ND_ARCH_VAR_PREFIX)CLANG_HOST_GLOBAL_LDFLAGS) -my_host_c_includes := $($(LOCAL_2ND_ARCH_VAR_PREFIX)HOST_C_INCLUDES) $(CLANG_CONFIG_EXTRA_HOST_C_INCLUDES) +my_host_global_cflags := $($(LOCAL_2ND_ARCH_VAR_PREFIX)CLANG_$(my_prefix)GLOBAL_CFLAGS) +my_host_global_conlyflags := $($(LOCAL_2ND_ARCH_VAR_PREFIX)CLANG_$(my_prefix)GLOBAL_CONLYFLAGS) +my_host_global_cppflags := $($(LOCAL_2ND_ARCH_VAR_PREFIX)CLANG_$(my_prefix)GLOBAL_CPPFLAGS) +my_host_global_ldflags := $($(LOCAL_2ND_ARCH_VAR_PREFIX)CLANG_$(my_prefix)GLOBAL_LDFLAGS) +my_host_c_includes := $($(LOCAL_2ND_ARCH_VAR_PREFIX)$(my_prefix)C_INCLUDES) else -my_host_global_cflags := $($(LOCAL_2ND_ARCH_VAR_PREFIX)HOST_GLOBAL_CFLAGS) -my_host_global_cppflags := $($(LOCAL_2ND_ARCH_VAR_PREFIX)HOST_GLOBAL_CPPFLAGS) -my_host_global_ldflags := $($(LOCAL_2ND_ARCH_VAR_PREFIX)HOST_GLOBAL_LDFLAGS) -my_host_c_includes := $($(LOCAL_2ND_ARCH_VAR_PREFIX)HOST_C_INCLUDES) +my_host_global_cflags := $($(LOCAL_2ND_ARCH_VAR_PREFIX)$(my_prefix)GLOBAL_CFLAGS) +my_host_global_conlyflags := $($(LOCAL_2ND_ARCH_VAR_PREFIX)$(my_prefix)GLOBAL_CONLYFLAGS) +my_host_global_cppflags := $($(LOCAL_2ND_ARCH_VAR_PREFIX)$(my_prefix)GLOBAL_CPPFLAGS) +my_host_global_ldflags := $($(LOCAL_2ND_ARCH_VAR_PREFIX)$(my_prefix)GLOBAL_LDFLAGS) +my_host_c_includes := $($(LOCAL_2ND_ARCH_VAR_PREFIX)$(my_prefix)C_INCLUDES) endif # my_clang $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_HOST_C_INCLUDES := $(my_host_c_includes) $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_HOST_GLOBAL_CFLAGS := $(my_host_global_cflags) +$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_HOST_GLOBAL_CONLYFLAGS := $(my_host_global_conlyflags) $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_HOST_GLOBAL_CPPFLAGS := $(my_host_global_cppflags) $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_HOST_GLOBAL_LDFLAGS := $(my_host_global_ldflags) endif # LOCAL_IS_HOST_MODULE +# To enable coverage for a given module, set LOCAL_NATIVE_COVERAGE=true and +# build with NATIVE_COVERAGE=true in your enviornment. Note that the build +# system is not sensitive to changes to NATIVE_COVERAGE, so you should do a +# clean build of your module after toggling it. +ifeq ($(NATIVE_COVERAGE),true) + ifeq ($(my_native_coverage),true) + # Note that clang coverage doesn't play nicely with acov out of the box. + # Clang apparently generates .gcno files that aren't compatible with + # gcov-4.8. This can be solved by installing gcc-4.6 and invoking lcov + # with `--gcov-tool /usr/bin/gcov-4.6`. + # + # http://stackoverflow.com/questions/17758126/clang-code-coverage-invalid-output + my_cflags += --coverage -O0 + my_ldflags += --coverage + endif +else + my_native_coverage := false +endif + +ifeq ($(my_clang),true) + my_coverage_lib := $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_LIBPROFILE_RT) +else + my_coverage_lib := $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_LIBGCOV) +endif + +$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_TARGET_COVERAGE_LIB := $(my_coverage_lib) + ########################################################### ## Define PRIVATE_ variables used by multiple module types ########################################################### @@ -292,6 +453,12 @@ ifeq ($(strip $(WITH_STATIC_ANALYZER)),) LOCAL_NO_STATIC_ANALYZER := true endif +# Clang does not recognize all gcc flags. +# Use static analyzer only if clang is used. +ifneq ($(my_clang),true) + LOCAL_NO_STATIC_ANALYZER := true +endif + ifneq ($(strip $(LOCAL_IS_HOST_MODULE)),) my_syntax_arch := host else @@ -299,35 +466,44 @@ else endif ifeq ($(strip $(my_cc)),) - ifeq ($(strip $(my_clang)),true) + ifeq ($(my_clang),true) my_cc := $(CLANG) else my_cc := $($(LOCAL_2ND_ARCH_VAR_PREFIX)$(my_prefix)CC) endif + my_cc := $(my_cc_wrapper) $(my_cc) endif + ifneq ($(LOCAL_NO_STATIC_ANALYZER),true) - my_cc := $(SYNTAX_TOOLS_PREFIX)/ccc-analyzer $(my_syntax_arch) "$(my_cc)" + my_cc := CCC_CC=$(CLANG) CLANG=$(CLANG) \ + $(SYNTAX_TOOLS_PREFIX)/ccc-analyzer else ifneq ($(LOCAL_NO_SYNTAX_CHECK),true) - my_cc := $(SYNTAX_TOOLS_PREFIX)/ccc-syntax $(my_syntax_arch) "$(my_cc)" + my_cc := $(my_cc) -fsyntax-only endif endif + $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_CC := $(my_cc) ifeq ($(strip $(my_cxx)),) - ifeq ($(strip $(my_clang)),true) + ifeq ($(my_clang),true) my_cxx := $(CLANG_CXX) else my_cxx := $($(LOCAL_2ND_ARCH_VAR_PREFIX)$(my_prefix)CXX) endif + my_cxx := $(my_cxx_wrapper) $(my_cxx) endif + ifneq ($(LOCAL_NO_STATIC_ANALYZER),true) - my_cxx := $(SYNTAX_TOOLS_PREFIX)/cxx-analyzer $(my_syntax_arch) "$(my_cxx)" + my_cxx := CCC_CXX=$(CLANG_CXX) CLANG_CXX=$(CLANG_CXX) \ + $(SYNTAX_TOOLS_PREFIX)/c++-analyzer else ifneq ($(LOCAL_NO_SYNTAX_CHECK),true) - my_cxx := $(SYNTAX_TOOLS_PREFIX)/cxx-syntax $(my_syntax_arch) "$(my_cxx)" + my_cxx := $(my_cxx) -fsyntax-only endif endif + +$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_LINKER := $(my_linker) $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_CXX := $(my_cxx) $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_CLANG := $(my_clang) @@ -336,12 +512,11 @@ LOCAL_CPP_EXTENSION := $(strip $(LOCAL_CPP_EXTENSION)) ifeq ($(LOCAL_CPP_EXTENSION),) LOCAL_CPP_EXTENSION := .cpp endif -$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_CPP_EXTENSION := $(LOCAL_CPP_EXTENSION) # Certain modules like libdl have to have symbols resolved at runtime and blow # up if --no-undefined is passed to the linker. ifeq ($(strip $(LOCAL_NO_DEFAULT_COMPILER_FLAGS)),) -ifeq ($(strip $(LOCAL_ALLOW_UNDEFINED_SYMBOLS)),) +ifeq ($(my_allow_undefined_symbols),) my_ldflags += $($(LOCAL_2ND_ARCH_VAR_PREFIX)$(my_prefix)NO_UNDEFINED_LDFLAGS) endif endif @@ -356,7 +531,7 @@ endif ## Define arm-vs-thumb-mode flags. ########################################################### LOCAL_ARM_MODE := $(strip $(LOCAL_ARM_MODE)) -ifeq ($(TARGET_$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH),arm) +ifeq ($($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH),arm) arm_objects_mode := $(if $(LOCAL_ARM_MODE),$(LOCAL_ARM_MODE),arm) normal_objects_mode := $(if $(LOCAL_ARM_MODE),$(LOCAL_ARM_MODE),thumb) @@ -365,7 +540,7 @@ normal_objects_mode := $(if $(LOCAL_ARM_MODE),$(LOCAL_ARM_MODE),thumb) # actually used (although they are usually empty). arm_objects_cflags := $($(LOCAL_2ND_ARCH_VAR_PREFIX)$(my_prefix)$(arm_objects_mode)_CFLAGS) normal_objects_cflags := $($(LOCAL_2ND_ARCH_VAR_PREFIX)$(my_prefix)$(normal_objects_mode)_CFLAGS) -ifeq ($(strip $(my_clang)),true) +ifeq ($(my_clang),true) arm_objects_cflags := $(call $(LOCAL_2ND_ARCH_VAR_PREFIX)convert-to-$(my_host)clang-flags,$(arm_objects_cflags)) normal_objects_cflags := $(call $(LOCAL_2ND_ARCH_VAR_PREFIX)convert-to-$(my_host)clang-flags,$(normal_objects_cflags)) endif @@ -390,6 +565,34 @@ else debug_cflags := endif +#################################################### +## Keep track of src -> obj mapping +#################################################### + +my_tracked_gen_files := +my_tracked_src_files := + +########################################################### +## Stuff source generated from one-off tools +########################################################### +$(my_generated_sources): PRIVATE_MODULE := $(my_register_name) + +my_gen_sources_copy := $(patsubst $(generated_sources_dir)/%,$(intermediates)/%,$(filter $(generated_sources_dir)/%,$(my_generated_sources))) + +$(my_gen_sources_copy): $(intermediates)/% : $(generated_sources_dir)/% | $(ACP) + @echo "Copy: $@" + $(copy-file-to-target) + +my_generated_sources := $(patsubst $(generated_sources_dir)/%,$(intermediates)/%,$(my_generated_sources)) + +# Generated sources that will actually produce object files. +# Other files (like headers) are allowed in LOCAL_GENERATED_SOURCES, +# since other compiled sources may depend on them, and we set up +# the dependencies. +my_gen_src_files := $(filter %.c %$(LOCAL_CPP_EXTENSION) %.S %.s,$(my_generated_sources)) + +ALL_GENERATED_SOURCES += $(my_generated_sources) + #################################################### ## Compile RenderScript with reflected C++ #################################################### @@ -402,6 +605,20 @@ renderscript_sources_fullpath := $(addprefix $(LOCAL_PATH)/, $(renderscript_sour RenderScript_file_stamp := $(intermediates)/RenderScriptCPP.stamp renderscript_intermediate := $(intermediates)/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 test_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 @@ -422,18 +639,21 @@ ifneq ($(LOCAL_RENDERSCRIPT_INCLUDES_OVERRIDE),) renderscript_includes := $(LOCAL_RENDERSCRIPT_INCLUDES_OVERRIDE) endif +bc_dep_files := $(addprefix $(renderscript_intermediate)/, \ + $(patsubst %.fs,%.d, $(patsubst %.rs,%.d, $(notdir $(renderscript_sources))))) + $(RenderScript_file_stamp): PRIVATE_RS_INCLUDES := $(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) $(RenderScript_file_stamp): PRIVATE_RS_OUTPUT_DIR := $(renderscript_intermediate) +$(RenderScript_file_stamp): PRIVATE_RS_TARGET_API := $(renderscript_target_api) +$(RenderScript_file_stamp): PRIVATE_DEP_FILES := $(bc_dep_files) $(RenderScript_file_stamp): $(renderscript_sources_fullpath) $(LOCAL_RENDERSCRIPT_CC) $(transform-renderscripts-to-cpp-and-bc) -# include the dependency files (.d) generated by llvm-rs-cc. -renderscript_generated_dep_files := $(addprefix $(renderscript_intermediate)/, \ - $(patsubst %.fs,%.d, $(patsubst %.rs,%.d, $(notdir $(renderscript_sources))))) --include $(renderscript_generated_dep_files) +# include the dependency files (.d/.P) generated by llvm-rs-cc. +$(call include-depfile,$(RenderScript_file_stamp).P,$(RenderScript_file_stamp)) LOCAL_INTERMEDIATE_TARGETS += $(RenderScript_file_stamp) @@ -441,9 +661,12 @@ rs_generated_cpps := $(addprefix \ $(renderscript_intermediate)/ScriptC_,$(patsubst %.fs,%.cpp, $(patsubst %.rs,%.cpp, \ $(notdir $(renderscript_sources))))) +$(call track-src-file-gen,$(renderscript_sources),$(rs_generated_cpps)) + # This is just a dummy rule to make sure gmake doesn't skip updating the dependents. $(rs_generated_cpps) : $(RenderScript_file_stamp) @echo "Updated RS generated cpp file $@." + $(hide) touch $@ my_c_includes += $(renderscript_intermediate) my_generated_sources += $(rs_generated_cpps) @@ -452,144 +675,268 @@ endif ########################################################### -## Stuff source generated from one-off tools +## Compile the .proto files to .cc (or .c) and then to .o ########################################################### -$(my_generated_sources): PRIVATE_MODULE := $(my_register_name) +proto_sources := $(filter %.proto,$(my_src_files)) +ifneq ($(proto_sources),) +proto_gen_dir := $(generated_sources_dir)/proto + +my_rename_cpp_ext := +ifneq (,$(filter nanopb-c nanopb-c-enable_malloc, $(LOCAL_PROTOC_OPTIMIZE_TYPE))) +my_proto_source_suffix := .c +my_proto_c_includes := external/nanopb-c +my_protoc_flags := --nanopb_out=$(proto_gen_dir) \ + --plugin=external/nanopb-c/generator/protoc-gen-nanopb +else +my_proto_source_suffix := $(LOCAL_CPP_EXTENSION) +ifneq ($(my_proto_source_suffix),.cc) +# aprotoc is hardcoded to write out only .cc file. +# We need to rename the extension to $(LOCAL_CPP_EXTENSION) if it's not .cc. +my_rename_cpp_ext := true +endif +my_proto_c_includes := external/protobuf/src +my_cflags += -DGOOGLE_PROTOBUF_NO_RTTI +my_protoc_flags := --cpp_out=$(proto_gen_dir) +endif +my_proto_c_includes += $(proto_gen_dir) -my_gen_sources_copy := $(patsubst $(generated_sources_dir)/%,$(intermediates)/%,$(filter $(generated_sources_dir)/%,$(my_generated_sources))) +proto_sources_fullpath := $(addprefix $(LOCAL_PATH)/, $(proto_sources)) +proto_generated_cpps := $(addprefix $(proto_gen_dir)/, \ + $(patsubst %.proto,%.pb$(my_proto_source_suffix),$(proto_sources_fullpath))) + +define copy-proto-files +$(if $(PRIVATE_PROTOC_OUTPUT), \ + $(if $(call streq,$(PRIVATE_PROTOC_INPUT),$(PRIVATE_PROTOC_OUTPUT)),, \ + $(eval proto_generated_path := $(dir $(subst $(PRIVATE_PROTOC_INPUT),$(PRIVATE_PROTOC_OUTPUT),$@))) + @mkdir -p $(dir $(proto_generated_path)) + @echo "Protobuf relocation: $(basename $@).h => $(proto_generated_path)" + @cp -f $(basename $@).h $(proto_generated_path) ),) +endef -$(my_gen_sources_copy): $(intermediates)/% : $(generated_sources_dir)/% | $(ACP) +# Ensure the transform-proto-to-cc rule is only defined once in multilib build. +ifndef $(my_host)$(LOCAL_MODULE_CLASS)_$(LOCAL_MODULE)_proto_defined +$(proto_generated_cpps): PRIVATE_PROTO_INCLUDES := $(TOP) +$(proto_generated_cpps): PRIVATE_PROTOC_FLAGS := $(LOCAL_PROTOC_FLAGS) $(my_protoc_flags) +$(proto_generated_cpps): PRIVATE_PROTOC_OUTPUT := $(LOCAL_PROTOC_OUTPUT) +$(proto_generated_cpps): PRIVATE_PROTOC_INPUT := $(LOCAL_PATH) +$(proto_generated_cpps): PRIVATE_RENAME_CPP_EXT := $(my_rename_cpp_ext) +$(proto_generated_cpps): $(proto_gen_dir)/%.pb$(my_proto_source_suffix): %.proto $(my_protoc_deps) $(PROTOC) + $(transform-proto-to-cc) + $(copy-proto-files) + +$(my_host)$(LOCAL_MODULE_CLASS)_$(LOCAL_MODULE)_proto_defined := true +endif +# Ideally we can generate the source directly into $(intermediates). +# But many Android.mks assume the .pb.hs are in $(generated_sources_dir). +# As a workaround, we make a copy in the $(intermediates). +proto_intermediate_dir := $(intermediates)/proto +proto_intermediate_cpps := $(patsubst $(proto_gen_dir)/%,$(proto_intermediate_dir)/%,\ + $(proto_generated_cpps)) +$(proto_intermediate_cpps) : $(proto_intermediate_dir)/% : $(proto_gen_dir)/% | $(ACP) @echo "Copy: $@" $(copy-file-to-target) + $(hide) cp $(basename $<).h $(basename $@).h +$(call track-src-file-gen,$(proto_sources),$(proto_intermediate_cpps)) -my_generated_sources := $(patsubst $(generated_sources_dir)/%,$(intermediates)/%,$(my_generated_sources)) +my_generated_sources += $(proto_intermediate_cpps) -ALL_GENERATED_SOURCES += $(my_generated_sources) +my_c_includes += $(my_proto_c_includes) +# Auto-export the generated proto source dir. +my_export_c_include_dirs += $(my_proto_c_includes) + +ifeq ($(LOCAL_PROTOC_OPTIMIZE_TYPE),nanopb-c-enable_malloc) + my_static_libraries += libprotobuf-c-nano-enable_malloc +else ifeq ($(LOCAL_PROTOC_OPTIMIZE_TYPE),nanopb-c) + my_static_libraries += libprotobuf-c-nano +else ifeq ($(LOCAL_PROTOC_OPTIMIZE_TYPE),full) + ifdef LOCAL_SDK_VERSION + my_static_libraries += libprotobuf-cpp-full-ndk + else + my_shared_libraries += libprotobuf-cpp-full + endif +else + ifdef LOCAL_SDK_VERSION + my_static_libraries += libprotobuf-cpp-lite-ndk + else + my_shared_libraries += libprotobuf-cpp-lite + endif +endif +endif # $(proto_sources) non-empty ########################################################### -## Compile the .proto files to .cc and then to .o +## Compile the .dbus-xml files to c++ headers ########################################################### -proto_sources := $(filter %.proto,$(my_src_files)) -proto_generated_objects := -proto_generated_headers := -ifneq ($(proto_sources),) -proto_sources_fullpath := $(addprefix $(LOCAL_PATH)/, $(proto_sources)) -proto_generated_cc_sources_dir := $(generated_sources_dir)/proto -proto_generated_cc_sources := $(addprefix $(proto_generated_cc_sources_dir)/, \ - $(patsubst %.proto,%.pb.cc,$(proto_sources_fullpath))) -proto_generated_headers := $(patsubst %.pb.cc,%.pb.h, $(proto_generated_cc_sources)) -proto_generated_obj_dir := $(intermediates)/proto -proto_generated_objects := $(addprefix $(proto_generated_obj_dir)/, \ - $(patsubst %.proto,%.pb.o,$(proto_sources_fullpath))) - -# Auto-export the generated proto source dir. -LOCAL_EXPORT_C_INCLUDE_DIRS += $(proto_generated_cc_sources_dir) - -# Ensure the transform-proto-to-cc rule is only defined once in multilib build. -ifndef $(my_prefix)_$(LOCAL_MODULE_CLASS)_$(LOCAL_MODULE)_proto_defined -$(proto_generated_cc_sources): PRIVATE_PROTO_INCLUDES := $(TOP) -$(proto_generated_cc_sources): PRIVATE_PROTO_CC_OUTPUT_DIR := $(proto_generated_cc_sources_dir) -$(proto_generated_cc_sources): PRIVATE_PROTOC_FLAGS := $(LOCAL_PROTOC_FLAGS) -$(proto_generated_cc_sources): $(proto_generated_cc_sources_dir)/%.pb.cc: %.proto $(PROTOC) - $(transform-proto-to-cc) +dbus_definitions := $(filter %.dbus-xml,$(my_src_files)) +dbus_generated_headers := +ifneq ($(dbus_definitions),) -# This is just a dummy rule to make sure gmake doesn't skip updating the dependents. -$(proto_generated_headers): $(proto_generated_cc_sources_dir)/%.pb.h: $(proto_generated_cc_sources_dir)/%.pb.cc - @echo "Updated header file $@." +dbus_definition_paths := $(addprefix $(LOCAL_PATH)/,$(dbus_definitions)) +dbus_service_config := $(filter %dbus-service-config.json,$(my_src_files)) +dbus_service_config_path := $(addprefix $(LOCAL_PATH)/,$(dbus_service_config)) -$(my_prefix)_$(LOCAL_MODULE_CLASS)_$(LOCAL_MODULE)_proto_defined := true -endif # transform-proto-to-cc rule included only once +# Mark these source files as not producing objects +$(call track-src-file-obj,$(dbus_definitions) $(dbus_service_config),) -$(proto_generated_objects): PRIVATE_ARM_MODE := $(normal_objects_mode) -$(proto_generated_objects): PRIVATE_ARM_CFLAGS := $(normal_objects_cflags) -$(proto_generated_objects): $(proto_generated_obj_dir)/%.o: $(proto_generated_cc_sources_dir)/%.cc $(proto_generated_headers) - $(transform-$(PRIVATE_HOST)cpp-to-o) --include $(proto_generated_objects:%.o=%.P) +dbus_gen_dir := $(generated_sources_dir)/dbus_bindings -my_c_includes += external/protobuf/src $(proto_generated_cc_sources_dir) -my_cflags += -DGOOGLE_PROTOBUF_NO_RTTI -ifeq ($(LOCAL_PROTOC_OPTIMIZE_TYPE),full) -my_static_libraries += libprotobuf-cpp-2.3.0-full +ifdef LOCAL_DBUS_PROXY_PREFIX +dbus_header_dir := $(dbus_gen_dir)/include/$(LOCAL_DBUS_PROXY_PREFIX) +dbus_headers := dbus-proxies.h else -my_static_libraries += libprotobuf-cpp-2.3.0-lite +dbus_header_dir := $(dbus_gen_dir) +dbus_headers := $(patsubst %.dbus-xml,%.h,$(dbus_definitions)) endif -endif # $(proto_sources) non-empty +dbus_generated_headers := $(addprefix $(dbus_header_dir)/,$(dbus_headers)) + +# Ensure that we only define build rules once in multilib builds. +ifndef $(my_prefix)_$(LOCAL_MODULE_CLASS)_$(LOCAL_MODULE)_dbus_bindings_defined +$(my_prefix)_$(LOCAL_MODULE_CLASS)_$(LOCAL_MODULE)_dbus_bindings_defined := true + +$(dbus_generated_headers): PRIVATE_MODULE := $(LOCAL_MODULE) +$(dbus_generated_headers): PRIVATE_DBUS_SERVICE_CONFIG := $(dbus_service_config_path) +$(dbus_generated_headers) : $(dbus_service_config_path) $(DBUS_GENERATOR) +ifdef LOCAL_DBUS_PROXY_PREFIX +$(dbus_generated_headers) : $(dbus_definition_paths) + $(generate-dbus-proxies) +else +$(dbus_generated_headers) : $(dbus_header_dir)/%.h : $(LOCAL_PATH)/%.dbus-xml + $(generate-dbus-adaptors) +endif # $(LOCAL_DBUS_PROXY_PREFIX) +endif # $(my_prefix)_$(LOCAL_MODULE_CLASS)_$(LOCAL_MODULE)_dbus_bindings_defined + +ifdef LOCAL_DBUS_PROXY_PREFIX +# Auto-export the generated dbus proxy directory. +my_export_c_include_dirs += $(dbus_gen_dir)/include +my_c_includes += $(dbus_gen_dir)/include +else +my_export_c_include_dirs += $(dbus_header_dir) +my_c_includes += $(dbus_header_dir) +endif # $(LOCAL_DBUS_PROXY_PREFIX) + +my_generated_sources += $(dbus_generated_headers) + +endif # $(dbus_definitions) non-empty ########################################################### -## YACC: Compile .y and .yy files to .cpp and the to .o. +## AIDL: Compile .aidl files to .cpp and .h files ########################################################### +aidl_src := $(strip $(filter %.aidl,$(my_src_files))) +aidl_gen_cpp := +ifneq ($(aidl_src),) + +# Use the intermediates directory to avoid writing our own .cpp -> .o rules. +aidl_gen_cpp_root := $(intermediates)/aidl-generated/src +aidl_gen_include_root := $(intermediates)/aidl-generated/include + +# Multi-architecture builds have distinct intermediates directories. +# Thus we'll actually generate source for each architecture. +$(foreach s,$(aidl_src),\ + $(eval $(call define-aidl-cpp-rule,$(s),$(aidl_gen_cpp_root),aidl_gen_cpp))) +$(foreach cpp,$(aidl_gen_cpp), \ + $(call include-depfile,$(addsuffix .aidl.P,$(basename $(cpp))),$(cpp))) +$(call track-src-file-gen,$(aidl_src),$(aidl_gen_cpp)) + +$(aidl_gen_cpp) : PRIVATE_MODULE := $(LOCAL_MODULE) +$(aidl_gen_cpp) : PRIVATE_HEADER_OUTPUT_DIR := $(aidl_gen_include_root) +$(aidl_gen_cpp) : PRIVATE_AIDL_FLAGS := $(addprefix -I,$(LOCAL_AIDL_INCLUDES)) + +# Add generated headers to include paths. +my_c_includes += $(aidl_gen_include_root) +my_export_c_include_dirs += $(aidl_gen_include_root) +# Pick up the generated C++ files later for transformation to .o files. +my_generated_sources += $(aidl_gen_cpp) + +endif # $(aidl_src) non-empty -y_yacc_sources := $(filter %.y,$(my_src_files)) -y_yacc_cpps := $(addprefix \ - $(intermediates)/,$(y_yacc_sources:.y=$(LOCAL_CPP_EXTENSION))) +########################################################### +## Compile the .vts files to .cc (or .c) and then to .o +########################################################### -yy_yacc_sources := $(filter %.yy,$(my_src_files)) -yy_yacc_cpps := $(addprefix \ - $(intermediates)/,$(yy_yacc_sources:.yy=$(LOCAL_CPP_EXTENSION))) +vts_src := $(strip $(filter %.vts,$(my_src_files))) +vts_gen_cpp := +ifneq ($(vts_src),) + +# Use the intermediates directory to avoid writing our own .cpp -> .o rules. +vts_gen_cpp_root := $(intermediates)/vts-generated/src +vts_gen_include_root := $(intermediates)/vts-generated/include + +# Multi-architecture builds have distinct intermediates directories. +# Thus we'll actually generate source for each architecture. +$(foreach s,$(vts_src),\ + $(eval $(call define-vts-cpp-rule,$(s),$(vts_gen_cpp_root),vts_gen_cpp))) +$(foreach cpp,$(vts_gen_cpp), \ + $(call include-depfile,$(addsuffix .vts.P,$(basename $(cpp))),$(cpp))) +$(call track-src-file-gen,$(vts_src),$(vts_gen_cpp)) + +$(vts_gen_cpp) : PRIVATE_MODULE := $(LOCAL_MODULE) +$(vts_gen_cpp) : PRIVATE_HEADER_OUTPUT_DIR := $(vts_gen_include_root) +$(vts_gen_cpp) : PRIVATE_VTS_FLAGS := $(addprefix -I,$(LOCAL_VTS_INCLUDES)) + +# Add generated headers to include paths. +my_c_includes += $(vts_gen_include_root) +my_export_c_include_dirs += $(vts_gen_include_root) +# Pick up the generated C++ files later for transformation to .o files. +my_generated_sources += $(vts_gen_cpp) -yacc_cpps := $(y_yacc_cpps) $(yy_yacc_cpps) -yacc_headers := $(yacc_cpps:$(LOCAL_CPP_EXTENSION)=.h) -yacc_objects := $(yacc_cpps:$(LOCAL_CPP_EXTENSION)=.o) +endif # $(vts_src) non-empty -ifneq ($(strip $(y_yacc_cpps)),) -$(y_yacc_cpps): $(intermediates)/%$(LOCAL_CPP_EXTENSION): \ +########################################################### +## YACC: Compile .y/.yy files to .c/.cpp and then to .o. +########################################################### + +y_yacc_sources := $(filter %.y,$(my_src_files)) +y_yacc_cs := $(addprefix \ + $(intermediates)/,$(y_yacc_sources:.y=.c)) +ifneq ($(y_yacc_cs),) +$(y_yacc_cs): $(intermediates)/%.c: \ $(TOPDIR)$(LOCAL_PATH)/%.y \ - $(lex_cpps) $(LOCAL_ADDITIONAL_DEPENDENCIES) - $(call transform-y-to-cpp,$(PRIVATE_CPP_EXTENSION)) -$(yacc_headers): $(intermediates)/%.h: $(intermediates)/%$(LOCAL_CPP_EXTENSION) + $(my_additional_dependencies) + $(call transform-y-to-c-or-cpp) +$(call track-src-file-gen,$(y_yacc_sources),$(y_yacc_cs)) + +my_generated_sources += $(y_yacc_cs) endif -ifneq ($(strip $(yy_yacc_cpps)),) +yy_yacc_sources := $(filter %.yy,$(my_src_files)) +yy_yacc_cpps := $(addprefix \ + $(intermediates)/,$(yy_yacc_sources:.yy=$(LOCAL_CPP_EXTENSION))) +ifneq ($(yy_yacc_cpps),) $(yy_yacc_cpps): $(intermediates)/%$(LOCAL_CPP_EXTENSION): \ $(TOPDIR)$(LOCAL_PATH)/%.yy \ - $(lex_cpps) $(LOCAL_ADDITIONAL_DEPENDENCIES) - $(call transform-y-to-cpp,$(PRIVATE_CPP_EXTENSION)) -$(yacc_headers): $(intermediates)/%.h: $(intermediates)/%$(LOCAL_CPP_EXTENSION) -endif + $(my_additional_dependencies) + $(call transform-y-to-c-or-cpp) +$(call track-src-file-gen,$(yy_yacc_sources),$(yy_yacc_cpps)) -ifneq ($(strip $(yacc_cpps)),) -$(yacc_objects): PRIVATE_ARM_MODE := $(normal_objects_mode) -$(yacc_objects): PRIVATE_ARM_CFLAGS := $(normal_objects_cflags) -$(yacc_objects): $(intermediates)/%.o: $(intermediates)/%$(LOCAL_CPP_EXTENSION) - $(transform-$(PRIVATE_HOST)cpp-to-o) +my_generated_sources += $(yy_yacc_cpps) endif ########################################################### -## LEX: Compile .l and .ll files to .cpp and then to .o. +## LEX: Compile .l/.ll files to .c/.cpp and then to .o. ########################################################### l_lex_sources := $(filter %.l,$(my_src_files)) -l_lex_cpps := $(addprefix \ - $(intermediates)/,$(l_lex_sources:.l=$(LOCAL_CPP_EXTENSION))) +l_lex_cs := $(addprefix \ + $(intermediates)/,$(l_lex_sources:.l=.c)) +ifneq ($(l_lex_cs),) +$(l_lex_cs): $(intermediates)/%.c: \ + $(TOPDIR)$(LOCAL_PATH)/%.l + $(transform-l-to-c-or-cpp) +$(call track-src-file-gen,$(l_lex_sources),$(l_lex_cs)) + +my_generated_sources += $(l_lex_cs) +endif ll_lex_sources := $(filter %.ll,$(my_src_files)) ll_lex_cpps := $(addprefix \ $(intermediates)/,$(ll_lex_sources:.ll=$(LOCAL_CPP_EXTENSION))) - -lex_cpps := $(l_lex_cpps) $(ll_lex_cpps) -lex_objects := $(lex_cpps:$(LOCAL_CPP_EXTENSION)=.o) - -ifneq ($(strip $(l_lex_cpps)),) -$(l_lex_cpps): $(intermediates)/%$(LOCAL_CPP_EXTENSION): \ - $(TOPDIR)$(LOCAL_PATH)/%.l - $(transform-l-to-cpp) -endif - -ifneq ($(strip $(ll_lex_cpps)),) +ifneq ($(ll_lex_cpps),) $(ll_lex_cpps): $(intermediates)/%$(LOCAL_CPP_EXTENSION): \ $(TOPDIR)$(LOCAL_PATH)/%.ll - $(transform-l-to-cpp) -endif + $(transform-l-to-c-or-cpp) +$(call track-src-file-gen,$(ll_lex_sources),$(ll_lex_cpps)) -ifneq ($(strip $(lex_cpps)),) -$(lex_objects): PRIVATE_ARM_MODE := $(normal_objects_mode) -$(lex_objects): PRIVATE_ARM_CFLAGS := $(normal_objects_cflags) -$(lex_objects): $(intermediates)/%.o: \ - $(intermediates)/%$(LOCAL_CPP_EXTENSION) \ - $(LOCAL_ADDITIONAL_DEPENDENCIES) \ - $(yacc_headers) - $(transform-$(PRIVATE_HOST)cpp-to-o) +my_generated_sources += $(ll_lex_cpps) endif ########################################################### @@ -598,35 +945,57 @@ endif # we also do this on host modules, even though # it's not really arm, because there are files that are shared. -cpp_arm_sources := $(patsubst %$(LOCAL_CPP_EXTENSION).arm,%$(LOCAL_CPP_EXTENSION),$(filter %$(LOCAL_CPP_EXTENSION).arm,$(my_src_files))) -cpp_arm_objects := $(addprefix $(intermediates)/,$(cpp_arm_sources:$(LOCAL_CPP_EXTENSION)=.o)) - -cpp_normal_sources := $(filter %$(LOCAL_CPP_EXTENSION),$(my_src_files)) +cpp_arm_sources := $(patsubst %$(LOCAL_CPP_EXTENSION).arm,%$(LOCAL_CPP_EXTENSION),$(filter %$(LOCAL_CPP_EXTENSION).arm,$(my_src_files))) +dotdot_arm_sources := $(filter ../%,$(cpp_arm_sources)) +cpp_arm_sources := $(filter-out ../%,$(cpp_arm_sources)) +cpp_arm_objects := $(addprefix $(intermediates)/,$(cpp_arm_sources:$(LOCAL_CPP_EXTENSION)=.o)) +$(call track-src-file-obj,$(patsubst %,%.arm,$(cpp_arm_sources)),$(cpp_arm_objects)) + +# For source files starting with ../, we remove all the ../ in the object file path, +# to avoid object file escaping the intermediate directory. +dotdot_arm_objects := +$(foreach s,$(dotdot_arm_sources),\ + $(eval $(call compile-dotdot-cpp-file,$(s),\ + $(my_additional_dependencies),\ + dotdot_arm_objects))) +$(call track-src-file-obj,$(patsubst %,%.arm,$(dotdot_arm_sources)),$(dotdot_arm_objects)) + +dotdot_sources := $(filter ../%$(LOCAL_CPP_EXTENSION),$(my_src_files)) +dotdot_objects := +$(foreach s,$(dotdot_sources),\ + $(eval $(call compile-dotdot-cpp-file,$(s),\ + $(my_additional_dependencies),\ + dotdot_objects))) +$(call track-src-file-obj,$(dotdot_sources),$(dotdot_objects)) + +cpp_normal_sources := $(filter-out ../%,$(filter %$(LOCAL_CPP_EXTENSION),$(my_src_files))) cpp_normal_objects := $(addprefix $(intermediates)/,$(cpp_normal_sources:$(LOCAL_CPP_EXTENSION)=.o)) +$(call track-src-file-obj,$(cpp_normal_sources),$(cpp_normal_objects)) -$(cpp_arm_objects): PRIVATE_ARM_MODE := $(arm_objects_mode) -$(cpp_arm_objects): PRIVATE_ARM_CFLAGS := $(arm_objects_cflags) -$(cpp_normal_objects): PRIVATE_ARM_MODE := $(normal_objects_mode) -$(cpp_normal_objects): PRIVATE_ARM_CFLAGS := $(normal_objects_cflags) +$(dotdot_arm_objects) $(cpp_arm_objects): PRIVATE_ARM_MODE := $(arm_objects_mode) +$(dotdot_arm_objects) $(cpp_arm_objects): PRIVATE_ARM_CFLAGS := $(arm_objects_cflags) +$(dotdot_objects) $(cpp_normal_objects): PRIVATE_ARM_MODE := $(normal_objects_mode) +$(dotdot_objects) $(cpp_normal_objects): PRIVATE_ARM_CFLAGS := $(normal_objects_cflags) cpp_objects := $(cpp_arm_objects) $(cpp_normal_objects) ifneq ($(strip $(cpp_objects)),) $(cpp_objects): $(intermediates)/%.o: \ $(TOPDIR)$(LOCAL_PATH)/%$(LOCAL_CPP_EXTENSION) \ - $(yacc_cpps) $(proto_generated_headers) \ - $(LOCAL_ADDITIONAL_DEPENDENCIES) \ - | $(my_compiler_dependencies) + $(my_additional_dependencies) $(transform-$(PRIVATE_HOST)cpp-to-o) --include $(cpp_objects:%.o=%.P) +$(call include-depfiles-for-objs, $(cpp_objects)) endif +cpp_objects += $(dotdot_arm_objects) $(dotdot_objects) + ########################################################### ## C++: Compile generated .cpp files to .o. ########################################################### gen_cpp_sources := $(filter %$(LOCAL_CPP_EXTENSION),$(my_generated_sources)) gen_cpp_objects := $(gen_cpp_sources:%$(LOCAL_CPP_EXTENSION)=%.o) +$(call track-gen-file-obj,$(gen_cpp_sources),$(gen_cpp_objects)) ifneq ($(strip $(gen_cpp_objects)),) # Compile all generated files as thumb. @@ -634,12 +1003,10 @@ ifneq ($(strip $(gen_cpp_objects)),) $(gen_cpp_objects): PRIVATE_ARM_MODE := $(normal_objects_mode) $(gen_cpp_objects): PRIVATE_ARM_CFLAGS := $(normal_objects_cflags) $(gen_cpp_objects): $(intermediates)/%.o: \ - $(intermediates)/%$(LOCAL_CPP_EXTENSION) $(yacc_cpps) \ - $(proto_generated_headers) \ - $(LOCAL_ADDITIONAL_DEPENDENCIES) \ - | $(my_compiler_dependencies) + $(intermediates)/%$(LOCAL_CPP_EXTENSION) \ + $(my_additional_dependencies) $(transform-$(PRIVATE_HOST)cpp-to-o) --include $(gen_cpp_objects:%.o=%.P) +$(call include-depfiles-for-objs, $(gen_cpp_objects)) endif ########################################################### @@ -648,27 +1015,27 @@ endif gen_S_sources := $(filter %.S,$(my_generated_sources)) gen_S_objects := $(gen_S_sources:%.S=%.o) +$(call track-gen-file-obj,$(gen_S_sources),$(gen_S_objects)) ifneq ($(strip $(gen_S_sources)),) $(gen_S_objects): $(intermediates)/%.o: $(intermediates)/%.S \ - $(LOCAL_ADDITIONAL_DEPENDENCIES) \ - | $(my_compiler_dependencies) + $(my_additional_dependencies) $(transform-$(PRIVATE_HOST)s-to-o) --include $(gen_S_objects:%.o=%.P) +$(call include-depfiles-for-objs, $(gen_S_objects)) endif gen_s_sources := $(filter %.s,$(my_generated_sources)) gen_s_objects := $(gen_s_sources:%.s=%.o) +$(call track-gen-file-obj,$(gen_s_sources),$(gen_s_objects)) ifneq ($(strip $(gen_s_objects)),) $(gen_s_objects): $(intermediates)/%.o: $(intermediates)/%.s \ - $(LOCAL_ADDITIONAL_DEPENDENCIES) \ - | $(my_compiler_dependencies) + $(my_additional_dependencies) $(transform-$(PRIVATE_HOST)s-to-o-no-deps) --include $(gen_s_objects:%.o=%.P) endif gen_asm_objects := $(gen_S_objects) $(gen_s_objects) +$(gen_asm_objects): PRIVATE_ARM_CFLAGS := $(normal_objects_cflags) ########################################################### ## o: Include generated .o files in output. @@ -680,44 +1047,66 @@ gen_o_objects := $(filter %.o,$(my_generated_sources)) ## C: Compile .c files to .o. ########################################################### -c_arm_sources := $(patsubst %.c.arm,%.c,$(filter %.c.arm,$(my_src_files))) -c_arm_objects := $(addprefix $(intermediates)/,$(c_arm_sources:.c=.o)) - -c_normal_sources := $(filter %.c,$(my_src_files)) +c_arm_sources := $(patsubst %.c.arm,%.c,$(filter %.c.arm,$(my_src_files))) +dotdot_arm_sources := $(filter ../%,$(c_arm_sources)) +c_arm_sources := $(filter-out ../%,$(c_arm_sources)) +c_arm_objects := $(addprefix $(intermediates)/,$(c_arm_sources:.c=.o)) +$(call track-src-file-obj,$(patsubst %,%.arm,$(c_arm_sources)),$(c_arm_objects)) + +# For source files starting with ../, we remove all the ../ in the object file path, +# to avoid object file escaping the intermediate directory. +dotdot_arm_objects := +$(foreach s,$(dotdot_arm_sources),\ + $(eval $(call compile-dotdot-c-file,$(s),\ + $(my_additional_dependencies),\ + dotdot_arm_objects))) +$(call track-src-file-obj,$(patsubst %,%.arm,$(dotdot_arm_sources)),$(dotdot_arm_objects)) + +dotdot_sources := $(filter ../%.c, $(my_src_files)) +dotdot_objects := +$(foreach s, $(dotdot_sources),\ + $(eval $(call compile-dotdot-c-file,$(s),\ + $(my_additional_dependencies),\ + dotdot_objects))) +$(call track-src-file-obj,$(dotdot_sources),$(dotdot_objects)) + +c_normal_sources := $(filter-out ../%,$(filter %.c,$(my_src_files))) c_normal_objects := $(addprefix $(intermediates)/,$(c_normal_sources:.c=.o)) +$(call track-src-file-obj,$(c_normal_sources),$(c_normal_objects)) -$(c_arm_objects): PRIVATE_ARM_MODE := $(arm_objects_mode) -$(c_arm_objects): PRIVATE_ARM_CFLAGS := $(arm_objects_cflags) -$(c_normal_objects): PRIVATE_ARM_MODE := $(normal_objects_mode) -$(c_normal_objects): PRIVATE_ARM_CFLAGS := $(normal_objects_cflags) +$(dotdot_arm_objects) $(c_arm_objects): PRIVATE_ARM_MODE := $(arm_objects_mode) +$(dotdot_arm_objects) $(c_arm_objects): PRIVATE_ARM_CFLAGS := $(arm_objects_cflags) +$(dotdot_objects) $(c_normal_objects): PRIVATE_ARM_MODE := $(normal_objects_mode) +$(dotdot_objects) $(c_normal_objects): PRIVATE_ARM_CFLAGS := $(normal_objects_cflags) c_objects := $(c_arm_objects) $(c_normal_objects) ifneq ($(strip $(c_objects)),) -$(c_objects): $(intermediates)/%.o: $(TOPDIR)$(LOCAL_PATH)/%.c $(yacc_cpps) $(proto_generated_headers) \ - $(LOCAL_ADDITIONAL_DEPENDENCIES) \ - | $(my_compiler_dependencies) +$(c_objects): $(intermediates)/%.o: $(TOPDIR)$(LOCAL_PATH)/%.c \ + $(my_additional_dependencies) $(transform-$(PRIVATE_HOST)c-to-o) --include $(c_objects:%.o=%.P) +$(call include-depfiles-for-objs, $(c_objects)) endif +c_objects += $(dotdot_arm_objects) $(dotdot_objects) + ########################################################### ## C: Compile generated .c files to .o. ########################################################### gen_c_sources := $(filter %.c,$(my_generated_sources)) gen_c_objects := $(gen_c_sources:%.c=%.o) +$(call track-gen-file-obj,$(gen_c_sources),$(gen_c_objects)) ifneq ($(strip $(gen_c_objects)),) # Compile all generated files as thumb. # TODO: support compiling certain generated files as arm. $(gen_c_objects): PRIVATE_ARM_MODE := $(normal_objects_mode) $(gen_c_objects): PRIVATE_ARM_CFLAGS := $(normal_objects_cflags) -$(gen_c_objects): $(intermediates)/%.o: $(intermediates)/%.c $(yacc_cpps) $(proto_generated_headers) \ - $(LOCAL_ADDITIONAL_DEPENDENCIES) \ - | $(my_compiler_dependencies) +$(gen_c_objects): $(intermediates)/%.o: $(intermediates)/%.c \ + $(my_additional_dependencies) $(transform-$(PRIVATE_HOST)c-to-o) --include $(gen_c_objects:%.o=%.P) +$(call include-depfiles-for-objs, $(gen_c_objects)) endif ########################################################### @@ -726,13 +1115,28 @@ endif objc_sources := $(filter %.m,$(my_src_files)) objc_objects := $(addprefix $(intermediates)/,$(objc_sources:.m=.o)) +$(call track-src-file-obj,$(objc_sources),$(objc_objects)) ifneq ($(strip $(objc_objects)),) -$(objc_objects): $(intermediates)/%.o: $(TOPDIR)$(LOCAL_PATH)/%.m $(yacc_cpps) $(proto_generated_headers) \ - $(LOCAL_ADDITIONAL_DEPENDENCIES) \ - | $(my_compiler_dependencies) +$(objc_objects): $(intermediates)/%.o: $(TOPDIR)$(LOCAL_PATH)/%.m \ + $(my_additional_dependencies) $(transform-$(PRIVATE_HOST)m-to-o) --include $(objc_objects:%.o=%.P) +$(call include-depfiles-for-objs, $(objc_objects)) +endif + +########################################################### +## ObjC++: Compile .mm files to .o +########################################################### + +objcpp_sources := $(filter %.mm,$(my_src_files)) +objcpp_objects := $(addprefix $(intermediates)/,$(objcpp_sources:.mm=.o)) +$(call track-src-file-obj,$(objcpp_sources),$(objcpp_objects)) + +ifneq ($(strip $(objcpp_objects)),) +$(objcpp_objects): $(intermediates)/%.o: $(TOPDIR)$(LOCAL_PATH)/%.mm \ + $(my_additional_dependencies) + $(transform-$(PRIVATE_HOST)mm-to-o) +$(call include-depfiles-for-objs, $(objcpp_objects)) endif ########################################################### @@ -740,42 +1144,84 @@ endif ########################################################### asm_sources_S := $(filter %.S,$(my_src_files)) +dotdot_sources := $(filter ../%,$(asm_sources_S)) +asm_sources_S := $(filter-out ../%,$(asm_sources_S)) asm_objects_S := $(addprefix $(intermediates)/,$(asm_sources_S:.S=.o)) +$(call track-src-file-obj,$(asm_sources_S),$(asm_objects_S)) + +dotdot_objects_S := +$(foreach s,$(dotdot_sources),\ + $(eval $(call compile-dotdot-s-file,$(s),\ + $(my_additional_dependencies),\ + dotdot_objects_S))) +$(call track-src-file-obj,$(dotdot_sources),$(dotdot_objects_S)) ifneq ($(strip $(asm_objects_S)),) $(asm_objects_S): $(intermediates)/%.o: $(TOPDIR)$(LOCAL_PATH)/%.S \ - $(LOCAL_ADDITIONAL_DEPENDENCIES) \ - | $(my_compiler_dependencies) + $(my_additional_dependencies) $(transform-$(PRIVATE_HOST)s-to-o) --include $(asm_objects_S:%.o=%.P) +$(call include-depfiles-for-objs, $(asm_objects_S)) endif asm_sources_s := $(filter %.s,$(my_src_files)) +dotdot_sources := $(filter ../%,$(asm_sources_s)) +asm_sources_s := $(filter-out ../%,$(asm_sources_s)) asm_objects_s := $(addprefix $(intermediates)/,$(asm_sources_s:.s=.o)) +$(call track-src-file-obj,$(asm_sources_s),$(asm_objects_s)) + +dotdot_objects_s := +$(foreach s,$(dotdot_sources),\ + $(eval $(call compile-dotdot-s-file-no-deps,$(s),\ + $(my_additional_dependencies),\ + dotdot_objects_s))) +$(call track-src-file-obj,$(dotdot_sources),$(dotdot_objects_s)) ifneq ($(strip $(asm_objects_s)),) $(asm_objects_s): $(intermediates)/%.o: $(TOPDIR)$(LOCAL_PATH)/%.s \ - $(LOCAL_ADDITIONAL_DEPENDENCIES) \ - | $(my_compiler_dependencies) + $(my_additional_dependencies) $(transform-$(PRIVATE_HOST)s-to-o-no-deps) --include $(asm_objects_s:%.o=%.P) endif -asm_objects := $(asm_objects_S) $(asm_objects_s) +asm_objects := $(dotdot_objects_S) $(dotdot_objects_s) $(asm_objects_S) $(asm_objects_s) +$(asm_objects): PRIVATE_ARM_CFLAGS := $(normal_objects_cflags) -# .asm for x86 needs to be compiled with yasm. -ifeq (x86,$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)) +# .asm for x86/x86_64 needs to be compiled with yasm. asm_sources_asm := $(filter %.asm,$(my_src_files)) ifneq ($(strip $(asm_sources_asm)),) asm_objects_asm := $(addprefix $(intermediates)/,$(asm_sources_asm:.asm=.o)) $(asm_objects_asm): $(intermediates)/%.o: $(TOPDIR)$(LOCAL_PATH)/%.asm \ - $(LOCAL_ADDITIONAL_DEPENDENCIES) + $(my_additional_dependencies) $(transform-asm-to-o) +$(call track-src-file-obj,$(asm_sources_asm),$(asm_objects_asm)) asm_objects += $(asm_objects_asm) endif + + +########################################################## +## Set up installed module dependency +## We cannot compute the full path of the LOCAL_SHARED_LIBRARIES for +## they may cusomize their install path with LOCAL_MODULE_PATH +########################################################## +# Get the list of INSTALLED libraries as module names. +ifdef LOCAL_SDK_VERSION + installed_shared_library_module_names := \ + $(my_shared_libraries) +else + installed_shared_library_module_names := \ + $(my_shared_libraries) $(my_system_shared_libraries) +endif + +# The real dependency will be added after all Android.mks are loaded and the install paths +# of the shared libraries are determined. +ifdef LOCAL_INSTALLED_MODULE +ifdef installed_shared_library_module_names +$(LOCAL_2ND_ARCH_VAR_PREFIX)$(my_prefix)DEPENDENCIES_ON_SHARED_LIBRARIES += \ + $(my_register_name):$(LOCAL_INSTALLED_MODULE):$(subst $(space),$(comma),$(sort $(installed_shared_library_module_names))) endif +endif + #################################################### ## Import includes @@ -783,14 +1229,15 @@ endif import_includes := $(intermediates)/import_includes import_includes_deps := $(strip \ $(foreach l, $(installed_shared_library_module_names), \ - $(call intermediates-dir-for,SHARED_LIBRARIES,$(l),$(LOCAL_IS_HOST_MODULE),,$(LOCAL_2ND_ARCH_VAR_PREFIX))/export_includes) \ + $(call intermediates-dir-for,SHARED_LIBRARIES,$(l),$(LOCAL_IS_HOST_MODULE),,$(LOCAL_2ND_ARCH_VAR_PREFIX),$(my_host_cross))/export_includes) \ $(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) + $(call intermediates-dir-for,STATIC_LIBRARIES,$(l),$(LOCAL_IS_HOST_MODULE),,$(LOCAL_2ND_ARCH_VAR_PREFIX),$(my_host_cross))/export_includes)) +$(import_includes): PRIVATE_IMPORT_EXPORT_INCLUDES := $(import_includes_deps) +$(import_includes) : $(LOCAL_MODULE_MAKEFILE_DEP) $(import_includes_deps) @echo Import includes file: $@ $(hide) mkdir -p $(dir $@) && rm -f $@ ifdef import_includes_deps - $(hide) for f in $^; do \ + $(hide) for f in $(PRIVATE_IMPORT_EXPORT_INCLUDES); do \ cat $$f >> $@; \ done else @@ -801,6 +1248,11 @@ endif ## Common object handling. ########################################################### +my_unused_src_files := $(filter-out $(logtags_sources) $(my_tracked_src_files),$(my_src_files) $(my_gen_src_files)) +ifneq ($(my_unused_src_files),) + $(warning $(LOCAL_MODULE_MAKEFILE): $(LOCAL_MODULE): Unused source files: $(my_unused_src_files)) +endif + # some rules depend on asm_objects being first. If your code depends on # being first, it's reasonable to require it to be assembly normal_objects := \ @@ -811,13 +1263,36 @@ normal_objects := \ $(c_objects) \ $(gen_c_objects) \ $(objc_objects) \ - $(yacc_objects) \ - $(lex_objects) \ - $(proto_generated_objects) \ - $(addprefix $(TOPDIR)$(LOCAL_PATH)/,$(LOCAL_PREBUILT_OBJ_FILES)) + $(objcpp_objects) + +new_order_normal_objects := $(foreach f,$(my_src_files),$(my_src_file_obj_$(f))) +new_order_normal_objects += $(foreach f,$(my_gen_src_files),$(my_src_file_obj_$(f))) + +ifneq ($(sort $(normal_objects)),$(sort $(new_order_normal_objects))) +$(warning $(LOCAL_MODULE_MAKEFILE) Internal build system warning: New object list does not match old) +$(info Only in old: $(filter-out $(new_order_normal_objects),$(sort $(normal_objects)))) +$(info Only in new: $(filter-out $(normal_objects),$(sort $(new_order_normal_objects)))) +endif + +ifeq ($(BINARY_OBJECTS_ORDER),soong) +normal_objects := $(new_order_normal_objects) +endif + +normal_objects += $(addprefix $(TOPDIR)$(LOCAL_PATH)/,$(LOCAL_PREBUILT_OBJ_FILES)) all_objects := $(normal_objects) $(gen_o_objects) +# Cleanup file tracking +$(foreach f,$(my_tracked_gen_files),$(eval my_src_file_gen_$(s):=)) +my_tracked_gen_files := +$(foreach f,$(my_tracked_src_files),$(eval my_src_file_obj_$(s):=)) +my_tracked_src_files := + +## 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 @@ -829,7 +1304,11 @@ endif # that custom build rules which generate .o files don't consume other generated # sources as input (or if they do they take care of that dependency themselves). $(normal_objects) : | $(my_generated_sources) +ifeq ($(BUILDING_WITH_NINJA),true) +$(all_objects) : $(import_includes) +else $(all_objects) : | $(import_includes) +endif ALL_C_CPP_ETC_OBJECTS += $(all_objects) @@ -871,6 +1350,7 @@ built_shared_libraries := \ $(addprefix $($(LOCAL_2ND_ARCH_VAR_PREFIX)$(my_prefix)OUT_INTERMEDIATE_LIBRARIES)/, \ $(addsuffix $(so_suffix), \ $(my_shared_libraries))) +built_shared_library_deps := $(addsuffix .toc, $(built_shared_libraries)) # Add the NDK libraries to the built module dependency my_system_shared_libraries_fullpath := \ @@ -884,12 +1364,20 @@ built_shared_libraries := \ $(addprefix $($(LOCAL_2ND_ARCH_VAR_PREFIX)$(my_prefix)OUT_INTERMEDIATE_LIBRARIES)/, \ $(addsuffix $(so_suffix), \ $(installed_shared_library_module_names))) +ifdef LOCAL_IS_HOST_MODULE +# Disable .toc optimization for host modules: we may run the host binaries during the build process +# and the libraries' implementation matters. +built_shared_library_deps := $(built_shared_libraries) +else +built_shared_library_deps := $(addsuffix .toc, $(built_shared_libraries)) +endif +my_system_shared_libraries_fullpath := endif built_static_libraries := \ $(foreach lib,$(my_static_libraries), \ $(call intermediates-dir-for, \ - STATIC_LIBRARIES,$(lib),$(LOCAL_IS_HOST_MODULE),,$(LOCAL_2ND_ARCH_VAR_PREFIX))/$(lib)$(a_suffix)) + STATIC_LIBRARIES,$(lib),$(LOCAL_IS_HOST_MODULE),,$(LOCAL_2ND_ARCH_VAR_PREFIX),$(my_host_cross))/$(lib)$(a_suffix)) ifdef LOCAL_SDK_VERSION built_static_libraries += $(my_ndk_stl_static_lib) @@ -898,7 +1386,7 @@ endif built_whole_libraries := \ $(foreach lib,$(my_whole_static_libraries), \ $(call intermediates-dir-for, \ - STATIC_LIBRARIES,$(lib),$(LOCAL_IS_HOST_MODULE),,$(LOCAL_2ND_ARCH_VAR_PREFIX))/$(lib)$(a_suffix)) + STATIC_LIBRARIES,$(lib),$(LOCAL_IS_HOST_MODULE),,$(LOCAL_2ND_ARCH_VAR_PREFIX),$(my_host_cross))/$(lib)$(a_suffix)) # We don't care about installed static libraries, since the # libraries have already been linked into the module at that point. @@ -919,40 +1407,52 @@ endif ########################################################### ifeq ($(my_clang),true) +my_cflags += $(LOCAL_CLANG_CFLAGS) +my_conlyflags += $(LOCAL_CLANG_CONLYFLAGS) +my_cppflags += $(LOCAL_CLANG_CPPFLAGS) +my_cflags_no_override += $(GLOBAL_CLANG_CFLAGS_NO_OVERRIDE) +my_cppflags_no_override += $(GLOBAL_CLANG_CPPFLAGS_NO_OVERRIDE) +my_asflags += $(LOCAL_CLANG_ASFLAGS) +my_ldflags += $(LOCAL_CLANG_LDFLAGS) +my_cflags += $(LOCAL_CLANG_CFLAGS_$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)) $(LOCAL_CLANG_CFLAGS_$(my_32_64_bit_suffix)) +my_conlyflags += $(LOCAL_CLANG_CONLYFLAGS_$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)) $(LOCAL_CLANG_CONLYFLAGS_$(my_32_64_bit_suffix)) +my_cppflags += $(LOCAL_CLANG_CPPFLAGS_$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)) $(LOCAL_CLANG_CPPFLAGS_$(my_32_64_bit_suffix)) +my_ldflags += $(LOCAL_CLANG_LDFLAGS_$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)) $(LOCAL_CLANG_LDFLAGS_$(my_32_64_bit_suffix)) +my_asflags += $(LOCAL_CLANG_ASFLAGS_$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)) $(LOCAL_CLANG_ASFLAGS_$(my_32_64_bit_suffix)) my_cflags := $(call $(LOCAL_2ND_ARCH_VAR_PREFIX)convert-to-$(my_host)clang-flags,$(my_cflags)) my_cppflags := $(call $(LOCAL_2ND_ARCH_VAR_PREFIX)convert-to-$(my_host)clang-flags,$(my_cppflags)) my_asflags := $(call $(LOCAL_2ND_ARCH_VAR_PREFIX)convert-to-$(my_host)clang-flags,$(my_asflags)) my_ldflags := $(call $(LOCAL_2ND_ARCH_VAR_PREFIX)convert-to-$(my_host)clang-flags,$(my_ldflags)) endif -ifeq ($(LOCAL_FDO_SUPPORT), true) - build_with_fdo := false - ifeq ($(BUILD_FDO_INSTRUMENT), true) - build_with_fdo := true - endif - ifeq ($(BUILD_FDO_OPTIMIZE), true) - build_with_fdo := true - endif - ifeq ($(build_with_fdo), true) - my_cflags := $(patsubst -Os,-O2,$(my_cflags)) - fdo_incompatible_flags=-fno-early-inlining -finline-limit=% - my_cflags := $(filter-out $(fdo_incompatible_flags),$(my_cflags)) - endif +ifeq ($(my_fdo_build), true) + my_cflags := $(patsubst -Os,-O2,$(my_cflags)) + fdo_incompatible_flags := -fno-early-inlining -finline-limit=% + my_cflags := $(filter-out $(fdo_incompatible_flags),$(my_cflags)) endif +# No one should ever use this flag. On GCC it's mere presence will disable all +# warnings, even those that are specified after it (contrary to typical warning +# flag behavior). This circumvents CFLAGS_NO_OVERRIDE from forcibly enabling the +# warnings that are *always* bugs. +my_illegal_flags := -w +my_cflags := $(filter-out $(my_illegal_flags),$(my_cflags)) +my_cppflags := $(filter-out $(my_illegal_flags),$(my_cppflags)) +my_conlyflags := $(filter-out $(my_illegal_flags),$(my_conlyflags)) + $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_YACCFLAGS := $(LOCAL_YACCFLAGS) $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_ASFLAGS := $(my_asflags) -$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_CONLYFLAGS := $(LOCAL_CONLYFLAGS) +$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_CONLYFLAGS := $(my_conlyflags) $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_CFLAGS := $(my_cflags) $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_CPPFLAGS := $(my_cppflags) +$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_CFLAGS_NO_OVERRIDE := $(my_cflags_no_override) +$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_CPPFLAGS_NO_OVERRIDE := $(my_cppflags_no_override) $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_RTTI_FLAG := $(LOCAL_RTTI_FLAG) $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_DEBUG_CFLAGS := $(debug_cflags) $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_C_INCLUDES := $(my_c_includes) $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_IMPORT_INCLUDES := $(import_includes) $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_LDFLAGS := $(my_ldflags) -$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_LDLIBS := $(LOCAL_LDLIBS) -$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_NO_CRT := $(strip $(LOCAL_NO_CRT) $(LOCAL_NO_CRT_$(TARGET_$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH))) -$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_LIBCXX := $(my_libcxx) +$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_LDLIBS := $(my_ldlibs) # this is really the way to get the files onto the command line instead # of using $^, because then LOCAL_ADDITIONAL_DEPENDENCIES doesn't work @@ -966,7 +1466,8 @@ $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_ALL_OBJECTS := $(all_objects) ########################################################### # all_libraries is used for the dependencies on LOCAL_BUILT_MODULE. all_libraries := \ - $(built_shared_libraries) \ + $(built_shared_library_deps) \ + $(my_system_shared_libraries_fullpath) \ $(built_static_libraries) \ $(built_whole_libraries) @@ -979,18 +1480,31 @@ $(LOCAL_INSTALLED_MODULE): | $(installed_static_library_notice_file_targets) # Export includes ########################################################### 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) +$(export_includes): PRIVATE_EXPORT_C_INCLUDE_DIRS := $(my_export_c_include_dirs) +# By adding $(my_generated_sources) it makes sure the headers get generated +# before any dependent source files get compiled. +$(export_includes) : $(my_generated_sources) $(export_include_deps) @echo Export includes file: $< -- $@ - $(hide) mkdir -p $(dir $@) && rm -f $@ -ifdef LOCAL_EXPORT_C_INCLUDE_DIRS + $(hide) mkdir -p $(dir $@) && rm -f $@.tmp +ifdef my_export_c_include_dirs $(hide) for d in $(PRIVATE_EXPORT_C_INCLUDE_DIRS); do \ - echo "-I $$d" >> $@; \ + echo "-I $$d" >> $@.tmp; \ done else - $(hide) touch $@ + $(hide) touch $@.tmp endif +ifeq ($(BUILDING_WITH_NINJA),true) + $(hide) if cmp -s $@.tmp $@ ; then \ + rm $@.tmp ; \ + else \ + mv $@.tmp $@ ; \ + fi +else + mv $@.tmp $@ ; +endif + +# Kati adds restat=1 to ninja. GNU make does nothing for this. +.KATI_RESTAT: $(export_includes) # Make sure export_includes gets generated when you are running mm/mmm $(LOCAL_BUILT_MODULE) : | $(export_includes) diff --git a/core/build-system.html b/core/build-system.html index caade583b..bddde6a4d 100644 --- a/core/build-system.html +++ b/core/build-system.html @@ -270,6 +270,7 @@

Build flavors/types

  • Installs non-APK modules that have no tags specified.
  • Installs APKs according to the product definition files; tags are ignored for APK modules. +
  • ro.adb.secure=1
  • ro.secure=1
  • ro.debuggable=0
  • adb is disabled by default. @@ -462,26 +463,17 @@

    Platform specific conditionals

    Sometimes you need to set flags specifically for different platforms. Here is a list of which values the different build-system defined variables will be set to and some examples.

    -

    For a device build, TARGET_OS is linux (we're using -linux!), and TARGET_ARCH is arm.

    -

    For a simulator build, TARGET_OS and TARGET_ARCH -are set to the same as HOST_OS and HOST_ARCH are -on your platform. TARGET_PRODUCT is the name of the target -hardware/product you are building for. The value sim is used -for the simulator. We haven't thought through the full extent of customization -that will happen here, but likely there will be additional UI configurations -specified here as well.

    - -
    HOST_OS
    linux
    - darwin
    - (cygwin) + darwin
    HOST_ARCH
    - x86 + x86
    + x86_64
    HOST_BUILD_TYPE
    @@ -490,43 +482,41 @@

    Platform specific conditionals

    - TARGET_OS
    - linux
    - darwin
    - (cygwin) -
    TARGET_ARCH
    arm
    - x86 + arm64
    + mips
    + mips64
    + x86
    + x86_64
    TARGET_BUILD_TYPE
    release
    debug
    - TARGET_PRODUCT
    - sim
    - dream
    - sooner -
    +

    There are also special variables to use instead of conditionals. Many of the +normal variables (LOCAL_SRC_FILES, LOCAL_CFLAGS, etc) can be conditionally added +to with _{arch} _{32|64}, and for the host, _{os}.

    +

    Some Examples

    ifeq ($(TARGET_BUILD_TYPE),release)
     LOCAL_CFLAGS += -DNDEBUG=1
     endif
     
    +LOCAL_CFLAGS_arm += -DTARGET_IS_ARM
    +
    +LOCAL_CFLAGS_64 += -DBIG_POINTER
    +
     # from libutils
    -ifeq ($(TARGET_OS),linux)
     # Use the futex based mutex and condition variable
     # implementation from android-arm because it's shared mem safe
    -LOCAL_SRC_FILES += futex_synchro.c
    -LOCAL_LDLIBS += -lrt -ldl
    -endif
    +LOCAL_SRC_FILES_linux += futex_synchro.c
    +LOCAL_LDLIBS_linux += -lrt -ldl
     
     
    @@ -554,7 +544,7 @@

    Putting modules elsewhere

    the unstripped executables so GDB can find the symbols. LOCAL_UNSTRIPPED_PATH is not necessary if you only specified LOCAL_MODULE_RELATIVE_PATH.

    -

    Look in config/envsetup.make for all of the variables defining +

    Look in core/envsetup.mk for all of the variables defining places to build things.

    FYI: If you're installing an executable to /sbin, you probably also want to set LOCAL_FORCE_STATIC_EXCUTABLE := true in your Android.mk, which @@ -587,6 +577,11 @@

    Android.mk variables

    and definitions that are specific to either the host or the target builds. Do not set variables that start with HOST_ or TARGET_ in your makefiles.
  • +
  • HOST_CROSS_ - These contain the directories and definitions that + are specific to cross-building host binaries. The common case is building + windows host tools on linux. Do not set variables that start with + HOST_CROSS_ in your makefiles. +
  • BUILD_ and CLEAR_VARS - These contain the names of well-defined template makefiles to include. Some examples are CLEAR_VARS and BUILD_HOST_PACKAGE.
  • @@ -773,13 +768,13 @@

    LOCAL_POST_PROCESS_COMMAND

    LOCAL_PREBUILT_EXECUTABLES

    -

    When including $(BUILD_PREBUILT) or $(BUILD_HOST_PREBUILT), set these to -executables that you want copied. They're located automatically into the +

    When including $(BUILD_MULTI_PREBUILT) or $(BUILD_HOST_PREBUILT), set these +to executables that you want copied. They're located automatically into the right bin directory.

    LOCAL_PREBUILT_LIBS

    -

    When including $(BUILD_PREBUILT) or $(BUILD_HOST_PREBUILT), set these to -libraries that you want copied. They're located automatically into the +

    When including $(BUILD_MULTI_PREBUILT) or $(BUILD_HOST_PREBUILT), set these +to libraries that you want copied. They're located automatically into the right lib directory.

    LOCAL_SHARED_LIBRARIES

    @@ -836,6 +831,16 @@

    LOCAL_MODULE_RELATIVE_PATH

    the relative path.

    See Putting modules elsewhere for more.

    +

    LOCAL_MODULE_HOST_OS

    +

    This specifies which OSes are supported by this host module. It is not used +for target builds. The accepted values here are combinations of +linux, darwin, and windows. By default, +linux and darwin(MacOS) are considered to be supported. If a module should +build under windows, you must specify windows, and any others to be supported. +Some examples:

    +

    LOCAL_MODULE_HOST_OS := linux
    +LOCAL_MODULE_HOST_OS := darwin linux windows

    +

    LOCAL_UNSTRIPPED_PATH

    Instructs the build system to put the unstripped version of the module somewhere other than what's normal for its type. Usually, you override this @@ -878,10 +883,10 @@

    Environment Setup / buildspec.mk Versioning

    If you make a change that requires an update, you need to update two places so this message will be printed.
      -
    • In config/envsetup.make, increment the +
    • In core/envsetup.mk, increment the CORRECT_BUILD_ENV_SEQUENCE_NUMBER definition.
    • In buildspec.mk.default, update the BUILD_ENV_SEQUENCE_DUMBER - definition to match the one in config/envsetup.make
    • + definition to match the one in core/envsetup.mk
    The scripts automatically get the value from the build system, so they will trigger the warning as well. @@ -900,53 +905,39 @@

    LOCAL_ADDITIONAL_DEPENDENCIES

    for some other dependency that isn't created automatically.

    LOCAL_BUILT_MODULE

    +

    This should not be used, since multiple binaries are now +created from a single module defintiion.

    When a module is built, the module is created in an intermediate directory then copied to its final location. LOCAL_BUILT_MODULE is the full path to the intermediate file. See LOCAL_INSTALLED_MODULE for the path to the final installed location of the module.

    -

    LOCAL_HOST

    -

    Set by the host_xxx.make includes to tell base_rules.make and the other -includes that we're building for the host. Kenneth did this as part of -openbinder, and I would like to clean it up so the rules, includes and -definitions aren't duplicated for host and target.

    +

    LOCAL_IS_HOST_MODULE

    +

    Set by the host_xxx.mk includes to tell base_rules.mk and the other +includes that we're building for the host.

    LOCAL_INSTALLED_MODULE

    +

    This should not be used, since multiple binaries are now +created from a single module defintiion.

    The fully qualified path name of the final location of the module. See LOCAL_BUILT_MODULE for the location of the intermediate file that the make rules should actually be constructing.

    -

    LOCAL_REPLACE_VARS

    -

    Used in some stuff remaining from the openbinder for building scripts -with particular values set,

    - -

    LOCAL_SCRIPTS

    -

    Used in some stuff remaining from the openbinder build system that we -might find handy some day.

    -

    LOCAL_MODULE_CLASS

    Which kind of module this is. This variable is used to construct other -variable names used to locate the modules. See base_rules.make and -envsetup.make.

    - -

    LOCAL_MODULE_NAME

    -

    Set to the leaf name of the LOCAL_BUILT_MODULE. I'm not sure, -but it looks like it's just used in the WHO_AM_I variable to identify -in the pretty printing what's being built.

    +variable names used to locate the modules. See base_rules.mk and +envsetup.mk.

    LOCAL_MODULE_SUFFIX

    The suffix that will be appended to LOCAL_MODULE to form LOCAL_MODULE_NAME. For example, .so, .a, .dylib.

    LOCAL_STRIP_MODULE

    -

    Calculated in base_rules.make to determine if this module should actually -be stripped or not, based on whether LOCAL_STRIPPABLE_MODULE -is set, and whether the combo is configured to ever strip modules. With -Iliyan's stripping tool, this might change.

    - -

    LOCAL_STRIPPABLE_MODULE

    -

    Set by the include makefiles if that type of module is strippable. -Executables and shared libraries are.

    +

    If set to true (the default), the binary will be stripped and a debug +link will be set up so that GDB will still work. If set to no_debuglink, +the binary will be stripped, but no debug link will be added. If set to +keep_symbols, it will strip the debug information, but keep the symbol table. +Any other value will prevent stripping.

    LOCAL_SYSTEM_SHARED_LIBRARIES

    Used while building the base libraries: libc, libm, libdl. Usually diff --git a/core/build_id.mk b/core/build_id.mk index 00a691f85..35b5a1b6f 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=NJH47F diff --git a/core/build_rro_package.mk b/core/build_rro_package.mk new file mode 100644 index 000000000..9865b33fe --- /dev/null +++ b/core/build_rro_package.mk @@ -0,0 +1,25 @@ +############################################################################# +## Standard rules for installing runtime resouce overlay APKs. +## +## Set LOCAL_RRO_THEME to the theme name if the package should apply only to +## a particular theme as set by ro.boot.vendor.overlay.theme system property. +## +## If LOCAL_RRO_THEME is not set, the package will apply always, independent +## of themes. +## +############################################################################# + +LOCAL_IS_RUNTIME_RESOURCE_OVERLAY := true + +ifneq ($(LOCAL_SRC_FILES),) + $(error runtime resource overlay package should not contain sources) +endif + +ifeq (S(LOCAL_RRO_THEME),) + LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR)/overlay +else + LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR)/overlay/$(LOCAL_RRO_THEME) +endif + +include $(BUILD_SYSTEM)/package.mk + diff --git a/core/ccache.mk b/core/ccache.mk new file mode 100644 index 000000000..b682aff2a --- /dev/null +++ b/core/ccache.mk @@ -0,0 +1,60 @@ +# +# Copyright (C) 2015 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. +# + +ifneq ($(filter-out false,$(USE_CCACHE)),) + # The default check uses size and modification time, causing false misses + # since the mtime depends when the repo was checked out + export CCACHE_COMPILERCHECK := content + + # See man page, optimizations to get more cache hits + # implies that __DATE__ and __TIME__ are not critical for functionality. + # Ignore include file modification time since it will depend on when + # the repo was checked out + export CCACHE_SLOPPINESS := time_macros,include_file_mtime,file_macro + + # Turn all preprocessor absolute paths into relative paths. + # Fixes absolute paths in preprocessed source due to use of -g. + # 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. + 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 + export CCACHE_CPP2 := true + + # Detect if the system already has ccache installed to use instead of the prebuilt + ccache := $(shell which ccache) + + ifeq ($(ccache),) + CCACHE_HOST_TAG := $(HOST_PREBUILT_TAG) + ccache := prebuilts/misc/$(CCACHE_HOST_TAG)/ccache/ccache + endif + + # Check that the executable is here. + ccache := $(strip $(wildcard $(ccache))) + ifdef ccache + ifndef CC_WRAPPER + CC_WRAPPER := $(ccache) + endif + ifndef CXX_WRAPPER + CXX_WRAPPER := $(ccache) + endif + ccache = + endif +endif diff --git a/core/checktree b/core/checktree index b0b9cfab6..287268328 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/HOST_CROSS_x86.mk b/core/clang/HOST_CROSS_x86.mk new file mode 100644 index 000000000..b78a0743b --- /dev/null +++ b/core/clang/HOST_CROSS_x86.mk @@ -0,0 +1,56 @@ + +include $(BUILD_SYSTEM)/clang/x86.mk + +CLANG_CONFIG_x86_HOST_CROSS_TRIPLE := i686-pc-mingw32 + +CLANG_CONFIG_x86_HOST_CROSS_EXTRA_ASFLAGS := \ + $(CLANG_CONFIG_EXTRA_ASFLAGS) \ + $(CLANG_CONFIG_HOST_CROSS_EXTRA_ASFLAGS) \ + $(CLANG_CONFIG_x86_EXTRA_ASFLAGS) \ + $(CLANG_CONFIG_x86_HOST_CROSS_COMBO_EXTRA_ASFLAGS) \ + -target $(CLANG_CONFIG_x86_HOST_CROSS_TRIPLE) + +CLANG_CONFIG_x86_HOST_CROSS_EXTRA_CFLAGS := \ + $(CLANG_CONFIG_EXTRA_CFLAGS) \ + $(CLANG_CONFIG_HOST_CROSS_EXTRA_CFLAGS) \ + $(CLANG_CONFIG_x86_EXTRA_CFLAGS) \ + $(CLANG_CONFIG_x86_HOST_CROSS_COMBO_EXTRA_CFLAGS) \ + $(CLANG_CONFIG_x86_HOST_CROSS_EXTRA_ASFLAGS) + +CLANG_CONFIG_x86_HOST_CROSS_EXTRA_CONLYFLAGS := \ + $(CLANG_CONFIG_EXTRA_CONLYFLAGS) \ + $(CLANG_CONFIG_HOST_CROSS_EXTRA_CONLYFLAGS) \ + $(CLANG_CONFIG_x86_EXTRA_CONLYFLAGS) \ + $(CLANG_CONFIG_x86_HOST_CROSS_COMBO_EXTRA_CONLYFLAGS) + +CLANG_CONFIG_x86_HOST_CROSS_EXTRA_CPPFLAGS := \ + $(CLANG_CONFIG_EXTRA_CPPFLAGS) \ + $(CLANG_CONFIG_HOST_CROSS_EXTRA_CPPFLAGS) \ + $(CLANG_CONFIG_x86_EXTRA_CPPFLAGS) \ + $(CLANG_CONFIG_x86_HOST_CROSS_COMBO_EXTRA_CPPFLAGS) \ + -target $(CLANG_CONFIG_x86_HOST_CROSS_TRIPLE) + +CLANG_CONFIG_x86_HOST_CROSS_EXTRA_LDFLAGS := \ + $(CLANG_CONFIG_EXTRA_LDFLAGS) \ + $(CLANG_CONFIG_HOST_CROSS_EXTRA_LDFLAGS) \ + $(CLANG_CONFIG_x86_EXTRA_LDFLAGS) \ + $(CLANG_CONFIG_x86_HOST_CROSS_COMBO_EXTRA_LDFLAGS) \ + -target $(CLANG_CONFIG_x86_HOST_CROSS_TRIPLE) + +$(clang_2nd_arch_prefix)CLANG_HOST_CROSS_GLOBAL_CFLAGS := \ + $(call convert-to-host-clang-flags,$($(clang_2nd_arch_prefix)HOST_CROSS_GLOBAL_CFLAGS)) \ + $(CLANG_CONFIG_x86_HOST_CROSS_EXTRA_CFLAGS) + +$(clang_2nd_arch_prefix)CLANG_HOST_CROSS_GLOBAL_CONLYFLAGS := \ + $(call convert-to-host-clang-flags,$($(clang_2nd_arch_prefix)HOST_CROSS_GLOBAL_CONLYFLAGS)) \ + $(CLANG_CONFIG_x86_HOST_CROSS_EXTRA_CONLYFLAGS) + +$(clang_2nd_arch_prefix)CLANG_HOST_CROSS_GLOBAL_CPPFLAGS := \ + $(call convert-to-host-clang-flags,$($(clang_2nd_arch_prefix)HOST_CROSS_GLOBAL_CPPFLAGS)) \ + $(CLANG_CONFIG_x86_HOST_CROSS_EXTRA_CPPFLAGS) + +$(clang_2nd_arch_prefix)CLANG_HOST_CROSS_GLOBAL_LDFLAGS := \ + $(call convert-to-host-clang-flags,$($(clang_2nd_arch_prefix)HOST_CROSS_GLOBAL_LDFLAGS)) \ + $(CLANG_CONFIG_x86_HOST_CROSS_EXTRA_LDFLAGS) + +$(clang_2nd_arch_prefix)HOST_CROSS_LIBPROFILE_RT := $(LLVM_RTLIB_PATH)/libclang_rt.profile-i686.a diff --git a/core/clang/HOST_CROSS_x86_64.mk b/core/clang/HOST_CROSS_x86_64.mk new file mode 100644 index 000000000..b6f2de976 --- /dev/null +++ b/core/clang/HOST_CROSS_x86_64.mk @@ -0,0 +1,56 @@ + +include $(BUILD_SYSTEM)/clang/x86_64.mk + +CLANG_CONFIG_x86_64_HOST_CROSS_TRIPLE := x86_64-pc-mingw32 + +CLANG_CONFIG_x86_64_HOST_CROSS_EXTRA_ASFLAGS := \ + $(CLANG_CONFIG_EXTRA_ASFLAGS) \ + $(CLANG_CONFIG_HOST_CROSS_EXTRA_ASFLAGS) \ + $(CLANG_CONFIG_x86_64_EXTRA_ASFLAGS) \ + $(CLANG_CONFIG_x86_64_HOST_CROSS_COMBO_EXTRA_ASFLAGS) \ + -target $(CLANG_CONFIG_x86_64_HOST_CROSS_TRIPLE) + +CLANG_CONFIG_x86_64_HOST_CROSS_EXTRA_CFLAGS := \ + $(CLANG_CONFIG_EXTRA_CFLAGS) \ + $(CLANG_CONFIG_HOST_CROSS_EXTRA_CFLAGS) \ + $(CLANG_CONFIG_x86_64_EXTRA_CFLAGS) \ + $(CLANG_CONFIG_x86_64_HOST_CROSS_COMBO_EXTRA_CFLAGS) \ + $(CLANG_CONFIG_x86_64_HOST_CROSS_EXTRA_ASFLAGS) + +CLANG_CONFIG_x86_64_HOST_CROSS_EXTRA_CONLYFLAGS := \ + $(CLANG_CONFIG_EXTRA_CONLYFLAGS) \ + $(CLANG_CONFIG_HOST_CROSS_EXTRA_CONLYFLAGS) \ + $(CLANG_CONFIG_x86_64_EXTRA_CONLYFLAGS) \ + $(CLANG_CONFIG_x86_64_HOST_CROSS_COMBO_EXTRA_CONLYFLAGS) + +CLANG_CONFIG_x86_64_HOST_CROSS_EXTRA_CPPFLAGS := \ + $(CLANG_CONFIG_EXTRA_CPPFLAGS) \ + $(CLANG_CONFIG_HOST_CROSS_EXTRA_CPPFLAGS) \ + $(CLANG_CONFIG_x86_64_EXTRA_CPPFLAGS) \ + $(CLANG_CONFIG_x86_64_HOST_CROSS_COMBO_EXTRA_CPPFLAGS) \ + -target $(CLANG_CONFIG_x86_64_HOST_CROSS_TRIPLE) + +CLANG_CONFIG_x86_64_HOST_CROSS_EXTRA_LDFLAGS := \ + $(CLANG_CONFIG_EXTRA_LDFLAGS) \ + $(CLANG_CONFIG_HOST_CROSS_EXTRA_LDFLAGS) \ + $(CLANG_CONFIG_x86_64_EXTRA_LDFLAGS) \ + $(CLANG_CONFIG_x86_64_HOST_CROSS_COMBO_EXTRA_LDFLAGS) \ + -target $(CLANG_CONFIG_x86_64_HOST_CROSS_TRIPLE) + +$(clang_2nd_arch_prefix)CLANG_HOST_CROSS_GLOBAL_CFLAGS := \ + $(call convert-to-host-clang-flags,$($(clang_2nd_arch_prefix)HOST_CROSS_GLOBAL_CFLAGS)) \ + $(CLANG_CONFIG_x86_64_HOST_CROSS_EXTRA_CFLAGS) + +$(clang_2nd_arch_prefix)CLANG_HOST_CROSS_GLOBAL_CONLYFLAGS := \ + $(call convert-to-host-clang-flags,$($(clang_2nd_arch_prefix)HOST_CROSS_GLOBAL_CONLYFLAGS)) \ + $(CLANG_CONFIG_x86_64_HOST_CROSS_EXTRA_CONLYFLAGS) + +$(clang_2nd_arch_prefix)CLANG_HOST_CROSS_GLOBAL_CPPFLAGS := \ + $(call convert-to-host-clang-flags,$($(clang_2nd_arch_prefix)HOST_CROSS_GLOBAL_CPPFLAGS)) \ + $(CLANG_CONFIG_x86_64_HOST_CROSS_EXTRA_CPPFLAGS) + +$(clang_2nd_arch_prefix)CLANG_HOST_CROSS_GLOBAL_LDFLAGS := \ + $(call convert-to-host-clang-flags,$($(clang_2nd_arch_prefix)HOST_CROSS_GLOBAL_LDFLAGS)) \ + $(CLANG_CONFIG_x86_64_HOST_CROSS_EXTRA_LDFLAGS) + +$(clang_2nd_arch_prefix)HOST_CROSS_LIBPROFILE_RT := $(LLVM_RTLIB_PATH)/libclang_rt.profile-x86_64.a diff --git a/core/clang/HOST_x86.mk b/core/clang/HOST_x86.mk index 510a74dc3..0ec64adba 100644 --- a/core/clang/HOST_x86.mk +++ b/core/clang/HOST_x86.mk @@ -11,9 +11,10 @@ CLANG_CONFIG_x86_HOST_COMBO_EXTRA_LDFLAGS := $(CLANG_CONFIG_x86_LINUX_HOST_EXTRA endif ifeq ($(HOST_OS),darwin) CLANG_CONFIG_x86_HOST_TRIPLE := i686-apple-darwin -endif -ifeq ($(HOST_OS),windows) -CLANG_CONFIG_x86_HOST_TRIPLE := i686-pc-mingw32 +CLANG_CONFIG_x86_HOST_COMBO_EXTRA_ASFLAGS := $(CLANG_CONFIG_x86_DARWIN_HOST_EXTRA_ASFLAGS) +CLANG_CONFIG_x86_HOST_COMBO_EXTRA_CFLAGS := $(CLANG_CONFIG_x86_DARWIN_HOST_EXTRA_CFLAGS) +CLANG_CONFIG_x86_HOST_COMBO_EXTRA_CPPFLAGS := $(CLANG_CONFIG_x86_DARWIN_HOST_EXTRA_CPPFLAGS) +CLANG_CONFIG_x86_HOST_COMBO_EXTRA_LDFLAGS := $(CLANG_CONFIG_x86_DARWIN_HOST_EXTRA_LDFLAGS) endif CLANG_CONFIG_x86_HOST_EXTRA_ASFLAGS := \ @@ -30,6 +31,12 @@ CLANG_CONFIG_x86_HOST_EXTRA_CFLAGS := \ $(CLANG_CONFIG_x86_HOST_COMBO_EXTRA_CFLAGS) \ $(CLANG_CONFIG_x86_HOST_EXTRA_ASFLAGS) +CLANG_CONFIG_x86_HOST_EXTRA_CONLYFLAGS := \ + $(CLANG_CONFIG_EXTRA_CONLYFLAGS) \ + $(CLANG_CONFIG_HOST_EXTRA_CONLYFLAGS) \ + $(CLANG_CONFIG_x86_EXTRA_CONLYFLAGS) \ + $(CLANG_CONFIG_x86_HOST_COMBO_EXTRA_CONLYFLAGS) + CLANG_CONFIG_x86_HOST_EXTRA_CPPFLAGS := \ $(CLANG_CONFIG_EXTRA_CPPFLAGS) \ $(CLANG_CONFIG_HOST_EXTRA_CPPFLAGS) \ @@ -55,6 +62,10 @@ $(clang_2nd_arch_prefix)CLANG_HOST_GLOBAL_CFLAGS := \ $(call $(clang_2nd_arch_prefix)convert-to-host-clang-flags,$($(clang_2nd_arch_prefix)HOST_GLOBAL_CFLAGS)) \ $(CLANG_CONFIG_x86_HOST_EXTRA_CFLAGS) +$(clang_2nd_arch_prefix)CLANG_HOST_GLOBAL_CONLYFLAGS := \ + $(call $(clang_2nd_arch_prefix)convert-to-host-clang-flags,$($(clang_2nd_arch_prefix)HOST_GLOBAL_CONLYFLAGS)) \ + $(CLANG_CONFIG_x86_HOST_EXTRA_CONLYFLAGS) + $(clang_2nd_arch_prefix)CLANG_HOST_GLOBAL_CPPFLAGS := \ $(call $(clang_2nd_arch_prefix)convert-to-host-clang-flags,$($(clang_2nd_arch_prefix)HOST_GLOBAL_CPPFLAGS)) \ $(CLANG_CONFIG_x86_HOST_EXTRA_CPPFLAGS) @@ -62,3 +73,5 @@ $(clang_2nd_arch_prefix)CLANG_HOST_GLOBAL_CPPFLAGS := \ $(clang_2nd_arch_prefix)CLANG_HOST_GLOBAL_LDFLAGS := \ $(call $(clang_2nd_arch_prefix)convert-to-host-clang-flags,$($(clang_2nd_arch_prefix)HOST_GLOBAL_LDFLAGS)) \ $(CLANG_CONFIG_x86_HOST_EXTRA_LDFLAGS) + +$(clang_2nd_arch_prefix)HOST_LIBPROFILE_RT := $(LLVM_RTLIB_PATH)/libclang_rt.profile-i686.a diff --git a/core/clang/HOST_x86_64.mk b/core/clang/HOST_x86_64.mk index 6b945258d..d46cb67e4 100644 --- a/core/clang/HOST_x86_64.mk +++ b/core/clang/HOST_x86_64.mk @@ -11,9 +11,10 @@ CLANG_CONFIG_x86_64_HOST_COMBO_EXTRA_LDFLAGS := $(CLANG_CONFIG_x86_LINUX_HOST_EX endif ifeq ($(HOST_OS),darwin) CLANG_CONFIG_x86_64_HOST_TRIPLE := x86_64-apple-darwin -endif -ifeq ($(HOST_OS),windows) -CLANG_CONFIG_x86_64_HOST_TRIPLE := x86_64-pc-mingw64 +CLANG_CONFIG_x86_64_HOST_COMBO_EXTRA_ASFLAGS := $(CLANG_CONFIG_x86_DARWIN_HOST_EXTRA_ASFLAGS) +CLANG_CONFIG_x86_64_HOST_COMBO_EXTRA_CFLAGS := $(CLANG_CONFIG_x86_DARWIN_HOST_EXTRA_CFLAGS) +CLANG_CONFIG_x86_64_HOST_COMBO_EXTRA_CPPFLAGS := $(CLANG_CONFIG_x86_DARWIN_HOST_EXTRA_CPPFLAGS) +CLANG_CONFIG_x86_64_HOST_COMBO_EXTRA_LDFLAGS := $(CLANG_CONFIG_x86_DARWIN_HOST_EXTRA_LDFLAGS) endif CLANG_CONFIG_x86_64_HOST_EXTRA_ASFLAGS := \ @@ -30,6 +31,12 @@ CLANG_CONFIG_x86_64_HOST_EXTRA_CFLAGS := \ $(CLANG_CONFIG_x86_64_HOST_COMBO_EXTRA_CFLAGS) \ $(CLANG_CONFIG_x86_64_HOST_EXTRA_ASFLAGS) +CLANG_CONFIG_x86_64_HOST_EXTRA_CONLYFLAGS := \ + $(CLANG_CONFIG_EXTRA_CONLYFLAGS) \ + $(CLANG_CONFIG_HOST_EXTRA_CONLYFLAGS) \ + $(CLANG_CONFIG_x86_64_EXTRA_CONLYFLAGS) \ + $(CLANG_CONFIG_x86_64_HOST_COMBO_EXTRA_CONLYFLAGS) + CLANG_CONFIG_x86_64_HOST_EXTRA_CPPFLAGS := \ $(CLANG_CONFIG_EXTRA_CPPFLAGS) \ $(CLANG_CONFIG_HOST_EXTRA_CPPFLAGS) \ @@ -55,6 +62,10 @@ CLANG_HOST_GLOBAL_CFLAGS := \ $(call convert-to-host-clang-flags,$(HOST_GLOBAL_CFLAGS)) \ $(CLANG_CONFIG_x86_64_HOST_EXTRA_CFLAGS) +CLANG_HOST_GLOBAL_CONLYFLAGS := \ + $(call convert-to-host-clang-flags,$(HOST_GLOBAL_CONLYFLAGS)) \ + $(CLANG_CONFIG_x86_64_HOST_EXTRA_CONLYFLAGS) + CLANG_HOST_GLOBAL_CPPFLAGS := \ $(call convert-to-host-clang-flags,$(HOST_GLOBAL_CPPFLAGS)) \ $(CLANG_CONFIG_x86_64_HOST_EXTRA_CPPFLAGS) @@ -62,3 +73,5 @@ CLANG_HOST_GLOBAL_CPPFLAGS := \ CLANG_HOST_GLOBAL_LDFLAGS := \ $(call convert-to-host-clang-flags,$(HOST_GLOBAL_LDFLAGS)) \ $(CLANG_CONFIG_x86_64_HOST_EXTRA_LDFLAGS) + +HOST_LIBPROFILE_RT := $(LLVM_RTLIB_PATH)/libclang_rt.profile-x86_64.a diff --git a/core/clang/HOST_x86_common.mk b/core/clang/HOST_x86_common.mk index 0241cb663..690c0f6b3 100644 --- a/core/clang/HOST_x86_common.mk +++ b/core/clang/HOST_x86_common.mk @@ -1,56 +1,55 @@ # Shared by HOST_x86.mk and HOST_x86_64.mk. ifeq ($(HOST_OS),darwin) -# nothing required here yet +CLANG_CONFIG_x86_DARWIN_HOST_EXTRA_ASFLAGS := \ + -integrated-as + +CLANG_CONFIG_x86_DARWIN_HOST_EXTRA_CFLAGS := \ + -integrated-as + +CLANG_CONFIG_x86_DARWIN_HOST_EXTRA_CFLAGS += -fstack-protector-strong endif ifeq ($(HOST_OS),linux) CLANG_CONFIG_x86_LINUX_HOST_EXTRA_ASFLAGS := \ --gcc-toolchain=$($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG) \ - --sysroot=$($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/sysroot \ - -no-integrated-as + --sysroot $($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/sysroot \ + -B$($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/x86_64-linux/bin CLANG_CONFIG_x86_LINUX_HOST_EXTRA_CFLAGS := \ - --gcc-toolchain=$($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG) \ - -no-integrated-as + --gcc-toolchain=$($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG) + +CLANG_CONFIG_x86_LINUX_HOST_EXTRA_CFLAGS += -fstack-protector-strong ifneq ($(strip $($(clang_2nd_arch_prefix)HOST_IS_64_BIT)),) CLANG_CONFIG_x86_LINUX_HOST_EXTRA_CPPFLAGS := \ --gcc-toolchain=$($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG) \ - --sysroot=$($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/sysroot \ - -isystem $($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/x86_64-linux/include/c++/4.6 \ - -isystem $($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/x86_64-linux/include/c++/4.6/x86_64-linux \ - -isystem $($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/x86_64-linux/include/c++/4.6/backward \ - -no-integrated-as + --sysroot $($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/sysroot \ + -isystem $($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/x86_64-linux/include/c++/4.8 \ + -isystem $($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/x86_64-linux/include/c++/4.8/x86_64-linux \ + -isystem $($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/x86_64-linux/include/c++/4.8/backward CLANG_CONFIG_x86_LINUX_HOST_EXTRA_LDFLAGS := \ --gcc-toolchain=$($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG) \ - --sysroot=$($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/sysroot \ + --sysroot $($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/sysroot \ -B$($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/x86_64-linux/bin \ - -B$($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/lib/gcc/x86_64-linux/4.6 \ - -L$($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/lib/gcc/x86_64-linux/4.6 \ - -L$($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/x86_64-linux/lib64/ \ - -no-integrated-as + -B$($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/lib/gcc/x86_64-linux/4.8 \ + -L$($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/lib/gcc/x86_64-linux/4.8 \ + -L$($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/x86_64-linux/lib64/ else CLANG_CONFIG_x86_LINUX_HOST_EXTRA_CPPFLAGS := \ --gcc-toolchain=$($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG) \ - --sysroot=$($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/sysroot \ - -isystem $($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/x86_64-linux/include/c++/4.6 \ - -isystem $($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/x86_64-linux/include/c++/4.6/x86_64-linux/32 \ - -isystem $($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/x86_64-linux/include/c++/4.6/backward \ - -no-integrated-as + --sysroot $($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/sysroot \ + -isystem $($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/x86_64-linux/include/c++/4.8 \ + -isystem $($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/x86_64-linux/include/c++/4.8/x86_64-linux/32 \ + -isystem $($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/x86_64-linux/include/c++/4.8/backward CLANG_CONFIG_x86_LINUX_HOST_EXTRA_LDFLAGS := \ --gcc-toolchain=$($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG) \ - --sysroot=$($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/sysroot \ + --sysroot $($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/sysroot \ -B$($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/x86_64-linux/bin \ - -B$($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/lib/gcc/x86_64-linux/4.6/32 \ - -L$($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/lib/gcc/x86_64-linux/4.6/32 \ - -L$($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/x86_64-linux/lib32/ \ - -no-integrated-as + -B$($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/lib/gcc/x86_64-linux/4.8/32 \ + -L$($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/lib/gcc/x86_64-linux/4.8/32 \ + -L$($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/x86_64-linux/lib32/ endif endif # Linux - -ifeq ($(HOST_OS),windows) -# nothing required here yet -endif diff --git a/core/clang/TARGET_arm.mk b/core/clang/TARGET_arm.mk index 59ed41f98..5c1bf6f80 100644 --- a/core/clang/TARGET_arm.mk +++ b/core/clang/TARGET_arm.mk @@ -19,6 +19,11 @@ CLANG_CONFIG_arm_TARGET_EXTRA_CFLAGS := \ -target $(CLANG_CONFIG_arm_TARGET_TRIPLE) \ $(CLANG_CONFIG_arm_TARGET_EXTRA_ASFLAGS) +CLANG_CONFIG_arm_TARGET_EXTRA_CONLYFLAGS := \ + $(CLANG_CONFIG_EXTRA_CONLYFLAGS) \ + $(CLANG_CONFIG_TARGET_EXTRA_CONLYFLAGS) \ + $(CLANG_CONFIG_arm_EXTRA_CONLYFLAGS) + CLANG_CONFIG_arm_TARGET_EXTRA_CPPFLAGS := \ $(CLANG_CONFIG_EXTRA_CPPFLAGS) \ $(CLANG_CONFIG_TARGET_EXTRA_CPPFLAGS) \ @@ -44,6 +49,10 @@ $(clang_2nd_arch_prefix)CLANG_TARGET_GLOBAL_CFLAGS := \ $(call $(clang_2nd_arch_prefix)convert-to-clang-flags,$($(clang_2nd_arch_prefix)TARGET_GLOBAL_CFLAGS)) \ $(CLANG_CONFIG_arm_TARGET_EXTRA_CFLAGS) +$(clang_2nd_arch_prefix)CLANG_TARGET_GLOBAL_CONLYFLAGS := \ + $(call $(clang_2nd_arch_prefix)convert-to-clang-flags,$($(clang_2nd_arch_prefix)TARGET_GLOBAL_CONLYFLAGS)) \ + $(CLANG_CONFIG_arm_TARGET_EXTRA_CONLYFLAGS) + $(clang_2nd_arch_prefix)CLANG_TARGET_GLOBAL_CPPFLAGS := \ $(call $(clang_2nd_arch_prefix)convert-to-clang-flags,$($(clang_2nd_arch_prefix)TARGET_GLOBAL_CPPFLAGS)) \ $(CLANG_CONFIG_arm_TARGET_EXTRA_CPPFLAGS) @@ -52,6 +61,12 @@ $(clang_2nd_arch_prefix)CLANG_TARGET_GLOBAL_LDFLAGS := \ $(call $(clang_2nd_arch_prefix)convert-to-clang-flags,$($(clang_2nd_arch_prefix)TARGET_GLOBAL_LDFLAGS)) \ $(CLANG_CONFIG_arm_TARGET_EXTRA_LDFLAGS) -$(clang_2nd_arch_prefix)RS_TRIPLE := armv7-none-linux-gnueabi +$(clang_2nd_arch_prefix)RS_TRIPLE := armv7-linux-androideabi $(clang_2nd_arch_prefix)RS_TRIPLE_CFLAGS := -RS_COMPAT_TRIPLE := armv7-none-linux-gnueabi +$(clang_2nd_arch_prefix)RS_COMPAT_TRIPLE := armv7-none-linux-gnueabi + +$(clang_2nd_arch_prefix)TARGET_LIBPROFILE_RT := $(LLVM_RTLIB_PATH)/libclang_rt.profile-arm-android.a + +# Address sanitizer clang config +$(clang_2nd_arch_prefix)ADDRESS_SANITIZER_RUNTIME_LIBRARY := libclang_rt.asan-arm-android +$(clang_2nd_arch_prefix)ADDRESS_SANITIZER_LINKER := /system/bin/linker_asan diff --git a/core/clang/TARGET_arm64.mk b/core/clang/TARGET_arm64.mk index 6f9e5406a..15b0172a6 100644 --- a/core/clang/TARGET_arm64.mk +++ b/core/clang/TARGET_arm64.mk @@ -18,6 +18,11 @@ CLANG_CONFIG_arm64_TARGET_EXTRA_CFLAGS := \ $(CLANG_CONFIG_arm64_EXTRA_CFLAGS) \ $(CLANG_CONFIG_arm64_TARGET_EXTRA_ASFLAGS) +CLANG_CONFIG_arm64_TARGET_EXTRA_CONLYFLAGS := \ + $(CLANG_CONFIG_EXTRA_CONLYFLAGS) \ + $(CLANG_CONFIG_TARGET_EXTRA_CONLYFLAGS) \ + $(CLANG_CONFIG_arm64_EXTRA_CONLYFLAGS) + CLANG_CONFIG_arm64_TARGET_EXTRA_CPPFLAGS := \ $(CLANG_CONFIG_EXTRA_CPPFLAGS) \ $(CLANG_CONFIG_TARGET_EXTRA_CPPFLAGS) \ @@ -42,6 +47,10 @@ CLANG_TARGET_GLOBAL_CFLAGS := \ $(call convert-to-clang-flags,$(TARGET_GLOBAL_CFLAGS)) \ $(CLANG_CONFIG_arm64_TARGET_EXTRA_CFLAGS) +CLANG_TARGET_GLOBAL_CONLYFLAGS := \ + $(call convert-to-clang-flags,$(TARGET_GLOBAL_CONLYFLAGS)) \ + $(CLANG_CONFIG_arm64_TARGET_EXTRA_CONLYFLAGS) + CLANG_TARGET_GLOBAL_CPPFLAGS := \ $(call convert-to-clang-flags,$(TARGET_GLOBAL_CPPFLAGS)) \ $(CLANG_CONFIG_arm64_TARGET_EXTRA_CPPFLAGS) @@ -53,3 +62,9 @@ CLANG_TARGET_GLOBAL_LDFLAGS := \ RS_TRIPLE := aarch64-linux-android RS_TRIPLE_CFLAGS := RS_COMPAT_TRIPLE := aarch64-linux-android + +TARGET_LIBPROFILE_RT := $(LLVM_RTLIB_PATH)/libclang_rt.profile-aarch64-android.a + +# Address sanitizer clang config +ADDRESS_SANITIZER_RUNTIME_LIBRARY := libclang_rt.asan-aarch64-android +ADDRESS_SANITIZER_LINKER := /system/bin/linker_asan64 diff --git a/core/clang/TARGET_mips.mk b/core/clang/TARGET_mips.mk index 91067f58a..1a0176a5a 100644 --- a/core/clang/TARGET_mips.mk +++ b/core/clang/TARGET_mips.mk @@ -9,6 +9,7 @@ CLANG_CONFIG_mips_TARGET_EXTRA_ASFLAGS := \ $(CLANG_CONFIG_EXTRA_ASFLAGS) \ $(CLANG_CONFIG_TARGET_EXTRA_ASFLAGS) \ $(CLANG_CONFIG_mips_EXTRA_ASFLAGS) \ + -fPIC \ -target $(CLANG_CONFIG_mips_TARGET_TRIPLE) \ -B$(CLANG_CONFIG_mips_TARGET_TOOLCHAIN_PREFIX) @@ -18,6 +19,11 @@ CLANG_CONFIG_mips_TARGET_EXTRA_CFLAGS := \ $(CLANG_CONFIG_mips_EXTRA_CFLAGS) \ $(CLANG_CONFIG_mips_TARGET_EXTRA_ASFLAGS) +CLANG_CONFIG_mips_TARGET_EXTRA_CONLYFLAGS := \ + $(CLANG_CONFIG_EXTRA_CONLYFLAGS) \ + $(CLANG_CONFIG_TARGET_EXTRA_CONLYFLAGS) \ + $(CLANG_CONFIG_mips_EXTRA_CONLYFLAGS) + CLANG_CONFIG_mips_TARGET_EXTRA_CPPFLAGS := \ $(CLANG_CONFIG_EXTRA_CPPFLAGS) \ $(CLANG_CONFIG_TARGET_EXTRA_CPPFLAGS) \ @@ -42,6 +48,10 @@ $(clang_2nd_arch_prefix)CLANG_TARGET_GLOBAL_CFLAGS := \ $(call $(clang_2nd_arch_prefix)convert-to-clang-flags,$($(clang_2nd_arch_prefix)TARGET_GLOBAL_CFLAGS)) \ $(CLANG_CONFIG_mips_TARGET_EXTRA_CFLAGS) +$(clang_2nd_arch_prefix)CLANG_TARGET_GLOBAL_CONLYFLAGS := \ + $(call $(clang_2nd_arch_prefix)convert-to-clang-flags,$($(clang_2nd_arch_prefix)TARGET_GLOBAL_CONLYFLAGS)) \ + $(CLANG_CONFIG_mips_TARGET_EXTRA_CONLYFLAGS) + $(clang_2nd_arch_prefix)CLANG_TARGET_GLOBAL_CPPFLAGS := \ $(call $(clang_2nd_arch_prefix)convert-to-clang-flags,$($(clang_2nd_arch_prefix)TARGET_GLOBAL_CPPFLAGS)) \ $(CLANG_CONFIG_mips_TARGET_EXTRA_CPPFLAGS) @@ -50,6 +60,8 @@ $(clang_2nd_arch_prefix)CLANG_TARGET_GLOBAL_LDFLAGS := \ $(call $(clang_2nd_arch_prefix)convert-to-clang-flags,$($(clang_2nd_arch_prefix)TARGET_GLOBAL_LDFLAGS)) \ $(CLANG_CONFIG_mips_TARGET_EXTRA_LDFLAGS) -$(clang_2nd_arch_prefix)RS_TRIPLE := armv7-none-linux-gnueabi +$(clang_2nd_arch_prefix)RS_TRIPLE := armv7-linux-androideabi $(clang_2nd_arch_prefix)RS_TRIPLE_CFLAGS := RS_COMPAT_TRIPLE := mipsel-linux-android + +$(clang_2nd_arch_prefix)TARGET_LIBPROFILE_RT := $(LLVM_RTLIB_PATH)/libclang_rt.profile-mipsel-android.a diff --git a/core/clang/TARGET_mips64.mk b/core/clang/TARGET_mips64.mk index ab69aedab..104fb7021 100644 --- a/core/clang/TARGET_mips64.mk +++ b/core/clang/TARGET_mips64.mk @@ -18,6 +18,11 @@ CLANG_CONFIG_mips64_TARGET_EXTRA_CFLAGS := \ $(CLANG_CONFIG_mips64_EXTRA_CFLAGS) \ $(CLANG_CONFIG_mips64_TARGET_EXTRA_ASFLAGS) +CLANG_CONFIG_mips64_TARGET_EXTRA_CONLYFLAGS := \ + $(CLANG_CONFIG_EXTRA_CONLYFLAGS) \ + $(CLANG_CONFIG_TARGET_EXTRA_CONLYFLAGS) \ + $(CLANG_CONFIG_mips64_EXTRA_CONLYFLAGS) + CLANG_CONFIG_mips64_TARGET_EXTRA_CPPFLAGS := \ $(CLANG_CONFIG_EXTRA_CPPFLAGS) \ $(CLANG_CONFIG_TARGET_EXTRA_CPPFLAGS) \ @@ -42,6 +47,10 @@ CLANG_TARGET_GLOBAL_CFLAGS := \ $(call convert-to-clang-flags,$(TARGET_GLOBAL_CFLAGS)) \ $(CLANG_CONFIG_mips64_TARGET_EXTRA_CFLAGS) +CLANG_TARGET_GLOBAL_CONLYFLAGS := \ + $(call convert-to-clang-flags,$(TARGET_GLOBAL_CONLYFLAGS)) \ + $(CLANG_CONFIG_mips64_TARGET_EXTRA_CONLYFLAGS) + CLANG_TARGET_GLOBAL_CPPFLAGS := \ $(call convert-to-clang-flags,$(TARGET_GLOBAL_CPPFLAGS)) \ $(CLANG_CONFIG_mips64_TARGET_EXTRA_CPPFLAGS) @@ -53,3 +62,5 @@ CLANG_TARGET_GLOBAL_LDFLAGS := \ RS_TRIPLE := aarch64-linux-android RS_TRIPLE_CFLAGS := RS_COMPAT_TRIPLE := mips64el-linux-android + +TARGET_LIBPROFILE_RT := $(LLVM_RTLIB_PATH)/libclang_rt.profile-mips64el-android.a diff --git a/core/clang/TARGET_x86.mk b/core/clang/TARGET_x86.mk index 60ee06fda..741768b5e 100644 --- a/core/clang/TARGET_x86.mk +++ b/core/clang/TARGET_x86.mk @@ -18,7 +18,17 @@ CLANG_CONFIG_x86_TARGET_EXTRA_CFLAGS := \ $(CLANG_CONFIG_EXTRA_CFLAGS) \ $(CLANG_CONFIG_TARGET_EXTRA_CFLAGS) \ $(CLANG_CONFIG_x86_EXTRA_CFLAGS) \ - $(CLANG_CONFIG_x86_TARGET_EXTRA_ASFLAGS) + $(CLANG_CONFIG_x86_TARGET_EXTRA_ASFLAGS) \ + -mstackrealign + +# -mstackrealign is needed to realign stack in native code +# that could be called from JNI, so that movaps instruction +# will work on assumed stack aligned local variables. + +CLANG_CONFIG_x86_TARGET_EXTRA_CONLYFLAGS := \ + $(CLANG_CONFIG_EXTRA_CONLYFLAGS) \ + $(CLANG_CONFIG_TARGET_EXTRA_CONLYFLAGS) \ + $(CLANG_CONFIG_x86_EXTRA_CONLYFLAGS) CLANG_CONFIG_x86_TARGET_EXTRA_CPPFLAGS := \ $(CLANG_CONFIG_EXTRA_CPPFLAGS) \ @@ -44,6 +54,10 @@ $(clang_2nd_arch_prefix)CLANG_TARGET_GLOBAL_CFLAGS := \ $(call $(clang_2nd_arch_prefix)convert-to-clang-flags,$($(clang_2nd_arch_prefix)TARGET_GLOBAL_CFLAGS)) \ $(CLANG_CONFIG_x86_TARGET_EXTRA_CFLAGS) +$(clang_2nd_arch_prefix)CLANG_TARGET_GLOBAL_CONLYFLAGS := \ + $(call $(clang_2nd_arch_prefix)convert-to-clang-flags,$($(clang_2nd_arch_prefix)TARGET_GLOBAL_CONLYFLAGS)) \ + $(CLANG_CONFIG_x86_TARGET_EXTRA_CONLYFLAGS) + $(clang_2nd_arch_prefix)CLANG_TARGET_GLOBAL_CPPFLAGS := \ $(call $(clang_2nd_arch_prefix)convert-to-clang-flags,$($(clang_2nd_arch_prefix)TARGET_GLOBAL_CPPFLAGS)) \ $(CLANG_CONFIG_x86_TARGET_EXTRA_CPPFLAGS) @@ -52,6 +66,12 @@ $(clang_2nd_arch_prefix)CLANG_TARGET_GLOBAL_LDFLAGS := \ $(call $(clang_2nd_arch_prefix)convert-to-clang-flags,$($(clang_2nd_arch_prefix)TARGET_GLOBAL_LDFLAGS)) \ $(CLANG_CONFIG_x86_TARGET_EXTRA_LDFLAGS) -$(clang_2nd_arch_prefix)RS_TRIPLE := armv7-none-linux-gnueabi +$(clang_2nd_arch_prefix)RS_TRIPLE := armv7-linux-androideabi $(clang_2nd_arch_prefix)RS_TRIPLE_CFLAGS := -D__i386__ -RS_COMPAT_TRIPLE := i686-linux-android +$(clang_2nd_arch_prefix)RS_COMPAT_TRIPLE := i686-linux-android + +$(clang_2nd_arch_prefix)TARGET_LIBPROFILE_RT := $(LLVM_RTLIB_PATH)/libclang_rt.profile-i686-android.a + +# Address sanitizer clang config +$(clang_2nd_arch_prefix)ADDRESS_SANITIZER_RUNTIME_LIBRARY := libclang_rt.asan-i686-android +$(clang_2nd_arch_prefix)ADDRESS_SANITIZER_LINKER := /system/bin/linker_asan diff --git a/core/clang/TARGET_x86_64.mk b/core/clang/TARGET_x86_64.mk index 5561e4249..e44382dcb 100644 --- a/core/clang/TARGET_x86_64.mk +++ b/core/clang/TARGET_x86_64.mk @@ -18,6 +18,11 @@ CLANG_CONFIG_x86_64_TARGET_EXTRA_CFLAGS := \ $(CLANG_CONFIG_x86_64_EXTRA_CFLAGS) \ $(CLANG_CONFIG_x86_64_TARGET_EXTRA_ASFLAGS) +CLANG_CONFIG_x86_64_TARGET_EXTRA_CONLYFLAGS := \ + $(CLANG_CONFIG_EXTRA_CONLYFLAGS) \ + $(CLANG_CONFIG_TARGET_EXTRA_CONLYFLAGS) \ + $(CLANG_CONFIG_x86_64_EXTRA_CONLYFLAGS) + CLANG_CONFIG_x86_64_TARGET_EXTRA_CPPFLAGS := \ $(CLANG_CONFIG_EXTRA_CPPFLAGS) \ $(CLANG_CONFIG_TARGET_EXTRA_CPPFLAGS) \ @@ -42,6 +47,10 @@ CLANG_TARGET_GLOBAL_CFLAGS := \ $(call convert-to-clang-flags,$(TARGET_GLOBAL_CFLAGS)) \ $(CLANG_CONFIG_x86_64_TARGET_EXTRA_CFLAGS) +CLANG_TARGET_GLOBAL_CONLYFLAGS := \ + $(call convert-to-clang-flags,$(TARGET_GLOBAL_CONLYFLAGS)) \ + $(CLANG_CONFIG_x86_64_TARGET_EXTRA_CONLYFLAGS) + CLANG_TARGET_GLOBAL_CPPFLAGS := \ $(call convert-to-clang-flags,$(TARGET_GLOBAL_CPPFLAGS)) \ $(CLANG_CONFIG_x86_64_TARGET_EXTRA_CPPFLAGS) @@ -53,3 +62,5 @@ CLANG_TARGET_GLOBAL_LDFLAGS := \ RS_TRIPLE := aarch64-linux-android RS_TRIPLE_CFLAGS := -D__x86_64__ RS_COMPAT_TRIPLE := x86_64-linux-android + +TARGET_LIBPROFILE_RT := $(LLVM_RTLIB_PATH)/libclang_rt.profile-x86_64-android.a diff --git a/core/clang/arm.mk b/core/clang/arm.mk index 22c73977a..4053bb276 100644 --- a/core/clang/arm.mk +++ b/core/clang/arm.mk @@ -1,16 +1,18 @@ # Clang flags for arm arch, target or host. -CLANG_CONFIG_arm_EXTRA_ASFLAGS := \ - -no-integrated-as +CLANG_CONFIG_arm_EXTRA_ASFLAGS := -CLANG_CONFIG_arm_EXTRA_CFLAGS := \ - -no-integrated-as +CLANG_CONFIG_arm_EXTRA_CFLAGS := -CLANG_CONFIG_arm_EXTRA_CPPFLAGS := \ - -no-integrated-as +ifneq (,$(filter krait,$(TARGET_$(combo_2nd_arch_prefix)CPU_VARIANT))) + # Android's clang support's krait as a CPU whereas GCC doesn't. Specify + # -mcpu here rather than the more normal core/combo/arch/arm/armv7-a-neon.mk. + CLANG_CONFIG_arm_EXTRA_CFLAGS += -mcpu=krait -mfpu=neon-vfpv4 +endif -CLANG_CONFIG_arm_EXTRA_LDFLAGS := \ - -no-integrated-as +CLANG_CONFIG_arm_EXTRA_CPPFLAGS := + +CLANG_CONFIG_arm_EXTRA_LDFLAGS := # Include common unknown flags CLANG_CONFIG_arm_UNKNOWN_CFLAGS := \ @@ -19,14 +21,18 @@ CLANG_CONFIG_arm_UNKNOWN_CFLAGS := \ -fgcse-after-reload \ -frerun-cse-after-loop \ -frename-registers \ + -fno-align-jumps \ -fno-builtin-sin \ + -fno-caller-saves \ + -fno-early-inlining \ + -fno-move-loop-invariants \ + -fno-partial-inlining \ -fno-strict-volatile-bitfields \ - -fno-align-jumps \ - -Wa,--noexecstack + -fno-tree-copy-prop \ + -fno-tree-loop-optimize define subst-clang-incompatible-arm-flags $(subst -march=armv5te,-march=armv5t,\ $(subst -march=armv5e,-march=armv5,\ - $(subst -mcpu=cortex-a15,-march=armv7-a,\ - $(1)))) + $(1))) endef diff --git a/core/clang/arm64.mk b/core/clang/arm64.mk index 9fb36707a..cad7321ec 100644 --- a/core/clang/arm64.mk +++ b/core/clang/arm64.mk @@ -1,10 +1,8 @@ # Clang flags for arm64 arch, target or host. -CLANG_CONFIG_arm64_EXTRA_ASFLAGS := \ - -no-integrated-as +CLANG_CONFIG_arm64_EXTRA_ASFLAGS := -CLANG_CONFIG_arm64_EXTRA_CFLAGS := \ - -no-integrated-as +CLANG_CONFIG_arm64_EXTRA_CFLAGS := CLANG_CONFIG_arm64_EXTRA_LDFLAGS := @@ -15,8 +13,7 @@ CLANG_CONFIG_arm64_UNKNOWN_CFLAGS := \ -frerun-cse-after-loop \ -frename-registers \ -fno-strict-volatile-bitfields \ - -fno-align-jumps \ - -Wa,--noexecstack + -fno-align-jumps # We don't have any arm64 flags to substitute yet. define subst-clang-incompatible-arm64-flags diff --git a/core/clang/config.mk b/core/clang/config.mk index 5b2aea50d..6cc344637 100644 --- a/core/clang/config.mk +++ b/core/clang/config.mk @@ -1,13 +1,7 @@ ## Clang configurations. -# WITHOUT_CLANG covers both HOST and TARGET -ifeq ($(WITHOUT_CLANG),true) -WITHOUT_TARGET_CLANG := true -WITHOUT_HOST_CLANG := true -endif - -LLVM_PREBUILTS_PATH := prebuilts/clang/$(BUILD_OS)-x86/host/3.5/bin -LLVM_PREBUILTS_HEADER_PATH := prebuilts/clang/$(BUILD_OS)-x86/host/3.5/lib/clang/3.5/include/ +LLVM_PREBUILTS_PATH := $(LLVM_PREBUILTS_BASE)/$(BUILD_OS)-x86/$(LLVM_PREBUILTS_VERSION)/bin +LLVM_RTLIB_PATH := $(LLVM_PREBUILTS_PATH)/../lib64/clang/$(LLVM_RELEASE_VERSION)/lib/linux/ CLANG := $(LLVM_PREBUILTS_PATH)/clang$(BUILD_EXECUTABLE_SUFFIX) CLANG_CXX := $(LLVM_PREBUILTS_PATH)/clang++$(BUILD_EXECUTABLE_SUFFIX) @@ -17,21 +11,20 @@ LLVM_LINK := $(LLVM_PREBUILTS_PATH)/llvm-link$(BUILD_EXECUTABLE_SUFFIX) CLANG_TBLGEN := $(BUILD_OUT_EXECUTABLES)/clang-tblgen$(BUILD_EXECUTABLE_SUFFIX) LLVM_TBLGEN := $(BUILD_OUT_EXECUTABLES)/llvm-tblgen$(BUILD_EXECUTABLE_SUFFIX) -# The C/C++ compiler can be wrapped by setting the CC/CXX_WRAPPER vars. -ifdef CC_WRAPPER - ifneq ($(CC_WRAPPER),$(firstword $(CLANG))) - CLANG := $(CC_WRAPPER) $(CLANG) - endif -endif -ifdef CXX_WRAPPER - ifneq ($(CXX_WRAPPER),$(firstword $(CLANG_CXX))) - CLANG_CXX := $(CXX_WRAPPER) $(CLANG_CXX) - endif -endif +# RenderScript-specific tools +# These are tied to the version of LLVM directly in external/, so they might +# trail the host prebuilts being used for the rest of the build process. +RS_LLVM_PREBUILTS_VERSION := clang-2690385 +RS_LLVM_PREBUILTS_BASE := prebuilts/clang/host +RS_LLVM_PREBUILTS_PATH := $(RS_LLVM_PREBUILTS_BASE)/$(BUILD_OS)-x86/$(RS_LLVM_PREBUILTS_VERSION)/bin +RS_CLANG := $(RS_LLVM_PREBUILTS_PATH)/clang$(BUILD_EXECUTABLE_SUFFIX) +RS_LLVM_AS := $(RS_LLVM_PREBUILTS_PATH)/llvm-as$(BUILD_EXECUTABLE_SUFFIX) +RS_LLVM_LINK := $(RS_LLVM_PREBUILTS_PATH)/llvm-link$(BUILD_EXECUTABLE_SUFFIX) # Clang flags for all host or target rules CLANG_CONFIG_EXTRA_ASFLAGS := CLANG_CONFIG_EXTRA_CFLAGS := +CLANG_CONFIG_EXTRA_CONLYFLAGS := -std=gnu99 CLANG_CONFIG_EXTRA_CPPFLAGS := CLANG_CONFIG_EXTRA_LDFLAGS := @@ -42,17 +35,62 @@ CLANG_CONFIG_EXTRA_CFLAGS += \ CLANG_CONFIG_EXTRA_CFLAGS += \ -Werror=int-conversion +# Disable overly aggressive warning for macros defined with a leading underscore +# This used to happen in AndroidConfig.h, which was included everywhere. +# TODO: can we remove this now? +CLANG_CONFIG_EXTRA_CFLAGS += \ + -Wno-reserved-id-macro + +# Disable overly aggressive warning for format strings. +# Bug: 20148343 +CLANG_CONFIG_EXTRA_CFLAGS += \ + -Wno-format-pedantic + +# 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 + +# Disable -Winconsistent-missing-override until we can clean up the existing +# codebase for it. +CLANG_CONFIG_EXTRA_CPPFLAGS += \ + -Wno-inconsistent-missing-override + +# Force clang to always output color diagnostics. Ninja will strip the ANSI +# color codes if it is not running in a terminal. +ifdef BUILDING_WITH_NINJA +CLANG_CONFIG_EXTRA_CFLAGS += \ + -fcolor-diagnostics +endif + CLANG_CONFIG_UNKNOWN_CFLAGS := \ - -funswitch-loops \ - -fno-tree-sra \ + -finline-functions \ -finline-limit=64 \ - -Wno-psabi \ - -Wno-unused-but-set-variable \ - -Wno-unused-but-set-parameter \ + -fno-canonical-system-headers \ + -Wno-clobbered \ + -fno-devirtualize \ + -fno-tree-sra \ + -fprefetch-loop-arrays \ + -funswitch-loops \ + -Werror=unused-but-set-parameter \ + -Werror=unused-but-set-variable \ -Wmaybe-uninitialized \ - -Wno-maybe-uninitialized \ + -Wno-error=clobbered \ -Wno-error=maybe-uninitialized \ - -fno-canonical-system-headers + -Wno-error=unused-but-set-parameter \ + -Wno-error=unused-but-set-variable \ + -Wno-free-nonheap-object \ + -Wno-literal-suffix \ + -Wno-maybe-uninitialized \ + -Wno-old-style-declaration \ + -Wno-psabi \ + -Wno-unused-but-set-parameter \ + -Wno-unused-but-set-variable \ + -Wno-unused-local-typedefs \ + -Wunused-but-set-parameter \ + -Wunused-but-set-variable \ + -fdiagnostics-color \ + -fdebug-prefix-map=/proc/self/cwd= # Clang flags for all host rules CLANG_CONFIG_HOST_EXTRA_ASFLAGS := @@ -60,12 +98,44 @@ CLANG_CONFIG_HOST_EXTRA_CFLAGS := CLANG_CONFIG_HOST_EXTRA_CPPFLAGS := CLANG_CONFIG_HOST_EXTRA_LDFLAGS := +# Clang flags for all host cross rules +CLANG_CONFIG_HOST_CROSS_EXTRA_ASFLAGS := +CLANG_CONFIG_HOST_CROSS_EXTRA_CFLAGS := +CLANG_CONFIG_HOST_CROSS_EXTRA_CPPFLAGS := +CLANG_CONFIG_HOST_CROSS_EXTRA_LDFLAGS := + # Clang flags for all target rules CLANG_CONFIG_TARGET_EXTRA_ASFLAGS := CLANG_CONFIG_TARGET_EXTRA_CFLAGS := -nostdlibinc CLANG_CONFIG_TARGET_EXTRA_CPPFLAGS := -nostdlibinc CLANG_CONFIG_TARGET_EXTRA_LDFLAGS := +CLANG_DEFAULT_UB_CHECKS := \ + bool \ + integer-divide-by-zero \ + return \ + returns-nonnull-attribute \ + shift-exponent \ + unreachable \ + vla-bound \ + +# TODO(danalbert): The following checks currently have compiler performance +# issues. +# CLANG_DEFAULT_UB_CHECKS += alignment +# CLANG_DEFAULT_UB_CHECKS += bounds +# CLANG_DEFAULT_UB_CHECKS += enum +# CLANG_DEFAULT_UB_CHECKS += float-cast-overflow +# CLANG_DEFAULT_UB_CHECKS += float-divide-by-zero +# CLANG_DEFAULT_UB_CHECKS += nonnull-attribute +# CLANG_DEFAULT_UB_CHECKS += null +# CLANG_DEFAULT_UB_CHECKS += shift-base +# CLANG_DEFAULT_UB_CHECKS += signed-integer-overflow + +# TODO(danalbert): Fix UB in libc++'s __tree so we can turn this on. +# https://llvm.org/PR19302 +# http://reviews.llvm.org/D6974 +# CLANG_DEFAULT_UB_CHECKS += object-size + # HOST config clang_2nd_arch_prefix := include $(BUILD_SYSTEM)/clang/HOST_$(HOST_ARCH).mk @@ -76,6 +146,15 @@ clang_2nd_arch_prefix := $(HOST_2ND_ARCH_VAR_PREFIX) include $(BUILD_SYSTEM)/clang/HOST_$(HOST_2ND_ARCH).mk endif +ifdef HOST_CROSS_ARCH +clang_2nd_arch_prefix := +include $(BUILD_SYSTEM)/clang/HOST_CROSS_$(HOST_CROSS_ARCH).mk +ifdef HOST_CROSS_2ND_ARCH +clang_2nd_arch_prefix := $(HOST_CROSS_2ND_ARCH_VAR_PREFIX) +include $(BUILD_SYSTEM)/clang/HOST_CROSS_$(HOST_CROSS_2ND_ARCH).mk +endif +endif + # TARGET config clang_2nd_arch_prefix := include $(BUILD_SYSTEM)/clang/TARGET_$(TARGET_ARCH).mk @@ -86,18 +165,17 @@ clang_2nd_arch_prefix := $(TARGET_2ND_ARCH_VAR_PREFIX) include $(BUILD_SYSTEM)/clang/TARGET_$(TARGET_2ND_ARCH).mk endif - -# Clang compiler-specific libc headers -CLANG_CONFIG_EXTRA_HOST_C_INCLUDES := $(LLVM_PREBUILTS_HEADER_PATH) -CLANG_CONFIG_EXTRA_TARGET_C_INCLUDES := $(LLVM_PREBUILTS_HEADER_PATH) $(TARGET_OUT_HEADERS)/clang - -# Address sanitizer clang config -ADDRESS_SANITIZER_RUNTIME_LIBRARY := libclang_rt.asan_$(TARGET_ARCH)_android -ADDRESS_SANITIZER_CONFIG_EXTRA_CFLAGS := -fsanitize=address -fno-omit-frame-pointer +ADDRESS_SANITIZER_CONFIG_EXTRA_CFLAGS := -fno-omit-frame-pointer ADDRESS_SANITIZER_CONFIG_EXTRA_LDFLAGS := -Wl,-u,__asan_preinit -ADDRESS_SANITIZER_CONFIG_EXTRA_SHARED_LIBRARIES := libdl $(ADDRESS_SANITIZER_RUNTIME_LIBRARY) + +ADDRESS_SANITIZER_CONFIG_EXTRA_SHARED_LIBRARIES := ADDRESS_SANITIZER_CONFIG_EXTRA_STATIC_LIBRARIES := libasan # This allows us to use the superset of functionality that compiler-rt # provides to Clang (for supporting features like -ftrapv). COMPILER_RT_CONFIG_EXTRA_STATIC_LIBRARIES := libcompiler_rt-extras + +ifeq ($(HOST_PREFER_32_BIT),true) +# We don't have 32-bit prebuilt libLLVM/libclang, so force to build them from source. +FORCE_BUILD_LLVM_COMPONENTS := true +endif diff --git a/core/clang/mips.mk b/core/clang/mips.mk index 08daf403a..4a8f81224 100644 --- a/core/clang/mips.mk +++ b/core/clang/mips.mk @@ -12,8 +12,14 @@ CLANG_CONFIG_mips_UNKNOWN_CFLAGS := \ -frerun-cse-after-loop \ -frename-registers \ -msynci \ + -mno-synci \ -mno-fused-madd +# Temporary workaround for Mips clang++ problem, creates +# relocated ptrs in read-only pic .gcc_exception_table; +# permanent fix pending at http://reviews.llvm.org/D9669 +CLANG_CONFIG_mips_UNKNOWN_CFLAGS += -Wl,--warn-shared-textrel + # We don't have any mips flags to substitute yet. define subst-clang-incompatible-mips-flags $(1) diff --git a/core/clang/mips64.mk b/core/clang/mips64.mk index 612175c56..1b72e058f 100644 --- a/core/clang/mips64.mk +++ b/core/clang/mips64.mk @@ -12,8 +12,14 @@ CLANG_CONFIG_mips64_UNKNOWN_CFLAGS := \ -frerun-cse-after-loop \ -frename-registers \ -msynci \ + -mno-synci \ -mno-fused-madd +# Temporary workaround for Mips clang++ problem creating +# relocated ptrs in read-only pic .gcc_exception_table; +# permanent fix pending at http://reviews.llvm.org/D9669 +CLANG_CONFIG_mips64_UNKNOWN_CFLAGS += -Wl,--warn-shared-textrel + # We don't have any mips64 flags to substitute yet. define subst-clang-incompatible-mips64-flags $(1) diff --git a/core/clang/versions.mk b/core/clang/versions.mk new file mode 100644 index 000000000..81bd3b873 --- /dev/null +++ b/core/clang/versions.mk @@ -0,0 +1,5 @@ +## Clang/LLVM release versions. + +LLVM_RELEASE_VERSION := 3.8 +LLVM_PREBUILTS_VERSION ?= clang-2690385 +LLVM_PREBUILTS_BASE ?= prebuilts/clang/host diff --git a/core/cleanbuild.mk b/core/cleanbuild.mk index cf980d8e0..5c3369a1f 100644 --- a/core/cleanbuild.mk +++ b/core/cleanbuild.mk @@ -54,6 +54,7 @@ endef # can have permission to touch it. include $(BUILD_SYSTEM)/cleanspec.mk INTERNAL_CLEAN_BUILD_VERSION := $(strip $(INTERNAL_CLEAN_BUILD_VERSION)) +INTERNAL_CLEAN_STEPS := $(strip $(INTERNAL_CLEAN_STEPS)) # If the clean_steps.mk file is missing (usually after a clean build) # then we won't do anything. @@ -105,20 +106,39 @@ else _crs_new_cmd := steps := endif -CURRENT_CLEAN_BUILD_VERSION := -CURRENT_CLEAN_STEPS := # Write the new state to the file. # +rewrite_clean_steps_file := +ifneq ($(CURRENT_CLEAN_BUILD_VERSION)-$(CURRENT_CLEAN_STEPS),$(INTERNAL_CLEAN_BUILD_VERSION)-$(INTERNAL_CLEAN_STEPS)) +rewrite_clean_steps_file := true +endif +ifeq ($(wildcard $(clean_steps_file)),) +# This is the first build. +rewrite_clean_steps_file := true +endif +ifeq ($(rewrite_clean_steps_file),true) $(shell \ mkdir -p $(dir $(clean_steps_file)) && \ echo "CURRENT_CLEAN_BUILD_VERSION := $(INTERNAL_CLEAN_BUILD_VERSION)" > \ $(clean_steps_file) ;\ - echo "CURRENT_CLEAN_STEPS := $(INTERNAL_CLEAN_STEPS)" >> \ - $(clean_steps_file) \ + echo "CURRENT_CLEAN_STEPS := $(wordlist 1,500,$(INTERNAL_CLEAN_STEPS))" >> $(clean_steps_file) \ ) +define -cs-write-clean-steps-if-arg1-not-empty +$(if $(1),$(shell echo "CURRENT_CLEAN_STEPS += $(1)" >> $(clean_steps_file))) +endef +$(call -cs-write-clean-steps-if-arg1-not-empty,$(wordlist 501,1000,$(INTERNAL_CLEAN_STEPS))) +$(call -cs-write-clean-steps-if-arg1-not-empty,$(wordlist 1001,1500,$(INTERNAL_CLEAN_STEPS))) +$(call -cs-write-clean-steps-if-arg1-not-empty,$(wordlist 1501,2000,$(INTERNAL_CLEAN_STEPS))) +$(call -cs-write-clean-steps-if-arg1-not-empty,$(wordlist 2001,2500,$(INTERNAL_CLEAN_STEPS))) +$(call -cs-write-clean-steps-if-arg1-not-empty,$(wordlist 2501,3000,$(INTERNAL_CLEAN_STEPS))) +$(call -cs-write-clean-steps-if-arg1-not-empty,$(wordlist 3001,99999,$(INTERNAL_CLEAN_STEPS))) +endif +CURRENT_CLEAN_BUILD_VERSION := +CURRENT_CLEAN_STEPS := clean_steps_file := +rewrite_clean_steps_file := INTERNAL_CLEAN_STEPS := INTERNAL_CLEAN_BUILD_VERSION := @@ -137,15 +157,23 @@ aapt_config_list := $(strip $(PRODUCT_AAPT_CONFIG) $(PRODUCT_AAPT_PREF_CONFIG)) current_build_config := \ $(TARGET_PRODUCT)-$(TARGET_BUILD_VARIANT)-{$(aapt_config_list)} +current_sanitize_target := $(strip $(SANITIZE_TARGET)) +ifeq (,$(current_sanitize_target)) + current_sanitize_target := false +endif aapt_config_list := force_installclean := false +force_objclean := false # Read the current state from the file, if present. # Will set PREVIOUS_BUILD_CONFIG. # PREVIOUS_BUILD_CONFIG := +PREVIOUS_SANITIZE_TARGET := -include $(previous_build_config_file) PREVIOUS_BUILD_CONFIG := $(strip $(PREVIOUS_BUILD_CONFIG)) +PREVIOUS_SANITIZE_TARGET := $(strip $(PREVIOUS_SANITIZE_TARGET)) + ifdef PREVIOUS_BUILD_CONFIG ifneq "$(current_build_config)" "$(PREVIOUS_BUILD_CONFIG)" $(info *** Build configuration changed: "$(PREVIOUS_BUILD_CONFIG)" -> "$(current_build_config)") @@ -156,15 +184,27 @@ ifdef PREVIOUS_BUILD_CONFIG endif endif endif # else, this is the first build, so no need to clean. -PREVIOUS_BUILD_CONFIG := + +ifdef PREVIOUS_SANITIZE_TARGET + ifneq "$(current_sanitize_target)" "$(PREVIOUS_SANITIZE_TARGET)" + $(info *** SANITIZE_TARGET changed: "$(PREVIOUS_SANITIZE_TARGET)" -> "$(current_sanitize_target)") + force_objclean := true + endif +endif # else, this is the first build, so no need to clean. # Write the new state to the file. # +ifneq ($(PREVIOUS_BUILD_CONFIG)-$(PREVIOUS_SANITIZE_TARGET),$(current_build_config)-$(current_sanitize_target)) $(shell \ mkdir -p $(dir $(previous_build_config_file)) && \ echo "PREVIOUS_BUILD_CONFIG := $(current_build_config)" > \ + $(previous_build_config_file) && \ + echo "PREVIOUS_SANITIZE_TARGET := $(current_sanitize_target)" >> \ $(previous_build_config_file) \ ) +endif +PREVIOUS_BUILD_CONFIG := +PREVIOUS_SANITIZE_TARGET := previous_build_config_file := current_build_config := @@ -194,6 +234,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 \ @@ -202,16 +243,19 @@ installclean_files := \ $(PRODUCT_OUT)/recovery \ $(PRODUCT_OUT)/root \ $(PRODUCT_OUT)/system \ + $(PRODUCT_OUT)/system_other \ $(PRODUCT_OUT)/vendor \ $(PRODUCT_OUT)/oem \ $(PRODUCT_OUT)/dex_bootjars \ $(PRODUCT_OUT)/obj/JAVA_LIBRARIES \ $(PRODUCT_OUT)/obj/FAKE \ $(PRODUCT_OUT)/obj/EXECUTABLES/adbd_intermediates \ + $(PRODUCT_OUT)/obj/EXECUTABLES/logd_intermediates \ $(PRODUCT_OUT)/obj/STATIC_LIBRARIES/libfs_mgr_intermediates \ $(PRODUCT_OUT)/obj/EXECUTABLES/init_intermediates \ $(PRODUCT_OUT)/obj/ETC/mac_permissions.xml_intermediates \ $(PRODUCT_OUT)/obj/ETC/sepolicy_intermediates \ + $(PRODUCT_OUT)/obj/ETC/sepolicy.recovery_intermediates \ $(PRODUCT_OUT)/obj/ETC/init.environ.rc_intermediates # The files/dirs to delete during a dataclean, which removes any files @@ -221,6 +265,12 @@ dataclean_files := \ $(PRODUCT_OUT)/data-qemu/* \ $(PRODUCT_OUT)/userdata-qemu.img +# The files/dirs to delete during an objclean, which removes any files +# in the staging and emulator data partitions. +objclean_files := \ + $(TARGET_OUT_INTERMEDIATES) \ + $($(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_INTERMEDIATES) + # make sure *_OUT is set so that we won't result in deleting random parts # of the filesystem. ifneq (2,$(words $(HOST_OUT) $(PRODUCT_OUT))) @@ -240,6 +290,12 @@ installclean: dataclean $(hide) rm -rf $(FILES) @echo "Deleted images and staging directories." +.PHONY: objclean +objclean: FILES := $(objclean_files) +objclean: + $(hide) rm -rf $(FILES) + @echo "Deleted images and staging directories." + ifeq "$(force_installclean)" "true" $(info *** Forcing "make installclean"...) $(info *** rm -rf $(dataclean_files) $(installclean_files)) @@ -247,3 +303,31 @@ ifeq "$(force_installclean)" "true" $(info *** Done with the cleaning, now starting the real build.) endif force_installclean := + +ifeq "$(force_objclean)" "true" + $(info *** Forcing cleanup of intermediate files...) + $(info *** rm -rf $(objclean_files)) + $(shell rm -rf $(objclean_files)) + $(info *** Done with the cleaning, now starting the real build.) +endif +force_objclean := + +########################################################### + +.PHONY: clean-jack-files +clean-jack-files: clean-dex-files + $(hide) find $(OUT_DIR) -name "*.jack" | xargs rm -f + $(hide) find $(OUT_DIR) -type d -name "jack" | xargs rm -rf + @echo "All jack files have been removed." + +.PHONY: clean-dex-files +clean-dex-files: + $(hide) find $(OUT_DIR) -name "*.dex" ! -path "*/jack-incremental/*" | xargs rm -f + $(hide) for i in `find $(OUT_DIR) -name "*.jar" -o -name "*.apk"` ; do ((unzip -l $$i 2> /dev/null | \ + grep -q "\.dex$$" && rm -f $$i) || continue ) ; done + @echo "All dex files and archives containing dex files have been removed." + +.PHONY: clean-jack-incremental +clean-jack-incremental: + $(hide) find $(OUT_DIR) -name "jack-incremental" -type d | xargs rm -rf + @echo "All jack incremental dirs have been removed." diff --git a/core/cleanspec.mk b/core/cleanspec.mk index 500ce54f6..4441e2ac3 100644 --- a/core/cleanspec.mk +++ b/core/cleanspec.mk @@ -64,6 +64,6 @@ INTERNAL_CLEAN_BUILD_VERSION := 6 # ************************************************ subdir_cleanspecs := \ - $(shell build/tools/findleaves.py --prune=$(OUT_DIR) --prune=.repo --prune=.git . CleanSpec.mk) + $(shell build/tools/findleaves.py $(FIND_LEAVES_EXCLUDES) . CleanSpec.mk) include $(subdir_cleanspecs) subdir_cleanspecs := diff --git a/core/clear_vars.mk b/core/clear_vars.mk index bf81ebf12..09eddce0d 100644 --- a/core/clear_vars.mk +++ b/core/clear_vars.mk @@ -28,6 +28,7 @@ LOCAL_REQUIRED_MODULES:= LOCAL_ACP_UNAVAILABLE:= LOCAL_MODULE_TAGS:= LOCAL_SRC_FILES:= +LOCAL_SRC_FILES_EXCLUDE:= LOCAL_PREBUILT_OBJ_FILES:= LOCAL_STATIC_JAVA_LIBRARIES:= LOCAL_STATIC_JAVA_AAR_LIBRARIES:= @@ -47,11 +48,16 @@ LOCAL_YACCFLAGS:= LOCAL_ASFLAGS:= LOCAL_CFLAGS:= LOCAL_CPPFLAGS:= +LOCAL_CLANG_ASFLAGS:= +LOCAL_CLANG_CFLAGS:= +LOCAL_CLANG_CONLYFLAGS:= +LOCAL_CLANG_CPPFLAGS:= LOCAL_CONLYFLAGS:= LOCAL_RTTI_FLAG:= LOCAL_C_INCLUDES:= LOCAL_EXPORT_C_INCLUDE_DIRS:= LOCAL_LDFLAGS:= +LOCAL_CLANG_LDFLAGS:= LOCAL_LDLIBS:= LOCAL_AAPT_FLAGS:= LOCAL_AAPT_INCLUDE_ALL_RESOURCES:= @@ -68,6 +74,7 @@ LOCAL_JAVA_LIBRARIES:= LOCAL_JAVA_LAYERS_FILE:= LOCAL_NO_STANDARD_LIBRARIES:= LOCAL_CLASSPATH:= +LOCAL_JACK_CLASSPATH:= LOCAL_DROIDDOC_USE_STANDARD_DOCLET:= LOCAL_DROIDDOC_SOURCE_PATH:= LOCAL_DROIDDOC_TEMPLATE_DIR:= @@ -76,6 +83,7 @@ LOCAL_DROIDDOC_ASSET_DIR:= LOCAL_DROIDDOC_CUSTOM_ASSET_DIR:= LOCAL_DROIDDOC_OPTIONS:= LOCAL_DROIDDOC_HTML_DIR:= +LOCAL_DROIDDOC_STUB_OUT_DIR:= LOCAL_ADDITIONAL_HTML_DIR:= LOCAL_ASSET_DIR:= LOCAL_RESOURCE_DIR:= @@ -86,8 +94,8 @@ LOCAL_COPY_HEADERS_TO:= LOCAL_COPY_HEADERS:= LOCAL_FORCE_STATIC_EXECUTABLE:= LOCAL_ADDITIONAL_DEPENDENCIES:= -LOCAL_COMPRESS_MODULE_SYMBOLS:= LOCAL_STRIP_MODULE:= +LOCAL_PACK_MODULE_RELOCATIONS:= LOCAL_JNI_SHARED_LIBRARIES:= LOCAL_JNI_SHARED_LIBRARIES_ABI:= LOCAL_PREBUILT_JNI_LIBS:= @@ -97,17 +105,26 @@ LOCAL_APK_LIBRARIES:= LOCAL_RES_LIBRARIES:= LOCAL_MANIFEST_INSTRUMENTATION_FOR:= LOCAL_AIDL_INCLUDES:= +LOCAL_VTS_INCLUDES:= +LOCAL_AIDL_FLAGS:= LOCAL_JARJAR_RULES:= LOCAL_ADDITIONAL_JAVA_DIR:= LOCAL_ALLOW_UNDEFINED_SYMBOLS:= LOCAL_DX_FLAGS:= +LOCAL_JACK_ENABLED:=$(DEFAULT_JACK_ENABLED) # '' (ie disabled), disabled, full, incremental +LOCAL_JACK_FLAGS:= +LOCAL_JACK_COVERAGE_INCLUDE_FILTER:= +LOCAL_JACK_COVERAGE_EXCLUDE_FILTER:= +LOCAL_JILL_FLAGS:= LOCAL_CERTIFICATE:= LOCAL_SDK_VERSION:= +LOCAL_MIN_SDK_VERSION:= LOCAL_SDK_RES_VERSION:= LOCAL_NDK_STL_VARIANT:= LOCAL_EMMA_INSTRUMENT:= LOCAL_PROGUARD_ENABLED:= # '',full,custom,nosystem,disabled,obfuscation,optimization LOCAL_PROGUARD_FLAGS:= +LOCAL_JACK_PROGUARD_FLAGS:= LOCAL_PROGUARD_FLAG_FILES:= LOCAL_TEST_MODULE_TO_PROGUARD_WITH:= LOCAL_EMMA_COVERAGE_FILTER:= @@ -120,34 +137,40 @@ LOCAL_RENDERSCRIPT_INCLUDES_OVERRIDE:= LOCAL_RENDERSCRIPT_CC:= LOCAL_RENDERSCRIPT_COMPATIBILITY:= LOCAL_RENDERSCRIPT_FLAGS:= -LOCAL_RENDERSCRIPT_SKIP_INSTALL:= LOCAL_RENDERSCRIPT_TARGET_API:= LOCAL_DEX_PREOPT:= # '',true,false,nostripping LOCAL_DEX_PREOPT_IMAGE_LOCATION:= LOCAL_DEX_PREOPT_FLAGS:= -LOCAL_PROTOC_OPTIMIZE_TYPE:= # lite(default),micro,nano,full +LOCAL_PROTOC_OPTIMIZE_TYPE:= # lite(default),micro,nano,full,nanopb-c,nanopb-c-enable_malloc LOCAL_PROTOC_FLAGS:= LOCAL_PROTO_JAVA_OUTPUT_PARAMS:= +LOCAL_VTSC_FLAGS:= LOCAL_NO_CRT:= +LOCAL_NO_LIBGCC:= LOCAL_PROPRIETARY_MODULE:= LOCAL_OEM_MODULE:= +LOCAL_ODM_MODULE:= LOCAL_PRIVILEGED_MODULE:= LOCAL_MODULE_OWNER:= +LOCAL_COMPATIBILITY_SUITE:= +LOCAL_COMPATIBILITY_SUPPORT_FILES:= LOCAL_CTS_TEST_PACKAGE:= LOCAL_CTS_TEST_RUNNER:= LOCAL_CLANG:= -LOCAL_ADDRESS_SANITIZER:= +LOCAL_SDCLANG:= +LOCAL_SDCLANG_LTO:= +LOCAL_SDCLANG_EXTRA_FLAGS_32:= LOCAL_JAR_EXCLUDE_FILES:= LOCAL_JAR_PACKAGES:= LOCAL_JAR_EXCLUDE_PACKAGES:= -LOCAL_LINT_FLAGS:= LOCAL_SOURCE_FILES_ALL_GENERATED:= # '',true # Don't delete the META_INF dir when merging static Java libraries. LOCAL_DONT_DELETE_JAR_META_INF:= +LOCAL_DONT_DELETE_JAR_DIRS:= LOCAL_ADDITIONAL_CERTIFICATES:= LOCAL_PREBUILT_MODULE_FILE:= +LOCAL_POST_LINK_CMD:= LOCAL_POST_INSTALL_CMD:= -LOCAL_DIST_BUNDLED_BINARIES:= LOCAL_HAL_STATIC_LIBRARIES:= LOCAL_RMTYPEDEFS:= LOCAL_NO_SYNTAX_CHECK:= @@ -159,17 +182,47 @@ LOCAL_MODULE_TARGET_ARCH_WARN:= LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH:= LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH_WARN:= LOCAL_MODULE_HOST_ARCH:= +LOCAL_MODULE_HOST_ARCH_WARN:= +LOCAL_MODULE_UNSUPPORTED_HOST_ARCH:= +LOCAL_MODULE_UNSUPPORTED_HOST_ARCH_WARN:= +LOCAL_MODULE_HOST_CROSS_ARCH:= +LOCAL_MODULE_HOST_CROSS_ARCH_WARN:= +LOCAL_MODULE_UNSUPPORTED_HOST_CROSS_ARCH:= +LOCAL_MODULE_UNSUPPORTED_HOST_CROSS_ARCH_WARN:= +LOCAL_NO_FPIE := +LOCAL_CXX_STL := default +LOCAL_NATIVE_COVERAGE := LOCAL_DPI_VARIANTS:= LOCAL_DPI_FILE_STEM:= +LOCAL_SANITIZE:= +LOCAL_SANITIZE_RECOVER:= +LOCAL_DATA_BINDING:= +LOCAL_DBUS_PROXY_PREFIX:= +LOCAL_INIT_RC:= +LOCAL_MODULE_HOST_OS:= +LOCAL_FINDBUGS_FLAGS:= +LOCAL_NOTICE_FILE:= +LOCAL_USE_AAPT2:=$(USE_AAPT2) +LOCAL_STATIC_ANDROID_LIBRARIES:= +LOCAL_SHARED_ANDROID_LIBRARIES:= +# Used to replace the installed file of a presigned prebuilt apk in PDK fusion build, +# to avoid installing the presigned apks with classes.dex unstripped. +LOCAL_REPLACE_PREBUILT_APK_INSTALLED:= +LOCAL_EXTRACT_APK:= +LOCAL_EXTRACT_DPI_APK:= # arch specific variables LOCAL_SRC_FILES_$(TARGET_ARCH):= +LOCAL_SRC_FILES_EXCLUDE_$(TARGET_ARCH):= LOCAL_CFLAGS_$(TARGET_ARCH):= +LOCAL_CLANG_CFLAGS_$(TARGET_ARCH):= LOCAL_CPPFLAGS_$(TARGET_ARCH):= +LOCAL_CLANG_CPPFLAGS_$(TARGET_ARCH):= LOCAL_C_INCLUDES_$(TARGET_ARCH):= LOCAL_ASFLAGS_$(TARGET_ARCH):= -LOCAL_NO_CRT_$(TARGET_ARCH):= +LOCAL_CLANG_ASFLAGS_$(TARGET_ARCH):= LOCAL_LDFLAGS_$(TARGET_ARCH):= +LOCAL_CLANG_LDFLAGS_$(TARGET_ARCH):= LOCAL_SHARED_LIBRARIES_$(TARGET_ARCH):= LOCAL_STATIC_LIBRARIES_$(TARGET_ARCH):= LOCAL_WHOLE_STATIC_LIBRARIES_$(TARGET_ARCH):= @@ -177,14 +230,20 @@ LOCAL_GENERATED_SOURCES_$(TARGET_ARCH):= LOCAL_REQUIRED_MODULES_$(TARGET_ARCH):= LOCAL_CLANG_$(TARGET_ARCH):= LOCAL_PREBUILT_JNI_LIBS_$(TARGET_ARCH):= +LOCAL_STRIP_MODULE_$(TARGET_ARCH):= +LOCAL_PACK_MODULE_RELOCATIONS_$(TARGET_ARCH):= ifdef TARGET_2ND_ARCH LOCAL_SRC_FILES_$(TARGET_2ND_ARCH):= +LOCAL_SRC_FILES_EXCLUDE_$(TARGET_2ND_ARCH):= LOCAL_CFLAGS_$(TARGET_2ND_ARCH):= +LOCAL_CLANG_CFLAGS_$(TARGET_2ND_ARCH):= LOCAL_CPPFLAGS_$(TARGET_2ND_ARCH):= +LOCAL_CLANG_CPPFLAGS_$(TARGET_2ND_ARCH):= LOCAL_C_INCLUDES_$(TARGET_2ND_ARCH):= LOCAL_ASFLAGS_$(TARGET_2ND_ARCH):= -LOCAL_NO_CRT_$(TARGET_2ND_ARCH):= +LOCAL_CLANG_ASFLAGS_$(TARGET_2ND_ARCH):= LOCAL_LDFLAGS_$(TARGET_2ND_ARCH):= +LOCAL_CLANG_LDFLAGS_$(TARGET_2ND_ARCH):= LOCAL_SHARED_LIBRARIES_$(TARGET_2ND_ARCH):= LOCAL_STATIC_LIBRARIES_$(TARGET_2ND_ARCH):= LOCAL_WHOLE_STATIC_LIBRARIES_$(TARGET_2ND_ARCH):= @@ -192,14 +251,20 @@ LOCAL_GENERATED_SOURCES_$(TARGET_2ND_ARCH):= LOCAL_REQUIRED_MODULES_$(TARGET_2ND_ARCH):= LOCAL_CLANG_$(TARGET_2ND_ARCH):= LOCAL_PREBUILT_JNI_LIBS_$(TARGET_2ND_ARCH):= +LOCAL_STRIP_MODULE_$(TARGET_2ND_ARCH):= +LOCAL_PACK_MODULE_RELOCATIONS_$(TARGET_2ND_ARCH):= endif LOCAL_SRC_FILES_$(HOST_ARCH):= +LOCAL_SRC_FILES_EXCLUDE_$(HOST_ARCH):= LOCAL_CFLAGS_$(HOST_ARCH):= +LOCAL_CLANG_CFLAGS_$(HOST_ARCH):= LOCAL_CPPFLAGS_$(HOST_ARCH):= +LOCAL_CLANG_CPPFLAGS_$(HOST_ARCH):= LOCAL_C_INCLUDES_$(HOST_ARCH):= LOCAL_ASFLAGS_$(HOST_ARCH):= -LOCAL_NO_CRT_$(HOST_ARCH):= +LOCAL_CLANG_ASFLAGS_$(HOST_ARCH):= LOCAL_LDFLAGS_$(HOST_ARCH):= +LOCAL_CLANG_LDFLAGS_$(HOST_ARCH):= LOCAL_SHARED_LIBRARIES_$(HOST_ARCH):= LOCAL_STATIC_LIBRARIES_$(HOST_ARCH):= LOCAL_WHOLE_STATIC_LIBRARIES_$(HOST_ARCH):= @@ -208,12 +273,16 @@ LOCAL_REQUIRED_MODULES_$(HOST_ARCH):= LOCAL_CLANG_$(HOST_ARCH):= ifdef HOST_2ND_ARCH LOCAL_SRC_FILES_$(HOST_2ND_ARCH):= +LOCAL_SRC_FILES_EXCLUDE_$(HOST_2ND_ARCH):= LOCAL_CFLAGS_$(HOST_2ND_ARCH):= +LOCAL_CLANG_CFLAGS_$(HOST_2ND_ARCH):= LOCAL_CPPFLAGS_$(HOST_2ND_ARCH):= +LOCAL_CLANG_CPPFLAGS_$(HOST_2ND_ARCH):= LOCAL_C_INCLUDES_$(HOST_2ND_ARCH):= LOCAL_ASFLAGS_$(HOST_2ND_ARCH):= -LOCAL_NO_CRT_$(HOST_2ND_ARCH):= +LOCAL_CLANG_ASFLAGS_$(HOST_2ND_ARCH):= LOCAL_LDFLAGS_$(HOST_2ND_ARCH):= +LOCAL_CLANG_LDFLAGS_$(HOST_2ND_ARCH):= LOCAL_SHARED_LIBRARIES_$(HOST_2ND_ARCH):= LOCAL_STATIC_LIBRARIES_$(HOST_2ND_ARCH):= LOCAL_WHOLE_STATIC_LIBRARIES_$(HOST_2ND_ARCH):= @@ -222,8 +291,47 @@ LOCAL_REQUIRED_MODULES_$(HOST_2ND_ARCH):= LOCAL_CLANG_$(HOST_2ND_ARCH):= endif +LOCAL_SRC_FILES_$(HOST_OS):= +LOCAL_STATIC_LIBRARIES_$(HOST_OS):= +LOCAL_SHARED_LIBRARIES_$(HOST_OS):= +LOCAL_CFLAGS_$(HOST_OS):= +LOCAL_CPPFLAGS_$(HOST_OS):= +LOCAL_LDFLAGS_$(HOST_OS):= +LOCAL_LDLIBS_$(HOST_OS):= +LOCAL_ASFLAGS_$(HOST_OS):= +LOCAL_C_INCLUDES_$(HOST_OS):= +LOCAL_GENERATED_SOURCES_$(HOST_OS):= +LOCAL_REQUIRED_MODULES_$(HOST_OS):= + +ifdef HOST_CROSS_OS +LOCAL_SRC_FILES_$(HOST_CROSS_OS):= +LOCAL_STATIC_LIBRARIES_$(HOST_CROSS_OS):= +LOCAL_SHARED_LIBRARIES_$(HOST_CROSS_OS):= +LOCAL_CFLAGS_$(HOST_CROSS_OS):= +LOCAL_CPPFLAGS_$(HOST_CROSS_OS):= +LOCAL_LDFLAGS_$(HOST_CROSS_OS):= +LOCAL_LDLIBS_$(HOST_CROSS_OS):= +LOCAL_ASFLAGS_$(HOST_CROSS_OS):= +LOCAL_C_INCLUDES_$(HOST_CROSS_OS):= +LOCAL_GENERATED_SOURCES_$(HOST_CROSS_OS):= +LOCAL_REQUIRED_MODULES_$(HOST_CROSS_OS):= +endif + +LOCAL_SRC_FILES_$(HOST_OS)_$(HOST_ARCH):= +ifdef HOST_2ND_ARCH +LOCAL_SRC_FILES_$(HOST_OS)_$(HOST_2ND_ARCH):= +endif +ifdef HOST_CROSS_OS +LOCAL_SRC_FILES_$(HOST_CROSS_OS)_$(HOST_CROSS_ARCH):= +ifdef HOST_CROSS_2ND_ARCH +LOCAL_SRC_FILES_$(HOST_CROSS_OS)_$(HOST_CROSS_2ND_ARCH):= +endif +endif + LOCAL_SRC_FILES_32:= LOCAL_SRC_FILES_64:= +LOCAL_SRC_FILES_EXCLUDE_32:= +LOCAL_SRC_FILES_EXCLUDE_64:= LOCAL_SHARED_LIBRARIES_32:= LOCAL_SHARED_LIBRARIES_64:= LOCAL_STATIC_LIBRARIES_32:= @@ -240,6 +348,14 @@ LOCAL_LDFLAGS_32:= LOCAL_LDFLAGS_64:= LOCAL_ASFLAGS_32:= LOCAL_ASFLAGS_64:= +LOCAL_CLANG_CFLAGS_32:= +LOCAL_CLANG_CFLAGS_64:= +LOCAL_CLANG_CPPFLAGS_32:= +LOCAL_CLANG_CPPFLAGS_64:= +LOCAL_CLANG_LDFLAGS_32:= +LOCAL_CLANG_LDFLAGS_64:= +LOCAL_CLANG_ASFLAGS_32:= +LOCAL_CLANG_ASFLAGS_64:= LOCAL_C_INCLUDES_32:= LOCAL_C_INCLUDES_64:= LOCAL_MODULE_PATH_32:= @@ -248,6 +364,16 @@ LOCAL_MODULE_STEM_32:= LOCAL_MODULE_STEM_64:= LOCAL_CLANG_32:= LOCAL_CLANG_64:= +LOCAL_INIT_RC_32:= +LOCAL_INIT_RC_64:= +LOCAL_JAVA_LANGUAGE_VERSION:= +LOCAL_IS_RUNTIME_RESOURCE_OVERLAY:= +LOCAL_RRO_THEME:= + +LOCAL_PROTOC_OUTPUT:= + +# 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. diff --git a/core/combo/HOST_CROSS_windows-x86.mk b/core/combo/HOST_CROSS_windows-x86.mk new file mode 100644 index 000000000..6180a265a --- /dev/null +++ b/core/combo/HOST_CROSS_windows-x86.mk @@ -0,0 +1,65 @@ +# +# Copyright (C) 2006 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. +# + +# Settings to use MinGW as a cross-compiler under Linux +# Included by combo/select.make + +$(combo_var_prefix)GLOBAL_CFLAGS += -DUSE_MINGW -DWIN32_LEAN_AND_MEAN +$(combo_var_prefix)GLOBAL_CFLAGS += -Wno-unused-parameter +$(combo_var_prefix)GLOBAL_CFLAGS += --sysroot prebuilts/gcc/linux-x86/host/x86_64-w64-mingw32-4.8/x86_64-w64-mingw32 +$(combo_var_prefix)GLOBAL_CFLAGS += -m32 +$(combo_var_prefix)GLOBAL_LDFLAGS += -m32 +TOOLS_PREFIX := prebuilts/gcc/linux-x86/host/x86_64-w64-mingw32-4.8/bin/x86_64-w64-mingw32- +$(combo_var_prefix)C_INCLUDES += prebuilts/gcc/linux-x86/host/x86_64-w64-mingw32-4.8/x86_64-w64-mingw32/include +$(combo_var_prefix)C_INCLUDES += prebuilts/gcc/linux-x86/host/x86_64-w64-mingw32-4.8/lib/gcc/x86_64-w64-mingw32/4.8.3/include +$(combo_var_prefix)GLOBAL_LD_DIRS += -Lprebuilts/gcc/linux-x86/host/x86_64-w64-mingw32-4.8/x86_64-w64-mingw32/lib32 + +# Workaround differences in inttypes.h between host and target. +# See bug 12708004. +$(combo_var_prefix)GLOBAL_CFLAGS += -D__STDC_FORMAT_MACROS -D__STDC_CONSTANT_MACROS +# Use C99-compliant printf functions (%zd). +$(combo_var_prefix)GLOBAL_CFLAGS += -D__USE_MINGW_ANSI_STDIO=1 +# Admit to using >= Vista. Both are needed because of <_mingw.h>. +$(combo_var_prefix)GLOBAL_CFLAGS += -D_WIN32_WINNT=0x0600 -DWINVER=0x0600 +# Get 64-bit off_t and related functions. +$(combo_var_prefix)GLOBAL_CFLAGS += -D_FILE_OFFSET_BITS=64 + +$(combo_var_prefix)CC := $(TOOLS_PREFIX)gcc +$(combo_var_prefix)CXX := $(TOOLS_PREFIX)g++ +$(combo_var_prefix)AR := $(TOOLS_PREFIX)ar +$(combo_var_prefix)NM := $(TOOLS_PREFIX)nm +$(combo_var_prefix)OBJDUMP := $(TOOLS_PREFIX)objdump + +define $(combo_var_prefix)transform-shared-lib-to-toc +$(hide) $($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)OBJDUMP) -x $(1) | grep "^Name" | cut -f3 -d" " > $(2) +$(hide) $($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)NM) -g -f p $(1) | cut -f1-2 -d" " >> $(2) +endef + +$(combo_var_prefix)GLOBAL_LDFLAGS += \ + --enable-stdcall-fixup + +ifneq ($(strip $(BUILD_HOST_static)),) +# Statically-linked binaries are desirable for sandboxed environment +$(combo_var_prefix)GLOBAL_LDFLAGS += -static +endif # BUILD_HOST_static + +$(combo_var_prefix)SHLIB_SUFFIX := .dll +$(combo_var_prefix)EXECUTABLE_SUFFIX := .exe + +$(combo_var_prefix)IS_64_BIT := + +# The mingw gcc is 4.8, 4.9 is required for color diagnostics +$(combo_var_prefix)UNKNOWN_CFLAGS := -fdiagnostics-color diff --git a/core/combo/HOST_CROSS_windows-x86_64.mk b/core/combo/HOST_CROSS_windows-x86_64.mk new file mode 100644 index 000000000..e9b19cf95 --- /dev/null +++ b/core/combo/HOST_CROSS_windows-x86_64.mk @@ -0,0 +1,65 @@ +# +# Copyright (C) 2006 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. +# + +# Settings to use MinGW as a cross-compiler under Linux +# Included by combo/select.make + +$(combo_var_prefix)GLOBAL_CFLAGS += -DUSE_MINGW -DWIN32_LEAN_AND_MEAN +$(combo_var_prefix)GLOBAL_CFLAGS += -Wno-unused-parameter +$(combo_var_prefix)GLOBAL_CFLAGS += --sysroot prebuilts/gcc/linux-x86/host/x86_64-w64-mingw32-4.8/x86_64-w64-mingw32 +$(combo_var_prefix)GLOBAL_CFLAGS += -m64 +$(combo_var_prefix)GLOBAL_LDFLAGS += -m64 +TOOLS_PREFIX := prebuilts/gcc/linux-x86/host/x86_64-w64-mingw32-4.8/bin/x86_64-w64-mingw32- +$(combo_var_prefix)C_INCLUDES += prebuilts/gcc/linux-x86/host/x86_64-w64-mingw32-4.8/x86_64-w64-mingw32/include +$(combo_var_prefix)C_INCLUDES += prebuilts/gcc/linux-x86/host/x86_64-w64-mingw32-4.8/lib/gcc/x86_64-w64-mingw32/4.8.3/include +$(combo_var_prefix)GLOBAL_LD_DIRS += -Lprebuilts/gcc/linux-x86/host/x86_64-w64-mingw32-4.8/x86_64-w64-mingw32/lib64 + +# Workaround differences in inttypes.h between host and target. +# See bug 12708004. +$(combo_var_prefix)GLOBAL_CFLAGS += -D__STDC_FORMAT_MACROS -D__STDC_CONSTANT_MACROS +# Use C99-compliant printf functions (%zd). +$(combo_var_prefix)GLOBAL_CFLAGS += -D__USE_MINGW_ANSI_STDIO=1 +# Admit to using >= Vista. Both are needed because of <_mingw.h>. +$(combo_var_prefix)GLOBAL_CFLAGS += -D_WIN32_WINNT=0x0600 -DWINVER=0x0600 +# Get 64-bit off_t and related functions. +$(combo_var_prefix)GLOBAL_CFLAGS += -D_FILE_OFFSET_BITS=64 + +$(combo_var_prefix)CC := $(TOOLS_PREFIX)gcc +$(combo_var_prefix)CXX := $(TOOLS_PREFIX)g++ +$(combo_var_prefix)AR := $(TOOLS_PREFIX)ar +$(combo_var_prefix)NM := $(TOOLS_PREFIX)nm +$(combo_var_prefix)OBJDUMP := $(TOOLS_PREFIX)objdump + +define $(combo_var_prefix)transform-shared-lib-to-toc +$(hide) $($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)OBJDUMP) -x $(1) | grep "^Name" | cut -f3 -d" " > $(2) +$(hide) $($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)NM) -g -f p $(1) | cut -f1-2 -d" " >> $(2) +endef + +$(combo_var_prefix)GLOBAL_LDFLAGS += \ + --enable-stdcall-fixup + +ifneq ($(strip $(BUILD_HOST_static)),) +# Statically-linked binaries are desirable for sandboxed environment +$(combo_var_prefix)GLOBAL_LDFLAGS += -static +endif # BUILD_HOST_static + +$(combo_var_prefix)SHLIB_SUFFIX := .dll +$(combo_var_prefix)EXECUTABLE_SUFFIX := .exe + +$(combo_var_prefix)IS_64_BIT := true + +# The mingw gcc is 4.8, 4.9 is required for color diagnostics +$(combo_var_prefix)UNKNOWN_CFLAGS := -fdiagnostics-color diff --git a/core/combo/HOST_darwin-x86.mk b/core/combo/HOST_darwin-x86.mk index ec379936f..4ba05ce31 100644 --- a/core/combo/HOST_darwin-x86.mk +++ b/core/combo/HOST_darwin-x86.mk @@ -33,19 +33,12 @@ include $(BUILD_COMBOS)/mac_version.mk $(combo_2nd_arch_prefix)HOST_TOOLCHAIN_ROOT := prebuilts/gcc/darwin-x86/host/i686-apple-darwin-4.2.1 $(combo_2nd_arch_prefix)HOST_TOOLCHAIN_PREFIX := $($(combo_2nd_arch_prefix)HOST_TOOLCHAIN_ROOT)/bin/i686-apple-darwin$(gcc_darwin_version) -# 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++ -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 -$(combo_2nd_arch_prefix)HOST_GLOBAL_CFLAGS += -isystem $(host_toolchain_header) -endif -else -$(combo_2nd_arch_prefix)HOST_CC := gcc -$(combo_2nd_arch_prefix)HOST_CXX := g++ -endif # $(HOST_TOOLCHAIN_PREFIX)-gcc exists + +define $(combo_var_prefix)transform-shared-lib-to-toc +$(call _gen_toc_command_for_macho,$(1),$(2)) +endef # gcc location for clang; to be updated when clang is updated # HOST_TOOLCHAIN_ROOT is a Darwin-specific define @@ -54,6 +47,13 @@ $(combo_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG := $($(combo_2nd_arch_prefix)HO $(combo_2nd_arch_prefix)HOST_AR := $(AR) $(combo_2nd_arch_prefix)HOST_GLOBAL_CFLAGS += -isysroot $(mac_sdk_root) -mmacosx-version-min=$(mac_sdk_version) -DMACOSX_DEPLOYMENT_TARGET=$(mac_sdk_version) +ifeq (,$(wildcard $(mac_sdk_path)/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1)) +# libc++ header locations for XCode CLT 7.1+ +$(combo_2nd_arch_prefix)HOST_GLOBAL_CPPFLAGS += -isystem $(mac_sdk_path)/usr/include/c++/v1 +else +# libc++ header locations for pre-XCode CLT 7.1+ +$(combo_2nd_arch_prefix)HOST_GLOBAL_CPPFLAGS += -isystem $(mac_sdk_path)/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1 +endif $(combo_2nd_arch_prefix)HOST_GLOBAL_LDFLAGS += -isysroot $(mac_sdk_root) -Wl,-syslibroot,$(mac_sdk_root) -mmacosx-version-min=$(mac_sdk_version) $(combo_2nd_arch_prefix)HOST_GLOBAL_CFLAGS += -fPIC -funwind-tables @@ -62,16 +62,6 @@ $(combo_2nd_arch_prefix)HOST_NO_UNDEFINED_LDFLAGS := -Wl,-undefined,error $(combo_2nd_arch_prefix)HOST_SHLIB_SUFFIX := .dylib $(combo_2nd_arch_prefix)HOST_JNILIB_SUFFIX := .jnilib -# TODO: add AndroidConfig.h for darwin-x86_64 -$(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)),) - $(combo_2nd_arch_prefix)HOST_RUN_RANLIB_AFTER_COPYING := false -else - $(combo_2nd_arch_prefix)HOST_RUN_RANLIB_AFTER_COPYING := true - PRE_LION_DYNAMIC_LINKER_OPTIONS := -Wl,-dynamic -endif $(combo_2nd_arch_prefix)HOST_GLOBAL_ARFLAGS := cqs ############################################################ @@ -94,14 +84,16 @@ $(hide) $(PRIVATE_CXX) \ -o $@ \ -install_name @rpath/$(notdir $@) \ -Wl,-rpath,@loader_path/../$(notdir $($(PRIVATE_2ND_ARCH_VAR_PREFIX)HOST_OUT_SHARED_LIBRARIES)) \ + -Wl,-rpath,@loader_path/$(notdir $($(PRIVATE_2ND_ARCH_VAR_PREFIX)HOST_OUT_SHARED_LIBRARIES)) \ $(PRIVATE_LDFLAGS) endef define transform-host-o-to-executable-inner $(hide) $(PRIVATE_CXX) \ -Wl,-rpath,@loader_path/../$(notdir $($(PRIVATE_2ND_ARCH_VAR_PREFIX)HOST_OUT_SHARED_LIBRARIES)) \ + -Wl,-rpath,@loader_path/$(notdir $($(PRIVATE_2ND_ARCH_VAR_PREFIX)HOST_OUT_SHARED_LIBRARIES)) \ -o $@ \ - $(PRE_LION_DYNAMIC_LINKER_OPTIONS) -Wl,-headerpad_max_install_names \ + -Wl,-headerpad_max_install_names \ $($(PRIVATE_2ND_ARCH_VAR_PREFIX)HOST_GLOBAL_LD_DIRS) \ $(if $(PRIVATE_NO_DEFAULT_COMPILER_FLAGS),, \ $(PRIVATE_HOST_GLOBAL_LDFLAGS) \ @@ -116,5 +108,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 a776a6997..ba984d235 100644 --- a/core/combo/HOST_darwin-x86_64.mk +++ b/core/combo/HOST_darwin-x86_64.mk @@ -33,19 +33,12 @@ include $(BUILD_COMBOS)/mac_version.mk HOST_TOOLCHAIN_ROOT := prebuilts/gcc/darwin-x86/host/i686-apple-darwin-4.2.1 HOST_TOOLCHAIN_PREFIX := $(HOST_TOOLCHAIN_ROOT)/bin/i686-apple-darwin$(gcc_darwin_version) -# Don't do anything if the toolchain is not there -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 -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 -else -HOST_CC := gcc -HOST_CXX := g++ -endif # $(HOST_TOOLCHAIN_PREFIX)-gcc exists + +define $(combo_var_prefix)transform-shared-lib-to-toc +$(call _gen_toc_command_for_macho,$(1),$(2)) +endef # gcc location for clang; to be updated when clang is updated # HOST_TOOLCHAIN_ROOT is a Darwin-specific define @@ -54,6 +47,13 @@ HOST_TOOLCHAIN_FOR_CLANG := $(HOST_TOOLCHAIN_ROOT) HOST_AR := $(AR) HOST_GLOBAL_CFLAGS += -isysroot $(mac_sdk_root) -mmacosx-version-min=$(mac_sdk_version) -DMACOSX_DEPLOYMENT_TARGET=$(mac_sdk_version) +ifeq (,$(wildcard $(mac_sdk_path)/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1)) +# libc++ header locations for XCode CLT 7.1+ +HOST_GLOBAL_CPPFLAGS += -isystem $(mac_sdk_path)/usr/include/c++/v1 +else +# libc++ header locations for pre-XCode CLT 7.1+ +HOST_GLOBAL_CPPFLAGS += -isystem $(mac_sdk_path)/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1 +endif HOST_GLOBAL_LDFLAGS += -isysroot $(mac_sdk_root) -Wl,-syslibroot,$(mac_sdk_root) -mmacosx-version-min=$(mac_sdk_version) HOST_GLOBAL_CFLAGS += -fPIC -funwind-tables @@ -62,14 +62,6 @@ HOST_NO_UNDEFINED_LDFLAGS := -Wl,-undefined,error HOST_SHLIB_SUFFIX := .dylib 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)),) - HOST_RUN_RANLIB_AFTER_COPYING := false -else - HOST_RUN_RANLIB_AFTER_COPYING := true -endif HOST_GLOBAL_ARFLAGS := cqs # We Reuse the following functions with the same name from HOST_darwin-x86.mk: diff --git a/core/combo/HOST_linux-x86.mk b/core/combo/HOST_linux-x86.mk index 3ca7443e7..169e2d244 100644 --- a/core/combo/HOST_linux-x86.mk +++ b/core/combo/HOST_linux-x86.mk @@ -18,21 +18,24 @@ # 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 := prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/bin/x86_64-linux- 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++ $(combo_2nd_arch_prefix)HOST_AR := $($(combo_2nd_arch_prefix)HOST_TOOLCHAIN_PREFIX)ar -endif # $($(combo_2nd_arch_prefix)HOST_TOOLCHAIN_PREFIX)gcc exists +$(combo_2nd_arch_prefix)HOST_READELF := $($(combo_2nd_arch_prefix)HOST_TOOLCHAIN_PREFIX)readelf +$(combo_2nd_arch_prefix)HOST_NM := $($(combo_2nd_arch_prefix)HOST_TOOLCHAIN_PREFIX)nm + +define $(combo_var_prefix)transform-shared-lib-to-toc +$(call _gen_toc_command_for_elf,$(1),$(2)) +endef # gcc location for clang; to be updated when clang is updated -$(combo_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG := prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.11-4.6/ +$(combo_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG := prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8 # We expect SSE3 floating point math. -$(combo_2nd_arch_prefix)HOST_GLOBAL_CFLAGS += -mstackrealign -msse3 -mfpmath=sse -m32 -Wa,--noexecstack -march=prescott -$(combo_2nd_arch_prefix)HOST_GLOBAL_LDFLAGS += -m32 -Wl,-z,noexecstack +$(combo_2nd_arch_prefix)HOST_GLOBAL_CFLAGS += -msse3 -mfpmath=sse -m32 -Wa,--noexecstack -march=prescott +$(combo_2nd_arch_prefix)HOST_GLOBAL_LDFLAGS += -m32 -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -Wl,--no-undefined-version ifneq ($(strip $(BUILD_HOST_static)),) # Statically-linked binaries are desirable for sandboxed environment @@ -41,17 +44,18 @@ endif # BUILD_HOST_static $(combo_2nd_arch_prefix)HOST_GLOBAL_CFLAGS += -fPIC \ -no-canonical-prefixes \ - -include $(call select-android-config-h,linux-x86) -# Disable new longjmp in glibc 2.11 and later. See bug 2967937. -$(combo_2nd_arch_prefix)HOST_GLOBAL_CFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0 +$(combo_2nd_arch_prefix)HOST_GLOBAL_CFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fstack-protector # Workaround differences in inttypes.h between host and target. # See bug 12708004. $(combo_2nd_arch_prefix)HOST_GLOBAL_CFLAGS += -D__STDC_FORMAT_MACROS -D__STDC_CONSTANT_MACROS -$(combo_2nd_arch_prefix)HOST_NO_UNDEFINED_LDFLAGS := -Wl,--no-undefined +# We build a 32-bit host art, and right now that also means building *all* host libraries +# both 32- and 64-bit (whether art uses them or not --- 9d59f417767991246848c3e101cb27d2dfea5988). +$(combo_2nd_arch_prefix)HOST_GLOBAL_CFLAGS += -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE=1 +$(combo_2nd_arch_prefix)HOST_NO_UNDEFINED_LDFLAGS := -Wl,--no-undefined ############################################################ ## Macros after this line are shared by the 64-bit config. diff --git a/core/combo/HOST_linux-x86_64.mk b/core/combo/HOST_linux-x86_64.mk index 53a3ae8c2..9766f2bde 100644 --- a/core/combo/HOST_linux-x86_64.mk +++ b/core/combo/HOST_linux-x86_64.mk @@ -18,33 +18,33 @@ # Included by combo/select.mk ifeq ($(strip $(HOST_TOOLCHAIN_PREFIX)),) -HOST_TOOLCHAIN_PREFIX := prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.11-4.6/bin/x86_64-linux- +HOST_TOOLCHAIN_PREFIX := prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/bin/x86_64-linux- endif -# Don't do anything if the toolchain is not there -ifneq (,$(strip $(wildcard $(HOST_TOOLCHAIN_PREFIX)gcc))) HOST_CC := $(HOST_TOOLCHAIN_PREFIX)gcc HOST_CXX := $(HOST_TOOLCHAIN_PREFIX)g++ HOST_AR := $(HOST_TOOLCHAIN_PREFIX)ar -endif # $(HOST_TOOLCHAIN_PREFIX)gcc exists +HOST_READELF := $(HOST_TOOLCHAIN_PREFIX)readelf +HOST_NM := $(HOST_TOOLCHAIN_PREFIX)nm + +define $(combo_var_prefix)transform-shared-lib-to-toc +$(call _gen_toc_command_for_elf,$(1),$(2)) +endef # gcc location for clang; to be updated when clang is updated -HOST_TOOLCHAIN_FOR_CLANG := prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.11-4.6/ +HOST_TOOLCHAIN_FOR_CLANG := prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8 HOST_GLOBAL_CFLAGS += -m64 -Wa,--noexecstack -HOST_GLOBAL_LDFLAGS += -m64 -Wl,-z,noexecstack +HOST_GLOBAL_LDFLAGS += -m64 -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -Wl,--no-undefined-version ifneq ($(strip $(BUILD_HOST_static)),) # Statically-linked binaries are desirable for sandboxed environment HOST_GLOBAL_LDFLAGS += -static endif # BUILD_HOST_static -# TODO: Add AndroidConfig.h for linux-x86_64 HOST_GLOBAL_CFLAGS += -fPIC \ -no-canonical-prefixes \ - -include $(call select-android-config-h,linux-x86) -# Disable new longjmp in glibc 2.11 and later. See bug 2967937. -HOST_GLOBAL_CFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0 +HOST_GLOBAL_CFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fstack-protector # Workaround differences in inttypes.h between host and target. # See bug 12708004. diff --git a/core/combo/HOST_windows-x86.mk b/core/combo/HOST_windows-x86.mk deleted file mode 100644 index 00e19742b..000000000 --- a/core/combo/HOST_windows-x86.mk +++ /dev/null @@ -1,86 +0,0 @@ -# -# Copyright (C) 2006 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. -# - -# Configuration for Linux on x86. -# Included by combo/select.make - -# right now we get these from the environment, but we should -# pick them from the tree somewhere -TOOLS_PREFIX := #prebuilt/windows/host/bin/ -TOOLS_EXE_SUFFIX := .exe - -# Settings to use MinGW has a cross-compiler under Linux -ifneq ($(findstring Linux,$(UNAME)),) -ifneq ($(strip $(USE_MINGW)),) -HOST_ACP_UNAVAILABLE := true -TOOLS_EXE_SUFFIX := -$(combo_2nd_arch_prefix)HOST_GLOBAL_CFLAGS += -DUSE_MINGW -DWIN32_LEAN_AND_MEAN -$(combo_2nd_arch_prefix)HOST_GLOBAL_CFLAGS += -Wno-unused-parameter -$(combo_2nd_arch_prefix)HOST_GLOBAL_CFLAGS += --sysroot=prebuilts/gcc/linux-x86/host/x86_64-w64-mingw32-4.8/x86_64-w64-mingw32 -$(combo_2nd_arch_prefix)HOST_GLOBAL_CFLAGS += -m32 -$(combo_2nd_arch_prefix)HOST_GLOBAL_LDFLAGS += -m32 -TOOLS_PREFIX := prebuilts/gcc/linux-x86/host/x86_64-w64-mingw32-4.8/bin/x86_64-w64-mingw32- -$(combo_2nd_arch_prefix)HOST_C_INCLUDES += prebuilts/gcc/linux-x86/host/x86_64-w64-mingw32-4.8/x86_64-w64-mingw32/include -$(combo_2nd_arch_prefix)HOST_C_INCLUDES += prebuilts/gcc/linux-x86/host/x86_64-w64-mingw32-4.8/lib/gcc/x86_64-w64-mingw32/4.8.3/include -$(combo_2nd_arch_prefix)HOST_GLOBAL_LD_DIRS += -Lprebuilts/gcc/linux-x86/host/x86_64-w64-mingw32-4.8/x86_64-w64-mingw32/lib32 -endif # USE_MINGW -endif # Linux - -# Workaround differences in inttypes.h between host and target. -# See bug 12708004. -$(combo_2nd_arch_prefix)HOST_GLOBAL_CFLAGS += -D__STDC_FORMAT_MACROS -D__STDC_CONSTANT_MACROS -D__USE_MINGW_ANSI_STDIO - -$(combo_2nd_arch_prefix)HOST_CC := $(TOOLS_PREFIX)gcc$(TOOLS_EXE_SUFFIX) -$(combo_2nd_arch_prefix)HOST_CXX := $(TOOLS_PREFIX)g++$(TOOLS_EXE_SUFFIX) -$(combo_2nd_arch_prefix)HOST_AR := $(TOOLS_PREFIX)ar$(TOOLS_EXE_SUFFIX) - -$(combo_2nd_arch_prefix)HOST_GLOBAL_CFLAGS += \ - -include $(call select-android-config-h,windows) -$(combo_2nd_arch_prefix)HOST_GLOBAL_LDFLAGS += \ - --enable-stdcall-fixup - -ifneq ($(strip $(BUILD_HOST_static)),) -# Statically-linked binaries are desirable for sandboxed environment -$(combo_2nd_arch_prefix)HOST_GLOBAL_LDFLAGS += -static -endif # BUILD_HOST_static - -# when building under Cygwin, ensure that we use Mingw compilation by default. -# you can disable this (i.e. to generate Cygwin executables) by defining the -# USE_CYGWIN variable in your environment, e.g.: -# -# export USE_CYGWIN=1 -# -# note that the -mno-cygwin flags are not needed when cross-compiling the -# Windows host tools on Linux -# -ifneq ($(findstring CYGWIN,$(UNAME)),) -ifeq ($(strip $(USE_CYGWIN)),) -$(combo_2nd_arch_prefix)HOST_GLOBAL_CFLAGS += -mno-cygwin -$(combo_2nd_arch_prefix)HOST_GLOBAL_LDFLAGS += -mno-cygwin -mconsole -endif -endif - -############################################################ -## Macros after this line are shared by the 64-bit config. - -HOST_SHLIB_SUFFIX := .dll -HOST_EXECUTABLE_SUFFIX := .exe - -# $(1): The file to check -# TODO: find out what format cygwin's stat(1) uses -define get-file-size -999999999 -endef diff --git a/core/combo/HOST_windows-x86_64.mk b/core/combo/HOST_windows-x86_64.mk deleted file mode 100644 index c77d82caa..000000000 --- a/core/combo/HOST_windows-x86_64.mk +++ /dev/null @@ -1,66 +0,0 @@ -# -# Copyright (C) 2006 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. -# - -# Configuration for Windows on x86_64. -# Included by combo/select.make - -# right now we get these from the environment, but we should -# pick them from the tree somewhere -TOOLS_PREFIX := #prebuilt/windows/host/bin/ -TOOLS_EXE_SUFFIX := .exe - -# Settings to use MinGW has a cross-compiler under Linux -ifneq ($(findstring Linux,$(UNAME)),) -ifneq ($(strip $(USE_MINGW)),) -HOST_ACP_UNAVAILABLE := true -TOOLS_EXE_SUFFIX := -HOST_GLOBAL_CFLAGS += -DUSE_MINGW -TOOLS_PREFIX := /usr/bin/amd64-mingw32msvc- -HOST_C_INCLUDES += /usr/lib/gcc/amd64-mingw32msvc/4.4.2/include -HOST_GLOBAL_LD_DIRS += -L/usr/amd64-mingw32msvc/lib -endif # USE_MINGW -endif # Linux - -# Workaround differences in inttypes.h between host and target. -# See bug 12708004. -HOST_GLOBAL_CFLAGS += -D__STDC_FORMAT_MACROS -D__STDC_CONSTANT_MACROS -D__USE_MINGW_ANSI_STDIO - -HOST_CC := $(TOOLS_PREFIX)gcc$(TOOLS_EXE_SUFFIX) -HOST_CXX := $(TOOLS_PREFIX)g++$(TOOLS_EXE_SUFFIX) -HOST_AR := $(TOOLS_PREFIX)ar$(TOOLS_EXE_SUFFIX) - -HOST_GLOBAL_CFLAGS += -include $(call select-android-config-h,windows) -HOST_GLOBAL_LDFLAGS += --enable-stdcall-fixup -ifneq ($(strip $(BUILD_HOST_static)),) -# Statically-linked binaries are desirable for sandboxed environment -HOST_GLOBAL_LDFLAGS += -static -endif # BUILD_HOST_static - -# when building under Cygwin, ensure that we use Mingw compilation by default. -# you can disable this (i.e. to generate Cygwin executables) by defining the -# USE_CYGWIN variable in your environment, e.g.: -# -# export USE_CYGWIN=1 -# -# note that the -mno-cygwin flags are not needed when cross-compiling the -# Windows host tools on Linux -# -ifneq ($(findstring CYGWIN,$(UNAME)),) -ifeq ($(strip $(USE_CYGWIN)),) -HOST_GLOBAL_CFLAGS += -mno-cygwin -HOST_GLOBAL_LDFLAGS += -mno-cygwin -mconsole -endif -endif diff --git a/core/combo/TARGET_linux-arm.mk b/core/combo/TARGET_linux-arm.mk index df81cd52a..510aae52f 100644 --- a/core/combo/TARGET_linux-arm.mk +++ b/core/combo/TARGET_linux-arm.mk @@ -20,8 +20,7 @@ # You can set TARGET_ARCH_VARIANT to use an arch version other # than ARMv5TE. Each value should correspond to a file named # $(BUILD_COMBOS)/arch/.mk which must contain -# makefile variable definitions similar to the preprocessor -# defines in build/core/combo/include/arch//AndroidConfig.h. Their +# makefile variable definitions. Their # purpose is to allow module Android.mk files to selectively compile # different versions of code based upon the funtionality and # instructions available in a given architecture version. @@ -35,10 +34,10 @@ TARGET_$(combo_2nd_arch_prefix)ARCH_VARIANT := armv5te endif # Decouple NDK library selection with platform compiler version -$(combo_2nd_arch_prefix)TARGET_NDK_GCC_VERSION := 4.8 +$(combo_2nd_arch_prefix)TARGET_NDK_GCC_VERSION := 4.9 ifeq ($(strip $(TARGET_GCC_VERSION_EXP)),) -$(combo_2nd_arch_prefix)TARGET_GCC_VERSION := 4.8 +$(combo_2nd_arch_prefix)TARGET_GCC_VERSION := 4.9 else $(combo_2nd_arch_prefix)TARGET_GCC_VERSION := $(TARGET_GCC_VERSION_EXP) endif @@ -57,13 +56,18 @@ $(combo_2nd_arch_prefix)TARGET_TOOLCHAIN_ROOT := prebuilts/gcc/$(HOST_PREBUILT_T $(combo_2nd_arch_prefix)TARGET_TOOLS_PREFIX := $($(combo_2nd_arch_prefix)TARGET_TOOLCHAIN_ROOT)/bin/arm-linux-androideabi- 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) -$(combo_2nd_arch_prefix)TARGET_AR := $($(combo_2nd_arch_prefix)TARGET_TOOLS_PREFIX)ar$(HOST_EXECUTABLE_SUFFIX) -$(combo_2nd_arch_prefix)TARGET_OBJCOPY := $($(combo_2nd_arch_prefix)TARGET_TOOLS_PREFIX)objcopy$(HOST_EXECUTABLE_SUFFIX) -$(combo_2nd_arch_prefix)TARGET_LD := $($(combo_2nd_arch_prefix)TARGET_TOOLS_PREFIX)ld$(HOST_EXECUTABLE_SUFFIX) -$(combo_2nd_arch_prefix)TARGET_READELF := $($(combo_2nd_arch_prefix)TARGET_TOOLS_PREFIX)readelf$(HOST_EXECUTABLE_SUFFIX) -$(combo_2nd_arch_prefix)TARGET_STRIP := $($(combo_2nd_arch_prefix)TARGET_TOOLS_PREFIX)strip$(HOST_EXECUTABLE_SUFFIX) +$(combo_2nd_arch_prefix)TARGET_CC := $($(combo_2nd_arch_prefix)TARGET_TOOLS_PREFIX)gcc +$(combo_2nd_arch_prefix)TARGET_CXX := $($(combo_2nd_arch_prefix)TARGET_TOOLS_PREFIX)g++ +$(combo_2nd_arch_prefix)TARGET_AR := $($(combo_2nd_arch_prefix)TARGET_TOOLS_PREFIX)ar +$(combo_2nd_arch_prefix)TARGET_OBJCOPY := $($(combo_2nd_arch_prefix)TARGET_TOOLS_PREFIX)objcopy +$(combo_2nd_arch_prefix)TARGET_LD := $($(combo_2nd_arch_prefix)TARGET_TOOLS_PREFIX)ld +$(combo_2nd_arch_prefix)TARGET_READELF := $($(combo_2nd_arch_prefix)TARGET_TOOLS_PREFIX)readelf +$(combo_2nd_arch_prefix)TARGET_STRIP := $($(combo_2nd_arch_prefix)TARGET_TOOLS_PREFIX)strip +$(combo_2nd_arch_prefix)TARGET_NM := $($(combo_2nd_arch_prefix)TARGET_TOOLS_PREFIX)nm + +define $(combo_var_prefix)transform-shared-lib-to-toc +$(call _gen_toc_command_for_elf,$(1),$(2)) +endef $(combo_2nd_arch_prefix)TARGET_NO_UNDEFINED_LDFLAGS := -Wl,--no-undefined @@ -92,14 +96,12 @@ ifeq ($(FORCE_ARM_DEBUGGING),true) $(combo_2nd_arch_prefix)TARGET_thumb_CFLAGS += -marm -fno-omit-frame-pointer endif -android_config_h := $(call select-android-config-h,linux-arm) - $(combo_2nd_arch_prefix)TARGET_GLOBAL_CFLAGS += \ -msoft-float \ -ffunction-sections \ -fdata-sections \ -funwind-tables \ - -fstack-protector \ + -fstack-protector-strong \ -Wa,--noexecstack \ -Werror=format-security \ -D_FORTIFY_SOURCE=2 \ @@ -107,14 +109,12 @@ $(combo_2nd_arch_prefix)TARGET_GLOBAL_CFLAGS += \ -no-canonical-prefixes \ -fno-canonical-system-headers \ $(arch_variant_cflags) \ - -include $(android_config_h) \ - -I $(dir $(android_config_h)) # The "-Wunused-but-set-variable" option often breaks projects that enable # "-Wall -Werror" due to a commom idiom "ALOGV(mesg)" where ALOGV is turned # into no-op in some builds while mesg is defined earlier. So we explicitly # disable "-Wunused-but-set-variable" here. -ifneq ($(filter 4.6 4.6.% 4.7 4.7.% 4.8, $($(combo_2nd_arch_prefix)TARGET_GCC_VERSION)),) +ifneq ($(filter 4.6 4.6.% 4.7 4.7.% 4.8 4.9, $($(combo_2nd_arch_prefix)TARGET_GCC_VERSION)),) $(combo_2nd_arch_prefix)TARGET_GLOBAL_CFLAGS += -fno-builtin-sin \ -fno-strict-volatile-bitfields endif @@ -133,9 +133,12 @@ $(combo_2nd_arch_prefix)TARGET_GLOBAL_LDFLAGS += \ -Wl,-z,noexecstack \ -Wl,-z,relro \ -Wl,-z,now \ + -Wl,--build-id=md5 \ -Wl,--warn-shared-textrel \ -Wl,--fatal-warnings \ -Wl,--icf=safe \ + -Wl,--hash-style=gnu \ + -Wl,--no-undefined-version \ $(arch_variant_ldflags) $(combo_2nd_arch_prefix)TARGET_GLOBAL_CFLAGS += -mthumb-interwork @@ -153,7 +156,6 @@ $(combo_2nd_arch_prefix)TARGET_RELEASE_CFLAGS := \ libc_root := bionic/libc libm_root := bionic/libm -libstdc++_root := bionic/libstdc++ ## on some hosts, the target cross-compiler is not available so do not run this command @@ -165,16 +167,18 @@ $(combo_2nd_arch_prefix)TARGET_LIBGCC := $(shell $($(combo_2nd_arch_prefix)TARGE $($(combo_2nd_arch_prefix)TARGET_GLOBAL_CFLAGS) -print-libgcc-file-name) $(combo_2nd_arch_prefix)TARGET_LIBATOMIC := $(shell $($(combo_2nd_arch_prefix)TARGET_CC) \ $($(combo_2nd_arch_prefix)TARGET_GLOBAL_CFLAGS) -print-file-name=libatomic.a) +$(combo_2nd_arch_prefix)TARGET_LIBGCOV := $(shell $($(combo_2nd_arch_prefix)TARGET_CC) \ + $($(combo_2nd_arch_prefix)TARGET_GLOBAL_CFLAGS) -print-file-name=libgcov.a) endif KERNEL_HEADERS_COMMON := $(libc_root)/kernel/uapi +KERNEL_HEADERS_COMMON += $(libc_root)/kernel/common KERNEL_HEADERS_ARCH := $(libc_root)/kernel/uapi/asm-$(TARGET_$(combo_2nd_arch_prefix)ARCH) KERNEL_HEADERS := $(KERNEL_HEADERS_COMMON) $(KERNEL_HEADERS_ARCH) $(combo_2nd_arch_prefix)TARGET_C_INCLUDES := \ $(libc_root)/arch-arm/include \ $(libc_root)/include \ - $(libstdc++_root)/include \ $(KERNEL_HEADERS) \ $(libm_root)/include \ $(libm_root)/include/arm \ @@ -186,81 +190,6 @@ $(combo_2nd_arch_prefix)TARGET_CRTEND_O := $($(combo_2nd_arch_prefix)TARGET_OUT_ $(combo_2nd_arch_prefix)TARGET_CRTBEGIN_SO_O := $($(combo_2nd_arch_prefix)TARGET_OUT_INTERMEDIATE_LIBRARIES)/crtbegin_so.o $(combo_2nd_arch_prefix)TARGET_CRTEND_SO_O := $($(combo_2nd_arch_prefix)TARGET_OUT_INTERMEDIATE_LIBRARIES)/crtend_so.o -$(combo_2nd_arch_prefix)TARGET_STRIP_MODULE:=true - -$(combo_2nd_arch_prefix)TARGET_DEFAULT_SYSTEM_SHARED_LIBRARIES := libc libstdc++ libm +$(combo_2nd_arch_prefix)TARGET_PACK_MODULE_RELOCATIONS := true -$(combo_2nd_arch_prefix)TARGET_CUSTOM_LD_COMMAND := true - -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) \ - $(PRIVATE_TARGET_GLOBAL_LD_DIRS) \ - $(if $(filter true,$(PRIVATE_NO_CRT)),,$(PRIVATE_TARGET_CRTBEGIN_SO_O)) \ - $(PRIVATE_ALL_OBJECTS) \ - -Wl,--whole-archive \ - $(call normalize-target-libraries,$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES)) \ - -Wl,--no-whole-archive \ - $(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--start-group) \ - $(call normalize-target-libraries,$(PRIVATE_ALL_STATIC_LIBRARIES)) \ - $(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--end-group) \ - $(if $(TARGET_BUILD_APPS),$(PRIVATE_TARGET_LIBGCC)) \ - $(call normalize-target-libraries,$(PRIVATE_ALL_SHARED_LIBRARIES)) \ - -o $@ \ - $(PRIVATE_TARGET_GLOBAL_LDFLAGS) \ - $(PRIVATE_LDFLAGS) \ - $(PRIVATE_TARGET_LIBATOMIC) \ - $(if $(PRIVATE_LIBCXX),,$(PRIVATE_TARGET_LIBGCC)) \ - $(if $(filter true,$(PRIVATE_NO_CRT)),,$(PRIVATE_TARGET_CRTEND_SO_O)) \ - $(PRIVATE_LDLIBS) -endef - -define $(combo_2nd_arch_prefix)transform-o-to-executable-inner -$(hide) $(PRIVATE_CXX) -nostdlib -Bdynamic -pie \ - -Wl,-dynamic-linker,/system/bin/linker \ - -Wl,--gc-sections \ - -Wl,-z,nocopyreloc \ - $(PRIVATE_TARGET_GLOBAL_LD_DIRS) \ - -Wl,-rpath-link=$(PRIVATE_TARGET_OUT_INTERMEDIATE_LIBRARIES) \ - $(if $(filter true,$(PRIVATE_NO_CRT)),,$(PRIVATE_TARGET_CRTBEGIN_DYNAMIC_O)) \ - $(PRIVATE_ALL_OBJECTS) \ - -Wl,--whole-archive \ - $(call normalize-target-libraries,$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES)) \ - -Wl,--no-whole-archive \ - $(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--start-group) \ - $(call normalize-target-libraries,$(PRIVATE_ALL_STATIC_LIBRARIES)) \ - $(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--end-group) \ - $(if $(TARGET_BUILD_APPS),$(PRIVATE_TARGET_LIBGCC)) \ - $(call normalize-target-libraries,$(PRIVATE_ALL_SHARED_LIBRARIES)) \ - -o $@ \ - $(PRIVATE_TARGET_GLOBAL_LDFLAGS) \ - $(PRIVATE_LDFLAGS) \ - $(PRIVATE_TARGET_LIBATOMIC) \ - $(if $(PRIVATE_LIBCXX),,$(PRIVATE_TARGET_LIBGCC)) \ - $(if $(filter true,$(PRIVATE_NO_CRT)),,$(PRIVATE_TARGET_CRTEND_O)) \ - $(PRIVATE_LDLIBS) -endef - -define $(combo_2nd_arch_prefix)transform-o-to-static-executable-inner -$(hide) $(PRIVATE_CXX) -nostdlib -Bstatic \ - -Wl,--gc-sections \ - -o $@ \ - $(PRIVATE_TARGET_GLOBAL_LD_DIRS) \ - $(if $(filter true,$(PRIVATE_NO_CRT)),,$(PRIVATE_TARGET_CRTBEGIN_STATIC_O)) \ - $(PRIVATE_TARGET_GLOBAL_LDFLAGS) \ - $(PRIVATE_LDFLAGS) \ - $(PRIVATE_ALL_OBJECTS) \ - -Wl,--whole-archive \ - $(call normalize-target-libraries,$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES)) \ - -Wl,--no-whole-archive \ - $(call normalize-target-libraries,$(filter-out %libc_nomalloc.a,$(filter-out %libc.a,$(PRIVATE_ALL_STATIC_LIBRARIES)))) \ - -Wl,--start-group \ - $(call normalize-target-libraries,$(filter %libc.a,$(PRIVATE_ALL_STATIC_LIBRARIES))) \ - $(call normalize-target-libraries,$(filter %libc_nomalloc.a,$(PRIVATE_ALL_STATIC_LIBRARIES))) \ - $(PRIVATE_TARGET_LIBATOMIC) \ - $(if $(PRIVATE_LIBCXX),,$(PRIVATE_TARGET_LIBGCC)) \ - -Wl,--end-group \ - $(if $(filter true,$(PRIVATE_NO_CRT)),,$(PRIVATE_TARGET_CRTEND_O)) -endef +$(combo_2nd_arch_prefix)TARGET_LINKER := /system/bin/linker diff --git a/core/combo/TARGET_linux-arm64.mk b/core/combo/TARGET_linux-arm64.mk index 07d398449..6a1d8619f 100644 --- a/core/combo/TARGET_linux-arm64.mk +++ b/core/combo/TARGET_linux-arm64.mk @@ -20,8 +20,7 @@ # You can set TARGET_ARCH_VARIANT to use an arch version other # than ARMv5TE. Each value should correspond to a file named # $(BUILD_COMBOS)/arch/.mk which must contain -# makefile variable definitions similar to the preprocessor -# defines in build/core/combo/include/arch//AndroidConfig.h. Their +# makefile variable definitions. Their # purpose is to allow module Android.mk files to selectively compile # different versions of code based upon the funtionality and # instructions available in a given architecture version. @@ -57,23 +56,26 @@ TARGET_TOOLCHAIN_ROOT := prebuilts/gcc/$(HOST_PREBUILT_TAG)/aarch64/aarch64-linu TARGET_TOOLS_PREFIX := $(TARGET_TOOLCHAIN_ROOT)/bin/aarch64-linux-android- endif -TARGET_CC := $(TARGET_TOOLS_PREFIX)gcc$(HOST_EXECUTABLE_SUFFIX) -TARGET_CXX := $(TARGET_TOOLS_PREFIX)g++$(HOST_EXECUTABLE_SUFFIX) -TARGET_AR := $(TARGET_TOOLS_PREFIX)ar$(HOST_EXECUTABLE_SUFFIX) -TARGET_OBJCOPY := $(TARGET_TOOLS_PREFIX)objcopy$(HOST_EXECUTABLE_SUFFIX) -TARGET_LD := $(TARGET_TOOLS_PREFIX)ld$(HOST_EXECUTABLE_SUFFIX) -TARGET_READELF := $(TARGET_TOOLS_PREFIX)readelf$(HOST_EXECUTABLE_SUFFIX) -TARGET_STRIP := $(TARGET_TOOLS_PREFIX)strip$(HOST_EXECUTABLE_SUFFIX) +TARGET_CC := $(TARGET_TOOLS_PREFIX)gcc +TARGET_CXX := $(TARGET_TOOLS_PREFIX)g++ +TARGET_AR := $(TARGET_TOOLS_PREFIX)ar +TARGET_OBJCOPY := $(TARGET_TOOLS_PREFIX)objcopy +TARGET_LD := $(TARGET_TOOLS_PREFIX)ld +TARGET_READELF := $(TARGET_TOOLS_PREFIX)readelf +TARGET_STRIP := $(TARGET_TOOLS_PREFIX)strip +TARGET_NM := $(TARGET_TOOLS_PREFIX)nm + +define $(combo_var_prefix)transform-shared-lib-to-toc +$(call _gen_toc_command_for_elf,$(1),$(2)) +endef TARGET_NO_UNDEFINED_LDFLAGS := -Wl,--no-undefined TARGET_GLOBAL_CFLAGS += \ -fno-strict-aliasing \ -android_config_h := $(call select-android-config-h,linux-arm64) - TARGET_GLOBAL_CFLAGS += \ - -fstack-protector \ + -fstack-protector-strong \ -ffunction-sections \ -fdata-sections \ -funwind-tables \ @@ -84,13 +86,12 @@ TARGET_GLOBAL_CFLAGS += \ -no-canonical-prefixes \ -fno-canonical-system-headers \ $(arch_variant_cflags) \ - -include $(android_config_h) \ - -I $(dir $(android_config_h)) # Help catch common 32/64-bit errors. TARGET_GLOBAL_CFLAGS += \ -Werror=pointer-to-int-cast \ -Werror=int-to-pointer-cast \ + -Werror=implicit-function-declaration \ TARGET_GLOBAL_CFLAGS += -fno-strict-volatile-bitfields @@ -108,11 +109,20 @@ TARGET_GLOBAL_LDFLAGS += \ -Wl,-z,noexecstack \ -Wl,-z,relro \ -Wl,-z,now \ + -Wl,--build-id=md5 \ -Wl,--warn-shared-textrel \ -Wl,--fatal-warnings \ -Wl,-maarch64linux \ + -Wl,--hash-style=gnu \ + -Wl,--fix-cortex-a53-843419 \ + -fuse-ld=gold \ + -Wl,--icf=safe \ + -Wl,--no-undefined-version \ $(arch_variant_ldflags) +# Disable transitive dependency library symbol resolving. +TARGET_GLOBAL_LDFLAGS += -Wl,--allow-shlib-undefined + TARGET_GLOBAL_CPPFLAGS += -fvisibility-inlines-hidden # More flags/options can be added here @@ -126,21 +136,22 @@ TARGET_RELEASE_CFLAGS := \ libc_root := bionic/libc libm_root := bionic/libm -libstdc++_root := bionic/libstdc++ TARGET_LIBGCC := $(shell $(TARGET_CC) $(TARGET_GLOBAL_CFLAGS) \ -print-libgcc-file-name) TARGET_LIBATOMIC := $(shell $(TARGET_CC) $(TARGET_GLOBAL_CFLAGS) \ -print-file-name=libatomic.a) +TARGET_LIBGCOV := $(shell $(TARGET_CC) $(TARGET_GLOBAL_CFLAGS) \ + -print-file-name=libgcov.a) KERNEL_HEADERS_COMMON := $(libc_root)/kernel/uapi +KERNEL_HEADERS_COMMON += $(libc_root)/kernel/common KERNEL_HEADERS_ARCH := $(libc_root)/kernel/uapi/asm-$(TARGET_ARCH) KERNEL_HEADERS := $(KERNEL_HEADERS_COMMON) $(KERNEL_HEADERS_ARCH) TARGET_C_INCLUDES := \ $(libc_root)/arch-arm64/include \ $(libc_root)/include \ - $(libstdc++_root)/include \ $(KERNEL_HEADERS) \ $(libm_root)/include \ $(libm_root)/include/arm64 \ @@ -152,81 +163,6 @@ TARGET_CRTEND_O := $(TARGET_OUT_INTERMEDIATE_LIBRARIES)/crtend_android.o TARGET_CRTBEGIN_SO_O := $(TARGET_OUT_INTERMEDIATE_LIBRARIES)/crtbegin_so.o TARGET_CRTEND_SO_O := $(TARGET_OUT_INTERMEDIATE_LIBRARIES)/crtend_so.o -TARGET_STRIP_MODULE:=true - -TARGET_DEFAULT_SYSTEM_SHARED_LIBRARIES := libc libstdc++ libm - -TARGET_CUSTOM_LD_COMMAND := true - -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) \ - $(PRIVATE_TARGET_GLOBAL_LD_DIRS) \ - $(if $(filter true,$(PRIVATE_NO_CRT)),,$(PRIVATE_TARGET_CRTBEGIN_SO_O)) \ - $(PRIVATE_ALL_OBJECTS) \ - -Wl,--whole-archive \ - $(call normalize-target-libraries,$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES)) \ - -Wl,--no-whole-archive \ - $(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--start-group) \ - $(call normalize-target-libraries,$(PRIVATE_ALL_STATIC_LIBRARIES)) \ - $(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--end-group) \ - $(if $(TARGET_BUILD_APPS),$(PRIVATE_TARGET_LIBGCC)) \ - $(call normalize-target-libraries,$(PRIVATE_ALL_SHARED_LIBRARIES)) \ - -o $@ \ - $(PRIVATE_TARGET_GLOBAL_LDFLAGS) \ - $(PRIVATE_LDFLAGS) \ - $(PRIVATE_TARGET_LIBATOMIC) \ - $(if $(PRIVATE_LIBCXX),,$(PRIVATE_TARGET_LIBGCC)) \ - $(if $(filter true,$(PRIVATE_NO_CRT)),,$(PRIVATE_TARGET_CRTEND_SO_O)) \ - $(PRIVATE_LDLIBS) -endef +TARGET_PACK_MODULE_RELOCATIONS := true -define transform-o-to-executable-inner -$(hide) $(PRIVATE_CXX) -nostdlib -Bdynamic -pie \ - -Wl,-dynamic-linker,/system/bin/linker64 \ - -Wl,--gc-sections \ - -Wl,-z,nocopyreloc \ - $(PRIVATE_TARGET_GLOBAL_LD_DIRS) \ - -Wl,-rpath-link=$(PRIVATE_TARGET_OUT_INTERMEDIATE_LIBRARIES) \ - $(if $(filter true,$(PRIVATE_NO_CRT)),,$(PRIVATE_TARGET_CRTBEGIN_DYNAMIC_O)) \ - $(PRIVATE_ALL_OBJECTS) \ - -Wl,--whole-archive \ - $(call normalize-target-libraries,$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES)) \ - -Wl,--no-whole-archive \ - $(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--start-group) \ - $(call normalize-target-libraries,$(PRIVATE_ALL_STATIC_LIBRARIES)) \ - $(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--end-group) \ - $(if $(TARGET_BUILD_APPS),$(PRIVATE_TARGET_LIBGCC)) \ - $(call normalize-target-libraries,$(PRIVATE_ALL_SHARED_LIBRARIES)) \ - -o $@ \ - $(PRIVATE_TARGET_GLOBAL_LDFLAGS) \ - $(PRIVATE_LDFLAGS) \ - $(PRIVATE_TARGET_LIBATOMIC) \ - $(if $(PRIVATE_LIBCXX),,$(PRIVATE_TARGET_LIBGCC)) \ - $(if $(filter true,$(PRIVATE_NO_CRT)),,$(PRIVATE_TARGET_CRTEND_O)) \ - $(PRIVATE_LDLIBS) -endef - -define transform-o-to-static-executable-inner -$(hide) $(PRIVATE_CXX) -nostdlib -Bstatic \ - -Wl,--gc-sections \ - -o $@ \ - $(PRIVATE_TARGET_GLOBAL_LD_DIRS) \ - $(if $(filter true,$(PRIVATE_NO_CRT)),,$(PRIVATE_TARGET_CRTBEGIN_STATIC_O)) \ - $(PRIVATE_TARGET_GLOBAL_LDFLAGS) \ - $(PRIVATE_LDFLAGS) \ - $(PRIVATE_ALL_OBJECTS) \ - -Wl,--whole-archive \ - $(call normalize-target-libraries,$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES)) \ - -Wl,--no-whole-archive \ - $(call normalize-target-libraries,$(filter-out %libc_nomalloc.a,$(filter-out %libc.a,$(PRIVATE_ALL_STATIC_LIBRARIES)))) \ - -Wl,--start-group \ - $(call normalize-target-libraries,$(filter %libc.a,$(PRIVATE_ALL_STATIC_LIBRARIES))) \ - $(call normalize-target-libraries,$(filter %libc_nomalloc.a,$(PRIVATE_ALL_STATIC_LIBRARIES))) \ - $(PRIVATE_TARGET_LIBATOMIC) \ - $(if $(PRIVATE_LIBCXX),,$(PRIVATE_TARGET_LIBGCC)) \ - -Wl,--end-group \ - $(if $(filter true,$(PRIVATE_NO_CRT)),,$(PRIVATE_TARGET_CRTEND_O)) -endef +TARGET_LINKER := /system/bin/linker64 diff --git a/core/combo/TARGET_linux-mips.mk b/core/combo/TARGET_linux-mips.mk index 995e63c23..186d88f25 100644 --- a/core/combo/TARGET_linux-mips.mk +++ b/core/combo/TARGET_linux-mips.mk @@ -20,8 +20,7 @@ # You can set TARGET_ARCH_VARIANT to use an arch version other # than mips32r2-fp. Each value should correspond to a file named # $(BUILD_COMBOS)/arch/.mk which must contain -# makefile variable definitions similar to the preprocessor -# defines in build/core/combo/include/arch//AndroidConfig.h. Their +# makefile variable definitions. Their # purpose is to allow module Android.mk files to selectively compile # different versions of code based upon the funtionality and # instructions available in a given architecture version. @@ -35,7 +34,7 @@ TARGET_$(combo_2nd_arch_prefix)ARCH_VARIANT := mips32r2-fp endif # Decouple NDK library selection with platform compiler version -$(combo_2nd_arch_prefix)TARGET_NDK_GCC_VERSION := 4.8 +$(combo_2nd_arch_prefix)TARGET_NDK_GCC_VERSION := 4.9 ifeq ($(strip $(TARGET_GCC_VERSION_EXP)),) $(combo_2nd_arch_prefix)TARGET_GCC_VERSION := 4.9 @@ -57,13 +56,18 @@ $(combo_2nd_arch_prefix)TARGET_TOOLCHAIN_ROOT := prebuilts/gcc/$(HOST_PREBUILT_T $(combo_2nd_arch_prefix)TARGET_TOOLS_PREFIX := $($(combo_2nd_arch_prefix)TARGET_TOOLCHAIN_ROOT)/bin/mips64el-linux-android- 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) -$(combo_2nd_arch_prefix)TARGET_AR := $($(combo_2nd_arch_prefix)TARGET_TOOLS_PREFIX)ar$(HOST_EXECUTABLE_SUFFIX) -$(combo_2nd_arch_prefix)TARGET_OBJCOPY := $($(combo_2nd_arch_prefix)TARGET_TOOLS_PREFIX)objcopy$(HOST_EXECUTABLE_SUFFIX) -$(combo_2nd_arch_prefix)TARGET_LD := $($(combo_2nd_arch_prefix)TARGET_TOOLS_PREFIX)ld$(HOST_EXECUTABLE_SUFFIX) -$(combo_2nd_arch_prefix)TARGET_READELF := $($(combo_2nd_arch_prefix)TARGET_TOOLS_PREFIX)readelf$(HOST_EXECUTABLE_SUFFIX) -$(combo_2nd_arch_prefix)TARGET_STRIP := $($(combo_2nd_arch_prefix)TARGET_TOOLS_PREFIX)strip$(HOST_EXECUTABLE_SUFFIX) +$(combo_2nd_arch_prefix)TARGET_CC := $($(combo_2nd_arch_prefix)TARGET_TOOLS_PREFIX)gcc +$(combo_2nd_arch_prefix)TARGET_CXX := $($(combo_2nd_arch_prefix)TARGET_TOOLS_PREFIX)g++ +$(combo_2nd_arch_prefix)TARGET_AR := $($(combo_2nd_arch_prefix)TARGET_TOOLS_PREFIX)ar +$(combo_2nd_arch_prefix)TARGET_OBJCOPY := $($(combo_2nd_arch_prefix)TARGET_TOOLS_PREFIX)objcopy +$(combo_2nd_arch_prefix)TARGET_LD := $($(combo_2nd_arch_prefix)TARGET_TOOLS_PREFIX)ld +$(combo_2nd_arch_prefix)TARGET_READELF := $($(combo_2nd_arch_prefix)TARGET_TOOLS_PREFIX)readelf +$(combo_2nd_arch_prefix)TARGET_STRIP := $($(combo_2nd_arch_prefix)TARGET_TOOLS_PREFIX)strip +$(combo_2nd_arch_prefix)TARGET_NM := $($(combo_2nd_arch_prefix)TARGET_TOOLS_PREFIX)nm + +define $(combo_var_prefix)transform-shared-lib-to-toc +$(call _gen_toc_command_for_elf,$(1),$(2)) +endef $(combo_2nd_arch_prefix)TARGET_NO_UNDEFINED_LDFLAGS := -Wl,--no-undefined @@ -79,22 +83,19 @@ ifeq ($(FORCE_MIPS_DEBUGGING),true) TARGET_mips_CFLAGS += -fno-omit-frame-pointer endif -android_config_h := $(call select-android-config-h,linux-mips) - $(combo_2nd_arch_prefix)TARGET_GLOBAL_CFLAGS += \ $(TARGET_mips_CFLAGS) \ -U__unix -U__unix__ -Umips \ -ffunction-sections \ -fdata-sections \ -funwind-tables \ + -fstack-protector-strong \ -Wa,--noexecstack \ -Werror=format-security \ -D_FORTIFY_SOURCE=2 \ -no-canonical-prefixes \ -fno-canonical-system-headers \ $(arch_variant_cflags) \ - -include $(android_config_h) \ - -I $(dir $(android_config_h)) ifneq ($(ARCH_MIPS_PAGE_SHIFT),) $(combo_2nd_arch_prefix)TARGET_GLOBAL_CFLAGS += -DPAGE_SHIFT=$(ARCH_MIPS_PAGE_SHIFT) @@ -104,10 +105,15 @@ $(combo_2nd_arch_prefix)TARGET_GLOBAL_LDFLAGS += \ -Wl,-z,noexecstack \ -Wl,-z,relro \ -Wl,-z,now \ + -Wl,--build-id=md5 \ -Wl,--warn-shared-textrel \ -Wl,--fatal-warnings \ + -Wl,--no-undefined-version \ $(arch_variant_ldflags) +# Disable transitive dependency library symbol resolving. +$(combo_2nd_arch_prefix)TARGET_GLOBAL_LDFLAGS += -Wl,--allow-shlib-undefined + $(combo_2nd_arch_prefix)TARGET_GLOBAL_CPPFLAGS += -fvisibility-inlines-hidden # More flags/options can be added here @@ -121,7 +127,6 @@ $(combo_2nd_arch_prefix)TARGET_RELEASE_CFLAGS := \ libc_root := bionic/libc libm_root := bionic/libm -libstdc++_root := bionic/libstdc++ ## on some hosts, the target cross-compiler is not available so do not run this command @@ -137,16 +142,18 @@ LIBGCC_EH := $(shell $($(combo_2nd_arch_prefix)TARGET_CC) $($(combo_2nd_arch_pre ifneq ($(LIBGCC_EH),libgcc_eh.a) $(combo_2nd_arch_prefix)TARGET_LIBGCC += $(LIBGCC_EH) endif +$(combo_2nd_arch_prefix)TARGET_LIBGCOV := $(shell $($(combo_2nd_arch_prefix)TARGET_CC) $($(combo_2nd_arch_prefix)TARGET_GLOBAL_CFLAGS) \ + --print-file-name=libgcov.a) endif KERNEL_HEADERS_COMMON := $(libc_root)/kernel/uapi +KERNEL_HEADERS_COMMON += $(libc_root)/kernel/common KERNEL_HEADERS_ARCH := $(libc_root)/kernel/uapi/asm-mips # mips covers both mips and mips64. KERNEL_HEADERS := $(KERNEL_HEADERS_COMMON) $(KERNEL_HEADERS_ARCH) $(combo_2nd_arch_prefix)TARGET_C_INCLUDES := \ $(libc_root)/arch-mips/include \ $(libc_root)/include \ - $(libstdc++_root)/include \ $(KERNEL_HEADERS) \ $(libm_root)/include \ $(libm_root)/include/mips \ @@ -158,81 +165,6 @@ $(combo_2nd_arch_prefix)TARGET_CRTEND_O := $($(combo_2nd_arch_prefix)TARGET_OUT_ $(combo_2nd_arch_prefix)TARGET_CRTBEGIN_SO_O := $($(combo_2nd_arch_prefix)TARGET_OUT_INTERMEDIATE_LIBRARIES)/crtbegin_so.o $(combo_2nd_arch_prefix)TARGET_CRTEND_SO_O := $($(combo_2nd_arch_prefix)TARGET_OUT_INTERMEDIATE_LIBRARIES)/crtend_so.o -$(combo_2nd_arch_prefix)TARGET_STRIP_MODULE:=true - -$(combo_2nd_arch_prefix)TARGET_DEFAULT_SYSTEM_SHARED_LIBRARIES := libc libstdc++ libm - -$(combo_2nd_arch_prefix)TARGET_CUSTOM_LD_COMMAND := true - -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) \ - $(PRIVATE_TARGET_GLOBAL_LD_DIRS) \ - $(if $(filter true,$(PRIVATE_NO_CRT)),,$(PRIVATE_TARGET_CRTBEGIN_SO_O)) \ - $(PRIVATE_ALL_OBJECTS) \ - -Wl,--whole-archive \ - $(call normalize-target-libraries,$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES)) \ - -Wl,--no-whole-archive \ - $(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--start-group) \ - $(call normalize-target-libraries,$(PRIVATE_ALL_STATIC_LIBRARIES)) \ - $(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--end-group) \ - $(if $(TARGET_BUILD_APPS),$(PRIVATE_TARGET_LIBGCC)) \ - $(call normalize-target-libraries,$(PRIVATE_ALL_SHARED_LIBRARIES)) \ - -o $@ \ - $(PRIVATE_TARGET_GLOBAL_LDFLAGS) \ - $(PRIVATE_LDFLAGS) \ - $(PRIVATE_TARGET_LIBATOMIC) \ - $(if $(PRIVATE_LIBCXX),,$(PRIVATE_TARGET_LIBGCC)) \ - $(if $(filter true,$(PRIVATE_NO_CRT)),,$(PRIVATE_TARGET_CRTEND_SO_O)) \ - $(PRIVATE_LDLIBS) -endef +$(combo_2nd_arch_prefix)TARGET_PACK_MODULE_RELOCATIONS := true -define $(combo_2nd_arch_prefix)transform-o-to-executable-inner -$(hide) $(PRIVATE_CXX) -nostdlib -Bdynamic -pie \ - -Wl,-dynamic-linker,/system/bin/linker \ - -Wl,--gc-sections \ - -Wl,-z,nocopyreloc \ - $(PRIVATE_TARGET_GLOBAL_LD_DIRS) \ - -Wl,-rpath-link=$(PRIVATE_TARGET_OUT_INTERMEDIATE_LIBRARIES) \ - $(if $(filter true,$(PRIVATE_NO_CRT)),,$(PRIVATE_TARGET_CRTBEGIN_DYNAMIC_O)) \ - $(PRIVATE_ALL_OBJECTS) \ - -Wl,--whole-archive \ - $(call normalize-target-libraries,$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES)) \ - -Wl,--no-whole-archive \ - $(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--start-group) \ - $(call normalize-target-libraries,$(PRIVATE_ALL_STATIC_LIBRARIES)) \ - $(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--end-group) \ - $(if $(TARGET_BUILD_APPS),$(PRIVATE_TARGET_LIBGCC)) \ - $(call normalize-target-libraries,$(PRIVATE_ALL_SHARED_LIBRARIES)) \ - -o $@ \ - $(PRIVATE_TARGET_GLOBAL_LDFLAGS) \ - $(PRIVATE_LDFLAGS) \ - $(PRIVATE_TARGET_LIBATOMIC) \ - $(if $(PRIVATE_LIBCXX),,$(PRIVATE_TARGET_LIBGCC)) \ - $(if $(filter true,$(PRIVATE_NO_CRT)),,$(PRIVATE_TARGET_CRTEND_O)) \ - $(PRIVATE_LDLIBS) -endef - -define $(combo_2nd_arch_prefix)transform-o-to-static-executable-inner -$(hide) $(PRIVATE_CXX) -nostdlib -Bstatic \ - -Wl,--gc-sections \ - -o $@ \ - $(PRIVATE_TARGET_GLOBAL_LD_DIRS) \ - $(if $(filter true,$(PRIVATE_NO_CRT)),,$(PRIVATE_TARGET_CRTBEGIN_STATIC_O)) \ - $(PRIVATE_TARGET_GLOBAL_LDFLAGS) \ - $(PRIVATE_LDFLAGS) \ - $(PRIVATE_ALL_OBJECTS) \ - -Wl,--whole-archive \ - $(call normalize-target-libraries,$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES)) \ - -Wl,--no-whole-archive \ - $(call normalize-target-libraries,$(filter-out %libc_nomalloc.a,$(filter-out %libc.a,$(PRIVATE_ALL_STATIC_LIBRARIES)))) \ - -Wl,--start-group \ - $(call normalize-target-libraries,$(filter %libc.a,$(PRIVATE_ALL_STATIC_LIBRARIES))) \ - $(call normalize-target-libraries,$(filter %libc_nomalloc.a,$(PRIVATE_ALL_STATIC_LIBRARIES))) \ - $(PRIVATE_TARGET_LIBATOMIC) \ - $(if $(PRIVATE_LIBCXX),,$(PRIVATE_TARGET_LIBGCC)) \ - -Wl,--end-group \ - $(if $(filter true,$(PRIVATE_NO_CRT)),,$(PRIVATE_TARGET_CRTEND_O)) -endef +$(combo_2nd_arch_prefix)TARGET_LINKER := /system/bin/linker diff --git a/core/combo/TARGET_linux-mips64.mk b/core/combo/TARGET_linux-mips64.mk index 4511b4779..3e1f61a0f 100644 --- a/core/combo/TARGET_linux-mips64.mk +++ b/core/combo/TARGET_linux-mips64.mk @@ -18,10 +18,9 @@ # Included by combo/select.mk # You can set TARGET_ARCH_VARIANT to use an arch version other -# than mips64. Each value should correspond to a file named +# than mips64r6. Each value should correspond to a file named # $(BUILD_COMBOS)/arch/.mk which must contain -# makefile variable definitions similar to the preprocessor -# defines in build/core/combo/include/arch//AndroidConfig.h. Their +# makefile variable definitions. Their # purpose is to allow module Android.mk files to selectively compile # different versions of code based upon the funtionality and # instructions available in a given architecture version. @@ -35,7 +34,7 @@ TARGET_ARCH_VARIANT := mips64r6 endif # Decouple NDK library selection with platform compiler version -TARGET_NDK_GCC_VERSION := 4.8 +TARGET_NDK_GCC_VERSION := 4.9 ifeq ($(strip $(TARGET_GCC_VERSION_EXP)),) TARGET_GCC_VERSION := 4.9 @@ -57,13 +56,18 @@ TARGET_TOOLCHAIN_ROOT := prebuilts/gcc/$(HOST_PREBUILT_TAG)/mips/mips64el-linux- TARGET_TOOLS_PREFIX := $(TARGET_TOOLCHAIN_ROOT)/bin/mips64el-linux-android- endif -TARGET_CC := $(TARGET_TOOLS_PREFIX)gcc$(HOST_EXECUTABLE_SUFFIX) -TARGET_CXX := $(TARGET_TOOLS_PREFIX)g++$(HOST_EXECUTABLE_SUFFIX) -TARGET_AR := $(TARGET_TOOLS_PREFIX)ar$(HOST_EXECUTABLE_SUFFIX) -TARGET_OBJCOPY := $(TARGET_TOOLS_PREFIX)objcopy$(HOST_EXECUTABLE_SUFFIX) -TARGET_LD := $(TARGET_TOOLS_PREFIX)ld$(HOST_EXECUTABLE_SUFFIX) -TARGET_READELF := $(TARGET_TOOLS_PREFIX)readelf$(HOST_EXECUTABLE_SUFFIX) -TARGET_STRIP := $(TARGET_TOOLS_PREFIX)strip$(HOST_EXECUTABLE_SUFFIX) +TARGET_CC := $(TARGET_TOOLS_PREFIX)gcc +TARGET_CXX := $(TARGET_TOOLS_PREFIX)g++ +TARGET_AR := $(TARGET_TOOLS_PREFIX)ar +TARGET_OBJCOPY := $(TARGET_TOOLS_PREFIX)objcopy +TARGET_LD := $(TARGET_TOOLS_PREFIX)ld +TARGET_READELF := $(TARGET_TOOLS_PREFIX)readelf +TARGET_STRIP := $(TARGET_TOOLS_PREFIX)strip +TARGET_NM := $(TARGET_TOOLS_PREFIX)nm + +define $(combo_var_prefix)transform-shared-lib-to-toc +$(call _gen_toc_command_for_elf,$(1),$(2)) +endef TARGET_NO_UNDEFINED_LDFLAGS := -Wl,--no-undefined @@ -79,22 +83,25 @@ ifeq ($(FORCE_MIPS_DEBUGGING),true) TARGET_mips_CFLAGS += -fno-omit-frame-pointer endif -android_config_h := $(call select-android-config-h,linux-mips64) - TARGET_GLOBAL_CFLAGS += \ $(TARGET_mips_CFLAGS) \ -U__unix -U__unix__ -Umips \ -ffunction-sections \ -fdata-sections \ -funwind-tables \ + -fstack-protector-strong \ -Wa,--noexecstack \ -Werror=format-security \ -D_FORTIFY_SOURCE=2 \ -no-canonical-prefixes \ -fno-canonical-system-headers \ $(arch_variant_cflags) \ - -include $(android_config_h) \ - -I $(dir $(android_config_h)) + +# Help catch common 32/64-bit errors. +TARGET_GLOBAL_CFLAGS += \ + -Werror=pointer-to-int-cast \ + -Werror=int-to-pointer-cast \ + -Werror=implicit-function-declaration \ ifneq ($(ARCH_MIPS_PAGE_SHIFT),) TARGET_GLOBAL_CFLAGS += -DPAGE_SHIFT=$(ARCH_MIPS_PAGE_SHIFT) @@ -104,10 +111,15 @@ TARGET_GLOBAL_LDFLAGS += \ -Wl,-z,noexecstack \ -Wl,-z,relro \ -Wl,-z,now \ + -Wl,--build-id=md5 \ -Wl,--warn-shared-textrel \ -Wl,--fatal-warnings \ + -Wl,--no-undefined-version \ $(arch_variant_ldflags) +# Disable transitive dependency library symbol resolving. +TARGET_GLOBAL_LDFLAGS += -Wl,--allow-shlib-undefined + TARGET_GLOBAL_CPPFLAGS += -fvisibility-inlines-hidden # More flags/options can be added here @@ -121,8 +133,6 @@ TARGET_RELEASE_CFLAGS := \ libc_root := bionic/libc libm_root := bionic/libm -libstdc++_root := bionic/libstdc++ -libthread_db_root := bionic/libthread_db ## on some hosts, the target cross-compiler is not available so do not run this command @@ -138,9 +148,12 @@ LIBGCC_EH := $(shell $(TARGET_CC) $(TARGET_GLOBAL_CFLAGS) -print-file-name=libgc ifneq ($(LIBGCC_EH),libgcc_eh.a) TARGET_LIBGCC += $(LIBGCC_EH) endif +TARGET_LIBGCOV := $(shell $(TARGET_CC) $(TARGET_GLOBAL_CFLAGS) \ + --print-file-name=libgcov.a) endif KERNEL_HEADERS_COMMON := $(libc_root)/kernel/uapi +KERNEL_HEADERS_COMMON += $(libc_root)/kernel/common KERNEL_HEADERS_ARCH := $(libc_root)/kernel/uapi/asm-mips # TODO: perhaps use $(libc_root)/kernel/uapi/asm-$(TARGET_ARCH) instead of asm-mips ? KERNEL_HEADERS := $(KERNEL_HEADERS_COMMON) $(KERNEL_HEADERS_ARCH) @@ -148,11 +161,10 @@ KERNEL_HEADERS := $(KERNEL_HEADERS_COMMON) $(KERNEL_HEADERS_ARCH) TARGET_C_INCLUDES := \ $(libc_root)/arch-mips64/include \ $(libc_root)/include \ - $(libstdc++_root)/include \ $(KERNEL_HEADERS) \ $(libm_root)/include \ $(libm_root)/include/mips \ - $(libthread_db_root)/include + # TODO: perhaps use $(libm_root)/include/mips64 instead of mips ? TARGET_CRTBEGIN_STATIC_O := $(TARGET_OUT_INTERMEDIATE_LIBRARIES)/crtbegin_static.o @@ -162,81 +174,6 @@ TARGET_CRTEND_O := $(TARGET_OUT_INTERMEDIATE_LIBRARIES)/crtend_android.o TARGET_CRTBEGIN_SO_O := $(TARGET_OUT_INTERMEDIATE_LIBRARIES)/crtbegin_so.o TARGET_CRTEND_SO_O := $(TARGET_OUT_INTERMEDIATE_LIBRARIES)/crtend_so.o -TARGET_STRIP_MODULE:=true - -TARGET_DEFAULT_SYSTEM_SHARED_LIBRARIES := libc libstdc++ libm - -TARGET_CUSTOM_LD_COMMAND := true - -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) \ - $(PRIVATE_TARGET_GLOBAL_LD_DIRS) \ - $(if $(filter true,$(PRIVATE_NO_CRT)),,$(PRIVATE_TARGET_CRTBEGIN_SO_O)) \ - $(PRIVATE_ALL_OBJECTS) \ - -Wl,--whole-archive \ - $(call normalize-target-libraries,$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES)) \ - -Wl,--no-whole-archive \ - $(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--start-group) \ - $(call normalize-target-libraries,$(PRIVATE_ALL_STATIC_LIBRARIES)) \ - $(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--end-group) \ - $(if $(TARGET_BUILD_APPS),$(PRIVATE_TARGET_LIBGCC)) \ - $(call normalize-target-libraries,$(PRIVATE_ALL_SHARED_LIBRARIES)) \ - -o $@ \ - $(PRIVATE_TARGET_GLOBAL_LDFLAGS) \ - $(PRIVATE_LDFLAGS) \ - $(PRIVATE_TARGET_LIBATOMIC) \ - $(if $(PRIVATE_LIBCXX),,$(PRIVATE_TARGET_LIBGCC)) \ - $(if $(filter true,$(PRIVATE_NO_CRT)),,$(PRIVATE_TARGET_CRTEND_SO_O)) \ - $(PRIVATE_LDLIBS) -endef +TARGET_PACK_MODULE_RELOCATIONS := true -define transform-o-to-executable-inner -$(hide) $(PRIVATE_CXX) -nostdlib -Bdynamic -pie \ - -Wl,-dynamic-linker,/system/bin/linker64 \ - -Wl,--gc-sections \ - -Wl,-z,nocopyreloc \ - $(PRIVATE_TARGET_GLOBAL_LD_DIRS) \ - -Wl,-rpath-link=$(PRIVATE_TARGET_OUT_INTERMEDIATE_LIBRARIES) \ - $(if $(filter true,$(PRIVATE_NO_CRT)),,$(PRIVATE_TARGET_CRTBEGIN_DYNAMIC_O)) \ - $(PRIVATE_ALL_OBJECTS) \ - -Wl,--whole-archive \ - $(call normalize-target-libraries,$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES)) \ - -Wl,--no-whole-archive \ - $(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--start-group) \ - $(call normalize-target-libraries,$(PRIVATE_ALL_STATIC_LIBRARIES)) \ - $(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--end-group) \ - $(if $(TARGET_BUILD_APPS),$(PRIVATE_TARGET_LIBGCC)) \ - $(call normalize-target-libraries,$(PRIVATE_ALL_SHARED_LIBRARIES)) \ - -o $@ \ - $(PRIVATE_TARGET_GLOBAL_LDFLAGS) \ - $(PRIVATE_LDFLAGS) \ - $(PRIVATE_TARGET_LIBATOMIC) \ - $(if $(PRIVATE_LIBCXX),,$(PRIVATE_TARGET_LIBGCC)) \ - $(if $(filter true,$(PRIVATE_NO_CRT)),,$(PRIVATE_TARGET_CRTEND_O)) \ - $(PRIVATE_LDLIBS) -endef - -define transform-o-to-static-executable-inner -$(hide) $(PRIVATE_CXX) -nostdlib -Bstatic \ - -Wl,--gc-sections \ - -o $@ \ - $(PRIVATE_TARGET_GLOBAL_LD_DIRS) \ - $(if $(filter true,$(PRIVATE_NO_CRT)),,$(PRIVATE_TARGET_CRTBEGIN_STATIC_O)) \ - $(PRIVATE_TARGET_GLOBAL_LDFLAGS) \ - $(PRIVATE_LDFLAGS) \ - $(PRIVATE_ALL_OBJECTS) \ - -Wl,--whole-archive \ - $(call normalize-target-libraries,$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES)) \ - -Wl,--no-whole-archive \ - $(call normalize-target-libraries,$(filter-out %libc_nomalloc.a,$(filter-out %libc.a,$(PRIVATE_ALL_STATIC_LIBRARIES)))) \ - -Wl,--start-group \ - $(call normalize-target-libraries,$(filter %libc.a,$(PRIVATE_ALL_STATIC_LIBRARIES))) \ - $(call normalize-target-libraries,$(filter %libc_nomalloc.a,$(PRIVATE_ALL_STATIC_LIBRARIES))) \ - $(PRIVATE_TARGET_LIBATOMIC) \ - $(if $(PRIVATE_LIBCXX),,$(PRIVATE_TARGET_LIBGCC)) \ - -Wl,--end-group \ - $(if $(filter true,$(PRIVATE_NO_CRT)),,$(PRIVATE_TARGET_CRTEND_O)) -endef +TARGET_LINKER := /system/bin/linker64 diff --git a/core/combo/TARGET_linux-x86.mk b/core/combo/TARGET_linux-x86.mk index 0af39488b..558ec3b6b 100644 --- a/core/combo/TARGET_linux-x86.mk +++ b/core/combo/TARGET_linux-x86.mk @@ -23,10 +23,10 @@ TARGET_$(combo_2nd_arch_prefix)ARCH_VARIANT := x86 endif # Decouple NDK library selection with platform compiler version -$(combo_2nd_arch_prefix)TARGET_NDK_GCC_VERSION := 4.8 +$(combo_2nd_arch_prefix)TARGET_NDK_GCC_VERSION := 4.9 ifeq ($(strip $(TARGET_GCC_VERSION_EXP)),) -$(combo_2nd_arch_prefix)TARGET_GCC_VERSION := 4.8 +$(combo_2nd_arch_prefix)TARGET_GCC_VERSION := 4.9 else $(combo_2nd_arch_prefix)TARGET_GCC_VERSION := $(TARGET_GCC_VERSION_EXP) endif @@ -49,33 +49,38 @@ $(combo_2nd_arch_prefix)TARGET_TOOLCHAIN_ROOT := prebuilts/gcc/$(HOST_PREBUILT_T $(combo_2nd_arch_prefix)TARGET_TOOLS_PREFIX := $($(combo_2nd_arch_prefix)TARGET_TOOLCHAIN_ROOT)/bin/x86_64-linux-android- 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) -$(combo_2nd_arch_prefix)TARGET_AR := $($(combo_2nd_arch_prefix)TARGET_TOOLS_PREFIX)ar$(HOST_EXECUTABLE_SUFFIX) -$(combo_2nd_arch_prefix)TARGET_OBJCOPY := $($(combo_2nd_arch_prefix)TARGET_TOOLS_PREFIX)objcopy$(HOST_EXECUTABLE_SUFFIX) -$(combo_2nd_arch_prefix)TARGET_LD := $($(combo_2nd_arch_prefix)TARGET_TOOLS_PREFIX)ld$(HOST_EXECUTABLE_SUFFIX) -$(combo_2nd_arch_prefix)TARGET_READELF := $($(combo_2nd_arch_prefix)TARGET_TOOLS_PREFIX)readelf$(HOST_EXECUTABLE_SUFFIX) -$(combo_2nd_arch_prefix)TARGET_STRIP := $($(combo_2nd_arch_prefix)TARGET_TOOLS_PREFIX)strip$(HOST_EXECUTABLE_SUFFIX) +$(combo_2nd_arch_prefix)TARGET_CC := $($(combo_2nd_arch_prefix)TARGET_TOOLS_PREFIX)gcc +$(combo_2nd_arch_prefix)TARGET_CXX := $($(combo_2nd_arch_prefix)TARGET_TOOLS_PREFIX)g++ +$(combo_2nd_arch_prefix)TARGET_AR := $($(combo_2nd_arch_prefix)TARGET_TOOLS_PREFIX)ar +$(combo_2nd_arch_prefix)TARGET_OBJCOPY := $($(combo_2nd_arch_prefix)TARGET_TOOLS_PREFIX)objcopy +$(combo_2nd_arch_prefix)TARGET_LD := $($(combo_2nd_arch_prefix)TARGET_TOOLS_PREFIX)ld +$(combo_2nd_arch_prefix)TARGET_READELF := $($(combo_2nd_arch_prefix)TARGET_TOOLS_PREFIX)readelf +$(combo_2nd_arch_prefix)TARGET_STRIP := $($(combo_2nd_arch_prefix)TARGET_TOOLS_PREFIX)strip +$(combo_2nd_arch_prefix)TARGET_NM := $($(combo_2nd_arch_prefix)TARGET_TOOLS_PREFIX)nm + +define $(combo_var_prefix)transform-shared-lib-to-toc +$(call _gen_toc_command_for_elf,$(1),$(2)) +endef ifneq ($(wildcard $($(combo_2nd_arch_prefix)TARGET_CC)),) $(combo_2nd_arch_prefix)TARGET_LIBGCC := \ $(shell $($(combo_2nd_arch_prefix)TARGET_CC) -m32 -print-file-name=libgcc.a) $(combo_2nd_arch_prefix)TARGET_LIBATOMIC := \ $(shell $($(combo_2nd_arch_prefix)TARGET_CC) -m32 -print-file-name=libatomic.a) +$(combo_2nd_arch_prefix)TARGET_LIBGCOV := \ + $(shell $($(combo_2nd_arch_prefix)TARGET_CC) -m32 -print-file-name=libgcov.a) endif $(combo_2nd_arch_prefix)TARGET_NO_UNDEFINED_LDFLAGS := -Wl,--no-undefined libc_root := bionic/libc libm_root := bionic/libm -libstdc++_root := bionic/libstdc++ KERNEL_HEADERS_COMMON := $(libc_root)/kernel/uapi +KERNEL_HEADERS_COMMON += $(libc_root)/kernel/common KERNEL_HEADERS_ARCH := $(libc_root)/kernel/uapi/asm-x86 # x86 covers both x86 and x86_64. KERNEL_HEADERS := $(KERNEL_HEADERS_COMMON) $(KERNEL_HEADERS_ARCH) -android_config_h := $(call select-android-config-h,target_linux-x86) - $(combo_2nd_arch_prefix)TARGET_GLOBAL_CFLAGS += \ -O2 \ -Wa,--noexecstack \ @@ -89,12 +94,10 @@ $(combo_2nd_arch_prefix)TARGET_GLOBAL_CFLAGS += \ -fstrict-aliasing \ -funswitch-loops \ -funwind-tables \ - -fstack-protector \ + -fstack-protector-strong \ -m32 \ -no-canonical-prefixes \ -fno-canonical-system-headers \ - -include $(android_config_h) \ - -I $(dir $(android_config_h)) $(combo_2nd_arch_prefix)TARGET_GLOBAL_CFLAGS += $(arch_variant_cflags) @@ -121,14 +124,16 @@ $(combo_2nd_arch_prefix)TARGET_GLOBAL_LDFLAGS += -m32 $(combo_2nd_arch_prefix)TARGET_GLOBAL_LDFLAGS += -Wl,-z,noexecstack $(combo_2nd_arch_prefix)TARGET_GLOBAL_LDFLAGS += -Wl,-z,relro -Wl,-z,now +$(combo_2nd_arch_prefix)TARGET_GLOBAL_LDFLAGS += -Wl,--build-id=md5 $(combo_2nd_arch_prefix)TARGET_GLOBAL_LDFLAGS += -Wl,--warn-shared-textrel $(combo_2nd_arch_prefix)TARGET_GLOBAL_LDFLAGS += -Wl,--fatal-warnings $(combo_2nd_arch_prefix)TARGET_GLOBAL_LDFLAGS += -Wl,--gc-sections +$(combo_2nd_arch_prefix)TARGET_GLOBAL_LDFLAGS += -Wl,--hash-style=gnu +$(combo_2nd_arch_prefix)TARGET_GLOBAL_LDFLAGS += -Wl,--no-undefined-version $(combo_2nd_arch_prefix)TARGET_C_INCLUDES := \ $(libc_root)/arch-x86/include \ $(libc_root)/include \ - $(libstdc++_root)/include \ $(KERNEL_HEADERS) \ $(libm_root)/include \ $(libm_root)/include/i387 \ @@ -140,77 +145,8 @@ $(combo_2nd_arch_prefix)TARGET_CRTEND_O := $($(combo_2nd_arch_prefix)TARGET_OUT_ $(combo_2nd_arch_prefix)TARGET_CRTBEGIN_SO_O := $($(combo_2nd_arch_prefix)TARGET_OUT_INTERMEDIATE_LIBRARIES)/crtbegin_so.o $(combo_2nd_arch_prefix)TARGET_CRTEND_SO_O := $($(combo_2nd_arch_prefix)TARGET_OUT_INTERMEDIATE_LIBRARIES)/crtend_so.o -$(combo_2nd_arch_prefix)TARGET_STRIP_MODULE:=true - -$(combo_2nd_arch_prefix)TARGET_DEFAULT_SYSTEM_SHARED_LIBRARIES := libc libstdc++ libm - -$(combo_2nd_arch_prefix)TARGET_CUSTOM_LD_COMMAND := true -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) \ - $(PRIVATE_TARGET_GLOBAL_LD_DIRS) \ - $(if $(filter true,$(PRIVATE_NO_CRT)),,$(PRIVATE_TARGET_CRTBEGIN_SO_O)) \ - $(PRIVATE_ALL_OBJECTS) \ - -Wl,--whole-archive \ - $(call normalize-target-libraries,$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES)) \ - -Wl,--no-whole-archive \ - $(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--start-group) \ - $(call normalize-target-libraries,$(PRIVATE_ALL_STATIC_LIBRARIES)) \ - $(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--end-group) \ - $(if $(TARGET_BUILD_APPS),$(PRIVATE_TARGET_LIBGCC)) \ - $(call normalize-target-libraries,$(PRIVATE_ALL_SHARED_LIBRARIES)) \ - -o $@ \ - $(PRIVATE_LDFLAGS) \ - $(PRIVATE_TARGET_LIBATOMIC) \ - $(if $(PRIVATE_LIBCXX),,$(PRIVATE_TARGET_LIBGCC)) \ - $(if $(filter true,$(PRIVATE_NO_CRT)),,$(PRIVATE_TARGET_CRTEND_SO_O)) \ - $(PRIVATE_LDLIBS) -endef +$(combo_2nd_arch_prefix)TARGET_PACK_MODULE_RELOCATIONS := true -define $(combo_2nd_arch_prefix)transform-o-to-executable-inner -$(hide) $(PRIVATE_CXX) \ - $(PRIVATE_TARGET_GLOBAL_LDFLAGS) \ - -nostdlib -Bdynamic \ - -Wl,-z,nocopyreloc \ - -pie \ - $(PRIVATE_TARGET_GLOBAL_LD_DIRS) \ - -Wl,-rpath-link=$(PRIVATE_TARGET_OUT_INTERMEDIATE_LIBRARIES) \ - $(if $(filter true,$(PRIVATE_NO_CRT)),,$(PRIVATE_TARGET_CRTBEGIN_DYNAMIC_O)) \ - $(PRIVATE_ALL_OBJECTS) \ - -Wl,--whole-archive \ - $(call normalize-target-libraries,$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES)) \ - -Wl,--no-whole-archive \ - $(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--start-group) \ - $(call normalize-target-libraries,$(PRIVATE_ALL_STATIC_LIBRARIES)) \ - $(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--end-group) \ - $(if $(TARGET_BUILD_APPS),$(PRIVATE_TARGET_LIBGCC)) \ - $(call normalize-target-libraries,$(PRIVATE_ALL_SHARED_LIBRARIES)) \ - -o $@ \ - $(PRIVATE_LDFLAGS) \ - $(PRIVATE_TARGET_LIBATOMIC) \ - $(if $(PRIVATE_LIBCXX),,$(PRIVATE_TARGET_LIBGCC)) \ - $(if $(filter true,$(PRIVATE_NO_CRT)),,$(PRIVATE_TARGET_CRTEND_O)) \ - $(PRIVATE_LDLIBS) -endef +$(combo_2nd_arch_prefix)TARGET_LINKER := /system/bin/linker -define $(combo_2nd_arch_prefix)transform-o-to-static-executable-inner -$(hide) $(PRIVATE_CXX) \ - $(PRIVATE_TARGET_GLOBAL_LDFLAGS) \ - -nostdlib -Bstatic \ - -o $@ \ - $(PRIVATE_TARGET_GLOBAL_LD_DIRS) \ - $(if $(filter true,$(PRIVATE_NO_CRT)),,$(PRIVATE_TARGET_CRTBEGIN_STATIC_O)) \ - $(PRIVATE_LDFLAGS) \ - $(PRIVATE_ALL_OBJECTS) \ - -Wl,--whole-archive \ - $(call normalize-target-libraries,$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES)) \ - -Wl,--no-whole-archive \ - -Wl,--start-group \ - $(call normalize-target-libraries,$(PRIVATE_ALL_STATIC_LIBRARIES)) \ - $(PRIVATE_TARGET_LIBATOMIC) \ - $(if $(PRIVATE_LIBCXX),,$(PRIVATE_TARGET_LIBGCC)) \ - -Wl,--end-group \ - $(if $(filter true,$(PRIVATE_NO_CRT)),,$(PRIVATE_TARGET_CRTEND_O)) -endef +$(combo_2nd_arch_prefix)TARGET_GLOBAL_YASM_FLAGS := -f elf32 -m x86 diff --git a/core/combo/TARGET_linux-x86_64.mk b/core/combo/TARGET_linux-x86_64.mk index 33d6a56b0..12166ec47 100644 --- a/core/combo/TARGET_linux-x86_64.mk +++ b/core/combo/TARGET_linux-x86_64.mk @@ -23,10 +23,10 @@ TARGET_ARCH_VARIANT := x86_64 endif # Decouple NDK library selection with platform compiler version -TARGET_NDK_GCC_VERSION := 4.8 +TARGET_NDK_GCC_VERSION := 4.9 ifeq ($(strip $(TARGET_GCC_VERSION_EXP)),) -TARGET_GCC_VERSION := 4.8 +TARGET_GCC_VERSION := 4.9 else TARGET_GCC_VERSION := $(TARGET_GCC_VERSION_EXP) endif @@ -49,28 +49,35 @@ TARGET_TOOLCHAIN_ROOT := prebuilts/gcc/$(HOST_PREBUILT_TAG)/x86/x86_64-linux-and TARGET_TOOLS_PREFIX := $(TARGET_TOOLCHAIN_ROOT)/bin/x86_64-linux-android- endif -TARGET_CC := $(TARGET_TOOLS_PREFIX)gcc$(HOST_EXECUTABLE_SUFFIX) -TARGET_CXX := $(TARGET_TOOLS_PREFIX)g++$(HOST_EXECUTABLE_SUFFIX) -TARGET_AR := $(TARGET_TOOLS_PREFIX)ar$(HOST_EXECUTABLE_SUFFIX) -TARGET_OBJCOPY := $(TARGET_TOOLS_PREFIX)objcopy$(HOST_EXECUTABLE_SUFFIX) -TARGET_LD := $(TARGET_TOOLS_PREFIX)ld$(HOST_EXECUTABLE_SUFFIX) -TARGET_READELF := $(TARGET_TOOLS_PREFIX)readelf$(HOST_EXECUTABLE_SUFFIX) -TARGET_STRIP := $(TARGET_TOOLS_PREFIX)strip$(HOST_EXECUTABLE_SUFFIX) +TARGET_CC := $(TARGET_TOOLS_PREFIX)gcc +TARGET_CXX := $(TARGET_TOOLS_PREFIX)g++ +TARGET_AR := $(TARGET_TOOLS_PREFIX)ar +TARGET_OBJCOPY := $(TARGET_TOOLS_PREFIX)objcopy +TARGET_LD := $(TARGET_TOOLS_PREFIX)ld +TARGET_READELF := $(TARGET_TOOLS_PREFIX)readelf +TARGET_STRIP := $(TARGET_TOOLS_PREFIX)strip +TARGET_NM := $(TARGET_TOOLS_PREFIX)nm + +define $(combo_var_prefix)transform-shared-lib-to-toc +$(call _gen_toc_command_for_elf,$(1),$(2)) +endef ifneq ($(wildcard $(TARGET_CC)),) TARGET_LIBGCC := \ $(shell $(TARGET_CC) -m64 -print-file-name=libgcc.a) TARGET_LIBATOMIC := \ $(shell $(TARGET_CC) -m64 -print-file-name=libatomic.a) +TARGET_LIBGCOV := \ + $(shell $(TARGET_CC) -m64 -print-file-name=libgcov.a) endif TARGET_NO_UNDEFINED_LDFLAGS := -Wl,--no-undefined libc_root := bionic/libc libm_root := bionic/libm -libstdc++_root := bionic/libstdc++ KERNEL_HEADERS_COMMON := $(libc_root)/kernel/uapi +KERNEL_HEADERS_COMMON += $(libc_root)/kernel/common KERNEL_HEADERS_ARCH := $(libc_root)/kernel/uapi/asm-x86 # x86 covers both x86 and x86_64. KERNEL_HEADERS := $(KERNEL_HEADERS_COMMON) $(KERNEL_HEADERS_ARCH) @@ -87,7 +94,7 @@ TARGET_GLOBAL_CFLAGS += \ -fstrict-aliasing \ -funswitch-loops \ -funwind-tables \ - -fstack-protector \ + -fstack-protector-strong \ -m64 \ -no-canonical-prefixes \ -fno-canonical-system-headers @@ -96,10 +103,7 @@ TARGET_GLOBAL_CFLAGS += \ TARGET_GLOBAL_CFLAGS += \ -Werror=pointer-to-int-cast \ -Werror=int-to-pointer-cast \ - -android_config_h := $(call select-android-config-h,target_linux-x86) -TARGET_ANDROID_CONFIG_CFLAGS := -include $(android_config_h) -I $(dir $(android_config_h)) -TARGET_GLOBAL_CFLAGS += $(TARGET_ANDROID_CONFIG_CFLAGS) + -Werror=implicit-function-declaration \ TARGET_GLOBAL_CFLAGS += $(arch_variant_cflags) @@ -115,6 +119,9 @@ endif ifeq ($(ARCH_X86_HAVE_SSE4_2),true) TARGET_GLOBAL_CFLAGS += -msse4.2 endif +ifeq ($(ARCH_X86_HAVE_POPCNT),true) + TARGET_GLOBAL_CFLAGS += -mpopcnt +endif ifeq ($(ARCH_X86_HAVE_AVX),true) TARGET_GLOBAL_CFLAGS += -mavx endif @@ -126,14 +133,16 @@ TARGET_GLOBAL_LDFLAGS += -m64 TARGET_GLOBAL_LDFLAGS += -Wl,-z,noexecstack TARGET_GLOBAL_LDFLAGS += -Wl,-z,relro -Wl,-z,now +TARGET_GLOBAL_LDFLAGS += -Wl,--build-id=md5 TARGET_GLOBAL_LDFLAGS += -Wl,--warn-shared-textrel TARGET_GLOBAL_LDFLAGS += -Wl,--fatal-warnings TARGET_GLOBAL_LDFLAGS += -Wl,--gc-sections +TARGET_GLOBAL_LDFLAGS += -Wl,--hash-style=gnu +TARGET_GLOBAL_LDFLAGS += -Wl,--no-undefined-version TARGET_C_INCLUDES := \ $(libc_root)/arch-x86_64/include \ $(libc_root)/include \ - $(libstdc++_root)/include \ $(KERNEL_HEADERS) \ $(libm_root)/include \ $(libm_root)/include/amd64 \ @@ -145,77 +154,6 @@ TARGET_CRTEND_O := $(TARGET_OUT_INTERMEDIATE_LIBRARIES)/crtend_android.o TARGET_CRTBEGIN_SO_O := $(TARGET_OUT_INTERMEDIATE_LIBRARIES)/crtbegin_so.o TARGET_CRTEND_SO_O := $(TARGET_OUT_INTERMEDIATE_LIBRARIES)/crtend_so.o -TARGET_STRIP_MODULE:=true - -TARGET_DEFAULT_SYSTEM_SHARED_LIBRARIES := libc libstdc++ libm - -TARGET_CUSTOM_LD_COMMAND := true -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) \ - $(PRIVATE_TARGET_GLOBAL_LD_DIRS) \ - $(if $(filter true,$(PRIVATE_NO_CRT)),,$(PRIVATE_TARGET_CRTBEGIN_SO_O)) \ - $(PRIVATE_ALL_OBJECTS) \ - -Wl,--whole-archive \ - $(call normalize-target-libraries,$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES)) \ - -Wl,--no-whole-archive \ - $(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--start-group) \ - $(call normalize-target-libraries,$(PRIVATE_ALL_STATIC_LIBRARIES)) \ - $(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--end-group) \ - $(if $(TARGET_BUILD_APPS),$(PRIVATE_TARGET_LIBGCC)) \ - $(call normalize-target-libraries,$(PRIVATE_ALL_SHARED_LIBRARIES)) \ - -o $@ \ - $(PRIVATE_LDFLAGS) \ - $(PRIVATE_TARGET_LIBATOMIC) \ - $(if $(PRIVATE_LIBCXX),,$(PRIVATE_TARGET_LIBGCC)) \ - $(if $(filter true,$(PRIVATE_NO_CRT)),,$(PRIVATE_TARGET_CRTEND_SO_O)) -endef +TARGET_LINKER := /system/bin/linker64 -define transform-o-to-executable-inner -$(hide) $(PRIVATE_CXX) \ - $(PRIVATE_TARGET_GLOBAL_LDFLAGS) \ - -nostdlib -Bdynamic \ - -Wl,-z,nocopyreloc \ - -pie \ - $(PRIVATE_TARGET_GLOBAL_LD_DIRS) \ - -Wl,-rpath-link=$(PRIVATE_TARGET_OUT_INTERMEDIATE_LIBRARIES) \ - $(if $(filter true,$(PRIVATE_NO_CRT)),,$(PRIVATE_TARGET_CRTBEGIN_DYNAMIC_O)) \ - $(PRIVATE_ALL_OBJECTS) \ - -Wl,--whole-archive \ - $(call normalize-target-libraries,$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES)) \ - -Wl,--no-whole-archive \ - $(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--start-group) \ - $(call normalize-target-libraries,$(PRIVATE_ALL_STATIC_LIBRARIES)) \ - $(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--end-group) \ - $(if $(TARGET_BUILD_APPS),$(PRIVATE_TARGET_LIBGCC)) \ - $(call normalize-target-libraries,$(PRIVATE_ALL_SHARED_LIBRARIES)) \ - -o $@ \ - $(PRIVATE_LDFLAGS) \ - $(PRIVATE_TARGET_LIBATOMIC) \ - $(if $(PRIVATE_LIBCXX),,$(PRIVATE_TARGET_LIBGCC)) \ - $(if $(filter true,$(PRIVATE_NO_CRT)),,$(PRIVATE_TARGET_CRTEND_O)) \ - $(PRIVATE_LDLIBS) -endef - -define transform-o-to-static-executable-inner -$(hide) $(PRIVATE_CXX) \ - $(PRIVATE_TARGET_GLOBAL_LDFLAGS) \ - -nostdlib -Bstatic \ - -o $@ \ - $(PRIVATE_TARGET_GLOBAL_LD_DIRS) \ - $(if $(filter true,$(PRIVATE_NO_CRT)),,$(PRIVATE_TARGET_CRTBEGIN_STATIC_O)) \ - $(PRIVATE_LDFLAGS) \ - $(PRIVATE_ALL_OBJECTS) \ - -Wl,--whole-archive \ - $(call normalize-target-libraries,$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES)) \ - -Wl,--no-whole-archive \ - -Wl,--start-group \ - $(call normalize-target-libraries,$(PRIVATE_ALL_STATIC_LIBRARIES)) \ - $(PRIVATE_TARGET_LIBATOMIC) \ - $(if $(PRIVATE_LIBCXX),,$(PRIVATE_TARGET_LIBGCC)) \ - -Wl,--end-group \ - $(if $(filter true,$(PRIVATE_NO_CRT)),,$(PRIVATE_TARGET_CRTEND_O)) \ - $(PRIVATE_LDLIBS) -endef +TARGET_GLOBAL_YASM_FLAGS := -f elf64 -m amd64 diff --git a/core/combo/arch/arm/armv7-a-neon.mk b/core/combo/arch/arm/armv7-a-neon.mk index c6603db40..8dee4eaed 100644 --- a/core/combo/arch/arm/armv7-a-neon.mk +++ b/core/combo/arch/arm/armv7-a-neon.mk @@ -6,23 +6,58 @@ 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 +local_arch_has_lpae := false + +ifneq (,$(filter cortex-a15 denver krait,$(TARGET_$(combo_2nd_arch_prefix)CPU_VARIANT))) + # TODO: krait is not a cortex-a15, we set the variant to cortex-a15 so that + # hardware divide operations are generated. This should be removed and a + # krait CPU variant added to GCC. For clang we specify -mcpu for krait in + # core/clang/arm.mk. + arch_variant_cflags := -mcpu=cortex-a15 -mfpu=neon-vfpv4 + + local_arch_has_lpae := true + 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 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 +ifneq (,$(filter cortex-a7 cortex-a53 cortex-a53.a57,$(TARGET_$(combo_2nd_arch_prefix)CPU_VARIANT))) + arch_variant_cflags := -mcpu=cortex-a7 -mfpu=neon-vfpv4 + + local_arch_has_lpae := true + 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 +ifeq (true,$(local_arch_has_lpae)) + # Fake an ARM compiler flag as these processors support LPAE which GCC/clang + # don't advertise. + # TODO This is a hack and we need to add it for each processor that supports LPAE until some + # better solution comes around. See Bug 27340895 + arch_variant_cflags += -D__ARM_FEATURE_LPAE=1 +endif -arch_variant_ldflags := \ - -Wl,--fix-cortex-a8 +local_arch_has_lpae := + +arch_variant_cflags += \ + -mfloat-abi=softfp diff --git a/core/combo/arch/arm64/armv8-a.mk b/core/combo/arch/arm64/armv8-a.mk index edc0497ee..5e27e5abb 100644 --- a/core/combo/arch/arm64/armv8-a.mk +++ b/core/combo/arch/arm64/armv8-a.mk @@ -1 +1,5 @@ -arch_variant_cflags := +ifneq (,$(filter cortex-a53,$(TARGET_$(combo_2nd_arch_prefix)CPU_VARIANT))) + arch_variant_cflags := -mcpu=cortex-a53 +else + arch_variant_cflags := +endif diff --git a/core/combo/arch/mips/mips32-fp.mk b/core/combo/arch/mips/mips32-fp.mk index 8320e9392..912ff631b 100644 --- a/core/combo/arch/mips/mips32-fp.mk +++ b/core/combo/arch/mips/mips32-fp.mk @@ -7,6 +7,7 @@ arch_variant_cflags := \ -mips32 \ -mfp32 \ -modd-spreg \ + -mno-synci arch_variant_ldflags := \ -Wl,-melf32ltsmip diff --git a/core/combo/arch/mips/mips32r2-fp-xburst.mk b/core/combo/arch/mips/mips32r2-fp-xburst.mk index 2b4f71484..09b3bc210 100644 --- a/core/combo/arch/mips/mips32r2-fp-xburst.mk +++ b/core/combo/arch/mips/mips32r2-fp-xburst.mk @@ -9,7 +9,8 @@ arch_variant_cflags := \ -mfp32 \ -modd-spreg \ -mno-fused-madd \ - -Wa,-mmxu + -Wa,-mmxu \ + -mno-synci arch_variant_ldflags := \ -Wl,-melf32ltsmip diff --git a/core/combo/arch/x86/x86-atom.mk b/core/combo/arch/x86/atom.mk similarity index 96% rename from core/combo/arch/x86/x86-atom.mk rename to core/combo/arch/x86/atom.mk index 508a0afb5..3800350a3 100644 --- a/core/combo/arch/x86/x86-atom.mk +++ b/core/combo/arch/x86/atom.mk @@ -11,6 +11,5 @@ ARCH_X86_HAVE_POPCNT := false # popcnt is not supported by current Atom CPUs # CFLAGS for this arch arch_variant_cflags := \ -march=atom \ - -mstackrealign \ -mfpmath=sse \ diff --git a/core/combo/arch/x86/haswell.mk b/core/combo/arch/x86/haswell.mk index a00e0a680..b3922c045 100644 --- a/core/combo/arch/x86/haswell.mk +++ b/core/combo/arch/x86/haswell.mk @@ -7,10 +7,11 @@ ARCH_X86_HAVE_SSE4_1 := true ARCH_X86_HAVE_SSE4_2 := true ARCH_X86_HAVE_AES_NI := true ARCH_X86_HAVE_AVX := true +ARCH_X86_HAVE_POPCNT := true +ARCH_X86_HAVE_MOVBE := true # CFLAGS for this arch arch_variant_cflags := \ -march=core-avx2 \ - -mstackrealign \ -mfpmath=sse \ diff --git a/core/combo/arch/x86/ivybridge.mk b/core/combo/arch/x86/ivybridge.mk index 02dc1e006..c9fc33b01 100644 --- a/core/combo/arch/x86/ivybridge.mk +++ b/core/combo/arch/x86/ivybridge.mk @@ -7,10 +7,11 @@ ARCH_X86_HAVE_SSE4_1 := true ARCH_X86_HAVE_SSE4_2 := true ARCH_X86_HAVE_AES_NI := true ARCH_X86_HAVE_AVX := true +ARCH_X86_HAVE_POPCNT := true +ARCH_X86_HAVE_MOVBE := false # CFLAGS for this arch arch_variant_cflags := \ -march=core-avx-i \ - -mstackrealign \ -mfpmath=sse \ diff --git a/core/combo/arch/x86/sandybridge.mk b/core/combo/arch/x86/sandybridge.mk index dfa540c42..bca595373 100644 --- a/core/combo/arch/x86/sandybridge.mk +++ b/core/combo/arch/x86/sandybridge.mk @@ -2,13 +2,16 @@ # Generating binaries for SandyBridge processors. # ARCH_X86_HAVE_SSSE3 := true +ARCH_X86_HAVE_SSE4 := true ARCH_X86_HAVE_SSE4_1 := true ARCH_X86_HAVE_SSE4_2 := true +ARCH_X86_HAVE_AES_NI := true ARCH_X86_HAVE_AVX := true +ARCH_X86_HAVE_POPCNT := true +ARCH_X86_HAVE_MOVBE := false # CFLAGS for this arch arch_variant_cflags := \ -march=corei7-avx \ - -mstackrealign \ -mfpmath=sse \ diff --git a/core/combo/arch/x86/silvermont.mk b/core/combo/arch/x86/silvermont.mk index 3a8718d1a..d064b1df2 100644 --- a/core/combo/arch/x86/silvermont.mk +++ b/core/combo/arch/x86/silvermont.mk @@ -15,6 +15,5 @@ ARCH_X86_HAVE_MOVBE := true # CFLAGS for this arch arch_variant_cflags := \ -march=slm \ - -mstackrealign \ -mfpmath=sse \ diff --git a/core/combo/arch/x86/x86.mk b/core/combo/arch/x86/x86.mk index 73706c409..f0704263b 100644 --- a/core/combo/arch/x86/x86.mk +++ b/core/combo/arch/x86/x86.mk @@ -13,11 +13,7 @@ ARCH_X86_HAVE_MOVBE := false ARCH_X86_HAVE_POPCNT := false -# XXX: This flag is probably redundant, because it should be set by default -# by our toolchain binaries. However, there have been reports that this may -# not always work as intended, so keep it unless we have the time to check -# everything properly. - +# Some intrinsic functions used by libcxx only exist for prescott or newer CPUs. arch_variant_cflags := \ - -march=i686 \ + -march=prescott \ diff --git a/core/combo/arch/x86_64/haswell.mk b/core/combo/arch/x86_64/haswell.mk index 9cf95b322..6067eee65 100644 --- a/core/combo/arch/x86_64/haswell.mk +++ b/core/combo/arch/x86_64/haswell.mk @@ -7,6 +7,8 @@ ARCH_X86_HAVE_SSE4_1 := true ARCH_X86_HAVE_SSE4_2 := true ARCH_X86_HAVE_AES_NI := true ARCH_X86_HAVE_AVX := true +ARCH_X86_HAVE_POPCNT := true +ARCH_X86_HAVE_MOVBE := true # CFLAGS for this arch arch_variant_cflags := \ diff --git a/core/combo/arch/x86_64/ivybridge.mk b/core/combo/arch/x86_64/ivybridge.mk index 7b9519029..90e23a9f2 100644 --- a/core/combo/arch/x86_64/ivybridge.mk +++ b/core/combo/arch/x86_64/ivybridge.mk @@ -7,6 +7,8 @@ ARCH_X86_HAVE_SSE4_1 := true ARCH_X86_HAVE_SSE4_2 := true ARCH_X86_HAVE_AES_NI := true ARCH_X86_HAVE_AVX := true +ARCH_X86_HAVE_POPCNT := true +ARCH_X86_HAVE_MOVBE := false # CFLAGS for this arch arch_variant_cflags := \ diff --git a/core/combo/arch/x86_64/sandybridge.mk b/core/combo/arch/x86_64/sandybridge.mk index a443b6bd9..865548c6b 100644 --- a/core/combo/arch/x86_64/sandybridge.mk +++ b/core/combo/arch/x86_64/sandybridge.mk @@ -2,9 +2,13 @@ # Generating binaries for SandyBridge processors. # ARCH_X86_HAVE_SSSE3 := true +ARCH_X86_HAVE_SSE4 := true ARCH_X86_HAVE_SSE4_1 := true ARCH_X86_HAVE_SSE4_2 := true +ARCH_X86_HAVE_AES_NI := true ARCH_X86_HAVE_AVX := true +ARCH_X86_HAVE_POPCNT := true +ARCH_X86_HAVE_MOVBE := false # CFLAGS for this arch arch_variant_cflags := \ diff --git a/core/combo/arch/x86_64/x86_64-atom.mk b/core/combo/arch/x86_64/x86_64-atom.mk deleted file mode 100755 index 64b07a085..000000000 --- a/core/combo/arch/x86_64/x86_64-atom.mk +++ /dev/null @@ -1,13 +0,0 @@ -# This file contains feature macro definitions specific to the -# 'x86_64-atom' arch variant. This is an extension of the 'x86_64' base variant -# that adds Atom-specific features. -# -# See build/core/combo/arch/x86_64/x86_64.mk for differences. -# -ARCH_X86_HAVE_SSSE3 := true -ARCH_X86_HAVE_MOVBE := true -ARCH_X86_HAVE_POPCNT := false # popcnt is not supported by current Atom CPUs - -# CFLAGS for this arch -arch_variant_cflags := \ - -march=atom diff --git a/core/combo/arch/x86_64/x86_64.mk b/core/combo/arch/x86_64/x86_64.mk index 9d2b62013..08dd9cd86 100755 --- a/core/combo/arch/x86_64/x86_64.mk +++ b/core/combo/arch/x86_64/x86_64.mk @@ -8,6 +8,9 @@ ARCH_X86_HAVE_SSSE3 := true ARCH_X86_HAVE_MOVBE := false # Only supported on Atom. ARCH_X86_HAVE_POPCNT := true +ARCH_X86_HAVE_SSE4 := true +ARCH_X86_HAVE_SSE4_1 := true +ARCH_X86_HAVE_SSE4_2 := true # CFLAGS for this arch diff --git a/core/combo/fdo.mk b/core/combo/fdo.mk index 9e331b6fa..8fb8fd3a5 100644 --- a/core/combo/fdo.mk +++ b/core/combo/fdo.mk @@ -18,22 +18,16 @@ $(combo_2nd_arch_prefix)TARGET_FDO_CFLAGS:= -ifeq ($(strip $(BUILD_FDO_INSTRUMENT)), true) - # Set BUILD_FDO_INSTRUMENT=true to turn on FDO instrumentation. - # The profile will be generated on /sdcard/fdo_profile on the device. - $(combo_2nd_arch_prefix)TARGET_FDO_CFLAGS := -fprofile-generate=/sdcard/fdo_profile -DANDROID_FDO - $(combo_2nd_arch_prefix)TARGET_FDO_LDFLAGS := -lgcov -lgcc -else - ifeq ($(strip $(BUILD_FDO_OPTIMIZE)), true) - # Set TARGET_FDO_PROFILE_PATH to set a custom profile directory for your build. - ifeq ($(strip $($(combo_2nd_arch_prefix)TARGET_FDO_PROFILE_PATH)),) - $(combo_2nd_arch_prefix)TARGET_FDO_PROFILE_PATH := vendor/google_data/fdo_profile - endif +# Set BUILD_FDO_INSTRUMENT=true to turn on FDO instrumentation. +# The profile will be generated on /sdcard/fdo_profile on the device. +$(combo_2nd_arch_prefix)TARGET_FDO_INSTRUMENT_CFLAGS := -fprofile-generate=/sdcard/fdo_profile -DANDROID_FDO +$(combo_2nd_arch_prefix)TARGET_FDO_INSTRUMENT_LDFLAGS := -lgcov -lgcc - ifneq ($(strip $(wildcard $($(combo_2nd_arch_prefix)TARGET_FDO_PROFILE_PATH)/$(PRODUCT_OUT))),) - $(combo_2nd_arch_prefix)TARGET_FDO_CFLAGS := -fprofile-use=$($(combo_2nd_arch_prefix)TARGET_FDO_PROFILE_PATH) -DANDROID_FDO -fprofile-correction -Wcoverage-mismatch -Wno-error - else - $(warning Profile directory $($(combo_2nd_arch_prefix)TARGET_FDO_PROFILE_PATH)/$(PRODUCT_OUT) does not exist. Turn off FDO.) - endif - endif +# Set TARGET_FDO_PROFILE_PATH to set a custom profile directory for your build. +ifeq ($(strip $($(combo_2nd_arch_prefix)TARGET_FDO_PROFILE_PATH)),) + $(combo_2nd_arch_prefix)TARGET_FDO_PROFILE_PATH := vendor/google_data/fdo_profile endif + +$(combo_2nd_arch_prefix)TARGET_FDO_OPTIMIZE_CFLAGS := \ + -fprofile-use=$($(combo_2nd_arch_prefix)TARGET_FDO_PROFILE_PATH) \ + -DANDROID_FDO -fprofile-correction -Wcoverage-mismatch -Wno-error diff --git a/core/combo/include/arch/darwin-x86/AndroidConfig.h b/core/combo/include/arch/darwin-x86/AndroidConfig.h deleted file mode 100644 index 54f375090..000000000 --- a/core/combo/include/arch/darwin-x86/AndroidConfig.h +++ /dev/null @@ -1,298 +0,0 @@ -/* - * Copyright (C) 2005 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. - */ - -/* - * Android config -- "Darwin". Used for X86 Mac OS X. - */ -#ifndef _ANDROID_CONFIG_H -#define _ANDROID_CONFIG_H - -/* - * =========================================================================== - * !!! IMPORTANT !!! - * =========================================================================== - * - * This file is included by ALL C/C++ source files. Don't put anything in - * here unless you are absolutely certain it can't go anywhere else. - * - * Any C++ stuff must be wrapped with "#ifdef __cplusplus". Do not use "//" - * comments. - */ - -/* - * Threading model. Choose one: - * - * HAVE_PTHREADS - use the pthreads library. - * HAVE_WIN32_THREADS - use Win32 thread primitives. - * -- combine HAVE_CREATETHREAD, HAVE_CREATEMUTEX, and HAVE__BEGINTHREADEX - */ -#define HAVE_PTHREADS - -/* - * Do we have the futex syscall? - */ - -/* #define HAVE_FUTEX */ - -/* - * Process creation model. Choose one: - * - * HAVE_FORKEXEC - use fork() and exec() - * HAVE_WIN32_PROC - use CreateProcess() - */ -#define HAVE_FORKEXEC - -/* - * IPC model. Choose one: - * - * HAVE_SYSV_IPC - use the classic SysV IPC mechanisms (semget, shmget). - * HAVE_MACOSX_IPC - use Macintosh IPC mechanisms (sem_open, mmap). - * HAVE_WIN32_IPC - use Win32 IPC (CreateSemaphore, CreateFileMapping). - * HAVE_ANDROID_IPC - use Android versions (?, mmap). - */ -#define HAVE_MACOSX_IPC - -/* - * Memory-mapping model. Choose one: - * - * HAVE_POSIX_FILEMAP - use the Posix sys/mmap.h - * HAVE_WIN32_FILEMAP - use Win32 filemaps - */ -#define HAVE_POSIX_FILEMAP - -/* - * Define this if you have - */ -#define HAVE_TERMIO_H - -/* - * Define this if you have - */ -/* #define HAVE_SYS_SENDFILE_H 1 */ - -/* - * Define this if you build against MSVCRT.DLL - */ -/* #define HAVE_MS_C_RUNTIME */ - -/* - * Define this if you have sys/uio.h - */ -#define HAVE_SYS_UIO_H - -/* - * Define this if your platforms implements symbolic links - * in its filesystems - */ -#define HAVE_SYMLINKS - -/* - * Define this if we have localtime_r(). - */ -#define HAVE_LOCALTIME_R 1 - -/* - * Define this if we have gethostbyname_r(). - */ -/* #define HAVE_GETHOSTBYNAME_R */ - -/* - * Define this if we have ioctl(). - */ -/* #define HAVE_IOCTL */ - -/* - * Define this if we want to use WinSock. - */ -/* #define HAVE_WINSOCK */ - -/* - * Define this if have clock_gettime() and friends - */ -/* #define HAVE_POSIX_CLOCKS */ - -/* - * Endianness of the target machine. Choose one: - * - * HAVE_ENDIAN_H -- have endian.h header we can include. - * HAVE_LITTLE_ENDIAN -- we are little endian. - * HAVE_BIG_ENDIAN -- we are big endian. - */ -#if (defined(__ppc__) || defined(__ppc64__)) -# define HAVE_BIG_ENDIAN -#elif (defined(__i386__) || defined(__x86_64__)) -# define HAVE_LITTLE_ENDIAN -#endif - -/* - * We need to choose between 32-bit and 64-bit off_t. All of our code should - * agree on the same size. For desktop systems, use 64-bit values, - * because some of our libraries (e.g. wxWidgets) expect to be built that way. - */ -#define _FILE_OFFSET_BITS 64 -#define _LARGEFILE_SOURCE 1 - -/* - * Define if platform has off64_t (and lseek64 and other xxx64 functions) - */ -/* #define HAVE_OFF64_T */ - -/* - * Defined if we have the backtrace() call for retrieving a stack trace. - * Needed for CallStack to operate; if not defined, CallStack is - * non-functional. - */ -#define HAVE_BACKTRACE 0 - -/* - * Defined if we have the cxxabi.h header for demangling C++ symbols. If - * not defined, stack crawls will be displayed with raw mangled symbols - */ -#define HAVE_CXXABI 0 - -/* - * Defined if we have the gettid() system call. - */ -/* #define HAVE_GETTID */ - - -/* - * Add any extra platform-specific defines here. - */ -#define _THREAD_SAFE - -/* - * Define if we have header - */ -/* #define HAVE_MALLOC_H */ - -/* - * Define if tm struct has tm_gmtoff field - */ -#define HAVE_TM_GMTOFF 1 - -/* - * Define if dirent struct has d_type field - */ -#define HAVE_DIRENT_D_TYPE 1 - -/* - * Define if we have madvise() in - */ -#define HAVE_MADVISE 1 - -/* - * Define if we include for statfs() - */ -#define INCLUDE_SYS_MOUNT_FOR_STATFS 1 - -/* - * What CPU architecture does this platform use? - */ -#if (defined(__ppc__) || defined(__ppc64__)) -# define ARCH_PPC -#elif (defined(__i386__) || defined(__x86_64__)) -# define ARCH_X86 -#endif - -/* - * sprintf() format string for shared library naming. - */ -#define OS_SHARED_LIB_FORMAT_STR "lib%s.dylib" - -/* - * type for the third argument to mincore(). - */ -#define MINCORE_POINTER_TYPE char * - -/* - * The default path separator for the platform - */ -#define OS_PATH_SEPARATOR '/' - -/* - * Is the filesystem case sensitive? - * - * For tools apps, we'll treat is as not case sensitive. - */ -/* #define OS_CASE_SENSITIVE */ - -/* - * Define if exists. - */ -#define HAVE_SYS_SOCKET_H 1 - -/* - * Define if the strlcpy() function exists on the system. - */ -#define HAVE_STRLCPY 1 - -/* - * Define if the open_memstream() function exists on the system. - */ -/* #define HAVE_OPEN_MEMSTREAM 1 */ - -/* - * Define if the BSD funopen() function exists on the system. - */ -#define HAVE_FUNOPEN 1 - -/* - * Define if writev() exists - */ -#define HAVE_WRITEV 1 - -/* - * Define if exists. - */ -#define HAVE_STDINT_H 1 - -/* - * Define if exists. - */ -#define HAVE_STDBOOL_H 1 - -/* - * Define if exists. - */ -#define HAVE_SCHED_H 1 - -/* - * Define if pread() exists - */ -#define HAVE_PREAD 1 - -/* - * Define if we have st_mtim in struct stat - */ -#define HAVE_STAT_ST_MTIM 1 - -/* - * Define if printf() supports %zd for size_t arguments - */ -#define HAVE_PRINTF_ZD 1 - -/* - * Define to 1 if provides qsort_r() with a BSD style function prototype. - */ -#define HAVE_BSD_QSORT_R 1 - -/* - * Define to 1 if provides qsort_r() with a GNU style function prototype. - */ -#define HAVE_GNU_QSORT_R 0 - -#endif /*_ANDROID_CONFIG_H*/ diff --git a/core/combo/include/arch/linux-arm/AndroidConfig.h b/core/combo/include/arch/linux-arm/AndroidConfig.h deleted file mode 100644 index c06c8bc2c..000000000 --- a/core/combo/include/arch/linux-arm/AndroidConfig.h +++ /dev/null @@ -1,338 +0,0 @@ -/* - * Copyright (C) 2005 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. - */ - -/* - * Android config -- "android-arm". Used for ARM device builds. - */ -#ifndef _ANDROID_CONFIG_H -#define _ANDROID_CONFIG_H - -/* - * =========================================================================== - * !!! IMPORTANT !!! - * =========================================================================== - * - * This file is included by ALL C/C++ source files. Don't put anything in - * here unless you are absolutely certain it can't go anywhere else. - * - * Any C++ stuff must be wrapped with "#ifdef __cplusplus". Do not use "//" - * comments. - */ - -/* - * Threading model. Choose one: - * - * HAVE_PTHREADS - use the pthreads library. - * HAVE_WIN32_THREADS - use Win32 thread primitives. - * -- combine HAVE_CREATETHREAD, HAVE_CREATEMUTEX, and HAVE__BEGINTHREADEX - */ -#define HAVE_PTHREADS - -/* - * Do we have pthread_setname_np()? - * - * (HAVE_PTHREAD_SETNAME_NP is used by WebKit to enable a function with - * the same name but different parameters, so we can't use that here.) - */ -#define HAVE_ANDROID_PTHREAD_SETNAME_NP - -/* - * Do we have the futex syscall? - */ -#define HAVE_FUTEX - -/* - * Process creation model. Choose one: - * - * HAVE_FORKEXEC - use fork() and exec() - * HAVE_WIN32_PROC - use CreateProcess() - */ -#define HAVE_FORKEXEC - -/* - * IPC model. Choose one: - * - * HAVE_SYSV_IPC - use the classic SysV IPC mechanisms (semget, shmget). - * HAVE_MACOSX_IPC - use Macintosh IPC mechanisms (sem_open, mmap). - * HAVE_WIN32_IPC - use Win32 IPC (CreateSemaphore, CreateFileMapping). - * HAVE_ANDROID_IPC - use Android versions (?, mmap). - */ -#define HAVE_ANDROID_IPC - -/* - * Memory-mapping model. Choose one: - * - * HAVE_POSIX_FILEMAP - use the Posix sys/mmap.h - * HAVE_WIN32_FILEMAP - use Win32 filemaps - */ -#define HAVE_POSIX_FILEMAP - -/* - * Define this if you have - */ -#define HAVE_TERMIO_H 1 - -/* - * Define this if you have - */ -#define HAVE_SYS_SENDFILE_H 1 - -/* - * Define this if you build against MSVCRT.DLL - */ -/* #define HAVE_MS_C_RUNTIME */ - -/* - * Define this if you have sys/uio.h - */ -#define HAVE_SYS_UIO_H 1 - -/* - * Define this if your platforms implements symbolic links - * in its filesystems - */ -#define HAVE_SYMLINKS - -/* - * Define this if we have localtime_r(). - */ -/* #define HAVE_LOCALTIME_R 1 */ - -/* - * Define this if we have gethostbyname_r(). - */ -/* #define HAVE_GETHOSTBYNAME_R */ - -/* - * Define this if we have ioctl(). - */ -#define HAVE_IOCTL - -/* - * Define this if we want to use WinSock. - */ -/* #define HAVE_WINSOCK */ - -/* - * Define this if have clock_gettime() and friends - */ -#define HAVE_POSIX_CLOCKS - -/* - * Define this if we have linux style epoll() - */ -#define HAVE_EPOLL - -/* - * Endianness of the target machine. Choose one: - * - * HAVE_ENDIAN_H -- have endian.h header we can include. - * HAVE_LITTLE_ENDIAN -- we are little endian. - * HAVE_BIG_ENDIAN -- we are big endian. - */ -#define HAVE_ENDIAN_H -#define HAVE_LITTLE_ENDIAN - -/* - * We need to choose between 32-bit and 64-bit off_t. All of our code should - * agree on the same size. For desktop systems, use 64-bit values, - * because some of our libraries (e.g. wxWidgets) expect to be built that way. - */ -/* #define _FILE_OFFSET_BITS 64 */ -/* #define _LARGEFILE_SOURCE 1 */ - -/* - * Define if platform has off64_t (and lseek64 and other xxx64 functions) - */ -#define HAVE_OFF64_T - -/* - * Defined if we have the backtrace() call for retrieving a stack trace. - * Needed for CallStack to operate; if not defined, CallStack is - * non-functional. - */ -#define HAVE_BACKTRACE 0 - -/* - * Defined if we have the cxxabi.h header for demangling C++ symbols. If - * not defined, stack crawls will be displayed with raw mangled symbols - */ -#define HAVE_CXXABI 0 - -/* - * Defined if we have the gettid() system call. - */ -#define HAVE_GETTID - -/* - * Defined if we have the sched_setscheduler() call - */ -#define HAVE_SCHED_SETSCHEDULER - -/* - * Add any extra platform-specific defines here. - */ -#ifndef __linux__ -#define __linux__ -#endif - -/* - * Define if we have header - */ -#define HAVE_MALLOC_H - -/* - * Define if we're running on *our* linux on device or emulator. - */ -#define HAVE_ANDROID_OS 1 - -/* - * Define if we have Linux-style non-filesystem Unix Domain Sockets - */ -#define HAVE_LINUX_LOCAL_SOCKET_NAMESPACE 1 - -/* - * Define if we have Linux's inotify in . - */ -#define HAVE_INOTIFY 1 - -/* - * Define if we have madvise() in - */ -#define HAVE_MADVISE 1 - -/* - * Define if tm struct has tm_gmtoff field - */ -#define HAVE_TM_GMTOFF 1 - -/* - * Define if dirent struct has d_type field - */ -#define HAVE_DIRENT_D_TYPE 1 - -/* - * Define if libc includes Android system properties implementation. - */ -#define HAVE_LIBC_SYSTEM_PROPERTIES 1 - -/* - * Define if system provides a system property server (should be - * mutually exclusive with HAVE_LIBC_SYSTEM_PROPERTIES). - */ -/* #define HAVE_SYSTEM_PROPERTY_SERVER */ - -/* - * What CPU architecture does this platform use? - */ -#define ARCH_ARM - -/* - * Define if the size of enums is as short as possible, - */ -/* #define HAVE_SHORT_ENUMS */ - -/* - * sprintf() format string for shared library naming. - */ -#define OS_SHARED_LIB_FORMAT_STR "lib%s.so" - -/* - * type for the third argument to mincore(). - */ -#define MINCORE_POINTER_TYPE unsigned char * - -/* - * The default path separator for the platform - */ -#define OS_PATH_SEPARATOR '/' - -/* - * Is the filesystem case sensitive? - */ -#define OS_CASE_SENSITIVE - -/* - * Define if exists. - */ -#define HAVE_SYS_SOCKET_H 1 - -/* - * Define if the strlcpy() function exists on the system. - */ -#define HAVE_STRLCPY 1 - -/* - * Define if the open_memstream() function exists on the system. - */ -/* #define HAVE_OPEN_MEMSTREAM 1 */ - -/* - * Define if the BSD funopen() function exists on the system. - */ -#define HAVE_FUNOPEN 1 - -/* - * Define if prctl() exists - */ -#define HAVE_PRCTL 1 - -/* - * Define if writev() exists - */ -#define HAVE_WRITEV 1 - -/* - * Define if exists. - */ -#define HAVE_STDINT_H 1 - -/* - * Define if exists. - */ -#define HAVE_STDBOOL_H 1 - -/* - * Define if exists. - */ -#define HAVE_SCHED_H 1 - -/* - * Define if pread() exists - */ -#define HAVE_PREAD 1 - -/* - * Define if we have st_mtim in struct stat - */ -#define HAVE_STAT_ST_MTIM 1 - -/* - * Define if printf() supports %zd for size_t arguments - */ -#define HAVE_PRINTF_ZD 1 - -/* - * Define to 1 if provides qsort_r() with a BSD style function prototype. - */ -#define HAVE_BSD_QSORT_R 0 - -/* - * Define to 1 if provides qsort_r() with a GNU style function prototype. - */ -#define HAVE_GNU_QSORT_R 0 - -#endif /* _ANDROID_CONFIG_H */ diff --git a/core/combo/include/arch/linux-arm64/AndroidConfig.h b/core/combo/include/arch/linux-arm64/AndroidConfig.h deleted file mode 100644 index bcbda8f87..000000000 --- a/core/combo/include/arch/linux-arm64/AndroidConfig.h +++ /dev/null @@ -1,340 +0,0 @@ -/* - * Copyright (C) 2013 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. - */ - -/* - * Android config -- "android-aarch64". Used for ARM aarch64 device builds. - */ -#ifndef _ANDROID_CONFIG_H -#define _ANDROID_CONFIG_H - -/* - * =========================================================================== - * !!! IMPORTANT !!! - * =========================================================================== - * - * This file is included by ALL C/C++ source files. Don't put anything in - * here unless you are absolutely certain it can't go anywhere else. - * - * Any C++ stuff must be wrapped with "#ifdef __cplusplus". Do not use "//" - * comments. - */ - -/* - * Threading model. Choose one: - * - * HAVE_PTHREADS - use the pthreads library. - * HAVE_WIN32_THREADS - use Win32 thread primitives. - * -- combine HAVE_CREATETHREAD, HAVE_CREATEMUTEX, and HAVE__BEGINTHREADEX - */ -#define HAVE_PTHREADS - -/* - * Do we have pthread_setname_np()? - * - * (HAVE_PTHREAD_SETNAME_NP is used by WebKit to enable a function with - * the same name but different parameters, so we can't use that here.) - */ -#define HAVE_ANDROID_PTHREAD_SETNAME_NP - -/* - * Do we have the futex syscall? - */ -#define HAVE_FUTEX - -/* - * Process creation model. Choose one: - * - * HAVE_FORKEXEC - use fork() and exec() - * HAVE_WIN32_PROC - use CreateProcess() - */ -#define HAVE_FORKEXEC - -/* - * Process out-of-memory adjustment. Set if running on Linux, - * where we can write to /proc//oom_adj to modify the out-of-memory - * badness adjustment. - */ -#define HAVE_OOM_ADJ - -/* - * IPC model. Choose one: - * - * HAVE_SYSV_IPC - use the classic SysV IPC mechanisms (semget, shmget). - * HAVE_MACOSX_IPC - use Macintosh IPC mechanisms (sem_open, mmap). - * HAVE_WIN32_IPC - use Win32 IPC (CreateSemaphore, CreateFileMapping). - * HAVE_ANDROID_IPC - use Android versions (?, mmap). - */ -#define HAVE_ANDROID_IPC - -/* - * Memory-mapping model. Choose one: - * - * HAVE_POSIX_FILEMAP - use the Posix sys/mmap.h - * HAVE_WIN32_FILEMAP - use Win32 filemaps - */ -#define HAVE_POSIX_FILEMAP - -/* - * Define this if you have - */ -#define HAVE_TERMIO_H 1 - -/* - * Define this if you have - */ -#define HAVE_SYS_SENDFILE_H 1 - -/* - * Define this if you build against MSVCRT.DLL - */ -/* #define HAVE_MS_C_RUNTIME */ - -/* - * Define this if you have sys/uio.h - */ -#define HAVE_SYS_UIO_H 1 - -/* - * Define this if your platforms implements symbolic links - * in its filesystems - */ -#define HAVE_SYMLINKS - -/* - * Define this if we have localtime_r(). - */ -/* #define HAVE_LOCALTIME_R 1 */ - -/* - * Define this if we have gethostbyname_r(). - */ -/* #define HAVE_GETHOSTBYNAME_R */ - -/* - * Define this if we have ioctl(). - */ -#define HAVE_IOCTL - -/* - * Define this if we want to use WinSock. - */ -/* #define HAVE_WINSOCK */ - -/* - * Define this if have clock_gettime() and friends - */ -#define HAVE_POSIX_CLOCKS - -/* - * Define this if we have linux style epoll() - */ -#define HAVE_EPOLL - -/* - * Endianness of the target machine. Choose one: - * - * HAVE_ENDIAN_H -- have endian.h header we can include. - * HAVE_LITTLE_ENDIAN -- we are little endian. - * HAVE_BIG_ENDIAN -- we are big endian. - */ -#define HAVE_ENDIAN_H -#define HAVE_LITTLE_ENDIAN - -#define _FILE_OFFSET_BITS 64 -/* #define _LARGEFILE_SOURCE 1 */ - -/* - * Define if platform has off64_t (and lseek64 and other xxx64 functions) - */ -#define HAVE_OFF64_T - -/* - * Defined if we have the backtrace() call for retrieving a stack trace. - * Needed for CallStack to operate; if not defined, CallStack is - * non-functional. - */ -#define HAVE_BACKTRACE 0 - -/* - * Defined if we have the cxxabi.h header for demangling C++ symbols. If - * not defined, stack crawls will be displayed with raw mangled symbols - */ -#define HAVE_CXXABI 0 - -/* - * Defined if we have the gettid() system call. - */ -#define HAVE_GETTID - -/* - * Defined if we have the sched_setscheduler() call - */ -#define HAVE_SCHED_SETSCHEDULER - -/* - * Add any extra platform-specific defines here. - */ -#ifndef __linux__ -#define __linux__ -#endif - -/* - * Define if we have header - */ -#define HAVE_MALLOC_H - -/* - * Define if we're running on *our* linux on device or emulator. - */ -#define HAVE_ANDROID_OS 1 - -/* - * Define if we have Linux-style non-filesystem Unix Domain Sockets - */ -#define HAVE_LINUX_LOCAL_SOCKET_NAMESPACE 1 - -/* - * Define if we have Linux's inotify in . - */ -#define HAVE_INOTIFY 1 - -/* - * Define if we have madvise() in - */ -#define HAVE_MADVISE 1 - -/* - * Define if tm struct has tm_gmtoff field - */ -#define HAVE_TM_GMTOFF 1 - -/* - * Define if dirent struct has d_type field - */ -#define HAVE_DIRENT_D_TYPE 1 - -/* - * Define if libc includes Android system properties implementation. - */ -#define HAVE_LIBC_SYSTEM_PROPERTIES 1 - -/* - * Define if system provides a system property server (should be - * mutually exclusive with HAVE_LIBC_SYSTEM_PROPERTIES). - */ -/* #define HAVE_SYSTEM_PROPERTY_SERVER */ - -/* - * What CPU architecture does this platform use? - */ -#define ARCH_AARCH64 - -/* - * Define if the size of enums is as short as possible, - */ -/* #define HAVE_SHORT_ENUMS */ - -/* - * sprintf() format string for shared library naming. - */ -#define OS_SHARED_LIB_FORMAT_STR "lib%s.so" - -/* - * type for the third argument to mincore(). - */ -#define MINCORE_POINTER_TYPE unsigned char * - -/* - * The default path separator for the platform - */ -#define OS_PATH_SEPARATOR '/' - -/* - * Is the filesystem case sensitive? - */ -#define OS_CASE_SENSITIVE - -/* - * Define if exists. - */ -#define HAVE_SYS_SOCKET_H 1 - -/* - * Define if the strlcpy() function exists on the system. - */ -#define HAVE_STRLCPY 1 - -/* - * Define if the open_memstream() function exists on the system. - */ -/* #define HAVE_OPEN_MEMSTREAM 1 */ - -/* - * Define if the BSD funopen() function exists on the system. - */ -#define HAVE_FUNOPEN 1 - -/* - * Define if prctl() exists - */ -#define HAVE_PRCTL 1 - -/* - * Define if writev() exists - */ -#define HAVE_WRITEV 1 - -/* - * Define if exists. - */ -#define HAVE_STDINT_H 1 - -/* - * Define if exists. - */ -#define HAVE_STDBOOL_H 1 - -/* - * Define if exists. - */ -#define HAVE_SCHED_H 1 - -/* - * Define if pread() exists - */ -#define HAVE_PREAD 1 - -/* - * Define if we have st_mtim in struct stat - */ -#define HAVE_STAT_ST_MTIM 1 - -/* - * Define if printf() supports %zd for size_t arguments - */ -#define HAVE_PRINTF_ZD 1 - -/* - * Define to 1 if provides qsort_r() with a BSD style function prototype. - */ -#define HAVE_BSD_QSORT_R 0 - -/* - * Define to 1 if provides qsort_r() with a GNU style function prototype. - */ -#define HAVE_GNU_QSORT_R 0 - -#endif /* _ANDROID_CONFIG_H */ diff --git a/core/combo/include/arch/linux-mips/AndroidConfig.h b/core/combo/include/arch/linux-mips/AndroidConfig.h deleted file mode 100644 index bb3dc950b..000000000 --- a/core/combo/include/arch/linux-mips/AndroidConfig.h +++ /dev/null @@ -1,350 +0,0 @@ -/* - * Copyright (C) 2010 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. - */ - -/* - * Android config -- "android-mips". Used for MIPS device builds. - */ -#ifndef _ANDROID_CONFIG_H -#define _ANDROID_CONFIG_H - -/* - * =========================================================================== - * !!! IMPORTANT !!! - * =========================================================================== - * - * This file is included by ALL C/C++ source files. Don't put anything in - * here unless you are absolutely certain it can't go anywhere else. - * - * Any C++ stuff must be wrapped with "#ifdef __cplusplus". Do not use "//" - * comments. - */ - -/* - * Threading model. Choose one: - * - * HAVE_PTHREADS - use the pthreads library. - * HAVE_WIN32_THREADS - use Win32 thread primitives. - * -- combine HAVE_CREATETHREAD, HAVE_CREATEMUTEX, and HAVE__BEGINTHREADEX - */ -#define HAVE_PTHREADS - -/* - * Do we have pthread_setname_np()? - * - * (HAVE_PTHREAD_SETNAME_NP is used by WebKit to enable a function with - * the same name but different parameters, so we can't use that here.) - */ -#define HAVE_ANDROID_PTHREAD_SETNAME_NP - -/* - * Do we have the futex syscall? - */ -#define HAVE_FUTEX - -/* - * Process creation model. Choose one: - * - * HAVE_FORKEXEC - use fork() and exec() - * HAVE_WIN32_PROC - use CreateProcess() - */ -#define HAVE_FORKEXEC - -/* - * IPC model. Choose one: - * - * HAVE_SYSV_IPC - use the classic SysV IPC mechanisms (semget, shmget). - * HAVE_MACOSX_IPC - use Macintosh IPC mechanisms (sem_open, mmap). - * HAVE_WIN32_IPC - use Win32 IPC (CreateSemaphore, CreateFileMapping). - * HAVE_ANDROID_IPC - use Android versions (?, mmap). - */ -#define HAVE_ANDROID_IPC - -/* - * Memory-mapping model. Choose one: - * - * HAVE_POSIX_FILEMAP - use the Posix sys/mmap.h - * HAVE_WIN32_FILEMAP - use Win32 filemaps - */ -#define HAVE_POSIX_FILEMAP - -/* - * Define this if you have - */ -#define HAVE_TERMIO_H 1 - -/* - * Define this if you have - */ -#define HAVE_SYS_SENDFILE_H 1 - -/* - * Define this if you build against MSVCRT.DLL - */ -/* #define HAVE_MS_C_RUNTIME */ - -/* - * Define this if you have sys/uio.h - */ -#define HAVE_SYS_UIO_H 1 - -/* - * Define this if your platforms implements symbolic links - * in its filesystems - */ -#define HAVE_SYMLINKS - -/* - * Define this if we have localtime_r(). - */ -/* #define HAVE_LOCALTIME_R */ - -/* - * Define this if we have gethostbyname_r(). - */ -/* #define HAVE_GETHOSTBYNAME_R */ - -/* - * Define this if we have ioctl(). - */ -#define HAVE_IOCTL - -/* - * Define this if we want to use WinSock. - */ -/* #define HAVE_WINSOCK */ - -/* - * Define this if have clock_gettime() and friends - */ -#define HAVE_POSIX_CLOCKS - -/* - * Define this if we have linux style epoll() - */ -#define HAVE_EPOLL - -/* - * Endianness of the target machine. Choose one: - * - * HAVE_ENDIAN_H -- have endian.h header we can include. - * HAVE_LITTLE_ENDIAN -- we are little endian. - * HAVE_BIG_ENDIAN -- we are big endian. - */ -#define HAVE_ENDIAN_H -#if defined(__MIPSEB__) -#define HAVE_BIG_ENDIAN -#endif -#if defined(__MIPSEL__) -#define HAVE_LITTLE_ENDIAN -#endif - -/* - * We need to choose between 32-bit and 64-bit off_t. All of our code should - * agree on the same size. For desktop systems, use 64-bit values, - * because some of our libraries (e.g. wxWidgets) expect to be built that way. - */ -/* #define _FILE_OFFSET_BITS 64 */ -/* #define _LARGEFILE_SOURCE 1 */ - -/* - * Define if platform has off64_t (and lseek64 and other xxx64 functions) - */ -#define HAVE_OFF64_T - -/* - * Defined if we have the backtrace() call for retrieving a stack trace. - * Needed for CallStack to operate; if not defined, CallStack is - * non-functional. - */ -#define HAVE_BACKTRACE 0 - -/* - * Defined if we have the cxxabi.h header for demangling C++ symbols. If - * not defined, stack crawls will be displayed with raw mangled symbols - */ -#define HAVE_CXXABI 0 - -/* - * Defined if we have the gettid() system call. - */ -#define HAVE_GETTID - -/* - * Defined if we have the sched_setscheduler() call - */ -#define HAVE_SCHED_SETSCHEDULER - -/* - * Add any extra platform-specific defines here. - */ -#ifndef __linux__ -#define __linux__ 1 -#endif - -#ifndef __linux -#define __linux 1 -#endif - -#ifdef __unix__ -#undef __unix__ -#endif - -#ifdef __unix -#undef __unix -#endif - -/* - * Define if we have header - */ -#define HAVE_MALLOC_H - -/* - * Define if we're running on *our* linux on device or emulator. - */ -#define HAVE_ANDROID_OS 1 - -/* - * Define if we have Linux-style non-filesystem Unix Domain Sockets - */ -#define HAVE_LINUX_LOCAL_SOCKET_NAMESPACE 1 - -/* - * Define if we have Linux's inotify in . - */ -#define HAVE_INOTIFY 1 - -/* - * Define if we have madvise() in - */ -#define HAVE_MADVISE 1 - -/* - * Define if tm struct has tm_gmtoff field - */ -#define HAVE_TM_GMTOFF 1 - -/* - * Define if dirent struct has d_type field - */ -#define HAVE_DIRENT_D_TYPE 1 - -/* - * Define if libc includes Android system properties implementation. - */ -#define HAVE_LIBC_SYSTEM_PROPERTIES 1 - -/* - * Define if system provides a system property server (should be - * mutually exclusive with HAVE_LIBC_SYSTEM_PROPERTIES). - */ -/* #define HAVE_SYSTEM_PROPERTY_SERVER */ - -/* - * What CPU architecture does this platform use? - */ -#define ARCH_MIPS 1 - -/* - * Define if the size of enums is as short as possible, - */ -/* #define HAVE_SHORT_ENUMS */ - -/* - * sprintf() format string for shared library naming. - */ -#define OS_SHARED_LIB_FORMAT_STR "lib%s.so" - -/* - * type for the third argument to mincore(). - */ -#define MINCORE_POINTER_TYPE unsigned char * - -/* - * The default path separator for the platform - */ -#define OS_PATH_SEPARATOR '/' - -/* - * Is the filesystem case sensitive? - */ -#define OS_CASE_SENSITIVE - -/* - * Define if exists. - */ -#define HAVE_SYS_SOCKET_H 1 - -/* - * Define if the strlcpy() function exists on the system. - */ -#define HAVE_STRLCPY 1 - -/* - * Define if the open_memstream() function exists on the system. - */ -/* #define HAVE_OPEN_MEMSTREAM 1 */ - -/* - * Define if the BSD funopen() function exists on the system. - */ -#define HAVE_FUNOPEN 1 - -/* - * Define if prctl() exists - */ -#define HAVE_PRCTL 1 - -/* - * Define if writev() exists - */ -#define HAVE_WRITEV 1 - -/* - * Define if exists. - */ -#define HAVE_STDINT_H 1 - -/* - * Define if exists. - */ -#define HAVE_STDBOOL_H 1 - -/* - * Define if exists. - */ -#define HAVE_SCHED_H 1 - -/* - * Define if pread() exists - */ -#define HAVE_PREAD 1 - -/* - * Define if we have st_mtim in struct stat - */ -#define HAVE_STAT_ST_MTIM 1 - -/* - * Define if printf() supports %zd for size_t arguments - */ -#define HAVE_PRINTF_ZD 1 - -/* - * Whether or not _Unwind_Context is defined as a struct. - */ -#define HAVE_UNWIND_CONTEXT_STRUCT 1 - -#endif /* _ANDROID_CONFIG_H */ diff --git a/core/combo/include/arch/linux-mips64/AndroidConfig.h b/core/combo/include/arch/linux-mips64/AndroidConfig.h deleted file mode 100644 index 7ded3ceea..000000000 --- a/core/combo/include/arch/linux-mips64/AndroidConfig.h +++ /dev/null @@ -1,347 +0,0 @@ -/* - * Copyright (C) 2013 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. - */ - -/* - * Android config -- "android-mips64". Used for MIPS device builds. - */ -#ifndef _ANDROID_CONFIG_H -#define _ANDROID_CONFIG_H - -/* - * =========================================================================== - * !!! IMPORTANT !!! - * =========================================================================== - * - * This file is included by ALL C/C++ source files. Don't put anything in - * here unless you are absolutely certain it can't go anywhere else. - * - * Any C++ stuff must be wrapped with "#ifdef __cplusplus". Do not use "//" - * comments. - */ - -/* - * Threading model. Choose one: - * - * HAVE_PTHREADS - use the pthreads library. - * HAVE_WIN32_THREADS - use Win32 thread primitives. - * -- combine HAVE_CREATETHREAD, HAVE_CREATEMUTEX, and HAVE__BEGINTHREADEX - */ -#define HAVE_PTHREADS - -/* - * Do we have pthread_setname_np()? - * - * (HAVE_PTHREAD_SETNAME_NP is used by WebKit to enable a function with - * the same name but different parameters, so we can't use that here.) - */ -#define HAVE_ANDROID_PTHREAD_SETNAME_NP - -/* - * Do we have the futex syscall? - */ -#define HAVE_FUTEX - -/* - * Process creation model. Choose one: - * - * HAVE_FORKEXEC - use fork() and exec() - * HAVE_WIN32_PROC - use CreateProcess() - */ -#define HAVE_FORKEXEC - -/* - * Process out-of-memory adjustment. Set if running on Linux, - * where we can write to /proc//oom_adj to modify the out-of-memory - * badness adjustment. - */ -#define HAVE_OOM_ADJ - -/* - * IPC model. Choose one: - * - * HAVE_SYSV_IPC - use the classic SysV IPC mechanisms (semget, shmget). - * HAVE_MACOSX_IPC - use Macintosh IPC mechanisms (sem_open, mmap). - * HAVE_WIN32_IPC - use Win32 IPC (CreateSemaphore, CreateFileMapping). - * HAVE_ANDROID_IPC - use Android versions (?, mmap). - */ -#define HAVE_ANDROID_IPC - -/* - * Memory-mapping model. Choose one: - * - * HAVE_POSIX_FILEMAP - use the Posix sys/mmap.h - * HAVE_WIN32_FILEMAP - use Win32 filemaps - */ -#define HAVE_POSIX_FILEMAP - -/* - * Define this if you have - */ -#define HAVE_TERMIO_H 1 - -/* - * Define this if you have - */ -#define HAVE_SYS_SENDFILE_H 1 - -/* - * Define this if you build against MSVCRT.DLL - */ -/* #define HAVE_MS_C_RUNTIME */ - -/* - * Define this if you have sys/uio.h - */ -#define HAVE_SYS_UIO_H 1 - -/* - * Define this if your platforms implements symbolic links - * in its filesystems - */ -#define HAVE_SYMLINKS - -/* - * Define this if we have localtime_r(). - */ -/* #define HAVE_LOCALTIME_R */ - -/* - * Define this if we have gethostbyname_r(). - */ -/* #define HAVE_GETHOSTBYNAME_R */ - -/* - * Define this if we have ioctl(). - */ -#define HAVE_IOCTL - -/* - * Define this if we want to use WinSock. - */ -/* #define HAVE_WINSOCK */ - -/* - * Define this if have clock_gettime() and friends - */ -#define HAVE_POSIX_CLOCKS - -/* - * Define this if we have linux style epoll() - */ -#define HAVE_EPOLL - -/* - * Endianness of the target machine. Choose one: - * - * HAVE_ENDIAN_H -- have endian.h header we can include. - * HAVE_LITTLE_ENDIAN -- we are little endian. - * HAVE_BIG_ENDIAN -- we are big endian. - */ -#define HAVE_ENDIAN_H -#define HAVE_LITTLE_ENDIAN - -#define _FILE_OFFSET_BITS 64 -/* #define _LARGEFILE_SOURCE 1 */ - -/* - * Define if platform has off64_t (and lseek64 and other xxx64 functions) - */ -#define HAVE_OFF64_T - -/* - * Defined if we have the backtrace() call for retrieving a stack trace. - * Needed for CallStack to operate; if not defined, CallStack is - * non-functional. - */ -#define HAVE_BACKTRACE 0 - -/* - * Defined if we have the cxxabi.h header for demangling C++ symbols. If - * not defined, stack crawls will be displayed with raw mangled symbols - */ -#define HAVE_CXXABI 0 - -/* - * Defined if we have the gettid() system call. - */ -#define HAVE_GETTID - -/* - * Defined if we have the sched_setscheduler() call - */ -#define HAVE_SCHED_SETSCHEDULER - -/* - * Add any extra platform-specific defines here. - */ -#ifndef __linux__ -#define __linux__ 1 -#endif - -#ifndef __linux -#define __linux 1 -#endif - -#ifdef __unix__ -#undef __unix__ -#endif - -#ifdef __unix -#undef __unix -#endif - -/* - * Define if we have header - */ -#define HAVE_MALLOC_H - -/* - * Define if we're running on *our* linux on device or emulator. - */ -#define HAVE_ANDROID_OS 1 - -/* - * Define if we have Linux-style non-filesystem Unix Domain Sockets - */ -#define HAVE_LINUX_LOCAL_SOCKET_NAMESPACE 1 - -/* - * Define if we have Linux's inotify in . - */ -#define HAVE_INOTIFY 1 - -/* - * Define if we have madvise() in - */ -#define HAVE_MADVISE 1 - -/* - * Define if tm struct has tm_gmtoff field - */ -#define HAVE_TM_GMTOFF 1 - -/* - * Define if dirent struct has d_type field - */ -#define HAVE_DIRENT_D_TYPE 1 - -/* - * Define if libc includes Android system properties implementation. - */ -#define HAVE_LIBC_SYSTEM_PROPERTIES 1 - -/* - * Define if system provides a system property server (should be - * mutually exclusive with HAVE_LIBC_SYSTEM_PROPERTIES). - */ -/* #define HAVE_SYSTEM_PROPERTY_SERVER */ - -/* - * What CPU architecture does this platform use? - */ -#define ARCH_MIPS64 1 - -/* - * Define if the size of enums is as short as possible, - */ -/* #define HAVE_SHORT_ENUMS */ - -/* - * sprintf() format string for shared library naming. - */ -#define OS_SHARED_LIB_FORMAT_STR "lib%s.so" - -/* - * type for the third argument to mincore(). - */ -#define MINCORE_POINTER_TYPE unsigned char * - -/* - * The default path separator for the platform - */ -#define OS_PATH_SEPARATOR '/' - -/* - * Is the filesystem case sensitive? - */ -#define OS_CASE_SENSITIVE - -/* - * Define if exists. - */ -#define HAVE_SYS_SOCKET_H 1 - -/* - * Define if the strlcpy() function exists on the system. - */ -#define HAVE_STRLCPY 1 - -/* - * Define if the open_memstream() function exists on the system. - */ -/* #define HAVE_OPEN_MEMSTREAM 1 */ - -/* - * Define if the BSD funopen() function exists on the system. - */ -#define HAVE_FUNOPEN 1 - -/* - * Define if prctl() exists - */ -#define HAVE_PRCTL 1 - -/* - * Define if writev() exists - */ -#define HAVE_WRITEV 1 - -/* - * Define if exists. - */ -#define HAVE_STDINT_H 1 - -/* - * Define if exists. - */ -#define HAVE_STDBOOL_H 1 - -/* - * Define if exists. - */ -#define HAVE_SCHED_H 1 - -/* - * Define if pread() exists - */ -#define HAVE_PREAD 1 - -/* - * Define if we have st_mtim in struct stat - */ -#define HAVE_STAT_ST_MTIM 1 - -/* - * Define if printf() supports %zd for size_t arguments - */ -#define HAVE_PRINTF_ZD 1 - -/* - * Whether or not _Unwind_Context is defined as a struct. - */ -#define HAVE_UNWIND_CONTEXT_STRUCT 1 - -#endif /* _ANDROID_CONFIG_H */ diff --git a/core/combo/include/arch/linux-x86/AndroidConfig.h b/core/combo/include/arch/linux-x86/AndroidConfig.h deleted file mode 100644 index 5523e4968..000000000 --- a/core/combo/include/arch/linux-x86/AndroidConfig.h +++ /dev/null @@ -1,322 +0,0 @@ -/* - * Copyright (C) 2005 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. - */ - -/* - * Android config -- "Linux". Used for desktop x86 Linux. - */ -#ifndef _ANDROID_CONFIG_H -#define _ANDROID_CONFIG_H - -/* - * =========================================================================== - * !!! IMPORTANT !!! - * =========================================================================== - * - * This file is included by ALL C/C++ source files. Don't put anything in - * here unless you are absolutely certain it can't go anywhere else. - * - * Any C++ stuff must be wrapped with "#ifdef __cplusplus". Do not use "//" - * comments. - */ - -/* - * Threading model. Choose one: - * - * HAVE_PTHREADS - use the pthreads library. - * HAVE_WIN32_THREADS - use Win32 thread primitives. - * -- combine HAVE_CREATETHREAD, HAVE_CREATEMUTEX, and HAVE__BEGINTHREADEX - */ -#define HAVE_PTHREADS - -/* - * Do we have the futex syscall? - */ - -#define HAVE_FUTEX - -/* - * Process creation model. Choose one: - * - * HAVE_FORKEXEC - use fork() and exec() - * HAVE_WIN32_PROC - use CreateProcess() - */ -#define HAVE_FORKEXEC - -/* - * IPC model. Choose one: - * - * HAVE_SYSV_IPC - use the classic SysV IPC mechanisms (semget, shmget). - * HAVE_MACOSX_IPC - use Macintosh IPC mechanisms (sem_open, mmap). - * HAVE_WIN32_IPC - use Win32 IPC (CreateSemaphore, CreateFileMapping). - * HAVE_ANDROID_IPC - use Android versions (?, mmap). - */ -#define HAVE_SYSV_IPC - -/* - * Memory-mapping model. Choose one: - * - * HAVE_POSIX_FILEMAP - use the Posix sys/mmap.h - * HAVE_WIN32_FILEMAP - use Win32 filemaps - */ -#define HAVE_POSIX_FILEMAP - -/* - * Define this if you have - */ -#define HAVE_TERMIO_H 1 - -/* - * Define this if you have - */ -#define HAVE_SYS_SENDFILE_H 1 - -/* - * Define this if you build against MSVCRT.DLL - */ -/* #define HAVE_MS_C_RUNTIME */ - -/* - * Define this if you have sys/uio.h - */ -#define HAVE_SYS_UIO_H 1 - -/* - * Define this if your platforms implements symbolic links - * in its filesystems - */ -#define HAVE_SYMLINKS - -/* - * Define this if we have localtime_r(). - */ -#define HAVE_LOCALTIME_R 1 - -/* - * Define this if we have gethostbyname_r(). - */ -#define HAVE_GETHOSTBYNAME_R - -/* - * Define this if we have ioctl(). - */ -#define HAVE_IOCTL - -/* - * Define this if we want to use WinSock. - */ -/* #define HAVE_WINSOCK */ - -/* - * Define this if have clock_gettime() and friends - */ -#define HAVE_POSIX_CLOCKS - -/* - * Define this if we have linux style epoll() - */ -#define HAVE_EPOLL - -/* - * Endianness of the target machine. Choose one: - * - * HAVE_ENDIAN_H -- have endian.h header we can include. - * HAVE_LITTLE_ENDIAN -- we are little endian. - * HAVE_BIG_ENDIAN -- we are big endian. - */ -#define HAVE_ENDIAN_H -#define HAVE_LITTLE_ENDIAN - -/* - * We need to choose between 32-bit and 64-bit off_t. All of our code should - * agree on the same size. For desktop systems, use 64-bit values, - * because some of our libraries (e.g. wxWidgets) expect to be built that way. - */ -#define _FILE_OFFSET_BITS 64 -#define _LARGEFILE_SOURCE 1 - -/* - * Define if platform has off64_t (and lseek64 and other xxx64 functions) - */ -#define HAVE_OFF64_T - -/* - * Defined if we have the backtrace() call for retrieving a stack trace. - * Needed for CallStack to operate; if not defined, CallStack is - * non-functional. - */ -#define HAVE_BACKTRACE 1 - -/* - * Defined if we have the cxxabi.h header for demangling C++ symbols. If - * not defined, stack crawls will be displayed with raw mangled symbols - */ -#define HAVE_CXXABI 0 - -/* - * Defined if we have the gettid() system call. - */ -/* #define HAVE_GETTID */ - -/* - * Defined if we have the sched_setscheduler() call - */ -#define HAVE_SCHED_SETSCHEDULER - -/* - * Add any extra platform-specific defines here. - */ - -/* - * Define if we have header - */ -#define HAVE_MALLOC_H - -/* - * Define if we have Linux-style non-filesystem Unix Domain Sockets - */ - -/* - * What CPU architecture does this platform use? - */ -#define ARCH_X86 - - -/* - * Define if we have Linux's inotify in . - */ -/*#define HAVE_INOTIFY 1*/ - -/* - * Define if we have madvise() in - */ -#define HAVE_MADVISE 1 - -/* - * Define if tm struct has tm_gmtoff field - */ -#define HAVE_TM_GMTOFF 1 - -/* - * Define if dirent struct has d_type field - */ -#define HAVE_DIRENT_D_TYPE 1 - -/* - * Define if libc includes Android system properties implementation. - */ -/* #define HAVE_LIBC_SYSTEM_PROPERTIES */ - -/* - * Define if system provides a system property server (should be - * mutually exclusive with HAVE_LIBC_SYSTEM_PROPERTIES). - */ -#define HAVE_SYSTEM_PROPERTY_SERVER - -/* - * sprintf() format string for shared library naming. - */ -#define OS_SHARED_LIB_FORMAT_STR "lib%s.so" - -/* - * type for the third argument to mincore(). - */ -#define MINCORE_POINTER_TYPE unsigned char * - -/* - * The default path separator for the platform - */ -#define OS_PATH_SEPARATOR '/' - -/* - * Is the filesystem case sensitive? - */ -#define OS_CASE_SENSITIVE - -/* - * Define if exists. - */ -#define HAVE_SYS_SOCKET_H 1 - -/* - * Define if the strlcpy() function exists on the system. - */ -/* #define HAVE_STRLCPY 1 */ - -/* - * Define if the open_memstream() function exists on the system. - */ -#define HAVE_OPEN_MEMSTREAM 1 - -/* - * Define if the BSD funopen() function exists on the system. - */ -/* #define HAVE_FUNOPEN 1 */ - -/* - * Define if prctl() exists - */ -#define HAVE_PRCTL 1 - -/* - * Define if writev() exists - */ -#define HAVE_WRITEV 1 - -/* - * Define if exists. - */ -#define HAVE_STDINT_H 1 - -/* - * Define if exists. - */ -#define HAVE_STDBOOL_H 1 - -/* - * Define if exists. - */ -#define HAVE_SCHED_H 1 - -/* - * Define if pread() exists - */ -#define HAVE_PREAD 1 - -/* - * Define if we have st_mtim in struct stat - */ -#define HAVE_STAT_ST_MTIM 1 - -/* - * Define if printf() supports %zd for size_t arguments - */ -#define HAVE_PRINTF_ZD 1 - -/* - * Define to 1 if provides qsort_r() with a BSD style function prototype. - */ -#define HAVE_BSD_QSORT_R 0 - -/* - * Define to 1 if provides qsort_r() with a GNU style function prototype. - */ -#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 8) -#define HAVE_GNU_QSORT_R 1 -#else -#define HAVE_GNU_QSORT_R 0 -#endif - -#endif /*_ANDROID_CONFIG_H*/ diff --git a/core/combo/include/arch/target_linux-x86/AndroidConfig.h b/core/combo/include/arch/target_linux-x86/AndroidConfig.h deleted file mode 100644 index c267b2b47..000000000 --- a/core/combo/include/arch/target_linux-x86/AndroidConfig.h +++ /dev/null @@ -1,327 +0,0 @@ -/* - * Copyright 2005 The Android Open Source Project - * - * Android config -- "target_linux-x86". Used for x86 linux target devices. - */ -#ifndef _ANDROID_CONFIG_H -#define _ANDROID_CONFIG_H - -/* - * =========================================================================== - * !!! IMPORTANT !!! - * =========================================================================== - * - * This file is included by ALL C/C++ source files. Don't put anything in - * here unless you are absolutely certain it can't go anywhere else. - * - * Any C++ stuff must be wrapped with "#ifdef __cplusplus". Do not use "//" - * comments. - */ - -/* - * Threading model. Choose one: - * - * HAVE_PTHREADS - use the pthreads library. - * HAVE_WIN32_THREADS - use Win32 thread primitives. - * -- combine HAVE_CREATETHREAD, HAVE_CREATEMUTEX, and HAVE__BEGINTHREADEX - */ -#define HAVE_PTHREADS - -/* - * Do we have pthread_setname_np()? - * - * (HAVE_PTHREAD_SETNAME_NP is used by WebKit to enable a function with - * the same name but different parameters, so we can't use that here.) - */ -#define HAVE_ANDROID_PTHREAD_SETNAME_NP - -/* - * Do we have the futex syscall? - */ -#define HAVE_FUTEX - -/* - * Process creation model. Choose one: - * - * HAVE_FORKEXEC - use fork() and exec() - * HAVE_WIN32_PROC - use CreateProcess() - */ -#define HAVE_FORKEXEC - -/* - * IPC model. Choose one: - * - * HAVE_SYSV_IPC - use the classic SysV IPC mechanisms (semget, shmget). - * HAVE_MACOSX_IPC - use Macintosh IPC mechanisms (sem_open, mmap). - * HAVE_WIN32_IPC - use Win32 IPC (CreateSemaphore, CreateFileMapping). - * HAVE_ANDROID_IPC - use Android versions (?, mmap). - */ -#define HAVE_ANDROID_IPC 1 - -/* - * Memory-mapping model. Choose one: - * - * HAVE_POSIX_FILEMAP - use the Posix sys/mmap.h - * HAVE_WIN32_FILEMAP - use Win32 filemaps - */ -#define HAVE_POSIX_FILEMAP 1 - -/* - * Define this if you have - */ -#define HAVE_TERMIO_H 1 - -/* - * Define this if you have - */ -#define HAVE_SYS_SENDFILE_H 1 - -/* - * Define this if you build against have Microsoft C runtime (MSVCRT.DLL) - */ -/* #define HAVE_MS_C_RUNTIME */ - -/* - * Define this if you have sys/uio.h - */ -#define HAVE_SYS_UIO_H 1 - -/* - * Define this if your platforms implements symbolic links - * in its filesystems - */ -#define HAVE_SYMLINKS 1 - -/* - * Define this if we have localtime_r(). - */ -/* #define HAVE_LOCALTIME_R 1 */ - -/* - * Define this if we have gethostbyname_r(). - */ -/* #define HAVE_GETHOSTBYNAME_R */ - -/* - * Define this if we have ioctl(). - */ -#define HAVE_IOCTL - -/* - * Define this if we want to use WinSock. - */ -/* #define HAVE_WINSOCK */ - -/* - * Define this if have clock_gettime() and friends - * - */ -#define HAVE_POSIX_CLOCKS - -/* - * Define this if we have linux style epoll() - */ -#define HAVE_EPOLL - -/* - * Endianness of the target machine. Choose one: - * - * HAVE_ENDIAN_H -- have endian.h header we can include. - * HAVE_LITTLE_ENDIAN -- we are little endian. - * HAVE_BIG_ENDIAN -- we are big endian. - */ -#define HAVE_ENDIAN_H -#define HAVE_LITTLE_ENDIAN - -/* - * We need to choose between 32-bit and 64-bit off_t. All of our code should - * agree on the same size. For desktop systems, use 64-bit values, - * because some of our libraries (e.g. wxWidgets) expect to be built that way. - */ -#if __LP64__ -#define _FILE_OFFSET_BITS 64 -#endif -/* #define _LARGEFILE_SOURCE 1 */ - -/* - * Define if platform has off64_t (and lseek64 and other xxx64 functions) - */ -#define HAVE_OFF64_T - -/* - * Defined if we have the backtrace() call for retrieving a stack trace. - * Needed for CallStack to operate; if not defined, CallStack is - * non-functional. - */ -#define HAVE_BACKTRACE 0 - -/* - * Defined if we have the cxxabi.h header for demangling C++ symbols. If - * not defined, stack crawls will be displayed with raw mangled symbols - */ -#define HAVE_CXXABI 0 - -/* - * Defined if we have the gettid() system call. - */ -#define HAVE_GETTID - -/* - * Defined if we have the sched_setscheduler() call - */ -#define HAVE_SCHED_SETSCHEDULER - -/* - * Add any extra platform-specific defines here. - */ -#ifndef __linux__ -#define __linux__ -#endif - -/* - * Define if we have header - */ -#define HAVE_MALLOC_H - -/* - * Define if we're running on *our* linux on device or emulator. - */ -#define HAVE_ANDROID_OS 1 - -/* - * Define if we have Linux-style non-filesystem Unix Domain Sockets - */ -#define HAVE_LINUX_LOCAL_SOCKET_NAMESPACE 1 - -/* - * Define if we have Linux's inotify in . - */ -#define HAVE_INOTIFY 1 - -/* - * Define if we have madvise() in - */ -#define HAVE_MADVISE 1 - -/* - * Define if we have Linux's dbus - */ -/* #define HAVE_DBUS 1 */ - -/* - * Define if tm struct has tm_gmtoff field - */ -#define HAVE_TM_GMTOFF 1 - -/* - * Define if dirent struct has d_type field - */ -#define HAVE_DIRENT_D_TYPE 1 - -/* - * Define if libc includes Android system properties implementation. - */ -#define HAVE_LIBC_SYSTEM_PROPERTIES 1 - -/* - * Define if system provides a system property server (should be - * mutually exclusive with HAVE_LIBC_SYSTEM_PROPERTIES). - */ -/* #define HAVE_SYSTEM_PROPERTY_SERVER */ - -/* - * What CPU architecture does this platform use? - */ -#define ARCH_X86 - -/* - * sprintf() format string for shared library naming. - */ -#define OS_SHARED_LIB_FORMAT_STR "lib%s.so" - -/* - * type for the third argument to mincore(). - */ -#define MINCORE_POINTER_TYPE unsigned char * - -/* - * The default path separator for the platform - */ -#define OS_PATH_SEPARATOR '/' - -/* - * Is the filesystem case sensitive? - */ -#define OS_CASE_SENSITIVE - -/* - * Define if exists. - */ -#define HAVE_SYS_SOCKET_H 1 - -/* - * Define if the strlcpy() function exists on the system. - */ -#define HAVE_STRLCPY 1 - -/* - * Define if the open_memstream() function exists on the system. - */ -/* #define HAVE_OPEN_MEMSTREAM 1 */ - -/* - * Define if the BSD funopen() function exists on the system. - */ -#define HAVE_FUNOPEN 1 - -/* - * Define if prctl() exists - */ -#define HAVE_PRCTL 1 - -/* - * Whether or not _Unwind_Context is defined as a struct. - */ -#define HAVE_UNWIND_CONTEXT_STRUCT - -/* - * Define if exists. - */ -#define HAVE_STDINT_H 1 - -/* - * Define if exists. - */ -#define HAVE_STDBOOL_H 1 - -/* - * Define if exists. - */ -#define HAVE_SCHED_H 1 - -/* - * Define if pread() exists - */ -#define HAVE_PREAD 1 - -/* - * Define if we have st_mtim in struct stat - */ -#define HAVE_STAT_ST_MTIM 1 - -/* - * Define if printf() supports %zd for size_t arguments - */ -#define HAVE_PRINTF_ZD 1 - -/* - * Define to 1 if provides qsort_r() with a BSD style function prototype. - */ -#define HAVE_BSD_QSORT_R 0 - -/* - * Define to 1 if provides qsort_r() with a GNU style function prototype. - */ -#define HAVE_GNU_QSORT_R 0 - -#endif /* _ANDROID_CONFIG_H */ diff --git a/core/combo/include/arch/windows/AndroidConfig.h b/core/combo/include/arch/windows/AndroidConfig.h deleted file mode 100644 index 204740dbc..000000000 --- a/core/combo/include/arch/windows/AndroidConfig.h +++ /dev/null @@ -1,355 +0,0 @@ -/* - * Copyright (C) 2005 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. - */ - -/* - * Android config -- "CYGWIN_NT-5.1". - * - * Cygwin has pthreads, but GDB seems to get confused if you use it to - * create threads. By "confused", I mean it freezes up the first time the - * debugged process creates a thread, even if you use CreateThread. The - * mere presence of pthreads linkage seems to cause problems. - */ -#ifndef _ANDROID_CONFIG_H -#define _ANDROID_CONFIG_H - -/* - * =========================================================================== - * !!! IMPORTANT !!! - * =========================================================================== - * - * This file is included by ALL C/C++ source files. Don't put anything in - * here unless you are absolutely certain it can't go anywhere else. - * - * Any C++ stuff must be wrapped with "#ifdef __cplusplus". Do not use "//" - * comments. - */ - -/* MingW doesn't define __BEGIN_DECLS / __END_DECLS. */ - -#ifndef __BEGIN_DECLS -# ifdef __cplusplus -# define __BEGIN_DECLS extern "C" { -# else -# define __BEGIN_DECLS -# endif -#endif - -#ifndef __END_DECLS -# ifdef __cplusplus -# define __END_DECLS } -# else -# define __END_DECLS -# endif -#endif - -/* - * Threading model. Choose one: - * - * HAVE_PTHREADS - use the pthreads library. - * HAVE_WIN32_THREADS - use Win32 thread primitives. - */ -#define HAVE_WIN32_THREADS - -/* - * Do we have the futex syscall? - */ - -/* #define HAVE_FUTEX */ - - -/* - * Process creation model. Choose one: - * - * HAVE_FORKEXEC - use fork() and exec() - * HAVE_WIN32_PROC - use CreateProcess() - */ -#ifdef __CYGWIN__ -# define HAVE_FORKEXEC -#else -# define HAVE_WIN32_PROC -#endif - -/* - * IPC model. Choose one: - * - * HAVE_SYSV_IPC - use the classic SysV IPC mechanisms (semget, shmget). - * HAVE_MACOSX_IPC - use Macintosh IPC mechanisms (sem_open, mmap). - * HAVE_WIN32_IPC - use Win32 IPC (CreateSemaphore, CreateFileMapping). - * HAVE_ANDROID_IPC - use Android versions (?, mmap). - */ -#define HAVE_WIN32_IPC - -/* - * Memory-mapping model. Choose one: - * - * HAVE_POSIX_FILEMAP - use the Posix sys/mmap.h - * HAVE_WIN32_FILEMAP - use Win32 filemaps - */ -#ifdef __CYGWIN__ -#define HAVE_POSIX_FILEMAP -#else -#define HAVE_WIN32_FILEMAP -#endif - -/* - * Define this if you have - */ -#ifdef __CYGWIN__ -# define HAVE_TERMIO_H -#endif - -/* - * Define this if you have - */ -#ifdef __CYGWIN__ -# define HAVE_SYS_SENDFILE_H 1 -#endif - -/* - * Define this if you build against MSVCRT.DLL - */ -#ifndef __CYGWIN__ -# define HAVE_MS_C_RUNTIME -#endif - -/* - * Define this if you have sys/uio.h - */ -#ifdef __CYGWIN__ -#define HAVE_SYS_UIO_H -#endif - - -/* - * Define this if we have localtime_r(). - */ -/* #define HAVE_LOCALTIME_R 1 */ - -/* - * Define this if we have gethostbyname_r(). - */ -/* #define HAVE_GETHOSTBYNAME_R */ - -/* - * Define this if we have ioctl(). - */ -/* #define HAVE_IOCTL */ - -/* - * Define this if we want to use WinSock. - */ -#ifndef __CYGWIN__ -#define HAVE_WINSOCK -#endif - -/* - * Define this if your platforms implements symbolic links - * in its filesystems - */ -/* #define HAVE_SYMLINKS */ - -/* - * Define this if have clock_gettime() and friends - */ -/* #define HAVE_POSIX_CLOCKS */ - -/* - * Endianness of the target machine. Choose one: - * - * HAVE_ENDIAN_H -- have endian.h header we can include. - * HAVE_LITTLE_ENDIAN -- we are little endian. - * HAVE_BIG_ENDIAN -- we are big endian. - */ -#ifdef __CYGWIN__ -#define HAVE_ENDIAN_H -#endif - -#define HAVE_LITTLE_ENDIAN - -/* - * We need to choose between 32-bit and 64-bit off_t. All of our code should - * agree on the same size. For desktop systems, use 64-bit values, - * because some of our libraries (e.g. wxWidgets) expect to be built that way. - */ -#define _FILE_OFFSET_BITS 64 -#define _LARGEFILE_SOURCE 1 - -/* - * Define if platform has off64_t (and lseek64 and other xxx64 functions) - */ -#define HAVE_OFF64_T - -/* - * Defined if we have the backtrace() call for retrieving a stack trace. - * Needed for CallStack to operate; if not defined, CallStack is - * non-functional. - */ -#define HAVE_BACKTRACE 0 - -/* - * Defined if we have the cxxabi.h header for demangling C++ symbols. If - * not defined, stack crawls will be displayed with raw mangled symbols - */ -#define HAVE_CXXABI 0 - -/* - * Define if tm struct has tm_gmtoff field - */ -/* #define HAVE_TM_GMTOFF 1 */ - -/* - * Define if dirent struct has d_type field - */ -/* #define HAVE_DIRENT_D_TYPE 1 */ - -/* - * Define if libc includes Android system properties implementation. - */ -/* #define HAVE_LIBC_SYSTEM_PROPERTIES */ - -/* - * Define if system provides a system property server (should be - * mutually exclusive with HAVE_LIBC_SYSTEM_PROPERTIES). - */ -/* #define HAVE_SYSTEM_PROPERTY_SERVER */ - -/* - * Define if we have madvise() in - */ -/*#define HAVE_MADVISE 1*/ - -/* - * Add any extra platform-specific defines here. - */ -#define WIN32 1 /* stock Cygwin doesn't define these */ -#define _WIN32 1 -#define _WIN32_WINNT 0x0500 /* admit to using >= Win2K */ - -#define HAVE_WINDOWS_PATHS /* needed by simulator */ - -/* - * What CPU architecture does this platform use? - */ -#define ARCH_X86 - -/* - * sprintf() format string for shared library naming. - */ -#define OS_SHARED_LIB_FORMAT_STR "lib%s.dll" - -/* - * type for the third argument to mincore(). - */ -#define MINCORE_POINTER_TYPE unsigned char * - -/* - * The default path separator for the platform - */ -#define OS_PATH_SEPARATOR '\\' - -/* - * Is the filesystem case sensitive? - */ -/* #define OS_CASE_SENSITIVE */ - -/* - * Define if exists. - * Cygwin has it, but not MinGW. - */ -#ifdef USE_MINGW -/* #define HAVE_SYS_SOCKET_H */ -#else -#define HAVE_SYS_SOCKET_H 1 -#endif - -/* - * Define if the strlcpy() function exists on the system. - */ -/* #define HAVE_STRLCPY 1 */ - -/* - * Define if the open_memstream() function exists on the system. - */ -/* #define HAVE_OPEN_MEMSTREAM 1 */ - -/* - * Define if the BSD funopen() function exists on the system. - */ -/* #define HAVE_FUNOPEN 1 */ - -/* - * Define if exists. - * Only MinGW has it. - */ -#ifdef USE_MINGW -#define HAVE_WINSOCK2_H 1 -#else -/* #define HAVE_WINSOCK2_H */ -#endif - -/* - * Various definitions missing in MinGW - */ -#ifdef USE_MINGW -#define S_IRGRP 0 -#endif - -/* - * Define if writev() exists. - */ -/* #define HAVE_WRITEV */ - -/* - * Define if exists. - */ -/* #define HAVE_STDINT_H */ - -/* - * Define if exists. - */ -#define HAVE_STDBOOL_H - -/* - * Define if exists. - */ -/* #define HAVE_SCHED_H */ - -/* - * Define if pread() exists - */ -/* #define HAVE_PREAD 1 */ - -/* - * Define if we have st_mtim in struct stat - */ -/* #define HAVE_STAT_ST_MTIM 1 */ - -/* - * Define if printf() supports %zd for size_t arguments - */ -/* #define HAVE_PRINTF_ZD 1 */ - -/* - * Define to 1 if provides qsort_r() with a BSD style function prototype. - */ -#define HAVE_BSD_QSORT_R 0 - -/* - * Define to 1 if provides qsort_r() with a GNU style function prototype. - */ -#define HAVE_GNU_QSORT_R 0 - -#endif /*_ANDROID_CONFIG_H*/ diff --git a/core/combo/javac.mk b/core/combo/javac.mk index 7f91aa9dd..7f66ea83a 100644 --- a/core/combo/javac.mk +++ b/core/combo/javac.mk @@ -9,12 +9,13 @@ # COMMON_JAVAC -- Java compiler command with common arguments # -ifneq ($(LEGACY_USE_JAVA6),) -common_jdk_flags := -target 1.5 -Xmaxerrs 9999999 -else -common_jdk_flags := -source 1.7 -target 1.7 -Xmaxerrs 9999999 +ifndef ANDROID_COMPILE_WITH_JACK +# Defines if compilation with jack is enabled by default. +ANDROID_COMPILE_WITH_JACK := true endif +common_jdk_flags := -Xmaxerrs 9999999 + # Use the indexer wrapper to index the codebase instead of the javac compiler ifeq ($(ALTERNATE_JAVAC),) JAVACC := javac @@ -30,12 +31,7 @@ ifdef JAVAC_WRAPPER endif # Whatever compiler is on this system. -ifeq ($(BUILD_OS), windows) - COMMON_JAVAC := development/host/windows/prebuilt/javawrap.exe -J-Xmx256m \ - $(common_jdk_flags) -else - COMMON_JAVAC := $(JAVACC) -J-Xmx1024M $(common_jdk_flags) -endif +COMMON_JAVAC := $(JAVACC) -J-Xmx1024M $(common_jdk_flags) # Eclipse. ifeq ($(CUSTOM_JAVA_COMPILER), eclipse) @@ -44,6 +40,8 @@ ifeq ($(CUSTOM_JAVA_COMPILER), eclipse) $(info CUSTOM_JAVA_COMPILER=eclipse) endif +GLOBAL_JAVAC_DEBUG_FLAGS := -g + HOST_JAVAC ?= $(COMMON_JAVAC) TARGET_JAVAC ?= $(COMMON_JAVAC) diff --git a/core/combo/mac_version.mk b/core/combo/mac_version.mk index 6defba79e..8fa08c6e6 100644 --- a/core/combo/mac_version.mk +++ b/core/combo/mac_version.mk @@ -9,7 +9,7 @@ ifndef build_mac_version build_mac_version := $(shell sw_vers -productVersion) -mac_sdk_versions_supported := 10.6 10.7 10.8 10.9 +mac_sdk_versions_supported := 10.8 10.9 10.10 10.11 10.12 ifneq ($(strip $(MAC_SDK_VERSION)),) mac_sdk_version := $(MAC_SDK_VERSION) ifeq ($(filter $(mac_sdk_version),$(mac_sdk_versions_supported)),) @@ -19,10 +19,11 @@ $(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 | grep macosx | 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)) +$(warning none of the installed SDKs ($mac_sdk_versions_installed) match supported versions ($(mac_sdk_versions_supported)), trying $(mac_sdk_version)) endif endif @@ -32,6 +33,7 @@ mac_sdk_path := $(shell xcode-select -print-path) mac_sdk_root := $(mac_sdk_path)/Platforms/MacOSX.platform/Developer/SDKs/MacOSX$(mac_sdk_version).sdk ifeq ($(wildcard $(mac_sdk_root)),) # try legacy /Developer/SDKs/MacOSX10.?.sdk +$(warning no SDK $(mac_sdk_version) at $(mac_sdk_root), trying legacy dir) mac_sdk_root := /Developer/SDKs/MacOSX$(mac_sdk_version).sdk endif ifeq ($(wildcard $(mac_sdk_root)),) diff --git a/core/combo/select.mk b/core/combo/select.mk index d495c6ff1..97d62c684 100644 --- a/core/combo/select.mk +++ b/core/combo/select.mk @@ -33,25 +33,9 @@ $(combo_var_prefix)CXX := $(CXX) $(combo_var_prefix)AR := $(AR) $(combo_var_prefix)STRIP := $(STRIP) -$(combo_var_prefix)BINDER_MINI := 0 - -$(combo_var_prefix)HAVE_EXCEPTIONS := 0 -$(combo_var_prefix)HAVE_UNIX_FILE_PATH := 1 -$(combo_var_prefix)HAVE_WINDOWS_FILE_PATH := 0 -$(combo_var_prefix)HAVE_RTTI := 1 -$(combo_var_prefix)HAVE_CALL_STACKS := 1 -$(combo_var_prefix)HAVE_64BIT_IO := 1 -$(combo_var_prefix)HAVE_CLOCK_TIMERS := 1 -$(combo_var_prefix)HAVE_PTHREAD_RWLOCK := 1 -$(combo_var_prefix)HAVE_STRNLEN := 1 -$(combo_var_prefix)HAVE_STRERROR_R_STRRET := 1 -$(combo_var_prefix)HAVE_STRLCPY := 0 -$(combo_var_prefix)HAVE_STRLCAT := 0 -$(combo_var_prefix)HAVE_KERNEL_MODULES := 0 - -$(combo_var_prefix)GLOBAL_CFLAGS := -fno-exceptions -Wno-multichar -$(combo_var_prefix)RELEASE_CFLAGS := -O2 -g -fno-strict-aliasing -$(combo_var_prefix)GLOBAL_CPPFLAGS := +$(combo_var_prefix)GLOBAL_CFLAGS := -fno-exceptions -Wno-multichar $(BOARD_GLOBAL_CFLAGS) +$(combo_var_prefix)RELEASE_CFLAGS := -O2 -g -fno-strict-aliasing $(BOARD_RELEASE_CFLAGS) +$(combo_var_prefix)GLOBAL_CPPFLAGS := $(BOARD_GLOBAL_CPPFLAGS) $(combo_var_prefix)GLOBAL_LDFLAGS := $(combo_var_prefix)GLOBAL_ARFLAGS := crsPD $(combo_var_prefix)GLOBAL_LD_DIRS := @@ -63,57 +47,3 @@ $(combo_var_prefix)STATIC_LIB_SUFFIX := .a # Now include the combo for this specific target. include $(BUILD_COMBOS)/$(combo_target)$(combo_os_arch).mk - -ifneq ($(USE_CCACHE),) - # The default check uses size and modification time, causing false misses - # since the mtime depends when the repo was checked out - export CCACHE_COMPILERCHECK := content - - # See man page, optimizations to get more cache hits - # implies that __DATE__ and __TIME__ are not critical for functionality. - # Ignore include file modification time since it will depend on when - # the repo was checked out - export CCACHE_SLOPPINESS := time_macros,include_file_mtime,file_macro - - # Turn all preprocessor absolute paths into relative paths. - # Fixes absolute paths in preprocessed source due to use of -g. - # 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 := / - - # Workaround for ccache with clang. - # See http://petereisentraut.blogspot.com/2011/09/ccache-and-clang-part-2.html - export CCACHE_CPP2 := true - - CCACHE_HOST_TAG := $(HOST_PREBUILT_TAG) - # If we are cross-compiling Windows binaries on Linux - # then use the linux ccache binary instead. - ifeq ($(HOST_OS)-$(BUILD_OS),windows-linux) - CCACHE_HOST_TAG := linux-$(HOST_PREBUILT_ARCH) - endif - ccache := prebuilts/misc/$(CCACHE_HOST_TAG)/ccache/ccache - # Check that the executable is here. - ccache := $(strip $(wildcard $(ccache))) - ifdef ccache - ifndef CC_WRAPPER - CC_WRAPPER := $(ccache) - endif - ifndef CXX_WRAPPER - CXX_WRAPPER := $(ccache) - endif - ccache = - endif -endif - -# The C/C++ compiler can be wrapped by setting the CC/CXX_WRAPPER vars. -ifdef CC_WRAPPER - ifneq ($(CC_WRAPPER),$(firstword $($(combo_var_prefix)CC))) - $(combo_var_prefix)CC := $(CC_WRAPPER) $($(combo_var_prefix)CC) - endif -endif -ifdef CXX_WRAPPER - ifneq ($(CXX_WRAPPER),$(firstword $($(combo_var_prefix)CXX))) - $(combo_var_prefix)CXX := $(CXX_WRAPPER) $($(combo_var_prefix)CXX) - endif -endif diff --git a/core/config.mk b/core/config.mk index bfa5610dd..5ca6a9add 100644 --- a/core/config.mk +++ b/core/config.mk @@ -3,6 +3,24 @@ # current configuration and platform, which # are not specific to what is being built. +# These may be used to trace makefile issues without interfering with +# envsetup.sh. Usage: +# $(call ainfo,some info message) +# $(call aerror,some error message) +ifdef CALLED_FROM_SETUP +define ainfo +endef +define aerror +endef +else +define ainfo +$(info $(1)) +endef +define aerror +$(error $(1)) +endef +endif + # Only use ANDROID_BUILD_SHELL to wrap around bash. # DO NOT use other shells such as zsh. ifdef ANDROID_BUILD_SHELL @@ -22,6 +40,10 @@ comma := , define newline +endef +# The pound character "#" +define pound +# endef # Unfortunately you can't simply define backslash as \ or \\. backslash := \a @@ -31,6 +53,11 @@ backslash := $(patsubst %a,%,$(backslash)) # only has an effect on python 2.6 and above. export PYTHONDONTWRITEBYTECODE := 1 +ifneq ($(filter --color=always, $(GREP_OPTIONS)),) +$(warning The build system needs unmodified output of grep.) +$(error Please remove --color=always from your $$GREP_OPTIONS) +endif + # Standard source directories. SRC_DOCS:= $(TOPDIR)docs # TODO: Enforce some kind of layering; only add include paths @@ -38,9 +65,9 @@ SRC_DOCS:= $(TOPDIR)docs # TODO: See if we can remove most of these from the global list. SRC_HEADERS := \ $(TOPDIR)system/core/include \ + $(TOPDIR)system/media/audio/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 \ @@ -52,6 +79,7 @@ SRC_SERVERS:= $(TOPDIR)servers SRC_TARGET_DIR := $(TOPDIR)build/target SRC_API_DIR := $(TOPDIR)prebuilts/sdk/api SRC_SYSTEM_API_DIR := $(TOPDIR)prebuilts/sdk/system-api +SRC_TEST_API_DIR := $(TOPDIR)prebuilts/sdk/test-api # Some specific paths to tools SRC_DROIDDOC_DIR := $(TOPDIR)build/tools/droiddoc @@ -69,13 +97,12 @@ CLEAR_VARS:= $(BUILD_SYSTEM)/clear_vars.mk BUILD_HOST_STATIC_LIBRARY:= $(BUILD_SYSTEM)/host_static_library.mk BUILD_HOST_SHARED_LIBRARY:= $(BUILD_SYSTEM)/host_shared_library.mk BUILD_STATIC_LIBRARY:= $(BUILD_SYSTEM)/static_library.mk -BUILD_RAW_STATIC_LIBRARY := $(BUILD_SYSTEM)/raw_static_library.mk BUILD_SHARED_LIBRARY:= $(BUILD_SYSTEM)/shared_library.mk BUILD_EXECUTABLE:= $(BUILD_SYSTEM)/executable.mk -BUILD_RAW_EXECUTABLE:= $(BUILD_SYSTEM)/raw_executable.mk BUILD_HOST_EXECUTABLE:= $(BUILD_SYSTEM)/host_executable.mk BUILD_PACKAGE:= $(BUILD_SYSTEM)/package.mk BUILD_PHONY_PACKAGE:= $(BUILD_SYSTEM)/phony_package.mk +BUILD_RRO_PACKAGE:= $(BUILD_SYSTEM)/build_rro_package.mk BUILD_HOST_PREBUILT:= $(BUILD_SYSTEM)/host_prebuilt.mk BUILD_PREBUILT:= $(BUILD_SYSTEM)/prebuilt.mk BUILD_MULTI_PREBUILT:= $(BUILD_SYSTEM)/multi_prebuilt.mk @@ -85,7 +112,10 @@ BUILD_HOST_JAVA_LIBRARY:= $(BUILD_SYSTEM)/host_java_library.mk BUILD_DROIDDOC:= $(BUILD_SYSTEM)/droiddoc.mk BUILD_COPY_HEADERS := $(BUILD_SYSTEM)/copy_headers.mk BUILD_NATIVE_TEST := $(BUILD_SYSTEM)/native_test.mk +BUILD_NATIVE_BENCHMARK := $(BUILD_SYSTEM)/native_benchmark.mk BUILD_HOST_NATIVE_TEST := $(BUILD_SYSTEM)/host_native_test.mk +BUILD_FUZZ_TEST := $(BUILD_SYSTEM)/fuzz_test.mk +BUILD_HOST_FUZZ_TEST := $(BUILD_SYSTEM)/host_fuzz_test.mk BUILD_SHARED_TEST_LIBRARY := $(BUILD_SYSTEM)/shared_test_lib.mk BUILD_HOST_SHARED_TEST_LIBRARY := $(BUILD_SYSTEM)/host_shared_test_lib.mk @@ -97,8 +127,6 @@ BUILD_HOST_DALVIK_JAVA_LIBRARY := $(BUILD_SYSTEM)/host_dalvik_java_library.mk BUILD_HOST_DALVIK_STATIC_JAVA_LIBRARY := $(BUILD_SYSTEM)/host_dalvik_static_java_library.mk --include cts/build/config.mk - # ############################################################### # Parse out any modifier targets. # ############################################################### @@ -107,29 +135,32 @@ BUILD_HOST_DALVIK_STATIC_JAVA_LIBRARY := $(BUILD_SYSTEM)/host_dalvik_static_java # lines being executed, instead of a short message about # the kind of operation being done. SHOW_COMMANDS:= $(filter showcommands,$(MAKECMDGOALS)) +hide := $(if $(SHOW_COMMANDS),,@) +################################################################ +# Tools needed in product configuration makefiles. +################################################################ +NORMALIZE_PATH := build/tools/normalize_path.py + +# $(1): the paths to be normalized +define normalize-paths +$(if $(1),$(shell $(NORMALIZE_PATH) $(1))) +endef # ############################################################### # Set common values # ############################################################### -# These can be changed to modify both host and device modules. -COMMON_GLOBAL_CFLAGS:= -DANDROID -fmessage-length=0 -W -Wall -Wno-unused -Winit-self -Wpointer-arith -COMMON_RELEASE_CFLAGS:= -DNDEBUG -UDEBUG - -COMMON_GLOBAL_CPPFLAGS:= $(COMMON_GLOBAL_CFLAGS) -Wsign-promo -COMMON_RELEASE_CPPFLAGS:= $(COMMON_RELEASE_CFLAGS) - # Set the extensions used for various packages COMMON_PACKAGE_SUFFIX := .zip COMMON_JAVA_PACKAGE_SUFFIX := .jar COMMON_ANDROID_PACKAGE_SUFFIX := .apk -# list of flags to turn specific warnings in to errors -TARGET_ERROR_FLAGS := -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point - -# TODO: do symbol compression -TARGET_COMPRESS_MODULE_SYMBOLS := false +ifdef TMPDIR +JAVA_TMPDIR_ARG := -Djava.io.tmpdir=$(TMPDIR) +else +JAVA_TMPDIR_ARG := +endif # ############################################################### # Include sub-configuration files @@ -150,6 +181,17 @@ endif # are specific to the user's build configuration. include $(BUILD_SYSTEM)/envsetup.mk +# Pruned directory options used when using findleaves.py +# See envsetup.mk for a description of SCAN_EXCLUDE_DIRS +FIND_LEAVES_EXCLUDES := $(addprefix --prune=, $(OUT_DIR) $(SCAN_EXCLUDE_DIRS) .repo .git) + +# 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 +-include vendor/cm/config/BoardConfigCM.mk + # The build system exposes several variables for where to find the kernel # headers: # TARGET_DEVICE_KERNEL_HEADERS is automatically created for the current @@ -216,9 +258,16 @@ ifeq ($(TARGET_CPU_ABI),) endif TARGET_CPU_ABI2 := $(strip $(TARGET_CPU_ABI2)) -# $(1): os/arch -define select-android-config-h -build/core/combo/include/arch/$(1)/AndroidConfig.h +# Commands to generate .toc file common to ELF .so files. +define _gen_toc_command_for_elf +$(hide) ($($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)READELF) -d $(1) | grep SONAME || echo "No SONAME for $1") > $(2) +$(hide) $($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)READELF) --dyn-syms $(1) | awk '{$$2=""; $$3=""; print}' >> $(2) +endef + +# Commands to generate .toc file from Darwin dynamic library. +define _gen_toc_command_for_macho +$(hide) otool -l $(1) | grep LC_ID_DYLIB -A 5 > $(2) +$(hide) nm -gP $(1) | cut -f1-2 -d" " | grep -v U$$ >> $(2) endef combo_target := HOST_ @@ -232,6 +281,19 @@ combo_2nd_arch_prefix := $(HOST_2ND_ARCH_VAR_PREFIX) include $(BUILD_SYSTEM)/combo/select.mk endif +# Load the windows cross compiler under Linux +ifdef HOST_CROSS_OS +combo_target := HOST_CROSS_ +combo_2nd_arch_prefix := +include $(BUILD_SYSTEM)/combo/select.mk + +ifdef HOST_CROSS_2ND_ARCH +combo_target := HOST_CROSS_ +combo_2nd_arch_prefix := $(HOST_CROSS_2ND_ARCH_VAR_PREFIX) +include $(BUILD_SYSTEM)/combo/select.mk +endif +endif + # on windows, the tools have .exe at the end, and we depend on the # host config stuff being done first @@ -246,6 +308,9 @@ combo_2nd_arch_prefix := $(TARGET_2ND_ARCH_VAR_PREFIX) include $(BUILD_SYSTEM)/combo/select.mk endif +include $(BUILD_SYSTEM)/ccache.mk +include $(BUILD_SYSTEM)/goma.mk + ifdef TARGET_PREFER_32_BIT TARGET_PREFER_32_BIT_APPS := true TARGET_PREFER_32_BIT_EXECUTABLES := true @@ -315,20 +380,18 @@ ifeq ($(strip $(WITH_SYNTAX_CHECK)),0) WITH_SYNTAX_CHECK := endif +# define clang/llvm versions and base directory. +include $(BUILD_SYSTEM)/clang/versions.mk + # Disable WITH_STATIC_ANALYZER and WITH_SYNTAX_CHECK if tool can't be found -SYNTAX_TOOLS_PREFIX := prebuilts/misc/$(HOST_PREBUILT_TAG)/analyzer/bin +SYNTAX_TOOLS_PREFIX := \ + $(LLVM_PREBUILTS_BASE)/$(BUILD_OS)-x86/$(LLVM_PREBUILTS_VERSION)/tools/scan-build/libexec ifneq ($(strip $(WITH_STATIC_ANALYZER)),) ifeq ($(wildcard $(SYNTAX_TOOLS_PREFIX)/ccc-analyzer),) $(warning *** Disable WITH_STATIC_ANALYZER because $(SYNTAX_TOOLS_PREFIX)/ccc-analyzer does not exist) WITH_STATIC_ANALYZER := endif endif -ifneq ($(strip $(WITH_SYNTAX_CHECK)),) - ifeq ($(wildcard $(SYNTAX_TOOLS_PREFIX)/ccc-syntax),) - $(warning *** Disable WITH_SYNTAX_CHECK because $(SYNTAX_TOOLS_PREFIX)/ccc-syntax does not exist) - WITH_SYNTAX_CHECK := - endif -endif # WITH_STATIC_ANALYZER trumps WITH_SYNTAX_CHECK ifneq ($(strip $(WITH_STATIC_ANALYZER)),) @@ -362,11 +425,110 @@ endif endif endif +# Set up PDK so we can use TARGET_BUILD_PDK to select prebuilt tools below +.PHONY: pdk fusion +pdk fusion: $(DEFAULT_GOAL) + +# What to build: +# pdk fusion if: +# 1) PDK_FUSION_PLATFORM_ZIP is passed in from the environment +# or +# 2) the platform.zip exists in the default location +# or +# 3) fusion is a command line build goal, +# PDK_FUSION_PLATFORM_ZIP is needed anyway, then do we need the 'fusion' goal? +# otherwise pdk only if: +# 1) pdk is a command line build goal +# or +# 2) TARGET_BUILD_PDK is passed in from the environment + +# if PDK_FUSION_PLATFORM_ZIP is specified, do not override. +ifndef PDK_FUSION_PLATFORM_ZIP +# Most PDK project paths should be using vendor/pdk/TARGET_DEVICE +# but some legacy ones (e.g. mini_armv7a_neon generic PDK) were setup +# with vendor/pdk/TARGET_PRODUCT. +_pdk_fusion_default_platform_zip = $(strip \ + $(wildcard vendor/pdk/$(TARGET_DEVICE)/$(TARGET_PRODUCT)-$(TARGET_BUILD_VARIANT)/platform/platform.zip) \ + $(wildcard vendor/pdk/$(TARGET_DEVICE)/$(patsubst aosp_%,full_%,$(TARGET_PRODUCT))-$(TARGET_BUILD_VARIANT)/platform/platform.zip) \ + $(wildcard vendor/pdk/$(TARGET_PRODUCT)/$(TARGET_PRODUCT)-$(TARGET_BUILD_VARIANT)/platform/platform.zip) \ + $(wildcard vendor/pdk/$(TARGET_PRODUCT)/$(patsubst aosp_%,full_%,$(TARGET_PRODUCT))-$(TARGET_BUILD_VARIANT)/platform/platform.zip)) +ifneq (,$(_pdk_fusion_default_platform_zip)) +PDK_FUSION_PLATFORM_ZIP := $(word 1, $(_pdk_fusion_default_platform_zip)) +TARGET_BUILD_PDK := true +endif # _pdk_fusion_default_platform_zip +endif # !PDK_FUSION_PLATFORM_ZIP + +ifneq (,$(filter pdk fusion, $(MAKECMDGOALS))) +TARGET_BUILD_PDK := true +ifneq (,$(filter fusion, $(MAKECMDGOALS))) +ifndef PDK_FUSION_PLATFORM_ZIP + $(error Specify PDK_FUSION_PLATFORM_ZIP to do a PDK fusion.) +endif +endif # fusion +endif # pdk or fusion + +ifdef PDK_FUSION_PLATFORM_ZIP +TARGET_BUILD_PDK := true +ifeq (,$(wildcard $(PDK_FUSION_PLATFORM_ZIP))) + $(error Cannot find file $(PDK_FUSION_PLATFORM_ZIP).) +endif +endif + +BUILD_PLATFORM_ZIP := $(filter platform platform-java,$(MAKECMDGOALS)) + +# +# Tools that are prebuilts for TARGET_BUILD_APPS +# + +ACP := $(HOST_OUT_EXECUTABLES)/acp +AIDL := $(HOST_OUT_EXECUTABLES)/aidl +AAPT := $(HOST_OUT_EXECUTABLES)/aapt +AAPT2 := $(HOST_OUT_EXECUTABLES)/aapt2 +ZIPALIGN := $(HOST_OUT_EXECUTABLES)/zipalign +SIGNAPK_JAR := $(HOST_OUT_JAVA_LIBRARIES)/signapk$(COMMON_JAVA_PACKAGE_SUFFIX) +SIGNAPK_JNI_LIBRARY_PATH := $(HOST_OUT_SHARED_LIBRARIES) +LLVM_RS_CC := $(HOST_OUT_EXECUTABLES)/llvm-rs-cc +BCC_COMPAT := $(HOST_OUT_EXECUTABLES)/bcc_compat + +DX := $(HOST_OUT_EXECUTABLES)/dx +MAINDEXCLASSES := $(HOST_OUT_EXECUTABLES)/mainDexClasses + +USE_PREBUILT_SDK_TOOLS_IN_PLACE := true + +# Override the definitions above for unbundled and PDK builds +ifneq (,$(TARGET_BUILD_APPS)$(filter true,$(TARGET_BUILD_PDK))) +prebuilt_sdk_tools := prebuilts/sdk/tools +prebuilt_sdk_tools_bin := $(prebuilt_sdk_tools)/$(HOST_OS)/bin + +ACP := $(prebuilt_sdk_tools_bin)/acp +AIDL := $(prebuilt_sdk_tools_bin)/aidl +AAPT := $(prebuilt_sdk_tools_bin)/aapt +AAPT2 := $(prebuilt_sdk_tools_bin)/aapt2 +ZIPALIGN := $(prebuilt_sdk_tools_bin)/zipalign +SIGNAPK_JAR := $(prebuilt_sdk_tools)/lib/signapk$(COMMON_JAVA_PACKAGE_SUFFIX) +# Use 64-bit libraries unconditionally because 32-bit JVMs are no longer supported +SIGNAPK_JNI_LIBRARY_PATH := $(prebuilt_sdk_tools)/$(HOST_OS)/lib64 + +DX := $(prebuilt_sdk_tools)/dx +MAINDEXCLASSES := $(prebuilt_sdk_tools)/mainDexClasses + +# Don't use prebuilts in PDK +ifneq ($(TARGET_BUILD_PDK),true) +LLVM_RS_CC := $(prebuilt_sdk_tools_bin)/llvm-rs-cc +BCC_COMPAT := $(prebuilt_sdk_tools_bin)/bcc_compat +endif # TARGET_BUILD_PDK +endif # TARGET_BUILD_APPS || TARGET_BUILD_PDK + # --------------------------------------------------------------- # Generic tools. +JACK := $(HOST_OUT_EXECUTABLES)/jack +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 @@ -378,10 +540,16 @@ YACC := $(BISON) -d YASM := prebuilts/misc/$(BUILD_OS)-$(HOST_PREBUILT_ARCH)/yasm/yasm DOXYGEN:= doxygen -AAPT := $(HOST_OUT_EXECUTABLES)/aapt$(HOST_EXECUTABLE_SUFFIX) -AIDL := $(HOST_OUT_EXECUTABLES)/aidl$(HOST_EXECUTABLE_SUFFIX) +AIDL_CPP := $(HOST_OUT_EXECUTABLES)/aidl-cpp$(HOST_EXECUTABLE_SUFFIX) +ifeq ($(HOST_OS),linux) +BREAKPAD_DUMP_SYMS := $(HOST_OUT_EXECUTABLES)/dump_syms +else +# For non-supported hosts, do not generate breakpad symbols. +BREAKPAD_GENERATE_SYMBOLS := false +endif PROTOC := $(HOST_OUT_EXECUTABLES)/aprotoc$(HOST_EXECUTABLE_SUFFIX) -SIGNAPK_JAR := $(HOST_OUT_JAVA_LIBRARIES)/signapk$(COMMON_JAVA_PACKAGE_SUFFIX) +VTSC := $(HOST_OUT_EXECUTABLES)/vtsc$(HOST_EXECUTABLE_SUFFIX) +DBUS_GENERATOR := $(HOST_OUT_EXECUTABLES)/dbus-binding-generator MKBOOTFS := $(HOST_OUT_EXECUTABLES)/mkbootfs$(HOST_EXECUTABLE_SUFFIX) MINIGZIP := $(HOST_OUT_EXECUTABLES)/minigzip$(HOST_EXECUTABLE_SUFFIX) ifeq (,$(strip $(BOARD_CUSTOM_MKBOOTIMG))) @@ -391,36 +559,60 @@ 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) +BLK_ALLOC_TO_BASE_FS := $(HOST_OUT_EXECUTABLES)/blk_alloc_to_base_fs$(HOST_EXECUTABLE_SUFFIX) MKEXTUSERIMG := $(HOST_OUT_EXECUTABLES)/mkuserimg.sh +MAKE_SQUASHFS := $(HOST_OUT_EXECUTABLES)/mksquashfs$(HOST_EXECUTABLE_SUFFIX) +MKSQUASHFSUSERIMG := $(HOST_OUT_EXECUTABLES)/mksquashfsimage.sh MAKE_F2FS := $(HOST_OUT_EXECUTABLES)/make_f2fs$(HOST_EXECUTABLE_SUFFIX) MKF2FSUSERIMG := $(HOST_OUT_EXECUTABLES)/mkf2fsuserimg.sh -MKEXT2BOOTIMG := external/genext2fs/mkbootimg_ext2.sh SIMG2IMG := $(HOST_OUT_EXECUTABLES)/simg2img$(HOST_EXECUTABLE_SUFFIX) +IMG2SIMG := $(HOST_OUT_EXECUTABLES)/img2simg$(HOST_EXECUTABLE_SUFFIX) E2FSCK := $(HOST_OUT_EXECUTABLES)/e2fsck$(HOST_EXECUTABLE_SUFFIX) MKTARBALL := build/tools/mktarball.sh TUNE2FS := $(HOST_OUT_EXECUTABLES)/tune2fs$(HOST_EXECUTABLE_SUFFIX) E2FSCK := $(HOST_OUT_EXECUTABLES)/e2fsck$(HOST_EXECUTABLE_SUFFIX) JARJAR := $(HOST_OUT_JAVA_LIBRARIES)/jarjar.jar +DATA_BINDING_COMPILER := $(HOST_OUT_JAVA_LIBRARIES)/databinding-compiler.jar + +ifeq ($(ANDROID_COMPILE_WITH_JACK),true) +DEFAULT_JACK_ENABLED:=full +else +DEFAULT_JACK_ENABLED:= +endif +ifneq ($(ANDROID_JACK_EXTRA_ARGS),) +DEFAULT_JACK_EXTRA_ARGS := $(ANDROID_JACK_EXTRA_ARGS) +else +DEFAULT_JACK_EXTRA_ARGS := @$(BUILD_SYSTEM)/jack-default.args +endif +# Turn off jack warnings by default. +DEFAULT_JACK_EXTRA_ARGS += --verbose error + PROGUARD := external/proguard/bin/proguard.sh 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 APPEND2SIMG := $(HOST_OUT_EXECUTABLES)/append2simg VERITY_SIGNER := $(HOST_OUT_EXECUTABLES)/verity_signer BUILD_VERITY_TREE := $(HOST_OUT_EXECUTABLES)/build_verity_tree BOOT_SIGNER := $(HOST_OUT_EXECUTABLES)/boot_signer +FUTILITY := $(HOST_OUT_EXECUTABLES)/futility-host +VBOOT_SIGNER := prebuilts/misc/scripts/vboot_signer/vboot_signer.sh +FEC := $(HOST_OUT_EXECUTABLES)/fec -# ACP is always for the build OS, not for the host OS -ACP := $(BUILD_OUT_EXECUTABLES)/acp$(BUILD_EXECUTABLE_SUFFIX) +ifndef TARGET_BUILD_APPS +ZIPTIME := $(HOST_OUT_EXECUTABLES)/ziptime$(HOST_EXECUTABLE_SUFFIX) +endif + +# ijar converts a .jar file to a smaller .jar file which only has its +# interfaces. +IJAR := $(HOST_OUT_EXECUTABLES)/ijar$(BUILD_EXECUTABLE_SUFFIX) +DEXDUMP := $(HOST_OUT_EXECUTABLES)/dexdump2$(BUILD_EXECUTABLE_SUFFIX) + +# relocation packer +RELOCATION_PACKER := prebuilts/misc/$(BUILD_OS)-$(HOST_PREBUILT_ARCH)/relocation_packer/relocation_packer -# dx is java behind a shell script; no .exe necessary. -DX := $(HOST_OUT_EXECUTABLES)/dx -ZIPALIGN := $(HOST_OUT_EXECUTABLES)/zipalign$(HOST_EXECUTABLE_SUFFIX) FINDBUGS_DIR := external/owasp/sanitizer/tools/findbugs/bin FINDBUGS := $(FINDBUGS_DIR)/findbugs EMMA_JAR := external/emma/lib/emma$(COMMON_JAVA_PACKAGE_SUFFIX) @@ -428,30 +620,15 @@ EMMA_JAR := external/emma/lib/emma$(COMMON_JAVA_PACKAGE_SUFFIX) # Tool to merge AndroidManifest.xmls ANDROID_MANIFEST_MERGER := java -classpath prebuilts/devtools/tools/lib/manifest-merger.jar com.android.manifmerger.Main merge -YACC_HEADER_SUFFIX:= .hpp - -# Don't use column under Windows, cygwin or not -ifeq ($(HOST_OS),windows) -COLUMN:= cat -else COLUMN:= column -endif -ifeq ($(HOST_OS),darwin) -ifeq ($(LEGACY_USE_JAVA6),) +# We may not have the right JAVA_HOME/PATH set up yet when this is run from envsetup.sh. +ifneq ($(CALLED_FROM_SETUP),true) 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) +$(error Error: could not find jdk tools.jar at $(HOST_JDK_TOOLS_JAR), please check if your JDK was installed correctly) endif endif @@ -460,6 +637,7 @@ HOST_JDK_IS_64BIT_VERSION := ifneq ($(filter 64-Bit, $(shell java -version 2>&1)),) HOST_JDK_IS_64BIT_VERSION := true endif +endif # CALLED_FROM_SETUP not true # It's called md5 on Mac OS and md5sum on Linux ifeq ($(HOST_OS),darwin) @@ -480,10 +658,77 @@ else DEFAULT_SYSTEM_DEV_CERTIFICATE := build/target/product/security/testkey endif +# Rules for QCOM targets +include vendor/cm/build/core/qcom_target.mk + +# Rules for MTK targets +include vendor/cm/build/core/mtk_target.mk + # ############################################################### # Set up final options. # ############################################################### +ifneq ($(COMMON_GLOBAL_CFLAGS)$(COMMON_GLOBAL_CPPFLAGS),) +$(warning COMMON_GLOBAL_C(PP)FLAGS changed) +$(info *** Device configurations are no longer allowed to change the global flags.) +$(info *** COMMON_GLOBAL_CFLAGS: $(COMMON_GLOBAL_CFLAGS)) +$(info *** COMMON_GLOBAL_CPPFLAGS: $(COMMON_GLOBAL_CPPFLAGS)) +$(error bailing...) +endif + +# These can be changed to modify both host and device modules. +COMMON_GLOBAL_CFLAGS:= -DANDROID -fmessage-length=0 -W -Wall -Wno-unused -Winit-self -Wpointer-arith +COMMON_RELEASE_CFLAGS:= -DNDEBUG -UDEBUG + +# Force gcc to always output color diagnostics. Ninja will strip the ANSI +# color codes if it is not running in a terminal. +ifdef BUILDING_WITH_NINJA +COMMON_GLOBAL_CFLAGS += -fdiagnostics-color +endif + +COMMON_GLOBAL_CPPFLAGS:= -Wsign-promo +COMMON_RELEASE_CPPFLAGS:= + +GLOBAL_CFLAGS_NO_OVERRIDE := \ + -Werror=int-to-pointer-cast \ + -Werror=pointer-to-int-cast \ + +GLOBAL_CLANG_CFLAGS_NO_OVERRIDE := \ + -Werror=address-of-temporary \ + -Werror=null-dereference \ + -Werror=return-type \ + +GLOBAL_CPPFLAGS_NO_OVERRIDE := + +# list of flags to turn specific warnings in to errors +TARGET_ERROR_FLAGS := -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Werror=date-time + +# We run gcc/clang with PWD=/proc/self/cwd to remove the $TOP +# from the debug output. That way two builds in two different +# directories will create the same output. +# /proc doesn't exist on Darwin. +ifeq ($(HOST_OS),linux) +RELATIVE_PWD := PWD=/proc/self/cwd +# Remove this useless prefix from the debug output. +COMMON_GLOBAL_CFLAGS += -fdebug-prefix-map=/proc/self/cwd= +else +RELATIVE_PWD := +endif + +# Allow the C/C++ macros __DATE__ and __TIME__ to be set to the +# build date and time, so that a build may be repeated. +# Write the date and time to a file so that the command line +# doesn't change every time, which would cause ninja to rebuild +# the files. +$(shell mkdir -p $(OUT_DIR) && \ + $(DATE) "+%b %_d %Y" > $(OUT_DIR)/build_c_date.txt && \ + $(DATE) +%T > $(OUT_DIR)/build_c_time.txt) +BUILD_DATETIME_C_DATE := $$(cat $(OUT_DIR)/build_c_date.txt) +BUILD_DATETIME_C_TIME := $$(cat $(OUT_DIR)/build_c_time.txt) +ifeq ($(OVERRIDE_C_DATE_TIME),true) +COMMON_GLOBAL_CFLAGS += -Wno-builtin-macro-redefined -D__DATE__="\"$(BUILD_DATETIME_C_DATE)\"" -D__TIME__=\"$(BUILD_DATETIME_C_TIME)\" +endif + HOST_GLOBAL_CFLAGS += $(COMMON_GLOBAL_CFLAGS) HOST_RELEASE_CFLAGS += $(COMMON_RELEASE_CFLAGS) @@ -500,7 +745,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) @@ -508,7 +754,6 @@ TARGET_PROJECT_INCLUDES:= $(SRC_HEADERS) $(TARGET_OUT_HEADERS) \ # sure to only specify them for the target compilers checked in to # the source tree. TARGET_GLOBAL_CFLAGS += $(TARGET_ERROR_FLAGS) -TARGET_GLOBAL_CPPFLAGS += $(TARGET_ERROR_FLAGS) HOST_GLOBAL_CFLAGS += $(HOST_RELEASE_CFLAGS) HOST_GLOBAL_CPPFLAGS += $(HOST_RELEASE_CPPFLAGS) @@ -524,7 +769,6 @@ $(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_RELEASE_CPPFLAGS += $(COMMON_RELEASE_CPPFLAG $(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_GLOBAL_LD_DIRS += -L$($(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_INTERMEDIATE_LIBRARIES) $(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_PROJECT_INCLUDES := $(TARGET_PROJECT_INCLUDES) $(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_GLOBAL_CFLAGS += $(TARGET_ERROR_FLAGS) -$(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_GLOBAL_CPPFLAGS += $(TARGET_ERROR_FLAGS) $(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_GLOBAL_CFLAGS += $($(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_RELEASE_CFLAGS) $(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_GLOBAL_CPPFLAGS += $($(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_RELEASE_CPPFLAGS) endif @@ -540,28 +784,55 @@ $(HOST_2ND_ARCH_VAR_PREFIX)HOST_GLOBAL_CFLAGS += $($(HOST_2ND_ARCH_VAR_PREFIX)HO $(HOST_2ND_ARCH_VAR_PREFIX)HOST_GLOBAL_CPPFLAGS += $($(HOST_2ND_ARCH_VAR_PREFIX)HOST_RELEASE_CPPFLAGS) endif +ifdef HOST_CROSS_OS +HOST_CROSS_GLOBAL_CFLAGS += $(filter-out $(HOST_CROSS_UNKNOWN_CFLAGS),$(COMMON_GLOBAL_CFLAGS)) +HOST_CROSS_RELEASE_CFLAGS += $(COMMON_RELEASE_CFLAGS) +HOST_CROSS_GLOBAL_CPPFLAGS += $(COMMON_GLOBAL_CPPFLAGS) +HOST_CROSS_RELEASE_CPPFLAGS += $(COMMON_RELEASE_CPPFLAGS) +HOST_CROSS_GLOBAL_LD_DIRS += -L$(HOST_CROSS_OUT_INTERMEDIATE_LIBRARIES) +HOST_CROSS_PROJECT_INCLUDES:= $(SRC_HEADERS) $(SRC_HOST_HEADERS) $(HOST_CROSS_OUT_HEADERS) +HOST_CROSS_GLOBAL_CFLAGS += $(HOST_CROSS_RELEASE_CFLAGS) +HOST_CROSS_GLOBAL_CPPFLAGS += $(HOST_CROSS_RELEASE_CPPFLAGS) + +ifdef HOST_CROSS_2ND_ARCH +$(HOST_CROSS_2ND_ARCH_VAR_PREFIX)HOST_CROSS_GLOBAL_CFLAGS += $(filter-out $($(HOST_CROSS_2ND_ARCH_VAR_PREFIX)HOST_CROSS_UNKNOWN_CFLAGS),$(COMMON_GLOBAL_CFLAGS)) +$(HOST_CROSS_2ND_ARCH_VAR_PREFIX)HOST_CROSS_RELEASE_CFLAGS += $(COMMON_RELEASE_CFLAGS) +$(HOST_CROSS_2ND_ARCH_VAR_PREFIX)HOST_CROSS_GLOBAL_CPPFLAGS += $(COMMON_GLOBAL_CPPFLAGS) +$(HOST_CROSS_2ND_ARCH_VAR_PREFIX)HOST_CROSS_RELEASE_CPPFLAGS += $(COMMON_RELEASE_CPPFLAGS) +$(HOST_CROSS_2ND_ARCH_VAR_PREFIX)HOST_CROSS_GLOBAL_LD_DIRS += -L$($(HOST_CROSS_2ND_ARCH_VAR_PREFIX)HOST_CROSS_OUT_INTERMEDIATE_LIBRARIES) +$(HOST_CROSS_2ND_ARCH_VAR_PREFIX)HOST_CROSS_PROJECT_INCLUDES:= $(SRC_HEADERS) $(SRC_HOST_HEADERS) $($(HOST_CROSS_2ND_ARCH_VAR_PREFIX)HOST_CROSS_OUT_HEADERS) +$(HOST_CROSS_2ND_ARCH_VAR_PREFIX)HOST_CROSS_GLOBAL_CFLAGS += $($(HOST_CROSS_2ND_ARCH_VAR_PREFIX)HOST_CROSS_RELEASE_CFLAGS) +$(HOST_CROSS_2ND_ARCH_VAR_PREFIX)HOST_CROSS_GLOBAL_CPPFLAGS += $($(HOST_CROSS_2ND_ARCH_VAR_PREFIX)HOST_CROSS_RELEASE_CPPFLAGS) +endif +endif + +ifdef BRILLO +# Add a C define that identifies Brillo targets. __BRILLO__ should only be used +# to differentiate between Brillo and non-Brillo-but-Android environments. Use +# __ANDROID__ instead to test if something is being built in an Android-derived +# environment (including Brillo) as opposed to an entirely different +# environment (e.g. Chrome OS). +TARGET_GLOBAL_CFLAGS += -D__BRILLO__ +ifdef TARGET_2ND_ARCH +$(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_GLOBAL_CFLAGS += -D__BRILLO__ +endif +endif + # allow overriding default Java libraries on a per-target basis ifeq ($(TARGET_DEFAULT_JAVA_LIBRARIES),) - TARGET_DEFAULT_JAVA_LIBRARIES := core-libart core-junit ext framework + TARGET_DEFAULT_JAVA_LIBRARIES := core-oj core-libart core-junit ext framework okhttp endif -TARGET_CPU_SMP ?= true - # Flags for DEX2OAT +first_non_empty_of_three = $(if $(1),$(1),$(if $(2),$(2),$(3))) DEX2OAT_TARGET_ARCH := $(TARGET_ARCH) -DEX2OAT_TARGET_CPU_VARIANT := $(TARGET_CPU_VARIANT) +DEX2OAT_TARGET_CPU_VARIANT := $(call first_non_empty_of_three,$(TARGET_CPU_VARIANT),$(TARGET_ARCH_VARIANT),default) DEX2OAT_TARGET_INSTRUCTION_SET_FEATURES := default -ifneq (,$(filter $(DEX2OAT_TARGET_CPU_VARIANT),cortex-a7 cortex-a15 krait denver)) - DEX2OAT_TARGET_INSTRUCTION_SET_FEATURES := div -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_CPU_VARIANT := $(call first_non_empty_of_three,$(TARGET_2ND_CPU_VARIANT),$(TARGET_2ND_ARCH_VARIANT),default) $(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)) - $(TARGET_2ND_ARCH_VAR_PREFIX)DEX2OAT_TARGET_INSTRUCTION_SET_FEATURES := div -endif endif # define clang/llvm tools and global flags @@ -575,6 +846,13 @@ include $(BUILD_SYSTEM)/clang/config.mk HISTORICAL_SDK_VERSIONS_ROOT := $(TOPDIR)prebuilts/sdk HISTORICAL_NDK_VERSIONS_ROOT := $(TOPDIR)prebuilts/ndk +# The path where app can reference the support library resources. +ifdef TARGET_BUILD_APPS +SUPPORT_LIBRARY_ROOT := $(HISTORICAL_SDK_VERSIONS_ROOT)/current/support +else +SUPPORT_LIBRARY_ROOT := frameworks/support +endif + # Historical SDK version N is stored in $(HISTORICAL_SDK_VERSIONS_ROOT)/N. # The 'current' version is whatever this source tree is. # @@ -595,13 +873,15 @@ TARGET_AVAILABLE_SDK_VERSIONS := $(call numerically_sort,\ $(patsubst $(HISTORICAL_SDK_VERSIONS_ROOT)/%/android.jar,%, \ $(wildcard $(HISTORICAL_SDK_VERSIONS_ROOT)/*/android.jar))) -# We don't have prebuilt system_current SDK yet. -TARGET_AVAILABLE_SDK_VERSIONS := $(TARGET_AVAILABLE_SDK_VERSIONS) +# We don't have prebuilt test_current SDK yet. +TARGET_AVAILABLE_SDK_VERSIONS := test_current $(TARGET_AVAILABLE_SDK_VERSIONS) INTERNAL_PLATFORM_API_FILE := $(TARGET_OUT_COMMON_INTERMEDIATES)/PACKAGING/public_api.txt INTERNAL_PLATFORM_REMOVED_API_FILE := $(TARGET_OUT_COMMON_INTERMEDIATES)/PACKAGING/removed.txt INTERNAL_PLATFORM_SYSTEM_API_FILE := $(TARGET_OUT_COMMON_INTERMEDIATES)/PACKAGING/system-api.txt INTERNAL_PLATFORM_SYSTEM_REMOVED_API_FILE := $(TARGET_OUT_COMMON_INTERMEDIATES)/PACKAGING/system-removed.txt +INTERNAL_PLATFORM_TEST_API_FILE := $(TARGET_OUT_COMMON_INTERMEDIATES)/PACKAGING/test-api.txt +INTERNAL_PLATFORM_TEST_REMOVED_API_FILE := $(TARGET_OUT_COMMON_INTERMEDIATES)/PACKAGING/test-removed.txt # This is the standard way to name a directory containing prebuilt target # objects. E.g., prebuilt/$(TARGET_PREBUILT_TAG)/libc.so @@ -613,7 +893,40 @@ endif # Set up RS prebuilt variables for compatibility library RS_PREBUILT_CLCORE := prebuilts/sdk/renderscript/lib/$(TARGET_ARCH)/librsrt_$(TARGET_ARCH).bc -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 +ifeq (true,$(TARGET_IS_64_BIT)) +RS_PREBUILT_LIBPATH := -L prebuilts/ndk/current/platforms/android-21/arch-$(TARGET_ARCH)/usr/lib64 \ + -L prebuilts/ndk/current/platforms/android-21/arch-$(TARGET_ARCH)/usr/lib +else +RS_PREBUILT_LIBPATH := -L prebuilts/ndk/current/platforms/android-9/arch-$(TARGET_ARCH)/usr/lib +endif + +# API Level lists for Renderscript Compat lib. +RSCOMPAT_32BIT_ONLY_API_LEVELS := 8 9 10 11 12 13 14 15 16 17 18 19 20 +RSCOMPAT_NO_USAGEIO_API_LEVELS := 8 9 10 11 12 13 + +# 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/config_sanitizers.mk b/core/config_sanitizers.mk new file mode 100644 index 000000000..dbcf27695 --- /dev/null +++ b/core/config_sanitizers.mk @@ -0,0 +1,161 @@ +############################################## +## Perform configuration steps for sanitizers. +############################################## + +my_sanitize := $(strip $(LOCAL_SANITIZE)) + +# SANITIZE_HOST is only in effect if the module is already using clang (host +# modules that haven't set `LOCAL_CLANG := false` and device modules that +# have set `LOCAL_CLANG := true`. +my_global_sanitize := +ifeq ($(my_clang),true) + ifdef LOCAL_IS_HOST_MODULE + my_global_sanitize := $(strip $(SANITIZE_HOST)) + + # SANITIZE_HOST=true is a deprecated way to say SANITIZE_HOST=address. + my_global_sanitize := $(subst true,address,$(my_global_sanitize)) + else + my_global_sanitize := $(strip $(SANITIZE_TARGET)) + endif +endif + +# The sanitizer specified by the environment wins over the module. +ifneq ($(my_global_sanitize),) + my_sanitize := $(my_global_sanitize) +endif + +# The sanitizer specified in the product configuration wins over the previous. +ifneq ($(SANITIZER.$(TARGET_PRODUCT).$(LOCAL_MODULE).CONFIG),) + my_sanitize := $(SANITIZER.$(TARGET_PRODUCT).$(LOCAL_MODULE).CONFIG) + ifeq ($(my_sanitize),never) + my_sanitize := + endif +endif + +# Add a filter point for 32-bit vs 64-bit sanitization (to lighten the burden). +SANITIZE_ARCH ?= 32 64 +ifeq ($(filter $(SANITIZE_ARCH),$(my_32_64_bit_suffix)),) + my_sanitize := +endif + +# Add a filter point based on module owner (to lighten the burden). The format is a space- or +# colon-separated list of owner names. +ifneq (,$(SANITIZE_NEVER_BY_OWNER)) + ifneq (,$(LOCAL_MODULE_OWNER)) + ifneq (,$(filter $(LOCAL_MODULE_OWNER),$(subst :, ,$(SANITIZE_NEVER_BY_OWNER)))) + $(warning Not sanitizing $(LOCAL_MODULE) based on module owner.) + my_sanitize := + endif + endif +endif + +# Don't apply sanitizers to NDK code. +ifdef LOCAL_SDK_VERSION + my_sanitize := +endif + +# Never always wins. +ifeq ($(LOCAL_SANITIZE),never) + my_sanitize := +endif + +# TSAN is not supported on 32-bit architectures. For non-multilib cases, make +# its use an error. For multilib cases, don't use it for the 32-bit case. +ifneq ($(filter thread,$(my_sanitize)),) + ifeq ($(my_32_64_bit_suffix),32) + ifeq ($(my_module_multilib),both) + my_sanitize := $(filter-out thread,$(my_sanitize)) + else + $(error $(LOCAL_PATH): $(LOCAL_MODULE): TSAN cannot be used for 32-bit modules.) + endif + endif +endif + +# Undefined symbols can occur if a non-sanitized library links +# sanitized static libraries. That's OK, because the executable +# always depends on the ASan runtime library, which defines these +# symbols. +ifneq ($(strip $(SANITIZE_TARGET)),) + ifndef LOCAL_IS_HOST_MODULE + ifeq ($(LOCAL_MODULE_CLASS),SHARED_LIBRARIES) + ifeq ($(my_sanitize),) + my_allow_undefined_symbols := true + endif + endif + # Workaround for a bug in AddressSanitizer that breaks stack unwinding. + # https://code.google.com/p/address-sanitizer/issues/detail?id=387 + # Revert when external/compiler-rt is updated past r236014. + LOCAL_PACK_MODULE_RELOCATIONS := false + endif +endif + +# Sanitizers can only be used with clang. +ifneq ($(my_clang),true) + ifneq ($(my_sanitize),) + $(error $(LOCAL_PATH): $(LOCAL_MODULE): Use of sanitizers requires LOCAL_CLANG := true) + endif +endif + +ifneq ($(filter default-ub,$(my_sanitize)),) + my_sanitize := $(CLANG_DEFAULT_UB_CHECKS) +endif + +ifneq ($(filter coverage,$(my_sanitize)),) + ifeq ($(filter address,$(my_sanitize)),) + $(error $(LOCAL_PATH): $(LOCAL_MODULE): Use of 'coverage' also requires 'address') + endif + my_cflags += -fsanitize-coverage=edge,indirect-calls,8bit-counters,trace-cmp + my_sanitize := $(filter-out coverage,$(my_sanitize)) +endif + +ifneq ($(my_sanitize),) + fsanitize_arg := $(subst $(space),$(comma),$(my_sanitize)) + my_cflags += -fsanitize=$(fsanitize_arg) + + ifdef LOCAL_IS_HOST_MODULE + my_cflags += -fno-sanitize-recover=all + my_ldflags += -fsanitize=$(fsanitize_arg) + my_ldlibs += -lrt -ldl + else + ifeq ($(filter address,$(my_sanitize)),) + my_cflags += -fsanitize-trap=all + my_cflags += -ftrap-function=abort + endif + my_shared_libraries += libdl + endif +endif + +ifneq ($(filter address,$(my_sanitize)),) + # Frame pointer based unwinder in ASan requires ARM frame setup. + LOCAL_ARM_MODE := arm + my_cflags += $(ADDRESS_SANITIZER_CONFIG_EXTRA_CFLAGS) + my_ldflags += $(ADDRESS_SANITIZER_CONFIG_EXTRA_LDFLAGS) + ifdef LOCAL_IS_HOST_MODULE + # -nodefaultlibs (provided with libc++) prevents the driver from linking + # libraries needed with -fsanitize=address. http://b/18650275 (WAI) + my_ldlibs += -lm -lpthread + my_ldflags += -Wl,--no-as-needed + else + my_cflags += -mllvm -asan-globals=0 + # ASan runtime library must be the first in the link order. + my_shared_libraries := $($(LOCAL_2ND_ARCH_VAR_PREFIX)ADDRESS_SANITIZER_RUNTIME_LIBRARY) \ + $(my_shared_libraries) \ + $(ADDRESS_SANITIZER_CONFIG_EXTRA_SHARED_LIBRARIES) + my_static_libraries += $(ADDRESS_SANITIZER_CONFIG_EXTRA_STATIC_LIBRARIES) + + my_linker := $($(LOCAL_2ND_ARCH_VAR_PREFIX)ADDRESS_SANITIZER_LINKER) + # Make sure linker_asan get installed. + $(LOCAL_INSTALLED_MODULE) : | $(PRODUCT_OUT)$($(LOCAL_2ND_ARCH_VAR_PREFIX)ADDRESS_SANITIZER_LINKER) + endif +endif + +ifneq ($(filter undefined,$(my_sanitize)),) + ifndef LOCAL_IS_HOST_MODULE + $(error ubsan is not yet supported on the target) + endif +endif + +ifneq ($(strip $(LOCAL_SANITIZE_RECOVER)),) + recover_arg := $(subst $(space),$(comma),$(LOCAL_SANITIZE_RECOVER)), + my_cflags += -fsanitize-recover=$(recover_arg) +endif diff --git a/core/configure_local_jack.mk b/core/configure_local_jack.mk new file mode 100644 index 000000000..2270c88c4 --- /dev/null +++ b/core/configure_local_jack.mk @@ -0,0 +1,39 @@ +# +# 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. +# + +ifdef ANDROID_FORCE_JACK_ENABLED +LOCAL_JACK_ENABLED := $(ANDROID_FORCE_JACK_ENABLED) +endif + +LOCAL_JACK_ENABLED := $(strip $(LOCAL_JACK_ENABLED)) +LOCAL_MODULE := $(strip $(LOCAL_MODULE)) + +ifneq ($(LOCAL_JACK_ENABLED),full) +ifneq ($(LOCAL_JACK_ENABLED),incremental) +ifdef LOCAL_JACK_ENABLED +ifneq ($(LOCAL_JACK_ENABLED),disabled) +$(error $(LOCAL_PATH): invalid LOCAL_JACK_ENABLED "$(LOCAL_JACK_ENABLED)" for $(LOCAL_MODULE)) +endif +endif +LOCAL_JACK_ENABLED := +endif +endif + +ifdef $(LOCAL_MODULE).JACK_VERSION +LOCAL_JACK_VERSION := $($(LOCAL_MODULE).JACK_VERSION) +else +LOCAL_JACK_VERSION := $(JACK_DEFAULT_VERSION) +endif diff --git a/core/copy_headers.mk b/core/copy_headers.mk index e16560fbf..7d5a5d992 100644 --- a/core/copy_headers.mk +++ b/core/copy_headers.mk @@ -18,8 +18,10 @@ $(foreach header,$(LOCAL_COPY_HEADERS), \ $(if $(LOCAL_COPY_HEADERS_TO),\ $($(my_prefix)OUT_HEADERS)/$(LOCAL_COPY_HEADERS_TO)/$(notdir $(header)),\ $($(my_prefix)OUT_HEADERS)/$(notdir $(header)))) \ - $(eval $(call copy-one-header,$(_chFrom),$(_chTo))) \ - $(eval all_copied_headers: $(_chTo)) \ + $(eval ALL_COPIED_HEADERS.$(_chTo).MAKEFILE += $(LOCAL_MODULE_MAKEFILE)) \ + $(eval ALL_COPIED_HEADERS.$(_chTo).SRC += $(_chFrom)) \ + $(if $(filter $(_chTo),$(ALL_COPIED_HEADERS)),, \ + $(eval ALL_COPIED_HEADERS += $(_chTo))) \ ) _chFrom := _chTo := diff --git a/core/cxx_stl_setup.mk b/core/cxx_stl_setup.mk new file mode 100644 index 000000000..37be1f7cc --- /dev/null +++ b/core/cxx_stl_setup.mk @@ -0,0 +1,123 @@ +############################################################# +## Set up flags based on LOCAL_CXX_STL. +## Input variables: LOCAL_CXX_STL, my_prefix +## Output variables: My_cflags, my_c_includes, my_shared_libraries, etc. +############################################################# + +# Select the appropriate C++ STL +ifeq ($(strip $(LOCAL_CXX_STL)),default) + ifndef LOCAL_SDK_VERSION + # Platform code. Select the appropriate STL. + my_cxx_stl := libc++ + ifdef LOCAL_IS_HOST_MODULE + ifneq (,$(BUILD_HOST_static)) + my_cxx_stl := libc++_static + endif + + ifeq ($($(my_prefix)OS),windows) + # libc++ is not supported on mingw. + my_cxx_stl := libstdc++ + endif + endif + else + my_cxx_stl := ndk + endif +else + my_cxx_stl := $(strip $(LOCAL_CXX_STL)) + ifdef LOCAL_SDK_VERSION + # The NDK has historically used LOCAL_NDK_STL_VARIANT to specify the + # STL. An Android.mk that specifies both LOCAL_CXX_STL and + # LOCAL_SDK_VERSION will incorrectly try (and most likely fail) to use + # the platform STL in an NDK binary. Emit an error to direct the user + # toward the correct option. + # + # Note that we could also accept LOCAL_CXX_STL as an alias for + # LOCAL_NDK_STL_VARIANT (and in fact soong does use the same name), but + # the two options use different names for the STLs. + $(error $(LOCAL_PATH): $(LOCAL_MODULE): Must use LOCAL_NDK_STL_VARIANT rather than LOCAL_CXX_STL for NDK binaries) + endif + ifdef LOCAL_IS_HOST_MODULE + ifeq ($($(my_prefix)OS),windows) + ifneq ($(filter $(my_cxx_stl),libc++ libc++_static),) + # libc++ is not supported on mingw. + my_cxx_stl := libstdc++ + endif + endif + endif +endif + +# Yes, this is actually what the clang driver does. +linux_dynamic_gcclibs := -lgcc_s -lgcc -lc -lgcc_s -lgcc +linux_static_gcclibs := -Wl,--start-group -lgcc -lgcc_eh -lc -Wl,--end-group +darwin_dynamic_gcclibs := -lc -lSystem +darwin_static_gcclibs := NO_STATIC_HOST_BINARIES_ON_DARWIN +windows_dynamic_gcclibs := \ + -lmsvcr110 -lmingw32 -lgcc -lmoldname -lmingwex -lmsvcrt -ladvapi32 \ + -lshell32 -luser32 -lkernel32 -lmingw32 -lgcc -lmoldname -lmingwex -lmsvcrt +windows_static_gcclibs := NO_STATIC_HOST_BINARIES_ON_WINDOWS + +my_link_type := dynamic +ifdef LOCAL_IS_HOST_MODULE + ifneq (,$(BUILD_HOST_static)) + my_link_type := static + endif + ifeq (-static,$(filter -static,$(my_ldflags))) + my_link_type := static + endif +else + ifeq (true,$(LOCAL_FORCE_STATIC_EXECUTABLE)) + my_link_type := static + endif +endif + +ifneq ($(filter $(my_cxx_stl),libc++ libc++_static),) + my_cflags += -D_USING_LIBCXX + + # Note that the structure of this means that LOCAL_CXX_STL := libc++ will + # use the static libc++ for static executables. + ifeq ($(my_link_type),dynamic) + ifeq ($(my_cxx_stl),libc++) + my_shared_libraries += libc++ + else + my_static_libraries += libc++_static + endif + else + my_static_libraries += libc++_static + endif + + ifdef LOCAL_IS_HOST_MODULE + my_cppflags += -nostdinc++ + my_ldflags += -nodefaultlibs + my_ldlibs += -lpthread -lm + my_ldlibs += $($($(my_prefix)OS)_$(my_link_type)_gcclibs) + else + ifeq (arm,$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)) + my_static_libraries += libunwind_llvm + my_ldflags += -Wl,--exclude-libs,libunwind_llvm.a + endif + + ifeq ($(my_link_type),static) + my_static_libraries += libm libc libdl + else + my_shared_libraries += libdl + endif + endif +else ifeq ($(my_cxx_stl),ndk) + # Using an NDK STL. Handled in binary.mk. +else ifeq ($(my_cxx_stl),libstdc++) + # Using bionic's basic libstdc++. Not actually an STL. Only around until the + # tree is in good enough shape to not need it. + ifndef LOCAL_IS_HOST_MODULE + my_c_includes += bionic/libstdc++/include + my_system_shared_libraries += libstdc++ + endif + # Host builds will use GNU libstdc++. +else ifeq ($(my_cxx_stl),none) + ifdef LOCAL_IS_HOST_MODULE + my_cppflags += -nostdinc++ + my_ldflags += -nodefaultlibs + my_ldlibs += $($($(my_prefix)OS)_$(my_link_type)_gcclibs) + endif +else + $(error $(LOCAL_PATH): $(LOCAL_MODULE): $(my_cxx_stl) is not a supported STL.) +endif diff --git a/core/definitions.mk b/core/definitions.mk index 38aa72066..bca474e73 100644 --- a/core/definitions.mk +++ b/core/definitions.mk @@ -87,11 +87,18 @@ TARGET_DEPENDENCIES_ON_SHARED_LIBRARIES := $(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_DEPENDENCIES_ON_SHARED_LIBRARIES := HOST_DEPENDENCIES_ON_SHARED_LIBRARIES := $(HOST_2ND_ARCH_VAR_PREFIX)HOST_DEPENDENCIES_ON_SHARED_LIBRARIES := +HOST_CROSS_DEPENDENCIES_ON_SHARED_LIBRARIES := +$(HOST_CROSS_2ND_ARCH_VAR_PREFIX)HOST_CROSS_DEPENDENCIES_ON_SHARED_LIBRARIES := # Generated class file names for Android resource. # They are escaped and quoted so can be passed safely to a bash command. ANDROID_RESOURCE_GENERATED_CLASSES := 'R.class' 'R$$*.class' 'Manifest.class' 'Manifest$$*.class' +# Display names for various build targets +TARGET_DISPLAY := target +HOST_DISPLAY := host +HOST_CROSS_DISPLAY := host cross + ########################################################### ## Debugging; prints a variable list to stdout ########################################################### @@ -126,6 +133,7 @@ endef define my-dir $(strip \ $(eval LOCAL_MODULE_MAKEFILE := $$(lastword $$(MAKEFILE_LIST))) \ + $(eval LOCAL_MODULE_MAKEFILE_DEP := $(if $(BUILDING_WITH_NINJA),,$$(LOCAL_MODULE_MAKEFILE))) \ $(if $(filter $(BUILD_SYSTEM)/% $(OUT_DIR)/%,$(LOCAL_MODULE_MAKEFILE)), \ $(error my-dir must be called before including any other makefile.) \ , \ @@ -134,12 +142,28 @@ $(strip \ ) endef +########################################################### +## Remove any makefiles that are being handled by soong +########################################################### +ifeq ($(USE_SOONG),true) +define filter-soong-makefiles +$(foreach mk,$(1),\ + $(if $(wildcard $(patsubst %/Android.mk,%/Android.bp,$(mk))),\ + $(info skipping $(mk) ...),\ + $(mk))) +endef +else +define filter-soong-makefiles +$(1) +endef +endif + ########################################################### ## Retrieve a list of all makefiles immediately below some directory ########################################################### define all-makefiles-under -$(wildcard $(1)/*/Android.mk) +$(sort $(call filter-soong-makefiles,$(wildcard $(1)/*/Android.mk))) endef ########################################################### @@ -150,8 +174,9 @@ endef # $(1): directory to search under # Ignores $(1)/Android.mk define first-makefiles-under -$(shell build/tools/findleaves.py --prune=$(OUT_DIR) --prune=.repo --prune=.git \ - --mindepth=2 $(1) Android.mk) +$(call filter-soong-makefiles,\ + $(shell build/tools/findleaves.py $(FIND_LEAVES_EXCLUDES) \ + --mindepth=2 $(1) Android.mk)) endef ########################################################### @@ -171,7 +196,48 @@ endef # $(1): List of directories to look for under this directory define all-named-subdir-makefiles -$(wildcard $(addsuffix /Android.mk, $(addprefix $(call my-dir)/,$(1)))) +$(sort $(call filter-soong-makefiles,\ + $(wildcard $(addsuffix /Android.mk, $(addprefix $(call my-dir)/,$(1)))))) +endef + +########################################################### +## Find all of the directories under the named directories with +## the specified name. +## Meant to be used like: +## INC_DIRS := $(call all-named-dirs-under,inc,.) +########################################################### + +define all-named-dirs-under +$(call find-subdir-files,$(2) -type d -name "$(1)") +endef + +########################################################### +## Find all the directories under the current directory that +## haves name that match $(1) +########################################################### + +define all-subdir-named-dirs +$(call all-named-dirs-under,$(1),.) +endef + +########################################################### +## Find all of the files under the named directories with +## the specified name. +## Meant to be used like: +## SRC_FILES := $(call all-named-files-under,*.h,src tests) +########################################################### + +define all-named-files-under +$(call find-files-in-subdirs,$(LOCAL_PATH),"$(1)",$(2)) +endef + +########################################################### +## Find all of the files under the current directory with +## the specified name. +########################################################### + +define all-subdir-named-files +$(call all-named-files-under,$(1),.) endef ########################################################### @@ -181,10 +247,7 @@ endef ########################################################### define all-java-files-under -$(patsubst ./%,%, \ - $(shell cd $(LOCAL_PATH) ; \ - find -L $(1) -name "*.java" -and -not -name ".*") \ - ) +$(call all-named-files-under,*.java,$(1)) endef ########################################################### @@ -203,10 +266,7 @@ endef ########################################################### define all-c-files-under -$(patsubst ./%,%, \ - $(shell cd $(LOCAL_PATH) ; \ - find -L $(1) -name "*.c" -and -not -name ".*") \ - ) +$(call all-named-files-under,*.c,$(1)) endef ########################################################### @@ -218,6 +278,29 @@ define all-subdir-c-files $(call all-c-files-under,.) endef +########################################################### +## Find all of the cpp files under the named directories. +## LOCAL_CPP_EXTENSION is respected if set. +## Meant to be used like: +## SRC_FILES := $(call all-cpp-files-under,src tests) +########################################################### + +define all-cpp-files-under +$(sort $(patsubst ./%,%, \ + $(shell cd $(LOCAL_PATH) ; \ + find -L $(1) -name "*$(or $(LOCAL_CPP_EXTENSION),.cpp)" -and -not -name ".*") \ + )) +endef + +########################################################### +## Find all of the cpp files from here. Meant to be used like: +## SRC_FILES := $(call all-subdir-cpp-files) +########################################################### + +define all-subdir-cpp-files +$(call all-cpp-files-under,.) +endef + ########################################################### ## Find all files named "I*.aidl" under the named directories, ## which must be relative to $(LOCAL_PATH). The returned list @@ -225,10 +308,7 @@ endef ########################################################### define all-Iaidl-files-under -$(patsubst ./%,%, \ - $(shell cd $(LOCAL_PATH) ; \ - find -L $(1) -name "I*.aidl" -and -not -name ".*") \ - ) +$(call all-named-files-under,I*.aidl,$(1)) endef ########################################################### @@ -239,6 +319,24 @@ define all-subdir-Iaidl-files $(call all-Iaidl-files-under,.) endef +########################################################### +## Find all files named "*.vts" under the named directories, +## which must be relative to $(LOCAL_PATH). The returned list +## is relative to $(LOCAL_PATH). +########################################################### + +define all-vts-files-under +$(call all-named-files-under,*.vts,$(1)) +endef + +########################################################### +## Find all of the "*.vts" files under $(LOCAL_PATH). +########################################################### + +define all-subdir-vts-files +$(call all-vts-files-under,.) +endef + ########################################################### ## Find all of the logtags files under the named directories. ## Meant to be used like: @@ -246,10 +344,7 @@ endef ########################################################### define all-logtags-files-under -$(patsubst ./%,%, \ - $(shell cd $(LOCAL_PATH) ; \ - find -L $(1) -name "*.logtags" -and -not -name ".*") \ - ) +$(call all-named-files-under,*.logtags,$(1)) endef ########################################################### @@ -259,10 +354,7 @@ endef ########################################################### define all-proto-files-under -$(patsubst ./%,%, \ - $(shell cd $(LOCAL_PATH) ; \ - find -L $(1) -name "*.proto" -and -not -name ".*") \ - ) +$(call all-named-files-under,*.proto,$(1)) endef ########################################################### @@ -272,10 +364,7 @@ endef ########################################################### define all-renderscript-files-under -$(patsubst ./%,%, \ - $(shell cd $(LOCAL_PATH) ; \ - find -L $(1) \( -name "*.rs" -or -name "*.fs" \) -and -not -name ".*") \ - ) +$(call find-subdir-files,$(1) \( -name "*.rs" -or -name "*.fs" \) -and -not -name ".*") endef ########################################################### @@ -285,10 +374,7 @@ endef ########################################################### define all-S-files-under -$(patsubst ./%,%, \ - $(shell cd $(LOCAL_PATH) ; \ - find -L $(1) -name "*.S" -and -not -name ".*") \ - ) +$(call all-named-files-under,*.S,$(1)) endef ########################################################### @@ -298,10 +384,7 @@ endef ########################################################### define all-html-files-under -$(patsubst ./%,%, \ - $(shell cd $(LOCAL_PATH) ; \ - find -L $(1) -name "*.html" -and -not -name ".*") \ - ) +$(call all-named-files-under,*.html,$(1)) endef ########################################################### @@ -319,7 +402,7 @@ endef ########################################################### define find-subdir-files -$(patsubst ./%,%,$(shell cd $(LOCAL_PATH) ; find -L $(1))) +$(sort $(patsubst ./%,%,$(shell cd $(LOCAL_PATH) ; find -L $(1)))) endef ########################################################### @@ -331,8 +414,8 @@ endef ########################################################### define find-subdir-subdir-files -$(filter-out $(patsubst %,$(1)/%,$(3)),$(patsubst ./%,%,$(shell cd \ - $(LOCAL_PATH) ; find -L $(1) -maxdepth 1 -name $(2)))) +$(sort $(filter-out $(patsubst %,$(1)/%,$(3)),$(patsubst ./%,%,$(shell cd \ + $(LOCAL_PATH) ; find -L $(1) -maxdepth 1 -name $(2))))) endef ########################################################### @@ -341,10 +424,10 @@ endef ########################################################### define find-subdir-assets -$(if $(1),$(patsubst ./%,%, \ - $(shell if [ -d $(1) ] ; then cd $(1) ; find ./ -not -name '.*' -and -type f -and -not -type l ; fi)), \ +$(sort $(if $(1),$(patsubst ./%,%, \ + $(shell if [ -d $(1) ] ; then cd $(1) ; find -L ./ -not -name '.*' -and -type f -and -not -type l ; fi)), \ $(warning Empty argument supplied to find-subdir-assets) \ -) +)) endef ########################################################### @@ -352,11 +435,15 @@ endef ########################################################### define find-other-java-files - $(call find-subdir-files,$(1) -name "*.java" -and -not -name ".*") +$(call all-java-files-under,$(1)) +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 ".*") +$(call all-html-files-under,$(1)) endef ########################################################### @@ -369,10 +456,10 @@ endef ########################################################### define find-files-in-subdirs -$(patsubst ./%,%, \ +$(sort $(patsubst ./%,%, \ $(shell cd $(1) ; \ find -L $(3) -name $(2) -and -not -name ".*") \ - ) + )) endef ########################################################### @@ -385,7 +472,7 @@ endef define find-parent-file $(strip \ - $(eval _fpf := $(wildcard $(foreach f, $(2), $(strip $(1))/$(f)))) \ + $(eval _fpf := $(sort $(wildcard $(foreach f, $(2), $(strip $(1))/$(f))))) \ $(if $(_fpf),$(_fpf), \ $(if $(filter-out ./ .,$(1)), \ $(call find-parent-file,$(patsubst %/,%,$(dir $(1))),$(2)) \ @@ -402,6 +489,14 @@ define add-dependency $(1): $(2) endef +########################################################### +## Reverse order of a list +########################################################### + +define reverse-list +$(if $(1),$(call reverse-list,$(wordlist 2,$(words $(1)),$(1)))) $(firstword $(1)) +endef + ########################################################### ## The intermediates directory. Where object files go for ## a given target. We could technically get away without @@ -414,7 +509,8 @@ endef # $(2): target name, like "NotePad" # $(3): if non-empty, this is a HOST target. # $(4): if non-empty, force the intermediates to be COMMON -# $(5): if non-empty, force the intermedistes to be for the 2nd arch +# $(5): if non-empty, force the intermediates to be for the 2nd arch +# $(6): if non-empty, force the intermediates to be for the host cross os define intermediates-dir-for $(strip \ $(eval _idfClass := $(strip $(1))) \ @@ -423,11 +519,11 @@ $(strip \ $(eval _idfName := $(strip $(2))) \ $(if $(_idfName),, \ $(error $(LOCAL_PATH): Name not defined in call to intermediates-dir-for)) \ - $(eval _idfPrefix := $(if $(strip $(3)),HOST,TARGET)) \ + $(eval _idfPrefix := $(if $(strip $(3)),$(if $(strip $(6)),HOST_CROSS,HOST),TARGET)) \ $(eval _idf2ndArchPrefix := $(if $(strip $(5)),$(TARGET_2ND_ARCH_VAR_PREFIX))) \ $(if $(filter $(_idfPrefix)-$(_idfClass),$(COMMON_MODULE_CLASSES))$(4), \ $(eval _idfIntBase := $($(_idfPrefix)_OUT_COMMON_INTERMEDIATES)) \ - ,$(if $(filter $(_idfClass),SHARED_LIBRARIES STATIC_LIBRARIES EXECUTABLES GYP),\ + ,$(if $(filter $(_idfClass),$(PER_ARCH_MODULE_CLASSES)),\ $(eval _idfIntBase := $($(_idf2ndArchPrefix)$(_idfPrefix)_OUT_INTERMEDIATES)) \ ,$(eval _idfIntBase := $($(_idfPrefix)_OUT_INTERMEDIATES)) \ ) \ @@ -441,13 +537,14 @@ endef # # $(1): if non-empty, force the intermediates to be COMMON # $(2): if non-empty, force the intermediates to be for the 2nd arch +# $(3): if non-empty, force the intermediates to be for the host cross os define local-intermediates-dir $(strip \ $(if $(strip $(LOCAL_MODULE_CLASS)),, \ $(error $(LOCAL_PATH): LOCAL_MODULE_CLASS not defined before call to local-intermediates-dir)) \ $(if $(strip $(LOCAL_MODULE)),, \ $(error $(LOCAL_PATH): LOCAL_MODULE not defined before call to local-intermediates-dir)) \ - $(call intermediates-dir-for,$(LOCAL_MODULE_CLASS),$(LOCAL_MODULE),$(LOCAL_IS_HOST_MODULE),$(1),$(2)) \ + $(call intermediates-dir-for,$(LOCAL_MODULE_CLASS),$(LOCAL_MODULE),$(LOCAL_IS_HOST_MODULE),$(1),$(2),$(3)) \ ) endef @@ -474,7 +571,7 @@ $(strip \ $(error $(LOCAL_PATH): Name not defined in call to generated-sources-dir-for)) \ $(eval _idfPrefix := $(if $(strip $(3)),HOST,TARGET)) \ $(if $(filter $(_idfPrefix)-$(_idfClass),$(COMMON_MODULE_CLASSES))$(4), \ - $(eval _idfIntBase := $($(_idfPrefix)_OUT_GEN_COMMON)) \ + $(eval _idfIntBase := $($(_idfPrefix)_OUT_COMMON_GEN)) \ , \ $(eval _idfIntBase := $($(_idfPrefix)_OUT_GEN)) \ ) \ @@ -580,25 +677,60 @@ endef # $(1): library name # $(2): Non-empty if IS_HOST_MODULE define _java-lib-full-classes.jar -$(call _java-lib-dir,$(1),$(2))/classes$(COMMON_JAVA_PACKAGE_SUFFIX) +$(call _java-lib-dir,$(1),$(2))/$(if $(2),javalib,classes)$(COMMON_JAVA_PACKAGE_SUFFIX) endef +# Get the jar files (you can pass to "javac -classpath") of static or shared +# Java libraries that you want to link against. # $(1): library name list # $(2): Non-empty if IS_HOST_MODULE define java-lib-files $(foreach lib,$(1),$(call _java-lib-full-classes.jar,$(lib),$(2))) endef +# Get the dependency files (you can put on the right side of "|" of a build rule) +# of the Java libraries. +# $(1): library name list +# $(2): Non-empty if IS_HOST_MODULE +# Historically for target Java libraries we used a different file (javalib.jar) +# as the dependency. +# Now we can use classes.jar as dependency, so java-lib-deps is the same +# as java-lib-files. +define java-lib-deps +$(call java-lib-files,$(1),$(2)) +endef + +# Get the jar files (you can pass to "javac -classpath") of host dalvik Java libraries. +# You can also use them as dependency files. +# A host dalvik Java library is different from a host Java library in that +# the java lib file is classes.jar, not javalib.jar. +# $(1): library name list +define host-dex-java-lib-files +$(foreach lib,$(1),$(call _java-lib-dir,$(lib),true)/classes.jar) +endef + +########################################################### +## Convert "core ext framework" to "out/.../classes.jack ..." +## $(1): library list +## $(2): Non-empty if IS_HOST_MODULE +########################################################### + # $(1): library name # $(2): Non-empty if IS_HOST_MODULE -define _java-lib-full-dep -$(call _java-lib-dir,$(1),$(2))/$(if $(2),javalib,classes)$(COMMON_JAVA_PACKAGE_SUFFIX) +define _jack-lib-full-classes +$(call _java-lib-dir,$(1),$(2))/classes.jack endef # $(1): library name list # $(2): Non-empty if IS_HOST_MODULE -define java-lib-deps -$(foreach lib,$(1),$(call _java-lib-full-dep,$(lib),$(2))) +define jack-lib-files +$(foreach lib,$(1),$(call _jack-lib-full-classes,$(lib),$(2))) +endef + +# $(1): library name list +# $(2): Non-empty if IS_HOST_MODULE +define jack-lib-deps +$(call jack-lib-files,$(1),$(2)) endef ########################################################### @@ -684,7 +816,7 @@ endef # any of those tags. # $(1): tag list define modules-for-tag-list -$(sort $(foreach tag,$(1),$(ALL_MODULE_TAGS.$(tag)))) +$(sort $(foreach tag,$(1),$(foreach m,$(ALL_MODULE_NAME_TAGS.$(tag)),$(ALL_MODULES.$(m).INSTALLED)))) endef # Same as modules-for-tag-list, but operates on @@ -764,99 +896,128 @@ ifeq ($(strip $(SHOW_COMMANDS)),) define pretty @echo $1 endef -hide := @ else define pretty endef -hide := endif ########################################################### -## Dump the variables that are associated with targets +## Commands for munging the dependency files the compiler generates ########################################################### +# $(1): the input .d file +# $(2): the output .P file +define transform-d-to-p-args +$(hide) cp $(1) $(2); \ + sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \ + -e '/^$$/ d' -e 's/$$/ :/' < $(1) >> $(2); \ + rm -f $(1) +endef -define dump-module-variables -@echo all_dependencies=$^ -@echo PRIVATE_YACCFLAGS=$(PRIVATE_YACCFLAGS); -@echo PRIVATE_CFLAGS=$(PRIVATE_CFLAGS); -@echo PRIVATE_CPPFLAGS=$(PRIVATE_CPPFLAGS); -@echo PRIVATE_DEBUG_CFLAGS=$(PRIVATE_DEBUG_CFLAGS); -@echo PRIVATE_C_INCLUDES=$(PRIVATE_C_INCLUDES); -@echo PRIVATE_LDFLAGS=$(PRIVATE_LDFLAGS); -@echo PRIVATE_LDLIBS=$(PRIVATE_LDLIBS); -@echo PRIVATE_ARFLAGS=$(PRIVATE_ARFLAGS); -@echo PRIVATE_AAPT_FLAGS=$(PRIVATE_AAPT_FLAGS); -@echo PRIVATE_DX_FLAGS=$(PRIVATE_DX_FLAGS); -@echo PRIVATE_JAVACFLAGS=$(PRIVATE_JAVACFLAGS); -@echo PRIVATE_JAVA_LIBRARIES=$(PRIVATE_JAVA_LIBRARIES); -@echo PRIVATE_ALL_SHARED_LIBRARIES=$(PRIVATE_ALL_SHARED_LIBRARIES); -@echo PRIVATE_ALL_STATIC_LIBRARIES=$(PRIVATE_ALL_STATIC_LIBRARIES); -@echo PRIVATE_ALL_WHOLE_STATIC_LIBRARIES=$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES); -@echo PRIVATE_ALL_OBJECTS=$(PRIVATE_ALL_OBJECTS); -@echo PRIVATE_NO_CRT=$(PRIVATE_NO_CRT); +define transform-d-to-p +$(call transform-d-to-p-args,$(@:%.o=%.d),$(@:%.o=%.P)) endef ########################################################### -## Commands for using sed to replace given variable values +## Commands for including the dependency files the compiler generates ########################################################### - -define transform-variables -@mkdir -p $(dir $@) -@echo "Sed: $(if $(PRIVATE_MODULE),$(PRIVATE_MODULE),$@) <= $<" -$(hide) sed $(foreach var,$(REPLACE_VARS),-e "s/{{$(var)}}/$(subst /,\/,$(PWD)/$($(var)))/g") $< >$@ -$(hide) if [ "$(suffix $@)" = ".sh" ]; then chmod a+rx $@; fi +# $(1): the .P file +# $(2): the main build target +ifeq ($(BUILDING_WITH_NINJA),true) +define include-depfile +$(eval $(2) : .KATI_DEPFILE := $1) +endef +else +define include-depfile +$(eval -include $1) endef +endif +# $(1): object files +define include-depfiles-for-objs +$(foreach obj, $(1), $(call include-depfile, $(obj:%.o=%.P), $(obj))) +endef ########################################################### -## Commands for munging the dependency files GCC generates +## Track source files compiled to objects ########################################################### -# $(1): the input .d file -# $(2): the output .P file -define transform-d-to-p-args -$(hide) cp $(1) $(2); \ - sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \ - -e '/^$$/ d' -e 's/$$/ :/' < $(1) >> $(2); \ - rm -f $(1) +# $(1): list of sources +# $(2): list of matching objects +define track-src-file-obj +$(eval $(call _track-src-file-obj,$(1))) +endef +define _track-src-file-obj +i := w +$(foreach s,$(1), +my_tracked_src_files += $(s) +my_src_file_obj_$(s) := $$(word $$(words $$(i)),$$(2)) +i += w) endef -define transform-d-to-p -$(call transform-d-to-p-args,$(@:%.o=%.d),$(@:%.o=%.P)) +# $(1): list of sources +# $(2): list of matching generated sources +define track-src-file-gen +$(eval $(call _track-src-file-gen,$(2))) +endef +define _track-src-file-gen +i := w +$(foreach s,$(1), +my_tracked_gen_files += $(s) +my_src_file_gen_$(s) := $$(word $$(words $$(i)),$$(1)) +i += w) +endef + +# $(1): list of generated sources +# $(2): list of matching objects +define track-gen-file-obj +$(call track-src-file-obj,$(foreach f,$(1),\ + $(or $(my_src_file_gen_$(f)),$(f))),$(2)) endef ########################################################### ## Commands for running lex ########################################################### -define transform-l-to-cpp -@mkdir -p $(dir $@) +define transform-l-to-c-or-cpp @echo "Lex: $(PRIVATE_MODULE) <= $<" +@mkdir -p $(dir $@) $(hide) $(LEX) -o$@ $< endef ########################################################### ## Commands for running yacc ## -## Because the extension of c++ files can change, the -## extension must be specified in $1. -## E.g, "$(call transform-y-to-cpp,.cpp)" ########################################################### -define transform-y-to-cpp -@mkdir -p $(dir $@) +define transform-y-to-c-or-cpp @echo "Yacc: $(PRIVATE_MODULE) <= $<" -$(YACC) $(PRIVATE_YACCFLAGS) -o $@ $< -touch $(@:$1=$(YACC_HEADER_SUFFIX)) -echo '#ifndef '$(@F:$1=_h) > $(@:$1=.h) -echo '#define '$(@F:$1=_h) >> $(@:$1=.h) -cat $(@:$1=$(YACC_HEADER_SUFFIX)) >> $(@:$1=.h) -echo '#endif' >> $(@:$1=.h) +@mkdir -p $(dir $@) +$(YACC) $(PRIVATE_YACCFLAGS) \ + --defines=$(basename $@).h \ + -o $@ $< endef ########################################################### ## Commands to compile RenderScript to Java ########################################################### +## Merge multiple .d files generated by llvm-rs-cc. This is necessary +## because ninja can handle only a single depfile per build target. +## .d files generated by llvm-rs-cc define .stamp, .bc, and optionally +## .java as build targets. However, there's no way to let ninja know +## dependencies to .bc files and .java files, so we give up build +## targets for them. As we write the .stamp file as the target by +## ourselves, the awk script removes the first lines before the colon +## and append a backslash to the last line to concatenate contents of +## multiple files. +# $(1): .d files to be merged +# $(2): merged .d file +define _merge-renderscript-d +$(hide) echo '$@: $(backslash)' > $2 +$(foreach d,$1, \ + $(hide) awk 'start { sub(/( \\)?$$/, " \\"); print } /:/ { start=1 }' < $d >> $2$(newline)) +$(hide) echo >> $2 +endef + define transform-renderscripts-to-java-and-bc @echo "RenderScript: $(PRIVATE_MODULE) <= $(PRIVATE_RS_SOURCE_FILES)" $(hide) rm -rf $(PRIVATE_RS_OUTPUT_DIR) @@ -871,6 +1032,8 @@ $(hide) $(PRIVATE_RS_CC) \ $(PRIVATE_RS_FLAGS) \ $(foreach inc,$(PRIVATE_RS_INCLUDES),$(addprefix -I , $(inc))) \ $(PRIVATE_RS_SOURCE_FILES) +$(call _merge-renderscript-d,$(PRIVATE_DEP_FILES),$@.d) +$(call transform-d-to-p-args,$@.d,$@.P) $(hide) mkdir -p $(dir $@) $(hide) touch $@ endef @@ -884,8 +1047,8 @@ $(hide) $(PRIVATE_CXX) -shared -Wl,-soname,$(notdir $@) -nostdlib \ -Wl,-rpath,\$$ORIGIN/../lib \ $(dir $@)/$(notdir $(<:.bc=.o)) \ $(RS_PREBUILT_COMPILER_RT) \ - -o $@ $(TARGET_GLOBAL_LDFLAGS) -L prebuilts/gcc/ \ - -L $(TARGET_OUT_INTERMEDIATE_LIBRARIES) $(RS_PREBUILT_LIBPATH) \ + -o $@ $(TARGET_GLOBAL_LDFLAGS) -Wl,--hash-style=sysv -L prebuilts/gcc/ \ + $(RS_PREBUILT_LIBPATH) -L $(TARGET_OUT_INTERMEDIATE_LIBRARIES) \ -lRSSupport -lm -lc endef @@ -902,9 +1065,12 @@ $(hide) $(PRIVATE_RS_CC) \ -d $(PRIVATE_RS_OUTPUT_DIR) \ -a $@ -MD \ -reflect-c++ \ + $(addprefix -target-api , $(PRIVATE_RS_TARGET_API)) \ $(PRIVATE_RS_FLAGS) \ $(addprefix -I , $(PRIVATE_RS_INCLUDES)) \ $(PRIVATE_RS_SOURCE_FILES) +$(call _merge-renderscript-d,$(PRIVATE_DEP_FILES),$@.d) +$(call transform-d-to-p-args,$@.d,$@.P) $(hide) mkdir -p $(dir $@) $(hide) touch $@ endef @@ -921,6 +1087,51 @@ $(hide) $(AIDL) -d$(patsubst %.java,%.P,$@) $(PRIVATE_AIDL_FLAGS) $< $@ endef #$(AIDL) $(PRIVATE_AIDL_FLAGS) $< - | indent -nut -br -npcs -l1000 > $@ +define transform-aidl-to-cpp +@mkdir -p $(dir $@) +@mkdir -p $(PRIVATE_HEADER_OUTPUT_DIR) +@echo "Generating C++ from AIDL: $(PRIVATE_MODULE) <= $<" +$(hide) $(AIDL_CPP) -d$(basename $@).aidl.P $(PRIVATE_AIDL_FLAGS) \ + $< $(PRIVATE_HEADER_OUTPUT_DIR) $@ +endef + +## Given a .aidl file path generate the rule to compile it a .cpp file. +# $(1): a .aidl source file +# $(2): a directory to place the generated .cpp files in +# $(3): name of a variable to add the path to the generated source file to +# +# You must call this with $(eval). +define define-aidl-cpp-rule +define-aidl-cpp-rule-src := $(patsubst %.aidl,%$(LOCAL_CPP_EXTENSION),$(subst ../,dotdot/,$(addprefix $(2)/,$(1)))) +$$(define-aidl-cpp-rule-src) : $(LOCAL_PATH)/$(1) $(AIDL_CPP) + $$(transform-aidl-to-cpp) +$(3) += $$(define-aidl-cpp-rule-src) +endef + +########################################################### +## Commands for running vts +########################################################### + +define transform-vts-to-cpp +@mkdir -p $(dir $@) +@mkdir -p $(PRIVATE_HEADER_OUTPUT_DIR) +@echo "Generating C++ from VTS: $(PRIVATE_MODULE) <= $<" +$(hide) $(VTSC) -d$(basename $@).vts.P $(PRIVATE_VTS_FLAGS) \ + $< $(PRIVATE_HEADER_OUTPUT_DIR) $@ +endef + +## Given a .vts file path generate the rule to compile it a .cpp file. +# $(1): a .vts source file +# $(2): a directory to place the generated .cpp files in +# $(3): name of a variable to add the path to the generated source file to +# +# You must call this with $(eval). +define define-vts-cpp-rule +define-vts-cpp-rule-src := $(patsubst %.vts,%$(LOCAL_CPP_EXTENSION),$(subst ../,dotdot/,$(addprefix $(2)/,$(1)))) +$$(define-vts-cpp-rule-src) : $(LOCAL_PATH)/$(1) $(VTSC) + $$(transform-vts-to-cpp) +$(3) += $$(define-vts-cpp-rule-src) +endef ########################################################### ## Commands for running java-event-log-tags.py @@ -953,15 +1164,43 @@ $(hide) touch $@ endef ###################################################################### -## Commands for running protoc to compile .proto into .pb.cc and .pb.h +## Commands for running protoc to compile .proto into .pb.cc (or.pb.c) and .pb.h ###################################################################### define transform-proto-to-cc -@mkdir -p $(dir $@) @echo "Protoc: $@ <= $<" +@mkdir -p $(dir $@) $(hide) $(PROTOC) \ $(addprefix --proto_path=, $(PRIVATE_PROTO_INCLUDES)) \ $(PRIVATE_PROTOC_FLAGS) \ - --cpp_out=$(PRIVATE_PROTO_CC_OUTPUT_DIR) $< + $< +@# aprotoc outputs only .cc. Rename it to .cpp if necessary. +$(if $(PRIVATE_RENAME_CPP_EXT),\ + $(hide) mv $(basename $@).cc $@) +endef + + +###################################################################### +## Commands for generating DBus adaptors from .dbus-xml files. +###################################################################### +define generate-dbus-adaptors +@echo "Generating DBus adaptors for $(PRIVATE_MODULE)" +@mkdir -p $(dir $@) +$(hide) $(DBUS_GENERATOR) \ + --service-config=$(PRIVATE_DBUS_SERVICE_CONFIG) \ + --adaptor=$@ \ + $< +endef + +###################################################################### +## Commands for generating DBus proxies from .dbus-xml files. +###################################################################### +define generate-dbus-proxies +@echo "Generating DBus proxies for $(PRIVATE_MODULE)" +@mkdir -p $(dir $@) +$(hide) $(DBUS_GENERATOR) \ + --service-config=$(PRIVATE_DBUS_SERVICE_CONFIG) \ + --proxy=$@ \ + $(filter %.dbus-xml,$^) endef @@ -970,9 +1209,9 @@ endef ########################################################### define transform-cpp-to-o -@mkdir -p $(dir $@) @echo "target $(PRIVATE_ARM_MODE) C++: $(PRIVATE_MODULE) <= $<" -$(hide) $(PRIVATE_CXX) \ +@mkdir -p $(dir $@) +$(hide) $(RELATIVE_PWD) $(PRIVATE_CXX) \ $(addprefix -I , $(PRIVATE_C_INCLUDES)) \ $(shell cat $(PRIVATE_IMPORT_INCLUDES)) \ $(addprefix -isystem ,\ @@ -990,6 +1229,8 @@ $(hide) $(PRIVATE_CXX) \ $(PRIVATE_CFLAGS) \ $(PRIVATE_CPPFLAGS) \ $(PRIVATE_DEBUG_CFLAGS) \ + $(PRIVATE_CFLAGS_NO_OVERRIDE) \ + $(PRIVATE_CPPFLAGS_NO_OVERRIDE) \ -MD -MF $(patsubst %.o,%.d,$@) -o $@ $< $(transform-d-to-p) endef @@ -1002,7 +1243,7 @@ endef # $(1): extra flags define transform-c-or-s-to-o-no-deps @mkdir -p $(dir $@) -$(hide) $(PRIVATE_CC) \ +$(hide) $(RELATIVE_PWD) $(PRIVATE_CC) \ $(addprefix -I , $(PRIVATE_C_INCLUDES)) \ $(shell cat $(PRIVATE_IMPORT_INCLUDES)) \ $(addprefix -isystem ,\ @@ -1013,6 +1254,7 @@ $(hide) $(PRIVATE_CC) \ -c \ $(if $(PRIVATE_NO_DEFAULT_COMPILER_FLAGS),, \ $(PRIVATE_TARGET_GLOBAL_CFLAGS) \ + $(PRIVATE_TARGET_GLOBAL_CONLYFLAGS) \ $(PRIVATE_ARM_CFLAGS) \ ) \ $(1) \ @@ -1021,7 +1263,11 @@ endef define transform-c-to-o-no-deps @echo "target $(PRIVATE_ARM_MODE) C: $(PRIVATE_MODULE) <= $<" -$(call transform-c-or-s-to-o-no-deps, $(PRIVATE_CFLAGS) $(PRIVATE_CONLYFLAGS) $(PRIVATE_DEBUG_CFLAGS)) +$(call transform-c-or-s-to-o-no-deps, \ + $(PRIVATE_CFLAGS) \ + $(PRIVATE_CONLYFLAGS) \ + $(PRIVATE_DEBUG_CFLAGS) \ + $(PRIVATE_CFLAGS_NO_OVERRIDE)) endef define transform-s-to-o-no-deps @@ -1044,7 +1290,7 @@ define transform-asm-to-o @mkdir -p $(dir $@) $(hide) $(YASM) \ $(addprefix -I , $(PRIVATE_C_INCLUDES)) \ - -f elf32 -m x86 \ + $($(PRIVATE_2ND_ARCH_VAR_PREFIX)TARGET_GLOBAL_YASM_FLAGS) \ $(PRIVATE_ASFLAGS) \ -o $@ $< endef @@ -1070,15 +1316,15 @@ endef ########################################################### define transform-host-cpp-to-o +@echo "$($(PRIVATE_PREFIX)DISPLAY) C++: $(PRIVATE_MODULE) <= $<" @mkdir -p $(dir $@) -@echo "host C++: $(PRIVATE_MODULE) <= $<" -$(hide) $(PRIVATE_CXX) \ +$(hide) $(RELATIVE_PWD) $(PRIVATE_CXX) \ $(addprefix -I , $(PRIVATE_C_INCLUDES)) \ $(shell cat $(PRIVATE_IMPORT_INCLUDES)) \ $(addprefix -isystem ,\ $(if $(PRIVATE_NO_DEFAULT_COMPILER_FLAGS),, \ $(filter-out $(PRIVATE_C_INCLUDES), \ - $(HOST_PROJECT_INCLUDES) \ + $($(PRIVATE_PREFIX)PROJECT_INCLUDES) \ $(PRIVATE_HOST_C_INCLUDES)))) \ -c \ $(if $(PRIVATE_NO_DEFAULT_COMPILER_FLAGS),, \ @@ -1088,6 +1334,8 @@ $(hide) $(PRIVATE_CXX) \ $(PRIVATE_CFLAGS) \ $(PRIVATE_CPPFLAGS) \ $(PRIVATE_DEBUG_CFLAGS) \ + $(PRIVATE_CFLAGS_NO_OVERRIDE) \ + $(PRIVATE_CPPFLAGS_NO_OVERRIDE) \ -MD -MF $(patsubst %.o,%.d,$@) -o $@ $< $(transform-d-to-p) endef @@ -1100,29 +1348,31 @@ endef # $(1): extra flags define transform-host-c-or-s-to-o-no-deps @mkdir -p $(dir $@) -$(hide) $(PRIVATE_CC) \ +$(hide) $(RELATIVE_PWD) $(PRIVATE_CC) \ $(addprefix -I , $(PRIVATE_C_INCLUDES)) \ $(shell cat $(PRIVATE_IMPORT_INCLUDES)) \ $(addprefix -isystem ,\ $(if $(PRIVATE_NO_DEFAULT_COMPILER_FLAGS),, \ $(filter-out $(PRIVATE_C_INCLUDES), \ - $(HOST_PROJECT_INCLUDES) \ + $($(PRIVATE_PREFIX)PROJECT_INCLUDES) \ $(PRIVATE_HOST_C_INCLUDES)))) \ -c \ $(if $(PRIVATE_NO_DEFAULT_COMPILER_FLAGS),, \ $(PRIVATE_HOST_GLOBAL_CFLAGS) \ + $(PRIVATE_HOST_GLOBAL_CONLYFLAGS) \ ) \ $(1) \ + $(PRIVATE_CFLAGS_NO_OVERRIDE) \ -MD -MF $(patsubst %.o,%.d,$@) -o $@ $< endef define transform-host-c-to-o-no-deps -@echo "host C: $(PRIVATE_MODULE) <= $<" +@echo "$($(PRIVATE_PREFIX)DISPLAY) C: $(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 "$($(PRIVATE_PREFIX)DISPLAY) asm: $(PRIVATE_MODULE) <= $<" $(call transform-host-c-or-s-to-o-no-deps, $(PRIVATE_ASFLAGS)) endef @@ -1141,7 +1391,7 @@ endef ########################################################### define transform-host-m-to-o-no-deps -@echo "host ObjC: $(PRIVATE_MODULE) <= $<" +@echo "$($(PRIVATE_PREFIX)DISPLAY) ObjC: $(PRIVATE_MODULE) <= $<" $(call transform-host-c-or-s-to-o-no-deps, $(PRIVATE_CFLAGS) $(PRIVATE_DEBUG_CFLAGS)) endef @@ -1150,6 +1400,72 @@ $(transform-host-m-to-o-no-deps) $(transform-d-to-p) endef +########################################################### +## Commands for running gcc to compile a host Objective-C++ file +########################################################### + +define transform-host-mm-to-o +$(transform-host-cpp-to-o) +endef + + +########################################################### +## Rules to compile a single C/C++ source with ../ in the path +########################################################### +# Replace "../" in object paths with $(DOTDOT_REPLACEMENT). +DOTDOT_REPLACEMENT := dotdot/ + +## Rule to compile a C++ source file with ../ in the path. +## Must be called with $(eval). +# $(1): the C++ source file in LOCAL_SRC_FILES. +# $(2): the additional dependencies. +# $(3): the variable name to collect the output object file. +define compile-dotdot-cpp-file +o := $(intermediates)/$(patsubst %$(LOCAL_CPP_EXTENSION),%.o,$(subst ../,$(DOTDOT_REPLACEMENT),$(1))) +$$(o) : $(TOPDIR)$(LOCAL_PATH)/$(1) $(2) + $$(transform-$$(PRIVATE_HOST)cpp-to-o) +$$(call include-depfiles-for-objs, $$(o)) +$(3) += $$(o) +endef + +## Rule to compile a C source file with ../ in the path. +## Must be called with $(eval). +# $(1): the C source file in LOCAL_SRC_FILES. +# $(2): the additional dependencies. +# $(3): the variable name to collect the output object file. +define compile-dotdot-c-file +o := $(intermediates)/$(patsubst %.c,%.o,$(subst ../,$(DOTDOT_REPLACEMENT),$(1))) +$$(o) : $(TOPDIR)$(LOCAL_PATH)/$(1) $(2) + $$(transform-$$(PRIVATE_HOST)c-to-o) +$$(call include-depfiles-for-objs, $$(o)) +$(3) += $$(o) +endef + +## Rule to compile a .S source file with ../ in the path. +## Must be called with $(eval). +# $(1): the .S source file in LOCAL_SRC_FILES. +# $(2): the additional dependencies. +# $(3): the variable name to collect the output object file. +define compile-dotdot-s-file +o := $(intermediates)/$(patsubst %.S,%.o,$(subst ../,$(DOTDOT_REPLACEMENT),$(1))) +$$(o) : $(TOPDIR)$(LOCAL_PATH)/$(1) $(2) + $$(transform-$$(PRIVATE_HOST)s-to-o) +$$(call include-depfiles-for-objs, $$(o)) +$(3) += $$(o) +endef + +## Rule to compile a .s source file with ../ in the path. +## Must be called with $(eval). +# $(1): the .s source file in LOCAL_SRC_FILES. +# $(2): the additional dependencies. +# $(3): the variable name to collect the output object file. +define compile-dotdot-s-file-no-deps +o := $(intermediates)/$(patsubst %.s,%.o,$(subst ../,$(DOTDOT_REPLACEMENT),$(1))) +$$(o) : $(TOPDIR)$(LOCAL_PATH)/$(1) $(2) + $$(transform-$$(PRIVATE_HOST)s-to-o-no-deps) +$(3) += $$(o) +endef + ########################################################### ## Commands for running ar ########################################################### @@ -1176,35 +1492,52 @@ 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)]" $(hide) ldir=$(PRIVATE_INTERMEDIATES_DIR)/WHOLE/$(basename $(notdir $(1)))_objs;\ rm -rf $$ldir; \ mkdir -p $$ldir; \ + cp $(1) $$ldir; \ + lib_to_include=$$ldir/$(notdir $(1)); \ filelist=; \ + subdir=0; \ for f in `$($(PRIVATE_2ND_ARCH_VAR_PREFIX)TARGET_AR) t $(1)`; do \ - $($(PRIVATE_2ND_ARCH_VAR_PREFIX)TARGET_AR) p $(1) $$f > $$ldir/$$f; \ - filelist="$$filelist $$ldir/$$f"; \ + if [ -e $$ldir/$$f ]; then \ + mkdir $$ldir/$$subdir; \ + ext=$$subdir/; \ + subdir=$$((subdir+1)); \ + $($(PRIVATE_2ND_ARCH_VAR_PREFIX)TARGET_AR) m $$lib_to_include $$f; \ + else \ + ext=; \ + fi; \ + $($(PRIVATE_2ND_ARCH_VAR_PREFIX)TARGET_AR) p $$lib_to_include $$f > $$ldir/$$ext$$f; \ + filelist="$$filelist $$ldir/$$ext$$f"; \ done ; \ $($(PRIVATE_2ND_ARCH_VAR_PREFIX)TARGET_AR) $($(PRIVATE_2ND_ARCH_VAR_PREFIX)TARGET_GLOBAL_ARFLAGS) \ $(PRIVATE_ARFLAGS) $@ $$filelist endef +# $(1): the full path of the source static library. +define extract-and-include-whole-static-libs-first +$(if $(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 # Explicitly delete the archive first so that ar doesn't # try to add to an existing archive. define transform-o-to-static-lib +@echo "target StaticLib: $(PRIVATE_MODULE) ($@)" @mkdir -p $(dir $@) @rm -f $@ $(extract-and-include-target-whole-static-libs) -@echo "target StaticLib: $(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, $^)) + $(PRIVATE_ARFLAGS) $@,$(PRIVATE_ALL_OBJECTS)) endef ########################################################### @@ -1213,35 +1546,46 @@ 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)]" $(hide) ldir=$(PRIVATE_INTERMEDIATES_DIR)/WHOLE/$(basename $(notdir $(1)))_objs;\ rm -rf $$ldir; \ mkdir -p $$ldir; \ + cp $(1) $$ldir; \ + lib_to_include=$$ldir/$(notdir $(1)); \ filelist=; \ - for f in `$($(PRIVATE_2ND_ARCH_VAR_PREFIX)HOST_AR) t $(1) | \grep '\.o$$'`; do \ - $($(PRIVATE_2ND_ARCH_VAR_PREFIX)HOST_AR) p $(1) $$f > $$ldir/$$f; \ - filelist="$$filelist $$ldir/$$f"; \ + subdir=0; \ + for f in `$($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)AR) t $(1) | \grep '\.o$$'`; do \ + if [ -e $$ldir/$$f ]; then \ + mkdir $$ldir/$$subdir; \ + ext=$$subdir/; \ + subdir=$$((subdir+1)); \ + $($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)AR) m $$lib_to_include $$f; \ + else \ + ext=; \ + fi; \ + $($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)AR) p $$lib_to_include $$f > $$ldir/$$ext$$f; \ + filelist="$$filelist $$ldir/$$ext$$f"; \ done ; \ - $($(PRIVATE_2ND_ARCH_VAR_PREFIX)HOST_AR) $($(PRIVATE_2ND_ARCH_VAR_PREFIX)HOST_GLOBAL_ARFLAGS) \ + $($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)AR) $($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)GLOBAL_ARFLAGS) \ $(PRIVATE_ARFLAGS) $@ $$filelist 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 # Explicitly delete the archive first so that ar doesn't # try to add to an existing archive. define transform-host-o-to-static-lib +@echo "$($(PRIVATE_PREFIX)DISPLAY) StaticLib: $(PRIVATE_MODULE) ($@)" @mkdir -p $(dir $@) @rm -f $@ $(extract-and-include-host-whole-static-libs) -@echo "host StaticLib: $(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, $^)) +$(call split-long-arguments,$($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)AR) \ + $($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)GLOBAL_ARFLAGS) \ + $(PRIVATE_ARFLAGS) $@,$(PRIVATE_ALL_OBJECTS)) endef @@ -1254,10 +1598,11 @@ endef ifneq ($(HOST_CUSTOM_LD_COMMAND),true) define transform-host-o-to-shared-lib-inner $(hide) $(PRIVATE_CXX) \ - -Wl,-rpath-link=$($(PRIVATE_2ND_ARCH_VAR_PREFIX)HOST_OUT_INTERMEDIATE_LIBRARIES) \ - -Wl,-rpath,\$$ORIGIN/../$(notdir $($(PRIVATE_2ND_ARCH_VAR_PREFIX)HOST_OUT_SHARED_LIBRARIES)) \ + -Wl,-rpath-link=$($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)OUT_INTERMEDIATE_LIBRARIES) \ + -Wl,-rpath,\$$ORIGIN/../$(notdir $($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)OUT_SHARED_LIBRARIES)) \ + -Wl,-rpath,\$$ORIGIN/$(notdir $($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)OUT_SHARED_LIBRARIES)) \ -shared -Wl,-soname,$(notdir $@) \ - $($(PRIVATE_2ND_ARCH_VAR_PREFIX)HOST_GLOBAL_LD_DIRS) \ + $($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)GLOBAL_LD_DIRS) \ $(if $(PRIVATE_NO_DEFAULT_COMPILER_FLAGS),, \ $(PRIVATE_HOST_GLOBAL_LDFLAGS) \ ) \ @@ -1269,6 +1614,8 @@ $(hide) $(PRIVATE_CXX) \ $(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--start-group) \ $(call normalize-host-libraries,$(PRIVATE_ALL_STATIC_LIBRARIES)) \ $(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--end-group) \ + $(if $(filter true,$(NATIVE_COVERAGE)),-lgcov) \ + $(if $(filter true,$(NATIVE_COVERAGE)),$(PRIVATE_HOST_LIBPROFILE_RT)) \ $(call normalize-host-libraries,$(PRIVATE_ALL_SHARED_LIBRARIES)) \ -o $@ \ $(PRIVATE_LDLIBS) @@ -1276,14 +1623,14 @@ endef endif define transform-host-o-to-shared-lib +@echo "$($(PRIVATE_PREFIX)DISPLAY) SharedLib: $(PRIVATE_MODULE) ($@)" @mkdir -p $(dir $@) -@echo "host SharedLib: $(PRIVATE_MODULE) ($@)" $(transform-host-o-to-shared-lib-inner) endef define transform-host-o-to-package +@echo "$($(PRIVATE_PREFIX)DISPLAY) Package: $(PRIVATE_MODULE) ($@)" @mkdir -p $(dir $@) -@echo "host Package: $(PRIVATE_MODULE) ($@)" $(transform-host-o-to-shared-lib-inner) endef @@ -1292,26 +1639,13 @@ endef ## Commands for running gcc to link a shared library or package ########################################################### -#echo >$@.vers "{"; \ -#echo >>$@.vers " global:"; \ -#$(BUILD_SYSTEM)/filter_symbols.sh $(TARGET_NM) " " ";" $(filter %.o,$^) | sort -u >>$@.vers; \ -#echo >>$@.vers " local:"; \ -#echo >>$@.vers " *;"; \ -#echo >>$@.vers "};"; \ - -# -Wl,--version-script=$@.vers \ - -# ld just seems to be so finicky with command order that we allow -# it to be overriden en-masse see combo/linux-arm.make for an example. -ifneq ($(TARGET_CUSTOM_LD_COMMAND),true) define transform-o-to-shared-lib-inner $(hide) $(PRIVATE_CXX) \ - $(PRIVATE_TARGET_GLOBAL_LDFLAGS) \ - -Wl,-rpath-link=$(PRIVATE_TARGET_OUT_INTERMEDIATE_LIBRARIES) \ - -Wl,-rpath,\$$ORIGIN/../lib \ - -Wl,-shared -Wl,-soname,$(notdir $@) \ - $(PRIVATE_LDFLAGS) \ + -nostdlib -Wl,-soname,$(notdir $@) \ + -Wl,--gc-sections \ + $(if $(filter true,$(PRIVATE_CLANG)),-shared,-Wl$(comma)-shared) \ $(PRIVATE_TARGET_GLOBAL_LD_DIRS) \ + $(PRIVATE_TARGET_CRTBEGIN_SO_O) \ $(PRIVATE_ALL_OBJECTS) \ -Wl,--whole-archive \ $(call normalize-target-libraries,$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES)) \ @@ -1319,19 +1653,23 @@ $(hide) $(PRIVATE_CXX) \ $(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--start-group) \ $(call normalize-target-libraries,$(PRIVATE_ALL_STATIC_LIBRARIES)) \ $(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--end-group) \ + $(if $(filter true,$(NATIVE_COVERAGE)),$(PRIVATE_TARGET_COVERAGE_LIB)) \ + $(PRIVATE_TARGET_LIBATOMIC) \ + $(PRIVATE_TARGET_LIBGCC) \ $(call normalize-target-libraries,$(PRIVATE_ALL_SHARED_LIBRARIES)) \ -o $@ \ + $(PRIVATE_TARGET_GLOBAL_LDFLAGS) \ + $(PRIVATE_LDFLAGS) \ + $(PRIVATE_TARGET_CRTEND_SO_O) \ $(PRIVATE_LDLIBS) endef -endif define transform-o-to-shared-lib -@mkdir -p $(dir $@) @echo "target SharedLib: $(PRIVATE_MODULE) ($@)" -$($(PRIVATE_2ND_ARCH_VAR_PREFIX)transform-o-to-shared-lib-inner) +@mkdir -p $(dir $@) +$(transform-o-to-shared-lib-inner) endef - ########################################################### ## Commands for filtering a target executable or library ########################################################### @@ -1342,32 +1680,43 @@ ifneq ($(TARGET_BUILD_VARIANT),user) endif define transform-to-stripped -@mkdir -p $(dir $@) @echo "target Strip: $(PRIVATE_MODULE) ($@)" -$(hide) $(PRIVATE_STRIP) --strip-all $< -o $@ $(TARGET_STRIP_EXTRA) +@mkdir -p $(dir $@) +$(hide) $(PRIVATE_STRIP) --strip-all $< -o $@ \ + $(if $(PRIVATE_NO_DEBUGLINK),,$(TARGET_STRIP_EXTRA)) endef define transform-to-stripped-keep-symbols -@mkdir -p $(dir $@) @echo "target Strip (keep symbols): $(PRIVATE_MODULE) ($@)" +@mkdir -p $(dir $@) $(hide) $(PRIVATE_OBJCOPY) \ `$(PRIVATE_READELF) -S $< | awk '/.debug_/ {print "-R " $$2}' | xargs` \ $(TARGET_STRIP_KEEP_SYMBOLS_EXTRA) $< $@ endef +########################################################### +## Commands for packing a target executable or library +########################################################### + +define pack-elf-relocations +@echo "target Pack Relocations: $(PRIVATE_MODULE) ($@)" +$(copy-file-to-target) +$(hide) $(RELOCATION_PACKER) $@ +endef ########################################################### ## Commands for running gcc to link an executable ########################################################### -ifneq ($(TARGET_CUSTOM_LD_COMMAND),true) define transform-o-to-executable-inner -$(hide) $(PRIVATE_CXX) \ - $(PRIVATE_TARGET_GLOBAL_LDFLAGS) \ +$(hide) $(PRIVATE_CXX) -pie \ + -nostdlib -Bdynamic \ + -Wl,-dynamic-linker,$(PRIVATE_LINKER) \ + -Wl,--gc-sections \ + -Wl,-z,nocopyreloc \ $(PRIVATE_TARGET_GLOBAL_LD_DIRS) \ -Wl,-rpath-link=$(PRIVATE_TARGET_OUT_INTERMEDIATE_LIBRARIES) \ - -Wl,-rpath,\$$ORIGIN/../lib \ - $(PRIVATE_LDFLAGS) \ + $(PRIVATE_TARGET_CRTBEGIN_DYNAMIC_O) \ $(PRIVATE_ALL_OBJECTS) \ -Wl,--whole-archive \ $(call normalize-target-libraries,$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES)) \ @@ -1375,35 +1724,64 @@ $(hide) $(PRIVATE_CXX) \ $(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--start-group) \ $(call normalize-target-libraries,$(PRIVATE_ALL_STATIC_LIBRARIES)) \ $(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--end-group) \ + $(if $(filter true,$(NATIVE_COVERAGE)),$(PRIVATE_TARGET_COVERAGE_LIB)) \ + $(PRIVATE_TARGET_LIBATOMIC) \ + $(PRIVATE_TARGET_LIBGCC) \ $(call normalize-target-libraries,$(PRIVATE_ALL_SHARED_LIBRARIES)) \ -o $@ \ + $(PRIVATE_TARGET_GLOBAL_LDFLAGS) \ + $(PRIVATE_LDFLAGS) \ + $(PRIVATE_TARGET_CRTEND_O) \ $(PRIVATE_LDLIBS) endef -endif define transform-o-to-executable -@mkdir -p $(dir $@) @echo "target Executable: $(PRIVATE_MODULE) ($@)" -$($(PRIVATE_2ND_ARCH_VAR_PREFIX)transform-o-to-executable-inner) +@mkdir -p $(dir $@) +$(transform-o-to-executable-inner) endef ########################################################### -## Commands for running gcc to link a statically linked -## executable. In practice, we only use this on arm, so -## the other platforms don't have the -## transform-o-to-static-executable defined +## Commands for linking a static executable. In practice, +## we only use this on arm, so the other platforms don't +## have transform-o-to-static-executable defined. +## Clang driver needs -static to create static executable. +## However, bionic/linker uses -shared to overwrite. +## Linker for x86 targets does not allow coexistance of -static and -shared, +## so we add -static only if -shared is not used. ########################################################### -ifneq ($(TARGET_CUSTOM_LD_COMMAND),true) define transform-o-to-static-executable-inner +$(hide) $(PRIVATE_CXX) \ + -nostdlib -Bstatic \ + $(if $(filter $(PRIVATE_LDFLAGS),-shared),,-static) \ + -Wl,--gc-sections \ + -o $@ \ + $(PRIVATE_TARGET_GLOBAL_LD_DIRS) \ + $(PRIVATE_TARGET_CRTBEGIN_STATIC_O) \ + $(PRIVATE_TARGET_GLOBAL_LDFLAGS) \ + $(PRIVATE_LDFLAGS) \ + $(PRIVATE_ALL_OBJECTS) \ + -Wl,--whole-archive \ + $(call normalize-target-libraries,$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES)) \ + -Wl,--no-whole-archive \ + $(call normalize-target-libraries,$(filter-out %libcompiler_rt.a,$(filter-out %libc_nomalloc.a,$(filter-out %libc.a,$(PRIVATE_ALL_STATIC_LIBRARIES))))) \ + -Wl,--start-group \ + $(call normalize-target-libraries,$(filter %libc.a,$(PRIVATE_ALL_STATIC_LIBRARIES))) \ + $(call normalize-target-libraries,$(filter %libc_nomalloc.a,$(PRIVATE_ALL_STATIC_LIBRARIES))) \ + $(if $(filter true,$(NATIVE_COVERAGE)),$(PRIVATE_TARGET_COVERAGE_LIB)) \ + $(PRIVATE_TARGET_LIBATOMIC) \ + $(call normalize-target-libraries,$(filter %libcompiler_rt.a,$(PRIVATE_ALL_STATIC_LIBRARIES))) \ + $(PRIVATE_TARGET_LIBGCC) \ + -Wl,--end-group \ + $(PRIVATE_TARGET_CRTEND_O) endef -endif define transform-o-to-static-executable -@mkdir -p $(dir $@) @echo "target StaticExecutable: $(PRIVATE_MODULE) ($@)" -$($(PRIVATE_2ND_ARCH_VAR_PREFIX)transform-o-to-static-executable-inner) +@mkdir -p $(dir $@) +$(transform-o-to-static-executable-inner) endef @@ -1415,8 +1793,8 @@ HOST_FPIE_FLAGS := else HOST_FPIE_FLAGS := -pie # Force the correct entry point to workaround a bug in binutils that manifests with -pie -ifeq ($(HOST_OS),windows) -HOST_FPIE_FLAGS += -Wl,-e_mainCRTStartup +ifeq ($(HOST_CROSS_OS),windows) +HOST_CROSS_FPIE_FLAGS += -Wl,-e_mainCRTStartup endif endif @@ -1430,13 +1808,15 @@ $(hide) $(PRIVATE_CXX) \ $(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--start-group) \ $(call normalize-host-libraries,$(PRIVATE_ALL_STATIC_LIBRARIES)) \ $(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--end-group) \ + $(if $(filter true,$(NATIVE_COVERAGE)),-lgcov) \ + $(if $(filter true,$(NATIVE_COVERAGE)),$(PRIVATE_HOST_LIBPROFILE_RT)) \ $(call normalize-host-libraries,$(PRIVATE_ALL_SHARED_LIBRARIES)) \ - -Wl,-rpath-link=$($(PRIVATE_2ND_ARCH_VAR_PREFIX)HOST_OUT_INTERMEDIATE_LIBRARIES) \ - -Wl,-rpath,\$$ORIGIN/../$(notdir $($(PRIVATE_2ND_ARCH_VAR_PREFIX)HOST_OUT_SHARED_LIBRARIES)) \ - $($(PRIVATE_2ND_ARCH_VAR_PREFIX)HOST_GLOBAL_LD_DIRS) \ + -Wl,-rpath-link=$($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)OUT_INTERMEDIATE_LIBRARIES) \ + -Wl,-rpath,\$$ORIGIN/../$(notdir $($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)OUT_SHARED_LIBRARIES)) \ + -Wl,-rpath,\$$ORIGIN/$(notdir $($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)OUT_SHARED_LIBRARIES)) \ + $($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)GLOBAL_LD_DIRS) \ $(if $(PRIVATE_NO_DEFAULT_COMPILER_FLAGS),, \ $(PRIVATE_HOST_GLOBAL_LDFLAGS) \ - $(HOST_FPIE_FLAGS) \ ) \ $(PRIVATE_LDFLAGS) \ -o $@ \ @@ -1445,8 +1825,8 @@ endef endif define transform-host-o-to-executable +@echo "$($(PRIVATE_PREFIX)DISPLAY) Executable: $(PRIVATE_MODULE) ($@)" @mkdir -p $(dir $@) -@echo "host Executable: $(PRIVATE_MODULE) ($@)" $(transform-host-o-to-executable-inner) endef @@ -1455,8 +1835,16 @@ endef ## Commands for running javac to make .class files ########################################################### -#@echo "Source intermediates dir: $(PRIVATE_SOURCE_INTERMEDIATES_DIR)" -#@echo "Source intermediates: $$(find $(PRIVATE_SOURCE_INTERMEDIATES_DIR) -name '*.java')" +# Add BUILD_NUMBER to apps default version name if it's unbundled build. +ifdef TARGET_BUILD_APPS +TARGET_BUILD_WITH_APPS_VERSION_NAME := true +endif + +ifdef TARGET_BUILD_WITH_APPS_VERSION_NAME +APPS_DEFAULT_VERSION_NAME := $(PLATFORM_VERSION)-$(BUILD_NUMBER_FROM_FILE) +else +APPS_DEFAULT_VERSION_NAME := $(PLATFORM_VERSION) +endif # TODO: Right now we generate the asset resources twice, first as part # of generating the Java classes, then at the end when packaging the final @@ -1483,23 +1871,96 @@ $(hide) $(AAPT) package $(PRIVATE_AAPT_FLAGS) -m \ $(addprefix -G , $(PRIVATE_PROGUARD_OPTIONS_FILE)) \ $(addprefix --min-sdk-version , $(PRIVATE_DEFAULT_APP_TARGET_SDK)) \ $(addprefix --target-sdk-version , $(PRIVATE_DEFAULT_APP_TARGET_SDK)) \ - $(if $(filter --version-code,$(PRIVATE_AAPT_FLAGS)),,$(addprefix --version-code , $(PLATFORM_SDK_VERSION))) \ - $(if $(filter --version-name,$(PRIVATE_AAPT_FLAGS)),,$(addprefix --version-name , $(PLATFORM_VERSION)-$(BUILD_NUMBER))) \ + $(if $(filter --version-code,$(PRIVATE_AAPT_FLAGS)),,--version-code $(PLATFORM_SDK_VERSION)) \ + $(if $(filter --version-name,$(PRIVATE_AAPT_FLAGS)),,--version-name $(APPS_DEFAULT_VERSION_NAME)) \ $(addprefix --rename-manifest-package , $(PRIVATE_MANIFEST_PACKAGE_NAME)) \ - $(addprefix --rename-instrumentation-target-package , $(PRIVATE_MANIFEST_INSTRUMENTATION_FOR)) + $(addprefix --rename-instrumentation-target-package , $(PRIVATE_MANIFEST_INSTRUMENTATION_FOR)) \ + --skip-symbols-without-default-localization +endef + +# Search for generated R.java/Manifest.java, copy the found R.java as $@. +# Also copy them to a central 'R' directory to make it easier to add the files to an IDE. +define find-generated-R.java +$(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; +@# Ensure that the target file is always created, i.e. also in case we did not +@# enter the GENERATED_R_FILE-loop above. This avoids unnecessary rebuilding. +$(hide) touch $@ endef -ifeq ($(HOST_OS),windows) -xlint_unchecked := -else -xlint_unchecked := -Xlint:unchecked -endif +########################################################### +# AAPT2 compilation and link +########################################################### +define aapt2-compile-one-resource-file +@mkdir -p $(dir $@) +$(hide) $(AAPT2) compile -o $(dir $@) $(PRIVATE_AAPT2_CFLAGS) --legacy $< +endef -ifeq (true, $(ENABLE_INCREMENTALJAVAC)) -incremental_dex := --incremental -else -incremental_dex := -endif +define aapt2-compile-resource-dirs +@mkdir -p $(dir $@) +$(hide) $(AAPT2) compile -o $@ $(addprefix --dir ,$(PRIVATE_SOURCE_RES_DIRS)) \ + $(PRIVATE_AAPT2_CFLAGS) --legacy +endef + +# Set up rule to compile one resource file with aapt2. +# Must be called with $(eval). +# $(1): the source file +# $(2): the output file +define aapt2-compile-one-resource-file-rule +$(2) : $(1) $(AAPT2) + @echo "AAPT2 compile $$@ <- $$<" + $$(call aapt2-compile-one-resource-file) +endef + +# Convert input resource file path to output file path. +# values-[config]/.xml -> values-[config]_.arsc.flat; +# For other resource file, just replace the last "/" with "_" and +# add .flat extension. +# +# $(1): the input resource file path +# $(2): the base dir of the output file path +# Returns: the compiled output file path +define aapt2-compiled-resource-out-file +$(eval _p_w := $(strip $(subst /,$(space),$(dir $(1)))))$(2)/$(subst $(space),/,$(_p_w))_$(if $(filter values%,$(lastword $(_p_w))),$(patsubst %.xml,%.arsc,$(notdir $(1))),$(notdir $(1))).flat +endef + +define aapt2-link +@mkdir -p $(dir $@) +$(call dump-words-to-file,$(PRIVATE_RES_FLAT),$(dir $@)aapt2-flat-list) +$(hide) $(AAPT2) link -o $@ \ + $(PRIVATE_AAPT_FLAGS) \ + $(addprefix --manifest ,$(PRIVATE_ANDROID_MANIFEST)) \ + $(addprefix -I ,$(PRIVATE_AAPT_INCLUDES)) \ + $(addprefix -I ,$(PRIVATE_SHARED_ANDROID_LIBRARIES)) \ + $(addprefix --java ,$(PRIVATE_SOURCE_INTERMEDIATES_DIR)) \ + $(addprefix --proguard ,$(PRIVATE_PROGUARD_OPTIONS_FILE)) \ + $(addprefix --min-sdk-version ,$(PRIVATE_DEFAULT_APP_TARGET_SDK)) \ + $(addprefix --target-sdk-version ,$(PRIVATE_DEFAULT_APP_TARGET_SDK)) \ + $(if $(filter --product,$(PRIVATE_AAPT_FLAGS)),,$(addprefix --product ,$(PRIVATE_TARGET_AAPT_CHARACTERISTICS))) \ + $(addprefix -c ,$(PRIVATE_PRODUCT_AAPT_CONFIG)) \ + $(addprefix --preferred-density ,$(PRIVATE_PRODUCT_AAPT_PREF_CONFIG)) \ + $(if $(filter --version-code,$(PRIVATE_AAPT_FLAGS)),,--version-code $(PLATFORM_SDK_VERSION)) \ + $(if $(filter --version-name,$(PRIVATE_AAPT_FLAGS)),,--version-name $(APPS_DEFAULT_VERSION_NAME)) \ + $(addprefix --rename-manifest-package ,$(PRIVATE_MANIFEST_PACKAGE_NAME)) \ + $(addprefix --rename-instrumentation-target-package ,$(PRIVATE_MANIFEST_INSTRUMENTATION_FOR)) \ + $(addprefix -R , $(PRIVATE_OVERLAY_FLAT)) \ + \@$(dir $@)aapt2-flat-list +endef + +########################################################### +xlint_unchecked := -Xlint:unchecked # emit-line, , define emit-line @@ -1509,36 +1970,40 @@ endef # dump-words-to-file, , define dump-words-to-file @rm -f $(2) - @$(call emit-line,$(wordlist 1,200,$(1)),$(2)) - @$(call emit-line,$(wordlist 201,400,$(1)),$(2)) - @$(call emit-line,$(wordlist 401,600,$(1)),$(2)) - @$(call emit-line,$(wordlist 601,800,$(1)),$(2)) - @$(call emit-line,$(wordlist 801,1000,$(1)),$(2)) - @$(call emit-line,$(wordlist 1001,1200,$(1)),$(2)) - @$(call emit-line,$(wordlist 1201,1400,$(1)),$(2)) - @$(call emit-line,$(wordlist 1401,1600,$(1)),$(2)) - @$(call emit-line,$(wordlist 1601,1800,$(1)),$(2)) - @$(call emit-line,$(wordlist 1801,2000,$(1)),$(2)) - @$(call emit-line,$(wordlist 2001,2200,$(1)),$(2)) - @$(call emit-line,$(wordlist 2201,2400,$(1)),$(2)) - @$(call emit-line,$(wordlist 2401,2600,$(1)),$(2)) - @$(call emit-line,$(wordlist 2601,2800,$(1)),$(2)) - @$(call emit-line,$(wordlist 2801,3000,$(1)),$(2)) - @$(call emit-line,$(wordlist 3001,3200,$(1)),$(2)) - @$(call emit-line,$(wordlist 3201,3400,$(1)),$(2)) - @$(call emit-line,$(wordlist 3401,3600,$(1)),$(2)) - @$(call emit-line,$(wordlist 3601,3800,$(1)),$(2)) - @$(call emit-line,$(wordlist 3801,4000,$(1)),$(2)) - @$(call emit-line,$(wordlist 4001,4200,$(1)),$(2)) - @$(call emit-line,$(wordlist 4201,4400,$(1)),$(2)) - @$(call emit-line,$(wordlist 4401,4600,$(1)),$(2)) - @$(call emit-line,$(wordlist 4601,4800,$(1)),$(2)) - @$(call emit-line,$(wordlist 4801,5000,$(1)),$(2)) - @$(if $(wordlist 5001,5002,$(1)),$(error Too many words ($(words $(1))))) + @touch $(2) + @$(call emit-line,$(wordlist 1,500,$(1)),$(2)) + @$(call emit-line,$(wordlist 501,1000,$(1)),$(2)) + @$(call emit-line,$(wordlist 1001,1500,$(1)),$(2)) + @$(call emit-line,$(wordlist 1501,2000,$(1)),$(2)) + @$(call emit-line,$(wordlist 2001,2500,$(1)),$(2)) + @$(call emit-line,$(wordlist 2501,3000,$(1)),$(2)) + @$(call emit-line,$(wordlist 3001,3500,$(1)),$(2)) + @$(call emit-line,$(wordlist 3501,4000,$(1)),$(2)) + @$(call emit-line,$(wordlist 4001,4500,$(1)),$(2)) + @$(call emit-line,$(wordlist 4501,5000,$(1)),$(2)) + @$(call emit-line,$(wordlist 5001,5500,$(1)),$(2)) + @$(call emit-line,$(wordlist 5501,6000,$(1)),$(2)) + @$(call emit-line,$(wordlist 6001,6500,$(1)),$(2)) + @$(call emit-line,$(wordlist 6501,7000,$(1)),$(2)) + @$(call emit-line,$(wordlist 7001,7500,$(1)),$(2)) + @$(call emit-line,$(wordlist 7501,8000,$(1)),$(2)) + @$(call emit-line,$(wordlist 8001,8500,$(1)),$(2)) + @$(call emit-line,$(wordlist 8501,9000,$(1)),$(2)) + @$(call emit-line,$(wordlist 9001,9500,$(1)),$(2)) + @$(call emit-line,$(wordlist 9501,10000,$(1)),$(2)) + @$(call emit-line,$(wordlist 10001,10500,$(1)),$(2)) + @$(call emit-line,$(wordlist 10501,11000,$(1)),$(2)) + @$(call emit-line,$(wordlist 11001,11500,$(1)),$(2)) + @$(call emit-line,$(wordlist 11501,12000,$(1)),$(2)) + @$(call emit-line,$(wordlist 12001,12500,$(1)),$(2)) + @$(call emit-line,$(wordlist 12501,13000,$(1)),$(2)) + @$(call emit-line,$(wordlist 13001,13500,$(1)),$(2)) + @$(if $(wordlist 13501,13502,$(1)),$(error Too many words ($(words $(1))))) endef # For a list of jar files, unzip them to a specified directory, -# but make sure that no META-INF files come along for the ride. +# but make sure that no META-INF files come along for the ride, +# unless PRIVATE_DONT_DELETE_JAR_META_INF is set. # # $(1): files to unzip # $(2): destination directory @@ -1550,8 +2015,14 @@ define unzip-jar-files exit 1; \ fi; \ unzip -qo $$f -d $(2); \ - done \ - $(if $(PRIVATE_DONT_DELETE_JAR_META_INF),,;rm -rf $(2)/META-INF) + done + $(if $(PRIVATE_DONT_DELETE_JAR_META_INF),,$(hide) rm -rf $(2)/META-INF) +endef + +# Call jack +# +define call-jack + JACK_VERSION=$(PRIVATE_JACK_VERSION) $(JACK) $(DEFAULT_JACK_EXTRA_ARGS) endef # Common definition to invoke javac on the host and target. @@ -1572,13 +2043,12 @@ $(hide) mkdir -p $(PRIVATE_CLASS_INTERMEDIATES_DIR) $(call unzip-jar-files,$(PRIVATE_STATIC_JAVA_LIBRARIES),$(PRIVATE_CLASS_INTERMEDIATES_DIR)) $(call dump-words-to-file,$(PRIVATE_JAVA_SOURCES),$(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list) $(hide) if [ -d "$(PRIVATE_SOURCE_INTERMEDIATES_DIR)" ]; then \ - find $(PRIVATE_SOURCE_INTERMEDIATES_DIR) -name '*.java' >> $(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list; \ + find $(PRIVATE_SOURCE_INTERMEDIATES_DIR) -name '*.java' -and -not -name '.*' >> $(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list; \ fi $(hide) tr ' ' '\n' < $(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list \ - | sort -u > $(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list-uniq + | $(NORMALIZE_PATH) | sort -u > $(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list-uniq $(hide) if [ -s $(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list-uniq ] ; then \ $(1) -encoding UTF-8 \ - $(strip $(PRIVATE_JAVAC_DEBUG_FLAGS)) \ $(if $(findstring true,$(PRIVATE_WARNINGS_ENABLE)),$(xlint_unchecked),) \ $(2) \ $(addprefix -classpath ,$(strip \ @@ -1607,11 +2077,12 @@ $(if $(PRIVATE_JAR_EXCLUDE_PACKAGES), $(hide) rm -rf \ $(PRIVATE_CLASS_INTERMEDIATES_DIR)/$(subst .,/,$(pkg)))) $(if $(PRIVATE_RMTYPEDEFS), $(hide) $(RMTYPEDEFS) -v $(PRIVATE_CLASS_INTERMEDIATES_DIR)) $(if $(PRIVATE_JAR_MANIFEST), \ - $(hide) sed -e 's/%BUILD_NUMBER%/$(BUILD_NUMBER)/' \ + $(hide) sed -e "s/%BUILD_NUMBER%/$(BUILD_NUMBER_FROM_FILE)/" \ $(PRIVATE_JAR_MANIFEST) > $(dir $@)/manifest.mf && \ jar -cfm $@ $(dir $@)/manifest.mf \ -C $(PRIVATE_CLASS_INTERMEDIATES_DIR) ., \ $(hide) jar -cf $@ -C $(PRIVATE_CLASS_INTERMEDIATES_DIR) .) +$(if $(PRIVATE_EXTRA_JAR_ARGS),$(call add-java-resources-to,$@)) endef define transform-java-to-classes.jar @@ -1619,67 +2090,243 @@ define transform-java-to-classes.jar $(call compile-java,$(TARGET_JAVAC),$(PRIVATE_BOOTCLASSPATH)) endef -# Override the above definitions if we want to do incremetal javac -ifeq (true, $(ENABLE_INCREMENTALJAVAC)) -define compile-java +# Invoke Jack to compile java from source to dex and jack files. +# +# Some historical notes: +# - below we write the list of java files to java-source-list to avoid argument +# list length problems with Cygwin +# - we filter out duplicate java file names because Jack doesn't like them. +define jack-java-to-dex +$(hide) rm -f $@ +$(hide) rm -f $(PRIVATE_CLASSES_JACK) +$(hide) rm -rf $(PRIVATE_JACK_INTERMEDIATES_DIR) $(hide) mkdir -p $(dir $@) -$(hide) mkdir -p $(PRIVATE_CLASS_INTERMEDIATES_DIR) -$(hide) touch $(PRIVATE_CLASS_INTERMEDIATES_DIR)/newstamp -$(call unzip-jar-files,$(PRIVATE_STATIC_JAVA_LIBRARIES),$(PRIVATE_CLASS_INTERMEDIATES_DIR)) -$(hide) if [ -e $(PRIVATE_CLASS_INTERMEDIATES_DIR)/stamp ] ; then \ - newerFlag=$$(echo -n "-newer $(PRIVATE_CLASS_INTERMEDIATES_DIR)/stamp") ; \ - fi ; \ - find $(PRIVATE_JAVA_SOURCES) $$newerFlag > $(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list ; \ - if [ -d "$(PRIVATE_SOURCE_INTERMEDIATES_DIR)" ]; then \ - find $(PRIVATE_SOURCE_INTERMEDIATES_DIR) -name '*.java' $$newerFlag >> $(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list; \ - 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:" -@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 \ - $(strip $(PRIVATE_JAVAC_DEBUG_FLAGS)) \ - $(if $(findstring true,$(PRIVATE_WARNINGS_ENABLE)),$(xlint_unchecked),) \ - $(2) \ - $(addprefix -classpath ,$(strip \ - $(call normalize-path-list,$(PRIVATE_ALL_JAVA_LIBRARIES) $(PRIVATE_CLASS_INTERMEDIATES_DIR)))) \ - $(if $(findstring true,$(PRIVATE_WARNINGS_ENABLE)),$(xlint_unchecked),) \ - -extdirs "" -d $(PRIVATE_CLASS_INTERMEDIATES_DIR) \ - $(PRIVATE_JAVACFLAGS) \ - \@$(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list-uniq \ - || ( exit 41 ) \ +$(hide) mkdir -p $(dir $(PRIVATE_CLASSES_JACK)) +$(hide) mkdir -p $(PRIVATE_JACK_INTERMEDIATES_DIR) +$(if $(PRIVATE_JACK_INCREMENTAL_DIR),$(hide) mkdir -p $(PRIVATE_JACK_INCREMENTAL_DIR)) +$(call dump-words-to-file,$(PRIVATE_JAVA_SOURCES),$(PRIVATE_JACK_INTERMEDIATES_DIR)/java-source-list) +$(hide) if [ -d "$(PRIVATE_SOURCE_INTERMEDIATES_DIR)" ]; then \ + find $(PRIVATE_SOURCE_INTERMEDIATES_DIR) -name '*.java' >> $(PRIVATE_JACK_INTERMEDIATES_DIR)/java-source-list; \ fi -$(hide) rm -f $(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list -$(hide) rm -f $(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list-uniq +$(hide) tr ' ' '\n' < $(PRIVATE_JACK_INTERMEDIATES_DIR)/java-source-list \ + | $(NORMALIZE_PATH) | sort -u > $(PRIVATE_JACK_INTERMEDIATES_DIR)/java-source-list-uniq +$(if $(PRIVATE_JACK_PROGUARD_FLAGS), \ + $(hide) echo -basedirectory $(CURDIR) > $@.flags; \ + echo $(PRIVATE_JACK_PROGUARD_FLAGS) >> $@.flags; \ +) +$(if $(PRIVATE_EXTRA_JAR_ARGS), + $(hide) mkdir -p $@.res.tmp + $(hide) $(call create-empty-package-at,$@.res.tmp.zip) + $(hide) $(call add-java-resources-to,$@.res.tmp.zip) + $(hide) unzip -qo $@.res.tmp.zip -d $@.res.tmp + $(hide) rm $@.res.tmp.zip) +$(hide) if [ -s $(PRIVATE_JACK_INTERMEDIATES_DIR)/java-source-list-uniq ] ; then \ + export tmpEcjArg="@$(PRIVATE_JACK_INTERMEDIATES_DIR)/java-source-list-uniq"; \ +else \ + export tmpEcjArg=""; \ +fi; \ +$(call call-jack) \ + $(strip $(PRIVATE_JACK_FLAGS)) \ + $(strip $(PRIVATE_JACK_COVERAGE_OPTIONS)) \ + $(if $(NO_OPTIMIZE_DX), \ + -D jack.dex.optimize="false") \ + $(if $(PRIVATE_RMTYPEDEFS), \ + -D jack.android.remove-typedef="true") \ + $(addprefix --classpath ,$(strip \ + $(call normalize-path-list,$(PRIVATE_BOOTCLASSPATH_JAVA_LIBRARIES) $(PRIVATE_ALL_JACK_LIBRARIES)))) \ + $(addprefix --import ,$(call reverse-list,$(PRIVATE_STATIC_JACK_LIBRARIES))) \ + $(if $(PRIVATE_EXTRA_JAR_ARGS),--import-resource $@.res.tmp) \ + -D jack.android.min-api-level=$(PRIVATE_JACK_MIN_SDK_VERSION) \ + -D jack.import.resource.policy=keep-first \ + -D jack.import.type.policy=keep-first \ + --output-jack $(PRIVATE_CLASSES_JACK) \ + $(if $(PRIVATE_JACK_INCREMENTAL_DIR),--incremental-folder $(PRIVATE_JACK_INCREMENTAL_DIR)) \ + --output-dex $(PRIVATE_JACK_INTERMEDIATES_DIR) \ + $(addprefix --config-jarjar ,$(strip $(PRIVATE_JARJAR_RULES))) \ + $(if $(PRIVATE_JACK_PROGUARD_FLAGS),--config-proguard $@.flags) \ + $$tmpEcjArg \ + || ( rm -rf $(PRIVATE_CLASSES_JACK); exit 41 ) +$(hide) mv $(PRIVATE_JACK_INTERMEDIATES_DIR)/classes*.dex $(dir $@) +$(hide) rm -f $(PRIVATE_JACK_INTERMEDIATES_DIR)/java-source-list +$(if $(PRIVATE_EXTRA_JAR_ARGS),$(hide) rm -rf $@.res.tmp) +$(hide) mv $(PRIVATE_JACK_INTERMEDIATES_DIR)/java-source-list-uniq $(PRIVATE_JACK_INTERMEDIATES_DIR).java-source-list +$(if $(PRIVATE_JAR_PACKAGES), $(hide) echo unsupported options PRIVATE_JAR_PACKAGES in $@; exit 53) +$(if $(PRIVATE_JAR_EXCLUDE_PACKAGES), $(hide) echo unsupported options JAR_EXCLUDE_PACKAGES in $@; exit 53) +$(if $(PRIVATE_JAR_MANIFEST), $(hide) echo unsupported options JAR_MANIFEST in $@; exit 53) +endef + +# Invoke Jack to compile java source just to check it compiles correctly. +# +# Some historical notes: +# - below we write the list of java files to java-source-list to avoid argument +# list length problems with Cygwin +# - we filter out duplicate java file names because Jack doesn't like them. +define jack-check-java $(hide) rm -f $@ -$(if $(PRIVATE_JAR_EXCLUDE_FILES), $(hide) find $(PRIVATE_CLASS_INTERMEDIATES_DIR) \ - -name $(word 1, $(PRIVATE_JAR_EXCLUDE_FILES)) \ - $(addprefix -o -name , $(wordlist 2, 999, $(PRIVATE_JAR_EXCLUDE_FILES))) \ - | xargs rm -rf) -$(if $(PRIVATE_JAR_PACKAGES), \ - $(hide) find $(PRIVATE_CLASS_INTERMEDIATES_DIR) -mindepth 1 -type f \ - $(foreach pkg, $(PRIVATE_JAR_PACKAGES), \ - -not -path $(PRIVATE_CLASS_INTERMEDIATES_DIR)/$(subst .,/,$(pkg))/\*) -delete ; \ - find $(PRIVATE_CLASS_INTERMEDIATES_DIR) -empty -delete) -$(if $(PRIVATE_JAR_EXCLUDE_PACKAGES), $(hide) rm -rf \ - $(foreach pkg, $(PRIVATE_JAR_EXCLUDE_PACKAGES), \ - $(PRIVATE_CLASS_INTERMEDIATES_DIR)/$(subst .,/,$(pkg)))) -$(if $(PRIVATE_RMTYPEDEFS), $(hide) $(RMTYPEDEFS) -v $(PRIVATE_CLASS_INTERMEDIATES_DIR)) -$(if $(PRIVATE_JAR_MANIFEST), \ - $(hide) sed -e 's/%BUILD_NUMBER%/$(BUILD_NUMBER)/' \ - $(PRIVATE_JAR_MANIFEST) > $(dir $@)/manifest.mf && \ - jar -cfm $@ $(dir $@)/manifest.mf \ - -C $(PRIVATE_CLASS_INTERMEDIATES_DIR) ., \ - $(hide) jar -cf $@ -C $(PRIVATE_CLASS_INTERMEDIATES_DIR) .) -$(hide) mv $(PRIVATE_CLASS_INTERMEDIATES_DIR)/newstamp $(PRIVATE_CLASS_INTERMEDIATES_DIR)/stamp +$(hide) rm -f $@.java-source-list +$(hide) rm -f $@.java-source-list-uniq +$(hide) mkdir -p $(dir $@) +$(if $(PRIVATE_JACK_INCREMENTAL_DIR),$(hide) mkdir -p $(PRIVATE_JACK_INCREMENTAL_DIR)) +$(call dump-words-to-file,$(PRIVATE_JAVA_SOURCES),$@.java-source-list) +$(hide) if [ -d "$(PRIVATE_SOURCE_INTERMEDIATES_DIR)" ]; then \ + find $(PRIVATE_SOURCE_INTERMEDIATES_DIR) -name '*.java' >> $@.java-source-list; \ +fi +$(hide) tr ' ' '\n' < $@.java-source-list \ + | sort -u > $@.java-source-list-uniq +$(hide) if [ -s $@.java-source-list-uniq ] ; then \ + $(call call-jack,$(PRIVATE_JACK_EXTRA_ARGS)) \ + $(strip $(PRIVATE_JACK_FLAGS)) \ + $(strip $(PRIVATE_JACK_DEBUG_FLAGS)) \ + $(addprefix --classpath ,$(strip \ + $(call normalize-path-list,$(call reverse-list,$(PRIVATE_STATIC_JACK_LIBRARIES)) $(PRIVATE_BOOTCLASSPATH_JAVA_LIBRARIES) $(PRIVATE_ALL_JACK_LIBRARIES)))) \ + -D jack.import.resource.policy=keep-first \ + -D jack.android.min-api-level=$(PRIVATE_JACK_MIN_SDK_VERSION) \ + -D jack.import.type.policy=keep-first \ + $(if $(PRIVATE_JACK_INCREMENTAL_DIR),--incremental-folder $(PRIVATE_JACK_INCREMENTAL_DIR)) \ + @$@.java-source-list-uniq; \ +fi +touch $@ +endef + +define transform-jar-to-jack + $(hide) mkdir -p $(dir $@) + $(hide) mkdir -p $@.tmpjill.res + $(hide) unzip -qo $< -d $@.tmpjill.res + $(hide) find $@.tmpjill.res -iname "*.class" -delete + $(hide) $(call call-jack) \ + $(PRIVATE_JACK_FLAGS) \ + -D jack.import.resource.policy=keep-first \ + -D jack.import.type.policy=keep-first \ + -D jack.android.min-api-level=$(PRIVATE_JACK_MIN_SDK_VERSION) \ + --import $< \ + --import-resource $@.tmpjill.res \ + --output-jack $@ + $(hide) rm -rf $@.tmpjill.res +endef + +# Moves $1.tmp to $1 if necessary. This is designed to be used with +# .KATI_RESTAT. For kati, this function doesn't update the timestamp +# of $1 when $1.tmp is identical to $1 so that ninja won't rebuild +# targets which depend on $1. For GNU make, this function simply +# copies $1.tmp to $1. +ifeq ($(BUILDING_WITH_NINJA),true) +define commit-change-for-toc +$(hide) if cmp -s $1.tmp $1 ; then \ + rm $1.tmp ; \ +else \ + mv $1.tmp $1 ; \ +fi +endef +else +define commit-change-for-toc +@# make doesn't support restat. We always update .toc files so the dependents will always be updated too. +$(hide) mv $1.tmp $1 endef +endif -define transform-java-to-classes.jar -@echo "target Java: $(PRIVATE_MODULE) ($(PRIVATE_CLASS_INTERMEDIATES_DIR))" -$(call compile-java,$(TARGET_JAVAC),$(PRIVATE_BOOTCLASSPATH)) +## Rule to create a table of contents from a .jar file. +## Must be called with $(eval). +# $(1): A .jar file +define _transform-jar-to-toc +$1.toc: $1 | $(IJAR) + @echo Generating TOC: $$@ + $(hide) $(IJAR) $$< $$@.tmp + $$(call commit-change-for-toc,$$@) +endef + +## Define a rule which generates .jar.toc and mark it as .KATI_RESTAT. +# $(1): A .jar file +define define-jar-to-toc-rule +$(eval $(call _transform-jar-to-toc,$1))\ +$(eval .KATI_RESTAT: $1.toc) +endef + +ifeq (,$(TARGET_BUILD_APPS)) + +## Rule to create a table of contents from a .dex file. +## Must be called with $(eval). +# $(1): The directory which contains classes*.dex files +define _transform-dex-to-toc +$1/classes.dex.toc: PRIVATE_INPUT_DEX_FILES := $1/classes*.dex +$1/classes.dex.toc: $1/classes.dex $(DEXDUMP) + @echo Generating TOC: $$@ + $(hide) $(DEXDUMP) -l xml $$(PRIVATE_INPUT_DEX_FILES) > $$@.tmp + $$(call commit-change-for-toc,$$@) +endef + +## Define a rule which generates .dex.toc and mark it as .KATI_RESTAT. +# $(1): The directory which contains classes*.dex files +define define-dex-to-toc-rule +$(eval $(call _transform-dex-to-toc,$1))\ +$(eval .KATI_RESTAT: $1/classes.dex.toc) +endef + +else + +# Turn off .toc optimization for apps build as we cannot build dexdump. +define define-dex-to-toc-rule +endef + +endif # TARGET_BUILD_APPS + + +# Invoke Jack to compile java from source to jack files without shrink or obfuscation. +# +# Some historical notes: +# - below we write the list of java files to java-source-list to avoid argument +# list length problems with Cygwin +# - we filter out duplicate java file names because Jack doesn't like them. +define java-to-jack +$(hide) rm -f $@ +$(hide) rm -rf $(PRIVATE_JACK_INTERMEDIATES_DIR) +$(hide) mkdir -p $(dir $@) +$(hide) mkdir -p $(PRIVATE_JACK_INTERMEDIATES_DIR) +$(if $(PRIVATE_JACK_INCREMENTAL_DIR),$(hide) mkdir -p $(PRIVATE_JACK_INCREMENTAL_DIR)) +$(call dump-words-to-file,$(PRIVATE_JAVA_SOURCES),$(PRIVATE_JACK_INTERMEDIATES_DIR)/java-source-list) +$(hide) if [ -d "$(PRIVATE_SOURCE_INTERMEDIATES_DIR)" ]; then \ + find $(PRIVATE_SOURCE_INTERMEDIATES_DIR) -name '*.java' >> $(PRIVATE_JACK_INTERMEDIATES_DIR)/java-source-list; \ +fi +$(hide) tr ' ' '\n' < $(PRIVATE_JACK_INTERMEDIATES_DIR)/java-source-list \ + | $(NORMALIZE_PATH) | sort -u > $(PRIVATE_JACK_INTERMEDIATES_DIR)/java-source-list-uniq +$(if $(PRIVATE_JACK_PROGUARD_FLAGS), \ + $(hide) echo -basedirectory $(CURDIR) > $@.flags; \ + echo $(PRIVATE_JACK_PROGUARD_FLAGS) >> $@.flags; \ +) +$(if $(PRIVATE_EXTRA_JAR_ARGS), + $(hide) mkdir -p $@.res.tmp + $(hide) $(call create-empty-package-at,$@.res.tmp.zip) + $(hide) $(call add-java-resources-to,$@.res.tmp.zip) + $(hide) unzip -qo $@.res.tmp.zip -d $@.res.tmp + $(hide) rm $@.res.tmp.zip) +$(hide) if [ -s $(PRIVATE_JACK_INTERMEDIATES_DIR)/java-source-list-uniq ] ; then \ + export tmpEcjArg="@$(PRIVATE_JACK_INTERMEDIATES_DIR)/java-source-list-uniq"; \ +else \ + export tmpEcjArg=""; \ +fi; \ +$(call call-jack) \ + $(strip $(PRIVATE_JACK_FLAGS)) \ + $(if $(NO_OPTIMIZE_DX), \ + -D jack.dex.optimize="false") \ + $(addprefix --classpath ,$(strip \ + $(call normalize-path-list,$(PRIVATE_BOOTCLASSPATH_JAVA_LIBRARIES) $(PRIVATE_ALL_JACK_LIBRARIES)))) \ + $(addprefix --import ,$(call reverse-list,$(PRIVATE_STATIC_JACK_LIBRARIES))) \ + $(if $(PRIVATE_EXTRA_JAR_ARGS),--import-resource $@.res.tmp) \ + -D jack.import.resource.policy=keep-first \ + -D jack.import.type.policy=keep-first \ + -D jack.android.min-api-level=$(PRIVATE_JACK_MIN_SDK_VERSION) \ + $(if $(PRIVATE_JACK_INCREMENTAL_DIR),--incremental-folder $(PRIVATE_JACK_INCREMENTAL_DIR)) \ + --output-jack $@ \ + $(addprefix --config-jarjar ,$(strip $(PRIVATE_JARJAR_RULES))) \ + $(if $(PRIVATE_JACK_PROGUARD_FLAGS),--config-proguard $@.flags) \ + $$tmpEcjArg \ + || ( rm -f $@ ; exit 41 ) +$(hide) rm -f $(PRIVATE_JACK_INTERMEDIATES_DIR)/java-source-list +$(if $(PRIVATE_EXTRA_JAR_ARGS),$(hide) rm -rf $@.res.tmp) +$(hide) mv $(PRIVATE_JACK_INTERMEDIATES_DIR)/java-source-list-uniq $(PRIVATE_JACK_INTERMEDIATES_DIR).java-source-list +$(if $(PRIVATE_JAR_PACKAGES), $(hide) echo unsupported options PRIVATE_JAR_PACKAGES in $@; exit 53) +$(if $(PRIVATE_JAR_EXCLUDE_PACKAGES), $(hide) echo unsupported options JAR_EXCLUDE_PACKAGES in $@; exit 53) +$(if $(PRIVATE_JAR_MANIFEST), $(hide) echo unsupported options JAR_MANIFEST in $@; exit 53) endef -endif # ENABLE_INCREMENTALJAVAC define transform-classes.jar-to-emma $(hide) java -classpath $(EMMA_JAR) emma instr -outmode fullcopy -outfile \ @@ -1687,36 +2334,34 @@ $(hide) java -classpath $(EMMA_JAR) emma instr -outmode fullcopy -outfile \ $(addprefix -ix , $(PRIVATE_EMMA_COVERAGE_FILTER)) endef -#TODO: use a smaller -Xmx value for most libraries; -# 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)" -@mkdir -p $(dir $@) -$(hide) rm -f $(dir $@)classes*.dex -$(hide) $(DX) \ - $(if $(findstring windows,$(HOST_OS)),,-JXms16M -JXmx2048M) \ - --dex --output=$(dir $@) \ - $(incremental_dex) \ - $(if $(NO_OPTIMIZE_DX), \ - --no-optimize) \ - $(if $(GENERATE_DEX_DEBUG), \ - --debug --verbose \ - --dump-to=$(@:.dex=.lst) \ - --dump-width=1000) \ - $(PRIVATE_DX_FLAGS) \ - $< +# Create a mostly-empty .jar file that we'll add to later. +# The MacOS jar tool doesn't like creating empty jar files, +# so we need to give it something. +# $(1) package to create +define create-empty-package-at +@mkdir -p $(dir $(1)) +$(hide) touch $(dir $(1))zipdummy +$(hide) (cd $(dir $(1)) && jar cf $(notdir $(1)) zipdummy) +$(hide) zip -qd $(1) zipdummy +$(hide) rm $(dir $(1))zipdummy endef # Create a mostly-empty .jar file that we'll add to later. # The MacOS jar tool doesn't like creating empty jar files, # so we need to give it something. define create-empty-package -@mkdir -p $(dir $@) -$(hide) touch $(dir $@)dummy -$(hide) (cd $(dir $@) && jar cf $(notdir $@) dummy) -$(hide) zip -qd $@ dummy -$(hide) rm $(dir $@)dummy +$(call create-empty-package-at,$@) +endef + +# Copy an arhchive file and delete any class files and empty folders inside. +# $(1): the source archive file. +# $(2): the destination archive file. +define initialize-package-file +@mkdir -p $(dir $(2)) +$(hide) cp -f $(1) $(2) +$(hide) zip -qd $(2) "*.class" \ + $(if $(strip $(PRIVATE_DONT_DELETE_JAR_DIRS)),,"*/") \ + || true # Ignore the error when nothing to delete. endef #TODO: we kinda want to build different asset packages for @@ -1738,11 +2383,12 @@ $(hide) $(AAPT) package -u $(PRIVATE_AAPT_FLAGS) \ $(addprefix -I , $(PRIVATE_AAPT_INCLUDES)) \ $(addprefix --min-sdk-version , $(PRIVATE_DEFAULT_APP_TARGET_SDK)) \ $(addprefix --target-sdk-version , $(PRIVATE_DEFAULT_APP_TARGET_SDK)) \ - $(if $(filter --product,$(PRIVATE_AAPT_FLAGS)),,$(addprefix --product , $(TARGET_AAPT_CHARACTERISTICS))) \ - $(if $(filter --version-code,$(PRIVATE_AAPT_FLAGS)),,$(addprefix --version-code , $(PLATFORM_SDK_VERSION))) \ - $(if $(filter --version-name,$(PRIVATE_AAPT_FLAGS)),,$(addprefix --version-name , $(PLATFORM_VERSION)-$(BUILD_NUMBER))) \ + $(if $(filter --product,$(PRIVATE_AAPT_FLAGS)),,$(addprefix --product , $(PRIVATE_TARGET_AAPT_CHARACTERISTICS))) \ + $(if $(filter --version-code,$(PRIVATE_AAPT_FLAGS)),,--version-code $(PLATFORM_SDK_VERSION)) \ + $(if $(filter --version-name,$(PRIVATE_AAPT_FLAGS)),,--version-name $(APPS_DEFAULT_VERSION_NAME)) \ $(addprefix --rename-manifest-package , $(PRIVATE_MANIFEST_PACKAGE_NAME)) \ $(addprefix --rename-instrumentation-target-package , $(PRIVATE_MANIFEST_INSTRUMENTATION_FOR)) \ + --skip-symbols-without-default-localization \ -F $@ endef @@ -1754,59 +2400,121 @@ $(hide) cp $(2) $(dir $@)lib/$(1) endef +# For apps_only build, don't uncompress/page-align the jni libraries, +# because the apk may be run on older platforms that don't support loading jni directly from apk. +ifdef TARGET_BUILD_APPS +JNI_COMPRESS_FLAGS := +ZIPALIGN_PAGE_ALIGN_FLAGS := +else +JNI_COMPRESS_FLAGS := -0 +ZIPALIGN_PAGE_ALIGN_FLAGS := -p +endif + define add-jni-shared-libs-to-package $(hide) rm -rf $(dir $@)lib $(hide) mkdir -p $(addprefix $(dir $@)lib/,$(PRIVATE_JNI_SHARED_LIBRARIES_ABI)) $(foreach abi,$(PRIVATE_JNI_SHARED_LIBRARIES_ABI),\ $(call _add-jni-shared-libs-to-package-per-abi,$(abi),\ $(patsubst $(abi):%,%,$(filter $(abi):%,$(PRIVATE_JNI_SHARED_LIBRARIES))))) -$(hide) (cd $(dir $@) && zip -r $(notdir $@) lib) +$(hide) (cd $(dir $@) && zip -qrX $(JNI_COMPRESS_FLAGS) $(notdir $@) lib) $(hide) rm -rf $(dir $@)lib endef #TODO: update the manifest to point to the dex file define add-dex-to-package -$(hide) zip -qj $@ $(dir $(PRIVATE_DEX_FILE))classes*.dex +$(call add-dex-to-package-arg,$@) +endef + +# $(1): the package file. +define add-dex-to-package-arg +$(hide) find $(dir $(PRIVATE_DEX_FILE)) -maxdepth 1 -name "classes*.dex" | sort | xargs zip -qjX $(1) endef # Add java resources added by the current module. +# $(1) destination package # -define add-java-resources-to-package -$(call dump-words-to-file, $(PRIVATE_EXTRA_JAR_ARGS), $(dir $@)jar-arg-list) -$(hide) jar uf $@ @$(dir $@)jar-arg-list -@rm -f $(dir $@)jar-arg-list +define add-java-resources-to +$(call dump-words-to-file, $(PRIVATE_EXTRA_JAR_ARGS), $(1).jar-arg-list) +$(hide) jar uf $(1) @$(1).jar-arg-list +@rm -f $(1).jar-arg-list endef -# Add java resources carried by static Java libraries. +# Add resources carried by static Jack libraries. # -define add-carried-java-resources -$(hide) if [ -d $(PRIVATE_CLASS_INTERMEDIATES_DIR) ] ; then \ - java_res_jar_flags=$$(find $(PRIVATE_CLASS_INTERMEDIATES_DIR) -type f -a -not -name "*.class" \ - | sed -e "s?^$(PRIVATE_CLASS_INTERMEDIATES_DIR)/? -C $(PRIVATE_CLASS_INTERMEDIATES_DIR) ?"); \ - if [ -n "$$java_res_jar_flags" ] ; then \ - echo $$java_res_jar_flags >$(dir $@)java_res_jar_flags; \ - jar uf $@ $$java_res_jar_flags; \ +define add-carried-jack-resources + $(hide) if [ -d $(PRIVATE_JACK_INTERMEDIATES_DIR) ] ; then \ + find $(PRIVATE_JACK_INTERMEDIATES_DIR) -type f | sort \ + | sed -e "s?^$(PRIVATE_JACK_INTERMEDIATES_DIR)/? -C \"$(PRIVATE_JACK_INTERMEDIATES_DIR)\" \"?" -e "s/$$/\"/" \ + > $(dir $@)jack_res_jar_flags; \ + if [ -s $(dir $@)jack_res_jar_flags ] ; then \ + jar uf $@ @$(dir $@)jack_res_jar_flags; \ fi; \ fi endef +# Returns the minSdkVersion of the specified APK as a decimal number. If the +# version is a codename, returns the current platform SDK version (always a +# decimal number) instead. If the APK does not specify a minSdkVersion, returns +# 0 to match how the Android platform interprets this situation at runtime. +# +# This currently substitutes any version which contains characters other than +# digits with the current platform's API Level number. This is because I +# couldn't figure out an easy way to perform the substitution only for the +# version codes listed in PLATFORM_VERSION_ALL_CODENAMES. +define get-package-min-sdk-version-int +$$(($(AAPT) dump badging $(1) 2>&1 | grep '^sdkVersion' || echo "sdkVersion:'0'") \ + | cut -d"'" -f2 | \ + sed -e s/^.*[^0-9].*$$/$(PLATFORM_SDK_VERSION)/) +endef + # Sign a package using the specified key/cert. # define sign-package -$(hide) mv $@ $@.unsigned -$(hide) java -jar $(SIGNAPK_JAR) \ +$(call sign-package-arg,$@) +endef + +# $(1): the package file we are signing. +define sign-package-arg +$(hide) mv $(1) $(1).unsigned +$(hide) java -Djava.library.path=$(SIGNAPK_JNI_LIBRARY_PATH) -jar $(SIGNAPK_JAR) \ + --min-sdk-version $(call get-package-min-sdk-version-int,$@.unsigned) \ $(PRIVATE_CERTIFICATE) $(PRIVATE_PRIVATE_KEY) \ - $(PRIVATE_ADDITIONAL_CERTIFICATES) $@.unsigned $@.signed -$(hide) mv $@.signed $@ + $(PRIVATE_ADDITIONAL_CERTIFICATES) $(1).unsigned $(1).signed +$(hide) mv $(1).signed $(1) endef -# Align STORED entries of a package on 4-byte boundaries -# to make them easier to mmap. +# Align STORED entries of a package on 4-byte boundaries to make them easier to mmap. # define align-package -$(hide) mv $@ $@.unaligned -$(hide) $(ZIPALIGN) -f 4 $@.unaligned $@.aligned -$(hide) mv $@.aligned $@ +$(hide) if ! $(ZIPALIGN) -c $(ZIPALIGN_PAGE_ALIGN_FLAGS) 4 $@ >/dev/null ; then \ + mv $@ $@.unaligned; \ + $(ZIPALIGN) \ + -f \ + $(ZIPALIGN_PAGE_ALIGN_FLAGS) \ + 4 \ + $@.unaligned $@.aligned; \ + mv $@.aligned $@; \ + fi +endef + +# Remove dynamic timestamps from packages +# +ifndef TARGET_BUILD_APPS +define remove-timestamps-from-package +$(hide) $(ZIPTIME) $@ +endef +endif + +# Uncompress shared libraries embedded in an apk. +# +define uncompress-shared-libs +$(hide) if (zipinfo $@ $(PRIVATE_EMBEDDED_JNI_LIBS) 2>/dev/null | grep -v ' stor ' >/dev/null) ; then \ + rm -rf $(dir $@)uncompressedlibs && mkdir $(dir $@)uncompressedlibs; \ + unzip $@ $(PRIVATE_EMBEDDED_JNI_LIBS) -d $(dir $@)uncompressedlibs && \ + zip -d $@ 'lib/*.so' && \ + ( cd $(dir $@)uncompressedlibs && find lib -type f | sort | zip -D -X -0 ../$(notdir $@) -@ ) && \ + rm -rf $(dir $@)uncompressedlibs; \ + fi endef define install-dex-debug @@ -1829,9 +2537,8 @@ 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 "$($(PRIVATE_PREFIX)DISPLAY) Java: $(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 ########################################################### @@ -1947,31 +2654,16 @@ define transform-prebuilt-to-target-strip-comments $(copy-file-to-target-strip-comments) endef -########################################################### -## On some platforms (MacOS), after copying a static -## library, ranlib must be run to update an internal -## timestamp!?!?! -########################################################### - -ifeq ($(HOST_RUN_RANLIB_AFTER_COPYING),true) -define transform-host-ranlib-copy-hack - $(hide) ranlib $@ || true +# Copy a list of files/directories to target location, with sub dir structure preserved. +# For example $(HOST_OUT_EXECUTABLES)/aapt -> $(staging)/bin/aapt . +# $(1): the source list of files/directories. +# $(2): the path prefix to strip. In the above example it would be $(HOST_OUT). +# $(3): the target location. +define copy-files-with-structure +$(foreach t,$(1),\ + $(eval s := $(patsubst $(2)%,%,$(t)))\ + $(hide) mkdir -p $(dir $(3)/$(s)); cp -Rf $(t) $(3)/$(s)$(newline)) endef -else -define transform-host-ranlib-copy-hack -@true -endef -endif - -ifeq ($(TARGET_RUN_RANLIB_AFTER_COPYING),true) -define transform-ranlib-copy-hack - $(hide) ranlib $@ -endef -else -define transform-ranlib-copy-hack -@true -endef -endif ########################################################### @@ -2192,12 +2884,13 @@ $(if $(call if-build-from-source,$(2),$(3)),$(eval include $(1))) endef # Return the arch for the source file of a prebuilt -# Return "none" if no matching arch found, so the result can be passed to +# Return "none" if no matching arch found and return empty +# if the input is empty, so the result can be passed to # LOCAL_MODULE_TARGET_ARCH. # $(1) the list of archs supported by the prebuilt define get-prebuilt-src-arch $(strip $(if $(filter $(TARGET_ARCH),$(1)),$(TARGET_ARCH),\ - $(if $(filter $(TARGET_2ND_ARCH),$(1)),$(TARGET_2ND_ARCH),none))) + $(if $(filter $(TARGET_2ND_ARCH),$(1)),$(TARGET_2ND_ARCH),$(if $(1),none)))) endef ########################################################### @@ -2211,6 +2904,8 @@ 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 +-include $(TOPDIR)product/*/build/core/definitions.mk # broken: # $(foreach file,$^,$(if $(findstring,.a,$(suffix $file)),-l$(file),$(file))) diff --git a/core/dex_preopt.mk b/core/dex_preopt.mk index 8a19b669f..1150350f0 100644 --- a/core/dex_preopt.mk +++ b/core/dex_preopt.mk @@ -3,8 +3,6 @@ # #################################### -ifneq ($(DALVIK_VM_LIB),) - # list of boot classpath jars for dexpreopt DEXPREOPT_BOOT_JARS := $(subst $(space),:,$(PRODUCT_BOOT_JARS)) DEXPREOPT_BOOT_JARS_MODULES := $(PRODUCT_BOOT_JARS) @@ -18,6 +16,35 @@ DEXPREOPT_PRODUCT_DIR := $(patsubst $(DEXPREOPT_BUILD_DIR)/%,%,$(DEXPREOPT_PRODU DEXPREOPT_BOOT_JAR_DIR := system/framework DEXPREOPT_BOOT_JAR_DIR_FULL_PATH := $(DEXPREOPT_PRODUCT_DIR_FULL_PATH)/$(DEXPREOPT_BOOT_JAR_DIR) +# The default value for LOCAL_DEX_PREOPT +DEX_PREOPT_DEFAULT ?= true + +# The default filter for which files go into the system_other image (if it is +# being used). To bundle everything one should set this to '%' +SYSTEM_OTHER_ODEX_FILTER ?= app/% priv-app/% + +# The default values for pre-opting: always preopt PIC. +# Conditional to building on linux, as dex2oat currently does not work on darwin. +#ifeq ($(HOST_OS),linux) +# WITH_DEXPREOPT_PIC ?= true +# WITH_DEXPREOPT ?= true +# For an eng build only pre-opt the boot image. This gives reasonable performance and still +# allows a simple workflow: building in frameworks/base and syncing. +# ifeq (eng,$(TARGET_BUILD_VARIANT)) +# WITH_DEXPREOPT_BOOT_IMG_ONLY ?= true +# endif +# Add mini-debug-info to the boot classpath unless explicitly asked not to. +# ifneq (false,$(WITH_DEXPREOPT_DEBUG_INFO)) +# PRODUCT_DEX_PREOPT_BOOT_FLAGS += --generate-mini-debug-info +# endif +#endif + +GLOBAL_DEXPREOPT_FLAGS := +ifeq ($(WITH_DEXPREOPT_PIC),true) +# Compile boot.oat as position-independent code if WITH_DEXPREOPT_PIC=true +GLOBAL_DEXPREOPT_FLAGS += --compile-pic +endif + # $(1): the .jar or .apk to remove classes.dex define dexpreopt-remove-classes.dex $(hide) zip --quiet --delete $(1) classes.dex; \ @@ -34,7 +61,7 @@ define _dexpreopt-boot-jar-remove-classes.dex _dbj_jar_no_dex := $(DEXPREOPT_BOOT_JAR_DIR_FULL_PATH)/$(1)_nodex.jar _dbj_src_jar := $(call intermediates-dir-for,JAVA_LIBRARIES,$(1),,COMMON)/javalib.jar -$$(_dbj_jar_no_dex) : $$(_dbj_src_jar) | $(ACP) $(AAPT) +$$(_dbj_jar_no_dex) : $$(_dbj_src_jar) | $(ACP) $$(call copy-file-to-target) ifneq ($(DEX_PREOPT_DEFAULT),nostripping) $$(call dexpreopt-remove-classes.dex,$$@) @@ -46,36 +73,17 @@ endef $(foreach b,$(DEXPREOPT_BOOT_JARS_MODULES),$(eval $(call _dexpreopt-boot-jar-remove-classes.dex,$(b)))) -# Conditionally include Dalvik support. -ifeq ($(DALVIK_VM_LIB),libdvm.so) -include $(BUILD_SYSTEM)/dex_preopt_libdvm.mk -endif - -# Unconditionally include ART support because its used run dex2oat on the host for tests. include $(BUILD_SYSTEM)/dex_preopt_libart.mk # Define dexpreopt-one-file based on current default runtime. # $(1): the input .jar or .apk file # $(2): the output .odex file -ifeq ($(DALVIK_VM_LIB),libdvm.so) -define dexpreopt-one-file -$(call dexopt-one-file,$(1),$(2)) -endef - -DEXPREOPT_ONE_FILE_DEPENDENCY_TOOLS := $(DEXOPT_DEPENDENCY) -DEXPREOPT_ONE_FILE_DEPENDENCY_BUILT_BOOT_PREOPT := $(DEXPREOPT_BOOT_ODEXS) -else define dexpreopt-one-file $(call dex2oat-one-file,$(1),$(2)) endef -DEXPREOPT_ONE_FILE_DEPENDENCY_TOOLS := $(DEX2OATD_DEPENDENCY) +DEXPREOPT_ONE_FILE_DEPENDENCY_TOOLS := $(DEX2OAT_DEPENDENCY) DEXPREOPT_ONE_FILE_DEPENDENCY_BUILT_BOOT_PREOPT := $(DEFAULT_DEX_PREOPT_BUILT_IMAGE_FILENAME) ifdef TARGET_2ND_ARCH $(TARGET_2ND_ARCH_VAR_PREFIX)DEXPREOPT_ONE_FILE_DEPENDENCY_BUILT_BOOT_PREOPT := $($(TARGET_2ND_ARCH_VAR_PREFIX)DEFAULT_DEX_PREOPT_BUILT_IMAGE_FILENAME) endif # TARGET_2ND_ARCH -endif # DALVIK_VM_LIB -else -$(warning No DALVIK_VM_LIB, disable dexpreopt.) -WITH_DEXPREOPT := false -endif # DALVIK_VM_LIB is defined. diff --git a/core/dex_preopt_libart.mk b/core/dex_preopt_libart.mk index cfbf2218f..1275e4861 100644 --- a/core/dex_preopt_libart.mk +++ b/core/dex_preopt_libart.mk @@ -3,18 +3,19 @@ # #################################### +# Default to debug version to help find bugs. +# Set USE_DEX2OAT_DEBUG to false for only building non-debug versions. +ifeq ($(USE_DEX2OAT_DEBUG),false) DEX2OAT := $(HOST_OUT_EXECUTABLES)/dex2oat$(HOST_EXECUTABLE_SUFFIX) -DEX2OATD := $(HOST_OUT_EXECUTABLES)/dex2oatd$(HOST_EXECUTABLE_SUFFIX) +else +DEX2OAT := $(HOST_OUT_EXECUTABLES)/dex2oatd$(HOST_EXECUTABLE_SUFFIX) +endif -# By default, do not run rerun dex2oat if the tool changes. -# Comment out the | to force dex2oat to rerun on after all changes. -DEX2OAT_DEPENDENCY := art/runtime/oat.cc # dependency on oat version number -DEX2OAT_DEPENDENCY += art/runtime/image.cc # dependency on image version number -DEX2OAT_DEPENDENCY += | -DEX2OAT_DEPENDENCY += $(DEX2OAT) +# Pass special classpath to skip uses library check. +# Should modify build system to pass used libraries properly later. +DEX2OAT_CLASSPATH := "&" -DEX2OATD_DEPENDENCY := $(DEX2OAT_DEPENDENCY) -DEX2OATD_DEPENDENCY += $(DEX2OATD) +DEX2OAT_DEPENDENCY += $(DEX2OAT) # Use the first preloaded-classes file in PRODUCT_COPY_FILES. PRELOADED_CLASSES := $(call word-colon,1,$(firstword \ @@ -26,7 +27,12 @@ COMPILED_CLASSES := $(call word-colon,1,$(firstword \ # start of image reserved address space LIBART_IMG_HOST_BASE_ADDRESS := 0x60000000 + +ifneq ($(LIBART_IMG_BASE),) +LIBART_IMG_TARGET_BASE_ADDRESS := $(LIBART_IMG_BASE) +else LIBART_IMG_TARGET_BASE_ADDRESS := 0x70000000 +endif define get-product-default-property $(strip $(patsubst $(1)=%,%,$(filter $(1)=%,$(PRODUCT_DEFAULT_PROPERTY_OVERRIDES)))) @@ -37,7 +43,7 @@ DEX2OAT_IMAGE_XMX := $(call get-product-default-property,dalvik.vm.image-dex2oat DEX2OAT_XMS := $(call get-product-default-property,dalvik.vm.dex2oat-Xms) DEX2OAT_XMX := $(call get-product-default-property,dalvik.vm.dex2oat-Xmx) -ifeq ($(TARGET_ARCH),mips) +ifeq ($(TARGET_ARCH),$(filter $(TARGET_ARCH),mips mips64)) # MIPS specific overrides. # For MIPS the ART image is loaded at a lower address. This causes issues # with the image overlapping with memory on the host cross-compiling and @@ -55,9 +61,24 @@ endif # $(1): the arch name. # $(2): the full path (including file name) of the corresponding .jar or .apk. define get-odex-file-path -$(dir $(2))$(1)/$(basename $(notdir $(2))).odex +$(dir $(2))oat/$(1)/$(basename $(notdir $(2))).odex endef +# Returns the full path to the installed .odex file. +# This handles BOARD_USES_SYSTEM_OTHER_ODEX to install odex files into another +# partition. +# $(1): the arch name. +# $(2): the full install path (including file name) of the corresponding .apk. +ifeq ($(BOARD_USES_SYSTEM_OTHER_ODEX),true) +define get-odex-installed-file-path +$(if $(filter $(foreach f,$(SYSTEM_OTHER_ODEX_FILTER),$(TARGET_OUT)/$(f)),$(2)), + $(call get-odex-file-path,$(1),$(patsubst $(TARGET_OUT)/%,$(TARGET_OUT_SYSTEM_OTHER)/%,$(2))), + $(call get-odex-file-path,$(1),$(2))) +endef +else +get-odex-installed-file-path = $(get-odex-file-path) +endif + # 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") @@ -70,6 +91,13 @@ LIBART_TARGET_BOOT_JARS := $(patsubst core, core-libart,$(DEXPREOPT_BOOT_JARS_MO LIBART_TARGET_BOOT_DEX_LOCATIONS := $(foreach jar,$(LIBART_TARGET_BOOT_JARS),/$(DEXPREOPT_BOOT_JAR_DIR)/$(jar).jar) LIBART_TARGET_BOOT_DEX_FILES := $(foreach jar,$(LIBART_TARGET_BOOT_JARS),$(call intermediates-dir-for,JAVA_LIBRARIES,$(jar),,COMMON)/javalib.jar) +# dex preopt on the bootclasspath produces multiple files. The first dex file +# is converted into to boot.art (to match the legacy assumption that boot.art +# exists), and the rest are converted to boot-.art. +# In addition, each .art file has an associated .oat file. +LIBART_TARGET_BOOT_ART_EXTRA_FILES := $(foreach jar,$(wordlist 2,999,$(LIBART_TARGET_BOOT_JARS)),boot-$(jar).art boot-$(jar).oat) +LIBART_TARGET_BOOT_ART_EXTRA_FILES += boot.oat + my_2nd_arch_prefix := include $(BUILD_SYSTEM)/dex_preopt_libart_boot.mk @@ -88,15 +116,20 @@ endif define dex2oat-one-file $(hide) rm -f $(2) $(hide) mkdir -p $(dir $(2)) -$(hide) $(DEX2OATD) \ +$(hide) ANDROID_LOG_TAGS="*:e" $(DEX2OAT) \ --runtime-arg -Xms$(DEX2OAT_XMS) --runtime-arg -Xmx$(DEX2OAT_XMX) \ + --runtime-arg -classpath --runtime-arg $(DEX2OAT_CLASSPATH) \ --boot-image=$(PRIVATE_DEX_PREOPT_IMAGE_LOCATION) \ --dex-file=$(1) \ --dex-location=$(PRIVATE_DEX_LOCATION) \ --oat-file=$(2) \ --android-root=$(PRODUCT_OUT)/system \ --instruction-set=$($(PRIVATE_2ND_ARCH_VAR_PREFIX)DEX2OAT_TARGET_ARCH) \ + --instruction-set-variant=$($(PRIVATE_2ND_ARCH_VAR_PREFIX)DEX2OAT_TARGET_CPU_VARIANT) \ --instruction-set-features=$($(PRIVATE_2ND_ARCH_VAR_PREFIX)DEX2OAT_TARGET_INSTRUCTION_SET_FEATURES) \ - --include-patch-information --runtime-arg -Xnorelocate --no-include-debug-symbols \ - $(PRIVATE_DEX_PREOPT_FLAGS) + --include-patch-information --runtime-arg -Xnorelocate --no-generate-debug-info \ + --abort-on-hard-verifier-error \ + --no-inline-from=core-oj.jar \ + $(PRIVATE_DEX_PREOPT_FLAGS) \ + $(GLOBAL_DEXPREOPT_FLAGS) endef diff --git a/core/dex_preopt_libart_boot.mk b/core/dex_preopt_libart_boot.mk index 6c6e0ad52..1a0dc5b07 100644 --- a/core/dex_preopt_libart_boot.mk +++ b/core/dex_preopt_libart_boot.mk @@ -27,15 +27,9 @@ $(my_2nd_arch_prefix)LIBART_BOOT_IMAGE_FILENAME := /$(DEXPREOPT_BOOT_JAR_DIR)/$( # The .oat with symbols $(my_2nd_arch_prefix)LIBART_TARGET_BOOT_OAT_UNSTRIPPED := $(TARGET_OUT_UNSTRIPPED)$(patsubst %.art,%.oat,$($(my_2nd_arch_prefix)LIBART_BOOT_IMAGE_FILENAME)) -$(my_2nd_arch_prefix)DEFAULT_DEX_PREOPT_INSTALLED_IMAGE := -ifneq ($(PRODUCT_DEX_PREOPT_IMAGE_IN_DATA),true) $(my_2nd_arch_prefix)DEFAULT_DEX_PREOPT_INSTALLED_IMAGE := $(PRODUCT_OUT)$($(my_2nd_arch_prefix)LIBART_BOOT_IMAGE_FILENAME) -endif - -# Compile boot.oat as position-independent code if WITH_DEXPREOPT_PIC=true -ifeq (true,$(WITH_DEXPREOPT_PIC)) - PRODUCT_DEX_PREOPT_BOOT_FLAGS += --compile-pic -endif +$(my_2nd_arch_prefix)LIBART_TARGET_BOOT_ART_EXTRA_INSTALLED_FILES := $(addprefix $(dir $($(my_2nd_arch_prefix)DEFAULT_DEX_PREOPT_INSTALLED_IMAGE)),\ + $(LIBART_TARGET_BOOT_ART_EXTRA_FILES)) # If we have a compiled-classes file, create a parameter. COMPILED_CLASSES_FLAGS := @@ -43,18 +37,30 @@ ifneq ($(COMPILED_CLASSES),) COMPILED_CLASSES_FLAGS := --compiled-classes=$(COMPILED_CLASSES) endif -# The rule to install boot.art and boot.oat -$($(my_2nd_arch_prefix)DEFAULT_DEX_PREOPT_INSTALLED_IMAGE) : $($(my_2nd_arch_prefix)DEFAULT_DEX_PREOPT_BUILT_IMAGE_FILENAME) | $(ACP) - $(call copy-file-to-target) - $(hide) $(ACP) -fp $(patsubst %.art,%.oat,$<) $(patsubst %.art,%.oat,$@) +# The rule to install boot.art +# Depends on installed boot.oat, boot-*.art, boot-*.oat +$($(my_2nd_arch_prefix)DEFAULT_DEX_PREOPT_INSTALLED_IMAGE) : $($(my_2nd_arch_prefix)DEFAULT_DEX_PREOPT_BUILT_IMAGE_FILENAME) | $(ACP) $($(my_2nd_arch_prefix)LIBART_TARGET_BOOT_ART_EXTRA_INSTALLED_FILES) + @echo "Install: $@" + $(copy-file-to-target) + +# The rule to install boot.oat, boot-*.art, boot-*.oat +# Depends on built-but-not-installed boot.art +$($(my_2nd_arch_prefix)LIBART_TARGET_BOOT_ART_EXTRA_INSTALLED_FILES) : $($(my_2nd_arch_prefix)DEFAULT_DEX_PREOPT_BUILT_IMAGE_FILENAME) | $(ACP) + @echo "Install: $@" + @mkdir -p $(dir $@) + $(hide) $(ACP) -fp $(dir $<)$(notdir $@) $@ $($(my_2nd_arch_prefix)DEFAULT_DEX_PREOPT_BUILT_IMAGE_FILENAME): PRIVATE_2ND_ARCH_VAR_PREFIX := $(my_2nd_arch_prefix) # Use dex2oat debug version for better error reporting -$($(my_2nd_arch_prefix)DEFAULT_DEX_PREOPT_BUILT_IMAGE_FILENAME) : $(LIBART_TARGET_BOOT_DEX_FILES) $(DEX2OATD_DEPENDENCY) - @echo "target dex2oat: $@ ($?)" +$($(my_2nd_arch_prefix)DEFAULT_DEX_PREOPT_BUILT_IMAGE_FILENAME) : $(LIBART_TARGET_BOOT_DEX_FILES) $(DEX2OAT_DEPENDENCY) + @echo "target dex2oat: $@" @mkdir -p $(dir $@) @mkdir -p $(dir $($(PRIVATE_2ND_ARCH_VAR_PREFIX)LIBART_TARGET_BOOT_OAT_UNSTRIPPED)) - $(hide) $(DEX2OATD) --runtime-arg -Xms$(DEX2OAT_IMAGE_XMS) --runtime-arg -Xmx$(DEX2OAT_IMAGE_XMX) \ + @rm -f $(dir $@)/*.art $(dir $@)/*.oat + @rm -f $(dir $($(PRIVATE_2ND_ARCH_VAR_PREFIX)LIBART_TARGET_BOOT_OAT_UNSTRIPPED))/*.art + @rm -f $(dir $($(PRIVATE_2ND_ARCH_VAR_PREFIX)LIBART_TARGET_BOOT_OAT_UNSTRIPPED))/*.oat + $(hide) ANDROID_LOG_TAGS="*:e" $(DEX2OAT) --runtime-arg -Xms$(DEX2OAT_IMAGE_XMS) \ + --runtime-arg -Xmx$(DEX2OAT_IMAGE_XMX) \ --image-classes=$(PRELOADED_CLASSES) \ $(addprefix --dex-file=,$(LIBART_TARGET_BOOT_DEX_FILES)) \ $(addprefix --dex-location=,$(LIBART_TARGET_BOOT_DEX_LOCATIONS)) \ @@ -63,6 +69,8 @@ $($(my_2nd_arch_prefix)DEFAULT_DEX_PREOPT_BUILT_IMAGE_FILENAME) : $(LIBART_TARGE --oat-location=$(patsubst %.art,%.oat,$($(PRIVATE_2ND_ARCH_VAR_PREFIX)LIBART_BOOT_IMAGE_FILENAME)) \ --image=$@ --base=$(LIBART_IMG_TARGET_BASE_ADDRESS) \ --instruction-set=$($(PRIVATE_2ND_ARCH_VAR_PREFIX)DEX2OAT_TARGET_ARCH) \ + --instruction-set-variant=$($(PRIVATE_2ND_ARCH_VAR_PREFIX)DEX2OAT_TARGET_CPU_VARIANT) \ --instruction-set-features=$($(PRIVATE_2ND_ARCH_VAR_PREFIX)DEX2OAT_TARGET_INSTRUCTION_SET_FEATURES) \ - --android-root=$(PRODUCT_OUT)/system --include-patch-information --runtime-arg -Xnorelocate --no-include-debug-symbols \ - $(PRODUCT_DEX_PREOPT_BOOT_FLAGS) $(COMPILED_CLASSES_FLAGS) + --android-root=$(PRODUCT_OUT)/system --include-patch-information --runtime-arg -Xnorelocate --no-generate-debug-info \ + --multi-image --no-inline-from=core-oj.jar \ + $(PRODUCT_DEX_PREOPT_BOOT_FLAGS) $(GLOBAL_DEXPREOPT_FLAGS) $(COMPILED_CLASSES_FLAGS) $(ART_BOOT_IMAGE_EXTRA_ARGS) diff --git a/core/dex_preopt_libdvm.mk b/core/dex_preopt_libdvm.mk deleted file mode 100644 index 23a54e1eb..000000000 --- a/core/dex_preopt_libdvm.mk +++ /dev/null @@ -1,76 +0,0 @@ -#################################### -# dexpreopt support for Dalvik -# -#################################### - -DEXOPT := $(HOST_OUT_EXECUTABLES)/dexopt$(HOST_EXECUTABLE_SUFFIX) -DEXPREOPT := dalvik/tools/dex-preopt - -DEXPREOPT_DEXOPT := $(patsubst $(DEXPREOPT_BUILD_DIR)/%,%,$(DEXOPT)) - -DEXPREOPT_BOOT_ODEXS := $(foreach b,$(DEXPREOPT_BOOT_JARS_MODULES),\ - $(DEXPREOPT_BOOT_JAR_DIR_FULL_PATH)/$(b).odex) - -# If the target is a uniprocessor, then explicitly tell the preoptimizer -# that fact. (By default, it always optimizes for an SMP target.) -ifeq ($(TARGET_CPU_SMP),true) - DEXPREOPT_UNIPROCESSOR := -else - DEXPREOPT_UNIPROCESSOR := --uniprocessor -endif - -# By default, do not run rerun dexopt if the tool changes. -# Comment out the | to force dex2oat to rerun on after all changes. -DEXOPT_DEPENDENCY := | -DEXOPT_DEPENDENCY += $(DEXPREOPT) $(DEXOPT) - -# $(1): the input .jar or .apk file -# $(2): the output .odex file -define dexopt-one-file -$(hide) rm -f $(2) -$(hide) mkdir -p $(dir $(2)) -$(hide) $(DEXPREOPT) \ - --dexopt=$(DEXPREOPT_DEXOPT) \ - --build-dir=$(DEXPREOPT_BUILD_DIR) \ - --product-dir=$(DEXPREOPT_PRODUCT_DIR) \ - --boot-dir=$(DEXPREOPT_BOOT_JAR_DIR) \ - --boot-jars=$(DEXPREOPT_BOOT_JARS) \ - $(DEXPREOPT_UNIPROCESSOR) \ - $(patsubst $(DEXPREOPT_BUILD_DIR)/%,%,$(1)) \ - $(patsubst $(DEXPREOPT_BUILD_DIR)/%,%,$(2)) -endef - -# Special rules for building odex files for boot jars that override java_library.mk rules - -# $(1): boot jar module name -define _dexpreopt-boot-odex -_dbj_jar := $(DEXPREOPT_BOOT_JAR_DIR_FULL_PATH)/$(1).jar -_dbj_odex := $(DEXPREOPT_BOOT_JAR_DIR_FULL_PATH)/$(1).odex -_dbj_src_jar := $(call intermediates-dir-for,JAVA_LIBRARIES,$(1),,COMMON)/javalib.jar -$$(_dbj_odex): PRIVATE_DBJ_JAR := $$(_dbj_jar) -$$(_dbj_odex) : $$(_dbj_src_jar) | $(ACP) $(DEXPREOPT) $(DEXOPT) - @echo "Dexpreopt Boot Jar: $$@" - $(hide) mkdir -p $$(dir $$(PRIVATE_DBJ_JAR)) && $(ACP) -fp $$< $$(PRIVATE_DBJ_JAR) - $$(call dexopt-one-file,$$(PRIVATE_DBJ_JAR),$$@) - -_dbj_jar := -_dbj_odex := -_dbj_src_jar := -endef - -$(foreach b,$(DEXPREOPT_BOOT_JARS_MODULES),$(eval $(call _dexpreopt-boot-odex,$(b)))) - -# $(1): the rest list of boot jars -define _build-dexpreopt-boot-jar-dependency-pair -$(if $(filter 1,$(words $(1)))$(filter 0,$(words $(1))),,\ - $(eval _bdbjdp_target := $(DEXPREOPT_BOOT_JAR_DIR_FULL_PATH)/$(word 2,$(1)).odex) \ - $(eval _bdbjdp_dep := $(DEXPREOPT_BOOT_JAR_DIR_FULL_PATH)/$(word 1,$(1)).odex) \ - $(eval $(call add-dependency,$(_bdbjdp_target),$(_bdbjdp_dep))) \ - $(eval $(call _build-dexpreopt-boot-jar-dependency-pair,$(wordlist 2,999,$(1))))) -endef - -define _build-dexpreopt-boot-jar-dependency -$(call _build-dexpreopt-boot-jar-dependency-pair,$(DEXPREOPT_BOOT_JARS_MODULES)) -endef - -$(eval $(call _build-dexpreopt-boot-jar-dependency)) diff --git a/core/dex_preopt_odex_install.mk b/core/dex_preopt_odex_install.mk index cb38261ab..b05d4da3d 100644 --- a/core/dex_preopt_odex_install.mk +++ b/core/dex_preopt_odex_install.mk @@ -33,16 +33,20 @@ endif ifeq (,$(strip $(built_dex)$(my_prebuilt_src_file))) # contains no java code LOCAL_DEX_PREOPT := endif -# if module oat file requested in data, disable LOCAL_DEX_PREOPT, will default location to dalvik-cache -ifneq (,$(filter $(LOCAL_MODULE),$(PRODUCT_DEX_PREOPT_PACKAGES_IN_DATA))) -LOCAL_DEX_PREOPT := -endif # if WITH_DEXPREOPT_BOOT_IMG_ONLY=true and module is not in boot class path skip ifeq (true,$(WITH_DEXPREOPT_BOOT_IMG_ONLY)) ifeq ($(filter $(DEXPREOPT_BOOT_JARS_MODULES),$(LOCAL_MODULE)),) LOCAL_DEX_PREOPT := endif endif +# if installing into system, and odex are being installed into system_other, don't strip +ifeq ($(BOARD_USES_SYSTEM_OTHER_ODEX),true) +ifeq ($(LOCAL_DEX_PREOPT),true) +ifneq ($(filter $(foreach f,$(SYSTEM_OTHER_ODEX_FILTER),$(TARGET_OUT)/$(f)),$(my_module_path)),) +LOCAL_DEX_PREOPT := nostripping +endif +endif +endif built_odex := installed_odex := @@ -50,28 +54,21 @@ built_installed_odex := ifdef LOCAL_DEX_PREOPT dexpreopt_boot_jar_module := $(filter $(DEXPREOPT_BOOT_JARS_MODULES),$(LOCAL_MODULE)) ifdef dexpreopt_boot_jar_module -ifeq ($(DALVIK_VM_LIB),libdvm.so) -built_odex := $(basename $(LOCAL_BUILT_MODULE)).odex -installed_odex := $(basename $(LOCAL_INSTALLED_MODULE)).odex -built_installed_odex := $(built_odex):$(installed_odex) -else # libdvm.so # For libart, the boot jars' odex files are replaced by $(DEFAULT_DEX_PREOPT_INSTALLED_IMAGE). # We use this installed_odex trick to get boot.art installed. installed_odex := $(DEFAULT_DEX_PREOPT_INSTALLED_IMAGE) # Append the odex for the 2nd arch if we have one. installed_odex += $($(TARGET_2ND_ARCH_VAR_PREFIX)DEFAULT_DEX_PREOPT_INSTALLED_IMAGE) -endif # libdvm.so else # boot jar -ifeq ($(DALVIK_VM_LIB),libdvm.so) -built_odex := $(basename $(LOCAL_BUILT_MODULE)).odex -installed_odex := $(basename $(LOCAL_INSTALLED_MODULE)).odex -built_installed_odex := $(built_odex):$(installed_odex) - -$(built_odex) : $(DEXPREOPT_ONE_FILE_DEPENDENCY_BUILT_BOOT_PREOPT) \ - $(DEXPREOPT_ONE_FILE_DEPENDENCY_TOOLS) -else # libart ifeq ($(LOCAL_MODULE_CLASS),JAVA_LIBRARIES) -# For a Java library, we build odex for both 1st arch and 2nd arch, if we have one. +# For a Java library, by default we build odex for both 1st arch and 2nd arch. +# But it can be overridden with "LOCAL_MULTILIB := first". +ifneq (,$(filter $(PRODUCT_SYSTEM_SERVER_JARS),$(LOCAL_MODULE))) +# For system server jars, we build for only "first". +my_module_multilib := first +else +my_module_multilib := $(LOCAL_MULTILIB) +endif # ################################################# # Odex for the 1st arch my_2nd_arch_prefix := @@ -79,8 +76,10 @@ include $(BUILD_SYSTEM)/setup_one_odex.mk # ################################################# # Odex for the 2nd arch ifdef TARGET_2ND_ARCH +ifneq (first,$(my_module_multilib)) my_2nd_arch_prefix := $(TARGET_2ND_ARCH_VAR_PREFIX) include $(BUILD_SYSTEM)/setup_one_odex.mk +endif # my_module_multilib is not first. endif # TARGET_2ND_ARCH # ################################################# else # must be APPS @@ -95,9 +94,11 @@ include $(BUILD_SYSTEM)/setup_one_odex.mk endif # LOCAL_MULTILIB is both endif # TARGET_2ND_ARCH endif # LOCAL_MODULE_CLASS -endif # libart endif # boot jar +built_odex := $(strip $(built_odex)) +installed_odex := $(strip $(installed_odex)) + ifdef built_odex ifndef LOCAL_DEX_PREOPT_FLAGS LOCAL_DEX_PREOPT_FLAGS := $(DEXPREOPT.$(TARGET_PRODUCT).$(LOCAL_MODULE).CONFIG) @@ -106,26 +107,26 @@ LOCAL_DEX_PREOPT_FLAGS := $(PRODUCT_DEX_PREOPT_DEFAULT_FLAGS) endif endif -# Compile apps with position-independent code if WITH_DEXPREOPT_PIC=true -ifeq (true,$(WITH_DEXPREOPT_PIC)) - LOCAL_DEX_PREOPT_FLAGS += --compile-pic -endif - $(built_odex): PRIVATE_DEX_PREOPT_FLAGS := $(LOCAL_DEX_PREOPT_FLAGS) - -# Use pattern rule - we may have multiple installed odex files. -# Ugly syntax - See the definition get-odex-file-path. -$(installed_odex) : $(dir $(LOCAL_INSTALLED_MODULE))%$(notdir $(word 1,$(installed_odex))) \ - : $(dir $(LOCAL_BUILT_MODULE))%$(notdir $(word 1,$(built_odex))) \ - | $(ACP) - @echo "Install: $@" - $(copy-file-to-target) endif # Add the installed_odex to the list of installed files for this module. ALL_MODULES.$(my_register_name).INSTALLED += $(installed_odex) ALL_MODULES.$(my_register_name).BUILT_INSTALLED += $(built_installed_odex) +# Record dex-preopt config. +DEXPREOPT.$(LOCAL_MODULE).DEX_PREOPT := $(LOCAL_DEX_PREOPT) +DEXPREOPT.$(LOCAL_MODULE).MULTILIB := $(LOCAL_MULTILIB) +DEXPREOPT.$(LOCAL_MODULE).DEX_PREOPT_FLAGS := $(LOCAL_DEX_PREOPT_FLAGS) +DEXPREOPT.$(LOCAL_MODULE).PRIVILEGED_MODULE := $(LOCAL_PRIVILEGED_MODULE) +DEXPREOPT.$(LOCAL_MODULE).PROPRIETARY_MODULE := $(LOCAL_PROPRIETARY_MODULE) +DEXPREOPT.$(LOCAL_MODULE).TARGET_ARCH := $(LOCAL_MODULE_TARGET_ARCH) +DEXPREOPT.$(LOCAL_MODULE).INSTALLED := $(installed_odex) +DEXPREOPT.$(LOCAL_MODULE).INSTALLED_STRIPPED := $(LOCAL_INSTALLED_MODULE) +DEXPREOPT.MODULES.$(LOCAL_MODULE_CLASS) := $(sort \ + $(DEXPREOPT.MODULES.$(LOCAL_MODULE_CLASS)) $(LOCAL_MODULE)) + + # Make sure to install the .odex when you run "make " $(my_register_name): $(installed_odex) diff --git a/core/dpi_specific_apk.mk b/core/dpi_specific_apk.mk index 0e8cbdf91..6bae25d96 100644 --- a/core/dpi_specific_apk.mk +++ b/core/dpi_specific_apk.mk @@ -16,7 +16,7 @@ $(built_dpi_apk): PRIVATE_ANDROID_MANIFEST := $(full_android_manifest) $(built_dpi_apk): PRIVATE_RESOURCE_DIR := $(LOCAL_RESOURCE_DIR) $(built_dpi_apk): PRIVATE_ASSET_DIR := $(LOCAL_ASSET_DIR) $(built_dpi_apk): PRIVATE_AAPT_INCLUDES := $(all_library_res_package_exports) -ifneq (,$(filter-out current system_current, $(LOCAL_SDK_VERSION))) +ifneq (,$(filter-out current system_current test_current, $(LOCAL_SDK_VERSION))) $(built_dpi_apk): PRIVATE_DEFAULT_APP_TARGET_SDK := $(LOCAL_SDK_VERSION) else $(built_dpi_apk): PRIVATE_DEFAULT_APP_TARGET_SDK := $(DEFAULT_APP_TARGET_SDK) @@ -25,37 +25,49 @@ $(built_dpi_apk): PRIVATE_MANIFEST_PACKAGE_NAME := $(LOCAL_MANIFEST_PACKAGE_NAME $(built_dpi_apk): PRIVATE_MANIFEST_INSTRUMENTATION_FOR := $(LOCAL_INSTRUMENTATION_FOR) $(built_dpi_apk): PRIVATE_JNI_SHARED_LIBRARIES := $(jni_shared_libraries_with_abis) $(built_dpi_apk): PRIVATE_JNI_SHARED_LIBRARIES_ABI := $(jni_shared_libraries_abis) -$(built_dpi_apk): PRIVATE_DEX_FILE := $(built_dex) -# Note that PRIVATE_CLASS_INTERMEDIATES_DIR points to the base apk's intermediate dir. -$(built_dpi_apk): PRIVATE_CLASS_INTERMEDIATES_DIR := $(intermediates)/classes -$(built_dpi_apk): PRIVATE_EXTRA_JAR_ARGS := $(extra_jar_args) $(built_dpi_apk): PRIVATE_PRIVATE_KEY := $(private_key) $(built_dpi_apk): PRIVATE_CERTIFICATE := $(certificate) $(built_dpi_apk): PRIVATE_ADDITIONAL_CERTIFICATES := $(foreach c,\ $(LOCAL_ADDITIONAL_CERTIFICATES), $(c).x509.pem $(c).pk8) +$(built_dpi_apk): PRIVATE_SOURCE_ARCHIVE := +ifneq ($(full_classes_jar),) +$(built_dpi_apk): PRIVATE_DEX_FILE := $(built_dex) +ifndef LOCAL_JACK_ENABLED +# Use the jarjar processed arhive as the initial package file. +$(built_dpi_apk): PRIVATE_SOURCE_ARCHIVE := $(full_classes_jarjar_jar) +else +$(built_dpi_apk): PRIVATE_JACK_INTERMEDIATES_DIR := $(intermediates.COMMON)/jack-rsc +endif # LOCAL_JACK_ENABLED +$(built_dpi_apk): $(built_dex) +else +$(built_dpi_apk): PRIVATE_DEX_FILE := +endif # full_classes_jar + # Set up dependenncies and the build recipe. $(built_dpi_apk) : $(R_file_stamp) $(built_dpi_apk) : $(all_library_res_package_export_deps) -$(built_dpi_apk) : $(built_dex) $(built_dpi_apk) : $(private_key) $(certificate) $(SIGNAPK_JAR) -$(built_dpi_apk) : $(AAPT) | $(ZIPALIGN) +$(built_dpi_apk) : $(AAPT) $(built_dpi_apk) : $(all_res_assets) $(jni_shared_libraries) $(full_android_manifest) @echo "target Package: $(PRIVATE_MODULE) ($@)" - $(create-empty-package) + $(if $(PRIVATE_SOURCE_ARCHIVE),\ + $(call initialize-package-file,$(PRIVATE_SOURCE_ARCHIVE),$@),\ + $(create-empty-package)) $(add-assets-to-package) ifneq ($(jni_shared_libraries),) $(add-jni-shared-libs-to-package) endif -ifneq ($(full_classes_jar),) +ifeq ($(full_classes_jar),) +# We don't build jar, need to add the Java resources here. + $(if $(PRIVATE_EXTRA_JAR_ARGS),$(call add-java-resources-to,$@)) +else $(add-dex-to-package) +ifdef LOCAL_JACK_ENABLED + $(add-carried-jack-resources) endif - $(add-carried-java-resources) -ifneq ($(extra_jar_args),) - $(add-java-resources-to-package) endif $(sign-package) - $(align-package) # Set up global variables to register this apk to the higher-level dependency graph. ALL_MODULES += $(dpi_apk_name) diff --git a/core/droiddoc.mk b/core/droiddoc.mk index d3e61d57c..f1435790f 100644 --- a/core/droiddoc.mk +++ b/core/droiddoc.mk @@ -23,6 +23,7 @@ LOCAL_IS_HOST_MODULE := $(call true-or-empty,$(LOCAL_IS_HOST_MODULE)) ifeq ($(LOCAL_IS_HOST_MODULE),true) my_prefix := HOST_ +LOCAL_HOST_PREFIX := else my_prefix := TARGET_ endif @@ -67,13 +68,16 @@ ifneq ($(LOCAL_SDK_VERSION),) else ifeq ($(LOCAL_SDK_VERSION)$(TARGET_BUILD_APPS),system_current) LOCAL_JAVA_LIBRARIES := android_system_stubs_current $(LOCAL_JAVA_LIBRARIES) $(full_target): PRIVATE_BOOTCLASSPATH := $(call java-lib-files, android_system_stubs_current) + else ifeq ($(LOCAL_SDK_VERSION)$(TARGET_BUILD_APPS),test_current) + LOCAL_JAVA_LIBRARIES := android_test_stubs_current $(LOCAL_JAVA_LIBRARIES) + $(full_target): PRIVATE_BOOTCLASSPATH := $(call java-lib-files, android_test_stubs_current) else LOCAL_JAVA_LIBRARIES := sdk_v$(LOCAL_SDK_VERSION) $(LOCAL_JAVA_LIBRARIES) $(full_target): PRIVATE_BOOTCLASSPATH := $(call java-lib-files, sdk_v$(LOCAL_SDK_VERSION)) endif else - LOCAL_JAVA_LIBRARIES := core-libart ext framework $(LOCAL_JAVA_LIBRARIES) - $(full_target): PRIVATE_BOOTCLASSPATH := $(call java-lib-files, core-libart) + LOCAL_JAVA_LIBRARIES := core-oj core-libart ext framework $(LOCAL_JAVA_LIBRARIES) + $(full_target): PRIVATE_BOOTCLASSPATH := $(call java-lib-files, core-oj):$(call java-lib-files, core-libart) endif # LOCAL_SDK_VERSION LOCAL_JAVA_LIBRARIES := $(sort $(LOCAL_JAVA_LIBRARIES)) @@ -98,6 +102,7 @@ endif $(full_target): PRIVATE_OUT_DIR := $(out_dir) $(full_target): PRIVATE_DROIDDOC_OPTIONS := $(LOCAL_DROIDDOC_OPTIONS) +$(full_target): PRIVATE_STUB_OUT_DIR := $(LOCAL_DROIDDOC_STUB_OUT_DIR) # Lists the input files for the doc build into a text file # suitable for the @ syntax of javadoc. @@ -107,7 +112,7 @@ $(full_target): PRIVATE_DROIDDOC_OPTIONS := $(LOCAL_DROIDDOC_OPTIONS) define prepare-doc-source-list $(hide) mkdir -p $(dir $(1)) $(call dump-words-to-file, $(2), $(1)) -$(hide) for d in $(3) ; do find $$d -name '*.java' >> $(1) 2> /dev/null ; done ; true +$(hide) for d in $(3) ; do find $$d -name '*.java' -and -not -name '.*' >> $(1) 2> /dev/null ; done ; true endef ifeq (a,b) @@ -124,15 +129,15 @@ ifneq ($(strip $(LOCAL_DROIDDOC_USE_STANDARD_DOCLET)),true) ## droiddoc_templates := \ - $(shell find $(LOCAL_DROIDDOC_CUSTOM_TEMPLATE_DIR) -type f) + $(sort $(shell find $(LOCAL_DROIDDOC_CUSTOM_TEMPLATE_DIR) -type f)) droiddoc := \ $(HOST_JDK_TOOLS_JAR) \ $(HOST_OUT_JAVA_LIBRARIES)/doclava$(COMMON_JAVA_PACKAGE_SUFFIX) $(full_target): PRIVATE_DOCLETPATH := $(HOST_OUT_JAVA_LIBRARIES)/jsilver$(COMMON_JAVA_PACKAGE_SUFFIX):$(HOST_OUT_JAVA_LIBRARIES)/doclava$(COMMON_JAVA_PACKAGE_SUFFIX) -$(full_target): PRIVATE_CURRENT_BUILD := -hdf page.build $(BUILD_ID)-$(BUILD_NUMBER) -$(full_target): PRIVATE_CURRENT_TIME := -hdf page.now "$(shell date "+%d %b %Y %k:%M")" +$(full_target): PRIVATE_CURRENT_BUILD := -hdf page.build $(BUILD_ID)-$(BUILD_NUMBER_FROM_FILE) +$(full_target): PRIVATE_CURRENT_TIME := -hdf page.now "$$($(DATE_FROM_FILE) "+%d %b %Y %k:%M")" $(full_target): PRIVATE_CUSTOM_TEMPLATE_DIR := $(LOCAL_DROIDDOC_CUSTOM_TEMPLATE_DIR) $(full_target): PRIVATE_IN_CUSTOM_ASSET_DIR := $(LOCAL_DROIDDOC_CUSTOM_TEMPLATE_DIR)/$(LOCAL_DROIDDOC_CUSTOM_ASSET_DIR) $(full_target): PRIVATE_OUT_ASSET_DIR := $(out_dir)/$(LOCAL_DROIDDOC_ASSET_DIR) @@ -141,7 +146,7 @@ $(full_target): PRIVATE_OUT_CUSTOM_ASSET_DIR := $(out_dir)/$(LOCAL_DROIDDOC_CUST html_dir_files := ifneq ($(strip $(LOCAL_DROIDDOC_HTML_DIR)),) $(full_target): PRIVATE_DROIDDOC_HTML_DIR := -htmldir $(LOCAL_PATH)/$(LOCAL_DROIDDOC_HTML_DIR) -html_dir_files := $(shell find $(LOCAL_PATH)/$(LOCAL_DROIDDOC_HTML_DIR) -type f) +html_dir_files := $(sort $(shell find $(LOCAL_PATH)/$(LOCAL_DROIDDOC_HTML_DIR) -type f)) else $(full_target): PRIVATE_DROIDDOC_HTML_DIR := endif @@ -154,16 +159,24 @@ endif # TODO: not clear if this is used any more $(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) +$(full_target): \ + $(full_src_files) \ + $(droiddoc_templates) \ + $(droiddoc) \ + $(html_dir_files) \ + $(full_java_lib_deps) \ + $(LOCAL_MODULE_MAKEFILE_DEP) \ + $(LOCAL_ADDITIONAL_DEPENDENCIES) @echo Docs droiddoc: $(PRIVATE_OUT_DIR) $(hide) mkdir -p $(dir $@) + $(addprefix $(hide) rm -rf ,$(PRIVATE_STUB_OUT_DIR)) $(call prepare-doc-source-list,$(PRIVATE_SRC_LIST_FILE),$(PRIVATE_JAVA_FILES), \ $(PRIVATE_SOURCE_INTERMEDIATES_DIR) $(PRIVATE_ADDITIONAL_JAVA_DIR)) $(hide) ( \ javadoc \ -encoding UTF-8 \ \@$(PRIVATE_SRC_LIST_FILE) \ - -J-Xmx1280m \ + -J-Xmx1600m \ -XDignore.symbol.file \ $(PRIVATE_PROFILING_OPTIONS) \ -quiet \ @@ -178,6 +191,7 @@ $(full_target): $(full_src_files) $(droiddoc_templates) $(droiddoc) $(html_dir_f -d $(PRIVATE_OUT_DIR) \ $(PRIVATE_CURRENT_BUILD) $(PRIVATE_CURRENT_TIME) \ $(PRIVATE_DROIDDOC_OPTIONS) \ + $(addprefix -stubs ,$(PRIVATE_STUB_OUT_DIR)) \ && touch -f $@ \ ) || (rm -rf $(PRIVATE_OUT_DIR) $(PRIVATE_SRC_LIST_FILE); exit 45) @@ -201,6 +215,7 @@ $(full_target): $(full_src_files) $(full_java_lib_deps) \@$(PRIVATE_SRC_LIST_FILE) \ -J-Xmx1024m \ -XDignore.symbol.file \ + $(if $(LEGACY_USE_JAVA7),,-Xdoclint:none) \ $(PRIVATE_PROFILING_OPTIONS) \ $(addprefix -classpath ,$(PRIVATE_CLASSPATH)) \ $(addprefix -bootclasspath ,$(PRIVATE_BOOTCLASSPATH)) \ @@ -233,7 +248,7 @@ $(out_zip): $(full_target) @echo Package docs: $@ @rm -f $@ @mkdir -p $(dir $@) - $(hide) ( F=$$(pwd)/$@ ; cd $(PRIVATE_DOCS_DIR) && zip -rq $$F * ) + $(hide) ( F=$$(pwd)/$@ ; cd $(PRIVATE_DOCS_DIR) && zip -rqX $$F * ) $(LOCAL_MODULE)-docs.zip : $(out_zip) diff --git a/core/dumpvar.mk b/core/dumpvar.mk index 510bc7d08..92cb3a20e 100644 --- a/core/dumpvar.mk +++ b/core/dumpvar.mk @@ -1,3 +1,49 @@ + +# List of variables we want to print in the build banner. +print_build_config_vars := \ + PLATFORM_VERSION_CODENAME \ + PLATFORM_VERSION \ + LINEAGE_VERSION \ + TARGET_PRODUCT \ + TARGET_BUILD_VARIANT \ + TARGET_BUILD_TYPE \ + TARGET_BUILD_APPS \ + TARGET_ARCH \ + TARGET_ARCH_VARIANT \ + TARGET_CPU_VARIANT \ + TARGET_2ND_ARCH \ + TARGET_2ND_ARCH_VARIANT \ + TARGET_2ND_CPU_VARIANT \ + HOST_ARCH \ + HOST_2ND_ARCH \ + HOST_OS \ + HOST_OS_EXTRA \ + HOST_CROSS_OS \ + HOST_CROSS_ARCH \ + HOST_CROSS_2ND_ARCH \ + HOST_BUILD_TYPE \ + BUILD_ID \ + OUT_DIR + +ifneq ($(RECOVERY_VARIANT),) +print_build_config_vars += \ + RECOVERY_VARIANT +endif +ifeq ($(WITH_SU),true) +print_build_config_vars += \ + WITH_SU +endif +ifeq ($(WITH_GMS),true) +print_build_config_vars += \ + WITH_GMS +endif + +ifeq ($(TARGET_BUILD_PDK),true) +print_build_config_vars += \ + TARGET_BUILD_PDK \ + PDK_FUSION_PLATFORM_ZIP +endif + # --------------------------------------------------------------- # the setpath shell function in envsetup.sh uses this to figure out # what to add to the path given the config we have chosen. @@ -38,11 +84,7 @@ ifdef dumpvar_goals absolute_dumpvar := $(strip $(filter abs-%,$(dumpvar_goals))) ifdef absolute_dumpvar dumpvar_goals := $(patsubst abs-%,%,$(dumpvar_goals)) - ifneq ($(filter /%,$($(dumpvar_goals))),) - DUMPVAR_VALUE := $($(dumpvar_goals)) - else - DUMPVAR_VALUE := $(PWD)/$($(dumpvar_goals)) - endif + DUMPVAR_VALUE := $(abspath $($(dumpvar_goals))) dumpvar_target := dumpvar-abs-$(dumpvar_goals) else DUMPVAR_VALUE := $($(dumpvar_goals)) @@ -59,29 +101,37 @@ ifneq ($(dumpvar_goals),report_config) PRINT_BUILD_CONFIG:= endif -endif # CALLED_FROM_SETUP +ifneq ($(filter report_config,$(DUMP_MANY_VARS)),) +# Construct the shell commands that print the config banner. +report_config_sh := echo '============================================'; +report_config_sh += $(foreach v,$(print_build_config_vars),echo '$v=$($(v))';) +report_config_sh += echo '============================================'; +endif +# Dump mulitple variables to "=" pairs, one per line. +# The output may be executed as bash script. +# Input variables: +# DUMP_MANY_VARS: the list of variable names. +# DUMP_VAR_PREFIX: an optional prefix of the variable name added to the output. +# DUMP_MANY_ABS_VARS: the list of abs variable names. +# DUMP_ABS_VAR_PREFIX: an optional prefix of the abs variable name added to the output. +.PHONY: dump-many-vars +dump-many-vars : + @$(foreach v, $(filter-out report_config, $(DUMP_MANY_VARS)),\ + echo "$(DUMP_VAR_PREFIX)$(v)='$($(v))'";) +ifneq ($(filter report_config, $(DUMP_MANY_VARS)),) + @# Construct a special variable for report_config. + @# Escape \` to defer the execution of report_config_sh to preserve the line breaks. + @echo "$(DUMP_VAR_PREFIX)report_config=\`$(report_config_sh)\`" +endif + @$(foreach v, $(sort $(DUMP_MANY_ABS_VARS)),\ + echo "$(DUMP_ABS_VAR_PREFIX)$(v)='$(abspath $($(v)))'";) + +endif # CALLED_FROM_SETUP ifneq ($(PRINT_BUILD_CONFIG),) -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 TARGET_PRODUCT=$(TARGET_PRODUCT)) -$(info TARGET_BUILD_VARIANT=$(TARGET_BUILD_VARIANT)) -$(info TARGET_BUILD_TYPE=$(TARGET_BUILD_TYPE)) -$(info TARGET_BUILD_APPS=$(TARGET_BUILD_APPS)) -$(info TARGET_ARCH=$(TARGET_ARCH)) -$(info TARGET_ARCH_VARIANT=$(TARGET_ARCH_VARIANT)) -$(info TARGET_CPU_VARIANT=$(TARGET_CPU_VARIANT)) -$(info TARGET_2ND_ARCH=$(TARGET_2ND_ARCH)) -$(info TARGET_2ND_ARCH_VARIANT=$(TARGET_2ND_ARCH_VARIANT)) -$(info TARGET_2ND_CPU_VARIANT=$(TARGET_2ND_CPU_VARIANT)) -$(info HOST_ARCH=$(HOST_ARCH)) -$(info HOST_OS=$(HOST_OS)) -$(info HOST_OS_EXTRA=$(HOST_OS_EXTRA)) -$(info HOST_BUILD_TYPE=$(HOST_BUILD_TYPE)) -$(info BUILD_ID=$(BUILD_ID)) -$(info OUT_DIR=$(OUT_DIR)) +$(foreach v, $(print_build_config_vars),\ + $(info $v=$($(v)))) $(info ============================================) endif diff --git a/core/dynamic_binary.mk b/core/dynamic_binary.mk index 08fb17600..8baa399de 100644 --- a/core/dynamic_binary.mk +++ b/core/dynamic_binary.mk @@ -39,27 +39,50 @@ include $(BUILD_SYSTEM)/binary.mk ################################### ########################################################### -## Compress +## Pack relocation tables ########################################################### -compress_input := $(linked_module) +relocation_packer_input := $(linked_module) +relocation_packer_output := $(intermediates)/PACKED/$(my_built_module_stem) + +my_pack_module_relocations := false +ifneq ($(DISABLE_RELOCATION_PACKER),true) + my_pack_module_relocations := $(firstword \ + $(LOCAL_PACK_MODULE_RELOCATIONS_$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)) \ + $(LOCAL_PACK_MODULE_RELOCATIONS)) +endif -ifeq ($(strip $(LOCAL_COMPRESS_MODULE_SYMBOLS)),) - LOCAL_COMPRESS_MODULE_SYMBOLS := $(strip $(TARGET_COMPRESS_MODULE_SYMBOLS)) +ifeq ($(my_pack_module_relocations),) + my_pack_module_relocations := $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_PACK_MODULE_RELOCATIONS) endif -ifeq ($(LOCAL_COMPRESS_MODULE_SYMBOLS),true) -$(error Symbol compression not yet supported.) -compress_output := $(intermediates)/COMPRESSED-$(my_built_module_stem) +# Do not pack relocations for executables. Because packing results in +# non-zero p_vaddr which causes kernel to load executables to lower +# address (starting at 0x8000) http://b/20665974 +ifeq ($(LOCAL_MODULE_CLASS),EXECUTABLES) + my_pack_module_relocations := false +endif -#TODO: write the real $(STRIPPER) rule. -#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) ($@)" - $(copy-file-to-target) +# Likewise for recovery and utility executables +ifeq ($(LOCAL_MODULE_CLASS),RECOVERY_EXECUTABLES) + my_pack_module_relocations := false +endif +ifeq ($(LOCAL_MODULE_CLASS),UTILITY_EXECUTABLES) + my_pack_module_relocations := false +endif + +# TODO (dimitry): Relocation packer is not yet available for darwin +ifneq ($(HOST_OS),linux) + my_pack_module_relocations := false +endif + +ifeq (true,$(my_pack_module_relocations)) +# Pack relocations +$(relocation_packer_output): $(relocation_packer_input) | $(ACP) + $(pack-elf-relocations) else -# Skip this step. -compress_output := $(compress_input) +$(relocation_packer_output): $(relocation_packer_input) | $(ACP) + @echo "target Unpacked: $(PRIVATE_MODULE) ($@)" + $(copy-file-to-target) endif ########################################################### @@ -70,12 +93,26 @@ my_unstripped_path := $(TARGET_OUT_UNSTRIPPED)/$(patsubst $(PRODUCT_OUT)/%,%,$(m else my_unstripped_path := $(LOCAL_UNSTRIPPED_PATH) endif -symbolic_input := $(compress_output) +symbolic_input := $(relocation_packer_output) symbolic_output := $(my_unstripped_path)/$(my_installed_module_stem) $(symbolic_output) : $(symbolic_input) | $(ACP) @echo "target Symbolic: $(PRIVATE_MODULE) ($@)" $(copy-file-to-target) +########################################################### +## Store breakpad symbols +########################################################### + +ifeq ($(BREAKPAD_GENERATE_SYMBOLS),true) +my_breakpad_path := $(TARGET_OUT_BREAKPAD)/$(patsubst $(PRODUCT_OUT)/%,%,$(my_module_path)) +breakpad_input := $(relocation_packer_output) +breakpad_output := $(my_breakpad_path)/$(my_installed_module_stem).sym +$(breakpad_output) : $(breakpad_input) | $(BREAKPAD_DUMP_SYMS) + @echo "target breakpad: $(PRIVATE_MODULE) ($@)" + @mkdir -p $(dir $@) + $(hide) $(BREAKPAD_DUMP_SYMS) -c $< > $@ +$(LOCAL_BUILT_MODULE) : $(breakpad_output) +endif ########################################################### ## Strip @@ -83,23 +120,28 @@ $(symbolic_output) : $(symbolic_input) | $(ACP) strip_input := $(symbolic_output) strip_output := $(LOCAL_BUILT_MODULE) -my_strip_module := $(LOCAL_STRIP_MODULE) +my_strip_module := $(firstword \ + $(LOCAL_STRIP_MODULE_$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)) \ + $(LOCAL_STRIP_MODULE)) ifeq ($(my_strip_module),) - my_strip_module := $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_STRIP_MODULE) + my_strip_module := true endif -ifeq ($(my_strip_module),true) -# Strip the binary $(strip_output): PRIVATE_STRIP := $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_STRIP) $(strip_output): PRIVATE_OBJCOPY := $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_OBJCOPY) +$(strip_output): PRIVATE_READELF := $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_READELF) +ifeq ($(my_strip_module),no_debuglink) +$(strip_output): PRIVATE_NO_DEBUGLINK := true +else +$(strip_output): PRIVATE_NO_DEBUGLINK := +endif + +ifneq ($(filter true no_debuglink,$(my_strip_module)),) +# Strip the binary $(strip_output): $(strip_input) | $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_STRIP) $(transform-to-stripped) -else -ifeq ($(my_strip_module),keep_symbols) +else ifeq ($(my_strip_module),keep_symbols) # Strip only the debug frames, but leave the symbol table. -$(strip_output): PRIVATE_STRIP := $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_STRIP) -$(strip_output): PRIVATE_OBJCOPY := $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_OBJCOPY) -$(strip_output): PRIVATE_READELF := $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_READELF) $(strip_output): $(strip_input) | $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_STRIP) $(transform-to-stripped-keep-symbols) @@ -126,11 +168,10 @@ $(strip_output): $(strip_input) @echo "target Unstripped: $(PRIVATE_MODULE) ($@)" $(copy-file-to-target-with-cp) endif -endif endif # my_strip_module - $(cleantarget): PRIVATE_CLEAN_FILES += \ $(linked_module) \ + $(breakpad_output) \ $(symbolic_output) \ - $(compress_output) + $(strip_output) diff --git a/core/envsetup.mk b/core/envsetup.mk index 124a91b4f..69ee0e3d6 100644 --- a/core/envsetup.mk +++ b/core/envsetup.mk @@ -5,6 +5,11 @@ # the bottom for the full list # OUT_DIR is also set to "out" if it's not already set. # this allows you to set it to somewhere else if you like +# SCAN_EXCLUDE_DIRS is an optional, whitespace separated list of +# directories that will also be excluded from full checkout tree +# searches for source or make files, in addition to OUT_DIR. +# This can be useful if you set OUT_DIR to be a different directory +# than other outputs of your build system. # Set up version information. include $(BUILD_SYSTEM)/version_defaults.mk @@ -22,7 +27,7 @@ CORRECT_BUILD_ENV_SEQUENCE_NUMBER := 10 # NOTE: This will be overridden in product_config.mk if make # was invoked with a PRODUCT-xxx-yyy goal. ifeq ($(TARGET_PRODUCT),) -TARGET_PRODUCT := full +TARGET_PRODUCT := aosp_arm endif @@ -48,43 +53,33 @@ endif ifneq (,$(findstring Macintosh,$(UNAME))) HOST_OS := darwin endif -ifneq (,$(findstring CYGWIN,$(UNAME))) - HOST_OS := windows -endif + +HOST_OS_EXTRA:=$(shell python -c "import platform; print(platform.platform())") # BUILD_OS is the real host doing the build. BUILD_OS := $(HOST_OS) -# Under Linux, if USE_MINGW is set, we change HOST_OS to Windows to build the -# Windows SDK. Only a subset of tools and SDK will manage to build properly. +HOST_CROSS_OS := +# We can cross-build Windows binaries on Linux ifeq ($(HOST_OS),linux) -ifneq ($(USE_MINGW),) - HOST_OS := windows -endif +HOST_CROSS_OS := windows +HOST_CROSS_ARCH := x86 +HOST_CROSS_2ND_ARCH := x86_64 endif ifeq ($(HOST_OS),) $(error Unable to determine HOST_OS from uname -sm: $(UNAME)!) endif -# TODO: Replace BUILD_HOST_64bit with a flag that forces 32-bit build, -# after we default to 64-bit host build. -ifeq (,$(BUILD_HOST_64bit)) -# Default to 32-bit-by-default multilib host build. -HOST_PREFER_32_BIT := true -endif - # HOST_ARCH ifneq (,$(findstring x86_64,$(UNAME))) HOST_ARCH := x86_64 HOST_2ND_ARCH := x86 HOST_IS_64_BIT := true -endif - -ifeq ($(HOST_PREFER_32_BIT),true) -SDK_HOST_ARCH := x86 else -SDK_HOST_ARCH := $(HOST_ARCH) +ifneq (,$(findstring x86,$(UNAME))) +$(error Building on a 32-bit x86 host is not supported: $(UNAME)!) +endif endif BUILD_ARCH := $(HOST_ARCH) @@ -109,17 +104,15 @@ endif HOST_PREBUILT_ARCH := x86 # This is the standard way to name a directory containing prebuilt host # objects. E.g., prebuilt/$(HOST_PREBUILT_TAG)/cc -ifeq ($(HOST_OS),windows) - HOST_PREBUILT_TAG := windows -else - HOST_PREBUILT_TAG := $(HOST_OS)-$(HOST_PREBUILT_ARCH) -endif +HOST_PREBUILT_TAG := $(BUILD_OS)-$(HOST_PREBUILT_ARCH) # TARGET_COPY_OUT_* are all relative to the staging directory, ie PRODUCT_OUT. # Define them here so they can be used in product config files. TARGET_COPY_OUT_SYSTEM := system +TARGET_COPY_OUT_SYSTEM_OTHER := system_other TARGET_COPY_OUT_DATA := data TARGET_COPY_OUT_OEM := oem +TARGET_COPY_OUT_ODM := odm TARGET_COPY_OUT_ROOT := root TARGET_COPY_OUT_RECOVERY := recovery ########################################### @@ -143,16 +136,18 @@ $(warning bad TARGET_BUILD_VARIANT: $(TARGET_BUILD_VARIANT)) $(error must be empty or one of: eng user userdebug) endif +SDK_HOST_ARCH := x86 + # Boards may be defined under $(SRC_TARGET_DIR)/board/$(TARGET_DEVICE) # or under vendor/*/$(TARGET_DEVICE). Search in both places, but # make sure only one exists. # Real boards should always be associated with an OEM vendor. board_config_mk := \ - $(strip $(wildcard \ + $(strip $(sort $(wildcard \ $(SRC_TARGET_DIR)/board/$(TARGET_DEVICE)/BoardConfig.mk \ - $(shell test -d device && find device -maxdepth 4 -path '*/$(TARGET_DEVICE)/BoardConfig.mk') \ - $(shell test -d vendor && find vendor -maxdepth 4 -path '*/$(TARGET_DEVICE)/BoardConfig.mk') \ - )) + $(shell test -d device && find -L device -maxdepth 4 -path '*/$(TARGET_DEVICE)/BoardConfig.mk') \ + $(shell test -d vendor && find -L vendor -maxdepth 4 -path '*/$(TARGET_DEVICE)/BoardConfig.mk') \ + ))) ifeq ($(board_config_mk),) $(error No config file found for TARGET_DEVICE $(TARGET_DEVICE)) endif @@ -163,6 +158,10 @@ include $(board_config_mk) ifeq ($(TARGET_ARCH),) $(error TARGET_ARCH not defined by board config: $(board_config_mk)) endif +ifneq ($(MALLOC_IMPL),) + $(warning *** Unsupported option MALLOC_IMPL defined by board config: $(board_config_mk).) + $(error Use `MALLOC_SVELTE := true` to configure jemalloc for low-memory) +endif TARGET_DEVICE_DIR := $(patsubst %/,%,$(dir $(board_config_mk))) board_config_mk := @@ -170,10 +169,23 @@ board_config_mk := # Now we can substitute with the real value of TARGET_COPY_OUT_VENDOR ifeq ($(TARGET_COPY_OUT_VENDOR),$(_vendor_path_placeholder)) TARGET_COPY_OUT_VENDOR := system/vendor -else ifeq ($(filter vendor system/vendor,$(TARGET_COPY_OUT_VENDOR)),) -$(error TARGET_COPY_OUT_VENDOR must be either 'vendor' or 'system/vendor', seeing '$(TARGET_COPY_OUT_VENDOR)'.) +else ifeq ($(filter vendor system/vendor system,$(TARGET_COPY_OUT_VENDOR)),) +$(error TARGET_COPY_OUT_VENDOR must be either 'vendor', 'system/vendor' or 'system', seeing '$(TARGET_COPY_OUT_VENDOR)'.) endif PRODUCT_COPY_FILES := $(subst $(_vendor_path_placeholder),$(TARGET_COPY_OUT_VENDOR),$(PRODUCT_COPY_FILES)) + +BOARD_USES_VENDORIMAGE := +ifdef BOARD_PREBUILT_VENDORIMAGE +BOARD_USES_VENDORIMAGE := true +endif +ifdef BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE +BOARD_USES_VENDORIMAGE := true +endif +ifeq ($(TARGET_COPY_OUT_VENDOR),vendor) +BOARD_USES_VENDORIMAGE := true +else ifdef BOARD_USES_VENDORIMAGE +$(error TARGET_COPY_OUT_VENDOR must be set to 'vendor' to use a vendor image) +endif ########################################### @@ -199,9 +211,13 @@ endif ifeq (,$(strip $(OUT_DIR))) ifeq (,$(strip $(OUT_DIR_COMMON_BASE))) +ifneq ($(TOPDIR),) OUT_DIR := $(TOPDIR)out else -OUT_DIR := $(OUT_DIR_COMMON_BASE)/$(notdir $(PWD)) +OUT_DIR := $(CURDIR)/out +endif +else +OUT_DIR := $(OUT_DIR_COMMON_BASE:/=)/$(notdir $(PWD)) endif endif @@ -221,8 +237,12 @@ HOST_OUT_ROOT := $(HOST_OUT_ROOT_$(HOST_BUILD_TYPE)) HOST_OUT_release := $(HOST_OUT_ROOT_release)/$(HOST_OS)-$(HOST_PREBUILT_ARCH) HOST_OUT_debug := $(HOST_OUT_ROOT_debug)/$(HOST_OS)-$(HOST_PREBUILT_ARCH) HOST_OUT := $(HOST_OUT_$(HOST_BUILD_TYPE)) +# TODO: remove +BUILD_OUT := $(HOST_OUT) -BUILD_OUT := $(OUT_DIR)/host/$(BUILD_OS)-$(HOST_PREBUILT_ARCH) +HOST_CROSS_OUT_release := $(HOST_OUT_ROOT_release)/windows-$(HOST_PREBUILT_ARCH) +HOST_CROSS_OUT_debug := $(HOST_OUT_ROOT_debug)/windows-$(HOST_PREBUILT_ARCH) +HOST_CROSS_OUT := $(HOST_CROSS_OUT_$(HOST_BUILD_TYPE)) TARGET_PRODUCT_OUT_ROOT := $(TARGET_OUT_ROOT)/product @@ -237,9 +257,13 @@ BUILD_OUT_EXECUTABLES := $(BUILD_OUT)/bin HOST_OUT_EXECUTABLES := $(HOST_OUT)/bin HOST_OUT_SHARED_LIBRARIES := $(HOST_OUT)/lib64 +HOST_OUT_RENDERSCRIPT_BITCODE := $(HOST_OUT_SHARED_LIBRARIES) HOST_OUT_JAVA_LIBRARIES := $(HOST_OUT)/framework HOST_OUT_SDK_ADDON := $(HOST_OUT)/sdk_addon +HOST_CROSS_OUT_EXECUTABLES := $(HOST_CROSS_OUT)/bin +HOST_CROSS_OUT_SHARED_LIBRARIES := $(HOST_CROSS_OUT)/lib + HOST_OUT_INTERMEDIATES := $(HOST_OUT)/obj HOST_OUT_HEADERS := $(HOST_OUT_INTERMEDIATES)/include HOST_OUT_INTERMEDIATE_LIBRARIES := $(HOST_OUT_INTERMEDIATES)/lib @@ -247,9 +271,16 @@ HOST_OUT_NOTICE_FILES := $(HOST_OUT_INTERMEDIATES)/NOTICE_FILES HOST_OUT_COMMON_INTERMEDIATES := $(HOST_COMMON_OUT_ROOT)/obj HOST_OUT_FAKE := $(HOST_OUT)/fake_packages +HOST_CROSS_OUT_INTERMEDIATES := $(HOST_CROSS_OUT)/obj +HOST_CROSS_OUT_HEADERS := $(HOST_CROSS_OUT_INTERMEDIATES)/include +HOST_CROSS_OUT_INTERMEDIATE_LIBRARIES := $(HOST_CROSS_OUT_INTERMEDIATES)/lib +HOST_CROSS_OUT_NOTICE_FILES := $(HOST_CROSS_OUT_INTERMEDIATES)/NOTICE_FILES + HOST_OUT_GEN := $(HOST_OUT)/gen HOST_OUT_COMMON_GEN := $(HOST_COMMON_OUT_ROOT)/gen +HOST_CROSS_OUT_GEN := $(HOST_CROSS_OUT)/gen + # Out for HOST_2ND_ARCH HOST_2ND_ARCH_VAR_PREFIX := 2ND_ HOST_2ND_ARCH_MODULE_SUFFIX := _32 @@ -257,6 +288,7 @@ $(HOST_2ND_ARCH_VAR_PREFIX)HOST_OUT_INTERMEDIATES := $(HOST_OUT)/obj32 $(HOST_2ND_ARCH_VAR_PREFIX)HOST_OUT_INTERMEDIATE_LIBRARIES := $($(HOST_2ND_ARCH_VAR_PREFIX)HOST_OUT_INTERMEDIATES)/lib $(HOST_2ND_ARCH_VAR_PREFIX)HOST_OUT_SHARED_LIBRARIES := $(HOST_OUT)/lib $(HOST_2ND_ARCH_VAR_PREFIX)HOST_OUT_EXECUTABLES := $(HOST_OUT_EXECUTABLES) +$(HOST_2ND_ARCH_VAR_PREFIX)HOST_OUT_JAVA_LIBRARIES := $(HOST_OUT_JAVA_LIBRARIES) # The default host library path. # It always points to the path where we build libraries in the default bitness. @@ -266,6 +298,14 @@ else HOST_LIBRARY_PATH := $(HOST_OUT_SHARED_LIBRARIES) endif +# Out for HOST_CROSS_2ND_ARCH +HOST_CROSS_2ND_ARCH_VAR_PREFIX := 2ND_ +HOST_CROSS_2ND_ARCH_MODULE_SUFFIX := _64 +$(HOST_CROSS_2ND_ARCH_VAR_PREFIX)HOST_CROSS_OUT_INTERMEDIATES := $(HOST_CROSS_OUT)/obj64 +$(HOST_CROSS_2ND_ARCH_VAR_PREFIX)HOST_CROSS_OUT_INTERMEDIATE_LIBRARIES := $($(HOST_CROSS_2ND_ARCH_VAR_PREFIX)HOST_CROSS_OUT_INTERMEDIATES)/lib +$(HOST_CROSS_2ND_ARCH_VAR_PREFIX)HOST_CROSS_OUT_SHARED_LIBRARIES := $(HOST_CROSS_OUT)/lib64 +$(HOST_CROSS_2ND_ARCH_VAR_PREFIX)HOST_CROSS_OUT_EXECUTABLES := $(HOST_CROSS_OUT_EXECUTABLES) + TARGET_OUT_INTERMEDIATES := $(PRODUCT_OUT)/obj TARGET_OUT_HEADERS := $(TARGET_OUT_INTERMEDIATES)/include TARGET_OUT_INTERMEDIATE_LIBRARIES := $(TARGET_OUT_INTERMEDIATES)/lib @@ -275,15 +315,22 @@ TARGET_OUT_GEN := $(PRODUCT_OUT)/gen TARGET_OUT_COMMON_GEN := $(TARGET_COMMON_OUT_ROOT)/gen TARGET_OUT := $(PRODUCT_OUT)/$(TARGET_COPY_OUT_SYSTEM) +ifneq ($(filter address,$(SANITIZE_TARGET)),) +target_out_shared_libraries_base := $(PRODUCT_OUT)/$(TARGET_COPY_OUT_DATA) +else +target_out_shared_libraries_base := $(TARGET_OUT) +endif + TARGET_OUT_EXECUTABLES := $(TARGET_OUT)/bin TARGET_OUT_OPTIONAL_EXECUTABLES := $(TARGET_OUT)/xbin ifeq ($(TARGET_IS_64_BIT),true) # /system/lib always contains 32-bit libraries, # and /system/lib64 (if present) always contains 64-bit libraries. -TARGET_OUT_SHARED_LIBRARIES := $(TARGET_OUT)/lib64 +TARGET_OUT_SHARED_LIBRARIES := $(target_out_shared_libraries_base)/lib64 else -TARGET_OUT_SHARED_LIBRARIES := $(TARGET_OUT)/lib +TARGET_OUT_SHARED_LIBRARIES := $(target_out_shared_libraries_base)/lib endif +TARGET_OUT_RENDERSCRIPT_BITCODE := $(TARGET_OUT_SHARED_LIBRARIES) TARGET_OUT_JAVA_LIBRARIES := $(TARGET_OUT)/framework TARGET_OUT_APPS := $(TARGET_OUT)/app TARGET_OUT_APPS_PRIVILEGED := $(TARGET_OUT)/priv-app @@ -293,12 +340,15 @@ TARGET_OUT_ETC := $(TARGET_OUT)/etc TARGET_OUT_NOTICE_FILES := $(TARGET_OUT_INTERMEDIATES)/NOTICE_FILES TARGET_OUT_FAKE := $(PRODUCT_OUT)/fake_packages +TARGET_OUT_SYSTEM_OTHER := $(PRODUCT_OUT)/$(TARGET_COPY_OUT_SYSTEM_OTHER) + # Out for TARGET_2ND_ARCH TARGET_2ND_ARCH_VAR_PREFIX := $(HOST_2ND_ARCH_VAR_PREFIX) TARGET_2ND_ARCH_MODULE_SUFFIX := $(HOST_2ND_ARCH_MODULE_SUFFIX) $(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_INTERMEDIATES := $(PRODUCT_OUT)/obj_$(TARGET_2ND_ARCH) $(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_INTERMEDIATE_LIBRARIES := $($(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_INTERMEDIATES)/lib -$(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_SHARED_LIBRARIES := $(TARGET_OUT)/lib +$(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_SHARED_LIBRARIES := $(target_out_shared_libraries_base)/lib +$(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_RENDERSCRIPT_BITCODE := $($(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_SHARED_LIBRARIES) $(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_EXECUTABLES := $(TARGET_OUT_EXECUTABLES) $(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_APPS := $(TARGET_OUT_APPS) $(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_APPS_PRIVILEGED := $(TARGET_OUT_APPS_PRIVILEGED) @@ -313,8 +363,10 @@ TARGET_OUT_DATA_KEYCHARS := $(TARGET_OUT_KEYCHARS) TARGET_OUT_DATA_ETC := $(TARGET_OUT_ETC) ifeq ($(TARGET_IS_64_BIT),true) TARGET_OUT_DATA_NATIVE_TESTS := $(TARGET_OUT_DATA)/nativetest64 +TARGET_OUT_DATA_METRIC_TESTS := $(TARGET_OUT_DATA)/benchmarktest64 else TARGET_OUT_DATA_NATIVE_TESTS := $(TARGET_OUT_DATA)/nativetest +TARGET_OUT_DATA_METRIC_TESTS := $(TARGET_OUT_DATA)/benchmarktest endif TARGET_OUT_DATA_FAKE := $(TARGET_OUT_DATA)/fake_packages @@ -322,28 +374,35 @@ $(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_DATA_EXECUTABLES := $(TARGET_OUT_DATA_EX $(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_DATA_SHARED_LIBRARIES := $($(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_SHARED_LIBRARIES) $(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_DATA_APPS := $(TARGET_OUT_DATA_APPS) $(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_DATA_NATIVE_TESTS := $(TARGET_OUT_DATA)/nativetest +$(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_DATA_METRIC_TESTS := $(TARGET_OUT_DATA)/benchmarktest TARGET_OUT_CACHE := $(PRODUCT_OUT)/cache TARGET_OUT_VENDOR := $(PRODUCT_OUT)/$(TARGET_COPY_OUT_VENDOR) +ifneq ($(filter address,$(SANITIZE_TARGET)),) +target_out_vendor_shared_libraries_base := $(PRODUCT_OUT)/$(TARGET_COPY_OUT_DATA)/vendor +else +target_out_vendor_shared_libraries_base := $(TARGET_OUT_VENDOR) +endif + TARGET_OUT_VENDOR_EXECUTABLES := $(TARGET_OUT_VENDOR)/bin TARGET_OUT_VENDOR_OPTIONAL_EXECUTABLES := $(TARGET_OUT_VENDOR)/xbin ifeq ($(TARGET_IS_64_BIT),true) -TARGET_OUT_VENDOR_SHARED_LIBRARIES := $(TARGET_OUT_VENDOR)/lib64 +TARGET_OUT_VENDOR_SHARED_LIBRARIES := $(target_out_vendor_shared_libraries_base)/lib64 else -TARGET_OUT_VENDOR_SHARED_LIBRARIES := $(TARGET_OUT_VENDOR)/lib +TARGET_OUT_VENDOR_SHARED_LIBRARIES := $(target_out_vendor_shared_libraries_base)/lib endif TARGET_OUT_VENDOR_JAVA_LIBRARIES := $(TARGET_OUT_VENDOR)/framework TARGET_OUT_VENDOR_APPS := $(TARGET_OUT_VENDOR)/app TARGET_OUT_VENDOR_ETC := $(TARGET_OUT_VENDOR)/etc $(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_VENDOR_EXECUTABLES := $(TARGET_OUT_VENDOR_EXECUTABLES) -$(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_VENDOR_SHARED_LIBRARIES := $(TARGET_OUT_VENDOR)/lib +$(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_VENDOR_SHARED_LIBRARIES := $(target_out_vendor_shared_libraries_base)/lib $(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_VENDOR_APPS := $(TARGET_OUT_VENDOR_APPS) TARGET_OUT_OEM := $(PRODUCT_OUT)/$(TARGET_COPY_OUT_OEM) TARGET_OUT_OEM_EXECUTABLES := $(TARGET_OUT_OEM)/bin -ifneq ($(filter %64,$(TARGET_ARCH)),) +ifeq ($(TARGET_IS_64_BIT),true) TARGET_OUT_OEM_SHARED_LIBRARIES := $(TARGET_OUT_OEM)/lib64 else TARGET_OUT_OEM_SHARED_LIBRARIES := $(TARGET_OUT_OEM)/lib @@ -357,6 +416,22 @@ $(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_OEM_EXECUTABLES := $(TARGET_OUT_OEM_EXEC $(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_OEM_SHARED_LIBRARIES := $(TARGET_OUT_OEM)/lib $(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_OEM_APPS := $(TARGET_OUT_OEM_APPS) +TARGET_OUT_ODM := $(PRODUCT_OUT)/$(TARGET_COPY_OUT_ODM) +TARGET_OUT_ODM_EXECUTABLES := $(TARGET_OUT_ODM)/bin +ifeq ($(TARGET_IS_64_BIT),true) +TARGET_OUT_ODM_SHARED_LIBRARIES := $(TARGET_OUT_ODM)/lib64 +else +TARGET_OUT_ODM_SHARED_LIBRARIES := $(TARGET_OUT_ODM)/lib +endif +TARGET_OUT_ODM_APPS := $(TARGET_OUT_ODM)/app +TARGET_OUT_ODM_ETC := $(TARGET_OUT_ODM)/etc + +$(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_ODM_EXECUTABLES := $(TARGET_OUT_ODM_EXECUTABLES) +$(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_ODM_SHARED_LIBRARIES := $(TARGET_OUT_ODM)/lib +$(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_ODM_APPS := $(TARGET_OUT_ODM_APPS) + +TARGET_OUT_BREAKPAD := $(PRODUCT_OUT)/breakpad + TARGET_OUT_UNSTRIPPED := $(PRODUCT_OUT)/symbols TARGET_OUT_EXECUTABLES_UNSTRIPPED := $(TARGET_OUT_UNSTRIPPED)/system/bin TARGET_OUT_SHARED_LIBRARIES_UNSTRIPPED := $(TARGET_OUT_UNSTRIPPED)/system/lib @@ -383,9 +458,8 @@ TARGET_INSTALLER_DATA_OUT := $(TARGET_INSTALLER_OUT)/data TARGET_INSTALLER_ROOT_OUT := $(TARGET_INSTALLER_OUT)/root TARGET_INSTALLER_SYSTEM_OUT := $(TARGET_INSTALLER_OUT)/root/system -TARGET_FACTORY_RAMDISK_OUT := $(PRODUCT_OUT)/factory_ramdisk - COMMON_MODULE_CLASSES := TARGET-NOTICE_FILES HOST-NOTICE_FILES HOST-JAVA_LIBRARIES +PER_ARCH_MODULE_CLASSES := SHARED_LIBRARIES STATIC_LIBRARIES EXECUTABLES GYP RENDERSCRIPT_BITCODE ifeq (,$(strip $(DIST_DIR))) DIST_DIR := $(OUT_DIR)/dist @@ -394,3 +468,7 @@ endif ifeq ($(PRINT_BUILD_CONFIG),) PRINT_BUILD_CONFIG := true endif + +ifeq ($(USE_CLANG_PLATFORM_BUILD),) +USE_CLANG_PLATFORM_BUILD := true +endif diff --git a/core/executable.mk b/core/executable.mk index 4dd9a2349..5a33db7bb 100644 --- a/core/executable.mk +++ b/core/executable.mk @@ -6,6 +6,17 @@ # LOCAL_MODULE_PATH_32 and LOCAL_MODULE_PATH_64 or LOCAL_MODULE_STEM_32 and # LOCAL_MODULE_STEM_64 +my_skip_this_target := +ifneq ($(filter address,$(SANITIZE_TARGET)),) + ifeq (true,$(LOCAL_FORCE_STATIC_EXECUTABLE)) + my_skip_this_target := true + else ifeq (false, $(LOCAL_CLANG)) + my_skip_this_target := true + endif +endif + +ifneq (true,$(my_skip_this_target)) + my_prefix := TARGET_ include $(BUILD_SYSTEM)/multilib.mk @@ -31,6 +42,10 @@ endif my_skip_non_preferred_arch := +ifeq ($(LOCAL_SDCLANG), true) +include $(SDCLANG_FLAG_DEFS) +endif + # check if preferred arch is supported include $(BUILD_SYSTEM)/module_arch_supported.mk ifeq ($(my_module_arch_supported),true) @@ -59,9 +74,6 @@ ifeq ($(my_module_arch_supported),true) OVERRIDE_BUILT_MODULE_PATH := LOCAL_BUILT_MODULE := LOCAL_INSTALLED_MODULE := -LOCAL_MODULE_STEM := -LOCAL_BUILT_MODULE_STEM := -LOCAL_INSTALLED_MODULE_STEM := LOCAL_INTERMEDIATE_TARGETS := include $(BUILD_SYSTEM)/executable_internal.mk endif @@ -71,3 +83,11 @@ LOCAL_2ND_ARCH_VAR_PREFIX := LOCAL_NO_2ND_ARCH_MODULE_SUFFIX := my_module_arch_supported := + +ifeq ($(LOCAL_SDCLANG), true) +ifeq ($(LOCAL_SDCLANG_LTO), true) +include $(SDCLANG_LTO_DEFS) +endif +endif + +endif diff --git a/core/executable_internal.mk b/core/executable_internal.mk index 93252875f..febea98f6 100644 --- a/core/executable_internal.mk +++ b/core/executable_internal.mk @@ -35,11 +35,21 @@ endif # Define PRIVATE_ variables from global vars my_target_global_ld_dirs := $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_GLOBAL_LD_DIRS) +ifeq ($(LOCAL_NO_LIBGCC),true) +my_target_libgcc := +else my_target_libgcc := $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_LIBGCC) +endif my_target_libatomic := $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_LIBATOMIC) +ifeq ($(LOCAL_NO_CRT),true) +my_target_crtbegin_dynamic_o := +my_target_crtbegin_static_o := +my_target_crtend_o := +else my_target_crtbegin_dynamic_o := $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_CRTBEGIN_DYNAMIC_O) my_target_crtbegin_static_o := $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_CRTBEGIN_STATIC_O) my_target_crtend_o := $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_CRTEND_O) +endif ifdef LOCAL_SDK_VERSION # Make sure the prebuilt NDK paths are put ahead of the TARGET_GLOBAL_LD_DIRS, # so we don't have race condition when the system libraries (such as libc, libstdc++) are also built in the tree. @@ -60,13 +70,16 @@ $(linked_module): PRIVATE_TARGET_CRTBEGIN_DYNAMIC_O := $(my_target_crtbegin_dyna $(linked_module): PRIVATE_TARGET_CRTBEGIN_STATIC_O := $(my_target_crtbegin_static_o) $(linked_module): PRIVATE_TARGET_CRTEND_O := $(my_target_crtend_o) $(linked_module): PRIVATE_TARGET_OUT_INTERMEDIATE_LIBRARIES := $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_OUT_INTERMEDIATE_LIBRARIES) +$(linked_module): PRIVATE_POST_LINK_CMD := $(LOCAL_POST_LINK_CMD) ifeq ($(LOCAL_FORCE_STATIC_EXECUTABLE),true) $(linked_module): $(my_target_crtbegin_static_o) $(all_objects) $(all_libraries) $(my_target_crtend_o) $(transform-o-to-static-executable) + $(PRIVATE_POST_LINK_CMD) else $(linked_module): $(my_target_crtbegin_dynamic_o) $(all_objects) $(all_libraries) $(my_target_crtend_o) $(transform-o-to-executable) + $(PRIVATE_POST_LINK_CMD) endif endif # skip_build_from_source diff --git a/core/executable_prefer_symlink.mk b/core/executable_prefer_symlink.mk index 2326e83a0..931550f4f 100644 --- a/core/executable_prefer_symlink.mk +++ b/core/executable_prefer_symlink.mk @@ -39,7 +39,10 @@ $(my_symlink): PRIVATE_SRC_BINARY_NAME := $(LOCAL_MODULE_STEM_32) endif endif -$(my_symlink): $(LOCAL_INSTALLED_MODULE) $(LOCAL_MODULE_MAKEFILE) +# $(my_symlink) doesn't need to depend on $(PRIVATE_SRC_BINARY_NAME): we can generate symlink to nonexistent file. +# If you add the dependency, make would compare the timestamp of a file against that of its symlink: +# they are always equal, because make follows symlink. +$(my_symlink): $(LOCAL_MODULE_MAKEFILE_DEP) @echo "Symlink: $@ -> $(PRIVATE_SRC_BINARY_NAME)" @mkdir -p $(dir $@) @rm -rf $@ diff --git a/core/find-jdk-tools-jar.sh b/core/find-jdk-tools-jar.sh index f150a9abd..ac0b3b6b5 100755 --- a/core/find-jdk-tools-jar.sh +++ b/core/find-jdk-tools-jar.sh @@ -2,7 +2,13 @@ if [ "x$ANDROID_JAVA_HOME" != x ] && [ -e "$ANDROID_JAVA_HOME/lib/tools.jar" ] ; then echo $ANDROID_JAVA_HOME/lib/tools.jar else - JAVAC=$(which javac) + JAVAC=$(realpath $(which javac) 2>/dev/null) + if [ -z "$JAVAC" ]; then + JAVAC=$(readlink -f $(which javac) 2>/dev/null) + fi + if [ -z "$JAVAC" ]; then + JAVAC=$(which javac) + fi if [ -z "$JAVAC" ] ; then exit 1 fi @@ -10,5 +16,5 @@ else LSLINE=$(ls -l "$JAVAC") JAVAC=$(echo -n "$LSLINE" | sed -e "s/.* -> //") done - echo $JAVAC | sed -e "s:\(.*\)/bin/javac.*:\\1/lib/tools.jar:" + echo $JAVAC | sed -e 's:\(.*\)/javac$:\1/../lib/tools.jar:' fi diff --git a/core/fuzz_test.mk b/core/fuzz_test.mk new file mode 100644 index 000000000..fc582b3fe --- /dev/null +++ b/core/fuzz_test.mk @@ -0,0 +1,34 @@ +########################################### +## A thin wrapper around BUILD_EXECUTABLE +## Common flags for fuzz tests are added. +########################################### + +ifdef LOCAL_SDK_VERSION + $(error $(LOCAL_PATH): $(LOCAL_MODULE): NDK fuzz tests are not supported.) +endif + +LOCAL_CFLAGS += -fsanitize-coverage=edge,indirect-calls,8bit-counters,trace-cmp +LOCAL_STATIC_LIBRARIES += libLLVMFuzzer + +ifdef LOCAL_MODULE_PATH +$(error $(LOCAL_PATH): Do not set LOCAL_MODULE_PATH when building test $(LOCAL_MODULE)) +endif + +ifdef LOCAL_MODULE_PATH_32 +$(error $(LOCAL_PATH): Do not set LOCAL_MODULE_PATH_32 when building test $(LOCAL_MODULE)) +endif + +ifdef LOCAL_MODULE_PATH_64 +$(error $(LOCAL_PATH): Do not set LOCAL_MODULE_PATH_64 when building test $(LOCAL_MODULE)) +endif + +LOCAL_MODULE_PATH_64 := $(TARGET_OUT_DATA_NATIVE_TESTS)/$(LOCAL_MODULE) +LOCAL_MODULE_PATH_32 := $($(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_DATA_NATIVE_TESTS)/$(LOCAL_MODULE) + +ifndef LOCAL_MULTILIB +ifndef LOCAL_32_BIT_ONLY +LOCAL_MULTILIB := both +endif +endif + +include $(BUILD_EXECUTABLE) diff --git a/core/generate_extra_images.mk b/core/generate_extra_images.mk new file mode 100644 index 000000000..664b963f1 --- /dev/null +++ b/core/generate_extra_images.mk @@ -0,0 +1,114 @@ +# 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_RECOVERYIMAGE_TARGET := $(PRODUCT_OUT)/recovery.img +INSTALLED_USERDATAIMAGE_TARGET := $(PRODUCT_OUT)/userdata.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 + +intermediates := $(call intermediates-dir-for,PACKAGING,recovery_patch) +RECOVERY_FROM_BOOT_PATCH := $(intermediates)/recovery_from_boot.p + +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)) + +ALL_DEFAULT_INSTALLED_MODULES += $(INSTALLED_SEC_RECOVERYIMAGE_TARGET) +ALL_MODULES.$(LOCAL_MODULE).INSTALLED += $(INSTALLED_SEC_RECOVERYIMAGE_TARGET) +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 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 + +.PHONY: aboot +aboot: $(INSTALLED_BOOTLOADER_MODULE) + +.PHONY: sec_bootimage +sec_bootimage: $(INSTALLED_BOOTIMAGE_TARGET) $(INSTALLED_SEC_BOOTIMAGE_TARGET) + +.PHONY: sec_recoveryimage +sec_recoveryimage: $(INSTALLED_RECOVERYIMAGE_TARGET) $(INSTALLED_SEC_RECOVERYIMAGE_TARGET) + +.PHONY: persistimage +persistimage: $(INSTALLED_PERSISTIMAGE_TARGET) diff --git a/core/goma.mk b/core/goma.mk new file mode 100644 index 000000000..6535b3e4a --- /dev/null +++ b/core/goma.mk @@ -0,0 +1,67 @@ +# +# Copyright (C) 2015 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. +# + +# Notice: this works only with Google's Goma build infrastructure. +ifneq ($(filter-out false,$(USE_GOMA)),) + # Check if USE_NINJA is not false because GNU make won't work well + # with goma. Note this file is evaluated twice, once by GNU make and + # once by kati with USE_NINJA=false. We do this check in the former + # pass. + ifndef KATI + ifeq ($(USE_NINJA),false) + $(error USE_GOMA=true is not compatible with USE_NINJA=false) + endif + endif + + # Goma requires a lot of processes and file descriptors. + ifeq ($(shell echo $$(($$(ulimit -u) < 2500 || $$(ulimit -n) < 16000))),1) + $(warning Max user processes and/or open files are insufficient) + ifeq ($(shell uname),Darwin) + $(error See go/ma/how-to-use-goma/how-to-use-goma-for-android to relax the limit) + else + $(error Adjust the limit by ulimit -u and ulimit -n) + endif + endif + + ifdef GOMA_DIR + goma_dir := $(GOMA_DIR) + else + goma_dir := $(HOME)/goma + endif + goma_ctl := $(goma_dir)/goma_ctl.py + GOMA_CC := $(goma_dir)/gomacc + + $(if $(wildcard $(goma_ctl)),, \ + $(warning You should have goma in $$GOMA_DIR or $(HOME)/goma) \ + $(error See go/ma/how-to-use-goma/how-to-use-goma-for-android for detail)) + + # Append gomacc to existing *_WRAPPER variables so it's possible to + # use both ccache and gomacc. + CC_WRAPPER := $(strip $(CC_WRAPPER) $(GOMA_CC)) + CXX_WRAPPER := $(strip $(CXX_WRAPPER) $(GOMA_CC)) + + # gomacc can start goma client's daemon process automatically, but + # it is safer and faster to start up it beforehand. We run this as a + # background process so this won't slow down the build. + # We use "ensure_start" command when the compiler_proxy is already + # running and uses GOMA_HERMETIC=error flag. The compiler_proxy will + # restart otherwise. + # TODO(hamaji): Remove this condition after http://b/25676777 is fixed. + $(shell ( if ( curl http://localhost:$$($(GOMA_CC) port)/flagz | grep GOMA_HERMETIC=error ); then cmd=ensure_start; else cmd=restart; fi; GOMA_HERMETIC=error $(goma_ctl) $${cmd} ) &> /dev/null &) + + goma_ctl := + goma_dir := +endif diff --git a/core/host_dalvik_java_library.mk b/core/host_dalvik_java_library.mk index 61eb3ffa4..83047d4c3 100644 --- a/core/host_dalvik_java_library.mk +++ b/core/host_dalvik_java_library.mk @@ -20,6 +20,7 @@ # They will be compiled against libcore and not the host JRE. # +ifeq ($(HOST_OS),linux) USE_CORE_LIB_BOOTCLASSPATH := true ####################################### @@ -27,50 +28,61 @@ include $(BUILD_SYSTEM)/host_java_library_common.mk ####################################### ifneq ($(LOCAL_NO_STANDARD_LIBRARIES),true) - LOCAL_JAVA_LIBRARIES += core-libart-hostdex + LOCAL_JAVA_LIBRARIES += core-oj-hostdex core-libart-hostdex endif full_classes_compiled_jar := $(intermediates.COMMON)/classes-full-debug.jar full_classes_jarjar_jar := $(intermediates.COMMON)/classes-jarjar.jar full_classes_jar := $(intermediates.COMMON)/classes.jar +full_classes_jack := $(intermediates.COMMON)/classes.jack +jack_check_timestamp := $(intermediates.COMMON)/jack.check.timestamp built_dex := $(intermediates.COMMON)/classes.dex LOCAL_INTERMEDIATE_TARGETS += \ $(full_classes_compiled_jar) \ $(full_classes_jarjar_jar) \ + $(full_classes_jack) \ $(full_classes_jar) \ + $(jack_check_timestamp) \ $(built_dex) # See comment in java.mk -java_alternative_checked_module := $(full_classes_compiled_jar) +ifndef LOCAL_CHECKED_MODULE +ifdef LOCAL_JACK_ENABLED +LOCAL_CHECKED_MODULE := $(jack_check_timestamp) +else +LOCAL_CHECKED_MODULE := $(full_classes_compiled_jar) +endif +endif ####################################### include $(BUILD_SYSTEM)/base_rules.mk ####################################### +java_sources := $(addprefix $(LOCAL_PATH)/, $(filter %.java,$(LOCAL_SRC_FILES))) \ + $(filter %.java,$(LOCAL_GENERATED_SOURCES)) +all_java_sources := $(java_sources) -$(full_classes_compiled_jar): PRIVATE_JAVAC_DEBUG_FLAGS := -g - -java_alternative_checked_module := +include $(BUILD_SYSTEM)/java_common.mk # 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)) -$(LOCAL_INTERMEDIATE_TARGETS): \ - PRIVATE_CLASS_INTERMEDIATES_DIR := $(intermediates.COMMON)/classes -$(LOCAL_INTERMEDIATE_TARGETS): \ - PRIVATE_SOURCE_INTERMEDIATES_DIR := $(LOCAL_INTERMEDIATE_SOURCE_DIR) - $(cleantarget): PRIVATE_CLEAN_FILES += $(intermediates.COMMON) $(full_classes_compiled_jar): PRIVATE_JAVA_LAYERS_FILE := $(layers_file) -$(full_classes_compiled_jar): PRIVATE_JAVACFLAGS := $(LOCAL_JAVACFLAGS) +$(full_classes_compiled_jar): PRIVATE_JAVACFLAGS := $(GLOBAL_JAVAC_DEBUG_FLAGS) $(LOCAL_JAVACFLAGS) $(full_classes_compiled_jar): PRIVATE_JAR_EXCLUDE_FILES := $(full_classes_compiled_jar): PRIVATE_JAR_PACKAGES := $(full_classes_compiled_jar): PRIVATE_JAR_EXCLUDE_PACKAGES := -$(full_classes_compiled_jar): PRIVATE_RMTYPEDEFS := -$(full_classes_compiled_jar): $(java_sources) $(java_resource_sources) $(full_java_lib_deps) \ - $(jar_manifest_file) $(proto_java_sources_file_stamp) $(LOCAL_ADDITIONAL_DEPENDENCIES) +$(full_classes_compiled_jar): \ + $(java_sources) \ + $(java_resource_sources) \ + $(full_java_lib_deps) \ + $(jar_manifest_file) \ + $(proto_java_sources_file_stamp) \ + $(LOCAL_MODULE_MAKEFILE_DEP) \ + $(LOCAL_ADDITIONAL_DEPENDENCIES) $(transform-host-java-to-package) # Run jarjar if necessary, otherwise just copy the file. @@ -89,19 +101,58 @@ $(full_classes_jar): $(full_classes_jarjar_jar) | $(ACP) @echo Copying: $@ $(hide) $(ACP) -fp $< $@ -$(built_dex): PRIVATE_INTERMEDIATES_DIR := $(intermediates.COMMON) -$(built_dex): PRIVATE_DX_FLAGS := $(LOCAL_DX_FLAGS) -$(built_dex): $(full_classes_jar) $(DX) - $(transform-classes.jar-to-dex) +ifndef LOCAL_JACK_ENABLED $(LOCAL_BUILT_MODULE): PRIVATE_DEX_FILE := $(built_dex) +$(LOCAL_BUILT_MODULE): PRIVATE_SOURCE_ARCHIVE := $(full_classes_jarjar_jar) +$(LOCAL_BUILT_MODULE): PRIVATE_DONT_DELETE_JAR_DIRS := $(LOCAL_DONT_DELETE_JAR_DIRS) $(LOCAL_BUILT_MODULE): $(built_dex) $(java_resource_sources) @echo "Host Jar: $(PRIVATE_MODULE) ($@)" - $(create-empty-package) + $(call initialize-package-file,$(PRIVATE_SOURCE_ARCHIVE),$@) $(add-dex-to-package) - $(add-carried-java-resources) -ifneq ($(extra_jar_args),) - $(add-java-resources-to-package) + +else # LOCAL_JACK_ENABLED +$(LOCAL_INTERMEDIATE_TARGETS): \ + PRIVATE_JACK_INTERMEDIATES_DIR := $(intermediates.COMMON)/jack-rsc + +ifeq ($(LOCAL_JACK_ENABLED),incremental) +$(LOCAL_INTERMEDIATE_TARGETS): \ + PRIVATE_JACK_INCREMENTAL_DIR := $(intermediates.COMMON)/jack-incremental +else +$(LOCAL_INTERMEDIATE_TARGETS): \ + PRIVATE_JACK_INCREMENTAL_DIR := endif +$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_JACK_FLAGS := $(GLOBAL_JAVAC_DEBUG_FLAGS) $(LOCAL_JACK_FLAGS) +$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_JACK_VERSION := $(LOCAL_JACK_VERSION) +$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_JACK_MIN_SDK_VERSION := $(PLATFORM_JACK_MIN_SDK_VERSION) + +jack_all_deps := $(java_sources) $(java_resource_sources) $(full_jack_deps) \ + $(jar_manifest_file) $(proto_java_sources_file_stamp) $(LOCAL_MODULE_MAKEFILE_DEP) \ + $(LOCAL_ADDITIONAL_DEPENDENCIES) $(JACK) +$(built_dex): PRIVATE_CLASSES_JACK := $(full_classes_jack) +$(built_dex): $(jack_all_deps) | setup-jack-server + @echo Building with Jack: $@ + $(jack-java-to-dex) + +$(jack_check_timestamp): $(jack_all_deps) | setup-jack-server + @echo Checking build with Jack: $@ + $(jack-check-java) + +# $(full_classes_jack) is just by-product of $(built_dex). +# The dummy command was added because, without it, make misses the fact the $(built_dex) also +# change $(full_classes_jack). +$(full_classes_jack): $(built_dex) + $(hide) touch $@ + +$(LOCAL_BUILT_MODULE): PRIVATE_DEX_FILE := $(built_dex) +$(LOCAL_BUILT_MODULE): $(built_dex) $(java_resource_sources) + @echo "Host Jar: $(PRIVATE_MODULE) ($@)" + $(create-empty-package) + $(add-dex-to-package) + $(add-carried-jack-resources) + +endif # LOCAL_JACK_ENABLED USE_CORE_LIB_BOOTCLASSPATH := + +endif diff --git a/core/host_dalvik_static_java_library.mk b/core/host_dalvik_static_java_library.mk index 3ae74e42f..c296be359 100644 --- a/core/host_dalvik_static_java_library.mk +++ b/core/host_dalvik_static_java_library.mk @@ -19,10 +19,42 @@ # These libraries will be compiled against libcore and not the host # JRE. # +ifeq ($(HOST_OS),linux) +LOCAL_UNINSTALLABLE_MODULE := true +LOCAL_IS_STATIC_JAVA_LIBRARY := true USE_CORE_LIB_BOOTCLASSPATH := true -LOCAL_JAVA_LIBRARIES += core-libart-hostdex +LOCAL_JAVA_LIBRARIES += core-oj-hostdex core-libart-hostdex + +intermediates.COMMON := $(call intermediates-dir-for,JAVA_LIBRARIES,$(LOCAL_MODULE),true,COMMON,) +full_classes_jack := $(intermediates.COMMON)/classes.jack +LOCAL_INTERMEDIATE_TARGETS += \ + $(full_classes_jack) include $(BUILD_SYSTEM)/host_java_library.mk +# proguard is not supported +# *.proto files are not supported +$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_JACK_FLAGS := $(GLOBAL_JAVAC_DEBUG_FLAGS) $(LOCAL_JACK_FLAGS) +$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_JACK_VERSION := $(LOCAL_JACK_VERSION) +$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_JACK_MIN_SDK_VERSION := $(PLATFORM_JACK_MIN_SDK_VERSION) + +$(full_classes_jack): PRIVATE_JARJAR_RULES := $(LOCAL_JARJAR_RULES) +$(full_classes_jack): \ + PRIVATE_JACK_INTERMEDIATES_DIR := $(intermediates.COMMON)/jack-rsc +ifeq ($(LOCAL_JACK_ENABLED),incremental) +$(full_classes_jack): \ + PRIVATE_JACK_INCREMENTAL_DIR := $(intermediates.COMMON)/jack-incremental +else +$(full_classes_jack): \ + PRIVATE_JACK_INCREMENTAL_DIR := +endif +$(full_classes_jack): $(java_sources) $(java_resource_sources) $(full_jack_deps) \ + $(jar_manifest_file) $(layers_file) $(LOCAL_MODULE_MAKEFILE_DEP) \ + $(LOCAL_ADDITIONAL_DEPENDENCIES) $(LOCAL_JARJAR_RULES) \ + $(JACK) | setup-jack-server + @echo Building with Jack: $@ + $(java-to-jack) USE_CORE_LIB_BOOTCLASSPATH := +LOCAL_IS_STATIC_JAVA_LIBRARY := +endif diff --git a/core/host_executable.mk b/core/host_executable.mk index bf3cde1fd..6f19bd173 100644 --- a/core/host_executable.mk +++ b/core/host_executable.mk @@ -1,5 +1,6 @@ - +LOCAL_IS_HOST_MODULE := true my_prefix := HOST_ +LOCAL_HOST_PREFIX := include $(BUILD_SYSTEM)/multilib.mk ifndef LOCAL_MODULE_HOST_ARCH @@ -13,6 +14,10 @@ endif endif endif +ifeq ($(LOCAL_NO_FPIE),) +LOCAL_LDFLAGS += $(HOST_FPIE_FLAGS) +endif + ifeq ($(my_module_multilib),both) ifeq ($(LOCAL_MODULE_PATH_32)$(LOCAL_MODULE_STEM_32),) $(error $(LOCAL_PATH): LOCAL_MODULE_STEM_32 or LOCAL_MODULE_PATH_32 is required for LOCAL_MULTILIB := both for module $(LOCAL_MODULE)) @@ -46,5 +51,57 @@ endif LOCAL_2ND_ARCH_VAR_PREFIX := endif # HOST_2ND_ARCH +ifdef HOST_CROSS_OS +my_prefix := HOST_CROSS_ +LOCAL_HOST_PREFIX := $(my_prefix) +include $(BUILD_SYSTEM)/module_arch_supported.mk +ifeq ($(my_module_arch_supported),true) +# Build for Windows +OVERRIDE_BUILT_MODULE_PATH := +# we don't want others using the cross compiled version +saved_LOCAL_BUILT_MODULE := $(LOCAL_BUILT_MODULE) +saved_LOCAL_INSTALLED_MODULE := $(LOCAL_INSTALLED_MODULE) +saved_LOCAL_LDFLAGS := $(LOCAL_LDFLAGS) +LOCAL_BUILT_MODULE := +LOCAL_INSTALLED_MODULE := +LOCAL_INTERMEDIATE_TARGETS := + +ifeq ($(LOCAL_NO_FPIE),) +LOCAL_LDFLAGS += $(HOST_CROSS_FPIE_FLAGS) +endif + +include $(BUILD_SYSTEM)/host_executable_internal.mk +LOCAL_LDFLAGS := $(saved_LOCAL_LDFLAGS) +LOCAL_BUILT_MODULE := $(saved_LOCAL_BUILT_MODULE) +LOCAL_INSTALLED_MODULE := $(saved_LOCAL_INSTALLED_MODULE) +endif + +ifdef HOST_CROSS_2ND_ARCH +LOCAL_2ND_ARCH_VAR_PREFIX := $(HOST_CROSS_2ND_ARCH_VAR_PREFIX) +include $(BUILD_SYSTEM)/module_arch_supported.mk +ifeq ($(my_module_arch_supported),true) +OVERRIDE_BUILT_MODULE_PATH := +# we don't want others using the cross compiled version +saved_LOCAL_BUILT_MODULE := $(LOCAL_BUILT_MODULE) +saved_LOCAL_INSTALLED_MODULE := $(LOCAL_INSTALLED_MODULE) +saved_LOCAL_LDFLAGS := $(LOCAL_LDFLAGS) +LOCAL_BUILT_MODULE := +LOCAL_INSTALLED_MODULE := +LOCAL_INTERMEDIATE_TARGETS := + +ifeq ($(LOCAL_NO_FPIE),) +LOCAL_LDFLAGS += $(HOST_CROSS_FPIE_FLAGS) +endif + +include $(BUILD_SYSTEM)/host_executable_internal.mk +LOCAL_LDFLAGS := $(saved_LOCAL_LDFLAGS) +LOCAL_BUILT_MODULE := $(saved_LOCAL_BUILT_MODULE) +LOCAL_INSTALLED_MODULE := $(saved_LOCAL_INSTALLED_MODULE) +endif +LOCAL_2ND_ARCH_VAR_PREFIX := +endif +LOCAL_HOST_PREFIX := +endif + LOCAL_NO_2ND_ARCH_MODULE_SUFFIX := my_module_arch_supported := diff --git a/core/host_executable_internal.mk b/core/host_executable_internal.mk index ffb35d2a1..b682ffdaa 100644 --- a/core/host_executable_internal.mk +++ b/core/host_executable_internal.mk @@ -5,12 +5,11 @@ ## None. ########################################################### -LOCAL_IS_HOST_MODULE := true ifeq ($(strip $(LOCAL_MODULE_CLASS)),) LOCAL_MODULE_CLASS := EXECUTABLES endif ifeq ($(strip $(LOCAL_MODULE_SUFFIX)),) -LOCAL_MODULE_SUFFIX := $(HOST_EXECUTABLE_SUFFIX) +LOCAL_MODULE_SUFFIX := $($(my_prefix)EXECUTABLE_SUFFIX) endif $(call host-executable-hook) @@ -27,6 +26,9 @@ ifndef skip_build_from_source include $(BUILD_SYSTEM)/binary.mk +my_host_libprofile_rt := $($(LOCAL_2ND_ARCH_VAR_PREFIX)$(my_prefix)LIBPROFILE_RT) +$(LOCAL_BUILT_MODULE): PRIVATE_HOST_LIBPROFILE_RT := $(my_host_libprofile_rt) + $(LOCAL_BUILT_MODULE): $(all_objects) $(all_libraries) $(transform-host-o-to-executable) diff --git a/core/host_fuzz_test.mk b/core/host_fuzz_test.mk new file mode 100644 index 000000000..cc7baada1 --- /dev/null +++ b/core/host_fuzz_test.mk @@ -0,0 +1,9 @@ +################################################ +## A thin wrapper around BUILD_HOST_EXECUTABLE +## Common flags for host fuzz tests are added. +################################################ + +LOCAL_CFLAGS += -fsanitize-coverage=edge,indirect-calls,8bit-counters,trace-cmp +LOCAL_STATIC_LIBRARIES += libLLVMFuzzer + +include $(BUILD_HOST_EXECUTABLE) diff --git a/core/host_java_library.mk b/core/host_java_library.mk index 7e0e4372e..97079fd37 100644 --- a/core/host_java_library.mk +++ b/core/host_java_library.mk @@ -30,19 +30,58 @@ endif endif full_classes_compiled_jar := $(intermediates.COMMON)/classes-full-debug.jar +full_classes_jarjar_jar := $(intermediates.COMMON)/classes-jarjar.jar 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/$(notdir $(full_classes_compiled_jar)) +full_classes_emma_jar := $(emma_intermediates_dir)/lib/$(notdir $(full_classes_jarjar_jar)) LOCAL_INTERMEDIATE_TARGETS += \ $(full_classes_compiled_jar) \ + $(full_classes_jarjar_jar) \ $(full_classes_emma_jar) ####################################### include $(BUILD_SYSTEM)/base_rules.mk ####################################### +java_sources := $(addprefix $(LOCAL_PATH)/, $(filter %.java,$(LOCAL_SRC_FILES))) \ + $(filter %.java,$(LOCAL_GENERATED_SOURCES)) +all_java_sources := $(java_sources) + +include $(BUILD_SYSTEM)/java_common.mk + +# 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_JAVACFLAGS := $(GLOBAL_JAVAC_DEBUG_FLAGS) $(LOCAL_JAVACFLAGS) +$(full_classes_compiled_jar): PRIVATE_JAR_EXCLUDE_FILES := +$(full_classes_compiled_jar): PRIVATE_JAR_PACKAGES := +$(full_classes_compiled_jar): PRIVATE_JAR_EXCLUDE_PACKAGES := +$(full_classes_compiled_jar): \ + $(java_sources) \ + $(java_resource_sources) \ + $(full_java_lib_deps) \ + $(jar_manifest_file) \ + $(proto_java_sources_file_stamp) \ + $(LOCAL_MODULE_MAKEFILE_DEP) \ + $(LOCAL_ADDITIONAL_DEPENDENCIES) + $(transform-host-java-to-package) + +# 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 (true,$(LOCAL_EMMA_INSTRUMENT)) $(full_classes_emma_jar): PRIVATE_EMMA_COVERAGE_FILE := $(intermediates.COMMON)/coverage.em $(full_classes_emma_jar): PRIVATE_EMMA_INTERMEDIATES_DIR := $(emma_intermediates_dir) @@ -55,30 +94,16 @@ $(full_classes_emma_jar): PRIVATE_EMMA_COVERAGE_FILTER := *,-emma,-emmarun,-com. endif # this rule will generate both $(PRIVATE_EMMA_COVERAGE_FILE) and # $(full_classes_emma_jar) -$(full_classes_emma_jar) : $(full_classes_compiled_jar) | $(EMMA_JAR) +$(full_classes_emma_jar) : $(full_classes_jarjar_jar) | $(EMMA_JAR) $(transform-classes.jar-to-emma) -$(LOCAL_BUILT_MODULE) : $(full_classes_emma_jar) +$(built_javalib_jar) : $(full_classes_emma_jar) @echo Copying: $@ $(hide) $(ACP) -fp $< $@ else # LOCAL_EMMA_INSTRUMENT -# Directly build into LOCAL_BUILT_MODULE. -full_classes_compiled_jar := $(LOCAL_BUILT_MODULE) +$(built_javalib_jar): $(full_classes_jarjar_jar) | $(ACP) + @echo Copying: $@ + $(hide) $(ACP) -fp $< $@ 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)) - -$(full_classes_compiled_jar): PRIVATE_JAVA_LAYERS_FILE := $(layers_file) -$(full_classes_compiled_jar): PRIVATE_JAVACFLAGS := $(LOCAL_JAVACFLAGS) -$(full_classes_compiled_jar): PRIVATE_JAR_EXCLUDE_FILES := -$(full_classes_compiled_jar): PRIVATE_JAR_PACKAGES := -$(full_classes_compiled_jar): PRIVATE_JAR_EXCLUDE_PACKAGES := -$(full_classes_compiled_jar): PRIVATE_RMTYPEDEFS := -$(full_classes_compiled_jar): $(java_sources) $(java_resource_sources) $(full_java_lib_deps) \ - $(jar_manifest_file) $(proto_java_sources_file_stamp) $(LOCAL_ADDITIONAL_DEPENDENCIES) - $(transform-host-java-to-package) diff --git a/core/host_java_library_common.mk b/core/host_java_library_common.mk index 973afa03f..35a6e28ed 100644 --- a/core/host_java_library_common.mk +++ b/core/host_java_library_common.mk @@ -23,25 +23,42 @@ LOCAL_MODULE_SUFFIX := $(COMMON_JAVA_PACKAGE_SUFFIX) LOCAL_IS_HOST_MODULE := true LOCAL_BUILT_MODULE_STEM := javalib.jar +intermediates := $(call local-intermediates-dir) +intermediates.COMMON := $(call local-intermediates-dir,COMMON) + +built_javalib_jar := $(intermediates)/javalib.jar + +################################# +include $(BUILD_SYSTEM)/configure_local_jack.mk +################################# + +ifdef LOCAL_JACK_ENABLED +ifdef LOCAL_IS_STATIC_JAVA_LIBRARY +LOCAL_BUILT_MODULE_STEM := classes.jack +LOCAL_INTERMEDIATE_TARGETS += $(built_javalib_jar) +endif +endif + # base_rules.mk looks at this all_res_assets := proto_sources := $(filter %.proto,$(LOCAL_SRC_FILES)) ifneq ($(proto_sources),) ifeq ($(LOCAL_PROTOC_OPTIMIZE_TYPE),micro) - LOCAL_JAVA_LIBRARIES += host-libprotobuf-java-2.3.0-micro + LOCAL_JAVA_LIBRARIES += host-libprotobuf-java-micro else ifeq ($(LOCAL_PROTOC_OPTIMIZE_TYPE),nano) - LOCAL_JAVA_LIBRARIES += host-libprotobuf-java-2.3.0-nano + LOCAL_JAVA_LIBRARIES += host-libprotobuf-java-nano else - LOCAL_JAVA_LIBRARIES += host-libprotobuf-java-2.3.0-lite + ifeq ($(LOCAL_PROTOC_OPTIMIZE_TYPE),full) + LOCAL_JAVA_LIBRARIES += host-libprotobuf-java-full + else + LOCAL_JAVA_LIBRARIES += host-libprotobuf-java-lite + endif endif endif endif -intermediates := $(call local-intermediates-dir) -intermediates.COMMON := $(call local-intermediates-dir,COMMON) - LOCAL_INTERMEDIATE_SOURCE_DIR := $(intermediates.COMMON)/src LOCAL_JAVA_LIBRARIES := $(sort $(LOCAL_JAVA_LIBRARIES)) diff --git a/core/host_native_test.mk b/core/host_native_test.mk index b54bd3a15..7cba1ae9b 100644 --- a/core/host_native_test.mk +++ b/core/host_native_test.mk @@ -5,4 +5,22 @@ include $(BUILD_SYSTEM)/host_test_internal.mk +needs_symlink := +ifndef LOCAL_MULTILIB + ifndef LOCAL_32_BIT_ONLY + LOCAL_MULTILIB := both + + ifeq (,$(LOCAL_MODULE_STEM_32)$(LOCAL_MODULE_STEM_64)) + LOCAL_MODULE_STEM_32 := $(LOCAL_MODULE)32 + LOCAL_MODULE_STEM_64 := $(LOCAL_MODULE)64 + needs_symlink := true + endif + endif +endif + include $(BUILD_HOST_EXECUTABLE) + +ifdef needs_symlink +include $(BUILD_SYSTEM)/executable_prefer_symlink.mk +needs_symlink := +endif diff --git a/core/host_shared_library.mk b/core/host_shared_library.mk index 438a9ce3d..2e0c9f1ce 100644 --- a/core/host_shared_library.mk +++ b/core/host_shared_library.mk @@ -1,4 +1,6 @@ +LOCAL_IS_HOST_MODULE := true my_prefix := HOST_ +LOCAL_HOST_PREFIX := include $(BUILD_SYSTEM)/multilib.mk ifndef LOCAL_MODULE_HOST_ARCH @@ -6,8 +8,8 @@ ifndef my_module_multilib ifeq ($(HOST_PREFER_32_BIT),true) my_module_multilib := 32 else -# By default we only build host module for the first arch. -my_module_multilib := first +# libraries default to building for both architecturess +my_module_multilib := both endif endif endif @@ -34,6 +36,45 @@ endif LOCAL_2ND_ARCH_VAR_PREFIX := endif # HOST_2ND_ARCH +ifdef HOST_CROSS_OS +my_prefix := HOST_CROSS_ +LOCAL_HOST_PREFIX := $(my_prefix) +include $(BUILD_SYSTEM)/module_arch_supported.mk +ifeq ($(my_module_arch_supported),true) +# Build for Windows +OVERRIDE_BUILT_MODULE_PATH := +LOCAL_BUILT_MODULE := +LOCAL_MODULE_SUFFIX := +# We don't want makefiles using the cross-compiled host tool +saved_LOCAL_INSTALLED_MODULE := $(LOCAL_INSTALLED_MODULE) +LOCAL_INSTALLED_MODULE := +LOCAL_INTERMEDIATE_TARGETS := + +include $(BUILD_SYSTEM)/host_shared_library_internal.mk +LOCAL_INSTALLED_MODULE := $(saved_LOCAL_INSTALLED_MODULE) +endif + +ifdef HOST_CROSS_2ND_ARCH +LOCAL_2ND_ARCH_VAR_PREFIX := $(HOST_CROSS_2ND_ARCH_VAR_PREFIX) +include $(BUILD_SYSTEM)/module_arch_supported.mk +ifeq ($(my_module_arch_supported),true) +# Build for HOST_CROSS_2ND_ARCH +OVERRIDE_BUILT_MODULE_PATH := +LOCAL_BUILT_MODULE := +LOCAL_MODULE_SUFFIX := +# We don't want makefiles using the cross-compiled host tool +saved_LOCAL_INSTALLED_MODULE := $(LOCAL_INSTALLED_MODULE) +LOCAL_INSTALLED_MODULE := +LOCAL_INTERMEDIATE_TARGETS := + +include $(BUILD_SYSTEM)/host_shared_library_internal.mk +LOCAL_INSTALLED_MODULE := $(saved_LOCAL_INSTALLED_MODULE) +endif +LOCAL_2ND_ARCH_VAR_PREFIX := +endif +LOCAL_HOST_PREFIX := +endif + my_module_arch_supported := ########################################################### diff --git a/core/host_shared_library_internal.mk b/core/host_shared_library_internal.mk index d9769d384..272e76f43 100644 --- a/core/host_shared_library_internal.mk +++ b/core/host_shared_library_internal.mk @@ -7,13 +7,11 @@ ## LOCAL_MODULE_SUFFIX will be set for you. ########################################################### -LOCAL_IS_HOST_MODULE := true - ifeq ($(strip $(LOCAL_MODULE_CLASS)),) LOCAL_MODULE_CLASS := SHARED_LIBRARIES endif ifeq ($(strip $(LOCAL_MODULE_SUFFIX)),) -LOCAL_MODULE_SUFFIX := $(HOST_SHLIB_SUFFIX) +LOCAL_MODULE_SUFFIX := $($(my_prefix)SHLIB_SUFFIX) endif ifneq ($(strip $(OVERRIDE_BUILT_MODULE_PATH)),) $(error $(LOCAL_PATH): Illegal use of OVERRIDE_BUILT_MODULE_PATH) @@ -36,11 +34,18 @@ ifndef skip_build_from_source # Put the built modules of all shared libraries in a common directory # to simplify the link line. -OVERRIDE_BUILT_MODULE_PATH := $($(LOCAL_2ND_ARCH_VAR_PREFIX)HOST_OUT_INTERMEDIATE_LIBRARIES) +OVERRIDE_BUILT_MODULE_PATH := $($(LOCAL_2ND_ARCH_VAR_PREFIX)$(my_prefix)OUT_INTERMEDIATE_LIBRARIES) include $(BUILD_SYSTEM)/binary.mk -$(LOCAL_BUILT_MODULE): $(all_objects) $(all_libraries) $(LOCAL_ADDITIONAL_DEPENDENCIES) +my_host_libprofile_rt := $($(LOCAL_2ND_ARCH_VAR_PREFIX)$(my_prefix)LIBPROFILE_RT) +$(LOCAL_BUILD_MODULE): PRIVATE_HOST_LIBPROFILE_RT := $(my_host_libprofile_rt) + +$(LOCAL_BUILT_MODULE): \ + $(all_objects) \ + $(all_libraries) \ + $(LOCAL_MODULE_MAKEFILE_DEP) \ + $(LOCAL_ADDITIONAL_DEPENDENCIES) $(transform-host-o-to-shared-lib) endif # skip_build_from_source diff --git a/core/host_static_library.mk b/core/host_static_library.mk index 74ac2ea66..068c70217 100644 --- a/core/host_static_library.mk +++ b/core/host_static_library.mk @@ -1,4 +1,6 @@ +LOCAL_IS_HOST_MODULE := true my_prefix := HOST_ +LOCAL_HOST_PREFIX := include $(BUILD_SYSTEM)/multilib.mk ifndef LOCAL_MODULE_HOST_ARCH @@ -6,8 +8,8 @@ ifndef my_module_multilib ifeq ($(HOST_PREFER_32_BIT),true) my_module_multilib := 32 else -# By default we only build host module for the first arch. -my_module_multilib := first +# libraries default to building for both architecturess +my_module_multilib := both endif endif endif @@ -34,6 +36,37 @@ endif LOCAL_2ND_ARCH_VAR_PREFIX := endif # HOST_2ND_ARCH +ifdef HOST_CROSS_OS +my_prefix := HOST_CROSS_ +LOCAL_HOST_PREFIX := $(my_prefix) +include $(BUILD_SYSTEM)/module_arch_supported.mk +ifeq ($(my_module_arch_supported),true) +# Build for Windows +OVERRIDE_BUILT_MODULE_PATH := +LOCAL_BUILT_MODULE := +LOCAL_INSTALLED_MODULE := +LOCAL_INTERMEDIATE_TARGETS := + +include $(BUILD_SYSTEM)/host_static_library_internal.mk +endif + +ifdef HOST_CROSS_2ND_ARCH +LOCAL_2ND_ARCH_VAR_PREFIX := $(HOST_CROSS_2ND_ARCH_VAR_PREFIX) +include $(BUILD_SYSTEM)/module_arch_supported.mk +ifeq ($(my_module_arch_supported),true) +# Build for HOST_CROSS_2ND_ARCH +OVERRIDE_BUILT_MODULE_PATH := +LOCAL_BUILT_MODULE := +LOCAL_INSTALLED_MODULE := +LOCAL_INTERMEDIATE_TARGETS := + +include $(BUILD_SYSTEM)/host_static_library_internal.mk +endif +LOCAL_2ND_ARCH_VAR_PREFIX := +endif +LOCAL_HOST_PREFIX := +endif + my_module_arch_supported := ########################################################### diff --git a/core/host_static_library_internal.mk b/core/host_static_library_internal.mk index a533cf5dd..3946aa7bc 100644 --- a/core/host_static_library_internal.mk +++ b/core/host_static_library_internal.mk @@ -18,8 +18,6 @@ $(error $(LOCAL_PATH): Cannot set module stem for a library) endif LOCAL_UNINSTALLABLE_MODULE := true -LOCAL_IS_HOST_MODULE := true - include $(BUILD_SYSTEM)/binary.mk $(LOCAL_BUILT_MODULE): $(built_whole_libraries) diff --git a/core/host_test_internal.mk b/core/host_test_internal.mk index 691468d39..7f6aff0ce 100644 --- a/core/host_test_internal.mk +++ b/core/host_test_internal.mk @@ -2,20 +2,13 @@ ## Shared definitions for all host test compilations. ##################################################### -ifeq ($(HOST_OS),windows) -LOCAL_CFLAGS += -DGTEST_OS_WINDOWS -else -LOCAL_CFLAGS += -DGTEST_OS_LINUX -LOCAL_LDLIBS += -lpthread -endif +LOCAL_CFLAGS_windows += -DGTEST_OS_WINDOWS +LOCAL_CFLAGS_linux += -DGTEST_OS_LINUX +LOCAL_LDLIBS_linux += -lpthread +LOCAL_CFLAGS_darwin += -DGTEST_OS_LINUX +LOCAL_LDLIBS_darwin += -lpthread LOCAL_CFLAGS += -DGTEST_HAS_STD_STRING -O0 -g LOCAL_C_INCLUDES += external/gtest/include -ifneq ($(filter libc++,$(LOCAL_SHARED_LIBRARIES)),) -LOCAL_STATIC_LIBRARIES += libgtest_libc++_host libgtest_main_libc++_host -else -LOCAL_STATIC_LIBRARIES += libgtest_host libgtest_main_host -LOCAL_SHARED_LIBRARIES += -endif - +LOCAL_STATIC_LIBRARIES += libgtest_main_host libgtest_host diff --git a/core/install_jni_libs.mk b/core/install_jni_libs.mk index da3032d21..625a8a222 100644 --- a/core/install_jni_libs.mk +++ b/core/install_jni_libs.mk @@ -8,7 +8,7 @@ # # Output variables: # jni_shared_libraries, jni_shared_libraries_abi, jni_shared_libraries_with_abis if we are going to embed the libraries into the apk; -# extracted_jni_libs, if we extract jni libs from prebuilt apk. +# embedded_prebuilt_jni_libs, prebuilt jni libs embedded in prebuilt apk. # my_embed_jni := @@ -27,7 +27,7 @@ jni_shared_libraries := jni_shared_libraries_abis := # jni_shared_libraries_with_abis is a list of : jni_shared_libraries_with_abis := -extracted_jni_libs := +embedded_prebuilt_jni_libs := ####################################### # For TARGET_ARCH @@ -51,7 +51,7 @@ jni_shared_libraries += $(my_jni_shared_libraries) jni_shared_libraries_abis += $(my_jni_shared_libraries_abi) jni_shared_libraries_with_abis += $(addprefix $(my_jni_shared_libraries_abi):,\ $(my_jni_shared_libraries)) -extracted_jni_libs += $(my_extracted_jni_libs) +embedded_prebuilt_jni_libs += $(my_embedded_prebuilt_jni_libs) # Include RS dynamically-generated libraries as well # TODO: Add multilib support once RS supports generating multilib libraries. @@ -83,11 +83,11 @@ jni_shared_libraries += $(my_jni_shared_libraries) jni_shared_libraries_abis += $(my_jni_shared_libraries_abi) jni_shared_libraries_with_abis += $(addprefix $(my_jni_shared_libraries_abi):,\ $(my_jni_shared_libraries)) -extracted_jni_libs += $(my_extracted_jni_libs) +embedded_prebuilt_jni_libs += $(my_embedded_prebuilt_jni_libs) endif # my_add_jni endif # TARGET_2ND_ARCH jni_shared_libraries := $(strip $(jni_shared_libraries)) jni_shared_libraries_abis := $(sort $(jni_shared_libraries_abis)) jni_shared_libraries_with_abis := $(strip $(jni_shared_libraries_with_abis)) -extracted_jni_libs := $(strip $(extracted_jni_libs)) +embedded_prebuilt_jni_libs := $(strip $(embedded_prebuilt_jni_libs)) diff --git a/core/install_jni_libs_internal.mk b/core/install_jni_libs_internal.mk index c28bb15d3..27b9697e0 100644 --- a/core/install_jni_libs_internal.mk +++ b/core/install_jni_libs_internal.mk @@ -9,7 +9,7 @@ # # Output variables: # my_jni_shared_libraries, my_jni_shared_libraries_abi, if we are going to embed the libraries into the apk; -# my_extracted_jni_libs, if we extract jni libs from prebuilt apk. +# my_embedded_prebuilt_jni_libs, prebuilt jni libs embedded in prebuilt apk. # my_jni_shared_libraries := \ @@ -19,7 +19,7 @@ my_jni_shared_libraries := \ # App-specific lib path. my_app_lib_path := $(dir $(LOCAL_INSTALLED_MODULE))lib/$(TARGET_$(my_2nd_arch_prefix)ARCH) -my_extracted_jni_libs := +my_embedded_prebuilt_jni_libs := ifdef my_embed_jni # App explicitly requires the prebuilt NDK stl shared libraies. @@ -55,7 +55,8 @@ ifneq ($(my_jni_shared_libraries),) my_jni_filenames := $(notdir $(my_jni_shared_libraries)) # Make sure the JNI libraries get installed my_shared_library_path := $($(my_2nd_arch_prefix)TARGET_OUT$(partition_tag)_SHARED_LIBRARIES) -$(LOCAL_INSTALLED_MODULE) : | $(addprefix $(my_shared_library_path)/, $(my_jni_filenames)) +# Do not use order-only dependency, because we want to rebuild the image if an jni is updated. +$(LOCAL_INSTALLED_MODULE) : $(addprefix $(my_shared_library_path)/, $(my_jni_filenames)) # Create symlink in the app specific lib path ifdef LOCAL_POST_INSTALL_CMD @@ -76,25 +77,10 @@ endif # $(my_jni_shared_libraries) not empty endif # my_embed_jni ifdef my_prebuilt_jni_libs -# Install prebuilt JNI libs to the app specific lib path. -# Files like @path/to/libfoo.so (path inside the apk) are JNI libs extracted from the prebuilt apk; +# Files like @lib//libfoo.so (path inside the apk) are JNI libs embedded prebuilt apk; # Files like path/to/libfoo.so (path relative to LOCAL_PATH) are prebuilts in the source tree. -my_extracted_jni_libs := $(patsubst @%,%, \ +my_embedded_prebuilt_jni_libs := $(patsubst @%,%, \ $(filter @%, $(my_prebuilt_jni_libs))) -ifdef my_extracted_jni_libs -ifndef my_prebuilt_src_file -$(error No prebuilt apk to extract prebuilt jni libraries $(my_extracted_jni_libs)) -endif -# We use the first jni lib file as dependency. -my_installed_prebuilt_jni := $(my_app_lib_path)/$(notdir $(firstword $(my_extracted_jni_libs))) -$(my_installed_prebuilt_jni): PRIVATE_JNI_LIBS := $(my_extracted_jni_libs) -$(my_installed_prebuilt_jni): $(my_prebuilt_src_file) - @echo "Extract JNI libs ($@ <- $<)" - @mkdir -p $(dir $@) - $(hide) unzip -j -o -d $(dir $@) $< $(PRIVATE_JNI_LIBS) && touch $@ - -$(LOCAL_INSTALLED_MODULE) : | $(my_installed_prebuilt_jni) -endif # prebuilt JNI exsiting as separate source files. my_prebuilt_jni_libs := $(addprefix $(LOCAL_PATH)/, \ @@ -108,7 +94,7 @@ else # not my_embed_jni $(foreach lib, $(my_prebuilt_jni_libs), \ $(eval $(call copy-one-file, $(lib), $(my_app_lib_path)/$(notdir $(lib))))) -$(LOCAL_INSTALLED_MODULE) : | $(addprefix $(my_app_lib_path)/, $(notdir $(my_prebuilt_jni_libs))) +$(LOCAL_INSTALLED_MODULE) : $(addprefix $(my_app_lib_path)/, $(notdir $(my_prebuilt_jni_libs))) endif # my_embed_jni endif # inner my_prebuilt_jni_libs endif # outer my_prebuilt_jni_libs diff --git a/core/jack-default.args b/core/jack-default.args new file mode 100644 index 000000000..8d70a820d --- /dev/null +++ b/core/jack-default.args @@ -0,0 +1,5 @@ +-D sched.runner=multi-threaded +-D sched.runner.thread.kind=fixed +-D sched.runner.thread.fixed.count=4 +--sanity-checks off +-D jack.reporter.level.file=error=--,warning=- \ No newline at end of file diff --git a/core/java.mk b/core/java.mk index a96925467..099ccdd6e 100644 --- a/core/java.mk +++ b/core/java.mk @@ -1,3 +1,4 @@ +# Target Java. # Requires: # LOCAL_MODULE_SUFFIX # LOCAL_MODULE_CLASS @@ -7,7 +8,9 @@ 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)),) +ifneq ($(LOCAL_NO_STANDARD_LIBRARIES),true) LOCAL_SDK_VERSION := $(PDK_BUILD_SDK_VERSION) +endif #!LOCAL_NO_STANDARD_LIBRARIES endif endif # !PDK_JAVA endif #PDK @@ -28,34 +31,53 @@ ifneq ($(LOCAL_SDK_VERSION),) 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 ifeq ($(LOCAL_SDK_VERSION)$(TARGET_BUILD_APPS),test_current) + LOCAL_JAVA_LIBRARIES := android_test_stubs_current $(LOCAL_JAVA_LIBRARIES) else LOCAL_JAVA_LIBRARIES := sdk_v$(LOCAL_SDK_VERSION) $(LOCAL_JAVA_LIBRARIES) endif + + ifeq ($(LOCAL_SDK_VERSION),current) + my_jack_min_sdk_version := $(PLATFORM_JACK_MIN_SDK_VERSION) + else ifeq ($(LOCAL_SDK_VERSION),system_current) + my_jack_min_sdk_version := $(PLATFORM_JACK_MIN_SDK_VERSION) + else ifeq ($(LOCAL_SDK_VERSION),test_current) + my_jack_min_sdk_version := $(PLATFORM_JACK_MIN_SDK_VERSION) + else + my_jack_min_sdk_version := $(LOCAL_SDK_VERSION) + endif endif endif else + my_jack_min_sdk_version := $(PLATFORM_JACK_MIN_SDK_VERSION) ifneq ($(LOCAL_NO_STANDARD_LIBRARIES),true) LOCAL_JAVA_LIBRARIES := $(TARGET_DEFAULT_JAVA_LIBRARIES) $(LOCAL_JAVA_LIBRARIES) endif endif +ifneq (,$(strip $(LOCAL_MIN_SDK_VERSION))) + my_jack_min_sdk_version := $(LOCAL_MIN_SDK_VERSION) +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 + LOCAL_STATIC_JAVA_LIBRARIES += libprotobuf-java-micro else ifeq ($(LOCAL_PROTOC_OPTIMIZE_TYPE),nano) - LOCAL_STATIC_JAVA_LIBRARIES += libprotobuf-java-2.3.0-nano + LOCAL_STATIC_JAVA_LIBRARIES += libprotobuf-java-nano else - LOCAL_STATIC_JAVA_LIBRARIES += libprotobuf-java-2.3.0-lite + LOCAL_STATIC_JAVA_LIBRARIES += libprotobuf-java-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_STATIC_JAVA_AAR_LIBRARIES and LOCAL_STATIC_ANDROID_LIBRARIES are also LOCAL_STATIC_JAVA_LIBRARIES. +LOCAL_STATIC_JAVA_LIBRARIES := $(strip $(LOCAL_STATIC_JAVA_LIBRARIES) \ + $(LOCAL_STATIC_JAVA_AAR_LIBRARIES) \ + $(LOCAL_STATIC_ANDROID_LIBRARIES)) +# LOCAL_SHARED_ANDROID_LIBRARIES are also LOCAL_JAVA_LIBRARIES. +LOCAL_JAVA_LIBRARIES := $(sort $(LOCAL_JAVA_LIBRARIES) $(LOCAL_SHARED_ANDROID_LIBRARIES)) LOCAL_BUILT_MODULE_STEM := $(strip $(LOCAL_BUILT_MODULE_STEM)) ifeq ($(LOCAL_BUILT_MODULE_STEM),) @@ -112,6 +134,11 @@ else full_classes_jar := $(intermediates.COMMON)/classes.jar built_dex := $(intermediates.COMMON)/classes.dex endif +# final Jack library, shrinked and obfuscated if it must be +full_classes_jack := $(intermediates.COMMON)/classes.jack +# intermediate Jack library without shrink and obfuscation +noshrob_classes_jack := $(intermediates.COMMON)/classes.noshrob.jack +jack_check_timestamp := $(intermediates.COMMON)/jack.check.timestamp LOCAL_INTERMEDIATE_TARGETS += \ $(full_classes_compiled_jar) \ @@ -120,6 +147,9 @@ LOCAL_INTERMEDIATE_TARGETS += \ $(full_classes_jar) \ $(full_classes_proguard_jar) \ $(built_dex_intermediate) \ + $(full_classes_jack) \ + $(noshrob_classes_jack) \ + $(jack_check_timestamp) \ $(built_dex) \ $(full_classes_stubs_jar) @@ -134,25 +164,36 @@ 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_generated_res_dir := 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 +# Defaulting to an empty string uses the latest available platform SDK. renderscript_target_api := ifneq (,$(LOCAL_RENDERSCRIPT_TARGET_API)) -renderscript_target_api := $(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 + ifneq (,$(LOCAL_SDK_VERSION)) + # Set target-api for LOCAL_SDK_VERSIONs other than current. + ifneq (,$(filter-out current system_current test_current, $(LOCAL_SDK_VERSION))) + renderscript_target_api := $(LOCAL_SDK_VERSION) + endif + endif # LOCAL_SDK_VERSION is set endif # LOCAL_RENDERSCRIPT_TARGET_API is set +# For 64-bit, we always have to upgrade to at least 21 for compat build. +ifneq ($(LOCAL_RENDERSCRIPT_COMPATIBILITY),) + ifeq ($(TARGET_IS_64_BIT),true) + ifneq ($(filter $(RSCOMPAT_32BIT_ONLY_API_LEVELS),$(renderscript_target_api)),) + renderscript_target_api := 21 + endif + endif +endif + ifeq ($(LOCAL_RENDERSCRIPT_CC),) LOCAL_RENDERSCRIPT_CC := $(LLVM_RS_CC) endif @@ -163,7 +204,7 @@ 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))),) +ifneq ($(filter-out current system_current test_current,$(LOCAL_SDK_VERSION))$(if $(TARGET_BUILD_APPS),$(filter current system_current test_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 \ @@ -180,6 +221,9 @@ ifneq ($(LOCAL_RENDERSCRIPT_INCLUDES_OVERRIDE),) LOCAL_RENDERSCRIPT_INCLUDES := $(LOCAL_RENDERSCRIPT_INCLUDES_OVERRIDE) endif +bc_files := $(patsubst %.fs,%.bc, $(patsubst %.rs,%.bc, $(notdir $(renderscript_sources)))) +bc_dep_files := $(addprefix $(renderscript_intermediate.COMMON)/,$(patsubst %.bc,%.d,$(bc_files))) + $(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) @@ -188,18 +232,38 @@ $(RenderScript_file_stamp): PRIVATE_RS_SOURCE_FILES := $(renderscript_sources_fu # 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): PRIVATE_DEP_FILES := $(bc_dep_files) $(RenderScript_file_stamp): $(renderscript_sources_fullpath) $(LOCAL_RENDERSCRIPT_CC) $(transform-renderscripts-to-java-and-bc) +# include the dependency files (.d/.P) generated by llvm-rs-cc. +$(call include-depfile,$(RenderScript_file_stamp).P,$(RenderScript_file_stamp)) + ifneq ($(LOCAL_RENDERSCRIPT_COMPATIBILITY),) -bc_files := $(patsubst %.fs,%.bc, $(patsubst %.rs,%.bc, $(notdir $(renderscript_sources)))) + + +ifeq ($(filter $(RSCOMPAT_32BIT_ONLY_API_LEVELS),$(renderscript_target_api)),) +ifeq ($(TARGET_IS_64_BIT),true) +renderscript_intermediate.bc_folder := $(renderscript_intermediate.COMMON)/res/raw/bc64/ +else +renderscript_intermediate.bc_folder := $(renderscript_intermediate.COMMON)/res/raw/bc32/ +endif +else +renderscript_intermediate.bc_folder := $(renderscript_intermediate.COMMON)/res/raw/ +endif + rs_generated_bc := $(addprefix \ - $(renderscript_intermediate.COMMON)/res/raw/, $(bc_files)) + $(renderscript_intermediate.bc_folder), $(bc_files)) renderscript_intermediate := $(intermediates)/renderscript # We don't need the .so files in bundled branches # Prevent these from showing up on the device +# One exception is librsjni.so, which is needed for +# both native path and compat path. +rs_jni_lib := $(TARGET_OUT_INTERMEDIATE_LIBRARIES)/librsjni.so +LOCAL_JNI_SHARED_LIBRARIES += librsjni + ifneq (,$(TARGET_BUILD_APPS)$(FORCE_BUILD_RS_COMPAT)) rs_compatibility_jni_libs := $(addprefix \ @@ -209,53 +273,113 @@ rs_compatibility_jni_libs := $(addprefix \ $(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 +LOCAL_JNI_SHARED_LIBRARIES += libRSSupport +rs_support_io_lib := +# check if the target api level support USAGE_IO +ifeq ($(filter $(RSCOMPAT_NO_USAGEIO_API_LEVELS),$(renderscript_target_api)),) +rs_support_io_lib := $(TARGET_OUT_INTERMEDIATE_LIBRARIES)/libRSSupportIO.so +LOCAL_JNI_SHARED_LIBRARIES += libRSSupportIO +endif $(rs_compatibility_jni_libs): $(RenderScript_file_stamp) $(RS_PREBUILT_CLCORE) \ - $(rs_support_lib) $(rs_jni_lib) $(rs_compiler_rt) + $(rs_support_lib) $(rs_support_io_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): PRIVATE_CXX := $(CXX_WRAPPER) $(TARGET_CXX) $(rs_compatibility_jni_libs): $(renderscript_intermediate)/librs.%.so: \ - $(renderscript_intermediate.COMMON)/res/raw/%.bc + $(renderscript_intermediate.bc_folder)%.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) +rs_generated_res_dir := $(renderscript_intermediate.COMMON)/res +LOCAL_RESOURCE_DIR := $(rs_generated_res_dir) $(LOCAL_RESOURCE_DIR) +endif + + +########################################################### +## AIDL: Compile .aidl files to .java +########################################################### +aidl_sources := $(filter %.aidl,$(LOCAL_SRC_FILES)) + +ifneq ($(strip $(aidl_sources)),) +aidl_java_sources := $(patsubst %.aidl,%.java,$(addprefix $(intermediates.COMMON)/src/, $(aidl_sources))) +aidl_sources := $(addprefix $(LOCAL_PATH)/, $(aidl_sources)) + +aidl_preprocess_import := +ifdef LOCAL_SDK_VERSION +ifneq ($(filter current system_current test_current, $(LOCAL_SDK_VERSION)$(TARGET_BUILD_APPS)),) + # LOCAL_SDK_VERSION is current and no TARGET_BUILD_APPS + aidl_preprocess_import := $(TARGET_OUT_COMMON_INTERMEDIATES)/framework.aidl +else + aidl_preprocess_import := $(HISTORICAL_SDK_VERSIONS_ROOT)/$(LOCAL_SDK_VERSION)/framework.aidl +endif # not current or system_current +else +# build against the platform. +LOCAL_AIDL_INCLUDES += $(FRAMEWORKS_BASE_JAVA_SRC_DIRS) +endif # LOCAL_SDK_VERSION +$(aidl_java_sources): PRIVATE_AIDL_FLAGS := -b $(addprefix -p,$(aidl_preprocess_import)) -I$(LOCAL_PATH) -I$(LOCAL_PATH)/src $(addprefix -I,$(LOCAL_AIDL_INCLUDES)) $(LOCAL_AIDL_FLAGS) + +$(aidl_java_sources): $(intermediates.COMMON)/src/%.java: \ + $(LOCAL_PATH)/%.aidl \ + $(LOCAL_MODULE_MAKEFILE_DEP) \ + $(LOCAL_ADDITIONAL_DEPENDENCIES) \ + $(AIDL) \ + $(aidl_preprocess_import) + $(transform-aidl-to-java) +$(foreach java,$(aidl_java_sources), \ + $(call include-depfile,$(java:%.java=%.P),$(java))) + +else +aidl_java_sources := 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. +ifndef LOCAL_CHECKED_MODULE ifdef full_classes_jar -java_alternative_checked_module := $(full_classes_compiled_jar) +ifdef LOCAL_JACK_ENABLED +LOCAL_CHECKED_MODULE := $(jack_check_timestamp) else -java_alternative_checked_module := +LOCAL_CHECKED_MODULE := $(full_classes_compiled_jar) +endif +endif 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 := +########################################################### +## logtags: emit java source +########################################################### +ifneq ($(strip $(logtags_sources)),) + +logtags_java_sources := $(patsubst %.logtags,%.java,$(addprefix $(intermediates.COMMON)/src/, $(logtags_sources))) +logtags_sources := $(addprefix $(LOCAL_PATH)/, $(logtags_sources)) + +$(logtags_java_sources): $(intermediates.COMMON)/src/%.java: $(LOCAL_PATH)/%.logtags $(TARGET_OUT_COMMON_INTERMEDIATES)/all-event-log-tags.txt + $(transform-logtags-to-java) + +else +logtags_java_sources := +endif + +########################################## +java_sources := $(addprefix $(LOCAL_PATH)/, $(filter %.java,$(LOCAL_SRC_FILES))) $(aidl_java_sources) $(logtags_java_sources) \ + $(filter %.java,$(LOCAL_GENERATED_SOURCES)) +all_java_sources := $(java_sources) $(addprefix $(TARGET_OUT_COMMON_INTERMEDIATES)/, $(filter %.java,$(LOCAL_INTERMEDIATE_SOURCES))) + +include $(BUILD_SYSTEM)/java_common.mk ####################################### # defines built_odex along with rule to install odex @@ -269,36 +393,8 @@ $(error $(LOCAL_PATH): Target java module does not define any source or resource 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) +$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_JACK_MIN_SDK_VERSION := $(my_jack_min_sdk_version) +my_jack_min_sdk_version := # Since we're using intermediates.COMMON, make sure that it gets cleaned # properly. @@ -315,7 +411,7 @@ ifdef full_classes_jar # - 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) +$(full_classes_stubs_jar) : $(full_classes_jar) | $(ACP) @echo Copying $(PRIVATE_SOURCE_FILE) $(hide) $(ACP) -fp $(PRIVATE_SOURCE_FILE) $@ ALL_MODULES.$(LOCAL_MODULE).STUBS := $(full_classes_stubs_jar) @@ -334,19 +430,23 @@ endif # 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_JAVACFLAGS := $(GLOBAL_JAVAC_DEBUG_FLAGS) $(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) +$(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_MODULE_MAKEFILE_DEP) \ + $(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) @@ -359,8 +459,10 @@ $(full_classes_jarjar_jar): $(full_classes_compiled_jar) | $(ACP) $(hide) $(ACP) -fp $< $@ endif +full_classes_jar_source := $(full_classes_jarjar_jar) +ifndef LOCAL_JACK_ENABLED ifeq ($(LOCAL_EMMA_INSTRUMENT),true) -$(full_classes_emma_jar): PRIVATE_EMMA_COVERAGE_FILE := $(intermediates.COMMON)/coverage.em +$(full_classes_emma_jar): PRIVATE_EMMA_COVERAGE_FILE := $(intermediates.COMMON)/coverage.emma.ignore $(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 @@ -375,18 +477,17 @@ endif # $(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) +full_classes_jar_source := $(full_classes_emma_jar) +endif endif # Keep a copy of the jar just before proguard processing. -$(full_classes_jar): $(full_classes_emma_jar) | $(ACP) +$(full_classes_jar): $(full_classes_jar_source) | $(ACP) @echo Copying: $@ $(hide) $(ACP) -fp $< $@ +$(call define-jar-to-toc-rule, $(full_classes_jar)) + # 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)),) @@ -394,50 +495,85 @@ ifneq ($(filter-out full custom nosystem obfuscation optimization shrinktests,$( $(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) +jack_dictionary := $(intermediates.COMMON)/jack_dictionary + +# Hack: see b/20667396 +# When an app's LOCAL_SDK_VERSION is lower than the support library's LOCAL_SDK_VERSION, +# we artifically raises the "SDK version" "linked" by ProGuard, to +# - suppress ProGuard warnings of referencing symbols unknown to the lower SDK version. +# - prevent ProGuard stripping subclass in the support library that extends class added in the higher SDK version. +my_support_library_sdk_raise := +ifneq (,$(filter android-support-%,$(LOCAL_STATIC_JAVA_LIBRARIES))) +ifdef LOCAL_SDK_VERSION +ifdef TARGET_BUILD_APPS +ifeq (,$(filter current system_current test_current, $(LOCAL_SDK_VERSION))) + my_support_library_sdk_raise := $(call java-lib-files, sdk_vcurrent) +endif +else + # For platform build, we can't just raise to the "current" SDK, + # that would break apps that use APIs removed from the current SDK. + my_support_library_sdk_raise := $(call java-lib-files,$(TARGET_DEFAULT_JAVA_LIBRARIES)) +endif +endif +endif + +# jack already has the libraries in its classpath and doesn't support jars +legacy_proguard_flags := $(addprefix -libraryjars ,$(my_support_library_sdk_raise) $(full_shared_java_libs)) + +legacy_proguard_flags += -printmapping $(proguard_dictionary) +jack_proguard_flags := -printmapping $(jack_dictionary) + +common_proguard_flags := -forceprocessing ifeq ($(filter nosystem,$(LOCAL_PROGUARD_ENABLED)),) -proguard_flags += -include $(BUILD_SYSTEM)/proguard.flags +common_proguard_flags += -include $(BUILD_SYSTEM)/proguard.flags ifeq ($(LOCAL_EMMA_INSTRUMENT),true) -proguard_flags += -include $(BUILD_SYSTEM)/proguard.emma.flags +ifdef LOCAL_JACK_ENABLED +common_proguard_flags += -include $(BUILD_SYSTEM)/proguard.jacoco.flags +else +common_proguard_flags += -include $(BUILD_SYSTEM)/proguard.emma.flags +endif # LOCAL_JACK_ENABLED 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 +common_proguard_flags += -include $(BUILD_SYSTEM)/proguard_tests.flags ifeq ($(filter shrinktests,$(LOCAL_PROGUARD_ENABLED)),) -proguard_flags += -dontshrink # don't shrink tests by default +common_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 +common_proguard_flags += -dontobfuscate endif # No obfuscation ifeq ($(filter optimization,$(LOCAL_PROGUARD_ENABLED)),) # By default no optimization -proguard_flags += -dontoptimize +common_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) +# jack already has this library in its classpath and doesn't support jars +legacy_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) \ +legacy_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) + $(legacy_proguard_flags) +ifdef LOCAL_JACK_ENABLED +jack_proguard_flags += -applymapping $(link_instr_intermediates_dir.COMMON)/jack_dictionary +full_jack_deps += $(link_instr_intermediates_dir.COMMON)/jack_dictionary +endif # Sometimes (test + main app) uses different keep rules from the main app - # apply the main app's dictionary anyway. -proguard_flags += -ignorewarnings +legacy_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 @@ -455,8 +591,8 @@ 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) +$(full_classes_proguard_jar): PRIVATE_PROGUARD_FLAGS := $(legacy_proguard_flags) $(common_proguard_flags) $(LOCAL_PROGUARD_FLAGS) +$(full_classes_proguard_jar) : $(full_classes_jar) $(extra_input_jar) $(my_support_library_sdk_raise) $(proguard_flag_files) | $(ACP) $(PROGUARD) $(call transform-jar-to-proguard) else # LOCAL_PROGUARD_ENABLED not defined @@ -466,7 +602,7 @@ $(full_classes_proguard_jar) : $(full_classes_jar) endif # LOCAL_PROGUARD_ENABLED defined - +ifndef LOCAL_JACK_ENABLED # Override PRIVATE_INTERMEDIATES_DIR so that install-dex-debug # will work even when intermediates != intermediates.COMMON. $(built_dex_intermediate): PRIVATE_INTERMEDIATES_DIR := $(intermediates.COMMON) @@ -480,8 +616,8 @@ $(built_dex_intermediate): PRIVATE_DX_FLAGS := $(LOCAL_DX_FLAGS) 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) +endif # LOCAL_JACK_ENABLED is disabled + $(built_dex): $(built_dex_intermediate) | $(ACP) @echo Copying: $@ $(hide) mkdir -p $(dir $@) @@ -492,17 +628,14 @@ ifneq ($(GENERATE_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) +$(findbugs_xml): PRIVATE_AUXCLASSPATH := $(addprefix -auxclasspath ,$(strip \ + $(call normalize-path-list,$(filter %.jar,$(full_java_libs))))) +$(findbugs_xml): PRIVATE_FINDBUGS_FLAGS := $(LOCAL_FINDBUGS_FLAGS) +$(findbugs_xml) : $(full_classes_jar) $(filter %.xml, $(LOCAL_FINDBUGS_FLAGS)) @echo Findbugs: $@ $(hide) $(FINDBUGS) -textui -effort:min -xml:withMessages \ - $(PRIVATE_AUXCLASSPATH) \ - $(PRIVATE_JAR_FILE) \ + $(PRIVATE_AUXCLASSPATH) $(PRIVATE_FINDBUGS_FLAGS) \ + $< \ > $@ ALL_FINDBUGS_FILES += $(findbugs_xml) @@ -519,3 +652,98 @@ $(findbugs_html) : $(findbugs_xml) $(LOCAL_MODULE)-findbugs : $(findbugs_html) endif # full_classes_jar is defined + +ifdef LOCAL_JACK_ENABLED +$(LOCAL_INTERMEDIATE_TARGETS): \ + PRIVATE_JACK_INTERMEDIATES_DIR := $(intermediates.COMMON)/jack-rsc +ifeq ($(LOCAL_JACK_ENABLED),incremental) +$(LOCAL_INTERMEDIATE_TARGETS): \ + PRIVATE_JACK_INCREMENTAL_DIR := $(intermediates.COMMON)/jack-incremental +$(noshrob_classes_jack): PRIVATE_JACK_INCREMENTAL_DIR := $(intermediates.COMMON)/jack-noshrob-incremental +$(jack_check_timestamp): PRIVATE_JACK_INCREMENTAL_DIR := $(intermediates.COMMON)/jack-check-incremental +else +$(LOCAL_INTERMEDIATE_TARGETS): \ + PRIVATE_JACK_INCREMENTAL_DIR := +$(noshrob_classes_jack): PRIVATE_JACK_INCREMENTAL_DIR := +$(jack_check_timestamp): PRIVATE_JACK_INCREMENTAL_DIR := +endif + +ifdef full_classes_jar +ifdef LOCAL_PROGUARD_ENABLED + +ifndef LOCAL_JACK_PROGUARD_FLAGS + LOCAL_JACK_PROGUARD_FLAGS := $(LOCAL_PROGUARD_FLAGS) +endif +LOCAL_JACK_PROGUARD_FLAGS += $(addprefix -include , $(proguard_flag_files)) +ifdef LOCAL_TEST_MODULE_TO_PROGUARD_WITH + $(error $(LOCAL_MODULE): Build with jack when LOCAL_TEST_MODULE_TO_PROGUARD_WITH is defined is not yet implemented) +endif + +# $(jack_dictionary) is just by-product of $(built_dex_intermediate). +# The dummy command was added because, without it, make misses the fact the $(built_dex) also +# change $(jack_dictionary). +$(jack_dictionary): $(full_classes_jack) + $(hide) touch $@ + +$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_JACK_PROGUARD_FLAGS := $(common_proguard_flags) $(jack_proguard_flags) $(LOCAL_JACK_PROGUARD_FLAGS) +else # LOCAL_PROGUARD_ENABLED not defined +$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_JACK_PROGUARD_FLAGS := +endif # LOCAL_PROGUARD_ENABLED defined + +$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_JACK_FLAGS := $(GLOBAL_JAVAC_DEBUG_FLAGS) $(LOCAL_JACK_FLAGS) +$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_JACK_VERSION := $(LOCAL_JACK_VERSION) + +jack_all_deps := $(java_sources) $(java_resource_sources) $(full_jack_deps) \ + $(jar_manifest_file) $(layers_file) $(RenderScript_file_stamp) $(proguard_flag_files) \ + $(proto_java_sources_file_stamp) $(LOCAL_ADDITIONAL_DEPENDENCIES) $(LOCAL_JARJAR_RULES) \ + $(LOCAL_MODULE_MAKEFILE_DEP) $(JACK) + +$(jack_check_timestamp): $(jack_all_deps) | setup-jack-server + @echo Checking build with Jack: $@ + $(jack-check-java) + +ifeq ($(LOCAL_IS_STATIC_JAVA_LIBRARY),true) +$(full_classes_jack): $(jack_all_deps) | setup-jack-server + @echo Building with Jack: $@ + $(java-to-jack) + +# Update timestamps of .toc files for static java libraries so +# dependents will be always rebuilt. +$(built_dex).toc: $(full_classes_jack) + touch $@ + +else #LOCAL_IS_STATIC_JAVA_LIBRARY +$(built_dex_intermediate): PRIVATE_CLASSES_JACK := $(full_classes_jack) + +ifeq ($(LOCAL_EMMA_INSTRUMENT),true) +$(built_dex_intermediate): PRIVATE_JACK_COVERAGE_OPTIONS := \ + -D jack.coverage=true \ + -D jack.coverage.metadata.file=$(intermediates.COMMON)/coverage.em \ + -D jack.coverage.jacoco.package=$(JACOCO_PACKAGE_NAME) \ + $(addprefix -D jack.coverage.jacoco.include=,$(LOCAL_JACK_COVERAGE_INCLUDE_FILTER)) \ + $(addprefix -D jack.coverage.jacoco.exclude=,$(LOCAL_JACK_COVERAGE_EXCLUDE_FILTER)) +else +$(built_dex_intermediate): PRIVATE_JACK_COVERAGE_OPTIONS := +endif + +$(built_dex_intermediate): $(jack_all_deps) | setup-jack-server + @echo Building with Jack: $@ + $(jack-java-to-dex) + +# $(full_classes_jack) is just by-product of $(built_dex_intermediate). +# The dummy command was added because, without it, make misses the fact the $(built_dex) also +# change $(full_classes_jack). +$(full_classes_jack): $(built_dex_intermediate) + $(hide) touch $@ + +$(call define-dex-to-toc-rule, $(intermediates.COMMON)) + +endif #LOCAL_IS_STATIC_JAVA_LIBRARY + +$(noshrob_classes_jack): PRIVATE_JACK_INTERMEDIATES_DIR := $(intermediates.COMMON)/jack-noshrob-rsc +$(noshrob_classes_jack): PRIVATE_JACK_PROGUARD_FLAGS := +$(noshrob_classes_jack): $(jack_all_deps) | setup-jack-server + @echo Building with Jack: $@ + $(java-to-jack) +endif # full_classes_jar is defined +endif # LOCAL_JACK_ENABLED diff --git a/core/java_common.mk b/core/java_common.mk new file mode 100644 index 000000000..9b7d10fba --- /dev/null +++ b/core/java_common.mk @@ -0,0 +1,401 @@ +# Common to host and target Java modules. + +########################################################### +## Java version +########################################################### +# Use the LOCAL_JAVA_LANGUAGE_VERSION if it is set, otherwise +# use one based on the LOCAL_SDK_VERSION. If it is < 24 +# pass "1.7" to the tools, if it is unset, >= 24 or "current" +# pass "1.8". +# +# The LOCAL_SDK_VERSION behavior is to ensure that, by default, +# code that is expected to run on older releases of Android +# does not use any 1.8 language features that are not supported +# on earlier runtimes (like default / static interface methods). +# Modules can override this logic by specifying +# LOCAL_JAVA_LANGUAGE_VERSION explicitly. +ifeq (,$(LOCAL_JAVA_LANGUAGE_VERSION)) + private_sdk_versions_without_any_java_18_support := 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 + ifneq (,$(filter $(LOCAL_SDK_VERSION), $(private_sdk_versions_without_any_java_18_support))) + LOCAL_JAVA_LANGUAGE_VERSION := 1.7 + else + LOCAL_JAVA_LANGUAGE_VERSION := 1.8 + endif +endif +LOCAL_JAVACFLAGS += -source $(LOCAL_JAVA_LANGUAGE_VERSION) -target $(LOCAL_JAVA_LANGUAGE_VERSION) + +########################################################### +## .proto files: Compile proto files to .java +########################################################### +proto_sources := $(filter %.proto,$(LOCAL_SRC_FILES)) +# Because names of the .java files compiled from .proto files are unknown until the +# .proto files are compiled, we use a timestamp file as depedency. +proto_java_sources_file_stamp := +ifneq ($(proto_sources),) +proto_sources_fullpath := $(addprefix $(LOCAL_PATH)/, $(proto_sources)) + +# 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. +proto_java_intemediate_dir := $(LOCAL_INTERMEDIATE_SOURCE_DIR)/proto +proto_java_sources_file_stamp := $(proto_java_intemediate_dir)/Proto.stamp +proto_java_sources_dir := $(proto_java_intemediate_dir)/src + +$(proto_java_sources_file_stamp): PRIVATE_PROTO_INCLUDES := $(TOP) +$(proto_java_sources_file_stamp): PRIVATE_PROTO_SRC_FILES := $(proto_sources_fullpath) +$(proto_java_sources_file_stamp): PRIVATE_PROTO_JAVA_OUTPUT_DIR := $(proto_java_sources_dir) +ifeq ($(LOCAL_PROTOC_OPTIMIZE_TYPE),micro) +$(proto_java_sources_file_stamp): PRIVATE_PROTO_JAVA_OUTPUT_OPTION := --javamicro_out +else + ifeq ($(LOCAL_PROTOC_OPTIMIZE_TYPE),nano) +$(proto_java_sources_file_stamp): PRIVATE_PROTO_JAVA_OUTPUT_OPTION := --javanano_out + else +$(proto_java_sources_file_stamp): PRIVATE_PROTO_JAVA_OUTPUT_OPTION := --java_out + endif +endif +$(proto_java_sources_file_stamp): PRIVATE_PROTOC_FLAGS := $(LOCAL_PROTOC_FLAGS) +$(proto_java_sources_file_stamp): PRIVATE_PROTO_JAVA_OUTPUT_PARAMS := $(LOCAL_PROTO_JAVA_OUTPUT_PARAMS) +$(proto_java_sources_file_stamp) : $(proto_sources_fullpath) $(PROTOC) + $(call transform-proto-to-java) + +#TODO: protoc should output the dependencies introduced by imports. + +ALL_MODULES.$(my_register_name).PROTO_FILES := $(proto_sources_fullpath) +endif # proto_sources + +######################################### +## Java resources + +# Look for resource files in any specified directories. +# Non-java and non-doc files will be picked up as resources +# and included in the output jar file. +java_resource_file_groups := + +LOCAL_JAVA_RESOURCE_DIRS := $(strip $(LOCAL_JAVA_RESOURCE_DIRS)) +ifneq ($(LOCAL_JAVA_RESOURCE_DIRS),) + # This makes a list of words like + # ::: :: : + # where each of the files is relative to the directory it's grouped with. + # Directories that don't contain any resource files will result in groups + # that end with a colon, and they are stripped out in the next step. + java_resource_file_groups += \ + $(foreach dir,$(LOCAL_JAVA_RESOURCE_DIRS), \ + $(subst $(space),:,$(strip \ + $(LOCAL_PATH)/$(dir): \ + $(patsubst ./%,%,$(sort $(shell cd $(LOCAL_PATH)/$(dir) && \ + find . \ + -type d -a -name ".svn" -prune -o \ + -type f \ + -a \! -name "*.java" \ + -a \! -name "package.html" \ + -a \! -name "overview.html" \ + -a \! -name ".*.swp" \ + -a \! -name ".DS_Store" \ + -a \! -name "*~" \ + -print \ + ))) \ + )) \ + ) + java_resource_file_groups := $(filter-out %:,$(java_resource_file_groups)) +endif # LOCAL_JAVA_RESOURCE_DIRS + +LOCAL_JAVA_RESOURCE_FILES := $(strip $(LOCAL_JAVA_RESOURCE_FILES)) +ifneq ($(LOCAL_JAVA_RESOURCE_FILES),) + java_resource_file_groups += \ + $(foreach f,$(LOCAL_JAVA_RESOURCE_FILES), \ + $(patsubst %/,%,$(dir $(f)))::$(notdir $(f)) \ + ) +endif # LOCAL_JAVA_RESOURCE_FILES + +ifdef java_resource_file_groups + # The full paths to all resources, used for dependencies. + java_resource_sources := \ + $(foreach group,$(java_resource_file_groups), \ + $(addprefix $(word 1,$(subst :,$(space),$(group)))/, \ + $(wordlist 2,9999,$(subst :,$(space),$(group))) \ + ) \ + ) + # The arguments to jar that will include these files in a jar file. + # Quote the file name to handle special characters (such as #) correctly. + extra_jar_args := \ + $(foreach group,$(java_resource_file_groups), \ + $(addprefix -C "$(word 1,$(subst :,$(space),$(group)))" , \ + $(foreach w, $(wordlist 2,9999,$(subst :,$(space),$(group))), "$(w)" ) \ + ) \ + ) + java_resource_file_groups := +else + java_resource_sources := + extra_jar_args := +endif # java_resource_file_groups + +###################################### +## PRIVATE java vars +# LOCAL_SOURCE_FILES_ALL_GENERATED is set only if the module does not have static source files, +# but generated source files in its LOCAL_INTERMEDIATE_SOURCE_DIR. +# You have to set up the dependency in some other way. +need_compile_java := $(strip $(all_java_sources)$(all_res_assets)$(java_resource_sources))$(LOCAL_STATIC_JAVA_LIBRARIES)$(filter true,$(LOCAL_SOURCE_FILES_ALL_GENERATED)) +ifdef need_compile_java + +full_static_java_libs := \ + $(foreach lib,$(LOCAL_STATIC_JAVA_LIBRARIES), \ + $(call intermediates-dir-for, \ + JAVA_LIBRARIES,$(lib),$(LOCAL_IS_HOST_MODULE),COMMON)/javalib.jar) + +$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_STATIC_JAVA_LIBRARIES := $(full_static_java_libs) + +$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_RESOURCE_DIR := $(LOCAL_RESOURCE_DIR) +$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_ASSET_DIR := $(LOCAL_ASSET_DIR) + +$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_CLASS_INTERMEDIATES_DIR := $(intermediates.COMMON)/classes +$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_SOURCE_INTERMEDIATES_DIR := $(intermediates.COMMON)/src +$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_JAVA_SOURCES := $(all_java_sources) + +$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_RMTYPEDEFS := $(LOCAL_RMTYPEDEFS) + +# full_java_libs: The list of files that should be used as the classpath. +# Using this list as a dependency list WILL NOT WORK. +# full_java_lib_deps: Should be specified as a prerequisite of this module +# to guarantee that the files in full_java_libs will +# be up-to-date. +ifndef LOCAL_IS_HOST_MODULE +ifeq ($(LOCAL_SDK_VERSION),) +ifeq ($(LOCAL_NO_STANDARD_LIBRARIES),true) +# No bootclasspath. But we still need "" to prevent javac from using default host bootclasspath. +my_bootclasspath := "" +else # LOCAL_NO_STANDARD_LIBRARIES +my_bootclasspath := $(call java-lib-files,core-oj):$(call java-lib-files,core-libart) +endif # LOCAL_NO_STANDARD_LIBRARIES +else +ifeq ($(LOCAL_SDK_VERSION)$(TARGET_BUILD_APPS),current) +# LOCAL_SDK_VERSION is current and no TARGET_BUILD_APPS. +my_bootclasspath := $(call java-lib-files,android_stubs_current) +else ifeq ($(LOCAL_SDK_VERSION)$(TARGET_BUILD_APPS),system_current) +my_bootclasspath := $(call java-lib-files,android_system_stubs_current) +else ifeq ($(LOCAL_SDK_VERSION)$(TARGET_BUILD_APPS),test_current) +my_bootclasspath := $(call java-lib-files,android_test_stubs_current) +else +my_bootclasspath := $(call java-lib-files,sdk_v$(LOCAL_SDK_VERSION)) +endif # current, system_current, or test_current +endif # LOCAL_SDK_VERSION +$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_BOOTCLASSPATH := -bootclasspath $(my_bootclasspath) + +# In order to compile lambda code javac requires various invokedynamic- +# related classes to be present. This change adds stubs needed for +# javac to compile lambdas. +my_additional_javac_libs := +ifndef TARGET_BUILD_APPS +# TODO: support to build lamdbas using javac in unbundled build. +# We may need to check in a prebuilt core-lambda-stubs to prebuilts/sdk. +ifneq ($(LOCAL_NO_STANDARD_LIBRARIES),true) +my_additional_javac_libs := core-lambda-stubs +endif +endif + +full_shared_java_libs := $(call java-lib-files,$(LOCAL_JAVA_LIBRARIES) $(my_additional_javac_libs),$(LOCAL_IS_HOST_MODULE)) +full_java_lib_deps := $(call java-lib-deps,$(LOCAL_JAVA_LIBRARIES) $(my_additional_javac_libs),$(LOCAL_IS_HOST_MODULE)) +full_java_lib_deps := $(addsuffix .toc, $(full_java_lib_deps)) + +else # LOCAL_IS_HOST_MODULE + +ifeq ($(USE_CORE_LIB_BOOTCLASSPATH),true) +ifeq ($(LOCAL_NO_STANDARD_LIBRARIES),true) +my_bootclasspath := "" +else +my_bootclasspath := $(call normalize-path-list,$(call host-dex-java-lib-files,core-oj-hostdex core-libart-hostdex)) +endif +$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_BOOTCLASSPATH := -bootclasspath $(my_bootclasspath) + +full_shared_java_libs := $(call host-dex-java-lib-files,$(LOCAL_JAVA_LIBRARIES)) +full_java_lib_deps := $(full_shared_java_libs) +else # !USE_CORE_LIB_BOOTCLASSPATH +$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_BOOTCLASSPATH := + +full_shared_java_libs := $(addprefix $(HOST_OUT_JAVA_LIBRARIES)/,\ + $(addsuffix $(COMMON_JAVA_PACKAGE_SUFFIX),$(LOCAL_JAVA_LIBRARIES))) +full_java_lib_deps := $(full_shared_java_libs) +endif # USE_CORE_LIB_BOOTCLASSPATH +endif # !LOCAL_IS_HOST_MODULE + +full_java_libs := $(full_shared_java_libs) $(full_static_java_libs) $(LOCAL_CLASSPATH) +full_java_lib_deps := $(full_java_lib_deps) $(full_static_java_libs) $(LOCAL_CLASSPATH) + +ifndef LOCAL_IS_HOST_MODULE +# This is set by packages that are linking to other packages that export +# shared libraries, allowing them to make use of the code in the linked apk. +apk_libraries := $(sort $(LOCAL_APK_LIBRARIES) $(LOCAL_RES_LIBRARIES)) +ifneq ($(apk_libraries),) + link_apk_libraries := \ + $(foreach lib,$(apk_libraries), \ + $(call intermediates-dir-for, \ + APPS,$(lib),,COMMON)/classes.jar) + + # link against the jar with full original names (before proguard processing). + full_shared_java_libs += $(link_apk_libraries) + full_java_libs += $(link_apk_libraries) + full_java_lib_deps += $(link_apk_libraries) +endif + +# This is set by packages that contain instrumentation, allowing them to +# link against the package they are instrumenting. Currently only one such +# package is allowed. +LOCAL_INSTRUMENTATION_FOR := $(strip $(LOCAL_INSTRUMENTATION_FOR)) +ifdef LOCAL_INSTRUMENTATION_FOR + ifneq ($(words $(LOCAL_INSTRUMENTATION_FOR)),1) + $(error \ + $(LOCAL_PATH): Multiple LOCAL_INSTRUMENTATION_FOR members defined) + endif + + link_instr_intermediates_dir.COMMON := $(call intermediates-dir-for, \ + APPS,$(LOCAL_INSTRUMENTATION_FOR),,COMMON) + # link against the jar with full original names (before proguard processing). + link_instr_classes_jar := $(link_instr_intermediates_dir.COMMON)/classes.jar + full_java_libs += $(link_instr_classes_jar) + full_java_lib_deps += $(link_instr_classes_jar) +endif # LOCAL_INSTRUMENTATION_FOR +endif # LOCAL_IS_HOST_MODULE + +endif # need_compile_java + +# We may want to add jar manifest or jar resource files even if there is no java code at all. +$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_EXTRA_JAR_ARGS := $(extra_jar_args) +jar_manifest_file := +ifneq ($(strip $(LOCAL_JAR_MANIFEST)),) +jar_manifest_file := $(LOCAL_PATH)/$(LOCAL_JAR_MANIFEST) +$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_JAR_MANIFEST := $(jar_manifest_file) +else +$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_JAR_MANIFEST := +endif + +########################################################## +ifndef LOCAL_IS_HOST_MODULE +## AAPT Flags +# aapt doesn't accept multiple --extra-packages flags. +# We have to collapse them into a single --extra-packages flag here. +LOCAL_AAPT_FLAGS := $(strip $(LOCAL_AAPT_FLAGS)) +ifdef LOCAL_AAPT_FLAGS +ifeq ($(filter 0 1,$(words $(filter --extra-packages,$(LOCAL_AAPT_FLAGS)))),) +aapt_flags := $(subst --extra-packages$(space),--extra-packages@,$(LOCAL_AAPT_FLAGS)) +aapt_flags_extra_packages := $(patsubst --extra-packages@%,%,$(filter --extra-packages@%,$(aapt_flags))) +aapt_flags_extra_packages := $(sort $(subst :,$(space),$(aapt_flags_extra_packages))) +LOCAL_AAPT_FLAGS := $(filter-out --extra-packages@%,$(aapt_flags)) \ + --extra-packages $(subst $(space),:,$(aapt_flags_extra_packages)) +aapt_flags_extra_packages := +aapt_flags := +endif +endif + +$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_AAPT_FLAGS := $(LOCAL_AAPT_FLAGS) $(PRODUCT_AAPT_FLAGS) +$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_TARGET_AAPT_CHARACTERISTICS := $(TARGET_AAPT_CHARACTERISTICS) +$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_MANIFEST_PACKAGE_NAME := $(LOCAL_MANIFEST_PACKAGE_NAME) +$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_MANIFEST_INSTRUMENTATION_FOR := $(LOCAL_MANIFEST_INSTRUMENTATION_FOR) + +ifdef aidl_sources +ALL_MODULES.$(my_register_name).AIDL_FILES := $(aidl_sources) +endif +ifdef renderscript_sources +ALL_MODULES.$(my_register_name).RS_FILES := $(renderscript_sources_fullpath) +endif +endif # !LOCAL_IS_HOST_MODULE + +$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_ALL_JAVA_LIBRARIES := $(full_java_libs) + +ALL_MODULES.$(my_register_name).INTERMEDIATE_SOURCE_DIR := \ + $(ALL_MODULES.$(my_register_name).INTERMEDIATE_SOURCE_DIR) $(LOCAL_INTERMEDIATE_SOURCE_DIR) + +########################################################### +# JACK +########################################################### +ifdef LOCAL_JACK_ENABLED +ifdef need_compile_java + +LOCAL_JACK_FLAGS += -D jack.java.source.version=$(LOCAL_JAVA_LANGUAGE_VERSION) + +full_static_jack_libs := \ + $(foreach lib,$(LOCAL_STATIC_JAVA_LIBRARIES), \ + $(call intermediates-dir-for, \ + JAVA_LIBRARIES,$(lib),$(LOCAL_IS_HOST_MODULE),COMMON)/classes.jack) + +$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_STATIC_JACK_LIBRARIES := $(full_static_jack_libs) + +ifndef LOCAL_IS_HOST_MODULE +ifeq ($(LOCAL_SDK_VERSION),) +ifeq ($(LOCAL_NO_STANDARD_LIBRARIES),true) +my_bootclasspath := +else +my_bootclasspath := $(call jack-lib-files,core-oj core-libart) +endif +else # LOCAL_SDK_VERSION +ifeq ($(LOCAL_SDK_VERSION)$(TARGET_BUILD_APPS),current) +# LOCAL_SDK_VERSION is current and no TARGET_BUILD_APPS. +my_bootclasspath := $(call jack-lib-files,android_stubs_current) +else ifeq ($(LOCAL_SDK_VERSION)$(TARGET_BUILD_APPS),system_current) +my_bootclasspath := $(call jack-lib-files,android_system_stubs_current) +else ifeq ($(LOCAL_SDK_VERSION)$(TARGET_BUILD_APPS),test_current) +my_bootclasspath := $(call jack-lib-files,android_test_stubs_current) +else +my_bootclasspath :=$(call jack-lib-files,sdk_v$(LOCAL_SDK_VERSION)) +endif # current, system_current, or test_current +endif # LOCAL_SDK_VERSION +$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_BOOTCLASSPATH_JAVA_LIBRARIES := $(my_bootclasspath) + +full_shared_jack_libs := $(call jack-lib-files,$(LOCAL_JAVA_LIBRARIES),$(LOCAL_IS_HOST_MODULE)) +full_jack_deps := $(call jack-lib-deps,$(LOCAL_JAVA_LIBRARIES),$(LOCAL_IS_HOST_MODULE)) +# Turn off .toc optimization for apps build as we cannot build dexdump. +ifeq (,$(TARGET_BUILD_APPS)) +full_jack_deps := $(patsubst %.jack, %.dex.toc, $(full_jack_deps)) +endif + +else # LOCAL_IS_HOST_MODULE + +ifeq ($(USE_CORE_LIB_BOOTCLASSPATH),true) +ifeq ($(LOCAL_NO_STANDARD_LIBRARIES),true) +my_bootclasspath := +else +my_bootclasspath := $(call jack-lib-files,core-oj-hostdex core-libart-hostdex,$(LOCAL_IS_HOST_MODULE)) +endif +$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_BOOTCLASSPATH_JAVA_LIBRARIES := $(my_bootclasspath) +# Compiling against the final jack library. If we want to add support for obfuscated library +# we'll need to change that to compile against the not obfuscated jack library. +full_shared_jack_libs := $(call jack-lib-files,$(LOCAL_JAVA_LIBRARIES),$(LOCAL_IS_HOST_MODULE)) +full_jack_deps := $(call jack-lib-deps,$(LOCAL_JAVA_LIBRARIES),$(LOCAL_IS_HOST_MODULE)) +else +$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_BOOTCLASSPATH_JAVA_LIBRARIES := +full_shared_jack_libs := $(call jack-lib-deps,$(LOCAL_JAVA_LIBRARIES),$(LOCAL_IS_HOST_MODULE)) +full_jack_deps := $(full_shared_jack_libs) +endif # USE_CORE_LIB_BOOTCLASSPATH +endif # !LOCAL_IS_HOST_MODULE +full_jack_libs := $(full_shared_jack_libs) $(full_static_jack_libs) $(LOCAL_JACK_CLASSPATH) +full_jack_deps += $(full_static_jack_libs) $(LOCAL_JACK_CLASSPATH) + +ifndef LOCAL_IS_HOST_MODULE +# This is set by packages that are linking to other packages that export +# shared libraries, allowing them to make use of the code in the linked apk. +ifneq ($(apk_libraries),) + link_apk_jack_libraries := \ + $(foreach lib,$(apk_libraries), \ + $(call intermediates-dir-for, \ + APPS,$(lib),,COMMON)/classes.jack) + + # link against the jar with full original names (before proguard processing). + full_shared_jack_libs += $(link_apk_jack_libraries) + full_jack_libs += $(link_apk_jack_libraries) + full_jack_deps += $(link_apk_jack_libraries) +endif + +# This is set by packages that contain instrumentation, allowing them to +# link against the package they are instrumenting. Currently only one such +# package is allowed. +ifdef LOCAL_INSTRUMENTATION_FOR + # link against the jar with full original names (before proguard processing). + link_instr_classes_jack := $(link_instr_intermediates_dir.COMMON)/classes.noshrob.jack + full_jack_libs += $(link_instr_classes_jack) + full_jack_deps += $(link_instr_classes_jack) +endif # LOCAL_INSTRUMENTATION_FOR +endif # !LOCAL_IS_HOST_MODULE + +# Propagate local configuration options to this target. +$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_ALL_JACK_LIBRARIES:= $(full_jack_libs) +$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_JARJAR_RULES := $(LOCAL_JARJAR_RULES) + +endif # need_compile_java +endif # LOCAL_JACK_ENABLED diff --git a/core/java_library.mk b/core/java_library.mk index dffc7d90a..81a4a6a30 100644 --- a/core/java_library.mk +++ b/core/java_library.mk @@ -24,10 +24,20 @@ endif LOCAL_BUILT_MODULE_STEM := javalib.jar +################################# +include $(BUILD_SYSTEM)/configure_local_jack.mk +################################# + +ifdef LOCAL_JACK_ENABLED +ifdef LOCAL_IS_STATIC_JAVA_LIBRARY +LOCAL_BUILT_MODULE_STEM := classes.jack +endif +endif + 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) +common_javalib.jar := $(intermediates.COMMON)/javalib.jar LOCAL_INTERMEDIATE_TARGETS += $(common_javalib.jar) ifeq ($(LOCAL_PROGUARD_ENABLED),disabled) @@ -37,7 +47,12 @@ endif ifeq (true,$(EMMA_INSTRUMENT)) ifeq (true,$(LOCAL_EMMA_INSTRUMENT)) ifeq (true,$(EMMA_INSTRUMENT_STATIC)) +ifdef LOCAL_JACK_ENABLED +# Jack supports coverage with Jacoco +LOCAL_STATIC_JAVA_LIBRARIES += jacocoagent +else LOCAL_STATIC_JAVA_LIBRARIES += emma +endif # LOCAL_JACK_ENABLED endif # LOCAL_EMMA_INSTRUMENT endif # EMMA_INSTRUMENT_STATIC else @@ -58,24 +73,31 @@ $(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) +ifdef LOCAL_JACK_ENABLED +$(LOCAL_BUILT_MODULE) : $(full_classes_jack) +else +$(LOCAL_BUILT_MODULE) : $(common_javalib.jar) +endif $(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) +$(common_javalib.jar): PRIVATE_SOURCE_ARCHIVE := $(full_classes_jarjar_jar) +$(common_javalib.jar): PRIVATE_DONT_DELETE_JAR_DIRS := $(LOCAL_DONT_DELETE_JAR_DIRS) +$(common_javalib.jar) : $(built_dex) $(java_resource_sources) | $(ZIPTIME) @echo "target Jar: $(PRIVATE_MODULE) ($@)" +ifdef LOCAL_JACK_ENABLED $(create-empty-package) +else + $(call initialize-package-file,$(PRIVATE_SOURCE_ARCHIVE),$@) +endif $(add-dex-to-package) - $(add-carried-java-resources) -ifneq ($(extra_jar_args),) - $(add-java-resources-to-package) +ifdef LOCAL_JACK_ENABLED + $(add-carried-jack-resources) endif + $(remove-timestamps-from-package) ifdef LOCAL_DEX_PREOPT ifneq ($(dexpreopt_boot_jar_module),) # boot jar @@ -85,12 +107,6 @@ $(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. diff --git a/core/legacy_prebuilts.mk b/core/legacy_prebuilts.mk index c477900f2..f4633d019 100644 --- a/core/legacy_prebuilts.mk +++ b/core/legacy_prebuilts.mk @@ -22,68 +22,11 @@ # to add any new such module in the system GRANDFATHERED_ALL_PREBUILT := \ - akmd2 \ - ap_gain.bin \ - AVRCP.kl \ - batch \ - bitmap_size.txt \ bmgr \ - bp.img \ - brcm_guci_drv \ - bypassfactory \ - cdt.bin \ - chat-ril \ - cpcap-key.kl \ - egl.cfg \ - firmware_error.565 \ - firmware_install.565 \ - ftmipcd \ - gps.conf \ - gpsconfig.xml \ - gps.stingray.so \ - gralloc.omap3.so \ - gralloc.tegra.so \ - hwcomposer.tegra.so \ ime \ - init.goldfish.rc \ - init.goldfish.sh \ - init.olympus.rc \ - init.sholes.rc \ - init.stingray.rc \ input \ - kernel \ - lbl \ - libEGL_POWERVR_SGX530_121.so \ - libEGL_tegra.so \ - libGLESv1_CM_POWERVR_SGX530_121.so \ - libGLESv1_CM_tegra.so \ - libGLESv2_POWERVR_SGX530_121.so \ - libGLESv2_tegra.so \ - libmoto_ril.so \ - libpppd_plugin-ril.so \ - libril_rds.so \ - location \ - location.cfg \ - main.conf \ - mbm.bin \ - mbm_consumer.bin \ - mdm_panicd \ monkey \ pm \ - pppd-ril \ - pppd-ril.options \ - qwerty.kl \ - radio.img \ - rdl.bin \ RFFspeed_501.bmd \ RFFstd_501.bmd \ - savebpver \ - sholes-keypad.kl \ - suplcerts.bks \ - svc \ - tcmd \ - ueventd.goldfish.rc \ - ueventd.olympus.rc \ - ueventd.stingray.rc \ - vold.fstab \ - wl1271.bin + svc diff --git a/core/main.mk b/core/main.mk index 9d6e233d4..7df4dcbbc 100644 --- a/core/main.mk +++ b/core/main.mk @@ -29,7 +29,7 @@ endif # TOPDIR is the normal variable you should use, because # if we are executing relative to the current directory # it can be "", whereas TOP must be "." which causes -# pattern matching probles when make strips off the +# pattern matching problems when make strips off the # trailing "./" from paths in various places. #ifeq ($(TOP),.) #TOPDIR := @@ -38,8 +38,6 @@ endif #endif # Check for broken versions of make. -# (Allow any version under Cygwin since we don't actually build the platform there.) -ifeq (,$(findstring CYGWIN,$(shell uname -sm))) ifneq (1,$(strip $(shell expr $(MAKE_VERSION) \>= 3.81))) $(warning ********************************************************************************) $(warning * You are using version $(MAKE_VERSION) of make.) @@ -48,7 +46,6 @@ $(warning * see https://source.android.com/source/download.html) $(warning ********************************************************************************) $(error stopping) endif -endif # Absolute path of the present working direcotry. # This overrides the shell variable $PWD, which does not necessarily points to @@ -60,10 +57,16 @@ TOPDIR := BUILD_SYSTEM := $(TOPDIR)build/core +# Ensure JAVA_NOT_REQUIRED is not set externally. +JAVA_NOT_REQUIRED := false + # This is the default target. It must be the first declared target. .PHONY: droid DEFAULT_GOAL := droid -$(DEFAULT_GOAL): +$(DEFAULT_GOAL): droid_targets + +.PHONY: droid_targets +droid_targets: # Used to force goals to build. Only use for conditionally defined goals. .PHONY: FORCE @@ -78,13 +81,18 @@ dont_bother_goals := clean clobber dataclean installclean \ userdataimage-nodeps userdatatarball-nodeps \ cacheimage-nodeps \ vendorimage-nodeps \ + systemotherimage-nodeps \ ramdisk-nodeps \ - bootimage-nodeps + bootimage-nodeps \ + recoveryimage-nodeps \ + product-graph dump-products ifneq ($(filter $(dont_bother_goals), $(MAKECMDGOALS)),) dont_bother := true endif +ORIGINAL_MAKECMDGOALS := $(MAKECMDGOALS) + # Targets that provide quick help on the build system. include $(BUILD_SYSTEM)/help.mk @@ -92,6 +100,45 @@ include $(BUILD_SYSTEM)/help.mk # and host information. include $(BUILD_SYSTEM)/config.mk +relaunch_with_ninja := +ifneq ($(USE_NINJA),false) +ifndef BUILDING_WITH_NINJA +relaunch_with_ninja := true +endif +endif + +ifeq ($(relaunch_with_ninja),true) +# Mark this is a ninja build. +$(shell mkdir -p $(OUT_DIR) && touch $(OUT_DIR)/ninja_build) +include build/core/ninja.mk +else # !relaunch_with_ninja +ifndef BUILDING_WITH_NINJA +# Remove ninja build mark if it exists. +$(shell rm -f $(OUT_DIR)/ninja_build) +endif + +# Write the build number to a file so it can be read back in +# without changing the command line every time. Avoids rebuilds +# when using ninja. +$(shell mkdir -p $(OUT_DIR) && \ + echo -n $(BUILD_NUMBER) > $(OUT_DIR)/build_number.txt && \ + echo -n $(BUILD_DATETIME) > $(OUT_DIR)/build_date.txt) +BUILD_NUMBER_FROM_FILE := $(shell cat $(OUT_DIR)/build_number.txt) +BUILD_DATETIME_FROM_FILE := $(shell cat $(OUT_DIR)/build_date.txt) +ifeq ($(HOST_OS),darwin) +DATE_FROM_FILE := date -r $(BUILD_DATETIME_FROM_FILE) +else +DATE_FROM_FILE := date -d @$(BUILD_DATETIME_FROM_FILE) +endif + +# CTS-specific config. +-include cts/build/config.mk +# VTS-specific config. +-include test/vts/tools/vts-tradefed/build/config.mk + +# CMTS-specific config. +-include vendor/cmts/build/config.mk + # This allows us to force a clean build - included after the config.mk # environment setup is done, but before we generate any dependencies. This # file does the rm -rf inline so the deps which are all done below will @@ -101,13 +148,12 @@ include $(BUILD_SYSTEM)/cleanbuild.mk # Include the google-specific config -include vendor/google/build/config.mk -VERSION_CHECK_SEQUENCE_NUMBER := 5 +VERSION_CHECK_SEQUENCE_NUMBER := 6 -include $(OUT_DIR)/versions_checked.mk ifneq ($(VERSION_CHECK_SEQUENCE_NUMBER),$(VERSIONS_CHECKED)) $(info Checking build tools versions...) -ifneq ($(HOST_OS),windows) # check for a case sensitive file system ifneq (a,$(shell mkdir -p $(OUT_DIR) ; \ echo a > $(OUT_DIR)/casecheck.txt; \ @@ -119,7 +165,6 @@ $(warning Please move your source tree to a case-sensitive filesystem.) $(warning ************************************************************) $(error Case-insensitive filesystems not supported) endif -endif # Make sure that there are no spaces in the absolute path; the # build system can't deal with them. @@ -136,22 +181,23 @@ $(warning ************************************************************) $(error Directory names containing spaces not supported) endif +ifeq ($(JAVA_NOT_REQUIRED), false) java_version_str := $(shell unset _JAVA_OPTIONS && java -version 2>&1) javac_version_str := $(shell unset _JAVA_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),) +# Check for the correct version of java, should be 1.8 by +# default and only 1.7 if LEGACY_USE_JAVA7 is set. +ifeq ($(LEGACY_USE_JAVA7),) # if LEGACY_USE_JAVA7 == '' +required_version := "1.8.x" +required_javac_version := "1.8" +java_version := $(shell echo '$(java_version_str)' | grep '[ "]1\.8[\. "$$]') +javac_version := $(shell echo '$(javac_version_str)' | grep '[ "]1\.8[\. "$$]') +else 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 +endif # if LEGACY_USE_JAVA7 == '' ifeq ($(strip $(java_version)),) $(info ************************************************************) @@ -167,42 +213,12 @@ $(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 +KNOWN_INCOMPATIBLE_JAVAC_VERSIONS := google +incompat_javac := $(foreach v,$(KNOWN_INCOMPATIBLE_JAVAC_VERSIONS),$(findstring $(v),$(javac_version_str))) +ifneq ($(incompat_javac),) +javac_version := endif - -# Check for the current jdk -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 - # Check for the correct version of javac ifeq ($(strip $(javac_version)),) $(info ************************************************************) @@ -210,7 +226,12 @@ $(info You are attempting to build with the incorrect version) $(info of javac.) $(info $(space)) $(info Your version is: $(javac_version_str).) +ifneq ($(incompat_javac),) +$(info This '$(incompat_javac)' version is not supported for Android platform builds.) +$(info Use a publicly available JDK and make sure you have run envsetup.sh / lunch.) +else $(info The required version is: $(required_javac_version)) +endif $(info $(space)) $(info Please follow the machine setup instructions at) $(info $(space)$(space)$(space)$(space)https://source.android.com/source/download.html) @@ -218,6 +239,7 @@ $(info ************************************************************) $(error stop) endif +endif # if JAVA_NOT_REQUIRED ifndef BUILD_EMULATOR # Emulator binaries are now provided under prebuilts/android-emulator/ @@ -233,23 +255,7 @@ endif # These are the modifier targets that don't do anything themselves, but # change the behavior of the build. # (must be defined before including definitions.make) -INTERNAL_MODIFIER_TARGETS := showcommands all incrementaljavac - -.PHONY: incrementaljavac -incrementaljavac: ; - -# WARNING: -# ENABLE_INCREMENTALJAVAC should NOT be enabled by default, because change of -# a Java source file won't trigger rebuild of its dependent Java files. -# You can only enable it by adding "incrementaljavac" to your make command line. -# You are responsible for the correctness of the incremental build. -# This may decrease incremental build time dramatically for large Java libraries, -# such as core.jar, framework.jar, etc. -ENABLE_INCREMENTALJAVAC := -ifneq (,$(filter incrementaljavac, $(MAKECMDGOALS))) -ENABLE_INCREMENTALJAVAC := true -MAKECMDGOALS := $(filter-out incrementaljavac, $(MAKECMDGOALS)) -endif +INTERNAL_MODIFIER_TARGETS := showcommands all # EMMA_INSTRUMENT_STATIC merges the static emma library to each emma-enabled module. ifeq (true,$(EMMA_INSTRUMENT_STATIC)) @@ -277,8 +283,8 @@ endif ifneq ($(filter-out $(INTERNAL_VALID_VARIANTS),$(TARGET_BUILD_VARIANT)),) $(info ***************************************************************) $(info ***************************************************************) -$(info Invalid variant: $(TARGET_BUILD_VARIANT) -$(info Valid values are: $(INTERNAL_VALID_VARIANTS) +$(info Invalid variant: $(TARGET_BUILD_VARIANT)) +$(info Valid values are: $(INTERNAL_VALID_VARIANTS)) $(info ***************************************************************) $(info ***************************************************************) $(error stopping) @@ -296,6 +302,30 @@ TARGET_BUILD_JAVA_SUPPORT_LEVEL := platform # The pdk (Platform Development Kit) build include build/core/pdk_config.mk +# +# ----------------------------------------------------------------- +# Jack version configuration +-include $(TOPDIR)prebuilts/sdk/tools/jack_versions.mk +-include $(TOPDIR)prebuilts/sdk/tools/jack_for_module.mk + +# +# ----------------------------------------------------------------- +# Install and start Jack server +-include $(TOPDIR)prebuilts/sdk/tools/jack_server_setup.mk + +# +# ----------------------------------------------------------------- +# Jacoco package name for Jack +-include $(TOPDIR)external/jacoco/config.mk + +# +# ----------------------------------------------------------------- +# Enable dynamic linker developer warnings for all builds except +# final release. +ifneq ($(PLATFORM_VERSION_CODENAME),REL) + ADDITIONAL_BUILD_PROPERTIES += ro.bionic.ld.warning=1 +endif + # ----------------------------------------------------------------- ### ### In this section we set up the things that are different @@ -308,9 +338,19 @@ ifneq ($(filter sdk win_sdk sdk_addon,$(MAKECMDGOALS)),) is_sdk_build := true endif -ADDITIONAL_BUILD_PROPERTIES += dalvik.vm.isa.$(TARGET_ARCH).features=$(DEX2OAT_TARGET_INSTRUCTION_SET_FEATURES) +# Add build properties for ART. These define system properties used by installd +# to pass flags to dex2oat. +ADDITIONAL_BUILD_PROPERTIES += persist.sys.dalvik.vm.lib.2=libart.so +ADDITIONAL_BUILD_PROPERTIES += dalvik.vm.isa.$(TARGET_ARCH).variant=$(DEX2OAT_TARGET_CPU_VARIANT) +ifneq ($(DEX2OAT_TARGET_INSTRUCTION_SET_FEATURES),) + ADDITIONAL_BUILD_PROPERTIES += dalvik.vm.isa.$(TARGET_ARCH).features=$(DEX2OAT_TARGET_INSTRUCTION_SET_FEATURES) +endif + ifdef TARGET_2ND_ARCH -ADDITIONAL_BUILD_PROPERTIES += dalvik.vm.isa.$(TARGET_2ND_ARCH).features=$($(TARGET_2ND_ARCH_VAR_PREFIX)DEX2OAT_TARGET_INSTRUCTION_SET_FEATURES) + ADDITIONAL_BUILD_PROPERTIES += dalvik.vm.isa.$(TARGET_2ND_ARCH).variant=$($(TARGET_2ND_ARCH_VAR_PREFIX)DEX2OAT_TARGET_CPU_VARIANT) + ifneq ($($(TARGET_2ND_ARCH_VAR_PREFIX)DEX2OAT_TARGET_INSTRUCTION_SET_FEATURES),) + ADDITIONAL_BUILD_PROPERTIES += dalvik.vm.isa.$(TARGET_2ND_ARCH).features=$($(TARGET_2ND_ARCH_VAR_PREFIX)DEX2OAT_TARGET_INSTRUCTION_SET_FEATURES) + endif endif ## user/userdebug ## @@ -321,31 +361,20 @@ tags_to_install := ifneq (,$(user_variant)) # Target is secure in user builds. ADDITIONAL_DEFAULT_PROPERTIES += ro.secure=1 + ADDITIONAL_DEFAULT_PROPERTIES += security.perf_harden=1 + + ifeq ($(user_variant),user) + ADDITIONAL_DEFAULT_PROPERTIES += ro.adb.secure=1 + endif ifeq ($(user_variant),userdebug) # Pick up some extra useful tools tags_to_install += debug - - # Enable Dalvik lock contention logging for userdebug builds. - ADDITIONAL_BUILD_PROPERTIES += dalvik.vm.lockprof.threshold=500 else # Disable debugging in plain user builds. enable_target_debugging := endif - # Turn on Dalvik preoptimization for libdvm.so user builds, but only if not - # explicitly disabled and the build is running on Linux (since host - # Dalvik isn't built for non-Linux hosts). - ifeq (,$(WITH_DEXPREOPT)) - ifeq ($(DALVIK_VM_LIB),libdvm.so) - ifeq ($(user_variant),user) - ifeq ($(HOST_OS),linux) - WITH_DEXPREOPT := true - endif - endif - endif - endif - # Disallow mock locations by default for user builds ADDITIONAL_DEFAULT_PROPERTIES += ro.allow.mock.location=0 @@ -361,6 +390,8 @@ endif # !user_variant ifeq (true,$(strip $(enable_target_debugging))) # Target is more debuggable and adbd is on by default ADDITIONAL_DEFAULT_PROPERTIES += ro.debuggable=1 + # Enable Dalvik lock contention logging. + ADDITIONAL_BUILD_PROPERTIES += dalvik.vm.lockprof.threshold=500 # Include the debugging/testing OTA keys in this build. INCLUDE_TEST_OTA_KEYS := true else # !enable_target_debugging @@ -379,10 +410,8 @@ ifneq ($(filter ro.setupwizard.mode=ENABLED, $(call collapse-pairs, $(ADDITIONAL ro.setupwizard.mode=OPTIONAL endif ifndef is_sdk_build - # Don't even verify the image on eng builds to speed startup - ADDITIONAL_BUILD_PROPERTIES += dalvik.vm.image-dex2oat-filter=verify-none - # Don't compile apps on eng builds to speed startup - ADDITIONAL_BUILD_PROPERTIES += dalvik.vm.dex2oat-filter=interpret-only + # To speedup startup of non-preopted builds, don't verify or compile the boot image. + ADDITIONAL_BUILD_PROPERTIES += dalvik.vm.image-dex2oat-filter=verify-at-runtime endif endif @@ -394,7 +423,7 @@ ifdef is_sdk_build sdk_repo_goal := $(strip $(filter sdk_repo,$(MAKECMDGOALS))) MAKECMDGOALS := $(strip $(filter-out sdk_repo,$(MAKECMDGOALS))) -ifneq ($(words $(filter-out $(INTERNAL_MODIFIER_TARGETS) checkbuild emulator_tests target-files-package,$(MAKECMDGOALS))),1) +ifneq ($(words $(sort $(filter-out $(INTERNAL_MODIFIER_TARGETS) checkbuild emulator_tests target-files-package,$(MAKECMDGOALS)))),1) $(error The 'sdk' target may not be specified with any other targets) endif @@ -408,16 +437,6 @@ endif BUILD_WITHOUT_PV := true -## precise GC ## - -ifneq ($(filter dalvik.gc.type-precise,$(PRODUCT_TAGS)),) - # Enabling type-precise GC results in larger optimized DEX files. The - # additional storage requirements for ".odex" files can cause /system - # to overflow on some devices, so this is configured separately for - # each product. - ADDITIONAL_BUILD_PROPERTIES += dalvik.vm.dexopt-flags=m=y -endif - ADDITIONAL_BUILD_PROPERTIES += net.bt.name=Android # enable vm tracing in files for now to help track @@ -450,21 +469,6 @@ ifeq ($(filter-out $(INTERNAL_MODIFIER_TARGETS),$(MAKECMDGOALS)),) $(INTERNAL_MODIFIER_TARGETS): $(DEFAULT_GOAL) endif -# Bring in all modules that need to be built. -ifeq ($(HOST_OS),windows) -SDK_ONLY := true -endif - -ifeq ($(SDK_ONLY),true) -include $(TOPDIR)sdk/build/windows_sdk_whitelist.mk -include $(TOPDIR)development/build/windows_sdk_whitelist.mk - -# Exclude tools/acp when cross-compiling windows under linux -ifeq ($(findstring Linux,$(UNAME)),) -subdirs += build/tools/acp -endif - -else # !SDK_ONLY # # Typical build; include any Android.mk files we can find. # @@ -472,8 +476,6 @@ subdirs := $(TOP) FULL_BUILD := true -endif # !SDK_ONLY - # Before we go and include all of the module makefiles, stash away # the PRODUCT_* values so that later we can verify they are not modified. stash_product_vars:=true @@ -484,7 +486,12 @@ endif ifneq ($(ONE_SHOT_MAKEFILE),) # We've probably been invoked by the "mm" shell function # with a subdirectory's makefile. + +# No Makefiles to include if we are performing a mms/short-circuit build. Only +# the targets mentioned by main.mk and tasks/* are built (kernel, boot.img etc) +ifneq ($(ONE_SHOT_MAKEFILE),__none__) include $(ONE_SHOT_MAKEFILE) +endif # Change CUSTOM_MODULES to include only modules that were # defined by this makefile; this will install all of those # modules as a side-effect. Do this after including ONE_SHOT_MAKEFILE @@ -500,6 +507,7 @@ NOTICE-TARGET-%: ; # A helper goal printing out install paths .PHONY: GET-INSTALL-PATH GET-INSTALL-PATH: + @echo "Install paths for modules in $(ONE_SHOT_MAKEFILE):" @$(foreach m, $(ALL_MODULES), $(if $(ALL_MODULES.$(m).INSTALLED), \ echo 'INSTALL-PATH: $(m) $(ALL_MODULES.$(m).INSTALLED)';)) @@ -513,9 +521,18 @@ ifneq ($(dont_bother),true) # Can't use first-makefiles-under here because # --mindepth=2 makes the prunes not work. subdir_makefiles := \ - $(shell build/tools/findleaves.py --prune=$(OUT_DIR) --prune=.repo --prune=.git $(subdirs) Android.mk) + $(shell build/tools/findleaves.py $(FIND_LEAVES_EXCLUDES) $(subdirs) Android.mk) -$(foreach mk, $(subdir_makefiles), $(info including $(mk) ...)$(eval include $(mk))) +ifeq ($(USE_SOONG),true) +subdir_makefiles := $(SOONG_ANDROID_MK) $(call filter-soong-makefiles,$(subdir_makefiles)) +endif + +$(foreach mk, $(subdir_makefiles), $(eval include $(mk))) + +ifdef PDK_FUSION_PLATFORM_ZIP +# Bring in the PDK platform.zip modules. +include $(BUILD_SYSTEM)/pdk_fusion_modules.mk +endif # PDK_FUSION_PLATFORM_ZIP endif # dont_bother @@ -585,6 +602,8 @@ $(strip $(foreach m,$(1),\ $(m)))) endef +# If a module is for a cross host os, the required modules must be for +# that OS too. # If a module is built for 32-bit, the required modules must be 32-bit too; # Otherwise if the module is an exectuable or shared library, # the required modules must be 64-bit; @@ -592,6 +611,8 @@ endef $(foreach m,$(ALL_MODULES),\ $(eval r := $(ALL_MODULES.$(m).REQUIRED))\ $(if $(r),\ + $(if $(ALL_MODULES.$(m).FOR_HOST_CROSS),\ + $(eval r := $(addprefix host_cross_,$(r))))\ $(if $(ALL_MODULES.$(m).FOR_2ND_ARCH),\ $(eval r_r := $(call get-32-bit-modules-if-we-can,$(r))),\ $(if $(filter EXECUTABLES SHARED_LIBRARIES,$(ALL_MODULES.$(m).CLASS)),\ @@ -614,32 +635,40 @@ $(foreach m,$(ALL_MODULES), \ $(eval r := $(call module-installed-files,$(r))) \ $(eval t_m := $(filter $(TARGET_OUT_ROOT)/%, $(ALL_MODULES.$(m).INSTALLED))) \ $(eval h_m := $(filter $(HOST_OUT_ROOT)/%, $(ALL_MODULES.$(m).INSTALLED))) \ + $(eval hc_m := $(filter $(HOST_CROSS_OUT_ROOT)/%, $(ALL_MODULES.$(m).INSTALLED))) \ $(eval t_r := $(filter $(TARGET_OUT_ROOT)/%, $(r))) \ $(eval h_r := $(filter $(HOST_OUT_ROOT)/%, $(r))) \ + $(eval hc_r := $(filter $(HOST_CROSS_OUT_ROOT)/%, $(r))) \ $(eval t_m := $(filter-out $(t_r), $(t_m))) \ $(eval h_m := $(filter-out $(h_r), $(h_m))) \ + $(eval hc_m := $(filter-out $(hc_r), $(hc_m))) \ $(if $(t_m), $(eval $(call add-required-deps, $(t_m),$(t_r)))) \ $(if $(h_m), $(eval $(call add-required-deps, $(h_m),$(h_r)))) \ + $(if $(hc_m), $(eval $(call add-required-deps, $(hc_m),$(hc_r)))) \ ) \ ) t_m := h_m := +hc_m := t_r := h_r := +hc_r := # Establish the dependecies on the shared libraries. # It also adds the shared library module names to ALL_MODULES.$(m).REQUIRED, # so they can be expanded to product_MODULES later. -# $(1): TARGET_ or HOST_. +# $(1): TARGET_ or HOST_ or HOST_CROSS_. # $(2): non-empty for 2nd arch. +# $(3): non-empty for host cross compile. define resolve-shared-libs-depes $(foreach m,$($(if $(2),$($(1)2ND_ARCH_VAR_PREFIX))$(1)DEPENDENCIES_ON_SHARED_LIBRARIES),\ $(eval p := $(subst :,$(space),$(m)))\ $(eval mod := $(firstword $(p)))\ $(eval deps := $(subst $(comma),$(space),$(lastword $(p))))\ $(if $(2),$(eval deps := $(addsuffix $($(1)2ND_ARCH_MODULE_SUFFIX),$(deps))))\ - $(eval r := $(filter $($(1)OUT_ROOT)/%,$(call module-installed-files,\ + $(if $(3),$(eval deps := $(addprefix host_cross_,$(deps))))\ + $(eval r := $(filter $($(1)OUT)/%,$(call module-installed-files,\ $(deps))))\ $(eval $(call add-required-deps,$(word 2,$(p)),$(r)))\ $(eval ALL_MODULES.$(mod).REQUIRED += $(deps))) @@ -653,6 +682,9 @@ $(call resolve-shared-libs-depes,HOST_) ifdef HOST_2ND_ARCH $(call resolve-shared-libs-depes,HOST_,true) endif +ifdef HOST_CROSS_OS +$(call resolve-shared-libs-depes,HOST_CROSS_,,true) +endif m := r := @@ -745,15 +777,20 @@ overridden_packages := $(call get-package-overrides,$(modules_to_install)) ifdef overridden_packages # old_modules_to_install := $(modules_to_install) modules_to_install := \ - $(filter-out $(foreach p,$(overridden_packages),$(p) %/$(p).apk), \ + $(filter-out $(foreach p,$(overridden_packages),$(p) %/$(p).apk %/$(p).odex), \ $(modules_to_install)) endif #$(error filtered out # $(filter-out $(modules_to_install),$(old_modules_to_install))) -# Don't include any GNU targets in the SDK. It's ok (and necessary) -# to build the host tools, but nothing that's going to be installed -# on the target (including static libraries). +# Don't include any GNU General Public License shared objects or static +# libraries in SDK images. GPL executables (not static/dynamic libraries) +# are okay if they don't link against any closed source libraries (directly +# or indirectly) + +# It's ok (and necessary) to build the host tools, but nothing that's +# going to be installed on the target (including static libraries). + ifdef is_sdk_build target_gnu_MODULES := \ $(filter \ @@ -761,6 +798,7 @@ ifdef is_sdk_build $(TARGET_OUT)/% \ $(TARGET_OUT_DATA)/%, \ $(sort $(call get-tagged-modules,gnu))) + target_gnu_MODULES := $(filter-out $(TARGET_OUT_EXECUTABLES)/%,$(target_gnu_MODULES)) $(info Removing from sdk:)$(foreach d,$(target_gnu_MODULES),$(info : $(d))) modules_to_install := \ $(filter-out $(target_gnu_MODULES),$(modules_to_install)) @@ -771,10 +809,6 @@ ifdef is_sdk_build $(foreach m, $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_PACKAGES), \ $(if $(strip $(ALL_MODULES.$(m).INSTALLED) $(ALL_MODULES.$(m)$(TARGET_2ND_ARCH_MODULE_SUFFIX).INSTALLED)),,\ $(eval dangling_modules += $(m)))) - ifneq ($(TARGET_IS_64_BIT),true) - # We know those 64-bit modules don't exist in the 32-bit SDK build. - dangling_modules := $(filter-out %64,$(dangling_modules)) - endif ifneq ($(dangling_modules),) $(warning: Modules '$(dangling_modules)' in PRODUCT_PACKAGES have nothing to install!) endif @@ -837,23 +871,17 @@ files: prebuilt \ # ------------------------------------------------------------------- .PHONY: checkbuild -checkbuild: $(modules_to_check) -ifeq (true,$(ANDROID_BUILD_EVERYTHING_BY_DEFAULT)$(filter $(MAKECMDGOALS),checkbuild)) +checkbuild: $(modules_to_check) droid_targets +ifeq ($(USE_SOONG),true) +checkbuild: checkbuild-soong +endif +ifeq (true,$(ANDROID_BUILD_EVERYTHING_BY_DEFAULT)) droid: checkbuild -else -# ANDROID_BUILD_EVERYTHING_BY_DEFAULT not set, or checkbuild is one of the cmd goals. -checkbuild: droid endif .PHONY: ramdisk ramdisk: $(INSTALLED_RAMDISK_TARGET) -.PHONY: factory_ramdisk -factory_ramdisk: $(INSTALLED_FACTORY_RAMDISK_TARGET) - -.PHONY: factory_bundle -factory_bundle: $(INSTALLED_FACTORY_BUNDLE_TARGET) - .PHONY: systemtarball systemtarball: $(INSTALLED_SYSTEMTARBALL_TARGET) @@ -876,6 +904,9 @@ cacheimage: $(INSTALLED_CACHEIMAGE_TARGET) .PHONY: vendorimage vendorimage: $(INSTALLED_VENDORIMAGE_TARGET) +.PHONY: systemotherimage +systemotherimage: $(INSTALLED_SYSTEMOTHERIMAGE_TARGET) + .PHONY: bootimage bootimage: $(INSTALLED_BOOTIMAGE_TARGET) @@ -885,7 +916,8 @@ ifndef BUILD_MODULES_IN_PATHS all_modules: $(ALL_MODULES) else # BUILD_MODULES_IN_PATHS is a list of paths relative to the top of the tree -module_path_patterns := $(foreach p, $(BUILD_MODULES_IN_PATHS),\ +build_modules_in_paths := $(patsubst ./%,%,$(BUILD_MODULES_IN_PATHS)) +module_path_patterns := $(foreach p, $(build_modules_in_paths),\ $(if $(filter %/,$(p)),$(p)%,$(p)/%)) my_all_modules := $(sort $(foreach m, $(ALL_MODULES),$(if $(filter\ $(module_path_patterns), $(addsuffix /,$(ALL_MODULES.$(m).PATH))),$(m)))) @@ -902,7 +934,10 @@ droidcore: files \ $(INSTALLED_USERDATAIMAGE_TARGET) \ $(INSTALLED_CACHEIMAGE_TARGET) \ $(INSTALLED_VENDORIMAGE_TARGET) \ - $(INSTALLED_FILES_FILE) + $(INSTALLED_SYSTEMOTHERIMAGE_TARGET) \ + $(INSTALLED_FILES_FILE) \ + $(INSTALLED_FILES_FILE_VENDOR) \ + $(INSTALLED_FILES_FILE_SYSTEMOTHER) # dist_files only for putting your library into the dist directory with a full build. .PHONY: dist_files @@ -924,7 +959,9 @@ ifneq ($(TARGET_BUILD_APPS),) # For uninstallable modules such as static Java library, we have to dist the built file, # as . apps_only_dist_built_files := $(foreach m,$(unbundled_build_modules),$(if $(ALL_MODULES.$(m).INSTALLED),,\ - $(if $(ALL_MODULES.$(m).BUILT),$(ALL_MODULES.$(m).BUILT):$(m)$(suffix $(ALL_MODULES.$(m).BUILT))))) + $(if $(ALL_MODULES.$(m).BUILT),$(ALL_MODULES.$(m).BUILT):$(m)$(suffix $(ALL_MODULES.$(m).BUILT)))\ + $(if $(ALL_MODULES.$(m).AAR),$(ALL_MODULES.$(m).AAR):$(m).aar)\ + )) $(call dist-for-goals,apps_only, $(apps_only_dist_built_files)) ifeq ($(EMMA_INSTRUMENT),true) @@ -942,7 +979,7 @@ ifneq ($(TARGET_BUILD_APPS),) .PHONY: apps_only apps_only: $(unbundled_build_modules) -droid: apps_only +droid_targets: apps_only # Combine the NOTICE files for a apps_only build $(eval $(call combine-notice-files, \ @@ -957,14 +994,15 @@ else # TARGET_BUILD_APPS $(call dist-for-goals, droidcore, \ $(INTERNAL_UPDATE_PACKAGE_TARGET) \ $(INTERNAL_OTA_PACKAGE_TARGET) \ + $(BUILT_OTATOOLS_PACKAGE) \ $(SYMBOLS_ZIP) \ $(INSTALLED_FILES_FILE) \ + $(INSTALLED_FILES_FILE_VENDOR) \ + $(INSTALLED_FILES_FILE_SYSTEMOTHER) \ $(INSTALLED_BUILD_PROP_TARGET) \ $(BUILT_TARGET_FILES_PACKAGE) \ $(INSTALLED_ANDROID_INFO_TXT_TARGET) \ $(INSTALLED_RAMDISK_TARGET) \ - $(INSTALLED_FACTORY_RAMDISK_TARGET) \ - $(INSTALLED_FACTORY_BUNDLE_TARGET) \ ) # Put a copy of the radio/bootloader files in the dist dir. @@ -988,7 +1026,7 @@ else # TARGET_BUILD_APPS endif # Building a full system-- the default is to build droidcore -droid: droidcore dist_files +droid_targets: droidcore dist_files endif # TARGET_BUILD_APPS @@ -1020,13 +1058,13 @@ target-native-tests : native-target-tests tests : host-tests target-tests # To catch more build breakage, check build tests modules in eng and userdebug builds. +ifneq ($(ANDROID_NO_TEST_CHECK),true) ifneq ($(TARGET_BUILD_PDK),true) ifneq ($(filter eng userdebug,$(TARGET_BUILD_VARIANT)),) droidcore : target-tests host-tests endif endif - -.PHONY: lintall +endif ifneq (,$(filter samplecode, $(MAKECMDGOALS))) .PHONY: samplecode @@ -1049,7 +1087,7 @@ findbugs: $(INTERNAL_FINDBUGS_HTML_TARGET) $(INTERNAL_FINDBUGS_XML_TARGET) .PHONY: clean clean: - @rm -rf $(OUT_DIR)/* + @rm -rf $(OUT_DIR)/* $(OUT_DIR)/..?* $(OUT_DIR)/.[!.]* @echo "Entire build directory removed." .PHONY: clobber @@ -1071,3 +1109,4 @@ showcommands: .PHONY: nothing nothing: @echo Successfully read the makefiles. +endif # !relaunch_with_ninja diff --git a/core/module_arch_supported.mk b/core/module_arch_supported.mk index a5e4a7cbc..62e264331 100644 --- a/core/module_arch_supported.mk +++ b/core/module_arch_supported.mk @@ -8,9 +8,11 @@ ## LOCAL_MODULE_$(my_prefix)ARCH_WARN ## LOCAL_MODULE_UNSUPPORTED_$(my_prefix)ARCH ## LOCAL_MODULE_UNSUPPORTED_$(my_prefix)ARCH_WARN +## LOCAL_IS_HOST_MODULE +## LOCAL_MODULE_HOST_OS ## ## Inputs from build system: -## $(my_prefix)IS_64_BIT +## $(LOCAL_2ND_ARCH_VAR_PREFIX)$(my_prefix)IS_64_BIT ## LOCAL_2ND_ARCH_VAR_PREFIX ## ## Outputs: @@ -23,19 +25,18 @@ ifeq ($(my_module_multilib),none) my_module_arch_supported := false endif -ifeq ($(LOCAL_2ND_ARCH_VAR_PREFIX),) -ifeq ($($(my_prefix)IS_64_BIT)|$(my_module_multilib),true|32) +ifeq ($($(LOCAL_2ND_ARCH_VAR_PREFIX)$(my_prefix)IS_64_BIT)|$(my_module_multilib),true|32) my_module_arch_supported := false -else ifeq ($($(my_prefix)IS_64_BIT)|$(my_module_multilib),|64) +endif +ifeq ($($(LOCAL_2ND_ARCH_VAR_PREFIX)$(my_prefix)IS_64_BIT)|$(my_module_multilib),|64) my_module_arch_supported := false endif -else # LOCAL_2ND_ARCH_VAR_PREFIX + +ifneq ($(LOCAL_2ND_ARCH_VAR_PREFIX),) ifeq ($(my_module_multilib),first) my_module_arch_supported := false -else ifeq ($(my_module_multilib),64) -my_module_arch_supported := false endif -endif # LOCAL_2ND_ARCH_VAR_PREFIX +endif ifneq (,$(LOCAL_MODULE_$(my_prefix)ARCH)) ifeq (,$(filter $($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH),$(LOCAL_MODULE_$(my_prefix)ARCH))) @@ -58,3 +59,14 @@ ifneq (,$(filter $($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH),$(LOCAL_MODULE_ my_module_arch_supported := false $(warning $(LOCAL_MODULE): architecture $($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH) unsupported) endif + +ifdef LOCAL_IS_HOST_MODULE +ifneq (,$(LOCAL_MODULE_HOST_OS)) + ifeq (,$(filter $($(my_prefix)OS),$(LOCAL_MODULE_HOST_OS))) + my_module_arch_supported := false + endif +else ifeq ($($(my_prefix)OS),windows) + # If LOCAL_MODULE_HOST_OS is empty, only linux and darwin are supported + my_module_arch_supported := false +endif +endif diff --git a/core/multi_prebuilt.mk b/core/multi_prebuilt.mk index bc85cea4a..ed2fed686 100644 --- a/core/multi_prebuilt.mk +++ b/core/multi_prebuilt.mk @@ -76,8 +76,7 @@ $(foreach t,$(1), \ ) \ ) \ $(eval LOCAL_MODULE_SUFFIX := $(suffix $(LOCAL_SRC_FILES))) \ - $(if $(filter user,$(TARGET_BUILD_VARIANT)), \ - $(eval LOCAL_STRIP_MODULE := $(8))) \ + $(eval LOCAL_STRIP_MODULE := $(8)) \ $(eval include $(BUILD_PREBUILT)) \ ) endef diff --git a/core/native_benchmark.mk b/core/native_benchmark.mk new file mode 100644 index 000000000..ac377011c --- /dev/null +++ b/core/native_benchmark.mk @@ -0,0 +1,17 @@ +########################################### +## A thin wrapper around BUILD_EXECUTABLE +## Common flags for native benchmarks are added. +########################################### + +LOCAL_STATIC_LIBRARIES += libgoogle-benchmark + +LOCAL_MODULE_PATH_64 := $(TARGET_OUT_DATA_METRIC_TESTS)/$(LOCAL_MODULE) +LOCAL_MODULE_PATH_32 := $($(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_DATA_METRIC_TESTS)/$(LOCAL_MODULE) + +ifndef LOCAL_MULTILIB +ifndef LOCAL_32_BIT_ONLY +LOCAL_MULTILIB := both +endif +endif + +include $(BUILD_EXECUTABLE) diff --git a/core/ninja.mk b/core/ninja.mk new file mode 100644 index 000000000..109fe77f3 --- /dev/null +++ b/core/ninja.mk @@ -0,0 +1,195 @@ +NINJA ?= $(shell which ninja) +ifeq ($(NINJA),) + NINJA := prebuilts/ninja/$(HOST_PREBUILT_TAG)/ninja +endif + +ifeq ($(USE_SOONG),true) +USE_SOONG_FOR_KATI := true +endif + +ifeq ($(USE_SOONG_FOR_KATI),true) +include $(BUILD_SYSTEM)/soong.mk +else +KATI ?= $(HOST_OUT_EXECUTABLES)/ckati +MAKEPARALLEL ?= $(HOST_OUT_EXECUTABLES)/makeparallel +endif + +KATI_OUTPUT_PATTERNS := $(OUT_DIR)/build%.ninja $(OUT_DIR)/ninja%.sh + +# Modifier goals we don't need to pass to Ninja. +NINJA_EXCLUDE_GOALS := showcommands all dist +.PHONY : $(NINJA_EXCLUDE_GOALS) + +# A list of goals which affect parsing of makefiles and we need to pass to Kati. +PARSE_TIME_MAKE_GOALS := \ + $(PARSE_TIME_MAKE_GOALS) \ + $(dont_bother_goals) \ + all \ + APP-% \ + DUMP_% \ + ECLIPSE-% \ + PRODUCT-% \ + boottarball-nodeps \ + btnod \ + build-art% \ + build_kernel-nodeps \ + clean-oat% \ + continuous_instrumentation_tests \ + continuous_native_tests \ + cts \ + custom_images \ + deps-license \ + dicttool_aosp \ + dist \ + dump-products \ + dumpvar-% \ + eng \ + fusion \ + oem_image \ + old-cts \ + online-system-api-sdk-docs \ + pdk \ + platform \ + platform-java \ + product-graph \ + samplecode \ + sdk \ + sdk_addon \ + sdk_repo \ + snod \ + stnod \ + systemimage-nodeps \ + systemtarball-nodeps \ + target-files-package \ + test-art% \ + user \ + userdataimage \ + userdebug \ + valgrind-test-art% \ + vts \ + win_sdk \ + winsdk-tools + +-include vendor/google/build/ninja_config.mk + +# Any Android goals that need to be built. +ANDROID_GOALS := $(filter-out $(KATI_OUTPUT_PATTERNS) $(KATI) $(MAKEPARALLEL),\ + $(sort $(ORIGINAL_MAKECMDGOALS) $(MAKECMDGOALS))) +# Goals we need to pass to Ninja. +NINJA_GOALS := $(filter-out $(NINJA_EXCLUDE_GOALS), $(ANDROID_GOALS)) +# Goals we need to pass to Kati. +KATI_GOALS := $(filter $(PARSE_TIME_MAKE_GOALS), $(ANDROID_GOALS)) + +define replace_space_and_slash +$(subst /,_,$(subst $(space),_,$(sort $1))) +endef + +KATI_NINJA_SUFFIX := -$(TARGET_PRODUCT) +ifneq ($(KATI_GOALS),) +KATI_NINJA_SUFFIX := $(KATI_NINJA_SUFFIX)-$(call replace_space_and_slash,$(KATI_GOALS)) +endif +ifneq ($(ONE_SHOT_MAKEFILE),) +KATI_NINJA_SUFFIX := $(KATI_NINJA_SUFFIX)-mmm-$(call replace_space_and_slash,$(ONE_SHOT_MAKEFILE)) +endif +ifneq ($(BUILD_MODULES_IN_PATHS),) +KATI_NINJA_SUFFIX := $(KATI_NINJA_SUFFIX)-mmma-$(call replace_space_and_slash,$(BUILD_MODULES_IN_PATHS)) +endif + +my_checksum_suffix := +my_ninja_suffix_too_long := $(filter 1, $(shell v='$(KATI_NINJA_SUFFIX)' && echo $$(($${$(pound)v} > 240)))) +ifneq ($(my_ninja_suffix_too_long),) +# Replace the suffix with a checksum if it gets too long. +my_checksum_suffix := $(KATI_NINJA_SUFFIX) +KATI_NINJA_SUFFIX := -$(word 1, $(shell echo $(my_checksum_suffix) | $(MD5SUM))) +endif + +KATI_BUILD_NINJA := $(OUT_DIR)/build$(KATI_NINJA_SUFFIX).ninja +KATI_ENV_SH := $(OUT_DIR)/env$(KATI_NINJA_SUFFIX).sh + +# Write out a file mapping checksum to the real suffix. +ifneq ($(my_checksum_suffix),) +my_ninja_suffix_file := $(basename $(KATI_BUILD_NINJA)).suf +$(shell mkdir -p $(dir $(my_ninja_suffix_file)) && \ + echo $(my_checksum_suffix) > $(my_ninja_suffix_file)) +endif + +ifeq (,$(NINJA_STATUS)) +NINJA_STATUS := [%p %s/%t]$(space) +endif + +ifneq (,$(filter showcommands,$(ORIGINAL_MAKECMDGOALS))) +NINJA_ARGS += "-v" +endif + +ifdef USE_GOMA +KATI_MAKEPARALLEL := $(MAKEPARALLEL) +# Ninja runs remote jobs (i.e., commands which contain gomacc) with +# this parallelism. Note the parallelism of all other jobs is still +# limited by the -j flag passed to GNU make. +NINJA_REMOTE_NUM_JOBS ?= 500 +NINJA_ARGS += -j$(NINJA_REMOTE_NUM_JOBS) +else +NINJA_MAKEPARALLEL := $(MAKEPARALLEL) --ninja +endif + +ifeq ($(USE_SOONG),true) +COMBINED_BUILD_NINJA := $(OUT_DIR)/combined$(KATI_NINJA_SUFFIX).ninja + +$(COMBINED_BUILD_NINJA): $(KATI_BUILD_NINJA) $(SOONG_ANDROID_MK) + $(hide) echo "builddir = $(OUT_DIR)" > $(COMBINED_BUILD_NINJA) + $(hide) echo "subninja $(SOONG_BUILD_NINJA)" >> $(COMBINED_BUILD_NINJA) + $(hide) echo "subninja $(KATI_BUILD_NINJA)" >> $(COMBINED_BUILD_NINJA) +else +COMBINED_BUILD_NINJA := $(KATI_BUILD_NINJA) +endif + +$(sort $(DEFAULT_GOAL) $(ANDROID_GOALS)) : ninja_wrapper + @#empty + +.PHONY: ninja_wrapper +ninja_wrapper: $(COMBINED_BUILD_NINJA) $(MAKEPARALLEL) + @echo Starting build with ninja + +$(hide) export NINJA_STATUS="$(NINJA_STATUS)" && source $(KATI_ENV_SH) && $(NINJA_MAKEPARALLEL) $(NINJA) $(NINJA_GOALS) -C $(TOP) -f $(COMBINED_BUILD_NINJA) $(NINJA_ARGS) + +# Dummy Android.mk and CleanSpec.mk files so that kati won't recurse into the +# out directory +DUMMY_OUT_MKS := $(OUT_DIR)/Android.mk $(OUT_DIR)/CleanSpec.mk +$(DUMMY_OUT_MKS): + @mkdir -p $(dir $@) + $(hide) echo '# This file prevents findleaves.py from traversing this directory further' >$@ + +KATI_FIND_EMULATOR := --use_find_emulator +ifeq ($(KATI_EMULATE_FIND),false) + KATI_FIND_EMULATOR := +endif +$(KATI_BUILD_NINJA): $(KATI) $(MAKEPARALLEL) $(DUMMY_OUT_MKS) $(SOONG_ANDROID_MK) FORCE + @echo Running kati to generate build$(KATI_NINJA_SUFFIX).ninja... + +$(hide) $(KATI_MAKEPARALLEL) $(KATI) --ninja --ninja_dir=$(OUT_DIR) --ninja_suffix=$(KATI_NINJA_SUFFIX) --regen --ignore_dirty=$(OUT_DIR)/% --no_ignore_dirty=$(SOONG_ANDROID_MK) --ignore_optional_include=$(OUT_DIR)/%.P --detect_android_echo $(KATI_FIND_EMULATOR) -f build/core/main.mk $(KATI_GOALS) --gen_all_targets BUILDING_WITH_NINJA=true SOONG_ANDROID_MK=$(SOONG_ANDROID_MK) + +ifneq ($(USE_SOONG_FOR_KATI),true) +KATI_CXX := $(CLANG_CXX) $(CLANG_HOST_GLOBAL_CFLAGS) $(CLANG_HOST_GLOBAL_CPPFLAGS) +KATI_LD := $(CLANG_CXX) $(CLANG_HOST_GLOBAL_LDFLAGS) +# Build static ckati. Unfortunately Mac OS X doesn't officially support static exectuables. +ifeq ($(BUILD_OS),linux) +# We need everything in libpthread.a otherwise C++11's threading library will be disabled. +KATI_LD += -static -Wl,--whole-archive -lpthread -Wl,--no-whole-archive -ldl +endif + +KATI_INTERMEDIATES_PATH := $(HOST_OUT_INTERMEDIATES)/EXECUTABLES/ckati_intermediates +KATI_BIN_PATH := $(HOST_OUT_EXECUTABLES) +include build/kati/Makefile.ckati + +MAKEPARALLEL_CXX := $(CLANG_CXX) $(CLANG_HOST_GLOBAL_CFLAGS) $(CLANG_HOST_GLOBAL_CPPFLAGS) +MAKEPARALLEL_LD := $(CLANG_CXX) $(CLANG_HOST_GLOBAL_LDFLAGS) +# Build static makeparallel. Unfortunately Mac OS X doesn't officially support static exectuables. +ifeq ($(BUILD_OS),linux) +MAKEPARALLEL_LD += -static +endif + +MAKEPARALLEL_INTERMEDIATES_PATH := $(HOST_OUT_INTERMEDIATES)/EXECUTABLES/makeparallel_intermediates +MAKEPARALLEL_BIN_PATH := $(HOST_OUT_EXECUTABLES) +include build/tools/makeparallel/Makefile +endif + +.PHONY: FORCE +FORCE: diff --git a/core/notice_files.mk b/core/notice_files.mk index e63cd84b5..e7f89745b 100644 --- a/core/notice_files.mk +++ b/core/notice_files.mk @@ -2,7 +2,11 @@ ## Track NOTICE files ########################################################### +ifneq ($(LOCAL_NOTICE_FILE),) +notice_file:=$(strip $(LOCAL_NOTICE_FILE)) +else notice_file:=$(strip $(wildcard $(LOCAL_PATH)/NOTICE)) +endif ifeq ($(LOCAL_MODULE_CLASS),GYP) # We ignore NOTICE files for modules of type GYP. @@ -14,6 +18,7 @@ ifeq ($(LOCAL_MODULE_CLASS),NOTICE_FILES) # so my_prefix is not set at this point. ifeq ($(LOCAL_IS_HOST_MODULE),true) my_prefix := HOST_ + LOCAL_HOST_PREFIX := else my_prefix := TARGET_ endif @@ -43,7 +48,7 @@ else # javalib.jar is the default name for the build module (and isn't meaningful) # If that's what we have, substitute the module name instead. These files # aren't included on the device, so this name is synthetic anyway. - ifeq ($(module_leaf),javalib.jar) + ifneq ($(filter javalib.jar classes.jack,$(module_leaf)),) module_leaf := $(LOCAL_MODULE).jar endif module_installed_filename := \ @@ -56,6 +61,7 @@ endif # In case it's actually a host file module_installed_filename := $(patsubst $(HOST_OUT)%,%,$(module_installed_filename)) +module_installed_filename := $(patsubst $(HOST_CROSS_OUT)%,%,$(module_installed_filename)) installed_notice_file := $($(my_prefix)OUT_NOTICE_FILES)/src/$(module_installed_filename).txt diff --git a/core/package_internal.mk b/core/package_internal.mk index a6ad354b4..5940d6372 100644 --- a/core/package_internal.mk +++ b/core/package_internal.mk @@ -57,6 +57,13 @@ $(error $(LOCAL_PATH): Package modules may not set LOCAL_MODULE_CLASS) endif LOCAL_MODULE_CLASS := APPS +intermediates := $(call local-intermediates-dir) +intermediates.COMMON := $(call local-intermediates-dir,COMMON) + +################################# +include $(BUILD_SYSTEM)/configure_local_jack.mk +################################# + # Package LOCAL_MODULE_TAGS default to optional LOCAL_MODULE_TAGS := $(strip $(LOCAL_MODULE_TAGS)) ifeq ($(LOCAL_MODULE_TAGS),) @@ -108,6 +115,45 @@ ifneq ($(all_assets),) need_compile_asset := true endif +my_res_package := +ifdef LOCAL_USE_AAPT2 +# In aapt2 the last takes precedence. +my_resource_dirs := $(call reverse-list,$(LOCAL_RESOURCE_DIR)) +my_res_dir := +my_overlay_res_dirs := + +ifneq ($(LOCAL_STATIC_ANDROID_LIBRARIES),) +# If we are using static android libraries, every source file becomes an overlay. +# This is to emulate old AAPT behavior which simulated library support. +my_res_dir := +my_overlay_res_dirs := $(my_resource_dirs) +else +# Without static libraries, the first directory is our directory, which can then be +# overlaid by the rest. (First directory in my_resource_dirs is last directory in +# $(LOCAL_RESOURCE_DIR) due to it being reversed. +my_res_dir := $(firstword $(my_resource_dirs)) +my_overlay_res_dirs := $(wordlist 2,999,$(my_resource_dirs)) +endif + +my_overlay_resources := $(strip \ + $(foreach d,$(my_overlay_res_dirs),\ + $(addprefix $(d)/, \ + $(call find-subdir-assets,$(d))))) + +my_res_resources := $(strip \ + $(addprefix $(my_res_dir)/, \ + $(call find-subdir-assets,$(my_res_dir)))) + +all_resources := $(strip $(my_res_resources) $(my_overlay_resources)) + +# The linked resource package. +my_res_package := $(intermediates)/package-res.apk +LOCAL_INTERMEDIATE_TARGETS += $(my_res_package) + +# Always run aapt2, because we need to at least compile the AndroidManifest.xml. +need_compile_res := true + +else # LOCAL_USE_AAPT2 all_resources := $(strip \ $(foreach dir, $(LOCAL_RESOURCE_DIR), \ $(addprefix $(dir)/, \ @@ -117,13 +163,14 @@ all_resources := $(strip \ ) \ )) +endif # LOCAL_USE_AAPT2 + 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. @@ -162,10 +209,17 @@ endif # need_compile_res endif # !custom LOCAL_PROGUARD_FLAGS := $(addprefix -include ,$(proguard_options_file)) $(LOCAL_PROGUARD_FLAGS) +ifdef LOCAL_JACK_ENABLED +ifndef LOCAL_JACK_PROGUARD_FLAGS + LOCAL_JACK_PROGUARD_FLAGS := $(LOCAL_PROGUARD_FLAGS) +endif +LOCAL_JACK_PROGUARD_FLAGS := $(addprefix -include ,$(proguard_options_file)) $(LOCAL_JACK_PROGUARD_FLAGS) +endif # LOCAL_JACK_ENABLED + ifeq (true,$(EMMA_INSTRUMENT)) ifndef LOCAL_EMMA_INSTRUMENT # No emma for test apks. -ifeq (,$(filer tests,$(LOCAL_MODULE_TAGS))$(LOCAL_INSTRUMENTATION_FOR)) +ifeq (,$(LOCAL_INSTRUMENTATION_FOR)) LOCAL_EMMA_INSTRUMENT := true endif # No test apk endif # LOCAL_EMMA_INSTRUMENT is not set @@ -175,17 +229,46 @@ endif # EMMA_INSTRUMENT is true ifeq (true,$(LOCAL_EMMA_INSTRUMENT)) ifeq (true,$(EMMA_INSTRUMENT_STATIC)) +ifdef LOCAL_JACK_ENABLED +# Jack supports coverage with Jacoco +ifneq ($(LOCAL_SRC_FILES)$(LOCAL_STATIC_JAVA_LIBRARIES)$(LOCAL_SOURCE_FILES_ALL_GENERATED),) +# Only add jacocoagent if the package contains some java code +LOCAL_STATIC_JAVA_LIBRARIES += jacocoagent +endif # Contains java code +else LOCAL_STATIC_JAVA_LIBRARIES += emma +endif # LOCAL_JACK_ENABLED else ifdef LOCAL_SDK_VERSION ifdef TARGET_BUILD_APPS -# In unbundled build merge the emma library into the apk. +# In unbundled build, merge the coverage library into the apk. +ifdef LOCAL_JACK_ENABLED +# Jack supports coverage with Jacoco +ifneq ($(LOCAL_SRC_FILES)$(LOCAL_STATIC_JAVA_LIBRARIES)$(LOCAL_SOURCE_FILES_ALL_GENERATED),) +# Only add jacocoagent if the package contains some java code +LOCAL_STATIC_JAVA_LIBRARIES += jacocoagent +# Exclude jacoco classes from proguard +LOCAL_PROGUARD_FLAGS += -include $(BUILD_SYSTEM)/proguard.jacoco.flags +LOCAL_JACK_PROGUARD_FLAGS += -include $(BUILD_SYSTEM)/proguard.jacoco.flags +endif # Contains java code +else LOCAL_STATIC_JAVA_LIBRARIES += emma +endif # LOCAL_JACK_ENABLED +else +# If build against the SDK in full build, core.jar is not used +# so coverage classes are not present. +ifdef LOCAL_JACK_ENABLED +# Jack needs jacoco on the classpath but we do not want it to be in +# the final apk. While it is a static library, we add it to the +# LOCAL_JAVA_LIBRARIES which are only present on the classpath. +# Note: we have nothing to do for proguard since jacoco will be +# on the classpath only, thus not modified during the compilation. +LOCAL_JAVA_LIBRARIES += jacocoagent 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; +# We have to use prebuilt emma.jar to make Proguard happy; # Otherwise emma classes are included in core.jar. LOCAL_PROGUARD_FLAGS += -libraryjars $(EMMA_JAR) +endif # LOCAL_JACK_ENABLED endif # full build endif # LOCAL_SDK_VERSION endif # EMMA_INSTRUMENT_STATIC @@ -193,6 +276,24 @@ endif # LOCAL_EMMA_INSTRUMENT rs_compatibility_jni_libs := +ifeq ($(LOCAL_DATA_BINDING),true) +data_binding_intermediates := $(intermediates.COMMON)/data-binding + +LOCAL_JAVACFLAGS += -processorpath $(DATA_BINDING_COMPILER) -s $(data_binding_intermediates)/anno-src +LOCAL_JACK_FLAGS += --processorpath $(DATA_BINDING_COMPILER) + +LOCAL_STATIC_JAVA_LIBRARIES += databinding-baselibrary +LOCAL_STATIC_JAVA_AAR_LIBRARIES += databinding-library databinding-adapters + +data_binding_res_in := $(LOCAL_RESOURCE_DIR) +data_binding_res_out := $(data_binding_intermediates)/res + +# Replace with the processed merged res dir. +LOCAL_RESOURCE_DIR := $(data_binding_res_out) + +LOCAL_AAPT_FLAGS += --auto-add-overlay --extra-packages com.android.databinding.library +endif # LOCAL_DATA_BINDING + include $(BUILD_SYSTEM)/android_manifest.mk ################################# @@ -206,7 +307,7 @@ endif $(LOCAL_INTERMEDIATE_TARGETS): \ PRIVATE_ANDROID_MANIFEST := $(full_android_manifest) -ifneq (,$(filter-out current system_current, $(LOCAL_SDK_VERSION))) +ifneq (,$(filter-out current system_current test_current, $(LOCAL_SDK_VERSION))) $(LOCAL_INTERMEDIATE_TARGETS): \ PRIVATE_DEFAULT_APP_TARGET_SDK := $(LOCAL_SDK_VERSION) else @@ -214,7 +315,43 @@ $(LOCAL_INTERMEDIATE_TARGETS): \ PRIVATE_DEFAULT_APP_TARGET_SDK := $(DEFAULT_APP_TARGET_SDK) endif +ifeq ($(LOCAL_DATA_BINDING),true) +data_binding_stamp := $(data_binding_intermediates)/data-binding.stamp +$(data_binding_stamp): PRIVATE_INTERMEDIATES := $(data_binding_intermediates) +$(data_binding_stamp): PRIVATE_MANIFEST := $(full_android_manifest) +# Generate code into $(LOCAL_INTERMEDIATE_SOURCE_DIR) so that the generated .java files +# will be automatically picked up by function compile-java. +$(data_binding_stamp): PRIVATE_SRC_OUT := $(LOCAL_INTERMEDIATE_SOURCE_DIR)/data-binding +$(data_binding_stamp): PRIVATE_XML_OUT := $(data_binding_intermediates)/xml +$(data_binding_stamp): PRIVATE_RES_OUT := $(data_binding_res_out) +$(data_binding_stamp): PRIVATE_RES_IN := $(data_binding_res_in) +$(data_binding_stamp): PRIVATE_ANNO_SRC_DIR := $(data_binding_intermediates)/anno-src + +$(data_binding_stamp) : $(all_res_assets) $(full_android_manifest) \ + $(DATA_BINDING_COMPILER) + @echo "Data-binding process: $@" + @rm -rf $(PRIVATE_INTERMEDIATES) $(PRIVATE_SRC_OUT) && \ + mkdir -p $(PRIVATE_INTERMEDIATES) $(PRIVATE_SRC_OUT) \ + $(PRIVATE_XML_OUT) $(PRIVATE_RES_OUT) $(PRIVATE_ANNO_SRC_DIR) + $(hide) java -classpath $(DATA_BINDING_COMPILER) android.databinding.tool.MakeCopy \ + $(PRIVATE_MANIFEST) $(PRIVATE_SRC_OUT) $(PRIVATE_XML_OUT) $(PRIVATE_RES_OUT) $(PRIVATE_RES_IN) + $(hide) touch $@ + +# Make sure the data-binding process happens before javac and generation of R.java. +$(R_file_stamp) $(full_classes_compiled_jar) : $(data_binding_stamp) +# The dependency path when jack is enabled +$(built_dex_intermediate) : $(data_binding_stamp) +endif # LOCAL_DATA_BINDING + ifeq ($(need_compile_res),true) +ifdef LOCAL_USE_AAPT2 +my_compiled_res_base_dir := $(intermediates)/flat-res +my_generated_res_dirs := $(rs_generated_res_dir) +my_generated_res_dirs_deps := $(RenderScript_file_stamp) +# Add AAPT2 link specific flags. +$(my_res_package): PRIVATE_AAPT_FLAGS := $(LOCAL_AAPT_FLAGS) --no-static-lib-packages +include $(BUILD_SYSTEM)/aapt2.mk +else # LOCAL_USE_AAPT2 # 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 @@ -230,22 +367,9 @@ $(R_file_stamp): PRIVATE_RESOURCE_PUBLICS_OUTPUT := \ $(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 $@ + @rm -rf $@ && mkdir -p $(dir $@) $(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; \ + $(call find-generated-R.java) $(proguard_options_file): $(R_file_stamp) @@ -267,10 +391,25 @@ $(resource_export_package): $(all_res_assets) $(full_android_manifest) $(RenderS $(add-assets-to-package) endif +endif # LOCAL_USE_AAPT2 + # 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) +ifdef LOCAL_JACK_ENABLED +ifneq ($(built_dex_intermediate),) +$(built_dex_intermediate): $(R_file_stamp) +endif +ifneq ($(noshrob_classes_jack),) +$(noshrob_classes_jack): $(R_file_stamp) +endif +ifneq ($(full_classes_jack),) +$(full_classes_jack): $(R_file_stamp) +$(jack_check_timestamp): $(R_file_stamp) +endif +endif # LOCAL_JACK_ENABLED + 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 @@ -289,7 +428,7 @@ 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))),) +ifneq ($(filter-out current system_current test_current,$(LOCAL_SDK_RES_VERSION))$(if $(TARGET_BUILD_APPS),$(filter current system_current test_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 @@ -297,11 +436,28 @@ 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 + +ifneq ($(TARGET_DISABLE_CMSDK), true) +# Avoid possible circular dependency with our platform-res +ifneq ($(LOCAL_IGNORE_SUBDIR), true) +cm_plat_res_package_export := \ + $(call intermediates-dir-for,APPS,org.cyanogenmod.platform-res,,COMMON)/package-export.apk +endif # LOCAL_IGNORE_SUBDIR +endif + # 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 + +ifneq ($(TARGET_DISABLE_CMSDK), true) +ifneq ($(LOCAL_IGNORE_SUBDIR), true) +cm_plat_res_package_export_deps := \ + $(dir $(cm_plat_res_package_export))src/R.stamp +endif # LOCAL_IGNORE_SUBDIR +endif + endif # LOCAL_SDK_RES_VERSION all_library_res_package_exports := \ $(framework_res_package_export) \ @@ -313,14 +469,32 @@ all_library_res_package_export_deps := \ $(foreach lib,$(LOCAL_RES_LIBRARIES),\ $(call intermediates-dir-for,APPS,$(lib),,COMMON)/src/R.stamp) +ifneq ($(TARGET_DISABLE_CMSDK), true) +ifneq ($(LOCAL_IGNORE_SUBDIR), true) +all_library_res_package_exports += \ + $(cm_plat_res_package_export) +all_library_res_package_export_deps += \ + $(cm_plat_res_package_export_deps) +endif # LOCAL_IGNORE_SUBDIR +endif + $(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) + +ifdef LOCAL_USE_AAPT2 +$(my_res_package) : $(all_library_res_package_export_deps) +endif endif # LOCAL_NO_STANDARD_LIBRARIES ifneq ($(full_classes_jar),) $(LOCAL_BUILT_MODULE): PRIVATE_DEX_FILE := $(built_dex) +# Use the jarjar processed arhive as the initial package file. +$(LOCAL_BUILT_MODULE): PRIVATE_SOURCE_ARCHIVE := $(full_classes_jarjar_jar) $(LOCAL_BUILT_MODULE): $(built_dex) +else +$(LOCAL_BUILT_MODULE): PRIVATE_DEX_FILE := +$(LOCAL_BUILT_MODULE): PRIVATE_SOURCE_ARCHIVE := endif # full_classes_jar include $(BUILD_SYSTEM)/install_jni_libs.mk @@ -359,7 +533,6 @@ $(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. @@ -369,38 +542,66 @@ ifneq ($(TARGET_BUILD_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 := + $(my_res_package) $(LOCAL_BUILT_MODULE): PRIVATE_PRODUCT_AAPT_CONFIG := + $(my_res_package) $(LOCAL_BUILT_MODULE): PRIVATE_PRODUCT_AAPT_PREF_CONFIG := else - $(LOCAL_BUILT_MODULE): PRIVATE_PRODUCT_AAPT_CONFIG := $(PRODUCT_AAPT_CONFIG) + $(my_res_package) $(LOCAL_BUILT_MODULE): PRIVATE_PRODUCT_AAPT_CONFIG := $(PRODUCT_AAPT_CONFIG) ifdef LOCAL_PACKAGE_SPLITS - $(LOCAL_BUILT_MODULE): PRIVATE_PRODUCT_AAPT_PREF_CONFIG := + $(my_res_package) $(LOCAL_BUILT_MODULE): PRIVATE_PRODUCT_AAPT_PREF_CONFIG := else - $(LOCAL_BUILT_MODULE): PRIVATE_PRODUCT_AAPT_PREF_CONFIG := $(PRODUCT_AAPT_PREF_CONFIG) + $(my_res_package) $(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) +$(LOCAL_BUILT_MODULE): PRIVATE_DONT_DELETE_JAR_DIRS := $(LOCAL_DONT_DELETE_JAR_DIRS) +$(LOCAL_BUILT_MODULE) : $(jni_shared_libraries) +ifdef LOCAL_USE_AAPT2 +$(LOCAL_BUILT_MODULE): PRIVATE_RES_PACKAGE := $(my_res_package) +$(LOCAL_BUILT_MODULE) : $(my_res_package) $(AAPT2) | $(ACP) +else +$(LOCAL_BUILT_MODULE) : $(all_res_assets) $(full_android_manifest) $(AAPT) +endif @echo "target Package: $(PRIVATE_MODULE) ($@)" +ifdef LOCAL_USE_AAPT2 +ifdef LOCAL_JACK_ENABLED + $(call copy-file-to-new-target) +else + @# TODO: implement merge-two-packages. + $(if $(PRIVATE_SOURCE_ARCHIVE),\ + $(call merge-two-packages,$(PRIVATE_RES_PACKAGE) $(PRIVATE_SOURCE_ARCHIVE),$@), + $(call copy-file-to-new-target)) +endif +else # LOCAL_USE_AAPT2 +ifdef LOCAL_JACK_ENABLED $(create-empty-package) +else + $(if $(PRIVATE_SOURCE_ARCHIVE),\ + $(call initialize-package-file,$(PRIVATE_SOURCE_ARCHIVE),$@),\ + $(create-empty-package)) +endif $(add-assets-to-package) +endif # LOCAL_USE_AAPT2 ifneq ($(jni_shared_libraries),) $(add-jni-shared-libs-to-package) endif -ifneq ($(full_classes_jar),) +ifeq ($(full_classes_jar),) +# We don't build jar, need to add the Java resources here. + $(if $(PRIVATE_EXTRA_JAR_ARGS),$(call add-java-resources-to,$@)) +else # full_classes_jar $(add-dex-to-package) +endif # full_classes_jar +ifdef LOCAL_JACK_ENABLED + $(add-carried-jack-resources) endif - $(add-carried-java-resources) -ifneq ($(extra_jar_args),) - $(add-java-resources-to-package) -endif - $(sign-package) ifdef LOCAL_DEX_PREOPT +ifneq ($(BUILD_PLATFORM_ZIP),) + @# Keep a copy of apk with classes.dex unstripped + $(hide) cp -f $@ $(dir $@)package.dex.apk +endif # BUILD_PLATFORM_ZIP ifneq (nostripping,$(LOCAL_DEX_PREOPT)) $(call dexpreopt-remove-classes.dex,$@) endif endif - @# Alignment must happen after all other zip operations. - $(align-package) + $(sign-package) ############################### ## Build dpi-specific apks, if it's apps_only build. @@ -435,7 +636,7 @@ built_apk_splits := $(foreach s,$(my_split_suffixes),$(built_module_path)/packag 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. +# This rule just runs signing. # 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. @@ -447,7 +648,6 @@ $(built_apk_splits) : $(built_module_path)/%.apk : $(LOCAL_BUILT_MODULE) 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) @@ -461,6 +661,18 @@ ALL_MODULES.$(my_register_name).BUILT_INSTALLED += \ # Make sure to install the splits when you run "make ". $(my_register_name): $(installed_apk_splits) + +ifdef LOCAL_COMPATIBILITY_SUITE +cts_testcase_file := $(foreach s,$(my_split_suffixes),$(COMPATIBILITY_TESTCASES_OUT_$(LOCAL_COMPATIBILITY_SUITE))/$(LOCAL_MODULE)_$(s).apk) +$(cts_testcase_file) : $(COMPATIBILITY_TESTCASES_OUT_$(LOCAL_COMPATIBILITY_SUITE))/$(LOCAL_MODULE)_%.apk : $(built_module_path)/package_%.apk | $(ACP) + $(copy-file-to-new-target) + +COMPATIBILITY.$(LOCAL_COMPATIBILITY_SUITE).FILES := \ + $(COMPATIBILITY.$(LOCAL_COMPATIBILITY_SUITE).FILES) \ + $(cts_testcase_file) + +$(my_register_name) : $(cts_testcase_file) +endif # LOCAL_COMPATIBILITY_SUITE endif # LOCAL_PACKAGE_SPLITS # Save information about this package @@ -472,39 +684,6 @@ 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. diff --git a/core/pathmap.mk b/core/pathmap.mk index 0820885a6..803b4d9be 100644 --- a/core/pathmap.mk +++ b/core/pathmap.mk @@ -16,7 +16,14 @@ # # A central place to define mappings to paths, to avoid hard-coding -# them in Android.mk files. +# them in Android.mk files. Not meant for header file include directories, +# despite the fact that it was historically used for that! +# +# If you want this for a library's header files, use LOCAL_EXPORT_C_INCLUDES +# instead. Then users of the library don't have to do anything --- they'll +# have the correct header files added to their include path automatically. +# + # # TODO: Allow each project to define stuff like this before the per-module # Android.mk files are included, so we don't need to have a big central @@ -27,23 +34,15 @@ # A mapping from shorthand names to include directories. # pathmap_INCL := \ - bootloader:bootable/bootloader/legacy/include \ camera:system/media/camera/include \ frameworks-base:frameworks/base/include \ frameworks-native:frameworks/native/include \ - libc:bionic/libc/include \ libhardware:hardware/libhardware/include \ libhardware_legacy:hardware/libhardware_legacy/include \ - libhost:build/libs/host/include \ - libm:bionic/libm/include \ - libnativehelper:libnativehelper/include \ - libpagemap:system/extras/libpagemap/include \ libril:hardware/ril/include \ - 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:system/media/audio/include \ audio-effects:system/media/audio_effects/include \ audio-utils:system/media/audio_utils/include \ audio-route:system/media/audio_route/include \ @@ -63,11 +62,41 @@ 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. # -JNI_H_INCLUDE := $(call include-path-for,libnativehelper)/nativehelper +JNI_H_INCLUDE := libnativehelper/include/nativehelper # # A list of all source roots under frameworks/base, which will be @@ -87,7 +116,6 @@ FRAMEWORKS_BASE_SUBDIRS := \ sax \ telecomm \ telephony \ - phone \ wifi \ keystore \ rs \ @@ -107,16 +135,27 @@ FRAMEWORKS_BASE_JAVA_SRC_DIRS := \ # FRAMEWORKS_SUPPORT_SUBDIRS := \ annotations \ - v4 \ + compat \ + media-compat \ + fragment \ + core-ui \ + core-utils \ v7/gridlayout \ - v7/appcompat \ v7/cardview \ v7/mediarouter \ v7/palette \ - v7/recyclerview \ v8/renderscript \ v13 \ - v17/leanback + v17/leanback \ + design \ + percent \ + recommendation \ + transition \ + v7/preference \ + v14/preference \ + v17/preference-leanback \ + documents-archive \ + customtabs # # A list of all source roots under frameworks/multidex. @@ -131,13 +170,37 @@ FRAMEWORKS_MULTIDEX_SUBDIRS := \ # FRAMEWORKS_SUPPORT_JAVA_SRC_DIRS := \ $(addprefix frameworks/support/,$(FRAMEWORKS_SUPPORT_SUBDIRS)) \ - $(addprefix frameworks/,$(FRAMEWORKS_MULTIDEX_SUBDIRS)) + $(addprefix frameworks/,$(FRAMEWORKS_MULTIDEX_SUBDIRS)) \ + frameworks/support/graphics/drawable/animated \ + frameworks/support/graphics/drawable/static \ + frameworks/support/v7/appcompat/src \ + frameworks/support/v7/recyclerview/src # # A list of support library modules. # FRAMEWORKS_SUPPORT_JAVA_LIBRARIES := \ $(foreach dir,$(FRAMEWORKS_SUPPORT_SUBDIRS),android-support-$(subst /,-,$(dir))) \ + android-support-v4 \ + android-support-vectordrawable \ + android-support-animatedvectordrawable \ + android-support-v7-appcompat \ + android-support-v7-recyclerview \ android-support-multidex \ android-support-multidex-instrumentation +# +# A list of all documented source roots under frameworks/data-binding. +# +FRAMEWORKS_DATA_BINDING_SUBDIRS := \ + baseLibrary/src/main \ + extensions/library/src/main \ + extensions/library/src/doc + +# +# A version of FRAMEWORKS_DATA_BINDING_SUBDIRS that is expanded to full paths from +# the root of the tree. +# +FRAMEWORKS_DATA_BINDING_JAVA_SRC_DIRS := \ + $(addprefix frameworks/data-binding/,$(FRAMEWORKS_DATA_BINDING_SUBDIRS)) + diff --git a/core/pdk_config.mk b/core/pdk_config.mk index 838754fa8..c0aaacd92 100644 --- a/core/pdk_config.mk +++ b/core/pdk_config.mk @@ -1,47 +1,4 @@ # This file defines the rule to fuse the platform.zip into the current PDK build. - -.PHONY: pdk fusion -pdk fusion: $(DEFAULT_GOAL) - -# What to build: -# pdk fusion if: -# 1) PDK_FUSION_PLATFORM_ZIP is passed in from the environment -# or -# 2) the platform.zip exists in the default location -# or -# 3) fusion is a command line build goal, -# PDK_FUSION_PLATFORM_ZIP is needed anyway, then do we need the 'fusion' goal? -# otherwise pdk only if: -# 1) pdk is a command line build goal -# or -# 2) TARGET_BUILD_PDK is passed in from the environment - -# if PDK_FUSION_PLATFORM_ZIP is specified, do not override. -ifndef PDK_FUSION_PLATFORM_ZIP -# Most PDK project paths should be using vendor/pdk/TARGET_DEVICE -# but some legacy ones (e.g. mini_armv7a_neon generic PDK) were setup -# with vendor/pdk/TARGET_PRODUCT. -_pdk_fusion_default_platform_zip = $(wildcard \ -vendor/pdk/$(TARGET_DEVICE)/$(TARGET_PRODUCT)-$(TARGET_BUILD_VARIANT)/platform/platform.zip \ -vendor/pdk/$(TARGET_DEVICE)/$(patsubst aosp_%,full_%,$(TARGET_PRODUCT))-$(TARGET_BUILD_VARIANT)/platform/platform.zip \ -vendor/pdk/$(TARGET_PRODUCT)/$(TARGET_PRODUCT)-$(TARGET_BUILD_VARIANT)/platform/platform.zip \ -vendor/pdk/$(TARGET_PRODUCT)/$(patsubst aosp_%,full_%,$(TARGET_PRODUCT))-$(TARGET_BUILD_VARIANT)/platform/platform.zip) -ifneq (,$(_pdk_fusion_default_platform_zip)) -PDK_FUSION_PLATFORM_ZIP := $(word 1, $(_pdk_fusion_default_platform_zip)) -TARGET_BUILD_PDK := true -$(info $(PDK_FUSION_PLATFORM_ZIP) found, do a PDK fusion build.) -endif # _pdk_fusion_default_platform_zip -endif # !PDK_FUSION_PLATFORM_ZIP - -ifneq (,$(filter pdk fusion, $(MAKECMDGOALS))) -TARGET_BUILD_PDK := true -ifneq (,$(filter fusion, $(MAKECMDGOALS))) -ifndef PDK_FUSION_PLATFORM_ZIP - $(error Specify PDK_FUSION_PLATFORM_ZIP to do a PDK fusion.) -endif -endif # fusion -endif # pdk or fusion - PDK_PLATFORM_JAVA_ZIP_JAVA_TARGET_LIB_DIR := PDK_PLATFORM_JAVA_ZIP_JAVA_HOST_LIB_DIR := \ host/common/obj/JAVA_LIBRARIES/bouncycastle-host_intermediates @@ -52,18 +9,21 @@ ifneq (,$(filter platform-java, $(MAKECMDGOALS))$(PDK_FUSION_PLATFORM_ZIP)) # For these dirs, add classes.jar and javalib.jar from the dir to platform.zip # all paths under out dir PDK_PLATFORM_JAVA_ZIP_JAVA_TARGET_LIB_DIR += \ - target/common/obj/JAVA_LIBRARIES/android_stubs_current_intermediates \ - target/common/obj/JAVA_LIBRARIES/core-libart_intermediates \ - target/common/obj/JAVA_LIBRARIES/core-junit_intermediates \ - target/common/obj/JAVA_LIBRARIES/ext_intermediates \ - target/common/obj/JAVA_LIBRARIES/framework_intermediates \ - target/common/obj/JAVA_LIBRARIES/android.test.runner_intermediates \ - target/common/obj/JAVA_LIBRARIES/telephony-common_intermediates \ - target/common/obj/JAVA_LIBRARIES/voip-common_intermediates \ - target/common/obj/JAVA_LIBRARIES/ims-common_intermediates \ - target/common/obj/JAVA_LIBRARIES/mms-common_intermediates \ - target/common/obj/JAVA_LIBRARIES/android-ex-camera2_intermediates \ - target/common/obj/JAVA_LIBRARIES/android-common_intermediates \ + target/common/obj/JAVA_LIBRARIES/android.test.runner_intermediates \ + target/common/obj/JAVA_LIBRARIES/android-common_intermediates \ + target/common/obj/JAVA_LIBRARIES/android-ex-camera2_intermediates \ + target/common/obj/JAVA_LIBRARIES/android_stubs_current_intermediates \ + target/common/obj/JAVA_LIBRARIES/bouncycastle_intermediates \ + target/common/obj/JAVA_LIBRARIES/conscrypt_intermediates \ + target/common/obj/JAVA_LIBRARIES/core-oj_intermediates \ + target/common/obj/JAVA_LIBRARIES/core-libart_intermediates \ + target/common/obj/JAVA_LIBRARIES/core-junit_intermediates \ + target/common/obj/JAVA_LIBRARIES/ext_intermediates \ + target/common/obj/JAVA_LIBRARIES/framework_intermediates \ + target/common/obj/JAVA_LIBRARIES/ims-common_intermediates \ + target/common/obj/JAVA_LIBRARIES/okhttp_intermediates \ + target/common/obj/JAVA_LIBRARIES/telephony-common_intermediates \ + target/common/obj/JAVA_LIBRARIES/voip-common_intermediates \ # not java libraries PDK_PLATFORM_JAVA_ZIP_CONTENTS += \ @@ -76,7 +36,9 @@ PDK_PLATFORM_JAVA_ZIP_JAVA_LIB_DIR := \ $(PDK_PLATFORM_JAVA_ZIP_JAVA_HOST_LIB_DIR) PDK_PLATFORM_JAVA_ZIP_CONTENTS += $(foreach lib_dir,$(PDK_PLATFORM_JAVA_ZIP_JAVA_LIB_DIR),\ - $(lib_dir)/classes.jar $(lib_dir)/javalib.jar) + $(lib_dir)/classes.jack $(lib_dir)/classes.jar $(lib_dir)/classes.jar.toc \ + $(lib_dir)/javalib.jar $(lib_dir)/classes*.dex \ + $(lib_dir)/classes.dex.toc ) # check and override java support level ifneq ($(TARGET_BUILD_PDK)$(PDK_FUSION_PLATFORM_ZIP),) @@ -89,11 +51,6 @@ endif endif # PDK ifdef PDK_FUSION_PLATFORM_ZIP -TARGET_BUILD_PDK := true -ifeq (,$(wildcard $(PDK_FUSION_PLATFORM_ZIP))) - $(error Cannot find file $(PDK_FUSION_PLATFORM_ZIP).) -endif - _pdk_fusion_intermediates := $(call intermediates-dir-for, PACKAGING, pdk_fusion) _pdk_fusion_stamp := $(_pdk_fusion_intermediates)/pdk_fusion.stamp @@ -147,10 +104,8 @@ PDK_FUSION_OUT_DIR := $(DEBUG_OUT_DIR) endif define JAVA_dependency_template -$(PDK_FUSION_OUT_DIR)/$(strip $(1)): $(_pdk_fusion_intermediates)/$(strip $(1)) \ - $(PDK_FUSION_OUT_DIR)/$(strip $(2)) $(_pdk_fusion_stamp) - @mkdir -p $$(dir $$@) - $(hide) cp -fpPR $$< $$@ +$(call add-dependency,$(PDK_FUSION_OUT_DIR)/$(strip $(1)),\ + $(foreach d,$(filter $(2),$(_pdk_fusion_java_file_list)),$(PDK_FUSION_OUT_DIR)/$(d))) endef # needs explicit dependency as package-export.apk is not explicitly pulled @@ -163,6 +118,14 @@ $(foreach lib_dir,$(PDK_PLATFORM_JAVA_ZIP_JAVA_TARGET_LIB_DIR),\ $(eval $(call JAVA_dependency_template,$(lib_dir)/javalib.jar,\ $(lib_dir)/classes.jar))) +# pull .jack and .dex files +$(foreach lib_dir,$(PDK_PLATFORM_JAVA_ZIP_JAVA_TARGET_LIB_DIR),\ + $(eval $(call JAVA_dependency_template,$(lib_dir)/classes.jar.toc,\ + $(lib_dir)/classes.jar $(lib_dir)/classes.jack))) +$(foreach lib_dir,$(PDK_PLATFORM_JAVA_ZIP_JAVA_TARGET_LIB_DIR),\ + $(eval $(call JAVA_dependency_template,$(lib_dir)/classes.dex.toc,\ + $(lib_dir)/classes.jar $(lib_dir)/classes.jack $(lib_dir)/classes%.dex))) + # implicit rules for all other target files $(TARGET_COMMON_OUT_ROOT)/% : $(_pdk_fusion_intermediates)/target/common/% $(_pdk_fusion_stamp) @mkdir -p $(dir $@) diff --git a/core/pdk_fusion_modules.mk b/core/pdk_fusion_modules.mk new file mode 100644 index 000000000..49b30dc72 --- /dev/null +++ b/core/pdk_fusion_modules.mk @@ -0,0 +1,78 @@ +# Auto-generate module defitions from platform.zip. +# We use these rules to rebuild .odex files of the .jar/.apk inside the platform.zip. +# + +pdk_dexpreopt_config_mk := $(TARGET_OUT_INTERMEDIATES)/pdk_dexpreopt_config.mk + +$(shell rm -f $(pdk_dexpreopt_config_mk) && mkdir -p $(dir $(pdk_dexpreopt_config_mk)) && \ + unzip -qo $(PDK_FUSION_PLATFORM_ZIP) -d $(dir $(pdk_dexpreopt_config_mk)) pdk_dexpreopt_config.mk 2>/dev/null) + +-include $(pdk_dexpreopt_config_mk) + +# Define a PDK prebuilt module that comes from platform.zip. +# Must be called with $(eval) +define prebuilt-pdk-java-module +include $(CLEAR_VARS) +LOCAL_MODULE:=$(1) +LOCAL_MODULE_CLASS:=$(2) +# Use LOCAL_PREBUILT_MODULE_FILE instead of LOCAL_SRC_FILES so we don't need to deal with LOCAL_PATH. +LOCAL_PREBUILT_MODULE_FILE:=$(3) +LOCAL_DEX_PREOPT:=$(4) +LOCAL_MULTILIB:=$(5) +LOCAL_DEX_PREOPT_FLAGS:=$(6) +LOCAL_BUILT_MODULE_STEM:=$(7) +LOCAL_MODULE_SUFFIX:=$(suffix $(7)) +LOCAL_PRIVILEGED_MODULE:=$(8) +LOCAL_PROPRIETARY_MODULE:=$(9) +LOCAL_MODULE_TARGET_ARCH:=$(10) +LOCAL_REPLACE_PREBUILT_APK_INSTALLED:=$(11) +LOCAL_CERTIFICATE:=PRESIGNED +include $(BUILD_PREBUILT) + +# The source prebuilts are extracted in the rule of _pdk_fusion_stamp. +# Use a touch rule to establish the dependency. +$(3) $(11) : $(_pdk_fusion_stamp) + $(hide) if [ ! -f $$@ ]; then \ + echo 'Error: $$@ does not exist. Check your platform.zip.' 1>&2; \ + exit 1; \ + fi + $(hide) touch $$@ +endef + +# We don't have a LOCAL_PATH for the auto-generated modules, so let it be the $(BUILD_SYSTEM). +LOCAL_PATH := $(BUILD_SYSTEM) + +##### Java libraries. +# Only set up rules for modules that aren't built from source. +pdk_prebuilt_libraries := $(foreach l,$(PDK.DEXPREOPT.JAVA_LIBRARIES),\ + $(if $(MODULE.TARGET.JAVA_LIBRARIES.$(l)),,$(l))) + +$(foreach l,$(pdk_prebuilt_libraries), $(eval \ + $(call prebuilt-pdk-java-module,\ + $(l),\ + JAVA_LIBRARIES,\ + $(_pdk_fusion_intermediates)/$(PDK.DEXPREOPT.$(l).SRC),\ + $(PDK.DEXPREOPT.$(l).DEX_PREOPT),\ + $(PDK.DEXPREOPT.$(l).MULTILIB),\ + $(PDK.DEXPREOPT.$(l).DEX_PREOPT_FLAGS),\ + javalib.jar,\ + ))) + +###### Apps. +pdk_prebuilt_apps := $(foreach a,$(PDK.DEXPREOPT.APPS),\ + $(if $(MODULE.TARGET.APPS.$(a)),,$(a))) + +$(foreach a,$(pdk_prebuilt_apps), $(eval \ + $(call prebuilt-pdk-java-module,\ + $(a),\ + APPS,\ + $(_pdk_fusion_intermediates)/$(PDK.DEXPREOPT.$(a).SRC),\ + $(PDK.DEXPREOPT.$(a).DEX_PREOPT),\ + $(PDK.DEXPREOPT.$(a).MULTILIB),\ + $(PDK.DEXPREOPT.$(a).DEX_PREOPT_FLAGS),\ + package.apk,\ + $(PDK.DEXPREOPT.$(a).PRIVILEGED_MODULE),\ + $(PDK.DEXPREOPT.$(a).PROPRIETARY_MODULE),\ + $(PDK.DEXPREOPT.$(a).TARGET_ARCH),\ + $(_pdk_fusion_intermediates)/$(PDK.DEXPREOPT.$(a).STRIPPED_SRC),\ + ))) diff --git a/core/phony_package.mk b/core/phony_package.mk index b5343352f..866b13c8e 100644 --- a/core/phony_package.mk +++ b/core/phony_package.mk @@ -7,7 +7,7 @@ LOCAL_MODULE_SUFFIX := -timestamp include $(BUILD_SYSTEM)/base_rules.mk -$(LOCAL_BUILT_MODULE): $(LOCAL_ADDITIONAL_DEPENDENCIES) +$(LOCAL_BUILT_MODULE): $(LOCAL_MODULE_MAKEFILE_DEP) $(LOCAL_ADDITIONAL_DEPENDENCIES) $(hide) echo "Fake: $@" $(hide) mkdir -p $(dir $@) $(hide) touch $@ diff --git a/core/post_clean.mk b/core/post_clean.mk index 0273ff207..f08abff1d 100644 --- a/core/post_clean.mk +++ b/core/post_clean.mk @@ -54,27 +54,30 @@ current_package_overlay_config := current_all_packages_config := ####################################################### -# Check if we need to delete obsolete aidl-generated java files. -# When an aidl file gets deleted (or renamed), the generated java file is obsolete. -previous_aidl_config := $(TARGET_OUT_COMMON_INTERMEDIATES)/previous_aidl_config.mk -current_aidl_config := $(TARGET_OUT_COMMON_INTERMEDIATES)/current_aidl_config.mk +# Check if we need to delete obsolete generated java files. +# When an aidl/proto/etc file gets deleted (or renamed), the generated java file is obsolete. +previous_gen_java_config := $(TARGET_OUT_COMMON_INTERMEDIATES)/previous_gen_java_config.mk +current_gen_java_config := $(TARGET_OUT_COMMON_INTERMEDIATES)/current_gen_java_config.mk -$(shell rm -rf $(current_aidl_config) \ - && mkdir -p $(dir $(current_aidl_config))\ - && touch $(current_aidl_config)) --include $(previous_aidl_config) +$(shell rm -rf $(current_gen_java_config) \ + && mkdir -p $(dir $(current_gen_java_config))\ + && touch $(current_gen_java_config)) +-include $(previous_gen_java_config) intermediates_to_clean := -modules_with_aidl_files := +modules_with_gen_java_files := $(foreach p, $(ALL_MODULES), \ - $(if $(ALL_MODULES.$(p).AIDL_FILES),\ - $(eval modules_with_aidl_files += $(p))\ - $(shell echo 'AIDL_FILES.$(p) := $(ALL_MODULES.$(p).AIDL_FILES)' >> $(current_aidl_config)))\ - $(if $(filter-out $(ALL_MODULES.$(p).AIDL_FILES),$(AIDL_FILES.$(p))),\ + $(eval gs := $(strip $(ALL_MODULES.$(p).AIDL_FILES)\ + $(ALL_MODULES.$(p).PROTO_FILES)\ + $(ALL_MODULES.$(p).RS_FILES)))\ + $(if $(gs),\ + $(eval modules_with_gen_java_files += $(p))\ + $(shell echo 'GEN_SRC_FILES.$(p) := $(gs)' >> $(current_gen_java_config)))\ + $(if $(filter-out $(gs),$(GEN_SRC_FILES.$(p))),\ $(eval intermediates_to_clean += $(ALL_MODULES.$(p).INTERMEDIATE_SOURCE_DIR)))) intermediates_to_clean := $(strip $(intermediates_to_clean)) ifdef intermediates_to_clean -$(info *** Obsolete aidl-generated files detected, clean intermediate files...) +$(info *** Obsolete generated java files detected, clean intermediate files...) $(info *** rm -rf $(intermediates_to_clean)) $(shell rm -rf $(intermediates_to_clean)) intermediates_to_clean := @@ -82,15 +85,15 @@ endif # For modules not loaded by the current build (e.g. you are running mm/mmm), # we copy the info from the previous bulid. -$(foreach p, $(filter-out $(ALL_MODULES),$(MODULES_WITH_AIDL_FILES)),\ - $(shell echo 'AIDL_FILES.$(p) := $(AIDL_FILES.$(p))' >> $(current_aidl_config))) -MODULES_WITH_AIDL_FILES := $(sort $(MODULES_WITH_AIDL_FILES) $(modules_with_aidl_files)) -$(shell echo 'MODULES_WITH_AIDL_FILES := $(MODULES_WITH_AIDL_FILES)' >> $(current_aidl_config)) +$(foreach p, $(filter-out $(ALL_MODULES),$(MODULES_WITH_GEN_JAVA_FILES)),\ + $(shell echo 'GEN_SRC_FILES.$(p) := $(GEN_SRC_FILES.$(p))' >> $(current_gen_java_config))) +MODULES_WITH_GEN_JAVA_FILES := $(sort $(MODULES_WITH_GEN_JAVA_FILES) $(modules_with_gen_java_files)) +$(shell echo 'MODULES_WITH_GEN_JAVA_FILES := $(MODULES_WITH_GEN_JAVA_FILES)' >> $(current_gen_java_config)) # Now current becomes previous. -$(shell mv -f $(current_aidl_config) $(previous_aidl_config)) +$(shell cmp $(current_gen_java_config) $(previous_gen_java_config) > /dev/null 2>&1 || mv -f $(current_gen_java_config) $(previous_gen_java_config)) -MODULES_WITH_AIDL_FILES := -modules_with_aidl_files := -previous_aidl_config := -current_aidl_config := +MODULES_WITH_GEN_JAVA_FILES := +modules_with_gen_java_files := +previous_gen_java_config := +current_gen_java_config := diff --git a/core/prebuilt.mk b/core/prebuilt.mk index ba0e7574a..428922b08 100644 --- a/core/prebuilt.mk +++ b/core/prebuilt.mk @@ -8,6 +8,7 @@ ifdef LOCAL_IS_HOST_MODULE my_prefix := HOST_ + LOCAL_HOST_PREFIX := else my_prefix := TARGET_ endif @@ -25,6 +26,10 @@ include $(BUILD_SYSTEM)/prebuilt_internal.mk ifneq ($(my_module_multilib),both) my_skip_non_preferred_arch := true endif # $(my_module_multilib) +# For apps, we don't want to set up the prebuilt apk rule twice even if "LOCAL_MULTILIB := both". +ifeq (APPS,$(LOCAL_MODULE_CLASS)) +my_skip_non_preferred_arch := true +endif endif # $(my_module_arch_supported) ifndef my_skip_non_preferred_arch @@ -37,9 +42,6 @@ ifeq ($(my_module_arch_supported),true) OVERRIDE_BUILT_MODULE_PATH := LOCAL_BUILT_MODULE := LOCAL_INSTALLED_MODULE := -LOCAL_MODULE_STEM := -LOCAL_BUILT_MODULE_STEM := -LOCAL_INSTALLED_MODULE_STEM := LOCAL_INTERMEDIATE_TARGETS := include $(BUILD_SYSTEM)/prebuilt_internal.mk endif # $(my_module_arch_supported) @@ -48,4 +50,39 @@ endif # $(my_skip_non_preferred_arch) not true LOCAL_2ND_ARCH_VAR_PREFIX := +ifdef LOCAL_IS_HOST_MODULE +ifdef HOST_CROSS_OS +ifneq (,$(filter EXECUTABLES STATIC_LIBRARIES SHARED_LIBRARIES,$(LOCAL_MODULE_CLASS))) +my_prefix := HOST_CROSS_ +LOCAL_HOST_PREFIX := $(my_prefix) +include $(BUILD_SYSTEM)/module_arch_supported.mk +ifeq ($(my_module_arch_supported),true) +# host cross compilation is supported +OVERRIDE_BUILT_MODULE_PATH := +LOCAL_BUILT_MODULE := +LOCAL_INSTALLED_MODULE := +LOCAL_INTERMEDIATE_TARGETS := +include $(BUILD_SYSTEM)/prebuilt_internal.mk +endif +LOCAL_HOST_PREFIX := +endif + +ifdef HOST_CROSS_2ND_ARCH +my_prefix := HOST_CROSS_ +LOCAL_2ND_ARCH_VAR_PREFIX := $($(my_prefix)2ND_ARCH_VAR_PREFIX) +LOCAL_HOST_PREFIX := $(my_prefix) +include $(BUILD_SYSTEM)/module_arch_supported.mk +ifeq ($(my_module_arch_supported),true) +OVERRIDE_BUILT_MODULE_PATH := +LOCAL_BUILT_MODULE := +LOCAL_INSTALLED_MODULE := +LOCAL_INTERMEDIATE_TARGETS := +include $(BUILD_SYSTEM)/prebuilt_internal.mk +endif +LOCAL_HOST_PREFIX := +LOCAL_2ND_ARCH_VAR_PREFIX := +endif +endif +endif + my_module_arch_supported := diff --git a/core/prebuilt_internal.mk b/core/prebuilt_internal.mk index bc6088fa2..507ef2281 100644 --- a/core/prebuilt_internal.mk +++ b/core/prebuilt_internal.mk @@ -26,19 +26,42 @@ ifdef LOCAL_PREBUILT_MODULE_FILE else ifdef LOCAL_SRC_FILES_$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH) my_prebuilt_src_file := $(LOCAL_PATH)/$(LOCAL_SRC_FILES_$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)) + LOCAL_SRC_FILES_$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH) := else ifdef LOCAL_SRC_FILES_$(my_32_64_bit_suffix) my_prebuilt_src_file := $(LOCAL_PATH)/$(LOCAL_SRC_FILES_$(my_32_64_bit_suffix)) + LOCAL_SRC_FILES_$(my_32_64_bit_suffix) := else my_prebuilt_src_file := $(LOCAL_PATH)/$(LOCAL_SRC_FILES) + LOCAL_SRC_FILES := endif endif endif +my_strip_module := $(firstword \ + $(LOCAL_STRIP_MODULE_$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)) \ + $(LOCAL_STRIP_MODULE)) +my_pack_module_relocations := $(firstword \ + $(LOCAL_PACK_MODULE_RELOCATIONS_$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)) \ + $(LOCAL_PACK_MODULE_RELOCATIONS)) + ifeq (SHARED_LIBRARIES,$(LOCAL_MODULE_CLASS)) # Put the built targets of all shared libraries in a common directory # to simplify the link line. OVERRIDE_BUILT_MODULE_PATH := $($(LOCAL_2ND_ARCH_VAR_PREFIX)$(my_prefix)OUT_INTERMEDIATE_LIBRARIES) + ifeq ($(LOCAL_IS_HOST_MODULE)$(my_strip_module),) + # Strip but not try to add debuglink + my_strip_module := no_debuglink + endif + + ifeq ($(LOCAL_IS_HOST_MODULE)$(my_pack_module_relocations),) + # Do not pack relocations by default + my_pack_module_relocations := false + endif + + ifeq ($(DISABLE_RELOCATION_PACKER),true) + my_pack_module_relocations := false + endif endif ifneq ($(filter STATIC_LIBRARIES SHARED_LIBRARIES,$(LOCAL_MODULE_CLASS)),) @@ -54,31 +77,43 @@ ifeq (STATIC_LIBRARIES,$(LOCAL_MODULE_CLASS)) endif endif +ifeq (JAVA_LIBRARIES,$(LOCAL_IS_HOST_MODULE)$(LOCAL_MODULE_CLASS)$(filter true,$(LOCAL_UNINSTALLABLE_MODULE))) + prebuilt_module_is_dex_javalib := true +else + prebuilt_module_is_dex_javalib := +endif + ifeq ($(LOCAL_MODULE_CLASS),APPS) LOCAL_BUILT_MODULE_STEM := package.apk +ifndef LOCAL_INSTALLED_MODULE_STEM LOCAL_INSTALLED_MODULE_STEM := $(LOCAL_MODULE).apk endif +endif -ifeq ($(LOCAL_STRIP_MODULE),true) +ifneq ($(filter true no_debuglink,$(my_strip_module) $(my_pack_module_relocations)),) ifdef LOCAL_IS_HOST_MODULE - $(error Cannot strip host module LOCAL_PATH=$(LOCAL_PATH)) + $(error Cannot strip/pack host module LOCAL_PATH=$(LOCAL_PATH)) endif ifeq ($(filter SHARED_LIBRARIES EXECUTABLES,$(LOCAL_MODULE_CLASS)),) - $(error Can strip only shared libraries or executables LOCAL_PATH=$(LOCAL_PATH)) + $(error Can strip/pack only shared libraries or executables LOCAL_PATH=$(LOCAL_PATH)) endif ifneq ($(LOCAL_PREBUILT_STRIP_COMMENTS),) - $(error Cannot strip scripts LOCAL_PATH=$(LOCAL_PATH)) + $(error Cannot strip/pack scripts LOCAL_PATH=$(LOCAL_PATH)) endif + # Set the arch-specific variables to set up the strip/pack rules. + LOCAL_STRIP_MODULE_$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH) := $(my_strip_module) + LOCAL_PACK_MODULE_RELOCATIONS_$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH) := $(my_pack_module_relocations) include $(BUILD_SYSTEM)/dynamic_binary.mk built_module := $(linked_module) -else # LOCAL_STRIP_MODULE not true + +else # my_strip_module and my_pack_module_relocations not true include $(BUILD_SYSTEM)/base_rules.mk built_module := $(LOCAL_BUILT_MODULE) ifdef prebuilt_module_is_a_library export_includes := $(intermediates)/export_includes $(export_includes): PRIVATE_EXPORT_C_INCLUDE_DIRS := $(LOCAL_EXPORT_C_INCLUDE_DIRS) -$(export_includes) : $(LOCAL_MODULE_MAKEFILE) +$(export_includes) : $(LOCAL_MODULE_MAKEFILE_DEP) @echo Export includes file: $< -- $@ $(hide) mkdir -p $(dir $@) && rm -f $@ ifdef LOCAL_EXPORT_C_INCLUDE_DIRS @@ -96,24 +131,31 @@ endif # prebuilt_module_is_a_library # of the shared libraries are determined. ifdef LOCAL_INSTALLED_MODULE ifdef LOCAL_SHARED_LIBRARIES +my_shared_libraries := $(LOCAL_SHARED_LIBRARIES) +# Extra shared libraries introduced by LOCAL_CXX_STL. +include $(BUILD_SYSTEM)/cxx_stl_setup.mk $(LOCAL_2ND_ARCH_VAR_PREFIX)$(my_prefix)DEPENDENCIES_ON_SHARED_LIBRARIES += \ - $(my_register_name):$(LOCAL_INSTALLED_MODULE):$(subst $(space),$(comma),$(LOCAL_SHARED_LIBRARIES)) + $(my_register_name):$(LOCAL_INSTALLED_MODULE):$(subst $(space),$(comma),$(my_shared_libraries)) # We also need the LOCAL_BUILT_MODULE dependency, # since we use -rpath-link which points to the built module's path. -built_shared_libraries := \ +my_built_shared_libraries := \ $(addprefix $($(LOCAL_2ND_ARCH_VAR_PREFIX)$(my_prefix)OUT_INTERMEDIATE_LIBRARIES)/, \ $(addsuffix $($(my_prefix)SHLIB_SUFFIX), \ - $(LOCAL_SHARED_LIBRARIES))) -$(LOCAL_BUILT_MODULE) : $(built_shared_libraries) + $(my_shared_libraries))) +$(LOCAL_BUILT_MODULE) : $(my_built_shared_libraries) endif endif -endif # LOCAL_STRIP_MODULE not true +# We need to enclose the above export_includes and my_built_shared_libraries in +# "my_strip_module not true" because otherwise the rules are defined in dynamic_binary.mk. +endif # my_strip_module not true ifeq ($(LOCAL_MODULE_CLASS),APPS) PACKAGES.$(LOCAL_MODULE).OVERRIDES := $(strip $(LOCAL_OVERRIDES_PACKAGES)) +my_extract_apk := $(strip $(LOCAL_EXTRACT_APK)) + # Select dpi-specific source ifdef LOCAL_DPI_VARIANTS my_dpi := $(firstword $(filter $(LOCAL_DPI_VARIANTS),$(PRODUCT_AAPT_PREF_CONFIG) $(PRODUCT_AAPT_PREBUILT_DPI))) @@ -124,9 +166,27 @@ 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)) + +ifneq ($(strip $(LOCAL_EXTRACT_DPI_APK)),) +my_extract_apk := $(subst %,$(my_dpi),$(LOCAL_EXTRACT_DPI_APK)) +endif # LOCAL_EXTRACT_DPI_APK endif # my_dpi endif # LOCAL_DPI_VARIANTS +ifdef my_extract_apk +my_extracted_apk := $(intermediates)/extracted.apk + +$(my_extracted_apk): PRIVATE_EXTRACT := $(my_extract_apk) +$(my_extracted_apk): $(my_prebuilt_src_file) + @echo Extract APK: $@ + $(hide) mkdir -p $(dir $@) && rm -f $@ + $(hide) unzip -p $< $(PRIVATE_EXTRACT) >$@ + +my_prebuilt_src_file := $(my_extracted_apk) +my_extracted_apk := +my_extract_apk := +endif + rs_compatibility_jni_libs := include $(BUILD_SYSTEM)/install_jni_libs.mk @@ -171,29 +231,65 @@ else endif # Disable dex-preopt of prebuilts to save space, if requested. +ifndef LOCAL_DEX_PREOPT ifeq ($(DONT_DEXPREOPT_PREBUILTS),true) LOCAL_DEX_PREOPT := false endif +endif + +# Disable dex-preopt of specific prebuilts to save space, if requested. +ifneq ($(filter $(DEXPREOPT_BLACKLIST),$(LOCAL_MODULE)),) +LOCAL_DEX_PREOPT := false +endif ####################################### # defines built_odex along with rule to install odex include $(BUILD_SYSTEM)/dex_preopt_odex_install.mk ####################################### +ifneq ($(LOCAL_REPLACE_PREBUILT_APK_INSTALLED),) +# There is a replacement for the prebuilt .apk we can install without any processing. +$(built_module) : $(LOCAL_REPLACE_PREBUILT_APK_INSTALLED) | $(ACP) + $(transform-prebuilt-to-target) + +else # ! LOCAL_REPLACE_PREBUILT_APK_INSTALLED # Sign and align non-presigned .apks. -$(built_module) : $(my_prebuilt_src_file) | $(ACP) $(ZIPALIGN) $(SIGNAPK_JAR) +# The embedded prebuilt jni to uncompress. +ifeq ($(LOCAL_CERTIFICATE),PRESIGNED) +# For PRESIGNED apks we must uncompress every .so file: +# even if the .so file isn't for the current TARGET_ARCH, +# we can't strip the file. +embedded_prebuilt_jni_libs := 'lib/*.so' +endif +ifndef embedded_prebuilt_jni_libs +# No LOCAL_PREBUILT_JNI_LIBS, uncompress all. +embedded_prebuilt_jni_libs := 'lib/*.so' +endif +$(built_module): PRIVATE_EMBEDDED_JNI_LIBS := $(embedded_prebuilt_jni_libs) + +$(built_module) : $(my_prebuilt_src_file) | $(ACP) $(ZIPALIGN) $(SIGNAPK_JAR) $(AAPT) $(transform-prebuilt-to-target) -ifdef extracted_jni_libs - $(hide) zip -d $@ 'lib/*.so' # strip embedded JNI libraries. +ifneq ($(LOCAL_MODULE_PATH),$(TARGET_OUT_VENDOR)/bundled-app) + $(uncompress-shared-libs) endif +ifdef LOCAL_DEX_PREOPT +ifneq ($(BUILD_PLATFORM_ZIP),) + @# Keep a copy of apk with classes.dex unstripped + $(hide) cp -f $@ $(dir $@)package.dex.apk +endif # BUILD_PLATFORM_ZIP +endif # LOCAL_DEX_PREOPT ifneq ($(LOCAL_CERTIFICATE),PRESIGNED) - $(sign-package) -endif + @# Only strip out files if we can re-sign the package. ifdef LOCAL_DEX_PREOPT ifneq (nostripping,$(LOCAL_DEX_PREOPT)) $(call dexpreopt-remove-classes.dex,$@) -endif -endif +endif # LOCAL_DEX_PREOPT != nostripping +endif # LOCAL_DEX_PREOPT + $(sign-package) + # No need for align-package because sign-package takes care of alignment +else # LOCAL_CERTIFICATE == PRESIGNED $(align-package) +endif # LOCAL_CERTIFICATE +endif # ! LOCAL_REPLACE_PREBUILT_APK_INSTALLED ############################### ## Rule to build the odex file @@ -209,7 +305,7 @@ ifdef LOCAL_PACKAGE_SPLITS 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. +# Rules to sign 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)) @@ -218,10 +314,9 @@ 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) +$(built_apk_splits) : $(built_module_path)/%.apk : $(my_src_dir)/%.apk | $(ACP) $(AAPT) $(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) @@ -239,56 +334,155 @@ $(my_register_name): $(installed_apk_splits) endif # LOCAL_PACKAGE_SPLITS else # LOCAL_MODULE_CLASS != APPS +ifeq ($(prebuilt_module_is_dex_javalib),true) +# This is a target shared library, i.e. a jar with classes.dex. +####################################### +# defines built_odex along with rule to install odex +include $(BUILD_SYSTEM)/dex_preopt_odex_install.mk +####################################### +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 +$(built_module) : $(dexpreopted_boot_jar) | $(ACP) + $(call copy-file-to-target) + +# For libart boot jars, we don't have .odex files. +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))% : $(my_prebuilt_src_file) + @echo "Dexpreopt Jar: $(PRIVATE_MODULE) ($@)" + $(call dexpreopt-one-file,$<,$@) + +$(built_module) : $(my_prebuilt_src_file) | $(ACP) + $(call copy-file-to-target) +ifneq (nostripping,$(LOCAL_DEX_PREOPT)) + $(call dexpreopt-remove-classes.dex,$@) +endif +endif # boot jar +else # ! LOCAL_DEX_PREOPT +$(built_module) : $(my_prebuilt_src_file) | $(ACP) + $(call copy-file-to-target) +endif # LOCAL_DEX_PREOPT + +else # ! prebuilt_module_is_dex_javalib ifneq ($(LOCAL_PREBUILT_STRIP_COMMENTS),) $(built_module) : $(my_prebuilt_src_file) $(transform-prebuilt-to-target-strip-comments) -else +ifeq ($(LOCAL_MODULE_CLASS),EXECUTABLES) + $(hide) chmod +x $@ +endif +else ifneq ($(LOCAL_ACP_UNAVAILABLE),true) $(built_module) : $(my_prebuilt_src_file) | $(ACP) $(transform-prebuilt-to-target) -ifneq ($(prebuilt_module_is_a_library),) - ifneq ($(LOCAL_IS_HOST_MODULE),) - $(transform-host-ranlib-copy-hack) - else - $(transform-ranlib-copy-hack) - endif +ifeq ($(LOCAL_MODULE_CLASS),EXECUTABLES) + $(hide) chmod +x $@ endif +else +$(built_module) : $(my_prebuilt_src_file) + $(copy-file-to-target-with-cp) +ifeq ($(LOCAL_MODULE_CLASS),EXECUTABLES) + $(hide) chmod +x $@ endif +endif +endif # ! prebuilt_module_is_dex_javalib endif # LOCAL_MODULE_CLASS != APPS -ifeq ($(LOCAL_IS_HOST_MODULE)$(LOCAL_MODULE_CLASS),JAVA_LIBRARIES) +ifeq ($(LOCAL_MODULE_CLASS),JAVA_LIBRARIES) +my_src_jar := $(my_prebuilt_src_file) +ifeq ($(LOCAL_IS_HOST_MODULE),) # for target java libraries, the LOCAL_BUILT_MODULE is in a product-specific dir, # while the deps should be in the common dir, so we make a copy in the common dir. -# For nonstatic library, $(common_javalib_jar) is the dependency file, -# while $(common_classes_jar) is used to link. common_classes_jar := $(intermediates.COMMON)/classes.jar common_javalib_jar := $(intermediates.COMMON)/javalib.jar $(common_classes_jar) $(common_javalib_jar): PRIVATE_MODULE := $(LOCAL_MODULE) -ifneq ($(filter %.aar, $(my_prebuilt_src_file)),) +ifeq ($(prebuilt_module_is_dex_javalib),true) +# For prebuilt shared Java library we don't have classes.jar. +$(common_javalib_jar) : $(my_src_jar) | $(ACP) + $(transform-prebuilt-to-target) + +else # ! prebuilt_module_is_dex_javalib + +my_src_aar := $(filter %.aar, $(my_prebuilt_src_file)) +ifneq ($(my_src_aar),) # This is .aar file, archive of classes.jar and Android resources. my_src_jar := $(intermediates.COMMON)/aar/classes.jar -$(my_src_jar) : $(my_prebuilt_src_file) +$(my_src_jar) : $(my_src_aar) $(hide) rm -rf $(dir $@) && mkdir -p $(dir $@) $(hide) unzip -qo -d $(dir $@) $< # Make sure the extracted classes.jar has a new timestamp. $(hide) touch $@ -else -# This is jar file. -my_src_jar := $(my_prebuilt_src_file) endif + $(common_classes_jar) : $(my_src_jar) | $(ACP) $(transform-prebuilt-to-target) $(common_javalib_jar) : $(common_classes_jar) | $(ACP) $(transform-prebuilt-to-target) +$(call define-jar-to-toc-rule, $(common_classes_jar)) + +ifdef LOCAL_USE_AAPT2 +ifneq ($(my_src_aar),) +my_res_package := $(intermediates.COMMON)/package-res.apk + +# We needed only very few PRIVATE variables and aapt2.mk input variables. Reset the unnecessary ones. +$(my_res_package): PRIVATE_AAPT2_CFLAGS := +$(my_res_package): PRIVATE_ANDROID_MANIFEST := $(intermediates.COMMON)/aar/AndroidManifest.xml +$(my_res_package): PRIVATE_AAPT_INCLUDES := +$(my_res_package): PRIVATE_SOURCE_INTERMEDIATES_DIR := +$(my_res_package): PRIVATE_PROGUARD_OPTIONS_FILE := +$(my_res_package): PRIVATE_DEFAULT_APP_TARGET_SDK := +$(my_res_package): PRIVATE_DEFAULT_APP_TARGET_SDK := +$(my_res_package): PRIVATE_PRODUCT_AAPT_CONFIG := +$(my_res_package): PRIVATE_PRODUCT_AAPT_PREF_CONFIG := +$(my_res_package): PRIVATE_TARGET_AAPT_CHARACTERISTICS := + +full_android_manifest := +my_res_resources := +my_overlay_resources := +my_compiled_res_base_dir := +R_file_stamp := +proguard_options_file := +my_generated_res_dirs := $(intermediates.COMMON)/aar/res +my_generated_res_dirs_deps := $(my_src_jar) +include $(BUILD_SYSTEM)/aapt2.mk + +# Make sure my_res_package is created when you run mm/mmm. +$(built_module) : $(my_res_package) +endif # $(my_src_aar) +endif # LOCAL_USE_AAPT2 # make sure the classes.jar and javalib.jar are built before $(LOCAL_BUILT_MODULE) $(built_module) : $(common_javalib_jar) -endif # TARGET JAVA_LIBRARIES -$(built_module) : $(LOCAL_ADDITIONAL_DEPENDENCIES) +endif # ! prebuilt_module_is_dex_javalib +endif # LOCAL_IS_HOST_MODULE is not set + +ifneq ($(prebuilt_module_is_dex_javalib),true) +ifneq ($(LOCAL_JILL_FLAGS),) +$(error LOCAL_JILL_FLAGS is not supported any more, please use jack options in LOCAL_JACK_FLAGS instead) +endif + +# We may be building classes.jack from a host jar for host dalvik Java library. +$(intermediates.COMMON)/classes.jack : PRIVATE_JACK_FLAGS:=$(LOCAL_JACK_FLAGS) +$(intermediates.COMMON)/classes.jack : PRIVATE_JACK_MIN_SDK_VERSION := 1 +$(intermediates.COMMON)/classes.jack : $(my_src_jar) $(LOCAL_MODULE_MAKEFILE_DEP) \ + $(LOCAL_ADDITIONAL_DEPENDENCIES) $(JACK) | setup-jack-server + $(transform-jar-to-jack) + +# Update timestamps of .toc files for prebuilts so dependents will be +# always rebuilt. +$(intermediates.COMMON)/classes.dex.toc: $(intermediates.COMMON)/classes.jack + touch $@ + +endif # ! prebuilt_module_is_dex_javalib +endif # JAVA_LIBRARIES + +$(built_module) : $(LOCAL_MODULE_MAKEFILE_DEP) $(LOCAL_ADDITIONAL_DEPENDENCIES) my_prebuilt_src_file := diff --git a/core/tasks/product-graph.mk b/core/product-graph.mk similarity index 95% rename from core/tasks/product-graph.mk rename to core/product-graph.mk index fcec27775..2b9bfbb08 100644 --- a/core/tasks/product-graph.mk +++ b/core/product-graph.mk @@ -34,7 +34,7 @@ define all-products-inner endef -this_makefile := build/core/tasks/product-graph.mk +this_makefile := build/core/product-graph.mk products_svg := $(OUT_DIR)/products.svg products_pdf := $(OUT_DIR)/products.pdf @@ -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 @@ -105,11 +105,11 @@ $(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)' >> $$@ $(hide) echo 'DEVICE_PACKAGE_OVERLAYS=$$(PRODUCTS.$(strip $(1)).DEVICE_PACKAGE_OVERLAYS)' >> $$@ - $(hide) echo 'PRODUCT_TAGS=$$(PRODUCTS.$(strip $(1)).PRODUCT_TAGS)' >> $$@ $(hide) echo 'PRODUCT_SDK_ADDON_NAME=$$(PRODUCTS.$(strip $(1)).PRODUCT_SDK_ADDON_NAME)' >> $$@ $(hide) echo 'PRODUCT_SDK_ADDON_COPY_FILES=$$(PRODUCTS.$(strip $(1)).PRODUCT_SDK_ADDON_COPY_FILES)' >> $$@ $(hide) echo 'PRODUCT_SDK_ADDON_COPY_MODULES=$$(PRODUCTS.$(strip $(1)).PRODUCT_SDK_ADDON_COPY_MODULES)' >> $$@ @@ -117,7 +117,6 @@ $(OUT_DIR)/products/$(strip $(1)).txt: $(this_makefile) $(hide) echo 'PRODUCT_DEFAULT_WIFI_CHANNELS=$$(PRODUCTS.$(strip $(1)).PRODUCT_DEFAULT_WIFI_CHANNELS)' >> $$@ $(hide) echo 'PRODUCT_DEFAULT_DEV_CERTIFICATE=$$(PRODUCTS.$(strip $(1)).PRODUCT_DEFAULT_DEV_CERTIFICATE)' >> $$@ $(hide) echo 'PRODUCT_RESTRICT_VENDOR_FILES=$$(PRODUCTS.$(strip $(1)).PRODUCT_RESTRICT_VENDOR_FILES)' >> $$@ - $(hide) echo 'PRODUCT_FACTORY_RAMDISK_MODULES=$$(PRODUCTS.$(strip $(1)).PRODUCT_FACTORY_RAMDISK_MODULES)' >> $$@ $(hide) echo 'PRODUCT_VENDOR_KERNEL_HEADERS=$$(PRODUCTS.$(strip $(1)).PRODUCT_VENDOR_KERNEL_HEADERS)' >> $$@ $(call product-debug-filename, $(p)): \ diff --git a/core/product.mk b/core/product.mk index f0fc92102..fe9ff835f 100644 --- a/core/product.mk +++ b/core/product.mk @@ -23,13 +23,21 @@ # and the .mk suffix) of the product makefile, ":" can be # omitted. +# Search for AndroidProducts.mks in the given dir. +# $(1): the path to the dir +define _search-android-products-files-in-dir +$(sort $(shell test -d $(1) && find -L $(1) \ + -maxdepth 6 \ + -name .git -prune \ + -o -name AndroidProducts.mk -print)) +endef + # # Returns the list of all AndroidProducts.mk files. # $(call ) isn't necessary. # define _find-android-products-files -$(shell test -d device && find device -maxdepth 6 -name AndroidProducts.mk) \ - $(shell test -d vendor && find vendor -maxdepth 6 -name AndroidProducts.mk) \ +$(foreach d, device vendor product,$(call _search-android-products-files-in-dir,$(d))) \ $(SRC_TARGET_DIR)/product/AndroidProducts.mk endef @@ -65,6 +73,7 @@ endef # _product_var_list := \ + PRODUCT_BUILD_PROP_OVERRIDES \ PRODUCT_NAME \ PRODUCT_MODEL \ PRODUCT_LOCALES \ @@ -82,11 +91,11 @@ _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 \ DEVICE_PACKAGE_OVERLAYS \ - PRODUCT_TAGS \ PRODUCT_SDK_ATREE_FILES \ PRODUCT_SDK_ADDON_NAME \ PRODUCT_SDK_ADDON_COPY_FILES \ @@ -97,21 +106,27 @@ _product_var_list := \ PRODUCT_DEFAULT_DEV_CERTIFICATE \ PRODUCT_RESTRICT_VENDOR_FILES \ PRODUCT_VENDOR_KERNEL_HEADERS \ - PRODUCT_FACTORY_RAMDISK_MODULES \ - PRODUCT_FACTORY_BUNDLE_MODULES \ - PRODUCT_RUNTIMES \ PRODUCT_BOOT_JARS \ + PRODUCT_SUPPORTS_BOOT_SIGNER \ + PRODUCT_SUPPORTS_VBOOT \ PRODUCT_SUPPORTS_VERITY \ + PRODUCT_SUPPORTS_VERITY_FEC \ PRODUCT_OEM_PROPERTIES \ PRODUCT_SYSTEM_PROPERTY_BLACKLIST \ PRODUCT_SYSTEM_SERVER_JARS \ + PRODUCT_VBOOT_SIGNING_KEY \ + PRODUCT_VBOOT_SIGNING_SUBKEY \ PRODUCT_VERITY_SIGNING_KEY \ PRODUCT_SYSTEM_VERITY_PARTITION \ PRODUCT_VENDOR_VERITY_PARTITION \ - PRODUCT_DEX_PREOPT_IMAGE_IN_DATA \ PRODUCT_DEX_PREOPT_MODULE_CONFIGS \ PRODUCT_DEX_PREOPT_DEFAULT_FLAGS \ PRODUCT_DEX_PREOPT_BOOT_FLAGS \ + PRODUCT_SANITIZER_MODULE_CONFIGS \ + PRODUCT_SYSTEM_BASE_FS_PATH \ + PRODUCT_VENDOR_BASE_FS_PATH \ + PRODUCT_SHIPPING_API_LEVEL \ + define dump-product @@ -125,24 +140,73 @@ 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 + $(if $(findstring ../,$(2)),\ + $(eval np := $(call normalize-paths,$(2))),\ + $(eval np := $(strip $(2))))\ + $(eval $(1) := $($(1)) $(INHERIT_TAG)$(np)) +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 + $(if $(findstring ../,$(1)),\ + $(eval np := $(call normalize-paths,$(1))),\ + $(eval np := $(strip $(1))))\ + $(eval inherit_var := \ + PRODUCTS.$(strip $(word 1,$(_include_stack))).INHERITS_FROM) \ + $(eval $(inherit_var) := $(sort $($(inherit_var)) $(np))) \ + $(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 +215,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 # @@ -234,16 +305,13 @@ _product_stash_var_list := $(_product_var_list) \ TARGET_DEVICE_KERNEL_HEADERS \ TARGET_PRODUCT_KERNEL_HEADERS \ TARGET_BOOTLOADER_BOARD_NAME \ - TARGET_COMPRESS_MODULE_SYMBOLS \ TARGET_NO_BOOTLOADER \ TARGET_NO_KERNEL \ TARGET_NO_RECOVERY \ TARGET_NO_RADIOIMAGE \ TARGET_HARDWARE_3D \ - TARGET_PROVIDES_INIT_RC \ TARGET_CPU_ABI \ TARGET_CPU_ABI2 \ - TARGET_CPU_SMP \ _product_stash_var_list += \ @@ -258,6 +326,7 @@ _product_stash_var_list += \ BOARD_BOOTIMAGE_PARTITION_SIZE \ BOARD_RECOVERYIMAGE_PARTITION_SIZE \ BOARD_SYSTEMIMAGE_PARTITION_SIZE \ + BOARD_SYSTEMIMAGE_FILE_SYSTEM_TYPE \ BOARD_USERDATAIMAGE_FILE_SYSTEM_TYPE \ BOARD_USERDATAIMAGE_PARTITION_SIZE \ BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE \ @@ -273,6 +342,11 @@ _product_stash_var_list += \ WITH_DEXPREOPT \ WITH_DEXPREOPT_BOOT_IMG_ONLY +_product_stash_var_list += \ + GLOBAL_CFLAGS_NO_OVERRIDE \ + GLOBAL_CPPFLAGS_NO_OVERRIDE \ + GLOBAL_CLANG_CFLAGS_NO_OVERRIDE \ + # # Stash values of the variables in _product_stash_var_list. # $(1): Renamed prefix @@ -315,3 +389,14 @@ $(eval _c := $(subst $(space),$(_PDPMC_SP_PLACE_HOLDER),$(strip $(2))))\ $(eval PRODUCT_DEX_PREOPT_MODULE_CONFIGS += \ $(foreach m,$(1),$(m)=$(_c))) endef + +# whitespace placeholder when we record module's sanitizer config. +_PSMC_SP_PLACE_HOLDER := |@SP@| +# Set up sanitizer config for a module. +# $(1) list of module names +# $(2) the modules' sanitizer config +define add-product-sanitizer-module-config +$(eval _c := $(subst $(space),$(_PSMC_SP_PLACE_HOLDER),$(strip $(2))))\ +$(eval PRODUCT_SANITIZER_MODULE_CONFIGS += \ + $(foreach m,$(1),$(m)=$(_c))) +endef diff --git a/core/product_config.mk b/core/product_config.mk index e7fa75ef5..fe57ef385 100644 --- a/core/product_config.mk +++ b/core/product_config.mk @@ -74,7 +74,7 @@ endif ########################################################### define find-copy-subdir-files -$(shell find $(2) -name "$(1)" | $(SED_EXTENDED) "s:($(2)/?(.*)):\\1\\:$(3)/\\2:" | sed "s://:/:g") +$(sort $(shell find $(2) -name "$(1)" -type f | $(SED_EXTENDED) "s:($(2)/?(.*)):\\1\\:$(3)/\\2:" | sed "s://:/:g")) endef # --------------------------------------------------------------- @@ -117,7 +117,7 @@ ifdef product_goals # which really means TARGET_PRODUCT=dream make installclean. ifneq ($(filter-out $(INTERNAL_VALID_VARIANTS),$(TARGET_BUILD_VARIANT)),) MAKECMDGOALS := $(MAKECMDGOALS) $(TARGET_BUILD_VARIANT) - TARGET_BUILD_VARIANT := eng + TARGET_BUILD_VARIANT := userdebug default_goal_substitution := else default_goal_substitution := $(DEFAULT_GOAL) @@ -149,7 +149,7 @@ endif unbundled_goals := $(strip $(filter APP-%,$(MAKECMDGOALS))) ifdef unbundled_goals ifneq ($(words $(unbundled_goals)),1) - $(error Only one APP-* goal may be specified; saw "$(unbundled_goals)")) + $(error Only one APP-* goal may be specified; saw "$(unbundled_goals)") endif TARGET_BUILD_APPS := $(strip $(subst -, ,$(patsubst APP-%,%,$(unbundled_goals)))) ifneq ($(filter $(DEFAULT_GOAL),$(MAKECMDGOALS)),) @@ -179,16 +179,26 @@ 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)/lineage.mk") + ifeq ($(all_product_configs),) + # Fall back to cm.mk + all_product_configs := $(shell find device -path "*/$(CM_BUILD)/cm.mk") + endif 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,19 +217,36 @@ $(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))) +load_all_product_makefiles := +ifneq (,$(filter product-graph, $(MAKECMDGOALS))) +ifeq ($(ANDROID_PRODUCT_GRAPH),--all) +load_all_product_makefiles := true +endif +endif +ifneq (,$(filter dump-products,$(MAKECMDGOALS))) +ifeq ($(ANDROID_DUMP_PRODUCTS),all) +load_all_product_makefiles := true +endif +endif + +ifeq ($(load_all_product_makefiles),true) # Import all product makefiles. $(call import-products, $(all_product_makefiles)) else # Import just the current product. ifndef current_product_makefile -$(error Can not locate config makefile for product "$(TARGET_PRODUCT)") +$(error Cannot locate config makefile for product "$(TARGET_PRODUCT)") endif ifneq (1,$(words $(current_product_makefile))) $(error Product "$(TARGET_PRODUCT)" ambiguous: matches $(current_product_makefile)) @@ -247,36 +274,6 @@ all_product_makefiles := all_product_configs := -############################################################################# -# TODO: Remove this hack once only 1 runtime is left. -# Include the runtime product makefile based on the product's PRODUCT_RUNTIMES -$(call clear-var-list, $(_product_var_list)) - -# Set PRODUCT_RUNTIMES, allowing buildspec to override using OVERRIDE_RUNTIMES -product_runtimes := $(sort $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_RUNTIMES)) -ifneq ($(OVERRIDE_RUNTIMES),) - $(info Overriding PRODUCT_RUNTIMES=$(product_runtimes) with $(OVERRIDE_RUNTIMES)) - product_runtimes := $(OVERRIDE_RUNTIMES) -endif -$(foreach runtime, $(product_runtimes), $(eval include $(SRC_TARGET_DIR)/product/$(runtime).mk)) -$(foreach v, $(_product_var_list), $(if $($(v)),\ - $(eval PRODUCTS.$(INTERNAL_PRODUCT).$(v) += $(sort $($(v)))))) - -$(call clear-var-list, $(_product_var_list)) -# Now we can assign to PRODUCT_RUNTIMES -PRODUCT_RUNTIMES := $(product_runtimes) -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 - # If we have more than one, we leave the classes.dex alone for post-boot analysis - DEX_PREOPT_DEFAULT := nostripping -endif - ############################################################################# # A list of module names of BOOTCLASSPATH (jar files) @@ -317,9 +314,11 @@ PRODUCT_AAPT_CONFIG := \ # product-scoped aapt flags PRODUCT_AAPT_FLAGS := +PRODUCT_AAPT2_CFLAGS := ifneq ($(filter en_XA ar_XB,$(PRODUCT_LOCALES)),) -# Force generating resources for pseudo-locales. -PRODUCT_AAPT_FLAGS += --pseudo-localize + # Force generating resources for pseudo-locales. + PRODUCT_AAPT2_CFLAGS += --pseudo-localize + PRODUCT_AAPT_FLAGS += --pseudo-localize endif PRODUCT_BRAND := $(strip $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_BRAND)) @@ -362,26 +361,48 @@ endif PRODUCT_COPY_FILES := \ $(strip $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_COPY_FILES)) +# 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 '='. PRODUCT_PROPERTY_OVERRIDES := \ $(strip $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_PROPERTY_OVERRIDES)) +PRODUCT_SHIPPING_API_LEVEL := $(strip $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SHIPPING_API_LEVEL)) +ifdef PRODUCT_SHIPPING_API_LEVEL +ADDITIONAL_BUILD_PROPERTIES += \ + ro.product.first_api_level=$(PRODUCT_SHIPPING_API_LEVEL) +endif + # A list of property assignments, like "key = value", with zero or more # whitespace characters on either side of the '='. # used for adding properties to default.prop 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)) DEVICE_PACKAGE_OVERLAYS := \ $(strip $(PRODUCTS.$(INTERNAL_PRODUCT).DEVICE_PACKAGE_OVERLAYS)) -# An list of whitespace-separated words. -PRODUCT_TAGS := $(strip $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_TAGS)) - # The list of product-specific kernel header dirs PRODUCT_VENDOR_KERNEL_HEADERS := \ $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VENDOR_KERNEL_HEADERS) @@ -401,15 +422,11 @@ PRODUCT_OTA_PUBLIC_KEYS := $(sort \ PRODUCT_EXTRA_RECOVERY_KEYS := $(sort \ $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_EXTRA_RECOVERY_KEYS)) -# If there is no room in /system for the image, place it in /data -PRODUCT_DEX_PREOPT_IMAGE_IN_DATA := \ - $(strip $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_DEX_PREOPT_IMAGE_IN_DATA)) - PRODUCT_DEX_PREOPT_DEFAULT_FLAGS := \ $(strip $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_DEX_PREOPT_DEFAULT_FLAGS)) PRODUCT_DEX_PREOPT_BOOT_FLAGS := \ $(strip $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_DEX_PREOPT_BOOT_FLAGS)) -# Resolve and setup per-module dex-preopot configs. +# Resolve and setup per-module dex-preopt configs. PRODUCT_DEX_PREOPT_MODULE_CONFIGS := \ $(strip $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_DEX_PREOPT_MODULE_CONFIGS)) # If a module has multiple setups, the first takes precedence. @@ -422,3 +439,17 @@ $(foreach c,$(PRODUCT_DEX_PREOPT_MODULE_CONFIGS),\ $(eval cf := $(subst $(_PDPMC_SP_PLACE_HOLDER),$(space),$(cf)))\ $(eval DEXPREOPT.$(TARGET_PRODUCT).$(m).CONFIG := $(cf)))) _pdpmc_modules := + +# Resolve and setup per-module sanitizer configs. +PRODUCT_SANITIZER_MODULE_CONFIGS := \ + $(strip $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SANITIZER_MODULE_CONFIGS)) +# If a module has multiple setups, the first takes precedence. +_psmc_modules := +$(foreach c,$(PRODUCT_SANITIZER_MODULE_CONFIGS),\ + $(eval m := $(firstword $(subst =,$(space),$(c))))\ + $(if $(filter $(_psmc_modules),$(m)),,\ + $(eval _psmc_modules += $(m))\ + $(eval cf := $(patsubst $(m)=%,%,$(c)))\ + $(eval cf := $(subst $(_PSMC_SP_PLACE_HOLDER),$(space),$(cf)))\ + $(eval SANITIZER.$(TARGET_PRODUCT).$(m).CONFIG := $(cf)))) +_psmc_modules := diff --git a/core/proguard.flags b/core/proguard.flags index 0641627e5..6ed1f9b3b 100644 --- a/core/proguard.flags +++ b/core/proguard.flags @@ -10,9 +10,9 @@ #-flattenpackagehierarchy # Keep classes and methods that have the guava @VisibleForTesting annotation --keep @com.google.common.annotations.VisibleForTesting class * +-keep @**.VisibleForTesting class * -keepclassmembers class * { -@com.google.common.annotations.VisibleForTesting *; +@**.VisibleForTesting *; } -include proguard_basic_keeps.flags diff --git a/core/proguard.jacoco.flags b/core/proguard.jacoco.flags new file mode 100644 index 000000000..c3bed9435 --- /dev/null +++ b/core/proguard.jacoco.flags @@ -0,0 +1,8 @@ +# Keep everything for the emma classes +-keep class com.vladium.** { + *; +} +# Keep everything for the jacoco classes +-keep class org.jacoco.** { + *; +} diff --git a/core/proguard_basic_keeps.flags b/core/proguard_basic_keeps.flags index 4a85db0f8..4de52219a 100644 --- a/core/proguard_basic_keeps.flags +++ b/core/proguard_basic_keeps.flags @@ -40,6 +40,11 @@ java.lang.Object readResolve(); } +# Keep Throwable's constructor that takes a String argument. +-keepclassmembers class * extends java.lang.Throwable { + (java.lang.String); +} + # Please specify classes to be kept explicitly in your package's configuration. # -keep class * extends android.app.Activity # -keep class * extends android.view.View @@ -58,7 +63,12 @@ # Don't warn about those in case this app is linking against an older # platform version. We know about them, and they are safe. # See proguard-android.txt in the SDK package. --dontwarn android.support.** +# +# DO NOT USE THIS: We figured it's dangerous to blindly ignore all support library warnings. +# ProGuard may strip members of subclass of unknown super classes, in case an app is linking against +# LOCAL_SDK_VERSION lower than the support library's LOCAL_SDK_VERSION. +# See bug/20658265. +# -dontwarn android.support.** # Less spammy. -dontnote diff --git a/core/raw_executable.mk b/core/raw_executable.mk deleted file mode 100644 index b64173a69..000000000 --- a/core/raw_executable.mk +++ /dev/null @@ -1,25 +0,0 @@ -LOCAL_MODULE_CLASS := EXECUTABLES -LOCAL_MODULE_SUFFIX := -LOCAL_FORCE_STATIC_EXECUTABLE := true - -include $(BUILD_SYSTEM)/binary.mk - -$(LOCAL_BUILT_MODULE) : PRIVATE_ELF_FILE := $(intermediates)/$(PRIVATE_MODULE).elf -$(LOCAL_BUILT_MODULE) : PRIVATE_LIBS := `$(TARGET_CC) -mthumb-interwork -print-libgcc-file-name` - -$(all_objects) : PRIVATE_TARGET_PROJECT_INCLUDES := -$(all_objects) : PRIVATE_TARGET_C_INCLUDES := -$(all_objects) : PRIVATE_TARGET_GLOBAL_CFLAGS := -$(all_objects) : PRIVATE_TARGET_GLOBAL_CPPFLAGS := - -$(LOCAL_BUILT_MODULE): $(all_objects) $(all_libraries) - @$(mkdir -p $(dir $@) - @echo "target Linking: $(PRIVATE_MODULE)" - $(hide) $(TARGET_LD) \ - $(addprefix --script ,$(PRIVATE_LINK_SCRIPT)) \ - $(PRIVATE_RAW_EXECUTABLE_LDFLAGS) \ - -o $(PRIVATE_ELF_FILE) \ - $(PRIVATE_ALL_OBJECTS) \ - --start-group $(PRIVATE_ALL_STATIC_LIBRARIES) --end-group \ - $(PRIVATE_LIBS) - $(hide) $(TARGET_OBJCOPY) -O binary $(PRIVATE_ELF_FILE) $@ diff --git a/core/raw_static_library.mk b/core/raw_static_library.mk deleted file mode 100644 index 14a404dfa..000000000 --- a/core/raw_static_library.mk +++ /dev/null @@ -1,4 +0,0 @@ - -LOCAL_RAW_STATIC_LIBRARY:=true - -include $(BUILD_SYSTEM)/static_library_internal.mk diff --git a/core/sdk_font.mk b/core/sdk_font.mk index 204403d19..c10f19ff3 100644 --- a/core/sdk_font.mk +++ b/core/sdk_font.mk @@ -18,7 +18,7 @@ fonttools_lib := external/fonttools/Lib SDK_FONT_TEMP := $(call intermediates-dir-for,PACKAGING,sdk-fonts,HOST,COMMON) # The font configuration files - system_fonts.xml, fallback_fonts.xml etc. -sdk_font_config := $(wildcard frameworks/base/data/fonts/*.xml) +sdk_font_config := $(sort $(wildcard frameworks/base/data/fonts/*.xml)) sdk_font_config := $(addprefix $(SDK_FONT_TEMP)/, $(notdir $(sdk_font_config))) $(sdk_font_config): $(SDK_FONT_TEMP)/%.xml: \ diff --git a/core/setup_one_odex.mk b/core/setup_one_odex.mk index ec8a28a5b..36b68171b 100644 --- a/core/setup_one_odex.mk +++ b/core/setup_one_odex.mk @@ -32,7 +32,9 @@ $(my_built_odex) : $($(my_2nd_arch_prefix)DEXPREOPT_ONE_FILE_DEPENDENCY_BUILT_BO $(DEXPREOPT_ONE_FILE_DEPENDENCY_TOOLS) \ $(my_dex_preopt_image_filename) -my_installed_odex := $(call get-odex-file-path,$($(my_2nd_arch_prefix)DEX2OAT_TARGET_ARCH),$(LOCAL_INSTALLED_MODULE)) +my_installed_odex := $(call get-odex-installed-file-path,$($(my_2nd_arch_prefix)DEX2OAT_TARGET_ARCH),$(LOCAL_INSTALLED_MODULE)) + +$(eval $(call copy-one-file,$(my_built_odex),$(my_installed_odex))) built_odex += $(my_built_odex) installed_odex += $(my_installed_odex) diff --git a/core/shared_library.mk b/core/shared_library.mk index 71a3bb268..26c455da4 100644 --- a/core/shared_library.mk +++ b/core/shared_library.mk @@ -9,18 +9,22 @@ endif ifeq ($(my_module_multilib),both) ifneq ($(LOCAL_MODULE_PATH),) ifneq ($(TARGET_2ND_ARCH),) -$(warning $(LOCAL_MODULE): LOCAL_MODULE_PATH for shared libraries is unsupported in multiarch builds, use LOCAL_MODULE_RELATIVE_PATH instead) +$(error $(LOCAL_MODULE): LOCAL_MODULE_PATH for shared libraries is unsupported in multiarch builds, use LOCAL_MODULE_RELATIVE_PATH instead) endif endif ifneq ($(LOCAL_UNSTRIPPED_PATH),) ifneq ($(TARGET_2ND_ARCH),) -$(warning $(LOCAL_MODULE): LOCAL_UNSTRIPPED_PATH for shared libraries is unsupported in multiarch builds) +$(error $(LOCAL_MODULE): LOCAL_UNSTRIPPED_PATH for shared libraries is unsupported in multiarch builds) endif endif endif # my_module_multilib == both +ifeq ($(LOCAL_SDCLANG), true) +include $(SDCLANG_FLAG_DEFS) +endif + LOCAL_2ND_ARCH_VAR_PREFIX := include $(BUILD_SYSTEM)/module_arch_supported.mk @@ -38,9 +42,6 @@ ifeq ($(my_module_arch_supported),true) OVERRIDE_BUILT_MODULE_PATH := LOCAL_BUILT_MODULE := LOCAL_INSTALLED_MODULE := -LOCAL_MODULE_STEM := -LOCAL_BUILT_MODULE_STEM := -LOCAL_INSTALLED_MODULE_STEM := LOCAL_INTERMEDIATE_TARGETS := include $(BUILD_SYSTEM)/shared_library_internal.mk @@ -51,6 +52,12 @@ LOCAL_2ND_ARCH_VAR_PREFIX := endif # TARGET_2ND_ARCH +ifeq ($(LOCAL_SDCLANG), true) +ifeq ($(LOCAL_SDCLANG_LTO), true) +include $(SDCLANG_LTO_DEFS) +endif +endif + my_module_arch_supported := ########################################################### diff --git a/core/shared_library_internal.mk b/core/shared_library_internal.mk index c01be371e..b9a5e3e93 100644 --- a/core/shared_library_internal.mk +++ b/core/shared_library_internal.mk @@ -40,10 +40,19 @@ include $(BUILD_SYSTEM)/dynamic_binary.mk # Define PRIVATE_ variables from global vars my_target_global_ld_dirs := $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_GLOBAL_LD_DIRS) +ifeq ($(LOCAL_NO_LIBGCC),true) +my_target_libgcc := +else my_target_libgcc := $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_LIBGCC) +endif my_target_libatomic := $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_LIBATOMIC) +ifeq ($(LOCAL_NO_CRT),true) +my_target_crtbegin_so_o := +my_target_crtend_so_o := +else my_target_crtbegin_so_o := $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_CRTBEGIN_SO_O) my_target_crtend_so_o := $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_CRTEND_SO_O) +endif ifdef LOCAL_SDK_VERSION # Make sure the prebuilt NDK paths are put ahead of the TARGET_GLOBAL_LD_DIRS, # so we don't have race condition when the system libraries (such as libc, libstdc++) are also built in the tree. @@ -62,9 +71,13 @@ $(linked_module): PRIVATE_TARGET_LIBATOMIC := $(my_target_libatomic) $(linked_module): PRIVATE_TARGET_CRTBEGIN_SO_O := $(my_target_crtbegin_so_o) $(linked_module): PRIVATE_TARGET_CRTEND_SO_O := $(my_target_crtend_so_o) -$(linked_module): $(all_objects) $(all_libraries) \ - $(LOCAL_ADDITIONAL_DEPENDENCIES) \ - $(my_target_crtbegin_so_o) $(my_target_crtend_so_o) +$(linked_module): \ + $(all_objects) \ + $(all_libraries) \ + $(my_target_crtbegin_so_o) \ + $(my_target_crtend_so_o) \ + $(LOCAL_MODULE_MAKEFILE_DEP) \ + $(LOCAL_ADDITIONAL_DEPENDENCIES) $(transform-o-to-shared-lib) endif # skip_build_from_source diff --git a/core/soong.mk b/core/soong.mk new file mode 100644 index 000000000..246395326 --- /dev/null +++ b/core/soong.mk @@ -0,0 +1,80 @@ +SOONG_OUT_DIR := $(OUT_DIR)/soong +SOONG_HOST_EXECUTABLES := $(SOONG_OUT_DIR)/host/$(HOST_PREBUILT_TAG)/bin +KATI := $(SOONG_HOST_EXECUTABLES)/ckati +MAKEPARALLEL := $(SOONG_HOST_EXECUTABLES)/makeparallel + +SOONG := $(SOONG_OUT_DIR)/soong +SOONG_BOOTSTRAP := $(SOONG_OUT_DIR)/.soong.bootstrap +SOONG_BUILD_NINJA := $(SOONG_OUT_DIR)/build.ninja +SOONG_ANDROID_MK := $(SOONG_OUT_DIR)/Android.mk +SOONG_IN_MAKE := $(SOONG_OUT_DIR)/.soong.in_make +SOONG_VARIABLES := $(SOONG_OUT_DIR)/soong.variables + +# We need to rebootstrap soong if SOONG_OUT_DIR or the reverse path from +# SOONG_OUT_DIR to TOP changes +SOONG_NEEDS_REBOOTSTRAP := +ifneq ($(wildcard $(SOONG_BOOTSTRAP)),) + ifneq ($(SOONG_OUT_DIR),$(strip $(shell source $(SOONG_BOOTSTRAP); echo $$BUILDDIR))) + SOONG_NEEDS_REBOOTSTRAP := FORCE + $(warning soong_out_dir changed) + endif + ifneq ($(strip $(shell build/soong/reverse_path.py $(SOONG_OUT_DIR))),$(strip $(shell source $(SOONG_BOOTSTRAP); echo $$SRCDIR_FROM_BUILDDIR))) + SOONG_NEEDS_REBOOTSTRAP := FORCE + $(warning reverse path changed) + endif +endif + +# Bootstrap soong. +$(SOONG_BOOTSTRAP): bootstrap.bash $(SOONG_NEEDS_REBOOTSTRAP) + $(hide) mkdir -p $(dir $@) + $(hide) BUILDDIR=$(SOONG_OUT_DIR) ./bootstrap.bash + +# Create soong.variables with copies of makefile settings. Runs every build, +# but only updates soong.variables if it changes +SOONG_VARIABLES_TMP := $(SOONG_VARIABLES).$$$$ +$(SOONG_VARIABLES): FORCE + $(hide) mkdir -p $(dir $@) + $(hide) (\ + echo '{'; \ + echo ' "Device_uses_jemalloc": $(if $(filter true,$(MALLOC_SVELTE)),false,true),'; \ + echo ' "Device_uses_dlmalloc": $(if $(filter true,$(MALLOC_SVELTE)),true,false),'; \ + echo ' "Platform_sdk_version": $(PLATFORM_SDK_VERSION),'; \ + echo ' "Unbundled_build": $(if $(TARGET_BUILD_APPS),true,false),'; \ + echo ' "Brillo": $(if $(BRILLO),true,false),'; \ + echo ''; \ + echo ' "DeviceName": "$(TARGET_DEVICE)",'; \ + echo ' "DeviceArch": "$(TARGET_ARCH)",'; \ + echo ' "DeviceArchVariant": "$(TARGET_ARCH_VARIANT)",'; \ + echo ' "DeviceCpuVariant": "$(TARGET_CPU_VARIANT)",'; \ + echo ' "DeviceAbi": ["$(TARGET_CPU_ABI)", "$(TARGET_CPU_ABI2)"],'; \ + echo ' "DeviceUsesClang": $(if $(USE_CLANG_PLATFORM_BUILD),$(USE_CLANG_PLATFORM_BUILD),false),'; \ + echo ''; \ + echo ' "DeviceSecondaryArch": "$(TARGET_2ND_ARCH)",'; \ + echo ' "DeviceSecondaryArchVariant": "$(TARGET_2ND_ARCH_VARIANT)",'; \ + echo ' "DeviceSecondaryCpuVariant": "$(TARGET_2ND_CPU_VARIANT)",'; \ + echo ' "DeviceSecondaryAbi": ["$(TARGET_2ND_CPU_ABI)", "$(TARGET_2ND_CPU_ABI2)"],'; \ + echo ''; \ + echo ' "HostArch": "$(HOST_ARCH)",'; \ + echo ' "HostSecondaryArch": "$(HOST_2ND_ARCH)",'; \ + echo ''; \ + echo ' "CrossHost": "$(HOST_CROSS_OS)",'; \ + echo ' "CrossHostArch": "$(HOST_CROSS_ARCH)",'; \ + echo ' "CrossHostSecondaryArch": "$(HOST_CROSS_2ND_ARCH)"'; \ + echo '}') > $(SOONG_VARIABLES_TMP); \ + if ! cmp -s $(SOONG_VARIABLES_TMP) $(SOONG_VARIABLES); then \ + mv $(SOONG_VARIABLES_TMP) $(SOONG_VARIABLES); \ + else \ + rm $(SOONG_VARIABLES_TMP); \ + fi + +# Tell soong that it is embedded in make +$(SOONG_IN_MAKE): + $(hide) mkdir -p $(dir $@) + $(hide) touch $@ + +# Build an Android.mk listing all soong outputs as prebuilts +$(SOONG_ANDROID_MK): $(SOONG_BOOTSTRAP) $(SOONG_VARIABLES) $(SOONG_IN_MAKE) FORCE + $(hide) $(SOONG) $(KATI) $(MAKEPARALLEL) $(NINJA_ARGS) + +$(KATI): $(SOONG_ANDROID_MK) +$(MAKEPARALLEL): $(SOONG_ANDROID_MK) diff --git a/core/static_java_library.mk b/core/static_java_library.mk index 02078e017..48cdd0df0 100644 --- a/core/static_java_library.mk +++ b/core/static_java_library.mk @@ -23,6 +23,14 @@ LOCAL_UNINSTALLABLE_MODULE := true LOCAL_IS_STATIC_JAVA_LIBRARY := true LOCAL_MODULE_CLASS := JAVA_LIBRARIES +################################# +include $(BUILD_SYSTEM)/configure_local_jack.mk +################################# + +intermediates.COMMON := $(call local-intermediates-dir,COMMON) + +my_res_package := + # Hack to build static Java library with Android resource # See bug 5714516 all_resources := @@ -30,6 +38,14 @@ need_compile_res := # A static Java library needs to explicily set LOCAL_RESOURCE_DIR. ifdef LOCAL_RESOURCE_DIR need_compile_res := true +endif +ifdef LOCAL_USE_AAPT2 +ifneq ($(LOCAL_STATIC_ANDROID_LIBRARIES),) +need_compile_res := true +endif +endif + +ifeq ($(need_compile_res),true) all_resources := $(strip \ $(foreach dir, $(LOCAL_RESOURCE_DIR), \ $(addprefix $(dir)/, \ @@ -52,12 +68,31 @@ endif proguard_options_file := -intermediates.COMMON := $(call local-intermediates-dir,COMMON) ifneq ($(LOCAL_PROGUARD_ENABLED),custom) proguard_options_file := $(intermediates.COMMON)/proguard_options endif + LOCAL_PROGUARD_FLAGS := $(addprefix -include ,$(proguard_options_file)) $(LOCAL_PROGUARD_FLAGS) +ifdef LOCAL_JACK_ENABLED +ifndef LOCAL_JACK_PROGUARD_FLAGS + LOCAL_JACK_PROGUARD_FLAGS := $(LOCAL_PROGUARD_FLAGS) +endif +LOCAL_JACK_PROGUARD_FLAGS := $(addprefix -include ,$(proguard_options_file)) $(LOCAL_JACK_PROGUARD_FLAGS) +endif # LOCAL_JACK_ENABLED + +R_file_stamp := $(intermediates.COMMON)/src/R.stamp +LOCAL_INTERMEDIATE_TARGETS += $(R_file_stamp) + +ifdef LOCAL_USE_AAPT2 +# For library we treat all the resource equal with no overlay. +my_res_resources := $(all_resources) +my_overlay_resources := +# For libraries put everything in the COMMON intermediate directory. +my_res_package := $(intermediates.COMMON)/package-res.apk + +LOCAL_INTERMEDIATE_TARGETS += $(my_res_package) +endif # LOCAL_USE_AAPT2 endif # LOCAL_RESOURCE_DIR all_res_assets := $(all_resources) @@ -65,8 +100,6 @@ all_res_assets := $(all_resources) include $(BUILD_SYSTEM)/java_library.mk ifeq (true,$(need_compile_res)) -R_file_stamp := $(LOCAL_INTERMEDIATE_SOURCE_DIR)/R.stamp - include $(BUILD_SYSTEM)/android_manifest.mk LOCAL_SDK_RES_VERSION:=$(strip $(LOCAL_SDK_RES_VERSION)) @@ -78,7 +111,7 @@ framework_res_package_export := framework_res_package_export_deps := # Please refer to package.mk ifneq ($(LOCAL_NO_STANDARD_LIBRARIES),true) -ifneq ($(filter-out current system_current,$(LOCAL_SDK_RES_VERSION))$(if $(TARGET_BUILD_APPS),$(filter current system_current,$(LOCAL_SDK_RES_VERSION))),) +ifneq ($(filter-out current system_current test_current,$(LOCAL_SDK_RES_VERSION))$(if $(TARGET_BUILD_APPS),$(filter current system_current test_current,$(LOCAL_SDK_RES_VERSION))),) framework_res_package_export := \ $(HISTORICAL_SDK_VERSIONS_ROOT)/$(LOCAL_SDK_RES_VERSION)/android.jar framework_res_package_export_deps := $(framework_res_package_export) @@ -90,34 +123,80 @@ framework_res_package_export_deps := \ endif endif -$(R_file_stamp): PRIVATE_MODULE := $(LOCAL_MODULE) # add --non-constant-id to prevent inlining constants. -$(R_file_stamp): PRIVATE_AAPT_FLAGS := $(LOCAL_AAPT_FLAGS) --non-constant-id -$(R_file_stamp): PRIVATE_SOURCE_INTERMEDIATES_DIR := $(LOCAL_INTERMEDIATE_SOURCE_DIR) -$(R_file_stamp): PRIVATE_ANDROID_MANIFEST := $(full_android_manifest) -$(R_file_stamp): PRIVATE_RESOURCE_PUBLICS_OUTPUT := $(intermediates.COMMON)/public_resources.xml -$(R_file_stamp): PRIVATE_RESOURCE_DIR := $(LOCAL_RESOURCE_DIR) -$(R_file_stamp): PRIVATE_AAPT_INCLUDES := $(framework_res_package_export) -ifneq (,$(filter-out current system_current, $(LOCAL_SDK_VERSION))) -$(R_file_stamp): PRIVATE_DEFAULT_APP_TARGET_SDK := $(LOCAL_SDK_VERSION) +# AAR needs text symbol file R.txt. +ifdef LOCAL_USE_AAPT2 +$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_AAPT_FLAGS := $(LOCAL_AAPT_FLAGS) --static-lib --no-static-lib-packages +$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_PRODUCT_AAPT_CONFIG := +$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_PRODUCT_AAPT_PREF_CONFIG := +$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_TARGET_AAPT_CHARACTERISTICS := else -$(R_file_stamp): PRIVATE_DEFAULT_APP_TARGET_SDK := $(DEFAULT_APP_TARGET_SDK) +$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_AAPT_FLAGS := $(LOCAL_AAPT_FLAGS) --non-constant-id --output-text-symbols $(LOCAL_INTERMEDIATE_SOURCE_DIR) endif -$(R_file_stamp): PRIVATE_ASSET_DIR := -$(R_file_stamp): PRIVATE_PROGUARD_OPTIONS_FILE := $(proguard_options_file) -$(R_file_stamp): PRIVATE_MANIFEST_PACKAGE_NAME := -$(R_file_stamp): PRIVATE_MANIFEST_INSTRUMENTATION_FOR := +$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_SOURCE_INTERMEDIATES_DIR := $(LOCAL_INTERMEDIATE_SOURCE_DIR) +$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_ANDROID_MANIFEST := $(full_android_manifest) +$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_RESOURCE_PUBLICS_OUTPUT := $(intermediates.COMMON)/public_resources.xml +$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_RESOURCE_DIR := $(LOCAL_RESOURCE_DIR) +$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_AAPT_INCLUDES := $(framework_res_package_export) + +ifneq (,$(filter-out current system_current test_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 + +$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_ASSET_DIR := +$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_PROGUARD_OPTIONS_FILE := $(proguard_options_file) +$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_MANIFEST_PACKAGE_NAME := +$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_MANIFEST_INSTRUMENTATION_FOR := + +ifdef LOCAL_USE_AAPT2 +# One more level with name res so we can zip up the flat resources that can be linked by apps. +my_compiled_res_base_dir := $(intermediates.COMMON)/flat-res/res +my_generated_res_dirs := $(rs_generated_res_dir) +my_generated_res_dirs_deps := $(RenderScript_file_stamp) +include $(BUILD_SYSTEM)/aapt2.mk +$(my_res_package) : $(framework_res_package_export_deps) +else $(R_file_stamp) : $(all_resources) $(full_android_manifest) $(AAPT) $(framework_res_package_export_deps) @echo "target R.java/Manifest.java: $(PRIVATE_MODULE) ($@)" $(create-resource-java-files) $(hide) find $(PRIVATE_SOURCE_INTERMEDIATES_DIR) -name R.java | xargs cat > $@ +endif # LOCAL_USE_AAPT2 $(LOCAL_BUILT_MODULE): $(R_file_stamp) -ifneq ($(full_classes_jar),) +ifdef LOCAL_JACK_ENABLED +$(noshrob_classes_jack): $(R_file_stamp) +$(full_classes_jack): $(R_file_stamp) +$(jack_check_timestamp): $(R_file_stamp) +endif # LOCAL_JACK_ENABLED $(full_classes_compiled_jar): $(R_file_stamp) -endif +# Rule to build AAR, archive including classes.jar, resource, etc. +built_aar := $(intermediates.COMMON)/javalib.aar +$(built_aar): PRIVATE_MODULE := $(LOCAL_MODULE) +$(built_aar): PRIVATE_ANDROID_MANIFEST := $(full_android_manifest) +$(built_aar): PRIVATE_CLASSES_JAR := $(full_classes_jar) +$(built_aar): PRIVATE_RESOURCE_DIR := $(LOCAL_RESOURCE_DIR) +$(built_aar): PRIVATE_R_TXT := $(LOCAL_INTERMEDIATE_SOURCE_DIR)/R.txt +$(built_aar): PRIVATE_CONSUMER_PROGUARD_FILE := $(LOCAL_CONSUMER_PROGUARD_FILE) +$(built_aar) : $(full_classes_jar) $(full_android_manifest) + @echo "target AAR: $(PRIVATE_MODULE) ($@)" + $(hide) rm -rf $(dir $@)aar && mkdir -p $(dir $@)aar/res + $(hide) cp $(PRIVATE_ANDROID_MANIFEST) $(dir $@)aar/AndroidManifest.xml + $(hide) cp $(PRIVATE_CLASSES_JAR) $(dir $@)aar/classes.jar + # Note: Use "cp -n" to honor the resource overlay rules, if multiple res dirs exist. + $(hide) $(foreach res,$(PRIVATE_RESOURCE_DIR),cp -Rfn $(res)/* $(dir $@)aar/res;) + $(hide) cp $(PRIVATE_R_TXT) $(dir $@)aar/R.txt + $(hide) if [ ! -z "$(PRIVATE_CONSUMER_PROGUARD_FILE)" ]; then \ + echo "Including '$(PRIVATE_CONSUMER_PROGUARD_FILE)'"; \ + cp $(PRIVATE_CONSUMER_PROGUARD_FILE) $(dir $@)aar/proguard.txt; fi + $(hide) jar -cMf $@ \ + -C $(dir $@)aar . + +# Register the aar file. +ALL_MODULES.$(LOCAL_MODULE).AAR := $(built_aar) endif # need_compile_res # Reset internal variables. diff --git a/core/static_library.mk b/core/static_library.mk index 854cbfcb9..61a63d065 100644 --- a/core/static_library.mk +++ b/core/static_library.mk @@ -6,6 +6,10 @@ ifndef my_module_multilib my_module_multilib := both endif +ifeq ($(LOCAL_SDCLANG), true) +include $(SDCLANG_FLAG_DEFS) +endif + LOCAL_2ND_ARCH_VAR_PREFIX := include $(BUILD_SYSTEM)/module_arch_supported.mk @@ -23,9 +27,6 @@ ifeq ($(my_module_arch_supported),true) OVERRIDE_BUILT_MODULE_PATH := LOCAL_BUILT_MODULE := LOCAL_INSTALLED_MODULE := -LOCAL_MODULE_STEM := -LOCAL_BUILT_MODULE_STEM := -LOCAL_INSTALLED_MODULE_STEM := LOCAL_INTERMEDIATE_TARGETS := include $(BUILD_SYSTEM)/static_library_internal.mk @@ -36,6 +37,12 @@ LOCAL_2ND_ARCH_VAR_PREFIX := endif # TARGET_2ND_ARCH +ifeq ($(LOCAL_SDCLANG), true) +ifeq ($(LOCAL_SDCLANG_LTO), true) +include $(SDCLANG_LTO_DEFS) +endif +endif + my_module_arch_supported := ########################################################### diff --git a/core/target_test_internal.mk b/core/target_test_internal.mk index 95d415989..4715fe8d5 100644 --- a/core/target_test_internal.mk +++ b/core/target_test_internal.mk @@ -5,18 +5,11 @@ LOCAL_CFLAGS += -DGTEST_OS_LINUX_ANDROID -DGTEST_HAS_STD_STRING LOCAL_C_INCLUDES += external/gtest/include -ifneq ($(filter libc++,$(LOCAL_SHARED_LIBRARIES)),) -LOCAL_STATIC_LIBRARIES += libgtest_libc++ libgtest_main_libc++ -else -LOCAL_STATIC_LIBRARIES += libgtest libgtest_main ifndef LOCAL_SDK_VERSION -LOCAL_C_INCLUDES += bionic \ - bionic/libstdc++/include \ - external/stlport/stlport -LOCAL_SHARED_LIBRARIES += libstlport -LOCAL_STATIC_LIBRARIES += libstdc++ -endif +LOCAL_STATIC_LIBRARIES += libgtest_main libgtest +else +LOCAL_STATIC_LIBRARIES += libgtest_main_ndk libgtest_ndk endif ifdef LOCAL_MODULE_PATH diff --git a/core/tasks/apicheck.mk b/core/tasks/apicheck.mk index 683a075ff..3975d2071 100644 --- a/core/tasks/apicheck.mk +++ b/core/tasks/apicheck.mk @@ -129,4 +129,37 @@ update-system-api: $(INTERNAL_PLATFORM_SYSTEM_API_FILE) | $(ACP) @echo Copying system-removed.txt $(hide) $(ACP) $(INTERNAL_PLATFORM_SYSTEM_REMOVED_API_FILE) frameworks/base/api/system-removed.txt +#####################Check Test API##################### +.PHONY: check-test-api +checkapi : check-test-api + +# Check that the Test API we're building hasn't changed from the not-yet-released +# SDK version. Note that we don't check that we haven't broken the previous +# SDK's API because the test API is meant only for CTS which is always +# associated with the current release. +$(eval $(call check-api, \ + checktestapi-current, \ + frameworks/base/api/test-current.txt, \ + $(INTERNAL_PLATFORM_TEST_API_FILE), \ + frameworks/base/api/test-removed.txt, \ + $(INTERNAL_PLATFORM_TEST_REMOVED_API_FILE), \ + -error 2 -error 3 -error 4 -error 5 -error 6 \ + -error 7 -error 8 -error 9 -error 10 -error 11 -error 12 -error 13 -error 14 -error 15 \ + -error 16 -error 17 -error 18 -error 19 -error 20 -error 21 -error 23 -error 24 \ + -error 25 -error 26 -error 27, \ + cat $(BUILD_SYSTEM)/apicheck_msg_current.txt, \ + check-test-api, \ + $(call doc-timestamp-for,test-api-stubs) \ + )) + +.PHONY: update-test-api +update-api : update-test-api + +update-test-api: $(INTERNAL_PLATFORM_TEST_API_FILE) | $(ACP) + @echo Copying test-current.txt + $(hide) $(ACP) $(INTERNAL_PLATFORM_TEST_API_FILE) frameworks/base/api/test-current.txt + @echo Copying test-removed.txt + $(hide) $(ACP) $(INTERNAL_PLATFORM_TEST_REMOVED_API_FILE) frameworks/base/api/test-removed.txt + + endif diff --git a/core/tasks/boot_jars_package_check.mk b/core/tasks/boot_jars_package_check.mk index 188c26740..28f2b826a 100644 --- a/core/tasks/boot_jars_package_check.mk +++ b/core/tasks/boot_jars_package_check.mk @@ -16,6 +16,7 @@ # Rules to check if classes in the boot jars are from the whitelisted packages. # +ifneq ($(SKIP_BOOT_JARS_CHECK),) ifneq ($(SKIP_BOOT_JARS_CHECK),true) ifneq ($(TARGET_BUILD_PDK),true) ifdef PRODUCT_BOOT_JARS @@ -44,3 +45,4 @@ droidcore : check-boot-jars endif # PRODUCT_BOOT_JARS endif # TARGET_BUILD_PDK not true endif # SKIP_BOOT_JARS_CHECK not true +endif # SKIP_BOOT_JARS_CHECK not defined diff --git a/core/tasks/build_custom_images.mk b/core/tasks/build_custom_images.mk new file mode 100644 index 000000000..8ebf89b0e --- /dev/null +++ b/core/tasks/build_custom_images.mk @@ -0,0 +1,64 @@ +# +# Copyright (C) 2015 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. +# + +# Build additional images requested by the product makefile. +# This script gives the ability to build multiple additional images and you can +# configure what modules/files to include in each image. +# 1. Define PRODUCT_CUSTOM_IMAGE_MAKEFILES in your product makefile. +# PRODUCT_CUSTOM_IMAGE_MAKEFILES is a list of makefiles. +# Each makefile configures an image. +# For image configuration makefile foo/bar/xyz.mk, the built image file name +# will be xyz.img. So make sure they won't conflict. +# 2. In each image's configuration makefile, you can define variables: +# - CUSTOM_IMAGE_MOUNT_POINT, the mount point, such as "oem", "odm" etc. +# - CUSTOM_IMAGE_PARTITION_SIZE +# - CUSTOM_IMAGE_FILE_SYSTEM_TYPE +# - CUSTOM_IMAGE_DICT_FILE, a text file defines a dictionary accepted by +# BuildImage() in tools/releasetools/build_image.py. +# - CUSTOM_IMAGE_MODULES, a list of module names you want to include in +# the image; Not only the module itself will be installed to proper path in +# the image, you can also piggyback additional files/directories with the +# module's LOCAL_PICKUP_FILES. +# - CUSTOM_IMAGE_COPY_FILES, a list of ":" to be copied to the +# image. is relativ to the root of the image. +# - CUSTOM_IMAGE_SELINUX, set to "true" if the image supports selinux. +# - CUSTOM_IMAGE_SUPPORT_VERITY, set to "true" if the product supports verity. +# - CUSTOM_IMAGE_VERITY_BLOCK_DEVICE +# +# To build all those images, run "make custom_images". + +ifneq ($(filter $(MAKECMDGOALS),custom_images),) + +.PHONY: custom_images + +custom_image_parameter_variables := \ + CUSTOM_IMAGE_MOUNT_POINT \ + CUSTOM_IMAGE_PARTITION_SIZE \ + CUSTOM_IMAGE_FILE_SYSTEM_TYPE \ + CUSTOM_IMAGE_DICT_FILE \ + CUSTOM_IMAGE_MODULES \ + CUSTOM_IMAGE_COPY_FILES \ + CUSTOM_IMAGE_SELINUX \ + CUSTOM_IMAGE_SUPPORT_VERITY \ + CUSTOM_IMAGE_VERITY_BLOCK_DEVICE \ + +# We don't expect product makefile to inherit/override PRODUCT_CUSTOM_IMAGE_MAKEFILES, +# so we don't put it in the _product_var_list. +$(foreach mk, $(PRODUCT_CUSTOM_IMAGE_MAKEFILES),\ + $(eval my_custom_imag_makefile := $(mk))\ + $(eval include $(BUILD_SYSTEM)/tasks/tools/build_custom_image.mk)) + +endif diff --git a/core/tasks/check_boot_jars/check_boot_jars.py b/core/tasks/check_boot_jars/check_boot_jars.py index 89d9ee827..5a0ec4016 100755 --- a/core/tasks/check_boot_jars/check_boot_jars.py +++ b/core/tasks/check_boot_jars/check_boot_jars.py @@ -64,10 +64,10 @@ def CheckJar(jar): def main(argv): if len(argv) < 2: print __doc__ - sys.exit(1) + return 1 if not LoadWhitelist(argv[0]): - sys.exit(1) + return 1 passed = True for jar in argv[1:]: @@ -80,4 +80,4 @@ def main(argv): if __name__ == '__main__': - main(sys.argv[1:]) + sys.exit(main(sys.argv[1:])) diff --git a/core/tasks/check_boot_jars/package_whitelist.txt b/core/tasks/check_boot_jars/package_whitelist.txt index 4d6261572..3cb6e2800 100644 --- a/core/tasks/check_boot_jars/package_whitelist.txt +++ b/core/tasks/check_boot_jars/package_whitelist.txt @@ -2,7 +2,7 @@ # Each line is interpreted as a regular expression. ################################################### -# core-libart.jar +# core-libart.jar & core-oj.jar java\.awt\.font java\.beans java\.io @@ -13,6 +13,9 @@ java\.lang\.reflect java\.math java\.net java\.nio +java\.nio\.file +java\.nio\.file\.spi +java\.nio\.file\.attribute java\.nio\.channels java\.nio\.channels\.spi java\.nio\.charset @@ -24,14 +27,18 @@ java\.security\.interfaces java\.security\.spec java\.sql java\.text +java\.text\.spi java\.util java\.util\.concurrent java\.util\.concurrent\.atomic java\.util\.concurrent\.locks +java\.util\.function java\.util\.jar java\.util\.logging java\.util\.prefs java\.util\.regex +java\.util\.spi +java\.util\.stream java\.util\.zip javax\.crypto javax\.crypto\.interfaces @@ -54,10 +61,18 @@ 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 +# OpenJdk internal implementation. +sun\.misc +sun\.util.* +sun\.text.* +sun\.security.* +sun\.reflect.* +sun\.nio.* +sun\.net.* +com\.sun\..* # TODO: Move these internal org.apache.harmony classes to libcore.* org\.apache\.harmony\.crypto\.internal diff --git a/core/tasks/cts.mk b/core/tasks/cts.mk index 2ce5dbc1e..fdd959176 100644 --- a/core/tasks/cts.mk +++ b/core/tasks/cts.mk @@ -1,4 +1,4 @@ -# Copyright (C) 2008 The Android Open Source Project +# Copyright (C) 2015 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. @@ -12,368 +12,16 @@ # See the License for the specific language governing permissions and # limitations under the License. -cts_dir := $(HOST_OUT)/cts -cts_tools_src_dir := cts/tools +test_suite_name := cts +test_suite_tradefed := cts-tradefed +test_suite_dynamic_config := cts/tools/cts-tradefed/DynamicConfig.xml +test_suite_readme := cts/tools/cts-tradefed/README -cts_name := android-cts - -JUNIT_HOST_JAR := $(HOST_OUT_JAVA_LIBRARIES)/junit.jar -HOSTTESTLIB_JAR := $(HOST_OUT_JAVA_LIBRARIES)/hosttestlib.jar -TF_JAR := $(HOST_OUT_JAVA_LIBRARIES)/tradefed-prebuilt.jar -CTS_TF_JAR := $(HOST_OUT_JAVA_LIBRARIES)/cts-tradefed.jar -CTS_TF_EXEC_PATH := $(HOST_OUT_EXECUTABLES)/cts-tradefed -CTS_TF_README_PATH := $(cts_tools_src_dir)/tradefed-host/README - -VMTESTSTF_INTERMEDIATES :=$(call intermediates-dir-for,JAVA_LIBRARIES,vm-tests-tf,HOST) -VMTESTSTF_JAR := $(VMTESTSTF_INTERMEDIATES)/android.core.vm-tests-tf.jar - -# The list of test packages that core-tests (libcore/Android.mk) -# is split into. -CTS_CORE_CASE_LIST := \ - android.core.tests.libcore.package.dalvik \ - android.core.tests.libcore.package.com \ - android.core.tests.libcore.package.conscrypt \ - android.core.tests.libcore.package.sun \ - android.core.tests.libcore.package.tests \ - android.core.tests.libcore.package.org \ - android.core.tests.libcore.package.libcore \ - android.core.tests.libcore.package.jsr166 \ - android.core.tests.libcore.package.harmony_annotation \ - android.core.tests.libcore.package.harmony_java_io \ - android.core.tests.libcore.package.harmony_java_lang \ - android.core.tests.libcore.package.harmony_java_math \ - android.core.tests.libcore.package.harmony_java_net \ - android.core.tests.libcore.package.harmony_java_nio \ - android.core.tests.libcore.package.harmony_java_text \ - android.core.tests.libcore.package.harmony_java_util \ - android.core.tests.libcore.package.harmony_javax_security \ - android.core.tests.libcore.package.okhttp \ - android.core.tests.runner - -# The list of test packages that apache-harmony-tests (external/apache-harmony/Android.mk) -# is split into. -CTS_CORE_CASE_LIST += \ - android.core.tests.libcore.package.harmony_beans \ - android.core.tests.libcore.package.harmony_logging \ - android.core.tests.libcore.package.harmony_prefs \ - android.core.tests.libcore.package.harmony_sql - - -CTS_TEST_JAR_LIST := \ - cts-junit \ - CtsJdwp - -# Depend on the full package paths rather than the phony targets to avoid -# rebuilding the packages every time. -CTS_CORE_CASES := $(foreach pkg,$(CTS_CORE_CASE_LIST),$(call intermediates-dir-for,APPS,$(pkg))/package.apk) -CTS_TEST_JAR_FILES := $(foreach c,$(CTS_TEST_JAR_LIST),$(call intermediates-dir-for,JAVA_LIBRARIES,$(c))/javalib.jar) - --include cts/CtsTestCaseList.mk -CTS_CASE_LIST := $(CTS_CORE_CASE_LIST) $(CTS_TEST_CASE_LIST) - -# A module may have mutliple installed files (e.g. split apks) -CTS_CASE_LIST_APKS := -CTS_CASE_LIST_APKS_DIR := $(cts_dir)/$(cts_name)/repository/testcases/ -$(foreach m, $(CTS_CASE_LIST),\ - $(foreach fp, $(ALL_MODULES.$(m).BUILT_INSTALLED),\ - $(eval pair := $(subst :,$(space),$(fp)))\ - $(eval built := $(word 1,$(pair)))\ - $(eval installed := $(CTS_CASE_LIST_APKS_DIR)/$(notdir $(word 2,$(pair))))\ - $(eval $(call copy-one-file, $(built), $(installed)))\ - $(eval CTS_CASE_LIST_APKS += $(installed)))) - -DEFAULT_TEST_PLAN := $(cts_dir)/$(cts_name)/resource/plans -$(cts_dir)/all_cts_files_stamp: $(CTS_CORE_CASES) $(CTS_TEST_CASES) $(CTS_CASE_LIST_APKS) $(JUNIT_HOST_JAR) $(HOSTTESTLIB_JAR) $(CTS_HOST_LIBRARY_JARS) $(TF_JAR) $(VMTESTSTF_JAR) $(CTS_TF_JAR) $(CTS_TF_EXEC_PATH) $(CTS_TF_README_PATH) $(ACP) $(CTS_TEST_JAR_FILES) -# Make necessary directory for CTS - $(hide) mkdir -p $(TMP_DIR) - $(hide) mkdir -p $(PRIVATE_DIR)/docs - $(hide) mkdir -p $(PRIVATE_DIR)/tools - $(hide) mkdir -p $(PRIVATE_DIR)/repository/testcases - $(hide) mkdir -p $(PRIVATE_DIR)/repository/plans -# Copy executable and JARs to CTS directory - $(hide) $(ACP) -fp $(VMTESTSTF_JAR) $(PRIVATE_DIR)/repository/testcases - $(hide) $(ACP) -fp $(HOSTTESTLIB_JAR) $(CTS_HOST_LIBRARY_JARS) $(TF_JAR) $(CTS_TF_JAR) $(CTS_TF_EXEC_PATH) $(CTS_TF_README_PATH) $(PRIVATE_DIR)/tools -# Change mode of the executables - $(foreach jar,$(CTS_TEST_JAR_LIST),$(call copy-testcase-jar,$(jar))) - $(foreach testcase,$(CTS_TEST_CASES),$(call copy-testcase,$(testcase))) - $(hide) touch $@ - -# Generate the test descriptions for the core-tests -# Parameters: -# $1 : The output file where the description should be written (without the '.xml' extension) -# $2 : The AndroidManifest.xml corresponding to the test package -# $3 : The jar file name on PRIVATE_CLASSPATH containing junit tests to search for -# $4 : The package prefix of classes to include, possible empty -# $5 : The architecture of the current build -# $6 : The directory containing vogar expectations files -# $7 : The Android.mk corresponding to the test package (required for host-side tests only) -define generate-core-test-description -@echo "Generate core-test description ("$(notdir $(1))")" -$(hide) java -Xmx256M \ - -Xbootclasspath/a:$(PRIVATE_CLASSPATH):$(JUNIT_HOST_JAR) \ - -classpath $(HOST_OUT_JAVA_LIBRARIES)/descGen.jar:$(HOST_JDK_TOOLS_JAR) \ - $(PRIVATE_PARAMS) CollectAllTests $(1) $(2) $(3) "$(4)" $(5) $(6) $(7) -endef - -CORE_INTERMEDIATES :=$(call intermediates-dir-for,JAVA_LIBRARIES,core-libart,,COMMON) -CONSCRYPT_INTERMEDIATES :=$(call intermediates-dir-for,JAVA_LIBRARIES,conscrypt,,COMMON) -BOUNCYCASTLE_INTERMEDIATES :=$(call intermediates-dir-for,JAVA_LIBRARIES,bouncycastle,,COMMON) -APACHEXML_INTERMEDIATES :=$(call intermediates-dir-for,JAVA_LIBRARIES,apache-xml,,COMMON) -OKHTTP_INTERMEDIATES :=$(call intermediates-dir-for,JAVA_LIBRARIES,okhttp-nojarjar,,COMMON) -OKHTTPTESTS_INTERMEDIATES :=$(call intermediates-dir-for,JAVA_LIBRARIES,okhttp-tests-nojarjar,,COMMON) -OKHTTP_REPACKAGED_INTERMEDIATES :=$(call intermediates-dir-for,JAVA_LIBRARIES,okhttp,,COMMON) -APACHEHARMONYTESTS_INTERMEDIATES :=$(call intermediates-dir-for,JAVA_LIBRARIES,apache-harmony-tests,,COMMON) -SQLITEJDBC_INTERMEDIATES :=$(call intermediates-dir-for,JAVA_LIBRARIES,sqlite-jdbc,,COMMON) -JUNIT_INTERMEDIATES :=$(call intermediates-dir-for,JAVA_LIBRARIES,core-junit,,COMMON) -CORETESTS_INTERMEDIATES :=$(call intermediates-dir-for,JAVA_LIBRARIES,core-tests,,COMMON) -JSR166TESTS_INTERMEDIATES :=$(call intermediates-dir-for,JAVA_LIBRARIES,jsr166-tests,,COMMON) -CONSCRYPTTESTS_INTERMEDIATES :=$(call intermediates-dir-for,JAVA_LIBRARIES,conscrypt-tests,,COMMON) - -GEN_CLASSPATH := $(CORE_INTERMEDIATES)/classes.jar:$(CONSCRYPT_INTERMEDIATES)/classes.jar:$(BOUNCYCASTLE_INTERMEDIATES)/classes.jar:$(APACHEXML_INTERMEDIATES)/classes.jar:$(APACHEHARMONYTESTS_INTERMEDIATES)/classes.jar:$(OKHTTP_INTERMEDIATES)/classes.jar:$(OKHTTPTESTS_INTERMEDIATES)/classes.jar:$(OKHTTP_REPACKAGED_INTERMEDIATES)/classes.jar:$(JUNIT_INTERMEDIATES)/classes.jar:$(SQLITEJDBC_INTERMEDIATES)/javalib.jar:$(CORETESTS_INTERMEDIATES)/javalib.jar:$(JSR166TESTS_INTERMEDIATES)/javalib.jar:$(CONSCRYPTTESTS_INTERMEDIATES)/javalib.jar - -CTS_CORE_XMLS := \ - $(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.dalvik.xml \ - $(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.com.xml \ - $(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.conscrypt.xml \ - $(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.sun.xml \ - $(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.tests.xml \ - $(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.org.xml \ - $(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.libcore.xml \ - $(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.jsr166.xml \ - $(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_annotation.xml \ - $(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_java_io.xml \ - $(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_java_lang.xml \ - $(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_java_math.xml \ - $(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_java_net.xml \ - $(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_java_nio.xml \ - $(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_java_text.xml \ - $(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_java_util.xml \ - $(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_javax_security.xml \ - $(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_beans.xml \ - $(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_logging.xml \ - $(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_prefs.xml \ - $(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_sql.xml \ - $(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.okhttp.xml \ - -$(CTS_CORE_XMLS): PRIVATE_CLASSPATH:=$(GEN_CLASSPATH) -# Why does this depend on javalib.jar instead of classes.jar? Because -# even though the tool will operate on the classes.jar files, the -# build system requires that dependencies use javalib.jar. If -# javalib.jar is up-to-date, then classes.jar is as well. Depending -# on classes.jar will build the files incorrectly. -CTS_CORE_XMLS_DEPS := $(CTS_CORE_CASES) $(HOST_OUT_JAVA_LIBRARIES)/descGen.jar $(JUNIT_HOST_JAR) $(CORE_INTERMEDIATES)/javalib.jar $(BOUNCYCASTLE_INTERMEDIATES)/javalib.jar $(APACHEXML_INTERMEDIATES)/javalib.jar $(APACHEHARMONYTESTS_INTERMEDIATES)/javalib.jar $(OKHTTP_INTERMEDIATES)/javalib.jar $(OKHTTPTESTS_INTERMEDIATES)/javalib.jar $(OKHTTP_REPACKAGED_INTERMEDIATES)/javalib.jar $(SQLITEJDBC_INTERMEDIATES)/javalib.jar $(JUNIT_INTERMEDIATES)/javalib.jar $(CORETESTS_INTERMEDIATES)/javalib.jar $(JSR166TESTS_INTERMEDIATES)/javalib.jar $(CONSCRYPTTESTS_INTERMEDIATES)/javalib.jar build/core/tasks/cts.mk | $(ACP) - -$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.dalvik.xml: $(CTS_CORE_XMLS_DEPS) - $(hide) mkdir -p $(CTS_TESTCASES_OUT) - $(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.dalvik,\ - cts/tests/core/libcore/dalvik/AndroidManifest.xml,\ - $(CORETESTS_INTERMEDIATES)/javalib.jar,dalvik,\ - $(TARGET_ARCH),libcore/expectations) - -$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.com.xml: $(CTS_CORE_XMLS_DEPS) - $(hide) mkdir -p $(CTS_TESTCASES_OUT) - $(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.com,\ - cts/tests/core/libcore/com/AndroidManifest.xml,\ - $(CORETESTS_INTERMEDIATES)/javalib.jar,com,\ - $(TARGET_ARCH),libcore/expectations) - -$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.conscrypt.xml: $(CTS_CORE_XMLS_DEPS) - $(hide) mkdir -p $(CTS_TESTCASES_OUT) - $(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.conscrypt,\ - cts/tests/core/libcore/conscrypt/AndroidManifest.xml,\ - $(CONSCRYPTTESTS_INTERMEDIATES)/javalib.jar,,\ - $(TARGET_ARCH),libcore/expectations) - -$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.sun.xml: $(CTS_CORE_XMLS_DEPS) - $(hide) mkdir -p $(CTS_TESTCASES_OUT) - $(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.sun,\ - cts/tests/core/libcore/sun/AndroidManifest.xml,\ - $(CORETESTS_INTERMEDIATES)/javalib.jar,sun,\ - $(TARGET_ARCH),libcore/expectations) - -$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.tests.xml: $(CTS_CORE_XMLS_DEPS) - $(hide) mkdir -p $(CTS_TESTCASES_OUT) - $(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.tests,\ - cts/tests/core/libcore/tests/AndroidManifest.xml,\ - $(CORETESTS_INTERMEDIATES)/javalib.jar,tests,\ - $(TARGET_ARCH),libcore/expectations) - -$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.org.xml: $(CTS_CORE_XMLS_DEPS) - $(hide) mkdir -p $(CTS_TESTCASES_OUT) - $(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.org,\ - cts/tests/core/libcore/org/AndroidManifest.xml,\ - $(CORETESTS_INTERMEDIATES)/javalib.jar,org,\ - $(TARGET_ARCH),libcore/expectations) - -$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.libcore.xml: $(CTS_CORE_XMLS_DEPS) - $(hide) mkdir -p $(CTS_TESTCASES_OUT) - $(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.libcore,\ - cts/tests/core/libcore/libcore/AndroidManifest.xml,\ - $(CORETESTS_INTERMEDIATES)/javalib.jar,libcore,\ - $(TARGET_ARCH),libcore/expectations) - -$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.jsr166.xml: $(CTS_CORE_XMLS_DEPS) - $(hide) mkdir -p $(CTS_TESTCASES_OUT) - $(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.jsr166,\ - cts/tests/core/libcore/jsr166/AndroidManifest.xml,\ - $(JSR166TESTS_INTERMEDIATES)/javalib.jar,jsr166,\ - $(TARGET_ARCH),libcore/expectations) - -$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_annotation.xml: $(CTS_CORE_XMLS_DEPS) - $(hide) mkdir -p $(CTS_TESTCASES_OUT) - $(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_annotation,\ - cts/tests/core/libcore/harmony_annotation/AndroidManifest.xml,\ - $(CORETESTS_INTERMEDIATES)/javalib.jar,org.apache.harmony.annotation.tests,\ - $(TARGET_ARCH),libcore/expectations) - -$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_java_io.xml: $(CTS_CORE_XMLS_DEPS) - $(hide) mkdir -p $(CTS_TESTCASES_OUT) - $(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_java_io,\ - cts/tests/core/libcore/harmony_java_io/AndroidManifest.xml,\ - $(CORETESTS_INTERMEDIATES)/javalib.jar,org.apache.harmony.tests.java.io,\ - $(TARGET_ARCH),libcore/expectations) - -$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_java_lang.xml: $(CTS_CORE_XMLS_DEPS) - $(hide) mkdir -p $(CTS_TESTCASES_OUT) - $(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_java_lang,\ - cts/tests/core/libcore/harmony_java_lang/AndroidManifest.xml,\ - $(CORETESTS_INTERMEDIATES)/javalib.jar,org.apache.harmony.tests.java.lang,\ - $(TARGET_ARCH),libcore/expectations) - -$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_java_math.xml: $(CTS_CORE_XMLS_DEPS) - $(hide) mkdir -p $(CTS_TESTCASES_OUT) - $(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_java_math,\ - cts/tests/core/libcore/harmony_java_math/AndroidManifest.xml,\ - $(CORETESTS_INTERMEDIATES)/javalib.jar,org.apache.harmony.tests.java.math,\ - $(TARGET_ARCH),libcore/expectations) - -$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_java_net.xml: $(CTS_CORE_XMLS_DEPS) - $(hide) mkdir -p $(CTS_TESTCASES_OUT) - $(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_java_net,\ - cts/tests/core/libcore/harmony_java_net/AndroidManifest.xml,\ - $(CORETESTS_INTERMEDIATES)/javalib.jar,org.apache.harmony.tests.java.net,\ - $(TARGET_ARCH),libcore/expectations) - -$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_java_nio.xml: $(CTS_CORE_XMLS_DEPS) - $(hide) mkdir -p $(CTS_TESTCASES_OUT) - $(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_java_nio,\ - cts/tests/core/libcore/harmony_java_nio/AndroidManifest.xml,\ - $(CORETESTS_INTERMEDIATES)/javalib.jar,org.apache.harmony.tests.java.nio,\ - $(TARGET_ARCH),libcore/expectations) - -$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_java_text.xml: $(CTS_CORE_XMLS_DEPS) - $(hide) mkdir -p $(CTS_TESTCASES_OUT) - $(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_java_text,\ - cts/tests/core/libcore/harmony_java_text/AndroidManifest.xml,\ - $(CORETESTS_INTERMEDIATES)/javalib.jar,org.apache.harmony.tests.java.text,\ - $(TARGET_ARCH),libcore/expectations) - -$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_java_util.xml: $(CTS_CORE_XMLS_DEPS) - $(hide) mkdir -p $(CTS_TESTCASES_OUT) - $(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_java_util,\ - cts/tests/core/libcore/harmony_java_util/AndroidManifest.xml,\ - $(CORETESTS_INTERMEDIATES)/javalib.jar,org.apache.harmony.tests.java.util,\ - $(TARGET_ARCH),libcore/expectations) - -$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_javax_security.xml: $(CTS_CORE_XMLS_DEPS) - $(hide) mkdir -p $(CTS_TESTCASES_OUT) - $(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_javax_security,\ - cts/tests/core/libcore/harmony_javax_security/AndroidManifest.xml,\ - $(CORETESTS_INTERMEDIATES)/javalib.jar,org.apache.harmony.tests.javax.security,\ - $(TARGET_ARCH),libcore/expectations) - -$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_beans.xml: $(CTS_CORE_XMLS_DEPS) - $(hide) mkdir -p $(CTS_TESTCASES_OUT) - $(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_beans,\ - cts/tests/core/libcore/harmony_beans/AndroidManifest.xml,\ - $(APACHEHARMONYTESTS_INTERMEDIATES)/javalib.jar,com.android.org.apache.harmony.beans,\ - $(TARGET_ARCH),libcore/expectations external/apache-harmony/Android.mk) - -$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_logging.xml: $(CTS_CORE_XMLS_DEPS) - $(hide) mkdir -p $(CTS_TESTCASES_OUT) - $(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_logging,\ - cts/tests/core/libcore/harmony_logging/AndroidManifest.xml,\ - $(APACHEHARMONYTESTS_INTERMEDIATES)/javalib.jar,com.android.org.apache.harmony.logging,\ - $(TARGET_ARCH),libcore/expectations external/apache-harmony/Android.mk) - -$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_prefs.xml: $(CTS_CORE_XMLS_DEPS) - $(hide) mkdir -p $(CTS_TESTCASES_OUT) - $(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_prefs,\ - cts/tests/core/libcore/harmony_prefs/AndroidManifest.xml,\ - $(APACHEHARMONYTESTS_INTERMEDIATES)/javalib.jar,com.android.org.apache.harmony.prefs,\ - $(TARGET_ARCH),libcore/expectations external/apache-harmony/Android.mk) - -$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_sql.xml: $(CTS_CORE_XMLS_DEPS) - $(hide) mkdir -p $(CTS_TESTCASES_OUT) - $(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_sql,\ - cts/tests/core/libcore/harmony_sql/AndroidManifest.xml,\ - $(APACHEHARMONYTESTS_INTERMEDIATES)/javalib.jar,com.android.org.apache.harmony.sql,\ - $(TARGET_ARCH),libcore/expectations external/apache-harmony/Android.mk) - -$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.okhttp.xml: $(CTS_CORE_XMLS_DEPS) - $(hide) mkdir -p $(CTS_TESTCASES_OUT) - $(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.okhttp,\ - cts/tests/core/libcore/okhttp/AndroidManifest.xml,\ - $(OKHTTPTESTS_INTERMEDIATES)/javalib.jar,,\ - $(TARGET_ARCH),libcore/expectations) - -# ----- Generate the test descriptions for the vm-tests-tf ----- -# -CORE_VM_TEST_TF_DESC := $(CTS_TESTCASES_OUT)/android.core.vm-tests-tf.xml - -# core tests only needed to get hold of junit-framework-classes -CORE_INTERMEDIATES :=$(call intermediates-dir-for,JAVA_LIBRARIES,core-libart,,COMMON) -JUNIT_INTERMEDIATES :=$(call intermediates-dir-for,JAVA_LIBRARIES,core-junit,,COMMON) - -GEN_CLASSPATH := $(CORE_INTERMEDIATES)/classes.jar:$(JUNIT_INTERMEDIATES)/classes.jar:$(VMTESTSTF_JAR):$(TF_JAR) - -$(CORE_VM_TEST_TF_DESC): PRIVATE_CLASSPATH:=$(GEN_CLASSPATH) -# Please see big comment above on why this line depends on javalib.jar instead of classes.jar -$(CORE_VM_TEST_TF_DESC): $(HOST_OUT_JAVA_LIBRARIES)/descGen.jar $(JUNIT_HOST_JAR) $(CORE_INTERMEDIATES)/javalib.jar $(JUNIT_INTERMEDIATES)/javalib.jar $(VMTESTSTF_JAR) | $(ACP) - $(hide) mkdir -p $(CTS_TESTCASES_OUT) - $(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.vm-tests-tf,\ - cts/tests/vm-tests-tf/AndroidManifest.xml,\ - $(VMTESTSTF_JAR),"",\ - $(TARGET_ARCH),\ - libcore/expectations,\ - cts/tools/vm-tests-tf/Android.mk) - -# Generate the default test plan for User. -# Usage: buildCts.py - -$(DEFAULT_TEST_PLAN): $(cts_dir)/all_cts_files_stamp $(cts_tools_src_dir)/utils/buildCts.py $(HOST_OUT_JAVA_LIBRARIES)/descGen.jar $(CTS_CORE_XMLS) $(CTS_TEST_XMLS) $(CORE_VM_TEST_TF_DESC) | $(ACP) - $(hide) $(ACP) -fp $(CTS_CORE_XMLS) $(CTS_TEST_XMLS) $(CORE_VM_TEST_TF_DESC) $(PRIVATE_DIR)/repository/testcases - $(hide) $(cts_tools_src_dir)/utils/buildCts.py cts/tests/tests/ $(PRIVATE_DIR) $(TMP_DIR) \ - $(TOP) $(HOST_OUT_JAVA_LIBRARIES)/descGen.jar - $(hide) mkdir -p $(dir $@) && touch $@ - -# Package CTS and clean up. -# -# TODO: -# Pack cts.bat into the same zip file as well. See http://buganizer/issue?id=1656821 for more details -INTERNAL_CTS_TARGET := $(cts_dir)/$(cts_name).zip -$(INTERNAL_CTS_TARGET): PRIVATE_NAME := $(cts_name) -$(INTERNAL_CTS_TARGET): PRIVATE_CTS_DIR := $(cts_dir) -$(INTERNAL_CTS_TARGET): PRIVATE_DIR := $(cts_dir)/$(cts_name) -$(INTERNAL_CTS_TARGET): TMP_DIR := $(cts_dir)/temp -$(INTERNAL_CTS_TARGET): $(cts_dir)/all_cts_files_stamp $(DEFAULT_TEST_PLAN) - $(hide) echo "Package CTS: $@" - $(hide) cd $(dir $@) && zip -rq $(notdir $@) $(PRIVATE_NAME) +include $(BUILD_SYSTEM)/tasks/tools/compatibility.mk .PHONY: cts -cts: $(INTERNAL_CTS_TARGET) adb -$(call dist-for-goals,cts,$(INTERNAL_CTS_TARGET)) - - -define copy-testcase - -$(hide) $(ACP) -fp $(1) $(PRIVATE_DIR)/repository/testcases/$(notdir $1) - -endef - -define copy-testcase-jar - -$(hide) $(ACP) -fp $(call intermediates-dir-for,JAVA_LIBRARIES,$(1))/javalib.jar \ - $(PRIVATE_DIR)/repository/testcases/$(1).jar +cts: $(compatibility_zip) +$(call dist-for-goals, cts, $(compatibility_zip)) -endef +.PHONY: cts_v2 +cts_v2: cts diff --git a/core/tasks/deps_licenses.mk b/core/tasks/deps_licenses.mk new file mode 100644 index 000000000..bb20fa042 --- /dev/null +++ b/core/tasks/deps_licenses.mk @@ -0,0 +1,59 @@ +# +# Copyright (C) 2015 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. +# + +# Print modules and their transitive dependencies with license files. +# To invoke, run "make deps-license PROJ_PATH= DEP_PATH=". +# PROJ_PATH restricts the paths of the source modules; DEP_PATH restricts the paths of the dependency modules. +# Both can be makefile patterns supported by makefile function $(filter). +# Example: "make deps-license packages/app/% external/%" prints all modules in packages/app/ with their dpendencies in external/. +# The printout lines look like " :: :: ". + +ifneq (,$(filter deps-license,$(MAKECMDGOALS))) +ifndef PROJ_PATH +$(error To "make deps-license" you must specify PROJ_PATH and DEP_PATH.) +endif +ifndef DEP_PATH +$(error To "make deps-license" you must specify PROJ_PATH and DEP_PATH.) +endif + +# Expand a module's dependencies transitively. +# $(1): the variable name to hold the result. +# $(2): the initial module name. +define get-module-all-dependencies +$(eval _gmad_new := $(sort $(filter-out $($(1)),\ + $(foreach m,$(2),$(ALL_DEPS.$(m).ALL_DEPS)))))\ +$(if $(_gmad_new),$(eval $(1) += $(_gmad_new))\ + $(call get-module-all-dependencies,$(1),$(_gmad_new))) +endef + +define print-deps-license +$(foreach m, $(ALL_DEPS.MODULES),\ + $(eval m_p := $(sort $(ALL_MODULES.$(m).PATH) $(ALL_MODULES.$(m)$(TARGET_2ND_ARCH_MODULE_SUFFIX).PATH)))\ + $(if $(filter $(PROJ_PATH),$(m_p)),\ + $(eval deps :=)\ + $(eval $(call get-module-all-dependencies,deps,$(m)))\ + $(info $(m) :: $(m_p) :: $(ALL_DEPS.$(m).LICENSE))\ + $(foreach d,$(deps),\ + $(eval d_p := $(sort $(ALL_MODULES.$(d).PATH) $(ALL_MODULES.$(d)$(TARGET_2ND_ARCH_MODULE_SUFFIX).PATH)))\ + $(if $(filter $(DEP_PATH),$(d_p)),\ + $(info $(space)$(space)$(space)$(space)$(d) :: $(d_p) :: $(ALL_DEPS.$(d).LICENSE)))))) +endef + +.PHONY: deps-license +deps-license: + @$(call print-deps-license) + +endif diff --git a/core/tasks/factory_bundle.mk b/core/tasks/factory_bundle.mk deleted file mode 100644 index 51531cb66..000000000 --- a/core/tasks/factory_bundle.mk +++ /dev/null @@ -1,84 +0,0 @@ -# -# Copyright (C) 2011 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. -# - -ifeq (,$(ONE_SHOT_MAKEFILE)) -ifneq ($(TARGET_BUILD_PDK),true) - TARGET_BUILD_FACTORY=true -endif -ifeq ($(TARGET_BUILD_FACTORY),true) - -# PRODUCT_FACTORY_RAMDISK_MODULES consists of ":[:...]" tuples. -# is relative to the staging directory for the bundle. -# -# Only host modules can be installed here. -# (It's possible to relax this, but it's not needed and kind of tricky. We'll need to add -# a better way of specifying the class. Really the answer is to stop having modules with -# duplicate names) -# -# You can also add files with PRODUCT_COPY_FILES if necessary. -# -# For example: -# PRODUCT_FACTORY_BUNDLE_MODULES := \ -# adb:adb fastboot:fastboot -requested_modules := $(strip $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_FACTORY_BUNDLE_MODULES)) - -root_dir := $(PRODUCT_OUT)/factory_bundle -leaf := $(strip $(TARGET_PRODUCT))-factory_bundle-$(FILE_NAME_TAG) -named_dir := $(PRODUCT_OUT)/$(leaf) -tarball := $(PRODUCT_OUT)/$(leaf).tgz - -copied_files := \ - $(foreach _fb_m, $(requested_modules), $(strip \ - $(eval _fb_m_tuple := $(subst :, ,$(_fb_m))) \ - $(eval _fb_m_name := $(word 1,$(_fb_m_tuple))) \ - $(eval _fb_dests := $(wordlist 2,999,$(_fb_m_tuple))) \ - $(eval _fb_m_built := $(filter $(HOST_OUT)/%, $(ALL_MODULES.$(_fb_m_name).BUILT))) \ - $(if $(_fb_m_built),,$(warning no built file in requested_modules for '$(_fb_m_built)'))\ - $(foreach _fb_f,$(_fb_dests),$(eval $(call copy-one-file,$(_fb_m_built),$(root_dir)/$(_fb_f))))\ - $(addprefix $(root_dir)/,$(_fb_dests)) \ - )) \ - $(filter $(root_dir)/%, $(ALL_DEFAULT_INSTALLED_MODULES)) - -ifneq (,$(strip $(copied_files))) - -# -# These files are made by magic so we need to explicitly include them -# -$(eval $(call copy-one-file,$(TARGET_OUT)/build.prop,$(root_dir)/build.prop)) -copied_files += $(root_dir)/build.prop - -$(eval $(call copy-one-file,$(PRODUCT_OUT)/factory_ramdisk.img,$(root_dir)/factory_ramdisk.img)) -copied_files += $(root_dir)/factory_ramdisk.img -# -# End magic -# - -$(tarball): PRIVATE_ROOT_DIR := $(root_dir) -$(tarball): PRIVATE_NAMED_DIR := $(named_dir) - -$(tarball): $(copied_files) - @echo "Tarball: $@" - $(hide) rm -rf $(PRIVATE_NAMED_DIR) - $(hide) ( cp -r $(PRIVATE_ROOT_DIR) $(PRIVATE_NAMED_DIR) \ - && tar cfz $@ -C $(dir $(PRIVATE_NAMED_DIR)) $(notdir $(PRIVATE_NAMED_DIR)) \ - ) && rm -rf $(PRIVATE_NAMED_DIR) - -INSTALLED_FACTORY_BUNDLE_TARGET := $(tarball) - -endif - -endif # TARGET_BUILD_PDK -endif # ONE_SHOT_MAKEFILE diff --git a/core/tasks/factory_ramdisk.mk b/core/tasks/factory_ramdisk.mk deleted file mode 100644 index d65d931fe..000000000 --- a/core/tasks/factory_ramdisk.mk +++ /dev/null @@ -1,95 +0,0 @@ -# -# Copyright (C) 2011 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. -# - -ifeq (,$(ONE_SHOT_MAKEFILE)) -ifneq ($(TARGET_BUILD_PDK),true) - TARGET_BUILD_FACTORY=true -endif -ifeq ($(TARGET_BUILD_FACTORY),true) - -# PRODUCT_FACTORY_RAMDISK_MODULES consists of ":[:...]" tuples. -# is relative to TARGET_FACTORY_RAMDISK_OUT. -# We can have multiple s because multiple modules may have the same name. -# For example: -# PRODUCT_FACTORY_RAMDISK_MODULES := \ -# toolbox:system/bin/toolbox adbd:sbin/adbd adb:system/bin/adb -factory_ramdisk_modules := $(strip $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_FACTORY_RAMDISK_MODULES)) -ifneq (,$(factory_ramdisk_modules)) - -# A module name may end up in multiple modules (so multiple built files) -# with the same name. -# This function selects the module built file based on the install path. -# $(1): the dest install path -# $(2): the module built files -define install-one-factory-ramdisk-module -$(eval _iofrm_suffix := $(suffix $(1))) \ -$(if $(_iofrm_suffix), \ - $(eval _iofrm_pattern := %$(_iofrm_suffix)), \ - $(eval _iofrm_pattern := %$(notdir $(1)))) \ -$(eval _iofrm_src := $(filter $(_iofrm_pattern),$(2))) \ -$(if $(filter 1,$(words $(_iofrm_src))), \ - $(eval _fulldest := $(TARGET_FACTORY_RAMDISK_OUT)/$(1)) \ - $(eval $(call copy-one-file,$(_iofrm_src),$(_fulldest))) \ - $(eval INTERNAL_FACTORY_RAMDISK_EXTRA_MODULES_FILES += $(_fulldest)), \ - $(warning Warning: Cannot find built file in "$(2)" for "$(1)") \ - ) -endef - -INTERNAL_FACTORY_RAMDISK_EXTRA_MODULES_FILES := -$(foreach m, $(factory_ramdisk_modules), \ - $(eval _fr_m_tuple := $(subst :, ,$(m))) \ - $(eval _fr_m_name := $(word 1,$(_fr_m_tuple))) \ - $(eval _fr_dests := $(wordlist 2,999,$(_fr_m_tuple))) \ - $(eval _fr_m_built := $(filter $(PRODUCT_OUT)/%, $(ALL_MODULES.$(_fr_m_name).BUILT))) \ - $(foreach d,$(_fr_dests),$(call install-one-factory-ramdisk-module,$(d),$(_fr_m_built))) \ - ) -endif - -# Files may also be installed via PRODUCT_COPY_FILES, PRODUCT_PACKAGES etc. -INTERNAL_FACTORY_RAMDISK_FILES := $(filter $(TARGET_FACTORY_RAMDISK_OUT)/%, \ - $(ALL_DEFAULT_INSTALLED_MODULES)) - -ifneq (,$(INTERNAL_FACTORY_RAMDISK_EXTRA_MODULES_FILES)$(INTERNAL_FACTORY_RAMDISK_FILES)) - -# These files are made by magic in build/core/Makefile so we need to explicitly include them -$(eval $(call copy-one-file,$(TARGET_OUT)/build.prop,$(TARGET_FACTORY_RAMDISK_OUT)/system/build.prop)) -INTERNAL_FACTORY_RAMDISK_FILES += $(TARGET_FACTORY_RAMDISK_OUT)/system/build.prop - -BUILT_FACTORY_RAMDISK_FS := $(PRODUCT_OUT)/factory_ramdisk.gz -BUILT_FACTORY_RAMDISK_TARGET := $(PRODUCT_OUT)/factory_ramdisk.img - -INSTALLED_FACTORY_RAMDISK_FS := $(BUILT_FACTORY_RAMDISK_FS) -$(INSTALLED_FACTORY_RAMDISK_FS) : $(MKBOOTFS) \ - $(INTERNAL_FACTORY_RAMDISK_EXTRA_MODULES_FILES) $(INTERNAL_FACTORY_RAMDISK_FILES) | $(MINIGZIP) - $(call pretty,"Target factory ram disk file system: $@") - $(hide) $(MKBOOTFS) $(TARGET_FACTORY_RAMDISK_OUT) | $(MINIGZIP) > $@ - -TARGET_RAMDISK_KERNEL := $(INSTALLED_KERNEL_TARGET) -INSTALLED_FACTORY_RAMDISK_TARGET := $(BUILT_FACTORY_RAMDISK_TARGET) -ifneq (,$(BOARD_KERNEL_CMDLINE_FACTORY_BOOT)) - RAMDISK_CMDLINE := --cmdline "$(BOARD_KERNEL_CMDLINE_FACTORY_BOOT)" -else - RAMDISK_CMDLINE := -endif -$(INSTALLED_FACTORY_RAMDISK_TARGET) : $(MKBOOTIMG) $(TARGET_RAMDISK_KERNEL) $(INSTALLED_FACTORY_RAMDISK_FS) - $(call pretty,"Target factory ram disk img format: $@") - $(MKBOOTIMG) --kernel $(TARGET_RAMDISK_KERNEL) --ramdisk $(INSTALLED_FACTORY_RAMDISK_FS) \ - --base $(BOARD_KERNEL_BASE) $(BOARD_MKBOOTIMG_ARGS) $(RAMDISK_CMDLINE) --output $@ - -endif - -endif # TARGET_BUILD_PDK -endif # ONE_SHOT_MAKEFILE diff --git a/core/tasks/module-info.mk b/core/tasks/module-info.mk new file mode 100644 index 000000000..e9b2ac7a9 --- /dev/null +++ b/core/tasks/module-info.mk @@ -0,0 +1,24 @@ +# Print a list of the modules that could be built + +MODULE_INFO_JSON := $(PRODUCT_OUT)/module-info.json + +$(MODULE_INFO_JSON): + @echo Generating $@ + $(hide) echo -ne '{\n ' > $@ + $(hide) echo -ne $(foreach m, $(sort $(ALL_MODULES)), \ + ' "$(m)": {' \ + '"class": [$(foreach w,$(sort $(ALL_MODULES.$(m).CLASS)),"$(w)", )], ' \ + '"path": [$(foreach w,$(sort $(ALL_MODULES.$(m).PATH)),"$(w)", )], ' \ + '"tags": [$(foreach w,$(sort $(ALL_MODULES.$(m).TAGS)),"$(w)", )], ' \ + '"installed": [$(foreach w,$(sort $(ALL_MODULES.$(m).INSTALLED)),"$(w)", )], ' \ + '},\n' \ + ) | sed -e 's/, *\]/]/g' -e 's/, *\}/ }/g' -e '$$s/,$$//' >> $@ + $(hide) echo '}' >> $@ + + +# If ONE_SHOT_MAKEFILE is set, our view of the world is smaller, so don't +# rewrite the file in that came. +ifndef ONE_SHOT_MAKEFILE +files: $(MODULE_INFO_JSON) +endif + diff --git a/core/tasks/oem_image.mk b/core/tasks/oem_image.mk index 26b9aba01..8a066700f 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 @@ -36,11 +45,11 @@ $(INSTALLED_OEMIMAGE_TARGET) : $(INTERNAL_USERIMAGES_DEPS) $(INTERNAL_OEMIMAGE_F $(call generate-userimage-prop-dictionary, $(oemimage_intermediates)/oem_image_info.txt, skip_fsck=true) $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH \ ./build/tools/releasetools/build_image.py \ - $(TARGET_OUT_OEM) $(oemimage_intermediates)/oem_image_info.txt $@ + $(TARGET_OUT_OEM) $(oemimage_intermediates)/oem_image_info.txt $@ $(TARGET_OUT) $(hide) $(call assert-max-image-size,$@,$(BOARD_OEMIMAGE_PARTITION_SIZE)) .PHONY: oem_image 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/old-cts.mk b/core/tasks/old-cts.mk new file mode 100644 index 000000000..70246387b --- /dev/null +++ b/core/tasks/old-cts.mk @@ -0,0 +1,399 @@ +# 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. + +cts_dir := $(HOST_OUT)/old-cts +cts_tools_src_dir := cts/tools + +cts_name := old-android-cts + +JUNIT_HOST_JAR := $(HOST_OUT_JAVA_LIBRARIES)/junit.jar +HOSTTESTLIB_JAR := $(HOST_OUT_JAVA_LIBRARIES)/hosttestlib.jar +TF_JAR := $(HOST_OUT_JAVA_LIBRARIES)/tradefed-prebuilt.jar +CTS_TF_JAR := $(HOST_OUT_JAVA_LIBRARIES)/old-cts-tradefed.jar +CTS_TF_EXEC_PATH ?= $(HOST_OUT_EXECUTABLES)/old-cts-tradefed +CTS_TF_README_PATH := $(cts_tools_src_dir)/tradefed-host/README + +VMTESTSTF_INTERMEDIATES :=$(call intermediates-dir-for,JAVA_LIBRARIES,vm-tests-tf,HOST) +VMTESTSTF_JAR := $(VMTESTSTF_INTERMEDIATES)/android.core.vm-tests-tf.jar + +# The list of test packages that core-tests (libcore/Android.mk) +# is split into. +CTS_CORE_CASE_LIST := \ + android.core.tests.libcore.package.dalvik \ + android.core.tests.libcore.package.com \ + android.core.tests.libcore.package.conscrypt \ + android.core.tests.libcore.package.sun \ + android.core.tests.libcore.package.tests \ + android.core.tests.libcore.package.org \ + android.core.tests.libcore.package.libcore \ + android.core.tests.libcore.package.jsr166 \ + android.core.tests.libcore.package.harmony_annotation \ + android.core.tests.libcore.package.harmony_java_io \ + android.core.tests.libcore.package.harmony_java_lang \ + android.core.tests.libcore.package.harmony_java_math \ + android.core.tests.libcore.package.harmony_java_net \ + android.core.tests.libcore.package.harmony_java_nio \ + android.core.tests.libcore.package.harmony_java_text \ + android.core.tests.libcore.package.harmony_java_util \ + android.core.tests.libcore.package.harmony_javax_security \ + android.core.tests.libcore.package.okhttp \ + android.core.tests.runner + +# Additional CTS packages for code under libcore +CTS_CORE_CASE_LIST += \ + android.core.tests.libcore.package.tzdata + +# The list of test packages that apache-harmony-tests (external/apache-harmony/Android.mk) +# is split into. +CTS_CORE_CASE_LIST += \ + android.core.tests.libcore.package.harmony_beans \ + android.core.tests.libcore.package.harmony_logging \ + android.core.tests.libcore.package.harmony_prefs \ + android.core.tests.libcore.package.harmony_sql + + +CTS_TEST_JAR_LIST := \ + cts-junit \ + CtsJdwp \ + cts-testng \ + CtsLibcoreOj + +# Depend on the full package paths rather than the phony targets to avoid +# rebuilding the packages every time. +CTS_CORE_CASES := $(foreach pkg,$(CTS_CORE_CASE_LIST),$(call intermediates-dir-for,APPS,$(pkg))/package.apk) +CTS_TEST_JAR_FILES := $(foreach c,$(CTS_TEST_JAR_LIST),$(call intermediates-dir-for,JAVA_LIBRARIES,$(c))/javalib.jar) + +-include cts/OldCtsTestCaseList.mk + +# A module may have mutliple installed files (e.g. split apks) +CTS_CASE_LIST_APKS := +$(foreach m, $(CTS_TEST_CASE_LIST),\ + $(foreach fp, $(ALL_MODULES.$(m).BUILT_INSTALLED),\ + $(eval pair := $(subst :,$(space),$(fp)))\ + $(eval CTS_CASE_LIST_APKS += $(CTS_TESTCASES_OUT)/$(notdir $(word 2,$(pair))))))\ +$(foreach m, $(CTS_CORE_CASE_LIST),\ + $(foreach fp, $(ALL_MODULES.$(m).BUILT_INSTALLED),\ + $(eval pair := $(subst :,$(space),$(fp)))\ + $(eval built := $(word 1,$(pair)))\ + $(eval installed := $(CTS_TESTCASES_OUT)/$(notdir $(word 2,$(pair))))\ + $(eval $(call copy-one-file, $(built), $(installed)))\ + $(eval CTS_CASE_LIST_APKS += $(installed)))) + +CTS_CASE_LIST_JARS := +$(foreach m, $(CTS_TEST_JAR_LIST),\ + $(eval CTS_CASE_LIST_JARS += $(CTS_TESTCASES_OUT)/$(m).jar)) + +CTS_SHARED_LIBS := + +DEFAULT_TEST_PLAN := $(cts_dir)/$(cts_name)/resource/plans +$(cts_dir)/all_cts_files_stamp: $(CTS_CORE_CASES) $(CTS_TEST_JAR_FILES) $(CTS_TEST_CASES) $(CTS_CASE_LIST_APKS) $(CTS_CASE_LIST_JARS) $(JUNIT_HOST_JAR) $(HOSTTESTLIB_JAR) $(CTS_HOST_LIBRARY_JARS) $(TF_JAR) $(VMTESTSTF_JAR) $(CTS_TF_JAR) $(CTS_TF_EXEC_PATH) $(CTS_TF_README_PATH) $(ADDITIONAL_TF_JARS) $(ACP) $(CTS_SHARED_LIBS) + +# Make necessary directory for CTS + $(hide) mkdir -p $(TMP_DIR) + $(hide) mkdir -p $(PRIVATE_DIR)/docs + $(hide) mkdir -p $(PRIVATE_DIR)/tools + $(hide) mkdir -p $(PRIVATE_DIR)/repository/testcases + $(hide) mkdir -p $(PRIVATE_DIR)/repository/plans +# Copy executable and JARs to CTS directory + $(hide) $(ACP) -fp $(VMTESTSTF_JAR) $(CTS_TESTCASES_OUT) + $(hide) $(ACP) -fp $(HOSTTESTLIB_JAR) $(CTS_HOST_LIBRARY_JARS) $(TF_JAR) $(CTS_TF_JAR) $(CTS_TF_EXEC_PATH) $(ADDITIONAL_TF_JARS) $(CTS_TF_README_PATH) $(PRIVATE_DIR)/tools + $(hide) $(call copy-files-with-structure, $(CTS_SHARED_LIBS),$(HOST_OUT)/,$(PRIVATE_DIR)) + $(hide) touch $@ + +# Generate the test descriptions for the core-tests +# Parameters: +# $1 : The output file where the description should be written (without the '.xml' extension) +# $2 : The AndroidManifest.xml corresponding to the test package +# $3 : The jar file name on PRIVATE_CLASSPATH containing junit tests to search for +# $4 : The package prefix of classes to include, possible empty +# $5 : The architecture of the current build +# $6 : The directory containing vogar expectations files +# $7 : The Android.mk corresponding to the test package (required for host-side tests only) +define generate-core-test-description +@echo "Generate core-test description ("$(notdir $(1))")" +$(hide) java -Xmx256M \ + -Xbootclasspath/a:$(PRIVATE_CLASSPATH):$(JUNIT_HOST_JAR) \ + -classpath $(HOST_OUT_JAVA_LIBRARIES)/descGen.jar:$(HOST_JDK_TOOLS_JAR) \ + $(PRIVATE_PARAMS) CollectAllTests $(1) $(2) $(3) "$(4)" $(5) $(6) $(7) +endef + +OJ_INTERMEDIATES :=$(call intermediates-dir-for,JAVA_LIBRARIES,core-oj,,COMMON) +CORE_INTERMEDIATES :=$(call intermediates-dir-for,JAVA_LIBRARIES,core-libart,,COMMON) +CONSCRYPT_INTERMEDIATES :=$(call intermediates-dir-for,JAVA_LIBRARIES,conscrypt,,COMMON) +BOUNCYCASTLE_INTERMEDIATES :=$(call intermediates-dir-for,JAVA_LIBRARIES,bouncycastle,,COMMON) +APACHEXML_INTERMEDIATES :=$(call intermediates-dir-for,JAVA_LIBRARIES,apache-xml,,COMMON) +OKHTTP_INTERMEDIATES :=$(call intermediates-dir-for,JAVA_LIBRARIES,okhttp-nojarjar,,COMMON) +OKHTTPTESTS_INTERMEDIATES :=$(call intermediates-dir-for,JAVA_LIBRARIES,okhttp-tests-nojarjar,,COMMON) +OKHTTP_REPACKAGED_INTERMEDIATES :=$(call intermediates-dir-for,JAVA_LIBRARIES,okhttp,,COMMON) +APACHEHARMONYTESTS_INTERMEDIATES :=$(call intermediates-dir-for,JAVA_LIBRARIES,apache-harmony-tests,,COMMON) +SQLITEJDBC_INTERMEDIATES :=$(call intermediates-dir-for,JAVA_LIBRARIES,sqlite-jdbc,,COMMON) +JUNIT_INTERMEDIATES :=$(call intermediates-dir-for,JAVA_LIBRARIES,core-junit,,COMMON) +CORETESTS_INTERMEDIATES :=$(call intermediates-dir-for,JAVA_LIBRARIES,core-tests,,COMMON) +JSR166TESTS_INTERMEDIATES :=$(call intermediates-dir-for,JAVA_LIBRARIES,jsr166-tests,,COMMON) +CONSCRYPTTESTS_INTERMEDIATES :=$(call intermediates-dir-for,JAVA_LIBRARIES,conscrypt-tests,,COMMON) +TZDATAUPDATETESTS_INTERMEDIATES :=$(call intermediates-dir-for,JAVA_LIBRARIES,tzdata_update-tests,,COMMON) + +GEN_CLASSPATH := \ + $(OJ_INTERMEDIATES)/classes.jar:$(CORE_INTERMEDIATES)/classes.jar:$(CONSCRYPT_INTERMEDIATES)/classes.jar:$(BOUNCYCASTLE_INTERMEDIATES)/classes.jar:$(APACHEXML_INTERMEDIATES)/classes.jar:$(APACHEHARMONYTESTS_INTERMEDIATES)/classes.jar:$(OKHTTP_INTERMEDIATES)/classes.jar:$(OKHTTPTESTS_INTERMEDIATES)/classes.jar:$(OKHTTP_REPACKAGED_INTERMEDIATES)/classes.jar:$(JUNIT_INTERMEDIATES)/classes.jar:$(SQLITEJDBC_INTERMEDIATES)/javalib.jar:$(CORETESTS_INTERMEDIATES)/javalib.jar:$(JSR166TESTS_INTERMEDIATES)/javalib.jar:$(CONSCRYPTTESTS_INTERMEDIATES)/javalib.jar:$(TZDATAUPDATETESTS_INTERMEDIATES)/javalib.jar + +CTS_CORE_XMLS := \ + $(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.dalvik.xml \ + $(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.com.xml \ + $(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.conscrypt.xml \ + $(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.sun.xml \ + $(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.tests.xml \ + $(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.org.xml \ + $(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.libcore.xml \ + $(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.jsr166.xml \ + $(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_annotation.xml \ + $(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_java_io.xml \ + $(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_java_lang.xml \ + $(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_java_math.xml \ + $(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_java_net.xml \ + $(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_java_nio.xml \ + $(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_java_text.xml \ + $(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_java_util.xml \ + $(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_javax_security.xml \ + $(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_beans.xml \ + $(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_logging.xml \ + $(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_prefs.xml \ + $(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_sql.xml \ + $(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.okhttp.xml \ + $(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.tzdata.xml \ + +$(CTS_CORE_XMLS): PRIVATE_CLASSPATH:=$(GEN_CLASSPATH) +# Why does this depend on javalib.jar instead of classes.jar? Because +# even though the tool will operate on the classes.jar files, the +# build system requires that dependencies use javalib.jar. If +# javalib.jar is up-to-date, then classes.jar is as well. Depending +# on classes.jar will build the files incorrectly. +CTS_CORE_XMLS_DEPS := $(CTS_CORE_CASES) $(HOST_OUT_JAVA_LIBRARIES)/descGen.jar $(JUNIT_HOST_JAR) $(CORE_INTERMEDIATES)/javalib.jar $(BOUNCYCASTLE_INTERMEDIATES)/javalib.jar $(APACHEXML_INTERMEDIATES)/javalib.jar $(APACHEHARMONYTESTS_INTERMEDIATES)/javalib.jar $(OKHTTP_INTERMEDIATES)/javalib.jar $(OKHTTPTESTS_INTERMEDIATES)/javalib.jar $(OKHTTP_REPACKAGED_INTERMEDIATES)/javalib.jar $(SQLITEJDBC_INTERMEDIATES)/javalib.jar $(JUNIT_INTERMEDIATES)/javalib.jar $(CORETESTS_INTERMEDIATES)/javalib.jar $(JSR166TESTS_INTERMEDIATES)/javalib.jar $(CONSCRYPTTESTS_INTERMEDIATES)/javalib.jar $(TZDATAUPDATETESTS_INTERMEDIATES)/javalib.jar build/core/tasks/cts.mk | $(ACP) + +$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.dalvik.xml: $(CTS_CORE_XMLS_DEPS) + $(hide) mkdir -p $(CTS_TESTCASES_OUT) + $(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.dalvik,\ + cts/tests/core/libcore/dalvik/AndroidManifest.xml,\ + $(CORETESTS_INTERMEDIATES)/javalib.jar,dalvik,\ + $(TARGET_ARCH),libcore/expectations) + +$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.com.xml: $(CTS_CORE_XMLS_DEPS) + $(hide) mkdir -p $(CTS_TESTCASES_OUT) + $(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.com,\ + cts/tests/core/libcore/com/AndroidManifest.xml,\ + $(CORETESTS_INTERMEDIATES)/javalib.jar,com,\ + $(TARGET_ARCH),libcore/expectations) + +$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.conscrypt.xml: $(CTS_CORE_XMLS_DEPS) + $(hide) mkdir -p $(CTS_TESTCASES_OUT) + $(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.conscrypt,\ + cts/tests/core/libcore/conscrypt/AndroidManifest.xml,\ + $(CONSCRYPTTESTS_INTERMEDIATES)/javalib.jar,,\ + $(TARGET_ARCH),libcore/expectations) + +$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.sun.xml: $(CTS_CORE_XMLS_DEPS) + $(hide) mkdir -p $(CTS_TESTCASES_OUT) + $(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.sun,\ + cts/tests/core/libcore/sun/AndroidManifest.xml,\ + $(CORETESTS_INTERMEDIATES)/javalib.jar,sun,\ + $(TARGET_ARCH),libcore/expectations) + +$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.tests.xml: $(CTS_CORE_XMLS_DEPS) + $(hide) mkdir -p $(CTS_TESTCASES_OUT) + $(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.tests,\ + cts/tests/core/libcore/tests/AndroidManifest.xml,\ + $(CORETESTS_INTERMEDIATES)/javalib.jar,tests,\ + $(TARGET_ARCH),libcore/expectations) + +$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.org.xml: $(CTS_CORE_XMLS_DEPS) + $(hide) mkdir -p $(CTS_TESTCASES_OUT) + $(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.org,\ + cts/tests/core/libcore/org/AndroidManifest.xml,\ + $(CORETESTS_INTERMEDIATES)/javalib.jar,\ + org.w3c.domts:\ + org.apache.harmony.security.tests:\ + org.apache.harmony.nio.tests:\ + org.apache.harmony.crypto.tests:\ + org.apache.harmony.regex.tests:\ + org.apache.harmony.luni.tests:\ + org.apache.harmony.tests.internal.net.www.protocol:\ + org.apache.harmony.tests.javax.net:\ + org.apache.harmony.tests.javax.xml:\ + org.json,\ + $(TARGET_ARCH),libcore/expectations) + +$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.libcore.xml: $(CTS_CORE_XMLS_DEPS) + $(hide) mkdir -p $(CTS_TESTCASES_OUT) + $(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.libcore,\ + cts/tests/core/libcore/libcore/AndroidManifest.xml,\ + $(CORETESTS_INTERMEDIATES)/javalib.jar,libcore,\ + $(TARGET_ARCH),libcore/expectations) + +$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.jsr166.xml: $(CTS_CORE_XMLS_DEPS) + $(hide) mkdir -p $(CTS_TESTCASES_OUT) + $(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.jsr166,\ + cts/tests/core/libcore/jsr166/AndroidManifest.xml,\ + $(JSR166TESTS_INTERMEDIATES)/javalib.jar,jsr166,\ + $(TARGET_ARCH),libcore/expectations) + +$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_annotation.xml: $(CTS_CORE_XMLS_DEPS) + $(hide) mkdir -p $(CTS_TESTCASES_OUT) + $(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_annotation,\ + cts/tests/core/libcore/harmony_annotation/AndroidManifest.xml,\ + $(CORETESTS_INTERMEDIATES)/javalib.jar,org.apache.harmony.annotation.tests,\ + $(TARGET_ARCH),libcore/expectations) + +$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_java_io.xml: $(CTS_CORE_XMLS_DEPS) + $(hide) mkdir -p $(CTS_TESTCASES_OUT) + $(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_java_io,\ + cts/tests/core/libcore/harmony_java_io/AndroidManifest.xml,\ + $(CORETESTS_INTERMEDIATES)/javalib.jar,org.apache.harmony.tests.java.io,\ + $(TARGET_ARCH),libcore/expectations) + +$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_java_lang.xml: $(CTS_CORE_XMLS_DEPS) + $(hide) mkdir -p $(CTS_TESTCASES_OUT) + $(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_java_lang,\ + cts/tests/core/libcore/harmony_java_lang/AndroidManifest.xml,\ + $(CORETESTS_INTERMEDIATES)/javalib.jar,org.apache.harmony.tests.java.lang,\ + $(TARGET_ARCH),libcore/expectations) + +$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_java_math.xml: $(CTS_CORE_XMLS_DEPS) + $(hide) mkdir -p $(CTS_TESTCASES_OUT) + $(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_java_math,\ + cts/tests/core/libcore/harmony_java_math/AndroidManifest.xml,\ + $(CORETESTS_INTERMEDIATES)/javalib.jar,org.apache.harmony.tests.java.math,\ + $(TARGET_ARCH),libcore/expectations) + +$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_java_net.xml: $(CTS_CORE_XMLS_DEPS) + $(hide) mkdir -p $(CTS_TESTCASES_OUT) + $(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_java_net,\ + cts/tests/core/libcore/harmony_java_net/AndroidManifest.xml,\ + $(CORETESTS_INTERMEDIATES)/javalib.jar,org.apache.harmony.tests.java.net,\ + $(TARGET_ARCH),libcore/expectations) + +$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_java_nio.xml: $(CTS_CORE_XMLS_DEPS) + $(hide) mkdir -p $(CTS_TESTCASES_OUT) + $(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_java_nio,\ + cts/tests/core/libcore/harmony_java_nio/AndroidManifest.xml,\ + $(CORETESTS_INTERMEDIATES)/javalib.jar,org.apache.harmony.tests.java.nio,\ + $(TARGET_ARCH),libcore/expectations) + +$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_java_text.xml: $(CTS_CORE_XMLS_DEPS) + $(hide) mkdir -p $(CTS_TESTCASES_OUT) + $(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_java_text,\ + cts/tests/core/libcore/harmony_java_text/AndroidManifest.xml,\ + $(CORETESTS_INTERMEDIATES)/javalib.jar,org.apache.harmony.tests.java.text,\ + $(TARGET_ARCH),libcore/expectations) + +$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_java_util.xml: $(CTS_CORE_XMLS_DEPS) + $(hide) mkdir -p $(CTS_TESTCASES_OUT) + $(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_java_util,\ + cts/tests/core/libcore/harmony_java_util/AndroidManifest.xml,\ + $(CORETESTS_INTERMEDIATES)/javalib.jar,org.apache.harmony.tests.java.util,\ + $(TARGET_ARCH),libcore/expectations) + +$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_javax_security.xml: $(CTS_CORE_XMLS_DEPS) + $(hide) mkdir -p $(CTS_TESTCASES_OUT) + $(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_javax_security,\ + cts/tests/core/libcore/harmony_javax_security/AndroidManifest.xml,\ + $(CORETESTS_INTERMEDIATES)/javalib.jar,org.apache.harmony.tests.javax.security,\ + $(TARGET_ARCH),libcore/expectations) + +$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_beans.xml: $(CTS_CORE_XMLS_DEPS) + $(hide) mkdir -p $(CTS_TESTCASES_OUT) + $(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_beans,\ + cts/tests/core/libcore/harmony_beans/AndroidManifest.xml,\ + $(APACHEHARMONYTESTS_INTERMEDIATES)/javalib.jar,com.android.org.apache.harmony.beans,\ + $(TARGET_ARCH),libcore/expectations external/apache-harmony/Android.mk) + +$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_logging.xml: $(CTS_CORE_XMLS_DEPS) + $(hide) mkdir -p $(CTS_TESTCASES_OUT) + $(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_logging,\ + cts/tests/core/libcore/harmony_logging/AndroidManifest.xml,\ + $(APACHEHARMONYTESTS_INTERMEDIATES)/javalib.jar,com.android.org.apache.harmony.logging,\ + $(TARGET_ARCH),libcore/expectations external/apache-harmony/Android.mk) + +$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_prefs.xml: $(CTS_CORE_XMLS_DEPS) + $(hide) mkdir -p $(CTS_TESTCASES_OUT) + $(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_prefs,\ + cts/tests/core/libcore/harmony_prefs/AndroidManifest.xml,\ + $(APACHEHARMONYTESTS_INTERMEDIATES)/javalib.jar,com.android.org.apache.harmony.prefs,\ + $(TARGET_ARCH),libcore/expectations external/apache-harmony/Android.mk) + +$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_sql.xml: $(CTS_CORE_XMLS_DEPS) + $(hide) mkdir -p $(CTS_TESTCASES_OUT) + $(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_sql,\ + cts/tests/core/libcore/harmony_sql/AndroidManifest.xml,\ + $(APACHEHARMONYTESTS_INTERMEDIATES)/javalib.jar,com.android.org.apache.harmony.sql,\ + $(TARGET_ARCH),libcore/expectations external/apache-harmony/Android.mk) + +$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.okhttp.xml: $(CTS_CORE_XMLS_DEPS) + $(hide) mkdir -p $(CTS_TESTCASES_OUT) + $(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.okhttp,\ + cts/tests/core/libcore/okhttp/AndroidManifest.xml,\ + $(OKHTTPTESTS_INTERMEDIATES)/javalib.jar,,\ + $(TARGET_ARCH),libcore/expectations) + +$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.tzdata.xml: $(CTS_CORE_XMLS_DEPS) + $(hide) mkdir -p $(CTS_TESTCASES_OUT) + $(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.tzdata,\ + cts/tests/core/libcore/tzdata/AndroidManifest.xml,\ + $(TZDATAUPDATETESTS_INTERMEDIATES)/javalib.jar,,\ + $(TARGET_ARCH),libcore/expectations) + +# ----- Generate the test descriptions for the vm-tests-tf ----- +# +CORE_VM_TEST_TF_DESC := $(CTS_TESTCASES_OUT)/android.core.vm-tests-tf.xml + +# core tests only needed to get hold of junit-framework-classes +OJ_INTERMEDIATES :=$(call intermediates-dir-for,JAVA_LIBRARIES,core-oj,,COMMON) +CORE_INTERMEDIATES :=$(call intermediates-dir-for,JAVA_LIBRARIES,core-libart,,COMMON) +JUNIT_INTERMEDIATES :=$(call intermediates-dir-for,JAVA_LIBRARIES,core-junit,,COMMON) + +GEN_CLASSPATH := $(OJ_INTERMEDIATES)/classes.jar:$(CORE_INTERMEDIATES)/classes.jar:$(JUNIT_INTERMEDIATES)/classes.jar:$(VMTESTSTF_JAR):$(TF_JAR) + +$(CORE_VM_TEST_TF_DESC): PRIVATE_CLASSPATH:=$(GEN_CLASSPATH) +# Please see big comment above on why this line depends on javalib.jar instead of classes.jar +$(CORE_VM_TEST_TF_DESC): $(HOST_OUT_JAVA_LIBRARIES)/descGen.jar $(JUNIT_HOST_JAR) $(CORE_INTERMEDIATES)/javalib.jar $(JUNIT_INTERMEDIATES)/javalib.jar $(VMTESTSTF_JAR) | $(ACP) + $(hide) mkdir -p $(CTS_TESTCASES_OUT) + $(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.vm-tests-tf,\ + cts/tests/vm-tests-tf/AndroidManifest.xml,\ + $(VMTESTSTF_JAR),"",\ + $(TARGET_ARCH),\ + libcore/expectations,\ + cts/tools/vm-tests-tf/Android.mk) + +# Generate the default test plan for User. +# Usage: buildCts.py + +$(DEFAULT_TEST_PLAN): $(cts_dir)/all_cts_files_stamp $(cts_tools_src_dir)/utils/buildCts.py $(HOST_OUT_JAVA_LIBRARIES)/descGen.jar $(CTS_CORE_XMLS) $(CTS_TEST_XMLS) $(CORE_VM_TEST_TF_DESC) + $(hide) $(cts_tools_src_dir)/utils/buildCts.py cts/tests/tests/ $(PRIVATE_DIR) $(TMP_DIR) \ + $(TOP) $(HOST_OUT_JAVA_LIBRARIES)/descGen.jar + $(hide) mkdir -p $(dir $@) && touch $@ + +# Package CTS and clean up. +# +# TODO: +# Pack cts.bat into the same zip file as well. See http://buganizer/issue?id=1656821 for more details +INTERNAL_CTS_TARGET := $(cts_dir)/$(cts_name).zip +$(INTERNAL_CTS_TARGET): PRIVATE_NAME := $(cts_name) +$(INTERNAL_CTS_TARGET): PRIVATE_CTS_DIR := $(cts_dir) +$(INTERNAL_CTS_TARGET): PRIVATE_DIR := $(cts_dir)/$(cts_name) +$(INTERNAL_CTS_TARGET): TMP_DIR := $(cts_dir)/temp +$(INTERNAL_CTS_TARGET): $(cts_dir)/all_cts_files_stamp $(DEFAULT_TEST_PLAN) + $(hide) echo "Package CTS: $@" + $(hide) cd $(dir $@) && zip -rqX $(notdir $@) $(PRIVATE_NAME) + +.PHONY: old-cts +old-cts: $(INTERNAL_CTS_TARGET) adb +$(call dist-for-goals,old-cts,$(INTERNAL_CTS_TARGET)) diff --git a/core/tasks/sdk-addon.mk b/core/tasks/sdk-addon.mk index 5ac9b7d47..362b22935 100644 --- a/core/tasks/sdk-addon.mk +++ b/core/tasks/sdk-addon.mk @@ -111,13 +111,13 @@ $(full_target): $(sdk_addon_deps) | $(ACP) $(ACP) -r $$d $(PRIVATE_STAGING_DIR)/docs ;\ done $(hide) mkdir -p $(dir $@) - $(hide) ( F=$$(pwd)/$@ ; cd $(PRIVATE_STAGING_DIR)/.. && zip -rq $$F $(notdir $(PRIVATE_STAGING_DIR)) ) + $(hide) ( F=$$(pwd)/$@ ; cd $(PRIVATE_STAGING_DIR)/.. && zip -rqX $$F $(notdir $(PRIVATE_STAGING_DIR)) ) $(full_target_img): PRIVATE_STAGING_DIR := $(call append-path,$(staging),$(addon_dir_img))/images/$(TARGET_CPU_ABI) $(full_target_img): $(full_target) $(addon_img_source_prop) @echo Packaging SDK Addon System-Image: $@ $(hide) mkdir -p $(dir $@) - $(hide) ( F=$$(pwd)/$@ ; cd $(PRIVATE_STAGING_DIR)/.. && zip -rq $$F $(notdir $(PRIVATE_STAGING_DIR)) ) + $(hide) ( F=$$(pwd)/$@ ; cd $(PRIVATE_STAGING_DIR)/.. && zip -rqX $$F $(notdir $(PRIVATE_STAGING_DIR)) ) .PHONY: sdk_addon diff --git a/core/tasks/tools/build_custom_image.mk b/core/tasks/tools/build_custom_image.mk new file mode 100644 index 000000000..ec491fa85 --- /dev/null +++ b/core/tasks/tools/build_custom_image.mk @@ -0,0 +1,117 @@ +# +# Copyright (C) 2015 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. +# + + +# Define rule to build one custom image. +# Input variables: my_custom_imag_makefile + +$(call clear-var-list, $(custom_image_parameter_variables)) + +include $(my_custom_imag_makefile) + +my_custom_image_name := $(basename $(notdir $(my_custom_imag_makefile))) + +intermediates := $(call intermediates-dir-for,PACKAGING,$(my_custom_image_name)) +my_built_custom_image := $(intermediates)/$(my_custom_image_name).img +my_staging_dir := $(intermediates)/$(CUSTOM_IMAGE_MOUNT_POINT) + +# Collect CUSTOM_IMAGE_MODULES's installd files and their PICKUP_FILES. +my_built_modules := +my_copy_pairs := +my_pickup_files := + +$(foreach m,$(CUSTOM_IMAGE_MODULES),\ + $(eval _pickup_files := $(strip $(ALL_MODULES.$(m).PICKUP_FILES)\ + $(ALL_MODULES.$(m)$(TARGET_2ND_ARCH_MODULE_SUFFIX).PICKUP_FILES)))\ + $(eval _built_files := $(strip $(ALL_MODULES.$(m).BUILT_INSTALLED)\ + $(ALL_MODULES.$(m)$(TARGET_2ND_ARCH_MODULE_SUFFIX).BUILT_INSTALLED)))\ + $(if $(_pickup_files)$(_built_files),,\ + $(warning Unknown installed file for module '$(m)'))\ + $(eval my_pickup_files += $(_pickup_files))\ + $(foreach i, $(_built_files),\ + $(eval bui_ins := $(subst :,$(space),$(i)))\ + $(eval ins := $(word 2,$(bui_ins)))\ + $(if $(filter $(TARGET_OUT_ROOT)/%,$(ins)),\ + $(eval bui := $(word 1,$(bui_ins)))\ + $(eval my_built_modules += $(bui))\ + $(eval my_copy_dest := $(patsubst $(PRODUCT_OUT)/%,%,$(ins)))\ + $(eval my_copy_dest := $(subst /,$(space),$(my_copy_dest)))\ + $(eval my_copy_dest := $(wordlist 2,999,$(my_copy_dest)))\ + $(eval my_copy_dest := $(subst $(space),/,$(my_copy_dest)))\ + $(eval my_copy_pairs += $(bui):$(my_staging_dir)/$(my_copy_dest)))\ + )) + +# Collect CUSTOM_IMAGE_COPY_FILES. +my_image_copy_files := +$(foreach f,$(CUSTOM_IMAGE_COPY_FILES),\ + $(eval pair := $(subst :,$(space),$(f)))\ + $(eval src := $(word 1,$(pair)))\ + $(eval my_image_copy_files += $(src))\ + $(eval my_copy_pairs += $(src):$(my_staging_dir)/$(word 2,$(pair)))) + +$(my_built_custom_image): PRIVATE_INTERMEDIATES := $(intermediates) +$(my_built_custom_image): PRIVATE_MOUNT_POINT := $(CUSTOM_IMAGE_MOUNT_POINT) +$(my_built_custom_image): PRIVATE_PARTITION_SIZE := $(CUSTOM_IMAGE_PARTITION_SIZE) +$(my_built_custom_image): PRIVATE_FILE_SYSTEM_TYPE := $(CUSTOM_IMAGE_FILE_SYSTEM_TYPE) +$(my_built_custom_image): PRIVATE_STAGING_DIR := $(my_staging_dir) +$(my_built_custom_image): PRIVATE_COPY_PAIRS := $(my_copy_pairs) +$(my_built_custom_image): PRIVATE_PICKUP_FILES := $(my_pickup_files) +$(my_built_custom_image): PRIVATE_SELINUX := $(CUSTOM_IMAGE_SELINUX) +$(my_built_custom_image): PRIVATE_SUPPORT_VERITY := $(CUSTOM_IMAGE_SUPPORT_VERITY) +$(my_built_custom_image): PRIVATE_VERITY_KEY := $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VERITY_SIGNING_KEY) +$(my_built_custom_image): PRIVATE_VERITY_BLOCK_DEVICE := $(CUSTOM_IMAGE_VERITY_BLOCK_DEVICE) +$(my_built_custom_image): PRIVATE_DICT_FILE := $(CUSTOM_IMAGE_DICT_FILE) +$(my_built_custom_image): $(INTERNAL_USERIMAGES_DEPS) $(my_built_modules) $(my_image_copy_files) \ + $(CUSTOM_IMAGE_DICT_FILE) + @echo "Build image $@" + $(hide) rm -rf $(PRIVATE_INTERMEDIATES) && mkdir -p $(PRIVATE_INTERMEDIATES) + $(hide) rm -rf $(PRIVATE_STAGING_DIR) && mkdir -p $(PRIVATE_STAGING_DIR) + # Copy all the files. + $(hide) $(foreach p,$(PRIVATE_COPY_PAIRS),\ + $(eval pair := $(subst :,$(space),$(p)))\ + mkdir -p $(dir $(word 2,$(pair)));\ + cp -Rf $(word 1,$(pair)) $(word 2,$(pair));) + $(if $($(PRIVATE_PICKUP_FILES)),$(hide) cp -Rf $(PRIVATE_PICKUP_FILES) $(PRIVATE_STAGING_DIR)) + # Generate the dict. + $(hide) echo "# For all accepted properties, see BuildImage() in tools/releasetools/build_image.py" > $(PRIVATE_INTERMEDIATES)/image_info.txt + $(hide) echo "mount_point=$(PRIVATE_MOUNT_POINT)" >> $(PRIVATE_INTERMEDIATES)/image_info.txt + $(hide) echo "fs_type=$(PRIVATE_FILE_SYSTEM_TYPE)" >> $(PRIVATE_INTERMEDIATES)/image_info.txt + $(hide) echo "partition_size=$(PRIVATE_PARTITION_SIZE)" >> $(PRIVATE_INTERMEDIATES)/image_info.txt + $(if $(PRIVATE_SELINUX),$(hide) echo "selinux_fc=$(SELINUX_FC)" >> $(PRIVATE_INTERMEDIATES)/image_info.txt) + $(if $(PRIVATE_SUPPORT_VERITY),\ + $(hide) echo "verity=$(PRIVATE_SUPPORT_VERITY)" >> $(PRIVATE_INTERMEDIATES)/image_info.txt;\ + echo "verity_key=$(PRIVATE_VERITY_KEY)" >> $(PRIVATE_INTERMEDIATES)/image_info.txt;\ + echo "verity_signer_cmd=$(VERITY_SIGNER)" >> $(PRIVATE_INTERMEDIATES)/image_info.txt;\ + echo "verity_block_device=$(PRIVATE_VERITY_BLOCK_DEVICE)" >> $(PRIVATE_INTERMEDIATES)/image_info.txt) + $(if $(PRIVATE_DICT_FILE),\ + $(hide) echo "# Properties from $(PRIVATE_DICT_FILE)" >> $(PRIVATE_INTERMEDIATES)/image_info.txt;\ + cat $(PRIVATE_DICT_FILE) >> $(PRIVATE_INTERMEDIATES)/image_info.txt) + # Generate the image. + $(if $(filter oem,$(PRIVATE_MOUNT_POINT)), \ + $(hide) echo "oem.buildnumber=$(BUILD_NUMBER)" >> $(PRIVATE_STAGING_DIR)/oem.prop) + $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH \ + ./build/tools/releasetools/build_image.py \ + $(PRIVATE_STAGING_DIR) $(PRIVATE_INTERMEDIATES)/image_info.txt $@ $(TARGET_OUT) + +my_installed_custom_image := $(PRODUCT_OUT)/$(notdir $(my_built_custom_image)) +$(my_installed_custom_image) : $(my_built_custom_image) + $(call copy-file-to-new-target-with-cp) + +.PHONY: $(my_custom_image_name) +custom_images $(my_custom_image_name) : $(my_installed_custom_image) + +# Archive the built image. +$(call dist-for-goals, $(my_custom_image_name) custom_images,$(my_installed_custom_image)) diff --git a/core/tasks/tools/compatibility.mk b/core/tasks/tools/compatibility.mk new file mode 100644 index 000000000..d8f900e4e --- /dev/null +++ b/core/tasks/tools/compatibility.mk @@ -0,0 +1,52 @@ +# Copyright (C) 2015 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. + +# Package up a compatibility test suite in a zip file. +# +# Input variables: +# test_suite_name: the name of this test suite eg. cts +# test_suite_tradefed: the name of this test suite's tradefed wrapper +# test_suite_dynamic_config: the path to this test suite's dynamic configuration file +# test_suite_readme: the path to a README file for this test suite +# Output variables: +# compatibility_zip: the path to the output zip file. + +out_dir := $(HOST_OUT)/$(test_suite_name)/android-$(test_suite_name) +test_artifacts := $(COMPATIBILITY.$(test_suite_name).FILES) +test_tools := $(HOST_OUT_JAVA_LIBRARIES)/hosttestlib.jar \ + $(HOST_OUT_JAVA_LIBRARIES)/tradefed-prebuilt.jar \ + $(HOST_OUT_JAVA_LIBRARIES)/compatibility-host-util.jar \ + $(HOST_OUT_JAVA_LIBRARIES)/$(test_suite_tradefed).jar \ + $(HOST_OUT_EXECUTABLES)/$(test_suite_tradefed) \ + $(test_suite_readme) + +compatibility_zip := $(out_dir).zip +$(compatibility_zip): PRIVATE_NAME := android-$(test_suite_name) +$(compatibility_zip): PRIVATE_OUT_DIR := $(out_dir) +$(compatibility_zip): PRIVATE_TOOLS := $(test_tools) +$(compatibility_zip): PRIVATE_SUITE_NAME := $(test_suite_name) +$(compatibility_zip): PRIVATE_DYNAMIC_CONFIG := $(test_suite_dynamic_config) +$(compatibility_zip): $(test_artifacts) $(test_tools) $(test_suite_dynamic_config) | $(ADB) $(ACP) +# Make dir structure + $(hide) mkdir -p $(PRIVATE_OUT_DIR)/tools $(PRIVATE_OUT_DIR)/testcases +# Copy tools + $(hide) $(ACP) -fp $(PRIVATE_TOOLS) $(PRIVATE_OUT_DIR)/tools + $(if $(PRIVATE_DYNAMIC_CONFIG),$(hide) $(ACP) -fp $(PRIVATE_DYNAMIC_CONFIG) $(PRIVATE_OUT_DIR)/testcases/$(PRIVATE_SUITE_NAME).dynamic) + $(hide) cd $(dir $@) && zip -rq $(notdir $@) $(PRIVATE_NAME) + +# Reset all input variables +test_suite_name := +test_suite_tradefed := +test_suite_dynamic_config := +test_suite_readme := diff --git a/core/tasks/tools/package-modules.mk b/core/tasks/tools/package-modules.mk index bd9cf57f7..24a7608b2 100644 --- a/core/tasks/tools/package-modules.mk +++ b/core/tasks/tools/package-modules.mk @@ -41,7 +41,7 @@ define copy-tests-in-batch $(hide) $(foreach p, $(1),\ $(eval pair := $(subst :,$(space),$(p)))\ mkdir -p $(dir $(word 2,$(pair)));\ - cp -rf $(word 1,$(pair)) $(word 2,$(pair));) + cp -Rf $(word 1,$(pair)) $(word 2,$(pair));) endef my_package_zip := $(my_staging_dir)/$(my_package_name).zip @@ -58,5 +58,5 @@ $(my_package_zip) : $(my_built_modules) $(call copy-tests-in-batch,$(wordlist 1001,1200,$(PRIVATE_COPY_PAIRS))) $(call copy-tests-in-batch,$(wordlist 1201,9999,$(PRIVATE_COPY_PAIRS))) $(hide) $(foreach f, $(PRIVATE_PICKUP_FILES),\ - cp -rf $(f) $(dir $@);) - $(hide) cd $(dir $@) && zip -rq $(notdir $@) * + cp -RfL $(f) $(dir $@);) + $(hide) cd $(dir $@) && zip -rqX $(notdir $@) * diff --git a/core/tasks/vendor_module_check.mk b/core/tasks/vendor_module_check.mk index d8e8ec73e..e3761aec5 100644 --- a/core/tasks/vendor_module_check.mk +++ b/core/tasks/vendor_module_check.mk @@ -22,8 +22,10 @@ _vendor_owner_whitelist := \ broadcom \ csr \ elan \ + fpc \ google \ htc \ + huawei \ imgtec \ invensense \ intel \ @@ -41,6 +43,7 @@ _vendor_owner_whitelist := \ synaptics \ ti \ trusted_logic \ + verizon \ widevine diff --git a/target/product/runtime_libdvm_default.mk b/core/tasks/vts.mk similarity index 65% rename from target/product/runtime_libdvm_default.mk rename to core/tasks/vts.mk index b581ce5ec..507f22ea8 100644 --- a/target/product/runtime_libdvm_default.mk +++ b/core/tasks/vts.mk @@ -1,5 +1,4 @@ -# -# Copyright (C) 2013 The Android Open Source Project +# Copyright (C) 2016 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. @@ -12,10 +11,13 @@ # 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. -# -# Set Dalvik as the default runtime environment +test_suite_name := vts +test_suite_tradefed := vts-tradefed +test_suite_readme := test/vts/README.md -DALVIK_VM_LIB := libdvm.so +include $(BUILD_SYSTEM)/tasks/tools/compatibility.mk -include $(SRC_TARGET_DIR)/product/runtime_libdvm.mk +.PHONY: vts +vts: $(compatibility_zip) +$(call dist-for-goals, vts, $(compatibility_zip)) diff --git a/core/version_defaults.mk b/core/version_defaults.mk index d87a03238..7c9634490 100644 --- a/core/version_defaults.mk +++ b/core/version_defaults.mk @@ -24,6 +24,8 @@ # DEFAULT_APP_TARGET_SDK # BUILD_ID # BUILD_NUMBER +# BUILD_DATETIME +# PLATFORM_SECURITY_PATCH # # Look for an optional file containing overrides of the defaults, @@ -41,7 +43,16 @@ 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 + + # When you add a new PLATFORM_VERSION which will result in a new + # PLATFORM_SDK_VERSION please ensure you add a corresponding isAtLeast* + # method in the following java file: + # frameworks/support/compat/gingerbread/android/support/v4/os/BuildCompat.java + + # When you change PLATFORM_VERSION for a given PLATFORM_SDK_VERSION + # please add that PLATFORM_VERSION to the following text file: + # cts/tests/tests/os/assets/platform_versions.txt + PLATFORM_VERSION := 7.1.2 endif ifeq "" "$(PLATFORM_SDK_VERSION)" @@ -53,7 +64,24 @@ ifeq "" "$(PLATFORM_SDK_VERSION)" # intermediate builds). During development, this number remains at the # SDK version the branch is based on and PLATFORM_VERSION_CODENAME holds # the code-name of the new development work. - PLATFORM_SDK_VERSION := 22 + + # When you change PLATFORM_SDK_VERSION please ensure you also update the + # corresponding methods for isAtLeast* in the following java file: + # frameworks/support/compat/gingerbread/android/support/v4/os/BuildCompat.java + + # When you increment the PLATFORM_SDK_VERSION please ensure you also + # clear out the following text file of all older PLATFORM_VERSION's: + # cts/tests/tests/os/assets/platform_versions.txt + PLATFORM_SDK_VERSION := 25 +endif + +ifeq "" "$(PLATFORM_JACK_MIN_SDK_VERSION)" + # This is definition of the min SDK version given to Jack for the current + # platform. For released version it should be the same as + # PLATFORM_SDK_VERSION. During development, this number may be incremented + # before PLATFORM_SDK_VERSION if the plateform starts to add new java + # language supports. + PLATFORM_JACK_MIN_SDK_VERSION := 25 endif ifeq "" "$(PLATFORM_VERSION_CODENAME)" @@ -67,6 +95,23 @@ ifeq "" "$(PLATFORM_VERSION_CODENAME)" PLATFORM_VERSION_ALL_CODENAMES := $(PLATFORM_VERSION_CODENAME) endif +ifeq "REL" "$(PLATFORM_VERSION_CODENAME)" + PLATFORM_PREVIEW_SDK_VERSION := 0 +else + ifeq "" "$(PLATFORM_PREVIEW_SDK_VERSION)" + # This is the definition of a preview SDK version over and above the current + # platform SDK version. Unlike the platform SDK version, a higher value + # for preview SDK version does NOT mean that all prior preview APIs are + # included. Packages reading this value to determine compatibility with + # known APIs should check that this value is precisely equal to the preview + # SDK version the package was built for, otherwise it should fall back to + # assuming the device can only support APIs as of the previous official + # public release. + # This value will always be 0 for release builds. + PLATFORM_PREVIEW_SDK_VERSION := 0 + endif +endif + ifeq "" "$(DEFAULT_APP_TARGET_SDK)" # This is the default minSdkVersion and targetSdkVersion to use for # all .apks created by the build system. It can be overridden by explicitly @@ -80,6 +125,23 @@ ifeq "" "$(DEFAULT_APP_TARGET_SDK)" endif endif +ifeq "" "$(PLATFORM_SECURITY_PATCH)" + # Used to indicate the security patch that has been applied to the device. + # It must signify that the build includes all security patches issued up through the designated Android Public Security Bulletin. + # It must be of the form "YYYY-MM-DD" on production devices. + # It must match one of the Android Security Patch Level strings of the Public Security Bulletins. + # If there is no $PLATFORM_SECURITY_PATCH set, keep it empty. + PLATFORM_SECURITY_PATCH := 2017-08-05 +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 @@ -89,6 +151,18 @@ ifeq "" "$(BUILD_ID)" BUILD_ID := UNKNOWN endif +ifeq "" "$(BUILD_DATETIME)" + # Used to reproduce builds by setting the same time. Must be the number + # of seconds since the Epoch. + BUILD_DATETIME := $(shell date +%s) +endif + +ifneq (,$(findstring Darwin,$(shell uname -sm))) +DATE := date -r $(BUILD_DATETIME) +else +DATE := date -d @$(BUILD_DATETIME) +endif + ifeq "" "$(BUILD_NUMBER)" # BUILD_NUMBER should be set to the source control value that # represents the current state of the source code. E.g., a @@ -99,5 +173,5 @@ ifeq "" "$(BUILD_NUMBER)" # If no BUILD_NUMBER is set, create a useful "I am an engineering build # from this date/time" value. Make it start with a non-digit so that # anyone trying to parse it as an integer will probably get "0". - BUILD_NUMBER := eng.$(USER).$(shell date +%Y%m%d.%H%M%S) + BUILD_NUMBER := eng.$(shell echo $${USER:0:6}).$(shell $(DATE) +%Y%m%d.%H%M%S) endif diff --git a/envsetup.sh b/envsetup.sh index d80e95c39..29710ac4b 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -1,54 +1,125 @@ function hmm() { cat <- -- tapas: tapas [ ...] [arm|x86|mips|armv5|arm64|x86_64|mips64] [eng|userdebug|user] -- croot: Changes directory to the top of the tree. -- 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. -- 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. -- jgrep: Greps on all local Java files. -- resgrep: Greps on all local res/*.xml files. -- sgrep: Greps on all local source files. -- godir: Go to the directory containing a file. +- lunch: lunch - +- tapas: tapas [ ...] [arm|x86|mips|armv5|arm64|x86_64|mips64] [eng|userdebug|user] +- croot: Changes directory to the top of the tree. +- 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. +- mmma: Builds all of the modules in the supplied directories, and their dependencies. +- provision: Flash device with all required partitions. Options will be passed on to fastboot. +- cgrep: Greps on all local C/C++ files. +- ggrep: Greps on all local Gradle files. +- jgrep: Greps on all local Java files. +- resgrep: Greps on all local res/*.xml files. +- mangrep: Greps on all local AndroidManifest.xml files. +- mgrep: Greps on all local Makefiles files. +- sepgrep: Greps on all local sepolicy files. +- sgrep: Greps on all local source files. +- godir: Go to the directory containing a file. + +EOF + + __print_cm_functions_help + +cat <=" pairs as a shell script. + build_dicts_script=`\cd $T; export CALLED_FROM_SETUP=true; export BUILD_SYSTEM=build/core; \ + command make --no-print-directory -f build/core/config.mk \ + dump-many-vars \ + DUMP_MANY_VARS="$cached_vars" \ + DUMP_MANY_ABS_VARS="$cached_abs_vars" \ + DUMP_VAR_PREFIX="var_cache_" \ + DUMP_ABS_VAR_PREFIX="abs_var_cache_"` + local ret=$? + if [ $ret -ne 0 ] + then + unset build_dicts_script + return $ret + fi + # Excute the script to store the "=" pairs as shell variables. + eval "$build_dicts_script" + ret=$? + unset build_dicts_script + if [ $ret -ne 0 ] + then + return $ret + fi + BUILD_VAR_CACHE_READY="true" +} + +# Delete the build var cache, so that we can still call into the build system +# to get build variables not listed in this script. +function destroy_build_var_cache() +{ + unset BUILD_VAR_CACHE_READY + for v in $(echo $cached_vars | tr " " "\n"); do + unset var_cache_$v done - echo $A + unset cached_vars + for v in $(echo $cached_abs_vars | tr " " "\n"); do + unset abs_var_cache_$v + done + unset cached_abs_vars } # Get the value of a build variable as an absolute path. function get_abs_build_var() { + if [ "$BUILD_VAR_CACHE_READY" = "true" ] + then + eval echo \"\${abs_var_cache_$1}\" + return + fi + T=$(gettop) if [ ! "$T" ]; then echo "Couldn't locate the top of the tree. Try setting TOP." >&2 return fi - (\cd $T; CALLED_FROM_SETUP=true BUILD_SYSTEM=build/core \ + (\cd $T; export CALLED_FROM_SETUP=true; export BUILD_SYSTEM=build/core; \ command make --no-print-directory -f build/core/config.mk dumpvar-abs-$1) } # Get the exact value of a build variable. function get_build_var() { + if [ "$BUILD_VAR_CACHE_READY" = "true" ] + then + eval echo \"\${var_cache_$1}\" + return + fi + T=$(gettop) if [ ! "$T" ]; then echo "Couldn't locate the top of the tree. Try setting TOP." >&2 return fi - (\cd $T; CALLED_FROM_SETUP=true BUILD_SYSTEM=build/core \ + (\cd $T; export CALLED_FROM_SETUP=true; export BUILD_SYSTEM=build/core; \ command make --no-print-directory -f build/core/config.mk dumpvar-$1) } @@ -60,6 +131,19 @@ 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 "^aopp_") ; then + CM_BUILD=$(echo -n $1 | sed -e 's/^aopp_//g') + export BUILD_NUMBER=$( (date +%s%N ; echo $CM_BUILD; hostname) | openssl sha1 | sed -e 's/.*=//g; s/ //g' | cut -c1-10 ) + elif (echo -n $1 | grep -q -e "^cm_") ; then + # Fall back to cm_ + 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= \ @@ -153,23 +237,8 @@ function setpaths() export ANDROID_TOOLCHAIN_2ND_ARCH=$gccprebuiltdir/$toolchaindir2 fi - unset ANDROID_KERNEL_TOOLCHAIN_PATH - case $ARCH in - arm) - # Legacy toolchain configuration used for ARM kernel compilation - toolchaindir=arm/arm-eabi-$targetgccversion/bin - if [ -d "$gccprebuiltdir/$toolchaindir" ]; then - export ARM_EABI_TOOLCHAIN="$gccprebuiltdir/$toolchaindir" - ANDROID_KERNEL_TOOLCHAIN_PATH="$ARM_EABI_TOOLCHAIN": - fi - ;; - *) - # No need to set ARM_EABI_TOOLCHAIN for other ARCHs - ;; - esac - - export ANDROID_DEV_SCRIPTS=$T/development/scripts:$T/prebuilts/devtools/tools - export ANDROID_BUILD_PATHS=$(get_build_var ANDROID_BUILD_PATHS):$ANDROID_TOOLCHAIN:$ANDROID_TOOLCHAIN_2ND_ARCH:$ANDROID_KERNEL_TOOLCHAIN_PATH$ANDROID_DEV_SCRIPTS: + export ANDROID_DEV_SCRIPTS=$T/development/scripts:$T/prebuilts/devtools/tools:$T/external/selinux/prebuilts/bin + export ANDROID_BUILD_PATHS=$(get_build_var ANDROID_BUILD_PATHS):$ANDROID_TOOLCHAIN:$ANDROID_TOOLCHAIN_2ND_ARCH:$ANDROID_DEV_SCRIPTS: # If prebuilts/android-emulator// exists, prepend it to our PATH # to ensure that the corresponding 'emulator' binaries are used. @@ -190,6 +259,7 @@ function setpaths() fi export PATH=$ANDROID_BUILD_PATHS$PATH + export PYTHONPATH=$T/development/python-packages:$PYTHONPATH unset ANDROID_JAVA_TOOLCHAIN unset ANDROID_PRE_BUILD_PATHS @@ -227,10 +297,11 @@ function set_stuff_for_environment() set_java_home setpaths set_sequence_number + setvariables - 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' + export ASAN_OPTIONS=detect_leaks=0 } function set_sequence_number() @@ -238,6 +309,11 @@ function set_sequence_number() export BUILD_ENV_SEQUENCE_NUMBER=10 } +function setvariables() +{ + export WITH_SU=true +} + function settitle() { if [ "$STAY_OFF_MY_LAWN" = "" ]; then @@ -245,35 +321,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() @@ -325,7 +408,9 @@ function choosetype() fi done + build_build_var_cache set_stuff_for_environment + destroy_build_var_cache } # @@ -339,9 +424,10 @@ function chooseproduct() if [ "x$TARGET_PRODUCT" != x ] ; then default_value=$TARGET_PRODUCT else - default_value=full + default_value=aosp_arm fi + export TARGET_BUILD_APPS= export TARGET_PRODUCT= local ANSWER while [ -z "$TARGET_PRODUCT" ] @@ -369,7 +455,9 @@ function chooseproduct() fi done + build_build_var_cache set_stuff_for_environment + destroy_build_var_cache } function choosevariant() @@ -432,8 +520,10 @@ function choosecombo() choosevariant $3 echo + build_build_var_cache set_stuff_for_environment printconfig + destroy_build_var_cache } # Clear this variable. It will be built up again when the vendorsetup.sh @@ -465,15 +555,25 @@ function print_lunch_menu() echo echo "You're building on" $uname echo - echo "Lunch menu... pick a combo:" + if [ "z${CM_DEVICES_ONLY}" != "z" ]; then + echo "Breakfast and brunch menu... pick a combo:" + echo "" + else + echo "Lunch menu... pick a combo:" + echo "" + 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 } @@ -481,6 +581,7 @@ function print_lunch_menu() function lunch() { local answer + LUNCH_MENU_CHOICES=($(for l in ${LUNCH_MENU_CHOICES[@]}; do echo "$l"; done | sort)) if [ "$1" ] ; then answer=$1 @@ -515,24 +616,42 @@ function lunch() export TARGET_BUILD_APPS= + local variant=$(echo -n $selection | sed -e "s/^[^\-]*-//") + check_variant $variant + if [ $? -ne 0 ] + then + echo + echo "** Invalid variant: '$variant'" + echo "** Must be one of ${VARIANT_CHOICES[@]}" + variant= + fi + local product=$(echo -n $selection | sed -e "s/-.*$//") check_product $product if [ $? -ne 0 ] then - echo - echo "** Don't have a product spec for: '$product'" - echo "** Do you have the right repo manifest?" - product= + # if we can't find a product, try to grab it off the CM github + T=$(gettop) + cd $T > /dev/null + vendor/cm/build/tools/roomservice.py $product + cd - > /dev/null + check_product $product + else + T=$(gettop) + cd $T > /dev/null + vendor/cm/build/tools/roomservice.py $product true + cd - > /dev/null fi + TARGET_PRODUCT=$product \ + TARGET_BUILD_VARIANT=$variant \ + build_build_var_cache - local variant=$(echo -n $selection | sed -e "s/^[^\-]*-//") - check_variant $variant if [ $? -ne 0 ] then echo - echo "** Invalid variant: '$variant'" - echo "** Must be one of ${VARIANT_CHOICES[@]}" - variant= + echo "** Don't have a product spec for: '$product'" + echo "** Do you have the right repo manifest?" + product= fi if [ -z "$product" -o -z "$variant" ] @@ -547,8 +666,11 @@ function lunch() echo + fixup_common_out_dir + set_stuff_for_environment printconfig + destroy_build_var_cache } # Tab completion for lunch. @@ -562,7 +684,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) @@ -586,10 +708,10 @@ function tapas() return fi - local product=full + local product=aosp_arm case $arch in - x86) product=full_x86;; - mips) product=full_mips;; + x86) product=aosp_x86;; + mips) product=aosp_mips;; armv5) product=generic_armv5;; arm64) product=aosp_arm64;; x86_64) product=aosp_x86_64;; @@ -611,8 +733,10 @@ function tapas() export TARGET_BUILD_TYPE=release export TARGET_BUILD_APPS=$apps + build_build_var_cache set_stuff_for_environment printconfig + destroy_build_var_cache } function gettop @@ -664,6 +788,7 @@ function m() $DRV make -C $T -f build/core/main.mk $@ else echo "Couldn't locate the top of the tree. Try setting TOP." + return 1 fi } @@ -697,13 +822,14 @@ function mm() local M=$(findmakefile) local MODULES= local GET_INSTALL_PATH= - local ARGS= # Remove the path to top as the makefilepath needs to be relative local M=`echo $M|sed 's:'$T'/::'` if [ ! "$T" ]; then echo "Couldn't locate the top of the tree. Try setting TOP." + return 1 elif [ ! "$M" ]; then echo "Couldn't locate a makefile from the current directory." + return 1 else for ARG in $@; do case $ARG in @@ -712,12 +838,12 @@ function mm() done if [ -n "$GET_INSTALL_PATH" ]; then MODULES= - ARGS=GET-INSTALL-PATH + # set all args to 'GET-INSTALL-PATH' + set -- GET-INSTALL-PATH else MODULES=all_modules - ARGS=$@ fi - ONE_SHOT_MAKEFILE=$M $DRV make -C $T -f build/core/main.mk $MODULES $ARGS + ONE_SHOT_MAKEFILE=$M $DRV make -C $T -f build/core/main.mk $MODULES "$@" fi fi } @@ -732,8 +858,15 @@ function mmm() local ARGS= local DIR TO_CHOP local GET_INSTALL_PATH= - local DASH_ARGS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^-.*$/') - local DIRS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^[^-].*$/') + + if [ "$(__detect_shell)" = "zsh" ]; then + set -lA DASH_ARGS $(echo "$@" | awk -v RS=" " -v ORS=" " '/^-.*$/') + set -lA DIRS $(echo "$@" | awk -v RS=" " -v ORS=" " '/^[^-].*$/') + else + local DASH_ARGS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^-.*$/') + local DIRS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^[^-].*$/') + fi + for DIR in $DIRS ; do MODULES=`echo $DIR | sed -n -e 's/.*:\(.*$\)/\1/p' | sed 's/,/ /'` if [ "$MODULES" = "" ]; then @@ -753,9 +886,14 @@ function mmm() MAKEFILE="$MAKEFILE $MFILE" else case $DIR in - showcommands | snod | dist | incrementaljavac) ARGS="$ARGS $DIR";; + showcommands | snod | dist | *=*) 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 @@ -766,6 +904,7 @@ function mmm() ONE_SHOT_MAKEFILE="$MAKEFILE" $DRV make -C $T -f build/core/main.mk $DASH_ARGS $MODULES $ARGS else echo "Couldn't locate the top of the tree. Try setting TOP." + return 1 fi } @@ -778,9 +917,13 @@ function mma() else if [ ! "$T" ]; then echo "Couldn't locate the top of the tree. Try setting TOP." + return 1 fi local MY_PWD=`PWD= /bin/pwd|sed 's:'$T'/::'` - $DRV make -C $T -f build/core/main.mk $@ all_modules BUILD_MODULES_IN_PATHS="$MY_PWD" + local MODULES_IN_PATHS=MODULES-IN-$MY_PWD + # Convert "/" to "-". + MODULES_IN_PATHS=${MODULES_IN_PATHS//\//-} + $DRV make -C $T -f build/core/main.mk $@ $MODULES_IN_PATHS fi } @@ -789,8 +932,13 @@ function mmma() local T=$(gettop) local DRV=$(getdriver $T) if [ "$T" ]; then - local DASH_ARGS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^-.*$/') - local DIRS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^[^-].*$/') + if [ "$(__detect_shell)" = "zsh" ]; then + set -lA DASH_ARGS $(echo "$@" | awk -v RS=" " -v ORS=" " '/^-.*$/') + set -lA DIRS $(echo "$@" | awk -v RS=" " -v ORS=" " '/^[^-].*$/') + else + local DASH_ARGS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^-.*$/') + local DIRS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^[^-].*$/') + fi local MY_PWD=`PWD= /bin/pwd` if [ "$MY_PWD" = "$T" ]; then MY_PWD= @@ -798,25 +946,30 @@ function mmma() MY_PWD=`echo $MY_PWD|sed 's:'$T'/::'` fi local DIR= - local MODULE_PATHS= + local MODULES_IN_PATHS= local ARGS= for DIR in $DIRS ; do if [ -d $DIR ]; then - if [ "$MY_PWD" = "" ]; then - MODULE_PATHS="$MODULE_PATHS $DIR" - else - MODULE_PATHS="$MODULE_PATHS $MY_PWD/$DIR" + # Remove the leading ./ and trailing / if any exists. + DIR=${DIR#./} + DIR=${DIR%/} + if [ "$MY_PWD" != "" ]; then + DIR=$MY_PWD/$DIR fi + MODULES_IN_PATHS="$MODULES_IN_PATHS MODULES-IN-$DIR" else case $DIR in - showcommands | snod | dist | incrementaljavac) ARGS="$ARGS $DIR";; + showcommands | snod | dist | *=*) ARGS="$ARGS $DIR";; *) echo "Couldn't find directory $DIR"; return 1;; esac fi done - $DRV make -C $T -f build/core/main.mk $DASH_ARGS $ARGS all_modules BUILD_MODULES_IN_PATHS="$MODULE_PATHS" + # Convert "/" to "-". + MODULES_IN_PATHS=${MODULES_IN_PATHS//\//-} + $DRV make -C $T -f build/core/main.mk $DASH_ARGS $ARGS $MODULES_IN_PATHS else echo "Couldn't locate the top of the tree. Try setting TOP." + return 1 fi } @@ -857,18 +1010,18 @@ function qpid() { append='$' shift elif [ "$1" = "--help" -o "$1" = "-h" ]; then - echo "usage: qpid [[--exact] " - return 255 - fi + echo "usage: qpid [[--exact] " + return 255 + fi local EXE="$1" if [ "$EXE" ] ; then - qpid | \grep "$prepend$EXE$append" - else - adb shell ps \ - | tr -d '\r' \ - | sed -e 1d -e 's/^[^ ]* *\([0-9]*\).* \([^ ]*\)$/\1 \2/' - fi + qpid | \grep "$prepend$EXE$append" + else + adb shell ps \ + | tr -d '\r' \ + | sed -e 1d -e 's/^[^ ]* *\([0-9]*\).* \([^ ]*\)$/\1 \2/' + fi } function pid() @@ -889,7 +1042,7 @@ function pid() echo "$PID" else echo "usage: pid [--exact] " - return 255 + return 255 fi } @@ -902,25 +1055,25 @@ function pid() function coredump_setup() { - echo "Getting root..."; - adb root; - adb wait-for-device; + echo "Getting root..."; + adb root; + adb wait-for-device; - echo "Remounting root parition read-write..."; - adb shell mount -w -o remount -t rootfs rootfs; - sleep 1; - adb wait-for-device; - adb shell mkdir -p /cores; - adb shell mount -t tmpfs tmpfs /cores; - adb shell chmod 0777 /cores; + echo "Remounting root partition read-write..."; + adb shell mount -w -o remount -t rootfs rootfs; + sleep 1; + adb wait-for-device; + adb shell mkdir -p /cores; + adb shell mount -t tmpfs tmpfs /cores; + adb shell chmod 0777 /cores; - echo "Granting SELinux permission to dump in /cores..."; - adb shell restorecon -R /cores; + echo "Granting SELinux permission to dump in /cores..."; + adb shell restorecon -R /cores; - echo "Set core pattern."; - adb shell 'echo /cores/core.%p > /proc/sys/kernel/core_pattern'; + echo "Set core pattern."; + adb shell 'echo /cores/core.%p > /proc/sys/kernel/core_pattern'; - echo "Done." + echo "Done." } # coredump_enable - enable core dumps for the specified process @@ -931,13 +1084,13 @@ function coredump_setup() function coredump_enable() { - local PID=$1; - if [ -z "$PID" ]; then - printf "Expecting a PID!\n"; - return; - fi; - echo "Setting core limit for $PID to infinite..."; - adb shell prlimit $PID 4 -1 -1 + local PID=$1; + if [ -z "$PID" ]; then + printf "Expecting a PID!\n"; + return; + fi; + echo "Setting core limit for $PID to infinite..."; + adb shell prlimit $PID 4 -1 -1 } # core - send SIGV and pull the core for process @@ -948,28 +1101,28 @@ function coredump_enable() function core() { - local PID=$1; + local PID=$1; - if [ -z "$PID" ]; then - printf "Expecting a PID!\n"; - return; - fi; + if [ -z "$PID" ]; then + printf "Expecting a PID!\n"; + return; + fi; - local CORENAME=core.$PID; - local COREPATH=/cores/$CORENAME; - local SIG=SEGV; + local CORENAME=core.$PID; + local COREPATH=/cores/$CORENAME; + local SIG=SEGV; - coredump_enable $1; + coredump_enable $1; - local done=0; - while [ $(adb shell "[ -d /proc/$PID ] && echo -n yes") ]; do - printf "\tSending SIG%s to %d...\n" $SIG $PID; - adb shell kill -$SIG $PID; - sleep 1; - done; + local done=0; + while [ $(adb shell "[ -d /proc/$PID ] && echo -n yes") ]; do + printf "\tSending SIG%s to %d...\n" $SIG $PID; + adb shell kill -$SIG $PID; + sleep 1; + done; - adb shell "while [ ! -f $COREPATH ] ; do echo waiting for $COREPATH to be generated; sleep 1; done" - echo "Done: core is under $COREPATH on device."; + adb shell "while [ ! -f $COREPATH ] ; do echo waiting for $COREPATH to be generated; sleep 1; done" + echo "Done: core is under $COREPATH on device."; } # systemstack - dump the current stack trace of all threads in the system process @@ -1027,18 +1180,6 @@ function stacks() fi } -function gdbwrapper() -{ - local GDB_CMD="$1" - shift 1 - $GDB_CMD -x "$@" -} - -function get_symbols_directory() -{ - echo $(get_abs_build_var TARGET_OUT_UNSTRIPPED) -} - # Read the ELF header from /proc/$PID/exe to determine if the process is # 64-bit. function is64bit() @@ -1055,263 +1196,20 @@ function is64bit() fi } -function adb_get_product_device() { - echo `adb shell getprop ro.product.device | sed s/.$//` -} - -# returns 0 when process is not traced -function adb_get_traced_by() { - echo `adb shell cat /proc/$1/status | grep -e "^TracerPid:" | sed "s/^TracerPid:\t//" | sed s/.$//` -} - -function gdbclient() { - # TODO: - # 1. Check for ANDROID_SERIAL/multiple devices - local PROCESS_NAME="n/a" - local PID=$1 - local PORT=5039 - if [ -z "$PID" ]; then - echo "Usage: gdbclient [port number]" - return -1 - fi - local DEVICE=$(adb_get_product_device) - - if [ -z "$DEVICE" ]; then - echo "Error: Unable to get device name. Please check if device is connected and ANDROID_SERIAL is set." - return -2 - fi - - if [ -n "$2" ]; then - PORT=$2 - fi - - local ROOT=$(gettop) - if [ -z "$ROOT" ]; then - # This is for the situation with downloaded symbols (from the build server) - # we check if they are available. - ROOT=`realpath .` - fi - - local OUT_ROOT="$ROOT/out/target/product/$DEVICE" - local SYMBOLS_DIR="$OUT_ROOT/symbols" - - if [ ! -d $SYMBOLS_DIR ]; then - echo "Error: couldn't find symbols: $SYMBOLS_DIR does not exist or is not a directory." - return -3 - fi - - # let's figure out which executable we are about to debug - - # check if user specified a name -> resolve to pid - if [[ ! "$PID" =~ ^[0-9]+$ ]] ; then - PROCESS_NAME=$PID - PID=$(pid --exact $PROCESS_NAME) - if [ -z "$PID" ]; then - echo "Error: couldn't resolve pid by process name: $PROCESS_NAME" - return -4 - fi - fi - - local EXE=`adb shell readlink /proc/$PID/exe | sed s/.$//` - # TODO: print error in case there is no such pid - local LOCAL_EXE_PATH=$SYMBOLS_DIR$EXE - - if [ ! -f $LOCAL_EXE_PATH ]; then - echo "Error: unable to find symbols for executable $EXE: file $LOCAL_EXE_PATH does not exist" - return -5 - fi - - local USE64BIT="" - - if [[ "$(file $LOCAL_EXE_PATH)" =~ 64-bit ]]; then - USE64BIT="64" - fi - - local GDB= - local GDB64= - local CPU_ABI=`adb shell getprop ro.product.cpu.abilist | sed s/.$//` - # TODO: we assume these are available via $PATH - if [[ $CPU_ABI =~ (^|,)arm64 ]]; then - GDB=arm-linux-androideabi-gdb - GDB64=aarch64-linux-android-gdb - elif [[ $CPU_ABI =~ (^|,)arm ]]; then - GDB=arm-linux-androideabi-gdb - elif [[ $CPU_ABI =~ (^|,)x86_64 ]]; then - GDB=x86_64-linux-androideabi-gdb - elif [[ $CPU_ABI =~ (^|,)x86 ]]; then - GDB=x86_64-linux-androideabi-gdb - elif [[ $CPU_ABI =~ (^|,)mips64 ]]; then - GDB=mipsel-linux-android-gdb - GDB64=mips64el-linux-android-gdb - elif [[ $CPU_ABI =~ (^|,)mips ]]; then - GDB=mipsel-linux-android-gdb - else - echo "Error: unrecognized cpu.abilist: $CPU_ABI" - return -6 - fi - - # TODO: check if tracing process is gdbserver and not some random strace... - if [ $(adb_get_traced_by $PID) -eq 0 ]; then - # start gdbserver - echo "Starting gdbserver..." - # TODO: check if adb is already listening $PORT - # to avoid unnecessary calls - echo ". adb forward for port=$PORT..." - adb forward tcp:$PORT tcp:$PORT - echo ". starting gdbserver to attach to pid=$PID..." - adb shell gdbserver$USE64BIT :$PORT --attach $PID & - echo ". give it couple of seconds to start..." - sleep 2 - echo ". done" - else - echo "It looks like gdbserver is already attached to $PID (process is traced), trying to connect to it using local port=$PORT" - fi - - local OUT_SO_SYMBOLS=$SYMBOLS_DIR/system/lib$USE64BIT - local OUT_VENDOR_SO_SYMBOLS=$SYMBOLS_DIR/vendor/lib$USE64BIT - local ART_CMD="" - - echo >|"$OUT_ROOT/gdbclient.cmds" "set solib-absolute-prefix $SYMBOLS_DIR" - 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" - local DALVIK_GDB_SCRIPT=$ROOT/development/scripts/gdb/dalvik.gdb - if [ -f $DALVIK_GDB_SCRIPT ]; then - echo >>"$OUT_ROOT/gdbclient.cmds" "source $DALVIK_GDB_SCRIPT" - ART_CMD="art-on" - else - echo "Warning: couldn't find $DALVIK_GDB_SCRIPT - ART debugging options will not be available" - fi - echo >>"$OUT_ROOT/gdbclient.cmds" "target remote :$PORT" - if [[ $EXE =~ (^|/)(app_process|dalvikvm)(|32|64)$ ]]; then - echo >> "$OUT_ROOT/gdbclient.cmds" $ART_CMD - fi - - echo >>"$OUT_ROOT/gdbclient.cmds" "" - - local WHICH_GDB=$GDB - - if [ -n "$USE64BIT" -a -n "$GDB64" ]; then - WHICH_GDB=$GDB64 - fi - - gdbwrapper $WHICH_GDB "$OUT_ROOT/gdbclient.cmds" "$LOCAL_EXE_PATH" -} - -# gdbclient now determines whether the user wants to debug a 32-bit or 64-bit -# executable, set up the approriate gdbserver, then invokes the proper host -# gdb. -function gdbclient_old() -{ - 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 - - gdbwrapper $WHICH_GDB "$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() { - find -E . -name .repo -prune -o -name .git -prune -o -type f -iregex '.*\.(c|h|cc|cpp|S|java|xml|sh|mk|aidl)' -print0 | xargs -0 grep --color -n "$@" + find -E . -name .repo -prune -o -name .git -prune -o -type f -iregex '.*\.(c|h|cc|cpp|S|java|xml|sh|mk|aidl|vts)' \ + -exec grep --color -n "$@" {} + } ;; *) function sgrep() { - find . -name .repo -prune -o -name .git -prune -o -type f -iregex '.*\.\(c\|h\|cc\|cpp\|S\|java\|xml\|sh\|mk\|aidl\)' -print0 | xargs -0 grep --color -n "$@" + find . -name .repo -prune -o -name .git -prune -o -type f -iregex '.*\.\(c\|h\|cc\|cpp\|S\|java\|xml\|sh\|mk\|aidl\|vts\)' \ + -exec grep --color -n "$@" {} + } ;; esac @@ -1323,56 +1221,73 @@ function gettargetarch function ggrep() { - find . -name .repo -prune -o -name .git -prune -o -name out -prune -o -type f -name "*\.gradle" -print0 | xargs -0 grep --color -n "$@" + find . -name .repo -prune -o -name .git -prune -o -name out -prune -o -type f -name "*\.gradle" \ + -exec grep --color -n "$@" {} + } function jgrep() { - find . -name .repo -prune -o -name .git -prune -o -name out -prune -o -type f -name "*\.java" -print0 | xargs -0 grep --color -n "$@" + find . -name .repo -prune -o -name .git -prune -o -name out -prune -o -type f -name "*\.java" \ + -exec grep --color -n "$@" {} + } function cgrep() { - find . -name .repo -prune -o -name .git -prune -o -name out -prune -o -type f \( -name '*.c' -o -name '*.cc' -o -name '*.cpp' -o -name '*.h' \) -print0 | xargs -0 grep --color -n "$@" + find . -name .repo -prune -o -name .git -prune -o -name out -prune -o -type f \( -name '*.c' -o -name '*.cc' -o -name '*.cpp' -o -name '*.h' -o -name '*.hpp' \) \ + -exec grep --color -n "$@" {} + } function resgrep() { - for dir in `find . -name .repo -prune -o -name .git -prune -o -name out -prune -o -name res -type d`; do find $dir -type f -name '*\.xml' -print0 | xargs -0 grep --color -n "$@"; done; + for dir in `find . -name .repo -prune -o -name .git -prune -o -name out -prune -o -name res -type d`; do + find $dir -type f -name '*\.xml' -exec grep --color -n "$@" {} + + done } function mangrep() { - find . -name .repo -prune -o -name .git -prune -o -path ./out -prune -o -type f -name 'AndroidManifest.xml' -print0 | xargs -0 grep --color -n "$@" + find . -name .repo -prune -o -name .git -prune -o -path ./out -prune -o -type f -name 'AndroidManifest.xml' \ + -exec grep --color -n "$@" {} + } function sepgrep() { - find . -name .repo -prune -o -name .git -prune -o -path ./out -prune -o -name sepolicy -type d -print0 | xargs -0 grep --color -n -r --exclude-dir=\.git "$@" + find . -name .repo -prune -o -name .git -prune -o -path ./out -prune -o -name sepolicy -type d \ + -exec grep --color -n -r --exclude-dir=\.git "$@" {} + +} + +function rcgrep() +{ + find . -name .repo -prune -o -name .git -prune -o -name out -prune -o -type f -name "*\.rc*" \ + -exec grep --color -n "$@" {} + } case `uname -s` in Darwin) function mgrep() { - find -E . -name .repo -prune -o -name .git -prune -o -path ./out -prune -o -type f -iregex '.*/(Makefile|Makefile\..*|.*\.make|.*\.mak|.*\.mk)' -print0 | xargs -0 grep --color -n "$@" + find -E . -name .repo -prune -o -name .git -prune -o -path ./out -prune -o -type f -iregex '.*/(Makefile|Makefile\..*|.*\.make|.*\.mak|.*\.mk)' \ + -exec grep --color -n "$@" {} + } function treegrep() { - find -E . -name .repo -prune -o -name .git -prune -o -type f -iregex '.*\.(c|h|cpp|S|java|xml)' -print0 | xargs -0 grep --color -n -i "$@" + find -E . -name .repo -prune -o -name .git -prune -o -type f -iregex '.*\.(c|h|cpp|S|java|xml)' \ + -exec grep --color -n -i "$@" {} + } ;; *) function mgrep() { - find . -name .repo -prune -o -name .git -prune -o -path ./out -prune -o -regextype posix-egrep -iregex '(.*\/Makefile|.*\/Makefile\..*|.*\.make|.*\.mak|.*\.mk)' -type f -print0 | xargs -0 grep --color -n "$@" + find . -name .repo -prune -o -name .git -prune -o -path ./out -prune -o -regextype posix-egrep -iregex '(.*\/Makefile|.*\/Makefile\..*|.*\.make|.*\.mak|.*\.mk)' -type f \ + -exec grep --color -n "$@" {} + } function treegrep() { - find . -name .repo -prune -o -name .git -prune -o -regextype posix-egrep -iregex '.*\.(c|h|cpp|S|java|xml)' -type f -print0 | xargs -0 grep --color -n -i "$@" + find . -name .repo -prune -o -name .git -prune -o -regextype posix-egrep -iregex '.*\.(c|h|cpp|S|java|xml)' -type f \ + -exec grep --color -n -i "$@" {} + } ;; @@ -1593,14 +1508,20 @@ function godir () { return fi T=$(gettop) - if [[ ! -f $T/filelist ]]; then + if [ ! "$OUT_DIR" = "" ]; then + mkdir -p $OUT_DIR + FILELIST=$OUT_DIR/filelist + else + FILELIST=$T/filelist + fi + if [[ ! -f $FILELIST ]]; then echo -n "Creating index..." - (\cd $T; find . -wholename ./out -prune -o -wholename ./.repo -prune -o -type f > filelist) + (\cd $T; find . -wholename ./out -prune -o -wholename ./.repo -prune -o -type f > $FILELIST) echo " Done" echo "" fi local lines - lines=($(\grep "$1" $T/filelist | sed -e 's/\/[^/]*$//' | sort | uniq)) + lines=($(\grep "$1" $FILELIST | sed -e 's/\/[^/]*$//' | sort | uniq)) if [[ ${#lines[@]} = 0 ]]; then echo "Not found" return @@ -1631,11 +1552,7 @@ function godir () { \cd $T/$pathname } -# 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). -# For some reason, installing the JDK doesn't make it show up in the -# JavaVM.framework/Versions/1.7/ folder. +# Force JAVA_HOME to point to java 1.7/1.8 if it isn't already set. function set_java_home() { # Clear the existing JAVA_HOME value if we set it ourselves, so that # we can reset it later, depending on the version of java the build @@ -1648,22 +1565,23 @@ function set_java_home() { fi if [ ! "$JAVA_HOME" ]; then - if [ -n "$LEGACY_USE_JAVA6" ]; then + if [ -n "$LEGACY_USE_JAVA7" ]; then + echo Warning: Support for JDK 7 will be dropped. Switch to JDK 8. case `uname -s` in Darwin) - export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home + export JAVA_HOME=$(/usr/libexec/java_home -v 1.7) ;; *) - export JAVA_HOME=/usr/lib/jvm/java-6-sun + export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64 ;; esac else case `uname -s` in Darwin) - export JAVA_HOME=$(/usr/libexec/java_home -v 1.7) + export JAVA_HOME=$(/usr/libexec/java_home -v 1.8) ;; *) - export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64 + export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 ;; esac fi @@ -1680,9 +1598,9 @@ function pez { local retval=$? if [ $retval -ne 0 ] then - echo -e "\e[0;31mFAILURE\e[00m" + echo $'\E'"[0;31mFAILURE\e[00m" else - echo -e "\e[0;32mSUCCESS\e[00m" + echo $'\E'"[0;32mSUCCESS\e[00m" fi return $retval } @@ -1692,21 +1610,31 @@ 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)) local hours=$(($tdiff / 3600 )) local mins=$((($tdiff % 3600) / 60)) local secs=$(($tdiff % 60)) + local ncolors=$(tput colors 2>/dev/null) + if [ -n "$ncolors" ] && [ $ncolors -ge 8 ]; then + color_failed=$'\E'"[0;31m" + color_success=$'\E'"[0;32m" + color_reset=$'\E'"[00m" + else + color_failed="" + color_success="" + color_reset="" + fi echo if [ $ret -eq 0 ] ; then - echo -n -e "#### make completed successfully " + echo -n "${color_success}#### make completed successfully " else - echo -n -e "#### make failed to build some targets " + echo -n "${color_failed}#### make failed to build some targets " fi if [ $hours -gt 0 ] ; then printf "(%02g:%02g:%02g (hh:mm:ss))" $hours $mins $secs @@ -1715,30 +1643,89 @@ function make() elif [ $secs -gt 0 ] ; then printf "(%s seconds)" $secs fi - echo -e " ####" + echo " ####${color_reset}" echo return $ret } +function provision() +{ + if [ ! "$ANDROID_PRODUCT_OUT" ]; then + echo "Couldn't locate output files. Try running 'lunch' first." >&2 + return 1 + fi + if [ ! -e "$ANDROID_PRODUCT_OUT/provision-device" ]; then + echo "There is no provisioning script for the device." >&2 + return 1 + fi + + # Check if user really wants to do this. + if [ "$1" = "--no-confirmation" ]; then + shift 1 + else + echo "This action will reflash your device." + echo "" + echo "ALL DATA ON THE DEVICE WILL BE IRREVOCABLY ERASED." + echo "" + echo -n "Are you sure you want to do this (yes/no)? " + read + if [[ "${REPLY}" != "yes" ]] ; then + echo "Not taking any action. Exiting." >&2 + return 1 + fi + fi + "$ANDROID_PRODUCT_OUT/provision-device" "$@" +} +function make() +{ + mk_timer $(get_make_command) "$@" +} -if [ "x$SHELL" != "x/bin/bash" ]; then +function __detect_shell() { case `ps -o command -p $$` in *bash*) + echo bash + ;; + *zsh*) + echo zsh ;; *) - echo "WARNING: Only bash is supported, use of other shell would lead to erroneous results" + echo unknown + return 1 ;; esac + return +} + + +if ! __detect_shell > /dev/null; then + echo "WARNING: Only bash and zsh are supported, use of other shell may lead to erroneous results" fi # Execute the contents of any vendorsetup.sh files we can find. -for f in `test -d device && find -L device -maxdepth 4 -name 'vendorsetup.sh' 2> /dev/null` \ - `test -d vendor && find -L vendor -maxdepth 4 -name 'vendorsetup.sh' 2> /dev/null` +for f in `test -d device && find -L device -maxdepth 4 -name 'vendorsetup.sh' 2> /dev/null | sort` \ + `test -d vendor && find -L vendor -maxdepth 4 -name 'vendorsetup.sh' 2> /dev/null | sort` \ + `test -d product && find -L product -maxdepth 4 -name 'vendorsetup.sh' 2> /dev/null | sort` do echo "including $f" . $f 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) + +. $ANDROID_BUILD_TOP/vendor/cm/build/envsetup.sh diff --git a/libs/host/Android.mk b/libs/host/Android.mk index c67afbbcd..bc25e4b76 100644 --- a/libs/host/Android.mk +++ b/libs/host/Android.mk @@ -4,17 +4,13 @@ include $(CLEAR_VARS) LOCAL_SRC_FILES:= \ CopyFile.c -ifeq ($(HOST_OS),cygwin) -LOCAL_CFLAGS += -DWIN32_EXE -endif -ifeq ($(HOST_OS),darwin) -LOCAL_CFLAGS += -DMACOSX_RSRC -endif -ifeq ($(HOST_OS),linux) -endif +LOCAL_CFLAGS := -Werror -Wall LOCAL_MODULE:= libhost +LOCAL_MODULE_HOST_OS := darwin linux windows LOCAL_C_INCLUDES := $(LOCAL_PATH)/include +LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)/include +LOCAL_CXX_STL := none # acp uses libhost, so we can't use # acp to install libhost. diff --git a/libs/host/CopyFile.c b/libs/host/CopyFile.c index ca5256555..5be012cf3 100644 --- a/libs/host/CopyFile.c +++ b/libs/host/CopyFile.c @@ -24,12 +24,11 @@ #include #include -#ifdef HAVE_MS_C_RUNTIME -# define mkdir(path,mode) _mkdir(path) -#endif - -#ifndef HAVE_SYMLINKS -# define lstat stat +#if defined(_WIN32) +#include /* For _mkdir() */ +# define mkdir(path,mode) _mkdir(path) +# define S_ISLNK(s) 0 +# define lstat stat # ifndef EACCESS /* seems to be missing from the Mingw headers */ # define EACCESS 13 # endif @@ -68,15 +67,13 @@ static bool isSourceNewer(const struct stat* pSrcStat, const struct stat* pDstSt */ static bool isHiresMtime(const struct stat* pSrcStat) { -#if HAVE_STAT_ST_MTIM -#if defined(MACOSX_RSRC) +#if defined(_WIN32) + return 0; +#elif defined(__APPLE__) return pSrcStat->st_mtimespec.tv_nsec > 0; #else return pSrcStat->st_mtim.tv_nsec > 0; #endif -#else - return 0; -#endif } /* @@ -86,7 +83,9 @@ static bool isHiresMtime(const struct stat* pSrcStat) */ static bool isSameFile(const struct stat* pSrcStat, const struct stat* pDstStat) { -#ifndef HAVE_VALID_STAT_ST_INO +#if defined(_WIN32) + (void)pSrcStat; + (void)pDstStat; /* with MSVCRT.DLL, stat always sets st_ino to 0, and there is no simple way to */ /* get the equivalent information with Win32 (Cygwin does some weird stuff in */ /* its winsup/cygwin/fhandler_disk_file.cc to emulate this, too complex for us) */ @@ -104,6 +103,7 @@ static void printCopyMsg(const char* src, const char* dst, unsigned int options) static void printNotNewerMsg(const char* src, const char* dst, unsigned int options) { + (void)src; if ((options & COPY_VERBOSE_MASK) > 1) printf(" '%s' is up-to-date\n", dst); } @@ -184,7 +184,7 @@ static int setPermissions(const char* dst, const struct stat* pSrcStat, unsigned DBUG(("--- unable to set perms on '%s' to 0%o: %s\n", dst, pSrcStat->st_mode & ~(S_IFMT), strerror(errno))); } -#ifndef HAVE_MS_C_RUNTIME +#ifndef _WIN32 /* * Set the owner. */ @@ -262,7 +262,7 @@ static int copyRegular(const char* src, const char* dst, const struct stat* pSrc /* if "force" is set, try removing the destination file and retry */ if (options & COPY_FORCE) { if (unlink(dst) != 0) { -#ifdef HAVE_MS_C_RUNTIME +#ifdef _WIN32 /* MSVCRT.DLL unlink will fail with EACCESS if the file is set read-only */ /* so try to change its mode, and unlink again */ if (errno == EACCESS) { @@ -275,7 +275,7 @@ static int copyRegular(const char* src, const char* dst, const struct stat* pSrc (void) close(srcFd); return -1; } -#ifdef HAVE_MS_C_RUNTIME +#ifdef _WIN32 Open_File: #endif dstFd = open(dst, O_CREAT | O_TRUNC | O_WRONLY | O_BINARY, 0644); @@ -295,7 +295,8 @@ static int copyRegular(const char* src, const char* dst, const struct stat* pSrc if (copyResult != 0) return -1; -#ifdef MACOSX_RSRC +#if defined(__APPLE__) + // Copy Mac OS X resource forks too. { char* srcRsrcName = NULL; char* dstRsrcName = NULL; @@ -339,7 +340,6 @@ static int copyRegular(const char* src, const char* dst, const struct stat* pSrc } -#ifdef HAVE_SYMLINKS /* * Copy a symlink. This only happens if we're in "no derefence" mode, * in which we copy the links rather than the files that are pointed at. @@ -348,6 +348,9 @@ static int copyRegular(const char* src, const char* dst, const struct stat* pSrc * we want to throw it out and replace it. If it's not a symlink, we * need to trash it so we can create one. */ +#if defined(_WIN32) +extern int copySymlink(const char* src, const char* dst, const struct stat* pSrcStat, unsigned int options) __attribute__((error("no symlinks on Windows"))); +#else static int copySymlink(const char* src, const char* dst, const struct stat* pSrcStat, unsigned int options) { struct stat dstStat; @@ -422,7 +425,7 @@ static int copySymlink(const char* src, const char* dst, const struct stat* pSrc return 0; } -#endif /* HAVE_SYMLINKS */ +#endif /* * Copy the contents of one directory to another. Both "src" and "dst" @@ -535,6 +538,7 @@ static int copyFileRecursive(const char* src, const char* dst, bool isCmdLine, u struct stat srcStat; int retVal = 0; int statResult, statErrno; + (void)isCmdLine; /* * Stat the source file. If it doesn't exist, fail. @@ -545,57 +549,6 @@ static int copyFileRecursive(const char* src, const char* dst, bool isCmdLine, u statResult = stat(src, &srcStat); statErrno = errno; /* preserve across .exe attempt */ -#ifdef WIN32_EXE - /* - * Here's the interesting part. Under Cygwin, if you have a file - * called "foo.exe", stat("foo", ...) will succeed, but open("foo", ...) - * will fail. We need to figure out what its name is supposed to be - * so we can create the correct destination file. - * - * If we don't have the "-e" flag set, we want "acp foo bar" to fail, - * not automatically find "foo.exe". That way, if we really were - * trying to copy "foo", it doesn't grab something we don't want. - */ - if (isCmdLine && statResult == 0) { - int tmpFd; - tmpFd = open(src, O_RDONLY | O_BINARY, 0); - if (tmpFd < 0) { - statResult = -1; - statErrno = ENOENT; - } else { - (void) close(tmpFd); - } - } - - /* - * If we didn't find the file, try it again with ".exe". - */ - if (isCmdLine && statResult < 0 && statErrno == ENOENT && (options & COPY_TRY_EXE)) { - srcExe = malloc(strlen(src) + 4 +1); - strcpy(srcExe, src); - strcat(srcExe, ".exe"); - - if (options & COPY_NO_DEREFERENCE) - statResult = lstat(srcExe, &srcStat); - else - statResult = stat(srcExe, &srcStat); - - if (statResult == 0 && !S_ISREG(srcStat.st_mode)) - statResult = -1; /* fail, use original statErrno below */ - - if (statResult == 0) { - /* found a .exe, copy that instead */ - dstExe = malloc(strlen(dst) + 4 +1); - strcpy(dstExe, dst); - strcat(dstExe, ".exe"); - - src = srcExe; - dst = dstExe; - } else { - DBUG(("--- couldn't find '%s' either\n", srcExe)); - } - } -#endif if (statResult < 0) { if (statErrno == ENOENT) fprintf(stderr, "acp: file '%s' does not exist\n", src); @@ -618,10 +571,8 @@ static int copyFileRecursive(const char* src, const char* dst, bool isCmdLine, u } else { retVal = copyDirectory(src, dst, &srcStat, options); } -#ifdef HAVE_SYMLINKS } else if (S_ISLNK(srcStat.st_mode)) { retVal = copySymlink(src, dst, &srcStat, options); -#endif } else if (S_ISREG(srcStat.st_mode)) { retVal = copyRegular(src, dst, &srcStat, options); } else { diff --git a/libs/host/include/host/Directories.h b/libs/host/include/host/Directories.h deleted file mode 100644 index fccce467d..000000000 --- a/libs/host/include/host/Directories.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef HOST_MKDIRS_H -#define HOST_MKDIRS_H - -#include - -std::string parent_dir(const std::string& path); - -extern "C" int mkdirs(const char* path); - -#endif // HOST_MKDIRS_H diff --git a/libs/host/list.java b/libs/host/list.java deleted file mode 100644 index 30546e3ae..000000000 --- a/libs/host/list.java +++ /dev/null @@ -1,35 +0,0 @@ -import java.io.*; - -public class list { - private static char nibble(int c) { - return (char)(c < 10 ? ('0' + c) : ('a' + (c-10))); - } - public static void main(String[] argv) - { - ByteArrayOutputStream stream = new ByteArrayOutputStream(100); - OutputStreamWriter writer = null; - try { - writer = new OutputStreamWriter(stream, "utf-8"); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(System.err); - } - - int n = Integer.parseInt(argv[1], 16); - try { - writer.write(n); - writer.close(); - } catch (IOException e) { - e.printStackTrace(System.err); - } - - byte[] array = stream.toByteArray(); - - System.out.print(" case '" + argv[0] + "': return \""); - for (int i=0; i> 4) & 0x0f) + nibble(b & 0xf)); - } - System.out.println("\";"); - } -} - diff --git a/target/board/generic/BoardConfig.mk b/target/board/generic/BoardConfig.mk index 3ae586080..02c1c8887 100644 --- a/target/board/generic/BoardConfig.mk +++ b/target/board/generic/BoardConfig.mk @@ -45,30 +45,8 @@ BUILD_EMULATOR_OPENGL := true # the GLES renderer disables itself if host GL acceleration isn't available. USE_OPENGL_RENDERER := true -# Set the phase offset of the system's vsync event relative to the hardware -# vsync. The system's vsync event drives Choreographer and SurfaceFlinger's -# rendering. This value is the number of nanoseconds after the hardware vsync -# that the system vsync event will occur. -# -# This phase offset allows adjustment of the minimum latency from application -# wake-up (by Choregographer) time to the time at which the resulting window -# image is displayed. This value may be either positive (after the HW vsync) -# or negative (before the HW vsync). Setting it to 0 will result in a -# minimum latency of two vsync periods because the app and SurfaceFlinger -# will run just after the HW vsync. Setting it to a positive number will -# result in the minimum latency being: -# -# (2 * VSYNC_PERIOD - (vsyncPhaseOffsetNs % VSYNC_PERIOD)) -# -# Note that reducing this latency makes it more likely for the applications -# to not have their window content image ready in time. When this happens -# the latency will end up being an additional vsync period, and animations -# will hiccup. Therefore, this latency should be tuned somewhat -# conservatively (or at least with awareness of the trade-off being made). -VSYNC_EVENT_PHASE_OFFSET_NS := 0 - TARGET_USERIMAGES_USE_EXT4 := true -BOARD_SYSTEMIMAGE_PARTITION_SIZE := 576716800 +BOARD_SYSTEMIMAGE_PARTITION_SIZE := 1879048192 # 1.75 GB BOARD_USERDATAIMAGE_PARTITION_SIZE := 576716800 BOARD_CACHEIMAGE_PARTITION_SIZE := 69206016 BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE := ext4 @@ -76,17 +54,6 @@ BOARD_FLASH_BLOCK_SIZE := 512 TARGET_USERIMAGES_SPARSE_EXT_DISABLED := true BOARD_SEPOLICY_DIRS += build/target/board/generic/sepolicy -BOARD_SEPOLICY_UNION += \ - bootanim.te \ - device.te \ - domain.te \ - file.te \ - file_contexts \ - qemud.te \ - rild.te \ - shell.te \ - surfaceflinger.te \ - system_server.te ifeq ($(TARGET_PRODUCT),sdk) # include an expanded selection of fonts for the SDK. diff --git a/target/board/generic/device.mk b/target/board/generic/device.mk index 06a7d8a3e..e56a4d1d3 100644 --- a/target/board/generic/device.mk +++ b/target/board/generic/device.mk @@ -30,8 +30,3 @@ PRODUCT_COPY_FILES := \ frameworks/av/media/libstagefright/data/media_codecs_google_video.xml:system/etc/media_codecs_google_video.xml \ device/generic/goldfish/camera/media_codecs.xml:system/etc/media_codecs.xml \ hardware/libhardware_legacy/audio/audio_policy.conf:system/etc/audio_policy.conf - -PRODUCT_PACKAGES := \ - audio.primary.goldfish \ - power.goldfish \ - vibrator.goldfish diff --git a/target/board/generic/sepolicy/bootanim.te b/target/board/generic/sepolicy/bootanim.te index d6506e11d..b4b1eef83 100644 --- a/target/board/generic/sepolicy/bootanim.te +++ b/target/board/generic/sepolicy/bootanim.te @@ -1,2 +1,4 @@ allow bootanim self:process execmem; allow bootanim ashmem_device:chr_file execute; + +set_prop(bootanim, qemu_prop) diff --git a/target/board/generic/sepolicy/device.te b/target/board/generic/sepolicy/device.te index e4af13cca..d12944119 100644 --- a/target/board/generic/sepolicy/device.te +++ b/target/board/generic/sepolicy/device.te @@ -1 +1 @@ -type qemu_device, dev_type; +type qemu_device, dev_type, mlstrustedobject; diff --git a/target/board/generic/sepolicy/domain.te b/target/board/generic/sepolicy/domain.te index c28ca74f1..5d5e4ac36 100644 --- a/target/board/generic/sepolicy/domain.te +++ b/target/board/generic/sepolicy/domain.te @@ -1,3 +1,6 @@ # For /sys/qemu_trace files in the emulator. +allow domain sysfs_writable:dir search; allow domain sysfs_writable:file rw_file_perms; allow domain qemu_device:chr_file rw_file_perms; + +get_prop(domain, qemu_prop) diff --git a/target/board/generic/sepolicy/file_contexts b/target/board/generic/sepolicy/file_contexts index f204cde96..e9502d948 100644 --- a/target/board/generic/sepolicy/file_contexts +++ b/target/board/generic/sepolicy/file_contexts @@ -1,4 +1,20 @@ -/dev/qemu_.* u:object_r:qemu_device:s0 -/dev/socket/qemud u:object_r:qemud_socket:s0 -/system/bin/qemud u:object_r:qemud_exec:s0 -/sys/qemu_trace(/.*)? -- u:object_r:sysfs_writable:s0 +# goldfish +/dev/block/mtdblock0 u:object_r:system_block_device:s0 +/dev/block/mtdblock1 u:object_r:userdata_block_device:s0 +/dev/block/mtdblock2 u:object_r:cache_block_device:s0 + +# ranchu +/dev/block/vda u:object_r:system_block_device:s0 +/dev/block/vdb u:object_r:cache_block_device:s0 +/dev/block/vdc u:object_r:userdata_block_device:s0 + +/dev/goldfish_pipe u:object_r:qemu_device:s0 +/dev/goldfish_sync u:object_r:qemu_device:s0 +/dev/qemu_.* u:object_r:qemu_device:s0 +/dev/socket/qemud u:object_r:qemud_socket:s0 +/dev/ttyGF[0-9]* u:object_r:serial_device:s0 +/dev/ttyS2 u:object_r:console_device:s0 +/system/bin/qemud u:object_r:qemud_exec:s0 +/sys/qemu_trace(/.*)? u:object_r:sysfs_writable:s0 +/system/etc/init.goldfish.sh u:object_r:goldfish_setup_exec:s0 +/system/bin/qemu-props u:object_r:qemu_props_exec:s0 diff --git a/target/board/generic/sepolicy/goldfish_setup.te b/target/board/generic/sepolicy/goldfish_setup.te new file mode 100644 index 000000000..b8f121cda --- /dev/null +++ b/target/board/generic/sepolicy/goldfish_setup.te @@ -0,0 +1,27 @@ +# goldfish-setup service: runs init.goldfish.sh script +type goldfish_setup, domain, domain_deprecated; +type goldfish_setup_exec, exec_type, file_type; + +init_daemon_domain(goldfish_setup) + +# Inherit open file to shell (interpreter) for script. +allow goldfish_setup shell_exec:file rx_file_perms; + +# Run ifconfig, route commands to configure interfaces and routes. +allow goldfish_setup system_file:file execute_no_trans; +allow goldfish_setup toolbox_exec:file rx_file_perms; +allow goldfish_setup self:capability { net_admin net_raw }; +allow goldfish_setup self:udp_socket create_socket_perms; + +net_domain(goldfish_setup) + +# Set net.eth0.dns*, debug.sf.nobootanimation +set_prop(goldfish_setup, system_prop) +set_prop(goldfish_setup, debug_prop) + +# Set ro.radio.noril +set_prop(goldfish_setup, radio_noril_prop) + +# Stop ril-daemon service (by setting ctl.stop to ril-daemon, which +# transforms to a permission check on ctl.ril-daemon). +set_prop(goldfish_setup, ctl_rildaemon_prop) diff --git a/target/board/generic/sepolicy/init.te b/target/board/generic/sepolicy/init.te new file mode 100644 index 000000000..3aa81d1b5 --- /dev/null +++ b/target/board/generic/sepolicy/init.te @@ -0,0 +1 @@ +allow init tmpfs:lnk_file create_file_perms; diff --git a/target/board/generic/sepolicy/logd.te b/target/board/generic/sepolicy/logd.te new file mode 100644 index 000000000..b3e60d78d --- /dev/null +++ b/target/board/generic/sepolicy/logd.te @@ -0,0 +1,11 @@ +# goldfish logcat service: runs logcat -Q in logd domain + +# See global logd.te, these only set for eng & userdebug, allow for all builds + +domain_auto_trans(init, logcat_exec, logd) + +# Read from logd. +read_logd(logd) + +# Write to /dev/ttyS2 and /dev/ttyGF2. +allow logd serial_device:chr_file { write open }; diff --git a/target/board/generic/sepolicy/netd.te b/target/board/generic/sepolicy/netd.te new file mode 100644 index 000000000..2b002ec9c --- /dev/null +++ b/target/board/generic/sepolicy/netd.te @@ -0,0 +1 @@ +dontaudit netd self:capability sys_module; diff --git a/target/board/generic/sepolicy/property.te b/target/board/generic/sepolicy/property.te new file mode 100644 index 000000000..22d580a56 --- /dev/null +++ b/target/board/generic/sepolicy/property.te @@ -0,0 +1,3 @@ +type qemu_prop, property_type; +type radio_noril_prop, property_type; +type opengles_prop, property_type; diff --git a/target/board/generic/sepolicy/property_contexts b/target/board/generic/sepolicy/property_contexts new file mode 100644 index 000000000..142b062de --- /dev/null +++ b/target/board/generic/sepolicy/property_contexts @@ -0,0 +1,5 @@ +qemu. u:object_r:qemu_prop:s0 +ro.emu. u:object_r:qemu_prop:s0 +ro.emulator. u:object_r:qemu_prop:s0 +ro.radio.noril u:object_r:radio_noril_prop:s0 +ro.opengles. u:object_r:opengles_prop:s0 diff --git a/target/board/generic/sepolicy/qemu_props.te b/target/board/generic/sepolicy/qemu_props.te new file mode 100644 index 000000000..6768ce7cd --- /dev/null +++ b/target/board/generic/sepolicy/qemu_props.te @@ -0,0 +1,11 @@ +# qemu-props service: Sets system properties on boot. +type qemu_props, domain, domain_deprecated; +type qemu_props_exec, exec_type, file_type; + +init_daemon_domain(qemu_props) + +# Set properties. +set_prop(qemu_props, qemu_prop) +set_prop(qemu_props, dalvik_prop) +set_prop(qemu_props, config_prop) +set_prop(qemu_props, opengles_prop) diff --git a/target/board/generic/sepolicy/qemud.te b/target/board/generic/sepolicy/qemud.te index 4ff02ecf2..797cf5c6b 100644 --- a/target/board/generic/sepolicy/qemud.te +++ b/target/board/generic/sepolicy/qemud.te @@ -1,6 +1,8 @@ # qemu support daemon -type qemud, domain; +type qemud, domain, domain_deprecated; type qemud_exec, exec_type, file_type; init_daemon_domain(qemud) -unconfined_domain(qemud) + +# Access /dev/ttyS1 and /dev/ttyGF1. +allow qemud serial_device:chr_file rw_file_perms; diff --git a/target/board/generic/sepolicy/surfaceflinger.te b/target/board/generic/sepolicy/surfaceflinger.te index 4c354697a..e03d07ee7 100644 --- a/target/board/generic/sepolicy/surfaceflinger.te +++ b/target/board/generic/sepolicy/surfaceflinger.te @@ -1,2 +1,4 @@ allow surfaceflinger self:process execmem; allow surfaceflinger ashmem_device:chr_file execute; + +set_prop(surfaceflinger, qemu_prop) diff --git a/target/board/generic/sepolicy/system_server.te b/target/board/generic/sepolicy/system_server.te index d0fb79d9b..f9e277b8a 100644 --- a/target/board/generic/sepolicy/system_server.te +++ b/target/board/generic/sepolicy/system_server.te @@ -1 +1,3 @@ unix_socket_connect(system_server, qemud, qemud) +get_prop(system_server, opengles_prop) +get_prop(system_server, radio_noril_prop) diff --git a/target/board/generic/sepolicy/zygote.te b/target/board/generic/sepolicy/zygote.te new file mode 100644 index 000000000..a90f02b1a --- /dev/null +++ b/target/board/generic/sepolicy/zygote.te @@ -0,0 +1 @@ +set_prop(zygote, qemu_prop) diff --git a/target/board/generic_arm64/BoardConfig.mk b/target/board/generic_arm64/BoardConfig.mk index 8afd5a8ce..02d0a6f20 100644 --- a/target/board/generic_arm64/BoardConfig.mk +++ b/target/board/generic_arm64/BoardConfig.mk @@ -76,9 +76,11 @@ BUILD_EMULATOR_OPENGL := true USE_OPENGL_RENDERER := true TARGET_USERIMAGES_USE_EXT4 := true -BOARD_SYSTEMIMAGE_PARTITION_SIZE := 943718400 +BOARD_SYSTEMIMAGE_PARTITION_SIZE := 1879048192 # 1.75 GB 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 + +BOARD_SEPOLICY_DIRS += build/target/board/generic/sepolicy diff --git a/target/board/generic_arm64/device.mk b/target/board/generic_arm64/device.mk index 11a6a31e9..9647a4ebe 100644 --- a/target/board/generic_arm64/device.mk +++ b/target/board/generic_arm64/device.mk @@ -30,6 +30,6 @@ PRODUCT_COPY_FILES := \ frameworks/av/media/libstagefright/data/media_codecs_google_video.xml:system/etc/media_codecs_google_video.xml \ device/generic/goldfish/camera/media_codecs.xml:system/etc/media_codecs.xml -PRODUCT_PACKAGES := \ - audio.primary.goldfish \ - vibrator.goldfish +# Adjust the Dalvik heap to be appropriate for a tablet. +$(call inherit-product-if-exists, frameworks/base/build/tablet-dalvik-heap.mk) +$(call inherit-product-if-exists, frameworks/native/build/tablet-dalvik-heap.mk) diff --git a/target/board/generic_armv5/BoardConfig.mk b/target/board/generic_armv5/BoardConfig.mk index 95fb559db..016937a68 100644 --- a/target/board/generic_armv5/BoardConfig.mk +++ b/target/board/generic_armv5/BoardConfig.mk @@ -19,6 +19,5 @@ include build/target/board/generic/BoardConfig.mk TARGET_ARCH_VARIANT := armv5te TARGET_CPU_ABI := armeabi TARGET_CPU_ABI2 := -ARCH_ARM_HAVE_TLS_REGISTER := false WITH_DEXPREOPT := false diff --git a/target/board/generic_mips/BoardConfig.mk b/target/board/generic_mips/BoardConfig.mk index 7cef96865..1152105bb 100644 --- a/target/board/generic_mips/BoardConfig.mk +++ b/target/board/generic_mips/BoardConfig.mk @@ -28,6 +28,9 @@ TARGET_ARCH_VARIANT := mips32r2-fp endif TARGET_CPU_ABI := mips +# Make TARGET_CPU_VARIANT the same as TARGET_ARCH_VARIANT +TARGET_CPU_VARIANT := $(TARGET_ARCH_VARIANT) + HAVE_HTC_AUDIO_DRIVER := true BOARD_USES_GENERIC_AUDIO := true @@ -50,22 +53,11 @@ BUILD_EMULATOR_OPENGL := true USE_OPENGL_RENDERER := true TARGET_USERIMAGES_USE_EXT4 := true -BOARD_SYSTEMIMAGE_PARTITION_SIZE := 838860800 -BOARD_USERDATAIMAGE_PARTITION_SIZE := 576716800 +BOARD_SYSTEMIMAGE_PARTITION_SIZE := 1879048192 # 1.75 GB +BOARD_USERDATAIMAGE_PARTITION_SIZE := 734003200 BOARD_CACHEIMAGE_PARTITION_SIZE := 69206016 BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE := ext4 BOARD_FLASH_BLOCK_SIZE := 512 TARGET_USERIMAGES_SPARSE_EXT_DISABLED := true BOARD_SEPOLICY_DIRS += build/target/board/generic/sepolicy -BOARD_SEPOLICY_UNION += \ - bootanim.te \ - device.te \ - domain.te \ - file.te \ - file_contexts \ - qemud.te \ - rild.te \ - shell.te \ - surfaceflinger.te \ - system_server.te diff --git a/target/board/generic_mips/device.mk b/target/board/generic_mips/device.mk index 590f4224d..06a7d8a3e 100644 --- a/target/board/generic_mips/device.mk +++ b/target/board/generic_mips/device.mk @@ -34,5 +34,4 @@ PRODUCT_COPY_FILES := \ PRODUCT_PACKAGES := \ audio.primary.goldfish \ power.goldfish \ - vibrator.goldfish \ - libffi + vibrator.goldfish diff --git a/target/board/generic_mips64/BoardConfig.mk b/target/board/generic_mips64/BoardConfig.mk index f8cf4f03a..ebc1675ae 100644 --- a/target/board/generic_mips64/BoardConfig.mk +++ b/target/board/generic_mips64/BoardConfig.mk @@ -38,6 +38,10 @@ endif endif TARGET_2ND_CPU_ABI := mips +# Make TARGET_XXX_CPU_VARIANT the same as TARGET_XXX_ARCH_VARIANT +TARGET_CPU_VARIANT := $(TARGET_ARCH_VARIANT) +TARGET_2ND_CPU_VARIANT := $(TARGET_2ND_ARCH_VARIANT) + # The emulator (qemu) uses the Goldfish devices HAVE_HTC_AUDIO_DRIVER := true BOARD_USES_GENERIC_AUDIO := true @@ -61,9 +65,13 @@ BUILD_EMULATOR_OPENGL := true USE_OPENGL_RENDERER := true TARGET_USERIMAGES_USE_EXT4 := true -BOARD_SYSTEMIMAGE_PARTITION_SIZE := 786432000 -BOARD_USERDATAIMAGE_PARTITION_SIZE := 576716800 +BOARD_SYSTEMIMAGE_PARTITION_SIZE := 1879048192 # 1.75 GB +BOARD_USERDATAIMAGE_PARTITION_SIZE := 1610612736 # 1.5 GB, lots of space for running tests BOARD_CACHEIMAGE_PARTITION_SIZE := 69206016 BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE := ext4 BOARD_FLASH_BLOCK_SIZE := 512 TARGET_USERIMAGES_SPARSE_EXT_DISABLED := true + +BOARD_SEPOLICY_DIRS += build/target/board/generic/sepolicy + +DEX_PREOPT_DEFAULT := nostripping diff --git a/target/board/generic_mips64/device.mk b/target/board/generic_mips64/device.mk index 015686e6d..66ec9db9b 100644 --- a/target/board/generic_mips64/device.mk +++ b/target/board/generic_mips64/device.mk @@ -33,5 +33,4 @@ PRODUCT_COPY_FILES := \ PRODUCT_PACKAGES := \ audio.primary.goldfish \ - power.goldfish \ - libffi + power.goldfish diff --git a/target/board/generic_x86/BoardConfig.mk b/target/board/generic_x86/BoardConfig.mk index 5d091f515..50ecb984d 100644 --- a/target/board/generic_x86/BoardConfig.mk +++ b/target/board/generic_x86/BoardConfig.mk @@ -18,9 +18,6 @@ BOARD_USES_GENERIC_AUDIO := true # no hardware camera USE_CAMERA_STUB := true -# customize the malloced address to be 16-byte aligned -BOARD_MALLOC_ALIGNMENT := 16 - # Enable dex-preoptimization to speed up the first boot sequence # of an SDK AVD. Note that this operation only works on Linux for now ifeq ($(HOST_OS),linux) @@ -35,7 +32,7 @@ BUILD_EMULATOR_OPENGL := true USE_OPENGL_RENDERER := true TARGET_USERIMAGES_USE_EXT4 := true -BOARD_SYSTEMIMAGE_PARTITION_SIZE := 786432000 +BOARD_SYSTEMIMAGE_PARTITION_SIZE := 1610612736 BOARD_USERDATAIMAGE_PARTITION_SIZE := 576716800 BOARD_CACHEIMAGE_PARTITION_SIZE := 69206016 BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE := ext4 @@ -45,16 +42,3 @@ TARGET_USERIMAGES_SPARSE_EXT_DISABLED := true BOARD_SEPOLICY_DIRS += \ build/target/board/generic/sepolicy \ build/target/board/generic_x86/sepolicy - -BOARD_SEPOLICY_UNION += \ - device.te \ - domain.te \ - file.te \ - file_contexts \ - healthd.te \ - installd.te \ - qemud.te \ - rild.te \ - shell.te \ - system_server.te \ - zygote.te diff --git a/target/board/generic_x86/sepolicy/init.te b/target/board/generic_x86/sepolicy/init.te new file mode 100644 index 000000000..3aa81d1b5 --- /dev/null +++ b/target/board/generic_x86/sepolicy/init.te @@ -0,0 +1 @@ +allow init tmpfs:lnk_file create_file_perms; diff --git a/target/board/generic_x86/sepolicy/system_server.te b/target/board/generic_x86/sepolicy/system_server.te deleted file mode 100644 index 5d98a14a9..000000000 --- a/target/board/generic_x86/sepolicy/system_server.te +++ /dev/null @@ -1 +0,0 @@ -allow system_server self:process execmem; diff --git a/target/board/generic_x86_64/BoardConfig.mk b/target/board/generic_x86_64/BoardConfig.mk index 295ee2b8e..283e9cc4c 100755 --- a/target/board/generic_x86_64/BoardConfig.mk +++ b/target/board/generic_x86_64/BoardConfig.mk @@ -24,9 +24,6 @@ BOARD_USES_GENERIC_AUDIO := true # no hardware camera USE_CAMERA_STUB := true -# customize the malloced address to be 16-byte aligned -BOARD_MALLOC_ALIGNMENT := 16 - # Enable dex-preoptimization to speed up the first boot sequence # of an SDK AVD. Note that this operation only works on Linux for now ifeq ($(HOST_OS),linux) @@ -41,9 +38,13 @@ BUILD_EMULATOR_OPENGL := true USE_OPENGL_RENDERER := true TARGET_USERIMAGES_USE_EXT4 := true -BOARD_SYSTEMIMAGE_PARTITION_SIZE := 1073741824 # 1GB +BOARD_SYSTEMIMAGE_PARTITION_SIZE := 2147483648 # 2 GB 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 + +BOARD_SEPOLICY_DIRS += \ + build/target/board/generic/sepolicy \ + build/target/board/generic_x86/sepolicy diff --git a/target/product/AndroidProducts.mk b/target/product/AndroidProducts.mk index ac5902cc7..69edc72e4 100644 --- a/target/product/AndroidProducts.mk +++ b/target/product/AndroidProducts.mk @@ -59,7 +59,6 @@ PRODUCT_MAKEFILES := \ $(LOCAL_DIR)/aosp_arm64.mk \ $(LOCAL_DIR)/aosp_mips64.mk \ $(LOCAL_DIR)/aosp_x86_64.mk \ - $(LOCAL_DIR)/full_x86_64.mk \ $(LOCAL_DIR)/sdk_phone_armv7.mk \ $(LOCAL_DIR)/sdk_phone_x86.mk \ $(LOCAL_DIR)/sdk_phone_mips.mk \ diff --git a/target/product/aosp_arm.mk b/target/product/aosp_arm.mk index 86b715cd9..781cae6a0 100644 --- a/target/product/aosp_arm.mk +++ b/target/product/aosp_arm.mk @@ -13,6 +13,6 @@ # See the License for the specific language governing permissions and # limitations under the License. # -$(call inherit-product, $(SRC_TARGET_DIR)/product/full.mk) +include $(SRC_TARGET_DIR)/product/full.mk PRODUCT_NAME := aosp_arm diff --git a/target/product/aosp_arm64.mk b/target/product/aosp_arm64.mk index e1194661b..98afe5f92 100644 --- a/target/product/aosp_arm64.mk +++ b/target/product/aosp_arm64.mk @@ -19,12 +19,14 @@ # build quite specifically for the emulator, and might not be # entirely appropriate to inherit from for on-device configurations. +# This is for enabling ethernet support for ranchu. +# Consider removing this after RIL support is provided in ranchu. +PRODUCT_COPY_FILES += frameworks/native/data/etc/android.hardware.ethernet.xml:system/etc/permissions/android.hardware.ethernet.xml + $(call inherit-product, $(SRC_TARGET_DIR)/product/core_64_bit.mk) $(call inherit-product, $(SRC_TARGET_DIR)/product/aosp_base_telephony.mk) $(call inherit-product, $(SRC_TARGET_DIR)/board/generic_arm64/device.mk) -PRODUCT_RUNTIMES := runtime_libart_default - include $(SRC_TARGET_DIR)/product/emulator.mk PRODUCT_NAME := aosp_arm64 PRODUCT_DEVICE := generic_arm64 diff --git a/target/product/aosp_base_telephony.mk b/target/product/aosp_base_telephony.mk index f326a0015..0d4e33356 100644 --- a/target/product/aosp_base_telephony.mk +++ b/target/product/aosp_base_telephony.mk @@ -14,3 +14,6 @@ # limitations under the License. # $(call inherit-product, $(SRC_TARGET_DIR)/product/full_base_telephony.mk) + +PRODUCT_PACKAGES += \ + messaging diff --git a/target/product/aosp_mips.mk b/target/product/aosp_mips.mk index ceeb43373..a76b93a46 100644 --- a/target/product/aosp_mips.mk +++ b/target/product/aosp_mips.mk @@ -13,6 +13,6 @@ # See the License for the specific language governing permissions and # limitations under the License. # -$(call inherit-product, $(SRC_TARGET_DIR)/product/full_mips.mk) +include $(SRC_TARGET_DIR)/product/full_mips.mk PRODUCT_NAME := aosp_mips diff --git a/target/product/aosp_mips64.mk b/target/product/aosp_mips64.mk index 3a6026c30..f606858e5 100644 --- a/target/product/aosp_mips64.mk +++ b/target/product/aosp_mips64.mk @@ -13,6 +13,24 @@ # See the License for the specific language governing permissions and # limitations under the License. # -$(call inherit-product, $(SRC_TARGET_DIR)/product/full_mips64.mk) +# This is a build configuration for a full-featured build of the +# Open-Source part of the tree. It's geared toward a US-centric +# mips64 build quite specifically for the emulator, and might not be +# entirely appropriate to inherit from for on-device configurations. + +# This is for enabling ethernet support for ranchu. +# Consider removing this after RIL support is provided in ranchu. +PRODUCT_COPY_FILES += frameworks/native/data/etc/android.hardware.ethernet.xml:system/etc/permissions/android.hardware.ethernet.xml + +$(call inherit-product, $(SRC_TARGET_DIR)/product/core_64_bit.mk) +$(call inherit-product, $(SRC_TARGET_DIR)/product/aosp_base_telephony.mk) +$(call inherit-product, $(SRC_TARGET_DIR)/board/generic_mips64/device.mk) + +include $(SRC_TARGET_DIR)/product/emulator.mk + +# Overrides PRODUCT_NAME := aosp_mips64 +PRODUCT_DEVICE := generic_mips64 +PRODUCT_BRAND := Android +PRODUCT_MODEL := AOSP on MIPS64 Emulator diff --git a/target/product/aosp_x86.mk b/target/product/aosp_x86.mk index 3e9b018a2..cba43c429 100644 --- a/target/product/aosp_x86.mk +++ b/target/product/aosp_x86.mk @@ -13,6 +13,6 @@ # See the License for the specific language governing permissions and # limitations under the License. # -$(call inherit-product, $(SRC_TARGET_DIR)/product/full_x86.mk) +include $(SRC_TARGET_DIR)/product/full_x86.mk PRODUCT_NAME := aosp_x86 diff --git a/target/product/aosp_x86_64.mk b/target/product/aosp_x86_64.mk index 5a12c08d0..4006346a8 100644 --- a/target/product/aosp_x86_64.mk +++ b/target/product/aosp_x86_64.mk @@ -13,6 +13,37 @@ # See the License for the specific language governing permissions and # limitations under the License. # -$(call inherit-product, $(SRC_TARGET_DIR)/product/full_x86_64.mk) +# This is a build configuration for a full-featured build of the +# Open-Source part of the tree. It's geared toward a US-centric +# build quite specifically for the emulator, and might not be +# entirely appropriate to inherit from for on-device configurations. + +# If running on an emulator or some other device that has a LAN connection +# that isn't a wifi connection. This will instruct init.rc to enable the +# network connection so that you can use it with ADB + +# This is for enabling ethernet support for ranchu. +# Consider removing this after RIL support is provided in ranchu. +PRODUCT_COPY_FILES += frameworks/native/data/etc/android.hardware.ethernet.xml:system/etc/permissions/android.hardware.ethernet.xml + +$(call inherit-product, $(SRC_TARGET_DIR)/product/core_64_bit.mk) +$(call inherit-product, $(SRC_TARGET_DIR)/product/aosp_base_telephony.mk) +$(call inherit-product, $(SRC_TARGET_DIR)/board/generic_x86_64/device.mk) + +include $(SRC_TARGET_DIR)/product/emulator.mk + +ifdef NET_ETH0_STARTONBOOT + PRODUCT_PROPERTY_OVERRIDES += net.eth0.startonboot=1 +endif + +# Ensure we package the BIOS files too. +PRODUCT_PACKAGES += \ + bios.bin \ + vgabios-cirrus.bin \ + +# Overrides PRODUCT_NAME := aosp_x86_64 +PRODUCT_DEVICE := generic_x86_64 +PRODUCT_BRAND := Android +PRODUCT_MODEL := AOSP on IA x86_64 Emulator diff --git a/target/product/base.mk b/target/product/base.mk index 0d052b52f..dcd48e72d 100644 --- a/target/product/base.mk +++ b/target/product/base.mk @@ -18,6 +18,7 @@ PRODUCT_PACKAGES += \ 20-dns.conf \ 95-configured \ + org.apache.http.legacy.boot \ appwidget \ appops \ am \ @@ -25,16 +26,18 @@ PRODUCT_PACKAGES += \ android.test.runner \ app_process \ applypatch \ + audioserver \ blkid \ bmgr \ bugreport \ + bugreportz \ + cameraserver \ content \ - dhcpcd \ - dhcpcd-run-hooks \ dnsmasq \ dpm \ framework \ fsck_msdos \ + hid \ ime \ input \ javax.obex \ @@ -48,6 +51,7 @@ PRODUCT_PACKAGES += \ libbundlewrapper \ libcamera_client \ libcameraservice \ + libcamera2ndk \ libdl \ libdrmclearkeyplugin \ libeffectproxy \ @@ -65,12 +69,16 @@ PRODUCT_PACKAGES += \ libnetlink \ libnetutils \ libpdfium \ + libradio \ + libradioservice \ + libradio_metadata \ libreference-ril \ libreverbwrapper \ libril \ librtp_jni \ libsensorservice \ libskia \ + libsonic \ libsonivox \ libsoundpool \ libsoundtrigger \ @@ -88,14 +96,17 @@ PRODUCT_PACKAGES += \ libvisualizer \ libvorbisidec \ libmediandk \ + libvulkan \ libwifi-service \ media \ media_cmd \ + mediadrmserver \ mediaserver \ + mediacodec \ + mediaextractor \ monkey \ mtpd \ ndc \ - netcfg \ netd \ ping \ ping6 \ @@ -106,10 +117,15 @@ PRODUCT_PACKAGES += \ run-as \ schedtest \ sdcard \ + secdiscard \ services \ settings \ + sgdisk \ + sm \ svc \ tc \ + telecom \ + tm \ vdc \ vold \ wm diff --git a/target/product/core.mk b/target/product/core.mk index 519dbb8ef..28558c55f 100644 --- a/target/product/core.mk +++ b/target/product/core.mk @@ -22,8 +22,9 @@ PRODUCT_PACKAGES += \ BasicDreams \ - Browser \ - Calculator \ + BlockedNumberProvider \ + BookmarkProvider \ + Browser2 \ Calendar \ CalendarProvider \ CaptivePortalLogin \ @@ -33,23 +34,26 @@ PRODUCT_PACKAGES += \ DocumentsUI \ DownloadProviderUi \ Email \ + ExactCalculator \ Exchange2 \ ExternalStorageProvider \ FusedLocation \ InputDevices \ KeyChain \ Keyguard \ - LatinIME \ Launcher2 \ ManagedProvisioning \ + MtpDocumentsProvider \ PicoTts \ PacProcessor \ libpac \ PrintSpooler \ + PrintRecommendationService \ ProxyHandler \ QuickSearchBox \ Settings \ SharedStorageBackup \ + StorageManager \ Telecom \ TeleService \ VpnDialogs \ diff --git a/target/product/core_base.mk b/target/product/core_base.mk index 6c2948227..86fb36cd7 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 \ @@ -41,13 +36,14 @@ PRODUCT_PACKAGES += \ libstagefright_soft_amrdec \ libstagefright_soft_amrnbenc \ libstagefright_soft_amrwbenc \ + libstagefright_soft_avcdec \ + libstagefright_soft_avcenc \ libstagefright_soft_flacenc \ libstagefright_soft_g711dec \ libstagefright_soft_gsmdec \ - libstagefright_soft_h264dec \ - libstagefright_soft_h264enc \ libstagefright_soft_hevcdec \ libstagefright_soft_mp3dec \ + libstagefright_soft_mpeg2dec \ libstagefright_soft_mpeg4dec \ libstagefright_soft_mpeg4enc \ libstagefright_soft_opusdec \ diff --git a/target/product/core_minimal.mk b/target/product/core_minimal.mk index 4c08cb027..0e60013f5 100644 --- a/target/product/core_minimal.mk +++ b/target/product/core_minimal.mk @@ -24,12 +24,18 @@ PRODUCT_NAME := core PRODUCT_PACKAGES += \ BackupRestoreConfirmation \ + CtsShimPrebuilt \ + CtsShimPrivPrebuilt \ DownloadProvider \ + ExtShared \ + ExtServices \ HTMLViewer \ MediaProvider \ PackageInstaller \ SettingsProvider \ Shell \ + StatementService \ + WallpaperBackup \ bcc \ bu \ com.android.future.usb.accessory \ @@ -49,8 +55,10 @@ PRODUCT_PACKAGES += \ ip-up-vpn \ ip6tables \ iptables \ + gatekeeperd \ keystore \ keystore.default \ + ld.mc \ libbcc \ libOpenMAXAL \ libOpenSLES \ @@ -59,13 +67,12 @@ PRODUCT_PACKAGES += \ libdrmframework_jni \ libfilterfw \ libkeystore \ - libsqlite_jni \ + libgatekeeper \ libwilhelm \ logd \ make_ext4fs \ e2fsck \ resize2fs \ - mms-common \ screencap \ sensorservice \ telephony-common \ @@ -80,6 +87,7 @@ PRODUCT_COPY_FILES += \ # The order of PRODUCT_BOOT_JARS matters. PRODUCT_BOOT_JARS := \ + core-oj \ core-libart \ conscrypt \ okhttp \ @@ -90,21 +98,57 @@ PRODUCT_BOOT_JARS := \ telephony-common \ voip-common \ ims-common \ - mms-common \ - android.policy \ apache-xml \ + org.apache.http.legacy.boot # The order of PRODUCT_SYSTEM_SERVER_JARS matters. +ifneq ($(TARGET_DISABLE_CMSDK), true) PRODUCT_SYSTEM_SERVER_JARS := \ + org.cyanogenmod.platform \ + org.cyanogenmod.hardware +endif +PRODUCT_SYSTEM_SERVER_JARS += \ services \ ethernet-service \ wifi-service -PRODUCT_RUNTIMES := runtime_libart_default +# Adoptable external storage f2fs support +PRODUCT_PACKAGES += \ + fsck.f2fs \ + mkfs.f2fs \ PRODUCT_DEFAULT_PROPERTY_OVERRIDES += \ ro.zygote=zygote32 PRODUCT_COPY_FILES += \ system/core/rootdir/init.zygote32.rc:root/init.zygote32.rc +PRODUCT_COPY_FILES += \ + system/core/rootdir/etc/public.libraries.android.txt:system/etc/public.libraries.txt + +# Different dexopt types for different package update/install times. +# On eng builds, make "boot" reasons do pure JIT for faster turnaround. +ifeq (eng,$(TARGET_BUILD_VARIANT)) + PRODUCT_DEFAULT_PROPERTY_OVERRIDES += \ + pm.dexopt.first-boot=verify-at-runtime \ + pm.dexopt.boot=verify-at-runtime +else + PRODUCT_DEFAULT_PROPERTY_OVERRIDES += \ + pm.dexopt.first-boot=interpret-only \ + pm.dexopt.boot=verify-profile +endif +PRODUCT_DEFAULT_PROPERTY_OVERRIDES += \ + pm.dexopt.install=interpret-only \ + pm.dexopt.bg-dexopt=speed-profile \ + pm.dexopt.ab-ota=speed-profile \ + pm.dexopt.nsys-library=speed \ + pm.dexopt.shared-apk=speed \ + pm.dexopt.forced-dexopt=speed \ + pm.dexopt.core-app=speed + + +# Enable boot.oat filtering of compiled classes to reduce boot.oat size. b/28026683 +PRODUCT_COPY_FILES += $(call add-to-product-copy-files-if-exists,\ + frameworks/base/compiled-classes-phone:system/etc/compiled-classes) + +$(call inherit-product, $(SRC_TARGET_DIR)/product/runtime_libart.mk) $(call inherit-product, $(SRC_TARGET_DIR)/product/base.mk) diff --git a/target/product/core_tiny.mk b/target/product/core_tiny.mk index 9637e3413..ec2fa41d1 100644 --- a/target/product/core_tiny.mk +++ b/target/product/core_tiny.mk @@ -35,14 +35,16 @@ PRODUCT_PACKAGES += \ local_time.default \ power.default -PRODUCT_PACKAGES += \ - local_time.default - PRODUCT_PACKAGES += \ BackupRestoreConfirmation \ + CtsShimPrebuilt \ + CtsShimPrivPrebuilt \ DefaultContainerService \ + ExtShared \ + ExtServices \ SettingsProvider \ Shell \ + WallpaperBackup \ bcc \ bu \ com.android.location.provider \ @@ -54,14 +56,16 @@ PRODUCT_PACKAGES += \ ip-up-vpn \ ip6tables \ iptables \ + gatekeeperd \ keystore \ keystore.default \ + ld.mc \ libOpenMAXAL \ libOpenSLES \ libdownmix \ libfilterfw \ + libgatekeeper \ libkeystore \ - libsqlite_jni \ libwilhelm \ libdrmframework_jni \ libdrmframework \ @@ -76,11 +80,11 @@ PRODUCT_PACKAGES += \ telephony-common \ voip-common \ logd \ - mms-common \ wifi-service # The order matters PRODUCT_BOOT_JARS := \ + core-oj \ core-libart \ conscrypt \ okhttp \ @@ -91,18 +95,15 @@ PRODUCT_BOOT_JARS := \ telephony-common \ voip-common \ ims-common \ - mms-common \ - android.policy \ apache-xml \ nullwebview \ + org.apache.http.legacy.boot # The order of PRODUCT_SYSTEM_SERVER_JARS matters. PRODUCT_SYSTEM_SERVER_JARS := \ services \ wifi-service -PRODUCT_RUNTIMES := runtime_libart_default - PRODUCT_DEFAULT_PROPERTY_OVERRIDES += \ ro.zygote=zygote32 PRODUCT_COPY_FILES += \ @@ -111,8 +112,30 @@ PRODUCT_COPY_FILES += \ PRODUCT_PROPERTY_OVERRIDES += \ ro.carrier=unknown +# Different dexopt types for different package update/install times. +# On eng builds, make "boot" reasons do pure JIT for faster turnaround. +ifeq (eng,$(TARGET_BUILD_VARIANT)) + PRODUCT_DEFAULT_PROPERTY_OVERRIDES += \ + pm.dexopt.first-boot=verify-at-runtime \ + pm.dexopt.boot=verify-at-runtime +else + PRODUCT_DEFAULT_PROPERTY_OVERRIDES += \ + pm.dexopt.first-boot=interpret-only \ + pm.dexopt.boot=verify-profile +endif +PRODUCT_DEFAULT_PROPERTY_OVERRIDES += \ + pm.dexopt.install=interpret-only \ + pm.dexopt.bg-dexopt=speed-profile \ + pm.dexopt.ab-ota=speed-profile \ + pm.dexopt.nsys-library=speed \ + pm.dexopt.shared-apk=speed \ + pm.dexopt.forced-dexopt=speed \ + pm.dexopt.core-app=speed + +$(call inherit-product, $(SRC_TARGET_DIR)/product/runtime_libart.mk) $(call inherit-product, $(SRC_TARGET_DIR)/product/base.mk) $(call inherit-product-if-exists, frameworks/base/data/fonts/fonts.mk) +$(call inherit-product-if-exists, external/roboto-fonts/fonts.mk) # Overrides PRODUCT_BRAND := tiny diff --git a/target/product/embedded.mk b/target/product/embedded.mk index b60c9488e..55de3b9e9 100644 --- a/target/product/embedded.mk +++ b/target/product/embedded.mk @@ -22,11 +22,14 @@ PRODUCT_PACKAGES += \ adbd \ atrace \ bootanimation \ + bootstat \ + cmd \ debuggerd \ - debuggerd64 \ dumpstate \ dumpsys \ + fastboot \ gralloc.default \ + grep \ gzip \ healthd \ init \ @@ -37,8 +40,10 @@ PRODUCT_PACKAGES += \ libFFTEm \ libGLESv1_CM \ libGLESv2 \ + libGLESv3 \ libbinder \ libc \ + libc_malloc_debug \ libcutils \ libdl \ libgui \ @@ -49,40 +54,45 @@ PRODUCT_PACKAGES += \ libm \ libpixelflinger \ libpower \ + libsigchain \ libstdc++ \ - libstlport \ libsurfaceflinger \ libsurfaceflinger_ddmconnection \ libsysutils \ libui \ libutils \ linker \ - linker64 \ lmkd \ logcat \ logwrapper \ mkshrc \ reboot \ + recovery \ service \ servicemanager \ sh \ surfaceflinger \ toolbox \ - libsigchain + toybox \ + tzdatacheck \ # SELinux packages PRODUCT_PACKAGES += \ sepolicy \ - file_contexts \ + file_contexts.bin \ seapp_contexts \ property_contexts \ mac_permissions.xml \ selinux_version \ service_contexts +# Ensure that this property is always defined so that bionic_systrace.cpp +# can rely on it being initially set by init. +PRODUCT_DEFAULT_PROPERTY_OVERRIDES += \ + debug.atrace.tags.enableflags=0 PRODUCT_COPY_FILES += \ system/core/rootdir/init.usb.rc:root/init.usb.rc \ - system/core/rootdir/init.trace.rc:root/init.trace.rc \ + system/core/rootdir/init.usb.configfs.rc:root/init.usb.configfs.rc \ system/core/rootdir/ueventd.rc:root/ueventd.rc \ system/core/rootdir/etc/hosts:system/etc/hosts diff --git a/target/product/emulator.mk b/target/product/emulator.mk index 62099df18..70cd5977a 100644 --- a/target/product/emulator.mk +++ b/target/product/emulator.mk @@ -26,6 +26,7 @@ PRODUCT_PACKAGES += \ PRODUCT_PACKAGES += \ egl.cfg \ gralloc.goldfish \ + gralloc.ranchu \ libGLESv1_CM_emulation \ lib_renderControl_enc \ libEGL_emulation \ @@ -38,14 +39,32 @@ PRODUCT_PACKAGES += \ qemud \ camera.goldfish \ camera.goldfish.jpeg \ + camera.ranchu \ + camera.ranchu.jpeg \ lights.goldfish \ gps.goldfish \ + gps.ranchu \ + fingerprint.goldfish \ sensors.goldfish \ + audio.primary.goldfish \ + vibrator.goldfish \ + power.goldfish \ + fingerprint.ranchu \ + fingerprintd \ + sensors.ranchu \ e2fsck - PRODUCT_COPY_FILES += \ device/generic/goldfish/fstab.goldfish:root/fstab.goldfish \ device/generic/goldfish/init.goldfish.rc:root/init.goldfish.rc \ device/generic/goldfish/init.goldfish.sh:system/etc/init.goldfish.sh \ - device/generic/goldfish/ueventd.goldfish.rc:root/ueventd.goldfish.rc + device/generic/goldfish/ueventd.goldfish.rc:root/ueventd.goldfish.rc \ + device/generic/goldfish/init.ranchu.rc:root/init.ranchu.rc \ + device/generic/goldfish/fstab.ranchu:root/fstab.ranchu \ + device/generic/goldfish/ueventd.ranchu.rc:root/ueventd.ranchu.rc \ + device/generic/goldfish/input/goldfish_rotary.idc:system/usr/idc/goldfish_rotary.idc \ + frameworks/native/data/etc/android.hardware.usb.accessory.xml:system/etc/permissions/android.hardware.usb.accessory.xml + +PRODUCT_PACKAGE_OVERLAYS := device/generic/goldfish/overlay + +PRODUCT_CHARACTERISTICS := emulator diff --git a/target/product/full_base.mk b/target/product/full_base.mk index caace76eb..b98f0be57 100644 --- a/target/product/full_base.mk +++ b/target/product/full_base.mk @@ -21,43 +21,23 @@ 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 - # 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 2fd2ce803..7988e9b77 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_mips64.mk b/target/product/full_mips64.mk deleted file mode 100644 index 408e81c10..000000000 --- a/target/product/full_mips64.mk +++ /dev/null @@ -1,34 +0,0 @@ -# -# Copyright (C) 2013 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. -# - -# This is a build configuration for a full-featured build of the -# Open-Source part of the tree. It's geared toward a US-centric -# mips64 build quite specifically for the emulator, and might not be -# entirely appropriate to inherit from for on-device configurations. - -$(call inherit-product, $(SRC_TARGET_DIR)/product/core_64_bit.mk) -$(call inherit-product, $(SRC_TARGET_DIR)/product/aosp_base_telephony.mk) -$(call inherit-product, $(SRC_TARGET_DIR)/board/generic_mips64/device.mk) - -PRODUCT_RUNTIMES := runtime_libart_default - -include $(SRC_TARGET_DIR)/product/emulator.mk - -# Overrides -PRODUCT_NAME := full_mips64 -PRODUCT_DEVICE := generic_mips64 -PRODUCT_BRAND := Android -PRODUCT_MODEL := AOSP on MIPS64 Emulator diff --git a/target/product/full_x86_64.mk b/target/product/full_x86_64.mk deleted file mode 100755 index d9c0c1ea5..000000000 --- a/target/product/full_x86_64.mk +++ /dev/null @@ -1,47 +0,0 @@ -# -# Copyright (C) 2009 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. -# - -# This is a build configuration for a full-featured build of the -# Open-Source part of the tree. It's geared toward a US-centric -# build quite specifically for the emulator, and might not be -# entirely appropriate to inherit from for on-device configurations. - -# If running on an emulator or some other device that has a LAN connection -# that isn't a wifi connection. This will instruct init.rc to enable the -# network connection so that you can use it with ADB - -$(call inherit-product, $(SRC_TARGET_DIR)/product/core_64_bit.mk) -$(call inherit-product, $(SRC_TARGET_DIR)/product/aosp_base_telephony.mk) -$(call inherit-product, $(SRC_TARGET_DIR)/board/generic_x86_64/device.mk) - -PRODUCT_RUNTIMES := runtime_libart_default - -include $(SRC_TARGET_DIR)/product/emulator.mk - -ifdef NET_ETH0_STARTONBOOT - PRODUCT_PROPERTY_OVERRIDES += net.eth0.startonboot=1 -endif - -# Ensure we package the BIOS files too. -PRODUCT_PACKAGES += \ - bios.bin \ - vgabios-cirrus.bin \ - -# Overrides -PRODUCT_NAME := full_x86_64 -PRODUCT_DEVICE := generic_x86_64 -PRODUCT_BRAND := Android -PRODUCT_MODEL := AOSP on IA x86_64 Emulator diff --git a/target/product/generic_no_telephony.mk b/target/product/generic_no_telephony.mk index 7af62ce46..6c23fbb7d 100644 --- a/target/product/generic_no_telephony.mk +++ b/target/product/generic_no_telephony.mk @@ -19,6 +19,7 @@ PRODUCT_PACKAGES := \ Bluetooth \ + BluetoothMidiService \ Camera2 \ Gallery2 \ Music \ @@ -26,6 +27,7 @@ PRODUCT_PACKAGES := \ OneTimeInitializer \ Provision \ SystemUI \ + EasterEgg \ WallpaperCropper PRODUCT_PACKAGES += \ @@ -35,12 +37,7 @@ PRODUCT_PACKAGES += \ screenrecord PRODUCT_PACKAGES += \ - librs_jni \ - libvideoeditor_jni \ - libvideoeditor_core \ - libvideoeditor_osal \ - libvideoeditor_videofilters \ - libvideoeditorplayer \ + librs_jni PRODUCT_PACKAGES += \ audio.primary.default \ @@ -49,9 +46,6 @@ PRODUCT_PACKAGES += \ vibrator.default \ power.default -PRODUCT_PACKAGES += \ - local_time.default - PRODUCT_COPY_FILES := \ frameworks/av/media/libeffects/data/audio_effects.conf:system/etc/audio_effects.conf @@ -63,9 +57,10 @@ $(call inherit-product-if-exists, external/google-fonts/dancing-script/fonts.mk) $(call inherit-product-if-exists, external/google-fonts/carrois-gothic-sc/fonts.mk) $(call inherit-product-if-exists, external/google-fonts/coming-soon/fonts.mk) $(call inherit-product-if-exists, external/google-fonts/cutive-mono/fonts.mk) -$(call inherit-product-if-exists, external/lohit-fonts/fonts.mk) $(call inherit-product-if-exists, external/noto-fonts/fonts.mk) $(call inherit-product-if-exists, external/naver-fonts/fonts.mk) +$(call inherit-product-if-exists, external/roboto-fonts/fonts.mk) +$(call inherit-product-if-exists, external/hyphenation-patterns/patterns.mk) $(call inherit-product-if-exists, frameworks/base/data/keyboards/keyboards.mk) $(call inherit-product-if-exists, frameworks/webview/chromium/chromium.mk) $(call inherit-product, $(SRC_TARGET_DIR)/product/core.mk) diff --git a/target/product/languages_full.mk b/target/product/languages_full.mk index 6d77cde1b..ddc1c7f21 100644 --- a/target/product/languages_full.mk +++ b/target/product/languages_full.mk @@ -21,4 +21,7 @@ # 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 +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 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 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 sq_AL gu_IN pa_IN be_BY bs_BA + +# CyanogenMod +PRODUCT_LOCALES += ast_ES lb_LU ku_IQ diff --git a/target/product/product_launched_with_l.mk b/target/product/product_launched_with_l.mk new file mode 100644 index 000000000..b86f424f3 --- /dev/null +++ b/target/product/product_launched_with_l.mk @@ -0,0 +1,2 @@ +#PRODUCT_SHIPPING_API_LEVEL indicates the first api level, device has been commercially launced on. +PRODUCT_SHIPPING_API_LEVEL := 21 diff --git a/target/product/product_launched_with_l_mr1.mk b/target/product/product_launched_with_l_mr1.mk new file mode 100644 index 000000000..7a5bd0f2d --- /dev/null +++ b/target/product/product_launched_with_l_mr1.mk @@ -0,0 +1,2 @@ +#PRODUCT_SHIPPING_API_LEVEL indicates the first api level, device has been commercially launced on. +PRODUCT_SHIPPING_API_LEVEL := 22 diff --git a/target/product/product_launched_with_m.mk b/target/product/product_launched_with_m.mk new file mode 100644 index 000000000..afd8647dd --- /dev/null +++ b/target/product/product_launched_with_m.mk @@ -0,0 +1,2 @@ +#PRODUCT_SHIPPING_API_LEVEL indicates the first api level, device has been commercially launced on. +PRODUCT_SHIPPING_API_LEVEL := 23 diff --git a/target/product/product_launched_with_n.mk b/target/product/product_launched_with_n.mk new file mode 100644 index 000000000..f7c5d794d --- /dev/null +++ b/target/product/product_launched_with_n.mk @@ -0,0 +1,2 @@ +#PRODUCT_SHIPPING_API_LEVEL indicates the first api level, device has been commercially launced on. +PRODUCT_SHIPPING_API_LEVEL := 24 diff --git a/target/product/runtime_libart.mk b/target/product/runtime_libart.mk index e4200b30f..5fd4d7ec6 100644 --- a/target/product/runtime_libart.mk +++ b/target/product/runtime_libart.mk @@ -17,11 +17,39 @@ # Provides a functioning ART environment without Android frameworks PRODUCT_PACKAGES += \ - core-libart \ - libart \ - dex2oat \ - oatdump \ - patchoat + apache-xml \ + ahat \ + bouncycastle \ + cacerts \ + conscrypt \ + core-oj \ + core-junit \ + core-libart \ + dalvikvm \ + dex2oat \ + dexdeps \ + dexdump \ + dexlist \ + dmtracedump \ + dx \ + ext \ + hprof-conv \ + libart \ + libart_fake \ + libcrypto \ + libexpat \ + libicui18n \ + libicuuc \ + libjavacore \ + libopenjdk \ + libopenjdkjvm \ + libnativehelper \ + libssl \ + libz \ + oatdump \ + okhttp \ + patchoat \ + profman PRODUCT_DEFAULT_PROPERTY_OVERRIDES += \ dalvik.vm.image-dex2oat-Xms=64m \ @@ -29,5 +57,6 @@ PRODUCT_DEFAULT_PROPERTY_OVERRIDES += \ dalvik.vm.dex2oat-Xms=64m \ dalvik.vm.dex2oat-Xmx=512m \ ro.dalvik.vm.native.bridge=0 \ - -include $(SRC_TARGET_DIR)/product/runtime_common.mk + dalvik.vm.usejit=true \ + dalvik.vm.usejitprofiles=true \ + dalvik.vm.appimageformat=lz4 diff --git a/target/product/sdk_base.mk b/target/product/sdk_base.mk index 451c0b71a..fa257aeff 100644 --- a/target/product/sdk_base.mk +++ b/target/product/sdk_base.mk @@ -21,12 +21,12 @@ PRODUCT_PACKAGES := \ CubeLiveWallpapers \ CustomLocale \ Development \ - DevelopmentSettings \ Dialer \ EmulatorSmokeTests \ Fallback \ Gallery \ GestureBuilder \ + Launcher3 \ LegacyCamera \ librs_jni \ libwnndict \ @@ -44,6 +44,7 @@ PRODUCT_PACKAGES := \ SoftKeyboard \ sqlite3 \ SystemUI \ + EasterEgg \ WidgetPreview # Define the host tools and libs that are parts of the SDK. @@ -60,9 +61,11 @@ PRODUCT_PACKAGE_OVERLAYS := development/sdk_overlay PRODUCT_COPY_FILES := \ device/generic/goldfish/data/etc/apns-conf.xml:system/etc/apns-conf.xml \ + device/sample/etc/old-apns-conf.xml:system/etc/old-apns-conf.xml \ frameworks/base/data/sounds/effects/camera_click.ogg:system/media/audio/ui/camera_click.ogg \ frameworks/base/data/sounds/effects/VideoRecord.ogg:system/media/audio/ui/VideoRecord.ogg \ - frameworks/native/data/etc/handheld_core_hardware.xml:system/etc/permissions/handheld_core_hardware.xml \ + frameworks/base/data/sounds/effects/VideoStop.ogg:system/media/audio/ui/VideoStop.ogg \ + device/generic/goldfish/data/etc/handheld_core_hardware.xml:system/etc/permissions/handheld_core_hardware.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 \ @@ -70,6 +73,7 @@ PRODUCT_COPY_FILES := \ device/generic/goldfish/camera/media_codecs.xml:system/etc/media_codecs.xml \ frameworks/native/data/etc/android.hardware.touchscreen.multitouch.jazzhand.xml:system/etc/permissions/android.hardware.touchscreen.multitouch.jazzhand.xml \ frameworks/native/data/etc/android.hardware.camera.autofocus.xml:system/etc/permissions/android.hardware.camera.autofocus.xml \ + frameworks/native/data/etc/android.hardware.fingerprint.xml:system/etc/permissions/android.hardware.fingerprint.xml \ frameworks/av/media/libeffects/data/audio_effects.conf:system/etc/audio_effects.conf \ hardware/libhardware_legacy/audio/audio_policy.conf:system/etc/audio_policy.conf @@ -83,6 +87,7 @@ $(call inherit-product-if-exists, external/google-fonts/coming-soon/fonts.mk) $(call inherit-product-if-exists, external/google-fonts/cutive-mono/fonts.mk) $(call inherit-product-if-exists, external/noto-fonts/fonts.mk) $(call inherit-product-if-exists, external/naver-fonts/fonts.mk) +$(call inherit-product-if-exists, external/roboto-fonts/fonts.mk) $(call inherit-product-if-exists, frameworks/base/data/keyboards/keyboards.mk) $(call inherit-product-if-exists, frameworks/webview/chromium/chromium.mk) $(call inherit-product, $(SRC_TARGET_DIR)/product/core.mk) diff --git a/target/product/sdk_phone_arm64.mk b/target/product/sdk_phone_arm64.mk index c501f1498..a689475b3 100644 --- a/target/product/sdk_phone_arm64.mk +++ b/target/product/sdk_phone_arm64.mk @@ -21,9 +21,16 @@ $(call inherit-product, $(SRC_TARGET_DIR)/product/core_64_bit.mk) $(call inherit-product, $(SRC_TARGET_DIR)/product/sdk_base.mk) +$(call inherit-product, $(SRC_TARGET_DIR)/board/generic_arm64/device.mk) + +# AOSP emulator images build the AOSP messaging app. +# Google API images override with the Google API app. +# See vendor/google/products/sdk_google_phone_*.mk +PRODUCT_PACKAGES += \ + messaging # Overrides -PRODUCT_BRAND := generic_arm64 +PRODUCT_BRAND := Android PRODUCT_NAME := sdk_phone_arm64 PRODUCT_DEVICE := generic_arm64 PRODUCT_MODEL := Android SDK built for arm64 diff --git a/target/product/sdk_phone_armv7.mk b/target/product/sdk_phone_armv7.mk index aeb49402f..ebdd0e7f4 100644 --- a/target/product/sdk_phone_armv7.mk +++ b/target/product/sdk_phone_armv7.mk @@ -16,7 +16,13 @@ $(call inherit-product, $(SRC_TARGET_DIR)/product/sdk_base.mk) +# AOSP emulator images build the AOSP messaging app. +# Google API images override with the Google API app. +# See vendor/google/products/sdk_google_phone_*.mk +PRODUCT_PACKAGES += \ + messaging + # Overrides -PRODUCT_BRAND := generic +PRODUCT_BRAND := Android PRODUCT_NAME := sdk_phone_armv7 PRODUCT_DEVICE := generic diff --git a/target/product/sdk_phone_mips.mk b/target/product/sdk_phone_mips.mk index 818491ffa..1cc2fe4b5 100644 --- a/target/product/sdk_phone_mips.mk +++ b/target/product/sdk_phone_mips.mk @@ -21,8 +21,14 @@ $(call inherit-product, $(SRC_TARGET_DIR)/product/sdk_base.mk) +# AOSP emulator images build the AOSP messaging app. +# Google API images override with the Google API app. +# See vendor/google/products/sdk_google_phone_*.mk +PRODUCT_PACKAGES += \ + messaging + # Overrides -PRODUCT_BRAND := generic_mips +PRODUCT_BRAND := Android PRODUCT_NAME := sdk_phone_mips PRODUCT_DEVICE := generic_mips PRODUCT_MODEL := Android SDK for Mips diff --git a/target/product/sdk_phone_mips64.mk b/target/product/sdk_phone_mips64.mk index afdb2a88c..e45d71bd8 100644 --- a/target/product/sdk_phone_mips64.mk +++ b/target/product/sdk_phone_mips64.mk @@ -22,8 +22,14 @@ $(call inherit-product, $(SRC_TARGET_DIR)/product/core_64_bit.mk) $(call inherit-product, $(SRC_TARGET_DIR)/product/sdk_base.mk) +# AOSP emulator images build the AOSP messaging app. +# Google API images override with the Google API app. +# See vendor/google/products/sdk_google_phone_*.mk +PRODUCT_PACKAGES += \ + messaging + # Overrides -PRODUCT_BRAND := generic_mips64 +PRODUCT_BRAND := Android PRODUCT_NAME := sdk_phone_mips64 PRODUCT_DEVICE := generic_mips64 PRODUCT_MODEL := Android SDK built for mips64 diff --git a/target/product/sdk_phone_x86.mk b/target/product/sdk_phone_x86.mk index 95c49ab64..01c2e8339 100644 --- a/target/product/sdk_phone_x86.mk +++ b/target/product/sdk_phone_x86.mk @@ -21,8 +21,14 @@ $(call inherit-product, $(SRC_TARGET_DIR)/product/sdk_base.mk) +# AOSP emulator images build the AOSP messaging app. +# Google API images override with the Google API app. +# See vendor/google/products/sdk_google_phone_*.mk +PRODUCT_PACKAGES += \ + messaging + # Overrides -PRODUCT_BRAND := generic_x86 +PRODUCT_BRAND := Android PRODUCT_NAME := sdk_phone_x86 PRODUCT_DEVICE := generic_x86 PRODUCT_MODEL := Android SDK built for x86 diff --git a/target/product/sdk_phone_x86_64.mk b/target/product/sdk_phone_x86_64.mk index 69e37afb5..c3bc5e958 100644 --- a/target/product/sdk_phone_x86_64.mk +++ b/target/product/sdk_phone_x86_64.mk @@ -22,8 +22,14 @@ $(call inherit-product, $(SRC_TARGET_DIR)/product/core_64_bit.mk) $(call inherit-product, $(SRC_TARGET_DIR)/product/sdk_base.mk) +# AOSP emulator images build the AOSP messaging app. +# Google API images override with the Google API app. +# See vendor/google/products/sdk_google_phone_*.mk +PRODUCT_PACKAGES += \ + messaging + # Overrides -PRODUCT_BRAND := generic_x86_64 +PRODUCT_BRAND := Android PRODUCT_NAME := sdk_phone_x86_64 PRODUCT_DEVICE := generic_x86_64 PRODUCT_MODEL := Android SDK built for x86_64 diff --git a/target/product/security/README b/target/product/security/README index 24f984c59..15f2e93e0 100644 --- a/target/product/security/README +++ b/target/product/security/README @@ -1,3 +1,14 @@ +For detailed information on key types and image signing, please see: + +https://source.android.com/devices/tech/ota/sign_builds.html + +The test keys in this directory are used in development only and should +NEVER be used to sign packages in publicly released images (as that would +open a major security hole). + +key generation +-------------- + The following commands were used to generate the test key pairs: development/tools/make_key testkey '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com' @@ -5,18 +16,6 @@ The following commands were used to generate the test key pairs: development/tools/make_key shared '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com' development/tools/make_key media '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com' -The following standard test keys are currently included: - -testkey -- a generic key for packages that do not otherwise specify a key. -platform -- a test key for packages that are part of the core platform. -shared -- a test key for things that are shared in the home/contacts process. -media -- a test key for packages that are part of the media/download system. - -These test keys are used strictly in development, and should never be assumed -to convey any sort of validity. When $BUILD_SECURE=true, the code should not -honor these keys in any context. - - signing using the openssl commandline (for boot/system images) -------------------------------------------------------------- @@ -28,7 +27,12 @@ signing using the openssl commandline (for boot/system images) extracting public keys for embedding ------------------------------------ -it's a Java tool -but it generates C code -take a look at commands/recovery/Android.mk -you'll see it running $(HOST_OUT_JAVA_LIBRARIES)/dumpkey.jar + +dumpkey.jar is a Java tool that takes an x.509 certificate in PEM format as +input and prints a C structure to standard output: + + $ java -jar out/host/linux-x86/framework/dumpkey.jar build/target/product/security/testkey.x509.pem + {64,0xc926ad21,{1795090719,2141396315,950055447,2581568430,4268923165,1920809988,546586521,3498997798,1776797858,3740060814,1805317999,1429410244,129622599,1422441418,1783893377,1222374759,2563319927,323993566,28517732,609753416,1826472888,215237850,4261642700,4049082591,3228462402,774857746,154822455,2497198897,2758199418,3019015328,2794777644,87251430,2534927978,120774784,571297800,3695899472,2479925187,3811625450,3401832990,2394869647,3267246207,950095497,555058928,414729973,1136544882,3044590084,465547824,4058146728,2731796054,1689838846,3890756939,1048029507,895090649,247140249,178744550,3547885223,3165179243,109881576,3944604415,1044303212,3772373029,2985150306,3737520932,3599964420},{3437017481,3784475129,2800224972,3086222688,251333580,2131931323,512774938,325948880,2657486437,2102694287,3820568226,792812816,1026422502,2053275343,2800889200,3113586810,165549746,4273519969,4065247892,1902789247,772932719,3941848426,3652744109,216871947,3164400649,1942378755,3996765851,1055777370,964047799,629391717,2232744317,3910558992,191868569,2758883837,3682816752,2997714732,2702529250,3570700455,3776873832,3924067546,3555689545,2758825434,1323144535,61311905,1997411085,376844204,213777604,4077323584,9135381,1625809335,2804742137,2952293945,1117190829,4237312782,1825108855,3013147971,1111251351,2568837572,1684324211,2520978805,367251975,810756730,2353784344,1175080310}} + +This is called by build/core/Makefile to incorporate the OTA signing keys +into the recovery image. diff --git a/target/product/telephony.mk b/target/product/telephony.mk index da1497d09..e840ba126 100644 --- a/target/product/telephony.mk +++ b/target/product/telephony.mk @@ -18,8 +18,11 @@ # to products that have telephony hardware. PRODUCT_PACKAGES := \ + CarrierConfig \ Dialer \ - Mms \ + CallLogBackup \ + CellBroadcastReceiver \ + EmergencyInfo \ rild PRODUCT_COPY_FILES := \ diff --git a/target/product/runtime_common.mk b/target/product/vboot.mk similarity index 53% rename from target/product/runtime_common.mk rename to target/product/vboot.mk index 9ae182a37..48a4883b4 100644 --- a/target/product/runtime_common.mk +++ b/target/product/vboot.mk @@ -1,5 +1,5 @@ # -# Copyright (C) 2013 The Android Open Source Project +# Copyright (C) 2015 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. @@ -14,28 +14,12 @@ # limitations under the License. # -# Common runtime modules for both Dalvik and ART +# Provides dependencies necessary for verified boot -PRODUCT_PACKAGES += \ - apache-xml \ - bouncycastle \ - cacerts \ - conscrypt \ - core-junit \ - dalvikvm \ - dexdeps \ - dexdump \ - dexlist \ - dmtracedump \ - dx \ - ext \ - hprof-conv \ - libcrypto \ - libexpat \ - libicui18n \ - libicuuc \ - libjavacore \ - libnativehelper \ - libssl \ - libz \ - okhttp +PRODUCT_SUPPORTS_VBOOT := true + +# The dev key is used to sign boot and recovery images. +# We expect this file to exist with the suffixes ".vbprivk" and ".vbpupk". +# TODO: find a proper location for this +PRODUCT_VBOOT_SIGNING_KEY := external/vboot_reference/tests/devkeys/kernel_data_key +PRODUCT_VBOOT_SIGNING_SUBKEY := external/vboot_reference/tests/devkeys/kernel_subkey diff --git a/target/product/verity.mk b/target/product/verity.mk index 0361b6414..0badb9feb 100644 --- a/target/product/verity.mk +++ b/target/product/verity.mk @@ -14,14 +14,20 @@ # limitations under the License. # -# Provides dependencies necessary for verified boot +# Provides dependencies necessary for verified boot (only for user and +# userdebug builds) -PRODUCT_SUPPORTS_VERITY := true +user_variant := $(filter user userdebug,$(TARGET_BUILD_VARIANT)) +ifneq (,$(user_variant)) + PRODUCT_SUPPORTS_BOOT_SIGNER := true + PRODUCT_SUPPORTS_VERITY := true + PRODUCT_SUPPORTS_VERITY_FEC := true -# The dev key is used to sign boot and recovery images, and the verity -# metadata table. Actual product deliverables will be re-signed by hand. -# We expect this file to exist with the suffixes ".x509.pem" and ".pk8". -PRODUCT_VERITY_SIGNING_KEY := build/target/product/security/verity + # The dev key is used to sign boot and recovery images, and the verity + # metadata table. Actual product deliverables will be re-signed by hand. + # We expect this file to exist with the suffixes ".x509.pem" and ".pk8". + PRODUCT_VERITY_SIGNING_KEY := build/target/product/security/verity -PRODUCT_PACKAGES += \ - verity_key + PRODUCT_PACKAGES += \ + verity_key +endif diff --git a/tools/Android.mk b/tools/Android.mk index 30febd6a3..9073ac3a2 100644 --- a/tools/Android.mk +++ b/tools/Android.mk @@ -16,17 +16,4 @@ LOCAL_PATH := $(call my-dir) -ifeq (,$(TARGET_BUILD_APPS)) - -ifeq ($(TARGET_BUILD_PDK),true) -include $(filter-out %/acp/Android.mk %/signapk/Android.mk %/zipalign/Android.mk,\ - $(call all-makefiles-under,$(LOCAL_PATH))) -else # !PDK include $(call all-makefiles-under,$(LOCAL_PATH)) -endif # PDK - -else # TARGET_BUILD_APPS - -include $(LOCAL_PATH)/apicheck/Android.mk - -endif diff --git a/tools/acp/Android.mk b/tools/acp/Android.mk index 33c55675f..eec9c9db3 100644 --- a/tools/acp/Android.mk +++ b/tools/acp/Android.mk @@ -3,23 +3,15 @@ # Custom version of cp. LOCAL_PATH:= $(call my-dir) + include $(CLEAR_VARS) LOCAL_SRC_FILES := \ acp.c -ifeq ($(HOST_OS),cygwin) -LOCAL_CFLAGS += -DWIN32_EXE -endif -ifeq ($(HOST_OS),darwin) -LOCAL_CFLAGS += -DMACOSX_RSRC -endif -ifeq ($(HOST_OS),linux) -endif - LOCAL_STATIC_LIBRARIES := libhost -LOCAL_C_INCLUDES := build/libs/host/include LOCAL_MODULE := acp LOCAL_ACP_UNAVAILABLE := true +LOCAL_CXX_STL := none include $(BUILD_HOST_EXECUTABLE) diff --git a/tools/apicheck/Android.mk b/tools/apicheck/Android.mk index 1674a17e9..b5470588e 100644 --- a/tools/apicheck/Android.mk +++ b/tools/apicheck/Android.mk @@ -15,26 +15,15 @@ ifneq ($(TARGET_BUILD_PDK),true) LOCAL_PATH := $(call my-dir) -# We use copy-file-to-new-target so that the installed -# script file's timestamp is at least as new as the -# .jar file it wraps. - -#TODO(dbort): add a template to do this stuff; share with jx - # the hat script # ============================================================ include $(CLEAR_VARS) LOCAL_IS_HOST_MODULE := true LOCAL_MODULE_CLASS := EXECUTABLES LOCAL_MODULE := apicheck - -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) ($@)" - $(copy-file-to-new-target) - $(hide) chmod 755 $@ +LOCAL_SRC_FILES := etc/apicheck +LOCAL_REQUIRED_MODULES := doclava +include $(BUILD_PREBUILT) # Apicheck is now part of Doclava -- See external/doclava. endif diff --git a/tools/atree/Android.mk b/tools/atree/Android.mk index d895810f3..f598db588 100644 --- a/tools/atree/Android.mk +++ b/tools/atree/Android.mk @@ -12,7 +12,6 @@ LOCAL_SRC_FILES := \ LOCAL_STATIC_LIBRARIES := \ libhost -LOCAL_C_INCLUDES := build/libs/host/include LOCAL_MODULE := atree diff --git a/tools/atree/files.cpp b/tools/atree/files.cpp index df3e98742..d945f589c 100644 --- a/tools/atree/files.cpp +++ b/tools/atree/files.cpp @@ -447,14 +447,7 @@ list_dir(const string& path, const FileRecord& rec, continue; } string entry = path_append(path, ent->d_name); -#ifdef HAVE_DIRENT_D_TYPE - bool is_directory = (ent->d_type == DT_DIR); -#else - // If dirent.d_type is missing, then use stat instead - struct stat stat_buf; - stat(entry.c_str(), &stat_buf); - bool is_directory = S_ISDIR(stat_buf.st_mode); -#endif + bool is_directory = (ent->d_type == DT_DIR); add_more(entry, is_directory, rec, more); if (is_directory) { dirs.push_back(entry); diff --git a/tools/atree/fs.cpp b/tools/atree/fs.cpp index 9468cfd9b..6cd080e87 100644 --- a/tools/atree/fs.cpp +++ b/tools/atree/fs.cpp @@ -63,14 +63,7 @@ remove_recursively(const string& path) string full = path; full += '/'; full += ent->d_name; -#ifdef HAVE_DIRENT_D_TYPE bool is_directory = (ent->d_type == DT_DIR); -#else - // If dirent.d_type is missing, then use stat instead - struct stat stat_buf; - stat(full.c_str(), &stat_buf); - bool is_directory = S_ISDIR(stat_buf.st_mode); -#endif if (is_directory) { dirs.push_back(full); } else { diff --git a/tools/buildinfo.sh b/tools/buildinfo.sh index a80b2db47..43c8e9d41 100755 --- a/tools/buildinfo.sh +++ b/tools/buildinfo.sh @@ -7,16 +7,25 @@ echo "ro.build.id=$BUILD_ID" echo "ro.build.display.id=$BUILD_DISPLAY_ID" echo "ro.build.version.incremental=$BUILD_NUMBER" echo "ro.build.version.sdk=$PLATFORM_SDK_VERSION" +echo "ro.build.version.preview_sdk=$PLATFORM_PREVIEW_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.date=`date`" -echo "ro.build.date.utc=`date +%s`" +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" echo "ro.build.user=$USER" echo "ro.build.host=`hostname`" echo "ro.build.tags=$BUILD_VERSION_TAGS" echo "ro.build.flavor=$TARGET_BUILD_FLAVOR" +if [ -n "$BOARD_BUILD_SYSTEM_ROOT_IMAGE" ] ; then + echo "ro.build.system_root_image=$BOARD_BUILD_SYSTEM_ROOT_IMAGE" +fi +if [ -n "$AB_OTA_UPDATER" ] ; then + echo "ro.build.ab_update=$AB_OTA_UPDATER" +fi echo "ro.product.model=$PRODUCT_MODEL" echo "ro.product.brand=$PRODUCT_BRAND" echo "ro.product.name=$PRODUCT_NAME" @@ -36,11 +45,8 @@ echo "ro.product.cpu.abilist32=$TARGET_CPU_ABI_LIST_32_BIT" echo "ro.product.cpu.abilist64=$TARGET_CPU_ABI_LIST_64_BIT" echo "ro.product.manufacturer=$PRODUCT_MANUFACTURER" -if [ -n "$PRODUCT_DEFAULT_LANGUAGE" ] ; then - echo "ro.product.locale.language=$PRODUCT_DEFAULT_LANGUAGE" -fi -if [ -n "$PRODUCT_DEFAULT_REGION" ] ; then - echo "ro.product.locale.region=$PRODUCT_DEFAULT_REGION" +if [ -n "$PRODUCT_DEFAULT_LOCALE" ] ; then + echo "ro.product.locale=$PRODUCT_DEFAULT_LOCALE" fi echo "ro.wifi.channels=$PRODUCT_DEFAULT_WIFI_CHANNELS" echo "ro.board.platform=$TARGET_BOARD_PLATFORM" @@ -56,4 +62,6 @@ if [ -n "$BUILD_THUMBPRINT" ] ; then fi echo "ro.build.characteristics=$TARGET_AAPT_CHARACTERISTICS" +echo "ro.cm.device=$CM_DEVICE" + echo "# end build properties" diff --git a/tools/check_prereq/check_prereq.c b/tools/check_prereq/check_prereq.c deleted file mode 100644 index d7b8918fc..000000000 --- a/tools/check_prereq/check_prereq.c +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (C) 2009 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. - */ - -#include -#include -#include -#include - -// Compare the timestamp of the new build (passed on the command line) -// against the current value of ro.build.date.utc. Exit successfully -// if the new build is newer than the current build (or if the -// timestamps are the same). -int main(int argc, char** argv) { - if (argc != 2) { - usage: - fprintf(stderr, "usage: %s \n", argv[0]); - return 2; - } - - char value[PROPERTY_VALUE_MAX]; - char* default_value = "0"; - - property_get("ro.build.date.utc", value, default_value); - - long current = strtol(value, NULL, 10); - char* end; - long install = strtol(argv[1], &end, 10); - - printf("current build time: [%ld] new build time: [%ld]\n", - current, install); - - return (*end == 0 && current > 0 && install >= current) ? 0 : 1; -} diff --git a/tools/droiddoc/templates-ds/assets/android-developer-core.css b/tools/droiddoc/templates-ds/assets/android-developer-core.css deleted file mode 100644 index f548a6cbd..000000000 --- a/tools/droiddoc/templates-ds/assets/android-developer-core.css +++ /dev/null @@ -1,1197 +0,0 @@ -/* file: android-developer-core.css - author: smain - date: september 2008 - info: core developer styles (developer.android.com) -*/ - - -/* RESET STYLES */ - -html,body,div,h1,h2,h3,h4,h5,h6,p,img, -dl,dt,dd,ol,ul,li,table,caption,tbody, -tfoot,thead,tr,th,td,form,fieldset, -embed,object,applet { - margin: 0; - padding: 0; - border: 0; -} - -/* BASICS */ - -html, body { - overflow:hidden; /* keeps scrollbar off IE */ - background-color:#fff; -} - -body { - font-family:arial,sans-serif; - color:#000; - font-size:13px; - color:#333; - background-image:url(images/bg_fade.jpg); - background-repeat:repeat-x; -} - -a, a code { - color:#006699; -} - -a:active, -a:active code { - color:#f00; -} - -a:visited, -a:visited code { - color:#006699; -} - -input, select, -textarea, option, label { - font-family:inherit; - font-size:inherit; - padding:0; - margin:0; - vertical-align:middle; -} - -option { - padding:0 4px; -} - -p, form { - padding:0; - margin:0 0 1em; -} - -code, pre { - color:#007000; - font-family:monospace; - line-height:1em; -} - -var { - color:#007000; - font-style:italic; -} - -pre { - border:1px solid #ccc; - background-color:#fafafa; - padding:10px; - margin:0 0 1em 1em; - overflow:auto; - line-height:inherit; /* fixes vertical scrolling in webkit */ -} - -h1,h2,h3,h4,h5 { - margin:1em 0; - padding:0; -} - -p,ul,ol,dl,dd,dt,li { - line-height:1.3em; -} - -ul,ol { - margin:0 0 .8em; - padding:0 0 0 2em; -} - -li { - padding:0 0 .5em; -} - -dl { - margin:0 0 1em 0; - padding:0; -} - -dt { - margin:0; - padding:0; -} - -dd { - margin:0 0 1em; - padding:0 0 0 2em; -} - -li p { - margin:.5em 0 0; -} - -dd p { - margin:1em 0 0; -} - -li pre, li table, li img { - margin:.5em 0 0 1em; -} - -dd pre, -#jd-content dd table, -#jd-content dd img { - margin:1em 0 0 1em; -} - -li ul, -li ol, -dd ul, -dd ol { - margin:0; - padding: 0 0 0 2em; -} - -li li, -dd li { - margin:0; - padding:.5em 0 0; -} - -dl dl, -ol dl, -ul dl { - margin:0 0 1em; - padding:0; -} - -table { - font-size:1em; - margin:0 0 1em; - padding:0; - border-collapse:collapse; - border-width:0; - empty-cells:show; -} - -td,th { - border:1px solid #ccc; - padding:6px 12px; - text-align:left; - vertical-align:top; - background-color:inherit; -} - -th { - background-color:#dee8f1; -} - -td > p:last-child { - margin:0; -} - -hr.blue { - background-color:#DDF0F2; - border:none; - height:5px; - margin:20px 0 10px; -} - -blockquote { - margin: 0 0 1em 1em; - padding: 0 4em 0 1em; - border-left:2px solid #eee; -} -/* LAYOUT */ - -#body-content { - /* "Preliminary" watermark for preview releases and interim builds. - background:transparent url(images/preliminary.png) repeat scroll 0 0; */ - margin:0; - position:relative; - width:100%; -} - -#header { - height: 114px; - position:relative; - z-index:100; - min-width:675px; /* min width for the tabs, before they wrap */ - padding:0 10px; - border-bottom:3px solid #94b922; -} - -#headerLeft{ - padding: 25px 0 0; -} - -#headerLeft img{ - height:50px; - width:180px; -} - -#headerRight { - position:absolute; - right:0; - top:0; - text-align:right; -} - -/* Tabs in the header */ - -#header ul { - list-style: none; - margin: 7px 0 0; - padding: 0; - height: 29px; -} - -#header li { - float: left; - margin: 0px 2px 0px 0px; - padding:0; -} - -#header li a { - text-decoration: none; - display: block; - background-image: url(images/bg_images_sprite.png); - background-position: 0 -58px; - background-repeat: no-repeat; - color: #666; - font-size: 13px; - font-weight: bold; - width: 94px; - height: 29px; - text-align: center; - margin: 0px; -} - -#header li a:hover { - background-image: url(images/bg_images_sprite.png); - background-position: 0 -29px; - background-repeat: no-repeat; -} - -#header li a span { - position:relative; - top:7px; -} - -#header li a span+span { - display:none; -} - -/* tab highlighting */ - -.home #home-link a, -.guide #guide-link a, -.reference #reference-link a, -.sdk #sdk-link a, -.resources #resources-link a, -.videos #videos-link a { - background-image: url(images/bg_images_sprite.png); - background-position: 0 0; - background-repeat: no-repeat; - color: #fff; - font-weight: bold; - cursor:default; -} - -.home #home-link a:hover, -.guide #guide-link a:hover, -.reference #reference-link a:hover, -.sdk #sdk-link a:hover, -.resources #resources-link a:hover, -.videos #videos-link a:hover { - background-image: url(images/bg_images_sprite.png); - background-position: 0 0; -} - -#headerLinks { - margin:10px 10px 0 0; - height:13px; - font-size: 11px; - vertical-align: top; -} - -#headerLinks a { - color: #7FA9B5; -} - -#headerLinks img { - vertical-align:middle; -} - -#language { - margin:0 10px 0 4px; -} - -#search { - height:45px; - margin:15px 10px 0 0; -} - -/* MAIN BODY */ - -#mainBodyFluid { - margin: 20px 10px; - color:#333; -} - -#mainBodyFixed { - margin: 20px 10px; - color: #333; - width:930px; - position:relative; -} - -#mainBodyFixed h3, -#mainBodyFluid h3 { - color:#336666; - font-size:1.25em; - margin: 0em 0em 0em 0em; - padding-bottom:.5em; -} - -#mainBodyFixed h2, -#mainBodyFluid h2 { - color:#336666; - font-size:1.25em; - margin: 0; - padding-bottom:.5em; -} - -#mainBodyFixed h1, -#mainBodyFluid h1 { - color:#435A6E; - font-size:1.7em; - margin: 1em 0; -} - -#mainBodyFixed .green, -#mainBodyFluid .green, -#jd-content .green { - color:#7BB026; - background-color:none; -} - -#mainBodyLeft { - float: left; - width: 600px; - margin-right: 20px; - color: #333; - position:relative; -} - -div.indent { - margin-left: 40px; - margin-right: 70px; -} - -#mainBodyLeft p { - color: #333; - font-size: 13px; -} - -#mainBodyLeft p.blue { - color: #669999; -} - -#mainBodyLeft #communityDiv { - float: left; - background-image:url(images/bg_community_leftDiv.jpg); - background-repeat: no-repeat; - width: 581px; - height: 347px; - padding: 20px 0px 0px 20px; -} - -#mainBodyRight { - float: left; - width: 300px; - color: #333; -} - -#mainBodyRight p { - padding-right: 50px; - color: #333; -} - -#mainBodyRight table { - width: 100%; -} - -#mainBodyRight td { - border:0px solid #666; - padding:0px 5px; - text-align:left; -} - -#mainBodyRight td p { - margin:0 0 1em 0; -} - -#mainBodyRight .blueBorderBox { - border:5px solid #ddf0f2; - padding:18px 18px 18px 18px; - text-align:left; -} - -#mainBodyFixed .seperator { - background-image:url(images/hr_gray_side.jpg); - background-repeat:no-repeat; - width: 100%; - float: left; - clear: both; -} - -#mainBodyBottom { - float: left; - width: 100%; - clear:both; - color: #333; -} - -#mainBodyBottom .seperator { - background-image:url(images/hr_gray_main.jpg); - background-repeat:no-repeat; - width: 100%; - float: left; - clear: both; -} - -/* FOOTER */ - -#footer { - float: left; - width:90%; - margin: 20px; - color: #aaa; - font-size: 11px; -} - -#footer a { - color: #aaa; - font-size: 11px; -} - -#footer a:hover { - text-decoration: underline; - color:#aaa; -} - -#footerlinks { - margin-top:2px; -} - -#footerlinks a, -#footerlinks a:visited { - color:#006699; -} - -/* SEARCH FILTER */ - -#search_autocomplete { - color:#aaa; -} - -#search-button { - display:inline; -} - -#search_filtered_div { - position:absolute; - margin-top:-1px; - z-index:101; - border:1px solid #BCCDF0; - background-color:#fff; -} - -#search_filtered { - min-width:100%; -} -#search_filtered td{ - background-color:#fff; - border-bottom: 1px solid #669999; - line-height:1.5em; -} - -#search_filtered .jd-selected { - background-color: #94b922; - cursor:pointer; -} -#search_filtered .jd-selected, -#search_filtered .jd-selected a { - color:#fff; -} - -.no-display { - display: none; -} - -.jd-autocomplete { - font-family: Arial, sans-serif; - padding-left: 6px; - padding-right: 6px; - padding-top: 1px; - padding-bottom: 1px; - font-size: 0.81em; - border: none; - margin: 0; - line-height: 1.05em; -} - -.show-row { - display: table-row; -} -.hide-row { - display: hidden; -} - -/* SEARCH */ - -/* restrict global search form width */ -#searchForm { - width:350px; -} - -#searchTxt { - width:200px; -} - -/* disable twiddle and size selectors for left column */ -#leftSearchControl div { - width: 100%; -} - -#leftSearchControl .gsc-twiddle { - background-image : none; -} - -#leftSearchControl td, #searchForm td { - border: 0px solid #000; -} - -#leftSearchControl .gsc-resultsHeader .gsc-title { - padding-left : 0px; - font-weight : bold; - font-size : 13px; - color:#006699; - display : none; -} - -#leftSearchControl .gsc-resultsHeader div.gsc-results-selector { - display : none; -} - -#leftSearchControl .gsc-resultsRoot { - padding-top : 6px; -} - -#leftSearchControl div.gs-visibleUrl-long { - display : block; - color:#006699; -} - -.gsc-webResult div.gs-visibleUrl-short, -table.gsc-branding, -.gsc-clear-button { - display : none; -} - -.gsc-cursor-box .gsc-cursor div.gsc-cursor-page, -.gsc-cursor-box .gsc-trailing-more-results a.gsc-trailing-more-results, -#leftSearchControl a, -#leftSearchControl a b { - color:#006699; -} - -.gsc-resultsHeader { - display: none; -} - -/* Disable built in search forms */ -.gsc-control form.gsc-search-box { - display : none; -} -table.gsc-search-box { - margin:6px 0 0 0; - border-collapse:collapse; -} - -td.gsc-input { - padding:0 2px; - width:100%; - vertical-align:middle; -} - -input.gsc-input { - border:1px solid #BCCDF0; - width:99%; - padding-left:2px; - font-size:.95em; -} - -td.gsc-search-button { - text-align: right; - padding:0; - vertical-align:top; -} - -#search-button { - margin:0 0 0 2px; - font-size:11px; -} - -/* search result tabs */ - -#doc-content .gsc-control { - position:relative; -} - -#doc-content .gsc-tabsArea { - position:relative; - white-space:nowrap; -} - -#doc-content .gsc-tabHeader { - padding: 3px 6px; - position:relative; - width:auto; -} - -#doc-content .gsc-tabHeader.gsc-tabhActive { - border-top: 2px solid #94B922; -} - -#doc-content h2#searchTitle { - padding:0; -} - -#doc-content .gsc-resultsbox-visible { - padding:1em 0 0 6px; -} - -/* CAROUSEL */ - -#homeMiddle { - padding: 0px 0px 0px 0px; - float: left; - width: 584px; - height: 627px; - position:relative; -} - -#topAnnouncement { - background:url(images/home/bg_home_announcement.png) no-repeat 0 0; -} - -#homeTitle { - padding:15px 15px 0; - height:30px; -} - -#homeTitle h2 { - padding:0; -} - -#announcement-block { - padding:0 15px 0; - overflow:hidden; - background: url(images/hr_gray_side.jpg) no-repeat 15px 0; - zoom:1; -} - -#announcement-block>* { - padding:15px 0 0; -} - -#announcement-block img { - float:left; - margin:0 30px 0 0; -} - -#announcement { - float:left; - margin:0; -} - -#carousel { - background:url(images/home/bg_home_carousel.png) no-repeat 0 0; - position:relative; - height:400px; -} - -#carouselMain { - background: url(images/home/bg_home_carousel_board.png) 0 0 no-repeat; - height:auto; - padding: 25px 21px 0; - overflow:hidden; - position:relative; - zoom:1; /*IE6*/ -} - -#carouselMain img { - margin:0; -} - -#carouselMain .bulletinDesc h3 { - margin:0; - padding:0; -} - -#carouselMain .bulletinDesc p { - margin:0; - padding:0.7em 0 0; -} - -#carouselWheel { - background: url(images/home/bg_home_carousel_wheel.png) 0 0 no-repeat; - padding-top:40px; - height:150px; -} - -.clearer { clear:both; } - -a#arrow-left, a#arrow-right { - float:left; - width:42px; - height:42px; - background-image:url(images/home/carousel_buttons_sprite.png); - background-repeat:no-repeat; -} -a#arrow-left { - margin:35px 3px 0 10px; -} -a#arrow-right { - margin:35px 10px 0 0; -} -a.arrow-left-off, -a#arrow-left.arrow-left-off:hover { - background-position:0 0; -} -a.arrow-right-off, -a#arrow-right.arrow-right-off:hover { - background-position:-42px 0; -} -a#arrow-left:hover { - background-position:0 -42px; -} -a#arrow-right:hover { - background-position:-42px -42px; -} -a.arrow-left-on { - background-position:0 0; -} -a.arrow-right-on { - background-position:-42px 0; -} -a.arrow-right-off, -a.arrow-left-off { - cursor:default; -} - -.app-list-container { - margin:0 20px; - position:relative; - width:100%; -} - -div#list-clip { - height:110px; - width:438px; - overflow:hidden; - position:relative; - float:left; -} - -div#app-list { - left:0; - z-index:1; - position:absolute; - margin:11px 0 0; - _margin-top:13px; - width:1000%; -} - -#app-list a { - display:block; - float:left; - height:90px; - width:90px; - margin:0 24px 0; - padding:3px; - background:#99cccc; - -webkit-border-radius:7px; - -moz-border-radius:7px; - border-radius:7px; - text-decoration:none; - text-align:center; - font-size:11px; - line-height:11px; -} - -#app-list a span { - position:relative; - top:-4px; -} - -#app-list img { - width:90px; - height:70px; - margin:0; -} - -#app-list a.selected, -#app-list a:active.selected, -#app-list a:hover.selected { - background:#A4C639; - color:#fff; - cursor:default; - text-decoration:none; -} - -#app-list a:hover, -#app-list a:active { - background:#ff9900; -} - -#app-list a:hover span, -#app-list a:active span { - text-decoration:underline; -} - -#droid-name { - padding-top:.5em; - color:#666; - padding-bottom:.25em; -} - -/*IE6*/ -* html #app-list a { zoom: 1; margin:0 24px 0 15px;} - -* html #list-clip { - width:430px !important; -} - -/*carousel bulletin layouts*/ -/*460px width*/ -/*185px height*/ -.img-left { - float:left; - width:230px; - overflow:hidden; - padding:8px 0 8px 8px; -} -.desc-right { - float:left; - width:270px; - padding:10px; -} -.img-right { - float:right; - width:220px; - overflow:hidden; - padding:8px 8px 8px 0; -} -.desc-left { - float:right; - width:280px; - padding:10px; - text-align:right; -} -.img-top { - padding:20px 20px 0; -} -.desc-bottom { - padding:10px; -} - - -/* VIDEO PAGE */ - -#mainBodyLeft.videoPlayer { - width:570px; -} - -#mainBodyRight.videoPlayer { - width:330px; -} - -/* player */ - -#videoPlayerBox { - background-color: #DAF3FC; - border-radius:7px; - -moz-border-radius:7px; - -webkit-border-radius:7px; - width:530px; - padding:20px; - border:1px solid #d3ecf5; - box-shadow:2px 3px 1px #eee; - -moz-box-shadow:2px 3px 1px #eee; - -webkit-box-shadow:2px 3px 1px #eee; -} - -#videoBorder { - background-color: #FFF; - min-height:399px; - height:auto !important; - border:1px solid #ccdada; - border-radius:7px 7px 0 0; - -moz-border-radius:7px 7px 0 0; - -webkit-border-top-left-radius:7px; - -webkit-border-top-right-radius:7px; -} - -#videoPlayerTitle { - width:500px; - padding:15px 15px 0; -} - -#videoPlayerTitle h2 { - font-weight:bold; - font-size:1.2em; - color:#336666; - margin:0; - padding:0; -} - -#objectWrapper { - padding:15px 15px; - height:334px; - width:500px; -} - -/* playlist tabs */ - -ul#videoTabs { - list-style-type:none; - padding:0; - clear:both; - margin:0; - padding: 20px 0 0 15px; - zoom:1; /* IE7/8, otherwise top-padding is double */ -} - -ul#videoTabs li { - display:inline; - padding:0; - margin:0 3px 0 0; - line-height:2em; -} - -ul#videoTabs li a { - border-radius:7px 7px 0 0; - -moz-border-radius:7px 7px 0 0; - -webkit-border-top-left-radius:7px; - -webkit-border-top-right-radius:7px; - background:#95c0d0; - color:#fff; - text-decoration:none; - padding:.45em 1.5em; - font-weight:bold; -} - -ul#videoTabs li.selected a { - font-weight:bold; - text-decoration:none; - color:#555; - background:#daf3fc; - border-bottom:1px solid #daf3fc; -} - -ul#videoTabs li:hover a { - background:#85acba; -} - -ul#videoTabs li.selected:hover a { - background:#daf3fc; -} - -/* playlists */ - -#videos { - background:#daf3fc; - margin-bottom:1.5em; - padding:15px; - border-radius:5px; - -moz-border-radius:5px; - -webkit-border-radius:5px; - box-shadow:2px 3px 1px #eee; - -moz-box-shadow:2px 3px 1px #eee; - -webkit-box-shadow:2px 3px 1px #eee; -} - -#videos div { - display:none; -} - -#videos div.selected { - display:block; -} - -ul.videoPreviews { - list-style:none; - padding:0; - margin:0; - zoom:1; /* IE, otherwise, layout doesn't update when showing 'more' */ -} - -ul.videoPreviews li { - margin:0 0 5px; - padding:0; - overflow:hidden; - position:relative; -} - -#mainBodyFixed ul.videoPreviews h3 { - font-size: 12px; - margin:0 0 1em 130px; - padding:0; - font-weight:bold; - color:inherit; -} - -ul.videoPreviews a { - margin:1px; - padding:10px; - text-decoration:none; - height:90px; - display:block; - border-radius:5px; - -moz-border-radius:5px; - -webkit-border-radius:5px; - background-color:transparent; -} - -ul.videoPreviews a:hover { - background-color:#FFF; - border:none; /* IE8, otherwise, bg doesn't work */ -} - -ul.videoPreviews a.selected { - background-color: #FF9900; -} - -ul.videoPreviews img { - float:left; - clear:left; - margin:0; -} - -ul.videoPreviews h3 { - font-size:12px; - font-weight:bold; - text-decoration:none; - margin:0 0 1em 130px; - padding:0; -} - -ul.videoPreviews p { - font-size: 12px; - text-decoration:none; - margin:0 0 1.2em 130px; -} - -ul.videoPreviews p.full { - display:none; -} - -ul.videoPreviews span.more { - padding:0 0 0 12px; - background:url(images/arrow_bluelink_down.png) 0 2px no-repeat; -} - -ul.videoPreviews span.less { - padding:0 0 0 12px; - background:url(images/arrow_bluelink_up.png) 0 2px no-repeat; - display:none; -} - -ul.videoPreviews p.toggle { - position:absolute; - margin:0; - margin-top:-23px; /* instead of bottom:23px, because IE won't do it correctly */ - left:140px; -} - -ul.videoPreviews p.toggle a { - height:auto; - margin:0; - padding:0; - zoom:1; /* IE6, otherwise the margin considers the img on redraws */ -} - -ul.videoPreviews p.toggle a:hover { - text-decoration:underline; - background:transparent; /* IE6, otherwise it inherits white */ -} - -/* featured videos */ - -#mainBodyRight h2 { - padding:0 0 5px; -} - -#mainBodyRight ul.videoPreviews { - margin:10px 0 0; -} - -#mainBodyRight ul.videoPreviews li { - font-size:11px; - line-height:13px; - margin:0 0 5px; - padding:0; -} - -#mainBodyRight ul.videoPreviews h3 { - padding:0; - margin:0; - font-size:100%; -} - -#mainBodyRight ul.videoPreviews a { - text-decoration:none; - height:108px; - border:1px solid #FFF; -} - -#mainBodyRight ul.videoPreviews a:hover { - border:1px solid #CCDADA; -} - -#mainBodyRight ul.videoPreviews a.selected { - border:1px solid #FFF; -} - -#mainBodyRight ul.videoPreviews p { - line-height:1.2em; - padding:0; - margin:4px 0 0 130px; -} - -#mainBodyRight ul.videoPreviews img { - margin-top:5px; -} - -/* Pretty printing styles. Used with prettify.js. */ - -.str { color: #080; } -.kwd { color: #008; } -.com { color: #800; } -.typ { color: #606; } -.lit { color: #066; } -.pun { color: #660; } -.pln { color: #000; } -dl.tag-list dt code, -.tag { color: #008; } -dl.atn-list dt code, -.atn { color: #828; } -.atv { color: #080; } -.dec { color: #606; } - -@media print { - .str { color: #060; } - .kwd { color: #006; font-weight: bold; } - .com { color: #600; font-style: italic; } - .typ { color: #404; font-weight: bold; } - .lit { color: #044; } - .pun { color: #440; } - .pln { color: #000; } - .tag { color: #006; font-weight: bold; } - .atn { color: #404; } - .atv { color: #060; } -} diff --git a/tools/droiddoc/templates-ds/assets/android-developer-docs.css b/tools/droiddoc/templates-ds/assets/android-developer-docs.css deleted file mode 100644 index b8b9c71ca..000000000 --- a/tools/droiddoc/templates-ds/assets/android-developer-docs.css +++ /dev/null @@ -1,1576 +0,0 @@ -/* file: android-developer-docs.css - author: smain - date: september 2008 - info: developer doc styles (developer.android.com) -*/ - -@import url("android-developer-core.css"); - -#title { - border-bottom: 4px solid #ccc; - display:none; -} - -#title h1 { - color:#336666; - margin:0; - padding: 5px 10px; - font-size: 1em; - line-height: 15px; -} - -#title h1 .small{ - color:#000; - margin:0; - font-size: 13px; - padding:0 0 0 15px; -} - -/* SIDE NAVIGATION */ - -#side-nav { - padding:0 6px 0 0; - background-color: #fff; - font-size:12px; -} - -#resize-packages-nav { -/* keeps the resize handle below the h-scroll handle */ - height:270px; - overflow:hidden; - max-height:100%; -} - -#packages-nav { - height:270px; - max-height:inherit; - position:relative; - overflow:auto; -} - -#classes-nav, -#devdoc-nav { - overflow:auto; - position:relative; -} - -#side-nav ul { - list-style: none; - margin: 0; - padding:5px 0; -} - -#side-nav ul ul { - margin: .5em 0 0 0; - padding: 0; -} - -#side-nav li { - padding:0; - padding:1px 0 1px 0; - zoom:1; -} - -#side-nav li span.heading, -#side-nav li h2 { - display:block; - font-size:12px; - font-weight: bold; - margin:.5em 0 0 0; - padding: 3px 0 1px 9px; -} - -#side-nav li a { - display: inline-block; /* needed to apply padding to line-wraps */ - text-decoration:none; - padding: 0 0 0 18px; - zoom:1; -} - -#side-nav li a span+span { - display:none; -} - -#side-nav li a:hover { - text-decoration:underline; -} - -#side-nav li a+a { - padding: 0; -} -/*second level (nested) list*/ -#side-nav li li li a { - padding: 0 0 0 28px; -} -/*third level (nested) list*/ -#side-nav li li li li a { - padding: 0 0 0 38px; -} - -#side-nav .selected { - background-color: #435a6e; - color: #fff; - font-weight:bold; -} - -#side-nav .selected a { - color: #fff; - text-decoration:none; -} - -#side-nav strong { - display:block; -} - -#side-nav .toggle-list .toggle-img { - margin:0; - padding:0; - position:absolute; - top:0; - left:0; - height:16px; - width:15px; - outline-style:none; -} -/* second-level toggle */ -#side-nav .toggle-list .toggle-list .toggle-img { - left:10px; -} - -#side-nav .closed .toggle-img, -#side-nav .open .closed .toggle-img { - background:url('images/triangle-closed-small.png') 7px 4px no-repeat; -} -#side-nav .open .toggle-img { - background:url('images/triangle-opened-small.png') 7px 4px no-repeat; -} - -#side-nav .toggle-list { - position:relative; -} - -#side-nav .toggle-list ul { - margin:0; - display:none; -} - -#side-nav .toggle-list div { - display:block; -} - -#index-links .selected { - background-color: #fff; - color: #000; - font-weight:normal; - text-decoration:none; -} - -#index-links { - padding:7px 0 4px 10px; -} - -/* nav tree */ - -#nav-tree ul { - padding:5px 0 1.5em; -} - -#side-nav #nav-tree ul li a, -#side-nav #nav-tree ul li span.no-children { - padding: 0 0 0 0; - margin: 0; -} - -#nav-tree .plus { - margin: 0 3px 0 0; -} - -#nav-tree ul ul { - list-style: none; - margin: 0; - padding: 0 0 0 0; -} - -#nav-tree ul li { - margin: 0; - padding: 0 0 0 0; - white-space: nowrap; -} - -#nav-tree .children_ul { - margin:0; -} - -#nav-tree a.nolink { - color: black; - text-decoration: none; -} - -#nav-tree span.label { - width: 100%; -} - -#nav-tree { - overflow-x: auto; - overflow-y: scroll; -} - -#nav-swap { - font-size:10px; - line-height:10px; - margin-left:1em; - text-decoration:none; - display:block; -} - -#tree-link { - -} - -/* DOCUMENT BODY */ - -#doc-content { - overflow:auto; -} - -#jd-header { - background-color: #E2E2E2; - padding: 7px 15px; -} - -#jd-header h1 { - margin: 0 0 10px; - font-size:1.7em; -} - -#jd-header .crumb { - font-size:.9em; - line-height:1em; - color:#777; -} - -#jd-header .crumb a, -#jd-header .crumb a:visited { - text-decoration:none; - color:#777; -} - -#jd-header .crumb a:hover { - text-decoration:underline; -} - -#jd-header table { - margin:0; - padding:0; -} - -#jd-header td { - border:none; - padding:0; - vertical-align:top; -} - -#jd-header.guide-header { - background-color:#fff; - color:#435a6e; - height:50px; -} - -#jd-descr { - position:relative; -} - -/* summary tables for reference pages */ -.jd-sumtable { - margin: .5em 1em 1em 1em; - width:95%; /* consistent table widths; within IE's quirks */ - font-size:.9em; -} - -.jd-sumtable a { - text-decoration:none; -} - -.jd-sumtable a:hover { - text-decoration:underline; -} - -/* the link inside a sumtable for "Show All/Hide All" */ -.toggle-all { - display:block; - float:right; - font-weight:normal; - font-size:0.9em; -} - -/* adjustments for in/direct subclasses tables */ -.jd-sumtable-subclasses { - margin: 1em 0 0 0; - max-width:968px; -} - -/* extra space between end of method name and open-paren */ -.sympad { - margin-right: 2px; -} - -/* right alignment for the return type in sumtable */ -.jd-sumtable .jd-typecol { - text-align:right; -} - -/* adjustments for the expando table-in-table */ -.jd-sumtable-expando { - margin:.5em 0; - padding:0; -} - -/* a div that holds a short description */ -.jd-descrdiv { - padding:3px 1em 0 1em; - margin:0; - border:0; -} - -/* page-top-right container for reference pages (holds -links to summary tables) */ -#api-info-block { - font-size:.8em; - padding:6px 10px; - font-weight:normal; - float:right; - text-align:right; - color:#999; - max-width:70%; -} - -#api-level-toggle { - padding:0 10px; - font-size:11px; - float:right; -} - -#api-level-toggle label.disabled { - color:#999; -} - -div.api-level { - font-size:.8em; - font-weight:normal; - color:#999; - float:right; - padding:0 7px 0; - margin-top:-25px; -} - -#api-info-block div.api-level { - font-size:1.3em; - font-weight:bold; - float:none; - color:#444; - padding:0; - margin:0; -} - -/* Force link colors for IE6 */ -div.api-level a { - color:#999; -} -#api-info-block div.api-level a:link { - color:#444; -} -#api-level-toggle a { - color:#999; -} - -div#deprecatedSticker { - display:none; - z-index:99; - position:fixed; - right:15px; - top:114px; - margin:0; - padding:1em; - background:#FFF; - border:1px solid #dddd00; - box-shadow:-5px 5px 10px #ccc; - -moz-box-shadow:-5px 5px 10px #ccc; - -webkit-box-shadow:-5px 5px 10px #ccc; -} - -div#naMessage { - display:none; - width:555px; - height:0; - margin:0 auto; -} - -div#naMessage div { - z-index:99; - width:450px; - position:fixed; - margin:50px 0; - padding:4em 4em 3em; - background:#FFF; - border:1px solid #dddd00; - box-shadow:-10px 10px 40px #888; - -moz-box-shadow:-10px 10px 40px #888; - -webkit-box-shadow:-10px 10px 40px #888; -} -/* IE6 can't position fixed */ -* html div#naMessage div { position:absolute; } - -div#naMessage strong { - font-size:1.1em; -} - -.absent, -.absent a:link, -.absent a:visited, -.absent a:hover, -.absent * { - color:#bbb !important; - cursor:default !important; - text-decoration:none !important; -} - -#api-level-toggle a, -.api-level a { - color:inherit; - text-decoration:none; -} - -#api-level-toggle a:hover, -.api-level a:hover { - color:inherit; - text-decoration:underline !important; - cursor:pointer !important; -} - -#side-nav li.absent.selected, -#side-nav li.absent.selected *, -#side-nav div.label.absent.selected, -#side-nav div.label.absent.selected * { - background-color:#eaeaea !important; -} -/* IE6 quirk (won't chain classes, so just keep background blue) */ -* html #side-nav li.selected, -* html #side-nav li.selected *, -* html #side-nav div.label.selected, -* html #side-nav div.label.selected * { - background-color: #435a6e !important; -} - - -.absent h4.jd-details-title, -.absent h4.jd-details-title * { - background-color:#f6f6f6 !important; -} - -.absent img { - opacity: .3; - filter: alpha(opacity=30); - -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=30)"; -} - - -/* applies to a div containing links to summary tables */ -.sum-details-links { - padding:0; - font-weight:normal; -} - -.sum-details-links a { - text-decoration:none; -} - -.sum-details-links a:hover { - text-decoration:underline; -} - - -/* inheritance table */ -.jd-inheritance-table { - border-spacing:0; - margin:0; - padding:0; - font-size:.9em; -} -.jd-inheritance-table td { - border: none; - margin: 0; - padding: 0; -} -.jd-inheritance-table .jd-inheritance-space { - font-weight:bold; - width:1em; -} -.jd-inheritance-table .jd-inheritance-interface-cell { - padding-left: 17px; -} - -#jd-content { - padding: 18px 15px; -} - -hr { - background-color:#ccc; - border-color:#fff; - margin:2em 0 1em; -} - -/* DOC CLASSES */ - -#jd-content h1 { -/*sdk page*/ - font-size:1.6em; - color:#336666; - margin:0 0 .5em; -} - -#jd-content h2 { - font-size:1.45em; - color:#111; - border-top:2px solid #ccc; - padding: .5em 0 0; - margin: 2em 0 1em 0; -} - -#jd-content h3 { - font-size:1.3em; - color:#3a3a3a; - padding: 0; - margin: 1.5em 0 .65em 0; -} - -#jd-content h4 { - font-size:1.1em; - color:#3a3a3a; - padding: 0; - margin: 1.25em 0 .65em 0; -} - -#jd-content h5 { - font-size:1.0em; - color:#3a3a3a; - padding: 0; - margin: 1em 0 .65em 0; -} - -#jd-content .small-header { - font-size:1em; - color:#000; - font-weight:bold; - border:none; - padding:0; - margin:1em 0 .5em; - position:inherit; -} - -#jd-content table { - margin: 0 0 1em 1em; -} - -#jd-content img { - margin: 0 0 1em 1em; -} - -#jd-content li img, -#jd-content dd img { - margin:.5em 0 .5em 1em; -} - -.nolist { - list-style:none; - padding:0; - margin:0 0 1em 1em; -} - -.nolist li { - padding:0 0 2px; - margin:0; -} - -h4 .normal { - font-size:.9em; - font-weight:normal; -} - -.caps { - font-variant:small-caps; - font-size:1.2em; -} - -dl.tag-list dl.atn-list { - padding:0 0 0 2em; -} - -.jd-details { -/* border:1px solid #669999; - padding:4px; */ - margin:0 0 1em; -} - -/* API reference: a container for the -.tagdata blocks that make up the detailed -description */ -.jd-details-descr { - padding:0; - margin:.5em .25em; -} - -/* API reference: a block containing -a detailed description, a params table, -seealso list, etc */ -.jd-tagdata { - margin:.5em 1em; -} - -.jd-tagdata p { - margin:0 0 1em 1em; -} - -/* API reference: adjustments to -the detailed description block */ -.jd-tagdescr { - margin:.25em 0 .75em 0; - line-height:1em; -} - -.jd-tagdescr p { - margin:.5em 0; - padding:0; - -} - -.jd-tagdescr ol, -.jd-tagdescr ul { - margin:0 2.5em; - padding:0; -} - -.jd-tagdescr table, -.jd-tagdescr img { - margin:.25em 1em; -} - -.jd-tagdescr li { -margin:0 0 .25em 0; -padding:0; -} - -/* API reference: heading marking -the details section for constants, -attrs, methods, etc. */ -h4.jd-details-title { - font-size:1.15em; - background-color: #E2E2E2; - margin:1.5em 0 .6em; - padding:3px 95px 3px 3px; /* room for api-level */ -} - -h4.jd-tagtitle { - margin:0; -} - -/* API reference: heading for "Parameters", "See Also", etc., -in details sections */ -h5.jd-tagtitle { - margin:0 0 .25em 0; - font-size:1em; -} - -.jd-tagtable { - margin:0; -} - -.jd-tagtable td, -.jd-tagtable th { - border:none; - background-color:#fff; - vertical-align:top; - font-weight:normal; - padding:2px 10px; -} - -.jd-tagtable th { - font-style:italic; -} - -#jd-content table h2 { - background-color: #d6d6d6; - font-size: 1.1em; - margin:0 0 10px; - padding:5px; - left:0; - width:auto; -} - -div.design-announce { - border-top:1px solid #33B5E5; - border-bottom:1px solid #33B5E5; - padding:5px 10px 10px 55px; - margin:2em 0; - background:url('images/icon_design.png') 5px 13px no-repeat; -} - -div.design-announce p { - margin: .5em 0 0 0; -} - -div.special { - padding: .5em 1em 1em 1em; - margin: 0 0 1em; - background-color: #DAF3FC; - border:1px solid #d3ecf5; - border-radius:5px; - -moz-border-radius:5px; - -webkit-border-radius:5px; -} - -div.special p { - margin: .5em 0 0 0; -} - -div.special ol { - margin: 0; -} - -div.special ol li { - margin: 0; - padding: 0; -} - -#jd-content div.special h2, -#jd-content div.special h3 { - color:#669999; - font-size:1.2em; - border:none; - margin:0 0 .5em; - padding:0; -} - -#jd-content div.special.reference h2, -#jd-content div.special.reference h3, -#jd-content div.special.reference h4 { - color:#000; - font-size:1em; - border:none; - font-weight:bold; - margin:.5em 0; - padding:0; -} - -p.note, div.note, -p.caution, div.caution, -p.warning, div.warning { - margin: 1em; - padding: 0 0 0 .5em; - border-left: 4px solid; -} - -p.special-note, -div.special-note { - background-color:#EBF3DB; - padding:10px 20px; - margin:0 0 1em; -} - -p.note, -div.note { - border-color: #99aacc; -} - -p.warning, -div.warning { - border-color: #aa0033; -} - -p.caution, -div.caution { - border-color: #ffcf00; -} - -li .note, -li .caution, -li .warning { - margin: .5em 0 0 0; - padding: .2em .5em .2em .9em; -} - -/* Makes sure the first paragraph does not add top-whitespace within the box*/ -li .note>p:first-child, -li .caution>p:first-child, -li .warning>p:first-child { - margin-top:0; - padding-top:0; -} - -dl.xml dt { - font-variant:small-caps; - font-size:1.2em; -} - -dl.xml dl { - padding:0; -} - -dl.xml dl dt { - font-variant:normal; - font-size:1em; -} - -.listhead li { - font-weight: bold; -} - -.listhead li *, /*ie*/.listhead li li { - font-weight: normal; -} - -ol.no-style, -ul.no-style { - list-style:none; - padding-left:1em; -} - -.new, -.new-child { - font-size: .78em; - font-weight: bold; - color: #ff3d3d; - text-decoration: none; - vertical-align:top; - line-height:.9em; - white-space:nowrap; -} - -.toggle-list.open .new-child { - display:none; -} - -pre.classic { - background-color:transparent; - border:none; - padding:0; -} - -p.img-caption { - margin: -0.5em 0 1em 1em; /* matches default img left-margin */ -} - -div.figure { - float:right; - clear:right; - margin:1em 0 0 0; - padding:0 0 0 3em; - background-color:#fff; - /* width must be defined w/ an inline style matching the image width */ -} - -#jd-content -div.figure img { - margin: 0 0 1em; -} - -div.figure p.img-caption { - margin: -0.5em 0 1em 0; -} - -p.table-caption { - margin: 0 0 0.5em 1em; /* matches default table left-margin */ -} - - -/* toggle for misc content (such as long sample code) - see toggleContent() script in android-developer-docs.js */ -.toggle-content.closed .toggle-content-toggleme { - display:none; -} - -.toggle-content a[href="#"] { - text-decoration:none; - color:inherit; -} - -.toggle-content-toggleme { - padding-bottom:1px; /* fixes animation bounce due to margins */ -} - -#jd-content .toggle-content img.toggle-content-img { - margin:0; -} - - -/* BEGIN quickview sidebar element styles */ - -#qv-wrapper { - float: right; - width:310px; /* +35px padding */ - background-color:#fff; - margin:-48px 0 2px 0; - padding:0 0 20px 35px; -} - -#qv { - background-color:#fff; - border:4px solid #dee8f1; - margin:0; - padding:0 5px 5px; - width:292px; /* +10px padding; +8px border */ - font-size:.9em; -} - -#qv ol { - list-style:none; - padding: 0; -} - -#qv ol ol{ - list-style:none; - padding: 0 0 0 12px; - margin:0; -} - -#qv ul { - padding: 0 10px 0 2em; -} - -#qv li { - padding: 0 10px 3px; - line-height: 1.2em; -} - -#qv li li { - padding: 3px 10px 0; -} - -#qv ul li { - padding: 0 10px 0 0; -} - -#qv li.selected a { - color:#555; - text-decoration:none; -} - -#qv a, -#qv a code { - color:#cc6600; -} - -#qv p { - margin:8px 0 0; - padding:0 10px; -} - -#jd-content #qv h2 { - font-size:1.05em; - font-weight:bold; - margin:12px 0 .25em 0; - padding:0 10px; - background-color:transparent; - color:#7BB026; - border:none; - left:0; - z-index:1; -} - -#qv-extra #rule { - padding: 0 10px; - margin: 0; -} - -#qv-sub-rule { - padding: 5px 15px 10px; - margin: 0; -} - -#jd-content -#qv-sub-rule h2 { - margin: 0 0 .5em 0; -} - -/* END quickview sidebar element styles */ - -/* Begin sidebox sidebar element styles */ - -.sidebox-wrapper { - float:right; - clear:right; - width:310px; /* +35px padding */ - background-color:#fff; - margin:0; - padding:0 0 20px 35px; -} - -.sidebox { - border-left:1px solid #dee8f1; - background-color:#ffffee; - margin:0; - padding:8px 12px; - font-size:0.9em; - width:285px; /* +24px padding; +1px border */ -} - -.sidebox p { - margin-bottom: .75em; -} - -.sidebox ul { - padding: 0 0 0 1.5em; -} - -.sidebox li ul { - margin-top:0; - margin-bottom:.1em; -} - -.sidebox li { -padding:0 0 0 0em; -} - -#jd-content .sidebox h2, -#jd-content .sidebox h3, -#jd-content .sidebox h4, -#jd-content .sidebox h5 { - border:none; - font-size:1em; - margin:0; - padding:0 0 8px; - left:0; - z-index:0; -} - -.sidebox hr { - background-color:#ccc; - border:none; -} - -/* End sidebox sidebar element styles */ - -/* BEGIN developer training bar styles */ - -div#tb-wrapper { - float: right; - clear:right; - width:380px; /* +25px padding = 405 */ - background-color:#fff; - margin:0 0 2px 0; - padding:0 0 20px 25px; -} - -div#tb { - margin:0; - padding:0 15px; - width:350px; /* +15px padding = 380 */ - font-size:.9em; - background:#e9e9e9; - border:1px solid #aaa; - border-radius:5px; - -moz-border-radius:5px; - -webkit-border-radius:5px; - overflow:auto; -} - -div#tb h2 { - font-size:1.3em; - font-weight:bold; - margin:1em 0; - padding:0; - background-color:transparent; - border:none; - clear:both; -} - -div.download-box a.button { - color: #069; - font-size:1.1em; - font-weight:bold; - text-decoration:none; - height:27px; - line-height:27px; - text-align:center; - padding:5px 8px; - background-color: #fff; - border: 1px solid #aaa; - -webkit-border-radius: 2px; - -moz-border-radius: 2px; - border-radius: 2px; -} - -div.download-box a.button:hover { - border-color: #09C; - background-color: #4CADCB; - background-image: -webkit-gradient(linear,left top,left bottom,from(#5dbcd9),to(#4cadcb)); - background-image: -webkit-linear-gradient(top,#5dbcd9,#4cadcb); - background-image: -moz-linear-gradient(top,#5dbcd9,#4cadcb); - background-image: -ms-linear-gradient(top,#5dbcd9,#4cadcb); - background-image: -o-linear-gradient(top,#5dbcd9,#4cadcb); - background-image: linear-gradient(top,#5dbcd9,#4cadcb); - filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#5dbcd9',EndColorStr='#4cadcb'); - color: #fff; -} - -div.download-box a.button:active { - background-color: #1E799A; - background-image: none; - border-color: #30B7E6; -} - -div.download-box p.filename { - font-size:0.85em; - color:#888; - margin:4px 0 1em 10px; -} - -/* End developer training bar */ - -/* Training nav bar (previous/next) */ - -div.training-nav-top { - float: right; - width:380px; /* +25px padding = 405 */ - margin:-58px 0 0 0; - padding:0 0 20px 25px; -} - -div.training-nav-bottom { - padding:1px; /* for weird FF bug (scrollbar appears) */ - margin:3em 0; - overflow:auto; -} - -div.training-nav-button-next a, -div.training-nav-button-previous a { - display:block; - width:160px; - height:55px; - padding:4px 7px; - border:1px solid #aaa; - border-radius:5px; - -moz-border-radius:5px; - -webkit-border-radius:5px; - text-decoration:none; - font-weight:bold; -} - -div.training-nav-button-next a:hover, -div.training-nav-button-previous a:hover { - border:1px solid #069; /* match link color */ -} - -div.training-nav-button-next a:active, -div.training-nav-button-previous a:active { - border:1px solid #f00; /* match link color */ -} - -div.training-nav-button-previous { - float:left; - text-align:left; -} - -div.training-nav-button-next { - float:right; - text-align:right; -} - -span.training-nav-button-title { - display:block; - font-size:.85em; - font-weight:normal; - line-height:1.3em; - margin:.5em 0 0; -} - -/* End training nav bar */ - -/* BEGIN image and caption styles (originally for UI Guidelines docs) */ - -table.image-caption { - padding:0; - margin:.5em 0; - border:0; -} - -td.image-caption-i { - font-size:92%; - padding:0 5px; - margin:0; - border:0; -} - -td.image-caption-i img { - padding:0 1em; - margin:0; -} - -.image-list { - width:24px; - text-align:center; -} - -td.image-caption-c { - font-size:92%; - padding:1em 2px 2px 2px; - margin:0; - border:0; - width:350px; -} - -.grad-rule-top { -background-image:url(images/grad-rule-qv.png); -background-repeat:no-repeat; -padding-top:1em; -margin-top:0; -} - -.image-caption-nested { - margin-top:0; - padding:0 0 0 1em; -} - -.image-caption-nested td { - padding:0 4px 2px 0; - margin:0; - border:0; -} - -/* END image and caption styles */ - -/* table of contents */ - -ol.toc { - margin: 0 0 1em 0; - padding: 0; - list-style: none; - font-size:95%; -} - -ol.toc li { - font-weight: bold; - margin: 0 0 .5em 1em; - padding: 0; -} - -ol.toc li p { - font-weight: normal; -} - -ol.toc li ol { - margin: 0; - padding: 0; -} - -ol.toc li li { - padding: 0; - margin: 0 0 0 1em; - font-weight: normal; - list-style: none; -} - -table ol.toc { - margin-left: 0; -} - -.columns td { - padding:0 5px; - border:none; -} - -/* link table */ -.jd-linktable { - margin: 0 0 1em; - border-bottom: 1px solid #888; -} -.jd-linktable th, -.jd-linktable td { - padding: 3px 5px; - vertical-align: top; - text-align: left; - border:none; -} -.jd-linktable tr { - background-color: #fff; -} -.jd-linktable td { - border-top: 1px solid #888; - background-color: inherit; -} -.jd-linktable td p { - padding: 0 0 5px; -} -.jd-linktable .jd-linkcol { -} -.jd-linktable .jd-descrcol { -} -.jd-linktable .jd-typecol { - text-align:right; -} -.jd-linktable .jd-valcol { -} -.jd-linktable .jd-commentrow { - border-top:none; - padding-left:25px; -} -.jd-deprecated-warning { - margin-top: 0; - margin-bottom: 10px; -} - -tr.alt-color { - background-color: #f6f6f6; -} - -/* expando trigger */ -#jd-content .jd-expando-trigger-img { - margin:0; -} - -/* jd-expando */ -.jd-inheritedlinks { - padding:0 0 0 13px -} - -/* SDK PAGE */ -table.download tr { - background-color:#d9d9d9; -} - -table.download tr.alt-color { - background-color:#ededed; -} - -table.download td, -table.download th { - border:2px solid #fff; - padding:10px 5px; -} - -table.download th { - background-color:#6d8293; - color:#fff; -} - -/* INLAY 180 COPY and 240PX EXTENSION */ -/* modified to 43px so that all browsers eliminate the package panel h-scroll */ -.g-tpl-240 .g-unit, -.g-unit .g-tpl-240 .g-unit, -.g-unit .g-unit .g-tpl-240 .g-unit { - display: block; - margin: 0 0 0 243px; - width: auto; - float: none; -} -.g-unit .g-unit .g-tpl-240 .g-first, -.g-unit .g-tpl-240 .g-first, -.g-tpl-240 .g-first { - display: block; - margin: 0; - width: 243px; - float: left; -} -/* 240px alt */ -.g-tpl-240-alt .g-unit, -.g-unit .g-tpl-240-alt .g-unit, -.g-unit .g-unit .g-tpl-240-alt .g-unit { - display: block; - margin: 0 243px 0 0; - width: auto; - float: none; -} -.g-unit .g-unit .g-tpl-240-alt .g-first, -.g-unit .g-tpl-240-alt .g-first, -.g-tpl-240-alt .g-first { - display: block; - margin: 0; - width: 243px; - float: right; -} - -/* 200px */ -.g-tpl-200 .g-unit, -.g-unit .g-tpl-200 .g-unit, -.g-unit .g-unit .g-tpl-200 .g-unit { - display: block; - margin: 0 0 0 200px; - width: auto; - float: none; -} -.g-unit .g-unit .g-tpl-200 .g-first, -.g-unit .g-tpl-200 .g-first, -.g-tpl-200 .g-first { - display: block; - margin: 0; - width: 200px; - float: left; -} -/* 200px alt */ -.g-tpl-200-alt .g-unit, -.g-unit .g-tpl-200-alt .g-unit, -.g-unit .g-unit .g-tpl-200-alt .g-unit { - display: block; - margin: 0 200px 0 0; - width: auto; - float: none; -} -.g-unit .g-unit .g-tpl-200-alt .g-first, -.g-unit .g-tpl-200-alt .g-first, -.g-tpl-200-alt .g-first { - display: block; - margin: 0; - width: 200px; - float: right; -} - -/* 190px */ -.g-tpl-190 .g-unit, -.g-unit .g-tpl-190 .g-unit, -.g-unit .g-unit .g-tpl-190 .g-unit { - display: block; - margin: 0 0 0 190px; - width: auto; - float: none; -} -.g-unit .g-unit .g-tpl-190 .g-first, -.g-unit .g-tpl-190 .g-first, -.g-tpl-190 .g-first { - display: block; - margin: 0; - width: 190px; - float: left; -} -/* 190px alt */ -.g-tpl-190-alt .g-unit, -.g-unit .g-tpl-190-alt .g-unit, -.g-unit .g-unit .g-tpl-190-alt .g-unit { - display: block; - margin: 0 190px 0 0; - width: auto; - float: none; -} -.g-unit .g-unit .g-tpl-190-alt .g-first, -.g-unit .g-tpl-190-alt .g-first, -.g-tpl-190-alt .g-first { - display: block; - margin: 0; - width: 190px; - float: right; -} - -/* 180px */ -.g-tpl-180 .g-unit, -.g-unit .g-tpl-180 .g-unit, -.g-unit .g-unit .g-tpl-180 .g-unit { - display: block; - margin: 0 0 0 180px; - width: auto; - float: none; -} -.g-unit .g-unit .g-tpl-180 .g-first, -.g-unit .g-tpl-180 .g-first, -.g-tpl-180 .g-first { - display: block; - margin: 0; - width: 180px; - float: left; -} -/* 180px alt */ -.g-tpl-180-alt .g-unit, -.g-unit .g-tpl-180-alt .g-unit, -.g-unit .g-unit .g-tpl-180-alt .g-unit { - display: block; - margin: 0 180px 0 0; - width: auto; - float: none; -} -.g-unit .g-unit .g-tpl-180-alt .g-first, -.g-unit .g-tpl-180-alt .g-first, -.g-tpl-180-alt .g-first { - display: block; - margin: 0; - width: 180px; - float: right; -} - - -/* JQUERY RESIZABLE STYLES */ -.ui-resizable { position: relative; } -.ui-resizable-handle { position: absolute; display: none; font-size: 0.1px; z-index:1; } -.ui-resizable .ui-resizable-handle { display: block; } -body .ui-resizable-disabled .ui-resizable-handle { display: none; } -body .ui-resizable-autohide .ui-resizable-handle { display: none; } -.ui-resizable-s { cursor: s-resize; height: 6px; width: 100%; bottom: 0px; left: 0px; - background: transparent url("images/resizable-s2.gif") repeat scroll center top; } -.ui-resizable-e { cursor: e-resize; width: 6px; right: 0px; top: 0px; height: 100%; - background: transparent url("images/resizable-e2.gif") repeat scroll right center; } - -@media print { - - body { - overflow:visible; - } - - #header { - height:60px; - } - - #headerLeft { - padding:0; - } - - #header-tabs, - #headerRight, - #side-nav, - #api-info-block { - display:none; - } - - #body-content { - position:inherit; - } - - #doc-content { - margin-left:0 !important; - height:auto !important; - width:auto !important; - overflow:inherit; - display:inline; - } - - #jd-header { - padding:10px 0; - } - - #jd-content { - padding:15px 0 0; - } - - #footer { - float:none; - margin:2em 0 0; - } - - h4.jd-details-title { - border-bottom:1px solid #666; - } - - pre { - /* these allow lines to break (if there's a white space) */ - overflow: visible; - text-wrap: unrestricted; - white-space: -moz-pre-wrap; /* Moz */ - white-space: -pre-wrap; /* Opera 4-6 */ - white-space: -o-pre-wrap; /* Opera 7 */ - white-space: pre-wrap; /* CSS3 */ - word-wrap: break-word; /* IE 5.5+ */ - } - - h1, h2, h3, h4, h5, h6 { - page-break-after: avoid; - } - - table, img { - page-break-inside: avoid; - } -} diff --git a/tools/droiddoc/templates-ds/assets/css/default.css b/tools/droiddoc/templates-ds/assets/css/default.css deleted file mode 100644 index 5bd95a8dc..000000000 --- a/tools/droiddoc/templates-ds/assets/css/default.css +++ /dev/null @@ -1,4459 +0,0 @@ -/* color definitions */ -/* 16 column layout */ -/* clearfix idiom */ -/* common mixins */ -/* page layout + top-level styles */ -::-webkit-selection, -::-moz-selection, -::selection { - background-color: #0099cc; - color: #fff; } - -html, body { - height: 100%; - margin: 0; - padding: 0; - background-color:#F9F9F9; - -webkit-font-smoothing: antialiased; - /* prevent subpixel antialiasing, which thickens the text */ - /* text-rendering: optimizeLegibility; */ - /* turned off ligatures due to bug 5945455 */ } - -body { - color: #222; - font: 14px/19px Roboto, sans-serif; - font-weight: 400; - letter-spacing:.1; - padding:0 10px; } - -#page-container { - width: 940px; - margin: 0 40px; } - -#page-header { - height: 80px; - margin-bottom: 20px; - font-size: 48px; - line-height: 48px; - font-weight: 100; - padding-left: 10px; } - #page-header a { - display: block; - position: relative; - top: 20px; - text-decoration: none; - color: #555555 !important; } - -#main-row { - display: inline-block; } - #main-row:after { - content: "."; - display: block; - height: 0; - clear: both; - visibility: hidden; } - * html #main-row { - height: 1px; } - -#page-footer { - margin-left: 190px; - margin-top: 80px; - color: #999999; - padding-bottom: 40px; - font-size: 12px; - line-height: 15px; } - #page-footer a { - color: #777777; } - #page-footer #copyright { - margin-bottom: 10px; } - -#nav-container { - width: 160px; - min-height: 10px; - margin-right: 20px; - float: left; } - -#nav { - margin:0; - padding:0 0 30px; -} - -#side-nav { - min-height:5px; /* silly way to avoid doc floating left when nav goes fixed */ - margin-bottom:1px; -} -#devdoc-nav { - outline:none; - width:auto; - margin: 20px 0 0; } - -#devdoc-nav h2 { - border:0; -} - -#devdoc-nav.fixed { - position: fixed; - margin:0; - top: 20px; } - -#devdoc-nav span.small { - font-size:12px; - font-weight:normal; -} - -#content { - width: 760px; - float: left; } - -a:hover, -acronym:hover { - color: #7aa1b0 !important; } - -a:focus, -a:active { - color: #33b5e5 !important; } - -a.external-link { - background:url('../images/styles/open_new_page.png') no-repeat 100% 50%; - padding-right:16px; -} - -img { - border: none; } -#jd-content img { - margin-bottom:15px; -} - -ul { - margin: 0; - padding: 0; } - -strong { - font-weight: 500; } - -em { - font-style: italic; } - -acronym, -.tooltip-link { - border-bottom: 1px dotted #555555; - cursor: help; } - -acronym:hover, -.tooltip-link:hover { - color: #7aa1b0; - border-bottom-color: #7aa1b0; } - -img.with-shadow, -video.with-shadow { - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.25); } - -/* disclosures mixin */ -/* content layout */ -.layout-content-row { - display: inline-block; - margin-bottom: 10px; } - .layout-content-row:after { - content: "."; - display: block; - height: 0; - clear: both; - visibility: hidden; } - * html .layout-content-row { - height: 1px; } - -.layout-content-col { - float: left; - margin-left: 20px; } - .layout-content-col:first-child { - margin-left: 0; } - .layout-content-col h3, - .layout-content-col h4 { - margin-top:0; } - -.layout-content-col.span-1 { - width: 40px; } - -.layout-content-col.span-2 { - width: 100px; } - -.layout-content-col.span-3 { - width: 160px; } - -.layout-content-col.span-4 { - width: 220px; } - -.layout-content-col.span-5 { - width: 280px; } - -.layout-content-col.span-6 { - width: 340px; } - -.layout-content-col.span-7 { - width: 400px; } - -.layout-content-col.span-8 { - width: 460px; } - -.layout-content-col.span-9 { - width: 520px; } - -.layout-content-col.span-10 { - width: 580px; } - -.layout-content-col.span-11 { - width: 640px; } - -.layout-content-col.span-12 { - width: 700px; } - -.layout-content-col.span-13 { - width: 760px; } - -.vspace.size-1 { - height: 10px; } - -.vspace.size-2 { - height: 20px; } - -.vspace.size-3 { - height: 30px; } - -.vspace.size-4 { - height: 40px; } - -.vspace.size-5 { - height: 50px; } - -.vspace.size-6 { - height: 60px; } - -.vspace.size-7 { - height: 70px; } - -.vspace.size-8 { - height: 80px; } - -.vspace.size-9 { - height: 90px; } - -.vspace.size-10 { - height: 100px; } - -.vspace.size-11 { - height: 110px; } - -.vspace.size-12 { - height: 120px; } - -.vspace.size-13 { - height: 130px; } - -.vspace.size-14 { - height: 140px; } - -.vspace.size-15 { - height: 150px; } - -.vspace.size-16 { - height: 160px; } - -/* nav */ -#nav { - /* section header divs */ - /* expanded section header divs */ - /* sublinks */ } - #nav li { - list-style-type: none; - font-size: 14px; - margin:0; - padding:0; - line-height: 15px; } - #nav a { - color: #555555; - text-decoration: none; - word-wrap:break-word; } - #nav .nav-section-header { - position: relative; - margin-bottom: 1px; - padding: 0 30px 0 0; } - #nav li.selected a, #nav li.selected > .nav-section-header > a { - color: #09C; - } - #nav li.selected ul li a { - /* don't highlight child items */ - color: #555555; } - #nav .nav-section .nav-section .nav-section-header { - /* no white line between second level sections */ - margin-bottom: 0; } - /* section header links */ - #nav > li > div > a { - display: block; - color: #333333; - font-weight: 500; - padding: 10px 0 10px 10px; } - #nav .nav-section-header:after { - content: ''; - background: transparent url(../images/styles/disclosure_down.png) no-repeat scroll 50% 50%; - width: 34px; - height: 34px; - display: block; - position: absolute; - top: 0; - right: 0; } - #nav .nav-section-header.empty:after { - display: none; } - /* nested nav headers */ - #nav .nav-section .nav-section { - position: relative; - padding: 0; - margin: 0; } - #nav .nav-section li a { - /* first gen child (2nd level li) */ - display:block; - font-weight: normal; - text-transform: none; - padding: 7px 5px 7px 10px; - } - #nav .nav-section li li a { - /* second gen child (3rd level li) */ - padding: 5px 5px 5px 10px; - } - #nav li.expanded .nav-section-header { - background:#e9e9e9; - background: rgba(0, 0, 0, 0.05); } - #nav li.expanded li .nav-section-header { - background: transparent; } - #nav li.expanded li ul { - /* 3rd level ul */ - padding:0 0 0 10px; - } - #nav li.expanded > .nav-section-header:after { - content: ''; - background: transparent url(../images/styles/disclosure_up.png) no-repeat scroll 50% 50%; - width: 34px; - height: 34px; } - #nav li.expanded li ul.tree-list-children { - padding:0; - } - #nav li.expanded li ul.tree-list-children .tree-list-children { - padding:0 0 0 10px; - } - #nav li span.tree-list-subtitle { - display:inline-block; - padding:5px 0 0 10px; - color:#555; - text-transform:uppercase; - font-size:12px; - } - #nav li span.tree-list-subtitle:before { - content: '—'; - } - #nav li span.tree-list-subtitle:after { - content: '—'; - } - #nav li ul { - display:none; - overflow: hidden; - margin: 0; } - #nav li ul.animate-height-in { - -webkit-transition: height 0.25s ease-in; - -moz-transition: height 0.25s ease-in; - transition: height 0.25s ease-in; } - #nav li ul.animate-height-out { - -webkit-transition: height 0.25s ease-out; - -moz-transition: height 0.25s ease-out; - transition: height 0.25s ease-out; } - #nav li ul li { - padding: 0; } - #nav li li li { - padding: 0; } - #nav li.expanded ul { - } - #nav li ul > li { - padding:0; - } - #nav li ul > li:last-child { - padding-bottom:5px; - } - #nav li ul.tree-list-children > li:last-child { - padding-bottom:0; - } - #nav li.expanded ul > li { - background:#efefef; - background: rgba(0, 0, 0, 0.03); } - #nav li.expanded ul > li li { - background:inherit; } - #nav li ul.tree-list-children ul { - display:block; } - -.new, -.new-child { - font-size: .78em; - font-weight: bold; - color: #ff3d3d; - vertical-align:top; - white-space:nowrap; -} - -/* content header */ -.content-header { - height: 30px; - margin:20px 0 25px; - padding:0 0 10px;} -.content-header.just-links { - margin-bottom:0; - padding-bottom:0;} - -.content-header h1 { - color:#000; - margin:0; - border-bottom:0; - padding:0; -} - -.content-footer { - border-top: 1px solid #ccc; - margin-top: 10px; - padding-top:10px; - height: 30px; } - -.content-footer .col-9 { - margin-left:0; -} -.content-footer .col-4 { - margin-right:0; -} -.content-footer.wrap { - width:940px; -} - -.paging-links { - position: relative; } - .paging-links a { - position: absolute; } - .paging-links a, - .training-nav-top a { - font-size: 14px; - line-height: 30px; - color: #555555; - text-decoration: none; - text-transform: uppercase; } - .paging-links .prev-page-link:before, - .training-nav-top .prev-page-link:before { - content: ''; - background: transparent url(../images/styles/disclosure_left.png) no-repeat scroll 50% 50%; - width: 10px; - height: 10px; - display: inline-block; - margin-right: 5px; } - .training-nav-top .next-page-link, - .training-nav-top .start-class-link, - .training-nav-top .start-course-link { - right: 10px; } - .paging-links .prev-page-link { - left: -15px; } - .paging-links .next-page-link { - right: 0px; } - .next-page-link:after, - .start-class-link:after, - .start-course-link:after, - .next-class-link:after { - content: ''; - background: transparent url(../images/styles/disclosure_right.png) no-repeat scroll 50% 50%; - width: 10px; - height: 10px; - display: inline-block; - margin-left: 5px; } - - - .training-nav-top a { - display:block; - float:left; - width:122px; - height:28px; - padding: 8px; - line-height:28px; - text-align:center; - border:1px solid #DADADA; - border-bottom:0; - } - - .training-nav-top a.next-page-link { - border-left:0; - width:123px; - } - - .paging-links a.disabled, - .training-nav-top a.disabled, - .content-footer a.disabled { - color:#bbb; - } - - .paging-links a.disabled:hover, - .training-nav-top a.disabled:hover, - .content-footer a.disabled:hover { - cursor:default; - color:#bbb !important; - } - - .training-nav-top a.start-class-link, - .training-nav-top a.start-course-link { - width:262px; - } - - /* list of classes on course landing page */ - ol.class-list { - list-style:none; - margin-left:0; - } - ol.class-list>li { - margin:0 0 15px; - padding:5px 0 0; - overflow:hidden; - border-top:1px solid #ccc; - } - ol.class-list li a.title { - font-size:16px; - margin:0; - clear:left; - display:block; - height:32px; - padding:0 4px; - } - ol.class-list li a.title h2 { - color:inherit; - margin:0 0 10px; - display:block; - float:left; - width:675px; - } - ol.class-list li a.title span { - display:none; - float:left; - font-size:18px; - font-weight:bold; - background: transparent url(../images/styles/disclosure_right.png) no-repeat scroll 50% 50%; - width: 10px; - height: 32px; - } - ol.class-list li a.title:hover { - background:#ddd; - color:#258AAF !important; - } - ol.class-list li a.title:hover span { - display:block; - } - - #jd-content - ol.class-list li img { - float:left; - clear:left; - width:64px; - margin:0 20px 0 0; - } - ol.class-list li p.description { - float:left; - display:block; - width:250px; - margin:0; - } - ol.class-list li p.description.article { - width: 550px; - } - ol.class-list ol { - float:left; - width:320px; - margin:0 0 0 30px; - list-style:none; - margin:0 0 0 20px; - } - ol.class-list div.lessons li { - margin:0 0 6px; - line-height:16px; - } - - - .hide { - display:none !important; - } - - .content-footer.next-class { - display:block; - border:0; - margin-top:0; - padding-top:0; - } - - .content-footer.next-class a.next-class-link { - display:block; - float:right; - text-transform:uppercase; - } - - - - /* inner-doc tabs w/ title */ - -div#title-tabs-wrapper { - border-bottom:1px solid #ccc; - margin:20px 0 30px; -} -h1.with-title-tabs { - display:inline-block; - margin:0 0 -1px 0; - padding:0 60px 0 0; - border-bottom:1px solid #F9F9F9; -} -ul#title-tabs { - list-style:none; - padding:0; - height:29px; - margin:0; - font-size:16px; - line-height:26px; - display:inline-block; - vertical-align:bottom; -} -ul#title-tabs li { - display:block; - float:left; - margin-right:40px; - border-bottom: 3px solid transparent; -} -ul#title-tabs li.selected { - border-bottom: 3px solid #93C; -} -ul#title-tabs li a { - color:#333; -} -ul#title-tabs li a:hover, -ul#title-tabs li a:active { - color:#93C !important; -} - - - -/* content body */ -@-webkit-keyframes glowheader { - from { - background-color: #33b5e5; - color: #000; - border-bottom-color: #000; } - - to { - background-color: transparent; - color: #33b5e5; - border-bottom-color: #33b5e5; } } - -@-moz-keyframes glowheader { - from { - background-color: #33b5e5; - color: #000; - border-bottom-color: #000; } - - to { - background-color: transparent; - color: #33b5e5; - border-bottom-color: #33b5e5; } } - -@keyframes glowheader { - from { - background-color: #33b5e5; - color: #000; - border-bottom-color: #000; } - - to { - background-color: transparent; - color: #33b5e5; - border-bottom-color: #33b5e5; } } - -h2:target, -h3:target { - -webkit-animation-name: glowheader; - -moz-animation-name: glowheader; - animation-name: glowheader; - -webkit-animation-duration: 0.7s; - -moz-animation-duration: 0.7s; - animation-duration: 0.7s; - -webkit-animation-timing-function: ease-out; - -moz-animation-timing-function: ease-out; - animation-timing-function: ease-out; } - -.design ol h4 { - margin-bottom:0; -} -.design ol { - counter-reset: item; } - .design ol>li { - font-size: 14px; - line-height: 20px; - list-style-type: none; - position: relative; } - .design ol>li:before { - content: counter(item) ". "; - counter-increment: item; - position: absolute; - left: -20px; - top: 0; } - .design ol li.value-1:before { - content: "1. "; } - .design ol li.value-2:before { - content: "2. "; } - .design ol li.value-3:before { - content: "3. "; } - .design ol li.value-4:before { - content: "4. "; } - .design ol li.value-5:before { - content: "5. "; } - .design ol li.value-6:before { - content: "6. "; } - .design ol li.value-7:before { - content: "7. "; } - .design ol li.value-8:before { - content: "8. "; } - .design ol li.value-9:before { - content: "9. "; } - .design ol li.value-10:before { - content: "10. "; } -.design .with-callouts ol>li { - list-style-position: inside; - margin-left: 0; } - .design .with-callouts ol>li:before { - display: inline; - left: -20px; - float: left; - width: 17px; - color: #33b5e5; - font-weight: 500; } -.design .with-callouts ul>li { - list-style-position: outside; } - -/* special list items */ -li.no-bullet { - list-style-type: none !important; } -li.no-bullet *{ - margin:0; } - -.design li.with-icon { - position: relative; - margin-left: 20px; - min-height: 30px; } - .design li.with-icon p { - margin-left: 0 !important; } - .design li.with-icon:before { - position: absolute; - left: -40px; - top: 0; - content: ''; - width: 30px; - height: 30px; } - .design li.with-icon.tablet:before { - background-image: url(../images/styles/ico_phone_tablet.png); } - .design li.with-icon.web:before { - background-image: url(../images/styles/ico_web.png); } - .design li.with-icon.action:before { - background-image: url(../images/styles/ico_action.png); } - .design li.with-icon.use:before { - background-image: url(../images/styles/ico_use.png); } - -/* figures and callouts */ -.figure { - position: relative; } - .figure.pad-below { - margin-bottom: 20px; } - .figure .figure-callout { - position: absolute; - color: #fff; - font-weight: 500; - font-size: 16px; - line-height: 23px; - text-align: center; - background: transparent url(../images/styles/callout.png) no-repeat scroll 50% 50%; - padding-right: 2px; - width: 30px; - height: 29px; - z-index: 1000; } - .figure .figure-callout.top { - top: -9px; } - .figure .figure-callout.right { - right: -5px; } - -.figure-caption { - margin: 0 10px 20px 0; - font-size: 14px; - line-height: 20px; - font-style: italic; } - -/* rows of figures */ -.figure-row { - font-size: 0; - line-height: 0; - /* to prevent space between figures */ } - .figure-row .figure { - display: inline-block; - vertical-align: top; } - .figure-row .figure + .figure { - margin-left: 10px; - /* reintroduce space between figures */ } - -/* video containers */ -.framed-galaxynexus-land-span-13 { - background: transparent url(../images/styles/device_galaxynexus_blank_land_span13.png) no-repeat -scroll top left; - padding: 42px 122px 62px 126px; - overflow: hidden; } - .framed-galaxynexus-land-span-13, .framed-galaxynexus-land-span-13 video, -.framed-galaxynexus-land-span-13 img { - width: 512px; - height: 286px; } - - -.framed-galaxynexus-land-span-8{ - background: transparent url(../images/styles/device_galaxynexus_blank_land_span8.png) no-repeat -scroll top left; - padding: 26px 68px 38px 72px; - overflow: hidden; } - .framed-galaxynexus-land-span-8, .framed-galaxynexus-land-span-8 video, -.framed-galaxynexus-land-span-8 img { - width: 320px; - height: 180px; } - -.framed-galaxynexus-port-span-9 { - background: transparent url(../images/styles/device_galaxynexus_blank_port_span9.png) no-repeat -scroll top left; - padding: 95px 122px 107px 124px; - overflow: hidden; } - .framed-galaxynexus-port-span-9, .framed-galaxynexus-port-span-9 video, -.framed-galaxynexus-port-span-9 img { - width: 274px; - height: 488px; } - -.framed-galaxynexus-port-span-5 { - background: transparent url(../images/styles/device_galaxynexus_blank_port_span5.png) no-repeat -scroll top left; - padding: 75px 31px 76px 33px; - overflow: hidden; } - .framed-galaxynexus-port-span-5, .framed-galaxynexus-port-span-5 video, -.framed-galaxynexus-port-span-5 img { - width: 216px; - height: 384px; } - -/* landing page disclosures */ -.landing-page-link { - text-decoration: none; - font-weight: 500; - color: #333333; } - .landing-page-link:after { - content: ''; - background: transparent url(../images/styles/disclosure_right.png) no-repeat scroll 50% 50%; - width: 10px; - height: 10px; - display: inline-block; - margin-left: 5px; } - -/* tooltips */ -.tooltip-box { - position: absolute; - background-color: rgba(0, 0, 0, 0.9); - border-radius: 2px; - font-size: 14px; - line-height: 20px; - color: #fff; - padding: 6px 10px; - max-width: 250px; - z-index: 10000; } - .tooltip-box.below:after { - position: absolute; - content: ''; - line-height: 0; - display: block; - top: -10px; - left: 5px; - border: 5px solid transparent; - border-bottom-color: rgba(0, 0, 0, 0.9); } - -/* video note */ -.video-instructions { - margin-top: 10px; - margin-bottom: 10px; } - .video-instructions:before { - content: ''; - background: transparent url(../images/styles/ico_movie_inline.png) no-repeat scroll top left; - display: inline-block; - width: 12px; - height: 12px; - margin-right: 8px; } - .video-instructions:after { - content: 'Click device screen to replay movie.'; } - -/* download buttons */ -.download-button { - display: block; - margin-bottom: 5px; - text-decoration: none; - background-color: #33b5e5; - color: #fff !important; - font-weight: 500; - box-shadow: 0 1px 1px rgba(0, 0, 0, 0.12); - padding: 6px 12px; - border-radius: 2px; } - .download-button:hover, .download-button:focus { - background-color: #0099cc; - color: #fff !important; } - .download-button:active { - background-color: #006699; } - -/* UI tables and other things found in Writing style and Settings pattern */ -.ui-table { - width: 100%; - background-color: #282828; - color: #fff; - border-radius: 2px; - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.25); - border-collapse: separate; } - .ui-table th, - .ui-table td { - padding: 5px 10px; - background-color: inherit; - border:0;} - .ui-table thead th { - font-weight: bold; } - .ui-table tfoot td { - border-top: 1px solid #494949; - border-right: 1px solid #494949; - text-align: center; } - .ui-table tfoot td:last-child { - border-right: 0; } - -.layout-with-list-item-margins { - margin-left: 30px !important; } - -.emulate-content-left-padding { - margin-left: 10px; } - -.do-dont-label { - margin-bottom: 10px; - padding-left: 20px; - background: transparent none no-repeat scroll 0px 3px; } - .do-dont-label.bad { - background-image: url(../images/styles/ico_wrong.png); } - .do-dont-label.good { - background-image: url(../images/styles/ico_good.png); } - - - - - - - - - - - - - - - - - - - -/***** PREVIOUSLY style.css ******************/ - - - - - -@media screen, projection, print { -[dir='rtl'] { - direction: rtl; -} -html { - line-height: 20px; -} -pre, table, input, textarea, code { - font-size: 1em; -} -address, abbr, cite { - font-style: normal; -} -[dir='rtl'] th { - text-align: right; -} -html[lang^=ja] blockquote, html[lang^=ja] q, html[lang^=ko] blockquote, html[lang^=ko] q, -html[lang^=zh] blockquote, html[lang^=zh] q { - font-style: normal; -} -q { - font-style: italic; -} -fieldset, iframe, img { - border: 0; -} -img { - -ms-interpolation-mode: bicubic; - vertical-align: middle; - max-width: 100%; -} -q { - quotes: none; -} -sup, sub { - font-size: 11px; - line-height: 0; -} -} - -@media screen, projection { - -table, fieldset { - margin: 0; -} -h1 { - color:#333; - font-size: 22px; - margin: 20px 0 20px; - padding:0 0 10px; -} -h1, h2 { - line-height: 32px; -} -h1.short { - margin-right:320px; -} -h1.short { - margin-right:320px; -} -h1.super { - font-size: 37px; -} -h2 { - color:#333; - font-size: 20px; - margin: 20px 0 20px; - padding:0; -} -h3 { - color:#333; - font-size: 18px; -} -h3, h4 { - color:#333; - line-height: 20px; - margin: 10px 0; -} -h4 { - font-size: 16px; -} -h5 { - font-size: 14px; -} -h5, h6 { - margin: 5px 0; -} -h6 { - font-size: 12px; -} -hr { /* applied to the bottom of h2 elements */ - height: 1px; - margin: 5px 0 20px; - border: 0; - background: #ccc; -} -p, pre, table, form { - margin: 0 0 15px; -} -small { - font-size: 11.5px; - color: #000; -} -ul, ol { - margin: 0 0 15px 18px; - padding: 0; -} -[dir='rtl'] ul, [dir='rtl'] ol { - margin: 10px 30px 10px 10px; -} -ul ul, ul ol, ol ul, ol ol { - margin-bottom: 0; - margin-top: 0; -} -li { - margin:0 0 5px; -} -dd { - margin:0 0 10px 30px; -} -dd p { - margin:10px 0 0; -} -li p, -li pre, -li ul, -li ol { - margin-top:5px; - margin-bottom:5px; -} -pre strong, pre b, a strong, a b, a code { - color: inherit; -} -pre, code { - color: #060; - font: 14px/1.5 'courier new', courier, monospace; -} -code { - font-weight:bold; -} - -legend { - display: none; -} -a:link, a:visited { - color: #258aaf; - text-decoration: none; -} -a:focus, a:hover, a:active { - color: #33B5E5; - text-decoration: none; -} -strong, b { - font-weight:bold; - color: #222; -} -table { - border-collapse: collapse; - border-spacing: 0; - border:0; - margin: .5em 1em 1em 0; - width:100%; /* consistent table widths; within IE's quirks */ - background-color:#f7f7f7; -} -th, td { - padding: 4px 12px; - vertical-align: top; - text-align: left; -} -td { - background-color:inherit; - border:solid 1px #DDD; -} -td *:last-child { - margin-bottom:0; -} -th { - background-color: #999; - color: #fff; - border:solid 1px #DDD; - font-weight: normal; -} -tr:first-of-type th:first-of-type:empty { - visibility: hidden; -} -/* -------------------------------------------------------------------------- -Footer -*/ -.line { - clear: both; - background: #acbc00; - background: -moz-linear-gradient(top, #acbc00 0, #acbc00 50%, #bdde00 50%, #bdde00 100%); - background: -webkit-gradient(linear, left top, left bottom, color-stop(0, #acbc00), -color-stop(50%, #acbc00), color-stop(50%, #bdde00), color-stop(100%, #bdde00)); - background: -webkit-linear-gradient(top, #acbc00 0, #acbc00 50%, #bdde00 50%, #bdde00 100%); - background: -o-linear-gradient(top, #acbc00 0, #acbc00 50%, #bdde00 50%, #bdde00 100%); - background: -ms-linear-gradient(top, #acbc00 0, #acbc00 50%, #bdde00 50%, #bdde00 100%); - background: linear-gradient(top, #acbc00 0, #acbc00 50%, #bdde00 50%, #bdde00 100%); - height: 2px; - margin-top: 150px; - position: relative; - z-index: 11; -} -#footer { - font-size:11px; - clear: both; - color: #999; - padding: 15px 0; - margin-top:10px; - width:auto; -} -#footer-local ul { - list-style: none; - margin: 5px 0 30px 0; -} -#footer-local li { - display: inline; -} -#footer-local li+li:before { - content: '|'; - padding: 0 3px; - color: #e5e5e5; -} -#footer-global { - padding: 10px 15px; - background: #f5f5f5; -} -#footer-global { - border-top: 1px solid #ebebeb; - font-size: 11.5px; - line-height: 1.8; - list-style: none; -} -#footer-global ul { - margin: 0; -} -#footer-global li { - display: inline; - font-weight: bold; -} -#footer-global li+li:before { - content: '¬?'; - padding: 0 3px; -} -* html #footer-global li { - margin: 0 13px 0 0; -} -* [dir='rtl'] #footer-global li { - margin: 0 0 0 13px; -} -*+html #footer-global li { - margin: 0 13px 0 0; -} -*+[dir='rtl'] #footer-global li { - margin: 0 0 0 13px; -} -#footer-global li a { - font-weight: normal; -} -.locales { - margin: 10px 0 0 0px; -} -[dir='rtl'] .locales { - background-position: right center; - float: left; - padding: 0 24px 0 0; -} -.locales form { - margin: 0; -} -.locales select, .sites select { - line-height: 3.08; - margin: 0px 0; - border: solid 1px #EBEBEB; - -webkit-appearance: none; - background: white url('../images/arrows-up-down.png') right center no-repeat; - height: 30px; - color: #222; - line-height: normal; - padding: 5px; - width: 230px; -} -} - -/* ============================================================================= - Print Only - ========================================================================== */ -@media print { - /* configure printed page */ - @page { - margin: 0.75in 1in; - widows: 4; - orphans: 4; - } - - /* reset spacing metrics */ - html, body, .wrap { - margin: 0 !important; - padding: 0 !important; - width: auto !important; - } - - /* leave enough space on the left for bullets */ - body { - padding-left: 20px !important; - } - #doc-col { - margin-left: 0; - } - - /* hide a bunch of non-content elements */ - #header, #footer, #nav-x, #side-nav, - .training-nav-top, .training-nav-bottom, - #doc-col .content-footer, - .nav-x, .nav-y, - .paging-links, - a.totop { - display: none !important; - } - - /* remove extra space above page titles */ - #doc-col .content-header { - margin-top: 0; - } - - /* bump up spacing above subheadings */ - h2 { - margin-top: 40px !important; - } - - /* print link URLs where possible and give links default text color */ - p a:after { - content: " (" attr(href) ")"; - font-size: 80%; - } - p a { - word-wrap: break-word; - } - a { - color: inherit; - } - - /* syntax highlighting rules */ - .str { color: #060; } - .kwd { color: #006; font-weight: bold; } - .com { color: #600; font-style: italic; } - .typ { color: #404; font-weight: bold; } - .lit { color: #044; } - .pun { color: #440; } - .pln { color: #000; } - .tag { color: #006; font-weight: bold; } - .atn { color: #404; } - .atv { color: #060; } -} - -/* ============================================================================= - Columns - ========================================================================== */ - -@media screen, projection, print { -.full { - padding: 2.5em 0; - border-top: solid 1px #ddd; - border-bottom: solid 1px #ddd; - background: #f7f7f7; -} -.wrap { - margin: 0 auto; - width: 940px; - clear: both; -} -.cols { - height: 1%; - margin: 0 -1.533742331288343558282%; - width: 103.06748466257669%} -*+html .cols { - margin-bottom: 20px; -} -.cols:after { - clear: both; - content: ' '; - display: block; - height: 0; - visibility: hidden; -} -.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, -.col-13, .col-14, .col-15, .col-16 { - display: inline; - float: left; - margin-left: 10px; - margin-right: 10px; -} -/* -* html .col-1, * html .col-2, * html .col-3, * html .col-4, * html .col-5, * html .col-6, * html -.col-7, * html .col-8, * html .col-9, * html .col-10, * html .col-11, * html .col-12 { - margin: 0; - padding: 0 1.4% 20px; -} -[dir='rtl'] .col-1, [dir='rtl'] .col-2, [dir='rtl'] .col-3, [dir='rtl'] .col-4, [dir='rtl'] .col-5, -[dir='rtl'] .col-6, [dir='rtl'] .col-7, [dir='rtl'] .col-8, [dir='rtl'] .col-9, [dir='rtl'] .col-10, -[dir='rtl'] .col-11, [dir='rtl'] .col-12 { - float: right; -} -*/ -.col-1 { width: 40px } -.col-2 { width: 100px } -.col-3 { width: 160px } -.col-4 { width: 220px } -.col-5 { width: 280px } -.col-6 { width: 340px } -.col-7 { width: 400px } -.col-8 { width: 460px } -.col-9 { width: 520px } -.col-10 { width: 580px } -.col-11 { width: 640px } -.col-12 { width: 700px } -.col-13 { width: 760px } -.col-14 { width: 820px } -.col-15 { width: 880px } -.col-16 { width: 940px } -} - -.col-right { - margin-right:0px; -} - -@media screen and (max-width:772px) { -.col-5, .col-6, .col-7 { - clear: both; - width: 97.0238096%} -} - -/* ============================================================================= - Layout - ========================================================================== */ -@media screen, projection, print { - -/* -------------------------------------------------------------------------- -Header, Login, Nav-X, Search -*/ -#header { - padding: 2.2em 0 0.2em 0; -} -#header:before, #header:after { - content: ""; - display: table; - clear: both -} -.logo, .nav-x { - float: left; -} -.nav-x { - margin-top: -2px; - list-style-type: none; -} -.nav-x a { - color: #333; - font-size: 16px; -} -.design a.selected { - color: #33b5e5; -} -.develop a.selected { - color: #F80; -} -.distribute a.selected { - color: #9C0; -} - - - -.nav-x li { - display: inline; - margin-right: 45px; -} -.search { - float: right; - position: relative; - width: 220px -} -.search .bottom, .search .left, .search .right { - position: absolute; - background-color: #a3a3a3; -} -.search .bottom { - width: 220px; - height: 1px; - top: 24px; - left: 0 -} -.search .left, .search .right { - height: 5px; - width: 1px -} -.search .left { top: 19px; left: 0 } -.search .right { top: 19px; right: 0 } -.search form { - float: left; - margin-top: 2px; - width: inherit; -} -.search .close, -#player-frame .close { - position: absolute; - right: 8px; - bottom: 4px; - width: 16px; - height: 16px; - margin: 0; - text-indent: -1000em; - background: url(../images/close.png) no-repeat 0 0; - z-index:9999; -} -.search .close:hover, .search .close:focus, -#player-frame .close:hover, #player-frame .close:focus { - background-position: -16px 0; - cursor:pointer; -} -#player-frame .close { - top: 6px; -} -.search form input { - color: #999; - font-size: 1em; - width: inherit; - border: none; - margin: 0; - padding:0 0 0 6px; - z-index: 1500; - background-color: transparent -} -.search:hover .bottom, .search:hover .left, .search:hover .right { - background-color: #33b5e5; -} -.search:hover .icon { - background-position: -8px 0 -} -.search form input:focus { - color: #222; - font-weight: bold; - outline:0; -} -/* Search Dropdown */ -.search-dropdown { - padding: 15px; - width: 192px; - border: solid 1px #c5c5c5; - background: #fff; - position: absolute; - top: 35px; - left: 0; - -moz-box-shadow: 0 0 10px rgba(0,0,0,0.2); - -webkit-box-shadow: 0 0 10px rgba(0,0,0,0.2); - box-shadow: 0 0 10px rgba(0,0,0,0.2) -} -.search-dropdown ul, .search-dropdown ul li { - list-style-type: none; - margin: 0; - padding: 0 -} -.search-dropdown ul li { - clear: both -} -.search-dropdown img { - float: left; - margin: 0 10px 10px 0 -} -.search-dropdown h6 { - color: #222; - margin: 0; - line-height: normal -} -.search-dropdown .desc { - color: #999; - font-size: 11.5px; - line-height: normal; - margin: 0; -} -.search-dropdown li a:hover h6, .search-dropdown li a:hover .desc { - color: #33b5e5 -} -/* -------------------------------------------------------------------------- -Buttons -*/ -.button, a.button, .button-secondary, a.button-secondary { - border-image: initial; - -webkit-border-radius: 2px; - -moz-border-radius: 2px; - border-radius: 2px; - cursor: pointer; -} -.button, a.button { - display:inline-block; - background-color: #09c; - background-image: -webkit-gradient(linear, left top, left bottom, from(#2faddb), to(#09c)); - background-image: -webkit-linear-gradient(top, #2faddb, #09c); - background-image: -moz-linear-gradient(top, #2faddb, #09c); - background-image: -ms-linear-gradient(top, #2faddb, #09c); - background-image: -o-linear-gradient(top, #2faddb, #09c); - background-image: linear-gradient(top, #2faddb, #09c); - filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#2faddb', EndColorStr='#0099cc',GradientType=0); - border: 1px solid #3990ab; - color: #fff; -} -.button-secondary, a.button-secondary { - background-color: #f3f3f3; - border: 1px solid #dcdcdc; - color: #444; -} -a.button, a.button:visited, a.button-secondary, a.button-secondary:visited { - margin-right: 16px; - font-weight: 400; - min-width: 54px; - outline: 0; - padding: 8px 15px; - text-align: center; -} -.button, .button-secondary { - margin-right: 16px; - font-weight: 400; - min-width: 54px; - outline: 0; - padding: 0 15px; - text-align: center; -} -.button:hover, a.button:hover { - border-color: #09c; - background-color: #4cadcb; - background-image: -webkit-gradient(linear, left top, left bottom, from(#5dbcd9), to(#4cadcb)); - background-image: -webkit-linear-gradient(top, #5dbcd9, #4cadcb); - background-image: -moz-linear-gradient(top, #5dbcd9, #4cadcb); - background-image: -ms-linear-gradient(top, #5dbcd9, #4cadcb); - background-image: -o-linear-gradient(top, #5dbcd9, #4cadcb); - background-image: linear-gradient(top, #5dbcd9, #4cadcb); - filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#5dbcd9', -EndColorStr='#4cadcb',GradientType=0); - color: #fff !important; -} -.button:active, a.button:active { - background-color: #1e799a; - background-image: none; - border-color: #30b7e6; -} -a.button.big.subtitle { - line-height:18px; -} -.button-secondary:hover, a.button-secondary:hover { - border-color: #dbdbdb; - background-color: #f3f3f3; - background-image: -webkit-gradient(linear, left top, left bottom, from(#f9f9f9), to(#ececec)); - background-image: -webkit-linear-gradient(top, #f9f9f9, #ececec); - background-image: -moz-linear-gradient(top, #f9f9f9, #ececec); - background-image: -ms-linear-gradient(top, #f9f9f9, #ececec); - background-image: -o-linear-gradient(top, #f9f9f9, #ececec); - background-image: linear-gradient(top, #f9f9f9, #ececec); - filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#f9f9f9', -EndColorStr='#ececec'); - color: #33B5E5 !important; -} -.button-secondary:active, a.button-secondary:active { - border-color: #dadada; - background: #ebebeb; /* Old browsers */ - /* IE9 SVG, needs conditional override of 'filter' to 'none' */ - background: -url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/ -Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0Jv -eD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+ -CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIg -eDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ViZWJl -YiIgc3RvcC1vcGFjaXR5PSIxIi8+ -CiAgICA8c3RvcCBvZmZzZXQ9IjEwJSIgc3RvcC1jb2xvcj0iI2Y5ZjlmOSIgc3RvcC1vcGFjaXR5PSIxIi8+ -CiAgICA8c3RvcCBvZmZzZXQ9IjUwJSIgc3RvcC1jb2xvcj0iI2ZhZmFmYSIgc3RvcC1vcGFjaXR5PSIxIi8+ -CiAgICA8c3RvcCBvZmZzZXQ9IjkwJSIgc3RvcC1jb2xvcj0iI2Y5ZjlmOSIgc3RvcC1vcGFjaXR5PSIxIi8+ -CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNmNmY2ZjYiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFy -R3JhZGllbnQ+ -CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIg -Lz4KPC9zdmc+); - background: -moz-linear-gradient(top, #ebebeb 0%, #f9f9f9 5%, #fafafa 50%, #f9f9f9 90%, -#ffffff 100%); /* FF3.6+ */ - background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#ebebeb), -color-stop(5%,#f9f9f9), color-stop(50%,#fafafa), color-stop(90%,#f9f9f9), color-stop(100%,#ffffff)); -/* Chrome,Safari4+ */ - background: -webkit-linear-gradient(top, #ebebeb 0%,#f9f9f9 5%,#fafafa 50%,#f9f9f9 -90%,#ffffff 100%); /* Chrome10+,Safari5.1+ */ - background: -o-linear-gradient(top, #ebebeb 0%,#f9f9f9 5%,#fafafa 50%,#f9f9f9 90%,#ffffff -100%); /* Opera 11.10+ */ - background: -ms-linear-gradient(top, #ebebeb 0%,#f9f9f9 5%,#fafafa 50%,#f9f9f9 90%,#ffffff -100%); /* IE10+ */ - background: linear-gradient(top, #ebebeb 0%,#f9f9f9 5%,#fafafa 50%,#f9f9f9 90%,#ffffff -100%); /* W3C */ - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ebebeb', -endColorstr='#ffffff',GradientType=0 ); /* IE6-8 */ - -webkit-box-shadow: inset 0px 0px 5px 2px rgba(0, 0, 0, .05); - -moz-box-shadow: inset 0px 0px 5px 2px rgba(0, 0, 0, .05); - box-shadow: inset 0px 0px 5px 2px rgba(0, 0, 0, .05); - color: #258AAF !important; -} -.button.big { - font-size:20px; - display:inline-block; -} -.button.big span.small { - font-size:14px; -} -.button-caption { - margin-top:10px; - font-size:12px; - font-style:italic; -} - -.button.disabled, -.button.disabled:hover, -.button.disabled:active { - background:#ebebeb; - color:#999 !important; - border-color:#999; - cursor:default; -} - -.training-nav-top a.button-secondary, -.training-nav-bottom a.button-secondary { - display:block; - float:left; - margin:0; - width:130px; - text-transform:uppercase; - font-weight:bold; - - background-color: #f3f3f3; - background-image: -webkit-gradient(linear, left top, left bottom, from(#f9f9f9), to(#ececec)); - background-image: -webkit-linear-gradient(top, #f9f9f9, #ececec); - background-image: -moz-linear-gradient(top, #f9f9f9, #ececec); - background-image: -ms-linear-gradient(top, #f9f9f9, #ececec); - background-image: -o-linear-gradient(top, #f9f9f9, #ececec); - background-image: linear-gradient(top, #f9f9f9, #ececec); - filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#f9f9f9', -EndColorStr='#ececec'); - color: #33B5E5; -} - -.training-nav-top a.button-secondary:hover, -.training-nav-bottom a.button-secondary:hover { - background-color: #09c; - background-image: -webkit-gradient(linear, left top, left bottom, from(#2faddb), to(#09c)); - background-image: -webkit-linear-gradient(top, #2faddb, #09c); - background-image: -moz-linear-gradient(top, #2faddb, #09c); - background-image: -ms-linear-gradient(top, #2faddb, #09c); - background-image: -o-linear-gradient(top, #2faddb, #09c); - background-image: linear-gradient(top, #2faddb, #09c); - filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#2faddb', EndColorStr='#09c'); - border: 1px solid #3990ab; - color: #fff !important; -} - -.training-nav-top a.button-secondary.last, -.training-nav-bottom a.button-secondary.last { - border-left:0; -} - -.training-nav-top a.button-secondary.double-size, -.training-nav-bottom a.button-secondary.double-size { - width:291px; -} - -.training-nav-top, -.training-nav-bottom { - float:right; - margin:0 0 0 20px; -} - -.training-nav-bottom { - padding:0 0 20px; -} - -#tb-wrapper, -#qv-wrapper { - float:right; - clear:right; - margin:-27px 0 0 20px; /* negative top-margin to counter the content-header bottom margin */ - padding:0 0 20px; -} - -#tb, -#qv { - font-size:13px; - line-height:18px; - width:238px; - border:1px solid #ccc; - float:right; -} - -#tb { - width:278px; -} - -#tb h2, -#qv h2 { - margin:10px 15px; - padding:0; - text-transform:uppercase; - border-bottom:1px solid gainsboro; -} - -#tb *, -#qv * { - font-size:inherit; -} - -#tb .download-box { - padding:0 0 0 15px; -} - -#tb .download-box .filename { - font-size:11px; - margin:4px 4px 10px; - color:#666; -} - - -/* Dev guide quicknav */ - -.sidebox-wrapper { - float:right; - clear:right; - margin:0 0 0 20px; - padding:0 0 20px; -} - -.sidebox { - width:226px; - font-size:13px; - line-height:18px; - border-left:4px solid #99CC00; - float:right; - padding:0 0 0 10px; - margin:0 0 1em 20px; -} - -.sidebox h2, -.sidebox h3, -.sidebox h4, -.sidebox h5 { - font-weight:bold; - margin:0 0 10px; -} - -.sidebox * { - font-size:inherit; -} - -#tb ol, -#tb ul, -#qv ul { - margin:0 15px 10px 35px; -} - -#qv ol { - list-style:none; - margin:0 15px 15px; - font-size:inherit; - line-height:inherit; -} - -#tb ol ol, -#tb ul ul, -#qv ol ol, -#qv ul ul, -.sidebox ol ol, -.sidebox ul ul { - margin-bottom:0; -} - -#qv ol ol { - margin:3px 0 3px 15px; -} - -.sidebox p, -#qv p, -#tb p { - margin: 0 0 10px; -} - - -/* -------------------------------------------------------------------------- -Form -*/ -.article form { - margin: 0 0 20px; -} -.article form .form-required { - color: #dd4b39; -} -.article form fieldset { - margin: 0 0 20px; - padding: 0; -} -.article form legend { - display: block; - line-height: 1.5; - margin: 0; - padding: 0; -} -/* -.article form ol, .article form ul { - margin: 0 0 0 1em; - padding: 0 0 0 1em; -} -[dir='rtl'] .article form ol, [dir='rtl'] .article form ul { - margin: 0 1em 0 0; - padding: 0 1em 0 0; -} -.article form ol ul, .article form ul ul, [dir='rtl'] .article form ol ul, [dir='rtl'] .article form -ul ul { - list-style: none; - margin: 0; - padding: 0; -} -.article form li { - margin: 0 0 20px; -} -.article form li li { - margin: 0 0 5px; -} -*/ -.article form label { - display: block; - margin: 0 0 5px; - padding: 0; -} -.article form input[type='text'], .article form select, .article form textarea, .article form -.checkbox-group, .article form .radio-group { - margin-bottom: 15px; -} -.checkbox-group input { - width: 13px; - height: 13px; - background: #fff; - border: solid 1px #c6c6c6; - float: left; -} -.article form .checkbox-group, .article form .radio-group { - display: block -} -.article form select { - border: solid 1px #ebebeb; - border-top-color: #ddd; - -webkit-appearance: none; - background: #f3f3f3 url(../images/arrows-up-down.png) right center no-repeat; - height: 30px; - color: #222; - line-height: normal; - padding: 5px; - width: 130px; -} - -.article form .browse .browse-msg { - font-size: 11.5px; -} -.article form .browse .button-secondary { - height: auto; - line-height: 25px; - font-size: 11px; - padding: 0 8px; - margin: 0 10px 15px 0; -} -.article form input[type='text'], .article form textarea { - border: 1px solid #ebebeb; - border-top-color: #dcdcdc; - color: #222; - line-height: normal; - padding: 6px 10px; - width: 300px; -} -.article form textarea { - height: 150px; -} -.article form input[type='text']:focus, .article form textarea:focus { - border-color: #33B5E5; - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .2); - -o-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .2); - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .2); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, .2); - outline: 0; -} -.article form input[disabled], .article form textarea[disabled], .article form label.form-disabled { - color: #999; -} -.article form input[type='text'][disabled], .article form textarea[disabled] { - background-color: #ebebeb; -} -form .form-error input[type='text'], form .form-error textarea { - border-color: #dd4b39; - margin-right: 20px; -} -.aside { - -moz-border-radius: 2px; - -webkit-border-radius: 2px; - border-radius: 2px; - margin: 10px 0; - padding: 20px; - color: #666; - position: relative; - background: #f9f9f9; -} -/* -.aside, .notification, .promo { - -moz-border-radius: 2px; - -webkit-border-radius: 2px; - border-radius: 2px; - margin: 10px 0; - padding: 10px; - position: relative; -} -.aside>:first-child, .notification>:first-child, .promo>:first-child { - margin-top: 0; -} -.aside>:last-child, .notification>:last-child, .promo>:last-child { - margin-bottom: 0; -} -.aside { - background: #f9f9f9; -} -.notification { - background: #fffbe4; - border-color: #f8f6e6; -} -.promo { - background: #f6f9ff; - border-color: #eff2f9; -} -*/ - -/* SDK TOS styles */ - -div.sdk-terms { - white-space: pre-wrap; - word-wrap: break-word; - font-family: inherit; - font-size: inherit; - padding: 10px; - height: 370px; - width: 738px; - border: 1px solid #444; - background: transparent; - overflow:auto; - margin:0 0 10px; -} - -div.sdk-terms.fullsize { - padding: 0; - height: auto; - width: auto; - border:none; -} - -div.sdk-terms h3, -div.sdk-terms h2 { - margin:0; -} - -div#sdk-terms-form { - padding:0 0 0 10px; -} - -div#sdk-terms-form input { - display:inline; - margin:4px 4px 4px 0; -} - - -/* -------------------------------------------------------------------------- -Code Style -*/ -pre { - margin:0 0 1em 0; - padding: 1em; - overflow: auto; - border: solid 1px #ddd; - background: #f7f7f7; -} -.str { color: #080; } -.kwd { color: #008; } -.com { color: #800; } -.typ { color: #606; } -.lit { color: #066; } -.pun { color: #660; } -.pln { color: #000; } -.tag { color: #008; } -.atn { color: #828; } -.atv { color: #080; } -.dec { color: #606; } - -/* -------------------------------------------------------------------------- -Three-Pane -*/ -/* Package Nav & Classes Nav */ -.three-pane { - position: relative; - border-top: solid 1px #ebebeb; -} -#packages-nav .js-pane, -#classes-nav .js-pane { - overflow:visible; -} -#packages-nav { - height:270px; - max-height: inherit; - overflow: hidden; - position: relative; -} -#classes-nav { - overflow: hidden; - position: relative; -} -#packages-nav ul, #classes-nav ul { - list-style-type: none; - margin: 10px 0 20px 0; - padding: 0; -} -#classes-nav li { - font-weight: bold; - margin: 5px 0; -} -#packages-nav li, -#classes-nav li li { - margin: 0; -} -#packages-nav li a, #packages-nav li a:active, #packages-nav li a:visited, -#classes-nav li a, #classes-nav li a:active, #classes-nav li a:visited { - padding: 0 0 0 4px; -} -#packages-nav li a, #packages-nav li a:active, #packages-nav li a:visited, -#classes-nav li li a, #classes-nav li li a:active, #classes-nav li li a:visited, -#nav-tree li a, #nav-tree li a:active, #nav-tree li a:visited { - color: #222; - font-weight: normal; -} -#packages-nav li a, #packages-nav li a:active, #packages-nav li a:visited, -#classes-nav li li a, #classes-nav li li a:active, #classes-nav li li a:visited { - display: block; -} -#packages-nav li.selected a, #packages-nav li.selected a:active, #packages-nav li.selected -a:visited, -#classes-nav li li.selected a, #classes-nav li li.selected a:active, #classes-nav li li.selected -a:visited, -#nav-tree li div.selected { - font-weight: 500; - color: #0099cc; - background-color:#fff; } - #packages-nav li.selected ul li a, - #classes-nav li.selected ul li a { - /* don't highlight child items */ - color: #555555; } -#nav-tree li div.selected a { - font-weight: 500; - color: #0099cc; -} -#nav-swap { - height:30px; - border-top:1px solid #ccc; -} -#nav-swap a { - display:inline-block; - height:100%; - color: #222; - font-size: 12px; - padding: 5px 0 5px 5px; -} - -#nav-swap .fullscreen { - float: right; - width: 24px; - height: 24px; - text-indent: -1000em; - padding:0; - margin:3px 5px 0; - background: url(../images/fullscreen.png) no-repeat -24px 0; -} -#nav-swap .fullscreen.disabled { - background-position: 0 0; -} -#nav-swap .fullscreen:hover, -#nav-swap .fullscreen:focus { - cursor:pointer; -} - - -/* nav tree */ -#side-nav, #devdoc-nav, #swapper, -#nav-tree, #tree-list { - overflow:hidden; - margin-left:0; -} - -#nav-tree ul { - list-style:none; - padding:0; - margin:10px 0; -} - -#nav-tree ul li div { - padding:0 0 0 4px; -} - -#side-nav #nav-tree ul li a, -#side-nav #nav-tree ul li span.no-children { - padding: 0; - margin: 0; -} - -#nav-tree .plus { - margin: 0 3px 0 0; -} - -#nav-tree ul ul { - list-style: none; - margin: 0; - padding: 0 0 0 0; -} - -#nav-tree ul li { - margin: 0; - padding: 0 0 0 0; - white-space: nowrap; -} - -#nav-tree .children_ul { - padding:0; - margin:0; -} -#nav-tree .children_ul li div { - padding:0 0 0 10px; -} -#nav-tree .children_ul .children_ul li div { - padding:0 0 0 20px; -} - -#nav-tree a.nolink { - color: #222; - text-decoration: none; -} - -#nav-tree span.label { - width: 100%; -} - -#nav-tree { - overflow-x: auto; - overflow-y: scroll; - outline:0; -} - - -/* Content */ -#doc-col { - margin-right:0; -} -#doc-content-container { - margin-left: 291px -} -#doc-header, #doc-content { - padding: 1em 2em; -} -#doc-header { - background: #f7f7f7; -} -#doc-header h1 { - line-height: 0; - margin-bottom: 15px; -} -#api-info-block { - float: right; - font-weight: bold; -} -#api-info-block a, #api-info-block a:active, #api-info-block a:visited { - color: #222; -} -#api-info-block a:hover, #api-info-block a:focus { - color: #33B5E5; -} -#api-nav-header { - height:19px; /* plus 16px padding = 35; same as #nav li */ - font-size:14px; - padding: 8px 0; - margin: 0; - border-bottom: 1px solid #CCC; - background:#e9e9e9; - background: rgba(0, 0, 0, 0.05); /* matches #nav li.expanded */ - -} -#api-nav-title { - padding:0 5px; - white-space:nowrap; -} - -#api-level-toggle { - float:right; - padding:0 5px; -} - -#api-level-toggle label { - margin:0; - vertical-align:top; - line-height: 19px; - font-size:13px; - height: 19px; -} - -#api-level-toggle .select-wrapper { - width: 35px; - display: inline-block; - overflow: hidden; -} -#api-level-toggle select { - border: 0; - appearance:none; - -moz-appearance:none; - -webkit-appearance: none; - background: transparent url(../images/arrows-up-down.png) 23px 5px no-repeat; - color: #222; - height: 19px; - line-height: 19px; - padding: 0; - margin:1px 0 0 0; - width:150%; - font-size:13px; - vertical-align:top; - outline:0; -} - - -/* Toggle for revision notes and stuff */ -div.toggle-content.closed .toggle-content-toggleme { - display:none; -} - -#jd-content img.toggle-content-img { - margin:0 5px 5px 0; -} -div.toggle-content p { - margin:10px 0 0; -} -div.toggle-content-toggleme { - padding:0 0 0 15px; -} - - -/* API LEVEL FILTERED MEMBERS */ - -.absent, -.absent a:link, -.absent a:visited, -.absent a:hover, -.absent * { - color:#bbb !important; - cursor:default !important; - text-decoration:none !important; -} -#devdoc-nav li.absent.selected, -#devdoc-nav li.absent.selected *, -#devdoc-nav div.label.absent.selected, -#devdoc-nav div.label.absent.selected * { - background-color:#eaeaea !important; -} -.absent h4.jd-details-title, -.absent h4.jd-details-title * { - background-color:#f6f6f6 !important; -} -.absent img { - opacity: .3; - filter: alpha(opacity=30); - -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=30)"; -} - - - - - - - - - -/* JQUERY RESIZABLE STYLES */ -.ui-resizable { position: relative; } -.ui-resizable-handle { position: absolute; display: none; font-size: 0.1px; z-index:1; } -.ui-resizable .ui-resizable-handle { display: block; border-bottom: 1px solid #e4e4e4; } -/*body .ui-resizable-disabled .ui-resizable-handle { display: none; } -body .ui-resizable-autohide .ui-resizable-handle { display: none; }*/ -.ui-resizable-s { cursor: s-resize; height: 10px; width: 100% !important; bottom: -11px; left: 0; -border-bottom: solid 1px #ededed; - background: #f7f7f7 url("../images/resizable-s2.png") no-repeat scroll center center; } -/* -.ui-resizable-e { -cursor: e-resize; width: 10px; right: 0; top: 0; height: 100%; border-right: solid -1px #ededed;background: #f7f7f7 url("../images/resizable-e2.png") no-repeat scroll center center; } -*/ - -/* -------------------------------------------------------------------------- -Lightbox -*/ -.lightbox { - width: 769px; - padding: 1.5em; - margin: 0 auto; - border: solid 1px #dcdcdc; - background: #fff; - -moz-box-shadow: 1px 1px 5px rgba(0,0,0,0.1); - -webkit-box-shadow: 1px 1px 5px rgba(0,0,0,0.1); - box-shadow: 1px 1px 5px rgba(0,0,0,0.1) -} -.lightbox .header { - float: left; - width: 720px; - margin: -10px 20px 10px 0; -} -.lightbox .close { - float: right; - width: 10px; - height: 10px; - margin: -10px -10px 10px 0; - text-indent: -1000em; - background: url(../images/close.png) no-repeat 0 0; -} -.lightbox .close:hover, .lightbox .close:focus { - background-position: -10px 0; -} - -/* -------------------------------------------------------------------------- -Butterbar -*/ -#butterbar-wrapper { - position:absolute; - top:0; - left:0; - width:100%; -} -#butterbar { - width:940px; - margin:0 auto; -} -#butterbar-message { - background-color:#f80; - float:right; - font-size:12px; - font-weight:bold; - padding:0 10px; - border-radius: 0 0 5px 5px; -} -#butterbar-message a {color:#fff !important} -#butterbar-message a:hover {text-decoration:underline;} - -/* -------------------------------------------------------------------------- -Misc -*/ - - -.clearfix:before, .clearfix:after { - content: ""; - display: table -} -.clearfix:after { - clear: both -} -.clearfix { - *zoom: 1 -} -table.blank th, table.blank td { - border: 0; - background: none -} -.caption { - margin: 0.5em 0 2em 0; - color: #000; - font-size: 11.5px; -} - -.nolist { - list-style:none; - margin-left:0; -} -#tb .nolist { - margin-left:15px; -} - - -pre.classic { - background-color:transparent; - border:none; - padding:0; -} - -p.img-caption { - margin: -10px 0 20px; - font-size:13px; - color:#666; -} - -div.figure { - float:right; - clear:right; - margin:10px 0 0 0; - padding:0 0 0 20px; - /* width must be defined w/ an inline style matching the image width */ -} - -p.table-caption { - margin: 0 0 4px 0; - font-size:13px; - color:#666; -} - -p.code-caption { - margin: 0 0 4px 0; - font: 13px/1.5 'courier new', courier, monospace; - color:#666; -} - -div.note, -div.caution, -div.warning { - margin: 0 0 15px; -} - -p.note, div.note, -p.caution, div.caution, -p.warning, div.warning { - padding: 0 0 0 10px; - border-left: 4px solid; -} - -p.note, div.note { - border-color: #258AAF; -} - -p.caution, div.caution { - border-color: #FF8800; -} - -p.warning, div.warning { - border-color: #ff4443; -} - -div.note.design { - border-left: 4px solid #33B5E5; -} - -div.note.develop { - border-left: 4px solid #F80; -} - -div.note.distribute { - border-left: 4px solid #9C0; -} - -.note p, .caution p, .warning p { - margin:0 0 5px; -} - -.note p:last-child, .caution p:last-child, .warning p:last-child { - margin-bottom:0; -} - -body.about blockquote { - display:block; - float:right; - width:280px; - font-size:20px; - font-style:italic; - line-height:24px; - color:#33B5E5; - margin:0 0 20px 30px; -} - -div.design-announce p { - margin:0 0 10px; -} - -#devdoc-nav a.totop { - display:block; - top:0; - width:inherit; - background: transparent url(../images/styles/gototop.png) no-repeat scroll 50% 50%; - text-indent:-9999em; -} -#devdoc-nav a.totop { - position:fixed; - display:none; -} -#devdoc-nav a.totop:hover { - background-color:#33B5E5; -} - -.content-footer a.totop { - text-transform:uppercase; - line-height:30px; -} - -.expandable { - height:34px; - padding-left:20px; - position:relative; -} -.expandable:before { - content: ''; - background-image: url(../images/styles/disclosure_down.png); - background-repeat:no-repeat; - background-position: -12px -9px; - width: 20px; - height: 20px; - display: inline-block; - position: absolute; - top: 0; - left: 0; } -} -.expandable.expanded:before { - background-image: url(../images/styles/disclosure_up.png); -} - - - -/* ----------------------------------------------- -Dialog box for popup messages -*/ - -div.dialog { - height:0; - margin:0 auto; -} - -div.dialog>div { - z-index:99; - position:fixed; - margin:70px 0; - width: 391px; - height: 200px; - background: #F7F7F7; --moz-box-shadow: 0 0 15px rgba(0,0,0,0.5); --webkit-box-shadow: 0 0 15px rgba(0,0,0,0.5); -box-shadow: 0 0 15px rgba(0,0,0,0.5); -} -/* IE6 can't position fixed */ -* html div.dialog div { position:absolute; } - - -div#deprecatedSticker { - display:none; - z-index:99; - position:fixed; - right:15px; - top:114px; - margin:0; - padding:1em; - background:#FFF; - border:1px solid #dddd00; - box-shadow:-5px 5px 10px #ccc; - -moz-box-shadow:-5px 5px 10px #ccc; - -webkit-box-shadow:-5px 5px 10px #ccc; -} - -div#naMessage { - display:none; - width:555px; - height:0; - margin:0 auto; -} - -div#naMessage div { - z-index:99; - width:450px; - position:fixed; - margin:50px 0; - padding:4em 4em 3em; - background:#FFF; - border:1px solid #999; - box-shadow:-10px 10px 40px #888; - -moz-box-shadow:-10px 10px 40px #888; - -webkit-box-shadow:-10px 10px 40px #888; -} -/* IE6 can't position fixed */ -* html div#naMessage div { position:absolute; } - -div#naMessage strong { - font-size:1.1em; -} - - -/* -------------------------------------------------------------------------- -Slideshow Controls & Next/Prev -*/ -.slideshow-next, .slideshow-prev { - width: 20px; - height: 36px; - text-indent: -1000em; -} -.slideshow-container { - margin: 2em 0; -} -.slideshow-container:before, .slideshow-container:after { - content: ""; - display: table; - clear: both; -} -a.slideshow-next, a.slideshow-next:visited { - - float: right; - - background: url(../images/arrow-right.png) no-repeat 0 0 - -} - -a.slideshow-prev, a.slideshow-prev:visited { - - float: left; - - background: url(../images/arrow-left.png) no-repeat 0 0 - -} - -.slideshow-next:hover, .slideshow-prev:hover, .slideshow-next:focus, .slideshow-prev:focus { - - background-position: 0 -36px - -} - -.slideshow-next:active, .slideshow-prev:active { - - background-position: 0 -72px - -} -.slideshow-nav { - width: 74px; - margin: 0 auto; -} -.slideshow-nav a, .slideshow-nav a:visited { - display: inline-block; - width: 12px; - height: 12px; - margin: 0 2px 20px 2px; - background: #ccc; - -webkit-border-radius: 50%; - -moz-border-radius: 50%; - border-radius: 50%; -} -.slideshow-nav a:hover, .slideshow-nav a:focus { - - background: #33B5E5 -} - -.slideshow-nav a:active { - - background: #1e799a; - background: #ebebeb; - -webkit-box-shadow: inset 0px 0px 5px 2px rgba(0, 0, 0, .05); - -moz-box-shadow: inset 0px 0px 5px 2px rgba(0, 0, 0, .05); - box-shadow: inset 0px 0px 5px 2px rgba(0, 0, 0, .05); -} -.slideshow-nav a.active, .slideshow-nav a.active:active, .slideshow-nav a.active:visited { - background: #33B5E5 -} -/* -------------------------------------------------------------------------- -Tabs -*/ -ul.tabs { - padding: 0; - margin: 2em 0 0 0; -} -ul.tabs:before, ul.tabs:after { - content: ""; - display: table; - clear: both; -} -ul.tabs li { - list-style-type: none; - float: left; -} -ul.tabs li a, ul.tabs li a:active, ul.tabs li a:visited { - display: block; - height: 36px; - line-height: 36px; - padding: 0 15px; - margin-right: 2px; - color: #222; - -moz-border-radius-topleft: 2px; - -moz-border-radius-topright: 2px; - -moz-border-radius-bottomright: px; - -moz-border-radius-bottomleft: px; - -webkit-border-radius: 2px 2px px px; - border-radius: 2px 2px px px; - border-top: solid 1px #ebebeb; - border-left: solid 1px #ebebeb; - border-right: solid 1px #ebebeb; - background-color: #fff; - background-image: -webkit-gradient(linear, left top, left bottom, from(#ffffff), to(#fafafa)); - background-image: -webkit-linear-gradient(top, #ffffff, #fafafa); - background-image: -moz-linear-gradient(top, #ffffff, #fafafa); - background-image: -ms-linear-gradient(top, #ffffff, #fafafa); - background-image: -o-linear-gradient(top, #ffffff, #fafafa); - background-image: linear-gradient(top, #ffffff, #fafafa); - filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#ffffff', -EndColorStr='#fafafa'); -} -ul.tabs li a:hover { - color: #33B5E5; -} -ul.tabs li a.selected { - height: 37px; - color: #33B5E5; - background-color: #f7f7f7; - background-image: none; - border-color: #ddd; -} -.tab-content { - padding: 1.2em; - margin: -1px 0 2em 0; - -webkit-border-radius: 2px; - -moz-border-radius: 2px; - border-radius: 2px; - border: solid 1px #ddd; - background: #f7f7f7; -} -/* -------------------------------------------------------------------------- -Feature Boxes -*/ -.feature-box { - width: 291px; - height: 200px; - position: relative; - background: #F7F7F7; -} -.box-border .top, .box-border .bottom, .box-border .left, .box-border .right { - z-index: 100; - position: absolute; - background-color: #aaa; -} -.box-border .top, .box-border .bottom { - width: 291px; - height: 1px; -} -.dialog .box-border .top, -.dialog .box-border .bottom { width:391px; } - -.box-border .left, .box-border .right { - width: 1px; - height: 8px; -} -.box-border .top { top: 0; left: 0 } -.box-border .top .left { top: 1px; left: 0 } -.box-border .top .right { top: 1px; right: 0 } -.box-border .bottom .left { top: -8px; left: 0 } -.box-border .bottom { top: 200px; left: 0 } -.box-border .bottom .right { top: -8px; right: 0 } - -.feature-box h4, -.dialog h4 { - margin: 15px 18px 10px; - padding:0; -} - -.feature-box p, -.dialog p { - margin: 10px 18px; - padding:0; -} -.feature-box .link, -.dialog .link { - border-top: 1px solid #dedede; - bottom: 0; - position: absolute; - width: inherit; -} -.feature-box a, .feature-box h4, -.dialog a, .dialog h4 { - -webkit-transition: color .4s ease; - -moz-transition: color .4s ease; - -o-transition: color .4s ease; - transition: color .4s ease; -} -.feature-box:hover { - cursor: pointer; -} -.feature-box:hover .box-border .top, .feature-box:hover .box-border .bottom, .feature-box:hover -.left, .feature-box:hover .right { - background-color: #33B5E5; -} -.feature-box:hover h4, .feature-box:hover a { - color: #33B5E5; -} -/* -------------------------------------------------------------------------- -Page-Specific Styles -*/ -.colors { - position: relative; - float: left; - width: 92px; - margin: 40px 0 20px; -} -.colors div { - color: #fff; - font-size: 11.5px; - width: 82px; - height: 82px; - margin-top:-30px; - line-height: 82px; - text-align: center; - border: solid 5px #fff; - -webkit-border-radius: 50%; - -moz-border-radius: 50%; - border-radius: 50%; -} - - - - - - - - - - - - - - -/* ########### REFERENCE DOCS ################## */ - -#packages-nav h2, -#classes-nav h2 { - font-size:18px; - margin:0; - padding:0 0 0 4px; -} - -#jd-header { - padding: 0 0 5px; - margin: 20px 0 10px; - font-size:13px; - border-bottom:solid 1px #ccc; -} - -#jd-header h1 { - margin:0; - padding:0; -} - -/* page-top-right container for reference pages (holds -links to summary tables) */ -#api-info-block { - font-size:13px; - margin:20px 0 0; - padding:0 10px 6px; - font-weight:normal; - float:right; - text-align:right; - color:#999; - max-width:70%; -} - -#api-info-block div.api-level { - font-weight:bold; - font-size:inherit; - float:none; - color:#222; - padding:0; - margin:0; -} - -/* inheritance table */ -.jd-inheritance-table { - border-spacing:0; - margin:0; - padding:0; - font-size:13px; - background-color:transparent; -} -.jd-inheritance-table tr td { - border: none; - margin: 0; - padding: 0; - background-color:transparent; -} -.jd-inheritance-table .jd-inheritance-space { - font-weight:bold; - width:1em; -} -.jd-inheritance-table .jd-inheritance-interface-cell { - padding-left: 17px; -} - - - -.jd-sumtable a { - text-decoration:none; -} - -.jd-sumtable a:hover { - text-decoration:underline; -} - -/* the link inside a sumtable for "Show All/Hide All" */ -.toggle-all { - display:block; - float:right; - font-weight:normal; - font-size:0.9em; -} - -/* adjustments for in/direct subclasses tables */ -.jd-sumtable.jd-sumtable-subclasses { - margin: 1em 0 0 0; - max-width:968px; - background-color:transparent; - font-size:13px; -} - -/* extra space between end of method name and open-paren */ -.sympad { - margin-right: 2px; -} - -/* right alignment for the return type in sumtable */ -.jd-sumtable .jd-typecol { - text-align:right; -} - -/* adjustments for the expando table-in-table */ -.jd-sumtable-expando { - margin:.5em 0; - padding:0; -} - -/* a div that holds a short description */ -.jd-descrdiv { - padding:3px 1em 0 1em; - margin:0; - border:0; -} - -#jd-content img.jd-expando-trigger-img { - padding:0 4px 4px 0; - margin:0; -} - -.jd-sumtable-subclasses div#subclasses-direct, -.jd-sumtable-subclasses div#subclasses-indirect { - margin:0 0 0 13px; -} - - - -/********* MEMBER REF *************/ - - -.jd-details { -/* border:1px solid #669999; - padding:4px; */ - margin:0 0 1em; -} - -/* API reference: a container for the -.tagdata blocks that make up the detailed -description */ -.jd-details-descr { - padding:0; - margin:.5em .25em; -} - -/* API reference: a block containing -a detailed description, a params table, -seealso list, etc */ -.jd-tagdata { - margin:.5em 1em; -} - -.jd-tagdata p { - margin:0 0 1em 1em; -} - -/* API reference: adjustments to -the detailed description block */ -.jd-tagdescr { - margin:.25em 0 .75em 0; -} - -.jd-tagdescr ol, -.jd-tagdescr ul { - margin:0 2.5em; - padding:0; -} - -.jd-tagdescr table, -.jd-tagdescr img { - margin:.25em 1em; -} - -.jd-tagdescr li { -margin:0 0 .25em 0; -padding:0; -} - -/* API reference: heading marking -the details section for constants, -attrs, methods, etc. */ -h4.jd-details-title { - font-size:1.15em; - background-color: #E2E2E2; - margin:1.5em 0 .6em; - padding:3px 95px 3px 3px; /* room for api-level */ -} -body.google h4.jd-details-title { - background-color: #FFF; - padding-top:5px; - border-top: 1px solid #ccc; -} -body.google table.jd-sumtable th { - background-color: #FFF; - color:#000; -} - -h4.jd-tagtitle { - margin:0; -} - -h4 .normal { - font-weight:normal; -} - -/* API reference: heading for "Parameters", "See Also", etc., -in details sections */ -h5.jd-tagtitle { - margin:0 0 .25em 0; - font-size:1em; -} - -.jd-tagtable { - margin:0; - background-color:transparent; - width:auto; -} - -.jd-tagtable td, -.jd-tagtable th { - border:none; - background-color:#fff; - vertical-align:top; - font-weight:normal; - padding:2px 10px; -} - -.jd-tagtable th { - font-style:italic; -} - -/* Inline api level indicator for methods */ -div.api-level { - font-size:.8em; - font-weight:normal; - color:#999; - float:right; - padding:0 8px 0; - margin-top:-30px; -} - -table.jd-tagtable td, -table.jd-tagtable th { - background-color:transparent; -} - -table.jd-tagtable th { - color:inherit; -} - - - - - - - - - - - - - - - - - - - - - - - -/* SEARCH FILTER */ - -#search_autocomplete { - font-weight:normal; -} - -#search_filtered_wrapper { - width: 193px; - float: right; -} -#search_filtered_div { - position:absolute; - z-index:9999; - min-width:171px; /* +padding and border makes this match input width */ - padding:5px; - border: solid 1px #C5C5C5; - background: white; - top: 35px; - -moz-box-shadow: 0 0 10px rgba(0,0,0,0.2); - -webkit-box-shadow: 0 0 10px rgba(0, 0, 0, 0.2); - box-shadow: 0 0 10px rgba(0, 0, 0, 0.2); -} - -ul#search_filtered { - min-width:100%; - margin:0; - list-style: none; - margin: 0; - padding: 0; -} - - -#search_filtered li{ - line-height:1.5em; - margin: 0 0 2px; - padding: 0; -} - -#search_filtered li a { - padding:0 5px; - color:#222 !important; -} - -#search_filtered .jd-selected { - background-color: #33B5E5; - cursor:pointer; -} -#search_filtered .jd-selected, -#search_filtered .jd-selected a { - color:#f7f7f7 !important; -} - -.no-display { - display: none; -} - -.jd-autocomplete { - padding-left: 6px; - padding-right: 6px; - padding-top: 1px; - padding-bottom: 1px; - font-size: 0.81em; - border: none; - margin: 0; - line-height: 1.05em; -} - -.show-item { - display: table-row; -} -.hide-item { - display: hidden; -} - - - - - -/* SEARCH RESULTS */ - - -#leftSearchControl .gsc-twiddle { - background-image : none; -} - -#leftSearchControl td, #searchForm td { - border: 0px solid #000; - padding:0; -} - -#leftSearchControl .gsc-resultsHeader .gsc-title { - padding-left : 0px; - font-weight : bold; - font-size : 13px; - color:#006699; - display : none; -} - -#leftSearchControl .gsc-resultsHeader div.gsc-results-selector { - display : none; -} - -#leftSearchControl .gsc-resultsRoot { - padding-top : 6px; -} - -#leftSearchControl div.gs-visibleUrl-long { - display : block; - color:#006699; -} - -#leftSearchControl .gsc-webResult { - padding:0 0 20px 0; -} - -.gsc-webResult div.gs-visibleUrl-short, -table.gsc-branding, -.gsc-clear-button { - display : none; -} - -.gsc-cursor-box .gsc-cursor div.gsc-cursor-page, -.gsc-cursor-box .gsc-trailing-more-results a.gsc-trailing-more-results, -#leftSearchControl a, -#leftSearchControl a b { - color:#006699; -} - -.gsc-resultsHeader { - display: none; -} - -/* Disable built in search forms */ -.gsc-control form.gsc-search-box { - display : none; -} -table.gsc-search-box { - margin:6px 0 0 0; - border-collapse:collapse; -} - -td.gsc-input { - padding:0 2px; - width:100%; - vertical-align:middle; -} - -input.gsc-input { - border:1px solid #BCCDF0; - width:99%; - padding-left:2px; - font-size:.95em; -} - -td.gsc-search-button { - text-align: right; - padding:0; - vertical-align:top; -} - - -#searchResults { - overflow:hidden; /* because the repositioned page links makes the section think it needs to scroll -(it doesn't) */ - height:auto; -} - -#searchResults .gsc-control { - position:relative; - width:auto; - padding:0 0 10px; -} - -#searchResults .gsc-tabsArea { - position:relative; - white-space:nowrap; - float:left; - width:200px; -} - -#searchResults .gsc-above-wrapper-area { - display:none; -} - -#searchResults .gsc-resultsbox-visible { - float:left; - width:720px; - margin-left:20px; -} - -#searchResults .gsc-tabHeader { - padding: 3px 6px; - position:relative; - width:auto; - display:block; -} - -#searchResults h2#searchTitle { - padding:0; - margin:5px 0; - border:none; -} - -#searchResults h2#searchTitle em { - font-style:normal; - color:#33B5E5; -} - -#searchResults .gsc-table-result { - margin:5px 0 10px 0; - background-color:transparent; -} -#searchResults .gs-web-image-box, .gs-promotion-image-box { - width:120px; -} -#searchResults .gs-web-image-box img.gs-image, .gs-promotion-image-box img.gs-promotion-image { - max-width:120px; -} - -#searchResults .gsc-table-result .gsc-thumbnail { - padding:0 20px 0 0; -} - -#searchResults td { - background-color:transparent; -} - -#searchResults .gsc-expansionArea { - position:relative; -} -#searchResults .gsc-tabsArea .gsc-cursor-box { - width:200px; - padding:20px 0 0 1px; -} -#searchResults .gsc-cursor-page { - display:inline-block; - float:left; - margin:-1px 0 0 -1px; - padding:0; - height:27px; - width:27px; - text-align:center; - line-height:2; -} - -#searchResults .gsc-tabHeader.gsc-tabhInactive, -#searchResults .gsc-cursor-page { - text-decoration:none; - color:#258AAF; - border: solid 1px #DADADA; -} - -#searchResults .gsc-tabHeader.gsc-tabhInactive:hover, -#searchResults .gsc-cursor-page:hover { - border-color: #DBDBDB; - background-color: #F3F3F3; - background-image: -webkit-gradient(linear, left top, left bottom, from(#F9F9F9), to(#ECECEC)); - background-image: -webkit-linear-gradient(top, #F9F9F9, #ECECEC); - background-image: -moz-linear-gradient(top, #F9F9F9, #ECECEC); - background-image: -ms-linear-gradient(top, #F9F9F9, #ECECEC); - background-image: -o-linear-gradient(top, #F9F9F9, #ECECEC); - background-image: linear-gradient(top, #F9F9F9, #ECECEC); - filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#f9f9f9', -EndColorStr='#ececec'); - color: #33B5E5; -} - -#searchResults .gsc-tabHeader.gsc-tabhActive, -#searchResults .gsc-tabHeader.gsc-tabhActive:hover, -#searchResults .gsc-cursor-page.gsc-cursor-current-page, -#searchResults .gsc-cursor-page.gsc-cursor-current-page:hover { - color:#fff; - background-color: #09C; - background-image: -webkit-gradient(linear, left top, left bottom, from(#2FADDB), to(#09C)); - background-image: -webkit-linear-gradient(top, #2FADDB, #09C); - background-image: -moz-linear-gradient(top, #2FADDB, #09C); - background-image: -ms-linear-gradient(top, #2FADDB, #09C); - background-image: -o-linear-gradient(top, #2FADDB, #09C); - background-image: linear-gradient(top, #2FADDB, #09C); - filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#2faddb', EndColorStr='#09c'); - border: 1px solid #3990AB; - z-index:100; -} - -} - - - - - - - - - - - - - -/*********** PREVIOUSLY dac-styles.css ***************/ - - - - - -::-webkit-selection, -::-moz-selection, -::selection { - background-color: #0099cc; - color: #fff; } - -#header { - border-bottom:0; -} - -#header .wrap { - max-width:940px; - height:41px; - border-bottom:1px solid; - border-color: #ccc; - position:relative; -} - -.about #header .wrap { - border-color: #9933CC; -} - -.design #header .wrap { - border-color: #33b5e5; -} - -.develop #header .wrap { - border-color: #F80; -} - -.distribute #header .wrap { - border-color: #9C0; -} - -.logo a { - width:123px; - float:left; -} - -#header .logo { - margin-top: -6px; - margin-left: 0px; - margin-bottom:0px; - width: 160px; - padding-right:10px; -} - -.search { - height:25px; - margin-top: -3px; - margin-bottom: 0px; -} - - - -/* Quicknav */ -.btn-quicknav { - width:20px; - height:28px; - float:left; - margin-left:6px; - padding-right:10px; - position:relative; - cursor:pointer; - border-right:1px solid #CCC; -} - -.btn-quicknav a { - zoom:1; - position:absolute; - top:13px; - left:5px; - display:block; - text-indent:-9999em; - width:10px; - height:5px; - background:url(../images/quicknav_arrow.png) no-repeat; -} - -.btn-quicknav a.arrow-active { - background-position: 0 -5px; - display:none; -} - -#header-wrap.quicknav a.arrow-inactive { - display:none; -} - -.btn-quicknav.active a.arrow-active { - display:block; -} - -.nav-x li { - display:block; - float:left; - margin-right:45px; - -webkit-transition: all 0.25s linear; - -moz-transition: all 0.25s linear; - -ms-transition: all 0.25s linear; - -o-transition: all 0.25s linear; - transition: all 0.25s linear; -} - -#header-wrap.quicknav .nav-x li { - min-width:160px; - margin-right:20px; -} - -#header-wrap.quicknav li.last { - margin-right:0px; -} - -#quicknav { - float:none; - clear:both; - margin-left:180px; - margin-top:-30px; - display:none; - overflow:hidden; -} - -#header-wrap.quicknav #quicknav { - -} - -#quicknav ul { - margin:10px 0; - padding:0; -} - -#quicknav ul li.design { - border-top:1px solid #33b5e5; -} - -#quicknav ul li.develop { - border-top:1px solid #FF8800; -} - -#quicknav ul li.distribute { - border-top:1px solid #99cc00; -} - -#quicknav ul li { - display:block; - float:left; - margin:0 20px 0 0; - min-width:140px; -} - -#quicknav ul li.last { - margin-right:0px; -} - -#quicknav ul li ul li { - float:none; -} - -#quicknav ul li ul li a { - color:#222; -} - -#quicknav ul li li ul, -#quicknav ul li li ul li { - margin:0; -} - -#quicknav ul li li ul li:before { - content:"\21B3"; -} - -#header-wrap { - -webkit-transition: all 0.25s ease-out; - -moz-transition: all 0.25s ease-out; - -ms-transition: all 0.25s ease-out; - -o-transition: all 0.25s ease-out; - transition: all 0.25s ease-out; - -} - -#header-wrap.quicknav { - height:196px; - -} - -/* SEARCH AND MORE */ -.search { - position: absolute; - width: 50px; - height:28px; - display: block; - margin-top:-3px; - margin-bottom:7px; - overflow:hidden; - z-index:100; - right:54px; - -webkit-transition: width 0.4s ease; - -moz-transition: width 0.4s ease; - -o-transition: width 0.4s ease; - transition: width 0.4s ease; -} - -.search #search-btn { - width:50px; - height:28px; - background:url(../images/icon_search.png) no-repeat; - float:left; -} - -.search-inner { - width:245px; -} - -.search:hover, .search.active { - width:245px; -} - -.search .bottom, .search .left, .search .right { - position: absolute; - background-color: #a2a2a2 -} - -.search .bottom { - width: 214px; - height: 1px; - top: 24px; - left: 0 -} - -.search .left, .search .right { - height: 5px; - width: 1px -} - -.search .left { - top: 22px; - left: 56px; - background-color:#CCC; -} - -.search .right { - top: 22px; - left: 238px; - background-color:#CCC; -} - -.search form { - margin-top: 2px; - width: 162px; - float:left; -} - -.search form input { - color: #2f2f2f; - font-size: 0.95em; - width: 178px; - border: none; - margin-left: 6px; - z-index: 1500; - position: relative; - background-color: transparent; - border-bottom:1px solid #CCC; - padding:0 0 0 4px; - outline:none; - height:24px; -} - -.search:hover form input { - border-bottom:1px solid #33B5E5; -} - -.search:hover .bottom, .search:hover .left, .search:hover .right { - background-color: #33b5e5; -} - -.search:hover #search-btn { - background-position: 0 -28px -} - -.search form input:focus { - color: #222; - font-weight: bold -} - -.moremenu { - float: right; - position: relative; - width: 50px; - height:28px; - display: block; - margin-top:-3px; - margin-bottom:7px; - overflow:hidden; - -webkit-transition: width 0.25s ease; - -moz-transition: width 0.25s ease; - -o-transition: width 0.25s ease; - transition: width 0.25s ease; -} - -.moremenu #more-btn { - width:40px; - height:28px; - background:url(../images/icon_more.png) no-repeat; - border-left:1px solid #CCC; - float:left; - cursor:pointer; -} - -.moremenu:hover #more-btn { - background-position:0 -28px; -} - -.morehover { - position:absolute; - right:6px; - top:-9px; - width:40px; - height:35px; - z-index:99; - overflow:hidden; - - -webkit-opacity:0; - -moz-opacity:0; - -o-opacity:0; - opacity:0; - - -webkit-transform-origin:100% 0%; - -moz-transform-origin:100% 0%; - -o-transform-origin:100% 0%; - transform-origin:100% 0%; - - -webkit-transition-property: -webkit-opacity; - -webkit-transition-duration: .25s; - -webkit-transition-timing-function:ease; - - -moz-transition-property: -webkit-opacity; - -moz-transition-duration: .25s; - -moz-transition-timing-function:ease; - - -o-transition-property: -webkit-opacity; - -o-transition-duration: .25s; - -o-transition-timing-function:ease; - - -transition-property: -webkit-opacity; - -transition-duration: .25s; - -transition-timing-function:ease; -} - -.morehover:hover, -.morehover.hover { - opacity:1; - height:385px; - width:268px; - -webkit-transition-property:height, -webkit-opacity; -} - -.morehover .top { - width:268px; - height:39px; - background:url(../images/more_top.png) no-repeat; -} - -.morehover .mid { - width:228px; - background:url(../images/more_mid.png) repeat-y; - padding:10px 20px 0 20px; -} - -.morehover .mid .header { - border-bottom:1px solid #ccc; - font-weight:bold; -} - -.morehover .bottom { - width:268px; - height:6px; - background:url(../images/more_bottom.png) no-repeat; -} - -.morehover ul { - margin:10px 10px 20px 0; -} - -.morehover ul li { - list-style:none; -} - -.morehover ul li.active a, -.morehover ul li.active a:hover { - color:#222 !important; -} - -.morehover ul li.active img { - margin-right:4px; -} - - - - -/* MARQUEE */ -.slideshow-container { - width:100%; - overflow:hidden; - position:relative; -} -.slideshow-container .slideshow-prev { - position:absolute; - top:50%; - left:0px; - margin-top:-36px; - z-index:99; -} -.slideshow-container .slideshow-next { - position:absolute; - top:50%; - margin-top:-36px; - z-index:99; - right:0px; -} - -.slideshow-container .pagination { - position:absolute; - bottom:20px; - width:100%; - text-align:center; - z-index:99; -} -.slideshow-container .pagination ul { - margin:0; -} -.slideshow-container .pagination ul li{ - display: inline-block; - width:12px; - height:12px; - text-indent:-8000px; - list-style:none; - margin: 0 2px; - border-radius:6px; - background-color:#ccc; - cursor:pointer; - -webkit-transition:color .5s ease-in; - -moz-transition:color .5s ease-in; - -o-transition:color .5s ease-in; - transition:color .5s ease-in; -} -.slideshow-container .pagination ul li:hover { - background-color:#999; -} -.slideshow-container .pagination ul li.active { - background-color:#33b5e5; -} -.slideshow-container .pagination ul li.active:hover { - background-color:#33b5e5; -} -.slideshow-container ul li { - display:inline; - list-style:none; -} - - - - -a.download-sdk { - float:right; - margin:-10px 0; - height:30px; - padding-top:4px; - padding-bottom:0px; -} - -#nav-x { - padding-top: 14px; -} - -#nav-x .wrap { - min-height:34px; -} - -#nav-x .wrap, -#searchResults.wrap { - max-width:940px; - border-bottom:1px solid #CCC; -} - -#searchResults.wrap #leftSearchControl { - min-height:700px -} -.nav-x { - margin-left:0; - margin-bottom:0; -} - - - - - - - - - - -/* - * CSS Styles that are needed by jScrollPane for it to operate correctly. - */ - -.jspContainer { - overflow: hidden; - position: relative; -} - -.jspPane { - position: absolute; - overflow: hidden; - width:auto !important; /* to avoid cut-off api names in reference in horiz scroll */ -} - -.jspVerticalBar { - position: absolute; - top: 0; - right: 0; - width: 4px; - height: 100%; - background: #f5f5f5; -} - -.jspHorizontalBar { - position: absolute; - bottom: 0; - left: 0; - width: 100%; - height: 4px; - background: #f5f5f5; -} - -.jspVerticalBar *, -.jspHorizontalBar * { - margin: 0; - padding: 0; -} -.jspCap { - display: block; -} - -.jspVerticalBar .jspCap { - height: 4px; -} - -.jspHorizontalBar .jspCap { - width: 0; - height: 100%; -} - -.jspHorizontalBar .jspCap { - float: left; -} - -.jspTrack { - position: relative; -} - -.jspDrag { - background: #bbb; - position: relative; - top: 0; - left: 0; - cursor: pointer; -} - -.jspDrag:hover, -.jspDrag:active { - border-color: #09c; - background-color: #4cadcb; - background-image: -webkit-gradient(linear, left top, right top, from(#5dbcd9), to(#4cadcb)); - background-image: -webkit-linear-gradient(left, #5dbcd9, #4cadcb); - background-image: -moz-linear-gradient(left, #5dbcd9, #4cadcb); - background-image: -ms-linear-gradient(left, #5dbcd9, #4cadcb); - background-image: -o-linear-gradient(left, #5dbcd9, #4cadcb); - background-image: linear-gradient(left, #5dbcd9, #4cadcb); - filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#5dbcd9', EndColorStr='#4cadcb'); -} - -.jspHorizontalBar .jspTrack, -.jspHorizontalBar .jspDrag { - float: left; - height: 100%; -} - -.jspArrow { - background: #999; - text-indent: -20000px; - display: block; - cursor: pointer; -} - -.jspArrow.jspDisabled { - cursor: default; - background: #ccc; -} - -.jspVerticalBar .jspArrow { - height: 16px; -} - -.jspHorizontalBar .jspArrow { - width: 16px; - float: left; - height: 100%; -} - -.jspVerticalBar .jspArrow:focus { - outline: none; -} - -.jspCorner { - float: left; - height: 100%; -} - -/* Yuk! CSS Hack for IE6 3 pixel bug :( */ -* html .jspCorner { - margin: 0 -3px 0 0; -} -/******* end of jscrollpane *********/ - - - - - -/************ DEVELOP HOMEPAGE ******************/ - -/* Slideshow */ -.slideshow-develop { - height: 300px; - width: 940px; - position: relative; - overflow:hidden; -} -.slideshow-develop .frame { - width: 940px; - height: 300px; -} -.slideshow-develop img.play { - max-width:350px; - max-height:240px; - margin:20px 0 0 90px; - -webkit-transform: perspective(800px ) rotateY( 35deg ); - box-shadow: -16px 20px 40px rgba(0, 0, 0, 0.3); - -moz-box-shadow: -16px 20px 40px rgba(0, 0, 0, 0.3); - -webkit-box-shadow: -16px 20px 40px rgba(0, 0, 0, 0.3); -} -.slideshow-develop img.play.no-shadow { - box-shadow: none; - -moz-box-shadow: none; - -webkit-box-shadow: none; -} -.slideshow-develop img.play.no-transform { - -webkit-transform: none; -} -.slideshow-develop a.slideshow-next { - background: url(../images/arrow-right-develop.png); -} -.slideshow-develop a.slideshow-prev { - background: url(../images/arrow-left-develop.png); -} -.slideshow-develop .content-right { - float: left; -} -.slideshow-develop .content-right h2 { - padding:0; - margin-bottom:10px; - border:none; -} -.slideshow-develop .item { - height: 300px; - width: 940px; -} -.slideshow-develop .pagination ul li.active { - background-color: #F80; -} -.slideshow-develop .pagination ul li.active:hover { - background-color: #F80; -} -.slideshow-develop .item hr { - margin:5px 0 10px; -} -.slideshow-develop .item p { - margin:10px 0; -} -.slideshow-develop .item p.title-intro { - position:absolute; - margin:0; -} - -/* Feeds */ -.feed ul { - margin: 0; -} -.feed .feed-nav { - height: 25px; - border-bottom: 1px solid #CCC; -} -.feed .feed-nav li { - list-style: none; - float: left; - height: 21px; /* +4px bottom border = 25px; same as .feed-nav */ - margin-right: 25px; - cursor: pointer; -} -.feed .feed-nav li.active { - color: #000; - border-bottom: 4px solid #F80; -} -.feed .feed-container { - overflow: hidden; - width: 460px; -} -.feed .feed-container .feed-frame { - width: 1000px; -} -.feed .feed-container .feed-frame ul { - float: left; - width:460px; -} -.feed .feed-container .feed-frame ul ul { - float: none; - margin:10px 0 0 30px; -} -.feed .feed-container .feed-frame li { - list-style: none; - margin: 20px 0 20px 0; - width: 460px; - height:93px; -} -.feed .feed-container .feed-frame li.playlist { - height:auto; -} -.feed .feed-container .feed-frame li.playlist a { - height:93px; - display:block; -} -.feed .feed-container .feed-frame li.more { - height:20px; - margin:10px 0 5px 5px; -} -.feed .feed-container .feed-frame li.more a { - height:inherit; -} -.feed .feed-container .feed-frame li.playlist-video { - list-style: none; - margin: 0; - width: 460px; - height:55px; - font-size:12px; -} -.feed .feed-container .feed-frame li.playlist-video a { - height:45px; - padding:5px; -} -.feed .feed-container .feed-frame li.playlist-video h5 { - font-size:12px; - line-height:13px; - margin:0; -} -.feed .feed-container .feed-frame li.playlist-video p { - margin:5px 0 0; - line-height:15px; -} -.feed-container .feed-frame div.feed-image { - float: left; - border: 1px solid #999; - margin:0 20px 0 0; - width:122px; - height:92px; - background:url('../images/blog-default.png') no-repeat 0 0; - background-size:180px; -} -#jd-content .feed .feed-container .feed-frame li img { - float: left; - border: 1px solid #999; - margin:0 20px 0 0; - width:122px; - height:92px; -} -#jd-content .feed .feed-container .feed-frame li.playlist-video img { - width:inherit; - height:inherit; -} - -.feed .feed-container .feed-frame li a, -.feed .feed-container .feed-frame li a:active { - color:#555 !important; -} - -.feed .feed-container .feed-frame li a:hover, -.feed .feed-container .feed-frame li a:hover * { - color:#7AA1B0 !important; -} - -/* Video player */ -#player-wrapper { - display:none; - margin: -1px auto 0; - position: relative; - width: 940px; - height: 0px; -} -#player-frame { - background: #EFEFEF; - border: 1px solid #CCC; - padding: 0px 207px; - z-index: 10; /* stay above marque, but below search suggestions */ - width: 525px; - height: 330px; - position: relative; -} - - - -/************ DISTRIBUTE HOMEPAGE ***************/ - -.marquee { - width: 760px; -} -.marquee .main-img { - float: left; - margin-top: 20px; - width: 490px; -} -.marquee .copy { - width: 270px; - float: left; - margin-top: 30px; -} -.distribute-features { - margin: 0; -} -.distribute-features ul { - margin: 0; -} -.distribute-features ul li { - list-style: none; - float: left; - border-top: 1px solid #9C0; - width: 220px; - margin-right: 50px; -} -.distribute-features ul li.last { - margin-right: 0px; -} - - - -/************ DEVELOP TOPIC CONTAINERS ************/ - -.landing-banner, -.landing-docs { - margin:20px 0 0; -} -.landing-banner div:first-child, -.landing-docs div:first-child, -.landing-docs .col-12 { - margin-left:0; - min-height:280px; -} -.landing-banner div:last-child, -.landing-docs div:last-child, -.landing-docs .col-12 { - margin-right:0; -} - -.landing-banner h1 { - margin-top:0; -} -.landing-docs { - clear:left; - overflow:hidden; -} -.landing-docs h3 { - font-size:14px; - line-height:21px; - color:#555; - text-transform:uppercase; - border-bottom:1px solid #CCC; - margin:0 0 20px; -} -.landing-docs a { - color:#333 !important; -} - -.landing-docs a:hover, -.landing-docs a:hover * { - color:#7AA1B0 !important -} - -.landing-docs .normal-links a { - color:#258aaf !important; -} - -.plusone { - float:right; -} - - - -/************* HOME/LANDING PAGE *****************/ - -.slideshow-home { - height: 500px; - width: 940px; - border-bottom: 1px solid #CCC; - position: relative; - margin: 0; -} -.slideshow-home .frame { - width: 940px; - height: 500px; -} -.slideshow-home .content-left { - float: left; - text-align: center; - vertical-align: center; - margin: 0 0 0 35px; -} -.slideshow-home .content-right { - margin: 80px 0 0 0; -} -.slideshow-home .content-right p { - margin-bottom: 10px; -} -.slideshow-home .content-right p:last-child { - margin-top: 15px; -} -.slideshow-home .content-right h1 { - padding:0; -} -.slideshow-home .item { - height: 500px; - width: 940px; -} -.home-sections { - padding: 30px 20px 20px; - margin: 20px 0; - background: -webkit-linear-gradient(top, #F6F6F6,#F9F9F9); -} -.home-sections ul { - margin: 0; -} -.home-sections ul li { - float: left; - display: block; - list-style: none; - width: 170px; - height: 35px; - border: 1px solid #ccc; - background: white; - margin-right: 10px; - border-radius: 1px; - -webkit-border-radius: 1px; - -moz-border-radius: 1px; - box-shadow: 1px 1px 5px #EEE; - -webkit-box-shadow: 1px 1px 5px #EEE; - -moz-box-shadow: 1px 1px 5px #EEE; - background: white; -} -.home-sections ul li:hover { - background: #F9F9F9; - border: 1px solid #CCC; -} -.home-sections ul li a, -.home-sections ul li a:hover { - font-weight: bold; - margin-top: 8px; - line-height: 18px; - float: left; - width: 100%; - text-align: center; - color: #09c !important; -} -.home-sections ul li a { - font-weight: bold; - margin-top: 8px; - line-height: 18px; - float: left; - width:100%; - text-align:center; -} -.home-sections ul li img { - float: left; - margin: -8px 0 0 10px; -} -.home-sections ul li.last { - margin-right: 0px; -} -.fullpage #footer { - margin-top: -40px; -} diff --git a/tools/droiddoc/templates-ds/assets/css/fullscreen.css b/tools/droiddoc/templates-ds/assets/css/fullscreen.css deleted file mode 100644 index 71cf65b12..000000000 --- a/tools/droiddoc/templates-ds/assets/css/fullscreen.css +++ /dev/null @@ -1,200 +0,0 @@ - -/* ============================================================================= - Columns - ========================================================================== */ -/* Applied to body to debug layout alignments -.grid { - width:100%; - height:100%; - background:url(../images/grid.png) center repeat-y; - top:0px; - margin:auto; - position:absolute; -} -*/ - -@media screen, projection, print { -.full { - padding: 2.5em 0; - border-top: solid 1px #ddd; - border-bottom: solid 1px #ddd; - background: #f7f7f7; -} -.wrap { - margin: 0 auto; - width: 100%; - min-width:600px; - clear: both; -} -.cols { - height: 1%; - margin: 0 -1.533742331288343558282%; - width: 103.06748466257669%} -*+html .cols { - margin-bottom: 20px; -} -.cols:after { - clear: both; - content: ' '; - display: block; - height: 0; - visibility: hidden; -} -.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, -.col-13, .col-14, .col-15, .col-16 { - float: left; - margin: 0 1.063829787234% 20px 1.063829787234%; -} -* html .col-1, * html .col-2, * html .col-3, * html .col-4, * html .col-5, * html .col-6, * html -.col-7, * html .col-8, * html .col-9, * html .col-10, * html .col-11, * html .col-12, * html -.col-13, * html .col-14, * html .col-15, * html .col-16 { - margin: 0; - margin: 0 1.063829787234% 20px 1.063829787234%; -} -[dir='rtl'] .col-1, [dir='rtl'] .col-2, [dir='rtl'] .col-3, [dir='rtl'] .col-4, [dir='rtl'] .col-5, -[dir='rtl'] .col-6, [dir='rtl'] .col-7, [dir='rtl'] .col-8, [dir='rtl'] .col-9, [dir='rtl'] .col-10, -[dir='rtl'] .col-11, [dir='rtl'] .col-12 { - float: right; -} -.col-1 { - width: 4.16666666666667%; -} -.col-2 { - width: 10.4166666666667%; -} -.col-3 { - width: 16.6666666666667%; -} -.col-4 { - width: 22.9166666666667%; -} -.col-5 { - width: 29.1666666666667%; -} -.col-6 { - width: 35.4166666666667%; -} -.col-7 { - width: 41.6666666666667%; -} -.col-8 { - width: 47.9166666666667%; -} -.col-9 { - width: 55.3333333333333%; -} -.col-10 { - width: 60.4166666666667%; -} -.col-11 { - width: 66.6666666666667%; -} -.col-12 { - width: 72.9166666666667%; -} -.col-13 { - width: 79.1666666666667%; -} -.col-14 { - width: 85.4166666666667%; -} -.col-15 { - width: 91.6666666666667%; -} -.col-16 { - width: 97.9166666666667%; -} - - - - - - - -#header .col-1, -#nav-x .col-1 { width: 40px } -#header .col-2, -#nav-x .col-2 { width: 100px } -#header .col-3, -#nav-x .col-3 { width: 160px } -#header .col-4, -#nav-x .col-4 { width: 220px } -#header .col-5, -#nav-x .col-5 { width: 280px } -#header .col-6, -#nav-x .col-6 { width: 340px } -#header .col-7, -#nav-x .col-7 { width: 400px } -#header .col-8, -#nav-x .col-8 { width: 460px } -#header .col-9, -#nav-x .col-9 { width: 520px } -#header .col-10, -#nav-x .col-10 { width: 580px } -#header .col-11, -#nav-x .col-11 { width: 640px } -#header .col-12, -#nav-x .col-12 { width: 700px } -#header .col-13, -#nav-x .col-13 { width: 760px } -#header .col-14, -#nav-x .col-14 { width: 820px } -#header .col-15, -#nav-x .col-15 { width: 880px } -#header .col-16, -#nav-x .col-16 { width: 940px } - - - -body { - padding:0 20px; -} -#header, -#searchResults, -#nav-x { - margin:0; -} -#body-content { - margin:0; -} -#body-content > .col-12 { - width:77.9804965%; - margin:0 0 0 0.97%; /* this percentage chosen to make IE9 happy */ -} -#side-nav { - width: 19.9804965%; - margin:0 1.063829787234% 0 0; -} - -#header .wrap { - max-width: 100%; -} - -#nav-x .wrap, -#searchResults.wrap { - max-width:100%; -} - -.nav-x { - margin:-2px 0 0 0; -} - -#devdoc-nav.fixed, -#devdoc-nav.fixed a.totop { - left:20px; /* !important ... for IE i think */ -} - - - - -} - -.col-right { - margin-right:0px; -} - -@media screen and (max-width:772px) { -.col-5, .col-6, .col-7 { - clear: both; - width: 97.0238096%} -} \ No newline at end of file diff --git a/tools/droiddoc/templates-ds/assets/images/android-developers-logo.png b/tools/droiddoc/templates-ds/assets/images/android-developers-logo.png deleted file mode 100644 index 30a8f627c..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/android-developers-logo.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/android_wrench.png b/tools/droiddoc/templates-ds/assets/images/android_wrench.png deleted file mode 100644 index 6390a2d80..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/android_wrench.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/arrow-left-develop.png b/tools/droiddoc/templates-ds/assets/images/arrow-left-develop.png deleted file mode 100644 index 5fdfaa376..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/arrow-left-develop.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/arrow-left.png b/tools/droiddoc/templates-ds/assets/images/arrow-left.png deleted file mode 100644 index 43afec87f..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/arrow-left.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/arrow-right-develop.png b/tools/droiddoc/templates-ds/assets/images/arrow-right-develop.png deleted file mode 100644 index c86f1f35b..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/arrow-right-develop.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/arrow-right.png b/tools/droiddoc/templates-ds/assets/images/arrow-right.png deleted file mode 100644 index 6f7d6db65..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/arrow-right.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/arrow_bluelink_down.png b/tools/droiddoc/templates-ds/assets/images/arrow_bluelink_down.png deleted file mode 100755 index 58c248a28..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/arrow_bluelink_down.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/arrow_bluelink_up.png b/tools/droiddoc/templates-ds/assets/images/arrow_bluelink_up.png deleted file mode 100755 index 7d0f38e7e..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/arrow_bluelink_up.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/arrow_left_off.jpg b/tools/droiddoc/templates-ds/assets/images/arrow_left_off.jpg deleted file mode 100755 index fd32a64f1..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/arrow_left_off.jpg and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/arrow_left_on.jpg b/tools/droiddoc/templates-ds/assets/images/arrow_left_on.jpg deleted file mode 100755 index 143184b8c..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/arrow_left_on.jpg and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/arrow_right_off.jpg b/tools/droiddoc/templates-ds/assets/images/arrow_right_off.jpg deleted file mode 100755 index 17d2efee2..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/arrow_right_off.jpg and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/arrow_right_on.jpg b/tools/droiddoc/templates-ds/assets/images/arrow_right_on.jpg deleted file mode 100755 index baa2af12c..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/arrow_right_on.jpg and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/arrows-up-down.png b/tools/droiddoc/templates-ds/assets/images/arrows-up-down.png deleted file mode 100644 index a2a91ed0e..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/arrows-up-down.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/bg_community_leftDiv.jpg b/tools/droiddoc/templates-ds/assets/images/bg_community_leftDiv.jpg deleted file mode 100755 index a6d6f0e9a..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/bg_community_leftDiv.jpg and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/bg_fade.jpg b/tools/droiddoc/templates-ds/assets/images/bg_fade.jpg deleted file mode 100755 index c6c70b6f1..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/bg_fade.jpg and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/bg_gradient.jpg b/tools/droiddoc/templates-ds/assets/images/bg_gradient.jpg deleted file mode 100644 index 884f8f560..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/bg_gradient.jpg and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/bg_images_sprite.png b/tools/droiddoc/templates-ds/assets/images/bg_images_sprite.png deleted file mode 100755 index 84437e799..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/bg_images_sprite.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/bg_logo.png b/tools/droiddoc/templates-ds/assets/images/bg_logo.png deleted file mode 100755 index 7cf0cb9cb..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/bg_logo.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/blog-default.png b/tools/droiddoc/templates-ds/assets/images/blog-default.png deleted file mode 100644 index f8ab6c3f3..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/blog-default.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/body-gradient-tab.png b/tools/droiddoc/templates-ds/assets/images/body-gradient-tab.png deleted file mode 100644 index 5223ac3a2..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/body-gradient-tab.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/body-gradient.png b/tools/droiddoc/templates-ds/assets/images/body-gradient.png deleted file mode 100755 index 9d5985552..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/body-gradient.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/close.png b/tools/droiddoc/templates-ds/assets/images/close.png deleted file mode 100644 index 6ae33912d..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/close.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/dac_logo.png b/tools/droiddoc/templates-ds/assets/images/dac_logo.png deleted file mode 100644 index 0f110440c..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/dac_logo.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/developers-logo.png b/tools/droiddoc/templates-ds/assets/images/developers-logo.png deleted file mode 100755 index 08122ee12..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/developers-logo.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/fullscreen.png b/tools/droiddoc/templates-ds/assets/images/fullscreen.png deleted file mode 100644 index 01f971cd3..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/fullscreen.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/grad-rule-qv.png b/tools/droiddoc/templates-ds/assets/images/grad-rule-qv.png deleted file mode 100644 index bae2d18c2..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/grad-rule-qv.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/home/Android_Dev_Lab_l.png b/tools/droiddoc/templates-ds/assets/images/home/Android_Dev_Lab_l.png deleted file mode 100644 index 3c04f2442..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/home/Android_Dev_Lab_l.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/home/GDC2011.png b/tools/droiddoc/templates-ds/assets/images/home/GDC2011.png deleted file mode 100644 index 82ce918b3..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/home/GDC2011.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/home/GTV_icon_large.png b/tools/droiddoc/templates-ds/assets/images/home/GTV_icon_large.png deleted file mode 100644 index 72d54ad7f..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/home/GTV_icon_large.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/home/GTV_icon_small.png b/tools/droiddoc/templates-ds/assets/images/home/GTV_icon_small.png deleted file mode 100644 index 3da169977..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/home/GTV_icon_small.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/home/IO-logo-2011.png b/tools/droiddoc/templates-ds/assets/images/home/IO-logo-2011.png deleted file mode 100644 index 4a28447c8..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/home/IO-logo-2011.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/home/IO-logo.png b/tools/droiddoc/templates-ds/assets/images/home/IO-logo.png deleted file mode 100644 index 65334c81a..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/home/IO-logo.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/home/adc2_l.png b/tools/droiddoc/templates-ds/assets/images/home/adc2_l.png deleted file mode 100644 index 0b101a4af..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/home/adc2_l.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/home/adc2_s.png b/tools/droiddoc/templates-ds/assets/images/home/adc2_s.png deleted file mode 100644 index 0d36bdb03..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/home/adc2_s.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/home/android_adc.png b/tools/droiddoc/templates-ds/assets/images/home/android_adc.png deleted file mode 100644 index 9fe7f8f68..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/home/android_adc.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/home/bg_home_announcement.png b/tools/droiddoc/templates-ds/assets/images/home/bg_home_announcement.png deleted file mode 100755 index 91485ffab..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/home/bg_home_announcement.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/home/bg_home_bottom.jpg b/tools/droiddoc/templates-ds/assets/images/home/bg_home_bottom.jpg deleted file mode 100755 index dacd40181..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/home/bg_home_bottom.jpg and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/home/bg_home_carousel.png b/tools/droiddoc/templates-ds/assets/images/home/bg_home_carousel.png deleted file mode 100755 index 5ce5e30cb..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/home/bg_home_carousel.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/home/bg_home_carousel_board.png b/tools/droiddoc/templates-ds/assets/images/home/bg_home_carousel_board.png deleted file mode 100755 index c577e02f2..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/home/bg_home_carousel_board.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/home/bg_home_carousel_wheel.png b/tools/droiddoc/templates-ds/assets/images/home/bg_home_carousel_wheel.png deleted file mode 100755 index aa224adc0..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/home/bg_home_carousel_wheel.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/home/carousel_buttons_sprite.png b/tools/droiddoc/templates-ds/assets/images/home/carousel_buttons_sprite.png deleted file mode 100755 index e98c94280..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/home/carousel_buttons_sprite.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/home/devphone-large.png b/tools/droiddoc/templates-ds/assets/images/home/devphone-large.png deleted file mode 100644 index 0db0f6cf5..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/home/devphone-large.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/home/devphone-small.png b/tools/droiddoc/templates-ds/assets/images/home/devphone-small.png deleted file mode 100644 index e10bfa92d..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/home/devphone-small.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/home/donut-android.png b/tools/droiddoc/templates-ds/assets/images/home/donut-android.png deleted file mode 100755 index 6aba06b43..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/home/donut-android.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/home/eclair-android.png b/tools/droiddoc/templates-ds/assets/images/home/eclair-android.png deleted file mode 100644 index d476ce965..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/home/eclair-android.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/home/froyo-android.png b/tools/droiddoc/templates-ds/assets/images/home/froyo-android.png deleted file mode 100644 index c63f7f02c..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/home/froyo-android.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/home/gdc-logo.png b/tools/droiddoc/templates-ds/assets/images/home/gdc-logo.png deleted file mode 100644 index 5fb53fb63..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/home/gdc-logo.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/home/gingerdroid.png b/tools/droiddoc/templates-ds/assets/images/home/gingerdroid.png deleted file mode 100644 index 8399d84d0..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/home/gingerdroid.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/home/google-plus-small.png b/tools/droiddoc/templates-ds/assets/images/home/google-plus-small.png deleted file mode 100644 index 5bb7d7a7d..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/home/google-plus-small.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/home/google-plus.png b/tools/droiddoc/templates-ds/assets/images/home/google-plus.png deleted file mode 100644 index 90871e196..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/home/google-plus.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/home/honeycomb-android.png b/tools/droiddoc/templates-ds/assets/images/home/honeycomb-android.png deleted file mode 100644 index 6cc50311d..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/home/honeycomb-android.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/home/icon-about.png b/tools/droiddoc/templates-ds/assets/images/home/icon-about.png deleted file mode 100644 index 8339762f5..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/home/icon-about.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/home/icon-design.png b/tools/droiddoc/templates-ds/assets/images/home/icon-design.png deleted file mode 100644 index 0d31cdf83..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/home/icon-design.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/home/icon-develop.png b/tools/droiddoc/templates-ds/assets/images/home/icon-develop.png deleted file mode 100644 index e02b20f4f..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/home/icon-develop.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/home/icon-distribute.png b/tools/droiddoc/templates-ds/assets/images/home/icon-distribute.png deleted file mode 100644 index 4824072aa..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/home/icon-distribute.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/home/ics-android.png b/tools/droiddoc/templates-ds/assets/images/home/ics-android.png deleted file mode 100644 index be62ca858..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/home/ics-android.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/home/io-large.png b/tools/droiddoc/templates-ds/assets/images/home/io-large.png deleted file mode 100755 index 986053c65..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/home/io-large.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/home/io-small.png b/tools/droiddoc/templates-ds/assets/images/home/io-small.png deleted file mode 100755 index 3a2254982..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/home/io-small.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/home/maps-large.png b/tools/droiddoc/templates-ds/assets/images/home/maps-large.png deleted file mode 100644 index b26f65a59..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/home/maps-large.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/home/maps-small.png b/tools/droiddoc/templates-ds/assets/images/home/maps-small.png deleted file mode 100644 index cc5f1fa02..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/home/maps-small.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/home/market-large.png b/tools/droiddoc/templates-ds/assets/images/home/market-large.png deleted file mode 100644 index 069fee712..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/home/market-large.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/home/market-small.png b/tools/droiddoc/templates-ds/assets/images/home/market-small.png deleted file mode 100644 index fa1201c43..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/home/market-small.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/home/sdk-large.png b/tools/droiddoc/templates-ds/assets/images/home/sdk-large.png deleted file mode 100644 index 315a1bfc8..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/home/sdk-large.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/home/sdk-small.png b/tools/droiddoc/templates-ds/assets/images/home/sdk-small.png deleted file mode 100644 index 0f1670d7f..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/home/sdk-small.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/hr_gray_main.jpg b/tools/droiddoc/templates-ds/assets/images/hr_gray_main.jpg deleted file mode 100755 index f7a0a2f92..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/hr_gray_main.jpg and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/hr_gray_side.jpg b/tools/droiddoc/templates-ds/assets/images/hr_gray_side.jpg deleted file mode 100755 index 666747669..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/hr_gray_side.jpg and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/icon_contribute.jpg b/tools/droiddoc/templates-ds/assets/images/icon_contribute.jpg deleted file mode 100755 index 1aa12b6a1..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/icon_contribute.jpg and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/icon_design.png b/tools/droiddoc/templates-ds/assets/images/icon_design.png deleted file mode 100644 index c12907c8f..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/icon_design.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/icon_download.jpg b/tools/droiddoc/templates-ds/assets/images/icon_download.jpg deleted file mode 100755 index f8c11658b..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/icon_download.jpg and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/icon_download2.jpg b/tools/droiddoc/templates-ds/assets/images/icon_download2.jpg deleted file mode 100755 index c0af7a28f..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/icon_download2.jpg and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/icon_guidelines_logo.png b/tools/droiddoc/templates-ds/assets/images/icon_guidelines_logo.png deleted file mode 100644 index 9362c8f52..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/icon_guidelines_logo.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/icon_market.jpg b/tools/droiddoc/templates-ds/assets/images/icon_market.jpg deleted file mode 100644 index 0fbb19728..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/icon_market.jpg and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/icon_play.png b/tools/droiddoc/templates-ds/assets/images/icon_play.png deleted file mode 100644 index 8bfdc7b64..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/icon_play.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/icon_robot.jpg b/tools/droiddoc/templates-ds/assets/images/icon_robot.jpg deleted file mode 100755 index ca0fd3933..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/icon_robot.jpg and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/icon_world.jpg b/tools/droiddoc/templates-ds/assets/images/icon_world.jpg deleted file mode 100755 index 65b8fa615..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/icon_world.jpg and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/left_off.jpg b/tools/droiddoc/templates-ds/assets/images/left_off.jpg deleted file mode 100755 index fd32a64f1..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/left_off.jpg and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/left_on.jpg b/tools/droiddoc/templates-ds/assets/images/left_on.jpg deleted file mode 100755 index 143184b8c..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/left_on.jpg and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/locale.png b/tools/droiddoc/templates-ds/assets/images/locale.png deleted file mode 100644 index de3aae7ee..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/locale.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/logo_breadcrumbz.jpg b/tools/droiddoc/templates-ds/assets/images/logo_breadcrumbz.jpg deleted file mode 100755 index e743f860f..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/logo_breadcrumbz.jpg and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/more_check.png b/tools/droiddoc/templates-ds/assets/images/more_check.png deleted file mode 100644 index f2fcbfca2..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/more_check.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/open_source.png b/tools/droiddoc/templates-ds/assets/images/open_source.png deleted file mode 100755 index 12bb1fbe8..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/open_source.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/preliminary.png b/tools/droiddoc/templates-ds/assets/images/preliminary.png deleted file mode 100644 index fe0da3d20..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/preliminary.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/quicknav_btn_bg.png b/tools/droiddoc/templates-ds/assets/images/quicknav_btn_bg.png deleted file mode 100644 index b80c9a804..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/quicknav_btn_bg.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/resizable-e.gif b/tools/droiddoc/templates-ds/assets/images/resizable-e.gif deleted file mode 100755 index f748097f4..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/resizable-e.gif and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/resizable-e2.gif b/tools/droiddoc/templates-ds/assets/images/resizable-e2.gif deleted file mode 100755 index e45d0c5be..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/resizable-e2.gif and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/resizable-eg.gif b/tools/droiddoc/templates-ds/assets/images/resizable-eg.gif deleted file mode 100755 index 619661626..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/resizable-eg.gif and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/resizable-s.gif b/tools/droiddoc/templates-ds/assets/images/resizable-s.gif deleted file mode 100755 index 7f6a4eb0e..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/resizable-s.gif and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/resizable-s2.gif b/tools/droiddoc/templates-ds/assets/images/resizable-s2.gif deleted file mode 100755 index 99e869c8a..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/resizable-s2.gif and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/resizable-s2.png b/tools/droiddoc/templates-ds/assets/images/resizable-s2.png deleted file mode 100644 index f3a6d2dc0..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/resizable-s2.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/resizable-sg.gif b/tools/droiddoc/templates-ds/assets/images/resizable-sg.gif deleted file mode 100755 index b4bea1014..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/resizable-sg.gif and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/resource-article.png b/tools/droiddoc/templates-ds/assets/images/resource-article.png deleted file mode 100644 index 416493f8c..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/resource-article.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/resource-big-article.png b/tools/droiddoc/templates-ds/assets/images/resource-big-article.png deleted file mode 100644 index 72732754b..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/resource-big-article.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/resource-big-sample.png b/tools/droiddoc/templates-ds/assets/images/resource-big-sample.png deleted file mode 100644 index 59b6b68bc..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/resource-big-sample.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/resource-big-tutorial.png b/tools/droiddoc/templates-ds/assets/images/resource-big-tutorial.png deleted file mode 100644 index c32e89a58..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/resource-big-tutorial.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/resource-big-video.png b/tools/droiddoc/templates-ds/assets/images/resource-big-video.png deleted file mode 100644 index 59d46a0a1..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/resource-big-video.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/resource-sample.png b/tools/droiddoc/templates-ds/assets/images/resource-sample.png deleted file mode 100644 index f7a411caf..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/resource-sample.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/resource-tutorial.png b/tools/droiddoc/templates-ds/assets/images/resource-tutorial.png deleted file mode 100644 index 10a14fec1..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/resource-tutorial.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/resource-video.png b/tools/droiddoc/templates-ds/assets/images/resource-video.png deleted file mode 100644 index 8fd5cae4c..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/resource-video.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/right_off.jpg b/tools/droiddoc/templates-ds/assets/images/right_off.jpg deleted file mode 100755 index 17d2efee2..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/right_off.jpg and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/right_on.jpg b/tools/droiddoc/templates-ds/assets/images/right_on.jpg deleted file mode 100755 index baa2af12c..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/right_on.jpg and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/sidenav-rule.png b/tools/droiddoc/templates-ds/assets/images/sidenav-rule.png deleted file mode 100644 index eab992063..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/sidenav-rule.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/slide_1.jpg b/tools/droiddoc/templates-ds/assets/images/slide_1.jpg deleted file mode 100755 index 6d75be1df..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/slide_1.jpg and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/slide_2.jpg b/tools/droiddoc/templates-ds/assets/images/slide_2.jpg deleted file mode 100755 index aa994c2ef..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/slide_2.jpg and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/slide_3.jpg b/tools/droiddoc/templates-ds/assets/images/slide_3.jpg deleted file mode 100755 index b04deb360..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/slide_3.jpg and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/slide_large_1.jpg b/tools/droiddoc/templates-ds/assets/images/slide_large_1.jpg deleted file mode 100755 index a992e923d..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/slide_large_1.jpg and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/slide_large_2.jpg b/tools/droiddoc/templates-ds/assets/images/slide_large_2.jpg deleted file mode 100755 index 9af63f40c..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/slide_large_2.jpg and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/slide_large_3.jpg b/tools/droiddoc/templates-ds/assets/images/slide_large_3.jpg deleted file mode 100755 index fcf236cab..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/slide_large_3.jpg and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/slide_off.jpg b/tools/droiddoc/templates-ds/assets/images/slide_off.jpg deleted file mode 100755 index 597122748..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/slide_off.jpg and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/slide_on.jpg b/tools/droiddoc/templates-ds/assets/images/slide_on.jpg deleted file mode 100755 index 7ca35773b..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/slide_on.jpg and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/spacer.gif b/tools/droiddoc/templates-ds/assets/images/spacer.gif deleted file mode 100755 index f96b355f4..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/spacer.gif and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/styles/callout.png b/tools/droiddoc/templates-ds/assets/images/styles/callout.png deleted file mode 100644 index 5d49f34b9..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/styles/callout.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/styles/device_galaxynexus_blank_land_span13.png b/tools/droiddoc/templates-ds/assets/images/styles/device_galaxynexus_blank_land_span13.png deleted file mode 100644 index bab6aca5a..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/styles/device_galaxynexus_blank_land_span13.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/styles/device_galaxynexus_blank_land_span8.png b/tools/droiddoc/templates-ds/assets/images/styles/device_galaxynexus_blank_land_span8.png deleted file mode 100644 index cb180bf91..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/styles/device_galaxynexus_blank_land_span8.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/styles/device_galaxynexus_blank_port_span5.png b/tools/droiddoc/templates-ds/assets/images/styles/device_galaxynexus_blank_port_span5.png deleted file mode 100644 index bdccc2f23..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/styles/device_galaxynexus_blank_port_span5.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/styles/device_galaxynexus_blank_port_span9.png b/tools/droiddoc/templates-ds/assets/images/styles/device_galaxynexus_blank_port_span9.png deleted file mode 100644 index 5e0135b22..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/styles/device_galaxynexus_blank_port_span9.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/styles/disclosure_down.png b/tools/droiddoc/templates-ds/assets/images/styles/disclosure_down.png deleted file mode 100644 index 6a0a8eea9..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/styles/disclosure_down.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/styles/disclosure_left.png b/tools/droiddoc/templates-ds/assets/images/styles/disclosure_left.png deleted file mode 100644 index e887b2a6e..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/styles/disclosure_left.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/styles/disclosure_right.png b/tools/droiddoc/templates-ds/assets/images/styles/disclosure_right.png deleted file mode 100644 index ced7fa48d..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/styles/disclosure_right.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/styles/disclosure_up.png b/tools/droiddoc/templates-ds/assets/images/styles/disclosure_up.png deleted file mode 100644 index ddd4ec932..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/styles/disclosure_up.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/styles/gototop.png b/tools/droiddoc/templates-ds/assets/images/styles/gototop.png deleted file mode 100644 index 5f09a29fb..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/styles/gototop.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/styles/ico_action.png b/tools/droiddoc/templates-ds/assets/images/styles/ico_action.png deleted file mode 100644 index 30e4cc7ec..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/styles/ico_action.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/styles/ico_good.png b/tools/droiddoc/templates-ds/assets/images/styles/ico_good.png deleted file mode 100644 index afebe1c2f..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/styles/ico_good.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/styles/ico_movie_inline.png b/tools/droiddoc/templates-ds/assets/images/styles/ico_movie_inline.png deleted file mode 100644 index 7cfb5c514..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/styles/ico_movie_inline.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/styles/ico_phone_tablet.png b/tools/droiddoc/templates-ds/assets/images/styles/ico_phone_tablet.png deleted file mode 100644 index 003b8764e..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/styles/ico_phone_tablet.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/styles/ico_use.png b/tools/droiddoc/templates-ds/assets/images/styles/ico_use.png deleted file mode 100644 index 9d868b3a1..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/styles/ico_use.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/styles/ico_web.png b/tools/droiddoc/templates-ds/assets/images/styles/ico_web.png deleted file mode 100644 index 0848e3c10..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/styles/ico_web.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/styles/ico_wrong.png b/tools/droiddoc/templates-ds/assets/images/styles/ico_wrong.png deleted file mode 100644 index b7d04ce87..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/styles/ico_wrong.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/styles/open_new_page.png b/tools/droiddoc/templates-ds/assets/images/styles/open_new_page.png deleted file mode 100644 index 6197e3a86..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/styles/open_new_page.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/triangle-closed-small.png b/tools/droiddoc/templates-ds/assets/images/triangle-closed-small.png deleted file mode 100644 index 002364a6a..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/triangle-closed-small.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/triangle-closed.png b/tools/droiddoc/templates-ds/assets/images/triangle-closed.png deleted file mode 100644 index 40a68d9fc..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/triangle-closed.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/triangle-opened-small.png b/tools/droiddoc/templates-ds/assets/images/triangle-opened-small.png deleted file mode 100644 index e1eb784ff..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/triangle-opened-small.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/triangle-opened.png b/tools/droiddoc/templates-ds/assets/images/triangle-opened.png deleted file mode 100644 index 789f5fafc..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/triangle-opened.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/uiguidelines1.png b/tools/droiddoc/templates-ds/assets/images/uiguidelines1.png deleted file mode 100644 index 5ce1611e2..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/uiguidelines1.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/images/video-droid.png b/tools/droiddoc/templates-ds/assets/images/video-droid.png deleted file mode 100644 index 25163b619..000000000 Binary files a/tools/droiddoc/templates-ds/assets/images/video-droid.png and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/jdiff_logo.gif b/tools/droiddoc/templates-ds/assets/jdiff_logo.gif deleted file mode 100644 index 69700870e..000000000 Binary files a/tools/droiddoc/templates-ds/assets/jdiff_logo.gif and /dev/null differ diff --git a/tools/droiddoc/templates-ds/assets/js/docs.js b/tools/droiddoc/templates-ds/assets/js/docs.js deleted file mode 100644 index 557a242cd..000000000 --- a/tools/droiddoc/templates-ds/assets/js/docs.js +++ /dev/null @@ -1,2433 +0,0 @@ -var classesNav; -var devdocNav; -var sidenav; -var cookie_namespace = 'android_developer'; -var NAV_PREF_TREE = "tree"; -var NAV_PREF_PANELS = "panels"; -var nav_pref; -var isMobile = false; // true if mobile, so we can adjust some layout - -var basePath = getBaseUri(location.pathname); -var SITE_ROOT = toRoot + basePath.substring(1,basePath.indexOf("/",1)); - - -/****** ON LOAD SET UP STUFF *********/ - -var navBarIsFixed = false; -$(document).ready(function() { - if (devsite) { - // move the lang selector into the overflow menu - $("#moremenu .mid div.header:last").after($("#language").detach()); - } - - // init the fullscreen toggle click event - $('#nav-swap .fullscreen').click(function(){ - if ($(this).hasClass('disabled')) { - toggleFullscreen(true); - } else { - toggleFullscreen(false); - } - }); - - // initialize the divs with custom scrollbars - $('.scroll-pane').jScrollPane( {verticalGutter:0} ); - - // add HRs below all H2s (except for a few other h2 variants) - $('h2').not('#qv h2').not('#tb h2').not('.sidebox h2').not('#devdoc-nav h2').not('h2.norule').css({marginBottom:0}).after('


    '); - - // set search's onkeyup handler here so we can show suggestions - // even while search results are visible - $("#search_autocomplete").keyup(function() {return search_changed(event, false, toRoot)}); - - // set up the search close button - $('.search .close').click(function() { - $searchInput = $('#search_autocomplete'); - $searchInput.attr('value', ''); - $(this).addClass("hide"); - $("#search-container").removeClass('active'); - $("#search_autocomplete").blur(); - search_focus_changed($searchInput.get(), false); // see search_autocomplete.js - hideResults(); // see search_autocomplete.js - }); - $('.search').click(function() { - if (!$('#search_autocomplete').is(":focused")) { - $('#search_autocomplete').focus(); - } - }); - - // Set up quicknav - var quicknav_open = false; - $("#btn-quicknav").click(function() { - if (quicknav_open) { - $(this).removeClass('active'); - quicknav_open = false; - collapse(); - } else { - $(this).addClass('active'); - quicknav_open = true; - expand(); - } - }) - - var expand = function() { - $('#header-wrap').addClass('quicknav'); - $('#quicknav').stop().show().animate({opacity:'1'}); - } - - var collapse = function() { - $('#quicknav').stop().animate({opacity:'0'}, 100, function() { - $(this).hide(); - $('#header-wrap').removeClass('quicknav'); - }); - } - - - //Set up search - $("#search_autocomplete").focus(function() { - $("#search-container").addClass('active'); - }) - $("#search-container").mouseover(function() { - $("#search-container").addClass('active'); - $("#search_autocomplete").focus(); - }) - $("#search-container").mouseout(function() { - if ($("#search_autocomplete").is(":focus")) return; - if ($("#search_autocomplete").val() == '') { - setTimeout(function(){ - $("#search-container").removeClass('active'); - $("#search_autocomplete").blur(); - },250); - } - }) - $("#search_autocomplete").blur(function() { - if ($("#search_autocomplete").val() == '') { - $("#search-container").removeClass('active'); - } - }) - - - // prep nav expandos - var pagePath = document.location.pathname; - // account for intl docs by removing the intl/*/ path - if (pagePath.indexOf("/intl/") == 0) { - pagePath = pagePath.substr(pagePath.indexOf("/",6)); // start after intl/ to get last / - } - - if (pagePath.indexOf(SITE_ROOT) == 0) { - if (pagePath == '' || pagePath.charAt(pagePath.length - 1) == '/') { - pagePath += 'index.html'; - } - } - - if (SITE_ROOT.match(/\.\.\//) || SITE_ROOT == '') { - // If running locally, SITE_ROOT will be a relative path, so account for that by - // finding the relative URL to this page. This will allow us to find links on the page - // leading back to this page. - var pathParts = pagePath.split('/'); - var relativePagePathParts = []; - var upDirs = (SITE_ROOT.match(/(\.\.\/)+/) || [''])[0].length / 3; - for (var i = 0; i < upDirs; i++) { - relativePagePathParts.push('..'); - } - for (var i = 0; i < upDirs; i++) { - relativePagePathParts.push(pathParts[pathParts.length - (upDirs - i) - 1]); - } - relativePagePathParts.push(pathParts[pathParts.length - 1]); - pagePath = relativePagePathParts.join('/'); - } else { - // Otherwise the page path is already an absolute URL - } - - // select current page in sidenav and set up prev/next links if they exist - var $selNavLink = $('#nav').find('a[href="' + pagePath + '"]'); - var $selListItem; - if ($selNavLink.length) { - $selListItem = $selNavLink.closest('li'); - - $selListItem.addClass('selected'); - - // Traverse up the tree and expand all parent nav-sections - $selNavLink.parents('li.nav-section').each(function() { - $(this).addClass('expanded'); - $(this).children('ul').show(); - }); - - - // set up prev links - var $prevLink = []; - var $prevListItem = $selListItem.prev('li'); - - var crossBoundaries = ($("body.design").length > 0) || ($("body.guide").length > 0) ? true : -false; // navigate across topic boundaries only in design docs - if ($prevListItem.length) { - if ($prevListItem.hasClass('nav-section')) { - // jump to last topic of previous section - $prevLink = $prevListItem.find('a:last'); - } else if (!$selListItem.hasClass('nav-section')) { - // jump to previous topic in this section - $prevLink = $prevListItem.find('a:eq(0)'); - } - } else { - // jump to this section's index page (if it exists) - var $parentListItem = $selListItem.parents('li'); - $prevLink = $selListItem.parents('li').find('a'); - - // except if cross boundaries aren't allowed, and we're at the top of a section already - // (and there's another parent) - if (!crossBoundaries && $parentListItem.hasClass('nav-section') - && $selListItem.hasClass('nav-section')) { - $prevLink = []; - } - } - - // set up next links - var $nextLink = []; - var startClass = false; - var training = $(".next-class-link").length; // decides whether to provide "next class" link - var isCrossingBoundary = false; - - if ($selListItem.hasClass('nav-section')) { - // we're on an index page, jump to the first topic - $nextLink = $selListItem.find('ul:eq(0)').find('a:eq(0)'); - - // if there aren't any children, go to the next section (required for About pages) - if($nextLink.length == 0) { - $nextLink = $selListItem.next('li').find('a'); - } else if ($('.topic-start-link').length) { - // as long as there's a child link and there is a "topic start link" (we're on a landing) - // then set the landing page "start link" text to be the first doc title - $('.topic-start-link').text($nextLink.text().toUpperCase()); - } - - // If the selected page has a description, then it's a class or article homepage - if ($selListItem.find('a[description]').length) { - // this means we're on a class landing page - startClass = true; - } - } else { - // jump to the next topic in this section (if it exists) - $nextLink = $selListItem.next('li').find('a:eq(0)'); - if (!$nextLink.length) { - isCrossingBoundary = true; - // no more topics in this section, jump to the first topic in the next section - $nextLink = $selListItem.parents('li:eq(0)').next('li.nav-section').find('a:eq(0)'); - if (!$nextLink.length) { // Go up another layer to look for next page (lesson > class > course) - $nextLink = $selListItem.parents('li:eq(1)').next('li.nav-section').find('a:eq(0)'); - } - } - } - - if (startClass) { - $('.start-class-link').attr('href', $nextLink.attr('href')).removeClass("hide"); - - // if there's no training bar (below the start button), - // then we need to add a bottom border to button - if (!$("#tb").length) { - $('.start-class-link').css({'border-bottom':'1px solid #DADADA'}); - } - } else if (isCrossingBoundary && !$('body.design').length) { // Design always crosses boundaries - $('.content-footer.next-class').show(); - $('.next-page-link').attr('href','') - .removeClass("hide").addClass("disabled") - .click(function() { return false; }); - - $('.next-class-link').attr('href',$nextLink.attr('href')) - .removeClass("hide").append($nextLink.html()); - $('.next-class-link').find('.new').empty(); - } else { - $('.next-page-link').attr('href', $nextLink.attr('href')).removeClass("hide"); - } - - if (!startClass && $prevLink.length) { - var prevHref = $prevLink.attr('href'); - if (prevHref == SITE_ROOT + 'index.html') { - // Don't show Previous when it leads to the homepage - } else { - $('.prev-page-link').attr('href', $prevLink.attr('href')).removeClass("hide"); - } - } - - // If this is a training 'article', there should be no prev/next nav - // ... if the grandparent is the "nav" ... and it has no child list items... - if (training && $selListItem.parents('ul').eq(1).is('[id="nav"]') && - !$selListItem.find('li').length) { - $('.next-page-link,.prev-page-link').attr('href','').addClass("disabled") - .click(function() { return false; }); - } - - } - - - - // Set up the course landing pages for Training with class names and descriptions - if ($('body.trainingcourse').length) { - var $classLinks = $selListItem.find('ul li a').not('#nav .nav-section .nav-section ul a'); - var $classDescriptions = $classLinks.attr('description'); - - var $olClasses = $('
      '); - var $liClass; - var $imgIcon; - var $h2Title; - var $pSummary; - var $olLessons; - var $liLesson; - $classLinks.each(function(index) { - $liClass = $('
    1. '); - $h2Title = $('

      ' + $(this).html()+'

      '); - $pSummary = $('

      ' + $(this).attr('description') + '

      '); - - $olLessons = $('
        '); - - $lessons = $(this).closest('li').find('ul li a'); - - if ($lessons.length) { - $imgIcon = $(''); - $lessons.each(function(index) { - $olLessons.append('
      1. ' + $(this).html()+'
      2. '); - }); - } else { - $imgIcon = $(''); - $pSummary.addClass('article'); - } - - $liClass.append($h2Title).append($imgIcon).append($pSummary).append($olLessons); - $olClasses.append($liClass); - }); - $('.jd-descr').append($olClasses); - } - - - - - // Set up expand/collapse behavior - $('#nav li.nav-section .nav-section-header').click(function() { - var section = $(this).closest('li.nav-section'); - if (section.hasClass('expanded')) { - /* hide me */ - // if (section.hasClass('selected') || section.find('li').hasClass('selected')) { - // /* but not if myself or my descendents are selected */ - // return; - // } - section.children('ul').slideUp(250, function() { - section.closest('li').removeClass('expanded'); - resizeNav(); - }); - } else { - /* show me */ - // first hide all other siblings - var $others = $('li.nav-section.expanded', $(this).closest('ul')); - $others.removeClass('expanded').children('ul').slideUp(250); - - // now expand me - section.closest('li').addClass('expanded'); - section.children('ul').slideDown(250, function() { - resizeNav(); - }); - } - }); - - $(".scroll-pane").scroll(function(event) { - event.preventDefault(); - return false; - }); - - /* Resize nav height when window height changes */ - $(window).resize(function() { - if ($('#side-nav').length == 0) return; - var stylesheet = $('link[rel="stylesheet"][class="fullscreen"]'); - setNavBarLeftPos(); // do this even if sidenav isn't fixed because it could become fixed - // make sidenav behave when resizing the window and side-scolling is a concern - if (navBarIsFixed) { - if ((stylesheet.attr("disabled") == "disabled") || stylesheet.length == 0) { - updateSideNavPosition(); - } else { - updateSidenavFullscreenWidth(); - } - } - resizeNav(); - }); - - - // Set up fixed navbar - var prevScrollLeft = 0; // used to compare current position to previous position of horiz scroll - $(window).scroll(function(event) { - if ($('#side-nav').length == 0) return; - if (event.target.nodeName == "DIV") { - // Dump scroll event if the target is a DIV, because that means the event is coming - // from a scrollable div and so there's no need to make adjustments to our layout - return; - } - var scrollTop = $(window).scrollTop(); - var headerHeight = $('#header').outerHeight(); - var subheaderHeight = $('#nav-x').outerHeight(); - var searchResultHeight = $('#searchResults').is(":visible") ? - $('#searchResults').outerHeight() : 0; - var totalHeaderHeight = headerHeight + subheaderHeight + searchResultHeight; - // we set the navbar fixed when the scroll position is beyond the height of the site header... - var navBarShouldBeFixed = scrollTop > totalHeaderHeight; - // ... except if the document content is shorter than the sidenav height. - // (this is necessary to avoid crazy behavior on OSX Lion due to overscroll bouncing) - if ($("#doc-col").height() < $("#side-nav").height()) { - navBarShouldBeFixed = false; - } - - var scrollLeft = $(window).scrollLeft(); - // When the sidenav is fixed and user scrolls horizontally, reposition the sidenav to match - if (navBarIsFixed && (scrollLeft != prevScrollLeft)) { - updateSideNavPosition(); - prevScrollLeft = scrollLeft; - } - - // Don't continue if the header is sufficently far away - // (to avoid intensive resizing that slows scrolling) - if (navBarIsFixed && navBarShouldBeFixed) { - return; - } - - if (navBarIsFixed != navBarShouldBeFixed) { - if (navBarShouldBeFixed) { - // make it fixed - var width = $('#devdoc-nav').width(); - $('#devdoc-nav') - .addClass('fixed') - .css({'width':width+'px'}) - .prependTo('#body-content'); - // add neato "back to top" button - $('#devdoc-nav a.totop').css({'display':'block','width':$("#nav").innerWidth()+'px'}); - - // update the sidenaav position for side scrolling - updateSideNavPosition(); - } else { - // make it static again - $('#devdoc-nav') - .removeClass('fixed') - .css({'width':'auto','margin':''}) - .prependTo('#side-nav'); - $('#devdoc-nav a.totop').hide(); - } - navBarIsFixed = navBarShouldBeFixed; - } - - resizeNav(250); // pass true in order to delay the scrollbar re-initialization for performance - }); - - - var navBarLeftPos; - if ($('#devdoc-nav').length) { - setNavBarLeftPos(); - } - - - // Stop expand/collapse behavior when clicking on nav section links (since we're navigating away - // from the page) - $('.nav-section-header').find('a:eq(0)').click(function(evt) { - window.location.href = $(this).attr('href'); - return false; - }); - - // Set up play-on-hover