From e6e48f67d8fac2b5a29dbfeb1ad40610a451b792 Mon Sep 17 00:00:00 2001 From: Colin Cross Date: Fri, 21 Mar 2014 12:29:32 -0700 Subject: [PATCH] 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 --- core/clear_vars.mk | 1 + core/executable.mk | 51 ++++++++++++++++++++++++++++++----- core/module_arch_supported.mk | 13 +++++---- core/multilib.mk | 26 ++++++++++++++++++ core/package.mk | 14 +++++++--- core/prebuilt.mk | 13 +++++++-- core/shared_library.mk | 7 +++++ core/static_library.mk | 7 +++++ 8 files changed, 115 insertions(+), 17 deletions(-) create mode 100644 core/multilib.mk diff --git a/core/clear_vars.mk b/core/clear_vars.mk index 8129014dcb..ed692b95b4 100644 --- a/core/clear_vars.mk +++ b/core/clear_vars.mk @@ -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. diff --git a/core/executable.mk b/core/executable.mk index 899a02fb26..1e8d73a452 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 := diff --git a/core/module_arch_supported.mk b/core/module_arch_supported.mk index ddfd67dfd1..1e03914838 100644 --- a/core/module_arch_supported.mk +++ b/core/module_arch_supported.mk @@ -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))) diff --git a/core/multilib.mk b/core/multilib.mk new file mode 100644 index 0000000000..fa5397a773 --- /dev/null +++ b/core/multilib.mk @@ -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 diff --git a/core/package.mk b/core/package.mk index b40ac37f67..337d3d0502 100644 --- a/core/package.mk +++ b/core/package.mk @@ -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 diff --git a/core/prebuilt.mk b/core/prebuilt.mk index 027c80a3b2..5f91110cf6 100644 --- a/core/prebuilt.mk +++ b/core/prebuilt.mk @@ -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 diff --git a/core/shared_library.mk b/core/shared_library.mk index 87b60687f8..95a8d7b0e7 100644 --- a/core/shared_library.mk +++ b/core/shared_library.mk @@ -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 diff --git a/core/static_library.mk b/core/static_library.mk index d6e8d516e1..bedefd0993 100644 --- a/core/static_library.mk +++ b/core/static_library.mk @@ -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