diff options
-rw-r--r-- | core/base_rules.mk | 32 | ||||
-rw-r--r-- | core/binary.mk | 48 | ||||
-rw-r--r-- | core/clear_vars.mk | 1 | ||||
-rw-r--r-- | core/config.mk | 1 | ||||
-rw-r--r-- | core/definitions.mk | 41 | ||||
-rw-r--r-- | core/java.mk | 18 |
6 files changed, 130 insertions, 11 deletions
diff --git a/core/base_rules.mk b/core/base_rules.mk index b4fa12a..2dae399 100644 --- a/core/base_rules.mk +++ b/core/base_rules.mk @@ -263,6 +263,38 @@ event_log_tags := endif ########################################################### +## .proto files: Compile proto files to .java +########################################################### +proto_sources := $(filter %.proto,$(LOCAL_SRC_FILES)) +# Because names of the .java files compiled from .proto files are unknown until the +# .proto files are compiled, we use a timestamp file as depedency. +proto_java_sources_file_stamp := +ifneq ($(proto_sources),) +proto_sources_fullpath := $(addprefix $(TOP_DIR)$(LOCAL_PATH)/, $(proto_sources)) +# 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. +proto_java_intemediate_dir := $(LOCAL_INTERMEDIATE_SOURCE_DIR)/proto +proto_java_sources_file_stamp := $(proto_java_intemediate_dir)/Proto.stamp +proto_java_sources_dir := $(proto_java_intemediate_dir)/src + +$(proto_java_sources_file_stamp): PRIVATE_PROTO_INCLUDES := $(TOP) +$(proto_java_sources_file_stamp): PRIVATE_PROTO_SRC_FILES := $(proto_sources_fullpath) +$(proto_java_sources_file_stamp): PRIVATE_PROTO_JAVA_OUTPUT_DIR := $(proto_java_sources_dir) +ifeq ($(LOCAL_PROTOC_OPTIMIZE_TYPE),micro) +$(proto_java_sources_file_stamp): PRIVATE_PROTO_JAVA_OUTPUT_OPTION := --javamicro_out +else +$(proto_java_sources_file_stamp): PRIVATE_PROTO_JAVA_OUTPUT_OPTION := --java_out +endif +$(proto_java_sources_file_stamp) : $(proto_sources_fullpath) $(PROTOC) + $(call transform-proto-to-java) + +#TODO: protoc should output the dependencies introduced by imports. + +LOCAL_INTERMEDIATE_TARGETS += $(proto_java_sources_file_stamp) +endif # proto_sources + + +########################################################### ## Java: Compile .java files to .class ########################################################### #TODO: pull this into java.make once host and target are combined diff --git a/core/binary.mk b/core/binary.mk index 48d1ba7..9ebf8c6 100644 --- a/core/binary.mk +++ b/core/binary.mk @@ -146,6 +146,43 @@ ALL_GENERATED_SOURCES += $(LOCAL_GENERATED_SOURCES) ########################################################### +## Compile the .proto files to .cc and then to .o +########################################################### +proto_sources := $(filter %.proto,$(LOCAL_SRC_FILES)) +proto_generated_objects := +proto_generated_headers := +ifneq ($(proto_sources),) +proto_sources_fullpath := $(addprefix $(LOCAL_PATH)/, $(proto_sources)) +proto_generated_cc_sources_dir := $(intermediates)/proto +proto_generated_cc_sources := $(addprefix $(proto_generated_cc_sources_dir)/, \ + $(patsubst %.proto,%.pb.cc,$(proto_sources_fullpath))) +proto_generated_objects := $(patsubst %.cc,%.o, $(proto_generated_cc_sources)) + +$(proto_generated_cc_sources): PRIVATE_PROTO_INCLUDES := $(TOP) +$(proto_generated_cc_sources): PRIVATE_PROTO_CC_OUTPUT_DIR := $(proto_generated_cc_sources_dir) +$(proto_generated_cc_sources): $(proto_generated_cc_sources_dir)/%.pb.cc: %.proto $(PROTOC) + $(transform-proto-to-cc) + +proto_generated_headers := $(patsubst %.pb.cc,%.pb.h, $(proto_generated_cc_sources)) +$(proto_generated_headers): $(proto_generated_cc_sources_dir)/%.pb.h: $(proto_generated_cc_sources_dir)/%.pb.cc + +$(proto_generated_cc_sources): PRIVATE_ARM_MODE := $(normal_objects_mode) +$(proto_generated_cc_sources): PRIVATE_ARM_CFLAGS := $(normal_objects_cflags) +$(proto_generated_objects): $(proto_generated_cc_sources_dir)/%.o: $(proto_generated_cc_sources_dir)/%.cc + $(transform-$(PRIVATE_HOST)cpp-to-o) +-include $(proto_generated_objects:%.o=%.P) + +LOCAL_C_INCLUDES += external/protobuf/src $(proto_generated_cc_sources_dir) +LOCAL_CFLAGS += -DGOOGLE_PROTOBUF_NO_RTTI +ifeq ($(LOCAL_PROTOC_OPTIMIZE_TYPE),full) +LOCAL_STATIC_LIBRARIES += libprotobuf-cpp-2.3.0-full +else +LOCAL_STATIC_LIBRARIES += libprotobuf-cpp-2.3.0-lite +endif +endif + + +########################################################### ## YACC: Compile .y files to .cpp and the to .o. ########################################################### @@ -213,7 +250,7 @@ cpp_objects := $(cpp_arm_objects) $(cpp_normal_objects) ifneq ($(strip $(cpp_objects)),) $(cpp_objects): $(intermediates)/%.o: \ $(TOPDIR)$(LOCAL_PATH)/%$(LOCAL_CPP_EXTENSION) \ - $(yacc_cpps) $(LOCAL_ADDITIONAL_DEPENDENCIES) + $(yacc_cpps) $(proto_generated_headers) $(LOCAL_ADDITIONAL_DEPENDENCIES) $(transform-$(PRIVATE_HOST)cpp-to-o) -include $(cpp_objects:%.o=%.P) endif @@ -230,7 +267,7 @@ ifneq ($(strip $(gen_cpp_objects)),) # TODO: support compiling certain generated files as arm. $(gen_cpp_objects): PRIVATE_ARM_MODE := $(normal_objects_mode) $(gen_cpp_objects): PRIVATE_ARM_CFLAGS := $(normal_objects_cflags) -$(gen_cpp_objects): $(intermediates)/%.o: $(intermediates)/%$(LOCAL_CPP_EXTENSION) $(yacc_cpps) $(LOCAL_ADDITIONAL_DEPENDENCIES) +$(gen_cpp_objects): $(intermediates)/%.o: $(intermediates)/%$(LOCAL_CPP_EXTENSION) $(yacc_cpps) $(proto_generated_headers) $(LOCAL_ADDITIONAL_DEPENDENCIES) $(transform-$(PRIVATE_HOST)cpp-to-o) -include $(gen_cpp_objects:%.o=%.P) endif @@ -277,7 +314,7 @@ $(c_normal_objects): PRIVATE_ARM_CFLAGS := $(normal_objects_cflags) c_objects := $(c_arm_objects) $(c_normal_objects) ifneq ($(strip $(c_objects)),) -$(c_objects): $(intermediates)/%.o: $(TOPDIR)$(LOCAL_PATH)/%.c $(yacc_cpps) $(LOCAL_ADDITIONAL_DEPENDENCIES) +$(c_objects): $(intermediates)/%.o: $(TOPDIR)$(LOCAL_PATH)/%.c $(yacc_cpps) $(proto_generated_headers) $(LOCAL_ADDITIONAL_DEPENDENCIES) $(transform-$(PRIVATE_HOST)c-to-o) -include $(c_objects:%.o=%.P) endif @@ -294,7 +331,7 @@ ifneq ($(strip $(gen_c_objects)),) # TODO: support compiling certain generated files as arm. $(gen_c_objects): PRIVATE_ARM_MODE := $(normal_objects_mode) $(gen_c_objects): PRIVATE_ARM_CFLAGS := $(normal_objects_cflags) -$(gen_c_objects): $(intermediates)/%.o: $(intermediates)/%.c $(yacc_cpps) $(LOCAL_ADDITIONAL_DEPENDENCIES) +$(gen_c_objects): $(intermediates)/%.o: $(intermediates)/%.c $(yacc_cpps) $(proto_generated_headers) $(LOCAL_ADDITIONAL_DEPENDENCIES) $(transform-$(PRIVATE_HOST)c-to-o) -include $(gen_c_objects:%.o=%.P) endif @@ -307,7 +344,7 @@ objc_sources := $(filter %.m,$(LOCAL_SRC_FILES)) objc_objects := $(addprefix $(intermediates)/,$(objc_sources:.m=.o)) ifneq ($(strip $(objc_objects)),) -$(objc_objects): $(intermediates)/%.o: $(TOPDIR)$(LOCAL_PATH)/%.m $(yacc_cpps) $(PRIVATE_ADDITIONAL_DEPENDENCIES) +$(objc_objects): $(intermediates)/%.o: $(TOPDIR)$(LOCAL_PATH)/%.m $(yacc_cpps) $(proto_generated_headers) $(PRIVATE_ADDITIONAL_DEPENDENCIES) $(transform-$(PRIVATE_HOST)m-to-o) -include $(objc_objects:%.o=%.P) endif @@ -352,6 +389,7 @@ all_objects := \ $(gen_c_objects) \ $(yacc_objects) \ $(lex_objects) \ + $(proto_generated_objects) \ $(addprefix $(TOPDIR)$(LOCAL_PATH)/,$(LOCAL_PREBUILT_OBJ_FILES)) LOCAL_C_INCLUDES += $(TOPDIR)$(LOCAL_PATH) $(intermediates) $(base_intermediates) diff --git a/core/clear_vars.mk b/core/clear_vars.mk index e0c2ed4..775a1b8 100644 --- a/core/clear_vars.mk +++ b/core/clear_vars.mk @@ -102,6 +102,7 @@ LOCAL_MANIFEST_FILE:= LOCAL_RENDERSCRIPT_INCLUDES:= LOCAL_BUILD_HOST_DEX:= LOCAL_DEX_PREOPT:= +LOCAL_PROTOC_OPTIMIZE_TYPE:= # lite(default),micro,full # Trim MAKEFILE_LIST so that $(call my-dir) doesn't need to # iterate over thousands of entries every time. diff --git a/core/config.mk b/core/config.mk index c03f44a..e2459f6 100644 --- a/core/config.mk +++ b/core/config.mk @@ -203,6 +203,7 @@ YACC:= bison -d DOXYGEN:= doxygen AAPT := $(HOST_OUT_EXECUTABLES)/aapt$(HOST_EXECUTABLE_SUFFIX) AIDL := $(HOST_OUT_EXECUTABLES)/aidl$(HOST_EXECUTABLE_SUFFIX) +PROTOC := $(HOST_OUT_EXECUTABLES)/protoc$(HOST_EXECUTABLE_SUFFIX) ICUDATA := $(HOST_OUT_EXECUTABLES)/icudata$(HOST_EXECUTABLE_SUFFIX) SIGNAPK_JAR := $(HOST_OUT_JAVA_LIBRARIES)/signapk$(COMMON_JAVA_PACKAGE_SUFFIX) MKBOOTFS := $(HOST_OUT_EXECUTABLES)/mkbootfs$(HOST_EXECUTABLE_SUFFIX) diff --git a/core/definitions.mk b/core/definitions.mk index 6ee99bb..c236c0e 100644 --- a/core/definitions.mk +++ b/core/definitions.mk @@ -236,6 +236,19 @@ $(patsubst ./%,%, \ endef ########################################################### +## Find all of the .proto files under the named directories. +## Meant to be used like: +## SRC_FILES := $(call all-proto-files-under,src) +########################################################### + +define all-proto-files-under +$(patsubst ./%,%, \ + $(shell cd $(LOCAL_PATH) ; \ + find $(1) -name "*.proto" -and -not -name ".*") \ + ) +endef + +########################################################### ## Find all of the RenderScript files under the named directories. ## Meant to be used like: ## SRC_FILES := $(call all-renderscript-files-under,src) @@ -805,6 +818,34 @@ endef ########################################################### +## Commands for running protoc to compile .proto into .java +########################################################### + +define transform-proto-to-java +@mkdir -p $(dir $@) +@echo "Protoc: $@ <= $(PRIVATE_PROTO_SRC_FILES)" +@rm -rf $(PRIVATE_PROTO_JAVA_OUTPUT_DIR) +@mkdir -p $(PRIVATE_PROTO_JAVA_OUTPUT_DIR) +$(hide) $(PROTOC) \ + $(addprefix --proto_path=, $(PRIVATE_PROTO_INCLUDES)) \ + $(PRIVATE_PROTO_JAVA_OUTPUT_OPTION)=$(PRIVATE_PROTO_JAVA_OUTPUT_DIR) \ + $(PRIVATE_PROTO_SRC_FILES) +$(hide) touch $@ +endef + +###################################################################### +## Commands for running protoc to compile .proto into .pb.cc and .pb.h +###################################################################### +define transform-proto-to-cc +@mkdir -p $(dir $@) +@echo "Protoc: $@ <= $<" +$(hide) $(PROTOC) \ + $(addprefix --proto_path=, $(PRIVATE_PROTO_INCLUDES)) \ + --cpp_out=$(PRIVATE_PROTO_CC_OUTPUT_DIR) $< +endef + + +########################################################### ## Commands for running gcc to compile a C++ file ########################################################### diff --git a/core/java.mk b/core/java.mk index 6a76643..0765363 100644 --- a/core/java.mk +++ b/core/java.mk @@ -32,6 +32,16 @@ else LOCAL_JAVA_LIBRARIES := core core-junit ext framework $(LOCAL_JAVA_LIBRARIES) endif endif + +proto_sources := $(filter %.proto,$(LOCAL_SRC_FILES)) +ifneq ($(proto_sources),) +ifeq ($(LOCAL_PROTOC_OPTIMIZE_TYPE),micro) + LOCAL_STATIC_JAVA_LIBRARIES += libprotobuf-java-2.3.0-micro +else + LOCAL_STATIC_JAVA_LIBRARIES += libprotobuf-java-2.3.0-lite +endif +endif + LOCAL_JAVA_LIBRARIES := $(sort $(LOCAL_JAVA_LIBRARIES)) LOCAL_BUILT_MODULE_STEM := $(strip $(LOCAL_BUILT_MODULE_STEM)) @@ -201,14 +211,10 @@ ALL_MODULES.$(LOCAL_MODULE).STUBS := $(full_classes_stubs_jar) # Deps for generated source files must be handled separately, # via deps on the target that generates the sources. $(full_classes_compiled_jar): PRIVATE_JAVACFLAGS := $(LOCAL_JAVACFLAGS) -$(full_classes_compiled_jar): $(java_sources) $(java_resource_sources) $(full_java_lib_deps) $(jar_manifest_file) +$(full_classes_compiled_jar): $(java_sources) $(java_resource_sources) $(full_java_lib_deps) $(jar_manifest_file) \ + $(RenderScript_file_stamp) $(proto_java_sources_file_stamp) $(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 |