Merge "v8: support multilib builds"
diff --git a/Android.d8.mk b/Android.d8.mk
index 0f74eb5..f512e75 100644
--- a/Android.d8.mk
+++ b/Android.d8.mk
@@ -19,4 +19,6 @@
 
 LOCAL_C_INCLUDES += $(LOCAL_PATH)/include
 
+LOCAL_MODULE_TARGET_ARCH_WARN := $(V8_SUPPORTED_ARCH)
+
 include $(BUILD_EXECUTABLE)
diff --git a/Android.libv8.mk b/Android.libv8.mk
index 586980c..d83857b 100644
--- a/Android.libv8.mk
+++ b/Android.libv8.mk
@@ -13,64 +13,70 @@
 # Set up the target identity
 LOCAL_MODULE := libv8
 LOCAL_MODULE_CLASS := STATIC_LIBRARIES
-intermediates := $(call local-intermediates-dir)
+generated_sources := $(call local-generated-sources-dir)
 
-# Android.v8common.mk defines common V8_LOCAL_SRC_FILES
-# and V8_LOCAL_JS_LIBRARY_FILES
-V8_LOCAL_SRC_FILES :=
+# Android.v8common.mk defines V8_LOCAL_JS_LIBRARY_FILES, LOCAL_SRC_FILES,
+# LOCAL_CFLAGS, LOCAL_SRC_FILES_arch, and LOCAL_CFLAGS_arch
 V8_LOCAL_JS_LIBRARY_FILES :=
 V8_LOCAL_JS_EXPERIMENTAL_LIBRARY_FILES :=
 include $(LOCAL_PATH)/Android.v8common.mk
 
 # Target can only be linux
-V8_LOCAL_SRC_FILES += \
+LOCAL_SRC_FILES += \
   src/platform-linux.cc \
   src/platform-posix.cc
 
-ifeq ($(TARGET_ARCH),x86)
-V8_LOCAL_SRC_FILES += src/atomicops_internals_x86_gcc.cc
-endif
-
-LOCAL_SRC_FILES := $(V8_LOCAL_SRC_FILES)
+LOCAL_SRC_FILES_x86 += src/atomicops_internals_x86_gcc.cc
 
 LOCAL_JS_LIBRARY_FILES := $(addprefix $(LOCAL_PATH)/, $(V8_LOCAL_JS_LIBRARY_FILES))
 LOCAL_JS_EXPERIMENTAL_LIBRARY_FILES := $(addprefix $(LOCAL_PATH)/, $(V8_LOCAL_JS_EXPERIMENTAL_LIBRARY_FILES))
 
-# Copy js2c.py to intermediates directory and invoke there to avoid generating
-# jsmin.pyc in the source directory
-JS2C_PY := $(intermediates)/js2c.py $(intermediates)/jsmin.py
-$(JS2C_PY): $(intermediates)/%.py : $(LOCAL_PATH)/tools/%.py | $(ACP)
+# Copy js2c.py to generated sources directory and invoke there to avoid
+# generating jsmin.pyc in the source directory
+JS2C_PY := $(generated_sources)/js2c.py $(generated_sources)/jsmin.py
+$(JS2C_PY): $(generated_sources)/%.py : $(LOCAL_PATH)/tools/%.py | $(ACP)
 	@echo "Copying $@"
 	$(copy-file-to-target)
 
 # Generate libraries.cc
-GEN1 := $(intermediates)/libraries.cc
-$(GEN1): SCRIPT := $(intermediates)/js2c.py
+GEN1 := $(generated_sources)/libraries.cc
+$(GEN1): SCRIPT := $(generated_sources)/js2c.py
 $(GEN1): $(LOCAL_JS_LIBRARY_FILES) $(JS2C_PY)
 	@echo "Generating libraries.cc"
 	@mkdir -p $(dir $@)
 	python $(SCRIPT) $(GEN1) CORE off $(LOCAL_JS_LIBRARY_FILES)
-V8_GENERATED_LIBRARIES := $(intermediates)/libraries.cc
+V8_GENERATED_LIBRARIES := $(generated_sources)/libraries.cc
 
 # Generate experimental-libraries.cc
