From 257796c62dea09ad4c75935ceeb2b660f7de7fff Mon Sep 17 00:00:00 2001 From: Christopher Wiley Date: Tue, 19 Jan 2016 08:58:35 -0800 Subject: [PATCH] Keep aidl generated C++ inside the generated folder Transform ../ to dotdot/ for C++ generateds from .aidl source files. This forces us to use one layer of indirection to calculate the build rules for .aidl files, since we can no longer use a pattern rule. This was tested by modifying system/tools/aidl's Android.mk to refer to its .aidl files by going up two directories and then repeating the directories again. When I print the build rules with $(info) I see that dotdot/ appears in appropriate places (C++ paths, but not .aidl paths). Bug: 26407018 Test: Described above. Change-Id: I397c9d10408c0c66d8b5a247a1f34eb4bf4f74ce --- core/binary.mk | 16 ++++++---------- core/definitions.mk | 12 ++++++++++++ 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/core/binary.mk b/core/binary.mk index 73d1d22430..be6107c54c 100644 --- a/core/binary.mk +++ b/core/binary.mk @@ -733,24 +733,20 @@ aidl_src := $(strip $(filter %.aidl,$(my_src_files))) aidl_gen_cpp := ifneq ($(aidl_src),) +# Use the intermediates directory to avoid writing our own .cpp -> .o rules. aidl_gen_cpp_root := $(intermediates)/aidl-generated/src aidl_gen_include_root := $(intermediates)/aidl-generated/include -aidl_gen_cpp := $(patsubst %.aidl,%$(LOCAL_CPP_EXTENSION),$(aidl_src)) -aidl_gen_cpp := $(addprefix $(aidl_gen_cpp_root)/,$(aidl_gen_cpp)) +# Multi-architecture builds have distinct intermediates directories. +# Thus we'll actually generate source for each architecture. +$(foreach s,$(aidl_src),\ + $(eval $(call define-aidl-cpp-rule,$(s),$(aidl_gen_cpp_root),aidl_gen_cpp))) +-include $(addsuffix .P,$(basename $(aidl_gen_cpp))) -# TODO(wiley): we could pass down a flag here to only generate the server or -# client side of the binder interface. $(aidl_gen_cpp) : PRIVATE_MODULE := $(LOCAL_MODULE) $(aidl_gen_cpp) : PRIVATE_HEADER_OUTPUT_DIR := $(aidl_gen_include_root) $(aidl_gen_cpp) : PRIVATE_AIDL_FLAGS := $(addprefix -I,$(LOCAL_AIDL_INCLUDES)) -# Multi-architecture builds have distinct intermediates directories. -# Define rules for both architectures. -$(aidl_gen_cpp) : $(aidl_gen_cpp_root)/%$(LOCAL_CPP_EXTENSION) : $(LOCAL_PATH)/%.aidl $(AIDL_CPP) - $(transform-aidl-to-cpp) --include $(addsuffix .P,$(basename $(aidl_gen_cpp))) - # Add generated headers to include paths. my_c_includes += $(aidl_gen_include_root) my_export_c_include_dirs += $(aidl_gen_include_root) diff --git a/core/definitions.mk b/core/definitions.mk index 623f2094cb..4b820de3a5 100644 --- a/core/definitions.mk +++ b/core/definitions.mk @@ -993,6 +993,18 @@ $(hide) $(AIDL_CPP) -d$(basename $@).P $(PRIVATE_AIDL_FLAGS) \ $< $(PRIVATE_HEADER_OUTPUT_DIR) $@ endef +## Given a .aidl file path generate the rule to compile it a .cpp file. +# $(1): a .aidl 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-aidl-cpp-rule +define-aidl-cpp-rule-src := $(patsubst %.aidl,%$(LOCAL_CPP_EXTENSION),$(subst ../,dotdot/,$(addprefix $(2)/,$(1)))) +$$(define-aidl-cpp-rule-src) : $(LOCAL_PATH)/$(1) $(AIDL_CPP) + $$(transform-aidl-to-cpp) +$(3) += $$(define-aidl-cpp-rule-src) +endef ########################################################### ## Commands for running java-event-log-tags.py