# 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/pkgfs.gni")
import("//build/images/shell_commands.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"
    bootfs_allowlist = []
    if (defined(invoker.bootfs_allowlist)) {
      bootfs_allowlist = invoker.bootfs_allowlist
    }

    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",
    ]
    args = [ "--output=" + rebase_path(outputs[0], root_build_dir) ]
    sources = []
    deps = [
      ":system_image.manifest",
    ]

    if (!bootfs_only) {
      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 += [
        "--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" ]
    }

    # If there were any ASan drivers in the build, bin/devhost.asan
    # should have been brought into the boot manifest.  devmgr needs to
    # be told to use it in case there are ASan drivers in /system but
    # none in /boot.  If there were any non-ASan drivers in the build,
    # bin/devhost.asan will load them and needs to know to moderate the
    # checking for interacting with uninstrumented code.
    sources += [ boot_manifest ]
    args += [
      "--include=bin/devhost.asan",
      "--include=bin/devhost",
      "--rewrite=bin/devhost.asan=devmgr.devhost.asan=true",
      "--rewrite=bin/devhost=devhost.asan.strict=false",
      "--manifest=" + rebase_path(boot_manifest, root_build_dir),
    ]
  }

  component_manager_label =
      "//src/sys/component_manager:component_manager.bootfs"
  component_manager_target_dir =
      get_label_info(component_manager_label, "target_out_dir")
  component_manager_target_name =
      get_label_info(component_manager_label, "name")
  component_manager_manifest =
      component_manager_target_dir + "/" + component_manager_target_name

  coordinator_label =
      "//src/devices/coordinator:coordinator.bootfs"
  coordinator_target_dir =
      get_label_info(coordinator_label, "target_out_dir")
  coordinator_target_name = get_label_info(coordinator_label, "name")
  coordinator_manifest =
      coordinator_target_dir + "/" + coordinator_target_name

  root_manifests_label = "//src/sys/root:root_manifests.bootfs"
  root_manifests_target_dir =
      get_label_info(root_manifests_label, "target_out_dir")
  root_manifests_target_name = get_label_info(root_manifests_label, "name")
  root_manifests_manifest =
      root_manifests_target_dir + "/" + root_manifests_target_name

  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, "*")
      }
    }

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

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