-GEN2 := $(intermediates)/experimental-libraries.cc
-$(GEN2): SCRIPT := $(intermediates)/js2c.py
+GEN2 := $(generated_sources)/experimental-libraries.cc
+$(GEN2): SCRIPT := $(generated_sources)/js2c.py
 $(GEN2): $(LOCAL_JS_EXPERIMENTAL_LIBRARY_FILES) $(JS2C_PY)
 	@echo "Generating experimental-libraries.cc"
 	@mkdir -p $(dir $@)
 	python $(SCRIPT) $(GEN2) EXPERIMENTAL off $(LOCAL_JS_EXPERIMENTAL_LIBRARY_FILES)
-V8_GENERATED_LIBRARIES += $(intermediates)/experimental-libraries.cc
+V8_GENERATED_LIBRARIES += $(generated_sources)/experimental-libraries.cc
 
 LOCAL_GENERATED_SOURCES += $(V8_GENERATED_LIBRARIES)
 
 # Generate snapshot.cc
 ifeq ($(ENABLE_V8_SNAPSHOT),true)
-SNAP_GEN := $(intermediates)/snapshot.cc
+
+SNAP_GEN := $(generated_sources)/snapshot_$(TARGET_ARCH).cc
 MKSNAPSHOT := $(HOST_OUT_EXECUTABLES)/mksnapshot.$(TARGET_ARCH)
-$(SNAP_GEN): PRIVATE_CUSTOM_TOOL = $(MKSNAPSHOT) --logfile $(intermediates)/v8.log $(SNAP_GEN)
+$(SNAP_GEN): PRIVATE_CUSTOM_TOOL = $(MKSNAPSHOT) --logfile $(generated_sources)/v8.log $(SNAP_GEN)
 $(SNAP_GEN): $(MKSNAPSHOT)
 	$(transform-generated-source)
-LOCAL_GENERATED_SOURCES += $(SNAP_GEN)
+LOCAL_GENERATED_SOURCES_$(TARGET_ARCH) += $(SNAP_GEN)
+
+ifdef TARGET_2ND_ARCH
+SNAP_GEN := $(generated_sources)/snapshot_$(TARGET_2ND_ARCH).cc
+MKSNAPSHOT := $(HOST_OUT_EXECUTABLES)/mksnapshot.$(TARGET_2ND_ARCH)
+$(SNAP_GEN): PRIVATE_CUSTOM_TOOL = $(MKSNAPSHOT) --logfile $(generated_sources)/v8.log $(SNAP_GEN)
+$(SNAP_GEN): $(MKSNAPSHOT)
+	$(transform-generated-source)
+LOCAL_GENERATED_SOURCES_$(TARGET_2ND_ARCH) += $(SNAP_GEN)
+endif # TARGET_2ND_ARCH
+
 else
 LOCAL_SRC_FILES += \
   src/snapshot-empty.cc
@@ -90,20 +96,14 @@
 	-DV8_NATIVE_REGEXP \
 	-Wno-unused-parameter
 
-ifeq ($(TARGET_ARCH),arm)
-	LOCAL_CFLAGS += -DARM -DV8_TARGET_ARCH_ARM
-endif
+LOCAL_CFLAGS_arm += -DARM -DV8_TARGET_ARCH_ARM
 
-ifeq ($(TARGET_ARCH),mips)
-	LOCAL_CFLAGS += -DV8_TARGET_ARCH_MIPS
-	LOCAL_CFLAGS += -Umips
-	LOCAL_CFLAGS += -finline-limit=64
-	LOCAL_CFLAGS += -fno-strict-aliasing
-endif
+LOCAL_CFLAGS_mips += -DV8_TARGET_ARCH_MIPS
+LOCAL_CFLAGS_mips += -Umips
+LOCAL_CFLAGS_mips += -finline-limit=64
+LOCAL_CFLAGS_mips += -fno-strict-aliasing
 
-ifeq ($(TARGET_ARCH),x86)
-	LOCAL_CFLAGS += -DV8_TARGET_ARCH_IA32
-endif
+LOCAL_CFLAGS_x86 += -DV8_TARGET_ARCH_IA32
 
 ifeq ($(DEBUG_V8),true)
 	LOCAL_CFLAGS += -DDEBUG -UNDEBUG
@@ -111,4 +111,6 @@
 
 LOCAL_C_INCLUDES += $(LOCAL_PATH)/src
 
