# Copyright 2018 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/config/fuchsia/config.gni")
import("//build/config/sysroot.gni")

# Creates a Fuchsia .far package file.
#
# Parameters are:
# package_name: The name of the package to build.
# binary: The name of the executable which should be launched by the package.
#         Will be renamed as "bin/app" in the package contents.
# sandbox_policy: A path to the sandbox_policy applied to this package.
# deps: A list of targets whose output will be included in the package.
template("package") {
  pkg = {
    package_name = target_name
    forward_variables_from(invoker, "*")
  }
  assert(defined(pkg.binary))

  _pm_tool_path = "${fuchsia_sdk}/tools/pm"

  _pkg_out_dir = "$root_out_dir/gen/" + get_label_info(pkg.package_name, "dir")
  _runtime_deps_file = "$_pkg_out_dir/${pkg.package_name}.runtime_deps"
  _manifest_file = "$_pkg_out_dir/${pkg.package_name}.archive_manifest"
  _key_file = "$_pkg_out_dir/signing-key"
  _meta_far_file = "$_pkg_out_dir/meta.far"
  _combined_far_file = "$_pkg_out_dir/${pkg.package_name}-0.far"
  _final_far_file = "$_pkg_out_dir/${pkg.package_name}.far"

  _write_manifest_target = "${pkg.package_name}__write_manifest"
  _generate_key_target = "${pkg.package_name}__genkey"
  _package_target = "${pkg.package_name}__pkg"
  _bundle_target = "${pkg.package_name}__bundle"

  # Generates a manifest file based on the GN runtime deps
  # suitable for "pm" tool consumption.
  action(_write_manifest_target) {
    _depfile = "${target_gen_dir}/${target_name}_stamp.d"

    forward_variables_from(invoker,
                           [
                             "deps",
                             "public_deps",
                             "testonly",
                           ])

    script = "//build/config/fuchsia/build_manifest.py"

    inputs = [
      _runtime_deps_file,
      "//build/config/fuchsia/sandbox_policy",
    ]

    outputs = [
      _manifest_file,
    ]

    data_deps = pkg.deps

    # Use a depfile to trigger package rebuilds if any of the files (static
    # assets, shared libraries, etc.) included by the package have changed.
    depfile = _depfile

    args = [
      rebase_path("//"),
      rebase_path(root_out_dir),
      pkg.package_name,
      pkg.binary,
      rebase_path(pkg.sandbox_policy),
      rebase_path(_runtime_deps_file),
      rebase_path(_depfile),
      rebase_path(dist_libroot) + "," + rebase_path("${sysroot}/dist"),
      rebase_path(_manifest_file),
    ]

    write_runtime_deps = _runtime_deps_file
  }

  # Generates a signing key to use for building the package.
  action(_generate_key_target) {
    forward_variables_from(invoker, [ "testonly" ])

    script = "//build/gn_run_binary.py"

    outputs = [
      _key_file,
    ]

    args = [
      rebase_path(_pm_tool_path, root_build_dir),
      "-k",
      rebase_path(_key_file),
      "genkey",
    ]
  }

  # Creates a signed Fuchsia metadata package.
  action(_package_target) {
    forward_variables_from(invoker, [ "testonly" ])

    script = "//build/gn_run_binary.py"

    deps = [
      ":$_generate_key_target",
      ":$_write_manifest_target",
    ]

    inputs = [
      _key_file,
    ]

    outputs = [
      _meta_far_file,
    ]

    args = [
      rebase_path(_pm_tool_path, root_build_dir),
      "-o",
      rebase_path(_pkg_out_dir),
      "-k",
      rebase_path(_key_file),
      "-m",
      rebase_path(_manifest_file),
      "build",
    ]
  }

  # Creates a package containing the metadata archive and blob data.
  action(_bundle_target) {
    forward_variables_from(invoker, [ "testonly" ])

    script = "//build/gn_run_binary.py"

    deps = [
      ":$_package_target",
      ":$_write_manifest_target",
    ]

    inputs = [
      _meta_far_file,
      _manifest_file,
    ]

    outputs = [
      _combined_far_file,
    ]

    args = [
      rebase_path(_pm_tool_path, root_build_dir),
      "-o",
      rebase_path(_pkg_out_dir),
      "-m",
      rebase_path(_manifest_file),
      "archive",
    ]
  }

  # Copies the archive to a well-known path.
  # TODO(kmarshall): Use a 'pm' output flag to write directly to the desired
  # file path instead.
  copy(target_name) {
    forward_variables_from(invoker, [ "testonly" ])

    deps = [
      ":$_bundle_target",
    ]

    data = [
      _final_far_file,
    ]

    sources = [
      _combined_far_file,
    ]
    outputs = [
      _final_far_file,
    ]
  }
}
