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

# This template will generate inspector protocol source code. The code will
# not be compiled, use get_target_outputs(<name>) to compile them.
#
# Inputs
#
#   config_file  (required)
#       Path to json file specifying inspector protocol configuration.
#
#   out_dir  (required)
#       Path to put the generated files in. It must be inside output or
#       generated file directory.
#
#   outputs (required)
#       Files generated. Relative to out_dir.
#
#   inputs  (optional)
#       Extra inputs specified by the config file.
template("inspector_protocol_generate") {
  assert(defined(invoker.config_file))
  assert(defined(invoker.out_dir))
  assert(defined(invoker.outputs))
  assert(defined(invoker.inspector_protocol_dir))
  inspector_protocol_dir = invoker.inspector_protocol_dir

  action(target_name) {
    script = "$inspector_protocol_dir/code_generator.py"

    inputs = [
      invoker.config_file,
      "$inspector_protocol_dir/lib/base_string_adapter_cc.template",
      "$inspector_protocol_dir/lib/base_string_adapter_h.template",
      "$inspector_protocol_dir/lib/DispatcherBase_cpp.template",
      "$inspector_protocol_dir/lib/DispatcherBase_h.template",
      "$inspector_protocol_dir/lib/ErrorSupport_cpp.template",
      "$inspector_protocol_dir/lib/ErrorSupport_h.template",
      "$inspector_protocol_dir/lib/Forward_h.template",
      "$inspector_protocol_dir/lib/FrontendChannel_h.template",
      "$inspector_protocol_dir/lib/Object_cpp.template",
      "$inspector_protocol_dir/lib/Object_h.template",
      "$inspector_protocol_dir/lib/Parser_cpp.template",
      "$inspector_protocol_dir/lib/Parser_h.template",
      "$inspector_protocol_dir/lib/Protocol_cpp.template",
      "$inspector_protocol_dir/lib/ValueConversions_h.template",
      "$inspector_protocol_dir/lib/Values_cpp.template",
      "$inspector_protocol_dir/lib/Values_h.template",
      "$inspector_protocol_dir/templates/Exported_h.template",
      "$inspector_protocol_dir/templates/Imported_h.template",
      "$inspector_protocol_dir/templates/TypeBuilder_cpp.template",
      "$inspector_protocol_dir/templates/TypeBuilder_h.template",
    ]
    if (defined(invoker.inputs)) {
      inputs += invoker.inputs
    }

    args = [
      "--jinja_dir",
      rebase_path("//third_party/", root_build_dir),  # jinja is in chromium's third_party
      "--output_base",
      rebase_path(invoker.out_dir, root_build_dir),
      "--config",
      rebase_path(invoker.config_file, root_build_dir),
      "--inspector_protocol_dir",
      "$inspector_protocol_dir",
    ]

    if (defined(invoker.config_values)) {
      foreach(value, invoker.config_values) {
        args += [
          "--config_value",
          value,
        ]
      }
    }

    outputs = get_path_info(rebase_path(invoker.outputs, ".", invoker.out_dir),
                            "abspath")

    forward_variables_from(invoker,
                           [
                             "visibility",
                             "deps",
                             "public_deps",
                           ])
  }
}
