Build rules for Renderscript compatibility library.

Bug: 7419958
Change-Id: I2e0f0bb632e6ff22b2cf1a1b96b28364637995cc
diff --git a/core/clear_vars.mk b/core/clear_vars.mk
index 853f9a0..a566768 100644
--- a/core/clear_vars.mk
+++ b/core/clear_vars.mk
@@ -110,6 +110,7 @@
 LOCAL_RENDERSCRIPT_INCLUDES:=
 LOCAL_RENDERSCRIPT_INCLUDES_OVERRIDE:=
 LOCAL_RENDERSCRIPT_CC:=
+LOCAL_RENDERSCRIPT_COMPATIBILITY:=
 LOCAL_RENDERSCRIPT_FLAGS:=
 LOCAL_RENDERSCRIPT_TARGET_API:=
 LOCAL_BUILD_HOST_DEX:=
diff --git a/core/config.mk b/core/config.mk
index 1f92443..9746198 100644
--- a/core/config.mk
+++ b/core/config.mk
@@ -308,6 +308,7 @@
 JAVATAGS := build/tools/java-event-log-tags.py
 LLVM_RS_CC := $(HOST_OUT_EXECUTABLES)/llvm-rs-cc$(HOST_EXECUTABLE_SUFFIX)
 LLVM_RS_LINK := $(HOST_OUT_EXECUTABLES)/llvm-rs-link$(HOST_EXECUTABLE_SUFFIX)
+BCC_COMPAT := $(HOST_OUT_EXECUTABLES)/bcc_compat$(HOST_EXECUTABLE_SUFFIX)
 DEXOPT := $(HOST_OUT_EXECUTABLES)/dexopt$(HOST_EXECUTABLE_SUFFIX)
 DEXPREOPT := dalvik/tools/dex-preopt
 LINT := prebuilts/sdk/tools/lint
diff --git a/core/definitions.mk b/core/definitions.mk
index 319b63e..96cc0cc 100644
--- a/core/definitions.mk
+++ b/core/definitions.mk
@@ -819,6 +819,16 @@
 $(hide) touch $@
 endef
 
+define transform-bc-to-so
+@echo "Renderscript compatibility"
+$(hide) mkdir -p $(dir $@)
+$(hide) $(BCC_COMPAT) -o $(dir $@)/$(notdir $(<:.bc=.o)) -fPIC -shared \
+	-rt-path $(TARGET_OUT_SHARED_LIBRARIES)/libclcore.bc $<
+$(hide) $(PRIVATE_CXX) -shared -Wl,-soname,$(notdir $@) \
+	$(dir $@)/$(notdir $(<:.bc=.o)) -o $@ -L prebuilts/gcc/ \
+	-L $(TARGET_OUT_INTERMEDIATE_LIBRARIES) -lRSSupport -lm
+endef
+
 ###########################################################
 ## Commands to compile RenderScript to C++
 ###########################################################
diff --git a/core/java.mk b/core/java.mk
index 222106c..ba7a45c 100644
--- a/core/java.mk
+++ b/core/java.mk
@@ -195,6 +195,26 @@
 $(RenderScript_file_stamp): $(renderscript_sources_fullpath) $(LOCAL_RENDERSCRIPT_CC)
 	$(transform-renderscripts-to-java-and-bc)
 
+ifneq ($(LOCAL_RENDERSCRIPT_COMPATIBILITY),)
+bc_files := $(patsubst %.fs,%.bc, $(patsubst %.rs,%.bc, $(notdir $(renderscript_sources))))
+rs_generated_bc := $(addprefix \
+    $(renderscript_intermediate)/res/raw/, $(bc_files))
+
+rs_compatibility_jni_libs := $(addprefix \
+    $(renderscript_intermediate)/lib, \
+    $(patsubst %.bc,%.so, $(bc_files)))
+
+$(rs_generated_bc) : $(RenderScript_file_stamp)
+
+$(rs_compatibility_jni_libs): $(RenderScript_file_stamp)
+$(rs_compatibility_jni_libs): $(BCC_COMPAT)
+$(rs_compatibility_jni_libs): PRIVATE_CXX := $(TARGET_CXX)
+$(rs_compatibility_jni_libs): $(renderscript_intermediate)/lib%.so: \
+    $(renderscript_intermediate)/res/raw/%.bc
+	$(transform-bc-to-so)
+
+endif
+
 # include the dependency files (.d) generated by llvm-rs-cc.
 renderscript_generated_dep_files := $(addprefix $(renderscript_intermediate)/, \
     $(patsubst %.fs,%.d, $(patsubst %.rs,%.d, $(notdir $(renderscript_sources)))))
diff --git a/core/package.mk b/core/package.mk
index 3af1afb..c0bc7d8 100644
--- a/core/package.mk
+++ b/core/package.mk
@@ -191,6 +191,8 @@
 endif # EMMA_INSTRUMENT_STATIC
 endif # LOCAL_EMMA_INSTRUMENT
 
+rs_compatibility_jni_libs :=
+
 #################################
 include $(BUILD_SYSTEM)/java.mk
 #################################
@@ -324,6 +326,12 @@
       $(addsuffix $(so_suffix), \
         $(LOCAL_JNI_SHARED_LIBRARIES)))
 
+# Include RS dynamically-generated libraries as well
+# Keep this ifneq, as the += otherwise adds spaces that need to be stripped.
+ifneq ($(rs_compatibility_jni_libs),)
+jni_shared_libraries += $(rs_compatibility_jni_libs)
+endif
+
 # App explicitly requires the prebuilt NDK libstlport_shared.so.
 # libstlport_shared.so should never go to the system image.
 # Instead it should be packaged into the apk.