# 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"

    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

  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,
      root_manifests_label,
    ]
    inputs = [
      boot_manifest,
      component_manager_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")
    }
  }
}
