libbcc: convert makefiles to support multilib build

Convert makefiles to allow for building two architectures at the
same time.

Change-Id: I13cba3766a658e332a5223ce357878b25ba8ecec
diff --git a/Android.mk b/Android.mk
index 244e391..fcc07f9 100644
--- a/Android.mk
+++ b/Android.mk
@@ -35,48 +35,24 @@
 # Calculate SHA1 checksum for libbcc.so, libRS.so and libclcore.bc
 #=====================================================================
 
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := libbcc.sha1
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_CLASS := SHARED_LIBRARIES
-
-libbcc_SHA1_SRCS := \
-  $(TARGET_OUT_INTERMEDIATE_LIBRARIES)/libbcc.so \
-  $(TARGET_OUT_INTERMEDIATE_LIBRARIES)/libcompiler_rt.so \
-  $(TARGET_OUT_INTERMEDIATE_LIBRARIES)/libRS.so \
-  $(call intermediates-dir-for,SHARED_LIBRARIES,libclcore.bc,,)/libclcore.bc \
-  $(call intermediates-dir-for,SHARED_LIBRARIES,libclcore_debug.bc,,)/libclcore_debug.bc
-
-ifeq ($(ARCH_ARM_HAVE_NEON),true)
-  libbcc_SHA1_SRCS += \
-    $(call intermediates-dir-for,SHARED_LIBRARIES,libclcore_neon.bc,,)/libclcore_neon.bc
+my_2nd_arch_prefix :=
+include $(LOCAL_PATH)/libbcc.sha1.mk
+ifneq ($(TARGET_2ND_ARCH),)
+my_2nd_arch_prefix := $(TARGET_2ND_ARCH_VAR_PREFIX)
+include $(LOCAL_PATH)/libbcc.sha1.mk
 endif
-
-libbcc_GEN_SHA1_STAMP := $(LOCAL_PATH)/tools/build/gen-sha1-stamp.py
-intermediates := $(call local-intermediates-dir)
-
-libbcc_SHA1_ASM := $(intermediates)/libbcc.sha1.S
-LOCAL_GENERATED_SOURCES += $(libbcc_SHA1_ASM)
-$(libbcc_SHA1_ASM): PRIVATE_SHA1_SRCS := $(libbcc_SHA1_SRCS)
-$(libbcc_SHA1_ASM): $(libbcc_SHA1_SRCS) $(libbcc_GEN_SHA1_STAMP)
-	@echo libbcc.sha1: $@
-	$(hide) mkdir -p $(dir $@)
-	$(hide) $(libbcc_GEN_SHA1_STAMP) $(PRIVATE_SHA1_SRCS) > $@
-
-LOCAL_CFLAGS += -D_REENTRANT -DPIC -fPIC
-LOCAL_CFLAGS += -O3 -nodefaultlibs -nostdlib
-
-include $(BUILD_SHARED_LIBRARY)
+my_2nd_arch_prefix :=
 
 #=====================================================================
 # Device Shared Library libbcc
 #=====================================================================
-# TODOArm64
-# TODOMips64
-ifneq ($(filter $(TARGET_ARCH),arm64 mips64),)
-  $(info TODO$(TARGET_ARCH): $(LOCAL_PATH)/Android.mk Enable libbcc build)
-else
+ifeq ($(TARGET_ARCH),arm64)
+$(info TODOArm64: $(LOCAL_PATH)/Android.mk Enable libbcc build)
+endif
+
+ifeq ($(TARGET_ARCH),mips64)
+$(info TODOMips64: $(LOCAL_PATH)/Android.mk Enable libbcc build)
+endif
 
 include $(CLEAR_VARS)
 
@@ -94,21 +70,25 @@
 # installed.
 LOCAL_REQUIRED_MODULES := libclcore.bc libclcore_debug.bc libbcc.sha1 libcompiler_rt
 
-ifeq ($(TARGET_ARCH),$(filter $(TARGET_ARCH),x86 x86_64))
-LOCAL_REQUIRED_MODULES += libclcore_x86.bc
-endif
+LOCAL_REQUIRED_MODULES_x86 += libclcore_x86.bc
+LOCAL_REQUIRED_MODULES_x86_64 += libclcore_x86.bc
 
 ifeq ($(ARCH_ARM_HAVE_NEON),true)
