Generate DBus proxies and adaptors separately
Enable daemons exposing an interface over DBus to easily
build client libraries. Now daemons can write rules like:
include $(CLEAR_VARS)
LOCAL_MODULE := libdbus-binding-example-client
LOCAL_DBUS_PROXY_PREFIX := dbus-example-example
LOCAL_SRC_FILES := \
dbus_bindings/org.chromium.Example.Manager.dbus.xml \
dbus_bindings/dbus-service-config.json
include $(BUILD_SHARED_LIBRARY)
to expose a client library.
While here, add support for generating independent adaptor header
files on a per interface basis.
Bug: 22608897
Change-Id: I011f9afc234811c31e445898321c2731c482fa77
diff --git a/core/binary.mk b/core/binary.mk
index 01dab2c..61cdcfe 100644
--- a/core/binary.mk
+++ b/core/binary.mk
@@ -621,46 +621,51 @@
###########################################################
## Compile the .dbus.xml files to c++ headers
###########################################################
-dbus_if_sources := $(filter %.dbus.xml,$(my_src_files))
-ifneq ($(dbus_if_sources),)
+dbus_definitions := $(filter %.dbus.xml,$(my_src_files))
+dbus_generated_headers :=
+ifneq ($(dbus_definitions),)
-dbus_if_sources_full_path := $(addprefix $(LOCAL_PATH)/,$(dbus_if_sources))
+dbus_definition_paths := $(addprefix $(LOCAL_PATH)/,$(dbus_definitions))
dbus_service_config := $(filter %dbus-service-config.json,$(my_src_files))
-dbus_service_config_full_path := $(addprefix $(LOCAL_PATH)/,$(dbus_service_config))
+dbus_service_config_path := $(addprefix $(LOCAL_PATH)/,$(dbus_service_config))
-dbus_header_prefix := $(generated_sources_dir)/dbus_bindings
-dbus_adaptors_header := $(dbus_header_prefix)/adaptors.h
-dbus_proxies_header := $(dbus_header_prefix)/proxies.h
-dbus_method_names_header := $(dbus_header_prefix)/method_names.h
+dbus_gen_dir := $(generated_sources_dir)/dbus_bindings
-dbus_generated_source_dependencies := \
- $(dbus_if_sources_full_path) \
- $(dbus_service_config_full_path) \
- $(DBUS_GENERATOR)
+ifdef LOCAL_DBUS_PROXY_PREFIX
+dbus_header_dir := $(dbus_gen_dir)/include/$(LOCAL_DBUS_PROXY_PREFIX)
+dbus_headers := dbus-proxies.h
+else
+dbus_header_dir := $(dbus_gen_dir)
+dbus_headers := $(patsubst %.dbus.xml,%.h,$(dbus_definitions))
+endif
+dbus_generated_headers := $(addprefix $(dbus_header_dir)/,$(dbus_headers))
# Ensure that we only define build rules once in multilib builds.
ifndef $(my_prefix)_$(LOCAL_MODULE_CLASS)_$(LOCAL_MODULE)_dbus_bindings_defined
$(my_prefix)_$(LOCAL_MODULE_CLASS)_$(LOCAL_MODULE)_dbus_bindings_defined := true
-$(dbus_adaptors_header) : PRIVATE_DBUS_MODULE := $(LOCAL_MODULE)
-$(dbus_adaptors_header) : PRIVATE_DBUS_HEADER_DIRECTORY := $(dbus_header_prefix)
-$(dbus_adaptors_header) : PRIVATE_DBUS_SERVICE_CONFIG := $(dbus_service_config_full_path)
-$(dbus_adaptors_header) : PRIVATE_DBUS_ADAPTORS_HEADER := $(dbus_adaptors_header)
-$(dbus_adaptors_header) : PRIVATE_DBUS_PROXIES_HEADER := $(dbus_proxies_header)
-$(dbus_adaptors_header) : PRIVATE_DBUS_METHOD_NAMES_HEADER := $(dbus_method_names_header)
-$(dbus_adaptors_header) : PRIVATE_DBUS_INTERFACE_DEFINITIONS := $(dbus_if_sources_full_path)
-$(dbus_adaptors_header) : $(dbus_generated_source_dependencies)
- $(generate-dbus-bindings)
-# These are actually generated by the above recipe, but we'd like to make the
-# dependency chain complete.
-$(dbus_proxies_header) : $(dbus_adaptors_header)
-$(dbus_method_names_header) : $(dbus_adaptors_header)
+
+$(dbus_generated_headers): PRIVATE_MODULE := $(LOCAL_MODULE)
+$(dbus_generated_headers): PRIVATE_DBUS_SERVICE_CONFIG := $(dbus_service_config_path)
+$(dbus_generated_headers) : $(dbus_service_config_path) $(DBUS_GENERATOR)
+ifdef LOCAL_DBUS_PROXY_PREFIX
+$(dbus_generated_headers) : $(dbus_definition_paths)
+ $(generate-dbus-proxies)
+
+# Auto-export the generated dbus proxy directory.
+my_export_c_include_dirs += $(dbus_gen_dir)/include
+my_c_includes += $(dbus_gen_dir)/include
+else
+$(dbus_generated_headers) : $(dbus_header_dir)/%.h : $(LOCAL_PATH)/%.dbus.xml
+ $(generate-dbus-adaptors)
+
+my_export_c_include_dirs += $(dbus_header_dir)
+my_c_includes += $(dbus_header_dir)
+endif # $(LOCAL_DBUS_PROXY_PREFIX)
endif # $(my_prefix)_$(LOCAL_MODULE_CLASS)_$(LOCAL_MODULE)_dbus_bindings_defined
-my_generated_sources += \
- $(dbus_adaptors_header) \
- $(dbus_proxies_header) \
- $(dbus_method_names_header)
-endif # $(dbus_if_sources) non-empty
+my_generated_sources += $(dbus_generated_headers)
+
+endif # $(dbus_definitions) non-empty
###########################################################
@@ -1208,7 +1213,7 @@
export_includes := $(intermediates)/export_includes
$(export_includes): PRIVATE_EXPORT_C_INCLUDE_DIRS := $(my_export_c_include_dirs)
# Make sure .pb.h are already generated before any dependent source files get compiled.
-$(export_includes) : $(LOCAL_MODULE_MAKEFILE) $(proto_generated_headers)
+$(export_includes) : $(LOCAL_MODULE_MAKEFILE) $(proto_generated_headers) $(dbus_generated_headers)
@echo Export includes file: $< -- $@
$(hide) mkdir -p $(dir $@) && rm -f $@
ifdef my_export_c_include_dirs
diff --git a/core/clear_vars.mk b/core/clear_vars.mk
index e5d299c..431c688 100644
--- a/core/clear_vars.mk
+++ b/core/clear_vars.mk
@@ -180,6 +180,7 @@
LOCAL_DPI_FILE_STEM:=
LOCAL_SANITIZE:=
LOCAL_SANITIZE_RECOVER:=
+LOCAL_DBUS_PROXY_PREFIX:=
# arch specific variables
LOCAL_SRC_FILES_$(TARGET_ARCH):=
diff --git a/core/definitions.mk b/core/definitions.mk
index dd84b8a..9865d99 100644
--- a/core/definitions.mk
+++ b/core/definitions.mk
@@ -970,17 +970,27 @@
######################################################################
-## Commands for running protoc to compile .proto into .pb.cc and .pb.h
+## Commands for generating DBus adaptors from .dbus.xml files.
######################################################################
-define generate-dbus-bindings
-@echo "Generating DBus bindings for $(PRIVATE_DBUS_MODULE)"
-@mkdir -p $(PRIVATE_DBUS_HEADER_DIRECTORY)
+define generate-dbus-adaptors
+@echo "Generating DBus adaptors for $(PRIVATE_MODULE)"
+@mkdir -p $(dir $@)
$(hide) $(DBUS_GENERATOR) \
--service-config=$(PRIVATE_DBUS_SERVICE_CONFIG) \
- --adaptor=$(PRIVATE_DBUS_ADAPTORS_HEADER) \
- --proxy=$(PRIVATE_DBUS_PROXIES_HEADER) \
- --method-names=$(PRIVATE_DBUS_METHOD_NAMES_HEADER) \
- $(PRIVATE_DBUS_INTERFACE_DEFINITIONS)
+ --adaptor=$@ \
+ $<
+endef
+
+######################################################################
+## Commands for generating DBus proxies from .dbus.xml files.
+######################################################################
+define generate-dbus-proxies
+@echo "Generating DBus proxies for $(PRIVATE_MODULE)"
+@mkdir -p $(dir $@)
+$(hide) $(DBUS_GENERATOR) \
+ --service-config=$(PRIVATE_DBUS_SERVICE_CONFIG) \
+ --proxy=$@ \
+ $<
endef