# 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/Allocator_h.template",
      "$inspector_protocol_dir/lib/Array_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/Maybe_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),
    ]

    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",
                           ])
  }
}
