# Copyright 2019 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/config.gni")
import("//build/config/fuchsia/zbi.gni")
import("//build/config/fuchsia/zircon.gni")
import("//build/images/collect_blob_manifest.gni")
import("//build/images/fvm.gni")
import("//build/images/shell_commands.gni")
import("//garnet/build/pkgfs.gni")

# Assembles a Fuchsia system.
#
# Given base, cache, and universe packages, assembles a Fuchsia system
# containing those packages.
#
# This template can be instantiated at most one in a given BUILD.gn file.
#
# Unfortunately, we still have some parts of the build that need build-global
# names. The name of this target is used to disambiguate those names, which
# means the target_name of this template instance must be unique among
# instances of the template.
#
# Parameters
#
#   base_packages (required)
#     [list of labels] The packages to include in the base package set.
#
#   netboot (default: false)
#     [boolean] Whether the generated ZBI should contain the entire system.
#
#   devmgr_config (default: [])
#     [list of strings] List of arguments to add to /boot/config/devmgr.
#     These arguments come after synthesized arguments to configure blobfs and
#     pkgfs.
template("assemble_system") {
  base_packages = invoker.base_packages

  # Must be unique among assembled systems.
  image_name = target_name

  netboot = false
  if (defined(invoker.netboot)) {
    netboot = invoker.netboot
  }

  devmgr_config = []
  if (defined(invoker.devmgr_config)) {
    devmgr_config = invoker.devmgr_config
  }

  group("base_packages") {
    testonly = true
    visibility = [ ":*" ]
    deps = base_packages
  }

  meta_far_merkle_index = "$target_out_dir/meta_far_merkle_index"
  package_metadata_list("meta_far_merkle_index") {
    testonly = true
    visibility = [ ":*" ]
    outputs = [
      meta_far_merkle_index,
    ]
    data_keys = [ "meta_far_merkle_index_entries" ]
    deps = [
      ":base_packages",
    ]
  }

  action("pkgsvr_index") {
    visibility = [ ":*" ]
    testonly = true
    inputs = [
      meta_far_merkle_index,
    ]
    outputs = [
      "$target_out_dir/$target_name",
    ]
    deps = [
      ":meta_far_merkle_index",
    ]
    script = "//build/images/manifest_content_expand.sh"
    args = rebase_path(inputs, root_build_dir) +
           rebase_path(outputs, root_build_dir)
  }

  system_image_manifest_args = "$target_out_dir/system_image.manifest_args"
  generated_file("system_image.manifest_args") {
    visibility = [ ":*" ]
    testonly = true
    outputs = [
      system_image_manifest_args,
    ]
    data_keys = [ "system_image_rsps" ]
    walk_keys = [ "package_barrier" ]
    deps = [
      ":base_packages",
    ]
  }

  boot_manifest = "$target_out_dir/boot.manifest"

  generate_manifest("system_image.manifest") {
    visibility = [ ":*" ]
    testonly = true

    bootfs_manifest = boot_manifest
    bootfs_zircon_groups = "all"

    deps = [
      ":pkgsvr_index",
      ":system_image.manifest_args",
    ]
    json = "//build/images/system_meta_package.json"
    pkgsvr_index = get_target_outputs(":pkgsvr_index")

    sources = [
      json,
      pkgsvr_index[0],
      system_image_manifest_args,
    ]
    args = [
      "@" + rebase_path(system_image_manifest_args, root_build_dir),
      "--entry=meta/package=" + rebase_path(json, root_build_dir),
      "--entry=data/static_packages=" +
          rebase_path(pkgsvr_index[0], root_build_dir),
    ]
  }

  system_manifest_outputs = get_target_outputs(":system_image.manifest")
  assert(boot_manifest == system_manifest_outputs[2])

  pm_build_package("system_image.meta") {
    visibility = [ ":*" ]
    testonly = true
    manifest = ":system_image.manifest"
    package_name = "system_image"
  }

  blob_manifest = "$root_build_dir/${image_name}_blob.manifest"
  collect_blob_manifest("blob.manifest") {
    testonly = true
    visibility = [ ":*" ]
    outputs = [
      blob_manifest,
    ]
    deps = [
      ":base_packages",
      ":system_image.meta",
      pkgfs_package_label,
    ]
  }

  zircon_tool_action("blob.blk") {
    visibility = [ ":*" ]
    testonly = true
    deps = [
      ":blob.manifest",
    ]
    blob_image_path = "$target_out_dir/$target_name"
    blob_size_list = "$root_build_dir/${image_name}_blob.sizes"
    outputs = [
      blob_image_path,
    ]
    depfile = blob_image_path + ".d"
    inputs = [
      blob_manifest,
    ]
    tool = "blobfs"
    args = [
      "--depfile",
      "--sizes",
      rebase_path(blob_size_list, root_build_dir),
      "--compress",
      rebase_path(blob_image_path, root_build_dir),
      "create",
      "--manifest",
      rebase_path(blob_manifest, root_build_dir),
    ]
  }

  generate_fvm("fvm.blk") {
    # Referenced by guest_package.
    testonly = true
    output_name = "$target_out_dir/$target_name"
    args = fvm_create_args
    partitions = [
      {
        type = "blob"
        dep = ":blob.blk"
      },
    ]
  }

  action("devmgr_config.txt") {
    visibility = [ ":*" ]
    testonly = true
    script = "//build/images/manifest.py"
    outputs = [
      "$target_out_dir/$target_name",
    ]
    pkgfs = "bin/" + pkgfs_binary_name
    pkgfs_label = pkgfs_package_label
    pkgfs_pkg_out_dir = get_label_info(pkgfs_label, "target_out_dir") + "/" +
                        get_label_info(pkgfs_label, "name")
    pkgfs_blob_manifest = "$pkgfs_pkg_out_dir/meta/contents"
    system_image_merkleroot = "$target_out_dir/system_image.meta/meta.far.merkle"

    deps = [
      ":system_image.meta",
      pkgfs_label,
    ]

    sources = [
      pkgfs_blob_manifest,
      system_image_merkleroot,
    ]

    args = [
      "--output=" + rebase_path(outputs[0], root_build_dir),
      "--entry=devmgr.require-system=true",

      "--contents",
      "--rewrite=*=zircon.system.pkgfs.cmd={target}+{source}",
      "--entry=${pkgfs}=" + rebase_path(system_image_merkleroot, root_build_dir),
      "--no-contents",
      "--reset-rewrite",

      "--rewrite=*=zircon.system.pkgfs.file.{target}={source}",
      "--manifest=" + rebase_path(pkgfs_blob_manifest, root_build_dir),
      "--reset-rewrite",
    ]

    foreach(entry, devmgr_config) {
      args += [ "--entry=$entry" ]
    }
  }

  zbi(image_name) {
    metadata = {
      # We insert a package barrier because the packages inside this ZBI
      # shouldn't leak to targets that depend on the ZBI. For example,
      # suppose we store this ZBI inside a package() that is assembled into
      # another Fuchsia system. We don't want the parent system to incorporate
      # the packages from the ZBI into its own package list.
      package_barrier = []
      config_package_barrier = []

      if (defined(invoker.metadata)) {
        forward_variables_from(invoker.metadata, [ "metadata" ])
      }
    }

    testonly = true
    deps = [
      ":devmgr_config.txt",
      ":fvm.blk",
      ":system_image.manifest",
    ]
    inputs = [
      boot_manifest,
      zircon_kernel_zbi,
    ]
    manifest = [
      {
        outputs = [
          "config/devmgr",
        ]
        sources = get_target_outputs(":devmgr_config.txt")
      },
    ]

    if (netboot) {
      ramdisk_inputs = get_target_outputs(":fvm.blk")
    }
  }
}