-  LOCAL_REQUIRED_MODULES += libclcore_neon.bc
+  LOCAL_REQUIRED_MODULES_arm += libclcore_neon.bc
 endif
 
 # Generate build information (Build time + Build git revision + Build Semi SHA1)
+my_2nd_arch_prefix :=
 include $(LIBBCC_ROOT_PATH)/libbcc-gen-build-info.mk
+ifdef TARGET_2ND_ARCH
+my_2nd_arch_prefix := $(TARGET_2ND_ARCH_VAR_PREFIX)
+include $(LIBBCC_ROOT_PATH)/libbcc-gen-build-info.mk
+endif
+my_2nd_arch_prefix :=
 
 include $(LIBBCC_DEVICE_BUILD_MK)
 include $(BUILD_SHARED_LIBRARY)
 
-endif # !(arm64 || mips64)
 #=====================================================================
 # Host Shared Library libbcc
 #=====================================================================
@@ -136,6 +116,7 @@
 endif
 
 # Generate build information (Build time + Build git revision + Build Semi SHA1)
+my_2nd_arch_prefix :=
 include $(LIBBCC_ROOT_PATH)/libbcc-gen-build-info.mk
 
 include $(LIBBCC_HOST_BUILD_MK)
diff --git a/bcinfo/Android.mk b/bcinfo/Android.mk
index a5652be..b7296d9 100644
--- a/bcinfo/Android.mk
+++ b/bcinfo/Android.mk
@@ -51,18 +51,19 @@
 
 LLVM_ROOT_PATH := external/llvm
 
-# TODOArm64
-# TODOMips64
-ifneq ($(filter $(TARGET_ARCH),arm64 mips64),)
-  $(info TODO$(TARGET_ARCH): $(LOCAL_PATH)/Android.mk Enable build of libbcinfo device shared library)
-else
+ifeq ($(TARGET_ARCH),arm64)
+$(info TODOArm64: $(LOCAL_PATH)/Android.mk Enable build of libbcinfo device shared library)
+endif
+
+ifeq ($(TARGET_ARCH),mips64)
+$(info TODOMips64: $(LOCAL_PATH)/Android.mk Enable build of libbcinfo device shared library)
+endif
 
 include $(CLEAR_VARS)
 
 LOCAL_MODULE := libbcinfo
 LOCAL_MODULE_CLASS := SHARED_LIBRARIES
 LOCAL_MODULE_TAGS := optional
-intermediates := $(local-intermediates-dir)
 
 LOCAL_SRC_FILES := $(libbcinfo_SRC_FILES)
 
@@ -75,7 +76,6 @@
 
 include $(LLVM_ROOT_PATH)/llvm-device-build.mk
 include $(BUILD_SHARED_LIBRARY)
-endif # !(arm64 || mips64)
 
 include $(CLEAR_VARS)
 
diff --git a/libbcc-device-build.mk b/libbcc-device-build.mk
index 1aa1239..06d7f86 100644
--- a/libbcc-device-build.mk
+++ b/libbcc-device-build.mk
@@ -34,33 +34,34 @@
 # For the host build, we will include as many architecture as possible,
 # so that we can test the execution engine easily.
 
-# TODOArm64
-# TODOMips64
-ifneq ($(filter $(TARGET_ARCH),arm64 mips64),)
-  $(info TODO$(TARGET_ARCH): $(LOCAL_PATH)/libbcc-device-build.mk Add $(TARGET_ARCH) define to LOCAL_CFLAGS)
-else
+LOCAL_MODULE_TARGET_ARCH := $(LLVM_SUPPORTED_ARCH)
 
-ifeq ($(TARGET_ARCH),arm)
-  LOCAL_CFLAGS += -DFORCE_ARM_CODEGEN
-  ifeq ($(ARCH_ARM_HAVE_VFP),true)
-    LOCAL_CFLAGS += -DARCH_ARM_HAVE_VFP
-    ifeq ($(ARCH_ARM_HAVE_VFP_D32),true)
-      LOCAL_CFLAGS += -DARCH_ARM_HAVE_VFP_D32
-    endif
+ifeq ($(TARGET_ARCH),arm64)
+$(info TODOArm64: $(LOCAL_PATH)/Android.mk Add Arm64 define to LOCAL_CFLAGS)
+endif
+
+ifeq ($(TARGET_ARCH),mips64)
+$(info TODOMips64: $(LOCAL_PATH)/Android.mk Add Mips64 define to LOCAL_CFLAGS)
+endif
+
+LOCAL_CFLAGS_arm += -DFORCE_ARM_CODEGEN
+ifeq ($(ARCH_ARM_HAVE_VFP),true)
+  LOCAL_CFLAGS_arm += -DARCH_ARM_HAVE_VFP
+  ifeq ($(ARCH_ARM_HAVE_VFP_D32),true)
+    LOCAL_CFLAGS_arm += -DARCH_ARM_HAVE_VFP_D32
   endif
