Support x86+arm multilib build.
Support TARGET_2ND_ARCH as the binary translation arch. See target/board/generic_x86_arm/BoardConfig.mk and target/product/aosp_x86_arm.mk as example for the setup. In BoardConfig, use the TARGET_2ND_ARCH/etc. variables to set up the binary translation arch; Set "TARGET_TRANSLATE_2ND_ARCH := true" to tell the build system it's not a typical 64-bit multilib configuration. In product makefile, use "PRODUCT_PACKAGES += libfoo_<2nd_arch>" to install the TARGET_2ND_ARCH libraries. This also pulls in any dependency libraries. By default we don't install any TARGET_2ND_ARCH modules, unless it's pulled in by PRODUCT_PACKAGES. Bug: 27526885 Change-Id: I0578e9c80da0532d2fa886a8fcdb140bbc703009
This commit is contained in:
parent
c6b50027d8
commit
277e75a488
10 changed files with 178 additions and 6 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
########################################################################
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
26
core/main.mk
26
core/main.mk
|
@ -576,19 +576,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.
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
60
target/board/generic_x86_arm/BoardConfig.mk
Normal file
60
target/board/generic_x86_arm/BoardConfig.mk
Normal file
|
@ -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
|
|
@ -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 \
|
||||
|
|
42
target/product/aosp_x86_arm.mk
Normal file
42
target/product/aosp_x86_arm.mk
Normal file
|
@ -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
|
Loading…
Reference in a new issue