Convert more of libRS* to Android.bp

See build/soong/README.md for more information.

This reapplies If935ce5cc04da7801210acb49f0a9ed15fcf5889 with the
support modules disabled for unbundled builds to avoid conflicts
with the prebuilts in prebuilts/sdk/renderscript.

Also moves OVERRIDE_RS_DRIVER to be set for libRS_internal.

Test: m -j checkbuild
Change-Id: If935ce5cc04da7801210acb49f0a9ed15fcf5889
Merged-In: Ia98501a471ef5f090446c9fbe2dd1d3422021a6f
(cherry picked from commit e5b2262c7337d13cdfd6852614c1743c19381164)
diff --git a/Android.bp b/Android.bp
index 15efc6d..5835246 100644
--- a/Android.bp
+++ b/Android.bp
@@ -1,20 +1,11 @@
-subdirs = ["cpp"]
-
 cc_library_headers {
     name: "rs-headers",
     export_include_dirs: ["."],
     sdk_version: "9",
 }
 
-cc_library_shared {
-    name: "libRS",
-
-    srcs: [
-        "rsApiStubs.cpp",
-        "rsHidlAdaptation.cpp",
-        "rsFallbackAdaptation.cpp",
-    ],
-
+cc_defaults {
+    name: "rs_defaults",
     cflags: [
         "-Werror",
         "-Wall",
@@ -22,6 +13,211 @@
         "-Wno-unused-parameter",
         "-Wno-unused-variable",
     ],
+}
+
+cc_library_shared {
+    name: "libRSDriver",
+    defaults: ["rs_defaults"],
+
+    srcs: [
+        "driver/rsdAllocation.cpp",
+        "driver/rsdBcc.cpp",
+        "driver/rsdCore.cpp",
+        "driver/rsdElement.cpp",
+        "driver/rsdFrameBuffer.cpp",
+        "driver/rsdFrameBufferObj.cpp",
+        "driver/rsdGL.cpp",
+        "driver/rsdMesh.cpp",
+        "driver/rsdMeshObj.cpp",
+        "driver/rsdProgram.cpp",
+        "driver/rsdProgramRaster.cpp",
+        "driver/rsdProgramStore.cpp",
+        "driver/rsdRuntimeStubs.cpp",
+        "driver/rsdSampler.cpp",
+        "driver/rsdScriptGroup.cpp",
+        "driver/rsdShader.cpp",
+        "driver/rsdShaderCache.cpp",
+        "driver/rsdType.cpp",
+        "driver/rsdVertexArray.cpp",
+    ],
+
+    shared_libs: [
+        "libRS_internal",
+        "libRSCpuRef",
+
+        "liblog",
+        "libEGL",
+        "libGLESv1_CM",
+        "libGLESv2",
+
+        "libui",
+        "libgui",
+        "libandroid",
+
+        "libbcinfo",
+    ],
+}
+
+// Build rsg-generator ====================
+
+cc_binary_host {
+    name: "rsg-generator",
+
+    srcs: [
+        "spec.l",
+        "rsg_generator.c",
+    ],
+
+    stl: "none",
+    sanitize: {
+        never: true,
+    },
+}
+
+// Generate custom headers
+gensrcs {
+    name: "rs_generated_headers",
+    tools: ["rsg-generator"],
+    tool_files: [
+        "rs.spec",
+        "rsg.spec",
+    ],
+    cmd: "cat $(location rs.spec) $(location rsg.spec) | $(location rsg-generator) $(in) $(out)",
+    output_extension: "h",
+    srcs: [
+        "rsgApiStructs.h_rsg",
+        "rsgApiFuncDecl.h_rsg",
+    ],
+    export_include_dirs: ["."],
+}
+
+gensrcs {
+    name: "rs_generated_sources",
+    tools: ["rsg-generator"],
+    tool_files: [
+        "rs.spec",
+        "rsg.spec",
+    ],
+    cmd: "cat $(location rs.spec) $(location rsg.spec) | $(location rsg-generator) $(in) $(out)",
+    output_extension: "cpp",
+    srcs: [
+        "rsgApi.cpp_rsg",
+        "rsgApiReplay.cpp_rsg",
+    ],
+}
+
+cc_library_shared {
+    name: "libRS_internal",
+    defaults: ["rs_defaults"],
+
+    srcs: [
+        "rsApiAllocation.cpp",
+        "rsApiContext.cpp",
+        "rsApiDevice.cpp",
+        "rsApiElement.cpp",
+        "rsApiFileA3D.cpp",
+        "rsApiMesh.cpp",
+        "rsApiType.cpp",
+        "rsAllocation.cpp",
+        "rsAnimation.cpp",
+        "rsComponent.cpp",
+        "rsContext.cpp",
+        "rsClosure.cpp",
+        "rsCppUtils.cpp",
+        "rsDevice.cpp",
+        "rsDriverLoader.cpp",
+        "rsElement.cpp",
+        "rsFBOCache.cpp",
+        "rsFifoSocket.cpp",
+        "rsFileA3D.cpp",
+        "rsFont.cpp",
+        "rsGrallocConsumer.cpp",
+        "rsObjectBase.cpp",
+        "rsMatrix2x2.cpp",
+        "rsMatrix3x3.cpp",
+        "rsMatrix4x4.cpp",
+        "rsMesh.cpp",
+        "rsMutex.cpp",
+        "rsProgram.cpp",
+        "rsProgramFragment.cpp",
+        "rsProgramStore.cpp",
+        "rsProgramRaster.cpp",
+        "rsProgramVertex.cpp",
+        "rsSampler.cpp",
+        "rsScript.cpp",
+        "rsScriptC.cpp",
+        "rsScriptC_Lib.cpp",
+        "rsScriptC_LibGL.cpp",
+        "rsScriptGroup.cpp",
+        "rsScriptGroup2.cpp",
+        "rsScriptIntrinsic.cpp",
+        "rsSignal.cpp",
+        "rsStream.cpp",
+        "rsThreadIO.cpp",
+        "rsType.cpp",
+    ],
+
+    generated_sources: ["rs_generated_sources"],
+    generated_headers: ["rs_generated_headers"],
+
+    shared_libs: [
+        "liblog",
+        "libutils",
+        "libEGL",
+        "libGLESv1_CM",
+        "libGLESv2",
+
+        "libdl",
+        "libgui",
+        "libui",
+
+        "libft2",
+        "libpng",
+
+        "libbcinfo",
+        "libmediandk",
+    ],
+
+    // These runtime modules, including libcompiler_rt.so, are required for
+    // RenderScript.
+    required: [
+        "libclcore.bc",
+        "libclcore_debug.bc",
+        "libclcore_g.bc",
+        "libcompiler_rt",
+    ],
+
+    arch: {
+        x86: {
+            required: ["libclcore_x86.bc"],
+        },
+        x86_64: {
+            required: ["libclcore_x86.bc"],
+        },
+
+        arm: {
+            neon: {
+                required: ["libclcore_neon.bc"],
+            },
+        },
+    },
+
+    product_variables: {
+        override_rs_driver: {
+            cflags: ["-DOVERRIDE_RS_DRIVER=%s"],
+        },
+    },
+}
+
+cc_library_shared {
+    name: "libRS",
+    defaults: ["rs_defaults"],
+
+    srcs: [
+        "rsApiStubs.cpp",
+        "rsHidlAdaptation.cpp",
+        "rsFallbackAdaptation.cpp",
+    ],
 
     // Default CPU fallback
     required: [
@@ -45,10 +241,14 @@
     static_libs: ["libRSDispatch"],
 
     version_script: "libRS.map",
-
-    product_variables: {
-        override_rs_driver: {
-            cflags: ["-DOVERRIDE_RS_DRIVER=%s"],
-        },
-    },
 }
+
+build = [
+    "support.bp",
+]
+
+subdirs = [
+    "cpp",
+    "cpu_ref",
+    "support",
+]
diff --git a/Android.mk b/Android.mk
index 094d40f..ffd9be3 100644
--- a/Android.mk
+++ b/Android.mk
@@ -22,202 +22,5 @@
     host_cross_bcc_compat
 endif
 
-# Not building RenderScript modules in PDK builds, as libmediandk
-# is not available in PDK.
-ifneq ($(TARGET_BUILD_PDK), true)
-
-rs_base_CFLAGS := -Werror -Wall -Wextra \
-	-Wno-unused-parameter -Wno-unused-variable
-
-ifneq ($(OVERRIDE_RS_DRIVER),)
-  rs_base_CFLAGS += -DOVERRIDE_RS_DRIVER=$(OVERRIDE_RS_DRIVER)
-endif
-
-ifneq ($(DISABLE_RS_64_BIT_DRIVER),)
-  rs_base_CFLAGS += -DDISABLE_RS_64_BIT_DRIVER
-endif
-
-ifeq ($(RS_FIND_OFFSETS), true)
-  rs_base_CFLAGS += -DRS_FIND_OFFSETS
-endif
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := libRSDriver
-
-LOCAL_SRC_FILES:= \
-	driver/rsdAllocation.cpp \
-	driver/rsdBcc.cpp \
-	driver/rsdCore.cpp \
-	driver/rsdElement.cpp \
-	driver/rsdFrameBuffer.cpp \
-	driver/rsdFrameBufferObj.cpp \
-	driver/rsdGL.cpp \
-	driver/rsdMesh.cpp \
-	driver/rsdMeshObj.cpp \
-	driver/rsdProgram.cpp \
-	driver/rsdProgramRaster.cpp \
-	driver/rsdProgramStore.cpp \
-	driver/rsdRuntimeStubs.cpp \
-	driver/rsdSampler.cpp \
-	driver/rsdScriptGroup.cpp \
-	driver/rsdShader.cpp \
-	driver/rsdShaderCache.cpp \
-	driver/rsdType.cpp \
-	driver/rsdVertexArray.cpp
-
-
-LOCAL_SHARED_LIBRARIES += libRS_internal libRSCpuRef
-LOCAL_SHARED_LIBRARIES += liblog libEGL libGLESv1_CM libGLESv2
-LOCAL_SHARED_LIBRARIES += libui libgui libandroid
-
-LOCAL_SHARED_LIBRARIES += libbcinfo
-
-LOCAL_C_INCLUDES += frameworks/compile/libbcc/include
-
-LOCAL_CFLAGS += $(rs_base_CFLAGS)
-
-include $(BUILD_SHARED_LIBRARY)
-
-# Build rsg-generator ====================
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := rsg-generator
-
-# These symbols are normally defined by BUILD_XXX, but we need to define them
-# here so that local-intermediates-dir works.
-
-LOCAL_IS_HOST_MODULE := true
-LOCAL_MODULE_CLASS := EXECUTABLES
-intermediates := $(local-intermediates-dir)
-
-LOCAL_SRC_FILES:= \
-    spec.l \
-    rsg_generator.c
-
-LOCAL_CXX_STL := none
-LOCAL_SANITIZE := never
-
-include $(BUILD_HOST_EXECUTABLE)
-
-RSG_GENERATOR:=$(LOCAL_BUILT_MODULE)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := libRS_internal
-
-LOCAL_MODULE_CLASS := SHARED_LIBRARIES
-generated_sources:= $(local-generated-sources-dir)
-
-# Generate custom headers
-
-GEN := $(addprefix $(generated_sources)/, \
-            rsgApiStructs.h \
-            rsgApiFuncDecl.h \
-        )
-
-$(GEN) : PRIVATE_PATH := $(LOCAL_PATH)
-$(GEN) : PRIVATE_CUSTOM_TOOL = cat $(PRIVATE_PATH)/rs.spec $(PRIVATE_PATH)/rsg.spec | $(RSG_GENERATOR) $< $@
-$(GEN) : $(RSG_GENERATOR) $(LOCAL_PATH)/rs.spec $(LOCAL_PATH)/rsg.spec
-$(GEN): $(generated_sources)/%.h : $(LOCAL_PATH)/%.h.rsg
-	$(transform-generated-source)
-
-# used in jni/Android.mk
-rs_generated_source += $(GEN)
-LOCAL_GENERATED_SOURCES += $(GEN)
-
-# Generate custom source files
-
-GEN := $(addprefix $(generated_sources)/, \
-            rsgApi.cpp \
-            rsgApiReplay.cpp \
-        )
-
-$(GEN) : PRIVATE_PATH := $(LOCAL_PATH)
-$(GEN) : PRIVATE_CUSTOM_TOOL = cat $(PRIVATE_PATH)/rs.spec $(PRIVATE_PATH)/rsg.spec | $(RSG_GENERATOR) $< $@
-$(GEN) : $(RSG_GENERATOR) $(LOCAL_PATH)/rs.spec $(LOCAL_PATH)/rsg.spec
-$(GEN): $(generated_sources)/%.cpp : $(LOCAL_PATH)/%.cpp.rsg
-	$(transform-generated-source)
-
-# used in jni/Android.mk
-rs_generated_source += $(GEN)
-
-LOCAL_GENERATED_SOURCES += $(GEN)
-
-LOCAL_SRC_FILES:= \
-	rsApiAllocation.cpp \
-	rsApiContext.cpp \
-	rsApiDevice.cpp \
-	rsApiElement.cpp \
-	rsApiFileA3D.cpp \
-	rsApiMesh.cpp \
-	rsApiType.cpp \
-	rsAllocation.cpp \
-	rsAnimation.cpp \
-	rsComponent.cpp \
-	rsContext.cpp \
-	rsClosure.cpp \
-	rsCppUtils.cpp \
-	rsDevice.cpp \
-	rsDriverLoader.cpp \
-	rsElement.cpp \
-	rsFBOCache.cpp \
-	rsFifoSocket.cpp \
-	rsFileA3D.cpp \
-	rsFont.cpp \
-	rsGrallocConsumer.cpp \
-	rsObjectBase.cpp \
-	rsMatrix2x2.cpp \
-	rsMatrix3x3.cpp \
-	rsMatrix4x4.cpp \
-	rsMesh.cpp \
-	rsMutex.cpp \
-	rsProgram.cpp \
-	rsProgramFragment.cpp \
-	rsProgramStore.cpp \
-	rsProgramRaster.cpp \
-	rsProgramVertex.cpp \
-	rsSampler.cpp \
-	rsScript.cpp \
-	rsScriptC.cpp \
-	rsScriptC_Lib.cpp \
-	rsScriptC_LibGL.cpp \
-	rsScriptGroup.cpp \
-	rsScriptGroup2.cpp \
-	rsScriptIntrinsic.cpp \
-	rsSignal.cpp \
-	rsStream.cpp \
-	rsThreadIO.cpp \
-	rsType.cpp
-
-LOCAL_SHARED_LIBRARIES += liblog libutils libEGL libGLESv1_CM libGLESv2
-LOCAL_SHARED_LIBRARIES += libdl libgui libui
-LOCAL_SHARED_LIBRARIES += libft2 libpng
-
-LOCAL_SHARED_LIBRARIES += libbcinfo libmediandk
-
-LOCAL_C_INCLUDES += frameworks/av/include/ndk
-
-LOCAL_CFLAGS += $(rs_base_CFLAGS)
-
-# These runtime modules, including libcompiler_rt.so, are required for
-# RenderScript.
-LOCAL_REQUIRED_MODULES := \
-	libclcore.bc \
-	libclcore_debug.bc \
-	libclcore_g.bc \
-	libcompiler_rt
-
-LOCAL_REQUIRED_MODULES_x86 += libclcore_x86.bc
-LOCAL_REQUIRED_MODULES_x86_64 += libclcore_x86.bc
-
-ifeq ($(ARCH_ARM_HAVE_NEON),true)
-  LOCAL_REQUIRED_MODULES_arm += libclcore_neon.bc
-endif
-
-LOCAL_MODULE_TAGS := optional
-
-include $(BUILD_SHARED_LIBRARY)
-
-endif # TARGET_BUILD_PDK
-
 include $(call all-makefiles-under,$(LOCAL_PATH))
 
diff --git a/cpu_ref/Android.bp b/cpu_ref/Android.bp
new file mode 100644
index 0000000..84b2b0b
--- /dev/null
+++ b/cpu_ref/Android.bp
@@ -0,0 +1,121 @@
+cc_library_shared {
+    name: "libRSCpuRef",
+    defaults: ["libbcc-targets"],
+
+    srcs: [
+        "rsCpuCore.cpp",
+        "rsCpuExecutable.cpp",
+        "rsCpuScript.cpp",
+        "rsCpuRuntimeMath.cpp",
+        "rsCpuScriptGroup.cpp",
+        "rsCpuScriptGroup2.cpp",
+        "rsCpuIntrinsic.cpp",
+        "rsCpuIntrinsic3DLUT.cpp",
+        "rsCpuIntrinsicBLAS.cpp",
+        "rsCpuIntrinsicBlend.cpp",
+        "rsCpuIntrinsicBlur.cpp",
+        "rsCpuIntrinsicColorMatrix.cpp",
+        "rsCpuIntrinsicConvolve3x3.cpp",
+        "rsCpuIntrinsicConvolve5x5.cpp",
+        "rsCpuIntrinsicHistogram.cpp",
+        "rsCpuIntrinsicResize.cpp",
+        "rsCpuIntrinsicLUT.cpp",
+        "rsCpuIntrinsicYuvToRGB.cpp",
+    ],
+
+    arch: {
+        arm64: {
+            cflags: [
+                "-DARCH_ARM_USE_INTRINSICS",
+                "-DARCH_ARM64_USE_INTRINSICS",
+                "-DARCH_ARM64_HAVE_NEON",
+            ],
+
+            srcs: [
+                "rsCpuIntrinsics_advsimd_3DLUT.S",
+                "rsCpuIntrinsics_advsimd_Convolve.S",
+                "rsCpuIntrinsics_advsimd_Blur.S",
+                "rsCpuIntrinsics_advsimd_ColorMatrix.S",
+                "rsCpuIntrinsics_advsimd_Resize.S",
+                "rsCpuIntrinsics_advsimd_YuvToRGB.S",
+                "rsCpuIntrinsics_advsimd_Blend.S",
+            ],
+        },
+
+        arm: {
+            cflags: [
+                "-DARCH_ARM_HAVE_VFP",
+                "-DARCH_ARM_USE_INTRINSICS",
+            ],
+
+            srcs: [
+                "rsCpuIntrinsics_neon_3DLUT.S",
+                "rsCpuIntrinsics_neon_Blend.S",
+                "rsCpuIntrinsics_neon_Blur.S",
+                "rsCpuIntrinsics_neon_Convolve.S",
+                "rsCpuIntrinsics_neon_ColorMatrix.S",
+                "rsCpuIntrinsics_neon_Resize.S",
+                "rsCpuIntrinsics_neon_YuvToRGB.S",
+            ],
+
+            asflags: ["-mfpu=neon"],
+
+            neon: {
+                cflags: [
+                    "-DARCH_ARM_HAVE_NEON",
+                ],
+            },
+        },
+
+        x86: {
+            ssse3: {
+                cflags: ["-DARCH_X86_HAVE_SSSE3"],
+                srcs: ["rsCpuIntrinsics_x86.cpp"],
+            },
+        },
+        x86_64: {
+            ssse3: {
+                cflags: ["-DARCH_X86_HAVE_SSSE3"],
+                srcs: ["rsCpuIntrinsics_x86.cpp"],
+            },
+        },
+    },
+
+    target: {
+        arm_on_x86: {
+            cflags: ["-DBUILD_ARM_FOR_X86"],
+        },
+    },
+
+    shared_libs: [
+        "libRS_internal",
+        "libc++",
+        "liblog",
+        "libz",
+
+        "libbcinfo",
+        "libblas",
+    ],
+    static_libs: ["libbnnmlowp"],
+
+    include_dirs: [
+        "frameworks/compile/libbcc/include",
+        "frameworks/rs",
+    ],
+
+    cflags: [
+        "-Werror",
+        "-Wall",
+        "-Wextra",
+        "-Wno-unused-parameter",
+        "-Wno-unused-variable",
+    ],
+
+    product_variables: {
+        pdk: {
+            // Not building RenderScript modules in PDK builds, as libmediandk
+            // is not available in PDK.
+            enabled: false,
+        },
+    },
+}
diff --git a/cpu_ref/Android.mk b/cpu_ref/Android.mk
deleted file mode 100644
index 9b3e9d3..0000000
--- a/cpu_ref/Android.mk
+++ /dev/null
@@ -1,103 +0,0 @@
-LOCAL_PATH:=$(call my-dir)
-
-# Not building RenderScript modules in PDK builds, as libmediandk
-# is not available in PDK.
-ifneq ($(TARGET_BUILD_PDK), true)
-
-rs_base_CFLAGS := -Werror -Wall -Wextra \
-				  -Wno-unused-parameter -Wno-unused-variable \
-				  -std=c++11
-
-ifneq ($(OVERRIDE_RS_DRIVER),)
-  rs_base_CFLAGS += -DOVERRIDE_RS_DRIVER=$(OVERRIDE_RS_DRIVER)
-endif
-
-ifeq ($(BUILD_ARM_FOR_X86),true)
-  rs_base_CFLAGS += -DBUILD_ARM_FOR_X86
-endif
-
-include $(CLEAR_VARS)
-ifneq ($(HOST_OS),windows)
-endif
-LOCAL_MODULE := libRSCpuRef
-LOCAL_MODULE_TARGET_ARCH := arm mips mips64 x86 x86_64 arm64
-
-LOCAL_SRC_FILES:= \
-        rsCpuCore.cpp \
-        rsCpuExecutable.cpp \
-        rsCpuScript.cpp \
-        rsCpuRuntimeMath.cpp \
-        rsCpuScriptGroup.cpp \
-        rsCpuScriptGroup2.cpp \
-        rsCpuIntrinsic.cpp \
-        rsCpuIntrinsic3DLUT.cpp \
-        rsCpuIntrinsicBLAS.cpp \
-        rsCpuIntrinsicBlend.cpp \
-        rsCpuIntrinsicBlur.cpp \
-        rsCpuIntrinsicColorMatrix.cpp \
-        rsCpuIntrinsicConvolve3x3.cpp \
-        rsCpuIntrinsicConvolve5x5.cpp \
-        rsCpuIntrinsicHistogram.cpp \
-        rsCpuIntrinsicResize.cpp \
-        rsCpuIntrinsicLUT.cpp \
-        rsCpuIntrinsicYuvToRGB.cpp
-
-LOCAL_CFLAGS_arm64 += -DARCH_ARM_USE_INTRINSICS -DARCH_ARM64_USE_INTRINSICS -DARCH_ARM64_HAVE_NEON
-
-ifeq ($(RS_DISABLE_A53_WORKAROUND),true)
-LOCAL_CFLAGS_arm64 += -DDISABLE_A53_WORKAROUND
-endif
-
-LOCAL_SRC_FILES_arm64 += \
-    rsCpuIntrinsics_advsimd_3DLUT.S \
-    rsCpuIntrinsics_advsimd_Convolve.S \
-    rsCpuIntrinsics_advsimd_Blur.S \
-    rsCpuIntrinsics_advsimd_ColorMatrix.S \
-    rsCpuIntrinsics_advsimd_Resize.S \
-    rsCpuIntrinsics_advsimd_YuvToRGB.S \
-    rsCpuIntrinsics_advsimd_Blend.S
-
-ifeq ($(ARCH_ARM_HAVE_NEON),true)
-    LOCAL_CFLAGS_arm += -DARCH_ARM_HAVE_NEON
-endif
-
-ifeq ($(ARCH_ARM_HAVE_VFP),true)
-    LOCAL_CFLAGS_arm += -DARCH_ARM_HAVE_VFP -DARCH_ARM_USE_INTRINSICS
-    LOCAL_SRC_FILES_arm += \
-    rsCpuIntrinsics_neon_3DLUT.S \
-    rsCpuIntrinsics_neon_Blend.S \
-    rsCpuIntrinsics_neon_Blur.S \
-    rsCpuIntrinsics_neon_Convolve.S \
-    rsCpuIntrinsics_neon_ColorMatrix.S \
-    rsCpuIntrinsics_neon_Resize.S \
-    rsCpuIntrinsics_neon_YuvToRGB.S \
-
-    LOCAL_ASFLAGS_arm := -mfpu=neon
-endif
-
-ifeq ($(ARCH_X86_HAVE_SSSE3),true)
-    LOCAL_CFLAGS_x86 += -DARCH_X86_HAVE_SSSE3
-    LOCAL_SRC_FILES_x86 += \
-    rsCpuIntrinsics_x86.cpp
-    LOCAL_CFLAGS_x86_64 += -DARCH_X86_HAVE_SSSE3
-    LOCAL_SRC_FILES_x86_64 += \
-    rsCpuIntrinsics_x86.cpp
-endif
-
-LOCAL_SHARED_LIBRARIES += libRS_internal libc++ liblog libz
-LOCAL_SHARED_LIBRARIES += libbcinfo libblas
-LOCAL_STATIC_LIBRARIES := libbnnmlowp
-
-LOCAL_C_INCLUDES += frameworks/compile/libbcc/include
-LOCAL_C_INCLUDES += frameworks/rs
-LOCAL_C_INCLUDES += external/cblas/include
-LOCAL_C_INCLUDES += external/gemmlowp/eight_bit_int_gemm
-LOCAL_C_INCLUDES += external/zlib
-
-include frameworks/compile/libbcc/libbcc-targets.mk
-
-LOCAL_CFLAGS += $(rs_base_CFLAGS)
-
-include $(BUILD_SHARED_LIBRARY)
-
-endif # TARGET_BUILD_PDK
diff --git a/rsgApi.cpp.rsg b/rsgApi.cpp_rsg
similarity index 100%
rename from rsgApi.cpp.rsg
rename to rsgApi.cpp_rsg
diff --git a/rsgApiFuncDecl.h.rsg b/rsgApiFuncDecl.h_rsg
similarity index 100%
rename from rsgApiFuncDecl.h.rsg
rename to rsgApiFuncDecl.h_rsg
diff --git a/rsgApiReplay.cpp.rsg b/rsgApiReplay.cpp_rsg
similarity index 100%
rename from rsgApiReplay.cpp.rsg
rename to rsgApiReplay.cpp_rsg
diff --git a/rsgApiStructs.h.rsg b/rsgApiStructs.h_rsg
similarity index 100%
rename from rsgApiStructs.h.rsg
rename to rsgApiStructs.h_rsg
diff --git a/support.bp b/support.bp
new file mode 100644
index 0000000..d03e96f
--- /dev/null
+++ b/support.bp
@@ -0,0 +1,182 @@
+cc_defaults {
+    name: "rs_support_defaults",
+    product_variables: {
+        unbundled_build: {
+            // Unbundled builds use prebuilts in prebuilts/sdk/renderscript instead
+            enabled: false,
+        },
+    },
+}
+
+// Generate custom headers
+gensrcs {
+    name: "rs_generated_headers_support",
+    tools: ["rsg-generator"],
+    tool_files: [
+        "rs.spec",
+        "rs_compat.spec",
+    ],
+    cmd: "cat $(location rs.spec) $(location rs_compat.spec) | $(location rsg-generator) $(in) $(out)",
+    output_extension: "h",
+    srcs: [
+        "rsgApiStructs.h_rsg",
+        "rsgApiFuncDecl.h_rsg",
+    ],
+    export_include_dirs: ["."],
+}
+
+gensrcs {
+    name: "rs_generated_sources_support",
+    tools: ["rsg-generator"],
+    tool_files: [
+        "rs.spec",
+        "rs_compat.spec",
+    ],
+    cmd: "cat $(location rs.spec) $(location rs_compat.spec) | $(location rsg-generator) $(in) $(out)",
+    output_extension: "cpp",
+    srcs: [
+        "rsgApi.cpp_rsg",
+        "rsgApiReplay.cpp_rsg",
+    ],
+}
+
+cc_library_shared {
+    name: "libRSSupport",
+    defaults: ["rs_support_defaults"],
+    sdk_version: "9",
+
+    srcs: [
+        "rsAllocation.cpp",
+        "rsApiAllocation.cpp",
+        "rsApiContext.cpp",
+        "rsApiDevice.cpp",
+        "rsApiElement.cpp",
+        "rsApiType.cpp",
+        "rsClosure.cpp",
+        "rsComponent.cpp",
+        "rsContext.cpp",
+        "rsCppUtils.cpp",
+        "rsDevice.cpp",
+        "rsDriverLoader.cpp",
+        "rsElement.cpp",
+        "rsFifoSocket.cpp",
+        "rsObjectBase.cpp",
+        "rsMatrix2x2.cpp",
+        "rsMatrix3x3.cpp",
+        "rsMatrix4x4.cpp",
+        "rsMutex.cpp",
+        "rsSampler.cpp",
+        "rsScript.cpp",
+        "rsScriptC.cpp",
+        "rsScriptC_Lib.cpp",
+        "rsScriptGroup.cpp",
+        "rsScriptGroup2.cpp",
+        "rsScriptIntrinsic.cpp",
+        "rsSignal.cpp",
+        "rsStream.cpp",
+        "rsThreadIO.cpp",
+        "rsType.cpp",
+        "driver/rsdAllocation.cpp",
+        "driver/rsdBcc.cpp",
+        "driver/rsdCore.cpp",
+        "driver/rsdElement.cpp",
+        "driver/rsdRuntimeStubs.cpp",
+        "driver/rsdSampler.cpp",
+        "driver/rsdScriptGroup.cpp",
+        "driver/rsdType.cpp",
+        "cpu_ref/rsCpuCore.cpp",
+        "cpu_ref/rsCpuExecutable.cpp",
+        "cpu_ref/rsCpuScript.cpp",
+        "cpu_ref/rsCpuRuntimeMath.cpp",
+        "cpu_ref/rsCpuScriptGroup.cpp",
+        "cpu_ref/rsCpuScriptGroup2.cpp",
+        "cpu_ref/rsCpuIntrinsic.cpp",
+        "cpu_ref/rsCpuIntrinsic3DLUT.cpp",
+        "cpu_ref/rsCpuIntrinsicBlend.cpp",
+        "cpu_ref/rsCpuIntrinsicBlur.cpp",
+        "cpu_ref/rsCpuIntrinsicBLAS.cpp",
+        "cpu_ref/rsCpuIntrinsicColorMatrix.cpp",
+        "cpu_ref/rsCpuIntrinsicConvolve3x3.cpp",
+        "cpu_ref/rsCpuIntrinsicConvolve5x5.cpp",
+        "cpu_ref/rsCpuIntrinsicHistogram.cpp",
+        "cpu_ref/rsCpuIntrinsicLUT.cpp",
+        "cpu_ref/rsCpuIntrinsicResize.cpp",
+        "cpu_ref/rsCpuIntrinsicYuvToRGB.cpp",
+    ],
+
+    generated_sources: ["rs_generated_sources_support"],
+    generated_headers: ["rs_generated_headers_support"],
+
+    arch: {
+        arm: {
+            cflags: [
+                "-DARCH_ARM_HAVE_VFP",
+                "-DARCH_ARM_USE_INTRINSICS",
+            ],
+            asflags: ["-mfpu=neon"],
+            srcs: [
+                "cpu_ref/rsCpuIntrinsics_neon_3DLUT.S",
+                "cpu_ref/rsCpuIntrinsics_neon_Blend.S",
+                "cpu_ref/rsCpuIntrinsics_neon_Blur.S",
+                "cpu_ref/rsCpuIntrinsics_neon_ColorMatrix.S",
+                "cpu_ref/rsCpuIntrinsics_neon_Convolve.S",
+                "cpu_ref/rsCpuIntrinsics_neon_Resize.S",
+                "cpu_ref/rsCpuIntrinsics_neon_YuvToRGB.S",
+            ],
+
+            neon: {
+                cflags: ["-DARCH_ARM_HAVE_NEON"]
+            },
+        },
+
+        arm64: {
+            cflags: [
+                "-DARCH_ARM_USE_INTRINSICS",
+                "-DARCH_ARM64_USE_INTRINSICS",
+                "-DARCH_ARM64_HAVE_NEON",
+            ],
+            srcs: [
+                "cpu_ref/rsCpuIntrinsics_advsimd_3DLUT.S",
+                "cpu_ref/rsCpuIntrinsics_advsimd_Blend.S",
+                "cpu_ref/rsCpuIntrinsics_advsimd_Blur.S",
+                "cpu_ref/rsCpuIntrinsics_advsimd_ColorMatrix.S",
+                "cpu_ref/rsCpuIntrinsics_advsimd_Convolve.S",
+                "cpu_ref/rsCpuIntrinsics_advsimd_Resize.S",
+                "cpu_ref/rsCpuIntrinsics_advsimd_YuvToRGB.S",
+            ],
+        },
+
+        x86: {
+            cflags: ["-DARCH_X86_HAVE_SSSE3"],
+            srcs: ["cpu_ref/rsCpuIntrinsics_x86.cpp"],
+        },
+
+        x86_64: {
+            cflags: ["-DARCH_X86_HAVE_SSSE3"],
+            srcs: ["cpu_ref/rsCpuIntrinsics_x86.cpp"],
+        },
+    },
+
+    required: ["libblasV8"],
+    static_libs: ["libbnnmlowpV8"],
+    shared_libs: [
+        "liblog",
+        "libdl",
+    ],
+    ldflags: ["-Wl,--exclude-libs,libc++_static.a"],
+    stl: "c++_static",
+
+    cflags: [
+        "-Werror",
+        "-Wall",
+        "-Wextra",
+        "-Wno-unused-parameter",
+        "-Wno-unused-variable",
+        "-Wno-overloaded-virtual",
+        "-DRS_COMPATIBILITY_LIB",
+
+        "-DGEMMLOWP_USE_STLPORT",
+        // TODO: why isn't this picked up from the host GLOBAL_CFLAGS?
+        "-D__STDC_FORMAT_MACROS",
+    ],
+}
diff --git a/support/Android.bp b/support/Android.bp
new file mode 100644
index 0000000..726a790
--- /dev/null
+++ b/support/Android.bp
@@ -0,0 +1,3 @@
+subdirs = [
+    "jni",
+]
diff --git a/support/jni/Android.bp b/support/jni/Android.bp
new file mode 100644
index 0000000..17dea12
--- /dev/null
+++ b/support/jni/Android.bp
@@ -0,0 +1,72 @@
+cc_library_shared {
+    name: "libRSSupportIO",
+    defaults: ["rs_support_defaults"],
+
+    sdk_version: "14",
+
+    srcs: [
+        "android_rscompat_usage_io.cpp",
+        "android_rscompat_usage_io_driver.cpp",
+    ],
+
+    include_dirs: [
+        "frameworks/rs",
+        "frameworks/rs/cpp",
+        "frameworks/rs/driver",
+    ],
+
+    cflags: [
+        "-Werror",
+        "-Wall",
+        "-Wextra",
+        "-Wno-unused-parameter",
+        "-DRS_COMPATIBILITY_LIB",
+        "-std=c++11",
+    ],
+
+    shared_libs: [
+        "libandroid",
+        "libdl",
+    ],
+
+    ldflags: [
+        "-Wl,--exclude-libs,libc++_static.a",
+    ],
+    stl: "c++_static",
+}
+
+cc_library_shared {
+    name: "librsjni",
+    defaults: ["rs_support_defaults"],
+
+    sdk_version: "9",
+
+    srcs: ["android_renderscript_RenderScript.cpp"],
+
+    shared_libs: [
+        "libdl",
+        "libjnigraphics",
+        "liblog",
+    ],
+
+    static_libs: ["libRSDispatch"],
+
+    include_dirs: [
+        "frameworks/rs",
+        "frameworks/rs/cpp",
+    ],
+
+    cflags: [
+        "-Werror",
+        "-Wall",
+        "-Wextra",
+        "-Wno-unused-parameter",
+        "-std=c++11",
+    ],
+
+    required: ["libRSSupport"],
+
+    ldflags: ["-Wl,--exclude-libs,libc++_static.a"],
+
+    stl: "c++_static",
+}
diff --git a/support/jni/Android.mk b/support/jni/Android.mk
deleted file mode 100644
index b17ae36..0000000
--- a/support/jni/Android.mk
+++ /dev/null
@@ -1,54 +0,0 @@
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_SDK_VERSION := 14
-
-LOCAL_SRC_FILES:= \
-    android_rscompat_usage_io.cpp \
-    android_rscompat_usage_io_driver.cpp
-
-LOCAL_C_INCLUDES += \
-	$(JNI_H_INCLUDE) \
-	frameworks/rs \
-	frameworks/rs/cpp \
-	frameworks/rs/driver
-
-LOCAL_CFLAGS += -Werror -Wall -Wextra \
-		-Wno-unused-parameter \
-		-DRS_COMPATIBILITY_LIB \
-		-std=c++11
-
-LOCAL_MODULE:= libRSSupportIO
-
-LOCAL_LDLIBS += -landroid
-LOCAL_LDFLAGS += -ldl -Wl,--exclude-libs,libc++_static.a
-LOCAL_NDK_STL_VARIANT := c++_static
-include $(BUILD_SHARED_LIBRARY)
-
-include $(CLEAR_VARS)
-
-LOCAL_SDK_VERSION := 9
-
-LOCAL_SRC_FILES:= \
-    android_renderscript_RenderScript.cpp
-
-LOCAL_SHARED_LIBRARIES := \
-        libjnigraphics
-
-LOCAL_STATIC_LIBRARIES := \
-        libRSDispatch
-
-LOCAL_C_INCLUDES += \
-	$(JNI_H_INCLUDE) \
-	frameworks/rs \
-	frameworks/rs/cpp
-
-LOCAL_CFLAGS += -Werror -Wall -Wextra -Wno-unused-parameter -std=c++11
-
-LOCAL_MODULE:= librsjni
-LOCAL_REQUIRED_MODULES := libRSSupport
-
-LOCAL_LDFLAGS += -ldl -llog -Wl,--exclude-libs,libc++_static.a
-LOCAL_NDK_STL_VARIANT := c++_static
-
-include $(BUILD_SHARED_LIBRARY)
diff --git a/support/rs_support/Android.mk b/support/rs_support/Android.mk
deleted file mode 100644
index dd083e2..0000000
--- a/support/rs_support/Android.mk
+++ /dev/null
@@ -1,187 +0,0 @@
-
-LOCAL_PATH:=frameworks/rs
-rs_base_CFLAGS := -Werror -Wall -Wextra \
-		  -Wno-unused-parameter \
-		  -Wno-unused-variable \
-		  -Wno-overloaded-virtual -DRS_COMPATIBILITY_LIB \
-		  -std=c++11
-
-ifeq ($(ARCH_ARM_HAVE_NEON),true)
-rs_base_CFLAGS += -DARCH_ARM_HAVE_NEON
-endif
-
-ifeq ($(TARGET_BUILD_PDK), true)
-  rs_base_CFLAGS += -D__RS_PDK__
-endif
-
-# Build rsg-generator ====================
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := rsg-generator_support
-
-# These symbols are normally defined by BUILD_XXX, but we need to define them
-# here so that local-intermediates-dir works.
-
-LOCAL_MODULE_CLASS := EXECUTABLES
-intermediates := $(local-intermediates-dir)
-
-LOCAL_SRC_FILES:= \
-    spec.l \
-    rsg_generator.c
-
-LOCAL_CXX_STL := none
-LOCAL_SANITIZE := never
-
-include $(BUILD_HOST_EXECUTABLE)
-
-# TODO: This should go into build/core/config.mk
-RSG_GENERATOR_SUPPORT:=$(LOCAL_BUILT_MODULE)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := libRSSupport
-LOCAL_SDK_VERSION := 9
-
-
-LOCAL_MODULE_CLASS := SHARED_LIBRARIES
-generated_sources_dir := $(call local-generated-sources-dir)
-
-# Generate custom headers
-
-GEN := $(addprefix $(generated_sources_dir)/, \
-            rsgApiStructs.h \
-            rsgApiFuncDecl.h \
-        )
-
-$(GEN) : PRIVATE_PATH := $(LOCAL_PATH)
-$(GEN) : PRIVATE_CUSTOM_TOOL = cat $(PRIVATE_PATH)/rs.spec $(PRIVATE_PATH)/rs_compat.spec | $(RSG_GENERATOR_SUPPORT) $< $@
-$(GEN) : $(RSG_GENERATOR_SUPPORT) $(LOCAL_PATH)/rs.spec $(LOCAL_PATH)/rs_compat.spec
-$(GEN): $(generated_sources_dir)/%.h : $(LOCAL_PATH)/%.h.rsg
-	$(transform-generated-source)
-
-# used in jni/Android.mk
-rs_generated_source += $(GEN)
-LOCAL_GENERATED_SOURCES += $(GEN)
-
-# Generate custom source files
-
-GEN := $(addprefix $(generated_sources_dir)/, \
-            rsgApi.cpp \
-            rsgApiReplay.cpp \
-        )
-
-$(GEN) : PRIVATE_PATH := $(LOCAL_PATH)
-$(GEN) : PRIVATE_CUSTOM_TOOL = cat $(PRIVATE_PATH)/rs.spec $(PRIVATE_PATH)/rs_compat.spec | $(RSG_GENERATOR_SUPPORT) $< $@
-$(GEN) : $(RSG_GENERATOR_SUPPORT) $(LOCAL_PATH)/rs.spec $(LOCAL_PATH)/rs_compat.spec
-$(GEN): $(generated_sources_dir)/%.cpp : $(LOCAL_PATH)/%.cpp.rsg
-	$(transform-generated-source)
-
-# used in jni/Android.mk
-rs_generated_source += $(GEN)
-
-LOCAL_GENERATED_SOURCES += $(GEN)
-
-LOCAL_SRC_FILES:= \
-	rsAllocation.cpp \
-	rsApiAllocation.cpp \
-	rsApiContext.cpp \
-	rsApiDevice.cpp \
-	rsApiElement.cpp \
-	rsApiType.cpp \
-	rsClosure.cpp \
-	rsComponent.cpp \
-	rsContext.cpp \
-	rsCppUtils.cpp \
-	rsDevice.cpp \
-	rsDriverLoader.cpp \
-	rsElement.cpp \
-	rsFifoSocket.cpp \
-	rsObjectBase.cpp \
-	rsMatrix2x2.cpp \
-	rsMatrix3x3.cpp \
-	rsMatrix4x4.cpp \
-	rsMutex.cpp \
-	rsSampler.cpp \
-	rsScript.cpp \
-	rsScriptC.cpp \
-	rsScriptC_Lib.cpp \
-	rsScriptGroup.cpp \
-	rsScriptGroup2.cpp \
-	rsScriptIntrinsic.cpp \
-	rsSignal.cpp \
-	rsStream.cpp \
-	rsThreadIO.cpp \
-	rsType.cpp \
-	driver/rsdAllocation.cpp \
-	driver/rsdBcc.cpp \
-	driver/rsdCore.cpp \
-	driver/rsdElement.cpp \
-	driver/rsdRuntimeStubs.cpp \
-	driver/rsdSampler.cpp \
-	driver/rsdScriptGroup.cpp \
-	driver/rsdType.cpp \
-	cpu_ref/rsCpuCore.cpp \
-	cpu_ref/rsCpuExecutable.cpp \
-	cpu_ref/rsCpuScript.cpp \
-	cpu_ref/rsCpuRuntimeMath.cpp \
-	cpu_ref/rsCpuScriptGroup.cpp \
-	cpu_ref/rsCpuScriptGroup2.cpp \
-	cpu_ref/rsCpuIntrinsic.cpp \
-	cpu_ref/rsCpuIntrinsic3DLUT.cpp \
-	cpu_ref/rsCpuIntrinsicBlend.cpp \
-	cpu_ref/rsCpuIntrinsicBlur.cpp \
-	cpu_ref/rsCpuIntrinsicBLAS.cpp \
-	cpu_ref/rsCpuIntrinsicColorMatrix.cpp \
-	cpu_ref/rsCpuIntrinsicConvolve3x3.cpp \
-	cpu_ref/rsCpuIntrinsicConvolve5x5.cpp \
-	cpu_ref/rsCpuIntrinsicHistogram.cpp \
-	cpu_ref/rsCpuIntrinsicLUT.cpp \
-	cpu_ref/rsCpuIntrinsicResize.cpp \
-	cpu_ref/rsCpuIntrinsicYuvToRGB.cpp
-
-ifeq ($(ARCH_ARM_HAVE_ARMV7A),true)
-LOCAL_CFLAGS_arm := -DARCH_ARM_HAVE_VFP -DARCH_ARM_USE_INTRINSICS
-LOCAL_ASFLAGS_arm := -mfpu=neon
-LOCAL_SRC_FILES_arm := \
-    cpu_ref/rsCpuIntrinsics_neon_3DLUT.S \
-    cpu_ref/rsCpuIntrinsics_neon_Blend.S \
-    cpu_ref/rsCpuIntrinsics_neon_Blur.S \
-    cpu_ref/rsCpuIntrinsics_neon_ColorMatrix.S \
-    cpu_ref/rsCpuIntrinsics_neon_Convolve.S \
-    cpu_ref/rsCpuIntrinsics_neon_Resize.S \
-    cpu_ref/rsCpuIntrinsics_neon_YuvToRGB.S
-endif
-
-LOCAL_CFLAGS_arm64 += \
-    -DARCH_ARM_USE_INTRINSICS \
-    -DARCH_ARM64_USE_INTRINSICS \
-    -DARCH_ARM64_HAVE_NEON
-LOCAL_SRC_FILES_arm64 += \
-    cpu_ref/rsCpuIntrinsics_advsimd_3DLUT.S \
-    cpu_ref/rsCpuIntrinsics_advsimd_Blend.S \
-    cpu_ref/rsCpuIntrinsics_advsimd_Blur.S \
-    cpu_ref/rsCpuIntrinsics_advsimd_ColorMatrix.S \
-    cpu_ref/rsCpuIntrinsics_advsimd_Convolve.S \
-    cpu_ref/rsCpuIntrinsics_advsimd_Resize.S \
-    cpu_ref/rsCpuIntrinsics_advsimd_YuvToRGB.S
-
-LOCAL_CFLAGS_x86 += -DARCH_X86_HAVE_SSSE3
-LOCAL_SRC_FILES_x86 += cpu_ref/rsCpuIntrinsics_x86.cpp
-LOCAL_CFLAGS_x86_64 += -DARCH_X86_HAVE_SSSE3
-LOCAL_SRC_FILES_x86_64 += cpu_ref/rsCpuIntrinsics_x86.cpp
-
-LOCAL_REQUIRED_MODULES := libblasV8
-LOCAL_STATIC_LIBRARIES := libbnnmlowpV8
-LOCAL_LDFLAGS += -llog -ldl -Wl,--exclude-libs,libc++_static.a
-LOCAL_NDK_STL_VARIANT := c++_static
-
-LOCAL_C_INCLUDES += external/cblas/include
-LOCAL_C_INCLUDES += external/gemmlowp/eight_bit_int_gemm
-
-LOCAL_CFLAGS += $(rs_base_CFLAGS) -DGEMMLOWP_USE_STLPORT
-
-LOCAL_MODULE:= libRSSupport
-
-# TODO: why isn't this picked up from the host GLOBAL_CFLAGS?
-LOCAL_CFLAGS += -D__STDC_FORMAT_MACROS
-
-include $(BUILD_SHARED_LIBRARY)