+LOCAL_MODULE_TARGET_ARCH_WARN := $(V8_SUPPORTED_ARCH)
+
 include $(BUILD_STATIC_LIBRARY)
diff --git a/Android.mk b/Android.mk
index 148c60e..e6ea8db 100644
--- a/Android.mk
+++ b/Android.mk
@@ -17,6 +17,8 @@
 
 BASE_PATH := $(call my-dir)
 
+V8_SUPPORTED_ARCH := arm mips x86
+
 ifeq ($(TARGET_ARCH),arm)
     ifneq ($(strip $(ARCH_ARM_HAVE_ARMV7A)),true)
         $(warning WARNING: Building on ARM with non-ARMv7 variant. On ARM, V8 is well tested only on ARMv7.)
@@ -24,9 +26,15 @@
 endif
 
 # Build libv8 and d8
-ifneq ($(filter $(TARGET_ARCH),x86 arm mips),)
-    ENABLE_V8_SNAPSHOT = true
-    include $(BASE_PATH)/Android.mksnapshot.mk
-    include $(BASE_PATH)/Android.libv8.mk
-    include $(BASE_PATH)/Android.d8.mk
+
+ENABLE_V8_SNAPSHOT = true
+mksnapshot_arch := $(TARGET_ARCH)
+include $(BASE_PATH)/Android.mksnapshot.mk
+
+ifdef TARGET_2ND_ARCH
+mksnapshot_arch := $(TARGET_2ND_ARCH)
+include $(BASE_PATH)/Android.mksnapshot.mk
 endif
+
+include $(BASE_PATH)/Android.libv8.mk
+include $(BASE_PATH)/Android.d8.mk
diff --git a/Android.mksnapshot.mk b/Android.mksnapshot.mk
index c945314..67b56be 100644
--- a/Android.mksnapshot.mk
+++ b/Android.mksnapshot.mk
@@ -1,78 +1,75 @@
 ##
 # mksnapshot
 # ===================================================
+
+ifneq (,$(filter $(mksnapshot_arch),$(V8_SUPPORTED_ARCH)))
+
 LOCAL_PATH := $(call my-dir)
 include $(CLEAR_VARS)
 
 # Set up the target identity
 LOCAL_IS_HOST_MODULE := true
-LOCAL_MODULE := mksnapshot.$(TARGET_ARCH)
+LOCAL_MODULE := mksnapshot.$(mksnapshot_arch)
 LOCAL_MODULE_CLASS := EXECUTABLES
 LOCAL_MODULE_TAGS = optional
-intermediates := $(call local-intermediates-dir)
+generated_sources := $(call local-generated-sources-dir)
 
-V8_LOCAL_SRC_FILES :=
+
 V8_LOCAL_JS_LIBRARY_FILES :=
 V8_LOCAL_JS_EXPERIMENTAL_LIBRARY_FILES :=
 include $(LOCAL_PATH)/Android.v8common.mk
 
-V8_LOCAL_SRC_FILES += \
+LOCAL_SRC_FILES += \
   src/mksnapshot.cc \
   src/snapshot-empty.cc
 
-ifeq ($(TARGET_ARCH),arm)
-V8_LOCAL_SRC_FILES += src/arm/simulator-arm.cc
-endif
+LOCAL_SRC_FILES_arm += src/arm/simulator-arm.cc
 
-ifeq ($(TARGET_ARCH),mips)
-V8_LOCAL_SRC_FILES += src/mips/simulator-mips.cc
+LOCAL_SRC_FILES_mips += src/mips/simulator-mips.cc
 
-endif
 
 ifeq ($(HOST_ARCH),x86)
-V8_LOCAL_SRC_FILES += src/atomicops_internals_x86_gcc.cc
+LOCAL_SRC_FILES += src/atomicops_internals_x86_gcc.cc
 endif
 
 ifeq ($(HOST_OS),linux)
-V8_LOCAL_SRC_FILES += \
+LOCAL_SRC_FILES += \
   src/platform-linux.cc \
   src/platform-posix.cc
 endif
 ifeq ($(HOST_OS),darwin)
-V8_LOCAL_SRC_FILES += \
+LOCAL_SRC_FILES += \
   src/platform-macos.cc \
   src/platform-posix.cc
 endif
 