-  ifeq ($(ARCH_ARM_HAVE_NEON),true)
-    LOCAL_CFLAGS += -DARCH_ARM_HAVE_NEON
-  endif
-else
-  ifeq ($(TARGET_ARCH),mips)
-    LOCAL_CFLAGS += -DFORCE_MIPS_CODEGEN
-  else
-    ifeq ($(TARGET_ARCH),$(filter $(TARGET_ARCH),x86 x86_64))
-      LOCAL_CFLAGS += -DFORCE_X86_CODEGEN
-    else
-      $(error Unsupported architecture $(TARGET_ARCH))
-    endif
-  endif
+endif
+ifeq ($(ARCH_ARM_HAVE_NEON),true)
+  LOCAL_CFLAGS_arm += -DARCH_ARM_HAVE_NEON
+endif
+
+LOCAL_CFLAGS_mips += -DFORCE_MIPS_CODEGEN
+
+LOCAL_CFLAGS_x86 += -DFORCE_X86_CODEGEN
+LOCAL_CFLAGS_x86_64 += -DFORCE_X86_CODEGEN
+
+ifeq (,$(filter $(TARGET_ARCH),arm64 arm mips mips64 x86 x86_64))
+  $(error Unsupported architecture $(TARGET_ARCH))
 endif
 
 LOCAL_C_INCLUDES := \
@@ -70,5 +71,3 @@
   $(LLVM_ROOT_PATH)/include \
   $(LLVM_ROOT_PATH)/device/include \
   $(LOCAL_C_INCLUDES)
-
-endif # !(arm64 || mips64)
diff --git a/libbcc-gen-build-info.mk b/libbcc-gen-build-info.mk
index 7112a1a..fa6a521 100644
--- a/libbcc-gen-build-info.mk
+++ b/libbcc-gen-build-info.mk
@@ -34,15 +34,15 @@
 LOCAL_LIBBCC_LIB_DEPS := \
   $(foreach lib,$(LOCAL_STATIC_LIBRARIES), \
     $(call intermediates-dir-for, \
-      STATIC_LIBRARIES,$(lib),$(LOCAL_IS_HOST_MODULE))/$(lib)$(a_suffix)) \
+      STATIC_LIBRARIES,$(lib),$(LOCAL_IS_HOST_MODULE),,$(my_2nd_arch_prefix))/$(lib)$(a_suffix)) \
   $(foreach lib,$(LOCAL_WHOLE_STATIC_LIBRARIES), \
     $(call intermediates-dir-for, \
-      STATIC_LIBRARIES,$(lib),$(LOCAL_IS_HOST_MODULE))/$(lib)$(a_suffix)) \
-  $(addprefix $($(my_prefix)OUT_INTERMEDIATE_LIBRARIES)/, \
+      STATIC_LIBRARIES,$(lib),$(LOCAL_IS_HOST_MODULE),,$(my_2nd_arch_prefix))/$(lib)$(a_suffix)) \
+  $(addprefix $($(my_2nd_arch_prefix)$(my_prefix)OUT_INTERMEDIATE_LIBRARIES)/, \
     $(addsuffix $(so_suffix), $(LOCAL_SHARED_LIBRARIES))) \
 
 # Build Rules for Automatically Generated Build Information
-GEN := $(local-intermediates-dir)/BuildInfo.cpp
+GEN := $(call local-intermediates-dir,,$(my_2nd_arch_prefix))/BuildInfo.cpp
 
 gen_build_info := $(LOCAL_PATH)/tools/build/gen-build-info.py
 
@@ -54,4 +54,8 @@
         $(wildcard $(LOCAL_PATH)/.git/COMMIT_EDITMSG)
 	$(transform-generated-source)
 
