# 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/Forward_h.template",
      "$inspector_protocol_dir/lib/Object_cpp.template",
      "$inspector_protocol_dir/lib/Object_h.template",
      "$inspector_protocol_dir/lib/Protocol_cpp.template",
      "$inspector_protocol_dir/lib/ValueConversions_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",
                           ])
  }
}
