add support for LOCAL_MULTILIB

LOCAL_MULTILIB replaces LOCAL_32_BIT_ONLY and
LOCAL_NO_2ND_ARCH, although both are still supported.

Set LOCAL_MULTILIB := 32 to always build a module 32-bit.
This is the same as specifying LOCAL_32_BIT_ONLY.

Set LOCAL_MULTILIB := first to always build a module for
the first architecture (64-bit on a 64-bit target, 32-bit on a
32-bit target).  This is the same as specifying LOCAL_NO_2ND_ARCH.

Set LOCAL_MULTILIB := both to build for both architectures
on a mulitlib (64-bit) target.

If LOCAL_MULTILIB is not set libraries will default to "both",
and executables, packages, and prebuilts will default to building
for the first architecture if supported by the module, otherwise
the second.

Executables that set LOCAL_MULTILIB := both must set either
LOCAL_MODULE_STEM_32 and LOCAL_MODULE_STEM_64 or
LOCAL_MODULE_PATH_32 and LOCAL_MODULE_PATH_64 to specify how to
differentiate the install locations of the two versions.

Change-Id: I22ab6aa342b231c307b1d8a86cea4fd91eea39f5
This commit is contained in:
Colin Cross 2014-03-21 12:29:32 -07:00
parent 36a67a9040
commit e6e48f67d8
8 changed files with 115 additions and 17 deletions

View file

@ -201,6 +201,7 @@ LOCAL_MODULE_PATH_32:=
LOCAL_MODULE_PATH_64:=
LOCAL_MODULE_STEM_32:=
LOCAL_MODULE_STEM_64:=
LOCAL_MULTILIB:=
# Trim MAKEFILE_LIST so that $(call my-dir) doesn't need to
# iterate over thousands of entries every time.

View file

@ -1,31 +1,68 @@
# We don't automatically set up rules to build executables for both
# TARGET_ARCH and TARGET_2ND_ARCH.
# By default, an executable is built for TARGET_ARCH.
# To build it for TARGET_2ND_ARCH in a 64bit product, use "LOCAL_32_BIT_ONLY := true".
# To build it for TARGET_2ND_ARCH in a 64bit product, use "LOCAL_MULTILIB := 32"
# To build it for both set LOCAL_MULTILIB := both and specify
# LOCAL_MODULE_PATH_32 and LOCAL_MODULE_PATH_64 or LOCAL_MODULE_STEM_32 and
# LOCAL_MODULE_STEM_64
include $(BUILD_SYSTEM)/multilib.mk
ifeq ($(TARGET_PREFER_32_BIT),true)
ifneq ($(LOCAL_NO_2ND_ARCH),true)
LOCAL_32_BIT_ONLY := true
ifeq (,$(filter $(my_module_multilib),first both)
# if TARGET_PREFER_32_BIT is not explicitly set to "first" or "both"
# build only for secondary
my_module_multilib := 32
endif
endif
ifndef my_module_multilib
# executables default to building for the first architecture
my_module_multilib := first
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))
endif
ifeq ($(LOCAL_MODULE_PATH_64)$(LOCAL_MODULE_STEM_64),)
$(error $(LOCAL_PATH): LOCAL_MODULE_STEM_64 or LOCAL_MODULE_PATH_64 is required for LOCAL_MULTILIB := both for module $(LOCAL_MODULE))
endif
else #!LOCAL_MULTILIB == both
LOCAL_NO_2ND_ARCH_MODULE_SUFFIX := true
endif
# check if primary arch is supported
my_skip_secondary_arch :=
# check if first arch is supported
include $(BUILD_SYSTEM)/module_arch_supported.mk
ifeq ($(my_module_arch_supported),true)
# primary arch is supported
# first arch is supported
include $(BUILD_SYSTEM)/executable_internal.mk
else ifneq (,$(TARGET_2ND_ARCH))
ifneq ($(my_module_multilib),both)
my_skip_secondary_arch := true
endif
endif
# check if first arch was not supported or asked to build both
ifndef my_skip_secondary_arch
ifdef TARGET_2ND_ARCH
# check if secondary arch is supported
LOCAL_2ND_ARCH_VAR_PREFIX := $(TARGET_2ND_ARCH_VAR_PREFIX)
include $(BUILD_SYSTEM)/module_arch_supported.mk
ifeq ($(my_module_arch_supported),true)
# secondary arch is supported
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
endif # TARGET_2ND_ARCH
endif # !my_skip_secondary_arch || LOCAL_MULTILIB
LOCAL_2ND_ARCH_VAR_PREFIX :=
LOCAL_NO_2ND_ARCH_MODULE_SUFFIX :=

View file

