# Copyright 2013 The Flutter 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("config/config.gni")

# Template for running the pm tool for packaging fuchsia packages.
#
# Parameters
#   package_name - defaults to target_name
#   archive_manifest - required
#   version [optional]
#     The package version. Defaults to 0.
#   command - the packaging step to perform valid steps are build, archive
#
# Forwarded parameters
#       testonly
#       deps
#       public_deps
#       visibility
template("fuchsia_pm_tool") {
  forward_variables_from(invoker, [ "*" ])
  action(target_name) {
    forward_variables_from(invoker,
                           [
                             "testonly",
                             "deps",
                             "public_deps",
                             "visibility",
                           ])
    _valid_commands = [
      "build",
      "archive",
    ]
    assert(defined(invoker.archive_manifest), "archive_manifest is required.")
    archive_manifest = invoker.archive_manifest

    assert(defined(invoker.command), "command is required")
    assert(invoker.command == "build" || invoker.command == "archive",
           "invalid command. valid commands are ${_valid_commands}")
    command = invoker.command

    package_name = target_name
    if (defined(invoker.package_name)) {
      package_name = invoker.package_name
    }

    version = "0"
    if (defined(invoker.version)) {
      version = invoker.version
    }

    # tool path
    _pm_tool_path = "${fuchsia_tool_dir}/pm"
    script = "//build/gn_run_binary.py"

    # output files
    _pkg_out_dir = "${target_gen_dir}/${package_name}"
    _meta_far_file = "${_pkg_out_dir}/meta.far"

    inputs = [
      # Depend on the SDK hash, to ensure rebuild if the SDK tools change.
      fuchsia_sdk_manifest_file,
      _pm_tool_path,
      archive_manifest,
    ]

    if (command == "build") {
      _pkg_output_manifest = "${_pkg_out_dir}/package_manifest.json"
      outputs = [
        _meta_far_file,
        "${_pkg_out_dir}/meta/contents",
        "${_meta_far_file}.merkle",
        _pkg_output_manifest,
      ]
      depfile = "${_meta_far_file}.d"
    } else {
      inputs += [ _meta_far_file ]

      _final_far_file = "$_pkg_out_dir/${package_name}.far"
      outputs = [ _final_far_file ]
    }

    args = [
      rebase_path(_pm_tool_path, root_build_dir),
      "-o",
      rebase_path(_pkg_out_dir, root_build_dir),
      "-m",
      rebase_path(archive_manifest, root_build_dir),
      "-n",
      package_name,
      "-version",
      version,
    ]
    if (command == "build") {
      args += [
        command,
        "-output-package-manifest",
        rebase_path(_pkg_output_manifest, root_build_dir),
        "-depfile",
      ]
    } else if (command == "archive") {
      args += [
        command,
        "--output",
        rebase_path("${_pkg_out_dir}/${package_name}"),
      ]
    }
  }
}
