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
diff --git a/core/executable.mk b/core/executable.mk
index 899a02f..1e8d73a 100644
--- a/core/executable.mk
+++ b/core/executable.mk
@@ -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 :=