-LOCAL_SRC_FILES := $(V8_LOCAL_SRC_FILES)
-
 LOCAL_JS_LIBRARY_FILES := $(addprefix $(LOCAL_PATH)/, $(V8_LOCAL_JS_LIBRARY_FILES))
 LOCAL_JS_EXPERIMENTAL_LIBRARY_FILES := $(addprefix $(LOCAL_PATH)/, $(V8_LOCAL_JS_EXPERIMENTAL_LIBRARY_FILES))
 
-# Copy js2c.py to intermediates directory and invoke there to avoid generating
-# jsmin.pyc in the source directory
-JS2C_PY := $(intermediates)/js2c.py $(intermediates)/jsmin.py
-$(JS2C_PY): $(intermediates)/%.py : $(LOCAL_PATH)/tools/%.py | $(ACP)
+# Copy js2c.py to generated sources directory and invoke there to avoid
+# generating jsmin.pyc in the source directory
+JS2C_PY := $(generated_sources)/js2c.py $(generated_sources)/jsmin.py
+$(JS2C_PY): $(generated_sources)/%.py : $(LOCAL_PATH)/tools/%.py | $(ACP)
 	@echo "Copying $@"
 	$(copy-file-to-target)
 
 # Generate libraries.cc
-GEN3 := $(intermediates)/libraries.cc
-$(GEN3): SCRIPT := $(intermediates)/js2c.py
+GEN3 := $(generated_sources)/libraries.cc
+$(GEN3): SCRIPT := $(generated_sources)/js2c.py
 $(GEN3): $(LOCAL_JS_LIBRARY_FILES) $(JS2C_PY)
 	@echo "Generating libraries.cc"
 	@mkdir -p $(dir $@)
 	python $(SCRIPT) $(GEN3) CORE off $(LOCAL_JS_LIBRARY_FILES)
-LOCAL_GENERATED_SOURCES := $(intermediates)/libraries.cc
+LOCAL_GENERATED_SOURCES := $(generated_sources)/libraries.cc
 
 # Generate experimental-libraries.cc
-GEN4 := $(intermediates)/experimental-libraries.cc
-$(GEN4): SCRIPT := $(intermediates)/js2c.py
+GEN4 := $(generated_sources)/experimental-libraries.cc
+$(GEN4): SCRIPT := $(generated_sources)/js2c.py
 $(GEN4): $(LOCAL_JS_EXPERIMENTAL_LIBRARY_FILES) $(JS2C_PY)
 	@echo "Generating experimental-libraries.cc"
 	@mkdir -p $(dir $@)
 	python $(SCRIPT) $(GEN4) EXPERIMENTAL off $(LOCAL_JS_EXPERIMENTAL_LIBRARY_FILES)
-LOCAL_GENERATED_SOURCES += $(intermediates)/experimental-libraries.cc
+LOCAL_GENERATED_SOURCES += $(generated_sources)/experimental-libraries.cc
 
 LOCAL_CFLAGS := \
 	-Wno-endif-labels \
@@ -86,32 +83,29 @@
 	-DV8_NATIVE_REGEXP \
 	-Wno-unused-parameter
 
-ifeq ($(TARGET_ARCH),arm)
-  LOCAL_CFLAGS += -DV8_TARGET_ARCH_ARM
+LOCAL_CFLAGS_arm += -DV8_TARGET_ARCH_ARM
+
+ifeq ($(ARCH_ARM_HAVE_VFP),true)
+    LOCAL_CFLAGS_arm += -DCAN_USE_VFP_INSTRUCTIONS -DCAN_USE_ARMV7_INSTRUCTIONS
 endif
 
-ifeq ($(TARGET_CPU_ABI),armeabi-v7a)
-    ifeq ($(ARCH_ARM_HAVE_VFP),true)
-        LOCAL_CFLAGS += -DCAN_USE_VFP_INSTRUCTIONS -DCAN_USE_ARMV7_INSTRUCTIONS
-    endif
-endif
+LOCAL_CFLAGS_mips += -DV8_TARGET_ARCH_MIPS
+LOCAL_CFLAGS_mips += -DCAN_USE_FPU_INSTRUCTIONS
+LOCAL_CFLAGS_mips += -Umips
+LOCAL_CFLAGS_mips += -finline-limit=64
+LOCAL_CFLAGS_mips += -fno-strict-aliasing
 
