# Copyright 2018 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# Generates GLib bindings.
#
# Parameters:
#   dbus_glib_out_dir: generated files' output directory.
#   dbus_glib_prefix: the prefix of the functions in the generated output.
#   dbus_glib_type (optional): 'client' (default) or 'server' specifying
#       generated bindings mode.
#   dbus_glib_header_stem (optional): the prefix of generated file names.
#       Defaults to the corresponding source's name part.
#
template("generate_dbus_glib") {
  forward_variables_from(invoker,
                         [
                           "dbus_glib_out_dir",
                           "dbus_glib_prefix",
                           "dbus_glib_type",
                           "dbus_glib_header_stem",
                         ])
  if (!defined(dbus_glib_type)) {
    dbus_glib_type = "client"
  }
  if (!defined(dbus_glib_header_stem)) {
    dbus_glib_header_stem = "{{source_name_part}}"
  }
  dbus_glib_output = "${root_gen_dir}/${dbus_glib_out_dir}/${dbus_glib_header_stem}.dbus${dbus_glib_type}.h"
  action_foreach(target_name) {
    sources = invoker.sources
    script = "//common-mk/file_generator_wrapper.py"
    outputs = [
      "${dbus_glib_output}",
    ]
    args = [
      "dbus-binding-tool",
      "{{source}}",
      "--mode=glib-${dbus_glib_type}",
      "--prefix=${dbus_glib_prefix}",
      "--output=${dbus_glib_output}",
    ]
  }
}
