# Copyright 2021 The Fuchsia 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/compiled_action.gni")
import("//build/python/python_action.gni")
import("//src/sys/pkg/bin/pm/pm.gni")

# Creates a Fuchsia Package for an Assembly Input Bundle.  For the format
# of the created package, see the AssemblyInputBundle documentation at:
#  //build/python/modules/assembly/assembly_input_bundle.py
#
# Parameters
#
#   manifest
#     [path] The path to the FINI manifest created by the assembly input bundle
#
#   package_name (optional; default: target_name)
#     [string] The name of the package, if not $target_name
#
# GN usual meanings
#   deps, testonly, visibility
#
template("assembly_input_bundle_package") {
  assert(defined(invoker.manifest),
         "A manifest path must be specified: " +
             get_label_info(target_name, "label_with_toolchain"))

  labels = {
    package_manifest_creation = "${target_name}.creation_manifest.fini"
    package = target_name
  }

  files = {
    package_outdir = "$target_out_dir/$target_name"
    meta_package_file = "$package_outdir/meta_package"
    creation_manifest = "$package_outdir/creation_manifest.fini"
  }

  # Build a package CreationManifest that includes the contents in
  # |invoker.manifest| and a generated meta/package file.
  python_action(labels.package_manifest_creation) {
    forward_variables_from(invoker,
                           [
                             "deps",
                             "testonly",
                           ])
    visibility = [ ":${labels.package}" ]
    binary_label = "//build/assembly/scripts:assembly_input_bundle_tool"
    inputs = [ invoker.manifest ]
    outputs = [
      files.creation_manifest,  # must be the first output, for passing to
                                # pm_build
      files.meta_package_file,
    ]
    args = [
      "generate-package-creation-manifest",
      "--name",
      target_name,
      "--contents-manifest",
      rebase_path(invoker.manifest, root_build_dir),
      "--meta-package",
      rebase_path(files.meta_package_file, root_build_dir),
      "--output",
      rebase_path(files.creation_manifest, root_build_dir),
    ]
  }

  pm_build(target_name) {
    forward_variables_from(invoker,
                           [
                             "deps",
                             "package_name",
                             "testonly",
                             "visibility",
                           ])
    manifest = ":${labels.package_manifest_creation}"
    metadata = {
      if (defined(invoker.metadata)) {
        forward_variables_from(invoker.metadata, "*")
      }

      # These are a bunch of barriers to make sure that if this target gets
      # included anywhere, it's dependencies don't end up getting gathered
      # in metadata walks.
      distribution_entries_barrier = []
      system_image_package_barrier = []
      system_image_extra_package_manifest_barrier = []
      test_component_manifest_barrier = []
      test_component_manifest_program_barrier = []
    }
  }
}

# Creates an archive for the Fuchsia Package for an Assembly Input Bundle.
#
# This is a tgz that contains the entire contents of the AIB, including the
# meta.far file as well.  See the AssemblyInputBundle documentation at:
#  //build/python/modules/assembly/assembly_input_bundle.py
#
# Parameters
#
#   manifest
#     [path] The path to the FINI manifest created for the
#     assembly input bundle
#
#   meta_far
#     [path] The path to the meta far created for the assembly input bundle's package
#
template("assembly_input_bundle_archive") {
  assert(defined(invoker.manifest),
         "A manifest path must be specified: " +
             get_label_info(target_name, "label_with_toolchain"))

  labels = {
    tarmaker = "//build/tools/tarmaker($host_toolchain)"
  }

  files = {
    tarmaker = host_out_dir + "/tarmaker"

    archive = "${target_out_dir}/${target_name}"
    archive_creation_manifest = "${archive}.creation_manifest.fini"
    depfile = "${archive}.d"
  }

  python_action(target_name) {
    forward_variables_from(invoker,
                           [
                             "testonly",
                             "visibility",
                           ])
    binary_label = "//build/assembly/scripts:assembly_input_bundle_tool"
    inputs = [
      invoker.manifest,
      files.tarmaker,
    ]
    outputs = [
      files.archive,
      files.archive_creation_manifest,
    ]
    depfile = files.depfile
    args = [
      "generate-archive",
      "--tarmaker",
      rebase_path(files.tarmaker, root_build_dir),
      "--contents-manifest",
      rebase_path(invoker.manifest, root_build_dir),
      "--meta-far",
      rebase_path(invoker.meta_far, root_build_dir),
      "--creation-manifest",
      rebase_path(files.archive_creation_manifest, root_build_dir),
      "--output",
      rebase_path(files.archive, root_build_dir),
      "--depfile",
      rebase_path(files.depfile, root_build_dir),
    ]
    deps = [ labels.tarmaker ]
    if (defined(invoker.deps)) {
      deps += invoker.deps
    }
    metadata = {
      assembly_input_archives = [
        {
          path = rebase_path(files.archive, root_build_dir)
          label = get_label_info(":$target_name", "label_with_toolchain")
        },
      ]
    }
  }
}