-ifeq ($(TARGET_ARCH),mips)
-  LOCAL_CFLAGS += -DV8_TARGET_ARCH_MIPS
-  LOCAL_CFLAGS += -DCAN_USE_FPU_INSTRUCTIONS
-  LOCAL_CFLAGS += -Umips
-  LOCAL_CFLAGS += -finline-limit=64
-  LOCAL_CFLAGS += -fno-strict-aliasing
-endif
-
-ifeq ($(TARGET_ARCH),x86)
-  LOCAL_CFLAGS += -DV8_TARGET_ARCH_IA32
-endif
+LOCAL_CFLAGS_x86 += -DV8_TARGET_ARCH_IA32
 
 ifeq ($(DEBUG_V8),true)
 	LOCAL_CFLAGS += -DDEBUG -UNDEBUG
 endif
 
+# LOCAL_SRC_FILES_arch only applies to target modules, but we want them
+# for a host module, so append them manually
+LOCAL_SRC_FILES += $(LOCAL_SRC_FILES_$(mksnapshot_arch))
+LOCAL_CFLAGS += $(LOCAL_CFLAGS_$(mksnapshot_arch))
+
 LOCAL_C_INCLUDES := $(LOCAL_PATH)/src
 
 # This is on host.
@@ -120,3 +114,6 @@
 LOCAL_STATIC_LIBRARIES := liblog
 
 include $(BUILD_HOST_EXECUTABLE)
+else
+$(warning mksnapshot.$(mksnapshot_arch): architecture $(mksnapshot_arch) not supported)
+endif
diff --git a/Android.v8common.mk b/Android.v8common.mk
index 4c77a90..d1ffcaf 100644
--- a/Android.v8common.mk
+++ b/Android.v8common.mk
@@ -1,6 +1,6 @@
 LOCAL_CPP_EXTENSION := .cc
 
-V8_LOCAL_SRC_FILES := \
+LOCAL_SRC_FILES := \
 	src/accessors.cc \
 	src/allocation.cc \
 	src/api.cc \
@@ -100,8 +100,7 @@
 	src/version.cc \
 	src/zone.cc
 
-ifeq ($(TARGET_ARCH),arm)
-  V8_LOCAL_SRC_FILES += \
+LOCAL_SRC_FILES_arm += \
 		src/arm/assembler-arm.cc \
 		src/arm/builtins-arm.cc \
 		src/arm/codegen-arm.cc \
@@ -120,10 +119,8 @@
 		src/arm/macro-assembler-arm.cc \
 		src/arm/regexp-macro-assembler-arm.cc \
 		src/arm/stub-cache-arm.cc
-endif
 
-ifeq ($(TARGET_ARCH),mips)
-  V8_LOCAL_SRC_FILES += \
+LOCAL_SRC_FILES_mips += \
 		src/mips/assembler-mips.cc \
 		src/mips/builtins-mips.cc \
 		src/mips/codegen-mips.cc \
@@ -142,10 +139,8 @@
 		src/mips/macro-assembler-mips.cc \
 		src/mips/regexp-macro-assembler-mips.cc \
 		src/mips/stub-cache-mips.cc
-endif
 
-ifeq ($(TARGET_ARCH),x86)
-  V8_LOCAL_SRC_FILES += \
+LOCAL_SRC_FILES_x86 += \
 		src/ia32/assembler-ia32.cc \
 		src/ia32/builtins-ia32.cc \
 		src/ia32/codegen-ia32.cc \
@@ -163,11 +158,10 @@
 		src/ia32/macro-assembler-ia32.cc \
 		src/ia32/regexp-macro-assembler-ia32.cc \
 		src/ia32/stub-cache-ia32.cc
-endif
 
 # Enable DEBUG option.
 ifeq ($(DEBUG_V8),true)
-  V8_LOCAL_SRC_FILES += \
+  LOCAL_SRC_FILES += \
 		src/objects-debug.cc \
 		src/prettyprinter.cc \
 		src/regexp-macro-assembler-tracer.cc
@@ -202,4 +196,3 @@
 V8_LOCAL_JS_EXPERIMENTAL_LIBRARY_FILES := \
 	src/collection.js \
 	src/proxy.js
-