# Copyright 2014 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 file defines a template to invoke grit repack in a consistent manner.
#
# Parameters:
#   sources  [required]
#       List of pak files that need to be combined.
#
#   output  [required]
#       File name (single string) of the output file.
#
#   repack_options  [optional]
#       List of extra arguments to pass.
#
#   deps  [optional]
#   visibility  [optional]
#       Normal meaning.
template("repack") {
  action(target_name) {
    assert(defined(invoker.sources), "Need sources for $target_name")
    assert(defined(invoker.output), "Need output for $target_name")

    if (defined(invoker.visibility)) {
      visibility = invoker.visibility
    }

    script = "//tools/grit/grit/format/repack.py"

    inputs = invoker.sources
    outputs = [ invoker.output ]

    args = []
    if (defined(invoker.repack_options)) {
      args += invoker.repack_options
    }
    args += [ rebase_path(invoker.output, root_build_dir) ]
    args += rebase_path(invoker.sources, root_build_dir)

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