From 0bd59a0a58f9891926ff6faf74a78307230d705b Mon Sep 17 00:00:00 2001 From: Ying Wang Date: Thu, 15 Jul 2010 17:17:52 -0700 Subject: [PATCH] Build system support for RenderScript With this change, you can add your .rs files to LOCAL_SRC_FILES. The .rs files will be compiled by slang and the output .java files will be compiled into the jar, while the generated .bc files will be put into the final apk as raw resources. Change-Id: Icde3d6139951d6d039b4b37376e72e1fc5c8b0d4 --- core/config.mk | 1 + core/definitions.mk | 36 ++++++++++++++++++++++++++++++++++++ core/java.mk | 29 +++++++++++++++++++++++++++++ core/package.mk | 2 +- 4 files changed, 67 insertions(+), 1 deletion(-) diff --git a/core/config.mk b/core/config.mk index 346ebc6738..eb219437be 100644 --- a/core/config.mk +++ b/core/config.mk @@ -216,6 +216,7 @@ E2FSCK := $(HOST_OUT_EXECUTABLES)/e2fsck$(HOST_EXECUTABLE_SUFFIX) JARJAR := $(HOST_OUT_JAVA_LIBRARIES)/jarjar.jar PROGUARD := external/proguard/bin/proguard.sh JAVATAGS := build/tools/java-event-log-tags.py +SLANG := $(HOST_OUT_EXECUTABLES)/slang$(HOST_EXECUTABLE_SUFFIX) # ACP is always for the build OS, not for the host OS ACP := $(BUILD_OUT_EXECUTABLES)/acp$(BUILD_EXECUTABLE_SUFFIX) diff --git a/core/definitions.mk b/core/definitions.mk index 87e90135bf..5e1df45b13 100644 --- a/core/definitions.mk +++ b/core/definitions.mk @@ -235,6 +235,19 @@ $(patsubst ./%,%, \ ) endef +########################################################### +## Find all of the RenderScript files under the named directories. +## Meant to be used like: +## SRC_FILES := $(call all-renderscript-files-under,src) +########################################################### + +define all-renderscript-files-under +$(patsubst ./%,%, \ + $(shell cd $(LOCAL_PATH) ; \ + find $(1) -name "*.rs" -and -not -name ".*") \ + ) +endef + ########################################################### ## Find all of the html files under the named directories. ## Meant to be used like: @@ -732,6 +745,29 @@ echo '#endif' >> $(@:$1=.h) rm -f $(@:$1=$(YACC_HEADER_SUFFIX)) endef +########################################################### +## Commands to compile RenderScript +########################################################### +# $(1) the .rs file +define _compile-one-rs-file +$(hide) $(SLANG) \ + --allow-rs-prefix \ + -o $(PRIVATE_RS_OUTPUT_DIR)/res/raw/$(patsubst %.rs,%.bc,$(notdir $(1))) \ + -p $(PRIVATE_RS_OUTPUT_DIR)/src \ + $(1) + +endef + +define transform-renderscripts-to-java-and-bc +@echo "RenderScript: $(PRIVATE_MODULE) <= $(PRIVATE_RS_SOURCE_FILES)" +$(hide) rm -rf $(PRIVATE_RS_OUTPUT_DIR) +$(hide) mkdir -p $(PRIVATE_RS_OUTPUT_DIR)/res/raw +$(hide) mkdir -p $(PRIVATE_RS_OUTPUT_DIR)/src +$(foreach rs,$(PRIVATE_RS_SOURCE_FILES),$(call _compile-one-rs-file,$(rs))) +$(hide) mkdir -p $(dir $@) +$(hide) touch $@ +endef + ########################################################### ## Commands for running aidl diff --git a/core/java.mk b/core/java.mk index 4c34479f6d..dd46b5db0e 100644 --- a/core/java.mk +++ b/core/java.mk @@ -94,6 +94,30 @@ LOCAL_INTERMEDIATE_TARGETS += \ LOCAL_INTERMEDIATE_SOURCE_DIR := $(intermediates.COMMON)/src +############################################################### +## .rs files: RenderScript sources to .java files and .bc files +############################################################### +renderscript_sources := $(filter %.rs,$(LOCAL_SRC_FILES)) +# Because names of the java files from RenderScript are unknown until the +# .rs file(s) are compiled, we have to depend on a timestamp file. +RenderScript_file_stamp := +ifneq ($(renderscript_sources),) +renderscript_sources_fullpath := $(addprefix $(LOCAL_PATH)/, $(renderscript_sources)) +RenderScript_file_stamp := $(LOCAL_INTERMEDIATE_SOURCE_DIR)/RenderScript.stamp + +$(RenderScript_file_stamp): PRIVATE_RS_SOURCE_FILES := $(renderscript_sources_fullpath) +# By putting the generated java files into $(LOCAL_INTERMEDIATE_SOURCE_DIR), they will be +# automatically found by the java compiling function transform-java-to-classes.jar. +$(RenderScript_file_stamp): PRIVATE_RS_OUTPUT_DIR := $(LOCAL_INTERMEDIATE_SOURCE_DIR)/renderscript +# TODO: slang support to generate implicit dependency derived from "include" directives. +$(RenderScript_file_stamp): $(renderscript_sources_fullpath) $(SLANG) + $(transform-renderscripts-to-java-and-bc) + +LOCAL_INTERMEDIATE_TARGETS += $(RenderScript_file_stamp) +# Make sure the generated resource will be added to the apk. +LOCAL_RESOURCE_DIR := $(LOCAL_INTERMEDIATE_SOURCE_DIR)/renderscript/res $(LOCAL_RESOURCE_DIR) +endif + # TODO: It looks like the only thing we need from base_rules is # all_java_sources. See if we can get that by adding a # common_java.mk, and moving the include of base_rules.mk to @@ -151,6 +175,11 @@ $(full_classes_compiled_jar): PRIVATE_JAVACFLAGS := $(LOCAL_JAVACFLAGS) $(full_classes_compiled_jar): $(java_sources) $(full_java_lib_deps) $(transform-java-to-classes.jar) +# source files generated from RenderScript must be generated before java compiling +ifneq ($(RenderScript_file_stamp),) +$(full_classes_compiled_jar): $(RenderScript_file_stamp) +endif + # All of the rules after full_classes_compiled_jar are very unlikely # to fail except for bugs in their respective tools. If you would # like to run these rules, add the "all" modifier goal to the make diff --git a/core/package.mk b/core/package.mk index bffda93a55..c14e66028b 100644 --- a/core/package.mk +++ b/core/package.mk @@ -183,7 +183,7 @@ endif $(R_file_stamp): PRIVATE_RESOURCE_PUBLICS_OUTPUT := \ $(intermediates.COMMON)/public_resources.xml $(R_file_stamp): PRIVATE_PROGUARD_OPTIONS_FILE := $(proguard_options_file) -$(R_file_stamp): $(all_res_assets) $(full_android_manifest) $(AAPT) | $(ACP) +$(R_file_stamp): $(all_res_assets) $(full_android_manifest) $(RenderScript_file_stamp) $(AAPT) | $(ACP) @echo "target R.java/Manifest.java: $(PRIVATE_MODULE) ($@)" @rm -f $@ $(create-resource-java-files)