diff --git a/core/binary.mk b/core/binary.mk index 491d94c3f..918a28dbd 100644 --- a/core/binary.mk +++ b/core/binary.mk @@ -790,6 +790,38 @@ my_generated_sources += $(aidl_gen_cpp) endif # $(aidl_src) non-empty +########################################################### +## Compile the .vts files to .cc (or .c) and then to .o +########################################################### + +vts_src := $(strip $(filter %.vts,$(my_src_files))) +vts_gen_cpp := +ifneq ($(vts_src),) + +# Use the intermediates directory to avoid writing our own .cpp -> .o rules. +vts_gen_cpp_root := $(intermediates)/vts-generated/src +vts_gen_include_root := $(intermediates)/vts-generated/include + +# Multi-architecture builds have distinct intermediates directories. +# Thus we'll actually generate source for each architecture. +$(foreach s,$(vts_src),\ + $(eval $(call define-vts-cpp-rule,$(s),$(vts_gen_cpp_root),vts_gen_cpp))) +$(foreach cpp,$(vts_gen_cpp), \ + $(call include-depfile,$(addsuffix .vts.P,$(basename $(cpp))),$(cpp))) +$(call track-src-file-gen,$(vts_src),$(vts_gen_cpp)) + +$(vts_gen_cpp) : PRIVATE_MODULE := $(LOCAL_MODULE) +$(vts_gen_cpp) : PRIVATE_HEADER_OUTPUT_DIR := $(vts_gen_include_root) +$(vts_gen_cpp) : PRIVATE_VTS_FLAGS := $(addprefix -I,$(LOCAL_VTS_INCLUDES)) + +# Add generated headers to include paths. +my_c_includes += $(vts_gen_include_root) +my_export_c_include_dirs += $(vts_gen_include_root) +# Pick up the generated C++ files later for transformation to .o files. +my_generated_sources += $(vts_gen_cpp) + +endif # $(vts_src) non-empty + ########################################################### ## YACC: Compile .y/.yy files to .c/.cpp and then to .o. ########################################################### @@ -1392,7 +1424,7 @@ $(export_includes): PRIVATE_EXPORT_C_INCLUDE_DIRS := $(my_export_c_include_dirs) # Similarly, the generated DBus headers need to exist before we export their location. # People are not going to consume the aidl generated cpp file, but the cpp file is # generated after the headers, so this is a convenient way to ensure the headers exist. -$(export_includes) : $(LOCAL_MODULE_MAKEFILE_DEP) $(proto_generated_headers) $(dbus_generated_headers) $(aidl_gen_cpp) +$(export_includes) : $(LOCAL_MODULE_MAKEFILE_DEP) $(proto_generated_headers) $(dbus_generated_headers) $(aidl_gen_cpp) $(vts_gen_cpp) @echo Export includes file: $< -- $@ $(hide) mkdir -p $(dir $@) && rm -f $@.tmp ifdef my_export_c_include_dirs diff --git a/core/clear_vars.mk b/core/clear_vars.mk index 7473a7396..59e907b94 100644 --- a/core/clear_vars.mk +++ b/core/clear_vars.mk @@ -105,6 +105,7 @@ LOCAL_APK_LIBRARIES:= LOCAL_RES_LIBRARIES:= LOCAL_MANIFEST_INSTRUMENTATION_FOR:= LOCAL_AIDL_INCLUDES:= +LOCAL_VTS_INCLUDES:= LOCAL_JARJAR_RULES:= LOCAL_ADDITIONAL_JAVA_DIR:= LOCAL_ALLOW_UNDEFINED_SYMBOLS:= @@ -142,6 +143,7 @@ LOCAL_DEX_PREOPT_FLAGS:= LOCAL_PROTOC_OPTIMIZE_TYPE:= # lite(default),micro,nano,full,nanopb-c,nanopb-c-enable_malloc LOCAL_PROTOC_FLAGS:= LOCAL_PROTO_JAVA_OUTPUT_PARAMS:= +LOCAL_VTSC_FLAGS:= LOCAL_NO_CRT:= LOCAL_NO_LIBGCC:= LOCAL_PROPRIETARY_MODULE:= diff --git a/core/config.mk b/core/config.mk index c8929958c..94c880f7a 100644 --- a/core/config.mk +++ b/core/config.mk @@ -519,6 +519,7 @@ else BREAKPAD_GENERATE_SYMBOLS := false endif PROTOC := $(HOST_OUT_EXECUTABLES)/aprotoc$(HOST_EXECUTABLE_SUFFIX) +VTSC := $(HOST_OUT_EXECUTABLES)/vtsc$(HOST_EXECUTABLE_SUFFIX) DBUS_GENERATOR := $(HOST_OUT_EXECUTABLES)/dbus-binding-generator MKBOOTFS := $(HOST_OUT_EXECUTABLES)/mkbootfs$(HOST_EXECUTABLE_SUFFIX) MINIGZIP := $(HOST_OUT_EXECUTABLES)/minigzip$(HOST_EXECUTABLE_SUFFIX) diff --git a/core/definitions.mk b/core/definitions.mk index 9aca9fd05..34b938522 100644 --- a/core/definitions.mk +++ b/core/definitions.mk @@ -319,6 +319,24 @@ define all-subdir-Iaidl-files $(call all-Iaidl-files-under,.) endef +########################################################### +## Find all files named "*.vts" under the named directories, +## which must be relative to $(LOCAL_PATH). The returned list +## is relative to $(LOCAL_PATH). +########################################################### + +define all-vts-files-under +$(call all-named-files-under,*.vts,$(1)) +endef + +########################################################### +## Find all of the "*.vts" files under $(LOCAL_PATH). +########################################################### + +define all-subdir-vts-files +$(call all-vts-files-under,.) +endef + ########################################################### ## Find all of the logtags files under the named directories. ## Meant to be used like: @@ -1086,6 +1104,31 @@ $$(define-aidl-cpp-rule-src) : $(LOCAL_PATH)/$(1) $(AIDL_CPP) $(3) += $$(define-aidl-cpp-rule-src) endef +########################################################### +## Commands for running vts +########################################################### + +define transform-vts-to-cpp +@mkdir -p $(dir $@) +@mkdir -p $(PRIVATE_HEADER_OUTPUT_DIR) +@echo "Generating C++ from VTS: $(PRIVATE_MODULE) <= $<" +$(hide) $(VTSC) -d$(basename $@).vts.P $(PRIVATE_VTS_FLAGS) \ + $< $(PRIVATE_HEADER_OUTPUT_DIR) $@ +endef + +## Given a .vts file path generate the rule to compile it a .cpp file. +# $(1): a .vts source file +# $(2): a directory to place the generated .cpp files in +# $(3): name of a variable to add the path to the generated source file to +# +# You must call this with $(eval). +define define-vts-cpp-rule +define-vts-cpp-rule-src := $(patsubst %.vts,%$(LOCAL_CPP_EXTENSION),$(subst ../,dotdot/,$(addprefix $(2)/,$(1)))) +$$(define-vts-cpp-rule-src) : $(LOCAL_PATH)/$(1) $(VTSC) + $$(transform-vts-to-cpp) +$(3) += $$(define-vts-cpp-rule-src) +endef + ########################################################### ## Commands for running java-event-log-tags.py ########################################################### diff --git a/envsetup.sh b/envsetup.sh index 815322408..35df2d5f3 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -1132,7 +1132,7 @@ case `uname -s` in Darwin) function sgrep() { - find -E . -name .repo -prune -o -name .git -prune -o -type f -iregex '.*\.(c|h|cc|cpp|S|java|xml|sh|mk|aidl)' \ + find -E . -name .repo -prune -o -name .git -prune -o -type f -iregex '.*\.(c|h|cc|cpp|S|java|xml|sh|mk|aidl|vts)' \ -exec grep --color -n "$@" {} + } @@ -1140,7 +1140,7 @@ case `uname -s` in *) function sgrep() { - find . -name .repo -prune -o -name .git -prune -o -type f -iregex '.*\.\(c\|h\|cc\|cpp\|S\|java\|xml\|sh\|mk\|aidl\)' \ + find . -name .repo -prune -o -name .git -prune -o -type f -iregex '.*\.\(c\|h\|cc\|cpp\|S\|java\|xml\|sh\|mk\|aidl\|vts\)' \ -exec grep --color -n "$@" {} + } ;;