+ifdef LOCAL_IS_HOST_MODULE
 LOCAL_GENERATED_SOURCES += $(GEN)
+else
+LOCAL_GENERATED_SOURCES_$(TARGET_$(my_2nd_arch_prefix)ARCH) += $(GEN)
+endif
diff --git a/libbcc-gen-config-from-mk.mk b/libbcc-gen-config-from-mk.mk
index f8baa63..b0bf712 100644
--- a/libbcc-gen-config-from-mk.mk
+++ b/libbcc-gen-config-from-mk.mk
@@ -15,9 +15,9 @@
 #
 
 # Build rules for extracting configuration from Android.mk
-intermediates := $(call local-intermediates-dir)
+generated_sources := $(call local-generated-sources-dir)
 
-GEN_CONFIG_FROM_MK := $(intermediates)/ConfigFromMk.h
+GEN_CONFIG_FROM_MK := $(generated_sources)/ConfigFromMk.h
 
 $(GEN_CONFIG_FROM_MK): PRIVATE_PATH := $(LIBBCC_ROOT_PATH)
 $(GEN_CONFIG_FROM_MK): PRIVATE_CUSTOM_TOOL = \
diff --git a/libbcc.sha1.mk b/libbcc.sha1.mk
new file mode 100644
index 0000000..47a2be2
--- /dev/null
+++ b/libbcc.sha1.mk
@@ -0,0 +1,47 @@
+#=====================================================================
+# Calculate SHA1 checksum for libbcc.so, libRS.so and libclcore.bc
+#=====================================================================
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := libbcc.sha1
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_CLASS := SHARED_LIBRARIES
+
+libbcc_SHA1_SRCS := \
+  $($(my_2nd_arch_prefix)TARGET_OUT_INTERMEDIATE_LIBRARIES)/libbcc.so \
+  $($(my_2nd_arch_prefix)TARGET_OUT_INTERMEDIATE_LIBRARIES)/libcompiler_rt.so \
+  $($(my_2nd_arch_prefix)TARGET_OUT_INTERMEDIATE_LIBRARIES)/libRS.so \
+  $(call intermediates-dir-for,SHARED_LIBRARIES,libclcore.bc,,,$(my_2nd_arch_prefix))/libclcore.bc \
+  $(call intermediates-dir-for,SHARED_LIBRARIES,libclcore_debug.bc,,,$(my_2nd_arch_prefix))/libclcore_debug.bc
+
+ifeq ($(TARGET_$(my_2nd_arch_prefix)ARCH),arm)
+ifeq ($(ARCH_ARM_HAVE_NEON),true)
+  libbcc_SHA1_SRCS += \
+    $(call intermediates-dir-for,SHARED_LIBRARIES,libclcore_neon.bc,,,$(my_2nd_arch_prefix))/libclcore_neon.bc
+endif
+endif
+
+libbcc_GEN_SHA1_STAMP := $(LOCAL_PATH)/tools/build/gen-sha1-stamp.py
+intermediates := $(call local-intermediates-dir,,$(my_2nd_arch_prefix))
+
+libbcc_SHA1_ASM := $(intermediates)/libbcc.sha1.S
+LOCAL_GENERATED_SOURCES += $(libbcc_SHA1_ASM)
+$(libbcc_SHA1_ASM): PRIVATE_SHA1_SRCS := $(libbcc_SHA1_SRCS)
+$(libbcc_SHA1_ASM): $(libbcc_SHA1_SRCS) $(libbcc_GEN_SHA1_STAMP)
+	@echo libbcc.sha1: $@
+	$(hide) mkdir -p $(dir $@)
+	$(hide) $(libbcc_GEN_SHA1_STAMP) $(PRIVATE_SHA1_SRCS) > $@
+
+LOCAL_CFLAGS += -D_REENTRANT -DPIC -fPIC
+LOCAL_CFLAGS += -O3 -nodefaultlibs -nostdlib
+
+ifeq ($(my_2nd_arch_prefix),)
+LOCAL_NO_2ND_ARCH := true
+else
+LOCAL_32_BIT_ONLY := true
+endif
+
+LOCAL_MODULE_TARGET_ARCH := $(LLVM_SUPPORTED_ARCH)
+
+include $(BUILD_SHARED_LIBRARY)