# 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),
      ]
    }
  }
}
