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

# Runs the resources map generation script other the given header files to
# produce an output file and a source_set to build it.
#
# Parameters:
#   inputs:
#     List of file name to read. Each file should be an header file generated
#     by grit with line like "#define IDS_FOO 12345".
#
#   namespace (optional):
#     Namespace in which the generated code should be scoped. If left empty,
#     the code will be in the global namespace.
#
#   header_filename:
#     Name of the generated header file.
#
#   source_filename:
#     Name of the generated source file.
#
#   deps (optional):
#     List of targets to depend on.
#
template("generate_ui_string_overrider") {
  # Copy "target_name" to allow restrict the visibility of the generation
  # target to that target (as ":$target_name" will have a different meaning
  # in the "action" block).
  source_set_target_name = target_name
  gen_action_target_name = target_name + "_gen_sources"

  action(gen_action_target_name) {
    header_filename = "$target_gen_dir/" + invoker.header_filename
    source_filename = "$target_gen_dir/" + invoker.source_filename

    visibility = [ ":$source_set_target_name" ]
    script = "//components/variations/service/generate_ui_string_overrider.py"
    outputs = [
      header_filename,
      source_filename,
    ]

    inputs = invoker.inputs
    if (defined(invoker.deps)) {
      deps = invoker.deps
    }

    args = []

    if (defined(invoker.namespace) && invoker.namespace != "") {
      args += [ "-N" + invoker.namespace ]
    }

    args += [
              "-o" + rebase_path(root_gen_dir, root_build_dir),
              "-H" + rebase_path(header_filename, root_gen_dir),
              "-S" + rebase_path(source_filename, root_gen_dir),
            ] + rebase_path(inputs, root_build_dir)
  }

  source_set(target_name) {
    sources = get_target_outputs(":$gen_action_target_name")
    deps = [
      ":$gen_action_target_name",
      "//components/variations/service",
    ]

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