diff --git a/core/base_rules.mk b/core/base_rules.mk index ad2678edc..f88fd8959 100644 --- a/core/base_rules.mk +++ b/core/base_rules.mk @@ -55,6 +55,12 @@ my_module_tags := $(LOCAL_MODULE_TAGS) ifeq ($(my_host_cross),true) my_module_tags := endif +ifeq ($(TARGET_TRANSLATE_2ND_ARCH),true) +ifdef LOCAL_2ND_ARCH_VAR_PREFIX +# Don't pull in modules by tags if this is for translation TARGET_2ND_ARCH. + my_module_tags := +endif +endif # 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 @@ -123,7 +129,17 @@ endif my_32_64_bit_suffix := $(if $($(LOCAL_2ND_ARCH_VAR_PREFIX)$(my_prefix)IS_64_BIT),64,32) ifneq (true,$(LOCAL_UNINSTALLABLE_MODULE)) +ifeq ($(TARGET_TRANSLATE_2ND_ARCH),true) +# When in TARGET_TRANSLATE_2ND_ARCH both TARGET_ARCH and TARGET_2ND_ARCH are 32-bit, +# to avoid path conflict we force using LOCAL_MODULE_PATH_64 for the first arch. +ifdef LOCAL_2ND_ARCH_VAR_PREFIX +my_multilib_module_path := $(LOCAL_MODULE_PATH_32) +else # ! LOCAL_2ND_ARCH_VAR_PREFIX +my_multilib_module_path := $(LOCAL_MODULE_PATH_64) +endif # ! LOCAL_2ND_ARCH_VAR_PREFIX +else # ! TARGET_TRANSLATE_2ND_ARCH my_multilib_module_path := $(strip $(LOCAL_MODULE_PATH_$(my_32_64_bit_suffix))) +endif # ! TARGET_TRANSLATE_2ND_ARCH ifdef my_multilib_module_path my_module_path := $(my_multilib_module_path) else diff --git a/core/dex_preopt_libart.mk b/core/dex_preopt_libart.mk index 2a7ffb7e6..feed33031 100644 --- a/core/dex_preopt_libart.mk +++ b/core/dex_preopt_libart.mk @@ -77,11 +77,13 @@ LIBART_TARGET_BOOT_ART_EXTRA_FILES += boot.oat my_2nd_arch_prefix := include $(BUILD_SYSTEM)/dex_preopt_libart_boot.mk +ifneq ($(TARGET_TRANSLATE_2ND_ARCH),true) ifdef TARGET_2ND_ARCH my_2nd_arch_prefix := $(TARGET_2ND_ARCH_VAR_PREFIX) include $(BUILD_SYSTEM)/dex_preopt_libart_boot.mk my_2nd_arch_prefix := endif +endif ######################################################################## diff --git a/core/envsetup.mk b/core/envsetup.mk index 1840b7e51..c3cd3c5a9 100644 --- a/core/envsetup.mk +++ b/core/envsetup.mk @@ -324,10 +324,19 @@ TARGET_OUT_FAKE := $(PRODUCT_OUT)/fake_packages # Out for TARGET_2ND_ARCH TARGET_2ND_ARCH_VAR_PREFIX := $(HOST_2ND_ARCH_VAR_PREFIX) +ifeq ($(TARGET_TRANSLATE_2ND_ARCH),true) +# With this you can reference the arm binary translation library with libfoo_arm in PRODUCT_PACKAGES. +TARGET_2ND_ARCH_MODULE_SUFFIX := _$(TARGET_2ND_ARCH) +else TARGET_2ND_ARCH_MODULE_SUFFIX := $(HOST_2ND_ARCH_MODULE_SUFFIX) +endif $(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 +ifeq ($(TARGET_TRANSLATE_2ND_ARCH),true) +$(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_SHARED_LIBRARIES := $(target_out_shared_libraries_base)/lib/$(TARGET_2ND_ARCH) +else $(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_SHARED_LIBRARIES := $(target_out_shared_libraries_base)/lib +endif $(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) @@ -351,7 +360,11 @@ TARGET_OUT_DATA_FAKE := $(TARGET_OUT_DATA)/fake_packages $(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_DATA_EXECUTABLES := $(TARGET_OUT_DATA_EXECUTABLES) $(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) +ifeq ($(TARGET_TRANSLATE_2ND_ARCH),true) +$(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_DATA_NATIVE_TESTS := $(TARGET_OUT_DATA)/nativetest/$(TARGET_2ND_ARCH) +else $(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_DATA_NATIVE_TESTS := $(TARGET_OUT_DATA)/nativetest +endif TARGET_OUT_CACHE := $(PRODUCT_OUT)/cache @@ -375,7 +388,11 @@ TARGET_OUT_VENDOR_APPS_PRIVILEGED := $(TARGET_OUT_VENDOR)/priv-app TARGET_OUT_VENDOR_ETC := $(TARGET_OUT_VENDOR)/etc $(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_VENDOR_EXECUTABLES := $(TARGET_OUT_VENDOR_EXECUTABLES) +ifeq ($(TARGET_TRANSLATE_2ND_ARCH),true) +$(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_VENDOR_SHARED_LIBRARIES := $(TARGET_OUT_VENDOR)/lib/$(TARGET_2ND_ARCH) +else $(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_VENDOR_SHARED_LIBRARIES := $(TARGET_OUT_VENDOR)/lib +endif $(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_VENDOR_APPS := $(TARGET_OUT_VENDOR_APPS) TARGET_OUT_OEM := $(PRODUCT_OUT)/$(TARGET_COPY_OUT_OEM) @@ -391,7 +408,11 @@ TARGET_OUT_OEM_APPS := $(TARGET_OUT_OEM)/app TARGET_OUT_OEM_ETC := $(TARGET_OUT_OEM)/etc $(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_OEM_EXECUTABLES := $(TARGET_OUT_OEM_EXECUTABLES) +ifeq ($(TARGET_TRANSLATE_2ND_ARCH),true) +$(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_OEM_SHARED_LIBRARIES := $(TARGET_OUT_OEM)/lib/$(TARGET_2ND_ARCH) +else $(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_OEM_SHARED_LIBRARIES := $(TARGET_OUT_OEM)/lib +endif $(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_OEM_APPS := $(TARGET_OUT_OEM_APPS) TARGET_OUT_ODM := $(PRODUCT_OUT)/$(TARGET_COPY_OUT_ODM) @@ -405,7 +426,11 @@ 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) +ifeq ($(TARGET_TRANSLATE_2ND_ARCH),true) +$(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_ODM_SHARED_LIBRARIES := $(TARGET_OUT_ODM)/lib/$(TARGET_2ND_ARCH) +else $(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_ODM_SHARED_LIBRARIES := $(TARGET_OUT_ODM)/lib +endif $(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_ODM_APPS := $(TARGET_OUT_ODM_APPS) TARGET_OUT_BREAKPAD := $(PRODUCT_OUT)/breakpad diff --git a/core/executable.mk b/core/executable.mk index 70ef0d989..6091a52ea 100644 --- a/core/executable.mk +++ b/core/executable.mk @@ -17,6 +17,10 @@ endif ifneq (true,$(my_skip_this_target)) +ifeq ($(TARGET_TRANSLATE_2ND_ARCH),true) +LOCAL_MULTILIB := first +endif + my_prefix := TARGET_ include $(BUILD_SYSTEM)/multilib.mk diff --git a/core/main.mk b/core/main.mk index 31437d3b6..02f43d7e7 100644 --- a/core/main.mk +++ b/core/main.mk @@ -577,19 +577,33 @@ CUSTOM_MODULES := \ # # Resolve the required module name to 32-bit or 64-bit variant. # Get a list of corresponding 32-bit module names, if one exists. +ifneq ($(TARGET_TRANSLATE_2ND_ARCH),true) define get-32-bit-modules -$(strip $(foreach m,$(1),\ +$(sort $(foreach m,$(1),\ $(if $(ALL_MODULES.$(m)$(TARGET_2ND_ARCH_MODULE_SUFFIX).CLASS),\ - $(m)$(TARGET_2ND_ARCH_MODULE_SUFFIX)))) + $(m)$(TARGET_2ND_ARCH_MODULE_SUFFIX))\ + $(if $(ALL_MODULES.$(m)$(HOST_2ND_ARCH_MODULE_SUFFIX).CLASS),\ + $(m)$(HOST_2ND_ARCH_MODULE_SUFFIX))\ + )) endef # Get a list of corresponding 32-bit module names, if one exists; # otherwise return the original module name define get-32-bit-modules-if-we-can -$(strip $(foreach m,$(1),\ - $(if $(ALL_MODULES.$(m)$(TARGET_2ND_ARCH_MODULE_SUFFIX).CLASS),\ - $(m)$(TARGET_2ND_ARCH_MODULE_SUFFIX), - $(m)))) +$(sort $(foreach m,$(1),\ + $(if $(ALL_MODULES.$(m)$(TARGET_2ND_ARCH_MODULE_SUFFIX).CLASS)$(ALL_MODULES.$(m)$(HOST_2ND_ARCH_MODULE_SUFFIX).CLASS),\ + $(if $(ALL_MODULES.$(m)$(TARGET_2ND_ARCH_MODULE_SUFFIX).CLASS),$(m)$(TARGET_2ND_ARCH_MODULE_SUFFIX)) \ + $(if $(ALL_MODULES.$(m)$(HOST_2ND_ARCH_MODULE_SUFFIX).CLASS),$(m)$(HOST_2ND_ARCH_MODULE_SUFFIX)),\ + $(m)))) endef +else # TARGET_TRANSLATE_2ND_ARCH +# For binary translation config, by default only install the first arch. +define get-32-bit-modules +endef + +define get-32-bit-modules-if-we-can +$(strip $(1)) +endef +endif # TARGET_TRANSLATE_2ND_ARCH # If a module is for a cross host os, the required modules must be for # that OS too. diff --git a/core/package.mk b/core/package.mk index 78b65db10..8c2c43502 100644 --- a/core/package.mk +++ b/core/package.mk @@ -2,6 +2,10 @@ # TARGET_ARCH and TARGET_2ND_ARCH. # To build it for TARGET_2ND_ARCH in a 64bit product, use "LOCAL_MULTILIB := 32". +ifeq ($(TARGET_TRANSLATE_2ND_ARCH),true) +LOCAL_MULTILIB := first +endif + my_prefix := TARGET_ include $(BUILD_SYSTEM)/multilib.mk diff --git a/core/prebuilt.mk b/core/prebuilt.mk index fd6356036..776827a04 100644 --- a/core/prebuilt.mk +++ b/core/prebuilt.mk @@ -11,6 +11,10 @@ ifdef LOCAL_IS_HOST_MODULE LOCAL_HOST_PREFIX := else my_prefix := TARGET_ + + ifeq ($(TARGET_TRANSLATE_2ND_ARCH),true) + LOCAL_MULTILIB := first + endif endif include $(BUILD_SYSTEM)/multilib.mk diff --git a/target/board/generic_x86_arm/BoardConfig.mk b/target/board/generic_x86_arm/BoardConfig.mk new file mode 100644 index 000000000..6e2573eeb --- /dev/null +++ b/target/board/generic_x86_arm/BoardConfig.mk @@ -0,0 +1,60 @@ +# 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. +# 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 generic_x86 + arm libraries needed by binary translation. + +# The generic product target doesn't have any hardware-specific pieces. +TARGET_NO_BOOTLOADER := true +TARGET_NO_KERNEL := true +TARGET_CPU_ABI := x86 +TARGET_ARCH := x86 +TARGET_ARCH_VARIANT := x86 + +TARGET_2ND_ARCH := arm +TARGET_2ND_CPU_ABI := armeabi-v7a +TARGET_2ND_CPU_ABI2 := armeabi +TARGET_2ND_ARCH_VARIANT := armv7-a +TARGET_2ND_CPU_VARIANT := generic + +# Tell the build system this isn't a typical 64bit+32bit multilib configuration. +TARGET_TRANSLATE_2ND_ARCH := true + +# no hardware camera +USE_CAMERA_STUB := true + +# 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) + ifeq ($(WITH_DEXPREOPT),) + WITH_DEXPREOPT := true + endif +endif + +# Build OpenGLES emulation host and guest libraries +BUILD_EMULATOR_OPENGL := true + +# Build and enable the OpenGL ES View renderer. When running on the emulator, +# the GLES renderer disables itself if host GL acceleration isn't available. +USE_OPENGL_RENDERER := true + +TARGET_USERIMAGES_USE_EXT4 := true +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/product/AndroidProducts.mk b/target/product/AndroidProducts.mk index 69edc72e4..42447f195 100644 --- a/target/product/AndroidProducts.mk +++ b/target/product/AndroidProducts.mk @@ -53,6 +53,7 @@ PRODUCT_MAKEFILES := \ $(LOCAL_DIR)/aosp_arm.mk \ $(LOCAL_DIR)/full.mk \ $(LOCAL_DIR)/aosp_x86.mk \ + $(LOCAL_DIR)/aosp_x86_arm.mk \ $(LOCAL_DIR)/full_x86.mk \ $(LOCAL_DIR)/aosp_mips.mk \ $(LOCAL_DIR)/full_mips.mk \ diff --git a/target/product/aosp_x86_arm.mk b/target/product/aosp_x86_arm.mk new file mode 100644 index 000000000..85a2cf8be --- /dev/null +++ b/target/product/aosp_x86_arm.mk @@ -0,0 +1,42 @@ +# +# Copyright 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. +# 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. +# + + +# aosp_x86 with arm libraries needed by binary translation. + +include $(SRC_TARGET_DIR)/product/full_x86.mk + +# arm libraries. This is the list of shared libraries included in the NDK. +# Their dependency libraries will be automatically pulled in. +PRODUCT_PACKAGES += \ + libandroid_arm \ + libc_arm \ + libdl_arm \ + libEGL_arm \ + libGLESv1_CM_arm \ + libGLESv2_arm \ + libGLESv3_arm \ + libjnigraphics_arm \ + liblog_arm \ + libm_arm \ + libmediandk_arm \ + libOpenMAXAL_arm \ + libstdc++_arm \ + libOpenSLES_arm \ + libz_arm \ + +PRODUCT_NAME := aosp_x86_arm +PRODUCT_DEVICE := generic_x86_arm