@ -2,8 +2,7 @@
## Determine if a module can be built for an arch
##
## Inputs from module makefile:
## LOCAL_32_BIT_ONLY
## LOCAL_NO_2ND_ARCH
## my_module_multilib
## LOCAL_MODULE_TARGET_ARCH
## LOCAL_MODULE_TARGET_ARCH_WARN
## LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH
@ -19,17 +18,21 @@
my_module_arch_supported := true
ifeq ($(my_module_multilib),none)
my_module_arch_supported := false
endif
ifeq ($(LOCAL_2ND_ARCH_VAR_PREFIX),)
ifeq ($(TARGET_IS_64_BIT)|$(LOCAL_32_BIT_ONLY),true|true)
ifeq ($(TARGET_IS_64_BIT)|$(my_module_multilib),true|32)
my_module_arch_supported := false
else ifeq ($(call directory_is_64_bit_blacklisted,$(LOCAL_PATH)),true)
my_module_arch_supported := false
endif
else # LOCAL_2ND_ARCH_VAR_PREFIX
ifeq ($(LOCAL_NO_2ND_ARCH),true)
ifeq ($(my_module_multilib),first)
my_module_arch_supported := false
endif
endif # !LOCAL_2ND_ARCH_VAR_PREFIX
endif # LOCAL_2ND_ARCH_VAR_PREFIX
ifneq (,$(LOCAL_MODULE_TARGET_ARCH))
ifeq (,$(filter $(TARGET_$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH),$(LOCAL_MODULE_TARGET_ARCH)))

26
core/multilib.mk Normal file
View file

@ -0,0 +1,26 @@
# Translate LOCAL_32_BIT_ONLY and LOCAL_NO_2ND_ARCH to LOCAL_MULTILIB,
# and check LOCAL_MULTILIB is a valid value. Returns module's multilib
# setting in my_module_multilib, or empty if not set.
my_module_multilib := $(strip $(LOCAL_MULTILIB))
ifndef my_module_multilib
ifeq ($(LOCAL_32_BIT_ONLY)|$(LOCAL_NO_2ND_ARCH),true|true)
ifdef TARGET_2ND_ARCH
# Both LOCAL_32_BIT_ONLY and LOCAL_NO_2ND_ARCH specified on 64-bit target
# skip the module completely
my_module_multilib := none
else
# Both LOCAL_32_BIT_ONLY and LOCAL_NO_2ND_ARCH specified on 32-bit target
# build for 32-bit
my_module_multilib := 32
endif
else ifeq ($(LOCAL_32_BIT_ONLY),true)
my_module_multilib := 32
else ifeq ($(LOCAL_NO_2ND_ARCH),true)
my_module_multilib := first
endif
else # my_module_multilib defined
ifeq (,$(filter 32 first both none,$(my_module_multilib)))
$(error $(LOCAL_PATH): Invalid LOCAL_MULTILIB specified for module $(LOCAL_MODULE))
endif
endif # my_module_multilib defined

View file

@ -1,15 +1,23 @@
# We don't automatically set up rules to build packages for both
# TARGET_ARCH and TARGET_2ND_ARCH.
# By default, an package is built for TARGET_ARCH.
# To build it for TARGET_2ND_ARCH in a 64bit product, use "LOCAL_32_BIT_ONLY := true".
# To build it for TARGET_2ND_ARCH in a 64bit product, use "LOCAL_MULTILIB := 32".
include $(BUILD_SYSTEM)/multilib.mk
ifndef my_module_multilib
# packages default to building for either architecture,
# the first if its supported, otherwise the second.
my_module_multilib := both
endif
LOCAL_NO_2ND_ARCH_MODULE_SUFFIX := true
# check if primary arch is supported
# check if first arch is supported
LOCAL_2ND_ARCH_VAR_PREFIX :=
include $(BUILD_SYSTEM)/module_arch_supported.mk
ifeq ($(my_module_arch_supported),true)
# primary arch is supported
# first arch is supported
include $(BUILD_SYSTEM)/package_internal.mk
else ifneq (,$(TARGET_2ND_ARCH))
# check if secondary arch is supported

View file

@ -9,10 +9,19 @@
ifdef LOCAL_IS_HOST_MODULE
include $(BUILD_SYSTEM)/prebuilt_internal.mk
else #!LOCAL_IS_HOST_MODULE
# check if primary arch is supported
include $(BUILD_SYSTEM)/multilib.mk
ifndef my_module_multilib
# prebuilts default to building for either architecture,
# the first if its supported, otherwise the second.
my_module_multilib := both
endif
# check if first arch is supported
include $(BUILD_SYSTEM)/module_arch_supported.mk
ifeq ($(my_module_arch_supported),true)
# primary arch is supported
# first arch is supported
include $(BUILD_SYSTEM)/prebuilt_internal.mk
else ifneq (,$(TARGET_2ND_ARCH))
# check if secondary arch is supported

View file

@ -10,6 +10,13 @@ $(warning $(LOCAL_MODULE): LOCAL_UNSTRIPPED_PATH for shared libraries is unsuppo
endif
endif
include $(BUILD_SYSTEM)/multilib.mk
ifndef my_module_multilib
# libraries default to building for both architecturess
my_module_multilib := both
endif
LOCAL_2ND_ARCH_VAR_PREFIX :=
include $(BUILD_SYSTEM)/module_arch_supported.mk

View file

@ -1,3 +1,10 @@
include $(BUILD_SYSTEM)/multilib.mk
ifndef my_module_multilib
# libraries default to building for both architecturess
my_module_multilib := both
endif
LOCAL_2ND_ARCH_VAR_PREFIX :=
include $(BUILD_SYSTEM)/module_arch_supported.mk