# 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.

template("generate_dbus_proxies") {
  forward_variables_from(invoker,
                         [
                           "dbus_service_config",
                           "proxy_output_file",
                           "mock_output_file",
                           "proxy_path_in_mocks",
                           "new_fd_bindings",
                         ])
  if (!defined(new_fd_bindings)) {
    new_fd_bindings = true
  }
  if (!defined(proxy_output_file)) {
    proxy_output_file = ""
  }
  if (!defined(proxy_path_in_mocks)) {
    proxy_path_in_mocks = ""
  }
  if (!defined(mock_output_file)) {
    mock_output_file = ""
  }
  if (!defined(dbus_service_config) || dbus_service_config == "") {
    service_config = ""
  } else {
    service_config = rebase_path(dbus_service_config)
  }

  action(target_name) {
    sources = invoker.sources
    script = "//common-mk/file_generator_wrapper.py"
    outputs = []
    args = [ "generate-chromeos-dbus-bindings" ] +
           rebase_path(sources, root_build_dir) +
           [ "--service-config=${service_config}" ]
    if (proxy_output_file != "") {
      outputs += [ "${root_gen_dir}/${proxy_output_file}" ]
      args += [ "--proxy=${root_gen_dir}/${proxy_output_file}" ]
    }
    if (mock_output_file != "") {
      outputs += [ "${root_gen_dir}/${mock_output_file}" ]
      args += [ "--mock=${root_gen_dir}/${mock_output_file}" ]
    }
    if (proxy_path_in_mocks != "") {
      args += [ "--proxy-path-in-mocks=${proxy_path_in_mocks}" ]
    }
    if (new_fd_bindings) {
      args += [ "--new-fd-bindings" ]
    }
  }
}
