# 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/CodeGenerator.py"

    inputs = [
      invoker.config_file,
      "$inspector_protocol_dir/lib/Allocator_h.template",
      "$inspector_protocol_dir/lib/Array_h.template",
      "$inspector_protocol_dir/lib/Collections_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",
                           ])
  }
}
