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

import("//build/util/lastchange.gni")

# Template to run the tweak_info_plist.py script on a plist.
#
# Arguments:
#
#     info_plist:
#         (optional), string, the plist to tweak.
#
#     info_plists:
#         (optional), list of string, the plist files to merge and tweak.
#
#     args:
#         (optional), list of string, the arguments to pass to the
#         tweak_info_plist.py script.
#
# Callers should use get_target_outputs() to get the output name. One of
# info_plist or info_plists must be specified.
template("tweak_info_plist") {
  _output_name = "$target_gen_dir/${target_name}_tweaked.plist"

  if (defined(invoker.info_plists)) {
    assert(!defined(invoker.info_plist),
           "Cannot have both info_plist and info_plists for $target_name")

    _source_name = "$target_gen_dir/${target_name}_merged.plist"
    _deps = [ ":" + target_name + "_merge_plist" ]

    action(target_name + "_merge_plist") {
      forward_variables_from(invoker,
                             [
                               "testonly",
                               "deps",
                             ])
      script = "//build/apple/plist_util.py"
      sources = invoker.info_plists
      outputs = [ _source_name ]
      args = [
               "merge",
               "-f=xml1",
               "-o=" + rebase_path(_source_name, root_build_dir),
             ] + rebase_path(invoker.info_plists, root_build_dir)
    }
  } else {
    assert(defined(invoker.info_plist),
           "The info_plist must be specified in $target_name")

    _source_name = invoker.info_plist
    _deps = []
    if (defined(invoker.deps)) {
      _deps += invoker.deps
    }
  }

  action(target_name) {
    forward_variables_from(invoker,
                           [
                             "args",
                             "testonly",
                           ])
    script = "//build/apple/tweak_info_plist.py"
    inputs = [
      script,
      "//build/util/version.py",
      lastchange_file,
      "//chrome/VERSION",
    ]
    sources = [ _source_name ]
    outputs = [ _output_name ]
    if (!defined(args)) {
      args = []
    }
    args += [
      "--plist",
      rebase_path(_source_name, root_build_dir),
      "--output",
      rebase_path(_output_name, root_build_dir),
      "--platform=$current_os",
    ]
    deps = _deps
  }
}
