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

import("python.gni")

# Creates a zip archive of the inputs.
#
# output (required)
#     Path to output zip.
# inputs (required)
#     List of input files to zip.
# base_dir (optional)
#     If provided, the archive paths will be relative to this directory.
#     Applies only to |inputs|.
#
# deps, public_deps, data, data_deps, testonly, visibility
#     Normal meaning.
template("zip") {
  action_with_pydeps(target_name) {
    forward_variables_from(invoker,
                           [
                             "data",
                             "data_deps",
                             "deps",
                             "public_deps",
                             "testonly",
                             "visibility",
                           ])
    script = "//build/android/gyp/zip.py"
    inputs = invoker.inputs
    outputs = [ invoker.output ]

    args = [
      "--output",
      rebase_path(invoker.output, root_build_dir),
    ]

    _rebased_inputs = rebase_path(invoker.inputs, root_build_dir)
    args += [ "--input-files=$_rebased_inputs" ]
    if (defined(invoker.base_dir)) {
      args += [
        "--input-files-base-dir",
        rebase_path(invoker.base_dir, root_build_dir),
      ]
    }
  }
}
